@mindfiredigital/ignix-lite-engine 1.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 (91) hide show
  1. package/.turbo/turbo-build.log +22 -0
  2. package/CHANGELOG.md +7 -0
  3. package/LICENSE +21 -0
  4. package/README.md +283 -0
  5. package/dist/index.d.ts +171 -0
  6. package/dist/index.js +2540 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/manifests/accordion.json +61 -0
  9. package/dist/manifests/alert.json +69 -0
  10. package/dist/manifests/avatar.json +75 -0
  11. package/dist/manifests/badge.json +74 -0
  12. package/dist/manifests/breadcrumb.json +87 -0
  13. package/dist/manifests/button.json +85 -0
  14. package/dist/manifests/card.json +91 -0
  15. package/dist/manifests/checkbox.json +122 -0
  16. package/dist/manifests/codeblock.json +63 -0
  17. package/dist/manifests/combobox.json +33 -0
  18. package/dist/manifests/dialog.json +64 -0
  19. package/dist/manifests/divider.json +47 -0
  20. package/dist/manifests/dropdown.json +105 -0
  21. package/dist/manifests/form.json +81 -0
  22. package/dist/manifests/grid.json +143 -0
  23. package/dist/manifests/input.json +99 -0
  24. package/dist/manifests/meter.json +103 -0
  25. package/dist/manifests/navigation.json +70 -0
  26. package/dist/manifests/progress.json +88 -0
  27. package/dist/manifests/radio.json +121 -0
  28. package/dist/manifests/select.json +109 -0
  29. package/dist/manifests/skeleton.json +101 -0
  30. package/dist/manifests/tab.json +88 -0
  31. package/dist/manifests/table.json +92 -0
  32. package/dist/manifests/textarea.json +117 -0
  33. package/dist/manifests/toast.json +157 -0
  34. package/dist/manifests/tooltip.json +115 -0
  35. package/dist/vector-index.json +14015 -0
  36. package/package.json +33 -0
  37. package/src/global.d.ts +3 -0
  38. package/src/index.ts +14 -0
  39. package/src/manifests/accordion.json +61 -0
  40. package/src/manifests/alert.json +69 -0
  41. package/src/manifests/avatar.json +75 -0
  42. package/src/manifests/badge.json +74 -0
  43. package/src/manifests/breadcrumb.json +87 -0
  44. package/src/manifests/button.json +85 -0
  45. package/src/manifests/card.json +91 -0
  46. package/src/manifests/checkbox.json +122 -0
  47. package/src/manifests/codeblock.json +63 -0
  48. package/src/manifests/combobox.json +33 -0
  49. package/src/manifests/dialog.json +64 -0
  50. package/src/manifests/divider.json +47 -0
  51. package/src/manifests/dropdown.json +105 -0
  52. package/src/manifests/form.json +81 -0
  53. package/src/manifests/grid.json +143 -0
  54. package/src/manifests/index.ts +49 -0
  55. package/src/manifests/input.json +99 -0
  56. package/src/manifests/meter.json +103 -0
  57. package/src/manifests/navigation.json +70 -0
  58. package/src/manifests/progress.json +88 -0
  59. package/src/manifests/radio.json +121 -0
  60. package/src/manifests/select.json +109 -0
  61. package/src/manifests/skeleton.json +101 -0
  62. package/src/manifests/tab.json +88 -0
  63. package/src/manifests/table.json +92 -0
  64. package/src/manifests/textarea.json +117 -0
  65. package/src/manifests/toast.json +157 -0
  66. package/src/manifests/tooltip.json +115 -0
  67. package/src/tools/build-index.ts +43 -0
  68. package/src/tools/check-a11y.ts +96 -0
  69. package/src/tools/embedder.ts +18 -0
  70. package/src/tools/generate-theme.ts +42 -0
  71. package/src/tools/get-emmet.ts +64 -0
  72. package/src/tools/get-manifests.ts +55 -0
  73. package/src/tools/handoff.ts +302 -0
  74. package/src/tools/intent-engine.ts +215 -0
  75. package/src/tools/list-components.ts +20 -0
  76. package/src/tools/preview.ts +186 -0
  77. package/src/tools/search-index.ts +82 -0
  78. package/src/tools/theme-palette.ts +65 -0
  79. package/src/tools/theme-tokens.ts +176 -0
  80. package/src/tools/token-counter.ts +59 -0
  81. package/src/tools/validator.ts +353 -0
  82. package/src/types.ts +63 -0
  83. package/src/utils/a11y-rules.ts +873 -0
  84. package/src/utils/a11y-types.ts +15 -0
  85. package/src/utils/cosine.ts +15 -0
  86. package/src/utils/emmet-helpers.ts +283 -0
  87. package/src/utils/intent-helpers.ts +66 -0
  88. package/src/utils/intent-parser.ts +175 -0
  89. package/src/utils/tokenizer.ts +7 -0
  90. package/tsconfig.json +17 -0
  91. package/tsup.config.ts +10 -0
