cmssy-cli 0.12.2 → 0.13.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.
@@ -1,842 +1,1106 @@
1
1
  <!DOCTYPE html>
2
2
  <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Cmssy Dev Server</title>
7
- <style>
8
- * {
9
- margin: 0;
10
- padding: 0;
11
- box-sizing: border-box;
12
- }
13
-
14
- body {
15
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
16
- background: #f5f5f5;
17
- overflow: hidden;
18
- height: 100vh;
19
- }
20
-
21
- .container {
22
- display: grid;
23
- grid-template-columns: 280px 1fr 400px;
24
- height: 100vh;
25
- gap: 0;
26
- }
27
-
28
- /* Left Panel - Blocks List */
29
- .blocks-panel {
30
- background: #ffffff;
31
- border-right: 1px solid #e0e0e0;
32
- overflow-y: auto;
33
- }
34
-
35
- .blocks-header {
36
- padding: 20px;
37
- border-bottom: 1px solid #e0e0e0;
38
- background: #fafafa;
39
- }
40
-
41
- .blocks-header h1 {
42
- font-size: 18px;
43
- font-weight: 600;
44
- color: #1a1a1a;
45
- margin-bottom: 4px;
46
- }
47
-
48
- .blocks-header p {
49
- font-size: 13px;
50
- color: #666;
51
- }
52
-
53
- .blocks-list {
54
- padding: 12px;
55
- }
56
-
57
- .block-item {
58
- padding: 12px 16px;
59
- margin-bottom: 4px;
60
- border-radius: 8px;
61
- cursor: pointer;
62
- transition: all 0.2s;
63
- border: 1px solid transparent;
64
- }
65
-
66
- .block-item:hover {
67
- background: #f5f5f5;
68
- }
69
-
70
- .block-item.active {
71
- background: #667eea;
72
- color: white;
73
- border-color: #667eea;
74
- }
75
-
76
- .block-item-name {
77
- font-size: 14px;
78
- font-weight: 500;
79
- margin-bottom: 2px;
80
- }
81
-
82
- .block-item-type {
83
- font-size: 12px;
84
- opacity: 0.7;
85
- }
86
-
87
- .block-item-header {
88
- display: flex;
89
- justify-content: space-between;
90
- align-items: center;
91
- margin-bottom: 4px;
92
- }
93
-
94
- .block-item-footer {
95
- display: flex;
96
- justify-content: space-between;
97
- align-items: center;
98
- gap: 8px;
99
- }
100
-
101
- .version-badge {
102
- font-size: 11px;
103
- padding: 2px 6px;
104
- background: #e3f2fd;
105
- color: #1976d2;
106
- border-radius: 4px;
107
- font-weight: 500;
108
- }
109
-
110
- .status-badge {
111
- font-size: 11px;
112
- padding: 2px 8px;
113
- border-radius: 10px;
114
- font-weight: 500;
115
- }
116
-
117
- .status-badge.status-local {
118
- background: #fff3e0;
119
- color: #e65100;
120
- }
121
-
122
- .status-badge.status-published {
123
- background: #e8f5e9;
124
- color: #2e7d32;
125
- }
126
-
127
- /* Center Panel - Preview */
128
- .preview-panel {
129
- background: #fafafa;
130
- display: flex;
131
- flex-direction: column;
132
- overflow: hidden;
133
- }
134
-
135
- .preview-header {
136
- padding: 16px 24px;
137
- background: white;
138
- border-bottom: 1px solid #e0e0e0;
139
- display: flex;
140
- justify-content: space-between;
141
- align-items: center;
142
- }
143
-
144
- .preview-info {
145
- display: flex;
146
- align-items: center;
147
- gap: 12px;
148
- }
149
-
150
- .preview-title {
151
- font-size: 16px;
152
- font-weight: 600;
153
- color: #1a1a1a;
154
- }
155
-
156
- .preview-actions {
157
- display: flex;
158
- gap: 8px;
159
- align-items: center;
160
- }
161
-
162
- .btn-publish {
163
- padding: 8px 16px;
164
- background: #667eea;
165
- color: white;
166
- border: none;
167
- border-radius: 6px;
168
- font-size: 14px;
169
- font-weight: 500;
170
- cursor: pointer;
171
- transition: background 0.2s;
172
- }
173
-
174
- .btn-publish:hover {
175
- background: #5568d3;
176
- }
177
-
178
- .preview-badge {
179
- font-size: 12px;
180
- padding: 4px 12px;
181
- background: #e8f5e9;
182
- color: #2e7d32;
183
- border-radius: 12px;
184
- font-weight: 500;
185
- }
186
-
187
- .preview-content {
188
- flex: 1;
189
- padding: 24px;
190
- overflow: auto;
191
- display: flex;
192
- align-items: center;
193
- justify-content: center;
194
- }
195
-
196
- .preview-iframe-wrapper {
197
- width: 100%;
198
- height: 100%;
199
- background: white;
200
- border-radius: 12px;
201
- box-shadow: 0 2px 8px rgba(0,0,0,0.1);
202
- overflow: hidden;
203
- }
204
-
205
- .preview-iframe {
206
- width: 100%;
207
- height: 100%;
208
- border: none;
209
- }
210
-
211
- .preview-empty {
212
- text-align: center;
213
- color: #999;
214
- padding: 60px 20px;
215
- }
216
-
217
- .preview-empty-icon {
218
- font-size: 48px;
219
- margin-bottom: 16px;
220
- opacity: 0.3;
221
- }
222
-
223
- /* Right Panel - Editor Drawer */
224
- .editor-panel {
225
- background: #ffffff;
226
- border-left: 1px solid #e0e0e0;
227
- display: flex;
228
- flex-direction: column;
229
- overflow: hidden;
230
- }
231
-
232
- .editor-header {
233
- padding: 20px;
234
- border-bottom: 1px solid #e0e0e0;
235
- background: #fafafa;
236
- }
237
-
238
- .editor-header h2 {
239
- font-size: 16px;
240
- font-weight: 600;
241
- color: #1a1a1a;
242
- margin-bottom: 4px;
243
- }
244
-
245
- .editor-header p {
246
- font-size: 13px;
247
- color: #666;
248
- }
249
-
250
- .editor-content {
251
- flex: 1;
252
- overflow-y: auto;
253
- padding: 20px;
254
- }
255
-
256
- .editor-empty {
257
- text-align: center;
258
- color: #999;
259
- padding: 40px 20px;
260
- }
261
-
262
- /* Form Fields */
263
- .field-group {
264
- margin-bottom: 24px;
265
- }
266
-
267
- .field-label {
268
- display: block;
269
- font-size: 13px;
270
- font-weight: 500;
271
- color: #333;
272
- margin-bottom: 8px;
273
- }
274
-
275
- .field-required {
276
- color: #e53935;
277
- margin-left: 2px;
278
- }
279
-
280
- .field-help {
281
- font-size: 12px;
282
- color: #666;
283
- margin-top: 4px;
284
- font-weight: 400;
285
- }
286
-
287
- .field-input {
288
- width: 100%;
289
- padding: 10px 12px;
290
- border: 1px solid #ddd;
291
- border-radius: 6px;
292
- font-size: 14px;
293
- font-family: inherit;
294
- transition: all 0.2s;
295
- }
296
-
297
- .field-input:focus {
298
- outline: none;
299
- border-color: #667eea;
300
- box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
301
- }
302
-
303
- .field-textarea {
304
- min-height: 80px;
305
- resize: vertical;
306
- }
307
-
308
- .field-select {
309
- cursor: pointer;
310
- }
311
-
312
- .field-checkbox {
313
- width: auto;
314
- margin-right: 8px;
315
- }
316
-
317
- /* Repeater Fields */
318
- .repeater-items {
319
- border: 1px solid #e0e0e0;
320
- border-radius: 8px;
321
- padding: 12px;
322
- background: #fafafa;
323
- }
324
-
325
- .repeater-item {
326
- background: white;
327
- border: 1px solid #e0e0e0;
328
- border-radius: 6px;
329
- padding: 16px;
330
- margin-bottom: 12px;
331
- }
332
-
333
- .repeater-item:last-child {
334
- margin-bottom: 0;
335
- }
336
-
337
- .repeater-item-header {
338
- display: flex;
339
- justify-content: space-between;
340
- align-items: center;
341
- margin-bottom: 12px;
342
- padding-bottom: 12px;
343
- border-bottom: 1px solid #f0f0f0;
344
- }
345
-
346
- .repeater-item-title {
347
- font-size: 13px;
348
- font-weight: 500;
349
- color: #666;
350
- }
351
-
352
- .repeater-item-remove {
353
- background: #ffebee;
354
- color: #c62828;
355
- border: none;
356
- padding: 4px 12px;
357
- border-radius: 4px;
358
- font-size: 12px;
359
- cursor: pointer;
360
- font-weight: 500;
361
- transition: all 0.2s;
362
- }
363
-
364
- .repeater-item-remove:hover {
365
- background: #ffcdd2;
366
- }
367
-
368
- .repeater-add {
369
- width: 100%;
370
- padding: 10px;
371
- background: white;
372
- border: 1px dashed #667eea;
373
- color: #667eea;
374
- border-radius: 6px;
375
- font-size: 13px;
376
- font-weight: 500;
377
- cursor: pointer;
378
- transition: all 0.2s;
379
- margin-top: 8px;
380
- }
381
-
382
- .repeater-add:hover {
383
- background: #f5f7ff;
384
- border-style: solid;
385
- }
386
-
387
- /* Loading State */
388
- .loading {
389
- display: flex;
390
- align-items: center;
391
- justify-content: center;
392
- padding: 40px;
393
- color: #999;
394
- }
395
-
396
- .spinner {
397
- width: 20px;
398
- height: 20px;
399
- border: 2px solid #f3f3f3;
400
- border-top: 2px solid #667eea;
401
- border-radius: 50%;
402
- animation: spin 1s linear infinite;
403
- margin-right: 12px;
404
- }
405
-
406
- @keyframes spin {
407
- 0% { transform: rotate(0deg); }
408
- 100% { transform: rotate(360deg); }
409
- }
410
-
411
- /* Media Field */
412
- .media-field {
413
- display: flex;
414
- gap: 12px;
415
- align-items: flex-start;
416
- }
417
-
418
- .media-preview {
419
- width: 80px;
420
- height: 80px;
421
- border: 1px solid #ddd;
422
- border-radius: 6px;
423
- overflow: hidden;
424
- background: #fafafa;
425
- display: flex;
426
- align-items: center;
427
- justify-content: center;
428
- }
429
-
430
- .media-preview img {
431
- width: 100%;
432
- height: 100%;
433
- object-fit: cover;
434
- }
435
-
436
- .media-placeholder {
437
- color: #999;
438
- font-size: 12px;
439
- }
440
-
441
- .media-input-group {
442
- flex: 1;
443
- }
444
-
445
- /* Color Field */
446
- .color-field {
447
- display: flex;
448
- gap: 12px;
449
- align-items: center;
450
- }
451
-
452
- .color-preview {
453
- width: 40px;
454
- height: 40px;
455
- border: 1px solid #ddd;
456
- border-radius: 6px;
457
- cursor: pointer;
458
- }
459
-
460
- .color-input {
461
- flex: 1;
462
- }
463
- /* Publish Modal */
464
- .modal {
465
- position: fixed;
466
- top: 0;
467
- left: 0;
468
- right: 0;
469
- bottom: 0;
470
- background: rgba(0, 0, 0, 0.5);
471
- display: none;
472
- align-items: center;
473
- justify-content: center;
474
- z-index: 9999;
475
- }
476
-
477
- .modal.active {
478
- display: flex;
479
- }
480
-
481
- .modal-content {
482
- background: white;
483
- border-radius: 12px;
484
- width: 90%;
485
- max-width: 500px;
486
- max-height: 80vh;
487
- overflow: auto;
488
- }
489
-
490
- .modal-header {
491
- padding: 20px 24px;
492
- border-bottom: 1px solid #e0e0e0;
493
- }
494
-
495
- .modal-header h3 {
496
- font-size: 20px;
497
- font-weight: 600;
498
- margin: 0 0 4px 0;
499
- }
500
-
501
- .modal-header p {
502
- font-size: 14px;
503
- color: #666;
504
- margin: 0;
505
- }
506
-
507
- .modal-body {
508
- padding: 24px;
509
- }
510
-
511
- .form-group {
512
- margin-bottom: 20px;
513
- }
514
-
515
- .form-label {
516
- display: block;
517
- font-size: 14px;
518
- font-weight: 500;
519
- margin-bottom: 8px;
520
- color: #333;
521
- }
522
-
523
- .radio-group {
524
- display: flex;
525
- flex-direction: column;
526
- gap: 12px;
527
- }
528
-
529
- .radio-option {
530
- display: flex;
531
- align-items: flex-start;
532
- padding: 12px;
533
- border: 2px solid #e0e0e0;
534
- border-radius: 8px;
535
- cursor: pointer;
536
- transition: all 0.2s;
537
- }
538
-
539
- .radio-option:hover {
540
- border-color: #667eea;
541
- background: #f5f7ff;
542
- }
543
-
544
- .radio-option input[type="radio"] {
545
- margin-right: 12px;
546
- margin-top: 2px;
547
- }
548
-
549
- .radio-option-content {
550
- flex: 1;
551
- }
552
-
553
- .radio-option-title {
554
- font-weight: 500;
555
- margin-bottom: 2px;
556
- }
557
-
558
- .radio-option-desc {
559
- font-size: 13px;
560
- color: #666;
561
- }
562
-
563
- .input-field {
564
- width: 100%;
565
- padding: 10px 12px;
566
- border: 1px solid #e0e0e0;
567
- border-radius: 6px;
568
- font-size: 14px;
569
- font-family: inherit;
570
- }
571
-
572
- .input-field:focus {
573
- outline: none;
574
- border-color: #667eea;
575
- }
576
-
577
- .select-field {
578
- width: 100%;
579
- padding: 10px 12px;
580
- border: 1px solid #e0e0e0;
581
- border-radius: 6px;
582
- font-size: 14px;
583
- font-family: inherit;
584
- background: white;
585
- }
586
-
587
- .modal-footer {
588
- padding: 16px 24px;
589
- border-top: 1px solid #e0e0e0;
590
- display: flex;
591
- justify-content: flex-end;
592
- gap: 12px;
593
- }
594
-
595
- .btn {
596
- padding: 10px 20px;
597
- border: none;
598
- border-radius: 6px;
599
- font-size: 14px;
600
- font-weight: 500;
601
- cursor: pointer;
602
- transition: all 0.2s;
603
- }
604
-
605
- .btn-secondary {
606
- background: #f5f5f5;
607
- color: #333;
608
- }
609
-
610
- .btn-secondary:hover {
611
- background: #e0e0e0;
612
- }
613
-
614
- .btn-primary {
615
- background: #667eea;
616
- color: white;
617
- }
618
-
619
- .btn-primary:hover {
620
- background: #5568d3;
621
- }
622
-
623
- /* Publish Progress */
624
- .publish-progress-container {
625
- padding: 24px;
626
- }
627
-
628
- .progress-bar-container {
629
- margin-bottom: 24px;
630
- }
631
-
632
- .progress-bar-bg {
633
- height: 8px;
634
- background: #e0e0e0;
635
- border-radius: 4px;
636
- overflow: hidden;
637
- margin-bottom: 8px;
638
- }
639
-
640
- .progress-bar-fill {
641
- height: 100%;
642
- background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
643
- transition: width 0.3s;
644
- border-radius: 4px;
645
- }
646
-
647
- .progress-text {
648
- font-size: 13px;
649
- color: #666;
650
- text-align: center;
651
- }
652
-
653
- .progress-steps {
654
- display: flex;
655
- flex-direction: column;
656
- gap: 12px;
657
- }
658
-
659
- .progress-step {
660
- display: flex;
661
- align-items: center;
662
- gap: 12px;
663
- padding: 12px;
664
- background: #f5f5f5;
665
- border-radius: 8px;
666
- }
667
-
668
- .progress-step.completed {
669
- background: #e8f5e9;
670
- }
671
-
672
- .progress-step.failed {
673
- background: #ffebee;
674
- }
675
-
676
- .step-icon {
677
- font-size: 18px;
678
- }
679
-
680
- .step-message {
681
- flex: 1;
682
- font-size: 14px;
683
- }
684
-
685
- .publish-error {
686
- text-align: center;
687
- padding: 40px 24px;
688
- }
689
-
690
- .error-icon {
691
- font-size: 48px;
692
- margin-bottom: 16px;
693
- color: #d32f2f;
694
- }
695
-
696
- .error-message {
697
- font-size: 14px;
698
- color: #666;
699
- margin-bottom: 24px;
700
- }
701
-
702
- </style>
703
- </head>
704
- <body>
705
- <div class="container">
706
- <!-- Left Panel: Blocks List -->
707
- <div class="blocks-panel">
708
- <div class="blocks-header">
709
- <h1>📦 Blocks</h1>
710
- <p id="blocks-count">Loading...</p>
711
- </div>
712
- <div class="blocks-list" id="blocks-list">
713
- <div class="loading">
714
- <div class="spinner"></div>
715
- <span>Loading blocks...</span>
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Cmssy Dev Server</title>
7
+ <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Crect width='100' height='100' rx='20' fill='%23667eea'/%3E%3Ctext x='50' y='70' font-size='60' font-weight='bold' text-anchor='middle' fill='white' font-family='system-ui'%3EC%3C/text%3E%3C/svg%3E">
8
+ <style>
9
+ /* CSS Reset - scoped to dev UI only, not blocks in iframe */
10
+ *,
11
+ *::before,
12
+ *::after {
13
+ box-sizing: border-box;
14
+ }
15
+
16
+ html,
17
+ body {
18
+ height: 100%;
19
+ margin: 0;
20
+ padding: 0;
21
+ }
22
+
23
+ body {
24
+ line-height: 1.5;
25
+ -webkit-font-smoothing: antialiased;
26
+ }
27
+
28
+ img,
29
+ picture,
30
+ video,
31
+ canvas,
32
+ svg {
33
+ display: block;
34
+ max-width: 100%;
35
+ }
36
+
37
+ input,
38
+ button,
39
+ textarea,
40
+ select {
41
+ font: inherit;
42
+ }
43
+
44
+ p,
45
+ h1,
46
+ h2,
47
+ h3,
48
+ h4,
49
+ h5,
50
+ h6 {
51
+ overflow-wrap: break-word;
52
+ }
53
+
54
+ /* App Styles */
55
+ body {
56
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
57
+ sans-serif;
58
+ background: #f5f5f5;
59
+ overflow: hidden;
60
+ height: 100vh;
61
+ }
62
+
63
+ .container {
64
+ display: grid;
65
+ grid-template-columns: 280px 1fr 400px;
66
+ height: 100vh;
67
+ gap: 0;
68
+ transition: grid-template-columns 0.3s cubic-bezier(0.4, 0, 0.2, 1);
69
+ }
70
+
71
+ /* Collapsed sidebar states - narrow bar instead of hidden */
72
+ .container.left-collapsed {
73
+ grid-template-columns: 48px 1fr 400px;
74
+ }
75
+
76
+ .container.right-collapsed {
77
+ grid-template-columns: 280px 1fr 48px;
78
+ }
79
+
80
+ .container.left-collapsed.right-collapsed {
81
+ grid-template-columns: 48px 1fr 48px;
82
+ }
83
+
84
+ /* Left Panel - Blocks List */
85
+ .blocks-panel {
86
+ background: #ffffff;
87
+ border-right: 1px solid #e0e0e0;
88
+ overflow-y: auto;
89
+ display: flex;
90
+ flex-direction: column;
91
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
92
+ }
93
+
94
+ /* When collapsed, hide overflow */
95
+ .container.left-collapsed .blocks-panel {
96
+ overflow: hidden;
97
+ }
98
+
99
+ .blocks-header {
100
+ padding: 16px;
101
+ border-bottom: 1px solid #e0e0e0;
102
+ background: #fafafa;
103
+ display: flex;
104
+ align-items: center;
105
+ justify-content: space-between;
106
+ min-height: 60px;
107
+ flex-shrink: 0;
108
+ }
109
+
110
+ .blocks-header-content {
111
+ flex: 1;
112
+ min-width: 0;
113
+ transition: opacity 0.2s ease;
114
+ }
115
+
116
+ .blocks-header h1 {
117
+ font-size: 18px;
118
+ font-weight: 600;
119
+ color: #1a1a1a;
120
+ margin-bottom: 4px;
121
+ white-space: nowrap;
122
+ overflow: hidden;
123
+ text-overflow: ellipsis;
124
+ }
125
+
126
+ .blocks-header p {
127
+ font-size: 13px;
128
+ color: #666;
129
+ white-space: nowrap;
130
+ overflow: hidden;
131
+ text-overflow: ellipsis;
132
+ }
133
+
134
+ /* Hamburger toggle button */
135
+ .panel-toggle {
136
+ width: 32px;
137
+ height: 32px;
138
+ border: none;
139
+ background: transparent;
140
+ cursor: pointer;
141
+ display: flex;
142
+ align-items: center;
143
+ justify-content: center;
144
+ border-radius: 6px;
145
+ transition: all 0.2s ease;
146
+ flex-shrink: 0;
147
+ }
148
+
149
+ .panel-toggle:hover {
150
+ background: #e0e0e0;
151
+ }
152
+
153
+ .panel-toggle-icon {
154
+ width: 20px;
155
+ height: 20px;
156
+ position: relative;
157
+ display: flex;
158
+ flex-direction: column;
159
+ justify-content: center;
160
+ gap: 4px;
161
+ }
162
+
163
+ .panel-toggle-icon span {
164
+ display: block;
165
+ height: 2px;
166
+ background: #333;
167
+ border-radius: 2px;
168
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
169
+ }
170
+
171
+ /* Collapsed state - smooth transitions */
172
+ .container.left-collapsed .blocks-header-content,
173
+ .container.right-collapsed .editor-header-content {
174
+ opacity: 0;
175
+ pointer-events: none;
176
+ width: 0;
177
+ overflow: hidden;
178
+ transition: opacity 0.2s ease, width 0.3s ease;
179
+ }
180
+
181
+ .container.left-collapsed .blocks-list,
182
+ .container.right-collapsed .editor-content {
183
+ opacity: 0;
184
+ pointer-events: none;
185
+ transition: opacity 0.2s ease;
186
+ }
187
+
188
+ .container.left-collapsed .blocks-panel {
189
+ overflow: hidden;
190
+ }
191
+
192
+ .container.right-collapsed .editor-panel {
193
+ overflow: hidden;
194
+ }
195
+
196
+ .container.left-collapsed .blocks-header,
197
+ .container.right-collapsed .editor-header {
198
+ justify-content: center;
199
+ padding: 16px 12px;
200
+ transition: all 0.3s ease;
201
+ }
202
+
203
+ /* Rotate hamburger icon when collapsed */
204
+ .container.left-collapsed .blocks-panel .panel-toggle-icon,
205
+ .container.right-collapsed .editor-panel .panel-toggle-icon {
206
+ transform: rotate(180deg);
207
+ }
208
+
209
+ .blocks-list {
210
+ padding: 12px;
211
+ }
212
+
213
+ .block-item {
214
+ padding: 12px 16px;
215
+ margin-bottom: 4px;
216
+ border-radius: 8px;
217
+ cursor: pointer;
218
+ transition: all 0.2s;
219
+ border: 1px solid transparent;
220
+ }
221
+
222
+ .block-item:hover {
223
+ background: #f5f5f5;
224
+ }
225
+
226
+ .block-item.active {
227
+ background: #667eea;
228
+ color: white;
229
+ border-color: #667eea;
230
+ }
231
+
232
+ .block-item-name {
233
+ font-size: 14px;
234
+ font-weight: 500;
235
+ margin-bottom: 2px;
236
+ }
237
+
238
+ .block-item-type {
239
+ font-size: 12px;
240
+ opacity: 0.7;
241
+ }
242
+
243
+ .block-item-header {
244
+ display: flex;
245
+ justify-content: space-between;
246
+ align-items: center;
247
+ margin-bottom: 4px;
248
+ }
249
+
250
+ .block-item-footer {
251
+ display: flex;
252
+ justify-content: space-between;
253
+ align-items: center;
254
+ gap: 8px;
255
+ }
256
+
257
+ .version-badge {
258
+ font-size: 11px;
259
+ padding: 2px 6px;
260
+ background: #e3f2fd;
261
+ color: #1976d2;
262
+ border-radius: 4px;
263
+ font-weight: 500;
264
+ }
265
+
266
+ .status-badge {
267
+ font-size: 11px;
268
+ padding: 2px 8px;
269
+ border-radius: 10px;
270
+ font-weight: 500;
271
+ }
272
+
273
+ .status-badge.status-local {
274
+ background: #fff3e0;
275
+ color: #e65100;
276
+ }
277
+
278
+ .status-badge.status-published {
279
+ background: #e8f5e9;
280
+ color: #2e7d32;
281
+ }
282
+
283
+ /* Center Panel - Preview */
284
+ .preview-panel {
285
+ background: #fafafa;
286
+ display: flex;
287
+ flex-direction: column;
288
+ overflow: hidden;
289
+ }
290
+
291
+ .preview-header {
292
+ padding: 16px 24px;
293
+ background: white;
294
+ border-bottom: 1px solid #e0e0e0;
295
+ display: flex;
296
+ justify-content: space-between;
297
+ align-items: center;
298
+ }
299
+
300
+ .preview-info {
301
+ display: flex;
302
+ align-items: center;
303
+ gap: 12px;
304
+ }
305
+
306
+ .preview-title {
307
+ font-size: 16px;
308
+ font-weight: 600;
309
+ color: #1a1a1a;
310
+ }
311
+
312
+ .preview-actions {
313
+ display: flex;
314
+ gap: 8px;
315
+ align-items: center;
316
+ }
317
+
318
+ .btn-publish {
319
+ padding: 8px 16px;
320
+ background: #667eea;
321
+ color: white;
322
+ border: none;
323
+ border-radius: 6px;
324
+ font-size: 14px;
325
+ font-weight: 500;
326
+ cursor: pointer;
327
+ transition: background 0.2s;
328
+ }
329
+
330
+ .btn-publish:hover {
331
+ background: #5568d3;
332
+ }
333
+
334
+ .preview-badge {
335
+ font-size: 12px;
336
+ padding: 4px 12px;
337
+ background: #e8f5e9;
338
+ color: #2e7d32;
339
+ border-radius: 12px;
340
+ font-weight: 500;
341
+ }
342
+
343
+ .preview-content {
344
+ flex: 1;
345
+ padding: 24px;
346
+ overflow: auto;
347
+ display: flex;
348
+ align-items: center;
349
+ justify-content: center;
350
+ }
351
+
352
+ .preview-iframe-wrapper {
353
+ width: 100%;
354
+ height: 100%;
355
+ background: white;
356
+ border-radius: 12px;
357
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
358
+ overflow: hidden;
359
+ }
360
+
361
+ .preview-iframe {
362
+ width: 100%;
363
+ height: 100%;
364
+ border: none;
365
+ }
366
+
367
+ .preview-empty {
368
+ text-align: center;
369
+ color: #999;
370
+ padding: 60px 20px;
371
+ }
372
+
373
+ .preview-empty-icon {
374
+ font-size: 48px;
375
+ margin-bottom: 16px;
376
+ opacity: 0.3;
377
+ }
378
+
379
+ /* Right Panel - Editor Drawer */
380
+ .editor-panel {
381
+ background: #ffffff;
382
+ border-left: 1px solid #e0e0e0;
383
+ display: flex;
384
+ flex-direction: column;
385
+ overflow: hidden;
386
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
387
+ }
388
+
389
+ .editor-header {
390
+ padding: 16px;
391
+ border-bottom: 1px solid #e0e0e0;
392
+ background: #fafafa;
393
+ display: flex;
394
+ align-items: center;
395
+ justify-content: space-between;
396
+ min-height: 60px;
397
+ flex-shrink: 0;
398
+ }
399
+
400
+ .editor-header-content {
401
+ flex: 1;
402
+ min-width: 0;
403
+ transition: opacity 0.2s ease;
404
+ }
405
+
406
+ .editor-header h2 {
407
+ font-size: 16px;
408
+ font-weight: 600;
409
+ color: #1a1a1a;
410
+ margin-bottom: 4px;
411
+ white-space: nowrap;
412
+ overflow: hidden;
413
+ text-overflow: ellipsis;
414
+ }
415
+
416
+ .editor-header p {
417
+ font-size: 13px;
418
+ color: #666;
419
+ white-space: nowrap;
420
+ overflow: hidden;
421
+ text-overflow: ellipsis;
422
+ }
423
+
424
+ .editor-content {
425
+ flex: 1;
426
+ overflow-y: auto;
427
+ padding: 20px;
428
+ }
429
+
430
+ .editor-empty {
431
+ text-align: center;
432
+ color: #999;
433
+ padding: 40px 20px;
434
+ }
435
+
436
+ /* Form Fields */
437
+ .field-group {
438
+ margin-bottom: 24px;
439
+ }
440
+
441
+ .field-label {
442
+ display: block;
443
+ font-size: 13px;
444
+ font-weight: 500;
445
+ color: #333;
446
+ margin-bottom: 8px;
447
+ }
448
+
449
+ .field-required {
450
+ color: #e53935;
451
+ margin-left: 2px;
452
+ }
453
+
454
+ .field-help {
455
+ font-size: 12px;
456
+ color: #666;
457
+ margin-top: 4px;
458
+ font-weight: 400;
459
+ }
460
+
461
+ .field-input {
462
+ width: 100%;
463
+ padding: 10px 12px;
464
+ border: 1px solid #ddd;
465
+ border-radius: 6px;
466
+ font-size: 14px;
467
+ font-family: inherit;
468
+ transition: all 0.2s;
469
+ }
470
+
471
+ .field-input:focus {
472
+ outline: none;
473
+ border-color: #667eea;
474
+ box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
475
+ }
476
+
477
+ .field-textarea {
478
+ min-height: 80px;
479
+ resize: vertical;
480
+ }
481
+
482
+ .field-select {
483
+ cursor: pointer;
484
+ }
485
+
486
+ .field-checkbox {
487
+ width: auto;
488
+ margin-right: 8px;
489
+ }
490
+
491
+ /* Repeater Fields */
492
+ .repeater-items {
493
+ border: 1px solid #e0e0e0;
494
+ border-radius: 8px;
495
+ padding: 12px;
496
+ background: #fafafa;
497
+ }
498
+
499
+ .repeater-item {
500
+ background: white;
501
+ border: 1px solid #e0e0e0;
502
+ border-radius: 6px;
503
+ padding: 16px;
504
+ margin-bottom: 12px;
505
+ }
506
+
507
+ .repeater-item:last-child {
508
+ margin-bottom: 0;
509
+ }
510
+
511
+ .repeater-item-header {
512
+ display: flex;
513
+ justify-content: space-between;
514
+ align-items: center;
515
+ margin-bottom: 12px;
516
+ padding-bottom: 12px;
517
+ border-bottom: 1px solid #f0f0f0;
518
+ }
519
+
520
+ .repeater-item-title {
521
+ font-size: 13px;
522
+ font-weight: 500;
523
+ color: #666;
524
+ }
525
+
526
+ .repeater-item-remove {
527
+ background: #ffebee;
528
+ color: #c62828;
529
+ border: none;
530
+ padding: 4px 12px;
531
+ border-radius: 4px;
532
+ font-size: 12px;
533
+ cursor: pointer;
534
+ font-weight: 500;
535
+ transition: all 0.2s;
536
+ }
537
+
538
+ .repeater-item-remove:hover {
539
+ background: #ffcdd2;
540
+ }
541
+
542
+ .repeater-add {
543
+ width: 100%;
544
+ padding: 10px;
545
+ background: white;
546
+ border: 1px dashed #667eea;
547
+ color: #667eea;
548
+ border-radius: 6px;
549
+ font-size: 13px;
550
+ font-weight: 500;
551
+ cursor: pointer;
552
+ transition: all 0.2s;
553
+ margin-top: 8px;
554
+ }
555
+
556
+ .repeater-add:hover {
557
+ background: #f5f7ff;
558
+ border-style: solid;
559
+ }
560
+
561
+ /* Loading State */
562
+ .loading {
563
+ display: flex;
564
+ align-items: center;
565
+ justify-content: center;
566
+ padding: 40px;
567
+ color: #999;
568
+ }
569
+
570
+ .spinner {
571
+ width: 20px;
572
+ height: 20px;
573
+ border: 2px solid #f3f3f3;
574
+ border-top: 2px solid #667eea;
575
+ border-radius: 50%;
576
+ animation: spin 1s linear infinite;
577
+ margin-right: 12px;
578
+ }
579
+
580
+ @keyframes spin {
581
+ 0% {
582
+ transform: rotate(0deg);
583
+ }
584
+ 100% {
585
+ transform: rotate(360deg);
586
+ }
587
+ }
588
+
589
+ /* Media Field */
590
+ .media-field {
591
+ display: flex;
592
+ gap: 12px;
593
+ align-items: flex-start;
594
+ }
595
+
596
+ .media-preview {
597
+ width: 80px;
598
+ height: 80px;
599
+ border: 1px solid #ddd;
600
+ border-radius: 6px;
601
+ overflow: hidden;
602
+ background: #fafafa;
603
+ display: flex;
604
+ align-items: center;
605
+ justify-content: center;
606
+ }
607
+
608
+ .media-preview img {
609
+ width: 100%;
610
+ height: 100%;
611
+ object-fit: cover;
612
+ }
613
+
614
+ .media-placeholder {
615
+ color: #999;
616
+ font-size: 12px;
617
+ }
618
+
619
+ .media-input-group {
620
+ flex: 1;
621
+ }
622
+
623
+ /* Color Field */
624
+ .color-field {
625
+ display: flex;
626
+ gap: 12px;
627
+ align-items: center;
628
+ }
629
+
630
+ .color-preview {
631
+ width: 40px;
632
+ height: 40px;
633
+ border: 1px solid #ddd;
634
+ border-radius: 6px;
635
+ cursor: pointer;
636
+ }
637
+
638
+ .color-input {
639
+ flex: 1;
640
+ }
641
+ /* Publish Modal */
642
+ .modal {
643
+ position: fixed;
644
+ top: 0;
645
+ left: 0;
646
+ right: 0;
647
+ bottom: 0;
648
+ background: rgba(0, 0, 0, 0.5);
649
+ display: none;
650
+ align-items: center;
651
+ justify-content: center;
652
+ z-index: 9999;
653
+ }
654
+
655
+ .modal.active {
656
+ display: flex;
657
+ }
658
+
659
+ .modal-content {
660
+ background: white;
661
+ border-radius: 12px;
662
+ width: 90%;
663
+ max-width: 500px;
664
+ max-height: 80vh;
665
+ overflow: auto;
666
+ }
667
+
668
+ .modal-header {
669
+ padding: 20px 24px;
670
+ border-bottom: 1px solid #e0e0e0;
671
+ }
672
+
673
+ .modal-header h3 {
674
+ font-size: 20px;
675
+ font-weight: 600;
676
+ margin: 0 0 4px 0;
677
+ }
678
+
679
+ .modal-header p {
680
+ font-size: 14px;
681
+ color: #666;
682
+ margin: 0;
683
+ }
684
+
685
+ .modal-body {
686
+ padding: 24px;
687
+ }
688
+
689
+ .form-group {
690
+ margin-bottom: 20px;
691
+ }
692
+
693
+ .form-label {
694
+ display: block;
695
+ font-size: 14px;
696
+ font-weight: 500;
697
+ margin-bottom: 8px;
698
+ color: #333;
699
+ }
700
+
701
+ .radio-group {
702
+ display: flex;
703
+ flex-direction: column;
704
+ gap: 12px;
705
+ }
706
+
707
+ .radio-option {
708
+ display: flex;
709
+ align-items: flex-start;
710
+ padding: 12px;
711
+ border: 2px solid #e0e0e0;
712
+ border-radius: 8px;
713
+ cursor: pointer;
714
+ transition: all 0.2s;
715
+ }
716
+
717
+ .radio-option:hover {
718
+ border-color: #667eea;
719
+ background: #f5f7ff;
720
+ }
721
+
722
+ .radio-option input[type="radio"] {
723
+ margin-right: 12px;
724
+ margin-top: 2px;
725
+ }
726
+
727
+ .radio-option-content {
728
+ flex: 1;
729
+ }
730
+
731
+ .radio-option-title {
732
+ font-weight: 500;
733
+ margin-bottom: 2px;
734
+ }
735
+
736
+ .radio-option-desc {
737
+ font-size: 13px;
738
+ color: #666;
739
+ }
740
+
741
+ .input-field {
742
+ width: 100%;
743
+ padding: 10px 12px;
744
+ border: 1px solid #e0e0e0;
745
+ border-radius: 6px;
746
+ font-size: 14px;
747
+ font-family: inherit;
748
+ }
749
+
750
+ .input-field:focus {
751
+ outline: none;
752
+ border-color: #667eea;
753
+ }
754
+
755
+ .select-field {
756
+ width: 100%;
757
+ padding: 10px 12px;
758
+ border: 1px solid #e0e0e0;
759
+ border-radius: 6px;
760
+ font-size: 14px;
761
+ font-family: inherit;
762
+ background: white;
763
+ }
764
+
765
+ .modal-footer {
766
+ padding: 16px 24px;
767
+ border-top: 1px solid #e0e0e0;
768
+ display: flex;
769
+ justify-content: flex-end;
770
+ gap: 12px;
771
+ }
772
+
773
+ .btn {
774
+ padding: 10px 20px;
775
+ border: none;
776
+ border-radius: 6px;
777
+ font-size: 14px;
778
+ font-weight: 500;
779
+ cursor: pointer;
780
+ transition: all 0.2s;
781
+ }
782
+
783
+ .btn-secondary {
784
+ background: #f5f5f5;
785
+ color: #333;
786
+ }
787
+
788
+ .btn-secondary:hover {
789
+ background: #e0e0e0;
790
+ }
791
+
792
+ .btn-primary {
793
+ background: #667eea;
794
+ color: white;
795
+ }
796
+
797
+ .btn-primary:hover {
798
+ background: #5568d3;
799
+ }
800
+
801
+ /* Publish Progress */
802
+ .publish-progress-container {
803
+ padding: 24px;
804
+ }
805
+
806
+ .progress-bar-container {
807
+ margin-bottom: 24px;
808
+ }
809
+
810
+ .progress-bar-bg {
811
+ height: 8px;
812
+ background: #e0e0e0;
813
+ border-radius: 4px;
814
+ overflow: hidden;
815
+ margin-bottom: 8px;
816
+ }
817
+
818
+ .progress-bar-fill {
819
+ height: 100%;
820
+ background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
821
+ transition: width 0.3s;
822
+ border-radius: 4px;
823
+ }
824
+
825
+ .progress-text {
826
+ font-size: 13px;
827
+ color: #666;
828
+ text-align: center;
829
+ }
830
+
831
+ .progress-steps {
832
+ display: flex;
833
+ flex-direction: column;
834
+ gap: 12px;
835
+ }
836
+
837
+ .progress-step {
838
+ display: flex;
839
+ align-items: center;
840
+ gap: 12px;
841
+ padding: 12px;
842
+ background: #f5f5f5;
843
+ border-radius: 8px;
844
+ }
845
+
846
+ .progress-step.completed {
847
+ background: #e8f5e9;
848
+ }
849
+
850
+ .progress-step.failed {
851
+ background: #ffebee;
852
+ }
853
+
854
+ .step-icon {
855
+ font-size: 18px;
856
+ }
857
+
858
+ .step-message {
859
+ flex: 1;
860
+ font-size: 14px;
861
+ }
862
+
863
+ .publish-error {
864
+ text-align: center;
865
+ padding: 40px 24px;
866
+ }
867
+
868
+ .error-icon {
869
+ font-size: 48px;
870
+ margin-bottom: 16px;
871
+ color: #d32f2f;
872
+ }
873
+
874
+ .error-message {
875
+ font-size: 14px;
876
+ color: #666;
877
+ margin-bottom: 24px;
878
+ }
879
+
880
+ /* Smooth transitions for lists */
881
+ .blocks-list,
882
+ .editor-content {
883
+ transition: opacity 0.2s ease;
884
+ }
885
+ </style>
886
+ </head>
887
+ <body>
888
+ <div class="container" id="container">
889
+ <!-- Left Panel: Blocks List -->
890
+ <div class="blocks-panel">
891
+ <div class="blocks-header">
892
+ <div class="blocks-header-content">
893
+ <h1>📦 Blocks</h1>
894
+ <p id="blocks-count">Loading...</p>
895
+ </div>
896
+ <button
897
+ class="panel-toggle"
898
+ id="toggle-left"
899
+ onclick="toggleLeftPanel()"
900
+ title="Collapse panel (Ctrl+B)"
901
+ aria-label="Toggle blocks panel"
902
+ >
903
+ <div class="panel-toggle-icon">
904
+ <span></span>
905
+ <span></span>
906
+ <span></span>
907
+ </div>
908
+ </button>
909
+ </div>
910
+ <div class="blocks-list" id="blocks-list">
911
+ <div class="loading">
912
+ <div class="spinner"></div>
913
+ <span>Loading blocks...</span>
914
+ </div>
716
915
  </div>
