odac 0.9.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 (213) hide show
  1. package/.editorconfig +21 -0
  2. package/.github/workflows/auto-pr-description.yml +49 -0
  3. package/.github/workflows/release.yml +32 -0
  4. package/.github/workflows/test-coverage.yml +58 -0
  5. package/.husky/pre-commit +2 -0
  6. package/.kiro/steering/code-style.md +56 -0
  7. package/.kiro/steering/product.md +20 -0
  8. package/.kiro/steering/structure.md +77 -0
  9. package/.kiro/steering/tech.md +87 -0
  10. package/.prettierrc +10 -0
  11. package/.releaserc.js +134 -0
  12. package/AGENTS.md +84 -0
  13. package/CHANGELOG.md +181 -0
  14. package/CODE_OF_CONDUCT.md +83 -0
  15. package/CONTRIBUTING.md +63 -0
  16. package/LICENSE +661 -0
  17. package/README.md +57 -0
  18. package/SECURITY.md +26 -0
  19. package/bin/candy +10 -0
  20. package/bin/candypack +10 -0
  21. package/cli/index.js +3 -0
  22. package/cli/src/Cli.js +348 -0
  23. package/cli/src/Connector.js +93 -0
  24. package/cli/src/Monitor.js +416 -0
  25. package/core/Candy.js +87 -0
  26. package/core/Commands.js +239 -0
  27. package/core/Config.js +1094 -0
  28. package/core/Lang.js +52 -0
  29. package/core/Log.js +43 -0
  30. package/core/Process.js +26 -0
  31. package/docs/backend/01-overview/01-whats-in-the-candy-box.md +9 -0
  32. package/docs/backend/01-overview/02-super-handy-helper-functions.md +9 -0
  33. package/docs/backend/01-overview/03-development-server.md +79 -0
  34. package/docs/backend/02-structure/01-typical-project-layout.md +39 -0
  35. package/docs/backend/03-config/00-configuration-overview.md +214 -0
  36. package/docs/backend/03-config/01-database-connection.md +60 -0
  37. package/docs/backend/03-config/02-static-route-mapping-optional.md +20 -0
  38. package/docs/backend/03-config/03-request-timeout.md +11 -0
  39. package/docs/backend/03-config/04-environment-variables.md +227 -0
  40. package/docs/backend/03-config/05-early-hints.md +352 -0
  41. package/docs/backend/04-routing/01-basic-page-routes.md +28 -0
  42. package/docs/backend/04-routing/02-controller-less-view-routes.md +43 -0
  43. package/docs/backend/04-routing/03-api-and-data-routes.md +20 -0
  44. package/docs/backend/04-routing/04-authentication-aware-routes.md +48 -0
  45. package/docs/backend/04-routing/05-advanced-routing.md +14 -0
  46. package/docs/backend/04-routing/06-error-pages.md +101 -0
  47. package/docs/backend/04-routing/07-cron-jobs.md +149 -0
  48. package/docs/backend/05-controllers/01-how-to-build-a-controller.md +17 -0
  49. package/docs/backend/05-controllers/02-your-trusty-candy-assistant.md +20 -0
  50. package/docs/backend/05-controllers/03-controller-classes.md +93 -0
  51. package/docs/backend/05-forms/01-custom-forms.md +395 -0
  52. package/docs/backend/05-forms/02-automatic-database-insert.md +297 -0
  53. package/docs/backend/06-request-and-response/01-the-request-object-what-is-the-user-asking-for.md +96 -0
  54. package/docs/backend/06-request-and-response/02-sending-a-response-replying-to-the-user.md +40 -0
  55. package/docs/backend/07-views/01-the-view-directory.md +73 -0
  56. package/docs/backend/07-views/02-rendering-a-view.md +179 -0
  57. package/docs/backend/07-views/03-template-syntax.md +181 -0
  58. package/docs/backend/07-views/03-variables.md +328 -0
  59. package/docs/backend/07-views/04-request-data.md +231 -0
  60. package/docs/backend/07-views/05-conditionals.md +290 -0
  61. package/docs/backend/07-views/06-loops.md +353 -0
  62. package/docs/backend/07-views/07-translations.md +358 -0
  63. package/docs/backend/07-views/08-backend-javascript.md +398 -0
  64. package/docs/backend/07-views/09-comments.md +297 -0
  65. package/docs/backend/08-database/01-database-connection.md +99 -0
  66. package/docs/backend/08-database/02-using-mysql.md +322 -0
  67. package/docs/backend/09-validation/01-the-validator-service.md +424 -0
  68. package/docs/backend/10-authentication/01-user-logins-with-authjs.md +53 -0
  69. package/docs/backend/10-authentication/02-foiling-villains-with-csrf-protection.md +55 -0
  70. package/docs/backend/10-authentication/03-register.md +134 -0
  71. package/docs/backend/10-authentication/04-candy-register-forms.md +676 -0
  72. package/docs/backend/10-authentication/05-session-management.md +159 -0
  73. package/docs/backend/10-authentication/06-candy-login-forms.md +596 -0
  74. package/docs/backend/11-mail/01-the-mail-service.md +42 -0
  75. package/docs/backend/12-streaming/01-streaming-overview.md +300 -0
  76. package/docs/backend/13-utilities/01-candy-var.md +504 -0
  77. package/docs/frontend/01-overview/01-introduction.md +146 -0
  78. package/docs/frontend/02-ajax-navigation/01-quick-start.md +608 -0
  79. package/docs/frontend/02-ajax-navigation/02-configuration.md +370 -0
  80. package/docs/frontend/02-ajax-navigation/03-advanced-usage.md +519 -0
  81. package/docs/frontend/03-forms/01-form-handling.md +420 -0
  82. package/docs/frontend/04-api-requests/01-get-post.md +443 -0
  83. package/docs/frontend/05-streaming/01-client-streaming.md +163 -0
  84. package/docs/index.json +452 -0
  85. package/docs/server/01-installation/01-quick-install.md +19 -0
  86. package/docs/server/01-installation/02-manual-installation-via-npm.md +9 -0
  87. package/docs/server/02-get-started/01-core-concepts.md +7 -0
  88. package/docs/server/02-get-started/02-basic-commands.md +57 -0
  89. package/docs/server/02-get-started/03-cli-reference.md +276 -0
  90. package/docs/server/02-get-started/04-cli-quick-reference.md +102 -0
  91. package/docs/server/03-service/01-start-a-new-service.md +57 -0
  92. package/docs/server/03-service/02-delete-a-service.md +48 -0
  93. package/docs/server/04-web/01-create-a-website.md +36 -0
  94. package/docs/server/04-web/02-list-websites.md +9 -0
  95. package/docs/server/04-web/03-delete-a-website.md +29 -0
  96. package/docs/server/05-subdomain/01-create-a-subdomain.md +32 -0
  97. package/docs/server/05-subdomain/02-list-subdomains.md +33 -0
  98. package/docs/server/05-subdomain/03-delete-a-subdomain.md +41 -0
  99. package/docs/server/06-ssl/01-renew-an-ssl-certificate.md +34 -0
  100. package/docs/server/07-mail/01-create-a-mail-account.md +23 -0
  101. package/docs/server/07-mail/02-delete-a-mail-account.md +20 -0
  102. package/docs/server/07-mail/03-list-mail-accounts.md +20 -0
  103. package/docs/server/07-mail/04-change-account-password.md +23 -0
  104. package/eslint.config.mjs +120 -0
  105. package/framework/index.js +4 -0
  106. package/framework/src/Auth.js +309 -0
  107. package/framework/src/Candy.js +81 -0
  108. package/framework/src/Config.js +79 -0
  109. package/framework/src/Env.js +60 -0
  110. package/framework/src/Lang.js +57 -0
  111. package/framework/src/Mail.js +83 -0
  112. package/framework/src/Mysql.js +575 -0
  113. package/framework/src/Request.js +301 -0
  114. package/framework/src/Route/Cron.js +128 -0
  115. package/framework/src/Route/Internal.js +439 -0
  116. package/framework/src/Route.js +455 -0
  117. package/framework/src/Server.js +15 -0
  118. package/framework/src/Stream.js +163 -0
  119. package/framework/src/Token.js +37 -0
  120. package/framework/src/Validator.js +271 -0
  121. package/framework/src/Var.js +211 -0
  122. package/framework/src/View/EarlyHints.js +190 -0
  123. package/framework/src/View/Form.js +600 -0
  124. package/framework/src/View.js +513 -0
  125. package/framework/web/candy.js +838 -0
  126. package/jest.config.js +22 -0
  127. package/locale/de-DE.json +80 -0
  128. package/locale/en-US.json +79 -0
  129. package/locale/es-ES.json +80 -0
  130. package/locale/fr-FR.json +80 -0
  131. package/locale/pt-BR.json +80 -0
  132. package/locale/ru-RU.json +80 -0
  133. package/locale/tr-TR.json +85 -0
  134. package/locale/zh-CN.json +80 -0
  135. package/package.json +86 -0
  136. package/server/index.js +5 -0
  137. package/server/src/Api.js +88 -0
  138. package/server/src/DNS.js +940 -0
  139. package/server/src/Hub.js +535 -0
  140. package/server/src/Mail.js +571 -0
  141. package/server/src/SSL.js +180 -0
  142. package/server/src/Server.js +27 -0
  143. package/server/src/Service.js +248 -0
  144. package/server/src/Subdomain.js +64 -0
  145. package/server/src/Web/Firewall.js +170 -0
  146. package/server/src/Web/Proxy.js +134 -0
  147. package/server/src/Web.js +451 -0
  148. package/server/src/mail/imap.js +1091 -0
  149. package/server/src/mail/server.js +32 -0
  150. package/server/src/mail/smtp.js +786 -0
  151. package/test/cli/Cli.test.js +36 -0
  152. package/test/core/Candy.test.js +234 -0
  153. package/test/core/Commands.test.js +538 -0
  154. package/test/core/Config.test.js +1435 -0
  155. package/test/core/Lang.test.js +250 -0
  156. package/test/core/Process.test.js +156 -0
  157. package/test/framework/Route.test.js +239 -0
  158. package/test/framework/View/EarlyHints.test.js +282 -0
  159. package/test/scripts/check-coverage.js +132 -0
  160. package/test/server/Api.test.js +647 -0
  161. package/test/server/Client.test.js +338 -0
  162. package/test/server/DNS.test.js +2050 -0
  163. package/test/server/DNS.test.js.bak +2084 -0
  164. package/test/server/Log.test.js +73 -0
  165. package/test/server/Mail.account.test_.js +460 -0
  166. package/test/server/Mail.init.test_.js +411 -0
  167. package/test/server/Mail.test_.js +1340 -0
  168. package/test/server/SSL.test_.js +1491 -0
  169. package/test/server/Server.test.js +765 -0
  170. package/test/server/Service.test_.js +1127 -0
  171. package/test/server/Subdomain.test.js +440 -0
  172. package/test/server/Web/Firewall.test.js +175 -0
  173. package/test/server/Web.test_.js +1562 -0
  174. package/test/server/__mocks__/acme-client.js +17 -0
  175. package/test/server/__mocks__/bcrypt.js +50 -0
  176. package/test/server/__mocks__/child_process.js +389 -0
  177. package/test/server/__mocks__/crypto.js +432 -0
  178. package/test/server/__mocks__/fs.js +450 -0
  179. package/test/server/__mocks__/globalCandy.js +227 -0
  180. package/test/server/__mocks__/http-proxy.js +105 -0
  181. package/test/server/__mocks__/http.js +575 -0
  182. package/test/server/__mocks__/https.js +272 -0
  183. package/test/server/__mocks__/index.js +249 -0
  184. package/test/server/__mocks__/mail/server.js +100 -0
  185. package/test/server/__mocks__/mail/smtp.js +31 -0
  186. package/test/server/__mocks__/mailparser.js +81 -0
  187. package/test/server/__mocks__/net.js +369 -0
  188. package/test/server/__mocks__/node-forge.js +328 -0
  189. package/test/server/__mocks__/os.js +320 -0
  190. package/test/server/__mocks__/path.js +291 -0
  191. package/test/server/__mocks__/selfsigned.js +8 -0
  192. package/test/server/__mocks__/server/src/mail/server.js +100 -0
  193. package/test/server/__mocks__/server/src/mail/smtp.js +31 -0
  194. package/test/server/__mocks__/smtp-server.js +106 -0
  195. package/test/server/__mocks__/sqlite3.js +394 -0
  196. package/test/server/__mocks__/testFactories.js +299 -0
  197. package/test/server/__mocks__/testHelpers.js +363 -0
  198. package/test/server/__mocks__/tls.js +229 -0
  199. package/watchdog/index.js +3 -0
  200. package/watchdog/src/Watchdog.js +156 -0
  201. package/web/config.json +5 -0
  202. package/web/controller/page/about.js +27 -0
  203. package/web/controller/page/index.js +34 -0
  204. package/web/package.json +18 -0
  205. package/web/public/assets/css/style.css +1835 -0
  206. package/web/public/assets/js/app.js +96 -0
  207. package/web/route/www.js +19 -0
  208. package/web/skeleton/main.html +22 -0
  209. package/web/view/content/about.html +65 -0
  210. package/web/view/content/home.html +205 -0
  211. package/web/view/footer/main.html +11 -0
  212. package/web/view/head/main.html +5 -0
  213. package/web/view/header/main.html +14 -0
