create-outsystems-astro 0.5.0 → 0.7.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 (61) hide show
  1. package/README.md +50 -11
  2. package/bin/cli.js +71 -5
  3. package/package.json +1 -1
  4. package/template/.prettierignore +2 -0
  5. package/template/.prettierrc +4 -0
  6. package/template/AGENTS.md +145 -22
  7. package/template/astro.config.mjs +15 -2
  8. package/template/bun.lock +529 -716
  9. package/template/deno.json +14 -7
  10. package/template/deno.lock +1100 -688
  11. package/template/eslint.config.mjs +43 -0
  12. package/template/output.ts +14 -2
  13. package/template/package-lock.json +3404 -3080
  14. package/template/package.json +59 -85
  15. package/template/patches/{@angular+build+21.2.0.patch → @angular+build+21.2.1.patch} +1 -10
  16. package/template/patches-deno/playwright+1.58.2.patch +26 -0
  17. package/template/playwright.config.ts +1 -1
  18. package/template/pnpm-lock.yaml +2041 -1584
  19. package/template/pnpm-workspace.yaml +6 -0
  20. package/template/src/framework/angular/{Counter.component.ts → Demo.component.ts} +12 -5
  21. package/template/src/framework/angular/Store.component.ts +24 -0
  22. package/template/src/framework/preact/Demo.tsx +86 -0
  23. package/template/src/framework/preact/Store.tsx +31 -0
  24. package/template/src/framework/react/{Counter.tsx → Demo.tsx} +23 -17
  25. package/template/src/framework/react/Store.tsx +31 -0
  26. package/template/src/framework/svelte/Demo.svelte +74 -0
  27. package/template/src/framework/svelte/Store.svelte +22 -0
  28. package/template/src/framework/vue/{Counter.vue → Demo.vue} +7 -9
  29. package/template/src/framework/vue/Store.vue +28 -0
  30. package/template/src/images/angular.png +0 -0
  31. package/template/src/images/preact.png +0 -0
  32. package/template/src/images/react.png +0 -0
  33. package/template/src/images/svelte.png +0 -0
  34. package/template/src/images/vue.png +0 -0
  35. package/template/src/pages/angular/angular-demo.astro +42 -0
  36. package/template/src/pages/multi/store.astro +22 -0
  37. package/template/src/pages/preact/preact-demo.astro +66 -0
  38. package/template/src/pages/react/react-demo.astro +66 -0
  39. package/template/src/pages/svelte/svelte-demo.astro +63 -0
  40. package/template/src/pages/vue/vue-demo.astro +61 -0
  41. package/template/src/stores/framework.ts +10 -0
  42. package/template/src/styles/index.css +4 -0
  43. package/template/svelte.config.js +5 -0
  44. package/template/test/e2e/angular/angular-counter.spec.ts +7 -1
  45. package/template/test/e2e/preact/preact-counter.spec.ts +42 -0
  46. package/template/test/e2e/react/react-counter.spec.ts +2 -2
  47. package/template/test/e2e/svelte/svelte-counter.spec.ts +42 -0
  48. package/template/test/e2e/vue/vue-counter.spec.ts +2 -2
  49. package/template/test/integration/angular/{Counter.component.spec.ts → Demo.component.spec.ts} +6 -6
  50. package/template/test/integration/preact/Demo.test.tsx +84 -0
  51. package/template/test/integration/react/{Counter.test.tsx → Demo.test.tsx} +10 -9
  52. package/template/test/integration/svelte/Demo.test.ts +81 -0
  53. package/template/test/integration/svelte/Demo.wrapper.svelte +27 -0
  54. package/template/test/integration/vue/{Counter.test.ts → Demo.test.ts} +9 -9
  55. package/template/tsconfig.json +0 -1
  56. package/template/vitest.config.ts +29 -2
  57. package/template/yarn.lock +2311 -2251
  58. package/template/src/pages/angular/angular-counter.astro +0 -31
  59. package/template/src/pages/react/react-counter.astro +0 -58
  60. package/template/src/pages/vue/vue-counter.astro +0 -62
  61. /package/template/patches/{@analogjs+astro-angular+2.3.0.patch → @analogjs+astro-angular+2.3.1.patch} +0 -0
