@farm.js/create-app 0.1.0-beta.3 → 0.1.0-beta.31

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 (111) hide show
  1. package/README.md +31 -4
  2. package/bin/create-farm-app.js +7 -1
  3. package/dist/index.js +2893 -19
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.mjs +2889 -18
  6. package/dist/index.mjs.map +1 -1
  7. package/dist/utils.js +9 -6
  8. package/dist/utils.js.map +1 -1
  9. package/dist/utils.mjs +9 -6
  10. package/dist/utils.mjs.map +1 -1
  11. package/package.json +2 -2
  12. package/templates/_renderers/preact/farm.config.ts +12 -0
  13. package/templates/_renderers/preact/package.json +27 -0
  14. package/templates/_renderers/preact/src/app/api/greeting/route.ts +15 -0
  15. package/templates/_renderers/preact/src/app/layout.tsx +16 -0
  16. package/templates/_renderers/preact/src/app/page.tsx +66 -0
  17. package/templates/_renderers/preact/src/app/preact.css +26 -0
  18. package/templates/_renderers/preact/src/components/resource-links.tsx +71 -0
  19. package/templates/_renderers/preact/src/lib/api-client.ts +4 -0
  20. package/templates/_renderers/preact/src/lib/api.generated.ts +7 -0
  21. package/templates/_renderers/preact/tsconfig.json +25 -0
  22. package/templates/_renderers/solid/farm.config.ts +12 -0
  23. package/templates/_renderers/solid/package.json +26 -0
  24. package/templates/_renderers/solid/src/app/api/greeting/route.ts +15 -0
  25. package/templates/_renderers/solid/src/app/layout.tsx +15 -0
  26. package/templates/_renderers/solid/src/app/page.tsx +56 -0
  27. package/templates/_renderers/solid/src/app/solid.css +22 -0
  28. package/templates/_renderers/solid/src/components/resource-links.tsx +71 -0
  29. package/templates/_renderers/solid/src/lib/api-client.ts +4 -0
  30. package/templates/_renderers/solid/src/lib/api.generated.ts +7 -0
  31. package/templates/_renderers/solid/tsconfig.json +25 -0
  32. package/templates/_renderers/svelte/farm.config.ts +9 -0
  33. package/templates/_renderers/svelte/package.json +28 -0
  34. package/templates/_renderers/svelte/src/app/api/greeting/route.ts +15 -0
  35. package/templates/_renderers/svelte/src/app/layout.svelte +21 -0
  36. package/templates/_renderers/svelte/src/app/page.svelte +64 -0
  37. package/templates/_renderers/svelte/src/app/svelte.css +26 -0
  38. package/templates/_renderers/svelte/src/components/resource-links.svelte +31 -0
  39. package/templates/_renderers/svelte/src/lib/api-client.ts +4 -0
  40. package/templates/_renderers/svelte/src/lib/api.generated.ts +7 -0
  41. package/templates/_renderers/svelte/tsconfig.json +23 -0
  42. package/templates/_renderers/vue/farm.config.ts +12 -0
  43. package/templates/_renderers/vue/package.json +27 -0
  44. package/templates/_renderers/vue/src/app/api/greeting/route.ts +15 -0
  45. package/templates/_renderers/vue/src/app/layout.vue +21 -0
  46. package/templates/_renderers/vue/src/app/page.vue +69 -0
  47. package/templates/_renderers/vue/src/app/vue.css +26 -0
  48. package/templates/_renderers/vue/src/components/resource-links.vue +33 -0
  49. package/templates/_renderers/vue/src/env.d.ts +7 -0
  50. package/templates/_renderers/vue/src/lib/api-client.ts +4 -0
  51. package/templates/_renderers/vue/src/lib/api.generated.ts +7 -0
  52. package/templates/_renderers/vue/tsconfig.json +23 -0
  53. package/templates/auth/.env.example +6 -0
  54. package/templates/auth/README.md +95 -0
  55. package/templates/auth/farm.config.ts +14 -0
  56. package/templates/auth/gitignore +10 -0
  57. package/templates/auth/package.json +32 -0
  58. package/templates/auth/pnpm-workspace.yaml +13 -0
  59. package/templates/auth/src/app/dashboard/middleware.ts +13 -0
  60. package/templates/auth/src/app/dashboard/page.tsx +140 -0
  61. package/templates/auth/src/app/error.tsx +25 -0
  62. package/templates/auth/src/app/globals.css +1064 -0
  63. package/templates/auth/src/app/layout.tsx +11 -0
  64. package/templates/auth/src/app/loading.tsx +15 -0
  65. package/templates/auth/src/app/not-found.tsx +26 -0
  66. package/templates/auth/src/app/page.tsx +46 -0
  67. package/templates/auth/src/app/sign-in/page.tsx +16 -0
  68. package/templates/auth/src/app/sign-up/page.tsx +16 -0
  69. package/templates/auth/src/components/auth-form.tsx +120 -0
  70. package/templates/auth/src/components/auth-shell.tsx +21 -0
  71. package/templates/auth/src/components/resource-links.tsx +78 -0
  72. package/templates/auth/src/components/sign-out-button.tsx +45 -0
  73. package/templates/auth/src/components/site-header.tsx +46 -0
  74. package/templates/auth/tsconfig.json +20 -0
  75. package/templates/basic/farm.config.ts +3 -1
  76. package/templates/basic/gitignore +23 -0
  77. package/templates/basic/package.json +4 -2
  78. package/templates/basic/pnpm-workspace.yaml +8 -0
  79. package/templates/basic/public/favicon.svg +13 -0
  80. package/templates/basic/src/app/globals.css +241 -0
  81. package/templates/basic/src/app/layout.tsx +6 -5
  82. package/templates/basic/src/app/page.tsx +20 -61
  83. package/templates/basic/src/components/resource-links.tsx +78 -0
  84. package/templates/basic/tsconfig.json +4 -0
  85. package/templates/better-auth/.env.example +3 -0
  86. package/templates/better-auth/README.md +87 -0
  87. package/templates/better-auth/farm.config.ts +32 -0
  88. package/templates/better-auth/gitignore +10 -0
  89. package/templates/better-auth/package.json +34 -0
  90. package/templates/better-auth/pnpm-workspace.yaml +13 -0
  91. package/templates/better-auth/src/app/dashboard/middleware.ts +15 -0
  92. package/templates/better-auth/src/app/dashboard/page.tsx +188 -0
  93. package/templates/better-auth/src/app/error.tsx +25 -0
  94. package/templates/better-auth/src/app/globals.css +1064 -0
  95. package/templates/better-auth/src/app/layout.tsx +11 -0
  96. package/templates/better-auth/src/app/loading.tsx +15 -0
  97. package/templates/better-auth/src/app/not-found.tsx +26 -0
  98. package/templates/better-auth/src/app/page.tsx +50 -0
  99. package/templates/better-auth/src/app/sign-in/page.tsx +16 -0
  100. package/templates/better-auth/src/app/sign-up/page.tsx +16 -0
  101. package/templates/better-auth/src/components/auth-form.tsx +120 -0
  102. package/templates/better-auth/src/components/auth-shell.tsx +21 -0
  103. package/templates/better-auth/src/components/resource-links.tsx +78 -0
  104. package/templates/better-auth/src/components/sign-out-button.tsx +45 -0
  105. package/templates/better-auth/src/components/site-header.tsx +46 -0
  106. package/templates/better-auth/src/lib/auth-client.ts +5 -0
  107. package/templates/better-auth/src/lib/auth.ts +50 -0
  108. package/templates/better-auth/src/lib/session.ts +8 -0
  109. package/templates/better-auth/tsconfig.json +20 -0
  110. package/templates/basic/src/app/about/page.tsx +0 -32
  111. package/templates/basic/src/farm-images.d.ts +0 -59
