@chargebee/chargebee-apps-libs 0.0.2

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 (49) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +270 -0
  3. package/SECURITY.md +8 -0
  4. package/config/README.md +83 -0
  5. package/config/allowed-modules.json +24 -0
  6. package/dist/config/config-loader.d.ts +24 -0
  7. package/dist/config/config-loader.js +95 -0
  8. package/dist/index.d.ts +4 -0
  9. package/dist/index.js +21 -0
  10. package/dist/libs/port-service.d.ts +18 -0
  11. package/dist/libs/port-service.js +27 -0
  12. package/dist/logger/cb-public-logger.d.ts +59 -0
  13. package/dist/logger/cb-public-logger.js +158 -0
  14. package/dist/sandbox/public-sandbox-wrapper.d.ts +41 -0
  15. package/dist/sandbox/public-sandbox-wrapper.js +208 -0
  16. package/package.json +44 -0
  17. package/templates/serverless-node-starter-app/.env +4 -0
  18. package/templates/serverless-node-starter-app/README.md +290 -0
  19. package/templates/serverless-node-starter-app/handler/handler.js +34 -0
  20. package/templates/serverless-node-starter-app/jsconfig.json +35 -0
  21. package/templates/serverless-node-starter-app/manifest.json +15 -0
  22. package/templates/serverless-node-starter-app/test_data/customer_created.json +51 -0
  23. package/templates/serverless-node-starter-app/test_data/invoice_generated.json +112 -0
  24. package/templates/serverless-node-starter-app/test_data/subscription_created.json +173 -0
  25. package/templates/serverless-node-starter-app/types/types.d.ts +45 -0
  26. package/templates/serverless-node-starter-app-with-iparams/.env +4 -0
  27. package/templates/serverless-node-starter-app-with-iparams/README.md +717 -0
  28. package/templates/serverless-node-starter-app-with-iparams/handler/handler.js +39 -0
  29. package/templates/serverless-node-starter-app-with-iparams/iparams.json +41 -0
  30. package/templates/serverless-node-starter-app-with-iparams/iparams.local.json +9 -0
  31. package/templates/serverless-node-starter-app-with-iparams/jsconfig.json +35 -0
  32. package/templates/serverless-node-starter-app-with-iparams/manifest.json +15 -0
  33. package/templates/serverless-node-starter-app-with-iparams/test_data/customer_created.json +51 -0
  34. package/templates/serverless-node-starter-app-with-iparams/test_data/invoice_generated.json +112 -0
  35. package/templates/serverless-node-starter-app-with-iparams/test_data/subscription_created.json +173 -0
  36. package/templates/serverless-node-starter-app-with-iparams/types/types.d.ts +63 -0
  37. package/ui/README.md +118 -0
  38. package/ui/web/assets/css/main.css +1121 -0
  39. package/ui/web/assets/images/Chargebee-logo.png +0 -0
  40. package/ui/web/assets/js/main.js +61 -0
  41. package/ui/web/assets/js/modules/api.js +97 -0
  42. package/ui/web/assets/js/modules/constants.js +33 -0
  43. package/ui/web/assets/js/modules/editors.js +41 -0
  44. package/ui/web/assets/js/modules/events.js +195 -0
  45. package/ui/web/assets/js/modules/form-utils.js +70 -0
  46. package/ui/web/assets/js/modules/iparams-inputs.js +495 -0
  47. package/ui/web/assets/js/modules/iparams.js +82 -0
  48. package/ui/web/assets/js/modules/ui-utils.js +87 -0
  49. package/ui/web/index.html +164 -0
