@miadi/stateloom-web 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.
Files changed (88) hide show
  1. package/package.json +1 -1
  2. package/server/.next/BUILD_ID +1 -1
  3. package/server/.next/build-manifest.json +4 -4
  4. package/server/.next/prerender-manifest.json +3 -3
  5. package/server/.next/server/app/_global-error/page/build-manifest.json +2 -2
  6. package/server/.next/server/app/_global-error/page.js +1 -1
  7. package/server/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/server/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/server/.next/server/app/_global-error.html +2 -2
  10. package/server/.next/server/app/_global-error.rsc +1 -1
  11. package/server/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  12. package/server/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  13. package/server/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  14. package/server/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  15. package/server/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/server/.next/server/app/_not-found/page/build-manifest.json +2 -2
  17. package/server/.next/server/app/_not-found/page.js +1 -1
  18. package/server/.next/server/app/_not-found/page.js.nft.json +1 -1
  19. package/server/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  20. package/server/.next/server/app/_not-found.html +1 -1
  21. package/server/.next/server/app/_not-found.rsc +2 -2
  22. package/server/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  23. package/server/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  24. package/server/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  25. package/server/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  26. package/server/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  27. package/server/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  28. package/server/.next/server/app/api/file/route.js.nft.json +1 -1
  29. package/server/.next/server/app/api/rispec/route.js.nft.json +1 -1
  30. package/server/.next/server/app/api/watch/route.js +3 -2
  31. package/server/.next/server/app/api/watch/route.js.nft.json +1 -1
  32. package/server/.next/server/app/index.html +1 -1
  33. package/server/.next/server/app/index.rsc +3 -3
  34. package/server/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  35. package/server/.next/server/app/index.segments/_full.segment.rsc +3 -3
  36. package/server/.next/server/app/index.segments/_head.segment.rsc +1 -1
  37. package/server/.next/server/app/index.segments/_index.segment.rsc +2 -2
  38. package/server/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  39. package/server/.next/server/app/page/build-manifest.json +2 -2
  40. package/server/.next/server/app/page.js +1 -1
  41. package/server/.next/server/app/page.js.nft.json +1 -1
  42. package/server/.next/server/app/page_client-reference-manifest.js +1 -1
  43. package/server/.next/server/chunks/[root-of-the-server]__2046b812._.js +2 -2
  44. package/server/.next/server/chunks/[root-of-the-server]__87bf4b91._.js +1 -1
  45. package/server/.next/server/chunks/[root-of-the-server]__95b05635._.js +8 -0
  46. package/server/.next/server/chunks/ssr/[root-of-the-server]__2955c0d8._.js +3 -0
  47. package/server/.next/server/chunks/ssr/{[root-of-the-server]__b4e7f753._.js → [root-of-the-server]__385c85a7._.js} +2 -2
  48. package/server/.next/server/chunks/ssr/[root-of-the-server]__a977f174._.js +3 -0
  49. package/server/.next/server/chunks/ssr/[root-of-the-server]__bfd16096._.js +3 -0
  50. package/server/.next/server/chunks/ssr/[root-of-the-server]__edbb995c._.js +4 -4
  51. package/server/.next/server/chunks/ssr/{[root-of-the-server]__9cafe12a._.js → [root-of-the-server]__f25b51be._.js} +2 -2
  52. package/server/.next/server/middleware-build-manifest.js +2 -2
  53. package/server/.next/server/pages/404.html +1 -1
  54. package/server/.next/server/pages/500.html +2 -2
  55. package/server/.next/server/server-reference-manifest.js +1 -1
  56. package/server/.next/server/server-reference-manifest.json +1 -1
  57. package/server/.next/static/chunks/0a0f393b77d3422b.css +2 -0
  58. package/server/.next/static/chunks/{8a03c0d2436d4c0f.js → 662d1b0ce457c16b.js} +1 -1
  59. package/server/.next/static/chunks/aea5b1716c68391c.js +1 -0
  60. package/server/.next/static/chunks/e29b67abadc7c68a.js +10 -0
  61. package/server/.next/static/chunks/{turbopack-8f57da603e40457d.js → turbopack-34fc7de1568e2a7f.js} +1 -1
  62. package/server/package-lock.json +38 -5
  63. package/server/package.json +2 -1
  64. package/server/src/app/api/file/route.ts +20 -6
  65. package/server/src/app/api/watch/route.ts +11 -3
  66. package/server/src/app/globals.css +7 -64
  67. package/server/src/app/layout.tsx +3 -0
  68. package/server/src/components/BridgeProvider.tsx +10 -3
  69. package/server/src/components/Canvas.tsx +78 -1325
  70. package/server/src/components/DocSwitcher.tsx +84 -0
  71. package/server/src/components/SettingsPanel.tsx +11 -6
  72. package/server/src/components/SocketBridgeProvider.tsx +11 -4
  73. package/server/src/components/Toolbar.tsx +11 -3
  74. package/server/src/lib/docParam.ts +51 -0
  75. package/server/src/lib/layoutMemory.ts +20 -2
  76. package/server/src/lib/projectFile.ts +68 -1
  77. package/server/src/types/definition.ts +12 -2
  78. package/server/stateloom-web.json +2 -2
  79. package/server/tsconfig.tsbuildinfo +1 -1
  80. package/server/.next/server/chunks/[root-of-the-server]__0a18d740._.js +0 -8
  81. package/server/.next/server/chunks/ssr/[root-of-the-server]__517c9b38._.js +0 -3
  82. package/server/.next/server/chunks/ssr/[root-of-the-server]__632c82d7._.js +0 -3
  83. package/server/.next/server/chunks/ssr/[root-of-the-server]__ecf19999._.js +0 -3
  84. package/server/.next/static/chunks/367d28d76d2be05f.js +0 -10
  85. package/server/.next/static/chunks/b6bd7719e3445512.css +0 -1
  86. /package/server/.next/static/{GkITWCpEKNsMrqxlkqzGB → Q7HQy4udl4A_DaAl9bdUt}/_buildManifest.js +0 -0
  87. /package/server/.next/static/{GkITWCpEKNsMrqxlkqzGB → Q7HQy4udl4A_DaAl9bdUt}/_clientMiddlewareManifest.json +0 -0
  88. /package/server/.next/static/{GkITWCpEKNsMrqxlkqzGB → Q7HQy4udl4A_DaAl9bdUt}/_ssgManifest.js +0 -0
