frontend-hamroun 1.2.77 → 1.2.79

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 (72) hide show
  1. package/dist/batch/package.json +1 -1
  2. package/dist/client-router/package.json +1 -1
  3. package/dist/component/package.json +1 -1
  4. package/dist/context/package.json +1 -1
  5. package/dist/event-bus/package.json +1 -1
  6. package/dist/forms/package.json +1 -1
  7. package/dist/hooks/package.json +1 -1
  8. package/dist/index.mjs +1 -0
  9. package/dist/jsx-runtime/package.json +1 -1
  10. package/dist/lifecycle-events/package.json +1 -1
  11. package/dist/package.json +1 -1
  12. package/dist/render-component/package.json +1 -1
  13. package/dist/renderer/package.json +1 -1
  14. package/dist/router/package.json +1 -1
  15. package/dist/server/package.json +1 -1
  16. package/dist/server/src/index.js +24 -23
  17. package/dist/server/src/index.js.map +1 -1
  18. package/dist/server/src/renderComponent.d.ts +8 -9
  19. package/dist/server/src/renderComponent.js +10 -5
  20. package/dist/server/src/renderComponent.js.map +1 -1
  21. package/dist/server/src/server/index.d.ts +23 -34
  22. package/dist/server/src/server/index.js +170 -50
  23. package/dist/server/src/server/index.js.map +1 -1
  24. package/dist/server/src/server/templates.d.ts +2 -0
  25. package/dist/server/src/server/templates.js +9 -5
  26. package/dist/server/src/server/templates.js.map +1 -1
  27. package/dist/server/src/server/utils.d.ts +1 -1
  28. package/dist/server/src/server/utils.js +1 -1
  29. package/dist/server/src/server/utils.js.map +1 -1
  30. package/dist/server/tsconfig.server.tsbuildinfo +1 -1
  31. package/dist/server-renderer/package.json +1 -1
  32. package/dist/store/package.json +1 -1
  33. package/dist/types/package.json +1 -1
  34. package/dist/utils/package.json +1 -1
  35. package/dist/vdom/package.json +1 -1
  36. package/dist/wasm/package.json +1 -1
  37. package/package.json +1 -1
  38. package/templates/complete-app/client.js +58 -0
  39. package/templates/complete-app/package-lock.json +2536 -0
  40. package/templates/complete-app/package.json +8 -31
  41. package/templates/complete-app/pages/about.js +119 -0
  42. package/templates/complete-app/pages/index.js +157 -0
  43. package/templates/complete-app/pages/wasm-demo.js +290 -0
  44. package/templates/complete-app/public/client.js +80 -0
  45. package/templates/complete-app/public/index.html +47 -0
  46. package/templates/complete-app/public/styles.css +446 -212
  47. package/templates/complete-app/readme.md +188 -0
  48. package/templates/complete-app/server.js +417 -0
  49. package/templates/complete-app/server.ts +275 -0
  50. package/templates/complete-app/src/App.tsx +59 -0
  51. package/templates/complete-app/src/client.ts +61 -0
  52. package/templates/complete-app/src/client.tsx +18 -0
  53. package/templates/complete-app/src/pages/index.tsx +51 -0
  54. package/templates/complete-app/src/server.ts +218 -0
  55. package/templates/complete-app/tsconfig.json +22 -0
  56. package/templates/complete-app/tsconfig.server.json +19 -0
  57. package/templates/complete-app/vite.config.js +57 -0
  58. package/templates/complete-app/vite.config.ts +30 -0
  59. package/templates/go/example.go +154 -99
  60. package/templates/complete-app/build.js +0 -284
  61. package/templates/complete-app/src/api/index.js +0 -31
  62. package/templates/complete-app/src/client.js +0 -93
  63. package/templates/complete-app/src/components/App.js +0 -66
  64. package/templates/complete-app/src/components/Footer.js +0 -19
  65. package/templates/complete-app/src/components/Header.js +0 -38
  66. package/templates/complete-app/src/pages/About.js +0 -59
  67. package/templates/complete-app/src/pages/Home.js +0 -54
  68. package/templates/complete-app/src/pages/WasmDemo.js +0 -136
  69. package/templates/complete-app/src/server.js +0 -186
  70. package/templates/complete-app/src/wasm/build.bat +0 -16
  71. package/templates/complete-app/src/wasm/build.sh +0 -16
  72. package/templates/complete-app/src/wasm/example.go +0 -101
