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
@@ -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' && (src.startsWith('/api/media/file/') || src.startsWith('/assets/') || src.startsWith('/logo') || src.startsWith('/media/') || src.startsWith('data:'))
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?: any
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}${iconItem.icon?.filename ? `-${iconItem.icon.filename}` : ''}`
148
-
149
- if (!iconItem.icon) {
150
- return (
151
- <motion.div
152
- key={iconKey}
153
- variants={itemVariants}
154
- className="flex flex-col items-center"
155
- >
156
- <div className="flex h-16 w-16 items-center justify-center border-2 border-gray-300 bg-gray-100 p-0 text-xs text-gray-400">
157
- <span>No Icon</span>
158
- </div>
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
- <Media
178
- priority={priority ?? false}
179
- resource={iconItem.icon}
150
+ <div
180
151
  className={cn(
181
- 'custom-icon-media flex items-center justify-center p-0 transition-transform',
182
- '[&>picture]:!mb-0 [&>picture]:!mt-0 [&>picture]:flex [&>picture]:h-full [&>picture]:w-full [&>picture]:items-center [&>picture]:justify-center',
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
- imgClassName={cn(
189
- 'block h-full w-full object-contain transition-all duration-300',
190
- iconItem.iconClassName
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, Post } from '@/payload-types'
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
- const getDocumentSlug = (doc: Page | Post | number): string | null => {
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-[url('/assets/svg/lines.svg')] 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",
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 href={href} target={target} rel={rel} onClick={(e) => handleClick(href, e)}>
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: string
5
- offset?: number
6
- }
7
-
8
- export const DDIdTag: React.FC<Props> = ({ idTag, offset = 0 }) => {
9
- return (
10
- <div
11
- id={idTag}
12
- style={{
13
- position: 'relative',
14
- top: `-${offset}px`,
15
- height: 0,
16
- visibility: 'hidden',
17
- }}
18
- aria-hidden="true"
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
- export type IframeMediaBlockProps = {
11
- data: {
12
- fullwidthSectionClass?: string
13
- sectionId?: string
14
- video?: MediaType
15
- image?: MediaType // used as poster
16
- imageClassName?: string
17
- additionalStyles?: React.CSSProperties
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> = ({ data }) => {
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 className={`line-anim-block overflow-hidden ${className} ${customClass}`} id={id}>
27
- <LineAnim
28
- direction={direction}
29
- trigger={trigger}
30
- duration={duration}
31
- delay={delay}
32
- className="bg-gradient-to-r from-gray-400 to-gray-600"
33
- />
34
- </div>
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
+ }