toiljs 0.0.5 → 0.0.6

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 (83) hide show
  1. package/build/cli/.tsbuildinfo +1 -1
  2. package/build/cli/create.js +75 -61
  3. package/build/client/.tsbuildinfo +1 -1
  4. package/build/client/channel/channel.d.ts +23 -0
  5. package/build/client/channel/channel.js +94 -0
  6. package/build/client/head/head.d.ts +26 -0
  7. package/build/client/head/head.js +87 -0
  8. package/build/client/index.d.ts +17 -17
  9. package/build/client/index.js +10 -10
  10. package/build/client/navigation/Link.d.ts +8 -0
  11. package/build/client/navigation/Link.js +44 -0
  12. package/build/client/navigation/NavLink.d.ts +14 -0
  13. package/build/client/navigation/NavLink.js +37 -0
  14. package/build/client/navigation/navigation.d.ts +13 -0
  15. package/build/client/navigation/navigation.js +97 -0
  16. package/build/client/navigation/prefetch.d.ts +11 -0
  17. package/build/client/navigation/prefetch.js +100 -0
  18. package/build/client/navigation/scroll.d.ts +8 -0
  19. package/build/client/navigation/scroll.js +36 -0
  20. package/build/client/routing/Router.d.ts +7 -0
  21. package/build/client/routing/Router.js +55 -0
  22. package/build/client/routing/error-boundary.d.ts +16 -0
  23. package/build/client/routing/error-boundary.js +19 -0
  24. package/build/client/routing/hooks.d.ts +17 -0
  25. package/build/client/routing/hooks.js +48 -0
  26. package/build/client/routing/lazy.d.ts +16 -0
  27. package/build/client/routing/lazy.js +53 -0
  28. package/build/client/routing/match.d.ts +2 -0
  29. package/build/client/routing/match.js +32 -0
  30. package/build/client/routing/mount.d.ts +2 -0
  31. package/build/client/routing/mount.js +13 -0
  32. package/build/client/routing/params-context.d.ts +2 -0
  33. package/build/client/routing/params-context.js +2 -0
  34. package/build/compiler/.tsbuildinfo +1 -1
  35. package/build/compiler/config.js +10 -1
  36. package/build/compiler/generate.js +18 -8
  37. package/build/compiler/plugin.js +14 -0
  38. package/examples/basic/client/components/HoneycombBackground.tsx +162 -0
  39. package/examples/basic/client/layout.tsx +12 -8
  40. package/examples/basic/client/public/favicon.ico +0 -0
  41. package/examples/basic/client/public/index.html +2 -1
  42. package/package.json +2 -2
  43. package/src/cli/create.ts +100 -73
  44. package/src/client/index.ts +17 -17
  45. package/src/client/{NavLink.tsx → navigation/NavLink.tsx} +1 -1
  46. package/src/client/{prefetch.ts → navigation/prefetch.ts} +2 -2
  47. package/src/client/{Router.tsx → routing/Router.tsx} +3 -3
  48. package/src/client/{error-boundary.tsx → routing/error-boundary.tsx} +1 -1
  49. package/src/client/{hooks.ts → routing/hooks.ts} +2 -2
  50. package/src/client/{lazy.ts → routing/lazy.ts} +1 -1
  51. package/src/client/{mount.tsx → routing/mount.tsx} +3 -3
  52. package/src/compiler/config.ts +11 -2
  53. package/src/compiler/generate.ts +24 -8
  54. package/src/compiler/plugin.ts +19 -0
  55. package/templates/app/client/404.tsx +11 -0
  56. package/templates/app/client/components/.gitkeep +1 -0
  57. package/templates/app/client/components/Footer.tsx +8 -0
  58. package/templates/app/client/components/HoneycombBackground.tsx +162 -0
  59. package/templates/app/client/layout.tsx +53 -0
  60. package/templates/app/client/public/favicon.ico +0 -0
  61. package/templates/app/client/public/images/.gitkeep +1 -0
  62. package/templates/app/client/public/images/logo.svg +37 -0
  63. package/templates/app/client/public/index.html +16 -0
  64. package/templates/app/client/public/robots.txt +2 -0
  65. package/templates/app/client/routes/about.tsx +11 -0
  66. package/templates/app/client/routes/blog/[id].tsx +12 -0
  67. package/templates/app/client/routes/docs/[...slug].tsx +12 -0
  68. package/templates/app/client/routes/get-started.tsx +84 -0
  69. package/templates/app/client/routes/index.tsx +80 -0
  70. package/templates/app/client/routes/io.tsx +24 -0
  71. package/templates/app/client/styles/main.css +461 -0
  72. package/templates/app/client/toil.tsx +7 -0
  73. package/test/channel.test.ts +1 -1
  74. package/test/head.test.ts +1 -1
  75. package/test/navlink.test.ts +1 -1
  76. package/test/routes.test.ts +1 -1
  77. /package/src/client/{channel.ts → channel/channel.ts} +0 -0
  78. /package/src/client/{head.ts → head/head.ts} +0 -0
  79. /package/src/client/{Link.tsx → navigation/Link.tsx} +0 -0
  80. /package/src/client/{navigation.ts → navigation/navigation.ts} +0 -0
  81. /package/src/client/{scroll.ts → navigation/scroll.ts} +0 -0
  82. /package/src/client/{match.ts → routing/match.ts} +0 -0
  83. /package/src/client/{params-context.ts → routing/params-context.ts} +0 -0