@@ -1,345 +1,579 @@
1
- /* Base styles */
1
+ /* Color scheme */
2
2
  :root {
3
- --primary-color: #4a89dc;
4
- --secondary-color: #5d9cec;
5
- --accent-color: #967adc;
6
- --success-color: #8cc152;
7
- --error-color: #da4453;
8
- --background-color: #f5f7fa;
9
- --text-color: #434a54;
10
- --border-color: #e6e9ed;
3
+ --primary-color: #0066cc;
4
+ --primary-hover: #004c99;
5
+ --secondary-color: #6c757d;
6
+ --accent-color: #ff5722;
7
+ --success-color: #28a745;
8
+ --warning-color: #ffc107;
9
+ --danger-color: #dc3545;
10
+ --info-color: #17a2b8;
11
+
12
+ /* Light theme colors */
13
+ --light-bg: #f8f9fa;
14
+ --light-bg-secondary: #ffffff;
15
+ --light-text: #212529;
16
+ --light-border: #dee2e6;
17
+
18
+ /* Dark theme colors */
19
+ --dark-bg: #343a40;
20
+ --dark-bg-secondary: #495057;
21
+ --dark-text: #f8f9fa;
22
+ --dark-border: #6c757d;
23
+
24
+ /* Spacing */
25
+ --spacing-xs: 0.25rem;
26
+ --spacing-sm: 0.5rem;
27
+ --spacing-md: 1rem;
28
+ --spacing-lg: 1.5rem;
29
+ --spacing-xl: 2rem;
30
+
31
+ /* Border radius */
32
+ --border-radius: 0.375rem;
33
+
34
+ /* Shadow */
35
+ --shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
36
+ --shadow-md: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
37
+ --shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
11
38
  }
12
39
 
40
+ /* Base styles */
13
41
  * {
14
42
  box-sizing: border-box;
15
43
  margin: 0;
16
44
  padding: 0;
17
45
  }
18
46
 
