@sebastianwessel/isostate 0.1.0 → 0.1.2

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,62 @@
1
+ # @sebastianwessel/isostate
2
+
3
+ Scroll-driven animated isometric scenes for product storytelling, technical
4
+ docs, and visual explainers.
5
+
6
+ Isostate renders compiled scene bundles as lightweight SVG. YAML parsing,
7
+ validation, and compilation happen at build time; browsers only receive the
8
+ runtime, compiled scene data, and referenced assets.
9
+
10
+ ## Links
11
+
12
+ - Website: https://sebastianwessel.github.io/isostate
13
+ - Repository: https://github.com/sebastianwessel/isostate
14
+ - Issues: https://github.com/sebastianwessel/isostate/issues
15
+ - Documentation: https://sebastianwessel.github.io/isostate/docs/getting-started.md/
16
+
17
+ ## Install
18
+
19
+ ```bash
20
+ npm install @sebastianwessel/isostate
21
+ ```
22
+
23
+ The browser runtime has no production dependencies. The optional `yaml` peer is
24
+ only needed when you use the dev-time DSL APIs from `@sebastianwessel/isostate/dsl`.
25
+
26
+ ## Runtime Usage
27
+
28
+ ```ts
29
+ import { mountScene, type RuntimeBundle } from '@sebastianwessel/isostate';
30
+ import sceneBundle from './scene.isostate.js';
31
+
32
+ const target = document.querySelector<HTMLElement>('#scene');
33
+ if (!target) throw new Error('Missing #scene');
34
+
35
+ const mounted = mountScene(target, sceneBundle as RuntimeBundle, {
36
+ label: 'Product story',
37
+ controller: false
38
+ });
39
+
40
+ mounted.engine.setProgress(0.5);
41
+ ```
42
+
43
+ ## Dev-Time DSL Usage
44
+
45
+ ```ts
46
+ import {
47
+ compileScene,
48
+ parseScene,
49
+ toJs,
50
+ validateScene
51
+ } from '@sebastianwessel/isostate/dsl';
52
+
53
+ const document = parseScene(yamlText);
54
+ const report = validateScene(document);
55
+ if (!report.isValid) throw new Error(report.errors[0]?.message);
56
+
57
+ const bundle = compileScene(document);
58
+ const jsModule = toJs(bundle);
59
+ ```
60
+
61
+ For CLI validation, compilation, and static bundles, use
62
+ `@sebastianwessel/isostate-cli`.
@@ -1 +1 @@
1
- {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/animation/controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/animation/controller.ts"],"names":[],"mappings":"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"}
@@ -256,7 +256,7 @@ function interpolateConnector(id, prevStop, nextStop, t) {
256
256
  route: interpolateRoute(prev.route, next.route, t),
257
257
  layer: t < 1 ? prev.layer : next.layer,
258
258
  lifecycle,
259
- style: cloneConnectorStyle(next.style),
259
+ style: cloneConnectorStyle(t < 1 ? prev.style : next.style),
260
260
  start: next.start,
261
261
  end: next.end,
262
262
  direction: next.direction,
@@ -1527,8 +1527,7 @@ function applyConnectorAmbientClasses(state, ambient) {
1527
1527
  state.shaft.classList.remove(`iso-ambient-${name}`);
1528
1528
  }
1529
1529
  for (const name of next) {
1530
- if (!state.ambient.has(name))
1531
- state.shaft.classList.add(`iso-ambient-${name}`);
1530
+ state.shaft.classList.add(`iso-ambient-${name}`);
1532
1531
  }
1533
1532
  state.ambient = next;
1534
1533
  }
@@ -1935,8 +1934,11 @@ class AnimationController {
1935
1934
  if (entryAnim === "none")
1936
1935
  return;
1937
1936
  animateElement(state.node, `iso-anim-${entryAnim}`, "enter");
1937
+ const expectedAnimation = state.node.style.animation;
1938
1938
  state.node.addEventListener("animationend", () => {
1939
- state.node.style.animation = "";
1939
+ if (state.node.style.animation === expectedAnimation) {
1940
+ state.node.style.animation = "";
1941
+ }
1940
1942
  }, { once: true });
1941
1943
  }
1942
1944
  _applyExitAnimation(elDef, state) {
@@ -1946,8 +1948,11 @@ class AnimationController {
1946
1948
  return;
1947
1949
  }
1948
1950
  animateElement(state.node, `iso-anim-${exitAnim}`, "exit");
1951
+ const expectedAnimation = state.node.style.animation;
1949
1952
  state.node.addEventListener("animationend", () => {
1950
- hideElementAfterExit(state.node);
1953
+ if (state.node.style.animation === expectedAnimation) {
1954
+ hideElementAfterExit(state.node);
1955
+ }
1951
1956
  }, { once: true });
1952
1957
  }
1953
1958
  _applyConnectorEntryAnimation(connectorDef, state) {
@@ -1955,8 +1960,11 @@ class AnimationController {
1955
1960
  if (entryAnim === "none")
1956
1961
  return;
1957
1962
  animateElement(state.node, `iso-anim-${entryAnim}`, "enter");
1963
+ const expectedAnimation = state.node.style.animation;
1958
1964
  state.node.addEventListener("animationend", () => {
1959
- state.node.style.animation = "";
1965
+ if (state.node.style.animation === expectedAnimation) {
1966
+ state.node.style.animation = "";
1967
+ }
1960
1968
  }, { once: true });
1961
1969
  }
1962
1970
  _applyConnectorExitAnimation(connectorDef, state) {
@@ -1966,8 +1974,11 @@ class AnimationController {
1966
1974
  return;
1967
1975
  }
1968
1976
  animateElement(state.node, `iso-anim-${exitAnim}`, "exit");
1977
+ const expectedAnimation = state.node.style.animation;
1969
1978
  state.node.addEventListener("animationend", () => {
1970
- hideElementAfterExit(state.node);
1979
+ if (state.node.style.animation === expectedAnimation) {
1980
+ hideElementAfterExit(state.node);
1981
+ }
1971
1982
  }, { once: true });
1972
1983
  }
1973
1984
  // ── Scene transitions ──────────────────────────────────────────────────
@@ -2202,7 +2213,7 @@ function oppositeEntryAnimation(exit) {
2202
2213
  }
2203
2214
 
2204
2215
  const RUNTIME_BUNDLE_FORMAT = "isostate-runtime-bundle";
2205
- const RUNTIME_VERSION = "0.1.0";
2216
+ const RUNTIME_VERSION = "0.1.2";
2206
2217
  const HEX_DIGEST_PATTERN = /^[a-f0-9]{64}$/;
2207
2218
  /** Mount a compiled runtime bundle into an HTML element. */
2208
2219
  function mountScene(target, bundle, options = {}) {