@mindfiredigital/ignix-lite-mcp 1.0.0 → 1.2.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 (96) hide show
  1. package/.turbo/turbo-build.log +17 -14
  2. package/CHANGELOG.md +7 -0
  3. package/dist/manifests/accordion.json +61 -0
  4. package/dist/manifests/alert.json +69 -0
  5. package/dist/manifests/avatar.json +75 -0
  6. package/dist/manifests/badge.json +74 -0
  7. package/dist/manifests/breadcrumb.json +87 -0
  8. package/dist/manifests/button.json +85 -0
  9. package/dist/manifests/card.json +91 -0
  10. package/dist/manifests/checkbox.json +122 -0
  11. package/dist/manifests/codeblock.json +63 -0
  12. package/dist/manifests/combobox.json +33 -0
  13. package/dist/manifests/dialog.json +64 -0
  14. package/dist/manifests/divider.json +47 -0
  15. package/dist/manifests/dropdown.json +105 -0
  16. package/dist/manifests/form.json +81 -0
  17. package/dist/manifests/grid.json +143 -0
  18. package/dist/manifests/input.json +99 -0
  19. package/dist/manifests/meter.json +103 -0
  20. package/dist/manifests/navigation.json +70 -0
  21. package/dist/manifests/progress.json +88 -0
  22. package/dist/manifests/radio.json +121 -0
  23. package/dist/manifests/select.json +109 -0
  24. package/dist/manifests/skeleton.json +101 -0
  25. package/dist/manifests/tab.json +88 -0
  26. package/dist/manifests/table.json +92 -0
  27. package/dist/manifests/textarea.json +117 -0
  28. package/dist/manifests/toast.json +157 -0
  29. package/dist/manifests/tooltip.json +115 -0
  30. package/dist/server.d.ts +1 -2
  31. package/dist/server.js +2102 -1
  32. package/dist/server.js.map +1 -1
  33. package/dist/utils/check-api.d.ts +2 -0
  34. package/dist/utils/check-api.js +11 -0
  35. package/dist/utils/check-api.js.map +1 -0
  36. package/dist/vector-index.json +14015 -0
  37. package/package.json +25 -11
  38. package/src/context/api-context.ts +14 -0
  39. package/src/global.d.ts +15 -0
  40. package/src/manifests/accordion.json +61 -0
  41. package/src/manifests/alert.json +69 -0
  42. package/src/manifests/avatar.json +75 -0
  43. package/src/manifests/badge.json +74 -0
  44. package/src/manifests/breadcrumb.json +87 -0
  45. package/src/manifests/button.json +85 -0
  46. package/src/manifests/card.json +91 -0
  47. package/src/manifests/checkbox.json +122 -0
  48. package/src/manifests/codeblock.json +63 -0
  49. package/src/manifests/combobox.json +33 -0
  50. package/src/manifests/dialog.json +64 -0
  51. package/src/manifests/divider.json +47 -0
  52. package/src/manifests/dropdown.json +105 -0
  53. package/src/manifests/form.json +81 -0
  54. package/src/manifests/grid.json +143 -0
  55. package/src/manifests/index.ts +45 -0
  56. package/src/manifests/input.json +99 -0
  57. package/src/manifests/meter.json +103 -0
  58. package/src/manifests/navigation.json +70 -0
  59. package/src/manifests/progress.json +88 -0
  60. package/src/manifests/radio.json +121 -0
  61. package/src/manifests/select.json +109 -0
  62. package/src/manifests/skeleton.json +101 -0
  63. package/src/manifests/tab.json +88 -0
  64. package/src/manifests/table.json +92 -0
  65. package/src/manifests/textarea.json +117 -0
  66. package/src/manifests/toast.json +157 -0
  67. package/src/manifests/tooltip.json +115 -0
  68. package/src/server.ts +200 -2
  69. package/src/tools/build-index.ts +55 -0
  70. package/src/tools/check-a11y.ts +106 -0
  71. package/src/tools/embedder.ts +18 -0
  72. package/src/tools/generate-theme.ts +42 -0
  73. package/src/tools/get-emmet.ts +64 -0
  74. package/src/tools/get-manifests.ts +55 -0
  75. package/src/tools/intent-engine.ts +197 -0
  76. package/src/tools/list-components.ts +20 -0
  77. package/src/tools/search-index.ts +66 -0
  78. package/src/tools/theme-palette.ts +65 -0
  79. package/src/tools/theme-tokens.ts +176 -0
  80. package/src/tools/validator.ts +367 -0
  81. package/src/types.ts +63 -0
  82. package/src/utils/a11y-rules.ts +873 -0
  83. package/src/utils/a11y-types.ts +15 -0
  84. package/src/utils/check-api.ts +13 -0
  85. package/src/utils/cosine.ts +15 -0
  86. package/src/utils/emmet-helpers.ts +171 -0
  87. package/src/utils/intent-helpers.ts +66 -0
  88. package/src/utils/intent-parser.ts +186 -0
  89. package/src/utils/tokenizer.ts +7 -0
  90. package/tsconfig.json +9 -2
  91. package/tsup.config.ts +6 -3
  92. package/LICENSE +0 -21
  93. package/dist/server.cjs +0 -2
  94. package/dist/server.cjs.map +0 -1
  95. package/dist/server.d.cts +0 -3
  96. package/test/basic.test.ts +0 -8
