zero-query 1.0.9 → 1.2.0

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 (154) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +2 -0
  3. package/cli/args.js +33 -33
  4. package/cli/commands/build-api.js +443 -0
  5. package/cli/commands/build.js +254 -216
  6. package/cli/commands/bundle.js +1228 -1183
  7. package/cli/commands/create.js +137 -121
  8. package/cli/commands/dev/devtools/index.js +56 -56
  9. package/cli/commands/dev/devtools/js/components.js +49 -49
  10. package/cli/commands/dev/devtools/js/core.js +423 -423
  11. package/cli/commands/dev/devtools/js/elements.js +421 -421
  12. package/cli/commands/dev/devtools/js/network.js +166 -166
  13. package/cli/commands/dev/devtools/js/performance.js +73 -73
  14. package/cli/commands/dev/devtools/js/router.js +105 -105
  15. package/cli/commands/dev/devtools/js/source.js +132 -132
  16. package/cli/commands/dev/devtools/js/stats.js +35 -35
  17. package/cli/commands/dev/devtools/js/tabs.js +79 -79
  18. package/cli/commands/dev/devtools/panel.html +95 -95
  19. package/cli/commands/dev/devtools/styles.css +244 -244
  20. package/cli/commands/dev/index.js +107 -107
  21. package/cli/commands/dev/logger.js +75 -75
  22. package/cli/commands/dev/overlay.js +858 -858
  23. package/cli/commands/dev/server.js +220 -167
  24. package/cli/commands/dev/validator.js +94 -94
  25. package/cli/commands/dev/watcher.js +172 -172
  26. package/cli/help.js +114 -112
  27. package/cli/index.js +52 -52
  28. package/cli/scaffold/default/LICENSE +21 -21
  29. package/cli/scaffold/default/app/app.js +207 -207
  30. package/cli/scaffold/default/app/components/about.js +201 -201
  31. package/cli/scaffold/default/app/components/api-demo.js +143 -143
  32. package/cli/scaffold/default/app/components/contact-card.js +231 -231
  33. package/cli/scaffold/default/app/components/contacts/contacts.css +706 -706
  34. package/cli/scaffold/default/app/components/contacts/contacts.html +200 -200
  35. package/cli/scaffold/default/app/components/contacts/contacts.js +196 -196
  36. package/cli/scaffold/default/app/components/counter.js +127 -127
  37. package/cli/scaffold/default/app/components/home.js +249 -249
  38. package/cli/scaffold/default/app/components/not-found.js +16 -16
  39. package/cli/scaffold/default/app/components/playground/playground.css +115 -115
  40. package/cli/scaffold/default/app/components/playground/playground.html +161 -161
  41. package/cli/scaffold/default/app/components/playground/playground.js +116 -116
  42. package/cli/scaffold/default/app/components/todos.js +225 -225
  43. package/cli/scaffold/default/app/components/toolkit/toolkit.css +97 -97
  44. package/cli/scaffold/default/app/components/toolkit/toolkit.html +146 -146
  45. package/cli/scaffold/default/app/components/toolkit/toolkit.js +280 -280
  46. package/cli/scaffold/default/app/routes.js +15 -15
  47. package/cli/scaffold/default/app/store.js +101 -101
  48. package/cli/scaffold/default/global.css +552 -552
  49. package/cli/scaffold/default/index.html +99 -99
  50. package/cli/scaffold/minimal/app/app.js +85 -85
  51. package/cli/scaffold/minimal/app/components/about.js +68 -68
  52. package/cli/scaffold/minimal/app/components/counter.js +122 -122
  53. package/cli/scaffold/minimal/app/components/home.js +68 -68
  54. package/cli/scaffold/minimal/app/components/not-found.js +16 -16
  55. package/cli/scaffold/minimal/app/routes.js +9 -9
  56. package/cli/scaffold/minimal/app/store.js +36 -36
  57. package/cli/scaffold/minimal/global.css +300 -300
  58. package/cli/scaffold/minimal/index.html +44 -44
  59. package/cli/scaffold/ssr/app/app.js +41 -41
  60. package/cli/scaffold/ssr/app/components/about.js +55 -55
  61. package/cli/scaffold/ssr/app/components/blog/index.js +65 -65
  62. package/cli/scaffold/ssr/app/components/blog/post.js +86 -86
  63. package/cli/scaffold/ssr/app/components/home.js +37 -37
  64. package/cli/scaffold/ssr/app/components/not-found.js +15 -15
  65. package/cli/scaffold/ssr/app/routes.js +8 -8
  66. package/cli/scaffold/ssr/global.css +228 -228
  67. package/cli/scaffold/ssr/index.html +37 -37
  68. package/cli/scaffold/ssr/package.json +8 -8
  69. package/cli/scaffold/ssr/server/data/posts.js +144 -144
  70. package/cli/scaffold/ssr/server/index.js +213 -213
  71. package/cli/scaffold/webrtc/app/app.js +11 -0
  72. package/cli/scaffold/webrtc/app/components/video-room.js +295 -0
  73. package/cli/scaffold/webrtc/app/lib/room.js +252 -0
  74. package/cli/scaffold/webrtc/assets/.gitkeep +0 -0
  75. package/cli/scaffold/webrtc/global.css +250 -0
  76. package/cli/scaffold/webrtc/index.html +21 -0
  77. package/cli/utils.js +305 -287
  78. package/dist/API.md +7264 -0
  79. package/dist/zquery.dist.zip +0 -0
  80. package/dist/zquery.js +10313 -6252
  81. package/dist/zquery.min.js +8 -601
  82. package/index.d.ts +570 -365
  83. package/index.js +311 -232
  84. package/package.json +76 -69
  85. package/src/component.js +1709 -1454
  86. package/src/core.js +921 -921
  87. package/src/diff.js +497 -497
  88. package/src/errors.js +209 -209
  89. package/src/expression.js +922 -922
  90. package/src/http.js +242 -242
  91. package/src/package.json +1 -1
  92. package/src/reactive.js +255 -254
  93. package/src/router.js +843 -773
  94. package/src/ssr.js +418 -418
  95. package/src/store.js +318 -272
  96. package/src/utils.js +515 -515
  97. package/src/webrtc/e2ee.js +351 -0
  98. package/src/webrtc/errors.js +116 -0
  99. package/src/webrtc/ice.js +301 -0
  100. package/src/webrtc/index.js +131 -0
  101. package/src/webrtc/joinToken.js +119 -0
  102. package/src/webrtc/observe.js +172 -0
  103. package/src/webrtc/peer.js +351 -0
  104. package/src/webrtc/reactive.js +268 -0
  105. package/src/webrtc/room.js +625 -0
  106. package/src/webrtc/sdp.js +302 -0
  107. package/src/webrtc/sfu/index.js +43 -0
  108. package/src/webrtc/sfu/livekit.js +131 -0
  109. package/src/webrtc/sfu/mediasoup.js +150 -0
  110. package/src/webrtc/signaling.js +373 -0
  111. package/src/webrtc/turn.js +237 -0
  112. package/tests/_helpers/webrtcFakes.js +289 -0
  113. package/tests/audit.test.js +4158 -4158
  114. package/tests/cli.test.js +1136 -1023
  115. package/tests/compare.test.js +497 -0
  116. package/tests/component.test.js +3969 -3938
  117. package/tests/core.test.js +1910 -1910
  118. package/tests/dev-server.test.js +489 -0
  119. package/tests/diff.test.js +1416 -1416
  120. package/tests/docs.test.js +1664 -0
  121. package/tests/electron-features.test.js +864 -0
  122. package/tests/errors.test.js +619 -619
  123. package/tests/expression.test.js +1056 -1056
  124. package/tests/http.test.js +648 -648
  125. package/tests/reactive.test.js +819 -819
  126. package/tests/router.test.js +2327 -2327
  127. package/tests/ssr.test.js +870 -870
  128. package/tests/store.test.js +830 -830
  129. package/tests/test-minifier.js +153 -153
  130. package/tests/test-ssr.js +27 -27
  131. package/tests/utils.test.js +1377 -1377
  132. package/tests/webrtc/e2ee.test.js +283 -0
  133. package/tests/webrtc/ice.test.js +202 -0
  134. package/tests/webrtc/joinToken.test.js +89 -0
  135. package/tests/webrtc/observe.test.js +111 -0
  136. package/tests/webrtc/peer.test.js +373 -0
  137. package/tests/webrtc/reactive.test.js +235 -0
  138. package/tests/webrtc/room.test.js +406 -0
  139. package/tests/webrtc/sdp.test.js +151 -0
  140. package/tests/webrtc/sfu-livekit.test.js +119 -0
  141. package/tests/webrtc/sfu.test.js +160 -0
  142. package/tests/webrtc/signaling.test.js +251 -0
  143. package/tests/webrtc/turn.test.js +256 -0
  144. package/types/collection.d.ts +383 -383
  145. package/types/component.d.ts +186 -186
  146. package/types/errors.d.ts +135 -135
  147. package/types/http.d.ts +92 -92
  148. package/types/misc.d.ts +201 -201
  149. package/types/reactive.d.ts +98 -98
  150. package/types/router.d.ts +190 -190
  151. package/types/ssr.d.ts +102 -102
  152. package/types/store.d.ts +146 -145
  153. package/types/utils.d.ts +245 -245
  154. package/types/webrtc.d.ts +653 -0
