htmlboard 0.0.0-stage → 0.1.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.
@@ -0,0 +1,703 @@
1
+ /* HtmlBoard Explorer Theme */
2
+ :root {
3
+ --bg-app: #090a0f;
4
+ --bg-topbar: rgba(14, 16, 24, 0.85);
5
+ --bg-sidebar: #0e111a;
6
+ --bg-canvas: #090b12;
7
+ --bg-card: #131722;
8
+ --bg-card-header: #171b29;
9
+ --bg-btn: rgba(255, 255, 255, 0.05);
10
+ --bg-btn-hover: rgba(255, 255, 255, 0.1);
11
+ --border-subtle: #1c2132;
12
+ --border-card: #282e44;
13
+ --border-focus: #6366f1;
14
+ --text-primary: #f8fafc;
15
+ --text-secondary: #94a3b8;
16
+ --text-muted: #64748b;
17
+ --accent: #6366f1;
18
+ --accent-glow: rgba(99, 102, 241, 0.35);
19
+ --accent-light: #818cf8;
20
+ --emerald: #10b981;
21
+ --amber: #f59e0b;
22
+ --rose: #f43f5e;
23
+ --purple: #a855f7;
24
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
25
+ --font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, monospace;
26
+ }
27
+
28
+ * {
29
+ box-sizing: border-box;
30
+ margin: 0;
31
+ padding: 0;
32
+ user-select: none;
33
+ -webkit-font-smoothing: antialiased;
34
+ }
35
+
36
+ body {
37
+ font-family: var(--font-sans);
38
+ background: var(--bg-app);
39
+ color: var(--text-primary);
40
+ overflow: hidden;
41
+ height: 100vh;
42
+ width: 100vw;
43
+ }
44
+
45
+ #app {
46
+ display: flex;
47
+ flex-direction: column;
48
+ height: 100vh;
49
+ width: 100vw;
50
+ }
51
+
52
+ /* Topbar */
53
+ .topbar {
54
+ height: 52px;
55
+ background: var(--bg-topbar);
56
+ backdrop-filter: blur(16px);
57
+ border-bottom: 1px solid var(--border-subtle);
58
+ display: flex;
59
+ align-items: center;
60
+ justify-content: space-between;
61
+ padding: 0 16px;
62
+ z-index: 50;
63
+ flex-shrink: 0;
64
+ }
65
+
66
+ .topbar-left, .topbar-center, .topbar-right {
67
+ display: flex;
68
+ align-items: center;
69
+ gap: 12px;
70
+ }
71
+
72
+ .brand {
73
+ display: flex;
74
+ align-items: center;
75
+ gap: 8px;
76
+ cursor: pointer;
77
+ }
78
+
79
+ .brand-logo {
80
+ display: flex;
81
+ align-items: center;
82
+ justify-content: center;
83
+ }
84
+
85
+ .brand-name {
86
+ font-weight: 700;
87
+ font-size: 15px;
88
+ letter-spacing: -0.02em;
89
+ background: linear-gradient(135deg, #fff 0%, #cbd5e1 100%);
90
+ -webkit-background-clip: text;
91
+ -webkit-text-fill-color: transparent;
92
+ }
93
+
94
+ .project-pill {
95
+ background: rgba(255, 255, 255, 0.04);
96
+ border: 1px solid var(--border-subtle);
97
+ padding: 4px 10px;
98
+ border-radius: 6px;
99
+ font-size: 12px;
100
+ color: var(--text-secondary);
101
+ font-weight: 500;
102
+ max-width: 220px;
103
+ white-space: nowrap;
104
+ overflow: hidden;
105
+ text-overflow: ellipsis;
106
+ }
107
+
108
+ /* Category Filters */
109
+ .filter-tabs {
110
+ display: flex;
111
+ background: rgba(0, 0, 0, 0.3);
112
+ padding: 3px;
113
+ border-radius: 8px;
114
+ border: 1px solid var(--border-subtle);
115
+ }
116
+
117
+ .filter-tab {
118
+ background: transparent;
119
+ border: none;
120
+ color: var(--text-muted);
121
+ font-size: 12px;
122
+ font-weight: 500;
123
+ padding: 5px 12px;
124
+ border-radius: 6px;
125
+ cursor: pointer;
126
+ transition: all 0.15s ease;
127
+ }
128
+
129
+ .filter-tab:hover {
130
+ color: var(--text-primary);
131
+ }
132
+
133
+ .filter-tab.active {
134
+ background: var(--accent);
135
+ color: #fff;
136
+ font-weight: 600;
137
+ box-shadow: 0 2px 8px var(--accent-glow);
138
+ }
139
+
140
+ /* Search Box */
141
+ .search-box {
142
+ display: flex;
143
+ align-items: center;
144
+ gap: 8px;
145
+ background: rgba(0, 0, 0, 0.35);
146
+ border: 1px solid var(--border-subtle);
147
+ border-radius: 8px;
148
+ padding: 5px 10px;
149
+ position: relative;
150
+ transition: border-color 0.15s ease;
151
+ }
152
+
153
+ .search-box:focus-within {
154
+ border-color: var(--border-focus);
155
+ }
156
+
157
+ .search-icon {
158
+ color: var(--text-muted);
159
+ }
160
+
161
+ .search-box input {
162
+ background: transparent;
163
+ border: none;
164
+ outline: none;
165
+ color: var(--text-primary);
166
+ font-size: 12px;
167
+ width: 140px;
168
+ font-family: var(--font-sans);
169
+ user-select: text;
170
+ }
171
+
172
+ .search-box input::placeholder {
173
+ color: var(--text-muted);
174
+ }
175
+
176
+ .search-kbd {
177
+ font-size: 10px;
178
+ font-family: var(--font-mono);
179
+ background: rgba(255, 255, 255, 0.08);
180
+ border: 1px solid var(--border-subtle);
181
+ border-radius: 4px;
182
+ padding: 2px 5px;
183
+ color: var(--text-muted);
184
+ }
185
+
186
+ /* Zoom Controls */
187
+ .zoom-controls {
188
+ display: flex;
189
+ align-items: center;
190
+ gap: 4px;
191
+ background: rgba(0, 0, 0, 0.35);
192
+ border: 1px solid var(--border-subtle);
193
+ border-radius: 8px;
194
+ padding: 2px 6px;
195
+ }
196
+
197
+ .zoom-level-text {
198
+ font-size: 12px;
199
+ font-family: var(--font-mono);
200
+ color: var(--text-secondary);
201
+ min-width: 44px;
202
+ text-align: center;
203
+ cursor: pointer;
204
+ padding: 2px 4px;
205
+ border-radius: 4px;
206
+ }
207
+
208
+ .zoom-level-text:hover {
209
+ background: var(--bg-btn-hover);
210
+ color: var(--text-primary);
211
+ }
212
+
213
+ /* Buttons */
214
+ .btn-icon {
215
+ width: 32px;
216
+ height: 32px;
217
+ border-radius: 7px;
218
+ border: 1px solid transparent;
219
+ background: transparent;
220
+ color: var(--text-secondary);
221
+ display: flex;
222
+ align-items: center;
223
+ justify-content: center;
224
+ cursor: pointer;
225
+ transition: all 0.15s ease;
226
+ }
227
+
228
+ .btn-icon:hover {
229
+ background: var(--bg-btn-hover);
230
+ color: var(--text-primary);
231
+ }
232
+
233
+ .btn-text {
234
+ background: transparent;
235
+ border: none;
236
+ color: var(--text-secondary);
237
+ font-size: 12px;
238
+ font-weight: 500;
239
+ padding: 5px 8px;
240
+ border-radius: 6px;
241
+ cursor: pointer;
242
+ transition: all 0.15s ease;
243
+ }
244
+
245
+ .btn-text:hover {
246
+ background: var(--bg-btn-hover);
247
+ color: var(--text-primary);
248
+ }
249
+
250
+ /* Live Indicator */
251
+ .live-indicator {
252
+ display: flex;
253
+ align-items: center;
254
+ gap: 6px;
255
+ background: rgba(16, 185, 129, 0.1);
256
+ border: 1px solid rgba(16, 185, 129, 0.25);
257
+ padding: 4px 10px;
258
+ border-radius: 20px;
259
+ font-size: 11px;
260
+ font-weight: 600;
261
+ color: var(--emerald);
262
+ }
263
+
264
+ .live-dot {
265
+ width: 7px;
266
+ height: 7px;
267
+ border-radius: 50%;
268
+ background: var(--emerald);
269
+ box-shadow: 0 0 8px var(--emerald);
270
+ animation: pulse-live 2s infinite ease-in-out;
271
+ }
272
+
273
+ .live-indicator.disconnected {
274
+ background: rgba(244, 63, 94, 0.1);
275
+ border-color: rgba(244, 63, 94, 0.25);
276
+ color: var(--rose);
277
+ }
278
+
279
+ .live-indicator.disconnected .live-dot {
280
+ background: var(--rose);
281
+ box-shadow: 0 0 8px var(--rose);
282
+ animation: none;
283
+ }
284
+
285
+ @keyframes pulse-live {
286
+ 0% { transform: scale(0.95); opacity: 0.8; }
287
+ 50% { transform: scale(1.3); opacity: 1; }
288
+ 100% { transform: scale(0.95); opacity: 0.8; }
289
+ }
290
+
291
+ /* Workspace Layout */
292
+ .workspace {
293
+ display: flex;
294
+ flex: 1;
295
+ position: relative;
296
+ overflow: hidden;
297
+ }
298
+
299
+ /* Sidebar */
300
+ .sidebar {
301
+ width: 260px;
302
+ background: var(--bg-sidebar);
303
+ border-right: 1px solid var(--border-subtle);
304
+ display: flex;
305
+ flex-direction: column;
306
+ flex-shrink: 0;
307
+ transition: margin-left 0.2s cubic-bezier(0.16, 1, 0.3, 1);
308
+ z-index: 40;
309
+ }
310
+
311
+ .sidebar.collapsed {
312
+ margin-left: -260px;
313
+ }
314
+
315
+ .sidebar-header {
316
+ height: 42px;
317
+ border-bottom: 1px solid var(--border-subtle);
318
+ display: flex;
319
+ align-items: center;
320
+ justify-content: space-between;
321
+ padding: 0 16px;
322
+ }
323
+
324
+ .sidebar-heading {
325
+ font-size: 11px;
326
+ text-transform: uppercase;
327
+ letter-spacing: 0.08em;
328
+ font-weight: 700;
329
+ color: var(--text-muted);
330
+ }
331
+
332
+ .sidebar-count {
333
+ font-size: 11px;
334
+ color: var(--text-muted);
335
+ font-family: var(--font-mono);
336
+ }
337
+
338
+ .sidebar-tree {
339
+ flex: 1;
340
+ overflow-y: auto;
341
+ padding: 12px 8px;
342
+ display: flex;
343
+ flex-direction: column;
344
+ gap: 16px;
345
+ }
346
+
347
+ .sidebar-section-title {
348
+ font-size: 11px;
349
+ font-weight: 600;
350
+ color: var(--text-muted);
351
+ padding: 4px 8px;
352
+ text-transform: uppercase;
353
+ letter-spacing: 0.05em;
354
+ display: flex;
355
+ align-items: center;
356
+ justify-content: space-between;
357
+ }
358
+
359
+ .sidebar-items {
360
+ display: flex;
361
+ flex-direction: column;
362
+ gap: 2px;
363
+ margin-top: 4px;
364
+ }
365
+
366
+ .sidebar-item {
367
+ display: flex;
368
+ align-items: center;
369
+ justify-content: space-between;
370
+ padding: 8px 10px;
371
+ border-radius: 6px;
372
+ font-size: 13px;
373
+ color: var(--text-secondary);
374
+ cursor: pointer;
375
+ transition: all 0.12s ease;
376
+ }
377
+
378
+ .sidebar-item:hover {
379
+ background: var(--bg-btn-hover);
380
+ color: var(--text-primary);
381
+ }
382
+
383
+ .sidebar-item.active {
384
+ background: rgba(99, 102, 241, 0.15);
385
+ color: var(--accent-light);
386
+ font-weight: 500;
387
+ }
388
+
389
+ .sidebar-item-badge {
390
+ font-size: 10px;
391
+ font-family: var(--font-mono);
392
+ padding: 2px 6px;
393
+ border-radius: 4px;
394
+ background: rgba(255, 255, 255, 0.05);
395
+ color: var(--text-muted);
396
+ }
397
+
398
+ /* Canvas Viewport */
399
+ .canvas-viewport {
400
+ flex: 1;
401
+ position: relative;
402
+ overflow: hidden;
403
+ background: var(--bg-canvas);
404
+ cursor: grab;
405
+ }
406
+
407
+ .canvas-viewport.panning {
408
+ cursor: grabbing;
409
+ }
410
+
411
+ .canvas-stage {
412
+ position: absolute;
413
+ top: 0;
414
+ left: 0;
415
+ width: 100%;
416
+ height: 100%;
417
+ transform-origin: 0 0;
418
+ will-change: transform;
419
+ }
420
+
421
+ /* Infinite Dot Grid */
422
+ .canvas-grid {
423
+ position: absolute;
424
+ inset: -50000px;
425
+ background-image: radial-gradient(circle, #22283a 1.2px, transparent 1.2px);
426
+ background-size: 28px 28px;
427
+ pointer-events: none;
428
+ }
429
+
430
+ /* Canvas Content Layout */
431
+ .canvas-content {
432
+ position: absolute;
433
+ top: 0;
434
+ left: 0;
435
+ /* Grow with the artboards instead of the viewport: each section is one row */
436
+ width: max-content;
437
+ padding: 80px;
438
+ display: flex;
439
+ flex-direction: column;
440
+ gap: 64px;
441
+ }
442
+
443
+ .canvas-section {
444
+ display: flex;
445
+ flex-direction: column;
446
+ gap: 24px;
447
+ }
448
+
449
+ .canvas-section-header {
450
+ display: flex;
451
+ flex-direction: column;
452
+ gap: 4px;
453
+ }
454
+
455
+ .canvas-section-title {
456
+ font-size: 22px;
457
+ font-weight: 700;
458
+ letter-spacing: -0.02em;
459
+ color: var(--text-primary);
460
+ }
461
+
462
+ .canvas-section-desc {
463
+ font-size: 13px;
464
+ color: var(--text-muted);
465
+ }
466
+
467
+ .artboards-flow {
468
+ display: flex;
469
+ flex-wrap: nowrap;
470
+ align-items: flex-start;
471
+ gap: 48px;
472
+ }
473
+
474
+ /* Artboard Frame */
475
+ .artboard-frame {
476
+ flex: none;
477
+ background: var(--bg-card);
478
+ border: 1px solid var(--border-card);
479
+ border-radius: 14px;
480
+ box-shadow: 0 20px 40px -15px rgba(0, 0, 0, 0.6), 0 0 0 1px rgba(255, 255, 255, 0.03);
481
+ display: flex;
482
+ flex-direction: column;
483
+ overflow: hidden;
484
+ transition: box-shadow 0.2s ease, border-color 0.2s ease;
485
+ }
486
+
487
+ .artboard-frame:hover {
488
+ border-color: #3b4260;
489
+ box-shadow: 0 24px 50px -12px rgba(0, 0, 0, 0.7), 0 0 20px var(--accent-glow);
490
+ }
491
+
492
+ .artboard-frame.focused {
493
+ border-color: var(--accent);
494
+ box-shadow: 0 0 0 2px var(--accent), 0 24px 50px -12px rgba(99, 102, 241, 0.4);
495
+ }
496
+
497
+ /* Artboard Header */
498
+ .artboard-header {
499
+ height: 42px;
500
+ background: var(--bg-card-header);
501
+ border-bottom: 1px solid var(--border-subtle);
502
+ display: flex;
503
+ align-items: center;
504
+ justify-content: space-between;
505
+ padding: 0 14px;
506
+ gap: 12px;
507
+ }
508
+
509
+ .artboard-title-group {
510
+ display: flex;
511
+ align-items: center;
512
+ gap: 8px;
513
+ overflow: hidden;
514
+ }
515
+
516
+ .artboard-title {
517
+ font-size: 13px;
518
+ font-weight: 600;
519
+ white-space: nowrap;
520
+ overflow: hidden;
521
+ text-overflow: ellipsis;
522
+ color: var(--text-primary);
523
+ }
524
+
525
+ .artboard-badge {
526
+ font-size: 10px;
527
+ font-weight: 600;
528
+ text-transform: uppercase;
529
+ padding: 2px 6px;
530
+ border-radius: 4px;
531
+ letter-spacing: 0.04em;
532
+ }
533
+
534
+ .badge-mobile { background: rgba(168, 85, 247, 0.18); color: #c084fc; border: 1px solid rgba(168, 85, 247, 0.3); }
535
+ .badge-desktop { background: rgba(59, 130, 246, 0.18); color: #60a5fa; border: 1px solid rgba(59, 130, 246, 0.3); }
536
+ .badge-tablet { background: rgba(16, 185, 129, 0.18); color: #34d399; border: 1px solid rgba(16, 185, 129, 0.3); }
537
+ .badge-components { background: rgba(245, 158, 11, 0.18); color: #fbbf24; border: 1px solid rgba(245, 158, 11, 0.3); }
538
+ .badge-responsive { background: rgba(99, 102, 241, 0.18); color: #a5b4fc; border: 1px solid rgba(99, 102, 241, 0.3); }
539
+
540
+ .artboard-actions {
541
+ display: flex;
542
+ align-items: center;
543
+ gap: 6px;
544
+ }
545
+
546
+ .artboard-dimensions {
547
+ font-size: 11px;
548
+ font-family: var(--font-mono);
549
+ color: var(--text-muted);
550
+ margin-right: 4px;
551
+ }
552
+
553
+ .artboard-btn {
554
+ width: 26px;
555
+ height: 26px;
556
+ border-radius: 6px;
557
+ border: 1px solid transparent;
558
+ background: transparent;
559
+ color: var(--text-muted);
560
+ display: flex;
561
+ align-items: center;
562
+ justify-content: center;
563
+ cursor: pointer;
564
+ transition: all 0.15s ease;
565
+ }
566
+
567
+ .artboard-btn:hover {
568
+ background: var(--bg-btn-hover);
569
+ color: var(--text-primary);
570
+ }
571
+
572
+ /* Artboard Iframe */
573
+ .artboard-body {
574
+ position: relative;
575
+ background: #000;
576
+ overflow: hidden;
577
+ display: flex;
578
+ }
579
+
580
+ .artboard-iframe {
581
+ border: none;
582
+ background: #fff;
583
+ display: block;
584
+ }
585
+
586
+ /* Shield to prevent iframes capturing pointer events during canvas pan/drag */
587
+ .pointer-shield {
588
+ position: absolute;
589
+ inset: 0;
590
+ z-index: 30;
591
+ display: none;
592
+ cursor: inherit;
593
+ }
594
+
595
+ .pointer-shield.active {
596
+ display: block;
597
+ }
598
+
599
+ /* Mini HUD */
600
+ .canvas-hud {
601
+ position: absolute;
602
+ bottom: 16px;
603
+ left: 50%;
604
+ transform: translateX(-50%);
605
+ background: rgba(14, 17, 26, 0.85);
606
+ backdrop-filter: blur(12px);
607
+ border: 1px solid var(--border-subtle);
608
+ border-radius: 20px;
609
+ padding: 6px 16px;
610
+ display: flex;
611
+ align-items: center;
612
+ gap: 10px;
613
+ font-size: 11px;
614
+ color: var(--text-muted);
615
+ pointer-events: none;
616
+ z-index: 40;
617
+ }
618
+
619
+ .canvas-hud kbd {
620
+ font-family: var(--font-mono);
621
+ background: rgba(255, 255, 255, 0.1);
622
+ padding: 2px 5px;
623
+ border-radius: 4px;
624
+ color: var(--text-secondary);
625
+ }
626
+
627
+ .hud-sep {
628
+ opacity: 0.4;
629
+ }
630
+
631
+ /* Modal */
632
+ .modal-backdrop {
633
+ position: fixed;
634
+ inset: 0;
635
+ background: rgba(0, 0, 0, 0.7);
636
+ backdrop-filter: blur(8px);
637
+ display: flex;
638
+ align-items: center;
639
+ justify-content: center;
640
+ z-index: 100;
641
+ opacity: 0;
642
+ pointer-events: none;
643
+ transition: opacity 0.2s ease;
644
+ }
645
+
646
+ .modal-backdrop.open {
647
+ opacity: 1;
648
+ pointer-events: auto;
649
+ }
650
+
651
+ .modal-card {
652
+ width: 90%;
653
+ max-width: 520px;
654
+ background: var(--bg-card);
655
+ border: 1px solid var(--border-card);
656
+ border-radius: 16px;
657
+ padding: 24px;
658
+ box-shadow: 0 30px 60px -12px rgba(0, 0, 0, 0.8);
659
+ }
660
+
661
+ .modal-header {
662
+ display: flex;
663
+ align-items: center;
664
+ justify-content: space-between;
665
+ margin-bottom: 20px;
666
+ border-bottom: 1px solid var(--border-subtle);
667
+ padding-bottom: 12px;
668
+ }
669
+
670
+ .modal-header h2 {
671
+ font-size: 18px;
672
+ font-weight: 700;
673
+ }
674
+
675
+ .shortcuts-grid {
676
+ display: flex;
677
+ flex-direction: column;
678
+ gap: 12px;
679
+ }
680
+
681
+ .shortcut-item {
682
+ display: flex;
683
+ align-items: center;
684
+ justify-content: space-between;
685
+ font-size: 13px;
686
+ color: var(--text-secondary);
687
+ }
688
+
689
+ .shortcut-keys {
690
+ display: flex;
691
+ align-items: center;
692
+ gap: 6px;
693
+ }
694
+
695
+ .shortcut-keys kbd {
696
+ font-family: var(--font-mono);
697
+ background: rgba(255, 255, 255, 0.08);
698
+ border: 1px solid var(--border-subtle);
699
+ padding: 3px 7px;
700
+ border-radius: 6px;
701
+ font-size: 11px;
702
+ color: var(--text-primary);
703
+ }