@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,425 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "navigation",
|
|
3
|
+
"display": "Navigation",
|
|
4
|
+
"tier": "molecule",
|
|
5
|
+
"family": "Navigation",
|
|
6
|
+
"status": "stable",
|
|
7
|
+
"summary": "The product's wayfinding components, by archetype: Primary nav (left module sidebar), Side menu (searchable collapsible section menu), Steps (wizard/stepper), Breadcrumb (back + trail), Back button. Tabs are their own family (Molecules/Tabs).",
|
|
8
|
+
"variants": [
|
|
9
|
+
{
|
|
10
|
+
"name": "primary-nav",
|
|
11
|
+
"what": "left module sidebar 65↔170px",
|
|
12
|
+
"usage": "global"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"name": "side-menu-section",
|
|
16
|
+
"what": "MCollapse sections (Settings)",
|
|
17
|
+
"usage": "20×"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "side-menu-tree",
|
|
21
|
+
"what": "infinite-tree hierarchy",
|
|
22
|
+
"usage": "many"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "side-menu-categories",
|
|
26
|
+
"what": "Dashboard categories + counts",
|
|
27
|
+
"usage": "many"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "side-menu-list",
|
|
31
|
+
"what": "Report/saved-views list + inline edit",
|
|
32
|
+
"usage": "many"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "steps",
|
|
36
|
+
"what": "report/setup/2FA wizards (bespoke)",
|
|
37
|
+
"usage": "3 flows"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"name": "breadcrumb",
|
|
41
|
+
"what": "back + path trail",
|
|
42
|
+
"usage": ""
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "back-button",
|
|
46
|
+
"what": "chevron-left FlotoLink",
|
|
47
|
+
"usage": "3×"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "user-menu",
|
|
51
|
+
"what": "avatar → profile/theme/logout",
|
|
52
|
+
"usage": ""
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "notification-dropdown",
|
|
56
|
+
"what": "bell → Alerts/System tabs",
|
|
57
|
+
"usage": ""
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"name": "omnibox",
|
|
61
|
+
"what": "global search palette",
|
|
62
|
+
"usage": ""
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"name": "noc-player",
|
|
66
|
+
"what": "wallboard rotator",
|
|
67
|
+
"usage": ""
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"name": "timeline-scrollbar",
|
|
71
|
+
"what": "temporal navigator",
|
|
72
|
+
"usage": ""
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"name": "graph-breadcrumb",
|
|
76
|
+
"what": "expanded-node tags",
|
|
77
|
+
"usage": ""
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"name": "metric-picker",
|
|
81
|
+
"what": "⊕-add + drag picker (cross-ref)",
|
|
82
|
+
"usage": ""
|
|
83
|
+
}
|
|
84
|
+
],
|
|
85
|
+
"sizes": [],
|
|
86
|
+
"states": [
|
|
87
|
+
{
|
|
88
|
+
"name": "active",
|
|
89
|
+
"what": "selected (--primary)"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"name": "hover",
|
|
93
|
+
"what": "over item (--nav-hover-bg)"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"name": "collapsed",
|
|
97
|
+
"what": "primary-nav 65px"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"name": "expanded",
|
|
101
|
+
"what": "primary-nav 170px"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"name": "completed",
|
|
105
|
+
"what": "stepper ✓"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"name": "current",
|
|
109
|
+
"what": "stepper filled+ring"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"name": "remaining",
|
|
113
|
+
"what": "stepper grey"
|
|
114
|
+
}
|
|
115
|
+
],
|
|
116
|
+
"renders": "REFERENCE REPRODUCTIONS — the live nav is router/store-bound (visibleMenuItems, FlotoLink :to, MCollapse). Built with real tokens + MIcon.",
|
|
117
|
+
"archetypes": {
|
|
118
|
+
"PrimaryNav": {
|
|
119
|
+
"source": "src/components/layout/navbar.vue (FlotoNavBar)",
|
|
120
|
+
"what": "the left vertical MODULE sidebar (MLayoutSider) — collapsed 65px by default (brand mark + module icons), hover-expands to 170px (mouseover -> pinned) showing the ObserveOps logo + labels. 16 modules from visibleMenuItems (role/license-gated): Dashboards, Monitors, Alerts, SLO (BETA), Reports, Topology, NCCM, NetRoute, Metric Explorer, Log Explorer, APM Explorer, RUM Explorer, Flow Explorer, Trap Explorer, Audits, Settings. Active module highlights --primary on --code-tag-background-color with an inset left rule when expanded.",
|
|
121
|
+
"variants": "collapsed (65px) <-> expanded (170px) is the primary variant",
|
|
122
|
+
"builtFrom": "MLayoutSider + MMenu theme=dark / MMenuItem + FlotoLink (router)"
|
|
123
|
+
},
|
|
124
|
+
"SideMenu": {
|
|
125
|
+
"source": "settings/components/left-menu.vue + log/components/hierarchy/* + topology-hierarchy.vue + dashboard/components/dashboard-dropdown.vue + report/components/report-sidebar.vue + ExplorerSavedViewList",
|
|
126
|
+
"usage": "many (per-module left-panels)",
|
|
127
|
+
"what": "the LEFT-PANEL nav archetype — one shell (optional tabs + search + scrollable list) in FOUR forms",
|
|
128
|
+
"forms": {
|
|
129
|
+
"section": "settings/left-menu.vue (20×) — MCollapse accordion of sections -> sub-items; active --primary left rule",
|
|
130
|
+
"tree": "Log Explorer hierarchy + Topology (shared components/hierarchy/infinite-tree.vue) — tabs (Type/Group/Saved Query), virtualised hierarchy: chevron + type icon/severity + name + count badge, nested",
|
|
131
|
+
"categoryList": "Dashboard dashboard-dropdown.vue — segmented Dashboard/NOC tabs + round + button, MCollapse categories with count badges + favourite star",
|
|
132
|
+
"listSavedViews": "Report report-sidebar.vue + ExplorerSavedViewList (APM/RUM/Metric/Log saved query) — tabs + search + flat MMenu list, Favorites star, active highlight, per-row pencil inline-rename"
|
|
133
|
+
},
|
|
134
|
+
"builtFrom": "MInput + MCollapse + MMenu + infinite-tree (tree form)",
|
|
135
|
+
"notInFamily": "faceted checkbox sidebar (vertical-filter/filters.vue) is a FILTER (see filters registry); Metric Explorer picker is a PICKER (see dropdown-picker); Flow Result-By is a config panel"
|
|
136
|
+
},
|
|
137
|
+
"Steps": {
|
|
138
|
+
"source": "BESPOKE — no MSteps in the product. report/components/report-steps.vue (ReportSteps, horizontal wizard) + product-setup/components/guide-section-step.vue (vertical guide steps) + auth/two-factor-verification.vue (Step 1/2/3)",
|
|
139
|
+
"usage": "3 flows",
|
|
140
|
+
"what": "a numbered wizard/stepper — count circle + label per step in states completed (✓ filled) · current (filled + ring) · remaining (grey); connectors fill --primary up to current",
|
|
141
|
+
"realUsages": {
|
|
142
|
+
"ReportBuilder": "report-steps.vue — horizontal 3-step: Report Properties -> Visualizations & Preview -> Schedule (the reproduction models this)",
|
|
143
|
+
"ProductSetupGuide": "product-setup guide-sections / guide-section-step — vertical numbered steps, completed shows green check; Log/Metric/Flow setup guides",
|
|
144
|
+
"TwoFactorSetup": "auth/two-factor-verification.vue — Step 1/2/3 indicator with dividers"
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
"Breadcrumb": {
|
|
148
|
+
"source": "e.g. src/modules/report/components/compliance-breadcrumb.vue",
|
|
149
|
+
"what": "back chevron + a path trail (Reports / Compliance / PCI-DSS Audit), current crumb bold. Some product breadcrumbs are a back + title/subtitle context header rather than a full trail."
|
|
150
|
+
},
|
|
151
|
+
"BackButton": {
|
|
152
|
+
"source": "src/components/_base-back-button.vue (FlotoBackButton)",
|
|
153
|
+
"usage": "3×",
|
|
154
|
+
"what": "a chevron-left MIcon in a FlotoLink (router :to); the smallest nav atom — also the Page header's back-button slot"
|
|
155
|
+
},
|
|
156
|
+
"Tabs": {
|
|
157
|
+
"note": "in-page tab navigation — its OWN family (Molecules/Tabs, MTab 86×). Cross-referenced, not duplicated here."
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
"appChromeAndNavigators": {
|
|
161
|
+
"UserMenu": {
|
|
162
|
+
"source": "components/layout/user-dropdown.vue",
|
|
163
|
+
"what": "header avatar -> MPopover: My Profile / Product Setup Guide / Documentation + theme toggle + Logout"
|
|
164
|
+
},
|
|
165
|
+
"NotificationDropdown": {
|
|
166
|
+
"source": "components/layout/notification-dropdown.vue",
|
|
167
|
+
"what": "header bell + MBadge count -> Alerts / System Notification tabs (MTab) + RecycleScroller list + View all / Clear all"
|
|
168
|
+
},
|
|
169
|
+
"Omnibox": {
|
|
170
|
+
"source": "components/omnibox/searchbar.vue",
|
|
171
|
+
"what": "global search / command palette: category picker + CodeMirror query editor + Execute (enter) / parse-error + clear"
|
|
172
|
+
},
|
|
173
|
+
"NocPlayer": {
|
|
174
|
+
"source": "dashboard/components/noc-player.vue",
|
|
175
|
+
"what": "wallboard rotator: logo + prev/next around current dashboard title + countdown + play/pause"
|
|
176
|
+
},
|
|
177
|
+
"TimelineScrollbar": {
|
|
178
|
+
"source": "netroute/components/timeline-scrollbar.vue",
|
|
179
|
+
"what": "temporal navigator: single (chevron) + batch (double-chevron) step controls around a time window; steps time-bucketed snapshots"
|
|
180
|
+
},
|
|
181
|
+
"GraphBreadcrumb": {
|
|
182
|
+
"source": "netroute/components/graph-view.vue",
|
|
183
|
+
"what": "a Breadcrumb variant: closable rounded MTags of expanded graph nodes (the traversal/expansion trail)"
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
"checkedAndScopedOut": {
|
|
187
|
+
"TopologyViewSwitch_ChartTypeSelector": {
|
|
188
|
+
"verdict": "Radio (segmented) usage, not a new nav entry -> cross-ref Atoms/Radio"
|
|
189
|
+
},
|
|
190
|
+
"TopologyCategory_APMSection_AlertTwoLevelTabs": {
|
|
191
|
+
"verdict": "Tabs usage (Alert adds a hover sub-menu) -> cross-ref Molecules/Tabs"
|
|
192
|
+
},
|
|
193
|
+
"ViewDetailDrawer": {
|
|
194
|
+
"verdict": "Drawer + Tabs composition -> cross-ref Organisms/Drawer"
|
|
195
|
+
},
|
|
196
|
+
"FacetedSidebar": {
|
|
197
|
+
"source": "vertical-filter/filters.vue",
|
|
198
|
+
"verdict": "a Filter, not nav -> Molecules/Filters -> Vertical filter"
|
|
199
|
+
},
|
|
200
|
+
"NotNavigation": {
|
|
201
|
+
"verdict": "swap/reorder control, role-navigation settings form, flame-graph zoom, Layer-3 toggle, keyboard-shortcuts tooltip -> not wayfinding"
|
|
202
|
+
},
|
|
203
|
+
"Pagination": {
|
|
204
|
+
"usage": "79x",
|
|
205
|
+
"verdict": "page-nav archetype, but belongs to the Table family (grid footer) — cross-referenced, not duplicated here"
|
|
206
|
+
},
|
|
207
|
+
"MenuToggle": {
|
|
208
|
+
"source": "menu-toggle-button",
|
|
209
|
+
"usage": "7x",
|
|
210
|
+
"verdict": "the Primary nav's collapse control — folded into the collapsed<->expanded variant, not a separate entry"
|
|
211
|
+
},
|
|
212
|
+
"NavLandmark": {
|
|
213
|
+
"source": "role=navigation",
|
|
214
|
+
"usage": "2x",
|
|
215
|
+
"verdict": "an a11y attribute, not a component — tracked in F2"
|
|
216
|
+
},
|
|
217
|
+
"MMenu": {
|
|
218
|
+
"usage": "13x",
|
|
219
|
+
"verdict": "shared primitive under Primary nav / Side menu -> now catalogued in its own right in the Menu family (Molecules/Menu)"
|
|
220
|
+
},
|
|
221
|
+
"MSubMenu": {
|
|
222
|
+
"usage": "0x",
|
|
223
|
+
"verdict": "flyout/mega-menu submenus confirmed ABSENT in the product"
|
|
224
|
+
},
|
|
225
|
+
"ContextMenu": {
|
|
226
|
+
"source": "FlotoGridActions (_base-grid-actions.vue) + MDropdown",
|
|
227
|
+
"usage": "grid rows + 1x",
|
|
228
|
+
"verdict": "an action surface (do something), not wayfinding -> now homed in the Menu family (Molecules/Menu)"
|
|
229
|
+
}
|
|
230
|
+
},
|
|
231
|
+
"decisionFlow": [
|
|
232
|
+
"Switch between top-level product MODULES? -> Primary nav (left sidebar).",
|
|
233
|
+
"Navigate SECTIONS within a module (e.g. Settings)? -> Side menu.",
|
|
234
|
+
"A multi-step create/setup flow? -> Steps (wizard).",
|
|
235
|
+
"Show location + a way up? -> Breadcrumb.",
|
|
236
|
+
"Just go back one level? -> Back button.",
|
|
237
|
+
"Switch between sibling VIEWS of one page? -> Tabs (Molecules/Tabs)."
|
|
238
|
+
],
|
|
239
|
+
"do": [
|
|
240
|
+
"Use the Primary nav for modules, the Side menu for sections.",
|
|
241
|
+
"Use Steps for ordered multi-step flows (show completed/current/remaining).",
|
|
242
|
+
"Put the Back button in the Page header's back-button slot.",
|
|
243
|
+
"Use Tabs (separate family) for sibling views, not module/section nav."
|
|
244
|
+
],
|
|
245
|
+
"dont": [
|
|
246
|
+
"Don't use Tabs for module/section navigation (that's Primary nav / Side menu).",
|
|
247
|
+
"Don't build a bespoke sidebar — reuse FlotoNavBar / the side-menu pattern.",
|
|
248
|
+
"Don't confuse a breadcrumb (location) with a toolbar (actions)."
|
|
249
|
+
],
|
|
250
|
+
"knownIssues": {
|
|
251
|
+
"F1": {
|
|
252
|
+
"severity": "Low",
|
|
253
|
+
"issue": "Router/store-bound (visibleMenuItems, FlotoLink, MCollapse) -> reproductions."
|
|
254
|
+
},
|
|
255
|
+
"F2": {
|
|
256
|
+
"severity": "Low",
|
|
257
|
+
"a11y": true,
|
|
258
|
+
"issue": "Verify nav landmarks (role=navigation / aria-current on active), focus-visible ring (SF-001), and that the stepper conveys step state to assistive tech."
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
"tokensUsed": [
|
|
262
|
+
"--nav-panel-bg",
|
|
263
|
+
"--code-tag-background-color",
|
|
264
|
+
"--left-menu-text-color",
|
|
265
|
+
"--primary",
|
|
266
|
+
"--primary-alt",
|
|
267
|
+
"--border-color",
|
|
268
|
+
"--neutral-lightest",
|
|
269
|
+
"--neutral-light",
|
|
270
|
+
"--page-text-color"
|
|
271
|
+
],
|
|
272
|
+
"storybook": "Molecules/Navigation",
|
|
273
|
+
"related": [
|
|
274
|
+
"tabs",
|
|
275
|
+
"toolbars",
|
|
276
|
+
"input",
|
|
277
|
+
"tag",
|
|
278
|
+
"table"
|
|
279
|
+
],
|
|
280
|
+
"figma": {
|
|
281
|
+
"status": "todo"
|
|
282
|
+
},
|
|
283
|
+
"apis": {
|
|
284
|
+
"PrimaryNav": {
|
|
285
|
+
"source": "src/components/layout/navbar.vue (FlotoNavBar)",
|
|
286
|
+
"props": {
|
|
287
|
+
"portalMode": "Boolean (false)"
|
|
288
|
+
},
|
|
289
|
+
"events": {
|
|
290
|
+
"change": "v-model — pinned (collapse) state Boolean"
|
|
291
|
+
},
|
|
292
|
+
"slots": {},
|
|
293
|
+
"note": "router/Vuex-bound — reads visibleMenuItems from auth/permission + roleNavigation; v-model = pinned. Reproduction: the item list is store-driven."
|
|
294
|
+
},
|
|
295
|
+
"SideMenuSection": {
|
|
296
|
+
"source": "src/modules/settings/components/left-menu.vue",
|
|
297
|
+
"props": {},
|
|
298
|
+
"events": {},
|
|
299
|
+
"slots": {},
|
|
300
|
+
"note": "presentational + store-bound: maps a permission-checked MenuItems array to MCollapse sections; searchTerm + activeSection managed internally (synced to route). No public props/events — to reproduce, feed your own sections array (see source)."
|
|
301
|
+
},
|
|
302
|
+
"BackButton": {
|
|
303
|
+
"source": "src/components/_base-back-button.vue (FlotoBackButton)",
|
|
304
|
+
"props": {},
|
|
305
|
+
"events": {},
|
|
306
|
+
"slots": {},
|
|
307
|
+
"note": "thin wrapper — FlotoLink + chevron-left; inheritAttrs:false → bind :to on it for routing."
|
|
308
|
+
},
|
|
309
|
+
"Steps": {
|
|
310
|
+
"source": "report/components/report-steps.vue (ReportSteps) + product-setup/components/guide-section-step.vue",
|
|
311
|
+
"props": {
|
|
312
|
+
"report-stepper": {
|
|
313
|
+
"value": "Number (1) — current step; v-model"
|
|
314
|
+
},
|
|
315
|
+
"setup-guide-step": {
|
|
316
|
+
"step": "Object {title,description,route?,documentationLink?,icon?} (required)",
|
|
317
|
+
"index": "Number (required)",
|
|
318
|
+
"completed": "Boolean — shows ✓",
|
|
319
|
+
"isLastItem": "Boolean — hides connector",
|
|
320
|
+
"type": "String — 'log'/'flow' show icon vs number",
|
|
321
|
+
"hideLink": "Boolean"
|
|
322
|
+
}
|
|
323
|
+
},
|
|
324
|
+
"events": {
|
|
325
|
+
"report": {
|
|
326
|
+
"change": "new step Number (v-model)"
|
|
327
|
+
},
|
|
328
|
+
"setup-guide": {
|
|
329
|
+
"link": "step route clicked"
|
|
330
|
+
}
|
|
331
|
+
},
|
|
332
|
+
"slots": {
|
|
333
|
+
"setup-guide": {
|
|
334
|
+
"default": "replaces step title/description/link"
|
|
335
|
+
}
|
|
336
|
+
},
|
|
337
|
+
"note": "BESPOKE steppers (no MSteps). Report = horizontal, v-model current step (3 hardcoded). Setup-guide = one vertical step, props-driven."
|
|
338
|
+
},
|
|
339
|
+
"NocPlayer": {
|
|
340
|
+
"source": "src/modules/dashboard/components/noc-player.vue",
|
|
341
|
+
"props": {
|
|
342
|
+
"noc": "Object (required) — { dashboards[], refreshInterval (default 30s) }"
|
|
343
|
+
},
|
|
344
|
+
"events": {
|
|
345
|
+
"close": "exit button / Esc"
|
|
346
|
+
},
|
|
347
|
+
"slots": {},
|
|
348
|
+
"note": "self-contained fullscreen rotator; auto-rotates by noc.refreshInterval; keyboard Esc/arrows/space; renders Widgets per dashboard."
|
|
349
|
+
},
|
|
350
|
+
"TimelineScrollbar": {
|
|
351
|
+
"source": "src/modules/netroute/components/timeline-scrollbar.vue",
|
|
352
|
+
"props": {},
|
|
353
|
+
"events": {},
|
|
354
|
+
"slots": {},
|
|
355
|
+
"note": "display-only — consumes an INJECTED netRouteHistoryChartContext { startTime, endTime, onePontShift, oneBatchShift }; no public props/events (controls call the injected callbacks). To reproduce, provide that context."
|
|
356
|
+
},
|
|
357
|
+
"SideMenuCategories": {
|
|
358
|
+
"source": "src/modules/dashboard/components/dashboard-dropdown.vue",
|
|
359
|
+
"props": {
|
|
360
|
+
"value": "Number — selected dashboard/NOC id (v-model)",
|
|
361
|
+
"options": "Array {id,name,category,canEdit} (required)",
|
|
362
|
+
"nocOptions": "Array — NOC tab",
|
|
363
|
+
"menuVisible": "Boolean — sidebar visibility/affix"
|
|
364
|
+
},
|
|
365
|
+
"events": {
|
|
366
|
+
"change": "new id (v-model)",
|
|
367
|
+
"visible-change": "Boolean",
|
|
368
|
+
"toggle-favourite": "dashboard id",
|
|
369
|
+
"create": "",
|
|
370
|
+
"create-noc": "",
|
|
371
|
+
"edit-noc": "NOC obj",
|
|
372
|
+
"delete-noc": "NOC obj"
|
|
373
|
+
},
|
|
374
|
+
"slots": {},
|
|
375
|
+
"note": "store-bound (UserPreference/auth); Dashboard/NOC tabs (MRadioGroup as-button) + MCollapse categories + count + star; v-model=change."
|
|
376
|
+
},
|
|
377
|
+
"SideMenuList": {
|
|
378
|
+
"source": "src/modules/report/components/report-sidebar.vue",
|
|
379
|
+
"props": {
|
|
380
|
+
"value": "String — selected category key (v-model)",
|
|
381
|
+
"sidebarItems": "Array {key,text,isDefault,isNew,reportTypes[]} (required)",
|
|
382
|
+
"tab": "String (required) — filters categories by reportTypes",
|
|
383
|
+
"isSidebarForForm": "Boolean"
|
|
384
|
+
},
|
|
385
|
+
"events": {
|
|
386
|
+
"change": "category key (v-model)",
|
|
387
|
+
"add-new-category": "new name string",
|
|
388
|
+
"update-category": "(newKey, oldKey, isNew) — rename"
|
|
389
|
+
},
|
|
390
|
+
"slots": {},
|
|
391
|
+
"note": "MMenu category list + inline FlotoForm rename/create; filters by tab. Reused pattern as ExplorerSavedViewList."
|
|
392
|
+
},
|
|
393
|
+
"SideMenuTree": {
|
|
394
|
+
"source": "src/modules/log/components/hierarchy/hierarchy-container.vue + src/components/hierarchy/infinite-tree.vue (core)",
|
|
395
|
+
"props": {
|
|
396
|
+
"data": "Array — nested nodes {id,key,name,children[],resourceId,resourceType,severity,...}",
|
|
397
|
+
"value": "Object — selected node {id,resourceType,name,key} (v-model)",
|
|
398
|
+
"keyField": "String ('key')",
|
|
399
|
+
"openIds": "Array — pre-expanded node ids",
|
|
400
|
+
"rowHeight": "Number (35)",
|
|
401
|
+
"searchTerm": "String — debounced filter (750ms)",
|
|
402
|
+
"filterFn": "Function(node,term)->bool",
|
|
403
|
+
"autoExpandSearchResults": "Boolean"
|
|
404
|
+
},
|
|
405
|
+
"events": {
|
|
406
|
+
"change": "(selectedNode, tree) — v-model",
|
|
407
|
+
"mouseenter-infinite-tree-node": "node",
|
|
408
|
+
"mouseleave-infinite-tree-node": "node"
|
|
409
|
+
},
|
|
410
|
+
"slots": {
|
|
411
|
+
"default": "{ item:node, tree } — custom node render"
|
|
412
|
+
},
|
|
413
|
+
"note": "virtual tree on infinite-tree + RecycleScroller; container adds Type/Group/Saved-Query tabs. Node data shape is the key contract."
|
|
414
|
+
}
|
|
415
|
+
},
|
|
416
|
+
"a11y": {
|
|
417
|
+
"summary": "Nav rail/side-menus should be <nav>/role=navigation with a label; active item carries aria-current; steppers + collapsibles expose state (aria-expanded; completed/current/remaining).",
|
|
418
|
+
"issues": [
|
|
419
|
+
"SF-001 focus ring on nav items/rows/steps.",
|
|
420
|
+
"App-chrome triggers (user menu, bell, omnibox), notification count, NOC controls and graph-breadcrumb × need accessible names."
|
|
421
|
+
],
|
|
422
|
+
"doc": "Molecules/Navigation/Accessibility",
|
|
423
|
+
"$note": "Catalogue-wide gap SF-001 = no visible :focus-visible ring; tracked in findings/."
|
|
424
|
+
}
|
|
425
|
+
}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "popover",
|
|
3
|
+
"display": "Popover",
|
|
4
|
+
"tier": "molecule",
|
|
5
|
+
"family": "Popover & Tooltip",
|
|
6
|
+
"source": "ui/components/Popover/Popover.vue (kit; wraps Ant a-popover). Related primitive: src/components/_base-popper.vue (MPopper, wraps v-popover).",
|
|
7
|
+
"status": "stable",
|
|
8
|
+
"summary": "Click-triggered floating panel anchored to a trigger, holding interactive content (action menus, pickers, mini-forms). Slots trigger/title/default each get {hide,show,toggle}. MPopper is the lower-level v-popover positioning primitive that powers FlotoDropdownPicker.",
|
|
9
|
+
"variants": [
|
|
10
|
+
{
|
|
11
|
+
"name": "click",
|
|
12
|
+
"what": "click trigger (default)",
|
|
13
|
+
"usage": "20×"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"name": "hover",
|
|
17
|
+
"what": "hover trigger (+N reveals)",
|
|
18
|
+
"usage": "13×"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "action-menu",
|
|
22
|
+
"what": "kebab item actions",
|
|
23
|
+
"usage": ""
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"name": "grid-row-actions",
|
|
27
|
+
"what": "grid row kebab",
|
|
28
|
+
"usage": ""
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"name": "rich-panel",
|
|
32
|
+
"what": "colour/date picker panel",
|
|
33
|
+
"usage": ""
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
"sizes": [],
|
|
37
|
+
"states": [
|
|
38
|
+
{
|
|
39
|
+
"name": "closed",
|
|
40
|
+
"what": "hidden"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "open",
|
|
44
|
+
"what": "visible/interactive"
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"usage": {
|
|
48
|
+
"total": 35,
|
|
49
|
+
"mpopper": 2,
|
|
50
|
+
"patterns": [
|
|
51
|
+
"action/kebab menu (_base-grid-actions)",
|
|
52
|
+
"color picker",
|
|
53
|
+
"date/time picker",
|
|
54
|
+
"rich panels",
|
|
55
|
+
"+N overflow hover reveal (tags-list)"
|
|
56
|
+
],
|
|
57
|
+
"triggerDistribution": {
|
|
58
|
+
"click": 20,
|
|
59
|
+
"hover": 13,
|
|
60
|
+
"explicit-click": 2
|
|
61
|
+
},
|
|
62
|
+
"placementDistribution": {
|
|
63
|
+
"bottomLeft": 11,
|
|
64
|
+
"bottomRight": 9,
|
|
65
|
+
"bottom": 7,
|
|
66
|
+
"leftTop": 4,
|
|
67
|
+
"top": 1,
|
|
68
|
+
"right": 1
|
|
69
|
+
},
|
|
70
|
+
"transition": "transition-name='slide-up' (16x)",
|
|
71
|
+
"overlayClassName": [
|
|
72
|
+
"picker-action-dropdown",
|
|
73
|
+
"color-picker-popover",
|
|
74
|
+
"picker-overlay",
|
|
75
|
+
"readable-content-overlay"
|
|
76
|
+
]
|
|
77
|
+
},
|
|
78
|
+
"props": {
|
|
79
|
+
"trigger": {
|
|
80
|
+
"type": "string",
|
|
81
|
+
"default": "click",
|
|
82
|
+
"enum": [
|
|
83
|
+
"click",
|
|
84
|
+
"hover",
|
|
85
|
+
"focus",
|
|
86
|
+
"contextmenu"
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
"placement": {
|
|
90
|
+
"type": "string",
|
|
91
|
+
"default": "bottom",
|
|
92
|
+
"enum": [
|
|
93
|
+
"top",
|
|
94
|
+
"bottom",
|
|
95
|
+
"bottomRight",
|
|
96
|
+
"bottomLeft",
|
|
97
|
+
"left",
|
|
98
|
+
"right"
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
"visible": {
|
|
102
|
+
"type": "boolean",
|
|
103
|
+
"default": null,
|
|
104
|
+
"note": "controlled mode; pair with @visibleChange (one-way — F1)"
|
|
105
|
+
},
|
|
106
|
+
"overlayClassName": {
|
|
107
|
+
"type": "string",
|
|
108
|
+
"default": null
|
|
109
|
+
},
|
|
110
|
+
"overlayStyle": {
|
|
111
|
+
"type": "object",
|
|
112
|
+
"default": null
|
|
113
|
+
},
|
|
114
|
+
"mouseEnterDelay": {
|
|
115
|
+
"type": "number",
|
|
116
|
+
"default": null
|
|
117
|
+
},
|
|
118
|
+
"mouseLeaveDelay": {
|
|
119
|
+
"type": "number",
|
|
120
|
+
"default": null
|
|
121
|
+
},
|
|
122
|
+
"destroyTooltipOnHide": {
|
|
123
|
+
"type": "boolean",
|
|
124
|
+
"default": true,
|
|
125
|
+
"note": "re-creates content each open"
|
|
126
|
+
},
|
|
127
|
+
"getPopupContainer": {
|
|
128
|
+
"type": "function",
|
|
129
|
+
"default": null,
|
|
130
|
+
"note": "defaults to closest .__panel or document.body"
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
"slots": {
|
|
134
|
+
"trigger": "the anchor; scope { hide, show, toggle }",
|
|
135
|
+
"title": "optional header; scope { hide, show, toggle }",
|
|
136
|
+
"default": "the panel content; scope { hide, show, toggle }"
|
|
137
|
+
},
|
|
138
|
+
"events": {
|
|
139
|
+
"visibleChange": "fires on open/close (controlled mode)"
|
|
140
|
+
},
|
|
141
|
+
"tokensUsed": [
|
|
142
|
+
"--page-background-color",
|
|
143
|
+
"--border-color",
|
|
144
|
+
"--page-text-color"
|
|
145
|
+
],
|
|
146
|
+
"decisionFlow": [
|
|
147
|
+
"Is the content a short non-interactive hint? -> Tooltip, not Popover.",
|
|
148
|
+
"Is it a row/item action list (edit/duplicate/delete)? -> Popover action menu (placement='bottomRight').",
|
|
149
|
+
"Is it a picker/mini-form/color or date picker? -> Popover rich panel (often a custom overlay-class).",
|
|
150
|
+
"Is it a center-interrupting task or confirmation? -> Modal, not Popover.",
|
|
151
|
+
"Is it a select-from-options field? -> FlotoDropdownPicker (which uses MPopper internally)."
|
|
152
|
+
],
|
|
153
|
+
"usageRules": {
|
|
154
|
+
"actionMenu": {
|
|
155
|
+
"useWhen": "row/item actions (edit, duplicate, delete)",
|
|
156
|
+
"how": "kebab (ellipsis-v) trigger, placement='bottomRight', items call hide()",
|
|
157
|
+
"example": "grid row actions (_base-grid-actions)"
|
|
158
|
+
},
|
|
159
|
+
"richPanel": {
|
|
160
|
+
"useWhen": "an interactive picker/mini-form",
|
|
161
|
+
"how": "trigger='click' + a custom overlay-class",
|
|
162
|
+
"example": "color-picker-popover, date/time picker"
|
|
163
|
+
},
|
|
164
|
+
"hoverReveal": {
|
|
165
|
+
"useWhen": "a passive reveal on hover (no click) — +N overflow, quick peek",
|
|
166
|
+
"how": "trigger='hover' (often transition-name='slide-up')",
|
|
167
|
+
"example": "tags-list '+N' overflow (13x use hover)"
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
"placementVocabulary": "Ant names (bottomLeft/bottomRight/leftTop/bottom/top) — NOT the Tooltip's VTippy names (top-start). Not interchangeable.",
|
|
171
|
+
"do": [
|
|
172
|
+
"Use for interactive, click-triggered content",
|
|
173
|
+
"Give items a hide() on select",
|
|
174
|
+
"Anchor row actions bottomRight"
|
|
175
|
+
],
|
|
176
|
+
"dont": [
|
|
177
|
+
"Don't use for plain hints (use Tooltip)",
|
|
178
|
+
"Don't use for center-interrupting tasks/confirmations (use Modal)",
|
|
179
|
+
"Don't hand-roll a select dropdown (use FlotoDropdownPicker)"
|
|
180
|
+
],
|
|
181
|
+
"knownIssues": {
|
|
182
|
+
"F1": {
|
|
183
|
+
"severity": "Low",
|
|
184
|
+
"issue": "`visible` is one-way — controlled mode needs an explicit @visibleChange handler to stay in sync."
|
|
185
|
+
},
|
|
186
|
+
"F2": {
|
|
187
|
+
"severity": "Medium",
|
|
188
|
+
"a11y": true,
|
|
189
|
+
"issue": "Trigger lacks aria-haspopup/aria-expanded; no focus move into the panel on open and no focus-trap — keyboard/SR users aren't told a panel opened."
|
|
190
|
+
},
|
|
191
|
+
"F3": {
|
|
192
|
+
"severity": "Medium",
|
|
193
|
+
"a11y": true,
|
|
194
|
+
"issue": "No focus ring (`:focus { outline:none }` in _base-popper) — links to SF-001."
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
"storybook": "Molecules/Popover",
|
|
198
|
+
"related": [
|
|
199
|
+
"tooltip",
|
|
200
|
+
"modal",
|
|
201
|
+
"dropdown-picker"
|
|
202
|
+
],
|
|
203
|
+
"figma": {
|
|
204
|
+
"status": "todo"
|
|
205
|
+
},
|
|
206
|
+
"a11y": {
|
|
207
|
+
"summary": "Holds interactive content → focus handling matters. Outside-click / Esc close (from a-popover); verify Esc returns focus.",
|
|
208
|
+
"issues": [
|
|
209
|
+
"Trigger not announced as a disclosure — no aria-haspopup/expanded (F2).",
|
|
210
|
+
"Focus not moved into the panel; no focus trap.",
|
|
211
|
+
"Overlay removes the focus outline."
|
|
212
|
+
],
|
|
213
|
+
"doc": "Molecules/Popover/Accessibility",
|
|
214
|
+
"$note": "Catalogue-wide gap SF-001 = no visible :focus-visible ring; tracked in findings/."
|
|
215
|
+
}
|
|
216
|
+
}
|