@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/main.bundle.js +2667 -2024
- package/app/main.bundle.js.map +4 -4
- package/app/protocol.js +2 -0
- package/app/styles.css +1320 -6
- package/package.json +2 -2
- package/server/app.js +90 -0
- package/server/dispatch-defaults.js +5 -5
- package/server/dispatch-events-aggregator.js +27 -13
- package/server/dispatch-migration.js +35 -1
- package/server/events-jsonl-reader.js +93 -0
- package/server/file-access-aggregator.js +481 -0
- package/server/graph-query-aggregator.js +165 -0
- package/server/integrations/renderers.js +11 -0
- package/server/process-manager.js +86 -0
- package/server/project-routes.js +16 -3
- package/server/schemas/keys.json +5 -0
- package/server/template-prompts.js +136 -0
- package/server/templates-routes.js +287 -49
- package/server/watcher.js +122 -40
- package/server/ws-broadcaster.js +5 -4
- package/server/ws-message-router.js +23 -2
- package/server/ws-status-watcher.js +5 -1
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
|
-
|
|
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
|
+
}
|