@@ -0,0 +1,6 @@
1
+ onlyBuiltDependencies:
2
+ - '@parcel/watcher'
3
+ - esbuild
4
+ - lmdb
5
+ - msgpackr-extract
6
+ - sharp
@@ -10,19 +10,18 @@ import { Operation, setCounterCount } from "../../lib/setCounterCount";
10
10
  selector: "app-counter",
11
11
  standalone: true,
12
12
  template: `
13
- <div class="counter-title" slot="header">Counter</div>
13
+ <div class="counter-title" slot="header">Angular Demo Component</div>
14
14
  <div class="card-grid">
15
15
  <div class="card">
16
- Internal counter controls. It keeps state within the component.
16
+ <strong>Angular counter component</strong>
17
17
  <div class="card-content">
18
+ Internal counter controls. It keeps state within the component.
18
19
  <div class="counter-controls">
19
20
  <button (click)="subtract()">-</button>
20
21
  <pre>{{ count() }}</pre>
21
22
  <button (click)="add()">+</button>
22
23
  </div>
23
24
  </div>
24
- </div>
25
- <div class="card">
26
25
  The button sends the current count value to a function in the parent
27
26
  component.
28
27
  <div class="card-content">
@@ -33,6 +32,14 @@ import { Operation, setCounterCount } from "../../lib/setCounterCount";
33
32
  </div>
34
33
  </div>
35
34
  </div>
35
+ <div class="card unused">
36
+ <strong>Nano Stores (not supported)</strong>
37
+ <div class="card-content"></div>
38
+ </div>
39
+ <div class="card unused">
40
+ <strong>Slot content (not supported)</strong>
41
+ <div class="card-content"></div>
42
+ </div>
36
43
  </div>
37
44
  <div class="counter-logos">
38
45
  <img [src]="outSystemsLogo" alt="OutSystems logo" />
@@ -40,7 +47,7 @@ import { Operation, setCounterCount } from "../../lib/setCounterCount";
40
47
  </div>
41
48
  `,
42
49
  })