717
916
  </div>
718
- </div>
719
917
 
720
- <!-- Center Panel: Preview -->
721
- <div class="preview-panel">
722
- <div class="preview-header">
723
- <div class="preview-info">
724
- <div class="preview-title" id="preview-title">Preview</div>
918
+ <!-- Center Panel: Preview -->
919
+ <div class="preview-panel">
920
+ <div class="preview-header">
921
+ <div class="preview-info">
922
+ <div class="preview-title" id="preview-title">Preview</div>
923
+ </div>
924
+ <div class="preview-actions">
925
+ <div class="preview-badge" id="preview-status">Ready</div>
926
+ <button
927
+ class="btn-publish"
928
+ onclick="openPublishModal()"
929
+ style="display: none"
930
+ id="publish-btn"
931
+ >
932
+ 📦 Publish
933
+ </button>
934
+ </div>
725
935
  </div>
726
- <div class="preview-actions">
727
- <div class="preview-badge" id="preview-status">Ready</div>
728
- <button class="btn-publish" onclick="openPublishModal()" style="display: none;" id="publish-btn">
729
- 📦 Publish
730
- </button>
936
+ <div class="preview-content" id="preview-content">
937
+ <div class="preview-empty">
938
+ <div class="preview-empty-icon">👈</div>
939
+ <p>Select a block to preview</p>
940
+ </div>
731
941
  </div>
