blocks-dusted 0.1.11 → 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 (161) hide show
  1. package/package.json +5 -2
  2. package/src/cli.js +39 -3
  3. package/src/commands/shop.js +59 -0
  4. package/src/commands/warehouse.js +73 -0
  5. package/src/installers/patchRenderBlocks.js +1 -1
  6. package/src/registry/validateTemplateManifest.js +2 -1
  7. package/templates/blocks/BannerDD790432/Component.tsx +63 -0
  8. package/templates/blocks/BannerDD790432/config.ts +54 -0
  9. package/templates/blocks/BannerDD790432/manifest.json +80 -0
  10. package/templates/blocks/Button47/Component.tsx +124 -0
  11. package/templates/blocks/Button47/config.ts +75 -0
  12. package/templates/blocks/Button47/link.ts +22 -0
  13. package/templates/blocks/Button47/manifest.json +105 -0
  14. package/templates/blocks/Button47/styles.module.scss +75 -0
  15. package/templates/blocks/DD-Accordion/Component.tsx +55 -36
  16. package/templates/blocks/DD-Accordion/config.ts +71 -59
  17. package/templates/blocks/DD-AnimText/Component.tsx +50 -32
  18. package/templates/blocks/DD-AnimText/config.ts +296 -295
  19. package/templates/blocks/DD-AsideNav/Component.tsx +323 -319
  20. package/templates/blocks/DD-Banner/Component.tsx +54 -51
  21. package/templates/blocks/DD-BookCall/Component.tsx +10 -9
  22. package/templates/blocks/DD-ButtonPop/Component.tsx +118 -117
  23. package/templates/blocks/DD-Card/Component.tsx +4 -4
  24. package/templates/blocks/DD-CardTemplate01/Component.tsx +5 -5
  25. package/templates/blocks/DD-CardsWithVariantV3/Component.tsx +472 -0
  26. package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/index.tsx +203 -0
  27. package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/styles.ts +87 -0
  28. package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/useInjectStyle.ts +39 -0
  29. package/templates/blocks/DD-CardsWithVariantV3/config.ts +326 -0
  30. package/templates/blocks/DD-CardsWithVariantV3/manifest.json +110 -0
  31. package/templates/blocks/DD-Carousel-A/Component.tsx +251 -249
  32. package/templates/blocks/DD-Carousel-B/Component.tsx +405 -403
  33. package/templates/blocks/DD-Chip/Component.tsx +14 -14
  34. package/templates/blocks/DD-ComparisonTable/Component.tsx +255 -256
  35. package/templates/blocks/DD-Contact/Component.tsx +433 -434
  36. package/templates/blocks/DD-Counter/Component.tsx +18 -13
  37. package/templates/blocks/DD-DeliCard/Component.tsx +303 -0
  38. package/templates/blocks/DD-DeliCard/config.ts +186 -0
  39. package/templates/blocks/DD-DeliCard/manifest.json +94 -0
  40. package/templates/blocks/DD-FeatCat/Component.tsx +302 -302
  41. package/templates/blocks/DD-FeatProd/CircularGallery.tsx +1179 -0
  42. package/templates/blocks/DD-FeatProd/Component.tsx +484 -0
  43. package/templates/blocks/DD-FeatProd/config.ts +173 -0
  44. package/templates/blocks/DD-FeatProd/manifest.json +93 -0
  45. package/templates/blocks/DD-FeatServ/Component.tsx +607 -0
  46. package/templates/blocks/DD-FeatServ/config.ts +213 -0
  47. package/templates/blocks/DD-FeatServ/manifest.json +113 -0
  48. package/templates/blocks/DD-FeatStrip/Component.tsx +584 -585
  49. package/templates/blocks/DD-FluidBtn/ButtonsEyeCatching.tsx +627 -628
  50. package/templates/blocks/DD-FluidBtn/Component.tsx +46 -43
  51. package/templates/blocks/DD-GooeyInfo/Component.tsx +150 -149
  52. package/templates/blocks/DD-GooeyInfo/config.ts +136 -135
  53. package/templates/blocks/DD-Hero/Component.tsx +16 -40
  54. package/templates/blocks/DD-HeroPlas/Component.tsx +50 -0
  55. package/templates/blocks/DD-HeroPlas/ThreeScene.tsx +109 -0
  56. package/templates/blocks/DD-HeroPlas/config.ts +33 -0
  57. package/templates/blocks/DD-HeroPlas/manifest.json +88 -0
  58. package/templates/blocks/DD-HorizontalScroll/Component.tsx +4 -5
  59. package/templates/blocks/DD-Icon/Component.tsx +46 -81
  60. package/templates/blocks/DD-IconButton/Component.tsx +13 -20
  61. package/templates/blocks/DD-IdTag/Component.tsx +22 -21
  62. package/templates/blocks/DD-IframeMedia/Component.tsx +14 -10
  63. package/templates/blocks/DD-LineAnim/Component.tsx +42 -36
  64. package/templates/blocks/DD-LogoMarq/Component.tsx +38 -48
  65. package/templates/blocks/DD-Lottie/Component.tsx +11 -3
  66. package/templates/blocks/DD-MasonaryMedia/Component.tsx +544 -547
  67. package/templates/blocks/DD-MasonaryMedia/config.ts +389 -389
  68. package/templates/blocks/DD-Masonry/Component.tsx +654 -644
  69. package/templates/blocks/DD-Masonry/config.ts +475 -475
  70. package/templates/blocks/DD-MaterialSwatches/Component.tsx +85 -0
  71. package/templates/blocks/DD-MaterialSwatches/config.ts +232 -0
  72. package/templates/blocks/DD-MaterialSwatches/manifest.json +84 -0
  73. package/templates/blocks/DD-MaterialSwatches/material.ts +107 -0
  74. package/templates/blocks/DD-NineCanvas/Component.tsx +129 -0
  75. package/templates/blocks/DD-NineCanvas/RenderBlocks.tsx +244 -0
  76. package/templates/blocks/DD-NineCanvas/allowedCanvasBlocks.ts +6 -0
  77. package/templates/blocks/DD-NineCanvas/blockComponents.tsx +8 -0
  78. package/templates/blocks/DD-NineCanvas/canvas/CanvasGrid.tsx +316 -0
  79. package/templates/blocks/DD-NineCanvas/canvas/RadialNav.tsx +432 -0
  80. package/templates/blocks/DD-NineCanvas/canvas/canvas-panels.css +889 -0
  81. package/templates/blocks/DD-NineCanvas/canvas/icons/custom-icons.tsx +364 -0
  82. package/templates/blocks/DD-NineCanvas/config.ts +61 -0
  83. package/templates/blocks/DD-NineCanvas/manifest.json +165 -0
  84. package/templates/blocks/DD-NineCanvas/styles.scss +152 -0
  85. package/templates/blocks/DD-NineCanvas/tooltip/get-strict-context.tsx +26 -0
  86. package/templates/blocks/DD-NineCanvas/tooltip/primitives.tsx +178 -0
  87. package/templates/blocks/DD-NineCanvas/tooltip/tooltip.tsx +71 -0
  88. package/templates/blocks/DD-NineCanvas/tooltip/use-controlled-state.tsx +33 -0
  89. package/templates/blocks/DD-NineCanvas/utilities/FadeOnScroll.tsx +68 -0
  90. package/templates/blocks/DD-NineCanvas/utilities/ParallaxWrapper.tsx +157 -0
  91. package/templates/blocks/DD-NineCanvas/utilities/renderCustomCSS.ts +5 -0
  92. package/templates/blocks/DD-NineCanvas/utilities/webglCleanup.ts +27 -0
  93. package/templates/blocks/DD-PayloadAIAssistant/Component.tsx +78 -0
  94. package/templates/blocks/DD-PayloadAIAssistant/DustedBot.tsx +590 -0
  95. package/templates/blocks/DD-PayloadAIAssistant/config.ts +37 -0
  96. package/templates/blocks/DD-PayloadAIAssistant/demo.css +125 -0
  97. package/templates/blocks/DD-PayloadAIAssistant/manifest.json +93 -0
  98. package/templates/blocks/DD-PayloadAIAssistant/source-defaults.ts +17 -0
  99. package/templates/blocks/DD-PayloadAIAssistant/styles.ts +306 -0
  100. package/templates/blocks/DD-Pricing/Component.tsx +368 -372
  101. package/templates/blocks/DD-Pricing/config.ts +215 -215
  102. package/templates/blocks/DD-Process/Component.tsx +147 -149
  103. package/templates/blocks/DD-Progress/Component.tsx +156 -141
  104. package/templates/blocks/DD-ProjHeader/Component.tsx +93 -91
  105. package/templates/blocks/DD-ProjSlider/Component.tsx +1 -1
  106. package/templates/blocks/DD-ProjSlider/config.ts +2 -2
  107. package/templates/blocks/DD-Section/Component.tsx +265 -266
  108. package/templates/blocks/DD-Separator/Component.tsx +66 -66
  109. package/templates/blocks/DD-Services/Component.tsx +176 -176
  110. package/templates/blocks/DD-ShowcaseGrid/Component.tsx +306 -307
  111. package/templates/blocks/DD-Slider-A/Component.tsx +237 -237
  112. package/templates/blocks/DD-StackCards/Component.tsx +474 -473
  113. package/templates/blocks/DD-Team/Component.tsx +247 -247
  114. package/templates/blocks/DD-TeamCards/Component.tsx +251 -251
  115. package/templates/blocks/DD-TechStack/Component.tsx +161 -168
  116. package/templates/blocks/DD-TestMarq/Component.tsx +158 -132
  117. package/templates/blocks/DD-Testim/Component.tsx +247 -247
  118. package/templates/blocks/DD-Testim2/Component.tsx +265 -256
  119. package/templates/blocks/DD-Testimonials/Component.tsx +139 -147
  120. package/templates/blocks/DD-TextMarq/Component.tsx +157 -157
  121. package/templates/blocks/DD-Thanks/Component.tsx +501 -500
  122. package/templates/blocks/DD-Work/Component.tsx +315 -315
  123. package/templates/blocks/DD-Work-B/Component.tsx +294 -294
  124. package/templates/blocks/DDHG-CTASection2/Component.tsx +183 -184
  125. package/templates/blocks/DDHG-HighlightArc/Component.tsx +246 -243
  126. package/templates/blocks/DDHG-LogoMarquee/Component.tsx +180 -93
  127. package/templates/blocks/DDHG-LogoMarquee/config.ts +154 -66
  128. package/templates/blocks/DDHG-NavCodeGrid/Component.tsx +225 -213
  129. package/templates/blocks/DDHG-ProcessSec/Component.tsx +38 -39
  130. package/templates/blocks/DDHG-ServiceDetails/Component.tsx +11 -11
  131. package/templates/blocks/DDHG-ServiceDetails/ServiceDetailCard.tsx +30 -47
  132. package/templates/blocks/DDHG-ServiceHero/Component.tsx +10 -10
  133. package/templates/blocks/DDHG-ServiceOverview/Component.tsx +23 -23
  134. package/templates/blocks/DDHG-StatsFAQ/Component.tsx +40 -40
  135. package/templates/blocks/DDHG-TeamCards/Component.tsx +140 -131
  136. package/templates/blocks/Form/Checkbox/index.tsx +45 -0
  137. package/templates/blocks/Form/Component.tsx +163 -0
  138. package/templates/blocks/Form/Country/index.tsx +65 -0
  139. package/templates/blocks/Form/Country/options.ts +982 -0
  140. package/templates/blocks/Form/Email/index.tsx +38 -0
  141. package/templates/blocks/Form/Error/index.tsx +15 -0
  142. package/templates/blocks/Form/Message/index.tsx +13 -0
  143. package/templates/blocks/Form/Number/index.tsx +36 -0
  144. package/templates/blocks/Form/Select/index.tsx +63 -0
  145. package/templates/blocks/Form/State/index.tsx +64 -0
  146. package/templates/blocks/Form/State/options.ts +52 -0
  147. package/templates/blocks/Form/Text/index.tsx +32 -0
  148. package/templates/blocks/Form/Textarea/index.tsx +40 -0
  149. package/templates/blocks/Form/Width/index.tsx +13 -0
  150. package/templates/blocks/Form/config.ts +51 -0
  151. package/templates/blocks/Form/fields.tsx +21 -0
  152. package/templates/blocks/Form/manifest.json +168 -0
  153. package/templates/blocks/MediaBlock/Component.tsx +67 -0
  154. package/templates/blocks/MediaBlock/config.ts +14 -0
  155. package/templates/blocks/MediaBlock/manifest.json +92 -0
  156. package/templates/blocks/TransitionsDustedShowcase/Component.tsx +9 -0
  157. package/templates/blocks/TransitionsDustedShowcase/config.ts +13 -0
  158. package/templates/blocks/TransitionsDustedShowcase/manifest.json +80 -0
  159. package/templates/blocks/rawHtml/Component.tsx +25 -0
  160. package/templates/blocks/rawHtml/config.ts +56 -0
  161. package/templates/blocks/rawHtml/manifest.json +80 -0