@@ -0,0 +1,121 @@
1
+ {
2
+ "component": "radio",
3
+ "version": "2.0",
4
+ "description": "Radio input for single selection. Must be wrapped inside a label element.",
5
+
6
+ "element": "input",
7
+
8
+ "emmet": "label[data-intent=? data-size=?]>(input[type=radio]+{Label})",
9
+
10
+ "props": {
11
+ "type": {
12
+ "type": "enum",
13
+ "values": ["radio"],
14
+ "default": "radio",
15
+ "native": true,
16
+ "agent_hint": "Always use type=radio"
17
+ },
18
+
19
+ "checked": {
20
+ "type": "boolean",
21
+ "native": true,
22
+ "agent_hint": "Marks radio as selected"
23
+ },
24
+
25
+ "disabled": {
26
+ "type": "boolean",
27
+ "native": true,
28
+ "agent_hint": "Disables radio"
29
+ },
30
+
31
+ "required": {
32
+ "type": "boolean",
33
+ "native": true,
34
+ "agent_hint": "Marks radio as required"
35
+ },
36
+
37
+ "name": {
38
+ "type": "string",
39
+ "native": true,
40
+ "agent_hint": "Used for grouping radios"
41
+ },
42
+
43
+ "value": {
44
+ "type": "string",
45
+ "native": true,
46
+ "agent_hint": "Submitted value in forms"
47
+ },
48
+
49
+ "data-intent": {
50
+ "type": "enum",
51
+ "values": ["success", "danger", "warning", "neutral"],
52
+ "default": "neutral",
53
+ "native": false,
54
+ "agent_hint": "Controls radio color"
55
+ },
56
+
57
+ "data-size": {
58
+ "type": "enum",
59
+ "values": ["sm", "md", "lg"],
60
+ "default": "md",
61
+ "native": false,
62
+ "agent_hint": "Controls radio size"
63
+ }
64
+ },
65
+
66
+ "states": ["checked", "disabled"],
67
+
68
+ "required_props": ["type"],
69
+
70
+ "required_wrapper": "label",
71
+
72
+ "forbidden_props": ["class", "variant", "color", "style", "onclick"],
73
+
74
+ "do": [
75
+ "Wrap radio inside label",
76
+ "Use checked for default state",
77
+ "Use same name for grouping radios",
78
+ "Use data-intent for styling",
79
+ "Use data-size for scaling"
80
+ ],
81
+
82
+ "dont": [
83
+ "Do not use class attribute",
84
+ "Do not use variant or color props",
85
+ "Do not use inline JS handlers",
86
+ "Do not place radio outside label"
87
+ ],
88
+
89
+ "examples": [
90
+ {
91
+ "label": "Basic radio",
92
+ "emmet": "label>(input[type=radio]+{JavaScript})",
93
+ "html": "<label><input type=\"radio\" />JavaScript</label>"
94
+ },
95
+ {
96
+ "label": "Checked radio",
97
+ "emmet": "label>(input[type=radio checked]+{Selected})",
98
+ "html": "<label><input type=\"radio\" checked />Selected</label>"
99
+ },
100
+ {
101
+ "label": "Disabled radio",
102
+ "emmet": "label>(input[type=radio disabled]+{Disabled})",
103
+ "html": "<label><input type=\"radio\" disabled />Disabled</label>"
104
+ },
105
+ {
106
+ "label": "Intent variant",
107
+ "emmet": "label[data-intent=success]>(input[type=radio checked]+{Success})",
108
+ "html": "<label data-intent=\"success\"><input type=\"radio\" checked />Success</label>"
109
+ },
110
+ {
111
+ "label": "Size variant",
112
+ "emmet": "label[data-size=lg]>(input[type=radio]+{Large})",
113
+ "html": "<label data-size=\"lg\"><input type=\"radio\" />Large</label>"
114
+ },
115
+ {
116
+ "label": "Radio group",
117
+ "emmet": "label>(input[type=radio name=group value=js]+{JavaScript})",
118
+ "html": "<label><input type=\"radio\" name=\"group\" value=\"js\" />JavaScript</label>"
119
+ }
120
+ ]
121
+ }
@@ -0,0 +1,109 @@
1
+ {
2
+ "component": "select",
3
+ "version": "2.0",
4
+ "description": "Provides accessible dropdown selection using the native HTML select element with semantic intent variants.",
5
+
6
+ "element": "select",
7
+
8
+ "emmet": "select[data-intent=primary]>option{Option}",
9
+
10
+ "props": {
11
+ "data-intent": {
12
+ "type": "enum",
13
+ "values": ["primary", "danger", "warning", "success", "neutral"],
14
+ "default": "neutral",
15
+ "native": false,
16
+ "agent_hint": "Use danger for destructive selections, success for positive states, primary for main forms."
17
+ },
18
+
19
+ "disabled": {
20
+ "type": "boolean",
21
+ "native": true,
22
+ "agent_hint": "Disable user interaction."
23
+ },
24
+
25
+ "required": {
26
+ "type": "boolean",
27
+ "native": true,
28
+ "agent_hint": "Marks field as required."
29
+ },
30
+
31
+ "aria-invalid": {
32
+ "type": "boolean",
33
+ "native": true,
34
+ "agent_hint": "Use for validation error state."
35
+ },
36
+
37
+ "multiple": {
38
+ "type": "boolean",
39
+ "native": true,
40
+ "agent_hint": "Enable multiple selection."
41
+ },
42
+
43
+ "name": {
44
+ "type": "string",
45
+ "native": true
46
+ }
47
+ },
48
+
49
+ "states": ["disabled", "invalid", "required", "multiple"],
50
+
51
+ "forbidden_props": [
52
+ "variant",
53
+ "color",
54
+ "appearance",
55
+ "colorScheme",
56
+ "size",
57
+ "isDisabled",
58
+ "class"
59
+ ],
60
+
61
+ "required_props": [],
62
+ "required_slots": [],
63
+
64
+ "do": [
65
+ "Use data-intent='primary' for default form flows",
66
+ "Use aria-invalid='true' for validation errors",
67
+ "Use disabled for unavailable selections",
68
+ "Use multiple for multi-select lists"
69
+ ],
70
+
71
+ "dont": [
72
+ "Do not use class attribute",
73
+ "Do not use variant props",
74
+ "Do not use color props",
75
+ "Do not use isDisabled"
76
+ ],
77
+
78
+ "examples": [
79
+ {
80
+ "label": "Default select",
81
+ "emmet": "select[data-intent=neutral]>option{India}",
82
+ "html": "<select data-intent=\"neutral\"><option>India</option></select>"
83
+ },
84
+
85
+ {
86
+ "label": "Primary select",
87
+ "emmet": "select[data-intent=primary]>option{India}",
88
+ "html": "<select data-intent=\"primary\"><option>India</option></select>"
89
+ },
90
+
91
+ {
92
+ "label": "Disabled select",
93
+ "emmet": "select[data-intent=neutral disabled]>option{Disabled}",
94
+ "html": "<select data-intent=\"neutral\" disabled><option>Disabled</option></select>"
95
+ },
96
+
97
+ {
98
+ "label": "Invalid select",
99
+ "emmet": "select[data-intent=neutral aria-invalid=true]>option{Error}",
100
+ "html": "<select data-intent=\"neutral\" aria-invalid=\"true\"><option>Error</option></select>"
101
+ },
102
+
103
+ {
104
+ "label": "Multiple select",
105
+ "emmet": "select[data-intent=neutral multiple]>option{India}+option{USA}",
106
+ "html": "<select data-intent=\"neutral\" multiple><option>India</option><option>USA</option></select>"
107
+ }
108
+ ]
109
+ }
@@ -0,0 +1,101 @@
1
+ {
2
+ "component": "skeleton",
3
+ "version": "2.0",
4
+ "description": "Displays loading placeholders using native span elements with semantic loading states.",
5
+
6
+ "element": "span",
7
+
8
+ "emmet": "span[aria-busy=true data-shape=text]",
9
+
10
+ "props": {
11
+ "data-shape": {
12
+ "type": "enum",
13
+ "values": ["text", "rect", "circle"],
14
+ "default": "text",
15
+ "native": false,
16
+ "agent_hint": "Use text for content placeholders, rect for cards/banners, circle for avatars."
17
+ },
18
+
19
+ "aria-busy": {
20
+ "type": "boolean",
21
+ "native": true,
22
+ "agent_hint": "Required loading state indicator."
23
+ },
24
+
25
+ "role": {
26
+ "type": "string",
27
+ "default": "status",
28
+ "native": true,
29
+ "agent_hint": "Use status role for accessibility."
30
+ },
31
+
32
+ "aria-label": {
33
+ "type": "string",
34
+ "native": true,
35
+ "agent_hint": "Provide accessible loading description."
36
+ },
37
+
38
+ "data-lines": {
39
+ "type": "number",
40
+ "native": false,
41
+ "agent_hint": "Use for multiple text line placeholders."
42
+ }
43
+ },
44
+
45
+ "states": ["loading", "text", "rect", "circle", "multiple-lines"],
46
+
47
+ "forbidden_props": [
48
+ "variant",
49
+ "intent",
50
+ "color",
51
+ "appearance",
52
+ "size",
53
+ "isLoading",
54
+ "class"
55
+ ],
56
+
57
+ "required_props": ["aria-busy"],
58
+
59
+ "required_slots": [],
60
+
61
+ "do": [
62
+ "Use aria-busy='true' during loading",
63
+ "Use data-shape='text' for text placeholders",
64
+ "Use data-shape='rect' for cards and banners",
65
+ "Use data-shape='circle' for avatars",
66
+ "Provide aria-label for accessibility"
67
+ ],
68
+
69
+ "dont": [
70
+ "Do not use class attribute",
71
+ "Do not use variant props",
72
+ "Do not use color props",
73
+ "Do not use skeleton after content loads"
74
+ ],
75
+
76
+ "examples": [
77
+ {
78
+ "label": "Text skeleton",
79
+ "emmet": "span[role=status aria-busy=true aria-label='loading text' data-shape=text]",
80
+ "html": "<span role=\"status\" aria-busy=\"true\" aria-label=\"loading text\" data-shape=\"text\"></span>"
81
+ },
82
+
83
+ {
84
+ "label": "Rectangle skeleton",
85
+ "emmet": "span[role=status aria-busy=true aria-label='loading rectangle' data-shape=rect]",
86
+ "html": "<span role=\"status\" aria-busy=\"true\" aria-label=\"loading rectangle\" data-shape=\"rect\"></span>"
87
+ },
88
+
89
+ {
90
+ "label": "Circle skeleton",
91
+ "emmet": "span[role=status aria-busy=true aria-label='loading avatar' data-shape=circle]",
92
+ "html": "<span role=\"status\" aria-busy=\"true\" aria-label=\"loading avatar\" data-shape=\"circle\"></span>"
93
+ },
94
+
95
+ {
96
+ "label": "Multiple lines",
97
+ "emmet": "span[role=status aria-busy=true data-shape=text data-lines=3]",
98
+ "html": "<span role=\"status\" aria-busy=\"true\" data-shape=\"text\" data-lines=\"3\"></span>"
99
+ }
100
+ ]
101
+ }
@@ -0,0 +1,88 @@
1
+ {
2
+ "component": "tabs",
3
+ "version": "2.0",
4
+ "description": "Provides semantic tab navigation using the ix-tabs custom element with keyboard accessibility and visual variants.",
5
+ "element": "ix-tabs",
6
+ "emmet": "ix-tabs>button[slot=tab]*3",
7
+ "props": {
8
+ "data-variant": {
9
+ "type": "enum",
10
+ "values": ["default", "underline", "pill", "gradient"],
11
+ "default": "default",
12
+ "native": false,
13
+ "agent_hint": "Controls tab appearance."
14
+ },
15
+ "slot": {
16
+ "type": "enum",
17
+ "values": ["tab", "panel"],
18
+ "native": true,
19
+ "agent_hint": "tab defines trigger buttons, panel defines tab content."
20
+ },
21
+ "aria-selected": {
22
+ "type": "boolean",
23
+ "native": true,
24
+ "agent_hint": "Marks active tab."
25
+ },
26
+ "role": {
27
+ "type": "string",
28
+ "native": true,
29
+ "agent_hint": "Automatically applied for accessibility."
30
+ },
31
+ "hidden": {
32
+ "type": "boolean",
33
+ "native": true,
34
+ "agent_hint": "Used for inactive panels."
35
+ }
36
+ },
37
+ "states": ["selected", "focused", "keyboard-navigation"],
38
+ "forbidden_props": [
39
+ "variant",
40
+ "color",
41
+ "size",
42
+ "appearance",
43
+ "class",
44
+ "activeTab"
45
+ ],
46
+ "required_props": [],
47
+ "required_slots": ["tab"],
48
+ "do": [
49
+ "Use slot='tab' for tab triggers",
50
+ "Use slot='panel' for content sections",
51
+ "Use data-variant for visual styles",
52
+ "Use aria-selected for active state",
53
+ "Keep related panels inside ix-tabs"
54
+ ],
55
+ "dont": [
56
+ "Do not use class styling",
57
+ "Do not use variant prop",
58
+ "Do not use custom active props",
59
+ "Do not omit tab slot"
60
+ ],
61
+ "examples": [
62
+ {
63
+ "label": "Default tabs",
64
+ "emmet": "ix-tabs>button[slot=tab]*3",
65
+ "html": "<ix-tabs><button slot=\"tab\">Overview</button><button slot=\"tab\">Analytics</button><button slot=\"tab\">Settings</button></ix-tabs>"
66
+ },
67
+ {
68
+ "label": "Underline tabs",
69
+ "emmet": "ix-tabs[data-variant=underline]",
70
+ "html": "<ix-tabs data-variant=\"underline\"><button slot=\"tab\">Profile</button><button slot=\"tab\">Activity</button><button slot=\"tab\">Security</button></ix-tabs>"
71
+ },
72
+ {
73
+ "label": "Pill tabs",
74
+ "emmet": "ix-tabs[data-variant=pill]",
75
+ "html": "<ix-tabs data-variant=\"pill\"><button slot=\"tab\">Files</button><button slot=\"tab\">Shared</button><button slot=\"tab\">Starred</button></ix-tabs>"
76
+ },
77
+ {
78
+ "label": "Gradient tabs",
79
+ "emmet": "ix-tabs[data-variant=gradient]",
80
+ "html": "<ix-tabs data-variant=\"gradient\"><button slot=\"tab\">Home</button><button slot=\"tab\">Dashboard</button><button slot=\"tab\">Reports</button></ix-tabs>"
81
+ },
82
+ {
83
+ "label": "Tabs with panels",
84
+ "emmet": "ix-tabs>button[slot=tab]+section[slot=panel]",
85
+ "html": "<ix-tabs><button slot=\"tab\">Account</button><button slot=\"tab\">Billing</button><section slot=\"panel\">Account content</section><section slot=\"panel\">Billing content</section></ix-tabs>"
86
+ }
87
+ ]
88
+ }
@@ -0,0 +1,92 @@
1
+ {
2
+ "component": "table",
3
+ "version": "2.0",
4
+ "description": "Provides semantic tables with optional sortable columns using the ix-table custom element extension.",
5
+
6
+ "element": "table",
7
+
8
+ "extends": "ix-table",
9
+
10
+ "emmet": "table[is=ix-table]>thead>tr+tbody",
11
+
12
+ "props": {
13
+ "data-sortable": {
14
+ "type": "boolean",
15
+ "default": false,
16
+ "native": false,
17
+ "agent_hint": "Enables sorting on table header."
18
+ },
19
+
20
+ "aria-sort": {
21
+ "type": "enum",
22
+ "values": ["ascending", "descending", "none"],
23
+ "default": "none",
24
+ "native": true,
25
+ "agent_hint": "Current sort direction."
26
+ },
27
+
28
+ "is": {
29
+ "type": "string",
30
+ "values": ["ix-table"],
31
+ "default": "ix-table",
32
+ "native": true,
33
+ "agent_hint": "Activates sortable table behavior."
34
+ }
35
+ },
36
+
37
+ "states": ["default", "ascending", "descending", "sortable"],
38
+
39
+ "forbidden_props": ["sortable", "variant", "theme", "direction", "class"],
40
+
41
+ "required_props": [],
42
+
43
+ "required_slots": [],
44
+
45
+ "methods": ["sortColumn(header)"],
46
+
47
+ "do": [
48
+ "Use is=\"ix-table\" for sorting",
49
+ "Apply data-sortable on th only",
50
+ "Keep tbody present",
51
+ "Use aria-sort state"
52
+ ],
53
+
54
+ "dont": [
55
+ "Do not add data-sortable on td",
56
+ "Do not omit tbody",
57
+ "Do not use custom sort attributes",
58
+ "Do not use class based sorting"
59
+ ],
60
+
61
+ "examples": [
62
+ {
63
+ "label": "Default table",
64
+ "emmet": "table>thead>tr+tbody",
65
+ "html": "<table><thead><tr><th>Name</th><th>Email</th></tr></thead><tbody><tr><td>John</td><td>john@example.com</td></tr></tbody></table>"
66
+ },
67
+
68
+ {
69
+ "label": "Sortable table",
70
+ "emmet": "table[is=ix-table]",
71
+ "html": "<table is=\"ix-table\"><thead><tr><th data-sortable>Name</th><th data-sortable>Age</th></tr></thead><tbody><tr><td>John</td><td>28</td></tr><tr><td>Alex</td><td>21</td></tr></tbody></table>"
72
+ },
73
+
74
+ {
75
+ "label": "Ascending state",
76
+ "emmet": "th[data-sortable]",
77
+ "html": "<th data-sortable aria-sort=\"ascending\">Name</th>"
78
+ },
79
+
80
+ {
81
+ "label": "Descending state",
82
+ "emmet": "th[data-sortable]",
83
+ "html": "<th data-sortable aria-sort=\"descending\">Age</th>"
84
+ },
85
+
86
+ {
87
+ "label": "Status table",
88
+ "emmet": "table[is=ix-table]",
89
+ "html": "<table is=\"ix-table\"><thead><tr><th data-sortable>Name</th><th data-sortable>Status</th></tr></thead><tbody><tr><td>Riya</td><td><mark data-intent=\"success\">Active</mark></td></tr></tbody></table>"
90
+ }
91
+ ]
92
+ }
@@ -0,0 +1,117 @@
1
+ {
2
+ "component": "textarea",
3
+ "version": "2.0",
4
+ "description": "Provides semantic multiline text input using the native HTML textarea element with validation states and intent variants.",
5
+
6
+ "element": "textarea",
7
+
8
+ "emmet": "textarea[rows=3 placeholder=?]",
9
+
10
+ "props": {
11
+ "rows": {
12
+ "type": "number",
13
+ "default": 3,
14
+ "native": true,
15
+ "agent_hint": "Controls textarea height."
16
+ },
17
+
18
+ "placeholder": {
19
+ "type": "string",
20
+ "native": true
21
+ },
22
+
23
+ "data-intent": {
24
+ "type": "enum",
25
+ "values": ["primary", "danger", "warning", "success", "neutral"],
26
+ "default": "neutral",
27
+ "native": false,
28
+ "agent_hint": "Use primary for standard forms, danger for destructive flows, success for positive actions."
29
+ },
30
+
31
+ "disabled": {
32
+ "type": "boolean",
33
+ "native": true,
34
+ "agent_hint": "Disables interaction."
35
+ },
36
+
37
+ "required": {
38
+ "type": "boolean",
39
+ "native": true,
40
+ "agent_hint": "Marks field as mandatory."
41
+ },
42
+
43
+ "aria-invalid": {
44
+ "type": "boolean",
45
+ "native": true,
46
+ "agent_hint": "Use for validation errors."
47
+ }
48
+ },
49
+
50
+ "states": ["required", "disabled", "invalid"],
51
+
52
+ "forbidden_props": [
53
+ "variant",
54
+ "color",
55
+ "appearance",
56
+ "colorScheme",
57
+ "size",
58
+ "isDisabled",
59
+ "class"
60
+ ],
61
+
62
+ "required_props": [],
63
+ "required_slots": [],
64
+
65
+ "do": [
66
+ "Use rows to control height",
67
+ "Use aria-invalid='true' for validation errors",
68
+ "Use disabled for unavailable fields",
69
+ "Use data-intent for semantic styling",
70
+ "Use placeholder for guidance text"
71
+ ],
72
+
73
+ "dont": [
74
+ "Do not use class attribute",
75
+ "Do not use variant props",
76
+ "Do not use color props",
77
+ "Do not use isDisabled"
78
+ ],
79
+
80
+ "examples": [
81
+ {
82
+ "label": "Default textarea",
83
+ "emmet": "textarea[rows=3 placeholder='Enter message']",
84
+ "html": "<textarea rows=\"3\" placeholder=\"Enter message\"></textarea>"
85
+ },
86
+
87
+ {
88
+ "label": "Primary textarea",
89
+ "emmet": "textarea[data-intent=primary rows=3]",
90
+ "html": "<textarea rows=\"3\" data-intent=\"primary\"></textarea>"
91
+ },
92
+
93
+ {
94
+ "label": "Required textarea",
95
+ "emmet": "textarea[rows=3 required]",
96
+ "html": "<textarea rows=\"3\" required></textarea>"
97
+ },
98
+
99
+ {
100
+ "label": "Invalid textarea",
101
+ "emmet": "textarea[rows=3 aria-invalid=true]",
102
+ "html": "<textarea rows=\"3\" aria-invalid=\"true\"></textarea>"
103
+ },
104
+
105
+ {
106
+ "label": "Disabled textarea",
107
+ "emmet": "textarea[rows=3 disabled]",
108
+ "html": "<textarea rows=\"3\" disabled></textarea>"
109
+ },
110
+
111
+ {
112
+ "label": "Large textarea",
113
+ "emmet": "textarea[rows=6 placeholder='Write feedback']",
114
+ "html": "<textarea rows=\"6\" placeholder=\"Write feedback\"></textarea>"
115
+ }
116
+ ]
117
+ }