From 049dc211a4dd046acff0db90021973812f28aae8 Mon Sep 17 00:00:00 2001 From: tfukaza Date: Mon, 20 Jul 2026 23:13:21 -0700 Subject: [PATCH 01/11] Suppress camera control during connector and node pointer interactions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Composing SnapLine inside had two pan leaks: - connector line drags never touched global.data.allowCameraControl, so drawing a connection also panned the canvas; startDragOutLine now disables it and _endLineDragCleanup restores it (mirroring node drags) - nodes only disabled it in onDragStart, which fires after the 3px drag threshold — the camera panned by one pointer-move event first; the flag now flips in onCursorDown and restores in onUp/onDragEnd Adds the previously missing camera+snapline coverage: a /snapline-camera demo route (nodes inside ) and a snapline-camera e2e suite (pan, ctrl-wheel zoom, node drag and line drag without panning, connect after pan+zoom), run via test:snapline-camera. Piloted by Terrain Lab (see terrain-lab pilot branch notes). Co-Authored-By: Claude Fable 5 --- assets/snapline/core/src/connector.ts | 7 ++ assets/snapline/core/src/node.ts | 10 +- demo/svelte/src/DemoRouter.svelte | 8 ++ .../node_ui_camera/NodeUICameraDemo.svelte | 44 +++++++++ package.json | 1 + .../e2e/snapline-camera.playwright.config.ts | 28 ++++++ tests/e2e/snapline-camera.spec.ts | 96 +++++++++++++++++++ 7 files changed, 191 insertions(+), 3 deletions(-) create mode 100644 demo/svelte/src/demo/node_ui_camera/NodeUICameraDemo.svelte create mode 100644 tests/e2e/snapline-camera.playwright.config.ts create mode 100644 tests/e2e/snapline-camera.spec.ts diff --git a/assets/snapline/core/src/connector.ts b/assets/snapline/core/src/connector.ts index 02172b5..cd2f65e 100644 --- a/assets/snapline/core/src/connector.ts +++ b/assets/snapline/core/src/connector.ts @@ -310,6 +310,10 @@ class ConnectorComponent extends ElementObject { } startDragOutLine(prop: pointerDownProp): void { + // Disable camera control while dragging a connection, mirroring node + // drags: without this, drawing a line under a Camera also pans the canvas. + this.global.data.allowCameraControl = false; + let newLine = this.createLine(); newLine.setLineEnd(prop.position.x, prop.position.y); newLine.setLineStartAtConnector(); @@ -504,6 +508,9 @@ class ConnectorComponent extends ElementObject { } _endLineDragCleanup() { + // Re-enable camera control after the line drag ends (see startDragOutLine). + this.global.data.allowCameraControl = true; + this.#state = ConnectorState.IDLE; this.event.input.drag = null; this.event.input.dragEnd = null; diff --git a/assets/snapline/core/src/node.ts b/assets/snapline/core/src/node.ts index b2c1430..631539e 100644 --- a/assets/snapline/core/src/node.ts +++ b/assets/snapline/core/src/node.ts @@ -169,6 +169,11 @@ class NodeComponent extends ElementObject { return; } + // Disable camera control from the very first pointer event: waiting for + // the drag-start threshold lets the camera pan by one move event before + // onDragStart runs. onUp / onDragEnd re-enable it. + this.global.data.allowCameraControl = false; + this._hasMoved = false; if (this.global.data.select?.includes(this) == false) { for (const node of [...this.global.data.select]) { @@ -179,9 +184,6 @@ class NodeComponent extends ElementObject { } onDragStart(prop: dragStartProp): void { - // Disable camera control while dragging - this.global.data.allowCameraControl = false; - for (const node of this.global.data.select ?? []) { node.setStartPositions(); node._mouseDownX = prop.start.x; @@ -240,6 +242,8 @@ class NodeComponent extends ElementObject { } onUp(_prop: pointerUpProp) { + this.global.data.allowCameraControl = true; + if (this._hasMoved == false) { for (const node of [...(this.global.data.select ?? [])]) { node.setSelected(false); diff --git a/demo/svelte/src/DemoRouter.svelte b/demo/svelte/src/DemoRouter.svelte index 64c76ab..2b0439f 100644 --- a/demo/svelte/src/DemoRouter.svelte +++ b/demo/svelte/src/DemoRouter.svelte @@ -3,6 +3,7 @@ import AnimationVariableBenchPage from "./demo/animation/VariableBenchPage.svelte"; import DragInputPage from "./demo/input/Drag.svelte"; import NodeUiPage from "./demo/node_ui_demo/NodeUIDemo.svelte"; + import NodeUiCameraPage from "./demo/node_ui_camera/NodeUICameraDemo.svelte"; import DropSnapNestedPage from "./demo/drop_snap_nested/DropSnapNestedDemo.svelte"; import SnapSortComponentsPage from "./demo/snapsort_components/SnapSortComponentsDemo.svelte"; import SnapSortFileExplorerPage from "./demo/snapsort_file_explorer/SnapSortFileExplorerDemo.svelte"; @@ -55,6 +56,11 @@ legacyPaths: ["/node-ui"], legacyDemoValues: ["snapline", "node_ui"], }, + { + label: "SnapLine Camera", + path: "/snapline-camera", + legacyDemoValues: ["snapline_camera"], + }, { label: "SnapSort", path: "/snapsort", @@ -256,6 +262,8 @@ {:else if selectedPath === "/snapline"} + {:else if selectedPath === "/snapline-camera"} + {:else if selectedPath === "/snapsort"} {:else if selectedPath === "/snapsort-components"} diff --git a/demo/svelte/src/demo/node_ui_camera/NodeUICameraDemo.svelte b/demo/svelte/src/demo/node_ui_camera/NodeUICameraDemo.svelte new file mode 100644 index 0000000..dc003e0 --- /dev/null +++ b/demo/svelte/src/demo/node_ui_camera/NodeUICameraDemo.svelte @@ -0,0 +1,44 @@ + + + + + +
+
+ + + +
+
+
+ + diff --git a/package.json b/package.json index aea8013..a85220e 100755 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "test:camera-control-react": "playwright test -c tests/e2e/camera-control-react.playwright.config.ts", "test:asset-base-react": "playwright test -c tests/e2e/asset-base-react.playwright.config.ts", "test:snapline": "playwright test -c tests/e2e/snapline.playwright.config.ts", + "test:snapline-camera": "playwright test -c tests/e2e/snapline-camera.playwright.config.ts", "test:snapline-react": "playwright test -c tests/e2e/snapline-react.playwright.config.ts", "test:layout": "playwright test -c tests/e2e/snapsort-layout.playwright.config.ts", "test:snapsort": "playwright test -c tests/e2e/snapsort.playwright.config.ts", diff --git a/tests/e2e/snapline-camera.playwright.config.ts b/tests/e2e/snapline-camera.playwright.config.ts new file mode 100644 index 0000000..14e193d --- /dev/null +++ b/tests/e2e/snapline-camera.playwright.config.ts @@ -0,0 +1,28 @@ +import { defineConfig } from "@playwright/test"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const port = Number(process.env.SNAPLINE_CAMERA_TEST_PORT ?? 3030); +const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../.."); + +export default defineConfig({ + testDir: ".", + testMatch: "snapline-camera.spec.ts", + fullyParallel: false, + workers: 1, + reporter: [["list"]], + use: { + baseURL: `http://127.0.0.1:${port}`, + channel: "chrome", + screenshot: "only-on-failure", + trace: "retain-on-failure", + viewport: { width: 1280, height: 900 }, + }, + webServer: { + cwd: repoRoot, + command: `npx vite serve demo/svelte --config demo/svelte/vite.config.mjs --host 127.0.0.1 --port ${port} --strictPort --force`, + url: `http://127.0.0.1:${port}`, + reuseExistingServer: false, + timeout: 30_000, + }, +}); diff --git a/tests/e2e/snapline-camera.spec.ts b/tests/e2e/snapline-camera.spec.ts new file mode 100644 index 0000000..e2bc6b2 --- /dev/null +++ b/tests/e2e/snapline-camera.spec.ts @@ -0,0 +1,96 @@ +import { expect, test, type Locator, type Page } from "@playwright/test"; + +// SnapLine composed inside : panning, zooming, and the +// allowCameraControl handshake between node/line drags and the camera. + +const CAMERA = "#node-ui-camera"; + +async function cameraTransform(page: Page): Promise { + return page.locator(CAMERA).evaluate((el) => getComputedStyle(el).transform); +} + +async function centerOf(locator: Locator) { + const box = await locator.boundingBox(); + expect(box).not.toBeNull(); + return { + x: box!.x + box!.width / 2, + y: box!.y + box!.height / 2, + }; +} + +async function dragFromTo( + page: Page, + from: { x: number; y: number }, + to: { x: number; y: number }, +) { + await page.mouse.move(from.x, from.y); + await page.mouse.down(); + await page.mouse.move(to.x, to.y, { steps: 12 }); + await page.mouse.up(); +} + +test.beforeEach(async ({ page }) => { + await page.goto("/snapline-camera"); + await expect(page.locator("[data-snapline-type='node']")).toHaveCount(3); +}); + +test("background drag pans the camera", async ({ page }) => { + const nodeA = page.locator("[data-snapline-type='node']", { hasText: "Node A" }); + const before = await nodeA.boundingBox(); + await dragFromTo(page, { x: 900, y: 620 }, { x: 700, y: 470 }); + const after = await nodeA.boundingBox(); + expect(after!.x - before!.x).toBeLessThan(-150); + expect(after!.y - before!.y).toBeLessThan(-100); +}); + +test("ctrl+wheel zooms the camera", async ({ page }) => { + const before = await cameraTransform(page); + await page.mouse.move(640, 450); + await page.keyboard.down("Control"); + await page.mouse.wheel(0, -240); + await page.keyboard.up("Control"); + await expect.poll(() => cameraTransform(page)).not.toBe(before); +}); + +test("dragging a node does not pan the camera", async ({ page }) => { + const nodeB = page.locator("[data-snapline-type='node']", { hasText: "Node B" }); + const startBox = await nodeB.boundingBox(); + const before = await cameraTransform(page); + await dragFromTo( + page, + { x: startBox!.x + 40, y: startBox!.y + 24 }, + { x: startBox!.x + 110, y: startBox!.y + 84 }, + ); + expect(await cameraTransform(page)).toBe(before); + const endBox = await nodeB.boundingBox(); + expect(endBox!.x - startBox!.x).toBeGreaterThan(50); +}); + +test("dragging a connector line does not pan the camera", async ({ page }) => { + const nodeA = page.locator("[data-snapline-type='node']", { hasText: "Node A" }); + const output = nodeA.locator("[data-snapline-name='output']"); + const before = await cameraTransform(page); + // Drag a line out and drop it on empty canvas: no connection, no pan. + const start = await centerOf(output); + await dragFromTo(page, start, { x: start.x + 180, y: start.y + 140 }); + expect(await cameraTransform(page)).toBe(before); + await expect(page.locator("[data-snapline-type='connector-line']")).toHaveCount(0); +}); + +test("connecting after pan and zoom still lands on the target connector", async ({ page }) => { + await dragFromTo(page, { x: 900, y: 620 }, { x: 780, y: 540 }); + await page.mouse.move(640, 450); + await page.keyboard.down("Control"); + await page.mouse.wheel(0, -120); + await page.keyboard.up("Control"); + + const nodeA = page.locator("[data-snapline-type='node']", { hasText: "Node A" }); + const nodeB = page.locator("[data-snapline-type='node']", { hasText: "Node B" }); + const output = nodeA.locator("[data-snapline-name='output']"); + const input = nodeB.locator("[data-snapline-name='input']"); + await dragFromTo(page, await centerOf(output), await centerOf(input)); + + const line = page.locator("[data-snapline-type='connector-line']"); + await expect(line).toHaveCount(1); + await expect(line.locator("path")).toHaveAttribute("d", /C/); +}); From 4cf8a6afca30937d8ce4a419eb2c05f9d5aa9aad Mon Sep 17 00:00:00 2001 From: tfukaza Date: Sat, 25 Jul 2026 12:34:55 -0700 Subject: [PATCH 02/11] Update SnapEngine website --- README.md | 19 +- css/snapdesign.scss | 158 +- docs/index.mdx | 14 +- docs/snapengine/introduction/index.mdx | 24 +- docs/snapengine/reference/getting_started.mdx | 14 +- kaiski-2x3.otf.zip | Bin 0 -> 6906 bytes noun-cursor-740125.svg | 4 + .../src/lib/components/ExploreCatalog.svelte | 705 ++++++++ .../src/lib/components/ProjectSelect.svelte | 69 + website/src/lib/components/SeoHead.svelte | 2 +- website/src/lib/exploreCatalog.ts | 108 ++ website/src/lib/fonts.css | 1 + .../landing/components/AssetsShowcase.svelte | 1463 +++-------------- .../lib/landing/components/ClosingCta.svelte | 63 + .../lib/landing/components/GetStarted.svelte | 183 +++ .../src/lib/landing/components/Hero.svelte | 137 +- .../lib/landing/components/Highlights.svelte | 20 +- .../lib/landing/components/Interlude.svelte | 358 ++++ .../SnapLinePreviewConnector.svelte | 41 + .../highlights/AnimationCard.svelte | 2 + .../highlights/CameraControlCard.svelte | 2 + .../components/highlights/CardDocsLink.svelte | 39 + .../highlights/CollisionCard.svelte | 5 +- .../highlights/DomOptimizationCard.svelte | 8 +- .../highlights/InputHandlingCard.svelte | 4 +- website/src/lib/landing/landing.scss | 38 +- website/src/lib/landing/quickStart.ts | 118 ++ .../lib/landing/snapdesign/SnapDesign.svelte | 30 +- website/src/lib/markdown/shikiTheme.js | 76 + website/src/lib/seo.ts | 10 +- website/src/lib/server/highlight.ts | 24 + website/src/routes/+layout.svelte | 604 +++++-- website/src/routes/+page.svelte | 12 +- .../src/routes/docs/[...slug]/+page.svelte | 126 +- website/src/routes/docs/[...slug]/+page.ts | 10 +- website/src/routes/docs/[...slug]/doc.scss | 8 +- website/src/routes/explore/+page.server.ts | 5 + website/src/routes/llms.txt/+server.ts | 47 + website/src/routes/robots.txt/+server.ts | 2 + website/src/routes/sitemap.xml/+server.ts | 8 +- website/src/routes/snapsort/+page.server.ts | 22 + website/src/routes/snapsort/+page.svelte | 9 +- .../snapsort/components/CoreShowcase.svelte | 87 +- .../components/CustomizableShowcase.svelte | 231 +-- .../snapsort/components/SnapSortHero.svelte | 41 +- .../snapsort/components/snapsort-page.scss | 281 +--- .../routes/snapsort/gallery/+page.server.ts | 45 + .../src/routes/snapsort/gallery/+page.svelte | 87 +- .../snapsort/gallery/ExhibitSource.svelte | 52 + .../static/fonts/kaiski-2x3/kaiski-2x3.otf | Bin 0 -> 8620 bytes website/static/fonts/kaiski-2x3/license.txt | 163 ++ website/static/fonts/kaiski-2x3/readme.txt | 16 + website/static/icon/browse-8396205.png | Bin 0 -> 16730 bytes website/static/icon/bullet-list-588573.png | Bin 0 -> 6797 bytes website/static/icon/camera-8384877.png | Bin 0 -> 6382 bytes website/static/icon/engine-5888296.png | Bin 0 -> 15935 bytes website/static/icon/nodes-6450391.png | Bin 0 -> 9115 bytes website/static/icon/noun-cursor-740125.svg | 3 + website/static/og.png | Bin 0 -> 859644 bytes website/svelte.config.js | 75 +- 60 files changed, 3440 insertions(+), 2233 deletions(-) create mode 100644 kaiski-2x3.otf.zip create mode 100644 noun-cursor-740125.svg create mode 100644 website/src/lib/components/ExploreCatalog.svelte create mode 100644 website/src/lib/components/ProjectSelect.svelte create mode 100644 website/src/lib/exploreCatalog.ts create mode 100644 website/src/lib/landing/components/ClosingCta.svelte create mode 100644 website/src/lib/landing/components/GetStarted.svelte create mode 100644 website/src/lib/landing/components/Interlude.svelte create mode 100644 website/src/lib/landing/components/SnapLinePreviewConnector.svelte create mode 100644 website/src/lib/landing/components/highlights/CardDocsLink.svelte create mode 100644 website/src/lib/landing/quickStart.ts create mode 100644 website/src/lib/markdown/shikiTheme.js create mode 100644 website/src/lib/server/highlight.ts create mode 100644 website/src/routes/explore/+page.server.ts create mode 100644 website/src/routes/llms.txt/+server.ts create mode 100644 website/src/routes/snapsort/gallery/+page.server.ts create mode 100644 website/src/routes/snapsort/gallery/ExhibitSource.svelte create mode 100644 website/static/fonts/kaiski-2x3/kaiski-2x3.otf create mode 100644 website/static/fonts/kaiski-2x3/license.txt create mode 100644 website/static/fonts/kaiski-2x3/readme.txt create mode 100644 website/static/icon/browse-8396205.png create mode 100644 website/static/icon/bullet-list-588573.png create mode 100644 website/static/icon/camera-8384877.png create mode 100644 website/static/icon/engine-5888296.png create mode 100644 website/static/icon/nodes-6450391.png create mode 100644 website/static/icon/noun-cursor-740125.svg create mode 100644 website/static/og.png diff --git a/README.md b/README.md index 952a92a..57002c8 100755 --- a/README.md +++ b/README.md @@ -3,9 +3,10 @@ > [!WARNING] > The engine is still in early stages of development. Expect frequent updates and breaking changes. -# Interactivity Engine for the Web +# SnapEngine: Interactivity Engine for the Web -SnapEngineJS is a collection of utilities for building interactive UI elements on the web. +SnapEngine is the shared, DOM-first foundation behind a growing family of +interaction tools for the web. It provides: - Input handling with a common API for mouse and touch events. - Collision detection for basic shapes and lines. @@ -15,15 +16,21 @@ SnapEngineJS is a collection of utilities for building interactive UI elements o - A visual debugger for inspecting engine internals. - Zero-dependency, framework-agnostic APIs. -See the [website](https://snap-engine-js.vercel.app) for details and documentation. +Most application developers should start with +[SnapSort](https://snapengine.dev/docs/snapsort/introduction), an +unstyled drag-and-drop toolkit built on SnapEngine. See the +[website](https://snapengine.dev) to explore the ecosystem. -## Installation +## Using SnapEngine Core directly + +Install Core directly when authoring an interaction tool or asset, or when an +application needs advanced custom behavior at the engine level. ```bash npm install @snap-engine/core ``` -## Quick Start +## Core example ```ts import { Engine, ElementObject } from "@snap-engine/core"; @@ -38,7 +45,7 @@ object.schedule(() => { object.worldPosition = [100, 200]; object.writeTransform(); }, { stage: "WRITE_1" }); -```` +``` ## License diff --git a/css/snapdesign.scss b/css/snapdesign.scss index ca32200..855fa33 100644 --- a/css/snapdesign.scss +++ b/css/snapdesign.scss @@ -13,17 +13,41 @@ body { padding: 0; background-color: #ffffff; color: var(--color-text); - font-family: "Geist", sans-serif; + font-family: var(--font-body); } :root { --color-primary: #ff5d0f; + --color-action: #c94000; + --color-action-hover: #a93600; --color-secondary-1: #f34336; --color-accent: #ff0e56; --color-background: #ffffff; --color-background-tint: #f6f7f7; --color-background-dark: #7f8286; --color-text: #333637; + --color-text-muted: #5d6266; + --color-text-subtle: #697074; + + --font-body: "Geist", sans-serif; + --font-display: "Geist Pixel Circle", sans-serif; + --font-label: "Bitcount Grid Single", monospace; + --font-code: "Geist Mono", monospace; + + --type-page-title: clamp(2.75rem, 6vw, 5rem); + --type-section-title: clamp(2rem, 3.5vw, 3.25rem); + --type-card-title: clamp(1.5rem, 2.5vw, 2.25rem); + --type-lead: clamp(1.125rem, 1.5vw, 1.25rem); + --type-body: 1rem; + --type-caption: 0.875rem; + --type-label: 0.875rem; + + --leading-display: 1; + --leading-heading: 1.1; + --leading-card: 1.15; + --leading-body: 1.6; + --leading-caption: 1.4; + --leading-label: 1.4; --size-256: 256px; --size-128: 128px; @@ -33,6 +57,7 @@ body { --size-48: 48px; --size-32: 32px; --size-24: 24px; + --size-20: 20px; --size-16: 16px; --size-12: 12px; --size-8: 8px; @@ -61,60 +86,62 @@ h6 { margin: 0; font-weight: 500; color: #373738; + text-wrap: balance; } h1 { - font-family: "Geist Pixel Circle", sans-serif; - font-size: 72px; + font-family: var(--font-display); + font-size: var(--type-page-title); + line-height: var(--leading-display); + letter-spacing: -0.025em; +} + +h2 { + margin-bottom: var(--size-16); + font-family: var(--font-display); + font-size: var(--type-section-title); + line-height: var(--leading-heading); } -h2, h3, h4, h5, h6 { - font-family: "Geist", sans-serif; -} - -h2 { - font-size: 36px; - margin-bottom: var(--size-16); + font-family: var(--font-body); + line-height: var(--leading-card); } h3 { - font-size: 24px; + font-size: var(--type-card-title); margin-bottom: var(--size-12); } h4 { - font-size: 20px; + font-size: 1.25rem; margin-bottom: var(--size-8); } h5 { - font-size: 18px; + font-size: 1.125rem; margin-bottom: var(--size-8); } h6 { - font-size: 16px; + font-size: 1rem; margin-bottom: var(--size-8); } p, -a, blockquote, -span, -label, ul, ol { - font-family: "Geist", sans-serif; - font-size: 1rem; - font-weight: 300; + font-family: var(--font-body); + font-size: var(--type-body); + font-weight: 400; color: var(--color-text); margin: 0; margin-bottom: 0.1em; - line-height: 1.5; + line-height: var(--leading-body); &.light { color: var(--color-background-tint); @@ -129,11 +156,11 @@ p.large { pre, code { - font-family: "Geist Mono", monospace; + font-family: var(--font-code); font-size: 0.8rem; > span, > span > span { - font-family: "Geist Mono", monospace; + font-family: var(--font-code); font-size: 0.8rem; } } @@ -151,7 +178,7 @@ article { } a { - color: var(--color-primary); + color: var(--color-action); text-decoration: underline; text-underline-offset: 0.18em; text-decoration-thickness: 1px; @@ -502,6 +529,11 @@ label:has(input[type="radio"]) { content: ""; } } + + input:focus-visible + span { + outline: 3px solid color-mix(in srgb, var(--color-action) 35%, transparent); + outline-offset: 3px; + } } label { @@ -575,7 +607,7 @@ label:has(input[type="checkbox"]) { display: flex; align-items: center; justify-content: center; - font-family: "IBM Plex Mono", monospace; + font-family: var(--font-code); font-size: 11px; font-weight: 600; letter-spacing: -0.05em; @@ -827,7 +859,6 @@ input[type="range"].large { } } -button, .button { --button-color: #fff; --button-highlight-color: hsl( @@ -841,11 +872,20 @@ button, cursor: pointer; font-family: inherit; font-size: 1rem; + font-weight: 500; + line-height: 1.25; position: relative; border-radius: var(--ui-radius); border: none; - padding: var(--size-8) var(--size-12); + min-height: 44px; + padding: 10px var(--size-16); + display: inline-flex; + align-items: center; + justify-content: center; + gap: var(--size-8); + box-sizing: border-box; + text-decoration: none; background: var(--button-color); box-shadow: @@ -856,22 +896,15 @@ button, 1.5px 1.5px 3px -2px rgba(13, 34, 68, 0.538), 3px 3px 6px -3px rgba(6, 29, 57, 0.435); - transition: all 0.1s ease-in-out; + transition: + color 100ms ease-in-out, + box-shadow 100ms ease-in-out, + transform 100ms ease-in-out; &:active:not(:disabled), &.active:not(:disabled), &.is-active:not(:disabled) { - color: var(--color-primary) !important; - text-shadow: - 0 0 1px var(--color-primary), - 0 0 4px rgba(255, 117, 58, 0.38); - - * { - color: var(--color-primary) !important; - text-shadow: - 0 0 1px var(--color-primary), - 0 0 4px rgba(255, 117, 58, 0.38); - } + transform: translateY(1px); } // &::before { @@ -930,8 +963,7 @@ button, } &:hover:not(:disabled):not(.active) { - color: var(--color-primary); - text-shadow: 0 0 3px rgba(255, 117, 58, 0.26); + color: var(--color-action); box-shadow: 0px 0px 1px 0.5px rgba(1, 11, 38, 0.157) inset, 1px 1px 1px 0.5px hsl(from var(--button-highlight-color) h s l / 0.7) @@ -987,7 +1019,6 @@ button, } } -button, .button { &.primary { --button-color: var(--color-primary); @@ -995,7 +1026,6 @@ button, &:hover:not(:disabled):not(.active) { color: #fff; - text-shadow: 0 0 6px rgba(255, 255, 255, 1); } &:disabled { @@ -1004,15 +1034,45 @@ button, } &.small { - padding: var(--size-2) var(--size-8); - font-size: 1rem; - line-height: 0.8; + min-height: 36px; + padding: 6px var(--size-12); + font-size: 0.875rem; + line-height: 1.25; + } + + &.secondary { + --button-color: var(--color-background); + } + + &.quiet { + --button-color: transparent; + box-shadow: none; } + + &:disabled { + --button-color: rgb(31 30 41 / 8%); + + background: var(--button-color); + box-shadow: none; + color: rgb(31 30 41 / 38%); + cursor: not-allowed; + pointer-events: none; + } + + &:focus-visible { + outline: 2px solid var(--color-action); + outline-offset: 3px; + } +} + +:where(a, button, input, select, textarea, [tabindex]):focus-visible { + outline: 2px solid var(--color-action); + outline-offset: 3px; } input[type="number"], input[type="text"] { - font-family: "IBM Plex Mono", monospace; + font-family: var(--font-code); font-size: 1rem; user-select: none; border: none; @@ -1041,7 +1101,7 @@ input[type="text"] { input[type="date"], input[type="datetime-local"], input[type="time"] { - font-family: "IBM Plex Mono", monospace; + font-family: var(--font-code); font-size: 1rem; user-select: none; border: none; @@ -1274,7 +1334,7 @@ table { border-radius: var(--size-4); font-size: 11px; font-weight: 600; - font-family: "IBM Plex Mono", monospace; + font-family: var(--font-code); background-color: var(--color-background-tint); color: var(--color-text); diff --git a/docs/index.mdx b/docs/index.mdx index 00d5c0c..7fcfbc2 100644 --- a/docs/index.mdx +++ b/docs/index.mdx @@ -1,11 +1,13 @@ --- -title: Documentation Home +title: SnapEngine Documentation order: 0 -sectionTitle: Getting Started +sectionTitle: Start Here sectionOrder: 0 --- -## Asset Documentation -For documentation covering the assets built using SnapEngine, see the [SnapSort](/docs/snapsort/introduction) documentation. +## Build with SnapSort -## Engine Documentation -If you are a developer looking to use SnapEngine directly or build custom assets, follow the instructions in the [SnapEngine](/docs/snapengine/introduction) documentation. +Most application developers should start with [SnapSort](/docs/snapsort/introduction), an unstyled drag-and-drop toolkit built on SnapEngine. + +## Build interaction tools with SnapEngine Core + +If you are authoring a reusable interaction tool or asset, or need advanced custom behavior that SnapSort does not provide, explore the [SnapEngine Core](/docs/snapengine/introduction) documentation. diff --git a/docs/snapengine/introduction/index.mdx b/docs/snapengine/introduction/index.mdx index c93c680..fb64100 100644 --- a/docs/snapengine/introduction/index.mdx +++ b/docs/snapengine/introduction/index.mdx @@ -2,23 +2,31 @@ title: Overview order: 0 project: snapengine -projectTitle: SnapEngine +projectTitle: SnapEngine Core section: introduction sectionTitle: Introduction sectionOrder: 1 --- -SnapEngine is an interactivity engine for the web. -It provides useful utilities for building interactive UI elements, +SnapEngine is a DOM-first interactivity engine for the web and the shared +foundation behind interaction tools such as SnapSort. SnapEngine Core provides +utilities for building interactive UI elements, like input handling, camera coordination, collision detection, batched DOM reads and writes, animation helpers, and debugging overlays. -The core package is intentionally framework-agnostic. Asset packages such as SnapSort build on top of it, and framework wrappers provide Svelte or React-facing components where useful. +The core package is intentionally framework-agnostic. Interaction tools such as +SnapSort build on top of it, and framework wrappers provide Svelte- or +React-facing components where useful. + +Most application developers should start with the +[SnapSort documentation](/docs/snapsort/introduction). Use these Core docs when +authoring a reusable interaction tool or asset, or when you need advanced +custom behavior beyond an existing tool. ## Using these docs -Use the project dropdown at the top of the sidebar to switch between -SnapEngine and asset documentation such as SnapSort. +Use the search box and project dropdown at the top of the sidebar to search +these pages and to switch between SnapSort and SnapEngine Core documentation. -If you are new to SnapEngine, we recommend starting from **The Engine** -section to start learning the key concepts first. +If you are new to SnapEngine Core, start with **The Engine** to learn its key +concepts before setting up the package. diff --git a/docs/snapengine/reference/getting_started.mdx b/docs/snapengine/reference/getting_started.mdx index 93cade7..f21bae3 100644 --- a/docs/snapengine/reference/getting_started.mdx +++ b/docs/snapengine/reference/getting_started.mdx @@ -1,23 +1,29 @@ --- -title: Getting Started +title: Set Up SnapEngine Core order: 1 project: snapengine -projectTitle: SnapEngine +projectTitle: SnapEngine Core section: reference sectionTitle: Reference sectionOrder: 2 --- +This direct setup is intended for interaction-tool and asset authors, or for +advanced applications that need custom behavior at the engine level. Most +application developers should start with +[SnapSort](/docs/snapsort/introduction). + ## Installation The SnapEngine project is split into multiple packages, so you only need to install the ones you require. -The core engine is available as `@snap-engine/core`: +SnapEngine Core is available as `@snap-engine/core`: ```bash npm install @snap-engine/core ``` -SnapEngine and all of its assets are TypeScript-based, so it will install the necessary type definitions automatically. +SnapEngine Core and its interaction tools are TypeScript-based, so the package +includes the necessary type definitions. ## Importing diff --git a/kaiski-2x3.otf.zip b/kaiski-2x3.otf.zip new file mode 100644 index 0000000000000000000000000000000000000000..515ae4560ab8ec620ec586102d046e7d9f4f86e0 GIT binary patch literal 6906 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 B5RCu; literal 0 HcmV?d00001 diff --git a/noun-cursor-740125.svg b/noun-cursor-740125.svg new file mode 100644 index 0000000..6ca1ad8 --- /dev/null +++ b/noun-cursor-740125.svg @@ -0,0 +1,4 @@ + + + + diff --git a/website/src/lib/components/ExploreCatalog.svelte b/website/src/lib/components/ExploreCatalog.svelte new file mode 100644 index 0000000..8dc6d5b --- /dev/null +++ b/website/src/lib/components/ExploreCatalog.svelte @@ -0,0 +1,705 @@ + + +
    + {#each entries as entry (entry.slug)} +
  • +
    + + +
    +

    {entry.name}

    + {#if entry.tagline} +

    {entry.tagline}

    + {/if} +

    {entry.summary}

    +
    + + {#if isExploreEntryBrowsable(entry) || entry.status === "coming-soon" || (!compact && (entry.docsHref || entry.galleryHref))} +
    + {#if isExploreEntryBrowsable(entry)} + + {getExploreActionLabel(entry)} + + + {:else if entry.status === "coming-soon"} + Coming soon + {/if} + + {#if !compact && (entry.docsHref || entry.galleryHref)} + + {/if} +
    + {/if} +
    +
  • + {/each} +
+ + diff --git a/website/src/lib/components/ProjectSelect.svelte b/website/src/lib/components/ProjectSelect.svelte new file mode 100644 index 0000000..51b7aa5 --- /dev/null +++ b/website/src/lib/components/ProjectSelect.svelte @@ -0,0 +1,69 @@ + + +
+ + +
+ + diff --git a/website/src/lib/components/SeoHead.svelte b/website/src/lib/components/SeoHead.svelte index cd32fae..4bdaccc 100644 --- a/website/src/lib/components/SeoHead.svelte +++ b/website/src/lib/components/SeoHead.svelte @@ -16,7 +16,7 @@ description = defaultDescription, path = "/", image = defaultImage, - imageAlt = "SnapEngineJS website preview", + imageAlt = "SnapEngine website preview", type = "website", }: { title?: string; diff --git a/website/src/lib/exploreCatalog.ts b/website/src/lib/exploreCatalog.ts new file mode 100644 index 0000000..8b3585a --- /dev/null +++ b/website/src/lib/exploreCatalog.ts @@ -0,0 +1,108 @@ +export const exploreStatuses = [ + "available", + "in-development", + "coming-soon", +] as const; + +export type ExploreStatus = (typeof exploreStatuses)[number]; + +export const exploreMaturities = ["early-beta"] as const; + +export type ExploreMaturity = (typeof exploreMaturities)[number]; + +export type ExploreMotif = "sort" | "nodes" | "viewport"; + +export type ExploreCatalogEntry = { + slug: string; + name: string; + tagline?: string; + summary: string; + status: ExploreStatus; + maturity?: ExploreMaturity; + href?: string; + docsHref?: string; + galleryHref?: string; + motif: ExploreMotif; + accent: string; +}; + +export type BrowsableExploreCatalogEntry = ExploreCatalogEntry & { + href: string; + status: Exclude; +}; + +export const exploreStatusLabels: Record = { + available: "Available", + "in-development": "In development", + "coming-soon": "Coming soon", +}; + +export const exploreMaturityLabels: Record = { + "early-beta": "Early beta", +}; + +export const exploreActionLabels: Record = { + available: "Explore", + "in-development": "In development", + "coming-soon": "Coming soon", +}; + +export const exploreSecondaryLinkLabels = { + docs: "Docs", + gallery: "Live examples", +} as const; + +export function getExploreStatusLabel(entry: ExploreCatalogEntry): string { + const statusLabel = exploreStatusLabels[entry.status]; + + return entry.maturity + ? `${statusLabel} · ${exploreMaturityLabels[entry.maturity]}` + : statusLabel; +} + +export function getExploreActionLabel(entry: ExploreCatalogEntry): string { + return `${exploreActionLabels[entry.status]} ${entry.name}`; +} + +export function isExploreEntryBrowsable( + entry: ExploreCatalogEntry, +): entry is BrowsableExploreCatalogEntry { + return entry.status !== "coming-soon" && Boolean(entry.href); +} + +export const exploreEntries: readonly ExploreCatalogEntry[] = [ + { + slug: "snapsort", + name: "SnapSort", + summary: + "Unstyled components for sortable lists, kanban boards, and more.", + status: "available", + maturity: "early-beta", + href: "/snapsort", + docsHref: "/docs/snapsort/introduction", + galleryHref: "/snapsort/gallery", + motif: "sort", + accent: "var(--color-primary)", + }, + { + slug: "snapline", + name: "SnapLine", + summary: + "Experimental primitives for draggable node graphs, connectors, selections, and visual workflows.", + status: "coming-soon", + motif: "nodes", + accent: "var(--color-accent)", + }, + { + slug: "snapzap", + name: "SnapZap", + summary: + "A focused zoom-and-pan interaction toolkit being explored on top of the shared SnapEngine foundation.", + status: "coming-soon", + motif: "viewport", + accent: "var(--color-background-dark)", + }, +]; + +// Keep the descriptive alias for callers that treat the entries as a catalog. +export const exploreCatalog = exploreEntries; diff --git a/website/src/lib/fonts.css b/website/src/lib/fonts.css index e1b73f5..f2a4958 100644 --- a/website/src/lib/fonts.css +++ b/website/src/lib/fonts.css @@ -2,6 +2,7 @@ @import url('https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&icon_names=bolt,info,manufacturing,traffic_jam,warning,web&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Bitcount+Grid+Single:wght@100..900&family=Bitcount+Single:wght@100..900&family=DotGothic16&family=Geist:wght@100..900&family=Geist+Mono:ital,wght@0,100..900;1,100..900&family=Zen+Dots&display=swap'); + /* Geist Pixel Fonts */ @font-face { font-family: 'Geist Pixel Square'; diff --git a/website/src/lib/landing/components/AssetsShowcase.svelte b/website/src/lib/landing/components/AssetsShowcase.svelte index 0599b69..50bfefa 100644 --- a/website/src/lib/landing/components/AssetsShowcase.svelte +++ b/website/src/lib/landing/components/AssetsShowcase.svelte @@ -1,704 +1,82 @@ -
+
-

Composable Assets

+

Choose an asset to get started.

- Start with reusable patterns built on SnapEngine, then shape them into - the exact interface your UI needs. + Assets built on top of SnapEngine provide a wide variety of interactive UI + components for popular front-end frameworks, from node UI to drag-and-drop + lists.

-
(pointerInside = true)} - onmousemove={handlePreviewPointerMove} - onmouseleave={handlePreviewPointerLeave} - onfocusin={() => (focusInside = true)} - onfocusout={() => (focusInside = false)} - > -
-
-

SnapSort

+
+ - -
-
-
-

SnapZap

+

SnapSort

-

Zoom and pan made simple

+

Unstyled components for sortable lists, kanban boards, and more.

+ Learn more
+
+ +
-
- -
-

SnapLine

+

SnapZap

-

Node-based UI

+

Zoom and pan made simple

+
- + +
+ +
+
+

SnapLine

+
+

Node-based UI

+
@@ -801,6 +211,16 @@ min-height: 0; } + .snapline-card { + gap: 0; + padding: 0; + overflow: hidden; + } + + .snapline-card .asset-copy { + padding: var(--asset-card-padding); + } + .drop-snap-card { position: relative; gap: 0; @@ -809,7 +229,7 @@ } .drop-snap-card .asset-copy { - padding: var(--asset-card-padding) var(--asset-card-padding) var(--size-16); + padding: var(--size-16) var(--asset-card-padding) var(--asset-card-padding); } .asset-copy { @@ -837,6 +257,11 @@ text-decoration: none; } + .planned-button-placeholder { + min-width: 5.5rem; + min-height: 1.1rem; + } + .asset-preview { position: relative; flex: 1 1 auto; @@ -846,25 +271,20 @@ .snapsort-asset-preview { min-height: 360px; - } - - .snapsort-preview-window { - position: absolute; - inset: 0; overflow: hidden; pointer-events: none; user-select: none; } - .snapsort-preview-window::before { + .snapsort-asset-preview::before { position: absolute; - top: 0; right: 0; + bottom: 0; left: 0; z-index: 4; height: 72px; background: linear-gradient( - to bottom, + to top, var(--color-background-tint) 5%, color-mix(in srgb, var(--color-background-tint) 82%, transparent) 54%, transparent 100% @@ -872,7 +292,7 @@ content: ""; } - .snapsort-preview-window::after { + .snapsort-asset-preview::after { position: absolute; inset: 0; z-index: 5; @@ -881,504 +301,83 @@ pointer-events: none; } - .snapsort-preview-pan { + .preview-kanban-panel { position: absolute; - top: 0; - left: 0; - width: 1084px; - transform: translate3d(var(--preview-pan-x), var(--preview-pan-y), 0); - transition: transform 180ms cubic-bezier(0.22, 1, 0.36, 1); - will-change: transform; - } - - .snapsort-preview-scale { - width: 1084px; - filter: grayscale(1) saturate(0.15) contrast(0.94); - transform: scale(0.42); - transform-origin: top left; - transition: filter 320ms ease; - } - - .drop-snap-card[data-preview-hovered="true"] .snapsort-preview-scale { - filter: grayscale(0) saturate(1.05) contrast(1); - } - - :global(.preview-engine) { - width: 1084px; - } - - .preview-mosaic { - display: grid; - grid-template-columns: repeat(3, 340px); - grid-auto-flow: row dense; - grid-auto-rows: minmax(380px, auto); - gap: 32px; - width: 1084px; - color: #292d2f; - } - - .preview-panel { - min-width: 0; - min-height: 380px; + top: -384px; + left: -50%; + width: 200%; + min-height: 720px; padding: var(--size-32); border-radius: var(--ui-radius); - background: var(--color-background); + background: transparent; + color: #292d2f; box-sizing: border-box; user-select: none; } - .preview-skeleton-mosaic > div { - min-width: 0; - min-height: 380px; - padding: var(--size-32); - border-radius: var(--ui-radius); - background: var(--color-background); - box-sizing: border-box; - } - - .preview-panel-wide, - .preview-skeleton-wide { - grid-column: span 2; - } - - .preview-panel-tall { - min-height: 440px; - } - - .preview-panel header { - display: flex; - align-items: center; - justify-content: space-between; - gap: var(--size-16); - margin-bottom: var(--size-24); - } - - .preview-panel header strong { - font-family: "Bitcount Grid Single", monospace; - font-size: 24px; - font-weight: 300; - line-height: 1; - } - - .preview-panel header span { - color: #8a9094; - font-size: 0.8rem; - line-height: 1; - text-transform: uppercase; - } - .preview-kanban-board { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem; - } - - .preview-kanban-panel { - order: 4; - grid-column: span 2; - min-height: 440px; - } - - .preview-sentence-panel { - order: 1; - } - - .preview-file-panel { - order: 2; - } - - .preview-swap-panel { - order: 3; - } - - .preview-trash-panel { - order: 5; - } - - .preview-editor-panel { - order: 6; - } - - .preview-clone-panel { - order: 7; - } - - .preview-kanban-panel :global(.preview-kanban-column) { - align-items: stretch; - gap: 0; - min-height: 300px; - padding: 0.75rem; - border-radius: 12px; - background: rgb(31 30 41 / 4%); - } - - .preview-kanban-panel :global(.preview-kanban-column h5) { - margin: 0 0 1rem; - color: #8f9497; - font-family: "Bitcount Grid Single", monospace; - font-size: 0.9rem; - font-weight: 300; - letter-spacing: 0.05em; - text-transform: uppercase; - } - - .preview-kanban-panel :global(.preview-kanban-item) { - align-items: stretch; - width: 100%; - padding: 0; - } - - .preview-task-card { - display: flex; - flex-direction: column; - gap: 0.5rem; - width: 100%; - margin-bottom: 0.5rem; - padding: 0.85rem 0.95rem; - border: 1px solid rgb(31 30 41 / 8%); - border-radius: 10px; - background: var(--color-background); - box-shadow: 0 1px 2px rgb(31 30 41 / 5%), 0 4px 12px -6px rgb(31 30 41 / 8%); + padding: var(--size-16); box-sizing: border-box; } - .preview-task-header { - display: flex; - align-items: center; - justify-content: space-between; - gap: 0.5rem; - } - - .preview-task-header span { - overflow: hidden; - color: #232526; - font-size: 0.95rem; - font-weight: 600; - line-height: 1.25; - text-overflow: ellipsis; - white-space: nowrap; - } - - .preview-task-header small { - flex: 0 0 auto; - padding: 0.16rem 0.5rem; - border-radius: 999px; - background: color-mix(in srgb, var(--color-primary) 10%, #fff); - color: color-mix(in srgb, var(--color-primary) 72%, #222); - font-size: 0.7rem; - font-weight: 600; - } - - .preview-task-card p { - margin: 0; - color: #5f6569; - font-size: 0.85rem; - line-height: 1.35; - } - - .preview-task-footer { - display: flex; - align-items: center; - justify-content: space-between; - padding-top: 0.45rem; - color: #8f9497; - font-size: 0.78rem; - } - - .preview-task-footer i { - display: grid; - width: 1.6rem; - height: 1.6rem; - border-radius: 50%; - background: var(--color-primary); - color: white; - font-family: "Bitcount Grid Single", monospace; - font-size: 0.67rem; - font-style: normal; - place-items: center; - } - - .preview-sentence-board { - display: flex; - flex-direction: column; - gap: var(--size-24); - } - - .preview-sentence-group > small { - display: block; - margin-bottom: var(--size-8); - color: #8a9094; - font-size: 0.8rem; - text-transform: uppercase; - } - - .preview-sentence-panel :global(.preview-sentence-zone) { - align-content: flex-start; - align-items: flex-start; - gap: var(--size-4); - min-height: 76px; - padding: var(--size-8) 0; - border-bottom: 2px solid #ddd; - } - - .preview-sentence-panel :global(.preview-word-item) { - padding: 0; - } - - .preview-sentence-panel :global(.preview-word) { - display: block; - padding: 2px 4px; - border: 1px solid #ddd; - border-radius: 4px; - background: white; - box-shadow: 0 3px 0 #d8dde0; - color: #232526; - font-family: "DotGothic16", sans-serif; - font-size: 1rem; - line-height: 1.2; - white-space: nowrap; - } + .preview-kanban-column { + --card-radius: var(--size-32); - .preview-file-panel :global(.preview-file-tree) { display: flex; flex-direction: column; - gap: 0.35rem; - font-family: "Geist Mono", monospace; - font-size: 0.9rem; - } - - .preview-file-panel :global(.preview-file-item) { align-items: stretch; - width: 100%; - padding: 0; - } - - .preview-file-panel :global(.preview-file-tree span) { - display: block; - padding: 0.5rem 0.65rem; - border-radius: 8px; - } - - .preview-file-panel :global(.preview-file-tree .nested) { - margin-left: 1rem; - } - - .preview-file-panel :global(.preview-file-tree .nested-deep) { - margin-left: 2rem; - } - - .preview-file-panel :global(.preview-file-tree .folder) { - color: #5d6266; - font-weight: 600; - } - - .preview-file-panel :global(.preview-file-tree .active) { - background: color-mix(in srgb, var(--color-primary) 14%, white); - color: color-mix(in srgb, var(--color-primary) 74%, #222); - } - - .preview-swap-panel :global(.preview-tile-grid) { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: var(--size-8); - } - - .preview-swap-panel :global(.preview-tile-item) { - width: 100%; - padding: 0; - } - - .preview-swap-panel :global(.preview-tile-item > span) { - display: flex; - align-items: flex-end; - width: 100%; - height: 116px; + justify-content: flex-end; + gap: 0.5rem; + min-height: 590px; padding: var(--size-16); - border-radius: var(--ui-radius); - background: var(--preview-tile-color); - color: white; - font-size: 1rem; - font-weight: 700; box-sizing: border-box; } - .preview-trash-list { - display: flex; - flex-direction: column; - gap: var(--size-12); - } - - .preview-trash-list span { - display: flex; - align-items: center; - gap: var(--size-12); - padding: var(--size-16); - border: 1px solid color-mix(in srgb, var(--color-background-dark) 20%, transparent); - border-radius: var(--ui-radius); - background: var(--color-background); - font-size: 0.9rem; - } - - .preview-trash-list span:first-child { - position: relative; - z-index: 1; - animation: preview-trash-drop 5.2s cubic-bezier(0.22, 1, 0.36, 1) infinite; - animation-play-state: paused; - } - - .preview-trash-list i { - width: 10px; - height: 28px; - border-right: 2px dotted #b6bbbe; - border-left: 2px dotted #b6bbbe; - } - - .preview-trash-target { - margin-top: var(--size-16); - padding: var(--size-24) var(--size-12); - border: 1px dashed color-mix(in srgb, var(--color-secondary-1) 38%, transparent); - border-radius: var(--ui-radius); - background: color-mix(in srgb, var(--color-secondary-1) 12%, white); - color: color-mix(in srgb, var(--color-secondary-1) 78%, #222); - font-size: 0.9rem; - text-align: center; - } - - .preview-editor-layout { - display: grid; - grid-template-columns: 180px minmax(0, 1fr); - gap: var(--size-24); - } - - .preview-editor-panel :global(.preview-editor-tools) { - display: flex; - flex-direction: column; - gap: var(--size-12); + .preview-card-layout { + min-height: 112px; } - .preview-editor-panel :global(.preview-editor-item) { - align-items: stretch; + .preview-task-card { width: 100%; - padding: 0; - } - - .preview-editor-panel :global(.preview-editor-control) { - display: block; - padding: var(--size-16); - border: 1px solid color-mix(in srgb, var(--color-background-dark) 18%, transparent); - border-radius: var(--ui-radius); - background: var(--color-background-tint); - font-size: 0.9rem; - } - - .preview-editor-panel :global(.preview-editor-canvas) { - --card-radius: var(--ui-radius); - - align-items: stretch; - min-height: 260px; - padding: var(--size-24); + box-sizing: border-box; } - .preview-editor-panel :global(.preview-editor-canvas > small) { - font-size: 1rem; - font-weight: 700; + .preview-drop-target { + width: 100%; + height: 112px; + border: 2px dashed color-mix(in srgb, var(--color-primary) 45%, transparent); + border-radius: 10px; + background: color-mix(in srgb, var(--color-primary) 7%, transparent); + box-sizing: border-box; } - .preview-input-line { - height: 48px; - margin: var(--size-24) 0; - border: 1px solid color-mix(in srgb, var(--color-background-dark) 22%, transparent); - border-radius: var(--ui-radius); + .preview-drag-card { + position: absolute; + top: 456px; + left: 35%; + z-index: 3; + width: 31%; + margin-bottom: 0; + padding: 1.15rem 1.25rem; + border-radius: 10px; background: var(--color-background); - animation: preview-editor-target 4.6s ease-in-out infinite; - animation-play-state: paused; - } - - .preview-choice-row { - display: flex; - align-items: center; - gap: var(--size-12); - margin-top: var(--size-16); - color: #666d70; - font-size: 0.9rem; + box-shadow: + 0 16px 30px -12px rgb(31 30 41 / 28%), + 0 6px 12px -5px rgb(31 30 41 / 18%); + box-sizing: border-box; } - .preview-choice-row i { + .preview-drag-cursor { + position: absolute; + top: 540px; + left: 62%; + z-index: 4; width: 20px; - height: 20px; - border: 1px solid #c9ced0; - border-radius: 50%; - } - - .preview-clone-blocks { - display: grid; - grid-template-columns: 1fr 1fr; - gap: var(--size-12); - } - - .preview-clone-blocks span { - padding: var(--size-16) var(--size-12); - border-radius: var(--ui-radius); - font-size: 0.85rem; - text-align: center; - } - - .preview-clone-blocks .heading-block { - position: relative; - z-index: 2; - background: color-mix(in srgb, var(--color-primary) 16%, white); - color: color-mix(in srgb, var(--color-primary) 78%, #222); - animation: preview-clone-block 4.9s cubic-bezier(0.22, 1, 0.36, 1) infinite; - animation-play-state: paused; - } - - .preview-clone-blocks .image-block { - background: color-mix(in srgb, var(--color-secondary-1) 15%, white); - color: color-mix(in srgb, var(--color-secondary-1) 78%, #222); - } - - .preview-clone-blocks .button-block { - grid-column: span 2; - background: color-mix(in srgb, var(--color-accent) 14%, white); - color: color-mix(in srgb, var(--color-accent) 72%, #222); - } - - .preview-clone-canvas { - margin-top: var(--size-16); - padding: 46px var(--size-12); - border: 1px dashed #c7cccf; - border-radius: var(--ui-radius); - background: var(--color-background); - color: #9ba0a3; - font-size: 0.85rem; - text-align: center; - animation: preview-clone-target 4.9s ease-in-out infinite; - animation-play-state: paused; - } - - .drop-snap-card[data-preview-active="true"] .preview-trash-list span:first-child, - .drop-snap-card[data-preview-active="true"] .preview-input-line, - .drop-snap-card[data-preview-active="true"] .preview-clone-blocks .heading-block, - .drop-snap-card[data-preview-active="true"] .preview-clone-canvas { - animation-play-state: running; - } - - .preview-skeleton-mosaic > div { - display: flex; - flex-direction: column; - gap: var(--size-24); - } - - .preview-skeleton-mosaic span { - display: block; - height: 60px; - border-radius: var(--ui-radius); - background: rgb(31 30 41 / 7%); - } - - .preview-skeleton-mosaic span:first-child { - width: 44%; - height: 24px; + height: 30px; + transform: rotate(-10deg); } .pending-preview { @@ -1423,96 +422,88 @@ color: inherit; } - @keyframes preview-trash-drop { - 0%, - 16% { - opacity: 1; - transform: translate3d(0, 0, 0) scale(1); - } - 42% { - opacity: 1; - transform: translate3d(0, 126px, 0) scale(0.92); - } - 48%, - 58% { - opacity: 0; - transform: translate3d(0, 126px, 0) scale(0.88); - } - 59% { - opacity: 0; - transform: translate3d(0, 0, 0) scale(1); - } - 72%, - 100% { - opacity: 1; - transform: translate3d(0, 0, 0) scale(1); - } + .snapline-preview { + min-height: 180px; + overflow: hidden; + border-radius: var(--size-8); } - @keyframes preview-editor-target { - 0%, - 32%, - 62%, - 100% { - border-color: color-mix(in srgb, var(--color-background-dark) 22%, transparent); - box-shadow: 0 0 0 0 transparent; - } - 42%, - 54% { - border-color: var(--color-primary); - box-shadow: 0 0 0 4px color-mix(in srgb, var(--color-primary) 18%, transparent); - } + .snapline-preview::before { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 4; + height: 72px; + background: linear-gradient( + to top, + var(--color-background-tint) 5%, + color-mix(in srgb, var(--color-background-tint) 82%, transparent) 54%, + transparent 100% + ); + content: ""; + pointer-events: none; } - @keyframes preview-clone-block { - 0%, - 14% { - opacity: 1; - transform: translate3d(0, 0, 0) scale(1); - } - 40% { - opacity: 1; - transform: translate3d(82px, 132px, 0) scale(0.94); - } - 48%, - 58% { - opacity: 0; - transform: translate3d(82px, 132px, 0) scale(0.9); - } - 59% { - opacity: 0; - transform: translate3d(0, 0, 0) scale(1); - } - 72%, - 100% { - opacity: 1; - transform: translate3d(0, 0, 0) scale(1); - } + .snapline-node { + position: absolute; + width: 62%; + height: 208px; + box-sizing: border-box; } - @keyframes preview-clone-target { - 0%, - 32%, - 62%, - 100% { - border-color: #c7cccf; - background: var(--color-background); - } - 42%, - 54% { - border-color: var(--color-primary); - background: color-mix(in srgb, var(--color-primary) 8%, white); - } + .snapline-connection { + position: absolute; + top: 116px; + right: 35%; + bottom: 92px; + left: 35%; + z-index: 1; + overflow: visible; + pointer-events: none; } - @media (prefers-reduced-motion: reduce) { - .snapsort-preview-pan { - transition: none; - } + .snapline-node-bottom-left { + bottom: -12px; + left: -27%; + } - .snapsort-preview-scale { - transition: none; - } + .snapline-node-top-right { + top: 12px; + right: -27%; + } + + .snapline-connector { + position: absolute; + top: 50%; + width: 20px; + height: 20px; + padding: 0; + background: var(--color-primary); + transform: translateY(-50%); + } + + .snapline-connector::after { + border-width: 1.5px; + } + + .snapline-connector-core { + position: absolute; + top: 50%; + left: 50%; + width: 8px; + height: 8px; + padding: 0; + background: var(--color-background); + transform: translate(-50%, -50%); + } + + .snapline-node-bottom-left .snapline-connector { + right: -10px; + } + + .snapline-node-top-right .snapline-connector { + left: -10px; } @media (max-width: 900px) { @@ -1535,9 +526,5 @@ min-height: 330px; } - .snapsort-preview-scale { - transform: scale(0.36); - } - } diff --git a/website/src/lib/landing/components/ClosingCta.svelte b/website/src/lib/landing/components/ClosingCta.svelte new file mode 100644 index 0000000..93a3cc6 --- /dev/null +++ b/website/src/lib/landing/components/ClosingCta.svelte @@ -0,0 +1,63 @@ +
+

+ Get Started +

+

+ Learn how SnapEngine and its assets work. +

+ +
+ + diff --git a/website/src/lib/landing/components/GetStarted.svelte b/website/src/lib/landing/components/GetStarted.svelte new file mode 100644 index 0000000..7a636c3 --- /dev/null +++ b/website/src/lib/landing/components/GetStarted.svelte @@ -0,0 +1,183 @@ + + +
+
+

Get started

+
+ +
+ {#each frameworks as framework} + + {/each} +
+ +
+ {installCommand} + +
+ +
+ {@html sampleHtml} +
+ + +
+ + diff --git a/website/src/lib/landing/components/Hero.svelte b/website/src/lib/landing/components/Hero.svelte index 0a85a63..a283ddc 100644 --- a/website/src/lib/landing/components/Hero.svelte +++ b/website/src/lib/landing/components/Hero.svelte @@ -1,6 +1,5 @@ -
- +
+
+

What’s included:

+
@@ -26,8 +29,6 @@ @import url("https://fonts.googleapis.com/css2?family=Micro+5&display=swap"); .interactivity-explainer { - margin-top: clamp(2.5rem, 5vw, 5rem); - @media (max-width: 900px) { grid-template-columns: 1fr !important; } @@ -38,14 +39,9 @@ flex-direction: column; align-items: center; grid-column: 1 / -1; - gap: var(--size-20); text-align: center; width: min(100%, 760px); - margin: clamp(3rem, 7vw, 6rem) auto clamp(2rem, 4vw, 3.5rem); - - h2 { - margin-bottom: var(--size-16); - } + margin: 0 auto clamp(2rem, 4vw, 3.5rem); } .highlight-card-list { diff --git a/website/src/lib/landing/components/Interlude.svelte b/website/src/lib/landing/components/Interlude.svelte new file mode 100644 index 0000000..98438a9 --- /dev/null +++ b/website/src/lib/landing/components/Interlude.svelte @@ -0,0 +1,358 @@ +
+
+

One foundation for all UI

+

+ All assets are built on the SnapEngine Core, which takes care of low-level + handling like processing inputs and detecting collision, playing animation, + etc. This allows for maintainable code and high interoperability. +

+ + + Why use an engine model? + + +
+ +
+
    +
  1. +
      +
    • +
      + + + + + + + + + + + + +
      + + + SnapSort + + +
    • +
    • +
      + + + + + + + + + + + + +
      + + + SnapLine + + +
    • +
    • +
      + + + + + + + + + + + + +
      + + + SnapZap + + +
    • +
    +
  2. +
  3. + + SnapEngine Core +
  4. + +
  5. + + DOM + browser APIs +
  6. +
+
+
+ + diff --git a/website/src/lib/landing/components/SnapLinePreviewConnector.svelte b/website/src/lib/landing/components/SnapLinePreviewConnector.svelte new file mode 100644 index 0000000..a274568 --- /dev/null +++ b/website/src/lib/landing/components/SnapLinePreviewConnector.svelte @@ -0,0 +1,41 @@ + + + + + diff --git a/website/src/lib/landing/components/highlights/AnimationCard.svelte b/website/src/lib/landing/components/highlights/AnimationCard.svelte index 5396703..0a92405 100644 --- a/website/src/lib/landing/components/highlights/AnimationCard.svelte +++ b/website/src/lib/landing/components/highlights/AnimationCard.svelte @@ -1,4 +1,5 @@ + + + {label} + + + + diff --git a/website/src/lib/landing/components/highlights/CollisionCard.svelte b/website/src/lib/landing/components/highlights/CollisionCard.svelte index cc48669..68f5ae5 100644 --- a/website/src/lib/landing/components/highlights/CollisionCard.svelte +++ b/website/src/lib/landing/components/highlights/CollisionCard.svelte @@ -1,4 +1,5 @@ - + {#if import.meta.env.DEV && $debugLayoutFooterControl} -
+
diff --git a/website/src/routes/+page.svelte b/website/src/routes/+page.svelte index b057e50..98f01a1 100644 --- a/website/src/routes/+page.svelte +++ b/website/src/routes/+page.svelte @@ -1,19 +1,23 @@ - + + + diff --git a/website/src/routes/snapsort/components/snapsort-page.scss b/website/src/routes/snapsort/components/snapsort-page.scss index de84fc5..1743526 100644 --- a/website/src/routes/snapsort/components/snapsort-page.scss +++ b/website/src/routes/snapsort/components/snapsort-page.scss @@ -261,8 +261,12 @@ gap: var(--size-12); } - .hero-cta button { + .hero-cta .button { + display: inline-flex; + align-items: center; + justify-content: center; min-width: 9.5rem; + text-decoration: none; } .core-showcase { @@ -303,12 +307,7 @@ flex-direction: column; gap: var(--size-20); padding: clamp(var(--size-32), 4vw, var(--size-64)); - background: - radial-gradient( - circle at 7% 6%, rgb(255 191 139 / 6%), - rgba(255, 166, 94, 0.018) 24%, - transparent 50%), - var(--color-background-tint); + background: var(--color-background-tint); border-radius: 16px; box-sizing: border-box; isolation: isolate; @@ -464,249 +463,115 @@ } .closing-card { - grid-column: span 6; - display: flex; - flex-direction: column; - gap: var(--size-24); + grid-column: 1 / -1; padding: clamp(var(--size-32), 4vw, var(--size-48)); background: var(--color-background-tint); border-radius: 16px; box-sizing: border-box; } - .closing-copy h3 { - margin: 0 0 var(--size-12); - } - - .closing-copy p { - max-width: 46ch; - margin: 0; - color: #697074; - } - - .closing-frameworks { - display: flex; + .gallery-card { + display: grid; + grid-template-columns: minmax(0, 1.25fr) minmax(18rem, 0.75fr); align-items: center; - flex-wrap: wrap; - gap: var(--size-24); - margin: 0; - padding: 0; - list-style: none; + gap: clamp(var(--size-32), 5vw, var(--size-64)); } - .closing-frameworks li { + .gallery-copy-panel { display: flex; + flex-direction: column; + align-items: flex-start; + gap: var(--size-24); } - .closing-frameworks img { - display: block; - width: 2.5rem; - height: 2.5rem; - object-fit: contain; - } - - .framework-wip-logo { - position: relative; - align-items: center; - justify-content: center; - width: 3.5rem; - height: 2.5rem; - } - - .framework-wip-logo img { - width: 3.25rem; - height: 2.5rem; + .closing-copy h3 { + margin: 0 0 var(--size-12); } - .framework-wip-logo span { - position: absolute; - top: -0.55rem; - right: -0.65rem; - padding: 0.18rem 0.36rem; - border: 1px solid #d9dddf; - border-radius: 999px; - background: #ffffff; + .closing-copy p { + max-width: 46ch; + margin: 0; color: #697074; - font-size: 0.62rem; - font-weight: 700; - line-height: 1; } .closing-button { align-self: flex-start; - margin-top: auto; text-decoration: none; } .gallery-kanban { - height: 210px; + position: relative; + min-width: 0; + min-height: 320px; box-sizing: border-box; - overflow: hidden; pointer-events: none; user-select: none; } - /* The board is laid out at 2x width and scaled to half so the mockup keeps - the real demo's proportions while fitting the card. */ - .gallery-kanban-scale { - width: 200%; - transform: scale(0.5); - transform-origin: top left; - } - - .gallery-kanban .gk-board { + .gallery-preview-board { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + height: 100%; width: 100%; + min-height: 320px; gap: var(--size-16); - flex-wrap: nowrap; - align-items: flex-start; + padding: var(--size-16); + box-sizing: border-box; } - .gallery-kanban .gk-column { - flex: 1 1 0; - min-width: 0; - gap: var(--size-8); - align-items: stretch; - padding: var(--size-12); - background: rgb(31 30 41 / 4%); - border-radius: 12px; - } + .gallery-preview-column { + --card-radius: var(--size-24); - .gallery-kanban .gk-column .snapsort-item { + display: flex; + flex-direction: column; + min-width: 0; + gap: var(--size-12); align-items: stretch; - width: 100%; - padding: 0; + justify-content: flex-end; + padding: var(--size-16); + box-sizing: border-box; } - .gk-column-head { - display: flex; - align-items: center; - justify-content: space-between; - gap: var(--size-8); - padding: 0 var(--size-4) var(--size-4); - } + .gallery-preview-item, + .gallery-preview-drag-card { + --card-radius: var(--size-16); - .gk-column-head h4 { - margin: 0; - color: #8f9497; - font-family: "Bitcount Grid Single", monospace; - font-size: 0.85rem; - font-weight: 300; - letter-spacing: 0.05em; - text-transform: uppercase; + padding: 0; } - .gk-count { - display: inline-flex; - align-items: center; - justify-content: center; - min-width: 1.3rem; - height: 1.3rem; - padding: 0 0.3rem; - border-radius: 999px; - background: rgb(31 30 41 / 7%); - color: #697074; - font-size: 0.72rem; - font-weight: 600; - line-height: 1; + .gallery-preview-item { + min-height: 72px; + width: 100%; box-sizing: border-box; } - .gk-card { - display: flex; - flex-direction: column; - gap: 0.5rem; + .gallery-preview-drop-target { width: 100%; - padding: 0.8rem 0.9rem; - background: var(--color-background); - border: 1px solid rgb(31 30 41 / 8%); - border-radius: 10px; - box-shadow: - 0 1px 2px rgb(31 30 41 / 5%), - 0 4px 12px -6px rgb(31 30 41 / 8%); + min-height: 72px; + border: 2px dashed color-mix(in srgb, var(--color-primary) 45%, transparent); + border-radius: var(--size-16); + background: color-mix(in srgb, var(--color-primary) 7%, transparent); box-sizing: border-box; } - .gk-header { - display: flex; - align-items: center; - justify-content: space-between; - gap: 0.5rem; - } - - .gk-title { - overflow: hidden; - color: #232526; - font-size: 0.95rem; - font-weight: 600; - line-height: 1.25; - text-overflow: ellipsis; - white-space: nowrap; - } - - .gk-tag { - flex: 0 0 auto; - padding: 0.16rem 0.5rem; - border-radius: 999px; - background: color-mix(in srgb, var(--color-primary) 10%, #fff); - color: color-mix(in srgb, var(--color-primary) 72%, #222); - font-size: 0.7rem; - font-weight: 600; - line-height: 1.2; - } - - .gk-desc { - display: -webkit-box; - margin: 0; - overflow: hidden; - color: #5f6569; - font-size: 0.85rem; - line-height: 1.35; - line-clamp: 2; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - } - - .gk-footer { - display: flex; - align-items: center; - justify-content: space-between; - gap: 0.5rem; - padding-top: 0.15rem; - } - - .gk-avatar { - display: flex; - flex: 0 0 auto; - align-items: center; - justify-content: center; - width: 1.6rem; - height: 1.6rem; - border-radius: 50%; - background: var(--avatar-color); - box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.28); - color: #ffffff; - font-family: "Bitcount Grid Single", monospace; - font-size: 0.6rem; - font-weight: 300; - line-height: 1; - } - - .gk-due { - display: inline-flex; - align-items: center; - gap: 0.22rem; - color: #8f9497; - font-size: 0.78rem; - line-height: 1; - white-space: nowrap; + .gallery-preview-drag-card { + position: absolute; + top: 160px; + left: 29%; + z-index: 3; + width: 42%; + min-height: 72px; + box-sizing: border-box; } - .gk-due i { - font-family: "Material Symbols Rounded"; - font-size: 0.9rem; - font-style: normal; - font-weight: 500; - line-height: 1; + .gallery-preview-cursor { + position: absolute; + top: 214px; + left: 64%; + z-index: 4; + width: 18px; + height: 27px; + transform: rotate(-10deg); } .customizable-demo { @@ -2361,6 +2226,16 @@ .closing-card { grid-column: 1 / -1; } + + .gallery-card { + grid-template-columns: minmax(0, 1fr); + gap: var(--size-32); + } + + .gallery-kanban, + .gallery-preview-board { + min-height: 280px; + } } @media (max-width: 640px) { @@ -2385,7 +2260,7 @@ display: none; } - .hero-cta button { + .hero-cta .button { min-width: 8.5rem; } diff --git a/website/src/routes/snapsort/gallery/+page.server.ts b/website/src/routes/snapsort/gallery/+page.server.ts new file mode 100644 index 0000000..3760933 --- /dev/null +++ b/website/src/routes/snapsort/gallery/+page.server.ts @@ -0,0 +1,45 @@ +import type { PageServerLoad } from "./$types"; + +const REPO_FILE_URL = + "https://github.com/tfukaza/SnapEngineJS/blob/main/website/src/routes/snapsort/gallery/%2Bpage.svelte"; + +// Read our own source so the per-exhibit line anchors are computed from the +// file as it actually is at build time, instead of being hand-maintained. +const sources = import.meta.glob("./+page.svelte", { + eager: true, + import: "default", + query: "?raw", +}) as Record; + +const exhibitIds = [ + "todo-list", + "kanban-board", + "sentence-builder", + "file-explorer", + "clone-palette", + "trash-it", + "swap-grid", + "editor", +]; + +function sourceLinks(): Record { + const source = Object.values(sources)[0] ?? ""; + const lines = source.split("\n"); + const links: Record = {}; + + for (const id of exhibitIds) { + const needle = `id="${id}"`; + // Each exhibit appears twice — once in the SSR fallback, once in the live + // branch. The live one is what a reader actually wants, so take the last. + let found = -1; + for (let index = 0; index < lines.length; index += 1) { + if (lines[index].includes(needle)) found = index; + } + links[id] = + found === -1 ? REPO_FILE_URL : `${REPO_FILE_URL}?plain=1#L${found + 1}`; + } + + return links; +} + +export const load: PageServerLoad = () => ({ sourceLinks: sourceLinks() }); diff --git a/website/src/routes/snapsort/gallery/+page.svelte b/website/src/routes/snapsort/gallery/+page.svelte index 9719671..db0d59d 100644 --- a/website/src/routes/snapsort/gallery/+page.svelte +++ b/website/src/routes/snapsort/gallery/+page.svelte @@ -1,6 +1,7 @@ + + + View source + for {label} + + + + diff --git a/website/static/fonts/kaiski-2x3/kaiski-2x3.otf b/website/static/fonts/kaiski-2x3/kaiski-2x3.otf new file mode 100644 index 0000000000000000000000000000000000000000..63da15218532b70c14393f2b5b47cf646ddc3103 GIT binary patch literal 8620 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 literal 0 HcmV?d00001 diff --git a/website/static/fonts/kaiski-2x3/license.txt b/website/static/fonts/kaiski-2x3/license.txt new file mode 100644 index 0000000..a078357 --- /dev/null +++ b/website/static/fonts/kaiski-2x3/license.txt @@ -0,0 +1,163 @@ +FontStruct Non-Commercial Software End User License Agreement 1.0 + +This software end user license agreement (hereinafter “Agreement”) is made +between you or, if you represent a legal entity, that legal entity (hereinafter +“You”) and “Kimeiga”, the copyright holder and designer (hereinafter +“Font Designer”) of the font software named “kaiski 2x3” (hereinafter +“Font Software”). + +1. BINDING AGREEMENT +This Agreement is a binding agreement between You and the Font Designer and +shall set forth the terms and conditions under which You can use the Font +Software. For the purposes of this Agreement, Font Software shall mean the Font +Software, and any parts or copies of it. + +2. GRANT OF NON-EXCLUSIVE AND LICENCE +The Font Designer hereby grants You a non-exclusive, non-transferable licence to +use the Font Software provided that You comply with all terms and conditions of +this Agreement. + +2.1 PERSONAL USE +You may use the Fonts Software only for Your own Personal Purposes and for Your +Work. For the purposes of this Agreement, “Personal Purposes” shall mean any +private use of the Font Software by you. “Work” shall mean any work or +result created by You or on Your behalf with the Font Software. For the +avoidance of doubt, the use for Personal Purposes does not allow any use of the +Font Software and/or any Work for commercial purposes (see Section 2.2) and/or +as a web-font (see Section 2.6). + +2.2 NO COMMERCIAL USE +Neither the Font Software, nor any of its individual components or any Work, may +be used by You for any form of profit-making or otherwise commercial projects, +without express prior written permission from the Font Designer. + +2.3 NO SALE OR DISTRIBUTION +You may not sell, rent, license, sublicense, distribute, redistribute, give-away +or make available (in any other way) the Font Software alone or as part of any +collection, product or service to any third party. + +2.4 NO MODIFICATION +You may not modify, adapt, rename, translate, reverse engineer, decompile, +disassemble, alter, or attempt to discover the source code of the Font Software. + +2.5 EMBEDDING +You may embed the Font Software in documents, applications or devices either as +a rasterized representation of the Font Software (e.g., a GIF or JPEG) or as a +subset of the Font Software as long as the document, application or device is +distributed in a secure format that permits only the viewing and printing but +not the editing of the text. + +2.6 NO USE AS A WEBFONT +You may not make the Font Software accessible on a web server in order to enable +a web browser to render the content of Websites using the respective Font +Software. + +2.7 BACKUP +You may make backup copies of the Font Software for archival purposes only, +provided that You retain exclusive custody and control over such copies. Any +backup copy of the Font Software must contain the same copyright, trademark, and +other proprietary information as the original. + +2.8 PRINT SHOPS AND SERVICE BUREAUS +You may provide a copy of the Font Software used in Your Work to a print shop, +service bureau, etc. for printing or otherwise outputting Your Work. Afterwards, +the print shop, service bureau, etc. must destroy and/or delete all copies of +the Font Software. + +3. ATTRIBUTION +If You make Your Work publicly accessible in any form, You must keep intact all +copyright notices for the Font Software and display, reasonable to the medium or +means You are utilizing for Your Work, an attribution notice (hereinafter “The +Attribution Notice”) comprising of: + +the name of the Font Designer or pseudonym, if applicable (“Kimeiga”); +the title of the Font Software (“kaiski 2x3”); and +to the extent reasonably practicable, the URI +(https://fontstruct.com/fontstructions/show/2898352) from where the Font was +originally downloaded. + +The Attribution Notice may be implemented in any reasonable manner. For the +avoidance of doubt, You may only use the credit required by this Section for the +purpose of attribution in the manner set out above and, by exercising Your +rights under this License, You may not implicitly or explicitly assert or imply +any connection with, sponsorship or endorsement by the Font Designer of You or +Your Work. + +4. YOUR REPRESENTATIONS AND INDEMNIFICATIONS +You represent, warrant, and covenant that You shall use the Font Software only +in accordance with the terms of this Agreement and keep the Font Designer fully +indemnified against all actions, claims, costs, proceedings and damages +whatsoever incurred by any breach of any of the aforesaid representations, +warranties of this Agreement. + +5. OWNERSHIP AND RIGHTS TO THE FONT SOFTWARE +The Font Designer reserves all rights not expressly granted to You in this +Agreement (hereinafter “Reserved Rights”). The Font Software is protected by +copyright and other intellectual property laws and treaties. You acknowledge +that the Font Designer shall be the sole owner of the Font Software, of the +copyright and all Reserved Rights of whatever kind and nature in the Font +Software. + +6. WARRANTY +The Font Software is made available “as is” WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF +COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT.THE FONT DESIGNER DOES NOT AND +CANNOT GUARANTEE THE PERFORMANCE OR RESULTS YOU MAY OBTAIN BY USING THE FONT +SOFTWARE. +THE FONT DESIGNER SHALL IN NO EVENT BE LIABLE TO YOU FOR ANY CONSEQUENTIAL, +INCIDENTAL OR SPECIAL DAMAGES, INCLUDING ANY LOST PROFITS OR LOST SAVINGS, OR +FOR ANY CLAIM BY ANY THIRD PARTY, ARISING OUT OF THE USE OR INABILITY TO USE THE +FONT SOFTWARE. + +7. TERMINATION / CONDITION PRECEDENT +You may use the Font Software only as set forth in this Agreement. Any use of +the Font Software that is not expressly allowed in this Agreement will +automatically terminate Your rights to use the Font Software under this +Agreement. If Your right to use the Font Software is terminated You shall +immediately stop using the Font Software, call back or change any Work that is +used in the public, and delete/destroy any copies of the Font Software. The +termination of the Agreement shall not affect the right of the Font Designer to +claim damages or other rights. + +8. WAIVER +A waiver by either Party of any term or condition of this Agreement shall not be +deemed or construed to be a waiver of such term or condition for the future or +any subsequent breach thereof. All remedies, rights, undertakings, obligations +and agreements contained in this Agreement shall be cumulative and none of them +shall be in limitation of any other remedy, right, undertaking, obligation or +agreement of either Party. + +9. GOVERNING LAW, PLACE OF JURISDICTION +This Agreement shall be construed and shall take effect in accordance with the +laws of the Federal Republic of Germany excluding the United Nations Convention +on Contracts for the International Sales of Goods (CISG). To the extent +permitted by law, the Courts of Berlin, Germany shall have exclusive +jurisdiction to resolve any dispute which may arise. + +10. ENTIRE AGREEMENT +This Agreement contains the entire agreement between the Parties. No variation +of any of the terms or conditions of this Agreement may be made unless such +variation is agreed in writing and signed by You and the Font Designer. + +11. SEVERABILITY +If any provision of this Agreement is adjudged by a court to be invalid or +unenforceable, such provision shall in no way affect any other provision of this +Agreement, the application of such provision in any other circumstance or the +validity or enforceability of this Agreement. The Parties will negotiate in +good faith about a provision that will replace the invalid or unenforceable +provision. + +FontStruct Notice: FontStruct no Party to this Agreement + +Please note that FontStruct (www.fontstruct.com) is not a party to this +Agreement between You and the Font Designer. + +FontStruct makes no warranty of any kind in connection with the Font Software, +its use or the results that You may obtain by using the Font Software. + +FontStruct shall in no event be liable to You or any third party for any damages +whatsoever arising out of or relating to this Agreement or the use of the Font +Software, including but not limited to incidental, special damages, any lost +profits or lost savings or any claim made by a third party. + diff --git a/website/static/fonts/kaiski-2x3/readme.txt b/website/static/fonts/kaiski-2x3/readme.txt new file mode 100644 index 0000000..e666ec0 --- /dev/null +++ b/website/static/fonts/kaiski-2x3/readme.txt @@ -0,0 +1,16 @@ +The font file in this archive was created using Fontstruct the free, online +font-building tool. +This font was created by “Kimeiga”. +This font has a homepage where this archive and other versions may be found: +https://fontstruct.com/fontstructions/show/2898352 +[ancestry] +Try Fontstruct at https://fontstruct.com +It’s easy and it’s fun. + +Fontstruct is copyright ©2026 Rob Meek + +LEGAL NOTICE: +In using this font you must comply with the licensing terms described in the +file “license.txt” included with this archive. +If you redistribute the font file in this archive, it must be accompanied by all +the other files from this archive, including this one. diff --git a/website/static/icon/browse-8396205.png b/website/static/icon/browse-8396205.png new file mode 100644 index 0000000000000000000000000000000000000000..f464286438b74fe09355c66b8aea657f42411a45 GIT binary patch literal 16730 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 Qpb+4asf9_&Ij?{I54xWbF#rGn literal 0 HcmV?d00001 diff --git a/website/static/icon/bullet-list-588573.png b/website/static/icon/bullet-list-588573.png new file mode 100644 index 0000000000000000000000000000000000000000..95d287b38c173cbbd999f7796db00649c107986d GIT binary patch literal 6797 zcmdUz`CC)h*2hoa0@eY{)e2Y!jjc8n#S)a*2xyJcqKF17C}RZ^8Nw`KhF+`00jMRS zK_;&aC?HXgFcTC6fe>n$6G;RlQ6NN!5FiY9h4+1)_x%Iz5BKJm$^Vd zd+p>2yLGEKuSO7L-H$&INeH3=KQ)k5+VJ%$vTGi`P+=sy?~!7@(FX+CZ1*Ga(CNrb z*+ATH0TlNgAH{N>D%|Ss*Q>fRik_^Y7uyf!ZT#xj^}l)j&AC*=Kk~-8-PNZ*t12qm zS$Fc_{VSM_W;-{Yy+PW#x`g=I`d{dQyKc80<*XgQUP3?R5fN2+EiRgzd0bhV@a2ZU zP|5@^i_qEe$vUUQGv6^s(N&(ej2B1EXXbB%S^bxO-d4P7FbcSIY5H4cly9e{{vDEb z(*7CrH|WVp-ok^y;7D)cT7RAIPH10#-kVO^olM_xv~ioi6!kv$N8+1X%pI5^B6fr= z;MDHJoXBj?rMMz|)3w^RF7{EOWRFc~Y1T+&^K-jnSkuho+vOgvt|}MVp1q$`i^nV! zk64U03&ra)1@h#9GMyyq;mG7B@7`&Co*2(vPNdJWc(Kn9@pHDC?qV&t2|1?4#y*>) zYehdfbk>+*Ogso{5S5dCRn72fY;dM-@J0%oF;&2!dPXQ~HLC?dD3?*Cs+TP3)Y~Bn_=Xj` z6=!a!o0LNI|mqw(A2=Wna%6+<6G+lxu9`pv_W z-aWm&%bbYx(x)XQQ|@75VWus-D}u8KK9;9B06JEbuF0@df;1+o@ zeFSFb7Zo-4Vs373%zXjHcW2HWUW{MwwR+Sc0D@wyDb}^$Kj%o3#cnk9^7Aq+r zFwn!9(1tQIGdCCCW$O3nYSh1O<=wcGo^Hdbtc+@P?#;i4!gGBy%ByGPqodv3-OPK2 zAEu+tJ9t5lvosSwe9c-oN-TOqTQ1gmJ3(0Lu$}V36+yt|pX{uQ=NFeAWaLHp%8ZcX zj%1sQdkku(>Qpo{q^+$@Kb@3Kxb1^8!>h0UNgI@6{U3}C*V}(M|VKX;DCFVj{ldaRrP*A( zJ?a(jM!t#fOq`<(iFt3=Sl+FRI;f8Roq!JMuc_@uQPYTru~RwJ}0$ zv`+m+9)2paE4-9f$8$S(?p*XmnNj{APHPKh=pM%^;v2+$o+&!Nuhv zkRd3cknnk;#QRBac=ND&F7kJt3DdP7xB6yC@a$C=_frtgfcZuQdB0r?LB9I| zg(T{N0Onp+|Fz{m`LFj3jg$8MMH?<~9JZ$=Jk0vpDy^lFvbvtL58}b>KXVN?Y>!Rw zBs2tO$RGs{tXz{k+K~}LTRxO3vqq@Gr6a_feo`d2%9Uev0*ko1x|-gN&NRHk zlow|GtjA)69+s^~y7ro+$}2Zzl8}A-_Sv}GSB@}B`?`HB<{k?SX9fl8&B$kj3g_qN z9fWL}tIpfUoi{8MfhNgE%O{2_3RdK;&W)ghT=J28;TT`*jk+kDvD!A&*hOl8LTY7q z@t=6I7*<_;r2f;u;;eY@4!Mx3?PZPeu+DNREo4kha;W07gl3Q`)jZvxhmWf7s`bMg z#eaBb99C@%r#Gr?XlO`*Q^Y%6+jlQMGAv9H#dMg`!uJ zQ8uL&6?i`HSgPf~cx5G3C}$fFC2n`FPK z29;0(gL0VqraxBohjj+yWB&^An5CFQkZC@Wn2fwi3!Dz7&(jJV7D`6EvkTyrfiU%piONRFT4VuqlM{b}et6;y@qiJ1y+`41Oj_G;AYMAtjs)$X< z3>=g(AB(6D0)b$f5-K{IkRz5W%~R<5WQo(Zf6_R^-Dm9Qf{8W0>6>Qv2Y}d*VTPLR zvCbDHR=s@9`r6y1rQMj~4xUmssbNglqUpZq&vMZHEQihm2XN+e`dovNYSnGt0%(sD zRVdns_Ak>k-cjozKjhHqX30EmlFn4JvvhJVZ)Y(GE9IBiX_*r!oY_!z81?U_kl@Ct zueIIX-4|2xeCO@Hok4#MQ`(I7d}RC%Kc-aa-K5)f^HF~uN+Y!z!`?PFH8owM8<;fZ zCXo=R)#XPUH$Xi&Pdu;{LmnAQNF}v4TPT`Zd_o&8TF(DK4CvyYKAW(|!0jCH0^Edy zGM4fSsa0yBP(QA`x2I=mJa^cr0x2pkw()^ebA-i^`bc_B!!y0dtKbwgy}lTJShl6J z3pVjK)AklKm7S%PXdPF=m>L6dkm9T-w`h4)isf80%#u5Kx5?XuvkLLHq0zzM*%rZ} zl)qYATfL=HDO7*EF5m(tmbD-zwfY}@@Y;VShHv9Qrx96$Ce zZaWT^=DByJ>j+!T8DJ%x z;&4)W@YUNSQ5Q$XeUvr42M9{dnOa*0uRWCVriN} zXB~FLU$#)>n46hBqlu!V#R*+!)gVE@<(vUIOESkvGxFx1^A;8-BWs4eC)!QCi(qyh zrf4N0gI2!}xdoY;G1rfSPN>|j48#hepbOkM1@k}chg8LO_spZy@ zd#9NF3{rd$457-*D1K_Jgly-)n7pAcbS^(<%RV&~Yk9%{s)aih)x6kX;zG2{h;p$G zfCK7p{b_63g$pB3l>?QosEZH-QRF8kS@aW){SW*GfD1>L*Lt}z6CTnLj|ejaa>5WD zGI*NQUcrm?m93?`75C~Q2R~1Bad)pBdS^`7ln4mfg=w$bxoybbFR8C>baeD{cee&q zVzs4%Vmzj{PL5KO30X3nm*IEyg5-OyIDsrPih+u}zYK?*?B+r&tE5d!POIx*ym)cJ zDb-SyeUeb`VWGIDzV1lgZDwW`E1wz5s?)%aoH#TSUbIYxoWE6Vt+VQ6y(>v%QN z&$v#j50WQT`WkZu0C_qClC+d1mEg=TQf?bD_5on@Nid5lmy*;=IQ4pZqiOsmp)i|b4d3+xjJ z=1;G%goF)&dh0UVCQHsDBTLGzVP4%J=oYo?@HiQ7w8Z}3jghWw%)(?iTqm_A0gN_W zBegy*JB*xk#*R3ampfvS2e036Lw}nYT>xFf9J>rR-f&4xw2s&d{+62;pTn^rBm1_e zwa8Cc^&I~q`RD^$55Vf<$B)Z<09JqELYlqVSSS4cAUnq+yZ?-Rl)oBg`r2SRo_9z# zE^6XnkVLUlW5#RhK`|Bd$YnKhfbg}!+h88u>SOrQ0Vd+1ER0A z!F4xHUm7Q5oI_I84^FSds&e?6IHZe%sL7TAv0n7Oj>9|YMEZP$H%9SfZoB~@` ziUhw~`UaD&Mw-^&Kj!a3&>@sg%LJf|+sr8LgElLIJ$9I0;YX!X$?{tj3O*s|98}i~ z-U46U@@!@?xW=i?siw(CJ^MZ^)~-GnK&1|dEZeK45=rr%4eM_)ojKH)aZ{DB4fH{0 z)22=77K#w{dqD_u1_XktNN?}qpa=rFHwHPudHQscNou9pHMS>Z1asb)p!M~V8fd+` zp)Rn%j&zcTI>t%TiS8wn+NV!L1ma&>a7MH!Xk7MVvg0Bq$v{}cuvACkSnB>lC}~ch zmsxZ?8&E*Em@zfap(cETX^JtfW*a7^1*}bKklt(_mfxT|njRS9860g)08-4!D%4-D z@ZbJ+k;Sk}C&lNh2fs@oHY%S{RcWfq*=7_OnP7?K%O{BoLSF2P{+nTI7e`>T9ARVI z(N8@HJj-3?=AIQ#o_u^kpPi&vB*+dRI)GX}{qf z8M{WG4abhmlUh|!du==k2LEoNfafKBr5E-DI?HAs2@9CU&EC*R(r5RO*w~Cyqyi}> zqrWXOevda?tL^D(UulWSHbAEqtq>17#EzUzr*D8m;wPLD(D5PrE@x9wctD5+FYHJQ zGwLicla@YgtOKS&Y%t(#43#SLE^Fw5q6dVR4;Drn&rZ!@DI!<~Hb|yQ%vw@wp@0+DKcLhd_v31LJrc`3 z?=c;1Gb2kMF{ZBYYJ8xPD2YgK0Ph1<2N3KB!;A`)aMIfxY4!1|59(@P1`562(6+Z4 zz}N`#>#V2evQTiA-vsfmV?Bzn`TMd$IEr8gf=OiV{R@_FSxlKaK_d&VpjV_++o zlzXirGXZL5P{&UP$t_4KE-n_8zEfefw&2XOqyOkvT0@<>Z;BS5A^Z)w1krad zsjYQF&8Db3TaXBOS>E>!kf9i5IIUBFxv<_rv|Nu*|Da{OI%` zfvE2h68?b_uh+h?u%M;F7hUIlT4}L$R&0#c@Zn6Hi3_3L_ohG0r7kUDv0M2f2`sYV z8cgm;CaN!j``-o!YL3YTGQwUcJ;CVT$2`7tKjP}Z@$DPHK@bWc9zJB(ulP52vKHe0 zpL@`=?fl=Xc}VPi`+|ODzW^11Gf7pOGvxUA6`XPeLfh{Jag$0HZ=5OV`ElSu83-!SboC%FJ5(&<>rB^)Zu~^ zd7BM|qTO|i8FXN7Iz=m&Diq(OZ*V%cx4|CEB@r6pAy-er3GAdPhZA};Yl6xR6Q}8s z)8XgU&SJBW6GxF5sUVxjww+g(IVWWSs1GZR#*;<7gX6mkD88eEr*im85HLRo$B_HT zcxY`A^a=qNBx!y+D6jAAvE|U}6wwWGYL>&fT2IjEj@>NAgH)>+pc+um#UFs){VX?w z{d-{avp>Ww!_eil^5SKC z5Th(Wncq27cK?Uk&P|CGg@0RUfkClkkJv9ikUJc}HT|(UYA~l(O#!!3R* z_ux)e&3SlnXt`2phJ-kORuK{sGTDX>i6TqxZ_nH%|3WwEPR^Rb(d6b~Hqd@C5Xnx= z(1IWe!JoDja%5_0G<4@dSJHV53oY14Y05rt@G<;_Gx?l^BOi=HMP7Sm8|aY%vMoqv znQ%v13(oGr>+Hh$34d)bA;fQozP`RVjj4a6@i70Jp_^Z`VzHR)UXF}?q_Hyc@Vh3s zWpAAXb(hLw*op*#=vL78x-$yvkKys`-k1~Qx-W6ukz8*h3X5TWv=O|HxWmLZrwARE zX1jJ-$HHnTn4wXCqP`s9PB=L%e}DhpoR%ocVq82Jl6Z{AU8Z9)UDTiA46a54dNS|q zxwq0M;EA$t&`o!;+-@_)ZUj9<32<6Xudu<12}ZhX!YhNM=)+>Q?(cI@eB{+^!ASJN z#5CqFuXab4!>L@Zw5k8P2pb-c~suKhv2uGO#6$BfYNF9-; z2vHyu5rPaoG$~3jfHEFw0WnJG+~d9f!FQkM{&K&c_S$uwy`OiztDKv5ww4m2J4FEi z5+{E<{x1M9sE7fZ@o4isvVR$Xt>EPGqmGdoGdx;{;;34eHkBD>LTjrUJ2`B>nlqBEcvW_xQkgjCqL`!0l?>CF_5E(13(o0q@3OV5&mx< zA?Jl0yhb!*3SmH&LXuE26}>z92~Uc@@v9F50a(N>_daS z)MtR6eVQ_oxs=T@B0A%(|0amCZ5avP$v0#qX!kxEiXd+h;17e|Oa5!i~$Su5Z8 zhcibB-VPdjS@?CLK$9_tOX}Gw#>6^u%on*I)KL_QM^)HlgDR^F= zB$#HTY)bn3hZkWXY4(oIu$y3Bq!}q7`g)&}=2h<})b1$;#(M>CncY&>jdDb(u4rR2 zJFOZMnmZxcQ+qgi_1ffn67?*y1;Vn5WnkUn0*_pSLm+>8fZ;_l+f1NSq+ug(+vMPj z%IyBk2Q)k677V$DK~+{^v4rp~upt*}&~2Uh248dWhN`>}>;+RZJBKK@F(z|6+gyEW z>sU~3dI5i2%JK4V$a99mCUJJSb}avo4UxtyGj>*QX54Z&yx;9O-$iG=Js<8m-Bie!W}R*gk80o^nwIRj43tLrX}$oicm5Ey8<5nyQt8={eW* zZ8M(T9(|xJL`y2ccU`5%;E314O^#RYEBklpG!C@b2grHcmPz}gqgk>%lE7UW_$0jxT=DOjk4ooy=`>w0!PhMikSxPORgCegiE@F!ZO&JOJ ztC6AB!tv4CLp5qoNYer@Ui0cXx~m*09*iQI$#FbaCQ6)VxAhIOu(R@{DJpJE`{TG2 z(<#A1?*P3bz*i-IeLiIN?h=D;pN$(6Vqn)*C#^&gi(QsYNz1ArXmEr7bL^B>;w#Ht z!dvn`&VX4tz%E?J_STR$WUB`aUduys|)!!ltuc^Z8AAX@u!v+oj#QWC&PiqO0XP5P{ zb{D3$v-k34w0y5h!@IDsX=ikk7%MLY6FN?Ikn^p}s{W|0j|o_ zQVgmF!#vjCe=g&qCNcBw()aj`%G8ZDn_MH!-jUVdm8hVkaUN!@CT6co(Za5%Xhh!r zbUK!aZ0~7VTMKxcyn|HQU29TPkm7qecj6ZN7*Q%EI1h}ieywXirIHY#2Am2Fmb61WnuF^MJ>iyNk zBRY+>1Z^n(g0eSgjIuW^u|8$8Fay~t)h~P;kXG4ktVgv_AKAjdlIrhP?*)2j@SKdyc1%&yt0VcT^&?* z_D{u|q6uL5^hT;uFYN?SZ?2i>Qm#;N3aUC=kxt3g{Xqhwoii^#W~Y|-u_7eM#m%Ak zF}d6*%g@OTFZHoZ8GcN3MM|uo9ne#ZD7NhxTTR!|T^g|SahnZUuvX)WEHO@dOG=#x zX{Q42>Giq9M_g({0ggSx>R1g%K1>Afd@gq2Lc1H_tF{l=I}d!relJ*iveCvd^9h$Y zKxxN~nb;3UVaY+JaPSd^?G_Aq+iWt@!kkBL0|)V8Qlbnpac`b$gqI!m7_?!wnwZCZ}B{MpRbB82_khT`PcX&5g6c9*e=UH5lgQ= zZ{5*J+Smq|qNz?mcUj2cdm5h0u08|Us*Y}uUwB)s5w(L*xey@aa?txb6}{cVw&9ry zN+xW(QU*FmmLj0|=m4f?Mj5s7!`g@6b<`daOaNHtsXKTSN1RKUch3$`-f*_i`zitk zi$CpQ2Lz}=%B_lujp2!$E%w5jUf_!3{MIpK=DvYW&E1CKrmr8&sI~|M0h7Wy9J9#D zCo9#!glaB+Z1_>64HCrgz=A8DVq-PjYM4Zdy*s3xR1aMlp!{mTN%;Z|eK zGE>=H539gF(RwYGC`V0N3@kqZ%gy+KN}nqC2>z=>|mV-|-vb8>b;q`0*c3Oz(41ccljf z0Q6tF9QFk>yOn2fO?eYV1%My!J9#$Ou%tPOQ|L)khH6w7WDlcTBoEcJ8i8~%3cTxN z9^?SfQ%-|gEcMLBD7~FK$Zw^?GpYXG5`!b(Q0SrQqgQbtav?q=y_yK` z8Qx#!i{$(yA8yvlGNI0k)ZI0sq~2&f8j3@CzamS9H}EhKL&!Dqi7^vY5$az^!#)Wd z2hwRVSsRGnD?*g&cHhdDR?INi)4b*|Nf%|G;BU-Pi7A_9DfuChs7noL{a_Nkdf^mz zBy4!QzFPCM6y+{iej+0`S3x5>Tq_cFDSWS5+mu-?F)foIwYl|PlPis$6)k^C-UwDh zK9RG0mhsLWkl$%Ci?Zy|V#rMhY@J-j^&z~+ZPYXNF%;91x?kQ%+WS$H&)E6T2T ztyS~l%?7>N(B##cn_6~JRxfogW|WHm_nZf!o#9c5csrH zyeb5_#^}aByMQC7E^N-Zw=h4d)13DyAS&pJm%^9TCmg-FR3?Ubir;W&c#~bzYp-b4 z=fHhf@Hk!h>%9qN3zOmm2FI>Jj+Y#hPB+QGHWkBXQ*O_CBsg5xU`#3)2XqAT$D_1O z`3Kmhy*8URgRpA?fZkt8AVeslG*QZ^uIPadO+{h1b>74*(L2d z)PD~s1qZ~2RQe{AitGN4C*Mx){;&@&x;O_EcUiZUq2TH{VeCA5z~2~Oeqxwn%TbhP z_pe?;svD%Q>QDobJDh~;I?rlw%w8K}$nDvRrn5a#whspdt@QYm;}MvwRR1!i z^&^4@g+IZijLXSnUOp?6W5(~z*mr&4y$1DC|I2>V5C>pR}IO-J~jCFEu!opbXk`uorGF)WS2O-%v6-!f`#kcw@Nyf5v|Oyp){ls zGFKi^ViMyBxK$R&kqVI<{PeWYcTx@9#sIBX3$@EeaTSYBNwLOj7c-PeQ_n!T2COLp z$|9{IXTxQ)lMH?8RNgv6e%-{ny@1}N7Ux>KZ%SX=r@zGwD4-5~36M3oi=({jt}}9% zeGaW2=jdy{?EXR=o~9MxLBRY|vQyCE&SzfBTUm;rvH!Nh~{MS2rW<8a*10DBNS|n1B z!F%`Oa%cfzzL?}2OQXL6mwYQy{nqAOl6l7}FxxAr0rdQZ<5!}pny#7Q{YTz`O5_K_ zh|(nr`_n8C`0KncJIxh5T1Xf_NZL>YzN;_v1 zSi15z|B{9gY;VvOV;wY@B_vRZ!ke>0Lt@wyp7ND|_4&aBYZDi0TCheIAT48l_24+M zKGQ&x>>VE?QQ9dU>523*hBvXlRkY=6cCH4nZ`__#iit9qw(m80{2~gd+eW>fyWPtd z#2Sz>&4xD$GG+9QYpzy?CypgUJt?}i1-y@D8iM2rA7Si1vSh$m^lO|PiP3~X4^HIuPq z3*u0goi|NgI%~e`XLcfk=+gI1)AqSAwv3|$_SvpV9TIuenI4t0E zB(V8;9@N)V5J$n0tGR0vLcDd#=U9S1j=VIYsAUqeh1?SesgE9JSYh+WS2=tPp`3r6 zvJxCt_Et)Q9)FNxx|5yb3K8O2qCM+x+?BP0=h{}?LEIN{ww8MujU3i^ja+PcpXLX0 zbAWgYgV9JD6(?kOQzR2hIGBCtSVsa;^fRD;l=g_0#~+ZvUS`^}l5n|N9#MvKjibVq?P`lRtL>sJ%=%X@n*jhE z`UwY)&_n-i1`Y2)|H1ss^ezIW{k(qwKoHQstbIKwb7eZXUR)=5VO?6VgQb$`#0hIx zt7$Fm6Zu8ge09oVm11RMyF_(;45z&Fl%Cky-J4G6D#F))x}4xEbo?~EA(HdtXm4KS znv9Gjf=LE!z?zElcdPh?w>e0!*-jG%HkywO!SXx>}iReH3|MSmaQlt_1 z_OOFLPdYZ~p?~!2~?rQ;zd6Q$+@t11um39W$I) z710gj)Z@JT$_<`t7{Fl65H8v%XvPpu&wF(0xczaI9O6N9c$wyIe+=n~RD?(_< za%+EB!Ax22$zu82A+S2Y0UG=z47ijFVAABwPQ@-osP}5Vk?9A{L>+_g#G)S#r%3gF z9ktA7%=7i5*TUB_SY*Vz-!4U$HTCOoUY?zM{ytCrd%J^hH6w|*aPiKRA#if#ES@eo za%_ja2dRZ;i9zE|{%Xb34c5N|&PNd8=(GZcfe=DOzA@q znj0CwDQG1^(vuwZoesz55du#Rg{CbL%b1`6j!6Uo&JqtP{Iw5E4_*h!3~?Z~18+r4 z2_Nda|7;G>s@N#V3N70CbRg+|)Jf*Smta00B{dd>tK7wch=`$l#?v*w-h-ELanLWR zU++9z{Mkrfp5Hy7lv`mcWQi*mn^i@!RfODv1X%EzjG>#9FuS~Er; zbe@y}YJliDc$15NyS%$c#CwBGROpCQxTsFhNs^L_=mDL}xiBfrwcxkZ6GUJ9qh+u+ za*a$?Z-nVCd?NZ$BNylwz?6t21VLhn{kNN3KSL|3nK8)9Ur6*|$^v}f>vmtfC8&h{ zht=x4$HbTIQSC|jJdO{;c|-e?61{P0%T|hFjp0uk9j-s~){nSpdh=z**69FtQr^PV zYT{>NJ8^M=p6m7Z_IZjno_R1*Q=&|?e*#ix8=pPuu4nDp9K6@kt$>T;v1Jzf49DpG zz~A@;nbR5K%7i98rHhE(-sj=AUhAl~-)Fa+rHLO{(0Arx43{mvbtgr*j&H|%KRhw6 z+P+)*y&ZhRSKS?m3(>VSK2@pS>m6)wKa7?LWKd|74boCR4axh|&8)zfH`r!zA&ajitUOTjAl7^76dSGtH>+w)+OO9w))52l zTj6JqEwzJ7A<79%d-Q(8QABu9mm`liLw#hIToAt z)|>W!URps|1rL{x8KHf)OiTkWb9!Qmr{C=wm zxl&{4FC4G6iN*z5Y;$i-vQp3-(fV4aHQ=9xmQIeZvfD3@JRcCyd-tcm+yd_v>caim zz1--db@7MM#%t$cG4sdr)bTvkmya1cAD`}0P^Yy?H3D&@SLqK?S|64*A4;5SoD^zb zTwdtBdkBCJ^E|cGqjdg!PxuNC9UD$rfdaTg5Zb}{YsTGzjS2btW7T{c=@L>d@ASby~<*}aWGrHP;Y^g(*R$v zXRxZ^UZcDb`H3TAChX4JE>&z#Roi#`qlGJ*@+-!vYx&9Fe}jqbE-|aN_6;ZNt>)Kj{}aDJJ-9@_m(gFo8mH;o-r7IYWDd&E3s+e_$-rLxI8ILsPJ;hn zvyWl9Z1P=K+JYx}19@Q^nH(gUFY)Y4z|ieV6s?&PF%XBo+?!|Vp+_iT zx#pjtyHi}-0uQo)KyS0kAlPtUn0-k(JMDj8r@oG9wT)}F<@=AI*M*}&w*EpF%A52- ze?ve_?pJ$GB@1z^676^-PkIC&`2Nz#>9_c>cT)Q>ni|ogO&>fNJ%O5#-)zVJNCZ(} zEuQYK_NKqrrlZ1Tyw|De!U>rI0=er2((p6VaklF`d4Q*9T6=TaX48KQlJ>5Dj=TFt z#Mi%4og!KZ!_;hSN|2uatkPx-aobM`+}2rxlfec0I}0hOQi&73vHG~T3cuU28tylR zntdYwfp}&ULv;tVzVnQwNUmx8ta`aU|J z(@W==%_Y_>!|!BzaC@#!_0w8dUyq2Rx)>1XOLCafp8JZMc&lXuL<=`c& zI$N)6GN%9skzu{Z)b_YkV8P!iRzXm}kQ$!tN5%D@`4(sQoO8=D*&@T>aDAWza#j zlhD8$w1woX6r-Ng4&m;I84VaSsYCog+NtUUj{rVWIe+a50%CW{Y(9!OezH&|51f3A zzSE(kM6peWV+ZlO2SZ3N7bfAxJ*$y8+zsa5Z8t{hk9@Z38(zK@Nr*1DH&L`cUph>X zwH$tgKrsw{IQW+KGPfk&=@XmnYKAJ%U1!x=mS!1{uVnB}0li%_y-w=abfa+92gc2- zJW$edR>uEE<0K;dSckumJGtfz!Lc9ku|i4HxbTuIZOg5orA_Eud2Q-s&-;?rYUe+* z5;l7w?gK4dw_g$NwwUwnr)iwabu~keAFgaZQ^|lzi{&euK~OquKcF5 zotCx$M+RTC21kdD!241ZzJ$p)qNqEI3hX{5>S9gl6}L|6gIuh*Q-udUuxup7+h049 z*L-`!XYmOKHM*-LL8E%-#Au{}R~`p4ME zUCp!F>hX=Uy;7SUJK{xpmnA75$g>f)Y|rn$A|Woa^L!+lynMqws}*pA(E~QcJb34n zQ6S9D;wLz&n^_*g?V5tS9lduXw~G$DF+>$F*=Zx7)R@V4O&jtg8CX2XN}+68MhYvJ zk|gxO7nGCagnKJC3rJ#dsyYkT=0{LS47hZPGCyrvInVO|ZCNd@Kv@g>55vT}n75|B z*6zKx-7lIF>dNgqDDXG~EqFftB~JChIZOIu?qq^0BKPg9?bnxV&gn6)o)JK*Vq>ub zB7(6(qQE77%6t}6bM@?bmv5VL<^4cW@mmyFDwUc~FD)7MOT-X9{OYwNIb--S+w-=h zJB_g39^`$Q#l#T#<)}K*qDunnRPM>{M-lF~J)<;TEGx`ehx3=}-#HQLZ6hymZFOZy zHOHQhMiL9|8NEu?$GKKIG#JFMG7WV(+ZOF7g2AZ8Z!VPFM*)pukb*DFe&pCA3}W-= zfyuf-W0NbU>33(p-9y-vycz|T5fn?8fiZ7bIJ0uaqqh5A)=tf1?vp}yX1S?JHe{Yt zg^GLq$$|OJuS3r@B-Eu)OFr@;)~vg7-QD2sMnG3N(TCM7ZO3cghLZ6zwCqva`oZBA z__N7D)#V9O&PQ*H`#R;O$^X7f>uf%+eb5;5xOPx+;EL(7{C?$kkEoWj!`mYGxydUE zwc~HXe>a3U+mV!t2gHgzGAiD^8G!p-Ydy+kFOXka-~5LAn^e!TgMZjWyh-gK+5n;( z9uYq(#*3O!UVZ_z3 zxD;5Zeo|8W?lXT-6OJQfv&SocQ;=J7_qq#g$NOhIP>V_)ywgrihLAJ4?aoIL5SYev zPO?>ZR{M&Tdp-8LSN8YyvxNtzRA%)+W4`UStaB?^pFibBZ=G0WSXroFKb#SejrC5t zJCm2qF|d3i+eLSD^fSBW>Yv?!gr%3~nQw`~5Ovr$YrAgT6ibVV@M8-V2?6I+lXOPM zKcC0}Y8NYL>gTkx3KI+`e`v^RhxC05M>E+)Mq%Y@AjUx@#KcnS>Is>}dR}r=_WqQ` z91kb{evYUi{8e3!K6pBF+vjc9UD{TD60`0|ozeLB3yLx8Kvd-)GJ*SrtFC$AYRC!?(pUt!`*qCc`5sGak#m5FHiWO z-R()2D?k9E^y*+zwfTt*MiFGrpb@tiis2BQL z=M`9PvQSlK5_6RhhQO;h&!!?IaRGTCb`Dy#B!&^uJ1I7kWeWeG8g3bl>$RAO0bg}$ z?JvVIBtWBkS{{Pa%Rqj5cPQ}y_dHB>du;nZ5CRJHMoc8XzkB=CCqsDTuyT+Jc|Otn zL8u&v%x(BwyCer2yCot)EsQlhWM$x=N|s_;e=y0w?w~7I_6z}yjNG!@@&7)XY?oo6 zDas_M1&=oz|7mP16`<%uhCfsJx5M}*1*}qY@o!NKw7r?czxG?`m;WRV69M$n*DNpZ zq%1$Zdt45+5CiQi7V1#v7GE3pe}wL50rfN3#?SIGFOk)K?QPr)wDB1=$Nj|q*ndhL zb%B>pvD4&q-fH)WEmxB9xL0S4gSuIf@$DArVJ}iIa9~JpuM1o-gqnKRR zV^w9P|AWCvP&4!nX*lXaG=|5*U(V`C^GN9I$JcH8YLXb^3k3oFH(o@x#Dc!En(0VivZlo@;}p_33bYNrxBaJNZT_gi?n^t$AM3^5HkXLl}pl-T^=Y8tWOEX9;*2AyAB z^gedJK=!SwxH$Rxhdiu>xEtMDFXea})jb?;z)ao9ewzEipmPQ6a8(QZZ_X4XvFNG= zML=EK-Vpw_iksAm^g8|{9NOJ+ov~o;%4U*w9iadUw(CUBY?xJ?8ViZuaQnB_zPDy6 z`&Q?SU;MrHpYu@if|sjcu15N`UJq?+PLPX37{V17KA%^-JgU%qu>BsB^2$2zeP;xN z1sT!w;n7#W?IMvs!TZm*o}hhJ+}+!f#Lldl`R<;EZ0*{t?rkG))3m>l$gQRPgS1el zM(5pTcYmk-Cv|nr${5c;>XPb*srx#kcZ-8Y9&Y*4ADU{0D?QN#)xTxt+sg_O`DqB+ zk5Zu{&eCChD8Vba)_Pn`v@tnM&o&OxtwA0Lv50&i#a?GbcEv&Vqfkw_hU!t#r|9<1 z|Hd6Hv$jn0@G_r7(6Vzi!n*b26h6zMj&ibVqRq#uE);$9Y0aaK zKG@%$G&+wccMz4J5}?qQd)5#<&be>IHgK~|JK)`~OPuyy-{sIOoBgzOFPkqJu;^=- zCPPZgYjAPcQ$JhPP)~oGP*T4mF#>Co({Z~;a5eW!8; zd&>C*D#-Ye?S24zS*Fi(7tjcG^!ZupyJkYGEDP0O(itop;nE%Ty}<~nKz3Nfaj25V z)8AUI^TtNP#wX;XFI?R)Tj_7Fc`4#Maq$g}RFsYH!*4yI z-5n-B*hmH6vpvs`Ca;Qt_dyoCx=~3JJV+U1?61u+#-XfkZFbtlR}6Ee94c8d@&Xjj zaJ0AR6*9zD zFt4WB!7?#E3apq!^QPDFCP872ENZ@lod_E{UrB@&0W$OMRML|F1N>UyWiK@)uuw3xZK2R zL+mP#{qbTwH~2C1WclazC#{ZZ|iMkkO1Jcl;3UA;12UX?}BuvI5qTG#W|whZvBa7t2|KzD2@U>^L6l z_#~Pd+#df~#>|j@S+LQFIX|hMLs?``Z}i!IswG$cWOW*O@j)Q<#AE@X;dP4@wW1sT zL6bbt#6v1Zik}T(x=YgRYbS6y**UNhgz6oF<9Vmwj?b1wd{rC_Z@WQ1*V z5%)lud@G7}QCfN}RxhVK-uF95Pg6im49lE`3PJ0i1km{Ku&+qF>I$PV7P$8+iI~Df z-Qb@kk_>!rjKA_b!b@R>sur)i7b}fDSnUUpQ&#KJE~F19nB$<-_0SS56@*69tcg0E~7VLt8G> z?<$OMZXh*Ub`vA!XtfSqHgHd_X@f3OX>*x$Ir`aS{h*tTGP%%pkJQ`EnmHUp>L{@+{UirlbANr1hH$v^S~BNOa*S56!}@b>me5-a+$+7hwaSC4*bXjBWj0fv zDHgTDImOT;q!R9)d%PHeBI7+Q(a2@!Whcu64$@v?;C-In87&3~-0cN&m~%*SJEKzw zw2jzMG>aBMl))?v_w(}I`dk|DK{UMklpsfKxyy&-J+?ePw7wT`fA<~XxW@3N zDN*9E2=esYy|9MyT`0-4!L(I+krMHAe?E`TvCYqK`!}!jj5RekE0n+cP{otV$I$qX zPnqADsG`%xo_q23RXh{@5iHbbCrPFhT=P0VbRDD1PPrS|Kd4JF@V`|1>j=c?9jQ`@ zxb|q`7;s77^|FJF2T^9CZ8o+X*szaW>CzmRppUldUu3c;@#G)xBVjD)wFT zdh)e|DB9vxfr=s?hV<{-_=9_|K4&5&5m2C((D=k7q9l*UT61RvnU%MsTq9ZVtj|vE%T8v<-Y|KURY zk$RuUUX;&A8E7|HsO}N^ptLHoUS3;0fA$H>q!rt#zx%YIPey!FETJM8gUCH2w)eOL z)jNy{Df-}mdd5=oyOrGvpdu{Hi07xoxs=X8+%!k^ zWWI!9b}5qO$g;<`iwtRH9Xd4h+gP3m2Yb`UAu!FWrlqH5IwSs}M5J`SaZ!?9qr3?i zR%63(VeUu%9X{T@zpPo7h1`&W6if1k|nddA>2Kwu4I&IZ%4y2EuR=GlYg`l z!Dgej+l_v<+rnj)PGpeTtcQ<@=L+ao6|MVfB~-AGvzV)C)3&WtEdSWKT!G@(oJtg- zn(?$$<{vcy!Z`@l4mD z#NG(ajMGb#qe-mySDFdw@&t5066femcC&>R0OB8_T{R z0a1wHOx3|CAvn`UXEp3Np7qVFf}^YyRp`?ebCNvWF>XZj4lHJ-^yVx0HI={GyGtqDq41%fg1J+L39B-deeEnw>rQqoRQ)}@2 zES&Jsij(2NJfW2jM*yg$)jpQ){`PC6=Ev5VZ(AD0AI7J7 zg4i)viMwjtK@DZ@HLirGUObf21^V>!L0^t=9Fm$+$ECvxMU`_HXN`$VU>wdqkEi$^ z6iH$#a;metnaEWi(~Z}+&8L5bDRDJCS+SBT6p;g|6ESl#k zJ%yh{W6kWao|Py5K`Ul|(cmkakBO;jK9Q{GeI*Vdy~&`NqIu5e>gAla+8H&XH9o=S zHM`5UVD_dY z6blFXKt8nJI!*b+*x9{;>!(9liT&YbkE!VPq|gK9(RS>uq%CJto_K?ZOL->7qT9xM z%3#((0YBw#UT4IQU6a*7)~vdCUpCUig_P^DhW{pb5O96>p6zB5p&ff3`;=(+ofXR! zR(Y->Fw$@Cmgd>d2ds8Lb#jK5`yB|a8o(}EE%B8jiA+QdLNVS%59li8d_ZmJEXpQ&S z@~#H2mrkB1j)1cSlqW|J#WM}z_8j{zEIn1p!9tHydF`|*^+@~Jk3Tn z^cUJBKusFBSF*4o+s)Iw`vU_l$AU2aLb^m*P$G{}=!_ij?nM%?_*)pqn+P|KL4S&w zy7{bR4Wb7VfZcJ0Zm#8EF?H&gL~~k;Dx>n5#^b2^BUW;LM=jldN3l?aSddVJd|Y^5 z7}xW%<@;A|oRuEjAr2xl&GZ3@h7t?GLo)rqm8x+hSqqxj+oMfepr;Nv=LQ%2`ddXK z%J`>J?+;)xCkZ$QQQ2!aQiQdI&m(qX&@lix>F)y~*X|K5IY0VbZ@gx!YE+WITmuWW zm|}z4>eT~Md1j|42Zt{pFh0cOzZyG;h^!vD>D@8ilKJRXzNB1Xyd!Qy+G<>g75t63SpK2j)Cy2oc?NP??f33-x*r@ExNA!}AVN-Jm@sOX8w_*xFy#|LVckRRCMJWw zQ@S4aFsM6{%y!d!f&ojxd595ukgw9jM6{yrcvU}6z{cH_tv9999?~?cqoKot`r$vAH8Jdre zm9#g+di&{Xr_s^KYgT1yJHQXSx6Ap`hD+Ub5wsip3VrT5$So_$Qt2vzK%cQfMORBA zUo2ZhMsI(7T!Sj95KLlye*b{1J3e-2LeBs{mv-_@2OW``YQ!#JySR59wL>zm~+FoJ_K4~R)hgZ+h~XC^~KMRIeb-u%|nuIUWn zTz-1Ootf|Zm>fk%#Q_rYXydJn zI5Y?z_>On3FyiT87O)*Dp0h6gGNglri$#`+LhKvAz7HUCLp(SP8+7*&L}&aXtBwDmFB&4?)NCLc4)?tiv7z>WJk zd7>U_NHTwL5@Y5sG_2B{{6qy|s^kVluMHn%!1k2h_sC~_Z48a6umNZ5%JeuLb(eZv zuReQr9#)j0>dQ=k9M7QESC`Rm|K~L_k|5;x1-LvW0OIMa0PK1{GS|BwU?QmC>Fy8< z@pPtznXsZv)IY9jC)k=L@)>jgH-)~vHM>2aA14P({%b=&CDnMGIq2~jQCGO&TU3d=;Y$Qi*YQ=?&Y4_{Z|}#!>P-e ztFvvQfA;GQUM%DCXzuC`okn&pzkT-&sqJ))W#m+5?(}lb^ke9NfDVqg2}==mK(DRm z<7wOupd?!4V7WfUG5OwuCaxVauGw@KQYo-{nAiy7p>H3g1wGy!YCh**)&q_4%} zm65k4J$ksj$zJNX$(5sKy-eV-9(z*<3%I6%>00fqsCwbT}U$_*%R#B)ML zP=Tlkmk{D729`e|GWTXoz)6)pMXnLT*MLA`fmfZM3(sQk6tS-mk&_M(Jyx{|cz7H_E;xMI%?f z-}r#u^4Ks44M7OddmEW*?z?4U=(Ub=gq?VS=#TY&cvi|}(AB=%hKOKpyRwsflyetS zCi4x?lm&QE1(W8-bi`Ub`qOg_W=ep+(1X7ze^HZiI0FMa7E1L84MNKYp|O0*M#P+7 zZCI(q!n1=a)&D$z^d)$?Fvi|r=Qp+ezy%CVJvAmfx1P#A|8n1?>I?he`=y2vnyy`9eG8~#%m99Rk zS1b=TF*UjbAu+m#n;q&{T+Ds!1H~;@b;7M7c~>mxC?Hy<-~t>03G~HTG7aY z*nfrzO*+S<1sRgOD^&Ip^m=$;o&~iZvi0JcbU5>1YmU)hsb{?&qHwP!&NTweo}7@8 z^;6GEeS{2%JKJ~lIAnS5=q54q4VC_z0h}<4L(9U)0kHqiP^+*3-FhbvJ)UheHx7}{ zI0%M8U6uXN)U*GlUQBbMCkh?94-%vnze5#49;xlu^*R@@q}@fC(~8?J+S(qmeCXYJ zsN-4p^}R333%db}X+KYZM;&t(F7^=ze{ovYbWq3n{^ydcE7v$Lb2`#X$D?r%oN3F^ z|BENSLONWws`Y@@q?`?-Kera+aqquH>Enh}`4YOSP*Z|@COQ8qy43ygK^3&)uJ zVTZOBpXo&NVK0)Pwqsa`ViD~%sEG)KF0Exhlw;9+VnC`NXW`zV`sp-b zt#p|%JDZume+QaUi-$tsA0hL zTaI5N>l-OeO~9m7jC#aDZ?_){a+Sx9b8e2yOxEP)bXw~ClW!|?=&j38c`dMK*pEjM z!GBbZB}fuuwM&rqUSjpuD?JMt6LdDN+c1X0$h@TQe=9OHmI1XBWFum+I-j|U3bdpt zmYQt1b(Pv>H>~H&#iVK}sP`-cyw>h=jrJdF&@tFGYeAento`LPR>ef&ED>#U!jacV zCk~BiaUMFAT6oCsEB`h_O~7UFYytb@_xoiFZe=$&svu-M9T>8iGdb;(x%rqvKTym& z4h=yOGSdQwd(0#TQ1~1_1r`pd9SI5^x6(5^-4C&>2Xx%yCGCr%xSpv;V9)XVx}*Gm z$A36a;(bseLi`wp#87`cD9F0k@!JKaCCJEJ`+h9`K816t=OPP$f1v8(7dD(p4W*rL zYe3=fP%O$oX&tm$ukKmuaTd6Rz-h1#P@L`R3O7{|fL-xzMXI?!jMAKY3Pu^gMb6@& z<)6)RnZWkRDZe*>Z$j;OSDbId1-I5#=DsU)c1))N>U_!?je_6C>Y@0&6jn4a-=pUb z^+(|?K>b!REA~;ymLLZKr4cG`41)>$_Q?eSNMnSBF6U)7C?|o!hJ)sm4;|w!_{mob zks@_Uq=Ua-oaW}C^&N$d_2nj(I-qTpsQGjw!cCX+BAc&pE_B{snGQi=T>XX4-BTm| zSh#rQ()^~;v>hUukd7;ayx7HFoX@^!`>@?%oC9SP^nzu*I7H@N&UiRzlE?Tu;T}`* zVbbHeoi*9ZOX1l)OG;a~C~`k|{G!dbD^e12fNrbu*+xI6Pa~iXs^2ZGo{enlsOnfn zteoPQRwnwSoV*2;GxbfHystY5Z2Oe<4?{Fl**$>ntxZ*Z}&4pV5~T@f~hWnXAN8Zru85#|i5upyZ1s!5d7*N12caK&}7WzLq~VkdbM!_BK9 zW0k*$=Pd2?v{wXoF%9)P=~YQVZb|cDA6m1CYIW>TC%SYTuN%8P!;L;8-bKy>;mqn| zeDu6@YJl?bdXw(CCnWH%5YPSjV-d%6IdAE@!5k2+*ZAG+@E-{u=61>+ss(So--Tne z^y#-5R#D59f@$ekZ`23$(2@sksprwghstYx%9+8$do}#~W&wke@ARbLQo&A&; zij{0U@nj(&`Q#^VT$3H|6pQ8)Zyd9gMXOGEqjrl0LfVM@HP*|35T`azNbp8NP7rGO zulI0Qtz`bqT1qAGlan}>b~^tm$*D+@Gu_Bcbtv4abr0OT=?FaCnJ6!g{q**AycG3o zA)J7YQ>=>d-f#h1qIv}tZozXWN{(nyA^Rw03V1$20oQYe5Zlp4Qdc=k3aB8_9 z9;JA54ELVNrsYn!sl_+FNnY~#a-YZDV`Y-{eWWxHdhGygGiiix3fD6oXffZe#~B!1 zHtEP_52XZ4Gw@Gz`0`sMvU_=1Q@HQ05odikLMiv#yDcw4W)^odE6k0w4qH7DO36VA z^lg)(1fOqzra(@=Ij}Q~U04VtgAu>b%%4$NL>HY29 z>8E62rYm`Cmj_rhs4So#JaK>d-travmvj{F9po#NIAL8556hS|sQHonbY9mI`Tjg3 z&g$)`7e8g<#C(_9yHO++nIzC6)Hkd5z!T>YnM9a(PG^n{M|Ay5{7vf?bZ|f!N+aB# z=W^LYji7?=x1m*n-z?g@v0kM0{QcHbP)uUpCO{F&Txd$JY41)7Wjwvd9KQf{QE>+? zvx9Poq%xQc1d{r`wVR{(C;MK=!Px~6V zbE#ew!}qDAJ&I@nevRmE6J3x6pZq;~+aF#o_ERrU{?P(U!SB4BC^PzY=g7nsv4#4L zT9gKrU07Xlt_pmbSBnexdgifH10_9j+!vm{YLICJI;)~a;FmR{l3Ed`{NTr1j%wc8 zcA_JFz|DGpZa4%K1GZG<8UdYQNiYG{ZFgshI7@RZ=oV{d()zS)p4NoL$sIcGN`H~B ztG^cDlE-BkF$M$Owho(2AS$ApdW%@0Ke!#X(_$D%100|;eZ{X_?dV#jJ@j_=-`zolW06ERCxBnO(-mcE)F;;+nAynfBo5Hw* z$Rw;fX$RJQU=>+Xv~x@&JSWV@ffyK~_QOmgO>ox&+Dsj!+6DNB!hva+^wPQ&4{H_x z+OIv_QQ-?Sh_qk0k__1Wn604Zbvql)gh7(}K^T||m{5Nqjs-s{P)D85O_t$s3o>rj zsq?R?gEtPh7z4ckjgp<1vNBGaXAPw@{|0}YX5?G>N$9PB1^7$2C;Zr4cFHSG*n(&SK+NdH5YpvSYdI^2M z9wNhB#C{=d*CO-G3W!iW`eB2`+CXIPWqQsZ0 z)cNN9^hHt`3eCajyq37M{}Op$t$OxCzq=~2#2o#isg$CG4_T4^U4iP~d8}IM9Ia=| zI4j3DYH4QBRm(wSM=g>|6PLz@IY9HCCx3@}^$LFXxS}~>1PK}e550hSWdBi|HFK?W zH0*Zc{?2&Y^_Q|GbU~LRFWkIVd(on<_VCg!XKg>wN-qbhVBI#X0&GPa95qTiE-a$k zQiy7VsrAMqYgAE%G%qQwbixs`cH~}IUdP@aG%by&7Pw1ie2Ax0s|0V%q$4{OR2iBZIxe_2?&tW8Y8HDtTQicXky{xEjp1ttNC#s~_jR*+VtpQ`1}r_1gYZf~2g&L#{$h58@TT$~=#w=UrXah@N z*yea!fpNSG2h>WksA##G-56@*>6x8O%oPphlinubNJ!twu79)(4HJ80nN=`Y zE{(d7*#28zG4NH=B#!SwQQ-hpbjy{=17>Ut@wG0_H|)FcBbC@J6^~ucP1Jyn!1uC! zaLP@n)g|7x7aj1b50bNLYqo-Kc&G`h-_l#l;kcHzR40nLbO_>yk!2`2yWiFR#z4naFYs?rNV9hMtntj2txY&c$cZzQ1aBMqY z!fju-HS2&gvMF6U?uiPOZr`=m^j;-SAFBMQLUav4dzO2X=gE%0>F6u3SHI-ipx*(e z4u@ZrHmz}bEG)Tn09Z;%EX5xX<0KjZ0Gl{N`N%TeqSBAgp%jdK$% z8kP4o)5|ej?fnV9L{0dgl9raYbC4<+uv`e@F@#)Cm;`*aw ztx<~Ws}5!gT{4WMX5^MTD-B6`z_4;Yjt{z|aWEJ}8_l5jsuKcf&)%JnR)SxtUGN>L zFP?JJ;2vwt512^K>V5F!!~Tv5kNvWGgal3W`h<}xOVYNa28&u#RNKBhk&%xw&E$

*9{X7AO+H3L9PtgK#LuzFs(fwF~FwJ z7i7z46e_M5fYG2gGCkc$tvHne!=0<|M(rB*HRT!wd)%N}$(fQhL^sr(VnCYE(7 zBXSdbIkeuT2ht|axB=C&{qQSWe^(uN=9qA4Gm^OL0&CP75$MB7H(0@5&`z1C3L;lu znNje2M-$fQ6E^_8AOni|e;jx~nbjRL2zxhpr!4jmNQF^wZhpE=>^Bqc?N3SEb7+cJ zPvn4C(N%!iO$gx}gkW=s08uT55bho#%uctxg%Dg15gtPbu@J%|2;p!BF$lo|LRfF! zAMMM84SvX^OP+yddkG4L`1q49%_Rfhx! zUXj<16{deMCP2RHFLWKM;|@m)00MF7hw`jz_eqvK5V&m`LK7JfhmMhVoKL^6GzvZ6 z-GW}#dRfz{@zq1GoxW*JGpRwZX}zF`E~Ax>a-kdz4T4ihH5Rh3zqUND7~npcj_XFe zhu)Dge{unZBg~8>#yWAObXK@jed!Z)^8cT&qoJqQtRRiyNY_Q;tbnUI^dcP4 N*D=0adeJfR{{bTDYaRdq literal 0 HcmV?d00001 diff --git a/website/static/icon/nodes-6450391.png b/website/static/icon/nodes-6450391.png new file mode 100644 index 0000000000000000000000000000000000000000..48011d3805370d2fc58299cd6d61b684c98cbea8 GIT binary patch literal 9115 zcmeHN`8(9@_n*xmhN2q#)-V;uAX{W9+mIz8WSJI}y~vhjW>hMKVMvJZ#88NABfLF* zqU=-FY}50ENtVe@mhap1e7?Va|AOyz&2`OOXYTvlXL+A}<1KOhhp2*KFMK0IfBJmRgZL)QAQKx7v} z0i%F)RUWY~PUBqo|FZ3U^4TAXFvX0c4i22jjjs)f3q z@w}_z-^hj@`x%wUP0l7~lP;4cGe1!vTg9 zsP<-~5D(nse{`wSrmP#psE{`pLTS|}0NbH8&u)#Di9l|65LJjyA&2A%rH|{NE!Oyy zp<{fczsakG2`345rtit`Ne1#FZ^ctRfsrYw34!``;yCNrr`XX7Z%611B&~o?g|^@TOwuse@2!#B*yr$E#C?e3OYarxrzy z3T#}XkTvgG2LLA@P%#?gwyZBe2O`ebL9Omp=y8IbycM+E5})s=+S%!wO2s&IWOtND zGT}D|mYbGJi!g*A(WsP1En}WGNaxh%Gl{ow)qDTIoJmFAV z9cQq~p~HwNX+-VUH-)v>;5S6WkA_Ew#HV0tny&yALi|zFn|cnRPU#r>l^!cRD@!9- znnPvx$P#?47A^68SzkB(L%36mTppNc8T$JFtm?>{!B-@a(C|zXEn{lGSQ|_bv+=-p zEAvdDZX$-h^#B6eza(qdJ2jh|(BX9>1b&LxUcVbPl?cZ@47i86Gqu=0uvE3wxW{2X zxBAWgLnNIfh3+ht?uDn6a4A~=xi!i*N|skkVKA@~z993rK) zti>6U1M~ZO@9Ug^>r*$NF_$R|(enCIg~mQCD_j?k6O4uiy6+UB`rE&A3| zi(Cd3ZQ9KQ9cz}DY}o3R13?j#(*qqZm|RrMRER6ZsI<5X>MrS)1KkLxJX=lQWZqB3 zOudz9l^Hl=a57NdzIzQ2=A9invmh)(h$J5q=C>XX4*h^meumuEF_LVY{>&~gr`~SR zZDsXq=J#h+ z7bY-ezL465`s)hk4#^OFf`4KnR~Jhk?@do;`jctAvtv*RDK~zC-K!m8ep5+L?`B@+ zhZ_{73YQ5HHy*QJL08ytB;pDO# zRpqC$`$5Tz=g0+RKId__j5p2A+l$o0 zK6Qw?0%`6x6SN%gi`OUc>TNC#fu+IBwYB@*Q8~YOg=xZb%D`yH$}a%^B;X67vdB;i z>9M^KxGXs1{$QuZ0w+_iwdf!sTD*#;h-X3SzxLz>`1G#7T7uEDAHDttT3RBiAvr23n3H# ziQK+>k@ZHs5$$wjoX6p_BcKfYED)DlZR0f*NUabW7Z0E7a%_lxh5RNzh5OtEhE5IW zn^s;!>*WIRd<$`|?UNe;=W(z|G zz7VD~j81TYi(d)o)n;e)PqzpTd`YQd_9HkAErVA3JUX`Du)nNv%UZPY__GuwieX-U7(LCQ!u+zN{FV1m-Jk558tdlLiCw z$n|g(?xhJj|GpKX2iHh672F!H_71s)`LJQg`7l$=`e^; z%Lb9!ggD{;ckeH$UL007GT`Vy=vLAC;LgG%cS7We%Hu{&m+Cid#WK0q?ccsfiuhGAI$sCd{~7NH=8U; zH<5vrJo3(8D5kW#-K#hue%mvi&YPNUT;dq#sfuD(NjHhrSz&VY-vC=s<%IhK8q{~n z3@8Gxo4@9#lpnCc`$oKwugKkG_j-uaN_^(wMK@k#=|q)?HjZIF?&m!5$CGlazy?`{ z`Rv8-lBBSGNp;5Zh`_93FzFoS=P8Ymzx10t8(A*&z&(}9*g0`f(y7WY3bd@Hp+ZSk zuk_Js7H^bFtM_7H^W=ZN-k5hgJZu)4w9BC`)ni%#jT9whGne0Feq~o=Gk7)hWhz0Ic;j*fmQP1y_EI$_*s2b7c4SRQG*J_n)!hx zyI#okv^PvH+n?e>;}F!xV$#I|@eA0njKIa<&d_%WBrNF=fFMRiyeD2}-2oU(RCyeC zr?J<~kaPXTX=EF2$-7+m)9hg?)umYJKf*i8gZz4BoyMjEc$LbEF{zzz15yu6wG81^ zLK{PD(;KgI4s7EXhh{UiAYWj~iwHwID=cQi)ORcIGWi=b*K|h>QLkIyA|Vb|r41$l z_E)#^{s6p~xh6ZI_7wfU6-m@c4S|hdN&=0ZJK%}pc6jgG>HCZs?d3l~P3`ycQm7|p zebv!t#Fb2HBBU((yaN((_ljo2!zc+E&gwI!Vf?G3_l&axqGcH()Y7R91RA#-6>ze` z?_|rPDcNqe{+BGtLOwZqWRFGAFEvhk)x*@KyGJTzjPibTdAQ|Ref}x}+qR)3IO%!^ zY?{)?Ord#*3@lsSZTS!OpXQ~tio&iRzpAdoE*97{M`{RZGorpcSx`CSnazd~N^4Vr z3Srl-uO|dyDhc|(N^kmYw&mSnEgtWcHUFHCg7?@2UGR+`gZmwh{&S!ZMfyT67FtPb zz8wyh<24y7nEJ|^+W|qNgXu3}ljr*kwz5s88W4oiGQsqL4+Sc>UuSrvzfPdF4+4Uu z8KISA^7mlo{j`3@8uBQ%zOTlj=du2aNU~(-Jtc<6E31r5&n9{L6-|{2x`_v;G)EpV zVq)#~Dz!M-h@GqW&8uLoUlXqinDF8v9lE*!1t!*(A1(l0INygwW}C$P&g}P-=5kc1 zhd9cXkuHMX!@llLQo6i4k(Y1NuLx!~2fMqGl0l&5iPPJ>!}?psH4Se7-cOU?JhI0Y zs#>UWDCI!jZRJ)j)r-%O`hP#rf1wGnF8ipv4ewS564@|IA7xcPTEI8fwuUUX=@WcLEAF(oPqjZG z4#j2!;+g2rt=})O4imqyDYb9H;IZfX(9d$?3c*$;Zq)`D@pO2{PVkAXI;<@?tjGxR zf3+;R`&(!w{-MMnu)Cp8OgL+LI6q~{jcV9H_fT`geotG$o79;dlEVdhmUyS&j@RFR zcLaVKf`|2gYbk5ZJ`g3L{dR0E(7PS#ZLD>6Hc1$w@uj2+_H|=vojKK89vgeq$uXwU z!?CJFkF*iA!fl&ei>uq3JT#ty(TC-Tj`I+xVpDmeY{}i->%5iTD+I6&yRZfgFvqjJ zI-<)LRR}&N?>jC_hhaqgs;4A~<7{CJ!S2kR=J&C&U|V)sN>NeFg4(av25Ya|)ZK2H z`VDL`u>`Pj8_9py>`0?YW#_hR>HmFTh(C%4L(h9S_j4sF0V*C|Gt*D|1c7mCME$P*6KsRkXb z)N7T=R<(ibxrY{lUD;ACtOxF>AaY%O`U*>gcz)#(6+@Tuf*U9bzA+K35>-csS0t?O zAG`o)@FIs_H5}0{dAA03o`0aY1dzKaL{j&&GP0Ig-f;qT_6i~h5fn&)YF=}MqiK2P zKn>oh0&f5cA`TQ7(W5MAXhF4)_?w*8sp!iDX-X;;rvoIS3-(n_BB^)EY3x(=c%zz? zZiAMdvf|#2bwi5Ua#1rc;&>}0TeXbDM|xdola3** z;+y@ne(G+YnGt1WgBkc=SMh9=E^>ytgjoDUi+|a@gik7Wel`WIRDDqUkO=x;H9+a2 zLFuFr`mn_Rx+j}lCbaKD!5|U5-j*?eddle>IgWJsAHNE7YV8yW)RX>*Ak06u^DT#j zCj75oZ-KVkcQ)>>$p1Rq7>vpb`;K+YaN{ffui>w;l!y`kcpL7WQ6sQ#_}8T6eKQ@U z>B3Ka+f#d*VAp@kfa^RWcc{e?mi_q|E3{UOK0=>qng3ifIXfiC! zOv`=#Juj(B+;PG!_HM{I%6_b##$y?(Fk(FQ2k=rp8_XSdV|CiY;LDwPLxbO16bUrd zcTuBB%>zG?|d7HJVT$v~M{lTVfR+Pzl zT%@;ig!>hX5VAbopjHW8&Q9=FU$P|5uqkzPG}H_(h-Gsp^?U(hp%)7iaD=9t9|EtA zFGsT+nD+y&N&BUdTO22s{e=iWa#C5akrF+(=fi84opK~Qbyu0uvZpOcg1^(!ij-=( z9I^GLdfmv;!K92QJ_cue43;VbtN zr|QnD7R=}ZA7=sZ&RD|KBnM*aIVgo8=v@=^1zQCVEVNgijdtj<+5TZ+S7^oMC|}P) zohl>e(E^`!eER^E9@~0`SIrc8o#~C_z zDEhX1&2wcTR~GWNtR7!@L)yK?RbQdz z4&7EZ%2VY$XZOg^BcE6Y{hIBn*vV~CQ-CL9*y_`Z&Rlci<0mibhoO0)&CoZ{J?)l2;4(Uc`vPTyye!pFXcX7=AMZo0>j3hd{r=f@tD> z+m_t@eP}~7fo?+4SPx&b`3{Z&nXUUYwc5od zcdr;&m&*@?m~ps#irKJ|NgRkaW|2KrD+wX(sp%KLfB2EX7OaT*U5ALva&B~$8jm=I z*MIlIYxva0#w1F=dCOao)d`|EaV^kb@^8}S)J!6lWCExI_o_biZvkynt^M7dlVyIF zSca^9$gSgAF)L6(xPUJ|rr~sJ-EhsPJ0Siu5jW>s*x9&>g`jD#O9~A}4XYtebx)$t z+I^4|3O8b$*?M2*v1Wx2M`70CdHx)`&)3N7G;XItgGIyJrf^?5`c-|QaMdlBmH10} z51{J`BK2Eomq~C~ZCfta_Nftfv6>}`O3$>P$4=0bx!e==CBW*vSWrRa?N)~bv6p=o zs!p;L?k}ux6>~dI&@slrLT-SpD%@SkVY@cTI6FZB#fk}&p_g^Sj;hsW zKxYS-Q#Usfr68dYeX#71iYgvM)oU_jo3!;AQ0iZjM>dqdH-Vj)M$*ZOHj~(k^C!^u z-*2wH0K7XE7nmA9pF05kY#3d05mF+Wfsndu!Fn^$xDNfhK%5yD2Iq!b7K(osEbDwp z(4~!Us)-(uK!Ziin+YM1?N5;HnaB$f-g;Y?eTMXS{iNNV8iniNRrY~CQKDVQm45Yo zwsMP*Q%h(3UpK`PLc^xNRe7!^F;SxTxJg4a<;d#r3k_e6(XIT&H&EA2K$VkYvRR`y zy^q2!8>5S!v_ZqCZW)y{dgRAmNi0rc)*GHQ0j0Lm_`m9}|8wgSKJi$@waYhE(3Je~onqS?!|IG9h zt(_8b%3{fdIEBc59p)gSSf^->rtt~D7g$Xhz+8jWHq8D0`j5E&OnnBF$Deq&3 z>P9o_Y8?jkkGqsN*bHqd117y7VSfc5xXzI>R_8YLVob(^Lz4-=>Fc`?@rhHI%$g%#<(7PdAcZ1`jqnS{TM*;WxO`jjoTYLDg2R!+9l`q*F1%s0wJ&(*eFqY1`dPCygGtY~xABY-h zv>VTvK=TlIk>NG68<@`SFpJ^YW?B}gb@PaW{t+SPp0PVvA7YR5MKqnPN6mundizqD zY}FC-BdzoKQW`mPBhag_4N_eo4$VPDftbA25{@;-Hciiy(H95vtX<+AaHu!-c;R^C z`C3MIhk^^UX5qN5x&`&?F#4YvNB2Xkf&`}FF_M8oNia93k$u&i`j>y|J}M|dJR4#p zMidFUMcE3SX0s{a;H6$~f08mvVuBNvLRrt`L^dPTi)OQDNj*KExeo;@l2e%`^t3=s ziT9AJklR6m9WK@yuYD&EVZUPyXbJbfxx1ExdyF}enT!?5VazZdTf-heCar8+78*t` zdCL>VlN1wv84KEt2VZjLD>$iXzINVZNJ7L-f?#Lu?9My)d} zZ2VrUzq_YSnkNmxs?+>vdLmfp9+-y+cB@hHty)gip;;cGGU=F`fGKnxE7H{kRQra^ zq+%RKL%}gB{MnCK>n97R#OimMcak6wIAQ-?fGbQ?N>P9m@;P!sWc=W2XASVeQ%;8P zIp5Q5azZaJp8Sg`X+rIHafj)p5L47^)O8tYV1xW6u?ps~V(2~Cb%B|Cj@tj#T~IHR z2&nhY^s}wOd8c5!yvRz|xNrGi)pwe+t@mMF0f zyglgIq%)npsyaBL~iYTE7a6#@-IH&B3G!is2@J&z|1 z8RwlRP?1-Ub99If6!P204PTSM;iN;YILC_4Q0ZE?5Cl>P4d85 zdqEeh+#D~Xr5FnlSd%p%P`Y4cg&9X_He!%CXV{O5Bbizk{7e9tB!|Dr8EVgSgE9fBr8EAgA^qX?aii V%5J^81-@+qA(&Vjm!Bn4{s$}lk?a5f literal 0 HcmV?d00001 diff --git a/website/static/icon/noun-cursor-740125.svg b/website/static/icon/noun-cursor-740125.svg new file mode 100644 index 0000000..c382e6e --- /dev/null +++ b/website/static/icon/noun-cursor-740125.svg @@ -0,0 +1,3 @@ + + + diff --git a/website/static/og.png b/website/static/og.png new file mode 100644 index 0000000000000000000000000000000000000000..d1815bb1b9789c38ddf46bfa145771033299fd94 GIT binary patch literal 859644 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%0Aj5pqCtE%vrG5d-O(7d=4lI|l2g&ofm1 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

>f!)H_F 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

A$Na&;Kn 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

h=syeUEo9K7aP`f!hZUAMni%p1u0yr#`FU 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 y1%{B_`NR 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 Date: Tue, 21 Jul 2026 22:30:43 -0700 Subject: [PATCH 03/11] Camera: configurable pan button (left | middle | both) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a `panButton` option to CameraControlConfig (default 'left', so existing consumers/tests/demos are unaffected) and forward it through the Svelte Camera wrapper. onCursorDown now gates the pan-start on the configured button instead of hard-coding the left button; the pan-end path already keys off pointerId, so a middle-button release ends the pan cleanly. This frees the left button for other gestures (e.g. rubber-band select) while the middle button pans — the standard node-editor model. The camera demo reads ?panButton= so the e2e suite exercises the modes without a second route; adds a test asserting middle-drag pans and left-drag does not when panButton='middle'. Co-Authored-By: Claude Opus 4.8 (1M context) --- assets/asset-base/core/src/camera.ts | 16 ++++++++++++- assets/asset-base/svelte/src/Camera.svelte | 5 ++++ .../node_ui_camera/NodeUICameraDemo.svelte | 8 ++++++- tests/e2e/snapline-camera.spec.ts | 23 +++++++++++++++++-- 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/assets/asset-base/core/src/camera.ts b/assets/asset-base/core/src/camera.ts index bb0a8cb..44a4586 100644 --- a/assets/asset-base/core/src/camera.ts +++ b/assets/asset-base/core/src/camera.ts @@ -27,6 +27,12 @@ export type CameraControlConfig = { * because browsers report it as a wheel event with ctrlKey set. */ wheelZoomModifier?: "none" | "ctrlOrMeta"; + /** + * Which mouse button starts a pointer pan. "left" (the default) preserves the + * original behavior; "middle" frees the left button for other gestures (e.g. + * rubber-band select) while the middle button pans; "both" pans on either. + */ + panButton?: "left" | "middle" | "both"; /** Options forwarded to the underlying Camera, e.g. zoomBounds and contentBounds. */ camera?: CameraConfig; }; @@ -36,6 +42,7 @@ const DEFAULT_CONFIG: CameraControlConfig = { panLock: false, pointerPanLock: false, wheelZoomModifier: "none", + panButton: "left", }; type PinchAnchor = { @@ -162,7 +169,14 @@ class CameraControl extends ElementObject { // Event Handlers onCursorDown(prop: pointerDownProp) { - if (prop.event.button != 0) { + // Left button is 0, middle button is 1. The pan button is configurable so + // consumers can reserve the left button for another gesture. + const panButton = this.config.panButton ?? "left"; + const buttonPans = + (panButton === "left" || panButton === "both") && prop.event.button === 0 + ? true + : (panButton === "middle" || panButton === "both") && prop.event.button === 1; + if (!buttonPans) { return; } if (this.#state !== "idle") { diff --git a/assets/asset-base/svelte/src/Camera.svelte b/assets/asset-base/svelte/src/Camera.svelte index 72aace0..1f25db4 100644 --- a/assets/asset-base/svelte/src/Camera.svelte +++ b/assets/asset-base/svelte/src/Camera.svelte @@ -20,6 +20,8 @@ pointerPanLock?: boolean | "touch"; /** Require ctrl/cmd for wheel zoom so unmodified scrolling pans the page. */ wheelZoomModifier?: "none" | "ctrlOrMeta"; + /** Which mouse button starts a pointer pan (default "left"). */ + panButton?: "left" | "middle" | "both"; /** Options forwarded to the underlying Camera, e.g. zoomBounds and contentBounds. */ cameraConfig?: CameraConfig; cameraControl?: CameraControlObject | null; @@ -34,6 +36,7 @@ panLock = false, pointerPanLock = false, wheelZoomModifier = "none", + panButton = "left", cameraConfig, cameraControl = $bindable(null), style = "", @@ -51,6 +54,7 @@ zoomLock, pointerPanLock, wheelZoomModifier, + panButton, camera: cameraConfig, })); const cameraControlInstance = @@ -74,6 +78,7 @@ zoomLock, pointerPanLock, wheelZoomModifier, + panButton, }; }); diff --git a/demo/svelte/src/demo/node_ui_camera/NodeUICameraDemo.svelte b/demo/svelte/src/demo/node_ui_camera/NodeUICameraDemo.svelte index dc003e0..eec481d 100644 --- a/demo/svelte/src/demo/node_ui_camera/NodeUICameraDemo.svelte +++ b/demo/svelte/src/demo/node_ui_camera/NodeUICameraDemo.svelte @@ -1,6 +1,12 @@ - +

diff --git a/tests/e2e/snapline-camera.spec.ts b/tests/e2e/snapline-camera.spec.ts index e2bc6b2..25d4ce6 100644 --- a/tests/e2e/snapline-camera.spec.ts +++ b/tests/e2e/snapline-camera.spec.ts @@ -22,11 +22,12 @@ async function dragFromTo( page: Page, from: { x: number; y: number }, to: { x: number; y: number }, + button: "left" | "middle" = "left", ) { await page.mouse.move(from.x, from.y); - await page.mouse.down(); + await page.mouse.down({ button }); await page.mouse.move(to.x, to.y, { steps: 12 }); - await page.mouse.up(); + await page.mouse.up({ button }); } test.beforeEach(async ({ page }) => { @@ -77,6 +78,24 @@ test("dragging a connector line does not pan the camera", async ({ page }) => { await expect(page.locator("[data-snapline-type='connector-line']")).toHaveCount(0); }); +test("panButton='middle': middle-drag pans, left-drag does not", async ({ page }) => { + await page.goto("/snapline-camera?panButton=middle"); + await expect(page.locator("[data-snapline-type='node']")).toHaveCount(3); + const nodeA = page.locator("[data-snapline-type='node']", { hasText: "Node A" }); + + // Left-drag the background: with panButton='middle' this must NOT pan. + const beforeLeft = await cameraTransform(page); + await dragFromTo(page, { x: 900, y: 620 }, { x: 700, y: 470 }, "left"); + expect(await cameraTransform(page)).toBe(beforeLeft); + + // Middle-drag the background: this pans. + const before = await nodeA.boundingBox(); + await dragFromTo(page, { x: 900, y: 620 }, { x: 700, y: 470 }, "middle"); + const after = await nodeA.boundingBox(); + expect(after!.x - before!.x).toBeLessThan(-150); + expect(after!.y - before!.y).toBeLessThan(-100); +}); + test("connecting after pan and zoom still lands on the target connector", async ({ page }) => { await dragFromTo(page, { x: 900, y: 620 }, { x: 780, y: 540 }); await page.mouse.move(640, 450); From e0e0b9786f468dfbbaec7fe5c578cc8b58d2ebc1 Mon Sep 17 00:00:00 2001 From: tfukaza Date: Wed, 22 Jul 2026 23:42:21 -0700 Subject: [PATCH 04/11] engine: transform-write cascade, point-in-collider query, resize routing, owned suspension - writeTransformRecursive: write twin of readDomRecursive (synchronous polymorphic recursion over transformChildren; prunes transformMode:none and non-element children). Descendant world values are already correct via the epoch cache - the cascade only flushes DOM. - Collider.containsWorldPoint: synchronous world-space point test on the cached bounds, independent of the frame-delayed collision sweep. - input: #resolveResizeOwner - a pointerdown inside a registered resize hitbox resolves the gesture owner to the hitbox's parent object, with precedence over DOM routing (covers grabs beyond the element's edge). - GlobalManager.suspend/resume/isSuspended: owned suspension channels (token per suspender) replacing last-writer-wins shared booleans. Co-Authored-By: Claude Fable 5 --- src/collision.ts | 21 +++++++++ src/global.ts | 30 +++++++++++++ src/input.ts | 31 ++++++++++++- src/object.ts | 26 +++++++++++ tests/ut/transform.spec.ts | 92 +++++++++++++++++++++++++++++++++++++- 5 files changed, 198 insertions(+), 2 deletions(-) diff --git a/src/collision.ts b/src/collision.ts index 579c870..274c61e 100644 --- a/src/collision.ts +++ b/src/collision.ts @@ -290,6 +290,27 @@ class Collider extends CoreObject { return currentCollisionsFor(this).size; } + /** + * Synchronous world-space point test against this collider's cached bounds. + * Unlike currentCollisions/isCollidingWith it does NOT depend on the per-frame + * collision sweep, so it is safe to call at pointerdown for a hitbox that was + * just moved (e.g. a resize handle following its node). + */ + containsWorldPoint(x: number, y: number): boolean { + const bounds = this.getWorldBoundsSnapshot(); + if (this.type === "circle") { + const dx = x - bounds.x; + const dy = y - bounds.y; + return Math.sqrt(dx * dx + dy * dy) <= bounds.radius; + } + return ( + x >= bounds.left && + x <= bounds.right && + y >= bounds.top && + y <= bounds.bottom + ); + } + destroy() { this.engine.collisionEngine?.removeObject(this.id); this.detachTransformParent(false); diff --git a/src/global.ts b/src/global.ts index 9c406d9..1c92c92 100644 --- a/src/global.ts +++ b/src/global.ts @@ -30,6 +30,7 @@ class GlobalManager { #engineObjectTables: Map>; #data: any; #id: number; + #suspenders: Map>; currentStage: | "IDLE" @@ -45,6 +46,7 @@ class GlobalManager { this.#engineObjectTables = new Map(); this.#data = {}; this.#id = 0; + this.#suspenders = new Map(); this.currentStage = "IDLE"; this.queue = { READ_1: new Map(), @@ -231,6 +233,34 @@ class GlobalManager { return this.#data; } + /** + * Owned suspension channels. Unlike a shared boolean on `data` (last writer + * wins — an unrelated gesture ending could re-enable a channel another + * gesture still holds suspended), each suspender registers a token and the + * channel stays suspended until every token resumes. Tokens are idempotent: + * suspending twice with the same token holds one slot, and resuming a token + * that never suspended is a no-op — so dual release paths are safe. + */ + suspend(channel: string, token: string): void { + let tokens = this.#suspenders.get(channel); + if (!tokens) { + tokens = new Set(); + this.#suspenders.set(channel, tokens); + } + tokens.add(token); + } + + resume(channel: string, token: string): void { + const tokens = this.#suspenders.get(channel); + if (!tokens) return; + tokens.delete(token); + if (tokens.size === 0) this.#suspenders.delete(channel); + } + + isSuspended(channel: string): boolean { + return (this.#suspenders.get(channel)?.size ?? 0) > 0; + } + getEngineObjectTable(engine: Engine): Record { const table = this.#engineObjectTables.get(engine); if (!table) { diff --git a/src/input.ts b/src/input.ts index dacefe4..18809d8 100644 --- a/src/input.ts +++ b/src/input.ts @@ -485,8 +485,12 @@ class InputControl { return; } - const owner = object ?? this.#getTargetOwner(event); const position = this.#getCoordinates(event.clientX, event.clientY); + // A resize-hitbox hit supersedes the DOM owner under it, and covers the case + // where the pointer is inside the (virtual) hitbox but outside the node's DOM + // box (so DOM routing would miss it). Explicit `object` still wins. + const owner = + object ?? this.#resolveResizeOwner(position) ?? this.#getTargetOwner(event); const isWithinEngine = this.#isCoordinateWithinEngine( event.clientX, event.clientY, @@ -890,6 +894,31 @@ class InputControl { } } + // Colliders never appear in composedPath, so a registered resize hitbox is + // resolved geometrically: if the pointerdown is inside one, the owner is the + // hitbox's object (collider.parent), so the whole gesture flows to it through + // the normal owner dispatch. Synchronous point test — independent of the + // frame-delayed collision sweep. The registry shape is declared in + // snapline's snapline-globals.ts (engine core cannot import snapline, hence + // the structural type here) — keep the two in sync. + #resolveResizeOwner(position: eventPosition): ElementObject | null { + const handles = this.global?.data?.resizeHandles as + | Array<{ + engine: unknown; + parent: unknown; + containsWorldPoint(x: number, y: number): boolean; + }> + | undefined; + if (!handles) return null; + for (const collider of handles) { + if (collider.engine !== this.#engine) continue; + if (collider.containsWorldPoint(position.x, position.y)) { + return collider.parent as ElementObject; + } + } + return null; + } + #getTargetOwner(event: Event): ElementObject | null { for (const target of this.#getEventPath(event)) { if (!(target instanceof HTMLElement)) { diff --git a/src/object.ts b/src/object.ts index ef4bcc7..1c3f7ee 100755 --- a/src/object.ts +++ b/src/object.ts @@ -1296,6 +1296,32 @@ export class ElementObject extends BaseObject { super.writeTransform(); } + // Write twin of readDomRecursive: cascades a transform WRITE down the graph the + // same way readDomRecursive cascades a DOM READ. Synchronous polymorphic + // recursion, no scheduling of its own — the caller schedules one WRITE-stage + // callback that invokes this, exactly as a READ callback invokes + // readDomRecursive. It walks transformChildren (world transforms compose along + // the transform graph) where the read walks public children (DOM layout nests + // publicly). No reparenting or position mutation: each descendant's world value + // is already current via the epoch cache, so writeTransform just paints it. + writeTransformRecursive() { + const stage = this.global.currentStage as FrameWriteStages; + if (!["WRITE_1", "WRITE_2", "WRITE_3"].includes(stage)) { + throw new Error(`Invalid stage: ${stage}`); + } + + this.writeTransform(); + + for (const child of this.transformChildren) { + // Skip transformMode "none" (connectors follow their node for free, and + // this prunes their line subtree so world-space lines keep their own glue) + // and non-ElementObject children (e.g. RectCollider hit boxes). + if (child instanceof ElementObject && child.transformMode !== "none") { + child.writeTransformRecursive(); + } + } + } + destroyDom(removeElement: boolean = true) { this.#resizeObserver?.disconnect(); this.#mutationObserver?.disconnect(); diff --git a/tests/ut/transform.spec.ts b/tests/ut/transform.spec.ts index b595447..826f627 100644 --- a/tests/ut/transform.spec.ts +++ b/tests/ut/transform.spec.ts @@ -1,5 +1,5 @@ import { expect, test } from "@playwright/test"; -import { BaseObject, CoreObject } from "../../src/object"; +import { BaseObject, CoreObject, ElementObject } from "../../src/object"; import { CircleCollider, CollisionEngine, @@ -344,3 +344,93 @@ test.describe("Collider transforms", () => { expect(collider.worldBottom).toBe(320); }); }); + +// Spies writeTransform so the cascade can be tested without a real DOM element +// (writeTransform throws when #element is unset). +class WriteSpyObject extends ElementObject { + writeCount = 0; + writeTransform() { + this.writeCount++; + } +} + +test.describe("ElementObject writeTransformRecursive", () => { + test("cascades the write to direct-mode children, skipping none-mode and colliders", () => { + const engine = createEngine(); + const parent = new WriteSpyObject(engine); + const directChild = new WriteSpyObject(engine); + const noneChild = new WriteSpyObject(engine); + parent.appendChild(directChild); + parent.appendChild(noneChild); + noneChild.transformMode = "none"; + const collider = new RectCollider(engine, parent, 0, 0, 10, 10); + parent.addCollider(collider); + + expect(parent.transformChildren).toContain(directChild); + expect(parent.transformChildren).toContain(noneChild); + expect(parent.transformChildren).toContain(collider); + + engine.global.currentStage = "WRITE_2"; + parent.writeTransformRecursive(); + + expect(parent.writeCount).toBe(1); + expect(directChild.writeCount).toBe(1); + expect(noneChild.writeCount).toBe(0); // none-mode pruned (with its subtree) + }); + + test("recurses through nested direct-mode children", () => { + const engine = createEngine(); + const parent = new WriteSpyObject(engine); + const child = new WriteSpyObject(engine); + const grandchild = new WriteSpyObject(engine); + parent.appendChild(child); + child.appendChild(grandchild); + + engine.global.currentStage = "WRITE_2"; + parent.writeTransformRecursive(); + + expect(parent.writeCount).toBe(1); + expect(child.writeCount).toBe(1); + expect(grandchild.writeCount).toBe(1); + }); + + test("throws when invoked outside a write stage", () => { + const engine = createEngine(); + const parent = new WriteSpyObject(engine); + engine.global.currentStage = "READ_1"; + expect(() => parent.writeTransformRecursive()).toThrow(/Invalid stage/); + }); +}); + +test.describe("Collider.containsWorldPoint", () => { + test("circle: tests distance to the world center, and follows its parent", () => { + const engine = createEngine(); + const parent = new BaseObject(engine); + parent.worldTransform = { x: 100, y: 200 }; + const circle = new CircleCollider(engine, parent, 0, 0, 15); + parent.addCollider(circle); + + expect(circle.containsWorldPoint(100, 200)).toBe(true); // center + expect(circle.containsWorldPoint(110, 200)).toBe(true); // dist 10 <= 15 + expect(circle.containsWorldPoint(120, 200)).toBe(false); // dist 20 > 15 + + // No collision sweep has run; moving the parent still updates the test + // synchronously (epoch-invalidated bounds). + parent.worldTransform = { x: 300, y: 300 }; + expect(circle.containsWorldPoint(300, 300)).toBe(true); + expect(circle.containsWorldPoint(100, 200)).toBe(false); + }); + + test("rect: tests the world bounds box", () => { + const engine = createEngine(); + const parent = new BaseObject(engine); + parent.worldTransform = { x: 100, y: 200 }; + const rect = new RectCollider(engine, parent, 10, 20, 30, 40); + parent.addCollider(rect); + // World box: left 110, top 220, right 140, bottom 260. + expect(rect.containsWorldPoint(120, 240)).toBe(true); + expect(rect.containsWorldPoint(110, 220)).toBe(true); // corner inclusive + expect(rect.containsWorldPoint(200, 240)).toBe(false); + expect(rect.containsWorldPoint(120, 300)).toBe(false); + }); +}); From fbfa3b35f1644e78fad3a9547304e4f6078873f2 Mon Sep 17 00:00:00 2001 From: tfukaza Date: Wed, 22 Jul 2026 23:42:29 -0700 Subject: [PATCH 05/11] camera: wheel pan, sensitivities, grouped wheel/pointer config, suspension reads - wheelPan + wheelPanSensitivity: unmodified wheel (trackpad two-finger scroll) pans; ctrl/cmd wheel and pinch still zoom. Pan and zoom speeds tune independently. - zoomSensitivity + pinch gain; zoom direction fixed so pinch-out / scroll-up zooms in. - panButton: left|middle|both for pointer pans. - Grouped config (wheel: {action, zoomModifier, zoomSensitivity, panSensitivity, pinchZoomGain}, pointer: {panButton, panLock}) resolved at read time via resolveCameraOptions; flat keys remain as deprecated aliases. React Camera gains the previously svelte-only options. - Camera readers honor global.isSuspended(cameraControl) alongside the legacy allowCameraControl boolean. Co-Authored-By: Claude Fable 5 --- assets/asset-base/core/src/camera.ts | 192 +++++++++++++++--- assets/asset-base/core/src/index.ts | 9 +- assets/asset-base/react/src/Camera.tsx | 48 ++++- assets/asset-base/svelte/src/Camera.svelte | 26 +++ .../node_ui_camera/NodeUICameraDemo.svelte | 8 +- tests/e2e/snapline-camera.spec.ts | 53 ++++- 6 files changed, 302 insertions(+), 34 deletions(-) diff --git a/assets/asset-base/core/src/camera.ts b/assets/asset-base/core/src/camera.ts index 44a4586..751a9ae 100644 --- a/assets/asset-base/core/src/camera.ts +++ b/assets/asset-base/core/src/camera.ts @@ -9,30 +9,67 @@ import { ElementObject } from "@snap-engine/core"; import { Camera } from "@snap-engine/core"; import type { CameraConfig } from "@snap-engine/core"; -export type CameraControlConfig = { - zoomLock?: boolean; - panLock?: boolean; +/** What the mouse wheel / trackpad two-finger scroll does. */ +export type CameraWheelConfig = { /** - * Disables panning with a single pointer while leaving two-finger pinch panning - * intact. Use when the camera sits inside a scrollable page and a one-finger drag - * should scroll the page instead of moving the camera. - * - * Pass "touch" to restrict the lock to touch pointers, so a mouse drag still pans — - * on desktop a drag never scrolls the page, so it costs nothing to keep. + * What an unmodified wheel event does. "zoom" (default) zooms; "pan" is the + * trackpad "map" convention — two-finger scroll pans while a ctrl/cmd wheel + * (and trackpad pinch, which browsers report as a ctrl-wheel) still zooms. */ - pointerPanLock?: boolean | "touch"; + action?: "zoom" | "pan"; /** - * Requires a modifier key for wheel zoom. With "ctrlOrMeta", an unmodified wheel - * event is left alone so the page scrolls normally; trackpad pinch still zooms, - * because browsers report it as a wheel event with ctrlKey set. + * Requires a modifier key for wheel zoom. With "ctrlOrMeta", an unmodified + * wheel event is left alone so the page scrolls normally; trackpad pinch + * still zooms, because browsers report it as a wheel event with ctrlKey set. */ - wheelZoomModifier?: "none" | "ctrlOrMeta"; + zoomModifier?: "none" | "ctrlOrMeta"; + /** Multiplies wheel-zoom speed (default 1). */ + zoomSensitivity?: number; + /** Multiplies wheel-pan speed (default 1 = 1:1 screen pixels). */ + panSensitivity?: number; + /** + * Extra gain applied to trackpad pinch zoom (default 10). Chrome/Safari + * deliver a pinch as a ctrl-wheel whose deltaY is roughly an order of + * magnitude smaller than a mouse scroll notch; this brings it up to a + * comparable rate so pinch doesn't feel dead. + */ + pinchZoomGain?: number; +}; + +/** What pointer (mouse/touch drag) input does. */ +export type CameraPointerConfig = { /** * Which mouse button starts a pointer pan. "left" (the default) preserves the * original behavior; "middle" frees the left button for other gestures (e.g. * rubber-band select) while the middle button pans; "both" pans on either. */ panButton?: "left" | "middle" | "both"; + /** + * Disables panning with a single pointer while leaving two-finger pinch + * panning intact. Pass "touch" to restrict the lock to touch pointers. + */ + panLock?: boolean | "touch"; +}; + +export type CameraControlConfig = { + zoomLock?: boolean; + panLock?: boolean; + /** Wheel/trackpad behavior, grouped. Wins over the flat deprecated aliases. */ + wheel?: CameraWheelConfig; + /** Pointer behavior, grouped. Wins over the flat deprecated aliases. */ + pointer?: CameraPointerConfig; + /** @deprecated Use `pointer.panLock` instead. */ + pointerPanLock?: boolean | "touch"; + /** @deprecated Use `wheel.zoomModifier` instead. */ + wheelZoomModifier?: "none" | "ctrlOrMeta"; + /** @deprecated Use `wheel.action: "pan"` instead. */ + wheelPan?: boolean; + /** @deprecated Use `wheel.zoomSensitivity` instead. */ + zoomSensitivity?: number; + /** @deprecated Use `wheel.panSensitivity` instead. */ + wheelPanSensitivity?: number; + /** @deprecated Use `pointer.panButton` instead. */ + panButton?: "left" | "middle" | "both"; /** Options forwarded to the underlying Camera, e.g. zoomBounds and contentBounds. */ camera?: CameraConfig; }; @@ -42,9 +79,45 @@ const DEFAULT_CONFIG: CameraControlConfig = { panLock: false, pointerPanLock: false, wheelZoomModifier: "none", + wheelPan: false, panButton: "left", + zoomSensitivity: 1, + wheelPanSensitivity: 1, }; +export interface ResolvedCameraOptions { + wheelAction: "zoom" | "pan"; + wheelZoomModifier: "none" | "ctrlOrMeta"; + zoomSensitivity: number; + wheelPanSensitivity: number; + pinchZoomGain: number; + panButton: "left" | "middle" | "both"; + pointerPanLock: boolean | "touch"; +} + +/** + * Resolves the effective camera options at READ time: a grouped key, when + * defined, wins over its flat deprecated alias; an undefined grouped key falls + * back to the flat key, then to the default. Resolution happens per-read (not + * at construction) because `config` is a public field that adapters reassign + * wholesale when props change. + */ +export function resolveCameraOptions( + config: CameraControlConfig, +): ResolvedCameraOptions { + return { + wheelAction: config.wheel?.action ?? (config.wheelPan ? "pan" : "zoom"), + wheelZoomModifier: + config.wheel?.zoomModifier ?? config.wheelZoomModifier ?? "none", + zoomSensitivity: config.wheel?.zoomSensitivity ?? config.zoomSensitivity ?? 1, + wheelPanSensitivity: + config.wheel?.panSensitivity ?? config.wheelPanSensitivity ?? 1, + pinchZoomGain: config.wheel?.pinchZoomGain ?? 10, + panButton: config.pointer?.panButton ?? config.panButton ?? "left", + pointerPanLock: config.pointer?.panLock ?? config.pointerPanLock ?? false, + }; +} + type PinchAnchor = { centerX: number; centerY: number; @@ -169,9 +242,10 @@ class CameraControl extends ElementObject { // Event Handlers onCursorDown(prop: pointerDownProp) { + const options = resolveCameraOptions(this.config); // Left button is 0, middle button is 1. The pan button is configurable so // consumers can reserve the left button for another gesture. - const panButton = this.config.panButton ?? "left"; + const panButton = options.panButton; const buttonPans = (panButton === "left" || panButton === "both") && prop.event.button === 0 ? true @@ -185,14 +259,18 @@ class CameraControl extends ElementObject { if (this.config.panLock) { return; } - const pointerPanLock = this.config.pointerPanLock; + const pointerPanLock = options.pointerPanLock; if ( pointerPanLock === true || (pointerPanLock === "touch" && prop.event.pointerType === "touch") ) { return; } - if (this.global.data.allowCameraControl === false) { + if ( + this.global.isSuspended("cameraControl") || + // Legacy channel: third parties may still write the shared boolean. + this.global.data.allowCameraControl === false + ) { return; } if (prop.isWithinEngine === false) { @@ -214,7 +292,11 @@ class CameraControl extends ElementObject { if (prop.event?.pointerId !== this.#panPointerId) { return; } - if (this.global.data.allowCameraControl === false) { + if ( + this.global.isSuspended("cameraControl") || + // Legacy channel: third parties may still write the shared boolean. + this.global.data.allowCameraControl === false + ) { return; } const dx = prop.position.screenX - this.#mouseDownX; @@ -245,15 +327,21 @@ class CameraControl extends ElementObject { } onZoom(prop: mouseWheelProp) { + const options = resolveCameraOptions(this.config); + const event = prop.event as WheelEvent; + const zoomIntent = event.ctrlKey || event.metaKey; + // Trackpad two-finger scroll pans; a modifier (and trackpad pinch, reported as + // a ctrl-wheel) falls through to zoom. + if (options.wheelAction === "pan" && !zoomIntent) { + this.panByWheel(prop, options.wheelPanSensitivity); + return; + } if (this.config.zoomLock) { return; } - if (this.config.wheelZoomModifier === "ctrlOrMeta") { - const event = prop.event as WheelEvent; - if (!event.ctrlKey && !event.metaKey) { - // Return without preventDefault so the page keeps scrolling. - return; - } + if (options.wheelZoomModifier === "ctrlOrMeta" && !zoomIntent) { + // Return without preventDefault so the page keeps scrolling. + return; } const camera = this.engine.camera!; if ( @@ -264,19 +352,65 @@ class CameraControl extends ElementObject { ) { return; } + // A trackpad pinch is a ctrl-wheel; Cmd+scroll is a meta-wheel with much larger + // deltas, so only the pinch gets the extra gain. Negate so pinch-out / scroll-up + // zooms in — the natural direction on every platform. + const pinch = event.ctrlKey && !event.metaKey; + const sensitivity = + options.zoomSensitivity * (pinch ? options.pinchZoomGain : 1); this.zoomBy( - prop.delta / 2000, + (-prop.delta * sensitivity) / 2000, prop.position.cameraX, prop.position.cameraY, ); prop.event.preventDefault(); } + private panByWheel(prop: mouseWheelProp, sensitivity: number) { + if (this.config.panLock) { + return; + } + if ( + this.global.isSuspended("cameraControl") || + // Legacy channel: third parties may still write the shared boolean. + this.global.data.allowCameraControl === false + ) { + return; + } + const camera = this.engine.camera; + if (!camera) { + return; + } + if ( + prop.position.screenX < camera.containerOffsetX || + prop.position.screenX > camera.containerOffsetX + camera.cameraWidth || + prop.position.screenY < camera.containerOffsetY || + prop.position.screenY > camera.containerOffsetY + camera.cameraHeight + ) { + return; + } + // Wheel deltas are screen pixels in the document-scroll sense (deltaY > 0 = + // scroll down); handlePan reads them the same way (positive = pan down) and + // divides by zoom, giving 1:1 screen-pixel panning like a pointer drag. + const event = prop.event as WheelEvent; + camera.handlePan(event.deltaX * sensitivity, event.deltaY * sensitivity); + this.style.transform = camera.canvasStyle as string; + this.schedule(() => this.writeTransform(), { + stage: "WRITE_2", + queueId: `${this.id}-transform`, + }); + prop.event.preventDefault(); + } + onPinchStart() { if (this.config.zoomLock && this.config.panLock) { return; } - if (this.global.data.allowCameraControl === false) { + if ( + this.global.isSuspended("cameraControl") || + // Legacy channel: third parties may still write the shared boolean. + this.global.data.allowCameraControl === false + ) { return; } this.#state = "pinching"; @@ -289,7 +423,11 @@ class CameraControl extends ElementObject { if (this.config.zoomLock && this.config.panLock) { return; } - if (this.global.data.allowCameraControl === false) { + if ( + this.global.isSuspended("cameraControl") || + // Legacy channel: third parties may still write the shared boolean. + this.global.data.allowCameraControl === false + ) { return; } const [pointer0, pointer1] = prop.current.pointerList; diff --git a/assets/asset-base/core/src/index.ts b/assets/asset-base/core/src/index.ts index 24147b4..c7588f9 100644 --- a/assets/asset-base/core/src/index.ts +++ b/assets/asset-base/core/src/index.ts @@ -1,3 +1,8 @@ -export { CameraControl } from "./camera"; -export type { CameraControlConfig } from "./camera"; +export { CameraControl, resolveCameraOptions } from "./camera"; +export type { + CameraControlConfig, + CameraWheelConfig, + CameraPointerConfig, + ResolvedCameraOptions, +} from "./camera"; export { Background } from "./background"; diff --git a/assets/asset-base/react/src/Camera.tsx b/assets/asset-base/react/src/Camera.tsx index 3a33d79..f00a1d3 100644 --- a/assets/asset-base/react/src/Camera.tsx +++ b/assets/asset-base/react/src/Camera.tsx @@ -11,6 +11,10 @@ import { type ReactNode, } from "react"; import { CameraControl } from "@snap-engine/asset-base"; +import type { + CameraWheelConfig, + CameraPointerConfig, +} from "@snap-engine/asset-base"; import type { CameraConfig } from "@snap-engine/core"; import { useSnapEngine } from "./Engine"; @@ -40,6 +44,18 @@ export interface CameraProps pointerPanLock?: boolean | "touch"; /** Require ctrl/cmd for wheel zoom so unmodified scrolling pans the page. */ wheelZoomModifier?: "none" | "ctrlOrMeta"; + /** Pan on unmodified wheel (trackpad two-finger scroll); ctrl/cmd wheel zooms. */ + wheelPan?: boolean; + /** Multiplies wheel-zoom speed (default 1); trackpad pinch is scaled up further. */ + zoomSensitivity?: number; + /** Multiplies wheel-pan speed (default 1 = 1:1 screen pixels), independent of zoom. */ + wheelPanSensitivity?: number; + /** Which mouse button starts a pointer pan (default "left"). */ + panButton?: "left" | "middle" | "both"; + /** Wheel/trackpad behavior, grouped. Wins over the flat deprecated props. */ + wheel?: CameraWheelConfig; + /** Pointer behavior, grouped. Wins over the flat deprecated props. */ + pointer?: CameraPointerConfig; zoomLock?: boolean; } @@ -65,6 +81,12 @@ export const Camera = forwardRef(function Camera( panLock = false, pointerPanLock = false, wheelZoomModifier = "none", + wheelPan = false, + zoomSensitivity = 1, + wheelPanSensitivity = 1, + panButton = "left", + wheel = undefined, + pointer = undefined, style, zoomLock = false, ...divProps @@ -95,6 +117,12 @@ export const Camera = forwardRef(function Camera( zoomLock, pointerPanLock, wheelZoomModifier, + wheelPan, + zoomSensitivity, + wheelPanSensitivity, + panButton, + wheel, + pointer, camera: cameraConfig, }); ownedCameraControlRef.current = cameraControl; @@ -160,8 +188,26 @@ export const Camera = forwardRef(function Camera( zoomLock, pointerPanLock, wheelZoomModifier, + wheelPan, + zoomSensitivity, + wheelPanSensitivity, + panButton, + wheel, + pointer, }; - }, [activeCameraControl, panLock, zoomLock, pointerPanLock, wheelZoomModifier]); + }, [ + activeCameraControl, + panLock, + zoomLock, + pointerPanLock, + wheelZoomModifier, + wheelPan, + zoomSensitivity, + wheelPanSensitivity, + panButton, + wheel, + pointer, + ]); // Bounds often depend on measured layout, so keep applying them as they change. useEffect(() => { diff --git a/assets/asset-base/svelte/src/Camera.svelte b/assets/asset-base/svelte/src/Camera.svelte index 1f25db4..1d0c854 100644 --- a/assets/asset-base/svelte/src/Camera.svelte +++ b/assets/asset-base/svelte/src/Camera.svelte @@ -9,6 +9,7 @@ } from "svelte"; import type { HTMLAttributes } from "svelte/elements"; import { CameraControl as CameraControlObject } from "@snap-engine/asset-base"; + import type { CameraWheelConfig, CameraPointerConfig } from "@snap-engine/asset-base"; import type { CameraConfig, Engine } from "@snap-engine/core"; type CameraProps = Omit, "children"> & { @@ -20,8 +21,18 @@ pointerPanLock?: boolean | "touch"; /** Require ctrl/cmd for wheel zoom so unmodified scrolling pans the page. */ wheelZoomModifier?: "none" | "ctrlOrMeta"; + /** Pan on unmodified wheel (trackpad two-finger scroll); ctrl/cmd wheel zooms. */ + wheelPan?: boolean; + /** Multiplies wheel-zoom speed (default 1); trackpad pinch is scaled up further. */ + zoomSensitivity?: number; + /** Multiplies wheel-pan speed (default 1 = 1:1 screen pixels), independent of zoom. */ + wheelPanSensitivity?: number; /** Which mouse button starts a pointer pan (default "left"). */ panButton?: "left" | "middle" | "both"; + /** Wheel/trackpad behavior, grouped. Wins over the flat deprecated props. */ + wheel?: CameraWheelConfig; + /** Pointer behavior, grouped. Wins over the flat deprecated props. */ + pointer?: CameraPointerConfig; /** Options forwarded to the underlying Camera, e.g. zoomBounds and contentBounds. */ cameraConfig?: CameraConfig; cameraControl?: CameraControlObject | null; @@ -36,7 +47,12 @@ panLock = false, pointerPanLock = false, wheelZoomModifier = "none", + wheelPan = false, + zoomSensitivity = 1, + wheelPanSensitivity = 1, panButton = "left", + wheel = undefined, + pointer = undefined, cameraConfig, cameraControl = $bindable(null), style = "", @@ -54,7 +70,12 @@ zoomLock, pointerPanLock, wheelZoomModifier, + wheelPan, + zoomSensitivity, + wheelPanSensitivity, panButton, + wheel, + pointer, camera: cameraConfig, })); const cameraControlInstance = @@ -78,7 +99,12 @@ zoomLock, pointerPanLock, wheelZoomModifier, + wheelPan, + zoomSensitivity, + wheelPanSensitivity, panButton, + wheel, + pointer, }; }); diff --git a/demo/svelte/src/demo/node_ui_camera/NodeUICameraDemo.svelte b/demo/svelte/src/demo/node_ui_camera/NodeUICameraDemo.svelte index eec481d..92b4d27 100644 --- a/demo/svelte/src/demo/node_ui_camera/NodeUICameraDemo.svelte +++ b/demo/svelte/src/demo/node_ui_camera/NodeUICameraDemo.svelte @@ -4,9 +4,13 @@ // The pan button is configurable via ?panButton= so the e2e suite can // exercise left / middle / both without a second route. - const raw = new URLSearchParams(globalThis.location?.search ?? "").get("panButton"); + const params = new URLSearchParams(globalThis.location?.search ?? ""); + const raw = params.get("panButton"); const panButton: "left" | "middle" | "both" = raw === "middle" || raw === "both" ? raw : "left"; + // ?wheelPan=1 makes an unmodified wheel pan (trackpad two-finger scroll) while + // ctrl/cmd wheel keeps zooming. + const wheelPan = params.get("wheelPan") === "1"; - +
diff --git a/tests/e2e/snapline-camera.spec.ts b/tests/e2e/snapline-camera.spec.ts index 25d4ce6..36a4bae 100644 --- a/tests/e2e/snapline-camera.spec.ts +++ b/tests/e2e/snapline-camera.spec.ts @@ -9,6 +9,12 @@ async function cameraTransform(page: Page): Promise { return page.locator(CAMERA).evaluate((el) => getComputedStyle(el).transform); } +// scaleX is the first number of the computed matrix(...) (1 when untransformed). +async function cameraScale(page: Page): Promise { + const nums = (await cameraTransform(page)).match(/-?\d*\.?\d+/g); + return nums ? Number.parseFloat(nums[0]) : 1; +} + async function centerOf(locator: Locator) { const box = await locator.boundingBox(); expect(box).not.toBeNull(); @@ -47,8 +53,9 @@ test("background drag pans the camera", async ({ page }) => { test("ctrl+wheel zooms the camera", async ({ page }) => { const before = await cameraTransform(page); await page.mouse.move(640, 450); + // The camera starts at its max zoom (1), so scroll down / pinch-in zooms out. await page.keyboard.down("Control"); - await page.mouse.wheel(0, -240); + await page.mouse.wheel(0, 240); await page.keyboard.up("Control"); await expect.poll(() => cameraTransform(page)).not.toBe(before); }); @@ -96,11 +103,53 @@ test("panButton='middle': middle-drag pans, left-drag does not", async ({ page } expect(after!.y - before!.y).toBeLessThan(-100); }); +test("wheelPan: unmodified wheel pans, ctrl+wheel still zooms", async ({ page }) => { + await page.goto("/snapline-camera?wheelPan=1"); + await expect(page.locator("[data-snapline-type='node']")).toHaveCount(3); + const nodeA = page.locator("[data-snapline-type='node']", { hasText: "Node A" }); + + // Two-finger scroll (an unmodified wheel with deltaX/deltaY) pans the camera: + // a downward + rightward scroll pans the view down/right, so nodes shift up/left. + const before = await nodeA.boundingBox(); + await page.mouse.move(640, 450); + await page.mouse.wheel(160, 200); + await expect + .poll(async () => (await nodeA.boundingBox())!.y - before!.y) + .toBeLessThan(-80); + const after = await nodeA.boundingBox(); + expect(after!.x - before!.x).toBeLessThan(-60); + + // A ctrl+wheel over the same surface still zooms rather than panning (scroll + // down zooms out from the starting max zoom). + const beforeZoom = await cameraTransform(page); + await page.keyboard.down("Control"); + await page.mouse.wheel(0, 240); + await page.keyboard.up("Control"); + await expect.poll(() => cameraTransform(page)).not.toBe(beforeZoom); +}); + +test("ctrl+wheel direction: scroll down / pinch in zooms out, scroll up / pinch out zooms in", async ({ page }) => { + await page.mouse.move(640, 450); + // Starts at max zoom (1), so first zoom out (scroll down / pinch in): scale drops. + const base = await cameraScale(page); + await page.keyboard.down("Control"); + await page.mouse.wheel(0, 40); + await page.keyboard.up("Control"); + await expect.poll(() => cameraScale(page)).toBeLessThan(base); + + // Now scroll up / pinch out zooms back in: scale rises — the natural direction. + const zoomedOut = await cameraScale(page); + await page.keyboard.down("Control"); + await page.mouse.wheel(0, -40); + await page.keyboard.up("Control"); + await expect.poll(() => cameraScale(page)).toBeGreaterThan(zoomedOut); +}); + test("connecting after pan and zoom still lands on the target connector", async ({ page }) => { await dragFromTo(page, { x: 900, y: 620 }, { x: 780, y: 540 }); await page.mouse.move(640, 450); await page.keyboard.down("Control"); - await page.mouse.wheel(0, -120); + await page.mouse.wheel(0, 120); await page.keyboard.up("Control"); const nodeA = page.locator("[data-snapline-type='node']", { hasText: "Node A" }); From c42bc5c1395365d012427d8b80fafd5513d4df81 Mon Sep 17 00:00:00 2001 From: tfukaza Date: Wed, 22 Jul 2026 23:42:49 -0700 Subject: [PATCH 06/11] snapline: group node, corner resize with anchors, framework-DOM-ownership refactor Features: - GroupNodeComponent: a resizable box that carries any node whose center is inside it. Live geometric membership maintained at settle events (move-end, resize, node drop); transient transform-parenting rides the engine's write cascade; onMemberEnter/Leave/onDragCommit callbacks. - JS node resize (CSS resize is unsupported on iOS Safari): a virtual CircleCollider at a configurable corner anchor (tl|tr|bl|br, default br) with signed drag deltas and a fixed opposite corner; opt-in per node (resizable, minWidth/minHeight, resizeHandleRadius). Framework-DOM-ownership refactor (per the SnapSort-derived contract: structural DOM is framework-owned; transforms/data-*/property writes may stay engine-direct): - Node width/height delegated: core fires nodeCallback.onSizeChange and adapters render the size as state; core setSizeState keeps hitboxes in sync and never writes the DOM box. - Selection rectangle delegated: selectCallback.onRectChange carries {x,y,width,height,visible}; Select adapters render (and can restyle) the box. No flush handshake - not paint-atomic. - Base positioning styles moved into adapter markup. - nodeCallback EventProxyFactory dict (onSizeChange/onResizeCommit/ onLinesChanged) with deprecated setLineListCallback/_onResizeCommit shims; DEFAULT_NODE_CONFIG/DEFAULT_GROUP_CONFIG single-site merges; #-private internals with hitBox/config getters; typed global.data accessors in snapline-globals.ts; line-method renames with deprecated aliases (scheduleLineWrites/writeLinesNow/resyncNodeGeometry). - React parity: Group.tsx, Node resize props/handle, state-rendered Select box; demos and e2e for both frameworks (group, resize incl. TL-anchor fixed-corner and min-clamp cases). - AGENTS.md documents the ownership contract and v1 design limits. Co-Authored-By: Claude Fable 5 --- assets/snapline/AGENTS.md | 61 ++- assets/snapline/core/src/connector.ts | 27 +- assets/snapline/core/src/group.ts | 158 +++++++ assets/snapline/core/src/index.ts | 7 +- assets/snapline/core/src/node.ts | 429 +++++++++++++++--- assets/snapline/core/src/select.ts | 88 ++-- assets/snapline/core/src/snapline-globals.ts | 60 +++ assets/snapline/react/src/Group.tsx | 153 +++++++ assets/snapline/react/src/Node.tsx | 78 +++- assets/snapline/react/src/Select.tsx | 31 +- assets/snapline/react/src/index.ts | 2 + assets/snapline/svelte/src/Group.svelte | 136 ++++++ assets/snapline/svelte/src/Node.svelte | 91 +++- assets/snapline/svelte/src/Select.svelte | 33 +- assets/snapline/svelte/src/index.ts | 1 + demo/react/src/App.jsx | 88 ++++ demo/svelte/src/DemoRouter.svelte | 16 + .../demo/node_ui_group/NodeUIGroupDemo.svelte | 69 +++ .../node_ui_resize/NodeUIResizeDemo.svelte | 34 ++ .../demo/node_ui_resize/ResizableNode.svelte | 79 ++++ demo/svelte/src/lib/Drag.svelte | 4 +- package.json | 2 + tests/e2e/snapline-group.playwright.config.ts | 28 ++ tests/e2e/snapline-group.spec.ts | 103 +++++ tests/e2e/snapline-react-features.spec.ts | 86 ++++ tests/e2e/snapline-react.playwright.config.ts | 2 +- .../e2e/snapline-resize.playwright.config.ts | 28 ++ tests/e2e/snapline-resize.spec.ts | 131 ++++++ .../components/hero/HeroToneJoystick.svelte | 4 +- .../highlights/CollisionCard.svelte | 4 +- 30 files changed, 1862 insertions(+), 171 deletions(-) create mode 100644 assets/snapline/core/src/group.ts create mode 100644 assets/snapline/core/src/snapline-globals.ts create mode 100644 assets/snapline/react/src/Group.tsx create mode 100644 assets/snapline/svelte/src/Group.svelte create mode 100644 demo/svelte/src/demo/node_ui_group/NodeUIGroupDemo.svelte create mode 100644 demo/svelte/src/demo/node_ui_resize/NodeUIResizeDemo.svelte create mode 100644 demo/svelte/src/demo/node_ui_resize/ResizableNode.svelte create mode 100644 tests/e2e/snapline-group.playwright.config.ts create mode 100644 tests/e2e/snapline-group.spec.ts create mode 100644 tests/e2e/snapline-react-features.spec.ts create mode 100644 tests/e2e/snapline-resize.playwright.config.ts create mode 100644 tests/e2e/snapline-resize.spec.ts diff --git a/assets/snapline/AGENTS.md b/assets/snapline/AGENTS.md index 5729308..a26f2d2 100644 --- a/assets/snapline/AGENTS.md +++ b/assets/snapline/AGENTS.md @@ -15,11 +15,12 @@ private and are intentionally excluded from npm publish workflows. **Dependencies:** `@snap-engine/core` **Exports:** -- `NodeComponent` - Graph node with connectors +- `NodeComponent` - Graph node with connectors (opt-in corner resize via `resizable`) - `ConnectorComponent` - Input/output connector - `LineComponent` - Visual connection line +- `GroupNodeComponent` - Resizable box that carries the nodes inside it - `RectSelectComponent` - Rectangle selection tool -- `GlobalManager` - Shared state manager +- `snapline-globals` - Typed accessors for the shared `global.data` registries ### @snap-engine/snapline-svelte **Location:** `svelte/src/` @@ -148,6 +149,62 @@ snapline/ **Props:** None +## DOM ownership contract (framework-cooperative rendering) + +Mirrors the SnapSort rule: when a framework binding (Svelte/React) is in use, +**structural DOM (adding, moving, removing, or reparenting elements) is +framework-owned.** Core never inserts or removes elements. Core MAY directly +write **transforms, `data-*` attributes, and property tweaks on existing +elements** — frameworks recover fine from property changes. + +Concretely: + +- **Node width/height** are framework-rendered: core fires + `nodeCallback.onSizeChange(w, h)` during a resize drag and the adapter binds + the size as state. Core only updates its collision hitboxes synchronously + (`setSizeState`). The connector/line re-glue closes itself through the + ResizeObserver after the framework's DOM write reflows. +- **The rubber-band selection box** is framework-rendered: core fires + `selectCallback.onRectChange({x, y, width, height, visible})` and the adapter + draws (and can restyle/replace) the box. Deliberately NO flush handshake — + the box visual is not paint-atomic. +- **Node drag transforms, `data-selected` attributes, and line SVG transforms** + stay engine-written (property writes on existing elements). +- **Adapters must render node/group elements with + `position: absolute; transform-origin: top left`** (and ideally + `will-change: transform`) — core no longer seeds base styles. +- SnapLine has **no `flushMutation`/`settleMutation` equivalent and must not + grow one**: unlike SnapSort's FLIP pipeline, none of SnapLine's delegated + visuals are paint-atomic. + +### Callback conventions + +Domain/lifecycle callbacks live in `EventProxyFactory` dictionaries — +`nodeCallback` (`onSizeChange`, `onResizeCommit`, `onLinesChanged`), +`groupCallback` (`onMemberEnter`, `onMemberLeave`, `onDragCommit`), +`selectCallback` (`onRectChange`), `connectorCallback` (connect/disconnect). +`setLineListCallback` and `_onResizeCommit` are deprecated shims. Raw input/DOM +plumbing stays on the `event.*` slots. + +### Shared global registries + +Everything SnapLine stores on the engine's shared `global.data` bag is declared +in `core/src/snapline-globals.ts` (`SnapLineSharedData`) and accessed through +its typed helpers. Engine core's `input.ts` reads `resizeHandles` duck-typed +(it cannot import snapline) — keep the two shapes in sync. Camera-control +suspension uses the owned-token channel API +(`global.suspend("cameraControl", token)` / `resume` / `isSuspended`), not the +deprecated `allowCameraControl` boolean. + +### Design limits (v1, by intent) + +- Groups never join other groups (nested groups are excluded in + `computeMembers`). +- Carried group members are moved via transform parenting only — they are never + added to `global.data.select`, so a group drag does not alter the selection. +- `attachTransformToGroup`/`detachTransformFromGroup` are the public + transform-only reparent seam used by the group carry. + ## Key Concepts ### Property System diff --git a/assets/snapline/core/src/connector.ts b/assets/snapline/core/src/connector.ts index cd2f65e..9cdb3f8 100644 --- a/assets/snapline/core/src/connector.ts +++ b/assets/snapline/core/src/connector.ts @@ -264,7 +264,8 @@ class ConnectorComponent extends ElementObject { this.#incomingLines = []; } - updateAllLines() { + /** Schedules a WRITE_2 write for every line on this connector. */ + scheduleAllLineWrites() { for (const line of [...this.#outgoingLines, ...this.#incomingLines]) { line.schedule( () => { @@ -279,7 +280,13 @@ class ConnectorComponent extends ElementObject { } } - writeAllLines() { + /** @deprecated Renamed: use `scheduleAllLineWrites` (schedules, does not write now). */ + updateAllLines() { + this.scheduleAllLineWrites(); + } + + /** Synchronously writes every line on this connector (call inside a WRITE stage). */ + writeAllLinesNow() { for (const line of [...this.#outgoingLines, ...this.#incomingLines]) { line.moveLineToConnectorTransform(); line.writeTransform(); @@ -310,9 +317,9 @@ class ConnectorComponent extends ElementObject { } startDragOutLine(prop: pointerDownProp): void { - // Disable camera control while dragging a connection, mirroring node + // Suspend camera control while dragging a connection, mirroring node // drags: without this, drawing a line under a Camera also pans the canvas. - this.global.data.allowCameraControl = false; + this.global.suspend("cameraControl", this.id); let newLine = this.createLine(); newLine.setLineEnd(prop.position.x, prop.position.y); @@ -320,7 +327,7 @@ class ConnectorComponent extends ElementObject { this.#outgoingLines.unshift(newLine); - this.parent.updateNodeLines(); + this.parent.scheduleLineWrites(); this.parent.updateNodeLineList(); this.#state = ConnectorState.DRAGGING; @@ -456,7 +463,7 @@ class ConnectorComponent extends ElementObject { } line.setLineEnd(prop.position.x, prop.position.y); line.setLineStartAtConnector(); - this.parent.updateNodeLines(); + this.parent.scheduleLineWrites(); } hoverWhileDragging( @@ -501,15 +508,15 @@ class ConnectorComponent extends ElementObject { this.deleteLine(0); } if (this.parent) { - this.parent.updateNodeLines(); + this.parent.scheduleLineWrites(); } this._endLineDragCleanup(); } _endLineDragCleanup() { - // Re-enable camera control after the line drag ends (see startDragOutLine). - this.global.data.allowCameraControl = true; + // Release camera control after the line drag ends (see startDragOutLine). + this.global.resume("cameraControl", this.id); this.#state = ConnectorState.IDLE; this.event.input.drag = null; @@ -569,6 +576,8 @@ class ConnectorComponent extends ElementObject { } destroy() { + // A mid-gesture unmount must not strand a camera suspension. + this.global.resume("cameraControl", this.id); this.deleteAllLines(); if (this.parent?._connectors[this.#name] === this) { delete this.parent._connectors[this.#name]; diff --git a/assets/snapline/core/src/group.ts b/assets/snapline/core/src/group.ts new file mode 100644 index 0000000..5f06f31 --- /dev/null +++ b/assets/snapline/core/src/group.ts @@ -0,0 +1,158 @@ +import { EventProxyFactory } from "@snap-engine/core"; +import type { BaseObject, dragStartProp, dragEndProp } from "@snap-engine/core"; +import { NodeComponent, mergeConfig, type NodeConfig } from "./node"; +import { getGroups, snapData } from "./snapline-globals"; + +export interface GroupConfig extends NodeConfig { + width?: number; + height?: number; +} + +const DEFAULT_GROUP_CONFIG = { + width: 400, + height: 300, + minWidth: 160, + minHeight: 120, +} satisfies GroupConfig; + +interface GroupCallback { + // Fired when a node enters/leaves the group's live geometric footprint at a + // settle event (resize, move-settle, or another node's drop) — never for a + // carried member that merely moved with the group. + onMemberEnter: null | ((node: NodeComponent) => void); + onMemberLeave: null | ((node: NodeComponent) => void); + // Fired at the end of a group drag (after members are detached and their + // final world positions are settled) so consumers can persist positions. + onDragCommit: null | (() => void); +} + +// A resizable box that carries any node whose center is inside it. Membership is +// live geometric containment, maintained at settle events; moving the group +// transform-parents its known members and rides SnapEngine's writeTransform +// cascade to move them (and their lines) in a single pass. +// +// Design limits (v1, by intent): groups are excluded from membership, so groups +// cannot nest inside groups; and carried members are moved via transform +// parenting only — they are never added to global.data.select, so a group drag +// does not alter the user's selection. +class GroupNodeComponent extends NodeComponent { + #members: Set = new Set(); + #carry: NodeComponent[] = []; + #groupCallback: GroupCallback; + + constructor(engine: any, parent: BaseObject | null, config: GroupConfig = {}) { + // A group is resizable via the core BR resize hitbox. Group defaults are + // merged here (single default site); undefined adapter props never shadow. + const merged = mergeConfig({ ...DEFAULT_GROUP_CONFIG }, config); + super(engine, parent, { ...merged, resizable: true }); + + this.#groupCallback = { onMemberEnter: null, onMemberLeave: null, onDragCommit: null }; + this.#groupCallback = EventProxyFactory(this, this.#groupCallback); + + // Register so any node's drop can notify every group (see NodeComponent.onDragEnd). + getGroups(this.global).push(this); + } + + get groupCallback(): GroupCallback { + return this.#groupCallback; + } + + /** Snapshot of the current geometric members (settle-maintained). */ + get members(): ReadonlySet { + return this.#members; + } + + // Route the scheduled drag write through the recursive cascade so the group, + // its carried members, and their lines all paint in one WRITE_2 pass. The + // inherited setDragPosition/setUpPosition already schedule this under + // queueId `${id}-transform`, so no drag-loop change is needed. + writeTransformAndLines(): void { + this.writeTransformRecursive(); + } + + #containsCenter(node: NodeComponent): boolean { + const box = this.hitBox.getWorldBoundsSnapshot(); + const nb = node.hitBox.getWorldBoundsSnapshot(); + return ( + nb.centerX >= box.left && + nb.centerX <= box.right && + nb.centerY >= box.top && + nb.centerY <= box.bottom + ); + } + + computeMembers(): NodeComponent[] { + const table = this.global.getEngineObjectTable(this.engine); + return Object.values(table).filter( + (obj: any): obj is NodeComponent => + obj instanceof NodeComponent && + // Groups never join other groups: nested groups are out of scope (v1). + !(obj instanceof GroupNodeComponent) && + obj !== this && + this.#containsCenter(obj), + ); + } + + refreshMembership(fireDelta: boolean): void { + const newSet = new Set(this.computeMembers()); + if (fireDelta) { + for (const node of newSet) { + if (!this.#members.has(node)) this.#groupCallback?.onMemberEnter?.(node); + } + for (const node of this.#members) { + if (!newSet.has(node)) this.#groupCallback?.onMemberLeave?.(node); + } + } + this.#members = newSet; + } + + // Any size change (drag-driven setSize or an adapter's state seed) also + // re-evaluates membership: the group's footprint changed. The synchronous + // hitbox update inside super means this refresh sees the new bounds. + setSizeState(width: number, height: number): void { + super.setSizeState(width, height); + this.refreshMembership(true); + } + + onDragStart(prop: dragStartProp): void { + super.onDragStart(prop); + if (this._resizing) return; // a resize, not a move — don't carry members + // Carry the ALREADY-KNOWN set (from the last settle) — no geometric scan here. + this.#carry = [...this.#members]; + for (const member of this.#carry) member.attachTransformToGroup(this); + } + + onDragEnd(prop: dragEndProp): void { + const wasResizing = this._resizing; + // super sets the group's final world synchronously (and notifies other + // groups); members are still parented, so their world is already final. For a + // resize, super handles setSize/onResizeCommit and our setSize refreshes + // membership, so there is no carry to detach. + super.onDragEnd(prop); + if (wasResizing) return; + for (const member of this.#carry) { + member.detachTransformFromGroup(); // preserveWorld keeps the final position + member.schedule(() => member.writeTransformAndLines(), { + stage: "WRITE_2", + queueId: `${member.id}-transform`, + }); + } + this.#carry = []; + // Re-evaluate at rest: newly-overlapped nodes enter; carried members that + // merely moved are in both sets → no callback. + this.refreshMembership(true); + // Positions (group + members) are now final; let the consumer persist them. + this.#groupCallback?.onDragCommit?.(); + } + + destroy(): void { + snapData(this.global).groups = getGroups(this.global).filter( + (g) => g !== (this as unknown), + ); + for (const member of this.#carry) member.detachTransformFromGroup(); + this.#carry = []; + super.destroy(); + } +} + +export { GroupNodeComponent }; diff --git a/assets/snapline/core/src/index.ts b/assets/snapline/core/src/index.ts index 7d92f65..b714fec 100644 --- a/assets/snapline/core/src/index.ts +++ b/assets/snapline/core/src/index.ts @@ -1,6 +1,9 @@ -export { NodeComponent } from "./node"; -export type { NodeConfig } from "./node"; +export { NodeComponent, DEFAULT_RESIZE_HANDLE_RADIUS, resizeAnchorOffset } from "./node"; +export type { NodeConfig, NodeCallback, ResizeAnchor } from "./node"; export { ConnectorComponent } from "./connector"; export type { ConnectorConfig } from "./connector"; export { LineComponent } from "./line"; +export { GroupNodeComponent } from "./group"; +export type { GroupConfig } from "./group"; export { RectSelectComponent } from "./select"; +export type { SelectRect } from "./select"; diff --git a/assets/snapline/core/src/node.ts b/assets/snapline/core/src/node.ts index 631539e..517cdf7 100644 --- a/assets/snapline/core/src/node.ts +++ b/assets/snapline/core/src/node.ts @@ -1,4 +1,4 @@ -import { BaseObject, ElementObject } from "@snap-engine/core"; +import { BaseObject, ElementObject, EventProxyFactory } from "@snap-engine/core"; import { ConnectorComponent } from "./connector"; import { LineComponent } from "./line"; import type { @@ -8,33 +8,112 @@ import type { dragProp, dragEndProp, } from "@snap-engine/core"; -import { RectCollider } from "@snap-engine/core/collision"; +import { RectCollider, CircleCollider } from "@snap-engine/core/collision"; +import { getSelectList, getGroups, getResizeHandles, snapData } from "./snapline-globals"; + +export type ResizeAnchor = "tl" | "tr" | "bl" | "br"; export interface NodeConfig { lockPosition?: boolean; + /** Enables a corner resize handle (a virtual collision hitbox). */ + resizable?: boolean; + minWidth?: number; + minHeight?: number; + /** Radius of the circular resize hitbox; it straddles the anchor corner. */ + resizeHandleRadius?: number; + /** + * Which corner carries the resize handle (default "br"). The OPPOSITE corner + * stays fixed: resizing from a top/left anchor shifts the node's origin while + * the size changes, so e.g. a "tl" drag grows the box up-left. + */ + resizeAnchor?: ResizeAnchor; +} + +/** Local position of the resize handle's center for a given anchor + size. */ +export function resizeAnchorOffset( + anchor: ResizeAnchor, + width: number, + height: number, +): { x: number; y: number } { + switch (anchor) { + case "tl": + return { x: 0, y: 0 }; + case "tr": + return { x: width, y: 0 }; + case "bl": + return { x: 0, y: height }; + default: + return { x: width, y: height }; + } +} + +/** Shared by core (hitbox radius) and adapters (visual handle size). */ +export const DEFAULT_RESIZE_HANDLE_RADIUS = 14; + +const DEFAULT_NODE_CONFIG: Required = { + lockPosition: false, + resizable: false, + minWidth: 0, + minHeight: 0, + resizeHandleRadius: DEFAULT_RESIZE_HANDLE_RADIUS, + resizeAnchor: "br", +}; + +/** Object-spread merge that ignores undefined values (adapters forward + * possibly-undefined props, which must not shadow the defaults). */ +export function mergeConfig(defaults: T, config: Partial): T { + const merged = { ...defaults }; + for (const key of Object.keys(config) as (keyof T)[]) { + const value = config[key]; + if (value !== undefined) merged[key] = value as T[keyof T]; + } + return merged; +} + +/** Domain/lifecycle callbacks, assigned via `node.nodeCallback.onX = fn` + * (the canonical EventProxyFactory pattern, mirroring connectorCallback). */ +export interface NodeCallback { + /** Live size updates during a resize drag — the adapter renders width/height. */ + onSizeChange: null | ((width: number, height: number) => void); + /** Final size at resize-drag end — the consumer persists it. */ + onResizeCommit: null | ((width: number, height: number) => void); + /** The set of outgoing lines changed — the adapter re-renders its line list. */ + onLinesChanged: null | ((lines: LineComponent[]) => void); } class NodeComponent extends ElementObject { - _config: NodeConfig; + #config: Required; _connectors: { [key: string]: ConnectorComponent }; _components: { [key: string]: ElementObject }; - _nodeWidth = 0; - _nodeHeight = 0; _dragStartX = 0; _dragStartY = 0; _prop: { [key: string]: any }; _propSetCallback: { [key: string]: (value: any) => void }; _nodeStyle: any; _lineListCallback: ((lines: LineComponent[]) => void) | null; - _hitBox: RectCollider; + #hitBox: RectCollider; _selected: boolean; _mouseDownX: number; _mouseDownY: number; _hasMoved: boolean; + #resizeHitBox: CircleCollider | null = null; + /** Read by GroupNodeComponent to distinguish a resize from a move drag. */ + protected _resizing = false; + #resizeArmed = false; + #resizeStartW = 0; + #resizeStartH = 0; + #resizeStartX = 0; + #resizeStartY = 0; + #nodeCallback: NodeCallback; constructor(engine: any, parent: BaseObject | null, config: NodeConfig = {}) { super(engine, parent); - this._config = config; + this.#config = mergeConfig(DEFAULT_NODE_CONFIG, config); + this.#nodeCallback = EventProxyFactory(this, { + onSizeChange: null, + onResizeCommit: null, + onLinesChanged: null, + }); this._connectors = {}; this._components = {}; @@ -52,50 +131,60 @@ class NodeComponent extends ElementObject { this.event.input.drag = this.onDrag; this.event.input.dragEnd = this.onDragEnd; this.event.input.pointerUp = this.onUp; - this._hitBox = new RectCollider(this.engine, this, 0, 0, 0, 0); - this.addCollider(this._hitBox); + this.#hitBox = new RectCollider(this.engine, this, 0, 0, 0, 0); + this.addCollider(this.#hitBox); + + // The resize handle is a virtual CircleCollider parked at the BR corner (it + // straddles the edge and can spread beyond it — no DOM element). It is + // registered so input.ts can resolve a pointerdown over it to this node. + if (this.#config.resizable) { + this.#resizeHitBox = new CircleCollider( + this.engine, + this, + 0, + 0, + this.#config.resizeHandleRadius, + ); + this.addCollider(this.#resizeHitBox); + getResizeHandles(this.global).push(this.#resizeHitBox); + } this._selected = false; this._hasMoved = false; - this.event.dom.onResize = () => { - this.schedule( - () => { - const property = this.readDom({ unapplyTransform: false }, "READ_1"); - this._hitBox.width = property.width; - this._hitBox.height = property.height; - for (const connector of Object.values(this._connectors)) { - connector.measureLocalCenter("READ_1"); - } - }, - { stage: "READ_1" }, - ); - for (const line of [ - ...this.getAllOutgoingLines(), - ...this.getAllIncomingLines(), - ]) { - line.schedule( - () => { - line.moveLineToConnectorTransform(); // Move lines to the saved position of connectors - line.setLineEndAtConnector(); - line.writeDom(); - line.writeTransform(); - }, - { stage: "WRITE_1" }, - ); - } - }; + // Whenever the DOM box changes size (ResizeObserver) re-measure + re-glue. + this.event.dom.onResize = () => this.resyncNodeGeometry(); - this.style = { - willChange: "transform", - position: "absolute", - transformOrigin: "top left", - }; + // Base positioning styles are framework-owned: adapters must render the + // element with `position: absolute; transform-origin: top left` (see the + // ownership note in assets/snapline/AGENTS.md). // Initialize global select list if needed - if (!this.global.data.select) { - this.global.data.select = []; - } + getSelectList(this.global); + } + + get config(): Required { + return this.#config; + } + + get nodeCallback(): NodeCallback { + return this.#nodeCallback; + } + + /** @deprecated Assign `nodeCallback.onResizeCommit` instead. */ + get _onResizeCommit(): NodeCallback["onResizeCommit"] { + return this.#nodeCallback.onResizeCommit; + } + + /** @deprecated Assign `nodeCallback.onResizeCommit` instead. */ + set _onResizeCommit(callback: NodeCallback["onResizeCommit"]) { + this.#nodeCallback.onResizeCommit = callback; + } + + /** The node's collision footprint (world = worldTransform + width/height). + * Read by groups for geometric membership. */ + get hitBox(): RectCollider { + return this.#hitBox; } setStartPositions() { @@ -104,21 +193,19 @@ class NodeComponent extends ElementObject { } setSelected(selected: boolean) { - if (!this.global.data.select) { - this.global.data.select = []; - } this._selected = selected; this.dataAttribute = { selected: String(selected), "snapline-state": selected ? "focus" : "idle", }; + const selectList = getSelectList(this.global); if (selected) { - if (!this.global.data.select.includes(this)) { - this.global.data.select.push(this); + if (!selectList.includes(this)) { + selectList.push(this); } } else { - this.global.data.select = this.global.data.select.filter( - (node: NodeComponent) => node.id !== this.id, + snapData(this.global).select = selectList.filter( + (node) => node.id !== this.id, ); } this.schedule(() => this.writeDom(), { @@ -136,30 +223,161 @@ class NodeComponent extends ElementObject { } } + /** Schedules a WRITE_2 write for every line on every connector of this node. */ + scheduleLineWrites(): void { + for (const connector of Object.values(this._connectors)) { + connector.scheduleAllLineWrites(); + } + } + + /** @deprecated Renamed: use `scheduleLineWrites` (schedules, does not write now). */ updateNodeLines(): void { + this.scheduleLineWrites(); + } + + /** Synchronously writes every line on every connector (call inside a WRITE stage). */ + writeLinesNow(): void { for (const connector of Object.values(this._connectors)) { - connector.updateAllLines(); + connector.writeAllLinesNow(); } } + /** @deprecated Renamed: use `writeLinesNow`. */ writeNodeLines(): void { - for (const connector of Object.values(this._connectors)) { - connector.writeAllLines(); + this.writeLinesNow(); + } + + // Re-measure the node box + each connector's local center (READ_1) and re-glue + // every incoming/outgoing line (WRITE_1). This is the "same handling as a move + // plus a size re-measure": moving a node keeps connector local centers valid, + // but resizing invalidates them, so they must be re-read. Shared by the + // ResizeObserver and the JS-driven setSize; stable queueIds collapse a + // same-frame double-fire (idempotent when it runs twice across frames). + resyncNodeGeometry(): void { + this.schedule( + () => { + const property = this.readDom({ unapplyTransform: false }, "READ_1"); + this.#hitBox.width = property.width; + this.#hitBox.height = property.height; + if (this.#resizeHitBox) { + this.#resizeHitBox.localTransform = resizeAnchorOffset( + this.#config.resizeAnchor, + property.width, + property.height, + ); + } + for (const connector of Object.values(this._connectors)) { + connector.measureLocalCenter("READ_1"); + } + }, + { stage: "READ_1", queueId: `${this.id}-remeasure` }, + ); + for (const line of [ + ...this.getAllOutgoingLines(), + ...this.getAllIncomingLines(), + ]) { + line.schedule( + () => { + line.moveLineToConnectorTransform(); + line.setLineEndAtConnector(); + line.writeDom(); + line.writeTransform(); + }, + { stage: "WRITE_1", queueId: `${line.id}-reglue` }, + ); + } + } + + /** @deprecated Renamed: use `resyncNodeGeometry`. */ + remeasureAndReglue(): void { + this.resyncNodeGeometry(); + } + + // State-only half of a size change: clamps to min and synchronously updates + // the collision footprint + resize hitbox so the hit test and group + // containment stay correct mid-drag. Never touches the DOM — the element's + // width/height are framework-owned (rendered by the adapter). + setSizeState(width: number, height: number): void { + const w = Math.max(this.#config.minWidth, width); + const h = Math.max(this.#config.minHeight, height); + this.#hitBox.width = w; + this.#hitBox.height = h; + if (this.#resizeHitBox) { + this.#resizeHitBox.localTransform = resizeAnchorOffset(this.#config.resizeAnchor, w, h); } } + // Drives the node's size from JS (resize handle): updates state, then asks the + // framework to render the new width/height via onSizeChange. The connector/line + // re-glue closes itself — the adapter's DOM write triggers the ResizeObserver, + // which runs resyncNodeGeometry AFTER the browser reflows (no handshake needed: + // the box repaint is not paint-atomic). + setSize(width: number, height: number): void { + this.setSizeState(width, height); + this.#nodeCallback.onSizeChange?.(this.#hitBox.width, this.#hitBox.height); + } + + // Applies a resize drag for the configured anchor: deltas are signed per + // anchor edge (dragging a left/top anchor outward grows the box), and the + // OPPOSITE corner stays fixed — for top/left anchors the origin shifts by the + // clamped size change (computed from the clamped size, so at min size the + // origin freezes with it). Transforms stay engine-written per the ownership + // contract; the size flows to the framework via onSizeChange. + #applyResizeDrag(dx: number, dy: number): void { + const anchor = this.#config.resizeAnchor; + const sx = anchor === "tr" || anchor === "br" ? 1 : -1; + const sy = anchor === "bl" || anchor === "br" ? 1 : -1; + this.setSize(this.#resizeStartW + sx * dx, this.#resizeStartH + sy * dy); + const w = this.#hitBox.width; + const h = this.#hitBox.height; + if (anchor === "br") return; + const x = + anchor === "tl" || anchor === "bl" + ? this.#resizeStartX + (this.#resizeStartW - w) + : this.#resizeStartX; + const y = + anchor === "tl" || anchor === "tr" + ? this.#resizeStartY + (this.#resizeStartH - h) + : this.#resizeStartY; + this.worldTransform = { x, y }; + this.schedule(() => this.writeTransformAndLines(), { + stage: "WRITE_2", + queueId: `${this.id}-transform`, + }); + } + writeTransformAndLines(): void { this.writeTransform(); - this.writeNodeLines(); + this.writeLinesNow(); + } + + // Called when a parent (e.g. a group) cascades a transform write down the + // transform graph: paint this node + recurse to its transform-children, then + // re-glue this node's own lines (the pure-transform cascade can't, since a + // line's two ends live on two different nodes). + writeTransformRecursive(): void { + super.writeTransformRecursive(); + this.writeLinesNow(); + } + + // Transform-only (re)parenting used by group carry: the public/DOM graph is + // left alone, so members stay flat siblings in the adapter's node list. + attachTransformToGroup(group: NodeComponent): void { + this.setTransformParent(group, true); + } + + detachTransformFromGroup(): void { + this.detachTransformParent(true); } updateNodeLineList(): void { - if (this._lineListCallback) { - // console.log("updateNodeLineList", this.id); - this._lineListCallback(this.getAllOutgoingLines()); - } + const lines = this.getAllOutgoingLines(); + this.#nodeCallback.onLinesChanged?.(lines); + // Legacy path during the deprecation window. + this._lineListCallback?.(lines); } + /** @deprecated Assign `nodeCallback.onLinesChanged` instead. */ setLineListCallback(callback: (lines: LineComponent[]) => void) { this._lineListCallback = callback; } @@ -169,14 +387,21 @@ class NodeComponent extends ElementObject { return; } - // Disable camera control from the very first pointer event: waiting for + // Suspend camera control from the very first pointer event: waiting for // the drag-start threshold lets the camera pan by one move event before - // onDragStart runs. onUp / onDragEnd re-enable it. - this.global.data.allowCameraControl = false; + // onDragStart runs. onUp / onDragEnd / destroy resume it; the token makes + // the dual release paths idempotent. + this.global.suspend("cameraControl", this.id); this._hasMoved = false; - if (this.global.data.select?.includes(this) == false) { - for (const node of [...this.global.data.select]) { + // Synchronous point test against this node's own resize hitbox (no reliance + // on the frame-delayed sweep) decides resize-vs-move for this gesture. + this.#resizeArmed = !!this.#resizeHitBox?.containsWorldPoint( + e.position.x, + e.position.y, + ); + if (!getSelectList(this.global).includes(this)) { + for (const node of [...getSelectList(this.global)]) { node.setSelected(false); } this.setSelected(true); @@ -184,7 +409,20 @@ class NodeComponent extends ElementObject { } onDragStart(prop: dragStartProp): void { - for (const node of this.global.data.select ?? []) { + if (this.#resizeArmed) { + this._resizing = true; + this.#resizeStartW = this.#hitBox.width; + this.#resizeStartH = this.#hitBox.height; + this.#resizeStartX = this.worldTransform.x; + this.#resizeStartY = this.worldTransform.y; + this._mouseDownX = prop.start.x; + this._mouseDownY = prop.start.y; + this._hasMoved = true; + // Guard so releasing a resize over another node doesn't click-select it. + snapData(this.global).resizingNode = this; + return; + } + for (const node of getSelectList(this.global)) { node.setStartPositions(); node._mouseDownX = prop.start.x; node._mouseDownY = prop.start.y; @@ -197,8 +435,15 @@ class NodeComponent extends ElementObject { console.error("Global stats is null"); return; } - if (this._config.lockPosition) return; - for (const node of this.global.data.select ?? []) { + if (this._resizing) { + this.#applyResizeDrag( + prop.position.x - this._mouseDownX, + prop.position.y - this._mouseDownY, + ); + return; + } + if (this.#config.lockPosition) return; + for (const node of getSelectList(this.global)) { node.setDragPosition(prop); } } @@ -218,12 +463,36 @@ class NodeComponent extends ElementObject { } onDragEnd(prop: dragEndProp) { - // Re-enable camera control after drag ends - this.global.data.allowCameraControl = true; + // Release camera control after drag ends + this.global.resume("cameraControl", this.id); + + if (this._resizing) { + this.#applyResizeDrag( + prop.end.x - this._mouseDownX, + prop.end.y - this._mouseDownY, + ); + this.#nodeCallback.onResizeCommit?.(this.#hitBox.width, this.#hitBox.height); + this._resizing = false; + this.#resizeArmed = false; + snapData(this.global).resizingNode = null; + // A resized node's center may have moved into/out of a group. + for (const group of getGroups(this.global)) { + if ((group as unknown) !== this) group.refreshMembership(true); + } + return; + } - for (const node of this.global.data.select ?? []) { + for (const node of getSelectList(this.global)) { node.setUpPosition(prop); } + + // A settled node may have entered or left a group; groups re-evaluate + // membership on settle (never at group-drag-start), so the maintained set is + // current before the next group drag. The structural GroupLike type keeps + // node.ts free of any group import. + for (const group of getGroups(this.global)) { + if ((group as unknown) !== this) group.refreshMembership(true); + } } setUpPosition(prop: dragEndProp) { @@ -242,10 +511,19 @@ class NodeComponent extends ElementObject { } onUp(_prop: pointerUpProp) { - this.global.data.allowCameraControl = true; + this.global.resume("cameraControl", this.id); + + // pointerUp is dispatched to whatever is under the release point, which for a + // resize may be a DIFFERENT node than the one being resized. Skip click-select + // while any resize is settling so releasing a resize doesn't select this node. + if (snapData(this.global).resizingNode) return; + if (this.#resizeArmed) { + this.#resizeArmed = false; + return; + } if (this._hasMoved == false) { - for (const node of [...(this.global.data.select ?? [])]) { + for (const node of [...getSelectList(this.global)]) { node.setSelected(false); } this.setSelected(true); @@ -315,10 +593,17 @@ class NodeComponent extends ElementObject { } destroy() { + // A mid-gesture unmount must not strand a camera suspension. + this.global.resume("cameraControl", this.id); for (const connector of Object.values(this._connectors)) { connector.deleteAllLines(); } this.setSelected(false); + if (this.#resizeHitBox) { + snapData(this.global).resizeHandles = getResizeHandles(this.global).filter( + (handle) => handle !== this.#resizeHitBox, + ); + } this._connectors = {}; super.destroy(); } diff --git a/assets/snapline/core/src/select.ts b/assets/snapline/core/src/select.ts index da51c86..c079536 100644 --- a/assets/snapline/core/src/select.ts +++ b/assets/snapline/core/src/select.ts @@ -1,4 +1,4 @@ -import { BaseObject, ElementObject } from "@snap-engine/core"; +import { BaseObject, ElementObject, EventProxyFactory } from "@snap-engine/core"; import type { pointerDownProp, pointerMoveProp, @@ -6,12 +6,35 @@ import type { } from "@snap-engine/core"; import { RectCollider, Collider } from "@snap-engine/core/collision"; import { NodeComponent } from "./node"; +import { getSelectList, snapData } from "./snapline-globals"; + +/** World-space rectangle the framework renders as the selection box. */ +export interface SelectRect { + x: number; + y: number; + width: number; + height: number; + visible: boolean; +} + +interface SelectCallback { + /** + * The rubber-band rectangle changed — the FRAMEWORK renders it (position, + * size, visibility, and any custom styling). Core keeps only the pointer + * math and the selection collider; it never writes the box's DOM. This is + * deliberately a plain callback with no flush handshake: the box visual is + * not paint-atomic, so the framework may flush on its own schedule. + */ + onRectChange: null | ((rect: SelectRect) => void); +} class RectSelectComponent extends ElementObject { _state: "none" | "dragging"; _mouseDownX: number; _mouseDownY: number; _selectHitBox: Collider; + #selectCallback: SelectCallback; + constructor(engine: any, parent: BaseObject | null) { super(engine, parent); @@ -29,31 +52,25 @@ class RectSelectComponent extends ElementObject { this.addCollider(this._selectHitBox); - this.global.data.select = []; + snapData(this.global).select = []; - this.style = { - width: "0px", - height: "0px", - transformOrigin: "top left", - position: "absolute", - left: "0px", - top: "0px", - pointerEvents: "none", - }; - this.schedule(() => this.writeDom(), { - stage: "WRITE_1", - queueId: `${this.id}-dom`, - }); + this.#selectCallback = EventProxyFactory( + this, + { onRectChange: null }, + ); } - scheduleWrite() { - this.schedule(() => this.writeDom(), { - stage: "WRITE_1", - queueId: `${this.id}-dom`, - }); - this.schedule(() => this.writeTransform(), { - stage: "WRITE_2", - queueId: `${this.id}-transform`, + get selectCallback(): SelectCallback { + return this.#selectCallback; + } + + #fireRect(width: number, height: number, visible: boolean): void { + this.#selectCallback.onRectChange?.({ + x: this.worldTransform.x, + y: this.worldTransform.y, + width, + height, + visible, }); } @@ -65,21 +82,18 @@ class RectSelectComponent extends ElementObject { ) { return; } - for (let node of [...this.global.data.select]) { + for (let node of [...getSelectList(this.global)]) { node.setSelected(false); } - this.global.data.select = []; + snapData(this.global).select = []; + // worldTransform positions the selection collider (its transform parent); + // the visual box is framework-rendered from the callback rect. this.worldTransform = { x: prop.position.x, y: prop.position.y }; this._state = "dragging"; - this.style = { - display: "block", - width: "0px", - height: "0px", - }; this._mouseDownX = prop.position.x; this._mouseDownY = prop.position.y; - this.scheduleWrite(); + this.#fireRect(0, 0, true); this._selectHitBox.event.collider.onBeginContact = ( _: Collider, @@ -111,27 +125,21 @@ class RectSelectComponent extends ElementObject { Math.abs(prop.position.x - this._mouseDownX), Math.abs(prop.position.y - this._mouseDownY), ]; - this.style = { - width: `${boxWidth}px`, - height: `${boxHeight}px`, - }; this.worldTransform = { x: boxOriginX, y: boxOriginY }; this._selectHitBox.localTransform = { x: 0, y: 0 }; this._selectHitBox.width = boxWidth; this._selectHitBox.height = boxHeight; - this.scheduleWrite(); + this.#fireRect(boxWidth, boxHeight, true); } } onGlobalCursorUp(_prop: pointerUpProp): void { - this.style = { - display: "none", - }; + const wasDragging = this._state === "dragging"; this._state = "none"; this._selectHitBox.event.collider.onBeginContact = null; this._selectHitBox.event.collider.onEndContact = null; - this.scheduleWrite(); + if (wasDragging) this.#fireRect(0, 0, false); } onCollideNode(_hitBox: Collider, _node: Collider): void {} diff --git a/assets/snapline/core/src/snapline-globals.ts b/assets/snapline/core/src/snapline-globals.ts new file mode 100644 index 0000000..45f6980 --- /dev/null +++ b/assets/snapline/core/src/snapline-globals.ts @@ -0,0 +1,60 @@ +import type { CircleCollider } from "@snap-engine/core/collision"; +import type { NodeComponent } from "./node"; + +/** + * Structural stand-in for GroupNodeComponent so node.ts can notify groups on + * settle without importing the group module (no group→node import cycle). + */ +export interface GroupLike { + refreshMembership(fireDelta: boolean): void; +} + +/** + * The shape of everything SnapLine stores on the engine's shared `global.data` + * bag. This is the single declaration site for these cross-module contracts — + * every reader/writer goes through the typed accessors below instead of + * re-deriving the shape inline. + * + * NOTE for engine core: `input.ts#resolveResizeOwner` reads `resizeHandles` + * duck-typed (engine core cannot import snapline); keep its structural type in + * sync with this declaration. + */ +export interface SnapLineSharedData { + /** Currently-selected nodes (multi-select drag moves all of them). */ + select?: NodeComponent[]; + /** All live groups; notified on any node's drop so membership stays settled. */ + groups?: GroupLike[]; + /** Registered resize hitboxes; input.ts routes pointerdowns over them. */ + resizeHandles?: CircleCollider[]; + /** The node mid-resize, so an unrelated pointerUp doesn't click-select. */ + resizingNode?: NodeComponent | null; + /** + * @deprecated Legacy camera-control boolean (last-writer-wins). Superseded by + * `global.suspend("cameraControl", token)` — the camera still honors `false` + * for third-party writers. + */ + allowCameraControl?: boolean; +} + +/** Typed view over the untyped global data bag (cast at the boundary). */ +export function snapData(global: { data: any }): SnapLineSharedData { + return global.data as SnapLineSharedData; +} + +export function getSelectList(global: { data: any }): NodeComponent[] { + const data = snapData(global); + if (!data.select) data.select = []; + return data.select; +} + +export function getGroups(global: { data: any }): GroupLike[] { + const data = snapData(global); + if (!data.groups) data.groups = []; + return data.groups; +} + +export function getResizeHandles(global: { data: any }): CircleCollider[] { + const data = snapData(global); + if (!data.resizeHandles) data.resizeHandles = []; + return data.resizeHandles; +} diff --git a/assets/snapline/react/src/Group.tsx b/assets/snapline/react/src/Group.tsx new file mode 100644 index 0000000..2da0835 --- /dev/null +++ b/assets/snapline/react/src/Group.tsx @@ -0,0 +1,153 @@ +import { + forwardRef, + useEffect, + useImperativeHandle, + useRef, + useState, + type CSSProperties, + type ReactNode, +} from "react"; +import { + DEFAULT_RESIZE_HANDLE_RADIUS, + GroupNodeComponent, + NodeComponent, +} from "@snap-engine/snapline"; +import { useSnapLineEngine } from "./Engine"; + +export interface GroupProps { + children?: ReactNode; + className?: string; + groupObject?: GroupNodeComponent | null; + style?: CSSProperties; + title?: string; + x?: number; + y?: number; + width?: number; + height?: number; + minWidth?: number; + minHeight?: number; + onMemberEnter?: (node: NodeComponent) => void; + onMemberLeave?: (node: NodeComponent) => void; + onResizeCommit?: (width: number, height: number) => void; + onDragCommit?: () => void; +} + +export const Group = forwardRef(function Group( + { + children, + className = "", + groupObject = null, + style, + title = "Group", + x = 0, + y = 0, + width = 400, + height = 300, + minWidth, + minHeight, + onMemberEnter, + onMemberLeave, + onResizeCommit, + onDragCommit, + }, + ref, +) { + const engine = useSnapLineEngine(); + const boxDomRef = useRef(null); + const headerRef = useRef(null); + const ownsGroupRef = useRef(groupObject == null); + const groupRef = useRef(groupObject); + if (!groupRef.current) { + groupRef.current = new GroupNodeComponent(engine, null, { + width, + height, + minWidth, + minHeight, + }); + } + const group = groupRef.current; + + // The box's width/height are framework-owned: seeded from props, updated + // live by core's onSizeChange during a resize drag. + const [box, setBox] = useState<{ w: number; h: number }>({ w: width, h: height }); + + useImperativeHandle(ref, () => group, [group]); + + useEffect(() => { + group.worldTransform = { x, y }; + if (boxDomRef.current) { + group.element = boxDomRef.current; + group.writeTransform(); + } + group.groupCallback.onMemberEnter = (node) => onMemberEnter?.(node); + group.groupCallback.onMemberLeave = (node) => onMemberLeave?.(node); + group.groupCallback.onDragCommit = () => onDragCommit?.(); + group.nodeCallback.onSizeChange = (w: number, h: number) => setBox({ w, h }); + group.nodeCallback.onResizeCommit = (w: number, h: number) => + onResizeCommit?.(w, h); + // Header is the only move surface. setSizeState seeds the collision + // footprint (the DOM size is rendered from state above). + if (headerRef.current) group.addInputAlias(headerRef.current); + group.setSizeState(box.w, box.h); + // Seed membership once siblings have mounted and had hit boxes measured. + group.schedule(() => group.refreshMembership(true), { + stage: "WRITE_3", + queueId: `${group.id}-seed`, + }); + + return () => { + group.groupCallback.onMemberEnter = null; + group.groupCallback.onMemberLeave = null; + group.groupCallback.onDragCommit = null; + group.nodeCallback.onSizeChange = null; + group.nodeCallback.onResizeCommit = null; + if (ownsGroupRef.current) { + group.destroy(); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [group, x, y]); + + const handleSize = + group.config.resizeHandleRadius ?? DEFAULT_RESIZE_HANDLE_RADIUS; + return ( +
+
+ {title} +
+
{children}
+ {/* Visual cue only: the core resize hitbox (a collider straddling the BR + corner) does the hitting, so this takes no pointer events. */} +
+
+ ); +}); diff --git a/assets/snapline/react/src/Node.tsx b/assets/snapline/react/src/Node.tsx index 0425f51..ff0e052 100644 --- a/assets/snapline/react/src/Node.tsx +++ b/assets/snapline/react/src/Node.tsx @@ -9,7 +9,12 @@ import { type CSSProperties, type ReactNode, } from "react"; -import { LineComponent, NodeComponent } from "@snap-engine/snapline"; +import { + DEFAULT_RESIZE_HANDLE_RADIUS, + LineComponent, + NodeComponent, + type ResizeAnchor, +} from "@snap-engine/snapline"; import { useSnapLineEngine } from "./Engine"; import { Line } from "./Line"; @@ -23,6 +28,13 @@ export interface NodeProps { style?: CSSProperties; x?: number; y?: number; + resizable?: boolean; + minWidth?: number; + minHeight?: number; + resizeHandleRadius?: number; + resizeAnchor?: ResizeAnchor; + onResizeCommit?: (width: number, height: number) => void; + onSizeChange?: (width: number, height: number) => void; } export const Node = forwardRef(function Node( @@ -34,6 +46,13 @@ export const Node = forwardRef(function Node( style, x = 0, y = 0, + resizable = false, + minWidth, + minHeight, + resizeHandleRadius, + resizeAnchor, + onResizeCommit, + onSizeChange, }, ref, ) { @@ -42,12 +61,22 @@ export const Node = forwardRef(function Node( const ownsNodeRef = useRef(nodeObject == null); const nodeRef = useRef(nodeObject); if (!nodeRef.current) { - nodeRef.current = new NodeComponent(engine, null); + nodeRef.current = new NodeComponent(engine, null, { + resizable, + minWidth, + minHeight, + resizeHandleRadius, + resizeAnchor, + }); } const node = nodeRef.current; const [lineList, setLineList] = useState( node.getAllOutgoingLines(), ); + // The element's width/height are framework-owned: core reports size changes + // (resize drag) via onSizeChange and this state renders them. Null until the + // first resize so CSS-declared sizes keep applying to non-resized nodes. + const [box, setBox] = useState<{ w: number; h: number } | null>(null); useImperativeHandle(ref, () => node, [node]); @@ -57,19 +86,29 @@ export const Node = forwardRef(function Node( node.element = nodeDomRef.current; node.writeTransform(); } - node.setLineListCallback((lines: LineComponent[]) => { + node.nodeCallback.onLinesChanged = (lines: LineComponent[]) => { setLineList([...lines]); - }); + }; + node.nodeCallback.onSizeChange = (w: number, h: number) => { + setBox({ w, h }); + onSizeChange?.(w, h); + }; + node.nodeCallback.onResizeCommit = (w: number, h: number) => { + onResizeCommit?.(w, h); + }; setLineList([...node.getAllOutgoingLines()]); return () => { - node.setLineListCallback(() => {}); + node.nodeCallback.onLinesChanged = null; + node.nodeCallback.onSizeChange = null; + node.nodeCallback.onResizeCommit = null; if (ownsNodeRef.current) { node.destroy(); } }; - }, [node, x, y]); + }, [node, x, y, onResizeCommit, onSizeChange]); + const handleSize = resizeHandleRadius ?? DEFAULT_RESIZE_HANDLE_RADIUS; return ( {lineList.map((line) => ( @@ -81,10 +120,37 @@ export const Node = forwardRef(function Node( className={className} style={{ position: "absolute", + transformOrigin: "top left", + willChange: "transform", + ...(box ? { width: `${box.w}px`, height: `${box.h}px` } : null), ...style, }} > {children} + {resizable ? ( + /* Purely visual: the collision hitbox (which straddles the corner and + spreads beyond it) does the hitting, so this takes no pointer events. */ +
+ ) : null}
); diff --git a/assets/snapline/react/src/Select.tsx b/assets/snapline/react/src/Select.tsx index fdfbd0f..75738e0 100644 --- a/assets/snapline/react/src/Select.tsx +++ b/assets/snapline/react/src/Select.tsx @@ -1,5 +1,5 @@ -import { useEffect, useRef, type CSSProperties } from "react"; -import { RectSelectComponent } from "@snap-engine/snapline"; +import { useEffect, useRef, useState, type CSSProperties } from "react"; +import { RectSelectComponent, type SelectRect } from "@snap-engine/snapline"; import { useSnapLineEngine } from "./Engine"; export interface SelectProps { @@ -14,7 +14,6 @@ export function Select({ style, }: SelectProps) { const engine = useSnapLineEngine(); - const selectDomRef = useRef(null); const selectRef = useRef(null); if (!selectRef.current) { @@ -22,10 +21,19 @@ export function Select({ } const select = selectRef.current; + // The selection box is framework-rendered: core reports the world-space rect + // via onRectChange and this state draws it, so consumers can restyle or + // replace the box (className/style props). + const [rect, setRect] = useState({ + x: 0, + y: 0, + width: 0, + height: 0, + visible: false, + }); + useEffect(() => { - if (selectDomRef.current) { - select.element = selectDomRef.current; - } + select.selectCallback.onRectChange = (r: SelectRect) => setRect(r); return () => { select.destroy(); }; @@ -34,16 +42,19 @@ export function Select({ return (
diff --git a/assets/snapline/react/src/index.ts b/assets/snapline/react/src/index.ts index c6b6024..a0019e1 100644 --- a/assets/snapline/react/src/index.ts +++ b/assets/snapline/react/src/index.ts @@ -2,6 +2,8 @@ export { Connector } from "./Connector"; export type { ConnectorProps, ConnectorRef } from "./Connector"; export { Engine, EngineContext, SnapLineEngine, useSnapLineEngine } from "./Engine"; export type { EngineProps } from "./Engine"; +export { Group } from "./Group"; +export type { GroupProps } from "./Group"; export { Line } from "./Line"; export type { LineProps } from "./Line"; export { Node, NodeObjectContext } from "./Node"; diff --git a/assets/snapline/svelte/src/Group.svelte b/assets/snapline/svelte/src/Group.svelte new file mode 100644 index 0000000..81ba046 --- /dev/null +++ b/assets/snapline/svelte/src/Group.svelte @@ -0,0 +1,136 @@ + + +
+
+ {title} +
+
+ {@render children?.()} +
+ +
+
+ + diff --git a/assets/snapline/svelte/src/Node.svelte b/assets/snapline/svelte/src/Node.svelte index 5459d1c..d5fd76c 100644 --- a/assets/snapline/svelte/src/Node.svelte +++ b/assets/snapline/svelte/src/Node.svelte @@ -1,40 +1,73 @@ {#each lineList as line (line.id)} {/each} -
+
{@render children()} + {#if resizable} + {@const anchor = resizeAnchor ?? "br"} + +
+ {/if}
diff --git a/assets/snapline/svelte/src/Select.svelte b/assets/snapline/svelte/src/Select.svelte index f7cb3ec..1f44219 100644 --- a/assets/snapline/svelte/src/Select.svelte +++ b/assets/snapline/svelte/src/Select.svelte @@ -1,24 +1,39 @@ - -
+
diff --git a/assets/snapline/svelte/src/index.ts b/assets/snapline/svelte/src/index.ts index 9de7741..1882976 100644 --- a/assets/snapline/svelte/src/index.ts +++ b/assets/snapline/svelte/src/index.ts @@ -1,4 +1,5 @@ export { default as Node } from "./Node.svelte"; +export { default as Group } from "./Group.svelte"; export { default as Connector } from "./Connector.svelte"; export { default as Line } from "./Line.svelte"; export { default as Select } from "./Select.svelte"; diff --git a/demo/react/src/App.jsx b/demo/react/src/App.jsx index af7de23..537dad2 100644 --- a/demo/react/src/App.jsx +++ b/demo/react/src/App.jsx @@ -1,5 +1,6 @@ import { Connector, + Group, Node, Select, } from "@snap-engine/snapline-react"; @@ -14,6 +15,85 @@ import { import "../demo.css"; import AssetBaseReactDemo from "./AssetBaseReactDemo"; +function ResizableNode({ title, x, y }) { + return ( + +
+

{title}

+
+
+
+
+ +
+ Input +
+
+ Output +
+ +
+
+
+
+ ); +} + +function SnapLineResizeDemo() { + return ( +
+ +
+
+ + +
+ +
+ ); +} + +function SnapLineGroupDemo() { + const tagMember = (node) => + node.element?.setAttribute("data-member", "true"); + const untagMember = (node) => + node.element?.removeAttribute("data-member"); + return ( +
+ +
+
+ + + + +
+ +
+ ); +} + function SimpleNode({ title, x, y }) { return ( @@ -82,6 +162,14 @@ export default function App() { return ; } + if (path === "/snapline-resize" || demo === "snapline_resize") { + return ; + } + + if (path === "/snapline-group" || demo === "snapline_group") { + return ; + } + return ; } diff --git a/demo/svelte/src/DemoRouter.svelte b/demo/svelte/src/DemoRouter.svelte index 2b0439f..eab9d80 100644 --- a/demo/svelte/src/DemoRouter.svelte +++ b/demo/svelte/src/DemoRouter.svelte @@ -4,6 +4,8 @@ import DragInputPage from "./demo/input/Drag.svelte"; import NodeUiPage from "./demo/node_ui_demo/NodeUIDemo.svelte"; import NodeUiCameraPage from "./demo/node_ui_camera/NodeUICameraDemo.svelte"; + import NodeUiGroupPage from "./demo/node_ui_group/NodeUIGroupDemo.svelte"; + import NodeUiResizePage from "./demo/node_ui_resize/NodeUIResizeDemo.svelte"; import DropSnapNestedPage from "./demo/drop_snap_nested/DropSnapNestedDemo.svelte"; import SnapSortComponentsPage from "./demo/snapsort_components/SnapSortComponentsDemo.svelte"; import SnapSortFileExplorerPage from "./demo/snapsort_file_explorer/SnapSortFileExplorerDemo.svelte"; @@ -61,6 +63,16 @@ path: "/snapline-camera", legacyDemoValues: ["snapline_camera"], }, + { + label: "SnapLine Group", + path: "/snapline-group", + legacyDemoValues: ["snapline_group"], + }, + { + label: "SnapLine Resize", + path: "/snapline-resize", + legacyDemoValues: ["snapline_resize"], + }, { label: "SnapSort", path: "/snapsort", @@ -264,6 +276,10 @@ {:else if selectedPath === "/snapline-camera"} + {:else if selectedPath === "/snapline-group"} + + {:else if selectedPath === "/snapline-resize"} + {:else if selectedPath === "/snapsort"} {:else if selectedPath === "/snapsort-components"} diff --git a/demo/svelte/src/demo/node_ui_group/NodeUIGroupDemo.svelte b/demo/svelte/src/demo/node_ui_group/NodeUIGroupDemo.svelte new file mode 100644 index 0000000..f16cfca --- /dev/null +++ b/demo/svelte/src/demo/node_ui_group/NodeUIGroupDemo.svelte @@ -0,0 +1,69 @@ + + + +
+
+ + + + +
+
+ + diff --git a/demo/svelte/src/demo/node_ui_resize/NodeUIResizeDemo.svelte b/demo/svelte/src/demo/node_ui_resize/NodeUIResizeDemo.svelte new file mode 100644 index 0000000..1ef8d74 --- /dev/null +++ b/demo/svelte/src/demo/node_ui_resize/NodeUIResizeDemo.svelte @@ -0,0 +1,34 @@ + + + +
+
+ + + + +
+
+ + diff --git a/demo/svelte/src/demo/node_ui_resize/ResizableNode.svelte b/demo/svelte/src/demo/node_ui_resize/ResizableNode.svelte new file mode 100644 index 0000000..0d61331 --- /dev/null +++ b/demo/svelte/src/demo/node_ui_resize/ResizableNode.svelte @@ -0,0 +1,79 @@ + + + +

{title}

+
+
+
+ In +
+
+ Out +
+
+
+
+ + diff --git a/demo/svelte/src/lib/Drag.svelte b/demo/svelte/src/lib/Drag.svelte index a1c5b2c..0c9f980 100644 --- a/demo/svelte/src/lib/Drag.svelte +++ b/demo/svelte/src/lib/Drag.svelte @@ -62,7 +62,7 @@ object.event.input.dragStart = (prop: dragStartProp) => { if (!object) return; // Disable camera control while dragging - object.global.data.allowCameraControl = false; + object.global.suspend("cameraControl", object.id); isDragging = true; dragStartX = object.worldTransform.x; @@ -94,7 +94,7 @@ object.event.input.dragEnd = (_: dragEndProp) => { if (object) { // Re-enable camera control after drag ends - object.global.data.allowCameraControl = true; + object.global.resume("cameraControl", object.id); } isDragging = false; diff --git a/package.json b/package.json index a85220e..30c287c 100755 --- a/package.json +++ b/package.json @@ -48,6 +48,8 @@ "test:asset-base-react": "playwright test -c tests/e2e/asset-base-react.playwright.config.ts", "test:snapline": "playwright test -c tests/e2e/snapline.playwright.config.ts", "test:snapline-camera": "playwright test -c tests/e2e/snapline-camera.playwright.config.ts", + "test:snapline-group": "playwright test -c tests/e2e/snapline-group.playwright.config.ts", + "test:snapline-resize": "playwright test -c tests/e2e/snapline-resize.playwright.config.ts", "test:snapline-react": "playwright test -c tests/e2e/snapline-react.playwright.config.ts", "test:layout": "playwright test -c tests/e2e/snapsort-layout.playwright.config.ts", "test:snapsort": "playwright test -c tests/e2e/snapsort.playwright.config.ts", diff --git a/tests/e2e/snapline-group.playwright.config.ts b/tests/e2e/snapline-group.playwright.config.ts new file mode 100644 index 0000000..9739c78 --- /dev/null +++ b/tests/e2e/snapline-group.playwright.config.ts @@ -0,0 +1,28 @@ +import { defineConfig } from "@playwright/test"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const port = Number(process.env.SNAPLINE_GROUP_TEST_PORT ?? 3031); +const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../.."); + +export default defineConfig({ + testDir: ".", + testMatch: "snapline-group.spec.ts", + fullyParallel: false, + workers: 1, + reporter: [["list"]], + use: { + baseURL: `http://127.0.0.1:${port}`, + channel: "chrome", + screenshot: "only-on-failure", + trace: "retain-on-failure", + viewport: { width: 1280, height: 900 }, + }, + webServer: { + cwd: repoRoot, + command: `npx vite serve demo/svelte --config demo/svelte/vite.config.mjs --host 127.0.0.1 --port ${port} --strictPort --force`, + url: `http://127.0.0.1:${port}`, + reuseExistingServer: false, + timeout: 30_000, + }, +}); diff --git a/tests/e2e/snapline-group.spec.ts b/tests/e2e/snapline-group.spec.ts new file mode 100644 index 0000000..7198ddf --- /dev/null +++ b/tests/e2e/snapline-group.spec.ts @@ -0,0 +1,103 @@ +import { expect, test, type Locator, type Page } from "@playwright/test"; + +// A group node carries any node whose center is inside its box. Membership is +// live geometric containment, refreshed on settle (move / resize / node drop); +// moving the group transform-parents its members and rides the writeTransform +// cascade to move them in one pass. + +async function centerOf(locator: Locator) { + const box = await locator.boundingBox(); + expect(box).not.toBeNull(); + return { x: box!.x + box!.width / 2, y: box!.y + box!.height / 2 }; +} + +async function dragFromTo( + page: Page, + from: { x: number; y: number }, + to: { x: number; y: number }, +) { + await page.mouse.move(from.x, from.y); + await page.mouse.down(); + await page.mouse.move(to.x, to.y, { steps: 12 }); + await page.mouse.up(); +} + +const NODE = "[data-snapline-type='node']"; +const MEMBER = "[data-member='true']"; +const HEADER = "[data-snapline-part='group-header']"; +const RESIZE = "[data-snapline-part='group-resize']"; + +function nodeByTitle(page: Page, title: string): Locator { + return page.locator(NODE, { hasText: title }); +} + +test.beforeEach(async ({ page }) => { + await page.goto("/snapline-group"); + await expect(page.locator(NODE)).toHaveCount(3); + await expect(page.locator("[data-snapline-type='group']")).toHaveCount(1); + // Seed settles: Node A and Node C start inside the box, Node B outside. + await expect(page.locator(MEMBER)).toHaveCount(2); +}); + +test("dragging the group header carries its in-box members, not outsiders", async ({ page }) => { + const nodeA = nodeByTitle(page, "Node A"); + const nodeB = nodeByTitle(page, "Node B"); + const beforeA = await nodeA.boundingBox(); + const beforeB = await nodeB.boundingBox(); + + const header = await centerOf(page.locator(HEADER)); + await dragFromTo(page, header, { x: header.x + 130, y: header.y + 70 }); + + const afterA = await nodeA.boundingBox(); + const afterB = await nodeB.boundingBox(); + // Member A rides the group by the same delta. + expect(afterA!.x - beforeA!.x).toBeGreaterThan(100); + expect(afterA!.y - beforeA!.y).toBeGreaterThan(50); + // Non-member B stays put. + expect(Math.abs(afterB!.x - beforeB!.x)).toBeLessThan(8); + expect(Math.abs(afterB!.y - beforeB!.y)).toBeLessThan(8); +}); + +test("carried members do not fire enter/leave (cue count stays stable)", async ({ page }) => { + const header = await centerOf(page.locator(HEADER)); + await dragFromTo(page, header, { x: header.x + 60, y: header.y + 40 }); + // A and C merely moved with the group — still members, no flicker. + await expect(page.locator(MEMBER)).toHaveCount(2); +}); + +test("resizing the group to cover a node adds it, shrinking removes it", async ({ page }) => { + const nodeB = nodeByTitle(page, "Node B"); + await expect(nodeB).not.toHaveAttribute("data-member", "true"); + + // Grow the box rightward past Node B's center. + const handle = await centerOf(page.locator(RESIZE)); + await dragFromTo(page, handle, { x: handle.x + 200, y: handle.y }); + await expect(nodeB).toHaveAttribute("data-member", "true"); + await expect(page.locator(MEMBER)).toHaveCount(3); + + // Shrink back so Node B falls outside again. + const handle2 = await centerOf(page.locator(RESIZE)); + await dragFromTo(page, handle2, { x: handle2.x - 200, y: handle2.y }); + await expect(nodeB).not.toHaveAttribute("data-member", "true"); + await expect(page.locator(MEMBER)).toHaveCount(2); +}); + +test("moving the group over a node adds it, and the next drag carries it", async ({ page }) => { + const nodeB = nodeByTitle(page, "Node B"); + const startB = await nodeB.boundingBox(); + + // Drag the group right so its box comes to rest over Node B. + const header = await centerOf(page.locator(HEADER)); + await dragFromTo(page, header, { x: header.x + 200, y: header.y }); + + // B did not move this drag (it was not a member at drag start) but is now one. + const settledB = await nodeB.boundingBox(); + expect(Math.abs(settledB!.x - startB!.x)).toBeLessThan(8); + await expect(nodeB).toHaveAttribute("data-member", "true"); + + // The next group drag carries B. + const header2 = await centerOf(page.locator(HEADER)); + await dragFromTo(page, header2, { x: header2.x, y: header2.y + 90 }); + const carriedB = await nodeB.boundingBox(); + expect(carriedB!.y - settledB!.y).toBeGreaterThan(60); +}); diff --git a/tests/e2e/snapline-react-features.spec.ts b/tests/e2e/snapline-react-features.spec.ts new file mode 100644 index 0000000..e4119e2 --- /dev/null +++ b/tests/e2e/snapline-react-features.spec.ts @@ -0,0 +1,86 @@ +import { expect, test, type Locator, type Page } from "@playwright/test"; + +// React-adapter parity coverage for the JS node resize and the group node — +// mirrors the svelte suites (snapline-resize.spec.ts / snapline-group.spec.ts). + +async function centerOf(locator: Locator) { + const box = await locator.boundingBox(); + expect(box).not.toBeNull(); + return { x: box!.x + box!.width / 2, y: box!.y + box!.height / 2 }; +} + +async function dragFromTo(page: Page, from: { x: number; y: number }, to: { x: number; y: number }) { + await page.mouse.move(from.x, from.y); + await page.mouse.down(); + await page.mouse.move(to.x, to.y, { steps: 14 }); + await page.mouse.up(); +} + +async function waitForAnimationFrame(page: Page) { + await page.evaluate(() => new Promise((r) => requestAnimationFrame(() => r()))); +} + +const NODE = "[data-snapline-type='node']"; + +test("react: resizing a node grows it from the BR corner and keeps lines glued", async ({ page }) => { + await page.goto("/snapline-resize"); + await expect(page.locator(NODE)).toHaveCount(2); + const nodeA = page.locator(NODE, { hasText: "Resizable A" }); + const nodeB = page.locator(NODE, { hasText: "Fixed B" }); + + // Connect A output -> B input, then resize A: the line must survive. + const output = nodeA.locator("[data-snapline-name='output']"); + const input = nodeB.locator("[data-snapline-name='input']"); + await dragFromTo(page, await centerOf(output), await centerOf(input)); + const line = page.locator("[data-snapline-type='connector-line']"); + await expect(line).toHaveCount(1); + + const before = await nodeA.boundingBox(); + const corner = { x: before!.x + before!.width - 2, y: before!.y + before!.height - 2 }; + await dragFromTo(page, corner, { x: corner.x + 140, y: corner.y + 80 }); + await waitForAnimationFrame(page); + + const after = await nodeA.boundingBox(); + expect(after!.width - before!.width).toBeGreaterThan(90); + expect(after!.height - before!.height).toBeGreaterThan(40); + await expect(line).toHaveCount(1); +}); + +test("react: a plain node moves (not resizes) when grabbed at its BR corner", async ({ page }) => { + await page.goto("/snapline-resize"); + await expect(page.locator(NODE)).toHaveCount(2); + const nodeB = page.locator(NODE, { hasText: "Fixed B" }); + const before = await nodeB.boundingBox(); + const corner = { x: before!.x + before!.width - 3, y: before!.y + before!.height - 3 }; + await dragFromTo(page, corner, { x: corner.x + 100, y: corner.y + 60 }); + const after = await nodeB.boundingBox(); + expect(after!.x - before!.x).toBeGreaterThan(70); + expect(Math.abs(after!.width - before!.width)).toBeLessThan(4); +}); + +test("react: group carries its in-box members and resize updates membership", async ({ page }) => { + await page.goto("/snapline-group"); + await expect(page.locator(NODE)).toHaveCount(3); + await expect(page.locator("[data-snapline-type='group']")).toHaveCount(1); + // Seed: Node A and Node C inside, Node B outside. + await expect(page.locator("[data-member='true']")).toHaveCount(2); + + const nodeA = page.locator(NODE, { hasText: "Node A" }); + const nodeB = page.locator(NODE, { hasText: "Node B" }); + const beforeA = await nodeA.boundingBox(); + const beforeB = await nodeB.boundingBox(); + + // Move the group by its header: members ride, outsider stays. + const header = await centerOf(page.locator("[data-snapline-part='group-header']")); + await dragFromTo(page, header, { x: header.x + 120, y: header.y + 60 }); + const afterA = await nodeA.boundingBox(); + const afterB = await nodeB.boundingBox(); + expect(afterA!.x - beforeA!.x).toBeGreaterThan(90); + expect(Math.abs(afterB!.x - beforeB!.x)).toBeLessThan(8); + + // Resize the group over Node B: it becomes a member. + const box = await page.locator("[data-snapline-type='group']").boundingBox(); + const corner = { x: box!.x + box!.width - 3, y: box!.y + box!.height - 3 }; + await dragFromTo(page, corner, { x: corner.x + 200, y: corner.y }); + await expect(nodeB).toHaveAttribute("data-member", "true"); +}); diff --git a/tests/e2e/snapline-react.playwright.config.ts b/tests/e2e/snapline-react.playwright.config.ts index 2d42d6e..f0ea316 100644 --- a/tests/e2e/snapline-react.playwright.config.ts +++ b/tests/e2e/snapline-react.playwright.config.ts @@ -7,7 +7,7 @@ const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../.."); export default defineConfig({ testDir: ".", - testMatch: "node-react.spec.ts", + testMatch: ["node-react.spec.ts", "snapline-react-features.spec.ts"], fullyParallel: false, workers: 1, reporter: [["list"]], diff --git a/tests/e2e/snapline-resize.playwright.config.ts b/tests/e2e/snapline-resize.playwright.config.ts new file mode 100644 index 0000000..ac40a4b --- /dev/null +++ b/tests/e2e/snapline-resize.playwright.config.ts @@ -0,0 +1,28 @@ +import { defineConfig } from "@playwright/test"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const port = Number(process.env.SNAPLINE_RESIZE_TEST_PORT ?? 3032); +const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../.."); + +export default defineConfig({ + testDir: ".", + testMatch: "snapline-resize.spec.ts", + fullyParallel: false, + workers: 1, + reporter: [["list"]], + use: { + baseURL: `http://127.0.0.1:${port}`, + channel: "chrome", + screenshot: "only-on-failure", + trace: "retain-on-failure", + viewport: { width: 1280, height: 900 }, + }, + webServer: { + cwd: repoRoot, + command: `npx vite serve demo/svelte --config demo/svelte/vite.config.mjs --host 127.0.0.1 --port ${port} --strictPort --force`, + url: `http://127.0.0.1:${port}`, + reuseExistingServer: false, + timeout: 30_000, + }, +}); diff --git a/tests/e2e/snapline-resize.spec.ts b/tests/e2e/snapline-resize.spec.ts new file mode 100644 index 0000000..7d03617 --- /dev/null +++ b/tests/e2e/snapline-resize.spec.ts @@ -0,0 +1,131 @@ +import { expect, test, type Locator, type Page } from "@playwright/test"; + +// JS-driven node resize (SnapLine core): a virtual CircleCollider hitbox at the +// node's bottom-right corner. Pressing+dragging it resizes the node, and every +// resize re-glues the node's connector lines (same handling as a move + a size +// re-measure). + +async function centerOf(locator: Locator) { + const box = await locator.boundingBox(); + expect(box).not.toBeNull(); + return { x: box!.x + box!.width / 2, y: box!.y + box!.height / 2 }; +} + +async function dragFromTo(page: Page, from: { x: number; y: number }, to: { x: number; y: number }) { + await page.mouse.move(from.x, from.y); + await page.mouse.down(); + await page.mouse.move(to.x, to.y, { steps: 14 }); + await page.mouse.up(); +} + +async function waitForAnimationFrame(page: Page) { + await page.evaluate(() => new Promise((r) => requestAnimationFrame(() => r()))); +} + +async function lineStart(page: Page) { + return page.locator("[data-snapline-type='connector-line']").evaluate((svg) => { + const rect = svg.getBoundingClientRect(); + const transform = new DOMMatrixReadOnly(getComputedStyle(svg).transform); + const path = svg.querySelector("path"); + const numbers = path?.getAttribute("d")?.match(/-?\d+(?:\.\d+)?/g)?.map(Number) ?? []; + const p = new DOMPoint(numbers[0] ?? 0, numbers[1] ?? 0).matrixTransform(transform); + return { x: p.x + (rect.left - p.x), y: p.y + (rect.top - p.y) }; + }); +} + +function expectClose(a: { x: number; y: number }, b: { x: number; y: number }, tol = 6) { + expect(Math.abs(a.x - b.x)).toBeLessThanOrEqual(tol); + expect(Math.abs(a.y - b.y)).toBeLessThanOrEqual(tol); +} + +test.beforeEach(async ({ page }) => { + await page.goto("/snapline-resize"); + await expect(page.locator("[data-snapline-type='node']")).toHaveCount(3); +}); + +test("resizing a node keeps its connector line glued to the moved connector", async ({ page }) => { + const nodeA = page.locator("[data-snapline-type='node']", { hasText: "Resizable A" }); + const nodeB = page.locator("[data-snapline-type='node']", { hasText: "Fixed B" }); + const output = nodeA.locator("[data-snapline-name='output']"); + const input = nodeB.locator("[data-snapline-name='input']"); + + await dragFromTo(page, await centerOf(output), await centerOf(input)); + const line = page.locator("[data-snapline-type='connector-line']"); + await expect(line).toHaveCount(1); + await waitForAnimationFrame(page); + expectClose(await lineStart(page), await centerOf(output)); + + // Grow node A from its BR corner: the output connector (right edge) moves. + const before = await nodeA.boundingBox(); + const br = { x: before!.x + before!.width - 2, y: before!.y + before!.height - 2 }; + await dragFromTo(page, br, { x: br.x + 150, y: br.y + 90 }); + await waitForAnimationFrame(page); + + const after = await nodeA.boundingBox(); + expect(after!.width - before!.width).toBeGreaterThan(90); + expect(after!.height - before!.height).toBeGreaterThan(50); + // Line start followed the connector that moved with the resize. + expectClose(await lineStart(page), await centerOf(output)); +}); + +test("resize can be grabbed beyond the node's visual edge", async ({ page }) => { + const nodeA = page.locator("[data-snapline-type='node']", { hasText: "Resizable A" }); + const before = await nodeA.boundingBox(); + // Press OUTSIDE the node's box (BR + 6px) but inside the ~14px hitbox radius. + const outside = { x: before!.x + before!.width + 6, y: before!.y + before!.height + 6 }; + await dragFromTo(page, outside, { x: outside.x + 130, y: outside.y + 80 }); + await waitForAnimationFrame(page); + const after = await nodeA.boundingBox(); + expect(after!.width - before!.width).toBeGreaterThan(80); +}); + +test("a plain (non-resizable) node moves when grabbed at its BR corner", async ({ page }) => { + const nodeB = page.locator("[data-snapline-type='node']", { hasText: "Fixed B" }); + const before = await nodeB.boundingBox(); + const br = { x: before!.x + before!.width - 3, y: before!.y + before!.height - 3 }; + await dragFromTo(page, br, { x: br.x + 100, y: br.y + 70 }); + const after = await nodeB.boundingBox(); + expect(after!.x - before!.x).toBeGreaterThan(70); // moved + expect(Math.abs(after!.width - before!.width)).toBeLessThan(4); // not resized +}); + +test("tl anchor: dragging the top-left handle grows the box while the BR corner stays fixed", async ({ page }) => { + const nodeC = page.locator("[data-snapline-type='node']", { hasText: "TL Anchor C" }); + const before = await nodeC.boundingBox(); + const brBefore = { x: before!.x + before!.width, y: before!.y + before!.height }; + + // Press the TL corner (the anchor) and drag outward (up-left): grows the box. + const tl = { x: before!.x + 2, y: before!.y + 2 }; + await dragFromTo(page, tl, { x: tl.x - 90, y: tl.y - 60 }); + await waitForAnimationFrame(page); + + const after = await nodeC.boundingBox(); + expect(after!.width - before!.width).toBeGreaterThan(60); + expect(after!.height - before!.height).toBeGreaterThan(30); + // The OPPOSITE (bottom-right) corner must not move. + const brAfter = { x: after!.x + after!.width, y: after!.y + after!.height }; + expect(Math.abs(brAfter.x - brBefore.x)).toBeLessThanOrEqual(4); + expect(Math.abs(brAfter.y - brBefore.y)).toBeLessThanOrEqual(4); +}); + +test("tl anchor: the origin freezes once the min size is reached", async ({ page }) => { + const nodeC = page.locator("[data-snapline-type='node']", { hasText: "TL Anchor C" }); + const before = await nodeC.boundingBox(); + const brBefore = { x: before!.x + before!.width, y: before!.y + before!.height }; + + // Drag the TL handle far INWARD (down-right), past the min size clamp. + const tl = { x: before!.x + 2, y: before!.y + 2 }; + await dragFromTo(page, tl, { x: tl.x + 400, y: tl.y + 400 }); + await waitForAnimationFrame(page); + + const after = await nodeC.boundingBox(); + // Clamped at minWidth/minHeight (140x90 configured in the demo). + expect(Math.round(after!.width)).toBeGreaterThanOrEqual(140 - 2); + expect(Math.round(after!.width)).toBeLessThanOrEqual(140 + 6); + expect(Math.round(after!.height)).toBeGreaterThanOrEqual(90 - 2); + expect(Math.round(after!.height)).toBeLessThanOrEqual(90 + 6); + // The BR corner still never moved: origin shift derives from the CLAMPED size. + const brAfter = { x: after!.x + after!.width, y: after!.y + after!.height }; + expect(Math.abs(brAfter.x - brBefore.x)).toBeLessThanOrEqual(4); + expect(Math.abs(brAfter.y - brBefore.y)).toBeLessThanOrEqual(4); +}); diff --git a/website/src/lib/landing/components/hero/HeroToneJoystick.svelte b/website/src/lib/landing/components/hero/HeroToneJoystick.svelte index 864aa17..7d5de50 100644 --- a/website/src/lib/landing/components/hero/HeroToneJoystick.svelte +++ b/website/src/lib/landing/components/hero/HeroToneJoystick.svelte @@ -124,7 +124,7 @@ knobObject.event.input.dragStart = (prop: dragStartProp) => { if (!knobObject) return; - knobObject.global.data.allowCameraControl = false; + knobObject.global.suspend("cameraControl", knobObject.id); isDragging = true; dragStartX = knobObject.worldTransform.x; dragStartY = knobObject.worldTransform.y; @@ -148,7 +148,7 @@ }; knobObject.event.input.dragEnd = (_: dragEndProp) => { - if (knobObject) knobObject.global.data.allowCameraControl = true; + if (knobObject) knobObject.global.resume("cameraControl", knobObject.id); isDragging = false; }; }); diff --git a/website/src/lib/landing/components/highlights/CollisionCard.svelte b/website/src/lib/landing/components/highlights/CollisionCard.svelte index 68f5ae5..ea12128 100644 --- a/website/src/lib/landing/components/highlights/CollisionCard.svelte +++ b/website/src/lib/landing/components/highlights/CollisionCard.svelte @@ -722,7 +722,7 @@ return; } - object.global.data.allowCameraControl = false; + object.global.suspend("cameraControl", object.id); isDragging = true; dragStartX = object.worldTransform.x; dragStartY = object.worldTransform.y; @@ -738,7 +738,7 @@ object.event.input.dragEnd = () => { if (object) { - object.global.data.allowCameraControl = true; + object.global.resume("cameraControl", object.id); } isDragging = false; From 4bc22274d89f26f2a6f0c1a5527b88e5ce020e86 Mon Sep 17 00:00:00 2001 From: tfukaza Date: Thu, 23 Jul 2026 10:15:12 -0700 Subject: [PATCH 07/11] input: pointer claims replace the camera-suspension channel A gesture owner now blocks global input listeners at the dispatch layer: engine.input.claimPointer(pointerId), called from the owner's pointerDown handler. While claimed, that pointer's global pointerDown/Move and dragStart/drag are not delivered (owner dispatch unaffected), pinches involving the pointer are suppressed, and wheel is suppressed while any claim is held. End events (pointerUp/dragEnd/pinchEnd) always deliver so a global listener engaged before a late claim terminates cleanly. Claims anchor to the input layer's per-pointer records, which are cleaned up on pointer up/cancel regardless of owner liveness - so claims auto-release and cannot be stranded. This deletes every manual resume (dual release paths, destroy hooks) from node/connector/demo/website writers, removes the GlobalManager suspend/resume/isSuspended channel API (no consumers remain), and leaves the camera with zero knowledge of the mechanism (only the legacy third-party allowCameraControl boolean read remains). Per-pointer semantics: a second pointer can still pan or pinch the camera while the first is claimed. Co-Authored-By: Claude Fable 5 --- assets/asset-base/core/src/camera.ts | 40 ++++----- assets/snapline/AGENTS.md | 26 +++++- assets/snapline/core/src/connector.ts | 12 +-- assets/snapline/core/src/node.ts | 15 ++-- assets/snapline/core/src/snapline-globals.ts | 7 +- demo/svelte/src/lib/Drag.svelte | 8 +- src/global.ts | 30 ------- src/input.ts | 85 +++++++++++++++++-- tests/e2e/snapline-camera.spec.ts | 23 +++++ .../components/hero/HeroToneJoystick.svelte | 4 +- .../highlights/CollisionCard.svelte | 6 +- 11 files changed, 157 insertions(+), 99 deletions(-) diff --git a/assets/asset-base/core/src/camera.ts b/assets/asset-base/core/src/camera.ts index 751a9ae..f092cbb 100644 --- a/assets/asset-base/core/src/camera.ts +++ b/assets/asset-base/core/src/camera.ts @@ -266,11 +266,9 @@ class CameraControl extends ElementObject { ) { return; } - if ( - this.global.isSuspended("cameraControl") || - // Legacy channel: third parties may still write the shared boolean. - this.global.data.allowCameraControl === false - ) { + // Gesture owners block the camera at the input-dispatch layer (pointer + // claims); this legacy boolean remains for third-party writers only. + if (this.global.data.allowCameraControl === false) { return; } if (prop.isWithinEngine === false) { @@ -292,11 +290,9 @@ class CameraControl extends ElementObject { if (prop.event?.pointerId !== this.#panPointerId) { return; } - if ( - this.global.isSuspended("cameraControl") || - // Legacy channel: third parties may still write the shared boolean. - this.global.data.allowCameraControl === false - ) { + // Gesture owners block the camera at the input-dispatch layer (pointer + // claims); this legacy boolean remains for third-party writers only. + if (this.global.data.allowCameraControl === false) { return; } const dx = prop.position.screenX - this.#mouseDownX; @@ -370,11 +366,9 @@ class CameraControl extends ElementObject { if (this.config.panLock) { return; } - if ( - this.global.isSuspended("cameraControl") || - // Legacy channel: third parties may still write the shared boolean. - this.global.data.allowCameraControl === false - ) { + // Gesture owners block the camera at the input-dispatch layer (pointer + // claims); this legacy boolean remains for third-party writers only. + if (this.global.data.allowCameraControl === false) { return; } const camera = this.engine.camera; @@ -406,11 +400,9 @@ class CameraControl extends ElementObject { if (this.config.zoomLock && this.config.panLock) { return; } - if ( - this.global.isSuspended("cameraControl") || - // Legacy channel: third parties may still write the shared boolean. - this.global.data.allowCameraControl === false - ) { + // Gesture owners block the camera at the input-dispatch layer (pointer + // claims); this legacy boolean remains for third-party writers only. + if (this.global.data.allowCameraControl === false) { return; } this.#state = "pinching"; @@ -423,11 +415,9 @@ class CameraControl extends ElementObject { if (this.config.zoomLock && this.config.panLock) { return; } - if ( - this.global.isSuspended("cameraControl") || - // Legacy channel: third parties may still write the shared boolean. - this.global.data.allowCameraControl === false - ) { + // Gesture owners block the camera at the input-dispatch layer (pointer + // claims); this legacy boolean remains for third-party writers only. + if (this.global.data.allowCameraControl === false) { return; } const [pointer0, pointer1] = prop.current.pointerList; diff --git a/assets/snapline/AGENTS.md b/assets/snapline/AGENTS.md index a26f2d2..6a324f5 100644 --- a/assets/snapline/AGENTS.md +++ b/assets/snapline/AGENTS.md @@ -191,10 +191,28 @@ plumbing stays on the `event.*` slots. Everything SnapLine stores on the engine's shared `global.data` bag is declared in `core/src/snapline-globals.ts` (`SnapLineSharedData`) and accessed through its typed helpers. Engine core's `input.ts` reads `resizeHandles` duck-typed -(it cannot import snapline) — keep the two shapes in sync. Camera-control -suspension uses the owned-token channel API -(`global.suspend("cameraControl", token)` / `resume` / `isSuspended`), not the -deprecated `allowCameraControl` boolean. +(it cannot import snapline) — keep the two shapes in sync. + +### Pointer claims (camera blocking) + +Gesture owners block the camera (and any other GLOBAL input listener) at the +input-dispatch layer, not through a side-channel flag: call +`engine.input.claimPointer(pointerId)` from the gesture's **pointerDown** +handler (claiming at dragStart is legal, but the camera may already have +panned by the 3px drag-start threshold). While a pointer is claimed: + +- global `pointerDown`/`pointerMove`/`dragStart`/`drag` for that pointer are + not delivered; owner dispatch is unaffected; +- global pinches involving the claimed pointer are suppressed; +- global `mouseWheel` is suppressed while ANY claim is held (no camera + wheel-pan mid-drag); +- end events (`pointerUp`/`dragEnd`/`pinchEnd`) ALWAYS deliver, so a global + listener that engaged before a late claim can terminate cleanly. + +Claims are anchored to the input layer's per-pointer records and **die with +the gesture** (pointer up/cancel) — there is no release call to pair, and a +destroyed owner cannot strand a claim. The deprecated `allowCameraControl` +boolean remains readable by the camera for third-party writers only. ### Design limits (v1, by intent) diff --git a/assets/snapline/core/src/connector.ts b/assets/snapline/core/src/connector.ts index 9cdb3f8..940b3a6 100644 --- a/assets/snapline/core/src/connector.ts +++ b/assets/snapline/core/src/connector.ts @@ -317,9 +317,10 @@ class ConnectorComponent extends ElementObject { } startDragOutLine(prop: pointerDownProp): void { - // Suspend camera control while dragging a connection, mirroring node - // drags: without this, drawing a line under a Camera also pans the canvas. - this.global.suspend("cameraControl", this.id); + // Claim the pointer while dragging a connection, mirroring node drags: + // without this, drawing a line under a Camera also pans the canvas. The + // claim auto-releases when the gesture ends. + this.engine.input.claimPointer(prop.event.pointerId); let newLine = this.createLine(); newLine.setLineEnd(prop.position.x, prop.position.y); @@ -515,9 +516,6 @@ class ConnectorComponent extends ElementObject { } _endLineDragCleanup() { - // Release camera control after the line drag ends (see startDragOutLine). - this.global.resume("cameraControl", this.id); - this.#state = ConnectorState.IDLE; this.event.input.drag = null; this.event.input.dragEnd = null; @@ -576,8 +574,6 @@ class ConnectorComponent extends ElementObject { } destroy() { - // A mid-gesture unmount must not strand a camera suspension. - this.global.resume("cameraControl", this.id); this.deleteAllLines(); if (this.parent?._connectors[this.#name] === this) { delete this.parent._connectors[this.#name]; diff --git a/assets/snapline/core/src/node.ts b/assets/snapline/core/src/node.ts index 517cdf7..c4ee7cc 100644 --- a/assets/snapline/core/src/node.ts +++ b/assets/snapline/core/src/node.ts @@ -387,11 +387,11 @@ class NodeComponent extends ElementObject { return; } - // Suspend camera control from the very first pointer event: waiting for - // the drag-start threshold lets the camera pan by one move event before - // onDragStart runs. onUp / onDragEnd / destroy resume it; the token makes - // the dual release paths idempotent. - this.global.suspend("cameraControl", this.id); + // Claim the pointer from the very first pointer event: waiting for the + // drag-start threshold would let the camera pan by one move event before + // onDragStart runs. The claim auto-releases when the gesture ends, so no + // paired release is needed anywhere. + this.engine.input.claimPointer(e.event.pointerId); this._hasMoved = false; // Synchronous point test against this node's own resize hitbox (no reliance @@ -463,8 +463,6 @@ class NodeComponent extends ElementObject { } onDragEnd(prop: dragEndProp) { - // Release camera control after drag ends - this.global.resume("cameraControl", this.id); if (this._resizing) { this.#applyResizeDrag( @@ -511,7 +509,6 @@ class NodeComponent extends ElementObject { } onUp(_prop: pointerUpProp) { - this.global.resume("cameraControl", this.id); // pointerUp is dispatched to whatever is under the release point, which for a // resize may be a DIFFERENT node than the one being resized. Skip click-select @@ -593,8 +590,6 @@ class NodeComponent extends ElementObject { } destroy() { - // A mid-gesture unmount must not strand a camera suspension. - this.global.resume("cameraControl", this.id); for (const connector of Object.values(this._connectors)) { connector.deleteAllLines(); } diff --git a/assets/snapline/core/src/snapline-globals.ts b/assets/snapline/core/src/snapline-globals.ts index 45f6980..71b4235 100644 --- a/assets/snapline/core/src/snapline-globals.ts +++ b/assets/snapline/core/src/snapline-globals.ts @@ -29,9 +29,10 @@ export interface SnapLineSharedData { /** The node mid-resize, so an unrelated pointerUp doesn't click-select. */ resizingNode?: NodeComponent | null; /** - * @deprecated Legacy camera-control boolean (last-writer-wins). Superseded by - * `global.suspend("cameraControl", token)` — the camera still honors `false` - * for third-party writers. + * @deprecated Legacy camera-control boolean (last-writer-wins), read by the + * camera for third-party writers only. In-repo gesture owners block the + * camera at the input-dispatch layer instead: `engine.input.claimPointer()` + * (claims auto-release when the gesture ends). */ allowCameraControl?: boolean; } diff --git a/demo/svelte/src/lib/Drag.svelte b/demo/svelte/src/lib/Drag.svelte index 0c9f980..72abe71 100644 --- a/demo/svelte/src/lib/Drag.svelte +++ b/demo/svelte/src/lib/Drag.svelte @@ -61,8 +61,8 @@ // Drag event handlers object.event.input.dragStart = (prop: dragStartProp) => { if (!object) return; - // Disable camera control while dragging - object.global.suspend("cameraControl", object.id); + // Claim the pointer while dragging (auto-releases at gesture end). + object.engine.input.claimPointer(prop.pointerId); isDragging = true; dragStartX = object.worldTransform.x; @@ -92,10 +92,6 @@ }; object.event.input.dragEnd = (_: dragEndProp) => { - if (object) { - // Re-enable camera control after drag ends - object.global.resume("cameraControl", object.id); - } isDragging = false; diff --git a/src/global.ts b/src/global.ts index 1c92c92..9c406d9 100644 --- a/src/global.ts +++ b/src/global.ts @@ -30,7 +30,6 @@ class GlobalManager { #engineObjectTables: Map>; #data: any; #id: number; - #suspenders: Map>; currentStage: | "IDLE" @@ -46,7 +45,6 @@ class GlobalManager { this.#engineObjectTables = new Map(); this.#data = {}; this.#id = 0; - this.#suspenders = new Map(); this.currentStage = "IDLE"; this.queue = { READ_1: new Map(), @@ -233,34 +231,6 @@ class GlobalManager { return this.#data; } - /** - * Owned suspension channels. Unlike a shared boolean on `data` (last writer - * wins — an unrelated gesture ending could re-enable a channel another - * gesture still holds suspended), each suspender registers a token and the - * channel stays suspended until every token resumes. Tokens are idempotent: - * suspending twice with the same token holds one slot, and resuming a token - * that never suspended is a no-op — so dual release paths are safe. - */ - suspend(channel: string, token: string): void { - let tokens = this.#suspenders.get(channel); - if (!tokens) { - tokens = new Set(); - this.#suspenders.set(channel, tokens); - } - tokens.add(token); - } - - resume(channel: string, token: string): void { - const tokens = this.#suspenders.get(channel); - if (!tokens) return; - tokens.delete(token); - if (tokens.size === 0) this.#suspenders.delete(channel); - } - - isSuspended(channel: string): boolean { - return (this.#suspenders.get(channel)?.size ?? 0) > 0; - } - getEngineObjectTable(engine: Engine): Record { const table = this.#engineObjectTables.get(engine); if (!table) { diff --git a/src/input.ts b/src/input.ts index 18809d8..69de732 100644 --- a/src/input.ts +++ b/src/input.ts @@ -168,6 +168,15 @@ type GlobalCallbackRegistry = Record< type TrackedPointer = pointerData & { owner: ElementObject | null; currentOwner: ElementObject | null; + /** + * When true, GLOBAL listeners no longer receive this pointer's events + * (pointerDown/Move, dragStart/drag; pinches involving it; and wheel while + * any claim is held) — owner dispatch is unaffected, and end events + * (pointerUp/dragEnd/pinchEnd) always deliver so an already-engaged global + * listener can terminate cleanly. The claim dies with this entry (pointer + * up/cancel), so it can never be stranded by a destroyed owner. + */ + claimed: boolean; }; interface dragGesture { @@ -382,6 +391,42 @@ class InputControl { } } + /** + * Claims a pointer for its current gesture: GLOBAL listeners stop receiving + * that pointer's events (down/move, dragStart/drag; pinches involving it; + * wheel while any claim is held). Owner dispatch is unaffected, and end + * events (pointerUp/dragEnd/pinchEnd) still deliver so an already-engaged + * global listener can terminate cleanly. Call from a gesture owner's + * pointerDown handler (claiming at dragStart is legal but the camera may + * already have panned by the drag-start threshold). + * + * The claim is anchored to the input layer's pointer record and dies with it + * on pointer up/cancel — it auto-releases and cannot be stranded, even if + * the claiming object is destroyed mid-gesture. + */ + claimPointer(pointerId: number): void { + const pointer = this.#pointerDict[pointerId]; + if (pointer) pointer.claimed = true; + } + + /** Releases a claim early (rarely needed — claims auto-release on gesture end). */ + releasePointerClaim(pointerId: number): void { + const pointer = this.#pointerDict[pointerId]; + if (pointer) pointer.claimed = false; + } + + #isPointerClaimed(pointerId: number | undefined): boolean { + if (pointerId === undefined) return false; + return this.#pointerDict[pointerId]?.claimed === true; + } + + #hasClaimedPointer(): boolean { + for (const pointer of Object.values(this.#pointerDict)) { + if (pointer.claimed) return true; + } + return false; + } + subscribeGlobalCursorEvent( event: EventName, id: string, @@ -513,6 +558,7 @@ class InputControl { isWithinEngine, owner, currentOwner: owner, + claimed: false, }; this.#gestureDict[event.pointerId] = { @@ -531,7 +577,10 @@ class InputControl { }; this.#dispatchObjectEvent(owner, "pointerDown", prop); - this.#dispatchGlobalEvent("pointerDown", prop); + // An owner's pointerDown handler may have claimed the pointer just above. + if (!this.#isPointerClaimed(event.pointerId)) { + this.#dispatchGlobalEvent("pointerDown", prop); + } }; #onContainerPointerMove = (event: PointerEvent) => { @@ -565,7 +614,9 @@ class InputControl { }; this.#dispatchObjectEvent(currentOwner, "pointerMove", prop); - this.#dispatchGlobalEvent("pointerMove", prop); + if (!this.#isPointerClaimed(event.pointerId)) { + this.#dispatchGlobalEvent("pointerMove", prop); + } if (pointer) { Object.assign(pointer, { @@ -650,7 +701,11 @@ class InputControl { }; this.#dispatchObjectEvent(owner, "mouseWheel", prop); - this.#dispatchGlobalEvent("mouseWheel", prop); + // Wheel has no pointer identity; block it globally while any gesture holds + // a claim (e.g. no camera wheel-pan mid node-drag). + if (!this.#hasClaimedPointer()) { + this.#dispatchGlobalEvent("mouseWheel", prop); + } }; #getCoordinates(screenX: number, screenY: number): eventPosition { @@ -728,7 +783,9 @@ class InputControl { }; this.#dispatchObjectEvent(pointer.owner, "dragStart", prop); - this.#dispatchGlobalEvent("dragStart", prop); + if (!pointer.claimed) { + this.#dispatchGlobalEvent("dragStart", prop); + } } #fireDrag(pointer: TrackedPointer) { @@ -751,7 +808,9 @@ class InputControl { }; this.#dispatchObjectEvent(pointer.owner, "drag", prop); - this.#dispatchGlobalEvent("drag", prop); + if (!pointer.claimed) { + this.#dispatchGlobalEvent("drag", prop); + } } #fireDragEnd(pointer: TrackedPointer, button: number) { @@ -824,7 +883,12 @@ class InputControl { start: pinchStartGesture.start, }; this.#dispatchObjectEvent(pinchStartGesture.member, "pinchStart", prop); - this.#dispatchGlobalEvent("pinchStart", prop); + if ( + !this.#isPointerClaimed(pinchStartGesture.pointerId0) && + !this.#isPointerClaimed(pinchStartGesture.pointerId1) + ) { + this.#dispatchGlobalEvent("pinchStart", prop); + } } const gesture = this.#gestureDict[gestureKey] as pinchGesture; @@ -840,7 +904,14 @@ class InputControl { current: gesture.current, }; this.#dispatchObjectEvent(gesture.member, "pinch", prop); - this.#dispatchGlobalEvent("pinch", prop); + // A pinch involving a claimed pointer is suppressed globally; pinchEnd + // still delivers (end events always do) so engaged listeners clean up. + if ( + !this.#isPointerClaimed(gesture.pointerId0) && + !this.#isPointerClaimed(gesture.pointerId1) + ) { + this.#dispatchGlobalEvent("pinch", prop); + } } } diff --git a/tests/e2e/snapline-camera.spec.ts b/tests/e2e/snapline-camera.spec.ts index 36a4bae..6c5b3b1 100644 --- a/tests/e2e/snapline-camera.spec.ts +++ b/tests/e2e/snapline-camera.spec.ts @@ -162,3 +162,26 @@ test("connecting after pan and zoom still lands on the target connector", async await expect(line).toHaveCount(1); await expect(line.locator("path")).toHaveAttribute("d", /C/); }); + +test("wheel does not pan or zoom the camera mid node-drag (pointer claim blocks it)", async ({ page }) => { + await page.goto("/snapline-camera?wheelPan=1"); + await expect(page.locator("[data-snapline-type='node']")).toHaveCount(3); + const nodeA = page.locator("[data-snapline-type='node']", { hasText: "Node A" }); + const startBox = await nodeA.boundingBox(); + + // Hold a node drag, then wheel: the claim must suppress the camera globally. + await page.mouse.move(startBox!.x + 40, startBox!.y + 24); + await page.mouse.down(); + await page.mouse.move(startBox!.x + 90, startBox!.y + 60, { steps: 8 }); + const midDrag = await cameraTransform(page); + await page.mouse.wheel(120, 160); + await page.waitForTimeout(120); + expect(await cameraTransform(page)).toBe(midDrag); + await page.mouse.up(); + + // After the gesture ends the claim auto-releases: wheel pans again. + await page.mouse.move(900, 620); + const atRest = await cameraTransform(page); + await page.mouse.wheel(120, 160); + await expect.poll(() => cameraTransform(page)).not.toBe(atRest); +}); diff --git a/website/src/lib/landing/components/hero/HeroToneJoystick.svelte b/website/src/lib/landing/components/hero/HeroToneJoystick.svelte index 7d5de50..20cd18f 100644 --- a/website/src/lib/landing/components/hero/HeroToneJoystick.svelte +++ b/website/src/lib/landing/components/hero/HeroToneJoystick.svelte @@ -124,7 +124,8 @@ knobObject.event.input.dragStart = (prop: dragStartProp) => { if (!knobObject) return; - knobObject.global.suspend("cameraControl", knobObject.id); + // Claim the pointer while dragging (auto-releases at gesture end). + knobObject.engine.input.claimPointer(prop.pointerId); isDragging = true; dragStartX = knobObject.worldTransform.x; dragStartY = knobObject.worldTransform.y; @@ -148,7 +149,6 @@ }; knobObject.event.input.dragEnd = (_: dragEndProp) => { - if (knobObject) knobObject.global.resume("cameraControl", knobObject.id); isDragging = false; }; }); diff --git a/website/src/lib/landing/components/highlights/CollisionCard.svelte b/website/src/lib/landing/components/highlights/CollisionCard.svelte index ea12128..eafc312 100644 --- a/website/src/lib/landing/components/highlights/CollisionCard.svelte +++ b/website/src/lib/landing/components/highlights/CollisionCard.svelte @@ -722,7 +722,8 @@ return; } - object.global.suspend("cameraControl", object.id); + // Claim the pointer while dragging (auto-releases at gesture end). + object.engine.input.claimPointer(prop.pointerId); isDragging = true; dragStartX = object.worldTransform.x; dragStartY = object.worldTransform.y; @@ -737,9 +738,6 @@ }; object.event.input.dragEnd = () => { - if (object) { - object.global.resume("cameraControl", object.id); - } isDragging = false; }; From 29373b4ae4e14b0a49507023b9d4c0cd215c9687 Mon Sep 17 00:00:00 2001 From: tfukaza Date: Sat, 25 Jul 2026 13:27:14 -0700 Subject: [PATCH 08/11] WIP snapshot: visual-geometry invalidation, placement/query, docs site prep MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Broad working-tree snapshot committed ahead of rebasing onto origin/website-update: - snapsort: coalesced onVisualGeometryInvalidated container event (invalidation plumbing through drag/session, animations, and settle), plus a ghost-safe base Item.invalidateVisualGeometry (Item.rootContainer falls back to the item itself for detached ghost anchors; the missing method aborted the FLIP pass mid-loop, killing displaced-item animations for every entry after the ghost — upward-moving rows jumped) and an upward-reorder animation regression test - snapline: placement/query modules, nested group demo, framework adapters and package metadata churn - asset-base: camera config and adapter updates - docs/website: snapline docs, demo component, catalog and layout updates - publish workflow and package validation updates Co-Authored-By: Claude Fable 5 --- .github/workflows/publish-assets.yml | 15 + AGENTS.md | 11 +- assets/asset-base/AGENTS.md | 11 + assets/asset-base/core/src/camera.ts | 154 ++++ assets/asset-base/core/src/index.ts | 1 + assets/asset-base/react/src/Camera.tsx | 7 + assets/asset-base/svelte/src/Camera.svelte | 11 +- assets/snapline/AGENTS.md | 68 +- assets/snapline/core/README.md | 50 +- assets/snapline/core/package.json | 8 +- assets/snapline/core/src/connector.ts | 314 ++++++-- assets/snapline/core/src/group.ts | 435 ++++++++--- assets/snapline/core/src/index.ts | 76 +- assets/snapline/core/src/node.ts | 733 ++++++++++++++---- assets/snapline/core/src/placement.ts | 189 +++++ assets/snapline/core/src/query.ts | 45 ++ assets/snapline/core/src/select.ts | 95 ++- assets/snapline/core/src/snapline-globals.ts | 6 +- assets/snapline/react/README.md | 34 + assets/snapline/react/package.json | 12 +- assets/snapline/react/src/Connector.tsx | 23 +- assets/snapline/react/src/Group.tsx | 244 +++++- assets/snapline/react/src/Line.tsx | 31 +- assets/snapline/react/src/Node.tsx | 228 +++++- assets/snapline/react/src/Placement.tsx | 78 ++ assets/snapline/react/src/Select.tsx | 8 +- assets/snapline/react/src/index.ts | 4 +- assets/snapline/svelte/README.md | 35 +- assets/snapline/svelte/package.json | 11 +- assets/snapline/svelte/src/Connector.svelte | 21 +- assets/snapline/svelte/src/Group.svelte | 181 ++++- assets/snapline/svelte/src/Line.svelte | 31 +- assets/snapline/svelte/src/Node.svelte | 175 ++++- assets/snapline/svelte/src/Placement.svelte | 83 ++ assets/snapline/svelte/src/Select.svelte | 8 +- assets/snapline/svelte/src/index.ts | 1 + assets/snapsort/AGENTS.md | 6 +- assets/snapsort/core/README.md | 7 +- assets/snapsort/core/src/container.ts | 56 +- assets/snapsort/core/src/drag/session.ts | 24 + assets/snapsort/core/src/events.ts | 27 + assets/snapsort/core/src/index.ts | 2 + assets/snapsort/core/src/item.ts | 23 + demo/react/src/App.jsx | 15 +- demo/svelte/src/DemoRouter.svelte | 8 + .../node_ui_camera/NodeUICameraDemo.svelte | 8 +- demo/svelte/src/demo/node_ui_demo/Math.svelte | 7 +- .../src/demo/node_ui_demo/NodeUIDemo.svelte | 2 +- .../src/demo/node_ui_demo/SimpleNode.svelte | 4 +- .../demo/node_ui_group/NodeUIGroupDemo.svelte | 18 +- .../NodeUINestedGroupDemo.svelte | 82 ++ .../node_ui_resize/NodeUIResizeDemo.svelte | 2 +- .../demo/node_ui_resize/ResizableNode.svelte | 4 +- docs/index.mdx | 5 +- docs/snapengine/reference/camera.mdx | 20 + docs/snapline/guides/01_core_concepts.mdx | 41 + docs/snapline/guides/02_selection_resize.mdx | 64 ++ docs/snapline/guides/03_groups.mdx | 44 ++ docs/snapline/guides/04_placement_camera.mdx | 38 + .../guides/05_state_styling_accessibility.mdx | 51 ++ docs/snapline/introduction/01_setup.mdx | 88 +++ docs/snapline/introduction/index.mdx | 43 + docs/snapline/reference/index.mdx | 19 + docs/snapline/reference/react/group.mdx | 21 + docs/snapline/reference/react/index.mdx | 28 + docs/snapline/reference/react/placement.mdx | 17 + docs/snapline/reference/svelte/group.mdx | 21 + docs/snapline/reference/svelte/index.mdx | 28 + docs/snapline/reference/svelte/placement.mdx | 17 + docs/snapline/reference/vanilla/group.mdx | 23 + docs/snapline/reference/vanilla/index.mdx | 33 + docs/snapline/reference/vanilla/placement.mdx | 22 + package-lock.json | 13 +- package.json | 2 +- scripts/validate-packages.mjs | 31 + src/engine.ts | 20 + src/index.ts | 4 + tests/e2e/docs-framework-code.spec.ts | 59 ++ tests/e2e/node.spec.ts | 109 ++- tests/e2e/snapline-camera.spec.ts | 71 ++ tests/e2e/snapline-group.spec.ts | 113 ++- tests/e2e/snapline-resize.spec.ts | 53 ++ tests/e2e/snapsort-drag-snapshot.spec.ts | 139 ++++ .../lib/components/docs/SnapLineDemo.svelte | 279 +++++++ website/src/lib/docsCatalog.ts | 57 +- website/src/lib/server/docsMarkdown.ts | 4 +- website/src/routes/+layout.svelte | 95 +-- .../src/routes/docs/[...slug]/+page.svelte | 31 +- website/src/routes/docs/[...slug]/+page.ts | 10 +- .../routes/docs/[project]/llms.txt/+server.ts | 5 +- 90 files changed, 4746 insertions(+), 704 deletions(-) create mode 100644 assets/snapline/core/src/placement.ts create mode 100644 assets/snapline/core/src/query.ts create mode 100644 assets/snapline/react/README.md create mode 100644 assets/snapline/react/src/Placement.tsx create mode 100644 assets/snapline/svelte/src/Placement.svelte create mode 100644 demo/svelte/src/demo/node_ui_group/NodeUINestedGroupDemo.svelte create mode 100644 docs/snapline/guides/01_core_concepts.mdx create mode 100644 docs/snapline/guides/02_selection_resize.mdx create mode 100644 docs/snapline/guides/03_groups.mdx create mode 100644 docs/snapline/guides/04_placement_camera.mdx create mode 100644 docs/snapline/guides/05_state_styling_accessibility.mdx create mode 100644 docs/snapline/introduction/01_setup.mdx create mode 100644 docs/snapline/introduction/index.mdx create mode 100644 docs/snapline/reference/index.mdx create mode 100644 docs/snapline/reference/react/group.mdx create mode 100644 docs/snapline/reference/react/index.mdx create mode 100644 docs/snapline/reference/react/placement.mdx create mode 100644 docs/snapline/reference/svelte/group.mdx create mode 100644 docs/snapline/reference/svelte/index.mdx create mode 100644 docs/snapline/reference/svelte/placement.mdx create mode 100644 docs/snapline/reference/vanilla/group.mdx create mode 100644 docs/snapline/reference/vanilla/index.mdx create mode 100644 docs/snapline/reference/vanilla/placement.mdx create mode 100644 website/src/lib/components/docs/SnapLineDemo.svelte diff --git a/.github/workflows/publish-assets.yml b/.github/workflows/publish-assets.yml index 5723ecc..4139fc4 100644 --- a/.github/workflows/publish-assets.yml +++ b/.github/workflows/publish-assets.yml @@ -9,6 +9,9 @@ on: - 'snapsort-v*' - 'snapsort-svelte-v*' - 'snapsort-react-v*' + - 'snapline-v*' + - 'snapline-svelte-v*' + - 'snapline-react-v*' jobs: publish: @@ -61,6 +64,18 @@ jobs: package_dir="assets/snapsort/react" tag_version="${GITHUB_REF_NAME#snapsort-react-v}" ;; + snapline-v*) + package_dir="assets/snapline/core" + tag_version="${GITHUB_REF_NAME#snapline-v}" + ;; + snapline-svelte-v*) + package_dir="assets/snapline/svelte" + tag_version="${GITHUB_REF_NAME#snapline-svelte-v}" + ;; + snapline-react-v*) + package_dir="assets/snapline/react" + tag_version="${GITHUB_REF_NAME#snapline-react-v}" + ;; *) echo "Unsupported release tag: $GITHUB_REF_NAME" exit 1 diff --git a/AGENTS.md b/AGENTS.md index 4b70033..86d0bdb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -60,9 +60,9 @@ Organized as npm workspaces following a consistent pattern: - See `assets/snapsort/AGENTS.md` ### 3. SnapLine -- **Packages:** `@snap-engine/snapline`, `@snap-engine/snapline-svelte` +- **Packages:** `@snap-engine/snapline`, `@snap-engine/snapline-svelte`, `@snap-engine/snapline-react` - **Purpose:** Node graph UI system -- **Status:** Experimental and private (not published) +- **Status:** Experimental public package - See `assets/snapline/AGENTS.md` ### 4. SnapZap @@ -180,12 +180,19 @@ git tag asset-base-svelte-v{version} git tag asset-base-react-v{version} git tag snapsort-v{version} git tag snapsort-svelte-v{version} +git tag snapsort-react-v{version} +git tag snapline-v{version} +git tag snapline-svelte-v{version} +git tag snapline-react-v{version} git push origin asset-base-v{version} git push origin asset-base-svelte-v{version} git push origin asset-base-react-v{version} git push origin snapsort-v{version} git push origin snapsort-svelte-v{version} git push origin snapsort-react-v{version} +git push origin snapline-v{version} +git push origin snapline-svelte-v{version} +git push origin snapline-react-v{version} ``` Push release tags one at a time and verify each publish workflow before sending the next tag. diff --git a/assets/asset-base/AGENTS.md b/assets/asset-base/AGENTS.md index 24cd7aa..ca2463e 100644 --- a/assets/asset-base/AGENTS.md +++ b/assets/asset-base/AGENTS.md @@ -78,6 +78,17 @@ asset-base/ **Configuration:** - `zoomLock?: boolean` - Disable zoom - `panLock?: boolean` - Disable pan +- `edgePan?: CameraEdgePanConfig` - Opt-in programmatic edge panning for drag owners + +**Edge-pan API:** +- `startEdgePan(pointerId, position, onFrame)` begins a pointer-owned request +- `updateEdgePan(pointerId, position)` updates the screen-space pointer +- `stopEdgePan(pointerId)` ends it + +The controller registers itself on `engine.edgePanController`. Motion is +continuous while the pointer remains in the configured edge zone, and +`onFrame` receives recomputed world coordinates after every camera move so a +drag owner can stay glued to a stationary pointer. ### Background **Extends:** `ElementObject` diff --git a/assets/asset-base/core/src/camera.ts b/assets/asset-base/core/src/camera.ts index f092cbb..a346f9f 100644 --- a/assets/asset-base/core/src/camera.ts +++ b/assets/asset-base/core/src/camera.ts @@ -4,6 +4,8 @@ import type { pointerUpProp, mouseWheelProp, pinchProp, + eventPosition, + EdgePanController, } from "@snap-engine/core"; import { ElementObject } from "@snap-engine/core"; import { Camera } from "@snap-engine/core"; @@ -51,6 +53,15 @@ export type CameraPointerConfig = { panLock?: boolean | "touch"; }; +export type CameraEdgePanConfig = { + /** Enables edge-panning for consumers that explicitly request it. */ + enabled?: boolean; + /** Screen-pixel width of the activation zone at each viewport edge. */ + edgeDistance?: number; + /** Maximum camera speed in screen pixels per second. */ + maxSpeed?: number; +}; + export type CameraControlConfig = { zoomLock?: boolean; panLock?: boolean; @@ -58,6 +69,8 @@ export type CameraControlConfig = { wheel?: CameraWheelConfig; /** Pointer behavior, grouped. Wins over the flat deprecated aliases. */ pointer?: CameraPointerConfig; + /** Programmatic edge-pan behavior used by drag owners such as SnapLine. */ + edgePan?: CameraEdgePanConfig; /** @deprecated Use `pointer.panLock` instead. */ pointerPanLock?: boolean | "touch"; /** @deprecated Use `wheel.zoomModifier` instead. */ @@ -133,6 +146,13 @@ class CameraControl extends ElementObject { #mouseDownY: number; #panPointerId: number | null = null; #pinchAnchor: PinchAnchor | null = null; + #edgePanRequest: { + pointerId: number; + position: eventPosition; + onFrame: (position: eventPosition) => void; + } | null = null; + #edgePanFrameId: number | null = null; + #edgePanTimestamp: number | null = null; config: CameraControlConfig = {}; @@ -144,6 +164,7 @@ class CameraControl extends ElementObject { this.#mouseDownX = 0; this.#mouseDownY = 0; this.#state = "idle"; + this.engine.edgePanController = this as EdgePanController; this.event.global.pointerDown = this.onCursorDown; this.event.global.pointerMove = this.onCursorMove; this.event.global.pointerUp = this.onCursorUp; @@ -239,6 +260,128 @@ class CameraControl extends ElementObject { }); } + startEdgePan( + pointerId: number, + position: eventPosition, + onFrame: (position: eventPosition) => void, + ): void { + if (!this.config.edgePan?.enabled) { + return; + } + this.#edgePanRequest = { pointerId, position, onFrame }; + this.#edgePanTimestamp = null; + this.#scheduleEdgePanFrame(); + } + + updateEdgePan(pointerId: number, position: eventPosition): void { + if (!this.config.edgePan?.enabled) { + this.stopEdgePan(pointerId); + return; + } + if (!this.#edgePanRequest) { + return; + } + if (this.#edgePanRequest.pointerId !== pointerId) { + return; + } + this.#edgePanRequest.position = position; + this.#scheduleEdgePanFrame(); + } + + stopEdgePan(pointerId: number): void { + if ( + this.#edgePanRequest && + this.#edgePanRequest.pointerId !== pointerId + ) { + return; + } + this.#edgePanRequest = null; + this.#edgePanTimestamp = null; + if (this.#edgePanFrameId != null) { + cancelAnimationFrame(this.#edgePanFrameId); + this.#edgePanFrameId = null; + } + } + + #scheduleEdgePanFrame(): void { + if (this.#edgePanFrameId != null || !this.#edgePanRequest) { + return; + } + this.#edgePanFrameId = requestAnimationFrame(this.#runEdgePanFrame); + } + + #runEdgePanFrame = (timestamp: number): void => { + this.#edgePanFrameId = null; + const request = this.#edgePanRequest; + const camera = this.engine.camera; + const config = this.config.edgePan; + if (!request || !camera || !config?.enabled) { + this.#edgePanTimestamp = null; + return; + } + + const edgeDistance = Math.max(1, config.edgeDistance ?? 48); + const maxSpeed = Math.max(0, config.maxSpeed ?? 600); + const left = camera.containerOffsetX; + const top = camera.containerOffsetY; + const right = left + camera.cameraWidth; + const bottom = top + camera.cameraHeight; + const axisSpeed = (value: number, min: number, max: number): number => { + if (value < min + edgeDistance) { + return -Math.min(1, (min + edgeDistance - value) / edgeDistance); + } + if (value > max - edgeDistance) { + return Math.min(1, (value - (max - edgeDistance)) / edgeDistance); + } + return 0; + }; + const velocityX = + axisSpeed(request.position.screenX, left, right) * maxSpeed; + const velocityY = + axisSpeed(request.position.screenY, top, bottom) * maxSpeed; + const previousTimestamp = this.#edgePanTimestamp ?? timestamp; + const elapsedSeconds = + Math.min(32, Math.max(0, timestamp - previousTimestamp)) / 1000; + this.#edgePanTimestamp = timestamp; + + if ( + !this.config.panLock && + (velocityX !== 0 || velocityY !== 0) && + elapsedSeconds > 0 + ) { + camera.handlePan( + velocityX * elapsedSeconds, + velocityY * elapsedSeconds, + ); + this.paintCamera(); + request.onFrame( + this.#positionFromScreen( + request.position.screenX, + request.position.screenY, + ), + ); + } + + this.#scheduleEdgePanFrame(); + }; + + #positionFromScreen(screenX: number, screenY: number): eventPosition { + const camera = this.engine.camera; + if (!camera) { + return { + x: screenX, + y: screenY, + cameraX: screenX, + cameraY: screenY, + screenX, + screenY, + }; + } + const [cameraX, cameraY] = camera.getCameraFromScreen(screenX, screenY); + const [x, y] = camera.getWorldFromCamera(cameraX, cameraY); + return { x, y, cameraX, cameraY, screenX, screenY }; + } + // Event Handlers onCursorDown(prop: pointerDownProp) { @@ -306,6 +449,7 @@ class CameraControl extends ElementObject { } onCursorUp(prop: pointerUpProp) { + this.stopEdgePan(prop.event.pointerId); if (this.#state != "panning") { return; } @@ -471,6 +615,16 @@ class CameraControl extends ElementObject { this.#pinchAnchor = null; } + destroy(removeDom: boolean = true) { + if (this.#edgePanRequest) { + this.stopEdgePan(this.#edgePanRequest.pointerId); + } + if (this.engine.edgePanController === this) { + this.engine.edgePanController = null; + } + super.destroy(removeDom); + } + #createPinchAnchor(center: { x: number; y: number }, distance: number) { const camera = this.engine.camera!; return { diff --git a/assets/asset-base/core/src/index.ts b/assets/asset-base/core/src/index.ts index c7588f9..a0b6f8d 100644 --- a/assets/asset-base/core/src/index.ts +++ b/assets/asset-base/core/src/index.ts @@ -3,6 +3,7 @@ export type { CameraControlConfig, CameraWheelConfig, CameraPointerConfig, + CameraEdgePanConfig, ResolvedCameraOptions, } from "./camera"; export { Background } from "./background"; diff --git a/assets/asset-base/react/src/Camera.tsx b/assets/asset-base/react/src/Camera.tsx index f00a1d3..4a7802b 100644 --- a/assets/asset-base/react/src/Camera.tsx +++ b/assets/asset-base/react/src/Camera.tsx @@ -12,6 +12,7 @@ import { } from "react"; import { CameraControl } from "@snap-engine/asset-base"; import type { + CameraEdgePanConfig, CameraWheelConfig, CameraPointerConfig, } from "@snap-engine/asset-base"; @@ -56,6 +57,8 @@ export interface CameraProps wheel?: CameraWheelConfig; /** Pointer behavior, grouped. Wins over the flat deprecated props. */ pointer?: CameraPointerConfig; + /** Programmatic edge-pan behavior for drag owners such as SnapLine. */ + edgePan?: CameraEdgePanConfig; zoomLock?: boolean; } @@ -87,6 +90,7 @@ export const Camera = forwardRef(function Camera( panButton = "left", wheel = undefined, pointer = undefined, + edgePan = undefined, style, zoomLock = false, ...divProps @@ -123,6 +127,7 @@ export const Camera = forwardRef(function Camera( panButton, wheel, pointer, + edgePan, camera: cameraConfig, }); ownedCameraControlRef.current = cameraControl; @@ -194,6 +199,7 @@ export const Camera = forwardRef(function Camera( panButton, wheel, pointer, + edgePan, }; }, [ activeCameraControl, @@ -207,6 +213,7 @@ export const Camera = forwardRef(function Camera( panButton, wheel, pointer, + edgePan, ]); // Bounds often depend on measured layout, so keep applying them as they change. diff --git a/assets/asset-base/svelte/src/Camera.svelte b/assets/asset-base/svelte/src/Camera.svelte index 1d0c854..bb0f0c3 100644 --- a/assets/asset-base/svelte/src/Camera.svelte +++ b/assets/asset-base/svelte/src/Camera.svelte @@ -9,7 +9,11 @@ } from "svelte"; import type { HTMLAttributes } from "svelte/elements"; import { CameraControl as CameraControlObject } from "@snap-engine/asset-base"; - import type { CameraWheelConfig, CameraPointerConfig } from "@snap-engine/asset-base"; + import type { + CameraEdgePanConfig, + CameraWheelConfig, + CameraPointerConfig, + } from "@snap-engine/asset-base"; import type { CameraConfig, Engine } from "@snap-engine/core"; type CameraProps = Omit, "children"> & { @@ -33,6 +37,8 @@ wheel?: CameraWheelConfig; /** Pointer behavior, grouped. Wins over the flat deprecated props. */ pointer?: CameraPointerConfig; + /** Programmatic edge-pan behavior for drag owners such as SnapLine. */ + edgePan?: CameraEdgePanConfig; /** Options forwarded to the underlying Camera, e.g. zoomBounds and contentBounds. */ cameraConfig?: CameraConfig; cameraControl?: CameraControlObject | null; @@ -53,6 +59,7 @@ panButton = "left", wheel = undefined, pointer = undefined, + edgePan = undefined, cameraConfig, cameraControl = $bindable(null), style = "", @@ -76,6 +83,7 @@ panButton, wheel, pointer, + edgePan, camera: cameraConfig, })); const cameraControlInstance = @@ -105,6 +113,7 @@ panButton, wheel, pointer, + edgePan, }; }); diff --git a/assets/snapline/AGENTS.md b/assets/snapline/AGENTS.md index 6a324f5..c52e64d 100644 --- a/assets/snapline/AGENTS.md +++ b/assets/snapline/AGENTS.md @@ -4,8 +4,9 @@ Node-based graph UI system for creating visual programming interfaces, node editors, and flow-based applications. -SnapLine is experimental. Its core, Svelte, and React workspace packages are -private and are intentionally excluded from npm publish workflows. +SnapLine is experimental and published as synchronized core, Svelte, and React +packages. Breaking changes are allowed before 1.0 and should replace obsolete +APIs directly rather than adding compatibility shims. ## Packages @@ -15,11 +16,12 @@ private and are intentionally excluded from npm publish workflows. **Dependencies:** `@snap-engine/core` **Exports:** -- `NodeComponent` - Graph node with connectors (opt-in corner resize via `resizable`) +- `NodeComponent` - Graph node with connectors (opt-in eight-direction resize) - `ConnectorComponent` - Input/output connector - `LineComponent` - Visual connection line - `GroupNodeComponent` - Resizable box that carries the nodes inside it - `RectSelectComponent` - Rectangle selection tool +- `PlacementController` - Headless pointer-follow placement state machine - `snapline-globals` - Typed accessors for the shared `global.data` registries ### @snap-engine/snapline-svelte @@ -29,9 +31,19 @@ private and are intentionally excluded from npm publish workflows. **Exports:** - `Node.svelte` - Node component +- `Group.svelte` - Exclusive nested group component - `Connector.svelte` - Connector component - `Line.svelte` - Connection line component - `Select.svelte` - Rectangle selection component +- `Placement.svelte` - Placement controller binding and preview + +### @snap-engine/snapline-react +**Location:** `react/src/` +**Language:** React/TypeScript +**Dependencies:** `@snap-engine/snapline`, `@snap-engine/core` + +Exports `Engine`, `Node`, `Group`, `Connector`, `Line`, `Select`, and +`Placement`, with forwarded refs to core objects where applicable. ## File Structure @@ -160,12 +172,15 @@ elements** — frameworks recover fine from property changes. Concretely: - **Node width/height** are framework-rendered: core fires - `nodeCallback.onSizeChange(w, h)` during a resize drag and the adapter binds + `callbacks.onSizeChange({node, width, height})` during a resize drag and the adapter binds the size as state. Core only updates its collision hitboxes synchronously (`setSizeState`). The connector/line re-glue closes itself through the ResizeObserver after the framework's DOM write reflows. +- **Initial node geometry** is explicit: after assigning a committed framework + element, adapters call `syncDomGeometry()`. ResizeObserver remains the + ongoing invalidation path, not the initial-mount handshake. - **The rubber-band selection box** is framework-rendered: core fires - `selectCallback.onRectChange({x, y, width, height, visible})` and the adapter + `callbacks.onRectChange({x, y, width, height, visible})` and the adapter draws (and can restyle/replace) the box. Deliberately NO flush handshake — the box visual is not paint-atomic. - **Node drag transforms, `data-selected` attributes, and line SVG transforms** @@ -180,11 +195,19 @@ Concretely: ### Callback conventions Domain/lifecycle callbacks live in `EventProxyFactory` dictionaries — -`nodeCallback` (`onSizeChange`, `onResizeCommit`, `onLinesChanged`), -`groupCallback` (`onMemberEnter`, `onMemberLeave`, `onDragCommit`), -`selectCallback` (`onRectChange`), `connectorCallback` (connect/disconnect). -`setLineListCallback` and `_onResizeCommit` are deprecated shims. Raw input/DOM -plumbing stays on the `event.*` slots. +Configuration owns plain callback objects. Node callbacks report drag, +selection, resize, and line-list events; group callbacks report membership +deltas; selection callbacks decide whether rubber-band selection may start; +connector callbacks provide connection policy plus drag/candidate/connect/ +disconnect lifecycle events. Events carry component references, metadata, and +explicit origins/reasons so consumers never need teardown heuristics. + +SnapLine deliberately does not define port types, graph-document mutations, +palette contents, or node factories. Consumers express those policies through +metadata and predicates such as `canConnect`, `canContain`, and `canStart`. +`PlacementController` similarly computes preview/commit coordinates but leaves +rendering and creation to framework adapters and consumer callbacks. +Raw input/DOM plumbing stays on the `event.*` slots. ### Shared global registries @@ -214,10 +237,17 @@ the gesture** (pointer up/cancel) — there is no release call to pair, and a destroyed owner cannot strand a claim. The deprecated `allowCameraControl` boolean remains readable by the camera for third-party writers only. -### Design limits (v1, by intent) - -- Groups never join other groups (nested groups are excluded in - `computeMembers`). +### Group invariants + +- Ordinary nodes use center containment; nested groups require full-bounds + containment. `canContain` may reject any otherwise eligible node or group. +- Each node has at most one resolved direct parent group. `members` and + membership callbacks describe that direct relation; `descendants` exposes + the recursive tree. Consumers may replace innermost-parent selection through + `setGroupMembershipResolver`. +- Drag carry recursively flattens and deduplicates nested group descendants. +- Equal-size group candidates use stable IDs as a deterministic tie-breaker; + membership cycles are always rejected. - Carried group members are moved via transform parenting only — they are never added to `global.data.select`, so a group drag does not alter the selection. - `attachTransformToGroup`/`detachTransformFromGroup` are the public @@ -240,6 +270,16 @@ boolean remains readable by the camera for third-party writers only. - `-1`: Unlimited connections - `0`: No incoming (output only) - `N`: Maximum N incoming connections +- A new connection to a full finite input evicts the oldest live incoming + line(s) required to make room. Disconnect callbacks fire before the new + connect callbacks. + +### Camera edge-pan + +When an engine exposes an enabled `edgePanController`, connector-line drags and +node/group move drags request edge-panning automatically. The controller feeds +updated world coordinates back into the active drag every frame. Selection and +resize gestures intentionally do not edge-pan. ## Dependencies diff --git a/assets/snapline/core/README.md b/assets/snapline/core/README.md index 89abb5f..07c8f42 100644 --- a/assets/snapline/core/README.md +++ b/assets/snapline/core/README.md @@ -1,22 +1,50 @@ # @snap-engine/snapline -Core TypeScript logic for SnapEngine node graph interfaces. +Framework-neutral node graph interaction primitives for SnapEngine. + +SnapLine provides draggable and resizable nodes, connector policy, SVG line +geometry, rectangle selection, exclusive nested groups, engine queries, and +headless palette placement. Applications retain ownership of graph documents, +node types, validation, persistence, and styling. ## Install ```bash -npm install @snap-engine/snapline @snap-engine/core +npm install @snap-engine/core @snap-engine/snapline ``` -## Includes - -- `NodeComponent` -- `ConnectorComponent` -- `LineComponent` -- `RectSelectComponent` +## Entry points -## Usage +- `@snap-engine/snapline` +- `@snap-engine/snapline/node` +- `@snap-engine/snapline/connector` +- `@snap-engine/snapline/line` +- `@snap-engine/snapline/select` +- `@snap-engine/snapline/group` +- `@snap-engine/snapline/placement` +- `@snap-engine/snapline/query` ```ts -import { NodeComponent } from "@snap-engine/snapline"; -``` \ No newline at end of file +import { + GroupNodeComponent, + NodeComponent, + getParentGroup, + setGroupMembershipResolver, +} from "@snap-engine/snapline"; +``` + +After assigning a Vanilla-rendered element, call `syncDomGeometry()`. Svelte +and React adapters perform that synchronization automatically. + +When another interaction system applies transient transforms inside a node, +call `connector.requestDomGeometrySync()` for each affected connector. The +request is coalesced into the next read/write cycle and updates every connected +line without coupling SnapLine to the external system. + +Groups maintain an exclusive direct parent. Ordinary nodes use center +containment, nested groups use full-bounds containment, and the smallest safe +candidate wins unless an engine-level resolver overrides it. + +SnapLine `0.3` is experimental and may make breaking changes before `1.0`. + +Full documentation: https://snapengine.dev/docs/snapline/introduction diff --git a/assets/snapline/core/package.json b/assets/snapline/core/package.json index 0a533df..98c721f 100644 --- a/assets/snapline/core/package.json +++ b/assets/snapline/core/package.json @@ -1,7 +1,6 @@ { "name": "@snap-engine/snapline", - "private": true, - "version": "0.2.0", + "version": "0.3.0", "repository": { "type": "git", "url": "git+https://github.com/tfukaza/SnapEngineJS.git", @@ -16,7 +15,10 @@ "./node": "./src/node.ts", "./connector": "./src/connector.ts", "./line": "./src/line.ts", - "./select": "./src/select.ts" + "./select": "./src/select.ts", + "./group": "./src/group.ts", + "./placement": "./src/placement.ts", + "./query": "./src/query.ts" }, "files": [ "src", diff --git a/assets/snapline/core/src/connector.ts b/assets/snapline/core/src/connector.ts index 940b3a6..1f1063c 100644 --- a/assets/snapline/core/src/connector.ts +++ b/assets/snapline/core/src/connector.ts @@ -2,12 +2,58 @@ import { ElementObject, BaseObject } from "@snap-engine/core"; import { NodeComponent } from "./node"; import { LineComponent } from "./line"; import type { pointerDownProp, dragProp, dragEndProp } from "@snap-engine/core"; +import type { eventPosition } from "@snap-engine/core"; import { Collider, CircleCollider, PointCollider, } from "@snap-engine/core/collision"; -import { EventProxyFactory } from "@snap-engine/core"; +export type SnapLineMetadata = Record; +export type ConnectionOrigin = "gesture" | "programmatic"; +export type DisconnectReason = + | "gesture" + | "replacement" + | "programmatic" + | "teardown"; +export type ConnectorRole = "source" | "target"; + +export interface ConnectorPairEvent { + source: ConnectorComponent; + target: ConnectorComponent; +} + +export interface ConnectorCandidateEvent { + source: ConnectorComponent; + candidate: ConnectorComponent | null; +} + +export interface ConnectorConnectionEvent extends ConnectorPairEvent { + connector: ConnectorComponent; + peer: ConnectorComponent; + line: LineComponent; + role: ConnectorRole; + origin: ConnectionOrigin; +} + +export interface ConnectorDisconnectionEvent + extends Omit { + reason: DisconnectReason; +} + +export interface ConnectorDragEvent { + connector: ConnectorComponent; + position: eventPosition; + pointerId: number; +} + +export interface ConnectorCallbacks { + canConnect?: (event: ConnectorPairEvent) => boolean; + onDragStart?: (event: ConnectorDragEvent) => void; + onCandidateChange?: (event: ConnectorCandidateEvent) => void; + onConnect?: (event: ConnectorConnectionEvent) => void; + onDisconnect?: (event: ConnectorDisconnectionEvent) => void; + onDragEnd?: (event: ConnectorDragEvent & { connected: boolean }) => void; +} enum ConnectorState { IDLE, @@ -20,13 +66,10 @@ export interface ConnectorConfig { allowDragOut?: boolean; lineClass?: typeof LineComponent; colliderRadius?: number; -} - -interface ConnectorCallback { - onConnectOutgoing: null | ((connector: ConnectorComponent) => void); - onConnectIncoming: null | ((connector: ConnectorComponent) => void); - onDisconnectOutgoing: null | ((connector: ConnectorComponent) => void); - onDisconnectIncoming: null | ((connector: ConnectorComponent) => void); + metadata?: SnapLineMetadata; + callbacks?: ConnectorCallbacks; + /** Allows this connector gesture to use the engine's configured edge pan. */ + edgePan?: boolean; } class ConnectorComponent extends ElementObject { @@ -41,10 +84,11 @@ class ConnectorComponent extends ElementObject { #mouseHitBox: PointCollider; #targetConnector: ConnectorComponent | null = null; + #edgePanPointerId: number | null = null; #localCenter: { x: number; y: number }; #hasMeasuredCenter = false; - #connectorCallback: ConnectorCallback | null = null; + #callbacks: ConnectorCallbacks; get parent(): NodeComponent { return super.parent as NodeComponent; @@ -94,13 +138,7 @@ class ConnectorComponent extends ElementObject { ); }; - this.#connectorCallback = { - onConnectOutgoing: null, - onConnectIncoming: null, - onDisconnectOutgoing: null, - onDisconnectIncoming: null, - }; - this.#connectorCallback = EventProxyFactory(this, this.#connectorCallback); + this.#callbacks = config.callbacks ?? {}; } get name(): string { @@ -115,6 +153,18 @@ class ConnectorComponent extends ElementObject { return this.#prop; } + get metadata(): SnapLineMetadata { + return this.#config.metadata ?? {}; + } + + get callbacks(): ConnectorCallbacks { + return this.#callbacks; + } + + set callbacks(callbacks: ConnectorCallbacks) { + this.#callbacks = callbacks; + } + get outgoingLines(): LineComponent[] { return this.#outgoingLines; } @@ -128,7 +178,7 @@ class ConnectorComponent extends ElementObject { } set targetConnector(value: ConnectorComponent | null) { - this.#targetConnector = value; + this.setCandidate(value); } get numIncomingLines(): number { @@ -139,6 +189,42 @@ class ConnectorComponent extends ElementObject { return this.#outgoingLines.length; } + private setCandidate(candidate: ConnectorComponent | null): void { + if (candidate === this.#targetConnector) return; + this.#targetConnector = candidate; + this.#callbacks.onCandidateChange?.({ source: this, candidate }); + } + + #emitConnect( + target: ConnectorComponent, + line: LineComponent, + origin: ConnectionOrigin, + ): void { + this.#callbacks.onConnect?.({ + source: this, target, connector: this, peer: target, line, + role: "source", origin, + }); + target.#callbacks.onConnect?.({ + source: this, target, connector: target, peer: this, line, + role: "target", origin, + }); + } + + #emitDisconnect( + target: ConnectorComponent, + line: LineComponent, + reason: DisconnectReason, + ): void { + this.#callbacks.onDisconnect?.({ + source: this, target, connector: this, peer: target, line, + role: "source", reason, + }); + target.#callbacks.onDisconnect?.({ + source: this, target, connector: target, peer: this, line, + role: "target", reason, + }); + } + get center(): { x: number; y: number } { if (this.#hasMeasuredCenter && this.parent) { const parentTransform = this.parent.worldTransform; @@ -208,8 +294,36 @@ class ConnectorComponent extends ElementObject { }; } - get connectorCallback(): ConnectorCallback { - return this.#connectorCallback!; + /** + * Request a deferred remeasurement after an external system changes this + * connector's painted DOM position. Calls coalesce within the engine frame. + */ + requestDomGeometrySync(): boolean { + if (!this.element?.isConnected || !this.parent) return false; + + this.schedule( + () => { + if (!this.element?.isConnected || !this.parent) return; + this.measureLocalCenter("READ_1"); + }, + { + stage: "READ_1", + queueId: `${this.id}-dom-geometry`, + }, + ); + for (const line of [...this.#outgoingLines, ...this.#incomingLines]) { + line.schedule( + () => { + line.moveLineToConnectorTransform(); + line.writeTransform(); + }, + { + stage: "WRITE_1", + queueId: `${line.id}-dom-geometry`, + }, + ); + } + return true; } onCursorDown(prop: pointerDownProp): void { @@ -229,7 +343,10 @@ class ConnectorComponent extends ElementObject { } } - deleteLine(i: number): LineComponent | null { + deleteLine( + i: number, + reason: DisconnectReason = "programmatic", + ): LineComponent | null { if (this.#outgoingLines.length == 0 || i < 0) { return null; } @@ -243,8 +360,7 @@ class ConnectorComponent extends ElementObject { target.#incomingLines = target.#incomingLines.filter( (incomingLine) => incomingLine !== line, ); - this.#connectorCallback?.onDisconnectOutgoing?.(target); - target.#connectorCallback?.onDisconnectIncoming?.(this); + this.#emitDisconnect(target, line, reason); } line.destroy(); this.#outgoingLines.splice(i, 1); @@ -254,12 +370,12 @@ class ConnectorComponent extends ElementObject { return line; } - deleteAllLines() { + deleteAllLines(reason: DisconnectReason = "programmatic") { for (const line of [...this.#outgoingLines]) { - this.deleteLine(this.#outgoingLines.indexOf(line)); + this.deleteLine(this.#outgoingLines.indexOf(line), reason); } for (const line of [...this.#incomingLines]) { - line.start.deleteLine(line.start.outgoingLines.indexOf(line)); + line.start.deleteLine(line.start.outgoingLines.indexOf(line), reason); } this.#incomingLines = []; } @@ -280,11 +396,6 @@ class ConnectorComponent extends ElementObject { } } - /** @deprecated Renamed: use `scheduleAllLineWrites` (schedules, does not write now). */ - updateAllLines() { - this.scheduleAllLineWrites(); - } - /** Synchronously writes every line on this connector (call inside a WRITE stage). */ writeAllLinesNow() { for (const line of [...this.#outgoingLines, ...this.#incomingLines]) { @@ -332,11 +443,16 @@ class ConnectorComponent extends ElementObject { this.parent.updateNodeLineList(); this.#state = ConnectorState.DRAGGING; - this.#targetConnector = null; + this.setCandidate(null); // this.event.input.drag = null; this.event.input.drag = this.runDragOutLine; // this.globalInput.pointerUp = this.endDragOutLine; this.event.input.dragEnd = this.endDragOutLine; + this.#callbacks.onDragStart?.({ + connector: this, + position: prop.position, + pointerId: prop.event.pointerId, + }); this.#mouseHitBox.event.collider.onCollide = ( _: Collider, @@ -350,7 +466,7 @@ class ConnectorComponent extends ElementObject { otherObject: Collider, ) => { if (this.#targetConnector?.id == otherObject.parent.id) { - this.#targetConnector = null; + this.setCandidate(null); } }; @@ -387,9 +503,9 @@ class ConnectorComponent extends ElementObject { return da - db; }); if (connectors.length > 0) { - this.#targetConnector = connectors[0]; + this.setCandidate(connectors[0] ?? null); } else { - this.#targetConnector = null; + this.setCandidate(null); } } @@ -430,7 +546,12 @@ class ConnectorComponent extends ElementObject { } const maxConnectors = connector.config.maxConnectors ?? 1; - return maxConnectors < 0 || currentIncomingLines.length < maxConnectors; + if (maxConnectors === 0) return false; + const event = { source: this, target: connector }; + return ( + this.#callbacks.canConnect?.(event) !== false && + connector.#callbacks.canConnect?.(event) !== false + ); } runDragOutLine(prop: dragProp) { @@ -442,11 +563,36 @@ class ConnectorComponent extends ElementObject { console.error(`Error: Outgoing lines is empty`); return; } + if (this.#config.edgePan !== false && typeof prop.pointerId === "number") { + const controller = this.engine.edgePanController; + if (this.#edgePanPointerId == null) { + this.#edgePanPointerId = prop.pointerId; + controller?.startEdgePan( + prop.pointerId, + prop.position, + (position) => this.#moveDraggedLine(position), + ); + } else { + controller?.updateEdgePan(prop.pointerId, prop.position); + } + } + + this.#moveDraggedLine(prop.position); + } + + #moveDraggedLine(position: eventPosition): void { + if ( + this.#state != ConnectorState.DRAGGING || + this.#outgoingLines.length === 0 + ) { + return; + } + this.#mouseHitBox.worldTransform = { - x: prop.position.x, - y: prop.position.y, + x: position.x, + y: position.y, }; - this.#targetConnector = this.findClosestConnectorAtPoint(prop.position); + this.setCandidate(this.findClosestConnectorAtPoint(position)); let line = this.#outgoingLines[0]; @@ -462,7 +608,7 @@ class ConnectorComponent extends ElementObject { return; } } - line.setLineEnd(prop.position.x, prop.position.y); + line.setLineEnd(position.x, position.y); line.setLineStartAtConnector(); this.parent.scheduleLineWrites(); } @@ -485,7 +631,8 @@ class ConnectorComponent extends ElementObject { } endDragOutLine(prop: dragEndProp) { - this.#targetConnector = this.findClosestConnectorAtPoint(prop.end); + this.setCandidate(this.findClosestConnectorAtPoint(prop.end)); + let connected = false; if ( this.#targetConnector && this.#targetConnector instanceof ConnectorComponent @@ -496,31 +643,54 @@ class ConnectorComponent extends ElementObject { this._endLineDragCleanup(); return; } - if (this.connectToConnector(target, this.#outgoingLines[0]) == false) { + if ( + this.connectToConnector({ + target, + line: this.#outgoingLines[0], + origin: "gesture", + }) == false + ) { this._endLineDragCleanup(); - this.deleteLine(0); + this.deleteLine(0, "gesture"); + this.#callbacks.onDragEnd?.({ + connector: this, + position: prop.end, + pointerId: prop.pointerId, + connected: false, + }); return; } target.#prop[target.#name] = this.#prop[this.#name]; this.#outgoingLines[0].setLineEndAtConnector(); + connected = true; } else { - this.deleteLine(0); + this.deleteLine(0, "gesture"); } if (this.parent) { this.parent.scheduleLineWrites(); } + this.#callbacks.onDragEnd?.({ + connector: this, + position: prop.end, + pointerId: prop.pointerId, + connected, + }); this._endLineDragCleanup(); } _endLineDragCleanup() { + if (this.#edgePanPointerId != null) { + this.engine.edgePanController?.stopEdgePan(this.#edgePanPointerId); + this.#edgePanPointerId = null; + } this.#state = ConnectorState.IDLE; this.event.input.drag = null; this.event.input.dragEnd = null; this.parent.updateNodeLineList(); - this.#targetConnector = null; + this.setCandidate(null); this.#mouseHitBox.event.collider.onCollide = null; this.#mouseHitBox.event.collider.onEndContact = null; this.#mouseHitBox.localTransform = { x: 0, y: 0 }; @@ -528,53 +698,81 @@ class ConnectorComponent extends ElementObject { startPickUpLine(line: LineComponent, prop: pointerDownProp) { const startConnector = line.start; - startConnector.disconnectFromConnector(this); + startConnector.disconnectFromConnector(this, "gesture"); this.engine?.input.setPointerDragOwner(prop.event.pointerId, startConnector); startConnector.targetConnector = this; startConnector.startDragOutLine(prop); this.#state = ConnectorState.DRAGGING; } - connectToConnector( - connector: ConnectorComponent, - line: LineComponent | null, - ): boolean { - if (!this.canConnectToConnector(connector)) { + connectToConnector({ + target, + line = null, + origin = "programmatic", + }: { + target: ConnectorComponent; + line?: LineComponent | null; + origin?: ConnectionOrigin; + }): boolean { + if (!this.canConnectToConnector(target)) { return false; } + const maxConnectors = target.config.maxConnectors ?? 1; + if (maxConnectors > 0) { + const currentIncomingLines = target.incomingLines.filter( + (incomingLine) => !incomingLine.isDeleteRequested, + ); + const removeCount = Math.max( + 0, + currentIncomingLines.length - maxConnectors + 1, + ); + for (const incomingLine of currentIncomingLines.slice(0, removeCount)) { + incomingLine.start.deleteLine( + incomingLine.start.outgoingLines.indexOf(incomingLine), + "replacement", + ); + } + } + if (line == null) { line = this.createLine(); this.#outgoingLines.unshift(line); } - line.target = connector; - if (!connector.incomingLines.includes(line)) { - connector.incomingLines.push(line); + line.target = target; + if (!target.incomingLines.includes(line)) { + target.incomingLines.push(line); } line.setLineStartAtConnector(); line.setLineEndAtConnector(); this.parent.updateNodeLineList(); - this.#connectorCallback?.onConnectOutgoing?.(connector); - connector.#connectorCallback?.onConnectIncoming?.(this); + this.#emitConnect(target, line, origin); this.parent.setProp(this.#name, this.#prop[this.#name]); return true; } - disconnectFromConnector(connector: ConnectorComponent) { + disconnectFromConnector( + connector: ConnectorComponent, + reason: DisconnectReason = "programmatic", + ) { const lineIndex = this.#outgoingLines.findIndex( (line) => line.target == connector, ); if (lineIndex !== -1) { - this.deleteLine(lineIndex); + this.deleteLine(lineIndex, reason); } } destroy() { - this.deleteAllLines(); + if (this.#edgePanPointerId != null) { + this.engine.edgePanController?.stopEdgePan(this.#edgePanPointerId); + this.#edgePanPointerId = null; + } + this.deleteAllLines("teardown"); if (this.parent?._connectors[this.#name] === this) { delete this.parent._connectors[this.#name]; } diff --git a/assets/snapline/core/src/group.ts b/assets/snapline/core/src/group.ts index 5f06f31..40b5573 100644 --- a/assets/snapline/core/src/group.ts +++ b/assets/snapline/core/src/group.ts @@ -1,13 +1,49 @@ -import { EventProxyFactory } from "@snap-engine/core"; -import type { BaseObject, dragStartProp, dragEndProp } from "@snap-engine/core"; +import type { + BaseObject, + Engine, + eventPosition, +} from "@snap-engine/core"; import { NodeComponent, mergeConfig, type NodeConfig } from "./node"; import { getGroups, snapData } from "./snapline-globals"; export interface GroupConfig extends NodeConfig { width?: number; height?: number; + /** Additional eligibility filter applied after geometric containment. */ + canContain?: (event: GroupContainEvent) => boolean; + groupCallbacks?: GroupCallbacks; } +export interface GroupContainEvent { + group: GroupNodeComponent; + node: NodeComponent; + centerContained: boolean; + boundsContained: boolean; +} + +export interface GroupMembershipEvent { + group: GroupNodeComponent; + added: readonly NodeComponent[]; + removed: readonly NodeComponent[]; + /** Direct members only. Use `group.descendants` for the complete subtree. */ + members: readonly NodeComponent[]; +} + +export interface GroupCallbacks { + onMembershipChange?: (event: GroupMembershipEvent) => void; +} + +export interface GroupMembershipResolutionEvent { + node: NodeComponent; + /** Safe eligible candidates, ordered from innermost to outermost. */ + candidates: readonly GroupNodeComponent[]; + defaultParent: GroupNodeComponent | null; +} + +export type GroupMembershipResolver = ( + event: GroupMembershipResolutionEvent, +) => GroupNodeComponent | null; + const DEFAULT_GROUP_CONFIG = { width: 400, height: 300, @@ -15,142 +51,361 @@ const DEFAULT_GROUP_CONFIG = { minHeight: 120, } satisfies GroupConfig; -interface GroupCallback { - // Fired when a node enters/leaves the group's live geometric footprint at a - // settle event (resize, move-settle, or another node's drop) — never for a - // carried member that merely moved with the group. - onMemberEnter: null | ((node: NodeComponent) => void); - onMemberLeave: null | ((node: NodeComponent) => void); - // Fired at the end of a group drag (after members are detached and their - // final world positions are settled) so consumers can persist positions. - onDragCommit: null | (() => void); -} - -// A resizable box that carries any node whose center is inside it. Membership is -// live geometric containment, maintained at settle events; moving the group -// transform-parents its known members and rides SnapEngine's writeTransform -// cascade to move them (and their lines) in a single pass. -// -// Design limits (v1, by intent): groups are excluded from membership, so groups -// cannot nest inside groups; and carried members are moved via transform -// parenting only — they are never added to global.data.select, so a group drag -// does not alter the user's selection. +const parentGroups = new WeakMap(); +const membershipResolvers = new WeakMap(); +const reconcilingEngines = new WeakSet(); + +type Bounds = ReturnType< + NodeComponent["hitBox"]["getWorldBoundsSnapshot"] +>; + +function boundsArea(bounds: Bounds): number { + return Math.max(0, bounds.right - bounds.left) * + Math.max(0, bounds.bottom - bounds.top); +} + +function containsBounds(container: Bounds, child: Bounds): boolean { + return ( + child.left >= container.left && + child.right <= container.right && + child.top >= container.top && + child.bottom <= container.bottom + ); +} + +function stableGroupOrder( + left: GroupNodeComponent, + right: GroupNodeComponent, +): number { + const areaDelta = + boundsArea(left.hitBox.getWorldBoundsSnapshot()) - + boundsArea(right.hitBox.getWorldBoundsSnapshot()); + return areaDelta || String(left.id).localeCompare(String(right.id)); +} + +function groupsForEngine(group: GroupNodeComponent): GroupNodeComponent[] { + return getGroups(group.global).filter( + (candidate): candidate is GroupNodeComponent => + candidate instanceof GroupNodeComponent && + candidate.engine === group.engine, + ); +} + +function nodesForEngine(group: GroupNodeComponent): NodeComponent[] { + const table = group.global.getEngineObjectTable(group.engine); + return Object.values(table).filter( + (object): object is NodeComponent => object instanceof NodeComponent, + ); +} + +function resolveParent( + node: NodeComponent, + candidates: GroupNodeComponent[], + engine: object, +): GroupNodeComponent | null { + candidates.sort(stableGroupOrder); + const defaultParent = candidates[0] ?? null; + const resolver = membershipResolvers.get(engine); + if (!resolver) return defaultParent; + + const resolved = resolver({ node, candidates, defaultParent }); + if (resolved === null || candidates.includes(resolved)) return resolved; + + console.warn( + "SnapLine group membership resolver returned a group outside its eligible candidates; using the default parent.", + { node, resolved, candidates }, + ); + return defaultParent; +} + +function wouldCreateGroupCycle( + node: GroupNodeComponent, + parent: GroupNodeComponent, + nextParents: Map, +): boolean { + let ancestor: GroupNodeComponent | undefined = parent; + const visited = new Set(); + while (ancestor && !visited.has(ancestor)) { + if (ancestor === node) return true; + visited.add(ancestor); + ancestor = nextParents.get(ancestor); + } + return false; +} + +function reconcileMembership( + source: GroupNodeComponent, + fireDelta: boolean, +): void { + const engine = source.engine as object; + if (reconcilingEngines.has(engine)) return; + reconcilingEngines.add(engine); + + try { + const groups = groupsForEngine(source); + const nextMembers = new Map< + GroupNodeComponent, + Set + >(groups.map((group) => [group, new Set()])); + const nextParents = new Map(); + + const nodes = nodesForEngine(source); + const groupNodes = [...groups].sort(stableGroupOrder); + const ordinaryNodes = nodes.filter( + (node) => !(node instanceof GroupNodeComponent), + ); + + // Resolve the group forest first. A proposed edge can point at a group that + // has already chosen another parent, so walking the partial parent map is + // enough to reject the edge that would close any cycle. + for (const node of groupNodes) { + const candidates = groups.filter( + (group) => + group !== node && + group.allowsMembership(node) && + !wouldCreateGroupCycle(node, group, nextParents), + ); + const parent = resolveParent(node, candidates, engine); + if (!parent) continue; + nextMembers.get(parent)?.add(node); + nextParents.set(node, parent); + } + + // Ordinary nodes cannot form membership cycles. They choose the innermost + // eligible group after the group hierarchy is settled. + for (const node of ordinaryNodes) { + const candidates = groups.filter((group) => + group.allowsMembership(node) + ); + const parent = resolveParent(node, candidates, engine); + if (!parent) continue; + nextMembers.get(parent)?.add(node); + nextParents.set(node, parent); + } + + const deltas = groups.map((group) => { + const previous = group.members; + const next = nextMembers.get(group) ?? new Set(); + return { + group, + next, + added: [...next].filter((node) => !previous.has(node)), + removed: [...previous].filter((node) => !next.has(node)), + }; + }); + + for (const node of nodes) { + const parent = nextParents.get(node); + if (parent) parentGroups.set(node, parent); + else parentGroups.delete(node); + } + for (const { group, next } of deltas) group.setResolvedMembers(next); + + if (fireDelta) { + for (const { group, next, added, removed } of deltas) { + if (!added.length && !removed.length) continue; + group.groupCallbacks.onMembershipChange?.({ + group, + added, + removed, + members: [...next], + }); + } + } + } finally { + reconcilingEngines.delete(engine); + } +} + +/** Return the node's settled, exclusive direct parent group. */ +export function getParentGroup( + node: NodeComponent, +): GroupNodeComponent | null { + return parentGroups.get(node) ?? null; +} + +/** + * Override automatic innermost-group selection for one engine. + * The resolver may return one of `event.candidates` or `null`. + */ +export function setGroupMembershipResolver( + engine: Engine, + resolver: GroupMembershipResolver, +): () => void { + membershipResolvers.set(engine, resolver); + const refresh = () => { + const global = engine.global; + const source = global + ? getGroups(global).find( + (group): group is GroupNodeComponent => + group instanceof GroupNodeComponent && group.engine === engine, + ) + : undefined; + source?.refreshMembership(true); + }; + refresh(); + + return () => { + if (membershipResolvers.get(engine) !== resolver) return; + membershipResolvers.delete(engine); + refresh(); + }; +} + +// A resizable box with settled geometric membership. Membership is exclusive: +// each node has one direct parent, while nested groups form a recursive tree. class GroupNodeComponent extends NodeComponent { #members: Set = new Set(); #carry: NodeComponent[] = []; - #groupCallback: GroupCallback; + #carryOrigins = new Map(); + #carryGroupOrigin = { x: 0, y: 0 }; + #groupCallbacks: GroupCallbacks; + #groupConfig: GroupConfig; constructor(engine: any, parent: BaseObject | null, config: GroupConfig = {}) { - // A group is resizable via the core BR resize hitbox. Group defaults are - // merged here (single default site); undefined adapter props never shadow. - const merged = mergeConfig({ ...DEFAULT_GROUP_CONFIG }, config); + const merged = mergeConfig( + { ...DEFAULT_GROUP_CONFIG }, + config, + ); super(engine, parent, { ...merged, resizable: true }); - - this.#groupCallback = { onMemberEnter: null, onMemberLeave: null, onDragCommit: null }; - this.#groupCallback = EventProxyFactory(this, this.#groupCallback); - - // Register so any node's drop can notify every group (see NodeComponent.onDragEnd). + this.#groupConfig = merged; + this.#groupCallbacks = merged.groupCallbacks ?? {}; getGroups(this.global).push(this); } - get groupCallback(): GroupCallback { - return this.#groupCallback; + get groupCallbacks(): GroupCallbacks { + return this.#groupCallbacks; } - /** Snapshot of the current geometric members (settle-maintained). */ + /** Direct settled members. */ get members(): ReadonlySet { return this.#members; } - // Route the scheduled drag write through the recursive cascade so the group, - // its carried members, and their lines all paint in one WRITE_2 pass. The - // inherited setDragPosition/setUpPosition already schedule this under - // queueId `${id}-transform`, so no drag-loop change is needed. + /** Every settled member below this group, recursively and without duplicates. */ + get descendants(): ReadonlySet { + const result = new Set(); + const visit = (group: GroupNodeComponent): void => { + for (const member of group.#members) { + if (result.has(member)) continue; + result.add(member); + if (member instanceof GroupNodeComponent) visit(member); + } + }; + visit(this); + return result; + } + + get parentGroup(): GroupNodeComponent | null { + return getParentGroup(this); + } + + /** @internal Used by the engine-wide exclusive-membership reconciliation. */ + setResolvedMembers(members: Set): void { + this.#members = members; + } + writeTransformAndLines(): void { this.writeTransformRecursive(); } - #containsCenter(node: NodeComponent): boolean { + allowsMembership(node: NodeComponent): boolean { const box = this.hitBox.getWorldBoundsSnapshot(); - const nb = node.hitBox.getWorldBoundsSnapshot(); - return ( - nb.centerX >= box.left && - nb.centerX <= box.right && - nb.centerY >= box.top && - nb.centerY <= box.bottom - ); - } + const nodeBounds = node.hitBox.getWorldBoundsSnapshot(); + const centerContained = + nodeBounds.centerX >= box.left && + nodeBounds.centerX <= box.right && + nodeBounds.centerY >= box.top && + nodeBounds.centerY <= box.bottom; + const boundsContained = containsBounds(box, nodeBounds); - computeMembers(): NodeComponent[] { - const table = this.global.getEngineObjectTable(this.engine); - return Object.values(table).filter( - (obj: any): obj is NodeComponent => - obj instanceof NodeComponent && - // Groups never join other groups: nested groups are out of scope (v1). - !(obj instanceof GroupNodeComponent) && - obj !== this && - this.#containsCenter(obj), + // Ordinary nodes use center containment. A nested group must fit completely + // so partially overlapping peers cannot become a parent/child pair. + if ( + node instanceof GroupNodeComponent ? !boundsContained : !centerContained + ) { + return false; + } + + return ( + this.#groupConfig.canContain?.({ + group: this, + node, + centerContained, + boundsContained, + }) ?? true ); } refreshMembership(fireDelta: boolean): void { - const newSet = new Set(this.computeMembers()); - if (fireDelta) { - for (const node of newSet) { - if (!this.#members.has(node)) this.#groupCallback?.onMemberEnter?.(node); - } - for (const node of this.#members) { - if (!newSet.has(node)) this.#groupCallback?.onMemberLeave?.(node); - } - } - this.#members = newSet; + reconcileMembership(this, fireDelta); } - // Any size change (drag-driven setSize or an adapter's state seed) also - // re-evaluates membership: the group's footprint changed. The synchronous - // hitbox update inside super means this refresh sees the new bounds. setSizeState(width: number, height: number): void { super.setSizeState(width, height); this.refreshMembership(true); } - onDragStart(prop: dragStartProp): void { - super.onDragStart(prop); - if (this._resizing) return; // a resize, not a move — don't carry members - // Carry the ALREADY-KNOWN set (from the last settle) — no geometric scan here. - this.#carry = [...this.#members]; - for (const member of this.#carry) member.attachTransformToGroup(this); + beginSelectionDrag(position: eventPosition): void { + super.beginSelectionDrag(position); + this.#carryGroupOrigin = { + x: this.worldTransform.x, + y: this.worldTransform.y, + }; + this.#carry = [...this.descendants]; + this.#carryOrigins.clear(); + for (const member of this.#carry) { + this.#carryOrigins.set(member, { + x: member.worldTransform.x, + y: member.worldTransform.y, + }); + member.attachTransformToGroup(this); + } + } + + containsSelectionDragNode(node: NodeComponent): boolean { + return this.descendants.has(node); + } + + selectionDragNodes(): NodeComponent[] { + return [...new Set([this, ...this.#carry])]; } - onDragEnd(prop: dragEndProp): void { - const wasResizing = this._resizing; - // super sets the group's final world synchronously (and notifies other - // groups); members are still parented, so their world is already final. For a - // resize, super handles setSize/onResizeCommit and our setSize refreshes - // membership, so there is no carry to detach. - super.onDragEnd(prop); - if (wasResizing) return; + finishSelectionDrag(): void { + const dx = this.worldTransform.x - this.#carryGroupOrigin.x; + const dy = this.worldTransform.y - this.#carryGroupOrigin.y; for (const member of this.#carry) { - member.detachTransformFromGroup(); // preserveWorld keeps the final position + member.detachTransformFromGroup(); + const origin = this.#carryOrigins.get(member); + if (origin) { + member.worldTransform = { + x: origin.x + dx, + y: origin.y + dy, + }; + } member.schedule(() => member.writeTransformAndLines(), { stage: "WRITE_2", queueId: `${member.id}-transform`, }); } this.#carry = []; - // Re-evaluate at rest: newly-overlapped nodes enter; carried members that - // merely moved are in both sets → no callback. - this.refreshMembership(true); - // Positions (group + members) are now final; let the consumer persist them. - this.#groupCallback?.onDragCommit?.(); + this.#carryOrigins.clear(); } destroy(): void { snapData(this.global).groups = getGroups(this.global).filter( - (g) => g !== (this as unknown), + (group) => group !== (this as unknown), ); for (const member of this.#carry) member.detachTransformFromGroup(); this.#carry = []; + this.#carryOrigins.clear(); + parentGroups.delete(this); + + const remaining = getGroups(this.global).find( + (group): group is GroupNodeComponent => + group instanceof GroupNodeComponent && group.engine === this.engine, + ); + remaining?.refreshMembership(true); super.destroy(); } } diff --git a/assets/snapline/core/src/index.ts b/assets/snapline/core/src/index.ts index b714fec..d13528d 100644 --- a/assets/snapline/core/src/index.ts +++ b/assets/snapline/core/src/index.ts @@ -1,9 +1,73 @@ -export { NodeComponent, DEFAULT_RESIZE_HANDLE_RADIUS, resizeAnchorOffset } from "./node"; -export type { NodeConfig, NodeCallback, ResizeAnchor } from "./node"; +export { + NodeComponent, + DEFAULT_RESIZE_CURSORS, + DEFAULT_RESIZE_HANDLE_THICKNESS, + RESIZE_HANDLES, +} from "./node"; +export type { + NodeConfig, + NodeCallbacks, + NodeDragCommitEvent, + NodeLinesEvent, + NodePointerEvent, + NodePosition, + NodeResizeEvent, + NodeResizeHandleEvent, + NodeSelectionEvent, + NodeSelectionModeEvent, + ResizeHandle, + SelectionMode, +} from "./node"; export { ConnectorComponent } from "./connector"; -export type { ConnectorConfig } from "./connector"; +export type { + ConnectionOrigin, + ConnectorCallbacks, + ConnectorCandidateEvent, + ConnectorConfig, + ConnectorConnectionEvent, + ConnectorDisconnectionEvent, + ConnectorDragEvent, + ConnectorPairEvent, + ConnectorRole, + DisconnectReason, + SnapLineMetadata, +} from "./connector"; export { LineComponent } from "./line"; -export { GroupNodeComponent } from "./group"; -export type { GroupConfig } from "./group"; +export { + GroupNodeComponent, + getParentGroup, + setGroupMembershipResolver, +} from "./group"; +export type { + GroupCallbacks, + GroupConfig, + GroupContainEvent, + GroupMembershipEvent, + GroupMembershipResolutionEvent, + GroupMembershipResolver, +} from "./group"; export { RectSelectComponent } from "./select"; -export type { SelectRect } from "./select"; +export type { + SelectCallbacks, + SelectChangeEvent, + SelectConfig, + SelectRect, + SelectStartEvent, +} from "./select"; +export { + getConnectors, + getGroupNodes, + getNodes, + getSelectedNodes, +} from "./query"; +export { PlacementController } from "./placement"; +export type { + PlacementAnchor, + PlacementCallbacks, + PlacementCancelEvent, + PlacementConfig, + PlacementEvent, + PlacementPoint, + PlacementSize, + PlacementSnapshot, +} from "./placement"; diff --git a/assets/snapline/core/src/node.ts b/assets/snapline/core/src/node.ts index c4ee7cc..18b7259 100644 --- a/assets/snapline/core/src/node.ts +++ b/assets/snapline/core/src/node.ts @@ -1,4 +1,4 @@ -import { BaseObject, ElementObject, EventProxyFactory } from "@snap-engine/core"; +import { BaseObject, ElementObject } from "@snap-engine/core"; import { ConnectorComponent } from "./connector"; import { LineComponent } from "./line"; import type { @@ -7,56 +7,72 @@ import type { dragStartProp, dragProp, dragEndProp, + eventPosition, + pointerMoveProp, } from "@snap-engine/core"; -import { RectCollider, CircleCollider } from "@snap-engine/core/collision"; +import { RectCollider } from "@snap-engine/core/collision"; import { getSelectList, getGroups, getResizeHandles, snapData } from "./snapline-globals"; - -export type ResizeAnchor = "tl" | "tr" | "bl" | "br"; +import type { SnapLineMetadata } from "./connector"; + +export type ResizeHandle = "n" | "ne" | "e" | "se" | "s" | "sw" | "w" | "nw"; + +export const RESIZE_HANDLES: readonly ResizeHandle[] = [ + "n", + "ne", + "e", + "se", + "s", + "sw", + "w", + "nw", +]; + +export const DEFAULT_RESIZE_CURSORS: Readonly> = { + n: "ns-resize", + ne: "nesw-resize", + e: "ew-resize", + se: "nwse-resize", + s: "ns-resize", + sw: "nesw-resize", + w: "ew-resize", + nw: "nwse-resize", +}; export interface NodeConfig { lockPosition?: boolean; - /** Enables a corner resize handle (a virtual collision hitbox). */ + /** Enables resize handles. All four sides and corners are enabled by default. */ resizable?: boolean; minWidth?: number; minHeight?: number; - /** Radius of the circular resize hitbox; it straddles the anchor corner. */ - resizeHandleRadius?: number; /** - * Which corner carries the resize handle (default "br"). The OPPOSITE corner - * stays fixed: resizing from a top/left anchor shifts the node's origin while - * the size changes, so e.g. a "tl" drag grows the box up-left. + * Total thickness of each virtual edge/corner resize hitbox. Half of the + * hitbox sits inside the node boundary and half outside. */ - resizeAnchor?: ResizeAnchor; -} - -/** Local position of the resize handle's center for a given anchor + size. */ -export function resizeAnchorOffset( - anchor: ResizeAnchor, - width: number, - height: number, -): { x: number; y: number } { - switch (anchor) { - case "tl": - return { x: 0, y: 0 }; - case "tr": - return { x: width, y: 0 }; - case "bl": - return { x: 0, y: height }; - default: - return { x: width, y: height }; - } + resizeHandleThickness?: number; + /** Enabled handles. `true` means all eight; an array enables only those handles. */ + resizeHandles?: true | readonly ResizeHandle[]; + /** Per-handle CSS cursor overrides. */ + resizeCursors?: Partial>; + metadata?: SnapLineMetadata; + callbacks?: NodeCallbacks; + /** Allows this node gesture to use the engine's configured edge pan. */ + edgePan?: boolean; } -/** Shared by core (hitbox radius) and adapters (visual handle size). */ -export const DEFAULT_RESIZE_HANDLE_RADIUS = 14; +/** Shared by core hitboxes and adapter resize-handle visuals. */ +export const DEFAULT_RESIZE_HANDLE_THICKNESS = 14; const DEFAULT_NODE_CONFIG: Required = { lockPosition: false, resizable: false, minWidth: 0, minHeight: 0, - resizeHandleRadius: DEFAULT_RESIZE_HANDLE_RADIUS, - resizeAnchor: "br", + resizeHandleThickness: DEFAULT_RESIZE_HANDLE_THICKNESS, + resizeHandles: true, + resizeCursors: {}, + metadata: {}, + callbacks: {}, + edgePan: true, }; /** Object-spread merge that ignores undefined values (adapters forward @@ -70,15 +86,201 @@ export function mergeConfig(defaults: T, config: Partial): return merged; } -/** Domain/lifecycle callbacks, assigned via `node.nodeCallback.onX = fn` - * (the canonical EventProxyFactory pattern, mirroring connectorCallback). */ -export interface NodeCallback { +/** Consumer policy and lifecycle surfaces. Callbacks receive event objects so + * new context can be added without growing positional signatures. */ +export interface NodePosition { + node: NodeComponent; + x: number; + y: number; +} + +export interface NodePointerEvent { + node: NodeComponent; + pointerId: number; + position: eventPosition; + originalEvent?: PointerEvent; +} + +export interface NodeDragCommitEvent extends NodePointerEvent { + nodes: NodePosition[]; +} + +export interface NodeResizeEvent { + node: NodeComponent; + handle: ResizeHandle | null; + x: number; + y: number; + width: number; + height: number; +} + +export interface NodeResizeHandleEvent { + node: NodeComponent; + handle: ResizeHandle | null; + cursor: string | null; +} + +export interface NodeSelectionEvent { + node: NodeComponent; + selected: boolean; + selection: readonly NodeComponent[]; +} + +export type SelectionMode = "replace" | "add" | "toggle"; + +export interface NodeSelectionModeEvent { + node: NodeComponent; + selected: boolean; + selection: readonly NodeComponent[]; + originalEvent: PointerEvent; +} + +export interface NodeLinesEvent { + node: NodeComponent; + lines: readonly LineComponent[]; +} + +export interface NodeCallbacks { + canStartDrag?: (event: NodePointerEvent) => boolean; + /** Consumer-defined pointer selection policy; SnapLine owns no modifier keys. */ + resolveSelectionMode?: (event: NodeSelectionModeEvent) => SelectionMode; + onDragStart?: (event: NodePointerEvent) => void; + onDrag?: (event: NodePointerEvent) => void; + onDragCommit?: (event: NodeDragCommitEvent) => void; + onSelectionChange?: (event: NodeSelectionEvent) => void; /** Live size updates during a resize drag — the adapter renders width/height. */ - onSizeChange: null | ((width: number, height: number) => void); + onSizeChange?: (event: NodeResizeEvent) => void; /** Final size at resize-drag end — the consumer persists it. */ - onResizeCommit: null | ((width: number, height: number) => void); + onResizeCommit?: (event: NodeResizeEvent) => void; + /** The resize handle currently hovered, or null after leaving it. */ + onResizeHandleChange?: (event: NodeResizeHandleEvent) => void; /** The set of outgoing lines changed — the adapter re-renders its line list. */ - onLinesChanged: null | ((lines: LineComponent[]) => void); + onLinesChanged?: (event: NodeLinesEvent) => void; +} + +const CORNER_HANDLES = new Set(["ne", "se", "sw", "nw"]); +class ResizeHandleCollider extends RectCollider { + readonly handle: ResizeHandle; + readonly cursor: string; + + constructor( + engine: any, + parent: NodeComponent, + handle: ResizeHandle, + cursor: string, + ) { + super(engine, parent, 0, 0, 0, 0); + this.handle = handle; + this.cursor = cursor; + } +} + +class ResizeHoverController extends BaseObject { + #count = 0; + #node: NodeComponent | null = null; + #handle: ResizeHandleCollider | null = null; + #target: HTMLElement | null = null; + #previousNodeCursor = ""; + #previousContainerCursor = ""; + #previousTargetCursor = ""; + + constructor(engine: any) { + super(engine, null); + this.event.global.pointerMove = this.#onPointerMove; + } + + retain(): void { + this.#count++; + } + + release(node: NodeComponent): void { + this.#count--; + if (this.#node === node) this.clear(); + if (this.#count <= 0) { + resizeHoverControllers.delete(this.engine); + this.destroy(); + } + } + + activate(handle: ResizeHandleCollider, target?: EventTarget | null): void { + const node = handle.parent as NodeComponent; + const element = target instanceof HTMLElement ? target : null; + if (this.#handle === handle && this.#target === element) return; + this.#restoreCss(); + const nodeElement = node.element; + const container = this.engine.containerElement as HTMLElement | null; + this.#node = node; + this.#handle = handle; + this.#target = element; + this.#previousNodeCursor = nodeElement?.style.cursor ?? ""; + this.#previousContainerCursor = container?.style.cursor ?? ""; + this.#previousTargetCursor = element?.style.cursor ?? ""; + nodeElement?.setAttribute("data-snapline-resize-handle", handle.handle); + if (nodeElement) nodeElement.style.cursor = handle.cursor; + if (container) container.style.cursor = handle.cursor; + if (element) element.style.cursor = handle.cursor; + node.callbacks.onResizeHandleChange?.({ + node, + handle: handle.handle, + cursor: handle.cursor, + }); + } + + clear(): void { + if (!this.#node) return; + const node = this.#node; + this.#restoreCss(); + this.#node = null; + this.#handle = null; + this.#target = null; + node.callbacks.onResizeHandleChange?.({ node, handle: null, cursor: null }); + } + + #restoreCss(): void { + const nodeElement = this.#node?.element; + const container = this.engine.containerElement as HTMLElement | null; + nodeElement?.removeAttribute("data-snapline-resize-handle"); + if (nodeElement) nodeElement.style.cursor = this.#previousNodeCursor; + if (container) container.style.cursor = this.#previousContainerCursor; + if (this.#target) this.#target.style.cursor = this.#previousTargetCursor; + } + + #onPointerMove(prop: pointerMoveProp): void { + const handle = findResizeHandle(this.engine, prop.position); + if (!handle) { + this.clear(); + return; + } + this.activate(handle, prop.event?.target); + } +} + +const resizeHoverControllers = new WeakMap(); + +function hoverController(engine: any): ResizeHoverController { + let controller = resizeHoverControllers.get(engine); + if (!controller) { + controller = new ResizeHoverController(engine); + resizeHoverControllers.set(engine, controller); + } + return controller; +} + +function findResizeHandle( + engine: any, + position: eventPosition, + node?: NodeComponent, +): ResizeHandleCollider | null { + let winner: ResizeHandleCollider | null = null; + for (const collider of getResizeHandles(engine.global)) { + if (!(collider instanceof ResizeHandleCollider) || collider.engine !== engine) continue; + if (node && collider.parent !== node) continue; + if (!collider.containsWorldPoint(position.x, position.y)) continue; + if (!winner || CORNER_HANDLES.has(collider.handle) || !CORNER_HANDLES.has(winner.handle)) { + winner = collider; + } + } + return winner; } class NodeComponent extends ElementObject { @@ -90,13 +292,16 @@ class NodeComponent extends ElementObject { _prop: { [key: string]: any }; _propSetCallback: { [key: string]: (value: any) => void }; _nodeStyle: any; - _lineListCallback: ((lines: LineComponent[]) => void) | null; #hitBox: RectCollider; _selected: boolean; _mouseDownX: number; _mouseDownY: number; _hasMoved: boolean; - #resizeHitBox: CircleCollider | null = null; + #resizeHitBoxes = new Map(); + #resizeHandles: readonly ResizeHandle[]; + #resizeHandleThickness: number; + #resizeHoverController: ResizeHoverController | null = null; + #activeResizeHandle: ResizeHandle | null = null; /** Read by GroupNodeComponent to distinguish a resize from a move drag. */ protected _resizing = false; #resizeArmed = false; @@ -104,16 +309,31 @@ class NodeComponent extends ElementObject { #resizeStartH = 0; #resizeStartX = 0; #resizeStartY = 0; - #nodeCallback: NodeCallback; + #callbacks: NodeCallbacks; + #edgePanPointerId: number | null = null; + #dragHandles = new Set(); + #dragPointerId: number | null = null; + #dragRoots: NodeComponent[] = []; + #dragCommitNodes: NodeComponent[] = []; + #lastDragPosition: eventPosition | null = null; + #pointerSelectionMode: SelectionMode = "replace"; + #selectedAtPointerDown = false; constructor(engine: any, parent: BaseObject | null, config: NodeConfig = {}) { super(engine, parent); this.#config = mergeConfig(DEFAULT_NODE_CONFIG, config); - this.#nodeCallback = EventProxyFactory(this, { - onSizeChange: null, - onResizeCommit: null, - onLinesChanged: null, - }); + this.#callbacks = this.#config.callbacks; + const resizeEnabled = config.resizable === true || config.resizeHandles !== undefined; + this.#resizeHandles = !resizeEnabled + ? [] + : config.resizeHandles !== undefined + ? config.resizeHandles === true + ? RESIZE_HANDLES + : [...new Set(config.resizeHandles)] + : RESIZE_HANDLES; + this.#resizeHandleThickness = + config.resizeHandleThickness ?? + DEFAULT_RESIZE_HANDLE_THICKNESS; this._connectors = {}; this._components = {}; @@ -123,7 +343,6 @@ class NodeComponent extends ElementObject { this._mouseDownY = 0; this._prop = {}; this._propSetCallback = {}; - this._lineListCallback = null; this.transformMode = "direct"; this.event.input.pointerDown = this.onCursorDown; @@ -134,26 +353,31 @@ class NodeComponent extends ElementObject { this.#hitBox = new RectCollider(this.engine, this, 0, 0, 0, 0); this.addCollider(this.#hitBox); - // The resize handle is a virtual CircleCollider parked at the BR corner (it - // straddles the edge and can spread beyond it — no DOM element). It is - // registered so input.ts can resolve a pointerdown over it to this node. - if (this.#config.resizable) { - this.#resizeHitBox = new CircleCollider( - this.engine, - this, - 0, - 0, - this.#config.resizeHandleRadius, - ); - this.addCollider(this.#resizeHitBox); - getResizeHandles(this.global).push(this.#resizeHitBox); + // Resize surfaces are virtual colliders. Engine input resolves them before + // DOM ownership, so handles can straddle the element and work for groups + // whose body intentionally has pointer-events:none. + if (this.#resizeHandles.length > 0) { + this.#resizeHoverController = hoverController(this.engine); + this.#resizeHoverController.retain(); + for (const handle of this.#resizeHandles) { + const collider = new ResizeHandleCollider( + this.engine, + this, + handle, + this.#config.resizeCursors[handle] ?? DEFAULT_RESIZE_CURSORS[handle], + ); + this.#resizeHitBoxes.set(handle, collider); + this.addCollider(collider); + getResizeHandles(this.global).push(collider); + } + this.#positionResizeHitBoxes(0, 0); } this._selected = false; this._hasMoved = false; // Whenever the DOM box changes size (ResizeObserver) re-measure + re-glue. - this.event.dom.onResize = () => this.resyncNodeGeometry(); + this.event.dom.onResize = () => this.syncDomGeometry(); // Base positioning styles are framework-owned: adapters must render the // element with `position: absolute; transform-origin: top left` (see the @@ -167,18 +391,29 @@ class NodeComponent extends ElementObject { return this.#config; } - get nodeCallback(): NodeCallback { - return this.#nodeCallback; + get callbacks(): NodeCallbacks { + return this.#callbacks; + } + + set callbacks(callbacks: NodeCallbacks) { + this.#callbacks = callbacks; + } + + get metadata(): SnapLineMetadata { + return this.#config.metadata; + } + + get resizeHandles(): readonly ResizeHandle[] { + return this.#resizeHandles; } - /** @deprecated Assign `nodeCallback.onResizeCommit` instead. */ - get _onResizeCommit(): NodeCallback["onResizeCommit"] { - return this.#nodeCallback.onResizeCommit; + get resizeHandleThickness(): number { + return this.#resizeHandleThickness; } - /** @deprecated Assign `nodeCallback.onResizeCommit` instead. */ - set _onResizeCommit(callback: NodeCallback["onResizeCommit"]) { - this.#nodeCallback.onResizeCommit = callback; + registerDragHandle(element: HTMLElement): () => void { + this.#dragHandles.add(element); + return () => this.#dragHandles.delete(element); } /** The node's collision footprint (world = worldTransform + width/height). @@ -212,6 +447,11 @@ class NodeComponent extends ElementObject { stage: "WRITE_1", queueId: `${this.id}-selected`, }); + this.#callbacks.onSelectionChange?.({ + node: this, + selected, + selection: [...getSelectList(this.global)], + }); } _filterDeletedLines(svgLines: LineComponent[]) { @@ -230,11 +470,6 @@ class NodeComponent extends ElementObject { } } - /** @deprecated Renamed: use `scheduleLineWrites` (schedules, does not write now). */ - updateNodeLines(): void { - this.scheduleLineWrites(); - } - /** Synchronously writes every line on every connector (call inside a WRITE stage). */ writeLinesNow(): void { for (const connector of Object.values(this._connectors)) { @@ -242,30 +477,22 @@ class NodeComponent extends ElementObject { } } - /** @deprecated Renamed: use `writeLinesNow`. */ - writeNodeLines(): void { - this.writeLinesNow(); - } - // Re-measure the node box + each connector's local center (READ_1) and re-glue // every incoming/outgoing line (WRITE_1). This is the "same handling as a move // plus a size re-measure": moving a node keeps connector local centers valid, // but resizing invalidates them, so they must be re-read. Shared by the // ResizeObserver and the JS-driven setSize; stable queueIds collapse a // same-frame double-fire (idempotent when it runs twice across frames). - resyncNodeGeometry(): void { + syncDomGeometry(): void { + if (!this.element) { + throw new Error("Cannot sync node geometry before assigning its DOM element"); + } this.schedule( () => { const property = this.readDom({ unapplyTransform: false }, "READ_1"); this.#hitBox.width = property.width; this.#hitBox.height = property.height; - if (this.#resizeHitBox) { - this.#resizeHitBox.localTransform = resizeAnchorOffset( - this.#config.resizeAnchor, - property.width, - property.height, - ); - } + this.#positionResizeHitBoxes(property.width, property.height); for (const connector of Object.values(this._connectors)) { connector.measureLocalCenter("READ_1"); } @@ -288,11 +515,6 @@ class NodeComponent extends ElementObject { } } - /** @deprecated Renamed: use `resyncNodeGeometry`. */ - remeasureAndReglue(): void { - this.resyncNodeGeometry(); - } - // State-only half of a size change: clamps to min and synchronously updates // the collision footprint + resize hitbox so the hit test and group // containment stay correct mid-drag. Never touches the DOM — the element's @@ -302,48 +524,83 @@ class NodeComponent extends ElementObject { const h = Math.max(this.#config.minHeight, height); this.#hitBox.width = w; this.#hitBox.height = h; - if (this.#resizeHitBox) { - this.#resizeHitBox.localTransform = resizeAnchorOffset(this.#config.resizeAnchor, w, h); - } + this.#positionResizeHitBoxes(w, h); } // Drives the node's size from JS (resize handle): updates state, then asks the // framework to render the new width/height via onSizeChange. The connector/line // re-glue closes itself — the adapter's DOM write triggers the ResizeObserver, - // which runs resyncNodeGeometry AFTER the browser reflows (no handshake needed: + // which runs syncDomGeometry AFTER the browser reflows (no handshake needed: // the box repaint is not paint-atomic). - setSize(width: number, height: number): void { + setSize(width: number, height: number, handle: ResizeHandle | null = null): void { this.setSizeState(width, height); - this.#nodeCallback.onSizeChange?.(this.#hitBox.width, this.#hitBox.height); + this.#callbacks.onSizeChange?.({ + node: this, + handle, + x: this.worldTransform.x, + y: this.worldTransform.y, + width: this.#hitBox.width, + height: this.#hitBox.height, + }); + } + + #positionResizeHitBoxes(width: number, height: number): void { + const t = Math.max(0, this.#resizeHandleThickness); + const half = t / 2; + const horizontalLength = Math.max(0, width - t); + const verticalLength = Math.max(0, height - t); + const geometry: Record = { + n: [half, -half, horizontalLength, t], + ne: [width - half, -half, t, t], + e: [width - half, half, t, verticalLength], + se: [width - half, height - half, t, t], + s: [half, height - half, horizontalLength, t], + sw: [-half, height - half, t, t], + w: [-half, half, t, verticalLength], + nw: [-half, -half, t, t], + }; + for (const [handle, collider] of this.#resizeHitBoxes) { + const [x, y, colliderWidth, colliderHeight] = geometry[handle]; + collider.localTransform = { x, y }; + collider.width = colliderWidth; + collider.height = colliderHeight; + } } - // Applies a resize drag for the configured anchor: deltas are signed per - // anchor edge (dragging a left/top anchor outward grows the box), and the - // OPPOSITE corner stays fixed — for top/left anchors the origin shifts by the - // clamped size change (computed from the clamped size, so at min size the - // origin freezes with it). Transforms stay engine-written per the ownership - // contract; the size flows to the framework via onSizeChange. + // Applies one side/corner resize while keeping the opposite edges fixed. #applyResizeDrag(dx: number, dy: number): void { - const anchor = this.#config.resizeAnchor; - const sx = anchor === "tr" || anchor === "br" ? 1 : -1; - const sy = anchor === "bl" || anchor === "br" ? 1 : -1; - this.setSize(this.#resizeStartW + sx * dx, this.#resizeStartH + sy * dy); - const w = this.#hitBox.width; - const h = this.#hitBox.height; - if (anchor === "br") return; - const x = - anchor === "tl" || anchor === "bl" - ? this.#resizeStartX + (this.#resizeStartW - w) - : this.#resizeStartX; - const y = - anchor === "tl" || anchor === "tr" - ? this.#resizeStartY + (this.#resizeStartH - h) - : this.#resizeStartY; + const handle = this.#activeResizeHandle; + if (!handle) return; + const west = handle === "w" || handle === "nw" || handle === "sw"; + const east = handle === "e" || handle === "ne" || handle === "se"; + const north = handle === "n" || handle === "ne" || handle === "nw"; + const south = handle === "s" || handle === "se" || handle === "sw"; + const proposedWidth = west + ? this.#resizeStartW - dx + : east + ? this.#resizeStartW + dx + : this.#resizeStartW; + const proposedHeight = north + ? this.#resizeStartH - dy + : south + ? this.#resizeStartH + dy + : this.#resizeStartH; + const width = Math.max(this.#config.minWidth, proposedWidth); + const height = Math.max(this.#config.minHeight, proposedHeight); + const x = west + ? this.#resizeStartX + (this.#resizeStartW - width) + : this.#resizeStartX; + const y = north + ? this.#resizeStartY + (this.#resizeStartH - height) + : this.#resizeStartY; this.worldTransform = { x, y }; - this.schedule(() => this.writeTransformAndLines(), { - stage: "WRITE_2", - queueId: `${this.id}-transform`, - }); + this.setSize(width, height, handle); + if (west || north) { + this.schedule(() => this.writeTransformAndLines(), { + stage: "WRITE_2", + queueId: `${this.id}-transform`, + }); + } } writeTransformAndLines(): void { @@ -372,21 +629,39 @@ class NodeComponent extends ElementObject { updateNodeLineList(): void { const lines = this.getAllOutgoingLines(); - this.#nodeCallback.onLinesChanged?.(lines); - // Legacy path during the deprecation window. - this._lineListCallback?.(lines); - } - - /** @deprecated Assign `nodeCallback.onLinesChanged` instead. */ - setLineListCallback(callback: (lines: LineComponent[]) => void) { - this._lineListCallback = callback; + this.#callbacks.onLinesChanged?.({ node: this, lines }); } onCursorDown(e: pointerDownProp): void { + // Authorization belongs to one pointer gesture. Clear any stale permission + // before evaluating this pointerdown (including non-primary buttons). + this.#dragPointerId = null; if (e.event.button != 0) { return; } + // Resize is a separate primitive from node dragging and remains available + // even when the consumer registered a narrow drag handle. + const resizeHandle = findResizeHandle(this.engine, e.position, this); + this.#resizeArmed = resizeHandle != null; + this.#activeResizeHandle = resizeHandle?.handle ?? null; + if (resizeHandle) { + this.#resizeHoverController?.activate(resizeHandle, e.event.target); + } + const target = e.event.target as Node | null; + const dragAllowed = + this.#resizeArmed || + ((this.#dragHandles.size === 0 || + [...this.#dragHandles].some((handle) => target && handle.contains(target))) && + this.#callbacks.canStartDrag?.({ + node: this, + pointerId: e.event.pointerId, + position: e.position, + originalEvent: e.event, + }) !== false); + if (!dragAllowed) return; + this.#dragPointerId = e.event.pointerId; + // Claim the pointer from the very first pointer event: waiting for the // drag-start threshold would let the camera pan by one move event before // onDragStart runs. The claim auto-releases when the gesture ends, so no @@ -394,21 +669,32 @@ class NodeComponent extends ElementObject { this.engine.input.claimPointer(e.event.pointerId); this._hasMoved = false; - // Synchronous point test against this node's own resize hitbox (no reliance - // on the frame-delayed sweep) decides resize-vs-move for this gesture. - this.#resizeArmed = !!this.#resizeHitBox?.containsWorldPoint( - e.position.x, - e.position.y, - ); - if (!getSelectList(this.global).includes(this)) { + const selection = [...getSelectList(this.global)]; + this.#selectedAtPointerDown = selection.includes(this); + this.#pointerSelectionMode = + this.#callbacks.resolveSelectionMode?.({ + node: this, + selected: this.#selectedAtPointerDown, + selection, + originalEvent: e.event, + }) ?? "replace"; + + if (this.#pointerSelectionMode === "replace" && !this.#selectedAtPointerDown) { for (const node of [...getSelectList(this.global)]) { node.setSelected(false); } this.setSelected(true); + } else if ( + (this.#pointerSelectionMode === "add" || + this.#pointerSelectionMode === "toggle") && + !this.#selectedAtPointerDown + ) { + this.setSelected(true); } } onDragStart(prop: dragStartProp): void { + if (this.#dragPointerId !== prop.pointerId) return; if (this.#resizeArmed) { this._resizing = true; this.#resizeStartW = this.#hitBox.width; @@ -422,15 +708,39 @@ class NodeComponent extends ElementObject { snapData(this.global).resizingNode = this; return; } - for (const node of getSelectList(this.global)) { - node.setStartPositions(); - node._mouseDownX = prop.start.x; - node._mouseDownY = prop.start.y; + if (!this.#config.lockPosition && this.#config.edgePan) { + this.#edgePanPointerId = prop.pointerId; + this.engine.edgePanController?.startEdgePan( + prop.pointerId, + prop.start, + (position) => this.#moveSelectionToPointer(position), + ); + } + const selected = [...getSelectList(this.global)]; + this.#dragRoots = selected.filter( + (node) => + !selected.some( + (candidate) => + candidate !== node && candidate.containsSelectionDragNode(node), + ), + ); + this.#lastDragPosition = prop.start; + for (const node of this.#dragRoots) { + node.beginSelectionDrag(prop.start); } + this.#dragCommitNodes = [ + ...new Set(this.#dragRoots.flatMap((node) => node.selectionDragNodes())), + ]; this._hasMoved = true; + this.#callbacks.onDragStart?.({ + node: this, + pointerId: prop.pointerId, + position: prop.start, + }); } onDrag(prop: dragProp): void { + if (this.#dragPointerId !== prop.pointerId) return; if (this.global == null) { console.error("Global stats is null"); return; @@ -443,11 +753,47 @@ class NodeComponent extends ElementObject { return; } if (this.#config.lockPosition) return; - for (const node of getSelectList(this.global)) { - node.setDragPosition(prop); + if (this.#edgePanPointerId != null) { + this.engine.edgePanController?.updateEdgePan( + this.#edgePanPointerId, + prop.position, + ); + } + this.#moveSelectionToPointer(prop.position); + this.#callbacks.onDrag?.({ + node: this, + pointerId: prop.pointerId, + position: prop.position, + }); + } + + #moveSelectionToPointer(position: eventPosition): void { + this.#lastDragPosition = position; + for (const node of this.#dragRoots) { + node.setDragPosition({ position } as dragProp); } } + /** @internal Hook used to build one deduplicated multi-selection drag session. */ + beginSelectionDrag(position: eventPosition): void { + this.setStartPositions(); + this._mouseDownX = position.x; + this._mouseDownY = position.y; + } + + /** @internal Whether this node's drag behavior already carries `node`. */ + containsSelectionDragNode(_node: NodeComponent): boolean { + return false; + } + + /** @internal Nodes whose final positions belong to this drag root's commit. */ + selectionDragNodes(): NodeComponent[] { + return [this]; + } + + /** @internal Finalize any temporary carry state owned by this drag root. */ + finishSelectionDrag(): void {} + setDragPosition(prop: dragProp) { const dx = prop.position.x - this._mouseDownX; const dy = prop.position.y - this._mouseDownY; @@ -463,16 +809,33 @@ class NodeComponent extends ElementObject { } onDragEnd(prop: dragEndProp) { - + // A pointerdown rejected by a drag handle/predicate still becomes a generic + // input drag gesture once it crosses the engine threshold. It must not + // commit stale selection coordinates on release. + if (this.#dragPointerId !== prop.pointerId) return; + if (this.#edgePanPointerId != null) { + this.engine.edgePanController?.stopEdgePan(this.#edgePanPointerId); + this.#edgePanPointerId = null; + } if (this._resizing) { this.#applyResizeDrag( prop.end.x - this._mouseDownX, prop.end.y - this._mouseDownY, ); - this.#nodeCallback.onResizeCommit?.(this.#hitBox.width, this.#hitBox.height); + this.#callbacks.onResizeCommit?.({ + node: this, + handle: this.#activeResizeHandle, + x: this.worldTransform.x, + y: this.worldTransform.y, + width: this.#hitBox.width, + height: this.#hitBox.height, + }); this._resizing = false; this.#resizeArmed = false; + this.#activeResizeHandle = null; snapData(this.global).resizingNode = null; + this.#dragPointerId = null; + this.#refreshResizeHover(prop.end); // A resized node's center may have moved into/out of a group. for (const group of getGroups(this.global)) { if ((group as unknown) !== this) group.refreshMembership(true); @@ -480,8 +843,18 @@ class NodeComponent extends ElementObject { return; } - for (const node of getSelectList(this.global)) { - node.setUpPosition(prop); + // The live position is authoritative. Recomputing from the raw pointer-up + // coordinate would discard edge-pan compensation and can make the release + // frame jump away from what the user was dragging. + if (this.#lastDragPosition) { + this.#moveSelectionToPointer(this.#lastDragPosition); + } + for (const node of this.#dragRoots) { + node.finishSelectionDrag(); + node.schedule(() => node.writeTransformAndLines(), { + stage: "WRITE_2", + queueId: `${node.id}-transform`, + }); } // A settled node may have entered or left a group; groups re-evaluate @@ -489,8 +862,32 @@ class NodeComponent extends ElementObject { // current before the next group drag. The structural GroupLike type keeps // node.ts free of any group import. for (const group of getGroups(this.global)) { - if ((group as unknown) !== this) group.refreshMembership(true); + group.refreshMembership(true); } + this.emitDragCommit(prop); + this.#dragRoots = []; + this.#dragCommitNodes = []; + this.#lastDragPosition = null; + this.#dragPointerId = null; + } + + protected emitDragCommit(prop: dragEndProp): void { + this.#callbacks.onDragCommit?.({ + node: this, + pointerId: prop.pointerId, + position: prop.end, + nodes: this.getDragCommitNodes().map((node) => ({ + node, + x: node.worldTransform.x, + y: node.worldTransform.y, + })), + }); + } + + protected getDragCommitNodes(): NodeComponent[] { + return this.#dragCommitNodes.length + ? [...this.#dragCommitNodes] + : [...getSelectList(this.global)]; } setUpPosition(prop: dragEndProp) { @@ -508,7 +905,8 @@ class NodeComponent extends ElementObject { }); } - onUp(_prop: pointerUpProp) { + onUp(prop: pointerUpProp) { + if (this.#dragPointerId !== prop.event.pointerId) return; // pointerUp is dispatched to whatever is under the release point, which for a // resize may be a DIFFERENT node than the one being resized. Skip click-select @@ -516,14 +914,23 @@ class NodeComponent extends ElementObject { if (snapData(this.global).resizingNode) return; if (this.#resizeArmed) { this.#resizeArmed = false; + this.#activeResizeHandle = null; + this.#refreshResizeHover(prop.position, prop.event.target); return; } if (this._hasMoved == false) { - for (const node of [...getSelectList(this.global)]) { - node.setSelected(false); + if (this.#pointerSelectionMode === "replace") { + for (const node of [...getSelectList(this.global)]) { + if (node !== this) node.setSelected(false); + } + this.setSelected(true); + } else if (this.#pointerSelectionMode === "add") { + this.setSelected(true); + } else { + this.setSelected(!this.#selectedAtPointerDown); } - this.setSelected(true); + this.#dragPointerId = null; } this._hasMoved = false; } @@ -589,15 +996,29 @@ class NodeComponent extends ElementObject { } } + #refreshResizeHover(position: eventPosition, target?: EventTarget | null): void { + this.#resizeHoverController?.clear(); + const handle = findResizeHandle(this.engine, position); + if (handle) this.#resizeHoverController?.activate(handle, target); + } + destroy() { + if (this.#edgePanPointerId != null) { + this.engine.edgePanController?.stopEdgePan(this.#edgePanPointerId); + this.#edgePanPointerId = null; + } for (const connector of Object.values(this._connectors)) { connector.deleteAllLines(); } this.setSelected(false); - if (this.#resizeHitBox) { + if (this.#resizeHitBoxes.size > 0) { + const ownedHandles = new Set(this.#resizeHitBoxes.values()); snapData(this.global).resizeHandles = getResizeHandles(this.global).filter( - (handle) => handle !== this.#resizeHitBox, + (handle) => !ownedHandles.has(handle as ResizeHandleCollider), ); + this.#resizeHoverController?.release(this); + this.#resizeHoverController = null; + this.#resizeHitBoxes.clear(); } this._connectors = {}; super.destroy(); diff --git a/assets/snapline/core/src/placement.ts b/assets/snapline/core/src/placement.ts new file mode 100644 index 0000000..3a5cbac --- /dev/null +++ b/assets/snapline/core/src/placement.ts @@ -0,0 +1,189 @@ +export interface PlacementPoint { + x: number; + y: number; +} + +export interface PlacementSize { + width: number; + height: number; +} + +export interface PlacementAnchor { + x: number; + y: number; +} + +export interface PlacementSnapshot { + active: boolean; + payload: T | null; + screen: PlacementPoint | null; + world: PlacementPoint | null; + position: PlacementPoint | null; + size: PlacementSize | null; + anchor: PlacementAnchor; + allowed: boolean; +} + +export interface PlacementEvent extends PlacementSnapshot { + payload: T; + screen: PlacementPoint; + world: PlacementPoint; + position: PlacementPoint; + size: PlacementSize; + originalEvent?: PointerEvent | KeyboardEvent; +} + +export interface PlacementCancelEvent { + controller: PlacementController; + payload: T; + reason: "cancel" | "escape" | "secondary-button" | "outside"; + originalEvent?: PointerEvent | KeyboardEvent; +} + +export interface PlacementCallbacks { + canPlace?: (event: PlacementEvent) => boolean; + onPreview?: (event: PlacementEvent) => void; + onCommit?: (event: PlacementEvent) => void; + onCancel?: (event: PlacementCancelEvent) => void; + onChange?: (snapshot: PlacementSnapshot) => void; +} + +export interface PlacementConfig { + screenToWorld: (screen: PlacementPoint) => PlacementPoint | null; + callbacks?: PlacementCallbacks; + anchor?: PlacementAnchor; +} + +/** + * Framework-agnostic placement state machine. It neither creates nodes nor + * listens to the DOM: adapters feed it pointer positions and consumers decide + * whether a surface is valid and what a committed payload means. + */ +export class PlacementController { + #config: PlacementConfig; + #snapshot: PlacementSnapshot; + + constructor(config: PlacementConfig) { + this.#config = config; + this.#snapshot = { + active: false, + payload: null, + screen: null, + world: null, + position: null, + size: null, + anchor: config.anchor ?? { x: 0.5, y: 0.5 }, + allowed: false, + }; + } + + get snapshot(): PlacementSnapshot { + return this.#snapshot; + } + + get callbacks(): PlacementCallbacks { + return this.#config.callbacks ?? {}; + } + + begin( + payload: T, + size: PlacementSize, + options: { anchor?: PlacementAnchor; screen?: PlacementPoint } = {}, + ): void { + this.#snapshot = { + active: true, + payload, + screen: null, + world: null, + position: null, + size, + anchor: options.anchor ?? this.#config.anchor ?? { x: 0.5, y: 0.5 }, + allowed: false, + }; + this.#emitChange(); + if (options.screen) this.update(options.screen); + } + + update(screen: PlacementPoint, originalEvent?: PointerEvent): boolean { + const current = this.#snapshot; + if (!current.active || current.payload == null || current.size == null) { + return false; + } + const world = this.#config.screenToWorld(screen); + if (!world) return false; + const position = { + x: world.x - current.size.width * current.anchor.x, + y: world.y - current.size.height * current.anchor.y, + }; + const base = { + ...current, + screen, + world, + position, + allowed: true, + }; + const event = this.#event(base, originalEvent); + const allowed = this.callbacks.canPlace?.(event) !== false; + this.#snapshot = { ...base, allowed }; + const finalEvent = this.#event(this.#snapshot, originalEvent); + this.callbacks.onPreview?.(finalEvent); + this.#emitChange(); + return allowed; + } + + commit(originalEvent?: PointerEvent): boolean { + const current = this.#snapshot; + if ( + !current.active || + !current.allowed || + current.payload == null || + current.screen == null || + current.world == null || + current.position == null || + current.size == null + ) { + return false; + } + const event = this.#event(current, originalEvent); + this.#snapshot = { ...current, active: false }; + this.callbacks.onCommit?.(event); + this.#emitChange(); + return true; + } + + cancel( + reason: PlacementCancelEvent["reason"] = "cancel", + originalEvent?: PointerEvent | KeyboardEvent, + ): boolean { + if (!this.#snapshot.active || this.#snapshot.payload == null) return false; + const payload = this.#snapshot.payload; + this.#snapshot = { ...this.#snapshot, active: false, allowed: false }; + this.callbacks.onCancel?.({ + controller: this, + payload, + reason, + ...(originalEvent ? { originalEvent } : {}), + }); + this.#emitChange(); + return true; + } + + #event( + snapshot: PlacementSnapshot, + originalEvent?: PointerEvent, + ): PlacementEvent { + return { + ...snapshot, + payload: snapshot.payload!, + screen: snapshot.screen!, + world: snapshot.world!, + position: snapshot.position!, + size: snapshot.size!, + ...(originalEvent ? { originalEvent } : {}), + }; + } + + #emitChange(): void { + this.callbacks.onChange?.(this.#snapshot); + } +} diff --git a/assets/snapline/core/src/query.ts b/assets/snapline/core/src/query.ts new file mode 100644 index 0000000..85c55af --- /dev/null +++ b/assets/snapline/core/src/query.ts @@ -0,0 +1,45 @@ +import { ConnectorComponent } from "./connector"; +import { GroupNodeComponent } from "./group"; +import { NodeComponent } from "./node"; +import { getSelectList } from "./snapline-globals"; + +type EngineLike = { + global: { + data: unknown; + getEngineObjectTable(engine: unknown): Record; + }; +}; + +function objects(engine: EngineLike): unknown[] { + return Object.values(engine.global.getEngineObjectTable(engine)); +} + +export function getNodes(engine: EngineLike): readonly NodeComponent[] { + return objects(engine).filter( + (object): object is NodeComponent => object instanceof NodeComponent, + ); +} + +export function getConnectors( + engine: EngineLike, +): readonly ConnectorComponent[] { + return objects(engine).filter( + (object): object is ConnectorComponent => + object instanceof ConnectorComponent, + ); +} + +export function getGroupNodes( + engine: EngineLike, +): readonly GroupNodeComponent[] { + return objects(engine).filter( + (object): object is GroupNodeComponent => + object instanceof GroupNodeComponent, + ); +} + +export function getSelectedNodes( + engine: EngineLike, +): readonly NodeComponent[] { + return [...getSelectList(engine.global)]; +} diff --git a/assets/snapline/core/src/select.ts b/assets/snapline/core/src/select.ts index c079536..b2d53a0 100644 --- a/assets/snapline/core/src/select.ts +++ b/assets/snapline/core/src/select.ts @@ -1,11 +1,11 @@ -import { BaseObject, ElementObject, EventProxyFactory } from "@snap-engine/core"; +import { BaseObject, ElementObject } from "@snap-engine/core"; import type { pointerDownProp, pointerMoveProp, pointerUpProp, } from "@snap-engine/core"; import { RectCollider, Collider } from "@snap-engine/core/collision"; -import { NodeComponent } from "./node"; +import { NodeComponent, type SelectionMode } from "./node"; import { getSelectList, snapData } from "./snapline-globals"; /** World-space rectangle the framework renders as the selection box. */ @@ -17,7 +17,21 @@ export interface SelectRect { visible: boolean; } -interface SelectCallback { +export interface SelectStartEvent { + select: RectSelectComponent; + position: { x: number; y: number }; + originalEvent: PointerEvent; +} + +export interface SelectChangeEvent { + select: RectSelectComponent; + selection: readonly NodeComponent[]; +} + +export interface SelectCallbacks { + canStart?: (event: SelectStartEvent) => boolean; + /** Consumer-defined selection policy; SnapLine owns no modifier keys. */ + resolveSelectionMode?: (event: SelectStartEvent) => SelectionMode; /** * The rubber-band rectangle changed — the FRAMEWORK renders it (position, * size, visibility, and any custom styling). Core keeps only the pointer @@ -25,7 +39,12 @@ interface SelectCallback { * deliberately a plain callback with no flush handshake: the box visual is * not paint-atomic, so the framework may flush on its own schedule. */ - onRectChange: null | ((rect: SelectRect) => void); + onRectChange?: (rect: SelectRect) => void; + onSelectionChange?: (event: SelectChangeEvent) => void; +} + +export interface SelectConfig { + callbacks?: SelectCallbacks; } class RectSelectComponent extends ElementObject { @@ -33,9 +52,15 @@ class RectSelectComponent extends ElementObject { _mouseDownX: number; _mouseDownY: number; _selectHitBox: Collider; - #selectCallback: SelectCallback; - - constructor(engine: any, parent: BaseObject | null) { + #callbacks: SelectCallbacks; + #selectionMode: SelectionMode = "replace"; + #baselineSelection = new Set(); + + constructor( + engine: any, + parent: BaseObject | null, + config: SelectConfig = {}, + ) { super(engine, parent); this._state = "none"; @@ -54,18 +79,15 @@ class RectSelectComponent extends ElementObject { snapData(this.global).select = []; - this.#selectCallback = EventProxyFactory( - this, - { onRectChange: null }, - ); + this.#callbacks = config.callbacks ?? {}; } - get selectCallback(): SelectCallback { - return this.#selectCallback; + get callbacks(): SelectCallbacks { + return this.#callbacks; } #fireRect(width: number, height: number, visible: boolean): void { - this.#selectCallback.onRectChange?.({ + this.#callbacks.onRectChange?.({ x: this.worldTransform.x, y: this.worldTransform.y, width, @@ -75,25 +97,38 @@ class RectSelectComponent extends ElementObject { } onGlobalCursorDown(prop: pointerDownProp): void { - if ( - prop.event.button !== 0 || - (prop.event.target && - (prop.event.target as HTMLElement).id !== "sl-background") - ) { + if (prop.event.button !== 0) { return; } - for (let node of [...getSelectList(this.global)]) { - node.setSelected(false); + const startEvent = { + select: this, + position: prop.position, + originalEvent: prop.event, + }; + if (this.#callbacks.canStart?.(startEvent) === false) return; + this.#selectionMode = + this.#callbacks.resolveSelectionMode?.(startEvent) ?? "replace"; + this.#baselineSelection = new Set(getSelectList(this.global)); + if (this.#selectionMode === "replace") { + for (let node of [...getSelectList(this.global)]) { + node.setSelected(false); + } + snapData(this.global).select = []; } - snapData(this.global).select = []; // worldTransform positions the selection collider (its transform parent); // the visual box is framework-rendered from the callback rect. this.worldTransform = { x: prop.position.x, y: prop.position.y }; this._state = "dragging"; this._mouseDownX = prop.position.x; this._mouseDownY = prop.position.y; + this._selectHitBox.width = 0; + this._selectHitBox.height = 0; this.#fireRect(0, 0, true); + this.#callbacks.onSelectionChange?.({ + select: this, + selection: [...getSelectList(this.global)], + }); this._selectHitBox.event.collider.onBeginContact = ( _: Collider, @@ -101,7 +136,15 @@ class RectSelectComponent extends ElementObject { ) => { if (otherObject.parent instanceof NodeComponent) { let node = otherObject.parent as NodeComponent; - node.setSelected(true); + node.setSelected( + this.#selectionMode === "toggle" + ? !this.#baselineSelection.has(node) + : true, + ); + this.#callbacks.onSelectionChange?.({ + select: this, + selection: [...getSelectList(this.global)], + }); } }; this._selectHitBox.event.collider.onEndContact = ( @@ -110,7 +153,11 @@ class RectSelectComponent extends ElementObject { ) => { if (otherObject.parent instanceof NodeComponent) { let node = otherObject.parent as NodeComponent; - node.setSelected(false); + node.setSelected(this.#baselineSelection.has(node)); + this.#callbacks.onSelectionChange?.({ + select: this, + selection: [...getSelectList(this.global)], + }); } }; } diff --git a/assets/snapline/core/src/snapline-globals.ts b/assets/snapline/core/src/snapline-globals.ts index 71b4235..22b5bea 100644 --- a/assets/snapline/core/src/snapline-globals.ts +++ b/assets/snapline/core/src/snapline-globals.ts @@ -1,4 +1,4 @@ -import type { CircleCollider } from "@snap-engine/core/collision"; +import type { RectCollider } from "@snap-engine/core/collision"; import type { NodeComponent } from "./node"; /** @@ -25,7 +25,7 @@ export interface SnapLineSharedData { /** All live groups; notified on any node's drop so membership stays settled. */ groups?: GroupLike[]; /** Registered resize hitboxes; input.ts routes pointerdowns over them. */ - resizeHandles?: CircleCollider[]; + resizeHandles?: RectCollider[]; /** The node mid-resize, so an unrelated pointerUp doesn't click-select. */ resizingNode?: NodeComponent | null; /** @@ -54,7 +54,7 @@ export function getGroups(global: { data: any }): GroupLike[] { return data.groups; } -export function getResizeHandles(global: { data: any }): CircleCollider[] { +export function getResizeHandles(global: { data: any }): RectCollider[] { const data = snapData(global); if (!data.resizeHandles) data.resizeHandles = []; return data.resizeHandles; diff --git a/assets/snapline/react/README.md b/assets/snapline/react/README.md new file mode 100644 index 0000000..7fa59d0 --- /dev/null +++ b/assets/snapline/react/README.md @@ -0,0 +1,34 @@ +# @snap-engine/snapline-react + +React 18/19 adapters for SnapLine node graph primitives. + +## Install + +```bash +npm install react react-dom @snap-engine/core \ + @snap-engine/snapline @snap-engine/snapline-react +``` + +## Components + +The package exports `Engine`, `Node`, `Group`, `Connector`, `Line`, `Select`, +and `Placement`. Each component is also available from a named subpath. + +```tsx +import { Engine, Group, Node, Select } from "@snap-engine/snapline-react"; + +export function Graph() { + return ( + + + + Process + +``` + +Geometry props resynchronize after mount while active gestures update locally. +Consumer callbacks compose with the adapter's rendering callbacks. + +Full documentation: https://snapengine.dev/docs/snapline/introduction diff --git a/assets/snapline/svelte/package.json b/assets/snapline/svelte/package.json index 6c292c5..85251c9 100644 --- a/assets/snapline/svelte/package.json +++ b/assets/snapline/svelte/package.json @@ -1,7 +1,6 @@ { "name": "@snap-engine/snapline-svelte", - "private": true, - "version": "0.2.0", + "version": "0.3.0", "repository": { "type": "git", "url": "git+https://github.com/tfukaza/SnapEngineJS.git", @@ -10,14 +9,18 @@ "description": "Svelte components for node graph UI", "type": "module", "svelte": "./src/index.ts", + "types": "./src/index.ts", "exports": { ".": { + "types": "./src/index.ts", "svelte": "./src/index.ts" }, "./Node.svelte": "./src/Node.svelte", + "./Group.svelte": "./src/Group.svelte", "./Connector.svelte": "./src/Connector.svelte", "./Line.svelte": "./src/Line.svelte", - "./Select.svelte": "./src/Select.svelte" + "./Select.svelte": "./src/Select.svelte", + "./Placement.svelte": "./src/Placement.svelte" }, "keywords": [ "node-graph", @@ -29,7 +32,7 @@ "license": "MIT", "dependencies": { "@snap-engine/core": "^0.4.1", - "@snap-engine/snapline": "^0.2.0" + "@snap-engine/snapline": "^0.3.0" }, "files": [ "src", diff --git a/assets/snapline/svelte/src/Connector.svelte b/assets/snapline/svelte/src/Connector.svelte index b5fcfd4..928c5ad 100644 --- a/assets/snapline/svelte/src/Connector.svelte +++ b/assets/snapline/svelte/src/Connector.svelte @@ -2,6 +2,8 @@ import { NodeComponent, ConnectorComponent, + type ConnectorCallbacks, + type SnapLineMetadata, } from "@snap-engine/snapline"; import type { Engine } from "@snap-engine/core"; import { getContext, onDestroy, onMount } from "svelte"; @@ -10,18 +12,32 @@ name, maxConnectors = 1, allowDragOut = true, + metadata = {}, + callbacks = {}, + edgePan = true, + connectorObject = null, + data = {}, }: { name: string; maxConnectors?: number; allowDragOut?: boolean; + metadata?: SnapLineMetadata; + callbacks?: ConnectorCallbacks; + edgePan?: boolean; + connectorObject?: ConnectorComponent | null; + data?: Record; } = $props(); let engine: Engine = getContext("engine"); let nodeObject: NodeComponent = getContext("nodeObject"); - let connector = new ConnectorComponent(engine, nodeObject, { + const ownsConnector = connectorObject == null; + let connector = connectorObject ?? new ConnectorComponent(engine, nodeObject, { name: name, maxConnectors: maxConnectors, allowDragOut: allowDragOut, + metadata, + callbacks, + edgePan, }); nodeObject.addConnectorObject(connector); @@ -36,7 +52,7 @@ }); onDestroy(() => { - connector.destroy(); + if (ownsConnector) connector.destroy(); }); @@ -44,6 +60,7 @@ bind:this={connectorDOM} data-snapline-type="connector" data-snapline-name={name} + {...Object.fromEntries(Object.entries(data).map(([key, value]) => [`data-${key}`, value]))} class={`connector ${allowDragOut ? "right" : "left"}`} > diff --git a/assets/snapline/svelte/src/Group.svelte b/assets/snapline/svelte/src/Group.svelte index 81ba046..3547c44 100644 --- a/assets/snapline/svelte/src/Group.svelte +++ b/assets/snapline/svelte/src/Group.svelte @@ -1,7 +1,7 @@ + + + +{#if snapshot.active && preview} + {@render preview(snapshot)} +{/if} diff --git a/assets/snapline/svelte/src/Select.svelte b/assets/snapline/svelte/src/Select.svelte index 1f44219..0b0abce 100644 --- a/assets/snapline/svelte/src/Select.svelte +++ b/assets/snapline/svelte/src/Select.svelte @@ -1,18 +1,18 @@ @@ -12,7 +12,7 @@
- +
Input
diff --git a/demo/svelte/src/demo/node_ui_group/NodeUIGroupDemo.svelte b/demo/svelte/src/demo/node_ui_group/NodeUIGroupDemo.svelte index f16cfca..90899e4 100644 --- a/demo/svelte/src/demo/node_ui_group/NodeUIGroupDemo.svelte +++ b/demo/svelte/src/demo/node_ui_group/NodeUIGroupDemo.svelte @@ -6,11 +6,16 @@ // The framework hands the member NodeComponent to these callbacks; a consumer // hangs any visual cue off them. Here we tag the member's element so the e2e // (and the eye) can see which nodes belong to the group. - function onMemberEnter(node: any) { - node.element?.setAttribute("data-member", "true"); - } - function onMemberLeave(node: any) { - node.element?.removeAttribute("data-member"); + function onMembershipChange(event: { + added: Array<{ element?: HTMLElement | null }>; + removed: Array<{ element?: HTMLElement | null }>; + }) { + for (const node of event.added) { + node.element?.setAttribute("data-member", "true"); + } + for (const node of event.removed) { + node.element?.removeAttribute("data-member"); + } } @@ -23,8 +28,7 @@ y={60} width={520} height={460} - {onMemberEnter} - {onMemberLeave} + {onMembershipChange} /> diff --git a/demo/svelte/src/demo/node_ui_group/NodeUINestedGroupDemo.svelte b/demo/svelte/src/demo/node_ui_group/NodeUINestedGroupDemo.svelte new file mode 100644 index 0000000..e07ee8a --- /dev/null +++ b/demo/svelte/src/demo/node_ui_group/NodeUINestedGroupDemo.svelte @@ -0,0 +1,82 @@ + + + +
+
+ markMembership("data-outer-member", event)} + /> + + markMembership("data-inner-member", event)} + /> + + + + + !(node instanceof GroupNodeComponent) && centerContained} + onMembershipChange={(event) => markMembership("data-optout-member", event)} + /> + + +
+
+ + diff --git a/demo/svelte/src/demo/node_ui_resize/NodeUIResizeDemo.svelte b/demo/svelte/src/demo/node_ui_resize/NodeUIResizeDemo.svelte index 1ef8d74..8f9acce 100644 --- a/demo/svelte/src/demo/node_ui_resize/NodeUIResizeDemo.svelte +++ b/demo/svelte/src/demo/node_ui_resize/NodeUIResizeDemo.svelte @@ -12,7 +12,7 @@ the line must stay glued. --> - +
diff --git a/demo/svelte/src/demo/node_ui_resize/ResizableNode.svelte b/demo/svelte/src/demo/node_ui_resize/ResizableNode.svelte index 0d61331..eaf3b20 100644 --- a/demo/svelte/src/demo/node_ui_resize/ResizableNode.svelte +++ b/demo/svelte/src/demo/node_ui_resize/ResizableNode.svelte @@ -1,7 +1,7 @@ @@ -12,7 +12,7 @@ {x} {y} {resizable} - {resizeAnchor} + {resizeHandles} minWidth={140} minHeight={90} > diff --git a/docs/index.mdx b/docs/index.mdx index 7fcfbc2..f87063b 100644 --- a/docs/index.mdx +++ b/docs/index.mdx @@ -4,7 +4,10 @@ order: 0 sectionTitle: Start Here sectionOrder: 0 --- -## Build with SnapSort +## Asset Documentation +For documentation covering the assets built using SnapEngine, see +[SnapSort](/docs/snapsort/introduction) for sortable interfaces and +[SnapLine](/docs/snapline/introduction) for node graph interfaces. Most application developers should start with [SnapSort](/docs/snapsort/introduction), an unstyled drag-and-drop toolkit built on SnapEngine. diff --git a/docs/snapengine/reference/camera.mdx b/docs/snapengine/reference/camera.mdx index c899608..a98f03c 100644 --- a/docs/snapengine/reference/camera.mdx +++ b/docs/snapengine/reference/camera.mdx @@ -111,6 +111,26 @@ cameraControl.zoomBy(-0.1); cameraControl.zoomBy(0.1, 200, 150); ``` +### Edge panning for drag owners + +Enable programmatic edge panning when composing the camera with a drag system +such as SnapLine: + +```ts +const cameraControl = new CameraControl(engine, { + edgePan: { + enabled: true, + edgeDistance: 48, + maxSpeed: 600, + }, +}); +``` + +Drag owners use `startEdgePan(pointerId, position, onFrame)`, +`updateEdgePan(pointerId, position)`, and `stopEdgePan(pointerId)`. The frame +callback receives the pointer position converted through the camera after each +pan, keeping dragged content anchored while the pointer is stationary. + ## Public API | API | Description | diff --git a/docs/snapline/guides/01_core_concepts.mdx b/docs/snapline/guides/01_core_concepts.mdx new file mode 100644 index 0000000..88cffbd --- /dev/null +++ b/docs/snapline/guides/01_core_concepts.mdx @@ -0,0 +1,41 @@ +--- +title: Core concepts and connections +description: Understand engines, nodes, connectors, lines, coordinates, and ownership. +order: 1 +sectionTitle: Guides +sectionOrder: 2 +--- + + + + + +## Object model + +- One SnapEngine supplies input dispatch, scheduling, collision data, and the + camera coordinate transform. +- A `NodeComponent` owns connector objects and graph properties. +- A `ConnectorComponent` describes direction, capacity, metadata, and + connection policy. +- A `LineComponent` joins two connectors and keeps its SVG path attached while + either node moves. + +`maxConnectors={-1}` permits unlimited incoming connections, `0` makes an +output-only connector, and a positive number caps incoming connections. +`allowDragOut` controls whether a connection gesture can begin there. + +## Coordinates + +Persist node positions in world space. Browser pointer positions begin in +screen space, pass through camera space, and then become world positions. +Placement callbacks report all three useful representations instead of making +applications repeat that conversion. + +## Rendering ownership + +Core objects never insert, remove, or reparent framework-rendered elements. +Adapters render collections and dimensions; core updates transforms, SVG +geometry, and `data-selected`. This rule keeps React and Svelte reconciliation +authoritative. diff --git a/docs/snapline/guides/02_selection_resize.mdx b/docs/snapline/guides/02_selection_resize.mdx new file mode 100644 index 0000000..45e32d1 --- /dev/null +++ b/docs/snapline/guides/02_selection_resize.mdx @@ -0,0 +1,64 @@ +--- +title: Selection and resizing +description: Configure rectangle selection, drag surfaces, resize handles, and controlled geometry. +order: 2 +sectionTitle: Guides +sectionOrder: 2 +--- + + + + + +`Select` starts a rubber-band gesture on unclaimed background space. Selection +is reflected in `getSelectedNodes(engine)` and on each node through +`data-selected`. + +SnapLine does not assign meanings to Shift, Control, or any other key. Use +`callbacks.resolveSelectionMode` on nodes and selectors to translate the +application's input policy into `"replace"`, `"add"`, or `"toggle"`: + +```ts +const callbacks = { + resolveSelectionMode: ({ originalEvent }) => + originalEvent.shiftKey ? "toggle" : "replace", +}; +``` + +For a rubber band, `"add"` preserves the baseline selection while adding the +nodes touched by the rectangle. `"toggle"` inverts touched nodes relative to +that baseline. Membership in a group never selects a node. + +Set `resizable` to enable all eight handles, or pass an exact list: + +```svelte framework=svelte + saveSize(event)} +/> +``` + +```tsx framework=react + +``` + +Geometry props are hybrid-controlled: changed props resynchronize the object, +while active drags update locally without waiting for an application render. +Persist final values from `onDragCommit` and `onResizeCommit`. + +Register a specific header or handle with `registerDragHandle()` (Vanilla), +`useNodeHandle()` (React), or the component’s exposed node object (Svelte) when +the entire node should not begin a move. diff --git a/docs/snapline/guides/03_groups.mdx b/docs/snapline/guides/03_groups.mdx new file mode 100644 index 0000000..a7b9fa5 --- /dev/null +++ b/docs/snapline/guides/03_groups.mdx @@ -0,0 +1,44 @@ +--- +title: Groups and nesting +description: Use exclusive automatic membership, nested group trees, and custom parent resolution. +order: 3 +sectionTitle: Guides +sectionOrder: 2 +--- + + + + + +Group membership is evaluated at settle points: initial measurement, node +drops, group moves, resize commits, and group removal. + +- Every node has at most one direct parent. +- Ordinary nodes join when their center is inside a group. +- A nested group must fit completely inside its parent. +- The smallest eligible group wins, producing an innermost-first hierarchy. +- Dragging an outer group carries all descendants without adding them to the + current selection. + +`group.members` contains direct members. `group.descendants` contains the +deduplicated recursive subtree, and `getParentGroup(node)` returns the settled +direct parent. + +Use `canContain` to reject application-specific node types. For overlapping +policies, configure one resolver per engine: + +```ts +import { setGroupMembershipResolver } from "@snap-engine/snapline/group"; + +const disposePolicy = setGroupMembershipResolver(engine, (event) => { + const pinned = event.candidates.find( + (group) => group.metadata.role === "pinned", + ); + return pinned ?? event.defaultParent; +}); +``` + +A resolver may return one of the safe candidates or `null`. Persistence remains +application-owned: use membership deltas to update group IDs in your document. diff --git a/docs/snapline/guides/04_placement_camera.mdx b/docs/snapline/guides/04_placement_camera.mdx new file mode 100644 index 0000000..b694768 --- /dev/null +++ b/docs/snapline/guides/04_placement_camera.mdx @@ -0,0 +1,38 @@ +--- +title: Placement and camera interaction +description: Build palette placement previews with correct screen-to-world conversion and cancellation. +order: 4 +sectionTitle: Guides +sectionOrder: 2 +--- + + + + + +`PlacementController` is a framework-neutral state machine. It follows a +payload and size, calculates an anchored world position, validates previews, +and reports commit or cancellation. It deliberately does not create nodes. + +```ts +const placement = new PlacementController({ + screenToWorld(screen) { + const camera = engine.camera!.getCameraFromScreen(screen.x, screen.y); + const world = engine.camera!.getWorldFromCamera(camera[0], camera[1]); + return { x: world[0], y: world[1] }; + }, + callbacks: { + canPlace: ({ position }) => isInsideWorkspace(position), + onCommit: ({ payload, position }) => addNode(payload, position), + }, +}); + +placement.begin(template, { width: 180, height: 96 }); +``` + +Svelte and React `Placement` adapters feed pointer and Escape events into the +controller and render an optional preview. Connector and node drags claim their +pointer so the camera does not pan during the same gesture. Edge pan is enabled +only when the engine exposes an edge-pan controller and the object permits it. diff --git a/docs/snapline/guides/05_state_styling_accessibility.mdx b/docs/snapline/guides/05_state_styling_accessibility.mdx new file mode 100644 index 0000000..86e309f --- /dev/null +++ b/docs/snapline/guides/05_state_styling_accessibility.mdx @@ -0,0 +1,51 @@ +--- +title: State, styling, and accessibility +description: Persist graph state, style structural hooks, and understand current accessibility boundaries. +order: 5 +sectionTitle: Guides +sectionOrder: 2 +--- + +## Persist application state + +Store stable IDs, world positions, dimensions, node-specific parameters, and +connections in your own document. Recreate core objects from that document and +write changes back from commit callbacks. High-frequency drag callbacks are for +preview UI; commit callbacks are the persistence boundary. + +SnapLine metadata is intentionally untyped application data. Use it for port +roles, node IDs, group roles, or validation hints, not as a replacement for the +canonical document. + +## Style the hooks + +Adapters expose stable attributes including: + +- `data-snapline-type="node|connector|group|selection"` +- `data-snapline-part="group-header|group-resize|node-resize"` +- `data-handle="n|ne|e|se|s|sw|w|nw"` +- `data-selected="true|false"` + +SnapLine supplies only structural positioning and pointer requirements. Node +cards, connector shapes, line strokes, selection fills, focus rings, and group +headers belong to the application. + +## Accessibility status + +Version `0.3` is pointer-first. Provide semantic buttons for palette actions, +text labels for ports, keyboard-accessible property editing, a non-canvas way +to create/delete connections, visible focus, and announcements for graph +changes. Full keyboard movement, connection, grouping, and placement are not +yet library-provided. Key bindings also remain application-owned: use the +engine queries and component APIs from the application's keyboard handler +instead of expecting SnapLine to bind Delete, Shift, or platform modifiers. + +## Troubleshooting + +- A line that starts in the wrong place usually means a Vanilla integration did + not call `syncDomGeometry()` after the connector DOM committed. +- A node that moves twice is usually being moved both from application pointer + handlers and SnapLine. +- Group membership updates only at settle points by design. +- Keep framework arrays keyed by stable document IDs; never structurally move + their DOM from a core callback. diff --git a/docs/snapline/introduction/01_setup.mdx b/docs/snapline/introduction/01_setup.mdx new file mode 100644 index 0000000..7bea683 --- /dev/null +++ b/docs/snapline/introduction/01_setup.mdx @@ -0,0 +1,88 @@ +--- +title: Installation and setup +description: Install SnapLine and render a first node graph in Vanilla, Svelte, or React. +order: 2 +sectionTitle: Introduction +sectionOrder: 1 +--- + +Install the core package plus the adapter you use. + +```bash +npm install @snap-engine/core @snap-engine/snapline +``` + +```bash framework=svelte +npm install @snap-engine/asset-base-svelte @snap-engine/snapline-svelte +``` + +```bash framework=react +npm install react react-dom @snap-engine/snapline-react +``` + +## First graph + +```svelte framework=svelte + + + + + + Source + + + + Result + + + + ); +} +``` + +```ts framework=vanilla +import { Engine } from "@snap-engine/core"; +import { CollisionEngine } from "@snap-engine/core/collision"; +import { ConnectorComponent, NodeComponent } from "@snap-engine/snapline"; + +const engine = new Engine(); +engine.setCollisionEngine(new CollisionEngine()); +engine.assignDom(document.querySelector("#graph")!); + +const source = new NodeComponent(engine, null); +source.element = document.querySelector("#source")!; +source.worldTransform = { x: 80, y: 90 }; +source.syncDomGeometry(); + +const output = new ConnectorComponent(engine, source, { + name: "value", + maxConnectors: -1, + allowDragOut: true, +}); +source.addConnectorObject(output); +``` + +Adapters create and destroy core objects automatically unless you supply an +existing object. Vanilla integrations assign committed DOM elements and call +`syncDomGeometry()` after layout. diff --git a/docs/snapline/introduction/index.mdx b/docs/snapline/introduction/index.mdx new file mode 100644 index 0000000..90359b0 --- /dev/null +++ b/docs/snapline/introduction/index.mdx @@ -0,0 +1,43 @@ +--- +title: SnapLine +description: Node graph interaction primitives for Vanilla JavaScript, Svelte, and React. +order: 1 +sectionTitle: Introduction +sectionOrder: 1 +--- + +SnapLine is the node-graph layer built on SnapEngine. It supplies draggable and +resizable nodes, typed connectors, SVG lines, rectangle selection, nested +groups, and palette placement without prescribing your graph document or node +design. + +SnapLine is experimental in `0.3`. APIs may change before `1.0` and breaking +changes will not be hidden behind legacy compatibility aliases. + +## Pick the responsibility boundary + +SnapLine owns gestures, collision geometry, transforms, and line positioning. +Your application owns node records, port types, validation, persistence, +undo/redo, labels, and styling. Svelte and React remain responsible for +structural DOM; SnapLine only writes transforms and state attributes on +elements those frameworks rendered. + +## Packages + +| Package | Use | +| --- | --- | +| `@snap-engine/snapline` | Framework-neutral core objects and policies | +| `@snap-engine/snapline-svelte` | Svelte 5 adapters | +| `@snap-engine/snapline-react` | React 18/19 adapters | + +Start with [installation and setup](/docs/snapline/introduction/01_setup), then +read [core concepts](/docs/snapline/guides/01_core_concepts). + +> [!WARNING] +> SnapLine manipulation is currently pointer-first. Applications must provide +> labels, focus behavior, keyboard alternatives, and ARIA relationships needed +> by their audience. + +Machine-readable documentation is available from +[`/docs/snapline/llms.txt`](/docs/snapline/llms.txt). Add `.md` to any docs URL +for clean Markdown. diff --git a/docs/snapline/reference/index.mdx b/docs/snapline/reference/index.mdx new file mode 100644 index 0000000..7837a32 --- /dev/null +++ b/docs/snapline/reference/index.mdx @@ -0,0 +1,19 @@ +--- +title: API reference +description: Entry points and framework-specific references for SnapLine 0.3. +order: 1 +sectionTitle: Reference +sectionOrder: 3 +--- + +Use the framework selector to switch between equivalent Vanilla, Svelte, and +React pages. + +| Package | Primary exports | +| --- | --- | +| `@snap-engine/snapline` | Node, connector, line, selection, group, placement, and query core APIs | +| `@snap-engine/snapline-svelte` | `Node`, `Connector`, `Line`, `Select`, `Group`, `Placement` | +| `@snap-engine/snapline-react` | `Engine`, `Node`, `Connector`, `Line`, `Select`, `Group`, `Placement` | + +Supported core subpaths are `node`, `connector`, `line`, `select`, `group`, +`placement`, and `query`. diff --git a/docs/snapline/reference/react/group.mdx b/docs/snapline/reference/react/group.mdx new file mode 100644 index 0000000..edfb2c1 --- /dev/null +++ b/docs/snapline/reference/react/group.mdx @@ -0,0 +1,21 @@ +--- +title: Group API +description: React Group props, callbacks, geometry, and forwarded ref. +order: 2 +sectionTitle: Reference +sectionOrder: 3 +framework: react +frameworkKey: group +--- + +`GroupProps` combines node geometry and resize props with `title`, +`headerContent`, `canContain`, `groupCallbacks`, and membership/commit +convenience callbacks. + +The forwarded ref is the `GroupNodeComponent`. The group renders a +pointer-transparent body, an interactive header, and visual resize cues backed +by core collision handles. + +Geometry changes resynchronize after mount. Callback props remain current +across renders and are composed with callbacks already present on a supplied +core object. diff --git a/docs/snapline/reference/react/index.mdx b/docs/snapline/reference/react/index.mdx new file mode 100644 index 0000000..3ae9851 --- /dev/null +++ b/docs/snapline/reference/react/index.mdx @@ -0,0 +1,28 @@ +--- +title: React API +description: React SnapLine components, props, callbacks, contexts, and refs. +order: 1 +sectionTitle: Reference +sectionOrder: 3 +framework: react +frameworkKey: overview +--- + +`Engine` creates or accepts a core engine and provides it through context. + +| Component | Important props | +| --- | --- | +| `Node` | `nodeObject`, geometry, resize configuration, callbacks, `lineComponent` | +| `Connector` | `connectorObject`, role/capacity configuration, callbacks | +| `Line` | `line`, SVG presentation | +| `Select` | callbacks and presentation | +| `Group` | node geometry, header content, membership policy and callbacks | +| `Placement` | controller, cancellation behavior, render function | + +`Node` and `Group` forward refs to their core objects. `Connector` exposes a +`ConnectorRef`, and `useNodeHandle()` returns a callback ref for a dedicated +drag surface. + +Changed geometry props resynchronize the core object. Consumer callback objects +and convenience callback props are composed, deduplicating the same function +reference rather than overwriting one another. diff --git a/docs/snapline/reference/react/placement.mdx b/docs/snapline/reference/react/placement.mdx new file mode 100644 index 0000000..9e80b33 --- /dev/null +++ b/docs/snapline/reference/react/placement.mdx @@ -0,0 +1,17 @@ +--- +title: Placement API +description: React Placement controller binding, preview renderer, and cancellation props. +order: 3 +sectionTitle: Reference +sectionOrder: 3 +framework: react +frameworkKey: placement +--- + +Pass a core `PlacementController` to `Placement`. Supply `children` as a +render function when an active preview should be displayed. + +The component forwards pointer movement, primary commit, secondary-button +cancel, outside cancel, and Escape cancel according to its boolean props. +Application state should create the actual node from the controller’s +`onCommit` event. diff --git a/docs/snapline/reference/svelte/group.mdx b/docs/snapline/reference/svelte/group.mdx new file mode 100644 index 0000000..da9ff88 --- /dev/null +++ b/docs/snapline/reference/svelte/group.mdx @@ -0,0 +1,21 @@ +--- +title: Group API +description: Svelte Group props, snippets, callbacks, geometry, and ownership. +order: 2 +sectionTitle: Reference +sectionOrder: 3 +framework: svelte +frameworkKey: group +--- + +`Group` accepts `x`, `y`, `width`, `height`, minimum dimensions, resize handle +configuration, `metadata`, `callbacks`, `groupCallbacks`, `canContain`, and +`edgePan`. + +Use `title` for a text header or `headerContent` for a custom snippet. The +header is the move surface; the group body remains pointer-transparent so +member nodes receive input. + +`onMembershipChange`, `onResizeCommit`, and `onDragCommit` are convenience +callbacks composed with their callback-object equivalents. `getNodeObject()` +returns the core group. diff --git a/docs/snapline/reference/svelte/index.mdx b/docs/snapline/reference/svelte/index.mdx new file mode 100644 index 0000000..2d53bea --- /dev/null +++ b/docs/snapline/reference/svelte/index.mdx @@ -0,0 +1,28 @@ +--- +title: Svelte API +description: Svelte 5 SnapLine components, props, callbacks, and object access. +order: 1 +sectionTitle: Reference +sectionOrder: 3 +framework: svelte +frameworkKey: overview +--- + +Wrap components in `Engine` from `@snap-engine/asset-base-svelte`. + +| Component | Important props | +| --- | --- | +| `Node` | `nodeObject`, `x`, `y`, `width`, `height`, resize configuration, callbacks | +| `Connector` | `name`, `maxConnectors`, `allowDragOut`, `metadata`, callbacks | +| `Line` | `line` | +| `Select` | `callbacks`, `className` | +| `Group` | Node geometry plus `title`, `headerContent`, `canContain`, membership callbacks | +| `Placement` | `controller`, cancellation options, `preview` snippet | + +`getNodeObject()` exposes the underlying object from `Node` and `Group`; +`Connector.object()` exposes its connector. Supplied objects are not destroyed +when the component unmounts. + +Changed geometry props are authoritative. During a live pointer gesture the +adapter renders local updates and reports the final values through commit +callbacks. diff --git a/docs/snapline/reference/svelte/placement.mdx b/docs/snapline/reference/svelte/placement.mdx new file mode 100644 index 0000000..ddc150a --- /dev/null +++ b/docs/snapline/reference/svelte/placement.mdx @@ -0,0 +1,17 @@ +--- +title: Placement API +description: Svelte Placement controller binding, preview snippet, and cancellation props. +order: 3 +sectionTitle: Reference +sectionOrder: 3 +framework: svelte +frameworkKey: placement +--- + +Pass a core `PlacementController` to `Placement`. The component listens at +window scope while the controller is active and optionally renders +`preview(snapshot)`. + +`cancelOnOutside`, `cancelOnSecondaryButton`, and `cancelOnEscape` default to +`true`. Creation and persistence belong in the controller’s `onCommit` +callback. diff --git a/docs/snapline/reference/vanilla/group.mdx b/docs/snapline/reference/vanilla/group.mdx new file mode 100644 index 0000000..9fc2091 --- /dev/null +++ b/docs/snapline/reference/vanilla/group.mdx @@ -0,0 +1,23 @@ +--- +title: Group API +description: Core group configuration, exclusive hierarchy, callbacks, and resolver API. +order: 2 +sectionTitle: Reference +sectionOrder: 3 +framework: vanilla +frameworkKey: group +--- + +`GroupConfig` extends `NodeConfig` with `width`, `height`, `canContain`, and +`groupCallbacks`. + +| Member | Meaning | +| --- | --- | +| `members` | Read-only direct member set | +| `descendants` | Read-only recursive member set | +| `parentGroup` | Settled direct parent or `null` | +| `refreshMembership(fireDelta)` | Reconcile engine membership after an external geometry change | + +`GroupMembershipEvent` contains `added`, `removed`, and the final direct +`members`. `setGroupMembershipResolver(engine, resolver)` overrides the default +innermost candidate and returns a cleanup function. diff --git a/docs/snapline/reference/vanilla/index.mdx b/docs/snapline/reference/vanilla/index.mdx new file mode 100644 index 0000000..df9680f --- /dev/null +++ b/docs/snapline/reference/vanilla/index.mdx @@ -0,0 +1,33 @@ +--- +title: Vanilla and core API +description: Framework-neutral SnapLine classes, configuration, callbacks, and lifecycle. +order: 1 +sectionTitle: Reference +sectionOrder: 3 +framework: vanilla +frameworkKey: overview +--- + +## Main classes + +| Class | Responsibility | +| --- | --- | +| `NodeComponent` | Position, selection, properties, resize, and connectors | +| `ConnectorComponent` | Connection capacity, policy, metadata, and gestures | +| `LineComponent` | Connection state and SVG geometry | +| `RectSelectComponent` | Background rectangle selection | +| `GroupNodeComponent` | Resizable exclusive membership and recursive carry | +| `PlacementController` | Preview, validation, commit, and cancellation state | + +Core objects require an engine with collision support. Assign each committed +element to its object, then call `syncDomGeometry()`. Destroy owned objects when +their records are removed. + +## Query helpers + +`getNodes`, `getConnectors`, `getGroupNodes`, and `getSelectedNodes` return +engine-scoped snapshots. `getParentGroup` returns settled ownership. + +Callbacks use event objects carrying the relevant component, metadata, pointer +information, and final geometry. Configuration objects are not graph +persistence. diff --git a/docs/snapline/reference/vanilla/placement.mdx b/docs/snapline/reference/vanilla/placement.mdx new file mode 100644 index 0000000..70e840c --- /dev/null +++ b/docs/snapline/reference/vanilla/placement.mdx @@ -0,0 +1,22 @@ +--- +title: Placement API +description: Core PlacementController state, callbacks, anchors, and lifecycle. +order: 3 +sectionTitle: Reference +sectionOrder: 3 +framework: vanilla +frameworkKey: placement +--- + +Create `PlacementController` with `screenToWorld`, optional callbacks, and an +optional normalized anchor. + +| Method | Result | +| --- | --- | +| `begin(payload, size, options)` | Starts a preview | +| `update(screen, event?)` | Recalculates position and returns whether it is allowed | +| `commit(event?)` | Emits a valid commit and ends the session | +| `cancel(reason, event?)` | Emits cancellation and ends the session | +| `snapshot` | Current immutable placement state | + +Callbacks are `canPlace`, `onPreview`, `onCommit`, `onCancel`, and `onChange`. diff --git a/package-lock.json b/package-lock.json index d5c38db..5c17d59 100644 --- a/package-lock.json +++ b/package-lock.json @@ -130,7 +130,7 @@ }, "assets/snapline/core": { "name": "@snap-engine/snapline", - "version": "0.2.0", + "version": "0.3.0", "license": "MIT", "dependencies": { "@snap-engine/core": "^0.4.1" @@ -138,24 +138,25 @@ }, "assets/snapline/react": { "name": "@snap-engine/snapline-react", - "version": "0.1.0", + "version": "0.3.0", "license": "MIT", "dependencies": { "@snap-engine/asset-base-react": "^0.1.0", "@snap-engine/core": "^0.4.1", - "@snap-engine/snapline": "^0.2.0" + "@snap-engine/snapline": "^0.3.0" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "assets/snapline/svelte": { "name": "@snap-engine/snapline-svelte", - "version": "0.2.0", + "version": "0.3.0", "license": "MIT", "dependencies": { "@snap-engine/core": "^0.4.1", - "@snap-engine/snapline": "^0.2.0" + "@snap-engine/snapline": "^0.3.0" }, "peerDependencies": { "svelte": "^5.0.0" diff --git a/package.json b/package.json index 30c287c..74b5b39 100755 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "build:dev": "FRAMEWORK=test npx vite build --mode development", "validate:packages": "node scripts/validate-packages.mjs", "check:website": "npm run check --prefix website", - "check:adapters": "FRAMEWORK=test svelte-check --tsconfig assets/asset-base/svelte/tsconfig.json && FRAMEWORK=test svelte-check --tsconfig assets/snapsort/svelte/tsconfig.json", + "check:adapters": "FRAMEWORK=test svelte-check --tsconfig assets/asset-base/svelte/tsconfig.json && FRAMEWORK=test svelte-check --tsconfig assets/snapsort/svelte/tsconfig.json && FRAMEWORK=test svelte-check --tsconfig assets/snapline/svelte/tsconfig.json", "typecheck": "tsc --noEmit", "ci": "npm run validate:packages && npm run typecheck && npm run lint && npm run check:adapters && npm run check:website && npm run build", "prepublishOnly": "npm run lint", diff --git a/scripts/validate-packages.mjs b/scripts/validate-packages.mjs index 73d1380..2d6d3ed 100644 --- a/scripts/validate-packages.mjs +++ b/scripts/validate-packages.mjs @@ -74,6 +74,10 @@ function sourceFiles(directory) { return files; } +function hasGlob(value) { + return /[*?[{\]}]/.test(value); +} + for (const entry of packages) { const { directory, file, manifest } = entry; if (manifest.private) continue; @@ -94,6 +98,17 @@ for (const entry of packages) { } } + for (const includedPath of manifest.files ?? []) { + if (hasGlob(includedPath)) continue; + const resolved = path.resolve(directory, includedPath); + if ( + !resolved.startsWith(`${directory}${path.sep}`) || + !fs.existsSync(resolved) + ) { + errors.push(`${file}: declared publish path does not exist: ${includedPath}`); + } + } + let packedFiles = new Set(); try { const output = execFileSync( @@ -112,6 +127,22 @@ for (const entry of packages) { errors.push(`${file}: published tarball omits target: ${target}`); } } + for (const includedPath of manifest.files ?? []) { + if (hasGlob(includedPath)) continue; + const resolved = path.resolve(directory, includedPath); + if (!fs.existsSync(resolved)) continue; + const normalized = includedPath.replace(/^\.\//, "").replace(/\/$/, ""); + const included = fs.statSync(resolved).isDirectory() + ? [...packedFiles].some((packedPath) => + packedPath.startsWith(`${normalized}/`), + ) + : packedFiles.has(normalized); + if (!included) { + errors.push( + `${file}: published tarball omits declared path: ${includedPath}`, + ); + } + } const declared = { ...manifest.dependencies, diff --git a/src/engine.ts b/src/engine.ts index a7b6e5a..937363b 100755 --- a/src/engine.ts +++ b/src/engine.ts @@ -2,6 +2,7 @@ import { StationaryCamera } from "./camera"; import type { Camera } from "./camera"; import { GlobalManager } from "./global"; import { InputControl } from "./input"; +import type { eventPosition } from "./input"; import { BaseObject, FrameTask, detachAnimationFromOwner } from "./object"; import type { CollisionEngine } from "./collision"; import type { AnimationInterface } from "./animation"; @@ -10,6 +11,16 @@ import type { FrameStats } from "./object"; export interface EngineConfig {} +export interface EdgePanController { + startEdgePan( + pointerId: number, + position: eventPosition, + onFrame: (position: eventPosition) => void, + ): void; + updateEdgePan(pointerId: number, position: eventPosition): void; + stopEdgePan(pointerId: number): void; +} + const DEFAULT_ENGINE_CONFIG: EngineConfig = {}; function reportFrameTaskError(error: unknown): void { @@ -94,6 +105,7 @@ class Engine { #containerElement: HTMLElement | null = null; // The DOM element for the engine's container. #containerBounds: ContainerBounds | null = null; // Cached bounding rect of the container #camera: Camera | null = null; // Optional camera instance + #edgePanController: EdgePanController | null = null; #collisionEngine: CollisionEngine | null = null; // Optional collision engine instance #animationList: AnimationInterface[] = []; // List of active animations, if animation engine is enabled #animationProcessor: AnimationProcessor | null = null; @@ -179,6 +191,14 @@ class Engine { this.#camera = camera; } + get edgePanController(): EdgePanController | null { + return this.#edgePanController; + } + + set edgePanController(controller: EdgePanController | null) { + this.#edgePanController = controller; + } + get collisionEngine(): CollisionEngine | null { return this.#collisionEngine; } diff --git a/src/index.ts b/src/index.ts index f081c1b..03144ad 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,5 @@ import { Engine } from "./engine"; +import type { EdgePanController } from "./engine"; import { CoreObject, ElementObject, @@ -21,6 +22,7 @@ import type { pinchEndProp, PinchSnapshot, InputControlConfig, + eventPosition, } from "./input"; import { getDomProperty, cloneDomProperty, EventProxyFactory } from "./util"; import { Camera } from "./camera"; @@ -50,6 +52,8 @@ export { type pinchEndProp, type PinchSnapshot, type InputControlConfig, + type eventPosition, + type EdgePanController, type DomProperty, type CameraConfig, mouseButtonBitmap, diff --git a/tests/e2e/docs-framework-code.spec.ts b/tests/e2e/docs-framework-code.spec.ts index 4e560c4..7102283 100644 --- a/tests/e2e/docs-framework-code.spec.ts +++ b/tests/e2e/docs-framework-code.spec.ts @@ -189,3 +189,62 @@ test("project llms.txt files expose ordered framework-aware Markdown trees", asy ); expect(snapEngineIndex).not.toContain("/docs/snapsort/"); }); + +test("SnapLine docs expose framework switching, live demos, Markdown, and llms index", async ({ + page, + request, +}) => { + const response = await page.goto( + "/docs/snapline/introduction/01_setup?framework=svelte", + ); + expect(response?.status()).toBe(200); + await page.waitForFunction( + () => localStorage.getItem("preferredCodeFramework") === "svelte", + ); + await expect(page.locator("#desktop-doc-framework")).toHaveValue("svelte"); + await expect( + page.locator(".framework-code-block:visible").filter({ + hasText: "@snap-engine/snapline-svelte", + }), + ).toHaveCount(2); + + await page.locator("#desktop-doc-framework").selectOption("react"); + await expect(page.locator(".doc-article")).toHaveAttribute( + "data-framework", + "react", + ); + await expect( + page.locator(".framework-code-block:visible").filter({ + hasText: "@snap-engine/snapline-react", + }), + ).toHaveCount(2); + + await page.goto("/docs/snapline/guides/03_groups"); + await expect(page.locator(".snapline-demo")).toBeVisible(); + await expect( + page.locator("[data-snapline-type='group']"), + ).toHaveCount(2); + await expect(page.getByText("Outer group", { exact: true })).toBeVisible(); + + const markdown = await request.get( + "/docs/snapline/guides/03_groups.md?framework=svelte", + ); + expect(markdown.status()).toBe(200); + const markdownText = await markdown.text(); + expect(markdownText).toContain("# Groups and nesting"); + expect(markdownText).toContain( + "This page includes interactive diagrams or demos.", + ); + expect(markdownText).not.toContain(" { +async function endpointsOf(line: Locator) { + return line.evaluate((svg) => { const rect = svg.getBoundingClientRect(); const transform = new DOMMatrixReadOnly(getComputedStyle(svg).transform); const path = svg.querySelector("path"); @@ -57,6 +57,10 @@ async function lineEndpoints(page: Page) { }); } +async function lineEndpoints(page: Page) { + return endpointsOf(page.locator("[data-snapline-type='connector-line']")); +} + function expectPointCloseTo( actual: { x: number; y: number }, expected: { x: number; y: number }, @@ -102,6 +106,33 @@ test("selects and drags a node", async ({ page }) => { expect(endBox!.y - startBox!.y).toBeLessThan(65); }); +test("a node follows the pointer live on repeated drags", async ({ page }) => { + const node = page.locator("[data-snapline-type='node']", { + hasText: "Node B", + }); + const first = await node.boundingBox(); + expect(first).not.toBeNull(); + + await dragFromTo( + page, + { x: first!.x + 40, y: first!.y + 24 }, + { x: first!.x + 90, y: first!.y + 64 }, + ); + + const settled = await node.boundingBox(); + expect(settled).not.toBeNull(); + await page.mouse.move(settled!.x + 40, settled!.y + 24); + await page.mouse.down(); + await page.mouse.move(settled!.x + 120, settled!.y + 84, { steps: 8 }); + await waitForAnimationFrame(page); + + const live = await node.boundingBox(); + expect(live).not.toBeNull(); + expect(live!.x - settled!.x).toBeGreaterThan(65); + expect(live!.y - settled!.y).toBeGreaterThan(45); + await page.mouse.up(); +}); + test("connects an output connector to an input connector", async ({ page }) => { const nodeA = page.locator("[data-snapline-type='node']", { hasText: "Node A", @@ -119,6 +150,80 @@ test("connects an output connector to an input connector", async ({ page }) => { await expect(line.locator("path")).toHaveAttribute("d", /C/); }); +test("replaces the oldest line when a finite input is full", async ({ + page, +}) => { + const nodeA = page.locator("[data-snapline-type='node']", { + hasText: "Node A", + }); + const nodeB = page.locator("[data-snapline-type='node']", { + hasText: "Node B", + }); + const nodeC = page.locator("[data-snapline-type='node']", { + hasText: "Node C", + }); + const input = nodeB.locator("[data-snapline-name='input']"); + const outputA = nodeA.locator("[data-snapline-name='output']"); + const outputC = nodeC.locator("[data-snapline-name='output']"); + + await dragFromTo(page, await centerOf(outputA), await centerOf(input)); + await expect(page.locator("[data-snapline-type='connector-line']")).toHaveCount( + 1, + ); + + await dragFromTo(page, await centerOf(outputC), await centerOf(input)); + const lines = page.locator("[data-snapline-type='connector-line']"); + await expect(lines).toHaveCount(1); + + const endpoints = await lineEndpoints(page); + expectPointCloseTo(endpoints.start, await centerOf(outputC)); + expectPointCloseTo(endpoints.end, await centerOf(input)); +}); + +test("evicts only the oldest lines needed for a larger finite capacity", async ({ + page, +}) => { + const nodeA = page.locator("[data-snapline-type='node']", { + hasText: "Node A", + }); + const nodeB = page.locator("[data-snapline-type='node']", { + hasText: "Node B", + }); + const nodeC = page.locator("[data-snapline-type='node']", { + hasText: "Node C", + }); + const input = nodeC.locator("[data-snapline-name='input']"); + const outputA = nodeA.locator("[data-snapline-name='output']"); + const outputB = nodeB.locator("[data-snapline-name='output']"); + const outputC = nodeC.locator("[data-snapline-name='output']"); + const lines = page.locator("[data-snapline-type='connector-line']"); + + await dragFromTo(page, await centerOf(outputA), await centerOf(input)); + await dragFromTo(page, await centerOf(outputB), await centerOf(input)); + await expect(lines).toHaveCount(2); + + await dragFromTo(page, await centerOf(outputC), await centerOf(input)); + await expect(lines).toHaveCount(2); + + const endpoints = await Promise.all([ + endpointsOf(lines.nth(0)), + endpointsOf(lines.nth(1)), + ]); + const expectedStarts = await Promise.all([centerOf(outputB), centerOf(outputC)]); + for (const endpoint of endpoints) { + expectPointCloseTo(endpoint.end, await centerOf(input)); + } + for (const expectedStart of expectedStarts) { + expect( + endpoints.some( + ({ start }) => + Math.abs(start.x - expectedStart.x) <= 3 && + Math.abs(start.y - expectedStart.y) <= 3, + ), + ).toBe(true); + } +}); + test("keeps a line endpoint aligned while the target node is moving", async ({ page, }) => { diff --git a/tests/e2e/snapline-camera.spec.ts b/tests/e2e/snapline-camera.spec.ts index 6c5b3b1..5da931b 100644 --- a/tests/e2e/snapline-camera.spec.ts +++ b/tests/e2e/snapline-camera.spec.ts @@ -85,6 +85,77 @@ test("dragging a connector line does not pan the camera", async ({ page }) => { await expect(page.locator("[data-snapline-type='connector-line']")).toHaveCount(0); }); +test("connector drag edge-pans continuously and keeps the line under the pointer", async ({ + page, +}) => { + const nodeA = page.locator("[data-snapline-type='node']", { hasText: "Node A" }); + const output = nodeA.locator("[data-snapline-name='output']"); + const start = await centerOf(output); + const camera = page.locator("#node-ui-camera-canvas"); + const bounds = await camera.boundingBox(); + expect(bounds).not.toBeNull(); + const edge = { + x: bounds!.x + bounds!.width - 8, + y: Math.min(bounds!.y + bounds!.height - 80, start.y + 100), + }; + + await page.mouse.move(start.x, start.y); + await page.mouse.down(); + await page.mouse.move(edge.x, edge.y, { steps: 12 }); + const before = await cameraTransform(page); + await expect.poll(() => cameraTransform(page)).not.toBe(before); + + const line = page.locator("[data-snapline-type='connector-line']"); + await expect(line).toHaveCount(1); + const endpoint = await line.evaluate((svg) => { + const rect = svg.getBoundingClientRect(); + const path = svg.querySelector("path")?.getAttribute("d") ?? ""; + const numbers = path.match(/-?\d+(?:\.\d+)?/g)?.map(Number) ?? []; + const transform = new DOMMatrixReadOnly(getComputedStyle(svg).transform); + const startPoint = new DOMPoint(numbers[0] ?? 0, numbers[1] ?? 0).matrixTransform(transform); + const endPoint = new DOMPoint(numbers[6] ?? 0, numbers[7] ?? 0).matrixTransform(transform); + const layoutOffsetX = rect.left - startPoint.x; + const layoutOffsetY = rect.top - startPoint.y; + return { + x: endPoint.x + layoutOffsetX, + y: endPoint.y + layoutOffsetY, + }; + }); + expect(Math.abs(endpoint.x - edge.x)).toBeLessThan(8); + expect(Math.abs(endpoint.y - edge.y)).toBeLessThan(8); + + await page.mouse.up(); + await expect(line).toHaveCount(0); +}); + +test("node drag edge-pans while the dragged node stays under the pointer", async ({ + page, +}) => { + const nodeC = page.locator("[data-snapline-type='node']", { hasText: "Node C" }); + const startBox = await nodeC.boundingBox(); + const camera = page.locator("#node-ui-camera-canvas"); + const bounds = await camera.boundingBox(); + expect(startBox).not.toBeNull(); + expect(bounds).not.toBeNull(); + const start = { x: startBox!.x + 40, y: startBox!.y + 24 }; + const edge = { + x: bounds!.x + bounds!.width - 8, + y: Math.min(bounds!.y + bounds!.height - 60, start.y + 80), + }; + + await page.mouse.move(start.x, start.y); + await page.mouse.down(); + await page.mouse.move(edge.x, edge.y, { steps: 12 }); + const before = await cameraTransform(page); + await expect.poll(() => cameraTransform(page)).not.toBe(before); + const draggedBox = await nodeC.boundingBox(); + expect(edge.x - draggedBox!.x).toBeGreaterThan(20); + expect(edge.x - draggedBox!.x).toBeLessThan(draggedBox!.width); + expect(edge.y - draggedBox!.y).toBeGreaterThan(5); + expect(edge.y - draggedBox!.y).toBeLessThan(draggedBox!.height); + await page.mouse.up(); +}); + test("panButton='middle': middle-drag pans, left-drag does not", async ({ page }) => { await page.goto("/snapline-camera?panButton=middle"); await expect(page.locator("[data-snapline-type='node']")).toHaveCount(3); diff --git a/tests/e2e/snapline-group.spec.ts b/tests/e2e/snapline-group.spec.ts index 7198ddf..fdfa86f 100644 --- a/tests/e2e/snapline-group.spec.ts +++ b/tests/e2e/snapline-group.spec.ts @@ -25,12 +25,16 @@ async function dragFromTo( const NODE = "[data-snapline-type='node']"; const MEMBER = "[data-member='true']"; const HEADER = "[data-snapline-part='group-header']"; -const RESIZE = "[data-snapline-part='group-resize']"; +const RESIZE = "[data-snapline-part='group-resize'][data-handle='se']"; function nodeByTitle(page: Page, title: string): Locator { return page.locator(NODE, { hasText: title }); } +function groupByTitle(page: Page, title: string): Locator { + return page.locator("[data-snapline-type='group']", { hasText: title }); +} + test.beforeEach(async ({ page }) => { await page.goto("/snapline-group"); await expect(page.locator(NODE)).toHaveCount(3); @@ -88,7 +92,7 @@ test("moving the group over a node adds it, and the next drag carries it", async // Drag the group right so its box comes to rest over Node B. const header = await centerOf(page.locator(HEADER)); - await dragFromTo(page, header, { x: header.x + 200, y: header.y }); + await dragFromTo(page, header, { x: header.x + 240, y: header.y }); // B did not move this drag (it was not a member at drag start) but is now one. const settledB = await nodeB.boundingBox(); @@ -101,3 +105,108 @@ test("moving the group over a node adds it, and the next drag carries it", async const carriedB = await nodeB.boundingBox(); expect(carriedB!.y - settledB!.y).toBeGreaterThan(60); }); + +test("nested groups carry their full descendant subtree", async ({ page }) => { + await page.goto("/snapline-nested-group"); + const outer = groupByTitle(page, "Outer Group"); + const inner = groupByTitle(page, "Inner Group"); + const direct = nodeByTitle(page, "Direct Node"); + const nested = nodeByTitle(page, "Nested Node"); + const outside = nodeByTitle(page, "Outside Node"); + + await expect(inner).toHaveAttribute("data-outer-member", "true"); + await expect(direct).toHaveAttribute("data-outer-member", "true"); + await expect(nested).toHaveAttribute("data-inner-member", "true"); + await expect(nested).not.toHaveAttribute("data-outer-member", "true"); + + const beforeInner = await inner.boundingBox(); + const beforeDirect = await direct.boundingBox(); + const beforeNested = await nested.boundingBox(); + const beforeOutside = await outside.boundingBox(); + const outerHeader = await centerOf( + outer.locator("[data-snapline-part='group-header']"), + ); + const target = { + x: outerHeader.x + 100, + y: outerHeader.y + 70, + }; + await page.mouse.move(outerHeader.x, outerHeader.y); + await page.mouse.down(); + await page.mouse.move(target.x, target.y, { steps: 12 }); + await page.evaluate( + () => new Promise((resolve) => requestAnimationFrame(() => resolve())), + ); + + const liveInner = await inner.boundingBox(); + const liveDirect = await direct.boundingBox(); + const liveNested = await nested.boundingBox(); + const liveOutside = await outside.boundingBox(); + for (const [before, after] of [ + [beforeInner, liveInner], + [beforeDirect, liveDirect], + [beforeNested, liveNested], + ] as const) { + expect(after!.x - before!.x).toBeGreaterThan(80); + expect(after!.y - before!.y).toBeGreaterThan(50); + } + expect(Math.abs(liveOutside!.x - beforeOutside!.x)).toBeLessThan(8); + expect(Math.abs(liveOutside!.y - beforeOutside!.y)).toBeLessThan(8); + await page.mouse.up(); + + // The nested node remains an inner member and can still be carried by an + // independent inner-group drag after the outer gesture is detached. + const beforeNestedOnly = await nested.boundingBox(); + const beforeDirectOnly = await direct.boundingBox(); + const innerHeader = await centerOf( + inner.locator("[data-snapline-part='group-header']"), + ); + await dragFromTo(page, innerHeader, { + x: innerHeader.x + 60, + y: innerHeader.y + 40, + }); + const afterNestedOnly = await nested.boundingBox(); + const afterDirectOnly = await direct.boundingBox(); + expect(afterNestedOnly!.x - beforeNestedOnly!.x).toBeGreaterThan(45); + expect(afterNestedOnly!.y - beforeNestedOnly!.y).toBeGreaterThan(25); + expect(Math.abs(afterDirectOnly!.x - beforeDirectOnly!.x)).toBeLessThan(8); +}); + +test("partially overlapping groups do not become nested", async ({ page }) => { + await page.goto("/snapline-nested-group"); + const outer = groupByTitle(page, "Outer Group"); + const inner = groupByTitle(page, "Inner Group"); + + // Move the inner group until it overlaps the outer boundary. Center overlap + // alone is insufficient for group nesting; the child must fit completely. + const innerHeader = await centerOf( + inner.locator("[data-snapline-part='group-header']"), + ); + await dragFromTo(page, innerHeader, { + x: innerHeader.x + 260, + y: innerHeader.y, + }); + await expect(inner).not.toHaveAttribute("data-outer-member", "true"); + await expect(outer).not.toHaveAttribute("data-inner-member", "true"); + + const beforeInner = await inner.boundingBox(); + const outerHeader = await centerOf( + outer.locator("[data-snapline-part='group-header']"), + ); + await dragFromTo(page, outerHeader, { + x: outerHeader.x + 80, + y: outerHeader.y + 30, + }); + const afterInner = await inner.boundingBox(); + expect(Math.abs(afterInner!.x - beforeInner!.x)).toBeLessThan(8); +}); + +test("canContain can opt a consumer out of group members", async ({ page }) => { + await page.goto("/snapline-nested-group"); + const optOut = groupByTitle(page, "Opt-out Group"); + const rejected = groupByTitle(page, "Rejected Group"); + const ordinary = nodeByTitle(page, "Opt-in Node"); + + await expect(rejected).not.toHaveAttribute("data-optout-member", "true"); + await expect(ordinary).toHaveAttribute("data-optout-member", "true"); + await expect(optOut).toBeVisible(); +}); diff --git a/tests/e2e/snapline-resize.spec.ts b/tests/e2e/snapline-resize.spec.ts index 7d03617..27836db 100644 --- a/tests/e2e/snapline-resize.spec.ts +++ b/tests/e2e/snapline-resize.spec.ts @@ -79,6 +79,59 @@ test("resize can be grabbed beyond the node's visual edge", async ({ page }) => expect(after!.width - before!.width).toBeGreaterThan(80); }); +test("all four sides and all four corners resize from the expected fixed edge", async ({ page }) => { + const nodeA = page.locator("[data-snapline-type='node']", { hasText: "Resizable A" }); + const cases = [ + { handle: "n", dx: 0, dy: -45 }, + { handle: "ne", dx: 55, dy: -45 }, + { handle: "e", dx: 55, dy: 0 }, + { handle: "se", dx: 55, dy: 45 }, + { handle: "s", dx: 0, dy: 45 }, + { handle: "sw", dx: -55, dy: 45 }, + { handle: "w", dx: -55, dy: 0 }, + { handle: "nw", dx: -55, dy: -45 }, + ] as const; + + for (const resizeCase of cases) { + await page.goto("/snapline-resize"); + await expect(page.locator("[data-snapline-type='node']")).toHaveCount(3); + const before = (await nodeA.boundingBox())!; + const west = resizeCase.handle.includes("w"); + const east = resizeCase.handle.includes("e"); + const north = resizeCase.handle.includes("n"); + const south = resizeCase.handle.includes("s"); + const from = { + x: west ? before.x + 2 : east ? before.x + before.width - 2 : before.x + before.width / 2, + y: north ? before.y + 2 : south ? before.y + before.height - 2 : before.y + before.height / 2, + }; + await dragFromTo(page, from, { + x: from.x + resizeCase.dx, + y: from.y + resizeCase.dy, + }); + const after = (await nodeA.boundingBox())!; + + if (west || east) expect(after.width - before.width).toBeGreaterThan(30); + else expect(Math.abs(after.width - before.width)).toBeLessThan(5); + if (north || south) expect(after.height - before.height).toBeGreaterThan(25); + else expect(Math.abs(after.height - before.height)).toBeLessThan(5); + if (west) expect(Math.abs(after.x + after.width - (before.x + before.width))).toBeLessThan(5); + if (north) expect(Math.abs(after.y + after.height - (before.y + before.height))).toBeLessThan(5); + if (east) expect(Math.abs(after.x - before.x)).toBeLessThan(5); + if (south) expect(Math.abs(after.y - before.y)).toBeLessThan(5); + } +}); + +test("hovering virtual resize surfaces applies and restores the CSS cursor", async ({ page }) => { + const nodeA = page.locator("[data-snapline-type='node']", { hasText: "Resizable A" }); + const box = (await nodeA.boundingBox())!; + await page.mouse.move(box.x + box.width - 2, box.y + box.height / 2); + await expect(nodeA).toHaveAttribute("data-snapline-resize-handle", "e"); + await expect(nodeA).toHaveCSS("cursor", "ew-resize"); + + await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2); + await expect(nodeA).not.toHaveAttribute("data-snapline-resize-handle"); +}); + test("a plain (non-resizable) node moves when grabbed at its BR corner", async ({ page }) => { const nodeB = page.locator("[data-snapline-type='node']", { hasText: "Fixed B" }); const before = await nodeB.boundingBox(); diff --git a/tests/e2e/snapsort-drag-snapshot.spec.ts b/tests/e2e/snapsort-drag-snapshot.spec.ts index ba0dcee..707a17a 100644 --- a/tests/e2e/snapsort-drag-snapshot.spec.ts +++ b/tests/e2e/snapsort-drag-snapshot.spec.ts @@ -67,6 +67,58 @@ test("framework container ownership never inherits Vanilla DOM callbacks", () => ); expect(() => assertCanFireItemSwap(vanilla)).not.toThrow(); }); + +test("visual geometry invalidations coalesce at the root container", async () => { + let nextId = 0; + const queue = { + READ_1: new Map(), + WRITE_1: new Map(), + READ_2: new Map(), + WRITE_2: new Map(), + READ_3: new Map(), + WRITE_3: new Map(), + }; + const events: Array<{ + items: readonly unknown[]; + reasons: readonly string[]; + }> = []; + const engine = { + global: { + data: {}, + queue, + createId: () => `geometry-test-${++nextId}`, + registerObject: () => {}, + }, + input: { + subscribeGlobalCursorEvent: () => {}, + unsubscribeGlobalCursorEvent: () => {}, + }, + }; + const root = new SnapSortContainer(engine, null, { + domOwnership: "framework", + callbacks: { + onVisualGeometryInvalidated: (event) => events.push(event), + }, + }); + const child = new SnapSortContainer(engine, root, { + domOwnership: "framework", + }); + const first = { isGhost: false } as never; + const second = { isGhost: false } as never; + const ghost = { isGhost: true } as never; + + child.invalidateVisualGeometry([first, ghost], "drag"); + root.invalidateVisualGeometry([first, second], "animation"); + + const rootQueue = queue.READ_1.get(root.id); + expect(rootQueue?.size).toBe(1); + const task = [...rootQueue!.values()][0]!; + for (const callback of task.callback ?? []) await callback(); + + expect(events).toHaveLength(1); + expect(events[0]!.items).toEqual([first, second]); + expect(events[0]!.reasons).toEqual(["drag", "animation"]); +}); type Box = Rect & { scaleX: number; scaleY: number; @@ -3760,6 +3812,93 @@ test.describe("Snapsort drag-start snapshot layout", () => { ).toHaveLength(0); }); + test("animates displaced items when the ghost reorders upward", async ({ + page, + }, testInfo) => { + // Mirror of the downward test above. Upward reorders place the ghost + // BEFORE the displaced items in FLIP snapshot order, so a failure while + // animating the ghost entry silently kills every displaced-item + // animation — a class of bug the downward drag cannot catch. + const consoleMessages: string[] = []; + page.on("console", (message) => consoleMessages.push(message.text())); + await page.goto("/?demo=drop_snap_nested", { waitUntil: "networkidle" }); + + const verticalColumn = await demoBoxByHeading(page, "Vertical Column"); + const item1 = await itemByTextIn(verticalColumn, "Item 1"); + const item4 = await itemByTextIn(verticalColumn, "Item 4"); + const item1Center = center(await itemRect(item1)); + const item4Center = center(await itemRect(item4)); + + await page.mouse.move(item4Center.x, item4Center.y); + await page.mouse.down(); + + await page.evaluate(() => { + const win = window as unknown as { + __sawDisplacedTransform?: boolean; + __displacedObserver?: MutationObserver; + }; + win.__sawDisplacedTransform = false; + const isDisplaced = (element: Element) => + element.id !== "spacer" && !/Item 4/.test(element.textContent ?? ""); + const check = (element: Element) => { + if ( + isDisplaced(element) && + /^translate3d\(/.test((element as HTMLElement).style.transform) + ) { + win.__sawDisplacedTransform = true; + } + }; + const observer = new MutationObserver((mutations) => { + for (const mutation of mutations) check(mutation.target as Element); + }); + for (const element of document.querySelectorAll(".snapsort-item")) { + observer.observe(element, { + attributes: true, + attributeFilter: ["style"], + }); + check(element); + } + win.__displacedObserver = observer; + }); + + for (let step = 1; step <= 12; step++) { + await page.mouse.move( + item4Center.x, + item4Center.y + ((item1Center.y - item4Center.y) * step) / 12, + ); + await page.waitForTimeout(16); + } + + const animated = await page.waitForFunction( + () => + (window as unknown as { __sawDisplacedTransform?: boolean }) + .__sawDisplacedTransform === true, + ); + await page.mouse.up(); + await page.waitForTimeout(120); + + await writeJson( + testInfo.outputPath("reorder-animation-upward-trace.json"), + { + animated: await animated.jsonValue(), + errors: consoleMessages.filter((message) => + /Missing drag snapshot|Unhandled|TypeError|ReferenceError/i.test( + message, + ), + ), + }, + ); + + expect(await animated.jsonValue()).toBe(true); + expect( + consoleMessages.filter((message) => + /Missing drag snapshot|Unhandled|TypeError|ReferenceError/i.test( + message, + ), + ), + ).toHaveLength(0); + }); + test("keeps the final slot reachable in a plain vertical list", async ({ page, }) => { diff --git a/website/src/lib/components/docs/SnapLineDemo.svelte b/website/src/lib/components/docs/SnapLineDemo.svelte new file mode 100644 index 0000000..bc97585 --- /dev/null +++ b/website/src/lib/components/docs/SnapLineDemo.svelte @@ -0,0 +1,279 @@ + + +
+ +
+ {#if mode === "placement"} + + {/if} + +
+ {#if mode === "connections"} + + Source + Drag the port +
+
+ + Result + Drop it here +
+ +
+
+ {:else if mode === "selection"} + - Process + + Process +
); } @@ -30,5 +32,17 @@ export function Graph() { `Node` and `Group` forward refs to their core objects. Geometry props resynchronize after mount, and callback props remain live across renders. +Pass native ARIA attributes or DOM event handlers to the outer node element +through `Node`'s `elementProps`. + +Set `virtual` on `Connector` to keep the logical endpoint without rendering a +port. `surfaceStrategies` can then hit-test and anchor against the parent +node's shape, while `capabilities` independently enable source and target +behavior. Keep domain edges in React state and use an opaque line payload as +the stable link from a custom renderer. + +Connector policy, metadata, callbacks, strategies, and `virtual` stay live +across renders. Toggling `virtual` removes or remounts only the visible port; +the logical connector and existing lines are preserved. Full documentation: https://snapengine.dev/docs/snapline/introduction diff --git a/assets/snapline/react/src/Connector.tsx b/assets/snapline/react/src/Connector.tsx index 54207cb..9c8975b 100644 --- a/assets/snapline/react/src/Connector.tsx +++ b/assets/snapline/react/src/Connector.tsx @@ -1,12 +1,20 @@ import { forwardRef, + useCallback, useContext, useEffect, useImperativeHandle, useRef, type CSSProperties, } from "react"; -import { ConnectorComponent, type ConnectorCallbacks, type SnapLineMetadata } from "@snap-engine/snapline"; +import { + ConnectorComponent, + LineComponent, + type ConnectorCapabilities, + type ConnectorCallbacks, + type ConnectorSurfaceStrategy, + type SnapLineMetadata, +} from "@snap-engine/snapline"; import { useSnapLineEngine } from "./Engine"; import { NodeObjectContext } from "./Node"; @@ -19,6 +27,12 @@ export interface ConnectorProps { metadata?: SnapLineMetadata; callbacks?: ConnectorCallbacks; edgePan?: boolean; + capabilities?: Partial; + surfaceStrategies?: readonly ConnectorSurfaceStrategy[]; + /** Keep the logical connector without rendering a visible port element. */ + virtual?: boolean; + colliderRadius?: number; + lineClass?: typeof LineComponent; connectorObject?: ConnectorComponent | null; data?: Record; } @@ -38,6 +52,11 @@ export const Connector = forwardRef( metadata = {}, callbacks = {}, edgePan = true, + capabilities, + surfaceStrategies = [], + virtual = false, + colliderRadius, + lineClass, connectorObject = null, data = {}, }, @@ -49,7 +68,6 @@ export const Connector = forwardRef( throw new Error(" must be rendered inside ."); } - const connectorDomRef = useRef(null); const ownsConnectorRef = useRef(connectorObject == null); const connectorRef = useRef(connectorObject); if (!connectorRef.current) { @@ -60,6 +78,10 @@ export const Connector = forwardRef( metadata, callbacks, edgePan, + capabilities, + surfaceStrategies, + colliderRadius, + lineClass, }); nodeObject.addConnectorObject(connectorRef.current); } @@ -70,23 +92,54 @@ export const Connector = forwardRef( })); useEffect(() => { - if (connectorDomRef.current) { - connector.element = connectorDomRef.current; - } + connector.updateConfig({ + allowDragOut, + maxConnectors, + metadata, + callbacks, + edgePan, + capabilities, + surfaceStrategies, + colliderRadius, + lineClass, + }); + }, [ + allowDragOut, + callbacks, + capabilities, + colliderRadius, + connector, + edgePan, + lineClass, + maxConnectors, + metadata, + surfaceStrategies, + ]); + + const bindConnectorElement = useCallback( + (element: HTMLDivElement | null) => { + connector.bindElement(element); + }, + [connector], + ); + + useEffect(() => { return () => { if (ownsConnectorRef.current) connector.destroy(); }; }, [connector]); + if (virtual) return null; + return (
[`data-${key}`, value]), )} - className={`connector ${allowDragOut ? "right" : "left"} ${className}`.trim()} + className={`connector ${capabilities?.source ?? allowDragOut ? "right" : "left"} ${className}`.trim()} style={{ background: "#4f46e5", border: "2px solid #ffffff", diff --git a/assets/snapline/react/src/EdgeSync.tsx b/assets/snapline/react/src/EdgeSync.tsx new file mode 100644 index 0000000..f571a3c --- /dev/null +++ b/assets/snapline/react/src/EdgeSync.tsx @@ -0,0 +1,65 @@ +import { + EdgeSyncController, + type ConnectorComponent, + type EdgeConnectIntentEvent, + type EdgeDisconnectIntentEvent, + type EdgeEndpoint, + type EdgeLike, +} from "@snap-engine/snapline"; +import { useEffect, useRef } from "react"; +import { useSnapLineEngine } from "./Engine"; + +export interface EdgeSyncProps { + /** The consumer's edge document — the single source of truth. */ + edges: readonly EdgeLike[]; + /** Maps a connector to its semantic endpoint, or null for unmanaged connectors. */ + identity: (connector: ConnectorComponent) => EdgeEndpoint | null; + onEdgeConnect?: (event: EdgeConnectIntentEvent) => void; + onEdgeDisconnect?: (event: EdgeDisconnectIntentEvent) => void; +} + +export function EdgeSync({ + edges, + identity, + onEdgeConnect, + onEdgeDisconnect, +}: EdgeSyncProps) { + const engine = useSnapLineEngine(); + const propsRef = useRef({ edges, identity, onEdgeConnect, onEdgeDisconnect }); + propsRef.current = { edges, identity, onEdgeConnect, onEdgeDisconnect }; + const controllerRef = useRef(null); + + useEffect(() => { + const controller = new EdgeSyncController({ + engine, + identity: (connector) => propsRef.current.identity(connector), + getEdges: () => propsRef.current.edges, + callbacks: { + // For same-frame reconciliation of gesture intents, write the edge + // document inside flushSync in the handler; the microtask sync then + // sees the fresh document before paint. Deferred stores degrade to a + // one-frame pending state, never an inconsistent one. + onEdgeConnect: (event) => { + propsRef.current.onEdgeConnect?.(event); + queueMicrotask(() => controller.sync()); + }, + onEdgeDisconnect: (event) => { + propsRef.current.onEdgeDisconnect?.(event); + queueMicrotask(() => controller.sync()); + }, + }, + }); + controllerRef.current = controller; + controller.sync(); + return () => { + controller.dispose(); + if (controllerRef.current === controller) controllerRef.current = null; + }; + }, [engine]); + + useEffect(() => { + controllerRef.current?.sync(); + }, [edges]); + + return null; +} diff --git a/assets/snapline/react/src/Node.tsx b/assets/snapline/react/src/Node.tsx index 4ca9845..714ebc2 100644 --- a/assets/snapline/react/src/Node.tsx +++ b/assets/snapline/react/src/Node.tsx @@ -8,6 +8,7 @@ import { useState, type ComponentType, type CSSProperties, + type HTMLAttributes, type RefCallback, type ReactNode, } from "react"; @@ -48,6 +49,8 @@ export interface NodeProps { onDragCommit?: (event: NodeDragCommitEvent) => void; onResizeCommit?: (event: NodeResizeEvent) => void; onSizeChange?: (event: NodeResizeEvent) => void; + /** Framework-native attributes and events for the outer node element. */ + elementProps?: HTMLAttributes; } export const Node = forwardRef(function Node( @@ -73,6 +76,7 @@ export const Node = forwardRef(function Node( onDragCommit, onResizeCommit, onSizeChange, + elementProps, }, ref, ) { @@ -146,6 +150,10 @@ export const Node = forwardRef(function Node( } return true; }; + node.callbacks.resolveDragPosition = (event) => + latestRef.current.callbacks.resolveDragPosition?.(event) ?? + original.resolveDragPosition?.(event) ?? + { x: event.x, y: event.y }; node.callbacks.resolveSelectionMode = (event) => latestRef.current.callbacks.resolveSelectionMode?.(event) ?? original.resolveSelectionMode?.(event) ?? @@ -205,6 +213,7 @@ export const Node = forwardRef(function Node( return () => { node.callbacks.canStartDrag = original.canStartDrag; + node.callbacks.resolveDragPosition = original.resolveDragPosition; node.callbacks.resolveSelectionMode = original.resolveSelectionMode; node.callbacks.onDragStart = original.onDragStart; node.callbacks.onDrag = original.onDrag; @@ -247,6 +256,7 @@ export const Node = forwardRef(function Node( ))}
` creates a logical connector without a visible port. +Combine it with `surfaceStrategies` and independent `capabilities` to make a +node border or another application-defined shape act as the connection surface. +Application graph state remains authoritative; an opaque line payload can link +a custom renderer back to the corresponding domain edge. + +Connector policy, metadata, callbacks, strategies, and `virtual` are reactive. +Switching `virtual` detaches or remounts only the visible port; the logical +connector and its existing lines remain intact. Full documentation: https://snapengine.dev/docs/snapline/introduction diff --git a/assets/snapline/svelte/src/Connector.svelte b/assets/snapline/svelte/src/Connector.svelte index 928c5ad..078dcaa 100644 --- a/assets/snapline/svelte/src/Connector.svelte +++ b/assets/snapline/svelte/src/Connector.svelte @@ -2,11 +2,14 @@ import { NodeComponent, ConnectorComponent, + LineComponent, + type ConnectorCapabilities, type ConnectorCallbacks, + type ConnectorSurfaceStrategy, type SnapLineMetadata, } from "@snap-engine/snapline"; import type { Engine } from "@snap-engine/core"; - import { getContext, onDestroy, onMount } from "svelte"; + import { getContext, onDestroy } from "svelte"; let { name, @@ -15,6 +18,11 @@ metadata = {}, callbacks = {}, edgePan = true, + capabilities = undefined, + surfaceStrategies = [], + virtual = false, + colliderRadius = undefined, + lineClass = undefined, connectorObject = null, data = {}, }: { @@ -24,6 +32,12 @@ metadata?: SnapLineMetadata; callbacks?: ConnectorCallbacks; edgePan?: boolean; + capabilities?: Partial; + surfaceStrategies?: readonly ConnectorSurfaceStrategy[]; + /** Keep the logical connector without rendering a visible port element. */ + virtual?: boolean; + colliderRadius?: number; + lineClass?: typeof LineComponent; connectorObject?: ConnectorComponent | null; data?: Record; } = $props(); @@ -38,17 +52,39 @@ metadata, callbacks, edgePan, + capabilities, + surfaceStrategies, + colliderRadius, + lineClass, }); nodeObject.addConnectorObject(connector); - let connectorDOM: HTMLDivElement | null = null; export function object(): ConnectorComponent { return connector; } - onMount(() => { - connector.element = connectorDOM as HTMLElement; + function bindConnectorElement(element: HTMLDivElement) { + connector.bindElement(element); + return { + destroy() { + connector.bindElement(null); + }, + }; + } + + $effect(() => { + connector.updateConfig({ + maxConnectors, + allowDragOut, + metadata, + callbacks, + edgePan, + capabilities, + surfaceStrategies, + colliderRadius, + lineClass, + }); }); onDestroy(() => { @@ -56,13 +92,15 @@ }); -
[`data-${key}`, value]))} - class={`connector ${allowDragOut ? "right" : "left"}`} ->
+{#if !virtual} +
[`data-${key}`, value]))} + class={`connector ${(capabilities?.source ?? allowDragOut) ? "right" : "left"}`} + >
+{/if} diff --git a/demo/svelte/src/demo/node_ui_edges/NodeUIEdgesDemo.svelte b/demo/svelte/src/demo/node_ui_edges/NodeUIEdgesDemo.svelte new file mode 100644 index 0000000..4c35bdf --- /dev/null +++ b/demo/svelte/src/demo/node_ui_edges/NodeUIEdgesDemo.svelte @@ -0,0 +1,136 @@ + + +
+ + + + + + {connectIntents} + {disconnectIntents} + {edges.length} + {intentLog.join("|")} +
+ + +
+
+

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≶@PXtl}$20}+Pka~=Vo4E#q{7Rglr!$vi26g?> zlqI_$_g2xUSqfUg;Db^p;<$j}qXm)^HAEB(Sh(cE-Aasi;6WZKQ77jb7v9bY`!EkC zv}jR>&Y3y!asgmex{d9Fon71N*L_C+0W7ITaB|CqXco z`4~7Ujijg%WicP%n)JpJs^x~uXe7Mn3Y?%(u+mUydL+y=7LhmJJpjX{H7Rr|q_7Hg4C{!}M$gh%edpgWaq#5b8~a$|()> znA)`W*r9`aPagB6-JXLyRf;ojw1H_#00;rl#?s4sd9=CC7O0k%oTLgJ5l=~JCS$}6 zfvJwu%zBM*DJTwk6xN$4fS)IGFCojp1_%&2bKZ1*iHa5enO=5VF{{E|fo?Y1Q*M|N zY{f%f3nPxo3JLBaFUnrE;2WqAg17w|8dUX}#-1X+L@DJNGRv) zbZj)PQfxllD8&=?e&%Q1_VkaQLX{0wMouF#*m=5(bButb&p9JQiDa4U`J>A-YiKay3MB74A6v_?sO`Fkg;jutR2@z%N=pd(S{@btb<6H?t z081@M)KY>*rcbj2p5Hp#lh;CGPUq2kS!8-mU-|qwen%>_6f<5UpLW;31R;=W25_ z3=o6I6bq@cG&qz(&s`EPL--uqJb8H#>{g6T@k+MvjKJQNqA)#eZ4`Z?pAHTa4csd3 zh(dU%Hgb@M;?F#l@lQuZcs)B%IHZUdbtJ^r`E##(?d#tC@Vjl?oLsTG zc1U$(l!_HnPYhl2&_nOI_ul)sX~5D5R;cx9_K%2hr-i{+?8e$b#Ssx_A9^hM#rdi8tW^B#t8 zDk;~+pe<2V)-2LlI4VU^Tv8Po@d)VbRqZxa>^ z)lWfbR#bCGB8E+p8EcJ_T8yF^m*Ii4(DEvxNQ<&(<5Q9yxT|KgM?!QAlZbG!pt!Bz z;*B@n^m9M^b6oVpaC$%bBk4HUD3QUKxM+F*``&lgt6oV8Sq%X)mRH?jfn(`D6a43qkCH0}qtKOx-ICiL+8J z`bo~ok*OrTVmLv=j3oMzYQyj8g;b$S*?QJyu07$9#A|e8$U+4iWHPUUK^F>DW<5Bw zA}jPR=}oI!uI5Pt{^;=Dr=NLt&odfXLXZ@wnl%Da6=C3bPx8n{1;QvRWXtE2Sp-fu zL!n)You)-C2-l&P0+>y6CD0iaBY$^!B>{duVM6gZ0Vetigw`>-4AMq>lEz*tf!_<3T!jl!CxbizR=qzy3NR_1tsMpE~tykYh}d(qsmUe69~BMyXIf0I^lG>~D3J zlkfWQa)B#Od`Ad!1R;bIuAF5+h+gMagHnY?fC`(ibR8jw4Kj`e>@<=&--@6}+N_nk z*A%UHxpkg3a643Fi2f{rqXPwjE{ixFz*rC*$3fUBW(UZ{*$1@32@GvSysJJ5IK+HL zQ@?7eE*9thv>@m?;4vzrQj?u0!)gZ5z?_wF!H^3nO^(SlXM?m^J8JzZXfHx~bCV7- zxm*dr&YaSJPw;PCVGErJs7n!}#nMa9;X3BZFs}||skw6H#EIj7_4&`g^}#niaNqr( z`Sj;5@QY-eRsg8lRX-l%Hg4Os8C#u;*nNk4f|1r)ho`)lS*GY%X4n+#B)w;MP5R>l0m?GQIkC#mq^N{0dn~H(kzA1FDWWM>7y;K00a4%O) zSYwJyl~5fH z6L%|c|CH^*Ak}ZNF5PpG?_U@);c$BhcNh4TIWIA37n*4TExJqz!Yxc}!%R`rkZ2lw z*1vc;Q2<^W_v(77t^4V#Im|5#@isa(&8G-Sy)Xf9y8N+GAO|1N6M4%qFSG*^m6$*a zxyX|E@S(T8{jDGU=$~DG@&+Zil=TbS_{)@YfN&{`D0UQUl^cpU)?@a5rVEwaMoXA! zR+O`RwW|>oo-+l-N%y{4-RNVjr*0XJ9RJ`c1=v@yfy9O+={7dvOazpdOeuiirhCXd zVNs=Q;%*jKY3qPSS4s;4{M4R#ZaBm_lHAuLlx8oCYZD~*SA+ruZg5i>n1JFpXxxd4cQ_lW_6hy4x{h<^TISs-Sd4kzC^FMcX6epV@=+z z809f8*dqkHuMX>&I zLMrXp6;D-S#;zSAVQ&tK?K;{iB_)?b(yM&*F}QFxnuf2sCT;-Szvuk+_QUUZ=pX%~ z4{~kVlpGkUFh>VdC{_&sIgMQ>y~u~D&LO=Ej`@%CrWWS$_!7UP#hr~YyF0?~h>xY$ zL!GmdIyMA93)uRE!wksftsFxoN->G?K|%j{WP3 zh-5_e{`>C#pZ}--kzB#r?B$c1dL_XJMR|IIm4lD1n?7~vv2I7(xJ#Hd6F%S)kJx@gCkMPKHW$=w*Gi=MfZ5;UszQMxF| zTG7kfAN!6Q$+uOpu7lB{-NF$iw=2w?k$M1AyL@pRi(+vOG zHoHw7dK3ylZ1A0MW~Jsit@8p=0SbgZ)C-U|b5tlBZ%pHutmPHM!mbuMxJ)$Ct#1$} z%vFl_*uZRm=BJZ*266(_q^Nlef{4*fUS-w~@-yGkhd$|qP;tUVUV>*Da9zXm^kR_3 zLoS-}1};3fd?Ii_F3-j5X$$@lKMBK*DiNgr%C5Dqi`*rBA{pxyDY#w%;0VJw9^~y; z!7=4EBIbicT>m6;`UH}|A+O7`6hk{#2>@(f&^l%U$NUc2iDWV9B-o1&mw2*;AZ(Yc zU{s$8R}LRO=>1eqMqLhy6n(98*jED04oAw^7@apX5kodt8!(F4lA^T*uPNvR+R@5n zy$3`VVFZPz@Po=BvdOBvguq+-IEydZ9HwuX`|@KBpZ)A3?|%5EsDd-n9$0%M!A0@4l_=i%)Vd-&0SYeEFT%9OQlq7K-9TDxnkV);~f6RH`3chs5J>BgZ7zYTq4{5>~p8?z4!i;C$D?r@yEH}n_K=s zg81lgD)6CYU!Q^X-63^zbeVy;s(=A>FRUofke)X>KCL=Xr?a zIe1OZ@j9D}C9oXe9z|1^60H-kx2yQ&>RFEZ2vbi_ObNg|tYMl>gudHKITM9O%5^X| z(~^5=WouNj=kqpBzs>6cO#{7L#Q9Fz(X-E-gpC<%=l5atOH4Y zh=~`O4~M;JVZ*WPO9qX4-8jSv5HlN@8FF4T4Qv9PD?!fIIc`g_lQjDuH7)f9Fu?S zKE1R?0$;qawWVv=NZwI`Jk4x66<NI!$`ZQrNOTfySd8_Ijjjezjc~NV>OLTjx@Sv{)WDBsi~bE9QbvK()wSu zGKzDeL%rPz9f-5w(F;Ww{hU4FQY12Ct~l}IqWnWERhy@Hs~PGr#bzWH&guoEVzBw& z#tv-74zVjl)Qm*bjup}>j^nZ(&si50k|rywPKi*XU1CPn$fA6dkGiRvce&c*!*;nb zeG~=GiA8xLH?%_^1i6t+NR=US0Zk??-^GAzXA1^GPi!2^u8znz$VNK6#*#e2OWaw& z&eqmhI%;_9`}t%vqyM7IOQcE{fbp;pcQB@5{0U*2sFlPh7%PdzC6A)mTLx;_kgk$d zL-|;J6`_2IaXfHexe5qgx;$K)^-xqV8=HPxwbZ!}Je`9xU|-UsNJUDDs-hs3sNsR! z^j;cBozVq#S8*e6vaMl*$<>+yC~h3Yvxb3>@Y5G=UwHAAuX@$t!-urnQIip$PKGN1 z7rAE)RzNm0vvs4Gz>zaFWT?1M;7BVz22pkyk2y$_0E#urskPUI-5iv|b&BJh_mD?` zN7?B6 zjJU!W7of8xstsPJ-F|=mFjqz3Rg4tQ_}TP6lySizxTe&`$$2mn7ZCNB@}|5fM++v? zKcNFEL~#n9Vpcw$w^kG`>IMlGCr%>y_U5JUeEYk6W%O0AdG+z5$8fk#ak}U11PLOr zr*eP%Hs2LNn#Oj^859E63A$YbUi(txx4-ipoQM=kjhe6^g-ZBXh)lz&rA*kYX3uvE z$7uOJ=Z=b)2pSWhCK2yR_I>$|&F=;+SdXer< z<3I|VHgkiX8HhYwc5(YM-zVmPX2HDPsEo37QJTe~5OEF&PEquEcp zo=BM^n(S2jIm(|`533+J~@+Ku~Zr|N<@=Tj`~@=ISPf%7fy zdAFqVW^~%D#=5q$zu_l;_`@HXY@AYeB}P8+NFJ_5yGXD%;UOR{gzRm`B8F4KX38O#2b^}r z8?n~baX||`*zA7!PTDrTu`4n0pqH?R!>q8Lf=PQA{E8JP$- z5Ac-^ZBy^Me3}HEw_3XO8>P|PFodjNva>{*38=0<=KF(r(&l>!VrNO_Kl8?G=t4|D)qeVDN#57ZXWxF4z#QT4*Ro`ZHk9k zX&eu{MFcV8r$=+IcE9)_hE^_#wPuVHfq%$yH1*~GlB-sZExc+Q)pG3;{#}}@$c>mn zlcJx-SCm>z!yqThKX_=pX0Sl%j-40SNTAR~`Y9pqLF^#Di=bVluTnp?5_8?vlZ$(? z=LV{@l^R{+mS@}%ibeA$e{8zs^ zgW(&*7)=3cY~XqXw@9-rY_|hScV6s{AZ^Z;my$0o3-yTGyt}8qtH>irj)L+cKr&-| z!hX?X+_VqmBp(^5`;0&A7nE5 zXS}IOw&Zg7p$W>W!cYFFaN}dN%)SS!rrH9M3=emykx1jQKW2-F0IQ$gbw9Vo`@Lnp zSm&Tm4DA6WTwD8M5YdENJpPRiKNeWC#Nq{tj~%!gXWB#@ceM%56}>G{s0N=L%8F;x zX)4fYOX*gnpNW>k+_WbDMOT+jt1d+-2P6~6ZEoq8PG_TJG^P_u+~6djdSqr8f>n%g zUd^(URNG%DmP$|34u}CddJ#mcs(BU7lp=Fs71pMCmk-}vi? z-tqP~z448I^6x)-!%a8BqIba0GP3+9C^`-^F{0c=f&#}78; zc&RVM{_cy<*%C?f;EeV08&glYip(y(Waff>&y_EJ_3L-t^@{I)?|XN=>}4o2d*}r4 zPcE`0xD%r%9601>3@$wW#NR&u{BxiB%;)foS1!#$*8I>8avxO)FtoFxhDDGxdLAAI z3e^L`XaNbI@!ny@(n1lBx~ZD-oi>{RlnzN*Z)XFQ?FC_c217tKBg29gzmAB_2HxNB z!LmHde=i| zPoLpZA#$ez!WUT%auSK~aMho6VGDbDJ$9nfT-<2r*;xNy;bAjm0vD@c=swB4mwEnd z_rbadWZeZvCb|UTo34oP`(`!|M48*}uS;<2QDNTY=qW9yq+mB^TCwnqK_ha|R0qan z8{j#|20TtH=6GtZ@CZs|BLRPy7NJYx+ge2^ zcms*qHYxVaSk>zDNi5zGDQqJ!@qh&eGW-BD zEL20luC2+^1b7%*;DktV#C-6HpK2`1ln%}|ob8c~lou*S%Z6%$8xd{s&Mxmphz3q9 zNJlJFDQ}BOfy!J%nKWRZU*m;<0y}=Yk@~M4IN5fka;jYb06+jqL_t&)7#VSF z0LN}RT$w$9&VE3RWw|>;lrE1V;>~QaZ}IUPo?s3-1a|k*Xrt{RMYOA?H5~73c2X+F zTmnD4m)*?pOxqzXEXeMMc zFjEexXS;itfp;jepcU6-7b>t3T?o+?-ihQCb7l#OalPg$*GHq}e^ML6xGPC`tzD4^ z6@@&b2#`8F7YW6J-(;(-#&Z(RRq048( z@fDZ8eGQlj6^m~Kz+Qj!0jvVYSrpQW#MvO_H)Ql3&C`d=q7*IkOu##P_NJo8RTX*CK7t$%Dfo0kWmAUCoQYGq^?{A)|DHEvVc2i0gX zuM889S2=sW#knIQ;mdHBfzYYAto1ic3d4*2P5A@;JTKaFF) zMI%d3umHM{q`}>`DIDulP7Ns^U3{ZZTf^^7WnDxC8wlB^F9MSo{NAq}6SZBbbLqp3 z963;;-P_?BFNmD%{4{pi1%?yHPkiRnpT7T|d+vV2>;L>?AJa?7TA>7x9T(t*A{`*mqX+PwYH4F_OyN5As5ufOx{5As}^#~*+4$6oQ{uHVcApcr?v64BH7P{A#?2ljvedp~&MiO0Y5 z-S0p8=%YuE9p?uM=rm|VIyNS+2kvJn=ud*s>5N|ULmawPfXdGavrCn^>VafMh&Qju z7_5$m#T4y$_0^K&8;f+6GC5{f#suLRdmA?)Qj4QFuZczxw(#aRlF)`IC3wFBa{#V8 z@tc+s7?AxuFZ3*5w!*NZM~`27;#v|SWE!MywZm$^dhXoT4L9EO_!Cc@dgd9UfKpuP zrSgM1(GDYoR9*7HDj5?!d0yL;`m_?8{;MW{%5}+|T zAtFmF1sXJ@LGZe(Gr(qE0}5Qwa2E-kKJM-TC-_1C_DmhW28?>F&|aCeha6*5b&`o0_ROhMM~@su3klz?6oKO)0``z+uV8YWe!-%`Cb~g2io0SO@c=e1%u58pc8#G7s^zF2i^m zEgFuW%sF@5k4SA0NzMO;I`)bn#ja7Q>*7kaj7jQfBQ~MCEF8{;FfAi_Ot!Wq)Q*Xv z$94<=(RzW~)F3@M9PK;GfG{N+BqL@cawFVh5vFSw_VSlntdYV!a!fJ(Ppl+}f=~1< zF=m=%@=pa_9tU=97Sx|o2mA_3@R3d5Ylq_6Y3d@F-4x_~^aOfz;U=e zSR|7Il2B0nRE)fkZbS|1NX|H<2`Lfs52uc*+{5Ly5kWy^fT(=wfZkVAD+#qo#pFew zzH5ZwtKW!Kk@N#53q6#d1Q0`9kX7ti8KWhSDu@%|8wrZQt1eeKM++rMXi9PRTGv3t zYdsf)(@0+9@yFA`WV#S;;hQ#)5fLUs9P{irsKCU058*{h zTNp=}$2g~P9^ZF(^nyXd$-HX~{07`T^eLx>7@w2O+UC5?L=%n4=%8h}1)xd@dx}y% zL>_Fab2}B0`KBR6sqPfp5FV=KCBCUtRJ?!M-FLx4@Z6a3Pq?O zAMn4IqPQaAqgHy1X>)Yynf+R#AJ|-H@?isM);nfdVn&*Ex*U^@pjNSqU{cG3vN0M{ z9)1XL@`npVkQ?wzszB9pHnq&%{nC_~M8AkjO9^2IMb^!B&i^M==d z;fs&nc;k)ScZV#mZSoznk!C|BMft{;FcHNz(I<)on$?uK%BeTLOIE{FhtZy#ac-d% z%y)U(lMOZeHZFXtXCNhQ@MTano|cF!@DgvVi=KJvsZW09b3gmucRljR7milAGI}lCxjk2@YGXJJ^J;ppF4Z@kN@<~&!68uajg$wmd=jIoYALY#!U3G zv^Evlj3mG%^Vqziz6NPkN7!nU90L6fB}7Qo$z>6Q7&Y|JS=f<;(mEF>uXv{fN<8Kz zWg^G#Z(rDkhPyTA9>_!~TAf&osWlt3B?(I+GE>15Vy2#j&FRx;(58+B*0wIyIDPMx zC!c)sZyx&_gySE3Mu6_w%R-2sov8n?+b7-NSS}U@WkacDNG4buyV%*oV)D?1t@AZr zlO8v?5M%{3LxQcTafUX)_0KvSF3n>L-y}GG{Ms{T&hQW**I=FU)6Y?AqgMzW*}d7` z{=ucDKCT-%dgKWAyYhQZ;WT57fZc`?Fqm?pRdU4M-P1tWk zhzT(Vdmt0i+Nhg-jsOr2d&RXGc5kr7;#G#~pt78{LY6NAvV*;V)73 zy6v3}P&uGjaE?WH+30w{9A6}cUDRc)xY%>h(5oI)Rk>nJRIv_ywZkH*+hVCO0BVb~ zhN1ho5UUJ|6+WVsIqU|fD&JO_HJdGKI|yTFR$XSyzFK#|Xqy`FLMsAKm6Ar-xisxq zJKP-7P1g5HFq@7r{BwMjuH9;ouTbDadKubk-K7S_rU+1IAs<7VSfv6{sX9ylP6@&} zri{ZjKJ`leT271BO1V8yNQFBcPNk%WSs1tD?NX!Uk*~!iLy@-8(g=M-tXrLcyn!DK z98OolVY)458w=YVAnf7^`w0tce|~zPa;1*M#`!6-3@458l8y%HreWLA*zA>USgg6l*SIzH#bHHUICVlB!h|3NZHEjqf8uSLY9Q_SP~D- z1V&>^-B8XT%O)WmLoux#B9~r`oKc08i+t@W!B;&_1iW=6S|Hc}&&D)(*>%W7l=~3M zID&aMA?*P*cL`o*D^)}MR8E!|`lO+T zDnz(rNp6IlCBXn6@VF)4!<{ITA}o;liDb3Z=*&VgV)Tks08)_<(xt_Z)`ZBVi%>Cj zf>9t@s=J$AO)mRuLo5rk}h_pdzl16a_26ztAj;YQJWT}m?PZ_+-_`Lr8)l_f~p7&WI4%PUV6_%Hq_U_-_=Eo$j!K&rkSp+f_>zA4M;tj^3Mu~t$qTgHN z8$LQ8^F7l{m9rd5JT)LLRviHFi#N#i>V1>`7Myrbi4-$^_nUH1V^-1)3214`MzWQ# z@)S7*hFkou*zuSZ_$-yWWt>nJFqtv!L>(kO2flGA4CRR4w4qb(9$N$?u?0$YS5iP* z%LaC8#h-e=Fas)OQ^taWT1?mT%-@uWD7ek;l^Y}yqC?G9CZE9w4dQqvKF{W18eQ_k z;%YGe5Ia?pV}t;C1rhl(^dO#IT?;a~dKW^tiimp~YCkc8WKNwpD)X({3)@b%?YhlC zIw3GqL8j@()_Zt`-vFCL)x#t$kL)Lwop%_o(};*Hm7dDs{mP{i*Pi&~Uw-PodtU#Z zcRuu$uY8rsu@1q)D^5Ubb9N-`uZYkFT_xfioyZ+}{xEy>~0(La0e!MELh z`)xkuXdGfgVKwgcbAAWy2jBnRm%sFt=U;g4kuQGv%U^!BaZAt3Sm zCN)ZWm&JxjCaB(XL1cx!V%?6xvW3xIv^u7xAczb^12N(kN9~tL8M-^6CIJ-(VDuqd zN4flZ#sj|=1fML z7%t&lVz?1;-N)v#RuUxOf4$)^hi&scPdc~ZMI=5*TaF%=)w;0-2HwHIJ2JWB0baE8 z>q=ZgR7I>1j1~&Iey%M@PK>LsW5-W$?y56*bZ#rqv=O~*p!FfL1|hu}=o=vRpvp!* zDetIf!}0bR{JbjssXV`h$Tm;j;$cob-2lj|i|~G#S*6h_+50gZ;UV-9HT=pqUup|| zy?-OW&e_&Is4&nRtHoh2c{S}x7^bRJm_WKInIM6%tBzox+QMQ%jSkm4u-Fpe)eZH8 zONjYC0;#TSy{*8?TZFAtj^&oIC6v6Q;A+l7Y(ac}#5*J-O%d+#oURhiPMSjp$eqnH zb%cx0cr25bV_FO@U|-j_MK3O;wQ)g=&r6K%-f=*>=AV&TALS^c8CO}WKMVlDD`Z#r zy7wV|p3VCXK$TP2F>f61Y&mG7i31en^Bsca z9W5YNMT|k zCiKLsaRC&?YC#x`8lbIw@VQtM!keNo5lV?;7}?{m@pr@*|qja|ZbGdK|qmk09p?uY8uhAHh0R4ryt+m+IR&DX=|hFtj^R!X1g z{CWYT7;~MXS?TQ=q$RsEDp-`68;GSQl8kYAK40lTn6P#=jy?-j>m!bc5S~?ST~bh; zG{VI;&?63qwxnF3HiN-V5f!R(Pgz)^C)%s3N(CBjh(KViYL-x06s}Z<(!m&di!3)o z{P0-$0dp~90sWYJCWDHTuS}*5oFghVlP$ub5sQ)?DQ$F&%?fg341)tUkNHPzIk5v^ z1)_VL8fc|Li#;h5T=G6GLhHsD5K-gzd~7K$#gL#z@7R=z$!Ifj)EYsm&;9jGc}%(-5yFlwd=1HGwZp)a6fsWOt6o~1&2ahR z8t$i3AGWacWX*hubNo!rf!_p(t7^z`mLkpzVS#<3=ud(b%FvSPV1M^-J2w zMaT>Ov^*0v9g7_2^h|b)uImB)%3K_N<>*O8Daa0p58Y}g4J?0}Yqf9VDC>MhX=p(( z4M%X&&ZY{{E&+*^xYtghC6$V{Y=>K?3eXohE3xh}kv#orJs$9?h+PapXoWnslv*ty z@RmKP?8Fc!aq-g>N16^CwRX&~l&E$NbUc1Jh)3DF?19p25ukw!huE+Nj}|XO8F?dA zh0pGXKq@!HstDqm0AObGj7io(N<(9IivnJx%J@BW6oCz%S{nBN18$m$a~OWK?a--b zp8eb-Uwr@j-u>WDKk%u~e*U`auJ1IV-+rW#VJ`;IM)VS5ig1Z-4j>z8fW`dsUxSD@ z2+KIzf=8w4=*5pbNuvNdgyC?6d+}6$*jzN?1;AIug?(!9=Kr~}NC$tI{KWA%!Dccbd+ZHle_{|P(u za6ilP&L<})XU)kTAY>zfum^;IECF$u0*bYuy{3O?JJZ^0=CajJuTH17*DS3wqrwzB z%vJ4Zr`2MuTdh<@q1p-tBC;r;gsqAKVc)ZzCFkVK=kvXv_ji&mGtc>*_kG^yx%c~i zws%b!ND(0Z4fnLzkj#|s{w3TQ2^!iH!C zXTIM+uZXC4H09I842aT3FFFtv;VeR-Qmk=xcD`RiNW@wghRF9e0faSv;HB8S7RZGt z6sh7u8DKFBFEE3zT^2y41xQAfSWcN}Ae0bJx*&^C>ZYga0$m$WY-MsXoXq9LQQ#sg zeFl6fi{|rkXQvGl7ZJTsMobzP!oZQS2Kjh36utv%VV`%~#`2!A;$cff^&Ag<)C6jt9d&v0PQb1(SjSRB7@RGAgX&hM)OG{8|s}tvMqKUeO#9^lto9jiUFLZ zh1qsFu!7XFR)T^{1rj7OBxuLT&z+drDv;E2%cw;OcQakPE6ycRkRo!2O^I=l9zr=p zqewcTs}RYsk7P<#>y_5|FWY%fEx)UYGY<9);c@W~_!;YCn#Xc7!hfJ$p2 zGp9SbfO&q!>Vxy>kM{1{3lir8dSDI#JL~{R{wyjB zV3C4NLGqy!az>K|20|8TksO&JK2bfQcZ}7PQ&00|CnhF=;thCZKmv=y!;)&pGMZlr zv<8bAQmD}vq}f=|kfEE<@NiDk95iPJI1NCO64pe~lR(xfMG6^f|EhL z3ZRUwtmRWM={)HW8AT(ol@OwyDEEL;?=n?7z86m$mW^{<*GSwSMYThw%e}A@#ZH+E zpRK7QF>?c#Ner}}@2svla|jtBL-8r4k&M^mLBR~ueb39Pb%czTP(WZMXI82(PDZ09 z1@QH~Dkfz1S`8g%%wy*cJ1s(gni&RNs^}JKvRp@U=AEV&zRoUW3INpXqI}MfIMNSD z9^6=37`Za>116oY$|9>yAX8#zUD2@YsI?W8BYqlVR)f%?1CX4i>nxV(2)LLSrLrfW z7tDGIkfG5@2~(gF1DXn)-bo8HJB^*4b>L!&MlLQ4!3#`rP3h3^Rg^Jc%`>+Fj2|*- z2xtd1X5$zkWfwis-pWdvPFPhD0#^uEp#mU(VCo=hmEXW4Z_J0FYjs5^@~qDpys1K6 z%6L+Uv-mFBz1YhdtZ#tzlANhZZ0Bx9&)Xrm2189K(eycw6t}umfG<8ZTwEu64P1Sk zMW`4RfG9qzJ{JG@Hg}eSE(Yy@g}o;-v|+vdpS$Bg<>EF(1S(Z*lFl!U-n2Zhur>@? zdGgu??%U+kAJihKW3MLC(xwpxcD$@ymcbTevJI4y#=gM^e+d>@YAg5{OKR_)x7YK)D)B z8#ZZspwLH3yV^R)uiQ`!5c3<+2GvYQ(Ek)vJ+H43;K7k z5`~a0%zm=XB{T&!0_b;WHn3=iOuE}1U*j~>Hv@*QdD|>?l_b~>%6W?T4x_51Pys}_aD;DB1-Xd!5R^!u8WiXA#xowhm{>Sr zViTG(Bcmf8maLUy8&Y@$5KK%5XrSSmLsEl{R#DIbfZevjR$TUs_k$E~P-uK01%tF# zpQwtTocqk*Ke3NKG^Q&n@$3N)@C<(KYd35>=9pzGmJ%)r#2D8=Hm*Vqn?RJNV8?+m zjA`dOMlDO?lTSWnbYz5K4F08MWO9>8ip;1Pdm@x#mp<7i{w%J-3P)(;M5@`#m8>wuSCS-E2$)7rtS38?DC#v~y5OJ$Dph(J&tSI(&eYf9v$B%#Vli`tJBABf z;Uv*|0&A2Y#*{eR!Xb)aH{K9H3zZ7w7}YqN&OKNC{WovF^%I}?#BrOCEvput5YxhQ zJ_&6~1W3TcpBqSckmkhWPe|K$egHh>hJ0?}_|n&I{K6NnLo2u*BmtUThw;vs8w2pvAhEKFOWquaw1|LSae#c$7Onum2&N!ITQ@`v z@~|hxFdB#cFGzv_M~QnqsWpIuo(w1m9XB4LCd4Ict20LREZKChg$|wzc*0E0s3Ymt zdhxxtkJ8nnB)(u_gL%a@2zf=sB()jaecBV7X+L(p6OxO_zMF&_`6!@=#*P}*#gJEc zlr=qpu0b*vZ?!t*PGE*Jsio;yRdQ*MUXY`8mIu@V881W5aOLhez<4DFh3JD57$Jdbq~kZAe)=h^SFh$}wgv-K^t?9#?t0>>yYKzMkAJ*t zfG6P=4LL{Sij4CUg+x5o26hCd#Dl9C&l!QQ?+_qKVbk{_lEjtWT(uyNS_foToT|CR{`b zhxl3wY45@sE%Z!EVCy7rtlDbq)|l8KmOTp%r2M5M#uNf0k`WcwnkoIiouPNvhn^P=#4J<<#RgNqe!wa+;Q(in_tBfcEYr04K1$r2Pp+H}hb0V^iw1$|m z3{IGN_lF~68nx3f5Yi(h-shU|BkP*TLxnuYc`p-}bi4cieiLf_kQtyUeFKm&A3j$9L`e z&G)|7{@m$;jHIS&0LFFZ=l&hb0OFsKgE&nBg2fe2picA9$-(K7p+&e7$J5p?{i%O( z{(0y7$ZUz89iXp7az$}2xe5;^1*&kCwL;UZlK z;5Q$Qm^tmV)2_Ju^1u1|-(nMGo#8$-FI#cC^x=mediTHkb)~94s01#Pb%sL#5=&*F zY|jxTeF4tJ!^l9-9rKnTMqpW6*YL{@FshM+z0lVt)8`B!&%S*9HGt42{ zTg;zURL&CBjK|GLtx~%ot&dLxx`?T7&TjR1}c3A?rpF^ES)L@opPWuviJo# zx=m&z((w`*i}1b$yf9tlxCEXqNS!Cy$W+WjXKSoc%fwXW?mH?;@J3$pZ1IMU3yKP> zjs^k3uFgrGx)_CFg89-zhP&jjfLr@s4w>p@#s+lNVE{*{Fm~gDElU(fvG_XEEM_hc z@s1!&0L{?K1+HMCk|pUi8has0a79!m{lpcG36O?h!>WI_6h{N}!p^K)Gh?E#Gz}#U z2!C~m^cq}iXfb?5f>B4bVQ1sMA#4+B+ri!o~)C@ zpZMVqUQQhJ0THDQi7o;%>|G54KvZ*9NMbe<6-t5uLL*_G(M`1i`DcqDujO-1j0-U~ zBE(~v=j>v3!2sQjZKpFlgk5EF2p0f6^AZh^g~N1r#v%Q=7QkviBPu01K@-MaZ|4xc z(5dDI6ow_P^r1aGD#|8gy5uD*FyXNP1V2@C;}-H9AQ3mr-m6VQo2 z0#mf5FGj3uw^m(oz#4cDB-G_0O0cXl1EZoqoFJHoSiMw8?1|OzL=nH*1?OI|33Y|0 zD2JyUhrU*5WZav0F{}3hdh1syD2$xKOOM&4TAK}qHOdzNw?rHF6kPfK_doH(Q+N(l zh*bL4tFONL8#moFJUjw@90o?yxin8VQJO;D;8X!QsX@#KmH|XC`2?M(rZ%iw|L%9a zYu)+{m5vWc*Q zn<6w=2@<(@dMpyt${>J2Rv&r9NB{7{Ke%t_