43
- export default class CounterComponent implements OnInit {
50
+ export default class DemoComponent implements OnInit {
44
51
  astroLogo = AstroLogo;
45
52
  count = signal(0);
46
53
 
@@ -0,0 +1,24 @@
1
+ import { CommonModule } from "@angular/common";
2
+ import { Component } from "@angular/core";
3
+
4
+ import AngularLogo from "../../images/angular.png?url";
5
+
6
+ @Component({
7
+ imports: [CommonModule],
8
+ selector: "app-counter",
9
+ standalone: true,
10
+ template: `
11
+ <div class="card unused">
12
+ <strong>Angular Store</strong>
13
+ <div class="card-content">
14
+ <img [src]="angularLogo" alt="Angular logo" height="150" />
15
+ <div>
16
+ <strong>Angular 21 does not currently support Nano Stores.</strong>
17
+ </div>
18
+ </div>
19
+ </div>
20
+ `,
21
+ })
22
+ export default class StoreComponent {
23
+ angularLogo = AngularLogo;
24
+ }
@@ -0,0 +1,86 @@
1
+ /** @jsxImportSource preact */
2
+ import { useStore } from "@nanostores/preact";
3
+ import type { ComponentChildren } from "preact";
4
+ import { useState } from "preact/hooks";
5
+
6
+ import AstroLogo from "../../images/astro.png?url";
7
+ import OutSystemsLogo from "../../images/outsystems.png?url";
8
+ import { Operation, setCounterCount } from "../../lib/setCounterCount";
9
+
10
+ interface DemoProps {
11
+ children: ComponentChildren;
12
+ header: ComponentChildren;
13
+ initialCount: number;
14
+ showMessage: string;
15
+ }
16
+
17
+ export default function Demo({
18
+ children,
19
+ header,
20
+ initialCount,
21
+ showMessage,
22
+ }: DemoProps) {
23
+ const [count, setCount] = useState(initialCount);
24
+
25
+ const add = () => setCount((i) => setCounterCount(i, Operation.Add));
26
+
27
+ const subtract = () =>
28
+ setCount((i) => setCounterCount(i, Operation.Subtract));
29
+
30
+ const showParentMessage = () => {
31
+ if (typeof window !== "undefined") {
32
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
+ (window as any)[showMessage]?.(count);
34
+ }
35
+ };
36
+
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ const nanoStoreValue = useStore((window as any).Stores?.["preactStore"]);
39
+
40
+ return (
41
+ <>
42
+ {header}
43
+ <div className="card-grid">
44
+ <div className="card">
45
+ <strong>Preact counter component</strong>
46
+ <div className="card-content">
47
+ Internal counter controls. It keeps state within the component.
48
+ <div className="counter-controls">
49
+ <button onClick={subtract}>-</button>
50
+ <pre>{count}</pre>
51
+ <button onClick={add}>+</button>
52
+ </div>
53
+ </div>
54
+ The button sends the current count value to a function in the parent
55
+ component.
56
+ <div className="card-content">
57
+ <div>
58
+ <button className="card-btn" onClick={showParentMessage}>
59
+ Send value
60
+ </button>
61
+ </div>
62
+ </div>
63
+ </div>
64
+ <div className="card">
65
+ <strong>Nano Stores</strong>
66
+ <div className="card-content">
67
+ <div>
68
+ <strong>Value:</strong>
69
+ <div id="nanostore">{nanoStoreValue}</div>
70
+ </div>
71
+ </div>
72
+ </div>
73
+ <div className="card">
74
+ <strong>Slot content</strong>
75
+ <div className="card-content">
76
+ <div>{children}</div>
77
+ </div>
78
+ </div>
79
+ </div>
80
+ <div className="counter-logos">
81
+ <img alt="OutSystems logo" src={OutSystemsLogo} />
82
+ <img alt="Astro logo" src={AstroLogo} />
83
+ </div>
84
+ </>
85
+ );
86
+ }
@@ -0,0 +1,31 @@
1
+ /** @jsxImportSource react */
2
+ import { useStore } from "@nanostores/preact";
3
+
4
+ import PreactLogo from "../../images/preact.png?url";
5
+ import { framework } from "../../stores/framework";
6
+
7
+ export default function Store() {
8
+ const selectedFramework = useStore(framework);
9
+
10
+ const setFramework = () => {
11
+ framework.set("Preact");
12
+ };
13
+
14
+ return (
15
+ <div className="card">
16
+ <strong>Preact Store</strong>
17
+ <div className="card-content">
18
+ <img alt="Preact logo" height={150} src={PreactLogo} />
19
+ <div>
20
+ <strong>Value:</strong>
21
+ <div id="nanostore">{selectedFramework}</div>
22
+ </div>
23
+ <div>
24
+ <button className="card-btn" onClick={setFramework}>
25
+ Select Preact
26
+ </button>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ );
31
+ }
@@ -1,3 +1,4 @@
1
+ /** @jsxImportSource react */
1
2
  import { useStore } from "@nanostores/react";
2
3
  import { useState } from "react";
3
4
 
@@ -5,23 +6,29 @@ import AstroLogo from "../../images/astro.png?url";
5
6
  import OutSystemsLogo from "../../images/outsystems.png?url";
6
7
  import { Operation, setCounterCount } from "../../lib/setCounterCount";
7
8
 
8
- export default function Counter({
9
- children,
10
- header,
11
- initialCount,
12
- showMessage,
13
- }: {
9
+ interface DemoProps {
14
10
  children: React.ReactNode;
15
11
  header: React.ReactNode;
16
12
  initialCount: number;
17
13
  showMessage: string;
18
- }) {
14
+ }
15
+
16
+ export default function Demo({
17
+ children,
18
+ header,
19
+ initialCount,
20
+ showMessage,
21
+ }: DemoProps) {
19
22
  const [count, setCount] = useState(initialCount);
23
+
20
24
  const add = () => setCount((i) => setCounterCount(i, Operation.Add));
25
+
21
26
  const subtract = () =>
22
27
  setCount((i) => setCounterCount(i, Operation.Subtract));
28
+
23
29
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
30
  const showParentMessage = () => (window as any)[showMessage](count);
31
+
25
32
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
26
33
  const nanoStoreValue = useStore((window as any).Stores["reactStore"]);
27
34
 
@@ -30,16 +37,15 @@ export default function Counter({
30
37
  {header}
31
38
  <div className="card-grid">
32
39
  <div className="card">
33
- Internal counter controls. It keeps state within the component.
40
+ <strong>React counter component</strong>
34
41
  <div className="card-content">
42
+ Internal counter controls. It keeps state within the component.
35
43
  <div className="counter-controls">
36
44
  <button onClick={subtract}>-</button>
37
45
  <pre>{count}</pre>
38
46
  <button onClick={add}>+</button>
39
47
  </div>
40
48
  </div>
41
- </div>
42
- <div className="card">
43
49
  The button sends the current count value to a function in the parent
44
50
  component.
45
51
  <div className="card-content">
@@ -51,18 +57,18 @@ export default function Counter({
51
57
  </div>
52
58
  </div>
53
59
  <div className="card">
54
- Slot content coming in to the component
60
+ <strong>Nano Stores</strong>
55
61
  <div className="card-content">
56
- <div>{children}</div>
62
+ <div>
63
+ <strong>Value:</strong>
64
+ <div id="nanostore">{nanoStoreValue}</div>
65
+ </div>
57
66
  </div>
58
67
  </div>
59
68
  <div className="card">
60
- Nano Store content
69
+ <strong>Slot content</strong>
61
70
  <div className="card-content">
62
- <div>
63
- <strong>Nano Store value:</strong>
64
- <div id="nanostore">{nanoStoreValue}</div>
65
- </div>
71
+ <div>{children}</div>
66
72
  </div>
67
73
  </div>
68
74
  </div>
@@ -0,0 +1,31 @@
1
+ /** @jsxImportSource react */
2
+ import { useStore } from "@nanostores/react";
3
+
4
+ import ReactLogo from "../../images/react.png?url";
5
+ import { framework } from "../../stores/framework";
6
+
7
+ export default function Store() {
8
+ const selectedFramework = useStore(framework);
9
+
10
+ const setFramework = () => {
11
+ framework.set("React");
12
+ };
13
+
14
+ return (
15
+ <div className="card">
16
+ <strong>React Store</strong>
17
+ <div className="card-content">
18
+ <img alt="React logo" height={150} src={ReactLogo} />
19
+ <div>
20
+ <strong>Value:</strong>
21
+ <div id="nanostore">{selectedFramework}</div>
22
+ </div>
23
+ <div>
24
+ <button className="card-btn" onClick={setFramework}>
25
+ Select React
26
+ </button>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ );
31
+ }
@@ -0,0 +1,74 @@
1
+ <script lang="ts">
2
+ import AstroLogo from "../../images/astro.png?url";
3
+ import OutSystemsLogo from "../../images/outsystems.png?url";
4
+ import { Operation, setCounterCount } from "../../lib/setCounterCount";
5
+
6
+ export let initialCount: number;
7
+ export let showMessage: string;
8
+
9
+ let count = initialCount;
10
+
11
+ const add = () => {
12
+ count = setCounterCount(count, Operation.Add);
13
+ };
14
+
15
+ const subtract = () => {
16
+ count = setCounterCount(count, Operation.Subtract);
17
+ };
18
+
19
+ const showParentMessage = () => {
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ (window as any)[showMessage](count);
22
+ };
23
+
24
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
+ const nanoStoreValue = (window as any).Stores["svelteStore"];
26
+ </script>
27
+
28
+ <slot name="header" />
29
+
30
+ <div class="card-grid">
31
+ <div class="card">
32
+ <strong>Svelte counter component</strong>
33
+ <div class="card-content">
34
+ Internal counter controls. It keeps state within the component.
35
+ <div class="counter-controls">
36
+ <button on:click={subtract}>-</button>
37
+ <pre>{count}</pre>
38
+ <button on:click={add}>+</button>
39
+ </div>
40
+ </div>
41
+ The button sends the current count value to a function in the parent component.
42
+ <div class="card-content">
43
+ <div>
44
+ <button class="card-btn" on:click={showParentMessage}>
45
+ Send value
46
+ </button>
47
+ </div>
48
+ </div>
49
+ </div>
50
+
51
+ <div class="card">
52
+ <strong>Nano Stores</strong>
53
+ <div class="card-content">
54
+ <div>
55
+ <strong>Value:</strong>
56
+ <div id="nanostore">{$nanoStoreValue}</div>
57
+ </div>
58
+ </div>
59
+ </div>
60
+
61
+ <div class="card">
62
+ <strong>Slot content</strong>
63
+ <div class="card-content">
64
+ <div>
65
+ <slot />
66
+ </div>
67
+ </div>
68
+ </div>
69
+ </div>
70
+
71
+ <div class="counter-logos">
72
+ <img alt="OutSystems logo" src={OutSystemsLogo} />
73
+ <img alt="Astro logo" src={AstroLogo} />
74
+ </div>
@@ -0,0 +1,22 @@
1
+ <script lang="ts">
2
+ import SvelteLogo from "../../images/svelte.png?url";
3
+ import { framework } from "../../stores/framework";
4
+
5
+ const setFramework = () => {
6
+ framework.set("Svelte");
7
+ };
8
+ </script>
9
+
10
+ <div class="card">
11
+ <strong>Svelte Store</strong>
12
+ <div class="card-content">
13
+ <img alt="Svelte logo" src={SvelteLogo} height="150" />
14
+ <div>
15
+ <strong>Value:</strong>
16
+ <div id="nanostore">{$framework}</div>
17
+ </div>
18
+ <div>
19
+ <button class="card-btn" on:click={setFramework}>Select Svelte</button>
20
+ </div>
21
+ </div>
22
+ </div>
@@ -35,17 +35,15 @@ const nanoStoreValue = useStore((window as any).Stores["vueStore"]);
35
35
 
36
36
  <div class="card-grid">
37
37
  <div class="card">
38
- Internal counter controls. It keeps state within the component.
38
+ <strong>Vue counter component</strong>
39
39
  <div class="card-content">
40
+ Internal counter controls. It keeps state within the component.
40
41
  <div class="counter-controls">
41
42
  <button @click="subtract">-</button>
42
43
  <pre>{{ count }}</pre>
43
44
  <button @click="add">+</button>
44
45
  </div>
45
46
  </div>
46
- </div>
47
-
48
- <div class="card">
49
47
  The button sends the current count value to a function in the parent
50
48
  component.
51
49
  <div class="card-content">
@@ -58,20 +56,20 @@ const nanoStoreValue = useStore((window as any).Stores["vueStore"]);
58
56
  </div>
59
57
 
60
58
  <div class="card">
61
- Slot content coming in to the component
59
+ <strong>Nano Stores</strong>
62
60
  <div class="card-content">
63
61
  <div>
64
- <slot />
62
+ <strong>Value:</strong>
63
+ <div id="nanostore">{{ nanoStoreValue }}</div>
65
64
  </div>
66
65
  </div>
67
66
  </div>
68
67
 
69
68
  <div class="card">
70
- Nano Store content
69
+ <strong>Slot content</strong>
71
70
  <div class="card-content">
72
71
  <div>
73
- <strong>Nano Store value:</strong>
74
- <div id="nanostore">{{ nanoStoreValue }}</div>
72
+ <slot />
75
73
  </div>
76
74
  </div>
77
75
  </div>
@@ -0,0 +1,28 @@
1
+ <script setup lang="ts">
2
+ import { useStore } from "@nanostores/vue";
3
+
4
+ import VueLogo from "../../images/vue.png?url";
5
+ import { framework } from "../../stores/framework";
6
+
7
+ const selectedFramework = useStore(framework);
8
+
9
+ const setFramework = () => {
10
+ framework.set("Vue");
11
+ };
12
+ </script>
13
+
14
+ <template>
15
+ <div class="card">
16
+ <strong>Vue Store</strong>
17
+ <div class="card-content">
18
+ <img alt="Vue logo" :src="VueLogo" height="150" />
19
+ <div>
20
+ <strong>Value:</strong>
21
+ <div id="nanostore">{{ selectedFramework }}</div>
22
+ </div>
23
+ <div>
24
+ <button class="card-btn" @click="setFramework">Select Vue</button>
25
+ </div>
26
+ </div>
27
+ </div>
28
+ </template>
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,42 @@
1
+ ---
2
+ import DemoComponent from "../../framework/angular/Demo.component";
3
+ import styles from "../../styles/index.css?url";
4
+ const initialCount = 5;
5
+ const showMessage = "showMessage";
6
+ ---
7
+ <html lang="en">
8
+ <head>
9
+ <link href={styles} rel="stylesheet" />
10
+ <script>
11
+ window.showMessage = (count) => {
12
+ document.getElementById("counter").textContent = count;
13
+ };
14
+ </script>
15
+ </head>
16
+ <body>
17
+ <div class="counter-title">Astro Page</div>
18
+ <div class="card-grid">
19
+ <div class="card">
20
+ <strong>Counter component</strong>
21
+ <div class="card-content">
22
+ <div style="text-align: center; margin-top: 30px;">
23
+ Counter value: <br /><span id="counter"></span>
24
+ </div>
25
+ </div>
26
+ </div>
27
+ <div class="card unused">
28
+ <strong>Nano Stores (not supported)</strong>
29
+ <div class="card-content">
30
+ <div style="text-align: center; margin-top: 30px;">
31
+ </div>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ <hr />
36
+ <DemoComponent
37
+ client:visible
38
+ initialCount={initialCount}
39
+ showMessage={showMessage}
40
+ />
41
+ </body>
42
+ </html>
@@ -0,0 +1,22 @@
1
+ ---
2
+ import AngularStore from "../../framework/angular/Store.component"
3
+ import PreactStore from "../../framework/preact/Store";
4
+ import ReactStore from "../../framework/react/Store";
5
+ import SvelteStore from "../../framework/svelte/Store.svelte";
6
+ import VueStore from "../../framework/vue/Store.vue";
7
+ import styles from "../../styles/index.css?url";
8
+ ---
9
+ <html lang="en">
10
+ <head>
11
+ <link href={styles} rel="stylesheet" />
12
+ </head>
13
+ <body>
14
+ <div class="card-grid">
15
+ <AngularStore client:visible />
16
+ <PreactStore client:only="preact" />
17
+ <ReactStore client:only="react" />
18
+ <SvelteStore client:only="svelte" />
19
+ <VueStore client:only="vue" />
20
+ </div>
21
+ </body>
22
+ </html>
@@ -0,0 +1,66 @@
1
+ ---
2
+ import DemoComponent from "../../framework/preact/Demo";
3
+ import styles from "../../styles/index.css?url";
4
+ const initialCount = 5;
5
+ const showMessage = "showMessage";
6
+ ---
7
+ <html lang="en">
8
+ <head>
9
+ <link href={styles} rel="stylesheet" />
10
+ <script>
11
+ import { atom } from "nanostores";
12
+ window["showMessage"] = (count) => {
13
+ document.getElementById("counter").textContent = count;
14
+ };
15
+ window.Stores = [];
16
+ window.Stores["preactStore"] = atom("Test Value");
17
+ document.addEventListener("DOMContentLoaded", function () {
18
+ const input = document.getElementById("store");
19
+ input.value = window.Stores["preactStore"].get();
20
+ });
21
+ </script>
22
+ </head>
23
+ <body>
24
+ <div class="counter-title">Astro Page</div>
25
+ <div class="card-grid">
26
+ <div class="card">
27
+ <strong>Counter component</strong>
28
+ <div class="card-content">
29
+ <div style="text-align: center; margin-top: 30px;">
30
+ Counter value:
31
+ <div>
32
+ <span id="counter"></span>
33
+ </div>
34
+ </div>
35
+ </div>
36
+ </div>
37
+ <div class="card">
38
+ <strong>Nano Stores</strong>
39
+ <div class="card-content">
40
+ <div style="text-align: center; margin-top: 30px;">
41
+ <input
42
+ id="store"
43
+ placeholder="Type something..."
44
+ type="text"
45
+ /><button
46
+ class="card-btn"
47
+ onclick="window.Stores['preactStore'].set(document.getElementById('store').value)"
48
+ >Update Store</button
49
+ >
50
+ </div>
51
+ </div>
52
+ </div>
53
+ </div>
54
+ <hr />
55
+ <DemoComponent
56
+ client:only="preact"
57
+ initialCount={initialCount}
58
+ showMessage={showMessage}
59
+ >
60
+ <div class="counter-title" slot="header">Preact Demo Component</div>
61
+ <div style="text-align: center;">
62
+ <p><em>This is content passed into the component.</em></p>
63
+ </div>
64
+ </DemoComponent>
65
+ </body>
66
+ </html>