@snap-engine/asset-base-svelte 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,23 @@
1
+ # @snap-engine/asset-base-svelte
2
+
3
+ Svelte wrappers for SnapEngine's shared foundational asset components.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @snap-engine/asset-base-svelte @snap-engine/asset-base @snap-engine/core
9
+ ```
10
+
11
+ ## Includes
12
+
13
+ - `Engine`
14
+ - `Camera`
15
+ - `Background`
16
+
17
+ ## Usage
18
+
19
+ ```svelte
20
+ <script>
21
+ import { Engine, Camera, Background } from "@snap-engine/asset-base-svelte";
22
+ </script>
23
+ ```
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@snap-engine/asset-base-svelte",
3
+ "version": "0.2.0",
4
+ "type": "module",
5
+ "svelte": "./src/index.ts",
6
+ "exports": {
7
+ ".": {
8
+ "svelte": "./src/index.ts"
9
+ },
10
+ "./Engine.svelte": "./src/Engine.svelte",
11
+ "./Background.svelte": "./src/Background.svelte",
12
+ "./Camera.svelte": "./src/Camera.svelte",
13
+ "./engine": "./src/engineState.svelte.ts"
14
+ },
15
+ "dependencies": {
16
+ "@snap-engine/asset-base": "^0.2.0"
17
+ },
18
+ "description": "Svelte wrappers for SnapEngine shared asset components",
19
+ "files": [
20
+ "src",
21
+ "README.md"
22
+ ],
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "keywords": [
27
+ "snapengine",
28
+ "svelte",
29
+ "ui",
30
+ "camera",
31
+ "background"
32
+ ],
33
+ "author": "Tomoki Fukazawa",
34
+ "license": "MIT",
35
+ "peerDependencies": {
36
+ "svelte": "^5.0.0"
37
+ }
38
+ }
@@ -0,0 +1,27 @@
1
+ <script lang="ts">
2
+ import { onMount, setContext, getContext } from "svelte";
3
+ import { Background } from "@snap-engine/asset-base";
4
+ import type { Engine } from "@snap-engine/core";
5
+ let background: HTMLDivElement | null = null;
6
+
7
+ const engine:Engine = getContext("engine");
8
+ let bg = new Background(engine, null);
9
+
10
+ setContext("bg", bg);
11
+
12
+ onMount(() => {
13
+ bg.element = background as HTMLElement;
14
+ });
15
+ </script>
16
+
17
+
18
+ <div id="sl-background" bind:this={background}></div>
19
+
20
+
21
+ <style lang="scss">
22
+ #sl-background {
23
+ background-color: #fff;
24
+ background-image: radial-gradient(circle, #cccccc 2px, transparent 1px);
25
+ user-select: none;
26
+ }
27
+ </style>
@@ -0,0 +1,44 @@
1
+ <script lang="ts">
2
+ import { onMount, getContext, setContext } from "svelte";
3
+ import { CameraControl as CameraControlObject } from "@snap-engine/asset-base";
4
+ import type { Engine } from "@snap-engine/core";
5
+
6
+ let {
7
+ children,
8
+ zoomLock,
9
+ panLock,
10
+ cameraControl = $bindable<CameraControlObject | null>(null),
11
+ }: {
12
+ children: any;
13
+ zoomLock?: boolean;
14
+ panLock?: boolean;
15
+ cameraControl?: CameraControlObject | null;
16
+ } = $props();
17
+
18
+ let cameraControlElement: HTMLDivElement | null = null;
19
+ const engine: Engine = getContext("engine");
20
+ const cameraControlInstance = new CameraControlObject(engine, {
21
+ zoomLock: zoomLock ?? false,
22
+ panLock: panLock ?? false,
23
+ });
24
+
25
+ cameraControl = cameraControlInstance;
26
+ setContext("cameraControl", cameraControlInstance);
27
+
28
+ onMount(() => {
29
+ cameraControlInstance.element = cameraControlElement as HTMLElement;
30
+ });
31
+ </script>
32
+
33
+ <div id="snap-camera-control" bind:this={cameraControlElement}>
34
+ {@render children()}
35
+ </div>
36
+
37
+ <style lang="scss">
38
+ #snap-camera-control {
39
+ width: 100%;
40
+ height: 100%;
41
+ background-color: #fff;
42
+ user-select: none;
43
+ }
44
+ </style>
@@ -0,0 +1,79 @@
1
+ <script lang="ts">
2
+ import { onMount } from "svelte";
3
+ import { setContext } from "svelte";
4
+ import { getEngine } from "./engineState.svelte";
5
+ import type { Engine } from "@snap-engine/core";
6
+ import { DebugRenderer } from "@snap-engine/core/debug";
7
+ import { CollisionEngine } from "@snap-engine/core/collision";
8
+
9
+ let {
10
+ id,
11
+ children,
12
+ engine = $bindable<Engine | null>(null),
13
+ debug = false,
14
+ }: {
15
+ id: string;
16
+ style?: Record<string, string>;
17
+ children: any;
18
+ engine?: Engine | null;
19
+ debug?: boolean;
20
+ } = $props();
21
+ let canvas: HTMLDivElement | null = null;
22
+ let mounted = $state(false);
23
+ let pendingDebugEnable = $state(false);
24
+
25
+ const resolvedEngine = (engine ?? getEngine(id)) as Engine;
26
+ engine = resolvedEngine;
27
+ setContext("engine", resolvedEngine);
28
+
29
+ resolvedEngine.setCollisionEngine(new CollisionEngine());
30
+
31
+ onMount(() => {
32
+ resolvedEngine.assignDom(canvas as HTMLElement);
33
+ resolvedEngine.camera?.setCameraPosition(0, 0);
34
+ mounted = true;
35
+
36
+ // Apply any debug state that was requested before mount
37
+ if (pendingDebugEnable) {
38
+ resolvedEngine.setDebugRenderer(new DebugRenderer());
39
+ pendingDebugEnable = false;
40
+ }
41
+ });
42
+
43
+ $effect(() => {
44
+ if (debug) {
45
+ if (mounted) {
46
+ resolvedEngine.setDebugRenderer(new DebugRenderer());
47
+ } else {
48
+ pendingDebugEnable = true;
49
+ }
50
+ } else {
51
+ resolvedEngine.disableDebug();
52
+ pendingDebugEnable = false;
53
+ }
54
+ });
55
+
56
+ export function enableDebug() {
57
+ if (mounted) {
58
+ resolvedEngine.setDebugRenderer(new DebugRenderer());
59
+ } else {
60
+ pendingDebugEnable = true;
61
+ }
62
+ }
63
+
64
+ export function disableDebug() {
65
+ resolvedEngine.disableDebug();
66
+ pendingDebugEnable = false;
67
+ }
68
+ </script>
69
+
70
+ <div
71
+ id="snap-canvas"
72
+ bind:this={canvas}
73
+ style="height: 100%; overflow: hidden; position: relative;"
74
+ >
75
+ {@render children()}
76
+ </div>
77
+
78
+ <style lang="scss">
79
+ </style>
@@ -0,0 +1,16 @@
1
+ import { ElementObject, Engine } from "@snap-engine/core";
2
+ import type { Component } from "svelte";
3
+ let engineDict: { [key: string]: Engine } = {};
4
+
5
+ export function getEngine(id: string) {
6
+ if (!engineDict[id]) {
7
+ engineDict[id] = new Engine();
8
+ }
9
+ return engineDict[id];
10
+ }
11
+
12
+ export interface ObjectData {
13
+ svelteComponent: Component;
14
+ object: ElementObject;
15
+ prop?: { [key: string]: any };
16
+ }
package/src/index.ts ADDED
@@ -0,0 +1,4 @@
1
+ export { default as Engine } from "./Engine.svelte";
2
+ export { default as Background } from "./Background.svelte";
3
+ export { default as Camera } from "./Camera.svelte";
4
+ export { getEngine, type ObjectData } from "./engineState.svelte";