@@ -248,7 +255,25 @@ export function SignatureConfigurator({
{/* Personal data */}
-
Date personale
+
+
Date personale
+ {user && user.name && (
+
+ )}
+
Stil & Aranjare
+
+ {/* Logo scale slider */}
+
+
+
+
+ {Math.round((config.layout.logoScale ?? 1) * 100)}%
+
+
+
+ onUpdateLayout("logoScale", parseInt(e.target.value, 10) / 100)
+ }
+ className="mt-1 w-full accent-primary"
+ />
+
+
{LAYOUT_CONTROLS.map(({ key, label, min, max }) => (
@@ -380,6 +427,137 @@ export function SignatureConfigurator({
))}
+
+
+
+ {/* Promotional banner */}
+ {onSetBanner && (
+
+
+
Banner promoțional
+ {config.banner ? (
+
+ ) : (
+
+ )}
+
+ {config.banner && (
+
+
+
+
+ onSetBanner({
+ ...config.banner!,
+ imageUrl: e.target.value,
+ })
+ }
+ className="mt-1"
+ />
+
+
+
+
+ onSetBanner({
+ ...config.banner!,
+ linkUrl: e.target.value,
+ })
+ }
+ className="mt-1"
+ />
+
+
+
+
+ onSetBanner({ ...config.banner!, alt: e.target.value })
+ }
+ className="mt-1"
+ />
+
+
+ {config.banner.imageUrl && (
+
+
+ Previzualizare:
+
+ {/* eslint-disable-next-line @next/next/no-img-element */}
+

+
+ )}
+
+ )}
+
+ )}
);
}
diff --git a/src/modules/email-signature/hooks/use-signature-config.ts b/src/modules/email-signature/hooks/use-signature-config.ts
index 0b3c1f0..f814ae1 100644
--- a/src/modules/email-signature/hooks/use-signature-config.ts
+++ b/src/modules/email-signature/hooks/use-signature-config.ts
@@ -1,9 +1,14 @@
-'use client';
+"use client";
-import { useState, useCallback, useMemo } from 'react';
-import type { CompanyId } from '@/core/auth/types';
-import type { SignatureConfig, SignatureVariant, SignatureColors, SignatureLayout } from '../types';
-import { getBranding } from '../services/company-branding';
+import { useState, useCallback, useMemo } from "react";
+import type { CompanyId } from "@/core/auth/types";
+import type {
+ SignatureConfig,
+ SignatureVariant,
+ SignatureColors,
+ SignatureLayout,
+} from "../types";
+import { getBranding } from "../services/company-branding";
const DEFAULT_LAYOUT: SignatureLayout = {
greenLineWidth: 97,
@@ -14,46 +19,55 @@ const DEFAULT_LAYOUT: SignatureLayout = {
sectionSpacing: 10,
titleSpacing: 2,
logoSpacing: 10,
+ logoScale: 1,
};
-function createDefaultConfig(company: CompanyId = 'beletage'): SignatureConfig {
+function createDefaultConfig(company: CompanyId = "beletage"): SignatureConfig {
const branding = getBranding(company);
return {
- prefix: 'arh.',
- name: '',
- title: '',
- phone: '',
+ prefix: "arh.",
+ name: "",
+ title: "",
+ phone: "",
company,
colors: { ...branding.defaultColors },
layout: { ...DEFAULT_LAYOUT },
- variant: 'full',
+ variant: "full",
useSvg: false,
};
}
-export function useSignatureConfig(initialCompany: CompanyId = 'beletage') {
- const [config, setConfig] = useState
(() => createDefaultConfig(initialCompany));
+export function useSignatureConfig(initialCompany: CompanyId = "beletage") {
+ const [config, setConfig] = useState(() =>
+ createDefaultConfig(initialCompany),
+ );
- const updateField = useCallback((
- key: K,
- value: SignatureConfig[K]
- ) => {
- setConfig((prev) => ({ ...prev, [key]: value }));
- }, []);
+ const updateField = useCallback(
+ (key: K, value: SignatureConfig[K]) => {
+ setConfig((prev) => ({ ...prev, [key]: value }));
+ },
+ [],
+ );
- const updateColor = useCallback((key: keyof SignatureColors, value: string) => {
- setConfig((prev) => ({
- ...prev,
- colors: { ...prev.colors, [key]: value },
- }));
- }, []);
+ const updateColor = useCallback(
+ (key: keyof SignatureColors, value: string) => {
+ setConfig((prev) => ({
+ ...prev,
+ colors: { ...prev.colors, [key]: value },
+ }));
+ },
+ [],
+ );
- const updateLayout = useCallback((key: keyof SignatureLayout, value: number) => {
- setConfig((prev) => ({
- ...prev,
- layout: { ...prev.layout, [key]: value },
- }));
- }, []);
+ const updateLayout = useCallback(
+ (key: keyof SignatureLayout, value: number) => {
+ setConfig((prev) => ({
+ ...prev,
+ layout: { ...prev.layout, [key]: value },
+ }));
+ },
+ [],
+ );
const setVariant = useCallback((variant: SignatureVariant) => {
setConfig((prev) => ({ ...prev, variant }));
@@ -80,15 +94,28 @@ export function useSignatureConfig(initialCompany: CompanyId = 'beletage') {
setConfig(loaded);
}, []);
- return useMemo(() => ({
- config,
- updateField,
- updateColor,
- updateLayout,
- setVariant,
- setCompany,
- setAddress,
- resetToDefaults,
- loadConfig,
- }), [config, updateField, updateColor, updateLayout, setVariant, setCompany, setAddress, resetToDefaults, loadConfig]);
+ return useMemo(
+ () => ({
+ config,
+ updateField,
+ updateColor,
+ updateLayout,
+ setVariant,
+ setCompany,
+ setAddress,
+ resetToDefaults,
+ loadConfig,
+ }),
+ [
+ config,
+ updateField,
+ updateColor,
+ updateLayout,
+ setVariant,
+ setCompany,
+ setAddress,
+ resetToDefaults,
+ loadConfig,
+ ],
+ );
}
diff --git a/src/modules/email-signature/services/company-branding.ts b/src/modules/email-signature/services/company-branding.ts
index 4787e25..6c408c6 100644
--- a/src/modules/email-signature/services/company-branding.ts
+++ b/src/modules/email-signature/services/company-branding.ts
@@ -103,10 +103,13 @@ export const COMPANY_BRANDING: Record = {
svg: "/logos/logo-us-light.svg",
},
slashGrey: {
- png: "https://beletage.ro/img/Grey-slash.png",
- svg: "https://beletage.ro/img/Grey-slash.svg",
+ png: "/logos/us-dash-grey.svg",
+ svg: "/logos/us-dash-grey.svg",
+ },
+ slashAccent: {
+ png: "/logos/us-dash-accent.svg",
+ svg: "/logos/us-dash-accent.svg",
},
- slashAccent: { png: "", svg: "" },
logoDimensions: { width: 140, height: 24 },
address: [...ADDR_CHRISTESCU],
website: "www.urbanswitch.ro",
@@ -122,10 +125,13 @@ export const COMPANY_BRANDING: Record = {
svg: "/logos/logo-sdt-light.svg",
},
slashGrey: {
- png: "https://beletage.ro/img/Grey-slash.png",
- svg: "https://beletage.ro/img/Grey-slash.svg",
+ png: "/logos/sdt-dot-grey.svg",
+ svg: "/logos/sdt-dot-grey.svg",
+ },
+ slashAccent: {
+ png: "/logos/sdt-dot-accent.svg",
+ svg: "/logos/sdt-dot-accent.svg",
},
- slashAccent: { png: "", svg: "" },
logoDimensions: { width: 71, height: 24 },
address: [...ADDR_CHRISTESCU],
website: "www.studiideteren.ro",
diff --git a/src/modules/email-signature/services/signature-builder.ts b/src/modules/email-signature/services/signature-builder.ts
index 7a95caf..cbb7ec1 100644
--- a/src/modules/email-signature/services/signature-builder.ts
+++ b/src/modules/email-signature/services/signature-builder.ts
@@ -37,13 +37,19 @@ export function generateSignatureHtml(config: SignatureConfig): string {
sectionSpacing,
titleSpacing,
logoSpacing,
+ logoScale,
} = config.layout;
const colors = config.colors;
const isReply = config.variant === "reply" || config.variant === "minimal";
const isMinimal = config.variant === "minimal";
- const logoDim = branding.logoDimensions ?? { width: 162, height: 24 };
+ const rawDim = branding.logoDimensions ?? { width: 162, height: 24 };
+ const scale = logoScale ?? 1;
+ const logoDim = {
+ width: Math.round(rawDim.width * scale),
+ height: Math.round(rawDim.height * scale),
+ };
const hide =
"mso-hide:all;display:none!important;max-height:0;overflow:hidden;font-size:0;line-height:0;";
@@ -122,6 +128,7 @@ export function generateSignatureHtml(config: SignatureConfig): string {
${branding.motto ? `| ${esc(branding.motto)} |
` : ""}
+ ${config.banner?.imageUrl ? `}) |
` : ""}
`;
}
diff --git a/src/modules/email-signature/types.ts b/src/modules/email-signature/types.ts
index cd220a9..d058d38 100644
--- a/src/modules/email-signature/types.ts
+++ b/src/modules/email-signature/types.ts
@@ -21,6 +21,16 @@ export interface SignatureLayout {
sectionSpacing: number;
titleSpacing: number;
logoSpacing: number;
+ /** Logo scale factor (0.5–2.0, default 1.0) */
+ logoScale: number;
+}
+
+export interface SignatureBanner {
+ imageUrl: string;
+ linkUrl: string;
+ alt: string;
+ width: number;
+ height: number;
}
export interface CompanyBranding {
@@ -52,6 +62,8 @@ export interface SignatureConfig {
useSvg: boolean;
/** Override the default company address */
addressOverride?: string[];
+ /** Optional promotional banner below signature */
+ banner?: SignatureBanner;
}
export interface SavedSignature {