@worca/ui 0.41.0 → 0.42.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.
package/app/styles.css CHANGED
@@ -1136,6 +1136,15 @@ h1, h2, h3, h4, h5, h6 {
1136
1136
  border-bottom: 1px solid var(--border);
1137
1137
  }
1138
1138
 
1139
+ /* Pending stage: placeholder line shown until the stage starts (then replaced
1140
+ by the real Started/Finished/Duration strip). Keeps the body non-empty so
1141
+ the absolute Copy button aligns to content instead of the divider. */
1142
+ .timing-strip--pending .timing-strip-pending {
1143
+ font-size: 12px;
1144
+ font-style: italic;
1145
+ color: var(--fg-muted);
1146
+ }
1147
+
1139
1148
  .run-info-section {
1140
1149
  padding: 12px 16px;
1141
1150
  background: var(--bg-hover);
@@ -1151,6 +1160,8 @@ h1, h2, h3, h4, h5, h6 {
1151
1160
  block reads as a uniform stack. Mirror .run-group below it. */
1152
1161
  .run-project,
1153
1162
  .run-branch,
1163
+ .run-target-branch,
1164
+ .run-source,
1154
1165
  .run-template,
1155
1166
  .run-worktree {
1156
1167
  display: flex;
@@ -1172,6 +1183,7 @@ h1, h2, h3, h4, h5, h6 {
1172
1183
  .pipeline-timing-bar-actions {
1173
1184
  display: flex;
1174
1185
  justify-content: flex-end;
1186
+ gap: 8px;
1175
1187
  margin-bottom: 8px;
1176
1188
  }
1177
1189
 
@@ -1947,6 +1959,12 @@ sl-input [slot="prefix"] {
1947
1959
  color: var(--muted);
1948
1960
  }
1949
1961
 
1962
+ /* Align the "Revising PR #N" badge with the meta rows above/below it
1963
+ (which carry the same 26px left indent past the status icon). */
1964
+ .run-card-revises-pr {
1965
+ padding-left: 26px;
1966
+ }
1967
+
1950
1968
  .run-card-stages {
1951
1969
  display: flex;
1952
1970
  flex-wrap: wrap;
@@ -2353,6 +2371,28 @@ sl-input [slot="prefix"] {
2353
2371
  margin-top: 2px;
2354
2372
  }
2355
2373
 
2374
+ /* Export-mode picker (standalone vs delta): roomy rows, with each option's
2375
+ description on its own line aligned under the option title (not the radio). */
2376
+ .export-mode-group sl-radio::part(base) {
2377
+ align-items: flex-start;
2378
+ }
2379
+ .export-mode-group sl-radio:not(:last-of-type) {
2380
+ margin-block-end: 16px;
2381
+ }
2382
+ .export-mode-option {
2383
+ display: flex;
2384
+ flex-direction: column;
2385
+ gap: 4px;
2386
+ }
2387
+ .export-mode-title {
2388
+ line-height: 1.3;
2389
+ }
2390
+ .export-mode-hint {
2391
+ font-size: 12px;
2392
+ color: var(--muted);
2393
+ line-height: 1.45;
2394
+ }
2395
+
2356
2396
  .settings-grid {
2357
2397
  display: grid;
2358
2398
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
@@ -4621,11 +4661,6 @@ sl-details.learnings-panel::part(content) {
4621
4661
  margin-top: 10px;
4622
4662
  }
4623
4663
 
4624
- .preflight-summary {
4625
- font-size: 0.8rem;
4626
- color: var(--muted);
4627
- margin-bottom: 8px;
4628
- }
4629
4664
 
4630
4665
  .preflight-table {
4631
4666
  width: 100%;
@@ -4659,6 +4694,12 @@ sl-details.learnings-panel::part(content) {
4659
4694
  color: var(--muted);
4660
4695
  }
4661
4696
 
4697
+ /* Secondary pill on the preflight params row (e.g. the Max Beads source:
4698
+ "explicit" / "template"). Same font as the value pill, visually subordinated. */
4699
+ .preflight-param-source-badge {
4700
+ opacity: 0.72;
4701
+ }
4702
+
4662
4703
  .circuit-breaker-banner {
4663
4704
  margin: 8px 0 4px;
4664
4705
  }
@@ -5561,6 +5602,44 @@ sl-tooltip.bead-tooltip::part(body) {
5561
5602
  }
5562
5603
 
5563
5604
  /* ─── Add Project / Worca Setup dialog shared styles ─────────────────── */
5605
+ /* Gist-export dialog (template "Export (gist)" flow). */
5606
+ .gist-export-label {
5607
+ display: flex;
5608
+ align-items: center;
5609
+ gap: 0.5rem;
5610
+ }
5611
+
5612
+ .gist-export-spinner {
5613
+ font-size: 1rem;
5614
+ }
5615
+
5616
+ .gist-export-body {
5617
+ display: flex;
5618
+ flex-direction: column;
5619
+ gap: 0.4rem;
5620
+ }
5621
+
5622
+ .gist-export-url-row {
5623
+ display: flex;
5624
+ align-items: center;
5625
+ gap: 0.5rem;
5626
+ }
5627
+
5628
+ .gist-export-copy-btn {
5629
+ font-size: 1.15rem;
5630
+ flex: 0 0 auto;
5631
+ }
5632
+
5633
+ .gist-export-copy-btn.is-copied {
5634
+ color: var(--status-completed, var(--sl-color-success-600));
5635
+ }
5636
+
5637
+ .gist-export-footer {
5638
+ display: flex;
5639
+ justify-content: flex-end;
5640
+ width: 100%;
5641
+ }
5642
+
5564
5643
  .dialog-meta-row {
5565
5644
  display: flex;
5566
5645
  align-items: center;
@@ -5951,7 +6030,14 @@ sl-tooltip.bead-tooltip::part(body) {
5951
6030
 
5952
6031
  /* ─── Models tab — model cards + env rows ──────────────────────────── */
5953
6032
  .models-cards {
5954
- grid-template-columns: repeat(auto-fill, minmax(440px, 1fr));
6033
+ /* Single column: a model card's action row carries six controls
6034
+ (Rename/Duplicate/Copy/Delete + Discard/Save) that need ~620px to sit on
6035
+ one line, so full-width cards stay roomy and never overflow. (Was a
6036
+ multi-column auto-fill grid at minmax(440px) — too narrow for the row.)
6037
+ For a capped two-column layout instead, use:
6038
+ repeat(auto-fill, minmax(640px, 1fr));
6039
+ .model-card-actions also wraps as a safety net for the dirty-state status. */
6040
+ grid-template-columns: 1fr;
5955
6041
  }
5956
6042
 
5957
6043
  .model-card {
@@ -6098,6 +6184,7 @@ sl-tooltip.bead-tooltip::part(body) {
6098
6184
  .model-card-actions {
6099
6185
  display: flex;
6100
6186
  align-items: center;
6187
+ flex-wrap: wrap;
6101
6188
  gap: 8px;
6102
6189
  margin-top: 14px;
6103
6190
  padding-top: 12px;
@@ -7592,6 +7679,25 @@ sl-dialog.markdown-dialog::part(body) {
7592
7679
  */
7593
7680
  .template-card .run-card-actions {
7594
7681
  margin-top: auto;
7682
+ /*
7683
+ * Left-align the action cluster (Duplicate + Export buttons) and push
7684
+ * Delete to the far right via `margin-left:auto` on the button itself
7685
+ * (see .template-card-delete-push). Scoped to template cards so run cards
7686
+ * keep the global flex-end alignment. nowrap keeps Delete on the same row
7687
+ * as the other buttons instead of wrapping it to its own line.
7688
+ */
7689
+ justify-content: flex-start;
7690
+ flex-wrap: nowrap;
7691
+ }
7692
+
7693
+ /*
7694
+ * Delete is always pinned to the far right of the template card's
7695
+ * action row, regardless of how many left-cluster buttons precede it
7696
+ * (count varies with has_overlays / builtin). `margin-left:auto`
7697
+ * absorbs the free space so it never relies on :last-child.
7698
+ */
7699
+ .template-card .run-card-actions .template-card-delete-push {
7700
+ margin-left: auto;
7595
7701
  }
7596
7702
 
7597
7703
  .template-tier-badge {
@@ -7930,6 +8036,28 @@ sl-dialog.markdown-dialog::part(body) {
7930
8036
  .editor-content--readonly .editor-section--json * {
7931
8037
  cursor: default !important;
7932
8038
  }
8039
+ /*
8040
+ * Exception: the Prompts tab is itself a read-only viewer, not an editor —
8041
+ * scrolling a prompt, expanding a stage's <sl-details>, and switching the
8042
+ * per-stage Agent/User sub-tabs are all read actions. The panel-wide
8043
+ * pointer-events:none + opacity:0.7 above would (a) swallow wheel events so
8044
+ * the inner 480px `.prompt-file-content` scroll pane can't be scrolled and
8045
+ * (b) bleach the prompt text, which is hard to read on a text-heavy surface.
8046
+ *
8047
+ * Exempt the Prompts panel entirely (it has no editable controls, so
8048
+ * re-enabling pointer-events can't allow edits). Both the outer panel and
8049
+ * the nested per-stage sub-tab panels are covered — the nested
8050
+ * `sl-tab-panel`s would otherwise re-match the base rule above. opacity is
8051
+ * reset on both levels because it compounds (0.7 × 0.7) and isn't inherited.
8052
+ */
8053
+ .editor-content--readonly sl-tab-panel[name="prompts"],
8054
+ .editor-content--readonly sl-tab-panel[name="prompts"] sl-tab-panel {
8055
+ pointer-events: auto;
8056
+ opacity: 1;
8057
+ }
8058
+ .editor-content--readonly sl-tab-panel[name="prompts"] * {
8059
+ cursor: auto !important;
8060
+ }
7933
8061
 
7934
8062
  /*
7935
8063
  * Editor uses the same .settings-tab-content / .settings-section-title /
@@ -8681,3 +8809,1189 @@ body.help-mode-active sl-tab {
8681
8809
  background: rgba(124, 58, 237, 0.35);
8682
8810
  color: #f5f3ff;
8683
8811
  }
8812
+
8813
+ /* ── Overlays tab (pipelines-editor) ────────────────────────────────────── */
8814
+
8815
+ .overlay-stages {
8816
+ display: flex;
8817
+ flex-direction: column;
8818
+ gap: var(--sl-spacing-small);
8819
+ padding: var(--sl-spacing-medium);
8820
+ }
8821
+
8822
+ .overlay-stage-card {
8823
+ border-radius: var(--sl-border-radius-medium);
8824
+ }
8825
+
8826
+ .overlay-stage-card--disabled {
8827
+ padding: var(--sl-spacing-small) var(--sl-spacing-medium);
8828
+ border: 1px solid var(--sl-color-neutral-200);
8829
+ border-radius: var(--sl-border-radius-medium);
8830
+ opacity: 0.5;
8831
+ cursor: default;
8832
+ }
8833
+
8834
+ .overlay-stage-label {
8835
+ font-size: var(--sl-font-size-small);
8836
+ color: var(--sl-color-neutral-600);
8837
+ font-weight: var(--sl-font-weight-semibold);
8838
+ }
8839
+
8840
+ .overlay-file-label {
8841
+ font-size: var(--sl-font-size-x-small);
8842
+ color: var(--sl-color-neutral-500);
8843
+ margin-left: var(--sl-spacing-x-small);
8844
+ }
8845
+
8846
+ .overlay-stage-tabs {
8847
+ --track-color: transparent;
8848
+ }
8849
+
8850
+ .overlay-file-content.markdown-body {
8851
+ padding: var(--sl-spacing-medium);
8852
+ max-height: 480px;
8853
+ overflow-y: auto;
8854
+ font-size: var(--sl-font-size-small);
8855
+ }
8856
+
8857
+ .overlay-empty {
8858
+ color: var(--sl-color-neutral-500);
8859
+ font-size: var(--sl-font-size-small);
8860
+ padding: var(--sl-spacing-medium);
8861
+ }
8862
+
8863
+ /* ── Prompts tab (pipelines-editor-overlays.js) ─────────────────────────── */
8864
+
8865
+ .prompt-file-content.markdown-body {
8866
+ padding: var(--sl-spacing-medium);
8867
+ max-height: 480px;
8868
+ overflow-y: auto;
8869
+ font-size: var(--sl-font-size-small);
8870
+ }
8871
+
8872
+ .prompt-legend {
8873
+ display: flex;
8874
+ flex-wrap: wrap;
8875
+ align-items: center;
8876
+ gap: 6px;
8877
+ font-size: var(--sl-font-size-x-small);
8878
+ color: var(--sl-color-neutral-500);
8879
+ padding: 0 var(--sl-spacing-x-small) var(--sl-spacing-small);
8880
+ }
8881
+
8882
+ .prompt-source-badge {
8883
+ margin-left: var(--sl-spacing-x-small);
8884
+ }
8885
+
8886
+ .prompt-base-label,
8887
+ .prompt-customizations-label {
8888
+ font-size: var(--sl-font-size-x-small);
8889
+ font-weight: 600;
8890
+ text-transform: uppercase;
8891
+ letter-spacing: 0.04em;
8892
+ color: var(--sl-color-neutral-500);
8893
+ padding: var(--sl-spacing-small) var(--sl-spacing-medium) 0;
8894
+ }
8895
+
8896
+ .prompt-customizations-label {
8897
+ display: flex;
8898
+ align-items: center;
8899
+ gap: 4px;
8900
+ margin-top: var(--sl-spacing-small);
8901
+ }
8902
+
8903
+ .prompt-help-dot {
8904
+ display: inline-flex;
8905
+ align-items: center;
8906
+ justify-content: center;
8907
+ width: 14px;
8908
+ height: 14px;
8909
+ border-radius: 50%;
8910
+ background: var(--sl-color-neutral-300);
8911
+ color: var(--sl-color-neutral-700);
8912
+ font-size: 10px;
8913
+ font-weight: 700;
8914
+ cursor: help;
8915
+ }
8916
+
8917
+ /* Merge contributions: green = appended (additive), amber = overwrites a
8918
+ built-in section (caution). Follows the badge color language. */
8919
+ .prompt-merge-block {
8920
+ margin: var(--sl-spacing-x-small) var(--sl-spacing-medium);
8921
+ border-left: 3px solid var(--sl-color-neutral-300);
8922
+ border-radius: 0 var(--sl-border-radius-medium) var(--sl-border-radius-medium) 0;
8923
+ padding: var(--sl-spacing-x-small) var(--sl-spacing-small);
8924
+ }
8925
+
8926
+ .prompt-merge-block .prompt-file-content.markdown-body {
8927
+ padding: var(--sl-spacing-x-small) 0 0;
8928
+ max-height: none;
8929
+ }
8930
+
8931
+ .prompt-merge-append {
8932
+ background: var(--sl-color-success-50);
8933
+ border-left-color: var(--sl-color-success-500);
8934
+ }
8935
+
8936
+ .prompt-merge-overwrite {
8937
+ background: var(--sl-color-warning-50);
8938
+ border-left-color: var(--sl-color-warning-500);
8939
+ }
8940
+
8941
+ .prompt-merge-tag {
8942
+ font-size: var(--sl-font-size-x-small);
8943
+ color: var(--sl-color-neutral-600);
8944
+ }
8945
+
8946
+ .prompt-merge-tag code {
8947
+ font-size: var(--sl-font-size-x-small);
8948
+ }
8949
+
8950
+ .prompt-merge-verb {
8951
+ font-weight: 700;
8952
+ text-transform: uppercase;
8953
+ letter-spacing: 0.03em;
8954
+ cursor: help;
8955
+ }
8956
+
8957
+ /* ── File Access view (run-file-access.js) ──────────────────────────────── */
8958
+
8959
+ .run-file-access {
8960
+ --fa-file-col-width: 220px;
8961
+ --fa-cell-width: 80px;
8962
+ --fa-cell-height: 32px;
8963
+
8964
+ display: flex;
8965
+ flex-direction: column;
8966
+ gap: 16px;
8967
+ padding: 16px 20px;
8968
+ }
8969
+
8970
+ /* ── Loading / empty states ─────────────────────────────────────────────── */
8971
+
8972
+ .access-loading {
8973
+ color: var(--text-muted, #94a3b8);
8974
+ font-size: 13px;
8975
+ padding: 40px;
8976
+ text-align: center;
8977
+ }
8978
+
8979
+ .access-empty-state {
8980
+ padding: 40px;
8981
+ text-align: center;
8982
+ color: var(--fg, #0f172a);
8983
+ }
8984
+
8985
+ .access-empty-hint {
8986
+ font-size: 13px;
8987
+ color: var(--text-muted, #94a3b8);
8988
+ }
8989
+
8990
+ /* ── KPI strip ──────────────────────────────────────────────────────────── */
8991
+
8992
+ .access-kpi-strip {
8993
+ display: flex;
8994
+ flex-wrap: wrap;
8995
+ gap: 12px;
8996
+ }
8997
+
8998
+ .access-kpi-card {
8999
+ display: flex;
9000
+ flex-direction: column;
9001
+ gap: 2px;
9002
+ padding: 10px 16px;
9003
+ background: var(--bg-secondary, #f8fafc);
9004
+ border: 1px solid var(--border, #e2e8f0);
9005
+ border-radius: var(--radius, 6px);
9006
+ min-width: 100px;
9007
+ }
9008
+
9009
+ .access-kpi-card--amber {
9010
+ border-color: #f59e0b;
9011
+ background: rgba(245, 158, 11, 0.06);
9012
+ }
9013
+
9014
+ /* Read = green, Written = blue — same semantics as the matrix op pills. */
9015
+ .access-kpi-card--read {
9016
+ border-color: rgba(34, 197, 94, 0.4);
9017
+ background: rgba(34, 197, 94, 0.06);
9018
+ }
9019
+
9020
+ .access-kpi-card--read .access-kpi-label {
9021
+ color: #15803d;
9022
+ }
9023
+
9024
+ .access-kpi-card--write {
9025
+ border-color: rgba(59, 130, 246, 0.4);
9026
+ background: rgba(59, 130, 246, 0.06);
9027
+ }
9028
+
9029
+ .access-kpi-card--write .access-kpi-label {
9030
+ color: #1d4ed8;
9031
+ }
9032
+
9033
+ .access-kpi-label {
9034
+ font-size: 11px;
9035
+ text-transform: uppercase;
9036
+ letter-spacing: 0.04em;
9037
+ color: var(--text-muted, #94a3b8);
9038
+ font-weight: 500;
9039
+ }
9040
+
9041
+ .access-kpi-value {
9042
+ font-size: 15px;
9043
+ font-weight: 600;
9044
+ color: var(--fg, #0f172a);
9045
+ font-variant-numeric: tabular-nums;
9046
+ }
9047
+
9048
+ /* ── Controls bar ───────────────────────────────────────────────────────── */
9049
+
9050
+ .access-controls {
9051
+ display: flex;
9052
+ align-items: center;
9053
+ gap: 10px;
9054
+ flex-wrap: wrap;
9055
+ }
9056
+
9057
+ .access-heatmap-toggle {
9058
+ display: inline-flex;
9059
+ align-items: center;
9060
+ gap: 5px;
9061
+ padding: 4px 10px;
9062
+ border: 1px solid var(--border, #e2e8f0);
9063
+ border-radius: var(--radius, 6px);
9064
+ background: var(--bg-secondary, #f8fafc);
9065
+ color: var(--text-muted, #94a3b8);
9066
+ font-size: 12px;
9067
+ cursor: pointer;
9068
+ transition: background var(--transition-fast, 150ms ease),
9069
+ color var(--transition-fast, 150ms ease),
9070
+ border-color var(--transition-fast, 150ms ease);
9071
+ }
9072
+
9073
+ .access-heatmap-toggle--active {
9074
+ background: rgba(249, 115, 22, 0.12);
9075
+ border-color: #f97316;
9076
+ color: #c2410c;
9077
+ }
9078
+
9079
+ .access-chips {
9080
+ display: flex;
9081
+ gap: 6px;
9082
+ }
9083
+
9084
+ .access-chip {
9085
+ display: inline-flex;
9086
+ align-items: center;
9087
+ gap: 5px;
9088
+ padding: 4px 10px;
9089
+ border: 1px solid var(--border, #e2e8f0);
9090
+ border-radius: 20px;
9091
+ background: var(--bg-secondary, #f8fafc);
9092
+ color: var(--text-muted, #94a3b8);
9093
+ font-size: 12px;
9094
+ cursor: pointer;
9095
+ transition: background var(--transition-fast, 150ms ease),
9096
+ color var(--transition-fast, 150ms ease),
9097
+ border-color var(--transition-fast, 150ms ease);
9098
+ }
9099
+
9100
+ .access-chip--active.access-chip--reads {
9101
+ background: rgba(34, 197, 94, 0.1);
9102
+ border-color: #22c55e;
9103
+ color: #15803d;
9104
+ }
9105
+
9106
+ .access-chip--active.access-chip--writes {
9107
+ background: rgba(59, 130, 246, 0.1);
9108
+ border-color: #3b82f6;
9109
+ color: #3b82f6;
9110
+ }
9111
+
9112
+ .access-path-filter {
9113
+ flex: 1;
9114
+ min-width: 140px;
9115
+ max-width: 260px;
9116
+ padding: 4px 10px;
9117
+ border: 1px solid var(--border, #e2e8f0);
9118
+ border-radius: var(--radius, 6px);
9119
+ background: var(--bg, #fff);
9120
+ color: var(--fg, #0f172a);
9121
+ font-size: 12px;
9122
+ }
9123
+
9124
+ .access-path-filter:focus {
9125
+ outline: none;
9126
+ border-color: var(--accent, #3b82f6);
9127
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.15);
9128
+ }
9129
+
9130
+ .access-sort-select {
9131
+ padding: 4px 8px;
9132
+ border: 1px solid var(--border, #e2e8f0);
9133
+ border-radius: var(--radius, 6px);
9134
+ background: var(--bg-secondary, #f8fafc);
9135
+ color: var(--fg, #0f172a);
9136
+ font-size: 12px;
9137
+ cursor: pointer;
9138
+ }
9139
+
9140
+ /* ── Treetable container ────────────────────────────────────────────────── */
9141
+
9142
+ .access-treetable {
9143
+ overflow-x: auto;
9144
+ overflow-y: auto;
9145
+ max-height: 540px;
9146
+ border: 1px solid var(--border, #e2e8f0);
9147
+ border-radius: var(--radius, 6px);
9148
+ background: var(--bg, #fff);
9149
+ font-size: 12px;
9150
+ }
9151
+
9152
+ /* ── Table header (sticky top) ──────────────────────────────────────────── */
9153
+
9154
+ .access-table-header {
9155
+ position: sticky;
9156
+ top: 0;
9157
+ z-index: 3;
9158
+ background: var(--bg-secondary, #f8fafc);
9159
+ border-bottom: 1px solid var(--border, #e2e8f0);
9160
+ }
9161
+
9162
+ /* Stage group label row — a grid that shares the table's column template so
9163
+ each stage label spans exactly its data columns. Empty spacers hold the
9164
+ file and Σ tracks. */
9165
+ .access-stage-groups {
9166
+ display: grid;
9167
+ grid-template-columns: var(--fa-grid);
9168
+ width: max-content;
9169
+ border-bottom: 1px solid var(--border, #e2e8f0);
9170
+ }
9171
+
9172
+ /* Empty spacer cells over the file and Σ columns of the stage-label row. */
9173
+ .access-stage-spacer {
9174
+ min-height: 0;
9175
+ }
9176
+
9177
+ .access-stage-group-header {
9178
+ display: inline-flex;
9179
+ align-items: center;
9180
+ justify-content: center;
9181
+ gap: 4px;
9182
+ min-width: 0;
9183
+ padding: 4px 8px;
9184
+ background: transparent;
9185
+ border: none;
9186
+ border-right: 1px solid var(--border, #e2e8f0);
9187
+ color: var(--fg, #0f172a);
9188
+ font-size: 11px;
9189
+ font-weight: 600;
9190
+ text-transform: uppercase;
9191
+ letter-spacing: 0.04em;
9192
+ cursor: pointer;
9193
+ white-space: nowrap;
9194
+ overflow: hidden;
9195
+ }
9196
+
9197
+ .access-stage-group-header .access-stage-name {
9198
+ overflow: hidden;
9199
+ text-overflow: ellipsis;
9200
+ }
9201
+
9202
+ .access-stage-group-header:hover {
9203
+ background: var(--border, #e2e8f0);
9204
+ }
9205
+
9206
+ .access-stage-group-header--collapsed {
9207
+ background: rgba(59, 130, 246, 0.06);
9208
+ color: #3b82f6;
9209
+ }
9210
+
9211
+ /* Column headers row — same grid template as the stage-label and body rows. */
9212
+ .access-col-headers {
9213
+ display: grid;
9214
+ grid-template-columns: var(--fa-grid);
9215
+ width: max-content;
9216
+ }
9217
+
9218
+ .access-col-header {
9219
+ min-width: 0;
9220
+ min-height: var(--fa-cell-height, 32px);
9221
+ padding: 4px 6px;
9222
+ display: flex;
9223
+ flex-direction: column;
9224
+ align-items: center;
9225
+ justify-content: center;
9226
+ font-size: 11px;
9227
+ color: var(--text-muted, #94a3b8);
9228
+ border-right: 1px solid rgba(226, 232, 240, 0.5);
9229
+ white-space: nowrap;
9230
+ overflow: hidden;
9231
+ text-overflow: ellipsis;
9232
+ }
9233
+
9234
+ .access-col-agent {
9235
+ max-width: 100%;
9236
+ overflow: hidden;
9237
+ text-overflow: ellipsis;
9238
+ }
9239
+
9240
+ .access-col-header:last-child {
9241
+ border-right: none;
9242
+ }
9243
+
9244
+ /* File column header — sticky left, wider than data cells */
9245
+ .access-col-file-header {
9246
+ position: sticky;
9247
+ left: 0;
9248
+ z-index: 4;
9249
+ width: var(--fa-file-col-width, 220px);
9250
+ background: var(--bg-secondary, #f8fafc);
9251
+ font-weight: 600;
9252
+ color: var(--fg, #0f172a);
9253
+ justify-content: flex-start;
9254
+ border-right: 2px solid var(--border, #e2e8f0);
9255
+ }
9256
+
9257
+ .access-col-header--collapsed {
9258
+ background: rgba(59, 130, 246, 0.06);
9259
+ color: #3b82f6;
9260
+ font-style: italic;
9261
+ }
9262
+
9263
+ .access-sigma-header {
9264
+ font-weight: 600;
9265
+ color: var(--fg, #0f172a);
9266
+ background: var(--bg-secondary, #f8fafc);
9267
+ }
9268
+
9269
+ .access-col-iter {
9270
+ font-size: 10px;
9271
+ color: var(--text-muted, #94a3b8);
9272
+ }
9273
+
9274
+ /* ── Table body rows ────────────────────────────────────────────────────── */
9275
+
9276
+ .access-table-body {
9277
+ display: flex;
9278
+ flex-direction: column;
9279
+ width: max-content;
9280
+ }
9281
+
9282
+ /* Each row is its own grid sharing the table column template, so cells line up
9283
+ with the header columns exactly (no per-stage width drift). */
9284
+ .access-row {
9285
+ display: grid;
9286
+ grid-template-columns: var(--fa-grid);
9287
+ width: max-content;
9288
+ align-items: stretch;
9289
+ min-height: var(--fa-cell-height, 32px);
9290
+ border-bottom: 1px solid rgba(226, 232, 240, 0.5);
9291
+ }
9292
+
9293
+ .access-row:last-child {
9294
+ border-bottom: none;
9295
+ }
9296
+
9297
+ .access-row--dir {
9298
+ background: var(--bg-secondary, #f8fafc);
9299
+ font-weight: 500;
9300
+ }
9301
+
9302
+ .access-row--file {
9303
+ background: var(--bg, #fff);
9304
+ }
9305
+
9306
+ .access-row--file:hover {
9307
+ background: rgba(59, 130, 246, 0.04);
9308
+ }
9309
+
9310
+ /* ── Cells ──────────────────────────────────────────────────────────────── */
9311
+
9312
+ .access-cell {
9313
+ min-width: 0;
9314
+ display: flex;
9315
+ align-items: center;
9316
+ justify-content: center;
9317
+ padding: 3px 6px;
9318
+ border-right: 1px solid rgba(226, 232, 240, 0.5);
9319
+ }
9320
+
9321
+ /* Aggregated Σ cell shown for a collapsed stage — holds the same op pills. */
9322
+ .access-cell--stage-agg {
9323
+ flex-wrap: wrap;
9324
+ gap: 3px;
9325
+ background: rgba(59, 130, 246, 0.04);
9326
+ }
9327
+
9328
+ .access-cell:last-child {
9329
+ border-right: none;
9330
+ }
9331
+
9332
+ /* Sticky file name column — left:0, inherits row background */
9333
+ .access-cell--file {
9334
+ position: sticky;
9335
+ left: 0;
9336
+ z-index: 1;
9337
+ width: var(--fa-file-col-width, 220px);
9338
+ justify-content: flex-start;
9339
+ gap: 6px;
9340
+ padding: 3px 8px;
9341
+ /* One indent step == a dir's [chevron 18px + gap 6px], so a child's content
9342
+ (file name, or sub-folder chevron) starts exactly under its parent's
9343
+ folder icon. */
9344
+ padding-left: calc(8px + var(--depth, 0) * 24px);
9345
+ background: inherit;
9346
+ border-right: 2px solid var(--border, #e2e8f0);
9347
+ }
9348
+
9349
+ .access-row--dir .access-cell--file {
9350
+ background: var(--bg-secondary, #f8fafc);
9351
+ }
9352
+
9353
+ .access-row--file .access-cell--file {
9354
+ background: var(--bg, #fff);
9355
+ }
9356
+
9357
+ .access-row--file:hover .access-cell--file {
9358
+ background: rgba(59, 130, 246, 0.04);
9359
+ }
9360
+
9361
+ .access-cell--empty {
9362
+ color: var(--text-muted, #94a3b8);
9363
+ font-size: 16px;
9364
+ line-height: 1;
9365
+ }
9366
+
9367
+ .access-cell--clickable {
9368
+ cursor: pointer;
9369
+ }
9370
+
9371
+ .access-cell--clickable:focus-visible {
9372
+ outline: 2px solid var(--sl-color-primary-600, #2563eb);
9373
+ outline-offset: -2px;
9374
+ border-radius: 2px;
9375
+ }
9376
+
9377
+ .access-cell--sigma {
9378
+ flex-wrap: wrap;
9379
+ gap: 3px;
9380
+ background: var(--bg-secondary, #f8fafc);
9381
+ }
9382
+
9383
+ /* ── Dir toggle button ──────────────────────────────────────────────────── */
9384
+
9385
+ .access-dir-toggle {
9386
+ display: inline-flex;
9387
+ align-items: center;
9388
+ justify-content: center;
9389
+ width: 18px;
9390
+ height: 18px;
9391
+ flex-shrink: 0;
9392
+ padding: 0;
9393
+ border: none;
9394
+ background: transparent;
9395
+ color: var(--text-muted, #94a3b8);
9396
+ cursor: pointer;
9397
+ border-radius: 3px;
9398
+ }
9399
+
9400
+ .access-dir-toggle:hover {
9401
+ background: var(--border, #e2e8f0);
9402
+ color: var(--fg, #0f172a);
9403
+ }
9404
+
9405
+ /* ── File name + category colors ────────────────────────────────────────── */
9406
+
9407
+ .access-file-name {
9408
+ font-size: 12px;
9409
+ overflow: hidden;
9410
+ text-overflow: ellipsis;
9411
+ white-space: nowrap;
9412
+ max-width: 100%;
9413
+ }
9414
+
9415
+ /* read → blue (informational, no change) */
9416
+ .access-file-name--read {
9417
+ color: #3b82f6;
9418
+ }
9419
+
9420
+ /* write → green (positive, modified) */
9421
+ .access-file-name--write {
9422
+ color: #22c55e;
9423
+ }
9424
+
9425
+ /* leaked → amber (caution, untracked write) */
9426
+ .access-file-name--leaked {
9427
+ color: #f59e0b;
9428
+ }
9429
+
9430
+ /* ✎ git-tracked write decoration */
9431
+ .access-tracked-icon {
9432
+ font-size: 11px;
9433
+ color: var(--text-muted, #94a3b8);
9434
+ margin-left: 3px;
9435
+ flex-shrink: 0;
9436
+ }
9437
+
9438
+ /* ── Heatmap shading ────────────────────────────────────────────────────── */
9439
+
9440
+ /* When heatmap mode is active, shade non-empty data cells by op-count density.
9441
+ --heat (0..1) is set per-cell by the view when _heatmap is true. */
9442
+ .access-treetable--heatmap
9443
+ .access-cell:not(.access-cell--empty):not(.access-cell--file):not(.access-cell--sigma):not(.access-cell--stage-agg) {
9444
+ background-color: rgba(249, 115, 22, calc(var(--heat, 0) * 0.28));
9445
+ }
9446
+
9447
+ /* ── Operation badges (R / W / RW) ─────────────────────────────────────── */
9448
+
9449
+ .access-badge {
9450
+ display: inline-flex;
9451
+ align-items: center;
9452
+ gap: 2px;
9453
+ padding: 1px 6px;
9454
+ border-radius: 4px;
9455
+ font-size: 10px;
9456
+ font-weight: 700;
9457
+ letter-spacing: 0.02em;
9458
+ line-height: 1.4;
9459
+ white-space: nowrap;
9460
+ border: 1px solid transparent;
9461
+ font-variant-numeric: tabular-nums;
9462
+ }
9463
+
9464
+ /* R = green (read) */
9465
+ .access-badge--read {
9466
+ background: rgba(34, 197, 94, 0.12);
9467
+ color: #15803d;
9468
+ border-color: rgba(34, 197, 94, 0.3);
9469
+ }
9470
+
9471
+ /* W = blue (write) */
9472
+ .access-badge--write {
9473
+ background: rgba(59, 130, 246, 0.12);
9474
+ color: #1d4ed8;
9475
+ border-color: rgba(59, 130, 246, 0.3);
9476
+ }
9477
+
9478
+ /* broad scan — amber caution */
9479
+ .access-badge--broad {
9480
+ background: rgba(245, 158, 11, 0.12);
9481
+ color: #b45309;
9482
+ border-color: rgba(245, 158, 11, 0.3);
9483
+ }
9484
+
9485
+ /* zero-hit search — red */
9486
+ .access-badge--zero-hit {
9487
+ background: rgba(239, 68, 68, 0.1);
9488
+ color: #b91c1c;
9489
+ border-color: rgba(239, 68, 68, 0.3);
9490
+ }
9491
+
9492
+ .access-op-count {
9493
+ font-size: 8px;
9494
+ font-weight: 500;
9495
+ vertical-align: super;
9496
+ line-height: 1;
9497
+ opacity: 0.85;
9498
+ }
9499
+
9500
+ /* ── Sigma (Σ) column ───────────────────────────────────────────────────── */
9501
+
9502
+ .access-sigma-read {
9503
+ color: #1d4ed8;
9504
+ font-weight: 600;
9505
+ font-size: 11px;
9506
+ }
9507
+
9508
+ .access-sigma-write {
9509
+ color: #15803d;
9510
+ font-weight: 600;
9511
+ font-size: 11px;
9512
+ }
9513
+
9514
+ /* ── Searches lane ──────────────────────────────────────────────────────── */
9515
+
9516
+ .access-searches {
9517
+ display: flex;
9518
+ flex-direction: column;
9519
+ gap: 10px;
9520
+ }
9521
+
9522
+ .access-searches-title {
9523
+ font-size: 13px;
9524
+ font-weight: 600;
9525
+ color: var(--fg, #0f172a);
9526
+ margin: 0;
9527
+ }
9528
+
9529
+ .access-searches-empty {
9530
+ font-size: 13px;
9531
+ color: var(--text-muted, #94a3b8);
9532
+ margin: 0;
9533
+ }
9534
+
9535
+ .access-searches-table {
9536
+ width: 100%;
9537
+ border-collapse: collapse;
9538
+ font-size: 12px;
9539
+ /* Fixed layout + explicit column widths so the per-stage grouped tables all
9540
+ line up with each other (and with the ungrouped table). Pattern is the one
9541
+ unsized column, so it absorbs the remaining width. */
9542
+ table-layout: fixed;
9543
+ }
9544
+
9545
+ .access-searches-table th:nth-child(1),
9546
+ .access-searches-table td:nth-child(1) {
9547
+ width: 130px;
9548
+ }
9549
+
9550
+ .access-searches-table th:nth-child(2),
9551
+ .access-searches-table td:nth-child(2) {
9552
+ width: 90px;
9553
+ }
9554
+
9555
+ .access-searches-table th:nth-child(4),
9556
+ .access-searches-table td:nth-child(4) {
9557
+ width: 200px;
9558
+ }
9559
+
9560
+ .access-searches-table th:nth-child(5),
9561
+ .access-searches-table td:nth-child(5) {
9562
+ width: 70px;
9563
+ }
9564
+
9565
+ .access-searches-table th:nth-child(6),
9566
+ .access-searches-table td:nth-child(6) {
9567
+ width: 150px;
9568
+ }
9569
+
9570
+ /* Long scope paths shouldn't break the fixed columns. */
9571
+ .access-searches-table td:nth-child(4) {
9572
+ overflow: hidden;
9573
+ text-overflow: ellipsis;
9574
+ white-space: nowrap;
9575
+ }
9576
+
9577
+ .access-searches-table th {
9578
+ text-align: left;
9579
+ padding: 6px 10px;
9580
+ font-size: 11px;
9581
+ text-transform: uppercase;
9582
+ letter-spacing: 0.04em;
9583
+ color: var(--text-muted, #94a3b8);
9584
+ font-weight: 500;
9585
+ border-bottom: 2px solid var(--border, #e2e8f0);
9586
+ }
9587
+
9588
+ .access-searches-table td {
9589
+ padding: 6px 10px;
9590
+ border-bottom: 1px solid rgba(226, 232, 240, 0.6);
9591
+ vertical-align: middle;
9592
+ }
9593
+
9594
+ .access-search-row:last-child td {
9595
+ border-bottom: none;
9596
+ }
9597
+
9598
+ .access-search-pattern {
9599
+ font-family: var(--sl-font-mono, monospace);
9600
+ font-size: 11px;
9601
+ color: var(--fg, #0f172a);
9602
+ overflow: hidden;
9603
+ text-overflow: ellipsis;
9604
+ white-space: nowrap;
9605
+ }
9606
+
9607
+ /* ── Graph-queries lane (graphify / CRG) ────────────────────────────────── */
9608
+
9609
+ .access-graph-lane {
9610
+ margin-top: 18px;
9611
+ }
9612
+
9613
+ /* Graph table columns: Stage · Engine · Op · Query(flex). Only fields both
9614
+ engines reliably expose. Override the searches widths (higher specificity
9615
+ via the doubled class). */
9616
+ .access-searches-table.access-graph-table td:nth-child(3),
9617
+ .access-searches-table.access-graph-table th:nth-child(3) {
9618
+ width: 120px;
9619
+ }
9620
+
9621
+ .access-searches-table.access-graph-table td:nth-child(4),
9622
+ .access-searches-table.access-graph-table th:nth-child(4) {
9623
+ width: auto;
9624
+ }
9625
+
9626
+ .access-engine-badge {
9627
+ display: inline-flex;
9628
+ align-items: center;
9629
+ padding: 1px 7px;
9630
+ border-radius: 4px;
9631
+ font-size: 10px;
9632
+ font-weight: 600;
9633
+ border: 1px solid transparent;
9634
+ }
9635
+
9636
+ .access-engine-badge--graphify {
9637
+ background: rgba(8, 145, 178, 0.12);
9638
+ color: #0e7490;
9639
+ border-color: rgba(8, 145, 178, 0.3);
9640
+ }
9641
+
9642
+ .access-engine-badge--crg {
9643
+ background: rgba(99, 102, 241, 0.12);
9644
+ color: #4338ca;
9645
+ border-color: rgba(99, 102, 241, 0.3);
9646
+ }
9647
+
9648
+ .access-searches-header {
9649
+ display: flex;
9650
+ align-items: center;
9651
+ gap: 10px;
9652
+ }
9653
+
9654
+ .access-searches-group-toggle {
9655
+ padding: 2px 8px;
9656
+ font-size: 11px;
9657
+ border: 1px solid var(--border, #e2e8f0);
9658
+ border-radius: 4px;
9659
+ background: var(--bg-secondary, #f8fafc);
9660
+ color: var(--text-muted, #94a3b8);
9661
+ cursor: pointer;
9662
+ }
9663
+
9664
+ .access-searches-group-toggle--active {
9665
+ background: rgba(234, 179, 8, 0.12);
9666
+ border-color: rgba(234, 179, 8, 0.4);
9667
+ color: #854d0e;
9668
+ }
9669
+
9670
+ .access-searches-groups {
9671
+ display: flex;
9672
+ flex-direction: column;
9673
+ gap: 12px;
9674
+ }
9675
+
9676
+ .access-searches-stage-group {
9677
+ display: flex;
9678
+ flex-direction: column;
9679
+ gap: 4px;
9680
+ }
9681
+
9682
+ .access-searches-stage-header {
9683
+ font-size: 11px;
9684
+ font-weight: 600;
9685
+ text-transform: uppercase;
9686
+ letter-spacing: 0.05em;
9687
+ color: var(--text-muted, #94a3b8);
9688
+ padding: 4px 10px;
9689
+ background: var(--bg-secondary, #f8fafc);
9690
+ border-radius: 4px;
9691
+ }
9692
+
9693
+ /* ── Scope-dot: yellow hint on dir rows that appear as a search scope ──── */
9694
+
9695
+ .access-scope-dot {
9696
+ display: inline-block;
9697
+ width: 6px;
9698
+ height: 6px;
9699
+ border-radius: 50%;
9700
+ background: #eab308;
9701
+ margin-left: 4px;
9702
+ flex-shrink: 0;
9703
+ vertical-align: middle;
9704
+ }
9705
+
9706
+ /* ── Capture integrity strip ────────────────────────────────────────────── */
9707
+
9708
+ .access-capture-strip {
9709
+ display: flex;
9710
+ align-items: center;
9711
+ gap: 16px;
9712
+ padding: 8px 14px;
9713
+ background: var(--bg-secondary, #f8fafc);
9714
+ border: 1px solid var(--border, #e2e8f0);
9715
+ border-radius: var(--radius, 6px);
9716
+ font-size: 12px;
9717
+ color: var(--text-muted, #94a3b8);
9718
+ }
9719
+
9720
+ .access-capture-strip--degraded {
9721
+ border-color: #f59e0b;
9722
+ background: rgba(245, 158, 11, 0.06);
9723
+ color: #b45309;
9724
+ }
9725
+
9726
+ .access-capture-label {
9727
+ font-weight: 600;
9728
+ text-transform: uppercase;
9729
+ letter-spacing: 0.04em;
9730
+ font-size: 11px;
9731
+ }
9732
+
9733
+ .access-capture-leakage {
9734
+ font-variant-numeric: tabular-nums;
9735
+ }
9736
+
9737
+ .access-capture-oracle {
9738
+ display: flex;
9739
+ align-items: center;
9740
+ gap: 4px;
9741
+ }
9742
+
9743
+ /* ── Dark mode ──────────────────────────────────────────────────────────── */
9744
+
9745
+ [data-theme="dark"] .access-file-name--read {
9746
+ color: #93c5fd; /* blue-300 */
9747
+ }
9748
+
9749
+ [data-theme="dark"] .access-file-name--write {
9750
+ color: #86efac; /* green-300 */
9751
+ }
9752
+
9753
+ [data-theme="dark"] .access-file-name--leaked {
9754
+ color: #fcd34d; /* amber-300 */
9755
+ }
9756
+
9757
+ [data-theme="dark"] .access-badge--read {
9758
+ background: rgba(59, 130, 246, 0.2);
9759
+ color: #93c5fd;
9760
+ border-color: rgba(59, 130, 246, 0.4);
9761
+ }
9762
+
9763
+ [data-theme="dark"] .access-badge--write {
9764
+ background: rgba(34, 197, 94, 0.2);
9765
+ color: #86efac;
9766
+ border-color: rgba(34, 197, 94, 0.4);
9767
+ }
9768
+
9769
+ [data-theme="dark"] .access-badge--rw {
9770
+ background: rgba(20, 184, 166, 0.2);
9771
+ color: #5eead4;
9772
+ border-color: rgba(20, 184, 166, 0.4);
9773
+ }
9774
+
9775
+ [data-theme="dark"] .access-sigma-read {
9776
+ color: #93c5fd;
9777
+ }
9778
+
9779
+ [data-theme="dark"] .access-sigma-write {
9780
+ color: #86efac;
9781
+ }
9782
+
9783
+ /* ── File name button (reset) ────────────────────────────────────────────── */
9784
+
9785
+ .access-file-name-btn {
9786
+ appearance: none;
9787
+ -webkit-appearance: none;
9788
+ background: none;
9789
+ border: none;
9790
+ padding: 0;
9791
+ cursor: pointer;
9792
+ font: inherit;
9793
+ text-align: left;
9794
+ color: inherit;
9795
+ }
9796
+
9797
+
9798
+ /* ── Drawer panels (file-history / cell-detail) ─────────────────────────── */
9799
+
9800
+ .access-file-drawer,
9801
+ .access-cell-drawer {
9802
+ position: fixed;
9803
+ top: 0;
9804
+ right: 0;
9805
+ bottom: 0;
9806
+ width: 360px;
9807
+ display: flex;
9808
+ flex-direction: column;
9809
+ background: var(--surface);
9810
+ border-left: 1px solid var(--border);
9811
+ box-shadow: var(--shadow-lg), -2px 0 16px rgba(0, 0, 0, 0.08);
9812
+ z-index: 200;
9813
+ overflow: hidden;
9814
+ }
9815
+
9816
+ .access-drawer-header {
9817
+ display: flex;
9818
+ align-items: center;
9819
+ gap: 12px;
9820
+ padding: 12px 16px;
9821
+ border-bottom: 1px solid var(--border);
9822
+ flex-shrink: 0;
9823
+ }
9824
+
9825
+ .access-drawer-title {
9826
+ flex: 1;
9827
+ min-width: 0;
9828
+ font-size: 13px;
9829
+ font-weight: 600;
9830
+ color: var(--fg);
9831
+ overflow: hidden;
9832
+ text-overflow: ellipsis;
9833
+ white-space: nowrap;
9834
+ }
9835
+
9836
+ .access-drawer-close {
9837
+ display: inline-flex;
9838
+ align-items: center;
9839
+ justify-content: center;
9840
+ flex-shrink: 0;
9841
+ width: 28px;
9842
+ height: 28px;
9843
+ border: none;
9844
+ background: transparent;
9845
+ color: var(--muted);
9846
+ cursor: pointer;
9847
+ border-radius: 4px;
9848
+ font-size: 14px;
9849
+ line-height: 1;
9850
+ }
9851
+
9852
+ .access-drawer-close:hover {
9853
+ background: var(--bg-secondary);
9854
+ color: var(--fg);
9855
+ }
9856
+
9857
+ .access-drawer-body {
9858
+ flex: 1;
9859
+ overflow-y: auto;
9860
+ padding: 16px;
9861
+ display: flex;
9862
+ flex-direction: column;
9863
+ gap: 12px;
9864
+ }
9865
+
9866
+ .access-drawer-section-label {
9867
+ margin: 0 0 8px;
9868
+ font-size: 11px;
9869
+ font-weight: 600;
9870
+ text-transform: uppercase;
9871
+ letter-spacing: 0.05em;
9872
+ color: var(--muted);
9873
+ }
9874
+
9875
+ .access-drawer-empty {
9876
+ margin: 0;
9877
+ font-size: 13px;
9878
+ color: var(--muted);
9879
+ }
9880
+
9881
+ /* ── File history list ───────────────────────────────────────────────────── */
9882
+
9883
+ .access-file-history-list {
9884
+ list-style: none;
9885
+ margin: 0;
9886
+ padding: 0;
9887
+ display: flex;
9888
+ flex-direction: column;
9889
+ gap: 6px;
9890
+ }
9891
+
9892
+ .access-file-history-item {
9893
+ display: flex;
9894
+ flex-wrap: wrap;
9895
+ align-items: center;
9896
+ gap: 4px;
9897
+ padding: 8px 10px;
9898
+ border: 1px solid var(--border);
9899
+ border-radius: 6px;
9900
+ background: var(--bg-secondary);
9901
+ font-size: 12px;
9902
+ }
9903
+
9904
+ .access-history-stage {
9905
+ font-weight: 600;
9906
+ color: var(--fg);
9907
+ }
9908
+
9909
+ .access-history-iter {
9910
+ color: var(--muted);
9911
+ }
9912
+
9913
+ .access-history-bead {
9914
+ font-family: 'JetBrains Mono', 'SF Mono', 'Fira Code', monospace;
9915
+ font-size: 11px;
9916
+ padding: 1px 5px;
9917
+ border-radius: 3px;
9918
+ background: var(--bg-tertiary);
9919
+ color: var(--muted);
9920
+ }
9921
+
9922
+ .access-history-agent {
9923
+ flex: 1;
9924
+ min-width: 0;
9925
+ overflow: hidden;
9926
+ text-overflow: ellipsis;
9927
+ white-space: nowrap;
9928
+ color: var(--fg);
9929
+ }
9930
+
9931
+ .access-history-read {
9932
+ font-size: 11px;
9933
+ font-weight: 600;
9934
+ padding: 1px 5px;
9935
+ border-radius: 3px;
9936
+ background: rgba(59, 130, 246, 0.12);
9937
+ color: #1d4ed8;
9938
+ }
9939
+
9940
+ .access-history-write {
9941
+ font-size: 11px;
9942
+ font-weight: 600;
9943
+ padding: 1px 5px;
9944
+ border-radius: 3px;
9945
+ background: rgba(34, 197, 94, 0.12);
9946
+ color: #15803d;
9947
+ }
9948
+
9949
+ /* ── Timeline link ──────────────────────────────────────────────────────── */
9950
+
9951
+ .access-timeline-link {
9952
+ align-self: flex-start;
9953
+ border: none;
9954
+ background: transparent;
9955
+ padding: 0;
9956
+ font-size: 12px;
9957
+ color: var(--accent);
9958
+ cursor: pointer;
9959
+ text-decoration: underline;
9960
+ text-underline-offset: 2px;
9961
+ }
9962
+
9963
+ .access-timeline-link:hover {
9964
+ color: var(--accent-hover);
9965
+ }
9966
+
9967
+ /* ── Cell detail definition list ────────────────────────────────────────── */
9968
+
9969
+ .access-cell-detail {
9970
+ display: grid;
9971
+ grid-template-columns: auto 1fr;
9972
+ gap: 4px 12px;
9973
+ margin: 0;
9974
+ font-size: 13px;
9975
+ }
9976
+
9977
+ .access-cell-detail dt {
9978
+ font-weight: 600;
9979
+ color: var(--muted);
9980
+ white-space: nowrap;
9981
+ }
9982
+
9983
+ .access-cell-detail dd {
9984
+ margin: 0;
9985
+ color: var(--fg);
9986
+ word-break: break-all;
9987
+ }
9988
+
9989
+ [data-theme="dark"] .access-history-read {
9990
+ background: rgba(59, 130, 246, 0.2);
9991
+ color: #93c5fd;
9992
+ }
9993
+
9994
+ [data-theme="dark"] .access-history-write {
9995
+ background: rgba(34, 197, 94, 0.2);
9996
+ color: #86efac;
9997
+ }