sinho 0.1.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.
Files changed (117) hide show
  1. package/.github/workflows/ci.yml +24 -0
  2. package/.github/workflows/deploy-docs.yml +47 -0
  3. package/.prettierrc +3 -0
  4. package/LICENSE.md +21 -0
  5. package/README.md +33 -0
  6. package/ci/check-size.js +8 -0
  7. package/dist/array_mutation.d.ts +16 -0
  8. package/dist/array_mutation.js +75 -0
  9. package/dist/array_mutation.js.map +1 -0
  10. package/dist/bundle.d.ts +1126 -0
  11. package/dist/bundle.js +1074 -0
  12. package/dist/bundle.min.js +1 -0
  13. package/dist/component.d.ts +253 -0
  14. package/dist/component.js +256 -0
  15. package/dist/component.js.map +1 -0
  16. package/dist/context.d.ts +21 -0
  17. package/dist/context.js +34 -0
  18. package/dist/context.js.map +1 -0
  19. package/dist/create_element.d.ts +43 -0
  20. package/dist/create_element.js +43 -0
  21. package/dist/create_element.js.map +1 -0
  22. package/dist/dom.d.ts +602 -0
  23. package/dist/dom.js +97 -0
  24. package/dist/dom.js.map +1 -0
  25. package/dist/intrinsic/ClassComponent.d.ts +2 -0
  26. package/dist/intrinsic/ClassComponent.js +10 -0
  27. package/dist/intrinsic/ClassComponent.js.map +1 -0
  28. package/dist/intrinsic/Dynamic.d.ts +33 -0
  29. package/dist/intrinsic/Dynamic.js +53 -0
  30. package/dist/intrinsic/Dynamic.js.map +1 -0
  31. package/dist/intrinsic/ErrorBoundary.d.ts +14 -0
  32. package/dist/intrinsic/ErrorBoundary.js +36 -0
  33. package/dist/intrinsic/ErrorBoundary.js.map +1 -0
  34. package/dist/intrinsic/For.d.ts +10 -0
  35. package/dist/intrinsic/For.js +81 -0
  36. package/dist/intrinsic/For.js.map +1 -0
  37. package/dist/intrinsic/Fragment.d.ts +23 -0
  38. package/dist/intrinsic/Fragment.js +28 -0
  39. package/dist/intrinsic/Fragment.js.map +1 -0
  40. package/dist/intrinsic/If.d.ts +24 -0
  41. package/dist/intrinsic/If.js +47 -0
  42. package/dist/intrinsic/If.js.map +1 -0
  43. package/dist/intrinsic/Portal.d.ts +6 -0
  44. package/dist/intrinsic/Portal.js +15 -0
  45. package/dist/intrinsic/Portal.js.map +1 -0
  46. package/dist/intrinsic/Style.d.ts +7 -0
  47. package/dist/intrinsic/Style.js +70 -0
  48. package/dist/intrinsic/Style.js.map +1 -0
  49. package/dist/intrinsic/TagComponent.d.ts +4 -0
  50. package/dist/intrinsic/TagComponent.js +67 -0
  51. package/dist/intrinsic/TagComponent.js.map +1 -0
  52. package/dist/intrinsic/Text.d.ts +6 -0
  53. package/dist/intrinsic/Text.js +16 -0
  54. package/dist/intrinsic/Text.js.map +1 -0
  55. package/dist/intrinsic/mod.d.ts +5 -0
  56. package/dist/intrinsic/mod.js +6 -0
  57. package/dist/intrinsic/mod.js.map +1 -0
  58. package/dist/jsx-runtime/mod.d.ts +23 -0
  59. package/dist/jsx-runtime/mod.js +11 -0
  60. package/dist/jsx-runtime/mod.js.map +1 -0
  61. package/dist/mod.d.ts +8 -0
  62. package/dist/mod.js +7 -0
  63. package/dist/mod.js.map +1 -0
  64. package/dist/renderer.d.ts +13 -0
  65. package/dist/renderer.js +25 -0
  66. package/dist/renderer.js.map +1 -0
  67. package/dist/scope.d.ts +138 -0
  68. package/dist/scope.js +228 -0
  69. package/dist/scope.js.map +1 -0
  70. package/dist/template.d.ts +10 -0
  71. package/dist/template.js +7 -0
  72. package/dist/template.js.map +1 -0
  73. package/dist/utils.d.ts +6 -0
  74. package/dist/utils.js +13 -0
  75. package/dist/utils.js.map +1 -0
  76. package/package.json +71 -0
  77. package/src/array_mutation.ts +118 -0
  78. package/src/component.ts +624 -0
  79. package/src/context.ts +70 -0
  80. package/src/create_element.ts +89 -0
  81. package/src/dom.ts +819 -0
  82. package/src/intrinsic/ClassComponent.ts +17 -0
  83. package/src/intrinsic/For.ts +122 -0
  84. package/src/intrinsic/Fragment.ts +38 -0
  85. package/src/intrinsic/If.ts +73 -0
  86. package/src/intrinsic/Portal.ts +25 -0
  87. package/src/intrinsic/Style.ts +120 -0
  88. package/src/intrinsic/TagComponent.ts +102 -0
  89. package/src/intrinsic/Text.ts +24 -0
  90. package/src/intrinsic/mod.ts +5 -0
  91. package/src/jsx-runtime/mod.ts +41 -0
  92. package/src/mod.ts +37 -0
  93. package/src/renderer.ts +45 -0
  94. package/src/scope.ts +404 -0
  95. package/src/template.ts +16 -0
  96. package/src/utils.ts +29 -0
  97. package/terser.config.json +16 -0
  98. package/tsconfig.json +18 -0
  99. package/web/README.md +41 -0
  100. package/web/babel.config.js +3 -0
  101. package/web/dist/shingo.min.d.ts +1131 -0
  102. package/web/dist/shingo.min.js +1 -0
  103. package/web/docusaurus.config.ts +151 -0
  104. package/web/package-lock.json +14850 -0
  105. package/web/package.json +54 -0
  106. package/web/sidebars.ts +31 -0
  107. package/web/src/components/monacoEditor.tsx +72 -0
  108. package/web/src/components/playground.tsx +89 -0
  109. package/web/src/components/playgroundComponent.tsx +168 -0
  110. package/web/src/css/custom.css +37 -0
  111. package/web/src/pages/index.module.css +31 -0
  112. package/web/src/pages/index.tsx +73 -0
  113. package/web/src/pages/playground.tsx +64 -0
  114. package/web/static/.nojekyll +0 -0
  115. package/web/static/dist/bundle.d.ts +1126 -0
  116. package/web/static/dist/bundle.min.js +1 -0
  117. package/web/tsconfig.json +8 -0
