@trishchuk/coolors-mcp 1.0.0 → 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.
- package/.github/ISSUE_TEMPLATE/bug_report.md +20 -8
- package/.github/ISSUE_TEMPLATE/feature_request.md +22 -8
- package/.github/pull_request_template.md +33 -8
- package/.github/workflows/ci.yml +107 -104
- package/.github/workflows/deploy-docs.yml +14 -11
- package/.github/workflows/release.yml +25 -23
- package/README.md +149 -15
- package/dist/bin/server.js +997 -256
- package/dist/bin/server.js.map +1 -1
- package/dist/{chunk-P3ARRKLS.js → chunk-HOMDMKUY.js} +3 -1
- package/dist/{chunk-P3ARRKLS.js.map → chunk-HOMDMKUY.js.map} +1 -1
- package/dist/{chunk-IQ7NN26V.js → chunk-LHW2ZTOU.js} +14 -2
- package/dist/chunk-LHW2ZTOU.js.map +1 -0
- package/dist/color/index.js +1 -1
- package/dist/coolors-mcp.d.ts +4 -4
- package/dist/coolors-mcp.js +1 -1
- package/docs/.vitepress/components/ClientGrid.vue +9 -3
- package/docs/.vitepress/components/CodeBlock.vue +51 -44
- package/docs/.vitepress/components/ConfigModal.vue +151 -67
- package/docs/.vitepress/components/DiagramModal.vue +186 -154
- package/docs/.vitepress/components/TroubleshootingModal.vue +101 -96
- package/docs/.vitepress/config.js +171 -141
- package/docs/.vitepress/theme/FundingLayout.vue +65 -54
- package/docs/.vitepress/theme/Layout.vue +21 -21
- package/docs/.vitepress/theme/components/AdBanner.vue +73 -52
- package/docs/.vitepress/theme/components/AdPlaceholder.vue +3 -3
- package/docs/.vitepress/theme/components/FundingEffects.vue +77 -53
- package/docs/.vitepress/theme/components/FundingHero.vue +78 -63
- package/docs/.vitepress/theme/components/SupportSection.vue +106 -89
- package/docs/.vitepress/theme/custom-app.css +19 -12
- package/docs/.vitepress/theme/custom.css +33 -25
- package/docs/.vitepress/theme/index.js +19 -16
- package/docs/concepts/accessibility.md +59 -47
- package/docs/concepts/color-spaces.md +28 -6
- package/docs/concepts/distance-metrics.md +45 -30
- package/docs/concepts/hct.md +30 -27
- package/docs/concepts/image-analysis.md +52 -21
- package/docs/concepts/material-design.md +43 -17
- package/docs/concepts/theme-matching.md +64 -40
- package/docs/examples/basic-colors.md +92 -108
- package/docs/examples/creating-themes.md +104 -108
- package/docs/examples/css-refactoring.md +33 -29
- package/docs/examples/image-extraction.md +145 -138
- package/docs/getting-started.md +45 -34
- package/docs/index.md +5 -1
- package/docs/installation.md +15 -1
- package/docs/tools/accessibility.md +74 -68
- package/docs/tools/image-extraction.md +62 -54
- package/docs/tools/theme-matching.md +45 -42
- package/eslint.config.ts +13 -0
- package/jsr.json +1 -1
- package/package.json +17 -13
- package/src/bin/server.ts +13 -1
- package/src/color/__tests__/extract-colors.test.ts +20 -30
- package/src/color/apca.ts +105 -0
- package/src/color/color-blindness.ts +109 -0
- package/src/coolors-mcp.ts +1 -1
- package/src/session.ts +10 -2
- package/src/theme/matcher.ts +1 -1
- package/src/theme/refactor.ts +1 -1
- package/src/theme/types.ts +3 -0
- package/src/tools/__tests__/cohesion.test.ts +97 -0
- package/src/tools/__tests__/color-blindness.test.ts +45 -0
- package/src/tools/__tests__/color-conversion.test.ts +38 -0
- package/src/tools/__tests__/contrast-checker.test.ts +56 -0
- package/src/tools/__tests__/palette-export.test.ts +54 -0
- package/src/tools/adjust-color.tool.ts +80 -0
- package/src/tools/cohesion.tools.ts +380 -0
- package/src/tools/color-blindness.tool.ts +168 -0
- package/src/tools/color-conversion.tool.ts +1 -1
- package/src/tools/contrast-checker.tool.ts +53 -14
- package/src/tools/dislike-analyzer.tool.ts +41 -54
- package/src/tools/image-extraction.tools.ts +62 -115
- package/src/tools/index.ts +15 -2
- package/src/tools/palette-export.tool.ts +174 -0
- package/src/tools/palette-with-locks.tool.ts +8 -6
- package/src/types.ts +2 -3
- package/tsconfig.json +12 -2
- package/vitest.config.js +1 -3
- package/.claude/settings.local.json +0 -39
- package/.env +0 -2
- package/.mcp.json +0 -12
- package/CLAUDE.md +0 -201
- package/DOCUMENTATION.md +0 -274
- package/GEMINI.md +0 -54
- package/demo/content_based_color.png +0 -0
- package/demo/music-player.html +0 -621
- package/demo/podcast-player.html +0 -903
- package/dist/chunk-IQ7NN26V.js.map +0 -1
- package/docs/.vitepress/cache/deps/@braintree_sanitize-url.js +0 -93
- package/docs/.vitepress/cache/deps/@braintree_sanitize-url.js.map +0 -7
- package/docs/.vitepress/cache/deps/_metadata.json +0 -127
- package/docs/.vitepress/cache/deps/chunk-BUSYA2B4.js +0 -9
- package/docs/.vitepress/cache/deps/chunk-BUSYA2B4.js.map +0 -7
- package/docs/.vitepress/cache/deps/chunk-JD3CXNQ6.js +0 -12683
- package/docs/.vitepress/cache/deps/chunk-JD3CXNQ6.js.map +0 -7
- package/docs/.vitepress/cache/deps/chunk-SYPOPCWC.js +0 -9719
- package/docs/.vitepress/cache/deps/chunk-SYPOPCWC.js.map +0 -7
- package/docs/.vitepress/cache/deps/cytoscape-cose-bilkent.js +0 -4710
- package/docs/.vitepress/cache/deps/cytoscape-cose-bilkent.js.map +0 -7
- package/docs/.vitepress/cache/deps/cytoscape.js +0 -30278
- package/docs/.vitepress/cache/deps/cytoscape.js.map +0 -7
- package/docs/.vitepress/cache/deps/dayjs.js +0 -285
- package/docs/.vitepress/cache/deps/dayjs.js.map +0 -7
- package/docs/.vitepress/cache/deps/debug.js +0 -468
- package/docs/.vitepress/cache/deps/debug.js.map +0 -7
- package/docs/.vitepress/cache/deps/package.json +0 -3
- package/docs/.vitepress/cache/deps/prismjs.js +0 -1466
- package/docs/.vitepress/cache/deps/prismjs.js.map +0 -7
- package/docs/.vitepress/cache/deps/prismjs_components_prism-bash.js +0 -228
- package/docs/.vitepress/cache/deps/prismjs_components_prism-bash.js.map +0 -7
- package/docs/.vitepress/cache/deps/prismjs_components_prism-javascript.js +0 -142
- package/docs/.vitepress/cache/deps/prismjs_components_prism-javascript.js.map +0 -7
- package/docs/.vitepress/cache/deps/prismjs_components_prism-json.js +0 -27
- package/docs/.vitepress/cache/deps/prismjs_components_prism-json.js.map +0 -7
- package/docs/.vitepress/cache/deps/prismjs_components_prism-python.js +0 -65
- package/docs/.vitepress/cache/deps/prismjs_components_prism-python.js.map +0 -7
- package/docs/.vitepress/cache/deps/prismjs_components_prism-typescript.js +0 -53
- package/docs/.vitepress/cache/deps/prismjs_components_prism-typescript.js.map +0 -7
- package/docs/.vitepress/cache/deps/prismjs_components_prism-yaml.js +0 -73
- package/docs/.vitepress/cache/deps/prismjs_components_prism-yaml.js.map +0 -7
- package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +0 -4507
- package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +0 -7
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +0 -584
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +0 -7
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js +0 -1146
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js.map +0 -7
- package/docs/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js +0 -1667
- package/docs/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js.map +0 -7
- package/docs/.vitepress/cache/deps/vitepress___minisearch.js +0 -1814
- package/docs/.vitepress/cache/deps/vitepress___minisearch.js.map +0 -7
- package/docs/.vitepress/cache/deps/vue.js +0 -344
- package/docs/.vitepress/cache/deps/vue.js.map +0 -7
- package/examples/theme-matching.md +0 -113
- package/mcp-config.json +0 -8
- package/note.md +0 -35
- package/research_results.md +0 -53
- package/src/tools/colors.ts +0 -31
- package/src/tools/registry.ts +0 -142
- package/src/tools/simple-tools.ts +0 -37
|
@@ -17,9 +17,11 @@
|
|
|
17
17
|
<span class="problem-badge">Problem</span>
|
|
18
18
|
<h2>{{ title }}</h2>
|
|
19
19
|
</div>
|
|
20
|
-
<button @click="closeModal" class="close-btn" title="Close"
|
|
20
|
+
<button @click="closeModal" class="close-btn" title="Close">
|
|
21
|
+
×
|
|
22
|
+
</button>
|
|
21
23
|
</div>
|
|
22
|
-
|
|
24
|
+
|
|
23
25
|
<div class="modal-body">
|
|
24
26
|
<div class="solution-section">
|
|
25
27
|
<h3 class="solution-title">
|
|
@@ -35,121 +37,124 @@
|
|
|
35
37
|
</template>
|
|
36
38
|
|
|
37
39
|
<script setup>
|
|
38
|
-
import { ref, onMounted, onUnmounted, nextTick } from
|
|
40
|
+
import { ref, onMounted, onUnmounted, nextTick } from "vue";
|
|
39
41
|
|
|
40
42
|
const props = defineProps({
|
|
41
43
|
title: {
|
|
42
44
|
type: String,
|
|
43
|
-
required: true
|
|
45
|
+
required: true,
|
|
44
46
|
},
|
|
45
47
|
preview: {
|
|
46
48
|
type: String,
|
|
47
|
-
required: true
|
|
48
|
-
}
|
|
49
|
-
})
|
|
49
|
+
required: true,
|
|
50
|
+
},
|
|
51
|
+
});
|
|
50
52
|
|
|
51
|
-
const isOpen = ref(false)
|
|
53
|
+
const isOpen = ref(false);
|
|
52
54
|
|
|
53
55
|
const openModal = async () => {
|
|
54
|
-
isOpen.value = true
|
|
55
|
-
document.body.style.overflow =
|
|
56
|
-
|
|
56
|
+
isOpen.value = true;
|
|
57
|
+
document.body.style.overflow = "hidden";
|
|
58
|
+
|
|
57
59
|
// Wait for modal to render, then add copy buttons
|
|
58
|
-
await nextTick()
|
|
59
|
-
setTimeout(addCopyButtons, 100)
|
|
60
|
-
}
|
|
60
|
+
await nextTick();
|
|
61
|
+
setTimeout(addCopyButtons, 100);
|
|
62
|
+
};
|
|
61
63
|
|
|
62
64
|
const closeModal = () => {
|
|
63
|
-
isOpen.value = false
|
|
64
|
-
document.body.style.overflow =
|
|
65
|
-
}
|
|
65
|
+
isOpen.value = false;
|
|
66
|
+
document.body.style.overflow = "";
|
|
67
|
+
};
|
|
66
68
|
|
|
67
69
|
const addCopyButtons = () => {
|
|
68
|
-
const modal = document.querySelector(
|
|
69
|
-
if (!modal) return
|
|
70
|
-
|
|
70
|
+
const modal = document.querySelector(".issue-modal");
|
|
71
|
+
if (!modal) return;
|
|
72
|
+
|
|
71
73
|
// Look for all code blocks (pre elements or code elements)
|
|
72
|
-
const codeBlocks = modal.querySelectorAll(
|
|
73
|
-
|
|
74
|
+
const codeBlocks = modal.querySelectorAll("pre, code");
|
|
75
|
+
|
|
74
76
|
codeBlocks.forEach((block) => {
|
|
75
77
|
// Skip inline code elements
|
|
76
|
-
if (block.tagName ===
|
|
77
|
-
return
|
|
78
|
+
if (block.tagName === "CODE" && block.parentElement.tagName !== "PRE") {
|
|
79
|
+
return;
|
|
78
80
|
}
|
|
79
|
-
|
|
81
|
+
|
|
80
82
|
// Skip if copy button already exists
|
|
81
|
-
if (
|
|
82
|
-
|
|
83
|
+
if (
|
|
84
|
+
block.querySelector(".copy-btn") ||
|
|
85
|
+
block.parentElement?.querySelector(".copy-btn")
|
|
86
|
+
)
|
|
87
|
+
return;
|
|
88
|
+
|
|
83
89
|
// Use pre element for block code, code element for inline
|
|
84
|
-
const targetElement = block.tagName ===
|
|
85
|
-
if (!targetElement) return
|
|
86
|
-
|
|
87
|
-
const copyButton = document.createElement(
|
|
88
|
-
copyButton.className =
|
|
90
|
+
const targetElement = block.tagName === "PRE" ? block : block.parentElement;
|
|
91
|
+
if (!targetElement) return;
|
|
92
|
+
|
|
93
|
+
const copyButton = document.createElement("button");
|
|
94
|
+
copyButton.className = "copy-btn";
|
|
89
95
|
copyButton.innerHTML = `
|
|
90
96
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
|
|
91
97
|
<rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
|
|
92
98
|
<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
|
|
93
99
|
</svg>
|
|
94
|
-
|
|
95
|
-
copyButton.title =
|
|
96
|
-
copyButton.type =
|
|
97
|
-
|
|
98
|
-
copyButton.addEventListener(
|
|
99
|
-
e.preventDefault()
|
|
100
|
-
e.stopPropagation()
|
|
101
|
-
|
|
100
|
+
`;
|
|
101
|
+
copyButton.title = "Copy code";
|
|
102
|
+
copyButton.type = "button";
|
|
103
|
+
|
|
104
|
+
copyButton.addEventListener("click", async (e) => {
|
|
105
|
+
e.preventDefault();
|
|
106
|
+
e.stopPropagation();
|
|
107
|
+
|
|
102
108
|
// Get the code content
|
|
103
|
-
const codeElement = targetElement.querySelector(
|
|
104
|
-
if (!codeElement) return
|
|
105
|
-
|
|
106
|
-
let textToCopy = codeElement.textContent || codeElement.innerText ||
|
|
107
|
-
|
|
109
|
+
const codeElement = targetElement.querySelector("code") || targetElement;
|
|
110
|
+
if (!codeElement) return;
|
|
111
|
+
|
|
112
|
+
let textToCopy = codeElement.textContent || codeElement.innerText || "";
|
|
113
|
+
|
|
108
114
|
// Clean up the text (remove extra whitespace, etc.)
|
|
109
|
-
textToCopy = textToCopy.trim()
|
|
110
|
-
|
|
111
|
-
console.log(
|
|
112
|
-
|
|
115
|
+
textToCopy = textToCopy.trim();
|
|
116
|
+
|
|
117
|
+
console.log("Attempting to copy:", textToCopy); // Debug log
|
|
118
|
+
|
|
113
119
|
try {
|
|
114
120
|
// Try modern clipboard API first
|
|
115
121
|
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
116
|
-
await navigator.clipboard.writeText(textToCopy)
|
|
122
|
+
await navigator.clipboard.writeText(textToCopy);
|
|
117
123
|
} else {
|
|
118
124
|
// Fallback for older browsers
|
|
119
|
-
const textArea = document.createElement(
|
|
120
|
-
textArea.value = textToCopy
|
|
121
|
-
textArea.style.position =
|
|
122
|
-
textArea.style.left =
|
|
123
|
-
document.body.appendChild(textArea)
|
|
124
|
-
textArea.select()
|
|
125
|
-
document.execCommand(
|
|
126
|
-
document.body.removeChild(textArea)
|
|
125
|
+
const textArea = document.createElement("textarea");
|
|
126
|
+
textArea.value = textToCopy;
|
|
127
|
+
textArea.style.position = "fixed";
|
|
128
|
+
textArea.style.left = "-9999px";
|
|
129
|
+
document.body.appendChild(textArea);
|
|
130
|
+
textArea.select();
|
|
131
|
+
document.execCommand("copy");
|
|
132
|
+
document.body.removeChild(textArea);
|
|
127
133
|
}
|
|
128
|
-
|
|
134
|
+
|
|
129
135
|
// Visual feedback
|
|
130
|
-
copyButton.classList.add(
|
|
136
|
+
copyButton.classList.add("copied");
|
|
131
137
|
copyButton.innerHTML = `
|
|
132
138
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
|
|
133
139
|
<polyline points="20,6 9,17 4,12"></polyline>
|
|
134
140
|
</svg>
|
|
135
|
-
|
|
136
|
-
|
|
141
|
+
`;
|
|
142
|
+
|
|
137
143
|
// Reset after 2 seconds
|
|
138
144
|
setTimeout(() => {
|
|
139
|
-
copyButton.classList.remove(
|
|
145
|
+
copyButton.classList.remove("copied");
|
|
140
146
|
copyButton.innerHTML = `
|
|
141
147
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
|
|
142
148
|
<rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
|
|
143
149
|
<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
|
|
144
150
|
</svg>
|
|
145
|
-
|
|
146
|
-
}, 2000)
|
|
147
|
-
|
|
148
|
-
console.log(
|
|
149
|
-
|
|
151
|
+
`;
|
|
152
|
+
}, 2000);
|
|
153
|
+
|
|
154
|
+
console.log("Copy successful!"); // Debug log
|
|
150
155
|
} catch (err) {
|
|
151
|
-
console.error(
|
|
152
|
-
|
|
156
|
+
console.error("Failed to copy code:", err);
|
|
157
|
+
|
|
153
158
|
// Show error feedback
|
|
154
159
|
copyButton.innerHTML = `
|
|
155
160
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
|
|
@@ -157,39 +162,39 @@ const addCopyButtons = () => {
|
|
|
157
162
|
<line x1="15" y1="9" x2="9" y2="15"></line>
|
|
158
163
|
<line x1="9" y1="9" x2="15" y2="15"></line>
|
|
159
164
|
</svg>
|
|
160
|
-
|
|
161
|
-
|
|
165
|
+
`;
|
|
166
|
+
|
|
162
167
|
setTimeout(() => {
|
|
163
168
|
copyButton.innerHTML = `
|
|
164
169
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
|
|
165
170
|
<rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
|
|
166
171
|
<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
|
|
167
172
|
</svg>
|
|
168
|
-
|
|
169
|
-
}, 2000)
|
|
173
|
+
`;
|
|
174
|
+
}, 2000);
|
|
170
175
|
}
|
|
171
|
-
})
|
|
172
|
-
|
|
176
|
+
});
|
|
177
|
+
|
|
173
178
|
// Position the target element and add the button
|
|
174
|
-
targetElement.style.position =
|
|
175
|
-
targetElement.appendChild(copyButton)
|
|
176
|
-
})
|
|
177
|
-
}
|
|
179
|
+
targetElement.style.position = "relative";
|
|
180
|
+
targetElement.appendChild(copyButton);
|
|
181
|
+
});
|
|
182
|
+
};
|
|
178
183
|
|
|
179
184
|
const handleKeydown = (e) => {
|
|
180
|
-
if (e.key ===
|
|
181
|
-
closeModal()
|
|
185
|
+
if (e.key === "Escape" && isOpen.value) {
|
|
186
|
+
closeModal();
|
|
182
187
|
}
|
|
183
|
-
}
|
|
188
|
+
};
|
|
184
189
|
|
|
185
190
|
onMounted(() => {
|
|
186
|
-
document.addEventListener(
|
|
187
|
-
})
|
|
191
|
+
document.addEventListener("keydown", handleKeydown);
|
|
192
|
+
});
|
|
188
193
|
|
|
189
194
|
onUnmounted(() => {
|
|
190
|
-
document.removeEventListener(
|
|
191
|
-
document.body.style.overflow =
|
|
192
|
-
})
|
|
195
|
+
document.removeEventListener("keydown", handleKeydown);
|
|
196
|
+
document.body.style.overflow = "";
|
|
197
|
+
});
|
|
193
198
|
</script>
|
|
194
199
|
|
|
195
200
|
<style scoped>
|
|
@@ -416,7 +421,7 @@ onUnmounted(() => {
|
|
|
416
421
|
transform: scale(0.95);
|
|
417
422
|
}
|
|
418
423
|
|
|
419
|
-
.solution-content :deep(ul),
|
|
424
|
+
.solution-content :deep(ul),
|
|
420
425
|
.solution-content :deep(ol) {
|
|
421
426
|
margin: 12px 0;
|
|
422
427
|
padding-left: 20px;
|
|
@@ -441,32 +446,32 @@ onUnmounted(() => {
|
|
|
441
446
|
width: 95vw;
|
|
442
447
|
max-height: 90vh;
|
|
443
448
|
}
|
|
444
|
-
|
|
449
|
+
|
|
445
450
|
.modal-header {
|
|
446
451
|
padding: 16px 20px;
|
|
447
452
|
}
|
|
448
|
-
|
|
453
|
+
|
|
449
454
|
.modal-title h2 {
|
|
450
455
|
font-size: 18px;
|
|
451
456
|
}
|
|
452
|
-
|
|
457
|
+
|
|
453
458
|
.modal-body {
|
|
454
459
|
padding: 20px;
|
|
455
460
|
}
|
|
456
|
-
|
|
461
|
+
|
|
457
462
|
.issue-card {
|
|
458
463
|
padding: 14px;
|
|
459
464
|
}
|
|
460
|
-
|
|
465
|
+
|
|
461
466
|
.issue-header {
|
|
462
467
|
flex-direction: column;
|
|
463
468
|
align-items: flex-start;
|
|
464
469
|
gap: 4px;
|
|
465
470
|
}
|
|
466
|
-
|
|
471
|
+
|
|
467
472
|
.expand-hint {
|
|
468
473
|
opacity: 1;
|
|
469
474
|
font-size: 11px;
|
|
470
475
|
}
|
|
471
476
|
}
|
|
472
|
-
</style>
|
|
477
|
+
</style>
|
|
@@ -1,162 +1,192 @@
|
|
|
1
|
-
import { defineConfig } from
|
|
2
|
-
import { withMermaid } from
|
|
1
|
+
import { defineConfig } from "vitepress";
|
|
2
|
+
import { withMermaid } from "vitepress-plugin-mermaid";
|
|
3
3
|
|
|
4
4
|
export default withMermaid(
|
|
5
5
|
defineConfig({
|
|
6
|
-
title:
|
|
7
|
-
titleTemplate:
|
|
8
|
-
description:
|
|
9
|
-
|
|
6
|
+
title: "Coolors MCP",
|
|
7
|
+
titleTemplate: ":title | Coolors MCP Docs",
|
|
8
|
+
description:
|
|
9
|
+
"Advanced color operations MCP server with Material Design 3 support, CSS theme matching, image color extraction, and accessibility compliance.",
|
|
10
|
+
base: "/coolors-mcp/",
|
|
10
11
|
lastUpdated: true,
|
|
11
12
|
cleanUrls: true,
|
|
12
|
-
|
|
13
|
+
ignoreDeadLinks: true,
|
|
14
|
+
|
|
13
15
|
// Force dark mode by default
|
|
14
16
|
//appearance: 'dark',
|
|
15
|
-
|
|
17
|
+
|
|
16
18
|
head: [
|
|
17
19
|
// Using emoji as favicon
|
|
18
|
-
[
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
[
|
|
20
|
+
[
|
|
21
|
+
"link",
|
|
22
|
+
{
|
|
23
|
+
rel: "icon",
|
|
24
|
+
href: 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><text y=".9em" font-size="90">🎨</text></svg>',
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
["meta", { name: "theme-color", content: "#0ea5e9" }],
|
|
28
|
+
["meta", { property: "og:type", content: "website" }],
|
|
29
|
+
["meta", { property: "og:locale", content: "en" }],
|
|
30
|
+
[
|
|
31
|
+
"meta",
|
|
32
|
+
{
|
|
33
|
+
property: "og:title",
|
|
34
|
+
content: "Coolors MCP | Advanced Color Operations for MCP",
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
["meta", { property: "og:site_name", content: "Coolors MCP" }],
|
|
38
|
+
[
|
|
39
|
+
"meta",
|
|
40
|
+
{
|
|
41
|
+
property: "og:description",
|
|
42
|
+
content:
|
|
43
|
+
"MCP server for advanced color operations, Material Design themes, CSS refactoring, and image color extraction.",
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
[
|
|
47
|
+
"meta",
|
|
48
|
+
{
|
|
49
|
+
property: "og:url",
|
|
50
|
+
content: "https://x51xxx.github.io/coolors-mcp/",
|
|
51
|
+
},
|
|
52
|
+
],
|
|
26
53
|
],
|
|
27
|
-
|
|
54
|
+
|
|
28
55
|
themeConfig: {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
nav: [
|
|
32
|
-
{ text: 'Home', link: '/' },
|
|
33
|
-
{ text: 'Getting Started', link: '/getting-started' },
|
|
34
|
-
{ text: 'Tools', link: '/tools/README' }
|
|
35
|
-
],
|
|
56
|
+
// No logo - using text branding instead
|
|
36
57
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
text:
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
{ text: 'Overview', link: '/' },
|
|
43
|
-
{ text: 'Installation', link: '/installation' },
|
|
44
|
-
{ text: 'Getting Started', link: '/getting-started' }
|
|
45
|
-
]
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
text: 'Core Concepts',
|
|
49
|
-
collapsed: false,
|
|
50
|
-
items: [
|
|
51
|
-
{ text: 'Color Spaces', link: '/concepts/color-spaces' },
|
|
52
|
-
{ text: 'HCT Color System', link: '/concepts/hct' },
|
|
53
|
-
{ text: 'Material Design 3', link: '/concepts/material-design' },
|
|
54
|
-
{ text: 'Theme Matching', link: '/concepts/theme-matching' },
|
|
55
|
-
{ text: 'Image Analysis', link: '/concepts/image-analysis' },
|
|
56
|
-
{ text: 'Accessibility', link: '/concepts/accessibility' }
|
|
57
|
-
]
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
text: 'Tools Reference',
|
|
61
|
-
collapsed: false,
|
|
62
|
-
items: [
|
|
63
|
-
{ text: 'Color Operations', link: '/tools/color-operations' },
|
|
64
|
-
{ text: 'Material Design', link: '/tools/material-design' },
|
|
65
|
-
{ text: 'Theme Matching', link: '/tools/theme-matching' },
|
|
66
|
-
{ text: 'Image Extraction', link: '/tools/image-extraction' },
|
|
67
|
-
{ text: 'Accessibility', link: '/tools/accessibility' }
|
|
68
|
-
]
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
text: 'Examples',
|
|
72
|
-
collapsed: false,
|
|
73
|
-
items: [
|
|
74
|
-
{ text: 'Basic Color Operations', link: '/examples/basic-colors' },
|
|
75
|
-
{ text: 'Creating Themes', link: '/examples/creating-themes' },
|
|
76
|
-
{ text: 'CSS Refactoring', link: '/examples/css-refactoring' },
|
|
77
|
-
{ text: 'Image Color Extraction', link: '/examples/image-extraction' }
|
|
78
|
-
]
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
text: 'Resources',
|
|
82
|
-
collapsed: false,
|
|
83
|
-
items: [
|
|
84
|
-
{ text: 'Troubleshooting', link: '/resources/troubleshooting' },
|
|
85
|
-
{ text: 'FAQ', link: '/resources/faq' },
|
|
86
|
-
{ text: 'Contributing', link: '/contributing' }
|
|
87
|
-
]
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
text: 'Advanced',
|
|
91
|
-
collapsed: true,
|
|
92
|
-
items: [
|
|
93
|
-
{ text: 'Custom Palettes', link: '/advanced/custom-palettes' },
|
|
94
|
-
{ text: 'Batch Processing', link: '/advanced/batch-processing' },
|
|
95
|
-
{ text: 'Integration Patterns', link: '/advanced/integration' }
|
|
96
|
-
]
|
|
97
|
-
}
|
|
98
|
-
],
|
|
58
|
+
nav: [
|
|
59
|
+
{ text: "Home", link: "/" },
|
|
60
|
+
{ text: "Getting Started", link: "/getting-started" },
|
|
61
|
+
{ text: "Tools", link: "/tools/README" },
|
|
62
|
+
],
|
|
99
63
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
64
|
+
sidebar: [
|
|
65
|
+
{
|
|
66
|
+
text: "Getting Started",
|
|
67
|
+
collapsed: false,
|
|
68
|
+
items: [
|
|
69
|
+
{ text: "Overview", link: "/" },
|
|
70
|
+
{ text: "Installation", link: "/installation" },
|
|
71
|
+
{ text: "Getting Started", link: "/getting-started" },
|
|
72
|
+
],
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
text: "Core Concepts",
|
|
76
|
+
collapsed: false,
|
|
77
|
+
items: [
|
|
78
|
+
{ text: "Color Spaces", link: "/concepts/color-spaces" },
|
|
79
|
+
{ text: "HCT Color System", link: "/concepts/hct" },
|
|
80
|
+
{ text: "Material Design 3", link: "/concepts/material-design" },
|
|
81
|
+
{ text: "Theme Matching", link: "/concepts/theme-matching" },
|
|
82
|
+
{ text: "Image Analysis", link: "/concepts/image-analysis" },
|
|
83
|
+
{ text: "Accessibility", link: "/concepts/accessibility" },
|
|
84
|
+
],
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
text: "Tools Reference",
|
|
88
|
+
collapsed: false,
|
|
89
|
+
items: [
|
|
90
|
+
{ text: "Color Operations", link: "/tools/color-operations" },
|
|
91
|
+
{ text: "Material Design", link: "/tools/material-design" },
|
|
92
|
+
{ text: "Theme Matching", link: "/tools/theme-matching" },
|
|
93
|
+
{ text: "Image Extraction", link: "/tools/image-extraction" },
|
|
94
|
+
{ text: "Accessibility", link: "/tools/accessibility" },
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
text: "Examples",
|
|
99
|
+
collapsed: false,
|
|
100
|
+
items: [
|
|
101
|
+
{ text: "Basic Color Operations", link: "/examples/basic-colors" },
|
|
102
|
+
{ text: "Creating Themes", link: "/examples/creating-themes" },
|
|
103
|
+
{ text: "CSS Refactoring", link: "/examples/css-refactoring" },
|
|
104
|
+
{
|
|
105
|
+
text: "Image Color Extraction",
|
|
106
|
+
link: "/examples/image-extraction",
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
text: "Resources",
|
|
112
|
+
collapsed: false,
|
|
113
|
+
items: [
|
|
114
|
+
{ text: "Troubleshooting", link: "/resources/troubleshooting" },
|
|
115
|
+
{ text: "FAQ", link: "/resources/faq" },
|
|
116
|
+
{ text: "Contributing", link: "/contributing" },
|
|
117
|
+
],
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
text: "Advanced",
|
|
121
|
+
collapsed: true,
|
|
122
|
+
items: [
|
|
123
|
+
{ text: "Custom Palettes", link: "/advanced/custom-palettes" },
|
|
124
|
+
{ text: "Batch Processing", link: "/advanced/batch-processing" },
|
|
125
|
+
{ text: "Integration Patterns", link: "/advanced/integration" },
|
|
126
|
+
],
|
|
127
|
+
},
|
|
128
|
+
],
|
|
103
129
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
},
|
|
130
|
+
socialLinks: [
|
|
131
|
+
{ icon: "github", link: "https://github.com/x51xxx/coolors-mcp" },
|
|
132
|
+
],
|
|
108
133
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
134
|
+
footer: {
|
|
135
|
+
message: "Released under the MIT License.",
|
|
136
|
+
copyright: `Copyright © ${new Date().getFullYear()} Coolors MCP Contributors`,
|
|
137
|
+
},
|
|
138
|
+
|
|
139
|
+
search: {
|
|
140
|
+
provider: "local",
|
|
141
|
+
options: {
|
|
142
|
+
placeholder: "Search docs...",
|
|
143
|
+
detailedView: true,
|
|
144
|
+
translations: {
|
|
145
|
+
button: {
|
|
146
|
+
buttonText: "Search",
|
|
147
|
+
buttonAriaLabel: "Search documentation",
|
|
148
|
+
},
|
|
149
|
+
modal: {
|
|
150
|
+
noResultsText: "No results found",
|
|
151
|
+
resetButtonTitle: "Clear search",
|
|
152
|
+
footer: {
|
|
153
|
+
selectText: "to select",
|
|
154
|
+
navigateText: "to navigate",
|
|
155
|
+
closeText: "to close",
|
|
156
|
+
},
|
|
157
|
+
},
|
|
118
158
|
},
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
resetButtonTitle: 'Clear search',
|
|
122
|
-
footer: {
|
|
123
|
-
selectText: 'to select',
|
|
124
|
-
navigateText: 'to navigate',
|
|
125
|
-
closeText: 'to close'
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
},
|
|
159
|
+
},
|
|
160
|
+
},
|
|
131
161
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
162
|
+
editLink: {
|
|
163
|
+
pattern: "https://github.com/x51xxx/coolors-mcp/edit/main/docs/:path",
|
|
164
|
+
text: "Edit this page on GitHub",
|
|
165
|
+
},
|
|
136
166
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
167
|
+
lastUpdated: {
|
|
168
|
+
text: "Last updated",
|
|
169
|
+
formatOptions: {
|
|
170
|
+
dateStyle: "medium",
|
|
171
|
+
timeStyle: "short",
|
|
172
|
+
},
|
|
173
|
+
},
|
|
144
174
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
175
|
+
docFooter: {
|
|
176
|
+
prev: "Previous page",
|
|
177
|
+
next: "Next page",
|
|
178
|
+
},
|
|
149
179
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
180
|
+
outline: {
|
|
181
|
+
label: "On this page",
|
|
182
|
+
level: [2, 3],
|
|
183
|
+
},
|
|
154
184
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
})
|
|
162
|
-
)
|
|
185
|
+
returnToTopLabel: "Return to top",
|
|
186
|
+
sidebarMenuLabel: "Menu",
|
|
187
|
+
darkModeSwitchLabel: "Appearance",
|
|
188
|
+
lightModeSwitchTitle: "Switch to light theme",
|
|
189
|
+
darkModeSwitchTitle: "Switch to dark theme",
|
|
190
|
+
},
|
|
191
|
+
}),
|
|
192
|
+
);
|