@zekidev/ui 2.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 (135) hide show
  1. package/dist/components/theme-provider.d.ts +12 -0
  2. package/dist/components/ui/accordion.d.ts +7 -0
  3. package/dist/components/ui/badge.d.ts +9 -0
  4. package/dist/components/ui/button.d.ts +11 -0
  5. package/dist/components/ui/calendar.d.ts +4 -0
  6. package/dist/components/ui/card.d.ts +8 -0
  7. package/dist/components/ui/date-picker.d.ts +12 -0
  8. package/dist/components/ui/popover.d.ts +7 -0
  9. package/dist/components/ui/separator.d.ts +4 -0
  10. package/dist/components/ui/tabs.d.ts +7 -0
  11. package/dist/index.cjs +6141 -0
  12. package/dist/index.d.ts +61 -0
  13. package/dist/index.js +5980 -0
  14. package/dist/lib/utils.d.ts +2 -0
  15. package/dist/sections/banner/index.d.ts +5 -0
  16. package/dist/sections/banner/variants/banner-dismissible.d.ts +2 -0
  17. package/dist/sections/banner/variants/banner-simple.d.ts +2 -0
  18. package/dist/sections/cards/index.d.ts +7 -0
  19. package/dist/sections/cards/variants/cards-featured.d.ts +2 -0
  20. package/dist/sections/cards/variants/cards-grid.d.ts +2 -0
  21. package/dist/sections/cards/variants/cards-horizontal.d.ts +2 -0
  22. package/dist/sections/cards/variants/cards-pricing.d.ts +2 -0
  23. package/dist/sections/comparison/index.d.ts +6 -0
  24. package/dist/sections/comparison/variants/comparison-cards.d.ts +2 -0
  25. package/dist/sections/comparison/variants/comparison-highlights.d.ts +2 -0
  26. package/dist/sections/comparison/variants/comparison-table.d.ts +2 -0
  27. package/dist/sections/contact/index.d.ts +5 -0
  28. package/dist/sections/contact/variants/contact-simple.d.ts +2 -0
  29. package/dist/sections/contact/variants/contact-split.d.ts +2 -0
  30. package/dist/sections/cta/index.d.ts +6 -0
  31. package/dist/sections/cta/variants/cta-banner.d.ts +2 -0
  32. package/dist/sections/cta/variants/cta-centered.d.ts +2 -0
  33. package/dist/sections/cta/variants/cta-split.d.ts +2 -0
  34. package/dist/sections/downloads/index.d.ts +6 -0
  35. package/dist/sections/downloads/variants/downloads-accordion.d.ts +2 -0
  36. package/dist/sections/downloads/variants/downloads-flat.d.ts +2 -0
  37. package/dist/sections/downloads/variants/downloads-grouped.d.ts +2 -0
  38. package/dist/sections/downloads/variants/downloads-utils.d.ts +10 -0
  39. package/dist/sections/downloads/variants/file-row.d.ts +6 -0
  40. package/dist/sections/duplex/index.d.ts +6 -0
  41. package/dist/sections/duplex/variants/duplex-image-left.d.ts +2 -0
  42. package/dist/sections/duplex/variants/duplex-image-right.d.ts +2 -0
  43. package/dist/sections/duplex/variants/duplex-stacked.d.ts +2 -0
  44. package/dist/sections/event-registration/event-registration-section.d.ts +2 -0
  45. package/dist/sections/event-registration/index.d.ts +4 -0
  46. package/dist/sections/event-registration/registration-form.d.ts +11 -0
  47. package/dist/sections/event-registration/variants/registration-card.d.ts +2 -0
  48. package/dist/sections/event-registration/variants/registration-centered.d.ts +2 -0
  49. package/dist/sections/event-registration/variants/registration-split.d.ts +2 -0
  50. package/dist/sections/faq/index.d.ts +7 -0
  51. package/dist/sections/faq/variants/faq-accordion.d.ts +2 -0
  52. package/dist/sections/faq/variants/faq-cards.d.ts +2 -0
  53. package/dist/sections/faq/variants/faq-numbered.d.ts +2 -0
  54. package/dist/sections/faq/variants/faq-two-column.d.ts +2 -0
  55. package/dist/sections/features/index.d.ts +6 -0
  56. package/dist/sections/features/variants/features-alternating.d.ts +2 -0
  57. package/dist/sections/features/variants/features-bento.d.ts +2 -0
  58. package/dist/sections/features/variants/features-grid.d.ts +2 -0
  59. package/dist/sections/gallery/index.d.ts +6 -0
  60. package/dist/sections/gallery/shared/lightbox-overlay.d.ts +9 -0
  61. package/dist/sections/gallery/variants/gallery-carousel.d.ts +2 -0
  62. package/dist/sections/gallery/variants/gallery-grid.d.ts +2 -0
  63. package/dist/sections/gallery/variants/gallery-mosaic.d.ts +2 -0
  64. package/dist/sections/hero/index.d.ts +10 -0
  65. package/dist/sections/hero/variants/hero-background.d.ts +2 -0
  66. package/dist/sections/hero/variants/hero-card.d.ts +2 -0
  67. package/dist/sections/hero/variants/hero-centered.d.ts +2 -0
  68. package/dist/sections/hero/variants/hero-left.d.ts +2 -0
  69. package/dist/sections/hero/variants/hero-minimal.d.ts +2 -0
  70. package/dist/sections/hero/variants/hero-split.d.ts +2 -0
  71. package/dist/sections/hero/variants/hero-video.d.ts +2 -0
  72. package/dist/sections/iframe/index.d.ts +6 -0
  73. package/dist/sections/iframe/variants/iframe-card.d.ts +2 -0
  74. package/dist/sections/iframe/variants/iframe-responsive.d.ts +2 -0
  75. package/dist/sections/iframe/variants/iframe-simple.d.ts +2 -0
  76. package/dist/sections/kpis/index.d.ts +7 -0
  77. package/dist/sections/kpis/variants/kpis-bars.d.ts +2 -0
  78. package/dist/sections/kpis/variants/kpis-cards.d.ts +2 -0
  79. package/dist/sections/kpis/variants/kpis-counters.d.ts +2 -0
  80. package/dist/sections/kpis/variants/kpis-minimal.d.ts +2 -0
  81. package/dist/sections/logos/index.d.ts +6 -0
  82. package/dist/sections/logos/variants/logos-cloud.d.ts +2 -0
  83. package/dist/sections/logos/variants/logos-grid.d.ts +2 -0
  84. package/dist/sections/logos/variants/logos-marquee.d.ts +2 -0
  85. package/dist/sections/map/index.d.ts +6 -0
  86. package/dist/sections/map/leaflet-map-inner.d.ts +9 -0
  87. package/dist/sections/map/leaflet-map.d.ts +8 -0
  88. package/dist/sections/map/variants/map-listing.d.ts +2 -0
  89. package/dist/sections/map/variants/map-pins.d.ts +2 -0
  90. package/dist/sections/map/variants/map-split.d.ts +2 -0
  91. package/dist/sections/newsletter/index.d.ts +4 -0
  92. package/dist/sections/newsletter/newsletter-form.d.ts +10 -0
  93. package/dist/sections/newsletter/newsletter-section.d.ts +2 -0
  94. package/dist/sections/newsletter/variants/newsletter-card.d.ts +2 -0
  95. package/dist/sections/newsletter/variants/newsletter-centered.d.ts +2 -0
  96. package/dist/sections/newsletter/variants/newsletter-inline.d.ts +2 -0
  97. package/dist/sections/richtext/index.d.ts +6 -0
  98. package/dist/sections/richtext/portable-text-components.d.ts +2 -0
  99. package/dist/sections/richtext/variants/richtext-centered.d.ts +2 -0
  100. package/dist/sections/richtext/variants/richtext-two-column.d.ts +2 -0
  101. package/dist/sections/richtext/variants/richtext-wide.d.ts +2 -0
  102. package/dist/sections/scrollable/index.d.ts +7 -0
  103. package/dist/sections/scrollable/variants/scrollable-horizontal.d.ts +2 -0
  104. package/dist/sections/scrollable/variants/scrollable-marquee.d.ts +2 -0
  105. package/dist/sections/scrollable/variants/scrollable-parallax.d.ts +2 -0
  106. package/dist/sections/scrollable/variants/scrollable-timeline.d.ts +2 -0
  107. package/dist/sections/shared/dynamic-icon.d.ts +6 -0
  108. package/dist/sections/shared/section-header.d.ts +12 -0
  109. package/dist/sections/steps/index.d.ts +6 -0
  110. package/dist/sections/steps/variants/steps-horizontal.d.ts +2 -0
  111. package/dist/sections/steps/variants/steps-numbered.d.ts +2 -0
  112. package/dist/sections/steps/variants/steps-with-image.d.ts +2 -0
  113. package/dist/sections/tabs/index.d.ts +7 -0
  114. package/dist/sections/tabs/variants/tabs-pills.d.ts +2 -0
  115. package/dist/sections/tabs/variants/tabs-standard.d.ts +2 -0
  116. package/dist/sections/tabs/variants/tabs-underline.d.ts +2 -0
  117. package/dist/sections/tabs/variants/tabs-vertical.d.ts +2 -0
  118. package/dist/sections/team/index.d.ts +6 -0
  119. package/dist/sections/team/variants/team-cards.d.ts +2 -0
  120. package/dist/sections/team/variants/team-grid.d.ts +2 -0
  121. package/dist/sections/team/variants/team-minimal.d.ts +2 -0
  122. package/dist/sections/testimonials/index.d.ts +6 -0
  123. package/dist/sections/testimonials/variants/testimonials-carousel.d.ts +2 -0
  124. package/dist/sections/testimonials/variants/testimonials-featured.d.ts +2 -0
  125. package/dist/sections/testimonials/variants/testimonials-grid.d.ts +2 -0
  126. package/dist/sections/video/index.d.ts +6 -0
  127. package/dist/sections/video/variants/video-contained.d.ts +2 -0
  128. package/dist/sections/video/variants/video-full.d.ts +2 -0
  129. package/dist/sections/video/variants/video-with-text.d.ts +2 -0
  130. package/dist/sections/video/video-player.d.ts +11 -0
  131. package/dist/sections/video/video-utils.d.ts +6 -0
  132. package/dist/types/index.d.ts +440 -0
  133. package/package.json +67 -0
  134. package/src/styles/globals.css +448 -0
  135. package/tailwind.config.ts +122 -0
