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.
- package/LICENSE +21 -0
- package/README.md +129 -1513
- package/bin/cli.js +506 -145
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.client.cjs +2 -0
- package/dist/index.client.cjs.map +1 -0
- package/dist/index.client.js +26 -0
- package/dist/index.client.js.map +1 -0
- package/dist/index.js +299 -1
- package/dist/index.js.map +1 -0
- package/dist/jsx-runtime.cjs +2 -0
- package/dist/jsx-runtime.cjs.map +1 -0
- package/dist/jsx-runtime.js +93 -1
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/renderer-Bo9zkUZ_.js +52 -0
- package/dist/renderer-Bo9zkUZ_.js.map +1 -0
- package/dist/renderer-Din1y3YM.cjs +2 -0
- package/dist/renderer-Din1y3YM.cjs.map +1 -0
- package/dist/server-renderer-CqIpQ-od.cjs +2 -0
- package/dist/server-renderer-CqIpQ-od.cjs.map +1 -0
- package/dist/server-renderer-QHt45Ip2.js +255 -0
- package/dist/server-renderer-QHt45Ip2.js.map +1 -0
- package/dist/server-renderer.cjs +2 -0
- package/dist/server-renderer.cjs.map +1 -0
- package/dist/server-renderer.js +5 -1
- package/dist/server-renderer.js.map +1 -0
- package/package.json +77 -120
- package/templates/basic-app/build.js +22 -0
- package/templates/basic-app/dev.js +27 -0
- package/templates/basic-app/esbuild.config.js +28 -0
- package/templates/basic-app/index.html +1 -1
- package/templates/basic-app/package.json +29 -28
- package/templates/basic-app/server.js +24 -0
- package/templates/basic-app/src/App.jsx +16 -0
- package/templates/basic-app/src/App.tsx +26 -0
- package/templates/basic-app/src/client.jsx +5 -0
- package/templates/basic-app/src/client.tsx +11 -0
- package/templates/basic-app/src/components/Counter.jsx +13 -0
- package/templates/basic-app/src/components/Counter.tsx +18 -0
- package/templates/basic-app/src/jsx-shim.js +3 -0
- package/templates/basic-app/src/jsx-shim.ts +11 -0
- package/templates/basic-app/src/main.jsx +98 -0
- package/templates/basic-app/src/main.tsx +0 -1
- package/templates/basic-app/src/server.js +47 -0
- package/templates/basic-app/src/server.ts +52 -0
- package/templates/basic-app/tsconfig.server.json +11 -0
- package/templates/complete-app/lib/frontend-hamroun.js +182 -0
- package/templates/complete-app/package.json +2 -1
- package/templates/complete-app/pages/about.jsx +0 -0
- package/templates/complete-app/pages/index.jsx +0 -0
- package/templates/complete-app/pages/wasm-demo.jsx +0 -0
- package/templates/complete-app/public/client.js +58 -49
- package/templates/complete-app/public/index.html +88 -17
- package/templates/complete-app/public/styles.css +30 -533
- package/templates/complete-app/server.js +31 -222
- package/templates/complete-app/wasm/build.bat +0 -0
- package/templates/complete-app/wasm/build.sh +0 -0
- package/templates/complete-app/wasm/example.go +0 -0
- package/templates/fullstack-app/build/main.js +130 -101
- package/templates/fullstack-app/build/main.js.map +4 -4
- package/templates/fullstack-app/package-lock.json +1773 -566
- package/templates/ssr-template/esbuild.config.js +33 -0
- package/templates/ssr-template/jsx-shim.js +1 -0
- package/templates/ssr-template/package.json +22 -16
- package/templates/ssr-template/src/App.tsx +12 -52
- package/templates/ssr-template/src/client.tsx +3 -17
- package/templates/ssr-template/src/server.ts +21 -204
- package/templates/ssr-template/tsconfig.json +10 -13
- package/templates/ssr-template/tsconfig.server.json +6 -14
- package/templates/wasm/build-wasm.js +228 -0
- package/templates/wasm/esbuild.config.js +63 -0
- package/templates/wasm/go/main.go +256 -0
- package/templates/wasm/go/wasm_exec.js +0 -0
- package/templates/wasm/index.html +97 -0
- package/templates/wasm/jsx-shim.js +9 -0
- package/templates/{go-wasm-app → wasm}/package-lock.json +5307 -3732
- package/templates/wasm/package.json +42 -0
- package/templates/wasm/public/example.wasm +0 -0
- package/templates/wasm/src/App.tsx +564 -0
- package/templates/wasm/src/client.tsx +220 -0
- package/templates/wasm/src/index.tsx +21 -0
- package/templates/wasm/src/server.ts +145 -0
- package/templates/wasm/tsconfig.json +21 -0
- package/templates/wasm/tsconfig.node.json +13 -0
- package/templates/wasm/tsconfig.server.json +23 -0
- package/templates/wasm/vite.config.ts +56 -0
- package/templates/wasm/wasm-loader.js +103 -0
- package/dist/batch/package.json +0 -16
- package/dist/client-router/package.json +0 -16
- package/dist/component/package.json +0 -16
- package/dist/context/package.json +0 -16
- package/dist/event-bus/package.json +0 -16
- package/dist/forms/package.json +0 -16
- package/dist/hooks/package.json +0 -16
- package/dist/hooks-0728361a.cjs +0 -1
- package/dist/hooks-b58f947c.js +0 -133
- package/dist/hooks.js +0 -1
- package/dist/hooks.mjs +0 -13
- package/dist/index.mjs +0 -137
- package/dist/jsx-runtime/package.json +0 -16
- package/dist/jsx-runtime.mjs +0 -64
- package/dist/lifecycle-events/package.json +0 -16
- package/dist/package.json +0 -71
- package/dist/render-component/package.json +0 -16
- package/dist/renderer/package.json +0 -16
- package/dist/renderer.js +0 -1
- package/dist/renderer.mjs +0 -27
- package/dist/router/package.json +0 -16
- package/dist/server/package.json +0 -17
- package/dist/server/src/batch.d.ts +0 -3
- package/dist/server/src/batch.js +0 -23
- package/dist/server/src/batch.js.map +0 -1
- package/dist/server/src/client-router.d.ts +0 -60
- package/dist/server/src/client-router.js +0 -210
- package/dist/server/src/client-router.js.map +0 -1
- package/dist/server/src/component.d.ts +0 -14
- package/dist/server/src/component.js +0 -106
- package/dist/server/src/component.js.map +0 -1
- package/dist/server/src/context.d.ts +0 -13
- package/dist/server/src/context.js +0 -21
- package/dist/server/src/context.js.map +0 -1
- package/dist/server/src/event-bus.d.ts +0 -23
- package/dist/server/src/event-bus.js +0 -75
- package/dist/server/src/event-bus.js.map +0 -1
- package/dist/server/src/forms.d.ts +0 -40
- package/dist/server/src/forms.js +0 -148
- package/dist/server/src/forms.js.map +0 -1
- package/dist/server/src/hooks.d.ts +0 -12
- package/dist/server/src/hooks.js +0 -170
- package/dist/server/src/hooks.js.map +0 -1
- package/dist/server/src/index.client.d.ts +0 -12
- package/dist/server/src/index.client.js +0 -14
- package/dist/server/src/index.client.js.map +0 -1
- package/dist/server/src/index.d.ts +0 -88
- package/dist/server/src/index.js +0 -79
- package/dist/server/src/index.js.map +0 -1
- package/dist/server/src/jsx-runtime/jsx-dev-runtime.d.ts +0 -1
- package/dist/server/src/jsx-runtime/jsx-dev-runtime.js +0 -2
- package/dist/server/src/jsx-runtime/jsx-dev-runtime.js.map +0 -1
- package/dist/server/src/jsx-runtime/jsx-runtime.d.ts +0 -4
- package/dist/server/src/jsx-runtime/jsx-runtime.js +0 -41
- package/dist/server/src/jsx-runtime/jsx-runtime.js.map +0 -1
- package/dist/server/src/jsx-runtime.d.ts +0 -20
- package/dist/server/src/jsx-runtime.js +0 -105
- package/dist/server/src/jsx-runtime.js.map +0 -1
- package/dist/server/src/lifecycle-events.d.ts +0 -108
- package/dist/server/src/lifecycle-events.js +0 -177
- package/dist/server/src/lifecycle-events.js.map +0 -1
- package/dist/server/src/renderComponent.d.ts +0 -13
- package/dist/server/src/renderComponent.js +0 -30
- package/dist/server/src/renderComponent.js.map +0 -1
- package/dist/server/src/renderer.d.ts +0 -2
- package/dist/server/src/renderer.js +0 -31
- package/dist/server/src/renderer.js.map +0 -1
- package/dist/server/src/router.d.ts +0 -55
- package/dist/server/src/router.js +0 -166
- package/dist/server/src/router.js.map +0 -1
- package/dist/server/src/server/api-router.d.ts +0 -15
- package/dist/server/src/server/api-router.js +0 -111
- package/dist/server/src/server/api-router.js.map +0 -1
- package/dist/server/src/server/auth.d.ts +0 -32
- package/dist/server/src/server/auth.js +0 -80
- package/dist/server/src/server/auth.js.map +0 -1
- package/dist/server/src/server/database.d.ts +0 -24
- package/dist/server/src/server/database.js +0 -135
- package/dist/server/src/server/database.js.map +0 -1
- package/dist/server/src/server/index.d.ts +0 -116
- package/dist/server/src/server/index.js +0 -508
- package/dist/server/src/server/index.js.map +0 -1
- package/dist/server/src/server/middleware.d.ts +0 -11
- package/dist/server/src/server/middleware.js +0 -46
- package/dist/server/src/server/middleware.js.map +0 -1
- package/dist/server/src/server/server.d.ts +0 -9
- package/dist/server/src/server/server.js +0 -87
- package/dist/server/src/server/server.js.map +0 -1
- package/dist/server/src/server/templates.d.ts +0 -30
- package/dist/server/src/server/templates.js +0 -208
- package/dist/server/src/server/templates.js.map +0 -1
- package/dist/server/src/server/types.d.ts +0 -38
- package/dist/server/src/server/types.js +0 -4
- package/dist/server/src/server/types.js.map +0 -1
- package/dist/server/src/server/utils.d.ts +0 -70
- package/dist/server/src/server/utils.js +0 -156
- package/dist/server/src/server/utils.js.map +0 -1
- package/dist/server/src/server/wasm.d.ts +0 -9
- package/dist/server/src/server/wasm.js +0 -117
- package/dist/server/src/server/wasm.js.map +0 -1
- package/dist/server/src/server-renderer.d.ts +0 -5
- package/dist/server/src/server-renderer.js +0 -106
- package/dist/server/src/server-renderer.js.map +0 -1
- package/dist/server/src/server-types.d.ts +0 -42
- package/dist/server/src/server-types.js +0 -6
- package/dist/server/src/server-types.js.map +0 -1
- package/dist/server/src/store.d.ts +0 -41
- package/dist/server/src/store.js +0 -99
- package/dist/server/src/store.js.map +0 -1
- package/dist/server/src/types.d.ts +0 -19
- package/dist/server/src/types.js +0 -2
- package/dist/server/src/types.js.map +0 -1
- package/dist/server/src/utils.d.ts +0 -46
- package/dist/server/src/utils.js +0 -144
- package/dist/server/src/utils.js.map +0 -1
- package/dist/server/src/vdom.d.ts +0 -8
- package/dist/server/src/vdom.js +0 -22
- package/dist/server/src/vdom.js.map +0 -1
- package/dist/server/src/wasm.d.ts +0 -36
- package/dist/server/src/wasm.js +0 -159
- package/dist/server/src/wasm.js.map +0 -1
- package/dist/server/tsconfig.server.tsbuildinfo +0 -1
- package/dist/server-renderer/package.json +0 -16
- package/dist/server-renderer.mjs +0 -64
- package/dist/store/package.json +0 -16
- package/dist/types/package.json +0 -16
- package/dist/utils/package.json +0 -16
- package/dist/vdom/package.json +0 -16
- package/dist/wasm/package.json +0 -16
- package/dist/wasm.js +0 -1
- package/dist/wasm.mjs +0 -103
- package/templates/basic-app/docs/rapport_pfe.aux +0 -27
- package/templates/basic-app/docs/rapport_pfe.log +0 -399
- package/templates/basic-app/docs/rapport_pfe.out +0 -10
- package/templates/basic-app/docs/rapport_pfe.pdf +0 -0
- package/templates/basic-app/docs/rapport_pfe.tex +0 -68
- package/templates/basic-app/docs/rapport_pfe.toc +0 -14
- package/templates/complete-app/package-lock.json +0 -2536
- package/templates/go-wasm-app/README.md +0 -38
- package/templates/go-wasm-app/babel.config.js +0 -21
- package/templates/go-wasm-app/build-client.js +0 -49
- package/templates/go-wasm-app/build-wasm.js +0 -237
- package/templates/go-wasm-app/build.config.js +0 -62
- package/templates/go-wasm-app/build.js +0 -218
- package/templates/go-wasm-app/package.json +0 -32
- package/templates/go-wasm-app/public/index.html +0 -128
- package/templates/go-wasm-app/public/styles.css +0 -197
- package/templates/go-wasm-app/public/wasm/example.wasm +0 -0
- package/templates/go-wasm-app/public/wasm/wasm_exec_node.js +0 -39
- package/templates/go-wasm-app/server.js +0 -70
- package/templates/go-wasm-app/src/App.jsx +0 -38
- package/templates/go-wasm-app/src/app.js +0 -173
- package/templates/go-wasm-app/src/client.js +0 -57
- package/templates/go-wasm-app/src/components/Footer.jsx +0 -13
- package/templates/go-wasm-app/src/components/Header.jsx +0 -19
- package/templates/go-wasm-app/src/components/WasmDemo.jsx +0 -120
- package/templates/go-wasm-app/src/main.jsx +0 -12
- package/templates/go-wasm-app/src/wasm/example.go +0 -75
- package/templates/go-wasm-app/tsconfig.server.json +0 -18
- package/templates/go-wasm-app/vite.config.js +0 -45
- package/templates/ssr-template/client.js +0 -58
- package/templates/ssr-template/package-lock.json +0 -2478
- package/templates/ssr-template/public/index.html +0 -47
- package/templates/ssr-template/readme.md +0 -188
- package/templates/ssr-template/server.js +0 -369
- package/templates/ssr-template/server.ts +0 -275
- package/templates/ssr-template/src/client.ts +0 -61
- package/templates/ssr-template/src/pages/index.tsx +0 -51
- package/templates/ssr-template/vite.config.js +0 -57
- /package/{dist/Counter.d.ts → templates/complete-app/api/hello.js} +0 -0
- /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
|
+
}
|
Binary file
|
@@ -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
|
+
}
|