@@ -0,0 +1,1121 @@
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ body {
8
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
9
+ background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
10
+ min-height: 100vh;
11
+ color: #2d3748;
12
+ }
13
+
14
+ .container {
15
+ max-width: 1400px;
16
+ margin: 0 auto;
17
+ padding: 20px;
18
+ overflow-x: hidden;
19
+ }
20
+
21
+ header {
22
+ text-align: left;
23
+ margin-bottom: 30px;
24
+ color: #2d3748;
25
+ display: flex;
26
+ align-items: center;
27
+ gap: 20px;
28
+ padding: 5px 0;
29
+ border-bottom: 2px solid #e2e8f0;
30
+ }
31
+
32
+ .logo-container {
33
+ flex-shrink: 0;
34
+ }
35
+
36
+ .chargebee-logo {
37
+ height: 50px;
38
+ width: auto;
39
+ filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.15));
40
+ transition: all 0.3s ease;
41
+ border-radius: 8px;
42
+ }
43
+
44
+ .chargebee-logo:hover {
45
+ transform: scale(1.05);
46
+ filter: drop-shadow(0 6px 12px rgba(0, 0, 0, 0.2));
47
+ }
48
+
49
+ .header-content {
50
+ flex: 1;
51
+ }
52
+
53
+ .header-content h1 {
54
+ margin-bottom: 5px;
55
+ font-size: 1.8rem;
56
+ font-weight: 600;
57
+ color: #1a202c;
58
+ }
59
+
60
+ .header-content p {
61
+ margin: 0;
62
+ font-size: 0.95rem;
63
+ color: #718096;
64
+ font-weight: 400;
65
+ }
66
+
67
+
68
+
69
+ main {
70
+ display: flex;
71
+ justify-content: center;
72
+ margin-bottom: 20px;
73
+ height: calc(100vh - 180px);
74
+ min-height: 500px;
75
+ }
76
+
77
+ .main-layout {
78
+ display: flex;
79
+ gap: 24px;
80
+ width: 100%;
81
+ max-width: 1600px;
82
+ height: 100%;
83
+ }
84
+
85
+ /* Developer Guide Styles */
86
+ .developer-guide {
87
+ width: 350px;
88
+ background: #fafbfc;
89
+ border-radius: 8px;
90
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.04);
91
+ border: 1px solid #e5e7eb;
92
+ display: flex;
93
+ flex-direction: column;
94
+ overflow: hidden;
95
+ flex-shrink: 0;
96
+ opacity: 0.85;
97
+ }
98
+
99
+ .guide-header {
100
+ display: flex;
101
+ justify-content: space-between;
102
+ align-items: center;
103
+ padding: 20px 24px;
104
+ border-bottom: 1px solid #e5e7eb;
105
+ background: #f1f5f9;
106
+ }
107
+
108
+ .guide-header h3 {
109
+ font-size: 18px;
110
+ font-weight: 600;
111
+ color: #64748b;
112
+ margin: 0;
113
+ }
114
+
115
+ .guide-content {
116
+ flex: 1;
117
+ overflow-y: auto;
118
+ overflow-x: hidden;
119
+ padding: 24px;
120
+ scrollbar-width: thin;
121
+ scrollbar-color: #cbd5e1 transparent;
122
+ word-wrap: break-word;
123
+ word-break: break-word;
124
+ }
125
+
126
+ .guide-content::-webkit-scrollbar {
127
+ width: 6px;
128
+ }
129
+
130
+ .guide-content::-webkit-scrollbar-track {
131
+ background: transparent;
132
+ }
133
+
134
+ .guide-content::-webkit-scrollbar-thumb {
135
+ background: #cbd5e1;
136
+ border-radius: 3px;
137
+ }
138
+
139
+ .guide-content::-webkit-scrollbar-thumb:hover {
140
+ background: #94a3b8;
141
+ }
142
+
143
+ .guide-section {
144
+ margin-bottom: 24px;
145
+ padding: 16px;
146
+ background: #f8fafc;
147
+ border-radius: 6px;
148
+ border: 1px solid #e2e8f0;
149
+ overflow-wrap: break-word;
150
+ word-wrap: break-word;
151
+ word-break: break-word;
152
+ }
153
+
154
+ .guide-section:last-child {
155
+ margin-bottom: 0;
156
+ }
157
+
158
+ .guide-section h4 {
159
+ font-size: 15px;
160
+ font-weight: 600;
161
+ color: #64748b;
162
+ margin-bottom: 12px;
163
+ padding-bottom: 6px;
164
+ border-bottom: 1px solid #e2e8f0;
165
+ }
166
+
167
+ .guide-section p {
168
+ font-size: 14px;
169
+ line-height: 1.7;
170
+ color: #94a3b8;
171
+ margin-bottom: 16px;
172
+ font-weight: 400;
173
+ overflow-wrap: break-word;
174
+ word-wrap: break-word;
175
+ word-break: break-word;
176
+ }
177
+
178
+ .guide-section ul,
179
+ .guide-section ol {
180
+ margin-left: 24px;
181
+ margin-bottom: 16px;
182
+ }
183
+
184
+ .guide-section li {
185
+ font-size: 14px;
186
+ line-height: 1.7;
187
+ color: #94a3b8;
188
+ margin-bottom: 8px;
189
+ font-weight: 400;
190
+ }
191
+
192
+ .guide-section strong {
193
+ color: #64748b;
194
+ font-weight: 600;
195
+ }
196
+
197
+ .guide-section code {
198
+ background: #f1f5f9;
199
+ color: #64748b;
200
+ padding: 2px 6px;
201
+ border-radius: 4px;
202
+ font-size: 13px;
203
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
204
+ font-weight: 500;
205
+ }
206
+
207
+ .guide-section kbd {
208
+ background: #f9fafb;
209
+ border: 1px solid #d1d5db;
210
+ border-radius: 4px;
211
+ padding: 2px 6px;
212
+ font-size: 12px;
213
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
214
+ color: #374151;
215
+ font-weight: 500;
216
+ }
217
+
218
+ .code-example {
219
+ background: #f9fafb;
220
+ border: 1px solid #e5e7eb;
221
+ border-radius: 6px;
222
+ padding: 16px;
223
+ margin-top: 12px;
224
+ }
225
+
226
+ .code-example p {
227
+ margin-bottom: 8px;
228
+ font-weight: 600;
229
+ color: #374151;
230
+ font-size: 13px;
231
+ }
232
+
233
+ .code-example pre {
234
+ background: #f3f4f6;
235
+ color: #374151;
236
+ padding: 12px;
237
+ border-radius: 4px;
238
+ overflow-x: auto;
239
+ white-space: pre-wrap;
240
+ margin-bottom: 16px;
241
+ font-size: 12px;
242
+ line-height: 1.5;
243
+ border: 1px solid #e5e7eb;
244
+ }
245
+
246
+ .code-example pre:last-child {
247
+ margin-bottom: 0;
248
+ }
249
+
250
+ .code-example code {
251
+ background: none;
252
+ color: inherit;
253
+ padding: 0;
254
+ }
255
+
256
+ .control-panel {
257
+ background: white;
258
+ border-radius: 8px;
259
+ padding: 24px;
260
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05), 0 1px 3px rgba(0, 0, 0, 0.1);
261
+ border: 1px solid #e2e8f0;
262
+ display: flex;
263
+ flex-direction: column;
264
+ min-height: 0;
265
+ width: 100%;
266
+ max-width: 600px;
267
+ overflow: visible;
268
+ }
269
+
270
+ /* Tab Navigation Styles */
271
+ .tab-navigation {
272
+ display: flex;
273
+ gap: 8px;
274
+ margin-bottom: 20px;
275
+ border-bottom: 2px solid #e5e7eb;
276
+ padding-bottom: 0;
277
+ }
278
+
279
+ .tab-btn {
280
+ padding: 10px 20px;
281
+ border: none;
282
+ background: transparent;
283
+ color: #6b7280;
284
+ font-size: 14px;
285
+ font-weight: 500;
286
+ cursor: pointer;
287
+ border-bottom: 2px solid transparent;
288
+ margin-bottom: -2px;
289
+ transition: all 0.2s ease;
290
+ }
291
+
292
+ .tab-btn:hover {
293
+ color: #374151;
294
+ background: #f9fafb;
295
+ }
296
+
297
+ .tab-btn.active {
298
+ color: #3b82f6;
299
+ border-bottom-color: #3b82f6;
300
+ background: transparent;
301
+ }
302
+
303
+ .tab-content {
304
+ display: none;
305
+ flex: 1;
306
+ flex-direction: column;
307
+ min-height: 0;
308
+ }
309
+
310
+ .tab-content.active {
311
+ display: flex;
312
+ }
313
+
314
+ /* Iparams tabs - make full height */
315
+ #iparams-tab,
316
+ #iparams-inputs-tab {
317
+ height: 100%;
318
+ }
319
+
320
+ /* Editor Header Styles */
321
+ .editor-header {
322
+ display: flex;
323
+ justify-content: space-between;
324
+ align-items: center;
325
+ margin-bottom: 8px;
326
+ }
327
+
328
+ .editor-header label {
329
+ margin-bottom: 0;
330
+ flex: 1;
331
+ }
332
+
333
+ .editor-header .btn {
334
+ padding: 6px 16px;
335
+ font-size: 13px;
336
+ min-width: auto;
337
+ }
338
+
339
+ .view-toggle {
340
+ display: flex;
341
+ gap: 8px;
342
+ align-items: center;
343
+ }
344
+
345
+ /* Iparams Form View Styles */
346
+ .iparams-form-view {
347
+ flex: 1;
348
+ overflow-y: auto;
349
+ padding: 16px;
350
+ background: #fafbfc;
351
+ border: 1px solid #e5e7eb;
352
+ border-radius: 8px;
353
+ min-height: 200px;
354
+ }
355
+
356
+ .iparam-field {
357
+ margin-bottom: 24px;
358
+ padding-bottom: 20px;
359
+ border-bottom: 1px solid #e5e7eb;
360
+ }
361
+
362
+ .iparam-field:last-child {
363
+ border-bottom: none;
364
+ margin-bottom: 0;
365
+ }
366
+
367
+ .iparam-section {
368
+ margin-bottom: 32px;
369
+ padding: 20px;
370
+ border: 1px solid #e5e7eb;
371
+ border-radius: 8px;
372
+ background: #fafafa;
373
+ }
374
+
375
+ .iparam-section:last-child {
376
+ margin-bottom: 0;
377
+ }
378
+
379
+ .iparam-section-header {
380
+ margin-bottom: 20px;
381
+ padding-bottom: 12px;
382
+ border-bottom: 1px solid #e5e7eb;
383
+ }
384
+
385
+ .iparam-section-title {
386
+ margin: 0 0 6px 0;
387
+ font-size: 16px;
388
+ font-weight: 600;
389
+ color: #111827;
390
+ }
391
+
392
+ .iparam-section-description {
393
+ margin: 0;
394
+ font-size: 14px;
395
+ color: #6b7280;
396
+ }
397
+
398
+ .iparam-field label {
399
+ display: block;
400
+ margin-bottom: 6px;
401
+ font-weight: 500;
402
+ font-size: 14px;
403
+ color: #374151;
404
+ text-transform: none;
405
+ letter-spacing: normal;
406
+ }
407
+
408
+ .iparam-field .required {
409
+ color: #dc2626;
410
+ margin-left: 2px;
411
+ }
412
+
413
+ .iparam-description {
414
+ font-size: 12px;
415
+ color: #6b7280;
416
+ margin-bottom: 10px;
417
+ margin-top: 0;
418
+ }
419
+
420
+ .iparam-input {
421
+ width: 100%;
422
+ padding: 8px 12px;
423
+ border: 1px solid #d1d5db;
424
+ border-radius: 6px;
425
+ font-size: 14px;
426
+ color: #374151;
427
+ background: white;
428
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
429
+ min-height: 38px;
430
+ box-sizing: border-box;
431
+ }
432
+
433
+ /* Style native select elements to match multiselect dropdown */
434
+ .iparam-field select.iparam-input {
435
+ appearance: none;
436
+ -webkit-appearance: none;
437
+ -moz-appearance: none;
438
+ padding-right: 32px;
439
+ cursor: pointer;
440
+ height: 38px;
441
+ background-image: none;
442
+ }
443
+
444
+ /* Shared dropdown container styles */
445
+ .select-dropdown-container,
446
+ .multiselect-dropdown-container {
447
+ position: relative;
448
+ width: 100%;
449
+ }
450
+
451
+ /* Shared base styles for dropdown inputs */
452
+ .select-dropdown-container select.iparam-input,
453
+ .multiselect-dropdown-button.iparam-input {
454
+ width: 100%;
455
+ padding: 8px 12px;
456
+ padding-right: 32px;
457
+ border: 1px solid #d1d5db;
458
+ border-radius: 6px;
459
+ font-size: 14px;
460
+ color: #374151;
461
+ background: white;
462
+ cursor: pointer;
463
+ min-height: 38px;
464
+ height: 38px;
465
+ box-sizing: border-box;
466
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
467
+ }
468
+
469
+ .select-dropdown-container select.iparam-input:focus,
470
+ .multiselect-dropdown-button:focus {
471
+ outline: none;
472
+ border-color: #3b82f6;
473
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
474
+ }
475
+
476
+ .select-dropdown-container select.iparam-input:hover {
477
+ border-color: #9ca3af;
478
+ }
479
+
480
+ .select-dropdown-container select.iparam-input:disabled,
481
+ .multiselect-dropdown-button:disabled,
482
+ .multiselect-dropdown-button.readonly {
483
+ background-color: #f9fafb;
484
+ color: #6b7280;
485
+ cursor: not-allowed;
486
+ }
487
+
488
+ /* Shared arrow styles for all dropdowns */
489
+ .select-dropdown-arrow {
490
+ position: absolute;
491
+ right: 12px;
492
+ top: 50%;
493
+ transform: translateY(-50%);
494
+ width: 0;
495
+ height: 0;
496
+ border-left: 5px solid transparent;
497
+ border-right: 5px solid transparent;
498
+ border-top: 6px solid #6b7280;
499
+ pointer-events: none;
500
+ transition: border-top-color 0.2s ease;
501
+ }
502
+
503
+ /* Focus states */
504
+ .select-dropdown-container select.iparam-input:focus ~ .select-dropdown-arrow,
505
+ .multiselect-dropdown-button:focus .select-dropdown-arrow {
506
+ border-top-color: #3b82f6;
507
+ }
508
+
509
+ /* Hover states */
510
+ .select-dropdown-container select.iparam-input:hover ~ .select-dropdown-arrow,
511
+ .multiselect-dropdown-button:hover .select-dropdown-arrow {
512
+ border-top-color: #9ca3af;
513
+ }
514
+
515
+ /* Disabled/readonly states */
516
+ .select-dropdown-container select.iparam-input:disabled ~ .select-dropdown-arrow,
517
+ .multiselect-dropdown-button.readonly .select-dropdown-arrow {
518
+ border-top-color: #9ca3af;
519
+ opacity: 0.6;
520
+ }
521
+
522
+
523
+ /* Placeholder text color consistency */
524
+ .iparam-input::placeholder {
525
+ color: #9ca3af;
526
+ }
527
+
528
+ .iparam-input::-webkit-input-placeholder {
529
+ color: #9ca3af;
530
+ }
531
+
532
+ .iparam-input::-moz-placeholder {
533
+ color: #9ca3af;
534
+ opacity: 1;
535
+ }
536
+
537
+ .iparam-input:-ms-input-placeholder {
538
+ color: #9ca3af;
539
+ }
540
+
541
+ /* Shared focus state for all inputs */
542
+ .iparam-input:focus,
543
+ .event-dropdown:focus {
544
+ outline: none;
545
+ border-color: #3b82f6;
546
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
547
+ }
548
+
549
+ .iparam-input:disabled {
550
+ background-color: #f9fafb;
551
+ color: #6b7280;
552
+ cursor: not-allowed;
553
+ }
554
+
555
+ .iparam-input[type="checkbox"] {
556
+ width: auto;
557
+ cursor: pointer;
558
+ min-height: auto;
559
+ }
560
+
561
+ .iparam-input[type="checkbox"]:disabled {
562
+ cursor: not-allowed;
563
+ }
564
+
565
+ .iparam-input[multiple] {
566
+ min-height: 100px;
567
+ }
568
+
569
+ /* Multiselect-specific styles */
570
+ .multiselect-dropdown-button.iparam-input {
571
+ display: flex;
572
+ justify-content: space-between;
573
+ align-items: center;
574
+ }
575
+
576
+ .multiselect-dropdown-button.placeholder {
577
+ color: #374151;
578
+ font-style: normal;
579
+ }
580
+
581
+ .multiselect-dropdown-button.readonly.placeholder {
582
+ color: #9ca3af;
583
+ }
584
+
585
+ .multiselect-dropdown-panel {
586
+ position: absolute;
587
+ top: calc(100% + 4px);
588
+ left: 0;
589
+ right: 0;
590
+ background-color: #ffffff;
591
+ border: 1px solid #d1d5db;
592
+ border-radius: 6px;
593
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
594
+ z-index: 1000;
595
+ max-height: 200px;
596
+ overflow-y: auto;
597
+ padding: 8px;
598
+ display: none;
599
+ }
600
+
601
+ .checkbox-option {
602
+ display: flex;
603
+ align-items: center;
604
+ gap: 8px;
605
+ padding: 6px 4px;
606
+ border-radius: 4px;
607
+ }
608
+
609
+ .checkbox-option:hover {
610
+ background-color: #f3f4f6;
611
+ }
612
+
613
+ .checkbox-option label {
614
+ margin: 0;
615
+ font-weight: normal;
616
+ font-size: 14px;
617
+ color: #374151;
618
+ cursor: pointer;
619
+ flex: 1;
620
+ }
621
+
622
+ .checkbox-option input[type="checkbox"] {
623
+ width: 18px;
624
+ height: 18px;
625
+ cursor: pointer;
626
+ margin: 0;
627
+ flex-shrink: 0;
628
+ }
629
+
630
+ .checkbox-option input[type="checkbox"]:disabled {
631
+ cursor: not-allowed;
632
+ opacity: 0.6;
633
+ }
634
+
635
+ .checkbox-option input[type="checkbox"]:disabled + label {
636
+ cursor: not-allowed;
637
+ opacity: 0.6;
638
+ }
639
+
640
+ .form-group {
641
+ margin-bottom: 15px;
642
+ flex-shrink: 0;
643
+ }
644
+
645
+ /* Iparams tabs specific styles - make form-group full size */
646
+ #iparams-tab .form-group,
647
+ #iparams-inputs-tab .form-group {
648
+ display: flex;
649
+ flex-direction: column;
650
+ flex: 1;
651
+ min-height: 0;
652
+ }
653
+
654
+ #iparams-tab .form-group .json-editor,
655
+ #iparams-inputs-tab .form-group .json-editor {
656
+ flex: 1;
657
+ min-height: 200px;
658
+ }
659
+
660
+ /* Readonly editor styling */
661
+ .json-editor.readonly {
662
+ background-color: #f9fafb;
663
+ cursor: default;
664
+ }
665
+
666
+ .ace_read-only {
667
+ background-color: #f9fafb !important;
668
+ }
669
+
670
+ .event-type-section {
671
+ text-align: center;
672
+ margin-bottom: 20px;
673
+ }
674
+
675
+ .json-section {
676
+ flex: 1;
677
+ display: flex;
678
+ flex-direction: column;
679
+ min-height: 0;
680
+ max-height: calc(100% - 140px);
681
+ position: relative;
682
+ }
683
+
684
+ .json-section::before {
685
+ content: '';
686
+ position: absolute;
687
+ top: -1px;
688
+ left: -1px;
689
+ right: -1px;
690
+ bottom: -1px;
691
+ background: linear-gradient(135deg, #3b82f6, #8b5cf6);
692
+ border-radius: 9px;
693
+ z-index: -1;
694
+ opacity: 0;
695
+ transition: opacity 0.2s ease;
696
+ }
697
+
698
+ .json-section:focus-within::before {
699
+ opacity: 1;
700
+ }
701
+
702
+ label {
703
+ display: block;
704
+ margin-bottom: 8px;
705
+ font-weight: 400;
706
+ font-size: 0.95rem;
707
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
708
+ color: #6b7280;
709
+ text-transform: uppercase;
710
+ letter-spacing: 0.5px;
711
+ }
712
+
713
+ /* Event dropdown uses the same container pattern as other dropdowns */
714
+ .event-type-section .select-dropdown-container {
715
+ width: 300px;
716
+ margin: 0 auto;
717
+ }
718
+
719
+ .event-dropdown {
720
+ appearance: none;
721
+ -webkit-appearance: none;
722
+ -moz-appearance: none;
723
+ }
724
+
725
+ .json-editor {
726
+ width: 100%;
727
+ min-height: 200px;
728
+ max-height: 100%;
729
+ border: 1px solid #e5e7eb;
730
+ border-radius: 8px;
731
+ flex: 1;
732
+ background: #ffffff;
733
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
734
+ position: relative;
735
+ overflow: hidden;
736
+ }
737
+
738
+ .json-editor.ace-focused {
739
+ border-color: #3b82f6;
740
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.05), 0 0 0 3px rgba(59, 130, 246, 0.1);
741
+ }
742
+
743
+ .button-group {
744
+ display: flex;
745
+ gap: 12px;
746
+ flex-wrap: wrap;
747
+ flex-shrink: 0;
748
+ justify-content: center;
749
+ margin-top: 15px;
750
+ position: relative;
751
+ z-index: 10;
752
+ min-height: 44px;
753
+ align-items: center;
754
+ }
755
+
756
+ .btn {
757
+ padding: 10px 20px;
758
+ border: 1px solid #d1d5db;
759
+ border-radius: 6px;
760
+ font-size: 14px;
761
+ font-weight: 500;
762
+ cursor: pointer;
763
+ transition: all 0.2s ease;
764
+ background: white;
765
+ color: #374151;
766
+ min-width: 100px;
767
+ flex-shrink: 0;
768
+ white-space: nowrap;
769
+ }
770
+
771
+ /* Shared styles for primary and success buttons */
772
+ .btn-primary,
773
+ .btn-success {
774
+ background: #000000;
775
+ color: white;
776
+ border-color: #000000;
777
+ }
778
+
779
+ .btn-primary:hover,
780
+ .btn-success:hover {
781
+ background: #1a1a1a;
782
+ border-color: #1a1a1a;
783
+ }
784
+
785
+ .btn-secondary {
786
+ background: white;
787
+ color: #374151;
788
+ border-color: #d1d5db;
789
+ }
790
+
791
+ .btn-secondary:hover {
792
+ background: #f9fafb;
793
+ border-color: #9ca3af;
794
+ }
795
+
796
+ .btn:disabled {
797
+ opacity: 0.5;
798
+ cursor: not-allowed;
799
+ background: #f3f4f6;
800
+ border-color: #d1d5db;
801
+ color: #9ca3af;
802
+ }
803
+
804
+ /* Status Message Block Styles */
805
+ .status-block {
806
+ width: 350px;
807
+ background: #ffffff;
808
+ border: 1px solid #e5e7eb;
809
+ border-radius: 8px;
810
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
811
+ display: flex;
812
+ flex-direction: column;
813
+ overflow: hidden;
814
+ flex-shrink: 0;
815
+ align-self: flex-start;
816
+ }
817
+
818
+ .status-header {
819
+ display: flex;
820
+ justify-content: space-between;
821
+ align-items: center;
822
+ padding: 12px 16px;
823
+ border-bottom: 1px solid #e5e7eb;
824
+ background: #f8fafc;
825
+ }
826
+
827
+ .status-header h3 {
828
+ font-size: 14px;
829
+ font-weight: 600;
830
+ color: #374151;
831
+ margin: 0;
832
+ }
833
+
834
+ .status-content {
835
+ padding: 12px 16px;
836
+ position: relative;
837
+ min-height: auto;
838
+ }
839
+
840
+ .status-content::before {
841
+ content: '';
842
+ position: absolute;
843
+ top: 0;
844
+ left: 0;
845
+ width: 4px;
846
+ height: 100%;
847
+ background: #3b82f6;
848
+ }
849
+
850
+ .status-content span {
851
+ display: block;
852
+ font-size: 13px;
853
+ line-height: 1.4;
854
+ color: #374151;
855
+ word-wrap: break-word;
856
+ }
857
+
858
+ .placeholder {
859
+ color: #999;
860
+ font-style: italic;
861
+ text-align: center;
862
+ padding: 40px 20px;
863
+ }
864
+
865
+
866
+
867
+ .loading {
868
+ text-align: center;
869
+ color: #667eea;
870
+ font-style: italic;
871
+ }
872
+
873
+ footer {
874
+ text-align: center;
875
+ color: #6b7280;
876
+ font-size: 0.875rem;
877
+ font-weight: 400;
878
+ }
879
+
880
+ /* Ace Editor customizations */
881
+ .ace_editor {
882
+ border-radius: 8px;
883
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
884
+ }
885
+
886
+ /* Responsive design */
887
+ @media (max-width: 1200px) {
888
+ .main-layout {
889
+ max-width: 100%;
890
+ gap: 16px;
891
+ }
892
+
893
+ .developer-guide {
894
+ width: 300px;
895
+ }
896
+
897
+ .status-block {
898
+ width: 300px;
899
+ }
900
+
901
+ .button-group {
902
+ gap: 8px;
903
+ }
904
+
905
+ .btn {
906
+ min-width: 80px;
907
+ padding: 8px 16px;
908
+ font-size: 13px;
909
+ }
910
+ }
911
+
912
+ @media (max-width: 1000px) {
913
+ .main-layout {
914
+ flex-direction: column;
915
+ gap: 16px;
916
+ }
917
+
918
+ .developer-guide {
919
+ width: 100%;
920
+ order: 2;
921
+ }
922
+
923
+ .control-panel {
924
+ order: 1;
925
+ min-height: 400px;
926
+ max-height: 500px;
927
+ }
928
+
929
+ .json-section {
930
+ max-height: calc(100% - 120px);
931
+ }
932
+
933
+ .json-editor {
934
+ min-height: 150px;
935
+ }
936
+
937
+ .button-group {
938
+ gap: 8px;
939
+ margin-top: 12px;
940
+ }
941
+
942
+ .btn {
943
+ min-width: 80px;
944
+ padding: 8px 16px;
945
+ font-size: 13px;
946
+ }
947
+
948
+ .status-block {
949
+ width: 100%;
950
+ order: 3;
951
+ margin-top: 16px;
952
+ }
953
+ }
954
+
955
+ @media (max-width: 768px) {
956
+ main {
957
+ min-height: auto;
958
+ }
959
+
960
+ .container {
961
+ padding: 15px;
962
+ }
963
+
964
+ header h1 {
965
+ font-size: 2rem;
966
+ }
967
+
968
+ .main-layout {
969
+ flex-direction: column;
970
+ gap: 16px;
971
+ }
972
+
973
+ .developer-guide {
974
+ width: 100%;
975
+ order: 2;
976
+ }
977
+
978
+ .control-panel {
979
+ order: 1;
980
+ min-height: 400px;
981
+ }
982
+
983
+ .button-group {
984
+ flex-direction: column;
985
+ }
986
+
987
+ .btn {
988
+ width: 100%;
989
+ }
990
+
991
+ .event-dropdown {
992
+ width: 100%;
993
+ max-width: 300px;
994
+ }
995
+
996
+ .status-block {
997
+ width: 100%;
998
+ order: 3;
999
+ margin-top: 16px;
1000
+ }
1001
+
1002
+ .status-header {
1003
+ padding: 10px 16px;
1004
+ }
1005
+
1006
+ .status-header h3 {
1007
+ font-size: 13px;
1008
+ }
1009
+
1010
+ .status-content {
1011
+ padding: 10px 16px;
1012
+ }
1013
+
1014
+ .status-content span {
1015
+ font-size: 12px;
1016
+ line-height: 1.3;
1017
+ }
1018
+ }
1019
+
1020
+ /* Animation for loading states */
1021
+ @keyframes pulse {
1022
+ 0% { opacity: 1; }
1023
+ 50% { opacity: 0.5; }
1024
+ 100% { opacity: 1; }
1025
+ }
1026
+
1027
+ .loading {
1028
+ animation: pulse 1.5s infinite;
1029
+ }
1030
+
1031
+ /* Modal Styles */
1032
+ .modal {
1033
+ display: none;
1034
+ position: fixed;
1035
+ z-index: 1000;
1036
+ left: 0;
1037
+ top: 0;
1038
+ width: 100%;
1039
+ height: 100%;
1040
+ overflow: auto;
1041
+ background-color: rgba(0, 0, 0, 0.5);
1042
+ }
1043
+
1044
+ .modal-content {
1045
+ background-color: #ffffff;
1046
+ margin: 10% auto;
1047
+ padding: 0;
1048
+ border: 1px solid #e5e7eb;
1049
+ border-radius: 8px;
1050
+ width: 90%;
1051
+ max-width: 500px;
1052
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
1053
+ }
1054
+
1055
+ .modal-header {
1056
+ display: flex;
1057
+ justify-content: space-between;
1058
+ align-items: center;
1059
+ padding: 20px 24px;
1060
+ border-bottom: 1px solid #e5e7eb;
1061
+ background: #f8fafc;
1062
+ border-radius: 8px 8px 0 0;
1063
+ }
1064
+
1065
+ .modal-header h3 {
1066
+ margin: 0;
1067
+ font-size: 18px;
1068
+ font-weight: 600;
1069
+ color: #1a202c;
1070
+ }
1071
+
1072
+ .modal-close {
1073
+ background: none;
1074
+ border: none;
1075
+ font-size: 28px;
1076
+ font-weight: 300;
1077
+ color: #6b7280;
1078
+ cursor: pointer;
1079
+ padding: 0;
1080
+ width: 30px;
1081
+ height: 30px;
1082
+ display: flex;
1083
+ align-items: center;
1084
+ justify-content: center;
1085
+ line-height: 1;
1086
+ }
1087
+
1088
+ .modal-close:hover {
1089
+ color: #374151;
1090
+ }
1091
+
1092
+ .modal-body {
1093
+ padding: 24px;
1094
+ }
1095
+
1096
+ .modal-body p {
1097
+ margin-bottom: 16px;
1098
+ color: #374151;
1099
+ line-height: 1.6;
1100
+ }
1101
+
1102
+ .modal-body ul {
1103
+ margin: 16px 0;
1104
+ padding-left: 24px;
1105
+ color: #dc2626;
1106
+ }
1107
+
1108
+ .modal-body li {
1109
+ margin-bottom: 8px;
1110
+ font-weight: 500;
1111
+ }
1112
+
1113
+ .modal-footer {
1114
+ display: flex;
1115
+ justify-content: flex-end;
1116
+ gap: 12px;
1117
+ padding: 20px 24px;
1118
+ border-top: 1px solid #e5e7eb;
1119
+ background: #f8fafc;
1120
+ border-radius: 0 0 8px 8px;
1121
+ }