|
1 | 1 | "use client"; |
2 | 2 |
|
3 | | -import React, { useEffect, useState } from "react"; |
| 3 | +import { useEffect, useState } from "react"; |
4 | 4 | import type { |
5 | 5 | Address, |
6 | 6 | Alignment, |
@@ -29,8 +29,9 @@ import { |
29 | 29 | verticalPadding as defaultVerticalPadding, |
30 | 30 | horizontalPadding as defaultHorizontalPadding, |
31 | 31 | mediaAspectRatio as defaultMediaAspectRatio, |
| 32 | + mediaLayout as defaultMediaLayout, |
32 | 33 | } from "./defaults"; |
33 | | -import { MediaAspectRatio } from "./types"; |
| 34 | +import { MediaAspectRatio, MediaLayout } from "./types"; |
34 | 35 |
|
35 | 36 | interface AdminWidgetProps { |
36 | 37 | name: string; |
@@ -118,6 +119,15 @@ export default function AdminWidget({ |
118 | 119 | settings.mediaAspectRatio || defaultMediaAspectRatio, |
119 | 120 | ); |
120 | 121 | const [cssId, setCssId] = useState(settings.cssId); |
| 122 | + const [backgroundMedia, setBackgroundMedia] = useState<Partial<Media>>( |
| 123 | + settings.backgroundMedia || {}, |
| 124 | + ); |
| 125 | + const [overlayColor, setOverlayColor] = useState<string>(settings.overlayColor || "#FFFFFF"); |
| 126 | + const [overlayOpacity, setOverlayOpacity] = useState<number>(settings.overlayOpacity || 0.9); |
| 127 | + const [mediaLayout, setdMediaLayout] = |
| 128 | + useState<MediaLayout>( |
| 129 | + settings.mediaLayout || defaultMediaLayout, |
| 130 | + ); |
121 | 131 |
|
122 | 132 | const onSettingsChanged = () => |
123 | 133 | onChange({ |
@@ -145,6 +155,10 @@ export default function AdminWidget({ |
145 | 155 | descriptionFontSize, |
146 | 156 | contentAlignment, |
147 | 157 | cssId, |
| 158 | + backgroundMedia, |
| 159 | + overlayColor, |
| 160 | + overlayOpacity, |
| 161 | + mediaLayout, |
148 | 162 | }); |
149 | 163 |
|
150 | 164 | useEffect(() => { |
@@ -174,6 +188,10 @@ export default function AdminWidget({ |
174 | 188 | descriptionFontSize, |
175 | 189 | contentAlignment, |
176 | 190 | cssId, |
| 191 | + backgroundMedia, |
| 192 | + overlayColor, |
| 193 | + overlayOpacity, |
| 194 | + mediaLayout, |
177 | 195 | ]); |
178 | 196 |
|
179 | 197 | return ( |
@@ -246,6 +264,71 @@ export default function AdminWidget({ |
246 | 264 | /> |
247 | 265 | )} |
248 | 266 | </AdminWidgetPanel> |
| 267 | + <AdminWidgetPanel title="Background"> |
| 268 | + <PageBuilderPropertyHeader label="Upload media" /> |
| 269 | + <MediaSelector |
| 270 | + title="" |
| 271 | + src={backgroundMedia && backgroundMedia.thumbnail} |
| 272 | + srcTitle={ |
| 273 | + backgroundMedia && backgroundMedia.originalFileName |
| 274 | + } |
| 275 | + profile={profile} |
| 276 | + address={address} |
| 277 | + onSelection={(backgroundMedia: Media) => { |
| 278 | + if (backgroundMedia) { |
| 279 | + setBackgroundMedia(backgroundMedia); |
| 280 | + } |
| 281 | + }} |
| 282 | + onRemove={() => { |
| 283 | + setBackgroundMedia({}); |
| 284 | + }} |
| 285 | + strings={{}} |
| 286 | + access="public" |
| 287 | + mediaId={backgroundMedia && backgroundMedia.mediaId} |
| 288 | + type="page" |
| 289 | + /> |
| 290 | + <ColorSelector |
| 291 | + title="Overlay color" |
| 292 | + value={overlayColor || "inherit"} |
| 293 | + onChange={(value?: string) => |
| 294 | + setOverlayColor(value) |
| 295 | + } |
| 296 | + /> |
| 297 | + <PageBuilderSlider |
| 298 | + className="mt-2" |
| 299 | + title="Overlay opacity" |
| 300 | + value={overlayOpacity} |
| 301 | + min={0} |
| 302 | + max={1} |
| 303 | + step={0.01} |
| 304 | + onChange={setOverlayOpacity} |
| 305 | + /> |
| 306 | + {backgroundMedia && backgroundMedia.mediaId && ( |
| 307 | + <Select |
| 308 | + title="Layout" |
| 309 | + value={mediaLayout} |
| 310 | + options={[ |
| 311 | + { |
| 312 | + label: "Cover", |
| 313 | + value: "object-cover", |
| 314 | + }, |
| 315 | + { |
| 316 | + label: "Contain", |
| 317 | + value: "object-contain", |
| 318 | + }, |
| 319 | + { label: "Fill", value: "object-fill" }, |
| 320 | + { |
| 321 | + label: "Scale down", |
| 322 | + value: "object-scale-down", |
| 323 | + }, |
| 324 | + { label: "Original", value: "object-none" }, |
| 325 | + ]} |
| 326 | + onChange={(value: MediaLayout) => |
| 327 | + setdMediaLayout(value) |
| 328 | + } |
| 329 | + /> |
| 330 | + )} |
| 331 | + </AdminWidgetPanel> |
249 | 332 | <AdminWidgetPanel title="Calls to action"> |
250 | 333 | <Accordion type="single" collapsible> |
251 | 334 | <AccordionItem value="primary"> |
|
0 commit comments