@skewedaspect/sage-vue 0.9.0-beta.8 → 0.9.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/dist/index.d.ts CHANGED
@@ -1,2 +1 @@
1
- export * from './packages/sage-vue/src/index'
2
1
  export {}
package/dist/sage-vue.css CHANGED
@@ -1 +1,2 @@
1
- .sage-container[data-v-7932fefe]{position:relative;width:100%;height:100%}.sage-canvas[data-v-7932fefe]{display:block;width:100%;height:100%}.sage-overlay[data-v-7932fefe]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.sage-overlay[data-v-7932fefe] *{pointer-events:auto}
1
+ .sage-container[data-v-7932fefe]{width:100%;height:100%;position:relative}.sage-canvas[data-v-7932fefe]{width:100%;height:100%;display:block}.sage-overlay[data-v-7932fefe]{pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0}.sage-overlay[data-v-7932fefe] *{pointer-events:auto}
2
+ /*$vite$:1*/
package/dist/sage-vue.js CHANGED
@@ -1,144 +1,132 @@
1
- import { defineComponent as h, useTemplateRef as m, shallowRef as O, ref as v, provide as R, onMounted as w, onUnmounted as d, openBlock as b, createElementBlock as x, createElementVNode as y, renderSlot as C, inject as N, computed as B, watch as k } from "vue";
2
- import { createGameEngine as z } from "@skewedaspect/sage";
3
- const E = /* @__PURE__ */ Symbol("sage-engine"), D = { class: "sage-overlay" }, G = /* @__PURE__ */ h({
4
- __name: "sageCanvas",
5
- props: {
6
- entityDefinitions: { default: () => [] },
7
- options: { default: () => ({}) },
8
- engine: {}
9
- },
10
- emits: ["engine-ready", "engine-error"],
11
- setup(e, { emit: n }) {
12
- const r = e, t = n, s = m("containerRef"), a = m("canvasRef"), o = O(null), i = v(!0), u = v(null);
13
- let p = !1, c = null;
14
- return R(E, o), w(async () => {
15
- let f = !1;
16
- if (d(() => {
17
- f = !0;
18
- }), !!a.value)
19
- try {
20
- let l;
21
- if (r.engine ? (l = r.engine, p = !0) : l = await z(a.value, r.entityDefinitions, r.options), f)
22
- return;
23
- o.value = l, s.value && (c = new ResizeObserver(() => {
24
- l.renderEngine.resize();
25
- }), c.observe(s.value)), t("engine-ready", l), i.value = !1;
26
- } catch (l) {
27
- if (f)
28
- return;
29
- u.value = l, t("engine-error", l), i.value = !1;
30
- }
31
- }), d(async () => {
32
- c && (c.disconnect(), c = null), !p && o.value && (await o.value.stop(), o.value.renderEngine.dispose());
33
- }), (f, l) => (b(), x("div", {
34
- ref_key: "containerRef",
35
- ref: s,
36
- class: "sage-container"
37
- }, [
38
- y("canvas", {
39
- ref_key: "canvasRef",
40
- ref: a,
41
- class: "sage-canvas"
42
- }, null, 512),
43
- y("div", D, [
44
- C(f.$slots, "default", {
45
- loading: i.value,
46
- error: u.value,
47
- engine: o.value
48
- }, void 0, !0)
49
- ])
50
- ], 512));
51
- }
52
- }), P = (e, n) => {
53
- const r = e.__vccOpts || e;
54
- for (const [t, s] of n)
55
- r[t] = s;
56
- return r;
57
- }, T = /* @__PURE__ */ P(G, [["__scopeId", "data-v-7932fefe"]]);
58
- function g() {
59
- const e = N(E);
60
- if (!e)
61
- throw new Error("useSageEngine() must be used inside a <SageCanvas> component.");
62
- return {
63
- engine: e,
64
- eventBus: B(() => e.value?.eventBus ?? null)
65
- };
1
+ import { computed as e, createElementBlock as t, createElementVNode as n, defineComponent as r, inject as i, onMounted as a, onUnmounted as o, openBlock as s, provide as c, ref as l, renderSlot as u, shallowRef as d, useTemplateRef as f, watch as p } from "vue";
2
+ import { createGameEngine as m } from "@skewedaspect/sage";
3
+ //#region src/symbols.ts
4
+ var h = Symbol("sage-engine"), g = { class: "sage-overlay" }, _ = /* @__PURE__ */ ((e, t) => {
5
+ let n = e.__vccOpts || e;
6
+ for (let [e, r] of t) n[e] = r;
7
+ return n;
8
+ })(/* @__PURE__ */ r({
9
+ __name: "sageCanvas",
10
+ props: {
11
+ entityDefinitions: { default: () => [] },
12
+ options: { default: () => ({}) },
13
+ engine: {}
14
+ },
15
+ emits: ["engine-ready", "engine-error"],
16
+ setup(e, { emit: r }) {
17
+ let i = e, p = r, _ = f("containerRef"), v = f("canvasRef"), y = d(null), b = l(!0), x = l(null), S = !1, C = null;
18
+ return c(h, y), a(async () => {
19
+ let e = !1;
20
+ if (o(() => {
21
+ e = !0;
22
+ }), v.value) try {
23
+ let t;
24
+ if (i.engine ? (t = i.engine, S = !0) : t = await m(v.value, i.entityDefinitions, i.options), e) return;
25
+ y.value = t, _.value && (C = new ResizeObserver(() => {
26
+ t.renderEngine.resize();
27
+ }), C.observe(_.value)), p("engine-ready", t), b.value = !1;
28
+ } catch (t) {
29
+ if (e) return;
30
+ x.value = t, p("engine-error", t), b.value = !1;
31
+ }
32
+ }), o(async () => {
33
+ C &&= (C.disconnect(), null), !S && y.value && (await y.value.stop(), y.value.renderEngine.dispose());
34
+ }), (e, r) => (s(), t("div", {
35
+ ref_key: "containerRef",
36
+ ref: _,
37
+ class: "sage-container"
38
+ }, [n("canvas", {
39
+ ref_key: "canvasRef",
40
+ ref: v,
41
+ class: "sage-canvas"
42
+ }, null, 512), n("div", g, [u(e.$slots, "default", {
43
+ loading: b.value,
44
+ error: x.value,
45
+ engine: y.value
46
+ }, void 0, !0)])], 512));
47
+ }
48
+ }), [["__scopeId", "data-v-7932fefe"]]);
49
+ //#endregion
50
+ //#region src/useSageEngine.ts
51
+ function v() {
52
+ let t = i(h);
53
+ if (!t) throw Error("useSageEngine() must be used inside a <SageCanvas> component.");
54
+ return {
55
+ engine: t,
56
+ eventBus: e(() => t.value?.eventBus ?? null)
57
+ };
66
58
  }
67
- function S(e, n) {
68
- const { engine: r } = g();
69
- let t = null;
70
- k(r, (s) => {
71
- t && (t(), t = null), s && (t = s.eventBus.subscribePattern(
72
- e,
73
- n
74
- ));
75
- }, { immediate: !0 }), d(() => {
76
- t && (t(), t = null);
77
- });
59
+ //#endregion
60
+ //#region src/useSageEvent.ts
61
+ function y(e, t) {
62
+ let { engine: n } = v(), r = null;
63
+ p(n, (n) => {
64
+ r &&= (r(), null), n && (r = n.eventBus.subscribePattern(e, t));
65
+ }, { immediate: !0 }), o(() => {
66
+ r &&= (r(), null);
67
+ });
78
68
  }
79
- function $(e) {
80
- const n = v(0);
81
- return S(`action:${e}`, (r) => {
82
- n.value = r.payload.value;
83
- }), n;
69
+ //#endregion
70
+ //#region src/useSageAction.ts
71
+ function b(e) {
72
+ let t = l(0);
73
+ return y(`action:${e}`, (e) => {
74
+ t.value = e.payload.value;
75
+ }), t;
84
76
  }
85
- function j(e, n) {
86
- const { engine: r } = g(), t = () => {
87
- const a = r.value?.managers.entityManager.getEntity(e);
88
- if (a)
89
- return n ? a.state[n] : a.state;
90
- }, s = v(t());
91
- return S("entity:state-changed", (a) => {
92
- a.payload.entityId === e && (s.value = t());
93
- }), s;
77
+ //#endregion
78
+ //#region src/useSageState.ts
79
+ function x(e, t) {
80
+ let { engine: n } = v(), r = () => {
81
+ let r = n.value?.managers.entityManager.getEntity(e);
82
+ if (r) return t ? r.state[t] : r.state;
83
+ }, i = l(r());
84
+ return y("entity:state-changed", (t) => {
85
+ t.payload.entityId === e && (i.value = r());
86
+ }), i;
94
87
  }
95
- const _ = () => {
96
- }, A = {
97
- get ready() {
98
- return !1;
99
- },
100
- reset() {
101
- }
88
+ //#endregion
89
+ //#region src/useSageTimer.ts
90
+ var S = () => {}, C = {
91
+ get ready() {
92
+ return !1;
93
+ },
94
+ reset() {}
102
95
  };
103
- function K() {
104
- const { engine: e } = g(), n = [];
105
- d(() => {
106
- for (const a of n)
107
- a();
108
- n.length = 0;
109
- });
110
- function r(a, o) {
111
- if (!e.value)
112
- return _;
113
- const i = e.value.timer.delay(a, o);
114
- return n.push(i), () => {
115
- i();
116
- const u = n.indexOf(i);
117
- u >= 0 && n.splice(u, 1);
118
- };
119
- }
120
- function t(a, o) {
121
- if (!e.value)
122
- return _;
123
- const i = e.value.timer.interval(a, o);
124
- return n.push(i), () => {
125
- i();
126
- const u = n.indexOf(i);
127
- u >= 0 && n.splice(u, 1);
128
- };
129
- }
130
- function s(a) {
131
- return e.value ? e.value.timer.cooldown(a) : A;
132
- }
133
- return { delay: r, interval: t, cooldown: s };
96
+ function w() {
97
+ let { engine: e } = v(), t = [];
98
+ o(() => {
99
+ for (let e of t) e();
100
+ t.length = 0;
101
+ });
102
+ function n(n, r) {
103
+ if (!e.value) return S;
104
+ let i = e.value.timer.delay(n, r);
105
+ return t.push(i), () => {
106
+ i();
107
+ let e = t.indexOf(i);
108
+ e >= 0 && t.splice(e, 1);
109
+ };
110
+ }
111
+ function r(n, r) {
112
+ if (!e.value) return S;
113
+ let i = e.value.timer.interval(n, r);
114
+ return t.push(i), () => {
115
+ i();
116
+ let e = t.indexOf(i);
117
+ e >= 0 && t.splice(e, 1);
118
+ };
119
+ }
120
+ function i(t) {
121
+ return e.value ? e.value.timer.cooldown(t) : C;
122
+ }
123
+ return {
124
+ delay: n,
125
+ interval: r,
126
+ cooldown: i
127
+ };
134
128
  }
135
- export {
136
- E as SAGE_ENGINE_KEY,
137
- T as SageCanvas,
138
- $ as useSageAction,
139
- g as useSageEngine,
140
- S as useSageEvent,
141
- j as useSageState,
142
- K as useSageTimer
143
- };
144
- //# sourceMappingURL=sage-vue.js.map
129
+ //#endregion
130
+ export { h as SAGE_ENGINE_KEY, _ as SageCanvas, b as useSageAction, v as useSageEngine, y as useSageEvent, x as useSageState, w as useSageTimer };
131
+
132
+ //# sourceMappingURL=sage-vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sage-vue.js","sources":["../src/symbols.ts","../src/sageCanvas.vue","../src/useSageEngine.ts","../src/useSageEvent.ts","../src/useSageAction.ts","../src/useSageState.ts","../src/useSageTimer.ts"],"sourcesContent":["//----------------------------------------------------------------------------------------------------------------------\n// Injection Key Symbols\n//----------------------------------------------------------------------------------------------------------------------\n\nimport type { InjectionKey, ShallowRef } from 'vue';\nimport type { GameEngine } from '@skewedaspect/sage';\n\n//----------------------------------------------------------------------------------------------------------------------\n\nexport const SAGE_ENGINE_KEY : InjectionKey<ShallowRef<GameEngine | null>> = Symbol('sage-engine');\n\n//----------------------------------------------------------------------------------------------------------------------\n","<!----------------------------------------------------------------------------------------------------------------------\n - SageCanvas - Vue wrapper component for the SAGE game engine\n ----------------------------------------------------------------------------------------------------------------------->\n\n<template>\n <div ref=\"containerRef\" class=\"sage-container\">\n <canvas ref=\"canvasRef\" class=\"sage-canvas\"></canvas>\n <div class=\"sage-overlay\">\n <slot :loading=\"loading\" :error=\"error\" :engine=\"engineRef\"></slot>\n </div>\n </div>\n</template>\n\n<!--------------------------------------------------------------------------------------------------------------------->\n\n<style scoped>\n .sage-container {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .sage-canvas {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .sage-overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n }\n\n .sage-overlay :deep(*) {\n pointer-events: auto;\n }\n</style>\n\n<!--------------------------------------------------------------------------------------------------------------------->\n\n<script setup lang=\"ts\">\n import { ref, shallowRef, provide, onMounted, onUnmounted, useTemplateRef } from 'vue';\n import { createGameEngine } from '@skewedaspect/sage';\n import type { GameEngine, GameEntityDefinition, SageOptions } from '@skewedaspect/sage';\n import { SAGE_ENGINE_KEY } from './symbols.ts';\n\n //------------------------------------------------------------------------------------------------------------------\n // Props & Emits\n //------------------------------------------------------------------------------------------------------------------\n\n const props = withDefaults(defineProps<{\n entityDefinitions ?: GameEntityDefinition[];\n options ?: SageOptions;\n engine ?: GameEngine;\n }>(), {\n entityDefinitions: () => [],\n options: () => ({}),\n });\n\n const emit = defineEmits<{\n 'engine-ready': [engine : GameEngine];\n 'engine-error': [error : unknown];\n }>();\n\n //------------------------------------------------------------------------------------------------------------------\n // State\n //------------------------------------------------------------------------------------------------------------------\n\n const containerRef = useTemplateRef<HTMLDivElement>('containerRef');\n const canvasRef = useTemplateRef<HTMLCanvasElement>('canvasRef');\n const engineRef = shallowRef<GameEngine | null>(null);\n const loading = ref(true);\n const error = ref<unknown>(null);\n let controlled = false;\n let resizeObserver : ResizeObserver | null = null;\n\n // Provide the engine ref synchronously so child composables can inject it\n provide(SAGE_ENGINE_KEY, engineRef);\n\n //------------------------------------------------------------------------------------------------------------------\n // Lifecycle\n //------------------------------------------------------------------------------------------------------------------\n\n onMounted(async() =>\n {\n let disposed = false;\n\n onUnmounted(() =>\n {\n disposed = true;\n });\n\n if(!canvasRef.value)\n {\n return;\n }\n\n try\n {\n let engine : GameEngine;\n\n if(props.engine)\n {\n engine = props.engine;\n controlled = true;\n }\n else\n {\n engine = await createGameEngine(canvasRef.value, props.entityDefinitions, props.options);\n }\n\n if(disposed) { return; }\n\n engineRef.value = engine;\n\n // Set up resize observer on the container\n if(containerRef.value)\n {\n resizeObserver = new ResizeObserver(() =>\n {\n engine.renderEngine.resize();\n });\n resizeObserver.observe(containerRef.value);\n }\n\n emit('engine-ready', engine);\n loading.value = false;\n }\n catch(err)\n {\n if(disposed) { return; }\n\n error.value = err;\n emit('engine-error', err);\n loading.value = false;\n }\n });\n\n onUnmounted(async() =>\n {\n if(resizeObserver)\n {\n resizeObserver.disconnect();\n resizeObserver = null;\n }\n\n if(!controlled && engineRef.value)\n {\n await engineRef.value.stop();\n engineRef.value.renderEngine.dispose();\n }\n });\n</script>\n\n<!--------------------------------------------------------------------------------------------------------------------->\n","//----------------------------------------------------------------------------------------------------------------------\n// useSageEngine Composable\n//----------------------------------------------------------------------------------------------------------------------\n\nimport { type ComputedRef, type ShallowRef, computed, inject } from 'vue';\nimport type { GameEngine, GameEventBus } from '@skewedaspect/sage';\nimport { SAGE_ENGINE_KEY } from './symbols.ts';\n\n//----------------------------------------------------------------------------------------------------------------------\n\ninterface SageEngineContext\n{\n engine : ShallowRef<GameEngine | null>;\n eventBus : ComputedRef<GameEventBus | null>;\n}\n\nexport function useSageEngine() : SageEngineContext\n{\n const engine = inject(SAGE_ENGINE_KEY);\n if(!engine)\n {\n throw new Error('useSageEngine() must be used inside a <SageCanvas> component.');\n }\n\n return {\n engine,\n eventBus: computed(() => engine.value?.eventBus ?? null),\n };\n}\n\n//----------------------------------------------------------------------------------------------------------------------\n","//----------------------------------------------------------------------------------------------------------------------\n// useSageEvent Composable\n//----------------------------------------------------------------------------------------------------------------------\n\nimport { onUnmounted, watch } from 'vue';\nimport type { GameEvent, Unsubscribe, WildcardEventCallback, WildcardPattern } from '@skewedaspect/sage';\nimport { useSageEngine } from './useSageEngine.ts';\n\n//----------------------------------------------------------------------------------------------------------------------\n\ntype EventHandler = (event : GameEvent) => void | Promise<void>;\n\nexport function useSageEvent(pattern : string | RegExp, handler : EventHandler) : void\n{\n const { engine } = useSageEngine();\n let unsub : Unsubscribe | null = null;\n\n watch(engine, (eng) =>\n {\n if(unsub)\n {\n unsub();\n unsub = null;\n }\n\n if(eng)\n {\n unsub = eng.eventBus.subscribePattern(\n pattern as WildcardPattern | RegExp,\n handler as WildcardEventCallback\n );\n }\n }, { immediate: true });\n\n onUnmounted(() =>\n {\n if(unsub)\n {\n unsub();\n unsub = null;\n }\n });\n}\n\n//----------------------------------------------------------------------------------------------------------------------\n","//----------------------------------------------------------------------------------------------------------------------\n// useSageAction Composable\n//----------------------------------------------------------------------------------------------------------------------\n\nimport { type Ref, ref } from 'vue';\nimport { useSageEvent } from './useSageEvent.ts';\n\n//----------------------------------------------------------------------------------------------------------------------\n\nexport function useSageAction(actionName : string) : Ref<boolean | number>\n{\n const value = ref<boolean | number>(0);\n\n useSageEvent(`action:${ actionName }`, (event) =>\n {\n value.value = (event.payload as { value : boolean | number }).value;\n });\n\n return value;\n}\n\n//----------------------------------------------------------------------------------------------------------------------\n","//----------------------------------------------------------------------------------------------------------------------\n// useSageState Composable\n//----------------------------------------------------------------------------------------------------------------------\n\nimport { type Ref, ref } from 'vue';\nimport type { EntityStateChangedPayload } from '@skewedaspect/sage';\nimport { useSageEngine } from './useSageEngine.ts';\nimport { useSageEvent } from './useSageEvent.ts';\n\n//----------------------------------------------------------------------------------------------------------------------\n\n/**\n * Returns a reactive ref synced to an entity's state. If `key` is provided, tracks only that property; otherwise\n * tracks the entire state object.\n */\nexport function useSageState<T = unknown>(entityId : string, key ?: string) : Ref<T>\n{\n const { engine } = useSageEngine();\n\n // Read initial state from the entity (if it exists yet)\n const readState = () : T =>\n {\n const entity = engine.value?.managers.entityManager.getEntity(entityId);\n if(!entity)\n {\n return undefined as T;\n }\n\n if(key)\n {\n return (entity.state as Record<string, unknown>)[key] as T;\n }\n\n return entity.state as T;\n };\n\n const state = ref<T>(readState()) as Ref<T>;\n\n useSageEvent('entity:state-changed', (event) =>\n {\n const payload = event.payload as EntityStateChangedPayload;\n if(payload.entityId !== entityId)\n {\n return;\n }\n\n // Re-read from the entity to get the authoritative value\n state.value = readState();\n });\n\n return state;\n}\n\n//----------------------------------------------------------------------------------------------------------------------\n","//----------------------------------------------------------------------------------------------------------------------\n// useSageTimer Composable\n//----------------------------------------------------------------------------------------------------------------------\n\nimport { onUnmounted } from 'vue';\nimport type { CooldownHandle } from '@skewedaspect/sage';\nimport { useSageEngine } from './useSageEngine.ts';\n\n//----------------------------------------------------------------------------------------------------------------------\n\ninterface SageTimerComposable\n{\n delay : (ms : number, callback : () => void) => () => void;\n interval : (ms : number, callback : () => void) => () => void;\n cooldown : (ms : number) => CooldownHandle;\n}\n\n//----------------------------------------------------------------------------------------------------------------------\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst NOOP = () : void => {};\n\nconst NOOP_COOLDOWN : CooldownHandle = {\n get ready() : boolean { return false; },\n reset() : void { /* no-op */ },\n};\n\n//----------------------------------------------------------------------------------------------------------------------\n\n/**\n * Returns pause-aware timer functions (delay, interval, cooldown) from the game engine. All active timers are\n * automatically cancelled when the component unmounts.\n */\nexport function useSageTimer() : SageTimerComposable\n{\n const { engine } = useSageEngine();\n const cancellers : (() => void)[] = [];\n\n onUnmounted(() =>\n {\n for(const cancel of cancellers)\n {\n cancel();\n }\n\n cancellers.length = 0;\n });\n\n function delay(ms : number, callback : () => void) : () => void\n {\n if(!engine.value)\n {\n return NOOP;\n }\n\n const cancel = engine.value.timer.delay(ms, callback);\n cancellers.push(cancel);\n\n return () =>\n {\n cancel();\n const idx = cancellers.indexOf(cancel);\n if(idx >= 0)\n {\n cancellers.splice(idx, 1);\n }\n };\n }\n\n function interval(ms : number, callback : () => void) : () => void\n {\n if(!engine.value)\n {\n return NOOP;\n }\n\n const cancel = engine.value.timer.interval(ms, callback);\n cancellers.push(cancel);\n\n return () =>\n {\n cancel();\n const idx = cancellers.indexOf(cancel);\n if(idx >= 0)\n {\n cancellers.splice(idx, 1);\n }\n };\n }\n\n function cooldown(ms : number) : CooldownHandle\n {\n if(!engine.value)\n {\n return NOOP_COOLDOWN;\n }\n\n const handle = engine.value.timer.cooldown(ms);\n\n // There's no cancel for cooldowns, but we don't need to track them — they're passive pollable objects\n return handle;\n }\n\n return { delay, interval, cooldown };\n}\n\n//----------------------------------------------------------------------------------------------------------------------\n"],"names":["SAGE_ENGINE_KEY","props","__props","emit","__emit","containerRef","useTemplateRef","canvasRef","engineRef","shallowRef","loading","ref","error","controlled","resizeObserver","provide","onMounted","disposed","onUnmounted","engine","createGameEngine","err","_createElementBlock","_createElementVNode","_hoisted_1","_renderSlot","_ctx","useSageEngine","inject","computed","useSageEvent","pattern","handler","unsub","watch","eng","useSageAction","actionName","value","event","useSageState","entityId","key","readState","entity","state","NOOP","NOOP_COOLDOWN","useSageTimer","cancellers","cancel","delay","ms","callback","idx","interval","cooldown"],"mappings":"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"}
1
+ {"version":3,"file":"sage-vue.js","names":[],"sources":["../src/symbols.ts","../src/sageCanvas.vue","../src/sageCanvas.vue","../src/useSageEngine.ts","../src/useSageEvent.ts","../src/useSageAction.ts","../src/useSageState.ts","../src/useSageTimer.ts"],"sourcesContent":["//----------------------------------------------------------------------------------------------------------------------\n// Injection Key Symbols\n//----------------------------------------------------------------------------------------------------------------------\n\nimport type { InjectionKey, ShallowRef } from 'vue';\nimport type { GameEngine } from '@skewedaspect/sage';\n\n//----------------------------------------------------------------------------------------------------------------------\n\nexport const SAGE_ENGINE_KEY : InjectionKey<ShallowRef<GameEngine | null>> = Symbol('sage-engine');\n\n//----------------------------------------------------------------------------------------------------------------------\n","<!----------------------------------------------------------------------------------------------------------------------\n - SageCanvas - Vue wrapper component for the SAGE game engine\n ----------------------------------------------------------------------------------------------------------------------->\n\n<template>\n <div ref=\"containerRef\" class=\"sage-container\">\n <canvas ref=\"canvasRef\" class=\"sage-canvas\"></canvas>\n <div class=\"sage-overlay\">\n <slot :loading=\"loading\" :error=\"error\" :engine=\"engineRef\"></slot>\n </div>\n </div>\n</template>\n\n<!--------------------------------------------------------------------------------------------------------------------->\n\n<style scoped>\n .sage-container {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .sage-canvas {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .sage-overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n }\n\n .sage-overlay :deep(*) {\n pointer-events: auto;\n }\n</style>\n\n<!--------------------------------------------------------------------------------------------------------------------->\n\n<script setup lang=\"ts\">\n import { ref, shallowRef, provide, onMounted, onUnmounted, useTemplateRef } from 'vue';\n import { createGameEngine } from '@skewedaspect/sage';\n import type { GameEngine, GameEntityDefinition, SageOptions } from '@skewedaspect/sage';\n import { SAGE_ENGINE_KEY } from './symbols.ts';\n\n //------------------------------------------------------------------------------------------------------------------\n // Props & Emits\n //------------------------------------------------------------------------------------------------------------------\n\n const props = withDefaults(defineProps<{\n entityDefinitions ?: GameEntityDefinition[];\n options ?: SageOptions;\n engine ?: GameEngine;\n }>(), {\n entityDefinitions: () => [],\n options: () => ({}),\n });\n\n const emit = defineEmits<{\n 'engine-ready': [engine : GameEngine];\n 'engine-error': [error : unknown];\n }>();\n\n //------------------------------------------------------------------------------------------------------------------\n // State\n //------------------------------------------------------------------------------------------------------------------\n\n const containerRef = useTemplateRef<HTMLDivElement>('containerRef');\n const canvasRef = useTemplateRef<HTMLCanvasElement>('canvasRef');\n const engineRef = shallowRef<GameEngine | null>(null);\n const loading = ref(true);\n const error = ref<unknown>(null);\n let controlled = false;\n let resizeObserver : ResizeObserver | null = null;\n\n // Provide the engine ref synchronously so child composables can inject it\n provide(SAGE_ENGINE_KEY, engineRef);\n\n //------------------------------------------------------------------------------------------------------------------\n // Lifecycle\n //------------------------------------------------------------------------------------------------------------------\n\n onMounted(async() =>\n {\n let disposed = false;\n\n onUnmounted(() =>\n {\n disposed = true;\n });\n\n if(!canvasRef.value)\n {\n return;\n }\n\n try\n {\n let engine : GameEngine;\n\n if(props.engine)\n {\n engine = props.engine;\n controlled = true;\n }\n else\n {\n engine = await createGameEngine(canvasRef.value, props.entityDefinitions, props.options);\n }\n\n if(disposed) { return; }\n\n engineRef.value = engine;\n\n // Set up resize observer on the container\n if(containerRef.value)\n {\n resizeObserver = new ResizeObserver(() =>\n {\n engine.renderEngine.resize();\n });\n resizeObserver.observe(containerRef.value);\n }\n\n emit('engine-ready', engine);\n loading.value = false;\n }\n catch(err)\n {\n if(disposed) { return; }\n\n error.value = err;\n emit('engine-error', err);\n loading.value = false;\n }\n });\n\n onUnmounted(async() =>\n {\n if(resizeObserver)\n {\n resizeObserver.disconnect();\n resizeObserver = null;\n }\n\n if(!controlled && engineRef.value)\n {\n await engineRef.value.stop();\n engineRef.value.renderEngine.dispose();\n }\n });\n</script>\n\n<!--------------------------------------------------------------------------------------------------------------------->\n","<!----------------------------------------------------------------------------------------------------------------------\n - SageCanvas - Vue wrapper component for the SAGE game engine\n ----------------------------------------------------------------------------------------------------------------------->\n\n<template>\n <div ref=\"containerRef\" class=\"sage-container\">\n <canvas ref=\"canvasRef\" class=\"sage-canvas\"></canvas>\n <div class=\"sage-overlay\">\n <slot :loading=\"loading\" :error=\"error\" :engine=\"engineRef\"></slot>\n </div>\n </div>\n</template>\n\n<!--------------------------------------------------------------------------------------------------------------------->\n\n<style scoped>\n .sage-container {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .sage-canvas {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .sage-overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n }\n\n .sage-overlay :deep(*) {\n pointer-events: auto;\n }\n</style>\n\n<!--------------------------------------------------------------------------------------------------------------------->\n\n<script setup lang=\"ts\">\n import { ref, shallowRef, provide, onMounted, onUnmounted, useTemplateRef } from 'vue';\n import { createGameEngine } from '@skewedaspect/sage';\n import type { GameEngine, GameEntityDefinition, SageOptions } from '@skewedaspect/sage';\n import { SAGE_ENGINE_KEY } from './symbols.ts';\n\n //------------------------------------------------------------------------------------------------------------------\n // Props & Emits\n //------------------------------------------------------------------------------------------------------------------\n\n const props = withDefaults(defineProps<{\n entityDefinitions ?: GameEntityDefinition[];\n options ?: SageOptions;\n engine ?: GameEngine;\n }>(), {\n entityDefinitions: () => [],\n options: () => ({}),\n });\n\n const emit = defineEmits<{\n 'engine-ready': [engine : GameEngine];\n 'engine-error': [error : unknown];\n }>();\n\n //------------------------------------------------------------------------------------------------------------------\n // State\n //------------------------------------------------------------------------------------------------------------------\n\n const containerRef = useTemplateRef<HTMLDivElement>('containerRef');\n const canvasRef = useTemplateRef<HTMLCanvasElement>('canvasRef');\n const engineRef = shallowRef<GameEngine | null>(null);\n const loading = ref(true);\n const error = ref<unknown>(null);\n let controlled = false;\n let resizeObserver : ResizeObserver | null = null;\n\n // Provide the engine ref synchronously so child composables can inject it\n provide(SAGE_ENGINE_KEY, engineRef);\n\n //------------------------------------------------------------------------------------------------------------------\n // Lifecycle\n //------------------------------------------------------------------------------------------------------------------\n\n onMounted(async() =>\n {\n let disposed = false;\n\n onUnmounted(() =>\n {\n disposed = true;\n });\n\n if(!canvasRef.value)\n {\n return;\n }\n\n try\n {\n let engine : GameEngine;\n\n if(props.engine)\n {\n engine = props.engine;\n controlled = true;\n }\n else\n {\n engine = await createGameEngine(canvasRef.value, props.entityDefinitions, props.options);\n }\n\n if(disposed) { return; }\n\n engineRef.value = engine;\n\n // Set up resize observer on the container\n if(containerRef.value)\n {\n resizeObserver = new ResizeObserver(() =>\n {\n engine.renderEngine.resize();\n });\n resizeObserver.observe(containerRef.value);\n }\n\n emit('engine-ready', engine);\n loading.value = false;\n }\n catch(err)\n {\n if(disposed) { return; }\n\n error.value = err;\n emit('engine-error', err);\n loading.value = false;\n }\n });\n\n onUnmounted(async() =>\n {\n if(resizeObserver)\n {\n resizeObserver.disconnect();\n resizeObserver = null;\n }\n\n if(!controlled && engineRef.value)\n {\n await engineRef.value.stop();\n engineRef.value.renderEngine.dispose();\n }\n });\n</script>\n\n<!--------------------------------------------------------------------------------------------------------------------->\n","//----------------------------------------------------------------------------------------------------------------------\n// useSageEngine Composable\n//----------------------------------------------------------------------------------------------------------------------\n\nimport { type ComputedRef, type ShallowRef, computed, inject } from 'vue';\nimport type { GameEngine, GameEventBus } from '@skewedaspect/sage';\nimport { SAGE_ENGINE_KEY } from './symbols.ts';\n\n//----------------------------------------------------------------------------------------------------------------------\n\ninterface SageEngineContext\n{\n engine : ShallowRef<GameEngine | null>;\n eventBus : ComputedRef<GameEventBus | null>;\n}\n\nexport function useSageEngine() : SageEngineContext\n{\n const engine = inject(SAGE_ENGINE_KEY);\n if(!engine)\n {\n throw new Error('useSageEngine() must be used inside a <SageCanvas> component.');\n }\n\n return {\n engine,\n eventBus: computed(() => engine.value?.eventBus ?? null),\n };\n}\n\n//----------------------------------------------------------------------------------------------------------------------\n","//----------------------------------------------------------------------------------------------------------------------\n// useSageEvent Composable\n//----------------------------------------------------------------------------------------------------------------------\n\nimport { onUnmounted, watch } from 'vue';\nimport type { GameEvent, Unsubscribe, WildcardEventCallback, WildcardPattern } from '@skewedaspect/sage';\nimport { useSageEngine } from './useSageEngine.ts';\n\n//----------------------------------------------------------------------------------------------------------------------\n\ntype EventHandler = (event : GameEvent) => void | Promise<void>;\n\nexport function useSageEvent(pattern : string | RegExp, handler : EventHandler) : void\n{\n const { engine } = useSageEngine();\n let unsub : Unsubscribe | null = null;\n\n watch(engine, (eng) =>\n {\n if(unsub)\n {\n unsub();\n unsub = null;\n }\n\n if(eng)\n {\n unsub = eng.eventBus.subscribePattern(\n pattern as WildcardPattern | RegExp,\n handler as WildcardEventCallback\n );\n }\n }, { immediate: true });\n\n onUnmounted(() =>\n {\n if(unsub)\n {\n unsub();\n unsub = null;\n }\n });\n}\n\n//----------------------------------------------------------------------------------------------------------------------\n","//----------------------------------------------------------------------------------------------------------------------\n// useSageAction Composable\n//----------------------------------------------------------------------------------------------------------------------\n\nimport { type Ref, ref } from 'vue';\nimport { useSageEvent } from './useSageEvent.ts';\n\n//----------------------------------------------------------------------------------------------------------------------\n\nexport function useSageAction(actionName : string) : Ref<boolean | number>\n{\n const value = ref<boolean | number>(0);\n\n useSageEvent(`action:${ actionName }`, (event) =>\n {\n value.value = (event.payload as { value : boolean | number }).value;\n });\n\n return value;\n}\n\n//----------------------------------------------------------------------------------------------------------------------\n","//----------------------------------------------------------------------------------------------------------------------\n// useSageState Composable\n//----------------------------------------------------------------------------------------------------------------------\n\nimport { type Ref, ref } from 'vue';\nimport type { EntityStateChangedPayload } from '@skewedaspect/sage';\nimport { useSageEngine } from './useSageEngine.ts';\nimport { useSageEvent } from './useSageEvent.ts';\n\n//----------------------------------------------------------------------------------------------------------------------\n\n/**\n * Returns a reactive ref synced to an entity's state. If `key` is provided, tracks only that property; otherwise\n * tracks the entire state object.\n */\nexport function useSageState<T = unknown>(entityId : string, key ?: string) : Ref<T>\n{\n const { engine } = useSageEngine();\n\n // Read initial state from the entity (if it exists yet)\n const readState = () : T =>\n {\n const entity = engine.value?.managers.entityManager.getEntity(entityId);\n if(!entity)\n {\n return undefined as T;\n }\n\n if(key)\n {\n return (entity.state as Record<string, unknown>)[key] as T;\n }\n\n return entity.state as T;\n };\n\n const state = ref<T>(readState()) as Ref<T>;\n\n useSageEvent('entity:state-changed', (event) =>\n {\n const payload = event.payload as EntityStateChangedPayload;\n if(payload.entityId !== entityId)\n {\n return;\n }\n\n // Re-read from the entity to get the authoritative value\n state.value = readState();\n });\n\n return state;\n}\n\n//----------------------------------------------------------------------------------------------------------------------\n","//----------------------------------------------------------------------------------------------------------------------\n// useSageTimer Composable\n//----------------------------------------------------------------------------------------------------------------------\n\nimport { onUnmounted } from 'vue';\nimport type { CooldownHandle } from '@skewedaspect/sage';\nimport { useSageEngine } from './useSageEngine.ts';\n\n//----------------------------------------------------------------------------------------------------------------------\n\ninterface SageTimerComposable\n{\n delay : (ms : number, callback : () => void) => () => void;\n interval : (ms : number, callback : () => void) => () => void;\n cooldown : (ms : number) => CooldownHandle;\n}\n\n//----------------------------------------------------------------------------------------------------------------------\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst NOOP = () : void => {};\n\nconst NOOP_COOLDOWN : CooldownHandle = {\n get ready() : boolean { return false; },\n reset() : void { /* no-op */ },\n};\n\n//----------------------------------------------------------------------------------------------------------------------\n\n/**\n * Returns pause-aware timer functions (delay, interval, cooldown) from the game engine. All active timers are\n * automatically cancelled when the component unmounts.\n */\nexport function useSageTimer() : SageTimerComposable\n{\n const { engine } = useSageEngine();\n const cancellers : (() => void)[] = [];\n\n onUnmounted(() =>\n {\n for(const cancel of cancellers)\n {\n cancel();\n }\n\n cancellers.length = 0;\n });\n\n function delay(ms : number, callback : () => void) : () => void\n {\n if(!engine.value)\n {\n return NOOP;\n }\n\n const cancel = engine.value.timer.delay(ms, callback);\n cancellers.push(cancel);\n\n return () =>\n {\n cancel();\n const idx = cancellers.indexOf(cancel);\n if(idx >= 0)\n {\n cancellers.splice(idx, 1);\n }\n };\n }\n\n function interval(ms : number, callback : () => void) : () => void\n {\n if(!engine.value)\n {\n return NOOP;\n }\n\n const cancel = engine.value.timer.interval(ms, callback);\n cancellers.push(cancel);\n\n return () =>\n {\n cancel();\n const idx = cancellers.indexOf(cancel);\n if(idx >= 0)\n {\n cancellers.splice(idx, 1);\n }\n };\n }\n\n function cooldown(ms : number) : CooldownHandle\n {\n if(!engine.value)\n {\n return NOOP_COOLDOWN;\n }\n\n const handle = engine.value.timer.cooldown(ms);\n\n // There's no cancel for cooldowns, but we don't need to track them — they're passive pollable objects\n return handle;\n }\n\n return { delay, interval, cooldown };\n}\n\n//----------------------------------------------------------------------------------------------------------------------\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { GameEngine, GameEntityDefinition, SageOptions } from "../../../src/sage.d.ts";
1
+ import { GameEngine, GameEntityDefinition, SageOptions } from "./sage.d.ts";
2
2
  type __VLS_Props = {
3
3
  entityDefinitions?: GameEntityDefinition[];
4
4
  options?: SageOptions;
@@ -1,3 +1,3 @@
1
1
  import { InjectionKey, ShallowRef } from 'vue';
2
- import { GameEngine } from "../../../src/sage.d.ts";
2
+ import { GameEngine } from "./sage.d.ts";
3
3
  export declare const SAGE_ENGINE_KEY: InjectionKey<ShallowRef<GameEngine | null>>;
@@ -1,5 +1,5 @@
1
1
  import { ComputedRef, ShallowRef } from 'vue';
2
- import { GameEngine, GameEventBus } from "../../../src/sage.d.ts";
2
+ import { GameEngine, GameEventBus } from "./sage.d.ts";
3
3
  interface SageEngineContext {
4
4
  engine: ShallowRef<GameEngine | null>;
5
5
  eventBus: ComputedRef<GameEventBus | null>;
@@ -1,4 +1,4 @@
1
- import { GameEvent } from "../../../src/sage.d.ts";
1
+ import { GameEvent } from "./sage.d.ts";
2
2
  type EventHandler = (event: GameEvent) => void | Promise<void>;
3
3
  export declare function useSageEvent(pattern: string | RegExp, handler: EventHandler): void;
4
4
  export {};
@@ -1,4 +1,4 @@
1
- import { CooldownHandle } from "../../../src/sage.d.ts";
1
+ import { CooldownHandle } from "./sage.d.ts";
2
2
  interface SageTimerComposable {
3
3
  delay: (ms: number, callback: () => void) => () => void;
4
4
  interval: (ms: number, callback: () => void) => () => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skewedaspect/sage-vue",
3
- "version": "0.9.0-beta.8",
3
+ "version": "0.9.0",
4
4
  "type": "module",
5
5
  "main": "dist/sage-vue.js",
6
6
  "module": "dist/sage-vue.js",
@@ -34,9 +34,9 @@
34
34
  },
35
35
  "devDependencies": {
36
36
  "@vitejs/plugin-vue": "^6.0.3",
37
- "vite": "^7.3.1",
38
- "vite-plugin-dts": "^4.5.3",
39
- "typescript": "^5.8.3",
37
+ "vite": "^8.0.3",
38
+ "vite-plugin-dts": "^4.5.4",
39
+ "typescript": "^6.0.2",
40
40
  "vue": "^3.5.27"
41
41
  }
42
42
  }
File without changes