mozaic-mcp-server 1.0.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 (161) hide show
  1. package/INSTALLATION.md +232 -0
  2. package/README.md +262 -0
  3. package/SKILLS.md +411 -0
  4. package/bin/install-skills.js +171 -0
  5. package/data/mozaic.db +0 -0
  6. package/data/mozaic.db-shm +0 -0
  7. package/data/mozaic.db-wal +0 -0
  8. package/dist/__tests__/sanity-check.test.d.ts +2 -0
  9. package/dist/__tests__/sanity-check.test.d.ts.map +1 -0
  10. package/dist/__tests__/sanity-check.test.js +167 -0
  11. package/dist/__tests__/sanity-check.test.js.map +1 -0
  12. package/dist/__tests__/tools.integration.test.d.ts +2 -0
  13. package/dist/__tests__/tools.integration.test.d.ts.map +1 -0
  14. package/dist/__tests__/tools.integration.test.js +220 -0
  15. package/dist/__tests__/tools.integration.test.js.map +1 -0
  16. package/dist/db/queries.d.ts +144 -0
  17. package/dist/db/queries.d.ts.map +1 -0
  18. package/dist/db/queries.js +536 -0
  19. package/dist/db/queries.js.map +1 -0
  20. package/dist/db/schema.d.ts +4 -0
  21. package/dist/db/schema.d.ts.map +1 -0
  22. package/dist/db/schema.js +253 -0
  23. package/dist/db/schema.js.map +1 -0
  24. package/dist/index.d.ts +3 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +416 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/parsers/__tests__/docs-parser.test.d.ts +2 -0
  29. package/dist/parsers/__tests__/docs-parser.test.d.ts.map +1 -0
  30. package/dist/parsers/__tests__/docs-parser.test.js +251 -0
  31. package/dist/parsers/__tests__/docs-parser.test.js.map +1 -0
  32. package/dist/parsers/__tests__/icons-parser.test.d.ts +2 -0
  33. package/dist/parsers/__tests__/icons-parser.test.d.ts.map +1 -0
  34. package/dist/parsers/__tests__/icons-parser.test.js +169 -0
  35. package/dist/parsers/__tests__/icons-parser.test.js.map +1 -0
  36. package/dist/parsers/__tests__/react-parser.test.d.ts +2 -0
  37. package/dist/parsers/__tests__/react-parser.test.d.ts.map +1 -0
  38. package/dist/parsers/__tests__/react-parser.test.js +274 -0
  39. package/dist/parsers/__tests__/react-parser.test.js.map +1 -0
  40. package/dist/parsers/__tests__/scss-parser.test.d.ts +2 -0
  41. package/dist/parsers/__tests__/scss-parser.test.d.ts.map +1 -0
  42. package/dist/parsers/__tests__/scss-parser.test.js +364 -0
  43. package/dist/parsers/__tests__/scss-parser.test.js.map +1 -0
  44. package/dist/parsers/__tests__/tokens-parser.test.d.ts +2 -0
  45. package/dist/parsers/__tests__/tokens-parser.test.d.ts.map +1 -0
  46. package/dist/parsers/__tests__/tokens-parser.test.js +172 -0
  47. package/dist/parsers/__tests__/tokens-parser.test.js.map +1 -0
  48. package/dist/parsers/__tests__/vue-parser.test.d.ts +2 -0
  49. package/dist/parsers/__tests__/vue-parser.test.d.ts.map +1 -0
  50. package/dist/parsers/__tests__/vue-parser.test.js +207 -0
  51. package/dist/parsers/__tests__/vue-parser.test.js.map +1 -0
  52. package/dist/parsers/docs-parser.d.ts +4 -0
  53. package/dist/parsers/docs-parser.d.ts.map +1 -0
  54. package/dist/parsers/docs-parser.js +237 -0
  55. package/dist/parsers/docs-parser.js.map +1 -0
  56. package/dist/parsers/icons-parser.d.ts +33 -0
  57. package/dist/parsers/icons-parser.d.ts.map +1 -0
  58. package/dist/parsers/icons-parser.js +125 -0
  59. package/dist/parsers/icons-parser.js.map +1 -0
  60. package/dist/parsers/react-parser.d.ts +3 -0
  61. package/dist/parsers/react-parser.d.ts.map +1 -0
  62. package/dist/parsers/react-parser.js +406 -0
  63. package/dist/parsers/react-parser.js.map +1 -0
  64. package/dist/parsers/scss-parser.d.ts +9 -0
  65. package/dist/parsers/scss-parser.d.ts.map +1 -0
  66. package/dist/parsers/scss-parser.js +351 -0
  67. package/dist/parsers/scss-parser.js.map +1 -0
  68. package/dist/parsers/tokens/border-parser.d.ts +3 -0
  69. package/dist/parsers/tokens/border-parser.d.ts.map +1 -0
  70. package/dist/parsers/tokens/border-parser.js +83 -0
  71. package/dist/parsers/tokens/border-parser.js.map +1 -0
  72. package/dist/parsers/tokens/color-parser.d.ts +3 -0
  73. package/dist/parsers/tokens/color-parser.d.ts.map +1 -0
  74. package/dist/parsers/tokens/color-parser.js +88 -0
  75. package/dist/parsers/tokens/color-parser.js.map +1 -0
  76. package/dist/parsers/tokens/grid-parser.d.ts +3 -0
  77. package/dist/parsers/tokens/grid-parser.d.ts.map +1 -0
  78. package/dist/parsers/tokens/grid-parser.js +97 -0
  79. package/dist/parsers/tokens/grid-parser.js.map +1 -0
  80. package/dist/parsers/tokens/index.d.ts +9 -0
  81. package/dist/parsers/tokens/index.d.ts.map +1 -0
  82. package/dist/parsers/tokens/index.js +10 -0
  83. package/dist/parsers/tokens/index.js.map +1 -0
  84. package/dist/parsers/tokens/screen-parser.d.ts +3 -0
  85. package/dist/parsers/tokens/screen-parser.d.ts.map +1 -0
  86. package/dist/parsers/tokens/screen-parser.js +54 -0
  87. package/dist/parsers/tokens/screen-parser.js.map +1 -0
  88. package/dist/parsers/tokens/shadow-parser.d.ts +3 -0
  89. package/dist/parsers/tokens/shadow-parser.d.ts.map +1 -0
  90. package/dist/parsers/tokens/shadow-parser.js +62 -0
  91. package/dist/parsers/tokens/shadow-parser.js.map +1 -0
  92. package/dist/parsers/tokens/spacing-parser.d.ts +4 -0
  93. package/dist/parsers/tokens/spacing-parser.d.ts.map +1 -0
  94. package/dist/parsers/tokens/spacing-parser.js +85 -0
  95. package/dist/parsers/tokens/spacing-parser.js.map +1 -0
  96. package/dist/parsers/tokens/types.d.ts +33 -0
  97. package/dist/parsers/tokens/types.d.ts.map +1 -0
  98. package/dist/parsers/tokens/types.js +42 -0
  99. package/dist/parsers/tokens/types.js.map +1 -0
  100. package/dist/parsers/tokens/typography-parser.d.ts +3 -0
  101. package/dist/parsers/tokens/typography-parser.d.ts.map +1 -0
  102. package/dist/parsers/tokens/typography-parser.js +76 -0
  103. package/dist/parsers/tokens/typography-parser.js.map +1 -0
  104. package/dist/parsers/tokens-parser.d.ts +18 -0
  105. package/dist/parsers/tokens-parser.d.ts.map +1 -0
  106. package/dist/parsers/tokens-parser.js +57 -0
  107. package/dist/parsers/tokens-parser.js.map +1 -0
  108. package/dist/parsers/vue-parser.d.ts +3 -0
  109. package/dist/parsers/vue-parser.d.ts.map +1 -0
  110. package/dist/parsers/vue-parser.js +343 -0
  111. package/dist/parsers/vue-parser.js.map +1 -0
  112. package/dist/tools/generate-react-component.d.ts +35 -0
  113. package/dist/tools/generate-react-component.d.ts.map +1 -0
  114. package/dist/tools/generate-react-component.js +81 -0
  115. package/dist/tools/generate-react-component.js.map +1 -0
  116. package/dist/tools/generate-vue-component.d.ts +35 -0
  117. package/dist/tools/generate-vue-component.d.ts.map +1 -0
  118. package/dist/tools/generate-vue-component.js +81 -0
  119. package/dist/tools/generate-vue-component.js.map +1 -0
  120. package/dist/tools/get-component-info.d.ts +52 -0
  121. package/dist/tools/get-component-info.d.ts.map +1 -0
  122. package/dist/tools/get-component-info.js +94 -0
  123. package/dist/tools/get-component-info.js.map +1 -0
  124. package/dist/tools/get-css-utility.d.ts +41 -0
  125. package/dist/tools/get-css-utility.d.ts.map +1 -0
  126. package/dist/tools/get-css-utility.js +57 -0
  127. package/dist/tools/get-css-utility.js.map +1 -0
  128. package/dist/tools/get-design-tokens.d.ts +44 -0
  129. package/dist/tools/get-design-tokens.d.ts.map +1 -0
  130. package/dist/tools/get-design-tokens.js +124 -0
  131. package/dist/tools/get-design-tokens.js.map +1 -0
  132. package/dist/tools/get-icon.d.ts +32 -0
  133. package/dist/tools/get-icon.d.ts.map +1 -0
  134. package/dist/tools/get-icon.js +108 -0
  135. package/dist/tools/get-icon.js.map +1 -0
  136. package/dist/tools/get-install-info.d.ts +39 -0
  137. package/dist/tools/get-install-info.d.ts.map +1 -0
  138. package/dist/tools/get-install-info.js +160 -0
  139. package/dist/tools/get-install-info.js.map +1 -0
  140. package/dist/tools/list-components.d.ts +32 -0
  141. package/dist/tools/list-components.d.ts.map +1 -0
  142. package/dist/tools/list-components.js +62 -0
  143. package/dist/tools/list-components.js.map +1 -0
  144. package/dist/tools/list-css-utilities.d.ts +27 -0
  145. package/dist/tools/list-css-utilities.d.ts.map +1 -0
  146. package/dist/tools/list-css-utilities.js +48 -0
  147. package/dist/tools/list-css-utilities.js.map +1 -0
  148. package/dist/tools/search-documentation.d.ts +37 -0
  149. package/dist/tools/search-documentation.d.ts.map +1 -0
  150. package/dist/tools/search-documentation.js +120 -0
  151. package/dist/tools/search-documentation.js.map +1 -0
  152. package/dist/tools/search-icons.d.ts +41 -0
  153. package/dist/tools/search-icons.d.ts.map +1 -0
  154. package/dist/tools/search-icons.js +134 -0
  155. package/dist/tools/search-icons.js.map +1 -0
  156. package/package.json +98 -0
  157. package/skills/mozaic-css-utilities/skill.md +633 -0
  158. package/skills/mozaic-design-tokens/skill.md +621 -0
  159. package/skills/mozaic-icons/skill.md +624 -0
  160. package/skills/mozaic-react-builder/skill.md +652 -0
  161. package/skills/mozaic-vue-builder/skill.md +491 -0