732
942
  </div>
733
- <div class="preview-content" id="preview-content">
734
- <div class="preview-empty">
735
- <div class="preview-empty-icon">👈</div>
736
- <p>Select a block to preview</p>
943
+
944
+ <!-- Right Panel: Editor -->
945
+ <div class="editor-panel">
946
+ <div class="editor-header">
947
+ <button
948
+ class="panel-toggle"
949
+ id="toggle-right"
950
+ onclick="toggleRightPanel()"
951
+ title="Collapse panel (Ctrl+E)"
952
+ aria-label="Toggle properties panel"
953
+ >
954
+ <div class="panel-toggle-icon">
955
+ <span></span>
956
+ <span></span>
957
+ <span></span>
958
+ </div>
959
+ </button>
960
+ <div class="editor-header-content">
961
+ <h2>⚙️ Properties</h2>
962
+ <p id="editor-subtitle">No block selected</p>
963
+ </div>
964
+ </div>
965
+ <div class="editor-content" id="editor-content">
966
+ <div class="editor-empty">Select a block to edit its properties</div>
737
967
  </div>
738
968
  </div>
739
969
  </div>
740
970
 
741
- <!-- Right Panel: Editor -->
742
- <div class="editor-panel">
743
- <div class="editor-header">
744
- <h2>⚙️ Properties</h2>
745
- <p id="editor-subtitle">No block selected</p>
746
- </div>
747
- <div class="editor-content" id="editor-content">
748
- <div class="editor-empty">
749
- Select a block to edit its properties
971
+ <!-- Publish Modal -->
972
+ <div class="modal" id="publish-modal">
973
+ <div class="modal-content">
974
+ <div class="modal-header">
975
+ <h3>Publish <span id="publish-block-name"></span></h3>
976
+ <p>Current version: <span id="publish-version"></span></p>
750
977
  </div>