@@ -1,51 +1,54 @@
1
- import type { BannerBlock as BannerBlockProps } from 'src/payload-types'
2
-
3
- import { cn } from '@/utilities/ui'
4
- import React from 'react'
5
- import RichText from '@/components/RichText'
6
-
7
- // Shared ::before overlay (lines.svg texture) applied to all banner variants
8
- const BANNER_BEFORE_CLS =
9
- 'relative z-0 ' +
10
- "before:content-[''] before:absolute before:inset-0 before:z-[-1] " +
11
- 'before:bg-[url(/assets/svg/lines.svg)] before:bg-[length:10px_10px] ' +
12
- 'before:bg-repeat before:opacity-100 before:pointer-events-none'
13
-
14
- type Props = {
15
- className?: string
16
- wrapperClassName?: string
17
- } & BannerBlockProps
18
-
19
- export const BannerBlock: React.FC<Props> = ({ className, wrapperClassName, content, style }) => {
20
- return (
21
- <div className={cn('mx-auto my-8 w-full banner_container', className)}>
22
- <div
23
- className={cn(
24
- wrapperClassName,
25
- 'border py-3 pl-0 pr-3 flex items-center rounded shadow-2xl banner_content',
26
- BANNER_BEFORE_CLS,
27
- {
28
- 'banner-info border-[var(--border)] bg-card text-[var(--black)] [box-shadow:inset_0_0_2px_0px_var(--border),var(--shadow-xl)] [&_blockquote]:!border-s-[var(--border)]':
29
- style === 'info',
30
- 'banner-error border-[var(--error-border)] bg-[var(--error)] text-[var(--white)] [box-shadow:inset_0_0_2px_0px_var(--error),var(--shadow-xl)] [&_blockquote]:!border-s-[var(--error-border)] text-stone-200 dark:text-stone-200':
31
- style === 'error',
32
- 'banner-success border-[var(--success-border)] bg-[var(--success)] text-[var(--white)] [box-shadow:inset_0_0_2px_0px_var(--success),var(--shadow-xl)] [&_blockquote]:!border-s-[var(--success-border)] text-stone-200 dark:text-stone-200':
33
- style === 'success',
34
- 'banner-warning border-[var(--warning-border)] bg-[var(--warning)] text-white [box-shadow:inset_0_0_2px_0px_var(--warning),var(--shadow-xl)] [&_blockquote]:!border-s-[var(--warning-border)]':
35
- style === 'warning',
36
- }
37
- )}
38
- >
39
- <RichText
40
- data={content}
41
- className="banner_richtext"
42
- enableGutter={false}
43
- enableProse={true}
44
- />
45
- </div>
46
- </div>
47
- )
48
- }
49
-
50
- export const DDBanner = BannerBlock
51
- export default DDBanner
1
+ type BannerBlockProps = {
2
+ content?: any
3
+ style?: 'info' | 'warning' | 'error' | 'success'
4
+ }
5
+
6
+ import { cn } from '@/utilities/ui'
7
+ import React from 'react'
8
+ import RichText from '@/components/RichText'
9
+
10
+ // Shared ::before overlay (lines.svg texture) applied to all banner variants
11
+ const BANNER_BEFORE_CLS =
12
+ 'relative z-0 ' +
13
+ "before:content-[''] before:absolute before:inset-0 before:z-[-1] " +
14
+ 'before:bg-lines before:bg-[length:10px_10px] ' +
15
+ 'before:bg-repeat before:opacity-100 before:pointer-events-none'
16
+
17
+ type Props = {
18
+ className?: string
19
+ wrapperClassName?: string
20
+ } & BannerBlockProps
21
+
22
+ export const BannerBlock: React.FC<Props> = ({ className, wrapperClassName, content, style }) => {
23
+ return (
24
+ <div className={cn('mx-auto my-8 w-full banner_container', className)}>
25
+ <div
26
+ className={cn(
27
+ wrapperClassName,
28
+ 'border py-3 pl-0 pr-3 flex items-center rounded shadow-2xl banner_content',
29
+ BANNER_BEFORE_CLS,
30
+ {
31
+ 'banner-info border-[var(--border)] bg-card text-[var(--black)] [box-shadow:inset_0_0_2px_0px_var(--border),var(--shadow-xl)] [&_blockquote]:!border-s-[var(--border)]':
32
+ style === 'info',
33
+ 'banner-error border-[var(--error-border)] bg-[var(--error)] text-[var(--white)] [box-shadow:inset_0_0_2px_0px_var(--error),var(--shadow-xl)] [&_blockquote]:!border-s-[var(--error-border)] text-stone-800 dark:text-stone-200':
34
+ style === 'error',
35
+ 'banner-success border-[var(--success-border)] bg-[var(--success)] text-[var(--white)] [box-shadow:inset_0_0_2px_0px_var(--success),var(--shadow-xl)] [&_blockquote]:!border-s-[var(--success-border)] text-stone-800 dark:text-stone-200':
36
+ style === 'success',
37
+ 'banner-warning border-[var(--warning-border)] bg-[var(--warning)] text-white [box-shadow:inset_0_0_2px_0px_var(--warning),var(--shadow-xl)] [&_blockquote]:!border-s-[var(--warning-border)]':
38
+ style === 'warning',
39
+ },
40
+ )}
41
+ >
42
+ <RichText
43
+ data={content}
44
+ className="banner_richtext"
45
+ enableGutter={false}
46
+ enableProse={true}
47
+ />
48
+ </div>
49
+ </div>
50
+ )
51
+ }
52
+
53
+ export const DDBanner = BannerBlock
54
+ export default DDBanner
@@ -8,8 +8,9 @@ import {
8
8
  Globe,
9
9
  Clock,
10
10
  AlertCircle,
11
- CalendarCheck
11
+ CalendarCheck,
12
12
  } from 'lucide-react'
