blocks-dusted 0.1.12 → 0.1.13

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 (148) hide show
  1. package/package.json +1 -1
  2. package/src/installers/patchRenderBlocks.js +1 -1
  3. package/src/registry/validateTemplateManifest.js +2 -1
  4. package/templates/blocks/BannerDD790432/Component.tsx +63 -0
  5. package/templates/blocks/BannerDD790432/config.ts +54 -0
  6. package/templates/blocks/BannerDD790432/manifest.json +80 -0
  7. package/templates/blocks/Button47/Component.tsx +124 -0
  8. package/templates/blocks/Button47/config.ts +75 -0
  9. package/templates/blocks/Button47/link.ts +22 -0
  10. package/templates/blocks/Button47/manifest.json +105 -0
  11. package/templates/blocks/Button47/styles.module.scss +75 -0
  12. package/templates/blocks/DD-Accordion/Component.tsx +55 -36
  13. package/templates/blocks/DD-Accordion/config.ts +71 -59
  14. package/templates/blocks/DD-AnimText/Component.tsx +50 -32
  15. package/templates/blocks/DD-AnimText/config.ts +296 -295
  16. package/templates/blocks/DD-AsideNav/Component.tsx +323 -319
  17. package/templates/blocks/DD-Banner/Component.tsx +54 -51
  18. package/templates/blocks/DD-BookCall/Component.tsx +535 -535
  19. package/templates/blocks/DD-ButtonPop/Component.tsx +118 -117
  20. package/templates/blocks/DD-Card/Component.tsx +4 -4
  21. package/templates/blocks/DD-CardTemplate01/Component.tsx +139 -140
  22. package/templates/blocks/DD-CardsWithVariantV3/Component.tsx +472 -0
  23. package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/index.tsx +203 -0
  24. package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/styles.ts +87 -0
  25. package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/useInjectStyle.ts +39 -0
  26. package/templates/blocks/DD-CardsWithVariantV3/config.ts +326 -0
  27. package/templates/blocks/DD-CardsWithVariantV3/manifest.json +110 -0
  28. package/templates/blocks/DD-Carousel-A/Component.tsx +251 -249
  29. package/templates/blocks/DD-Carousel-B/Component.tsx +405 -403
  30. package/templates/blocks/DD-ComparisonTable/Component.tsx +255 -256
  31. package/templates/blocks/DD-Contact/Component.tsx +433 -435
  32. package/templates/blocks/DD-Counter/Component.tsx +11 -6
  33. package/templates/blocks/DD-DeliCard/Component.tsx +303 -0
  34. package/templates/blocks/DD-DeliCard/config.ts +186 -0
  35. package/templates/blocks/DD-DeliCard/manifest.json +94 -0
  36. package/templates/blocks/DD-FeatCat/Component.tsx +302 -302
  37. package/templates/blocks/DD-FeatProd/CircularGallery.tsx +1179 -0
  38. package/templates/blocks/DD-FeatProd/Component.tsx +484 -0
  39. package/templates/blocks/DD-FeatProd/config.ts +173 -0
  40. package/templates/blocks/DD-FeatProd/manifest.json +93 -0
  41. package/templates/blocks/DD-FeatServ/Component.tsx +607 -0
  42. package/templates/blocks/DD-FeatServ/config.ts +213 -0
  43. package/templates/blocks/DD-FeatServ/manifest.json +113 -0
  44. package/templates/blocks/DD-FeatStrip/Component.tsx +584 -585
  45. package/templates/blocks/DD-FluidBtn/ButtonsEyeCatching.tsx +627 -628
  46. package/templates/blocks/DD-FluidBtn/Component.tsx +46 -43
  47. package/templates/blocks/DD-GooeyInfo/Component.tsx +150 -149
  48. package/templates/blocks/DD-GooeyInfo/config.ts +136 -135
  49. package/templates/blocks/DD-Hero/Component.tsx +296 -297
  50. package/templates/blocks/DD-HeroPlas/Component.tsx +50 -0
  51. package/templates/blocks/DD-HeroPlas/ThreeScene.tsx +109 -0
  52. package/templates/blocks/DD-HeroPlas/config.ts +33 -0
  53. package/templates/blocks/DD-HeroPlas/manifest.json +88 -0
  54. package/templates/blocks/DD-HorizontalScroll/Component.tsx +937 -936
  55. package/templates/blocks/DD-Icon/Component.tsx +46 -81
  56. package/templates/blocks/DD-IconButton/Component.tsx +13 -20
  57. package/templates/blocks/DD-IdTag/Component.tsx +22 -21
  58. package/templates/blocks/DD-LineAnim/Component.tsx +42 -36
  59. package/templates/blocks/DD-LogoMarq/Component.tsx +38 -48
  60. package/templates/blocks/DD-Lottie/Component.tsx +11 -3
  61. package/templates/blocks/DD-MasonaryMedia/Component.tsx +544 -545
  62. package/templates/blocks/DD-MasonaryMedia/config.ts +389 -389
  63. package/templates/blocks/DD-Masonry/Component.tsx +654 -644
  64. package/templates/blocks/DD-Masonry/config.ts +475 -475
  65. package/templates/blocks/DD-MaterialSwatches/Component.tsx +85 -0
  66. package/templates/blocks/DD-MaterialSwatches/config.ts +232 -0
  67. package/templates/blocks/DD-MaterialSwatches/manifest.json +84 -0
  68. package/templates/blocks/DD-MaterialSwatches/material.ts +107 -0
  69. package/templates/blocks/DD-NineCanvas/Component.tsx +129 -0
  70. package/templates/blocks/DD-NineCanvas/RenderBlocks.tsx +244 -0
  71. package/templates/blocks/DD-NineCanvas/allowedCanvasBlocks.ts +6 -0
  72. package/templates/blocks/DD-NineCanvas/blockComponents.tsx +8 -0
  73. package/templates/blocks/DD-NineCanvas/canvas/CanvasGrid.tsx +316 -0
  74. package/templates/blocks/DD-NineCanvas/canvas/RadialNav.tsx +432 -0
  75. package/templates/blocks/DD-NineCanvas/canvas/canvas-panels.css +889 -0
  76. package/templates/blocks/DD-NineCanvas/canvas/icons/custom-icons.tsx +364 -0
  77. package/templates/blocks/DD-NineCanvas/config.ts +61 -0
  78. package/templates/blocks/DD-NineCanvas/manifest.json +165 -0
  79. package/templates/blocks/DD-NineCanvas/styles.scss +152 -0
  80. package/templates/blocks/DD-NineCanvas/tooltip/get-strict-context.tsx +26 -0
  81. package/templates/blocks/DD-NineCanvas/tooltip/primitives.tsx +178 -0
  82. package/templates/blocks/DD-NineCanvas/tooltip/tooltip.tsx +71 -0
  83. package/templates/blocks/DD-NineCanvas/tooltip/use-controlled-state.tsx +33 -0
  84. package/templates/blocks/DD-NineCanvas/utilities/FadeOnScroll.tsx +68 -0
  85. package/templates/blocks/DD-NineCanvas/utilities/ParallaxWrapper.tsx +157 -0
  86. package/templates/blocks/DD-NineCanvas/utilities/renderCustomCSS.ts +5 -0
  87. package/templates/blocks/DD-NineCanvas/utilities/webglCleanup.ts +27 -0
  88. package/templates/blocks/DD-PayloadAIAssistant/Component.tsx +78 -0
  89. package/templates/blocks/DD-PayloadAIAssistant/DustedBot.tsx +590 -0
  90. package/templates/blocks/DD-PayloadAIAssistant/config.ts +37 -0
  91. package/templates/blocks/DD-PayloadAIAssistant/demo.css +125 -0
  92. package/templates/blocks/DD-PayloadAIAssistant/manifest.json +93 -0
  93. package/templates/blocks/DD-PayloadAIAssistant/source-defaults.ts +17 -0
  94. package/templates/blocks/DD-PayloadAIAssistant/styles.ts +306 -0
  95. package/templates/blocks/DD-Pricing/Component.tsx +2 -3
  96. package/templates/blocks/DD-Pricing/config.ts +215 -215
  97. package/templates/blocks/DD-Process/Component.tsx +2 -2
  98. package/templates/blocks/DD-ProjHeader/Component.tsx +93 -91
  99. package/templates/blocks/DD-ProjSlider/Component.tsx +1 -1
  100. package/templates/blocks/DD-Section/Component.tsx +265 -266
  101. package/templates/blocks/DD-Separator/Component.tsx +66 -66
  102. package/templates/blocks/DD-Services/Component.tsx +176 -176
  103. package/templates/blocks/DD-ShowcaseGrid/Component.tsx +306 -307
  104. package/templates/blocks/DD-Slider-A/Component.tsx +2 -2
  105. package/templates/blocks/DD-StackCards/Component.tsx +172 -171
  106. package/templates/blocks/DD-Team/Component.tsx +247 -247
  107. package/templates/blocks/DD-TeamCards/Component.tsx +251 -251
  108. package/templates/blocks/DD-TechStack/Component.tsx +173 -174
  109. package/templates/blocks/DD-TestMarq/Component.tsx +158 -132
  110. package/templates/blocks/DD-Testim/Component.tsx +247 -247
  111. package/templates/blocks/DD-Testim2/Component.tsx +265 -256
  112. package/templates/blocks/DD-Testimonials/Component.tsx +139 -139
  113. package/templates/blocks/DD-Thanks/Component.tsx +1 -1
  114. package/templates/blocks/DD-Work/Component.tsx +318 -318
  115. package/templates/blocks/DD-Work-B/Component.tsx +294 -294
  116. package/templates/blocks/DDHG-CTASection2/Component.tsx +183 -184
  117. package/templates/blocks/DDHG-HighlightArc/Component.tsx +6 -3
  118. package/templates/blocks/DDHG-LogoMarquee/Component.tsx +45 -8
  119. package/templates/blocks/DDHG-NavCodeGrid/Component.tsx +1 -3
  120. package/templates/blocks/DDHG-ServiceDetails/ServiceDetailCard.tsx +9 -22
  121. package/templates/blocks/DDHG-ServiceHero/Component.tsx +10 -10
  122. package/templates/blocks/DDHG-TeamCards/Component.tsx +6 -35
  123. package/templates/blocks/Form/Checkbox/index.tsx +45 -0
  124. package/templates/blocks/Form/Component.tsx +163 -0
  125. package/templates/blocks/Form/Country/index.tsx +65 -0
  126. package/templates/blocks/Form/Country/options.ts +982 -0
  127. package/templates/blocks/Form/Email/index.tsx +38 -0
  128. package/templates/blocks/Form/Error/index.tsx +15 -0
  129. package/templates/blocks/Form/Message/index.tsx +13 -0
  130. package/templates/blocks/Form/Number/index.tsx +36 -0
  131. package/templates/blocks/Form/Select/index.tsx +63 -0
  132. package/templates/blocks/Form/State/index.tsx +64 -0
  133. package/templates/blocks/Form/State/options.ts +52 -0
  134. package/templates/blocks/Form/Text/index.tsx +32 -0
  135. package/templates/blocks/Form/Textarea/index.tsx +40 -0
  136. package/templates/blocks/Form/Width/index.tsx +13 -0
  137. package/templates/blocks/Form/config.ts +51 -0
  138. package/templates/blocks/Form/fields.tsx +21 -0
  139. package/templates/blocks/Form/manifest.json +168 -0
  140. package/templates/blocks/MediaBlock/Component.tsx +67 -0
  141. package/templates/blocks/MediaBlock/config.ts +14 -0
  142. package/templates/blocks/MediaBlock/manifest.json +92 -0
  143. package/templates/blocks/TransitionsDustedShowcase/Component.tsx +9 -0
  144. package/templates/blocks/TransitionsDustedShowcase/config.ts +13 -0
  145. package/templates/blocks/TransitionsDustedShowcase/manifest.json +80 -0
  146. package/templates/blocks/rawHtml/Component.tsx +25 -0
  147. package/templates/blocks/rawHtml/config.ts +56 -0
  148. package/templates/blocks/rawHtml/manifest.json +80 -0
