blocks-dusted 0.1.9 → 0.1.11

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 (248) hide show
  1. package/README.md +35 -0
  2. package/package.json +1 -1
  3. package/src/utils/paths.js +13 -13
  4. package/templates/blocks/DD-Accordion/Component.tsx +229 -0
  5. package/templates/blocks/DD-Accordion/README.md +3 -0
  6. package/templates/blocks/DD-Accordion/config.ts +73 -0
  7. package/templates/blocks/DD-Accordion/manifest.json +75 -0
  8. package/templates/blocks/DD-AnimText/Component.tsx +788 -0
  9. package/templates/blocks/DD-AnimText/README.md +3 -0
  10. package/templates/blocks/DD-AnimText/config.ts +295 -0
  11. package/templates/blocks/DD-AnimText/manifest.json +85 -0
  12. package/templates/blocks/DD-AsideNav/Component.tsx +321 -0
  13. package/templates/blocks/DD-AsideNav/config.ts +204 -0
  14. package/templates/blocks/DD-AsideNav/manifest.json +80 -0
  15. package/templates/blocks/DD-Banner/Component.tsx +51 -0
  16. package/templates/blocks/DD-Banner/config.ts +57 -0
  17. package/templates/blocks/DD-Banner/manifest.json +72 -0
  18. package/templates/blocks/DD-BgLightning/Component.tsx +44 -0
  19. package/templates/blocks/DD-BgLightning/README.md +3 -0
  20. package/templates/blocks/DD-BgLightning/config.ts +97 -0
  21. package/templates/blocks/DD-BgLightning/manifest.json +79 -0
  22. package/templates/blocks/DD-BookCall/Component.tsx +10 -11
  23. package/templates/blocks/DD-BookCall/config.ts +238 -238
  24. package/templates/blocks/DD-ButtonPop/Component.tsx +117 -0
  25. package/templates/blocks/DD-ButtonPop/config.ts +105 -0
  26. package/templates/blocks/DD-ButtonPop/manifest.json +88 -0
  27. package/templates/blocks/DD-ButtonPop/svg-icons/Dust2.tsx +167 -0
  28. package/templates/blocks/DD-Card/Component.tsx +251 -0
  29. package/templates/blocks/DD-Card/README.md +4 -0
  30. package/templates/blocks/DD-Card/config.ts +154 -0
  31. package/templates/blocks/DD-Card/manifest.json +82 -0
  32. package/templates/blocks/DD-CardTemplate01/Component.tsx +5 -6
  33. package/templates/blocks/DD-CardTemplate01/config.ts +106 -106
  34. package/templates/blocks/DD-Carousel-A/Component.tsx +249 -249
  35. package/templates/blocks/DD-Carousel-B/Component.tsx +403 -403
  36. package/templates/blocks/DD-Chip/Component.tsx +250 -0
  37. package/templates/blocks/DD-Chip/EXAMPLES.md +313 -0
  38. package/templates/blocks/DD-Chip/README.md +202 -0
  39. package/templates/blocks/DD-Chip/config.ts +369 -0
  40. package/templates/blocks/DD-Chip/manifest.json +74 -0
  41. package/templates/blocks/DD-ComparisonTable/Component.tsx +256 -256
  42. package/templates/blocks/DD-Contact/Component.tsx +434 -434
  43. package/templates/blocks/DD-Contact/config.ts +22 -22
  44. package/templates/blocks/DD-Counter/Component.tsx +190 -0
  45. package/templates/blocks/DD-Counter/README.md +4 -0
  46. package/templates/blocks/DD-Counter/config.ts +291 -0
  47. package/templates/blocks/DD-Counter/manifest.json +74 -0
  48. package/templates/blocks/DD-CustomCSS/Component.tsx +8 -0
  49. package/templates/blocks/DD-CustomCSS/README.md +4 -0
  50. package/templates/blocks/DD-CustomCSS/addToLayout.md +5 -0
  51. package/templates/blocks/DD-CustomCSS/config.ts +22 -0
  52. package/templates/blocks/DD-CustomCSS/manifest.json +72 -0
  53. package/templates/blocks/DD-CustomCSS/renderCustomCSS.md +7 -0
  54. package/templates/blocks/DD-FeatCat/Component.tsx +302 -302
  55. package/templates/blocks/DD-FeatCat/config.ts +201 -201
  56. package/templates/blocks/DD-FeatStrip/Component.tsx +585 -585
  57. package/templates/blocks/DD-FeatStrip/config.ts +134 -134
  58. package/templates/blocks/DD-FluidBtn/ButtonsEyeCatching.tsx +628 -0
  59. package/templates/blocks/DD-FluidBtn/Component.tsx +43 -0
  60. package/templates/blocks/DD-FluidBtn/README.md +6 -0
  61. package/templates/blocks/DD-FluidBtn/config.ts +102 -0
  62. package/templates/blocks/DD-FluidBtn/manifest.json +86 -0
  63. package/templates/blocks/DD-GooeyInfo/Component.tsx +149 -0
  64. package/templates/blocks/DD-GooeyInfo/config.ts +135 -0
  65. package/templates/blocks/DD-GooeyInfo/manifest.json +72 -0
  66. package/templates/blocks/DD-Hero/Component.tsx +40 -17
  67. package/templates/blocks/DD-Hero/config.ts +267 -267
  68. package/templates/blocks/DD-HorizontalScroll/Component.tsx +4 -2
  69. package/templates/blocks/DD-HorizontalScroll/config.ts +231 -231
  70. package/templates/blocks/DD-Icon/Component.tsx +287 -0
  71. package/templates/blocks/DD-Icon/README.md +4 -0
  72. package/templates/blocks/DD-Icon/config.ts +258 -0
  73. package/templates/blocks/DD-Icon/hooks/revalidateBlockIds.ts +66 -0
  74. package/templates/blocks/DD-Icon/manifest.json +82 -0
  75. package/templates/blocks/DD-IconButton/Component.tsx +455 -0
  76. package/templates/blocks/DD-IconButton/README.md +326 -0
  77. package/templates/blocks/DD-IconButton/config.ts +239 -0
  78. package/templates/blocks/DD-IconButton/manifest.json +85 -0
  79. package/templates/blocks/DD-IdTag/Component.tsx +21 -0
  80. package/templates/blocks/DD-IdTag/README.md +4 -0
  81. package/templates/blocks/DD-IdTag/config.ts +41 -0
  82. package/templates/blocks/DD-IdTag/manifest.json +72 -0
  83. package/templates/blocks/DD-Iframe/Component.tsx +45 -0
  84. package/templates/blocks/DD-Iframe/README.md +4 -0
  85. package/templates/blocks/DD-Iframe/config.ts +47 -0
  86. package/templates/blocks/DD-Iframe/manifest.json +72 -0
  87. package/templates/blocks/DD-IframeMedia/Component.tsx +129 -0
  88. package/templates/blocks/DD-IframeMedia/README.md +4 -0
  89. package/templates/blocks/DD-IframeMedia/config.ts +79 -0
  90. package/templates/blocks/DD-IframeMedia/manifest.json +72 -0
  91. package/templates/blocks/DD-LineAnim/Component.tsx +36 -0
  92. package/templates/blocks/DD-LineAnim/README.md +4 -0
  93. package/templates/blocks/DD-LineAnim/config.ts +90 -0
  94. package/templates/blocks/DD-LineAnim/manifest.json +80 -0
  95. package/templates/blocks/DD-LinkGrid/Component.tsx +119 -0
  96. package/templates/blocks/DD-LinkGrid/README.md +4 -0
  97. package/templates/blocks/DD-LinkGrid/config.ts +51 -0
  98. package/templates/blocks/DD-LinkGrid/manifest.json +74 -0
  99. package/templates/blocks/DD-LogoMarq/Component.tsx +132 -0
  100. package/templates/blocks/DD-LogoMarq/README.md +4 -0
  101. package/templates/blocks/DD-LogoMarq/config.ts +264 -0
  102. package/templates/blocks/DD-LogoMarq/manifest.json +82 -0
  103. package/templates/blocks/DD-Lottie/Component.tsx +459 -0
  104. package/templates/blocks/DD-Lottie/README.md +4 -0
  105. package/templates/blocks/DD-Lottie/config.ts +379 -0
  106. package/templates/blocks/DD-Lottie/index.tsx +28 -0
  107. package/templates/blocks/DD-Lottie/manifest.json +83 -0
  108. package/templates/blocks/DD-MagicBento/Component.tsx +777 -0
  109. package/templates/blocks/DD-MagicBento/README.md +4 -0
  110. package/templates/blocks/DD-MagicBento/config.ts +264 -0
  111. package/templates/blocks/DD-MagicBento/manifest.json +74 -0
  112. package/templates/blocks/DD-MasonaryMedia/Component.tsx +547 -545
  113. package/templates/blocks/DD-MasonaryMedia/config.ts +2 -2
  114. package/templates/blocks/DD-MasonaryMedia/vendor.d.ts +2 -2
  115. package/templates/blocks/DD-Masonry/Component.tsx +645 -0
  116. package/templates/blocks/DD-Masonry/README.md +4 -0
  117. package/templates/blocks/DD-Masonry/config.ts +475 -0
  118. package/templates/blocks/DD-Masonry/manifest.json +82 -0
  119. package/templates/blocks/DD-Pricing/Component.tsx +372 -372
  120. package/templates/blocks/DD-Process/Component.tsx +149 -149
  121. package/templates/blocks/DD-Process/config.ts +150 -150
  122. package/templates/blocks/DD-Progress/Component.tsx +141 -0
  123. package/templates/blocks/DD-Progress/README.md +4 -0
  124. package/templates/blocks/DD-Progress/config.ts +175 -0
  125. package/templates/blocks/DD-Progress/manifest.json +74 -0
  126. package/templates/blocks/DD-ProjHeader/Component.tsx +91 -0
  127. package/templates/blocks/DD-ProjHeader/README.md +4 -0
  128. package/templates/blocks/DD-ProjHeader/config.ts +96 -0
  129. package/templates/blocks/DD-ProjHeader/manifest.json +72 -0
  130. package/templates/blocks/DD-ProjSlider/Component.tsx +123 -0
  131. package/templates/blocks/DD-ProjSlider/README.md +4 -0
  132. package/templates/blocks/DD-ProjSlider/config.ts +64 -0
  133. package/templates/blocks/DD-ProjSlider/manifest.json +72 -0
  134. package/templates/blocks/DD-ScrollText/Component.tsx +114 -0
  135. package/templates/blocks/DD-ScrollText/README.md +4 -0
  136. package/templates/blocks/DD-ScrollText/config.ts +58 -0
  137. package/templates/blocks/DD-ScrollText/manifest.json +72 -0
  138. package/templates/blocks/DD-Section/Component.tsx +266 -266
  139. package/templates/blocks/DD-Separator/Component.tsx +66 -0
  140. package/templates/blocks/DD-Separator/README.md +4 -0
  141. package/templates/blocks/DD-Separator/config.ts +58 -0
  142. package/templates/blocks/DD-Separator/manifest.json +72 -0
  143. package/templates/blocks/DD-Services/Component.tsx +176 -176
  144. package/templates/blocks/DD-Services/config.ts +149 -149
  145. package/templates/blocks/DD-ShowcaseGrid/Component.tsx +307 -307
  146. package/templates/blocks/DD-Slider-A/Component.tsx +237 -237
  147. package/templates/blocks/DD-StackCards/Component.tsx +473 -473
  148. package/templates/blocks/DD-StackCards/config.ts +399 -399
  149. package/templates/blocks/DD-Team/Component.tsx +247 -247
  150. package/templates/blocks/DD-Team/config.ts +173 -173
  151. package/templates/blocks/DD-TeamCards/Component.tsx +251 -0
  152. package/templates/blocks/DD-TeamCards/README.md +4 -0
  153. package/templates/blocks/DD-TeamCards/config.ts +302 -0
  154. package/templates/blocks/DD-TeamCards/manifest.json +74 -0
  155. package/templates/blocks/DD-TechStack/Component.tsx +168 -162
  156. package/templates/blocks/DD-TechStack/config.ts +153 -153
  157. package/templates/blocks/DD-TestMarq/Component.tsx +132 -0
  158. package/templates/blocks/DD-TestMarq/README.md +4 -0
  159. package/templates/blocks/DD-TestMarq/RowLabel.tsx +9 -0
  160. package/templates/blocks/DD-TestMarq/config.ts +88 -0
  161. package/templates/blocks/DD-TestMarq/manifest.json +72 -0
  162. package/templates/blocks/DD-Testim/Component.tsx +247 -0
  163. package/templates/blocks/DD-Testim/README.md +4 -0
  164. package/templates/blocks/DD-Testim/config.ts +101 -0
  165. package/templates/blocks/DD-Testim/manifest.json +75 -0
  166. package/templates/blocks/DD-Testim2/Component.tsx +256 -0
  167. package/templates/blocks/DD-Testim2/README.md +4 -0
  168. package/templates/blocks/DD-Testim2/config.ts +100 -0
  169. package/templates/blocks/DD-Testim2/manifest.json +74 -0
  170. package/templates/blocks/DD-Testimonials/Component.tsx +147 -147
  171. package/templates/blocks/DD-Testimonials/config.ts +120 -120
  172. package/templates/blocks/DD-TextMarq/Component.tsx +157 -0
  173. package/templates/blocks/DD-TextMarq/README.md +4 -0
  174. package/templates/blocks/DD-TextMarq/config.ts +237 -0
  175. package/templates/blocks/DD-TextMarq/manifest.json +82 -0
  176. package/templates/blocks/DD-Thanks/Component.tsx +500 -0
  177. package/templates/blocks/DD-Thanks/README.md +4 -0
  178. package/templates/blocks/DD-Thanks/config.ts +224 -0
  179. package/templates/blocks/DD-Thanks/manifest.json +72 -0
  180. package/templates/blocks/DD-VertMarq/Component.tsx +154 -0
  181. package/templates/blocks/DD-VertMarq/README.md +4 -0
  182. package/templates/blocks/DD-VertMarq/config.ts +236 -0
  183. package/templates/blocks/DD-VertMarq/dist/index.css +6 -0
  184. package/templates/blocks/DD-VertMarq/dist/index.min.css +1 -0
  185. package/templates/blocks/DD-VertMarq/manifest.json +74 -0
  186. package/templates/blocks/DD-Work/Component.tsx +318 -315
  187. package/templates/blocks/DD-Work/config.ts +165 -165
  188. package/templates/blocks/DD-Work-B/Component.tsx +294 -294
  189. package/templates/blocks/DDHG-CTASection2/Component.tsx +185 -0
  190. package/templates/blocks/DDHG-CTASection2/config.ts +140 -0
  191. package/templates/blocks/DDHG-CTASection2/manifest.json +45 -0
  192. package/templates/blocks/DDHG-HighlightArc/Component.tsx +243 -0
  193. package/templates/blocks/DDHG-HighlightArc/config.ts +85 -0
  194. package/templates/blocks/DDHG-HighlightArc/manifest.json +46 -0
  195. package/templates/blocks/DDHG-LogoMarquee/Component.tsx +93 -0
  196. package/templates/blocks/DDHG-LogoMarquee/config.ts +66 -0
  197. package/templates/blocks/DDHG-LogoMarquee/manifest.json +39 -0
  198. package/templates/blocks/DDHG-NavCodeGrid/Component.tsx +213 -0
  199. package/templates/blocks/DDHG-NavCodeGrid/config.ts +64 -0
  200. package/templates/blocks/DDHG-NavCodeGrid/manifest.json +45 -0
  201. package/templates/blocks/DDHG-ProcessSec/Component.tsx +575 -0
  202. package/templates/blocks/DDHG-ProcessSec/config.ts +170 -0
  203. package/templates/blocks/DDHG-ProcessSec/manifest.json +56 -0
  204. package/templates/blocks/DDHG-ServiceDetails/Component.tsx +164 -0
  205. package/templates/blocks/DDHG-ServiceDetails/ServiceDetailCard.tsx +394 -0
  206. package/templates/blocks/DDHG-ServiceDetails/config.ts +77 -0
  207. package/templates/blocks/DDHG-ServiceDetails/manifest.json +50 -0
  208. package/templates/blocks/DDHG-ServiceHero/Component.tsx +234 -0
  209. package/templates/blocks/DDHG-ServiceHero/config.ts +49 -0
  210. package/templates/blocks/DDHG-ServiceHero/manifest.json +26 -0
  211. package/templates/blocks/DDHG-ServiceOverview/Component.tsx +277 -0
  212. package/templates/blocks/DDHG-ServiceOverview/config.ts +64 -0
  213. package/templates/blocks/DDHG-ServiceOverview/manifest.json +44 -0
  214. package/templates/blocks/DDHG-StatsFAQ/Component.tsx +389 -0
  215. package/templates/blocks/DDHG-StatsFAQ/config.ts +204 -0
  216. package/templates/blocks/DDHG-StatsFAQ/manifest.json +45 -0
  217. package/templates/blocks/DDHG-TeamCards/Component.tsx +131 -0
  218. package/templates/blocks/DDHG-TeamCards/config.ts +48 -0
  219. package/templates/blocks/DDHG-TeamCards/manifest.json +29 -0
  220. package/templates/components/HeaderDD02/MobileBottomNav/index.tsx +352 -257
  221. package/templates/components/HeaderDD02/index.tsx +313 -229
  222. package/templates/shared/src/components/BgLightning/index.tsx +242 -0
  223. package/templates/shared/src/components/ui/ShareButton/index.tsx +80 -0
  224. package/templates/shared/src/components/ui/anims/FadeOnScroll.tsx +48 -0
  225. package/templates/shared/src/components/ui/anims/FadeUpOnInView.tsx +63 -0
  226. package/templates/shared/src/components/ui/anims/GlareHover.tsx +111 -0
  227. package/templates/shared/src/components/ui/anims/LineAnims.tsx +81 -0
  228. package/templates/shared/src/components/ui/anims/TitleAnims01.tsx +54 -0
  229. package/templates/shared/src/components/ui/anims/animation-container.tsx +29 -0
  230. package/templates/shared/src/components/ui/anims/blur-in.tsx +26 -0
  231. package/templates/shared/src/components/ui/anims/counter.tsx +53 -0
  232. package/templates/shared/src/components/ui/anims/fade.tsx +83 -0
  233. package/templates/shared/src/components/ui/anims/gradual-spacing.tsx +39 -0
  234. package/templates/shared/src/components/ui/anims/pull-up.tsx +93 -0
  235. package/templates/shared/src/components/ui/anims/reveal-text.tsx +76 -0
  236. package/templates/shared/src/components/ui/anims/rotate-words.tsx +43 -0
  237. package/templates/shared/src/components/ui/anims/shiny-text.tsx +58 -0
  238. package/templates/shared/src/components/ui/anims/shuffle-text.tsx +85 -0
  239. package/templates/shared/src/components/ui/anims/split-text.tsx +211 -0
  240. package/templates/shared/src/components/ui/anims/staggered-fade.tsx +133 -0
  241. package/templates/shared/src/components/ui/anims/text-scroll.tsx +111 -0
  242. package/templates/shared/src/components/ui/anims/typing-effect.tsx +112 -0
  243. package/templates/shared/src/components/ui/button-dusted-fluid/index.tsx +1521 -0
  244. package/templates/shared/src/components/ui/separator.tsx +85 -0
  245. package/templates/shared/src/hooks/useBodyScrollLock.ts +97 -0
  246. package/templates/shared/src/hooks/useClickOutside.ts +28 -0
  247. package/templates/shared/src/utilities/renderCustomCSS.ts +5 -0
  248. package/templates/shared/src/utilities/smoothScroll.ts +65 -0