751
- </div>
752
- </div>
753
- </div>
754
-
755
- <!-- Publish Modal -->
756
- <div class="modal" id="publish-modal">
757
- <div class="modal-content">
758
- <div class="modal-header">
759
- <h3>Publish <span id="publish-block-name"></span></h3>
760
- <p>Current version: <span id="publish-version"></span></p>
761
- </div>
762
978
 
763
- <!-- Publish Form -->
764
- <div id="publish-form">
765
- <div class="modal-body">
766
- <!-- Target Selection -->
767
- <div class="form-group">
768
- <label class="form-label">Publish Target</label>
769
- <div class="radio-group">
770
- <label class="radio-option">
771
- <input type="radio" name="publish-target" value="marketplace" id="publish-target-marketplace" onchange="toggleWorkspaceInput()" checked>
772
- <div class="radio-option-content">
773
- <div class="radio-option-title">📋 Marketplace (Public)</div>
774
- <div class="radio-option-desc">Submit for review, available to everyone after approval</div>
775
- </div>
776
- </label>
777
- <label class="radio-option">
778
- <input type="radio" name="publish-target" value="workspace" id="publish-target-workspace" onchange="toggleWorkspaceInput()">
779
- <div class="radio-option-content">
780
- <div class="radio-option-title">🏢 Workspace (Private)</div>
781
- <div class="radio-option-desc">Publish instantly to your workspace, no review needed</div>
782
- </div>
783
- </label>
979
+ <!-- Publish Form -->
980
+ <div id="publish-form">
981
+ <div class="modal-body">
982
+ <!-- Target Selection -->
983
+ <div class="form-group">
984
+ <label class="form-label">Publish Target</label>
985
+ <div class="radio-group">
986
+ <label class="radio-option">
987
+ <input
988
+ type="radio"
989
+ name="publish-target"
990
+ value="marketplace"
991
+ id="publish-target-marketplace"
992
+ onchange="toggleWorkspaceInput()"
993
+ checked
994
+ />
995
+ <div class="radio-option-content">
996
+ <div class="radio-option-title">
997
+ 📋 Marketplace (Public)
998
+ </div>
999
+ <div class="radio-option-desc">
1000
+ Submit for review, available to everyone after approval
1001
+ </div>
1002
+ </div>
1003
+ </label>
1004
+ <label class="radio-option">
1005
+ <input
1006
+ type="radio"
1007
+ name="publish-target"
1008
+ value="workspace"
1009
+ id="publish-target-workspace"
1010
+ onchange="toggleWorkspaceInput()"
1011
+ />
1012
+ <div class="radio-option-content">
1013
+ <div class="radio-option-title">🏢 Workspace (Private)</div>
1014
+ <div class="radio-option-desc">
1015
+ Publish instantly to your workspace, no review needed
1016
+ </div>
1017
+ </div>
1018
+ </label>
1019
+ </div>
784
1020
  </div>
