@marktiderman/genesis-forms-studio 0.1.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -1
- package/dist/{chunk-ZHH2UHOS.js → chunk-HP77TYTT.js} +111 -25
- package/dist/chunk-HP77TYTT.js.map +1 -0
- package/dist/index.d.ts +38 -8
- package/dist/index.js +130 -4
- package/dist/index.js.map +1 -1
- package/dist/{rules-BntWGD6S.d.ts → rules-Bpy8zTON.d.ts} +85 -9
- package/dist/rules.d.ts +2 -2
- package/dist/rules.js +1 -1
- package/package.json +6 -6
- package/dist/chunk-ZHH2UHOS.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/generic/chip.tsx","../src/generic/ResourceHeader.tsx","../src/generic/nav.tsx","../src/generic/ResponsesToolbar.tsx","../src/generic/HeadlineNumbers.tsx","../src/generic/SummaryCard.tsx","../src/generic/FollowUpList.tsx","../src/generic/ShareDialog.tsx","../src/generic/settings.tsx","../src/navIcons.ts","../src/ResponsesFilters.tsx","../src/QuestionSummaryCards.tsx"],"names":["jsxs","cn","jsx","Fragment","Check","TriangleAlert","Skeleton","Button","useState","ANY","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Input","Star","CircleCheck","ListChecks","Inbox"],"mappings":"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","file":"index.js","sourcesContent":["import type { ReactNode } from \"react\";\nimport { Badge, StatusBadge, cn } from \"@marktiderman/genesis-ui\";\nimport type { ChipTone } from \"./status\";\n\n/** A small status chip in one of the studio's tones (tinted, AA-safe Genesis badges). */\nexport function Chip({\n tone,\n icon,\n children,\n className,\n testID,\n}: {\n tone: ChipTone;\n icon?: ReactNode;\n children: ReactNode;\n className?: string | undefined;\n testID?: string | undefined;\n}) {\n const inner = (\n <>\n {icon ? <span className=\"mr-1 inline-flex [&_svg]:size-3\" aria-hidden>{icon}</span> : null}\n {children}\n </>\n );\n // Badge's destructive variant is a solid fill; the tinted red is StatusBadge's.\n if (tone === \"danger\") {\n return (\n <StatusBadge status=\"offTrack\" className={cn(\"font-normal\", className)} data-testid={testID}>\n {inner}\n </StatusBadge>\n );\n }\n return (\n <Badge variant={tone} className={cn(\"font-normal\", className)} data-testid={testID}>\n {inner}\n </Badge>\n );\n}\n","import type { ReactNode } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n Button,\n Separator,\n cn,\n} from \"@marktiderman/genesis-ui\";\nimport { Check, Eye, Loader2, Redo2, Rocket, Share2, TriangleAlert, Undo2 } from \"lucide-react\";\nimport { Chip } from \"./chip\";\nimport { SAVE_STATE_LABEL, type ChipTone, type SaveState } from \"./status\";\n\nexport interface ResourceHeaderProps {\n /** The title, shown once: as the heading and the breadcrumb's last part. */\n title: string;\n /** Shown when the title is empty. Default \"Untitled\". */\n untitled?: string | undefined;\n /**\n * The breadcrumb's parent link, e.g. `<Link to=\"/forms\">Forms</Link>`: one element, so\n * the host's router renders it.\n */\n parent?: ReactNode;\n /** The status chip, e.g. formStatusChip's \"Live · version 3\" or \"Draft\". */\n status?: { label: string; tone: ChipTone } | undefined;\n /** Where saving the draft stands; no chip when absent. */\n saveState?: SaveState | undefined;\n /** Undo and redo buttons, shown when given (for example the builder's history). */\n onUndo?: (() => void) | undefined;\n onRedo?: (() => void) | undefined;\n canUndo?: boolean | undefined;\n canRedo?: boolean | undefined;\n /** A Preview button. */\n onPreview?: (() => void) | undefined;\n /** A Share button (open a share dialog). */\n onShare?: (() => void) | undefined;\n /** The primary button: \"Publish\", or \"Publish changes\" once it is live. */\n publish?:\n | {\n onClick: () => void;\n label?: string | undefined;\n loading?: boolean | undefined;\n disabled?: boolean | undefined;\n }\n | undefined;\n /** Anything else for the right-hand side, before Preview (a Reload button, a menu). */\n actions?: ReactNode;\n className?: string | undefined;\n}\n\nconst SAVE_TONE: Record<SaveState, ChipTone> = {\n saved: \"muted\",\n saving: \"muted\",\n unsaved: \"muted\",\n failed: \"warning\",\n stopped: \"danger\",\n conflict: \"danger\",\n};\n\n/**\n * The header of a page that edits one publishable thing (a form, a course, a lesson, a\n * worksheet): the breadcrumb (\"Forms › name\"), the title once, its status and save-state\n * chips, and on the right undo and redo, Preview, Share and Publish. Every action is the\n * host's; a button shows only when its handler is given.\n */\nexport function ResourceHeader({\n title,\n untitled = \"Untitled\",\n parent,\n status,\n saveState,\n onUndo,\n onRedo,\n canUndo = true,\n canRedo = true,\n onPreview,\n onShare,\n publish,\n actions,\n className,\n}: ResourceHeaderProps) {\n const history = onUndo || onRedo;\n const name = title.trim() || untitled;\n return (\n <header\n data-slot=\"resource-header\"\n className={cn(\"flex flex-col gap-3 md:flex-row md:items-start md:justify-between\", className)}\n >\n <div className=\"min-w-0 flex-1 space-y-1\">\n {parent ? (\n <Breadcrumb>\n <BreadcrumbList className=\"text-xs\">\n <BreadcrumbItem>\n <BreadcrumbLink asChild>{parent}</BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem className=\"min-w-0\">\n <BreadcrumbPage className=\"truncate\">{name}</BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ) : null}\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1\">\n <h1 className=\"min-w-0 break-words text-xl font-semibold tracking-tight sm:text-2xl\">{name}</h1>\n {status ? (\n <Chip tone={status.tone} testID=\"resource-status\">\n {status.label}\n </Chip>\n ) : null}\n {saveState ? (\n <span aria-live=\"polite\">\n <Chip\n tone={SAVE_TONE[saveState]}\n testID=\"resource-save-state\"\n icon={\n saveState === \"saved\" ? (\n <Check />\n ) : saveState === \"saving\" ? (\n <Loader2 className=\"animate-spin\" />\n ) : saveState === \"unsaved\" ? null : (\n <TriangleAlert />\n )\n }\n >\n {SAVE_STATE_LABEL[saveState]}\n </Chip>\n </span>\n ) : null}\n </div>\n </div>\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n {history ? (\n <>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Undo\"\n title=\"Undo\"\n disabled={!onUndo || !canUndo}\n onClick={onUndo}\n data-testid=\"resource-undo\"\n >\n <Undo2 className=\"size-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Redo\"\n title=\"Redo\"\n disabled={!onRedo || !canRedo}\n onClick={onRedo}\n data-testid=\"resource-redo\"\n >\n <Redo2 className=\"size-4\" />\n </Button>\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n </>\n ) : null}\n {actions}\n {onPreview ? (\n <Button variant=\"ghost\" startIcon={<Eye className=\"size-4\" />} onClick={onPreview} data-testid=\"resource-preview\">\n Preview\n </Button>\n ) : null}\n {onShare ? (\n <Button variant=\"outline\" startIcon={<Share2 className=\"size-4\" />} onClick={onShare} data-testid=\"resource-share\">\n Share\n </Button>\n ) : null}\n {publish ? (\n <Button\n startIcon={<Rocket className=\"size-4\" />}\n loading={publish.loading}\n disabled={publish.disabled}\n onClick={publish.onClick}\n data-testid=\"resource-publish\"\n >\n {publish.label ?? \"Publish\"}\n </Button>\n ) : null}\n </div>\n </header>\n );\n}\n","\nimport { Check, CircleAlert, TriangleAlert } from \"lucide-react\";\nimport { Chip } from \"./chip\";\nimport { readinessChip, type Readiness } from \"./status\";\n\n/**\n * \"Ready to publish\", or how many problems to fix: for the trailing slot of a resource\n * page's row of tabs (genesis-ui's `<AppShellSubNavEnd>`). With `onClick` it is a button (open the checks).\n */\nexport function ReadinessChip({\n readiness,\n onClick,\n className,\n}: {\n readiness: Readiness;\n onClick?: (() => void) | undefined;\n className?: string | undefined;\n}) {\n const { label, tone } = readinessChip(readiness);\n const icon =\n readiness.state === \"ready\" ? <Check /> : readiness.state === \"problems\" ? <CircleAlert /> : readiness.state === \"warnings\" ? <TriangleAlert /> : null;\n const chip = (\n <Chip tone={tone} icon={icon} testID=\"readiness\" className={className}>\n {label}\n </Chip>\n );\n if (!onClick) return chip;\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"rounded-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {chip}\n </button>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { ToggleGroup, ToggleGroupItem, cn } from \"@marktiderman/genesis-ui\";\n\nexport type ResponsesView = \"summary\" | \"each\";\n\n/**\n * The Responses tab's toolbar: a Summary / Each response switch, the host's filters\n * (ResponsesFilters, or its own) and, on the right, its export actions (open a Sheet,\n * Download CSV).\n */\nexport function ResponsesToolbar({\n view,\n onViewChange,\n filters,\n actions,\n className,\n}: {\n view: ResponsesView;\n onViewChange: (view: ResponsesView) => void;\n filters?: ReactNode;\n actions?: ReactNode;\n className?: string | undefined;\n}) {\n return (\n <div\n data-slot=\"responses-toolbar\"\n className={cn(\"flex flex-col gap-2 lg:flex-row lg:items-start lg:justify-between\", className)}\n >\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <ToggleGroup\n type=\"single\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-9\"\n value={view}\n onValueChange={(v) => v && onViewChange(v as ResponsesView)}\n aria-label=\"Show responses as\"\n >\n <ToggleGroupItem value=\"summary\" className=\"h-9 px-3\" data-testid=\"responses-view-summary\">\n Summary\n </ToggleGroupItem>\n <ToggleGroupItem value=\"each\" className=\"h-9 px-3\" data-testid=\"responses-view-each\">\n Each response\n </ToggleGroupItem>\n </ToggleGroup>\n {filters}\n </div>\n {actions ? <div className=\"flex shrink-0 flex-wrap items-center gap-2\">{actions}</div> : null}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Skeleton, cn } from \"@marktiderman/genesis-ui\";\n\n/** One headline number: a label, the number, and a short line under it. */\nexport interface HeadlineNumber {\n key: string;\n label: string;\n value: ReactNode;\n detail?: ReactNode;\n /** The detail's colour: good news, bad news, a warning, or plain. Default plain. */\n tone?: \"positive\" | \"negative\" | \"warning\" | \"muted\" | undefined;\n}\n\nconst TONE: Record<NonNullable<HeadlineNumber[\"tone\"]>, string> = {\n positive: \"text-emerald-700 dark:text-emerald-300\",\n negative: \"text-red-700 dark:text-red-300\",\n warning: \"text-amber-800 dark:text-amber-200\",\n muted: \"text-muted-foreground\",\n};\n\n/** A row of headline numbers (KPI cards): two across on a phone, up to four on a wide screen. */\nexport function HeadlineNumbers({\n numbers,\n isLoading = false,\n className,\n}: {\n numbers: readonly HeadlineNumber[];\n isLoading?: boolean | undefined;\n className?: string | undefined;\n}) {\n if (isLoading) {\n return (\n <div className={cn(\"grid grid-cols-2 gap-3 lg:grid-cols-4\", className)}>\n {[0, 1, 2, 3].map((i) => (\n <Skeleton key={i} className=\"h-28 w-full rounded-lg\" />\n ))}\n </div>\n );\n }\n if (!numbers.length) return null;\n return (\n <dl\n data-slot=\"headline-numbers\"\n className={cn(\n \"grid grid-cols-2 gap-3\",\n numbers.length >= 4 ? \"lg:grid-cols-4\" : numbers.length === 3 ? \"lg:grid-cols-3\" : \"\",\n className,\n )}\n >\n {numbers.map((n) => (\n <div\n key={n.key}\n className=\"flex min-w-0 flex-col gap-1 rounded-lg border border-border bg-card p-4 text-card-foreground\"\n data-testid={`headline-${n.key}`}\n >\n <dt className=\"truncate text-sm text-muted-foreground\">{n.label}</dt>\n <dd className=\"text-2xl font-semibold tabular-nums tracking-tight sm:text-3xl\">{n.value}</dd>\n {n.detail ? <dd className={cn(\"text-xs\", TONE[n.tone ?? \"muted\"])}>{n.detail}</dd> : null}\n </div>\n ))}\n </dl>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"@marktiderman/genesis-ui\";\n\n/**\n * One card of a summary column: an icon and a title, a short line on the right (\"24\n * answers · average 4.1\"), then whatever summarises it (bars, quotes, a split bar).\n */\nexport function SummaryCard({\n icon,\n title,\n meta,\n children,\n className,\n testID,\n}: {\n icon?: ReactNode;\n title: string;\n meta?: ReactNode;\n children?: ReactNode;\n className?: string | undefined;\n testID?: string | undefined;\n}) {\n return (\n <section\n aria-label={title}\n data-testid={testID}\n data-slot=\"summary-card\"\n className={cn(\"flex flex-col gap-4 rounded-lg border border-border bg-card p-5 text-card-foreground\", className)}\n >\n <header className=\"flex flex-wrap items-baseline justify-between gap-x-4 gap-y-1\">\n <h3 className=\"flex min-w-0 items-center gap-2 font-semibold\">\n {icon ? (\n <span className=\"shrink-0 text-muted-foreground [&_svg]:size-4\" aria-hidden>\n {icon}\n </span>\n ) : null}\n <span className=\"min-w-0 break-words\">{title}</span>\n </h3>\n {meta ? <span className=\"text-xs text-muted-foreground\">{meta}</span> : null}\n </header>\n {children}\n </section>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Skeleton, cn } from \"@marktiderman/genesis-ui\";\nimport { CircleCheck, Star, TriangleAlert } from \"lucide-react\";\nimport { Chip } from \"./chip\";\nimport type { ChipTone } from \"./status\";\n\n/** One response in the follow-up list, as the host describes it. */\nexport interface FollowUpEntry {\n id: string;\n /** Who answered: a name, or \"Anonymous\". */\n name: string;\n /** A tag beside the name, e.g. \"Member\" or \"New lead\". */\n tag?: { label: string; tone?: ChipTone | undefined } | undefined;\n /** One line under the name: \"Today · 6:00 WOD · Leo\". */\n meta?: ReactNode;\n /** What they wrote; null shows \"No comment\". */\n comment?: string | null | undefined;\n /** The low score, on its scale. */\n rating?: { value: number; max: number } | null | undefined;\n}\n\n/**\n * Responses that need a follow-up (needsFollowUp), each with who answered, a tag, the day\n * and context, their comment, its low score and the host's actions (Reply, Mark handled).\n * Handled items are the host's to leave out.\n */\nexport function FollowUpList({\n entries,\n actions,\n title = \"Needs a follow-up\",\n isLoading = false,\n empty = \"Nothing to follow up right now.\",\n className,\n}: {\n entries: readonly FollowUpEntry[];\n /** Buttons for one entry. */\n actions?: ((entry: FollowUpEntry) => ReactNode) | undefined;\n title?: string | undefined;\n isLoading?: boolean | undefined;\n /** Said when the list is empty. */\n empty?: ReactNode;\n className?: string | undefined;\n}) {\n return (\n <section\n aria-label={title}\n data-testid=\"follow-up-list\"\n className={cn(\"flex flex-col gap-3 rounded-lg border border-border bg-card p-4 text-card-foreground\", className)}\n >\n <header className=\"flex items-center justify-between gap-2\">\n <h3 className=\"flex items-center gap-2 font-semibold\">\n <TriangleAlert className=\"size-4 text-amber-800 dark:text-amber-200\" aria-hidden />\n {title}\n </h3>\n {!isLoading ? (\n <span className=\"rounded-md bg-muted px-2 py-0.5 text-xs tabular-nums text-muted-foreground\">\n {entries.length}\n </span>\n ) : null}\n </header>\n {isLoading ? (\n <>\n <Skeleton className=\"h-24 w-full rounded-md\" />\n <Skeleton className=\"h-24 w-full rounded-md\" />\n </>\n ) : entries.length === 0 ? (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <CircleCheck className=\"size-4 shrink-0\" aria-hidden />\n {empty}\n </p>\n ) : (\n <ul className=\"flex flex-col gap-3\">\n {entries.map((entry) => {\n const buttons = actions?.(entry);\n return (\n <li\n key={entry.id}\n className=\"flex flex-col gap-1.5 rounded-md border border-border p-3\"\n data-testid={`follow-up-${entry.id}`}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <span className=\"break-words font-medium\">{entry.name}</span>\n {entry.tag ? <Chip tone={entry.tag.tone ?? \"muted\"}>{entry.tag.label}</Chip> : null}\n </p>\n {entry.rating ? (\n <span\n className=\"flex shrink-0 items-center gap-0.5 text-sm font-medium tabular-nums text-amber-800 dark:text-amber-200\"\n role=\"img\"\n aria-label={`Rated ${entry.rating.value} out of ${entry.rating.max}`}\n >\n {entry.rating.value}\n <Star className=\"size-3.5 fill-current\" aria-hidden />\n </span>\n ) : null}\n </div>\n {entry.meta ? <p className=\"text-xs text-muted-foreground\">{entry.meta}</p> : null}\n <p className={cn(\"line-clamp-3 break-words text-sm\", !entry.comment && \"text-muted-foreground\")}>\n {entry.comment || \"No comment\"}\n </p>\n {buttons ? <div className=\"mt-1 flex flex-wrap gap-2\">{buttons}</div> : null}\n </li>\n );\n })}\n </ul>\n )}\n </section>\n );\n}\n","import { useId, useState, type ReactNode } from \"react\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Textarea,\n toast,\n} from \"@marktiderman/genesis-ui\";\nimport { Copy, ExternalLink, Printer } from \"lucide-react\";\nimport { embedSnippet, prefilledUrl, type PrefillChoice } from \"./share\";\n\n\n\nconst ANY = \"__any\";\n\nasync function copy(text: string, what: string) {\n try {\n await navigator.clipboard.writeText(text);\n toast.success(`${what} copied.`);\n } catch {\n toast.error(\"Couldn't copy. Select it and copy it instead.\");\n }\n}\n\nfunction CopyField({\n id,\n label,\n value,\n what,\n}: {\n id: string;\n label: string;\n value: string;\n what: string;\n}) {\n return (\n <div className=\"space-y-1.5\">\n <Label htmlFor={id}>{label}</Label>\n <div className=\"flex gap-2\">\n <Input id={id} readOnly value={value} onFocus={(e) => e.target.select()} />\n <Button\n variant=\"outline\"\n startIcon={<Copy className=\"size-4\" />}\n onClick={() => void copy(value, what)}\n >\n Copy\n </Button>\n </div>\n </div>\n );\n}\n\n/**\n * Sharing one published page (a form, a course), as Google Forms' Send step: its link with Copy, a QR code\n * (and a printable poster when the host has one), an `<iframe>` to embed it on a website,\n * and a builder for prefilled links (`?class=…&coach=…`, or whatever the host offers).\n * Generic: the host passes the link, how to draw a QR code, and the prefill choices.\n * Moved up from Breakthrough's src/components/forms/ShareDialog.tsx.\n */\nexport function ShareDialog({\n open,\n onOpenChange,\n noun = \"form\",\n title = `Share your ${noun}`,\n description = \"Anyone with the link can answer.\",\n url,\n posterUrl,\n renderQr,\n name,\n prefill = [],\n prefillNote,\n defaultTab = \"link\",\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title?: string | undefined;\n description?: ReactNode;\n /** The public link; null while it is still loading. */\n url: string | null;\n /** A printable poster for a link (the base link, or a prefilled one), when the host has one. */\n posterUrl?: ((url: string, prefill: Record<string, string>) => string | null) | undefined;\n /** Draws a QR code for a link. */\n renderQr?: ((url: string) => ReactNode) | undefined;\n /** Its name, for the embed's accessible title. */\n name: string;\n /** What it is, in the default title and buttons: \"form\" (default), \"course\". */\n noun?: string | undefined;\n /** The search params a prefilled link may set, each with its choices. None hides the builder. */\n prefill?: readonly PrefillChoice[] | undefined;\n /** Said under the prefilled-link builder (what a prefilled link does). */\n prefillNote?: ReactNode;\n /** The tab it opens on (each time it opens). Default \"link\". */\n defaultTab?: \"link\" | \"qr\" | \"embed\" | undefined;\n}) {\n const id = useId();\n const [values, setValues] = useState<Record<string, string>>({});\n const chosen = Object.fromEntries(Object.entries(values).filter(([, v]) => v && v !== ANY));\n const prefilled = url && Object.keys(chosen).length ? prefilledUrl(url, chosen) : null;\n const poster = url ? posterUrl?.(url, {}) : null;\n const prefilledPoster = prefilled && url ? posterUrl?.(url, chosen) : null;\n const usable = prefill.filter((p) => p.options.length > 0);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-h-[90dvh] overflow-y-auto sm:max-w-lg\">\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n {!url ? (\n <p className=\"text-sm text-muted-foreground\">Loading the link…</p>\n ) : (\n <Tabs defaultValue={defaultTab === \"qr\" && !renderQr ? \"link\" : defaultTab}>\n <TabsList>\n <TabsTrigger value=\"link\">Link</TabsTrigger>\n {renderQr && <TabsTrigger value=\"qr\">QR code</TabsTrigger>}\n <TabsTrigger value=\"embed\">Embed</TabsTrigger>\n </TabsList>\n <TabsContent value=\"link\" className=\"space-y-5 pt-2\">\n <CopyField id={`${id}-link`} label=\"Link\" value={url} what=\"Link\" />\n <Button\n asChild\n variant=\"ghost\"\n size=\"sm\"\n startIcon={<ExternalLink className=\"size-4\" />}\n >\n <a href={url} target=\"_blank\" rel=\"noreferrer\">\n Open the {noun}\n </a>\n </Button>\n {usable.length > 0 && (\n <div className=\"space-y-3 border-t border-border pt-4\">\n <div>\n <p className=\"text-sm font-medium\">Prefilled link</p>\n {prefillNote && <p className=\"text-sm text-muted-foreground\">{prefillNote}</p>}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {usable.map((p) => (\n <Select\n key={p.key}\n value={values[p.key] ?? ANY}\n onValueChange={(v) => setValues((old) => ({ ...old, [p.key]: v }))}\n >\n <SelectTrigger className=\"min-w-40 flex-1\" aria-label={p.label}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ANY}>{p.anyLabel}</SelectItem>\n {p.options.map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ))}\n </div>\n {prefilled && (\n <>\n <CopyField\n id={`${id}-prefilled`}\n label=\"Prefilled link\"\n value={prefilled}\n what=\"Prefilled link\"\n />\n {prefilledPoster && (\n <Button\n asChild\n variant=\"outline\"\n startIcon={<Printer className=\"size-4\" />}\n >\n <a href={prefilledPoster} target=\"_blank\" rel=\"noreferrer\">\n Print a poster for this link\n </a>\n </Button>\n )}\n </>\n )}\n </div>\n )}\n </TabsContent>\n {renderQr && (\n <TabsContent value=\"qr\" className=\"space-y-4 pt-2\">\n <div className=\"mx-auto w-full max-w-56\">{renderQr(url)}</div>\n <p className=\"text-center text-sm text-muted-foreground\">\n Scan with a phone's camera to open the {noun}.\n </p>\n {poster && (\n <div className=\"flex justify-center\">\n <Button asChild variant=\"outline\" startIcon={<Printer className=\"size-4\" />}>\n <a href={poster} target=\"_blank\" rel=\"noreferrer\">\n Print a QR poster\n </a>\n </Button>\n </div>\n )}\n </TabsContent>\n )}\n <TabsContent value=\"embed\" className=\"space-y-3 pt-2\">\n <div className=\"space-y-1.5\">\n <Label htmlFor={`${id}-embed`}>Embed on your website</Label>\n <Textarea\n id={`${id}-embed`}\n readOnly\n rows={4}\n className=\"font-mono text-xs\"\n value={embedSnippet(url, name)}\n onFocus={(e) => e.target.select()}\n />\n </div>\n <Button\n variant=\"outline\"\n startIcon={<Copy className=\"size-4\" />}\n onClick={() => void copy(embedSnippet(url, name), \"Embed code\")}\n >\n Copy embed code\n </Button>\n </TabsContent>\n </Tabs>\n )}\n </DialogContent>\n </Dialog>\n );\n}\n","import { useEffect, useState, type ReactNode } from \"react\";\nimport { cn } from \"@marktiderman/genesis-ui\";\n\n/**\n * One group of settings as a card: an icon, a title and a sentence, then its rows\n * (genesis-ui `SettingsRow` and `ToggleRow`: a label, a one-sentence description and the\n * control), divided by lines. On a phone a row whose control isn't a switch puts the\n * control under its label, so wide controls (a link, a list of people) still fit.\n */\nexport function SettingsSection({\n id,\n icon,\n title,\n description,\n children,\n className,\n}: {\n /** The jump link's target. */\n id?: string | undefined;\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n children?: ReactNode;\n className?: string | undefined;\n}) {\n const headingId = id ? `${id}-title` : undefined;\n return (\n <section\n id={id}\n aria-labelledby={headingId}\n data-slot=\"settings-section\"\n className={cn(\"scroll-mt-6 rounded-lg border border-border bg-card text-card-foreground\", className)}\n >\n <header className=\"flex gap-3 border-b border-border px-5 py-4\">\n {icon ? (\n <span className=\"mt-0.5 text-primary [&_svg]:size-5\" aria-hidden>\n {icon}\n </span>\n ) : null}\n <div className=\"min-w-0\">\n <h2 id={headingId} className=\"font-semibold\">\n {title}\n </h2>\n {description ? <p className=\"text-sm text-muted-foreground\">{description}</p> : null}\n </div>\n </header>\n <div\n className={cn(\n \"divide-y divide-border\",\n // Rows: genesis-ui SettingsRow and ToggleRow, padded to the card.\n \"[&>*]:px-5 [&>[data-slot=settings-row]]:py-3.5\",\n \"[&>[data-slot=settings-row]:not(:has([role=switch]))]:max-sm:flex-col\",\n \"[&>[data-slot=settings-row]:not(:has([role=switch]))]:max-sm:items-stretch\",\n \"[&>[data-slot=settings-row]>div:last-child]:max-sm:flex-wrap\",\n )}\n >\n {children}\n </div>\n </section>\n );\n}\n\nexport interface SettingsPageSection {\n id: string;\n title: string;\n icon?: ReactNode;\n description?: ReactNode;\n /** The rows. Absent: a jump link only, to `#id` elsewhere on the page (or `onSelect`). */\n content?: ReactNode;\n /** For a link-only section whose target has no id: scroll to it yourself. */\n onSelect?: (() => void) | undefined;\n}\n\n/**\n * Every setting of one thing (a form, a course) on one page: jump links on the left (\"On this page\", the one in\n * view marked), the sections as cards on the right. On a phone the links sit above the\n * sections as a row that scrolls sideways.\n *\n * Not genesis-ui's `SettingsPage`: that one is a whole page with its own title, and plain\n * sections; these settings sit under the resource's header, as cards with icons.\n */\nexport function ResourceSettingsPage({\n sections,\n navLabel = \"On this page\",\n className,\n}: {\n sections: readonly SettingsPageSection[];\n navLabel?: string | undefined;\n className?: string | undefined;\n}) {\n const [active, setActive] = useState(sections[0]?.id);\n const ids = sections.map((s) => s.id).join(\" \");\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n // The section in view is the last one whose top has passed the upper third of the\n // window (the first one before any has).\n let frame = 0;\n const update = () => {\n frame = 0;\n const line = window.innerHeight / 3;\n let current = sections[0]?.id;\n for (const s of sections) {\n const el = document.getElementById(s.id);\n if (el && el.getBoundingClientRect().top <= line) current = s.id;\n }\n // At the very bottom the last sections can't reach the line: the last one is in view.\n const bottom = window.innerHeight + window.scrollY >= document.documentElement.scrollHeight - 2;\n const last = [...sections].reverse().find((s) => document.getElementById(s.id));\n if (bottom && last && window.scrollY > 0) current = last.id;\n setActive(current);\n };\n const onScroll = () => {\n if (!frame) frame = window.requestAnimationFrame(update);\n };\n update();\n window.addEventListener(\"scroll\", onScroll, { passive: true, capture: true });\n return () => {\n window.removeEventListener(\"scroll\", onScroll, { capture: true });\n if (frame) window.cancelAnimationFrame(frame);\n };\n }, [ids]); // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <div\n data-slot=\"resource-settings-page\"\n className={cn(\"grid grid-cols-[minmax(0,1fr)] gap-6 md:grid-cols-[12rem_minmax(0,1fr)] lg:gap-8\", className)}\n >\n <nav aria-label={navLabel} className=\"min-w-0 md:sticky md:top-4 md:self-start\">\n <p className=\"mb-2 hidden text-xs font-medium uppercase tracking-wide text-muted-foreground md:block\">\n {navLabel}\n </p>\n <ul className=\"-mx-1 flex gap-1 overflow-x-auto px-1 md:mx-0 md:flex-col md:overflow-visible md:px-0\">\n {sections.map((s) => (\n <li key={s.id} className=\"shrink-0\">\n <a\n href={`#${s.id}`}\n aria-current={active === s.id ? \"location\" : undefined}\n onClick={(e) => {\n setActive(s.id);\n if (s.content === undefined && s.onSelect) {\n e.preventDefault();\n s.onSelect();\n }\n }}\n className={cn(\n \"flex items-center gap-2 whitespace-nowrap rounded-md px-3 py-1.5 text-sm text-muted-foreground hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring [&_svg]:size-4\",\n active === s.id && \"bg-muted font-medium text-foreground\",\n )}\n >\n {s.icon ? <span aria-hidden>{s.icon}</span> : null}\n {s.title}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n <div className=\"flex min-w-0 flex-col gap-5\">\n {sections\n .filter((s) => s.content !== undefined)\n .map((s) => (\n <SettingsSection key={s.id} id={s.id} icon={s.icon} title={s.title} description={s.description}>\n {s.content}\n </SettingsSection>\n ))}\n </div>\n </div>\n );\n}\n","import { GitBranch, Inbox, ListChecks, Settings } from \"lucide-react\";\nimport type { FormTab } from \"./status\";\n\n/** The form page's four places' icons, for `formNavItems(path, counts, FORM_NAV_ICONS)`. */\nexport const FORM_NAV_ICONS = {\n questions: ListChecks,\n logic: GitBranch,\n responses: Inbox,\n settings: Settings,\n} satisfies Record<FormTab, unknown>;\n","import type { ReactNode } from \"react\";\nimport {\n Button,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@marktiderman/genesis-ui\";\nimport { CalendarDays, TriangleAlert, X } from \"lucide-react\";\nimport { lowThisWeek, NO_FILTERS, type FiltersValue } from \"./summary\";\n\n/** One \"pick a value\" filter over an extra column, such as a class or a coach. */\nexport interface ChoiceFilter {\n key: string;\n /** \"Any class\": what the menu says when nothing is picked. */\n allLabel: string;\n /** For screen readers: \"Class\". */\n label: string;\n options: string[];\n /** Shown before the value, e.g. a person icon for a coach. */\n icon?: ReactNode;\n}\n\nconst WHEN: { value: FiltersValue[\"when\"]; label: string }[] = [\n { value: \"all\", label: \"All time\" },\n { value: \"today\", label: \"Today\" },\n { value: \"week\", label: \"This week\" },\n { value: \"7d\", label: \"Last 7 days\" },\n { value: \"30d\", label: \"Last 30 days\" },\n { value: \"month\", label: \"This month\" },\n { value: \"custom\", label: \"Pick dates\" },\n];\nconst ANY = \"__any\";\nconst TRIGGER = \"h-9 w-auto min-w-0 gap-2 [&>span]:flex [&>span]:items-center [&>span]:gap-2\";\n\n/**\n * Filters for a form's responses: when, any number of choice filters, a rating floor, and\n * the low-ratings chip (\"Low ratings this week\" until it's on; then a chip saying what\n * low means, with ×). The summary and the list of responses share one value.\n */\nexport function ResponsesFilters({\n value,\n onChange,\n choices = [],\n ratingMax = null,\n lowLabel = null,\n filtered,\n}: {\n value: FiltersValue;\n onChange: (next: FiltersValue) => void;\n choices?: readonly ChoiceFilter[] | undefined;\n /** The highest rating any question asks for (highestRating); no rating filter when null. */\n ratingMax?: number | null | undefined;\n /** What counts as low (lowRatingLabel); no low-ratings chip when null. */\n lowLabel?: string | null | undefined;\n /** Whether anything is left out (isFiltered), for Clear filters. */\n filtered: boolean;\n}) {\n const ratings = ratingMax ? Array.from({ length: Math.min(ratingMax, 10) - 1 }, (_, i) => i + 1) : [];\n return (\n <div className=\"flex flex-wrap items-center gap-2\" data-testid=\"responses-filters\">\n <Select value={value.when} onValueChange={(when) => onChange({ ...value, when: when as FiltersValue[\"when\"] })}>\n <SelectTrigger className={TRIGGER} aria-label=\"When\">\n <CalendarDays className=\"size-4 text-muted-foreground\" aria-hidden />\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {WHEN.map((w) => (\n <SelectItem key={w.value} value={w.value}>\n {w.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {value.when === \"custom\" ? (\n <span className=\"flex items-center gap-1\">\n <Input\n type=\"date\"\n className=\"h-9 w-auto\"\n aria-label=\"From\"\n value={value.from}\n max={value.to || undefined}\n onChange={(e) => onChange({ ...value, from: e.target.value })}\n />\n <span className=\"text-sm text-muted-foreground\">to</span>\n <Input\n type=\"date\"\n className=\"h-9 w-auto\"\n aria-label=\"To\"\n value={value.to}\n min={value.from || undefined}\n onChange={(e) => onChange({ ...value, to: e.target.value })}\n />\n </span>\n ) : null}\n {choices\n .filter((c) => c.options.length > 0)\n .map((c) => (\n <Select\n key={c.key}\n value={value.match[c.key] || ANY}\n onValueChange={(v) => onChange({ ...value, match: { ...value.match, [c.key]: v === ANY ? \"\" : v } })}\n >\n <SelectTrigger className={`${TRIGGER} max-w-56`} aria-label={c.label}>\n {c.icon ? (\n <span className=\"text-muted-foreground [&_svg]:size-4\" aria-hidden>\n {c.icon}\n </span>\n ) : null}\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ANY}>{c.allLabel}</SelectItem>\n {c.options.map((o) => (\n <SelectItem key={o} value={o}>\n {o}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ))}\n {ratings.length > 0 ? (\n <Select\n value={value.ratingAtMost == null ? ANY : String(value.ratingAtMost)}\n onValueChange={(v) => onChange({ ...value, ratingAtMost: v === ANY ? null : Number(v) })}\n >\n <SelectTrigger className={TRIGGER} aria-label=\"Rating\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ANY}>Any rating</SelectItem>\n {ratings.map((r) => (\n <SelectItem key={r} value={String(r)}>\n {r === 1 ? \"Rated 1\" : `Rated ${r} or below`}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n {lowLabel ? (\n value.low ? (\n <span\n className=\"inline-flex h-9 items-center gap-1.5 rounded-md bg-warning/15 pl-2.5 pr-1 text-sm text-amber-800 dark:bg-warning/20 dark:text-amber-200\"\n data-testid=\"low-ratings-chip\"\n >\n <TriangleAlert className=\"size-4\" aria-hidden />\n {`Low ratings (${lowLabel})`}\n <button\n type=\"button\"\n aria-label=\"Show every rating\"\n className=\"rounded p-1 hover:bg-warning/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={() => onChange({ ...value, low: false })}\n >\n <X className=\"size-3.5\" aria-hidden />\n </button>\n </span>\n ) : (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-9\"\n startIcon={<TriangleAlert className=\"size-4\" />}\n onClick={() => onChange(lowThisWeek(value))}\n data-testid=\"low-ratings-preset\"\n >\n Low ratings this week\n </Button>\n )\n ) : null}\n {filtered ? (\n <Button variant=\"ghost\" size=\"sm\" className=\"h-9\" onClick={() => onChange(NO_FILTERS)}>\n Clear filters\n </Button>\n ) : null}\n </div>\n );\n}\n","import { useState, type ComponentType, type ReactNode } from \"react\";\nimport { Button, EmptyState, Skeleton, cn } from \"@marktiderman/genesis-ui\";\nimport {\n CircleCheck,\n CircleDot,\n Gauge,\n Inbox,\n ListChecks,\n SquareCheck,\n Star,\n Type,\n type LucideProps,\n} from \"lucide-react\";\nimport { dayLabel } from \"./generic/days\";\nimport { SummaryCard } from \"./generic/SummaryCard\";\nimport { lowScaleAtMost } from \"./summary\";\nimport type { ChoiceSummary, QuestionSummary, ScaleSummary, TextSummary } from \"./summary\";\n\nconst FIRST_TEXT = 5;\nconst MORE_TEXT = 10;\n\nconst plural = (n: number, one: string, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;\n\nconst ICONS: Record<string, ComponentType<LucideProps>> = {\n rating: Star,\n nps: Gauge,\n consent: SquareCheck,\n \"yes-no\": CircleCheck,\n \"single-choice\": CircleDot,\n dropdown: CircleDot,\n \"multi-choice\": ListChecks,\n};\n\n/** A bar as wide as its share; low scores in the warning colour. */\nfunction Bar({ share, low = false }: { share: number; low?: boolean }) {\n return (\n <span className=\"h-2 overflow-hidden rounded-full bg-muted\" aria-hidden>\n <span\n className={cn(\"block h-full rounded-full\", low ? \"bg-warning\" : \"bg-primary\")}\n style={{ width: `${Math.max(0, Math.min(100, share))}%` }}\n />\n </span>\n );\n}\n\nfunction ScaleBody({ s }: { s: ScaleSummary }) {\n const most = Math.max(1, ...s.buckets.map((b) => b.count));\n const atMost = lowScaleAtMost(s.type, s.max);\n return (\n <>\n {s.nps ? (\n <p className=\"text-sm\">\n <span className=\"text-2xl font-semibold tabular-nums\">{s.nps.score}</span>{\" \"}\n <span className=\"text-muted-foreground\">NPS</span>\n <span className=\"block text-xs text-muted-foreground\">\n {plural(s.nps.promoters, \"promoter\")} (9–10), {plural(s.nps.passives, \"passive\")} (7–8),{\" \"}\n {plural(s.nps.detractors, \"detractor\")} (0–6)\n </span>\n </p>\n ) : null}\n {s.rescaled || s.excluded ? (\n <p className=\"text-xs text-muted-foreground\" data-testid={`scale-note-${s.key}`}>\n {[\n s.rescaled\n ? `${plural(s.rescaled, \"answer\")} from an earlier version's scale moved onto ${s.min}–${s.max}.`\n : \"\",\n s.excluded ? `${plural(s.excluded, \"answer\")} outside the scale left out.` : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n </p>\n ) : null}\n <ul className=\"space-y-2\" aria-label=\"Answers by score\">\n {[...s.buckets].reverse().map((b) => (\n <li key={b.value} className=\"grid grid-cols-[2.25rem_1fr_2rem] items-center gap-3 text-sm\">\n <span className=\"flex items-center gap-1 tabular-nums\">\n {b.value}\n {s.type === \"rating\" ? <Star className=\"size-3 fill-current\" aria-label=\"stars\" /> : null}\n </span>\n <Bar share={(b.count / most) * 100} low={b.value <= atMost} />\n <span className=\"text-right tabular-nums text-muted-foreground\">{b.count}</span>\n </li>\n ))}\n </ul>\n </>\n );\n}\n\n/** Two-way questions (consent, yes/no) as one split bar; others as a bar per option. */\nfunction ChoiceBody({ s }: { s: ChoiceSummary }) {\n if (s.fieldType === \"consent\" || s.fieldType === \"yes-no\") {\n const yes = s.options.find((o) => o.value === \"true\");\n const no = s.options.find((o) => o.value === \"false\");\n return (\n <>\n <span className=\"flex h-2.5 overflow-hidden rounded-full bg-muted\" aria-hidden>\n <span className=\"h-full bg-primary\" style={{ width: `${yes?.percent ?? 0}%` }} />\n </span>\n <p className=\"flex flex-wrap gap-x-4 gap-y-1 text-sm\">\n {yes ? (\n <span className=\"text-emerald-700 dark:text-emerald-300\">\n {yes.label} · {yes.count} ({Math.round(yes.percent)}%)\n </span>\n ) : null}\n {no ? (\n <span className=\"text-muted-foreground\">\n {no.label} · {no.count}\n </span>\n ) : null}\n </p>\n </>\n );\n }\n const most = Math.max(1, ...s.options.map((o) => o.count));\n return (\n <>\n <ul className=\"space-y-2\">\n {s.options.map((o) => (\n <li key={o.value} className=\"grid grid-cols-[minmax(2rem,12rem)_1fr_auto] items-center gap-3 text-sm\">\n <span className=\"truncate\" title={o.label}>\n {o.label}\n </span>\n <Bar share={(o.count / most) * 100} />\n <span className=\"whitespace-nowrap text-right tabular-nums text-muted-foreground\">\n {o.count} · {Math.round(o.percent)}%\n </span>\n </li>\n ))}\n </ul>\n {s.multiple ? <p className=\"text-xs text-muted-foreground\">People could pick more than one.</p> : null}\n </>\n );\n}\n\nfunction TextBody({\n s,\n today,\n answerMeta,\n}: {\n s: TextSummary;\n today?: string | undefined;\n answerMeta?: ((id: string) => ReactNode) | undefined;\n}) {\n const [shown, setShown] = useState(FIRST_TEXT);\n const left = s.answers.length - shown;\n return (\n <>\n <ul className=\"space-y-3\">\n {s.answers.slice(0, shown).map((a) => {\n const meta = answerMeta?.(a.id);\n return (\n <li key={a.id} className=\"border-l-2 border-border pl-3\">\n <p className=\"whitespace-pre-wrap break-words text-sm\">“{a.text}”</p>\n <p className=\"text-xs text-muted-foreground\">\n {dayLabel(a.date, today)}\n {meta ? <> · {meta}</> : null}\n </p>\n </li>\n );\n })}\n </ul>\n {left > 0 ? (\n <Button variant=\"ghost\" size=\"sm\" className=\"self-start\" onClick={() => setShown((n) => n + MORE_TEXT)}>\n Show more ({left} more)\n </Button>\n ) : null}\n </>\n );\n}\n\n/** One question's card: its type icon, title and answer count, then its spread. */\nexport function QuestionSummaryCard({\n summary: s,\n today,\n answerMeta,\n}: {\n summary: QuestionSummary;\n today?: string | undefined;\n answerMeta?: ((id: string) => ReactNode) | undefined;\n}) {\n const Icon = ICONS[s.fieldType] ?? Type;\n const average = s.kind === \"scale\" && s.average !== null ? ` · average ${s.average.toFixed(1)}` : \"\";\n return (\n <SummaryCard\n icon={<Icon />}\n title={s.label || \"Untitled question\"}\n meta={s.count ? `${plural(s.count, \"answer\")}${average}` : \"No answers yet\"}\n testID={`summary-${s.key}`}\n >\n {s.count > 0 ? (\n s.kind === \"scale\" ? (\n <ScaleBody s={s} />\n ) : s.kind === \"choice\" ? (\n <ChoiceBody s={s} />\n ) : (\n <TextBody s={s} today={today} answerMeta={answerMeta} />\n )\n ) : null}\n </SummaryCard>\n );\n}\n\n/**\n * A form's responses question by question (summarizeResponses): each rating or NPS\n * question's spread with low scores marked, counts for each choice, consent and yes/no\n * as one split bar, and the latest written answers.\n */\nexport function QuestionSummaryCards({\n summaries,\n responses,\n isLoading = false,\n emptyTitle = \"No responses yet\",\n emptyDescription,\n onClearFilters,\n today,\n answerMeta,\n className,\n}: {\n summaries: readonly QuestionSummary[];\n /** How many responses the summaries cover. */\n responses: number;\n isLoading?: boolean | undefined;\n emptyTitle?: string | undefined;\n emptyDescription?: string | undefined;\n /** Given while filters are on: an empty summary then says so, with a way out. */\n onClearFilters?: (() => void) | undefined;\n /** Today (YYYY-MM-DD) on the responses' clock, so written answers say \"Today\". */\n today?: string | undefined;\n /** Extra words after a written answer's day, by response id: \"6:00 WOD · rated 2\". */\n answerMeta?: ((id: string) => ReactNode) | undefined;\n className?: string | undefined;\n}) {\n if (isLoading) {\n return (\n <div className={cn(\"space-y-3\", className)}>\n <Skeleton className=\"h-40 w-full rounded-lg\" />\n <Skeleton className=\"h-32 w-full rounded-lg\" />\n </div>\n );\n }\n if (!responses) {\n return (\n <EmptyState\n icon={Inbox}\n title={emptyTitle}\n {...(emptyDescription ? { description: emptyDescription } : {})}\n hasFilters={!!onClearFilters}\n {...(onClearFilters ? { onClearFilters } : {})}\n />\n );\n }\n return (\n <div className={cn(\"flex min-w-0 flex-col gap-3\", className)}>\n {summaries.map((s) => (\n <QuestionSummaryCard key={s.key} summary={s} today={today} answerMeta={answerMeta} />\n ))}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/generic/chip.tsx","../src/generic/ResourceHeader.tsx","../src/generic/nav.tsx","../src/generic/ResponsesToolbar.tsx","../src/generic/HeadlineNumbers.tsx","../src/generic/SummaryCard.tsx","../src/generic/FollowUpList.tsx","../src/generic/ShareDialog.tsx","../src/generic/settings.tsx","../src/navIcons.ts","../src/ResponsesFilters.tsx","../src/QuestionSummaryCards.tsx","../src/DropOffByQuestion.tsx","../src/PhotoAnswer.tsx"],"names":["jsxs","cn","jsx","Fragment","Check","TriangleAlert","Skeleton","Button","useState","ANY","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Input","Star","CircleCheck","ListChecks","Inbox","plural","useEffect","ImageIcon","ExternalLink"],"mappings":"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","file":"index.js","sourcesContent":["import type { ReactNode } from \"react\";\nimport { Badge, StatusBadge, cn } from \"@marktiderman/genesis-ui\";\nimport type { ChipTone } from \"./status\";\n\n/** A small status chip in one of the studio's tones (tinted, AA-safe Genesis badges). */\nexport function Chip({\n tone,\n icon,\n children,\n className,\n testID,\n}: {\n tone: ChipTone;\n icon?: ReactNode;\n children: ReactNode;\n className?: string | undefined;\n testID?: string | undefined;\n}) {\n const inner = (\n <>\n {icon ? <span className=\"mr-1 inline-flex [&_svg]:size-3\" aria-hidden>{icon}</span> : null}\n {children}\n </>\n );\n // Badge's destructive variant is a solid fill; the tinted red is StatusBadge's.\n if (tone === \"danger\") {\n return (\n <StatusBadge status=\"offTrack\" className={cn(\"font-normal\", className)} data-testid={testID}>\n {inner}\n </StatusBadge>\n );\n }\n return (\n <Badge variant={tone} className={cn(\"font-normal\", className)} data-testid={testID}>\n {inner}\n </Badge>\n );\n}\n","import type { ReactNode } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n Button,\n Separator,\n cn,\n} from \"@marktiderman/genesis-ui\";\nimport { Check, Eye, Loader2, Redo2, Rocket, Share2, TriangleAlert, Undo2 } from \"lucide-react\";\nimport { Chip } from \"./chip\";\nimport { SAVE_STATE_LABEL, type ChipTone, type SaveState } from \"./status\";\n\nexport interface ResourceHeaderProps {\n /** The title, shown once: as the heading and the breadcrumb's last part. */\n title: string;\n /** Shown when the title is empty. Default \"Untitled\". */\n untitled?: string | undefined;\n /**\n * The breadcrumb's parent link, e.g. `<Link to=\"/forms\">Forms</Link>`: one element, so\n * the host's router renders it.\n */\n parent?: ReactNode;\n /** The status chip, e.g. formStatusChip's \"Live · version 3\" or \"Draft\". */\n status?: { label: string; tone: ChipTone } | undefined;\n /** Where saving the draft stands; no chip when absent. */\n saveState?: SaveState | undefined;\n /** Undo and redo buttons, shown when given (for example the builder's history). */\n onUndo?: (() => void) | undefined;\n onRedo?: (() => void) | undefined;\n canUndo?: boolean | undefined;\n canRedo?: boolean | undefined;\n /** A Preview button. */\n onPreview?: (() => void) | undefined;\n /** A Share button (open a share dialog). */\n onShare?: (() => void) | undefined;\n /** The primary button: \"Publish\", or \"Publish changes\" once it is live. */\n publish?:\n | {\n onClick: () => void;\n label?: string | undefined;\n loading?: boolean | undefined;\n disabled?: boolean | undefined;\n }\n | undefined;\n /** Anything else for the right-hand side, before Preview (a Reload button, a menu). */\n actions?: ReactNode;\n className?: string | undefined;\n}\n\nconst SAVE_TONE: Record<SaveState, ChipTone> = {\n saved: \"muted\",\n saving: \"muted\",\n unsaved: \"muted\",\n failed: \"warning\",\n stopped: \"danger\",\n conflict: \"danger\",\n};\n\n/**\n * The header of a page that edits one publishable thing (a form, a course, a lesson, a\n * worksheet): the breadcrumb (\"Forms › name\"), the title once, its status and save-state\n * chips, and on the right undo and redo, Preview, Share and Publish. Every action is the\n * host's; a button shows only when its handler is given.\n */\nexport function ResourceHeader({\n title,\n untitled = \"Untitled\",\n parent,\n status,\n saveState,\n onUndo,\n onRedo,\n canUndo = true,\n canRedo = true,\n onPreview,\n onShare,\n publish,\n actions,\n className,\n}: ResourceHeaderProps) {\n const history = onUndo || onRedo;\n const name = title.trim() || untitled;\n return (\n <header\n data-slot=\"resource-header\"\n className={cn(\"flex flex-col gap-3 md:flex-row md:items-start md:justify-between\", className)}\n >\n <div className=\"min-w-0 flex-1 space-y-1\">\n {parent ? (\n <Breadcrumb>\n <BreadcrumbList className=\"text-xs\">\n <BreadcrumbItem>\n <BreadcrumbLink asChild>{parent}</BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem className=\"min-w-0\">\n <BreadcrumbPage className=\"truncate\">{name}</BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ) : null}\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1\">\n <h1 className=\"min-w-0 break-words text-xl font-semibold tracking-tight sm:text-2xl\">{name}</h1>\n {status ? (\n <Chip tone={status.tone} testID=\"resource-status\">\n {status.label}\n </Chip>\n ) : null}\n {saveState ? (\n <span aria-live=\"polite\">\n <Chip\n tone={SAVE_TONE[saveState]}\n testID=\"resource-save-state\"\n icon={\n saveState === \"saved\" ? (\n <Check />\n ) : saveState === \"saving\" ? (\n <Loader2 className=\"animate-spin\" />\n ) : saveState === \"unsaved\" ? null : (\n <TriangleAlert />\n )\n }\n >\n {SAVE_STATE_LABEL[saveState]}\n </Chip>\n </span>\n ) : null}\n </div>\n </div>\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n {history ? (\n <>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Undo\"\n title=\"Undo\"\n disabled={!onUndo || !canUndo}\n onClick={onUndo}\n data-testid=\"resource-undo\"\n >\n <Undo2 className=\"size-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Redo\"\n title=\"Redo\"\n disabled={!onRedo || !canRedo}\n onClick={onRedo}\n data-testid=\"resource-redo\"\n >\n <Redo2 className=\"size-4\" />\n </Button>\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n </>\n ) : null}\n {actions}\n {onPreview ? (\n <Button variant=\"ghost\" startIcon={<Eye className=\"size-4\" />} onClick={onPreview} data-testid=\"resource-preview\">\n Preview\n </Button>\n ) : null}\n {onShare ? (\n <Button variant=\"outline\" startIcon={<Share2 className=\"size-4\" />} onClick={onShare} data-testid=\"resource-share\">\n Share\n </Button>\n ) : null}\n {publish ? (\n <Button\n startIcon={<Rocket className=\"size-4\" />}\n loading={publish.loading}\n disabled={publish.disabled}\n onClick={publish.onClick}\n data-testid=\"resource-publish\"\n >\n {publish.label ?? \"Publish\"}\n </Button>\n ) : null}\n </div>\n </header>\n );\n}\n","\nimport { Check, CircleAlert, TriangleAlert } from \"lucide-react\";\nimport { Chip } from \"./chip\";\nimport { readinessChip, type Readiness } from \"./status\";\n\n/**\n * \"Ready to publish\", or how many problems to fix: for the trailing slot of a resource\n * page's row of tabs (genesis-ui's `<AppShellSubNavEnd>`). With `onClick` it is a button (open the checks).\n */\nexport function ReadinessChip({\n readiness,\n onClick,\n className,\n}: {\n readiness: Readiness;\n onClick?: (() => void) | undefined;\n className?: string | undefined;\n}) {\n const { label, tone } = readinessChip(readiness);\n const icon =\n readiness.state === \"ready\" ? <Check /> : readiness.state === \"problems\" ? <CircleAlert /> : readiness.state === \"warnings\" ? <TriangleAlert /> : null;\n const chip = (\n <Chip tone={tone} icon={icon} testID=\"readiness\" className={className}>\n {label}\n </Chip>\n );\n if (!onClick) return chip;\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"rounded-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {chip}\n </button>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { ToggleGroup, ToggleGroupItem, cn } from \"@marktiderman/genesis-ui\";\n\nexport type ResponsesView = \"summary\" | \"each\";\n\n/**\n * The Responses tab's toolbar: a Summary / Each response switch, the host's filters\n * (ResponsesFilters, or its own) and, on the right, its export actions (open a Sheet,\n * Download CSV).\n */\nexport function ResponsesToolbar({\n view,\n onViewChange,\n filters,\n actions,\n className,\n}: {\n view: ResponsesView;\n onViewChange: (view: ResponsesView) => void;\n filters?: ReactNode;\n actions?: ReactNode;\n className?: string | undefined;\n}) {\n return (\n <div\n data-slot=\"responses-toolbar\"\n className={cn(\"flex flex-col gap-2 lg:flex-row lg:items-start lg:justify-between\", className)}\n >\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <ToggleGroup\n type=\"single\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-9\"\n value={view}\n onValueChange={(v) => v && onViewChange(v as ResponsesView)}\n aria-label=\"Show responses as\"\n >\n <ToggleGroupItem value=\"summary\" className=\"h-9 px-3\" data-testid=\"responses-view-summary\">\n Summary\n </ToggleGroupItem>\n <ToggleGroupItem value=\"each\" className=\"h-9 px-3\" data-testid=\"responses-view-each\">\n Each response\n </ToggleGroupItem>\n </ToggleGroup>\n {filters}\n </div>\n {actions ? <div className=\"flex shrink-0 flex-wrap items-center gap-2\">{actions}</div> : null}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Skeleton, cn } from \"@marktiderman/genesis-ui\";\n\n/** One headline number: a label, the number, and a short line under it. */\nexport interface HeadlineNumber {\n key: string;\n label: string;\n value: ReactNode;\n detail?: ReactNode;\n /** The detail's colour: good news, bad news, a warning, or plain. Default plain. */\n tone?: \"positive\" | \"negative\" | \"warning\" | \"muted\" | undefined;\n}\n\nconst TONE: Record<NonNullable<HeadlineNumber[\"tone\"]>, string> = {\n positive: \"text-emerald-700 dark:text-emerald-300\",\n negative: \"text-red-700 dark:text-red-300\",\n warning: \"text-amber-800 dark:text-amber-200\",\n muted: \"text-muted-foreground\",\n};\n\n/** A row of headline numbers (KPI cards): two across on a phone, up to four on a wide screen. */\nexport function HeadlineNumbers({\n numbers,\n isLoading = false,\n className,\n}: {\n numbers: readonly HeadlineNumber[];\n isLoading?: boolean | undefined;\n className?: string | undefined;\n}) {\n if (isLoading) {\n return (\n <div className={cn(\"grid grid-cols-2 gap-3 lg:grid-cols-4\", className)}>\n {[0, 1, 2, 3].map((i) => (\n <Skeleton key={i} className=\"h-28 w-full rounded-lg\" />\n ))}\n </div>\n );\n }\n if (!numbers.length) return null;\n return (\n <dl\n data-slot=\"headline-numbers\"\n className={cn(\n \"grid grid-cols-2 gap-3\",\n numbers.length >= 4 ? \"lg:grid-cols-4\" : numbers.length === 3 ? \"lg:grid-cols-3\" : \"\",\n className,\n )}\n >\n {numbers.map((n) => (\n <div\n key={n.key}\n className=\"flex min-w-0 flex-col gap-1 rounded-lg border border-border bg-card p-4 text-card-foreground\"\n data-testid={`headline-${n.key}`}\n >\n <dt className=\"truncate text-sm text-muted-foreground\">{n.label}</dt>\n <dd className=\"text-2xl font-semibold tabular-nums tracking-tight sm:text-3xl\">{n.value}</dd>\n {n.detail ? <dd className={cn(\"text-xs\", TONE[n.tone ?? \"muted\"])}>{n.detail}</dd> : null}\n </div>\n ))}\n </dl>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"@marktiderman/genesis-ui\";\n\n/**\n * One card of a summary column: an icon and a title, a short line on the right (\"24\n * answers · average 4.1\"), then whatever summarises it (bars, quotes, a split bar).\n */\nexport function SummaryCard({\n icon,\n title,\n meta,\n children,\n className,\n testID,\n}: {\n icon?: ReactNode;\n title: string;\n meta?: ReactNode;\n children?: ReactNode;\n className?: string | undefined;\n testID?: string | undefined;\n}) {\n return (\n <section\n aria-label={title}\n data-testid={testID}\n data-slot=\"summary-card\"\n className={cn(\"flex flex-col gap-4 rounded-lg border border-border bg-card p-5 text-card-foreground\", className)}\n >\n <header className=\"flex flex-wrap items-baseline justify-between gap-x-4 gap-y-1\">\n <h3 className=\"flex min-w-0 items-center gap-2 font-semibold\">\n {icon ? (\n <span className=\"shrink-0 text-muted-foreground [&_svg]:size-4\" aria-hidden>\n {icon}\n </span>\n ) : null}\n <span className=\"min-w-0 break-words\">{title}</span>\n </h3>\n {meta ? <span className=\"text-xs text-muted-foreground\">{meta}</span> : null}\n </header>\n {children}\n </section>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Skeleton, cn } from \"@marktiderman/genesis-ui\";\nimport { CircleCheck, Star, TriangleAlert } from \"lucide-react\";\nimport { Chip } from \"./chip\";\nimport type { ChipTone } from \"./status\";\n\n/** One response in the follow-up list, as the host describes it. */\nexport interface FollowUpEntry {\n id: string;\n /** Who answered: a name, or \"Anonymous\". */\n name: string;\n /** A tag beside the name, e.g. \"Member\" or \"New lead\". */\n tag?: { label: string; tone?: ChipTone | undefined } | undefined;\n /** One line under the name: \"Today · 6:00 WOD · Leo\". */\n meta?: ReactNode;\n /** What they wrote; null shows \"No comment\". */\n comment?: string | null | undefined;\n /** The low score, on its scale. */\n rating?: { value: number; max: number } | null | undefined;\n}\n\n/**\n * Responses that need a follow-up (needsFollowUp), each with who answered, a tag, the day\n * and context, their comment, its low score and the host's actions (Reply, Mark handled).\n * Handled items are the host's to leave out.\n */\nexport function FollowUpList({\n entries,\n actions,\n title = \"Needs a follow-up\",\n isLoading = false,\n empty = \"Nothing to follow up right now.\",\n className,\n}: {\n entries: readonly FollowUpEntry[];\n /** Buttons for one entry. */\n actions?: ((entry: FollowUpEntry) => ReactNode) | undefined;\n title?: string | undefined;\n isLoading?: boolean | undefined;\n /** Said when the list is empty. */\n empty?: ReactNode;\n className?: string | undefined;\n}) {\n return (\n <section\n aria-label={title}\n data-testid=\"follow-up-list\"\n className={cn(\"flex flex-col gap-3 rounded-lg border border-border bg-card p-4 text-card-foreground\", className)}\n >\n <header className=\"flex items-center justify-between gap-2\">\n <h3 className=\"flex items-center gap-2 font-semibold\">\n <TriangleAlert className=\"size-4 text-amber-800 dark:text-amber-200\" aria-hidden />\n {title}\n </h3>\n {!isLoading ? (\n <span className=\"rounded-md bg-muted px-2 py-0.5 text-xs tabular-nums text-muted-foreground\">\n {entries.length}\n </span>\n ) : null}\n </header>\n {isLoading ? (\n <>\n <Skeleton className=\"h-24 w-full rounded-md\" />\n <Skeleton className=\"h-24 w-full rounded-md\" />\n </>\n ) : entries.length === 0 ? (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <CircleCheck className=\"size-4 shrink-0\" aria-hidden />\n {empty}\n </p>\n ) : (\n <ul className=\"flex flex-col gap-3\">\n {entries.map((entry) => {\n const buttons = actions?.(entry);\n return (\n <li\n key={entry.id}\n className=\"flex flex-col gap-1.5 rounded-md border border-border p-3\"\n data-testid={`follow-up-${entry.id}`}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <span className=\"break-words font-medium\">{entry.name}</span>\n {entry.tag ? <Chip tone={entry.tag.tone ?? \"muted\"}>{entry.tag.label}</Chip> : null}\n </p>\n {entry.rating ? (\n <span\n className=\"flex shrink-0 items-center gap-0.5 text-sm font-medium tabular-nums text-amber-800 dark:text-amber-200\"\n role=\"img\"\n aria-label={`Rated ${entry.rating.value} out of ${entry.rating.max}`}\n >\n {entry.rating.value}\n <Star className=\"size-3.5 fill-current\" aria-hidden />\n </span>\n ) : null}\n </div>\n {entry.meta ? <p className=\"text-xs text-muted-foreground\">{entry.meta}</p> : null}\n <p className={cn(\"line-clamp-3 break-words text-sm\", !entry.comment && \"text-muted-foreground\")}>\n {entry.comment || \"No comment\"}\n </p>\n {buttons ? <div className=\"mt-1 flex flex-wrap gap-2\">{buttons}</div> : null}\n </li>\n );\n })}\n </ul>\n )}\n </section>\n );\n}\n","import { useId, useState, type ReactNode } from \"react\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Textarea,\n toast,\n} from \"@marktiderman/genesis-ui\";\nimport { Copy, ExternalLink, Printer } from \"lucide-react\";\nimport { embedSnippet, prefilledUrl, type PrefillChoice } from \"./share\";\n\n\n\nconst ANY = \"__any\";\n\nasync function copy(text: string, what: string) {\n try {\n await navigator.clipboard.writeText(text);\n toast.success(`${what} copied.`);\n } catch {\n toast.error(\"Couldn't copy. Select it and copy it instead.\");\n }\n}\n\nfunction CopyField({\n id,\n label,\n value,\n what,\n}: {\n id: string;\n label: string;\n value: string;\n what: string;\n}) {\n return (\n <div className=\"space-y-1.5\">\n <Label htmlFor={id}>{label}</Label>\n <div className=\"flex gap-2\">\n <Input id={id} readOnly value={value} onFocus={(e) => e.target.select()} />\n <Button\n variant=\"outline\"\n startIcon={<Copy className=\"size-4\" />}\n onClick={() => void copy(value, what)}\n >\n Copy\n </Button>\n </div>\n </div>\n );\n}\n\n/**\n * Sharing one published page (a form, a course), as Google Forms' Send step: its link with Copy, a QR code\n * (and a printable poster when the host has one), an `<iframe>` to embed it on a website,\n * and a builder for prefilled links (`?class=…&coach=…`, or whatever the host offers).\n * Generic: the host passes the link, how to draw a QR code, and the prefill choices.\n * Moved up from Breakthrough's src/components/forms/ShareDialog.tsx.\n */\nexport function ShareDialog({\n open,\n onOpenChange,\n noun = \"form\",\n title = `Share your ${noun}`,\n description = \"Anyone with the link can answer.\",\n url,\n posterUrl,\n renderQr,\n name,\n prefill = [],\n prefillNote,\n defaultTab = \"link\",\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title?: string | undefined;\n description?: ReactNode;\n /** The public link; null while it is still loading. */\n url: string | null;\n /** A printable poster for a link (the base link, or a prefilled one), when the host has one. */\n posterUrl?: ((url: string, prefill: Record<string, string>) => string | null) | undefined;\n /** Draws a QR code for a link. */\n renderQr?: ((url: string) => ReactNode) | undefined;\n /** Its name, for the embed's accessible title. */\n name: string;\n /** What it is, in the default title and buttons: \"form\" (default), \"course\". */\n noun?: string | undefined;\n /** The search params a prefilled link may set, each with its choices. None hides the builder. */\n prefill?: readonly PrefillChoice[] | undefined;\n /** Said under the prefilled-link builder (what a prefilled link does). */\n prefillNote?: ReactNode;\n /** The tab it opens on (each time it opens). Default \"link\". */\n defaultTab?: \"link\" | \"qr\" | \"embed\" | undefined;\n}) {\n const id = useId();\n const [values, setValues] = useState<Record<string, string>>({});\n const chosen = Object.fromEntries(Object.entries(values).filter(([, v]) => v && v !== ANY));\n const prefilled = url && Object.keys(chosen).length ? prefilledUrl(url, chosen) : null;\n const poster = url ? posterUrl?.(url, {}) : null;\n const prefilledPoster = prefilled && url ? posterUrl?.(url, chosen) : null;\n const usable = prefill.filter((p) => p.options.length > 0);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-h-[90dvh] overflow-y-auto sm:max-w-lg\">\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n {!url ? (\n <p className=\"text-sm text-muted-foreground\">Loading the link…</p>\n ) : (\n <Tabs defaultValue={defaultTab === \"qr\" && !renderQr ? \"link\" : defaultTab}>\n <TabsList>\n <TabsTrigger value=\"link\">Link</TabsTrigger>\n {renderQr && <TabsTrigger value=\"qr\">QR code</TabsTrigger>}\n <TabsTrigger value=\"embed\">Embed</TabsTrigger>\n </TabsList>\n <TabsContent value=\"link\" className=\"space-y-5 pt-2\">\n <CopyField id={`${id}-link`} label=\"Link\" value={url} what=\"Link\" />\n <Button\n asChild\n variant=\"ghost\"\n size=\"sm\"\n startIcon={<ExternalLink className=\"size-4\" />}\n >\n <a href={url} target=\"_blank\" rel=\"noreferrer\">\n Open the {noun}\n </a>\n </Button>\n {usable.length > 0 && (\n <div className=\"space-y-3 border-t border-border pt-4\">\n <div>\n <p className=\"text-sm font-medium\">Prefilled link</p>\n {prefillNote && <p className=\"text-sm text-muted-foreground\">{prefillNote}</p>}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {usable.map((p) => (\n <Select\n key={p.key}\n value={values[p.key] ?? ANY}\n onValueChange={(v) => setValues((old) => ({ ...old, [p.key]: v }))}\n >\n <SelectTrigger className=\"min-w-40 flex-1\" aria-label={p.label}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ANY}>{p.anyLabel}</SelectItem>\n {p.options.map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ))}\n </div>\n {prefilled && (\n <>\n <CopyField\n id={`${id}-prefilled`}\n label=\"Prefilled link\"\n value={prefilled}\n what=\"Prefilled link\"\n />\n {prefilledPoster && (\n <Button\n asChild\n variant=\"outline\"\n startIcon={<Printer className=\"size-4\" />}\n >\n <a href={prefilledPoster} target=\"_blank\" rel=\"noreferrer\">\n Print a poster for this link\n </a>\n </Button>\n )}\n </>\n )}\n </div>\n )}\n </TabsContent>\n {renderQr && (\n <TabsContent value=\"qr\" className=\"space-y-4 pt-2\">\n <div className=\"mx-auto w-full max-w-56\">{renderQr(url)}</div>\n <p className=\"text-center text-sm text-muted-foreground\">\n Scan with a phone's camera to open the {noun}.\n </p>\n {poster && (\n <div className=\"flex justify-center\">\n <Button asChild variant=\"outline\" startIcon={<Printer className=\"size-4\" />}>\n <a href={poster} target=\"_blank\" rel=\"noreferrer\">\n Print a QR poster\n </a>\n </Button>\n </div>\n )}\n </TabsContent>\n )}\n <TabsContent value=\"embed\" className=\"space-y-3 pt-2\">\n <div className=\"space-y-1.5\">\n <Label htmlFor={`${id}-embed`}>Embed on your website</Label>\n <Textarea\n id={`${id}-embed`}\n readOnly\n rows={4}\n className=\"font-mono text-xs\"\n value={embedSnippet(url, name)}\n onFocus={(e) => e.target.select()}\n />\n </div>\n <Button\n variant=\"outline\"\n startIcon={<Copy className=\"size-4\" />}\n onClick={() => void copy(embedSnippet(url, name), \"Embed code\")}\n >\n Copy embed code\n </Button>\n </TabsContent>\n </Tabs>\n )}\n </DialogContent>\n </Dialog>\n );\n}\n","import { useEffect, useState, type ReactNode } from \"react\";\nimport { cn } from \"@marktiderman/genesis-ui\";\n\n/**\n * One group of settings as a card: an icon, a title and a sentence, then its rows\n * (genesis-ui `SettingsRow` and `ToggleRow`: a label, a one-sentence description and the\n * control), divided by lines. On a phone a row whose control isn't a switch puts the\n * control under its label, so wide controls (a link, a list of people) still fit.\n */\nexport function SettingsSection({\n id,\n icon,\n title,\n description,\n children,\n className,\n}: {\n /** The jump link's target. */\n id?: string | undefined;\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n children?: ReactNode;\n className?: string | undefined;\n}) {\n const headingId = id ? `${id}-title` : undefined;\n return (\n <section\n id={id}\n aria-labelledby={headingId}\n data-slot=\"settings-section\"\n className={cn(\"scroll-mt-6 rounded-lg border border-border bg-card text-card-foreground\", className)}\n >\n <header className=\"flex gap-3 border-b border-border px-5 py-4\">\n {icon ? (\n <span className=\"mt-0.5 text-primary [&_svg]:size-5\" aria-hidden>\n {icon}\n </span>\n ) : null}\n <div className=\"min-w-0\">\n <h2 id={headingId} className=\"font-semibold\">\n {title}\n </h2>\n {description ? <p className=\"text-sm text-muted-foreground\">{description}</p> : null}\n </div>\n </header>\n <div\n className={cn(\n \"divide-y divide-border\",\n // Rows: genesis-ui SettingsRow and ToggleRow, padded to the card.\n \"[&>*]:px-5 [&>[data-slot=settings-row]]:py-3.5\",\n \"[&>[data-slot=settings-row]:not(:has([role=switch]))]:max-sm:flex-col\",\n \"[&>[data-slot=settings-row]:not(:has([role=switch]))]:max-sm:items-stretch\",\n \"[&>[data-slot=settings-row]>div:last-child]:max-sm:flex-wrap\",\n )}\n >\n {children}\n </div>\n </section>\n );\n}\n\nexport interface SettingsPageSection {\n id: string;\n title: string;\n icon?: ReactNode;\n description?: ReactNode;\n /** The rows. Absent: a jump link only, to `#id` elsewhere on the page (or `onSelect`). */\n content?: ReactNode;\n /** For a link-only section whose target has no id: scroll to it yourself. */\n onSelect?: (() => void) | undefined;\n}\n\n/**\n * Every setting of one thing (a form, a course) on one page: jump links on the left (\"On this page\", the one in\n * view marked), the sections as cards on the right. On a phone the links sit above the\n * sections as a row that scrolls sideways.\n *\n * Not genesis-ui's `SettingsPage`: that one is a whole page with its own title, and plain\n * sections; these settings sit under the resource's header, as cards with icons.\n */\nexport function ResourceSettingsPage({\n sections,\n navLabel = \"On this page\",\n className,\n}: {\n sections: readonly SettingsPageSection[];\n navLabel?: string | undefined;\n className?: string | undefined;\n}) {\n const [active, setActive] = useState(sections[0]?.id);\n const ids = sections.map((s) => s.id).join(\" \");\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n // The section in view is the last one whose top has passed the upper third of the\n // window (the first one before any has).\n let frame = 0;\n const update = () => {\n frame = 0;\n const line = window.innerHeight / 3;\n let current = sections[0]?.id;\n for (const s of sections) {\n const el = document.getElementById(s.id);\n if (el && el.getBoundingClientRect().top <= line) current = s.id;\n }\n // At the very bottom the last sections can't reach the line: the last one is in view.\n const bottom = window.innerHeight + window.scrollY >= document.documentElement.scrollHeight - 2;\n const last = [...sections].reverse().find((s) => document.getElementById(s.id));\n if (bottom && last && window.scrollY > 0) current = last.id;\n setActive(current);\n };\n const onScroll = () => {\n if (!frame) frame = window.requestAnimationFrame(update);\n };\n update();\n window.addEventListener(\"scroll\", onScroll, { passive: true, capture: true });\n return () => {\n window.removeEventListener(\"scroll\", onScroll, { capture: true });\n if (frame) window.cancelAnimationFrame(frame);\n };\n }, [ids]); // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <div\n data-slot=\"resource-settings-page\"\n className={cn(\"grid grid-cols-[minmax(0,1fr)] gap-6 md:grid-cols-[12rem_minmax(0,1fr)] lg:gap-8\", className)}\n >\n <nav aria-label={navLabel} className=\"min-w-0 md:sticky md:top-4 md:self-start\">\n <p className=\"mb-2 hidden text-xs font-medium uppercase tracking-wide text-muted-foreground md:block\">\n {navLabel}\n </p>\n <ul className=\"-mx-1 flex gap-1 overflow-x-auto px-1 md:mx-0 md:flex-col md:overflow-visible md:px-0\">\n {sections.map((s) => (\n <li key={s.id} className=\"shrink-0\">\n <a\n href={`#${s.id}`}\n aria-current={active === s.id ? \"location\" : undefined}\n onClick={(e) => {\n setActive(s.id);\n if (s.content === undefined && s.onSelect) {\n e.preventDefault();\n s.onSelect();\n }\n }}\n className={cn(\n \"flex items-center gap-2 whitespace-nowrap rounded-md px-3 py-1.5 text-sm text-muted-foreground hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring [&_svg]:size-4\",\n active === s.id && \"bg-muted font-medium text-foreground\",\n )}\n >\n {s.icon ? <span aria-hidden>{s.icon}</span> : null}\n {s.title}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n <div className=\"flex min-w-0 flex-col gap-5\">\n {sections\n .filter((s) => s.content !== undefined)\n .map((s) => (\n <SettingsSection key={s.id} id={s.id} icon={s.icon} title={s.title} description={s.description}>\n {s.content}\n </SettingsSection>\n ))}\n </div>\n </div>\n );\n}\n","import { GitBranch, Inbox, ListChecks, Settings } from \"lucide-react\";\nimport type { FormTab } from \"./status\";\n\n/** The form page's four places' icons, for `formNavItems(path, counts, FORM_NAV_ICONS)`. */\nexport const FORM_NAV_ICONS = {\n questions: ListChecks,\n logic: GitBranch,\n responses: Inbox,\n settings: Settings,\n} satisfies Record<FormTab, unknown>;\n","import type { ReactNode } from \"react\";\nimport {\n Button,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@marktiderman/genesis-ui\";\nimport { CalendarDays, CircleDashed, TriangleAlert, X } from \"lucide-react\";\nimport { lowThisWeek, NO_FILTERS, STATUS_FILTER_LABEL, type FiltersValue, type StatusFilter } from \"./summary\";\n\n/** One \"pick a value\" filter over an extra column, such as a class or a coach. */\nexport interface ChoiceFilter {\n key: string;\n /** \"Any class\": what the menu says when nothing is picked. */\n allLabel: string;\n /** For screen readers: \"Class\". */\n label: string;\n options: string[];\n /** Shown before the value, e.g. a person icon for a coach. */\n icon?: ReactNode;\n}\n\nconst WHEN: { value: FiltersValue[\"when\"]; label: string }[] = [\n { value: \"all\", label: \"All time\" },\n { value: \"today\", label: \"Today\" },\n { value: \"week\", label: \"This week\" },\n { value: \"7d\", label: \"Last 7 days\" },\n { value: \"30d\", label: \"Last 30 days\" },\n { value: \"month\", label: \"This month\" },\n { value: \"custom\", label: \"Pick dates\" },\n];\nconst ANY = \"__any\";\nconst TRIGGER = \"h-9 w-auto min-w-0 gap-2 [&>span]:flex [&>span]:items-center [&>span]:gap-2\";\n\n/**\n * Filters for a form's responses: when, the status (with `statuses`: Sent and partial,\n * Sent, Partial, In progress), any number of choice filters, a rating floor, and the\n * low-ratings chip (\"Low ratings this week\" until it's on; then a chip saying what low\n * means, with ×). The summary and the list of responses share one value.\n */\nexport function ResponsesFilters({\n value,\n onChange,\n choices = [],\n ratingMax = null,\n lowLabel = null,\n statuses = false,\n filtered,\n}: {\n /** Show the status filter: for a form that saves answers as they go (settings.saveProgress). */\n statuses?: boolean | undefined;\n value: FiltersValue;\n onChange: (next: FiltersValue) => void;\n choices?: readonly ChoiceFilter[] | undefined;\n /** The highest rating any question asks for (highestRating); no rating filter when null. */\n ratingMax?: number | null | undefined;\n /** What counts as low (lowRatingLabel); no low-ratings chip when null. */\n lowLabel?: string | null | undefined;\n /** Whether anything is left out (isFiltered), for Clear filters. */\n filtered: boolean;\n}) {\n const ratings = ratingMax ? Array.from({ length: Math.min(ratingMax, 10) - 1 }, (_, i) => i + 1) : [];\n return (\n <div className=\"flex flex-wrap items-center gap-2\" data-testid=\"responses-filters\">\n <Select value={value.when} onValueChange={(when) => onChange({ ...value, when: when as FiltersValue[\"when\"] })}>\n <SelectTrigger className={TRIGGER} aria-label=\"When\">\n <CalendarDays className=\"size-4 text-muted-foreground\" aria-hidden />\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {WHEN.map((w) => (\n <SelectItem key={w.value} value={w.value}>\n {w.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {value.when === \"custom\" ? (\n <span className=\"flex items-center gap-1\">\n <Input\n type=\"date\"\n className=\"h-9 w-auto\"\n aria-label=\"From\"\n value={value.from}\n max={value.to || undefined}\n onChange={(e) => onChange({ ...value, from: e.target.value })}\n />\n <span className=\"text-sm text-muted-foreground\">to</span>\n <Input\n type=\"date\"\n className=\"h-9 w-auto\"\n aria-label=\"To\"\n value={value.to}\n min={value.from || undefined}\n onChange={(e) => onChange({ ...value, to: e.target.value })}\n />\n </span>\n ) : null}\n {statuses ? (\n <Select\n value={value.status ?? \"counted\"}\n onValueChange={(status) => onChange({ ...value, status: status as StatusFilter })}\n >\n <SelectTrigger className={TRIGGER} aria-label=\"Status\" data-testid=\"responses-status\">\n <CircleDashed className=\"size-4 text-muted-foreground\" aria-hidden />\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {(Object.keys(STATUS_FILTER_LABEL) as StatusFilter[]).map((s) => (\n <SelectItem key={s} value={s}>\n {STATUS_FILTER_LABEL[s]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n {choices\n .filter((c) => c.options.length > 0)\n .map((c) => (\n <Select\n key={c.key}\n value={value.match[c.key] || ANY}\n onValueChange={(v) => onChange({ ...value, match: { ...value.match, [c.key]: v === ANY ? \"\" : v } })}\n >\n <SelectTrigger className={`${TRIGGER} max-w-56`} aria-label={c.label}>\n {c.icon ? (\n <span className=\"text-muted-foreground [&_svg]:size-4\" aria-hidden>\n {c.icon}\n </span>\n ) : null}\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ANY}>{c.allLabel}</SelectItem>\n {c.options.map((o) => (\n <SelectItem key={o} value={o}>\n {o}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ))}\n {ratings.length > 0 ? (\n <Select\n value={value.ratingAtMost == null ? ANY : String(value.ratingAtMost)}\n onValueChange={(v) => onChange({ ...value, ratingAtMost: v === ANY ? null : Number(v) })}\n >\n <SelectTrigger className={TRIGGER} aria-label=\"Rating\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ANY}>Any rating</SelectItem>\n {ratings.map((r) => (\n <SelectItem key={r} value={String(r)}>\n {r === 1 ? \"Rated 1\" : `Rated ${r} or below`}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n {lowLabel ? (\n value.low ? (\n <span\n className=\"inline-flex h-9 items-center gap-1.5 rounded-md bg-warning/15 pl-2.5 pr-1 text-sm text-amber-800 dark:bg-warning/20 dark:text-amber-200\"\n data-testid=\"low-ratings-chip\"\n >\n <TriangleAlert className=\"size-4\" aria-hidden />\n {`Low ratings (${lowLabel})`}\n <button\n type=\"button\"\n aria-label=\"Show every rating\"\n className=\"rounded p-1 hover:bg-warning/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={() => onChange({ ...value, low: false })}\n >\n <X className=\"size-3.5\" aria-hidden />\n </button>\n </span>\n ) : (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-9\"\n startIcon={<TriangleAlert className=\"size-4\" />}\n onClick={() => onChange(lowThisWeek(value))}\n data-testid=\"low-ratings-preset\"\n >\n Low ratings this week\n </Button>\n )\n ) : null}\n {filtered ? (\n <Button variant=\"ghost\" size=\"sm\" className=\"h-9\" onClick={() => onChange(NO_FILTERS)}>\n Clear filters\n </Button>\n ) : null}\n </div>\n );\n}\n","import { useState, type ComponentType, type ReactNode } from \"react\";\nimport { Button, EmptyState, Skeleton, cn } from \"@marktiderman/genesis-ui\";\nimport {\n CircleCheck,\n CircleDot,\n Gauge,\n Inbox,\n ListChecks,\n SquareCheck,\n Star,\n Type,\n type LucideProps,\n} from \"lucide-react\";\nimport { dayLabel } from \"./generic/days\";\nimport { SummaryCard } from \"./generic/SummaryCard\";\nimport { lowScaleAtMost } from \"./summary\";\nimport type { ChoiceSummary, QuestionSummary, ScaleSummary, TextSummary } from \"./summary\";\n\nconst FIRST_TEXT = 5;\nconst MORE_TEXT = 10;\n\nconst plural = (n: number, one: string, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;\n\nconst ICONS: Record<string, ComponentType<LucideProps>> = {\n rating: Star,\n nps: Gauge,\n consent: SquareCheck,\n \"yes-no\": CircleCheck,\n \"single-choice\": CircleDot,\n dropdown: CircleDot,\n \"multi-choice\": ListChecks,\n};\n\n/** A bar as wide as its share; low scores in the warning colour. */\nfunction Bar({ share, low = false }: { share: number; low?: boolean }) {\n return (\n <span className=\"h-2 overflow-hidden rounded-full bg-muted\" aria-hidden>\n <span\n className={cn(\"block h-full rounded-full\", low ? \"bg-warning\" : \"bg-primary\")}\n style={{ width: `${Math.max(0, Math.min(100, share))}%` }}\n />\n </span>\n );\n}\n\nfunction ScaleBody({ s }: { s: ScaleSummary }) {\n const most = Math.max(1, ...s.buckets.map((b) => b.count));\n const atMost = lowScaleAtMost(s.type, s.max);\n return (\n <>\n {s.nps ? (\n <p className=\"text-sm\">\n <span className=\"text-2xl font-semibold tabular-nums\">{s.nps.score}</span>{\" \"}\n <span className=\"text-muted-foreground\">NPS</span>\n <span className=\"block text-xs text-muted-foreground\">\n {plural(s.nps.promoters, \"promoter\")} (9–10), {plural(s.nps.passives, \"passive\")} (7–8),{\" \"}\n {plural(s.nps.detractors, \"detractor\")} (0–6)\n </span>\n </p>\n ) : null}\n {s.rescaled || s.excluded ? (\n <p className=\"text-xs text-muted-foreground\" data-testid={`scale-note-${s.key}`}>\n {[\n s.rescaled\n ? `${plural(s.rescaled, \"answer\")} from an earlier version's scale moved onto ${s.min}–${s.max}.`\n : \"\",\n s.excluded ? `${plural(s.excluded, \"answer\")} outside the scale left out.` : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n </p>\n ) : null}\n <ul className=\"space-y-2\" aria-label=\"Answers by score\">\n {[...s.buckets].reverse().map((b) => (\n <li key={b.value} className=\"grid grid-cols-[2.25rem_1fr_2rem] items-center gap-3 text-sm\">\n <span className=\"flex items-center gap-1 tabular-nums\">\n {b.value}\n {s.type === \"rating\" ? <Star className=\"size-3 fill-current\" aria-label=\"stars\" /> : null}\n </span>\n <Bar share={(b.count / most) * 100} low={b.value <= atMost} />\n <span className=\"text-right tabular-nums text-muted-foreground\">{b.count}</span>\n </li>\n ))}\n </ul>\n </>\n );\n}\n\n/** Two-way questions (consent, yes/no) as one split bar; others as a bar per option. */\nfunction ChoiceBody({ s }: { s: ChoiceSummary }) {\n if (s.fieldType === \"consent\" || s.fieldType === \"yes-no\") {\n const yes = s.options.find((o) => o.value === \"true\");\n const no = s.options.find((o) => o.value === \"false\");\n return (\n <>\n <span className=\"flex h-2.5 overflow-hidden rounded-full bg-muted\" aria-hidden>\n <span className=\"h-full bg-primary\" style={{ width: `${yes?.percent ?? 0}%` }} />\n </span>\n <p className=\"flex flex-wrap gap-x-4 gap-y-1 text-sm\">\n {yes ? (\n <span className=\"text-emerald-700 dark:text-emerald-300\">\n {yes.label} · {yes.count} ({Math.round(yes.percent)}%)\n </span>\n ) : null}\n {no ? (\n <span className=\"text-muted-foreground\">\n {no.label} · {no.count}\n </span>\n ) : null}\n </p>\n </>\n );\n }\n const most = Math.max(1, ...s.options.map((o) => o.count));\n return (\n <>\n <ul className=\"space-y-2\">\n {s.options.map((o) => (\n <li key={o.value} className=\"grid grid-cols-[minmax(2rem,12rem)_1fr_auto] items-center gap-3 text-sm\">\n <span className=\"truncate\" title={o.label}>\n {o.label}\n </span>\n <Bar share={(o.count / most) * 100} />\n <span className=\"whitespace-nowrap text-right tabular-nums text-muted-foreground\">\n {o.count} · {Math.round(o.percent)}%\n </span>\n </li>\n ))}\n </ul>\n {s.multiple ? <p className=\"text-xs text-muted-foreground\">People could pick more than one.</p> : null}\n </>\n );\n}\n\nfunction TextBody({\n s,\n today,\n answerMeta,\n}: {\n s: TextSummary;\n today?: string | undefined;\n answerMeta?: ((id: string) => ReactNode) | undefined;\n}) {\n const [shown, setShown] = useState(FIRST_TEXT);\n const left = s.answers.length - shown;\n return (\n <>\n <ul className=\"space-y-3\">\n {s.answers.slice(0, shown).map((a) => {\n const meta = answerMeta?.(a.id);\n return (\n <li key={a.id} className=\"border-l-2 border-border pl-3\">\n <p className=\"whitespace-pre-wrap break-words text-sm\">“{a.text}”</p>\n <p className=\"text-xs text-muted-foreground\">\n {dayLabel(a.date, today)}\n {meta ? <> · {meta}</> : null}\n </p>\n </li>\n );\n })}\n </ul>\n {left > 0 ? (\n <Button variant=\"ghost\" size=\"sm\" className=\"self-start\" onClick={() => setShown((n) => n + MORE_TEXT)}>\n Show more ({left} more)\n </Button>\n ) : null}\n </>\n );\n}\n\n/** One question's card: its type icon, title and answer count, then its spread. */\nexport function QuestionSummaryCard({\n summary: s,\n today,\n answerMeta,\n}: {\n summary: QuestionSummary;\n today?: string | undefined;\n answerMeta?: ((id: string) => ReactNode) | undefined;\n}) {\n const Icon = ICONS[s.fieldType] ?? Type;\n const average = s.kind === \"scale\" && s.average !== null ? ` · average ${s.average.toFixed(1)}` : \"\";\n return (\n <SummaryCard\n icon={<Icon />}\n title={s.label || \"Untitled question\"}\n meta={s.count ? `${plural(s.count, \"answer\")}${average}` : \"No answers yet\"}\n testID={`summary-${s.key}`}\n >\n {s.count > 0 ? (\n s.kind === \"scale\" ? (\n <ScaleBody s={s} />\n ) : s.kind === \"choice\" ? (\n <ChoiceBody s={s} />\n ) : (\n <TextBody s={s} today={today} answerMeta={answerMeta} />\n )\n ) : null}\n </SummaryCard>\n );\n}\n\n/**\n * A form's responses question by question (summarizeResponses): each rating or NPS\n * question's spread with low scores marked, counts for each choice, consent and yes/no\n * as one split bar, and the latest written answers.\n */\nexport function QuestionSummaryCards({\n summaries,\n responses,\n isLoading = false,\n emptyTitle = \"No responses yet\",\n emptyDescription,\n onClearFilters,\n today,\n answerMeta,\n className,\n}: {\n summaries: readonly QuestionSummary[];\n /** How many responses the summaries cover. */\n responses: number;\n isLoading?: boolean | undefined;\n emptyTitle?: string | undefined;\n emptyDescription?: string | undefined;\n /** Given while filters are on: an empty summary then says so, with a way out. */\n onClearFilters?: (() => void) | undefined;\n /** Today (YYYY-MM-DD) on the responses' clock, so written answers say \"Today\". */\n today?: string | undefined;\n /** Extra words after a written answer's day, by response id: \"6:00 WOD · rated 2\". */\n answerMeta?: ((id: string) => ReactNode) | undefined;\n className?: string | undefined;\n}) {\n if (isLoading) {\n return (\n <div className={cn(\"space-y-3\", className)}>\n <Skeleton className=\"h-40 w-full rounded-lg\" />\n <Skeleton className=\"h-32 w-full rounded-lg\" />\n </div>\n );\n }\n if (!responses) {\n return (\n <EmptyState\n icon={Inbox}\n title={emptyTitle}\n {...(emptyDescription ? { description: emptyDescription } : {})}\n hasFilters={!!onClearFilters}\n {...(onClearFilters ? { onClearFilters } : {})}\n />\n );\n }\n return (\n <div className={cn(\"flex min-w-0 flex-col gap-3\", className)}>\n {summaries.map((s) => (\n <QuestionSummaryCard key={s.key} summary={s} today={today} answerMeta={answerMeta} />\n ))}\n </div>\n );\n}\n","import { Skeleton, cn } from \"@marktiderman/genesis-ui\";\nimport { ChartNoAxesColumnDecreasing } from \"lucide-react\";\nimport { SummaryCard } from \"./generic/SummaryCard\";\nimport type { QuestionDropOff } from \"./dropoff\";\n\nconst plural = (n: number, one: string, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;\n\n/**\n * Drop-off by question (dropOffByQuestion): for each question in order, how many people\n * reached it, how many stopped there, and that as a share, with the share as a bar (the\n * question most people left on in the warning colour). For a form that saves answers as\n * they go.\n */\nexport function DropOffByQuestion({\n dropOffs,\n isLoading = false,\n title = \"Drop-off by question\",\n className,\n}: {\n dropOffs: readonly QuestionDropOff[];\n isLoading?: boolean | undefined;\n title?: string | undefined;\n className?: string | undefined;\n}) {\n if (isLoading) return <Skeleton className={cn(\"h-40 w-full rounded-lg\", className)} />;\n const started = dropOffs[0]?.views ?? 0;\n const worst = Math.max(0, ...dropOffs.map((d) => d.stopped));\n return (\n <SummaryCard\n icon={<ChartNoAxesColumnDecreasing />}\n title={title}\n meta={started ? `${plural(started, \"person\", \"people\")} started` : \"Nobody has started yet\"}\n className={className}\n testID=\"drop-off\"\n >\n {started ? (\n <ol className=\"space-y-3\">\n {dropOffs.map((d, i) => (\n <li key={d.key} className=\"space-y-1.5 text-sm\" data-testid={`drop-off-${d.key}`}>\n <p className=\"flex items-baseline justify-between gap-3\">\n <span className=\"min-w-0 break-words\">\n <span className=\"text-muted-foreground tabular-nums\">{i + 1}. </span>\n {d.label || \"Untitled question\"}\n </span>\n <span className=\"shrink-0 whitespace-nowrap tabular-nums text-muted-foreground\">\n {d.dropOff === null ? \"–\" : `${d.dropOff}% drop-off`}\n </span>\n </p>\n <span className=\"block h-2 overflow-hidden rounded-full bg-muted\" aria-hidden>\n <span\n className={cn(\n \"block h-full rounded-full\",\n d.stopped && d.stopped === worst ? \"bg-warning\" : \"bg-primary\",\n )}\n style={{ width: `${d.dropOff ?? 0}%` }}\n />\n </span>\n <p className=\"text-xs text-muted-foreground\">\n {plural(d.views, \"view\")} · {d.stopped} stopped here\n </p>\n </li>\n ))}\n </ol>\n ) : null}\n </SummaryCard>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { ExternalLink, ImageOff, Image as ImageIcon } from \"lucide-react\";\nimport { cn, Skeleton } from \"@marktiderman/genesis-ui\";\nimport type { PhotoRef } from \"@marktiderman/genesis-forms\";\n\n/** Types most browsers can't draw (HEIC and HEIF): shown as a file tile with an Open link. */\nconst UNDRAWABLE = new Set([\"image/heic\", \"image/heif\"]);\n\ntype Resolved = { state: \"loading\" } | { state: \"ready\"; url: string } | { state: \"missing\" };\n\nfunction Photo({ photo, resolveUrl }: { photo: PhotoRef; resolveUrl: (ref: PhotoRef) => Promise<string | null> }) {\n const [resolved, setResolved] = useState<Resolved>({ state: \"loading\" });\n const [broken, setBroken] = useState(false);\n\n // Each photo's address is asked for once (per photo id); a signed link may expire, so\n // it isn't kept beyond this view.\n useEffect(() => {\n let live = true;\n setResolved({ state: \"loading\" });\n setBroken(false);\n resolveUrl(photo)\n .then((url) => live && setResolved(url ? { state: \"ready\", url } : { state: \"missing\" }))\n .catch(() => live && setResolved({ state: \"missing\" }));\n return () => {\n live = false;\n };\n }, [photo.id]); // eslint-disable-line react-hooks/exhaustive-deps -- resolveUrl is often an inline function\n\n const tile = \"relative size-28 overflow-hidden rounded-md border border-border bg-muted\";\n if (resolved.state === \"loading\") return <Skeleton className=\"size-28 rounded-md\" aria-label={`Loading ${photo.name}`} />;\n if (resolved.state === \"missing\") {\n return (\n <div className={cn(tile, \"flex flex-col items-center justify-center gap-1 p-2 text-center text-xs text-muted-foreground\")}>\n <ImageOff className=\"size-5\" aria-hidden=\"true\" />\n <span>Photo unavailable</span>\n </div>\n );\n }\n if (broken || UNDRAWABLE.has(photo.type.toLowerCase())) {\n return (\n <div className={cn(tile, \"flex flex-col items-center justify-center gap-1 p-2 text-center text-xs\")}>\n <ImageIcon className=\"size-5 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"line-clamp-2 break-all text-muted-foreground\">{photo.name}</span>\n <a\n href={resolved.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1 font-medium text-primary underline-offset-4 hover:underline\"\n >\n Open <ExternalLink className=\"size-3\" aria-hidden=\"true\" />\n <span className=\"sr-only\">{photo.name}</span>\n </a>\n </div>\n );\n }\n return (\n <a\n href={resolved.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={cn(tile, \"block outline-none ring-offset-background focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\")}\n title={photo.name}\n >\n <img src={resolved.url} alt={photo.name} loading=\"lazy\" className=\"size-full object-cover\" onError={() => setBroken(true)} />\n </a>\n );\n}\n\n/**\n * A response's photos as thumbnails, each opening full size in a new tab. Data-agnostic:\n * the host resolves each reference to an address it may show (a short-lived signed link,\n * say), or null when it can't. A photo most browsers can't draw (HEIC) is a tile with\n * its name and an Open link; one that can't be found says so.\n */\nexport function PhotoAnswer({\n photos,\n resolveUrl,\n className,\n testID,\n}: {\n photos: PhotoRef[];\n resolveUrl: (ref: PhotoRef) => Promise<string | null>;\n className?: string | undefined;\n testID?: string | undefined;\n}) {\n if (!photos.length) return null;\n return (\n <ul className={cn(\"flex flex-wrap gap-3\", className)} aria-label=\"Photos\" data-testid={testID}>\n {photos.map((photo) => (\n <li key={photo.id}>\n <Photo photo={photo} resolveUrl={resolveUrl} />\n </li>\n ))}\n </ul>\n );\n}\n"]}
|