package/dist/dom.js ADDED
@@ -0,0 +1,97 @@
1
+ /*
2
+ * The following functions are lifted from Preact <https://preactjs.com/> and
3
+ * modified.
4
+ *
5
+ * The MIT License (MIT)
6
+ *
7
+ * Copyright (c) 2015-present Jason Miller
8
+ *
9
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ * of this software and associated documentation files (the "Software"), to deal
11
+ * in the Software without restriction, including without limitation the rights
12
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ * copies of the Software, and to permit persons to whom the Software is
14
+ * furnished to do so, subject to the following conditions:
15
+ *
16
+ * The above copyright notice and this permission notice shall be included in all
17
+ * copies or substantial portions of the Software.
18
+ *
19
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ * SOFTWARE.
26
+ */
27
+ const IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;
28
+ export const setStyle = (node, key, value) => {
29
+ if (key[0] == "-") {
30
+ node.style.setProperty(key, `${value}`);
31
+ }
32
+ else {
33
+ node.style[key] =
34
+ value == null
35
+ ? ""
36
+ : typeof value != "number" || IS_NON_DIMENSIONAL.test(key)
37
+ ? `${value}`
38
+ : `${value}px`;
39
+ }
40
+ };
41
+ export const setAttr = (node, name, value, heuristic) => {
42
+ const removeAttribute = value == null || (value === false && !name.includes("-"));
43
+ if (name.startsWith("prop:")) {
44
+ node[name] = value;
45
+ }
46
+ else if (name.startsWith("attr:")) {
47
+ if (!removeAttribute) {
48
+ node.setAttribute(name, value);
49
+ }
50
+ else {
51
+ node.removeAttribute(name);
52
+ }
53
+ }
54
+ else if (!["innerHTML", "outerHTML"].includes(name)) {
55
+ if (![
56
+ // Default value in browsers is `-1` and an empty string is
57
+ // cast to `0` instead
58
+ "tabIndex",
59
+ "role",
60
+ ...(heuristic
61
+ ? [
62
+ "width",
63
+ "height",
64
+ "href",
65
+ "list",
66
+ "form",
67
+ "download",
68
+ "rowSpan",
69
+ "colSpan",
70
+ ]
71
+ : []),
72
+ ].includes(name) &&
73
+ name in node) {
74
+ try {
75
+ node[name] = value == null ? "" : value;
76
+ return;
77
+ }
78
+ catch (e) { }
79
+ }
80
+ // aria- and data- attributes have no boolean representation.
81
+ // A `false` value is different from the attribute not being
82
+ // present, so we can't remove it. For non-boolean aria
83
+ // attributes we could treat false as a removal, but the
84
+ // amount of exceptions would cost too many bytes. On top of
85
+ // that other frameworks generally stringify `false`.
86
+ if (typeof value == "function") {
87
+ // never serialize functions as attribute values
88
+ }
89
+ else if (!removeAttribute) {
90
+ node.setAttribute(name, value);
91
+ }
92
+ else {
93
+ node.removeAttribute(name);
94
+ }
95
+ }
96
+ };
97
+ //# sourceMappingURL=dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AASH,MAAM,kBAAkB,GACtB,mEAAmE,CAAC;AAEtE,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,IAA2B,EAC3B,GAAQ,EACR,KAAyC,EACnC,EAAE;IACR,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YACb,KAAK,IAAI,IAAI;gBACX,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,OAAO,KAAK,IAAI,QAAQ,IAAI,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC;oBACxD,CAAC,CAAC,GAAG,KAAK,EAAE;oBACZ,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC;IACvB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,IAAS,EACT,IAAY,EACZ,KAAc,EACd,SAAmB,EACb,EAAE;IACR,MAAM,eAAe,GACnB,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAE5D,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACrB,CAAC;SAAM,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,IACE,CAAC;YACC,2DAA2D;YAC3D,sBAAsB;YACtB,UAAU;YACV,MAAM;YACN,GAAG,CAAC,SAAS;gBACX,CAAC,CAAC;oBACE,OAAO;oBACP,QAAQ;oBACR,MAAM;oBACN,MAAM;oBACN,MAAM;oBACN,UAAU;oBACV,SAAS;oBACT,SAAS;iBACV;gBACH,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,QAAQ,CAAC,IAAI,CAAC;YAChB,IAAI,IAAI,IAAI,EACZ,CAAC;YACD,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;gBACxC,OAAO;YACT,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;QAChB,CAAC;QAED,6DAA6D;QAC7D,4DAA4D;QAC5D,uDAAuD;QACvD,wDAAwD;QACxD,4DAA4D;QAC5D,qDAAqD;QAErD,IAAI,OAAO,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,gDAAgD;QAClD,CAAC;aAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5B,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { DomProps } from "../dom.js";
2
+ export declare const ClassComponent: <T extends HTMLElement>(type: new () => T, props: DomProps<T> & Record<string, unknown>) => import("../template.js").Template;
@@ -0,0 +1,10 @@
1
+ import { useRenderer } from "../renderer.js";
2
+ import { createTemplate } from "../template.js";
3
+ import { hydrateElement } from "./TagComponent.js";
4
+ export const ClassComponent = (type, props) => createTemplate(() => {
5
+ const node = useRenderer()._node(() => new type());
6
+ customElements.upgrade(node);
7
+ hydrateElement(node, false, props);
8
+ return [node];
9
+ });
10
+ //# sourceMappingURL=ClassComponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClassComponent.js","sourceRoot":"","sources":["../../src/intrinsic/ClassComponent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,IAAiB,EACjB,KAA4C,EAC5C,EAAE,CACF,cAAc,CAAC,GAAG,EAAE;IAClB,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACnD,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAEnC,OAAO,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { FunctionalComponent } from "../component.js";
2
+ import { MaybeSignal } from "../scope.js";
3
+ import { Template } from "../template.js";
4
+ /**
5
+ * `Dynamic` is a component that can be used to render conditionally.
6
+ *
7
+ * On every change, it will replace all previously rendered nodes with new ones.
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * const App = () => (
12
+ * const [count, setCount] = useSignal(100);
13
+ *
14
+ * <Dynamic
15
+ * render={() =>
16
+ * count() === 1 ? (
17
+ * <>
18
+ * <h3>Details</h3>
19
+ * { … }
20
+ * </>
21
+ * ) : count() > 1 ? (
22
+ * <p>Multiple items selected</p>
23
+ * ) : (
24
+ * <p>No items</p>
25
+ * )
26
+ * }
27
+ * />
28
+ * );
29
+ * ```
30
+ */
31
+ export declare const Dynamic: FunctionalComponent<{
32
+ render?: MaybeSignal<Template | undefined | void | null>;
33
+ }>;
@@ -0,0 +1,53 @@
1
+ import { MaybeSignal, useEffect, useMemo, useSubscope } from "../scope.js";
2
+ import { useRenderer } from "../renderer.js";
3
+ import { createTemplate } from "../template.js";
4
+ /**
5
+ * `Dynamic` is a component that can be used to render conditionally.
6
+ *
7
+ * On every change, it will replace all previously rendered nodes with new ones.
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * const App = () => (
12
+ * const [count, setCount] = useSignal(100);
13
+ *
14
+ * <Dynamic
15
+ * render={() =>
16
+ * count() === 1 ? (
17
+ * <>
18
+ * <h3>Details</h3>
19
+ * { … }
20
+ * </>
21
+ * ) : count() > 1 ? (
22
+ * <p>Multiple items selected</p>
23
+ * ) : (
24
+ * <p>No items</p>
25
+ * )
26
+ * }
27
+ * />
28
+ * );
29
+ * ```
30
+ */
31
+ export const Dynamic = (props) => createTemplate(() => {
32
+ const renderer = useRenderer();
33
+ const anchor = renderer._node(() => document.createComment(""));
34
+ const nodes = [anchor];
35
+ const template = useMemo(() => MaybeSignal.get(props.render));
36
+ useEffect(() => {
37
+ const [subnodes, destroy] = useSubscope(() => {
38
+ const subnodes = template()?.build() ?? [];
39
+ anchor.after(...subnodes);
40
+ nodes.push(...subnodes);
41
+ return subnodes;
42
+ });
43
+ return () => {
44
+ destroy();
45
+ for (const node of subnodes ?? []) {
46
+ node.parentNode?.removeChild(node);
47
+ }
48
+ nodes.length = 1;
49
+ };
50
+ }, [template]);
51
+ return nodes;
52
+ });
53
+ //# sourceMappingURL=Dynamic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dynamic.js","sourceRoot":"","sources":["../../src/intrinsic/Dynamic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAY,MAAM,gBAAgB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,MAAM,OAAO,GAEf,CAAC,KAAK,EAAE,EAAE,CACb,cAAc,CAAC,GAAG,EAAE;IAClB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAW,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE;YAC3C,MAAM,QAAQ,GAAG,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;YACxB,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,OAAO,EAAE,CAAC;YAEV,KAAK,MAAM,IAAI,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;gBAClC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;YAED,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC;AACf,CAAC,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { FunctionalComponent } from "../component.js";
2
+ import { Children } from "./Fragment.js";
3
+ /**
4
+ * `ErrorBoundary` is a component that can be used to catch errors in the
5
+ * component tree.
6
+ */
7
+ export declare const ErrorBoundary: FunctionalComponent<{
8
+ fallback?: FunctionalComponent<{
9
+ error: unknown;
10
+ reset: () => void;
11
+ }>;
12
+ children?: Children;
13
+ }>;
14
+ export declare const useErrorBoundary: () => readonly [show: (err: unknown) => void, reset: () => void];
@@ -0,0 +1,36 @@
1
+ import { useScope, useSignal } from "../scope.js";
2
+ import { createTemplate } from "../template.js";
3
+ import { Fragment } from "./Fragment.js";
4
+ import { createContext, provideContext, useContext } from "../context.js";
5
+ import { If } from "./If.js";
6
+ const ErrorContext = createContext([
7
+ (err) => {
8
+ throw err;
9
+ },
10
+ () => { },
11
+ ]);
12
+ /**
13
+ * `ErrorBoundary` is a component that can be used to catch errors in the
14
+ * component tree.
15
+ */
16
+ export const ErrorBoundary = ({ fallback, children }) => {
17
+ let error;
18
+ const [showError, setShowError] = useSignal(false);
19
+ const show = (err) => {
20
+ error = err;
21
+ setShowError(true);
22
+ };
23
+ const reset = () => setShowError(false);
24
+ return If({
25
+ condition: showError,
26
+ then: createTemplate(() => fallback?.({ error, reset }) ?? []),
27
+ else: createTemplate(() => {
28
+ provideContext(ErrorContext, () => [show, reset]);
29
+ const s = useScope();
30
+ s._onError = show;
31
+ return Fragment({ children });
32
+ }),
33
+ });
34
+ };
35
+ export const useErrorBoundary = () => useContext(ErrorContext)();
36
+ //# sourceMappingURL=ErrorBoundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../src/intrinsic/ErrorBoundary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAY,QAAQ,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B,MAAM,YAAY,GAAG,aAAa,CAAC;IACjC,CAAC,GAAY,EAAQ,EAAE;QACrB,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,GAAS,EAAE,GAAE,CAAC;CACN,CAAC,CAAC;AAEZ;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAMrB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC9B,IAAI,KAAc,CAAC;IACnB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAEnD,MAAM,IAAI,GAAG,CAAC,GAAY,EAAE,EAAE;QAC5B,KAAK,GAAG,GAAG,CAAC;QACZ,YAAY,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAExC,OAAO,EAAE,CAAC;QACR,SAAS,EAAE,SAAS;QACpB,IAAI,EAAE,cAAc,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;QAC9D,IAAI,EAAE,cAAc,CAAC,GAAG,EAAE;YACxB,cAAc,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAU,CAAC,CAAC;YAC3D,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;YACrB,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;YAElB,OAAO,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChC,CAAC,CAAC;KACH,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAG9B,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { MaybeSignal, Signal, SignalLike } from "../scope.js";
2
+ import { Template } from "../template.js";
3
+ /**
4
+ * `For` is a component that can be used to render a list of items.
5
+ */
6
+ export declare const For: <T>(props: {
7
+ each?: MaybeSignal<readonly T[]> | undefined;
8
+ key?: ((item: T, index: number) => string | number) | undefined;
9
+ children?: ((item: Signal<T>, index: Signal<number>, arr: SignalLike<readonly T[]>) => Template) | undefined;
10
+ }) => Template;
@@ -0,0 +1,81 @@
1
+ import { useArrayMutation } from "../array_mutation.js";
2
+ import { MaybeSignal, useEffect, useSignal, useSubscope, } from "../scope.js";
3
+ import { useRenderer } from "../renderer.js";
4
+ import { createTemplate } from "../template.js";
5
+ /**
6
+ * `For` is a component that can be used to render a list of items.
7
+ */
8
+ export const For = (props) => createTemplate(() => {
9
+ const renderer = useRenderer();
10
+ const items = MaybeSignal.upgrade(props.each ?? []);
11
+ const anchor = renderer._node(() => document.createComment(""));
12
+ const keyFn = props.key ?? ((_, i) => i);
13
+ const nodes = [anchor];
14
+ const keyMap = new Map();
15
+ const mutationResult = useArrayMutation(items, keyFn);
16
+ const lookForAnchor = (index) => {
17
+ for (let i = index - 1; i >= 0; i--) {
18
+ const key = keyFn(items()[index - 1], index - 1);
19
+ const nodes = keyMap.get(key)?._subnodes ?? [];
20
+ if (nodes.length > 0) {
21
+ return nodes[nodes.length - 1];
22
+ }
23
+ }
24
+ return anchor;
25
+ };
26
+ useEffect(() => {
27
+ for (const mutation of mutationResult()._mutations) {
28
+ if (mutation._type == "r") {
29
+ const { _subnodes = [], _destroy } = keyMap.get(mutation._key) ?? {};
30
+ _destroy?.();
31
+ const index = nodes.indexOf(_subnodes[0]);
32
+ if (index > 0) {
33
+ nodes.splice(index, _subnodes.length);
34
+ }
35
+ _subnodes.forEach((node) => node.parentNode?.removeChild(node));
36
+ keyMap.delete(mutation._key);
37
+ }
38
+ else if (mutation._type == "a") {
39
+ let _subnodes = [];
40
+ const [, destroy] = useSubscope(() => {
41
+ const [index, setIndex] = useSignal(mutation._index);
42
+ const [item, setItem] = useSignal(items()[mutation._index]);
43
+ useEffect(() => {
44
+ if (0 <= index() && index() < items().length) {
45
+ setItem(() => items()[index()]);
46
+ }
47
+ });
48
+ useEffect(() => {
49
+ const index = mutationResult()._map.get(mutation._key);
50
+ if (index != null) {
51
+ setIndex(index);
52
+ }
53
+ });
54
+ _subnodes = props.children?.(item, index, items).build() ?? [];
55
+ const itemAnchor = lookForAnchor(mutation._index);
56
+ const anchorIndex = nodes.indexOf(itemAnchor);
57
+ if (anchorIndex >= 0) {
58
+ nodes.splice(anchorIndex + 1, 0, ..._subnodes);
59
+ }
60
+ _subnodes.forEach((node) => itemAnchor.parentNode?.insertBefore(node, itemAnchor.nextSibling));
61
+ });
62
+ keyMap.set(mutation._key, { _subnodes, _destroy: destroy });
63
+ }
64
+ else if (mutation._type == "m") {
65
+ const { _subnodes = [] } = keyMap.get(mutation._key) ?? {};
66
+ const index = nodes.indexOf(_subnodes[0]);
67
+ if (index >= 0) {
68
+ nodes.splice(index, _subnodes.length);
69
+ }
70
+ const itemAnchor = lookForAnchor(mutation._to);
71
+ const anchorIndex = nodes.indexOf(itemAnchor);
72
+ if (anchorIndex >= 0) {
73
+ nodes.splice(anchorIndex + 1, 0, ..._subnodes);
74
+ }
75
+ _subnodes.forEach((node) => itemAnchor.parentNode?.insertBefore(node, itemAnchor.nextSibling));
76
+ }
77
+ }
78
+ }, [mutationResult]);
79
+ return nodes;
80
+ });
81
+ //# sourceMappingURL=For.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"For.js","sourceRoot":"","sources":["../../src/intrinsic/For.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EACL,WAAW,EAGX,SAAS,EACT,SAAS,EACT,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAY,MAAM,gBAAgB,CAAC;AAO1D;;GAEG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,CAAI,KAQtB,EAAY,EAAE,CACb,cAAc,CAAC,GAAG,EAAE;IAClB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,KAAK,GAAW,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,MAAM,cAAc,GAAG,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAEtD,MAAM,aAAa,GAAG,CAAC,KAAa,EAAQ,EAAE;QAC5C,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;YAE/C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC,UAAU,EAAE,CAAC;YACnD,IAAI,QAAQ,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC;gBAC1B,MAAM,EAAE,SAAS,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACrE,QAAQ,EAAE,EAAE,CAAC;gBAEb,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1C,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;oBACd,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;gBACxC,CAAC;gBAED,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;gBAChE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;iBAAM,IAAI,QAAQ,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC;gBACjC,IAAI,SAAS,GAAW,EAAE,CAAC;gBAE3B,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE;oBACnC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBACrD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;oBAE5D,SAAS,CAAC,GAAG,EAAE;wBACb,IAAI,CAAC,IAAI,KAAK,EAAE,IAAI,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;4BAC7C,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;wBAClC,CAAC;oBACH,CAAC,CAAC,CAAC;oBAEH,SAAS,CAAC,GAAG,EAAE;wBACb,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;wBAEvD,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;4BAClB,QAAQ,CAAC,KAAK,CAAC,CAAC;wBAClB,CAAC;oBACH,CAAC,CAAC,CAAC;oBAEH,SAAS,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;oBAE/D,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAClD,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oBAC9C,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;wBACrB,KAAK,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC;oBACjD,CAAC;oBAED,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACzB,UAAU,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,CAClE,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9D,CAAC;iBAAM,IAAI,QAAQ,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC;gBACjC,MAAM,EAAE,SAAS,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAE3D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1C,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;oBACf,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;gBACxC,CAAC;gBAED,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC9C,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;oBACrB,KAAK,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC;gBACjD,CAAC;gBAED,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACzB,UAAU,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,CAClE,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,OAAO,KAAK,CAAC;AACf,CAAC,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { FunctionalComponent } from "../component.js";
2
+ import { Template } from "../template.js";
3
+ import type { MaybeSignal } from "../scope.js";
4
+ export type Children = Template | MaybeSignal<string | number | null | undefined> | Children[];
5
+ /**
6
+ * Fragment is a component that can be used to wrap multiple children without
7
+ * introducing an extra DOM element.
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * render() {
12
+ * return (
13
+ * <>
14
+ * <h1>Hello World</h1>
15
+ * <p>This is a paragraph.</p>
16
+ * </>
17
+ * );
18
+ * }
19
+ * ```
20
+ */
21
+ export declare const Fragment: FunctionalComponent<{
22
+ children?: Children;
23
+ }>;
@@ -0,0 +1,28 @@
1
+ import { Text } from "./Text.js";
2
+ import { createTemplate } from "../template.js";
3
+ /**
4
+ * Fragment is a component that can be used to wrap multiple children without
5
+ * introducing an extra DOM element.
6
+ *
7
+ * @example
8
+ * ```tsx
9
+ * render() {
10
+ * return (
11
+ * <>
12
+ * <h1>Hello World</h1>
13
+ * <p>This is a paragraph.</p>
14
+ * </>
15
+ * );
16
+ * }
17
+ * ```
18
+ */
19
+ export const Fragment = ({ children }) => createTemplate(() => {
20
+ return !Array.isArray(children)
21
+ ? children == null
22
+ ? []
23
+ : typeof children == "object"
24
+ ? children
25
+ : Text({ text: children })
26
+ : children.flatMap((children) => Fragment({ children }).build());
27
+ });
28
+ //# sourceMappingURL=Fragment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Fragment.js","sourceRoot":"","sources":["../../src/intrinsic/Fragment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,cAAc,EAAY,MAAM,gBAAgB,CAAC;AAQ1D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,QAAQ,GAEhB,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CACpB,cAAc,CAAC,GAAG,EAAE;IAClB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC7B,CAAC,CAAC,QAAQ,IAAI,IAAI;YAChB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,OAAO,QAAQ,IAAI,QAAQ;gBAC3B,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC9B,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AACrE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { FunctionalComponent } from "../component.js";
2
+ import { MaybeSignal } from "../scope.js";
3
+ import { Children } from "./Fragment.js";
4
+ /**
5
+ * `If` is a component that can be used to render conditionally.
6
+ */
7
+ export declare const If: FunctionalComponent<{
8
+ condition?: MaybeSignal<boolean>;
9
+ children?: Children;
10
+ }>;
11
+ /**
12
+ * `ElseIf` serves as an `else if` block for {@link If}. It can also be chained
13
+ * multiple times.
14
+ */
15
+ export declare const ElseIf: FunctionalComponent<{
16
+ condition?: MaybeSignal<boolean>;
17
+ children?: Children;
18
+ }>;
19
+ /**
20
+ * `Else` indicates the `else` block for {@link If} and {@link ElseIf}.
21
+ */
22
+ export declare const Else: FunctionalComponent<{
23
+ children?: Children;
24
+ }>;
@@ -0,0 +1,47 @@
1
+ import { createTemplate } from "../template.js";
2
+ import { MaybeSignal, useEffect, useMemo, useSubscope } from "../scope.js";
3
+ import { runWithRenderer, useRenderer } from "../renderer.js";
4
+ import { Fragment } from "./Fragment.js";
5
+ /**
6
+ * `If` is a component that can be used to render conditionally.
7
+ */
8
+ export const If = (props) => {
9
+ const renderer = useRenderer();
10
+ renderer._ifConditions = [];
11
+ return ElseIf({ condition: props.condition, children: props.children });
12
+ };
13
+ /**
14
+ * `ElseIf` serves as an `else if` block for {@link If}. It can also be chained
15
+ * multiple times.
16
+ */
17
+ export const ElseIf = (props) => {
18
+ const renderer = useRenderer();
19
+ const conditions = renderer._ifConditions;
20
+ const condition = useMemo(() => conditions.every((condition) => !condition()) &&
21
+ MaybeSignal.get(props.condition));
22
+ renderer._ifConditions = [...conditions, condition];
23
+ return runWithRenderer({ _ifConditions: [] }, () => createTemplate(() => {
24
+ const anchor = renderer._node(() => document.createComment(""));
25
+ const nodes = [anchor];
26
+ const template = useMemo(() => condition() ? Fragment({ children: props.children }) : null);
27
+ let subnodes = [];
28
+ useEffect(() => {
29
+ subnodes.forEach((node) => node.parentNode?.removeChild(node));
30
+ nodes.length = 1;
31
+ const [, destroy] = useSubscope(() => {
32
+ subnodes = template()?.build() ?? [];
33
+ anchor.after(...subnodes);
34
+ nodes.push(...subnodes);
35
+ });
36
+ return destroy;
37
+ }, [template]);
38
+ return nodes;
39
+ }));
40
+ };
41
+ /**
42
+ * `Else` indicates the `else` block for {@link If} and {@link ElseIf}.
43
+ */
44
+ export const Else = ({ children, }) => {
45
+ return ElseIf({ condition: true, children });
46
+ };
47
+ //# sourceMappingURL=If.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"If.js","sourceRoot":"","sources":["../../src/intrinsic/If.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAiB,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAY,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEnD;;GAEG;AACH,MAAM,CAAC,MAAM,EAAE,GAGV,CAAC,KAAK,EAAE,EAAE;IACb,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,QAAQ,CAAC,aAAa,GAAG,EAAE,CAAC;IAE5B,OAAO,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAGd,CAAC,KAAK,EAAE,EAAE;IACb,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC;IAC1C,MAAM,SAAS,GAAG,OAAO,CACvB,GAAG,EAAE,CACH,UAAU,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;QAC7C,WAAW,CAAC,GAAG,CAAsB,KAAK,CAAC,SAAS,CAAC,CACxD,CAAC;IAEF,QAAQ,CAAC,aAAa,GAAG,CAAC,GAAG,UAAU,EAAE,SAAS,CAAC,CAAC;IAEpD,OAAO,eAAe,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CACjD,cAAc,CAAC,GAAG,EAAE;QAClB,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,MAAM,KAAK,GAAW,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAC5B,SAAS,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAC5D,CAAC;QAEF,IAAI,QAAQ,GAAW,EAAE,CAAC;QAE1B,SAAS,CAAC,GAAG,EAAE;YACb,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/D,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YAEjB,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE;gBACnC,QAAQ,GAAG,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;gBACrC,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YAEH,OAAO,OAAO,CAAC;QACjB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEf,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CACH,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAiD,CAAC,EACjE,QAAQ,GACT,EAAE,EAAE;IACH,OAAO,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC/C,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { FunctionalComponent } from "../component.js";
2
+ import { Children } from "./Fragment.js";
3
+ export declare const Portal: FunctionalComponent<{
4
+ mount: Node;
5
+ children?: Children;
6
+ }>;
@@ -0,0 +1,15 @@
1
+ import { runWithRenderer } from "../renderer.js";
2
+ import { useEffect } from "../scope.js";
3
+ import { createTemplate } from "../template.js";
4
+ import { Fragment } from "./Fragment.js";
5
+ export const Portal = ({ mount, children }) => createTemplate(() => runWithRenderer({ _nodes: undefined }, () => {
6
+ const nodes = Fragment({ children }).build();
7
+ useEffect(() => {
8
+ nodes.forEach((node) => mount.appendChild(node));
9
+ return () => {
10
+ nodes.forEach((node) => node.parentNode?.removeChild(node));
11
+ };
12
+ });
13
+ return [];
14
+ }));
15
+ //# sourceMappingURL=Portal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Portal.js","sourceRoot":"","sources":["../../src/intrinsic/Portal.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAY,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,CAAC,MAAM,MAAM,GAGd,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC3B,cAAc,CAAC,GAAG,EAAE,CAClB,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE;IAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAE7C,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QAEjD,OAAO,GAAG,EAAE;YACV,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC,CACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { FunctionalComponent } from "../component.js";
2
+ import { MaybeSignal } from "../scope.js";
3
+ export declare const Style: FunctionalComponent<{
4
+ light?: boolean;
5
+ children?: MaybeSignal<string>;
6
+ }>;
7
+ export declare const css: (strings: TemplateStringsArray, ...values: MaybeSignal<string | number>[]) => MaybeSignal<string>;
@@ -0,0 +1,70 @@
1
+ import { createElement } from "../create_element.js";
2
+ import { Text } from "./Text.js";
3
+ import { MaybeSignal, useEffect } from "../scope.js";
4
+ import { Fragment } from "./Fragment.js";
5
+ import { useRenderer } from "../renderer.js";
6
+ import { Portal } from "./Portal.js";
7
+ const styleSheetRegistrySym = Symbol("styleSheetRegistry");
8
+ const globalStyleSheetRegistry = new Map();
9
+ const getLocalStyleSheetRegistry = (obj) => (obj[styleSheetRegistrySym] ??= new Map());
10
+ const useStyleSheet = (registry, css, cleanup) => {
11
+ if (!globalStyleSheetRegistry.has(css)) {
12
+ const sheet = new CSSStyleSheet();
13
+ sheet.replaceSync(css);
14
+ globalStyleSheetRegistry.set(css, {
15
+ _sheet: sheet,
16
+ _refs: 0,
17
+ });
18
+ }
19
+ const globalEntry = globalStyleSheetRegistry.get(css);
20
+ globalEntry._refs++;
21
+ if (!registry.has(css)) {
22
+ registry.set(css, {
23
+ _sheet: globalEntry._sheet,
24
+ _refs: 0,
25
+ });
26
+ }
27
+ const entry = registry.get(css);
28
+ entry._refs++;
29
+ useEffect(() => () => {
30
+ if (!--entry._refs) {
31
+ registry.delete(css);
32
+ cleanup();
33
+ }
34
+ if (!--globalEntry._refs) {
35
+ globalStyleSheetRegistry.delete(css);
36
+ }
37
+ });
38
+ return entry._sheet;
39
+ };
40
+ export const Style = (props) => {
41
+ const css = props.children;
42
+ if (typeof css == "function") {
43
+ // Dynamic CSS will be inserted into the DOM as a <style> element.
44
+ const styleEl = createElement("style", {}, Text({
45
+ text: css,
46
+ marker: false,
47
+ }));
48
+ return props.light
49
+ ? Portal({ mount: document.head, children: styleEl })
50
+ : styleEl;
51
+ }
52
+ // Static CSS will be inserted as an adopted stylesheet and cached.
53
+ if (css) {
54
+ const renderer = useRenderer();
55
+ const styleRoot = props.light
56
+ ? document
57
+ : renderer._component?.shadowRoot ?? document;
58
+ const registry = getLocalStyleSheetRegistry(styleRoot);
59
+ const sheet = useStyleSheet(registry, css, () => {
60
+ styleRoot.adoptedStyleSheets = styleRoot.adoptedStyleSheets.filter((s) => s != sheet);
61
+ });
62
+ styleRoot.adoptedStyleSheets.push(sheet);
63
+ }
64
+ return Fragment({});
65
+ };
66
+ export const css = (strings, ...values) => {
67
+ const result = () => strings.reduce((acc, string, i) => acc + string + (MaybeSignal.get(values[i]) ?? ""), "");
68
+ return values.some((value) => typeof value == "function") ? result : result();
69
+ };
70
+ //# sourceMappingURL=Style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Style.js","sourceRoot":"","sources":["../../src/intrinsic/Style.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { DomProps } from "../dom.js";
2
+ import { Template } from "../template.js";
3
+ export declare const hydrateElement: <E extends HTMLElement | SVGElement>(node: E, svg: boolean, props: DomProps<any>, heuristic?: boolean) => E;
4
+ export declare const TagComponent: (tagName: string, props?: DomProps<any>) => Template;