package/package.json CHANGED
@@ -1,24 +1,38 @@
1
1
  {
2
2
  "name": "@mindfiredigital/ignix-lite-mcp",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "index.js",
7
+ "scripts": {
8
+ "test": "vitest run",
9
+ "dev": "tsup src/server.ts --watch --format esm --no-clean --onSuccess \"copyfiles -u 2 src/manifests/*.json dist/manifests\"",
10
+ "lint": "eslint .",
11
+ "format": "prettier --write .",
12
+ "build": "tsup && copyfiles -u 2 src/manifests/*.json dist/manifests && pnpm build:index",
13
+ "build:index": "tsx src/tools/build-index.ts"
14
+ },
7
15
  "keywords": [],
8
16
  "author": "",
9
17
  "license": "ISC",
18
+ "publishConfig": {
19
+ "registry": "https://registry.npmjs.org",
20
+ "access": "public"
21
+ },
10
22
  "devDependencies": {
11
- "tsup": "^8.5.1",
12
- "vitest": "^4.1.4",
23
+ "@types/node": "^25.6.0",
24
+ "copyfiles": "^2.4.1",
13
25
  "eslint": "^10.2.0",
14
26
  "prettier": "^3.8.3",
15
- "typescript": "^5.4.5"
27
+ "tiktoken": "^1.0.22",
28
+ "tsup": "^8.5.1",
29
+ "typescript": "^5.4.5",
30
+ "vitest": "^4.1.4"
16
31
  },
17
- "scripts": {
18
- "test": "vitest run",
19
- "dev": "tsup src/server.ts --watch",
20
- "lint": "eslint .",
21
- "format": "prettier --write .",
22
- "build": "tsup"
32
+ "dependencies": {
33
+ "@modelcontextprotocol/sdk": "^1.29.0",
34
+ "emmet": "^2.4.11",
35
+ "node-html-parser": "^7.1.0",
36
+ "zod": "^4.4.3"
23
37
  }
24
- }
38
+ }
@@ -0,0 +1,14 @@
1
+ import { readFileSync, existsSync } from 'fs'
2
+ import path from 'path'
3
+ import { fileURLToPath } from 'url'
4
+
5
+ const __filename = fileURLToPath(import.meta.url)
6
+ const __dirname = path.dirname(__filename)
7
+
8
+ // Dynamically handle both bundled dist/ and source src/context/ contexts
9
+ let apiPath = path.resolve(__dirname, '../../../api-full.txt')
10
+ if (!existsSync(apiPath)) {
11
+ apiPath = path.resolve(__dirname, '../../../../api-full.txt')
12
+ }
13
+
14
+ export const apiContext = readFileSync(apiPath, 'utf8')
@@ -0,0 +1,15 @@
1
+ declare module 'emmet' {
2
+ export default function expand(
3
+ abbr: string,
4
+ config?: Record<string, unknown>
5
+ ): string
6
+ export function markup(abbr: string, config: Record<string, unknown>): string
7
+ export function stylesheet(
8
+ abbr: string,
9
+ config: Record<string, unknown>
10
+ ): string
11
+ export function resolveConfig(
12
+ config: Record<string, unknown>
13
+ ): Record<string, unknown>
14
+ export const stringifyMarkup: (node: unknown) => string
15
+ }
@@ -0,0 +1,61 @@
1
+ {
2
+ "component": "accordion",
3
+ "version": "2.0",
4
+
5
+ "description": "Displays expandable content sections using native HTML details and summary elements. Works without JavaScript and is accessible by default.",
6
+
7
+ "element": "details",
8
+
9
+ "emmet": "details[open?]>summary{title}+p{content}",
10
+
11
+
12
+ "props": {
13
+ "open": {
14
+ "type": "boolean",
15
+ "native": true,
16
+ "agent_hint": "Use open to keep accordion expanded by default."
17
+ }
18
+ },
19
+
20
+ "states": ["open"],
21
+
22
+ "forbidden_props": ["expanded", "isOpen", "collapsed", "variant", "class"],
23
+
24
+ "required_props": [],
25
+
26
+ "required_slots": [],
27
+
28
+ "required_children": ["summary"],
29
+
30
+ "do": [
31
+ "Use summary as the accordion trigger",
32
+ "Use open to expand by default",
33
+ "Use native details element for accessibility"
34
+ ],
35
+
36
+ "dont": [
37
+ "Do not replace details with div",
38
+ "Do not use JavaScript for open state",
39
+ "Do not use class attribute"
40
+ ],
41
+
42
+ "examples": [
43
+ {
44
+ "label": "Default accordion",
45
+ "emmet": "details>summary{What is ignix-lite?}+p{Lightweight semantic UI library}",
46
+ "html": "<details><summary>What is ignix-lite?</summary><p>Lightweight semantic UI library</p></details>"
47
+ },
48
+
49
+ {
50
+ "label": "Open by default",
51
+ "emmet": "details[open]>summary{How does this work?}+p{Uses native browser behavior}",
52
+ "html": "<details open><summary>How does this work?</summary><p>Uses native browser behavior</p></details>"
53
+ },
54
+
55
+ {
56
+ "label": "FAQ item",
57
+ "emmet": "details>summary{Does it require JS?}+p{No, it works without JavaScript}",
58
+ "html": "<details><summary>Does it require JS?</summary><p>No, it works without JavaScript</p></details>"
59
+ }
60
+ ]
61
+ }
@@ -0,0 +1,69 @@
1
+ {
2
+ "component": "alert",
3
+ "version": "2.0",
4
+
5
+ "description": "Displays semantic feedback messages using native <aside> element for warnings, errors, success messages, and informational updates.",
6
+
7
+ "element": "aside",
8
+
9
+ "emmet": "aside[data-intent=?]{message}",
10
+
11
+
12
+ "props": {
13
+ "data-intent": {
14
+ "type": "enum",
15
+ "values": ["danger", "warning", "success", "info"],
16
+ "default": "info",
17
+ "native": false,
18
+ "agent_hint": "Use danger for errors, warning for cautions, success for confirmations, info for updates."
19
+ }
20
+ },
21
+
22
+ "states": [],
23
+
24
+ "forbidden_props": [
25
+ "variant",
26
+ "color",
27
+ "appearance",
28
+ "colorScheme",
29
+ "severity",
30
+ "status",
31
+ "class"
32
+ ],
33
+
34
+ "required_props": [],
35
+
36
+ "required_slots": [],
37
+
38
+ "do": [
39
+ "Use data-intent='danger' for error states",
40
+ "Use data-intent='warning' for caution messages",
41
+ "Use native aside element for semantic alerts"
42
+ ],
43
+
44
+ "dont": [
45
+ "Do not use div instead of aside",
46
+ "Do not use variant or severity props",
47
+ "Do not use class attribute"
48
+ ],
49
+
50
+ "examples": [
51
+ {
52
+ "label": "Danger alert",
53
+ "emmet": "aside[data-intent=danger]{Something went wrong}",
54
+ "html": "<aside data-intent=\"danger\">Something went wrong</aside>"
55
+ },
56
+
57
+ {
58
+ "label": "Warning alert",
59
+ "emmet": "aside[data-intent=warning]{Session expires soon}",
60
+ "html": "<aside data-intent=\"warning\">Session expires soon</aside>"
61
+ },
62
+
63
+ {
64
+ "label": "Success alert",
65
+ "emmet": "aside[data-intent=success]{Saved successfully}",
66
+ "html": "<aside data-intent=\"success\">Saved successfully</aside>"
67
+ }
68
+ ]
69
+ }
@@ -0,0 +1,75 @@
1
+ {
2
+ "component": "avatar",
3
+ "version": "2.0",
4
+
5
+ "description": "Displays user profile visuals using native img element with text fallback support through span. Supports multiple sizes and loading skeletons.",
6
+
7
+ "element": "img | span",
8
+
9
+ "emmet": "img[src=? alt=? data-size=?]",
10
+
11
+
12
+ "props": {
13
+ "data-size": {
14
+ "type": "enum",
15
+ "values": ["sm", "md", "lg"],
16
+ "default": "md",
17
+ "native": false,
18
+ "agent_hint": "Use sm for compact lists, md for profile previews, lg for detailed cards."
19
+ },
20
+
21
+ "src": {
22
+ "type": "string",
23
+ "native": true,
24
+ "agent_hint": "Image URL for avatar image."
25
+ },
26
+
27
+ "alt": {
28
+ "type": "string",
29
+ "native": true,
30
+ "agent_hint": "Always provide descriptive alt text for accessibility."
31
+ }
32
+ },
33
+
34
+ "states": ["loading"],
35
+
36
+ "forbidden_props": ["size", "variant", "shape", "rounded", "class"],
37
+
38
+ "required_props": [],
39
+
40
+ "required_slots": [],
41
+
42
+ "fallback_element": "span",
43
+
44
+ "do": [
45
+ "Use img for avatar images",
46
+ "Use span fallback for initials",
47
+ "Always provide alt text on images"
48
+ ],
49
+
50
+ "dont": [
51
+ "Do not use class attribute",
52
+ "Do not use size prop instead of data-size",
53
+ "Do not omit alt attribute on img"
54
+ ],
55
+
56
+ "examples": [
57
+ {
58
+ "label": "Small avatar",
59
+ "emmet": "img[src=? alt=User data-size=sm]",
60
+ "html": "<img src=\"https://picsum.photos/100\" alt=\"User\" data-size=\"sm\">"
61
+ },
62
+
63
+ {
64
+ "label": "Medium avatar",
65
+ "emmet": "img[src=? alt=Sarah data-size=md]",
66
+ "html": "<img src=\"https://picsum.photos/100\" alt=\"Sarah\" data-size=\"md\">"
67
+ },
68
+
69
+ {
70
+ "label": "Fallback initials",
71
+ "emmet": "span[data-size=md]{JD}",
72
+ "html": "<span data-size=\"md\">JD</span>"
73
+ }
74
+ ]
75
+ }
@@ -0,0 +1,74 @@
1
+ {
2
+ "component": "badge",
3
+ "version": "2.0",
4
+ "description": "Status indicator using mark or span[role=status] with intent styling.",
5
+
6
+ "element": "badge",
7
+
8
+ "emmet": "mark[data-intent=?]{Label}",
9
+ "tokens": 3,
10
+
11
+ "props": {
12
+ "data-intent": {
13
+ "type": "enum",
14
+ "values": ["success", "danger", "warning", "neutral"],
15
+ "default": "neutral",
16
+ "native": false,
17
+ "agent_hint": "Controls badge color"
18
+ },
19
+
20
+ "role": {
21
+ "type": "enum",
22
+ "values": ["status"],
23
+ "native": true,
24
+ "agent_hint": "Required when using span"
25
+ }
26
+ },
27
+
28
+ "allowed_elements": ["mark", "span"],
29
+
30
+ "required_conditions": ["span must have role=status"],
31
+
32
+ "states": [],
33
+
34
+ "required_props": [],
35
+
36
+ "forbidden_props": ["class", "variant", "color", "style", "onclick"],
37
+
38
+ "do": [
39
+ "Use mark for standard badges",
40
+ "Use span with role=status for accessibility cases",
41
+ "Use data-intent to convey meaning",
42
+ "Keep text short"
43
+ ],
44
+
45
+ "dont": [
46
+ "Do not use class attribute",
47
+ "Do not use variant or color props",
48
+ "Do not attach JS handlers",
49
+ "Do not use span without role=status"
50
+ ],
51
+
52
+ "examples": [
53
+ {
54
+ "label": "Basic badge",
55
+ "emmet": "mark[data-intent=neutral]{Active}",
56
+ "html": "<mark data-intent=\"neutral\">Active</mark>"
57
+ },
58
+ {
59
+ "label": "Success badge",
60
+ "emmet": "mark[data-intent=success]{Active}",
61
+ "html": "<mark data-intent=\"success\">Active</mark>"
62
+ },
63
+ {
64
+ "label": "Danger badge",
65
+ "emmet": "mark[data-intent=danger]{Error}",
66
+ "html": "<mark data-intent=\"danger\">Error</mark>"
67
+ },
68
+ {
69
+ "label": "Status badge",
70
+ "emmet": "span[role=status data-intent=success]{Active}",
71
+ "html": "<span role=\"status\" data-intent=\"success\">Active</span>"
72
+ }
73
+ ]
74
+ }
@@ -0,0 +1,87 @@
1
+ {
2
+ "component": "breadcrumb",
3
+ "version": "2.0",
4
+ "description": "Displays hierarchical navigation path using native nav > ol > li > a structure.",
5
+
6
+ "element": "nav",
7
+
8
+ "emmet": "nav[aria-label=Breadcrumb]>ol>(li>a[href=?])*3",
9
+
10
+ "props": {
11
+ "data-style": {
12
+ "type": "enum",
13
+
14
+ "values": ["chevron", "slash", "guillemet", "arrow", "thread", "pipe"],
15
+
16
+ "default": "chevron",
17
+ "native": false,
18
+ "agent_hint": "Controls breadcrumb separator style."
19
+ },
20
+
21
+ "data-intent": {
22
+ "type": "enum",
23
+
24
+ "values": ["primary", "success", "warning", "danger", "gradient"],
25
+
26
+ "default": "primary",
27
+ "native": false,
28
+ "agent_hint": "Controls active breadcrumb color intent."
29
+ },
30
+
31
+ "aria-label": {
32
+ "type": "string",
33
+ "native": true,
34
+ "required": true,
35
+ "agent_hint": "Use aria-label='Breadcrumb' for accessibility."
36
+ }
37
+ },
38
+
39
+ "states": [],
40
+ "slots": {},
41
+
42
+ "forbidden_props": [
43
+ "variant",
44
+ "color",
45
+ "appearance",
46
+ "separator",
47
+ "items",
48
+ "activeItem",
49
+ "class"
50
+ ],
51
+
52
+ "required_props": ["aria-label"],
53
+
54
+ "required_slots": [],
55
+
56
+ "do": [
57
+ "Use nav as breadcrumb container",
58
+ "Use ordered list structure",
59
+ "Mark current page using aria-current='page'"
60
+ ],
61
+
62
+ "dont": [
63
+ "Do not use class attribute",
64
+ "Do not replace nav with div",
65
+ "Do not pass breadcrumb items as props"
66
+ ],
67
+
68
+ "examples": [
69
+ {
70
+ "label": "Default breadcrumb",
71
+ "emmet": "nav[aria-label=Breadcrumb]>ol>(li>a[href=?])*3",
72
+ "html": "<nav aria-label=\"Breadcrumb\"><ol><li><a href=\"#\">Home</a></li><li><a href=\"#\">Docs</a></li><li><a aria-current=\"page\">Breadcrumb</a></li></ol></nav>"
73
+ },
74
+
75
+ {
76
+ "label": "Slash style",
77
+ "emmet": "nav[aria-label=Breadcrumb data-style=slash]>ol>(li>a[href=?])*3",
78
+ "html": "<nav aria-label=\"Breadcrumb\" data-style=\"slash\"></nav>"
79
+ },
80
+
81
+ {
82
+ "label": "Danger intent",
83
+ "emmet": "nav[aria-label=Breadcrumb data-intent=danger]>ol>(li>a[href=?])*3",
84
+ "html": "<nav aria-label=\"Breadcrumb\" data-intent=\"danger\"></nav>"
85
+ }
86
+ ]
87
+ }
@@ -0,0 +1,85 @@
1
+ {
2
+ "component": "button",
3
+ "version": "2.0",
4
+ "description": "Triggers an action. Renders as native <button>.",
5
+
6
+ "element": "button",
7
+
8
+ "emmet": "button[data-intent=?]{label}",
9
+
10
+
11
+ "props": {
12
+ "data-intent": {
13
+ "type": "enum",
14
+ "values": ["primary", "danger", "warning", "success", "neutral", "ghost"],
15
+ "default": "primary",
16
+ "native": false,
17
+ "agent_hint": "Use danger for destructive actions. Use ghost for secondary actions."
18
+ },
19
+
20
+ "disabled": {
21
+ "type": "boolean",
22
+ "native": true,
23
+ "agent_hint": "Use native disabled attribute"
24
+ },
25
+
26
+ "aria-busy": {
27
+ "type": "boolean",
28
+ "native": true,
29
+ "agent_hint": "Use for loading state"
30
+ },
31
+
32
+ "type": {
33
+ "type": "enum",
34
+ "values": ["button", "submit", "reset"],
35
+ "default": "button",
36
+ "native": true
37
+ }
38
+ },
39
+
40
+ "states": ["disabled", "aria-busy"],
41
+
42
+ "forbidden_props": [
43
+ "variant",
44
+ "color",
45
+ "appearance",
46
+ "colorScheme",
47
+ "isLoading",
48
+ "isDisabled",
49
+ "size",
50
+ "class"
51
+ ],
52
+
53
+ "required_props": [],
54
+ "required_slots": [],
55
+
56
+ "do": [
57
+ "Use data-intent='danger' for destructive actions",
58
+ "Use aria-busy='true' for loading state",
59
+ "Use type='submit' inside forms"
60
+ ],
61
+
62
+ "dont": [
63
+ "Do not use class attribute",
64
+ "Do not use variant or color props",
65
+ "Do not use isLoading or isDisabled"
66
+ ],
67
+
68
+ "examples": [
69
+ {
70
+ "label": "Primary button",
71
+ "emmet": "button[data-intent=primary]{Save}",
72
+ "html": "<button data-intent=\"primary\">Save</button>"
73
+ },
74
+ {
75
+ "label": "Danger button",
76
+ "emmet": "button[data-intent=danger]{Delete}",
77
+ "html": "<button data-intent=\"danger\">Delete</button>"
78
+ },
79
+ {
80
+ "label": "Loading button",
81
+ "emmet": "button[aria-busy=true]{Saving...}",
82
+ "html": "<button aria-busy=\"true\">Saving...</button>"
83
+ }
84
+ ]
85
+ }
@@ -0,0 +1,91 @@
1
+ {
2
+ "component": "card",
3
+ "version": "2.0",
4
+ "description": "Displays structured content using semantic slots for avatar, title, metadata, body, actions, and footer. Renders as native article element.",
5
+
6
+ "element": "article",
7
+
8
+ "emmet": "article>(img[slot=avatar])+(span[slot=title])+(p[slot=body])",
9
+
10
+
11
+ "props": {},
12
+
13
+ "states": [],
14
+
15
+ "slots": {
16
+ "avatar": {
17
+ "required": false,
18
+
19
+ "element": ["img", "span"],
20
+
21
+ "agent_hint": "Avatar image or visual content."
22
+ },
23
+
24
+ "title": {
25
+ "required": true,
26
+
27
+ "element": ["span", "h1", "h2", "h3"],
28
+
29
+ "agent_hint": "Primary card heading."
30
+ },
31
+
32
+ "meta": {
33
+ "required": false,
34
+
35
+ "element": ["span", "small"],
36
+
37
+ "agent_hint": "Subtitle or metadata."
38
+ },
39
+
40
+ "body": {
41
+ "required": true,
42
+
43
+ "element": ["p"],
44
+
45
+ "agent_hint": "Main content area."
46
+ },
47
+
48
+ "action": {
49
+ "required": false,
50
+
51
+ "element": ["button", "a"],
52
+
53
+ "agent_hint": "Primary action area."
54
+ },
55
+
56
+ "footer": {
57
+ "required": false,
58
+
59
+ "element": ["span", "small"],
60
+
61
+ "agent_hint": "Footer metadata."
62
+ }
63
+ },
64
+
65
+ "forbidden_props": [
66
+ "title",
67
+ "subtitle",
68
+ "avatar",
69
+ "image",
70
+ "body",
71
+ "footer",
72
+ "actionLabel",
73
+ "class"
74
+ ],
75
+
76
+ "required_props": [],
77
+
78
+ "required_slots": ["title", "body"],
79
+
80
+ "do": [
81
+ "Use slot attributes for content placement",
82
+ "Use article as card container",
83
+ "Place actions inside slot='action'"
84
+ ],
85
+
86
+ "dont": [
87
+ "Do not pass title or body as props",
88
+ "Do not replace slots with attributes",
89
+ "Do not use class attribute"
90
+ ]
91
+ }