sqlseed-web 0.2.4__py3-none-any.whl

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 (87) hide show
  1. sqlseed_web/AGENTS.md +106 -0
  2. sqlseed_web/__init__.py +24 -0
  3. sqlseed_web/__main__.py +8 -0
  4. sqlseed_web/_application.py +205 -0
  5. sqlseed_web/ai_settings.py +290 -0
  6. sqlseed_web/api.py +1102 -0
  7. sqlseed_web/app.py +26 -0
  8. sqlseed_web/managed_worker.py +184 -0
  9. sqlseed_web/operation_errors.py +42 -0
  10. sqlseed_web/plugin_environment.py +231 -0
  11. sqlseed_web/plugin_management.py +322 -0
  12. sqlseed_web/plugin_process.py +131 -0
  13. sqlseed_web/runtime_lifecycle.py +130 -0
  14. sqlseed_web/runtime_session.py +97 -0
  15. sqlseed_web/settings_environment.py +368 -0
  16. sqlseed_web/sqlite_target.py +86 -0
  17. sqlseed_web/state.py +348 -0
  18. sqlseed_web/static/AGENTS.md +180 -0
  19. sqlseed_web/static/ai.css +57 -0
  20. sqlseed_web/static/configs.css +50 -0
  21. sqlseed_web/static/date-picker.css +230 -0
  22. sqlseed_web/static/disclosure.css +149 -0
  23. sqlseed_web/static/graph-clarity.css +103 -0
  24. sqlseed_web/static/index.html +29 -0
  25. sqlseed_web/static/js/api.js +228 -0
  26. sqlseed_web/static/js/app.js +97 -0
  27. sqlseed_web/static/js/dropdown.js +432 -0
  28. sqlseed_web/static/js/filepicker.js +203 -0
  29. sqlseed_web/static/js/genform.js +1066 -0
  30. sqlseed_web/static/js/labels.js +195 -0
  31. sqlseed_web/static/js/pages/browse.js +209 -0
  32. sqlseed_web/static/js/pages/configs.js +424 -0
  33. sqlseed_web/static/js/pages/connect.js +332 -0
  34. sqlseed_web/static/js/pages/heal.js +395 -0
  35. sqlseed_web/static/js/pages/meta.js +110 -0
  36. sqlseed_web/static/js/pages/runs.js +293 -0
  37. sqlseed_web/static/js/pages/settings.js +942 -0
  38. sqlseed_web/static/js/pages/wizard.js +751 -0
  39. sqlseed_web/static/js/pages/workbench.js +3123 -0
  40. sqlseed_web/static/js/tree.js +126 -0
  41. sqlseed_web/static/js/workbench/ai-eligibility.js +33 -0
  42. sqlseed_web/static/js/workbench/ai-handoff.js +31 -0
  43. sqlseed_web/static/js/workbench/ai-stream.js +116 -0
  44. sqlseed_web/static/js/workbench/ai.js +888 -0
  45. sqlseed_web/static/js/workbench/connection.js +508 -0
  46. sqlseed_web/static/js/workbench/date-picker.js +445 -0
  47. sqlseed_web/static/js/workbench/dependency-view.js +119 -0
  48. sqlseed_web/static/js/workbench/editor.js +1236 -0
  49. sqlseed_web/static/js/workbench/focus.js +11 -0
  50. sqlseed_web/static/js/workbench/graph-layout.js +332 -0
  51. sqlseed_web/static/js/workbench/graph.js +970 -0
  52. sqlseed_web/static/js/workbench/guidance.js +29 -0
  53. sqlseed_web/static/js/workbench/model.js +124 -0
  54. sqlseed_web/static/js/workbench/plugin-management.js +512 -0
  55. sqlseed_web/static/js/workbench/preview-scroll-layout.js +94 -0
  56. sqlseed_web/static/js/workbench/preview.js +572 -0
  57. sqlseed_web/static/js/workbench/provider-guide.js +33 -0
  58. sqlseed_web/static/js/workbench/recovery.js +28 -0
  59. sqlseed_web/static/js/workbench/scroll-lock.js +26 -0
  60. sqlseed_web/static/js/workbench/session.js +174 -0
  61. sqlseed_web/static/js/workbench/table-data.js +186 -0
  62. sqlseed_web/static/js/workbench/ui.js +262 -0
  63. sqlseed_web/static/navigation.css +92 -0
  64. sqlseed_web/static/preview.css +29 -0
  65. sqlseed_web/static/runs.css +53 -0
  66. sqlseed_web/static/scrollbars.css +42 -0
  67. sqlseed_web/static/settings.css +108 -0
  68. sqlseed_web/static/style.css +3382 -0
  69. sqlseed_web/static/table-data.css +27 -0
  70. sqlseed_web/static/workbench.css +509 -0
  71. sqlseed_web/supervised_plugins.py +173 -0
  72. sqlseed_web/supervisor.py +238 -0
  73. sqlseed_web/workbench.py +381 -0
  74. sqlseed_web/workbench_ai.py +887 -0
  75. sqlseed_web/workbench_ai_relations.py +285 -0
  76. sqlseed_web/workbench_ai_stream.py +172 -0
  77. sqlseed_web/workbench_data.py +163 -0
  78. sqlseed_web/workbench_execution.py +199 -0
  79. sqlseed_web/workbench_runtime.py +1218 -0
  80. sqlseed_web/workbench_schema.py +277 -0
  81. sqlseed_web/workbench_store.py +458 -0
  82. sqlseed_web/worker_control.py +192 -0
  83. sqlseed_web-0.2.4.dist-info/METADATA +105 -0
  84. sqlseed_web-0.2.4.dist-info/RECORD +87 -0
  85. sqlseed_web-0.2.4.dist-info/WHEEL +4 -0
  86. sqlseed_web-0.2.4.dist-info/entry_points.txt +2 -0
  87. sqlseed_web-0.2.4.dist-info/licenses/LICENSE +679 -0
