@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,78 @@
1
+ <template>
2
+ <div class="ad-placeholder">
3
+ <div class="placeholder-content">
4
+ <span class="placeholder-icon">📢</span>
5
+ <div class="placeholder-text">
6
+ <p class="placeholder-title">Support Open Source</p>
7
+ <p class="placeholder-description">
8
+ Ad space pending approval from EthicalAds
9
+ </p>
10
+ </div>
11
+ </div>
12
+ <a
13
+ href="https://github.com/sponsors/jamubc"
14
+ class="placeholder-cta"
15
+ target="_blank"
16
+ rel="noopener"
17
+ >
18
+ Sponsor for ad-free docs →
19
+ </a>
20
+ </div>
21
+ </template>
22
+
23
+ <style scoped>
24
+ .ad-placeholder {
25
+ background: var(--vp-c-bg-soft);
26
+ border: 1px dashed var(--vp-c-divider);
27
+ border-radius: 8px;
28
+ padding: 16px;
29
+ margin: 16px 0;
30
+ text-align: center;
31
+ }
32
+
33
+ .placeholder-content {
34
+ display: flex;
35
+ align-items: center;
36
+ justify-content: center;
37
+ gap: 12px;
38
+ margin-bottom: 12px;
39
+ }
40
+
41
+ .placeholder-icon {
42
+ font-size: 24px;
43
+ opacity: 0.5;
44
+ }
45
+
46
+ .placeholder-text {
47
+ text-align: left;
48
+ }
49
+
50
+ .placeholder-title {
51
+ font-weight: 600;
52
+ font-size: 14px;
53
+ margin: 0 0 4px;
54
+ color: var(--vp-c-text-1);
55
+ }
56
+
57
+ .placeholder-description {
58
+ font-size: 12px;
59
+ margin: 0;
60
+ color: var(--vp-c-text-3);
61
+ }
62
+
63
+ .placeholder-cta {
64
+ font-size: 12px;
65
+ color: var(--vp-c-brand);
66
+ text-decoration: none;
67
+ font-weight: 500;
68
+ }
69
+
70
+ .placeholder-cta:hover {
71
+ color: var(--vp-c-brand-dark);
72
+ }
73
+
74
+ /* Sidebar specific styling */
75
+ .VPSidebar .ad-placeholder {
76
+ max-width: 250px;
77
+ }
78
+ </style>
@@ -0,0 +1,322 @@
1
+ <template>
2
+ <div class="funding-effects">
3
+ <!-- Add subtle animations to funding cards -->
4
+ </div>
5
+ </template>
6
+
7
+ <script setup>
8
+ import { onMounted } from 'vue'
9
+
10
+ onMounted(() => {
11
+ // Add intersection observer for scroll animations
12
+ const observer = new IntersectionObserver((entries) => {
13
+ entries.forEach(entry => {
14
+ if (entry.isIntersecting) {
15
+ entry.target.classList.add('visible')
16
+ }
17
+ })
18
+ }, { threshold: 0.1 })
19
+
20
+ // Observe all cards
21
+ const cards = document.querySelectorAll('.funding-card, .contribute-card')
22
+ cards.forEach(card => observer.observe(card))
23
+
24
+ // Add hover effects to cards
25
+ cards.forEach(card => {
26
+ card.addEventListener('mouseenter', (e) => {
27
+ const rect = card.getBoundingClientRect()
28
+ const x = e.clientX - rect.left
29
+ const y = e.clientY - rect.top
30
+
31
+ card.style.setProperty('--card-mouse-x', `${x}px`)
32
+ card.style.setProperty('--card-mouse-y', `${y}px`)
33
+ })
34
+
35
+ card.addEventListener('mousemove', (e) => {
36
+ const rect = card.getBoundingClientRect()
37
+ const x = e.clientX - rect.left
38
+ const y = e.clientY - rect.top
39
+
40
+ card.style.setProperty('--card-mouse-x', `${x}px`)
41
+ card.style.setProperty('--card-mouse-y', `${y}px`)
42
+ })
43
+ })
44
+ })
45
+ </script>
46
+
47
+ <style>
48
+ /* Global styles for funding page elements */
49
+ .funding-card {
50
+ --card-mouse-x: 50%;
51
+ --card-mouse-y: 50%;
52
+ position: relative;
53
+ background: var(--vp-c-bg-soft);
54
+ border: 1px solid var(--vp-c-divider);
55
+ border-radius: 12px;
56
+ padding: 24px;
57
+ margin: 16px 0;
58
+ overflow: hidden;
59
+ opacity: 0;
60
+ transform: translateY(20px);
61
+ transition: all 0.6s ease-out;
62
+ }
63
+
64
+ .funding-card.visible {
65
+ opacity: 1;
66
+ transform: translateY(0);
67
+ }
68
+
69
+ .funding-card::before {
70
+ content: '';
71
+ position: absolute;
72
+ top: 0;
73
+ left: 0;
74
+ right: 0;
75
+ bottom: 0;
76
+ background: radial-gradient(
77
+ 400px circle at var(--card-mouse-x) var(--card-mouse-y),
78
+ rgba(255, 140, 0, 0.06),
79
+ transparent 50%
80
+ );
81
+ opacity: 0;
82
+ transition: opacity 0.3s ease;
83
+ pointer-events: none;
84
+ }
85
+
86
+ .funding-card:hover::before {
87
+ opacity: 1;
88
+ }
89
+
90
+ .funding-card:hover {
91
+ border-color: rgba(255, 140, 0, 0.3);
92
+ transform: translateY(-2px);
93
+ box-shadow: 0 8px 24px rgba(255, 140, 0, 0.1);
94
+ }
95
+
96
+ /* Import support button styles from SupportSection */
97
+ .support-options {
98
+ display: flex;
99
+ gap: 12px;
100
+ justify-content: center;
101
+ flex-wrap: wrap;
102
+ }
103
+
104
+ .support-button {
105
+ display: inline-flex;
106
+ align-items: center;
107
+ gap: 12px;
108
+ padding: 10px 18px;
109
+ border-radius: 8px;
110
+ font-weight: 500;
111
+ text-decoration: none;
112
+ transition: all 0.2s ease;
113
+ font-size: 0.9rem;
114
+ white-space: nowrap;
115
+ }
116
+
117
+ .support-button--primary {
118
+ background: var(--vp-c-brand);
119
+ color: var(--vp-c-white);
120
+ border: 1px solid var(--vp-c-brand);
121
+ }
122
+
123
+ .support-button--primary:hover {
124
+ background: var(--vp-c-brand-dark);
125
+ transform: translateY(-2px);
126
+ box-shadow:
127
+ 0 4px 12px rgba(66, 184, 131, 0.3),
128
+ 0 0 20px rgba(218, 119, 86, 0.4),
129
+ 0 0 30px rgba(71, 150, 227, 0.3),
130
+ 0 0 40px rgba(255, 140, 0, 0.2);
131
+ animation: glow 2s ease-in-out infinite;
132
+ }
133
+
134
+ @keyframes glow {
135
+ 0%, 100% {
136
+ box-shadow:
137
+ 0 4px 12px rgba(66, 184, 131, 0.3),
138
+ 0 0 20px rgba(218, 119, 86, 0.4),
139
+ 0 0 30px rgba(71, 150, 227, 0.3),
140
+ 0 0 40px rgba(255, 140, 0, 0.2);
141
+ }
142
+ 50% {
143
+ box-shadow:
144
+ 0 4px 16px rgba(66, 184, 131, 0.4),
145
+ 0 0 25px rgba(218, 119, 86, 0.5),
146
+ 0 0 35px rgba(71, 150, 227, 0.4),
147
+ 0 0 50px rgba(255, 140, 0, 0.3);
148
+ }
149
+ }
150
+
151
+ .support-button--secondary {
152
+ background: transparent;
153
+ color: var(--vp-c-text-1);
154
+ border: 1px solid var(--vp-c-divider);
155
+ }
156
+
157
+ .support-button--secondary:hover {
158
+ background: var(--vp-c-bg-mute);
159
+ border-color: var(--vp-c-brand);
160
+ transform: translateY(-2px);
161
+ }
162
+
163
+ .support-icon {
164
+ width: 18px;
165
+ height: 18px;
166
+ font-size: 18px;
167
+ }
168
+
169
+ /* Contribute cards */
170
+ .contribute-card {
171
+ --card-mouse-x: 50%;
172
+ --card-mouse-y: 50%;
173
+ background: var(--vp-c-bg-soft);
174
+ padding: 24px;
175
+ border-radius: 12px;
176
+ text-align: center;
177
+ position: relative;
178
+ overflow: hidden;
179
+ border: 1px solid var(--vp-c-divider);
180
+ transition: all 0.3s ease;
181
+ opacity: 0;
182
+ transform: translateY(20px);
183
+ }
184
+
185
+ .contribute-card.visible {
186
+ opacity: 1;
187
+ transform: translateY(0);
188
+ }
189
+
190
+ .contribute-card::before {
191
+ content: '';
192
+ position: absolute;
193
+ top: 0;
194
+ left: 0;
195
+ right: 0;
196
+ bottom: 0;
197
+ background: radial-gradient(
198
+ 300px circle at var(--card-mouse-x) var(--card-mouse-y),
199
+ rgba(255, 140, 0, 0.08),
200
+ transparent 50%
201
+ );
202
+ opacity: 0;
203
+ transition: opacity 0.3s ease;
204
+ pointer-events: none;
205
+ }
206
+
207
+ .contribute-card:hover::before {
208
+ opacity: 1;
209
+ }
210
+
211
+ .contribute-card:hover {
212
+ transform: translateY(-4px);
213
+ border-color: rgba(255, 140, 0, 0.3);
214
+ box-shadow: 0 12px 32px rgba(255, 140, 0, 0.1);
215
+ }
216
+
217
+ .contribute-card .icon {
218
+ font-size: 48px;
219
+ margin-bottom: 16px;
220
+ display: block;
221
+ transition: transform 0.3s ease;
222
+ }
223
+
224
+ .contribute-card:hover .icon {
225
+ transform: scale(1.1) rotate(5deg);
226
+ }
227
+
228
+ /* Progress indicators */
229
+ .progress-section {
230
+ margin: 48px 0;
231
+ }
232
+
233
+ .progress-bar {
234
+ height: 8px;
235
+ background: var(--vp-c-bg-soft);
236
+ border-radius: 4px;
237
+ overflow: hidden;
238
+ margin: 16px 0;
239
+ }
240
+
241
+ .progress-fill {
242
+ height: 100%;
243
+ background: linear-gradient(90deg, #ff6b35 0%, #ff8c00 100%);
244
+ border-radius: 4px;
245
+ animation: progress 2s ease-out;
246
+ position: relative;
247
+ overflow: hidden;
248
+ }
249
+
250
+ .progress-fill::after {
251
+ content: '';
252
+ position: absolute;
253
+ top: 0;
254
+ left: 0;
255
+ right: 0;
256
+ bottom: 0;
257
+ background: linear-gradient(
258
+ 90deg,
259
+ transparent 0%,
260
+ rgba(255, 255, 255, 0.3) 50%,
261
+ transparent 100%
262
+ );
263
+ animation: shimmer-progress 2s ease-in-out infinite;
264
+ }
265
+
266
+ @keyframes progress {
267
+ from { width: 0; }
268
+ }
269
+
270
+ @keyframes shimmer-progress {
271
+ 0% { transform: translateX(-100%); }
272
+ 100% { transform: translateX(100%); }
273
+ }
274
+
275
+ /* Light mode adjustments */
276
+ html:not(.dark) .funding-card::before {
277
+ background: radial-gradient(
278
+ 400px circle at var(--card-mouse-x) var(--card-mouse-y),
279
+ rgba(66, 139, 202, 0.04),
280
+ transparent 50%
281
+ );
282
+ }
283
+
284
+ html:not(.dark) .funding-card:hover {
285
+ border-color: rgba(66, 139, 202, 0.3);
286
+ box-shadow: 0 8px 24px rgba(66, 139, 202, 0.08);
287
+ }
288
+
289
+ html:not(.dark) .contribute-card::before {
290
+ background: radial-gradient(
291
+ 300px circle at var(--card-mouse-x) var(--card-mouse-y),
292
+ rgba(66, 139, 202, 0.06),
293
+ transparent 50%
294
+ );
295
+ }
296
+
297
+ html:not(.dark) .contribute-card:hover {
298
+ border-color: rgba(66, 139, 202, 0.3);
299
+ box-shadow: 0 12px 32px rgba(66, 139, 202, 0.08);
300
+ }
301
+
302
+ html:not(.dark) .support-button-secondary:hover {
303
+ border-color: rgba(66, 139, 202, 0.6);
304
+ box-shadow:
305
+ 0 0 30px rgba(66, 139, 202, 0.1),
306
+ inset 0 0 20px rgba(66, 139, 202, 0.03);
307
+ }
308
+
309
+ html:not(.dark) .progress-fill {
310
+ background: linear-gradient(90deg, #3b82f6 0%, #60a5fa 100%);
311
+ }
312
+
313
+ /* Stagger animations */
314
+ .funding-card:nth-child(1) { transition-delay: 0.1s; }
315
+ .funding-card:nth-child(2) { transition-delay: 0.2s; }
316
+ .funding-card:nth-child(3) { transition-delay: 0.3s; }
317
+
318
+ .contribute-card:nth-child(1) { transition-delay: 0.1s; }
319
+ .contribute-card:nth-child(2) { transition-delay: 0.2s; }
320
+ .contribute-card:nth-child(3) { transition-delay: 0.3s; }
321
+ .contribute-card:nth-child(4) { transition-delay: 0.4s; }
322
+ </style>