@@ -251,67 +251,10 @@ body {
251
251
  }
252
252
  }
253
253
 
254
- /* --- WS7b: live Canvas animations (SVG/CSS only, no libraries) --- */
255
-
256
- /* Node bloom-in: fade + scale from ~0.92 to 1 around the node's own center. */
257
- @keyframes sm-node-in {
258
- from { opacity: 0; transform: scale(0.92); }
259
- to { opacity: 1; transform: scale(1); }
260
- }
261
-
262
- /* Node fade-out: fade + scale down as the state leaves the definition. */
263
- @keyframes sm-node-out {
264
- from { opacity: 1; transform: scale(1); }
265
- to { opacity: 0; transform: scale(0.9); }
266
- }
267
-
268
- /* Edge draw-on: reveal the stroke (pathLength=1 normalises the dash units). */
269
- @keyframes sm-edge-draw {
270
- from { stroke-dashoffset: 1; opacity: 0; }
271
- to { stroke-dashoffset: 0; opacity: 1; }
272
- }
273
-
274
- /* Runtime-active pulse: a green (#22c55e) glow that layers over any stroke. */
275
- @keyframes sm-pulse {
276
- 0%, 100% { filter: drop-shadow(0 0 1px rgba(34, 197, 94, 0.55)); }
277
- 50% { filter: drop-shadow(0 0 6px rgba(34, 197, 94, 0.95)); }
278
- }
279
-
280
- .sm-node-enter {
281
- transform-box: fill-box;
282
- transform-origin: center;
283
- animation: sm-node-in 220ms ease-out both;
284
- }
285
-
286
- .sm-node-exit {
287
- transform-box: fill-box;
288
- transform-origin: center;
289
- animation: sm-node-out 200ms ease-in forwards;
290
- }
291
-
292
- .sm-edge-enter {
293
- stroke-dasharray: 1;
294
- animation: sm-edge-draw 260ms ease-out both;
295
- }
296
-
297
- .sm-node-active {
298
- animation: sm-pulse 1.2s ease-in-out infinite;
299
- }
300
-
301
- @media (prefers-reduced-motion: reduce) {
302
- .sm-node-enter,
303
- .sm-edge-enter {
304
- animation: none;
305
- }
306
- /* Keep exit near-instant so onAnimationEnd still fires and the node is
307
- cleaned up from the exiting layer. */
308
- .sm-node-exit {
309
- animation-duration: 1ms;
310
- }
311
- /* Drop the infinite motion but keep a static glow so active states stay
312
- distinguishable without relying on motion. */
313
- .sm-node-active {
314
- animation: none;
315
- filter: drop-shadow(0 0 4px rgba(34, 197, 94, 0.85));
316
- }
317
- }
254
+ /* --- Live canvas animations ------------------------------------------------
255
+ Moved out with the board itself. The node bloom, the edge draw-on, the
256
+ active-state pulse and their reduced-motion answers now ship as
257
+ `@miadi/stateloom-canvas/styles.css`, imported in app/layout.tsx, so the
258
+ designer and forgewright animate the same way from one source. Nothing in
259
+ this app referenced the old `sm-*` class names outside the canvas, which is
260
+ why they could simply leave. */
@@ -1,5 +1,8 @@
1
1
  import type { Metadata, Viewport } from "next";
