fibrae 0.3.0 → 0.3.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 (97) hide show
  1. package/dist/atom-utils.d.ts +52 -0
  2. package/dist/atom-utils.js +64 -0
  3. package/dist/atom-utils.js.map +1 -0
  4. package/dist/cli/build.js +2 -2
  5. package/dist/cli/build.js.map +1 -1
  6. package/dist/cli/html.d.ts +6 -0
  7. package/dist/cli/html.js +20 -26
  8. package/dist/cli/html.js.map +1 -1
  9. package/dist/cli/vite-plugin.js +41 -2
  10. package/dist/cli/vite-plugin.js.map +1 -1
  11. package/dist/components.d.ts +3 -3
  12. package/dist/components.js +3 -1
  13. package/dist/components.js.map +1 -1
  14. package/dist/core.js +37 -10
  15. package/dist/core.js.map +1 -1
  16. package/dist/dom.d.ts +22 -3
  17. package/dist/dom.js +100 -5
  18. package/dist/dom.js.map +1 -1
  19. package/dist/fiber-commit.d.ts +2 -0
  20. package/dist/fiber-commit.js +179 -40
  21. package/dist/fiber-commit.js.map +1 -1
  22. package/dist/fiber-render.js +13 -27
  23. package/dist/fiber-render.js.map +1 -1
  24. package/dist/fiber-update.d.ts +1 -1
  25. package/dist/fiber-update.js +33 -12
  26. package/dist/fiber-update.js.map +1 -1
  27. package/dist/h.d.ts +65 -10
  28. package/dist/h.js +98 -22
  29. package/dist/h.js.map +1 -1
  30. package/dist/head.d.ts +64 -0
  31. package/dist/head.js +257 -0
  32. package/dist/head.js.map +1 -0
  33. package/dist/hydration-dev.d.ts +24 -0
  34. package/dist/hydration-dev.js +138 -0
  35. package/dist/hydration-dev.js.map +1 -0
  36. package/dist/index.d.ts +6 -2
  37. package/dist/index.js +5 -2
  38. package/dist/index.js.map +1 -1
  39. package/dist/jsx-runtime/index.d.ts +288 -8
  40. package/dist/jsx-runtime/index.js +2 -0
  41. package/dist/jsx-runtime/index.js.map +1 -1
  42. package/dist/live/client.js +4 -4
  43. package/dist/live/client.js.map +1 -1
  44. package/dist/live/server.js.map +1 -1
  45. package/dist/live/sse-stream.js +2 -2
  46. package/dist/live/sse-stream.js.map +1 -1
  47. package/dist/mdx/index.d.ts +125 -0
  48. package/dist/mdx/index.js +137 -0
  49. package/dist/mdx/index.js.map +1 -0
  50. package/dist/mdx/parse.d.ts +42 -0
  51. package/dist/mdx/parse.js +147 -0
  52. package/dist/mdx/parse.js.map +1 -0
  53. package/dist/mdx/render.d.ts +24 -0
  54. package/dist/mdx/render.js +261 -0
  55. package/dist/mdx/render.js.map +1 -0
  56. package/dist/router/Form.d.ts +90 -0
  57. package/dist/router/Form.js +166 -0
  58. package/dist/router/Form.js.map +1 -0
  59. package/dist/router/History.d.ts +2 -2
  60. package/dist/router/History.js.map +1 -1
  61. package/dist/router/Link.d.ts +27 -32
  62. package/dist/router/Link.js +56 -98
  63. package/dist/router/Link.js.map +1 -1
  64. package/dist/router/Navigator.d.ts +49 -44
  65. package/dist/router/Navigator.js +57 -104
  66. package/dist/router/Navigator.js.map +1 -1
  67. package/dist/router/Route.d.ts +8 -4
  68. package/dist/router/Route.js +10 -2
  69. package/dist/router/Route.js.map +1 -1
  70. package/dist/router/Router.d.ts +10 -10
  71. package/dist/router/Router.js +38 -23
  72. package/dist/router/Router.js.map +1 -1
  73. package/dist/router/RouterBuilder.d.ts +69 -6
  74. package/dist/router/RouterBuilder.js +23 -0
  75. package/dist/router/RouterBuilder.js.map +1 -1
  76. package/dist/router/RouterOutlet.js +63 -45
  77. package/dist/router/RouterOutlet.js.map +1 -1
  78. package/dist/router/index.d.ts +10 -3
  79. package/dist/router/index.js +5 -2
  80. package/dist/router/index.js.map +1 -1
  81. package/dist/router/register.d.ts +37 -0
  82. package/dist/router/register.js +18 -0
  83. package/dist/router/register.js.map +1 -0
  84. package/dist/router/utils.d.ts +2 -2
  85. package/dist/runtime.d.ts +1 -1
  86. package/dist/server.js +7 -3
  87. package/dist/server.js.map +1 -1
  88. package/dist/shared.d.ts +36 -6
  89. package/dist/shared.js +12 -2
  90. package/dist/shared.js.map +1 -1
  91. package/dist/tracking.d.ts +3 -2
  92. package/dist/tracking.js +4 -1
  93. package/dist/tracking.js.map +1 -1
  94. package/dist/transition.d.ts +51 -0
  95. package/dist/transition.js +46 -0
  96. package/dist/transition.js.map +1 -0
  97. package/package.json +16 -3
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Component-scoped atom utilities.
3
+ *
4
+ * Thin wrappers that tie atom subscriptions to the component lifecycle
5
+ * via ComponentScope, so cleanup happens automatically on unmount.
6
+ */
7
+ import * as Effect from "effect/Effect";
8
+ import * as Scope from "effect/Scope";
9
+ import { Atom, Registry as AtomRegistry } from "@effect-atom/atom";
10
+ import { ComponentScope } from "./shared.js";
11
+ /**
12
+ * Subscribe to an atom for the lifetime of the current component.
13
+ * The subscription is cleaned up automatically when the component unmounts.
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * const Counter = () =>
18
+ * Effect.gen(function* () {
19
+ * yield* subscribeAtom(countAtom, (value) => {
20
+ * console.log("count changed:", value);
21
+ * });
22
+ * const count = yield* Atom.get(countAtom);
23
+ * return <div>Count: {count}</div>;
24
+ * });
25
+ * ```
26
+ */
27
+ export declare const subscribeAtom: <A>(atom: Atom.Atom<A>, callback: (value: A) => void) => Effect.Effect<void, never, AtomRegistry.AtomRegistry | ComponentScope>;
28
+ /**
29
+ * Run an Effect after the component mounts, scoped to the component lifetime.
30
+ * The forked fiber is interrupted when the component unmounts.
31
+ *
32
+ * Useful for imperative setup (DOM manipulation, external library init)
33
+ * that needs to wait for the DOM to be ready.
34
+ *
35
+ * @example
36
+ * ```tsx
37
+ * const Editor = () =>
38
+ * Effect.gen(function* () {
39
+ * const ref = { current: null as HTMLDivElement | null };
40
+ *
41
+ * yield* mountAtom(
42
+ * Effect.gen(function* () {
43
+ * const editor = monaco.create(ref.current!);
44
+ * yield* Effect.addFinalizer(() => Effect.sync(() => editor.dispose()));
45
+ * }),
46
+ * );
47
+ *
48
+ * return <div ref={el => ref.current = el} />;
49
+ * });
50
+ * ```
51
+ */
52
+ export declare const mountAtom: <A, E>(effect: Effect.Effect<A, E, Scope.Scope>) => Effect.Effect<void, never, ComponentScope>;
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Component-scoped atom utilities.
3
+ *
4
+ * Thin wrappers that tie atom subscriptions to the component lifecycle
5
+ * via ComponentScope, so cleanup happens automatically on unmount.
6
+ */
7
+ import * as Effect from "effect/Effect";
8
+ import * as Scope from "effect/Scope";
9
+ import { Atom, Registry as AtomRegistry } from "@effect-atom/atom";
10
+ import { ComponentScope } from "./shared.js";
11
+ /**
12
+ * Subscribe to an atom for the lifetime of the current component.
13
+ * The subscription is cleaned up automatically when the component unmounts.
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * const Counter = () =>
18
+ * Effect.gen(function* () {
19
+ * yield* subscribeAtom(countAtom, (value) => {
20
+ * console.log("count changed:", value);
21
+ * });
22
+ * const count = yield* Atom.get(countAtom);
23
+ * return <div>Count: {count}</div>;
24
+ * });
25
+ * ```
26
+ */
27
+ export const subscribeAtom = (atom, callback) => Effect.gen(function* () {
28
+ const { scope } = yield* ComponentScope;
29
+ const registry = yield* AtomRegistry.AtomRegistry;
30
+ const unsubscribe = registry.subscribe(atom, callback);
31
+ yield* Scope.addFinalizer(scope, Effect.sync(unsubscribe));
32
+ });
33
+ /**
34
+ * Run an Effect after the component mounts, scoped to the component lifetime.
35
+ * The forked fiber is interrupted when the component unmounts.
36
+ *
37
+ * Useful for imperative setup (DOM manipulation, external library init)
38
+ * that needs to wait for the DOM to be ready.
39
+ *
40
+ * @example
41
+ * ```tsx
42
+ * const Editor = () =>
43
+ * Effect.gen(function* () {
44
+ * const ref = { current: null as HTMLDivElement | null };
45
+ *
46
+ * yield* mountAtom(
47
+ * Effect.gen(function* () {
48
+ * const editor = monaco.create(ref.current!);
49
+ * yield* Effect.addFinalizer(() => Effect.sync(() => editor.dispose()));
50
+ * }),
51
+ * );
52
+ *
53
+ * return <div ref={el => ref.current = el} />;
54
+ * });
55
+ * ```
56
+ */
57
+ export const mountAtom = (effect) => Effect.gen(function* () {
58
+ const { scope, mounted } = yield* ComponentScope;
59
+ yield* Effect.gen(function* () {
60
+ yield* mounted;
61
+ yield* effect;
62
+ }).pipe(Effect.forkScoped, Scope.extend(scope));
63
+ });
64
+ //# sourceMappingURL=atom-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atom-utils.js","sourceRoot":"","sources":["../src/atom-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,IAAkB,EAClB,QAA4B,EAC4C,EAAE,CAC1E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC;IAClD,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACvD,KAAK,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEL;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,MAAwC,EACI,EAAE,CAC9C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;IACjD,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB,KAAK,CAAC,CAAC,OAAO,CAAC;QACf,KAAK,CAAC,CAAC,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC"}
package/dist/cli/build.js CHANGED
@@ -22,9 +22,9 @@ const renderRoute = (config) => Effect.gen(function* () {
22
22
  });
