Batch commit of the pending working tree on security/audit-fixes-2026-07. Major areas: - Outbound webhooks / Zapier: schema + signed delivery with retries, public v1 API (REST-hook subscribe/unsubscribe), settings UI, cron drain. - Deploy hardening: email via SMTP2GO (Resend fully removed), verified DB TLS (DATABASE_SSL=require + DATABASE_CA), storage fails loud in production when Spaces is unconfigured instead of silently using ephemeral disk. - Integrations & features (concurrent work): accounting (QuickBooks/Xero), e-signature (DocuSign/Dropbox Sign), PayPal, geocoding/maps, onboarding, expanded legal pages. - DB migrations 0006–0009. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
74 lines
1.8 KiB
TypeScript
74 lines
1.8 KiB
TypeScript
import Link from "next/link"
|
|
import Image from "next/image"
|
|
import { cn } from "@/lib/utils"
|
|
|
|
type Size = "sm" | "md" | "lg"
|
|
type Theme = "light" | "dark"
|
|
|
|
// Wordmark lockup height per size — width follows the image's aspect ratio.
|
|
const WORDMARK_H: Record<Size, string> = {
|
|
sm: "h-6", // 24px
|
|
md: "h-7", // 28px
|
|
lg: "h-8", // 32px
|
|
}
|
|
|
|
// Square brand-mark box per size.
|
|
const MARK_BOX: Record<Size, string> = {
|
|
sm: "h-7 w-7",
|
|
md: "h-8 w-8",
|
|
lg: "h-9 w-9",
|
|
}
|
|
|
|
/** The square brand mark (framework "monster") — used where space is tight, e.g. the collapsed sidebar. */
|
|
export function LogoMark({ size = "md", className }: { size?: Size; className?: string }) {
|
|
return (
|
|
<Image
|
|
src="/logo-mark.png"
|
|
alt="Property Management Network"
|
|
width={512}
|
|
height={512}
|
|
priority
|
|
className={cn("shrink-0 rounded-lg object-contain", MARK_BOX[size], className)}
|
|
/>
|
|
)
|
|
}
|
|
|
|
/**
|
|
* Full brand wordmark lockup (mark + "Property Management Network").
|
|
* `theme="light"` (default) renders the white wordmark for dark surfaces;
|
|
* `theme="dark"` renders the dark wordmark for light surfaces.
|
|
* Pass `href={null}` to render a non-link version.
|
|
*/
|
|
export function Logo({
|
|
size = "md",
|
|
theme = "light",
|
|
className,
|
|
href = "/",
|
|
}: {
|
|
size?: Size
|
|
theme?: Theme
|
|
className?: string
|
|
href?: string | null
|
|
}) {
|
|
const img = (
|
|
<Image
|
|
src={theme === "dark" ? "/logo-dark.png" : "/logo-light.png"}
|
|
alt="Property Management Network"
|
|
width={375}
|
|
height={40}
|
|
priority
|
|
className={cn("w-auto", WORDMARK_H[size])}
|
|
/>
|
|
)
|
|
|
|
const classes = cn("flex items-center", className)
|
|
|
|
return href ? (
|
|
<Link href={href} className={classes} aria-label="Property Management Network">
|
|
{img}
|
|
</Link>
|
|
) : (
|
|
<div className={classes}>{img}</div>
|
|
)
|
|
}
|