create-electro 1.0.5

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 (30) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +24 -0
  3. package/bin/create-electro.mjs +9 -0
  4. package/dist/index.d.mts +4 -0
  5. package/dist/index.mjs +10 -0
  6. package/package.json +54 -0
  7. package/template/monorepo/README.md +19 -0
  8. package/template/monorepo/electro.config.ts +6 -0
  9. package/template/monorepo/package.json +26 -0
  10. package/template/monorepo/pnpm-workspace.yaml +3 -0
  11. package/template/monorepo/runtime/electro-env.d.ts +90 -0
  12. package/template/monorepo/runtime/package.json +15 -0
  13. package/template/monorepo/runtime/runtime.config.ts +5 -0
  14. package/template/monorepo/runtime/src/main.ts +25 -0
  15. package/template/monorepo/runtime/src/modules/app.module.ts +35 -0
  16. package/template/monorepo/runtime/src/modules/app.shell.service.ts +54 -0
  17. package/template/monorepo/runtime/src/modules/app.view.ts +22 -0
  18. package/template/monorepo/runtime/src/modules/app.window.ts +54 -0
  19. package/template/monorepo/runtime/src/modules/notes/notes.module.ts +8 -0
  20. package/template/monorepo/runtime/src/modules/notes/notes.service.ts +55 -0
  21. package/template/monorepo/runtime/tsconfig.json +11 -0
  22. package/template/monorepo/views/main/electro-env.d.ts +51 -0
  23. package/template/monorepo/views/main/index.html +12 -0
  24. package/template/monorepo/views/main/package.json +17 -0
  25. package/template/monorepo/views/main/src/app.css +1254 -0
  26. package/template/monorepo/views/main/src/app.tsx +464 -0
  27. package/template/monorepo/views/main/src/icon.svg +11 -0
  28. package/template/monorepo/views/main/src/main.tsx +12 -0
  29. package/template/monorepo/views/main/tsconfig.json +9 -0
  30. package/template/monorepo/views/main/view.config.ts +8 -0
