@trishchuk/coolors-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.
Files changed (197) hide show
  1. package/.claude/settings.local.json +39 -0
  2. package/.env +2 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +73 -0
  4. package/.github/ISSUE_TEMPLATE/feature_request.md +71 -0
  5. package/.github/pull_request_template.md +97 -0
  6. package/.github/workflows/ci.yml +127 -0
  7. package/.github/workflows/deploy-docs.yml +56 -0
  8. package/.github/workflows/release.yml +99 -0
  9. package/.mcp.json +12 -0
  10. package/.prettierignore +1 -0
  11. package/CLAUDE.md +201 -0
  12. package/DOCUMENTATION.md +274 -0
  13. package/GEMINI.md +54 -0
  14. package/LICENSE +21 -0
  15. package/README.md +401 -0
  16. package/demo/content_based_color.png +0 -0
  17. package/demo/music-player.html +621 -0
  18. package/demo/podcast-player.html +903 -0
  19. package/dist/bin/coolors-mcp.d.ts +1 -0
  20. package/dist/bin/coolors-mcp.js +154 -0
  21. package/dist/bin/coolors-mcp.js.map +1 -0
  22. package/dist/bin/server.d.ts +1 -0
  23. package/dist/bin/server.js +3292 -0
  24. package/dist/bin/server.js.map +1 -0
  25. package/dist/chunk-IQ7NN26V.js +114 -0
  26. package/dist/chunk-IQ7NN26V.js.map +1 -0
  27. package/dist/chunk-P3ARRKLS.js +1214 -0
  28. package/dist/chunk-P3ARRKLS.js.map +1 -0
  29. package/dist/color/index.d.ts +716 -0
  30. package/dist/color/index.js +153 -0
  31. package/dist/color/index.js.map +1 -0
  32. package/dist/coolors-mcp.d.ts +136 -0
  33. package/dist/coolors-mcp.js +7 -0
  34. package/dist/coolors-mcp.js.map +1 -0
  35. package/docs/.vitepress/cache/deps/@braintree_sanitize-url.js +93 -0
  36. package/docs/.vitepress/cache/deps/@braintree_sanitize-url.js.map +7 -0
  37. package/docs/.vitepress/cache/deps/_metadata.json +127 -0
  38. package/docs/.vitepress/cache/deps/chunk-BUSYA2B4.js +9 -0
  39. package/docs/.vitepress/cache/deps/chunk-BUSYA2B4.js.map +7 -0
  40. package/docs/.vitepress/cache/deps/chunk-JD3CXNQ6.js +12683 -0
  41. package/docs/.vitepress/cache/deps/chunk-JD3CXNQ6.js.map +7 -0
  42. package/docs/.vitepress/cache/deps/chunk-SYPOPCWC.js +9719 -0
  43. package/docs/.vitepress/cache/deps/chunk-SYPOPCWC.js.map +7 -0
  44. package/docs/.vitepress/cache/deps/cytoscape-cose-bilkent.js +4710 -0
  45. package/docs/.vitepress/cache/deps/cytoscape-cose-bilkent.js.map +7 -0
  46. package/docs/.vitepress/cache/deps/cytoscape.js +30278 -0
  47. package/docs/.vitepress/cache/deps/cytoscape.js.map +7 -0
  48. package/docs/.vitepress/cache/deps/dayjs.js +285 -0
  49. package/docs/.vitepress/cache/deps/dayjs.js.map +7 -0
  50. package/docs/.vitepress/cache/deps/debug.js +468 -0
  51. package/docs/.vitepress/cache/deps/debug.js.map +7 -0
  52. package/docs/.vitepress/cache/deps/package.json +3 -0
  53. package/docs/.vitepress/cache/deps/prismjs.js +1466 -0
  54. package/docs/.vitepress/cache/deps/prismjs.js.map +7 -0
  55. package/docs/.vitepress/cache/deps/prismjs_components_prism-bash.js +228 -0
  56. package/docs/.vitepress/cache/deps/prismjs_components_prism-bash.js.map +7 -0
  57. package/docs/.vitepress/cache/deps/prismjs_components_prism-javascript.js +142 -0
  58. package/docs/.vitepress/cache/deps/prismjs_components_prism-javascript.js.map +7 -0
  59. package/docs/.vitepress/cache/deps/prismjs_components_prism-json.js +27 -0
  60. package/docs/.vitepress/cache/deps/prismjs_components_prism-json.js.map +7 -0
  61. package/docs/.vitepress/cache/deps/prismjs_components_prism-python.js +65 -0
  62. package/docs/.vitepress/cache/deps/prismjs_components_prism-python.js.map +7 -0
  63. package/docs/.vitepress/cache/deps/prismjs_components_prism-typescript.js +53 -0
  64. package/docs/.vitepress/cache/deps/prismjs_components_prism-typescript.js.map +7 -0
  65. package/docs/.vitepress/cache/deps/prismjs_components_prism-yaml.js +73 -0
  66. package/docs/.vitepress/cache/deps/prismjs_components_prism-yaml.js.map +7 -0
  67. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +4507 -0
  68. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +7 -0
  69. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +584 -0
  70. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +7 -0
  71. package/docs/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js +1146 -0
  72. package/docs/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js.map +7 -0
  73. package/docs/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js +1667 -0
  74. package/docs/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js.map +7 -0
  75. package/docs/.vitepress/cache/deps/vitepress___minisearch.js +1814 -0
  76. package/docs/.vitepress/cache/deps/vitepress___minisearch.js.map +7 -0
  77. package/docs/.vitepress/cache/deps/vue.js +344 -0
  78. package/docs/.vitepress/cache/deps/vue.js.map +7 -0
  79. package/docs/.vitepress/components/ClientGrid.vue +125 -0
  80. package/docs/.vitepress/components/CodeBlock.vue +231 -0
  81. package/docs/.vitepress/components/ConfigModal.vue +477 -0
  82. package/docs/.vitepress/components/DiagramModal.vue +528 -0
  83. package/docs/.vitepress/components/TroubleshootingModal.vue +472 -0
  84. package/docs/.vitepress/config.js +162 -0
  85. package/docs/.vitepress/theme/FundingLayout.vue +251 -0
  86. package/docs/.vitepress/theme/Layout.vue +134 -0
  87. package/docs/.vitepress/theme/components/AdBanner.vue +317 -0
  88. package/docs/.vitepress/theme/components/AdPlaceholder.vue +78 -0
  89. package/docs/.vitepress/theme/components/FundingEffects.vue +322 -0
  90. package/docs/.vitepress/theme/components/FundingHero.vue +345 -0
  91. package/docs/.vitepress/theme/components/SupportSection.vue +511 -0
  92. package/docs/.vitepress/theme/custom-app.css +339 -0
  93. package/docs/.vitepress/theme/custom.css +699 -0
  94. package/docs/.vitepress/theme/index.js +25 -0
  95. package/docs/README.md +198 -0
  96. package/docs/concepts/accessibility.md +473 -0
  97. package/docs/concepts/color-spaces.md +222 -0
  98. package/docs/concepts/distance-metrics.md +384 -0
  99. package/docs/concepts/hct.md +261 -0
  100. package/docs/concepts/image-analysis.md +396 -0
  101. package/docs/concepts/material-design.md +306 -0
  102. package/docs/concepts/theme-matching.md +399 -0
  103. package/docs/examples/basic-colors.md +490 -0
  104. package/docs/examples/creating-themes.md +898 -0
  105. package/docs/examples/css-refactoring.md +824 -0
  106. package/docs/examples/image-extraction.md +882 -0
  107. package/docs/getting-started.md +366 -0
  108. package/docs/index.md +190 -0
  109. package/docs/installation.md +157 -0
  110. package/docs/tools/README.md +234 -0
  111. package/docs/tools/accessibility.md +614 -0
  112. package/docs/tools/color-operations.md +374 -0
  113. package/docs/tools/image-extraction.md +624 -0
  114. package/docs/tools/material-design.md +347 -0
  115. package/docs/tools/theme-matching.md +552 -0
  116. package/eslint.config.ts +14 -0
  117. package/examples/theme-matching.md +113 -0
  118. package/jsr.json +7 -0
  119. package/mcp-config.json +8 -0
  120. package/note.md +35 -0
  121. package/package.json +122 -0
  122. package/research_results.md +53 -0
  123. package/src/bin/coolors-mcp.ts +194 -0
  124. package/src/bin/server.ts +61 -0
  125. package/src/color/__tests__/conversions-argb.test.ts +198 -0
  126. package/src/color/__tests__/extract-colors.test.ts +360 -0
  127. package/src/color/__tests__/image-utils.test.ts +242 -0
  128. package/src/color/__tests__/reference-colors.test.ts +278 -0
  129. package/src/color/__tests__/round-trip.test.ts +197 -0
  130. package/src/color/conversions.test.ts +402 -0
  131. package/src/color/conversions.ts +393 -0
  132. package/src/color/dislike/__tests__/dislike-analyzer.test.ts +248 -0
  133. package/src/color/dislike/dislike-analyzer.ts +114 -0
  134. package/src/color/extract-colors.ts +228 -0
  135. package/src/color/hct/__tests__/hct-class.test.ts +232 -0
  136. package/src/color/hct/harmonization.ts +204 -0
  137. package/src/color/hct/hct-class.ts +109 -0
  138. package/src/color/hct/hct-solver.ts +168 -0
  139. package/src/color/hct/index.ts +39 -0
  140. package/src/color/hct/tonal-palette.ts +211 -0
  141. package/src/color/hct/types.ts +88 -0
  142. package/src/color/image-utils.ts +79 -0
  143. package/src/color/index.ts +87 -0
  144. package/src/color/material-theme.ts +157 -0
  145. package/src/color/metrics.test.ts +276 -0
  146. package/src/color/metrics.ts +281 -0
  147. package/src/color/quantize/__tests__/quantizer_celebi.test.ts +195 -0
  148. package/src/color/quantize/lab_point_provider.ts +55 -0
  149. package/src/color/quantize/point_provider.ts +27 -0
  150. package/src/color/quantize/quantizer_celebi.ts +51 -0
  151. package/src/color/quantize/quantizer_celebi_test.ts +71 -0
  152. package/src/color/quantize/quantizer_map.ts +47 -0
  153. package/src/color/quantize/quantizer_wsmeans.ts +232 -0
  154. package/src/color/quantize/quantizer_wu.ts +472 -0
  155. package/src/color/score/__tests__/score.test.ts +224 -0
  156. package/src/color/score/score.ts +175 -0
  157. package/src/color/types.ts +151 -0
  158. package/src/color/utils/color_utils.ts +292 -0
  159. package/src/color/utils/math_utils.ts +145 -0
  160. package/src/color/utils.test.ts +403 -0
  161. package/src/color/utils.ts +315 -0
  162. package/src/constants.ts +5 -0
  163. package/src/coolors-mcp.ts +37 -0
  164. package/src/examples/addition.ts +333 -0
  165. package/src/examples/color-demo.ts +125 -0
  166. package/src/examples/custom-logger.ts +201 -0
  167. package/src/examples/oauth-server.ts +113 -0
  168. package/src/examples/session-context.ts +269 -0
  169. package/src/session.ts +116 -0
  170. package/src/theme/__tests__/matcher.test.ts +180 -0
  171. package/src/theme/__tests__/parser.test.ts +148 -0
  172. package/src/theme/__tests__/refactor.test.ts +224 -0
  173. package/src/theme/index.ts +34 -0
  174. package/src/theme/matcher.ts +395 -0
  175. package/src/theme/parser.ts +392 -0
  176. package/src/theme/refactor.ts +360 -0
  177. package/src/theme/types.ts +152 -0
  178. package/src/tools/__tests__/gradient-generator.test.ts +206 -0
  179. package/src/tools/__tests__/palette-with-locks.test.ts +109 -0
  180. package/src/tools/color-conversion.tool.ts +54 -0
  181. package/src/tools/color-distance.tool.ts +41 -0
  182. package/src/tools/colors.ts +31 -0
  183. package/src/tools/contrast-checker.tool.ts +37 -0
  184. package/src/tools/dislike-analyzer.tool.ts +247 -0
  185. package/src/tools/gradient-generator.tool.ts +250 -0
  186. package/src/tools/image-extraction.tools.ts +289 -0
  187. package/src/tools/index.ts +39 -0
  188. package/src/tools/material-theme.tools.ts +250 -0
  189. package/src/tools/palette-generator.tool.ts +135 -0
  190. package/src/tools/palette-with-locks.tool.ts +221 -0
  191. package/src/tools/registry.ts +142 -0
  192. package/src/tools/simple-tools.ts +37 -0
  193. package/src/tools/theme-matching.tools.ts +334 -0
  194. package/src/types.ts +182 -0
  195. package/src/utils.ts +22 -0
  196. package/tsconfig.json +8 -0
  197. package/vitest.config.js +15 -0
