RobinsAIWorld commited on
Commit
2da0329
·
verified ·
1 Parent(s): 25efd4b

🐳 10/02 - 13:42 - 1. There's still a problem awt the top with the mess of .btn {transition.....2. I pasted a small json in the irght and it still doens't show up (right side typing should show up in

Browse files
Files changed (2) hide show
  1. index.html +176 -203
  2. style.css +263 -68
index.html CHANGED
@@ -20,207 +20,7 @@
20
  }
21
  }
22
  </script>
23
-
24
- .btn {
25
- transition: all 0.2s ease;
26
- }
27
- .btn:hover {
28
- transform: translateY(-2px);
29
- }
30
- .indent-line {
31
- position: absolute;
32
- left: 0;
33
- top: 0;
34
- bottom: 0;
35
- width: 2px;
36
- }
37
- .toolbar-btn {
38
- transition: all 0.2s;
39
- }
40
- .toolbar-btn:hover {
41
- background-color: #475569;
42
- }
43
- .toolbar-btn.active {
44
- background-color: #60a5fa;
45
- color: white;
46
- }
47
- .notification {
48
- transform: translateX(100%);
49
- transition: transform 0.3s ease;
50
- }
51
- .notification.show {
52
- transform: translateX(0);
53
- }
54
- .error-highlight {
55
- background-color: rgba(239, 68, 68, 0.1);
56
- border-left: 3px solid #ef4444;
57
- }
58
- .menu-bar {
59
- background-color: #334155;
60
- padding: 8px 16px;
61
- border-radius: 8px;
62
- margin-bottom: 16px;
63
- box-shadow: 0 2px 4px rgba(0,0,0,0.2);
64
- }
65
- .menu-item {
66
- color: #cbd5e1;
67
- padding: 8px 12px;
68
- border-radius: 4px;
69
- cursor: pointer;
70
- transition: all 0.2s;
71
- margin-right: 4px;
72
- }
73
- .menu-item:hover {
74
- background-color: #475569;
75
- }
76
- .menu-item.active {
77
- background-color: #60a5fa;
78
- color: white;
79
- }
80
- .dropdown {
81
- position: relative;
82
- display: inline-block;
83
- }
84
- .dropdown-content {
85
- display: none;
86
- position: absolute;
87
- background-color: #334155;
88
- min-width: 160px;
89
- box-shadow: 0px 8px 16px rgba(0,0,0,0.2);
90
- z-index: 1;
91
- border-radius: 4px;
92
- overflow: hidden;
93
- }
94
- .dropdown-content a {
95
- color: #cbd5e1;
96
- padding: 12px 16px;
97
- text-decoration: none;
98
- display: block;
99
- }
100
- .dropdown-content a:hover {
101
- background-color: #475569;
102
- }
103
- .dropdown:hover .dropdown-content {
104
- display: block;
105
- }
106
- .modal {
107
- display: none;
108
- position: fixed;
109
- z-index: 1000;
110
- left: 0;
111
- top: 0;
112
- width: 100%;
113
- height: 100%;
114
- background-color: rgba(0,0,0,0.5);
115
- }
116
- .modal-content {
117
- background-color: #334155;
118
- margin: 10% auto;
119
- padding: 20px;
120
- border-radius: 8px;
121
- width: 80%;
122
- max-width: 600px;
123
- box-shadow: 0 4px 8px rgba(0,0,0,0.3);
124
- color: #f1f5f9;
125
- }
126
- .close {
127
- color: #94a3b8;
128
- float: right;
129
- font-size: 28px;
130
- font-weight: bold;
131
- cursor: pointer;
132
- }
133
- .close:hover {
134
- color: #f1f5f9;
135
- }
136
- .boolean-select {
137
- background-color: #475569;
138
- color: #f1f5f9;
139
- border: 1px solid #64748b;
140
- border-radius: 4px;
141
- padding: 2px 4px;
142
- }
143
-
144
- /* Code Editor bracket coloring */
145
- #jsonOutput {
146
- line-height: 1.6;
147
- }
148
-
149
- .bracket-layer-0 { color: #ef4444; text-shadow: 0 0 5px rgba(239, 68, 68, 0.5); }
150
- .bracket-layer-1 { color: #f97316; text-shadow: 0 0 5px rgba(249, 115, 22, 0.5); }
151
- .bracket-layer-2 { color: #eab308; text-shadow: 0 0 5px rgba(234, 179, 8, 0.5); }
152
- .bracket-layer-3 { color: #22c55e; text-shadow: 0 0 5px rgba(34, 197, 94, 0.5); }
153
- .bracket-layer-4 { color: #06b6d4; text-shadow: 0 0 5px rgba(6, 182, 212, 0.5); }
154
- .bracket-layer-5 { color: #3b82f6; text-shadow: 0 0 5px rgba(59, 130, 246, 0.5); }
155
- .bracket-layer-6 { color: #8b5cf6; text-shadow: 0 0 5px rgba(139, 92, 246, 0.5); }
156
- .bracket-layer-7 { color: #ec4899; text-shadow: 0 0 5px rgba(236, 72, 153, 0.5); }
157
-
158
- /* JSON Editor styles */
159
- .json-editor {
160
- background-color: #1e293b;
161
- border: 1px solid #334155;
162
- }
163
-
164
- .json-item {
165
- transition: all 0.15s ease;
166
- }
167
-
168
- .json-item:hover {
169
- background-color: rgba(255, 255, 255, 0.02);
170
- }
171
-
172
- .json-item:hover .json-key,
173
- .json-item:hover .json-value {
174
- text-shadow: 0 0 8px var(--layer-color, #3b82f6);
175
- }
176
-
177
- .json-item.active .json-key,
178
- .json-item.active .json-value {
179
- font-weight: bold;
180
- text-shadow: 0 0 10px var(--layer-color, #3b82f6);
181
- }
182
-
183
- .json-bracket {
184
- font-weight: bold;
185
- }
186
-
187
- .json-key {
188
- transition: all 0.15s ease;
189
- }
190
-
191
- .json-value {
192
- transition: all 0.15s ease;
193
- }
194
-
195
- /* Editable fields - clean and minimal */
196
- .editable-field {
197
- background: rgba(255, 255, 255, 0.1);
198
- border: 1px solid rgba(255, 255, 255, 0.2);
199
- color: #f8fafc;
200
- padding: 2px 6px;
201
- border-radius: 4px;
202
- font-family: 'Fira Code', 'Monaco', 'Consolas', monospace;
203
- font-size: inherit;
204
- width: auto;
205
- min-width: 50px;
206
- outline: none;
207
- transition: all 0.2s ease;
208
- }
209
-
210
- .editable-field:focus {
211
- background: rgba(255, 255, 255, 0.15);
212
- border-color: rgba(255, 255, 255, 0.4);
213
- box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.3);
214
- }
215
-
216
- .editable-field.key-input {
217
- color: #93c5fd;
218
- }
219
-
220
- .editable-field.value-input {
221
- color: #6ee7b7;
222
- }
223
- </style>
224
  </head>
225
  <body class="bg-slate-900 min-h-screen p-4 md:p-8">
226
  <div class="max-w-6xl mx-auto">
@@ -573,6 +373,20 @@
573
  keySpan.className = 'json-key';
574
  keySpan.textContent = `"${key}"`;
575
  keySpan.style.color = '#93c5fd';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
576
  content.appendChild(keySpan);
577
 
578
  const colon = document.createElement('span');
@@ -582,6 +396,57 @@
582
  }
583
 
584
  // Value or children
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
585
  if (typeof data === 'object' && data !== null) {
586
  if (Array.isArray(data)) {
587
  // Array
@@ -658,7 +523,109 @@
658
  closingWrapper.appendChild(closingContent);
659
  container.appendChild(closingWrapper);
660
  }
 
 
 
 
 
 
 
 
661
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
662
  }
663
 
664
 
@@ -836,12 +803,18 @@
836
  }
837
  }
838
 
839
- // Real-time validation of code editor
840
  jsonOutput.addEventListener('input', () => {
841
  try {
842
- JSON.parse(jsonOutput.value);
843
  jsonOutput.style.borderColor = '#10b981';
844
  validationStatus.innerHTML = '<i class="fas fa-check-circle text-green-500"></i><span class="text-green-600">Valid JSON</span>';
 
 
 
 
 
 
845
  } catch (e) {
846
  jsonOutput.style.borderColor = '#ef4444';
847
  validationStatus.innerHTML = '<i class="fas fa-exclamation-circle text-red-500"></i><span class="text-red-600">Invalid JSON</span>';
 
20
  }
21
  }
22
  </script>
23
+ <link rel="stylesheet" href="style.css">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  </head>
25
  <body class="bg-slate-900 min-h-screen p-4 md:p-8">
26
  <div class="max-w-6xl mx-auto">
 
373
  keySpan.className = 'json-key';
374
  keySpan.textContent = `"${key}"`;
375
  keySpan.style.color = '#93c5fd';
376
+ keySpan.dataset.key = key;
377
+ keySpan.dataset.parent = parentKey;
378
+ keySpan.dataset.type = 'key';
379
+ keySpan.style.cursor = 'pointer';
380
+
381
+ // Track for tab navigation
382
+ editableFields.push({ element: keySpan, key, parentKey, type: 'key' });
383
+
384
+ // Single-click to edit
385
+ keySpan.addEventListener('click', (e) => {
386
+ e.stopPropagation();
387
+ makeEditable(keySpan, key, parentKey, 'key');
388
+ });
389
+
390
  content.appendChild(keySpan);
391
 
392
  const colon = document.createElement('span');
 
396
  }
397
 
398
  // Value or children
399
+ } else {
400
+ // Primitive value (string, number, boolean, null)
401
+ const valueSpan = document.createElement('span');
402
+ valueSpan.className = 'json-value';
403
+
404
+ if (key !== 'root') {
405
+ valueSpan.dataset.key = key;
406
+ valueSpan.dataset.parent = parentKey;
407
+ valueSpan.dataset.type = 'value';
408
+ valueSpan.style.color = '#6ee7b7';
409
+
410
+ // Format the value display
411
+ if (typeof data === 'string') {
412
+ valueSpan.textContent = `"${data}"`;
413
+ } else if (data === null) {
414
+ valueSpan.textContent = 'null';
415
+ valueSpan.style.color = '#f87171';
416
+ } else if (typeof data === 'boolean') {
417
+ valueSpan.textContent = data.toString();
418
+ valueSpan.style.color = data ? '#22c55e' : '#ef4444';
419
+ } else if (typeof data === 'number') {
420
+ valueSpan.textContent = data.toString();
421
+ valueSpan.style.color = '#fbbf24';
422
+ }
423
+
424
+ // Single-click to edit
425
+ valueSpan.style.cursor = 'pointer';
426
+ valueSpan.addEventListener('click', (e) => {
427
+ e.stopPropagation();
428
+ makeEditable(valueSpan, key, parentKey, 'value');
429
+ });
430
+ } else {
431
+ if (typeof data === 'string') {
432
+ valueSpan.textContent = `"${data}"`;
433
+ } else if (data === null) {
434
+ valueSpan.textContent = 'null';
435
+ valueSpan.style.color = '#f87171';
436
+ } else if (typeof data === 'boolean') {
437
+ valueSpan.textContent = data.toString();
438
+ valueSpan.style.color = data ? '#22c55e' : '#ef4444';
439
+ } else if (typeof data === 'number') {
440
+ valueSpan.textContent = data.toString();
441
+ valueSpan.style.color = '#fbbf24';
442
+ }
443
+ }
444
+
445
+ content.appendChild(valueSpan);
446
+ wrapper.appendChild(content);
447
+ container.appendChild(wrapper);
448
+ }
449
+
450
  if (typeof data === 'object' && data !== null) {
451
  if (Array.isArray(data)) {
452
  // Array
 
523
  closingWrapper.appendChild(closingContent);
524
  container.appendChild(closingWrapper);
525
  }
526
+ }
527
+ }
528
+
529
+ // Make a span editable
530
+ function makeEditable(span, key, parentKey, type) {
531
+ const currentValue = type === 'value'
532
+ ? (typeof jsonData === 'object' && parentKey === 'root' ? jsonData[key] : getNestedValue(jsonData, parentKey, key))
533
+ : key;
534
 
535
+ const input = document.createElement('input');
536
+ input.type = 'text';
537
+ input.className = `editable-field ${type === 'key' ? 'key-input' : 'value-input'}`;
538
+ input.value = type === 'value' && typeof currentValue === 'string' ? currentValue : String(currentValue);
539
+
540
+ // Track this field for tab navigation
541
+ const fieldData = { element: input, key, parentKey, type };
542
+ const fieldIndex = editableFields.findIndex(f => f.element === span);
543
+ if (fieldIndex !== -1) {
544
+ editableFields[fieldIndex] = fieldData;
545
+ currentFieldIndex = fieldIndex;
546
+ } else {
547
+ editableFields.push(fieldData);
548
+ currentFieldIndex = editableFields.length - 1;
549
+ }
550
+
551
+ // Handle keyboard navigation
552
+ input.addEventListener('keydown', (e) => {
553
+ if (e.key === 'Tab') {
554
+ e.preventDefault();
555
+ navigateToField(e.shiftKey ? -1 : 1);
556
+ } else if (e.key === 'Enter') {
557
+ e.preventDefault();
558
+ navigateToField(1);
559
+ } else if (e.shiftKey && e.key === 'Enter') {
560
+ e.preventDefault();
561
+ // Insert new field
562
+ input.blur();
563
+ insertNewField({ key, parentKey });
564
+ }
565
+ });
566
+
567
+ // Handle blur (save on exit)
568
+ input.addEventListener('blur', () => {
569
+ const newValue = input.value.trim();
570
+
571
+ if (type === 'key') {
572
+ // Update key
573
+ if (newValue && newValue !== key) {
574
+ if (parentKey === 'root') {
575
+ const value = jsonData[key];
576
+ delete jsonData[key];
577
+ jsonData[newValue] = value;
578
+ } else {
579
+ const parent = findElementByKey(jsonData, parentKey);
580
+ if (parent && typeof parent === 'object') {
581
+ const value = parent[key];
582
+ delete parent[key];
583
+ parent[newValue] = value;
584
+ }
585
+ }
586
+ }
587
+ } else {
588
+ // Update value
589
+ const parsedValue = parseValue(newValue);
590
+ if (parentKey === 'root') {
591
+ jsonData[key] = parsedValue;
592
+ } else {
593
+ const parent = findElementByKey(jsonData, parentKey);
594
+ if (parent && typeof parent === 'object') {
595
+ parent[key] = parsedValue;
596
+ }
597
+ }
598
+ }
599
+
600
+ renderEditor();
601
+ updateOutput();
602
+ saveToHistory();
603
+ showSavedIndicator();
604
+ });
605
+
606
+ // Replace span with input
607
+ span.parentNode.replaceChild(input, span);
608
+ input.focus();
609
+ input.select();
610
+ }
611
+
612
+ // Navigate to next/previous field
613
+ function navigateToField(direction) {
614
+ const newIndex = currentFieldIndex + direction;
615
+ if (newIndex >= 0 && newIndex < editableFields.length) {
616
+ const field = editableFields[newIndex];
617
+ currentFieldIndex = newIndex;
618
+
619
+ // Click on the corresponding span to make it editable
620
+ const allSpans = document.querySelectorAll('.json-key, .json-value');
621
+ allSpans.forEach(span => {
622
+ if ((span.dataset.key === field.key && span.dataset.type === field.type) ||
623
+ (field.type === 'key' && span.classList.contains('json-key') && span.textContent.includes(field.key)) ||
624
+ (field.type === 'value' && span.classList.contains('json-value'))) {
625
+ span.click();
626
+ }
627
+ });
628
+ }
629
  }
630
 
631
 
 
803
  }
804
  }
805
 
806
+ // Real-time validation and sync of code editor
807
  jsonOutput.addEventListener('input', () => {
808
  try {
809
+ const parsed = JSON.parse(jsonOutput.value);
810
  jsonOutput.style.borderColor = '#10b981';
811
  validationStatus.innerHTML = '<i class="fas fa-check-circle text-green-500"></i><span class="text-green-600">Valid JSON</span>';
812
+
813
+ // Real-time sync: Update visual editor when valid JSON is typed
814
+ if (!isApplyingChanges) {
815
+ jsonData = parsed;
816
+ renderEditor();
817
+ }
818
  } catch (e) {
819
  jsonOutput.style.borderColor = '#ef4444';
820
  validationStatus.innerHTML = '<i class="fas fa-exclamation-circle text-red-500"></i><span class="text-red-600">Invalid JSON</span>';
style.css CHANGED
@@ -1,32 +1,195 @@
1
  body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
4
  }
5
 
6
  h1 {
7
- font-size: 16px;
8
- margin-top: 0;
9
  }
10
 
11
  p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
16
  }
17
 
18
  .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
24
  }
25
 
26
  .card p:last-child {
27
- margin-bottom: 0;
28
  }
29
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  /* LCARS-style layer colors */
31
  .lcars-layer-0 { --layer-color: #ef4444; }
32
  .lcars-layer-1 { --layer-color: #f97316; }
@@ -39,91 +202,123 @@ p {
39
 
40
  /* Layer indicator line */
41
  .layer-indicator {
42
- position: absolute;
43
- left: 0;
44
- top: 0;
45
- bottom: 0;
46
- width: 4px;
47
- background: var(--layer-color);
48
- border-radius: 0 4px 4px 0;
49
- box-shadow: 2px 0 8px var(--layer-color);
50
  }
51
 
52
  /* LCARS horizontal connector */
53
  .lcars-connector {
54
- position: absolute;
55
- left: 4px;
56
- top: 50%;
57
- height: 2px;
58
- width: calc(100% - 4px);
59
- background: var(--layer-color);
60
- opacity: 0.4;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  }
62
 
63
  /* Active row - bold text instead of background */
64
  .json-item.active {
65
- background-color: transparent;
66
  }
67
 
68
  .json-item.active .json-key,
69
  .json-item.active .json-value {
70
- font-weight: bold;
71
- text-shadow: 0 0 10px var(--layer-color);
72
  }
73
 
74
- /* Saved indicator */
75
- .saved-indicator {
76
- position: fixed;
77
- bottom: 20px;
78
- right: 20px;
79
- background: linear-gradient(135deg, #10b981, #059669);
80
- color: white;
81
- padding: 12px 24px;
82
- border-radius: 8px;
83
- font-weight: bold;
84
- box-shadow: 0 4px 12px rgba(0,0,0,0.3);
85
- transform: translateY(100px);
86
- transition: transform 0.3s ease;
87
- z-index: 1000;
88
  }
89
 
90
- .saved-indicator.show {
91
- transform: translateY(0);
 
 
 
 
92
  }
93
 
94
- /* Editable fields styling */
95
  .editable-field {
96
- border: none;
97
- background: transparent;
98
- padding: 2px 4px;
99
- border-radius: 4px;
100
- font-family: inherit;
101
- font-size: inherit;
102
- width: auto;
103
- min-width: 30px;
104
- transition: all 0.2s ease;
 
105
  }
106
 
107
  .editable-field:focus {
108
- outline: none;
109
- background: rgba(255,255,255,0.15);
110
- box-shadow: inset 0 0 0 2px rgba(255,255,255,0.3);
111
  }
112
 
113
  .editable-field.key-input {
114
- color: #93c5fd;
115
  }
116
 
117
  .editable-field.value-input {
118
- color: #6ee7b7;
119
  }
120
 
121
- /* New field indicator */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
122
  .new-field-highlight {
123
- animation: pulse-green 1s ease-in-out infinite;
124
  }
125
 
126
  @keyframes pulse-green {
127
- 0%, 100% { background-color: rgba(34, 197, 94, 0.2); }
128
- 50% { background-color: rgba(34, 197, 94, 0.4); }
129
- }
 
1
  body {
2
+ padding: 2rem;
3
+ font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
4
  }
5
 
6
  h1 {
7
+ font-size: 16px;
8
+ margin-top: 0;
9
  }
10
 
11
  p {
12
+ color: rgb(107, 114, 128);
13
+ font-size: 15px;
14
+ margin-bottom: 10px;
15
+ margin-top: 5px;
16
  }
17
 
18
  .card {
19
+ max-width: 620px;
20
+ margin: 0 auto;
21
+ padding: 16px;
22
+ border: 1px solid lightgray;
23
+ border-radius: 16px;
24
  }
25
 
26
  .card p:last-child {
27
+ margin-bottom: 0;
28
  }
29
 
30
+ /* Button and toolbar styles */
31
+ .btn {
32
+ transition: all 0.2s ease;
33
+ }
34
+
35
+ .btn:hover {
36
+ transform: translateY(-2px);
37
+ }
38
+
39
+ .indent-line {
40
+ position: absolute;
41
+ left: 0;
42
+ top: 0;
43
+ bottom: 0;
44
+ width: 2px;
45
+ }
46
+
47
+ .toolbar-btn {
48
+ transition: all 0.2s;
49
+ }
50
+
51
+ .toolbar-btn:hover {
52
+ background-color: #475569;
53
+ }
54
+
55
+ .toolbar-btn.active {
56
+ background-color: #60a5fa;
57
+ color: white;
58
+ }
59
+
60
+ /* Notification styles */
61
+ .notification {
62
+ transform: translateX(100%);
63
+ transition: transform 0.3s ease;
64
+ }
65
+
66
+ .notification.show {
67
+ transform: translateX(0);
68
+ }
69
+
70
+ /* Error highlight */
71
+ .error-highlight {
72
+ background-color: rgba(239, 68, 68, 0.1);
73
+ border-left: 3px solid #ef4444;
74
+ }
75
+
76
+ /* Menu bar styles */
77
+ .menu-bar {
78
+ background-color: #334155;
79
+ padding: 8px 16px;
80
+ border-radius: 8px;
81
+ margin-bottom: 16px;
82
+ box-shadow: 0 2px 4px rgba(0,0,0,0.2);
83
+ }
84
+
85
+ .menu-item {
86
+ color: #cbd5e1;
87
+ padding: 8px 12px;
88
+ border-radius: 4px;
89
+ cursor: pointer;
90
+ transition: all 0.2s;
91
+ margin-right: 4px;
92
+ }
93
+
94
+ .menu-item:hover {
95
+ background-color: #475569;
96
+ }
97
+
98
+ .menu-item.active {
99
+ background-color: #60a5fa;
100
+ color: white;
101
+ }
102
+
103
+ /* Dropdown styles */
104
+ .dropdown {
105
+ position: relative;
106
+ display: inline-block;
107
+ }
108
+
109
+ .dropdown-content {
110
+ display: none;
111
+ position: absolute;
112
+ background-color: #334155;
113
+ min-width: 160px;
114
+ box-shadow: 0px 8px 16px rgba(0,0,0,0.2);
115
+ z-index: 1;
116
+ border-radius: 4px;
117
+ overflow: hidden;
118
+ }
119
+
120
+ .dropdown-content a {
121
+ color: #cbd5e1;
122
+ padding: 12px 16px;
123
+ text-decoration: none;
124
+ display: block;
125
+ }
126
+
127
+ .dropdown-content a:hover {
128
+ background-color: #475569;
129
+ }
130
+
131
+ .dropdown:hover .dropdown-content {
132
+ display: block;
133
+ }
134
+
135
+ /* Modal styles */
136
+ .modal {
137
+ display: none;
138
+ position: fixed;
139
+ z-index: 1000;
140
+ left: 0;
141
+ top: 0;
142
+ width: 100%;
143
+ height: 100%;
144
+ background-color: rgba(0,0,0,0.5);
145
+ }
146
+
147
+ .modal-content {
148
+ background-color: #334155;
149
+ margin: 10% auto;
150
+ padding: 20px;
151
+ border-radius: 8px;
152
+ width: 80%;
153
+ max-width: 600px;
154
+ box-shadow: 0 4px 8px rgba(0,0,0,0.3);
155
+ color: #f1f5f9;
156
+ }
157
+
158
+ .close {
159
+ color: #94a3b8;
160
+ float: right;
161
+ font-size: 28px;
162
+ font-weight: bold;
163
+ cursor: pointer;
164
+ }
165
+
166
+ .close:hover {
167
+ color: #f1f5f9;
168
+ }
169
+
170
+ /* Boolean select */
171
+ .boolean-select {
172
+ background-color: #475569;
173
+ color: #f1f5f9;
174
+ border: 1px solid #64748b;
175
+ border-radius: 4px;
176
+ padding: 2px 4px;
177
+ }
178
+
179
+ /* Code Editor bracket coloring */
180
+ #jsonOutput {
181
+ line-height: 1.6;
182
+ }
183
+
184
+ .bracket-layer-0 { color: #ef4444; text-shadow: 0 0 5px rgba(239, 68, 68, 0.5); }
185
+ .bracket-layer-1 { color: #f97316; text-shadow: 0 0 5px rgba(249, 115, 22, 0.5); }
186
+ .bracket-layer-2 { color: #eab308; text-shadow: 0 0 5px rgba(234, 179, 8, 0.5); }
187
+ .bracket-layer-3 { color: #22c55e; text-shadow: 0 0 5px rgba(34, 197, 94, 0.5); }
188
+ .bracket-layer-4 { color: #06b6d4; text-shadow: 0 0 5px rgba(6, 182, 212, 0.5); }
189
+ .bracket-layer-5 { color: #3b82f6; text-shadow: 0 0 5px rgba(59, 130, 246, 0.5); }
190
+ .bracket-layer-6 { color: #8b5cf6; text-shadow: 0 0 5px rgba(139, 92, 246, 0.5); }
191
+ .bracket-layer-7 { color: #ec4899; text-shadow: 0 0 5px rgba(236, 72, 153, 0.5); }
192
+
193
  /* LCARS-style layer colors */
194
  .lcars-layer-0 { --layer-color: #ef4444; }
195
  .lcars-layer-1 { --layer-color: #f97316; }
 
202
 
203
  /* Layer indicator line */
204
  .layer-indicator {
205
+ position: absolute;
206
+ left: 0;
207
+ top: 0;
208
+ bottom: 0;
209
+ width: 4px;
210
+ background: var(--layer-color);
211
+ border-radius: 0 4px 4px 0;
212
+ box-shadow: 2px 0 8px var(--layer-color);
213
  }
214
 
215
  /* LCARS horizontal connector */
216
  .lcars-connector {
217
+ position: absolute;
218
+ left: 4px;
219
+ top: 50%;
220
+ height: 2px;
221
+ width: calc(100% - 4px);
222
+ background: var(--layer-color);
223
+ opacity: 0.4;
224
+ }
225
+
226
+ /* JSON Editor styles */
227
+ .json-editor {
228
+ background-color: #1e293b;
229
+ border: 1px solid #334155;
230
+ }
231
+
232
+ .json-item {
233
+ transition: all 0.15s ease;
234
+ position: relative;
235
+ }
236
+
237
+ .json-item:hover {
238
+ background-color: rgba(255, 255, 255, 0.02);
239
+ }
240
+
241
+ .json-item:hover .json-key,
242
+ .json-item:hover .json-value {
243
+ text-shadow: 0 0 8px var(--layer-color, #3b82f6);
244
  }
245
 
246
  /* Active row - bold text instead of background */
247
  .json-item.active {
248
+ background-color: transparent;
249
  }
250
 
251
  .json-item.active .json-key,
252
  .json-item.active .json-value {
253
+ font-weight: bold;
254
+ text-shadow: 0 0 10px var(--layer-color);
255
  }
256
 
257
+ .json-bracket {
258
+ font-weight: bold;
 
 
 
 
 
 
 
 
 
 
 
 
259
  }
260
 
261
+ .json-key {
262
+ transition: all 0.15s ease;
263
+ }
264
+
265
+ .json-value {
266
+ transition: all 0.15s ease;
267
  }
268
 
269
+ /* Editable fields styling - clean and minimal */
270
  .editable-field {
271
+ border: none;
272
+ background: transparent;
273
+ padding: 2px 4px;
274
+ border-radius: 4px;
275
+ font-family: inherit;
276
+ font-size: inherit;
277
+ width: auto;
278
+ min-width: 30px;
279
+ transition: all 0.2s ease;
280
+ outline: none;
281
  }
282
 
283
  .editable-field:focus {
284
+ background: rgba(255,255,255,0.15);
285
+ box-shadow: inset 0 0 0 2px rgba(255,255,255,0.3);
 
286
  }
287
 
288
  .editable-field.key-input {
289
+ color: #93c5fd;
290
  }
291
 
292
  .editable-field.value-input {
293
+ color: #6ee7b7;
294
  }
295
 
296
+ /* Saved indicator */
297
+ .saved-indicator {
298
+ position: fixed;
299
+ bottom: 20px;
300
+ right: 20px;
301
+ background: linear-gradient(135deg, #10b981, #059669);
302
+ color: white;
303
+ padding: 12px 24px;
304
+ border-radius: 8px;
305
+ font-weight: bold;
306
+ box-shadow: 0 4px 12px rgba(0,0,0,0.3);
307
+ transform: translateY(100px);
308
+ transition: transform 0.3s ease;
309
+ z-index: 1000;
310
+ }
311
+
312
+ .saved-indicator.show {
313
+ transform: translateY(0);
314
+ }
315
+
316
+ /* New field highlight animation */
317
  .new-field-highlight {
318
+ animation: pulse-green 1s ease-in-out infinite;
319
  }
320
 
321
  @keyframes pulse-green {
322
+ 0%, 100% { background-color: rgba(34, 197, 94, 0.2); }
323
+ 50% { background-color: rgba(34, 197, 94, 0.4); }
324
+ }