785
- </div>
786
1021
 
787
- <!-- Workspace Select (conditional) -->
788
- <div class="form-group" id="workspace-id-group" style="display: none;">
789
- <label class="form-label" for="publish-workspace-id">Select Workspace</label>
790
- <select class="select-field" id="publish-workspace-id">
791
- <option value="">Loading workspaces...</option>
792
- </select>
793
- <div id="workspace-error" style="display: none; color: #e53e3e; font-size: 12px; margin-top: 4px;">
794
- Failed to load workspaces. Check your API token configuration.
1022
+ <!-- Workspace Select (conditional) -->
1023
+ <div
1024
+ class="form-group"
1025
+ id="workspace-id-group"
1026
+ style="display: none"
1027
+ >
1028
+ <label class="form-label" for="publish-workspace-id"
1029
+ >Select Workspace</label
1030
+ >
1031
+ <select class="select-field" id="publish-workspace-id">
1032
+ <option value="">Loading workspaces...</option>
1033
+ </select>
1034
+ <div
1035
+ id="workspace-error"
1036
+ style="
1037
+ display: none;
1038
+ color: #e53e3e;
1039
+ font-size: 12px;
1040
+ margin-top: 4px;
1041
+ "
1042
+ >
1043
+ Failed to load workspaces. Check your API token configuration.
1044
+ </div>
795
1045
  </div>
