frontend-hamroun 1.2.79 → 1.2.82

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 (259) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +129 -1513
  3. package/bin/cli.js +506 -145
  4. package/dist/index.cjs +2 -0
  5. package/dist/index.cjs.map +1 -0
  6. package/dist/index.client.cjs +2 -0
  7. package/dist/index.client.cjs.map +1 -0
  8. package/dist/index.client.js +26 -0
  9. package/dist/index.client.js.map +1 -0
  10. package/dist/index.js +299 -1
  11. package/dist/index.js.map +1 -0
  12. package/dist/jsx-runtime.cjs +2 -0
  13. package/dist/jsx-runtime.cjs.map +1 -0
  14. package/dist/jsx-runtime.js +93 -1
  15. package/dist/jsx-runtime.js.map +1 -0
  16. package/dist/renderer-Bo9zkUZ_.js +52 -0
  17. package/dist/renderer-Bo9zkUZ_.js.map +1 -0
  18. package/dist/renderer-Din1y3YM.cjs +2 -0
  19. package/dist/renderer-Din1y3YM.cjs.map +1 -0
  20. package/dist/server-renderer-CqIpQ-od.cjs +2 -0
  21. package/dist/server-renderer-CqIpQ-od.cjs.map +1 -0
  22. package/dist/server-renderer-QHt45Ip2.js +255 -0
  23. package/dist/server-renderer-QHt45Ip2.js.map +1 -0
  24. package/dist/server-renderer.cjs +2 -0
  25. package/dist/server-renderer.cjs.map +1 -0
  26. package/dist/server-renderer.js +5 -1
  27. package/dist/server-renderer.js.map +1 -0
  28. package/package.json +77 -120
  29. package/templates/basic-app/build.js +22 -0
  30. package/templates/basic-app/dev.js +27 -0
  31. package/templates/basic-app/esbuild.config.js +28 -0
  32. package/templates/basic-app/index.html +1 -1
  33. package/templates/basic-app/package.json +29 -28
  34. package/templates/basic-app/server.js +24 -0
  35. package/templates/basic-app/src/App.jsx +16 -0
  36. package/templates/basic-app/src/App.tsx +26 -0
  37. package/templates/basic-app/src/client.jsx +5 -0
  38. package/templates/basic-app/src/client.tsx +11 -0
  39. package/templates/basic-app/src/components/Counter.jsx +13 -0
  40. package/templates/basic-app/src/components/Counter.tsx +18 -0
  41. package/templates/basic-app/src/jsx-shim.js +3 -0
  42. package/templates/basic-app/src/jsx-shim.ts +11 -0
  43. package/templates/basic-app/src/main.jsx +98 -0
  44. package/templates/basic-app/src/main.tsx +0 -1
  45. package/templates/basic-app/src/server.js +47 -0
  46. package/templates/basic-app/src/server.ts +52 -0
  47. package/templates/basic-app/tsconfig.server.json +11 -0
  48. package/templates/complete-app/lib/frontend-hamroun.js +182 -0
  49. package/templates/complete-app/package.json +2 -1
  50. package/templates/complete-app/pages/about.jsx +0 -0
  51. package/templates/complete-app/pages/index.jsx +0 -0
  52. package/templates/complete-app/pages/wasm-demo.jsx +0 -0
  53. package/templates/complete-app/public/client.js +58 -49
  54. package/templates/complete-app/public/index.html +88 -17
  55. package/templates/complete-app/public/styles.css +30 -533
  56. package/templates/complete-app/server.js +31 -222
  57. package/templates/complete-app/wasm/build.bat +0 -0
  58. package/templates/complete-app/wasm/build.sh +0 -0
  59. package/templates/complete-app/wasm/example.go +0 -0
  60. package/templates/fullstack-app/build/main.js +130 -101
  61. package/templates/fullstack-app/build/main.js.map +4 -4
  62. package/templates/fullstack-app/package-lock.json +1773 -566
  63. package/templates/ssr-template/esbuild.config.js +33 -0
  64. package/templates/ssr-template/jsx-shim.js +1 -0
  65. package/templates/ssr-template/package.json +22 -16
  66. package/templates/ssr-template/src/App.tsx +12 -52
  67. package/templates/ssr-template/src/client.tsx +3 -17
  68. package/templates/ssr-template/src/server.ts +21 -204
  69. package/templates/ssr-template/tsconfig.json +10 -13
  70. package/templates/ssr-template/tsconfig.server.json +6 -14
  71. package/templates/wasm/build-wasm.js +228 -0
  72. package/templates/wasm/esbuild.config.js +63 -0
  73. package/templates/wasm/go/main.go +256 -0
  74. package/templates/wasm/go/wasm_exec.js +0 -0
  75. package/templates/wasm/index.html +97 -0
  76. package/templates/wasm/jsx-shim.js +9 -0
  77. package/templates/{go-wasm-app → wasm}/package-lock.json +5307 -3732
  78. package/templates/wasm/package.json +42 -0
  79. package/templates/wasm/public/example.wasm +0 -0
  80. package/templates/wasm/src/App.tsx +564 -0
  81. package/templates/wasm/src/client.tsx +220 -0
  82. package/templates/wasm/src/index.tsx +21 -0
  83. package/templates/wasm/src/server.ts +145 -0
  84. package/templates/wasm/tsconfig.json +21 -0
  85. package/templates/wasm/tsconfig.node.json +13 -0
  86. package/templates/wasm/tsconfig.server.json +23 -0
  87. package/templates/wasm/vite.config.ts +56 -0
  88. package/templates/wasm/wasm-loader.js +103 -0
  89. package/dist/batch/package.json +0 -16
  90. package/dist/client-router/package.json +0 -16
  91. package/dist/component/package.json +0 -16
  92. package/dist/context/package.json +0 -16
  93. package/dist/event-bus/package.json +0 -16
  94. package/dist/forms/package.json +0 -16
  95. package/dist/hooks/package.json +0 -16
  96. package/dist/hooks-0728361a.cjs +0 -1
  97. package/dist/hooks-b58f947c.js +0 -133
  98. package/dist/hooks.js +0 -1
  99. package/dist/hooks.mjs +0 -13
  100. package/dist/index.mjs +0 -137
  101. package/dist/jsx-runtime/package.json +0 -16
  102. package/dist/jsx-runtime.mjs +0 -64
  103. package/dist/lifecycle-events/package.json +0 -16
  104. package/dist/package.json +0 -71
  105. package/dist/render-component/package.json +0 -16
  106. package/dist/renderer/package.json +0 -16
  107. package/dist/renderer.js +0 -1
  108. package/dist/renderer.mjs +0 -27
  109. package/dist/router/package.json +0 -16
  110. package/dist/server/package.json +0 -17
  111. package/dist/server/src/batch.d.ts +0 -3
  112. package/dist/server/src/batch.js +0 -23
  113. package/dist/server/src/batch.js.map +0 -1
  114. package/dist/server/src/client-router.d.ts +0 -60
  115. package/dist/server/src/client-router.js +0 -210
  116. package/dist/server/src/client-router.js.map +0 -1
  117. package/dist/server/src/component.d.ts +0 -14
  118. package/dist/server/src/component.js +0 -106
  119. package/dist/server/src/component.js.map +0 -1
  120. package/dist/server/src/context.d.ts +0 -13
  121. package/dist/server/src/context.js +0 -21
  122. package/dist/server/src/context.js.map +0 -1
  123. package/dist/server/src/event-bus.d.ts +0 -23
  124. package/dist/server/src/event-bus.js +0 -75
  125. package/dist/server/src/event-bus.js.map +0 -1
  126. package/dist/server/src/forms.d.ts +0 -40
  127. package/dist/server/src/forms.js +0 -148
  128. package/dist/server/src/forms.js.map +0 -1
  129. package/dist/server/src/hooks.d.ts +0 -12
  130. package/dist/server/src/hooks.js +0 -170
  131. package/dist/server/src/hooks.js.map +0 -1
  132. package/dist/server/src/index.client.d.ts +0 -12
  133. package/dist/server/src/index.client.js +0 -14
  134. package/dist/server/src/index.client.js.map +0 -1
  135. package/dist/server/src/index.d.ts +0 -88
  136. package/dist/server/src/index.js +0 -79
  137. package/dist/server/src/index.js.map +0 -1
  138. package/dist/server/src/jsx-runtime/jsx-dev-runtime.d.ts +0 -1
  139. package/dist/server/src/jsx-runtime/jsx-dev-runtime.js +0 -2
  140. package/dist/server/src/jsx-runtime/jsx-dev-runtime.js.map +0 -1
  141. package/dist/server/src/jsx-runtime/jsx-runtime.d.ts +0 -4
  142. package/dist/server/src/jsx-runtime/jsx-runtime.js +0 -41
  143. package/dist/server/src/jsx-runtime/jsx-runtime.js.map +0 -1
  144. package/dist/server/src/jsx-runtime.d.ts +0 -20
  145. package/dist/server/src/jsx-runtime.js +0 -105
  146. package/dist/server/src/jsx-runtime.js.map +0 -1
  147. package/dist/server/src/lifecycle-events.d.ts +0 -108
  148. package/dist/server/src/lifecycle-events.js +0 -177
  149. package/dist/server/src/lifecycle-events.js.map +0 -1
  150. package/dist/server/src/renderComponent.d.ts +0 -13
  151. package/dist/server/src/renderComponent.js +0 -30
  152. package/dist/server/src/renderComponent.js.map +0 -1
  153. package/dist/server/src/renderer.d.ts +0 -2
  154. package/dist/server/src/renderer.js +0 -31
  155. package/dist/server/src/renderer.js.map +0 -1
  156. package/dist/server/src/router.d.ts +0 -55
  157. package/dist/server/src/router.js +0 -166
  158. package/dist/server/src/router.js.map +0 -1
  159. package/dist/server/src/server/api-router.d.ts +0 -15
  160. package/dist/server/src/server/api-router.js +0 -111
  161. package/dist/server/src/server/api-router.js.map +0 -1
  162. package/dist/server/src/server/auth.d.ts +0 -32
  163. package/dist/server/src/server/auth.js +0 -80
  164. package/dist/server/src/server/auth.js.map +0 -1
  165. package/dist/server/src/server/database.d.ts +0 -24
  166. package/dist/server/src/server/database.js +0 -135
  167. package/dist/server/src/server/database.js.map +0 -1
  168. package/dist/server/src/server/index.d.ts +0 -116
  169. package/dist/server/src/server/index.js +0 -508
  170. package/dist/server/src/server/index.js.map +0 -1
  171. package/dist/server/src/server/middleware.d.ts +0 -11
  172. package/dist/server/src/server/middleware.js +0 -46
  173. package/dist/server/src/server/middleware.js.map +0 -1
  174. package/dist/server/src/server/server.d.ts +0 -9
  175. package/dist/server/src/server/server.js +0 -87
  176. package/dist/server/src/server/server.js.map +0 -1
  177. package/dist/server/src/server/templates.d.ts +0 -30
  178. package/dist/server/src/server/templates.js +0 -208
  179. package/dist/server/src/server/templates.js.map +0 -1
  180. package/dist/server/src/server/types.d.ts +0 -38
  181. package/dist/server/src/server/types.js +0 -4
  182. package/dist/server/src/server/types.js.map +0 -1
  183. package/dist/server/src/server/utils.d.ts +0 -70
  184. package/dist/server/src/server/utils.js +0 -156
  185. package/dist/server/src/server/utils.js.map +0 -1
  186. package/dist/server/src/server/wasm.d.ts +0 -9
  187. package/dist/server/src/server/wasm.js +0 -117
  188. package/dist/server/src/server/wasm.js.map +0 -1
  189. package/dist/server/src/server-renderer.d.ts +0 -5
  190. package/dist/server/src/server-renderer.js +0 -106
  191. package/dist/server/src/server-renderer.js.map +0 -1
  192. package/dist/server/src/server-types.d.ts +0 -42
  193. package/dist/server/src/server-types.js +0 -6
  194. package/dist/server/src/server-types.js.map +0 -1
  195. package/dist/server/src/store.d.ts +0 -41
  196. package/dist/server/src/store.js +0 -99
  197. package/dist/server/src/store.js.map +0 -1
  198. package/dist/server/src/types.d.ts +0 -19
  199. package/dist/server/src/types.js +0 -2
  200. package/dist/server/src/types.js.map +0 -1
  201. package/dist/server/src/utils.d.ts +0 -46
  202. package/dist/server/src/utils.js +0 -144
  203. package/dist/server/src/utils.js.map +0 -1
  204. package/dist/server/src/vdom.d.ts +0 -8
  205. package/dist/server/src/vdom.js +0 -22
  206. package/dist/server/src/vdom.js.map +0 -1
  207. package/dist/server/src/wasm.d.ts +0 -36
  208. package/dist/server/src/wasm.js +0 -159
  209. package/dist/server/src/wasm.js.map +0 -1
  210. package/dist/server/tsconfig.server.tsbuildinfo +0 -1
  211. package/dist/server-renderer/package.json +0 -16
  212. package/dist/server-renderer.mjs +0 -64
  213. package/dist/store/package.json +0 -16
  214. package/dist/types/package.json +0 -16
  215. package/dist/utils/package.json +0 -16
  216. package/dist/vdom/package.json +0 -16
  217. package/dist/wasm/package.json +0 -16
  218. package/dist/wasm.js +0 -1
  219. package/dist/wasm.mjs +0 -103
  220. package/templates/basic-app/docs/rapport_pfe.aux +0 -27
  221. package/templates/basic-app/docs/rapport_pfe.log +0 -399
  222. package/templates/basic-app/docs/rapport_pfe.out +0 -10
  223. package/templates/basic-app/docs/rapport_pfe.pdf +0 -0
  224. package/templates/basic-app/docs/rapport_pfe.tex +0 -68
  225. package/templates/basic-app/docs/rapport_pfe.toc +0 -14
  226. package/templates/complete-app/package-lock.json +0 -2536
  227. package/templates/go-wasm-app/README.md +0 -38
  228. package/templates/go-wasm-app/babel.config.js +0 -21
  229. package/templates/go-wasm-app/build-client.js +0 -49
  230. package/templates/go-wasm-app/build-wasm.js +0 -237
  231. package/templates/go-wasm-app/build.config.js +0 -62
  232. package/templates/go-wasm-app/build.js +0 -218
  233. package/templates/go-wasm-app/package.json +0 -32
  234. package/templates/go-wasm-app/public/index.html +0 -128
  235. package/templates/go-wasm-app/public/styles.css +0 -197
  236. package/templates/go-wasm-app/public/wasm/example.wasm +0 -0
  237. package/templates/go-wasm-app/public/wasm/wasm_exec_node.js +0 -39
  238. package/templates/go-wasm-app/server.js +0 -70
  239. package/templates/go-wasm-app/src/App.jsx +0 -38
  240. package/templates/go-wasm-app/src/app.js +0 -173
  241. package/templates/go-wasm-app/src/client.js +0 -57
  242. package/templates/go-wasm-app/src/components/Footer.jsx +0 -13
  243. package/templates/go-wasm-app/src/components/Header.jsx +0 -19
  244. package/templates/go-wasm-app/src/components/WasmDemo.jsx +0 -120
  245. package/templates/go-wasm-app/src/main.jsx +0 -12
  246. package/templates/go-wasm-app/src/wasm/example.go +0 -75
  247. package/templates/go-wasm-app/tsconfig.server.json +0 -18
  248. package/templates/go-wasm-app/vite.config.js +0 -45
  249. package/templates/ssr-template/client.js +0 -58
  250. package/templates/ssr-template/package-lock.json +0 -2478
  251. package/templates/ssr-template/public/index.html +0 -47
  252. package/templates/ssr-template/readme.md +0 -188
  253. package/templates/ssr-template/server.js +0 -369
  254. package/templates/ssr-template/server.ts +0 -275
  255. package/templates/ssr-template/src/client.ts +0 -61
  256. package/templates/ssr-template/src/pages/index.tsx +0 -51
  257. package/templates/ssr-template/vite.config.js +0 -57
  258. /package/{dist/Counter.d.ts → templates/complete-app/api/hello.js} +0 -0
  259. /package/templates/{go-wasm-app/public/wasm → wasm/public}/wasm_exec.js +0 -0
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "frontend-hamroun-wasm-app",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "description": "Frontend Hamroun + Go WebAssembly integration example",
7
+ "scripts": {
8
+ "dev": "vite",
9
+ "build": "vite build",
10
+ "preview": "vite preview",
11
+ "build:wasm": "node build-wasm.js",
12
+ "dev:wasm": "npm run build:wasm && npm run dev",
13
+ "build:go": "node build-wasm.js",
14
+ "clean": "rimraf dist public/*.wasm",
15
+ "test": "echo \"No tests specified\" && exit 0"
16
+ },
17
+ "dependencies": {
18
+ "express": "^4.18.2",
19
+ "frontend-hamroun": "^1.2.80"
20
+ },
21
+ "devDependencies": {
22
+ "@types/express": "^4.17.17",
23
+ "@types/node": "^20.5.0",
24
+ "cross-env": "^7.0.3",
25
+ "esbuild": "^0.19.12",
26
+ "rimraf": "^5.0.0",
27
+ "typescript": "^5.0.0",
28
+ "vite": "^5.0.0"
29
+ },
30
+ "engines": {
31
+ "node": ">=18.0.0"
32
+ },
33
+ "keywords": [
34
+ "frontend-hamroun",
35
+ "webassembly",
36
+ "wasm",
37
+ "go",
38
+ "javascript",
39
+ "ssr",
40
+ "performance"
41
+ ]
42
+ }
@@ -0,0 +1,564 @@
1
+ import { jsx, useState, useEffect } from 'frontend-hamroun';
2
+
3
+ export default function App() {
4
+ const [wasmReady, setWasmReady] = useState(false);
5
+ const [wasmError, setWasmError] = useState<string | null>(null);
6
+ const [result, setResult] = useState<any>(null);
7
+ const [inputA, setInputA] = useState(10);
8
+ const [inputB, setInputB] = useState(20);
9
+ const [fibInput, setFibInput] = useState(10);
10
+ const [primeInput, setPrimeInput] = useState(17);
11
+ const [name, setName] = useState('World');
12
+
13
+ useEffect(() => {
14
+ let mounted = true;
15
+
16
+ async function loadWasm() {
17
+ try {
18
+ // Check if Go WASM runtime is available
19
+ if (typeof window === 'undefined' || !window.Go) {
20
+ throw new Error('Go WASM runtime not available. Make sure wasm_exec.js is loaded.');
21
+ }
22
+
23
+ // Load the WASM file
24
+ const wasmUrl = '/example.wasm';
25
+ const response = await fetch(wasmUrl);
26
+
27
+ if (!response.ok) {
28
+ throw new Error(`Failed to fetch WASM file: ${response.status}`);
29
+ }
30
+
31
+ const wasmBytes = await response.arrayBuffer();
32
+
33
+ // Initialize Go runtime
34
+ const go = new window.Go();
35
+ const wasmModule = await WebAssembly.instantiate(wasmBytes, go.importObject);
36
+
37
+ // Run the Go program
38
+ go.run(wasmModule.instance);
39
+
40
+ // Wait a bit for Go functions to be registered
41
+ await new Promise(resolve => setTimeout(resolve, 100));
42
+
43
+ if (mounted) {
44
+ setWasmReady(true);
45
+ setWasmError(null);
46
+ console.log('WASM module loaded successfully');
47
+ }
48
+ } catch (error) {
49
+ console.error('WASM loading error:', error);
50
+ if (mounted) {
51
+ setWasmError(error instanceof Error ? error.message : 'Unknown WASM loading error');
52
+ }
53
+ }
54
+ }
55
+
56
+ loadWasm();
57
+
58
+ return () => {
59
+ mounted = false;
60
+ };
61
+ }, []); // Empty dependency array to run only once
62
+
63
+ const callWasmFunction = (funcName: string, ...args: any[]) => {
64
+ try {
65
+ const func = (window as any)[funcName];
66
+ if (typeof func !== 'function') {
67
+ throw new Error(`Function ${funcName} not found. Make sure the WASM module is loaded.`);
68
+ }
69
+ return func(...args);
70
+ } catch (error) {
71
+ const errorMsg = error instanceof Error ? error.message : 'Function call failed';
72
+ setWasmError(errorMsg);
73
+ return null;
74
+ }
75
+ };
76
+
77
+ const handleHello = () => {
78
+ const greeting = callWasmFunction('goHello', name);
79
+ if (greeting !== null) {
80
+ setResult({ type: 'hello', value: greeting, input: name });
81
+ setWasmError(null);
82
+ }
83
+ };
84
+
85
+ const handleAddition = () => {
86
+ const sum = callWasmFunction('goAdd', inputA, inputB);
87
+ if (sum !== null) {
88
+ setResult({ type: 'addition', value: sum, inputs: [inputA, inputB] });
89
+ setWasmError(null);
90
+ }
91
+ };
92
+
93
+ const handleMultiplication = () => {
94
+ const product = callWasmFunction('goMultiply', inputA, inputB);
95
+ if (product !== null) {
96
+ setResult({ type: 'multiplication', value: product, inputs: [inputA, inputB] });
97
+ setWasmError(null);
98
+ }
99
+ };
100
+
101
+ const handleFibonacci = () => {
102
+ if (fibInput > 40) {
103
+ setWasmError('Fibonacci input too large (max 40)');
104
+ return;
105
+ }
106
+ const fibResult = callWasmFunction('goFibonacci', fibInput);
107
+ if (fibResult !== null) {
108
+ setResult({ type: 'fibonacci', value: fibResult, input: fibInput });
109
+ setWasmError(null);
110
+ }
111
+ };
112
+
113
+ const handlePrimeCheck = () => {
114
+ const isPrime = callWasmFunction('goIsPrime', primeInput);
115
+ if (isPrime !== null) {
116
+ setResult({ type: 'prime', value: isPrime, input: primeInput });
117
+ setWasmError(null);
118
+ }
119
+ };
120
+
121
+ if (!wasmReady && !wasmError) {
122
+ return (
123
+ <div className="app loading">
124
+ <div className="spinner"></div>
125
+ <h2>Loading Go WASM Module...</h2>
126
+ <p>Initializing WebAssembly runtime...</p>
127
+ </div>
128
+ );
129
+ }
130
+
131
+ if (wasmError) {
132
+ return (
133
+ <div className="app error">
134
+ <h2>WASM Error</h2>
135
+ <p>{wasmError}</p>
136
+ <button onClick={() => window.location.reload()}>Reload Page</button>
137
+ <details style={{ marginTop: '20px', textAlign: 'left' }}>
138
+ <summary>Troubleshooting</summary>
139
+ <ul>
140
+ <li>Make sure the WASM file is built: <code>npm run build:wasm</code></li>
141
+ <li>Check if <code>example.wasm</code> exists in the public folder</li>
142
+ <li>Verify <code>wasm_exec.js</code> is loaded in the HTML</li>
143
+ <li>Check browser console for additional errors</li>
144
+ </ul>
145
+ </details>
146
+ </div>
147
+ );
148
+ }
149
+
150
+ return (
151
+ <div className="app">
152
+ <header>
153
+ <h1>Frontend Hamroun + Go WASM</h1>
154
+ <p>High-performance computing with WebAssembly</p>
155
+ <div className="status">
156
+ <span className="status-indicator ready"></span>
157
+ WASM Ready
158
+ </div>
159
+ </header>
160
+
161
+ <main>
162
+ <section className="demo-grid">
163
+ {/* Hello Function */}
164
+ <div className="demo-card">
165
+ <h3>🌍 Hello Function</h3>
166
+ <div className="input-group">
167
+ <input
168
+ type="text"
169
+ value={name}
170
+ onChange={(e) => setName(e.target.value)}
171
+ placeholder="Enter your name"
172
+ />
173
+ <button onClick={handleHello}>Say Hello</button>
174
+ </div>
175
+ </div>
176
+
177
+ {/* Math Operations */}
178
+ <div className="demo-card">
179
+ <h3>🧮 Math Operations</h3>
180
+ <div className="input-group">
181
+ <input
182
+ type="number"
183
+ value={inputA}
184
+ onChange={(e) => setInputA(Number(e.target.value))}
185
+ placeholder="First number"
186
+ />
187
+ <input
188
+ type="number"
189
+ value={inputB}
190
+ onChange={(e) => setInputB(Number(e.target.value))}
191
+ placeholder="Second number"
192
+ />
193
+ </div>
194
+ <div className="button-group">
195
+ <button onClick={handleAddition}>Add</button>
196
+ <button onClick={handleMultiplication}>Multiply</button>
197
+ </div>
198
+ </div>
199
+
200
+ {/* Fibonacci */}
201
+ <div className="demo-card">
202
+ <h3>🔢 Fibonacci Sequence</h3>
203
+ <div className="input-group">
204
+ <input
205
+ type="number"
206
+ value={fibInput}
207
+ onChange={(e) => setFibInput(Number(e.target.value))}
208
+ placeholder="Fibonacci number"
209
+ min="0"
210
+ max="40"
211
+ />
212
+ <button onClick={handleFibonacci}>Calculate</button>
213
+ </div>
214
+ <small>Maximum value: 40</small>
215
+ </div>
216
+
217
+ {/* Prime Check */}
218
+ <div className="demo-card">
219
+ <h3>🔍 Prime Number Check</h3>
220
+ <div className="input-group">
221
+ <input
222
+ type="number"
223
+ value={primeInput}
224
+ onChange={(e) => setPrimeInput(Number(e.target.value))}
225
+ placeholder="Number to check"
226
+ min="1"
227
+ />
228
+ <button onClick={handlePrimeCheck}>Check Prime</button>
229
+ </div>
230
+ </div>
231
+ </section>
232
+
233
+ {/* Results Display */}
234
+ {result && (
235
+ <section className="results">
236
+ <h2>📊 Result</h2>
237
+ <div className="result-card">
238
+ {result.type === 'hello' && (
239
+ <p><strong>Greeting:</strong> <span className="result-value">{result.value}</span></p>
240
+ )}
241
+ {result.type === 'addition' && (
242
+ <p><strong>Addition:</strong> {result.inputs[0]} + {result.inputs[1]} = <span className="result-value">{result.value}</span></p>
243
+ )}
244
+ {result.type === 'multiplication' && (
245
+ <p><strong>Multiplication:</strong> {result.inputs[0]} × {result.inputs[1]} = <span className="result-value">{result.value}</span></p>
246
+ )}
247
+ {result.type === 'fibonacci' && (
248
+ <p><strong>Fibonacci:</strong> F({result.input}) = <span className="result-value">{result.value}</span></p>
249
+ )}
250
+ {result.type === 'prime' && (
251
+ <p><strong>Prime Check:</strong> {result.input} is <span className="result-value">{result.value ? 'prime' : 'not prime'}</span></p>
252
+ )}
253
+ </div>
254
+ </section>
255
+ )}
256
+
257
+ {/* Info Section */}
258
+ <section className="info-section">
259
+ <h2>⚡ WebAssembly Benefits</h2>
260
+ <div className="benefits-grid">
261
+ <div className="benefit">
262
+ <h4>🚀 Performance</h4>
263
+ <p>Near-native execution speed for compute-intensive tasks</p>
264
+ </div>
265
+ <div className="benefit">
266
+ <h4>🔒 Security</h4>
267
+ <p>Sandboxed execution environment with memory safety</p>
268
+ </div>
269
+ <div className="benefit">
270
+ <h4>🌐 Portability</h4>
271
+ <p>Run the same code across different platforms and browsers</p>
272
+ </div>
273
+ <div className="benefit">
274
+ <h4>🛠️ Language Choice</h4>
275
+ <p>Write performance-critical code in Go, Rust, or C++</p>
276
+ </div>
277
+ </div>
278
+ </section>
279
+ </main>
280
+
281
+ <style>{`
282
+ .app {
283
+ max-width: 1200px;
284
+ margin: 0 auto;
285
+ padding: 20px;
286
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
287
+ line-height: 1.6;
288
+ }
289
+
290
+ .app.loading, .app.error {
291
+ text-align: center;
292
+ padding: 60px 20px;
293
+ }
294
+
295
+ .spinner {
296
+ width: 50px;
297
+ height: 50px;
298
+ border: 4px solid #f3f3f3;
299
+ border-top: 4px solid #007acc;
300
+ border-radius: 50%;
301
+ animation: spin 1s linear infinite;
302
+ margin: 0 auto 20px;
303
+ }
304
+
305
+ @keyframes spin {
306
+ 0% { transform: rotate(0deg); }
307
+ 100% { transform: rotate(360deg); }
308
+ }
309
+
310
+ header {
311
+ text-align: center;
312
+ margin-bottom: 40px;
313
+ padding: 30px;
314
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
315
+ color: white;
316
+ border-radius: 16px;
317
+ position: relative;
318
+ }
319
+
320
+ header h1 {
321
+ margin: 0 0 10px 0;
322
+ font-size: 2.5rem;
323
+ font-weight: 700;
324
+ }
325
+
326
+ header p {
327
+ margin: 0 0 20px 0;
328
+ opacity: 0.9;
329
+ font-size: 1.1rem;
330
+ }
331
+
332
+ .status {
333
+ display: inline-flex;
334
+ align-items: center;
335
+ gap: 8px;
336
+ background: rgba(255, 255, 255, 0.2);
337
+ padding: 8px 16px;
338
+ border-radius: 20px;
339
+ font-size: 0.9rem;
340
+ }
341
+
342
+ .status-indicator {
343
+ width: 8px;
344
+ height: 8px;
345
+ border-radius: 50%;
346
+ background: #4ade80;
347
+ animation: pulse 2s infinite;
348
+ }
349
+
350
+ @keyframes pulse {
351
+ 0%, 100% { opacity: 1; }
352
+ 50% { opacity: 0.5; }
353
+ }
354
+
355
+ .demo-grid {
356
+ display: grid;
357
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
358
+ gap: 20px;
359
+ margin-bottom: 30px;
360
+ }
361
+
362
+ .demo-card {
363
+ background: white;
364
+ padding: 24px;
365
+ border-radius: 12px;
366
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
367
+ border: 1px solid #e5e7eb;
368
+ transition: transform 0.2s, box-shadow 0.2s;
369
+ }
370
+
371
+ .demo-card:hover {
372
+ transform: translateY(-2px);
373
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
374
+ }
375
+
376
+ .demo-card h3 {
377
+ margin-top: 0;
378
+ margin-bottom: 16px;
379
+ color: #374151;
380
+ font-size: 1.2rem;
381
+ }
382
+
383
+ .input-group {
384
+ display: flex;
385
+ gap: 8px;
386
+ margin-bottom: 12px;
387
+ flex-wrap: wrap;
388
+ }
389
+
390
+ .button-group {
391
+ display: flex;
392
+ gap: 8px;
393
+ flex-wrap: wrap;
394
+ }
395
+
396
+ input {
397
+ flex: 1;
398
+ min-width: 120px;
399
+ padding: 10px 12px;
400
+ border: 2px solid #e5e7eb;
401
+ border-radius: 8px;
402
+ font-size: 14px;
403
+ transition: border-color 0.2s;
404
+ }
405
+
406
+ input:focus {
407
+ outline: none;
408
+ border-color: #007acc;
409
+ }
410
+
411
+ button {
412
+ background: #007acc;
413
+ color: white;
414
+ border: none;
415
+ padding: 10px 16px;
416
+ border-radius: 8px;
417
+ cursor: pointer;
418
+ font-size: 14px;
419
+ font-weight: 600;
420
+ transition: all 0.2s;
421
+ white-space: nowrap;
422
+ }
423
+
424
+ button:hover {
425
+ background: #0056a3;
426
+ transform: translateY(-1px);
427
+ }
428
+
429
+ button:active {
430
+ transform: translateY(0);
431
+ }
432
+
433
+ small {
434
+ color: #6b7280;
435
+ font-size: 0.8rem;
436
+ }
437
+
438
+ .results {
439
+ background: #f0f9ff;
440
+ padding: 24px;
441
+ border-radius: 12px;
442
+ border: 2px solid #bae6fd;
443
+ margin: 30px 0;
444
+ }
445
+
446
+ .results h2 {
447
+ margin-top: 0;
448
+ color: #0369a1;
449
+ }
450
+
451
+ .result-card {
452
+ background: white;
453
+ padding: 16px;
454
+ border-radius: 8px;
455
+ border: 1px solid #bae6fd;
456
+ }
457
+
458
+ .result-value {
459
+ font-weight: bold;
460
+ color: #007acc;
461
+ background: #e0f2fe;
462
+ padding: 2px 6px;
463
+ border-radius: 4px;
464
+ }
465
+
466
+ .info-section {
467
+ margin-top: 40px;
468
+ }
469
+
470
+ .info-section h2 {
471
+ text-align: center;
472
+ margin-bottom: 30px;
473
+ color: #374151;
474
+ }
475
+
476
+ .benefits-grid {
477
+ display: grid;
478
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
479
+ gap: 20px;
480
+ }
481
+
482
+ .benefit {
483
+ background: #f9fafb;
484
+ padding: 20px;
485
+ border-radius: 12px;
486
+ border: 1px solid #e5e7eb;
487
+ text-align: center;
488
+ }
489
+
490
+ .benefit h4 {
491
+ margin: 0 0 8px 0;
492
+ color: #374151;
493
+ font-size: 1.1rem;
494
+ }
495
+
496
+ .benefit p {
497
+ margin: 0;
498
+ color: #6b7280;
499
+ font-size: 0.9rem;
500
+ }
501
+
502
+ .error {
503
+ color: #dc2626;
504
+ }
505
+
506
+ .error button {
507
+ background: #dc2626;
508
+ margin-top: 20px;
509
+ }
510
+
511
+ .error button:hover {
512
+ background: #b91c1c;
513
+ }
514
+
515
+ details {
516
+ background: #fef2f2;
517
+ padding: 16px;
518
+ border-radius: 8px;
519
+ border: 1px solid #fecaca;
520
+ }
521
+
522
+ summary {
523
+ cursor: pointer;
524
+ font-weight: 600;
525
+ margin-bottom: 8px;
526
+ }
527
+
528
+ code {
529
+ background: #f3f4f6;
530
+ padding: 2px 4px;
531
+ border-radius: 4px;
532
+ font-family: monospace;
533
+ font-size: 0.9em;
534
+ }
535
+
536
+ @media (max-width: 768px) {
537
+ .app {
538
+ padding: 10px;
539
+ }
540
+
541
+ header {
542
+ padding: 20px;
543
+ }
544
+
545
+ header h1 {
546
+ font-size: 2rem;
547
+ }
548
+
549
+ .demo-grid {
550
+ grid-template-columns: 1fr;
551
+ }
552
+
553
+ .input-group {
554
+ flex-direction: column;
555
+ }
556
+
557
+ input {
558
+ min-width: auto;
559
+ }
560
+ }
561
+ `}</style>
562
+ </div>
563
+ );
564
+ }