2
2
  import "./globals.css";
3
+ // The board's own colours and animations. It ships with the canvas package so
4
+ // forgewright gets the identical surface from the identical stylesheet.
5
+ import "@miadi/stateloom-canvas/styles.css";
3
6
 
4
7
  export const metadata: Metadata = {
5
8
  title: "SMCraft Designer",
@@ -2,18 +2,23 @@
2
2
 
3
3
  import { useEffect } from "react";
4
4
  import { useDesignerStore } from "@/store/useDesignerStore";
5
+ import { docQuery, useRequestedDoc } from "@/lib/docParam";
5
6
 
6
7
  export default function BridgeProvider() {
7
8
  const applyRemote = useDesignerStore((s) => s.applyRemote);
8
9
  const setRemoteStatus = useDesignerStore((s) => s.setRemoteStatus);
9
10
  const setRemoteMtime = useDesignerStore((s) => s.setRemoteMtime);
11
+ // Step 2: the requested `?doc=` rides both the file fetch and the watch
12
+ // stream; the server resolves and guards, the browser only passes through.
13
+ const requested = useRequestedDoc();
10
14
 
11
15
  useEffect(() => {
12
16
  let cancelled = false;
17
+ const qs = docQuery(requested);
13
18
 
14
19
  async function fetchFile(): Promise<{ content: string | null; mtime: number; path: string; exists: boolean } | null> {
15
20
  try {
16
- const r = await fetch("/api/file", { cache: "no-store" });
21
+ const r = await fetch(`/api/file${qs}`, { cache: "no-store" });
17
22
  if (!r.ok) return null;
18
23
  return await r.json();
19
24
  } catch {
@@ -33,7 +38,7 @@ export default function BridgeProvider() {
33
38
  }
34
39
  })();
35
40
 
36
- const es = new EventSource("/api/watch");
41
+ const es = new EventSource(`/api/watch${qs}`);
37
42
 
38
43
  es.addEventListener("hello", (ev) => {
39
44
  try {
@@ -68,7 +73,9 @@ export default function BridgeProvider() {
68
73
  cancelled = true;
69
74
  es.close();
70
75
  };
71
- }, [applyRemote, setRemoteStatus, setRemoteMtime]);
76
+ // `requested` re-keys the whole effect (step 3): a document switch closes
77
+ // the old watch stream and loads + watches the new document, no reload.
78
+ }, [applyRemote, setRemoteStatus, setRemoteMtime, requested]);
72
79
 
73
80
  return null;
74
81
  }