tailwindcss-docs-mcp 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.
- package/LICENSE +21 -0
- package/README.md +159 -0
- package/dist/auto-index.d.ts +21 -0
- package/dist/auto-index.d.ts.map +1 -0
- package/dist/auto-index.js +27 -0
- package/dist/auto-index.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +67 -0
- package/dist/index.js.map +1 -0
- package/dist/pipeline/chunker.d.ts +61 -0
- package/dist/pipeline/chunker.d.ts.map +1 -0
- package/dist/pipeline/chunker.js +162 -0
- package/dist/pipeline/chunker.js.map +1 -0
- package/dist/pipeline/embedder.d.ts +57 -0
- package/dist/pipeline/embedder.d.ts.map +1 -0
- package/dist/pipeline/embedder.js +108 -0
- package/dist/pipeline/embedder.js.map +1 -0
- package/dist/pipeline/fetcher.d.ts +63 -0
- package/dist/pipeline/fetcher.d.ts.map +1 -0
- package/dist/pipeline/fetcher.js +128 -0
- package/dist/pipeline/fetcher.js.map +1 -0
- package/dist/pipeline/parser.d.ts +73 -0
- package/dist/pipeline/parser.d.ts.map +1 -0
- package/dist/pipeline/parser.js +127 -0
- package/dist/pipeline/parser.js.map +1 -0
- package/dist/server.d.ts +47 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +141 -0
- package/dist/server.js.map +1 -0
- package/dist/storage/database.d.ts +90 -0
- package/dist/storage/database.d.ts.map +1 -0
- package/dist/storage/database.js +342 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/search.d.ts +84 -0
- package/dist/storage/search.d.ts.map +1 -0
- package/dist/storage/search.js +165 -0
- package/dist/storage/search.js.map +1 -0
- package/dist/tools/check-status.d.ts +35 -0
- package/dist/tools/check-status.d.ts.map +1 -0
- package/dist/tools/check-status.js +40 -0
- package/dist/tools/check-status.js.map +1 -0
- package/dist/tools/fetch-docs.d.ts +42 -0
- package/dist/tools/fetch-docs.d.ts.map +1 -0
- package/dist/tools/fetch-docs.js +98 -0
- package/dist/tools/fetch-docs.js.map +1 -0
- package/dist/tools/list-utilities.d.ts +49 -0
- package/dist/tools/list-utilities.d.ts.map +1 -0
- package/dist/tools/list-utilities.js +63 -0
- package/dist/tools/list-utilities.js.map +1 -0
- package/dist/tools/search-docs.d.ts +44 -0
- package/dist/tools/search-docs.d.ts.map +1 -0
- package/dist/tools/search-docs.js +53 -0
- package/dist/tools/search-docs.js.map +1 -0
- package/dist/utils/categories.d.ts +25 -0
- package/dist/utils/categories.d.ts.map +1 -0
- package/dist/utils/categories.js +240 -0
- package/dist/utils/categories.js.map +1 -0
- package/dist/utils/config.d.ts +39 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +37 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/query-expansion.d.ts +28 -0
- package/dist/utils/query-expansion.d.ts.map +1 -0
- package/dist/utils/query-expansion.js +147 -0
- package/dist/utils/query-expansion.js.map +1 -0
- package/dist/utils/similarity.d.ts +12 -0
- package/dist/utils/similarity.d.ts.map +1 -0
- package/dist/utils/similarity.js +28 -0
- package/dist/utils/similarity.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { Embedder } from "../pipeline/embedder.js";
|
|
2
|
+
import type { Database } from "../storage/database.js";
|
|
3
|
+
import { type SearchResult } from "../storage/search.js";
|
|
4
|
+
import type { TailwindVersion } from "../utils/config.js";
|
|
5
|
+
/**
|
|
6
|
+
* Input parameters for the search_docs MCP tool.
|
|
7
|
+
*/
|
|
8
|
+
export interface SearchDocsInput {
|
|
9
|
+
/** Natural language search query */
|
|
10
|
+
query: string;
|
|
11
|
+
/** Tailwind CSS major version to search (default: "v4") */
|
|
12
|
+
version?: TailwindVersion;
|
|
13
|
+
/** Maximum number of results (default: 5, min: 1, max: 20) */
|
|
14
|
+
limit?: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Result from the search_docs handler, including metadata about index state.
|
|
18
|
+
*/
|
|
19
|
+
export interface SearchDocsResult {
|
|
20
|
+
results: SearchResult[];
|
|
21
|
+
notIndexed: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Handle the `search_docs` MCP tool call.
|
|
25
|
+
*
|
|
26
|
+
* Performs hybrid semantic + keyword search:
|
|
27
|
+
* 1. Embed the query (with snowflake-arctic-embed-xs query prefix)
|
|
28
|
+
* 2. Cosine similarity against in-memory chunk embeddings
|
|
29
|
+
* 3. FTS5 keyword search for exact class names
|
|
30
|
+
* 4. Merge, deduplicate, and rank results
|
|
31
|
+
*
|
|
32
|
+
* Returns an error message if the index has not been built yet.
|
|
33
|
+
*/
|
|
34
|
+
export declare function handleSearchDocs(input: SearchDocsInput, db: Database, embedder: Embedder, defaultVersion: TailwindVersion): Promise<SearchDocsResult>;
|
|
35
|
+
/**
|
|
36
|
+
* Format search results as markdown for LLM consumption.
|
|
37
|
+
*
|
|
38
|
+
* Each result includes:
|
|
39
|
+
* - Heading breadcrumb
|
|
40
|
+
* - Content snippet
|
|
41
|
+
* - Deep link to tailwindcss.com
|
|
42
|
+
*/
|
|
43
|
+
export declare function formatSearchResults(result: SearchDocsResult): string;
|
|
44
|
+
//# sourceMappingURL=search-docs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-docs.d.ts","sourceRoot":"","sources":["../../src/tools/search-docs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,KAAK,YAAY,EAAgB,MAAM,sBAAsB,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,eAAe,EACtB,EAAE,EAAE,QAAQ,EACZ,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,eAAe,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAiB3B;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAoBpE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { hybridSearch } from "../storage/search.js";
|
|
2
|
+
/**
|
|
3
|
+
* Handle the `search_docs` MCP tool call.
|
|
4
|
+
*
|
|
5
|
+
* Performs hybrid semantic + keyword search:
|
|
6
|
+
* 1. Embed the query (with snowflake-arctic-embed-xs query prefix)
|
|
7
|
+
* 2. Cosine similarity against in-memory chunk embeddings
|
|
8
|
+
* 3. FTS5 keyword search for exact class names
|
|
9
|
+
* 4. Merge, deduplicate, and rank results
|
|
10
|
+
*
|
|
11
|
+
* Returns an error message if the index has not been built yet.
|
|
12
|
+
*/
|
|
13
|
+
export async function handleSearchDocs(input, db, embedder, defaultVersion) {
|
|
14
|
+
const version = input.version ?? defaultVersion;
|
|
15
|
+
const limit = Math.min(Math.max(input.limit ?? 5, 1), 20);
|
|
16
|
+
// Check if index exists
|
|
17
|
+
const status = db.getIndexStatus(version);
|
|
18
|
+
if (status.length === 0) {
|
|
19
|
+
return { results: [], notIndexed: true };
|
|
20
|
+
}
|
|
21
|
+
const results = await hybridSearch(db, embedder, {
|
|
22
|
+
query: input.query,
|
|
23
|
+
version,
|
|
24
|
+
limit,
|
|
25
|
+
});
|
|
26
|
+
return { results, notIndexed: false };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Format search results as markdown for LLM consumption.
|
|
30
|
+
*
|
|
31
|
+
* Each result includes:
|
|
32
|
+
* - Heading breadcrumb
|
|
33
|
+
* - Content snippet
|
|
34
|
+
* - Deep link to tailwindcss.com
|
|
35
|
+
*/
|
|
36
|
+
export function formatSearchResults(result) {
|
|
37
|
+
if (result.notIndexed) {
|
|
38
|
+
return "Index not built for this version. Run fetch_docs first.";
|
|
39
|
+
}
|
|
40
|
+
if (result.results.length === 0) {
|
|
41
|
+
return "No results found for this query.";
|
|
42
|
+
}
|
|
43
|
+
const lines = [];
|
|
44
|
+
for (let i = 0; i < result.results.length; i++) {
|
|
45
|
+
const r = result.results[i];
|
|
46
|
+
lines.push(`## ${i + 1}. ${r.docTitle} — ${r.heading}`);
|
|
47
|
+
lines.push(`[View on tailwindcss.com](${r.url})\n`);
|
|
48
|
+
lines.push(r.content);
|
|
49
|
+
lines.push("");
|
|
50
|
+
}
|
|
51
|
+
return lines.join("\n");
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=search-docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-docs.js","sourceRoot":"","sources":["../../src/tools/search-docs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAuBvE;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAsB,EACtB,EAAY,EACZ,QAAkB,EAClB,cAA+B;IAE/B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,cAAc,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE1D,wBAAwB;IACxB,MAAM,MAAM,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE;QAC/C,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO;QACP,KAAK;KACN,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AACxC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAwB;IAC1D,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,yDAAyD,CAAC;IACnE,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,kCAAkC,CAAC;IAC5C,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A single utility category with its documentation pages.
|
|
3
|
+
*/
|
|
4
|
+
export interface UtilityCategory {
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
slugs: string[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Tailwind CSS utility categories mapped from the official documentation structure.
|
|
11
|
+
*
|
|
12
|
+
* Each category groups related utility classes by their purpose.
|
|
13
|
+
* Slugs correspond to documentation page slugs (e.g., "padding" -> tailwindcss.com/docs/padding).
|
|
14
|
+
*/
|
|
15
|
+
export declare const UTILITY_CATEGORIES: UtilityCategory[];
|
|
16
|
+
/**
|
|
17
|
+
* Find a category by name (case-insensitive).
|
|
18
|
+
*/
|
|
19
|
+
export declare function findCategory(name: string): UtilityCategory | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Find which category a doc slug belongs to.
|
|
22
|
+
* @internal Used only in tests.
|
|
23
|
+
*/
|
|
24
|
+
export declare function categoryForSlug(slug: string): UtilityCategory | undefined;
|
|
25
|
+
//# sourceMappingURL=categories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"categories.d.ts","sourceRoot":"","sources":["../../src/utils/categories.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,eAAe,EA0N/C,CAAC;AAEF;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAGtE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAEzE"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tailwind CSS utility categories mapped from the official documentation structure.
|
|
3
|
+
*
|
|
4
|
+
* Each category groups related utility classes by their purpose.
|
|
5
|
+
* Slugs correspond to documentation page slugs (e.g., "padding" -> tailwindcss.com/docs/padding).
|
|
6
|
+
*/
|
|
7
|
+
export const UTILITY_CATEGORIES = [
|
|
8
|
+
{
|
|
9
|
+
name: "Layout",
|
|
10
|
+
description: "Utilities for controlling layout behavior: display, position, overflow, z-index",
|
|
11
|
+
slugs: [
|
|
12
|
+
"aspect-ratio",
|
|
13
|
+
"container",
|
|
14
|
+
"columns",
|
|
15
|
+
"break-after",
|
|
16
|
+
"break-before",
|
|
17
|
+
"break-inside",
|
|
18
|
+
"box-decoration-break",
|
|
19
|
+
"box-sizing",
|
|
20
|
+
"display",
|
|
21
|
+
"float",
|
|
22
|
+
"clear",
|
|
23
|
+
"isolation",
|
|
24
|
+
"object-fit",
|
|
25
|
+
"object-position",
|
|
26
|
+
"overflow",
|
|
27
|
+
"overscroll-behavior",
|
|
28
|
+
"position",
|
|
29
|
+
"top-right-bottom-left",
|
|
30
|
+
"visibility",
|
|
31
|
+
"z-index",
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: "Flexbox & Grid",
|
|
36
|
+
description: "Utilities for flexbox and CSS grid layouts",
|
|
37
|
+
slugs: [
|
|
38
|
+
"flex-basis",
|
|
39
|
+
"flex-direction",
|
|
40
|
+
"flex-wrap",
|
|
41
|
+
"flex",
|
|
42
|
+
"flex-grow",
|
|
43
|
+
"flex-shrink",
|
|
44
|
+
"order",
|
|
45
|
+
"grid-template-columns",
|
|
46
|
+
"grid-column",
|
|
47
|
+
"grid-template-rows",
|
|
48
|
+
"grid-row",
|
|
49
|
+
"grid-auto-flow",
|
|
50
|
+
"grid-auto-columns",
|
|
51
|
+
"grid-auto-rows",
|
|
52
|
+
"gap",
|
|
53
|
+
"justify-content",
|
|
54
|
+
"justify-items",
|
|
55
|
+
"justify-self",
|
|
56
|
+
"align-content",
|
|
57
|
+
"align-items",
|
|
58
|
+
"align-self",
|
|
59
|
+
"place-content",
|
|
60
|
+
"place-items",
|
|
61
|
+
"place-self",
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: "Spacing",
|
|
66
|
+
description: "Utilities for padding, margin, and space between elements",
|
|
67
|
+
slugs: ["padding", "margin", "space"],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: "Sizing",
|
|
71
|
+
description: "Utilities for width, height, and min/max sizing",
|
|
72
|
+
slugs: ["width", "min-width", "max-width", "height", "min-height", "max-height", "size"],
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: "Typography",
|
|
76
|
+
description: "Utilities for font, text, and content styling",
|
|
77
|
+
slugs: [
|
|
78
|
+
"font-family",
|
|
79
|
+
"font-size",
|
|
80
|
+
"font-smoothing",
|
|
81
|
+
"font-style",
|
|
82
|
+
"font-weight",
|
|
83
|
+
"font-variant-numeric",
|
|
84
|
+
"letter-spacing",
|
|
85
|
+
"line-clamp",
|
|
86
|
+
"line-height",
|
|
87
|
+
"list-style-image",
|
|
88
|
+
"list-style-position",
|
|
89
|
+
"list-style-type",
|
|
90
|
+
"text-align",
|
|
91
|
+
"text-color",
|
|
92
|
+
"text-decoration",
|
|
93
|
+
"text-decoration-color",
|
|
94
|
+
"text-decoration-style",
|
|
95
|
+
"text-decoration-thickness",
|
|
96
|
+
"text-underline-offset",
|
|
97
|
+
"text-transform",
|
|
98
|
+
"text-overflow",
|
|
99
|
+
"text-wrap",
|
|
100
|
+
"text-indent",
|
|
101
|
+
"vertical-align",
|
|
102
|
+
"whitespace",
|
|
103
|
+
"word-break",
|
|
104
|
+
"hyphens",
|
|
105
|
+
"content",
|
|
106
|
+
],
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: "Backgrounds",
|
|
110
|
+
description: "Utilities for background colors, images, gradients, and positioning",
|
|
111
|
+
slugs: [
|
|
112
|
+
"background-attachment",
|
|
113
|
+
"background-clip",
|
|
114
|
+
"background-color",
|
|
115
|
+
"background-origin",
|
|
116
|
+
"background-position",
|
|
117
|
+
"background-repeat",
|
|
118
|
+
"background-size",
|
|
119
|
+
"background-image",
|
|
120
|
+
"gradient-color-stops",
|
|
121
|
+
],
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: "Borders",
|
|
125
|
+
description: "Utilities for border width, color, style, and radius",
|
|
126
|
+
slugs: [
|
|
127
|
+
"border-radius",
|
|
128
|
+
"border-width",
|
|
129
|
+
"border-color",
|
|
130
|
+
"border-style",
|
|
131
|
+
"divide-width",
|
|
132
|
+
"divide-color",
|
|
133
|
+
"divide-style",
|
|
134
|
+
"outline-width",
|
|
135
|
+
"outline-color",
|
|
136
|
+
"outline-style",
|
|
137
|
+
"outline-offset",
|
|
138
|
+
"ring-width",
|
|
139
|
+
"ring-color",
|
|
140
|
+
"ring-offset-width",
|
|
141
|
+
"ring-offset-color",
|
|
142
|
+
],
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
name: "Effects",
|
|
146
|
+
description: "Utilities for shadows, opacity, and blend modes",
|
|
147
|
+
slugs: ["box-shadow", "box-shadow-color", "opacity", "mix-blend-mode", "background-blend-mode"],
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
name: "Filters",
|
|
151
|
+
description: "Utilities for blur, brightness, contrast, and other filters",
|
|
152
|
+
slugs: [
|
|
153
|
+
"blur",
|
|
154
|
+
"brightness",
|
|
155
|
+
"contrast",
|
|
156
|
+
"drop-shadow",
|
|
157
|
+
"grayscale",
|
|
158
|
+
"hue-rotate",
|
|
159
|
+
"invert",
|
|
160
|
+
"saturate",
|
|
161
|
+
"sepia",
|
|
162
|
+
"backdrop-blur",
|
|
163
|
+
"backdrop-brightness",
|
|
164
|
+
"backdrop-contrast",
|
|
165
|
+
"backdrop-grayscale",
|
|
166
|
+
"backdrop-hue-rotate",
|
|
167
|
+
"backdrop-invert",
|
|
168
|
+
"backdrop-opacity",
|
|
169
|
+
"backdrop-saturate",
|
|
170
|
+
"backdrop-sepia",
|
|
171
|
+
],
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
name: "Tables",
|
|
175
|
+
description: "Utilities for table layout and border behavior",
|
|
176
|
+
slugs: ["border-collapse", "border-spacing", "table-layout", "caption-side"],
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
name: "Transitions & Animation",
|
|
180
|
+
description: "Utilities for transitions, transforms, and animations",
|
|
181
|
+
slugs: [
|
|
182
|
+
"transition-property",
|
|
183
|
+
"transition-duration",
|
|
184
|
+
"transition-timing-function",
|
|
185
|
+
"transition-delay",
|
|
186
|
+
"animation",
|
|
187
|
+
],
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
name: "Transforms",
|
|
191
|
+
description: "Utilities for scale, rotate, translate, and skew",
|
|
192
|
+
slugs: ["scale", "rotate", "translate", "skew", "transform-origin"],
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
name: "Interactivity",
|
|
196
|
+
description: "Utilities for cursor, user select, scroll behavior, and pointer events",
|
|
197
|
+
slugs: [
|
|
198
|
+
"accent-color",
|
|
199
|
+
"appearance",
|
|
200
|
+
"cursor",
|
|
201
|
+
"caret-color",
|
|
202
|
+
"pointer-events",
|
|
203
|
+
"resize",
|
|
204
|
+
"scroll-behavior",
|
|
205
|
+
"scroll-margin",
|
|
206
|
+
"scroll-padding",
|
|
207
|
+
"scroll-snap-align",
|
|
208
|
+
"scroll-snap-stop",
|
|
209
|
+
"scroll-snap-type",
|
|
210
|
+
"touch-action",
|
|
211
|
+
"user-select",
|
|
212
|
+
"will-change",
|
|
213
|
+
],
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
name: "SVG",
|
|
217
|
+
description: "Utilities for SVG fill and stroke",
|
|
218
|
+
slugs: ["fill", "stroke", "stroke-width"],
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
name: "Accessibility",
|
|
222
|
+
description: "Utilities for screen readers",
|
|
223
|
+
slugs: ["screen-readers"],
|
|
224
|
+
},
|
|
225
|
+
];
|
|
226
|
+
/**
|
|
227
|
+
* Find a category by name (case-insensitive).
|
|
228
|
+
*/
|
|
229
|
+
export function findCategory(name) {
|
|
230
|
+
const lower = name.toLowerCase();
|
|
231
|
+
return UTILITY_CATEGORIES.find((c) => c.name.toLowerCase() === lower);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Find which category a doc slug belongs to.
|
|
235
|
+
* @internal Used only in tests.
|
|
236
|
+
*/
|
|
237
|
+
export function categoryForSlug(slug) {
|
|
238
|
+
return UTILITY_CATEGORIES.find((c) => c.slugs.includes(slug));
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=categories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"categories.js","sourceRoot":"","sources":["../../src/utils/categories.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tailwind CSS version identifiers.
|
|
3
|
+
*/
|
|
4
|
+
export type TailwindVersion = "v3" | "v4";
|
|
5
|
+
/**
|
|
6
|
+
* Application configuration derived from environment variables and defaults.
|
|
7
|
+
*/
|
|
8
|
+
export interface Config {
|
|
9
|
+
/** Root data directory for the MCP server */
|
|
10
|
+
dataDir: string;
|
|
11
|
+
/** Path to the SQLite database file */
|
|
12
|
+
dbPath: string;
|
|
13
|
+
/** Directory for cached raw MDX files */
|
|
14
|
+
rawDir: string;
|
|
15
|
+
/** Default Tailwind CSS version */
|
|
16
|
+
defaultVersion: TailwindVersion;
|
|
17
|
+
/** Embedding model identifier */
|
|
18
|
+
embeddingModel: string;
|
|
19
|
+
/** Embedding vector dimensions */
|
|
20
|
+
embeddingDimensions: number;
|
|
21
|
+
/** Query prefix required by snowflake-arctic-embed-xs */
|
|
22
|
+
queryPrefix: string;
|
|
23
|
+
/** Directory for cached ONNX model files */
|
|
24
|
+
modelCacheDir: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Version-to-branch mapping for the tailwindcss.com repository.
|
|
28
|
+
*/
|
|
29
|
+
export declare const VERSION_BRANCH_MAP: Record<TailwindVersion, string>;
|
|
30
|
+
/**
|
|
31
|
+
* GitHub repository details for Tailwind CSS documentation.
|
|
32
|
+
*/
|
|
33
|
+
export declare const GITHUB_REPO: {
|
|
34
|
+
readonly owner: "tailwindlabs";
|
|
35
|
+
readonly repo: "tailwindcss.com";
|
|
36
|
+
readonly docsPath: "src/pages/docs";
|
|
37
|
+
};
|
|
38
|
+
export declare function loadConfig(): Config;
|
|
39
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,cAAc,EAAE,eAAe,CAAC;IAChC,iCAAiC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAG9D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW;;;;CAId,CAAC;AAOX,wBAAgB,UAAU,IAAI,MAAM,CAgBnC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Version-to-branch mapping for the tailwindcss.com repository.
|
|
5
|
+
*/
|
|
6
|
+
export const VERSION_BRANCH_MAP = {
|
|
7
|
+
v3: "master",
|
|
8
|
+
v4: "next",
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* GitHub repository details for Tailwind CSS documentation.
|
|
12
|
+
*/
|
|
13
|
+
export const GITHUB_REPO = {
|
|
14
|
+
owner: "tailwindlabs",
|
|
15
|
+
repo: "tailwindcss.com",
|
|
16
|
+
docsPath: "src/pages/docs",
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Load configuration from environment variables with defaults.
|
|
20
|
+
*/
|
|
21
|
+
const VALID_VERSIONS = new Set(["v3", "v4"]);
|
|
22
|
+
export function loadConfig() {
|
|
23
|
+
const dataDir = process.env.TAILWIND_DOCS_MCP_PATH ?? join(homedir(), ".tailwindcss-docs-mcp");
|
|
24
|
+
const envVersion = process.env.TAILWIND_DOCS_MCP_DEFAULT_VERSION;
|
|
25
|
+
const defaultVersion = envVersion && VALID_VERSIONS.has(envVersion) ? envVersion : "v4";
|
|
26
|
+
return {
|
|
27
|
+
dataDir,
|
|
28
|
+
dbPath: join(dataDir, "docs.db"),
|
|
29
|
+
rawDir: join(dataDir, "raw"),
|
|
30
|
+
defaultVersion,
|
|
31
|
+
embeddingModel: "Snowflake/snowflake-arctic-embed-xs",
|
|
32
|
+
embeddingDimensions: 384,
|
|
33
|
+
queryPrefix: "Represent this sentence for searching relevant passages: ",
|
|
34
|
+
modelCacheDir: join(dataDir, "models"),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA6BjC;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAoC;IACjE,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,MAAM;CACX,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,KAAK,EAAE,cAAc;IACrB,IAAI,EAAE,iBAAiB;IACvB,QAAQ,EAAE,gBAAgB;CAClB,CAAC;AAEX;;GAEG;AACH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAErD,MAAM,UAAU,UAAU;IACxB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,uBAAuB,CAAC,CAAC;IAC/F,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC;IACjE,MAAM,cAAc,GAClB,UAAU,IAAI,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAE,UAA8B,CAAC,CAAC,CAAC,IAAI,CAAC;IAExF,OAAO;QACL,OAAO;QACP,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;QAChC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;QAC5B,cAAc;QACd,cAAc,EAAE,qCAAqC;QACrD,mBAAmB,EAAE,GAAG;QACxB,WAAW,EAAE,2DAA2D;QACxE,aAAa,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;KACvC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query expansion for Tailwind CSS class name queries.
|
|
3
|
+
*
|
|
4
|
+
* Detects Tailwind class names in search queries and appends their canonical
|
|
5
|
+
* CSS property names. This bridges the vocabulary gap between abbreviated
|
|
6
|
+
* class prefixes (e.g., "mx-auto") and documentation titles (e.g., "Margin").
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Expand a search query by mapping detected Tailwind class name prefixes
|
|
10
|
+
* to their canonical CSS property names.
|
|
11
|
+
*
|
|
12
|
+
* Expansion terms are appended to the original query, preserving all original
|
|
13
|
+
* tokens. Duplicate terms (already present in the query) are not added.
|
|
14
|
+
*
|
|
15
|
+
* Returns the original query unchanged when no Tailwind class names are detected.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* expandQuery("tailwind text-lg class")
|
|
19
|
+
* // → "tailwind text-lg class font size"
|
|
20
|
+
*
|
|
21
|
+
* expandQuery("mx-auto centering")
|
|
22
|
+
* // → "mx-auto centering margin"
|
|
23
|
+
*
|
|
24
|
+
* expandQuery("how to center a div")
|
|
25
|
+
* // → "how to center a div" (unchanged — no class names)
|
|
26
|
+
*/
|
|
27
|
+
export declare function expandQuery(query: string): string;
|
|
28
|
+
//# sourceMappingURL=query-expansion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-expansion.d.ts","sourceRoot":"","sources":["../../src/utils/query-expansion.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmHH;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAsBjD"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query expansion for Tailwind CSS class name queries.
|
|
3
|
+
*
|
|
4
|
+
* Detects Tailwind class names in search queries and appends their canonical
|
|
5
|
+
* CSS property names. This bridges the vocabulary gap between abbreviated
|
|
6
|
+
* class prefixes (e.g., "mx-auto") and documentation titles (e.g., "Margin").
|
|
7
|
+
*/
|
|
8
|
+
/** Regex to detect Tailwind class names: hyphenated lowercase tokens like text-lg, grid-cols-3 */
|
|
9
|
+
const TAILWIND_CLASS_RE = /\b[a-z]+(?:-[a-z0-9]+)+\b/g;
|
|
10
|
+
/** Font size suffixes used by Tailwind's text-{size} utilities */
|
|
11
|
+
const TEXT_SIZE_RE = /^text-(xs|sm|base|lg|xl|\d+xl)$/;
|
|
12
|
+
/** Color name prefixes used by Tailwind's text-{color} utilities */
|
|
13
|
+
const TEXT_COLOR_RE = /^text-(inherit|current|transparent|black|white|slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)/;
|
|
14
|
+
/**
|
|
15
|
+
* Map of Tailwind class prefixes to their CSS property expansion terms.
|
|
16
|
+
* Each value is a space-separated string of terms to append to the query.
|
|
17
|
+
*/
|
|
18
|
+
const PREFIX_MAP = new Map([
|
|
19
|
+
// ── Multi-segment prefixes ─────────────────────────────────────
|
|
20
|
+
["grid-cols", "grid template columns"],
|
|
21
|
+
["grid-rows", "grid template rows"],
|
|
22
|
+
["auto-cols", "grid auto columns"],
|
|
23
|
+
["auto-rows", "grid auto rows"],
|
|
24
|
+
["col-span", "grid column"],
|
|
25
|
+
["row-span", "grid row"],
|
|
26
|
+
["space-x", "space between horizontal"],
|
|
27
|
+
["space-y", "space between vertical"],
|
|
28
|
+
["min-w", "min-width"],
|
|
29
|
+
["max-w", "max-width"],
|
|
30
|
+
["min-h", "min-height"],
|
|
31
|
+
["max-h", "max-height"],
|
|
32
|
+
// ── Single-segment prefixes ────────────────────────────────────
|
|
33
|
+
// Spacing
|
|
34
|
+
["px", "padding"],
|
|
35
|
+
["py", "padding"],
|
|
36
|
+
["pt", "padding"],
|
|
37
|
+
["pr", "padding"],
|
|
38
|
+
["pb", "padding"],
|
|
39
|
+
["pl", "padding"],
|
|
40
|
+
["ps", "padding"],
|
|
41
|
+
["pe", "padding"],
|
|
42
|
+
["mx", "margin"],
|
|
43
|
+
["my", "margin"],
|
|
44
|
+
["mt", "margin"],
|
|
45
|
+
["mr", "margin"],
|
|
46
|
+
["mb", "margin"],
|
|
47
|
+
["ml", "margin"],
|
|
48
|
+
["ms", "margin"],
|
|
49
|
+
["me", "margin"],
|
|
50
|
+
// Typography
|
|
51
|
+
["font", "font"],
|
|
52
|
+
["tracking", "letter spacing"],
|
|
53
|
+
["leading", "line height"],
|
|
54
|
+
// Grid & Flex
|
|
55
|
+
["gap", "gap"],
|
|
56
|
+
// Background
|
|
57
|
+
["bg", "background"],
|
|
58
|
+
// Borders
|
|
59
|
+
["rounded", "border radius"],
|
|
60
|
+
// Effects
|
|
61
|
+
["shadow", "box shadow"],
|
|
62
|
+
// Sizing
|
|
63
|
+
["w", "width"],
|
|
64
|
+
["h", "height"],
|
|
65
|
+
["size", "size"],
|
|
66
|
+
// Position
|
|
67
|
+
["z", "z-index"],
|
|
68
|
+
["inset", "position"],
|
|
69
|
+
]);
|
|
70
|
+
/**
|
|
71
|
+
* Disambiguate `text-` class names which map to different CSS properties
|
|
72
|
+
* depending on the suffix (font size vs text color).
|
|
73
|
+
*
|
|
74
|
+
* Returns null for unrecognized variants (text-center, text-wrap, etc.)
|
|
75
|
+
* where expansion could hurt more than help.
|
|
76
|
+
*/
|
|
77
|
+
function resolveTextClass(className) {
|
|
78
|
+
if (TEXT_SIZE_RE.test(className))
|
|
79
|
+
return "font size";
|
|
80
|
+
if (TEXT_COLOR_RE.test(className))
|
|
81
|
+
return "text color";
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Resolve expansion terms for a single Tailwind class name.
|
|
86
|
+
*
|
|
87
|
+
* Tries progressively shorter hyphen-delimited prefixes (longest first):
|
|
88
|
+
* "grid-cols-3" → tries "grid-cols" (match!) → "grid template columns"
|
|
89
|
+
* "text-lg" → tries "text" (conditional) → checks size regex → "font size"
|
|
90
|
+
*
|
|
91
|
+
* Returns null if no expansion applies.
|
|
92
|
+
*/
|
|
93
|
+
function resolveExpansion(className) {
|
|
94
|
+
const parts = className.split("-");
|
|
95
|
+
for (let len = parts.length - 1; len >= 1; len--) {
|
|
96
|
+
const prefix = parts.slice(0, len).join("-");
|
|
97
|
+
// Special case: text- requires disambiguation
|
|
98
|
+
if (prefix === "text")
|
|
99
|
+
return resolveTextClass(className);
|
|
100
|
+
const terms = PREFIX_MAP.get(prefix);
|
|
101
|
+
if (terms)
|
|
102
|
+
return terms;
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Expand a search query by mapping detected Tailwind class name prefixes
|
|
108
|
+
* to their canonical CSS property names.
|
|
109
|
+
*
|
|
110
|
+
* Expansion terms are appended to the original query, preserving all original
|
|
111
|
+
* tokens. Duplicate terms (already present in the query) are not added.
|
|
112
|
+
*
|
|
113
|
+
* Returns the original query unchanged when no Tailwind class names are detected.
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* expandQuery("tailwind text-lg class")
|
|
117
|
+
* // → "tailwind text-lg class font size"
|
|
118
|
+
*
|
|
119
|
+
* expandQuery("mx-auto centering")
|
|
120
|
+
* // → "mx-auto centering margin"
|
|
121
|
+
*
|
|
122
|
+
* expandQuery("how to center a div")
|
|
123
|
+
* // → "how to center a div" (unchanged — no class names)
|
|
124
|
+
*/
|
|
125
|
+
export function expandQuery(query) {
|
|
126
|
+
const classNames = query.match(TAILWIND_CLASS_RE);
|
|
127
|
+
if (!classNames)
|
|
128
|
+
return query;
|
|
129
|
+
const existingTerms = new Set(query.toLowerCase().split(/\s+/).filter(Boolean));
|
|
130
|
+
const expansionTerms = [];
|
|
131
|
+
for (const className of classNames) {
|
|
132
|
+
const terms = resolveExpansion(className);
|
|
133
|
+
if (!terms)
|
|
134
|
+
continue;
|
|
135
|
+
for (const term of terms.split(/\s+/)) {
|
|
136
|
+
const lower = term.toLowerCase();
|
|
137
|
+
if (lower && !existingTerms.has(lower)) {
|
|
138
|
+
expansionTerms.push(lower);
|
|
139
|
+
existingTerms.add(lower);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (expansionTerms.length === 0)
|
|
144
|
+
return query;
|
|
145
|
+
return `${query} ${expansionTerms.join(" ")}`;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=query-expansion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-expansion.js","sourceRoot":"","sources":["../../src/utils/query-expansion.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,kGAAkG;AAClG,MAAM,iBAAiB,GAAG,4BAA4B,CAAC;AAEvD,kEAAkE;AAClE,MAAM,YAAY,GAAG,iCAAiC,CAAC;AAEvD,oEAAoE;AACpE,MAAM,aAAa,GACjB,oLAAoL,CAAC;AAEvL;;;GAGG;AACH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAiB;IACzC,kEAAkE;IAClE,CAAC,WAAW,EAAE,uBAAuB,CAAC;IACtC,CAAC,WAAW,EAAE,oBAAoB,CAAC;IACnC,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAClC,CAAC,WAAW,EAAE,gBAAgB,CAAC;IAC/B,CAAC,UAAU,EAAE,aAAa,CAAC;IAC3B,CAAC,UAAU,EAAE,UAAU,CAAC;IACxB,CAAC,SAAS,EAAE,0BAA0B,CAAC;IACvC,CAAC,SAAS,EAAE,wBAAwB,CAAC;IACrC,CAAC,OAAO,EAAE,WAAW,CAAC;IACtB,CAAC,OAAO,EAAE,WAAW,CAAC;IACtB,CAAC,OAAO,EAAE,YAAY,CAAC;IACvB,CAAC,OAAO,EAAE,YAAY,CAAC;IAEvB,kEAAkE;IAClE,UAAU;IACV,CAAC,IAAI,EAAE,SAAS,CAAC;IACjB,CAAC,IAAI,EAAE,SAAS,CAAC;IACjB,CAAC,IAAI,EAAE,SAAS,CAAC;IACjB,CAAC,IAAI,EAAE,SAAS,CAAC;IACjB,CAAC,IAAI,EAAE,SAAS,CAAC;IACjB,CAAC,IAAI,EAAE,SAAS,CAAC;IACjB,CAAC,IAAI,EAAE,SAAS,CAAC;IACjB,CAAC,IAAI,EAAE,SAAS,CAAC;IACjB,CAAC,IAAI,EAAE,QAAQ,CAAC;IAChB,CAAC,IAAI,EAAE,QAAQ,CAAC;IAChB,CAAC,IAAI,EAAE,QAAQ,CAAC;IAChB,CAAC,IAAI,EAAE,QAAQ,CAAC;IAChB,CAAC,IAAI,EAAE,QAAQ,CAAC;IAChB,CAAC,IAAI,EAAE,QAAQ,CAAC;IAChB,CAAC,IAAI,EAAE,QAAQ,CAAC;IAChB,CAAC,IAAI,EAAE,QAAQ,CAAC;IAEhB,aAAa;IACb,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,UAAU,EAAE,gBAAgB,CAAC;IAC9B,CAAC,SAAS,EAAE,aAAa,CAAC;IAE1B,cAAc;IACd,CAAC,KAAK,EAAE,KAAK,CAAC;IAEd,aAAa;IACb,CAAC,IAAI,EAAE,YAAY,CAAC;IAEpB,UAAU;IACV,CAAC,SAAS,EAAE,eAAe,CAAC;IAE5B,UAAU;IACV,CAAC,QAAQ,EAAE,YAAY,CAAC;IAExB,SAAS;IACT,CAAC,GAAG,EAAE,OAAO,CAAC;IACd,CAAC,GAAG,EAAE,QAAQ,CAAC;IACf,CAAC,MAAM,EAAE,MAAM,CAAC;IAEhB,WAAW;IACX,CAAC,GAAG,EAAE,SAAS,CAAC;IAChB,CAAC,OAAO,EAAE,UAAU,CAAC;CACtB,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,SAAiB;IACzC,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,WAAW,CAAC;IACrD,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,YAAY,CAAC;IACvD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,gBAAgB,CAAC,SAAiB;IACzC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEnC,KAAK,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE7C,8CAA8C;QAC9C,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAE1D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAE9B,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAChF,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACjC,IAAI,KAAK,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3B,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,GAAG,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAChD,CAAC"}
|