trackops 2.0.2 → 2.0.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.
- package/README.md +238 -0
- package/lib/init.js +2 -2
- package/lib/locale.js +41 -17
- package/lib/opera-bootstrap.js +68 -7
- package/lib/opera.js +10 -2
- package/lib/registry.js +18 -0
- package/lib/server.js +312 -207
- package/locales/en.json +4 -0
- package/locales/es.json +4 -0
- package/package.json +1 -1
- package/skills/trackops/SKILL.md +39 -4
- package/skills/trackops/agents/openai.yaml +2 -2
- package/skills/trackops/locales/en/SKILL.md +39 -4
- package/skills/trackops/locales/en/references/activation.md +15 -0
- package/skills/trackops/locales/en/references/troubleshooting.md +12 -0
- package/skills/trackops/references/activation.md +15 -0
- package/skills/trackops/references/troubleshooting.md +12 -0
- package/skills/trackops/skill.json +4 -4
- package/ui/css/base.css +19 -1
- package/ui/css/charts.css +106 -8
- package/ui/css/components.css +554 -17
- package/ui/css/onboarding.css +133 -0
- package/ui/css/panels.css +345 -406
- package/ui/css/terminal.css +125 -0
- package/ui/css/timeline.css +58 -0
- package/ui/css/tokens.css +170 -113
- package/ui/index.html +3 -0
- package/ui/js/api.js +49 -13
- package/ui/js/app.js +28 -32
- package/ui/js/charts.js +526 -0
- package/ui/js/filters.js +247 -0
- package/ui/js/icons.js +82 -57
- package/ui/js/keyboard.js +229 -0
- package/ui/js/onboarding.js +33 -42
- package/ui/js/router.js +20 -3
- package/ui/js/views/board.js +84 -114
- package/ui/js/views/dashboard.js +870 -0
- package/ui/js/views/projects.js +745 -0
- package/ui/js/views/scrum.js +476 -0
- package/ui/js/views/settings.js +197 -247
- package/ui/js/views/sidebar.js +37 -31
- package/ui/js/views/tasks.js +218 -101
- package/ui/js/views/timeline.js +265 -0
- package/ui/js/views/topbar.js +94 -107
- package/ui/app.js +0 -950
- package/ui/js/views/insights.js +0 -340
- package/ui/js/views/overview.js +0 -369
- package/ui/styles.css +0 -688
package/package.json
CHANGED
package/skills/trackops/SKILL.md
CHANGED
|
@@ -1,13 +1,40 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "trackops"
|
|
3
|
-
description: "Skill global de TrackOps para
|
|
3
|
+
description: "Skill global de TrackOps para explicar que hace TrackOps, exigir la instalacion explicita del runtime con npm y guiar la activacion local de proyectos y OPERA en cada repositorio."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# TrackOps
|
|
7
7
|
|
|
8
8
|
Si la conversacion y el proyecto deben trabajar en ingles, lee `locales/en/SKILL.md` antes de seguir.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
TrackOps sirve para trabajar con agentes sobre proyectos reales sin mezclar la aplicacion y la capa operativa.
|
|
11
|
+
|
|
12
|
+
Esta skill es la puerta de entrada cuando alguien:
|
|
13
|
+
|
|
14
|
+
- quiere arrancar un proyecto con agentes IA
|
|
15
|
+
- ya tiene un repo y necesita orden operativo
|
|
16
|
+
- necesita activar TrackOps y, si hace falta, OPERA
|
|
17
|
+
- quiere trabajar en espanol o en ingles con el mismo flujo
|
|
18
|
+
|
|
19
|
+
## Que hace esta skill
|
|
20
|
+
|
|
21
|
+
Esta skill:
|
|
22
|
+
|
|
23
|
+
- explica que es TrackOps y cuando conviene usarlo
|
|
24
|
+
- exige una instalacion explicita y visible del runtime
|
|
25
|
+
- guia la activacion por repositorio
|
|
26
|
+
- ayuda a decidir si OPERA debe seguir por `direct bootstrap` o por `agent handoff`
|
|
27
|
+
|
|
28
|
+
## Que no hace esta skill
|
|
29
|
+
|
|
30
|
+
Esta skill no:
|
|
31
|
+
|
|
32
|
+
- instala paquetes por su cuenta
|
|
33
|
+
- ejecuta codigo remoto en silencio
|
|
34
|
+
- modifica un repositorio antes de que el runtime exista
|
|
35
|
+
- sustituye al runtime `trackops`
|
|
36
|
+
|
|
37
|
+
## Flujo rapido
|
|
11
38
|
|
|
12
39
|
Instala la skill del marketplace con:
|
|
13
40
|
|
|
@@ -29,7 +56,7 @@ Reglas:
|
|
|
29
56
|
- la skill puede verificar `trackops --version`, pero no debe encadenar instalaciones silenciosas
|
|
30
57
|
- la skill no debe crear archivos dentro de un repositorio por si sola
|
|
31
58
|
|
|
32
|
-
##
|
|
59
|
+
## Activacion en un proyecto
|
|
33
60
|
|
|
34
61
|
Dentro del repositorio:
|
|
35
62
|
|
|
@@ -49,7 +76,7 @@ Reglas base:
|
|
|
49
76
|
- deja la documentacion operativa generada dentro de `ops/`
|
|
50
77
|
- usa `trackops locale get|set` y `trackops doctor locale` cuando el idioma importe
|
|
51
78
|
|
|
52
|
-
##
|
|
79
|
+
## Como entra OPERA
|
|
53
80
|
|
|
54
81
|
OPERA ya no asume que todo usuario es tecnico.
|
|
55
82
|
|
|
@@ -80,6 +107,14 @@ Si TrackOps deriva al agente:
|
|
|
80
107
|
trackops opera bootstrap --resume
|
|
81
108
|
```
|
|
82
109
|
|
|
110
|
+
## Que debe entender alguien que llega desde skills.sh
|
|
111
|
+
|
|
112
|
+
- la skill global instala instrucciones en el agente
|
|
113
|
+
- el runtime se instala por separado con npm
|
|
114
|
+
- `trackops init` activa el proyecto
|
|
115
|
+
- `trackops opera install` anade el framework operativo completo solo cuando hace falta
|
|
116
|
+
- TrackOps separa producto y operacion para que el repo no se vuelva caotico
|
|
117
|
+
|
|
83
118
|
## Que referencia leer y cuando
|
|
84
119
|
|
|
85
120
|
- lee `references/activation.md` solo para instalacion, verificacion del runtime, locale bootstrap y activacion de un repo
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
interface:
|
|
2
2
|
display_name: "TrackOps"
|
|
3
|
-
short_description: "
|
|
4
|
-
default_prompt: "Use $trackops to
|
|
3
|
+
short_description: "Explain TrackOps and guide explicit install"
|
|
4
|
+
default_prompt: "Use $trackops to explain what TrackOps does, require explicit npm installation of the TrackOps runtime, and then activate TrackOps and OPERA in this repository."
|
|
5
5
|
|
|
6
6
|
policy:
|
|
7
7
|
allow_implicit_invocation: true
|
|
@@ -1,13 +1,40 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "trackops"
|
|
3
|
-
description: "Global TrackOps skill for
|
|
3
|
+
description: "Global TrackOps skill for explaining what TrackOps does, requiring explicit npm runtime installation, and guiding local project and OPERA activation inside each repository."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# TrackOps
|
|
7
7
|
|
|
8
8
|
Use this localized file when the conversation and project should run in English.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
TrackOps is for working with agents on real projects without mixing the product itself with the operational layer.
|
|
11
|
+
|
|
12
|
+
Use this skill when someone:
|
|
13
|
+
|
|
14
|
+
- wants to start a project with AI agents
|
|
15
|
+
- already has a repository and needs operational structure
|
|
16
|
+
- needs to activate TrackOps and, if needed, OPERA
|
|
17
|
+
- wants the same workflow in English or Spanish
|
|
18
|
+
|
|
19
|
+
## What this skill does
|
|
20
|
+
|
|
21
|
+
This skill:
|
|
22
|
+
|
|
23
|
+
- explains what TrackOps is and when to use it
|
|
24
|
+
- requires an explicit and visible runtime installation
|
|
25
|
+
- guides per-repository activation
|
|
26
|
+
- helps route OPERA into either `direct bootstrap` or `agent handoff`
|
|
27
|
+
|
|
28
|
+
## What this skill does not do
|
|
29
|
+
|
|
30
|
+
This skill does not:
|
|
31
|
+
|
|
32
|
+
- install packages by itself
|
|
33
|
+
- execute remote code silently
|
|
34
|
+
- modify a repository before the runtime exists
|
|
35
|
+
- replace the `trackops` runtime
|
|
36
|
+
|
|
37
|
+
## Quick flow
|
|
11
38
|
|
|
12
39
|
Install the marketplace skill with:
|
|
13
40
|
|
|
@@ -29,7 +56,7 @@ Rules:
|
|
|
29
56
|
- the skill may verify `trackops --version`, but it must not chain silent installs
|
|
30
57
|
- the skill must not create repository files by itself
|
|
31
58
|
|
|
32
|
-
##
|
|
59
|
+
## Project activation
|
|
33
60
|
|
|
34
61
|
Inside the repository:
|
|
35
62
|
|
|
@@ -49,7 +76,7 @@ Core rules:
|
|
|
49
76
|
- keep generated operational docs under `ops/`
|
|
50
77
|
- use `trackops locale get|set` and `trackops doctor locale` when language matters
|
|
51
78
|
|
|
52
|
-
## OPERA
|
|
79
|
+
## How OPERA enters the flow
|
|
53
80
|
|
|
54
81
|
OPERA no longer assumes every user is technical.
|
|
55
82
|
|
|
@@ -80,6 +107,14 @@ If TrackOps routes bootstrap to the agent:
|
|
|
80
107
|
trackops opera bootstrap --resume
|
|
81
108
|
```
|
|
82
109
|
|
|
110
|
+
## What someone arriving from skills.sh should understand
|
|
111
|
+
|
|
112
|
+
- the global skill installs instructions into the agent
|
|
113
|
+
- the runtime is installed separately with npm
|
|
114
|
+
- `trackops init` activates the project
|
|
115
|
+
- `trackops opera install` adds the full operating framework only when needed
|
|
116
|
+
- TrackOps separates product and operations so the repository stays manageable
|
|
117
|
+
|
|
83
118
|
## Which reference to read and when
|
|
84
119
|
|
|
85
120
|
- read `locales/en/references/activation.md` only for installation, runtime verification, locale bootstrap, and repository activation
|
|
@@ -73,3 +73,18 @@ trackops locale get
|
|
|
73
73
|
trackops locale set en
|
|
74
74
|
trackops doctor locale
|
|
75
75
|
```
|
|
76
|
+
|
|
77
|
+
## Uninstall
|
|
78
|
+
|
|
79
|
+
Global:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
npx skills remove --global trackops -y
|
|
83
|
+
npm uninstall -g trackops
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Local:
|
|
87
|
+
|
|
88
|
+
- there is no `trackops uninstall` command yet
|
|
89
|
+
- review and remove `.trackops-workspace.json`, `ops/`, and `app/.env` if it was only the bridge
|
|
90
|
+
- do not delete `/.env` or `/.env.example` without checking whether the project still needs them
|
|
@@ -53,3 +53,15 @@ Check that both files exist and contain usable data:
|
|
|
53
53
|
- Run `trackops env status`.
|
|
54
54
|
- Run `trackops env sync`.
|
|
55
55
|
- If bridge mode is `copy`, do not edit `app/.env` directly.
|
|
56
|
+
|
|
57
|
+
## I want to remove TrackOps completely
|
|
58
|
+
|
|
59
|
+
- Remove the global skill:
|
|
60
|
+
`npx skills remove --global trackops -y`
|
|
61
|
+
- Remove the global runtime:
|
|
62
|
+
`npm uninstall -g trackops`
|
|
63
|
+
- Inside the repository, local removal is still manual:
|
|
64
|
+
- review `.trackops-workspace.json`
|
|
65
|
+
- review `ops/`
|
|
66
|
+
- review `app/.env` if it was only the bridge
|
|
67
|
+
- Do not delete `/.env` or `/.env.example` before checking whether the project still depends on them
|
|
@@ -73,3 +73,18 @@ trackops locale get
|
|
|
73
73
|
trackops locale set es
|
|
74
74
|
trackops doctor locale
|
|
75
75
|
```
|
|
76
|
+
|
|
77
|
+
## Desinstalacion
|
|
78
|
+
|
|
79
|
+
Global:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
npx skills remove --global trackops -y
|
|
83
|
+
npm uninstall -g trackops
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Local:
|
|
87
|
+
|
|
88
|
+
- no existe todavia `trackops uninstall`
|
|
89
|
+
- revisa y elimina manualmente `.trackops-workspace.json`, `ops/` y `app/.env` si solo era bridge
|
|
90
|
+
- no borres `/.env` ni `/.env.example` sin revisar si el proyecto sigue necesitandolos
|
|
@@ -53,3 +53,15 @@ Comprueba que existan ambos archivos y contengan datos utiles:
|
|
|
53
53
|
- Ejecuta `trackops env status`.
|
|
54
54
|
- Ejecuta `trackops env sync`.
|
|
55
55
|
- Si el modo bridge es `copy`, no edites `app/.env` directamente.
|
|
56
|
+
|
|
57
|
+
## Quiero quitar TrackOps por completo
|
|
58
|
+
|
|
59
|
+
- Quita la skill global:
|
|
60
|
+
`npx skills remove --global trackops -y`
|
|
61
|
+
- Quita el runtime global:
|
|
62
|
+
`npm uninstall -g trackops`
|
|
63
|
+
- En el repo, la retirada local sigue siendo manual:
|
|
64
|
+
- revisa `.trackops-workspace.json`
|
|
65
|
+
- revisa `ops/`
|
|
66
|
+
- revisa `app/.env` si era solo bridge
|
|
67
|
+
- No borres `/.env` ni `/.env.example` sin comprobar antes si el proyecto sigue dependiendo de ellos
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "trackops",
|
|
3
|
-
"shortDescription": "Global TrackOps skill
|
|
4
|
-
"description": "
|
|
5
|
-
"skillVersion": "2.0.
|
|
6
|
-
"trackopsVersion": "2.0.
|
|
3
|
+
"shortDescription": "Global TrackOps skill that explains TrackOps, requires explicit runtime install, and guides per-repository activation.",
|
|
4
|
+
"description": "Explains what TrackOps does, installs the global skill layer, requires explicit runtime installation with npm, supports Spanish and English, activates TrackOps repository by repository, and routes OPERA onboarding into either direct bootstrap or agent-led discovery.",
|
|
5
|
+
"skillVersion": "2.0.4",
|
|
6
|
+
"trackopsVersion": "2.0.4",
|
|
7
7
|
"npmPackage": "trackops",
|
|
8
8
|
"bootstrapPolicy": "explicit_install",
|
|
9
9
|
"supportedAgentsV1": [
|
package/ui/css/base.css
CHANGED
|
@@ -20,7 +20,8 @@ body {
|
|
|
20
20
|
font-family: var(--font-ui);
|
|
21
21
|
font-size: var(--text-base);
|
|
22
22
|
color: var(--text-primary);
|
|
23
|
-
background
|
|
23
|
+
background: var(--bg-gradient);
|
|
24
|
+
background-attachment: fixed;
|
|
24
25
|
line-height: 1.55;
|
|
25
26
|
min-height: 100dvh;
|
|
26
27
|
overflow-x: hidden;
|
|
@@ -69,6 +70,12 @@ body {
|
|
|
69
70
|
"sidebar topbar"
|
|
70
71
|
"sidebar content";
|
|
71
72
|
min-height: 100dvh;
|
|
73
|
+
transition: grid-template-columns var(--duration-slow) var(--ease-out);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.app-shell:has(.sidebar:hover),
|
|
77
|
+
.app-shell:has(.sidebar:focus-within) {
|
|
78
|
+
grid-template-columns: var(--sidebar-width-expanded) 1fr;
|
|
72
79
|
}
|
|
73
80
|
|
|
74
81
|
#sidebar {
|
|
@@ -95,6 +102,7 @@ body {
|
|
|
95
102
|
padding: var(--content-pad);
|
|
96
103
|
min-height: calc(100dvh - var(--topbar-height));
|
|
97
104
|
overflow-y: auto;
|
|
105
|
+
scroll-behavior: smooth;
|
|
98
106
|
}
|
|
99
107
|
|
|
100
108
|
/* ── Tipografía ── */
|
|
@@ -236,6 +244,16 @@ ul, ol { list-style: none; }
|
|
|
236
244
|
.text-warning { color: var(--warning); }
|
|
237
245
|
.text-danger { color: var(--danger); }
|
|
238
246
|
|
|
247
|
+
/* ── Reduced motion (WCAG 2.2 AA) ── */
|
|
248
|
+
@media (prefers-reduced-motion: reduce) {
|
|
249
|
+
*, *::before, *::after {
|
|
250
|
+
animation-duration: 0.01ms !important;
|
|
251
|
+
animation-iteration-count: 1 !important;
|
|
252
|
+
transition-duration: 0.01ms !important;
|
|
253
|
+
scroll-behavior: auto !important;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
239
257
|
/* ── Responsive: sidebar colapsable en pantallas menores a 1024px ── */
|
|
240
258
|
@media (max-width: 1024px) {
|
|
241
259
|
.app-shell {
|
package/ui/css/charts.css
CHANGED
|
@@ -6,13 +6,25 @@
|
|
|
6
6
|
CHART CARD CONTAINER
|
|
7
7
|
─────────────────────────────────── */
|
|
8
8
|
.chart-card {
|
|
9
|
-
background: var(--
|
|
10
|
-
|
|
9
|
+
background: var(--glass-bg);
|
|
10
|
+
backdrop-filter: blur(var(--glass-blur));
|
|
11
|
+
-webkit-backdrop-filter: blur(var(--glass-blur));
|
|
12
|
+
border: 1px solid var(--glass-border);
|
|
11
13
|
border-radius: var(--radius-xl);
|
|
12
14
|
padding: var(--space-5);
|
|
13
15
|
display: flex;
|
|
14
16
|
flex-direction: column;
|
|
15
17
|
gap: var(--space-4);
|
|
18
|
+
box-shadow: var(--glass-shadow), var(--glass-inner);
|
|
19
|
+
transition:
|
|
20
|
+
border-color var(--duration-base) var(--ease-out),
|
|
21
|
+
box-shadow var(--duration-base) var(--ease-out),
|
|
22
|
+
transform var(--duration-base) var(--ease-out);
|
|
23
|
+
}
|
|
24
|
+
.chart-card:hover {
|
|
25
|
+
border-color: var(--glass-border-hover);
|
|
26
|
+
box-shadow: var(--shadow-sm);
|
|
27
|
+
transform: translateY(-2px);
|
|
16
28
|
}
|
|
17
29
|
|
|
18
30
|
.chart-title {
|
|
@@ -62,7 +74,7 @@
|
|
|
62
74
|
.bar-fill {
|
|
63
75
|
height: 100%;
|
|
64
76
|
border-radius: var(--radius-full);
|
|
65
|
-
background: linear-gradient(90deg, var(--accent)
|
|
77
|
+
background: linear-gradient(90deg, var(--accent) 0%, var(--accent-hover) 100%);
|
|
66
78
|
transform-origin: left;
|
|
67
79
|
animation: barGrow 0.8s var(--ease-out) both;
|
|
68
80
|
}
|
|
@@ -104,13 +116,13 @@
|
|
|
104
116
|
width: 100%;
|
|
105
117
|
min-height: 4px;
|
|
106
118
|
border-radius: var(--radius-xs) var(--radius-xs) 2px 2px;
|
|
107
|
-
background: linear-gradient(180deg, var(--accent) 0%, rgba(
|
|
119
|
+
background: linear-gradient(180deg, var(--accent) 0%, rgba(59,130,246,0.4) 100%);
|
|
108
120
|
transform-origin: bottom;
|
|
109
121
|
animation: heightGrow 0.9s var(--ease-out) both;
|
|
110
122
|
transition: background var(--duration-fast);
|
|
111
123
|
}
|
|
112
124
|
.activity-bar:hover {
|
|
113
|
-
background: linear-gradient(180deg, var(--accent-hover) 0%, rgba(
|
|
125
|
+
background: linear-gradient(180deg, var(--accent-hover) 0%, rgba(96,165,250,0.5) 100%);
|
|
114
126
|
}
|
|
115
127
|
|
|
116
128
|
.activity-bar-label {
|
|
@@ -129,7 +141,7 @@
|
|
|
129
141
|
|
|
130
142
|
.donut-track {
|
|
131
143
|
fill: none;
|
|
132
|
-
stroke:
|
|
144
|
+
stroke: rgba(255,255,255,0.06);
|
|
133
145
|
stroke-width: 12;
|
|
134
146
|
}
|
|
135
147
|
|
|
@@ -275,8 +287,10 @@
|
|
|
275
287
|
}
|
|
276
288
|
|
|
277
289
|
.health-card {
|
|
278
|
-
background: var(--
|
|
279
|
-
|
|
290
|
+
background: var(--glass-bg-subtle);
|
|
291
|
+
backdrop-filter: blur(var(--glass-blur-sm));
|
|
292
|
+
-webkit-backdrop-filter: blur(var(--glass-blur-sm));
|
|
293
|
+
border: 1px solid var(--glass-border);
|
|
280
294
|
border-radius: var(--radius-md);
|
|
281
295
|
padding: var(--space-4);
|
|
282
296
|
display: flex;
|
|
@@ -325,3 +339,87 @@
|
|
|
325
339
|
z-index: var(--z-panel);
|
|
326
340
|
}
|
|
327
341
|
.chart-tooltip.is-visible { opacity: 1; }
|
|
342
|
+
|
|
343
|
+
/* ───────────────────────────────────
|
|
344
|
+
PERIOD SELECTOR
|
|
345
|
+
─────────────────────────────────── */
|
|
346
|
+
.period-selector {
|
|
347
|
+
display: flex;
|
|
348
|
+
gap: var(--space-1);
|
|
349
|
+
background: var(--surface-3);
|
|
350
|
+
border-radius: var(--radius-full);
|
|
351
|
+
padding: 2px;
|
|
352
|
+
border: 1px solid var(--border);
|
|
353
|
+
}
|
|
354
|
+
.period-btn {
|
|
355
|
+
padding: 0.3rem 0.85rem;
|
|
356
|
+
font-size: var(--text-xs);
|
|
357
|
+
font-weight: 600;
|
|
358
|
+
border-radius: var(--radius-full);
|
|
359
|
+
color: var(--text-secondary);
|
|
360
|
+
transition:
|
|
361
|
+
background var(--duration-fast) var(--ease-out),
|
|
362
|
+
color var(--duration-fast) var(--ease-out);
|
|
363
|
+
}
|
|
364
|
+
.period-btn:hover {
|
|
365
|
+
color: var(--text-primary);
|
|
366
|
+
background: var(--surface-4);
|
|
367
|
+
}
|
|
368
|
+
.period-btn.is-active {
|
|
369
|
+
background: var(--accent);
|
|
370
|
+
color: white;
|
|
371
|
+
box-shadow: var(--shadow-sm);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/* ───────────────────────────────────
|
|
375
|
+
LINE / AREA CHART SVG
|
|
376
|
+
─────────────────────────────────── */
|
|
377
|
+
.line-chart-container {
|
|
378
|
+
position: relative;
|
|
379
|
+
overflow: visible;
|
|
380
|
+
}
|
|
381
|
+
.line-chart-container svg {
|
|
382
|
+
display: block;
|
|
383
|
+
overflow: visible;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/* ───────────────────────────────────
|
|
387
|
+
HEATMAP CHART
|
|
388
|
+
─────────────────────────────────── */
|
|
389
|
+
.heatmap-container {
|
|
390
|
+
overflow-x: auto;
|
|
391
|
+
scrollbar-width: thin;
|
|
392
|
+
scrollbar-color: var(--surface-3) transparent;
|
|
393
|
+
}
|
|
394
|
+
.heatmap-container svg {
|
|
395
|
+
display: block;
|
|
396
|
+
}
|
|
397
|
+
.heatmap-label {
|
|
398
|
+
font-family: var(--font-mono);
|
|
399
|
+
font-size: 10px;
|
|
400
|
+
fill: var(--text-muted);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/* ───────────────────────────────────
|
|
404
|
+
DEPENDENCY GRAPH
|
|
405
|
+
─────────────────────────────────── */
|
|
406
|
+
.dep-graph-container {
|
|
407
|
+
overflow-x: auto;
|
|
408
|
+
padding: var(--space-3) 0;
|
|
409
|
+
}
|
|
410
|
+
.dep-graph-container svg {
|
|
411
|
+
display: block;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/* ───────────────────────────────────
|
|
415
|
+
CHART WRAPPER (responsive)
|
|
416
|
+
─────────────────────────────────── */
|
|
417
|
+
.chart-wrapper {
|
|
418
|
+
position: relative;
|
|
419
|
+
width: 100%;
|
|
420
|
+
min-height: 200px;
|
|
421
|
+
}
|
|
422
|
+
.chart-wrapper svg {
|
|
423
|
+
width: 100%;
|
|
424
|
+
height: auto;
|
|
425
|
+
}
|