@@ -0,0 +1,699 @@
1
+ /* Sleek modern docs inspired by OpenAI/Anthropic */
2
+
3
+ /* Base colors and fonts */
4
+ :root {
5
+ --vp-font-family-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
6
+ --vp-font-family-mono: 'SF Mono', Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
7
+ }
8
+
9
+ /* Dark theme refinements */
10
+ html.dark {
11
+ --vp-c-bg: #0a0a0a;
12
+ --vp-c-bg-soft: #141414;
13
+ --vp-c-bg-mute: #1a1a1a;
14
+ --vp-c-bg-alt: #0f0f0f;
15
+ --vp-c-divider: rgba(255, 255, 255, 0.08);
16
+ --vp-c-divider-light: rgba(255, 255, 255, 0.05);
17
+ }
18
+
19
+ /* Clean navigation bar - theme aware */
20
+ .VPNavBar {
21
+ background-color: var(--vp-c-bg-alt);
22
+ backdrop-filter: blur(12px);
23
+ border-bottom: 1px solid var(--vp-c-divider);
24
+ }
25
+
26
+ .VPNavBar.has-sidebar .content {
27
+ backdrop-filter: none;
28
+ }
29
+
30
+ /* Sleek sidebar styling */
31
+ .VPSidebar {
32
+ background-color: var(--vp-c-bg);
33
+ border-right: 1px solid var(--vp-c-divider);
34
+ padding: 32px 0;
35
+ }
36
+
37
+ /* Sidebar sections */
38
+ .VPSidebarItem.level-0 {
39
+ margin-bottom: 24px;
40
+ }
41
+
42
+ .VPSidebarItem.level-0 > .item > .text {
43
+ font-size: 11px;
44
+ font-weight: 700;
45
+ letter-spacing: 0.08em;
46
+ text-transform: uppercase;
47
+ color: var(--vp-c-text-3);
48
+ margin-bottom: 8px;
49
+ padding-left: 16px;
50
+ }
51
+
52
+ /* Sidebar items */
53
+ .VPSidebarItem.level-1 > .item {
54
+ margin: 1px 8px;
55
+ padding: 6px 16px;
56
+ border-radius: 6px;
57
+ transition: all 0.15s ease;
58
+ }
59
+
60
+ .VPSidebarItem.level-1 > .item:hover {
61
+ background-color: var(--vp-c-bg-soft);
62
+ }
63
+
64
+ .VPSidebarItem.level-1 > .item.is-active {
65
+ background-color: rgba(66, 184, 131, 0.1);
66
+ }
67
+
68
+ .VPSidebarItem.level-1 > .item.is-active > .link > .text {
69
+ color: #42b883;
70
+ font-weight: 500;
71
+ }
72
+
73
+ .vp-doc p {
74
+ margin: 16px 0;
75
+ line-height: 1.7;
76
+ }
77
+
78
+ /* Typography improvements */
79
+ .vp-doc h1 {
80
+ font-size: 2.5rem;
81
+ font-weight: 700;
82
+ letter-spacing: -0.02em;
83
+ line-height: 1.2;
84
+ margin: 0 0 32px;
85
+ }
86
+
87
+ .vp-doc h2 {
88
+ font-size: 1.875rem;
89
+ font-weight: 600;
90
+ letter-spacing: -0.01em;
91
+ line-height: 1.3;
92
+ margin: 48px 0 24px;
93
+ padding-top: 24px;
94
+ border-top: 1px solid var(--vp-c-divider);
95
+ }
96
+
97
+ .vp-doc h2:first-child {
98
+ border-top: none;
99
+ margin-top: 0;
100
+ padding-top: 0;
101
+ }
102
+
103
+ .vp-doc h3 {
104
+ font-size: 1.375rem;
105
+ font-weight: 600;
106
+ line-height: 1.4;
107
+ margin: 32px 0 16px;
108
+ }
109
+
110
+ .vp-doc p {
111
+ line-height: 1.75;
112
+ margin: 16px 0;
113
+ }
114
+
115
+ /* Code blocks - use VitePress defaults */
116
+
117
+ /* Inline code */
118
+ .vp-doc p code,
119
+ .vp-doc li code {
120
+ background-color: var(--vp-c-bg-soft);
121
+ padding: 2px 6px;
122
+ border-radius: 4px;
123
+ font-size: 0.9em;
124
+ border: 1px solid var(--vp-c-divider);
125
+ }
126
+
127
+ /* Remove gradient backgrounds */
128
+ .VPHome {
129
+ background: var(--vp-c-bg);
130
+ }
131
+
132
+ /* Sidebar improvements for wiki-like navigation */
133
+ .VPSidebar {
134
+ padding: 16px 0;
135
+ }
136
+
137
+ .VPSidebarItem.level-0 > .item > .text {
138
+ font-weight: 600;
139
+ font-size: 0.9rem;
140
+ text-transform: uppercase;
141
+ letter-spacing: 0.5px;
142
+ color: var(--vp-c-text-2);
143
+ }
144
+
145
+
146
+ /* Tables - wiki style */
147
+ .vp-doc table {
148
+ margin: 20px 0;
149
+ border-collapse: collapse;
150
+ width: 100%;
151
+ }
152
+
153
+ .vp-doc table th {
154
+ background-color: var(--vp-c-bg-soft);
155
+ font-weight: 600;
156
+ text-align: left;
157
+ padding: 12px;
158
+ border: 1px solid var(--vp-c-divider);
159
+ }
160
+
161
+ .vp-doc table td {
162
+ padding: 12px;
163
+ border: 1px solid var(--vp-c-divider);
164
+ }
165
+
166
+ /* Enhanced logo styling - clean elastic rotation */
167
+ .VPNavBarTitle .logo {
168
+ width: 28px;
169
+ height: 28px;
170
+ border-radius: 6px;
171
+ overflow: hidden;
172
+ transform: scale(1.4);
173
+ transition: all 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);
174
+ }
175
+
176
+ .VPNavBarTitle .logo:hover {
177
+ transform: scale(1.4) rotate(135deg);
178
+ }
179
+
180
+ /* Hide URL tooltip on logo link */
181
+ .VPNavBarTitle a[href]:hover::after {
182
+ content: none !important;
183
+ }
184
+
185
+ .VPNavBarTitle a {
186
+ text-decoration: none;
187
+ pointer-events: auto;
188
+ }
189
+
190
+ /* Dark mode: make white background transparent */
191
+ html.dark .VPNavBarTitle .logo {
192
+ mix-blend-mode: screen;
193
+ filter: contrast(1.2) saturate(1.1);
194
+ }
195
+
196
+ /* Simplify footer */
197
+ .VPFooter {
198
+ border-top: 1px solid var(--vp-c-divider);
199
+ padding: 32px 24px;
200
+ }
201
+
202
+ /* Smooth animations */
203
+ * {
204
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
205
+ }
206
+
207
+ /* Content width optimization */
208
+ .VPDoc .content {
209
+ max-width: 1140px;
210
+ margin: 0 auto;
211
+ }
212
+
213
+ .VPDoc.has-aside .content {
214
+ max-width: 1140px;
215
+ margin: 0 auto;
216
+ }
217
+
218
+ /* Info boxes - more subtle */
219
+ .custom-block {
220
+ border-radius: 4px;
221
+ margin: 16px 0;
222
+ }
223
+
224
+ .custom-block.tip {
225
+ background-color: var(--vp-c-bg-soft);
226
+ border-left: 4px solid var(--vp-c-brand);
227
+ }
228
+
229
+
230
+ /* Modern hero section */
231
+ .VPHero {
232
+ padding: 80px 24px;
233
+ text-align: center;
234
+ overflow: visible;
235
+ }
236
+
237
+ .VPHero .container {
238
+ max-width: 1140px;
239
+ margin: 0 auto;
240
+ overflow: visible;
241
+ }
242
+
243
+ .VPHero .actions {
244
+ justify-content: center;
245
+ gap: 16px;
246
+ margin-top: 32px;
247
+ }
248
+
249
+ /* Hero buttons - slightly larger */
250
+ .VPHero .VPButton {
251
+ padding: 14px 36px !important;
252
+ font-size: 17px !important;
253
+ }
254
+
255
+ /* Get Started button - inviting green */
256
+ .VPButton.brand {
257
+ background: linear-gradient(135deg, #42b883 0%, #35a373 100%) !important;
258
+ border-color: #42b883 !important;
259
+ transition: all 0.3s ease !important;
260
+ }
261
+
262
+ .VPButton.brand:hover {
263
+ background: linear-gradient(135deg, #4dd89a 0%, #42b883 100%) !important;
264
+ border-color: #4dd89a !important;
265
+ box-shadow: 0 4px 16px rgba(66, 184, 131, 0.25) !important;
266
+ }
267
+
268
+ /* Leave a Star button enhancements only */
269
+ .VPButton.alt {
270
+ position: relative;
271
+ overflow: visible !important;
272
+ }
273
+
274
+ /* Create a wrapper for overflow */
275
+ .VPHero .actions {
276
+ overflow: visible;
277
+ position: relative;
278
+ z-index: 1;
279
+ }
280
+
281
+ /* Floating star on hover */
282
+ .VPButton.alt::before {
283
+ content: '⭐';
284
+ position: absolute;
285
+ font-size: 18px;
286
+ top: 50%;
287
+ right: 10px;
288
+ transform: translateY(-50%);
289
+ opacity: 0;
290
+ pointer-events: none;
291
+ z-index: 10;
292
+ animation-fill-mode: forwards;
293
+ }
294
+
295
+ /* Multiple burst particles */
296
+ .VPButton.alt::after {
297
+ content: '✨ ⭐ ✨ ⭐ ✨';
298
+ position: absolute;
299
+ font-size: 12px;
300
+ top: 50%;
301
+ left: 50%;
302
+ transform: translate(-50%, -50%);
303
+ opacity: 0;
304
+ pointer-events: none;
305
+ z-index: 10;
306
+ white-space: nowrap;
307
+ }
308
+
309
+ .VPButton.alt:hover {
310
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1) !important;
311
+ }
312
+
313
+ /* Hover animations */
314
+ .VPButton.alt:hover::before {
315
+ animation: starFirework 1.2s cubic-bezier(0.25, 0.46, 0.45, 0.94);
316
+ }
317
+
318
+ .VPButton.alt:hover::after {
319
+ animation: starBurst 0.4s ease-out 0.8s;
320
+ }
321
+
322
+ /* Firework trajectory with random-looking curve */
323
+ @keyframes starFirework {
324
+ 0% {
325
+ opacity: 0;
326
+ transform: translateY(-50%) translateX(0) scale(0.5);
327
+ }
328
+ 30% {
329
+ opacity: 1;
330
+ transform: translateY(-40px) translateX(20px) scale(1) rotate(120deg);
331
+ }
332
+ 50% {
333
+ opacity: 1;
334
+ transform: translateY(-70px) translateX(-10px) scale(1.1) rotate(240deg);
335
+ }
336
+ 80% {
337
+ opacity: 1;
338
+ transform: translateY(-100px) translateX(15px) scale(1.2) rotate(360deg);
339
+ }
340
+ 81% {
341
+ opacity: 0;
342
+ transform: translateY(-100px) translateX(15px) scale(1.5);
343
+ }
344
+ 100% {
345
+ opacity: 0;
346
+ transform: translateY(-100px) translateX(15px) scale(2);
347
+ }
348
+ }
349
+
350
+ /* Burst effect */
351
+ @keyframes starBurst {
352
+ 0% {
353
+ opacity: 0;
354
+ transform: translate(-50%, -50%) translateY(-100px) scale(0);
355
+ }
356
+ 50% {
357
+ opacity: 1;
358
+ transform: translate(-50%, -50%) translateY(-100px) scale(1.5) rotate(180deg);
359
+ }
360
+ 100% {
361
+ opacity: 0;
362
+ transform: translate(-50%, -50%) translateY(-100px) scale(2.5) rotate(360deg);
363
+ }
364
+ }
365
+
366
+ .VPHome .name {
367
+ font-size: 3.5rem;
368
+ font-weight: 800;
369
+ letter-spacing: -0.03em;
370
+ background: linear-gradient(135deg, #42b883 0%, #35495e 100%);
371
+ -webkit-background-clip: text;
372
+ -webkit-text-fill-color: transparent;
373
+ background-clip: text;
374
+ }
375
+
376
+ .VPHome .text {
377
+ font-size: 1.5rem;
378
+ font-weight: 600;
379
+ color: var(--vp-c-text-1);
380
+ margin: 16px 0;
381
+ }
382
+
383
+ .VPHome .tagline {
384
+ font-size: 1.125rem;
385
+ color: var(--vp-c-text-2);
386
+ line-height: 1.6;
387
+ max-width: 600px;
388
+ margin: 0 auto;
389
+ }
390
+
391
+ /* Feature cards enhancement */
392
+ .VPFeature {
393
+ border: 1px solid var(--vp-c-divider);
394
+ background-color: var(--vp-c-bg-soft);
395
+ border-radius: 12px;
396
+ padding: 24px;
397
+ transition: all 0.25s ease;
398
+ position: relative;
399
+ overflow: hidden;
400
+ }
401
+
402
+ /* Light mode - subtle depth */
403
+ .VPFeature {
404
+ background: var(--vp-c-bg);
405
+ border: 1px solid var(--vp-c-divider);
406
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
407
+ }
408
+
409
+ /* Dark mode - glowing effect */
410
+ html.dark .VPFeature {
411
+ background: rgba(255, 255, 255, 0.03);
412
+ border: 1px solid rgba(255, 255, 255, 0.1);
413
+ box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.05);
414
+ }
415
+
416
+ /* Hover state */
417
+ .VPFeature:hover {
418
+ transform: translateY(-4px);
419
+ }
420
+
421
+ /* Light mode hover */
422
+ .VPFeature:hover {
423
+ border-color: var(--vp-c-brand-light);
424
+ box-shadow:
425
+ 0 12px 32px rgba(0, 0, 0, 0.1),
426
+ 0 2px 4px rgba(0, 0, 0, 0.05);
427
+ }
428
+
429
+ /* Dark mode hover */
430
+ html.dark .VPFeature:hover {
431
+ background: rgba(255, 255, 255, 0.05);
432
+ border-color: rgba(66, 184, 131, 0.5);
433
+ box-shadow:
434
+ 0 12px 32px rgba(0, 0, 0, 0.4),
435
+ 0 0 0 1px rgba(66, 184, 131, 0.3),
436
+ inset 0 1px 0 0 rgba(255, 255, 255, 0.1);
437
+ }
438
+
439
+ /* Gradient overlay for depth */
440
+ .VPFeature::before {
441
+ content: '';
442
+ position: absolute;
443
+ top: 0;
444
+ left: 0;
445
+ right: 0;
446
+ bottom: 0;
447
+ background: radial-gradient(
448
+ circle at 50% 0%,
449
+ rgba(66, 184, 131, 0.08),
450
+ transparent 60%
451
+ );
452
+ opacity: 0;
453
+ transition: opacity 0.3s ease;
454
+ pointer-events: none;
455
+ }
456
+
457
+ .VPFeature:hover::before {
458
+ opacity: 1;
459
+ }
460
+
461
+ /* Icon enhancement */
462
+ .VPFeature .icon {
463
+ font-size: 48px;
464
+ margin-bottom: 20px;
465
+ display: block;
466
+ transition: transform 0.3s ease;
467
+ }
468
+
469
+ .VPFeature:hover .icon {
470
+ transform: scale(1.1) translateY(-2px);
471
+ }
472
+
473
+ /* Title enhancement */
474
+ .VPFeature .title {
475
+ font-size: 20px;
476
+ font-weight: 600;
477
+ margin-bottom: 8px;
478
+ color: var(--vp-c-text-1);
479
+ }
480
+
481
+ /* Details enhancement */
482
+ .VPFeature .details {
483
+ font-size: 14px;
484
+ line-height: 1.6;
485
+ color: var(--vp-c-text-2);
486
+ }
487
+
488
+ /* Special styling for MCP Standards card - keep the colors */
489
+ .VPFeature:nth-child(4) .details {
490
+ line-height: 1.8;
491
+ }
492
+
493
+ /* Interactive "more to explore" hint - properly targets adjacent sibling */
494
+ .VPHome .explore-hint {
495
+ pointer-events: none;
496
+ transition: all 0.3s ease;
497
+ }
498
+
499
+ /* When hovering any feature card, the hint reacts */
500
+ .VPHome:has(.VPFeature:hover) .explore-hint .dot {
501
+ opacity: 1 !important;
502
+ color: var(--vp-c-brand) !important;
503
+ transform: scale(1.5);
504
+ }
505
+
506
+ .VPHome:has(.VPFeature:hover) .explore-hint .explore-text {
507
+ opacity: 0.9 !important;
508
+ color: var(--vp-c-text-1) !important;
509
+ transform: translateY(-3px);
510
+ }
511
+
512
+ /* Pulse effect when actively exploring */
513
+ @keyframes explorePulse {
514
+ 0%, 100% {
515
+ transform: translateY(-3px) scale(1);
516
+ }
517
+ 50% {
518
+ transform: translateY(-6px) scale(1.05);
519
+ }
520
+ }
521
+
522
+ .VPHome:has(.VPFeature:hover) .explore-hint .explore-text {
523
+ animation: explorePulse 2s ease-in-out infinite;
524
+ }
525
+
526
+ /* Animated dots while exploring */
527
+ @keyframes dotDance {
528
+ 0%, 100% { transform: translateY(0) scale(1); }
529
+ 50% { transform: translateY(-4px) scale(1.5); }
530
+ }
531
+
532
+ .VPHome:has(.VPFeature:hover) .explore-hint .dot:nth-child(1) {
533
+ animation: dotDance 0.6s ease-in-out infinite;
534
+ }
535
+
536
+ .VPHome:has(.VPFeature:hover) .explore-hint .dot:nth-child(2) {
537
+ animation: dotDance 0.6s ease-in-out infinite 0.1s;
538
+ }
539
+
540
+ .VPHome:has(.VPFeature:hover) .explore-hint .dot:nth-child(3) {
541
+ animation: dotDance 0.6s ease-in-out infinite 0.2s;
542
+ }
543
+
544
+ /* File Analysis card - diff transformation effect */
545
+ .VPFeature:first-child .details {
546
+ line-height: 1.8;
547
+ position: relative;
548
+ }
549
+
550
+ /* Diff line styles */
551
+ .diff-line {
552
+ display: inline-block;
553
+ position: relative;
554
+ padding: 0 4px 0 20px; /* Minimal padding for tight highlight */
555
+ margin: 0 -4px 0 -20px; /* Negative margin to compensate */
556
+ border-radius: 2px;
557
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
558
+ background: transparent;
559
+ }
560
+
561
+ /* Add diff symbols as pseudo-elements (hidden by default) */
562
+ .diff-line::before {
563
+ content: '';
564
+ position: absolute;
565
+ left: 4px;
566
+ font-family: var(--vp-font-family-mono);
567
+ font-weight: 600;
568
+ opacity: 0;
569
+ transition: opacity 0.4s cubic-bezier(0.4, 0, 0.2, 1);
570
+ }
571
+
572
+ /* Line numbers - typed out on hover */
573
+ .diff-line::after {
574
+ content: '';
575
+ position: absolute;
576
+ right: 100%;
577
+ margin-right: 12px;
578
+ font-family: var(--vp-font-family-mono);
579
+ font-size: 11px;
580
+ color: var(--vp-c-text-3);
581
+ opacity: 0;
582
+ transition: opacity 0.3s ease;
583
+ white-space: nowrap;
584
+ overflow: hidden;
585
+ max-width: 0;
586
+ }
587
+
588
+ .diff-delete::after {
589
+ content: '6739';
590
+ }
591
+
592
+ .diff-add::after {
593
+ content: '6740';
594
+ }
595
+
596
+ .diff-delete::before {
597
+ content: '-';
598
+ }
599
+
600
+ .diff-add::before {
601
+ content: '+';
602
+ }
603
+
604
+ /* Hover state - transform to diff view */
605
+ .VPFeature:first-child:hover .diff-line {
606
+ margin: 1px -4px 1px -20px; /* Keep compensating margins on hover */
607
+ }
608
+
609
+ .VPFeature:first-child:hover .diff-line::before {
610
+ opacity: 1;
611
+ }
612
+
613
+ /* Animate line numbers with typing effect */
614
+ .VPFeature:first-child:hover .diff-line::after {
615
+ opacity: 0.6;
616
+ max-width: 50px;
617
+ transition: opacity 0.3s ease 0.3s, max-width 0.4s ease 0.3s;
618
+ }
619
+
620
+ /* Ensure space for line numbers only on File Analysis card */
621
+ .VPFeature:has(.diff-line) .details {
622
+ padding-left: 0;
623
+ transition: padding-left 0.4s cubic-bezier(0.4, 0, 0.2, 1);
624
+ }
625
+
626
+ .VPFeature:has(.diff-line):hover .details {
627
+ padding-left: 45px;
628
+ }
629
+
630
+ /* Delete line styles */
631
+ .VPFeature:first-child:hover .diff-delete {
632
+ background: rgba(254, 215, 215, 0.3);
633
+ color: #991b1b;
634
+ }
635
+
636
+ html.dark .VPFeature:first-child:hover .diff-delete {
637
+ background: rgba(220, 38, 38, 0.2);
638
+ color: #fca5a5;
639
+ }
640
+
641
+ /* Add line styles */
642
+ .VPFeature:first-child:hover .diff-add {
643
+ background: rgba(209, 250, 229, 0.3);
644
+ color: #166534;
645
+ }
646
+
647
+ html.dark .VPFeature:first-child:hover .diff-add {
648
+ background: rgba(5, 150, 105, 0.2);
649
+ color: #86efac;
650
+ }
651
+
652
+ /* Symbol colors */
653
+ .VPFeature:first-child:hover .diff-delete::before {
654
+ color: #dc2626;
655
+ }
656
+
657
+ html.dark .VPFeature:first-child:hover .diff-delete::before {
658
+ color: #f87171;
659
+ }
660
+
661
+ .VPFeature:first-child:hover .diff-add::before {
662
+ color: #059669;
663
+ }
664
+
665
+ html.dark .VPFeature:first-child:hover .diff-add::before {
666
+ color: #34d399;
667
+ }
668
+
669
+ /* Custom scrollbar */
670
+ ::-webkit-scrollbar {
671
+ width: 8px;
672
+ height: 8px;
673
+ }
674
+
675
+ ::-webkit-scrollbar-track {
676
+ background: var(--vp-c-bg);
677
+ }
678
+
679
+ ::-webkit-scrollbar-thumb {
680
+ background: var(--vp-c-divider);
681
+ border-radius: 4px;
682
+ }
683
+
684
+ ::-webkit-scrollbar-thumb:hover {
685
+ background: var(--vp-c-text-3);
686
+ }
687
+
688
+ /* Hide sidebar scrollbar */
689
+ .VPSidebar {
690
+ scrollbar-width: none; /* Firefox */
691
+ -ms-overflow-style: none; /* IE/Edge */
692
+ }
693
+
694
+ .VPSidebar::-webkit-scrollbar {
695
+ display: none; /* Chrome/Safari/Webkit */
696
+ }
697
+
698
+
699
+
@@ -0,0 +1,25 @@
1
+ import DefaultTheme from 'vitepress/theme'
2
+ import Layout from './Layout.vue'
3
+ import FundingLayout from './FundingLayout.vue'
4
+ import DiagramModal from '../components/DiagramModal.vue'
5
+ import CodeBlock from '../components/CodeBlock.vue'
6
+ import ClientGrid from '../components/ClientGrid.vue'
7
+ import './custom.css'
8
+ import './custom-app.css'
9
+
10
+ export default {
11
+ extends: DefaultTheme,
12
+ Layout: Layout,
13
+ enhanceApp({ app, router }) {
14
+ app.component('DiagramModal', DiagramModal)
15
+ app.component('CodeBlock', CodeBlock)
16
+ app.component('ClientGrid', ClientGrid)
17
+ app.component('FundingLayout', FundingLayout)
18
+ },
19
+ setup() {
20
+ // Force dark mode on initial load
21
+ if (typeof window !== 'undefined' && !localStorage.getItem('vitepress-theme-appearance')) {
22
+ localStorage.setItem('vitepress-theme-appearance', 'dark')
23
+ }
24
+ }
25
+ }