23
23
  const fullLayer = Layer.provideMerge(serverLayer, Layer.merge(config.handlersLayer, SSRAtomRegistryLayer));
24
24
  const { html, dehydratedState, head } = yield* Effect.gen(function* () {
25
- const { element, head } = yield* Router.CurrentRouteElement;
25
+ const { element, head: routeHead } = yield* Router.CurrentRouteElement;
26
26
  const renderResult = yield* renderToStringWith(config.appShell(element));
27
- return { ...renderResult, head };
27
+ return { ...renderResult, head: routeHead };
28
28
  }).pipe(Effect.provide(fullLayer));
29
29
  return yield* buildPage({
30
30
  html,
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,9 @@
1
+ /**
2
+ * HTML page template for static site generation.
3
+ *
4
+ * Uses fibrae JSX to generate full HTML documents wrapping
5
+ * pre-rendered content with dehydrated state and client scripts.
6
+ */
1
7
  import type { HeadData } from "../router/RouterBuilder.js";
2
8
  import * as Effect from "effect/Effect";
3
9
  import * as Option from "effect/Option";
package/dist/cli/html.js CHANGED
@@ -4,6 +4,8 @@
4
4
  * Uses fibrae JSX to generate full HTML documents wrapping
5
5
  * pre-rendered content with dehydrated state and client scripts.
6
6
  */
7
+ // eslint-disable-next-line no-unused-vars -- jsx is used by the JSX transform (jsxFactory)
8
+ import { jsx } from "../jsx-runtime/index.js";
7
9
  import { h } from "../h.js";
8
10
  import { renderToString } from "../server.js";
9
11
  import * as Effect from "effect/Effect";
@@ -13,20 +15,18 @@ const metaToElement = (meta) => {
13
15
  if ("title" in meta)
14
16
  return Option.none();
15
17
  if ("charset" in meta)
16
- return Option.some(h("meta", { charset: meta.charset }));
18
+ return Option.some(jsx("meta", { charset: meta.charset }));
17
19
  if ("script:ld+json" in meta)
18
- return Option.some(h("script", {
19
- type: "application/ld+json",
20
- dangerouslySetInnerHTML: JSON.stringify(meta["script:ld+json"]),
21
- }));
20
+ return Option.some(jsx("script", { type: "application/ld+json", dangerouslySetInnerHTML: JSON.stringify(meta["script:ld+json"]) }));
22
21
  if ("name" in meta)
23
- return Option.some(h("meta", { name: meta.name, content: meta.content }));
22
+ return Option.some(jsx("meta", { name: meta.name, content: meta.content }));
24
23
  if ("property" in meta)
25
- return Option.some(h("meta", { property: meta.property, content: meta.content }));
24
+ return Option.some(jsx("meta", { property: meta.property, content: meta.content }));
26
25
  if ("httpEquiv" in meta)
27
- return Option.some(h("meta", { "http-equiv": meta.httpEquiv, content: meta.content }));
26
+ return Option.some(jsx("meta", { "http-equiv": meta.httpEquiv, content: meta.content }));
28
27
  if ("tagName" in meta) {
29
28
  const { tagName, ...attrs } = meta;
29
+ // Dynamic tag name -- JSX requires literal tags, so use h() directly
30
30
  return Option.some(h(tagName, attrs));
31
31
  }
32
32
  return Option.none();
@@ -70,32 +70,26 @@ const buildHeadChildren = (title, head, headTags) => {
70
70
  const allLinks = [...(headTags?.links ?? []), ...(headData?.links ?? [])];
71
71
  const allScripts = [...(headTags?.scripts ?? []), ...(headData?.scripts ?? [])];
72
72
  return [
73
- h("meta", { charset: "UTF-8" }),
74
- h("meta", { name: "viewport", content: "width=device-width, initial-scale=1.0" }),
73
+ jsx("meta", { charset: "UTF-8" }),
74
+ jsx("meta", { name: "viewport", content: "width=device-width, initial-scale=1.0" }),
75
75
  ...Option.match(Option.fromNullable(pageTitle), {
76
76
  onNone: () => [],
77
- onSome: (t) => [h("title", {}, [t])],
77
+ onSome: (t) => [jsx("title", null, t)],
78
78
  }),
79
79
  ...Array.filterMap(allMeta, metaToElement),
80
- ...allLinks.map((attrs) => h("link", attrs)),
80
+ ...allLinks.map((attrs) => jsx("link", { ...attrs })),
81
81
  ...allScripts.flatMap((script) => script.src
82
- ? [h("script", { type: script.type, src: script.src })]
82
+ ? [jsx("script", { type: script.type, src: script.src })]
83
83
  : script.content
84
- ? [h("script", { type: script.type, dangerouslySetInnerHTML: script.content })]
84
+ ? [jsx("script", { type: script.type, dangerouslySetInnerHTML: script.content })]
85
85
  : []),
86
86
  ];
87
87
  };
88
- const PageShell = (props) => h("html", { lang: "en" }, [
89
- h("head", {}, buildHeadChildren(props.title, props.head, props.headTags)),
90
- h("body", {}, [
91
- h("div", { id: "root", dangerouslySetInnerHTML: props.html }),
92
- h("script", {
93
- type: "application/json",
94
- id: "__fibrae-state__",
95
- dangerouslySetInnerHTML: JSON.stringify(props.dehydratedState),
96
- }),
97
- ...(props.clientScript ? [h("script", { type: "module", src: props.clientScript })] : []),
98
- ]),
99
- ]);
88
+ const PageShell = (props) => (jsx("html", { lang: "en" },
89
+ jsx("head", null, buildHeadChildren(props.title, props.head, props.headTags)),
90
+ jsx("body", null,
91
+ jsx("div", { id: "root", dangerouslySetInnerHTML: props.html }),
92
+ jsx("script", { type: "application/json", id: "__fibrae-state__", dangerouslySetInnerHTML: JSON.stringify(props.dehydratedState) }),
93
+ props.clientScript ? jsx("script", { type: "module", src: props.clientScript }) : null)));
100
94
  export const buildPage = (options) => renderToString(PageShell(options)).pipe(Effect.map(({ html }) => `<!DOCTYPE html>\n${html}`));
101
95
  //# sourceMappingURL=html.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/cli/html.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,SAAS,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAatC,MAAM,aAAa,GAAG,CAAC,IAAoB,EAA2B,EAAE;IACtE,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IAC1C,IAAI,SAAS,IAAI,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAChF,IAAI,gBAAgB,IAAI,IAAI;QAC1B,OAAO,MAAM,CAAC,IAAI,CAChB,CAAC,CAAC,QAAQ,EAAE;YACV,IAAI,EAAE,qBAAqB;YAC3B,uBAAuB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;SAChE,CAAC,CACH,CAAC;IACJ,IAAI,MAAM,IAAI,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9F,IAAI,UAAU,IAAI,IAAI;QACpB,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpF,IAAI,WAAW,IAAI,IAAI;QACrB,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACzF,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACtB,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;QACnC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,OAAO,GAAG,CAAC,IAAoB,EAAsB,EAAE;IAC3D,IAAI,MAAM,IAAI,IAAI;QAAE,OAAO,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/C,IAAI,UAAU,IAAI,IAAI;QAAE,OAAO,YAAY,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC3D,IAAI,WAAW,IAAI,IAAI;QAAE,OAAO,aAAa,IAAI,CAAC,SAAS,EAAE,CAAC;IAC9D,IAAI,SAAS,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IACxC,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,SAAS,GAAG,CAChB,MAAqC,EACrC,QAAuC,EACR,EAAE;IACjC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACnC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACvB,OAAO,GAAG,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CACxB,KAAyB,EACzB,IAA6B,EAC7B,QAAmB,EACP,EAAE;IACd,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC7C,sEAAsE;IACtE,MAAM,SAAS,GAAG,QAAQ,EAAE,KAAK,IAAI,QAAQ,EAAE,KAAK,IAAI,KAAK,CAAC;IAE9D,6CAA6C;IAC7C,gEAAgE;IAChE,qEAAqE;IACrE,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1E,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IAEhF,OAAO;QACL,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAC/B,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,uCAAuC,EAAE,CAAC;QACjF,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE;YAC9C,MAAM,EAAE,GAAG,EAAE,CAAC,EAAgB;YAC9B,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;SACrC,CAAC;QACF,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC;QAC1C,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC5C,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAC/B,MAAM,CAAC,GAAG;YACR,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;YACvD,CAAC,CAAC,MAAM,CAAC,OAAO;gBACd,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,uBAAuB,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC/E,CAAC,CAAC,EAAE,CACT;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,KAAkB,EAAE,EAAE,CACvC,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;IACxB,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACzE,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE;QACZ,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,uBAAuB,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7D,CAAC,CAAC,QAAQ,EAAE;YACV,IAAI,EAAE,kBAAkB;YACxB,EAAE,EAAE,kBAAkB;YACtB,uBAAuB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC;SAC/D,CAAC;QACF,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1F,CAAC;CACH,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAoB,EAAkC,EAAE,CAChF,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/cli/html.tsx"],"names":[],"mappings":"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"}
@@ -17,7 +17,7 @@ const renderDevPage = (opts) => Effect.gen(function* () {
17
17
  });
18
18
  const fullLayer = Layer.provideMerge(serverLayer, Layer.merge(opts.handlersLayer, SSRAtomRegistryLayer));
19
19
  const { html, dehydratedState, head } = yield* Effect.gen(function* () {
20
- const { head } = yield* Router.CurrentRouteElement;
20
+ const { head: routeHead } = yield* Router.CurrentRouteElement;
21
21
  const renderResult = opts.App
22
22
  ? yield* renderToStringWith(opts.App())
23
23
  : yield* Effect.gen(function* () {
@@ -25,7 +25,7 @@ const renderDevPage = (opts) => Effect.gen(function* () {
25
25
  const app = opts.appShell ? opts.appShell(element) : element;
26
26
  return yield* renderToStringWith(app);
27
27
  });
28
- return { ...renderResult, head };
28
+ return { ...renderResult, head: routeHead };
29
29
  }).pipe(Effect.provide(fullLayer));
30
30
  return yield* buildPage({
31
31
  html,
@@ -61,11 +61,50 @@ const collectCss = async (server, entryUrl) => {
61
61
  };
62
62
  export const fibrae = (config) => {
63
63
  let _resolvedConfig;
64
+ let clientEntryId;
64
65
  return {
65
66
  name: "fibrae-ssg",
67
+ config() {
68
+ return {
69
+ optimizeDeps: {
70
+ exclude: ["fibrae"],
71
+ },
72
+ ssr: {
73
+ noExternal: ["fibrae"],
74
+ },
75
+ server: {
76
+ watch: {
77
+ // Watch linked fibrae in node_modules so file changes trigger HMR
78
+ ignored: ["!**/node_modules/fibrae/**"],
79
+ },
80
+ },
81
+ };
82
+ },
66
83
  configResolved(resolved) {
67
84
  _resolvedConfig = resolved;
68
85
  },
86
+ // Resolve the client entry path so we can match it in transform
87
+ async resolveId(source) {
88
+ if (source === config.client) {
89
+ const resolved = await this.resolve(source);
90
+ if (resolved)
91
+ clientEntryId = resolved.id;
92
+ }
93
+ return null;
94
+ },
95
+ // Inject HMR accept into the client entry so Vite re-executes it on changes.
96
+ // render() detects the previous render via WeakMap and does a clean re-render
97
+ // with preserved atom state.
98
+ transform(code, id) {
99
+ if (_resolvedConfig.command !== "serve")
100
+ return null;
101
+ if (!clientEntryId || id !== clientEntryId)
102
+ return null;
103
+ return {
104
+ code: code + "\n\nif (import.meta.hot) { import.meta.hot.accept(); }\n",
105
+ map: null,
106
+ };
107
+ },
69
108
  configureServer(server) {
70
109
  server.middlewares.use(async (req, res, next) => {
71
110
  const url = req.url;
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../../src/cli/vite-plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../../src/cli/vite-plugin.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import * as Context from "effect/Context";
2
2
  import * as Effect from "effect/Effect";
3
- import { type ComponentError, type VElement } from "./shared.js";
3
+ import { type ComponentError, type VChild, type VElement } from "./shared.js";
4
4
  declare const ErrorBoundaryChannel_base: Context.TagClass<ErrorBoundaryChannel, "ErrorBoundaryChannel", {
5
5
  /** Report an error to this boundary. Used by event handlers and stream subscriptions. */
6
6
  readonly reportError: (error: unknown) => Effect.Effect<void, never, never>;
@@ -33,7 +33,7 @@ export declare class ErrorBoundaryChannel extends ErrorBoundaryChannel_base {
33
33
  export declare const Suspense: (props: {
34
34
  fallback: VElement;
35
35
  threshold?: number | undefined;
36
- children?: VElement[] | VElement | undefined;
36
+ children?: VChild[] | VChild;
37
37
  }) => VElement;
38
38
  /**
39
39
  * Error boundary component — catches errors in its subtree and shows a fallback.
@@ -67,6 +67,6 @@ export declare const Suspense: (props: {
67
67
  */
68
68
  export declare const ErrorBoundary: (props: {
69
69
  fallback: (error: ComponentError) => VElement;
70
- children?: VElement[] | VElement | undefined;
70
+ children?: VChild[] | VChild;
71
71
  }) => VElement;
72
72
  export {};
@@ -40,6 +40,8 @@ export const Suspense = (props) => {
40
40
  throw new Error("Suspense requires at least one child");
41
41
  }
42
42
  // Return a special marker element that renderVElementToDOM will handle
43
+ // Cast: VChild[] → VElement[] at the type-erasure boundary;
44
+ // the fiber renderer resolves Effects/Streams during reconciliation.
43
45
  return {
44
46
  type: "SUSPENSE",
45
47
  props: {
@@ -57,7 +59,7 @@ let boundaryIdCounter = 0;
57
59
  /**
58
60
  * Normalize children to an array of VElements.
59
61
  */
60
- const normalizeChildren = (children) => Array.isArray(children) ? children : [children];
62
+ const normalizeChildren = (children) => (Array.isArray(children) ? children : [children]);
61
63
  /**
62
64
  * Error boundary component — catches errors in its subtree and shows a fallback.
63
65
  *
@@ -1 +1 @@
1
- {"version":3,"file":"components.js","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EAAsC,MAAM,aAAa,CAAC;AAEjE,gFAAgF;AAChF,yBAAyB;AACzB,gFAAgF;AAEhF;;;;;;;;GAQG;AACH,MAAM,OAAO,oBAAqB,SAAQ,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAQ1E;CAAG;AAEN,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAEhF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAIxB,EAAY,EAAE;IACb,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;QACjD,CAAC,CAAC,KAAK,CAAC,QAAQ;QAChB,CAAC,CAAC,KAAK,CAAC,QAAQ;YACd,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;YAClB,CAAC,CAAC,EAAE,CAAC;IAET,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,uEAAuE;IACvE,OAAO;QACL,IAAI,EAAE,UAAmB;QACzB,KAAK,EAAE;YACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,GAAG;YACjC,QAAQ,EAAE,aAAa;SACxB;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF,6CAA6C;AAC7C,IAAI,iBAAiB,GAAG,CAAC,CAAC;AAE1B;;GAEG;AACH,MAAM,iBAAiB,GAAG,CAAC,QAA+B,EAAc,EAAE,CACxE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAG7B,EAAY,EAAE;IACb,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9E,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO;QACL,IAAI,EAAE,UAAmB;QACzB,KAAK,EAAE;YACL,QAAQ,EAAE,aAAa;YACvB,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE;YAC7C,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB;KACF,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EAAmD,MAAM,aAAa,CAAC;AAE9E,gFAAgF;AAChF,yBAAyB;AACzB,gFAAgF;AAEhF;;;;;;;;GAQG;AACH,MAAM,OAAO,oBAAqB,SAAQ,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAQ1E;CAAG;AAEN,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAEhF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAIxB,EAAY,EAAE;IACb,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;QACjD,CAAC,CAAC,KAAK,CAAC,QAAQ;QAChB,CAAC,CAAC,KAAK,CAAC,QAAQ;YACd,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;YAClB,CAAC,CAAC,EAAE,CAAC;IAET,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,uEAAuE;IACvE,4DAA4D;IAC5D,qEAAqE;IACrE,OAAO;QACL,IAAI,EAAE,UAAmB;QACzB,KAAK,EAAE;YACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,GAAG;YACjC,QAAQ,EAAE,aAA2B;SACtC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF,6CAA6C;AAC7C,IAAI,iBAAiB,GAAG,CAAC,CAAC;AAE1B;;GAEG;AACH,MAAM,iBAAiB,GAAG,CAAC,QAA2B,EAAc,EAAE,CACpE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAe,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAG7B,EAAY,EAAE;IACb,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9E,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO;QACL,IAAI,EAAE,UAAmB;QACzB,KAAK,EAAE;YACL,QAAQ,EAAE,aAAa;YACvB,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE;YAC7C,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB;KACF,CAAC;AACJ,CAAC,CAAC"}
package/dist/core.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import * as Effect from "effect/Effect";
2
+ import * as Fiber from "effect/Fiber";
2
3
  import * as Layer from "effect/Layer";
3
4
  import * as Option from "effect/Option";
4
5
  import * as Ref from "effect/Ref";
@@ -8,6 +9,11 @@ import {} from "./shared.js";
8
9
  import { FibraeRuntime, CustomAtomRegistryLayer } from "./runtime.js";
9
10
  import { renderFiber, hydrateFiber } from "./fiber-render.js";
10
11
  import { HydrationState, HydrationStateLive } from "./hydration-state.js";
12
+ const DEV = typeof import.meta !== "undefined" && !!import.meta.hot;
13
+ /** Track running renders per container for HMR re-render support. */
14
+ const containerStates = DEV
15
+ ? new WeakMap()
16
+ : undefined;
11
17
  // =============================================================================
12
18
  // Internal render logic (requires all services)
13
19
  // =============================================================================
@@ -36,25 +42,46 @@ const renderCore = (element, container) => Effect.gen(function* () {
36
42
  });
37
43
  export function render(element, container, options) {
38
44
  const program = (cont) => Effect.gen(function* () {
45
+ // HMR: if a previous render is running on this container, interrupt it
46
+ // and reuse its AtomRegistry so atom state is preserved across hot updates
47
+ const previousState = containerStates?.get(cont);
48
+ if (previousState) {
49
+ yield* Fiber.interrupt(previousState.fiber);
50
+ cont.innerHTML = "";
51
+ }
39
52
  // Auto-detect services from the current context
40
53
  const existingRegistry = yield* Effect.serviceOption(AtomRegistry.AtomRegistry);
41
54
  const existingHydration = yield* Effect.serviceOption(HydrationState);
42
- // Use existing AtomRegistry if provided, otherwise create a fresh one
43
- const registryLayer = Option.match(existingRegistry, {
44
- onNone: () => CustomAtomRegistryLayer,
45
- onSome: (reg) => Layer.succeed(AtomRegistry.AtomRegistry, reg),
46
- });
47
- // Use existing HydrationState if provided, otherwise auto-discover from DOM
48
- const hydrationLayer = Option.match(existingHydration, {
49
- onNone: () => HydrationStateLive,
50
- onSome: (state) => Layer.succeed(HydrationState, state),
51
- });
55
+ // Reuse AtomRegistry from previous render (HMR), or use provided, or create fresh
56
+ const registryLayer = previousState
57
+ ? Layer.succeed(AtomRegistry.AtomRegistry, previousState.registry)
58
+ : Option.match(existingRegistry, {
59
+ onNone: () => CustomAtomRegistryLayer,
60
+ onSome: (reg) => Layer.succeed(AtomRegistry.AtomRegistry, reg),
61
+ });
62
+ // Skip hydration state on HMR re-render (atoms already loaded)
63
+ const hydrationLayer = previousState
64
+ ? Layer.succeed(HydrationState, [])
65
+ : Option.match(existingHydration, {
66
+ onNone: () => HydrationStateLive,
67
+ onSome: (state) => Layer.succeed(HydrationState, state),
68
+ });
52
69
  // Always create a fresh FibraeRuntime (each render tree has its own fiber state),
53
70
  // wired to the chosen AtomRegistry
54
71
  const runtimeLayer = Layer.provide(FibraeRuntime.Default, registryLayer);
55
72
  // Compose: user layer (if any) feeds from registryLayer, all merge together
56
73
  const baseLayer = Layer.mergeAll(runtimeLayer, registryLayer, hydrationLayer);
57
74
  const fullLayer = options?.layer ? Layer.provideMerge(options.layer, baseLayer) : baseLayer;
75
+ if (containerStates) {
76
+ // Dev: fork render and capture fiber handle for HMR re-render
77
+ const renderWithCapture = Effect.gen(function* () {
78
+ const registry = yield* AtomRegistry.AtomRegistry;
79
+ const fiber = yield* Effect.fork(renderCore(element, cont));
80
+ containerStates.set(cont, { fiber, registry });
81
+ return yield* Fiber.join(fiber);
82
+ }).pipe(Effect.provide(fullLayer));
83
+ return yield* renderWithCapture;
84
+ }
58
85
  return yield* renderCore(element, cont).pipe(Effect.provide(fullLayer));
59
86
  });
60
87
  if (container === undefined) {
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
package/dist/dom.d.ts CHANGED
@@ -8,9 +8,28 @@ export declare const propertyUpdateMap: Record<string, "attribute" | "property"
8
8
  export declare const isEvent: (key: string) => boolean;
9
9
  export declare const isProperty: (key: string) => boolean;
10
10
  /**
11
- * Set a DOM property using the appropriate method
11
+ * Deduplicate event props that map to the same DOM event type.
12
+ *
13
+ * Both `onclick` and `onClick` lower-case to event type `click`. If both
14
+ * are present, the camelCase variant wins (more idiomatic in JSX).
15
+ * Returns an array of [propName, handler] pairs with at most one entry per
16
+ * event type.
17
+ */
18
+ export declare const normalizeEventProps: (props: Record<string, unknown>) => [string, unknown][];
19
+ /**
20
+ * SVG namespace URI for createElementNS
21
+ */
22
+ export declare const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
23
+ /**
24
+ * Tags that must be created with SVG namespace.
25
+ * Derived from SVGElementTagNameMap minus tags that overlap with HTMLElementTagNameMap.
26
+ */
27
+ export declare const SVG_TAGS: Set<string>;
28
+ /**
29
+ * Set a DOM property using the appropriate method.
30
+ * Works for both HTML and SVG elements.
12
31
  */
13
- export declare const setDomProperty: (el: HTMLElement, name: string, value: unknown) => void;
32
+ export declare const setDomProperty: (el: HTMLElement | SVGElement, name: string, value: unknown) => void;
14
33
  /**
15
34
  * Create a DOM event wrapper that handles Effect return values.
16
35
  *
@@ -25,4 +44,4 @@ export declare const createEventWrapper: (handler: (event: Event) => unknown, ev
25
44
  * Uses createEventWrapper for Effect error handling and stores wrappers
26
45
  * in listenerStore so updateDom can remove them on re-render.
27
46
  */
28
- export declare const attachEventListeners: (el: HTMLElement, props: Record<string, unknown>, runtime: FibraeRuntime, onError?: ((error: EventHandlerError) => Effect.Effect<unknown, never, unknown>) | undefined, listenerStore?: WeakMap<HTMLElement, Record<string, EventListener>> | undefined) => void;
47
+ export declare const attachEventListeners: (el: HTMLElement | SVGElement, props: Record<string, unknown>, runtime: FibraeRuntime, onError?: ((error: EventHandlerError) => Effect.Effect<unknown, never, unknown>) | undefined, listenerStore?: WeakMap<HTMLElement | SVGElement, Record<string, EventListener>> | undefined) => void;