cyclecad 3.0.0 → 3.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.
Files changed (66) hide show
  1. package/BILLING-IMPLEMENTATION-SUMMARY.md +425 -0
  2. package/BILLING-INDEX.md +293 -0
  3. package/BILLING-INTEGRATION-GUIDE.md +414 -0
  4. package/COLLABORATION-INDEX.md +440 -0
  5. package/COLLABORATION-SYSTEM-SUMMARY.md +548 -0
  6. package/DOCKER-BUILD-MANIFEST.txt +483 -0
  7. package/DOCKER-FILES-REFERENCE.md +440 -0
  8. package/DOCKER-INFRASTRUCTURE.md +475 -0
  9. package/DOCKER-README.md +435 -0
  10. package/Dockerfile +33 -55
  11. package/PWA-FILES-CREATED.txt +350 -0
  12. package/QUICK-START-TESTING.md +126 -0
  13. package/STEP-IMPORT-QUICKSTART.md +347 -0
  14. package/STEP-IMPORT-SYSTEM-SUMMARY.md +502 -0
  15. package/app/css/mobile.css +1074 -0
  16. package/app/icons/generate-icons.js +203 -0
  17. package/app/js/billing-ui.js +990 -0
  18. package/app/js/brep-kernel.js +933 -981
  19. package/app/js/collab-client.js +750 -0
  20. package/app/js/mobile-nav.js +623 -0
  21. package/app/js/mobile-toolbar.js +476 -0
  22. package/app/js/modules/billing-module.js +724 -0
  23. package/app/js/modules/step-module-enhanced.js +938 -0
  24. package/app/js/offline-manager.js +705 -0
  25. package/app/js/responsive-init.js +360 -0
  26. package/app/js/touch-handler.js +429 -0
  27. package/app/manifest.json +211 -0
  28. package/app/offline.html +508 -0
  29. package/app/sw.js +571 -0
  30. package/app/tests/billing-tests.html +779 -0
  31. package/app/tests/brep-tests.html +980 -0
  32. package/app/tests/collab-tests.html +743 -0
  33. package/app/tests/mobile-tests.html +1299 -0
  34. package/app/tests/pwa-tests.html +1134 -0
  35. package/app/tests/step-tests.html +1042 -0
  36. package/app/tests/test-agent-v3.html +719 -0
  37. package/docker-compose.yml +225 -0
  38. package/docs/BILLING-HELP.json +260 -0
  39. package/docs/BILLING-README.md +639 -0
  40. package/docs/BILLING-TUTORIAL.md +736 -0
  41. package/docs/BREP-HELP.json +326 -0
  42. package/docs/BREP-TUTORIAL.md +802 -0
  43. package/docs/COLLABORATION-HELP.json +228 -0
  44. package/docs/COLLABORATION-TUTORIAL.md +818 -0
  45. package/docs/DOCKER-HELP.json +224 -0
  46. package/docs/DOCKER-TUTORIAL.md +974 -0
  47. package/docs/MOBILE-HELP.json +243 -0
  48. package/docs/MOBILE-RESPONSIVE-README.md +378 -0
  49. package/docs/MOBILE-TUTORIAL.md +747 -0
  50. package/docs/PWA-HELP.json +228 -0
  51. package/docs/PWA-README.md +662 -0
  52. package/docs/PWA-TUTORIAL.md +757 -0
  53. package/docs/STEP-HELP.json +481 -0
  54. package/docs/STEP-IMPORT-TUTORIAL.md +824 -0
  55. package/docs/TESTING-GUIDE.md +528 -0
  56. package/docs/TESTING-HELP.json +182 -0
  57. package/fusion-vs-cyclecad.html +1771 -0
  58. package/nginx.conf +237 -0
  59. package/package.json +1 -1
  60. package/server/Dockerfile.converter +51 -0
  61. package/server/Dockerfile.signaling +28 -0
  62. package/server/billing-server.js +487 -0
  63. package/server/converter-enhanced.py +528 -0
  64. package/server/requirements-converter.txt +29 -0
  65. package/server/signaling-server.js +801 -0
  66. package/tests/docker-tests.sh +389 -0