@@ -0,0 +1,274 @@
1
+ import { describe, it, expect } from "vitest";
2
+ // Test the React prop extraction patterns directly
3
+ describe("React Parser - extractConstArrays", () => {
4
+ function extractConstArrays(content) {
5
+ const constArrays = new Map();
6
+ const constRegex = /const\s+(\w+)\s*=\s*\[([^\]]+)\]\s*as\s+const/g;
7
+ let match;
8
+ while ((match = constRegex.exec(content)) !== null) {
9
+ const name = match[1];
10
+ const values = match[2]
11
+ .split(",")
12
+ .map((s) => s.trim().replace(/['"]/g, ""))
13
+ .filter((s) => s.length > 0);
14
+ constArrays.set(name, values);
15
+ }
16
+ return constArrays;
17
+ }
18
+ it("should extract const arrays", () => {
19
+ const content = `
20
+ export const sizes = ['s', 'm', 'l'] as const;
21
+ export const themes = ['primary', 'secondary', 'danger'] as const;
22
+ `;
23
+ const arrays = extractConstArrays(content);
24
+ expect(arrays.get("sizes")).toEqual(["s", "m", "l"]);
25
+ expect(arrays.get("themes")).toEqual(["primary", "secondary", "danger"]);
26
+ });
27
+ it("should handle double quotes", () => {
28
+ const content = `export const variants = ["solid", "bordered", "ghost"] as const;`;
29
+ const arrays = extractConstArrays(content);
30
+ expect(arrays.get("variants")).toEqual(["solid", "bordered", "ghost"]);
31
+ });
32
+ });
33
+ describe("React Parser - extractPropsFromInterface", () => {
34
+ function extractPropsFromInterface(content, interfaceName, constArrays) {
35
+ const props = [];
36
+ const seenProps = new Set();
37
+ const interfaceRegex = new RegExp(`interface\\s+${interfaceName}\\s*(?:extends\\s+([^{]+))?\\s*\\{([\\s\\S]*?)\\}`, "g");
38
+ const match = interfaceRegex.exec(content);
39
+ if (!match)
40
+ return props;
41
+ const extendsClause = match[1];
42
+ const interfaceBody = match[2];
43
+ // Recursively get props from extended interfaces
44
+ if (extendsClause) {
45
+ const extendedInterfaces = extendsClause
46
+ .split(",")
47
+ .map((s) => s.trim().replace(/<[^>]+>/, ""))
48
+ .filter((s) => s.length > 0 && !s.startsWith("Omit") && !s.includes("HTMLAttributes"));
49
+ for (const extInterface of extendedInterfaces) {
50
+ const extProps = extractPropsFromInterface(content, extInterface, constArrays);
51
+ for (const prop of extProps) {
52
+ if (!seenProps.has(prop.name)) {
53
+ seenProps.add(prop.name);
54
+ props.push(prop);
55
+ }
56
+ }
57
+ }
58
+ }
59
+ const propRegex = /(\w+)(\?)?:\s*([^;\n]+)/g;
60
+ let propMatch;
61
+ while ((propMatch = propRegex.exec(interfaceBody)) !== null) {
62
+ const propName = propMatch[1];
63
+ const isOptional = !!propMatch[2];
64
+ const propType = propMatch[3].trim();
65
+ if (seenProps.has(propName))
66
+ continue;
67
+ if (propType.includes("=>") || propName.startsWith("on"))
68
+ continue;
69
+ if (propName === "children" || propName === "className")
70
+ continue;
71
+ seenProps.add(propName);
72
+ let options;
73
+ const typeRefMatch = propType.match(/^T(\w+)$/);
74
+ if (typeRefMatch) {
75
+ const typeName = typeRefMatch[1].toLowerCase();
76
+ for (const [constName, values] of constArrays) {
77
+ const constNameLower = constName.toLowerCase();
78
+ // Match if type contains const name or const name contains type suffix
79
+ // e.g., "buttonvariant" should match "variant" or "variants"
80
+ if (typeName.includes(constNameLower) ||
81
+ typeName.includes(constNameLower.replace(/s$/, ""))) {
82
+ options = values;
83
+ break;
84
+ }
85
+ }
86
+ }
87
+ if (propType.includes("|") && propType.includes("'")) {
88
+ options = propType
89
+ .split("|")
90
+ .map((s) => s.trim().replace(/['"]/g, ""))
91
+ .filter((s) => s && s !== "undefined");
92
+ }
93
+ props.push({
94
+ name: propName,
95
+ type: propType,
96
+ required: !isOptional,
97
+ options: options && options.length > 1 ? options : undefined,
98
+ });
99
+ }
100
+ return props;
101
+ }
102
+ it("should extract props from simple interface", () => {
103
+ const content = `
104
+ interface IButtonProps {
105
+ variant?: TButtonVariant;
106
+ size?: TButtonSize;
107
+ isDisabled?: boolean;
108
+ }
109
+ `;
110
+ const constArrays = new Map();
111
+ constArrays.set("variants", ["solid", "bordered"]);
112
+ constArrays.set("sizes", ["s", "m", "l"]);
113
+ const props = extractPropsFromInterface(content, "IButtonProps", constArrays);
114
+ expect(props).toHaveLength(3);
115
+ expect(props[0].name).toBe("variant");
116
+ expect(props[0].options).toEqual(["solid", "bordered"]);
117
+ expect(props[1].name).toBe("size");
118
+ expect(props[1].options).toEqual(["s", "m", "l"]);
119
+ expect(props[2].name).toBe("isDisabled");
120
+ expect(props[2].type).toBe("boolean");
121
+ });
122
+ it("should handle interface inheritance", () => {
123
+ const content = `
124
+ interface IBaseProps {
125
+ id?: string;
126
+ testId?: string;
127
+ }
128
+
129
+ interface IButtonProps extends IBaseProps {
130
+ variant?: string;
131
+ size?: string;
132
+ }
133
+ `;
134
+ const props = extractPropsFromInterface(content, "IButtonProps", new Map());
135
+ expect(props).toHaveLength(4);
136
+ expect(props.map((p) => p.name)).toContain("id");
137
+ expect(props.map((p) => p.name)).toContain("testId");
138
+ expect(props.map((p) => p.name)).toContain("variant");
139
+ expect(props.map((p) => p.name)).toContain("size");
140
+ });
141
+ it("should extract inline union types as options", () => {
142
+ const content = `
143
+ interface IButtonProps {
144
+ theme?: 'primary' | 'secondary' | 'danger';
145
+ size?: 's' | 'm' | 'l';
146
+ }
147
+ `;
148
+ const props = extractPropsFromInterface(content, "IButtonProps", new Map());
149
+ expect(props[0].options).toEqual(["primary", "secondary", "danger"]);
150
+ expect(props[1].options).toEqual(["s", "m", "l"]);
151
+ });
152
+ it("should skip callback props and children", () => {
153
+ const content = `
154
+ interface IButtonProps {
155
+ onClick?: () => void;
156
+ onHover?: (event: MouseEvent) => void;
157
+ children?: ReactNode;
158
+ className?: string;
159
+ label?: string;
160
+ }
161
+ `;
162
+ const props = extractPropsFromInterface(content, "IButtonProps", new Map());
163
+ expect(props).toHaveLength(1);
164
+ expect(props[0].name).toBe("label");
165
+ });
166
+ });
167
+ describe("React Parser - extractCallbacks", () => {
168
+ function extractCallbacks(content) {
169
+ const events = [];
170
+ const seenEvents = new Set();
171
+ const callbackPatterns = [
172
+ /(\bon[A-Z]\w*)\??:\s*\([^)]*\)\s*=>\s*\w+/g,
173
+ /(\bon[A-Z]\w*)\??:\s*\w*EventHandler/g,
174
+ ];
175
+ for (const pattern of callbackPatterns) {
176
+ let match;
177
+ while ((match = pattern.exec(content)) !== null) {
178
+ const eventName = match[1];
179
+ if (!seenEvents.has(eventName)) {
180
+ seenEvents.add(eventName);
181
+ events.push({
182
+ name: eventName,
183
+ description: `${eventName.replace(/^on/, "")} event callback`,
184
+ });
185
+ }
186
+ }
187
+ }
188
+ return events;
189
+ }
190
+ it("should extract callback props", () => {
191
+ const content = `
192
+ interface IButtonProps {
193
+ onClick?: () => void;
194
+ onHover?: (event: MouseEvent) => void;
195
+ onChange?: (value: string) => void;
196
+ }
197
+ `;
198
+ const callbacks = extractCallbacks(content);
199
+ expect(callbacks).toHaveLength(3);
200
+ expect(callbacks.map((c) => c.name)).toContain("onClick");
201
+ expect(callbacks.map((c) => c.name)).toContain("onHover");
202
+ expect(callbacks.map((c) => c.name)).toContain("onChange");
203
+ });
204
+ it("should extract EventHandler types", () => {
205
+ const content = `
206
+ interface IInputProps {
207
+ onFocus?: FocusEventHandler;
208
+ onBlur?: FocusEventHandler;
209
+ }
210
+ `;
211
+ const callbacks = extractCallbacks(content);
212
+ expect(callbacks).toHaveLength(2);
213
+ expect(callbacks.map((c) => c.name)).toContain("onFocus");
214
+ expect(callbacks.map((c) => c.name)).toContain("onBlur");
215
+ });
216
+ });
217
+ describe("React Parser - hasChildrenProp", () => {
218
+ function hasChildrenProp(content) {
219
+ return (content.includes("children") ||
220
+ content.includes("PropsWithChildren") ||
221
+ content.includes("ReactNode"));
222
+ }
223
+ it("should detect children prop", () => {
224
+ expect(hasChildrenProp("interface Props { children: ReactNode }")).toBe(true);
225
+ expect(hasChildrenProp("type Props = PropsWithChildren<{}>")).toBe(true);
226
+ expect(hasChildrenProp("interface Props { label: string }")).toBe(false);
227
+ });
228
+ });
229
+ describe("React Parser - inferCategory", () => {
230
+ function inferCategory(componentName) {
231
+ const name = componentName.toLowerCase();
232
+ if (["button", "link", "optionbutton"].some((n) => name.includes(n)))
233
+ return "action";
234
+ if (["input", "select", "checkbox", "radio", "toggle", "textarea", "field"].some((n) => name.includes(n)))
235
+ return "form";
236
+ if (["accordion", "breadcrumb", "menu", "pagination", "tabs"].some((n) => name.includes(n)))
237
+ return "navigation";
238
+ if (["badge", "flag", "loader", "modal", "notification", "progress", "tooltip"].some((n) => name.includes(n)))
239
+ return "feedback";
240
+ if (["card", "divider", "layer"].some((n) => name.includes(n)))
241
+ return "layout";
242
+ if (["table", "heading", "hero", "listbox", "rating", "tag"].some((n) => name.includes(n)))
243
+ return "data-display";
244
+ return "other";
245
+ }
246
+ it("should categorize action components", () => {
247
+ expect(inferCategory("Button")).toBe("action");
248
+ expect(inferCategory("Link")).toBe("action");
249
+ expect(inferCategory("OptionButton")).toBe("action");
250
+ });
251
+ it("should categorize form components", () => {
252
+ expect(inferCategory("Input")).toBe("form");
253
+ expect(inferCategory("TextInput")).toBe("form");
254
+ expect(inferCategory("Checkbox")).toBe("form");
255
+ expect(inferCategory("Select")).toBe("form");
256
+ expect(inferCategory("TextField")).toBe("form");
257
+ });
258
+ it("should categorize navigation components", () => {
259
+ expect(inferCategory("Breadcrumb")).toBe("navigation");
260
+ expect(inferCategory("Menu")).toBe("navigation");
261
+ expect(inferCategory("Tabs")).toBe("navigation");
262
+ });
263
+ it("should categorize feedback components", () => {
264
+ expect(inferCategory("Modal")).toBe("feedback");
265
+ expect(inferCategory("Notification")).toBe("feedback");
266
+ expect(inferCategory("Loader")).toBe("feedback");
267
+ expect(inferCategory("ProgressBar")).toBe("feedback");
268
+ });
269
+ it("should return other for unknown components", () => {
270
+ expect(inferCategory("CustomComponent")).toBe("other");
271
+ expect(inferCategory("MyWidget")).toBe("other");
272
+ });
273
+ });
274
+ //# sourceMappingURL=react-parser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-parser.test.js","sourceRoot":"","sources":["../../../src/parsers/__tests__/react-parser.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scss-parser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scss-parser.test.d.ts","sourceRoot":"","sources":["../../../src/parsers/__tests__/scss-parser.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,364 @@
1
+ import { describe, it, expect } from "vitest";
2
+ // Test CSS utility parsing logic
3
+ // Since parseCssUtilities requires filesystem, we test the utility generation logic directly
4
+ describe("SCSS Parser", () => {
5
+ describe("Flexy utility", () => {
6
+ const flexy = parseFlexyUtility();
7
+ it("returns correct name and slug", () => {
8
+ expect(flexy.name).toBe("Flexy");
9
+ expect(flexy.slug).toBe("flexy");
10
+ expect(flexy.category).toBe("layout");
11
+ });
12
+ it("includes base classes", () => {
13
+ expect(flexy.classes).toContain(".ml-flexy");
14
+ expect(flexy.classes).toContain(".ml-flexy__col");
15
+ });
16
+ it("includes modifier classes", () => {
17
+ expect(flexy.classes).toContain(".ml-flexy--gutter");
18
+ expect(flexy.classes).toContain(".ml-flexy--justify-center");
19
+ expect(flexy.classes).toContain(".ml-flexy--items-center");
20
+ });
21
+ it("includes responsive modifiers", () => {
22
+ expect(flexy.classes).toContain(".ml-flexy--justify-center@from-s");
23
+ expect(flexy.classes).toContain(".ml-flexy--justify-center@from-m");
24
+ expect(flexy.classes).toContain(".ml-flexy--justify-center@from-l");
25
+ expect(flexy.classes).toContain(".ml-flexy--justify-center@from-xl");
26
+ });
27
+ it("includes column width classes", () => {
28
+ expect(flexy.classes).toContain(".ml-flexy__col--1of2");
29
+ expect(flexy.classes).toContain(".ml-flexy__col--6of12");
30
+ expect(flexy.classes).toContain(".ml-flexy__col--4of12");
31
+ });
32
+ it("includes push classes", () => {
33
+ expect(flexy.classes).toContain(".ml-flexy__col--push-1of2");
34
+ expect(flexy.classes).toContain(".ml-flexy__col--push--reset");
35
+ });
36
+ it("includes responsive column classes", () => {
37
+ expect(flexy.classes).toContain(".ml-flexy__col--6of12@from-m");
38
+ expect(flexy.classes).toContain(".ml-flexy__col--full@from-l");
39
+ });
40
+ it("includes custom column classes", () => {
41
+ expect(flexy.classes).toContain(".ml-flexy__col--fill");
42
+ expect(flexy.classes).toContain(".ml-flexy__col--full");
43
+ expect(flexy.classes).toContain(".ml-flexy__col--grow");
44
+ });
45
+ it("has examples", () => {
46
+ expect(flexy.examples.length).toBeGreaterThan(0);
47
+ expect(flexy.examples[0].code).toContain("ml-flexy");
48
+ });
49
+ it("has description", () => {
50
+ expect(flexy.description).toBeDefined();
51
+ expect(flexy.description.length).toBeGreaterThan(10);
52
+ });
53
+ });
54
+ describe("Container utility", () => {
55
+ const container = parseContainerUtility();
56
+ it("returns correct name and slug", () => {
57
+ expect(container.name).toBe("Container");
58
+ expect(container.slug).toBe("container");
59
+ expect(container.category).toBe("layout");
60
+ });
61
+ it("includes base and fluid classes", () => {
62
+ expect(container.classes).toContain(".ml-container");
63
+ expect(container.classes).toContain(".ml-container--fluid");
64
+ });
65
+ it("includes responsive fluid modifiers", () => {
66
+ expect(container.classes).toContain(".ml-container--fluid@from-s");
67
+ expect(container.classes).toContain(".ml-container--fluid@from-m");
68
+ });
69
+ it("has examples", () => {
70
+ expect(container.examples.length).toBeGreaterThan(0);
71
+ });
72
+ });
73
+ describe("Margin utility", () => {
74
+ const margin = parseMarginUtility();
75
+ it("returns correct name and slug", () => {
76
+ expect(margin.name).toBe("Margin");
77
+ expect(margin.slug).toBe("margin");
78
+ expect(margin.category).toBe("utility");
79
+ });
80
+ it("includes all-sides margin classes", () => {
81
+ expect(margin.classes).toContain(".mu-m-100");
82
+ expect(margin.classes).toContain(".mu-m-200");
83
+ });
84
+ it("includes directional margin classes", () => {
85
+ expect(margin.classes).toContain(".mu-mt-100"); // top
86
+ expect(margin.classes).toContain(".mu-mr-100"); // right
87
+ expect(margin.classes).toContain(".mu-mb-100"); // bottom
88
+ expect(margin.classes).toContain(".mu-ml-100"); // left
89
+ });
90
+ it("includes vertical/horizontal margin classes", () => {
91
+ expect(margin.classes).toContain(".mu-mv-100"); // vertical
92
+ expect(margin.classes).toContain(".mu-mh-100"); // horizontal
93
+ });
94
+ it("includes various sizes", () => {
95
+ expect(margin.classes).toContain(".mu-m-025");
96
+ expect(margin.classes).toContain(".mu-m-050");
97
+ expect(margin.classes).toContain(".mu-m-500");
98
+ expect(margin.classes).toContain(".mu-m-1000");
99
+ });
100
+ it("has examples", () => {
101
+ expect(margin.examples.length).toBeGreaterThan(0);
102
+ expect(margin.examples[0].code).toContain("mu-m");
103
+ });
104
+ });
105
+ describe("Padding utility", () => {
106
+ const padding = parsePaddingUtility();
107
+ it("returns correct name and slug", () => {
108
+ expect(padding.name).toBe("Padding");
109
+ expect(padding.slug).toBe("padding");
110
+ expect(padding.category).toBe("utility");
111
+ });
112
+ it("includes all-sides padding classes", () => {
113
+ expect(padding.classes).toContain(".mu-p-100");
114
+ expect(padding.classes).toContain(".mu-p-200");
115
+ });
116
+ it("includes directional padding classes", () => {
117
+ expect(padding.classes).toContain(".mu-pt-100"); // top
118
+ expect(padding.classes).toContain(".mu-pr-100"); // right
119
+ expect(padding.classes).toContain(".mu-pb-100"); // bottom
120
+ expect(padding.classes).toContain(".mu-pl-100"); // left
121
+ });
122
+ it("includes vertical/horizontal padding classes", () => {
123
+ expect(padding.classes).toContain(".mu-pv-100"); // vertical
124
+ expect(padding.classes).toContain(".mu-ph-100"); // horizontal
125
+ });
126
+ it("has examples", () => {
127
+ expect(padding.examples.length).toBeGreaterThan(0);
128
+ expect(padding.examples[0].code).toContain("mu-p");
129
+ });
130
+ });
131
+ describe("Ratio utility", () => {
132
+ const ratio = parseRatioUtility();
133
+ it("returns correct name and slug", () => {
134
+ expect(ratio.name).toBe("Ratio");
135
+ expect(ratio.slug).toBe("ratio");
136
+ expect(ratio.category).toBe("utility");
137
+ });
138
+ it("includes base classes", () => {
139
+ expect(ratio.classes).toContain(".mu-ratio");
140
+ expect(ratio.classes).toContain(".mu-ratio__item");
141
+ });
142
+ it("includes aspect ratio modifiers", () => {
143
+ expect(ratio.classes).toContain(".mu-ratio--1x1");
144
+ expect(ratio.classes).toContain(".mu-ratio--16x9");
145
+ expect(ratio.classes).toContain(".mu-ratio--4x3");
146
+ expect(ratio.classes).toContain(".mu-ratio--3x2");
147
+ });
148
+ it("has examples", () => {
149
+ expect(ratio.examples.length).toBeGreaterThan(0);
150
+ expect(ratio.examples[0].code).toContain("mu-ratio");
151
+ });
152
+ });
153
+ describe("Scroll utility", () => {
154
+ const scroll = parseScrollUtility();
155
+ it("returns correct name and slug", () => {
156
+ expect(scroll.name).toBe("Scroll");
157
+ expect(scroll.slug).toBe("scroll");
158
+ expect(scroll.category).toBe("utility");
159
+ });
160
+ it("includes prevent body scroll class", () => {
161
+ expect(scroll.classes).toContain(".mu-prevent-body-scroll");
162
+ });
163
+ it("has examples", () => {
164
+ expect(scroll.examples.length).toBeGreaterThan(0);
165
+ });
166
+ });
167
+ });
168
+ // Reimplemented utility functions for testing
169
+ const MAJOR_SCREENS = ["s", "m", "l", "xl"];
170
+ const SIZES = [
171
+ "025",
172
+ "050",
173
+ "075",
174
+ "100",
175
+ "125",
176
+ "150",
177
+ "200",
178
+ "250",
179
+ "300",
180
+ "350",
181
+ "400",
182
+ "500",
183
+ "600",
184
+ "700",
185
+ "800",
186
+ "900",
187
+ "1000",
188
+ ];
189
+ const SIDES = {
190
+ t: "top",
191
+ r: "right",
192
+ l: "left",
193
+ b: "bottom",
194
+ all: "all",
195
+ v: "vertical",
196
+ h: "horizontal",
197
+ };
198
+ const ASPECT_RATIOS = ["1x1", "2x3", "3x2", "3x4", "4x3", "16x9"];
199
+ function parseFlexyUtility() {
200
+ const classes = [];
201
+ classes.push(".ml-flexy");
202
+ classes.push(".ml-flexy__col");
203
+ const modifiers = [
204
+ "gutter",
205
+ "space-around",
206
+ "justify-between",
207
+ "justify-evenly",
208
+ "justify-start",
209
+ "justify-center",
210
+ "justify-end",
211
+ "items-stretch",
212
+ "items-start",
213
+ "items-center",
214
+ "items-end",
215
+ ];
216
+ for (const mod of modifiers) {
217
+ classes.push(`.ml-flexy--${mod}`);
218
+ }
219
+ const responsiveModifiers = [
220
+ "space-around",
221
+ "justify-between",
222
+ "justify-evenly",
223
+ "justify-start",
224
+ "justify-center",
225
+ "justify-end",
226
+ ];
227
+ for (const screen of MAJOR_SCREENS) {
228
+ for (const mod of responsiveModifiers) {
229
+ classes.push(`.ml-flexy--${mod}@from-${screen}`);
230
+ }
231
+ }
232
+ const fractions = [
233
+ [1, 2],
234
+ [1, 3],
235
+ [2, 3],
236
+ [1, 4],
237
+ [3, 4],
238
+ [1, 6],
239
+ [5, 6],
240
+ [1, 12],
241
+ [2, 12],
242
+ [3, 12],
243
+ [4, 12],
244
+ [5, 12],
245
+ [6, 12],
246
+ [7, 12],
247
+ [8, 12],
248
+ [9, 12],
249
+ [10, 12],
250
+ [11, 12],
251
+ ];
252
+ for (const [num, denom] of fractions) {
253
+ classes.push(`.ml-flexy__col--${num}of${denom}`);
254
+ classes.push(`.ml-flexy__col--push-${num}of${denom}`);
255
+ for (const screen of MAJOR_SCREENS) {
256
+ classes.push(`.ml-flexy__col--${num}of${denom}@from-${screen}`);
257
+ classes.push(`.ml-flexy__col--push-${num}of${denom}@from-${screen}`);
258
+ }
259
+ }
260
+ const customCols = ["fill", "full", "initial", "grow", "first", "last"];
261
+ for (const col of customCols) {
262
+ classes.push(`.ml-flexy__col--${col}`);
263
+ for (const screen of MAJOR_SCREENS) {
264
+ classes.push(`.ml-flexy__col--${col}@from-${screen}`);
265
+ }
266
+ }
267
+ classes.push(".ml-flexy__col--push--reset");
268
+ for (const screen of MAJOR_SCREENS) {
269
+ classes.push(`.ml-flexy__col--push--reset@from-${screen}`);
270
+ }
271
+ return {
272
+ name: "Flexy",
273
+ slug: "flexy",
274
+ category: "layout",
275
+ description: "Flexbox-based grid system for creating responsive layouts.",
276
+ classes,
277
+ examples: [{ title: "Basic", code: '<div class="ml-flexy"></div>' }],
278
+ };
279
+ }
280
+ function parseContainerUtility() {
281
+ const classes = [];
282
+ classes.push(".ml-container");
283
+ classes.push(".ml-container--fluid");
284
+ for (const screen of MAJOR_SCREENS) {
285
+ classes.push(`.ml-container--fluid@from-${screen}`);
286
+ }
287
+ return {
288
+ name: "Container",
289
+ slug: "container",
290
+ category: "layout",
291
+ description: "Responsive container with max-width.",
292
+ classes,
293
+ examples: [{ title: "Basic", code: '<div class="ml-container"></div>' }],
294
+ };
295
+ }
296
+ function parseMarginUtility() {
297
+ const classes = [];
298
+ for (const [sideKey] of Object.entries(SIDES)) {
299
+ for (const size of SIZES) {
300
+ if (sideKey === "all") {
301
+ classes.push(`.mu-m-${size}`);
302
+ }
303
+ else {
304
+ classes.push(`.mu-m${sideKey}-${size}`);
305
+ }
306
+ }
307
+ }
308
+ return {
309
+ name: "Margin",
310
+ slug: "margin",
311
+ category: "utility",
312
+ description: "Margin utility classes.",
313
+ classes,
314
+ examples: [{ title: "Margin", code: '<div class="mu-m-100"></div>' }],
315
+ };
316
+ }
317
+ function parsePaddingUtility() {
318
+ const classes = [];
319
+ for (const [sideKey] of Object.entries(SIDES)) {
320
+ for (const size of SIZES) {
321
+ if (sideKey === "all") {
322
+ classes.push(`.mu-p-${size}`);
323
+ }
324
+ else {
325
+ classes.push(`.mu-p${sideKey}-${size}`);
326
+ }
327
+ }
328
+ }
329
+ return {
330
+ name: "Padding",
331
+ slug: "padding",
332
+ category: "utility",
333
+ description: "Padding utility classes.",
334
+ classes,
335
+ examples: [{ title: "Padding", code: '<div class="mu-p-100"></div>' }],
336
+ };
337
+ }
338
+ function parseRatioUtility() {
339
+ const classes = [];
340
+ classes.push(".mu-ratio");
341
+ classes.push(".mu-ratio__item");
342
+ for (const ratio of ASPECT_RATIOS) {
343
+ classes.push(`.mu-ratio--${ratio}`);
344
+ }
345
+ return {
346
+ name: "Ratio",
347
+ slug: "ratio",
348
+ category: "utility",
349
+ description: "Aspect ratio utilities.",
350
+ classes,
351
+ examples: [{ title: "Ratio", code: '<div class="mu-ratio mu-ratio--16x9"></div>' }],
352
+ };
353
+ }
354
+ function parseScrollUtility() {
355
+ return {
356
+ name: "Scroll",
357
+ slug: "scroll",
358
+ category: "utility",
359
+ description: "Scroll utility.",
360
+ classes: [".mu-prevent-body-scroll"],
361
+ examples: [{ title: "Scroll", code: '<html class="mu-prevent-body-scroll">' }],
362
+ };
363
+ }
364
+ //# sourceMappingURL=scss-parser.test.js.map