@@ -0,0 +1,461 @@
1
+ /* Global styles */
2
+
3
+ :root {
4
+ color-scheme: dark;
5
+ --accent: #2563ff;
6
+ --accent2: #7c3aed;
7
+ --accent3: #22e3ab;
8
+ --bg: #080d11;
9
+ --surface: #0e1520;
10
+ --border: #1b2330;
11
+ --text: #f5f6fa;
12
+ --muted: #8b9ab4;
13
+ }
14
+
15
+ *, *::before, *::after { box-sizing: border-box; }
16
+
17
+ body {
18
+ margin: 0;
19
+ min-height: 100vh;
20
+ background: var(--bg);
21
+ color: var(--text);
22
+ font-family: system-ui, -apple-system, sans-serif;
23
+ line-height: 1.6;
24
+ }
25
+
26
+ a { color: var(--accent); text-decoration: none; }
27
+ a:hover { color: var(--accent3); }
28
+
29
+ /* ── App shell ── */
30
+ .app {
31
+ display: flex;
32
+ flex-direction: column;
33
+ min-height: 100vh;
34
+ }
35
+
36
+ .content {
37
+ flex: 1;
38
+ display: flex;
39
+ align-items: center;
40
+ justify-content: center;
41
+ }
42
+
43
+ /* ── Nav ── */
44
+ .nav {
45
+ display: flex;
46
+ align-items: center;
47
+ justify-content: space-between;
48
+ padding: 0 2rem;
49
+ height: 60px;
50
+ border-bottom: 1px solid var(--border);
51
+ background: rgba(8, 13, 17, 0.85);
52
+ backdrop-filter: blur(10px);
53
+ position: sticky;
54
+ top: 0;
55
+ z-index: 100;
56
+ }
57
+
58
+ .nav-logo {
59
+ display: flex;
60
+ align-items: center;
61
+ gap: 0.6rem;
62
+ font-weight: 800;
63
+ font-size: 1.05rem;
64
+ font-family: 'Montserrat', system-ui, sans-serif;
65
+ color: var(--text) !important;
66
+ line-height: 1;
67
+ }
68
+
69
+ .nav-logo span {
70
+ display: block;
71
+ line-height: 1;
72
+ padding-top: 0.1em;
73
+ }
74
+
75
+ .nav-logo img {
76
+ display: block;
77
+ border-radius: 6px;
78
+ flex-shrink: 0;
79
+ }
80
+
81
+ .nav-links {
82
+ display: flex;
83
+ gap: 1.5rem;
84
+ font-size: 0.95rem;
85
+ }
86
+
87
+ .nav-links a { color: var(--muted); }
88
+ .nav-links a:hover { color: var(--text); }
89
+
90
+ /* Center nav */
91
+ .nav-center {
92
+ position: absolute;
93
+ left: 50%;
94
+ transform: translateX(-50%);
95
+ display: flex;
96
+ gap: 0.25rem;
97
+ }
98
+
99
+ .nav-center-link {
100
+ padding: 0.3em 0.85em;
101
+ border-radius: 6px;
102
+ font-size: 0.9rem;
103
+ color: var(--muted) !important;
104
+ transition: color 150ms, background 150ms;
105
+ }
106
+
107
+ .nav-center-link:hover {
108
+ color: var(--text) !important;
109
+ background: rgba(255,255,255,0.05);
110
+ }
111
+
112
+ .nav-center-link.active {
113
+ color: var(--text) !important;
114
+ background: rgba(37,99,255,0.12);
115
+ }
116
+
117
+ .nav-github {
118
+ display: flex;
119
+ align-items: center;
120
+ gap: 0.4rem;
121
+ }
122
+
123
+ .nav-github svg { display: block; }
124
+
125
+ /* ── Hero ── */
126
+ .hero {
127
+ display: flex;
128
+ flex-direction: column;
129
+ align-items: center;
130
+ text-align: center;
131
+ padding: 5rem 1.5rem 4rem;
132
+ gap: 1.25rem;
133
+ max-width: 680px;
134
+ margin: 0 auto;
135
+ }
136
+
137
+ /* Logo with blurred glow clone */
138
+ .hero-logo {
139
+ position: relative;
140
+ width: 96px;
141
+ height: 96px;
142
+ }
143
+
144
+ .hero-logo-img {
145
+ position: relative;
146
+ z-index: 1;
147
+ display: block;
148
+ border-radius: 22px;
149
+ transition: transform 300ms;
150
+ }
151
+
152
+ .hero-logo-img:hover {
153
+ transform: scale(1.06);
154
+ }
155
+
156
+ .hero-logo-glow {
157
+ position: absolute;
158
+ inset: 0;
159
+ z-index: 0;
160
+ display: block;
161
+ border-radius: 22px;
162
+ transform: scale(1.1);
163
+ filter: blur(18px) saturate(1.4);
164
+ opacity: 0.65;
165
+ transition: opacity 300ms, filter 300ms, transform 300ms;
166
+ }
167
+
168
+ .hero-logo:hover .hero-logo-glow {
169
+ opacity: 0.9;
170
+ filter: blur(24px) saturate(1.8);
171
+ transform: scale(1.15);
172
+ }
173
+
174
+ /* Heading */
175
+ .hero-title {
176
+ margin: 0;
177
+ font-size: clamp(2.8rem, 7vw, 4.5rem);
178
+ font-weight: 900;
179
+ font-family: 'Montserrat', system-ui, sans-serif;
180
+ letter-spacing: -0.03em;
181
+ background: linear-gradient(100deg, var(--accent), var(--accent2) 50%, var(--accent3));
182
+ -webkit-background-clip: text;
183
+ background-clip: text;
184
+ color: transparent;
185
+ }
186
+
187
+ .hero-tagline {
188
+ margin: 0;
189
+ font-size: clamp(1.2rem, 3vw, 1.6rem);
190
+ font-weight: 600;
191
+ color: var(--text);
192
+ line-height: 1.4;
193
+ }
194
+
195
+ .hero-tagline span {
196
+ color: var(--muted);
197
+ font-weight: 400;
198
+ }
199
+
200
+ .hero-desc {
201
+ margin: 0;
202
+ font-size: 1rem;
203
+ color: var(--muted);
204
+ max-width: 480px;
205
+ }
206
+
207
+ /* ── Feature badges ── */
208
+ .features {
209
+ list-style: none;
210
+ margin: 0.25rem 0 0;
211
+ padding: 0;
212
+ display: flex;
213
+ flex-wrap: wrap;
214
+ gap: 0.6rem;
215
+ justify-content: center;
216
+ }
217
+
218
+ .feature-badge {
219
+ display: flex;
220
+ align-items: center;
221
+ gap: 0.45rem;
222
+ padding: 0.35em 0.9em;
223
+ background: var(--surface);
224
+ border: 1px solid var(--border);
225
+ border-radius: 999px;
226
+ font-size: 0.88rem;
227
+ color: var(--muted);
228
+ transition: border-color 200ms, color 200ms;
229
+ }
230
+
231
+ .feature-badge svg {
232
+ flex-shrink: 0;
233
+ display: block;
234
+ color: var(--accent);
235
+ transition: color 200ms;
236
+ }
237
+
238
+ .feature-badge:hover {
239
+ border-color: var(--accent);
240
+ color: var(--text);
241
+ }
242
+
243
+ .feature-badge:hover svg {
244
+ color: var(--accent3);
245
+ }
246
+
247
+ /* ── CTA buttons ── */
248
+ .hero-cta {
249
+ display: flex;
250
+ gap: 0.75rem;
251
+ flex-wrap: wrap;
252
+ justify-content: center;
253
+ margin-top: 0.5rem;
254
+ }
255
+
256
+ .btn {
257
+ display: inline-flex;
258
+ align-items: center;
259
+ justify-content: center;
260
+ gap: 0.45rem;
261
+ padding: 0.65em 1.6em;
262
+ border-radius: 8px;
263
+ font-size: 0.95rem;
264
+ font-weight: 600;
265
+ font-family: inherit;
266
+ cursor: pointer;
267
+ transition: filter 200ms, background 200ms, border-color 200ms;
268
+ text-decoration: none !important;
269
+ }
270
+
271
+ .btn svg { display: block; }
272
+
273
+ .btn-primary {
274
+ background: var(--accent);
275
+ color: #fff !important;
276
+ border: 1px solid var(--accent);
277
+ }
278
+
279
+ .btn-primary:hover {
280
+ filter: brightness(1.15);
281
+ }
282
+
283
+ .btn-secondary {
284
+ background: var(--surface);
285
+ color: var(--text) !important;
286
+ border: 1px solid var(--border);
287
+ }
288
+
289
+ .btn-secondary:hover {
290
+ border-color: var(--accent);
291
+ background: #131d2e;
292
+ }
293
+
294
+ /* ── Footer ── */
295
+ .footer {
296
+ text-align: center;
297
+ padding: 1.25rem;
298
+ font-size: 0.82rem;
299
+ color: var(--muted);
300
+ border-top: 1px solid var(--border);
301
+ }
302
+
303
+ /* ── Misc ── */
304
+ code {
305
+ background: #0d131c;
306
+ color: var(--accent3);
307
+ padding: 0.1rem 0.4rem;
308
+ border-radius: 4px;
309
+ font-size: 0.88em;
310
+ }
311
+
312
+ /* ── Get Started page ── */
313
+ .gs-page {
314
+ width: 100%;
315
+ max-width: 860px;
316
+ margin: 0 auto;
317
+ padding: 4rem 1.5rem 5rem;
318
+ display: flex;
319
+ flex-direction: column;
320
+ gap: 3rem;
321
+ }
322
+
323
+ .gs-hero {
324
+ text-align: center;
325
+ }
326
+
327
+ .gs-title {
328
+ margin: 0 0 0.5rem;
329
+ font-size: clamp(2.2rem, 5vw, 3.2rem);
330
+ font-weight: 900;
331
+ font-family: 'Montserrat', system-ui, sans-serif;
332
+ letter-spacing: -0.03em;
333
+ background: linear-gradient(100deg, var(--accent), var(--accent2) 50%, var(--accent3));
334
+ -webkit-background-clip: text;
335
+ background-clip: text;
336
+ color: transparent;
337
+ }
338
+
339
+ .gs-desc {
340
+ margin: 0;
341
+ font-size: 1.05rem;
342
+ color: var(--muted);
343
+ }
344
+
345
+ /* Section */
346
+ .gs-section {
347
+ display: flex;
348
+ flex-direction: column;
349
+ gap: 1rem;
350
+ }
351
+
352
+ .gs-section-title {
353
+ margin: 0;
354
+ font-size: 0.72rem;
355
+ font-weight: 700;
356
+ letter-spacing: 0.12em;
357
+ text-transform: uppercase;
358
+ color: var(--muted);
359
+ }
360
+
361
+
362
+ /* Info grid */
363
+ .gs-grid {
364
+ display: grid;
365
+ grid-template-columns: repeat(2, 1fr);
366
+ gap: 1rem;
367
+ }
368
+
369
+ @media (max-width: 560px) {
370
+ .gs-grid { grid-template-columns: 1fr; }
371
+ }
372
+
373
+ .gs-card {
374
+ background: var(--surface);
375
+ border: 1px solid var(--border);
376
+ border-radius: 14px;
377
+ padding: 1.5rem;
378
+ display: flex;
379
+ flex-direction: column;
380
+ gap: 0.6rem;
381
+ transition: border-color 200ms, transform 200ms, box-shadow 200ms;
382
+ }
383
+
384
+ .gs-card {
385
+ transform: translateY(-2px);
386
+ }
387
+
388
+ /* Accent top-border glow per card */
389
+ .gs-card--accent1 { border-top: 2px solid var(--accent); }
390
+ .gs-card--accent1:hover { box-shadow: 0 8px 32px rgba(37,99,255,0.15); }
391
+
392
+ .gs-card--accent2 { border-top: 2px solid var(--accent2); }
393
+ .gs-card--accent2:hover { box-shadow: 0 8px 32px rgba(124,58,237,0.15); }
394
+
395
+ .gs-card--accent3 { border-top: 2px solid var(--accent3); }
396
+ .gs-card--accent3:hover { box-shadow: 0 8px 32px rgba(34,227,171,0.12); }
397
+
398
+ .gs-card--accent4 { border-top: 2px solid #f59e0b; }
399
+ .gs-card--accent4:hover { box-shadow: 0 8px 32px rgba(245,158,11,0.12); }
400
+
401
+ .gs-card--flat {
402
+ border-top: 2px solid var(--accent);
403
+ }
404
+ .gs-card--flat:hover {
405
+ border-color: var(--accent);
406
+ box-shadow: 0 8px 32px rgba(37,99,255,0.12);
407
+ }
408
+
409
+ .gs-card-icon {
410
+ display: flex;
411
+ align-items: center;
412
+ justify-content: center;
413
+ width: 42px;
414
+ height: 42px;
415
+ border-radius: 10px;
416
+ background: rgba(37,99,255,0.1);
417
+ color: var(--accent);
418
+ margin-bottom: 0.25rem;
419
+ }
420
+
421
+ .gs-card--accent2 .gs-card-icon { background: rgba(124,58,237,0.1); color: var(--accent2); }
422
+ .gs-card--accent3 .gs-card-icon { background: rgba(34,227,171,0.1); color: var(--accent3); }
423
+ .gs-card--accent4 .gs-card-icon { background: rgba(245,158,11,0.1); color: #f59e0b; }
424
+
425
+ .gs-card h3 {
426
+ margin: 0;
427
+ font-size: 0.97rem;
428
+ font-weight: 700;
429
+ color: var(--text);
430
+ }
431
+
432
+ .gs-card p {
433
+ margin: 0;
434
+ font-size: 0.85rem;
435
+ color: var(--muted);
436
+ line-height: 1.6;
437
+ }
438
+
439
+ .gs-card pre {
440
+ margin: 0;
441
+ background: #0a0f18;
442
+ border: 1px solid var(--border);
443
+ border-radius: 6px;
444
+ padding: 0.6rem 0.85rem;
445
+ overflow-x: auto;
446
+ }
447
+
448
+ .gs-card pre code {
449
+ background: none;
450
+ padding: 0;
451
+ font-size: 0.8rem;
452
+ color: var(--accent3);
453
+ white-space: pre;
454
+ }
455
+
456
+ .gs-actions {
457
+ display: flex;
458
+ gap: 0.75rem;
459
+ flex-wrap: wrap;
460
+ }
461
+
@@ -0,0 +1,7 @@
1
+ import { routes, layout, notFound } from 'toiljs/routes';
2
+
3
+ import './styles/main.css';
4
+
5
+
6
+
7
+ Toil.mount(routes, layout, notFound);
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
 
3
- import { resolveChannelUrl } from '../src/client/channel';
3
+ import { resolveChannelUrl } from '../src/client/channel/channel';
4
4
 
5
5
  describe('resolveChannelUrl', () => {
6
6
  it('uses ws:// over http and the default /_toil path', () => {
package/test/head.test.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
 
3
- import { mergeHead } from '../src/client/head';
3
+ import { mergeHead } from '../src/client/head/head';
4
4
 
5
5
  describe('mergeHead', () => {
6
6
  it('takes the last title and applies a titleTemplate', () => {
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
 
3
- import { matchActive } from '../src/client/NavLink';
3
+ import { matchActive } from '../src/client/navigation/NavLink';
4
4
 
5
5
  describe('matchActive', () => {
6
6
  it('matches exact paths', () => {
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
 
3
- import { matchRoute } from '../src/client/match';
3
+ import { matchRoute } from '../src/client/routing/match';
4
4
  import { filePathToRoute } from '../src/compiler/routes';
5
5
 
6
6
  describe('filePathToRoute', () => {
File without changes
File without changes
File without changes
File without changes
File without changes