@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.
Files changed (79) hide show
  1. package/AGENTS.md +102 -0
  2. package/README.md +73 -0
  3. package/components/index.json +1270 -0
  4. package/components/recipes/README.md +41 -0
  5. package/components/recipes/recipes.json +922 -0
  6. package/components/registry/README.md +44 -0
  7. package/components/registry/_schema.json +47 -0
  8. package/components/registry/button.json +368 -0
  9. package/components/registry/checkbox.json +177 -0
  10. package/components/registry/data-viz-tooltips.json +409 -0
  11. package/components/registry/date-time-pickers.json +296 -0
  12. package/components/registry/drawer.json +222 -0
  13. package/components/registry/dropdown-picker.json +388 -0
  14. package/components/registry/filters.json +155 -0
  15. package/components/registry/form-item.json +281 -0
  16. package/components/registry/input.json +277 -0
  17. package/components/registry/link.json +186 -0
  18. package/components/registry/loose-tags.json +196 -0
  19. package/components/registry/menu.json +145 -0
  20. package/components/registry/modal.json +265 -0
  21. package/components/registry/navigation.json +425 -0
  22. package/components/registry/popover.json +216 -0
  23. package/components/registry/radio.json +238 -0
  24. package/components/registry/scheduler.json +188 -0
  25. package/components/registry/select.json +247 -0
  26. package/components/registry/severity.json +179 -0
  27. package/components/registry/switch.json +177 -0
  28. package/components/registry/table.json +275 -0
  29. package/components/registry/tabs.json +264 -0
  30. package/components/registry/tag.json +345 -0
  31. package/components/registry/tags-list.json +115 -0
  32. package/components/registry/toolbars.json +240 -0
  33. package/components/registry/tooltip.json +175 -0
  34. package/components/specs/README.md +72 -0
  35. package/components/specs/button.md +230 -0
  36. package/components/specs/checkbox.md +162 -0
  37. package/components/specs/data-viz-tooltips.md +93 -0
  38. package/components/specs/date-time-pickers.md +161 -0
  39. package/components/specs/drawer.md +162 -0
  40. package/components/specs/dropdown-picker.md +161 -0
  41. package/components/specs/filters.md +118 -0
  42. package/components/specs/form-item.md +130 -0
  43. package/components/specs/input.md +130 -0
  44. package/components/specs/link.md +131 -0
  45. package/components/specs/loose-tags.md +139 -0
  46. package/components/specs/menu.md +88 -0
  47. package/components/specs/modal.md +176 -0
  48. package/components/specs/navigation.md +181 -0
  49. package/components/specs/popover.md +118 -0
  50. package/components/specs/radio.md +144 -0
  51. package/components/specs/scheduler.md +133 -0
  52. package/components/specs/select.md +118 -0
  53. package/components/specs/switch.md +124 -0
  54. package/components/specs/table.md +115 -0
  55. package/components/specs/tabs.md +136 -0
  56. package/components/specs/tag.md +196 -0
  57. package/components/specs/tags-list.md +105 -0
  58. package/components/specs/toolbars.md +108 -0
  59. package/components/specs/tooltip.md +112 -0
  60. package/foundation/README.md +39 -0
  61. package/foundation/layout-shells.md +67 -0
  62. package/foundation/page-templates.md +69 -0
  63. package/foundation/panel-behaviours.md +61 -0
  64. package/foundation/screen-regions.md +62 -0
  65. package/index.js +75 -0
  66. package/layout/grid.json +34 -0
  67. package/layout/layouts.json +310 -0
  68. package/llms.txt +60 -0
  69. package/package.json +42 -0
  70. package/spec.manifest.json +407 -0
  71. package/tokens/README.md +125 -0
  72. package/tokens/component.json +34 -0
  73. package/tokens/kit-accents.json +14 -0
  74. package/tokens/primitive.json +130 -0
  75. package/tokens/purpose-map.json +67 -0
  76. package/tokens/semantic.dark.json +90 -0
  77. package/tokens/semantic.light.json +90 -0
  78. package/tokens/structural.json +35 -0
  79. package/tokens/variables.json +2018 -0
