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.
Files changed (128) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.client.cjs +1 -1
  4. package/dist/index.client.js +2 -2
  5. package/dist/index.js +11 -7
  6. package/dist/index.js.map +1 -1
  7. package/dist/{renderer-Din1y3YM.cjs → renderer-BL3gq8cW.cjs} +2 -2
  8. package/dist/{renderer-Din1y3YM.cjs.map → renderer-BL3gq8cW.cjs.map} +1 -1
  9. package/dist/{renderer-Bo9zkUZ_.js → renderer-Dyy-o05F.js} +2 -2
  10. package/dist/{renderer-Bo9zkUZ_.js.map → renderer-Dyy-o05F.js.map} +1 -1
  11. package/dist/{server-renderer-QHt45Ip2.js → server-renderer-C1WXH-zV.js} +99 -73
  12. package/dist/server-renderer-C1WXH-zV.js.map +1 -0
  13. package/dist/server-renderer-Chs-nmJm.cjs +2 -0
  14. package/dist/server-renderer-Chs-nmJm.cjs.map +1 -0
  15. package/dist/server-renderer.cjs +1 -1
  16. package/dist/server-renderer.js +1 -1
  17. package/package.json +1 -1
  18. package/templates/basic-app/src/App.jsx +16 -0
  19. package/templates/basic-app/src/client.jsx +5 -0
  20. package/templates/basic-app/src/components/Counter.jsx +13 -0
  21. package/templates/basic-app/src/jsx-shim.js +3 -0
  22. package/templates/basic-app/src/jsx-shim.ts +7 -0
  23. package/templates/basic-app/src/main.jsx +98 -0
  24. package/templates/basic-app/src/server.js +47 -0
  25. package/templates/complete-app/api/hello.js +0 -0
  26. package/templates/complete-app/lib/frontend-hamroun.js +182 -0
  27. package/templates/complete-app/package.json +18 -0
  28. package/templates/complete-app/pages/about.js +119 -0
  29. package/templates/complete-app/pages/about.jsx +0 -0
  30. package/templates/complete-app/pages/index.js +157 -0
  31. package/templates/complete-app/pages/index.jsx +0 -0
  32. package/templates/complete-app/pages/wasm-demo.js +290 -0
  33. package/templates/complete-app/pages/wasm-demo.jsx +0 -0
  34. package/templates/complete-app/public/client.js +89 -0
  35. package/templates/complete-app/public/index.html +118 -0
  36. package/templates/complete-app/public/styles.css +76 -0
  37. package/templates/complete-app/server.js +226 -0
  38. package/templates/complete-app/src/App.tsx +59 -0
  39. package/templates/complete-app/src/client.tsx +18 -0
  40. package/templates/complete-app/src/server.ts +218 -0
  41. package/templates/complete-app/tsconfig.json +22 -0
  42. package/templates/complete-app/tsconfig.server.json +19 -0
  43. package/templates/{ssr-template → complete-app}/vite.config.js +16 -5
  44. package/templates/complete-app/vite.config.ts +30 -0
  45. package/templates/complete-app/wasm/build.bat +0 -0
  46. package/templates/complete-app/wasm/build.sh +0 -0
  47. package/templates/complete-app/wasm/example.go +0 -0
  48. package/templates/fullstack-app/build/main.css +874 -874
  49. package/templates/fullstack-app/build/main.css.map +7 -7
  50. package/templates/fullstack-app/build/main.js +996 -967
  51. package/templates/fullstack-app/build/main.js.map +7 -7
  52. package/templates/fullstack-app/package-lock.json +6301 -0
  53. package/templates/fullstack-app/public/styles.css +768 -768
  54. package/templates/go/example.go +154 -99
  55. package/templates/ssr-template/dist/client/assets/main-D-VH3xOb.js +1 -0
  56. package/templates/ssr-template/dist/client/index.html +23 -0
  57. package/templates/ssr-template/dist/client.js +951 -0
  58. package/templates/ssr-template/dist/server.js +739 -0
  59. package/templates/ssr-template/esbuild.config.js +33 -0
  60. package/templates/ssr-template/jsx-shim.js +1 -0
  61. package/templates/ssr-template/package.json +14 -8
  62. package/templates/ssr-template/src/App.tsx +847 -49
  63. package/templates/ssr-template/src/client.tsx +3 -17
  64. package/templates/ssr-template/src/server.ts +21 -204
  65. package/templates/ssr-template/tsconfig.json +9 -8
  66. package/templates/ssr-template/tsconfig.server.json +6 -14
  67. package/templates/ssr-template/vite.config.ts +19 -17
  68. package/templates/wasm/build-wasm.js +228 -0
  69. package/templates/wasm/dist/assets/index-BNqTDBdE.js +295 -0
  70. package/templates/wasm/dist/example.wasm +0 -0
  71. package/templates/wasm/dist/index.html +53 -0
  72. package/templates/{go-wasm-app/public/wasm → wasm/dist}/wasm_exec.js +572 -561
  73. package/templates/wasm/esbuild.config.js +63 -0
  74. package/templates/wasm/go/main.go +256 -0
  75. package/templates/wasm/go/wasm_exec.js +0 -0
  76. package/templates/wasm/index.html +97 -0
  77. package/templates/wasm/jsx-shim.js +9 -0
  78. package/templates/wasm/package-lock.json +4577 -0
  79. package/templates/wasm/package.json +25 -0
  80. package/templates/wasm/public/example.wasm +0 -0
  81. package/templates/wasm/public/wasm_exec.js +572 -0
  82. package/templates/wasm/src/App.tsx +550 -0
  83. package/templates/wasm/src/client.tsx +220 -0
  84. package/templates/wasm/src/index.tsx +21 -0
  85. package/templates/wasm/src/server.ts +145 -0
  86. package/templates/wasm/tsconfig.json +21 -0
  87. package/templates/wasm/tsconfig.node.json +13 -0
  88. package/templates/wasm/tsconfig.server.json +23 -0
  89. package/templates/wasm/vite.config.ts +38 -0
  90. package/templates/wasm/wasm-loader.js +103 -0
  91. package/dist/server-renderer-CqIpQ-od.cjs +0 -2
  92. package/dist/server-renderer-CqIpQ-od.cjs.map +0 -1
  93. package/dist/server-renderer-QHt45Ip2.js.map +0 -1
  94. package/templates/basic-app/bun.lock +0 -196
  95. package/templates/basic-app/docs/rapport_pfe.aux +0 -27
  96. package/templates/basic-app/docs/rapport_pfe.out +0 -10
  97. package/templates/basic-app/docs/rapport_pfe.pdf +0 -0
  98. package/templates/basic-app/docs/rapport_pfe.tex +0 -68
  99. package/templates/basic-app/docs/rapport_pfe.toc +0 -14
  100. package/templates/basic-app/package-lock.json +0 -4185
  101. package/templates/go-wasm-app/README.md +0 -38
  102. package/templates/go-wasm-app/babel.config.js +0 -15
  103. package/templates/go-wasm-app/build-client.js +0 -49
  104. package/templates/go-wasm-app/build-wasm.js +0 -237
  105. package/templates/go-wasm-app/package.json +0 -23
  106. package/templates/go-wasm-app/public/index.html +0 -128
  107. package/templates/go-wasm-app/public/styles.css +0 -197
  108. package/templates/go-wasm-app/public/wasm/example.wasm +0 -0
  109. package/templates/go-wasm-app/public/wasm/wasm_exec_node.js +0 -39
  110. package/templates/go-wasm-app/server.js +0 -521
  111. package/templates/go-wasm-app/src/App.jsx +0 -38
  112. package/templates/go-wasm-app/src/app.js +0 -153
  113. package/templates/go-wasm-app/src/client.js +0 -57
  114. package/templates/go-wasm-app/src/components/Footer.jsx +0 -13
  115. package/templates/go-wasm-app/src/components/Header.jsx +0 -19
  116. package/templates/go-wasm-app/src/components/WasmDemo.jsx +0 -120
  117. package/templates/go-wasm-app/src/main.jsx +0 -12
  118. package/templates/go-wasm-app/src/wasm/example.go +0 -75
  119. package/templates/go-wasm-app/tsconfig.server.json +0 -18
  120. package/templates/go-wasm-app/vite.config.js +0 -34
  121. package/templates/ssr-template/package-lock.json +0 -2478
  122. package/templates/ssr-template/public/index.html +0 -47
  123. package/templates/ssr-template/server.js +0 -369
  124. /package/templates/{ssr-template → complete-app}/client.js +0 -0
  125. /package/templates/{ssr-template → complete-app}/readme.md +0 -0
  126. /package/templates/{ssr-template → complete-app}/server.ts +0 -0
  127. /package/templates/{ssr-template → complete-app}/src/client.ts +0 -0
  128. /package/templates/{ssr-template → complete-app}/src/pages/index.tsx +0 -0
