@zenfg/inspector 0.1.0-beta.2 → 0.1.0-beta.4

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 (172) hide show
  1. package/GUIDE.md +182 -0
  2. package/README.md +60 -26
  3. package/THEMING.md +124 -0
  4. package/dist/FrameGraphInspector.d.ts +24 -8
  5. package/dist/FrameGraphInspector.d.ts.map +1 -1
  6. package/dist/FrameGraphInspector.js +151 -65
  7. package/dist/FrameGraphInspector.js.map +1 -1
  8. package/dist/capture.d.ts +5 -0
  9. package/dist/capture.d.ts.map +1 -0
  10. package/dist/capture.js +2 -0
  11. package/dist/capture.js.map +1 -0
  12. package/dist/debugCaptureModel.d.ts +28 -4
  13. package/dist/debugCaptureModel.d.ts.map +1 -1
  14. package/dist/debugCaptureModel.js +72 -16
  15. package/dist/debugCaptureModel.js.map +1 -1
  16. package/dist/index.d.ts +2 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js.map +1 -1
  19. package/dist/panelAliasAnalysis.d.ts +1 -0
  20. package/dist/panelAliasAnalysis.d.ts.map +1 -1
  21. package/dist/panelAliasAnalysis.js +23 -54
  22. package/dist/panelAliasAnalysis.js.map +1 -1
  23. package/dist/panelCytoscapeGraphRenderer.d.ts +18 -3
  24. package/dist/panelCytoscapeGraphRenderer.d.ts.map +1 -1
  25. package/dist/panelCytoscapeGraphRenderer.js +183 -41
  26. package/dist/panelCytoscapeGraphRenderer.js.map +1 -1
  27. package/dist/panelDetailLayout.d.ts +27 -0
  28. package/dist/panelDetailLayout.d.ts.map +1 -0
  29. package/dist/panelDetailLayout.js +174 -0
  30. package/dist/panelDetailLayout.js.map +1 -0
  31. package/dist/panelDetailStyles.d.ts +2 -0
  32. package/dist/panelDetailStyles.d.ts.map +1 -0
  33. package/dist/panelDetailStyles.js +57 -0
  34. package/dist/panelDetailStyles.js.map +1 -0
  35. package/dist/panelDiagnosticsView.d.ts +10 -1
  36. package/dist/panelDiagnosticsView.d.ts.map +1 -1
  37. package/dist/panelDiagnosticsView.js +167 -58
  38. package/dist/panelDiagnosticsView.js.map +1 -1
  39. package/dist/panelDomHelpers.d.ts.map +1 -1
  40. package/dist/panelDomHelpers.js +6 -5
  41. package/dist/panelDomHelpers.js.map +1 -1
  42. package/dist/panelGraphLayout.d.ts +3 -2
  43. package/dist/panelGraphLayout.d.ts.map +1 -1
  44. package/dist/panelGraphLayout.js +20 -5
  45. package/dist/panelGraphLayout.js.map +1 -1
  46. package/dist/panelGraphRenderer.d.ts +10 -0
  47. package/dist/panelGraphRenderer.d.ts.map +1 -1
  48. package/dist/panelGraphRenderer.js.map +1 -1
  49. package/dist/panelGraphScene.d.ts +15 -26
  50. package/dist/panelGraphScene.d.ts.map +1 -1
  51. package/dist/panelGraphScene.js +191 -208
  52. package/dist/panelGraphScene.js.map +1 -1
  53. package/dist/panelGraphSearch.d.ts +16 -0
  54. package/dist/panelGraphSearch.d.ts.map +1 -0
  55. package/dist/panelGraphSearch.js +93 -0
  56. package/dist/panelGraphSearch.js.map +1 -0
  57. package/dist/panelGraphView.d.ts +82 -0
  58. package/dist/panelGraphView.d.ts.map +1 -1
  59. package/dist/panelGraphView.js +42 -9
  60. package/dist/panelGraphView.js.map +1 -1
  61. package/dist/panelGraphVisuals.d.ts +18 -6
  62. package/dist/panelGraphVisuals.d.ts.map +1 -1
  63. package/dist/panelGraphVisuals.js +156 -116
  64. package/dist/panelGraphVisuals.js.map +1 -1
  65. package/dist/panelInspectorView.d.ts +13 -0
  66. package/dist/panelInspectorView.d.ts.map +1 -1
  67. package/dist/panelInspectorView.js +326 -46
  68. package/dist/panelInspectorView.js.map +1 -1
  69. package/dist/panelListStyles.d.ts +3 -0
  70. package/dist/panelListStyles.d.ts.map +1 -0
  71. package/dist/panelListStyles.js +155 -0
  72. package/dist/panelListStyles.js.map +1 -0
  73. package/dist/panelMemoryStyles.d.ts +3 -0
  74. package/dist/panelMemoryStyles.d.ts.map +1 -0
  75. package/dist/panelMemoryStyles.js +42 -0
  76. package/dist/panelMemoryStyles.js.map +1 -0
  77. package/dist/panelMemoryView.d.ts +13 -1
  78. package/dist/panelMemoryView.d.ts.map +1 -1
  79. package/dist/panelMemoryView.js +161 -41
  80. package/dist/panelMemoryView.js.map +1 -1
  81. package/dist/panelPassesView.d.ts +15 -0
  82. package/dist/panelPassesView.d.ts.map +1 -1
  83. package/dist/panelPassesView.js +202 -72
  84. package/dist/panelPassesView.js.map +1 -1
  85. package/dist/panelRawView.d.ts +15 -0
  86. package/dist/panelRawView.d.ts.map +1 -0
  87. package/dist/panelRawView.js +105 -0
  88. package/dist/panelRawView.js.map +1 -0
  89. package/dist/panelResourcesView.d.ts +8 -0
  90. package/dist/panelResourcesView.d.ts.map +1 -1
  91. package/dist/panelResourcesView.js +62 -31
  92. package/dist/panelResourcesView.js.map +1 -1
  93. package/dist/panelSelection.d.ts +9 -1
  94. package/dist/panelSelection.d.ts.map +1 -1
  95. package/dist/panelSelection.js +36 -6
  96. package/dist/panelSelection.js.map +1 -1
  97. package/dist/panelTheme.d.ts +13 -0
  98. package/dist/panelTheme.d.ts.map +1 -0
  99. package/dist/panelTheme.js +104 -0
  100. package/dist/panelTheme.js.map +1 -0
  101. package/dist/panelTypes.d.ts +18 -4
  102. package/dist/panelTypes.d.ts.map +1 -1
  103. package/dist/panelTypes.js.map +1 -1
  104. package/dist/panelVisualTheme.d.ts +176 -71
  105. package/dist/panelVisualTheme.d.ts.map +1 -1
  106. package/dist/panelVisualTheme.js +34 -36
  107. package/dist/panelVisualTheme.js.map +1 -1
  108. package/dist/panelWorkbenchHelpers.d.ts +12 -1
  109. package/dist/panelWorkbenchHelpers.d.ts.map +1 -1
  110. package/dist/panelWorkbenchHelpers.js +63 -2
  111. package/dist/panelWorkbenchHelpers.js.map +1 -1
  112. package/dist/panelWorkbenchStyles.d.ts +2 -0
  113. package/dist/panelWorkbenchStyles.d.ts.map +1 -0
  114. package/dist/panelWorkbenchStyles.js +101 -0
  115. package/dist/panelWorkbenchStyles.js.map +1 -0
  116. package/dist/panelWorkbenchView.d.ts +16 -0
  117. package/dist/panelWorkbenchView.d.ts.map +1 -1
  118. package/dist/panelWorkbenchView.js +228 -50
  119. package/dist/panelWorkbenchView.js.map +1 -1
  120. package/dist/query.js.map +1 -1
  121. package/dist/styles.d.ts.map +1 -1
  122. package/dist/styles.js +161 -205
  123. package/dist/styles.js.map +1 -1
  124. package/dist/theme.d.ts +22 -0
  125. package/dist/theme.d.ts.map +1 -0
  126. package/dist/theme.js +10 -0
  127. package/dist/theme.js.map +1 -0
  128. package/dist/themeDefinitions.d.ts +251 -0
  129. package/dist/themeDefinitions.d.ts.map +1 -0
  130. package/dist/themeDefinitions.js +96 -0
  131. package/dist/themeDefinitions.js.map +1 -0
  132. package/dist/themePalette.d.ts +66 -0
  133. package/dist/themePalette.d.ts.map +1 -0
  134. package/dist/themePalette.js +37 -0
  135. package/dist/themePalette.js.map +1 -0
  136. package/dist/themes.css +165 -0
  137. package/package.json +44 -10
  138. package/src/FrameGraphInspector.ts +145 -68
  139. package/src/capture.ts +4 -0
  140. package/src/debugCaptureModel.ts +97 -21
  141. package/src/index.ts +6 -2
  142. package/src/panelAliasAnalysis.ts +24 -70
  143. package/src/panelCytoscapeGraphRenderer.ts +177 -40
  144. package/src/panelDetailLayout.ts +155 -0
  145. package/src/panelDetailStyles.ts +56 -0
  146. package/src/panelDiagnosticsView.ts +167 -86
  147. package/src/panelDomHelpers.ts +4 -5
  148. package/src/panelGraphLayout.ts +20 -5
  149. package/src/panelGraphRenderer.ts +7 -0
  150. package/src/panelGraphScene.ts +204 -292
  151. package/src/panelGraphSearch.ts +96 -0
  152. package/src/panelGraphView.ts +41 -9
  153. package/src/panelGraphVisuals.ts +152 -118
  154. package/src/panelInspectorView.ts +315 -48
  155. package/src/panelListStyles.ts +154 -0
  156. package/src/panelMemoryStyles.ts +41 -0
  157. package/src/panelMemoryView.ts +178 -53
  158. package/src/panelPassesView.ts +190 -137
  159. package/src/panelRawView.ts +99 -0
  160. package/src/panelResourcesView.ts +69 -56
  161. package/src/panelSelection.ts +39 -7
  162. package/src/panelTheme.ts +85 -0
  163. package/src/panelTypes.ts +16 -4
  164. package/src/panelVisualTheme.ts +38 -38
  165. package/src/panelWorkbenchHelpers.ts +62 -4
  166. package/src/panelWorkbenchStyles.ts +100 -0
  167. package/src/panelWorkbenchView.ts +201 -52
  168. package/src/query.ts +11 -11
  169. package/src/styles.ts +162 -205
  170. package/src/theme.ts +24 -0
  171. package/src/themeDefinitions.ts +103 -0
  172. package/src/themePalette.ts +44 -0