796
- </div>
797
1046
 
798
- <!-- Version Bump -->
799
- <div class="form-group">
800
- <label class="form-label" for="publish-version-bump">Version Bump (Optional)</label>
801
- <select class="select-field" id="publish-version-bump">
802
- <option value="">No change</option>
803
- <option value="patch">Patch (1.0.0 → 1.0.1)</option>
804
- <option value="minor">Minor (1.0.0 → 1.1.0)</option>
805
- <option value="major">Major (1.0.0 → 2.0.0)</option>
806
- </select>
1047
+ <!-- Version Bump -->
1048
+ <div class="form-group">
1049
+ <label class="form-label" for="publish-version-bump"
1050
+ >Version Bump (Optional)</label
1051
+ >
1052
+ <select class="select-field" id="publish-version-bump">
1053
+ <option value="">No change</option>
1054
+ <option value="patch">Patch (1.0.0 → 1.0.1)</option>
1055
+ <option value="minor">Minor (1.0.0 → 1.1.0)</option>
1056
+ <option value="major">Major (1.0.0 → 2.0.0)</option>
1057
+ </select>
1058
+ </div>
807
1059
  </div>
808
- </div>
809
1060
 
810
- <div class="modal-footer">
811
- <button class="btn btn-secondary" onclick="closePublishModal()">Cancel</button>
812
- <button class="btn btn-primary" onclick="startPublish()">Publish</button>
1061
+ <div class="modal-footer">
1062
+ <button class="btn btn-secondary" onclick="closePublishModal()">
1063
+ Cancel
1064
+ </button>
1065
+ <button class="btn btn-primary" onclick="startPublish()">
1066
+ Publish
1067
+ </button>
1068
+ </div>
813
1069
  </div>