@@ -0,0 +1,1064 @@
1
+ @import "@fontsource-variable/geist/wght.css";
2
+ @import "@fontsource-variable/geist-mono/wght.css";
3
+ @import "tailwindcss";
4
+
5
+ :root {
6
+ --paper: #000000;
7
+ --paper-soft: #080808;
8
+ --paper-muted: #0e0e0e;
9
+ --ink: #f5f5f5;
10
+ --ink-soft: #a1a1a1;
11
+ --ink-faint: #686868;
12
+ --line: rgb(255 255 255 / 0.12);
13
+ --line-strong: rgb(255 255 255 / 0.22);
14
+ --accent: #8ce0b5;
15
+ --accent-soft: rgb(140 224 181 / 0.1);
16
+ --danger: #ff8f87;
17
+ --danger-soft: rgb(164 60 52 / 0.16);
18
+ --focus: #ffffff;
19
+ --font-sans: "Geist Variable", ui-sans-serif, system-ui, sans-serif;
20
+ --font-mono: "Geist Mono Variable", ui-monospace, monospace;
21
+ color: var(--ink);
22
+ font-family: var(--font-sans);
23
+ font-synthesis: none;
24
+ color-scheme: dark;
25
+ }
26
+
27
+ * {
28
+ box-sizing: border-box;
29
+ }
30
+
31
+ html {
32
+ min-width: 320px;
33
+ min-height: 100%;
34
+ background: var(--paper);
35
+ }
36
+
37
+ body {
38
+ min-height: 100vh;
39
+ margin: 0;
40
+ background: var(--paper);
41
+ color: var(--ink);
42
+ font-family: var(--font-sans);
43
+ text-rendering: optimizeLegibility;
44
+ }
45
+
46
+ #root {
47
+ min-height: 100vh;
48
+ }
49
+
50
+ button,
51
+ input {
52
+ font: inherit;
53
+ }
54
+
55
+ button,
56
+ a {
57
+ -webkit-tap-highlight-color: transparent;
58
+ }
59
+
60
+ a {
61
+ color: inherit;
62
+ text-decoration: none;
63
+ }
64
+
65
+ code,
66
+ .mono {
67
+ font-family: var(--font-mono);
68
+ }
69
+
70
+ ::selection {
71
+ background: white;
72
+ color: black;
73
+ }
74
+
75
+ :focus-visible {
76
+ outline: 2px solid var(--focus);
77
+ outline-offset: 3px;
78
+ }
79
+
80
+ .site-frame {
81
+ position: relative;
82
+ isolation: isolate;
83
+ width: min(100%, 880px);
84
+ min-height: 100svh;
85
+ margin: 0 auto;
86
+ border-inline: 1px solid var(--line);
87
+ background: var(--paper);
88
+ }
89
+
90
+ .site-header {
91
+ position: relative;
92
+ z-index: 10;
93
+ display: flex;
94
+ width: 100%;
95
+ min-height: 68px;
96
+ align-items: center;
97
+ justify-content: space-between;
98
+ gap: 2rem;
99
+ border-bottom: 1px solid var(--line);
100
+ padding-left: clamp(1.25rem, 4vw, 2.5rem);
101
+ }
102
+
103
+ .brand {
104
+ display: inline-flex;
105
+ align-items: center;
106
+ gap: 0.7rem;
107
+ min-width: 0;
108
+ }
109
+
110
+ .brand-mark {
111
+ display: inline-grid;
112
+ width: 30px;
113
+ height: 30px;
114
+ flex: 0 0 auto;
115
+ place-items: center;
116
+ background: var(--ink);
117
+ color: var(--paper);
118
+ font-family: var(--font-mono);
119
+ font-size: 0.78rem;
120
+ font-weight: 650;
121
+ }
122
+
123
+ .brand > span:last-child {
124
+ display: grid;
125
+ gap: 0.05rem;
126
+ }
127
+
128
+ .brand strong {
129
+ font-size: 0.9rem;
130
+ font-weight: 600;
131
+ letter-spacing: -0.02em;
132
+ }
133
+
134
+ .brand small {
135
+ color: var(--ink-faint);
136
+ font-family: var(--font-mono);
137
+ font-size: 0.62rem;
138
+ letter-spacing: 0.04em;
139
+ text-transform: uppercase;
140
+ }
141
+
142
+ .brand-on-dark,
143
+ .brand-on-dark small {
144
+ color: inherit;
145
+ }
146
+
147
+ .header-nav {
148
+ display: flex;
149
+ align-items: stretch;
150
+ align-self: stretch;
151
+ color: var(--ink-soft);
152
+ font-family: var(--font-mono);
153
+ font-size: 0.67rem;
154
+ text-transform: uppercase;
155
+ }
156
+
157
+ .header-nav > a {
158
+ display: inline-flex;
159
+ align-items: center;
160
+ border-left: 1px solid var(--line);
161
+ padding-inline: 1rem;
162
+ transition:
163
+ background-color 150ms ease,
164
+ color 150ms ease;
165
+ }
166
+
167
+ .header-nav > a:hover {
168
+ background: rgb(255 255 255 / 0.04);
169
+ color: var(--ink);
170
+ }
171
+
172
+ .header-account {
173
+ display: flex;
174
+ align-items: center;
175
+ gap: 0.6rem;
176
+ padding-left: 1rem;
177
+ }
178
+
179
+ .avatar {
180
+ display: grid;
181
+ width: 32px;
182
+ height: 32px;
183
+ place-items: center;
184
+ border: 1px solid var(--line);
185
+ border-radius: 50%;
186
+ background: var(--paper-soft);
187
+ color: var(--ink);
188
+ font-family: var(--font-mono);
189
+ font-size: 0.72rem;
190
+ font-weight: 600;
191
+ }
192
+
193
+ .account-copy {
194
+ display: grid;
195
+ max-width: 160px;
196
+ }
197
+
198
+ .account-copy small {
199
+ color: var(--ink-faint);
200
+ font-family: var(--font-mono);
201
+ font-size: 0.58rem;
202
+ letter-spacing: 0.04em;
203
+ text-transform: uppercase;
204
+ }
205
+
206
+ .account-copy strong {
207
+ overflow: hidden;
208
+ color: var(--ink);
209
+ font-size: 0.78rem;
210
+ font-weight: 550;
211
+ text-overflow: ellipsis;
212
+ white-space: nowrap;
213
+ }
214
+
215
+ .button {
216
+ display: inline-flex;
217
+ min-height: 44px;
218
+ align-items: center;
219
+ justify-content: center;
220
+ gap: 0.65rem;
221
+ border: 1px solid transparent;
222
+ padding: 0.68rem 0.95rem;
223
+ font-size: 0.82rem;
224
+ font-weight: 540;
225
+ line-height: 1;
226
+ cursor: pointer;
227
+ transition:
228
+ background-color 150ms ease,
229
+ border-color 150ms ease,
230
+ color 150ms ease;
231
+ }
232
+
233
+ .button:disabled {
234
+ cursor: wait;
235
+ opacity: 0.58;
236
+ }
237
+
238
+ .button-primary {
239
+ border-color: var(--ink);
240
+ background: var(--ink);
241
+ color: var(--paper);
242
+ }
243
+
244
+ .button-primary:hover:not(:disabled) {
245
+ background: #d8d8d8;
246
+ }
247
+
248
+ .button-secondary {
249
+ border-color: var(--line-strong);
250
+ background: var(--paper);
251
+ color: var(--ink);
252
+ }
253
+
254
+ .button-secondary:hover:not(:disabled) {
255
+ border-color: var(--ink-soft);
256
+ background: rgb(255 255 255 / 0.05);
257
+ }
258
+
259
+ .button-small {
260
+ min-height: 100%;
261
+ padding-inline: 1rem;
262
+ font-family: var(--font-mono);
263
+ font-size: 0.67rem;
264
+ text-transform: uppercase;
265
+ }
266
+
267
+ .landing-main {
268
+ position: relative;
269
+ isolation: isolate;
270
+ width: 100%;
271
+ min-height: 100vh;
272
+ overflow: hidden;
273
+ background: var(--paper);
274
+ }
275
+
276
+ .hero-section {
277
+ position: relative;
278
+ display: flex;
279
+ width: 100%;
280
+ overflow: hidden;
281
+ min-height: 100vh;
282
+ align-items: center;
283
+ justify-content: flex-start;
284
+ padding: clamp(2rem, 6vh, 4rem) clamp(1.25rem, 7vw, 6rem);
285
+ }
286
+
287
+ .hero-section::before,
288
+ .hero-section::after {
289
+ position: absolute;
290
+ width: 9px;
291
+ height: 9px;
292
+ border-color: rgb(255 255 255 / 0.3);
293
+ content: "";
294
+ pointer-events: none;
295
+ }
296
+
297
+ .hero-section::before {
298
+ top: -1px;
299
+ left: -1px;
300
+ border-top: 1px solid;
301
+ border-left: 1px solid;
302
+ }
303
+
304
+ .hero-section::after {
305
+ right: 0;
306
+ bottom: -1px;
307
+ border-right: 1px solid;
308
+ border-bottom: 1px solid;
309
+ }
310
+
311
+ .hero-copy {
312
+ width: min(100%, 680px);
313
+ margin: 0;
314
+ }
315
+
316
+ .eyebrow-row {
317
+ display: flex;
318
+ align-items: center;
319
+ gap: 0.65rem;
320
+ color: var(--ink-faint);
321
+ font-family: var(--font-mono);
322
+ font-size: 0.67rem;
323
+ text-transform: uppercase;
324
+ }
325
+
326
+ .eyebrow-row span:first-child {
327
+ color: var(--ink);
328
+ }
329
+
330
+ .status-dot {
331
+ display: inline-block;
332
+ width: 7px;
333
+ height: 7px;
334
+ flex: 0 0 auto;
335
+ border-radius: 50%;
336
+ background: var(--accent);
337
+ box-shadow: 0 0 0 3px var(--accent-soft);
338
+ }
339
+
340
+ .hero-copy h1 {
341
+ max-width: 640px;
342
+ margin: 1.4rem 0 0;
343
+ font-size: clamp(1.85rem, 4vw, 3.2rem);
344
+ font-weight: 510;
345
+ letter-spacing: -0.05em;
346
+ line-height: 1.05;
347
+ }
348
+
349
+ .hero-copy h1 code {
350
+ border: 1px solid var(--line);
351
+ background: rgb(255 255 255 / 0.07);
352
+ padding: 0.04em 0.2em;
353
+ font-size: 0.78em;
354
+ font-weight: 450;
355
+ letter-spacing: -0.035em;
356
+ white-space: nowrap;
357
+ }
358
+
359
+ .command-list {
360
+ max-width: 520px;
361
+ margin-top: 1.75rem;
362
+ border-block: 1px solid var(--line);
363
+ }
364
+
365
+ .command-row {
366
+ display: grid;
367
+ min-width: 0;
368
+ grid-template-columns: auto minmax(0, 1fr);
369
+ align-items: center;
370
+ gap: 0.8rem;
371
+ padding: 0.9rem 0;
372
+ }
373
+
374
+ .command-row + .command-row {
375
+ border-top: 1px solid var(--line);
376
+ }
377
+
378
+ .command-row > span {
379
+ color: var(--ink-faint);
380
+ font-family: var(--font-mono);
381
+ font-size: 0.62rem;
382
+ }
383
+
384
+ .command-row code {
385
+ color: var(--ink);
386
+ font-size: 0.75rem;
387
+ overflow-wrap: anywhere;
388
+ }
389
+
390
+ .resource-links {
391
+ display: flex;
392
+ flex-wrap: wrap;
393
+ gap: 0.65rem;
394
+ margin-top: 1.5rem;
395
+ color: var(--ink-soft);
396
+ font-family: var(--font-mono);
397
+ font-size: 0.68rem;
398
+ text-transform: uppercase;
399
+ }
400
+
401
+ .resource-link-item {
402
+ display: inline-flex;
403
+ align-items: center;
404
+ gap: 0.65rem;
405
+ white-space: nowrap;
406
+ }
407
+
408
+ .resource-separator {
409
+ color: var(--ink-faint);
410
+ user-select: none;
411
+ }
412
+
413
+ .resource-links a {
414
+ display: inline-flex;
415
+ align-items: center;
416
+ gap: 0.45rem;
417
+ border-bottom: 1px solid transparent;
418
+ padding-block: 0.2rem;
419
+ transition:
420
+ border-color 150ms ease,
421
+ color 150ms ease;
422
+ }
423
+
424
+ .resource-icon {
425
+ width: 0.85rem;
426
+ height: 0.85rem;
427
+ flex: 0 0 auto;
428
+ }
429
+
430
+ .resource-links a:hover,
431
+ .resource-links .resource-link-primary {
432
+ color: var(--ink);
433
+ }
434
+
435
+ .resource-links a:hover {
436
+ border-color: currentColor;
437
+ }
438
+
439
+ .hero-actions {
440
+ display: flex;
441
+ flex-wrap: wrap;
442
+ gap: 0.65rem;
443
+ margin-top: 2rem;
444
+ }
445
+
446
+ .version-row,
447
+ .section-index {
448
+ font-family: var(--font-mono);
449
+ font-size: 0.67rem;
450
+ letter-spacing: 0.025em;
451
+ }
452
+
453
+ .version-row {
454
+ display: flex;
455
+ flex-wrap: wrap;
456
+ gap: 0.5rem 0.75rem;
457
+ margin-top: 1.4rem;
458
+ color: var(--ink-faint);
459
+ }
460
+
461
+ .version-row span + span::before {
462
+ margin-right: 0.75rem;
463
+ color: var(--line-strong);
464
+ content: "•";
465
+ }
466
+
467
+ .section-index {
468
+ color: var(--accent);
469
+ font-weight: 560;
470
+ text-transform: uppercase;
471
+ }
472
+
473
+ .section-index.light {
474
+ color: var(--accent);
475
+ }
476
+
477
+ .auth-shell {
478
+ position: relative;
479
+ isolation: isolate;
480
+ display: grid;
481
+ width: 100%;
482
+ min-height: 100svh;
483
+ overflow: hidden;
484
+ place-items: center;
485
+ background: transparent;
486
+ padding: clamp(6rem, 10vw, 8rem) clamp(1.25rem, 7vw, 6rem);
487
+ }
488
+
489
+ .auth-shell::after {
490
+ position: absolute;
491
+ z-index: -1;
492
+ top: 50%;
493
+ right: 0;
494
+ left: 0;
495
+ border-top: 1px solid rgb(255 255 255 / 0.055);
496
+ content: "";
497
+ pointer-events: none;
498
+ }
499
+
500
+ .auth-home-link,
501
+ .auth-resource-links {
502
+ position: absolute;
503
+ left: clamp(1.25rem, 7vw, 6rem);
504
+ font-family: var(--font-mono);
505
+ font-size: 0.66rem;
506
+ text-transform: uppercase;
507
+ }
508
+
509
+ .auth-home-link {
510
+ top: clamp(1.5rem, 5vw, 3rem);
511
+ display: flex;
512
+ align-items: center;
513
+ gap: 0.7rem;
514
+ color: var(--ink-faint);
515
+ }
516
+
517
+ .auth-home-link span:first-child {
518
+ color: var(--ink);
519
+ }
520
+
521
+ .auth-resource-links {
522
+ bottom: clamp(1.5rem, 5vw, 3rem);
523
+ display: flex;
524
+ gap: 0.65rem;
525
+ color: var(--ink-soft);
526
+ }
527
+
528
+ .auth-home-link,
529
+ .auth-resource-links a {
530
+ border-bottom: 1px solid transparent;
531
+ padding-block: 0.2rem;
532
+ transition:
533
+ border-color 150ms ease,
534
+ color 150ms ease;
535
+ }
536
+
537
+ .auth-resource-links a {
538
+ display: inline-flex;
539
+ align-items: center;
540
+ gap: 0.45rem;
541
+ }
542
+
543
+ .auth-home-link:hover,
544
+ .auth-resource-links a:hover {
545
+ border-color: currentColor;
546
+ color: var(--ink);
547
+ }
548
+
549
+ .auth-form-side {
550
+ display: grid;
551
+ width: 100%;
552
+ place-items: center;
553
+ background: transparent;
554
+ padding: 0;
555
+ }
556
+
557
+ .auth-form-panel {
558
+ width: min(100%, 390px);
559
+ background: rgb(0 0 0 / 0.14);
560
+ padding: 1.5rem 0;
561
+ }
562
+
563
+ .auth-form-heading h1 {
564
+ margin: 0.8rem 0 0;
565
+ font-size: clamp(2rem, 4vw, 2.75rem);
566
+ font-weight: 520;
567
+ letter-spacing: -0.05em;
568
+ line-height: 1.04;
569
+ }
570
+
571
+ .auth-form {
572
+ display: grid;
573
+ gap: 0.95rem;
574
+ margin-top: 1.75rem;
575
+ }
576
+
577
+ .field {
578
+ display: grid;
579
+ gap: 0.45rem;
580
+ }
581
+
582
+ .field > span {
583
+ display: flex;
584
+ align-items: center;
585
+ gap: 0.55rem;
586
+ color: var(--ink-soft);
587
+ font-family: var(--font-mono);
588
+ font-size: 0.66rem;
589
+ font-weight: 500;
590
+ text-transform: uppercase;
591
+ }
592
+
593
+ .field > span small {
594
+ color: var(--ink-faint);
595
+ font: inherit;
596
+ }
597
+
598
+ .field input {
599
+ width: 100%;
600
+ min-height: 48px;
601
+ border: 1px solid var(--line-strong);
602
+ border-radius: 2px;
603
+ background: rgb(255 255 255 / 0.025);
604
+ padding: 0.75rem 0.85rem;
605
+ color: var(--ink);
606
+ transition:
607
+ border-color 150ms ease,
608
+ box-shadow 150ms ease;
609
+ }
610
+
611
+ .field input::placeholder {
612
+ color: var(--ink-faint);
613
+ }
614
+
615
+ .field input:hover {
616
+ border-color: var(--ink-soft);
617
+ }
618
+
619
+ .field input:focus {
620
+ border-color: var(--focus);
621
+ outline: none;
622
+ box-shadow: 0 0 0 2px rgb(255 255 255 / 0.08);
623
+ }
624
+
625
+ .auth-submit {
626
+ width: 100%;
627
+ justify-content: space-between;
628
+ margin-top: 0.25rem;
629
+ }
630
+
631
+ .form-error {
632
+ display: grid;
633
+ gap: 0.2rem;
634
+ border: 1px solid rgb(255 143 135 / 0.3);
635
+ border-radius: 2px;
636
+ background: rgb(255 143 135 / 0.06);
637
+ padding: 0.8rem 0.9rem;
638
+ color: var(--danger);
639
+ font-size: 0.78rem;
640
+ }
641
+
642
+ .auth-switch {
643
+ margin: 1.4rem 0 0;
644
+ color: var(--ink-soft);
645
+ font-family: var(--font-mono);
646
+ font-size: 0.68rem;
647
+ text-transform: uppercase;
648
+ }
649
+
650
+ .auth-switch a {
651
+ color: var(--ink);
652
+ border-bottom: 1px solid var(--line-strong);
653
+ font-weight: 500;
654
+ }
655
+
656
+ .dashboard-shell {
657
+ width: min(calc(100% - 48px), 1120px);
658
+ margin: 0 auto;
659
+ padding: 5rem 0 7rem;
660
+ }
661
+
662
+ .dashboard-heading {
663
+ display: flex;
664
+ align-items: flex-end;
665
+ justify-content: space-between;
666
+ gap: 2rem;
667
+ margin-bottom: 2.5rem;
668
+ }
669
+
670
+ .dashboard-heading h1 {
671
+ margin: 0.75rem 0 0.5rem;
672
+ font-size: clamp(2.5rem, 5vw, 4.6rem);
673
+ font-weight: 520;
674
+ letter-spacing: -0.06em;
675
+ line-height: 0.98;
676
+ }
677
+
678
+ .dashboard-heading p {
679
+ max-width: 650px;
680
+ margin: 0;
681
+ color: var(--ink-soft);
682
+ line-height: 1.6;
683
+ }
684
+
685
+ .sign-out-control {
686
+ display: grid;
687
+ justify-items: end;
688
+ gap: 0.6rem;
689
+ }
690
+
691
+ .inline-error {
692
+ max-width: 260px;
693
+ color: var(--danger);
694
+ font-size: 0.76rem;
695
+ text-align: right;
696
+ }
697
+
698
+ .dashboard-grid {
699
+ display: grid;
700
+ grid-template-columns: repeat(2, minmax(0, 1fr));
701
+ gap: 1rem;
702
+ }
703
+
704
+ .account-panel,
705
+ .session-panel,
706
+ .next-steps {
707
+ min-width: 0;
708
+ border: 1px solid var(--line);
709
+ border-radius: 2px;
710
+ background: var(--paper);
711
+ }
712
+
713
+ .account-panel,
714
+ .session-panel {
715
+ padding: 1.35rem;
716
+ }
717
+
718
+ .panel-heading {
719
+ display: flex;
720
+ min-height: 36px;
721
+ align-items: center;
722
+ justify-content: space-between;
723
+ gap: 1rem;
724
+ border-bottom: 1px solid var(--line);
725
+ padding-bottom: 0.9rem;
726
+ font-family: var(--font-mono);
727
+ font-size: 0.68rem;
728
+ font-weight: 550;
729
+ letter-spacing: 0.025em;
730
+ text-transform: uppercase;
731
+ }
732
+
733
+ .panel-heading code {
734
+ color: var(--ink-faint);
735
+ font-size: 0.64rem;
736
+ font-weight: 400;
737
+ text-transform: none;
738
+ }
739
+
740
+ .status-badge {
741
+ display: inline-flex;
742
+ align-items: center;
743
+ gap: 0.45rem;
744
+ border-radius: 999px;
745
+ background: var(--accent-soft);
746
+ padding: 0.3rem 0.5rem;
747
+ color: var(--accent);
748
+ font-size: 0.62rem;
749
+ }
750
+
751
+ .status-badge .status-dot {
752
+ width: 6px;
753
+ height: 6px;
754
+ box-shadow: none;
755
+ }
756
+
757
+ .detail-list {
758
+ margin: 0;
759
+ }
760
+
761
+ .detail-list > div {
762
+ display: grid;
763
+ grid-template-columns: minmax(100px, 0.4fr) minmax(0, 1fr);
764
+ gap: 1rem;
765
+ border-bottom: 1px solid var(--line);
766
+ padding: 1rem 0;
767
+ }
768
+
769
+ .detail-list > div:last-child {
770
+ border-bottom: 0;
771
+ padding-bottom: 0;
772
+ }
773
+
774
+ .detail-list dt {
775
+ color: var(--ink-soft);
776
+ font-size: 0.76rem;
777
+ }
778
+
779
+ .detail-list dd {
780
+ min-width: 0;
781
+ margin: 0;
782
+ font-size: 0.82rem;
783
+ font-weight: 550;
784
+ text-align: right;
785
+ }
786
+
787
+ .truncate {
788
+ overflow: hidden;
789
+ text-overflow: ellipsis;
790
+ white-space: nowrap;
791
+ }
792
+
793
+ .next-steps {
794
+ margin-top: 1rem;
795
+ padding: 2rem;
796
+ background: var(--paper-soft);
797
+ }
798
+
799
+ .section-heading {
800
+ display: grid;
801
+ max-width: 720px;
802
+ gap: 0.75rem;
803
+ margin-bottom: 1.5rem;
804
+ }
805
+
806
+ .section-heading h2 {
807
+ margin: 0;
808
+ font-size: clamp(1.8rem, 3vw, 2.8rem);
809
+ font-weight: 520;
810
+ letter-spacing: -0.045em;
811
+ line-height: 1.05;
812
+ }
813
+
814
+ .next-step-list {
815
+ display: grid;
816
+ grid-template-columns: repeat(3, minmax(0, 1fr));
817
+ border-top: 1px solid var(--line);
818
+ }
819
+
820
+ .next-step-list > div {
821
+ min-height: 125px;
822
+ padding: 1rem 1rem 0;
823
+ }
824
+
825
+ .next-step-list > div + div {
826
+ border-left: 1px solid var(--line);
827
+ }
828
+
829
+ .next-step-list > div > span {
830
+ color: var(--ink-faint);
831
+ font-family: var(--font-mono);
832
+ font-size: 0.66rem;
833
+ }
834
+
835
+ .next-step-list p {
836
+ margin: 2rem 0 0;
837
+ color: var(--ink-soft);
838
+ font-size: 0.84rem;
839
+ line-height: 1.5;
840
+ }
841
+
842
+ .loading-shell,
843
+ .error-shell {
844
+ display: grid;
845
+ min-height: 100vh;
846
+ place-items: center;
847
+ padding: 1.5rem;
848
+ background: var(--paper-soft);
849
+ }
850
+
851
+ .loading-block,
852
+ .error-panel {
853
+ width: min(100%, 620px);
854
+ border: 1px solid var(--line);
855
+ border-radius: 2px;
856
+ background: var(--paper);
857
+ padding: clamp(1.5rem, 4vw, 2.75rem);
858
+ }
859
+
860
+ .loading-label {
861
+ color: var(--accent);
862
+ font-family: var(--font-mono);
863
+ font-size: 0.68rem;
864
+ font-weight: 550;
865
+ letter-spacing: 0.025em;
866
+ text-transform: uppercase;
867
+ }
868
+
869
+ .loading-message {
870
+ margin: 1.1rem 0 0;
871
+ color: var(--ink-soft);
872
+ line-height: 1.6;
873
+ }
874
+
875
+ .loading-line,
876
+ .loading-grid > div {
877
+ background: linear-gradient(90deg, #0d0d0d, #202020, #0d0d0d);
878
+ background-size: 220% 100%;
879
+ animation: loading-sweep 1.4s ease-in-out infinite;
880
+ }
881
+
882
+ .loading-line {
883
+ width: 64%;
884
+ height: 16px;
885
+ margin-top: 0.9rem;
886
+ border-radius: 2px;
887
+ }
888
+
889
+ .loading-line.wide {
890
+ width: 88%;
891
+ height: 38px;
892
+ margin-top: 1.8rem;
893
+ }
894
+
895
+ .loading-grid {
896
+ display: grid;
897
+ grid-template-columns: 1fr 1fr;
898
+ gap: 0.8rem;
899
+ margin-top: 1.5rem;
900
+ }
901
+
902
+ .loading-grid > div {
903
+ height: 130px;
904
+ border-radius: 2px;
905
+ }
906
+
907
+ .error-panel h1 {
908
+ margin: 0.8rem 0 0.9rem;
909
+ font-size: clamp(2.3rem, 6vw, 4.2rem);
910
+ font-weight: 520;
911
+ letter-spacing: -0.055em;
912
+ line-height: 0.98;
913
+ }
914
+
915
+ .error-panel p {
916
+ color: var(--ink-soft);
917
+ line-height: 1.6;
918
+ }
919
+
920
+ .error-panel code {
921
+ color: var(--danger);
922
+ }
923
+
924
+ @keyframes loading-sweep {
925
+ from {
926
+ background-position: 100% 0;
927
+ }
928
+
929
+ to {
930
+ background-position: -100% 0;
931
+ }
932
+ }
933
+
934
+ @media (max-width: 880px) {
935
+ .auth-shell {
936
+ padding: 6rem 1.5rem 5rem;
937
+ }
938
+
939
+ .auth-form-side {
940
+ min-height: 0;
941
+ padding: 0;
942
+ }
943
+ }
944
+
945
+ @media (max-width: 720px) {
946
+ .dashboard-shell {
947
+ width: min(calc(100% - 32px), 1120px);
948
+ }
949
+
950
+ .site-frame {
951
+ border-inline: 0;
952
+ }
953
+
954
+ .account-copy {
955
+ display: none;
956
+ }
957
+
958
+ .dashboard-grid,
959
+ .next-step-list {
960
+ grid-template-columns: 1fr;
961
+ }
962
+
963
+ .next-step-list > div + div {
964
+ border-top: 1px solid var(--line);
965
+ border-left: 0;
966
+ }
967
+
968
+ .version-row span + span::before {
969
+ display: none;
970
+ }
971
+
972
+ .dashboard-heading {
973
+ align-items: flex-start;
974
+ flex-direction: column;
975
+ }
976
+
977
+ .sign-out-control {
978
+ justify-items: start;
979
+ }
980
+
981
+ .next-step-list > div {
982
+ min-height: 100px;
983
+ padding: 1rem 0;
984
+ }
985
+
986
+ .next-step-list p {
987
+ margin-top: 1rem;
988
+ }
989
+ }
990
+
991
+ @media (max-width: 520px) {
992
+ .site-header {
993
+ min-height: 64px;
994
+ padding-left: 1rem;
995
+ }
996
+
997
+ .brand small,
998
+ .header-nav > a:first-child {
999
+ display: none;
1000
+ }
1001
+
1002
+ .header-nav > a {
1003
+ padding-inline: 0.85rem;
1004
+ }
1005
+
1006
+ .hero-section {
1007
+ padding: 2rem 1.25rem;
1008
+ }
1009
+
1010
+ .hero-copy h1 {
1011
+ font-size: clamp(1.85rem, 9vw, 2.5rem);
1012
+ overflow-wrap: anywhere;
1013
+ }
1014
+
1015
+ .command-row {
1016
+ grid-template-columns: auto minmax(0, 1fr);
1017
+ }
1018
+
1019
+ .hero-actions,
1020
+ .hero-actions .button {
1021
+ width: 100%;
1022
+ }
1023
+
1024
+ .version-row {
1025
+ align-items: flex-start;
1026
+ flex-direction: column;
1027
+ }
1028
+
1029
+ .version-row span + span::before {
1030
+ display: none;
1031
+ }
1032
+
1033
+ .auth-form-panel {
1034
+ padding-block: 0.75rem;
1035
+ }
1036
+
1037
+ .auth-form-heading h1 {
1038
+ font-size: 2.15rem;
1039
+ }
1040
+
1041
+ .detail-list > div {
1042
+ grid-template-columns: 1fr;
1043
+ gap: 0.35rem;
1044
+ }
1045
+
1046
+ .detail-list dd {
1047
+ text-align: left;
1048
+ }
1049
+
1050
+ .loading-grid {
1051
+ grid-template-columns: 1fr;
1052
+ }
1053
+ }
1054
+
1055
+ @media (prefers-reduced-motion: reduce) {
1056
+ *,
1057
+ *::before,
1058
+ *::after {
1059
+ scroll-behavior: auto !important;
1060
+ transition-duration: 0.01ms !important;
1061
+ animation-duration: 0.01ms !important;
1062
+ animation-iteration-count: 1 !important;
1063
+ }
1064
+ }