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
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "block",
|
|
3
|
+
"name": "DD-HeroPlas",
|
|
4
|
+
"label": "Hero Plastics",
|
|
5
|
+
"sourceName": "DD-HeroPlas",
|
|
6
|
+
"portableName": "DD-HeroPlas",
|
|
7
|
+
"slug": "DD-HeroPlas",
|
|
8
|
+
"version": "0.0.1",
|
|
9
|
+
"source": {
|
|
10
|
+
"repo": "Hadizainal/Dusted-Payload-Blocks",
|
|
11
|
+
"originalPath": "CLI-TestGround/dusted-blocks-demo/src/blocks/DD-HeroPlas",
|
|
12
|
+
"originalSlug": "DD-HeroPlas",
|
|
13
|
+
"originalConfigExport": "DDHeroPlas",
|
|
14
|
+
"originalComponentExport": "DDHeroPlas",
|
|
15
|
+
"originalInterfaceName": "DDHeroPlas"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
{
|
|
19
|
+
"from": "Component.tsx",
|
|
20
|
+
"to": "src/blocks/DD-HeroPlas/Component.tsx"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"from": "ThreeScene.tsx",
|
|
24
|
+
"to": "src/blocks/DD-HeroPlas/ThreeScene.tsx"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"from": "config.ts",
|
|
28
|
+
"to": "src/blocks/DD-HeroPlas/config.ts"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"dependencies": [
|
|
32
|
+
"@react-three/drei",
|
|
33
|
+
"@react-three/fiber",
|
|
34
|
+
"three"
|
|
35
|
+
],
|
|
36
|
+
"sharedFiles": [],
|
|
37
|
+
"requiredProjectFiles": [
|
|
38
|
+
{
|
|
39
|
+
"path": "src/utilities/ui.ts",
|
|
40
|
+
"reason": "Component imports cn from @/utilities/ui."
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"optionalProjectFiles": [],
|
|
44
|
+
"collectionRegistration": {
|
|
45
|
+
"enabled": true,
|
|
46
|
+
"collections": [
|
|
47
|
+
"Pages",
|
|
48
|
+
"Posts"
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
"renderBlocksRegistration": {
|
|
52
|
+
"enabled": true
|
|
53
|
+
},
|
|
54
|
+
"renderBlocksBehavior": {
|
|
55
|
+
"wrapperless": false
|
|
56
|
+
},
|
|
57
|
+
"pageRouteIntegration": {
|
|
58
|
+
"required": false,
|
|
59
|
+
"manualSteps": []
|
|
60
|
+
},
|
|
61
|
+
"manual": [
|
|
62
|
+
"Register DDHeroPlas in Pages/Posts block arrays if automatic registration was skipped.",
|
|
63
|
+
"Register DD-HeroPlas in RenderBlocks if automatic registration was skipped.",
|
|
64
|
+
"Run payload generate:types after schema changes.",
|
|
65
|
+
"Run payload generate:importmap if admin/component imports changed."
|
|
66
|
+
],
|
|
67
|
+
"manualSteps": [
|
|
68
|
+
"Register DDHeroPlas in Pages/Posts block arrays if automatic registration was skipped.",
|
|
69
|
+
"Register DD-HeroPlas in RenderBlocks if automatic registration was skipped.",
|
|
70
|
+
"Run payload generate:types after schema changes.",
|
|
71
|
+
"Run payload generate:importmap if admin/component imports changed."
|
|
72
|
+
],
|
|
73
|
+
"patchTargets": {
|
|
74
|
+
"blockConfigRegistration": {
|
|
75
|
+
"description": "Installer can register DDHeroPlas from @/blocks/DD-HeroPlas/config."
|
|
76
|
+
},
|
|
77
|
+
"renderBlocksRegistration": {
|
|
78
|
+
"description": "Installer can register DD-HeroPlas with component export DDHeroPlas."
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
"notes": [
|
|
82
|
+
"Promoted from the verified Dusted Blocks demo implementation.",
|
|
83
|
+
"Installer preserves existing destination files and reports project requirements before writing."
|
|
84
|
+
],
|
|
85
|
+
"exportName": "DDHeroPlas",
|
|
86
|
+
"componentExportName": "DDHeroPlas",
|
|
87
|
+
"interfaceName": "DDHeroPlas"
|
|
88
|
+
}
|
|
@@ -509,10 +509,9 @@ interface SlidePanelProps {
|
|
|
509
509
|
}
|
|
510
510
|
|
|
511
511
|
function isLocalMediaSrc(src?: string | null): src is string {
|
|
512
|
-
return typeof src === 'string' &&
|
|
512
|
+
return typeof src === 'string' && src.startsWith('/api/media/file/')
|
|
513
513
|
}
|
|
514
514
|
|
|
515
|
-
|
|
516
515
|
function SlidePanel({ slide, index, total, panelRef }: SlidePanelProps) {
|
|
517
516
|
const { hex, rgb } = getAccent(slide.accent)
|
|
518
517
|
const Visual = VISUAL_MAP[slide.visualType ?? 'wireframe'] ?? WireframeVisual
|
|
@@ -715,7 +714,6 @@ export function DDHorizontalScroll(props: DDHorizontalScrollProps) {
|
|
|
715
714
|
const normalSlides: SlideItem[] = useMemo(() => slides ?? [], [slides])
|
|
716
715
|
const slideCount = normalSlides.length
|
|
717
716
|
|
|
718
|
-
|
|
719
717
|
/* ── GSAP horizontal scroll + pin + snap ── */
|
|
720
718
|
useLayoutEffect(() => {
|
|
721
719
|
if (typeof window === 'undefined') return
|
|
@@ -813,12 +811,13 @@ export function DDHorizontalScroll(props: DDHorizontalScrollProps) {
|
|
|
813
811
|
<section
|
|
814
812
|
ref={outerRef}
|
|
815
813
|
id={sectionId ?? undefined}
|
|
816
|
-
className="studio-hscrollblock relative z-30 top-0"
|
|
814
|
+
className="studio-hscrollblock relative z-30 top-0 min-w-full w-full"
|
|
817
815
|
// !!Note: First & Last child slides set to opacity 0 to rectify scroll. offset for next block entry. Use svh to offset and FirstSlide_width(!vw)
|
|
818
816
|
style={{
|
|
819
817
|
height: `calc((${Math.max(0, slideCount + 2)} * 100svh + 100svh) - ${offset}svh)`,
|
|
820
818
|
}}
|
|
821
819
|
>
|
|
820
|
+
<style>{'body:has(.studio-hscrollblock) { overflow-x: clip; }'}</style>
|
|
822
821
|
<div
|
|
823
822
|
ref={wrapperRef}
|
|
824
823
|
className="shs-wrapper sticky overflow-hidden top-0"
|
|
@@ -848,7 +847,7 @@ export function DDHorizontalScroll(props: DDHorizontalScrollProps) {
|
|
|
848
847
|
}}
|
|
849
848
|
/> */}
|
|
850
849
|
{/* Section eyebrow label */}
|
|
851
|
-
|
|
850
|
+
|
|
852
851
|
{sectionLabel && (
|
|
853
852
|
<div className="section-label absolute top-8 left-4 z-20 flex items-center gap-3">
|
|
854
853
|
<div className="w-6 h-px" style={{ background: '#84cc16' }} />
|
|
@@ -4,13 +4,13 @@ import React from 'react'
|
|
|
4
4
|
import { motion } from 'framer-motion'
|
|
5
5
|
import Link from 'next/link'
|
|
6
6
|
import { usePathname } from 'next/navigation'
|
|
7
|
+
import * as LucideIcons from 'lucide-react'
|
|
7
8
|
|
|
8
9
|
import { cn } from '@/utilities/ui'
|
|
9
|
-
import { Media } from '@/components/Media'
|
|
10
10
|
import { smoothScrollTo, isAnchorLink } from '@/utilities/smoothScroll'
|
|
11
11
|
|
|
12
12
|
export type IconItem = {
|
|
13
|
-
icon?:
|
|
13
|
+
icon?: string | null
|
|
14
14
|
iconSize?: string
|
|
15
15
|
customIconSize?: string
|
|
16
16
|
iconClassName?: string
|
|
@@ -19,7 +19,6 @@ export type IconItem = {
|
|
|
19
19
|
flexDirection?: 'flex-col' | 'flex-col-reverse' | 'flex-row' | 'flex-row-reverse'
|
|
20
20
|
flexGap?: string
|
|
21
21
|
link?: string
|
|
22
|
-
imgCustomStyle?: Record<string, any>
|
|
23
22
|
}
|
|
24
23
|
|
|
25
24
|
export type CustomIconBlockProps = {
|
|
@@ -28,19 +27,29 @@ export type CustomIconBlockProps = {
|
|
|
28
27
|
icons?: IconItem[]
|
|
29
28
|
className?: string
|
|
30
29
|
iconGridClass?: string
|
|
31
|
-
imgCustomStyle?: React.CSSProperties
|
|
32
30
|
priority?: boolean
|
|
33
31
|
}
|
|
34
32
|
|
|
33
|
+
function DynamicIcon({
|
|
34
|
+
name,
|
|
35
|
+
size = 36,
|
|
36
|
+
...props
|
|
37
|
+
}: { name?: string | null } & Omit<LucideIcons.LucideProps, 'name'>) {
|
|
38
|
+
if (!name) return null
|
|
39
|
+
const Icon = (LucideIcons as unknown as Record<string, React.FC<LucideIcons.LucideProps>>)[name]
|
|
40
|
+
if (!Icon) return null
|
|
41
|
+
return <Icon size={size} {...props} />
|
|
42
|
+
}
|
|
43
|
+
|
|
35
44
|
const containerVariants = {
|
|
36
45
|
hidden: { opacity: 0 },
|
|
37
46
|
visible: {
|
|
38
47
|
opacity: 1,
|
|
39
48
|
transition: {
|
|
40
49
|
staggerChildren: 0.15,
|
|
41
|
-
delayChildren: 0.1
|
|
42
|
-
}
|
|
43
|
-
}
|
|
50
|
+
delayChildren: 0.1,
|
|
51
|
+
},
|
|
52
|
+
},
|
|
44
53
|
}
|
|
45
54
|
|
|
46
55
|
const itemVariants = {
|
|
@@ -51,17 +60,15 @@ const itemVariants = {
|
|
|
51
60
|
scale: 1,
|
|
52
61
|
transition: {
|
|
53
62
|
duration: 0.4,
|
|
54
|
-
ease: [0.4, 0, 0.2, 1] as const
|
|
55
|
-
}
|
|
56
|
-
}
|
|
63
|
+
ease: [0.4, 0, 0.2, 1] as const,
|
|
64
|
+
},
|
|
65
|
+
},
|
|
57
66
|
}
|
|
58
67
|
|
|
59
68
|
export const DDIcon: React.FC<CustomIconBlockProps> = ({
|
|
60
69
|
blockName,
|
|
61
70
|
icons = [],
|
|
62
71
|
iconGridClass,
|
|
63
|
-
imgCustomStyle: blockImgStyle,
|
|
64
|
-
priority = false
|
|
65
72
|
}) => {
|
|
66
73
|
const pathname = usePathname()
|
|
67
74
|
const hasCustomGridClass = iconGridClass && iconGridClass.trim().length > 0
|
|
@@ -103,30 +110,11 @@ export const DDIcon: React.FC<CustomIconBlockProps> = ({
|
|
|
103
110
|
smoothScrollTo(target, {
|
|
104
111
|
duration: 1,
|
|
105
112
|
offsetY: 80,
|
|
106
|
-
ease: 'power2.out'
|
|
113
|
+
ease: 'power2.out',
|
|
107
114
|
})
|
|
108
115
|
}
|
|
109
116
|
}
|
|
110
117
|
|
|
111
|
-
const extractSizeFromClass = (sizeClass: string) => {
|
|
112
|
-
const widthMatch = sizeClass.match(/w-(\d+)/)
|
|
113
|
-
const heightMatch = sizeClass.match(/h-(\d+)/)
|
|
114
|
-
|
|
115
|
-
if (widthMatch && heightMatch) {
|
|
116
|
-
const width = parseInt(widthMatch[1], 10) * 4
|
|
117
|
-
const height = parseInt(heightMatch[1], 10) * 4
|
|
118
|
-
|
|
119
|
-
return {
|
|
120
|
-
width: `${width}px`,
|
|
121
|
-
height: `${height}px`,
|
|
122
|
-
maxWidth: `${width}px`,
|
|
123
|
-
maxHeight: `${height}px`
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
return {}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
118
|
return (
|
|
131
119
|
<motion.div
|
|
132
120
|
initial="hidden"
|
|
@@ -138,58 +126,35 @@ export const DDIcon: React.FC<CustomIconBlockProps> = ({
|
|
|
138
126
|
className={cn(
|
|
139
127
|
'custom-icon-block',
|
|
140
128
|
!hasCustomGridClass && 'grid grid-cols-3 gap-6 text-center md:grid-cols-4 lg:grid-cols-5',
|
|
141
|
-
hasCustomGridClass && iconGridClass
|
|
129
|
+
hasCustomGridClass && iconGridClass,
|
|
142
130
|
)}
|
|
143
131
|
>
|
|
144
132
|
{icons.map((iconItem, index) => {
|
|
145
133
|
if (!iconItem) return null
|
|
146
134
|
|
|
147
|
-
const iconKey = `icon-${index}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
{iconItem.label && (
|
|
161
|
-
<span className="custom-icon-label mt-2 text-center text-xs leading-tight text-gray-600">
|
|
162
|
-
{iconItem.label}
|
|
163
|
-
</span>
|
|
164
|
-
)}
|
|
165
|
-
</motion.div>
|
|
166
|
-
)
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
const iconSizeClass =
|
|
170
|
-
iconItem.iconSize === 'custom'
|
|
171
|
-
? iconItem.customIconSize || 'h-16 w-16'
|
|
172
|
-
: iconItem.iconSize || 'h-16 w-16'
|
|
173
|
-
|
|
174
|
-
const sizeStyles = extractSizeFromClass(iconSizeClass)
|
|
135
|
+
const iconKey = `icon-${index}`
|
|
136
|
+
const defaultIcons = [
|
|
137
|
+
'Code2',
|
|
138
|
+
'Database',
|
|
139
|
+
'PanelsTopLeft',
|
|
140
|
+
'Braces',
|
|
141
|
+
'Workflow',
|
|
142
|
+
'GitBranch',
|
|
143
|
+
]
|
|
144
|
+
const iconName =
|
|
145
|
+
typeof iconItem.icon === 'string'
|
|
146
|
+
? iconItem.icon
|
|
147
|
+
: defaultIcons[index % defaultIcons.length]
|
|
175
148
|
|
|
176
149
|
const mediaContent = (
|
|
177
|
-
<
|
|
178
|
-
priority={priority ?? false}
|
|
179
|
-
resource={iconItem.icon}
|
|
150
|
+
<div
|
|
180
151
|
className={cn(
|
|
181
|
-
'custom-icon-media flex items-center justify-center p-
|
|
182
|
-
|
|
183
|
-
'[&>picture>img]:block [&>picture>img]:h-full [&>picture>img]:w-full [&>picture>img]:object-contain',
|
|
184
|
-
'[&_img]:block [&_img]:h-full [&_img]:w-full [&_img]:object-contain',
|
|
185
|
-
iconSizeClass,
|
|
186
|
-
iconItem.iconClassName
|
|
152
|
+
'custom-icon-media flex h-20 w-20 items-center justify-center rounded-2xl border border-[#2A2A30] bg-linear-to-b from-[#1a1a1f] to-[#0f0f12] p-4 invert-[1] transition-all duration-300 hover:scale-105 hover:shadow-[0_0_30px_rgba(140,138,132,0.15)] dark:invert-[0]',
|
|
153
|
+
iconItem.iconClassName,
|
|
187
154
|
)}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
)}
|
|
192
|
-
/>
|
|
155
|
+
>
|
|
156
|
+
<DynamicIcon className="text-[#9A9790]" name={iconName} size={36} />
|
|
157
|
+
</div>
|
|
193
158
|
)
|
|
194
159
|
|
|
195
160
|
const wrapperFlexDirection = iconItem.flexDirection || 'flex-col'
|
|
@@ -217,7 +182,7 @@ export const DDIcon: React.FC<CustomIconBlockProps> = ({
|
|
|
217
182
|
className={cn(
|
|
218
183
|
'custom-icon-item group flex items-center',
|
|
219
184
|
wrapperFlexDirection,
|
|
220
|
-
wrapperGap
|
|
185
|
+
wrapperGap,
|
|
221
186
|
)}
|
|
222
187
|
>
|
|
223
188
|
{iconItem.link && iconItem.link.trim() ? (
|
|
@@ -235,9 +200,9 @@ export const DDIcon: React.FC<CustomIconBlockProps> = ({
|
|
|
235
200
|
<a
|
|
236
201
|
href={href}
|
|
237
202
|
className={cn(
|
|
238
|
-
'custom-icon-block-link custom-icon-link flex cursor-pointer items-center brightness-100 transition-all duration-300 ease-in-out hover:brightness-110',
|
|
203
|
+
'custom-icon-block-link custom-icon-link flex cursor-pointer items-center brightness-100 no-underline transition-all duration-300 ease-in-out hover:brightness-110 hover:no-underline',
|
|
239
204
|
wrapperFlexDirection,
|
|
240
|
-
wrapperGap
|
|
205
|
+
wrapperGap,
|
|
241
206
|
)}
|
|
242
207
|
onClick={(e) => handleClick(href, e)}
|
|
243
208
|
aria-label={iconItem.label || 'Navigate to section'}
|
|
@@ -254,9 +219,9 @@ export const DDIcon: React.FC<CustomIconBlockProps> = ({
|
|
|
254
219
|
<Link
|
|
255
220
|
href={href}
|
|
256
221
|
className={cn(
|
|
257
|
-
'custom-icon-block-link custom-icon-link flex items-center brightness-100 transition-all duration-300 ease-in-out hover:brightness-110',
|
|
222
|
+
'custom-icon-block-link custom-icon-link flex items-center brightness-100 no-underline transition-all duration-300 ease-in-out hover:brightness-110 hover:no-underline',
|
|
258
223
|
wrapperFlexDirection,
|
|
259
|
-
wrapperGap
|
|
224
|
+
wrapperGap,
|
|
260
225
|
)}
|
|
261
226
|
target={target}
|
|
262
227
|
rel={rel}
|
|
@@ -271,7 +236,7 @@ export const DDIcon: React.FC<CustomIconBlockProps> = ({
|
|
|
271
236
|
className={cn(
|
|
272
237
|
'custom-icon-wrapper flex items-center brightness-110 text-white/80 dark:text-stone-200/80',
|
|
273
238
|
wrapperFlexDirection,
|
|
274
|
-
wrapperGap
|
|
239
|
+
wrapperGap,
|
|
275
240
|
)}
|
|
276
241
|
>
|
|
277
242
|
{iconContent}
|
|
@@ -4,7 +4,7 @@ import React from 'react'
|
|
|
4
4
|
import { cn } from '@/utilities/ui'
|
|
5
5
|
import Link from 'next/link'
|
|
6
6
|
import * as LucideIcons from 'lucide-react'
|
|
7
|
-
import type { Page
|
|
7
|
+
import type { Page } from '@/payload-types'
|
|
8
8
|
import { ShareButton } from '@/components/ui/ShareButton'
|
|
9
9
|
import { smoothScrollTo, isAnchorLink } from '@/utilities/smoothScroll'
|
|
10
10
|
import { usePathname, useRouter } from 'next/navigation'
|
|
@@ -30,9 +30,7 @@ type ButtonStyle =
|
|
|
30
30
|
type ButtonSize = 'small' | 'medium' | 'large'
|
|
31
31
|
type IconPosition = 'before' | 'after'
|
|
32
32
|
|
|
33
|
-
type LinkReference =
|
|
34
|
-
| { relationTo: 'pages'; value: number | Page }
|
|
35
|
-
| { relationTo: 'posts'; value: number | Post }
|
|
33
|
+
type LinkReference = { relationTo: 'pages'; value: number | Page }
|
|
36
34
|
|
|
37
35
|
export type LinkType = {
|
|
38
36
|
type?: 'reference' | 'custom' | null
|
|
@@ -175,12 +173,7 @@ export const DDIconButton: React.FC<ButtonWithIconProps> = ({
|
|
|
175
173
|
onToggle?.()
|
|
176
174
|
}
|
|
177
175
|
|
|
178
|
-
|
|
179
|
-
if (typeof doc === 'number') return null
|
|
180
|
-
return (doc as any)?.slug || null
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
const getPageURLFromDoc = (doc: Page | number): string | null => {
|
|
176
|
+
const getPageURLFromDoc = (doc: Page | number): string | null => {
|
|
184
177
|
if (typeof doc === 'number') return null
|
|
185
178
|
|
|
186
179
|
const anyDoc = doc as any
|
|
@@ -231,12 +224,6 @@ export const DDIconButton: React.FC<ButtonWithIconProps> = ({
|
|
|
231
224
|
if (relationTo === 'pages') {
|
|
232
225
|
const pageHref = getPageURLFromDoc(value as Page | number)
|
|
233
226
|
if (pageHref) href = pageHref
|
|
234
|
-
} else if (relationTo === 'posts') {
|
|
235
|
-
const slug = getDocumentSlug(value as Post | number)
|
|
236
|
-
if (slug) href = `/thoughts/${slug}`
|
|
237
|
-
} else {
|
|
238
|
-
const slug = getDocumentSlug(value as any)
|
|
239
|
-
if (slug) href = `/${relationTo}/${slug}`
|
|
240
227
|
}
|
|
241
228
|
|
|
242
229
|
target = link.newTab ? '_blank' : undefined
|
|
@@ -267,7 +254,7 @@ export const DDIconButton: React.FC<ButtonWithIconProps> = ({
|
|
|
267
254
|
'bg-transparent text-[var(--text)] !border-0 max-h-fit transition-all duration-300 hover:text-[var(--accent)] hover:font-medium',
|
|
268
255
|
|
|
269
256
|
destructive:
|
|
270
|
-
"relative z-0 overflow-hidden bg-[var(--error)] !text-white rounded-2xl squircle border border-[outset] border-[var(--color-alt2)] brightness-100 max-h-fit shadow-[inset_0_0_20px_2px_rgb(73_17_10_/_90%),var(--shadow-md)] transition-all duration-300 before:content-[''] before:absolute before:inset-0 before:-z-10 before:bg-
|
|
257
|
+
"relative z-0 overflow-hidden bg-[var(--error)] !text-white rounded-2xl squircle border border-[outset] border-[var(--color-alt2)] brightness-100 max-h-fit shadow-[inset_0_0_20px_2px_rgb(73_17_10_/_90%),var(--shadow-md)] transition-all duration-300 before:content-[''] before:absolute before:inset-0 before:-z-10 before:bg-lines before:bg-[length:10px_10px] before:bg-repeat before:opacity-100 before:pointer-events-none hover:!text-white hover:shadow-[inset_0_0_30px_2px_rgb(178_20_2),var(--shadow-xl)] hover:brightness-110",
|
|
271
258
|
|
|
272
259
|
v1: 'border-[0.5px] rounded-sm bg-transparent duration-200 bg-blur shadow-[4px_4px_0px_0px_rgba(0,0,0,1)] active:shadow-none border-stone-800 text-zinc-800 dark:border-stone-600 dark:shadow-[3px_3px_0px_0px_rgba(255,255,255,0.7)] active:dark:shadow-none dark:text-zinc-50 dark:bg-zinc-950 px-3 py-1',
|
|
273
260
|
v2: 'group relative justify-center rounded-sm shadow-md overflow-hidden ease-in-out hover:scale-100 hover:shadow-lg text-zinc-50 bg-gradient-to-tr from-zinc-900 to-zinc-700 hover:shadow-zinc-500/30 dark:text-stone-900 dark:bg-gradient-to-tr dark:from-zinc-50 dark:to-zinc-100 dark:hover:shadow-zinc-700/30 px-3 py-1',
|
|
@@ -444,12 +431,18 @@ export const DDIconButton: React.FC<ButtonWithIconProps> = ({
|
|
|
444
431
|
{displayMode === 'share' ? (
|
|
445
432
|
content
|
|
446
433
|
) : href && href !== '#' ? (
|
|
447
|
-
<Link
|
|
434
|
+
<Link
|
|
435
|
+
href={href}
|
|
436
|
+
target={target}
|
|
437
|
+
rel={rel}
|
|
438
|
+
className="!no-underline hover:!no-underline"
|
|
439
|
+
onClick={(e) => handleClick(href, e)}
|
|
440
|
+
>
|
|
448
441
|
{content}
|
|
449
442
|
</Link>
|
|
450
443
|
) : (
|
|
451
444
|
content
|
|
452
445
|
)}
|
|
453
446
|
</div>
|
|
454
|
-
)
|
|
455
|
-
}
|
|
447
|
+
)
|
|
448
|
+
}
|
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
|
|
3
|
-
type Props = {
|
|
4
|
-
idTag
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
1
|
+
import React from 'react'
|
|
2
|
+
|
|
3
|
+
type Props = {
|
|
4
|
+
idTag?: string
|
|
5
|
+
id?: string
|
|
6
|
+
offset?: number
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const DDIdTag: React.FC<Props> = ({ idTag, id, offset = 0 }) => {
|
|
10
|
+
return (
|
|
11
|
+
<div
|
|
12
|
+
id={idTag || id}
|
|
13
|
+
style={{
|
|
14
|
+
position: 'relative',
|
|
15
|
+
top: `-${offset}px`,
|
|
16
|
+
height: 0,
|
|
17
|
+
visibility: 'hidden',
|
|
18
|
+
}}
|
|
19
|
+
aria-hidden="true"
|
|
20
|
+
/>
|
|
21
|
+
)
|
|
22
|
+
}
|
|
@@ -7,20 +7,23 @@ export type MediaType = {
|
|
|
7
7
|
alt?: string
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
10
|
+
type IframeMediaFields = {
|
|
11
|
+
fullwidthSectionClass?: string
|
|
12
|
+
sectionId?: string
|
|
13
|
+
video?: MediaType
|
|
14
|
+
image?: MediaType // used as poster
|
|
15
|
+
imageClassName?: string
|
|
16
|
+
additionalStyles?: React.CSSProperties
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type IframeMediaBlockProps = IframeMediaFields & {
|
|
20
|
+
data?: IframeMediaFields
|
|
19
21
|
}
|
|
20
22
|
|
|
21
23
|
// ✅ Named export
|
|
22
|
-
export const DDIframeMedia: React.FC<IframeMediaBlockProps> = (
|
|
24
|
+
export const DDIframeMedia: React.FC<IframeMediaBlockProps> = (props) => {
|
|
23
25
|
const [isLoading, setIsLoading] = React.useState(true)
|
|
26
|
+
const data = props.data ?? props
|
|
24
27
|
const { video, image, sectionId, fullwidthSectionClass, additionalStyles } = data
|
|
25
28
|
const sectionIdValue = sectionId || 'fullwidth-container'
|
|
26
29
|
|
|
@@ -127,3 +130,4 @@ export const DDIframeMedia: React.FC<IframeMediaBlockProps> = ({ data }) => {
|
|
|
127
130
|
</section>
|
|
128
131
|
)
|
|
129
132
|
}
|
|
133
|
+
|
|
@@ -1,36 +1,42 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
import React from 'react'
|
|
3
|
-
import LineAnim from '@/components/ui/anims/LineAnims'
|
|
4
|
-
|
|
5
|
-
export interface LineAnimBlockProps {
|
|
6
|
-
className?: string
|
|
7
|
-
direction?: 'left-to-right' | 'right-to-left' | 'top-to-bottom' | 'bottom-to-top'
|
|
8
|
-
trigger?: 'scroll' | 'immediate'
|
|
9
|
-
duration?: number
|
|
10
|
-
delay?: number
|
|
11
|
-
customClass?: string
|
|
12
|
-
blockType?: string
|
|
13
|
-
id?: string
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export const DDLineAnim: React.FC<LineAnimBlockProps> = ({
|
|
17
|
-
className = '',
|
|
18
|
-
direction = 'left-to-right',
|
|
19
|
-
trigger = 'scroll',
|
|
20
|
-
duration = 1,
|
|
21
|
-
delay = 0,
|
|
22
|
-
customClass = '',
|
|
23
|
-
id
|
|
24
|
-
}) => {
|
|
25
|
-
return (
|
|
26
|
-
<div
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
1
|
+
'use client'
|
|
2
|
+
import React from 'react'
|
|
3
|
+
import LineAnim from '@/components/ui/anims/LineAnims'
|
|
4
|
+
|
|
5
|
+
export interface LineAnimBlockProps {
|
|
6
|
+
className?: string
|
|
7
|
+
direction?: 'left-to-right' | 'right-to-left' | 'top-to-bottom' | 'bottom-to-top'
|
|
8
|
+
trigger?: 'scroll' | 'immediate'
|
|
9
|
+
duration?: number
|
|
10
|
+
delay?: number
|
|
11
|
+
customClass?: string
|
|
12
|
+
blockType?: string
|
|
13
|
+
id?: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const DDLineAnim: React.FC<LineAnimBlockProps> = ({
|
|
17
|
+
className = '',
|
|
18
|
+
direction = 'left-to-right',
|
|
19
|
+
trigger = 'scroll',
|
|
20
|
+
duration = 1,
|
|
21
|
+
delay = 0,
|
|
22
|
+
customClass = '',
|
|
23
|
+
id
|
|
24
|
+
}) => {
|
|
25
|
+
return (
|
|
26
|
+
<div
|
|
27
|
+
className={`line-anim-block flex min-h-[55vh] items-center overflow-hidden rounded-md bg-zinc-100 px-8 dark:bg-zinc-900 ${className} ${customClass}`}
|
|
28
|
+
id={id}
|
|
29
|
+
>
|
|
30
|
+
<span className="mr-6 text-sm font-medium uppercase tracking-wide text-zinc-600 dark:text-zinc-300">
|
|
31
|
+
Line animation
|
|
32
|
+
</span>
|
|
33
|
+
<LineAnim
|
|
34
|
+
direction={direction}
|
|
35
|
+
trigger={trigger}
|
|
36
|
+
duration={duration}
|
|
37
|
+
delay={delay}
|
|
38
|
+
className="h-2 w-full rounded-full bg-gradient-to-r from-gray-400 via-gray-700 to-gray-400"
|
|
39
|
+
/>
|
|
40
|
+
</div>
|
|
41
|
+
)
|
|
42
|
+
}
|