@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,388 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dropdown-picker",
|
|
3
|
+
"component": "FlotoDropdownPicker",
|
|
4
|
+
"display": "DropdownPicker",
|
|
5
|
+
"tier": "organism",
|
|
6
|
+
"source": "app",
|
|
7
|
+
"sourceFile": "src/components/_base-dropdown-picker.vue",
|
|
8
|
+
"status": "core",
|
|
9
|
+
"maturity": "stable-but-flawed",
|
|
10
|
+
"summary": "The product's custom select: popover-anchored, virtualized, searchable, single/multi-select, keyboard nav, optional inline-add. Not a native/Ant select.",
|
|
11
|
+
"variants": [
|
|
12
|
+
{
|
|
13
|
+
"name": "single",
|
|
14
|
+
"what": "pick one (default)",
|
|
15
|
+
"usage": ""
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "multiple",
|
|
19
|
+
"what": "checkboxes + Select All",
|
|
20
|
+
"usage": ""
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "not-searchable",
|
|
24
|
+
"what": "no search box",
|
|
25
|
+
"usage": "119×"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"name": "allow-clear",
|
|
29
|
+
"what": "× clear on hover",
|
|
30
|
+
"usage": "218×"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"name": "text-only",
|
|
34
|
+
"what": "plain-text trigger",
|
|
35
|
+
"usage": "15×"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"name": "read-only-pills",
|
|
39
|
+
"what": "multi+disabled → pills",
|
|
40
|
+
"usage": ""
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "inline-add",
|
|
44
|
+
"what": "add new option",
|
|
45
|
+
"usage": ""
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"name": "two-pane",
|
|
49
|
+
"what": "menu + hovered description",
|
|
50
|
+
"usage": ""
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "use-popover",
|
|
54
|
+
"what": "MPopover trigger",
|
|
55
|
+
"usage": "26×"
|
|
56
|
+
}
|
|
57
|
+
],
|
|
58
|
+
"sizes": [],
|
|
59
|
+
"states": [
|
|
60
|
+
{
|
|
61
|
+
"name": "closed",
|
|
62
|
+
"what": "trigger only"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"name": "open",
|
|
66
|
+
"what": "menu + search"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"name": "disabled",
|
|
70
|
+
"what": "read-only pills"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"name": "empty",
|
|
74
|
+
"what": "placeholder"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "selected",
|
|
78
|
+
"what": "value(s) in trigger"
|
|
79
|
+
}
|
|
80
|
+
],
|
|
81
|
+
"family": "Form Controls",
|
|
82
|
+
"model": {
|
|
83
|
+
"prop": "value",
|
|
84
|
+
"event": "change"
|
|
85
|
+
},
|
|
86
|
+
"optionShape": {
|
|
87
|
+
"label": "text || name || label",
|
|
88
|
+
"value": "key || id || value",
|
|
89
|
+
"canonical": "{ key, text }",
|
|
90
|
+
"extra": [
|
|
91
|
+
"id",
|
|
92
|
+
"disable",
|
|
93
|
+
"status"
|
|
94
|
+
]
|
|
95
|
+
},
|
|
96
|
+
"props": {
|
|
97
|
+
"value": {
|
|
98
|
+
"type": [
|
|
99
|
+
"number",
|
|
100
|
+
"string",
|
|
101
|
+
"object",
|
|
102
|
+
"array",
|
|
103
|
+
"boolean"
|
|
104
|
+
],
|
|
105
|
+
"note": "v-model; key (single) or array of keys (multiple)"
|
|
106
|
+
},
|
|
107
|
+
"options": {
|
|
108
|
+
"type": "array",
|
|
109
|
+
"note": "passed via $attrs; { key, text } objects"
|
|
110
|
+
},
|
|
111
|
+
"externalOptions": {
|
|
112
|
+
"type": "array",
|
|
113
|
+
"default": []
|
|
114
|
+
},
|
|
115
|
+
"disabledOptions": {
|
|
116
|
+
"type": "array",
|
|
117
|
+
"default": []
|
|
118
|
+
},
|
|
119
|
+
"multiple": {
|
|
120
|
+
"type": "boolean",
|
|
121
|
+
"default": false
|
|
122
|
+
},
|
|
123
|
+
"allowSelectAll": {
|
|
124
|
+
"type": "boolean",
|
|
125
|
+
"default": false
|
|
126
|
+
},
|
|
127
|
+
"allowClear": {
|
|
128
|
+
"type": "boolean",
|
|
129
|
+
"default": false,
|
|
130
|
+
"note": "218x"
|
|
131
|
+
},
|
|
132
|
+
"searchable": {
|
|
133
|
+
"type": "boolean",
|
|
134
|
+
"default": true,
|
|
135
|
+
"note": "defaults TRUE (F3); :searchable=false used 119x"
|
|
136
|
+
},
|
|
137
|
+
"asInput": {
|
|
138
|
+
"type": "boolean",
|
|
139
|
+
"default": true,
|
|
140
|
+
"note": "defaults TRUE (F3); trigger looks like an input"
|
|
141
|
+
},
|
|
142
|
+
"wrap": {
|
|
143
|
+
"type": "boolean",
|
|
144
|
+
"default": true,
|
|
145
|
+
"note": "defaults TRUE (F3)"
|
|
146
|
+
},
|
|
147
|
+
"textOnly": {
|
|
148
|
+
"type": "boolean",
|
|
149
|
+
"default": false
|
|
150
|
+
},
|
|
151
|
+
"placeholder": {
|
|
152
|
+
"type": "string",
|
|
153
|
+
"default": "Select"
|
|
154
|
+
},
|
|
155
|
+
"usePopover": {
|
|
156
|
+
"type": "boolean",
|
|
157
|
+
"default": false,
|
|
158
|
+
"note": "false=MPopper (v-tooltip), true=MPopover (kit); 26x"
|
|
159
|
+
},
|
|
160
|
+
"placement": {
|
|
161
|
+
"type": "string",
|
|
162
|
+
"default": "bottom-start"
|
|
163
|
+
},
|
|
164
|
+
"maxValues": {
|
|
165
|
+
"type": "number",
|
|
166
|
+
"default": 0,
|
|
167
|
+
"note": "the REAL selection cap (sliced in handleChange)"
|
|
168
|
+
},
|
|
169
|
+
"maxAllowedSelection": {
|
|
170
|
+
"type": "number",
|
|
171
|
+
"default": 0,
|
|
172
|
+
"note": "DEAD — declared but never used (F2); use maxValues"
|
|
173
|
+
},
|
|
174
|
+
"itemSize": {
|
|
175
|
+
"type": "number",
|
|
176
|
+
"default": 32
|
|
177
|
+
},
|
|
178
|
+
"itemsToShow": {
|
|
179
|
+
"type": "number",
|
|
180
|
+
"default": 10,
|
|
181
|
+
"note": "with hideAllDropdownOptions, caps rendered count"
|
|
182
|
+
},
|
|
183
|
+
"hideAllDropdownOptions": {
|
|
184
|
+
"type": "boolean",
|
|
185
|
+
"default": false
|
|
186
|
+
},
|
|
187
|
+
"canUserAddOptions": {
|
|
188
|
+
"type": "boolean",
|
|
189
|
+
"default": false,
|
|
190
|
+
"note": "inline add; emits add"
|
|
191
|
+
},
|
|
192
|
+
"addLabel": {
|
|
193
|
+
"type": "string",
|
|
194
|
+
"default": ""
|
|
195
|
+
},
|
|
196
|
+
"useAfterMenuDescription": {
|
|
197
|
+
"type": "boolean",
|
|
198
|
+
"default": false,
|
|
199
|
+
"note": "two-pane: menu + hovered description"
|
|
200
|
+
},
|
|
201
|
+
"showHelp": {
|
|
202
|
+
"type": "boolean",
|
|
203
|
+
"default": false
|
|
204
|
+
},
|
|
205
|
+
"defaultOpen": {
|
|
206
|
+
"type": "boolean",
|
|
207
|
+
"default": false,
|
|
208
|
+
"note": "opens on mount"
|
|
209
|
+
},
|
|
210
|
+
"avoidKeyboardNavigation": {
|
|
211
|
+
"type": "boolean",
|
|
212
|
+
"default": false
|
|
213
|
+
},
|
|
214
|
+
"overlayClassName": {
|
|
215
|
+
"type": "string",
|
|
216
|
+
"default": "picker-overlay"
|
|
217
|
+
},
|
|
218
|
+
"overlayStyle": {
|
|
219
|
+
"type": "object",
|
|
220
|
+
"default": {}
|
|
221
|
+
},
|
|
222
|
+
"minWidth": {
|
|
223
|
+
"type": "number",
|
|
224
|
+
"default": 0
|
|
225
|
+
},
|
|
226
|
+
"removeClearBtn": {
|
|
227
|
+
"type": "boolean",
|
|
228
|
+
"default": false
|
|
229
|
+
},
|
|
230
|
+
"fixedPosition": {
|
|
231
|
+
"type": "boolean",
|
|
232
|
+
"default": false
|
|
233
|
+
},
|
|
234
|
+
"disabled": {
|
|
235
|
+
"type": "boolean",
|
|
236
|
+
"default": false
|
|
237
|
+
}
|
|
238
|
+
},
|
|
239
|
+
"events": [
|
|
240
|
+
"change",
|
|
241
|
+
"show",
|
|
242
|
+
"hide",
|
|
243
|
+
"search",
|
|
244
|
+
"add",
|
|
245
|
+
"active-item-index-change"
|
|
246
|
+
],
|
|
247
|
+
"slots": [
|
|
248
|
+
"default (menu)",
|
|
249
|
+
"menu-item",
|
|
250
|
+
"before-menu-text",
|
|
251
|
+
"after-menu-text",
|
|
252
|
+
"after-menu",
|
|
253
|
+
"helpbox",
|
|
254
|
+
"hovered-menu-description",
|
|
255
|
+
"trigger"
|
|
256
|
+
],
|
|
257
|
+
"triggers": {
|
|
258
|
+
"SingleTrigger": "single mode; asInput=MInput readonly + chevron/clear; textOnly=plain text; else a tag-style chip",
|
|
259
|
+
"MultipleTrigger": "multi mode; enabled=MInput 'First (+N)'; disabled=SelectedItemPills teal pills"
|
|
260
|
+
},
|
|
261
|
+
"dependencies": [
|
|
262
|
+
"MPopper (v-tooltip) or MPopover",
|
|
263
|
+
"RecycleScroller (vue-virtual-scroller)",
|
|
264
|
+
"arrayWorker (web worker search)",
|
|
265
|
+
"MInput",
|
|
266
|
+
"MMenu/MMenuItem",
|
|
267
|
+
"MCheckbox",
|
|
268
|
+
"MDivider",
|
|
269
|
+
"MButton",
|
|
270
|
+
"MIcon"
|
|
271
|
+
],
|
|
272
|
+
"anatomy": [
|
|
273
|
+
"trigger (input/text/chip/pills)",
|
|
274
|
+
"search box (+ optional add)",
|
|
275
|
+
"Select All header (multi)",
|
|
276
|
+
"virtualized option rows",
|
|
277
|
+
"Clear footer (multi)",
|
|
278
|
+
"no-data illustration"
|
|
279
|
+
],
|
|
280
|
+
"tokensUsed": [
|
|
281
|
+
"--dropdown-hover-background",
|
|
282
|
+
"--left-menu-text-color-hover",
|
|
283
|
+
"--main-tags-bg-color",
|
|
284
|
+
"--main-tags-text-color"
|
|
285
|
+
],
|
|
286
|
+
"accessibility": {
|
|
287
|
+
"keyboardOpen": "ArrowUp/Down/Enter/Escape work only once open (window keydown)",
|
|
288
|
+
"gaps": "F1 — no combobox ARIA, not keyboard-openable (click-only), no focus ring (SF-001)"
|
|
289
|
+
},
|
|
290
|
+
"do": [
|
|
291
|
+
"Use as the standard select; options as { key, text }; v-model the key(s).",
|
|
292
|
+
"multiple + allow-select-all for multi; :searchable=false for short lists; trigger slot for custom triggers."
|
|
293
|
+
],
|
|
294
|
+
"dont": [
|
|
295
|
+
"Don't rely on maxAllowedSelection to cap (F2 — use maxValues).",
|
|
296
|
+
"Don't assume keyboard/AT users can operate it today (F1). Don't forget searchable/asInput/wrap default true (F3)."
|
|
297
|
+
],
|
|
298
|
+
"whenToUse": "The default select control anywhere in the product (single or multi).",
|
|
299
|
+
"decisionFlow": [
|
|
300
|
+
"Free-form typed tags? -> LooseTags, not the picker.",
|
|
301
|
+
"2-3 always-visible exclusive options? -> MRadio (segmented).",
|
|
302
|
+
"Simple on/off? -> MSwitch.",
|
|
303
|
+
"Choosing one/many from a list? -> DropdownPicker.",
|
|
304
|
+
"Choosing several? -> multiple (+ allow-select-all).",
|
|
305
|
+
"Short fixed list? -> :searchable=false.",
|
|
306
|
+
"Clearable/none valid? -> allow-clear.",
|
|
307
|
+
"User can add missing options? -> can-user-add-options + add-label.",
|
|
308
|
+
"Non-default trigger (button/chips)? -> trigger slot."
|
|
309
|
+
],
|
|
310
|
+
"usageRules": {
|
|
311
|
+
"single(default)": {
|
|
312
|
+
"useWhen": "pick one value from a list (most common)",
|
|
313
|
+
"example": "monitor type, template, owner"
|
|
314
|
+
},
|
|
315
|
+
"multiple": {
|
|
316
|
+
"useWhen": "pick several values (checkboxes + Select-All + Clear); add allow-select-all",
|
|
317
|
+
"example": "filter by several tags/groups"
|
|
318
|
+
},
|
|
319
|
+
"searchable=false": {
|
|
320
|
+
"useWhen": "short fixed list where search is noise (119x)"
|
|
321
|
+
},
|
|
322
|
+
"allow-clear": {
|
|
323
|
+
"useWhen": "an empty/none state is valid and resettable (218x)"
|
|
324
|
+
},
|
|
325
|
+
"as-input": {
|
|
326
|
+
"useWhen": "trigger should look like a form field (default true); false for chip/inline trigger"
|
|
327
|
+
},
|
|
328
|
+
"can-user-add-options": {
|
|
329
|
+
"useWhen": "user may need a value not in the list (inline add -> emits add)"
|
|
330
|
+
},
|
|
331
|
+
"trigger-slot": {
|
|
332
|
+
"useWhen": "default input trigger doesn't fit (button, avatar, pills)"
|
|
333
|
+
},
|
|
334
|
+
"cap-selection": {
|
|
335
|
+
"useWhen": "limit count -> use maxValues, NOT maxAllowedSelection (dead, F2)"
|
|
336
|
+
}
|
|
337
|
+
},
|
|
338
|
+
"insteadOf": [
|
|
339
|
+
"native select",
|
|
340
|
+
"a-select",
|
|
341
|
+
"MSelect (for non-tag selects)"
|
|
342
|
+
],
|
|
343
|
+
"usage": {
|
|
344
|
+
"total": 510,
|
|
345
|
+
"files": 241,
|
|
346
|
+
"allowClear": 218,
|
|
347
|
+
"searchableFalse": 119,
|
|
348
|
+
"multiple": 66,
|
|
349
|
+
"textOnly": 15,
|
|
350
|
+
"usePopover": 26
|
|
351
|
+
},
|
|
352
|
+
"knownIssues": [
|
|
353
|
+
"F1 (high, a11y) -> promoted to SF-003: not an accessible combobox — no role/aria-expanded/activedescendant, click-only open (not keyboard-openable), no focus ring (SF-001). Highest-impact a11y gap (510x). See findings/SF-003.",
|
|
354
|
+
"F2 (medium): maxAllowedSelection declared but never used; real cap is maxValues. Consumers (LooseTags asDropdown) pass it expecting a limit.",
|
|
355
|
+
"F3 (low): searchable/asInput/wrap default to true (against vue/no-boolean-default).",
|
|
356
|
+
"F4 (low): loose option schema (text||name||label, key||id||value). Document canonical { key, text }.",
|
|
357
|
+
"SB caveat (tooling): search needs the arrayWorker web worker (no-op in Storybook); no-data SVG needs an svg-component loader (absent in SB)."
|
|
358
|
+
],
|
|
359
|
+
"related": [
|
|
360
|
+
"SingleTrigger",
|
|
361
|
+
"MultipleTrigger",
|
|
362
|
+
"SelectedItemPills",
|
|
363
|
+
"LooseTags",
|
|
364
|
+
"MSelect",
|
|
365
|
+
"MPopover",
|
|
366
|
+
"MPopper",
|
|
367
|
+
"MMenu",
|
|
368
|
+
"MCheckbox"
|
|
369
|
+
],
|
|
370
|
+
"changelog": [
|
|
371
|
+
"2026-06-07: added — full deep-dive of _base-dropdown-picker + dropdown-trigger family (510x/241 files); rendered real default mode in SB via v-tooltip/MPopper/RecycleScroller registration; F1-F4 + SB caveats."
|
|
372
|
+
],
|
|
373
|
+
"storybook": "Organisms/DropdownPicker",
|
|
374
|
+
"figma": {
|
|
375
|
+
"status": "todo",
|
|
376
|
+
"component": "DropdownPicker"
|
|
377
|
+
},
|
|
378
|
+
"a11y": {
|
|
379
|
+
"summary": "Once open: ↑/↓ move the active row, Enter selects, Esc closes.",
|
|
380
|
+
"issues": [
|
|
381
|
+
"Opens on click only — no Enter/Space/↓ on the trigger.",
|
|
382
|
+
"No combobox/listbox/option semantics.",
|
|
383
|
+
"No visible focus ring (SF-001)."
|
|
384
|
+
],
|
|
385
|
+
"doc": "Organisms/DropdownPicker/Accessibility",
|
|
386
|
+
"$note": "Catalogue-wide gap SF-001 = no visible :focus-visible ring; tracked in findings/."
|
|
387
|
+
}
|
|
388
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "filters",
|
|
3
|
+
"display": "Filters",
|
|
4
|
+
"tier": "molecule",
|
|
5
|
+
"family": "Filters",
|
|
6
|
+
"status": "stable",
|
|
7
|
+
"summary": "The product's filtering components, grouped by ARCHETYPE (not by the screen they sit in). Four distinct kinds: the Expression builder (nested AND/OR query builder), the Filter bar (inline chips), Quick filters (preset menu), and the Filter row (multi-selects + Reset/Apply). These are molecules; the Toolbars (organisms) compose them.",
|
|
8
|
+
"variants": [
|
|
9
|
+
{
|
|
10
|
+
"name": "expression-builder",
|
|
11
|
+
"what": "nested AND/OR popover",
|
|
12
|
+
"usage": "32×"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"name": "filter-bar",
|
|
16
|
+
"what": "inline chip bar + Match All/Any",
|
|
17
|
+
"usage": "50×"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "quick-filters",
|
|
21
|
+
"what": "preset one-click menu",
|
|
22
|
+
"usage": ""
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "filter-row",
|
|
26
|
+
"what": "multi-selects + Reset/Apply",
|
|
27
|
+
"usage": ""
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "vertical-filter",
|
|
31
|
+
"what": "faceted left-panel (checkbox+count)",
|
|
32
|
+
"usage": "APM/RUM/NCM"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"sizes": [],
|
|
36
|
+
"states": [
|
|
37
|
+
{
|
|
38
|
+
"name": "default",
|
|
39
|
+
"what": "resting"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"name": "applied",
|
|
43
|
+
"what": "active conditions"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"name": "open",
|
|
47
|
+
"what": "popover/panel visible"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "disabled",
|
|
51
|
+
"what": "not interactive"
|
|
52
|
+
}
|
|
53
|
+
],
|
|
54
|
+
"props": "Filters is MULTI-ARCHETYPE — there is no single component prop list. Per-archetype prop/event contracts are in `apis` (e.g. apis.FilterBar = value/fieldSchema/defaultChips + change) and the `archetypes` block.",
|
|
55
|
+
"renders": "REFERENCE REPRODUCTIONS — the live filters are store-bound (FilterCondition is 500+ lines). The Filter bar reproduction is fully interactive.",
|
|
56
|
+
"archetypes": {
|
|
57
|
+
"ExpressionBuilder": {
|
|
58
|
+
"source": "src/components/filters/ — FiltersContainer (filters-container.vue) + Filters (filters.vue) + FilterGroup + FilterCondition (516 ln) + FilterTrigger",
|
|
59
|
+
"usage": "FiltersContainer 32× — the most-used filter",
|
|
60
|
+
"presentation": "an MPopover (placement bottomLeft, has-arrow) opened from a FilterTrigger input (renders the applied query, or a 'Search' placeholder) — NOT an inline panel. Popover has a close x, Pre Filters / Post Filters tabs (MTab), the builder, and a Reset / Clear / Apply footer. Apply emits the query (trigger shows it) and closes; Clear empties; Reset reverts.",
|
|
61
|
+
"what": "a nested AND/OR query builder: 'Group(s) matching All/Any' -> one or more groups (3 pre / 1 post), each 'Include/Exclude -> Group matching All/Any -> Criteria' -> conditions (counter · operator · value; Between -> From/To). Add Condition (max 3) / Add New Group.",
|
|
62
|
+
"props": "MultipleFormItems drive the group/condition lists; FilterCondition is type-aware (operator + value picker by field type)",
|
|
63
|
+
"storybook": "fully functional reproduction (open/close, tabs, add/remove conditions+groups, Include/Exclude + All/Any, Between, Apply renders the query into the trigger)"
|
|
64
|
+
},
|
|
65
|
+
"FilterBar": {
|
|
66
|
+
"source": "src/components/filter-bar/_base-filter-bar.vue + filter-chip.vue",
|
|
67
|
+
"usage": "~50×",
|
|
68
|
+
"what": "an inline CHIP bar — field·operator·value chips (default-chips have no ×) + '+ Filter' + a Match All/Any toggle + Clear All. Chips scroll horizontally; the segment picker floats position:fixed.",
|
|
69
|
+
"note": "moved here from the former Grid Toolbar entry"
|
|
70
|
+
},
|
|
71
|
+
"QuickFilters": {
|
|
72
|
+
"source": "src/components/filter-bar/filter-quick-menu.vue",
|
|
73
|
+
"what": "a thumbs-up button opening a panel of PRESET one-click filters ({ key, label, condition }); picking one applies that condition",
|
|
74
|
+
"note": "moved here from the former Grid Toolbar entry"
|
|
75
|
+
},
|
|
76
|
+
"FilterRow": {
|
|
77
|
+
"source": "pattern (e.g. metric-collection-filters.vue)",
|
|
78
|
+
"what": "the simplest filter — a few multi-selects (Groups/Severity/Tags) + Reset/Apply + close ×, as a slide-in over a list",
|
|
79
|
+
"note": "re-homed from the retired Monitoring Config (Collection Filters)"
|
|
80
|
+
},
|
|
81
|
+
"VerticalFilter": {
|
|
82
|
+
"source": "components/filters/vertical-filter/filters.vue (shared: APM Explorer, APM Error Tracker, RUM Sessions) + ncm/components/explorer-grid-virtical-filter.vue (richer NCM variant)",
|
|
83
|
+
"usage": "APM/RUM/NCM",
|
|
84
|
+
"what": "the FACETED left-panel sidebar — a search atop collapsible groups (MCollapse), each row a checkbox + optional status/type icon + label + count; checking rows filters the grid",
|
|
85
|
+
"note": "looks like a Navigation side menu but it FILTERS (not navigates) -> lives in Filters; cross-referenced from Navigation -> Side menu. Surfaced by the 2026-06-16 left-panel sweep."
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"decisionFlow": [
|
|
89
|
+
"Complex AND/OR conditions across multiple groups? -> Expression builder (FiltersContainer, 32×).",
|
|
90
|
+
"A compact inline chip bar over a grid? -> Filter bar.",
|
|
91
|
+
"One-click saved/preset filters? -> Quick filters.",
|
|
92
|
+
"A few simple multi-selects + Apply/Reset? -> Filter row.",
|
|
93
|
+
"Plain text search of a list? -> the Input 'search' type (181×), not a Filter."
|
|
94
|
+
],
|
|
95
|
+
"do": [
|
|
96
|
+
"Use the Expression builder for real query logic (groups + AND/OR + typed operators).",
|
|
97
|
+
"Use the Filter bar for a compact chip filter over a grid.",
|
|
98
|
+
"Use Quick filters for common one-click presets.",
|
|
99
|
+
"Use a Filter row for a small fixed set of facets."
|
|
100
|
+
],
|
|
101
|
+
"dont": [
|
|
102
|
+
"Don't hand-roll a condition builder — use FiltersContainer.",
|
|
103
|
+
"Don't put plain search here — that's the Input search type.",
|
|
104
|
+
"Don't duplicate a filter across screens — it's one molecule; compose it in a Toolbar."
|
|
105
|
+
],
|
|
106
|
+
"knownIssues": {
|
|
107
|
+
"F1": {
|
|
108
|
+
"severity": "Low",
|
|
109
|
+
"issue": "Store-bound / FilterCondition is 500+ lines, so these render as reproductions (the Filter bar reproduction is fully interactive)."
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"tokensUsed": [
|
|
113
|
+
"--code-tag-background-color",
|
|
114
|
+
"--border-color",
|
|
115
|
+
"--page-background-color",
|
|
116
|
+
"--page-text-color",
|
|
117
|
+
"--neutral-light",
|
|
118
|
+
"--neutral-button-text",
|
|
119
|
+
"--primary",
|
|
120
|
+
"--dropdown-background"
|
|
121
|
+
],
|
|
122
|
+
"storybook": "Molecules/Filters",
|
|
123
|
+
"related": [
|
|
124
|
+
"dropdown-picker",
|
|
125
|
+
"input",
|
|
126
|
+
"tag",
|
|
127
|
+
"table"
|
|
128
|
+
],
|
|
129
|
+
"figma": {
|
|
130
|
+
"status": "todo"
|
|
131
|
+
},
|
|
132
|
+
"apis": {
|
|
133
|
+
"FilterBar": {
|
|
134
|
+
"source": "src/components/filter-bar/_base-filter-bar.vue (FlotoFilterBar)",
|
|
135
|
+
"props": {
|
|
136
|
+
"value": "Object (model, event 'change')",
|
|
137
|
+
"fieldSchema": "Array (required) — the filterable fields + their operator/value types",
|
|
138
|
+
"defaultChips": "Array — leading non-removable chips declared by the consuming module (e.g. Groups/Types/Severity)"
|
|
139
|
+
},
|
|
140
|
+
"events": {
|
|
141
|
+
"change": "(next) emitted as chips change"
|
|
142
|
+
},
|
|
143
|
+
"note": "PITFALL: the leading default-chips come from the MODULE via defaultChips, not the base bar — read a real consumer to reproduce faithfully."
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
"a11y": {
|
|
147
|
+
"summary": "Field/operator/value selects (FlotoDropdownPicker) + real buttons (+Filter, Add, Reset/Apply); convey the nested Group→Condition structure to AT.",
|
|
148
|
+
"issues": [
|
|
149
|
+
"SF-001 focus ring on chips/selects/buttons.",
|
|
150
|
+
"Icon-only triggers (thumbs-up, chip ×, row ×) need accessible names."
|
|
151
|
+
],
|
|
152
|
+
"doc": "Molecules/Filters/Accessibility",
|
|
153
|
+
"$note": "Catalogue-wide gap SF-001 = no visible :focus-visible ring; tracked in findings/."
|
|
154
|
+
}
|
|
155
|
+
}
|