814
- </div>
815
1070
 
816
- <!-- Publish Progress -->
817
- <div id="publish-progress" style="display: none;">
818
- <div class="publish-progress-container">
819
- <div class="progress-bar-container">
820
- <div class="progress-bar-bg">
821
- <div class="progress-bar-fill" id="publish-progress-bar" style="width: 0%"></div>
1071
+ <!-- Publish Progress -->
1072
+ <div id="publish-progress" style="display: none">
1073
+ <div class="publish-progress-container">
1074
+ <div class="progress-bar-container">
1075
+ <div class="progress-bar-bg">
1076
+ <div
1077
+ class="progress-bar-fill"
1078
+ id="publish-progress-bar"
1079
+ style="width: 0%"
1080
+ ></div>
1081
+ </div>
1082
+ <div class="progress-text" id="publish-progress-text">0%</div>
822
1083
  </div>
823
- <div class="progress-text" id="publish-progress-text">0%</div>
824
- </div>
825
1084
 
826
- <div class="progress-steps" id="publish-steps">
827
- <!-- Steps will be dynamically added here -->
828
- </div>
1085
+ <div class="progress-steps" id="publish-steps">
1086
+ <!-- Steps will be dynamically added here -->
1087
+ </div>
829
1088
 
830
- <div style="text-align: center; margin-top: 24px;">
831
- <button class="btn btn-primary" onclick="closePublishModal()" id="publish-close-btn" style="display: none;">
832
- Done
833
- </button>
1089
+ <div style="text-align: center; margin-top: 24px">
1090
+ <button
1091
+ class="btn btn-primary"
1092
+ onclick="closePublishModal()"
1093
+ id="publish-close-btn"
1094
+ style="display: none"
1095
+ >
1096
+ Done
1097
+ </button>
1098
+ </div>
834
1099
  </div>
835
1100
  </div>
836
1101
  </div>
837
1102
  </div>
838
- </div>
839
1103
 
840
- <script src="/dev-ui/app.js"></script>
841
- </body>
1104
+ <script src="/dev-ui/app.js"></script>
1105
+ </body>
842
1106
  </html>