/* global React */
const { useState } = React;
/* ---------------- Lucide-style icon ---------------- */
function Icon({ name, size = 20, stroke = 1.75, className = "", style = {} }) {
const paths = {
"calendar": <>>,
"calendar-days": <>>,
"map-pin": <>>,
"clock": <>>,
"phone": ,
"stethoscope": <>>,
"heart-pulse": <>>,
"scan-line": <>>,
"flask": <>>,
"heart": ,
"shield-check": <>>,
"user": <>>,
"users": <>>,
"activity": ,
"baby": <>>,
"brain": <>>,
"bone": ,
"smile": <>>,
"tooth": ,
"lungs": <>>,
"ribbon": <>>,
"head-side": <>>,
"sparkle": <>>,
"whatsapp": ,
"menu": <>>,
"x": ,
"check": ,
"check-circle": <>>,
"arrow-right": <>>,
"arrow-up-right": <>>,
"chevron-down": ,
"chevron-right": ,
"plus": <>>,
"minus": ,
"instagram": <>>,
"facebook": ,
"search": <>>,
"mail": <>>,
"external": <>>,
"shield": ,
"award": <>>,
"image": <>>,
"play": ,
"lock": <>>,
"file-text": <>>,
"info": <>>,
};
return (
);
}
/* ---------------- Eyebrow ---------------- */
function Eyebrow({ children, color = "accent" }) {
const c = color === "blue" ? "var(--ms-blue-500)"
: color === "green" ? "var(--ms-green-700)"
: "var(--site-accent-700)";
return
{children}
;
}
/* ---------------- Section title ---------------- */
function SectionTitle({ eyebrow, eyebrowColor, title, kicker, align = "left", maxWidth = 720 }) {
return (
{eyebrow &&
{eyebrow}}
{title}
{kicker &&
{kicker}
}
);
}
/* ---------------- Button ---------------- */
function Button({ children, variant = "primary", size = "md", icon, iconAfter, onClick, href, target, style: extra = {}, type, fullWidth }) {
const base = {
fontFamily: "inherit", fontWeight: 700, lineHeight: 1, borderRadius: 999,
display: fullWidth ? "flex" : "inline-flex", alignItems: "center", justifyContent: "center", gap: 8, cursor: "pointer",
border: 0, textDecoration: "none", whiteSpace: "nowrap",
transition: "background var(--dur-fast), color var(--dur-fast), transform var(--dur-fast), box-shadow var(--dur-base)",
width: fullWidth ? "100%" : undefined,
};
const sizes = {
sm: { fontSize: 13, padding: "10px 16px", minHeight: 36 },
md: { fontSize: 15, padding: "14px 22px", minHeight: 46 },
lg: { fontSize: 17, padding: "18px 28px", minHeight: 56 },
};
const variants = {
primary: { background: "var(--site-accent-500)", color: "#fff", boxShadow: "var(--site-accent-glow)" },
secondary: { background: "var(--ms-blue-500)", color: "#fff", boxShadow: "var(--sh-brand-glow)" },
outline: { background: "transparent", color: "var(--ms-blue-700)", border: "2px solid var(--ms-blue-200)" },
ghost: { background: "transparent", color: "var(--ms-blue-700)" },
onbrand: { background: "#fff", color: "var(--ms-blue-700)" },
whatsapp: { background: "#25D366", color: "#fff", boxShadow: "0 8px 24px rgba(37,211,102,0.32)" },
};
const style = { ...base, ...sizes[size], ...variants[variant], ...extra };
const Comp = href ? "a" : "button";
return (
{icon && }
{children}
{iconAfter && }
);
}
/* ---------------- Icon circle ---------------- */
function IconCircle({ name, color = "accent", size = 48, stroke = 1.75 }) {
const palette = {
accent: { bg: "var(--site-accent-100)", fg: "var(--site-accent-700)" },
green: { bg: "var(--ms-green-100)", fg: "var(--ms-green-700)" },
blue: { bg: "var(--ms-blue-100)", fg: "var(--ms-blue-600)" },
"blue-solid": { bg: "var(--ms-blue-500)", fg: "#fff" },
"accent-solid": { bg: "var(--site-accent-500)", fg: "#fff" },
white: { bg: "rgba(255,255,255,0.18)", fg: "#fff" },
};
const { bg, fg } = palette[color] || palette.accent;
return (
);
}
/* ---------------- Badge ---------------- */
function Badge({ children, variant = "soft-accent", icon }) {
const styles = {
"soft-accent": { background: "var(--site-accent-100)", color: "var(--site-accent-800)" },
"soft-green": { background: "var(--ms-green-100)", color: "var(--ms-green-800)" },
"soft-blue": { background: "var(--ms-blue-100)", color: "var(--ms-blue-700)" },
"solid-green": { background: "var(--ms-green-500)", color: "#fff" },
"solid-blue": { background: "var(--ms-blue-500)", color: "#fff" },
"solid-accent":{ background: "var(--site-accent-500)", color: "#fff" },
"outline": { background: "transparent", color: "var(--ms-blue-700)", border: "1.5px solid var(--ms-blue-200)" },
"warning": { background: "#FFF1D6", color: "#8A5A0A" },
"danger": { background: "#FDE4E4", color: "#7A2727" },
};
return
{icon && }
{children}
;
}
/* ---------------- Field ---------------- */
function Field({ label, type = "text", placeholder, hint, value, onChange, icon }) {
const [focused, setFocused] = useState(false);
return (
);
}
/* ---------------- Doctor avatar (SVG placeholder) ---------------- */
function DoctorAvatar({ name = "", color = "blue", size = 64 }) {
// Build initials
const initials = name
.replace(/^Dra?\.\s*/i, "")
.split(" ")
.filter(Boolean)
.slice(0, 2)
.map(w => w[0])
.join("")
.toUpperCase() || "?";
const palettes = {
blue: ["#296586", "#4d85a4"],
green: ["#559143", "#8ccb71"],
teal: ["#1a445f", "#7aa6bd"],
sand: ["#a78c5e", "#d8c69a"],
rose: ["#a4495e", "#d28799"],
plum: ["#6f4a7a", "#a78bb0"],
};
const [c1, c2] = palettes[color] || palettes.blue;
return (
{initials}
);
}
/* ---------------- Card (basic) ---------------- */
function Card({ children, style = {}, accentBar = false, hoverable = false, padding = 24 }) {
return (
{accentBar &&
}
{children}
);
}
/* ---------------- WhatsApp brand mark (PNG) ----------------
Use this in prominent brand placements (bubble button, footer social,
header phone link, "Recepção" channel card). Inside colored buttons
keep `` — the SVG adapts to currentColor. */
function WhatsAppMark({ size = 24, className = "", style = {}, alt = "" }) {
return (
);
}
Object.assign(window, { Icon, Eyebrow, SectionTitle, Button, IconCircle, Badge, Field, DoctorAvatar, Card, WhatsAppMark });