@@ -0,0 +1,1074 @@
1
+ /* cycleCAD Mobile Responsive Stylesheet */
2
+ /* Comprehensive responsive design for mobile, tablet, and desktop devices */
3
+
4
+ :root {
5
+ --safe-area-top: env(safe-area-inset-top, 0);
6
+ --safe-area-right: env(safe-area-inset-right, 0);
7
+ --safe-area-bottom: env(safe-area-inset-bottom, 0);
8
+ --safe-area-left: env(safe-area-inset-left, 0);
9
+ }
10
+
11
+ /* ============================================================================
12
+ BASE RESPONSIVE GRID & LAYOUT
13
+ ============================================================================ */
14
+
15
+ body {
16
+ margin: 0;
17
+ padding: 0;
18
+ display: flex;
19
+ flex-direction: column;
20
+ height: 100vh;
21
+ width: 100vw;
22
+ overflow: hidden;
23
+ }
24
+
25
+ #workspace {
26
+ display: flex;
27
+ flex: 1;
28
+ overflow: hidden;
29
+ }
30
+
31
+ /* ============================================================================
32
+ DESKTOP LAYOUT (>1200px) - Full sidebar + top menu + right panel
33
+ ============================================================================ */
34
+
35
+ @media (min-width: 1200px) {
36
+ .menu-bar {
37
+ display: flex;
38
+ height: 40px;
39
+ background: var(--bg-primary);
40
+ border-bottom: 1px solid var(--border-color);
41
+ }
42
+
43
+ .hamburger-menu {
44
+ display: none;
45
+ }
46
+
47
+ #left-panel {
48
+ width: 280px;
49
+ min-width: 280px;
50
+ border-right: 1px solid var(--border-color);
51
+ overflow-y: auto;
52
+ overflow-x: hidden;
53
+ }
54
+
55
+ #viewport {
56
+ flex: 1;
57
+ }
58
+
59
+ #right-panel {
60
+ width: 320px;
61
+ min-width: 320px;
62
+ border-left: 1px solid var(--border-color);
63
+ overflow-y: auto;
64
+ overflow-x: hidden;
65
+ display: flex;
66
+ }
67
+
68
+ .toolbar-main {
69
+ display: flex;
70
+ height: 44px;
71
+ background: var(--bg-primary);
72
+ border-bottom: 1px solid var(--border-color);
73
+ padding: 4px 8px;
74
+ gap: 4px;
75
+ }
76
+
77
+ .toolbar-main .tool-button {
78
+ padding: 8px 12px;
79
+ min-width: auto;
80
+ font-size: 14px;
81
+ }
82
+
83
+ .mobile-toolbar {
84
+ display: none;
85
+ }
86
+
87
+ .mobile-nav {
88
+ display: none;
89
+ }
90
+
91
+ .status-bar {
92
+ height: 24px;
93
+ font-size: 12px;
94
+ padding: 0 12px;
95
+ }
96
+ }
97
+
98
+ /* ============================================================================
99
+ TABLET LANDSCAPE (900px - 1200px) - Collapse left panel to icons
100
+ ============================================================================ */
101
+
102
+ @media (min-width: 900px) and (max-width: 1199px) {
103
+ .menu-bar {
104
+ display: flex;
105
+ height: 40px;
106
+ background: var(--bg-primary);
107
+ border-bottom: 1px solid var(--border-color);
108
+ }
109
+
110
+ .hamburger-menu {
111
+ display: none;
112
+ }
113
+
114
+ #left-panel {
115
+ width: 60px;
116
+ min-width: 60px;
117
+ border-right: 1px solid var(--border-color);
118
+ overflow-y: auto;
119
+ overflow-x: hidden;
120
+ }
121
+
122
+ #left-panel .tree-item-label {
123
+ display: none;
124
+ }
125
+
126
+ #left-panel .tree-item-icon {
127
+ width: 100%;
128
+ text-align: center;
129
+ }
130
+
131
+ #viewport {
132
+ flex: 1;
133
+ }
134
+
135
+ #right-panel {
136
+ width: 280px;
137
+ min-width: 280px;
138
+ border-left: 1px solid var(--border-color);
139
+ overflow-y: auto;
140
+ overflow-x: hidden;
141
+ }
142
+
143
+ .toolbar-main {
144
+ display: flex;
145
+ height: 44px;
146
+ background: var(--bg-primary);
147
+ border-bottom: 1px solid var(--border-color);
148
+ padding: 4px 8px;
149
+ gap: 4px;
150
+ overflow-x: auto;
151
+ }
152
+
153
+ .toolbar-main .tool-button {
154
+ padding: 8px 10px;
155
+ min-width: auto;
156
+ font-size: 12px;
157
+ white-space: nowrap;
158
+ }
159
+
160
+ .mobile-toolbar {
161
+ display: none;
162
+ }
163
+
164
+ .mobile-nav {
165
+ display: none;
166
+ }
167
+
168
+ .status-bar {
169
+ height: 24px;
170
+ font-size: 11px;
171
+ padding: 0 8px;
172
+ }
173
+ }
174
+
175
+ /* ============================================================================
176
+ TABLET PORTRAIT (600px - 900px) - Hide right panel, bottom toolbar
177
+ ============================================================================ */
178
+
179
+ @media (min-width: 600px) and (max-width: 899px) {
180
+ .menu-bar {
181
+ display: flex;
182
+ height: 40px;
183
+ background: var(--bg-primary);
184
+ border-bottom: 1px solid var(--border-color);
185
+ }
186
+
187
+ .hamburger-menu {
188
+ display: none;
189
+ }
190
+
191
+ #left-panel {
192
+ width: 200px;
193
+ min-width: 200px;
194
+ border-right: 1px solid var(--border-color);
195
+ overflow-y: auto;
196
+ overflow-x: hidden;
197
+ }
198
+
199
+ #viewport {
200
+ flex: 1;
201
+ }
202
+
203
+ #right-panel {
204
+ display: none;
205
+ position: fixed;
206
+ right: 0;
207
+ top: 40px;
208
+ width: 280px;
209
+ height: calc(100vh - 40px - 44px);
210
+ background: var(--bg-primary);
211
+ border-left: 1px solid var(--border-color);
212
+ z-index: 100;
213
+ overflow-y: auto;
214
+ overflow-x: hidden;
215
+ box-shadow: -2px 0 8px rgba(0, 0, 0, 0.15);
216
+ transform: translateX(100%);
217
+ transition: transform 0.3s ease-out;
218
+ }
219
+
220
+ #right-panel.open {
221
+ display: flex;
222
+ transform: translateX(0);
223
+ }
224
+
225
+ .right-panel-backdrop {
226
+ display: none;
227
+ position: fixed;
228
+ top: 0;
229
+ left: 0;
230
+ width: 100%;
231
+ height: 100%;
232
+ background: rgba(0, 0, 0, 0.3);
233
+ backdrop-filter: blur(4px);
234
+ z-index: 99;
235
+ }
236
+
237
+ .right-panel-backdrop.open {
238
+ display: block;
239
+ }
240
+
241
+ .toolbar-main {
242
+ display: flex;
243
+ height: 44px;
244
+ background: var(--bg-primary);
245
+ border-top: 1px solid var(--border-color);
246
+ padding: 4px 8px;
247
+ gap: 4px;
248
+ overflow-x: auto;
249
+ margin-top: auto;
250
+ }
251
+
252
+ .toolbar-main .tool-button {
253
+ padding: 8px 10px;
254
+ min-width: auto;
255
+ font-size: 12px;
256
+ white-space: nowrap;
257
+ }
258
+
259
+ .mobile-toolbar {
260
+ display: none;
261
+ }
262
+
263
+ .mobile-nav {
264
+ display: none;
265
+ }
266
+
267
+ .status-bar {
268
+ height: 24px;
269
+ font-size: 11px;
270
+ padding: 0 8px;
271
+ }
272
+ }
273
+
274
+ /* ============================================================================
275
+ PHONE LANDSCAPE (480px - 600px) - Minimal toolbar, overlay panels
276
+ ============================================================================ */
277
+
278
+ @media (min-width: 480px) and (max-width: 599px) {
279
+ .menu-bar {
280
+ display: none;
281
+ }
282
+
283
+ .hamburger-menu {
284
+ display: flex;
285
+ width: 44px;
286
+ height: 44px;
287
+ background: var(--bg-primary);
288
+ border-bottom: 1px solid var(--border-color);
289
+ align-items: center;
290
+ justify-content: center;
291
+ cursor: pointer;
292
+ padding: 0;
293
+ margin: 0;
294
+ z-index: 200;
295
+ }
296
+
297
+ #left-panel {
298
+ display: none;
299
+ position: fixed;
300
+ left: 0;
301
+ top: 44px;
302
+ width: 240px;
303
+ height: calc(100vh - 44px - 44px);
304
+ background: var(--bg-primary);
305
+ border-right: 1px solid var(--border-color);
306
+ z-index: 150;
307
+ overflow-y: auto;
308
+ overflow-x: hidden;
309
+ box-shadow: 2px 0 8px rgba(0, 0, 0, 0.15);
310
+ transform: translateX(-100%);
311
+ transition: transform 0.3s ease-out;
312
+ }
313
+
314
+ #left-panel.open {
315
+ display: flex;
316
+ transform: translateX(0);
317
+ }
318
+
319
+ .left-panel-backdrop {
320
+ display: none;
321
+ position: fixed;
322
+ top: 44px;
323
+ left: 0;
324
+ width: 100%;
325
+ height: calc(100vh - 44px);
326
+ background: rgba(0, 0, 0, 0.3);
327
+ backdrop-filter: blur(4px);
328
+ z-index: 140;
329
+ }
330
+
331
+ .left-panel-backdrop.open {
332
+ display: block;
333
+ }
334
+
335
+ #viewport {
336
+ flex: 1;
337
+ }
338
+
339
+ #right-panel {
340
+ display: none;
341
+ position: fixed;
342
+ right: 0;
343
+ top: 44px;
344
+ width: 240px;
345
+ height: calc(100vh - 44px - 44px);
346
+ background: var(--bg-primary);
347
+ border-left: 1px solid var(--border-color);
348
+ z-index: 150;
349
+ overflow-y: auto;
350
+ overflow-x: hidden;
351
+ box-shadow: -2px 0 8px rgba(0, 0, 0, 0.15);
352
+ transform: translateX(100%);
353
+ transition: transform 0.3s ease-out;
354
+ }
355
+
356
+ #right-panel.open {
357
+ display: flex;
358
+ transform: translateX(0);
359
+ }
360
+
361
+ .right-panel-backdrop {
362
+ display: none;
363
+ position: fixed;
364
+ top: 44px;
365
+ right: 0;
366
+ width: 100%;
367
+ height: calc(100vh - 44px);
368
+ background: rgba(0, 0, 0, 0.3);
369
+ backdrop-filter: blur(4px);
370
+ z-index: 140;
371
+ }
372
+
373
+ .right-panel-backdrop.open {
374
+ display: block;
375
+ }
376
+
377
+ .toolbar-main {
378
+ display: none;
379
+ }
380
+
381
+ .mobile-toolbar {
382
+ display: flex;
383
+ position: fixed;
384
+ bottom: 0;
385
+ left: 0;
386
+ right: 0;
387
+ height: 44px;
388
+ background: var(--bg-primary);
389
+ border-top: 1px solid var(--border-color);
390
+ padding-bottom: var(--safe-area-bottom);
391
+ gap: 0;
392
+ z-index: 180;
393
+ overflow-x: auto;
394
+ overflow-y: hidden;
395
+ }
396
+
397
+ .mobile-toolbar .tool-button {
398
+ flex: 1;
399
+ padding: 8px 4px;
400
+ min-width: 44px;
401
+ font-size: 10px;
402
+ display: flex;
403
+ flex-direction: column;
404
+ align-items: center;
405
+ justify-content: center;
406
+ gap: 2px;
407
+ }
408
+
409
+ .mobile-toolbar .tool-icon {
410
+ font-size: 20px;
411
+ }
412
+
413
+ .mobile-toolbar .tool-label {
414
+ font-size: 9px;
415
+ line-height: 1;
416
+ }
417
+
418
+ .mobile-nav {
419
+ display: none;
420
+ }
421
+
422
+ .status-bar {
423
+ height: 24px;
424
+ font-size: 10px;
425
+ padding: 0 4px;
426
+ }
427
+ }
428
+
429
+ /* ============================================================================
430
+ PHONE PORTRAIT (<480px) - Single panel mode, swipe navigation
431
+ ============================================================================ */
432
+
433
+ @media (max-width: 479px) {
434
+ .menu-bar {
435
+ display: none;
436
+ }
437
+
438
+ .hamburger-menu {
439
+ display: flex;
440
+ width: 44px;
441
+ height: 44px;
442
+ background: var(--bg-primary);
443
+ border-bottom: 1px solid var(--border-color);
444
+ align-items: center;
445
+ justify-content: center;
446
+ cursor: pointer;
447
+ padding: 0;
448
+ margin: 0;
449
+ z-index: 200;
450
+ }
451
+
452
+ .hamburger-menu span {
453
+ display: flex;
454
+ flex-direction: column;
455
+ gap: 4px;
456
+ width: 24px;
457
+ }
458
+
459
+ .hamburger-menu span div {
460
+ height: 2px;
461
+ background: currentColor;
462
+ border-radius: 1px;
463
+ }
464
+
465
+ #left-panel {
466
+ display: none;
467
+ position: fixed;
468
+ left: 0;
469
+ top: 44px;
470
+ width: 100%;
471
+ max-width: 260px;
472
+ height: calc(100vh - 44px - 44px);
473
+ background: var(--bg-primary);
474
+ border-right: 1px solid var(--border-color);
475
+ z-index: 150;
476
+ overflow-y: auto;
477
+ overflow-x: hidden;
478
+ box-shadow: 2px 0 8px rgba(0, 0, 0, 0.15);
479
+ transform: translateX(-100%);
480
+ transition: transform 0.3s ease-out;
481
+ }
482
+
483
+ #left-panel.open {
484
+ display: flex;
485
+ transform: translateX(0);
486
+ }
487
+
488
+ .left-panel-backdrop {
489
+ display: none;
490
+ position: fixed;
491
+ top: 44px;
492
+ left: 0;
493
+ width: 100%;
494
+ height: calc(100vh - 44px);
495
+ background: rgba(0, 0, 0, 0.3);
496
+ backdrop-filter: blur(4px);
497
+ z-index: 140;
498
+ }
499
+
500
+ .left-panel-backdrop.open {
501
+ display: block;
502
+ }
503
+
504
+ #viewport {
505
+ flex: 1;
506
+ }
507
+
508
+ #right-panel {
509
+ display: none;
510
+ position: fixed;
511
+ right: 0;
512
+ bottom: 44px;
513
+ width: 100%;
514
+ max-width: 260px;
515
+ height: calc(100vh - 44px - 44px);
516
+ background: var(--bg-primary);
517
+ border-left: 1px solid var(--border-color);
518
+ z-index: 150;
519
+ overflow-y: auto;
520
+ overflow-x: hidden;
521
+ box-shadow: -2px 0 8px rgba(0, 0, 0, 0.15);
522
+ transform: translateX(100%);
523
+ transition: transform 0.3s ease-out;
524
+ }
525
+
526
+ #right-panel.open {
527
+ display: flex;
528
+ transform: translateX(0);
529
+ }
530
+
531
+ .right-panel-backdrop {
532
+ display: none;
533
+ position: fixed;
534
+ top: 44px;
535
+ right: 0;
536
+ width: 100%;
537
+ height: calc(100vh - 88px);
538
+ background: rgba(0, 0, 0, 0.3);
539
+ backdrop-filter: blur(4px);
540
+ z-index: 140;
541
+ }
542
+
543
+ .right-panel-backdrop.open {
544
+ display: block;
545
+ }
546
+
547
+ .toolbar-main {
548
+ display: none;
549
+ }
550
+
551
+ .mobile-toolbar {
552
+ display: flex;
553
+ position: fixed;
554
+ bottom: 0;
555
+ left: 0;
556
+ right: 0;
557
+ height: 44px;
558
+ background: var(--bg-primary);
559
+ border-top: 1px solid var(--border-color);
560
+ padding-bottom: var(--safe-area-bottom);
561
+ gap: 0;
562
+ z-index: 180;
563
+ overflow-x: auto;
564
+ overflow-y: hidden;
565
+ }
566
+
567
+ .mobile-toolbar .tool-button {
568
+ flex: 0 0 44px;
569
+ padding: 0;
570
+ width: 44px;
571
+ height: 44px;
572
+ min-width: 44px;
573
+ font-size: 10px;
574
+ display: flex;
575
+ flex-direction: column;
576
+ align-items: center;
577
+ justify-content: center;
578
+ gap: 2px;
579
+ border-right: 1px solid var(--border-color);
580
+ }
581
+
582
+ .mobile-toolbar .tool-button:last-child {
583
+ border-right: none;
584
+ }
585
+
586
+ .mobile-toolbar .tool-icon {
587
+ font-size: 20px;
588
+ }
589
+
590
+ .mobile-toolbar .tool-label {
591
+ display: none;
592
+ }
593
+
594
+ .mobile-nav {
595
+ display: flex;
596
+ flex-direction: column;
597
+ gap: 0;
598
+ }
599
+
600
+ .status-bar {
601
+ height: 20px;
602
+ font-size: 9px;
603
+ padding: 2px 4px;
604
+ line-height: 1;
605
+ }
606
+ }
607
+
608
+ /* ============================================================================
609
+ TOUCH OPTIMIZATIONS
610
+ ============================================================================ */
611
+
612
+ button, .button, .tool-button, .tree-item {
613
+ min-height: 44px;
614
+ min-width: 44px;
615
+ touch-action: manipulation;
616
+ }
617
+
618
+ input, textarea, select {
619
+ min-height: 44px;
620
+ font-size: 16px; /* Prevents zoom on focus on iOS */
621
+ }
622
+
623
+ /* Remove tap highlight on iOS */
624
+ button, a, input, textarea, select {
625
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0.1);
626
+ }
627
+
628
+ /* Prevent text selection on touch */
629
+ .tool-button, .tree-item, .mobile-toolbar {
630
+ -webkit-user-select: none;
631
+ user-select: none;
632
+ }
633
+
634
+ /* Smooth scrolling on iOS */
635
+ #left-panel, #right-panel, .toolbar-main {
636
+ -webkit-overflow-scrolling: touch;
637
+ }
638
+
639
+ /* ============================================================================
640
+ MOBILE-SPECIFIC COMPONENTS
641
+ ============================================================================ */
642
+
643
+ .bottom-sheet {
644
+ position: fixed;
645
+ bottom: 0;
646
+ left: 0;
647
+ right: 0;
648
+ background: var(--bg-primary);
649
+ border-top: 1px solid var(--border-color);
650
+ z-index: 160;
651
+ max-height: 80vh;
652
+ overflow-y: auto;
653
+ border-radius: 12px 12px 0 0;
654
+ box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.15);
655
+ padding-bottom: var(--safe-area-bottom);
656
+ }
657
+
658
+ .bottom-sheet.hidden {
659
+ display: none;
660
+ }
661
+
662
+ .bottom-sheet-handle {
663
+ width: 40px;
664
+ height: 4px;
665
+ background: var(--border-color);
666
+ border-radius: 2px;
667
+ margin: 8px auto;
668
+ cursor: grab;
669
+ }
670
+
671
+ .bottom-sheet-content {
672
+ padding: 12px 16px;
673
+ }
674
+
675
+ .floating-action-button {
676
+ position: fixed;
677
+ bottom: 72px;
678
+ right: 16px;
679
+ width: 56px;
680
+ height: 56px;
681
+ border-radius: 50%;
682
+ background: var(--accent-color);
683
+ color: white;
684
+ border: none;
685
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
686
+ cursor: pointer;
687
+ display: flex;
688
+ align-items: center;
689
+ justify-content: center;
690
+ font-size: 24px;
691
+ z-index: 170;
692
+ transition: transform 0.2s, box-shadow 0.2s;
693
+ }
694
+
695
+ .floating-action-button:active {
696
+ transform: scale(0.9);
697
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
698
+ }
699
+
700
+ .floating-action-button.hidden {
701
+ display: none;
702
+ }
703
+
704
+ .fab-menu {
705
+ position: fixed;
706
+ bottom: 140px;
707
+ right: 16px;
708
+ display: flex;
709
+ flex-direction: column;
710
+ gap: 12px;
711
+ z-index: 165;
712
+ }
713
+
714
+ .fab-menu.hidden {
715
+ display: none;
716
+ }
717
+
718
+ .fab-item {
719
+ width: 48px;
720
+ height: 48px;
721
+ border-radius: 50%;
722
+ background: var(--bg-secondary);
723
+ border: 1px solid var(--border-color);
724
+ display: flex;
725
+ align-items: center;
726
+ justify-content: center;
727
+ cursor: pointer;
728
+ font-size: 20px;
729
+ transition: all 0.2s;
730
+ }
731
+
732
+ .fab-item:active {
733
+ transform: scale(0.9);
734
+ }
735
+
736
+ .context-menu-mobile {
737
+ position: fixed;
738
+ bottom: 0;
739
+ left: 0;
740
+ right: 0;
741
+ background: var(--bg-primary);
742
+ border-top: 1px solid var(--border-color);
743
+ z-index: 160;
744
+ padding: 8px;
745
+ max-height: 50vh;
746
+ overflow-y: auto;
747
+ border-radius: 12px 12px 0 0;
748
+ }
749
+
750
+ .context-menu-mobile .menu-item {
751
+ padding: 16px;
752
+ border-bottom: 1px solid var(--border-color);
753
+ display: flex;
754
+ align-items: center;
755
+ gap: 12px;
756
+ cursor: pointer;
757
+ min-height: 48px;
758
+ }
759
+
760
+ .context-menu-mobile .menu-item:last-child {
761
+ border-bottom: none;
762
+ }
763
+
764
+ .context-menu-mobile .menu-item:active {
765
+ background: var(--bg-secondary);
766
+ }
767
+
768
+ .context-menu-mobile .menu-icon {
769
+ font-size: 20px;
770
+ opacity: 0.7;
771
+ }
772
+
773
+ /* ============================================================================
774
+ WORKSPACE TABS (Mobile Bottom Tabs)
775
+ ============================================================================ */
776
+
777
+ @media (max-width: 599px) {
778
+ .workspace-tabs {
779
+ display: flex;
780
+ gap: 0;
781
+ border-bottom: 1px solid var(--border-color);
782
+ overflow-x: auto;
783
+ -webkit-overflow-scrolling: touch;
784
+ background: var(--bg-secondary);
785
+ }
786
+
787
+ .workspace-tab {
788
+ flex: 0 0 auto;
789
+ padding: 12px 16px;
790
+ min-width: 100px;
791
+ text-align: center;
792
+ border-bottom: 3px solid transparent;
793
+ cursor: pointer;
794
+ font-size: 13px;
795
+ white-space: nowrap;
796
+ }
797
+
798
+ .workspace-tab.active {
799
+ border-bottom-color: var(--accent-color);
800
+ color: var(--accent-color);
801
+ }
802
+ }
803
+
804
+ /* ============================================================================
805
+ TIMELINE MOBILE
806
+ ============================================================================ */
807
+
808
+ @media (max-width: 599px) {
809
+ .timeline-container {
810
+ display: none;
811
+ position: fixed;
812
+ bottom: 44px;
813
+ left: 0;
814
+ right: 0;
815
+ background: var(--bg-primary);
816
+ border-top: 1px solid var(--border-color);
817
+ max-height: 150px;
818
+ overflow-y: auto;
819
+ z-index: 100;
820
+ }
821
+
822
+ .timeline-container.open {
823
+ display: block;
824
+ }
825
+
826
+ .timeline-item {
827
+ padding: 8px 12px;
828
+ min-height: 40px;
829
+ border-bottom: 1px solid var(--border-color);
830
+ }
831
+ }
832
+
833
+ /* ============================================================================
834
+ DIALOGS MOBILE
835
+ ============================================================================ */
836
+
837
+ @media (max-width: 599px) {
838
+ .modal-dialog {
839
+ position: fixed;
840
+ bottom: 0;
841
+ left: 0;
842
+ right: 0;
843
+ width: 100%;
844
+ max-height: 90vh;
845
+ border-radius: 12px 12px 0 0;
846
+ padding-bottom: var(--safe-area-bottom);
847
+ }
848
+
849
+ .modal-backdrop {
850
+ position: fixed;
851
+ top: 0;
852
+ left: 0;
853
+ width: 100%;
854
+ height: 100%;
855
+ background: rgba(0, 0, 0, 0.5);
856
+ backdrop-filter: blur(4px);
857
+ z-index: 150;
858
+ }
859
+
860
+ .modal-header {
861
+ display: flex;
862
+ justify-content: space-between;
863
+ align-items: center;
864
+ padding: 16px;
865
+ border-bottom: 1px solid var(--border-color);
866
+ }
867
+
868
+ .modal-close {
869
+ width: 44px;
870
+ height: 44px;
871
+ display: flex;
872
+ align-items: center;
873
+ justify-content: center;
874
+ cursor: pointer;
875
+ font-size: 20px;
876
+ }
877
+ }
878
+
879
+ /* ============================================================================
880
+ BREADCRUMB MOBILE
881
+ ============================================================================ */
882
+
883
+ @media (max-width: 599px) {
884
+ .breadcrumb {
885
+ display: flex;
886
+ gap: 4px;
887
+ padding: 4px 8px;
888
+ font-size: 12px;
889
+ overflow-x: auto;
890
+ -webkit-overflow-scrolling: touch;
891
+ background: var(--bg-secondary);
892
+ }
893
+
894
+ .breadcrumb-item {
895
+ white-space: nowrap;
896
+ padding: 4px 8px;
897
+ }
898
+
899
+ .breadcrumb-separator {
900
+ opacity: 0.5;
901
+ }
902
+ }
903
+
904
+ /* ============================================================================
905
+ ORIENTATION CHANGES
906
+ ============================================================================ */
907
+
908
+ @media (orientation: portrait) {
909
+ body {
910
+ /* Extra safe area for notch */
911
+ padding-top: var(--safe-area-top);
912
+ }
913
+ }
914
+
915
+ @media (orientation: landscape) {
916
+ body {
917
+ padding-top: 0;
918
+ }
919
+
920
+ #left-panel {
921
+ max-height: 100vh;
922
+ }
923
+
924
+ #right-panel {
925
+ max-height: 100vh;
926
+ }
927
+
928
+ .mobile-toolbar {
929
+ flex-direction: row;
930
+ }
931
+
932
+ .floating-action-button {
933
+ right: 8px;
934
+ bottom: 8px;
935
+ }
936
+ }
937
+
938
+ /* ============================================================================
939
+ LANDSCAPE PHONE (480px - 600px)
940
+ ============================================================================ */
941
+
942
+ @media (max-height: 500px) and (orientation: landscape) {
943
+ .hamburger-menu {
944
+ height: 40px;
945
+ }
946
+
947
+ #left-panel {
948
+ height: calc(100vh - 40px - 40px);
949
+ }
950
+
951
+ .toolbar-main, .mobile-toolbar {
952
+ height: 40px;
953
+ }
954
+
955
+ .status-bar {
956
+ display: none;
957
+ }
958
+
959
+ .floating-action-button {
960
+ width: 40px;
961
+ height: 40px;
962
+ font-size: 18px;
963
+ bottom: 44px;
964
+ }
965
+ }
966
+
967
+ /* ============================================================================
968
+ SAFE AREA & NOTCH HANDLING
969
+ ============================================================================ */
970
+
971
+ @supports (padding: max(0px)) {
972
+ #left-panel {
973
+ padding-left: max(12px, var(--safe-area-left));
974
+ }
975
+
976
+ #right-panel {
977
+ padding-right: max(12px, var(--safe-area-right));
978
+ }
979
+
980
+ .hamburger-menu {
981
+ padding-left: max(0px, var(--safe-area-left));
982
+ }
983
+
984
+ .mobile-toolbar {
985
+ padding-right: max(0px, var(--safe-area-right));
986
+ }
987
+ }
988
+
989
+ /* ============================================================================
990
+ ACCESSIBILITY - REDUCED MOTION
991
+ ============================================================================ */
992
+
993
+ @media (prefers-reduced-motion: reduce) {
994
+ #left-panel, #right-panel, .bottom-sheet {
995
+ transition: none;
996
+ }
997
+
998
+ .floating-action-button, .fab-item {
999
+ transition: none;
1000
+ }
1001
+ }
1002
+
1003
+ /* ============================================================================
1004
+ DARK MODE SUPPORT
1005
+ ============================================================================ */
1006
+
1007
+ @media (prefers-color-scheme: dark) {
1008
+ .modal-backdrop {
1009
+ background: rgba(0, 0, 0, 0.7);
1010
+ }
1011
+
1012
+ .bottom-sheet {
1013
+ background: var(--bg-primary);
1014
+ }
1015
+
1016
+ .context-menu-mobile .menu-item:active {
1017
+ background: var(--bg-secondary);
1018
+ }
1019
+ }
1020
+
1021
+ /* ============================================================================
1022
+ HIGH DPI SCREENS (Retina)
1023
+ ============================================================================ */
1024
+
1025
+ @media (-webkit-min-device-pixel-ratio: 2) {
1026
+ .hamburger-menu span div {
1027
+ height: 1px;
1028
+ }
1029
+
1030
+ .bottom-sheet-handle {
1031
+ height: 3px;
1032
+ }
1033
+ }
1034
+
1035
+ /* ============================================================================
1036
+ UTILITY CLASSES
1037
+ ============================================================================ */
1038
+
1039
+ .hide-on-mobile {
1040
+ display: none;
1041
+ }
1042
+
1043
+ @media (min-width: 900px) {
1044
+ .hide-on-mobile {
1045
+ display: block;
1046
+ }
1047
+
1048
+ .show-on-mobile {
1049
+ display: none;
1050
+ }
1051
+ }
1052
+
1053
+ .touch-active {
1054
+ position: relative;
1055
+ }
1056
+
1057
+ .touch-active:active::after {
1058
+ content: '';
1059
+ position: absolute;
1060
+ top: 50%;
1061
+ left: 50%;
1062
+ width: 40px;
1063
+ height: 40px;
1064
+ background: rgba(255, 255, 255, 0.1);
1065
+ border-radius: 50%;
1066
+ transform: translate(-50%, -50%);
1067
+ pointer-events: none;
1068
+ }
1069
+
1070
+ /* Prevent momentum scrolling lag */
1071
+ .scrollable-panel {
1072
+ -webkit-transform: translateZ(0);
1073
+ transform: translateZ(0);
1074
+ }