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
@@ -33,7 +33,7 @@ const defaultServices: ServiceOverviewItem[] = [
33
33
  description:
34
34
  'We begin by understanding the brief, the existing space, operational needs, and the people who will use it every day.',
35
35
  timeline: '8-12 weeks',
36
- engagement: 'Fixed Fee'
36
+ engagement: 'Fixed Fee',
37
37
  },
38
38
  {
39
39
  code: 'SVC-02',
@@ -41,7 +41,7 @@ const defaultServices: ServiceOverviewItem[] = [
41
41
  description:
42
42
  'We translate business goals into a clear spatial direction, balancing brand, movement, function, and atmosphere.',
43
43
  timeline: '12-16 weeks',
44
- engagement: 'Project-based'
44
+ engagement: 'Project-based',
45
45
  },
46
46
  {
47
47
  code: 'SVC-03',
@@ -49,7 +49,7 @@ const defaultServices: ServiceOverviewItem[] = [
49
49
  description:
50
50
  'We develop the interior architecture, material language, lighting, furniture strategy, and practical user experience.',
51
51
  timeline: '16-24 weeks',
52
- engagement: 'Fixed Fee'
52
+ engagement: 'Fixed Fee',
53
53
  },
54
54
  {
55
55
  code: 'SVC-04',
@@ -57,7 +57,7 @@ const defaultServices: ServiceOverviewItem[] = [
57
57
  description:
58
58
  'We prepare the technical drawings, schedules, and coordination notes required for approval, pricing, and buildability.',
59
59
  timeline: '8-12 weeks',
60
- engagement: 'Project-based'
60
+ engagement: 'Project-based',
61
61
  },
62
62
  {
63
63
  code: 'SVC-05',
@@ -65,7 +65,7 @@ const defaultServices: ServiceOverviewItem[] = [
65
65
  description:
66
66
  'We support selection, specification, and sourcing so the design intent remains consistent through delivery.',
67
67
  timeline: '12-16 weeks',
68
- engagement: 'Fixed Fee'
68
+ engagement: 'Fixed Fee',
69
69
  },
70
70
  {
71
71
  code: 'SVC-06',
@@ -73,8 +73,8 @@ const defaultServices: ServiceOverviewItem[] = [
73
73
  description:
74
74
  'We help close the project with practical review, refinements, and alignment between the completed space and the original intent.',
75
75
  timeline: '16-24 weeks',
76
- engagement: 'Project-based'
77
- }
76
+ engagement: 'Project-based',
77
+ },
78
78
  ]
79
79
 
80
80
  function getServices(services?: ServiceOverviewItem[] | null) {
@@ -116,7 +116,7 @@ export const DDHGServiceOverview: React.FC<DDHGServiceOverviewProps> = ({
116
116
  scrollSpeed,
117
117
  eyebrowPrefix = 'service',
118
118
  eyebrowEmphasis = 'catalog',
119
- services
119
+ services,
120
120
  }) => {
121
121
  const serviceItems = useMemo(() => getServices(services), [services])
122
122
  const [activeIndex, setActiveIndex] = useState(0)
@@ -141,7 +141,7 @@ export const DDHGServiceOverview: React.FC<DDHGServiceOverviewProps> = ({
141
141
  transition={{ duration: 0.9, ease: [0.22, 1, 0.36, 1] }}
142
142
  >
143
143
  {(eyebrowPrefix || eyebrowEmphasis) && (
144
- <p className="ServiceOverview03 mb-2 text-[10px] uppercase tracking-[0.2em] text-stone-600 dark:text-stone-300">
144
+ <p className="ServiceOverview03 mb-2 text-xs uppercase tracking-[0.2em] text-stone-600 dark:text-stone-300">
145
145
  {eyebrowPrefix && <span className="font-light">{eyebrowPrefix} </span>}
146
146
  {eyebrowEmphasis && <span className="font-medium">{eyebrowEmphasis}</span>}
147
147
  </p>
@@ -168,17 +168,17 @@ export const DDHGServiceOverview: React.FC<DDHGServiceOverviewProps> = ({
168
168
  <div className="ServiceOverview08 flex flex-col items-center text-center">
169
169
  <div
170
170
  className={cn(
171
- 'ServiceOverview09 mb-3 flex h-12 w-12 items-center justify-center border transition-all duration-500',
171
+ 'ServiceOverview09 mb-3 flex h-12 w-12 items-center justify-center rounded-md squircle border transition-all duration-500',
172
172
  isActive
173
173
  ? 'border-[#444444] bg-[#444444]'
174
- : 'border-[#444444] bg-[#e5e7eb] group-hover:border-[#A8A29E]'
174
+ : 'border-[#444444] bg-[#e5e7eb] group-hover:border-[#A8A29E]',
175
175
  )}
176
- style={{ borderRadius: '2px' }}
176
+ style={{ borderRadius: '6px' }}
177
177
  >
178
178
  <span
179
179
  className={cn(
180
180
  'ServiceOverview10 text-xs font-semibold transition-colors duration-500',
181
- isActive ? 'text-[#F5F3EF]' : 'text-stone-600 dark:text-stone-300'
181
+ isActive ? 'text-[#F5F3EF]' : 'text-stone-600 dark:text-stone-300',
182
182
  )}
183
183
  >
184
184
  {String(i + 1).padStart(2, '0')}
@@ -186,16 +186,16 @@ export const DDHGServiceOverview: React.FC<DDHGServiceOverviewProps> = ({
186
186
  </div>
187
187
  <span
188
188
  className={cn(
189
- 'ServiceOverview11 text-[13px] font-medium uppercase tracking-[0.1em] transition-colors duration-500',
189
+ 'ServiceOverview11 text-base font-medium uppercase tracking-widest transition-colors duration-500',
190
190
  isActive
191
191
  ? 'text-stone-700 dark:text-stone-200'
192
- : 'text-stone-600 dark:text-stone-300 group-hover:text-stone-700'
192
+ : 'text-stone-600 dark:text-stone-300 group-hover:text-stone-700',
193
193
  )}
194
194
  >
195
195
  {service.title}
196
196
  </span>
197
197
  {service.code && (
198
- <span className="ServiceOverview12 mt-1 font-mono text-[10px] text-stone-600 dark:text-stone-300">
198
+ <span className="ServiceOverview12 mt-1 font-mono text-xs text-stone-600 dark:text-stone-300">
199
199
  {service.code}
200
200
  </span>
201
201
  )}
@@ -213,15 +213,15 @@ export const DDHGServiceOverview: React.FC<DDHGServiceOverviewProps> = ({
213
213
  transition={{ duration: 0.2, delay: 0.05, ease: [0.22, 1, 0.36, 1] }}
214
214
  >
215
215
  <motion.div
216
- className="ServiceOverview14 z-plane-1 p-6 md:p-8"
216
+ className="ServiceOverview14 z-plane-1 rounded-md squircle border border-stone-300 bg-stone-100/50 p-6 transition-all duration-300 dark:border-stone-700/10 dark:bg-stone-900/50 md:p-8"
217
217
  initial={{ x: -40, filter: 'blur(20px)', opacity: 0 }}
218
218
  animate={{ x: 0, filter: 'blur(0px)', opacity: 1 }}
219
219
  transition={{ duration: 0.2, delay: 0.08, ease: [0.22, 1, 0.36, 1] }}
220
220
  >
221
221
  <div className="flex flex-col gap-6 md:flex-row md:gap-10">
222
- <div className="flex-shrink-0">
222
+ <div className="shrink-0">
223
223
  {activeService.code && (
224
- <span className="mb-2 block font-mono text-[10px] uppercase tracking-[0.15em] text-stone-600 dark:text-stone-300">
224
+ <span className="mb-2 block font-mono text-xs uppercase tracking-[0.15em] text-stone-600 dark:text-stone-300">
225
225
  {activeService.code}
226
226
  </span>
227
227
  )}
@@ -237,9 +237,9 @@ export const DDHGServiceOverview: React.FC<DDHGServiceOverviewProps> = ({
237
237
  </p>
238
238
  )}
239
239
  </div>
240
- <div className="flex flex-grow flex-col gap-5 md:flex-row md:items-center md:gap-8">
240
+ <div className="flex grow flex-col gap-5 md:flex-row md:items-center md:gap-8">
241
241
  <div className="text-center">
242
- <p className="mb-1 text-[10px] uppercase tracking-[0.15em] text-stone-600 dark:text-stone-300">
242
+ <p className="mb-1 text-xs uppercase tracking-[0.15em] text-stone-600 dark:text-stone-300">
243
243
  Typical Timeline
244
244
  </p>
245
245
  <p className="text-md font-semibold text-stone-700 dark:text-stone-200">
@@ -248,7 +248,7 @@ export const DDHGServiceOverview: React.FC<DDHGServiceOverviewProps> = ({
248
248
  </div>
249
249
  <div className="hidden h-10 w-px bg-stone-500 md:block" />
250
250
  <div className="text-center">
251
- <p className="mb-1 text-[10px] uppercase tracking-[0.15em] text-stone-600 dark:text-stone-300">
251
+ <p className="mb-1 text-xs uppercase tracking-[0.15em] text-stone-600 dark:text-stone-300">
252
252
  Deliverables
253
253
  </p>
254
254
  <p className="inline-flex items-center gap-2 text-md font-semibold text-stone-700 dark:text-stone-200">
@@ -258,7 +258,7 @@ export const DDHGServiceOverview: React.FC<DDHGServiceOverviewProps> = ({
258
258
  </div>
259
259
  <div className="hidden h-10 w-px bg-stone-500 md:block" />
260
260
  <div className="text-center">
261
- <p className="mb-1 text-[10px] uppercase tracking-[0.15em] text-stone-600 dark:text-stone-300">
261
+ <p className="mb-1 text-xs uppercase tracking-[0.15em] text-stone-600 dark:text-stone-300">
262
262
  Engagement
263
263
  </p>
264
264
  <p className="text-md font-semibold text-stone-700 dark:text-stone-200">
@@ -11,7 +11,7 @@ import {
11
11
  RefreshCw,
12
12
  ShieldCheck,
13
13
  User,
14
- UserStar
14
+ UserStar,
15
15
  } from 'lucide-react'
16
16
  import React, { useState } from 'react'
17
17
 
@@ -69,33 +69,33 @@ const defaultTrustBadges: TrustBadge[] = [
69
69
  {
70
70
  icon: 'shieldCheck',
71
71
  title: 'Transparent Pricing',
72
- description: 'Every quote is itemized. No hidden fees, no surprise charges at the end.'
72
+ description: 'Every quote is itemized. No hidden fees, no surprise charges at the end.',
73
73
  },
74
74
  {
75
75
  icon: 'calendarCheck',
76
76
  title: 'Fixed Timeline Guarantee',
77
- description: 'We commit to a delivery date and stick to it. If we miss it, you get a credit.'
77
+ description: 'We commit to a delivery date and stick to it. If we miss it, you get a credit.',
78
78
  },
79
79
  {
80
80
  icon: 'userStar',
81
81
  title: 'Dedicated Project Lead',
82
- description: 'One senior designer owns your project from kickoff to handover. No handoffs.'
82
+ description: 'One senior designer owns your project from kickoff to handover. No handoffs.',
83
83
  },
84
84
  {
85
85
  icon: 'fileText',
86
86
  title: 'Full Documentation',
87
- description: 'Every finish, fixture, and specification is documented for future reference.'
87
+ description: 'Every finish, fixture, and specification is documented for future reference.',
88
88
  },
89
89
  {
90
90
  icon: 'refreshCw',
91
91
  title: 'Revision Rounds Included',
92
- description: 'Three structured revision cycles are included in every engagement.'
92
+ description: 'Three structured revision cycles are included in every engagement.',
93
93
  },
94
94
  {
95
95
  icon: 'handHeart',
96
96
  title: 'Post-Completion Support',
97
- description: '30 days of complimentary support after handover. We stand by our work.'
98
- }
97
+ description: '30 days of complimentary support after handover. We stand by our work.',
98
+ },
99
99
  ]
100
100
 
101
101
  const defaultTestimonials: TestimonialItem[] = [
@@ -103,42 +103,42 @@ const defaultTestimonials: TestimonialItem[] = [
103
103
  quote:
104
104
  'They delivered exactly what they promised, on the date they promised it, at the price they quoted. That alone is rare in this industry.',
105
105
  author: 'Margaret Chen',
106
- role: 'Director of Operations, Meridian Holdings'
106
+ role: 'Director of Operations, Meridian Holdings',
107
107
  },
108
108
  {
109
109
  quote:
110
110
  'The transparency throughout the process was remarkable. We knew exactly where we stood at every phase. No surprises.',
111
111
  author: 'James Oduya',
112
- role: 'Founder, The Atelier Collective'
113
- }
112
+ role: 'Founder, The Atelier Collective',
113
+ },
114
114
  ]
115
115
 
116
116
  const defaultFaqs: FAQItem[] = [
117
117
  {
118
118
  question: 'How long does a typical project take?',
119
119
  answer:
120
- 'Project timelines vary based on scope. A residential interior typically takes 8-16 weeks from concept to completion. Commercial fit-outs range from 12-24 weeks. We provide detailed timelines during our initial consultation.'
120
+ 'Project timelines vary based on scope. A residential interior typically takes 8-16 weeks from concept to completion. Commercial fit-outs range from 12-24 weeks. We provide detailed timelines during our initial consultation.',
121
121
  },
122
122
  {
123
123
  question: 'Do you handle both design and construction?',
124
124
  answer:
125
- 'Yes, our Turn-Key Services cover the complete journey from initial concept through construction to final handover. We coordinate all contractors and trades, ensuring the design vision is executed faithfully.'
125
+ 'Yes, our Turn-Key Services cover the complete journey from initial concept through construction to final handover. We coordinate all contractors and trades, ensuring the design vision is executed faithfully.',
126
126
  },
127
127
  {
128
128
  question: 'Can you work with existing furniture and art?',
129
129
  answer:
130
- 'Absolutely. Our Atmospheric Curation service specializes in integrating existing pieces into new designs. We view heirlooms and collected art as anchors of identity within the space.'
130
+ 'Absolutely. Our Atmospheric Curation service specializes in integrating existing pieces into new designs. We view heirlooms and collected art as anchors of identity within the space.',
131
131
  },
132
132
  {
133
133
  question: 'What is your fee structure?',
134
134
  answer:
135
- 'We offer both fixed-fee and percentage-based pricing depending on project type. Design Consultancy is typically fixed-fee, while Turn-Key projects use a percentage of construction cost. We provide transparent quotes upfront.'
135
+ 'We offer both fixed-fee and percentage-based pricing depending on project type. Design Consultancy is typically fixed-fee, while Turn-Key projects use a percentage of construction cost. We provide transparent quotes upfront.',
136
136
  },
137
137
  {
138
138
  question: 'Do you offer sustainability-focused design?',
139
139
  answer:
140
- 'Sustainability is woven into our material selection and spatial planning. We prioritize low-VOC finishes, responsibly sourced materials, energy-efficient lighting, and biophilic elements that reduce environmental impact.'
141
- }
140
+ 'Sustainability is woven into our material selection and spatial planning. We prioritize low-VOC finishes, responsibly sourced materials, energy-efficient lighting, and biophilic elements that reduce environmental impact.',
141
+ },
142
142
  ]
143
143
 
144
144
  const iconMap = {
@@ -148,13 +148,13 @@ const iconMap = {
148
148
  fileText: FileText,
149
149
  refreshCw: RefreshCw,
150
150
  handHeart: HandHeart,
151
- clipboardList: ClipboardList
151
+ clipboardList: ClipboardList,
152
152
  }
153
153
 
154
154
  function RevealBlock({
155
155
  children,
156
156
  className,
157
- delay = 0
157
+ delay = 0,
158
158
  }: {
159
159
  children: React.ReactNode
160
160
  className?: string
@@ -190,7 +190,7 @@ export const DDHGStatsFAQ: React.FC<DDHGStatsFAQProps> = ({
190
190
  faqEyebrowEmphasis = 'questions',
191
191
  faqHeading = 'FAQ',
192
192
  showFaqDivider = true,
193
- faqs
193
+ faqs,
194
194
  }) => {
195
195
  const [openFAQ, setOpenFAQ] = useState<number | null>(null)
196
196
  const testimonialItems = getItems(testimonials, defaultTestimonials)
@@ -213,29 +213,29 @@ export const DDHGStatsFAQ: React.FC<DDHGStatsFAQProps> = ({
213
213
  {testimonialItems.map((testimonial, i) => (
214
214
  <div
215
215
  key={testimonial.id || `testimonial-${i}`}
216
- className="z-plane-1 chamfer-accent p-6 md:p-8"
216
+ className="z-plane-1 chamfer-accent rounded-md squircle border border-stone-300 bg-stone-100/50 p-6 transition-all duration-300 dark:border-stone-700/10 dark:bg-stone-900/50 md:p-8"
217
217
  >
218
218
  <div className="mb-4 h-px w-8 bg-[#C4A882]" />
219
219
  {testimonial.quote && (
220
- <p className="mb-6 text-[13px] font-light leading-relaxed text-stone-700 dark:text-stone-200">
220
+ <p className="mb-6 text-base font-light leading-relaxed text-stone-700 dark:text-stone-200">
221
221
  &ldquo;{testimonial.quote}&rdquo;
222
222
  </p>
223
223
  )}
224
224
  <div className="flex items-center gap-3">
225
225
  <div
226
226
  className="flex h-8 w-8 items-center justify-center bg-stone-500"
227
- style={{ borderRadius: '2px' }}
227
+ style={{ borderRadius: '6px' }}
228
228
  >
229
229
  <User className="h-3.5 w-3.5 text-stone-50" strokeWidth={1.6} />
230
230
  </div>
231
231
  <div>
232
232
  {testimonial.author && (
233
- <p className="text-[13px] font-medium text-stone-700 dark:text-stone-200">
233
+ <p className="text-base font-medium text-stone-700 dark:text-stone-200">
234
234
  {testimonial.author}
235
235
  </p>
236
236
  )}
237
237
  {testimonial.role && (
238
- <p className="text-[13px] text-stone-600 dark:text-stone-300">
238
+ <p className="text-base text-stone-600 dark:text-stone-300">
239
239
  {testimonial.role}
240
240
  </p>
241
241
  )}
@@ -249,10 +249,10 @@ export const DDHGStatsFAQ: React.FC<DDHGStatsFAQProps> = ({
249
249
 
250
250
  {badgeItems.length > 0 && (
251
251
  <RevealBlock className="whytrustus-section mb-16">
252
- <div className="z-plane-1 p-6 md:p-8">
252
+ <div className="z-plane-1 rounded-md squircle border border-stone-300 bg-stone-100/50 p-6 dark:border-stone-700/10 dark:bg-stone-900/50 md:p-8">
253
253
  <div className="mb-6">
254
254
  {commitmentLabel && (
255
- <p className="mb-2 font-mono text-[13px] uppercase tracking-[0.15em] text-stone-600 dark:text-stone-300">
255
+ <p className="mb-2 font-mono text-base uppercase tracking-[0.15em] text-stone-600 dark:text-stone-300">
256
256
  {commitmentLabel}
257
257
  </p>
258
258
  )}
@@ -269,19 +269,19 @@ export const DDHGStatsFAQ: React.FC<DDHGStatsFAQProps> = ({
269
269
  return (
270
270
  <div
271
271
  key={badge.id || `${badge.title || 'badge'}-${i}`}
272
- className="arch-edge-sm flex items-start gap-3 border border-[#D9D7D1] p-4"
272
+ className="arch-edge-sm flex items-start gap-3 rounded-md squircle border border-stone-300 bg-stone-100/50 p-4 transition-all duration-300 hover:-translate-y-1 hover:shadow-lg dark:border-stone-700/10 dark:bg-stone-900/50"
273
273
  >
274
- <div className="mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center">
274
+ <div className="mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center">
275
275
  <Icon className="h-4 w-4 text-[#C4A882]" strokeWidth={1.7} />
276
276
  </div>
277
277
  <div>
278
278
  {badge.title && (
279
- <p className="mb-1 text-[13px] font-medium text-stone-700 dark:text-stone-200">
279
+ <p className="mb-1 text-base font-medium text-stone-700 dark:text-stone-200">
280
280
  {badge.title}
281
281
  </p>
282
282
  )}
283
283
  {description && (
284
- <p className="text-[10px] font-light leading-relaxed text-stone-700 dark:text-stone-200">
284
+ <p className="text-xs font-light leading-relaxed text-stone-700 dark:text-stone-200">
285
285
  {description}
286
286
  </p>
287
287
  )}
@@ -296,7 +296,7 @@ export const DDHGStatsFAQ: React.FC<DDHGStatsFAQProps> = ({
296
296
 
297
297
  <RevealBlock className="faq-section max-w-4xl mx-auto mb-10">
298
298
  {(faqEyebrowPrefix || faqEyebrowEmphasis) && (
299
- <p className="mb-2 text-[10px] uppercase tracking-[0.2em] text-stone-600 dark:text-stone-300">
299
+ <p className="mb-2 text-xs uppercase tracking-[0.2em] text-stone-600 dark:text-stone-300">
300
300
  {faqEyebrowPrefix && <span className="font-light">{faqEyebrowPrefix} </span>}
301
301
  {faqEyebrowEmphasis && <span className="font-medium">{faqEyebrowEmphasis}</span>}
302
302
  </p>
@@ -320,9 +320,9 @@ export const DDHGStatsFAQ: React.FC<DDHGStatsFAQProps> = ({
320
320
  <RevealBlock key={faq.id || `${question || 'faq'}-${i}`} delay={i * 0.06}>
321
321
  <div
322
322
  className={cn(
323
- 'accordion-card z-plane-1 border-border border chamfer-accent transition-all duration-300',
323
+ 'accordion-card z-plane-1 rounded-md squircle border-border border chamfer-accent bg-stone-100/50 transition-all duration-300 dark:bg-stone-900/50',
324
324
  isOpen &&
325
- 'border-border border z-depth-hover hover:shadow-2xl hover:-translate-y-2'
325
+ 'border-border border z-depth-hover hover:shadow-2xl hover:-translate-y-2',
326
326
  )}
327
327
  >
328
328
  <button
@@ -332,7 +332,7 @@ export const DDHGStatsFAQ: React.FC<DDHGStatsFAQProps> = ({
332
332
  aria-expanded={isOpen}
333
333
  >
334
334
  <div className="flex items-center gap-4">
335
- <span className="font-mono text-[13px] text-stone-600 dark:text-stone-300">
335
+ <span className="font-mono text-base text-stone-600 dark:text-stone-300">
336
336
  {String(i + 1).padStart(2, '0')}
337
337
  </span>
338
338
  {question && (
@@ -343,15 +343,15 @@ export const DDHGStatsFAQ: React.FC<DDHGStatsFAQProps> = ({
343
343
  </div>
344
344
  <div
345
345
  className={cn(
346
- 'ml-4 flex h-6 w-6 flex-shrink-0 items-center justify-center border border-[#D9D7D1] transition-all duration-300',
347
- isOpen && 'border-[#292524] bg-[#292524]'
346
+ 'ml-4 flex h-6 w-6 shrink-0 items-center justify-center rounded-md squircle border border-stone-300 dark:border-stone-700/10 transition-all duration-300',
347
+ isOpen && 'border-[#292524] bg-[#292524]',
348
348
  )}
349
- style={{ borderRadius: '2px' }}
349
+ style={{ borderRadius: '6px' }}
350
350
  >
351
351
  <ToggleIcon
352
352
  className={cn(
353
353
  'h-3 w-3',
354
- isOpen ? 'text-[#F5F3EF]' : 'text-stone-600 dark:text-stone-300'
354
+ isOpen ? 'text-[#F5F3EF]' : 'text-stone-600 dark:text-stone-300',
355
355
  )}
356
356
  strokeWidth={1.8}
357
357
  />
@@ -368,7 +368,7 @@ export const DDHGStatsFAQ: React.FC<DDHGStatsFAQProps> = ({
368
368
  >
369
369
  <div className="px-5 pb-5 pl-14 md:px-6 md:pb-6 md:pl-16">
370
370
  <div className="mb-4 h-px w-full bg-stone-500" />
371
- <p className="text-[13px] font-light leading-relaxed text-stone-700 dark:text-stone-200">
371
+ <p className="text-base font-light leading-relaxed text-stone-700 dark:text-stone-200">
372
372
  {answer}
373
373
  </p>
374
374
  </div>