@screenbook/ui 0.0.1
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/.astro/content-assets.mjs +1 -0
- package/.astro/content-modules.mjs +1 -0
- package/.astro/content.d.ts +199 -0
- package/.astro/data-store.json +1 -0
- package/.astro/settings.json +5 -0
- package/.astro/types.d.ts +2 -0
- package/.prettierrc +15 -0
- package/.screenbook/coverage.json +37 -0
- package/.screenbook/screens.json +90 -0
- package/LICENSE +21 -0
- package/astro.config.mjs +18 -0
- package/dist/client/_astro/_baseUniq.BGai4mcc.js +1 -0
- package/dist/client/_astro/arc.DUp0dfXj.js +1 -0
- package/dist/client/_astro/architectureDiagram-VXUJARFQ.De_Gt-YC.js +36 -0
- package/dist/client/_astro/blockDiagram-VD42YOAC.BBt_VNhR.js +122 -0
- package/dist/client/_astro/c4Diagram-YG6GDRKO.DfgUlHvt.js +10 -0
- package/dist/client/_astro/channel.CNyr52v1.js +1 -0
- package/dist/client/_astro/chunk-4BX2VUAB.BL0ar6du.js +1 -0
- package/dist/client/_astro/chunk-55IACEB6.CI6SkZkY.js +1 -0
- package/dist/client/_astro/chunk-B4BG7PRW.Z25N80K6.js +165 -0
- package/dist/client/_astro/chunk-DI55MBZ5.BqjPVmi1.js +220 -0
- package/dist/client/_astro/chunk-FMBD7UC4.bZ9DWnFm.js +15 -0
- package/dist/client/_astro/chunk-QN33PNHL.BkzuUgWB.js +1 -0
- package/dist/client/_astro/chunk-QZHKN3VN.C__d68N_.js +1 -0
- package/dist/client/_astro/chunk-TZMSLE5B.BIpu8bMn.js +1 -0
- package/dist/client/_astro/classDiagram-2ON5EDUG.CxT3aW-h.js +1 -0
- package/dist/client/_astro/classDiagram-v2-WZHVMYZB.CxT3aW-h.js +1 -0
- package/dist/client/_astro/clone.U_lSZ6fe.js +1 -0
- package/dist/client/_astro/cose-bilkent-S5V4N54A.D48yfMll.js +1 -0
- package/dist/client/_astro/coverage.CKIVg4LY.css +1 -0
- package/dist/client/_astro/coverage.DDJMzKCq.css +1 -0
- package/dist/client/_astro/cytoscape.esm.DtBltrT8.js +331 -0
- package/dist/client/_astro/dagre-6UL2VRFP.LKVH7b30.js +4 -0
- package/dist/client/_astro/defaultLocale.C4B-KCzX.js +1 -0
- package/dist/client/_astro/diagram-PSM6KHXK.AHgUjH56.js +24 -0
- package/dist/client/_astro/diagram-QEK2KX5R.DvS33xWZ.js +43 -0
- package/dist/client/_astro/diagram-S2PKOQOG.BWisaYrQ.js +24 -0
- package/dist/client/_astro/erDiagram-Q2GNP2WA.B7oID6oT.js +60 -0
- package/dist/client/_astro/flowDiagram-NV44I4VS.Bb1qJLxr.js +162 -0
- package/dist/client/_astro/ganttDiagram-JELNMOA3.3vGHETyo.js +267 -0
- package/dist/client/_astro/gitGraphDiagram-NY62KEGX.Co2SKcif.js +65 -0
- package/dist/client/_astro/graph.B5fevUwB.js +1 -0
- package/dist/client/_astro/graph.astro_astro_type_script_index_0_lang.1HlATQ1g.js +1 -0
- package/dist/client/_astro/impact.Cvhl64u1.css +1 -0
- package/dist/client/_astro/impact.astro_astro_type_script_index_0_lang.D4cAR9AL.js +6 -0
- package/dist/client/_astro/infoDiagram-WHAUD3N6.B6ULtps1.js +2 -0
- package/dist/client/_astro/init.Gi6I4Gst.js +1 -0
- package/dist/client/_astro/journeyDiagram-XKPGCS4Q.BSOCzWmw.js +139 -0
- package/dist/client/_astro/kanban-definition-3W4ZIXB7.D8KKGc1o.js +89 -0
- package/dist/client/_astro/katex.XbL3y5x-.js +261 -0
- package/dist/client/_astro/layout.8vv24qEg.js +1 -0
- package/dist/client/_astro/linear.B6O9ymuK.js +1 -0
- package/dist/client/_astro/mermaid.core.CReXU7YN.js +256 -0
- package/dist/client/_astro/min.CdGMGVU0.js +1 -0
- package/dist/client/_astro/mindmap-definition-VGOIOE7T.G14HgtDw.js +68 -0
- package/dist/client/_astro/ordinal.BYWQX77i.js +1 -0
- package/dist/client/_astro/pieDiagram-ADFJNKIX.bC2VkyoW.js +30 -0
- package/dist/client/_astro/quadrantDiagram-AYHSOK5B.BlLaQQxO.js +7 -0
- package/dist/client/_astro/requirementDiagram-UZGBJVZJ.DHRnMofO.js +64 -0
- package/dist/client/_astro/sankeyDiagram-TZEHDZUN.BMuaJBmt.js +10 -0
- package/dist/client/_astro/sequenceDiagram-WL72ISMW.CnU62wqy.js +145 -0
- package/dist/client/_astro/stateDiagram-FKZM4ZOC.CewI55YO.js +1 -0
- package/dist/client/_astro/stateDiagram-v2-4FDKWEC3.7xUQqoNr.js +1 -0
- package/dist/client/_astro/timeline-definition-IT6M3QCI.D1PLRwss.js +61 -0
- package/dist/client/_astro/treemap-KMMF4GRG.D3VNVvXF.js +128 -0
- package/dist/client/_astro/xychartDiagram-PRI3JC2R.CQex0-ul.js +7 -0
- package/dist/client/logo.svg +5 -0
- package/dist/server/_@astrojs-ssr-adapter.mjs +1 -0
- package/dist/server/_noop-middleware.mjs +3 -0
- package/dist/server/chunks/_@astrojs-ssr-adapter_DgsYudHz.mjs +4385 -0
- package/dist/server/chunks/astro/server_m7yT4wCr.mjs +2787 -0
- package/dist/server/chunks/astro-designed-error-pages_BvPhMmw0.mjs +364 -0
- package/dist/server/chunks/fs-lite_COtHaKzy.mjs +157 -0
- package/dist/server/chunks/impactAnalysis_Bz5lMdmy.mjs +188 -0
- package/dist/server/chunks/loadScreens_DJf-tycc.mjs +39 -0
- package/dist/server/chunks/node_DoTkMCOi.mjs +1673 -0
- package/dist/server/chunks/remote_B3W5fv4r.mjs +188 -0
- package/dist/server/chunks/sharp_DHNfMLYY.mjs +99 -0
- package/dist/server/entry.mjs +47 -0
- package/dist/server/manifest_-V1HEnR8.mjs +101 -0
- package/dist/server/noop-entrypoint.mjs +3 -0
- package/dist/server/pages/_image.astro.mjs +2 -0
- package/dist/server/pages/coverage.astro.mjs +65 -0
- package/dist/server/pages/graph.astro.mjs +107 -0
- package/dist/server/pages/impact.astro.mjs +52 -0
- package/dist/server/pages/index.astro.mjs +28 -0
- package/dist/server/pages/screen/_id_.astro.mjs +52 -0
- package/dist/server/renderers.mjs +3 -0
- package/package.json +42 -0
- package/public/logo.svg +5 -0
- package/src/layouts/Layout.astro +60 -0
- package/src/pages/coverage.astro +399 -0
- package/src/pages/graph.astro +330 -0
- package/src/pages/impact.astro +459 -0
- package/src/pages/index.astro +167 -0
- package/src/pages/screen/[id].astro +186 -0
- package/src/styles/global.css +862 -0
- package/src/utils/impactAnalysis.ts +297 -0
- package/src/utils/loadCoverage.ts +30 -0
- package/src/utils/loadScreens.ts +18 -0
- package/tsconfig.json +9 -0
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
---
|
|
2
|
+
import Layout from "@/layouts/Layout.astro"
|
|
3
|
+
import { loadScreens } from "@/utils/loadScreens"
|
|
4
|
+
|
|
5
|
+
const screens = loadScreens()
|
|
6
|
+
|
|
7
|
+
// Generate Navigation Mermaid graph
|
|
8
|
+
let navigationGraph = ""
|
|
9
|
+
if (screens.length > 0) {
|
|
10
|
+
const lines: string[] = ["flowchart TD"]
|
|
11
|
+
|
|
12
|
+
for (const screen of screens) {
|
|
13
|
+
const label = screen.title.replace(/"/g, "'")
|
|
14
|
+
const id = screen.id.replace(/\./g, "_")
|
|
15
|
+
lines.push(` ${id}["${label}"]`)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
lines.push("")
|
|
19
|
+
|
|
20
|
+
for (const screen of screens) {
|
|
21
|
+
if (screen.next) {
|
|
22
|
+
const fromId = screen.id.replace(/\./g, "_")
|
|
23
|
+
for (const nextId of screen.next) {
|
|
24
|
+
const toId = nextId.replace(/\./g, "_")
|
|
25
|
+
lines.push(` ${fromId} --> ${toId}`)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
navigationGraph = lines.join("\n")
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Generate API Dependency Mermaid graph
|
|
34
|
+
let apiGraph = ""
|
|
35
|
+
if (screens.length > 0) {
|
|
36
|
+
const lines: string[] = ["flowchart LR"]
|
|
37
|
+
|
|
38
|
+
// Collect all unique APIs
|
|
39
|
+
const apis = new Set<string>()
|
|
40
|
+
for (const screen of screens) {
|
|
41
|
+
if (screen.dependsOn) {
|
|
42
|
+
for (const api of screen.dependsOn) {
|
|
43
|
+
// Get the base API name (e.g., "InvoiceAPI" from "InvoiceAPI.getDetail")
|
|
44
|
+
const baseName = api.split(".")[0]
|
|
45
|
+
apis.add(baseName)
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Add API nodes with different style
|
|
51
|
+
lines.push(" %% API nodes")
|
|
52
|
+
for (const api of apis) {
|
|
53
|
+
const id = api.replace(/\./g, "_")
|
|
54
|
+
lines.push(` ${id}[/"${api}"/]`)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
lines.push("")
|
|
58
|
+
lines.push(" %% Screen nodes")
|
|
59
|
+
|
|
60
|
+
// Add screen nodes
|
|
61
|
+
for (const screen of screens) {
|
|
62
|
+
if (screen.dependsOn && screen.dependsOn.length > 0) {
|
|
63
|
+
const label = screen.title.replace(/"/g, "'")
|
|
64
|
+
const id = screen.id.replace(/\./g, "_")
|
|
65
|
+
lines.push(` ${id}["${label}"]`)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
lines.push("")
|
|
70
|
+
lines.push(" %% Dependencies")
|
|
71
|
+
|
|
72
|
+
// Add edges from APIs to screens
|
|
73
|
+
for (const screen of screens) {
|
|
74
|
+
if (screen.dependsOn) {
|
|
75
|
+
const screenId = screen.id.replace(/\./g, "_")
|
|
76
|
+
const connectedApis = new Set<string>()
|
|
77
|
+
for (const api of screen.dependsOn) {
|
|
78
|
+
const baseName = api.split(".")[0]
|
|
79
|
+
if (!connectedApis.has(baseName)) {
|
|
80
|
+
connectedApis.add(baseName)
|
|
81
|
+
const apiId = baseName.replace(/\./g, "_")
|
|
82
|
+
lines.push(` ${apiId} --> ${screenId}`)
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Add styling for API nodes
|
|
89
|
+
lines.push("")
|
|
90
|
+
lines.push(" %% Styling")
|
|
91
|
+
lines.push(` classDef apiNode fill:#14b8a6,stroke:#5eead4,stroke-width:2px,color:#042f2e`)
|
|
92
|
+
for (const api of apis) {
|
|
93
|
+
const id = api.replace(/\./g, "_")
|
|
94
|
+
lines.push(` class ${id} apiNode`)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
apiGraph = lines.join("\n")
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Count APIs for stats
|
|
101
|
+
const apiCount = new Set(
|
|
102
|
+
screens.flatMap(s => (s.dependsOn || []).map(d => d.split(".")[0]))
|
|
103
|
+
).size
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
<Layout title="Graph" currentPage="graph">
|
|
107
|
+
<div class="container">
|
|
108
|
+
<div class="page-header">
|
|
109
|
+
<h1 class="page-title">Dependency Graph</h1>
|
|
110
|
+
<p class="page-description">
|
|
111
|
+
Visualize relationships between screens and APIs.
|
|
112
|
+
</p>
|
|
113
|
+
</div>
|
|
114
|
+
|
|
115
|
+
{screens.length === 0 ? (
|
|
116
|
+
<div class="empty-state">
|
|
117
|
+
<svg class="empty-state-icon" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5">
|
|
118
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M7.5 21L3 16.5m0 0L7.5 12M3 16.5h13.5m0-13.5L21 7.5m0 0L16.5 12M21 7.5H7.5" />
|
|
119
|
+
</svg>
|
|
120
|
+
<h2 class="empty-state-title">No graph data</h2>
|
|
121
|
+
<p class="empty-state-description">
|
|
122
|
+
Run the build command to generate screen metadata.
|
|
123
|
+
</p>
|
|
124
|
+
<code class="empty-state-code">
|
|
125
|
+
<span class="prompt">$</span> screenbook build
|
|
126
|
+
</code>
|
|
127
|
+
</div>
|
|
128
|
+
) : (
|
|
129
|
+
<>
|
|
130
|
+
<div class="graph-controls">
|
|
131
|
+
<div class="view-toggle">
|
|
132
|
+
<button class="toggle-btn active" data-view="navigation">
|
|
133
|
+
<svg fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
|
134
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M7.5 21L3 16.5m0 0L7.5 12M3 16.5h13.5m0-13.5L21 7.5m0 0L16.5 12M21 7.5H7.5" />
|
|
135
|
+
</svg>
|
|
136
|
+
Navigation
|
|
137
|
+
</button>
|
|
138
|
+
<button class="toggle-btn" data-view="api">
|
|
139
|
+
<svg fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
|
140
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M5.25 14.25h13.5m-13.5 0a3 3 0 01-3-3m3 3a3 3 0 100 6h13.5a3 3 0 100-6m-16.5-3a3 3 0 013-3h13.5a3 3 0 013 3m-19.5 0a4.5 4.5 0 01.9-2.7L5.737 5.1a3.375 3.375 0 012.7-1.35h7.126c1.062 0 2.062.5 2.7 1.35l2.587 3.45a4.5 4.5 0 01.9 2.7m0 0a3 3 0 01-3 3m0 3h.008v.008h-.008v-.008zm0-6h.008v.008h-.008v-.008zm-3 6h.008v.008h-.008v-.008zm0-6h.008v.008h-.008v-.008z" />
|
|
141
|
+
</svg>
|
|
142
|
+
API Dependencies
|
|
143
|
+
</button>
|
|
144
|
+
</div>
|
|
145
|
+
<div class="graph-stats">
|
|
146
|
+
<span class="stat">{screens.length} screens</span>
|
|
147
|
+
<span class="stat">{apiCount} APIs</span>
|
|
148
|
+
</div>
|
|
149
|
+
</div>
|
|
150
|
+
|
|
151
|
+
<div class="graph-container" id="navigation-graph">
|
|
152
|
+
<pre class="mermaid" data-graph="navigation">{navigationGraph}</pre>
|
|
153
|
+
</div>
|
|
154
|
+
|
|
155
|
+
<div class="graph-container hidden" id="api-graph">
|
|
156
|
+
<pre class="mermaid" data-graph="api">{apiGraph}</pre>
|
|
157
|
+
</div>
|
|
158
|
+
|
|
159
|
+
<div class="graph-legend" id="navigation-legend">
|
|
160
|
+
<div class="graph-legend-item">
|
|
161
|
+
<div class="legend-node"></div>
|
|
162
|
+
<span>Screen</span>
|
|
163
|
+
</div>
|
|
164
|
+
<div class="graph-legend-item">
|
|
165
|
+
<div class="legend-edge"></div>
|
|
166
|
+
<span>Navigation flow</span>
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
|
|
170
|
+
<div class="graph-legend hidden" id="api-legend">
|
|
171
|
+
<div class="graph-legend-item">
|
|
172
|
+
<div class="legend-node legend-api"></div>
|
|
173
|
+
<span>API</span>
|
|
174
|
+
</div>
|
|
175
|
+
<div class="graph-legend-item">
|
|
176
|
+
<div class="legend-node"></div>
|
|
177
|
+
<span>Screen</span>
|
|
178
|
+
</div>
|
|
179
|
+
<div class="graph-legend-item">
|
|
180
|
+
<div class="legend-edge"></div>
|
|
181
|
+
<span>Depends on</span>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
</>
|
|
185
|
+
)}
|
|
186
|
+
</div>
|
|
187
|
+
|
|
188
|
+
<script>
|
|
189
|
+
import mermaid from "mermaid"
|
|
190
|
+
|
|
191
|
+
const mermaidConfig = {
|
|
192
|
+
startOnLoad: false,
|
|
193
|
+
theme: "dark",
|
|
194
|
+
themeVariables: {
|
|
195
|
+
darkMode: true,
|
|
196
|
+
background: "transparent",
|
|
197
|
+
primaryColor: "#222222",
|
|
198
|
+
primaryBorderColor: "#3a3a3a",
|
|
199
|
+
primaryTextColor: "#eeeeee",
|
|
200
|
+
lineColor: "#5eead4",
|
|
201
|
+
fontFamily: "system-ui, sans-serif",
|
|
202
|
+
},
|
|
203
|
+
flowchart: {
|
|
204
|
+
useMaxWidth: true,
|
|
205
|
+
htmlLabels: true,
|
|
206
|
+
curve: "basis",
|
|
207
|
+
padding: 20,
|
|
208
|
+
nodeSpacing: 50,
|
|
209
|
+
rankSpacing: 60,
|
|
210
|
+
},
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
mermaid.initialize(mermaidConfig)
|
|
214
|
+
|
|
215
|
+
// Render both graphs on load
|
|
216
|
+
async function renderGraphs() {
|
|
217
|
+
const graphs = document.querySelectorAll(".mermaid")
|
|
218
|
+
for (const graph of graphs) {
|
|
219
|
+
const graphType = graph.getAttribute("data-graph")
|
|
220
|
+
const content = graph.textContent || ""
|
|
221
|
+
try {
|
|
222
|
+
const { svg } = await mermaid.render(`mermaid-${graphType}`, content)
|
|
223
|
+
graph.innerHTML = svg
|
|
224
|
+
} catch (e) {
|
|
225
|
+
console.error(`Failed to render ${graphType} graph:`, e)
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
renderGraphs()
|
|
231
|
+
|
|
232
|
+
// View toggle functionality
|
|
233
|
+
const toggleBtns = document.querySelectorAll(".toggle-btn")
|
|
234
|
+
const navGraph = document.getElementById("navigation-graph")
|
|
235
|
+
const apiGraph = document.getElementById("api-graph")
|
|
236
|
+
const navLegend = document.getElementById("navigation-legend")
|
|
237
|
+
const apiLegend = document.getElementById("api-legend")
|
|
238
|
+
|
|
239
|
+
toggleBtns.forEach((btn) => {
|
|
240
|
+
btn.addEventListener("click", () => {
|
|
241
|
+
const view = btn.getAttribute("data-view")
|
|
242
|
+
|
|
243
|
+
// Update active button
|
|
244
|
+
toggleBtns.forEach((b) => b.classList.remove("active"))
|
|
245
|
+
btn.classList.add("active")
|
|
246
|
+
|
|
247
|
+
// Toggle graph visibility
|
|
248
|
+
if (view === "navigation") {
|
|
249
|
+
navGraph?.classList.remove("hidden")
|
|
250
|
+
apiGraph?.classList.add("hidden")
|
|
251
|
+
navLegend?.classList.remove("hidden")
|
|
252
|
+
apiLegend?.classList.add("hidden")
|
|
253
|
+
} else {
|
|
254
|
+
navGraph?.classList.add("hidden")
|
|
255
|
+
apiGraph?.classList.remove("hidden")
|
|
256
|
+
navLegend?.classList.add("hidden")
|
|
257
|
+
apiLegend?.classList.remove("hidden")
|
|
258
|
+
}
|
|
259
|
+
})
|
|
260
|
+
})
|
|
261
|
+
</script>
|
|
262
|
+
</Layout>
|
|
263
|
+
|
|
264
|
+
<style>
|
|
265
|
+
.graph-controls {
|
|
266
|
+
display: flex;
|
|
267
|
+
justify-content: space-between;
|
|
268
|
+
align-items: center;
|
|
269
|
+
margin-bottom: 24px;
|
|
270
|
+
flex-wrap: wrap;
|
|
271
|
+
gap: 16px;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
.view-toggle {
|
|
275
|
+
display: flex;
|
|
276
|
+
gap: 8px;
|
|
277
|
+
background: var(--color-surface);
|
|
278
|
+
padding: 4px;
|
|
279
|
+
border-radius: var(--radius-lg);
|
|
280
|
+
border: 1px solid var(--color-border);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
.toggle-btn {
|
|
284
|
+
display: flex;
|
|
285
|
+
align-items: center;
|
|
286
|
+
gap: 8px;
|
|
287
|
+
padding: 8px 16px;
|
|
288
|
+
border: none;
|
|
289
|
+
background: transparent;
|
|
290
|
+
color: var(--color-text-muted);
|
|
291
|
+
font-size: var(--text-sm);
|
|
292
|
+
font-weight: 500;
|
|
293
|
+
border-radius: var(--radius-md);
|
|
294
|
+
cursor: pointer;
|
|
295
|
+
transition: all 0.15s ease;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
.toggle-btn:hover {
|
|
299
|
+
color: var(--color-text);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
.toggle-btn.active {
|
|
303
|
+
background: var(--color-accent);
|
|
304
|
+
color: var(--color-bg);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
.toggle-btn svg {
|
|
308
|
+
width: 16px;
|
|
309
|
+
height: 16px;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
.graph-stats {
|
|
313
|
+
display: flex;
|
|
314
|
+
gap: 16px;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
.stat {
|
|
318
|
+
font-size: var(--text-sm);
|
|
319
|
+
color: var(--color-text-muted);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
.hidden {
|
|
323
|
+
display: none !important;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
.legend-api {
|
|
327
|
+
background: #14b8a6 !important;
|
|
328
|
+
border-color: #5eead4 !important;
|
|
329
|
+
}
|
|
330
|
+
</style>
|