@@ -1,228 +1,228 @@
1
- /* global.css - SSR Scaffold Styles */
2
-
3
- *, *::before, *::after {
4
- box-sizing: border-box;
5
- margin: 0;
6
- padding: 0;
7
- }
8
-
9
- :root {
10
- --bg: #0f0f0f;
11
- --surface: #1a1a2e;
12
- --text: #e0e0e0;
13
- --muted: #888;
14
- --accent: #00d4ff;
15
- --accent-hover: #00b8d9;
16
- --radius: 8px;
17
- --gap: 1.5rem;
18
- }
19
-
20
- body {
21
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
22
- background: var(--bg);
23
- color: var(--text);
24
- line-height: 1.6;
25
- min-height: 100vh;
26
- }
27
-
28
- /* -- Navbar -- */
29
- .navbar {
30
- display: flex;
31
- align-items: center;
32
- justify-content: space-between;
33
- padding: 1rem 2rem;
34
- background: var(--surface);
35
- border-bottom: 1px solid rgba(255,255,255,0.06);
36
- }
37
-
38
- .brand {
39
- font-weight: 700;
40
- font-size: 1.2rem;
41
- color: var(--accent);
42
- }
43
-
44
- .nav-links { display: flex; gap: 1rem; }
45
-
46
- .nav-link {
47
- color: var(--muted);
48
- text-decoration: none;
49
- padding: 0.4rem 0.8rem;
50
- border-radius: var(--radius);
51
- transition: color 0.2s, background 0.2s;
52
- cursor: pointer;
53
- user-select: none;
54
- }
55
- .nav-link:hover, .nav-link.active {
56
- color: var(--accent);
57
- background: rgba(0, 212, 255, 0.08);
58
- }
59
-
60
- /* -- Main content -- */
61
- z-outlet {
62
- display: block;
63
- max-width: 1200px;
64
- margin: 2rem auto;
65
- padding: 0 1.5rem;
66
- }
67
-
68
- .page-header {
69
- margin-bottom: var(--gap);
70
- }
71
- .page-header h1 {
72
- font-size: 2rem;
73
- margin-bottom: 0.5rem;
74
- }
75
- .page-header .subtitle {
76
- color: var(--muted);
77
- }
78
-
79
- .card {
80
- background: var(--surface);
81
- border: 1px solid rgba(255,255,255,0.06);
82
- border-radius: var(--radius);
83
- padding: 1.5rem;
84
- margin-bottom: var(--gap);
85
- }
86
- .card h3 {
87
- margin-bottom: 0.75rem;
88
- color: var(--accent);
89
- }
90
- .card code {
91
- background: rgba(255,255,255,0.06);
92
- padding: 0.15em 0.4em;
93
- border-radius: 4px;
94
- font-size: 0.9em;
95
- }
96
- .card a {
97
- color: var(--accent);
98
- text-decoration: none;
99
- transition: color 0.15s;
100
- }
101
- .card a:hover {
102
- color: var(--accent-hover);
103
- text-decoration: underline;
104
- }
105
-
106
- .badge {
107
- display: inline-block;
108
- padding: 2px 8px;
109
- border-radius: 4px;
110
- font-size: 0.8em;
111
- font-weight: 600;
112
- }
113
- .badge-ssr { background: rgba(0,212,255,0.15); color: var(--accent); }
114
- .badge-csr { background: rgba(255,165,0,0.15); color: #ffa500; }
115
-
116
- /* -- Blog Grid -- */
117
- .blog-grid {
118
- display: grid;
119
- grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
120
- gap: var(--gap);
121
- }
122
-
123
- .blog-card {
124
- display: block;
125
- text-decoration: none;
126
- color: inherit;
127
- background: var(--surface);
128
- border: 1px solid rgba(255,255,255,0.06);
129
- border-radius: var(--radius);
130
- padding: 1.5rem;
131
- transition: border-color 0.2s, transform 0.2s;
132
- cursor: pointer;
133
- }
134
- .blog-card:hover {
135
- border-color: rgba(0, 212, 255, 0.25);
136
- transform: translateY(-2px);
137
- }
138
-
139
- .blog-card-header {
140
- display: flex;
141
- align-items: center;
142
- justify-content: space-between;
143
- margin-bottom: 0.75rem;
144
- }
145
-
146
- .blog-date {
147
- font-size: 0.8em;
148
- color: var(--muted);
149
- }
150
-
151
- .blog-title {
152
- font-size: 1.1rem;
153
- margin-bottom: 0.5rem;
154
- color: var(--text);
155
- }
156
-
157
- .blog-summary {
158
- color: var(--muted);
159
- font-size: 0.9rem;
160
- line-height: 1.6;
161
- }
162
-
163
- /* -- Blog Post Detail -- */
164
- .back-link {
165
- display: inline-block;
166
- color: var(--accent);
167
- font-size: 0.9rem;
168
- margin-bottom: 1rem;
169
- transition: opacity 0.15s;
170
- text-decoration: none;
171
- cursor: pointer;
172
- }
173
- .back-link:hover { opacity: 0.75; }
174
-
175
- .blog-post-meta {
176
- display: flex;
177
- align-items: center;
178
- gap: 0.75rem;
179
- margin-top: 0.5rem;
180
- }
181
-
182
- .blog-post-body {
183
- background: var(--surface);
184
- border: 1px solid rgba(255,255,255,0.06);
185
- border-radius: var(--radius);
186
- padding: 2rem;
187
- line-height: 1.8;
188
- font-size: 0.95rem;
189
- }
190
- .blog-post-body h4 {
191
- color: var(--accent);
192
- margin: 1.5rem 0 0.75rem;
193
- font-size: 1.05rem;
194
- }
195
- .blog-post-body h4:first-child { margin-top: 0; }
196
- .blog-post-body ul, .blog-post-body ol {
197
- padding-left: 1.5rem;
198
- margin: 0.5rem 0;
199
- }
200
- .blog-post-body li { margin-bottom: 0.4rem; }
201
- .blog-post-body pre {
202
- background: rgba(0,0,0,0.3);
203
- border-radius: var(--radius);
204
- padding: 1rem 1.25rem;
205
- overflow-x: auto;
206
- margin: 0.75rem 0;
207
- font-size: 0.85rem;
208
- line-height: 1.5;
209
- }
210
- .blog-post-body code {
211
- background: rgba(255,255,255,0.06);
212
- padding: 0.15em 0.4em;
213
- border-radius: 4px;
214
- font-size: 0.9em;
215
- }
216
- .blog-post-body pre code {
217
- background: none;
218
- padding: 0;
219
- }
220
-
221
- /* -- Footer -- */
222
- .footer {
223
- text-align: center;
224
- padding: 2rem;
225
- color: var(--muted);
226
- border-top: 1px solid rgba(255,255,255,0.06);
227
- margin-top: 3rem;
228
- }
1
+ /* global.css - SSR Scaffold Styles */
2
+
3
+ *, *::before, *::after {
4
+ box-sizing: border-box;
5
+ margin: 0;
6
+ padding: 0;
7
+ }
8
+
9
+ :root {
10
+ --bg: #0f0f0f;
11
+ --surface: #1a1a2e;
12
+ --text: #e0e0e0;
13
+ --muted: #888;
14
+ --accent: #00d4ff;
15
+ --accent-hover: #00b8d9;
16
+ --radius: 8px;
17
+ --gap: 1.5rem;
18
+ }
19
+
20
+ body {
21
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
22
+ background: var(--bg);
23
+ color: var(--text);
24
+ line-height: 1.6;
25
+ min-height: 100vh;
26
+ }
27
+
28
+ /* -- Navbar -- */
29
+ .navbar {
30
+ display: flex;
31
+ align-items: center;
32
+ justify-content: space-between;
33
+ padding: 1rem 2rem;
34
+ background: var(--surface);
35
+ border-bottom: 1px solid rgba(255,255,255,0.06);
36
+ }
37
+
38
+ .brand {
39
+ font-weight: 700;
40
+ font-size: 1.2rem;
41
+ color: var(--accent);
42
+ }
43
+
44
+ .nav-links { display: flex; gap: 1rem; }
45
+
46
+ .nav-link {
47
+ color: var(--muted);
48
+ text-decoration: none;
49
+ padding: 0.4rem 0.8rem;
50
+ border-radius: var(--radius);
51
+ transition: color 0.2s, background 0.2s;
52
+ cursor: pointer;
53
+ user-select: none;
54
+ }
55
+ .nav-link:hover, .nav-link.active {
56
+ color: var(--accent);
57
+ background: rgba(0, 212, 255, 0.08);
58
+ }
59
+
60
+ /* -- Main content -- */
61
+ z-outlet {
62
+ display: block;
63
+ max-width: 1200px;
64
+ margin: 2rem auto;
65
+ padding: 0 1.5rem;
66
+ }
67
+
68
+ .page-header {
69
+ margin-bottom: var(--gap);
70
+ }
71
+ .page-header h1 {
72
+ font-size: 2rem;
73
+ margin-bottom: 0.5rem;
74
+ }
75
+ .page-header .subtitle {
76
+ color: var(--muted);
77
+ }
78
+
79
+ .card {
80
+ background: var(--surface);
81
+ border: 1px solid rgba(255,255,255,0.06);
82
+ border-radius: var(--radius);
83
+ padding: 1.5rem;
84
+ margin-bottom: var(--gap);
85
+ }
86
+ .card h3 {
87
+ margin-bottom: 0.75rem;
88
+ color: var(--accent);
89
+ }
90
+ .card code {
91
+ background: rgba(255,255,255,0.06);
92
+ padding: 0.15em 0.4em;
93
+ border-radius: 4px;
94
+ font-size: 0.9em;
95
+ }
96
+ .card a {
97
+ color: var(--accent);
98
+ text-decoration: none;
99
+ transition: color 0.15s;
100
+ }
101
+ .card a:hover {
102
+ color: var(--accent-hover);
103
+ text-decoration: underline;
104
+ }
105
+
106
+ .badge {
107
+ display: inline-block;
108
+ padding: 2px 8px;
109
+ border-radius: 4px;
110
+ font-size: 0.8em;
111
+ font-weight: 600;
112
+ }
113
+ .badge-ssr { background: rgba(0,212,255,0.15); color: var(--accent); }
114
+ .badge-csr { background: rgba(255,165,0,0.15); color: #ffa500; }
115
+
116
+ /* -- Blog Grid -- */
117
+ .blog-grid {
118
+ display: grid;
119
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
120
+ gap: var(--gap);
121
+ }
122
+
123
+ .blog-card {
124
+ display: block;
125
+ text-decoration: none;
126
+ color: inherit;
127
+ background: var(--surface);
128
+ border: 1px solid rgba(255,255,255,0.06);
129
+ border-radius: var(--radius);
130
+ padding: 1.5rem;
131
+ transition: border-color 0.2s, transform 0.2s;
132
+ cursor: pointer;
133
+ }
134
+ .blog-card:hover {
135
+ border-color: rgba(0, 212, 255, 0.25);
136
+ transform: translateY(-2px);
137
+ }
138
+
139
+ .blog-card-header {
140
+ display: flex;
141
+ align-items: center;
142
+ justify-content: space-between;
143
+ margin-bottom: 0.75rem;
144
+ }
145
+
146
+ .blog-date {
147
+ font-size: 0.8em;
148
+ color: var(--muted);
149
+ }
150
+
151
+ .blog-title {
152
+ font-size: 1.1rem;
153
+ margin-bottom: 0.5rem;
154
+ color: var(--text);
155
+ }
156
+
157
+ .blog-summary {
158
+ color: var(--muted);
159
+ font-size: 0.9rem;
160
+ line-height: 1.6;
161
+ }
162
+
163
+ /* -- Blog Post Detail -- */
164
+ .back-link {
165
+ display: inline-block;
166
+ color: var(--accent);
167
+ font-size: 0.9rem;
168
+ margin-bottom: 1rem;
169
+ transition: opacity 0.15s;
170
+ text-decoration: none;
171
+ cursor: pointer;
172
+ }
173
+ .back-link:hover { opacity: 0.75; }
174
+
175
+ .blog-post-meta {
176
+ display: flex;
177
+ align-items: center;
178
+ gap: 0.75rem;
179
+ margin-top: 0.5rem;
180
+ }
181
+
182
+ .blog-post-body {
183
+ background: var(--surface);
184
+ border: 1px solid rgba(255,255,255,0.06);
185
+ border-radius: var(--radius);
186
+ padding: 2rem;
187
+ line-height: 1.8;
188
+ font-size: 0.95rem;
189
+ }
190
+ .blog-post-body h4 {
191
+ color: var(--accent);
192
+ margin: 1.5rem 0 0.75rem;
193
+ font-size: 1.05rem;
194
+ }
195
+ .blog-post-body h4:first-child { margin-top: 0; }
196
+ .blog-post-body ul, .blog-post-body ol {
197
+ padding-left: 1.5rem;
198
+ margin: 0.5rem 0;
199
+ }
200
+ .blog-post-body li { margin-bottom: 0.4rem; }
201
+ .blog-post-body pre {
202
+ background: rgba(0,0,0,0.3);
203
+ border-radius: var(--radius);
204
+ padding: 1rem 1.25rem;
205
+ overflow-x: auto;
206
+ margin: 0.75rem 0;
207
+ font-size: 0.85rem;
208
+ line-height: 1.5;
209
+ }
210
+ .blog-post-body code {
211
+ background: rgba(255,255,255,0.06);
212
+ padding: 0.15em 0.4em;
213
+ border-radius: 4px;
214
+ font-size: 0.9em;
215
+ }
216
+ .blog-post-body pre code {
217
+ background: none;
218
+ padding: 0;
219
+ }
220
+
221
+ /* -- Footer -- */
222
+ .footer {
223
+ text-align: center;
224
+ padding: 2rem;
225
+ color: var(--muted);
226
+ border-top: 1px solid rgba(255,255,255,0.06);
227
+ margin-top: 3rem;
228
+ }
@@ -1,37 +1,37 @@
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>{{NAME}}</title>
7
- <meta name="description" content="">
8
- <meta property="og:title" content="{{NAME}}">
9
- <meta property="og:description" content="">
10
- <meta property="og:type" content="website">
11
- <meta name="robots" content="index, follow">
12
- <base href="/">
13
- <link rel="stylesheet" href="global.css">
14
- <script src="zquery.min.js"></script>
15
- <script type="module" src="app/app.js"></script>
16
- </head>
17
- <body>
18
-
19
- <!-- Navigation -->
20
- <nav class="navbar">
21
- <span class="brand">⚡ {{NAME}}</span>
22
- <div class="nav-links">
23
- <a z-link="/" class="nav-link" z-active-route="/" z-active-exact>Home</a>
24
- <a z-link="/blog" class="nav-link" z-active-route="/blog">Blog</a>
25
- <a z-link="/about" class="nav-link" z-active-route="/about">About</a>
26
- </div>
27
- </nav>
28
-
29
- <!-- Main content - SSR output is injected here by the server -->
30
- <z-outlet></z-outlet>
31
-
32
- <footer class="footer">
33
- <small>Built with zQuery · SSR Scaffold</small>
34
- </footer>
35
-
36
- </body>
37
- </html>
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>{{NAME}}</title>
7
+ <meta name="description" content="">
8
+ <meta property="og:title" content="{{NAME}}">
9
+ <meta property="og:description" content="">
10
+ <meta property="og:type" content="website">
11
+ <meta name="robots" content="index, follow">
12
+ <base href="/">
13
+ <link rel="stylesheet" href="global.css">
14
+ <script src="zquery.min.js"></script>
15
+ <script type="module" src="app/app.js"></script>
16
+ </head>
17
+ <body>
18
+
19
+ <!-- Navigation -->
20
+ <nav class="navbar">
21
+ <span class="brand">⚡ {{NAME}}</span>
22
+ <div class="nav-links">
23
+ <a z-link="/" class="nav-link" z-active-route="/" z-active-exact>Home</a>
24
+ <a z-link="/blog" class="nav-link" z-active-route="/blog">Blog</a>
25
+ <a z-link="/about" class="nav-link" z-active-route="/about">About</a>
26
+ </div>
27
+ </nav>
28
+
29
+ <!-- Main content - SSR output is injected here by the server -->
30
+ <z-outlet></z-outlet>
31
+
32
+ <footer class="footer">
33
+ <small>Built with zQuery · SSR Scaffold</small>
34
+ </footer>
35
+
36
+ </body>
37
+ </html>
@@ -1,8 +1,8 @@
1
- {
2
- "name": "{{NAME}}",
3
- "private": true,
4
- "type": "module",
5
- "dependencies": {
6
- "zero-query": "latest"
7
- }
8
- }
1
+ {
2
+ "name": "{{NAME}}",
3
+ "private": true,
4
+ "type": "module",
5
+ "dependencies": {
6
+ "zero-query": "latest"
7
+ }
8
+ }