"use client"; /** * `` — v1.4.33 IW4 polish primitive. * * Every Settings card paints the same shape: a primary icon, a title, * an optional status surface (badge / pill / inline switch), and an * optional short description below the title. Before this primitive * the codebase carried five different `flex flex-wrap items-start * justify-between` permutations across `account-section.tsx`, * `integrations-section.tsx`, `notification-status-card.tsx`, * `telegram-card.tsx`, `ntfy-card.tsx`, `web-push-card.tsx`, * `api-section.tsx`, and `advanced-section.tsx`. The audit's mechanical * drift report (`.planning/round-v1433-audit-settings.md` §2.5) listed * one card with `mb-4 flex items-center gap-2`, the next with * `flex flex-col gap-3 sm:flex-row sm:justify-between`, another with * `flex flex-wrap items-start justify-between`, etc. * * The primitive consolidates the contract: * - Icon left, title right of it (`gap-2` between them). * - Optional status slot lives top-right; on ``. * Accepts a node so a card can wrap the title in a link. */ title: React.ReactNode; /** Optional id for the `

` so an outer `aria-labelledby` * attribute on the card itself can reference it. */ titleId?: string; /** Optional inline accessory rendered in the title row, immediately * after the title (e.g. a tag chip + experimental badge). The title * row wraps so the accessories reflow below on a narrow viewport. */ titleAccessory?: React.ReactNode; /** Optional description rendered as muted text below the title row. * Exactly ONE sentence, guideline ≤ 120 characters (design standards * §3). A node is accepted so the sentence can carry an inline link, * not so it can carry a second paragraph — the slot owns no vertical * rhythm, so a stack of `

`s collapses into one run and reads * broken. Multi-sentence prose goes in the body as * `

` (foreground). */ description?: React.ReactNode; /** Optional right-aligned status surface — typically an * `` or a wrapper around badges. */ status?: React.ReactNode; /** Optional extra classes applied to the outer wrapper. */ className?: string; } export function SettingsCardHeader({ icon: Icon, title, titleId, titleAccessory, description, status, className, }: SettingsCardHeaderProps) { return (

); }