@@ -0,0 +1,281 @@
1
+ {
2
+ "name": "form-item",
3
+ "component": "FlotoFormItem",
4
+ "display": "Form Field",
5
+ "tier": "molecule",
6
+ "category": "form",
7
+ "source": "app",
8
+ "sourceFile": "src/components/_base-form-item.vue",
9
+ "status": "core",
10
+ "maturity": "stable",
11
+ "summary": "The form field: label + validation + control + error/help. MValidationProvider (vee-validate) -> MFormItem. Most-used component (1783x). required is derived from rules.",
12
+ "variants": [
13
+ {
14
+ "name": "text",
15
+ "what": "built-in MInput text",
16
+ "usage": ""
17
+ },
18
+ {
19
+ "name": "number",
20
+ "what": "MInput number",
21
+ "usage": ""
22
+ },
23
+ {
24
+ "name": "textarea",
25
+ "what": "MInput textarea",
26
+ "usage": ""
27
+ },
28
+ {
29
+ "name": "vertical",
30
+ "what": "label above",
31
+ "usage": "13×"
32
+ },
33
+ {
34
+ "name": "horizontal",
35
+ "what": "label beside",
36
+ "usage": "14×"
37
+ },
38
+ {
39
+ "name": "custom-control",
40
+ "what": "slot holds any control",
41
+ "usage": ""
42
+ }
43
+ ],
44
+ "sizes": [],
45
+ "states": [
46
+ {
47
+ "name": "default",
48
+ "what": "normal"
49
+ },
50
+ {
51
+ "name": "required",
52
+ "what": "asterisk (from rules)"
53
+ },
54
+ {
55
+ "name": "error",
56
+ "what": "red border + msg (pristine-gated)"
57
+ },
58
+ {
59
+ "name": "valid",
60
+ "what": "passed validation"
61
+ }
62
+ ],
63
+ "family": "Form Controls",
64
+ "model": {
65
+ "prop": "value",
66
+ "event": "update"
67
+ },
68
+ "props": {
69
+ "label": {
70
+ "type": "string",
71
+ "default": "",
72
+ "note": "field label (+ optional info tooltip)"
73
+ },
74
+ "rules": {
75
+ "type": [
76
+ "string",
77
+ "object"
78
+ ],
79
+ "default": "",
80
+ "note": "vee-validate rules e.g. required|email|max:255; REQUIRED ASTERISK is derived from this (F1)"
81
+ },
82
+ "help": {
83
+ "type": "string",
84
+ "note": "hint text under the field"
85
+ },
86
+ "infoTooltip": {
87
+ "type": "string",
88
+ "note": "(i) icon by the label with hover help (HTML allowed)"
89
+ },
90
+ "type": {
91
+ "type": "string",
92
+ "note": "control type for the built-in MInput (text/number/textarea/...)"
93
+ },
94
+ "inputType": {
95
+ "type": "string",
96
+ "note": "overrides type for the built-in MInput"
97
+ },
98
+ "validationLabel": {
99
+ "type": "string"
100
+ },
101
+ "vid": {
102
+ "type": "string"
103
+ },
104
+ "mode": {
105
+ "type": "string",
106
+ "default": "eager"
107
+ },
108
+ "immediate": {
109
+ "type": "boolean",
110
+ "default": false,
111
+ "note": "validate on mount (red border; message still pristine-gated, F2)"
112
+ },
113
+ "hideErrorMessage": {
114
+ "type": "boolean",
115
+ "default": false
116
+ },
117
+ "labelCol": {
118
+ "type": "object",
119
+ "default": "{ xxl:2, xl:3, lg:4 }",
120
+ "note": "responsive label width (horizontal layout)"
121
+ },
122
+ "wrapperCol": {
123
+ "type": "object",
124
+ "default": "{ xxl:10, xl:9, lg:8 }",
125
+ "note": "responsive control width"
126
+ }
127
+ },
128
+ "events": [
129
+ "update (model)",
130
+ "blur"
131
+ ],
132
+ "slots": [
133
+ "default (the control, gets slotData)",
134
+ "before-input",
135
+ "input-children",
136
+ "passthrough scoped slots -> inner MInput"
137
+ ],
138
+ "methods": [
139
+ "validate()",
140
+ "setValue(v)",
141
+ "addError(err)",
142
+ "focus()"
143
+ ],
144
+ "anatomy": [
145
+ "label (+ required asterisk + optional info tooltip)",
146
+ "control (built-in MInput or slot)",
147
+ "help text OR error message (red when invalid)"
148
+ ],
149
+ "behaviors": {
150
+ "required": "asterisk shown when rules include 'required' (not required_if)",
151
+ "validation": "eager mode validates on interaction; error => red border + inline errors[0]; message is pristine-gated (shows after interaction, border shows immediately)",
152
+ "control": "no slot => built-in MInput (routed by type); slot => any control with label+validation",
153
+ "programmatic": "validate()/addError()/setValue()/focus() via ref"
154
+ },
155
+ "tokensUsed": [
156
+ "--field-border-color",
157
+ "--text-color-common-secondary",
158
+ "--secondary-red"
159
+ ],
160
+ "accessibility": {
161
+ "label": "associated with the control via MFormItem",
162
+ "required": "asterisk is visual; the rule/error conveys requirement to AT",
163
+ "focus": "inner controls have no visible ring (SF-001)",
164
+ "errors": "text messages (not color-only)"
165
+ },
166
+ "decisionFlow": [
167
+ "Building a form field (label + control + validation)? -> FlotoFormItem (always).",
168
+ "Plain text/number/textarea control? -> omit the slot, set type (built-in MInput).",
169
+ "Select / Radio / Checkbox / picker / tag input? -> put it in the default slot.",
170
+ "Needs validation? -> set rules (required|email|max:255 ...); required asterisk is automatic.",
171
+ "Need a persistent hint? -> help. Longer explanation? -> info-tooltip."
172
+ ],
173
+ "usageRules": {
174
+ "field(default)": {
175
+ "useWhen": "any labelled form field; omit slot for a built-in MInput",
176
+ "example": "Monitor name text field"
177
+ },
178
+ "required": {
179
+ "useWhen": "the field is mandatory",
180
+ "must": "put 'required' in rules (asterisk derives from it) — there is no required prop (F1)"
181
+ },
182
+ "custom-control": {
183
+ "useWhen": "the control is not a plain input (Select/Radio/Checkbox/picker/LooseTags)",
184
+ "example": "Severity as a segmented MRadioGroup in the slot"
185
+ },
186
+ "help": {
187
+ "useWhen": "a short persistent hint under the field",
188
+ "example": "In seconds. Lower values increase load."
189
+ },
190
+ "info-tooltip": {
191
+ "useWhen": "a longer explanation behind an (i) icon (MTooltip/VTippy, hover)",
192
+ "note": "needs vue-tippy VTippy registered (done in SB preview)"
193
+ },
194
+ "validation": {
195
+ "useWhen": "the value must be valid",
196
+ "note": "rules from src/validations.js; error = red border + message (pristine-gated)"
197
+ },
198
+ "layout": {
199
+ "useWhen": "vertical (label on top) for narrow/focused forms — drawers, modals, integration setup (Slack/Jira/ServiceNow), pickers; horizontal (label beside) for dense settings pages — Mail Server, Proxy, SNMP Trap, RADIUS, 2FA, My Profile",
200
+ "note": "set on the parent FlotoForm/MForm layout; drawers/modals -> vertical, full settings pages -> horizontal"
201
+ }
202
+ },
203
+ "notCovered": {
204
+ "sizes": "none — fields are one height",
205
+ "is-view": "lives on the inner controls, not FlotoFormItem",
206
+ "repeatable": "multiple-form-items is a separate related component"
207
+ },
208
+ "do": [
209
+ "Wrap every form control in FlotoFormItem for consistent label + validation + error.",
210
+ "Put validation in rules; add reusable rules in src/validations.js.",
211
+ "Use the default slot for non-text controls; help for hints, info-tooltip for longer guidance."
212
+ ],
213
+ "dont": [
214
+ "Don't pass a 'required' attribute — put required in rules (F1).",
215
+ "Don't hand-roll labels/validation around a bare input.",
216
+ "Don't rely on @input — v-model uses update."
217
+ ],
218
+ "whenToUse": "Every labelled, validated field in a form.",
219
+ "insteadOf": [
220
+ "raw a-form-item",
221
+ "a bare input with a hand-made label + validation"
222
+ ],
223
+ "usage": {
224
+ "total": 1783,
225
+ "label": 611,
226
+ "rules": 272,
227
+ "id": 52
228
+ },
229
+ "knownIssues": [
230
+ "F1 (low): required is derived from rules (regex for 'required'); there is no required prop — passing required does nothing. A convenience prop could help.",
231
+ "F2 (low): error message is pristine-gated — with immediate the red border shows but the message only appears after interaction (expected vee-validate behavior).",
232
+ "F3 (high, a11y): inner controls have no visible focus ring (SF-001)."
233
+ ],
234
+ "related": [
235
+ "MInput",
236
+ "MRadioGroup",
237
+ "MCheckbox",
238
+ "MSwitch",
239
+ "FlotoDropdownPicker",
240
+ "LooseTags",
241
+ "FlotoForm",
242
+ "MValidationObserver"
243
+ ],
244
+ "changelog": [
245
+ "2026-06-07: added (decision-grade) — the Form Field molecule (1783x). vee-validate provider -> MFormItem; required derived from rules; built-in MInput vs slot control; help + info-tooltip; validate/setValue/addError/focus. SB preview registers MValidationProvider/Observer + src/validations + FlotoFormItem. Verified live email error + red border. F1-F3."
246
+ ],
247
+ "storybook": "Molecules/FormItem",
248
+ "figma": {
249
+ "status": "todo",
250
+ "component": "Form Field"
251
+ },
252
+ "apis": {
253
+ "FlotoForm": {
254
+ "source": "src/components/_base-form.vue",
255
+ "what": "the form WRAPPER (MValidationObserver + MForm). Wrap FlotoFormItems in it.",
256
+ "props": {
257
+ "showNotification": "Boolean (default false) — toast on failed validate"
258
+ },
259
+ "events": {
260
+ "submit": "emitted only after validation passes",
261
+ "reset": "on reset"
262
+ },
263
+ "methods": {
264
+ "validate()": "Promise<true|reject> — call via ref before manual submit",
265
+ "resetValidation()": "clear errors"
266
+ },
267
+ "slots": "pass-through; default/named slots receive { validate, submit, reset }",
268
+ "usage": "<FlotoForm @submit=\"save\"><MRow><MCol :size=\"6\"><FlotoFormItem .../></MCol></MRow><template v-slot:submit=\"{ submit }\">...</template></FlotoForm>"
269
+ }
270
+ },
271
+ "$tokensNote": "Label = --text-color-common-secondary; error state (.has-error) = --secondary-red (#ec5b5b).",
272
+ "a11y": {
273
+ "summary": "Label associated via MFormItem (click focuses the control). Errors are text (not colour-only), pristine-gated; the required asterisk is visual — keep the required rule.",
274
+ "issues": [
275
+ "Wrapped controls have no visible focus ring (SF-001).",
276
+ "info-tooltip content sits behind a hover trigger."
277
+ ],
278
+ "doc": "Molecules/FormItem/Accessibility",
279
+ "$note": "Catalogue-wide gap SF-001 = no visible :focus-visible ring; tracked in findings/."
280
+ }
281
+ }
@@ -0,0 +1,277 @@
1
+ {
2
+ "name": "input",
3
+ "component": "MInput",
4
+ "display": "Input",
5
+ "tier": "atom",
6
+ "category": "form-control",
7
+ "source": "mkit",
8
+ "sourceFile": "ui/components/Input/Input.vue",
9
+ "status": "core",
10
+ "maturity": "stable",
11
+ "summary": "Text input. A type-router (text/password/number/search/textarea/datetime). v-model is value+update. Almost always wrapped by FlotoFormItem for label+validation.",
12
+ "variants": [
13
+ {
14
+ "name": "text",
15
+ "what": "single-line (default)",
16
+ "usage": ""
17
+ },
18
+ {
19
+ "name": "password",
20
+ "what": "masked",
21
+ "usage": ""
22
+ },
23
+ {
24
+ "name": "number",
25
+ "what": "MInputNumber steppers",
26
+ "usage": "70×"
27
+ },
28
+ {
29
+ "name": "search",
30
+ "what": "MInputSearch + enter",
31
+ "usage": ""
32
+ },
33
+ {
34
+ "name": "textarea",
35
+ "what": "multi-line",
36
+ "usage": ""
37
+ },
38
+ {
39
+ "name": "material-input",
40
+ "what": "bottom-border underline",
41
+ "usage": "62×"
42
+ },
43
+ {
44
+ "name": "no-border-input",
45
+ "what": "borderless inline edit",
46
+ "usage": "3×"
47
+ }
48
+ ],
49
+ "sizes": [],
50
+ "states": [
51
+ {
52
+ "name": "default",
53
+ "what": "resting"
54
+ },
55
+ {
56
+ "name": "hover",
57
+ "what": "border lightens"
58
+ },
59
+ {
60
+ "name": "focus",
61
+ "what": "border → primary"
62
+ },
63
+ {
64
+ "name": "disabled",
65
+ "what": "muted, no caret"
66
+ },
67
+ {
68
+ "name": "read-only",
69
+ "what": "selectable not editable"
70
+ },
71
+ {
72
+ "name": "error",
73
+ "what": "red border (validation)"
74
+ }
75
+ ],
76
+ "family": "Form Controls",
77
+ "model": {
78
+ "prop": "value",
79
+ "event": "update",
80
+ "note": "event is 'update', not 'input' (F1)"
81
+ },
82
+ "props": {
83
+ "type": {
84
+ "type": "string",
85
+ "default": "text",
86
+ "enum": [
87
+ "text",
88
+ "password",
89
+ "number",
90
+ "search",
91
+ "textarea",
92
+ "datetime"
93
+ ],
94
+ "note": "routes to a-input / a-input[type=password] / MInputNumber / MInputSearch / a-textarea / date-picker"
95
+ },
96
+ "value": {
97
+ "type": "any",
98
+ "note": "v-model"
99
+ },
100
+ "defaultValue": {
101
+ "type": "string"
102
+ },
103
+ "allowClear": {
104
+ "type": "boolean",
105
+ "note": "shows an x to clear when there's a value (218x incl. pickers)"
106
+ },
107
+ "maxlength": {
108
+ "type": "number",
109
+ "note": "native char cap (7x); no built-in counter — show-count NOT supported by Ant 1.4 kit"
110
+ },
111
+ "(a-input attrs)": {
112
+ "type": "passthrough",
113
+ "note": "disabled, readOnly, maxLength via $attrs. size (small/default/large) exists but EFFECTIVELY UNUSED — one height (32px; search 36px)"
114
+ }
115
+ },
116
+ "events": [
117
+ "update (model)",
118
+ "search",
119
+ "enterKey"
120
+ ],
121
+ "slots": [
122
+ "prefix",
123
+ "suffix",
124
+ "addonBefore",
125
+ "addonAfter",
126
+ "enterButton (search)"
127
+ ],
128
+ "typeRouting": {
129
+ "text": "a-input",
130
+ "password": "a-input[type=password] (no show/hide toggle, F2)",
131
+ "number": "MInputNumber (steppers)",
132
+ "search": "MInputSearch (enter button, emits search)",
133
+ "textarea": "a-textarea",
134
+ "datetime": "date picker (separate concern)"
135
+ },
136
+ "styleClasses": {
137
+ "material-input": {
138
+ "usage": 62,
139
+ "note": "bottom-border-only Material underline (border 0/0/1/0)"
140
+ },
141
+ "full-border-text-area": 17,
142
+ "full-bordered-addon-input": 6,
143
+ "no-border-input": 3,
144
+ "auto-height-input": 2,
145
+ "text-lg-input": 2
146
+ },
147
+ "anatomy": [
148
+ "optional prefix/suffix (inside field)",
149
+ "input control",
150
+ "optional addonBefore/addonAfter segments"
151
+ ],
152
+ "tokensUsed": [
153
+ "--field-border-color",
154
+ "--input-text-color",
155
+ "--text-input-bg",
156
+ "--input-placeholder-color",
157
+ "--input-suffix-bg",
158
+ "--input-suffix-text",
159
+ "--input-addon-color"
160
+ ],
161
+ "accessibility": {
162
+ "semantics": "native input/textarea; label via FlotoFormItem or aria-label",
163
+ "focus": "no visible ring (SF-001)",
164
+ "placeholder": "~50% color (--input-placeholder-color) — verify contrast; not a label substitute"
165
+ },
166
+ "decisionFlow": [
167
+ "Multi-line text? -> type=textarea (or FlotoFormItem type=textarea).",
168
+ "Numeric value (with steppers)? -> type=number (MInputNumber).",
169
+ "Secret/password? -> type=password (PasswordInput for show/hide).",
170
+ "Search box (enter/clear, emits search)? -> type=search (MInputSearch).",
171
+ "A date/time? -> date picker, not a text input.",
172
+ "Otherwise single-line text -> type=text (default).",
173
+ "[Field] In a form with a label/validation? -> wrap in FlotoFormItem (the norm).",
174
+ "[Style] Dense/inline underline look? -> .material-input. Unit/protocol attached? -> addonBefore/addonAfter. Context icon? -> prefix/suffix."
175
+ ],
176
+ "usageRules": {
177
+ "text": {
178
+ "useWhen": "single-line free text (name, label, value)",
179
+ "example": "monitor name"
180
+ },
181
+ "password": {
182
+ "useWhen": "secret entry",
183
+ "dontUse": "when a show/hide toggle is needed (use PasswordInput) — type=password has none (F2)"
184
+ },
185
+ "number": {
186
+ "useWhen": "numeric input with steppers",
187
+ "example": "port, threshold, interval"
188
+ },
189
+ "search": {
190
+ "useWhen": "a search box (Enter emits search, has an enter button)",
191
+ "example": "filter/search a list"
192
+ },
193
+ "textarea": {
194
+ "useWhen": "multi-line text",
195
+ "note": "in forms use FlotoFormItem type=textarea",
196
+ "example": "description, notes"
197
+ },
198
+ "prefix/suffix": {
199
+ "useWhen": "a context icon inside the field (search glass, unit)",
200
+ "example": "search prefix, $ suffix"
201
+ },
202
+ "addonBefore/addonAfter": {
203
+ "useWhen": "attached fixed segments (protocol/unit)",
204
+ "example": "https:// … .com"
205
+ },
206
+ "material-input": {
207
+ "useWhen": "a dense/inline Material underline look (bottom border only)",
208
+ "example": "inline filters/toolbars (62x)"
209
+ },
210
+ "allow-clear": {
211
+ "useWhen": "an optional field/search where clearing to empty is valid",
212
+ "example": "filter/search inputs (x to clear)"
213
+ },
214
+ "error-state": {
215
+ "useWhen": "a field fails validation",
216
+ "note": ".has-error red border applied by FlotoFormItem; always pair with an inline message"
217
+ },
218
+ "disabled-vs-readonly": {
219
+ "useWhen": "disabled = can't interact (greyed); read-only = selectable/copyable but not editable (view mode)"
220
+ },
221
+ "FlotoFormItem": {
222
+ "useWhen": "any input in a form — adds the label + validation (the standard pattern, 1783x)"
223
+ }
224
+ },
225
+ "do": [
226
+ "Wrap inputs in FlotoFormItem for label + validation (standard form pattern).",
227
+ "Pick the type for the data; bind with v-model.",
228
+ "Use prefix/suffix for context icons; addonBefore/addonAfter for units/protocols."
229
+ ],
230
+ "dont": [
231
+ "Don't rely on @input to update the model — it's @update (F1).",
232
+ "Don't use the placeholder as the only label.",
233
+ "Don't expect a password show/hide toggle from type=password (F2)."
234
+ ],
235
+ "whenToUse": "Capturing typed input (text/number/search/multi-line) on a form or toolbar.",
236
+ "insteadOf": [
237
+ "raw a-input/a-textarea",
238
+ "native input"
239
+ ],
240
+ "usage": {
241
+ "MInput": 293,
242
+ "FlotoFormItem": 1783,
243
+ "material-input": 62,
244
+ "full-border-text-area": 17
245
+ },
246
+ "knownIssues": [
247
+ "F1 (low): v-model event is 'update' not 'input' — @input won't update the model; use @update or v-model. Align to input/update:value in a future API pass.",
248
+ "F2 (low): type=password has no show/hide toggle (falls to a-input[type=password]); a separate PasswordInput exists. Route to a-input-password or point to PasswordInput.",
249
+ "F3 (high, a11y): inputs strip the focus outline — no visible focus ring (SF-001)."
250
+ ],
251
+ "related": [
252
+ "FlotoFormItem",
253
+ "MInputNumber",
254
+ "MInputSearch",
255
+ "MInputGroup",
256
+ "LooseTags",
257
+ "date picker"
258
+ ],
259
+ "changelog": [
260
+ "2026-06-07: added (decision-grade from the start). 293x; type-router; v-model value/update; prefix/suffix/addon slots; .material-input 62x (bottom-border) verified. F1-F3. FlotoFormItem (1783x) noted as the field wrapper (own entry next)."
261
+ ],
262
+ "storybook": "Atoms/Input",
263
+ "figma": {
264
+ "status": "todo",
265
+ "component": "Input"
266
+ },
267
+ "a11y": {
268
+ "summary": "Native <input>/<textarea>, correct roles + text-editing keys. Always label (FlotoFormItem or aria-label). type=search adds Enter→search.",
269
+ "issues": [
270
+ "No visible focus ring (SF-001).",
271
+ "Placeholder contrast ~50% — verify.",
272
+ "type=password has no show/hide (F2) — use PasswordInput."
273
+ ],
274
+ "doc": "Atoms/Input/Accessibility",
275
+ "$note": "Catalogue-wide gap SF-001 = no visible :focus-visible ring; tracked in findings/."
276
+ }
277
+ }