@@ -0,0 +1,448 @@
1
+ /* ─────────────────────────────────────────────────────────────
2
+ Landing Builder — Design tokens
3
+ Import this file in your app's global CSS AFTER the tailwind
4
+ directives, e.g.:
5
+ @tailwind base; @tailwind components; @tailwind utilities;
6
+ @import "@landing-builder/ui/styles";
7
+ ───────────────────────────────────────────────────────────── */
8
+
9
+ :root {
10
+ --radius: 0.5rem;
11
+
12
+ /* ── Semantic colors (palette-independent) ── */
13
+ --success: 142 71% 45%;
14
+ --success-foreground: 0 0% 100%;
15
+ --info: 199 89% 48%;
16
+ --info-foreground: 0 0% 100%;
17
+ --warning: 38 92% 50%;
18
+ --warning-foreground: 20 14% 4%;
19
+ --error: 0 84% 60%;
20
+ --error-foreground: 0 0% 100%;
21
+ }
22
+
23
+ .dark {
24
+ --success: 142 71% 50%;
25
+ --info: 199 89% 55%;
26
+ --warning: 38 92% 55%;
27
+ --error: 0 84% 65%;
28
+ }
29
+
30
+ /* ── Semantic utility classes ──────────────────────────────────
31
+ Defined explicitly here so they work regardless of whether
32
+ Tailwind's JIT scanner detects them in component files.
33
+ These mirror the Tailwind color tokens defined in tailwind.config.ts.
34
+ ────────────────────────────────────────────────────────────── */
35
+ .bg-success { background-color: hsl(var(--success)); }
36
+ .bg-info { background-color: hsl(var(--info)); }
37
+ .bg-warning { background-color: hsl(var(--warning)); }
38
+ .bg-error { background-color: hsl(var(--error)); }
39
+
40
+ .text-success-foreground { color: hsl(var(--success-foreground)); }
41
+ .text-info-foreground { color: hsl(var(--info-foreground)); }
42
+ .text-warning-foreground { color: hsl(var(--warning-foreground)); }
43
+ .text-error-foreground { color: hsl(var(--error-foreground)); }
44
+
45
+ /* hover variants for buttons */
46
+ .hover\:bg-success\/90:hover { background-color: hsl(var(--success) / 0.9); }
47
+ .hover\:bg-info\/90:hover { background-color: hsl(var(--info) / 0.9); }
48
+ .hover\:bg-warning\/90:hover { background-color: hsl(var(--warning) / 0.9); }
49
+ .hover\:bg-error\/90:hover { background-color: hsl(var(--error) / 0.9); }
50
+
51
+ /* ───────────────────────────────────────────
52
+ PALETTE: default (blue/slate)
53
+ ─────────────────────────────────────────── */
54
+ [data-palette="default"],
55
+ :root:not([data-palette]) {
56
+ --background: 0 0% 100%;
57
+ --foreground: 222.2 84% 4.9%;
58
+ --card: 0 0% 100%;
59
+ --card-foreground: 222.2 84% 4.9%;
60
+ --popover: 0 0% 100%;
61
+ --popover-foreground: 222.2 84% 4.9%;
62
+ --primary: 221.2 83.2% 53.3%;
63
+ --primary-foreground: 210 40% 98%;
64
+ --secondary: 210 40% 96.1%;
65
+ --secondary-foreground: 222.2 47.4% 11.2%;
66
+ --muted: 210 40% 96.1%;
67
+ --muted-foreground: 215.4 16.3% 46.9%;
68
+ --accent: 210 40% 96.1%;
69
+ --accent-foreground: 222.2 47.4% 11.2%;
70
+ --destructive: 0 84.2% 60.2%;
71
+ --destructive-foreground: 210 40% 98%;
72
+ --border: 214.3 31.8% 91.4%;
73
+ --input: 214.3 31.8% 91.4%;
74
+ --ring: 221.2 83.2% 53.3%;
75
+ }
76
+ .dark [data-palette="default"],
77
+ .dark:not([data-palette]) {
78
+ --background: 222.2 84% 4.9%;
79
+ --foreground: 210 40% 98%;
80
+ --card: 222.2 84% 4.9%;
81
+ --card-foreground: 210 40% 98%;
82
+ --popover: 222.2 84% 4.9%;
83
+ --popover-foreground: 210 40% 98%;
84
+ --primary: 217.2 91.2% 59.8%;
85
+ --primary-foreground: 222.2 47.4% 11.2%;
86
+ --secondary: 217.2 32.6% 17.5%;
87
+ --secondary-foreground: 210 40% 98%;
88
+ --muted: 217.2 32.6% 17.5%;
89
+ --muted-foreground: 215 20.2% 65.1%;
90
+ --accent: 217.2 32.6% 17.5%;
91
+ --accent-foreground: 210 40% 98%;
92
+ --destructive: 0 62.8% 30.6%;
93
+ --destructive-foreground: 210 40% 98%;
94
+ --border: 217.2 32.6% 17.5%;
95
+ --input: 217.2 32.6% 17.5%;
96
+ --ring: 224.3 76.3% 48%;
97
+ }
98
+
99
+ /* ── rose ── */
100
+ [data-palette="rose"] {
101
+ --background: 0 0% 100%;
102
+ --foreground: 240 10% 3.9%;
103
+ --card: 0 0% 100%;
104
+ --card-foreground: 240 10% 3.9%;
105
+ --popover: 0 0% 100%;
106
+ --popover-foreground: 240 10% 3.9%;
107
+ --primary: 346.8 77.2% 49.8%;
108
+ --primary-foreground: 355.7 100% 97.3%;
109
+ --secondary: 240 4.8% 95.9%;
110
+ --secondary-foreground: 240 5.9% 10%;
111
+ --muted: 240 4.8% 95.9%;
112
+ --muted-foreground: 240 3.8% 46.1%;
113
+ --accent: 240 4.8% 95.9%;
114
+ --accent-foreground: 240 5.9% 10%;
115
+ --destructive: 0 84.2% 60.2%;
116
+ --destructive-foreground: 0 0% 98%;
117
+ --border: 240 5.9% 90%;
118
+ --input: 240 5.9% 90%;
119
+ --ring: 346.8 77.2% 49.8%;
120
+ }
121
+ .dark [data-palette="rose"] {
122
+ --background: 20 14.3% 4.1%;
123
+ --foreground: 0 0% 95%;
124
+ --card: 24 9.8% 10%;
125
+ --card-foreground: 0 0% 95%;
126
+ --popover: 0 0% 9%;
127
+ --popover-foreground: 0 0% 95%;
128
+ --primary: 346.8 77.2% 49.8%;
129
+ --primary-foreground: 355.7 100% 97.3%;
130
+ --secondary: 240 3.7% 15.9%;
131
+ --secondary-foreground: 0 0% 98%;
132
+ --muted: 0 0% 15%;
133
+ --muted-foreground: 240 5% 64.9%;
134
+ --accent: 12 6.5% 15.1%;
135
+ --accent-foreground: 0 0% 98%;
136
+ --destructive: 0 62.8% 30.6%;
137
+ --destructive-foreground: 0 85.7% 97.3%;
138
+ --border: 240 3.7% 15.9%;
139
+ --input: 240 3.7% 15.9%;
140
+ --ring: 346.8 77.2% 49.8%;
141
+ }
142
+
143
+ /* ── orange ── */
144
+ [data-palette="orange"] {
145
+ --background: 0 0% 100%;
146
+ --foreground: 20 14.3% 4.1%;
147
+ --card: 0 0% 100%;
148
+ --card-foreground: 20 14.3% 4.1%;
149
+ --popover: 0 0% 100%;
150
+ --popover-foreground: 20 14.3% 4.1%;
151
+ --primary: 24.6 95% 53.1%;
152
+ --primary-foreground: 60 9.1% 97.8%;
153
+ --secondary: 60 4.8% 95.9%;
154
+ --secondary-foreground: 24 9.8% 10%;
155
+ --muted: 60 4.8% 95.9%;
156
+ --muted-foreground: 25 5.3% 44.7%;
157
+ --accent: 60 4.8% 95.9%;
158
+ --accent-foreground: 24 9.8% 10%;
159
+ --destructive: 0 84.2% 60.2%;
160
+ --destructive-foreground: 60 9.1% 97.8%;
161
+ --border: 20 5.9% 90%;
162
+ --input: 20 5.9% 90%;
163
+ --ring: 24.6 95% 53.1%;
164
+ }
165
+ .dark [data-palette="orange"] {
166
+ --background: 20 14.3% 4.1%;
167
+ --foreground: 60 9.1% 97.8%;
168
+ --card: 20 14.3% 4.1%;
169
+ --card-foreground: 60 9.1% 97.8%;
170
+ --popover: 20 14.3% 4.1%;
171
+ --popover-foreground: 60 9.1% 97.8%;
172
+ --primary: 20.5 90.2% 48.2%;
173
+ --primary-foreground: 60 9.1% 97.8%;
174
+ --secondary: 12 6.5% 15.1%;
175
+ --secondary-foreground: 60 9.1% 97.8%;
176
+ --muted: 12 6.5% 15.1%;
177
+ --muted-foreground: 24 5.4% 63.9%;
178
+ --accent: 12 6.5% 15.1%;
179
+ --accent-foreground: 60 9.1% 97.8%;
180
+ --destructive: 0 72.2% 50.6%;
181
+ --destructive-foreground: 60 9.1% 97.8%;
182
+ --border: 12 6.5% 15.1%;
183
+ --input: 12 6.5% 15.1%;
184
+ --ring: 20.5 90.2% 48.2%;
185
+ }
186
+
187
+ /* ── green ── */
188
+ [data-palette="green"] {
189
+ --background: 0 0% 100%;
190
+ --foreground: 240 10% 3.9%;
191
+ --card: 0 0% 100%;
192
+ --card-foreground: 240 10% 3.9%;
193
+ --popover: 0 0% 100%;
194
+ --popover-foreground: 240 10% 3.9%;
195
+ --primary: 142.1 76.2% 36.3%;
196
+ --primary-foreground: 355.7 100% 97.3%;
197
+ --secondary: 240 4.8% 95.9%;
198
+ --secondary-foreground: 240 5.9% 10%;
199
+ --muted: 240 4.8% 95.9%;
200
+ --muted-foreground: 240 3.8% 46.1%;
201
+ --accent: 240 4.8% 95.9%;
202
+ --accent-foreground: 240 5.9% 10%;
203
+ --destructive: 0 84.2% 60.2%;
204
+ --destructive-foreground: 0 0% 98%;
205
+ --border: 240 5.9% 90%;
206
+ --input: 240 5.9% 90%;
207
+ --ring: 142.1 76.2% 36.3%;
208
+ }
209
+ .dark [data-palette="green"] {
210
+ --background: 20 14.3% 4.1%;
211
+ --foreground: 0 0% 95%;
212
+ --card: 24 9.8% 10%;
213
+ --card-foreground: 0 0% 95%;
214
+ --popover: 0 0% 9%;
215
+ --popover-foreground: 0 0% 95%;
216
+ --primary: 142.1 70.6% 45.3%;
217
+ --primary-foreground: 144.9 80.4% 10%;
218
+ --secondary: 240 3.7% 15.9%;
219
+ --secondary-foreground: 0 0% 98%;
220
+ --muted: 0 0% 15%;
221
+ --muted-foreground: 240 5% 64.9%;
222
+ --accent: 12 6.5% 15.1%;
223
+ --accent-foreground: 0 0% 98%;
224
+ --destructive: 0 62.8% 30.6%;
225
+ --destructive-foreground: 0 85.7% 97.3%;
226
+ --border: 240 3.7% 15.9%;
227
+ --input: 240 3.7% 15.9%;
228
+ --ring: 142.4 71.8% 29.2%;
229
+ }
230
+
231
+ /* ── violet ── */
232
+ [data-palette="violet"] {
233
+ --background: 0 0% 100%;
234
+ --foreground: 224 71.4% 4.1%;
235
+ --card: 0 0% 100%;
236
+ --card-foreground: 224 71.4% 4.1%;
237
+ --popover: 0 0% 100%;
238
+ --popover-foreground: 224 71.4% 4.1%;
239
+ --primary: 262.1 83.3% 57.8%;
240
+ --primary-foreground: 210 20% 98%;
241
+ --secondary: 220 14.3% 95.9%;
242
+ --secondary-foreground: 220.9 39.3% 11%;
243
+ --muted: 220 14.3% 95.9%;
244
+ --muted-foreground: 220 8.9% 46.1%;
245
+ --accent: 220 14.3% 95.9%;
246
+ --accent-foreground: 220.9 39.3% 11%;
247
+ --destructive: 0 84.2% 60.2%;
248
+ --destructive-foreground: 210 20% 98%;
249
+ --border: 220 13% 91%;
250
+ --input: 220 13% 91%;
251
+ --ring: 262.1 83.3% 57.8%;
252
+ }
253
+ .dark [data-palette="violet"] {
254
+ --background: 224 71.4% 4.1%;
255
+ --foreground: 210 20% 98%;
256
+ --card: 224 71.4% 4.1%;
257
+ --card-foreground: 210 20% 98%;
258
+ --popover: 224 71.4% 4.1%;
259
+ --popover-foreground: 210 20% 98%;
260
+ --primary: 263.4 70% 50.4%;
261
+ --primary-foreground: 210 20% 98%;
262
+ --secondary: 215 27.9% 16.9%;
263
+ --secondary-foreground: 210 20% 98%;
264
+ --muted: 215 27.9% 16.9%;
265
+ --muted-foreground: 217.9 10.6% 64.9%;
266
+ --accent: 215 27.9% 16.9%;
267
+ --accent-foreground: 210 20% 98%;
268
+ --destructive: 0 62.8% 30.6%;
269
+ --destructive-foreground: 210 20% 98%;
270
+ --border: 215 27.9% 16.9%;
271
+ --input: 215 27.9% 16.9%;
272
+ --ring: 263.4 70% 50.4%;
273
+ }
274
+
275
+ /* ── teal ── */
276
+ [data-palette="teal"] {
277
+ --background: 0 0% 100%;
278
+ --foreground: 222.2 84% 4.9%;
279
+ --card: 0 0% 100%;
280
+ --card-foreground: 222.2 84% 4.9%;
281
+ --popover: 0 0% 100%;
282
+ --popover-foreground: 222.2 84% 4.9%;
283
+ --primary: 173 80% 36%;
284
+ --primary-foreground: 210 40% 98%;
285
+ --secondary: 210 40% 96.1%;
286
+ --secondary-foreground: 222.2 47.4% 11.2%;
287
+ --muted: 210 40% 96.1%;
288
+ --muted-foreground: 215.4 16.3% 46.9%;
289
+ --accent: 210 40% 96.1%;
290
+ --accent-foreground: 222.2 47.4% 11.2%;
291
+ --destructive: 0 84.2% 60.2%;
292
+ --destructive-foreground: 210 40% 98%;
293
+ --border: 214.3 31.8% 91.4%;
294
+ --input: 214.3 31.8% 91.4%;
295
+ --ring: 173 80% 36%;
296
+ }
297
+ .dark [data-palette="teal"] {
298
+ --background: 222.2 84% 4.9%;
299
+ --foreground: 210 40% 98%;
300
+ --card: 222.2 84% 4.9%;
301
+ --card-foreground: 210 40% 98%;
302
+ --popover: 222.2 84% 4.9%;
303
+ --popover-foreground: 210 40% 98%;
304
+ --primary: 173 80% 44%;
305
+ --primary-foreground: 222.2 47.4% 11.2%;
306
+ --secondary: 217.2 32.6% 17.5%;
307
+ --secondary-foreground: 210 40% 98%;
308
+ --muted: 217.2 32.6% 17.5%;
309
+ --muted-foreground: 215 20.2% 65.1%;
310
+ --accent: 217.2 32.6% 17.5%;
311
+ --accent-foreground: 210 40% 98%;
312
+ --destructive: 0 62.8% 30.6%;
313
+ --destructive-foreground: 210 40% 98%;
314
+ --border: 217.2 32.6% 17.5%;
315
+ --input: 217.2 32.6% 17.5%;
316
+ --ring: 173 80% 36%;
317
+ }
318
+
319
+ /* ── yellow ── */
320
+ [data-palette="yellow"] {
321
+ --background: 0 0% 100%;
322
+ --foreground: 20 14.3% 4.1%;
323
+ --card: 0 0% 100%;
324
+ --card-foreground: 20 14.3% 4.1%;
325
+ --popover: 0 0% 100%;
326
+ --popover-foreground: 20 14.3% 4.1%;
327
+ --primary: 47.9 95.8% 53.1%;
328
+ --primary-foreground: 26 83.3% 14.1%;
329
+ --secondary: 60 4.8% 95.9%;
330
+ --secondary-foreground: 24 9.8% 10%;
331
+ --muted: 60 4.8% 95.9%;
332
+ --muted-foreground: 25 5.3% 44.7%;
333
+ --accent: 60 4.8% 95.9%;
334
+ --accent-foreground: 24 9.8% 10%;
335
+ --destructive: 0 84.2% 60.2%;
336
+ --destructive-foreground: 60 9.1% 97.8%;
337
+ --border: 20 5.9% 90%;
338
+ --input: 20 5.9% 90%;
339
+ --ring: 47.9 95.8% 53.1%;
340
+ }
341
+ .dark [data-palette="yellow"] {
342
+ --background: 20 14.3% 4.1%;
343
+ --foreground: 60 9.1% 97.8%;
344
+ --card: 20 14.3% 4.1%;
345
+ --card-foreground: 60 9.1% 97.8%;
346
+ --popover: 20 14.3% 4.1%;
347
+ --popover-foreground: 60 9.1% 97.8%;
348
+ --primary: 47.9 95.8% 53.1%;
349
+ --primary-foreground: 26 83.3% 14.1%;
350
+ --secondary: 12 6.5% 15.1%;
351
+ --secondary-foreground: 60 9.1% 97.8%;
352
+ --muted: 12 6.5% 15.1%;
353
+ --muted-foreground: 24 5.4% 63.9%;
354
+ --accent: 12 6.5% 15.1%;
355
+ --accent-foreground: 60 9.1% 97.8%;
356
+ --destructive: 0 72.2% 50.6%;
357
+ --destructive-foreground: 60 9.1% 97.8%;
358
+ --border: 12 6.5% 15.1%;
359
+ --input: 12 6.5% 15.1%;
360
+ --ring: 47.9 95.8% 53.1%;
361
+ }
362
+
363
+ /* ── red ── */
364
+ [data-palette="red"] {
365
+ --background: 0 0% 100%;
366
+ --foreground: 240 10% 3.9%;
367
+ --card: 0 0% 100%;
368
+ --card-foreground: 240 10% 3.9%;
369
+ --popover: 0 0% 100%;
370
+ --popover-foreground: 240 10% 3.9%;
371
+ --primary: 0 72.2% 50.6%;
372
+ --primary-foreground: 0 85.7% 97.3%;
373
+ --secondary: 240 4.8% 95.9%;
374
+ --secondary-foreground: 240 5.9% 10%;
375
+ --muted: 240 4.8% 95.9%;
376
+ --muted-foreground: 240 3.8% 46.1%;
377
+ --accent: 240 4.8% 95.9%;
378
+ --accent-foreground: 240 5.9% 10%;
379
+ --destructive: 0 84.2% 60.2%;
380
+ --destructive-foreground: 0 0% 98%;
381
+ --border: 240 5.9% 90%;
382
+ --input: 240 5.9% 90%;
383
+ --ring: 0 72.2% 50.6%;
384
+ }
385
+ .dark [data-palette="red"] {
386
+ --background: 20 14.3% 4.1%;
387
+ --foreground: 0 0% 95%;
388
+ --card: 24 9.8% 10%;
389
+ --card-foreground: 0 0% 95%;
390
+ --popover: 0 0% 9%;
391
+ --popover-foreground: 0 0% 95%;
392
+ --primary: 0 72.2% 50.6%;
393
+ --primary-foreground: 0 85.7% 97.3%;
394
+ --secondary: 240 3.7% 15.9%;
395
+ --secondary-foreground: 0 0% 98%;
396
+ --muted: 0 0% 15%;
397
+ --muted-foreground: 240 5% 64.9%;
398
+ --accent: 12 6.5% 15.1%;
399
+ --accent-foreground: 0 0% 98%;
400
+ --destructive: 0 62.8% 30.6%;
401
+ --destructive-foreground: 0 85.7% 97.3%;
402
+ --border: 240 3.7% 15.9%;
403
+ --input: 240 3.7% 15.9%;
404
+ --ring: 0 72.2% 50.6%;
405
+ }
406
+
407
+ /* ─── Richtext (TipTap HTML output) ─────────────────────────────────────────── */
408
+ .richtext-content { line-height: 1.75; }
409
+ .richtext-content h1 { font-size: 2em; font-weight: 700; margin: 1em 0 0.5em; line-height: 1.2; }
410
+ .richtext-content h2 { font-size: 1.5em; font-weight: 700; margin: 1em 0 0.5em; line-height: 1.3; }
411
+ .richtext-content h3 { font-size: 1.25em; font-weight: 600; margin: 0.8em 0 0.4em; line-height: 1.4; }
412
+ .richtext-content h4 { font-size: 1.1em; font-weight: 600; margin: 0.8em 0 0.4em; }
413
+ .richtext-content p { margin-bottom: 1em; }
414
+ .richtext-content ul { list-style: disc; padding-left: 1.5em; margin-bottom: 1em; }
415
+ .richtext-content ol { list-style: decimal; padding-left: 1.5em; margin-bottom: 1em; }
416
+ .richtext-content li { margin-bottom: 0.25em; }
417
+ .richtext-content blockquote {
418
+ border-left: 3px solid hsl(var(--primary));
419
+ padding-left: 1em;
420
+ margin: 1.25em 0;
421
+ color: hsl(var(--muted-foreground));
422
+ font-style: italic;
423
+ }
424
+ .richtext-content code {
425
+ background: hsl(var(--muted));
426
+ border-radius: 0.25em;
427
+ padding: 0.15em 0.4em;
428
+ font-size: 0.875em;
429
+ font-family: ui-monospace, monospace;
430
+ }
431
+ .richtext-content pre {
432
+ background: hsl(var(--muted));
433
+ border-radius: 0.5em;
434
+ padding: 1em 1.25em;
435
+ overflow-x: auto;
436
+ margin: 1.25em 0;
437
+ }
438
+ .richtext-content pre code { background: none; padding: 0; font-size: 0.875em; }
439
+ .richtext-content a { color: hsl(var(--primary)); text-decoration: underline; text-underline-offset: 2px; }
440
+ .richtext-content a:hover { opacity: 0.8; }
441
+ .richtext-content hr { border: none; border-top: 1px solid hsl(var(--border)); margin: 2em 0; }
442
+ .richtext-content strong { font-weight: 600; }
443
+ .richtext-content em { font-style: italic; }
444
+ /* Extra Bold — inline style from TipTap takes precedence, this is a fallback */
445
+ .richtext-content strong[style*="font-weight: 800"] { font-weight: 800; }
446
+ /* Highlight — <mark> with inline background-color from TipTap */
447
+ .richtext-content mark { border-radius: 2px; padding: 0 2px; }
448
+ /* Text color — rendered as inline style on <span>, no extra CSS needed */
@@ -0,0 +1,122 @@
1
+ import type { Config } from "tailwindcss";
2
+ import animate from "tailwindcss-animate";
3
+
4
+ const config: Config = {
5
+ darkMode: ["class"],
6
+ content: ["./src/**/*.{ts,tsx}"],
7
+ theme: {
8
+ container: {
9
+ center: true,
10
+ padding: "2rem",
11
+ screens: { "2xl": "1400px" },
12
+ },
13
+ extend: {
14
+ colors: {
15
+ border: "hsl(var(--border))",
16
+ input: "hsl(var(--input))",
17
+ ring: "hsl(var(--ring))",
18
+ background: "hsl(var(--background))",
19
+ foreground: "hsl(var(--foreground))",
20
+ primary: {
21
+ DEFAULT: "hsl(var(--primary))",
22
+ foreground: "hsl(var(--primary-foreground))",
23
+ },
24
+ secondary: {
25
+ DEFAULT: "hsl(var(--secondary))",
26
+ foreground: "hsl(var(--secondary-foreground))",
27
+ },
28
+ destructive: {
29
+ DEFAULT: "hsl(var(--destructive))",
30
+ foreground: "hsl(var(--destructive-foreground))",
31
+ },
32
+ muted: {
33
+ DEFAULT: "hsl(var(--muted))",
34
+ foreground: "hsl(var(--muted-foreground))",
35
+ },
36
+ accent: {
37
+ DEFAULT: "hsl(var(--accent))",
38
+ foreground: "hsl(var(--accent-foreground))",
39
+ },
40
+ popover: {
41
+ DEFAULT: "hsl(var(--popover))",
42
+ foreground: "hsl(var(--popover-foreground))",
43
+ },
44
+ card: {
45
+ DEFAULT: "hsl(var(--card))",
46
+ foreground: "hsl(var(--card-foreground))",
47
+ },
48
+ success: {
49
+ DEFAULT: "hsl(var(--success))",
50
+ foreground: "hsl(var(--success-foreground))",
51
+ },
52
+ info: {
53
+ DEFAULT: "hsl(var(--info))",
54
+ foreground: "hsl(var(--info-foreground))",
55
+ },
56
+ warning: {
57
+ DEFAULT: "hsl(var(--warning))",
58
+ foreground: "hsl(var(--warning-foreground))",
59
+ },
60
+ error: {
61
+ DEFAULT: "hsl(var(--error))",
62
+ foreground: "hsl(var(--error-foreground))",
63
+ },
64
+ },
65
+ borderRadius: {
66
+ lg: "var(--radius)",
67
+ md: "calc(var(--radius) - 2px)",
68
+ sm: "calc(var(--radius) - 4px)",
69
+ },
70
+ keyframes: {
71
+ "accordion-down": {
72
+ from: { height: "0" },
73
+ to: { height: "var(--radix-accordion-content-height)" },
74
+ },
75
+ "accordion-up": {
76
+ from: { height: "var(--radix-accordion-content-height)" },
77
+ to: { height: "0" },
78
+ },
79
+ marquee: {
80
+ from: { transform: "translateX(0)" },
81
+ to: { transform: "translateX(calc(-100% - var(--gap)))" },
82
+ },
83
+ "marquee-vertical": {
84
+ from: { transform: "translateY(0)" },
85
+ to: { transform: "translateY(calc(-100% - var(--gap)))" },
86
+ },
87
+ "fade-up": {
88
+ from: { opacity: "0", transform: "translateY(20px)" },
89
+ to: { opacity: "1", transform: "translateY(0)" },
90
+ },
91
+ "fade-in": {
92
+ from: { opacity: "0" },
93
+ to: { opacity: "1" },
94
+ },
95
+ "counter-up": {
96
+ from: { opacity: "0", transform: "translateY(10px)" },
97
+ to: { opacity: "1", transform: "translateY(0)" },
98
+ },
99
+ },
100
+ animation: {
101
+ "accordion-down": "accordion-down 0.2s ease-out",
102
+ "accordion-up": "accordion-up 0.2s ease-out",
103
+ marquee: "marquee var(--duration) linear infinite",
104
+ "marquee-vertical": "marquee-vertical var(--duration) linear infinite",
105
+ "fade-up": "fade-up 0.5s ease-out",
106
+ "fade-in": "fade-in 0.3s ease-out",
107
+ "counter-up": "counter-up 0.5s ease-out",
108
+ },
109
+ },
110
+ },
111
+ safelist: [
112
+ // Semantic section backgrounds — generated unconditionally so dynamic
113
+ // string composition (cn() with boolean expressions) is always included.
114
+ "bg-success", "text-success-foreground",
115
+ "bg-info", "text-info-foreground",
116
+ "bg-warning", "text-warning-foreground",
117
+ "bg-error", "text-error-foreground",
118
+ ],
119
+ plugins: [animate],
120
+ };
121
+
122
+ export default config;