@@ -0,0 +1,1254 @@
1
+ @import url("https://fonts.googleapis.com/css2?family=Inter:opsz,wght@14..32,300..700&display=swap");
2
+ @import url("https://cdn.hugeicons.com/font/hgi-stroke-rounded.css");
3
+
4
+ /* ─── Tokens ──────────────────────────────────────────── */
5
+
6
+ :root {
7
+ --electro-amber: #fbbf24;
8
+ --electro-orange: #f97316;
9
+ --electro-red: #ef4444;
10
+ --electro-gradient: linear-gradient(135deg, #fbbf24 0%, #f97316 50%, #ef4444 100%);
11
+
12
+ --bg-base: #171512;
13
+ --bg-alt: #1c1a17;
14
+ --bg-soft: #211f1b;
15
+ --bg-elv: #272420;
16
+ --bg-shell: rgba(23, 21, 18, 0.82);
17
+ --bg-panel: rgba(31, 28, 25, 0.84);
18
+
19
+ --border: rgba(255, 248, 235, 0.06);
20
+ --border-strong: rgba(255, 248, 235, 0.12);
21
+
22
+ --text-1: #f2f0ed;
23
+ --text-2: #9e9b96;
24
+ --text-3: #5c5a56;
25
+
26
+ --shadow-lg: 0 24px 80px rgba(0, 0, 0, 0.42);
27
+ --shadow-card: 0 4px 24px rgba(0, 0, 0, 0.35);
28
+
29
+ --radius-xl: 22px;
30
+ --radius-lg: 16px;
31
+ --radius-md: 12px;
32
+ --radius-sm: 8px;
33
+
34
+ --sidebar-width: 240px;
35
+ --titlebar-height: 48px;
36
+
37
+ --ease: cubic-bezier(0.25, 0.1, 0.25, 1);
38
+ --duration: 160ms;
39
+ }
40
+
41
+ /* ─── Reset ───────────────────────────────────────────── */
42
+
43
+ *,
44
+ *::before,
45
+ *::after {
46
+ box-sizing: border-box;
47
+ }
48
+
49
+ html,
50
+ body,
51
+ #root {
52
+ width: 100%;
53
+ min-height: 100%;
54
+ }
55
+
56
+ body {
57
+ margin: 0;
58
+ font-family:
59
+ "Inter",
60
+ -apple-system,
61
+ BlinkMacSystemFont,
62
+ "Segoe UI",
63
+ sans-serif;
64
+ background: transparent;
65
+ color: var(--text-1);
66
+ -webkit-font-smoothing: antialiased;
67
+ overflow: hidden;
68
+ font-size: 14px;
69
+ line-height: 1.5;
70
+ }
71
+
72
+ #root {
73
+ background: var(--bg-base);
74
+ }
75
+
76
+ button,
77
+ input,
78
+ textarea {
79
+ font: inherit;
80
+ }
81
+
82
+ button {
83
+ color: inherit;
84
+ }
85
+
86
+ /* ─── Plasma orbs ─────────────────────────────────────── */
87
+
88
+ @keyframes orb-drift-1 {
89
+ 0%,
90
+ 100% {
91
+ transform: translate(0, 0) scale(1);
92
+ opacity: 0.28;
93
+ }
94
+ 33% {
95
+ transform: translate(28px, -44px) scale(1.07);
96
+ opacity: 0.36;
97
+ }
98
+ 66% {
99
+ transform: translate(-18px, -60px) scale(0.93);
100
+ opacity: 0.22;
101
+ }
102
+ }
103
+
104
+ @keyframes orb-drift-2 {
105
+ 0%,
106
+ 100% {
107
+ transform: translate(0, 0) scale(1);
108
+ opacity: 0.18;
109
+ }
110
+ 33% {
111
+ transform: translate(-32px, 22px) scale(0.91);
112
+ opacity: 0.25;
113
+ }
114
+ 66% {
115
+ transform: translate(44px, 48px) scale(1.07);
116
+ opacity: 0.15;
117
+ }
118
+ }
119
+
120
+ @keyframes orb-drift-3 {
121
+ 0%,
122
+ 100% {
123
+ transform: translate(0, 0) scale(1);
124
+ opacity: 0.12;
125
+ }
126
+ 50% {
127
+ transform: translate(22px, -28px) scale(1.08);
128
+ opacity: 0.18;
129
+ }
130
+ }
131
+
132
+ .plasma-orb {
133
+ position: fixed;
134
+ border-radius: 999px;
135
+ filter: blur(140px);
136
+ pointer-events: none;
137
+ z-index: 0;
138
+ }
139
+
140
+ .plasma-orb-1 {
141
+ top: -100px;
142
+ left: 10%;
143
+ width: 400px;
144
+ height: 400px;
145
+ background: radial-gradient(circle, rgba(251, 191, 36, 0.3) 0%, transparent 72%);
146
+ animation: orb-drift-1 20s ease-in-out infinite;
147
+ }
148
+
149
+ .plasma-orb-2 {
150
+ bottom: -120px;
151
+ right: 15%;
152
+ width: 380px;
153
+ height: 380px;
154
+ background: radial-gradient(circle, rgba(239, 68, 68, 0.22) 0%, transparent 72%);
155
+ animation: orb-drift-2 24s ease-in-out infinite;
156
+ }
157
+
158
+ .plasma-orb-3 {
159
+ top: 40%;
160
+ right: 30%;
161
+ width: 300px;
162
+ height: 300px;
163
+ background: radial-gradient(circle, rgba(249, 115, 22, 0.14) 0%, transparent 72%);
164
+ animation: orb-drift-3 28s ease-in-out infinite;
165
+ }
166
+
167
+ /* ─── Root layout ─────────────────────────────────────── */
168
+
169
+ .desktop-root {
170
+ position: relative;
171
+ min-height: 100vh;
172
+ padding: 0;
173
+ }
174
+
175
+ .window-shell {
176
+ position: relative;
177
+ z-index: 1;
178
+ display: grid;
179
+ grid-template-rows: var(--titlebar-height) minmax(0, 1fr);
180
+ height: 100vh;
181
+ border: 1px solid var(--border);
182
+ border-radius: 22px;
183
+ overflow: hidden;
184
+ background: rgba(18, 15, 13, 0.72);
185
+ box-shadow: var(--shadow-lg);
186
+ backdrop-filter: blur(18px) saturate(1.08);
187
+ -webkit-backdrop-filter: blur(18px) saturate(1.08);
188
+ }
189
+
190
+ /* ─── Titlebar ────────────────────────────────────────── */
191
+
192
+ .drag-region {
193
+ app-region: drag;
194
+ -webkit-app-region: drag;
195
+ }
196
+
197
+ .no-drag,
198
+ .no-drag * {
199
+ app-region: no-drag;
200
+ -webkit-app-region: no-drag;
201
+ }
202
+
203
+ .titlebar {
204
+ display: grid;
205
+ grid-template-columns: 1fr auto 1fr;
206
+ align-items: center;
207
+ gap: 16px;
208
+ padding: 0 14px;
209
+ border-bottom: 1px solid var(--border);
210
+ background: rgba(20, 17, 15, 0.86);
211
+ }
212
+
213
+ .titlebar-leading,
214
+ .titlebar-actions {
215
+ display: flex;
216
+ align-items: center;
217
+ gap: 12px;
218
+ }
219
+
220
+ .titlebar-actions {
221
+ justify-content: flex-end;
222
+ }
223
+
224
+ .titlebar-brand {
225
+ display: inline-flex;
226
+ align-items: center;
227
+ gap: 10px;
228
+ }
229
+
230
+ .titlebar-mark {
231
+ width: 10px;
232
+ height: 10px;
233
+ border-radius: 999px;
234
+ background: var(--electro-gradient);
235
+ box-shadow: 0 0 18px rgba(251, 191, 36, 0.34);
236
+ }
237
+
238
+ .titlebar-brand-text {
239
+ font-size: 13px;
240
+ font-weight: 650;
241
+ letter-spacing: -0.02em;
242
+ }
243
+
244
+ .titlebar-center {
245
+ display: inline-flex;
246
+ align-items: center;
247
+ justify-content: center;
248
+ gap: 10px;
249
+ }
250
+
251
+ .titlebar-project {
252
+ font-size: 13px;
253
+ font-weight: 500;
254
+ color: var(--text-2);
255
+ }
256
+
257
+ /* ─── Window controls ─────────────────────────────────── */
258
+
259
+ .window-controls {
260
+ display: inline-flex;
261
+ align-items: center;
262
+ gap: 6px;
263
+ }
264
+
265
+ .window-control {
266
+ position: relative;
267
+ display: inline-grid;
268
+ place-items: center;
269
+ width: 28px;
270
+ height: 28px;
271
+ padding: 0;
272
+ border: 0;
273
+ border-radius: 8px;
274
+ background: transparent;
275
+ cursor: pointer;
276
+ transition:
277
+ background var(--duration) var(--ease),
278
+ opacity var(--duration) var(--ease);
279
+ }
280
+
281
+ .window-control-button:hover {
282
+ background: rgba(255, 248, 235, 0.08);
283
+ }
284
+
285
+ .window-control-close:hover {
286
+ background: rgba(239, 68, 68, 0.14);
287
+ }
288
+
289
+ .window-controls-mac {
290
+ gap: 8px;
291
+ }
292
+
293
+ .window-controls-mac .window-control {
294
+ width: 12px;
295
+ height: 12px;
296
+ border-radius: 999px;
297
+ }
298
+
299
+ .mac-close {
300
+ background: #ff5f57;
301
+ }
302
+
303
+ .mac-minimize {
304
+ background: #febc2e;
305
+ }
306
+
307
+ .mac-maximize {
308
+ background: #28c840;
309
+ }
310
+
311
+ .mac-close:hover,
312
+ .mac-minimize:hover,
313
+ .mac-maximize:hover {
314
+ opacity: 0.86;
315
+ }
316
+
317
+ .control-line,
318
+ .control-square,
319
+ .control-restore,
320
+ .control-close {
321
+ display: block;
322
+ position: relative;
323
+ }
324
+
325
+ .control-line {
326
+ width: 10px;
327
+ height: 1.5px;
328
+ background: currentColor;
329
+ }
330
+
331
+ .control-square {
332
+ width: 10px;
333
+ height: 10px;
334
+ border: 1.5px solid currentColor;
335
+ }
336
+
337
+ .control-restore {
338
+ width: 12px;
339
+ height: 10px;
340
+ }
341
+
342
+ .control-restore::before,
343
+ .control-restore::after,
344
+ .control-close::before,
345
+ .control-close::after {
346
+ content: "";
347
+ position: absolute;
348
+ }
349
+
350
+ .control-restore::before {
351
+ top: 1px;
352
+ left: 1px;
353
+ width: 8px;
354
+ height: 7px;
355
+ border: 1.5px solid currentColor;
356
+ }
357
+
358
+ .control-restore::after {
359
+ top: 3px;
360
+ left: 3px;
361
+ width: 8px;
362
+ height: 7px;
363
+ border: 1.5px solid currentColor;
364
+ background: rgba(20, 17, 15, 0.86);
365
+ }
366
+
367
+ .control-close {
368
+ width: 10px;
369
+ height: 10px;
370
+ }
371
+
372
+ .control-close::before,
373
+ .control-close::after {
374
+ top: 4px;
375
+ left: 0;
376
+ width: 10px;
377
+ height: 1.5px;
378
+ background: currentColor;
379
+ }
380
+
381
+ .control-close::before {
382
+ transform: rotate(45deg);
383
+ }
384
+
385
+ .control-close::after {
386
+ transform: rotate(-45deg);
387
+ }
388
+
389
+ /* ─── App body ────────────────────────────────────────── */
390
+
391
+ .app-body {
392
+ display: grid;
393
+ grid-template-columns: var(--sidebar-width) minmax(0, 1fr);
394
+ min-height: 0;
395
+ }
396
+
397
+ /* ─── Sidebar ─────────────────────────────────────────── */
398
+
399
+ .sidebar {
400
+ display: flex;
401
+ flex-direction: column;
402
+ border-right: 1px solid var(--border);
403
+ background: rgba(20, 17, 15, 0.72);
404
+ padding: 20px 12px;
405
+ gap: 8px;
406
+ }
407
+
408
+ .sidebar-brand {
409
+ display: flex;
410
+ align-items: center;
411
+ gap: 0px;
412
+ padding: 0 12px 16px;
413
+ border-bottom: 1px solid var(--border);
414
+ margin-bottom: 8px;
415
+ }
416
+
417
+ .sidebar-logo {
418
+ width: 32px;
419
+ height: 32px;
420
+ flex-shrink: 0;
421
+ }
422
+
423
+ .sidebar-logo-text {
424
+ font-size: 15px;
425
+ font-weight: 700;
426
+ letter-spacing: -0.03em;
427
+ background: var(--electro-gradient);
428
+ -webkit-background-clip: text;
429
+ -webkit-text-fill-color: transparent;
430
+ background-clip: text;
431
+ }
432
+
433
+ .sidebar-nav {
434
+ display: flex;
435
+ flex-direction: column;
436
+ gap: 2px;
437
+ flex: 1;
438
+ }
439
+
440
+ .nav-item {
441
+ display: flex;
442
+ align-items: center;
443
+ gap: 10px;
444
+ width: 100%;
445
+ height: 38px;
446
+ padding: 0 12px;
447
+ border: 1px solid transparent;
448
+ border-radius: var(--radius-sm);
449
+ background: transparent;
450
+ color: var(--text-2);
451
+ font-size: 13px;
452
+ font-weight: 500;
453
+ cursor: pointer;
454
+ text-align: left;
455
+ transition:
456
+ border-color var(--duration) var(--ease),
457
+ background var(--duration) var(--ease),
458
+ color var(--duration) var(--ease);
459
+ }
460
+
461
+ .nav-item:hover {
462
+ background: rgba(255, 248, 235, 0.04);
463
+ color: var(--text-1);
464
+ }
465
+
466
+ .nav-item.is-active {
467
+ border-color: rgba(251, 191, 36, 0.16);
468
+ background: rgba(251, 191, 36, 0.08);
469
+ color: var(--electro-amber);
470
+ }
471
+
472
+ .nav-icon {
473
+ width: 18px;
474
+ height: 18px;
475
+ flex-shrink: 0;
476
+ }
477
+
478
+ .nav-badge {
479
+ margin-left: auto;
480
+ display: inline-flex;
481
+ align-items: center;
482
+ justify-content: center;
483
+ min-width: 20px;
484
+ height: 20px;
485
+ padding: 0 6px;
486
+ border-radius: 999px;
487
+ background: rgba(251, 191, 36, 0.12);
488
+ color: var(--electro-amber);
489
+ font-size: 11px;
490
+ font-weight: 600;
491
+ }
492
+
493
+ /* ─── Sidebar footer ──────────────────────────────────── */
494
+
495
+ .sidebar-footer {
496
+ display: flex;
497
+ flex-direction: column;
498
+ gap: 12px;
499
+ padding-top: 12px;
500
+ border-top: 1px solid var(--border);
501
+ margin-top: auto;
502
+ }
503
+
504
+ .docs-button {
505
+ display: flex;
506
+ align-items: center;
507
+ gap: 10px;
508
+ width: 100%;
509
+ height: 40px;
510
+ padding: 0 12px;
511
+ border: 1px solid var(--border);
512
+ border-radius: var(--radius-sm);
513
+ background: rgba(255, 248, 235, 0.02);
514
+ color: var(--text-2);
515
+ font-size: 13px;
516
+ font-weight: 500;
517
+ cursor: pointer;
518
+ transition:
519
+ border-color var(--duration) var(--ease),
520
+ background var(--duration) var(--ease),
521
+ color var(--duration) var(--ease);
522
+ }
523
+
524
+ .docs-button:hover {
525
+ border-color: rgba(251, 191, 36, 0.2);
526
+ background: rgba(251, 191, 36, 0.06);
527
+ color: var(--electro-amber);
528
+ }
529
+
530
+ .docs-icon {
531
+ width: 16px;
532
+ height: 16px;
533
+ flex-shrink: 0;
534
+ }
535
+
536
+ .docs-arrow {
537
+ width: 14px;
538
+ height: 14px;
539
+ margin-left: auto;
540
+ opacity: 0.4;
541
+ flex-shrink: 0;
542
+ }
543
+
544
+ .sidebar-meta {
545
+ display: flex;
546
+ align-items: center;
547
+ gap: 8px;
548
+ padding: 0 12px;
549
+ }
550
+
551
+ .meta-dot {
552
+ width: 6px;
553
+ height: 6px;
554
+ border-radius: 999px;
555
+ background: #28c840;
556
+ box-shadow: 0 0 8px rgba(40, 200, 64, 0.4);
557
+ flex-shrink: 0;
558
+ }
559
+
560
+ .meta-text {
561
+ color: var(--text-3);
562
+ font-size: 12px;
563
+ }
564
+
565
+ /* ─── Content area ────────────────────────────────────── */
566
+
567
+ .content {
568
+ overflow-y: auto;
569
+ overflow-x: hidden;
570
+ padding: 32px 40px;
571
+ background: rgba(17, 15, 13, 0.4);
572
+ }
573
+
574
+ /* ─── Scrollbar ───────────────────────────────────────── */
575
+
576
+ .content::-webkit-scrollbar,
577
+ .feed-body::-webkit-scrollbar,
578
+ .note-list::-webkit-scrollbar {
579
+ width: 5px;
580
+ }
581
+
582
+ .content::-webkit-scrollbar-track,
583
+ .feed-body::-webkit-scrollbar-track,
584
+ .note-list::-webkit-scrollbar-track {
585
+ background: transparent;
586
+ }
587
+
588
+ .content::-webkit-scrollbar-thumb,
589
+ .feed-body::-webkit-scrollbar-thumb,
590
+ .note-list::-webkit-scrollbar-thumb {
591
+ background: rgba(255, 248, 235, 0.1);
592
+ border-radius: 3px;
593
+ }
594
+
595
+ .content::-webkit-scrollbar-thumb:hover,
596
+ .feed-body::-webkit-scrollbar-thumb:hover,
597
+ .note-list::-webkit-scrollbar-thumb:hover {
598
+ background: rgba(251, 191, 36, 0.3);
599
+ }
600
+
601
+ /* ─── Dashboard ───────────────────────────────────────── */
602
+
603
+ .dashboard {
604
+ display: flex;
605
+ flex-direction: column;
606
+ gap: 48px;
607
+ max-width: 900px;
608
+ }
609
+
610
+ /* ─── Hero ────────────────────────────────────────────── */
611
+
612
+ .hero {
613
+ display: flex;
614
+ flex-direction: column;
615
+ gap: 16px;
616
+ padding-bottom: 8px;
617
+ }
618
+
619
+ .hero-eyebrow {
620
+ margin: 0;
621
+ color: var(--electro-amber);
622
+ font-size: 12px;
623
+ font-weight: 700;
624
+ letter-spacing: 0.12em;
625
+ text-transform: uppercase;
626
+ }
627
+
628
+ .hero-title {
629
+ margin: 0;
630
+ font-size: 48px;
631
+ font-weight: 700;
632
+ letter-spacing: -0.04em;
633
+ line-height: 1.05;
634
+ color: var(--text-1);
635
+ }
636
+
637
+ .gradient-text {
638
+ background: var(--electro-gradient);
639
+ -webkit-background-clip: text;
640
+ -webkit-text-fill-color: transparent;
641
+ background-clip: text;
642
+ }
643
+
644
+ .hero-tagline {
645
+ margin: 0;
646
+ font-size: 16px;
647
+ color: var(--text-2);
648
+ line-height: 1.6;
649
+ max-width: 520px;
650
+ }
651
+
652
+ .hero-actions {
653
+ display: flex;
654
+ gap: 10px;
655
+ margin-top: 8px;
656
+ }
657
+
658
+ .action-primary {
659
+ display: inline-flex;
660
+ align-items: center;
661
+ gap: 8px;
662
+ height: 40px;
663
+ padding: 0 20px;
664
+ border: 0;
665
+ border-radius: var(--radius-sm);
666
+ background: var(--electro-amber);
667
+ color: #0d0c0b;
668
+ font-size: 14px;
669
+ font-weight: 600;
670
+ cursor: pointer;
671
+ transition:
672
+ background var(--duration) var(--ease),
673
+ transform var(--duration) var(--ease);
674
+ }
675
+
676
+ .action-primary:hover {
677
+ background: #fcd34d;
678
+ transform: translateY(-1px);
679
+ }
680
+
681
+ .action-icon {
682
+ width: 16px;
683
+ height: 16px;
684
+ }
685
+
686
+ .action-secondary {
687
+ display: inline-flex;
688
+ align-items: center;
689
+ height: 40px;
690
+ padding: 0 20px;
691
+ border: 1px solid var(--border-strong);
692
+ border-radius: var(--radius-sm);
693
+ background: rgba(255, 248, 235, 0.04);
694
+ color: var(--text-1);
695
+ font-size: 14px;
696
+ font-weight: 500;
697
+ cursor: pointer;
698
+ transition:
699
+ border-color var(--duration) var(--ease),
700
+ background var(--duration) var(--ease);
701
+ }
702
+
703
+ .action-secondary:hover {
704
+ border-color: rgba(255, 248, 235, 0.2);
705
+ background: rgba(255, 248, 235, 0.07);
706
+ }
707
+
708
+ /* ─── Section label ───────────────────────────────────── */
709
+
710
+ .section-label {
711
+ margin: 0 0 16px;
712
+ color: var(--text-3);
713
+ font-size: 11px;
714
+ font-weight: 700;
715
+ letter-spacing: 0.1em;
716
+ text-transform: uppercase;
717
+ }
718
+
719
+ /* ─── Feature cards ───────────────────────────────────── */
720
+
721
+ .feature-grid {
722
+ display: grid;
723
+ grid-template-columns: repeat(3, 1fr);
724
+ gap: 12px;
725
+ }
726
+
727
+ .feature-card {
728
+ padding: 20px;
729
+ border: 1px solid var(--border);
730
+ border-radius: var(--radius-md);
731
+ background: var(--bg-soft);
732
+ transition:
733
+ border-color 0.25s ease,
734
+ background 0.25s ease,
735
+ box-shadow 0.25s ease;
736
+ }
737
+
738
+ .feature-card:hover {
739
+ border-color: rgba(251, 191, 36, 0.22);
740
+ background: var(--bg-elv);
741
+ box-shadow:
742
+ var(--shadow-card),
743
+ 0 0 0 1px rgba(251, 191, 36, 0.04);
744
+ }
745
+
746
+ .feature-icon {
747
+ font-size: 24px;
748
+ color: var(--electro-amber);
749
+ display: block;
750
+ line-height: 1;
751
+ margin-bottom: 14px;
752
+ transition: color 0.25s ease;
753
+ }
754
+
755
+ .feature-card:hover .feature-icon {
756
+ color: #fcd34d;
757
+ }
758
+
759
+ .feature-title {
760
+ margin: 0 0 8px;
761
+ font-size: 14px;
762
+ font-weight: 600;
763
+ color: var(--text-1);
764
+ }
765
+
766
+ .feature-detail {
767
+ margin: 0;
768
+ font-size: 13px;
769
+ color: var(--text-2);
770
+ line-height: 1.55;
771
+ }
772
+
773
+ /* ─── Architecture cards ──────────────────────────────── */
774
+
775
+ .arch-grid {
776
+ display: grid;
777
+ grid-template-columns: repeat(2, 1fr);
778
+ gap: 10px;
779
+ }
780
+
781
+ .arch-card {
782
+ padding: 16px 18px;
783
+ border: 1px solid var(--border);
784
+ border-radius: var(--radius-md);
785
+ background: var(--bg-soft);
786
+ transition:
787
+ border-color 0.25s ease,
788
+ background 0.25s ease;
789
+ }
790
+
791
+ .arch-card:hover {
792
+ border-color: rgba(255, 248, 235, 0.12);
793
+ background: var(--bg-elv);
794
+ }
795
+
796
+ .arch-code {
797
+ display: inline-block;
798
+ font-family: "SF Mono", ui-monospace, monospace;
799
+ font-size: 13px;
800
+ color: var(--electro-amber);
801
+ margin-bottom: 8px;
802
+ }
803
+
804
+ .arch-text {
805
+ margin: 0;
806
+ font-size: 13px;
807
+ color: var(--text-2);
808
+ line-height: 1.5;
809
+ }
810
+
811
+ /* ─── Notes view ──────────────────────────────────────── */
812
+
813
+ .notes-view {
814
+ display: flex;
815
+ flex-direction: column;
816
+ gap: 24px;
817
+ max-width: 900px;
818
+ }
819
+
820
+ .notes-header {
821
+ display: flex;
822
+ flex-direction: column;
823
+ gap: 8px;
824
+ }
825
+
826
+ .view-title {
827
+ margin: 0;
828
+ font-size: 32px;
829
+ font-weight: 700;
830
+ letter-spacing: -0.03em;
831
+ line-height: 1.1;
832
+ }
833
+
834
+ .view-description {
835
+ margin: 0;
836
+ font-size: 14px;
837
+ color: var(--text-2);
838
+ line-height: 1.6;
839
+ max-width: 540px;
840
+ }
841
+
842
+ .notes-layout {
843
+ display: grid;
844
+ grid-template-columns: 320px minmax(0, 1fr);
845
+ grid-template-rows: auto auto;
846
+ gap: 16px;
847
+ }
848
+
849
+ /* ─── Composer ────────────────────────────────────────── */
850
+
851
+ .composer {
852
+ grid-row: 1 / 3;
853
+ display: flex;
854
+ flex-direction: column;
855
+ gap: 14px;
856
+ padding: 18px;
857
+ border: 1px solid var(--border);
858
+ border-radius: var(--radius-lg);
859
+ background: var(--bg-panel);
860
+ align-self: start;
861
+ }
862
+
863
+ .field {
864
+ display: flex;
865
+ flex-direction: column;
866
+ gap: 6px;
867
+ }
868
+
869
+ .field-label {
870
+ color: var(--text-2);
871
+ font-size: 12px;
872
+ font-weight: 600;
873
+ letter-spacing: 0.02em;
874
+ }
875
+
876
+ .field-input {
877
+ width: 100%;
878
+ padding: 10px 12px;
879
+ border: 1px solid var(--border);
880
+ border-radius: var(--radius-sm);
881
+ background: rgba(16, 14, 12, 0.72);
882
+ color: var(--text-1);
883
+ font-size: 13px;
884
+ outline: none;
885
+ transition:
886
+ border-color var(--duration) var(--ease),
887
+ box-shadow var(--duration) var(--ease);
888
+ }
889
+
890
+ .field-input::placeholder {
891
+ color: var(--text-3);
892
+ }
893
+
894
+ .field-input:focus {
895
+ border-color: rgba(251, 191, 36, 0.24);
896
+ box-shadow: 0 0 0 3px rgba(251, 191, 36, 0.08);
897
+ }
898
+
899
+ .field-textarea {
900
+ min-height: 100px;
901
+ resize: vertical;
902
+ }
903
+
904
+ .create-button {
905
+ display: flex;
906
+ align-items: center;
907
+ justify-content: space-between;
908
+ width: 100%;
909
+ height: 40px;
910
+ padding: 0 14px;
911
+ border: 0;
912
+ border-radius: var(--radius-sm);
913
+ background: var(--electro-gradient);
914
+ color: #0d0c0b;
915
+ font-size: 13px;
916
+ font-weight: 600;
917
+ cursor: pointer;
918
+ transition:
919
+ transform var(--duration) var(--ease),
920
+ filter var(--duration) var(--ease),
921
+ opacity var(--duration) var(--ease);
922
+ }
923
+
924
+ .create-button:hover {
925
+ transform: translateY(-1px);
926
+ filter: brightness(1.04);
927
+ }
928
+
929
+ .create-button:disabled {
930
+ opacity: 0.4;
931
+ cursor: not-allowed;
932
+ transform: none;
933
+ }
934
+
935
+ .button-shortcut {
936
+ color: rgba(13, 12, 11, 0.5);
937
+ font-size: 11px;
938
+ font-weight: 500;
939
+ }
940
+
941
+ /* ─── Notes feed ──────────────────────────────────────── */
942
+
943
+ .notes-feed {
944
+ display: flex;
945
+ flex-direction: column;
946
+ border: 1px solid var(--border);
947
+ border-radius: var(--radius-lg);
948
+ background: var(--bg-soft);
949
+ overflow: hidden;
950
+ min-height: 0;
951
+ }
952
+
953
+ .feed-header {
954
+ display: flex;
955
+ align-items: center;
956
+ justify-content: space-between;
957
+ padding: 12px 16px;
958
+ border-bottom: 1px solid var(--border);
959
+ }
960
+
961
+ .feed-title {
962
+ font-size: 13px;
963
+ font-weight: 600;
964
+ color: var(--text-1);
965
+ }
966
+
967
+ .feed-count {
968
+ display: inline-flex;
969
+ align-items: center;
970
+ justify-content: center;
971
+ min-width: 22px;
972
+ height: 22px;
973
+ padding: 0 7px;
974
+ border-radius: 999px;
975
+ background: rgba(251, 191, 36, 0.1);
976
+ color: var(--electro-amber);
977
+ font-size: 11px;
978
+ font-weight: 600;
979
+ }
980
+
981
+ .feed-body {
982
+ flex: 1;
983
+ min-height: 0;
984
+ overflow-y: auto;
985
+ }
986
+
987
+ .note-list {
988
+ display: flex;
989
+ flex-direction: column;
990
+ gap: 8px;
991
+ padding: 12px;
992
+ }
993
+
994
+ .note-card {
995
+ display: flex;
996
+ align-items: flex-start;
997
+ gap: 12px;
998
+ padding: 14px;
999
+ border: 1px solid var(--border);
1000
+ border-radius: var(--radius-md);
1001
+ background: rgba(255, 248, 235, 0.02);
1002
+ transition:
1003
+ border-color var(--duration) var(--ease),
1004
+ background var(--duration) var(--ease);
1005
+ }
1006
+
1007
+ .note-card:hover {
1008
+ border-color: rgba(255, 248, 235, 0.1);
1009
+ background: rgba(255, 248, 235, 0.035);
1010
+ }
1011
+
1012
+ .note-body {
1013
+ flex: 1;
1014
+ min-width: 0;
1015
+ display: flex;
1016
+ flex-direction: column;
1017
+ gap: 4px;
1018
+ }
1019
+
1020
+ .note-title {
1021
+ margin: 0;
1022
+ font-size: 14px;
1023
+ font-weight: 600;
1024
+ letter-spacing: -0.01em;
1025
+ }
1026
+
1027
+ .note-content {
1028
+ margin: 0;
1029
+ font-size: 13px;
1030
+ color: var(--text-2);
1031
+ line-height: 1.5;
1032
+ }
1033
+
1034
+ .note-time {
1035
+ font-size: 11px;
1036
+ color: var(--text-3);
1037
+ font-family: "SF Mono", ui-monospace, monospace;
1038
+ margin-top: 2px;
1039
+ }
1040
+
1041
+ .note-delete {
1042
+ flex-shrink: 0;
1043
+ display: inline-grid;
1044
+ place-items: center;
1045
+ width: 32px;
1046
+ height: 32px;
1047
+ padding: 0;
1048
+ border: 1px solid transparent;
1049
+ border-radius: var(--radius-sm);
1050
+ background: transparent;
1051
+ color: var(--text-3);
1052
+ cursor: pointer;
1053
+ transition:
1054
+ border-color var(--duration) var(--ease),
1055
+ background var(--duration) var(--ease),
1056
+ color var(--duration) var(--ease);
1057
+ }
1058
+
1059
+ .note-delete svg {
1060
+ width: 16px;
1061
+ height: 16px;
1062
+ }
1063
+
1064
+ .note-delete:hover {
1065
+ border-color: rgba(239, 68, 68, 0.16);
1066
+ background: rgba(239, 68, 68, 0.08);
1067
+ color: #f87171;
1068
+ }
1069
+
1070
+ /* ─── Empty state ─────────────────────────────────────── */
1071
+
1072
+ .empty-state {
1073
+ display: flex;
1074
+ flex-direction: column;
1075
+ align-items: center;
1076
+ justify-content: center;
1077
+ padding: 40px 24px;
1078
+ text-align: center;
1079
+ gap: 8px;
1080
+ }
1081
+
1082
+ .empty-icon-wrap {
1083
+ display: grid;
1084
+ place-items: center;
1085
+ width: 48px;
1086
+ height: 48px;
1087
+ border-radius: var(--radius-md);
1088
+ background: rgba(255, 248, 235, 0.04);
1089
+ margin-bottom: 8px;
1090
+ }
1091
+
1092
+ .empty-icon {
1093
+ width: 24px;
1094
+ height: 24px;
1095
+ color: var(--text-3);
1096
+ }
1097
+
1098
+ .empty-title {
1099
+ margin: 0;
1100
+ font-size: 15px;
1101
+ font-weight: 600;
1102
+ }
1103
+
1104
+ .empty-copy {
1105
+ margin: 0;
1106
+ font-size: 13px;
1107
+ color: var(--text-2);
1108
+ max-width: 260px;
1109
+ }
1110
+
1111
+ /* ─── Bridge info ─────────────────────────────────────── */
1112
+
1113
+ .bridge-info {
1114
+ grid-column: 1 / -1;
1115
+ }
1116
+
1117
+ .bridge-methods {
1118
+ display: flex;
1119
+ flex-wrap: wrap;
1120
+ gap: 8px;
1121
+ }
1122
+
1123
+ .bridge-method {
1124
+ display: inline-flex;
1125
+ align-items: center;
1126
+ gap: 8px;
1127
+ padding: 8px 14px;
1128
+ border: 1px solid var(--border);
1129
+ border-radius: var(--radius-sm);
1130
+ background: var(--bg-soft);
1131
+ font-family: "SF Mono", ui-monospace, monospace;
1132
+ font-size: 12px;
1133
+ color: var(--text-2);
1134
+ }
1135
+
1136
+ .method-type {
1137
+ display: inline-flex;
1138
+ align-items: center;
1139
+ height: 20px;
1140
+ padding: 0 7px;
1141
+ border-radius: 999px;
1142
+ font-family: "Inter", sans-serif;
1143
+ font-size: 10px;
1144
+ font-weight: 700;
1145
+ letter-spacing: 0.06em;
1146
+ text-transform: uppercase;
1147
+ background: rgba(251, 191, 36, 0.1);
1148
+ color: var(--electro-amber);
1149
+ }
1150
+
1151
+ /* ─── Focus styles ────────────────────────────────────── */
1152
+
1153
+ .nav-item:focus-visible,
1154
+ .docs-button:focus-visible,
1155
+ .window-control:focus-visible,
1156
+ .field-input:focus-visible,
1157
+ .create-button:focus-visible,
1158
+ .note-delete:focus-visible,
1159
+ .action-primary:focus-visible,
1160
+ .action-secondary:focus-visible {
1161
+ outline: 2px solid rgba(251, 191, 36, 0.72);
1162
+ outline-offset: 2px;
1163
+ }
1164
+
1165
+ /* ─── Responsive ──────────────────────────────────────── */
1166
+
1167
+ @media (max-width: 1024px) {
1168
+ .feature-grid {
1169
+ grid-template-columns: repeat(2, 1fr);
1170
+ }
1171
+
1172
+ .notes-layout {
1173
+ grid-template-columns: 1fr;
1174
+ }
1175
+
1176
+ .composer {
1177
+ grid-row: auto;
1178
+ }
1179
+ }
1180
+
1181
+ @media (max-width: 760px) {
1182
+ body {
1183
+ padding: 0;
1184
+ overflow: auto;
1185
+ }
1186
+
1187
+ .window-shell {
1188
+ height: 100vh;
1189
+ border: 0;
1190
+ border-radius: 0;
1191
+ }
1192
+
1193
+ .app-body {
1194
+ grid-template-columns: 1fr;
1195
+ }
1196
+
1197
+ .sidebar {
1198
+ border-right: 0;
1199
+ border-bottom: 1px solid var(--border);
1200
+ padding: 14px 12px;
1201
+ }
1202
+
1203
+ .sidebar-brand {
1204
+ display: none;
1205
+ }
1206
+
1207
+ .sidebar-nav {
1208
+ flex-direction: row;
1209
+ gap: 4px;
1210
+ }
1211
+
1212
+ .sidebar-footer {
1213
+ display: none;
1214
+ }
1215
+
1216
+ .content {
1217
+ padding: 20px 16px;
1218
+ }
1219
+
1220
+ .hero-title {
1221
+ font-size: 32px;
1222
+ }
1223
+
1224
+ .feature-grid {
1225
+ grid-template-columns: 1fr;
1226
+ }
1227
+
1228
+ .arch-grid {
1229
+ grid-template-columns: 1fr;
1230
+ }
1231
+
1232
+ .titlebar {
1233
+ grid-template-columns: 1fr;
1234
+ height: auto;
1235
+ padding: 10px 12px;
1236
+ }
1237
+
1238
+ .titlebar-center,
1239
+ .titlebar-actions {
1240
+ display: none;
1241
+ }
1242
+ }
1243
+
1244
+ /* ─── Reduced motion ──────────────────────────────────── */
1245
+
1246
+ @media (prefers-reduced-motion: reduce) {
1247
+ *,
1248
+ *::before,
1249
+ *::after {
1250
+ animation-duration: 0.01ms !important;
1251
+ animation-iteration-count: 1 !important;
1252
+ transition-duration: 0.01ms !important;
1253
+ }
1254
+ }