@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
|
@@ -1,54 +1,78 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="diagram-wrapper">
|
|
3
3
|
<!-- Always visible diagram -->
|
|
4
|
-
<div
|
|
5
|
-
class="diagram-container"
|
|
6
|
-
@click="openModal"
|
|
7
|
-
:style="containerStyle"
|
|
8
|
-
>
|
|
4
|
+
<div class="diagram-container" @click="openModal" :style="containerStyle">
|
|
9
5
|
<div class="diagram-preview">
|
|
10
6
|
<slot />
|
|
11
7
|
</div>
|
|
12
8
|
<div class="zoom-hint">
|
|
13
|
-
<svg
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
9
|
+
<svg
|
|
10
|
+
width="20"
|
|
11
|
+
height="20"
|
|
12
|
+
viewBox="0 0 24 24"
|
|
13
|
+
fill="none"
|
|
14
|
+
stroke="currentColor"
|
|
15
|
+
stroke-width="2"
|
|
16
|
+
>
|
|
17
|
+
<circle cx="11" cy="11" r="8" />
|
|
18
|
+
<path d="21 21l-4.35-4.35" />
|
|
19
|
+
<path d="15 11h-8" />
|
|
20
|
+
<path d="11 15v-8" />
|
|
18
21
|
</svg>
|
|
19
22
|
<span>Click to enlarge</span>
|
|
20
23
|
</div>
|
|
21
24
|
</div>
|
|
22
|
-
|
|
25
|
+
|
|
23
26
|
<!-- Modal overlay -->
|
|
24
|
-
<div
|
|
25
|
-
v-if="isOpen"
|
|
26
|
-
class="diagram-modal"
|
|
27
|
-
@click="closeModal"
|
|
28
|
-
>
|
|
27
|
+
<div v-if="isOpen" class="diagram-modal" @click="closeModal">
|
|
29
28
|
<div class="modal-content" @click.stop>
|
|
30
29
|
<div class="modal-header">
|
|
31
30
|
<div class="modal-controls">
|
|
32
31
|
<div class="zoom-controls">
|
|
33
|
-
<button
|
|
32
|
+
<button
|
|
33
|
+
@click="zoomOut"
|
|
34
|
+
class="control-btn"
|
|
35
|
+
title="Zoom out"
|
|
36
|
+
:disabled="scale <= 0.1"
|
|
37
|
+
>
|
|
34
38
|
<span class="zoom-symbol">−</span>
|
|
35
39
|
</button>
|
|
36
40
|
<span class="zoom-info">{{ Math.round(scale * 100) }}%</span>
|
|
37
|
-
<button
|
|
41
|
+
<button
|
|
42
|
+
@click="zoomIn"
|
|
43
|
+
class="control-btn"
|
|
44
|
+
title="Zoom in"
|
|
45
|
+
:disabled="scale >= maxZoom"
|
|
46
|
+
>
|
|
38
47
|
<span class="zoom-symbol">+</span>
|
|
39
48
|
</button>
|
|
40
49
|
</div>
|
|
41
50
|
<div class="action-controls">
|
|
42
|
-
<button
|
|
43
|
-
|
|
44
|
-
|
|
51
|
+
<button
|
|
52
|
+
@click="fitToScreen"
|
|
53
|
+
class="control-btn"
|
|
54
|
+
title="Fit to screen"
|
|
55
|
+
>
|
|
56
|
+
<svg
|
|
57
|
+
width="16"
|
|
58
|
+
height="16"
|
|
59
|
+
viewBox="0 0 24 24"
|
|
60
|
+
fill="none"
|
|
61
|
+
stroke="currentColor"
|
|
62
|
+
stroke-width="2"
|
|
63
|
+
>
|
|
64
|
+
<path
|
|
65
|
+
d="M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3"
|
|
66
|
+
/>
|
|
45
67
|
</svg>
|
|
46
68
|
</button>
|
|
47
|
-
<button @click="closeModal" class="close-btn" title="Close"
|
|
69
|
+
<button @click="closeModal" class="close-btn" title="Close">
|
|
70
|
+
×
|
|
71
|
+
</button>
|
|
48
72
|
</div>
|
|
49
73
|
</div>
|
|
50
74
|
</div>
|
|
51
|
-
<div
|
|
75
|
+
<div
|
|
52
76
|
class="diagram-zoom-container"
|
|
53
77
|
ref="zoomContainer"
|
|
54
78
|
@wheel="handleZoom"
|
|
@@ -60,7 +84,7 @@
|
|
|
60
84
|
@touchend="endPan"
|
|
61
85
|
>
|
|
62
86
|
<div class="diagram-content">
|
|
63
|
-
<div
|
|
87
|
+
<div
|
|
64
88
|
class="diagram-transform-wrapper"
|
|
65
89
|
:style="contentStyle"
|
|
66
90
|
ref="modalContent"
|
|
@@ -75,189 +99,192 @@
|
|
|
75
99
|
</template>
|
|
76
100
|
|
|
77
101
|
<script setup>
|
|
78
|
-
import { ref, computed, onMounted, onUnmounted } from
|
|
79
|
-
|
|
80
|
-
const isOpen = ref(false)
|
|
81
|
-
const scale = ref(1)
|
|
82
|
-
const translateX = ref(0)
|
|
83
|
-
const translateY = ref(0)
|
|
84
|
-
const fitScale = ref(1)
|
|
85
|
-
const isPanning = ref(false)
|
|
86
|
-
const startX = ref(0)
|
|
87
|
-
const startY = ref(0)
|
|
88
|
-
const zoomContainer = ref(null)
|
|
102
|
+
import { ref, computed, onMounted, onUnmounted } from "vue";
|
|
103
|
+
|
|
104
|
+
const isOpen = ref(false);
|
|
105
|
+
const scale = ref(1);
|
|
106
|
+
const translateX = ref(0);
|
|
107
|
+
const translateY = ref(0);
|
|
108
|
+
const fitScale = ref(1);
|
|
109
|
+
const isPanning = ref(false);
|
|
110
|
+
const startX = ref(0);
|
|
111
|
+
const startY = ref(0);
|
|
112
|
+
const zoomContainer = ref(null);
|
|
89
113
|
|
|
90
114
|
const maxZoom = computed(() => {
|
|
91
|
-
return Math.max(5, fitScale.value * 5) // At least 5x, or 5x the fit scale
|
|
92
|
-
})
|
|
115
|
+
return Math.max(5, fitScale.value * 5); // At least 5x, or 5x the fit scale
|
|
116
|
+
});
|
|
93
117
|
|
|
94
118
|
const containerStyle = computed(() => ({
|
|
95
|
-
cursor:
|
|
96
|
-
border:
|
|
97
|
-
borderRadius:
|
|
98
|
-
padding:
|
|
99
|
-
margin:
|
|
100
|
-
transition:
|
|
101
|
-
|
|
102
|
-
borderColor:
|
|
103
|
-
}
|
|
104
|
-
}))
|
|
119
|
+
cursor: "pointer",
|
|
120
|
+
border: "1px solid #ddd",
|
|
121
|
+
borderRadius: "8px",
|
|
122
|
+
padding: "10px",
|
|
123
|
+
margin: "10px 0",
|
|
124
|
+
transition: "all 0.2s ease",
|
|
125
|
+
":hover": {
|
|
126
|
+
borderColor: "#999",
|
|
127
|
+
},
|
|
128
|
+
}));
|
|
105
129
|
|
|
106
130
|
const contentStyle = computed(() => ({
|
|
107
131
|
transform: `translate(${translateX.value}px, ${translateY.value}px) scale(${scale.value})`,
|
|
108
|
-
transformOrigin:
|
|
109
|
-
transition: isPanning.value ?
|
|
110
|
-
}))
|
|
132
|
+
transformOrigin: "center",
|
|
133
|
+
transition: isPanning.value ? "none" : "transform 0.2s ease",
|
|
134
|
+
}));
|
|
111
135
|
|
|
112
136
|
const openModal = () => {
|
|
113
|
-
isOpen.value = true
|
|
114
|
-
document.body.style.overflow =
|
|
137
|
+
isOpen.value = true;
|
|
138
|
+
document.body.style.overflow = "hidden";
|
|
115
139
|
// Start by fitting to screen
|
|
116
140
|
setTimeout(() => {
|
|
117
|
-
calculateFitScale()
|
|
118
|
-
fitToScreen()
|
|
119
|
-
}, 100)
|
|
120
|
-
}
|
|
141
|
+
calculateFitScale();
|
|
142
|
+
fitToScreen();
|
|
143
|
+
}, 100);
|
|
144
|
+
};
|
|
121
145
|
|
|
122
146
|
const closeModal = () => {
|
|
123
|
-
isOpen.value = false
|
|
124
|
-
document.body.style.overflow =
|
|
147
|
+
isOpen.value = false;
|
|
148
|
+
document.body.style.overflow = "";
|
|
125
149
|
// Reset zoom and pan for next time
|
|
126
|
-
scale.value = 1
|
|
127
|
-
translateX.value = 0
|
|
128
|
-
translateY.value = 0
|
|
129
|
-
}
|
|
130
|
-
|
|
150
|
+
scale.value = 1;
|
|
151
|
+
translateX.value = 0;
|
|
152
|
+
translateY.value = 0;
|
|
153
|
+
};
|
|
131
154
|
|
|
132
155
|
const zoomIn = () => {
|
|
133
|
-
scale.value = Math.min(maxZoom.value, scale.value + 0.2)
|
|
134
|
-
}
|
|
156
|
+
scale.value = Math.min(maxZoom.value, scale.value + 0.2);
|
|
157
|
+
};
|
|
135
158
|
|
|
136
159
|
const zoomOut = () => {
|
|
137
|
-
scale.value = Math.max(0.1, scale.value - 0.2)
|
|
138
|
-
}
|
|
160
|
+
scale.value = Math.max(0.1, scale.value - 0.2);
|
|
161
|
+
};
|
|
139
162
|
|
|
140
163
|
const fitToScreen = () => {
|
|
141
|
-
const container = zoomContainer.value
|
|
142
|
-
if (!container) return
|
|
143
|
-
|
|
164
|
+
const container = zoomContainer.value;
|
|
165
|
+
if (!container) return;
|
|
166
|
+
|
|
144
167
|
// Only calculate fit scale once per modal session
|
|
145
168
|
if (fitScale.value === 1) {
|
|
146
|
-
calculateFitScale()
|
|
169
|
+
calculateFitScale();
|
|
147
170
|
}
|
|
148
|
-
|
|
171
|
+
|
|
149
172
|
// Always use the stored fit scale
|
|
150
|
-
scale.value = fitScale.value
|
|
151
|
-
translateX.value = 0
|
|
152
|
-
translateY.value = 0
|
|
153
|
-
}
|
|
173
|
+
scale.value = fitScale.value;
|
|
174
|
+
translateX.value = 0;
|
|
175
|
+
translateY.value = 0;
|
|
176
|
+
};
|
|
154
177
|
|
|
155
178
|
const calculateFitScale = () => {
|
|
156
|
-
const container = zoomContainer.value
|
|
157
|
-
if (!container) return
|
|
158
|
-
|
|
179
|
+
const container = zoomContainer.value;
|
|
180
|
+
if (!container) return;
|
|
181
|
+
|
|
159
182
|
try {
|
|
160
|
-
const containerRect = container.getBoundingClientRect()
|
|
161
|
-
|
|
183
|
+
const containerRect = container.getBoundingClientRect();
|
|
184
|
+
|
|
162
185
|
// Try multiple selectors to find the diagram
|
|
163
186
|
const selectors = [
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
187
|
+
"svg",
|
|
188
|
+
".mermaid",
|
|
189
|
+
".mermaid svg",
|
|
167
190
|
'[data-processed="true"]',
|
|
168
191
|
'pre[class*="mermaid"]',
|
|
169
|
-
'div[class*="mermaid"]'
|
|
170
|
-
]
|
|
171
|
-
|
|
172
|
-
let diagramElement = null
|
|
173
|
-
let diagramRect = null
|
|
174
|
-
|
|
192
|
+
'div[class*="mermaid"]',
|
|
193
|
+
];
|
|
194
|
+
|
|
195
|
+
let diagramElement = null;
|
|
196
|
+
let diagramRect = null;
|
|
197
|
+
|
|
175
198
|
for (const selector of selectors) {
|
|
176
|
-
diagramElement = container.querySelector(selector)
|
|
199
|
+
diagramElement = container.querySelector(selector);
|
|
177
200
|
if (diagramElement) {
|
|
178
|
-
diagramRect = diagramElement.getBoundingClientRect()
|
|
201
|
+
diagramRect = diagramElement.getBoundingClientRect();
|
|
179
202
|
// Make sure we found a valid element with dimensions
|
|
180
203
|
if (diagramRect.width > 0 && diagramRect.height > 0) {
|
|
181
|
-
break
|
|
204
|
+
break;
|
|
182
205
|
}
|
|
183
206
|
}
|
|
184
207
|
}
|
|
185
|
-
|
|
186
|
-
if (
|
|
208
|
+
|
|
209
|
+
if (
|
|
210
|
+
!diagramElement ||
|
|
211
|
+
!diagramRect ||
|
|
212
|
+
diagramRect.width === 0 ||
|
|
213
|
+
diagramRect.height === 0
|
|
214
|
+
) {
|
|
187
215
|
// Final fallback: use the container content
|
|
188
|
-
const content = container.querySelector(
|
|
216
|
+
const content = container.querySelector(".diagram-content");
|
|
189
217
|
if (content) {
|
|
190
|
-
diagramRect = content.getBoundingClientRect()
|
|
218
|
+
diagramRect = content.getBoundingClientRect();
|
|
191
219
|
}
|
|
192
220
|
}
|
|
193
|
-
|
|
221
|
+
|
|
194
222
|
if (!diagramRect || diagramRect.width === 0 || diagramRect.height === 0) {
|
|
195
223
|
// Ultimate fallback
|
|
196
|
-
fitScale.value = 1.2
|
|
197
|
-
return
|
|
224
|
+
fitScale.value = 1.2;
|
|
225
|
+
return;
|
|
198
226
|
}
|
|
199
|
-
|
|
227
|
+
|
|
200
228
|
// Calculate scale to fit with padding
|
|
201
|
-
const padding = 40
|
|
202
|
-
const availableWidth = containerRect.width - padding
|
|
203
|
-
const availableHeight = containerRect.height - padding
|
|
204
|
-
|
|
205
|
-
const scaleX = availableWidth / diagramRect.width
|
|
206
|
-
const scaleY = availableHeight / diagramRect.height
|
|
207
|
-
|
|
229
|
+
const padding = 40;
|
|
230
|
+
const availableWidth = containerRect.width - padding;
|
|
231
|
+
const availableHeight = containerRect.height - padding;
|
|
232
|
+
|
|
233
|
+
const scaleX = availableWidth / diagramRect.width;
|
|
234
|
+
const scaleY = availableHeight / diagramRect.height;
|
|
235
|
+
|
|
208
236
|
// Use the smaller scale to ensure it fits both dimensions
|
|
209
|
-
const optimalScale = Math.min(scaleX, scaleY)
|
|
210
|
-
|
|
237
|
+
const optimalScale = Math.min(scaleX, scaleY);
|
|
238
|
+
|
|
211
239
|
// Apply reasonable bounds
|
|
212
|
-
fitScale.value = Math.max(0.3, Math.min(optimalScale, 4))
|
|
213
|
-
|
|
240
|
+
fitScale.value = Math.max(0.3, Math.min(optimalScale, 4));
|
|
214
241
|
} catch (error) {
|
|
215
|
-
console.warn(
|
|
216
|
-
fitScale.value = 1.2
|
|
242
|
+
console.warn("Error calculating fit scale:", error);
|
|
243
|
+
fitScale.value = 1.2;
|
|
217
244
|
}
|
|
218
|
-
}
|
|
245
|
+
};
|
|
219
246
|
|
|
220
247
|
const handleZoom = (e) => {
|
|
221
|
-
e.preventDefault()
|
|
222
|
-
const delta = e.deltaY > 0 ? -0.1 : 0.1
|
|
223
|
-
scale.value = Math.max(0.1, Math.min(maxZoom.value, scale.value + delta))
|
|
224
|
-
}
|
|
248
|
+
e.preventDefault();
|
|
249
|
+
const delta = e.deltaY > 0 ? -0.1 : 0.1;
|
|
250
|
+
scale.value = Math.max(0.1, Math.min(maxZoom.value, scale.value + delta));
|
|
251
|
+
};
|
|
225
252
|
|
|
226
253
|
const startPan = (e) => {
|
|
227
|
-
isPanning.value = true
|
|
228
|
-
const clientX = e.clientX || e.touches[0].clientX
|
|
229
|
-
const clientY = e.clientY || e.touches[0].clientY
|
|
230
|
-
startX.value = clientX - translateX.value
|
|
231
|
-
startY.value = clientY - translateY.value
|
|
232
|
-
}
|
|
254
|
+
isPanning.value = true;
|
|
255
|
+
const clientX = e.clientX || e.touches[0].clientX;
|
|
256
|
+
const clientY = e.clientY || e.touches[0].clientY;
|
|
257
|
+
startX.value = clientX - translateX.value;
|
|
258
|
+
startY.value = clientY - translateY.value;
|
|
259
|
+
};
|
|
233
260
|
|
|
234
261
|
const handlePan = (e) => {
|
|
235
|
-
if (!isPanning.value) return
|
|
236
|
-
e.preventDefault()
|
|
237
|
-
const clientX = e.clientX || e.touches[0].clientX
|
|
238
|
-
const clientY = e.clientY || e.touches[0].clientY
|
|
239
|
-
translateX.value = clientX - startX.value
|
|
240
|
-
translateY.value = clientY - startY.value
|
|
241
|
-
}
|
|
262
|
+
if (!isPanning.value) return;
|
|
263
|
+
e.preventDefault();
|
|
264
|
+
const clientX = e.clientX || e.touches[0].clientX;
|
|
265
|
+
const clientY = e.clientY || e.touches[0].clientY;
|
|
266
|
+
translateX.value = clientX - startX.value;
|
|
267
|
+
translateY.value = clientY - startY.value;
|
|
268
|
+
};
|
|
242
269
|
|
|
243
270
|
const endPan = () => {
|
|
244
|
-
isPanning.value = false
|
|
245
|
-
}
|
|
271
|
+
isPanning.value = false;
|
|
272
|
+
};
|
|
246
273
|
|
|
247
274
|
const handleKeydown = (e) => {
|
|
248
|
-
if (e.key ===
|
|
249
|
-
closeModal()
|
|
275
|
+
if (e.key === "Escape" && isOpen.value) {
|
|
276
|
+
closeModal();
|
|
250
277
|
}
|
|
251
|
-
}
|
|
278
|
+
};
|
|
252
279
|
|
|
253
280
|
onMounted(() => {
|
|
254
|
-
document.addEventListener(
|
|
255
|
-
})
|
|
281
|
+
document.addEventListener("keydown", handleKeydown);
|
|
282
|
+
});
|
|
256
283
|
|
|
257
284
|
onUnmounted(() => {
|
|
258
|
-
document.removeEventListener(
|
|
259
|
-
document.body.style.overflow =
|
|
260
|
-
})
|
|
285
|
+
document.removeEventListener("keydown", handleKeydown);
|
|
286
|
+
document.body.style.overflow = "";
|
|
287
|
+
});
|
|
261
288
|
</script>
|
|
262
289
|
|
|
263
290
|
<style scoped>
|
|
@@ -447,7 +474,11 @@ onUnmounted(() => {
|
|
|
447
474
|
cursor: grab;
|
|
448
475
|
position: relative;
|
|
449
476
|
background: var(--vp-c-bg);
|
|
450
|
-
background-image: radial-gradient(
|
|
477
|
+
background-image: radial-gradient(
|
|
478
|
+
circle,
|
|
479
|
+
var(--vp-c-border) 1px,
|
|
480
|
+
transparent 1px
|
|
481
|
+
);
|
|
451
482
|
background-size: 20px 20px;
|
|
452
483
|
background-position: 0 0;
|
|
453
484
|
}
|
|
@@ -474,32 +505,32 @@ onUnmounted(() => {
|
|
|
474
505
|
max-height: none;
|
|
475
506
|
border-radius: 0;
|
|
476
507
|
}
|
|
477
|
-
|
|
508
|
+
|
|
478
509
|
.modal-header {
|
|
479
510
|
padding: 10px 15px;
|
|
480
511
|
}
|
|
481
|
-
|
|
512
|
+
|
|
482
513
|
.modal-controls {
|
|
483
514
|
justify-content: center;
|
|
484
515
|
flex-wrap: wrap;
|
|
485
516
|
gap: 10px;
|
|
486
517
|
}
|
|
487
|
-
|
|
518
|
+
|
|
488
519
|
.zoom-controls {
|
|
489
520
|
order: 1;
|
|
490
521
|
}
|
|
491
|
-
|
|
522
|
+
|
|
492
523
|
.action-controls {
|
|
493
524
|
order: 2;
|
|
494
525
|
}
|
|
495
|
-
|
|
526
|
+
|
|
496
527
|
.zoom-hint {
|
|
497
528
|
top: 5px;
|
|
498
529
|
right: 5px;
|
|
499
530
|
padding: 4px 8px;
|
|
500
531
|
font-size: 11px;
|
|
501
532
|
}
|
|
502
|
-
|
|
533
|
+
|
|
503
534
|
.zoom-hint span {
|
|
504
535
|
display: none;
|
|
505
536
|
}
|
|
@@ -509,20 +540,21 @@ onUnmounted(() => {
|
|
|
509
540
|
.modal-controls {
|
|
510
541
|
gap: 8px;
|
|
511
542
|
}
|
|
512
|
-
|
|
513
|
-
.zoom-controls,
|
|
543
|
+
|
|
544
|
+
.zoom-controls,
|
|
545
|
+
.action-controls {
|
|
514
546
|
gap: 8px;
|
|
515
547
|
}
|
|
516
|
-
|
|
548
|
+
|
|
517
549
|
.control-btn {
|
|
518
550
|
padding: 10px;
|
|
519
551
|
min-width: 44px;
|
|
520
552
|
min-height: 44px;
|
|
521
553
|
}
|
|
522
|
-
|
|
554
|
+
|
|
523
555
|
.close-btn {
|
|
524
556
|
min-width: 44px;
|
|
525
557
|
min-height: 44px;
|
|
526
558
|
}
|
|
527
559
|
}
|
|
528
|
-
</style>
|
|
560
|
+
</style>
|