@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.
Files changed (66) hide show
  1. package/.claude/settings.local.json +2 -6
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +20 -8
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +22 -8
  4. package/.github/pull_request_template.md +33 -8
  5. package/.github/workflows/ci.yml +97 -97
  6. package/.github/workflows/deploy-docs.yml +9 -9
  7. package/.github/workflows/release.yml +15 -15
  8. package/README.md +26 -1
  9. package/TOOLS_UK.md +233 -0
  10. package/docs/.vitepress/cache/deps/@braintree_sanitize-url.js +30 -12
  11. package/docs/.vitepress/cache/deps/_metadata.json +1 -1
  12. package/docs/.vitepress/cache/deps/chunk-BUSYA2B4.js +9 -6
  13. package/docs/.vitepress/cache/deps/chunk-JD3CXNQ6.js +2543 -1612
  14. package/docs/.vitepress/cache/deps/chunk-SYPOPCWC.js +3508 -2529
  15. package/docs/.vitepress/cache/deps/cytoscape-cose-bilkent.js +1902 -1003
  16. package/docs/.vitepress/cache/deps/cytoscape.js +13303 -7347
  17. package/docs/.vitepress/cache/deps/dayjs.js +494 -272
  18. package/docs/.vitepress/cache/deps/debug.js +82 -38
  19. package/docs/.vitepress/cache/deps/prismjs.js +444 -272
  20. package/docs/.vitepress/cache/deps/prismjs_components_prism-bash.js +80 -73
  21. package/docs/.vitepress/cache/deps/prismjs_components_prism-javascript.js +93 -62
  22. package/docs/.vitepress/cache/deps/prismjs_components_prism-json.js +13 -13
  23. package/docs/.vitepress/cache/deps/prismjs_components_prism-python.js +34 -27
  24. package/docs/.vitepress/cache/deps/prismjs_components_prism-typescript.js +20 -17
  25. package/docs/.vitepress/cache/deps/prismjs_components_prism-yaml.js +75 -41
  26. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +2005 -1438
  27. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +2 -2
  28. package/docs/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js +566 -229
  29. package/docs/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js +382 -270
  30. package/docs/.vitepress/cache/deps/vitepress___minisearch.js +334 -125
  31. package/docs/.vitepress/cache/deps/vue.js +2 -2
  32. package/docs/.vitepress/components/ClientGrid.vue +9 -3
  33. package/docs/.vitepress/components/CodeBlock.vue +51 -44
  34. package/docs/.vitepress/components/ConfigModal.vue +151 -67
  35. package/docs/.vitepress/components/DiagramModal.vue +186 -154
  36. package/docs/.vitepress/components/TroubleshootingModal.vue +101 -96
  37. package/docs/.vitepress/config.js +171 -141
  38. package/docs/.vitepress/theme/FundingLayout.vue +65 -54
  39. package/docs/.vitepress/theme/Layout.vue +21 -21
  40. package/docs/.vitepress/theme/components/AdBanner.vue +73 -52
  41. package/docs/.vitepress/theme/components/AdPlaceholder.vue +3 -3
  42. package/docs/.vitepress/theme/components/FundingEffects.vue +77 -53
  43. package/docs/.vitepress/theme/components/FundingHero.vue +78 -63
  44. package/docs/.vitepress/theme/components/SupportSection.vue +106 -89
  45. package/docs/.vitepress/theme/custom-app.css +19 -12
  46. package/docs/.vitepress/theme/custom.css +33 -25
  47. package/docs/.vitepress/theme/index.js +19 -16
  48. package/docs/concepts/accessibility.md +59 -47
  49. package/docs/concepts/color-spaces.md +28 -6
  50. package/docs/concepts/distance-metrics.md +45 -30
  51. package/docs/concepts/hct.md +30 -27
  52. package/docs/concepts/image-analysis.md +52 -21
  53. package/docs/concepts/material-design.md +43 -17
  54. package/docs/concepts/theme-matching.md +64 -40
  55. package/docs/examples/basic-colors.md +92 -108
  56. package/docs/examples/creating-themes.md +104 -108
  57. package/docs/examples/css-refactoring.md +33 -29
  58. package/docs/examples/image-extraction.md +145 -138
  59. package/docs/getting-started.md +45 -34
  60. package/docs/index.md +5 -1
  61. package/docs/installation.md +15 -1
  62. package/docs/tools/accessibility.md +74 -68
  63. package/docs/tools/image-extraction.md +62 -54
  64. package/docs/tools/theme-matching.md +45 -42
  65. package/note.md +1 -2
  66. 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 width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
14
- <circle cx="11" cy="11" r="8"/>
15
- <path d="21 21l-4.35-4.35"/>
16
- <path d="15 11h-8"/>
17
- <path d="11 15v-8"/>
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 @click="zoomOut" class="control-btn" title="Zoom out" :disabled="scale <= 0.1">
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 @click="zoomIn" class="control-btn" title="Zoom in" :disabled="scale >= maxZoom">
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 @click="fitToScreen" class="control-btn" title="Fit to screen">
43
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
44
- <path 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"/>
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">&times;</button>
69
+ <button @click="closeModal" class="close-btn" title="Close">
70
+ &times;
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 'vue'
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: 'pointer',
96
- border: '1px solid #ddd',
97
- borderRadius: '8px',
98
- padding: '10px',
99
- margin: '10px 0',
100
- transition: 'all 0.2s ease',
101
- ':hover': {
102
- borderColor: '#999'
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: 'center',
109
- transition: isPanning.value ? 'none' : 'transform 0.2s ease'
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 = 'hidden'
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
- 'svg',
165
- '.mermaid',
166
- '.mermaid svg',
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 (!diagramElement || !diagramRect || diagramRect.width === 0 || diagramRect.height === 0) {
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('.diagram-content')
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('Error calculating fit scale:', error)
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 === 'Escape' && isOpen.value) {
249
- closeModal()
275
+ if (e.key === "Escape" && isOpen.value) {
276
+ closeModal();
250
277
  }
251
- }
278
+ };
252
279
 
253
280
  onMounted(() => {
254
- document.addEventListener('keydown', handleKeydown)
255
- })
281
+ document.addEventListener("keydown", handleKeydown);
282
+ });
256
283
 
257
284
  onUnmounted(() => {
258
- document.removeEventListener('keydown', handleKeydown)
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(circle, var(--vp-c-border) 1px, transparent 1px);
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, .action-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>