package/src/styles.ts CHANGED
@@ -1,30 +1,16 @@
1
- import { FRAME_GRAPH_DEBUG_VISUAL_THEME, GRAPH_VISUAL_THEME } from './panelVisualTheme.ts';
1
+ import { themeDefaultsCss } from './themeDefinitions.ts';
2
+ import { PANEL_WORKBENCH_CSS } from './panelWorkbenchStyles.ts';
3
+ import { PANEL_LIST_CSS } from './panelListStyles.ts';
4
+ import { PANEL_DETAIL_CSS } from './panelDetailStyles.ts';
5
+ import { PANEL_MEMORY_CSS } from './panelMemoryStyles.ts';
2
6
 
3
7
  const STYLE_ELEMENT_ID = 'zenfg-inspector-panel-styles';
4
- const theme = FRAME_GRAPH_DEBUG_VISUAL_THEME;
8
+
5
9
 
6
10
  const FRAME_GRAPH_DEBUG_PANEL_CSS = `
7
11
  /* Tokens and workbench root */
8
12
  .zenfg-inspector {
9
- --fgd-canvas: ${theme.canvas};
10
- --fgd-panel: var(--zenfg-inspector-background, ${theme.panel});
11
- --fgd-surface: var(--zenfg-inspector-surface, ${theme.surface});
12
- --fgd-surface-raised: var(--zenfg-inspector-surface-raised, ${theme.surfaceRaised});
13
- --fgd-surface-hover: var(--zenfg-inspector-surface-hover, ${theme.surfaceHover});
14
- --fgd-border: var(--zenfg-inspector-border, ${theme.border});
15
- --fgd-border-subtle: var(--zenfg-inspector-border-subtle, rgba(180, 190, 202, 0.11));
16
- --fgd-border-strong: var(--zenfg-inspector-border-strong, rgba(180, 190, 202, 0.28));
17
- --fgd-text: var(--zenfg-inspector-text, ${theme.text});
18
- --fgd-text-secondary: var(--zenfg-inspector-text-secondary, ${theme.textSecondary});
19
- --fgd-muted: var(--zenfg-inspector-muted, ${theme.muted});
20
- --fgd-accent: var(--zenfg-inspector-accent, ${theme.accent});
21
- --fgd-accent-soft: var(--zenfg-inspector-accent-soft, rgba(56, 189, 248, 0.12));
22
- --fgd-accent-hover: var(--zenfg-inspector-accent-hover, rgba(56, 189, 248, 0.18));
23
- --fgd-success: var(--zenfg-inspector-success, ${theme.success});
24
- --fgd-warning: var(--zenfg-inspector-warning, ${theme.warning});
25
- --fgd-danger: var(--zenfg-inspector-danger, ${theme.danger});
26
- --fgd-font-ui: var(--zenfg-inspector-font-ui, ${theme.fontUi});
27
- --fgd-font-mono: var(--zenfg-inspector-font-mono, ${theme.fontMono});
13
+ ${themeDefaultsCss}
28
14
  position: relative;
29
15
  display: block;
30
16
  width: 100%;
@@ -35,9 +21,8 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
35
21
  color: var(--fgd-text);
36
22
  background: var(--fgd-canvas);
37
23
  font-family: var(--fgd-font-ui);
38
- font-size: 12px;
39
24
  line-height: 1.45;
40
- color-scheme: dark;
25
+ color-scheme: var(--zfgi-color-scheme, dark);
41
26
  container-name: zenfg-inspector;
42
27
  container-type: inline-size;
43
28
  }
@@ -53,7 +38,7 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
53
38
  overflow: hidden;
54
39
  border: 0;
55
40
  border-radius: 0;
56
- background: var(--zenfg-inspector-background, var(--fgd-panel));
41
+ background: var(--fgd-panel);
57
42
  }
58
43
 
59
44
  .zenfg-inspector-content {
@@ -71,15 +56,15 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
71
56
  place-content: center;
72
57
  gap: 6px;
73
58
  border: 2px dashed var(--fgd-accent);
74
- border-radius: var(--zenfg-inspector-radius-md, 6px);
75
- color: #bae6fd;
59
+ border-radius: var(--fgd-radius-md);
60
+ color: var(--fgd-accent);
76
61
  background: color-mix(in srgb, var(--fgd-canvas) 90%, transparent);
77
- font: 600 13px/1.4 var(--fgd-font-ui);
62
+ font: 600 var(--fgd-font-size)/1.4 var(--fgd-font-ui);
78
63
  text-align: center;
79
64
  pointer-events: none;
80
65
  }
81
66
  .zenfg-inspector-drop-overlay[hidden] { display: none; }
82
- .zenfg-inspector-drop-overlay > span { color: var(--fgd-muted); font-size: 11px; }
67
+ .zenfg-inspector-drop-overlay > span { color: var(--fgd-muted); font-size: var(--fgd-font-size-small); }
83
68
 
84
69
  .zenfg-inspector-capture-summary[hidden],
85
70
  .zenfg-inspector-command-status[hidden],
@@ -93,7 +78,7 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
93
78
  .zenfg-inspector-muted {
94
79
  margin: 0;
95
80
  color: var(--fgd-muted);
96
- font: 11px/1.5 var(--fgd-font-ui);
81
+ font: var(--fgd-font-size-small)/1.5 var(--fgd-font-ui);
97
82
  }
98
83
 
99
84
  .zenfg-inspector-control-icon {
@@ -110,14 +95,19 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
110
95
  .zenfg-inspector-workbench-tabs,
111
96
  .zenfg-inspector-graph-legend {
112
97
  scrollbar-width: thin;
113
- scrollbar-color: rgba(180, 190, 202, 0.25) transparent;
98
+ scrollbar-color: var(--fgd-border) transparent;
114
99
  }
115
100
 
101
+ /* Common control states apply consistently across all workbench views. */
102
+ .zenfg-inspector :is(button, input, select, textarea) { font-family: var(--fgd-font-ui); }
103
+ .zenfg-inspector :is(button, input, select, textarea, summary, [tabindex]):focus-visible { outline: 2px solid var(--fgd-accent); outline-offset: 2px; }
104
+ /* The modal dismiss button must retain its translucent scrim while pressed. */
105
+ .zenfg-inspector button:active:not(:disabled):not(.zenfg-inspector-detail-backdrop) { background: var(--fgd-accent-soft); }
106
+ .zenfg-inspector :is(button, input, select):disabled { cursor: default; opacity: .5; }
107
+ .zenfg-inspector ::selection { color: var(--fgd-text); background: var(--fgd-accent-soft); }
116
108
  /* Workbench and summary */
117
109
  .zenfg-inspector-workbench {
118
- display: grid;
119
110
  grid-template-rows: auto minmax(0, 1fr);
120
- gap: 8px;
121
111
  height: 100%;
122
112
  min-width: 0;
123
113
  min-height: 0;
@@ -126,37 +116,28 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
126
116
 
127
117
  .zenfg-inspector-capture-summary {
128
118
  display: grid;
129
- grid-template-columns: repeat(auto-fit, minmax(min(230px, 100%), 1fr));
130
119
  align-content: start;
131
- gap: 8px;
132
120
  min-width: 0;
133
121
  background: transparent;
134
122
  }
135
123
 
136
124
  .zenfg-inspector-capture-summary > section {
137
125
  min-width: 0;
138
- padding: 12px;
139
126
  border: 1px solid var(--fgd-border-subtle);
140
- border-radius: 6px;
141
- background: var(--fgd-surface);
127
+ border-radius: var(--fgd-radius-sm);
142
128
  }
143
129
 
144
130
  .zenfg-inspector-capture-summary h2 {
145
131
  margin: 0 0 5px;
146
132
  color: var(--fgd-text-secondary);
147
- font-size: 10px;
148
133
  font-weight: 700;
149
- letter-spacing: 0.075em;
150
134
  line-height: 1.2;
151
- text-transform: uppercase;
152
135
  }
153
136
 
154
137
  .zenfg-inspector-capture-summary section > div {
155
138
  display: grid;
156
- grid-template-columns: auto minmax(0, 1fr);
157
- gap: 8px;
139
+ gap: var(--fgd-space-2);
158
140
  min-width: 0;
159
- font-size: 11px;
160
141
  line-height: 1.5;
161
142
  }
162
143
 
@@ -165,10 +146,9 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
165
146
  min-width: 0;
166
147
  overflow: hidden;
167
148
  color: var(--fgd-text);
168
- font: 600 11px/1.5 var(--fgd-font-mono);
149
+ font: 600 var(--fgd-font-size-small)/1.5 var(--fgd-font-mono);
169
150
  text-align: right;
170
151
  text-overflow: ellipsis;
171
- white-space: nowrap;
172
152
  }
173
153
 
174
154
  /* Command bar, tabs, and controls */
@@ -189,11 +169,11 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
189
169
  display: flex;
190
170
  align-items: center;
191
171
  min-width: 0;
192
- min-height: 32px;
193
- padding: 0 12px 0 4px;
172
+ min-height: var(--fgd-control-height);
173
+ padding: 0 var(--fgd-space-3) 0 var(--fgd-space-1);
194
174
  overflow: hidden;
195
175
  color: var(--fgd-text);
196
- font: 700 12px/1 var(--fgd-font-ui);
176
+ font: 700 var(--fgd-font-size-small)/1 var(--fgd-font-ui);
197
177
  letter-spacing: 0.015em;
198
178
  text-overflow: ellipsis;
199
179
  white-space: nowrap;
@@ -219,20 +199,28 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
219
199
  }
220
200
 
221
201
  .zenfg-inspector-workbench-tabs {
202
+ align-self: stretch;
203
+ align-items: stretch;
222
204
  overflow-x: auto;
223
205
  border-bottom: 0;
224
206
  }
225
207
 
208
+ .zenfg-inspector-workbench-tabs > button {
209
+ display: inline-flex;
210
+ align-items: center;
211
+ justify-content: center;
212
+ }
213
+
226
214
  .zenfg-inspector-workbench-tabs > button,
227
215
  .zenfg-inspector-subtabs > button,
228
216
  .zenfg-inspector-inspector-tabs > button {
229
- min-height: 32px;
217
+ min-height: var(--fgd-control-height);
230
218
  padding: 6px 10px;
231
219
  border: 0;
232
220
  border-bottom: 2px solid transparent;
233
221
  color: var(--fgd-muted);
234
222
  background: transparent;
235
- font: 600 12px/1 var(--fgd-font-ui);
223
+ font: 600 var(--fgd-font-size)/1 var(--fgd-font-ui);
236
224
  white-space: nowrap;
237
225
  cursor: pointer;
238
226
  transition: color 120ms ease, background-color 120ms ease, border-color 120ms ease;
@@ -242,7 +230,7 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
242
230
  .zenfg-inspector-subtabs > button:hover:not(:disabled),
243
231
  .zenfg-inspector-inspector-tabs > button:hover:not(:disabled) {
244
232
  color: var(--fgd-text-secondary);
245
- background: rgba(180, 190, 202, 0.055);
233
+ background: var(--fgd-surface-hover);
246
234
  }
247
235
 
248
236
  .zenfg-inspector-workbench-tabs > button.active,
@@ -261,7 +249,7 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
261
249
  display: flex;
262
250
  align-items: center;
263
251
  gap: 6px;
264
- padding-left: 8px;
252
+ padding: var(--fgd-space-1) 0 var(--fgd-space-1) var(--fgd-space-2);
265
253
  overflow-x: auto;
266
254
  scrollbar-width: thin;
267
255
  }
@@ -273,11 +261,11 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
273
261
  right: 0;
274
262
  display: grid;
275
263
  min-width: 142px;
276
- padding: 4px;
264
+ padding: var(--fgd-space-1);
277
265
  border: 1px solid var(--fgd-border-strong);
278
- border-radius: 6px;
266
+ border-radius: var(--fgd-radius-sm);
279
267
  background: var(--fgd-surface-raised);
280
- box-shadow: 0 10px 24px rgba(0, 0, 0, 0.34);
268
+ box-shadow: var(--fgd-shadow);
281
269
  }
282
270
  .zenfg-inspector-export-menu[hidden] { display: none; }
283
271
  .zenfg-inspector-export-menu > button {
@@ -286,10 +274,10 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
286
274
  gap: 7px;
287
275
  padding: 7px 9px;
288
276
  border: 0;
289
- border-radius: 4px;
277
+ border-radius: var(--fgd-radius-sm);
290
278
  color: var(--fgd-text-secondary);
291
279
  background: transparent;
292
- font: 600 11px/1.2 var(--fgd-font-ui);
280
+ font: 600 var(--fgd-font-size)/1.2 var(--fgd-font-ui);
293
281
  text-align: left;
294
282
  white-space: nowrap;
295
283
  cursor: pointer;
@@ -308,14 +296,14 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
308
296
  align-items: center;
309
297
  justify-content: center;
310
298
  gap: 6px;
311
- height: 28px;
312
- min-height: 28px;
299
+ height: var(--fgd-control-height);
300
+ min-height: var(--fgd-control-height);
313
301
  padding: 0 9px;
314
302
  border: 1px solid var(--fgd-border);
315
- border-radius: 5px;
303
+ border-radius: var(--fgd-radius-sm);
316
304
  color: var(--fgd-text-secondary);
317
305
  background: var(--fgd-surface);
318
- font: 600 11px/1 var(--fgd-font-ui);
306
+ font: 600 var(--fgd-font-size)/1 var(--fgd-font-ui);
319
307
  white-space: nowrap;
320
308
  cursor: pointer;
321
309
  transition: color 120ms ease, background-color 120ms ease, border-color 120ms ease;
@@ -331,8 +319,8 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
331
319
  }
332
320
 
333
321
  .zenfg-inspector-workbench-actions > button[data-tone='accent'] {
334
- border-color: rgba(56, 189, 248, 0.5);
335
- color: #bae6fd;
322
+ border-color: var(--fgd-accent);
323
+ color: var(--fgd-accent);
336
324
  background: var(--fgd-accent-soft);
337
325
  }
338
326
  .zenfg-inspector-workbench-actions > button[data-tone='accent']:hover:not(:disabled) {
@@ -340,14 +328,14 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
340
328
  background: var(--fgd-accent-hover);
341
329
  }
342
330
  .zenfg-inspector-workbench-actions > button[data-tone='pending'] {
343
- border-color: rgba(56, 189, 248, 0.42);
331
+ border-color: var(--fgd-accent);
344
332
  color: var(--fgd-text-secondary);
345
333
  background: var(--fgd-accent-soft);
346
334
  }
347
335
  .zenfg-inspector-workbench-actions > button[data-tone='success'] {
348
- border-color: rgba(52, 211, 153, 0.46);
336
+ border-color: var(--fgd-success);
349
337
  color: var(--fgd-success);
350
- background: rgba(52, 211, 153, 0.1);
338
+ background: color-mix(in srgb, var(--fgd-success) 10%, var(--fgd-panel));
351
339
  }
352
340
  .zenfg-inspector-workbench-actions > button:disabled { cursor: default; opacity: 0.46; }
353
341
  .zenfg-inspector-workbench-actions > button[aria-busy='true']:disabled { opacity: 0.72; }
@@ -356,7 +344,7 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
356
344
  max-width: 220px;
357
345
  overflow: hidden;
358
346
  color: var(--fgd-muted);
359
- font: 11px/1.35 var(--fgd-font-ui);
347
+ font: var(--fgd-font-size-small)/1.35 var(--fgd-font-ui);
360
348
  text-overflow: ellipsis;
361
349
  white-space: nowrap;
362
350
  }
@@ -384,23 +372,19 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
384
372
 
385
373
  /* Workspace and empty states */
386
374
  .zenfg-inspector-overview-view {
387
- padding: 12px;
388
- overflow: auto;
375
+ padding: var(--fgd-space-3);
389
376
  background: var(--fgd-canvas);
390
377
  }
378
+ .zenfg-inspector-view.zenfg-inspector-overview-view { overflow: auto; }
391
379
 
392
380
  .zenfg-inspector-workspace {
393
381
  position: relative;
394
382
  display: grid;
395
383
  grid-template-columns: minmax(0, 1fr);
396
- gap: 8px;
397
384
  min-width: 0;
398
385
  min-height: 0;
399
386
  overflow: hidden;
400
387
  }
401
- .zenfg-inspector-workspace.inspector-open {
402
- grid-template-columns: minmax(0, 1fr) minmax(360px, 28vw);
403
- }
404
388
 
405
389
  .zenfg-inspector-main {
406
390
  display: grid;
@@ -416,12 +400,12 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
416
400
  flex-direction: column;
417
401
  align-items: center;
418
402
  justify-content: center;
419
- gap: 8px;
403
+ gap: var(--fgd-space-2);
420
404
  min-width: 0;
421
405
  min-height: 0;
422
406
  padding: 24px;
423
407
  color: var(--fgd-muted);
424
- font: 12px/1.5 var(--fgd-font-ui);
408
+ font: var(--fgd-font-size-small)/1.5 var(--fgd-font-ui);
425
409
  text-align: center;
426
410
  }
427
411
  .zenfg-inspector-workbench-empty > .zenfg-inspector-control-icon {
@@ -432,7 +416,7 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
432
416
  .zenfg-inspector-workbench-empty[data-state='error'] > .zenfg-inspector-control-icon { color: var(--fgd-danger); }
433
417
  .zenfg-inspector-workbench-empty[data-state='capturing'] > .zenfg-inspector-control-icon { color: var(--fgd-accent); }
434
418
  .zenfg-inspector-empty-message { max-width: 520px; }
435
- .zenfg-inspector-empty-detail { color: color-mix(in srgb, var(--fgd-muted) 78%, transparent); font-size: 11px; }
419
+ .zenfg-inspector-empty-detail { color: color-mix(in srgb, var(--fgd-muted) 78%, transparent); font-size: var(--fgd-font-size-small); }
436
420
 
437
421
  .zenfg-inspector-view {
438
422
  grid-area: 1 / 1;
@@ -440,7 +424,7 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
440
424
  min-height: 0;
441
425
  overflow: hidden;
442
426
  border: 1px solid var(--fgd-border-subtle);
443
- border-radius: 6px;
427
+ border-radius: var(--fgd-radius-sm);
444
428
  background: var(--fgd-canvas);
445
429
  }
446
430
 
@@ -450,7 +434,7 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
450
434
  flex-wrap: wrap;
451
435
  align-items: center;
452
436
  gap: 6px;
453
- padding: 6px 8px;
437
+ padding: 6px var(--fgd-space-2);
454
438
  border-bottom: 1px solid var(--fgd-border-subtle);
455
439
  background: var(--fgd-surface);
456
440
  }
@@ -458,13 +442,12 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
458
442
  .zenfg-inspector-view-toolbar input,
459
443
  .zenfg-inspector-view-toolbar select {
460
444
  min-width: 0;
461
- height: 28px;
462
- padding: 4px 8px;
445
+ padding: var(--fgd-space-1) var(--fgd-space-2);
463
446
  border: 1px solid var(--fgd-border);
464
- border-radius: 5px;
447
+ border-radius: var(--fgd-radius-sm);
465
448
  color: var(--fgd-text);
466
449
  background: var(--fgd-panel);
467
- font: 11px/1 var(--fgd-font-ui);
450
+ font: var(--fgd-font-size)/1 var(--fgd-font-ui);
468
451
  }
469
452
  .zenfg-inspector-view-toolbar input { flex: 1 1 210px; }
470
453
  .zenfg-inspector-view-toolbar input::placeholder { color: var(--fgd-muted); opacity: 0.86; }
@@ -475,7 +458,7 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
475
458
  .zenfg-inspector-subtabs,
476
459
  .zenfg-inspector-inspector-tabs {
477
460
  flex: 0 0 auto;
478
- padding: 0 4px;
461
+ padding: 0 var(--fgd-space-1);
479
462
  background: var(--fgd-panel);
480
463
  }
481
464
  .zenfg-inspector-subview { flex: 1 1 auto; min-height: 0; overflow: hidden; }
@@ -489,13 +472,11 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
489
472
  }
490
473
  .zenfg-inspector-workbench-table {
491
474
  width: 100%;
492
- min-width: 720px;
493
475
  border-collapse: collapse;
494
- font: 11px/1.45 var(--fgd-font-mono);
495
476
  }
496
477
  .zenfg-inspector-workbench-table th,
497
478
  .zenfg-inspector-workbench-table td {
498
- height: 30px;
479
+ height: var(--fgd-control-height);
499
480
  max-width: 360px;
500
481
  padding: 6px 10px;
501
482
  border-bottom: 1px solid var(--fgd-border-subtle);
@@ -510,7 +491,7 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
510
491
  top: 0;
511
492
  color: var(--fgd-muted);
512
493
  background: var(--fgd-panel);
513
- font: 650 10px/1.3 var(--fgd-font-ui);
494
+ font: 650 var(--fgd-font-size-small)/1.3 var(--fgd-font-ui);
514
495
  letter-spacing: 0.025em;
515
496
  }
516
497
  .zenfg-inspector-workbench-table [data-column='numeric'] {
@@ -518,7 +499,7 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
518
499
  text-align: right;
519
500
  }
520
501
  .zenfg-inspector-workbench-table [data-column='code'] { font-family: var(--fgd-font-mono); }
521
- .zenfg-inspector-workbench-table tbody tr:hover td { background: rgba(180, 190, 202, 0.045); }
502
+ .zenfg-inspector-workbench-table tbody tr:hover td { background: var(--fgd-surface-hover); }
522
503
 
523
504
  .zenfg-inspector-workbench-table tr.selected td,
524
505
  .zenfg-inspector-diagnostic-list .selected,
@@ -531,7 +512,7 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
531
512
  margin-top: 2px;
532
513
  overflow: hidden;
533
514
  color: var(--fgd-muted);
534
- font: 10px/1.4 var(--fgd-font-ui);
515
+ font: var(--fgd-font-size-small)/1.4 var(--fgd-font-ui);
535
516
  text-overflow: ellipsis;
536
517
  }
537
518
 
@@ -555,15 +536,15 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
555
536
  background: color-mix(in srgb, var(--fgd-kind-color) 72%, transparent);
556
537
  content: '';
557
538
  }
558
- .zenfg-inspector-kind-label[data-kind='render'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.render.stroke}; }
559
- .zenfg-inspector-kind-label[data-kind='compute'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.compute.stroke}; }
560
- .zenfg-inspector-kind-label[data-kind='copy'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.copy.stroke}; }
561
- .zenfg-inspector-kind-label[data-kind='clear-buffer'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.clear.stroke}; }
562
- .zenfg-inspector-kind-label[data-kind='command'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.command.stroke}; }
563
- .zenfg-inspector-kind-label[data-kind='external-submission'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.external.stroke}; }
564
- .zenfg-inspector-kind-label[data-kind='opaque'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.external.stroke}; }
565
- .zenfg-inspector-kind-label[data-kind='texture'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.texture.stroke}; }
566
- .zenfg-inspector-kind-label[data-kind='buffer'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.buffer.stroke}; }
539
+ .zenfg-inspector-kind-label[data-kind='render'] { --fgd-kind-color: var(--fgd-graph-render-stroke); }
540
+ .zenfg-inspector-kind-label[data-kind='compute'] { --fgd-kind-color: var(--fgd-graph-compute-stroke); }
541
+ .zenfg-inspector-kind-label[data-kind='copy'] { --fgd-kind-color: var(--fgd-graph-copy-stroke); }
542
+ .zenfg-inspector-kind-label[data-kind='clear-buffer'] { --fgd-kind-color: var(--fgd-graph-clear-stroke); }
543
+ .zenfg-inspector-kind-label[data-kind='command'] { --fgd-kind-color: var(--fgd-graph-command-stroke); }
544
+ .zenfg-inspector-kind-label[data-kind='external-submission'] { --fgd-kind-color: var(--fgd-graph-external-stroke); }
545
+ .zenfg-inspector-kind-label[data-kind='opaque'] { --fgd-kind-color: var(--fgd-graph-external-stroke); }
546
+ .zenfg-inspector-kind-label[data-kind='texture'] { --fgd-kind-color: var(--fgd-graph-texture-stroke); }
547
+ .zenfg-inspector-kind-label[data-kind='buffer'] { --fgd-kind-color: var(--fgd-graph-buffer-stroke); }
567
548
  .zenfg-inspector-kind-label[data-kind='frame-graph'] { --fgd-kind-color: var(--fgd-accent); }
568
549
  .zenfg-inspector-kind-label[data-kind='timed'] { --fgd-kind-color: var(--fgd-success); }
569
550
  .zenfg-inspector-kind-label[data-kind='not-timed'] { --fgd-kind-color: var(--fgd-muted); }
@@ -572,7 +553,7 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
572
553
  max-width: 100%;
573
554
  padding: 0;
574
555
  border: 0;
575
- color: #a5def6;
556
+ color: var(--fgd-accent);
576
557
  background: transparent;
577
558
  font: inherit;
578
559
  text-align: left;
@@ -581,7 +562,7 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
581
562
  cursor: pointer;
582
563
  }
583
564
  .zenfg-inspector-relation-button:hover {
584
- color: #d5f3ff;
565
+ color: var(--fgd-accent);
585
566
  text-decoration: underline;
586
567
  text-underline-offset: 2px;
587
568
  }
@@ -596,37 +577,18 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
596
577
  /* Graph */
597
578
  .zenfg-inspector-graph-view { display: flex; flex-direction: column; }
598
579
  .zenfg-inspector-graph-toolbar {
599
- display: grid;
600
- grid-template-columns: auto minmax(0, 1fr) auto;
601
- align-items: center;
602
- gap: 10px;
603
580
  min-width: 0;
604
- min-height: 38px;
605
- padding: 5px 6px;
606
- border-bottom: 1px solid var(--fgd-border-subtle);
607
- background: var(--fgd-surface);
608
581
  }
609
- .zenfg-inspector-graph-mode-controls,
610
582
  .zenfg-inspector-graph-action-controls { display: flex; align-items: center; min-width: 0; }
611
- .zenfg-inspector-graph-action-controls { gap: 4px; }
612
- .zenfg-inspector-graph-toolbar .zenfg-inspector-mode-button {
613
- margin-right: -1px;
614
- border-radius: 0;
615
- }
616
- .zenfg-inspector-graph-toolbar .zenfg-inspector-mode-button:first-child { border-radius: 5px 0 0 5px; }
617
- .zenfg-inspector-graph-toolbar .zenfg-inspector-mode-button:last-child {
618
- margin-right: 0;
619
- border-radius: 0 5px 5px 0;
620
- }
583
+ .zenfg-inspector-graph-action-controls { gap: var(--fgd-space-1); }
621
584
  .zenfg-inspector-graph-toolbar button.active,
622
585
  .zenfg-inspector-graph-toolbar button[aria-pressed='true'] {
623
586
  z-index: 1;
624
- border-color: rgba(56, 189, 248, 0.6);
587
+ border-color: var(--fgd-accent);
625
588
  color: var(--fgd-accent);
626
589
  background: var(--fgd-accent-soft);
627
590
  }
628
591
  .zenfg-inspector-graph-toolbar button:disabled { cursor: default; opacity: 0.42; }
629
- .zenfg-inspector-graph-toolbar .zenfg-inspector-icon-button { width: 28px; padding: 0; }
630
592
 
631
593
  .zenfg-inspector-graph-legend {
632
594
  display: flex;
@@ -636,10 +598,13 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
636
598
  padding: 2px 0;
637
599
  overflow-x: auto;
638
600
  color: var(--fgd-muted);
639
- font: 10px/1 var(--fgd-font-ui);
601
+ font: var(--fgd-font-size-small)/1 var(--fgd-font-ui);
640
602
  white-space: nowrap;
641
603
  }
642
- .zenfg-inspector-legend-item { display: inline-flex; align-items: center; gap: 4px; flex: 0 0 auto; }
604
+ .zenfg-inspector-legend-item { display: inline-flex; align-items: center; gap: var(--fgd-space-1); flex: 0 0 auto; }
605
+ .zenfg-inspector-legend-group { display: inline-flex; align-items: center; gap: 10px; flex: 0 0 auto; }
606
+ .zenfg-inspector-legend-group + .zenfg-inspector-legend-group { border-left: 1px solid var(--fgd-border-subtle); padding-left: 10px; }
607
+ .zenfg-inspector-legend-heading { color: var(--fgd-text-secondary); font-weight: 600; }
643
608
  .zenfg-inspector-legend-swatch {
644
609
  position: relative;
645
610
  display: inline-block;
@@ -650,7 +615,15 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
650
615
  background: color-mix(in srgb, var(--zenfg-inspector-legend-color) 20%, var(--fgd-canvas));
651
616
  }
652
617
  .zenfg-inspector-legend-swatch[data-shape='ellipse'] { border-radius: 50%; }
653
- .zenfg-inspector-legend-swatch[data-shape='group'] { border-style: double; background: transparent; }
618
+ .zenfg-inspector-legend-swatch[data-shape='group'] { background: transparent; }
619
+ .zenfg-inspector-legend-swatch[data-shape='cut-rectangle'],
620
+ .zenfg-inspector-legend-swatch[data-shape='tag'] { width: 14px; height: 10px; border: 0; background: transparent; }
621
+ .zenfg-inspector-legend-swatch > svg { display: block; width: 100%; height: 100%; overflow: visible; }
622
+ .zenfg-inspector-legend-swatch > svg polygon {
623
+ fill: color-mix(in srgb, var(--zenfg-inspector-legend-color) 20%, var(--fgd-canvas));
624
+ stroke: var(--zenfg-inspector-legend-color);
625
+ stroke-width: 1.4;
626
+ }
654
627
  .zenfg-inspector-legend-swatch[data-shape='line'] {
655
628
  width: 16px;
656
629
  height: 0;
@@ -699,7 +672,7 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
699
672
  border: 1px solid var(--fgd-border-subtle);
700
673
  background: var(--fgd-canvas);
701
674
  color: var(--fgd-muted);
702
- font-size: 11px;
675
+ font-size: var(--fgd-font-size-small);
703
676
  }
704
677
  .zenfg-inspector-graph-canvas {
705
678
  width: 100%;
@@ -715,42 +688,43 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
715
688
  display: flex;
716
689
  align-items: center;
717
690
  justify-content: center;
718
- gap: 8px;
719
- padding: 16px;
691
+ gap: var(--fgd-space-2);
692
+ padding: var(--fgd-space-4);
720
693
  color: var(--fgd-muted);
721
- background: rgba(11, 15, 20, 0.82);
722
- font: 12px/1.45 var(--fgd-font-ui);
694
+ background: color-mix(in srgb, var(--fgd-canvas) 82%, transparent);
695
+ font: var(--fgd-font-size-small)/1.45 var(--fgd-font-ui);
723
696
  text-align: center;
724
697
  pointer-events: none;
725
698
  }
726
- .zenfg-inspector-graph-status[data-state='layout'] { background: rgba(11, 15, 20, 0.5); }
699
+ .zenfg-inspector-graph-status[data-state='layout'] { background: color-mix(in srgb, var(--fgd-canvas) 50%, transparent); }
727
700
  .zenfg-inspector-graph-status[data-state='error'] {
728
701
  color: var(--fgd-text);
729
- background: rgba(11, 15, 20, 0.94);
702
+ background: color-mix(in srgb, var(--fgd-canvas) 94%, transparent);
730
703
  }
731
704
  .zenfg-inspector-graph-status > span { max-width: min(560px, 80%); }
732
705
  .zenfg-inspector-graph-status button {
733
- height: 28px;
706
+ height: var(--fgd-control-height);
734
707
  padding: 0 9px;
735
- border: 1px solid rgba(56, 189, 248, 0.55);
736
- border-radius: 5px;
708
+ border: 1px solid var(--fgd-accent);
709
+ border-radius: var(--fgd-radius-sm);
737
710
  color: var(--fgd-accent);
738
711
  background: var(--fgd-accent-soft);
739
- font: 600 11px/1 var(--fgd-font-ui);
712
+ font: 600 var(--fgd-font-size)/1 var(--fgd-font-ui);
740
713
  cursor: pointer;
741
714
  pointer-events: auto;
742
715
  }
743
716
  .zenfg-inspector-graph-tooltip {
744
717
  position: absolute;
745
718
  z-index: 3;
719
+ width: max-content;
746
720
  max-width: min(380px, calc(100% - 16px));
747
- padding: 8px 10px;
721
+ padding: var(--fgd-space-2) 10px;
748
722
  border: 1px solid var(--fgd-border-strong);
749
- border-radius: 6px;
723
+ border-radius: var(--fgd-radius-sm);
750
724
  color: var(--fgd-text);
751
725
  background: var(--fgd-surface-raised);
752
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.42);
753
- font: 11px/1.5 var(--fgd-font-mono);
726
+ box-shadow: var(--fgd-shadow);
727
+ font: var(--fgd-font-size-small)/1.5 var(--fgd-font-mono);
754
728
  white-space: pre-wrap;
755
729
  pointer-events: none;
756
730
  }
@@ -763,9 +737,9 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
763
737
  min-height: 0;
764
738
  overflow: hidden;
765
739
  border: 1px solid var(--fgd-border);
766
- border-radius: 6px;
740
+ border-radius: var(--fgd-radius-sm);
767
741
  background: var(--fgd-surface-raised);
768
- box-shadow: -8px 0 28px rgba(0, 0, 0, 0.2);
742
+ box-shadow: var(--fgd-shadow);
769
743
  }
770
744
  .zenfg-inspector-inspector[hidden] { display: none; }
771
745
  .zenfg-inspector-inspector > header {
@@ -773,15 +747,15 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
773
747
  flex: 0 0 auto;
774
748
  align-items: center;
775
749
  justify-content: space-between;
776
- min-height: 36px;
777
- padding: 0 8px 0 10px;
750
+ min-height: var(--fgd-row-height);
751
+ padding: 0 var(--fgd-space-2) 0 10px;
778
752
  border-bottom: 1px solid var(--fgd-border-subtle);
779
753
  background: var(--fgd-surface);
780
754
  }
781
755
  .zenfg-inspector-inspector > header strong {
782
756
  min-width: 0;
783
757
  overflow: hidden;
784
- font: 600 11px/1.3 var(--fgd-font-mono);
758
+ font: 600 var(--fgd-font-size-small)/1.3 var(--fgd-font-mono);
785
759
  text-overflow: ellipsis;
786
760
  white-space: nowrap;
787
761
  }
@@ -799,10 +773,8 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
799
773
  }
800
774
  .zenfg-inspector-inspector-summary {
801
775
  display: grid;
802
- grid-template-columns: minmax(96px, auto) minmax(0, 1fr);
803
- gap: 3px 12px;
776
+ gap: 3px var(--fgd-space-3);
804
777
  margin: 0;
805
- font-size: 11px;
806
778
  line-height: 1.6;
807
779
  }
808
780
  .zenfg-inspector-inspector-summary dt { color: var(--fgd-muted); font-family: var(--fgd-font-ui); }
@@ -810,47 +782,43 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
810
782
  min-width: 0;
811
783
  margin: 0;
812
784
  color: var(--fgd-text);
813
- font-family: var(--fgd-font-mono);
814
785
  overflow-wrap: anywhere;
815
786
  }
816
- .zenfg-inspector-inspector-relations { display: grid; gap: 8px; }
787
+ .zenfg-inspector-inspector-relations { display: grid; gap: var(--fgd-space-2); }
817
788
  .zenfg-inspector-inspector-relations section {
818
789
  display: grid;
819
790
  gap: 6px;
820
- padding: 8px;
791
+ padding: var(--fgd-space-2);
821
792
  border: 1px solid var(--fgd-border-subtle);
822
- border-radius: 5px;
793
+ border-radius: var(--fgd-radius-sm);
823
794
  background: var(--fgd-surface);
824
795
  }
825
796
  .zenfg-inspector-inspector-relations h3 {
826
797
  margin: 0 0 2px;
827
798
  color: var(--fgd-muted);
828
- font: 700 10px/1.3 var(--fgd-font-ui);
799
+ font: 700 var(--fgd-font-size-small)/1.3 var(--fgd-font-ui);
829
800
  letter-spacing: 0.055em;
830
801
  text-transform: uppercase;
831
802
  }
832
803
  .zenfg-inspector-inspector-relations .zenfg-inspector-relation-button {
833
- font: 11px/1.5 var(--fgd-font-mono);
804
+ font: var(--fgd-font-size)/1.5 var(--fgd-font-mono);
834
805
  overflow-wrap: anywhere;
835
806
  white-space: normal;
836
807
  }
808
+ .zenfg-inspector-relation-entry { display: grid; justify-items: start; gap: 2px; }
809
+ .zenfg-inspector-relation-entry > span { font: var(--fgd-font-size-small)/1.5 var(--fgd-font-mono); overflow-wrap: anywhere; }
837
810
  .zenfg-inspector-inspector .zenfg-inspector-raw-detail {
838
811
  min-width: 100%;
839
812
  margin: 0;
840
- overflow: auto;
841
813
  color: var(--fgd-text-secondary);
842
- font: 11px/1.55 var(--fgd-font-mono);
843
- white-space: pre;
844
814
  }
845
815
 
846
816
  /* Memory */
847
817
  .zenfg-inspector-memory-view {
848
818
  display: grid;
849
- grid-template-rows: auto minmax(0, 1fr);
850
819
  }
851
820
  .zenfg-inspector-memory-summary {
852
821
  display: grid;
853
- grid-template-columns: repeat(4, minmax(0, 1fr));
854
822
  gap: 6px;
855
823
  padding: 6px;
856
824
  border-bottom: 1px solid var(--fgd-border-subtle);
@@ -860,41 +828,34 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
860
828
  display: grid;
861
829
  gap: 3px;
862
830
  min-width: 0;
863
- padding: 6px 8px;
864
- border: 1px solid var(--fgd-border-subtle);
865
- border-radius: 5px;
866
- background: var(--fgd-surface);
831
+ padding: 6px var(--fgd-space-2);
832
+ border-radius: var(--fgd-radius-sm);
867
833
  }
868
- .zenfg-inspector-memory-summary span { color: var(--fgd-muted); font: 10px/1.3 var(--fgd-font-ui); }
869
834
  .zenfg-inspector-memory-summary strong {
870
835
  overflow: hidden;
871
- font: 600 11px/1.35 var(--fgd-font-mono);
836
+ font: 600 var(--fgd-font-size-small)/1.35 var(--fgd-font-mono);
872
837
  text-overflow: ellipsis;
873
- white-space: nowrap;
874
838
  }
875
839
  .zenfg-inspector-memory-scroller { min-height: 0; overflow: auto; }
876
840
  .zenfg-inspector-memory-timeline {
877
841
  display: grid;
878
- min-width: 760px;
879
- padding: 8px;
880
- font: 11px/1.4 var(--fgd-font-mono);
842
+ padding: var(--fgd-space-2);
843
+ font: var(--fgd-font-size-small)/1.4 var(--fgd-font-mono);
881
844
  }
882
845
  .zenfg-inspector-memory-axis,
883
846
  .zenfg-inspector-memory-resource {
884
847
  display: grid;
885
- grid-template-columns: minmax(150px, 0.9fr) 72px minmax(320px, 2.4fr) 82px;
886
848
  gap: 10px;
887
849
  align-items: center;
888
- min-height: 30px;
850
+ min-height: var(--fgd-control-height);
889
851
  }
890
852
  .zenfg-inspector-memory-axis {
891
853
  position: sticky;
892
- z-index: 2;
893
854
  top: 0;
894
- padding: 0 8px 6px;
855
+ padding: 0 var(--fgd-space-2) 6px;
895
856
  color: var(--fgd-muted);
896
857
  background: var(--fgd-canvas);
897
- font: 10px/1.3 var(--fgd-font-ui);
858
+ font: var(--fgd-font-size-small)/1.3 var(--fgd-font-ui);
898
859
  }
899
860
  .zenfg-inspector-memory-axis-track,
900
861
  .zenfg-inspector-memory-track { position: relative; height: 16px; }
@@ -903,38 +864,34 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
903
864
  position: absolute;
904
865
  bottom: -1px;
905
866
  padding-bottom: 5px;
906
- border-left: 1px solid var(--fgd-border-strong);
907
- font: 10px/1 var(--fgd-font-mono);
908
- transform: translateX(-1px);
867
+ font: var(--fgd-font-size-small)/1 var(--fgd-font-mono);
909
868
  }
910
869
  .zenfg-inspector-memory-allocation {
911
870
  display: flex;
912
- align-items: center;
913
871
  justify-content: space-between;
914
- gap: 12px;
872
+ gap: var(--fgd-space-3);
915
873
  margin-top: 6px;
916
- padding: 7px 8px;
874
+ padding: 7px var(--fgd-space-2);
917
875
  border-top: 1px solid var(--fgd-border-subtle);
918
876
  border-bottom: 1px solid var(--fgd-border-subtle);
919
877
  background: var(--fgd-surface);
920
878
  }
921
- .zenfg-inspector-memory-allocation > span { color: var(--fgd-muted); font: 10px/1.35 var(--fgd-font-mono); }
879
+ .zenfg-inspector-memory-allocation > span { color: var(--fgd-muted); font: var(--fgd-font-size-small)/1.35 var(--fgd-font-mono); }
922
880
  .zenfg-inspector-memory-allocation.muted { color: var(--fgd-muted); font-family: var(--fgd-font-ui); }
923
- .zenfg-inspector-memory-resource { padding: 0 8px; border-bottom: 1px solid var(--fgd-border-subtle); }
881
+ .zenfg-inspector-memory-resource { padding: 0 var(--fgd-space-2); border-bottom: 1px solid var(--fgd-border-subtle); }
924
882
  .zenfg-inspector-memory-resource.selected,
925
883
  .zenfg-inspector-memory-allocation.selected { box-shadow: inset 2px 0 var(--fgd-accent); }
926
884
  .zenfg-inspector-memory-bar {
927
885
  position: absolute;
928
886
  top: 4px;
929
887
  height: 8px;
930
- min-width: 2px;
931
- border-radius: 4px;
932
- background: color-mix(in srgb, ${GRAPH_VISUAL_THEME.texture.stroke} 76%, transparent);
933
- box-shadow: 0 0 0 1px color-mix(in srgb, ${GRAPH_VISUAL_THEME.texture.stroke} 36%, transparent);
888
+ border-radius: var(--fgd-radius-sm);
889
+ background: color-mix(in srgb, var(--fgd-graph-texture-stroke) 76%, transparent);
890
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--fgd-graph-texture-stroke) 36%, transparent);
934
891
  }
935
892
  .zenfg-inspector-memory-bar.buffer {
936
- background: color-mix(in srgb, ${GRAPH_VISUAL_THEME.buffer.stroke} 72%, transparent);
937
- box-shadow: 0 0 0 1px color-mix(in srgb, ${GRAPH_VISUAL_THEME.buffer.stroke} 34%, transparent);
893
+ background: color-mix(in srgb, var(--fgd-graph-buffer-stroke) 72%, transparent);
894
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--fgd-graph-buffer-stroke) 34%, transparent);
938
895
  }
939
896
  .zenfg-inspector-memory-bar.empty { display: none; }
940
897
 
@@ -943,8 +900,8 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
943
900
  .zenfg-inspector-diagnostics-grid {
944
901
  display: grid;
945
902
  grid-template-columns: repeat(2, minmax(0, 1fr));
946
- gap: 8px;
947
- padding: 8px;
903
+ gap: var(--fgd-space-2);
904
+ padding: var(--fgd-space-2);
948
905
  }
949
906
  .zenfg-inspector-diagnostic-card {
950
907
  display: flex;
@@ -953,20 +910,20 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
953
910
  min-height: 164px;
954
911
  overflow: hidden;
955
912
  border: 1px solid var(--fgd-border-subtle);
956
- border-radius: 6px;
913
+ border-radius: var(--fgd-radius-sm);
957
914
  background: var(--fgd-surface);
958
915
  }
959
916
  .zenfg-inspector-diagnostic-card > h2 {
960
917
  margin: 0;
961
918
  padding: 9px 10px 3px;
962
919
  color: var(--fgd-text-secondary);
963
- font: 650 12px/1.35 var(--fgd-font-ui);
920
+ font: 650 var(--fgd-font-size-small)/1.35 var(--fgd-font-ui);
964
921
  }
965
922
  .zenfg-inspector-diagnostic-card > p {
966
923
  margin: 0;
967
- padding: 0 10px 8px;
924
+ padding: 0 10px var(--fgd-space-2);
968
925
  color: var(--fgd-muted);
969
- font: 11px/1.5 var(--fgd-font-ui);
926
+ font: var(--fgd-font-size-small)/1.5 var(--fgd-font-ui);
970
927
  }
971
928
  .zenfg-inspector-diagnostic-card .zenfg-inspector-table-scroller { flex: 1 1 auto; max-height: 280px; }
972
929
  .zenfg-inspector-diagnostic-card .zenfg-inspector-workbench-table { min-width: 100%; table-layout: fixed; }
@@ -976,13 +933,13 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
976
933
  }
977
934
  .zenfg-inspector-diagnostic-list { display: grid; gap: 2px; padding: 6px; overflow: auto; }
978
935
  .zenfg-inspector-diagnostic-list .zenfg-inspector-relation-button {
979
- padding: 6px 8px;
980
- border-radius: 4px;
936
+ padding: 6px var(--fgd-space-2);
937
+ border-radius: var(--fgd-radius-sm);
981
938
  color: var(--fgd-text-secondary);
982
- font: 11px/1.45 var(--fgd-font-mono);
939
+ font: var(--fgd-font-size)/1.45 var(--fgd-font-mono);
983
940
  }
984
941
  .zenfg-inspector-diagnostic-list .zenfg-inspector-relation-button:hover {
985
- background: rgba(180, 190, 202, 0.05);
942
+ background: var(--fgd-surface-hover);
986
943
  text-decoration: none;
987
944
  }
988
945
  .zenfg-inspector-diagnostic-list .selected { box-shadow: inset 2px 0 var(--fgd-accent); }
@@ -994,7 +951,7 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
994
951
  position: absolute;
995
952
  z-index: 10;
996
953
  inset: 0;
997
- background: rgba(3, 7, 12, 0.38);
954
+ background: var(--fgd-backdrop);
998
955
  content: '';
999
956
  pointer-events: none;
1000
957
  }
@@ -1005,11 +962,11 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
1005
962
  right: 0;
1006
963
  bottom: 0;
1007
964
  width: min(380px, calc(100% - 24px));
1008
- box-shadow: -18px 0 42px rgba(0, 0, 0, 0.42);
965
+ box-shadow: var(--fgd-shadow);
1009
966
  }
1010
967
  .zenfg-inspector-graph-toolbar {
1011
968
  grid-template-columns: minmax(0, 1fr) auto;
1012
- gap: 6px 8px;
969
+ gap: 6px var(--fgd-space-2);
1013
970
  }
1014
971
  .zenfg-inspector-graph-legend {
1015
972
  grid-column: 1 / -1;
@@ -1024,7 +981,7 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
1024
981
  .zenfg-inspector-workbench-command-bar {
1025
982
  grid-template-columns: minmax(0, 1fr) auto;
1026
983
  }
1027
- .zenfg-inspector-brand { grid-column: 1; grid-row: 1; min-height: 36px; display: flex; align-items: center; }
984
+ .zenfg-inspector-brand { grid-column: 1; grid-row: 1; min-height: var(--fgd-row-height); display: flex; align-items: center; }
1028
985
  .zenfg-inspector-brand::after { display: none; }
1029
986
  .zenfg-inspector-workbench-actions { grid-column: 2; grid-row: 1; }
1030
987
  .zenfg-inspector-workbench-tabs { grid-column: 1 / -1; grid-row: 2; }
@@ -1036,12 +993,12 @@ button[aria-busy='true'] > .zenfg-inspector-control-icon {
1036
993
  }
1037
994
 
1038
995
  @container zenfg-inspector (max-width: 720px) {
1039
- .zenfg-inspector-body { padding: 8px; }
1040
- .zenfg-inspector-overview-view { padding: 8px; }
996
+ .zenfg-inspector-body { padding: var(--fgd-space-2); }
997
+ .zenfg-inspector-overview-view { padding: var(--fgd-space-2); }
1041
998
  .zenfg-inspector-capture-summary > section { padding: 10px; }
1042
999
  .zenfg-inspector-workbench-actions { padding-left: 6px; }
1043
1000
  .zenfg-inspector-command-status { max-width: 104px; }
1044
- .zenfg-inspector-workbench-tabs > button { flex: 0 0 auto; padding-inline: 8px; }
1001
+ .zenfg-inspector-workbench-tabs > button { flex: 0 0 auto; padding-inline: var(--fgd-space-2); }
1045
1002
  .zenfg-inspector-memory-summary { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1046
1003
  .zenfg-inspector-view-toolbar input { flex-basis: 100%; }
1047
1004
  .zenfg-inspector-graph-toolbar { display: flex; flex-wrap: wrap; }
@@ -1075,6 +1032,6 @@ export function ensureFrameGraphInspectorStyles(): void {
1075
1032
 
1076
1033
  const style = document.createElement('style');
1077
1034
  style.id = STYLE_ELEMENT_ID;
1078
- style.textContent = FRAME_GRAPH_DEBUG_PANEL_CSS;
1035
+ style.textContent = FRAME_GRAPH_DEBUG_PANEL_CSS + PANEL_WORKBENCH_CSS + PANEL_LIST_CSS + PANEL_DETAIL_CSS + PANEL_MEMORY_CSS;
1079
1036
  document.head.appendChild(style);
1080
1037
  }