cmssy-cli 0.6.0 → 0.9.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 (45) hide show
  1. package/README.md +382 -36
  2. package/dist/cli.js +29 -10
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/create.d.ts.map +1 -1
  5. package/dist/commands/create.js +10 -0
  6. package/dist/commands/create.js.map +1 -1
  7. package/dist/commands/dev.d.ts.map +1 -1
  8. package/dist/commands/dev.js +251 -12
  9. package/dist/commands/dev.js.map +1 -1
  10. package/dist/commands/init.d.ts.map +1 -1
  11. package/dist/commands/init.js +32 -22
  12. package/dist/commands/init.js.map +1 -1
  13. package/dist/commands/package.d.ts +7 -0
  14. package/dist/commands/package.d.ts.map +1 -0
  15. package/dist/commands/package.js +161 -0
  16. package/dist/commands/package.js.map +1 -0
  17. package/dist/commands/publish.d.ts +12 -0
  18. package/dist/commands/publish.d.ts.map +1 -0
  19. package/dist/commands/publish.js +395 -0
  20. package/dist/commands/publish.js.map +1 -0
  21. package/dist/commands/push.d.ts +9 -0
  22. package/dist/commands/push.d.ts.map +1 -0
  23. package/dist/commands/push.js +199 -0
  24. package/dist/commands/push.js.map +1 -0
  25. package/dist/commands/upload.d.ts +7 -0
  26. package/dist/commands/upload.d.ts.map +1 -0
  27. package/dist/commands/upload.js +126 -0
  28. package/dist/commands/upload.js.map +1 -0
  29. package/dist/dev-ui/app.js +657 -0
  30. package/dist/dev-ui/index.html +837 -0
  31. package/dist/utils/block-config.d.ts.map +1 -1
  32. package/dist/utils/block-config.js +49 -3
  33. package/dist/utils/block-config.js.map +1 -1
  34. package/dist/utils/cmssy-config.d.ts +0 -3
  35. package/dist/utils/cmssy-config.d.ts.map +1 -1
  36. package/dist/utils/cmssy-config.js.map +1 -1
  37. package/dist/utils/config.d.ts +1 -0
  38. package/dist/utils/config.d.ts.map +1 -1
  39. package/dist/utils/config.js +1 -0
  40. package/dist/utils/config.js.map +1 -1
  41. package/dist/utils/graphql.d.ts +1 -0
  42. package/dist/utils/graphql.d.ts.map +1 -1
  43. package/dist/utils/graphql.js +28 -0
  44. package/dist/utils/graphql.js.map +1 -1
  45. package/package.json +8 -3
@@ -0,0 +1,837 @@
1
+ <!DOCTYPE html>
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>
716
+ </div>
717
+ </div>
718
+ </div>
719
+
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>
725
+ </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>
731
+ </div>
732
+ </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>
737
+ </div>
738
+ </div>
739
+ </div>
740
+
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
750
+ </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
+
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>
784
+ </div>
785
+ </div>
786
+
787
+ <!-- Workspace ID (conditional) -->
788
+ <div class="form-group" id="workspace-id-group" style="display: none;">
789
+ <label class="form-label" for="publish-workspace-id">Workspace ID</label>
790
+ <input type="text" class="input-field" id="publish-workspace-id" placeholder="ws_abc123">
791
+ </div>
792
+
793
+ <!-- Version Bump -->
794
+ <div class="form-group">
795
+ <label class="form-label" for="publish-version-bump">Version Bump (Optional)</label>
796
+ <select class="select-field" id="publish-version-bump">
797
+ <option value="">No change</option>
798
+ <option value="patch">Patch (1.0.0 → 1.0.1)</option>
799
+ <option value="minor">Minor (1.0.0 → 1.1.0)</option>
800
+ <option value="major">Major (1.0.0 → 2.0.0)</option>
801
+ </select>
802
+ </div>
803
+ </div>
804
+
805
+ <div class="modal-footer">
806
+ <button class="btn btn-secondary" onclick="closePublishModal()">Cancel</button>
807
+ <button class="btn btn-primary" onclick="startPublish()">Publish</button>
808
+ </div>
809
+ </div>
810
+
811
+ <!-- Publish Progress -->
812
+ <div id="publish-progress" style="display: none;">
813
+ <div class="publish-progress-container">
814
+ <div class="progress-bar-container">
815
+ <div class="progress-bar-bg">
816
+ <div class="progress-bar-fill" id="publish-progress-bar" style="width: 0%"></div>
817
+ </div>
818
+ <div class="progress-text" id="publish-progress-text">0%</div>
819
+ </div>
820
+
821
+ <div class="progress-steps" id="publish-steps">
822
+ <!-- Steps will be dynamically added here -->
823
+ </div>
824
+
825
+ <div style="text-align: center; margin-top: 24px;">
826
+ <button class="btn btn-primary" onclick="closePublishModal()" id="publish-close-btn" style="display: none;">
827
+ Done
828
+ </button>
829
+ </div>
830
+ </div>
831
+ </div>
832
+ </div>
833
+ </div>
834
+
835
+ <script src="/dev-ui/app.js"></script>
836
+ </body>
837
+ </html>