13
+ import { Input } from '@/components/ui/input'
13
14
  import { getClientSideURL } from '@/utilities/getURL'
14
15
 
15
16
  type Status = 'idle' | 'submitting' | 'success' | 'error'
@@ -69,7 +70,7 @@ export const DDBookCall: React.FC<DDBookCallProps> = ({
69
70
  timeSlots,
70
71
  footerNote,
71
72
  sectionId,
72
- customCSS
73
+ customCSS,
73
74
  }) => {
74
75
  const [status, setStatus] = useState<Status>('idle')
75
76
  const [selectedType, setSelectedType] = useState<string>(callTypes?.[0]?.value ?? 'discovery')
@@ -107,14 +108,14 @@ export const DDBookCall: React.FC<DDBookCallProps> = ({
107
108
  { field: 'call_type', value: selectedType },
108
109
  { field: 'preferred_date', value: selectedDate },
109
110
  { field: 'preferred_time', value: selectedSlot },
110
- { field: 'notes', value: data.get('notes') }
111
+ { field: 'notes', value: data.get('notes') },
111
112
  ]
112
113
 
113
114
  try {
114
115
  const res = await fetch(`${getClientSideURL()}/api/form-submissions`, {
115
116
  method: 'POST',
116
117
  headers: { 'Content-Type': 'application/json' },
117
- body: JSON.stringify({ form: formID, submissionData })
118
+ body: JSON.stringify({ form: formID, submissionData }),
118
119
  })
119
120
 
120
121
  if (res.ok) {
@@ -137,7 +138,7 @@ export const DDBookCall: React.FC<DDBookCallProps> = ({
137
138
 
138
139
  <section
139
140
  id={sectionId ?? 'book-call'}
140
- className="container-fluid mx-auto py-28 relative overflow-hidden"
141
+ className="py-28 bg-stone-50 dark:bg-stone-950 relative overflow-hidden"
141
142
  >
142
143
  {/* Background gradients – light & dark variants */}
143
144
  <div
@@ -156,7 +157,7 @@ export const DDBookCall: React.FC<DDBookCallProps> = ({
156
157
  bg-size-[60px_60px]"
157
158
  />
158
159
 
159
- <div className="relative max-w-7xl lg:max-w-8xl mx-auto px-4 md:px-6">
160
+ <div className="relative max-w-6xl lg:max-w-7xl mx-auto px-4 md:px-6">
160
161
  {/* Header */}
161
162
  <div className="text-center mb-16">
162
163
  {eyebrow && (
@@ -405,12 +406,12 @@ export const DDBookCall: React.FC<DDBookCallProps> = ({
405
406
  <label className="block text-xs text-stone-500 dark:text-stone-500 mb-1.5">
406
407
  Time Zone
407
408
  </label>
408
- <div className="flex h-10 w-full items-center gap-2.5 rounded-2xl squircle border border-stone-300 bg-stone-50/80 px-3 py-2 text-sm text-stone-900 outline-none backdrop-blur-[22px] transition-all duration-300 dark:border-stone-600 dark:bg-[#0e0e13] dark:text-stone-200">
409
+ <div className="flex items-center gap-2.5 w-full rounded-sm border border-stone-300 dark:border-stone-600 bg-stone-50/80 dark:bg-black/80 px-3 py-2 backdrop-blur-[22px]">
409
410
  <Globe
410
411
  size={14}
411
412
  className="text-stone-400 dark:text-stone-500 shrink-0"
412
413
  />
413
- <span className="truncate text-sm text-stone-900 dark:text-stone-200">
414
+ <span className="text-sm text-stone-700 dark:text-stone-400 truncate">
414
415
  {Intl.DateTimeFormat().resolvedOptions().timeZone}
415
416
  </span>
416
417
  </div>
@@ -431,7 +432,7 @@ export const DDBookCall: React.FC<DDBookCallProps> = ({
431
432
  onClick={() => setSelectedSlot(slot)}
432
433
  className={`py-2 rounded-lg text-xs font-medium border transition-all cursor-pointer whitespace-nowrap ${
433
434
  selectedSlot === slot
434
- ? 'bg-stone-900 dark:!bg-lime-950/50 text-stone-50 dark:text-lime-500 border-stone-900 dark:border-lime-500'
435
+ ? 'bg-stone-900 dark:bg-stone-50 text-stone-50 dark:text-stone-900 border-stone-900 dark:border-white'
435
436
  : 'bg-stone-100 dark:bg-stone-950 border-stone-200 dark:border-stone-700 text-stone-600 dark:text-stone-400 hover:border-stone-300 dark:hover:border-stone-500 hover:text-stone-900 dark:hover:text-stone-200'
436
437
  }`}
437
438
  >
@@ -1,117 +1,118 @@
1
- 'use client'
2
-
3
- import React, { useState, useRef } from 'react'
4
- import { motion, AnimatePresence } from 'framer-motion'
5
- import { useClickOutside } from '@/hooks/useClickOutside'
6
- import { useBodyScrollLock } from '@/hooks/useBodyScrollLock'
7
- import { cn } from '@/utilities/ui'
8
- import RichText from '@/components/RichText'
9
- import DustSvg from './svg-icons/Dust2'
10
-
11
- interface PopButtonProps {
12
- buttonLabel: string
13
- richTextData: any
14
- width?: string
15
- height?: string
16
- position?: 'left' | 'center' | 'right'
17
- openMode?: 'popover' | 'modal'
18
- }
19
-
20
- export const DDButtonPop: React.FC<PopButtonProps> = ({
21
- buttonLabel,
22
- richTextData,
23
- width = '360px',
24
- height = '240px',
25
- position = 'center',
26
- openMode = 'popover'
27
- }) => {
28
- const [open, setOpen] = useState(false)
29
- const wrapperRef = useRef<HTMLDivElement>(null) as React.RefObject<HTMLDivElement>
30
-
31
- useClickOutside(wrapperRef, () => setOpen(false))
32
-
33
- // Lock body scroll when modal mode is open
34
- useBodyScrollLock(open && openMode === 'modal', 'buttonPopScrollY')
35
-
36
- const alignmentClass =
37
- position === 'left' ? 'justify-start' : position === 'right' ? 'justify-end' : 'justify-center'
38
-
39
- return (
40
- <div
41
- className={cn('relative flex', alignmentClass)}
42
- style={{ paddingBottom: open ? '50vh' : '1rem' }}
43
- >
44
- <motion.button
45
- key={buttonLabel} // Fixed: Use buttonLabel as key instead of undefined idx
46
- onClick={() => setOpen(true)}
47
- className="rounded-md border bg-card px-4 py-2 text-sm font-medium shadow"
48
- >
49
- {buttonLabel}
50
- </motion.button>
51
-
52
- <AnimatePresence>
53
- {open &&
54
- (openMode === 'popover' ? (
55
- <>
56
- <motion.div
57
- ref={wrapperRef}
58
- key="popover"
59
- initial={{ opacity: 0, y: -10 }}
60
- animate={{ opacity: 1, y: 0 }}
61
- exit={{ opacity: 0, y: -10 }}
62
- transition={{ duration: 0.2 }}
63
- className={cn(
64
- 'absolute z-20 rounded-sm bg-card p-4 shadow-lg border border-border'
65
- )}
66
- style={{ width, height, maxWidth: '100%', maxHeight: '100%' }}
67
- >
68
- <RichText data={richTextData} enableGutter={false} />
69
- </motion.div>
70
- {/* <TextFade direction="up" className="absolute z-10 w-full max-w-[8rem] h-auto"> */}
71
- {/* <LottieFeathers className="absolute right-0 -top-[80px] z-0 rotate-[80deg] lottie-wrapper lottie popper-lottie" /> */}
72
- {/* </TextFade> */}
73
- </>
74
- ) : (
75
- <>
76
- <motion.div
77
- ref={wrapperRef}
78
- key="modal"
79
- initial={{ opacity: 0 }}
80
- animate={{ opacity: 1 }}
81
- exit={{ opacity: 0 }}
82
- transition={{ duration: 0.2 }}
83
- className="fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4"
84
- style={{ backdropFilter: 'blur(4px)' }}
85
- >
86
- <div className="card-wrapper relative flex items-center justify-center mx-4 p-1 bgTransBlur-light rounded-lg ">
87
- <div
88
- className="pop-modal-card transition-all duration-300 ease-in-out group relative"
89
- style={{
90
- width: width || '80%',
91
- maxWidth: '500px',
92
- maxHeight: '90vh',
93
- overflowY: 'auto'
94
- }}
95
- >
96
- <button
97
- onClick={() => setOpen(false)}
98
- className="relative right-0 ml-auto flex justify-end text-sm text-gray-500 transition-colors duration-150 hover:text-gray-700"
99
- style={{ background: 'none', border: 'none', cursor: 'pointer' }}
100
- >
101
- Close
102
- </button>
103
- <RichText
104
- data={richTextData}
105
- className="pop-modal-richtext"
106
- enableGutter={false}
107
- />
108
- <DustSvg className="dustsvg dust-svg-modal absolute opacity-0 -z-10 -mt-24 ml-32 scale-0 transition-all duration-300 ease-in-out group-hover:scale-[3] group-hover:opacity-100" />
109
- </div>
110
- </div>
111
- </motion.div>
112
- </>
113
- ))}
114
- </AnimatePresence>
115
- </div>
116
- )
117
- }
1
+ 'use client'
2
+
3
+ import React, { useState, useRef } from 'react'
4
+ import { motion, AnimatePresence } from 'framer-motion'
5
+ import { useClickOutside } from '@/hooks/useClickOutside'
6
+ import { useBodyScrollLock } from '@/hooks/useBodyScrollLock'
7
+ import { cn } from '@/utilities/ui'
8
+ import RichText from '@/components/RichText'
9
+ import DustSvg from './svg-icons/Dust2'
10
+
11
+ interface PopButtonProps {
12
+ buttonLabel: string
13
+ richTextData: any
14
+ width?: string
15
+ height?: string
16
+ position?: 'left' | 'center' | 'right'
17
+ openMode?: 'popover' | 'modal'
18
+ }
19
+
20
+ export const DDButtonPop: React.FC<PopButtonProps> = ({
21
+ buttonLabel,
22
+ richTextData,
23
+ width = '360px',
24
+ height = '240px',
25
+ position = 'center',
26
+ openMode = 'popover',
27
+ }) => {
28
+ const [open, setOpen] = useState(false)
29
+ const wrapperRef = useRef<HTMLDivElement>(null) as React.RefObject<HTMLDivElement>
30
+
31
+ useClickOutside(wrapperRef, () => setOpen(false))
32
+
33
+ // Lock body scroll when modal mode is open
34
+ useBodyScrollLock(open && openMode === 'modal', 'buttonPopScrollY')
35
+
36
+ const alignmentClass =
37
+ position === 'left' ? 'justify-start' : position === 'right' ? 'justify-end' : 'justify-center'
38
+
39
+ return (
40
+ <div
41
+ className={cn('relative flex', alignmentClass)}
42
+ style={{ paddingBottom: open ? '50vh' : '1rem' }}
43
+ >
44
+ <motion.button
45
+ key={buttonLabel} // Fixed: Use buttonLabel as key instead of undefined idx
46
+ onClick={() => setOpen(true)}
47
+ className="rounded-md border bg-card px-4 py-2 text-sm font-medium shadow"
48
+ >
49
+ {buttonLabel}
50
+ </motion.button>
51
+
52
+ <AnimatePresence>
53
+ {open &&
54
+ (openMode === 'popover' ? (
55
+ <>
56
+ <motion.div
57
+ ref={wrapperRef}
58
+ key="popover"
59
+ initial={{ opacity: 0, y: -10 }}
60
+ animate={{ opacity: 1, y: 0 }}
61
+ exit={{ opacity: 0, y: -10 }}
62
+ transition={{ duration: 0.2 }}
63
+ className={cn(
64
+ 'absolute z-20 rounded-sm bg-card p-4 shadow-lg border border-border',
65
+ )}
66
+ style={{ width, height, maxWidth: '100%', maxHeight: '100%' }}
67
+ >
68
+ <RichText data={richTextData} enableGutter={false} />
69
+ </motion.div>
70
+ {/* <TextFade direction="up" className="absolute z-10 w-full max-w-[8rem] h-auto"> */}
71
+ {/* <LottieFeathers className="absolute right-0 -top-[80px] z-0 rotate-[80deg] lottie-wrapper lottie popper-lottie" /> */}
72
+ {/* </TextFade> */}
73
+ </>
74
+ ) : (
75
+ <>
76
+ <motion.div
77
+ ref={wrapperRef}
78
+ key="modal"
79
+ initial={{ opacity: 0 }}
80
+ animate={{ opacity: 1 }}
81
+ exit={{ opacity: 0 }}
82
+ transition={{ duration: 0.2 }}
83
+ className="fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4"
84
+ style={{ backdropFilter: 'blur(4px)' }}
85
+ >
86
+ <div className="card-wrapper relative flex justify-center mx-4 backdrop-blur-md rounded-lg min-h-fit items-start overflow-clip bg-[var(--background)] p-0">
87
+ <div
88
+ className="pop-modal-card transition-all duration-300 ease-in-out group relative p-4"
89
+ style={{
90
+ width: width || '80%',
91
+ maxWidth: '500px',
92
+ maxHeight: '90vh',
93
+ overflowY: 'auto',
94
+ }}
95
+ >
96
+ <button
97
+ onClick={() => setOpen(false)}
98
+
99
+ className="relative right-0 ml-auto flex justify-end text-sm text-gray-500 cursor-pointer rounded-[14px] border-0 bg-[#00000091] px-1 py-0.5 hover:text-[#af0000] backdrop-blur-[10px] drop-shadow-[2px_4px_6px_black] transition-colors duration-150"
100
+ style={{ background: 'none', border: 'none', cursor: 'pointer' }}
101
+ >
102
+ Close
103
+ </button>
104
+ <RichText
105
+ data={richTextData}
106
+ className="pop-modal-richtext"
107
+ enableGutter={false}
108
+ />
109
+ <DustSvg className="dustsvg dust-svg-modal absolute opacity-0 -z-10 -mt-24 ml-32 scale-0 transition-all duration-300 ease-in-out group-hover:scale-[3] group-hover:opacity-100" />
110
+ </div>
111
+ </div>
112
+ </motion.div>
113
+ </>
114
+ ))}
115
+ </AnimatePresence>
116
+ </div>
117
+ )
118
+ }
@@ -146,7 +146,7 @@ export const DDCard: React.FC<CardBlockProps> = ({
146
146
  }) => {
147
147
  if (!cards || cards.length === 0) return null
148
148
 
149
- const baseClasses = ['card-block', 'flex', 'flex-wrap', 'justify-center', 'gap-0']
149
+ const baseClasses = ['card-block', 'mx-auto', 'grid', 'w-full', 'max-w-7xl', 'grid-cols-1', 'gap-6', 'sm:grid-cols-2', 'lg:grid-cols-3']
150
150
  const customBlockClasses = cards
151
151
  .map((card) => card.cardBlockClass || '')
152
152
  .join(' ')
@@ -166,7 +166,7 @@ export const DDCard: React.FC<CardBlockProps> = ({
166
166
  const CardContent = (
167
167
  <motion.div
168
168
  className={cn(
169
- 'border-0 mt-2 mb-2 shadow-md bg-card hover:cursor-pointer overflow-hidden rounded-lg transition-all duration-300 hover:scale-[1.02] hover:shadow-lg w-full max-w-sm mx-auto',
169
+ 'border-0 mt-2 mb-2 w-full overflow-hidden rounded-lg bg-card shadow-md transition-all duration-300 hover:cursor-pointer hover:scale-[1.02] hover:shadow-lg',
170
170
  card.customClass || card.cardBlockClass
171
171
  )}
172
172
  initial={{ opacity: 0, y: 40 }}
@@ -216,7 +216,7 @@ export const DDCard: React.FC<CardBlockProps> = ({
216
216
  <Link
217
217
  key={`card-link-${index}`}
218
218
  href={linkUrl}
219
- className="card-block-content block"
219
+ className="card-block-content block w-full"
220
220
  style={{ textDecoration: 'none' }}
221
221
  >
222
222
  <motion.div data-scroll data-scroll-speed={cardScrollSpeed} className="card-wrapper">
@@ -235,7 +235,7 @@ export const DDCard: React.FC<CardBlockProps> = ({
235
235
  href={linkUrl}
236
236
  target="_blank"
237
237
  rel="noopener noreferrer"
238
- className="card-external-content block"
238
+ className="card-external-content block w-full"
239
239
  style={{ textDecoration: 'none' }}
240
240
  >
241
241
  <motion.div data-scroll data-scroll-speed={cardScrollSpeed} className="card-wrapper">
@@ -18,7 +18,7 @@ function SpotlightCard({
18
18
  className,
19
19
  spotlightColor = 'rgba(214,211,209,0.08)',
20
20
  enableTilt = true,
21
- style
21
+ style,
22
22
  }: SpotlightCardProps) {
23
23
  const cardRef = useRef<HTMLDivElement>(null)
24
24
  const [pos, setPos] = useState<{ x: number; y: number } | null>(null)
@@ -53,7 +53,7 @@ function SpotlightCard({
53
53
  ? {
54
54
  ...style,
55
55
  transform: `perspective(800px) rotateX(${tilt.rx}deg) rotateY(${tilt.ry}deg)`,
56
- transition: 'transform 0.1s ease'
56
+ transition: 'transform 0.1s ease',
57
57
  }
58
58
  : style
59
59
  }
@@ -62,7 +62,7 @@ function SpotlightCard({
62
62
  <div
63
63
  className="pointer-events-none absolute inset-0 z-0 transition-opacity duration-300"
64
64
  style={{
65
- background: `radial-gradient(400px circle at ${pos.x}px ${pos.y}px, ${spotlightColor}, transparent 60%)`
65
+ background: `radial-gradient(400px circle at ${pos.x}px ${pos.y}px, ${spotlightColor}, transparent 60%)`,
66
66
  }}
67
67
  />
68
68
  )}
@@ -93,7 +93,7 @@ export const DDCardTemplate01: React.FC<DDCardTemplate01Props> = ({
93
93
  minHeight = '220px',
94
94
  className,
95
95
  sectionId,
96
- customCSS
96
+ customCSS,
97
97
  }) => {
98
98
  return (
99
99
  <div id={sectionId ?? undefined} className="spotlight-card overflow-clip py-8">
@@ -103,7 +103,7 @@ export const DDCardTemplate01: React.FC<DDCardTemplate01Props> = ({
103
103
  enableTilt={enableTilt ?? true}
104
104
  className={cn(
105
105
  'border border-stone-50 dark:border-stone-950 bg-stone-100 dark:bg-stone-900 hover:shadow-2xl transition-all hover:transition-all duration-900 hover:duration-900 flex flex-col justify-between p-6 max-w-[100rem] mx-auto',
106
- className
106
+ className,
107
107
  )}
108
108
  style={{ minHeight: minHeight ?? '220px' }}
109
109
  >