@@ -1,173 +1,173 @@
1
- import type { Block } from 'payload'
2
-
3
- export const DDTeam: Block = {
4
- slug: 'DD-Team',
5
- interfaceName: 'DDTeam',
6
- labels: {
7
- singular: 'Studio Team',
8
- plural: 'Studio Team Sections'
9
- },
10
- fields: [
11
- {
12
- type: 'tabs',
13
- tabs: [
14
- {
15
- label: 'Header',
16
- fields: [
17
- {
18
- name: 'eyebrow',
19
- type: 'text',
20
- label: 'Eyebrow Label',
21
- defaultValue: 'The Team'
22
- },
23
- {
24
- name: 'headlineMain',
25
- type: 'text',
26
- label: 'Headline (Main)',
27
- required: true,
28
- defaultValue: 'Small team,'
29
- },
30
- {
31
- name: 'headlineAccent',
32
- type: 'text',
33
- label: 'Headline (Accent)',
34
- required: true,
35
- defaultValue: 'big output'
36
- },
37
- {
38
- name: 'description',
39
- type: 'textarea',
40
- label: 'Description',
41
- defaultValue:
42
- "We're a tight-knit team of three. No account managers, no junior handoffs — you work directly with the people building your product."
43
- }
44
- ]
45
- },
46
- {
47
- label: 'Members',
48
- fields: [
49
- {
50
- name: 'members',
51
- type: 'array',
52
- label: 'Team Members',
53
- fields: [
54
- {
55
- name: 'name',
56
- type: 'text',
57
- label: 'Name',
58
- required: true
59
- },
60
- {
61
- name: 'role',
62
- type: 'text',
63
- label: 'Role / Title',
64
- required: true
65
- },
66
- {
67
- name: 'bio',
68
- type: 'textarea',
69
- label: 'Short Bio'
70
- },
71
- {
72
- name: 'photo',
73
- type: 'upload',
74
- label: 'Photo',
75
- relationTo: 'media'
76
- },
77
- {
78
- name: 'fallbackPhotoUrl',
79
- type: 'text',
80
- label: 'Fallback Photo URL',
81
- admin: {
82
- description: 'Used if no media upload is provided'
83
- }
84
- },
85
- {
86
- name: 'skills',
87
- type: 'array',
88
- label: 'Skills / Tags',
89
- fields: [
90
- {
91
- name: 'skill',
92
- type: 'text',
93
- label: 'Skill',
94
- required: true
95
- }
96
- ]
97
- },
98
- {
99
- name: 'twitterUrl',
100
- type: 'text',
101
- label: 'Twitter / X URL'
102
- },
103
- {
104
- name: 'githubUrl',
105
- type: 'text',
106
- label: 'GitHub URL'
107
- },
108
- {
109
- name: 'linkedinUrl',
110
- type: 'text',
111
- label: 'LinkedIn URL'
112
- }
113
- ]
114
- }
115
- ]
116
- },
117
- {
118
- label: 'Clients',
119
- fields: [
120
- {
121
- name: 'showClients',
122
- type: 'checkbox',
123
- label: 'Show Clients Section',
124
- defaultValue: true
125
- },
126
- {
127
- name: 'clientsLabel',
128
- type: 'text',
129
- label: 'Clients Label',
130
- defaultValue: 'Trusted by teams at',
131
- admin: {
132
- condition: (_, s) => s?.showClients
133
- }
134
- },
135
- {
136
- name: 'clients',
137
- type: 'array',
138
- label: 'Client Names',
139
- admin: {
140
- condition: (_, s) => s?.showClients
141
- },
142
- fields: [
143
- {
144
- name: 'name',
145
- type: 'text',
146
- label: 'Client Name',
147
- required: true
148
- }
149
- ]
150
- }
151
- ]
152
- },
153
- {
154
- label: 'Settings',
155
- fields: [
156
- {
157
- name: 'sectionId',
158
- type: 'text',
159
- label: 'Section ID',
160
- defaultValue: 'team'
161
- },
162
- {
163
- name: 'customCSS',
164
- type: 'code',
165
- label: 'Custom CSS',
166
- admin: { language: 'css' }
167
- }
168
- ]
169
- }
170
- ]
171
- }
172
- ]
173
- }
1
+ import type { Block } from 'payload'
2
+
3
+ export const DDTeam: Block = {
4
+ slug: 'DD-Team',
5
+ interfaceName: 'DDTeam',
6
+ labels: {
7
+ singular: 'Studio Team',
8
+ plural: 'Studio Team Sections'
9
+ },
10
+ fields: [
11
+ {
12
+ type: 'tabs',
13
+ tabs: [
14
+ {
15
+ label: 'Header',
16
+ fields: [
17
+ {
18
+ name: 'eyebrow',
19
+ type: 'text',
20
+ label: 'Eyebrow Label',
21
+ defaultValue: 'The Team'
22
+ },
23
+ {
24
+ name: 'headlineMain',
25
+ type: 'text',
26
+ label: 'Headline (Main)',
27
+ required: true,
28
+ defaultValue: 'Small team,'
29
+ },
30
+ {
31
+ name: 'headlineAccent',
32
+ type: 'text',
33
+ label: 'Headline (Accent)',
34
+ required: true,
35
+ defaultValue: 'big output'
36
+ },
37
+ {
38
+ name: 'description',
39
+ type: 'textarea',
40
+ label: 'Description',
41
+ defaultValue:
42
+ "We're a tight-knit team of three. No account managers, no junior handoffs — you work directly with the people building your product."
43
+ }
44
+ ]
45
+ },
46
+ {
47
+ label: 'Members',
48
+ fields: [
49
+ {
50
+ name: 'members',
51
+ type: 'array',
52
+ label: 'Team Members',
53
+ fields: [
54
+ {
55
+ name: 'name',
56
+ type: 'text',
57
+ label: 'Name',
58
+ required: true
59
+ },
60
+ {
61
+ name: 'role',
62
+ type: 'text',
63
+ label: 'Role / Title',
64
+ required: true
65
+ },
66
+ {
67
+ name: 'bio',
68
+ type: 'textarea',
69
+ label: 'Short Bio'
70
+ },
71
+ {
72
+ name: 'photo',
73
+ type: 'upload',
74
+ label: 'Photo',
75
+ relationTo: 'media'
76
+ },
77
+ {
78
+ name: 'fallbackPhotoUrl',
79
+ type: 'text',
80
+ label: 'Fallback Photo URL',
81
+ admin: {
82
+ description: 'Used if no media upload is provided'
83
+ }
84
+ },
85
+ {
86
+ name: 'skills',
87
+ type: 'array',
88
+ label: 'Skills / Tags',
89
+ fields: [
90
+ {
91
+ name: 'skill',
92
+ type: 'text',
93
+ label: 'Skill',
94
+ required: true
95
+ }
96
+ ]
97
+ },
98
+ {
99
+ name: 'twitterUrl',
100
+ type: 'text',
101
+ label: 'Twitter / X URL'
102
+ },
103
+ {
104
+ name: 'githubUrl',
105
+ type: 'text',
106
+ label: 'GitHub URL'
107
+ },
108
+ {
109
+ name: 'linkedinUrl',
110
+ type: 'text',
111
+ label: 'LinkedIn URL'
112
+ }
113
+ ]
114
+ }
115
+ ]
116
+ },
117
+ {
118
+ label: 'Clients',
119
+ fields: [
120
+ {
121
+ name: 'showClients',
122
+ type: 'checkbox',
123
+ label: 'Show Clients Section',
124
+ defaultValue: true
125
+ },
126
+ {
127
+ name: 'clientsLabel',
128
+ type: 'text',
129
+ label: 'Clients Label',
130
+ defaultValue: 'Trusted by teams at',
131
+ admin: {
132
+ condition: (_, s) => s?.showClients
133
+ }
134
+ },
135
+ {
136
+ name: 'clients',
137
+ type: 'array',
138
+ label: 'Client Names',
139
+ admin: {
140
+ condition: (_, s) => s?.showClients
141
+ },
142
+ fields: [
143
+ {
144
+ name: 'name',
145
+ type: 'text',
146
+ label: 'Client Name',
147
+ required: true
148
+ }
149
+ ]
150
+ }
151
+ ]
152
+ },
153
+ {
154
+ label: 'Settings',
155
+ fields: [
156
+ {
157
+ name: 'sectionId',
158
+ type: 'text',
159
+ label: 'Section ID',
160
+ defaultValue: 'team'
161
+ },
162
+ {
163
+ name: 'customCSS',
164
+ type: 'code',
165
+ label: 'Custom CSS',
166
+ admin: { language: 'css' }
167
+ }
168
+ ]
169
+ }
170
+ ]
171
+ }
172
+ ]
173
+ }
@@ -0,0 +1,251 @@
1
+ 'use client'
2
+
3
+ import React, { useRef } from 'react'
4
+ import Image from 'next/image'
5
+ import Link from 'next/link'
6
+ import { cn } from '@/utilities/ui'
7
+ import type { Media } from '@/payload-types'
8
+ import { motion, useScroll, useTransform, useSpring } from 'framer-motion'
9
+
10
+ export interface TeamMember {
11
+ id?: string
12
+ name: string
13
+ position: string
14
+ image: Media | string
15
+ bio?: string
16
+ socialLinks?: {
17
+ facebook?: string
18
+ linkedin?: string
19
+ twitter?: string
20
+ instagram?: string
21
+ behance?: string
22
+ website?: string
23
+ }
24
+ }
25
+
26
+ export interface TeamCardsBlockProps {
27
+ blockName?: string
28
+ teamMembers: TeamMember[]
29
+ columnsPerRow?: '2' | '3' | '4'
30
+ cardStyle?: 'default' | 'rounded' | 'shadow' | 'bordered'
31
+ showBio?: boolean
32
+ showSocialLinks?: boolean
33
+ centerAlign?: boolean
34
+ equalHeight?: boolean
35
+ containerClass?: string
36
+ cardClass?: string
37
+ customContainerStyle?: React.CSSProperties
38
+ customCardStyle?: React.CSSProperties
39
+ }
40
+
41
+ const TeamCardsComponent: React.FC<TeamCardsBlockProps> = ({
42
+ teamMembers = [],
43
+ columnsPerRow = '3',
44
+ cardStyle = 'default',
45
+ showBio = true,
46
+ showSocialLinks = true,
47
+ centerAlign = true,
48
+ equalHeight = true,
49
+ containerClass,
50
+ cardClass,
51
+ customContainerStyle,
52
+ customCardStyle
53
+ }) => {
54
+ const ref = useRef<HTMLDivElement>(null)
55
+
56
+ const { scrollYProgress } = useScroll({
57
+ target: ref,
58
+ offset: ['start end', 'end start']
59
+ })
60
+
61
+ const y = useTransform(scrollYProgress, [0, 1], [-50, 50])
62
+ const smoothY = useSpring(y, {
63
+ stiffness: 100,
64
+ damping: 30,
65
+ restDelta: 0.001
66
+ })
67
+
68
+ if (!teamMembers || teamMembers.length === 0) {
69
+ return null
70
+ }
71
+
72
+ const getImageUrl = (image: Media | string): string => {
73
+ if (typeof image === 'string') return image
74
+ if (image && typeof image === 'object' && 'url' in image) {
75
+ return image.url || ''
76
+ }
77
+ return '/placeholder.webp'
78
+ }
79
+
80
+ const getGridColumns = () => {
81
+ switch (columnsPerRow) {
82
+ case '2':
83
+ return 'grid-cols-1 md:grid-cols-2'
84
+ case '3':
85
+ return 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3'
86
+ case '4':
87
+ return 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4'
88
+ default:
89
+ return 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3'
90
+ }
91
+ }
92
+
93
+ const getCardStyleClasses = () => {
94
+ switch (cardStyle) {
95
+ case 'rounded':
96
+ return 'overflow-hidden rounded-xl'
97
+ case 'shadow':
98
+ return 'shadow-lg transition-shadow duration-300 hover:shadow-xl'
99
+ case 'bordered':
100
+ return 'border border-gray-200 transition-colors hover:border-gray-300'
101
+ default:
102
+ return ''
103
+ }
104
+ }
105
+
106
+ const getSocialIcon = (platform: string) => {
107
+ const icons = {
108
+ facebook: (
109
+ <svg className="h-5 w-5" fill="currentColor" viewBox="0 0 24 24">
110
+ <path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z" />
111
+ </svg>
112
+ ),
113
+ linkedin: (
114
+ <svg className="h-5 w-5" fill="currentColor" viewBox="0 0 24 24">
115
+ <path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z" />
116
+ </svg>
117
+ ),
118
+ twitter: (
119
+ <svg className="h-5 w-5" fill="currentColor" viewBox="0 0 24 24">
120
+ <path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z" />
121
+ </svg>
122
+ ),
123
+ instagram: (
124
+ <svg className="h-5 w-5" fill="currentColor" viewBox="0 0 24 24">
125
+ <path d="M12.017 0C5.396 0 .029 5.367.029 11.987c0 6.62 5.367 11.987 11.988 11.987 6.62 0 11.987-5.367 11.987-11.987C24.014 5.367 18.637.001 12.017.001zM8.449 16.988c-1.297 0-2.348-1.051-2.348-2.348s1.051-2.348 2.348-2.348 2.348 1.051 2.348 2.348-1.051 2.348-2.348 2.348zm7.718 0c-1.297 0-2.348-1.051-2.348-2.348s1.051-2.348 2.348-2.348 2.348 1.051 2.348 2.348-1.051 2.348-2.348 2.348z" />
126
+ </svg>
127
+ ),
128
+ behance: (
129
+ <svg className="h-5 w-5" fill="currentColor" viewBox="0 0 24 24">
130
+ <path d="M22 7h-7v-2h7v2zm1.726 10c-.442 1.297-2.029 2-5.101 2-2.981 0-5.329-1.058-5.329-4.437 0-3.329 2.212-4.663 5.329-4.663 3.329 0 5.329 1.334 5.329 4.663 0 .191-.007.381-.014.572h-8.198c.039 1.674.98 2.511 2.329 2.511 1.297 0 1.985-.3 2.329-1.297h2.329c-.726 2.329-2.726 2.651-5.329 2.651-2.726 0-5.329-1.297-5.329-4.664 0-3.329 2.212-4.664 5.329-4.664 3.329 0 5.329 1.334 5.329 4.664 0 .191-.007.381-.014.572h-8.198c.039 1.674.98 2.511 2.329 2.511 1.297 0 1.985-.3 2.329-1.297h2.329zm-11.726-9h-9v2h9v-2z" />
131
+ </svg>
132
+ ),
133
+ website: (
134
+ <svg className="h-5 w-5" fill="currentColor" viewBox="0 0 24 24">
135
+ <path d="M12 0c-6.627 0-12 5.373-12 12 0 6.627 5.373 12 12 12 6.627 0 12-5.373 12-12 0-6.627-5.373-12-12-12zm-2 16l-4-4 1.41-1.41L10 13.17l6.59-6.59L18 8l-8 8z" />
136
+ </svg>
137
+ )
138
+ }
139
+
140
+ return icons[platform as keyof typeof icons] || null
141
+ }
142
+
143
+ return (
144
+ <section
145
+ ref={ref}
146
+ className={cn('team-cards w-full py-8 md:py-10 lg:py-12', containerClass)}
147
+ style={customContainerStyle}
148
+ >
149
+ <div className="mx-auto w-full max-w-6xl px-4">
150
+ <div
151
+ className={cn('grid gap-8 p-0', getGridColumns(), equalHeight && 'items-stretch')}
152
+ style={{
153
+ padding: '0rem'
154
+ }}
155
+ >
156
+ {teamMembers.map((member, index) => (
157
+ <div
158
+ key={member.id || index}
159
+ className={cn(
160
+ 'team-card group relative min-h-[520px] cursor-pointer overflow-hidden bg-transparent transition-all duration-300 ease-in-out hover:-translate-y-2 hover:shadow-[0_4px_12px_rgba(0,0,0,0.1)]',
161
+ '[&_.card-name-title]:translate-y-24 [&_.card-name-title]:text-white [&_.card-name-title]:invert [&_.card-name-title]:transition-all [&_.card-name-title]:duration-300 [&_.card-name-title]:ease-in-out',
162
+ 'hover:[&_.card-name-title]:-translate-y-16',
163
+ '[&_.hover-bio-container]:bg-[#f0f8ff1c] [&_.hover-bio-container]:backdrop-blur-lg [&_.hover-bio-container]:invert-0',
164
+ '[&_.bg-overlay-pattern]:bottom-0 [&_.bg-overlay-pattern]:z-[1] [&_.bg-overlay-pattern]:mt-auto [&_.bg-overlay-pattern]:h-48',
165
+ getCardStyleClasses(),
166
+ equalHeight && 'h-full',
167
+ 'h-[30rem] md:h-[32rem]',
168
+ cardClass
169
+ )}
170
+ style={customCardStyle}
171
+ >
172
+ <div
173
+ className="relative h-full w-full overflow-hidden"
174
+ style={{ mixBlendMode: 'darken' }}
175
+ >
176
+ <motion.div style={{ y: smoothY }} className="relative h-[110%] w-full">
177
+ <Image
178
+ src={getImageUrl(member.image)}
179
+ alt={member.name}
180
+ fill
181
+ className="object-cover transition-transform duration-500 ease-out group-hover:scale-110"
182
+ sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"
183
+ />
184
+ </motion.div>
185
+ </div>
186
+
187
+ <div className="bg-overlay-pattern absolute inset-x-0 bg-lines" />
188
+ <div className="absolute inset-0 bg-gradient-to-t from-black/80 via-black/20 to-transparent transition-all duration-300 group-hover:from-black/90" />
189
+
190
+ <div className="absolute inset-0 flex flex-col justify-end p-2 text-white">
191
+ <div
192
+ className={cn(
193
+ 'card-name-title z-10 bg-lines-light',
194
+ centerAlign && 'text-center'
195
+ )}
196
+ >
197
+ <h3 className="mb-1 bg-lines-light text-xl font-bold text-white drop-shadow-lg md:text-xl">
198
+ {member.name}
199
+ </h3>
200
+ <p
201
+ className="color-alt text-shadow mb-4 bg-lines-light text-sm font-semibold uppercase drop-shadow-md md:text-base"
202
+ style={{ textShadow: '1px 1px 16px #000000' }}
203
+ >
204
+ {member.position}
205
+ </p>
206
+ </div>
207
+
208
+ <div className="hover-bio-container translate-y-full p-4 leading-relaxed shadow-xl transition-transform duration-300 ease-out group-hover:translate-y-0 group-hover:shadow-2xl">
209
+ {showBio && member.bio && (
210
+ <p className="hg-color-50 mb-4 text-xs leading-relaxed opacity-0 transition-opacity delay-100 duration-300 group-hover:opacity-100">
211
+ {member.bio}
212
+ </p>
213
+ )}
214
+
215
+ {showSocialLinks && member.socialLinks && (
216
+ <div
217
+ className={cn(
218
+ 'flex scale-90 gap-3 opacity-0 transition-opacity delay-200 duration-300 group-hover:opacity-100',
219
+ centerAlign ? 'justify-center' : 'justify-start'
220
+ )}
221
+ >
222
+ {Object.entries(member.socialLinks).map(([platform, url]) => {
223
+ if (!url) return null
224
+
225
+ return (
226
+ <Link
227
+ key={platform}
228
+ href={url}
229
+ target="_blank"
230
+ rel="noopener noreferrer"
231
+ className="rounded-full bg-white/10 p-2 text-white/80 backdrop-blur-sm transition-all duration-200 hover:scale-110 hover:bg-white/20 hover:text-white"
232
+ aria-label={`${member.name} on ${platform}`}
233
+ >
234
+ {getSocialIcon(platform)}
235
+ </Link>
236
+ )
237
+ })}
238
+ </div>
239
+ )}
240
+ </div>
241
+ </div>
242
+ </div>
243
+ ))}
244
+ </div>
245
+ </div>
246
+ </section>
247
+ )
248
+ }
249
+
250
+ export const DDTeamCards = TeamCardsComponent
251
+ export default TeamCardsComponent
@@ -0,0 +1,4 @@
1
+ # DD-TeamCards
2
+
3
+ Portable first-pass conversion of `TeamCards` from ROUND-TWO-CONVERSION. Project-specific roots and nested unconverted block dependencies were intentionally replaced with local rendering so the template can install into a clean Payload project.
4
+