frontend-hamroun 1.2.80 → 1.2.83
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/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.client.cjs +1 -1
- package/dist/index.client.js +2 -2
- package/dist/index.js +11 -7
- package/dist/index.js.map +1 -1
- package/dist/{renderer-Din1y3YM.cjs → renderer-BL3gq8cW.cjs} +2 -2
- package/dist/{renderer-Din1y3YM.cjs.map → renderer-BL3gq8cW.cjs.map} +1 -1
- package/dist/{renderer-Bo9zkUZ_.js → renderer-Dyy-o05F.js} +2 -2
- package/dist/{renderer-Bo9zkUZ_.js.map → renderer-Dyy-o05F.js.map} +1 -1
- package/dist/{server-renderer-QHt45Ip2.js → server-renderer-C1WXH-zV.js} +99 -73
- package/dist/server-renderer-C1WXH-zV.js.map +1 -0
- package/dist/server-renderer-Chs-nmJm.cjs +2 -0
- package/dist/server-renderer-Chs-nmJm.cjs.map +1 -0
- package/dist/server-renderer.cjs +1 -1
- package/dist/server-renderer.js +1 -1
- package/package.json +1 -1
- package/templates/basic-app/src/App.jsx +16 -0
- package/templates/basic-app/src/client.jsx +5 -0
- package/templates/basic-app/src/components/Counter.jsx +13 -0
- package/templates/basic-app/src/jsx-shim.js +3 -0
- package/templates/basic-app/src/jsx-shim.ts +7 -0
- package/templates/basic-app/src/main.jsx +98 -0
- package/templates/basic-app/src/server.js +47 -0
- package/templates/complete-app/api/hello.js +0 -0
- package/templates/complete-app/lib/frontend-hamroun.js +182 -0
- package/templates/complete-app/package.json +18 -0
- package/templates/complete-app/pages/about.js +119 -0
- package/templates/complete-app/pages/about.jsx +0 -0
- package/templates/complete-app/pages/index.js +157 -0
- package/templates/complete-app/pages/index.jsx +0 -0
- package/templates/complete-app/pages/wasm-demo.js +290 -0
- package/templates/complete-app/pages/wasm-demo.jsx +0 -0
- package/templates/complete-app/public/client.js +89 -0
- package/templates/complete-app/public/index.html +118 -0
- package/templates/complete-app/public/styles.css +76 -0
- package/templates/complete-app/server.js +226 -0
- package/templates/complete-app/src/App.tsx +59 -0
- package/templates/complete-app/src/client.tsx +18 -0
- package/templates/complete-app/src/server.ts +218 -0
- package/templates/complete-app/tsconfig.json +22 -0
- package/templates/complete-app/tsconfig.server.json +19 -0
- package/templates/{ssr-template → complete-app}/vite.config.js +16 -5
- package/templates/complete-app/vite.config.ts +30 -0
- 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.css +874 -874
- package/templates/fullstack-app/build/main.css.map +7 -7
- package/templates/fullstack-app/build/main.js +996 -967
- package/templates/fullstack-app/build/main.js.map +7 -7
- package/templates/fullstack-app/package-lock.json +6301 -0
- package/templates/fullstack-app/public/styles.css +768 -768
- package/templates/go/example.go +154 -99
- package/templates/ssr-template/dist/client/assets/main-D-VH3xOb.js +1 -0
- package/templates/ssr-template/dist/client/index.html +23 -0
- package/templates/ssr-template/dist/client.js +951 -0
- package/templates/ssr-template/dist/server.js +739 -0
- package/templates/ssr-template/esbuild.config.js +33 -0
- package/templates/ssr-template/jsx-shim.js +1 -0
- package/templates/ssr-template/package.json +14 -8
- package/templates/ssr-template/src/App.tsx +847 -49
- package/templates/ssr-template/src/client.tsx +3 -17
- package/templates/ssr-template/src/server.ts +21 -204
- package/templates/ssr-template/tsconfig.json +9 -8
- package/templates/ssr-template/tsconfig.server.json +6 -14
- package/templates/ssr-template/vite.config.ts +19 -17
- package/templates/wasm/build-wasm.js +228 -0
- package/templates/wasm/dist/assets/index-BNqTDBdE.js +295 -0
- package/templates/wasm/dist/example.wasm +0 -0
- package/templates/wasm/dist/index.html +53 -0
- package/templates/{go-wasm-app/public/wasm → wasm/dist}/wasm_exec.js +572 -561
- 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/wasm/package-lock.json +4577 -0
- package/templates/wasm/package.json +25 -0
- package/templates/wasm/public/example.wasm +0 -0
- package/templates/wasm/public/wasm_exec.js +572 -0
- package/templates/wasm/src/App.tsx +550 -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 +38 -0
- package/templates/wasm/wasm-loader.js +103 -0
- package/dist/server-renderer-CqIpQ-od.cjs +0 -2
- package/dist/server-renderer-CqIpQ-od.cjs.map +0 -1
- package/dist/server-renderer-QHt45Ip2.js.map +0 -1
- package/templates/basic-app/bun.lock +0 -196
- package/templates/basic-app/docs/rapport_pfe.aux +0 -27
- 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/basic-app/package-lock.json +0 -4185
- package/templates/go-wasm-app/README.md +0 -38
- package/templates/go-wasm-app/babel.config.js +0 -15
- 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/package.json +0 -23
- 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 -521
- package/templates/go-wasm-app/src/App.jsx +0 -38
- package/templates/go-wasm-app/src/app.js +0 -153
- 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 -34
- package/templates/ssr-template/package-lock.json +0 -2478
- package/templates/ssr-template/public/index.html +0 -47
- package/templates/ssr-template/server.js +0 -369
- /package/templates/{ssr-template → complete-app}/client.js +0 -0
- /package/templates/{ssr-template → complete-app}/readme.md +0 -0
- /package/templates/{ssr-template → complete-app}/server.ts +0 -0
- /package/templates/{ssr-template → complete-app}/src/client.ts +0 -0
- /package/templates/{ssr-template → complete-app}/src/pages/index.tsx +0 -0
package/templates/go/example.go
CHANGED
@@ -4,147 +4,202 @@
|
|
4
4
|
package main
|
5
5
|
|
6
6
|
import (
|
7
|
-
"encoding/json"
|
8
7
|
"fmt"
|
8
|
+
"strconv"
|
9
|
+
"strings"
|
9
10
|
"syscall/js"
|
10
11
|
)
|
11
12
|
|
12
|
-
//
|
13
|
-
func
|
13
|
+
// Main function required for Go WebAssembly
|
14
|
+
func main() {
|
15
|
+
// Set up global functions that will be accessible from JavaScript
|
16
|
+
js.Global().Set("goAdd", js.FuncOf(goAdd))
|
17
|
+
js.Global().Set("goSubtract", js.FuncOf(goSubtract))
|
18
|
+
js.Global().Set("goMultiply", js.FuncOf(goMultiply))
|
19
|
+
js.Global().Set("goDivide", js.FuncOf(goDivide))
|
20
|
+
js.Global().Set("goReverseString", js.FuncOf(goReverseString))
|
21
|
+
js.Global().Set("goCalculateFactorial", js.FuncOf(goCalculateFactorial))
|
22
|
+
js.Global().Set("goProcessArray", js.FuncOf(goProcessArray))
|
23
|
+
|
24
|
+
// Keep the Go program running until the context is done
|
25
|
+
// This is necessary for WebAssembly modules
|
26
|
+
<-make(chan bool)
|
27
|
+
}
|
28
|
+
|
29
|
+
// goAdd adds two numbers and returns the result
|
30
|
+
func goAdd(this js.Value, args []js.Value) interface{} {
|
14
31
|
if len(args) != 2 {
|
15
|
-
return
|
32
|
+
return map[string]interface{}{
|
33
|
+
"error": "Expected 2 arguments: number, number",
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
// Parse string arguments as numbers
|
38
|
+
a, errA := strconv.ParseFloat(args[0].String(), 64)
|
39
|
+
b, errB := strconv.ParseFloat(args[1].String(), 64)
|
40
|
+
|
41
|
+
// Check for parsing errors
|
42
|
+
if errA != nil || errB != nil {
|
43
|
+
return map[string]interface{}{
|
44
|
+
"error": "Arguments must be valid numbers",
|
45
|
+
}
|
16
46
|
}
|
17
47
|
|
18
|
-
|
19
|
-
|
20
|
-
return js.ValueOf(a + b)
|
48
|
+
// Return the result
|
49
|
+
return fmt.Sprintf("%g", a+b)
|
21
50
|
}
|
22
51
|
|
23
|
-
|
52
|
+
// goSubtract subtracts the second number from the first
|
53
|
+
func goSubtract(this js.Value, args []js.Value) interface{} {
|
24
54
|
if len(args) != 2 {
|
25
|
-
return
|
55
|
+
return map[string]interface{}{
|
56
|
+
"error": "Expected 2 arguments: number, number",
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
// Parse string arguments as numbers
|
61
|
+
a, errA := strconv.ParseFloat(args[0].String(), 64)
|
62
|
+
b, errB := strconv.ParseFloat(args[1].String(), 64)
|
63
|
+
|
64
|
+
// Check for parsing errors
|
65
|
+
if errA != nil || errB != nil {
|
66
|
+
return map[string]interface{}{
|
67
|
+
"error": "Arguments must be valid numbers",
|
68
|
+
}
|
26
69
|
}
|
27
70
|
|
28
|
-
|
29
|
-
|
30
|
-
return js.ValueOf(a - b)
|
71
|
+
// Return the result
|
72
|
+
return fmt.Sprintf("%g", a-b)
|
31
73
|
}
|
32
74
|
|
33
|
-
|
75
|
+
// goMultiply multiplies two numbers
|
76
|
+
func goMultiply(this js.Value, args []js.Value) interface{} {
|
34
77
|
if len(args) != 2 {
|
35
|
-
return
|
78
|
+
return map[string]interface{}{
|
79
|
+
"error": "Expected 2 arguments: number, number",
|
80
|
+
}
|
81
|
+
}
|
82
|
+
|
83
|
+
// Parse string arguments as numbers
|
84
|
+
a, errA := strconv.ParseFloat(args[0].String(), 64)
|
85
|
+
b, errB := strconv.ParseFloat(args[1].String(), 64)
|
86
|
+
|
87
|
+
// Check for parsing errors
|
88
|
+
if errA != nil || errB != nil {
|
89
|
+
return map[string]interface{}{
|
90
|
+
"error": "Arguments must be valid numbers",
|
91
|
+
}
|
36
92
|
}
|
37
93
|
|
38
|
-
|
39
|
-
|
40
|
-
return js.ValueOf(a * b)
|
94
|
+
// Return the result
|
95
|
+
return fmt.Sprintf("%g", a*b)
|
41
96
|
}
|
42
97
|
|
43
|
-
//
|
44
|
-
func
|
45
|
-
if len(args)
|
46
|
-
return
|
98
|
+
// goDivide divides the first number by the second
|
99
|
+
func goDivide(this js.Value, args []js.Value) interface{} {
|
100
|
+
if len(args) != 2 {
|
101
|
+
return map[string]interface{}{
|
102
|
+
"error": "Expected 2 arguments: number, number",
|
103
|
+
}
|
104
|
+
}
|
105
|
+
|
106
|
+
// Parse string arguments as numbers
|
107
|
+
a, errA := strconv.ParseFloat(args[0].String(), 64)
|
108
|
+
b, errB := strconv.ParseFloat(args[1].String(), 64)
|
109
|
+
|
110
|
+
// Check for parsing errors
|
111
|
+
if errA != nil || errB != nil {
|
112
|
+
return map[string]interface{}{
|
113
|
+
"error": "Arguments must be valid numbers",
|
114
|
+
}
|
47
115
|
}
|
48
116
|
|
49
|
-
|
50
|
-
|
51
|
-
|
117
|
+
// Check for division by zero
|
118
|
+
if b == 0 {
|
119
|
+
return map[string]interface{}{
|
120
|
+
"error": "Division by zero is not allowed",
|
121
|
+
}
|
52
122
|
}
|
53
|
-
|
123
|
+
|
124
|
+
// Return the result
|
125
|
+
return fmt.Sprintf("%g", a/b)
|
54
126
|
}
|
55
127
|
|
56
|
-
//
|
57
|
-
func
|
128
|
+
// goReverseString reverses a string
|
129
|
+
func goReverseString(this js.Value, args []js.Value) interface{} {
|
58
130
|
if len(args) != 1 {
|
59
|
-
return
|
131
|
+
return map[string]interface{}{
|
132
|
+
"error": "Expected 1 argument: string",
|
133
|
+
}
|
60
134
|
}
|
61
135
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
136
|
+
input := args[0].String()
|
137
|
+
runes := []rune(input)
|
138
|
+
|
139
|
+
// Reverse the string
|
140
|
+
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
|
141
|
+
runes[i], runes[j] = runes[j], runes[i]
|
67
142
|
}
|
68
143
|
|
69
|
-
|
70
|
-
return mapToJSValue(result)
|
144
|
+
return string(runes)
|
71
145
|
}
|
72
146
|
|
73
|
-
//
|
74
|
-
func
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
for key, val := range v {
|
79
|
-
result.Set(key, mapToJSValue(val))
|
147
|
+
// goCalculateFactorial calculates the factorial of a number
|
148
|
+
func goCalculateFactorial(this js.Value, args []js.Value) interface{} {
|
149
|
+
if len(args) != 1 {
|
150
|
+
return map[string]interface{}{
|
151
|
+
"error": "Expected 1 argument: number",
|
80
152
|
}
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
153
|
+
}
|
154
|
+
|
155
|
+
// Parse string argument as number
|
156
|
+
n, err := strconv.ParseInt(args[0].String(), 10, 64)
|
157
|
+
|
158
|
+
// Check for parsing errors
|
159
|
+
if err != nil {
|
160
|
+
return map[string]interface{}{
|
161
|
+
"error": "Argument must be a valid integer",
|
86
162
|
}
|
87
|
-
return result
|
88
|
-
case string:
|
89
|
-
return js.ValueOf(v)
|
90
|
-
case float64:
|
91
|
-
return js.ValueOf(v)
|
92
|
-
case bool:
|
93
|
-
return js.ValueOf(v)
|
94
|
-
case nil:
|
95
|
-
return js.ValueOf(nil)
|
96
|
-
default:
|
97
|
-
return js.ValueOf(fmt.Sprint(v))
|
98
163
|
}
|
99
|
-
}
|
100
164
|
|
101
|
-
//
|
102
|
-
|
103
|
-
|
104
|
-
|
165
|
+
// Check for negative numbers
|
166
|
+
if n < 0 {
|
167
|
+
return map[string]interface{}{
|
168
|
+
"error": "Factorial is not defined for negative numbers",
|
169
|
+
}
|
105
170
|
}
|
106
|
-
return args[0] // Pass through
|
107
|
-
}
|
108
171
|
|
109
|
-
|
110
|
-
|
111
|
-
|
172
|
+
// Calculate factorial
|
173
|
+
result := int64(1)
|
174
|
+
for i := int64(2); i <= n; i++ {
|
175
|
+
result *= i
|
112
176
|
}
|
113
|
-
|
177
|
+
|
178
|
+
return fmt.Sprintf("%d", result)
|
114
179
|
}
|
115
180
|
|
116
|
-
|
117
|
-
|
118
|
-
|
181
|
+
// goProcessArray processes an array of values
|
182
|
+
func goProcessArray(this js.Value, args []js.Value) interface{} {
|
183
|
+
if len(args) != 1 || args[0].Type() != js.TypeString {
|
184
|
+
return map[string]interface{}{
|
185
|
+
"error": "Expected 1 argument: comma-separated string",
|
186
|
+
}
|
119
187
|
}
|
120
|
-
return args[0] // Pass through
|
121
|
-
}
|
122
188
|
|
123
|
-
|
124
|
-
|
125
|
-
|
189
|
+
// Split the input string by commas
|
190
|
+
input := args[0].String()
|
191
|
+
parts := strings.Split(input, ",")
|
192
|
+
|
193
|
+
// Process each part
|
194
|
+
var results []string
|
195
|
+
for _, part := range parts {
|
196
|
+
// Trim whitespace
|
197
|
+
trimmed := strings.TrimSpace(part)
|
198
|
+
|
199
|
+
// Convert to uppercase and add to results
|
200
|
+
results = append(results, strings.ToUpper(trimmed))
|
126
201
|
}
|
127
|
-
return args[0] // Pass through
|
128
|
-
}
|
129
202
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
// Register functions to make available to JavaScript
|
134
|
-
js.Global().Set("goAdd", js.FuncOf(add))
|
135
|
-
js.Global().Set("goSubtract", js.FuncOf(subtract))
|
136
|
-
js.Global().Set("goMultiply", js.FuncOf(multiply))
|
137
|
-
js.Global().Set("goConcat", js.FuncOf(concat))
|
138
|
-
js.Global().Set("goParseJSON", js.FuncOf(parseJSON))
|
139
|
-
|
140
|
-
// Register special utility functions for frontend-hamroun integration
|
141
|
-
js.Global().Set("__stringToGo", js.FuncOf(__stringToGo))
|
142
|
-
js.Global().Set("__stringFromGo", js.FuncOf(__stringFromGo))
|
143
|
-
js.Global().Set("__objectToGo", js.FuncOf(__objectToGo))
|
144
|
-
js.Global().Set("__objectFromGo", js.FuncOf(__objectFromGo))
|
145
|
-
|
146
|
-
// Keep the program running
|
147
|
-
c := make(chan struct{}, 0)
|
148
|
-
fmt.Println("Go WebAssembly module ready")
|
149
|
-
<-c
|
203
|
+
// Join the processed parts with commas
|
204
|
+
return strings.Join(results, ",")
|
150
205
|
}
|
@@ -0,0 +1 @@
|
|
1
|
+
import{useState as l,useEffect as g,jsx as e,hydrate as f,render as y}from"frontend-hamroun";(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const t of document.querySelectorAll('link[rel="modulepreload"]'))o(t);new MutationObserver(t=>{for(const r of t)if(r.type==="childList")for(const i of r.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&o(i)}).observe(document,{childList:!0,subtree:!0});function s(t){const r={};return t.integrity&&(r.integrity=t.integrity),t.referrerPolicy&&(r.referrerPolicy=t.referrerPolicy),t.crossOrigin==="use-credentials"?r.credentials="include":t.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function o(t){if(t.ep)return;t.ep=!0;const r=s(t);fetch(t.href,r)}})();function c({path:a="/",dev:n=!1,timestamp:s}){const[o,t]=l(0),[r,i]=l(new Date().toLocaleTimeString());return g(()=>{const u=setInterval(()=>{i(new Date().toLocaleTimeString())},1e3);return()=>clearInterval(u)},[]),e("div",{className:"container"},[e("header",{style:{background:"linear-gradient(135deg, #667eea 0%, #764ba2 100%)",color:"white",padding:"2rem",borderRadius:"12px",marginBottom:"2rem",textAlign:"center"}},[e("h1",{},"🚀 Frontend Hamroun SSR"),e("p",{},"Server-Side Rendering with Client Hydration"),n&&e("div",{style:{background:"rgba(255, 255, 255, 0.2)",padding:"0.5rem 1rem",borderRadius:"8px",fontSize:"0.9rem",marginTop:"1rem"}},"🔥 Development Mode - Hot Reload Active")]),e("main",{},[e("section",{style:{background:"#f8f9fa",padding:"2rem",borderRadius:"8px",marginBottom:"2rem"}},[e("h2",{},"📍 Route Information"),e("p",{},[e("strong",{},"Current path: "),a]),e("p",{},[e("strong",{},"Render time: "),s||"Client-side"]),e("p",{},[e("strong",{},"Current time: "),r])]),e("section",{style:{background:"#e3f2fd",padding:"2rem",borderRadius:"8px",marginBottom:"2rem"}},[e("h2",{},"🎛️ Interactive Counter"),e("p",{},"This demonstrates client-side hydration:"),e("div",{style:{display:"flex",alignItems:"center",gap:"1rem",marginTop:"1rem"}},[e("button",{onClick:()=>t(o-1),style:{background:"#f44336",color:"white",border:"none",padding:"0.5rem 1rem",borderRadius:"4px",cursor:"pointer"}},"-"),e("span",{style:{fontSize:"1.5rem",fontWeight:"bold",minWidth:"60px",textAlign:"center"}},o.toString()),e("button",{onClick:()=>t(o+1),style:{background:"#4caf50",color:"white",border:"none",padding:"0.5rem 1rem",borderRadius:"4px",cursor:"pointer"}},"+")])]),e("section",{style:{background:"#fff3e0",padding:"2rem",borderRadius:"8px"}},[e("h2",{},"✨ Framework Features"),e("ul",{style:{lineHeight:"1.8"}},[e("li",{},"🔄 Server-Side Rendering (SSR)"),e("li",{},"💧 Client-Side Hydration"),e("li",{},"🔥 Hot Reload in Development"),e("li",{},"🎣 React-like Hooks (useState, useEffect)"),e("li",{},"⚡ Fast Development Server"),e("li",{},"📦 Optimized Production Builds"),e("li",{},"🎨 Component-Based Architecture"),e("li",{},"🔧 TypeScript Support")])])]),e("footer",{style:{textAlign:"center",padding:"2rem",marginTop:"2rem",borderTop:"1px solid #eee"}},[e("p",{},"Built with ❤️ using Frontend Hamroun"),e("p",{style:{fontSize:"0.9rem",color:"#666"}},["Edit ",e("code",{},"src/App.tsx")," and save to see changes"])])])}const p=window.__INITIAL_DATA__||{path:window.location.pathname,dev:!1,timestamp:new Date().toISOString()},d=document.getElementById("app");if(!d)throw new Error("Root element not found");function m(){try{d.hasChildNodes()?(console.log("🔄 Hydrating SSR content"),f(e(c,p),d)):(console.log("🚀 Rendering app from scratch"),y(e(c,p),d)),console.log("✅ App started successfully")}catch(a){console.error("❌ Error starting app:",a),d.innerHTML='<div style="color: red; padding: 20px;">Error loading application</div>'}}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",m):m();
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8">
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6
|
+
<title>Frontend Hamroun SSR App</title>
|
7
|
+
<style>
|
8
|
+
body {
|
9
|
+
margin: 0;
|
10
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
11
|
+
}
|
12
|
+
.container {
|
13
|
+
max-width: 1200px;
|
14
|
+
margin: 0 auto;
|
15
|
+
padding: 20px;
|
16
|
+
}
|
17
|
+
</style>
|
18
|
+
<script type="module" crossorigin src="/assets/main-D-VH3xOb.js"></script>
|
19
|
+
</head>
|
20
|
+
<body>
|
21
|
+
<div id="app"></div>
|
22
|
+
</body>
|
23
|
+
</html>
|