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.
- package/package.json +5 -2
- package/src/cli.js +39 -3
- package/src/commands/shop.js +59 -0
- package/src/commands/warehouse.js +73 -0
- package/src/installers/patchRenderBlocks.js +1 -1
- package/src/registry/validateTemplateManifest.js +2 -1
- package/templates/blocks/BannerDD790432/Component.tsx +63 -0
- package/templates/blocks/BannerDD790432/config.ts +54 -0
- package/templates/blocks/BannerDD790432/manifest.json +80 -0
- package/templates/blocks/Button47/Component.tsx +124 -0
- package/templates/blocks/Button47/config.ts +75 -0
- package/templates/blocks/Button47/link.ts +22 -0
- package/templates/blocks/Button47/manifest.json +105 -0
- package/templates/blocks/Button47/styles.module.scss +75 -0
- package/templates/blocks/DD-Accordion/Component.tsx +55 -36
- package/templates/blocks/DD-Accordion/config.ts +71 -59
- package/templates/blocks/DD-AnimText/Component.tsx +50 -32
- package/templates/blocks/DD-AnimText/config.ts +296 -295
- package/templates/blocks/DD-AsideNav/Component.tsx +323 -319
- package/templates/blocks/DD-Banner/Component.tsx +54 -51
- package/templates/blocks/DD-BookCall/Component.tsx +10 -9
- package/templates/blocks/DD-ButtonPop/Component.tsx +118 -117
- package/templates/blocks/DD-Card/Component.tsx +4 -4
- package/templates/blocks/DD-CardTemplate01/Component.tsx +5 -5
- package/templates/blocks/DD-CardsWithVariantV3/Component.tsx +472 -0
- package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/index.tsx +203 -0
- package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/styles.ts +87 -0
- package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/useInjectStyle.ts +39 -0
- package/templates/blocks/DD-CardsWithVariantV3/config.ts +326 -0
- package/templates/blocks/DD-CardsWithVariantV3/manifest.json +110 -0
- package/templates/blocks/DD-Carousel-A/Component.tsx +251 -249
- package/templates/blocks/DD-Carousel-B/Component.tsx +405 -403
- package/templates/blocks/DD-Chip/Component.tsx +14 -14
- package/templates/blocks/DD-ComparisonTable/Component.tsx +255 -256
- package/templates/blocks/DD-Contact/Component.tsx +433 -434
- package/templates/blocks/DD-Counter/Component.tsx +18 -13
- package/templates/blocks/DD-DeliCard/Component.tsx +303 -0
- package/templates/blocks/DD-DeliCard/config.ts +186 -0
- package/templates/blocks/DD-DeliCard/manifest.json +94 -0
- package/templates/blocks/DD-FeatCat/Component.tsx +302 -302
- package/templates/blocks/DD-FeatProd/CircularGallery.tsx +1179 -0
- package/templates/blocks/DD-FeatProd/Component.tsx +484 -0
- package/templates/blocks/DD-FeatProd/config.ts +173 -0
- package/templates/blocks/DD-FeatProd/manifest.json +93 -0
- package/templates/blocks/DD-FeatServ/Component.tsx +607 -0
- package/templates/blocks/DD-FeatServ/config.ts +213 -0
- package/templates/blocks/DD-FeatServ/manifest.json +113 -0
- package/templates/blocks/DD-FeatStrip/Component.tsx +584 -585
- package/templates/blocks/DD-FluidBtn/ButtonsEyeCatching.tsx +627 -628
- package/templates/blocks/DD-FluidBtn/Component.tsx +46 -43
- package/templates/blocks/DD-GooeyInfo/Component.tsx +150 -149
- package/templates/blocks/DD-GooeyInfo/config.ts +136 -135
- package/templates/blocks/DD-Hero/Component.tsx +16 -40
- package/templates/blocks/DD-HeroPlas/Component.tsx +50 -0
- package/templates/blocks/DD-HeroPlas/ThreeScene.tsx +109 -0
- package/templates/blocks/DD-HeroPlas/config.ts +33 -0
- package/templates/blocks/DD-HeroPlas/manifest.json +88 -0
- package/templates/blocks/DD-HorizontalScroll/Component.tsx +4 -5
- package/templates/blocks/DD-Icon/Component.tsx +46 -81
- package/templates/blocks/DD-IconButton/Component.tsx +13 -20
- package/templates/blocks/DD-IdTag/Component.tsx +22 -21
- package/templates/blocks/DD-IframeMedia/Component.tsx +14 -10
- package/templates/blocks/DD-LineAnim/Component.tsx +42 -36
- package/templates/blocks/DD-LogoMarq/Component.tsx +38 -48
- package/templates/blocks/DD-Lottie/Component.tsx +11 -3
- package/templates/blocks/DD-MasonaryMedia/Component.tsx +544 -547
- package/templates/blocks/DD-MasonaryMedia/config.ts +389 -389
- package/templates/blocks/DD-Masonry/Component.tsx +654 -644
- package/templates/blocks/DD-Masonry/config.ts +475 -475
- package/templates/blocks/DD-MaterialSwatches/Component.tsx +85 -0
- package/templates/blocks/DD-MaterialSwatches/config.ts +232 -0
- package/templates/blocks/DD-MaterialSwatches/manifest.json +84 -0
- package/templates/blocks/DD-MaterialSwatches/material.ts +107 -0
- package/templates/blocks/DD-NineCanvas/Component.tsx +129 -0
- package/templates/blocks/DD-NineCanvas/RenderBlocks.tsx +244 -0
- package/templates/blocks/DD-NineCanvas/allowedCanvasBlocks.ts +6 -0
- package/templates/blocks/DD-NineCanvas/blockComponents.tsx +8 -0
- package/templates/blocks/DD-NineCanvas/canvas/CanvasGrid.tsx +316 -0
- package/templates/blocks/DD-NineCanvas/canvas/RadialNav.tsx +432 -0
- package/templates/blocks/DD-NineCanvas/canvas/canvas-panels.css +889 -0
- package/templates/blocks/DD-NineCanvas/canvas/icons/custom-icons.tsx +364 -0
- package/templates/blocks/DD-NineCanvas/config.ts +61 -0
- package/templates/blocks/DD-NineCanvas/manifest.json +165 -0
- package/templates/blocks/DD-NineCanvas/styles.scss +152 -0
- package/templates/blocks/DD-NineCanvas/tooltip/get-strict-context.tsx +26 -0
- package/templates/blocks/DD-NineCanvas/tooltip/primitives.tsx +178 -0
- package/templates/blocks/DD-NineCanvas/tooltip/tooltip.tsx +71 -0
- package/templates/blocks/DD-NineCanvas/tooltip/use-controlled-state.tsx +33 -0
- package/templates/blocks/DD-NineCanvas/utilities/FadeOnScroll.tsx +68 -0
- package/templates/blocks/DD-NineCanvas/utilities/ParallaxWrapper.tsx +157 -0
- package/templates/blocks/DD-NineCanvas/utilities/renderCustomCSS.ts +5 -0
- package/templates/blocks/DD-NineCanvas/utilities/webglCleanup.ts +27 -0
- package/templates/blocks/DD-PayloadAIAssistant/Component.tsx +78 -0
- package/templates/blocks/DD-PayloadAIAssistant/DustedBot.tsx +590 -0
- package/templates/blocks/DD-PayloadAIAssistant/config.ts +37 -0
- package/templates/blocks/DD-PayloadAIAssistant/demo.css +125 -0
- package/templates/blocks/DD-PayloadAIAssistant/manifest.json +93 -0
- package/templates/blocks/DD-PayloadAIAssistant/source-defaults.ts +17 -0
- package/templates/blocks/DD-PayloadAIAssistant/styles.ts +306 -0
- package/templates/blocks/DD-Pricing/Component.tsx +368 -372
- package/templates/blocks/DD-Pricing/config.ts +215 -215
- package/templates/blocks/DD-Process/Component.tsx +147 -149
- package/templates/blocks/DD-Progress/Component.tsx +156 -141
- package/templates/blocks/DD-ProjHeader/Component.tsx +93 -91
- package/templates/blocks/DD-ProjSlider/Component.tsx +1 -1
- package/templates/blocks/DD-ProjSlider/config.ts +2 -2
- package/templates/blocks/DD-Section/Component.tsx +265 -266
- package/templates/blocks/DD-Separator/Component.tsx +66 -66
- package/templates/blocks/DD-Services/Component.tsx +176 -176
- package/templates/blocks/DD-ShowcaseGrid/Component.tsx +306 -307
- package/templates/blocks/DD-Slider-A/Component.tsx +237 -237
- package/templates/blocks/DD-StackCards/Component.tsx +474 -473
- package/templates/blocks/DD-Team/Component.tsx +247 -247
- package/templates/blocks/DD-TeamCards/Component.tsx +251 -251
- package/templates/blocks/DD-TechStack/Component.tsx +161 -168
- package/templates/blocks/DD-TestMarq/Component.tsx +158 -132
- package/templates/blocks/DD-Testim/Component.tsx +247 -247
- package/templates/blocks/DD-Testim2/Component.tsx +265 -256
- package/templates/blocks/DD-Testimonials/Component.tsx +139 -147
- package/templates/blocks/DD-TextMarq/Component.tsx +157 -157
- package/templates/blocks/DD-Thanks/Component.tsx +501 -500
- package/templates/blocks/DD-Work/Component.tsx +315 -315
- package/templates/blocks/DD-Work-B/Component.tsx +294 -294
- package/templates/blocks/DDHG-CTASection2/Component.tsx +183 -184
- package/templates/blocks/DDHG-HighlightArc/Component.tsx +246 -243
- package/templates/blocks/DDHG-LogoMarquee/Component.tsx +180 -93
- package/templates/blocks/DDHG-LogoMarquee/config.ts +154 -66
- package/templates/blocks/DDHG-NavCodeGrid/Component.tsx +225 -213
- package/templates/blocks/DDHG-ProcessSec/Component.tsx +38 -39
- package/templates/blocks/DDHG-ServiceDetails/Component.tsx +11 -11
- package/templates/blocks/DDHG-ServiceDetails/ServiceDetailCard.tsx +30 -47
- package/templates/blocks/DDHG-ServiceHero/Component.tsx +10 -10
- package/templates/blocks/DDHG-ServiceOverview/Component.tsx +23 -23
- package/templates/blocks/DDHG-StatsFAQ/Component.tsx +40 -40
- package/templates/blocks/DDHG-TeamCards/Component.tsx +140 -131
- package/templates/blocks/Form/Checkbox/index.tsx +45 -0
- package/templates/blocks/Form/Component.tsx +163 -0
- package/templates/blocks/Form/Country/index.tsx +65 -0
- package/templates/blocks/Form/Country/options.ts +982 -0
- package/templates/blocks/Form/Email/index.tsx +38 -0
- package/templates/blocks/Form/Error/index.tsx +15 -0
- package/templates/blocks/Form/Message/index.tsx +13 -0
- package/templates/blocks/Form/Number/index.tsx +36 -0
- package/templates/blocks/Form/Select/index.tsx +63 -0
- package/templates/blocks/Form/State/index.tsx +64 -0
- package/templates/blocks/Form/State/options.ts +52 -0
- package/templates/blocks/Form/Text/index.tsx +32 -0
- package/templates/blocks/Form/Textarea/index.tsx +40 -0
- package/templates/blocks/Form/Width/index.tsx +13 -0
- package/templates/blocks/Form/config.ts +51 -0
- package/templates/blocks/Form/fields.tsx +21 -0
- package/templates/blocks/Form/manifest.json +168 -0
- package/templates/blocks/MediaBlock/Component.tsx +67 -0
- package/templates/blocks/MediaBlock/config.ts +14 -0
- package/templates/blocks/MediaBlock/manifest.json +92 -0
- package/templates/blocks/TransitionsDustedShowcase/Component.tsx +9 -0
- package/templates/blocks/TransitionsDustedShowcase/config.ts +13 -0
- package/templates/blocks/TransitionsDustedShowcase/manifest.json +80 -0
- package/templates/blocks/rawHtml/Component.tsx +25 -0
- package/templates/blocks/rawHtml/config.ts +56 -0
- 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-
|
|
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: '
|
|
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-
|
|
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-
|
|
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="
|
|
222
|
+
<div className="shrink-0">
|
|
223
223
|
{activeService.code && (
|
|
224
|
-
<span className="mb-2 block font-mono text-
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
220
|
+
<p className="mb-6 text-base font-light leading-relaxed text-stone-700 dark:text-stone-200">
|
|
221
221
|
“{testimonial.quote}”
|
|
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: '
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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: '
|
|
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-
|
|
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>
|