@everscribe/components-styles 0.1.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 (4) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +102 -0
  3. package/default.css +1316 -0
  4. package/package.json +39 -0
package/default.css ADDED
@@ -0,0 +1,1316 @@
1
+ /* @everscribe/components-styles - default theme.
2
+ *
3
+ * Customize via CSS variables on `.audit-trail-root`, or override class names
4
+ * directly. The full token surface is defined in the first block below.
5
+ *
6
+ * .my-app .audit-trail-root {
7
+ * --audit-trail-accent: #ff6b35;
8
+ * --audit-trail-radius: 10px;
9
+ * }
10
+ */
11
+
12
+ /* Tokens are shared between the inline component scope (.audit-trail-root) and
13
+ * the portal scope (.audit-trail-portal) used for modals. Modals render via
14
+ * createPortal(document.body), so they sit OUTSIDE .audit-trail-root and would
15
+ * otherwise lose every CSS variable. Theme overrides further down
16
+ * mirror the same structure. */
17
+ .audit-trail-root,
18
+ .audit-trail-portal {
19
+ /* ---- Color tokens (light theme defaults) ---- */
20
+ --audit-trail-bg: #ffffff;
21
+ --audit-trail-fg: #1f2328;
22
+ --audit-trail-fg-muted: #656d76;
23
+ --audit-trail-border: #d0d7de;
24
+ --audit-trail-border-strong: #afb8c1;
25
+ --audit-trail-surface: #f6f8fa;
26
+ --audit-trail-surface-hover: #eaeef2;
27
+ --audit-trail-accent: #0969da;
28
+ --audit-trail-accent-fg: #ffffff;
29
+ --audit-trail-danger: #cf222e;
30
+ --audit-trail-overlay: rgba(0, 0, 0, 0.5);
31
+
32
+ /* ---- Typography tokens ---- */
33
+ --audit-trail-font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
34
+ 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
35
+ --audit-trail-font-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas,
36
+ 'Liberation Mono', monospace;
37
+ --audit-trail-font-size: 14px;
38
+ --audit-trail-font-size-sm: 12px;
39
+ --audit-trail-line-height: 1.5;
40
+
41
+ /* ---- Spacing tokens ---- */
42
+ --audit-trail-spacing-xs: 4px;
43
+ --audit-trail-spacing-sm: 8px;
44
+ --audit-trail-spacing: 12px;
45
+ --audit-trail-spacing-lg: 16px;
46
+ --audit-trail-spacing-xl: 24px;
47
+
48
+ /* ---- Sizing & shape tokens ---- */
49
+ --audit-trail-radius-sm: 4px;
50
+ --audit-trail-radius: 6px;
51
+ --audit-trail-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
52
+ }
53
+
54
+ /* Component-scope styling. The .audit-trail-portal wrapper deliberately
55
+ * carries only the tokens - backgrounds and font come from its
56
+ * children (the modal cards) so the wrapper itself is invisible. */
57
+ .audit-trail-root {
58
+ font-family: var(--audit-trail-font-family);
59
+ font-size: var(--audit-trail-font-size);
60
+ line-height: var(--audit-trail-line-height);
61
+ color: var(--audit-trail-fg);
62
+ background: var(--audit-trail-bg);
63
+ position: relative;
64
+ box-sizing: border-box;
65
+ }
66
+
67
+ .audit-trail-root *,
68
+ .audit-trail-root *::before,
69
+ .audit-trail-root *::after,
70
+ .audit-trail-portal *,
71
+ .audit-trail-portal *::before,
72
+ .audit-trail-portal *::after {
73
+ box-sizing: border-box;
74
+ }
75
+
76
+ /* ---- Dark theme overrides ---- */
77
+ .audit-trail-root.audit-trail-theme-dark,
78
+ .audit-trail-portal.audit-trail-theme-dark {
79
+ --audit-trail-bg: #0d1117;
80
+ --audit-trail-fg: #c9d1d9;
81
+ --audit-trail-fg-muted: #8b949e;
82
+ --audit-trail-border: #30363d;
83
+ --audit-trail-border-strong: #484f58;
84
+ --audit-trail-surface: #161b22;
85
+ --audit-trail-surface-hover: #21262d;
86
+ --audit-trail-accent: #58a6ff;
87
+ --audit-trail-accent-fg: #ffffff;
88
+ --audit-trail-danger: #f85149;
89
+ --audit-trail-overlay: rgba(0, 0, 0, 0.7);
90
+ --audit-trail-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
91
+ }
92
+
93
+ /* ---- Toolbar ---- */
94
+ .audit-trail-toolbar {
95
+ display: flex;
96
+ align-items: center;
97
+ gap: var(--audit-trail-spacing);
98
+ padding: var(--audit-trail-spacing-sm) 0;
99
+ flex-wrap: wrap;
100
+ }
101
+
102
+ .audit-trail-toolbar-spacer {
103
+ flex: 1 1 auto;
104
+ }
105
+
106
+ /* On mobile, the toolbar stacks: Live on its own row, then each
107
+ * action button full-width. The spacer is unnecessary in column
108
+ * layout. */
109
+ @media (max-width: 600px) {
110
+ .audit-trail-toolbar {
111
+ flex-direction: column;
112
+ align-items: stretch;
113
+ }
114
+
115
+ .audit-trail-toolbar-spacer {
116
+ display: none;
117
+ }
118
+
119
+ .audit-trail-toolbar > .audit-trail-filter-toggle,
120
+ .audit-trail-toolbar > .audit-trail-button,
121
+ .audit-trail-toolbar > .audit-trail-picker,
122
+ .audit-trail-toolbar > .audit-trail-picker > .audit-trail-picker-summary {
123
+ width: 100%;
124
+ justify-content: center;
125
+ }
126
+ }
127
+
128
+ /* ---- Live indicator ---- */
129
+ .audit-trail-live {
130
+ display: inline-flex;
131
+ align-items: center;
132
+ gap: var(--audit-trail-spacing-xs);
133
+ font-size: var(--audit-trail-font-size-sm);
134
+ color: var(--audit-trail-fg-muted);
135
+ }
136
+
137
+ .audit-trail-live-dot {
138
+ width: 8px;
139
+ height: 8px;
140
+ border-radius: 50%;
141
+ background: #10b981;
142
+ box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.6);
143
+ animation: audit-trail-live-pulse 2s ease-out infinite;
144
+ }
145
+
146
+ @keyframes audit-trail-live-pulse {
147
+ 0% {
148
+ box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.6);
149
+ }
150
+ 70% {
151
+ box-shadow: 0 0 0 6px rgba(16, 185, 129, 0);
152
+ }
153
+ 100% {
154
+ box-shadow: 0 0 0 0 rgba(16, 185, 129, 0);
155
+ }
156
+ }
157
+
158
+ /* ---- Column picker (<details>) ---- */
159
+ .audit-trail-picker {
160
+ position: relative;
161
+ }
162
+
163
+ .audit-trail-picker-summary {
164
+ display: inline-flex;
165
+ align-items: center;
166
+ gap: var(--audit-trail-spacing-xs);
167
+ cursor: pointer;
168
+ list-style: none;
169
+ padding: var(--audit-trail-spacing-xs) var(--audit-trail-spacing);
170
+ border: 1px solid var(--audit-trail-border);
171
+ border-radius: var(--audit-trail-radius-sm);
172
+ background: var(--audit-trail-surface);
173
+ color: var(--audit-trail-fg);
174
+ font: inherit;
175
+ user-select: none;
176
+ }
177
+
178
+ .audit-trail-picker-summary::-webkit-details-marker {
179
+ display: none;
180
+ }
181
+
182
+ .audit-trail-picker-summary::after {
183
+ content: '▾';
184
+ color: var(--audit-trail-fg-muted);
185
+ font-size: 10px;
186
+ }
187
+
188
+ .audit-trail-picker[open] .audit-trail-picker-summary::after {
189
+ content: '▴';
190
+ }
191
+
192
+ .audit-trail-picker-summary:hover {
193
+ background: var(--audit-trail-surface-hover);
194
+ }
195
+
196
+ .audit-trail-picker-summary:focus-visible {
197
+ outline: 2px solid var(--audit-trail-accent);
198
+ outline-offset: 2px;
199
+ }
200
+
201
+ .audit-trail-picker-content {
202
+ position: absolute;
203
+ top: calc(100% + 4px);
204
+ left: 0;
205
+ z-index: 10;
206
+ min-width: 200px;
207
+ max-height: 320px;
208
+ overflow-y: auto;
209
+ padding: var(--audit-trail-spacing-xs);
210
+ background: var(--audit-trail-bg);
211
+ border: 1px solid var(--audit-trail-border);
212
+ border-radius: var(--audit-trail-radius);
213
+ box-shadow: var(--audit-trail-shadow);
214
+ }
215
+
216
+ .audit-trail-picker-item {
217
+ display: flex;
218
+ align-items: center;
219
+ gap: var(--audit-trail-spacing-sm);
220
+ padding: var(--audit-trail-spacing-xs) var(--audit-trail-spacing-sm);
221
+ cursor: pointer;
222
+ border-radius: var(--audit-trail-radius-sm);
223
+ font-size: var(--audit-trail-font-size);
224
+ }
225
+
226
+ .audit-trail-picker-item:hover {
227
+ background: var(--audit-trail-surface);
228
+ }
229
+
230
+ .audit-trail-picker-item input[type='checkbox'] {
231
+ accent-color: var(--audit-trail-accent);
232
+ margin: 0;
233
+ }
234
+
235
+ /* ---- Filters panel ---- */
236
+ .audit-trail-filter-toggle {
237
+ display: inline-flex;
238
+ align-items: center;
239
+ gap: var(--audit-trail-spacing-xs);
240
+ padding: var(--audit-trail-spacing-xs) var(--audit-trail-spacing);
241
+ border: 1px solid var(--audit-trail-border);
242
+ border-radius: var(--audit-trail-radius-sm);
243
+ background: var(--audit-trail-surface);
244
+ color: var(--audit-trail-fg);
245
+ font: inherit;
246
+ cursor: pointer;
247
+ }
248
+
249
+ .audit-trail-filter-toggle:hover {
250
+ background: var(--audit-trail-surface-hover);
251
+ }
252
+
253
+ .audit-trail-filter-toggle:focus-visible {
254
+ outline: 2px solid var(--audit-trail-accent);
255
+ outline-offset: 2px;
256
+ }
257
+
258
+ .audit-trail-filter-toggle-badge {
259
+ display: inline-flex;
260
+ align-items: center;
261
+ justify-content: center;
262
+ min-width: 14px;
263
+ height: 14px;
264
+ padding: 0 4px;
265
+ border-radius: 7px;
266
+ background: var(--audit-trail-accent);
267
+ color: #fff;
268
+ font-size: 10px;
269
+ font-weight: 600;
270
+ line-height: 1;
271
+ }
272
+
273
+ .audit-trail-filter-toggle-caret {
274
+ color: var(--audit-trail-fg-muted);
275
+ font-size: 13px;
276
+ line-height: 1;
277
+ }
278
+
279
+ .audit-trail-filter-panel {
280
+ display: flex;
281
+ flex-direction: column;
282
+ gap: var(--audit-trail-spacing-sm);
283
+ margin-bottom: var(--audit-trail-spacing);
284
+ padding: var(--audit-trail-spacing);
285
+ border: 1px solid var(--audit-trail-border);
286
+ border-radius: var(--audit-trail-radius);
287
+ background: var(--audit-trail-bg);
288
+ }
289
+
290
+ .audit-trail-filter-tabs {
291
+ display: inline-flex;
292
+ gap: var(--audit-trail-spacing-xs);
293
+ flex-wrap: wrap;
294
+ }
295
+
296
+ .audit-trail-filter-tab {
297
+ padding: var(--audit-trail-spacing-xs) var(--audit-trail-spacing-sm);
298
+ border: 1px solid var(--audit-trail-border);
299
+ border-radius: var(--audit-trail-radius-sm);
300
+ background: var(--audit-trail-surface);
301
+ color: var(--audit-trail-fg);
302
+ font: inherit;
303
+ font-size: var(--audit-trail-font-size-sm);
304
+ cursor: pointer;
305
+ }
306
+
307
+ .audit-trail-filter-tab:hover {
308
+ background: var(--audit-trail-surface-hover);
309
+ }
310
+
311
+ .audit-trail-filter-tab:focus-visible {
312
+ outline: 2px solid var(--audit-trail-accent);
313
+ outline-offset: 2px;
314
+ }
315
+
316
+ .audit-trail-filter-tab-selected {
317
+ background: var(--audit-trail-accent);
318
+ color: #fff;
319
+ border-color: var(--audit-trail-accent);
320
+ }
321
+
322
+ .audit-trail-filter-tab-selected:hover {
323
+ background: var(--audit-trail-accent);
324
+ }
325
+
326
+ .audit-trail-filter-row {
327
+ display: flex;
328
+ flex-wrap: wrap;
329
+ gap: var(--audit-trail-spacing-sm);
330
+ }
331
+
332
+ .audit-trail-filter-field {
333
+ display: inline-flex;
334
+ flex-direction: column;
335
+ gap: 2px;
336
+ font-size: var(--audit-trail-font-size-sm);
337
+ }
338
+
339
+ .audit-trail-filter-field-label {
340
+ color: var(--audit-trail-fg-muted);
341
+ font-size: 11px;
342
+ }
343
+
344
+ .audit-trail-filter-input {
345
+ padding: var(--audit-trail-spacing-xs) var(--audit-trail-spacing-sm);
346
+ border: 1px solid var(--audit-trail-border);
347
+ border-radius: var(--audit-trail-radius-sm);
348
+ background: var(--audit-trail-surface);
349
+ color: var(--audit-trail-fg);
350
+ font: inherit;
351
+ font-size: var(--audit-trail-font-size-sm);
352
+ }
353
+
354
+ .audit-trail-filter-input:focus-visible {
355
+ outline: 2px solid var(--audit-trail-accent);
356
+ outline-offset: 2px;
357
+ }
358
+
359
+ .audit-trail-filter-actor-input {
360
+ flex: 1 1 auto;
361
+ min-width: 200px;
362
+ }
363
+
364
+ /* Free-text filters that live alone on their own row (Target ID,
365
+ * Origin IP). Grow to fill the row width so they don't look stunted
366
+ * next to the wider select dropdowns above. */
367
+ .audit-trail-filter-wide-input {
368
+ flex: 1 1 auto;
369
+ width: 100%;
370
+ }
371
+
372
+ /* On mobile, stack each select/input in the filter rows so they each
373
+ * occupy a full row. The default flex layout would otherwise crowd
374
+ * them edge-to-edge with little touch target. */
375
+ @media (max-width: 600px) {
376
+ .audit-trail-filter-row {
377
+ flex-direction: column;
378
+ align-items: stretch;
379
+ }
380
+
381
+ .audit-trail-filter-row > * {
382
+ width: 100%;
383
+ }
384
+
385
+ .audit-trail-filter-actor-input {
386
+ min-width: 0;
387
+ }
388
+
389
+ .audit-trail-filter-field {
390
+ display: flex;
391
+ }
392
+ }
393
+
394
+ .audit-trail-filter-select {
395
+ padding: var(--audit-trail-spacing-xs) var(--audit-trail-spacing-sm);
396
+ border: 1px solid var(--audit-trail-border);
397
+ border-radius: var(--audit-trail-radius-sm);
398
+ background: var(--audit-trail-surface);
399
+ color: var(--audit-trail-fg);
400
+ font: inherit;
401
+ font-size: var(--audit-trail-font-size-sm);
402
+ cursor: pointer;
403
+ }
404
+
405
+ .audit-trail-filter-select:hover {
406
+ background: var(--audit-trail-surface-hover);
407
+ }
408
+
409
+ .audit-trail-filter-select:focus-visible {
410
+ outline: 2px solid var(--audit-trail-accent);
411
+ outline-offset: 2px;
412
+ }
413
+
414
+ .audit-trail-filter-actions {
415
+ display: flex;
416
+ gap: var(--audit-trail-spacing-sm);
417
+ }
418
+
419
+ .audit-trail-button-secondary {
420
+ background: transparent;
421
+ }
422
+
423
+ .audit-trail-button:disabled {
424
+ opacity: 0.5;
425
+ cursor: not-allowed;
426
+ }
427
+
428
+ /* ---- Status pill (result column) ---- */
429
+ .audit-trail-status {
430
+ display: inline-block;
431
+ padding: 2px 8px;
432
+ border-radius: 9999px;
433
+ font-size: 11px;
434
+ font-weight: 500;
435
+ background: var(--audit-trail-surface);
436
+ color: var(--audit-trail-fg);
437
+ }
438
+
439
+ .audit-trail-status-ok {
440
+ background: #d1fae5;
441
+ color: #065f46;
442
+ }
443
+
444
+ .audit-trail-status-error,
445
+ .audit-trail-status-failed,
446
+ .audit-trail-status-failure {
447
+ background: #fee2e2;
448
+ color: #991b1b;
449
+ }
450
+
451
+ .audit-trail-cell-presence {
452
+ color: var(--audit-trail-accent);
453
+ font-size: var(--audit-trail-font-size-sm);
454
+ }
455
+
456
+ /* ---- Export modal ---- */
457
+ .audit-trail-export-backdrop {
458
+ position: fixed;
459
+ inset: 0;
460
+ z-index: 1100;
461
+ display: flex;
462
+ align-items: center;
463
+ justify-content: center;
464
+ padding: var(--audit-trail-spacing);
465
+ background: var(--audit-trail-overlay);
466
+ animation: audit-trail-fade-in 0.15s ease;
467
+ }
468
+
469
+ .audit-trail-export-modal {
470
+ display: flex;
471
+ flex-direction: column;
472
+ gap: var(--audit-trail-spacing);
473
+ width: 100%;
474
+ max-width: 540px;
475
+ padding: var(--audit-trail-spacing-lg);
476
+ border: 1px solid var(--audit-trail-border);
477
+ border-radius: var(--audit-trail-radius);
478
+ background: var(--audit-trail-bg);
479
+ box-shadow: var(--audit-trail-shadow);
480
+ }
481
+
482
+ .audit-trail-export-title {
483
+ margin: 0;
484
+ font-size: 16px;
485
+ font-weight: 600;
486
+ color: var(--audit-trail-fg);
487
+ }
488
+
489
+ .audit-trail-export-blurb {
490
+ margin: 0;
491
+ color: var(--audit-trail-fg-muted);
492
+ font-size: var(--audit-trail-font-size-sm);
493
+ line-height: 1.4;
494
+ }
495
+
496
+ .audit-trail-export-options {
497
+ display: grid;
498
+ grid-template-columns: 1fr 1fr;
499
+ gap: var(--audit-trail-spacing);
500
+ }
501
+
502
+ @media (max-width: 480px) {
503
+ .audit-trail-export-options {
504
+ grid-template-columns: 1fr;
505
+ }
506
+ }
507
+
508
+ .audit-trail-export-card {
509
+ display: flex;
510
+ flex-direction: column;
511
+ gap: var(--audit-trail-spacing-xs);
512
+ padding: var(--audit-trail-spacing);
513
+ text-align: left;
514
+ border: 1px solid var(--audit-trail-border);
515
+ border-radius: var(--audit-trail-radius-sm);
516
+ background: var(--audit-trail-surface);
517
+ color: var(--audit-trail-fg);
518
+ font: inherit;
519
+ cursor: pointer;
520
+ }
521
+
522
+ .audit-trail-export-card:hover {
523
+ background: var(--audit-trail-surface-hover);
524
+ }
525
+
526
+ .audit-trail-export-card:focus-visible {
527
+ outline: 2px solid var(--audit-trail-accent);
528
+ outline-offset: 2px;
529
+ }
530
+
531
+ .audit-trail-export-card-selected {
532
+ border-color: var(--audit-trail-accent);
533
+ box-shadow: 0 0 0 1px var(--audit-trail-accent) inset;
534
+ }
535
+
536
+ .audit-trail-export-card-title {
537
+ font-weight: 600;
538
+ font-size: var(--audit-trail-font-size);
539
+ }
540
+
541
+ .audit-trail-export-card-body {
542
+ color: var(--audit-trail-fg-muted);
543
+ font-size: var(--audit-trail-font-size-sm);
544
+ line-height: 1.4;
545
+ }
546
+
547
+ .audit-trail-export-error {
548
+ padding: var(--audit-trail-spacing-sm);
549
+ border: 1px solid var(--audit-trail-border);
550
+ border-radius: var(--audit-trail-radius-sm);
551
+ background: var(--audit-trail-surface);
552
+ color: var(--audit-trail-fg);
553
+ font-size: var(--audit-trail-font-size-sm);
554
+ }
555
+
556
+ .audit-trail-export-actions {
557
+ display: flex;
558
+ justify-content: flex-end;
559
+ gap: var(--audit-trail-spacing-sm);
560
+ }
561
+
562
+ /* ---- Table ---- */
563
+ .audit-trail-table-wrap {
564
+ width: 100%;
565
+ overflow-x: auto;
566
+ -webkit-overflow-scrolling: touch;
567
+ }
568
+
569
+ /* On mobile, swap the table for a card list. Each <tr> becomes a card
570
+ * and each <td> renders its column label via ::before (sourced from
571
+ * the data-label attribute the row emits). The wrap stops being a
572
+ * scroll container because cards fit the viewport naturally. */
573
+ @media (max-width: 600px) {
574
+ .audit-trail-table-wrap {
575
+ overflow-x: visible;
576
+ }
577
+
578
+ .audit-trail-table,
579
+ .audit-trail-table thead,
580
+ .audit-trail-table tbody,
581
+ .audit-trail-table tr,
582
+ .audit-trail-table td {
583
+ display: block;
584
+ }
585
+
586
+ .audit-trail-table {
587
+ border: none;
588
+ background: transparent;
589
+ }
590
+
591
+ .audit-trail-table thead {
592
+ display: none;
593
+ }
594
+
595
+ .audit-trail-table tr {
596
+ margin-bottom: var(--audit-trail-spacing-sm);
597
+ padding: var(--audit-trail-spacing);
598
+ border: 1px solid var(--audit-trail-border);
599
+ border-radius: var(--audit-trail-radius);
600
+ background: var(--audit-trail-bg);
601
+ }
602
+
603
+ .audit-trail-table tbody tr:last-child {
604
+ margin-bottom: 0;
605
+ }
606
+
607
+ .audit-trail-table td {
608
+ padding: var(--audit-trail-spacing-xs) 0;
609
+ border-bottom: none;
610
+ max-width: none;
611
+ overflow: visible;
612
+ text-overflow: clip;
613
+ white-space: normal;
614
+ }
615
+
616
+ .audit-trail-table td::before {
617
+ content: attr(data-label) ': ';
618
+ color: var(--audit-trail-fg-muted);
619
+ font-family: var(--audit-trail-font-family);
620
+ margin-right: var(--audit-trail-spacing-xs);
621
+ }
622
+
623
+ /* Cells whose renderer produced no value would otherwise show as a
624
+ * stray "Label:" line. Drop them entirely. */
625
+ .audit-trail-table td:empty {
626
+ display: none;
627
+ }
628
+ }
629
+
630
+ .audit-trail-table {
631
+ width: 100%;
632
+ border-collapse: collapse;
633
+ border: 1px solid var(--audit-trail-border);
634
+ border-radius: var(--audit-trail-radius);
635
+ overflow: hidden;
636
+ background: var(--audit-trail-bg);
637
+ }
638
+
639
+ .audit-trail-table th,
640
+ .audit-trail-table td {
641
+ text-align: left;
642
+ padding: var(--audit-trail-spacing-sm) var(--audit-trail-spacing);
643
+ border-bottom: 1px solid var(--audit-trail-border);
644
+ vertical-align: top;
645
+ }
646
+
647
+ .audit-trail-table tbody tr:last-child td {
648
+ border-bottom: none;
649
+ }
650
+
651
+ .audit-trail-th {
652
+ background: var(--audit-trail-surface);
653
+ font-weight: 600;
654
+ font-size: var(--audit-trail-font-size-sm);
655
+ color: var(--audit-trail-fg-muted);
656
+ text-transform: uppercase;
657
+ letter-spacing: 0.05em;
658
+ white-space: nowrap;
659
+ }
660
+
661
+ .audit-trail-row {
662
+ cursor: pointer;
663
+ }
664
+
665
+ .audit-trail-row:hover {
666
+ background: var(--audit-trail-surface);
667
+ }
668
+
669
+ .audit-trail-row:focus-visible {
670
+ outline: 2px solid var(--audit-trail-accent);
671
+ outline-offset: -2px;
672
+ }
673
+
674
+ .audit-trail-cell {
675
+ max-width: 360px;
676
+ overflow: hidden;
677
+ text-overflow: ellipsis;
678
+ }
679
+
680
+ .audit-trail-cell-occurred_at {
681
+ font-variant-numeric: tabular-nums;
682
+ color: var(--audit-trail-fg-muted);
683
+ white-space: nowrap;
684
+ }
685
+
686
+ .audit-trail-cell-action,
687
+ .audit-trail-cell-id,
688
+ .audit-trail-cell-idempotency_key {
689
+ font-family: var(--audit-trail-font-mono);
690
+ font-size: var(--audit-trail-font-size-sm);
691
+ }
692
+
693
+ .audit-trail-cell-id {
694
+ color: var(--audit-trail-fg-muted);
695
+ }
696
+
697
+ /* ---- States ---- */
698
+ .audit-trail-state {
699
+ display: flex;
700
+ flex-direction: column;
701
+ align-items: center;
702
+ gap: var(--audit-trail-spacing);
703
+ padding: var(--audit-trail-spacing-xl);
704
+ text-align: center;
705
+ color: var(--audit-trail-fg-muted);
706
+ border: 1px dashed var(--audit-trail-border);
707
+ border-radius: var(--audit-trail-radius);
708
+ }
709
+
710
+ .audit-trail-state-error {
711
+ color: var(--audit-trail-danger);
712
+ border-color: var(--audit-trail-danger);
713
+ }
714
+
715
+ /* ---- Buttons ---- */
716
+ .audit-trail-button {
717
+ padding: var(--audit-trail-spacing-xs) var(--audit-trail-spacing);
718
+ border: 1px solid var(--audit-trail-border);
719
+ border-radius: var(--audit-trail-radius-sm);
720
+ background: var(--audit-trail-surface);
721
+ color: var(--audit-trail-fg);
722
+ font: inherit;
723
+ cursor: pointer;
724
+ }
725
+
726
+ .audit-trail-button:hover {
727
+ background: var(--audit-trail-surface-hover);
728
+ }
729
+
730
+ .audit-trail-button:focus-visible {
731
+ outline: 2px solid var(--audit-trail-accent);
732
+ outline-offset: 2px;
733
+ }
734
+
735
+ .audit-trail-load-more {
736
+ display: block;
737
+ margin: var(--audit-trail-spacing) auto;
738
+ }
739
+
740
+ /* ---- Inspect Event modal ---- */
741
+ .audit-trail-inspect-backdrop {
742
+ position: fixed;
743
+ inset: 0;
744
+ z-index: 1000;
745
+ display: flex;
746
+ /* safe center keeps the modal centered when it fits and falls back
747
+ * to flex-start when the modal is taller than the viewport, so the
748
+ * top of the modal stays reachable while the backdrop scrolls. */
749
+ align-items: safe center;
750
+ justify-content: center;
751
+ padding: var(--audit-trail-spacing);
752
+ overflow-y: auto;
753
+ background: var(--audit-trail-overlay);
754
+ animation: audit-trail-fade-in 0.15s ease;
755
+ }
756
+
757
+ .audit-trail-inspect-modal {
758
+ position: relative;
759
+ display: flex;
760
+ flex-direction: column;
761
+ gap: var(--audit-trail-spacing-sm);
762
+ width: min(720px, 100%);
763
+ padding: var(--audit-trail-spacing-xl);
764
+ border: 1px solid var(--audit-trail-border);
765
+ border-radius: var(--audit-trail-radius);
766
+ background: var(--audit-trail-bg);
767
+ color: var(--audit-trail-fg);
768
+ font-family: var(--audit-trail-font-family);
769
+ font-size: var(--audit-trail-font-size);
770
+ box-shadow: var(--audit-trail-shadow);
771
+ }
772
+
773
+ .audit-trail-inspect-close {
774
+ position: absolute;
775
+ top: var(--audit-trail-spacing-sm);
776
+ right: var(--audit-trail-spacing-sm);
777
+ width: 32px;
778
+ height: 32px;
779
+ padding: 0;
780
+ border: none;
781
+ border-radius: var(--audit-trail-radius-sm);
782
+ background: none;
783
+ color: var(--audit-trail-fg-muted);
784
+ font-size: 24px;
785
+ line-height: 1;
786
+ cursor: pointer;
787
+ }
788
+
789
+ .audit-trail-inspect-close:hover {
790
+ background: var(--audit-trail-surface);
791
+ color: var(--audit-trail-fg);
792
+ }
793
+
794
+ .audit-trail-inspect-close:focus-visible {
795
+ outline: 2px solid var(--audit-trail-accent);
796
+ outline-offset: 2px;
797
+ }
798
+
799
+ .audit-trail-inspect-title {
800
+ margin: 0;
801
+ font-size: 18px;
802
+ font-weight: 600;
803
+ color: var(--audit-trail-fg);
804
+ padding-right: 32px; /* leave room for the absolute-positioned close button */
805
+ }
806
+
807
+ .audit-trail-inspect-subtitle {
808
+ margin: 0;
809
+ color: var(--audit-trail-fg-muted);
810
+ font-size: var(--audit-trail-font-size-sm);
811
+ word-break: break-all;
812
+ display: flex;
813
+ flex-direction: column;
814
+ gap: 2px;
815
+ }
816
+
817
+ .audit-trail-inspect-subtitle-line {
818
+ display: block;
819
+ }
820
+
821
+ .audit-trail-inspect-subtitle code {
822
+ font-family: var(--audit-trail-font-mono);
823
+ }
824
+
825
+ .audit-trail-inspect-tabs {
826
+ display: flex;
827
+ gap: var(--audit-trail-spacing-xs);
828
+ border-bottom: 1px solid var(--audit-trail-border);
829
+ }
830
+
831
+ .audit-trail-inspect-tab {
832
+ /* margin-bottom: -1px lets the tab's 2px bottom border overlap the
833
+ * row's 1px bottom border so the active indicator visually "joins"
834
+ * the divider instead of stacking next to it. border-radius: 0
835
+ * neutralizes the UA default on <button> - without it the bottom
836
+ * corners look rounded under the colored indicator. */
837
+ margin: 0 0 -1px;
838
+ padding: var(--audit-trail-spacing-sm) var(--audit-trail-spacing);
839
+ border: none;
840
+ border-bottom: 2px solid transparent;
841
+ border-radius: 0;
842
+ background: none;
843
+ color: var(--audit-trail-fg-muted);
844
+ font: inherit;
845
+ font-weight: 500;
846
+ cursor: pointer;
847
+ transition: color 0.15s, border-color 0.15s;
848
+ }
849
+
850
+ .audit-trail-inspect-tab:hover {
851
+ color: var(--audit-trail-fg);
852
+ border-bottom-color: var(--audit-trail-border);
853
+ }
854
+
855
+ .audit-trail-inspect-tab:focus-visible {
856
+ outline: 2px solid var(--audit-trail-accent);
857
+ outline-offset: 2px;
858
+ }
859
+
860
+ .audit-trail-inspect-tab-active,
861
+ .audit-trail-inspect-tab-active:hover {
862
+ color: var(--audit-trail-accent);
863
+ border-bottom-color: var(--audit-trail-accent);
864
+ }
865
+
866
+ .audit-trail-inspect-panel {
867
+ /* The panel sizes to its content; the backdrop scrolls when the
868
+ * modal exceeds the viewport. The Raw tab's code block expands to
869
+ * show the full event JSON without an inner scrollbar. */
870
+ min-height: 0;
871
+ }
872
+
873
+ /* ---- Raw JSON code block ---- */
874
+ .audit-trail-code-block-wrap {
875
+ position: relative;
876
+ }
877
+
878
+ .audit-trail-code-block {
879
+ margin: 0;
880
+ padding: var(--audit-trail-spacing);
881
+ border-radius: var(--audit-trail-radius-sm);
882
+ background: #1f2937;
883
+ color: #e5e7eb;
884
+ font-family: var(--audit-trail-font-mono);
885
+ font-size: 13px;
886
+ line-height: 1.5;
887
+ white-space: pre;
888
+ overflow: auto;
889
+ }
890
+
891
+ .audit-trail-code-block code {
892
+ font: inherit;
893
+ background: none;
894
+ color: inherit;
895
+ }
896
+
897
+ .audit-trail-copy-button {
898
+ position: absolute;
899
+ top: var(--audit-trail-spacing-sm);
900
+ right: var(--audit-trail-spacing-sm);
901
+ display: inline-flex;
902
+ align-items: center;
903
+ justify-content: center;
904
+ width: 28px;
905
+ height: 28px;
906
+ padding: 0;
907
+ border: 1px solid rgba(255, 255, 255, 0.15);
908
+ border-radius: var(--audit-trail-radius-sm);
909
+ background: rgba(255, 255, 255, 0.05);
910
+ color: #e5e7eb;
911
+ cursor: pointer;
912
+ }
913
+
914
+ .audit-trail-copy-button:hover {
915
+ background: rgba(255, 255, 255, 0.12);
916
+ }
917
+
918
+ .audit-trail-copy-button:focus-visible {
919
+ outline: 2px solid var(--audit-trail-accent);
920
+ outline-offset: 2px;
921
+ }
922
+
923
+ /* ---- Diff table ---- */
924
+ .audit-trail-diff-wrap {
925
+ border: 1px solid var(--audit-trail-border);
926
+ border-radius: var(--audit-trail-radius-sm);
927
+ overflow: auto;
928
+ }
929
+
930
+ .audit-trail-diff-table {
931
+ width: 100%;
932
+ border-collapse: collapse;
933
+ font-family: var(--audit-trail-font-mono);
934
+ font-size: 13px;
935
+ }
936
+
937
+ .audit-trail-diff-table th {
938
+ padding: var(--audit-trail-spacing-sm) var(--audit-trail-spacing);
939
+ text-align: left;
940
+ background: var(--audit-trail-surface);
941
+ color: var(--audit-trail-fg-muted);
942
+ text-transform: uppercase;
943
+ letter-spacing: 0.05em;
944
+ font-size: 11px;
945
+ font-weight: 600;
946
+ border-bottom: 1px solid var(--audit-trail-border);
947
+ }
948
+
949
+ .audit-trail-diff-cell {
950
+ width: 50%;
951
+ vertical-align: top;
952
+ padding: 0;
953
+ }
954
+
955
+ .audit-trail-diff-cell pre {
956
+ margin: 0;
957
+ padding: 2px var(--audit-trail-spacing);
958
+ white-space: pre-wrap;
959
+ word-break: break-word;
960
+ font: inherit;
961
+ }
962
+
963
+ .audit-trail-diff-before-removed {
964
+ background: #fee2e2;
965
+ color: #991b1b;
966
+ }
967
+
968
+ .audit-trail-diff-after-added {
969
+ background: #d1fae5;
970
+ color: #065f46;
971
+ }
972
+
973
+ .audit-trail-diff-before-blank,
974
+ .audit-trail-diff-after-blank {
975
+ background: var(--audit-trail-surface);
976
+ }
977
+
978
+ /* ---- Animations ---- */
979
+ @keyframes audit-trail-fade-in {
980
+ from {
981
+ opacity: 0;
982
+ }
983
+ to {
984
+ opacity: 1;
985
+ }
986
+ }
987
+
988
+ @media (prefers-reduced-motion: reduce) {
989
+ .audit-trail-inspect-backdrop {
990
+ animation: none;
991
+ }
992
+ }
993
+
994
+ /* ============================================================
995
+ Filter mode tabs (AI / Filters / Query). Sit at the top of
996
+ the filter panel; underline indicates the active mode.
997
+ ============================================================ */
998
+ .audit-trail-filter-modes {
999
+ display: flex;
1000
+ gap: 0.25rem;
1001
+ border-bottom: 1px solid var(--audit-trail-border, #e5e7eb);
1002
+ margin: 0 0 0.75rem;
1003
+ }
1004
+ .audit-trail-filter-mode {
1005
+ background: transparent;
1006
+ border: none;
1007
+ color: var(--audit-trail-fg-muted, #6b7280);
1008
+ font-size: 0.875rem;
1009
+ font-weight: 500;
1010
+ padding: 0.5rem 0.875rem;
1011
+ margin: 0 0 -1px;
1012
+ border-bottom: 2px solid transparent;
1013
+ border-radius: 0;
1014
+ cursor: pointer;
1015
+ transition: color 0.15s, border-color 0.15s;
1016
+ }
1017
+ .audit-trail-filter-mode:hover {
1018
+ color: var(--audit-trail-fg, #111827);
1019
+ border-bottom-color: var(--audit-trail-border, #e5e7eb);
1020
+ }
1021
+ .audit-trail-filter-mode-selected,
1022
+ .audit-trail-filter-mode-selected:hover {
1023
+ color: var(--audit-trail-accent, #2563eb);
1024
+ border-bottom-color: var(--audit-trail-accent, #2563eb);
1025
+ }
1026
+
1027
+ .audit-trail-filter-tab-panel {
1028
+ display: flex;
1029
+ flex-direction: column;
1030
+ gap: 0.75rem;
1031
+ }
1032
+
1033
+ /* ============================================================
1034
+ AI tab - NLP form, translation banner, unsupported list.
1035
+ ============================================================ */
1036
+ .audit-trail-nlp-form {
1037
+ display: flex;
1038
+ flex-direction: column;
1039
+ gap: 0.5rem;
1040
+ }
1041
+ .audit-trail-nlp-label {
1042
+ display: flex;
1043
+ align-items: center;
1044
+ gap: 0.5rem;
1045
+ font-size: 0.875rem;
1046
+ color: var(--audit-trail-fg-muted, #6b7280);
1047
+ }
1048
+ .audit-trail-nlp-input {
1049
+ display: block;
1050
+ width: 100%;
1051
+ padding: 0.5rem 0.75rem;
1052
+ font-size: 0.875rem;
1053
+ border: 1px solid var(--audit-trail-border, #d1d5db);
1054
+ border-radius: 6px;
1055
+ background: var(--audit-trail-bg, #fff);
1056
+ color: var(--audit-trail-fg, #111827);
1057
+ }
1058
+ .audit-trail-nlp-input:disabled {
1059
+ opacity: 0.65;
1060
+ }
1061
+
1062
+ .audit-trail-badge {
1063
+ display: inline-flex;
1064
+ align-items: center;
1065
+ font-size: 0.75rem;
1066
+ font-weight: 500;
1067
+ padding: 0.05rem 0.4rem;
1068
+ line-height: 1.4;
1069
+ border-radius: 9999px;
1070
+ }
1071
+ .audit-trail-badge-info {
1072
+ background: var(--audit-trail-info-bg, #dbeafe);
1073
+ color: var(--audit-trail-info-fg, #1d4ed8);
1074
+ }
1075
+
1076
+ .audit-trail-nlp-banner {
1077
+ position: relative;
1078
+ margin-top: 0.25rem;
1079
+ padding: 0.625rem 0.875rem;
1080
+ border: 1px solid var(--audit-trail-border, #e5e7eb);
1081
+ border-radius: 6px;
1082
+ background: var(--audit-trail-surface-2, #f9fafb);
1083
+ font-size: 0.8125rem;
1084
+ }
1085
+ .audit-trail-nlp-banner p {
1086
+ margin: 0;
1087
+ }
1088
+ .audit-trail-nlp-translated {
1089
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
1090
+ font-size: 0.8125rem;
1091
+ padding: 0.05rem 0.3rem;
1092
+ background: var(--audit-trail-bg, #ffffff);
1093
+ border: 1px solid var(--audit-trail-border, #e5e7eb);
1094
+ border-radius: 4px;
1095
+ color: var(--audit-trail-fg, #111827);
1096
+ }
1097
+
1098
+ .audit-trail-error {
1099
+ margin: 0.25rem 0 0;
1100
+ padding: 0.625rem 0.875rem;
1101
+ border-radius: 6px;
1102
+ background: var(--audit-trail-error-bg, #fee2e2);
1103
+ color: var(--audit-trail-error-fg, #991b1b);
1104
+ font-size: 0.8125rem;
1105
+ }
1106
+ .audit-trail-nlp-unsupported ul {
1107
+ margin: 0;
1108
+ padding-left: 1.25rem;
1109
+ }
1110
+ .audit-trail-nlp-unsupported li {
1111
+ margin: 0;
1112
+ }
1113
+
1114
+ /* ============================================================
1115
+ Query tab - DSL input + Search button.
1116
+ ============================================================ */
1117
+ .audit-trail-query-form {
1118
+ display: flex;
1119
+ flex-direction: column;
1120
+ gap: 0.5rem;
1121
+ }
1122
+ .audit-trail-query-label {
1123
+ display: block;
1124
+ font-size: 0.875rem;
1125
+ color: var(--audit-trail-fg-muted, #6b7280);
1126
+ }
1127
+ .audit-trail-query-label a {
1128
+ color: inherit;
1129
+ text-decoration: underline;
1130
+ }
1131
+ .audit-trail-query-input {
1132
+ display: block;
1133
+ width: 100%;
1134
+ padding: 0.5rem 0.75rem;
1135
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
1136
+ font-size: 0.875rem;
1137
+ border: 1px solid var(--audit-trail-border, #d1d5db);
1138
+ border-radius: 6px;
1139
+ background: var(--audit-trail-bg, #fff);
1140
+ color: var(--audit-trail-fg, #111827);
1141
+ }
1142
+
1143
+ .audit-trail-filter-actions {
1144
+ display: flex;
1145
+ margin-top: 0.25rem;
1146
+ }
1147
+
1148
+ /* In-button spinner - mirrors the dashboard's loading affordance.
1149
+ Used while the AI tab waits on the LLM round-trip. */
1150
+ .audit-trail-button-spinner {
1151
+ display: inline-block;
1152
+ width: 12px;
1153
+ height: 12px;
1154
+ border: 2px solid currentColor;
1155
+ border-right-color: transparent;
1156
+ border-radius: 50%;
1157
+ animation: audit-trail-btn-spin 0.6s linear infinite;
1158
+ vertical-align: -1px;
1159
+ margin-right: 0.375rem;
1160
+ }
1161
+ @keyframes audit-trail-btn-spin {
1162
+ to { transform: rotate(360deg); }
1163
+ }
1164
+
1165
+ /* ============================================================
1166
+ Active filter chips. Sits above the filter panel; one chip
1167
+ per active column filter + one per parsed DSL clause.
1168
+ ============================================================ */
1169
+ .audit-trail-filter-chips-row {
1170
+ display: flex;
1171
+ flex-wrap: wrap;
1172
+ align-items: center;
1173
+ gap: 0.5rem;
1174
+ margin: 0 0 0.75rem;
1175
+ }
1176
+ .audit-trail-filter-chips {
1177
+ display: flex;
1178
+ flex-wrap: wrap;
1179
+ gap: 0.375rem;
1180
+ flex: 1;
1181
+ }
1182
+ .audit-trail-filter-chip {
1183
+ display: inline-flex;
1184
+ align-items: center;
1185
+ gap: 0.25rem;
1186
+ padding: 0.25rem 0.5rem 0.25rem 0.625rem;
1187
+ border: 1px solid var(--audit-trail-border, #e5e7eb);
1188
+ border-radius: 9999px;
1189
+ background: var(--audit-trail-surface-2, #f9fafb);
1190
+ color: var(--audit-trail-fg, #111827);
1191
+ font-size: 0.8125rem;
1192
+ cursor: pointer;
1193
+ transition: background 0.15s, border-color 0.15s;
1194
+ }
1195
+ .audit-trail-filter-chip:hover {
1196
+ background: var(--audit-trail-bg, #fff);
1197
+ border-color: var(--audit-trail-fg-muted, #9ca3af);
1198
+ }
1199
+ .audit-trail-filter-chip-x {
1200
+ color: var(--audit-trail-fg-muted, #6b7280);
1201
+ font-size: 1rem;
1202
+ line-height: 1;
1203
+ }
1204
+ .audit-trail-button-text {
1205
+ background: transparent;
1206
+ border: none;
1207
+ color: var(--audit-trail-fg-muted, #6b7280);
1208
+ font-size: 0.8125rem;
1209
+ padding: 0.25rem 0.375rem;
1210
+ cursor: pointer;
1211
+ }
1212
+ .audit-trail-button-text:hover {
1213
+ color: var(--audit-trail-fg, #111827);
1214
+ text-decoration: underline;
1215
+ }
1216
+
1217
+ /* ============================================================
1218
+ JSON syntax highlighting on the Raw inspect-tab. Tuned for
1219
+ the dark code-block background. Punctuation inherits the
1220
+ default light text color.
1221
+ ============================================================ */
1222
+ .audit-trail-json-key { color: #93c5fd; }
1223
+ .audit-trail-json-str { color: #86efac; }
1224
+ .audit-trail-json-num { color: #fcd34d; }
1225
+ .audit-trail-json-bool { color: #c084fc; }
1226
+ .audit-trail-json-null { color: #9ca3af; font-style: italic; }
1227
+
1228
+ /* ============================================================
1229
+ Metadata key/value table in the inspect-modal Metadata tab.
1230
+ ============================================================ */
1231
+ .audit-trail-metadata-kv-table {
1232
+ width: 100%;
1233
+ border-collapse: collapse;
1234
+ font-size: 0.875rem;
1235
+ margin-top: 0.5rem;
1236
+ table-layout: fixed;
1237
+ }
1238
+ .audit-trail-metadata-kv-table thead th {
1239
+ text-align: left;
1240
+ padding: 0.5rem 0.875rem;
1241
+ background: var(--audit-trail-surface-2, #f9fafb);
1242
+ color: var(--audit-trail-fg-muted, #6b7280);
1243
+ font-weight: 500;
1244
+ font-size: 0.75rem;
1245
+ text-transform: uppercase;
1246
+ letter-spacing: 0.05em;
1247
+ border-bottom: 1px solid var(--audit-trail-border, #e5e7eb);
1248
+ }
1249
+ .audit-trail-metadata-kv-table tbody td {
1250
+ padding: 0.625rem 0.875rem;
1251
+ border-bottom: 1px solid var(--audit-trail-border, #e5e7eb);
1252
+ vertical-align: top;
1253
+ word-break: break-word;
1254
+ }
1255
+ .audit-trail-metadata-kv-table tbody tr:last-child td { border-bottom: none; }
1256
+ .audit-trail-md-col-key { width: 30%; }
1257
+ .audit-trail-md-col-type { width: 6rem; }
1258
+ .audit-trail-md-col-value { width: auto; }
1259
+ .audit-trail-md-col-type span { font-size: 0.75rem; }
1260
+ .audit-trail-metadata-kv-table code {
1261
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
1262
+ font-size: 0.8125rem;
1263
+ background: transparent;
1264
+ padding: 0;
1265
+ color: var(--audit-trail-fg, #111827);
1266
+ }
1267
+ .audit-trail-muted {
1268
+ color: var(--audit-trail-fg-muted, #6b7280);
1269
+ }
1270
+
1271
+ /* ============================================================
1272
+ Inline metadata / changed-field filter builder. Sits at the
1273
+ bottom of the Filters tab. Visual divider sets it apart from
1274
+ the column-filter rows above without competing for attention.
1275
+ ============================================================ */
1276
+ .audit-trail-add-filter-inline {
1277
+ margin-top: 0.5rem;
1278
+ padding-top: 1rem;
1279
+ border-top: 1px solid var(--audit-trail-border, #e5e7eb);
1280
+ }
1281
+ .audit-trail-add-filter-heading {
1282
+ margin: 0 0 0.5rem;
1283
+ font-size: 0.875rem;
1284
+ font-weight: 600;
1285
+ color: var(--audit-trail-fg, #111827);
1286
+ }
1287
+ .audit-trail-add-filter-row {
1288
+ display: flex;
1289
+ align-items: center;
1290
+ gap: 0.5rem;
1291
+ font-size: 0.875rem;
1292
+ margin-bottom: 0.5rem;
1293
+ }
1294
+ .audit-trail-add-filter-label {
1295
+ flex: 0 0 8rem;
1296
+ color: var(--audit-trail-fg-muted, #6b7280);
1297
+ }
1298
+ .audit-trail-add-filter-row input[type='text'],
1299
+ .audit-trail-add-filter-row select {
1300
+ flex: 1;
1301
+ min-width: 0;
1302
+ padding: 0.375rem 0.5rem;
1303
+ font-size: 0.875rem;
1304
+ border: 1px solid var(--audit-trail-border, #d1d5db);
1305
+ border-radius: 6px;
1306
+ background: var(--audit-trail-bg, #fff);
1307
+ color: var(--audit-trail-fg, #111827);
1308
+ }
1309
+ .audit-trail-add-filter-error {
1310
+ margin: 0.25rem 0 0;
1311
+ font-size: 0.8125rem;
1312
+ color: var(--audit-trail-error-fg, #991b1b);
1313
+ }
1314
+ .audit-trail-add-filter-actions {
1315
+ margin-top: 0.75rem;
1316
+ }