19
- body {
20
- font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
47
+ html {
48
+ font-size: 16px;
21
49
  line-height: 1.5;
22
- color: var(--text-color);
23
- background-color: var(--background-color);
50
+ }
51
+
52
+ body {
53
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
54
+ background-color: var(--light-bg);
55
+ color: var(--light-text);
56
+ transition: background-color 0.3s ease, color 0.3s ease;
57
+ }
58
+
59
+ /* Container and layout */
60
+ .container {
61
+ max-width: 1200px;
62
+ margin: 0 auto;
63
+ padding: var(--spacing-md);
64
+ }
65
+
66
+ .grid {
67
+ display: grid;
68
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
69
+ gap: var(--spacing-lg);
70
+ margin: var(--spacing-lg) 0;
71
+ }
72
+
73
+ .demo-grid {
74
+ display: grid;
75
+ grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
76
+ gap: var(--spacing-lg);
77
+ margin: var(--spacing-lg) 0;
78
+ }
79
+
80
+ /* Typography */
81
+ h1, h2, h3, h4, h5, h6 {
82
+ margin-bottom: var(--spacing-md);
83
+ font-weight: 500;
84
+ }
85
+
86
+ h1 {
87
+ font-size: 2.5rem;
88
+ color: var(--primary-color);
89
+ }
90
+
91
+ h2 {
92
+ font-size: 2rem;
93
+ }
94
+
95
+ h3 {
96
+ font-size: 1.5rem;
97
+ }
98
+
99
+ p {
100
+ margin-bottom: var(--spacing-md);
24
101
  }
25
102
 
26
103
  a {
27
104
  color: var(--primary-color);
28
105
  text-decoration: none;
106
+ transition: color 0.2s ease;
29
107
  }
30
108
 
31
109
  a:hover {
110
+ color: var(--primary-hover);
32
111
  text-decoration: underline;
33
112
  }
34
113
 
35
- button {
36
- cursor: pointer;
37
- background-color: var(--primary-color);
38
- color: white;
39
- border: none;
114
+ /* Header */
115
+ .header {
116
+ display: flex;
117
+ justify-content: space-between;
118
+ align-items: center;
119
+ padding: var(--spacing-lg) 0;
120
+ margin-bottom: var(--spacing-xl);
121
+ border-bottom: 1px solid var(--light-border);
122
+ }
123
+
124
+ .logo {
125
+ display: flex;
126
+ flex-direction: column;
127
+ }
128
+
129
+ .logo h1 {
130
+ margin: 0;
131
+ }
132
+
133
+ .version {
134
+ font-size: 0.875rem;
135
+ color: var(--secondary-color);
136
+ }
137
+
138
+ /* Hero section */
139
+ .hero {
140
+ margin-bottom: var(--spacing-xl);
141
+ text-align: center;
142
+ padding: var(--spacing-xl) 0;
143
+ }
144
+
145
+ /* Cards */
146
+ .card {
147
+ background-color: var(--light-bg-secondary);
148
+ border-radius: var(--border-radius);
149
+ padding: var(--spacing-lg);
150
+ box-shadow: var(--shadow-sm);
151
+ transition: box-shadow 0.3s ease, transform 0.3s ease;
152
+ margin-bottom: var(--spacing-lg);
153
+ border: 1px solid var(--light-border);
154
+ }
155
+
156
+ .card:hover {
157
+ box-shadow: var(--shadow-md);
158
+ transform: translateY(-3px);
159
+ }
160
+
161
+ /* Buttons */
162
+ .btn, .button {
163
+ display: inline-block;
164
+ font-weight: 400;
165
+ text-align: center;
166
+ vertical-align: middle;
167
+ user-select: none;
168
+ background-color: var(--secondary-color);
169
+ border: 1px solid transparent;
40
170
  padding: 0.5rem 1rem;
41
- border-radius: 4px;
42
171
  font-size: 1rem;
43
- transition: background-color 0.2s;
172
+ line-height: 1.5;
173
+ border-radius: var(--border-radius);
174
+ color: white;
175
+ cursor: pointer;
176
+ transition: background-color 0.15s ease-in-out;
177
+ margin-right: var(--spacing-sm);
178
+ margin-bottom: var(--spacing-sm);
179
+ }
180
+
181
+ .btn:hover, .button:hover {
182
+ text-decoration: none;
183
+ background-color: #5a6268;
184
+ }
185
+
186
+ .btn.primary, .button.primary {
187
+ background-color: var(--primary-color);
44
188
  }
45
189
 
46
- button:hover {
190
+ .btn.primary:hover, .button.primary:hover {
191
+ background-color: var(--primary-hover);
192
+ }
193
+
194
+ .btn.secondary, .button.secondary {
47
195
  background-color: var(--secondary-color);
48
196
  }
49
197
 
50
- input, textarea {
51
- padding: 0.5rem;
52
- border: 1px solid var(--border-color);
53
- border-radius: 4px;
54
- font-size: 1rem;
55
- width: 100%;
198
+ .btn.small {
199
+ padding: 0.25rem 0.5rem;
200
+ font-size: 0.875rem;
56
201
  }
57
202
 
58
- /* Layout */
59
- .app {
203
+ /* Navigation */
204
+ .nav-links {
60
205
  display: flex;
61
- flex-direction: column;
62
- min-height: 100vh;
206
+ gap: var(--spacing-md);
207
+ flex-wrap: wrap;
63
208
  }
64
209
 
65
- .content {
66
- flex: 1;
67
- padding: 2rem;
68
- max-width: 1200px;
69
- margin: 0 auto;
70
- width: 100%;
210
+ .nav-links a {
211
+ padding: var(--spacing-sm) var(--spacing-md);
212
+ border-radius: var(--border-radius);
213
+ transition: background-color 0.2s ease;
71
214
  }
72
215
 
73
- /* Header */
74
- .app-header {
75
- background-color: white;
76
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
77
- padding: 1rem 2rem;
216
+ .nav-links a:hover {
217
+ background-color: rgba(0, 0, 0, 0.05);
218
+ text-decoration: none;
219
+ }
220
+
221
+ .nav-links a.active {
222
+ background-color: var(--primary-color);
223
+ color: white;
224
+ }
225
+
226
+ /* Back link */
227
+ .back-link {
228
+ font-size: 1rem;
78
229
  display: flex;
79
- justify-content: space-between;
80
230
  align-items: center;
81
231
  }
82
232
 
83
- .logo h1 {
84
- font-size: 1.5rem;
85
- color: var(--primary-color);
233
+ /* Feature list */
234
+ .feature-list {
235
+ list-style-type: none;
236
+ padding-left: 0;
86
237
  }
87
238
 
88
- .main-nav ul {
89
- display: flex;
90
- list-style: none;
91
- gap: 2rem;
239
+ .feature-list li {
240
+ margin-bottom: var(--spacing-sm);
241
+ position: relative;
242
+ padding-left: 1.5rem;
92
243
  }
93
244
 
94
- .main-nav a {
95
- color: var(--text-color);
96
- font-weight: 500;
245
+ .feature-list li::before {
246
+ content: '✓';
247
+ position: absolute;
248
+ left: 0;
249
+ color: var(--success-color);
250
+ font-weight: bold;
97
251
  }
98
252
 
99
- .main-nav a:hover {
100
- color: var(--primary-color);
253
+ .feature-list.expanded li {
254
+ margin-bottom: var(--spacing-md);
255
+ padding-left: 0;
101
256
  }
102
257
 
103
- /* Footer */
104
- .app-footer {
105
- background-color: white;
106
- box-shadow: 0 -2px 4px rgba(0, 0, 0, 0.05);
107
- padding: 1.5rem 2rem;
108
- margin-top: 2rem;
258
+ .feature-list.expanded li::before {
259
+ display: none;
109
260
  }
110
261
 
111
- .footer-content {
112
- display: flex;
113
- justify-content: space-between;
114
- align-items: center;
115
- max-width: 1200px;
116
- margin: 0 auto;
262
+ /* Counter */
263
+ .counter {
264
+ text-align: center;
265
+ padding: var(--spacing-md);
266
+ border-radius: var(--border-radius);
267
+ background-color: rgba(0, 0, 0, 0.03);
268
+ }
269
+
270
+ .badge {
271
+ display: inline-block;
272
+ padding: 0.25rem 0.5rem;
273
+ font-size: 0.875rem;
274
+ font-weight: 700;
275
+ line-height: 1;
276
+ text-align: center;
277
+ white-space: nowrap;
278
+ vertical-align: baseline;
279
+ border-radius: var(--border-radius);
280
+ color: white;
281
+ background-color: var(--secondary-color);
117
282
  }
118
283
 
119
- .footer-links {
284
+ /* Button group */
285
+ .button-group {
120
286
  display: flex;
121
- gap: 1rem;
287
+ justify-content: center;
288
+ gap: var(--spacing-sm);
289
+ margin-top: var(--spacing-md);
122
290
  }
123
291
 
124
- /* Home page */
125
- .hero {
292
+ /* Server info */
293
+ .server-info {
126
294
  text-align: center;
127
- margin-bottom: 3rem;
128
295
  }
129
296
 
130
- .hero h1 {
131
- font-size: 2.5rem;
132
- margin-bottom: 0.5rem;
133
- color: var(--primary-color);
297
+ .time-container {
298
+ margin-top: var(--spacing-md);
299
+ padding: var(--spacing-md);
300
+ background-color: rgba(0, 0, 0, 0.03);
301
+ border-radius: var(--border-radius);
134
302
  }
135
303
 
136
- .subtitle {
137
- font-size: 1.2rem;
138
- color: #666;
139
- margin-bottom: 2rem;
304
+ .note {
305
+ font-size: 0.875rem;
306
+ color: var(--secondary-color);
307
+ margin-top: var(--spacing-md);
308
+ font-style: italic;
140
309
  }
141
310
 
142
- .features {
143
- display: grid;
144
- grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
145
- gap: 2rem;
146
- margin-top: 3rem;
311
+ /* About page */
312
+ .about-nav {
313
+ display: flex;
314
+ justify-content: center;
315
+ gap: var(--spacing-md);
316
+ margin-bottom: var(--spacing-lg);
147
317
  }
148
318
 
149
- .feature {
150
- background-color: white;
151
- border-radius: 8px;
152
- padding: 1.5rem;
153
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
154
- transition: transform 0.2s, box-shadow 0.2s;
319
+ .about-nav button {
320
+ padding: var(--spacing-sm) var(--spacing-lg);
321
+ border: none;
322
+ background: none;
323
+ border-bottom: 2px solid transparent;
324
+ cursor: pointer;
325
+ font-size: 1rem;
326
+ transition: border-color 0.2s ease;
155
327
  }
156
328
 
157
- .feature:hover {
158
- transform: translateY(-5px);
159
- box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
329
+ .about-nav button:hover {
330
+ border-bottom-color: var(--primary-color);
160
331
  }
161
332
 
162
- .feature h3 {
163
- margin-bottom: 1rem;
164
- color: var(--primary-color);
333
+ .about-nav button.active {
334
+ border-bottom-color: var(--primary-color);
335
+ font-weight: 500;
165
336
  }
166
337
 
167
- .counter {
168
- display: flex;
169
- align-items: center;
170
- justify-content: center;
171
- gap: 1rem;
172
- margin-top: 1rem;
338
+ .about-section {
339
+ margin-bottom: var(--spacing-xl);
173
340
  }
174
341
 
175
- .counter button {
176
- width: 40px;
177
- height: 40px;
178
- font-size: 1.2rem;
342
+ /* Team section */
343
+ .team-grid {
344
+ display: grid;
345
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
346
+ gap: var(--spacing-lg);
347
+ margin-top: var(--spacing-lg);
348
+ }
349
+
350
+ .team-member {
351
+ text-align: center;
352
+ padding: var(--spacing-md);
353
+ border-radius: var(--border-radius);
354
+ background-color: var(--light-bg-secondary);
355
+ box-shadow: var(--shadow-sm);
356
+ }
357
+
358
+ .avatar {
359
+ width: 80px;
360
+ height: 80px;
361
+ border-radius: 50%;
362
+ background-color: var(--primary-color);
363
+ color: white;
179
364
  display: flex;
180
365
  align-items: center;
181
366
  justify-content: center;
182
- padding: 0;
367
+ font-size: 1.5rem;
368
+ font-weight: bold;
369
+ margin: 0 auto var(--spacing-md);
183
370
  }
184
371
 
185
- .counter span {
186
- font-size: 1.5rem;
187
- min-width: 40px;
188
- text-align: center;
372
+ .title {
373
+ color: var(--secondary-color);
374
+ font-size: 0.875rem;
375
+ margin-bottom: var(--spacing-sm);
189
376
  }
190
377
 
191
- .api-button {
192
- margin-top: 1rem;
193
- width: 100%;
378
+ .bio {
379
+ font-size: 0.875rem;
194
380
  }
195
381
 
196
- /* About page */
197
- .about-page {
198
- max-width: 800px;
199
- margin: 0 auto;
382
+ /* Footer */
383
+ footer {
384
+ text-align: center;
385
+ padding: var(--spacing-lg) 0;
386
+ margin-top: var(--spacing-xl);
387
+ border-top: 1px solid var(--light-border);
388
+ color: var(--secondary-color);
389
+ font-size: 0.875rem;
200
390
  }
201
391
 
202
- .about-page h1 {
203
- margin-bottom: 2rem;
204
- color: var(--primary-color);
392
+ /* Form elements */
393
+ .form-group {
394
+ margin-bottom: var(--spacing-md);
205
395
  }
206
396
 
207
- .about-section {
208
- margin-bottom: 2rem;
397
+ label {
398
+ display: block;
399
+ margin-bottom: var(--spacing-sm);
400
+ font-weight: 500;
209
401
  }
210
402
 
211
- .about-section h2 {
212
- margin-bottom: 1rem;
213
- color: var(--secondary-color);
214
- font-size: 1.5rem;
403
+ input, select, textarea {
404
+ width: 100%;
405
+ padding: var(--spacing-sm);
406
+ font-size: 1rem;
407
+ border: 1px solid var(--light-border);
408
+ border-radius: var(--border-radius);
409
+ background-color: #fff;
215
410
  }
216
411
 
217
- .about-section ul {
218
- margin-left: 1.5rem;
219
- margin-top: 0.5rem;
412
+ input:focus, select:focus, textarea:focus {
413
+ outline: none;
414
+ border-color: var(--primary-color);
415
+ box-shadow: 0 0 0 0.2rem rgba(0, 102, 204, 0.25);
220
416
  }
221
417
 
222
- .about-section li {
223
- margin-bottom: 0.5rem;
418
+ .form-grid {
419
+ display: grid;
420
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
421
+ gap: var(--spacing-md);
224
422
  }
225
423
 
226
- /* WASM Demo page */
227
- .wasm-demo-page {
228
- max-width: 800px;
229
- margin: 0 auto;
424
+ /* WebAssembly Demo */
425
+ .wasm-demo .intro-section {
426
+ margin-bottom: var(--spacing-xl);
230
427
  }
231
428
 
232
- .wasm-demo-page h1 {
233
- margin-bottom: 2rem;
234
- color: var(--primary-color);
429
+ .result-box {
430
+ margin-top: var(--spacing-md);
431
+ padding: var(--spacing-md);
432
+ background-color: rgba(0, 0, 0, 0.03);
433
+ border-radius: var(--border-radius);
235
434
  }
236
435
 
237
- .wasm-status {
238
- padding: 1rem;
239
- border-radius: 4px;
240
- margin-bottom: 2rem;
436
+ .result-label {
437
+ font-weight: 500;
438
+ margin-bottom: var(--spacing-sm);
241
439
  }
242
440
 
243
- .wasm-status.error {
244
- background-color: #ffeeee;
245
- border: 1px solid var(--error-color);
441
+ .result-value {
442
+ font-family: monospace;
443
+ padding: var(--spacing-sm);
444
+ background-color: rgba(255, 255, 255, 0.5);
445
+ border-radius: var(--border-radius);
446
+ word-break: break-all;
246
447
  }
247
448
 
248
- .wasm-status.success {
249
- background-color: #eeffee;
250
- border: 1px solid var(--success-color);
449
+ .array-result {
450
+ white-space: pre-wrap;
251
451
  }
252
452
 
253
- .demo-section {
254
- background-color: white;
255
- border-radius: 8px;
256
- padding: 2rem;
257
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
453
+ .info-section {
454
+ margin-top: var(--spacing-xl);
455
+ padding: var(--spacing-lg);
456
+ background-color: var(--light-bg-secondary);
457
+ border-radius: var(--border-radius);
458
+ box-shadow: var(--shadow-sm);
258
459
  }
259
460
 
260
- .demo-section h2 {
261
- margin-bottom: 1rem;
262
- color: var(--secondary-color);
263
- font-size: 1.5rem;
461
+ /* Loading and error states */
462
+ .loading-container, .error-container {
463
+ text-align: center;
464
+ padding: var(--spacing-xl) 0;
264
465
  }
265
466
 
266
- .calculator {
467
+ .loading {
267
468
  display: flex;
268
- gap: 1rem;
469
+ flex-direction: column;
269
470
  align-items: center;
270
- margin-bottom: 2rem;
271
- flex-wrap: wrap;
471
+ justify-content: center;
472
+ padding: var(--spacing-xl);
272
473
  }
273
474
 
274
- .calculator input {
275
- width: 80px;
475
+ .spinner {
476
+ width: 40px;
477
+ height: 40px;
478
+ border: 4px solid rgba(0, 0, 0, 0.1);
479
+ border-radius: 50%;
480
+ border-top-color: var(--primary-color);
481
+ animation: spin 1s linear infinite;
482
+ margin-bottom: var(--spacing-md);
276
483
  }
277
484
 
278
- .result {
279
- background-color: #f7f7f7;
280
- padding: 0.5rem 1rem;
281
- border-radius: 4px;
282
- margin-top: 1rem;
485
+ @keyframes spin {
486
+ to { transform: rotate(360deg); }
283
487
  }
284
488
 
285
- .json-parser {
286
- margin-bottom: 2rem;
489
+ .error-box {
490
+ max-width: 600px;
491
+ margin: 0 auto;
492
+ padding: var(--spacing-lg);
493
+ background-color: #f8d7da;
494
+ color: #721c24;
495
+ border-radius: var(--border-radius);
496
+ margin-bottom: var(--spacing-lg);
497
+ }
498
+
499
+ /* Theme toggle and dark mode */
500
+ .theme-toggle {
501
+ background: none;
502
+ border: 1px solid var(--light-border);
503
+ padding: var(--spacing-sm) var(--spacing-md);
504
+ border-radius: var(--border-radius);
505
+ cursor: pointer;
506
+ transition: background-color 0.2s ease;
287
507
  }
288
508
 
289
- .json-parser textarea {
290
- width: 100%;
291
- margin-bottom: 1rem;
292
- font-family: monospace;
509
+ .theme-toggle:hover {
510
+ background-color: rgba(0, 0, 0, 0.05);
293
511
  }
294
512
 
295
- .json-result {
296
- background-color: #f7f7f7;
297
- padding: 1rem;
298
- border-radius: 4px;
299
- margin-top: 1rem;
300
- font-family: monospace;
301
- overflow-x: auto;
513
+ /* Dark theme */
514
+ .dark-theme {
515
+ background-color: var(--dark-bg);
516
+ color: var(--dark-text);
302
517
  }
303
518
 
304
- .function-list {
305
- list-style: none;
306
- display: grid;
307
- grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
308
- gap: 0.5rem;
519
+ .dark-theme .header {
520
+ border-bottom-color: var(--dark-border);
309
521
  }
310
522
 
311
- .function-list li {
312
- background-color: #f7f7f7;
313
- padding: 0.5rem;
314
- border-radius: 4px;
315
- font-family: monospace;
523
+ .dark-theme .card {
524
+ background-color: var(--dark-bg-secondary);
525
+ border-color: var(--dark-border);
526
+ }
527
+
528
+ .dark-theme input,
529
+ .dark-theme select,
530
+ .dark-theme textarea {
531
+ background-color: #2c3136;
532
+ border-color: var(--dark-border);
533
+ color: var(--dark-text);
534
+ }
535
+
536
+ .dark-theme .theme-toggle {
537
+ border-color: var(--dark-border);
538
+ color: var(--dark-text);
539
+ }
540
+
541
+ .dark-theme .theme-toggle:hover {
542
+ background-color: rgba(255, 255, 255, 0.1);
543
+ }
544
+
545
+ .dark-theme footer {
546
+ border-top-color: var(--dark-border);
547
+ }
548
+
549
+ .dark-theme .result-box,
550
+ .dark-theme .time-container,
551
+ .dark-theme .counter {
552
+ background-color: rgba(255, 255, 255, 0.05);
553
+ }
554
+
555
+ .dark-theme .result-value {
556
+ background-color: rgba(0, 0, 0, 0.2);
557
+ }
558
+
559
+ .dark-theme .info-section {
560
+ background-color: var(--dark-bg-secondary);
316
561
  }
317
562
 
318
563
  /* Responsive adjustments */
319
564
  @media (max-width: 768px) {
320
- .app-header {
565
+ .header {
321
566
  flex-direction: column;
322
- gap: 1rem;
567
+ gap: var(--spacing-md);
323
568
  text-align: center;
324
569
  }
325
-
326
- .main-nav ul {
327
- justify-content: center;
328
- flex-wrap: wrap;
329
- gap: 1rem;
570
+
571
+ .grid, .demo-grid {
572
+ grid-template-columns: 1fr;
330
573
  }
331
-
332
- .footer-content {
574
+
575
+ .about-nav {
333
576
  flex-direction: column;
334
- gap: 1rem;
335
- text-align: center;
336
- }
337
-
338
- .footer-links {
339
- justify-content: center;
340
- }
341
-
342
- .content {
343
- padding: 1rem;
577
+ align-items: center;
344
578
  }
345
579
  }