@marktiderman/genesis-ui 2.14.0 → 2.16.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/layout/builder-layout.tsx"],"names":[],"mappings":"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","file":"chunk-TP6QNFDG.js","sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils\";\n\n/**\n * Props passed through to one slot's wrapper element: a class, a test id,\n * any `data-*` or ARIA attribute.\n */\nexport type BuilderLayoutSlotProps = React.HTMLAttributes<HTMLElement> & {\n [attribute: `data-${string}`]: string | undefined;\n};\n\nexport interface BuilderLayoutProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Left column: the list of things being built (questions, lessons, steps).\n * Optional. Rendered as a `<nav>` when `outlineLabel` is set.\n */\n outline?: React.ReactNode;\n /** Centre column: the editor for the selected thing. Required. */\n editor: React.ReactNode;\n /**\n * Right column: a live preview (and anything that sits with it, such as\n * checks). Optional. Rendered as an `<aside>` when `previewLabel` is set.\n *\n * It keeps its place in the tree whatever `editor` and `outline` hold, so\n * swapping the editor (another section, another selected item) never\n * remounts it: the preview's own state (device, answers typed into it,\n * scroll) survives.\n */\n preview?: React.ReactNode;\n /** Accessible name for the outline; makes it a `navigation` landmark. */\n outlineLabel?: string | undefined;\n /** Accessible name for the preview; makes it a `complementary` landmark. */\n previewLabel?: string | undefined;\n /**\n * Keep the preview mounted but hidden, and give its width back to the\n * editor. For a section that needs the whole width (a host's own\n * settings layout) without losing the preview's state.\n */\n previewHidden?: boolean | undefined;\n /**\n * Pin the outline and/or the preview at the top while the editor scrolls,\n * once each sits in a column of its own (not while stacked). `true` pins\n * both. Default `false`.\n */\n sticky?: boolean | { outline?: boolean | undefined; preview?: boolean | undefined } | undefined;\n /**\n * With `sticky`, cap each pinned column at the viewport height and let it\n * scroll on its own, so a long outline or preview stays reachable.\n * Default `false`.\n */\n scrollSticky?: boolean | undefined;\n /** Props for the outline's wrapper (class, test id, data attributes). */\n outlineProps?: BuilderLayoutSlotProps | undefined;\n /** Props for the editor's wrapper. */\n editorProps?: BuilderLayoutSlotProps | undefined;\n /** Props for the preview's wrapper. */\n previewProps?: BuilderLayoutSlotProps | undefined;\n}\n\ntype Shape = \"full\" | \"outline\" | \"preview\" | \"editor\";\n\n/**\n * Grid tracks per slot combination. Container queries, so the columns follow\n * the space the builder has, not the window: a builder beside a sidebar gets\n * fewer columns than one on the whole screen. Written out literally because\n * Tailwind scans source text.\n *\n * Outline, editor and preview:\n * - under 34rem everything stacks (outline, editor, preview);\n * - from 34rem the outline (13rem) sits beside the editor, the preview under both;\n * - from 56rem three columns: 13rem, editor, 20rem;\n * - from 76rem the side columns widen: 16rem, editor, 24.5rem.\n * Outline and editor: 13rem from 34rem, 16rem from 48rem.\n * Editor and preview: preview 20rem from 56rem, 24.5rem from 76rem.\n */\nconst GRID: Record<Shape, string> = {\n full: \"@min-[34rem]:grid-cols-[13rem_minmax(0,1fr)] @min-[56rem]:grid-cols-[13rem_minmax(0,1fr)_20rem] @min-[76rem]:grid-cols-[16rem_minmax(0,1fr)_24.5rem]\",\n outline: \"@min-[34rem]:grid-cols-[13rem_minmax(0,1fr)] @min-[48rem]:grid-cols-[16rem_minmax(0,1fr)]\",\n preview: \"@min-[56rem]:grid-cols-[minmax(0,1fr)_20rem] @min-[76rem]:grid-cols-[minmax(0,1fr)_24.5rem]\",\n editor: \"\",\n};\n\n// The outline is a column from 34rem; the preview from 56rem.\nconst OUTLINE_STICKY = \"@min-[34rem]:sticky @min-[34rem]:top-4\";\nconst OUTLINE_SCROLL = \"@min-[34rem]:max-h-[calc(100dvh-2rem)] @min-[34rem]:overflow-y-auto\";\nconst PREVIEW_STICKY = \"@min-[56rem]:sticky @min-[56rem]:top-4\";\nconst PREVIEW_SCROLL = \"@min-[56rem]:max-h-[calc(100dvh-2rem)] @min-[56rem]:overflow-y-auto\";\n// With an outline, the preview spans both columns while it sits under them.\nconst PREVIEW_UNDER = \"@min-[34rem]:col-span-2 @min-[56rem]:col-span-1\";\n\n/**\n * BuilderLayout — the three columns of a builder: an outline of the parts on\n * the left, the editor for the selected part in the centre, a live preview\n * on the right.\n *\n * ```tsx\n * <BuilderLayout\n * outline={<QuestionList />}\n * outlineLabel=\"Outline\"\n * editor={<QuestionEditor key={selectedId} />}\n * preview={<LivePreview />}\n * previewLabel=\"Preview\"\n * sticky\n * />\n * ```\n *\n * Responsive by container query, so it needs no knowledge of the page around\n * it: all three columns from a 56rem container, wider side columns from\n * 76rem, the preview under the editor below 56rem and everything stacked\n * below 34rem (see `GRID` for each slot combination). The preview keeps its\n * place in the tree when the editor or outline changes, so it never\n * remounts; changing `previewLabel` between set and unset does remount it\n * (the element changes from `<div>` to `<aside>`).\n *\n * It positions the three parts and nothing else. It does **not** own tabs,\n * the app rail or a page header: those belong to the shell. Put a builder's\n * sections in `useAppShellSubNav` (or your own tabs inside `editor`) and its\n * title, status and actions in `AppShellPageHeader`. To keep one preview\n * across sections, render one `BuilderLayout` around the sections and swap\n * `editor`; nest a second one (outline and editor only) inside a section\n * that has an outline.\n *\n * @stability Beta\n */\nexport const BuilderLayout = React.forwardRef<HTMLDivElement, BuilderLayoutProps>(\n (\n {\n outline,\n editor,\n preview,\n outlineLabel,\n previewLabel,\n previewHidden = false,\n sticky = false,\n scrollSticky = false,\n outlineProps,\n editorProps,\n previewProps,\n className,\n ...props\n },\n ref,\n ) => {\n const hasOutline = outline != null && outline !== false;\n const hasPreview = preview != null && preview !== false;\n const showsPreview = hasPreview && !previewHidden;\n const shape: Shape = hasOutline ? (showsPreview ? \"full\" : \"outline\") : showsPreview ? \"preview\" : \"editor\";\n const stickOutline = sticky === true || (typeof sticky === \"object\" && !!sticky.outline);\n const stickPreview = sticky === true || (typeof sticky === \"object\" && !!sticky.preview);\n\n const Outline = outlineLabel ? \"nav\" : \"div\";\n const Preview = previewLabel ? \"aside\" : \"div\";\n\n return (\n <div ref={ref} data-slot=\"builder-layout\" className={cn(\"@container\", className)} {...props}>\n <div className={cn(\"grid items-start gap-6\", GRID[shape])}>\n {/* Every slot keeps its position (null when absent), so the preview never moves in the tree. */}\n {hasOutline ? (\n <Outline\n aria-label={outlineLabel}\n {...outlineProps}\n data-slot=\"builder-layout-outline\"\n className={cn(\n \"min-w-0\",\n stickOutline && OUTLINE_STICKY,\n stickOutline && scrollSticky && OUTLINE_SCROLL,\n outlineProps?.className,\n )}\n >\n {outline}\n </Outline>\n ) : null}\n <div {...editorProps} data-slot=\"builder-layout-editor\" className={cn(\"min-w-0\", editorProps?.className)}>\n {editor}\n </div>\n {hasPreview ? (\n <Preview\n aria-label={previewLabel}\n {...previewProps}\n data-slot=\"builder-layout-preview\"\n className={cn(\n \"min-w-0\",\n hasOutline && PREVIEW_UNDER,\n stickPreview && PREVIEW_STICKY,\n stickPreview && scrollSticky && PREVIEW_SCROLL,\n previewHidden && \"hidden\",\n previewProps?.className,\n )}\n >\n {preview}\n </Preview>\n ) : null}\n </div>\n </div>\n );\n },\n);\nBuilderLayout.displayName = \"BuilderLayout\";\n"]}
@@ -10,8 +10,8 @@ import { Skeleton } from './chunk-QFM4Z2SS.js';
10
10
  import { Input } from './chunk-QSXVL5UB.js';