@@ -194,8 +194,11 @@ export function DDStackCards(props: DDStackCardsProps) {
194
194
  const timer = window.setTimeout(() => {
195
195
  const wrapper = wrapperRef.current
196
196
  const cardEls = cardRefs.current.filter(Boolean) as HTMLDivElement[]
197
+ const surfaceEls = cardEls
198
+ .map((card) => card.querySelector<HTMLElement>('.stack-card-surface'))
199
+ .filter(Boolean) as HTMLElement[]
197
200
 
198
- if (!wrapper || !cardEls.length) return
201
+ if (!wrapper || !cardEls.length || surfaceEls.length !== cardEls.length) return
199
202
 
200
203
  const ctx = gsap.context(() => {
201
204
  gsap.set(wrapper, {
@@ -203,12 +206,12 @@ export function DDStackCards(props: DDStackCardsProps) {
203
206
  willChange: 'opacity',
204
207
  })
205
208
 
206
- gsap.set(cardEls, {
209
+ gsap.set(surfaceEls, {
207
210
  transformPerspective: 1200,
208
211
  transformOrigin: 'top center',
209
212
  })
210
213
 
211
- cardEls.forEach((card, i) => {
214
+ cardEls.forEach((_card, i) => {
212
215
  for (let j = i + 1; j < cardEls.length; j++) {
213
216
  const step = j - i
214
217
  const prevStep = step - 1
@@ -216,7 +219,7 @@ export function DDStackCards(props: DDStackCardsProps) {
216
219
  layoutValues.initialStickyTop + (j - 1) * layoutValues.cardOffset
217
220
 
218
221
  gsap.fromTo(
219
- card,
222
+ surfaceEls[i],
220
223
  {
221
224
  scale: 1 - prevStep * layoutValues.scaleStep,
222
225
  z: -prevStep * layoutValues.depthZ,
@@ -225,7 +228,6 @@ export function DDStackCards(props: DDStackCardsProps) {
225
228
  scale: 1 - step * layoutValues.scaleStep,
226
229
  z: -step * layoutValues.depthZ,
227
230
  force3D: true,
228
- filter: `brightness(${Math.max(0.65, 1 - step * 0.06)})`,
229
231
  borderRadius: '20px',
230
232
  immediateRender: false,
231
233
  scrollTrigger: {
@@ -277,197 +279,196 @@ export function DDStackCards(props: DDStackCardsProps) {
277
279
  const totalCards = cards.length
278
280
 
279
281
  return (
280
- <section
281
- ref={wrapperRef}
282
- className="stack-cards-block relative w-full invert-[0.95] brightness-110 contrast-125 dark:brightness-100 dark:contrast-100 dark:invert-[0]"
283
- >
284
- {cards.map((card, i) => {
285
- const accent = ACCENTS[card.accentVariant ?? 'lime']
286
- const cardMedia =
287
- card.image && typeof card.image === 'object' ? (card.image as Media) : null
288
-
289
- return (
290
- <section
291
- key={card.id ?? i}
292
- id={i === 0 ? (sectionId ?? undefined) : undefined}
293
- ref={(el) => {
294
- cardRefs.current[i] = el
295
- }}
296
- className="stack-card renderblock-container sticky! w-full overflow-hidden px-4 py-16 sm:px-6 lg:py-32"
297
- style={{
298
- top: `${layoutValues.initialStickyTop + i * layoutValues.cardOffset}px`,
299
- zIndex: i + 1,
300
- willChange: 'transform',
301
- }}
302
- >
303
- {i === 0 ? '#BlockName-DDStackCards' : null}
304
- <div
305
- className="relative mx-auto w-full max-w-5xl overflow-hidden rounded-2xl"
282
+ <>
283
+ <style>{'body:has(.stack-cards-block) { overflow-x: clip; }'}</style>
284
+ <section ref={wrapperRef} className="stack-cards-block relative w-full">
285
+ {cards.map((card, i) => {
286
+ const accent = ACCENTS[card.accentVariant ?? 'lime']
287
+ const cardMedia =
288
+ card.image && typeof card.image === 'object' ? (card.image as Media) : null
289
+
290
+ return (
291
+ <section
292
+ key={card.id ?? i}
293
+ id={i === 0 ? (sectionId ?? undefined) : undefined}
294
+ ref={(el) => {
295
+ cardRefs.current[i] = el
296
+ }}
297
+ className="stack-card renderblock-container sticky w-full overflow-hidden px-4 py-16 sm:px-6 lg:py-32"
306
298
  style={{
307
- background: 'rgb(8 8 10 / 90%)',
308
- border: '1px solid rgba(255,255,255,0.07)',
309
- backdropFilter: 'blur(8px)',
299
+ top: `${layoutValues.initialStickyTop + i * layoutValues.cardOffset}px`,
300
+ zIndex: i + 1,
310
301
  }}
311
302
  >
303
+ {i === 0 ? '' : null}
312
304
  <div
313
- className="absolute left-0 right-0 top-0 h-px"
305
+ className="stack-card-surface relative mx-auto w-full max-w-5xl overflow-hidden rounded-2xl invert-[0.95] brightness-110 contrast-125 dark:brightness-100 dark:contrast-100 dark:invert-[0]"
314
306
  style={{
315
- background: `linear-gradient(90deg, transparent, rgba(${accent.rgb},0.5), transparent)`,
307
+ background: 'rgb(8 8 10 / 90%)',
308
+ border: '1px solid rgba(255,255,255,0.07)',
309
+ backdropFilter: 'blur(8px)',
316
310
  }}
317
- />
318
-
319
- <div className="grid min-h-70 grid-cols-[1fr_5.5rem] sm:grid-cols-[1fr_8rem] md:min-h-85 md:grid-cols-[1fr_auto]">
320
- <div className="stackcard-bg flex flex-col justify-between p-6 md:p-10 lg:p-14">
321
- <div>
322
- <div className="mb-6 flex items-start justify-between md:mb-8">
323
- <div className="flex items-center gap-3 md:gap-4">
324
- <div
325
- className="flex h-10 w-10 shrink-0 items-center justify-center rounded-xl md:h-12 md:w-12"
326
- style={{
327
- background: `rgba(${accent.rgb},0.1)`,
328
- border: `1px solid rgba(${accent.rgb},0.25)`,
329
- }}
330
- >
331
- <span style={{ color: accent.hex }}>
332
- <DynamicIcon className="shrink-0" name={card.iconName} size={20} />
333
- </span>
311
+ >
312
+ <div
313
+ className="absolute left-0 right-0 top-0 h-px"
314
+ style={{
315
+ background: `linear-gradient(90deg, transparent, rgba(${accent.rgb},0.5), transparent)`,
316
+ }}
317
+ />
318
+
319
+ <div className="grid min-h-70 grid-cols-[1fr_5.5rem] sm:grid-cols-[1fr_8rem] md:min-h-85 md:grid-cols-[1fr_auto]">
320
+ <div className="stackcard-bg flex flex-col justify-between p-6 md:p-10 lg:p-14">
321
+ <div>
322
+ <div className="mb-6 flex items-start justify-between md:mb-8">
323
+ <div className="flex items-center gap-3 md:gap-4">
324
+ <div
325
+ className="flex h-10 w-10 shrink-0 items-center justify-center rounded-xl md:h-12 md:w-12"
326
+ style={{
327
+ background: `rgba(${accent.rgb},0.1)`,
328
+ border: `1px solid rgba(${accent.rgb},0.25)`,
329
+ }}
330
+ >
331
+ <span style={{ color: accent.hex }}>
332
+ <DynamicIcon className="shrink-0" name={card.iconName} size={20} />
333
+ </span>
334
+ </div>
335
+
336
+ <div>
337
+ {card.number && (
338
+ <div
339
+ className="mb-0.5 text-xs font-black uppercase tracking-widest md:text-xs"
340
+ style={{ color: `rgba(${accent.rgb},0.6)` }}
341
+ >
342
+ {card.number} / {String(totalCards).padStart(2, '0')}
343
+ </div>
344
+ )}
345
+
346
+ {card.title && (
347
+ <h3 className="text-xl font-extrabold tracking-tight text-stone-50/80 md:text-2xl lg:text-3xl">
348
+ {card.title}
349
+ </h3>
350
+ )}
351
+ </div>
334
352
  </div>
335
353
 
336
- <div>
337
- {card.number && (
338
- <div
339
- className="mb-0.5 text-xs font-black uppercase tracking-widest md:text-xs"
340
- style={{ color: `rgba(${accent.rgb},0.6)` }}
341
- >
342
- {card.number} / {String(totalCards).padStart(2, '0')}
343
- </div>
344
- )}
345
-
346
- {card.title && (
347
- <h3 className="text-xl font-extrabold tracking-tight text-stone-50/80 md:text-2xl lg:text-3xl">
348
- {card.title}
349
- </h3>
350
- )}
351
- </div>
354
+ {(card.statValue || card.statLabel) && (
355
+ <div className="hidden flex-col items-end md:flex">
356
+ {card.statValue && (
357
+ <span
358
+ className="text-4xl font-black leading-none"
359
+ style={{ color: accent.hex }}
360
+ >
361
+ {card.statValue}
362
+ </span>
363
+ )}
364
+
365
+ {card.statLabel && (
366
+ <span
367
+ className="mt-1 text-xs"
368
+ style={{ color: 'rgba(255,255,255,0.3)' }}
369
+ >
370
+ {card.statLabel}
371
+ </span>
372
+ )}
373
+ </div>
374
+ )}
352
375
  </div>
353
376
 
354
- {(card.statValue || card.statLabel) && (
355
- <div className="hidden flex-col items-end md:flex">
356
- {card.statValue && (
357
- <span
358
- className="text-4xl font-black leading-none"
359
- style={{ color: accent.hex }}
360
- >
361
- {card.statValue}
362
- </span>
363
- )}
377
+ {card.content ? (
378
+ <RichText
379
+ data={card.content as any}
380
+ enableProse={false}
381
+ enableGutter={false}
382
+ className="max-w-xl text-sm leading-relaxed text-stone-800 dark:text-stone-200 md:text-base"
383
+ style={{ color: 'rgba(255,255,255,0.45)' }}
384
+ />
385
+ ) : null}
386
+ </div>
364
387
 
365
- {card.statLabel && (
388
+ <div className="mt-6 flex flex-col items-start justify-between gap-4 sm:flex-row sm:items-center md:mt-8">
389
+ {card.tags && card.tags.length > 0 && (
390
+ <div className="flex flex-wrap gap-2">
391
+ {card.tags.map((tagItem, ti) => (
366
392
  <span
367
- className="mt-1 text-xs"
368
- style={{ color: 'rgba(255,255,255,0.3)' }}
393
+ key={tagItem.id ?? ti}
394
+ className="rounded-full px-3 py-1 text-xs font-semibold"
395
+ style={{
396
+ background: `rgba(${accent.rgb},0.07)`,
397
+ border: `1px solid rgba(${accent.rgb},0.18)`,
398
+ color: accent.hex,
399
+ }}
369
400
  >
370
- {card.statLabel}
401
+ {tagItem.tag}
371
402
  </span>
372
- )}
403
+ ))}
373
404
  </div>
374
405
  )}
375
- </div>
376
406
 
377
- {card.content ? (
378
- <RichText
379
- data={card.content as any}
380
- enableProse={false}
381
- enableGutter={false}
382
- className="max-w-xl text-sm leading-relaxed text-stone-200 dark:text-stone-200 md:text-base"
383
- style={{ color: 'rgba(255,255,255,0.45)' }}
384
- />
385
- ) : null}
386
- </div>
387
-
388
- <div className="mt-6 flex flex-col items-start justify-between gap-4 sm:flex-row sm:items-center md:mt-8">
389
- {card.tags && card.tags.length > 0 && (
390
- <div className="flex flex-wrap gap-2">
391
- {card.tags.map((tagItem, ti) => (
392
- <span
393
- key={tagItem.id ?? ti}
394
- className="rounded-full px-3 py-1 text-xs font-semibold"
395
- style={{
396
- background: `rgba(${accent.rgb},0.07)`,
397
- border: `1px solid rgba(${accent.rgb},0.18)`,
398
- color: accent.hex,
399
- }}
400
- >
401
- {tagItem.tag}
402
- </span>
403
- ))}
404
- </div>
405
- )}
406
-
407
- {card.ctaLabel && (
408
- <a
409
- href={card.ctaHref ?? '#'}
410
- className="group flex cursor-pointer items-center gap-2 whitespace-nowrap text-xs font-black uppercase tracking-widest"
411
- style={{ color: accent.hex }}
412
- >
413
- {card.ctaLabel}
414
- <ArrowRight
415
- size={14}
416
- className="transition-transform group-hover:translate-x-1"
407
+ {card.ctaLabel && (
408
+ <a
409
+ href={card.ctaHref ?? '#'}
410
+ className="group flex cursor-pointer items-center gap-2 whitespace-nowrap text-xs font-black uppercase tracking-widest"
417
411
  style={{ color: accent.hex }}
418
- />
419
- </a>
420
- )}
412
+ >
413
+ {card.ctaLabel}
414
+ <ArrowRight
415
+ size={14}
416
+ className="transition-transform group-hover:translate-x-1"
417
+ style={{ color: accent.hex }}
418
+ />
419
+ </a>
420
+ )}
421
+ </div>
421
422
  </div>
422
- </div>
423
423
 
424
- <div
425
- className="relative flex w-22 items-center justify-center overflow-hidden sm:w-32 md:w-48 lg:w-64 xl:w-80"
426
- style={{
427
- borderLeft: `1px solid rgba(${accent.rgb},0.08)`,
428
- background: `linear-gradient(135deg, rgba(${accent.rgb},0.04) 0%, transparent 100%)`,
429
- }}
430
- >
431
424
  <div
432
- className="absolute inset-0"
425
+ className="relative flex w-22 items-center justify-center overflow-hidden sm:w-32 md:w-48 lg:w-64 xl:w-80"
433
426
  style={{
434
- background: `radial-gradient(ellipse at 50% 50%, rgba(${accent.rgb},0.25) 0%, transparent 70%)`,
427
+ borderLeft: `1px solid rgba(${accent.rgb},0.08)`,
428
+ background: `linear-gradient(135deg, rgba(${accent.rgb},0.04) 0%, transparent 100%)`,
435
429
  }}
436
- />
437
-
438
- {isLocalImageSrc(cardMedia?.url) ? (
439
- <Image
440
- src={cardMedia.url}
441
- alt={cardMedia.alt ?? card.title ?? ''}
442
- fill
443
- className="relative z-10 object-cover opacity-80"
444
- sizes="(max-width: 640px) 88px, (max-width: 768px) 128px, (max-width: 1280px) 192px, 320px"
430
+ >
431
+ <div
432
+ className="absolute inset-0"
433
+ style={{
434
+ background: `radial-gradient(ellipse at 50% 50%, rgba(${accent.rgb},0.25) 0%, transparent 70%)`,
435
+ }}
445
436
  />
446
- ) : (
447
- <>
448
- <span className="relative z-10" style={{ color: `rgba(${accent.rgb},1)` }}>
449
- <DynamicIcon className="shrink-0" name={card.iconName} size={96} />
450
- </span>
451
-
452
- {card.number && (
453
- <div
454
- className="absolute bottom-4 right-6 select-none font-black leading-none"
455
- style={{
456
- fontSize: '80px',
457
- color: `rgba(${accent.rgb},0.2)`,
458
- }}
459
- >
460
- {card.number}
461
- </div>
462
- )}
463
- </>
464
- )}
437
+
438
+ {isLocalImageSrc(cardMedia?.url) ? (
439
+ <Image
440
+ src={cardMedia.url}
441
+ alt={cardMedia.alt ?? card.title ?? ''}
442
+ fill
443
+ className="relative z-10 object-cover opacity-80 invert dark:invert-0"
444
+ sizes="(max-width: 640px) 88px, (max-width: 768px) 128px, (max-width: 1280px) 192px, 320px"
445
+ />
446
+ ) : (
447
+ <>
448
+ <span className="relative z-10" style={{ color: `rgba(${accent.rgb},1)` }}>
449
+ <DynamicIcon className="shrink-0" name={card.iconName} size={96} />
450
+ </span>
451
+
452
+ {card.number && (
453
+ <div
454
+ className="absolute bottom-4 right-6 select-none font-black leading-none"
455
+ style={{
456
+ fontSize: '80px',
457
+ color: `rgba(${accent.rgb},0.2)`,
458
+ }}
459
+ >
460
+ {card.number}
461
+ </div>
462
+ )}
463
+ </>
464
+ )}
465
+ </div>
465
466
  </div>
466
467
  </div>
467
- </div>
468
- </section>
469
- )
470
- })}
471
- </section>
468
+ </section>
469
+ )
470
+ })}
471
+ </section>
472
+ </>
472
473
  )
473
474
  }