@trishchuk/coolors-mcp 1.0.0 → 1.0.1
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/.claude/settings.local.json +2 -6
- 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 +97 -97
- package/.github/workflows/deploy-docs.yml +9 -9
- package/.github/workflows/release.yml +15 -15
- package/README.md +26 -1
- package/TOOLS_UK.md +233 -0
- package/docs/.vitepress/cache/deps/@braintree_sanitize-url.js +30 -12
- package/docs/.vitepress/cache/deps/_metadata.json +1 -1
- package/docs/.vitepress/cache/deps/chunk-BUSYA2B4.js +9 -6
- package/docs/.vitepress/cache/deps/chunk-JD3CXNQ6.js +2543 -1612
- package/docs/.vitepress/cache/deps/chunk-SYPOPCWC.js +3508 -2529
- package/docs/.vitepress/cache/deps/cytoscape-cose-bilkent.js +1902 -1003
- package/docs/.vitepress/cache/deps/cytoscape.js +13303 -7347
- package/docs/.vitepress/cache/deps/dayjs.js +494 -272
- package/docs/.vitepress/cache/deps/debug.js +82 -38
- package/docs/.vitepress/cache/deps/prismjs.js +444 -272
- package/docs/.vitepress/cache/deps/prismjs_components_prism-bash.js +80 -73
- package/docs/.vitepress/cache/deps/prismjs_components_prism-javascript.js +93 -62
- package/docs/.vitepress/cache/deps/prismjs_components_prism-json.js +13 -13
- package/docs/.vitepress/cache/deps/prismjs_components_prism-python.js +34 -27
- package/docs/.vitepress/cache/deps/prismjs_components_prism-typescript.js +20 -17
- package/docs/.vitepress/cache/deps/prismjs_components_prism-yaml.js +75 -41
- package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +2005 -1438
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +2 -2
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js +566 -229
- package/docs/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js +382 -270
- package/docs/.vitepress/cache/deps/vitepress___minisearch.js +334 -125
- package/docs/.vitepress/cache/deps/vue.js +2 -2
- 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/note.md +1 -2
- package/package.json +2 -2
|
@@ -167,7 +167,7 @@ import {
|
|
|
167
167
|
withKeys,
|
|
168
168
|
withMemo,
|
|
169
169
|
withModifiers,
|
|
170
|
-
withScopeId
|
|
170
|
+
withScopeId,
|
|
171
171
|
} from "./chunk-JD3CXNQ6.js";
|
|
172
172
|
import "./chunk-BUSYA2B4.js";
|
|
173
173
|
export {
|
|
@@ -339,6 +339,6 @@ export {
|
|
|
339
339
|
withKeys,
|
|
340
340
|
withMemo,
|
|
341
341
|
withModifiers,
|
|
342
|
-
withScopeId
|
|
342
|
+
withScopeId,
|
|
343
343
|
};
|
|
344
344
|
//# sourceMappingURL=vue.js.map
|
|
@@ -86,7 +86,9 @@ html:not(.dark) :deep(.client-button:hover) {
|
|
|
86
86
|
background: var(--vp-c-brand-2);
|
|
87
87
|
color: white;
|
|
88
88
|
transform: translateY(-3px);
|
|
89
|
-
box-shadow:
|
|
89
|
+
box-shadow:
|
|
90
|
+
0 8px 20px rgba(66, 184, 131, 0.4),
|
|
91
|
+
0 4px 8px rgba(0, 0, 0, 0.15);
|
|
90
92
|
filter: brightness(1.1);
|
|
91
93
|
}
|
|
92
94
|
|
|
@@ -100,7 +102,9 @@ html:not(.dark) :deep(.client-button:hover) {
|
|
|
100
102
|
background: var(--vp-c-brand-2);
|
|
101
103
|
color: white;
|
|
102
104
|
transform: translateY(-3px);
|
|
103
|
-
box-shadow:
|
|
105
|
+
box-shadow:
|
|
106
|
+
0 8px 20px rgba(66, 184, 131, 0.6),
|
|
107
|
+
0 4px 8px rgba(66, 184, 131, 0.3);
|
|
104
108
|
filter: brightness(1.1);
|
|
105
109
|
}
|
|
106
110
|
|
|
@@ -120,6 +124,8 @@ html:not(.dark) :deep(.client-button:hover) {
|
|
|
120
124
|
}
|
|
121
125
|
|
|
122
126
|
@keyframes spin {
|
|
123
|
-
to {
|
|
127
|
+
to {
|
|
128
|
+
transform: rotate(360deg);
|
|
129
|
+
}
|
|
124
130
|
}
|
|
125
131
|
</style>
|
|
@@ -2,21 +2,21 @@
|
|
|
2
2
|
<div class="code-block-container">
|
|
3
3
|
<span class="language-indicator">{{ language }}</span>
|
|
4
4
|
<div class="code-lines">
|
|
5
|
-
<div
|
|
6
|
-
v-for="(line, index) in lines"
|
|
5
|
+
<div
|
|
6
|
+
v-for="(line, index) in lines"
|
|
7
7
|
:key="index"
|
|
8
8
|
class="code-line"
|
|
9
9
|
@mouseenter="hoveredLine = index"
|
|
10
10
|
@mouseleave="hoveredLine = null"
|
|
11
11
|
>
|
|
12
12
|
<span class="line-number">{{ index + 1 }}</span>
|
|
13
|
-
<button
|
|
13
|
+
<button
|
|
14
14
|
v-show="hoveredLine === index"
|
|
15
15
|
@click="copyLine(line, index)"
|
|
16
16
|
class="copy-line-button"
|
|
17
17
|
:title="`Copy line ${index + 1}`"
|
|
18
18
|
>
|
|
19
|
-
{{ copiedLine === index ?
|
|
19
|
+
{{ copiedLine === index ? "✓" : "📋" }}
|
|
20
20
|
</button>
|
|
21
21
|
<span class="line-content" v-html="line || '\u00A0'"></span>
|
|
22
22
|
</div>
|
|
@@ -25,73 +25,80 @@
|
|
|
25
25
|
</template>
|
|
26
26
|
|
|
27
27
|
<script setup>
|
|
28
|
-
import { ref, computed, onMounted, watch } from
|
|
28
|
+
import { ref, computed, onMounted, watch } from "vue";
|
|
29
29
|
// Lazy-load Prism on client to avoid SSR/import issues
|
|
30
|
-
let Prism = null
|
|
30
|
+
let Prism = null;
|
|
31
31
|
|
|
32
32
|
const props = defineProps({
|
|
33
33
|
code: {
|
|
34
34
|
type: String,
|
|
35
|
-
default:
|
|
35
|
+
default: "// No code provided",
|
|
36
36
|
},
|
|
37
37
|
language: {
|
|
38
38
|
type: String,
|
|
39
|
-
default:
|
|
40
|
-
}
|
|
41
|
-
})
|
|
39
|
+
default: "javascript",
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
42
|
|
|
43
|
-
const hoveredLine = ref(null)
|
|
44
|
-
const copiedLine = ref(null)
|
|
43
|
+
const hoveredLine = ref(null);
|
|
44
|
+
const copiedLine = ref(null);
|
|
45
45
|
|
|
46
|
-
const highlightedCode = ref(
|
|
46
|
+
const highlightedCode = ref("");
|
|
47
47
|
|
|
48
48
|
const lines = computed(() => {
|
|
49
|
-
return highlightedCode.value.split(
|
|
50
|
-
})
|
|
49
|
+
return highlightedCode.value.split("\n");
|
|
50
|
+
});
|
|
51
51
|
|
|
52
52
|
const ensurePrism = async () => {
|
|
53
|
-
if (typeof window ===
|
|
53
|
+
if (typeof window === "undefined") return;
|
|
54
54
|
if (!Prism) {
|
|
55
|
-
const mod = await import(
|
|
55
|
+
const mod = await import("prismjs");
|
|
56
56
|
// Load languages and theme
|
|
57
57
|
await Promise.all([
|
|
58
|
-
import(
|
|
59
|
-
import(
|
|
60
|
-
import(
|
|
61
|
-
import(
|
|
62
|
-
import(
|
|
63
|
-
import(
|
|
64
|
-
import(
|
|
65
|
-
])
|
|
66
|
-
Prism =
|
|
58
|
+
import("prismjs/components/prism-bash"),
|
|
59
|
+
import("prismjs/components/prism-python"),
|
|
60
|
+
import("prismjs/components/prism-typescript"),
|
|
61
|
+
import("prismjs/components/prism-javascript"),
|
|
62
|
+
import("prismjs/components/prism-json"),
|
|
63
|
+
import("prismjs/components/prism-yaml"),
|
|
64
|
+
import("prismjs/themes/prism-tomorrow.css"),
|
|
65
|
+
]);
|
|
66
|
+
Prism = mod && "default" in mod ? mod.default : mod;
|
|
67
67
|
}
|
|
68
|
-
}
|
|
68
|
+
};
|
|
69
69
|
|
|
70
70
|
const highlightCode = async () => {
|
|
71
|
-
await ensurePrism()
|
|
71
|
+
await ensurePrism();
|
|
72
72
|
if (!Prism) {
|
|
73
|
-
highlightedCode.value = props.code
|
|
74
|
-
return
|
|
73
|
+
highlightedCode.value = props.code;
|
|
74
|
+
return;
|
|
75
75
|
}
|
|
76
|
-
const grammar = Prism.languages[props.language] || Prism.languages.plaintext
|
|
77
|
-
highlightedCode.value = Prism.highlight(props.code, grammar, props.language)
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
onMounted(() => {
|
|
81
|
-
|
|
76
|
+
const grammar = Prism.languages[props.language] || Prism.languages.plaintext;
|
|
77
|
+
highlightedCode.value = Prism.highlight(props.code, grammar, props.language);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
onMounted(() => {
|
|
81
|
+
highlightCode();
|
|
82
|
+
});
|
|
83
|
+
watch(
|
|
84
|
+
() => [props.code, props.language],
|
|
85
|
+
() => {
|
|
86
|
+
highlightCode();
|
|
87
|
+
},
|
|
88
|
+
);
|
|
82
89
|
|
|
83
90
|
const copyLine = async (line, index) => {
|
|
84
91
|
try {
|
|
85
|
-
const plainLine = props.code.split(
|
|
86
|
-
await navigator.clipboard.writeText(plainLine)
|
|
87
|
-
copiedLine.value = index
|
|
92
|
+
const plainLine = props.code.split("\n")[index];
|
|
93
|
+
await navigator.clipboard.writeText(plainLine);
|
|
94
|
+
copiedLine.value = index;
|
|
88
95
|
setTimeout(() => {
|
|
89
|
-
copiedLine.value = null
|
|
90
|
-
}, 1500)
|
|
96
|
+
copiedLine.value = null;
|
|
97
|
+
}, 1500);
|
|
91
98
|
} catch (err) {
|
|
92
|
-
console.error(
|
|
99
|
+
console.error("Failed to copy line:", err);
|
|
93
100
|
}
|
|
94
|
-
}
|
|
101
|
+
};
|
|
95
102
|
</script>
|
|
96
103
|
|
|
97
104
|
<style scoped>
|
|
@@ -100,7 +107,7 @@ const copyLine = async (line, index) => {
|
|
|
100
107
|
border-radius: 6px;
|
|
101
108
|
overflow: hidden;
|
|
102
109
|
margin: 16px 0;
|
|
103
|
-
font-family:
|
|
110
|
+
font-family: "Monaco", "Menlo", "Ubuntu Mono", monospace;
|
|
104
111
|
position: relative;
|
|
105
112
|
}
|
|
106
113
|
|
|
@@ -17,9 +17,11 @@
|
|
|
17
17
|
<span class="config-badge">Config Files</span>
|
|
18
18
|
<h2>Claude Desktop Configuration</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="config-section">
|
|
25
27
|
<h3 class="section-title">
|
|
@@ -31,40 +33,107 @@
|
|
|
31
33
|
<strong>🍎 macOS</strong>
|
|
32
34
|
</div>
|
|
33
35
|
<div class="file-path">
|
|
34
|
-
<code
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
<code
|
|
37
|
+
>~/Library/Application
|
|
38
|
+
Support/Claude/claude_desktop_config.json</code
|
|
39
|
+
>
|
|
40
|
+
<button
|
|
41
|
+
class="copy-path-btn"
|
|
42
|
+
@click="
|
|
43
|
+
copyPath(
|
|
44
|
+
'~/Library/Application Support/Claude/claude_desktop_config.json',
|
|
45
|
+
)
|
|
46
|
+
"
|
|
47
|
+
title="Copy path"
|
|
48
|
+
>
|
|
49
|
+
<svg
|
|
50
|
+
width="14"
|
|
51
|
+
height="14"
|
|
52
|
+
viewBox="0 0 24 24"
|
|
53
|
+
fill="none"
|
|
54
|
+
stroke="currentColor"
|
|
55
|
+
stroke-width="1.5"
|
|
56
|
+
>
|
|
57
|
+
<rect
|
|
58
|
+
x="9"
|
|
59
|
+
y="9"
|
|
60
|
+
width="13"
|
|
61
|
+
height="13"
|
|
62
|
+
rx="2"
|
|
63
|
+
ry="2"
|
|
64
|
+
></rect>
|
|
65
|
+
<path
|
|
66
|
+
d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"
|
|
67
|
+
></path>
|
|
39
68
|
</svg>
|
|
40
69
|
</button>
|
|
41
70
|
</div>
|
|
42
71
|
</div>
|
|
43
|
-
|
|
72
|
+
|
|
44
73
|
<div class="location-item">
|
|
45
74
|
<div class="platform-name">
|
|
46
75
|
<strong>🪟 Windows</strong>
|
|
47
76
|
</div>
|
|
48
77
|
<div class="file-path">
|
|
49
78
|
<code>%APPDATA%\Claude\claude_desktop_config.json</code>
|
|
50
|
-
<button
|
|
51
|
-
|
|
52
|
-
|
|
79
|
+
<button
|
|
80
|
+
class="copy-path-btn"
|
|
81
|
+
@click="
|
|
82
|
+
copyPath('%APPDATA%\\Claude\\claude_desktop_config.json')
|
|
83
|
+
"
|
|
84
|
+
title="Copy path"
|
|
85
|
+
>
|
|
86
|
+
<svg
|
|
87
|
+
width="14"
|
|
88
|
+
height="14"
|
|
89
|
+
viewBox="0 0 24 24"
|
|
90
|
+
fill="none"
|
|
91
|
+
stroke="currentColor"
|
|
92
|
+
stroke-width="1.5"
|
|
93
|
+
>
|
|
94
|
+
<rect
|
|
95
|
+
x="9"
|
|
96
|
+
y="9"
|
|
97
|
+
width="13"
|
|
98
|
+
height="13"
|
|
99
|
+
rx="2"
|
|
100
|
+
ry="2"
|
|
101
|
+
></rect>
|
|
53
102
|
<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2 2v1"></path>
|
|
54
103
|
</svg>
|
|
55
104
|
</button>
|
|
56
105
|
</div>
|
|
57
106
|
</div>
|
|
58
|
-
|
|
107
|
+
|
|
59
108
|
<div class="location-item">
|
|
60
109
|
<div class="platform-name">
|
|
61
110
|
<strong>🐧 Linux</strong>
|
|
62
111
|
</div>
|
|
63
112
|
<div class="file-path">
|
|
64
113
|
<code>~/.config/claude/claude_desktop_config.json</code>
|
|
65
|
-
<button
|
|
66
|
-
|
|
67
|
-
|
|
114
|
+
<button
|
|
115
|
+
class="copy-path-btn"
|
|
116
|
+
@click="
|
|
117
|
+
copyPath('~/.config/claude/claude_desktop_config.json')
|
|
118
|
+
"
|
|
119
|
+
title="Copy path"
|
|
120
|
+
>
|
|
121
|
+
<svg
|
|
122
|
+
width="14"
|
|
123
|
+
height="14"
|
|
124
|
+
viewBox="0 0 24 24"
|
|
125
|
+
fill="none"
|
|
126
|
+
stroke="currentColor"
|
|
127
|
+
stroke-width="1.5"
|
|
128
|
+
>
|
|
129
|
+
<rect
|
|
130
|
+
x="9"
|
|
131
|
+
y="9"
|
|
132
|
+
width="13"
|
|
133
|
+
height="13"
|
|
134
|
+
rx="2"
|
|
135
|
+
ry="2"
|
|
136
|
+
></rect>
|
|
68
137
|
<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2 2v1"></path>
|
|
69
138
|
</svg>
|
|
70
139
|
</button>
|
|
@@ -78,72 +147,72 @@
|
|
|
78
147
|
</template>
|
|
79
148
|
|
|
80
149
|
<script setup>
|
|
81
|
-
import { ref, onMounted, onUnmounted } from
|
|
150
|
+
import { ref, onMounted, onUnmounted } from "vue";
|
|
82
151
|
|
|
83
|
-
const isOpen = ref(false)
|
|
152
|
+
const isOpen = ref(false);
|
|
84
153
|
|
|
85
154
|
const openModal = () => {
|
|
86
|
-
isOpen.value = true
|
|
87
|
-
document.body.style.overflow =
|
|
88
|
-
}
|
|
155
|
+
isOpen.value = true;
|
|
156
|
+
document.body.style.overflow = "hidden";
|
|
157
|
+
};
|
|
89
158
|
|
|
90
159
|
const closeModal = () => {
|
|
91
|
-
isOpen.value = false
|
|
92
|
-
document.body.style.overflow =
|
|
93
|
-
}
|
|
160
|
+
isOpen.value = false;
|
|
161
|
+
document.body.style.overflow = "";
|
|
162
|
+
};
|
|
94
163
|
|
|
95
164
|
const copyPath = async (path) => {
|
|
96
165
|
try {
|
|
97
166
|
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
98
|
-
await navigator.clipboard.writeText(path)
|
|
167
|
+
await navigator.clipboard.writeText(path);
|
|
99
168
|
} else {
|
|
100
169
|
// Fallback for older browsers
|
|
101
|
-
const textArea = document.createElement(
|
|
102
|
-
textArea.value = path
|
|
103
|
-
textArea.style.position =
|
|
104
|
-
textArea.style.left =
|
|
105
|
-
document.body.appendChild(textArea)
|
|
106
|
-
textArea.select()
|
|
107
|
-
document.execCommand(
|
|
108
|
-
document.body.removeChild(textArea)
|
|
170
|
+
const textArea = document.createElement("textarea");
|
|
171
|
+
textArea.value = path;
|
|
172
|
+
textArea.style.position = "fixed";
|
|
173
|
+
textArea.style.left = "-9999px";
|
|
174
|
+
document.body.appendChild(textArea);
|
|
175
|
+
textArea.select();
|
|
176
|
+
document.execCommand("copy");
|
|
177
|
+
document.body.removeChild(textArea);
|
|
109
178
|
}
|
|
110
|
-
|
|
179
|
+
|
|
111
180
|
// Visual feedback - find the button that was clicked
|
|
112
|
-
const button = event.target.closest(
|
|
181
|
+
const button = event.target.closest(".copy-path-btn");
|
|
113
182
|
if (button) {
|
|
114
|
-
const originalContent = button.innerHTML
|
|
115
|
-
button.classList.add(
|
|
183
|
+
const originalContent = button.innerHTML;
|
|
184
|
+
button.classList.add("copied");
|
|
116
185
|
button.innerHTML = `
|
|
117
186
|
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
|
|
118
187
|
<polyline points="20,6 9,17 4,12"></polyline>
|
|
119
188
|
</svg>
|
|
120
|
-
|
|
121
|
-
|
|
189
|
+
`;
|
|
190
|
+
|
|
122
191
|
// Reset after 2 seconds
|
|
123
192
|
setTimeout(() => {
|
|
124
|
-
button.classList.remove(
|
|
125
|
-
button.innerHTML = originalContent
|
|
126
|
-
}, 2000)
|
|
193
|
+
button.classList.remove("copied");
|
|
194
|
+
button.innerHTML = originalContent;
|
|
195
|
+
}, 2000);
|
|
127
196
|
}
|
|
128
197
|
} catch (err) {
|
|
129
|
-
console.error(
|
|
198
|
+
console.error("Failed to copy path:", err);
|
|
130
199
|
}
|
|
131
|
-
}
|
|
200
|
+
};
|
|
132
201
|
|
|
133
202
|
const handleKeydown = (e) => {
|
|
134
|
-
if (e.key ===
|
|
135
|
-
closeModal()
|
|
203
|
+
if (e.key === "Escape" && isOpen.value) {
|
|
204
|
+
closeModal();
|
|
136
205
|
}
|
|
137
|
-
}
|
|
206
|
+
};
|
|
138
207
|
|
|
139
208
|
onMounted(() => {
|
|
140
|
-
document.addEventListener(
|
|
141
|
-
})
|
|
209
|
+
document.addEventListener("keydown", handleKeydown);
|
|
210
|
+
});
|
|
142
211
|
|
|
143
212
|
onUnmounted(() => {
|
|
144
|
-
document.removeEventListener(
|
|
145
|
-
document.body.style.overflow =
|
|
146
|
-
})
|
|
213
|
+
document.removeEventListener("keydown", handleKeydown);
|
|
214
|
+
document.body.style.overflow = "";
|
|
215
|
+
});
|
|
147
216
|
</script>
|
|
148
217
|
|
|
149
218
|
<style scoped>
|
|
@@ -154,7 +223,11 @@ onUnmounted(() => {
|
|
|
154
223
|
margin: 16px 0;
|
|
155
224
|
cursor: pointer;
|
|
156
225
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
157
|
-
background: linear-gradient(
|
|
226
|
+
background: linear-gradient(
|
|
227
|
+
135deg,
|
|
228
|
+
var(--vp-c-bg-soft) 0%,
|
|
229
|
+
var(--vp-c-bg-alt) 100%
|
|
230
|
+
);
|
|
158
231
|
border-left: 4px solid var(--vp-c-brand);
|
|
159
232
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
|
|
160
233
|
position: relative;
|
|
@@ -164,18 +237,29 @@ onUnmounted(() => {
|
|
|
164
237
|
.config-card:hover {
|
|
165
238
|
border-color: var(--vp-c-brand);
|
|
166
239
|
transform: translateY(-8px) scale(1.02);
|
|
167
|
-
box-shadow:
|
|
168
|
-
|
|
240
|
+
box-shadow:
|
|
241
|
+
0 20px 40px rgba(0, 0, 0, 0.15),
|
|
242
|
+
0 0 0 1px var(--vp-c-brand-light);
|
|
243
|
+
background: linear-gradient(
|
|
244
|
+
135deg,
|
|
245
|
+
var(--vp-c-bg) 0%,
|
|
246
|
+
var(--vp-c-bg-soft) 100%
|
|
247
|
+
);
|
|
169
248
|
}
|
|
170
249
|
|
|
171
250
|
.config-card::before {
|
|
172
|
-
content:
|
|
251
|
+
content: "";
|
|
173
252
|
position: absolute;
|
|
174
253
|
top: -2px;
|
|
175
254
|
left: -2px;
|
|
176
255
|
right: -2px;
|
|
177
256
|
bottom: -2px;
|
|
178
|
-
background: linear-gradient(
|
|
257
|
+
background: linear-gradient(
|
|
258
|
+
45deg,
|
|
259
|
+
var(--vp-c-brand),
|
|
260
|
+
transparent,
|
|
261
|
+
var(--vp-c-brand)
|
|
262
|
+
);
|
|
179
263
|
border-radius: 12px;
|
|
180
264
|
opacity: 0;
|
|
181
265
|
transition: opacity 0.3s ease;
|
|
@@ -187,7 +271,7 @@ onUnmounted(() => {
|
|
|
187
271
|
}
|
|
188
272
|
|
|
189
273
|
.config-card::after {
|
|
190
|
-
content:
|
|
274
|
+
content: "✨";
|
|
191
275
|
position: absolute;
|
|
192
276
|
top: 10px;
|
|
193
277
|
right: 15px;
|
|
@@ -430,48 +514,48 @@ onUnmounted(() => {
|
|
|
430
514
|
width: 95vw;
|
|
431
515
|
max-height: 90vh;
|
|
432
516
|
}
|
|
433
|
-
|
|
517
|
+
|
|
434
518
|
.modal-header {
|
|
435
519
|
padding: 16px 20px;
|
|
436
520
|
}
|
|
437
|
-
|
|
521
|
+
|
|
438
522
|
.modal-title h2 {
|
|
439
523
|
font-size: 18px;
|
|
440
524
|
}
|
|
441
|
-
|
|
525
|
+
|
|
442
526
|
.modal-body {
|
|
443
527
|
padding: 20px;
|
|
444
528
|
}
|
|
445
|
-
|
|
529
|
+
|
|
446
530
|
.config-card {
|
|
447
531
|
padding: 14px;
|
|
448
532
|
}
|
|
449
|
-
|
|
533
|
+
|
|
450
534
|
.config-header {
|
|
451
535
|
flex-direction: column;
|
|
452
536
|
align-items: flex-start;
|
|
453
537
|
gap: 4px;
|
|
454
538
|
}
|
|
455
|
-
|
|
539
|
+
|
|
456
540
|
.expand-hint {
|
|
457
541
|
opacity: 1;
|
|
458
542
|
font-size: 11px;
|
|
459
543
|
}
|
|
460
|
-
|
|
544
|
+
|
|
461
545
|
.location-item {
|
|
462
546
|
padding: 12px;
|
|
463
547
|
}
|
|
464
|
-
|
|
548
|
+
|
|
465
549
|
.file-path {
|
|
466
550
|
flex-direction: column;
|
|
467
551
|
align-items: stretch;
|
|
468
552
|
gap: 8px;
|
|
469
553
|
}
|
|
470
|
-
|
|
554
|
+
|
|
471
555
|
.copy-path-btn {
|
|
472
556
|
align-self: flex-end;
|
|
473
557
|
width: 32px;
|
|
474
558
|
height: 32px;
|
|
475
559
|
}
|
|
476
560
|
}
|
|
477
|
-
</style>
|
|
561
|
+
</style>
|