@mtdt/observeops-ds-spec 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +102 -0
- package/README.md +73 -0
- package/components/index.json +1270 -0
- package/components/recipes/README.md +41 -0
- package/components/recipes/recipes.json +922 -0
- package/components/registry/README.md +44 -0
- package/components/registry/_schema.json +47 -0
- package/components/registry/button.json +368 -0
- package/components/registry/checkbox.json +177 -0
- package/components/registry/data-viz-tooltips.json +409 -0
- package/components/registry/date-time-pickers.json +296 -0
- package/components/registry/drawer.json +222 -0
- package/components/registry/dropdown-picker.json +388 -0
- package/components/registry/filters.json +155 -0
- package/components/registry/form-item.json +281 -0
- package/components/registry/input.json +277 -0
- package/components/registry/link.json +186 -0
- package/components/registry/loose-tags.json +196 -0
- package/components/registry/menu.json +145 -0
- package/components/registry/modal.json +265 -0
- package/components/registry/navigation.json +425 -0
- package/components/registry/popover.json +216 -0
- package/components/registry/radio.json +238 -0
- package/components/registry/scheduler.json +188 -0
- package/components/registry/select.json +247 -0
- package/components/registry/severity.json +179 -0
- package/components/registry/switch.json +177 -0
- package/components/registry/table.json +275 -0
- package/components/registry/tabs.json +264 -0
- package/components/registry/tag.json +345 -0
- package/components/registry/tags-list.json +115 -0
- package/components/registry/toolbars.json +240 -0
- package/components/registry/tooltip.json +175 -0
- package/components/specs/README.md +72 -0
- package/components/specs/button.md +230 -0
- package/components/specs/checkbox.md +162 -0
- package/components/specs/data-viz-tooltips.md +93 -0
- package/components/specs/date-time-pickers.md +161 -0
- package/components/specs/drawer.md +162 -0
- package/components/specs/dropdown-picker.md +161 -0
- package/components/specs/filters.md +118 -0
- package/components/specs/form-item.md +130 -0
- package/components/specs/input.md +130 -0
- package/components/specs/link.md +131 -0
- package/components/specs/loose-tags.md +139 -0
- package/components/specs/menu.md +88 -0
- package/components/specs/modal.md +176 -0
- package/components/specs/navigation.md +181 -0
- package/components/specs/popover.md +118 -0
- package/components/specs/radio.md +144 -0
- package/components/specs/scheduler.md +133 -0
- package/components/specs/select.md +118 -0
- package/components/specs/switch.md +124 -0
- package/components/specs/table.md +115 -0
- package/components/specs/tabs.md +136 -0
- package/components/specs/tag.md +196 -0
- package/components/specs/tags-list.md +105 -0
- package/components/specs/toolbars.md +108 -0
- package/components/specs/tooltip.md +112 -0
- package/foundation/README.md +39 -0
- package/foundation/layout-shells.md +67 -0
- package/foundation/page-templates.md +69 -0
- package/foundation/panel-behaviours.md +61 -0
- package/foundation/screen-regions.md +62 -0
- package/index.js +75 -0
- package/layout/grid.json +34 -0
- package/layout/layouts.json +310 -0
- package/llms.txt +60 -0
- package/package.json +42 -0
- package/spec.manifest.json +407 -0
- package/tokens/README.md +125 -0
- package/tokens/component.json +34 -0
- package/tokens/kit-accents.json +14 -0
- package/tokens/primitive.json +130 -0
- package/tokens/purpose-map.json +67 -0
- package/tokens/semantic.dark.json +90 -0
- package/tokens/semantic.light.json +90 -0
- package/tokens/structural.json +35 -0
- package/tokens/variables.json +2018 -0
|
@@ -0,0 +1,922 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$description": "Page & flow composition recipes for the ObserveOps design system. Each recipe is a product-faithful blueprint for assembling catalogued components into a whole screen/flow. `id`s + `variant`s reference components/index.json + the registries. This is the layer above per-component docs — it tells an AI HOW to lay out a page, not just which parts exist.",
|
|
3
|
+
"$howToUse": [
|
|
4
|
+
"1. Match the user's screen to a recipe by `whenToUse` / `examples`.",
|
|
5
|
+
"2. Build the `regions` top-to-bottom / outer-to-inner: each region names component `id`s + `variant`s — open those in components/registry/ for props.",
|
|
6
|
+
"3. Apply `layout.shell` + `layout.tokens` (resolve via tokens/variables.json + tokens/structural.json) for spacing/sizing.",
|
|
7
|
+
"4. Honour `gotchas` (known traps) and `a11y`.",
|
|
8
|
+
"5. The product content (which columns/fields/options) is domain data the DS does not own — fill from the user's spec.",
|
|
9
|
+
"6. A region marked `$gap` references a layer NOT catalogued in the DS yet — do NOT improvise it. STOP and ASK the user (see ../AGENTS.md deviation rule)."
|
|
10
|
+
],
|
|
11
|
+
"$knownGaps": {
|
|
12
|
+
"$note": "Catalogued only as `data-viz-tooltips` (the hover tooltips). The actual VISUALISATION layer is NOT in the DS yet — wherever a recipe needs one, the region carries a `$gap` and you must STOP and ASK.",
|
|
13
|
+
"charts": "Charts / widget tiles (line/bar/donut/gauge/heatmap/sankey/etc.) — no chart component in index.json; only data-viz-tooltips covers their tooltips.",
|
|
14
|
+
"topologyGraph": "The Cytoscape topology / node-graph canvas — referenced in recipes as `data-viz/topology-graph` but NOT a catalogued component."
|
|
15
|
+
},
|
|
16
|
+
"layout": {
|
|
17
|
+
"appShell": "Every authenticated page sits inside the app shell: the Primary nav (navigation/primary-nav, left, 65px collapsed) + the App header (toolbars/app-header, top, @header-height 55px) come from the layout, not the page. A page renders inside the main content area (--common-main-bg).",
|
|
18
|
+
"tokens": {
|
|
19
|
+
"pageBackground": "--page-background-color",
|
|
20
|
+
"contentBackground": "--common-main-bg",
|
|
21
|
+
"navWidth": "@nav-icon-width (50px) collapsed / 170px expanded",
|
|
22
|
+
"headerHeight": "@header-height (55px)",
|
|
23
|
+
"gutter": "@padding-md (16px)",
|
|
24
|
+
"sectionPad": "@padding-lg (24px)"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"recipes": [
|
|
28
|
+
{
|
|
29
|
+
"id": "list-view",
|
|
30
|
+
"name": "List view (CRUD list)",
|
|
31
|
+
"whenToUse": "A paginated list/grid of records with create/edit, filtering, row + bulk actions (Monitors, Alerts, Users, Policies, most Settings lists).",
|
|
32
|
+
"examples": [
|
|
33
|
+
"inventory monitors list",
|
|
34
|
+
"alert list",
|
|
35
|
+
"users-settings users list"
|
|
36
|
+
],
|
|
37
|
+
"regions": [
|
|
38
|
+
{
|
|
39
|
+
"region": "page-header",
|
|
40
|
+
"use": [
|
|
41
|
+
{
|
|
42
|
+
"id": "toolbars",
|
|
43
|
+
"variant": "page-header"
|
|
44
|
+
}
|
|
45
|
+
],
|
|
46
|
+
"contains": [
|
|
47
|
+
{
|
|
48
|
+
"title": "the FlotoPageHeader title (+ optional count via title-append)"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"search": {
|
|
52
|
+
"id": "input",
|
|
53
|
+
"variant": "search"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"export": {
|
|
58
|
+
"id": "button",
|
|
59
|
+
"variant": "transparent",
|
|
60
|
+
"icon": "export"
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"add": {
|
|
65
|
+
"id": "button",
|
|
66
|
+
"variant": "primary",
|
|
67
|
+
"label": "Add <Noun>"
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"region": "filter (optional, above the grid)",
|
|
74
|
+
"use": [
|
|
75
|
+
{
|
|
76
|
+
"id": "filters",
|
|
77
|
+
"variant": "filter-bar"
|
|
78
|
+
}
|
|
79
|
+
],
|
|
80
|
+
"alt": [
|
|
81
|
+
{
|
|
82
|
+
"id": "filters",
|
|
83
|
+
"variant": "expression-builder",
|
|
84
|
+
"note": "for nested AND/OR query"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": "filters",
|
|
88
|
+
"variant": "vertical-filter",
|
|
89
|
+
"note": "a left faceted sidebar instead, for explorer-style lists"
|
|
90
|
+
}
|
|
91
|
+
]
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"region": "table",
|
|
95
|
+
"use": [
|
|
96
|
+
{
|
|
97
|
+
"id": "table",
|
|
98
|
+
"variant": "selectable"
|
|
99
|
+
}
|
|
100
|
+
],
|
|
101
|
+
"cells": [
|
|
102
|
+
{
|
|
103
|
+
"status": {
|
|
104
|
+
"id": "tag",
|
|
105
|
+
"variant": "MStatusTag",
|
|
106
|
+
"note": "status string -> colour + label"
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"name": "plain text / link (id: link, variant: text-link)"
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"actions": {
|
|
114
|
+
"id": "menu",
|
|
115
|
+
"variant": "context-menu",
|
|
116
|
+
"note": "the row ⋯ kebab = FlotoGridActions"
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"region": "bulk actions (conditional)",
|
|
123
|
+
"use": [
|
|
124
|
+
{
|
|
125
|
+
"id": "toolbars",
|
|
126
|
+
"variant": "bulk-action-bar"
|
|
127
|
+
}
|
|
128
|
+
],
|
|
129
|
+
"trigger": "appears when >= minSelection rows are checked"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"region": "pagination",
|
|
133
|
+
"use": [
|
|
134
|
+
{
|
|
135
|
+
"id": "table",
|
|
136
|
+
"variant": "pagination"
|
|
137
|
+
}
|
|
138
|
+
]
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"region": "create / edit",
|
|
142
|
+
"use": [
|
|
143
|
+
{
|
|
144
|
+
"id": "drawer",
|
|
145
|
+
"variant": "FlotoDrawerForm"
|
|
146
|
+
}
|
|
147
|
+
],
|
|
148
|
+
"contains": "a form (see the form-view recipe) opened from the Add button / a row action"
|
|
149
|
+
}
|
|
150
|
+
],
|
|
151
|
+
"layout": {
|
|
152
|
+
"shell": "page-header (top) -> filter (optional) -> table (fills) -> pagination (bottom); drawer slides from the right over all",
|
|
153
|
+
"tokens": {
|
|
154
|
+
"rowHover": "--neutral-lighter (do NOT hardcode; the live Kendo grid paints rgba(165,186,208,.4) internally, but emit the token)",
|
|
155
|
+
"rowSelected": "--neutral-lightest + inset 2px var(--primary)",
|
|
156
|
+
"headerBg": "--grid-header-bg"
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
"gotchas": [
|
|
160
|
+
"Row actions are the Menu/context-menu (FlotoGridActions) — its prop/event contract is in menu.json apis.ContextMenu; NOT a Dropdown picker.",
|
|
161
|
+
"Status cell: tag/MStatusTag — the status->colour+label map is in tag.json statusMap.",
|
|
162
|
+
"Drawer footer: Cancel (mr-2) + Save right; mind the footer-gap (drawer F3).",
|
|
163
|
+
"The live grid is Kendo + web workers — search/sort/page run there.",
|
|
164
|
+
"Bulk bar action[] shape + events: toolbars.json apis.BulkActionBar."
|
|
165
|
+
],
|
|
166
|
+
"a11y": [
|
|
167
|
+
"Grid roles/aria-sort/aria-selected survive custom cells",
|
|
168
|
+
"bulk bar role=toolbar + aria-label"
|
|
169
|
+
]
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"id": "form-view",
|
|
173
|
+
"name": "Form view (create / edit)",
|
|
174
|
+
"whenToUse": "A create or edit form for one record (Settings policy/profile forms, Add Monitor, drawer/modal forms).",
|
|
175
|
+
"examples": [
|
|
176
|
+
"notification policy form",
|
|
177
|
+
"monitor template form",
|
|
178
|
+
"user create/edit"
|
|
179
|
+
],
|
|
180
|
+
"regions": [
|
|
181
|
+
{
|
|
182
|
+
"region": "header",
|
|
183
|
+
"use": [
|
|
184
|
+
{
|
|
185
|
+
"id": "toolbars",
|
|
186
|
+
"variant": "page-header"
|
|
187
|
+
}
|
|
188
|
+
],
|
|
189
|
+
"contains": [
|
|
190
|
+
{
|
|
191
|
+
"back": {
|
|
192
|
+
"id": "navigation",
|
|
193
|
+
"variant": "back-button",
|
|
194
|
+
"note": "in the page-header back-button slot"
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"title": "form title"
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"actions": "Save (button/primary) + Cancel (button/default), OR a bottom footer"
|
|
202
|
+
}
|
|
203
|
+
]
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
"region": "form body",
|
|
207
|
+
"use": [
|
|
208
|
+
{
|
|
209
|
+
"id": "form-item",
|
|
210
|
+
"variant": "vertical"
|
|
211
|
+
}
|
|
212
|
+
],
|
|
213
|
+
"wrap": "FlotoForm + MValidationObserver; each field is a FlotoFormItem with rules",
|
|
214
|
+
"fields": [
|
|
215
|
+
{
|
|
216
|
+
"text": {
|
|
217
|
+
"id": "input",
|
|
218
|
+
"variant": "text"
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"number": {
|
|
223
|
+
"id": "input",
|
|
224
|
+
"variant": "number"
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
"textarea": {
|
|
229
|
+
"id": "form-item",
|
|
230
|
+
"note": "type=textarea"
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
"single-select": {
|
|
235
|
+
"id": "dropdown-picker",
|
|
236
|
+
"variant": "single"
|
|
237
|
+
}
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"multi-select": {
|
|
241
|
+
"id": "dropdown-picker",
|
|
242
|
+
"variant": "multiple"
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
"toggle": {
|
|
247
|
+
"id": "switch",
|
|
248
|
+
"note": "for Enabled; product uses Switch even on Save-gated forms"
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"one-of-few": {
|
|
253
|
+
"id": "radio",
|
|
254
|
+
"variant": "list"
|
|
255
|
+
}
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"tags": {
|
|
259
|
+
"id": "loose-tags",
|
|
260
|
+
"variant": "editable"
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
]
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
"region": "delete confirm (if editable)",
|
|
267
|
+
"use": [
|
|
268
|
+
{
|
|
269
|
+
"id": "modal",
|
|
270
|
+
"variant": "FlotoConfirmModal",
|
|
271
|
+
"note": "variant=error for destructive"
|
|
272
|
+
}
|
|
273
|
+
]
|
|
274
|
+
}
|
|
275
|
+
],
|
|
276
|
+
"layout": {
|
|
277
|
+
"shell": "header -> MRow/MCol grid of FlotoFormItems (size 6 = 50%, 12 = full) -> footer Save/Cancel",
|
|
278
|
+
"tokens": {
|
|
279
|
+
"fieldHeight": "@input-height-base (32px)",
|
|
280
|
+
"gutter": "16 (MRow :gutter)",
|
|
281
|
+
"labelColour": "--page-text-color",
|
|
282
|
+
"errorBorder": "--secondary-red"
|
|
283
|
+
}
|
|
284
|
+
},
|
|
285
|
+
"gotchas": [
|
|
286
|
+
"Wrap EVERY field in FlotoFormItem inside FlotoForm (its api — validate()/@submit/@reset/showNotification — is in form-item.json apis.FlotoForm).",
|
|
287
|
+
"Put non-text controls (Select/Radio/Switch) in the FlotoFormItem slot.",
|
|
288
|
+
"`required` goes in the `rules` string, not a prop (form-item F1).",
|
|
289
|
+
"Input v-model is @update not @input; Switch model is `checked` not `value`.",
|
|
290
|
+
"Multi-select cap = maxValues, not the dead maxAllowedSelection.",
|
|
291
|
+
"Select-vs-DropdownPicker: use FlotoDropdownPicker (the product standard), not MSelect."
|
|
292
|
+
],
|
|
293
|
+
"a11y": [
|
|
294
|
+
"required via aria + asterisk",
|
|
295
|
+
"error text linked to field",
|
|
296
|
+
"SF-001 focus ring is removed system-wide"
|
|
297
|
+
]
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
"id": "detail-view",
|
|
301
|
+
"name": "Detail view (record detail with tabs)",
|
|
302
|
+
"whenToUse": "Viewing one record's details across related sections (monitor detail, alert detail, NCM device detail).",
|
|
303
|
+
"examples": [
|
|
304
|
+
"monitor detail",
|
|
305
|
+
"alert detail drawer",
|
|
306
|
+
"ncm view-detail-drawer"
|
|
307
|
+
],
|
|
308
|
+
"regions": [
|
|
309
|
+
{
|
|
310
|
+
"region": "header",
|
|
311
|
+
"use": [
|
|
312
|
+
{
|
|
313
|
+
"id": "toolbars",
|
|
314
|
+
"variant": "page-header"
|
|
315
|
+
}
|
|
316
|
+
],
|
|
317
|
+
"contains": [
|
|
318
|
+
"back-button",
|
|
319
|
+
"title + status indicator: MStatusTag (tag) for a STATUS string, OR `severity` (Severity dot) for an alert/monitor SEVERITY level (critical/major/warning/clear — MStatusTag does NOT cover these)",
|
|
320
|
+
"actions (button + menu/context-menu for ⋯)"
|
|
321
|
+
]
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
"region": "section nav",
|
|
325
|
+
"use": [
|
|
326
|
+
{
|
|
327
|
+
"id": "tabs",
|
|
328
|
+
"variant": "line"
|
|
329
|
+
}
|
|
330
|
+
],
|
|
331
|
+
"note": "Hardware / Metrics / Alerts / Config tabs"
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
"region": "section content",
|
|
335
|
+
"$gap": "If a tab needs a CHART, the chart component is NOT catalogued (only its tooltips) — STOP and ASK. Tables + key-value grids ARE in the DS. See $knownGaps.charts.",
|
|
336
|
+
"use": [
|
|
337
|
+
{
|
|
338
|
+
"id": "table",
|
|
339
|
+
"variant": "basic"
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
"id": "data-viz-tooltips",
|
|
343
|
+
"note": "chart tooltips only — the chart body itself is the $gap"
|
|
344
|
+
}
|
|
345
|
+
],
|
|
346
|
+
"note": "per-tab: tables, charts, key-value grids"
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
"region": "edit",
|
|
350
|
+
"use": [
|
|
351
|
+
{
|
|
352
|
+
"id": "drawer",
|
|
353
|
+
"variant": "FlotoDrawerForm"
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
"id": "modal",
|
|
357
|
+
"variant": "MModal"
|
|
358
|
+
}
|
|
359
|
+
]
|
|
360
|
+
}
|
|
361
|
+
],
|
|
362
|
+
"layout": {
|
|
363
|
+
"shell": "header -> tabs -> active tab content; OR the whole detail in a Drawer (ncm view-detail-drawer = Drawer + Tabs)",
|
|
364
|
+
"tokens": {
|
|
365
|
+
"tabActive": "--primary + ink bar",
|
|
366
|
+
"sectionPad": "@padding-lg (24px)"
|
|
367
|
+
}
|
|
368
|
+
},
|
|
369
|
+
"gotchas": [
|
|
370
|
+
"Tabs-in-a-Drawer is a real pattern (Drawer + Tabs), not a new component.",
|
|
371
|
+
"Status next to title = MStatusTag."
|
|
372
|
+
],
|
|
373
|
+
"a11y": [
|
|
374
|
+
"tablist/tab/tabpanel roles",
|
|
375
|
+
"aria-current on active tab"
|
|
376
|
+
]
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
"id": "dashboard-view",
|
|
380
|
+
"name": "Dashboard view",
|
|
381
|
+
"whenToUse": "A grid of widgets/charts for a monitoring overview, with a dashboard picker and a global time range.",
|
|
382
|
+
"examples": [
|
|
383
|
+
"dashboard module",
|
|
384
|
+
"NOC view"
|
|
385
|
+
],
|
|
386
|
+
"regions": [
|
|
387
|
+
{
|
|
388
|
+
"region": "dashboard picker (left)",
|
|
389
|
+
"use": [
|
|
390
|
+
{
|
|
391
|
+
"id": "navigation",
|
|
392
|
+
"variant": "side-menu-categories",
|
|
393
|
+
"note": "Dashboard/NOC tabs + categories + counts (dashboard-dropdown)"
|
|
394
|
+
}
|
|
395
|
+
]
|
|
396
|
+
},
|
|
397
|
+
{
|
|
398
|
+
"region": "global time range",
|
|
399
|
+
"use": [
|
|
400
|
+
{
|
|
401
|
+
"id": "date-time-pickers",
|
|
402
|
+
"variant": "TimeRangePicker"
|
|
403
|
+
}
|
|
404
|
+
]
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
"region": "widgets",
|
|
408
|
+
"$gap": "The widget CHART/tile itself is NOT catalogued (only its tooltips are) — STOP and ASK before implementing the chart. The widget chrome (toolbars/widget-header) + tooltips ARE in the DS. See $knownGaps.charts.",
|
|
409
|
+
"use": [
|
|
410
|
+
{
|
|
411
|
+
"id": "toolbars",
|
|
412
|
+
"variant": "widget-header",
|
|
413
|
+
"note": "title + time pill + ⋯ kebab per widget"
|
|
414
|
+
},
|
|
415
|
+
{
|
|
416
|
+
"id": "data-viz-tooltips",
|
|
417
|
+
"note": "the chart tooltips (the chart body itself is the $gap)"
|
|
418
|
+
}
|
|
419
|
+
],
|
|
420
|
+
"note": "a GridLayout of widget cards (--common-widget-bg)"
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
"region": "widget actions",
|
|
424
|
+
"use": [
|
|
425
|
+
{
|
|
426
|
+
"id": "menu",
|
|
427
|
+
"variant": "context-menu",
|
|
428
|
+
"note": "Edit/Clone/Full Screen/Share/Export via FlotoGridActions"
|
|
429
|
+
}
|
|
430
|
+
]
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
"region": "wallboard mode (optional)",
|
|
434
|
+
"use": [
|
|
435
|
+
{
|
|
436
|
+
"id": "navigation",
|
|
437
|
+
"variant": "noc-player"
|
|
438
|
+
}
|
|
439
|
+
]
|
|
440
|
+
}
|
|
441
|
+
],
|
|
442
|
+
"layout": {
|
|
443
|
+
"shell": "left dashboard picker (size 3) + main widget grid (size 9); time range top-right",
|
|
444
|
+
"tokens": {
|
|
445
|
+
"widgetBg": "--common-widget-bg",
|
|
446
|
+
"canvasBg": "--dashboard-background"
|
|
447
|
+
}
|
|
448
|
+
},
|
|
449
|
+
"gotchas": [
|
|
450
|
+
"Widget chrome = toolbars/widget-header; its kebab = Menu/context-menu.",
|
|
451
|
+
"Chart tooltips are owned by the chart layer (data-viz-tooltips), not MTooltip."
|
|
452
|
+
],
|
|
453
|
+
"a11y": [
|
|
454
|
+
"NOC rotator must be pausable + respect reduced-motion"
|
|
455
|
+
]
|
|
456
|
+
},
|
|
457
|
+
{
|
|
458
|
+
"id": "explorer-view",
|
|
459
|
+
"name": "Explorer view (left panel + results + time range)",
|
|
460
|
+
"whenToUse": "An explorer that browses a tree/saved-views/facets on the left and shows results (grid/chart) on the right (Log, Metric, APM, RUM, NCM explorers).",
|
|
461
|
+
"examples": [
|
|
462
|
+
"log explorer",
|
|
463
|
+
"metric explorer",
|
|
464
|
+
"apm explorer",
|
|
465
|
+
"ncm explorer"
|
|
466
|
+
],
|
|
467
|
+
"regions": [
|
|
468
|
+
{
|
|
469
|
+
"region": "left panel",
|
|
470
|
+
"use": [
|
|
471
|
+
{
|
|
472
|
+
"id": "navigation",
|
|
473
|
+
"variant": "side-menu-tree",
|
|
474
|
+
"note": "Log/Topology hierarchy"
|
|
475
|
+
}
|
|
476
|
+
],
|
|
477
|
+
"alt": [
|
|
478
|
+
{
|
|
479
|
+
"id": "navigation",
|
|
480
|
+
"variant": "metric-picker",
|
|
481
|
+
"note": "Metric Explorer ⊕-add + drag (a picker)"
|
|
482
|
+
},
|
|
483
|
+
{
|
|
484
|
+
"id": "filters",
|
|
485
|
+
"variant": "vertical-filter",
|
|
486
|
+
"note": "APM/RUM/NCM faceted checkbox sidebar"
|
|
487
|
+
},
|
|
488
|
+
{
|
|
489
|
+
"id": "navigation",
|
|
490
|
+
"variant": "side-menu-list",
|
|
491
|
+
"note": "saved-views list (APM/RUM)"
|
|
492
|
+
}
|
|
493
|
+
]
|
|
494
|
+
},
|
|
495
|
+
{
|
|
496
|
+
"region": "toolbar",
|
|
497
|
+
"use": [
|
|
498
|
+
{
|
|
499
|
+
"id": "toolbars",
|
|
500
|
+
"variant": "grid-toolbar"
|
|
501
|
+
}
|
|
502
|
+
],
|
|
503
|
+
"contains": [
|
|
504
|
+
"search (input/search)",
|
|
505
|
+
"filter",
|
|
506
|
+
"time range (date-time-pickers/TimeRangePicker)"
|
|
507
|
+
]
|
|
508
|
+
},
|
|
509
|
+
{
|
|
510
|
+
"region": "results",
|
|
511
|
+
"$gap": "If results render as a CHART, the chart component is NOT catalogued (only its tooltips) — STOP and ASK. The table result IS in the DS. See $knownGaps.charts.",
|
|
512
|
+
"use": [
|
|
513
|
+
{
|
|
514
|
+
"id": "table",
|
|
515
|
+
"variant": "basic"
|
|
516
|
+
},
|
|
517
|
+
{
|
|
518
|
+
"id": "data-viz-tooltips",
|
|
519
|
+
"note": "chart tooltips only — the chart body itself is the $gap"
|
|
520
|
+
}
|
|
521
|
+
]
|
|
522
|
+
}
|
|
523
|
+
],
|
|
524
|
+
"layout": {
|
|
525
|
+
"shell": "left panel (size 2-3, class left-side-list-view-panel) + results (fills)",
|
|
526
|
+
"tokens": {
|
|
527
|
+
"panelBorder": "--border-color",
|
|
528
|
+
"countBadge": "--code-tag-background-color"
|
|
529
|
+
}
|
|
530
|
+
},
|
|
531
|
+
"gotchas": [
|
|
532
|
+
"Pick the right left-panel: tree (nav) vs faceted filter (Filters/vertical-filter) vs picker (navigation/metric-picker) vs saved-views (nav/side-menu-list) — they LOOK alike but differ in archetype.",
|
|
533
|
+
"The faceted checkbox sidebar FILTERS (Filters), it does not navigate."
|
|
534
|
+
]
|
|
535
|
+
},
|
|
536
|
+
{
|
|
537
|
+
"id": "wizard-flow",
|
|
538
|
+
"name": "Multi-step create / setup flow",
|
|
539
|
+
"whenToUse": "An ordered, multi-step create or onboarding flow (report builder, product setup, 2FA).",
|
|
540
|
+
"examples": [
|
|
541
|
+
"report builder",
|
|
542
|
+
"product setup guide",
|
|
543
|
+
"two-factor setup"
|
|
544
|
+
],
|
|
545
|
+
"regions": [
|
|
546
|
+
{
|
|
547
|
+
"region": "stepper",
|
|
548
|
+
"use": [
|
|
549
|
+
{
|
|
550
|
+
"id": "navigation",
|
|
551
|
+
"variant": "steps",
|
|
552
|
+
"note": "bespoke — report (horizontal) / setup-guide (vertical) / 2FA"
|
|
553
|
+
}
|
|
554
|
+
]
|
|
555
|
+
},
|
|
556
|
+
{
|
|
557
|
+
"region": "step body",
|
|
558
|
+
"use": [
|
|
559
|
+
{
|
|
560
|
+
"id": "form-item",
|
|
561
|
+
"variant": "vertical"
|
|
562
|
+
}
|
|
563
|
+
],
|
|
564
|
+
"note": "the form-view fields for the current step"
|
|
565
|
+
},
|
|
566
|
+
{
|
|
567
|
+
"region": "footer",
|
|
568
|
+
"use": [
|
|
569
|
+
{
|
|
570
|
+
"id": "button",
|
|
571
|
+
"variant": "primary",
|
|
572
|
+
"label": "Next/Finish"
|
|
573
|
+
},
|
|
574
|
+
{
|
|
575
|
+
"id": "button",
|
|
576
|
+
"variant": "default",
|
|
577
|
+
"label": "Back"
|
|
578
|
+
}
|
|
579
|
+
]
|
|
580
|
+
}
|
|
581
|
+
],
|
|
582
|
+
"layout": {
|
|
583
|
+
"shell": "stepper (top or left) -> current step content -> Back/Next footer",
|
|
584
|
+
"tokens": {
|
|
585
|
+
"stepDone": "--primary + ✓",
|
|
586
|
+
"stepCurrent": "--primary + ring",
|
|
587
|
+
"stepRemaining": "--neutral-lightest"
|
|
588
|
+
}
|
|
589
|
+
},
|
|
590
|
+
"gotchas": [
|
|
591
|
+
"No MSteps in the product — steppers are bespoke (report-steps / guide-section-step / 2FA).",
|
|
592
|
+
"Validate the current step before advancing."
|
|
593
|
+
]
|
|
594
|
+
},
|
|
595
|
+
{
|
|
596
|
+
"id": "graph-canvas",
|
|
597
|
+
"name": "Graph / Canvas view (tree + interactive node graph)",
|
|
598
|
+
"whenToUse": "Relationships/topology matter more than rows or tiles — an interactive node graph the user pans, zooms and rearranges (Topology). Neither a Dashboard nor an Explorer.",
|
|
599
|
+
"examples": [
|
|
600
|
+
"topology map"
|
|
601
|
+
],
|
|
602
|
+
"regions": [
|
|
603
|
+
{
|
|
604
|
+
"region": "left panel",
|
|
605
|
+
"use": [
|
|
606
|
+
{
|
|
607
|
+
"id": "navigation",
|
|
608
|
+
"variant": "side-menu-tree",
|
|
609
|
+
"note": "hierarchy tree"
|
|
610
|
+
}
|
|
611
|
+
]
|
|
612
|
+
},
|
|
613
|
+
{
|
|
614
|
+
"region": "canvas",
|
|
615
|
+
"$gap": "NOT IN DS YET — the Cytoscape topology graph is not a catalogued component (`data-viz/topology-graph` is a placeholder id with no registry). STOP and ASK before implementing the canvas. See $knownGaps.topologyGraph.",
|
|
616
|
+
"use": [
|
|
617
|
+
{
|
|
618
|
+
"id": "data-viz",
|
|
619
|
+
"variant": "topology-graph",
|
|
620
|
+
"note": "Cytoscape: pan/zoom, node-drag (saved positions), Full-View vs Tree-View, keyboard nav — describes the product behaviour; no DS component exists for it yet"
|
|
621
|
+
}
|
|
622
|
+
],
|
|
623
|
+
"contains": [
|
|
624
|
+
"minimap (cytoscape-navigator)",
|
|
625
|
+
"zoom / fit controls"
|
|
626
|
+
]
|
|
627
|
+
},
|
|
628
|
+
{
|
|
629
|
+
"region": "node state",
|
|
630
|
+
"use": [
|
|
631
|
+
{
|
|
632
|
+
"id": "severity",
|
|
633
|
+
"variant": "dot",
|
|
634
|
+
"note": "node colour by severity level"
|
|
635
|
+
},
|
|
636
|
+
{
|
|
637
|
+
"id": "tag",
|
|
638
|
+
"variant": "status",
|
|
639
|
+
"note": "status string"
|
|
640
|
+
}
|
|
641
|
+
]
|
|
642
|
+
}
|
|
643
|
+
],
|
|
644
|
+
"layout": {
|
|
645
|
+
"shell": "two-pane: hierarchy tree (size 2-3) + Cytoscape canvas (fills) inside Layout",
|
|
646
|
+
"tokens": {
|
|
647
|
+
"canvasBg": "--common-main-bg",
|
|
648
|
+
"nodeColour": "--severity-<level>",
|
|
649
|
+
"edge": "--border-color"
|
|
650
|
+
}
|
|
651
|
+
},
|
|
652
|
+
"gotchas": [
|
|
653
|
+
"Persist node positions per target + view mode.",
|
|
654
|
+
"Severity colour alone isn't accessible — keep tooltips/labels.",
|
|
655
|
+
"Heavy graph layout runs in a web worker (D3 force)."
|
|
656
|
+
]
|
|
657
|
+
},
|
|
658
|
+
{
|
|
659
|
+
"id": "bulk-action-flow",
|
|
660
|
+
"name": "Bulk action (multi-select → act on many)",
|
|
661
|
+
"whenToUse": "Act on multiple list rows at once (delete, sync, enable/disable, export).",
|
|
662
|
+
"examples": [
|
|
663
|
+
"inventory bulk ops",
|
|
664
|
+
"alert bulk suppress",
|
|
665
|
+
"ncm bulk backup/sync"
|
|
666
|
+
],
|
|
667
|
+
"regions": [
|
|
668
|
+
{
|
|
669
|
+
"region": "select",
|
|
670
|
+
"use": [
|
|
671
|
+
{
|
|
672
|
+
"id": "table",
|
|
673
|
+
"variant": "selectable",
|
|
674
|
+
"note": "row checkboxes + header select-all"
|
|
675
|
+
}
|
|
676
|
+
]
|
|
677
|
+
},
|
|
678
|
+
{
|
|
679
|
+
"region": "action bar",
|
|
680
|
+
"use": [
|
|
681
|
+
{
|
|
682
|
+
"id": "toolbars",
|
|
683
|
+
"variant": "bulk-action-bar",
|
|
684
|
+
"note": "fixed-bottom; appears on selection; shows count + actions"
|
|
685
|
+
}
|
|
686
|
+
]
|
|
687
|
+
},
|
|
688
|
+
{
|
|
689
|
+
"region": "confirm (destructive)",
|
|
690
|
+
"use": [
|
|
691
|
+
{
|
|
692
|
+
"id": "modal",
|
|
693
|
+
"variant": "FlotoConfirmModal",
|
|
694
|
+
"note": "variant=error for bulk delete"
|
|
695
|
+
}
|
|
696
|
+
]
|
|
697
|
+
}
|
|
698
|
+
],
|
|
699
|
+
"layout": {
|
|
700
|
+
"shell": "list view + a fixed bottom bar that animates in on selection",
|
|
701
|
+
"tokens": {
|
|
702
|
+
"bar": "--primary",
|
|
703
|
+
"barText": "--white-regular"
|
|
704
|
+
}
|
|
705
|
+
},
|
|
706
|
+
"gotchas": [
|
|
707
|
+
"Announce the bar's appearance to AT (role=toolbar).",
|
|
708
|
+
"Clear the selection after the action.",
|
|
709
|
+
"Hide/disable actions the user lacks permission for."
|
|
710
|
+
]
|
|
711
|
+
},
|
|
712
|
+
{
|
|
713
|
+
"id": "inline-edit-flow",
|
|
714
|
+
"name": "Inline edit (edit a row/cell in place)",
|
|
715
|
+
"whenToUse": "Quick edits to a table row without opening a form or drawer.",
|
|
716
|
+
"examples": [
|
|
717
|
+
"metric-collection tables",
|
|
718
|
+
"mapping tables (flow/log settings)"
|
|
719
|
+
],
|
|
720
|
+
"regions": [
|
|
721
|
+
{
|
|
722
|
+
"region": "trigger",
|
|
723
|
+
"use": [
|
|
724
|
+
{
|
|
725
|
+
"id": "table",
|
|
726
|
+
"variant": "inline-editing",
|
|
727
|
+
"note": "click a cell / row edit icon → the cell becomes a control"
|
|
728
|
+
}
|
|
729
|
+
]
|
|
730
|
+
},
|
|
731
|
+
{
|
|
732
|
+
"region": "controls",
|
|
733
|
+
"use": [
|
|
734
|
+
{
|
|
735
|
+
"id": "input"
|
|
736
|
+
},
|
|
737
|
+
{
|
|
738
|
+
"id": "select"
|
|
739
|
+
},
|
|
740
|
+
{
|
|
741
|
+
"id": "dropdown-picker"
|
|
742
|
+
}
|
|
743
|
+
]
|
|
744
|
+
},
|
|
745
|
+
{
|
|
746
|
+
"region": "commit",
|
|
747
|
+
"use": [
|
|
748
|
+
{
|
|
749
|
+
"id": "button",
|
|
750
|
+
"variant": "icon-circle",
|
|
751
|
+
"note": "save (✓) / cancel (×) per row"
|
|
752
|
+
}
|
|
753
|
+
]
|
|
754
|
+
}
|
|
755
|
+
],
|
|
756
|
+
"layout": {
|
|
757
|
+
"shell": "the row swaps display cells for inline controls",
|
|
758
|
+
"tokens": {
|
|
759
|
+
"editingRow": "--neutral-lightest"
|
|
760
|
+
}
|
|
761
|
+
},
|
|
762
|
+
"gotchas": [
|
|
763
|
+
"Validate inline (error on the cell).",
|
|
764
|
+
"Esc cancels, Enter commits.",
|
|
765
|
+
"Keep focus within the editing row."
|
|
766
|
+
]
|
|
767
|
+
},
|
|
768
|
+
{
|
|
769
|
+
"id": "search-filter-flow",
|
|
770
|
+
"name": "Search & filter a list",
|
|
771
|
+
"whenToUse": "Narrow a list by free-text search + structured filters.",
|
|
772
|
+
"examples": [
|
|
773
|
+
"every list view",
|
|
774
|
+
"log / metric explorers",
|
|
775
|
+
"ncm explorer"
|
|
776
|
+
],
|
|
777
|
+
"regions": [
|
|
778
|
+
{
|
|
779
|
+
"region": "search",
|
|
780
|
+
"use": [
|
|
781
|
+
{
|
|
782
|
+
"id": "input",
|
|
783
|
+
"variant": "search",
|
|
784
|
+
"note": "debounced free-text"
|
|
785
|
+
}
|
|
786
|
+
]
|
|
787
|
+
},
|
|
788
|
+
{
|
|
789
|
+
"region": "filters",
|
|
790
|
+
"use": [
|
|
791
|
+
{
|
|
792
|
+
"id": "filters",
|
|
793
|
+
"variant": "filter-bar",
|
|
794
|
+
"note": "field/operator/value conditions, groups, Apply/Reset"
|
|
795
|
+
}
|
|
796
|
+
],
|
|
797
|
+
"alt": [
|
|
798
|
+
{
|
|
799
|
+
"id": "toolbars",
|
|
800
|
+
"variant": "grid-toolbar",
|
|
801
|
+
"note": "quick filters + column chooser"
|
|
802
|
+
}
|
|
803
|
+
]
|
|
804
|
+
},
|
|
805
|
+
{
|
|
806
|
+
"region": "results",
|
|
807
|
+
"use": [
|
|
808
|
+
{
|
|
809
|
+
"id": "table"
|
|
810
|
+
}
|
|
811
|
+
],
|
|
812
|
+
"contains": [
|
|
813
|
+
"empty state (MNoData) when nothing matches"
|
|
814
|
+
]
|
|
815
|
+
}
|
|
816
|
+
],
|
|
817
|
+
"layout": {
|
|
818
|
+
"shell": "toolbar (search + filters) above the table",
|
|
819
|
+
"tokens": {}
|
|
820
|
+
},
|
|
821
|
+
"gotchas": [
|
|
822
|
+
"Always show a no-results/empty state.",
|
|
823
|
+
"Reflect active filters as removable chips.",
|
|
824
|
+
"Persist filters where useful."
|
|
825
|
+
]
|
|
826
|
+
},
|
|
827
|
+
{
|
|
828
|
+
"id": "export-flow",
|
|
829
|
+
"name": "Export a list / report (PDF / CSV)",
|
|
830
|
+
"whenToUse": "Download the current grid or render a report.",
|
|
831
|
+
"examples": [
|
|
832
|
+
"inventory / alerts / audit grids (exportGrid)",
|
|
833
|
+
"report render (EmptyLayout)"
|
|
834
|
+
],
|
|
835
|
+
"regions": [
|
|
836
|
+
{
|
|
837
|
+
"region": "trigger",
|
|
838
|
+
"use": [
|
|
839
|
+
{
|
|
840
|
+
"id": "toolbars",
|
|
841
|
+
"variant": "page-header",
|
|
842
|
+
"note": "export button (transparent + export icon)"
|
|
843
|
+
}
|
|
844
|
+
],
|
|
845
|
+
"alt": [
|
|
846
|
+
{
|
|
847
|
+
"id": "menu",
|
|
848
|
+
"variant": "context-menu",
|
|
849
|
+
"note": "format dropdown: PDF / CSV"
|
|
850
|
+
}
|
|
851
|
+
]
|
|
852
|
+
},
|
|
853
|
+
{
|
|
854
|
+
"region": "output",
|
|
855
|
+
"use": [
|
|
856
|
+
{
|
|
857
|
+
"id": "table",
|
|
858
|
+
"note": "exportGrid(columns, items, 'pdf'|'csv'); honour per-column exportType"
|
|
859
|
+
}
|
|
860
|
+
]
|
|
861
|
+
}
|
|
862
|
+
],
|
|
863
|
+
"layout": {
|
|
864
|
+
"shell": "export action in the page header; the print-safe report render uses the EmptyLayout shell",
|
|
865
|
+
"tokens": {}
|
|
866
|
+
},
|
|
867
|
+
"gotchas": [
|
|
868
|
+
"Respect column exportType (datetime/duration).",
|
|
869
|
+
"Large exports → progress / async.",
|
|
870
|
+
"Print/PDF render via EmptyLayout (no chrome)."
|
|
871
|
+
]
|
|
872
|
+
},
|
|
873
|
+
{
|
|
874
|
+
"id": "confirm-delete-flow",
|
|
875
|
+
"name": "Confirm a destructive action",
|
|
876
|
+
"whenToUse": "Any delete / irreversible action triggered from a row, detail, or bulk bar.",
|
|
877
|
+
"examples": [
|
|
878
|
+
"delete monitor",
|
|
879
|
+
"remove user",
|
|
880
|
+
"bulk delete"
|
|
881
|
+
],
|
|
882
|
+
"regions": [
|
|
883
|
+
{
|
|
884
|
+
"region": "trigger",
|
|
885
|
+
"use": [
|
|
886
|
+
{
|
|
887
|
+
"id": "menu",
|
|
888
|
+
"variant": "context-menu",
|
|
889
|
+
"note": "row ⋯ Delete (danger=red)"
|
|
890
|
+
},
|
|
891
|
+
{
|
|
892
|
+
"id": "toolbars",
|
|
893
|
+
"variant": "bulk-action-bar",
|
|
894
|
+
"note": "bulk Delete"
|
|
895
|
+
}
|
|
896
|
+
]
|
|
897
|
+
},
|
|
898
|
+
{
|
|
899
|
+
"region": "confirm",
|
|
900
|
+
"use": [
|
|
901
|
+
{
|
|
902
|
+
"id": "modal",
|
|
903
|
+
"variant": "FlotoConfirmModal",
|
|
904
|
+
"note": "variant=error; name the verb (Delete), not Yes/OK"
|
|
905
|
+
}
|
|
906
|
+
]
|
|
907
|
+
}
|
|
908
|
+
],
|
|
909
|
+
"layout": {
|
|
910
|
+
"shell": "trigger opens FlotoConfirmModal(error) centered over a dimmed/blurred backdrop",
|
|
911
|
+
"tokens": {
|
|
912
|
+
"danger": "--secondary-red",
|
|
913
|
+
"backdrop": "blur(3px)"
|
|
914
|
+
}
|
|
915
|
+
},
|
|
916
|
+
"gotchas": [
|
|
917
|
+
"Use variant=error + a named verb button (Delete), never 'Yes'/'OK'.",
|
|
918
|
+
"Danger actions in menus use --secondary-red + an icon (not colour-only)."
|
|
919
|
+
]
|
|
920
|
+
}
|
|
921
|
+
]
|
|
922
|
+
}
|