@@ -0,0 +1,27 @@
1
+ /* Shared read-only record viewer; independent from generated preview state. */
2
+ .run-view-data { display:flex; margin-top:8px; font-size:11px; min-height:30px; padding:4px 9px; }
3
+ .wb-table-data .wb-table-data-heading { display:flex; gap:16px; align-items:center; justify-content:space-between; }
4
+ .wb-table-data-heading h3 { margin:0; font-size:20px; overflow-wrap:anywhere; }
5
+ .wb-table-data-target { overflow-wrap:anywhere; user-select:text; font-size:12px; }
6
+ .wb-table-data-status { min-height:1.6em; font-size:12px; margin:14px 0 8px; }
7
+ .wb-table-data-error { color:var(--danger,#ac3434); font-size:13px; overflow-wrap:anywhere; }
8
+ .wb-table-data-error:empty { display:none; }
9
+ .wb-table-data-scroll { max-height:min(52vh,520px); overflow:auto; border:1px solid var(--line); border-radius:8px; }
10
+ .wb-table-data-scroll table { width:100%; border-spacing:0; border-collapse:separate; font-size:12px; }
11
+ .wb-table-data-scroll caption { position:absolute; width:1px; height:1px; overflow:hidden; clip-path:inset(50%); }
12
+ .wb-table-data-scroll th { position:sticky; top:0; z-index:1; background:var(--soft); text-align:left; white-space:nowrap; padding:10px 14px; border-bottom:1px solid var(--line); }
13
+ .wb-table-data-scroll th small { display:block; font-size:11px; color:var(--muted); font-weight:400; margin-top:4px; }
14
+ .wb-table-data-scroll td { padding:10px 14px; border-bottom:1px solid var(--line); vertical-align:top; max-width:28rem; white-space:pre-wrap; overflow-wrap:anywhere; user-select:text; font-family:var(--mono,monospace); }
15
+ .wb-table-data-scroll tbody tr:last-child td { border-bottom:0; }
16
+ .wb-table-data-scroll tbody tr:hover { background:var(--wash); }
17
+ .wb-table-data-value summary { cursor:pointer; min-width:180px; color:var(--teal); }
18
+ .wb-table-data-value pre { white-space:pre-wrap; overflow-wrap:anywhere; margin:8px 0 0; font:inherit; }
19
+ .wb-table-data-pagination { display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between; gap:12px; margin-top:14px; font-size:12px; }
20
+ .wb-table-data-pagination > div { display:flex; gap:8px; }
21
+ .wb-table-data-read-at,.wb-table-data-order,.wb-table-data-empty { font-size:12px; }
22
+ .wb-table-data-empty { padding:20px 14px; background:var(--wash); }
23
+ @media(max-width:760px) {
24
+ .wb-table-data-heading { flex-wrap:wrap; }
25
+ .wb-table-data-scroll { max-height:48vh; }
26
+ .wb-table-data-scroll td { min-width:100px; max-width:240px; }
27
+ }
@@ -0,0 +1,509 @@
1
+ /* Workbench-specific components of the v8 design. Shared tokens, typography,
2
+ layout and controls live in style.css; there is no alternate page theme. */
3
+ .wb-config-tools { display:flex; align-items:center; gap:14px; margin-top:10px; font-size:11px; }
4
+ .wb-config-tools .btn { padding:0; min-height:20px; border:0; background:none; font-weight:400; color:var(--muted); font-size:11px; }
5
+ .wb-config-tools .btn:hover { color:var(--teal); }
6
+ .wb-config-tools .icon { width:13px; height:13px; }
7
+ .wb-config-name { flex-direction:row-reverse; }
8
+ .wb-config-name .icon { width:16px; height:16px; color:var(--muted); margin-left:12px; }
9
+ .wb-welcome { max-width:680px; margin:10vh auto; padding:48px; text-align:center; background:var(--paper); border:1px solid var(--line); border-radius:12px; }
10
+ .wb-welcome>.icon { height:38px; width:38px; margin:0 auto 24px; color:var(--teal); }
11
+ .wb-welcome p { color:var(--muted); margin:18px 0 28px; }
12
+ .wb-welcome-steps { display:flex; justify-content:center; gap:22px; font-size:11px; color:var(--muted); padding-top:32px; }
13
+ .wb-table-list { max-height:550px; overflow:auto; }
14
+ .wb-source { overflow-wrap:anywhere; text-align:left; }
15
+ .wb-rule-button { display:block; text-align:left; padding:0; width:100%; }
16
+ .wb-rule-button:hover .rule-line { color:var(--teal); }
17
+ .wb-rule-button .rule-meta { overflow-wrap:anywhere; }
18
+ .wb-notice { overflow-wrap:anywhere; }
19
+ .wb-error { color:#a15813!important; }
20
+ .wb-success { color:var(--teal); }
21
+ .wb-preview-notice { font-size:11px; padding:0 27px; }
22
+ .wb-preview-notice:empty { display:none; }
23
+ .wb-key-values { display:grid; grid-template-columns:90px minmax(0,1fr); row-gap:16px; font-size:13px; padding:10px 0; }
24
+ .wb-key-values dt { color:var(--muted); }
25
+ .wb-key-values dd { margin:0; overflow-wrap:anywhere; }
26
+ .wb-edge-mapping { display:grid; gap:18px; background:#f5f9fa; padding:12px; border-radius:6px; }
27
+ .wb-edge-mapping>div { display:grid; gap:6px; font-size:12px; overflow-wrap:anywhere; }
28
+ .wb-code { width:100%; font:12px/1.7 var(--mono); padding:14px; border:1px solid var(--line); border-radius:7px; background:#f8fafb; resize:vertical; color:var(--ink); }
29
+ .wb-draft-card { width:100%; padding:13px 15px; margin:8px 0; text-align:left; display:flex; justify-content:space-between; align-items:center; gap:12px; border:1px solid var(--line); border-radius:7px; background:#fff; }
30
+ .wb-draft-card:hover { background:var(--soft); }
31
+ .wb-draft-card small { color:var(--muted); }
32
+ .wb-summary-total { padding:16px 0; color:var(--muted); }
33
+ .wb-summary-total strong { font-size:28px; color:var(--ink); }
34
+ .wb-summary-plan { padding:0; list-style:none; }
35
+ .wb-summary-plan li { display:flex; justify-content:space-between; padding:9px 0; border-bottom:1px solid var(--line); }
36
+ .wb-summary-plan li>span:last-child { color:var(--muted); }
37
+ .wb-import-help { font:12px/1.6 var(--mono); padding:12px; background:#f5f9fa; border-radius:7px; overflow:auto; }
38
+ .wb-imported-note { display:flex; align-items:center; justify-content:space-between; gap:12px; margin-bottom:15px; font-size:12px; color:var(--muted); }
39
+ .wb-settings-note { font-size:12px; color:var(--muted); }
40
+ .wb-page .execution-table { display:inline-flex; align-items:center; color:var(--ink); }
41
+ .wb-page .execution-table:hover { color:var(--teal); box-shadow:inset 0 0 0 1px var(--teal); }
42
+ .wb-page .inspector-field .field-card-heading { display:flex; align-items:center; justify-content:space-between; gap:10px; }
43
+ .wb-page .inspector-field .field-card-heading small { font-size:10px; color:var(--muted); }
44
+ .wb-page .inspector-field .sample { font-size:11px; color:#577969; }
45
+ .wb-page .inspector-field { width:100%; text-align:left; }
46
+ .wb-page .inspector-table-title { display:flex; align-items:center; justify-content:space-between; }
47
+ .wb-page .inspector-table-title small { font-size:11px; color:var(--muted); }
48
+ .wb-page .inspector-actions>.btn { width:100%; margin-top:10px; }
49
+ .wb-page .inspector-tabs { display:flex; gap:18px; padding:0 13px; border-bottom:1px solid var(--line); background:#f8fafb; }
50
+ .wb-page .inspector-tabs button { font-size:12px; padding:12px 0; border-bottom:2px solid transparent; color:var(--muted); }
51
+ .wb-page .inspector-tabs button.active { border-color:var(--teal); color:var(--teal); font-weight:600; }
52
+ @media(max-width:760px) {
53
+ .wb-welcome { padding:28px 18px; margin:4vh auto; }
54
+ .wb-welcome-steps { gap:8px; flex-wrap:wrap; }
55
+ .wb-config-tools { gap:12px; }
56
+ .wb-table-list { max-height:none; overflow-x:auto; }
57
+ .wb-key-values { grid-template-columns:70px minmax(0,1fr); }
58
+ }
59
+ /* Component additions to the v8 prototype baseline, for root to integrate.
60
+ graph.js uses graph-toolbar / graph-filters / path-scope / graph-meta /
61
+ graph-canvas / schema-graph / graph-node / graph-edge / graph-label directly.
62
+ editor.js uses generator-heading/picker/options and control/column-constraints.
63
+ Keep the prototype definitions for these classes; remove former wb/sg skins. */
64
+
65
+ .graph-controls,
66
+ .graph-visual { min-width: 0; }
67
+ .graph-controls .graph-toolbar { margin: 17px 0 12px; }
68
+ .graph-controls [hidden],
69
+ .rule-editor [hidden] { display: none !important; }
70
+ .graph-controls .graph-search { margin-left: auto; }
71
+ .graph-controls .graph-search > button {
72
+ border: 0; background: transparent; color: var(--muted);
73
+ font-size: 10px; padding: 2px; white-space: nowrap;
74
+ }
75
+ .graph-controls .graph-search > button:disabled { opacity: .45; cursor: default; }
76
+ .graph-visual .schema-graph { overflow: visible; }
77
+ .graph-visual .graph-canvas { touch-action: none; }
78
+ .graph-visual .graph-meta { margin-top: 0; }
79
+ .graph-visual .graph-tools .graph-zoom-label {
80
+ min-width: 38px; text-align: center; font: 10px var(--mono); cursor: help;
81
+ }
82
+ .graph-visual .graph-footer input {
83
+ width: 14px; height: 14px; min-width: 14px; margin: 0; accent-color: var(--teal);
84
+ }
85
+ .graph-empty { padding: 72px 24px; text-align: center; font-size: 12px; color: var(--muted); }
86
+ .graph-canvas:focus-visible,
87
+ .graph-controls button:focus-visible,
88
+ .graph-visual button:focus-visible { outline: 2px solid var(--teal); outline-offset: 3px; }
89
+
90
+ .rule-editor { min-width: 0; font-size: 12px; color: var(--ink); }
91
+ .rule-heading { display: flex; align-items: baseline; flex-wrap: wrap; gap: 10px; margin-bottom: 18px; }
92
+ .rule-heading strong { font-size: 17px; }
93
+ .rule-heading span { font-size: 11px; }
94
+ .drawer-body .rule-heading { display: none; } /* The drawer header already names the column. */
95
+ .rule-editor .control { display: block; margin: 18px 0; }
96
+ .rule-editor .control > label { display: block; color: var(--muted); }
97
+ .rule-editor .editor-control-label { display: block; }
98
+ .rule-editor .control input:not([type=checkbox]),
99
+ .rule-editor .control textarea,
100
+ .rule-editor .control .dropdown { width: 100%; min-width: 0; margin-top: 8px; }
101
+ .rule-editor .control input[type=checkbox] {
102
+ display: inline-block; width: 14px; height: 14px; min-width: 14px;
103
+ padding: 0; margin: 8px 0 0; accent-color: var(--teal);
104
+ }
105
+ .rule-editor .control small { display: block; margin-top: 5px; }
106
+ .rule-editor .generator-heading .btn { gap: 10px; }
107
+ .rule-editor .generator-all {
108
+ display: flex; align-items: center; gap: 6px; margin-top: 8px;
109
+ font-size: 10px; color: var(--muted); cursor: pointer;
110
+ }
111
+ .rule-editor .generator-all input {
112
+ width: 13px; height: 13px; min-width: 13px; margin: 0; accent-color: var(--teal);
113
+ }
114
+ .rule-editor .generator-options button { text-align: left; color: var(--ink); min-width:0; overflow-wrap:anywhere; padding:10px 12px; }
115
+ .rule-editor .generator-options .editor-note { grid-column: 1 / -1; }
116
+ .rule-editor .editor-note { margin-top: 10px; }
117
+ .rule-editor .column-constraints { margin-top: 18px; border-top: 1px solid var(--line); padding-top: 14px; }
118
+ .rule-editor .editor-reset { margin-top: 16px; }
119
+ .editor-error { color: #a95023; font-size: 11px; line-height: 1.8; margin-bottom: 10px; }
120
+ .editor-error:empty { display: none; }
121
+ .rule-editor [aria-invalid=true] { border-color: #b16c3c !important; }
122
+
123
+ /* ui.modal uses the exact v8 overlay/modal/drawer skeleton. These aliases
124
+ replace ID-only prototype rules and allow more than one modal purpose. */
125
+ .modal > .modal-body { overflow: auto; min-height: 0; }
126
+ .modal { max-height: calc(100vh - 38px); display: flex; flex-direction: column; }
127
+ .modal-wide { width: min(860px, calc(100% - 36px)); }
128
+ .modal-head,
129
+ .modal-footer { flex-shrink: 0; }
130
+ .drawer > .drawer-body { overflow: auto; min-height: 0; padding: 0 3px 8px; }
131
+ .drawer > .drawer-head,
132
+ .drawer > .drawer-footer { flex-shrink: 0; }
133
+ .drawer > .drawer-head h2 { font-size: 17px; overflow-wrap: anywhere; }
134
+
135
+ @media (max-width: 760px) {
136
+ .graph-controls .graph-search { margin-left: 0; }
137
+ .rule-editor .generator-options { grid-template-columns: 1fr 1fr; }
138
+ }
139
+
140
+ /* Usability refinement: clear scope, readable controls and room for focus rings. */
141
+ .wb-page .heading { align-items:center; gap:14px 18px; flex-wrap:wrap; margin-bottom:12px; }
142
+ .wb-page .heading .title-line { min-width:0; flex-wrap:wrap; gap:10px; }
143
+ .wb-page .heading h1 { font-size:23px; }
144
+ .wb-page .wb-config-name { overflow-wrap:anywhere; text-align:left; }
145
+ .wb-page .wb-config-name .icon { flex-shrink:0; }
146
+ .wb-page .heading-actions { gap:10px; flex-wrap:wrap; align-items:flex-start; }
147
+ .wb-page .wb-config-context { display:flex; align-items:center; flex-wrap:wrap; gap:8px 18px; margin-bottom:16px; padding:10px 14px; border:1px solid var(--line); border-radius:8px; background:var(--paper); }
148
+ .wb-config-context [data-provider-warning] { flex-basis:100%; min-width:0; padding-top:10px; border-top:1px solid var(--line); color:#805323; font-size:13px; line-height:1.7; overflow-wrap:anywhere; }
149
+ .wb-config-context [data-provider-warning][hidden] { display:none; }
150
+ .wb-config-context [data-provider-warning] p { margin:0 0 8px; }
151
+ .wb-config-context [data-provider-warning] .btn { margin:0 8px 0 0; }
152
+ .wb-next-step { margin-bottom:16px; padding:10px 14px; border:1px solid var(--line); border-radius:8px; background:var(--paper); }
153
+ .wb-next-step-heading { display:flex; align-items:center; justify-content:space-between; gap:12px; color:var(--muted); font-size:12px; }
154
+ .wb-next-step-body { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:14px 24px; padding-top:6px; }
155
+ .wb-next-step-body[hidden] { display:none; }
156
+ .wb-next-step-main { min-width:0; }
157
+ .wb-next-step-main h3 { margin:0 0 5px; font-size:14px; }
158
+ .wb-next-step-main p { margin:0 0 8px; font-size:12px; line-height:1.65; color:var(--muted); }
159
+ .wb-next-step-actions { display:flex; align-items:center; flex-wrap:wrap; gap:8px; }
160
+ .wb-next-step-ai { display:flex; flex-direction:column; align-items:flex-start; gap:6px; padding-left:20px; border-left:1px solid var(--line); }
161
+ .wb-next-step-ai>span { display:flex; align-items:center; gap:6px; font-size:13px; }
162
+ .wb-next-step-ai small { font-size:11px; color:var(--muted); }
163
+ @media(max-width:760px) {
164
+ .wb-next-step-body { grid-template-columns:minmax(0,1fr); }
165
+ .wb-next-step-ai { border-left:0; border-top:1px solid var(--line); padding:10px 0 0; flex-direction:row; align-items:center; flex-wrap:wrap; }
166
+ }
167
+ .wb-page .wb-config-tools { gap:10px; flex-wrap:wrap; margin:0; }
168
+ .wb-page .wb-config-tools .btn { padding:5px 9px; min-height:30px; border:1px solid var(--line); border-radius:6px; background:var(--paper); font-size:12px; }
169
+ .wb-generation-settings { display:grid; grid-template-columns:minmax(180px,1fr) minmax(180px,1fr) minmax(180px,1fr); gap:12px; padding:16px 20px; margin:4px 0 16px; border:1px solid var(--line); border-radius:10px; background:var(--paper); }
170
+ .wb-settings-heading { display:flex; align-items:center; flex-wrap:wrap; gap:8px; font-size:13px; }
171
+ .wb-settings-heading small { width:100%; font-size:11px; color:var(--muted); }
172
+ .wb-setting-tile { display:grid; grid-template-columns:1fr auto; gap:5px 12px; padding:10px 14px; border:1px solid var(--line); border-radius:7px; text-align:left; background:#f6faf9; }
173
+ .wb-setting-tile small { color:var(--muted); font-size:11px; }
174
+ .wb-setting-tile strong { grid-row:2; font:600 14px var(--mono); }
175
+ .wb-setting-tile span { grid-column:2; grid-row:1 / 3; align-self:center; font-size:12px; color:var(--teal); }
176
+ .wb-setting-tile:hover { border-color:var(--teal); }
177
+ .wb-page .selection-actions { display:flex; gap:8px; padding:0 8px 10px; }
178
+ .wb-page .wb-sidebar .sidebar-label { margin-left:9px; margin-right:9px; margin-top:16px; margin-bottom:10px; }
179
+ .wb-page .selection-actions .btn { padding:6px 10px; min-height:30px; border:1px solid var(--line); border-radius:6px; background:var(--paper); font-size:12px; }
180
+ .wb-page .wb-field-name { cursor:pointer; text-decoration:underline; text-decoration-color:var(--line); text-underline-offset:4px; }
181
+ .wb-source-card { padding:12px; border:1px solid var(--line); border-radius:7px; margin:10px 0; font-size:12px; overflow-wrap:anywhere; background:#f7faf9; }
182
+ .wb-source-card strong { font-size:11px; }
183
+ .wb-source-card p { margin:8px 0; line-height:1.6; color:var(--muted); }
184
+ .wb-overlay .wb-modal-actions { display:flex; justify-content:flex-end; gap:12px; flex-wrap:wrap; padding-top:12px; }
185
+ .wb-overlay .wb-modal-actions .btn { margin:0; }
186
+ .wb-overlay .drawer > .drawer-body { padding:8px 8px 14px; }
187
+ .wb-modal .control { min-width:0; margin:16px 0; }
188
+ .wb-modal input[type=checkbox],.wb-modal input[type=radio] { accent-color:var(--teal); }
189
+ .wb-modal .control input:not([type=checkbox]):not([type=radio]),.wb-modal .control textarea,.wb-modal .dropdown { max-width:100%; min-width:0; }
190
+ .wb-modal input:focus-visible,.wb-modal textarea:focus-visible,.wb-modal .dropdown-btn:focus-visible,.wb-modal button:focus-visible { outline:2px solid #74b7c9; outline-offset:1px; }
191
+ .wb-modal .modal-body { padding:4px; }
192
+ .wb-modal .drawer-body input[type=date],.wb-modal .drawer-body input[type=time] { display:block; box-sizing:border-box; min-height:38px; }
193
+ .wb-generator-guide,.wb-editor-default { padding:12px; border-radius:7px; background:#f0f7f4; margin:12px 0; overflow-wrap:anywhere; }
194
+ .wb-generator-purpose { font-size:12px; line-height:1.6; }
195
+ .wb-generator-example { display:block; margin-top:5px; font:11px/1.6 var(--mono); color:var(--teal); overflow-wrap:anywhere; }
196
+ .wb-parameter-hint { display:block; font-size:11px; line-height:1.6; color:var(--muted); margin:5px 0; }
197
+ .wb-param-presets,.wb-weekday-options { display:flex; flex-wrap:wrap; gap:8px; margin:8px 0; }
198
+ .wb-param-presets button { padding:5px 9px; border:1px solid var(--line); border-radius:5px; font-size:11px; background:var(--paper); }
199
+ .wb-weekday-options label { display:flex; gap:5px; align-items:center; font-size:12px; }
200
+ .rule-editor details { border:1px solid var(--line); border-radius:7px; padding:12px; margin:16px 0; }
201
+ .rule-editor details > summary { cursor:pointer; font-weight:600; }
202
+ .connection-group { border:1px solid var(--line); border-radius:8px; padding:14px; margin:12px 0; }
203
+ .connection-group-heading { display:flex; justify-content:space-between; gap:12px; align-items:center; }
204
+ .connection-target { font-size:11px; color:var(--muted); overflow-wrap:anywhere; margin:7px 0 12px; }
205
+ .connection-session { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:8px; margin:8px 0; align-items:center; }
206
+ .connection-session .connection-card { margin:0; }
207
+ .connection-session-help { display:block; font-size:11px; color:var(--muted); margin:8px 0; }
208
+ .connection-add-title { border-top:1px solid var(--line); padding-top:18px; margin-top:22px; }
209
+ .connection-notice:empty { display:none; }
210
+ .connection-modal .connection-notice { font-size:12px; line-height:1.6; color:var(--teal); overflow-wrap:anywhere; }
211
+ .connection-modal .connection-file-path { align-items:center; }
212
+ .connection-modal .connection-file-path input { flex:1; }
213
+ .connection-modal .connection-file-path > button { flex:none; min-height:38px; margin:0; }
214
+ .connection-modal button:disabled { opacity:.55; cursor:default; }
215
+ .connection-modal [aria-busy=true] button:disabled { cursor:wait; }
216
+ .connection-modal .connection-card:disabled { cursor:default; }
217
+ .run-metrics { display:grid; grid-template-columns:1fr 1fr; gap:16px; margin:20px 0; }
218
+ .run-metrics .run-total { display:flex; flex-direction:column; align-items:flex-start; gap:6px; padding:16px; margin:0; border:1px solid var(--line); border-radius:8px; }
219
+ .run-metrics .run-committed { background:#f0f7f4; }
220
+ .run-metric-label,.run-count-explanation { font-size:12px; color:var(--muted); line-height:1.7; }
221
+ .wb-ai-settings,.wb-ai-form,.wb-ai-diff { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px; }
222
+ .wb-ai-actions,.wb-ai-scope { display:flex; align-items:center; gap:12px; flex-wrap:wrap; margin:14px 0; }
223
+ .wb-ai-suggestion { padding:14px; border:1px solid var(--line); border-radius:7px; margin:12px 0; }
224
+ .wb-ai-suggestion label { display:flex; align-items:center; gap:8px; }
225
+ .wb-ai-suggestion input[type=checkbox] { width:15px; height:15px; }
226
+ .wb-ai-diff > * { min-width:0; overflow-wrap:anywhere; background:#f5f9fa; padding:10px; border-radius:6px; }
227
+ .wb-ai-diff pre { font-size:11px; white-space:pre-wrap; overflow-wrap:anywhere; }
228
+ .wb-ai-status { font-size:12px; line-height:1.7; overflow-wrap:anywhere; }
229
+ @media(max-width:900px) {
230
+ .wb-generation-settings { grid-template-columns:1fr 1fr; }
231
+ .wb-settings-heading { grid-column:1 / -1; }
232
+ .wb-settings-heading small { width:auto; }
233
+ }
234
+ @media(max-width:600px) {
235
+ .wb-generation-settings,.wb-ai-settings,.wb-ai-form,.wb-ai-diff,.run-metrics { grid-template-columns:1fr; }
236
+ .connection-session { grid-template-columns:minmax(0,1fr); }
237
+ .wb-page .heading-actions { width:100%; }
238
+ .wb-page .heading-actions > button { flex:1; }
239
+ }
240
+ .wb-ai-settings { display:block; margin:16px 0; padding:14px; border:1px solid var(--line); border-radius:8px; }
241
+ .wb-ai-settings > summary { cursor:pointer; font-weight:600; }
242
+ .wb-ai-settings-form { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:4px 18px; margin-top:10px; }
243
+ .wb-ai-settings-form .control input { display:block; width:100%; margin-top:8px; }
244
+ .wb-ai-settings-form .hint,.wb-ai-settings-form small { display:block; font-size:11px; color:var(--muted); line-height:1.6; margin-top:6px; }
245
+ .wb-ai-settings-form .wb-ai-models,.wb-ai-settings-form .wb-ai-actions { grid-column:1 / -1; }
246
+ .wb-ai-scope label { display:flex; align-items:center; gap:7px; }
247
+ .wb-ai-scope input { width:15px; height:15px; margin:0; }
248
+ .rule-editor .generator-options { grid-template-columns:1fr; max-height:310px; padding:4px; gap:8px; }
249
+ .rule-editor .generator-options .wb-generator-example { font:11px/1.6 var(--mono); color:var(--teal); margin-top:5px; }
250
+ .rule-editor .generator-options .wb-generator-purpose { font-size:12px; line-height:1.6; }
251
+ @media(max-width:600px) { .wb-ai-settings-form { grid-template-columns:1fr; } }
252
+ .wb-modal.modal-wide { width:min(860px,calc(100% - 36px)); }
253
+ .wb-ai-settings-form .wb-ai-models:empty { display:none; }
254
+ .wb-ai-progress { flex-basis:100%; display:flex; flex-wrap:wrap; align-items:baseline; gap:6px 14px; padding:10px 12px; border:1px solid var(--line); border-radius:7px; background:var(--soft); font-size:12px; line-height:1.5; }
255
+ .wb-ai-progress[hidden] { display:none; }
256
+ .wb-ai-progress strong { flex:1; min-width:180px; overflow-wrap:anywhere; }
257
+ .wb-ai-progress > span { color:var(--muted); white-space:nowrap; font-variant-numeric:tabular-nums; }
258
+ .wb-ai-diagnostics { margin:12px 0; padding:12px; border:1px solid var(--line); border-radius:7px; }
259
+ .wb-ai-diagnostics summary { cursor:pointer; font-weight:600; }
260
+ .wb-ai-diagnostics ul { margin:10px 0 0; padding-left:20px; line-height:1.7; overflow-wrap:anywhere; }
261
+
262
+ /* Reviewed hierarchy: compact global context, one preview entry, separate field facts. */
263
+ .wb-page .wb-generation-settings { display:flex; align-items:center; flex-wrap:wrap; padding:0; gap:10px; margin:0 0 0 auto; border:0; border-radius:0; background:transparent; }
264
+ .wb-page .wb-settings-heading { font-size:11px; color:var(--muted); }
265
+ .wb-page .wb-settings-heading small { width:auto; }
266
+ .wb-page .wb-setting-tile { display:flex; align-items:center; gap:8px; padding:6px 10px; }
267
+ .wb-page .wb-setting-tile strong { font-size:13px; }
268
+ .wb-operation-status { margin:0 0 12px; padding:10px 14px; border:1px solid var(--line); background:var(--soft); border-radius:7px; font-size:13px; }
269
+ .wb-operation-status[hidden] { display:none; }
270
+ .wb-button[disabled] { opacity:.6; }
271
+ .wb-button[aria-busy=true] { cursor:wait; }
272
+ .wb-ai-protected { padding:12px; background:var(--soft); border-radius:7px; color:var(--muted); line-height:1.6; }
273
+ .wb-provider-guide { border:1px solid var(--line); padding:14px; border-radius:8px; background:var(--soft); font-size:13px; }
274
+ .wb-provider-guide h3 { margin:0 0 10px; display:flex; align-items:center; gap:10px; }
275
+ .wb-provider-guide h3 small { color:var(--teal); font-size:11px; }
276
+ .wb-provider-guide ul { padding-left:18px; line-height:1.7; }
277
+ .wb-provider-example { padding:4px 10px; border-radius:6px; background:var(--paper); overflow-wrap:anywhere; }
278
+ .wb-provider-guide > small { display:block; margin-top:7px; font-size:11px; }
279
+ .wb-provider-limit { color:var(--muted); }
280
+ .wb-provider-guide summary { cursor:pointer; min-height:28px; }
281
+ .wb-provider-guide a { display:inline-block; margin:6px 12px 0 0; }
282
+ .wb-structure-menu { position:relative; margin-top:12px; }
283
+ .wb-structure-menu > summary { display:flex; align-items:center; gap:8px; cursor:pointer; min-height:32px; color:var(--teal); font-size:12px; }
284
+ .wb-structure-menu > summary::after { content:'⌄'; margin-left:auto; }
285
+ .wb-structure-commands { display:flex; flex-direction:column; gap:8px; padding:10px; background:var(--paper); border:1px solid var(--line); border-radius:8px; }
286
+ .wb-structure-commands .btn { justify-content:flex-start; }
287
+ .wb-field-tabs { display:flex; border-bottom:1px solid var(--line); margin-bottom:18px; }
288
+ .wb-field-tabs [role=tab] { min-height:42px; padding:10px 16px; border:0; border-bottom:2px solid transparent; border-radius:0; background:none; }
289
+ .wb-field-tabs [aria-selected=true] { border-bottom-color:var(--teal); color:var(--teal); font-weight:600; }
290
+ .wb-field-facts { display:grid; grid-template-columns:110px minmax(0,1fr); gap:12px; }
291
+ .wb-field-facts dt { color:var(--muted); }
292
+ .wb-field-facts dd { margin:0; overflow-wrap:anywhere; }
293
+ .wb-drawer [role=tabpanel][hidden] { display:none; }
294
+
295
+ .wb-write-strategy { border:1px solid var(--line); border-radius:9px; padding:12px 16px; margin:16px 0; min-width:0; }
296
+ .wb-write-strategy legend { font-weight:600; padding:0 6px; }
297
+ .wb-write-strategy label { display:flex; align-items:flex-start; gap:10px; padding:9px 0; cursor:pointer; }
298
+ .wb-write-strategy input { margin-top:3px; flex:none; }
299
+ .wb-write-strategy small { display:block; color:var(--muted); margin-top:4px; line-height:1.6; }
300
+ .wb-write-strategy .wb-reset-identity { border-top:1px solid var(--line); margin-top:6px; padding-top:14px; }
301
+ .wb-execution-plan { padding:12px 16px; border-radius:8px; background:var(--wash); }
302
+ .wb-execution-plan ul { padding-left:22px; }
303
+
304
+ /* Preview is a read-only result view; configuration remains on the workbench. */
305
+ .wb-config-document { display:inline-flex; align-items:center; gap:7px; padding:5px 9px; min-height:30px; color:var(--muted); background:transparent; border:1px solid transparent; border-radius:6px; font-size:12px; }
306
+ .wb-config-document:hover { background:var(--soft); color:var(--teal); }
307
+ .modal.wb-data-preview { width:min(1080px,calc(100% - 40px)); }
308
+ .wb-preview-controls { display:flex; align-items:flex-end; flex-wrap:wrap; gap:12px; margin:20px 0 10px; }
309
+ .wb-preview-field { display:flex; flex-direction:column; gap:7px; min-width:0; color:var(--muted); font-size:12px; }
310
+ .wb-preview-field .dropdown { width:260px; max-width:100%; }
311
+ .wb-preview-field input[type=number] { width:130px; height:38px; margin:0; padding:7px 10px; border:1px solid var(--line); border-radius:7px; background:var(--paper); color:var(--ink); font-variant-numeric:tabular-nums; }
312
+ .wb-preview-field .dropdown-btn { height:38px; min-height:38px; }
313
+ .wb-preview-controls > .btn { height:38px; min-height:38px; }
314
+ .wb-preview-help { margin:8px 0 14px; color:var(--muted); font-size:12px; line-height:1.6; }
315
+ .wb-preview-status { margin:12px 0; font-size:13px; }
316
+ .wb-preview-error { color:#a15813; font-size:13px; }
317
+ .wb-preview-error:empty,.wb-preview-issues:empty { display:none; }
318
+ .wb-preview-issues { padding:10px 14px; border:1px solid var(--line); border-radius:8px; background:var(--soft); font-size:12px; line-height:1.6; }
319
+ .wb-preview-issues p { margin:4px 0; }
320
+ .wb-preview-tables:empty { display:none; }
321
+ .wb-preview-tables { display:flex; flex-wrap:wrap; gap:7px; margin:16px 0 12px; }
322
+ .wb-preview-tables .btn[aria-pressed=true] { border-color:var(--teal); color:var(--teal); background:var(--soft); }
323
+ .wb-preview-summary { margin:12px 0; font-size:13px; }
324
+ /* Short inline previews stay natural; long tables retain their fixed headers. */
325
+ .wb-preview-scroll { overflow-x:auto; border:1px solid var(--line); border-radius:8px; }
326
+ .wb-preview-scroll.wb-preview-long { max-height:55vh; overflow:auto; }
327
+ /* Only the measured desktop table or the modal body scrolls vertically. */
328
+ .modal.wb-data-preview > .modal-body { display:flex; flex-direction:column; scrollbar-gutter:stable; }
329
+ .modal.wb-data-preview > .modal-body > * { flex:none; }
330
+ .modal.wb-data-preview .wb-preview-results { display:flex; flex-direction:column; }
331
+ .modal.wb-data-preview .wb-preview-results > * { flex:none; }
332
+ .modal.wb-data-preview.wb-preview-table-scroll > .modal-body { overflow:hidden; }
333
+ .wb-preview-data { width:max-content; min-width:100%; border-collapse:collapse; table-layout:auto; font-size:12px; }
334
+ .wb-preview-data caption { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip-path:inset(50%); white-space:nowrap; }
335
+ .wb-preview-data thead th { position:sticky; top:0; z-index:1; background:var(--soft); text-align:left; white-space:nowrap; }
336
+ .wb-preview-data th,.wb-preview-data td { padding:10px 12px; border-bottom:1px solid var(--line); vertical-align:top; }
337
+ .wb-preview-data td { min-width:100px; max-width:320px; overflow-wrap:anywhere; font-family:var(--mono); }
338
+ .wb-preview-data tbody th { text-align:left; font-weight:400; }
339
+ .wb-preview-data th:first-child,.wb-preview-data td:first-child { min-width:40px; width:44px; color:var(--muted); }
340
+ .wb-preview-data tr:last-child td { border-bottom:0; }
341
+ .wb-preview-data .wb-preview-placeholder { font-family:inherit; font-size:11px; color:var(--muted); }
342
+ .wb-preview-empty { padding:22px 14px; border:1px dashed var(--line); border-radius:8px; color:var(--muted); line-height:1.6; }
343
+ @media(max-width:600px) {
344
+ .modal.wb-data-preview { width:calc(100% - 20px); }
345
+ .wb-preview-controls { gap:10px; }
346
+ .wb-preview-field:first-child { width:100%; }
347
+ .wb-preview-field .dropdown { width:100%; }
348
+ }
349
+
350
+ /* Object-focused workbench: table navigation and table content size independently. */
351
+ .wb-page .wb-workspace { grid-template-columns:264px minmax(0,1fr); align-items:start; gap:16px; border:0; border-radius:0; background:transparent; overflow:visible; min-height:0; }
352
+ .wb-page .wb-sidebar { border:1px solid var(--line); border-radius:10px; padding:14px 12px; min-width:0; }
353
+ .wb-page .wb-content { border:1px solid var(--line); border-radius:10px; background:var(--paper); overflow:hidden; min-width:0; }
354
+ .wb-page .wb-sidebar .source { padding:0 8px 12px; }
355
+ .wb-page .wb-sidebar .source-note { margin-top:6px; }
356
+ .wb-page .wb-table-search { display:flex; margin:0 8px 10px; width:auto; min-width:0; }
357
+ .wb-page .wb-table-search input { width:100%; min-width:0; }
358
+ .wb-page .wb-table-list { max-height:360px; min-height:0; overflow:auto; }
359
+ .wb-page .wb-table-entry { display:grid; grid-template-columns:16px minmax(0,1fr) 28px; gap:6px; padding:0 6px; margin:2px 0; }
360
+ .wb-page .wb-table-entry .wb-table-name { display:flex; flex-direction:column; align-items:flex-start; gap:3px; padding:9px 0; min-width:0; }
361
+ .wb-page .wb-table-name .table-name { width:100%; white-space:normal; overflow-wrap:anywhere; font-size:12px; line-height:1.4; }
362
+ .wb-page .wb-table-name .count { margin:0; font-size:10px; line-height:1.4; white-space:normal; }
363
+ .wb-page .wb-table-graph { display:flex; width:28px; height:30px; padding:5px; }
364
+ .wb-page .wb-table-graph:focus-visible,.wb-page .wb-table-entry input:focus-visible { outline:2px solid var(--teal); outline-offset:2px; }
365
+ .wb-page .wb-table-entry[hidden] { display:none; }
366
+ .wb-page .wb-batch-preview { margin:12px 8px 0; width:calc(100% - 16px); }
367
+ .wb-page .scope-summary { margin-top:14px; padding:12px 8px 0; }
368
+ .wb-page .wb-structure-commands { padding:8px 0 0; border:0; border-radius:0; background:transparent; gap:5px; }
369
+ .wb-page .wb-structure-commands .btn { background:var(--paper); font-size:11px; padding:6px 8px; }
370
+ .wb-page .wb-structure-commands small { color:var(--muted); padding:2px 0 5px; }
371
+ .wb-page .wb-structure-menu[open] > summary::after { content:'⌃'; }
372
+ .wb-page .table-heading { padding:18px 22px 8px; }
373
+ .wb-page .viewbar { margin:0 22px; padding:0; gap:14px; }
374
+ .wb-page .viewbar > .search { margin:0; }
375
+ .wb-page .tabs [role=tab] { white-space:nowrap; }
376
+ .wb-page .tabs [role=tab]:focus-visible { outline:2px solid var(--teal); outline-offset:-2px; }
377
+ .wb-page .sample-guide { padding:13px 22px; }
378
+ .wb-page .wb-rules-scroll { max-height:min(60vh,640px); overflow:auto; scroll-padding-block:32px 4px; }
379
+ .wb-page .wb-rules-scroll:focus-visible,.wb-page .wb-preview-scroll:focus-visible { outline:2px solid var(--teal); outline-offset:-2px; }
380
+ .wb-page .wb-data col.col-field { width:32%; }
381
+ .wb-page .wb-data col.col-rule { width:68%; }
382
+ .wb-page .wb-data thead th { position:sticky; top:0; z-index:1; background:var(--wash); }
383
+ .wb-page .wb-data th:first-child,.wb-page .wb-data td:first-child { padding-left:22px; }
384
+ .wb-page .wb-data th:last-child,.wb-page .wb-data td:last-child { padding-right:22px; }
385
+ .wb-page .wb-data .field-type { overflow-wrap:anywhere; }
386
+ .wb-page .statusbar { padding:10px 22px; }
387
+ .wb-table-preview { padding:2px 22px 18px; }
388
+ .wb-table-preview .wb-preview-controls { margin-top:12px; }
389
+ .wb-table-preview .wb-preview-summary { margin:10px 0; }
390
+ .wb-document-toolbar { display:flex; align-items:center; flex-wrap:wrap; gap:10px; margin:14px 0 10px; }
391
+ .wb-document-format { display:flex; align-items:center; gap:8px; margin-left:auto; color:var(--muted); font-size:12px; }
392
+ .wb-document-format .dropdown { width:105px; }
393
+ .wb-document-toolbar .btn,.wb-document-format .dropdown-btn { min-height:36px; }
394
+ .wb-dependency-summary { padding:12px 14px; margin:12px 0 16px; border:1px solid var(--line); border-radius:8px; font-size:13px; }
395
+ .wb-dependency-summary p { margin:5px 0 0; color:var(--muted); font-size:12px; }
396
+ .wb-dependency-blocked { background:#fff8ed; border-color:#e5c59d; }
397
+ .wb-dependency-blocked strong { color:#895212; }
398
+ .wb-dependency-passed { background:var(--soft); }
399
+ .wb-dependency-passed strong { color:var(--teal); }
400
+ .wb-dependency-issues h4 { margin:16px 0 8px; font-size:13px; }
401
+ .wb-dependency-issues .dependency-card { overflow-wrap:anywhere; }
402
+ .wb-dependency-sources { margin:18px 0; border-top:1px solid var(--line); border-bottom:1px solid var(--line); padding:8px 0; }
403
+ .wb-dependency-sources > summary { cursor:pointer; min-height:32px; padding:6px 0; font-size:13px; font-weight:600; overflow-wrap:anywhere; }
404
+ .wb-dependency-sources > summary:focus-visible { outline:2px solid var(--teal); outline-offset:2px; }
405
+ .wb-dependency-sources > p { font-size:12px; }
406
+ @media(max-width:760px) {
407
+ .wb-page .wb-workspace { grid-template-columns:1fr; gap:12px; }
408
+ .wb-page .wb-sidebar { display:block; }
409
+ .wb-page .wb-table-list { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); max-height:210px; gap:4px; }
410
+ .wb-page .wb-table-entry { min-width:0; }
411
+ .wb-page .wb-sidebar .sidebar-label { display:flex; }
412
+ .wb-page .wb-batch-preview { width:auto; }
413
+ .wb-page .table-heading { padding:14px 16px 8px; }
414
+ .wb-page .viewbar { margin:0 16px; }
415
+ .wb-page .sample-guide { padding:10px 16px; }
416
+ .wb-table-preview { padding:2px 16px 16px; }
417
+ .wb-page .wb-data col.col-field { width:35%; }
418
+ .wb-page .wb-data col.col-rule { width:65%; }
419
+ .wb-page .wb-generation-settings { margin-left:0; }
420
+ }
421
+ @media(max-width:480px) {
422
+ .wb-page .wb-table-list { grid-template-columns:1fr; }
423
+ .wb-page .wb-settings-heading { width:100%; }
424
+ .wb-page .wb-config-context { padding:10px; }
425
+ }
426
+
427
+ /* R2 graph overview, focused reading and bounded search results. */
428
+ .graph-controls .graph-inspected-table {
429
+ min-width: 0;
430
+ color: var(--muted);
431
+ font-size: 11px;
432
+ overflow-wrap: anywhere;
433
+ }
434
+ .graph-controls .graph-reading-guide {
435
+ display: flex;
436
+ align-items: center;
437
+ flex-wrap: wrap;
438
+ gap: 8px 12px;
439
+ margin: 0 0 12px;
440
+ }
441
+ .graph-controls .graph-reading-guide .graph-scope-note {
442
+ flex: 1 1 280px;
443
+ min-width: 0;
444
+ margin: 0;
445
+ color: var(--muted);
446
+ font-size: 11px;
447
+ overflow-wrap: anywhere;
448
+ }
449
+ .graph-controls [data-graph-action="focus-readable"] {
450
+ min-height: 30px;
451
+ padding: 4px 9px;
452
+ border: 1px solid #8fb5a7;
453
+ border-radius: 6px;
454
+ background: var(--paper);
455
+ color: var(--teal);
456
+ font-size: 11px;
457
+ }
458
+ .graph-controls [data-graph-action="focus-readable"]:disabled { opacity: .5; }
459
+ .graph-controls .graph-search-results {
460
+ min-width: 0;
461
+ margin-bottom: 14px;
462
+ padding: 10px;
463
+ border: 1px solid var(--line);
464
+ border-radius: 8px;
465
+ background: var(--paper);
466
+ }
467
+ .graph-controls .graph-search-count {
468
+ margin: 0 0 6px;
469
+ color: var(--muted);
470
+ font-size: 11px;
471
+ }
472
+ .graph-controls .graph-search-matches {
473
+ display: grid;
474
+ grid-template-columns: repeat(auto-fit, minmax(min(210px, 100%), 1fr));
475
+ gap: 6px;
476
+ max-height: 126px;
477
+ overflow-y: auto;
478
+ overscroll-behavior: contain;
479
+ margin: 0;
480
+ padding: 4px;
481
+ list-style: none;
482
+ }
483
+ .graph-controls .graph-search-matches > li { min-width: 0; }
484
+ .graph-controls .graph-search-match {
485
+ display: flex;
486
+ flex-direction: column;
487
+ align-items: flex-start;
488
+ gap: 2px;
489
+ width: 100%;
490
+ min-height: 32px;
491
+ padding: 6px 8px;
492
+ border-radius: 5px;
493
+ background: #f4f8f7;
494
+ text-align: left;
495
+ font-size: 11px;
496
+ overflow-wrap: anywhere;
497
+ }
498
+ .graph-controls .graph-search-match:hover { background: var(--soft); }
499
+ .graph-controls .graph-search-match small {
500
+ display: -webkit-box;
501
+ -webkit-box-orient: vertical;
502
+ -webkit-line-clamp: 2;
503
+ overflow: hidden;
504
+ color: var(--muted);
505
+ font-size: 10px;
506
+ }
507
+ .wb-write-target { padding:14px 16px; margin-bottom:14px; border:1px solid var(--line); border-radius:7px; background:var(--wash); }
508
+ .wb-write-target > div { display:flex; gap:12px; align-items:center; }
509
+ .wb-write-target p { margin:8px 0; overflow-wrap:anywhere; user-select:text; }