11
11
  import { Badge } from './chunk-NPNADZHM.js';
12
12
  import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from './chunk-FK42ZGGV.js';
13
- import { Label } from './chunk-F47U5KNW.js';
14
13
  import { Button } from './chunk-NWSCYLPT.js';
14
+ import { Label } from './chunk-F47U5KNW.js';
15
15
  import { toast } from './chunk-4RAZJ6LL.js';
16
16
  import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from './chunk-7XMZVISM.js';
17
17
  import { cn } from './chunk-NZ5WBA4R.js';
@@ -601,5 +601,5 @@ function ShareDialog({
601
601
  }
602
602
 
603
603
  export { Chip, FollowUpList, HeadlineNumbers, ReadinessChip, ResourceHeader, ResourceSettingsPage, ResponsesToolbar, SettingsSection, ShareDialog, SummaryCard };
604
- //# sourceMappingURL=chunk-D3U5SBLW.js.map
605
- //# sourceMappingURL=chunk-D3U5SBLW.js.map
604
+ //# sourceMappingURL=chunk-ZEUUIJ57.js.map
605
+ //# sourceMappingURL=chunk-ZEUUIJ57.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/resource/chip.tsx","../src/components/resource/ResourceHeader.tsx","../src/components/resource/ReadinessChip.tsx","../src/components/resource/ResponsesToolbar.tsx","../src/components/resource/HeadlineNumbers.tsx","../src/components/resource/SummaryCard.tsx","../src/components/resource/FollowUpList.tsx","../src/components/resource/ResourceSettingsPage.tsx","../src/components/resource/ShareDialog.tsx"],"names":["jsxs","jsx","Fragment","Check","TriangleAlert","useState"],"mappings":"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","file":"chunk-D3U5SBLW.js","sourcesContent":["import type { ReactNode } from \"react\";\nimport { Badge } from \"../ui/badge\";\nimport { StatusBadge } from \"../patterns/status-badge\";\nimport { cn } from \"../../utils\";\nimport type { ChipTone } from \"./status\";\n\n/** A small status chip in one of the resource workspace'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 BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"../ui/breadcrumb\";\nimport { Button } from \"../ui/button\";\nimport { Separator } from \"../ui/separator\";\nimport { cn } from \"../../utils\";\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=\"/courses\">Courses</Link>`: one element, so\n * the host's router renders it.\n */\n parent?: ReactNode;\n /** The status chip, e.g. \"Live · version 3\" or \"Draft\" (forms-studio's formStatusChip makes a form's). */\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 (\"Courses › 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 {/* The host's own link, as is: BreadcrumbLink would wrap it in a second <a>. */}\n <BreadcrumbItem className=\"[&_a:hover]:text-foreground [&_a]:transition-colors\">{parent}</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","import { Check, CircleAlert, TriangleAlert } from \"lucide-react\";\nimport { Chip } from \"./chip\";\nimport { readinessChip, type Readiness, type ReadinessLabels } 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 labels,\n className,\n}: {\n readiness: Readiness;\n /** The chip's words; the defaults are neutral (\"Nothing to publish yet\" when empty). */\n labels?: ReadinessLabels | undefined;\n onClick?: (() => void) | undefined;\n className?: string | undefined;\n}) {\n const { label, tone } = readinessChip(readiness, labels);\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 } from \"../ui/toggle-group\";\nimport { cn } from \"../../utils\";\n\nexport type ResponsesView = \"summary\" | \"each\";\n\n/**\n * The Responses tab's toolbar: a Summary / Each response switch, the host's filters\n * (forms-studio's ResponsesFilters, or its own) and, on the right, its export actions\n * (open a Sheet, Download CSV). `labels` renames the switch, e.g. \"Each submission\".\n */\nexport function ResponsesToolbar({\n view,\n onViewChange,\n filters,\n actions,\n labels = {},\n className,\n}: {\n view: ResponsesView;\n onViewChange: (view: ResponsesView) => void;\n filters?: ReactNode;\n actions?: ReactNode;\n /** The switch's words. Defaults \"Summary\", \"Each response\" and \"Show responses as\". */\n labels?: { summary?: string | undefined; each?: string | undefined; group?: string | undefined } | undefined;\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={labels.group ?? \"Show responses as\"}\n >\n <ToggleGroupItem value=\"summary\" className=\"h-9 px-3\" data-testid=\"responses-view-summary\">\n {labels.summary ?? \"Summary\"}\n </ToggleGroupItem>\n <ToggleGroupItem value=\"each\" className=\"h-9 px-3\" data-testid=\"responses-view-each\">\n {labels.each ?? \"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 } from \"../ui/skeleton\";\nimport { cn } from \"../../utils\";\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 \"../../utils\";\n\n/**\n * One card of a summary column: an icon and a title, a short line on the right (\"24\n * responses · 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 } from \"../ui/skeleton\";\nimport { cn } from \"../../utils\";\nimport { CircleCheck, Star, TriangleAlert } from \"lucide-react\";\nimport { Chip } from \"./chip\";\nimport type { ChipTone } from \"./status\";\n\n/** One item in the follow-up list (a response, a submission), 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 `noComment`. */\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 (the host decides which; forms-studio's needsFollowUp is\n * one rule), each with who answered, a tag, the day and context, their comment, its low\n * score and the host's actions (Reply, Mark handled). 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 noComment = \"No comment\",\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 /** Said for an entry without a comment. Default \"No comment\". */\n noComment?: string | undefined;\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 || noComment}\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","\"use client\";\n\nimport { useEffect, useState, type ReactNode } from \"react\";\nimport { cn } from \"../../utils\";\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\n/**\n * One section of a ResourceSettingsPage. (Named apart from the layout tier's\n * `SettingsPageSection`, which belongs to the whole-page `SettingsPage`.)\n */\nexport interface ResourceSettingsSection {\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, a worksheet) 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 ResourceSettingsSection[];\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 // One pass: the section past the line, and the last one on the page.\n let last: string | undefined;\n for (const s of sections) {\n const el = document.getElementById(s.id);\n if (!el) continue;\n last = s.id;\n if (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 if (bottom && last && window.scrollY > 0) current = last;\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","\"use client\";\n\nimport { useId, useState, type ReactNode } from \"react\";\nimport { Button } from \"../ui/button\";\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from \"../ui/dialog\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../ui/select\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../ui/tabs\";\nimport { Textarea } from \"../ui/textarea\";\nimport { toast } from \"../ui/sonner\";\nimport { Copy, ExternalLink, Printer } from \"lucide-react\";\nimport { embedSnippet, prefilledUrl, type PrefillChoice } from \"./share\";\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, a worksheet), as Google Forms' Send step:\n * its link with Copy, a QR code (and a printable poster when the host has one), an\n * `<iframe>` to embed it on a website, and a builder for prefilled links\n * (`?location=…&staff=…`, or whatever the host offers).\n * Generic: the host passes the link, how to draw a QR code, and the prefill choices.\n */\nexport function ShareDialog({\n open,\n onOpenChange,\n noun = \"page\",\n title = `Share your ${noun}`,\n description = \"Anyone with the link can open it.\",\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 /** Default \"Share your {noun}\". */\n title?: string | undefined;\n /** Default \"Anyone with the link can open it.\" */\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: \"page\" (default), \"form\", \"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"]}
1
+ {"version":3,"sources":["../src/components/resource/chip.tsx","../src/components/resource/ResourceHeader.tsx","../src/components/resource/ReadinessChip.tsx","../src/components/resource/ResponsesToolbar.tsx","../src/components/resource/HeadlineNumbers.tsx","../src/components/resource/SummaryCard.tsx","../src/components/resource/FollowUpList.tsx","../src/components/resource/ResourceSettingsPage.tsx","../src/components/resource/ShareDialog.tsx"],"names":["jsxs","jsx","Fragment","Check","TriangleAlert","useState"],"mappings":"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","file":"chunk-ZEUUIJ57.js","sourcesContent":["import type { ReactNode } from \"react\";\nimport { Badge } from \"../ui/badge\";\nimport { StatusBadge } from \"../patterns/status-badge\";\nimport { cn } from \"../../utils\";\nimport type { ChipTone } from \"./status\";\n\n/** A small status chip in one of the resource workspace'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 BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"../ui/breadcrumb\";\nimport { Button } from \"../ui/button\";\nimport { Separator } from \"../ui/separator\";\nimport { cn } from \"../../utils\";\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=\"/courses\">Courses</Link>`: one element, so\n * the host's router renders it.\n */\n parent?: ReactNode;\n /** The status chip, e.g. \"Live · version 3\" or \"Draft\" (forms-studio's formStatusChip makes a form's). */\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 (\"Courses › 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 {/* The host's own link, as is: BreadcrumbLink would wrap it in a second <a>. */}\n <BreadcrumbItem className=\"[&_a:hover]:text-foreground [&_a]:transition-colors\">{parent}</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","import { Check, CircleAlert, TriangleAlert } from \"lucide-react\";\nimport { Chip } from \"./chip\";\nimport { readinessChip, type Readiness, type ReadinessLabels } 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 labels,\n className,\n}: {\n readiness: Readiness;\n /** The chip's words; the defaults are neutral (\"Nothing to publish yet\" when empty). */\n labels?: ReadinessLabels | undefined;\n onClick?: (() => void) | undefined;\n className?: string | undefined;\n}) {\n const { label, tone } = readinessChip(readiness, labels);\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 } from \"../ui/toggle-group\";\nimport { cn } from \"../../utils\";\n\nexport type ResponsesView = \"summary\" | \"each\";\n\n/**\n * The Responses tab's toolbar: a Summary / Each response switch, the host's filters\n * (forms-studio's ResponsesFilters, or its own) and, on the right, its export actions\n * (open a Sheet, Download CSV). `labels` renames the switch, e.g. \"Each submission\".\n */\nexport function ResponsesToolbar({\n view,\n onViewChange,\n filters,\n actions,\n labels = {},\n className,\n}: {\n view: ResponsesView;\n onViewChange: (view: ResponsesView) => void;\n filters?: ReactNode;\n actions?: ReactNode;\n /** The switch's words. Defaults \"Summary\", \"Each response\" and \"Show responses as\". */\n labels?: { summary?: string | undefined; each?: string | undefined; group?: string | undefined } | undefined;\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={labels.group ?? \"Show responses as\"}\n >\n <ToggleGroupItem value=\"summary\" className=\"h-9 px-3\" data-testid=\"responses-view-summary\">\n {labels.summary ?? \"Summary\"}\n </ToggleGroupItem>\n <ToggleGroupItem value=\"each\" className=\"h-9 px-3\" data-testid=\"responses-view-each\">\n {labels.each ?? \"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 } from \"../ui/skeleton\";\nimport { cn } from \"../../utils\";\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 \"../../utils\";\n\n/**\n * One card of a summary column: an icon and a title, a short line on the right (\"24\n * responses · 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 } from \"../ui/skeleton\";\nimport { cn } from \"../../utils\";\nimport { CircleCheck, Star, TriangleAlert } from \"lucide-react\";\nimport { Chip } from \"./chip\";\nimport type { ChipTone } from \"./status\";\n\n/** One item in the follow-up list (a response, a submission), 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 `noComment`. */\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 (the host decides which; forms-studio's needsFollowUp is\n * one rule), each with who answered, a tag, the day and context, their comment, its low\n * score and the host's actions (Reply, Mark handled). 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 noComment = \"No comment\",\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 /** Said for an entry without a comment. Default \"No comment\". */\n noComment?: string | undefined;\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 || noComment}\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","\"use client\";\n\nimport { useEffect, useState, type ReactNode } from \"react\";\nimport { cn } from \"../../utils\";\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\n/**\n * One section of a ResourceSettingsPage. (Named apart from the layout tier's\n * `SettingsPageSection`, which belongs to the whole-page `SettingsPage`.)\n */\nexport interface ResourceSettingsSection {\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, a worksheet) 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 ResourceSettingsSection[];\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 // One pass: the section past the line, and the last one on the page.\n let last: string | undefined;\n for (const s of sections) {\n const el = document.getElementById(s.id);\n if (!el) continue;\n last = s.id;\n if (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 if (bottom && last && window.scrollY > 0) current = last;\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","\"use client\";\n\nimport { useId, useState, type ReactNode } from \"react\";\nimport { Button } from \"../ui/button\";\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from \"../ui/dialog\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../ui/select\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../ui/tabs\";\nimport { Textarea } from \"../ui/textarea\";\nimport { toast } from \"../ui/sonner\";\nimport { Copy, ExternalLink, Printer } from \"lucide-react\";\nimport { embedSnippet, prefilledUrl, type PrefillChoice } from \"./share\";\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, a worksheet), as Google Forms' Send step:\n * its link with Copy, a QR code (and a printable poster when the host has one), an\n * `<iframe>` to embed it on a website, and a builder for prefilled links\n * (`?location=…&staff=…`, or whatever the host offers).\n * Generic: the host passes the link, how to draw a QR code, and the prefill choices.\n */\nexport function ShareDialog({\n open,\n onOpenChange,\n noun = \"page\",\n title = `Share your ${noun}`,\n description = \"Anyone with the link can open it.\",\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 /** Default \"Share your {noun}\". */\n title?: string | undefined;\n /** Default \"Anyone with the link can open it.\" */\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: \"page\" (default), \"form\", \"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"]}
@@ -15,8 +15,8 @@ import { UndoableWrite, WizardStep } from '@marktiderman/genesis-core/hooks';
15
15
  import { ResourceFormFieldDef } from '@marktiderman/genesis-core';
16
16
  export { FieldType, ResourceFormFieldDef, SelectOption } from '@marktiderman/genesis-core';
17
17
  import { Control, UseFormReturn, FieldErrors } from 'react-hook-form';
18
- import { A as AppShell$1 } from '../../AppShell-HCXpi6nv.js';
19
- export { a as AppShellOptions, c as AppShellProps, N as NavItem, P as ParentNavigation } from '../../AppShell-HCXpi6nv.js';
18
+ import { A as AppShell$1 } from '../../AppShell-C88Uj7kT.js';
19
+ export { a as AppShellOptions, c as AppShellProps, N as NavItem, P as ParentNavigation } from '../../AppShell-C88Uj7kT.js';
20
20
  import { P as PageHeader$1 } from '../../PageHeader-V9lVkZtF.js';
21
21
  export { a as PageHeaderOptions, b as PageHeaderProps } from '../../PageHeader-V9lVkZtF.js';
22
22
  export { Density } from '../../hooks/use-view-settings.js';
@@ -1,17 +1,19 @@
1
1
  "use client";
2
- import { AppShell, PageHeader } from '../../chunk-5OFA2CQR.js';
2
+ import { AppShell, PageHeader } from '../../chunk-C2IPSMNE.js';
3
3
  export { ViewSettings, ViewToggle } from '../../chunk-46TZGMFW.js';
4
4
  import { slots_exports } from '../../chunk-WALJMVEF.js';
5
5
  import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from '../../chunk-N2ZFNOOT.js';
6
- import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from '../../chunk-XCGZPFT7.js';
7
6
  import { Progress } from '../../chunk-W5Y3LG5K.js';
7
+ import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from '../../chunk-XCGZPFT7.js';
8
8
  import { Card, CardContent, CardHeader, CardTitle } from '../../chunk-FN3FZVUR.js';
9
9
  import { Checkbox } from '../../chunk-SEBU6JCK.js';
10
+ import { AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction } from '../../chunk-4C4ESW6O.js';
10
11
  import { Textarea } from '../../chunk-YETMISCE.js';
11
12
  import { Separator } from '../../chunk-SXSCHWZU.js';
12
13
  import { Skeleton } from '../../chunk-QFM4Z2SS.js';
13
14
  import { Input } from '../../chunk-QSXVL5UB.js';
14
- import { AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction } from '../../chunk-4C4ESW6O.js';
15
+ import { EmptyState } from '../../chunk-65SPT7EA.js';
16
+ export { EmptyState } from '../../chunk-65SPT7EA.js';
15
17
  import { PageLoading } from '../../chunk-YRYQXU3G.js';
16
18
  import { Spinner } from '../../chunk-OVU3Z2MT.js';
17
19
  import { useAnnouncer } from '../../chunk-I4NBE2KL.js';
@@ -21,15 +23,13 @@ import { Badge } from '../../chunk-NPNADZHM.js';
21
23
  import '../../chunk-G5YKBPBF.js';
22
24
  import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '../../chunk-FK42ZGGV.js';
23
25
  import { Popover, PopoverTrigger, PopoverContent } from '../../chunk-22XB3Q6H.js';
26
+ import { Button } from '../../chunk-NWSCYLPT.js';
24
27
  import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuCheckboxItem, DropdownMenuSeparator, DropdownMenuItem, DropdownMenuLabel } from '../../chunk-QJ6P2DW6.js';