@@ -0,0 +1,1835 @@
1
+ /* ============================================
2
+ CandyPack Template Stylesheet
3
+ Modern, responsive design with smooth transitions
4
+ ============================================ */
5
+
6
+ /* CSS Variables - Dark Theme with Indigo */
7
+ :root {
8
+ /* Indigo Color Palette */
9
+ --primary: #6366f1;
10
+ --primary-dark: #4f46e5;
11
+ --primary-light: #818cf8;
12
+ --accent: #8b5cf6;
13
+ --success: #10b981;
14
+ --error: #ef4444;
15
+
16
+ /* Dark Theme Colors */
17
+ --bg-primary: #0f172a;
18
+ --bg-secondary: #1e293b;
19
+ --bg-tertiary: #334155;
20
+ --text-primary: #f1f5f9;
21
+ --text-secondary: #cbd5e1;
22
+ --text-muted: #94a3b8;
23
+ --border: #334155;
24
+ --shadow: rgba(0, 0, 0, 0.3);
25
+
26
+ /* Additional Color Variables */
27
+ --white: #ffffff;
28
+ --text-dark: #0f172a;
29
+ --text-light: #cbd5e1;
30
+ --secondary: #cbd5e1;
31
+
32
+ /* Card & Surface */
33
+ --card-bg: #1e293b;
34
+ --code-bg: #0f172a;
35
+ --code-color: #e2e8f0;
36
+
37
+ /* Typography */
38
+ --font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
39
+ --font-mono: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
40
+
41
+ /* Spacing */
42
+ --spacing-xs: 0.5rem;
43
+ --spacing-sm: 1rem;
44
+ --spacing-md: 2rem;
45
+ --spacing-lg: 3rem;
46
+ --spacing-xl: 4rem;
47
+
48
+ /* Layout */
49
+ --max-width: 1200px;
50
+ --border-radius: 0.5rem;
51
+ --transition: all 0.3s ease;
52
+ }
53
+
54
+ /* ============================================
55
+ Reset & Base Styles
56
+ ============================================ */
57
+
58
+ * {
59
+ margin: 0;
60
+ padding: 0;
61
+ box-sizing: border-box;
62
+ }
63
+
64
+ html {
65
+ font-size: 16px;
66
+ scroll-behavior: smooth;
67
+ }
68
+
69
+ body {
70
+ font-family: var(--font-sans);
71
+ color: var(--text-primary);
72
+ line-height: 1.6;
73
+ background-color: var(--bg-primary);
74
+ -webkit-font-smoothing: antialiased;
75
+ -moz-osx-font-smoothing: grayscale;
76
+ }
77
+
78
+ /* ============================================
79
+ Typography
80
+ ============================================ */
81
+
82
+ h1,
83
+ h2,
84
+ h3,
85
+ h4,
86
+ h5,
87
+ h6 {
88
+ font-weight: 700;
89
+ line-height: 1.2;
90
+ margin-bottom: var(--spacing-sm);
91
+ color: var(--text-primary);
92
+ }
93
+
94
+ h1 {
95
+ font-size: 2.5rem;
96
+ }
97
+
98
+ h2 {
99
+ font-size: 2rem;
100
+ }
101
+
102
+ h3 {
103
+ font-size: 1.5rem;
104
+ }
105
+
106
+ p {
107
+ margin-bottom: var(--spacing-sm);
108
+ color: var(--text-secondary);
109
+ }
110
+
111
+ a {
112
+ color: var(--primary);
113
+ text-decoration: none;
114
+ transition: var(--transition);
115
+ }
116
+
117
+ a:hover {
118
+ color: var(--primary-dark);
119
+ }
120
+
121
+ code {
122
+ font-family: var(--font-mono);
123
+ background-color: var(--secondary);
124
+ color: var(--text-dark);
125
+ padding: 0.2rem 0.4rem;
126
+ border-radius: 0.25rem;
127
+ font-size: 0.9em;
128
+ }
129
+
130
+ pre {
131
+ font-family: var(--font-mono);
132
+ background-color: var(--secondary);
133
+ color: var(--text-dark);
134
+ padding: var(--spacing-sm);
135
+ border-radius: var(--border-radius);
136
+ overflow-x: auto;
137
+ margin-bottom: var(--spacing-sm);
138
+ }
139
+
140
+ pre code {
141
+ background: none;
142
+ padding: 0;
143
+ }
144
+
145
+ /* ============================================
146
+ Layout & Container
147
+ ============================================ */
148
+
149
+ .container {
150
+ max-width: var(--max-width);
151
+ margin: 0 auto;
152
+ padding: 0 var(--spacing-sm);
153
+ }
154
+
155
+ /* ============================================
156
+ Header & Navigation
157
+ ============================================ */
158
+
159
+ .navbar {
160
+ background-color: var(--bg-secondary);
161
+ color: var(--text-primary);
162
+ border-bottom: 1px solid var(--border);
163
+ position: sticky;
164
+ top: 0;
165
+ z-index: 100;
166
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
167
+ padding: var(--spacing-sm) 0;
168
+ backdrop-filter: blur(10px);
169
+ }
170
+
171
+ .navbar .container {
172
+ display: flex;
173
+ justify-content: space-between;
174
+ align-items: center;
175
+ }
176
+
177
+ .nav-brand {
178
+ display: flex;
179
+ align-items: center;
180
+ gap: 0.5rem;
181
+ font-size: 1.5rem;
182
+ font-weight: 700;
183
+ color: var(--primary);
184
+ }
185
+
186
+ .brand-icon {
187
+ font-size: 1.75rem;
188
+ }
189
+
190
+ .brand-name {
191
+ font-weight: 700;
192
+ }
193
+
194
+ .nav-links {
195
+ display: flex;
196
+ gap: var(--spacing-sm);
197
+ align-items: center;
198
+ }
199
+
200
+ .nav-link {
201
+ color: var(--text-secondary);
202
+ font-weight: 500;
203
+ padding: 0.5rem 1rem;
204
+ border-radius: var(--border-radius);
205
+ transition: var(--transition);
206
+ text-decoration: none;
207
+ }
208
+
209
+ .nav-link:hover,
210
+ .nav-link.active {
211
+ color: var(--primary);
212
+ background-color: var(--bg-tertiary);
213
+ }
214
+
215
+ header {
216
+ background-color: var(--bg-secondary);
217
+ color: var(--text-primary);
218
+ border-bottom: 1px solid var(--border);
219
+ position: sticky;
220
+ top: 0;
221
+ z-index: 100;
222
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
223
+ }
224
+
225
+ header .container {
226
+ display: flex;
227
+ justify-content: space-between;
228
+ align-items: center;
229
+ padding-top: var(--spacing-sm);
230
+ padding-bottom: var(--spacing-sm);
231
+ }
232
+
233
+ .header-content {
234
+ display: flex;
235
+ justify-content: space-between;
236
+ align-items: center;
237
+ width: 100%;
238
+ }
239
+
240
+ .logo {
241
+ font-size: 1.5rem;
242
+ font-weight: 700;
243
+ color: var(--primary);
244
+ display: flex;
245
+ align-items: center;
246
+ gap: 0.5rem;
247
+ }
248
+
249
+ .logo-icon {
250
+ font-size: 1.75rem;
251
+ }
252
+
253
+ .logo-text {
254
+ font-weight: 700;
255
+ }
256
+
257
+ nav ul {
258
+ list-style: none;
259
+ display: flex;
260
+ gap: var(--spacing-md);
261
+ align-items: center;
262
+ }
263
+
264
+ .nav {
265
+ display: flex;
266
+ gap: var(--spacing-sm);
267
+ }
268
+
269
+ nav a {
270
+ color: var(--text-light);
271
+ font-weight: 500;
272
+ padding: 0.5rem 1rem;
273
+ border-radius: var(--border-radius);
274
+ transition: var(--transition);
275
+ }
276
+
277
+ nav a:hover,
278
+ nav a.active {
279
+ color: var(--text-dark);
280
+ background-color: var(--secondary);
281
+ }
282
+
283
+ /* ============================================
284
+ Hero Section
285
+ ============================================ */
286
+
287
+ .hero {
288
+ text-align: center;
289
+ padding: var(--spacing-xl) 0;
290
+ background: linear-gradient(135deg, var(--bg-secondary) 0%, var(--bg-primary) 100%);
291
+ color: var(--text-primary);
292
+ border-bottom: 1px solid var(--border);
293
+ }
294
+
295
+ .hero-content {
296
+ max-width: 100%;
297
+ margin: 0 auto;
298
+ padding: 0 var(--spacing-md);
299
+ }
300
+
301
+ .hero h1,
302
+ .hero-title {
303
+ font-size: 3rem;
304
+ margin-bottom: var(--spacing-sm);
305
+ background: linear-gradient(135deg, var(--primary) 0%, var(--primary-light) 100%);
306
+ -webkit-background-clip: text;
307
+ -webkit-text-fill-color: transparent;
308
+ background-clip: text;
309
+ }
310
+
311
+ .hero p,
312
+ .hero-subtitle,
313
+ .hero-description {
314
+ font-size: 1.25rem;
315
+ color: var(--text-secondary);
316
+ max-width: 700px;
317
+ margin: 0 auto var(--spacing-md);
318
+ }
319
+
320
+ .hero-subtitle {
321
+ font-size: 1.5rem;
322
+ font-weight: 600;
323
+ color: var(--text-primary);
324
+ }
325
+
326
+ .hero-description {
327
+ font-size: 1.125rem;
328
+ }
329
+
330
+ .hero-buttons {
331
+ display: flex;
332
+ gap: var(--spacing-sm);
333
+ justify-content: center;
334
+ flex-wrap: wrap;
335
+ }
336
+
337
+ /* ============================================
338
+ Feature Cards
339
+ ============================================ */
340
+
341
+ .features {
342
+ padding: var(--spacing-xl) 0;
343
+ }
344
+
345
+ .section-title {
346
+ text-align: center;
347
+ font-size: 2.5rem;
348
+ margin-bottom: var(--spacing-md);
349
+ color: var(--text-primary);
350
+ background: linear-gradient(135deg, var(--primary) 0%, var(--primary-light) 100%);
351
+ -webkit-background-clip: text;
352
+ -webkit-text-fill-color: transparent;
353
+ background-clip: text;
354
+ }
355
+
356
+ .features-grid,
357
+ .feature-grid {
358
+ display: grid;
359
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
360
+ gap: var(--spacing-md);
361
+ margin-top: var(--spacing-md);
362
+ }
363
+
364
+ .feature-card {
365
+ background: var(--white);
366
+ color: var(--text-dark);
367
+ border: 1px solid var(--border);
368
+ border-radius: var(--border-radius);
369
+ padding: var(--spacing-md);
370
+ transition: var(--transition);
371
+ box-shadow: 0 2px 4px var(--shadow);
372
+ }
373
+
374
+ .feature-card:hover {
375
+ transform: translateY(-4px);
376
+ box-shadow: 0 8px 16px var(--shadow);
377
+ }
378
+
379
+ .feature-icon {
380
+ font-size: 3rem;
381
+ margin-bottom: var(--spacing-sm);
382
+ display: block;
383
+ }
384
+
385
+ .feature-card h3,
386
+ .feature-title {
387
+ color: var(--text-dark);
388
+ margin-bottom: var(--spacing-xs);
389
+ }
390
+
391
+ .feature-card p,
392
+ .feature-description {
393
+ color: var(--text-light);
394
+ margin-bottom: 0;
395
+ }
396
+
397
+ /* ============================================
398
+ Buttons
399
+ ============================================ */
400
+
401
+ .btn {
402
+ display: inline-block;
403
+ padding: 0.75rem 1.5rem;
404
+ border-radius: var(--border-radius);
405
+ font-weight: 600;
406
+ text-align: center;
407
+ cursor: pointer;
408
+ transition: var(--transition);
409
+ border: none;
410
+ font-size: 1rem;
411
+ font-family: var(--font-sans);
412
+ }
413
+
414
+ .btn-primary {
415
+ background-color: var(--primary);
416
+ color: white;
417
+ box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);
418
+ }
419
+
420
+ .btn-primary:hover {
421
+ background-color: var(--primary-dark);
422
+ transform: translateY(-2px);
423
+ box-shadow: 0 8px 20px rgba(99, 102, 241, 0.4);
424
+ }
425
+
426
+ .btn-secondary {
427
+ background-color: var(--bg-tertiary);
428
+ color: var(--text-primary);
429
+ border: 1px solid var(--border);
430
+ }
431
+
432
+ .btn-secondary:hover {
433
+ background-color: var(--bg-secondary);
434
+ border-color: var(--primary);
435
+ }
436
+
437
+ .btn-success {
438
+ background-color: var(--success);
439
+ color: white;
440
+ }
441
+
442
+ .btn-success:hover {
443
+ background-color: #059669;
444
+ }
445
+
446
+ /* ============================================
447
+ Forms
448
+ ============================================ */
449
+
450
+ .form-section {
451
+ padding: var(--spacing-xl) 0;
452
+ background-color: var(--secondary);
453
+ color: var(--text-dark);
454
+ }
455
+
456
+ form {
457
+ max-width: 600px;
458
+ margin: 0 auto;
459
+ background: var(--white);
460
+ color: var(--text-dark);
461
+ padding: var(--spacing-md);
462
+ border-radius: var(--border-radius);
463
+ box-shadow: 0 4px 8px var(--shadow);
464
+ }
465
+
466
+ .form-group {
467
+ margin-bottom: var(--spacing-sm);
468
+ }
469
+
470
+ label,
471
+ .form-label {
472
+ display: block;
473
+ margin-bottom: var(--spacing-xs);
474
+ font-weight: 600;
475
+ color: var(--text-dark);
476
+ }
477
+
478
+ input[type='text'],
479
+ input[type='email'],
480
+ textarea,
481
+ .form-input {
482
+ width: 100%;
483
+ padding: 0.75rem;
484
+ border: 1px solid var(--border);
485
+ border-radius: var(--border-radius);
486
+ font-family: var(--font-sans);
487
+ font-size: 1rem;
488
+ transition: var(--transition);
489
+ }
490
+
491
+ input:focus,
492
+ textarea:focus,
493
+ .form-input:focus {
494
+ outline: none;
495
+ border-color: var(--primary);
496
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
497
+ }
498
+
499
+ textarea,
500
+ textarea.form-input {
501
+ resize: vertical;
502
+ min-height: 120px;
503
+ }
504
+
505
+ .form-error {
506
+ color: var(--error);
507
+ font-size: 0.875rem;
508
+ margin-top: var(--spacing-xs);
509
+ display: block;
510
+ min-height: 1.25rem;
511
+ }
512
+
513
+ .form-error:empty {
514
+ display: none;
515
+ }
516
+
517
+ .form-error.show {
518
+ display: block;
519
+ }
520
+
521
+ input.error,
522
+ textarea.error {
523
+ border-color: var(--error);
524
+ }
525
+
526
+ .form-success {
527
+ background-color: var(--accent);
528
+ color: var(--white);
529
+ padding: var(--spacing-sm);
530
+ border-radius: var(--border-radius);
531
+ margin-top: var(--spacing-sm);
532
+ display: none;
533
+ }
534
+
535
+ .form-success.show {
536
+ display: block;
537
+ }
538
+
539
+ [candy-form-success] {
540
+ background-color: var(--accent);
541
+ color: var(--white);
542
+ padding: var(--spacing-sm);
543
+ border-radius: var(--border-radius);
544
+ margin-top: var(--spacing-sm);
545
+ display: none;
546
+ }
547
+
548
+ [candy-form-success]:not(:empty) {
549
+ display: block;
550
+ }
551
+
552
+ /* ============================================
553
+ Demo Section
554
+ ============================================ */
555
+
556
+ .demo,
557
+ .demo-section {
558
+ padding: var(--spacing-xl) 0;
559
+ background: var(--secondary);
560
+ color: var(--text-dark);
561
+ }
562
+
563
+ .demo-grid {
564
+ display: grid;
565
+ grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
566
+ gap: var(--spacing-md);
567
+ margin-top: var(--spacing-md);
568
+ }
569
+
570
+ .demo-card {
571
+ background: var(--white);
572
+ color: var(--text-dark);
573
+ border: 1px solid var(--border);
574
+ border-radius: var(--border-radius);
575
+ padding: var(--spacing-md);
576
+ box-shadow: 0 2px 4px var(--shadow);
577
+ }
578
+
579
+ .demo-title {
580
+ color: var(--text-dark);
581
+ margin-bottom: var(--spacing-xs);
582
+ }
583
+
584
+ .demo-description {
585
+ color: var(--text-light);
586
+ margin-bottom: var(--spacing-md);
587
+ }
588
+
589
+ .demo-box {
590
+ background: var(--white);
591
+ color: var(--text-dark);
592
+ border: 1px solid var(--border);
593
+ border-radius: var(--border-radius);
594
+ padding: var(--spacing-md);
595
+ margin-top: var(--spacing-md);
596
+ box-shadow: 0 2px 4px var(--shadow);
597
+ }
598
+
599
+ .contact-form {
600
+ margin-top: var(--spacing-sm);
601
+ }
602
+
603
+ .stats-display {
604
+ background: var(--secondary);
605
+ color: var(--text-dark);
606
+ padding: var(--spacing-sm);
607
+ border-radius: var(--border-radius);
608
+ margin-top: var(--spacing-sm);
609
+ display: none;
610
+ }
611
+
612
+ .stats-display.show {
613
+ display: block;
614
+ }
615
+
616
+ .stats-display p {
617
+ margin-bottom: var(--spacing-xs);
618
+ color: var(--text-dark);
619
+ }
620
+
621
+ .stats-grid {
622
+ display: grid;
623
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
624
+ gap: var(--spacing-sm);
625
+ }
626
+
627
+ .stat-item {
628
+ background: var(--white);
629
+ color: var(--text-dark);
630
+ padding: var(--spacing-sm);
631
+ border-radius: var(--border-radius);
632
+ border-left: 3px solid var(--primary);
633
+ }
634
+
635
+ .stat-item strong {
636
+ color: var(--text-dark);
637
+ display: block;
638
+ margin-bottom: 0.25rem;
639
+ }
640
+
641
+ /* ============================================
642
+ Code Examples
643
+ ============================================ */
644
+
645
+ .code-examples {
646
+ padding: var(--spacing-xl) 0;
647
+ }
648
+
649
+ .examples-grid {
650
+ display: grid;
651
+ grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
652
+ gap: var(--spacing-md);
653
+ margin-top: var(--spacing-md);
654
+ }
655
+
656
+ .code-example {
657
+ margin: var(--spacing-md) 0;
658
+ }
659
+
660
+ .code-example h4 {
661
+ margin-bottom: var(--spacing-xs);
662
+ color: var(--text-dark);
663
+ }
664
+
665
+ .example-title {
666
+ color: var(--text-dark);
667
+ margin-bottom: var(--spacing-xs);
668
+ font-size: 1.5rem;
669
+ }
670
+
671
+ .example-description {
672
+ color: var(--text-light);
673
+ margin-bottom: var(--spacing-sm);
674
+ }
675
+
676
+ .cta {
677
+ text-align: center;
678
+ margin-top: var(--spacing-xl);
679
+ padding: var(--spacing-lg);
680
+ background: var(--secondary);
681
+ color: var(--text-dark);
682
+ border-radius: var(--border-radius);
683
+ }
684
+
685
+ .cta-text {
686
+ font-size: 1.25rem;
687
+ color: var(--text-dark);
688
+ margin-bottom: var(--spacing-sm);
689
+ font-weight: 600;
690
+ }
691
+
692
+ /* ============================================
693
+ Footer
694
+ ============================================ */
695
+
696
+ footer {
697
+ background-color: var(--text-dark);
698
+ color: var(--white);
699
+ padding: var(--spacing-md) 0;
700
+ margin-top: var(--spacing-xl);
701
+ text-align: center;
702
+ }
703
+
704
+ .footer-content {
705
+ display: flex;
706
+ flex-direction: column;
707
+ gap: var(--spacing-sm);
708
+ align-items: center;
709
+ }
710
+
711
+ footer p {
712
+ color: var(--secondary);
713
+ margin-bottom: 0;
714
+ }
715
+
716
+ footer a {
717
+ color: var(--white);
718
+ text-decoration: underline;
719
+ }
720
+
721
+ footer a:hover {
722
+ color: var(--primary);
723
+ }
724
+
725
+ /* ============================================
726
+ About Page Styles
727
+ ============================================ */
728
+
729
+ .content-section {
730
+ padding: var(--spacing-lg) 0;
731
+ }
732
+
733
+ .content-section h2 {
734
+ margin-bottom: var(--spacing-md);
735
+ text-align: center;
736
+ }
737
+
738
+ .lead {
739
+ font-size: 1.25rem;
740
+ color: var(--text-light);
741
+ max-width: 700px;
742
+ margin: 0 auto;
743
+ }
744
+
745
+ .component-grid {
746
+ display: grid;
747
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
748
+ gap: var(--spacing-md);
749
+ margin-top: var(--spacing-md);
750
+ }
751
+
752
+ .component-card {
753
+ background: var(--white);
754
+ color: var(--text-dark);
755
+ border: 1px solid var(--border);
756
+ border-radius: var(--border-radius);
757
+ padding: var(--spacing-md);
758
+ transition: var(--transition);
759
+ }
760
+
761
+ .component-card:hover {
762
+ box-shadow: 0 4px 8px var(--shadow);
763
+ transform: translateY(-2px);
764
+ }
765
+
766
+ .component-card h3 {
767
+ margin-bottom: var(--spacing-xs);
768
+ }
769
+
770
+ .philosophy-list {
771
+ list-style: none;
772
+ max-width: 700px;
773
+ margin: var(--spacing-md) auto;
774
+ }
775
+
776
+ .philosophy-list li {
777
+ padding: var(--spacing-sm);
778
+ margin-bottom: var(--spacing-sm);
779
+ background: var(--white);
780
+ color: var(--text-dark);
781
+ border-radius: var(--border-radius);
782
+ box-shadow: 0 2px 4px var(--shadow);
783
+ line-height: 1.6;
784
+ }
785
+
786
+ .philosophy-list li * {
787
+ color: inherit;
788
+ }
789
+
790
+ .philosophy-list strong {
791
+ color: var(--primary);
792
+ font-weight: 600;
793
+ }
794
+
795
+ .philosophy-list code {
796
+ background-color: var(--bg-tertiary);
797
+ color: var(--text-primary);
798
+ padding: 0.2rem 0.4rem;
799
+ border-radius: 0.25rem;
800
+ }
801
+
802
+ .links-grid {
803
+ display: grid;
804
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
805
+ gap: var(--spacing-md);
806
+ margin-top: var(--spacing-md);
807
+ }
808
+
809
+ .link-card {
810
+ background: var(--white);
811
+ color: var(--text-dark);
812
+ border: 2px solid var(--border);
813
+ border-radius: var(--border-radius);
814
+ padding: var(--spacing-md);
815
+ transition: var(--transition);
816
+ display: block;
817
+ }
818
+
819
+ .link-card:hover {
820
+ border-color: var(--primary);
821
+ box-shadow: 0 4px 12px var(--shadow);
822
+ transform: translateY(-2px);
823
+ }
824
+
825
+ .link-card h3 {
826
+ color: var(--text-dark);
827
+ margin-bottom: var(--spacing-xs);
828
+ }
829
+
830
+ .link-card p {
831
+ color: var(--text-light);
832
+ margin-bottom: 0;
833
+ }
834
+
835
+ /* ============================================
836
+ Documentation Page Styles
837
+ ============================================ */
838
+
839
+ .docs-page {
840
+ padding: var(--spacing-md) 0;
841
+ }
842
+
843
+ .docs-header {
844
+ text-align: center;
845
+ padding: var(--spacing-lg) 0;
846
+ background: var(--secondary);
847
+ color: var(--text-dark);
848
+ border-radius: var(--border-radius);
849
+ margin-bottom: var(--spacing-lg);
850
+ }
851
+
852
+ .docs-intro {
853
+ font-size: 1.125rem;
854
+ color: var(--text-light);
855
+ max-width: 700px;
856
+ margin: 0 auto;
857
+ }
858
+
859
+ .examples-container {
860
+ margin: var(--spacing-lg) 0;
861
+ }
862
+
863
+ .example-card {
864
+ background: var(--white);
865
+ color: var(--text-dark);
866
+ border: 1px solid var(--border);
867
+ border-radius: var(--border-radius);
868
+ padding: var(--spacing-md);
869
+ margin-bottom: var(--spacing-md);
870
+ box-shadow: 0 2px 4px var(--shadow);
871
+ }
872
+
873
+ .example-title {
874
+ color: var(--text-dark);
875
+ margin-bottom: var(--spacing-xs);
876
+ }
877
+
878
+ .example-description {
879
+ color: var(--text-light);
880
+ margin-bottom: var(--spacing-sm);
881
+ }
882
+
883
+ .code-block {
884
+ background: var(--text-dark);
885
+ border-radius: var(--border-radius);
886
+ padding: var(--spacing-sm);
887
+ overflow-x: auto;
888
+ }
889
+
890
+ .code-block pre {
891
+ background: transparent;
892
+ margin: 0;
893
+ padding: 0;
894
+ }
895
+
896
+ .code-block code {
897
+ color: #e5e7eb;
898
+ background: transparent;
899
+ font-size: 0.875rem;
900
+ line-height: 1.6;
901
+ }
902
+
903
+ .resources-section {
904
+ margin: var(--spacing-xl) 0;
905
+ padding: var(--spacing-lg) 0;
906
+ background: var(--secondary);
907
+ color: var(--text-dark);
908
+ border-radius: var(--border-radius);
909
+ }
910
+
911
+ .resources-section h2 {
912
+ text-align: center;
913
+ margin-bottom: var(--spacing-md);
914
+ }
915
+
916
+ .resource-cards {
917
+ display: grid;
918
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
919
+ gap: var(--spacing-md);
920
+ max-width: var(--max-width);
921
+ margin: 0 auto;
922
+ padding: 0 var(--spacing-sm);
923
+ }
924
+
925
+ .resource-card {
926
+ background: var(--white);
927
+ color: var(--text-dark);
928
+ border: 1px solid var(--border);
929
+ border-radius: var(--border-radius);
930
+ padding: var(--spacing-md);
931
+ transition: var(--transition);
932
+ }
933
+
934
+ .resource-card:hover {
935
+ box-shadow: 0 4px 12px var(--shadow);
936
+ transform: translateY(-2px);
937
+ }
938
+
939
+ .resource-card h3 {
940
+ color: var(--text-dark);
941
+ margin-bottom: var(--spacing-xs);
942
+ }
943
+
944
+ .resource-card p {
945
+ color: var(--text-light);
946
+ margin-bottom: var(--spacing-sm);
947
+ }
948
+
949
+ .resource-link {
950
+ color: var(--primary);
951
+ font-weight: 600;
952
+ display: inline-block;
953
+ margin-top: var(--spacing-xs);
954
+ }
955
+
956
+ .resource-link:hover {
957
+ color: var(--primary-dark);
958
+ }
959
+
960
+ .features-overview {
961
+ margin: var(--spacing-xl) 0;
962
+ }
963
+
964
+ .features-overview h2 {
965
+ text-align: center;
966
+ margin-bottom: var(--spacing-md);
967
+ }
968
+
969
+ .feature-list {
970
+ max-width: 800px;
971
+ margin: 0 auto;
972
+ }
973
+
974
+ .feature-item {
975
+ padding: var(--spacing-sm);
976
+ margin-bottom: var(--spacing-sm);
977
+ background: var(--white);
978
+ color: var(--text-dark);
979
+ border-left: 4px solid var(--primary);
980
+ border-radius: var(--border-radius);
981
+ }
982
+
983
+ .feature-item h4 {
984
+ color: var(--text-dark);
985
+ margin-bottom: var(--spacing-xs);
986
+ }
987
+
988
+ .feature-item p {
989
+ color: var(--text-light);
990
+ margin-bottom: 0;
991
+ }
992
+
993
+ .getting-started {
994
+ margin: var(--spacing-xl) 0;
995
+ padding: var(--spacing-lg);
996
+ background: var(--white);
997
+ border-radius: var(--border-radius);
998
+ border: 1px solid var(--border);
999
+ }
1000
+
1001
+ .getting-started h2 {
1002
+ text-align: center;
1003
+ margin-bottom: var(--spacing-md);
1004
+ }
1005
+
1006
+ .steps-list {
1007
+ max-width: 700px;
1008
+ margin: 0 auto;
1009
+ padding-left: var(--spacing-md);
1010
+ }
1011
+
1012
+ .steps-list li {
1013
+ margin-bottom: var(--spacing-sm);
1014
+ padding-left: var(--spacing-xs);
1015
+ color: var(--text-light);
1016
+ }
1017
+
1018
+ .steps-list strong {
1019
+ color: var(--text-dark);
1020
+ }
1021
+
1022
+ .tips-section {
1023
+ margin: var(--spacing-xl) 0;
1024
+ padding: var(--spacing-lg);
1025
+ background: var(--secondary);
1026
+ color: var(--text-dark);
1027
+ border-radius: var(--border-radius);
1028
+ }
1029
+
1030
+ .tips-section h2 {
1031
+ text-align: center;
1032
+ margin-bottom: var(--spacing-md);
1033
+ }
1034
+
1035
+ .tips-list {
1036
+ max-width: 700px;
1037
+ margin: 0 auto;
1038
+ list-style: none;
1039
+ }
1040
+
1041
+ .tips-list li {
1042
+ padding: var(--spacing-sm);
1043
+ margin-bottom: var(--spacing-sm);
1044
+ background: var(--white);
1045
+ color: var(--text-dark);
1046
+ border-radius: var(--border-radius);
1047
+ border-left: 3px solid var(--accent);
1048
+ }
1049
+
1050
+ .tips-list strong {
1051
+ color: var(--text-dark);
1052
+ }
1053
+
1054
+ /* ============================================
1055
+ Utility Classes
1056
+ ============================================ */
1057
+
1058
+ /* Spacing */
1059
+ .mt-xs {
1060
+ margin-top: var(--spacing-xs);
1061
+ }
1062
+ .mt-sm {
1063
+ margin-top: var(--spacing-sm);
1064
+ }
1065
+ .mt-md {
1066
+ margin-top: var(--spacing-md);
1067
+ }
1068
+ .mt-lg {
1069
+ margin-top: var(--spacing-lg);
1070
+ }
1071
+ .mt-xl {
1072
+ margin-top: var(--spacing-xl);
1073
+ }
1074
+
1075
+ .mb-xs {
1076
+ margin-bottom: var(--spacing-xs);
1077
+ }
1078
+ .mb-sm {
1079
+ margin-bottom: var(--spacing-sm);
1080
+ }
1081
+ .mb-md {
1082
+ margin-bottom: var(--spacing-md);
1083
+ }
1084
+ .mb-lg {
1085
+ margin-bottom: var(--spacing-lg);
1086
+ }
1087
+ .mb-xl {
1088
+ margin-bottom: var(--spacing-xl);
1089
+ }
1090
+
1091
+ .pt-xs {
1092
+ padding-top: var(--spacing-xs);
1093
+ }
1094
+ .pt-sm {
1095
+ padding-top: var(--spacing-sm);
1096
+ }
1097
+ .pt-md {
1098
+ padding-top: var(--spacing-md);
1099
+ }
1100
+ .pt-lg {
1101
+ padding-top: var(--spacing-lg);
1102
+ }
1103
+ .pt-xl {
1104
+ padding-top: var(--spacing-xl);
1105
+ }
1106
+
1107
+ .pb-xs {
1108
+ padding-bottom: var(--spacing-xs);
1109
+ }
1110
+ .pb-sm {
1111
+ padding-bottom: var(--spacing-sm);
1112
+ }
1113
+ .pb-md {
1114
+ padding-bottom: var(--spacing-md);
1115
+ }
1116
+ .pb-lg {
1117
+ padding-bottom: var(--spacing-lg);
1118
+ }
1119
+ .pb-xl {
1120
+ padding-bottom: var(--spacing-xl);
1121
+ }
1122
+
1123
+ /* Text Alignment */
1124
+ .text-center {
1125
+ text-align: center;
1126
+ }
1127
+ .text-left {
1128
+ text-align: left;
1129
+ }
1130
+ .text-right {
1131
+ text-align: right;
1132
+ }
1133
+
1134
+ /* Display */
1135
+ .hidden {
1136
+ display: none;
1137
+ }
1138
+ .block {
1139
+ display: block;
1140
+ }
1141
+ .inline-block {
1142
+ display: inline-block;
1143
+ }
1144
+ .flex {
1145
+ display: flex;
1146
+ }
1147
+ .grid {
1148
+ display: grid;
1149
+ }
1150
+
1151
+ /* Flexbox Utilities */
1152
+ .flex-center {
1153
+ display: flex;
1154
+ justify-content: center;
1155
+ align-items: center;
1156
+ }
1157
+
1158
+ .flex-between {
1159
+ display: flex;
1160
+ justify-content: space-between;
1161
+ align-items: center;
1162
+ }
1163
+
1164
+ .flex-column {
1165
+ display: flex;
1166
+ flex-direction: column;
1167
+ }
1168
+
1169
+ .gap-xs {
1170
+ gap: var(--spacing-xs);
1171
+ }
1172
+ .gap-sm {
1173
+ gap: var(--spacing-sm);
1174
+ }
1175
+ .gap-md {
1176
+ gap: var(--spacing-md);
1177
+ }
1178
+ .gap-lg {
1179
+ gap: var(--spacing-lg);
1180
+ }
1181
+
1182
+ /* ============================================
1183
+ Responsive Breakpoints
1184
+ ============================================ */
1185
+
1186
+ /* Tablet: 768px - 1024px */
1187
+ @media (max-width: 1024px) {
1188
+ :root {
1189
+ --spacing-lg: 2.5rem;
1190
+ --spacing-xl: 3rem;
1191
+ }
1192
+
1193
+ .hero h1 {
1194
+ font-size: 2.5rem;
1195
+ }
1196
+
1197
+ .features-grid {
1198
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
1199
+ }
1200
+ }
1201
+
1202
+ /* Mobile: < 768px */
1203
+ @media (max-width: 768px) {
1204
+ :root {
1205
+ --spacing-md: 1.5rem;
1206
+ --spacing-lg: 2rem;
1207
+ --spacing-xl: 2.5rem;
1208
+ }
1209
+
1210
+ html {
1211
+ font-size: 14px;
1212
+ }
1213
+
1214
+ h1 {
1215
+ font-size: 2rem;
1216
+ }
1217
+
1218
+ h2 {
1219
+ font-size: 1.75rem;
1220
+ }
1221
+
1222
+ h3 {
1223
+ font-size: 1.25rem;
1224
+ }
1225
+
1226
+ .hero h1 {
1227
+ font-size: 2rem;
1228
+ }
1229
+
1230
+ .hero p {
1231
+ font-size: 1rem;
1232
+ }
1233
+
1234
+ .navbar .container {
1235
+ flex-direction: column;
1236
+ gap: var(--spacing-sm);
1237
+ }
1238
+
1239
+ .nav-links {
1240
+ flex-direction: column;
1241
+ gap: var(--spacing-xs);
1242
+ width: 100%;
1243
+ }
1244
+
1245
+ .nav-link {
1246
+ display: block;
1247
+ text-align: center;
1248
+ }
1249
+
1250
+ .header-content {
1251
+ flex-direction: column;
1252
+ gap: var(--spacing-sm);
1253
+ }
1254
+
1255
+ .nav {
1256
+ flex-direction: column;
1257
+ gap: var(--spacing-xs);
1258
+ width: 100%;
1259
+ }
1260
+
1261
+ nav ul {
1262
+ flex-direction: column;
1263
+ gap: var(--spacing-xs);
1264
+ width: 100%;
1265
+ }
1266
+
1267
+ nav a {
1268
+ display: block;
1269
+ text-align: center;
1270
+ }
1271
+
1272
+ .hero-buttons {
1273
+ flex-direction: column;
1274
+ align-items: stretch;
1275
+ }
1276
+
1277
+ .btn {
1278
+ width: 100%;
1279
+ }
1280
+
1281
+ .features-grid,
1282
+ .feature-grid {
1283
+ grid-template-columns: 1fr;
1284
+ }
1285
+
1286
+ .demo-grid {
1287
+ grid-template-columns: 1fr;
1288
+ }
1289
+
1290
+ .examples-grid {
1291
+ grid-template-columns: 1fr;
1292
+ }
1293
+
1294
+ form {
1295
+ padding: var(--spacing-sm);
1296
+ }
1297
+ }
1298
+
1299
+ /* Small Mobile: < 480px */
1300
+ @media (max-width: 480px) {
1301
+ .container {
1302
+ padding: 0 var(--spacing-xs);
1303
+ }
1304
+
1305
+ .hero {
1306
+ padding: var(--spacing-md) 0;
1307
+ }
1308
+
1309
+ .features,
1310
+ .form-section,
1311
+ .demo-section {
1312
+ padding: var(--spacing-md) 0;
1313
+ }
1314
+ }
1315
+
1316
+ /* ============================================
1317
+ Animations & Transitions
1318
+ ============================================ */
1319
+
1320
+ @keyframes fadeIn {
1321
+ from {
1322
+ opacity: 0;
1323
+ transform: translateY(20px);
1324
+ }
1325
+ to {
1326
+ opacity: 1;
1327
+ transform: translateY(0);
1328
+ }
1329
+ }
1330
+
1331
+ .fade-in {
1332
+ animation: fadeIn 0.6s ease-out;
1333
+ }
1334
+
1335
+ /* Smooth page transitions */
1336
+ [candy-page] {
1337
+ animation: fadeIn 0.4s ease-out;
1338
+ }
1339
+
1340
+ /* Loading state */
1341
+ .loading {
1342
+ opacity: 0.6;
1343
+ pointer-events: none;
1344
+ }
1345
+
1346
+ /* Hover effects for interactive elements */
1347
+ .interactive {
1348
+ transition: var(--transition);
1349
+ cursor: pointer;
1350
+ }
1351
+
1352
+ .interactive:hover {
1353
+ transform: scale(1.02);
1354
+ }
1355
+
1356
+ /* Focus visible for accessibility */
1357
+ *:focus-visible {
1358
+ outline: 2px solid var(--primary);
1359
+ outline-offset: 2px;
1360
+ }
1361
+
1362
+ /* Getting Started Page Styles */
1363
+ .hero-actions {
1364
+ display: flex;
1365
+ gap: 1rem;
1366
+ margin-top: 2rem;
1367
+ flex-wrap: wrap;
1368
+ justify-content: center;
1369
+ }
1370
+
1371
+ .hero-actions .btn {
1372
+ text-decoration: none;
1373
+ color: white;
1374
+ }
1375
+
1376
+ .hero-actions .btn-primary {
1377
+ color: white !important;
1378
+ }
1379
+
1380
+ .hero-actions .btn-primary:hover {
1381
+ color: white !important;
1382
+ }
1383
+
1384
+ .hero-actions .btn-secondary {
1385
+ color: var(--text-primary);
1386
+ }
1387
+
1388
+ .hero-actions .btn-secondary:hover {
1389
+ color: var(--text-primary);
1390
+ }
1391
+
1392
+ .structure-grid {
1393
+ display: grid;
1394
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
1395
+ gap: 2rem;
1396
+ margin-top: 2rem;
1397
+ }
1398
+
1399
+ .structure-item {
1400
+ padding: 1.5rem;
1401
+ background: var(--card-bg);
1402
+ color: var(--text-primary);
1403
+ border-radius: 8px;
1404
+ border: 1px solid var(--border);
1405
+ }
1406
+
1407
+ .structure-icon {
1408
+ font-size: 2.5rem;
1409
+ margin-bottom: 1rem;
1410
+ }
1411
+
1412
+ .structure-title {
1413
+ font-size: 1.25rem;
1414
+ font-weight: 600;
1415
+ margin-bottom: 0.5rem;
1416
+ color: var(--text-primary);
1417
+ }
1418
+
1419
+ .structure-description {
1420
+ color: var(--text-secondary);
1421
+ margin-bottom: 1rem;
1422
+ line-height: 1.6;
1423
+ }
1424
+
1425
+ .structure-path {
1426
+ display: inline-block;
1427
+ padding: 0.25rem 0.75rem;
1428
+ background: var(--code-bg);
1429
+ border-radius: 4px;
1430
+ font-family: var(--font-mono);
1431
+ font-size: 0.875rem;
1432
+ color: var(--code-color);
1433
+ border: 1px solid var(--border);
1434
+ }
1435
+
1436
+ .quickstart-grid {
1437
+ display: flex;
1438
+ flex-direction: column;
1439
+ gap: 2rem;
1440
+ margin-top: 2rem;
1441
+ max-width: 900px;
1442
+ margin-left: auto;
1443
+ margin-right: auto;
1444
+ }
1445
+
1446
+ .quickstart-step {
1447
+ position: relative;
1448
+ padding: 2rem 1.5rem;
1449
+ background: var(--card-bg);
1450
+ color: var(--text-primary);
1451
+ border-radius: 8px;
1452
+ border: 1px solid var(--border);
1453
+ }
1454
+
1455
+ .step-number {
1456
+ position: absolute;
1457
+ top: -1rem;
1458
+ left: 1.5rem;
1459
+ width: 2.5rem;
1460
+ height: 2.5rem;
1461
+ display: flex;
1462
+ align-items: center;
1463
+ justify-content: center;
1464
+ background: var(--primary);
1465
+ color: white;
1466
+ border-radius: 50%;
1467
+ font-weight: 700;
1468
+ font-size: 1.25rem;
1469
+ box-shadow: 0 4px 12px rgba(99, 102, 241, 0.4);
1470
+ }
1471
+
1472
+ .step-title {
1473
+ font-size: 1.125rem;
1474
+ font-weight: 600;
1475
+ margin-bottom: 0.75rem;
1476
+ color: var(--text-primary);
1477
+ }
1478
+
1479
+ .step-description {
1480
+ color: var(--text-secondary);
1481
+ line-height: 1.6;
1482
+ margin-bottom: 1rem;
1483
+ }
1484
+
1485
+ .code-snippet {
1486
+ background: var(--code-bg);
1487
+ color: var(--code-color);
1488
+ padding: 1rem;
1489
+ border-radius: 6px;
1490
+ overflow-x: auto;
1491
+ font-family: var(--font-mono);
1492
+ font-size: 0.875rem;
1493
+ line-height: 1.5;
1494
+ border: 1px solid var(--border);
1495
+ }
1496
+
1497
+ .code-snippet code {
1498
+ background: none;
1499
+ padding: 0;
1500
+ color: inherit;
1501
+ }
1502
+
1503
+ .features-list {
1504
+ display: flex;
1505
+ flex-direction: column;
1506
+ gap: 1.5rem;
1507
+ margin-top: 2rem;
1508
+ }
1509
+
1510
+ .feature-item {
1511
+ display: flex;
1512
+ gap: 1.5rem;
1513
+ padding: 1.5rem;
1514
+ background: var(--card-bg);
1515
+ color: var(--text-primary);
1516
+ border-radius: 8px;
1517
+ border: 1px solid var(--border);
1518
+ transition:
1519
+ transform 0.2s,
1520
+ box-shadow 0.2s,
1521
+ border-color 0.2s;
1522
+ }
1523
+
1524
+ .feature-item:hover {
1525
+ transform: translateY(-2px);
1526
+ box-shadow: 0 8px 24px rgba(99, 102, 241, 0.2);
1527
+ border-color: var(--primary);
1528
+ }
1529
+
1530
+ .feature-item .feature-icon {
1531
+ font-size: 2rem;
1532
+ flex-shrink: 0;
1533
+ }
1534
+
1535
+ .feature-content h3 {
1536
+ font-size: 1.125rem;
1537
+ font-weight: 600;
1538
+ margin-bottom: 0.5rem;
1539
+ color: var(--text-primary);
1540
+ }
1541
+
1542
+ .feature-content p {
1543
+ color: var(--text-secondary);
1544
+ line-height: 1.6;
1545
+ }
1546
+
1547
+ .feature-content code {
1548
+ background: var(--code-bg);
1549
+ padding: 0.125rem 0.375rem;
1550
+ border-radius: 3px;
1551
+ font-family: var(--font-mono);
1552
+ font-size: 0.875rem;
1553
+ color: var(--code-color);
1554
+ border: 1px solid var(--border);
1555
+ }
1556
+
1557
+ .resources {
1558
+ background: var(--bg-secondary);
1559
+ color: var(--text-primary);
1560
+ padding: 4rem 0;
1561
+ border-top: 1px solid var(--border);
1562
+ }
1563
+
1564
+ .resources-grid {
1565
+ display: grid;
1566
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
1567
+ gap: 2rem;
1568
+ margin-top: 2rem;
1569
+ }
1570
+
1571
+ .resource-card {
1572
+ display: block;
1573
+ padding: 2rem;
1574
+ background: var(--bg-primary);
1575
+ color: var(--text-primary);
1576
+ border-radius: 8px;
1577
+ border: 1px solid var(--border);
1578
+ text-decoration: none;
1579
+ transition:
1580
+ transform 0.2s,
1581
+ box-shadow 0.2s,
1582
+ border-color 0.2s;
1583
+ }
1584
+
1585
+ .resource-card:hover {
1586
+ transform: translateY(-4px);
1587
+ box-shadow: 0 8px 24px rgba(99, 102, 241, 0.3);
1588
+ border-color: var(--primary);
1589
+ }
1590
+
1591
+ .resource-icon {
1592
+ font-size: 3rem;
1593
+ margin-bottom: 1rem;
1594
+ }
1595
+
1596
+ .resource-card h3 {
1597
+ font-size: 1.25rem;
1598
+ font-weight: 600;
1599
+ margin-bottom: 0.5rem;
1600
+ color: var(--text-primary);
1601
+ }
1602
+
1603
+ .resource-card p {
1604
+ color: var(--text-secondary);
1605
+ line-height: 1.6;
1606
+ }
1607
+
1608
+ .next-steps {
1609
+ margin-top: 3rem;
1610
+ padding: 2rem;
1611
+ background: var(--bg-primary);
1612
+ border-radius: 8px;
1613
+ border: 1px solid var(--border);
1614
+ text-align: center;
1615
+ }
1616
+
1617
+ .next-steps h3 {
1618
+ font-size: 1.5rem;
1619
+ font-weight: 600;
1620
+ margin-bottom: 1rem;
1621
+ color: var(--text-primary);
1622
+ }
1623
+
1624
+ .next-steps p {
1625
+ color: var(--text-secondary);
1626
+ line-height: 1.8;
1627
+ margin-bottom: 0.5rem;
1628
+ }
1629
+
1630
+ .next-steps code {
1631
+ background: var(--code-bg);
1632
+ padding: 0.125rem 0.5rem;
1633
+ border-radius: 3px;
1634
+ font-family: var(--font-mono);
1635
+ font-size: 0.875rem;
1636
+ color: var(--code-color);
1637
+ border: 1px solid var(--border);
1638
+ }
1639
+
1640
+ .next-steps a {
1641
+ color: var(--primary);
1642
+ text-decoration: none;
1643
+ font-weight: 500;
1644
+ }
1645
+
1646
+ .next-steps a:hover {
1647
+ color: var(--primary-light);
1648
+ text-decoration: underline;
1649
+ }
1650
+
1651
+ .section-description {
1652
+ text-align: center;
1653
+ color: var(--text-secondary);
1654
+ font-size: 1.125rem;
1655
+ margin-top: 0.5rem;
1656
+ max-width: 600px;
1657
+ margin-left: auto;
1658
+ margin-right: auto;
1659
+ }
1660
+
1661
+ /* Page Hero (for About and Docs pages) */
1662
+ .page-hero {
1663
+ text-align: center;
1664
+ padding: 3rem 0 2rem;
1665
+ border-bottom: 1px solid var(--border);
1666
+ margin-bottom: 3rem;
1667
+ }
1668
+
1669
+ .page-hero h1 {
1670
+ font-size: 2.5rem;
1671
+ margin-bottom: 1rem;
1672
+ }
1673
+
1674
+ .page-hero .lead {
1675
+ font-size: 1.25rem;
1676
+ color: var(--text-secondary);
1677
+ max-width: 700px;
1678
+ margin: 0 auto;
1679
+ }
1680
+
1681
+ /* Content Sections */
1682
+ .content-section {
1683
+ margin-bottom: 3rem;
1684
+ }
1685
+
1686
+ .content-section h2 {
1687
+ font-size: 2rem;
1688
+ margin-bottom: 1.5rem;
1689
+ color: var(--text-primary);
1690
+ }
1691
+
1692
+ .content-section p {
1693
+ font-size: 1.125rem;
1694
+ line-height: 1.8;
1695
+ color: var(--text-secondary);
1696
+ margin-bottom: 1.5rem;
1697
+ }
1698
+
1699
+ .content-section code {
1700
+ background: var(--code-bg);
1701
+ padding: 0.125rem 0.5rem;
1702
+ border-radius: 3px;
1703
+ font-family: var(--font-mono);
1704
+ font-size: 0.875rem;
1705
+ color: var(--code-color);
1706
+ border: 1px solid var(--border);
1707
+ }
1708
+
1709
+ /* Component Grid */
1710
+ .component-grid {
1711
+ display: grid;
1712
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
1713
+ gap: 1.5rem;
1714
+ margin-top: 2rem;
1715
+ }
1716
+
1717
+ .component-card {
1718
+ padding: 1.5rem;
1719
+ background: var(--card-bg);
1720
+ border-radius: 8px;
1721
+ border: 1px solid var(--border);
1722
+ transition:
1723
+ transform 0.2s,
1724
+ border-color 0.2s;
1725
+ }
1726
+
1727
+ .component-card:hover {
1728
+ transform: translateY(-2px);
1729
+ border-color: var(--primary);
1730
+ }
1731
+
1732
+ .component-card h3 {
1733
+ font-size: 1.25rem;
1734
+ margin-bottom: 0.75rem;
1735
+ color: var(--text-primary);
1736
+ }
1737
+
1738
+ .component-card p {
1739
+ color: var(--text-secondary);
1740
+ line-height: 1.6;
1741
+ margin: 0;
1742
+ }
1743
+
1744
+ /* Links Grid */
1745
+ .links-grid {
1746
+ display: grid;
1747
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
1748
+ gap: 1.5rem;
1749
+ margin-top: 2rem;
1750
+ }
1751
+
1752
+ .link-card {
1753
+ display: block;
1754
+ padding: 2rem;
1755
+ background: var(--card-bg);
1756
+ border-radius: 8px;
1757
+ border: 1px solid var(--border);
1758
+ text-decoration: none;
1759
+ color: inherit;
1760
+ transition:
1761
+ transform 0.2s,
1762
+ border-color 0.2s,
1763
+ box-shadow 0.2s;
1764
+ }
1765
+
1766
+ .link-card:hover {
1767
+ transform: translateY(-4px);
1768
+ border-color: var(--primary);
1769
+ box-shadow: 0 8px 24px rgba(99, 102, 241, 0.3);
1770
+ }
1771
+
1772
+ .link-card h3 {
1773
+ font-size: 1.25rem;
1774
+ margin-bottom: 0.5rem;
1775
+ color: var(--text-primary);
1776
+ }
1777
+
1778
+ .link-card p {
1779
+ color: var(--text-secondary);
1780
+ margin: 0;
1781
+ }
1782
+
1783
+ /* Example Sections */
1784
+ .example-section {
1785
+ margin-bottom: 4rem;
1786
+ }
1787
+
1788
+ .example-section h2 {
1789
+ font-size: 2rem;
1790
+ margin-bottom: 1rem;
1791
+ color: var(--text-primary);
1792
+ }
1793
+
1794
+ .example-section > p {
1795
+ font-size: 1.125rem;
1796
+ color: var(--text-secondary);
1797
+ margin-bottom: 2rem;
1798
+ }
1799
+
1800
+ .code-example {
1801
+ margin-bottom: 2rem;
1802
+ }
1803
+
1804
+ .code-example h3 {
1805
+ font-size: 1rem;
1806
+ font-weight: 600;
1807
+ color: var(--text-secondary);
1808
+ margin-bottom: 0.5rem;
1809
+ text-transform: uppercase;
1810
+ letter-spacing: 0.05em;
1811
+ }
1812
+
1813
+ .code-example .code-block {
1814
+ background: var(--code-bg);
1815
+ border: 1px solid var(--border);
1816
+ border-radius: 8px;
1817
+ padding: 1.5rem;
1818
+ overflow-x: auto;
1819
+ }
1820
+
1821
+ .code-example .code-block code {
1822
+ font-family: var(--font-mono);
1823
+ font-size: 0.875rem;
1824
+ line-height: 1.6;
1825
+ color: var(--code-color);
1826
+ background: none;
1827
+ border: none;
1828
+ padding: 0;
1829
+ }
1830
+
1831
+ .code-example .code-block pre {
1832
+ margin: 0;
1833
+ white-space: pre-wrap;
1834
+ word-wrap: break-word;
1835
+ }