@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,265 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "modal",
|
|
3
|
+
"component": "MModal",
|
|
4
|
+
"display": "Modal",
|
|
5
|
+
"tier": "organism",
|
|
6
|
+
"category": "overlay",
|
|
7
|
+
"source": "mkit",
|
|
8
|
+
"sourceFile": "ui/components/Modal/Modal.vue",
|
|
9
|
+
"status": "core",
|
|
10
|
+
"maturity": "stable",
|
|
11
|
+
"summary": "Centered dialog over a dimmed backdrop. MModal (39x) is the base; FlotoConfirmModal (71x) is the confirm variant. Open via trigger slot or open prop. No x/backdrop-close (footer/Escape only).",
|
|
12
|
+
"variants": [
|
|
13
|
+
{
|
|
14
|
+
"name": "MModal",
|
|
15
|
+
"what": "centered dialog",
|
|
16
|
+
"usage": "39×"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"name": "FlotoConfirmModal",
|
|
20
|
+
"what": "confirm yes/no",
|
|
21
|
+
"usage": "71×"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"name": "hide-footer",
|
|
25
|
+
"what": "read-only/detail",
|
|
26
|
+
"usage": "4×"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "scrollable-modal",
|
|
30
|
+
"what": "fixed-height scroll body",
|
|
31
|
+
"usage": ""
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"name": "restrict-width",
|
|
35
|
+
"what": "capped 1020px",
|
|
36
|
+
"usage": ""
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"name": "no-padding-modal",
|
|
40
|
+
"what": "full-bleed content",
|
|
41
|
+
"usage": "11×"
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
"sizes": [
|
|
45
|
+
{
|
|
46
|
+
"name": "default",
|
|
47
|
+
"value": "560px",
|
|
48
|
+
"note": ""
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"name": "confirm",
|
|
52
|
+
"value": "450px",
|
|
53
|
+
"note": ""
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"name": "restrict-width",
|
|
57
|
+
"value": "1020px",
|
|
58
|
+
"note": ""
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
"states": [
|
|
62
|
+
{
|
|
63
|
+
"name": "closed",
|
|
64
|
+
"what": "hidden"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"name": "open",
|
|
68
|
+
"what": "over backdrop"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"name": "loading",
|
|
72
|
+
"what": "confirmLoading"
|
|
73
|
+
}
|
|
74
|
+
],
|
|
75
|
+
"family": "Overlay",
|
|
76
|
+
"components": {
|
|
77
|
+
"MModal": {
|
|
78
|
+
"usage": 39,
|
|
79
|
+
"open": "trigger slot { open }",
|
|
80
|
+
"props": [
|
|
81
|
+
"width",
|
|
82
|
+
"centered",
|
|
83
|
+
"confirmLoading",
|
|
84
|
+
"preventAutoCloseOnConfirm",
|
|
85
|
+
"overlayClassName"
|
|
86
|
+
],
|
|
87
|
+
"slots": [
|
|
88
|
+
"trigger { open, close, toggle }",
|
|
89
|
+
"title",
|
|
90
|
+
"default (body)",
|
|
91
|
+
"footer { cancel, success }"
|
|
92
|
+
],
|
|
93
|
+
"events": [
|
|
94
|
+
"success",
|
|
95
|
+
"cancel"
|
|
96
|
+
]
|
|
97
|
+
},
|
|
98
|
+
"FlotoConfirmModal": {
|
|
99
|
+
"usage": 71,
|
|
100
|
+
"open": "open prop (Boolean)",
|
|
101
|
+
"props": [
|
|
102
|
+
"open",
|
|
103
|
+
"variant(default error)",
|
|
104
|
+
"width(450)",
|
|
105
|
+
"successText(Yes)",
|
|
106
|
+
"cancelText(No)",
|
|
107
|
+
"hideIcon",
|
|
108
|
+
"iconShadow",
|
|
109
|
+
"disableAutoHide"
|
|
110
|
+
],
|
|
111
|
+
"slots": [
|
|
112
|
+
"icon",
|
|
113
|
+
"message",
|
|
114
|
+
"header",
|
|
115
|
+
"cancel-action",
|
|
116
|
+
"confirm-action"
|
|
117
|
+
],
|
|
118
|
+
"events": [
|
|
119
|
+
"confirm",
|
|
120
|
+
"hide"
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
"anatomy": [
|
|
125
|
+
"title (no x close)",
|
|
126
|
+
"body (default slot)",
|
|
127
|
+
"footer (cancel + success)",
|
|
128
|
+
"dimmed backdrop/mask"
|
|
129
|
+
],
|
|
130
|
+
"behaviors": {
|
|
131
|
+
"open": "trigger slot (open fn) or open prop",
|
|
132
|
+
"close": "header x / footer Cancel / Escape (verified) / success — NO built-in x, NO backdrop-close (closable/maskClosable hardcoded false)",
|
|
133
|
+
"destroyOnClose": true,
|
|
134
|
+
"confirm": "Cancel(default) left, action right; error variant for destructive"
|
|
135
|
+
},
|
|
136
|
+
"headerPattern": "built-in x is off, so real modals (~26) add their own header in the title slot: flex row with a text-primary title + a close x (MIcon times wired to hide())",
|
|
137
|
+
"overlayVariants": {
|
|
138
|
+
"hide-footer": "removes footer (read-only/detail) — 4x",
|
|
139
|
+
"scrollable-modal": "fixed-height scrollable body, top 50px, rounded header; modifiers restrict-width (1020px), smaller-modal (50vh)",
|
|
140
|
+
"no-padding-modal / no-padding-confrim-modal": "strip content padding — 11x",
|
|
141
|
+
"backdrop": "blurred (backdrop-filter: blur(3px))"
|
|
142
|
+
},
|
|
143
|
+
"tokensUsed": [
|
|
144
|
+
"--page-background-color",
|
|
145
|
+
"--border-color",
|
|
146
|
+
"--page-text-color"
|
|
147
|
+
],
|
|
148
|
+
"accessibility": {
|
|
149
|
+
"semantics": "role=dialog; Ant traps + restores focus; Escape closes (even with x hidden)",
|
|
150
|
+
"gaps": "F1 no visible close besides footer; SF-001 no focus ring inside"
|
|
151
|
+
},
|
|
152
|
+
"decisionFlow": [
|
|
153
|
+
"Yes/no or destructive confirmation? -> FlotoConfirmModal (variant=error for destructive).",
|
|
154
|
+
"A focused short task/form that must interrupt? -> MModal (dialog).",
|
|
155
|
+
"Long/complex content, or contextual to a record (details/edit in place)? -> FlotoDrawer (side panel), not a modal.",
|
|
156
|
+
"Just a brief message? -> consider a notification instead of a modal."
|
|
157
|
+
],
|
|
158
|
+
"usageRules": {
|
|
159
|
+
"dialog(MModal)": {
|
|
160
|
+
"useWhen": "a focused task/form that interrupts the flow; short content",
|
|
161
|
+
"must": "include a footer Cancel (only visible way out — F1)",
|
|
162
|
+
"example": "Edit/Filter/Note dialogs"
|
|
163
|
+
},
|
|
164
|
+
"confirm(FlotoConfirmModal)": {
|
|
165
|
+
"useWhen": "confirm a yes/no or destructive action",
|
|
166
|
+
"example": "Delete monitor? (error variant, Cancel/Delete); delete in CRUD lists, inline-name-edit, trap-profile"
|
|
167
|
+
},
|
|
168
|
+
"hide-footer": {
|
|
169
|
+
"useWhen": "view-only content (no Save/Cancel); header x is the way out",
|
|
170
|
+
"example": "metric-explorer Compare/Anomaly/Arithmetic/Outlier modals"
|
|
171
|
+
},
|
|
172
|
+
"scrollable-modal": {
|
|
173
|
+
"useWhen": "long body that must scroll (lists/editors); wrap content in flex:1;min-height:0;overflow-y:auto (F3)",
|
|
174
|
+
"example": "Compare metric, linked-records detail, widget JSON editor, column configurator"
|
|
175
|
+
},
|
|
176
|
+
"no-padding": {
|
|
177
|
+
"useWhen": "content manages its own padding (editor/full-bleed)",
|
|
178
|
+
"example": "log-collection profile list, view-query, LAMA integration, activation-code modal"
|
|
179
|
+
},
|
|
180
|
+
"drawer-instead": {
|
|
181
|
+
"useWhen": "content is long or contextual to a record -> use FlotoDrawer (158x), not a modal",
|
|
182
|
+
"example": "incident details, approval drawers"
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
"inProduct": {
|
|
186
|
+
"MModal": "Anomaly/Forecast/Outlier modals, Filter modal, Note modal, Compare modal",
|
|
187
|
+
"FlotoConfirmModal": "delete/abort confirmations across the app",
|
|
188
|
+
"FlotoDrawer": "detail/view drawers, form drawers (incident details, approval drawers)"
|
|
189
|
+
},
|
|
190
|
+
"do": [
|
|
191
|
+
"Use MModal for a focused dialog; FlotoConfirmModal for confirms.",
|
|
192
|
+
"Always include a footer Cancel (visible way out).",
|
|
193
|
+
"Use FlotoDrawer for long or record-contextual content."
|
|
194
|
+
],
|
|
195
|
+
"dont": [
|
|
196
|
+
"Don't rely on a x or backdrop-click to close (disabled, F1).",
|
|
197
|
+
"Don't use a modal for content better inline or in a drawer.",
|
|
198
|
+
"Don't label actions Yes/OK — name the verb (Delete, Save)."
|
|
199
|
+
],
|
|
200
|
+
"whenToUse": "A focused task, dialog, or confirmation that must interrupt the flow.",
|
|
201
|
+
"insteadOf": [
|
|
202
|
+
"raw a-modal",
|
|
203
|
+
"a hand-built overlay"
|
|
204
|
+
],
|
|
205
|
+
"usage": {
|
|
206
|
+
"MModal": 39,
|
|
207
|
+
"FlotoConfirmModal": 71,
|
|
208
|
+
"FlotoDrawer": 158,
|
|
209
|
+
"FlotoDrawerForm": 59
|
|
210
|
+
},
|
|
211
|
+
"knownIssues": [
|
|
212
|
+
"F1 (medium, UX/a11y): no top-right x and no backdrop-close (closable/maskClosable hardcoded false). Escape + footer Cancel work, but a modal whose footer omits Cancel has no discoverable dismiss for mouse users. Make closable a prop (visible x) or require a footer Cancel.",
|
|
213
|
+
"F2 (high, a11y): no visible focus ring inside the dialog (SF-001).",
|
|
214
|
+
"F3 (low): scrollable-modal sets a fixed-height flex-column body but NO overflow on the body — long content spills out unless wrapped in a flex:1;min-height:0;overflow-y:auto child. Add overflow to the variant or document the required structure."
|
|
215
|
+
],
|
|
216
|
+
"related": [
|
|
217
|
+
"FlotoConfirmModal",
|
|
218
|
+
"FlotoDrawer",
|
|
219
|
+
"FlotoDrawerForm",
|
|
220
|
+
"MButton",
|
|
221
|
+
"FlotoFormItem"
|
|
222
|
+
],
|
|
223
|
+
"changelog": [
|
|
224
|
+
"2026-06-07: added (decision-grade). MModal (39x) + FlotoConfirmModal (71x). Trigger-slot / open-prop; title/body/footer slots; width/centered/confirmLoading. Verified Basic + Confirm open; Escape closes, no x (F1). Drawer (158x) = related own entry."
|
|
225
|
+
],
|
|
226
|
+
"storybook": "Organisms/Modal",
|
|
227
|
+
"figma": {
|
|
228
|
+
"status": "todo",
|
|
229
|
+
"component": "Modal"
|
|
230
|
+
},
|
|
231
|
+
"$tokensNote": "Backdrop scrim is a blurred Ant literal rgba(0,0,0,.45) + blur(3px) — not tokenized; Ant Modal internals follow the kit.",
|
|
232
|
+
"apis": {
|
|
233
|
+
"MModal": {
|
|
234
|
+
"source": "ui/components/Modal/Modal.vue (kit)",
|
|
235
|
+
"props": {
|
|
236
|
+
"width": "[Number,String] — modal width",
|
|
237
|
+
"centered": "Boolean — vertically centre",
|
|
238
|
+
"confirmLoading": "Boolean — spinner on the confirm button",
|
|
239
|
+
"preventAutoCloseOnConfirm": "Boolean (false) — keep open after confirm",
|
|
240
|
+
"overlayClassName": "String — class on the backdrop mask"
|
|
241
|
+
},
|
|
242
|
+
"events": {
|
|
243
|
+
"success": "() — confirm / OK",
|
|
244
|
+
"cancel": "() — cancel / close"
|
|
245
|
+
},
|
|
246
|
+
"slots": {
|
|
247
|
+
"title": "header title",
|
|
248
|
+
"default": "modal body"
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
"FlotoConfirmModal": {
|
|
252
|
+
"source": "src/components/_base-confirm-modal.vue",
|
|
253
|
+
"note": "Confirm/alert wrapper — variant=error for destructive; commonly hosts a FlotoForm (form-in-modal)."
|
|
254
|
+
}
|
|
255
|
+
},
|
|
256
|
+
"a11y": {
|
|
257
|
+
"summary": "role=dialog; Ant traps + restores focus; Esc closes. No top-right × and no backdrop-close (closable/maskClosable hardcoded false). Give a clear title; state the consequence for confirms.",
|
|
258
|
+
"issues": [
|
|
259
|
+
"No visible focus ring inside the dialog.",
|
|
260
|
+
"Esc is the only dismiss (no × / backdrop-close)."
|
|
261
|
+
],
|
|
262
|
+
"doc": "Organisms/Modal/Accessibility",
|
|
263
|
+
"$note": "Catalogue-wide gap SF-001 = no visible :focus-visible ring; tracked in findings/."
|
|
264
|
+
}
|
|
265
|
+
}
|