25
28
  import { Switch } from '../../chunk-27ELYTGE.js';
26
29
  import '../../chunk-F47U5KNW.js';
27
30
  import { DetailPage } from '../../chunk-AFZ76Q26.js';
28
31
  import '../../chunk-D2LIXA2Y.js';
29
32
  import '../../chunk-AVFZ4P4B.js';
30
- import { EmptyState } from '../../chunk-65SPT7EA.js';
31
- export { EmptyState } from '../../chunk-65SPT7EA.js';
32
- import { Button } from '../../chunk-NWSCYLPT.js';
33
33
  import { showUndoToast, showWriteErrorToast, useResourceTableModel } from '../../chunk-STZVZUYO.js';
34
34
  export { showUndoToast, showWriteErrorToast, useResourceTable } from '../../chunk-STZVZUYO.js';
35
35
  import { titleCase } from '../../chunk-RKPS7ERS.js';
@@ -0,0 +1,96 @@
1
+ import * as React from 'react';
2
+
3
+ /**
4
+ * Props passed through to one slot's wrapper element: a class, a test id,
5
+ * any `data-*` or ARIA attribute.
6
+ */
7
+ type BuilderLayoutSlotProps = React.HTMLAttributes<HTMLElement> & {
8
+ [attribute: `data-${string}`]: string | undefined;
9
+ };
10
+ interface BuilderLayoutProps extends React.HTMLAttributes<HTMLDivElement> {
11
+ /**
12
+ * Left column: the list of things being built (questions, lessons, steps).
13
+ * Optional. Rendered as a `<nav>` when `outlineLabel` is set.
14
+ */
15
+ outline?: React.ReactNode;
16
+ /** Centre column: the editor for the selected thing. Required. */
17
+ editor: React.ReactNode;
18
+ /**
19
+ * Right column: a live preview (and anything that sits with it, such as
20
+ * checks). Optional. Rendered as an `<aside>` when `previewLabel` is set.
21
+ *
22
+ * It keeps its place in the tree whatever `editor` and `outline` hold, so
23
+ * swapping the editor (another section, another selected item) never
24
+ * remounts it: the preview's own state (device, answers typed into it,
25
+ * scroll) survives.
26
+ */
27
+ preview?: React.ReactNode;
28
+ /** Accessible name for the outline; makes it a `navigation` landmark. */
29
+ outlineLabel?: string | undefined;
30
+ /** Accessible name for the preview; makes it a `complementary` landmark. */
31
+ previewLabel?: string | undefined;
32
+ /**
33
+ * Keep the preview mounted but hidden, and give its width back to the
34
+ * editor. For a section that needs the whole width (a host's own
35
+ * settings layout) without losing the preview's state.
36
+ */
37
+ previewHidden?: boolean | undefined;
38
+ /**
39
+ * Pin the outline and/or the preview at the top while the editor scrolls,
40
+ * once each sits in a column of its own (not while stacked). `true` pins
41
+ * both. Default `false`.
42
+ */
43
+ sticky?: boolean | {
44
+ outline?: boolean | undefined;
45
+ preview?: boolean | undefined;
46
+ } | undefined;
47
+ /**
48
+ * With `sticky`, cap each pinned column at the viewport height and let it
49
+ * scroll on its own, so a long outline or preview stays reachable.
50
+ * Default `false`.
51
+ */
52
+ scrollSticky?: boolean | undefined;
53
+ /** Props for the outline's wrapper (class, test id, data attributes). */
54
+ outlineProps?: BuilderLayoutSlotProps | undefined;
55
+ /** Props for the editor's wrapper. */
56
+ editorProps?: BuilderLayoutSlotProps | undefined;
57
+ /** Props for the preview's wrapper. */
58
+ previewProps?: BuilderLayoutSlotProps | undefined;
59
+ }
60
+ /**
61
+ * BuilderLayout — the three columns of a builder: an outline of the parts on
62
+ * the left, the editor for the selected part in the centre, a live preview
63
+ * on the right.
64
+ *
65
+ * ```tsx
66
+ * <BuilderLayout
67
+ * outline={<QuestionList />}
68
+ * outlineLabel="Outline"
69
+ * editor={<QuestionEditor key={selectedId} />}
70
+ * preview={<LivePreview />}
71
+ * previewLabel="Preview"
72
+ * sticky
73
+ * />
74
+ * ```
75
+ *
76
+ * Responsive by container query, so it needs no knowledge of the page around
77
+ * it: all three columns from a 56rem container, wider side columns from
78
+ * 76rem, the preview under the editor below 56rem and everything stacked
79
+ * below 34rem (see `GRID` for each slot combination). The preview keeps its
80
+ * place in the tree when the editor or outline changes, so it never
81
+ * remounts; changing `previewLabel` between set and unset does remount it
82
+ * (the element changes from `<div>` to `<aside>`).
83
+ *
84
+ * It positions the three parts and nothing else. It does **not** own tabs,
85
+ * the app rail or a page header: those belong to the shell. Put a builder's
86
+ * sections in `useAppShellSubNav` (or your own tabs inside `editor`) and its
87
+ * title, status and actions in `AppShellPageHeader`. To keep one preview
88
+ * across sections, render one `BuilderLayout` around the sections and swap
89
+ * `editor`; nest a second one (outline and editor only) inside a section
90
+ * that has an outline.
91
+ *
92
+ * @stability Beta
93
+ */
94
+ declare const BuilderLayout: React.ForwardRefExoticComponent<BuilderLayoutProps & React.RefAttributes<HTMLDivElement>>;
95
+
96
+ export { BuilderLayout, type BuilderLayoutProps, type BuilderLayoutSlotProps };
@@ -0,0 +1,5 @@
1
+ export { BuilderLayout } from '../../chunk-TP6QNFDG.js';
2
+ import '../../chunk-NZ5WBA4R.js';
3
+ import '../../chunk-424PT5DM.js';
4
+ //# sourceMappingURL=builder-layout.js.map
5
+ //# sourceMappingURL=builder-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"builder-layout.js"}