@@ -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
- // Basic arithmetic functions
13
- func add(this js.Value, args []js.Value) interface{} {
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 js.ValueOf("Error: add requires 2 arguments")
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
- a := args[0].Int()
19
- b := args[1].Int()
20
- return js.ValueOf(a + b)
48
+ // Return the result
49
+ return fmt.Sprintf("%g", a+b)
21
50
  }
22
51
 
23
- func subtract(this js.Value, args []js.Value) interface{} {
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 js.ValueOf("Error: subtract requires 2 arguments")
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
- a := args[0].Int()
29
- b := args[1].Int()
30
- return js.ValueOf(a - b)
71
+ // Return the result
72
+ return fmt.Sprintf("%g", a-b)
31
73
  }
32
74
 
33
- func multiply(this js.Value, args []js.Value) interface{} {
75
+ // goMultiply multiplies two numbers
76
+ func goMultiply(this js.Value, args []js.Value) interface{} {
34
77
  if len(args) != 2 {
35
- return js.ValueOf("Error: multiply requires 2 arguments")
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
- a := args[0].Int()
39
- b := args[1].Int()
40
- return js.ValueOf(a * b)
94
+ // Return the result
95
+ return fmt.Sprintf("%g", a*b)
41
96
  }
42
97
 
43
- // String operations
44
- func concat(this js.Value, args []js.Value) interface{} {
45
- if len(args) < 1 {
46
- return js.ValueOf("")
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
- result := ""
50
- for _, arg := range args {
51
- result += arg.String()
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
- return js.ValueOf(result)
123
+
124
+ // Return the result
125
+ return fmt.Sprintf("%g", a/b)
54
126
  }
55
127
 
56
- // JSON operations
57
- func parseJSON(this js.Value, args []js.Value) interface{} {
128
+ // goReverseString reverses a string
129
+ func goReverseString(this js.Value, args []js.Value) interface{} {
58
130
  if len(args) != 1 {
59
- return js.ValueOf("Error: parseJSON requires 1 argument")
131
+ return map[string]interface{}{
132
+ "error": "Expected 1 argument: string",
133
+ }
60
134
  }
61
135
 
62
- jsonStr := args[0].String()
63
- var result interface{}
64
- err := json.Unmarshal([]byte(jsonStr), &result)
65
- if err != nil {
66
- return js.ValueOf("Error parsing JSON: " + err.Error())
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
- // Convert result to JS value
70
- return mapToJSValue(result)
144
+ return string(runes)
71
145
  }
72
146
 
73
- // Helper functions for JSON conversion
74
- func mapToJSValue(value interface{}) js.Value {
75
- switch v := value.(type) {
76
- case map[string]interface{}:
77
- result := js.Global().Get("Object").New()
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
- return result
82
- case []interface{}:
83
- result := js.Global().Get("Array").New(len(v))
84
- for i, val := range v {
85
- result.SetIndex(i, mapToJSValue(val))
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
- // Special utility functions for string handling between Go and JS
102
- func __stringToGo(this js.Value, args []js.Value) interface{} {
103
- if len(args) != 1 {
104
- return js.ValueOf(-1)
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
- func __stringFromGo(this js.Value, args []js.Value) interface{} {
110
- if len(args) != 1 {
111
- return js.ValueOf("")
172
+ // Calculate factorial
173
+ result := int64(1)
174
+ for i := int64(2); i <= n; i++ {
175
+ result *= i
112
176
  }
113
- return args[0] // Pass through
177
+
178
+ return fmt.Sprintf("%d", result)
114
179
  }
115
180
 
116
- func __objectToGo(this js.Value, args []js.Value) interface{} {
117
- if len(args) != 1 {
118
- return js.ValueOf(-1)
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
- func __objectFromGo(this js.Value, args []js.Value) interface{} {
124
- if len(args) != 1 {
125
- return js.ValueOf("")
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
- func main() {
131
- fmt.Println("Go WebAssembly module initialized")
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>