ofs-object 0.1.0-beta.1

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.
@@ -0,0 +1,565 @@
1
+ /**
2
+ * OFSObject widget styles
3
+ *
4
+ * Covers the DOM widgets the library mounts: command console, legend, symbology panel,
5
+ * attribute table, topology panel and their shared buttons and form controls.
6
+ * Nothing here styles the page around them — no reset, no body rules, no web fonts.
7
+ *
8
+ * Usage (Angular: add the path to "styles" in angular.json)
9
+ * @import 'ofs-object/styles.css';
10
+ *
11
+ * The palette is exposed as custom properties, so a host application can restyle the
12
+ * widgets by redefining them anywhere above the mount point:
13
+ * :root { --ofs-accent-blue: #2563eb; }
14
+ */
15
+
16
+ :root {
17
+ --ofs-bg-dark: #0f172a;
18
+ --ofs-bg-card: rgba(30, 41, 59, 0.85);
19
+ --ofs-bg-card-hover: rgba(51, 65, 85, 0.9);
20
+ --ofs-border-color: rgba(255, 255, 255, 0.1);
21
+ --ofs-border-active: #38bdf8;
22
+ --ofs-text-primary: #f8fafc;
23
+ --ofs-text-secondary: #94a3b8;
24
+ --ofs-text-muted: #64748b;
25
+ --ofs-accent-blue: #38bdf8;
26
+ --ofs-accent-cyan: #06b6d4;
27
+ --ofs-accent-green: #10b981;
28
+ --ofs-accent-amber: #f59e0b;
29
+ --ofs-accent-red: #ef4444;
30
+ --ofs-shadow-lg: 0 10px 25px -5px rgba(0, 0, 0, 0.5), 0 8px 10px -6px rgba(0, 0, 0, 0.5);
31
+ --ofs-font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
32
+ }
33
+
34
+ .ofs-btn {
35
+ display: inline-flex;
36
+ align-items: center;
37
+ gap: 6px;
38
+ padding: 7px 14px;
39
+ background: rgba(30, 41, 59, 0.8);
40
+ color: var(--ofs-text-primary);
41
+ border: 1px solid var(--ofs-border-color);
42
+ border-radius: 8px;
43
+ font-size: 13px;
44
+ font-weight: 500;
45
+ cursor: pointer;
46
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
47
+ }
48
+
49
+ .ofs-btn:hover {
50
+ background: rgba(51, 65, 85, 0.9);
51
+ border-color: rgba(255, 255, 255, 0.2);
52
+ transform: translateY(-1px);
53
+ }
54
+
55
+ .ofs-btn-primary {
56
+ background: linear-gradient(135deg, #0284c7, #2563eb);
57
+ border-color: #38bdf8;
58
+ box-shadow: 0 2px 8px rgba(37, 99, 235, 0.3);
59
+ }
60
+
61
+ .ofs-btn-primary:hover {
62
+ background: linear-gradient(135deg, #0369a1, #1d4ed8);
63
+ }
64
+
65
+ .ofs-btn-danger {
66
+ background: linear-gradient(135deg, #b91c1c, #dc2626);
67
+ border-color: #ef4444;
68
+ color: #fff;
69
+ }
70
+
71
+ .ofs-btn-danger:hover {
72
+ background: linear-gradient(135deg, #991b1b, #b91c1c);
73
+ }
74
+
75
+ .ofs-btn-sm {
76
+ padding: 5px 12px;
77
+ font-size: 12px;
78
+ border-radius: 6px;
79
+ }
80
+
81
+ .ofs-btn-cancel-tool {
82
+ color: #f87171 !important;
83
+ }
84
+
85
+ .ofs-btn-cancel-tool:hover {
86
+ background: rgba(239, 68, 68, 0.2) !important;
87
+ color: #fca5a5 !important;
88
+ }
89
+
90
+ @keyframes ofs-slide-down {
91
+ from {
92
+ opacity: 0;
93
+ transform: translate(-50%, -15px);
94
+ }
95
+ to {
96
+ opacity: 1;
97
+ transform: translate(-50%, 0);
98
+ }
99
+ }
100
+
101
+ @keyframes ofs-pulse {
102
+ 0% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(56, 189, 248, 0.7); }
103
+ 70% { transform: scale(1.1); box-shadow: 0 0 0 8px rgba(56, 189, 248, 0); }
104
+ 100% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(56, 189, 248, 0); }
105
+ }
106
+
107
+ /* ==========================================================================
108
+ Legend Component Styles
109
+ ========================================================================== */
110
+ .ofs-legend-card {
111
+ display: flex;
112
+ flex-direction: column;
113
+ gap: 12px;
114
+ }
115
+
116
+ .ofs-legend-header {
117
+ display: flex;
118
+ align-items: center;
119
+ justify-content: space-between;
120
+ margin-bottom: 4px;
121
+ }
122
+
123
+ .ofs-legend-title {
124
+ font-size: 14px;
125
+ font-weight: 700;
126
+ color: var(--ofs-text-primary);
127
+ }
128
+
129
+ .ofs-legend-badge {
130
+ font-size: 11px;
131
+ font-weight: 700;
132
+ background: rgba(56, 189, 248, 0.2);
133
+ color: var(--ofs-accent-blue);
134
+ padding: 2px 8px;
135
+ border-radius: 12px;
136
+ }
137
+
138
+ .ofs-legend-layer {
139
+ background: rgba(15, 23, 42, 0.5);
140
+ border: 1px solid var(--ofs-border-color);
141
+ border-radius: 10px;
142
+ padding: 12px;
143
+ margin-bottom: 10px;
144
+ transition: all 0.2s ease;
145
+ cursor: pointer;
146
+ }
147
+
148
+ .ofs-legend-layer:hover {
149
+ border-color: rgba(255, 255, 255, 0.2);
150
+ }
151
+
152
+ .ofs-legend-layer.ofs-layer-active {
153
+ border-color: var(--ofs-accent-blue);
154
+ box-shadow: 0 0 12px rgba(56, 189, 248, 0.15);
155
+ }
156
+
157
+ .ofs-layer-header {
158
+ display: flex;
159
+ align-items: center;
160
+ justify-content: space-between;
161
+ margin-bottom: 8px;
162
+ }
163
+
164
+ .ofs-checkbox-label {
165
+ display: flex;
166
+ align-items: center;
167
+ gap: 8px;
168
+ cursor: pointer;
169
+ }
170
+
171
+ .ofs-layer-name {
172
+ font-size: 13px;
173
+ font-weight: 600;
174
+ color: var(--ofs-text-primary);
175
+ }
176
+
177
+ .ofs-layer-actions {
178
+ display: flex;
179
+ align-items: center;
180
+ gap: 6px;
181
+ }
182
+
183
+ .ofs-layer-count {
184
+ font-size: 11px;
185
+ background: rgba(255, 255, 255, 0.08);
186
+ padding: 2px 6px;
187
+ border-radius: 4px;
188
+ color: var(--ofs-text-muted);
189
+ }
190
+
191
+ .ofs-btn-mini {
192
+ background: transparent;
193
+ border: none;
194
+ color: var(--ofs-text-muted);
195
+ cursor: pointer;
196
+ font-size: 10px;
197
+ padding: 2px 4px;
198
+ border-radius: 4px;
199
+ }
200
+
201
+ .ofs-btn-mini:hover {
202
+ color: var(--ofs-text-primary);
203
+ background: rgba(255, 255, 255, 0.1);
204
+ }
205
+
206
+ .ofs-opacity-row {
207
+ display: flex;
208
+ align-items: center;
209
+ gap: 8px;
210
+ margin: 6px 0 10px 0;
211
+ }
212
+
213
+ .ofs-label-small {
214
+ font-size: 11px;
215
+ color: var(--ofs-text-muted);
216
+ }
217
+
218
+ .ofs-opacity-slider {
219
+ flex: 1;
220
+ height: 4px;
221
+ accent-color: var(--ofs-accent-blue);
222
+ cursor: pointer;
223
+ }
224
+
225
+ .ofs-opacity-val {
226
+ font-size: 11px;
227
+ color: var(--ofs-text-secondary);
228
+ font-family: var(--ofs-font-mono);
229
+ min-width: 32px;
230
+ text-align: right;
231
+ }
232
+
233
+ .ofs-swatches {
234
+ display: flex;
235
+ flex-direction: column;
236
+ gap: 6px;
237
+ }
238
+
239
+ .ofs-swatch-item {
240
+ display: flex;
241
+ align-items: center;
242
+ gap: 8px;
243
+ font-size: 12px;
244
+ color: var(--ofs-text-secondary);
245
+ }
246
+
247
+ .ofs-swatch-label {
248
+ flex: 1;
249
+ white-space: nowrap;
250
+ overflow: hidden;
251
+ text-overflow: ellipsis;
252
+ }
253
+
254
+ .ofs-swatch-count {
255
+ font-size: 10px;
256
+ font-family: var(--ofs-font-mono);
257
+ color: var(--ofs-text-muted);
258
+ }
259
+
260
+ /* Legend tree, groups and class rows */
261
+ .ofs-legend-actions { display: flex; align-items: center; gap: 6px; }
262
+
263
+ .ofs-legend-group {
264
+ border: 1px dashed var(--ofs-border-color);
265
+ border-radius: 10px;
266
+ padding: 6px 8px;
267
+ margin-bottom: 10px;
268
+ }
269
+
270
+ .ofs-group-header { display: flex; align-items: center; gap: 6px; font-size: 13px; font-weight: 600; color: var(--ofs-text-primary); }
271
+
272
+ .ofs-group-name { flex: 1; cursor: default; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
273
+
274
+ .ofs-group-children { margin-top: 8px; padding-left: 8px; border-left: 2px solid rgba(56, 189, 248, 0.25); }
275
+
276
+ .ofs-group-empty { font-size: 11px; color: var(--ofs-text-muted); padding: 4px 0; }
277
+
278
+ .ofs-muted { opacity: 0.5; }
279
+
280
+ .ofs-pinned { color: #f59e0b !important; }
281
+
282
+ .ofs-group-select { flex: 1; background: rgba(15, 23, 42, 0.8); color: var(--ofs-text-secondary); border: 1px solid var(--ofs-border-color); border-radius: 4px; font-size: 11px; }
283
+
284
+ .ofs-swatch-field { font-size: 11px; color: var(--ofs-text-muted); font-family: var(--ofs-font-mono); }
285
+
286
+ .ofs-swatch-item input[type='checkbox'] { margin: 0; }
287
+
288
+ .ofs-swatch-svg { flex-shrink: 0; display: block; }
289
+
290
+ .ofs-symbology-panel { color: var(--ofs-text-secondary); font-size: 12px; }
291
+
292
+ .ofs-sym-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; }
293
+
294
+ .ofs-sym-title { font-size: 14px; font-weight: 700; color: var(--ofs-text-primary); }
295
+
296
+ .ofs-sym-title small { color: var(--ofs-text-muted); font-weight: 400; }
297
+
298
+ .ofs-sym-section { border-top: 1px solid var(--ofs-border-color); padding: 8px 0; display: flex; flex-direction: column; gap: 6px; }
299
+
300
+ .ofs-sym-subtitle { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: var(--ofs-text-muted); display: flex; justify-content: space-between; }
301
+
302
+ .ofs-sym-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
303
+
304
+ .ofs-sym-row > span:first-child { flex: 0 0 120px; color: var(--ofs-text-muted); }
305
+
306
+ .ofs-sym-row select, .ofs-sym-row input[type='number'], .ofs-sym-row input[type='text'], .ofs-sym-table input[type='number'], .ofs-sym-table input[type='text'] {
307
+ flex: 1; min-width: 0; background: rgba(15, 23, 42, 0.8); color: var(--ofs-text-primary);
308
+ border: 1px solid var(--ofs-border-color); border-radius: 4px; padding: 2px 4px; font-size: 12px;
309
+ }
310
+
311
+ .ofs-sym-row input[type='color'], .ofs-sym-table input[type='color'] { width: 34px; height: 22px; padding: 0; border: none; background: none; }
312
+
313
+ .ofs-sym-pair { display: flex; gap: 4px; flex: 1; align-items: center; min-width: 0; }
314
+
315
+ .ofs-sym-pair > * { flex: 1; min-width: 0; }
316
+
317
+ .ofs-sym-pair output { flex: 0 0 36px; text-align: right; font-family: var(--ofs-font-mono); }
318
+
319
+ .ofs-sym-ramp { height: 10px; border-radius: 4px; border: 1px solid var(--ofs-border-color); }
320
+
321
+ .ofs-sym-actions { display: flex; gap: 6px; justify-content: flex-end; }
322
+
323
+ .ofs-sym-table-wrap { overflow-x: auto; }
324
+
325
+ .ofs-sym-table { width: 100%; border-collapse: collapse; }
326
+
327
+ .ofs-sym-table th { text-align: left; font-weight: 600; color: var(--ofs-text-muted); font-size: 11px; padding: 2px; }
328
+
329
+ .ofs-sym-table td { padding: 2px; vertical-align: middle; }
330
+
331
+ .ofs-sym-table input[type='number'] { width: 64px; }
332
+
333
+ .ofs-sym-swatch { display: flex; align-items: center; gap: 4px; }
334
+
335
+ .ofs-sym-count { text-align: right; font-family: var(--ofs-font-mono); color: var(--ofs-text-muted); }
336
+
337
+ .ofs-sym-empty { color: var(--ofs-text-muted); padding: 12px; }
338
+
339
+ .ofs-sym-links { display: flex; gap: 4px; text-transform: none; }
340
+
341
+ /* ==========================================================================
342
+ AutoCAD-Style Web CLI Console (Bottom)
343
+ ========================================================================== */
344
+ .ofs-console-container {
345
+ position: absolute;
346
+ bottom: 20px;
347
+ left: 80px;
348
+ right: 420px;
349
+ z-index: 15;
350
+ box-shadow: var(--ofs-shadow-lg);
351
+ border-radius: 12px;
352
+ overflow: hidden;
353
+ transition: all 0.3s ease;
354
+ }
355
+
356
+ .ofs-console-card {
357
+ background: rgba(10, 15, 30, 0.94);
358
+ backdrop-filter: blur(20px);
359
+ border: 1px solid rgba(56, 189, 248, 0.25);
360
+ border-radius: 12px;
361
+ display: flex;
362
+ flex-direction: column;
363
+ }
364
+
365
+ .ofs-console-header {
366
+ height: 28px;
367
+ background: rgba(15, 23, 42, 0.7);
368
+ display: flex;
369
+ align-items: center;
370
+ gap: 6px;
371
+ padding: 0 12px;
372
+ border-bottom: 1px solid var(--ofs-border-color);
373
+ }
374
+
375
+ .ofs-console-dot {
376
+ width: 9px;
377
+ height: 9px;
378
+ border-radius: 50%;
379
+ }
380
+
381
+ .ofs-console-dot.red { background: #ef4444; }
382
+
383
+ .ofs-console-dot.yellow { background: #f59e0b; }
384
+
385
+ .ofs-console-dot.green { background: #10b981; }
386
+
387
+ .ofs-console-title {
388
+ font-size: 11px;
389
+ font-family: var(--ofs-font-mono);
390
+ font-weight: 600;
391
+ color: var(--ofs-text-muted);
392
+ margin-left: 6px;
393
+ }
394
+
395
+ .ofs-console-output {
396
+ height: 110px;
397
+ overflow-y: auto;
398
+ padding: 8px 12px;
399
+ font-family: var(--ofs-font-mono);
400
+ font-size: 12px;
401
+ line-height: 1.6;
402
+ display: flex;
403
+ flex-direction: column;
404
+ gap: 2px;
405
+ }
406
+
407
+ .ofs-line-system { color: #38bdf8; }
408
+
409
+ .ofs-line-input { color: #f8fafc; font-weight: 600; }
410
+
411
+ .ofs-line-output { color: #94a3b8; }
412
+
413
+ .ofs-line-prompt { color: #f59e0b; font-weight: 600; }
414
+
415
+ .ofs-line-error { color: #f87171; }
416
+
417
+ .ofs-line-success { color: #4ade80; }
418
+
419
+ .ofs-console-input-row {
420
+ display: flex;
421
+ align-items: center;
422
+ background: rgba(15, 23, 42, 0.9);
423
+ padding: 6px 12px;
424
+ border-top: 1px solid var(--ofs-border-color);
425
+ gap: 8px;
426
+ }
427
+
428
+ .ofs-console-prompt {
429
+ font-family: var(--ofs-font-mono);
430
+ font-size: 12px;
431
+ color: var(--ofs-accent-amber);
432
+ font-weight: 600;
433
+ white-space: nowrap;
434
+ }
435
+
436
+ .ofs-console-input {
437
+ flex: 1;
438
+ background: transparent;
439
+ border: none;
440
+ outline: none;
441
+ color: var(--ofs-text-primary);
442
+ font-family: var(--ofs-font-mono);
443
+ font-size: 13px;
444
+ }
445
+
446
+ .ofs-topology-panel { color: var(--ofs-text-secondary); font-size: 12px; display: flex; flex-direction: column; gap: 8px; }
447
+
448
+ .ofs-topo-header { display: flex; justify-content: space-between; align-items: center; }
449
+
450
+ .ofs-topo-title { font-size: 14px; font-weight: 700; color: var(--ofs-text-primary); }
451
+
452
+ .ofs-topo-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
453
+
454
+ .ofs-topo-row > span:first-child { flex: 0 0 130px; color: var(--ofs-text-muted); }
455
+
456
+ .ofs-topo-row select, .ofs-topo-row input[type='number'] {
457
+ flex: 1; min-width: 0; background: rgba(15, 23, 42, 0.8); color: var(--ofs-text-primary);
458
+ border: 1px solid var(--ofs-border-color); border-radius: 4px; padding: 2px 4px; font-size: 12px;
459
+ }
460
+
461
+ .ofs-topo-row small { flex: 0 0 26px; color: var(--ofs-text-muted); }
462
+
463
+ .ofs-topo-checks { display: grid; grid-template-columns: 1fr 1fr; gap: 2px 8px; border-top: 1px solid var(--ofs-border-color); padding-top: 8px; }
464
+
465
+ .ofs-topo-check { display: flex; align-items: center; gap: 6px; font-size: 11px; }
466
+
467
+ .ofs-topo-tolerances { display: flex; flex-direction: column; gap: 4px; border-top: 1px solid var(--ofs-border-color); padding-top: 8px; }
468
+
469
+ .ofs-topo-actions { display: flex; gap: 8px; }
470
+
471
+ .ofs-topo-actions .ofs-btn, .ofs-topo-actions .ofs-btn-secondary { flex: 1; }
472
+
473
+ .ofs-topo-message { border-radius: 4px; padding: 6px 8px; font-size: 11px; background: rgba(59, 130, 246, 0.15); }
474
+
475
+ .ofs-topo-message.error { background: rgba(225, 29, 72, 0.18); color: #fecdd3; }
476
+
477
+ .ofs-topo-summary { border-top: 1px solid var(--ofs-border-color); padding-top: 8px; font-size: 11px; color: var(--ofs-text-muted); }
478
+
479
+ .ofs-topo-summary b.error { color: #fb7185; }
480
+
481
+ .ofs-topo-summary b.warning { color: #fbbf24; }
482
+
483
+ .ofs-topo-stale { margin-left: 6px; color: #fbbf24; }
484
+
485
+ .ofs-topo-empty { color: var(--ofs-text-muted); font-size: 11px; padding: 6px 0; }
486
+
487
+ .ofs-topo-group { border-top: 1px solid var(--ofs-border-color); padding-top: 6px; }
488
+
489
+ .ofs-topo-group-head { display: flex; justify-content: space-between; align-items: center; font-size: 11px; font-weight: 700; color: var(--ofs-text-primary); text-transform: uppercase; letter-spacing: 0.04em; }
490
+
491
+ .ofs-topo-list { list-style: none; margin: 4px 0 0; padding: 0; max-height: 220px; overflow-y: auto; }
492
+
493
+ .ofs-topo-issue { display: flex; align-items: center; gap: 6px; padding: 3px 4px; border-radius: 4px; cursor: pointer; }
494
+
495
+ .ofs-topo-issue:hover { background: rgba(148, 163, 184, 0.15); }
496
+
497
+ .ofs-topo-issue.error { border-left: 3px solid #e11d48; }
498
+
499
+ .ofs-topo-issue.warning { border-left: 3px solid #f59e0b; }
500
+
501
+ .ofs-topo-issue-text { flex: 1; font-size: 11px; line-height: 1.35; }
502
+
503
+ .ofs-attribute-table { color: var(--ofs-text-secondary); font-size: 12px; display: flex; flex-direction: column; gap: 8px; min-height: 0; }
504
+
505
+ .ofs-attr-header { display: flex; align-items: center; gap: 8px; }
506
+
507
+ .ofs-attr-title { font-size: 14px; font-weight: 700; color: var(--ofs-text-primary); }
508
+
509
+ .ofs-attr-header select { flex: 1; min-width: 0; background: rgba(15, 23, 42, 0.8); color: var(--ofs-text-primary); border: 1px solid var(--ofs-border-color); border-radius: 4px; padding: 2px 4px; }
510
+
511
+ .ofs-attr-toolbar { display: flex; align-items: center; gap: 6px; }
512
+
513
+ .ofs-attr-toolbar input[type='text'] { flex: 1; min-width: 0; background: rgba(15, 23, 42, 0.8); color: var(--ofs-text-primary); border: 1px solid var(--ofs-border-color); border-radius: 4px; padding: 3px 6px; font-size: 12px; }
514
+
515
+ .ofs-attr-check { display: flex; align-items: center; gap: 4px; white-space: nowrap; font-size: 11px; }
516
+
517
+ .ofs-attr-message { border-radius: 4px; padding: 6px 8px; font-size: 11px; background: rgba(59, 130, 246, 0.15); }
518
+
519
+ .ofs-attr-message.error { background: rgba(225, 29, 72, 0.18); color: #fecdd3; }
520
+
521
+ .ofs-attr-empty { color: var(--ofs-text-muted); font-size: 12px; }
522
+
523
+ .ofs-attr-scroll { overflow: auto; max-height: 45vh; border: 1px solid var(--ofs-border-color); border-radius: 6px; }
524
+
525
+ .ofs-attribute-table table { border-collapse: collapse; width: 100%; font-size: 11px; }
526
+
527
+ .ofs-attribute-table th { position: sticky; top: 0; background: rgba(15, 23, 42, 0.95); color: var(--ofs-text-primary); text-align: left; padding: 4px 6px; white-space: nowrap; cursor: pointer; border-bottom: 1px solid var(--ofs-border-color); }
528
+
529
+ .ofs-attribute-table td { padding: 3px 6px; border-bottom: 1px solid rgba(148, 163, 184, 0.12); max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
530
+
531
+ .ofs-attribute-table td.num { text-align: right; font-variant-numeric: tabular-nums; }
532
+
533
+ .ofs-attribute-table td.readonly { color: var(--ofs-text-muted); }
534
+
535
+ .ofs-attribute-table tr.selected { background: rgba(56, 189, 248, 0.18); }
536
+
537
+ .ofs-attribute-table tr:hover { background: rgba(148, 163, 184, 0.12); }
538
+
539
+ .ofs-attr-id { color: var(--ofs-text-muted); font-variant-numeric: tabular-nums; }
540
+
541
+ .ofs-attr-field-menu { background: none; border: none; color: var(--ofs-text-muted); cursor: pointer; font-size: 10px; padding: 0 2px; }
542
+
543
+ .ofs-attr-field-menu:hover { color: var(--ofs-text-primary); }
544
+
545
+ .ofs-attribute-table td.editing input, .ofs-attribute-table td.editing select { width: 100%; background: rgba(15, 23, 42, 0.95); color: var(--ofs-text-primary); border: 1px solid #38bdf8; border-radius: 3px; font-size: 11px; }
546
+
547
+ .ofs-attr-footer { display: flex; justify-content: space-between; align-items: center; font-size: 11px; color: var(--ofs-text-muted); }
548
+
549
+ .ofs-attr-pager { display: flex; align-items: center; gap: 6px; }
550
+
551
+ .ofs-attr-dialog { border: 1px solid var(--ofs-border-color); border-radius: 6px; padding: 8px; display: flex; flex-direction: column; gap: 6px; background: rgba(15, 23, 42, 0.6); }
552
+
553
+ .ofs-attr-dialog-title { font-weight: 700; color: var(--ofs-text-primary); }
554
+
555
+ .ofs-attr-row { display: flex; align-items: center; gap: 8px; }
556
+
557
+ .ofs-attr-row > span:first-child { flex: 0 0 90px; color: var(--ofs-text-muted); }
558
+
559
+ .ofs-attr-row input, .ofs-attr-row select, .ofs-attr-dialog textarea { flex: 1; min-width: 0; background: rgba(15, 23, 42, 0.8); color: var(--ofs-text-primary); border: 1px solid var(--ofs-border-color); border-radius: 4px; padding: 3px 6px; font-size: 12px; font-family: inherit; }
560
+
561
+ .ofs-attr-preview { font-size: 11px; color: #7dd3fc; min-height: 14px; }
562
+
563
+ .ofs-attr-help { font-size: 10px; color: var(--ofs-text-muted); max-height: 140px; overflow: auto; line-height: 1.5; }
564
+
565
+ .ofs-attr-dialog-actions { display: flex; gap: 8px; }