@nibblearn/react 0.0.0-stage → 0.1.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,"file":"index.js","names":["useMotionReducedMotion","_Fragment","Tag","EASE","_Fragment","EASE","LETTERS","COLOR_TOKENS","Zone","Chip","FLOAT_BREAKPOINT","_Fragment","LETTERS","OutcomeIcon","initials","Map","INTERACT_DEBOUNCE_MS","COUNT_UP_MS","decimalsOf","pctOf","AnimatedNumber","_Fragment","TRAY_ID","Tray","_Fragment"],"sources":["../src/registry.tsx","../src/context/NibblearnProvider.tsx","../src/hooks/useModuleLifecycle.ts","../src/hooks/useReducedMotion.ts","../src/hooks/useAnnounce.ts","../src/primitives/Button.tsx","../src/primitives/ProgressBar.tsx","../src/primitives/RichText.tsx","../src/primitives/OptionCard.tsx","../src/primitives/Feedback.tsx","../src/primitives/SafeImage.tsx","../src/primitives/CompletionCard.tsx","../src/primitives/LiveRegion.tsx","../src/primitives/ModuleShell.tsx","../src/modules/story-cards/StoryCards.tsx","../src/primitives/Badge.tsx","../src/primitives/Hint.tsx","../src/modules/flashcards/Flashcards.tsx","../src/primitives/Explanation.tsx","../src/modules/choice-challenge/ChoiceChallenge.tsx","../src/modules/true-false/TrueFalse.tsx","../src/modules/match-pairs/MatchPairs.tsx","../src/modules/sequence-builder/SequenceBuilder.tsx","../src/modules/category-sort/CategorySort.tsx","../src/modules/fill-blanks/FillBlanks.tsx","../src/modules/hotspot-explorer/HotspotExplorer.tsx","../src/modules/screenshot-walkthrough/ScreenshotWalkthrough.tsx","../src/modules/branching-scenario/BranchingScenario.tsx","../src/modules/conversation/Conversation.tsx","../src/primitives/icons.ts","../src/modules/process-explorer/ProcessExplorer.tsx","../src/modules/spot-the-mistake/SpotTheMistake.tsx","../src/modules/what-if-simulator/WhatIfSimulator.tsx","../src/modules/budget-allocator/BudgetAllocator.tsx","../src/modules/estimate/Estimate.tsx","../src/modules/label-diagram/LabelDiagram.tsx","../src/modules/image-compare/ImageCompare.tsx","../src/modules/word-builder/WordBuilder.tsx","../src/modules/priority-matrix/PriorityMatrix.tsx","../src/modules/inbox-triage/InboxTriage.tsx","../src/defaultRegistry.ts","../src/hooks/useMediaQuery.ts","../src/primitives/Card.tsx","../src/ModuleRenderer.tsx","../src/player/Confetti.tsx","../src/player/LessonPlayer.tsx"],"sourcesContent":["import type { ComponentType, LazyExoticComponent } from \"react\";\nimport { lazy } from \"react\";\nimport {\n builtInModuleDefinitions,\n SchemaRegistry,\n type ModuleCategory,\n type ModuleSchemaDefinition,\n} from \"@nibblearn/core\";\nimport type { z } from \"zod\";\nimport type { ModuleComponent, ModuleProps } from \"./modules/types\";\n\nexport interface ModuleDefinition<\n S extends z.ZodType = z.ZodType,\n> extends ModuleSchemaDefinition<S> {\n /** The React component rendering this module. */\n component?: ModuleComponent<z.infer<S>>;\n /** Lazy loader alternative to `component` (code-splitting). */\n load?: () => Promise<{ default: ModuleComponent<z.infer<S>> }>;\n}\n\n/**\n * A definition for any module type. Each definition is internally consistent (its component\n * takes the config its schema produces); the registry only needs to store them side by side.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- heterogeneous list of typed definitions\nexport type AnyModuleDefinition = ModuleDefinition<any>;\n\n/**\n * Registry of module definitions (schema + component). The LessonPlayer and\n * `ModuleRenderer` resolve module types through it. Register custom modules\n * with `register()`.\n */\nexport class ModuleRegistry {\n private readonly defs = new Map<string, ModuleDefinition>();\n private readonly lazies = new Map<\n string,\n LazyExoticComponent<ComponentType<ModuleProps<unknown>>>\n >();\n readonly schemas: SchemaRegistry;\n\n constructor(definitions: readonly AnyModuleDefinition[] = []) {\n this.schemas = new SchemaRegistry([]);\n for (const d of definitions) this.register(d);\n }\n\n register<S extends z.ZodType>(definition: ModuleDefinition<S>): this {\n this.defs.set(definition.type, definition as unknown as ModuleDefinition);\n this.schemas.register(definition);\n this.lazies.delete(definition.type);\n if (!definition.component && definition.load) {\n const load = definition.load;\n this.lazies.set(\n definition.type,\n lazy(() => load() as Promise<{ default: ComponentType<ModuleProps<unknown>> }>),\n );\n }\n return this;\n }\n\n get(type: string): ModuleDefinition | undefined {\n return this.defs.get(type);\n }\n\n has(type: string): boolean {\n return this.defs.has(type);\n }\n\n list(): ModuleDefinition[] {\n return [...this.defs.values()];\n }\n\n byCategory(category: ModuleCategory): ModuleDefinition[] {\n return this.list().filter((d) => d.category === category);\n }\n\n /** Resolve the component for a type (lazy definitions are wrapped in React.lazy). */\n component(type: string): ComponentType<ModuleProps<unknown>> | undefined {\n const def = this.defs.get(type);\n if (!def) return undefined;\n if (def.component) return def.component as ComponentType<ModuleProps<unknown>>;\n return this.lazies.get(type);\n }\n}\n\nexport { builtInModuleDefinitions };\n","import { createContext, useContext, useMemo, type CSSProperties, type ReactNode } from \"react\";\nimport {\n createTranslator,\n resolveMessages,\n type EventHandler,\n type NibblearnEvent,\n type NibblearnEventType,\n type Messages,\n type Translator,\n} from \"@nibblearn/core\";\nimport { MotionConfig } from \"motion/react\";\n\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\n\nexport interface NibblearnConfig {\n /** UI locale (BCP-47). English is built in; provide other languages via `messages`. */\n locale: string;\n messages: Messages;\n t: Translator;\n theme: ThemeMode;\n /** Force reduced motion regardless of OS preference. */\n reducedMotion: boolean;\n /** Emit a Nibblearn event to all registered handlers. */\n emit: (type: NibblearnEventType, data?: Omit<NibblearnEvent, \"type\" | \"timestamp\">) => void;\n}\n\nconst defaultConfig: NibblearnConfig = {\n locale: \"en\",\n messages: resolveMessages(\"en\"),\n t: createTranslator(resolveMessages(\"en\")),\n theme: \"system\",\n reducedMotion: false,\n emit: () => {},\n};\n\nconst NibblearnContext = createContext<NibblearnConfig>(defaultConfig);\n\nexport interface NibblearnProviderProps {\n children: ReactNode;\n /** UI locale, default \"en\". */\n locale?: string;\n /** Override or extend UI strings. */\n messages?: Partial<Messages>;\n /** \"light\" | \"dark\" | \"system\" (default). */\n theme?: ThemeMode;\n /** Accent color override (any CSS color). */\n accent?: string;\n /** Base corner radius in px. */\n radius?: number;\n /** Font family override. */\n fontFamily?: string;\n /** Force reduced motion. Defaults to the OS preference. */\n reducedMotion?: boolean;\n /** Receives every Nibblearn event. */\n onEvent?: EventHandler;\n /** Extra CSS class for the root element. */\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Optional provider for locale, theme and events. Modules work without it;\n * use it when you want shared settings for many modules or a LessonPlayer.\n */\nexport function NibblearnProvider({\n children,\n locale = \"en\",\n messages: overrides,\n theme = \"system\",\n accent,\n radius,\n fontFamily,\n reducedMotion = false,\n onEvent,\n className,\n style,\n}: NibblearnProviderProps) {\n const value = useMemo<NibblearnConfig>(() => {\n const messages = resolveMessages(locale, overrides);\n return {\n locale,\n messages,\n t: createTranslator(messages),\n theme,\n reducedMotion,\n emit: (type, data) => {\n onEvent?.({ type, timestamp: new Date().toISOString(), ...data });\n },\n };\n }, [locale, overrides, theme, reducedMotion, onEvent]);\n\n const rootStyle = useMemo(() => {\n const s: Record<string, string> & CSSProperties = { ...(style as Record<string, string>) };\n if (accent) s[\"--nb-accent\"] = accent;\n if (typeof radius === \"number\") {\n s[\"--nb-radius-sm\"] = `${Math.max(0, radius - 4)}px`;\n s[\"--nb-radius-md\"] = `${radius}px`;\n s[\"--nb-radius-lg\"] = `${radius + 4}px`;\n s[\"--nb-radius-xl\"] = `${radius + 12}px`;\n }\n if (fontFamily) s[\"--nb-font\"] = fontFamily;\n return s;\n }, [accent, radius, fontFamily, style]);\n\n return (\n <NibblearnContext.Provider value={value}>\n <MotionConfig reducedMotion={reducedMotion ? \"always\" : \"user\"}>\n <div\n className={[\"nb-root\", \"nb-provider\", className].filter(Boolean).join(\" \")}\n data-nb-theme={theme}\n data-nb-motion={reducedMotion ? \"reduced\" : undefined}\n style={rootStyle}\n >\n {children}\n </div>\n </MotionConfig>\n </NibblearnContext.Provider>\n );\n}\n\nexport function useNibblearn(): NibblearnConfig {\n return useContext(NibblearnContext);\n}\n\n/** Translate a message key with placeholders. */\nexport function useTranslator(): Translator {\n return useContext(NibblearnContext).t;\n}\n\nexport const NibblearnContextInternal = NibblearnContext;\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { NibblearnEvent, NibblearnEventType, ModuleResult } from \"@nibblearn/core\";\nimport { useNibblearn } from \"../context/NibblearnProvider\";\n\nexport interface ModuleLifecycleOptions {\n moduleId: string;\n moduleType: string;\n onComplete?: (result: ModuleResult) => void;\n onEvent?: (event: NibblearnEvent) => void;\n /** Changing this value resets the module (used by LessonPlayer / demos). */\n resetKey?: unknown;\n}\n\nexport interface ModuleLifecycle {\n /** Emit an event scoped to this module. */\n emit: (type: NibblearnEventType, payload?: Record<string, unknown>) => void;\n /** Mark the module complete. Safe to call once per run; subsequent calls are ignored until reset. */\n complete: (\n partial?: Partial<Omit<ModuleResult, \"moduleId\" | \"moduleType\" | \"status\" | \"completedAt\">>,\n ) => ModuleResult | null;\n /** Register an attempt (e.g. a check). */\n attempt: () => number;\n attempts: number;\n completed: boolean;\n result: ModuleResult | null;\n /** Increment to force a reset from inside the module. */\n runId: number;\n reset: () => void;\n elapsedMs: () => number;\n}\n\n/**\n * Shared lifecycle for every module: start/complete/reset events, attempts, timing.\n */\nexport function useModuleLifecycle({\n moduleId,\n moduleType,\n onComplete,\n onEvent,\n resetKey,\n}: ModuleLifecycleOptions): ModuleLifecycle {\n const ctx = useNibblearn();\n const startedAt = useRef<number>(Date.now());\n const [attempts, setAttempts] = useState(0);\n const attemptsRef = useRef(0);\n const [result, setResult] = useState<ModuleResult | null>(null);\n const resultRef = useRef<ModuleResult | null>(null);\n const [runId, setRunId] = useState(0);\n const firstRender = useRef(true);\n const onEventRef = useRef(onEvent);\n const onCompleteRef = useRef(onComplete);\n onEventRef.current = onEvent;\n onCompleteRef.current = onComplete;\n\n const emit = useCallback(\n (type: NibblearnEventType, payload?: Record<string, unknown>) => {\n const data = { moduleId, moduleType, payload };\n ctx.emit(type, data);\n onEventRef.current?.({ type, timestamp: new Date().toISOString(), ...data });\n },\n [ctx, moduleId, moduleType],\n );\n\n const reset = useCallback(() => {\n startedAt.current = Date.now();\n attemptsRef.current = 0;\n resultRef.current = null;\n setAttempts(0);\n setResult(null);\n setRunId((r) => r + 1);\n }, []);\n\n // Emit start on mount and on every reset.\n useEffect(() => {\n emit(\"module:start\");\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runId]);\n\n // External reset key.\n useEffect(() => {\n if (firstRender.current) {\n firstRender.current = false;\n return;\n }\n reset();\n emit(\"module:reset\");\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [resetKey]);\n\n const elapsedMs = useCallback(() => Date.now() - startedAt.current, []);\n\n const attempt = useCallback(() => {\n attemptsRef.current += 1;\n setAttempts(attemptsRef.current);\n return attemptsRef.current;\n }, []);\n\n const complete = useCallback<ModuleLifecycle[\"complete\"]>(\n (partial = {}) => {\n if (resultRef.current) return null;\n const res: ModuleResult = {\n moduleId,\n moduleType,\n status: \"completed\",\n attempts: Math.max(attemptsRef.current, partial.attempts ?? 0),\n durationMs: Date.now() - startedAt.current,\n completedAt: new Date().toISOString(),\n ...partial,\n };\n resultRef.current = res;\n setResult(res);\n emit(\"module:complete\", {\n score: res.score,\n correct: res.correct,\n total: res.total,\n attempts: res.attempts,\n });\n onCompleteRef.current?.(res);\n return res;\n },\n [emit, moduleId, moduleType],\n );\n\n return useMemo(\n () => ({\n emit,\n complete,\n attempt,\n attempts,\n completed: result !== null,\n result,\n runId,\n reset,\n elapsedMs,\n }),\n [emit, complete, attempt, attempts, result, runId, reset, elapsedMs],\n );\n}\n","import { useReducedMotion as useMotionReducedMotion } from \"motion/react\";\nimport { useNibblearn } from \"../context/NibblearnProvider\";\n\n/** True when animations should be minimised (OS preference or provider override). */\nexport function useReducedMotion(): boolean {\n const os = useMotionReducedMotion();\n const { reducedMotion } = useNibblearn();\n return Boolean(reducedMotion || os);\n}\n","import { useCallback, useRef, useState } from \"react\";\n\n/**\n * Screen-reader announcements through a polite live region.\n * Render `<LiveRegion message={message} />` somewhere in the module.\n */\nexport function useAnnounce() {\n const [message, setMessage] = useState(\"\");\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const announce = useCallback((text: string) => {\n // Clear first so that identical consecutive messages are re-announced.\n setMessage(\"\");\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setMessage(text), 30);\n }, []);\n return { message, announce };\n}\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from \"react\";\nimport clsx from \"clsx\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: \"primary\" | \"secondary\" | \"soft\" | \"ghost\" | \"success\" | \"danger\";\n size?: \"sm\" | \"md\" | \"lg\";\n block?: boolean;\n /** Icon-only round button. Provide an aria-label. */\n icon?: boolean;\n leading?: ReactNode;\n trailing?: ReactNode;\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant = \"secondary\",\n size = \"md\",\n block,\n icon,\n leading,\n trailing,\n className,\n children,\n type = \"button\",\n ...rest\n },\n ref,\n) {\n return (\n <button\n ref={ref}\n type={type}\n className={clsx(\n \"nb-btn\",\n `nb-btn--${variant}`,\n size !== \"md\" && `nb-btn--${size}`,\n block && \"nb-btn--block\",\n icon && \"nb-btn--icon\",\n className,\n )}\n {...rest}\n >\n {leading}\n {children}\n {trailing}\n </button>\n );\n});\n","import clsx from \"clsx\";\nimport { useTranslator } from \"../context/NibblearnProvider\";\n\nexport interface ProgressBarProps {\n /** 0–1 */\n value: number;\n label?: string;\n showLabel?: boolean;\n size?: \"sm\" | \"md\";\n tone?: \"accent\" | \"success\";\n className?: string;\n}\n\nexport function ProgressBar({\n value,\n label,\n showLabel = true,\n size = \"md\",\n tone = \"accent\",\n className,\n}: ProgressBarProps) {\n const t = useTranslator();\n const pct = Math.round(Math.max(0, Math.min(1, value)) * 100);\n return (\n <div\n className={clsx(\n \"nb-progress\",\n size === \"sm\" && \"nb-progress--sm\",\n tone === \"success\" && \"nb-progress--success\",\n className,\n )}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={pct}\n aria-label={label ?? t(\"common.progress\")}\n >\n <div className=\"nb-progress__track\">\n <div className=\"nb-progress__bar\" style={{ [\"--_w\" as string]: `${pct}%` }} />\n </div>\n {showLabel && <span className=\"nb-progress__label\">{pct}%</span>}\n </div>\n );\n}\n\nexport interface StepDotsProps {\n total: number;\n current: number;\n className?: string;\n label?: string;\n}\n\nexport function StepDots({ total, current, className, label }: StepDotsProps) {\n const t = useTranslator();\n return (\n <div\n className={clsx(\"nb-dots\", className)}\n role=\"img\"\n aria-label={label ?? t(\"common.step\", { current: current + 1, total })}\n >\n {Array.from({ length: total }, (_, i) => (\n <span\n key={i}\n className=\"nb-dots__dot\"\n data-state={i === current ? \"active\" : i < current ? \"done\" : \"todo\"}\n />\n ))}\n </div>\n );\n}\n","import { Fragment, useMemo } from \"react\";\nimport { parseInlineMarkup, splitParagraphs } from \"@nibblearn/core\";\nimport clsx from \"clsx\";\n\nexport interface RichTextProps {\n /** Text with optional **bold**, *italic*, `code` and line breaks. Blank lines create paragraphs. */\n text: string;\n /** Render as paragraphs (blank-line separated). Default: inline. */\n paragraphs?: boolean;\n className?: string;\n as?: \"span\" | \"div\" | \"p\";\n}\n\nfunction Inline({ text }: { text: string }) {\n const tokens = useMemo(() => parseInlineMarkup(text), [text]);\n return (\n <>\n {tokens.map((tk, i) => {\n switch (tk.kind) {\n case \"bold\":\n return <strong key={i}>{tk.value}</strong>;\n case \"italic\":\n return <em key={i}>{tk.value}</em>;\n case \"code\":\n return <code key={i}>{tk.value}</code>;\n case \"break\":\n return <br key={i} />;\n default:\n return <Fragment key={i}>{tk.value}</Fragment>;\n }\n })}\n </>\n );\n}\n\n/** Safe rich text: never injects HTML. */\nexport function RichText({ text, paragraphs = false, className, as = \"span\" }: RichTextProps) {\n if (paragraphs) {\n const paras = splitParagraphs(text);\n return (\n <div className={clsx(\"nb-rich\", className)}>\n {paras.map((p, i) => (\n <p key={i}>\n <Inline text={p} />\n </p>\n ))}\n </div>\n );\n }\n const Tag = as;\n return (\n <Tag className={clsx(\"nb-rich\", className)}>\n <Inline text={text} />\n </Tag>\n );\n}\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from \"react\";\nimport clsx from \"clsx\";\nimport { Check, X } from \"lucide-react\";\nimport { RichText } from \"./RichText\";\nimport type { Media } from \"@nibblearn/core\";\n\nexport type OptionState = \"idle\" | \"selected\" | \"correct\" | \"incorrect\" | \"missed\";\n\nexport interface OptionCardProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> {\n text: string;\n state?: OptionState;\n /** Keyboard shortcut label (e.g. \"A\"). */\n shortcut?: string;\n image?: Media;\n explanation?: string;\n /** For multiple choice: render a checkbox-like key. */\n multiple?: boolean;\n children?: ReactNode;\n}\n\n/** Large tactile answer card used by choice-style modules. */\nexport const OptionCard = forwardRef<HTMLButtonElement, OptionCardProps>(function OptionCard(\n { text, state = \"idle\", shortcut, image, explanation, multiple, className, children, ...rest },\n ref,\n) {\n const showMark = state === \"correct\" || state === \"incorrect\" || state === \"missed\";\n const role = multiple ? \"checkbox\" : \"radio\";\n return (\n <button\n ref={ref}\n type=\"button\"\n role={role}\n aria-checked={\n state === \"selected\" || state === \"correct\" || state === \"incorrect\" ? true : false\n }\n className={clsx(\"nb-option\", image && \"nb-option--with-image\", className)}\n data-state={state}\n {...rest}\n >\n {shortcut && (\n <span className=\"nb-option__key\" aria-hidden>\n {state === \"selected\" && multiple ? <Check strokeWidth={3} /> : shortcut}\n </span>\n )}\n {image && (\n <img className=\"nb-option__image\" src={image.src} alt={image.alt} draggable={false} />\n )}\n <span className=\"nb-option__text\">\n <RichText text={text} />\n </span>\n {children}\n {showMark && (\n <span className=\"nb-option__mark\" aria-hidden>\n {state === \"incorrect\" ? <X strokeWidth={3} /> : <Check strokeWidth={3} />}\n </span>\n )}\n {explanation && showMark && (\n <span className=\"nb-option__explanation\">\n <RichText text={explanation} />\n </span>\n )}\n </button>\n );\n});\n","import { type ReactNode } from \"react\";\nimport clsx from \"clsx\";\nimport { Check, Info, Lightbulb, Sparkles, X } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { RichText } from \"./RichText\";\nimport { useReducedMotion } from \"../hooks/useReducedMotion\";\n\nexport type FeedbackTone = \"correct\" | \"incorrect\" | \"partial\" | \"info\" | \"neutral\";\n\nexport interface FeedbackProps {\n tone: FeedbackTone;\n title?: ReactNode;\n /** Supports inline markup. */\n text?: string;\n children?: ReactNode;\n className?: string;\n /** Rendered as a live region so screen readers announce it. */\n live?: boolean;\n}\n\nconst icons: Record<FeedbackTone, ReactNode> = {\n correct: <Check aria-hidden strokeWidth={3} />,\n incorrect: <X aria-hidden strokeWidth={3} />,\n partial: <Sparkles aria-hidden />,\n info: <Info aria-hidden />,\n neutral: <Lightbulb aria-hidden />,\n};\n\nexport function Feedback({ tone, title, text, children, className, live = true }: FeedbackProps) {\n return (\n <div\n className={clsx(\"nb-feedback\", `nb-feedback--${tone}`, className)}\n role={live ? \"status\" : undefined}\n aria-live={live ? \"polite\" : undefined}\n >\n <div className=\"nb-feedback__icon\">{icons[tone]}</div>\n <div className=\"nb-feedback__body\">\n {title && <div className=\"nb-feedback__title\">{title}</div>}\n {text && (\n <div className=\"nb-feedback__text\">\n <RichText text={text} />\n </div>\n )}\n {children && <div className=\"nb-feedback__text\">{children}</div>}\n </div>\n </div>\n );\n}\n\n/** Feedback that animates in/out. Pass `null`/`undefined` props.tone to hide. */\nexport function AnimatedFeedback({ show, ...props }: FeedbackProps & { show: boolean }) {\n const reduced = useReducedMotion();\n return (\n <AnimatePresence initial={false}>\n {show && (\n <motion.div\n key={props.tone}\n initial={reduced ? false : { opacity: 0, y: 8, scale: 0.98 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={reduced ? { opacity: 0 } : { opacity: 0, y: -4, scale: 0.98 }}\n transition={{ duration: reduced ? 0 : 0.22, ease: [0.2, 0.8, 0.2, 1] }}\n >\n <Feedback {...props} />\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n","import { useState, type CSSProperties, type ImgHTMLAttributes } from \"react\";\nimport clsx from \"clsx\";\nimport { ImageOff } from \"lucide-react\";\nimport type { Media } from \"@nibblearn/core\";\nimport { useTranslator } from \"../context/NibblearnProvider\";\n\nexport interface SafeImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\" | \"alt\"> {\n media: Media;\n className?: string;\n /** Called when the image loads (with natural size). */\n onLoaded?: (size: { width: number; height: number }) => void;\n rounded?: boolean;\n showCaption?: boolean;\n style?: CSSProperties;\n}\n\n/** Image with graceful fallback when the asset is missing or blocked. */\nexport function SafeImage({\n media,\n className,\n onLoaded,\n rounded = true,\n showCaption = true,\n style,\n ...rest\n}: SafeImageProps) {\n const t = useTranslator();\n const [failed, setFailed] = useState(false);\n const [prevSrc, setPrevSrc] = useState(media.src);\n if (prevSrc !== media.src) {\n setPrevSrc(media.src);\n setFailed(false);\n }\n return (\n <figure className={clsx(\"nb-image\", !rounded && \"nb-image--square\", className)} style={style}>\n {failed ? (\n <div\n className=\"nb-image--fallback\"\n role=\"img\"\n aria-label={media.alt || t(\"common.imageUnavailable\")}\n >\n <ImageOff aria-hidden size={18} />\n <span>{t(\"common.imageUnavailable\")}</span>\n </div>\n ) : (\n <img\n src={media.src}\n alt={media.alt}\n width={media.width}\n height={media.height}\n loading=\"lazy\"\n decoding=\"async\"\n draggable={false}\n onError={() => setFailed(true)}\n onLoad={(e) =>\n onLoaded?.({\n width: e.currentTarget.naturalWidth,\n height: e.currentTarget.naturalHeight,\n })\n }\n {...rest}\n />\n )}\n {showCaption && media.caption && (\n <figcaption className=\"nb-image__caption\">{media.caption}</figcaption>\n )}\n </figure>\n );\n}\n","import { type ReactNode, useEffect, useState } from \"react\";\nimport clsx from \"clsx\";\nimport { Check, RotateCcw } from \"lucide-react\";\nimport { motion } from \"motion/react\";\nimport { Button } from \"./Button\";\nimport { RichText } from \"./RichText\";\nimport { useTranslator } from \"../context/NibblearnProvider\";\nimport { useReducedMotion } from \"../hooks/useReducedMotion\";\n\nexport interface CompletionCardProps {\n title?: string;\n /** Supports inline markup. */\n text?: string;\n /** 0–1. When provided a score ring is shown. */\n score?: number;\n /** Threshold for the \"pass\" styling. */\n passThreshold?: number;\n stats?: { label: string; value: ReactNode }[];\n onRetry?: () => void;\n retryLabel?: string;\n /** Extra actions. */\n actions?: ReactNode;\n className?: string;\n children?: ReactNode;\n}\n\n/** Shared completion state used at the end of every module. */\nexport function CompletionCard({\n title,\n text,\n score,\n passThreshold = 0.7,\n stats,\n onRetry,\n retryLabel,\n actions,\n className,\n children,\n}: CompletionCardProps) {\n const t = useTranslator();\n const reduced = useReducedMotion();\n const hasScore = typeof score === \"number\";\n const pct = hasScore ? Math.round(Math.max(0, Math.min(1, score)) * 100) : 100;\n const pass = !hasScore || score >= passThreshold;\n const [drawn, setDrawn] = useState(reduced);\n useEffect(() => {\n const id = setTimeout(() => setDrawn(true), 60);\n return () => clearTimeout(id);\n }, []);\n const r = 48;\n const c = 2 * Math.PI * r;\n\n const heading = title ?? (pass ? t(\"common.wellDone\") : t(\"common.keepGoing\"));\n\n return (\n <motion.div\n className={clsx(\"nb-complete\", pass && \"nb-complete--pass\", className)}\n role=\"status\"\n initial={reduced ? false : { opacity: 0, scale: 0.96, y: 12 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n transition={{ type: \"spring\", stiffness: 260, damping: 24 }}\n >\n {hasScore ? (\n <div className=\"nb-complete__ring\" aria-label={t(\"common.scorePercent\", { percent: pct })}>\n <svg viewBox=\"0 0 112 112\" aria-hidden>\n <circle className=\"nb-ring-track\" cx=\"56\" cy=\"56\" r={r} />\n <circle\n className=\"nb-ring-value\"\n cx=\"56\"\n cy=\"56\"\n r={r}\n strokeDasharray={c}\n strokeDashoffset={drawn ? c * (1 - pct / 100) : c}\n />\n </svg>\n <div className=\"nb-complete__ring-label\">{pct}%</div>\n </div>\n ) : (\n <motion.div\n className=\"nb-complete__icon\"\n initial={reduced ? false : { scale: 0.85, rotate: -12, opacity: 0 }}\n animate={{ scale: 1, rotate: 0, opacity: 1 }}\n transition={{ type: \"spring\", stiffness: 300, damping: 16, delay: 0.1 }}\n >\n <Check aria-hidden strokeWidth={3} />\n </motion.div>\n )}\n <h3 className=\"nb-complete__title\">{heading}</h3>\n {text && (\n <p className=\"nb-complete__text\">\n <RichText text={text} />\n </p>\n )}\n {stats && stats.length > 0 && (\n <dl className=\"nb-complete__stats\">\n {stats.map((s) => (\n <div className=\"nb-stat\" key={s.label}>\n <dd className=\"nb-stat__value\">{s.value}</dd>\n <dt className=\"nb-stat__label\">{s.label}</dt>\n </div>\n ))}\n </dl>\n )}\n {children}\n {(onRetry || actions) && (\n <div className=\"nb-complete__actions\">\n {onRetry && (\n <Button variant=\"secondary\" onClick={onRetry} leading={<RotateCcw aria-hidden />}>\n {retryLabel ?? t(\"common.retry\")}\n </Button>\n )}\n {actions}\n </div>\n )}\n </motion.div>\n );\n}\n","/** Visually hidden polite live region for screen-reader announcements. */\nexport function LiveRegion({\n message,\n assertive = false,\n}: {\n message: string;\n assertive?: boolean;\n}) {\n return (\n <div\n className=\"nb-sr-only\"\n role=\"status\"\n aria-live={assertive ? \"assertive\" : \"polite\"}\n aria-atomic=\"true\"\n >\n {message}\n </div>\n );\n}\n\nexport function VisuallyHidden({ children }: { children: React.ReactNode }) {\n return <span className=\"nb-sr-only\">{children}</span>;\n}\n","import {\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport clsx from \"clsx\";\nimport { AlertTriangle } from \"lucide-react\";\nimport type { Appearance, ValidationIssue } from \"@nibblearn/core\";\nimport { useNibblearn } from \"../context/NibblearnProvider\";\nimport { RichText } from \"./RichText\";\nimport { LiveRegion } from \"./LiveRegion\";\n\nexport interface ModuleShellProps {\n /** Module type, used for data attributes and styling hooks. */\n type: string;\n id: string;\n title?: string;\n instructions?: string;\n /** Small label above the title, e.g. the module category. */\n eyebrow?: ReactNode;\n /** Right-aligned header content, e.g. a counter. */\n aside?: ReactNode;\n appearance?: Appearance;\n /** Width preset. */\n width?: \"default\" | \"wide\" | \"full\";\n children: ReactNode;\n footer?: ReactNode;\n className?: string;\n /** Live region message for screen readers. */\n announcement?: string;\n style?: CSSProperties;\n /** Keyboard handler attached to the module root (for shortcuts). */\n onKeyDown?: (e: ReactKeyboardEvent<HTMLElement>) => void;\n}\n\n/**\n * Common frame for every module: themed root, header, body, footer, live region.\n * Each module renders exactly one ModuleShell.\n */\nexport function ModuleShell({\n type,\n id,\n title,\n instructions,\n eyebrow,\n aside,\n appearance,\n width = \"default\",\n children,\n footer,\n className,\n announcement = \"\",\n style,\n onKeyDown,\n}: ModuleShellProps) {\n const { theme, reducedMotion } = useNibblearn();\n const rootStyle: Record<string, string> = { ...(style as Record<string, string>) };\n if (appearance?.accent) rootStyle[\"--nb-accent\"] = appearance.accent;\n const showHeader = !appearance?.hideHeader && (title || instructions || aside || eyebrow);\n return (\n <section\n className={clsx(\n \"nb-root nb-module\",\n `nb-module--${type}`,\n width !== \"default\" && `nb-module--${width}`,\n appearance?.compact && \"nb-module--compact\",\n className,\n )}\n data-nb-module={type}\n data-nb-module-id={id}\n data-nb-theme={theme}\n data-nb-motion={reducedMotion ? \"reduced\" : undefined}\n aria-labelledby={title ? `${id}-title` : undefined}\n style={rootStyle}\n onKeyDown={onKeyDown}\n >\n {showHeader && (\n <header className=\"nb-module__header\">\n {(eyebrow || aside) && (\n <div className=\"nb-row nb-row--between\">\n <div className=\"nb-module__eyebrow\">{eyebrow}</div>\n {aside}\n </div>\n )}\n {title && (\n <h2 className=\"nb-module__title\" id={`${id}-title`}>\n {title}\n </h2>\n )}\n {instructions && (\n <p className=\"nb-module__instructions\">\n <RichText text={instructions} />\n </p>\n )}\n </header>\n )}\n <div className=\"nb-module__body\">{children}</div>\n {footer && <footer className=\"nb-module__footer\">{footer}</footer>}\n <LiveRegion message={announcement} />\n </section>\n );\n}\n\n/** Rendered when a module receives an invalid configuration. */\nexport function InvalidModule({ issues, type }: { issues: ValidationIssue[]; type?: string }) {\n const { t, theme } = useNibblearn();\n return (\n <div className=\"nb-root nb-invalid\" role=\"alert\" data-nb-theme={theme}>\n <div className=\"nb-invalid__title\">\n <AlertTriangle aria-hidden size={18} />\n {t(\"common.invalidConfig\")}\n {type && <code>{type}</code>}\n </div>\n <ul className=\"nb-invalid__list\">\n {issues.slice(0, 8).map((i, idx) => (\n <li key={idx}>\n {i.path}: {i.message}\n </li>\n ))}\n </ul>\n </div>\n );\n}\n","import {\n useCallback,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n} from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { ArrowLeft, ArrowRight, Check, ChevronDown, Quote } from \"lucide-react\";\nimport {\n storyCardsSchema,\n splitParagraphs,\n type StoryCard,\n type StoryCardsConfig,\n} from \"@nibblearn/core\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Button } from \"../../primitives/Button\";\nimport { StepDots } from \"../../primitives/ProgressBar\";\nimport { OptionCard, type OptionState } from \"../../primitives/OptionCard\";\nimport { AnimatedFeedback } from \"../../primitives/Feedback\";\nimport { SafeImage } from \"../../primitives/SafeImage\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./story-cards.css\";\n\nexport type StoryCardsProps = ModuleProps<StoryCardsConfig>;\n\nconst EASE = [0.2, 0.8, 0.2, 1] as const;\n\nexport function StoryCards({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: StoryCardsProps) {\n const parsed = useMemo(() => storyCardsSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"story-cards\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <StoryCardsInner\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\n/** Owns the lifecycle; every reset remounts StoryCardsRun with fresh state (keyed by runId). */\nfunction StoryCardsInner(props: StoryCardsProps) {\n const { config, onComplete, onEvent, resetKey } = props;\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"story-cards\",\n onComplete,\n onEvent,\n resetKey,\n });\n return <StoryCardsRun key={life.runId} {...props} life={life} />;\n}\n\nfunction StoryCardsRun({\n life,\n config,\n hideHeader,\n className,\n}: StoryCardsProps & { life: ModuleLifecycle }) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { cards } = config.content;\n const { behavior } = config;\n\n const [index, setIndex] = useState(0);\n const [direction, setDirection] = useState<1 | -1>(1);\n /** cardIndex -> chosen option index */\n const [answers, setAnswers] = useState<Record<number, number>>({});\n const [finished, setFinished] = useState(false);\n /** Move focus onto the card once it has animated in (keyboard navigation). */\n const focusCard = useRef(false);\n const cardRef = useRef<HTMLElement | null>(null);\n\n const card = cards[index]!;\n const isLast = index + 1 >= cards.length;\n const answered = answers[index] !== undefined;\n const checkTotal = useMemo(() => cards.filter((c) => c.check).length, [cards]);\n const checkCorrect = useMemo(\n () =>\n cards.reduce(\n (n, c, i) =>\n c.check && answers[i] !== undefined && c.check.options[answers[i]!]?.correct ? n + 1 : n,\n 0,\n ),\n [cards, answers],\n );\n const nextBlocked = Boolean(behavior.requireChecks && card.check && !answered);\n\n const finish = useCallback(() => {\n setFinished(true);\n const details = {\n checks: { correct: checkCorrect, total: checkTotal },\n cardsViewed: cards.length,\n };\n if (checkTotal > 0) {\n life.complete({\n score: checkCorrect / checkTotal,\n correct: checkCorrect,\n total: checkTotal,\n details,\n });\n } else {\n life.complete({ details });\n }\n announce(t(\"a11y.moduleComplete\"));\n }, [checkCorrect, checkTotal, cards.length, life, announce, t]);\n\n const next = useCallback(() => {\n if (finished || nextBlocked) return;\n if (isLast) {\n finish();\n return;\n }\n setDirection(1);\n setIndex((i) => i + 1);\n focusCard.current = true;\n life.emit(\"module:interact\", { action: \"next\", cardIndex: index + 1 });\n }, [finished, nextBlocked, isLast, finish, life, index]);\n\n const back = useCallback(() => {\n if (finished || !behavior.allowBack || index === 0) return;\n setDirection(-1);\n setIndex((i) => i - 1);\n focusCard.current = true;\n life.emit(\"module:interact\", { action: \"back\", cardIndex: index - 1 });\n }, [finished, behavior.allowBack, index, life]);\n\n const answer = useCallback(\n (optionIndex: number) => {\n if (!card.check || answered) return;\n const correct = Boolean(card.check.options[optionIndex]?.correct);\n setAnswers((prev) => ({ ...prev, [index]: optionIndex }));\n life.attempt();\n life.emit(\"module:answer\", { cardIndex: index, optionIndex, correct });\n announce(correct ? t(\"a11y.correctAnswer\") : t(\"a11y.incorrectAnswer\"));\n },\n [card.check, answered, index, life, announce, t],\n );\n\n const onKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLElement>) => {\n if (finished) return;\n const target = e.target as HTMLElement | null;\n if (target && /^(INPUT|TEXTAREA|SELECT)$/.test(target.tagName)) return;\n if (e.key === \"ArrowRight\") {\n e.preventDefault();\n next();\n } else if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n back();\n }\n },\n [finished, next, back],\n );\n\n const restart = () => {\n life.reset();\n life.emit(\"module:reset\");\n };\n\n if (finished) {\n const hasChecks = checkTotal > 0;\n return (\n <ModuleShell\n type=\"story-cards\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n appearance={config.appearance}\n className={className}\n announcement={message}\n >\n <CompletionCard\n score={hasChecks ? checkCorrect / checkTotal : undefined}\n passThreshold={config.scoring.passThreshold}\n text={\n config.feedback.complete ??\n (hasChecks\n ? t(\"common.youGot\", { correct: checkCorrect, total: checkTotal })\n : undefined)\n }\n stats={[\n {\n label: t(\"common.completed\"),\n value: t(\"common.item\", { current: cards.length, total: cards.length }),\n },\n ...(hasChecks\n ? [{ label: t(\"common.correct\"), value: `${checkCorrect}/${checkTotal}` }]\n : []),\n ]}\n onRetry={restart}\n retryLabel={t(\"common.restart\")}\n />\n </ModuleShell>\n );\n }\n\n const variants = {\n enter: (dir: number) => (reduced ? { opacity: 0 } : { opacity: 0, x: dir * 56, scale: 0.98 }),\n center: { opacity: 1, x: 0, scale: 1 },\n exit: (dir: number) => (reduced ? { opacity: 0 } : { opacity: 0, x: dir * -56, scale: 0.98 }),\n };\n\n return (\n <ModuleShell\n type=\"story-cards\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : config.instructions}\n appearance={config.appearance}\n className={className}\n announcement={message}\n aside={\n behavior.showProgress && cards.length > 1 ? (\n <span className=\"nb-counter\">\n {t(\"story.card\", { current: index + 1, total: cards.length })}\n </span>\n ) : undefined\n }\n eyebrow={\n behavior.showProgress && cards.length > 1 ? (\n <StepDots\n total={cards.length}\n current={index}\n label={t(\"story.card\", { current: index + 1, total: cards.length })}\n />\n ) : undefined\n }\n onKeyDown={onKeyDown}\n >\n <div className=\"nb-story__stage\">\n <AnimatePresence mode=\"wait\" initial={false} custom={direction}>\n <motion.article\n key={`${life.runId}-${index}`}\n ref={cardRef}\n className=\"nb-story__card\"\n data-layout={card.layout}\n tabIndex={-1}\n onAnimationComplete={(def) => {\n if (def === \"center\" && focusCard.current) {\n focusCard.current = false;\n cardRef.current?.focus({ preventScroll: true });\n }\n }}\n custom={direction}\n variants={variants}\n initial=\"enter\"\n animate=\"center\"\n exit=\"exit\"\n transition={{ duration: reduced ? 0 : 0.28, ease: EASE }}\n aria-roledescription=\"card\"\n aria-label={card.title ?? t(\"story.card\", { current: index + 1, total: cards.length })}\n >\n <StoryCardBody\n card={card}\n cardIndex={index}\n reveal={behavior.progressiveReveal && !reduced}\n chosen={answers[index]}\n onAnswer={answer}\n onExpand={() => life.emit(\"module:interact\", { action: \"expand\", cardIndex: index })}\n />\n </motion.article>\n </AnimatePresence>\n </div>\n\n <div className=\"nb-story__nav\">\n {behavior.allowBack ? (\n <Button\n variant=\"ghost\"\n onClick={back}\n disabled={index === 0}\n leading={<ArrowLeft aria-hidden />}\n >\n {t(\"common.back\")}\n </Button>\n ) : (\n <span />\n )}\n {index === 0 && cards.length > 1 && (\n <span className=\"nb-story__hint nb-subtle nb-text-xs\">{t(\"story.swipeHint\")}</span>\n )}\n <Button\n variant=\"primary\"\n onClick={next}\n disabled={nextBlocked}\n trailing={isLast ? <Check aria-hidden strokeWidth={3} /> : <ArrowRight aria-hidden />}\n className=\"nb-story__next\"\n >\n {isLast ? t(\"story.lastCard\") : t(\"common.next\")}\n </Button>\n </div>\n </ModuleShell>\n );\n}\n\ninterface StoryCardBodyProps {\n card: StoryCard;\n cardIndex: number;\n reveal: boolean;\n chosen: number | undefined;\n onAnswer: (optionIndex: number) => void;\n onExpand: () => void;\n}\n\nfunction StoryCardBody({\n card,\n cardIndex,\n reveal,\n chosen,\n onAnswer,\n onExpand,\n}: StoryCardBodyProps) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n // The card is keyed by index, so this state is fresh for every card.\n const [expanded, setExpanded] = useState(false);\n\n const paragraphs = useMemo(() => (card.body ? splitParagraphs(card.body) : []), [card.body]);\n const baseDelay = card.layout === \"cover\" ? 0.18 : 0.08;\n const layout = card.layout;\n\n const para = (text: string, i: number, className?: string) => (\n <motion.p\n key={i}\n className={className}\n initial={reveal ? { opacity: 0, y: 10 } : false}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.32, ease: EASE, delay: baseDelay + i * 0.14 }}\n >\n <RichText text={text} />\n </motion.p>\n );\n\n const header = (\n <>\n {card.eyebrow && <div className=\"nb-story__eyebrow\">{card.eyebrow}</div>}\n {card.title && layout !== \"quote\" && <h3 className=\"nb-story__title\">{card.title}</h3>}\n </>\n );\n\n return (\n <>\n {layout === \"cover\" && (\n <div className=\"nb-story__hero\">\n {card.image ? (\n <SafeImage\n media={card.image}\n className=\"nb-story__hero-image\"\n rounded={false}\n showCaption={false}\n />\n ) : (\n <div className=\"nb-story__hero-fallback\" aria-hidden />\n )}\n <div className=\"nb-story__hero-overlay\">{header}</div>\n </div>\n )}\n {layout !== \"cover\" && card.image && (\n <SafeImage media={card.image} className=\"nb-story__image\" />\n )}\n\n <div className=\"nb-story__content\">\n {layout !== \"cover\" && layout !== \"quote\" && header}\n\n {layout === \"stat\" && card.stat && (\n <motion.div\n className=\"nb-story__stat\"\n initial={reveal ? { opacity: 0, scale: 0.85 } : false}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ type: \"spring\", stiffness: 260, damping: 20, delay: 0.05 }}\n >\n <div className=\"nb-story__stat-value\">{card.stat.value}</div>\n <div className=\"nb-story__stat-label\">{card.stat.label}</div>\n </motion.div>\n )}\n\n {layout === \"quote\" ? (\n <blockquote className=\"nb-story__quote\">\n <Quote aria-hidden className=\"nb-story__quote-mark\" />\n {card.eyebrow && <div className=\"nb-story__eyebrow\">{card.eyebrow}</div>}\n {paragraphs.map((p, i) => para(p, i, \"nb-story__quote-text\"))}\n {card.title && (\n <motion.footer\n className=\"nb-story__quote-cite\"\n initial={reveal ? { opacity: 0 } : false}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.3, delay: baseDelay + paragraphs.length * 0.14 }}\n >\n {card.title}\n </motion.footer>\n )}\n </blockquote>\n ) : (\n paragraphs.length > 0 && (\n <div className=\"nb-story__body\">{paragraphs.map((p, i) => para(p, i))}</div>\n )\n )}\n\n {card.expandable && (\n <div className=\"nb-story__expand\">\n <button\n type=\"button\"\n className=\"nb-story__expand-btn\"\n aria-expanded={expanded}\n onClick={() => {\n if (!expanded) onExpand();\n setExpanded((v) => !v);\n }}\n >\n <span>{expanded ? t(\"common.showLess\") : card.expandable.label}</span>\n <motion.span\n className=\"nb-story__expand-icon\"\n animate={{ rotate: expanded ? 180 : 0 }}\n transition={{ duration: reduced ? 0 : 0.2 }}\n >\n <ChevronDown aria-hidden />\n </motion.span>\n </button>\n <AnimatePresence initial={false}>\n {expanded && (\n <motion.div\n className=\"nb-story__expand-body\"\n initial={reduced ? false : { height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={reduced ? { opacity: 0 } : { height: 0, opacity: 0 }}\n transition={{ duration: reduced ? 0 : 0.26, ease: EASE }}\n >\n <div className=\"nb-story__expand-inner\">\n <RichText text={card.expandable.body} paragraphs />\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n )}\n\n {card.check && (\n <StoryCheck\n check={card.check}\n chosen={chosen}\n onAnswer={onAnswer}\n labelId={`nb-story-check-${cardIndex}`}\n delay={reveal ? baseDelay + paragraphs.length * 0.14 : 0}\n />\n )}\n </div>\n </>\n );\n}\n\nfunction StoryCheck({\n check,\n chosen,\n onAnswer,\n labelId,\n delay,\n}: {\n check: NonNullable<StoryCard[\"check\"]>;\n chosen: number | undefined;\n onAnswer: (i: number) => void;\n labelId: string;\n delay: number;\n}) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const answered = chosen !== undefined;\n const correct = answered && Boolean(check.options[chosen]?.correct);\n\n const stateFor = (i: number): OptionState => {\n if (!answered) return \"idle\";\n const opt = check.options[i]!;\n if (i === chosen) return opt.correct ? \"correct\" : \"incorrect\";\n if (opt.correct) return \"missed\";\n return \"idle\";\n };\n\n return (\n <motion.div\n className=\"nb-story__check\"\n initial={reduced || delay === 0 ? false : { opacity: 0, y: 12 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3, ease: EASE, delay }}\n >\n <div className=\"nb-story__check-head\">\n <span className=\"nb-story__check-label\">{t(\"story.checkTitle\")}</span>\n {answered && <span className=\"nb-badge nb-badge--accent\">{t(\"story.answered\")}</span>}\n </div>\n <p className=\"nb-story__check-question\" id={labelId}>\n <RichText text={check.question} />\n </p>\n <div className=\"nb-story__check-options\" role=\"radiogroup\" aria-labelledby={labelId}>\n {check.options.map((o, i) => (\n <OptionCard\n key={i}\n text={o.text}\n state={stateFor(i)}\n disabled={answered}\n onClick={() => onAnswer(i)}\n />\n ))}\n </div>\n <AnimatedFeedback\n show={answered}\n tone={correct ? \"correct\" : \"incorrect\"}\n title={correct ? t(\"common.correct\") : t(\"common.incorrect\")}\n text={check.explanation}\n />\n </motion.div>\n );\n}\n\nexport default StoryCards;\n","import clsx from \"clsx\";\nimport type { HTMLAttributes } from \"react\";\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n tone?: \"neutral\" | \"accent\" | \"success\" | \"danger\" | \"warning\" | \"info\";\n}\n\nexport function Badge({ tone = \"neutral\", className, ...rest }: BadgeProps) {\n return (\n <span\n className={clsx(\"nb-badge\", tone !== \"neutral\" && `nb-badge--${tone}`, className)}\n {...rest}\n />\n );\n}\n","import { useState } from \"react\";\nimport { Lightbulb } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { Button } from \"./Button\";\nimport { RichText } from \"./RichText\";\nimport { useTranslator } from \"../context/NibblearnProvider\";\nimport { useReducedMotion } from \"../hooks/useReducedMotion\";\n\nexport interface HintProps {\n text?: string;\n /** Called the first time the hint is revealed. */\n onReveal?: () => void;\n className?: string;\n}\n\nexport function Hint({ text, onReveal, className }: HintProps) {\n const t = useTranslator();\n const reduced = useReducedMotion();\n const [open, setOpen] = useState(false);\n if (!text) return null;\n return (\n <div className={[\"nb-hint\", className].filter(Boolean).join(\" \")}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-expanded={open}\n leading={<Lightbulb aria-hidden />}\n onClick={() => {\n if (!open) onReveal?.();\n setOpen((o) => !o);\n }}\n >\n {open ? t(\"common.hideHint\") : t(\"common.showHint\")}\n </Button>\n <AnimatePresence initial={false}>\n {open && (\n <motion.div\n className=\"nb-hint__body\"\n role=\"note\"\n initial={reduced ? false : { opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: reduced ? 0 : 0.2 }}\n >\n <Lightbulb aria-hidden />\n <RichText text={text} />\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n","import {\n useCallback,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n} from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { ArrowLeft, ArrowRight, Check, RotateCcw, Shuffle, X } from \"lucide-react\";\nimport { flashcardsSchema, shuffle, type Flashcard, type FlashcardsConfig } from \"@nibblearn/core\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Button } from \"../../primitives/Button\";\nimport { Badge } from \"../../primitives/Badge\";\nimport { ProgressBar } from \"../../primitives/ProgressBar\";\nimport { Hint } from \"../../primitives/Hint\";\nimport { SafeImage } from \"../../primitives/SafeImage\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./flashcards.css\";\n\nexport type FlashcardsProps = ModuleProps<FlashcardsConfig>;\n\nconst EASE = [0.2, 0.8, 0.2, 1] as const;\n\nexport function Flashcards({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: FlashcardsProps) {\n const parsed = useMemo(() => flashcardsSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"flashcards\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <FlashcardsInner\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\ntype Rating = \"again\" | \"got\";\n\n/** Owns the lifecycle; every reset remounts FlashcardsRun with fresh state (keyed by runId). */\nfunction FlashcardsInner(props: FlashcardsProps) {\n const { config, onComplete, onEvent, resetKey } = props;\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"flashcards\",\n onComplete,\n onEvent,\n resetKey,\n });\n return <FlashcardsRun key={life.runId} {...props} life={life} />;\n}\n\nfunction FlashcardsRun({\n life,\n config,\n hideHeader,\n className,\n}: FlashcardsProps & { life: ModuleLifecycle }) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { cards } = config.content;\n const { behavior } = config;\n const total = cards.length;\n\n const initialQueue = useCallback(() => {\n const ids = cards.map((_, i) => i);\n return behavior.shuffle ? shuffle(ids, life.runId * 97 + 13) : ids;\n }, [cards, behavior.shuffle, life.runId]);\n\n /** Indices of cards in the current round, in order. */\n const [queue, setQueue] = useState<number[]>(initialQueue);\n const [pos, setPos] = useState(0);\n const [round, setRound] = useState(1);\n const [flipped, setFlipped] = useState(behavior.autoFlip);\n const [mastered, setMastered] = useState<number[]>([]);\n const [firstPassMastered, setFirstPassMastered] = useState(0);\n const [again, setAgain] = useState<number[]>([]);\n const [interstitial, setInterstitial] = useState(false);\n const [lastRating, setLastRating] = useState<Rating | null>(null);\n const [finished, setFinished] = useState(false);\n const [shuffleSeed, setShuffleSeed] = useState(0);\n const deckRef = useRef<HTMLDivElement>(null);\n\n /** Focus the newest card so keyboard shortcuts keep working after a rating button is disabled. */\n const focusCard = useCallback(() => {\n requestAnimationFrame(() => {\n const cards = deckRef.current?.querySelectorAll<HTMLButtonElement>(\".nb-flash__card\");\n cards?.[cards.length - 1]?.focus({ preventScroll: true });\n });\n }, []);\n\n const cardIndex = queue[pos];\n const card: Flashcard | undefined = cardIndex === undefined ? undefined : cards[cardIndex];\n const remainingInRound = queue.length - pos;\n const toReview = total - mastered.length;\n\n const finish = useCallback(\n (fpm: number, rounds: number, masteredCount: number) => {\n setFinished(true);\n life.complete({\n score: fpm / total,\n correct: fpm,\n total,\n details: { firstPassMastered: fpm, rounds, mastered: masteredCount },\n });\n announce(t(\"a11y.moduleComplete\"));\n },\n [life, total, announce, t],\n );\n\n const rate = useCallback(\n (rating: Rating) => {\n if (card === undefined || cardIndex === undefined || finished || interstitial) return;\n life.attempt();\n const nextMastered = rating === \"got\" ? [...mastered, cardIndex] : mastered;\n const nextAgain = rating === \"again\" ? [...again, cardIndex] : again;\n const nextFpm = rating === \"got\" && round === 1 ? firstPassMastered + 1 : firstPassMastered;\n setMastered(nextMastered);\n setAgain(nextAgain);\n setFirstPassMastered(nextFpm);\n setLastRating(rating);\n life.emit(\"module:answer\", { cardIndex, rating, round, correct: rating === \"got\" });\n announce(rating === \"got\" ? t(\"flash.gotIt\") : t(\"flash.practiceAgain\"));\n\n if (pos + 1 < queue.length) {\n setPos(pos + 1);\n setFlipped(behavior.autoFlip);\n focusCard();\n return;\n }\n // End of round.\n if (behavior.requireMastery && nextAgain.length > 0) {\n setInterstitial(true);\n return;\n }\n finish(nextFpm, round, nextMastered.length);\n },\n [\n card,\n cardIndex,\n finished,\n interstitial,\n life,\n mastered,\n again,\n round,\n firstPassMastered,\n pos,\n queue.length,\n behavior,\n announce,\n t,\n finish,\n focusCard,\n ],\n );\n\n const startReviewRound = useCallback(() => {\n setQueue(again);\n setAgain([]);\n setPos(0);\n setRound((r) => r + 1);\n setFlipped(behavior.autoFlip);\n setLastRating(null);\n setInterstitial(false);\n focusCard();\n life.emit(\"module:interact\", { action: \"reviewRound\", round: round + 1, count: again.length });\n }, [again, behavior.autoFlip, life, round, focusCard]);\n\n const flip = useCallback(() => {\n if (!card) return;\n life.emit(\"module:interact\", { action: \"flip\", cardIndex, side: flipped ? \"front\" : \"back\" });\n setFlipped(!flipped);\n }, [card, cardIndex, flipped, life]);\n\n const reshuffle = useCallback(() => {\n // Shuffle only the cards not yet rated in this round.\n const seed = shuffleSeed + 1;\n setShuffleSeed(seed);\n setQueue((q) => [...q.slice(0, pos), ...shuffle(q.slice(pos), life.runId * 31 + seed * 7 + 3)]);\n setFlipped(behavior.autoFlip);\n life.emit(\"module:interact\", { action: \"shuffle\" });\n }, [shuffleSeed, pos, life, behavior.autoFlip]);\n\n const restart = useCallback(() => {\n life.reset();\n life.emit(\"module:reset\");\n }, [life]);\n\n const onKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLElement>) => {\n if (finished || interstitial) return;\n const target = e.target as HTMLElement | null;\n if (target && /^(INPUT|TEXTAREA|SELECT)$/.test(target.tagName)) return;\n if (e.key === \"ArrowLeft\" && flipped) {\n e.preventDefault();\n rate(\"again\");\n } else if (e.key === \"ArrowRight\" && flipped) {\n e.preventDefault();\n rate(\"got\");\n } else if ((e.key === \" \" || e.key === \"Enter\") && !(target instanceof HTMLButtonElement)) {\n e.preventDefault();\n flip();\n }\n },\n [finished, interstitial, flipped, rate, flip],\n );\n\n const progress = finished ? 1 : mastered.length / total;\n const counters = (\n <div className=\"nb-flash__counters\">\n <span className=\"nb-flash__counter\" data-tone=\"success\">\n <Check aria-hidden strokeWidth={3} />\n {t(\"flash.mastered\", { count: mastered.length })}\n </span>\n <span className=\"nb-flash__counter\" data-tone=\"muted\">\n {t(\"flash.toReview\", { count: toReview })}\n </span>\n </div>\n );\n\n if (finished) {\n return (\n <ModuleShell\n type=\"flashcards\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n appearance={config.appearance}\n className={className}\n announcement={message}\n >\n <CompletionCard\n title={mastered.length === total ? t(\"flash.allMastered\") : undefined}\n score={firstPassMastered / total}\n passThreshold={config.scoring.passThreshold}\n text={\n config.feedback.complete ?? t(\"flash.summary\", { mastered: firstPassMastered, total })\n }\n stats={[\n { label: t(\"flash.gotIt\"), value: `${firstPassMastered}/${total}` },\n { label: t(\"flash.rounds\"), value: round },\n ]}\n onRetry={restart}\n retryLabel={t(\"common.restart\")}\n />\n </ModuleShell>\n );\n }\n\n const faceId = `${config.id}-face-${cardIndex ?? 0}-${flipped ? \"back\" : \"front\"}`;\n\n return (\n <ModuleShell\n type=\"flashcards\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : config.instructions}\n appearance={config.appearance}\n className={className}\n announcement={message}\n eyebrow={\n <ProgressBar\n value={progress}\n showLabel={false}\n size=\"sm\"\n tone=\"success\"\n label={t(\"common.progress\")}\n />\n }\n aside={\n <span className=\"nb-counter\">\n {t(\"common.item\", { current: Math.min(pos + 1, queue.length), total: queue.length })}\n </span>\n }\n onKeyDown={onKeyDown}\n >\n <div className=\"nb-flash\">\n {counters}\n\n <div className=\"nb-flash__deck\" ref={deckRef} data-flipped={flipped ? \"true\" : \"false\"}>\n {!interstitial && remainingInRound > 2 && (\n <div className=\"nb-flash__stack nb-flash__stack--2\" aria-hidden />\n )}\n {!interstitial && remainingInRound > 1 && (\n <div className=\"nb-flash__stack nb-flash__stack--1\" aria-hidden />\n )}\n\n <AnimatePresence mode=\"popLayout\" initial={false} custom={lastRating}>\n {interstitial ? (\n <motion.div\n key={`inter-${round}`}\n className=\"nb-flash__interstitial\"\n initial={reduced ? false : { opacity: 0, y: 16, scale: 0.97 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={reduced ? { opacity: 0 } : { opacity: 0, y: -16, scale: 0.97 }}\n transition={{ duration: reduced ? 0 : 0.26, ease: EASE }}\n role=\"status\"\n >\n <span className=\"nb-icon-circle\">\n <RotateCcw aria-hidden />\n </span>\n <h3 className=\"nb-flash__interstitial-title\">{t(\"flash.reviewRound\")}</h3>\n <p className=\"nb-muted\">{t(\"flash.reviewRoundBody\", { count: again.length })}</p>\n <Button\n variant=\"primary\"\n onClick={startReviewRound}\n autoFocus\n trailing={<ArrowRight aria-hidden />}\n >\n {t(\"common.continue\")}\n </Button>\n </motion.div>\n ) : (\n card && (\n <motion.div\n key={`${life.runId}-${round}-${pos}-${cardIndex}`}\n className=\"nb-flash__card-wrap\"\n variants={{\n enter: reduced ? { opacity: 0 } : { opacity: 0, y: 14, scale: 0.96 },\n center: { opacity: 1, x: 0, y: 0, rotate: 0, scale: 1 },\n exit: (r: Rating | null) =>\n reduced\n ? { opacity: 0 }\n : {\n opacity: 0,\n x: r === \"again\" ? -360 : 360,\n rotate: r === \"again\" ? -8 : 8,\n scale: 0.96,\n },\n }}\n initial=\"enter\"\n animate=\"center\"\n exit=\"exit\"\n transition={{ duration: reduced ? 0 : 0.3, ease: EASE }}\n >\n <button\n type=\"button\"\n className=\"nb-flash__card\"\n aria-pressed={flipped}\n data-motion={reduced ? \"fade\" : \"flip\"}\n onClick={flip}\n >\n {/* Accessible name = \"Flip card:\" + the visible face (WCAG 2.5.3 label in name). */}\n <span className=\"nb-sr-only\">{t(\"flash.flip\")}: </span>\n <motion.div\n className=\"nb-flash__inner\"\n animate={reduced ? undefined : { rotateY: flipped ? 180 : 0 }}\n transition={{ duration: 0.42, ease: EASE }}\n >\n <FlashFace\n side=\"front\"\n id={flipped ? undefined : faceId}\n hidden={flipped}\n text={card.front}\n image={card.frontImage}\n tag={card.tag}\n caption={t(\"flash.showAnswer\")}\n reduced={reduced}\n />\n <FlashFace\n side=\"back\"\n id={flipped ? faceId : undefined}\n hidden={!flipped}\n text={card.back}\n image={card.backImage}\n tag={card.tag}\n caption={t(\"flash.showQuestion\")}\n reduced={reduced}\n />\n </motion.div>\n <motion.span\n className=\"nb-flash__tint\"\n data-tone=\"danger\"\n aria-hidden\n variants={{\n exit: (r: Rating | null) => ({ opacity: r === \"again\" ? 1 : 0 }),\n }}\n />\n <motion.span\n className=\"nb-flash__tint\"\n data-tone=\"success\"\n aria-hidden\n variants={{ exit: (r: Rating | null) => ({ opacity: r === \"got\" ? 1 : 0 }) }}\n />\n </button>\n </motion.div>\n )\n )}\n </AnimatePresence>\n </div>\n\n {!interstitial && card && !flipped && (\n <Hint\n text={card.hint}\n className=\"nb-flash__hint\"\n onReveal={() => life.emit(\"module:hint\", { cardIndex })}\n />\n )}\n\n {!interstitial && (\n <div className=\"nb-flash__actions\" data-visible={flipped ? \"true\" : \"false\"}>\n <Button\n variant=\"danger\"\n size=\"lg\"\n className=\"nb-flash__rate nb-flash__rate--again\"\n onClick={() => rate(\"again\")}\n disabled={!flipped}\n leading={<X aria-hidden strokeWidth={3} />}\n >\n {t(\"flash.practiceAgain\")}\n </Button>\n <Button\n variant=\"success\"\n size=\"lg\"\n className=\"nb-flash__rate nb-flash__rate--got\"\n onClick={() => rate(\"got\")}\n disabled={!flipped}\n leading={<Check aria-hidden strokeWidth={3} />}\n >\n {t(\"flash.gotIt\")}\n </Button>\n </div>\n )}\n\n <div className=\"nb-flash__toolbar\">\n {behavior.allowShuffle && !interstitial && remainingInRound > 1 && (\n <Button variant=\"ghost\" size=\"sm\" onClick={reshuffle} leading={<Shuffle aria-hidden />}>\n {t(\"flash.shuffle\")}\n </Button>\n )}\n <Button variant=\"ghost\" size=\"sm\" onClick={restart} leading={<RotateCcw aria-hidden />}>\n {t(\"common.restart\")}\n </Button>\n {!interstitial && (\n <span className=\"nb-flash__keys nb-subtle nb-text-xs\" aria-hidden>\n <kbd>\n <ArrowLeft />\n </kbd>\n <kbd>\n <ArrowRight />\n </kbd>\n </span>\n )}\n </div>\n </div>\n </ModuleShell>\n );\n}\n\nfunction FlashFace({\n side,\n id,\n hidden,\n text,\n image,\n tag,\n caption,\n reduced,\n}: {\n side: \"front\" | \"back\";\n id?: string;\n hidden: boolean;\n text: string;\n image?: Flashcard[\"frontImage\"];\n tag?: string;\n caption: string;\n reduced: boolean;\n}) {\n const { t } = useNibblearn();\n return (\n <motion.div\n className={`nb-flash__face nb-flash__face--${side}`}\n id={id}\n aria-hidden={hidden}\n animate={reduced ? { opacity: hidden ? 0 : 1 } : undefined}\n transition={{ duration: 0 }}\n >\n <div className=\"nb-flash__face-head\">\n {tag ? <Badge tone={side === \"front\" ? \"accent\" : \"success\"}>{tag}</Badge> : <span />}\n <span className=\"nb-flash__side\">\n {side === \"front\" ? t(\"flash.front\") : t(\"flash.back\")}\n </span>\n </div>\n <div className=\"nb-flash__face-body\">\n {image && <SafeImage media={image} className=\"nb-flash__image\" showCaption={false} />}\n <div className=\"nb-flash__text\" data-long={text.length > 120 ? \"true\" : \"false\"}>\n <RichText text={text} paragraphs />\n </div>\n </div>\n <div className=\"nb-flash__caption\">{caption}</div>\n </motion.div>\n );\n}\n\nexport default Flashcards;\n","import { BookOpen } from \"lucide-react\";\nimport { RichText } from \"./RichText\";\nimport { useTranslator } from \"../context/NibblearnProvider\";\n\nexport function Explanation({\n text,\n title,\n className,\n}: {\n text?: string;\n title?: string;\n className?: string;\n}) {\n const t = useTranslator();\n if (!text) return null;\n return (\n <div className={[\"nb-explanation\", className].filter(Boolean).join(\" \")}>\n <div className=\"nb-explanation__title\">\n <BookOpen aria-hidden />\n {title ?? t(\"common.explanation\")}\n </div>\n <RichText text={text} paragraphs />\n </div>\n );\n}\n","import {\n useCallback,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n} from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { ArrowRight, Check, X } from \"lucide-react\";\nimport {\n choiceChallengeSchema,\n evaluateChoice,\n questionMode,\n withOptionIds,\n type ChoiceChallengeConfig,\n type ChoiceEvaluation,\n type ChoiceOptionWithId,\n} from \"@nibblearn/core\";\nimport { shuffle } from \"@nibblearn/core\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Button } from \"../../primitives/Button\";\nimport { ProgressBar } from \"../../primitives/ProgressBar\";\nimport { OptionCard, type OptionState } from \"../../primitives/OptionCard\";\nimport { AnimatedFeedback } from \"../../primitives/Feedback\";\nimport { Explanation } from \"../../primitives/Explanation\";\nimport { Hint } from \"../../primitives/Hint\";\nimport { SafeImage } from \"../../primitives/SafeImage\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./choice-challenge.css\";\n\nexport type ChoiceChallengeProps = ModuleProps<ChoiceChallengeConfig>;\n\ninterface QuestionRecord {\n score: number;\n correct: boolean;\n attempts: number;\n}\n\nconst LETTERS = \"ABCDEFGH\";\n\nexport function ChoiceChallenge({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: ChoiceChallengeProps) {\n const parsed = useMemo(() => choiceChallengeSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"choice-challenge\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <ChoiceChallengeInner\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\n/** Owns the lifecycle; every reset remounts ChoiceChallengeRun with fresh state (keyed by runId). */\nfunction ChoiceChallengeInner(props: ChoiceChallengeProps) {\n const { config, onComplete, onEvent, resetKey } = props;\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"choice-challenge\",\n onComplete,\n onEvent,\n resetKey,\n });\n return <ChoiceChallengeRun key={life.runId} {...props} life={life} />;\n}\n\nfunction ChoiceChallengeRun({\n life,\n config,\n hideHeader,\n className,\n}: ChoiceChallengeProps & { life: ModuleLifecycle }) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { questions } = config.content;\n const { behavior } = config;\n\n const [index, setIndex] = useState(0);\n const [selected, setSelected] = useState<string[]>([]);\n const [evaluation, setEvaluation] = useState<ChoiceEvaluation | null>(null);\n const [revealed, setRevealed] = useState(false);\n const [records, setRecords] = useState<QuestionRecord[]>([]);\n const [qAttempts, setQAttempts] = useState(0);\n const [finished, setFinished] = useState(false);\n const optionsRef = useRef<HTMLDivElement>(null);\n\n const question = questions[index]!;\n const mode = questionMode(question);\n const options = useMemo<ChoiceOptionWithId[]>(() => {\n const withIds = withOptionIds(question, index);\n return behavior.shuffleOptions ? shuffle(withIds, index + life.runId * 101 + 7) : withIds;\n }, [question, index, behavior.shuffleOptions, life.runId]);\n\n const checked = evaluation !== null;\n const locked = checked && (evaluation.correct || revealed);\n\n const toggle = useCallback(\n (id: string) => {\n if (checked) return;\n setSelected((prev) => {\n if (mode === \"single\") return prev.includes(id) ? [] : [id];\n return prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id];\n });\n life.emit(\"module:interact\", { questionIndex: index, optionId: id });\n },\n [checked, mode, life, index],\n );\n\n const check = useCallback(() => {\n if (selected.length === 0 || checked) return;\n const ev = evaluateChoice(options, selected, { partialCredit: behavior.partialCredit });\n const attempts = qAttempts + 1;\n setQAttempts(attempts);\n life.attempt();\n setEvaluation(ev);\n const exhausted = behavior.maxAttempts > 0 && attempts >= behavior.maxAttempts;\n const willReveal = ev.correct || !behavior.allowRetry || exhausted;\n setRevealed(willReveal);\n life.emit(\"module:answer\", {\n questionIndex: index,\n selected,\n correct: ev.correct,\n score: ev.score,\n attempts,\n });\n announce(ev.correct ? t(\"a11y.correctAnswer\") : t(\"a11y.incorrectAnswer\"));\n }, [selected, checked, options, behavior, qAttempts, life, index, announce, t]);\n\n const retry = useCallback(() => {\n setEvaluation(null);\n setSelected([]);\n setRevealed(false);\n requestAnimationFrame(() =>\n optionsRef.current?.querySelector<HTMLButtonElement>(\"button\")?.focus(),\n );\n }, []);\n\n const next = useCallback(() => {\n if (!evaluation) return;\n const record: QuestionRecord = {\n score: evaluation.correct ? 1 : evaluation.score,\n correct: evaluation.correct,\n attempts: qAttempts,\n };\n // Retried-to-correct answers earn reduced credit.\n if (evaluation.correct && qAttempts > 1)\n record.score = Math.max(0.5, 1 - (qAttempts - 1) * 0.25);\n const nextRecords = [...records, record];\n setRecords(nextRecords);\n if (index + 1 >= questions.length) {\n const total = questions.length;\n const correct = nextRecords.filter((r) => r.correct).length;\n const score = nextRecords.reduce((s, r) => s + r.score, 0) / total;\n setFinished(true);\n life.complete({ score, correct, total, details: { records: nextRecords } });\n announce(t(\"a11y.moduleComplete\"));\n return;\n }\n setIndex(index + 1);\n setSelected([]);\n setEvaluation(null);\n setRevealed(false);\n setQAttempts(0);\n }, [evaluation, qAttempts, records, index, questions.length, life, announce, t]);\n\n // Keyboard shortcuts: letters/numbers select, Enter checks/advances.\n const onKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLElement>) => {\n if (finished) return;\n const target = e.target as HTMLElement | null;\n if (target && /^(INPUT|TEXTAREA|SELECT)$/.test(target.tagName)) return;\n const key = e.key.toUpperCase();\n const li = LETTERS.indexOf(key);\n const ni = /^[1-9]$/.test(key) ? Number(key) - 1 : -1;\n const i = key.length === 1 ? (li >= 0 ? li : ni) : -1;\n if (i >= 0 && i < options.length && !checked) {\n e.preventDefault();\n toggle(options[i]!.id);\n } else if (\n e.key === \"Enter\" &&\n (!(target instanceof HTMLButtonElement) || target.classList.contains(\"nb-option\"))\n ) {\n e.preventDefault();\n if (!checked) check();\n else if (locked) next();\n }\n },\n [options, checked, locked, toggle, check, next, finished],\n );\n\n const stateFor = (o: ChoiceOptionWithId): OptionState => {\n const isSelected = selected.includes(o.id);\n if (!checked) return isSelected ? \"selected\" : \"idle\";\n if (locked) {\n if (o.correct && isSelected) return \"correct\";\n if (o.correct && !isSelected) return \"missed\";\n if (!o.correct && isSelected) return \"incorrect\";\n return \"idle\";\n }\n // Checked but retry allowed: only reveal wrong selections.\n if (isSelected && !o.correct) return \"incorrect\";\n if (isSelected && o.correct) return \"correct\";\n return \"idle\";\n };\n\n const tone = evaluation\n ? evaluation.correct\n ? \"correct\"\n : evaluation.score > 0 && behavior.partialCredit\n ? \"partial\"\n : \"incorrect\"\n : \"info\";\n const feedbackTitle = evaluation\n ? evaluation.correct\n ? t(\"common.correct\")\n : tone === \"partial\"\n ? t(\"common.partiallyCorrect\")\n : t(\"common.incorrect\")\n : \"\";\n const feedbackText = evaluation\n ? evaluation.correct\n ? (config.feedback.correct ?? undefined)\n : (config.feedback.incorrect ?? (!locked ? t(\"common.tryAgainLater\") : undefined))\n : undefined;\n\n const hasImages = options.some((o) => o.image);\n const progress = finished ? 1 : index / questions.length;\n\n if (finished) {\n const correct = records.filter((r) => r.correct).length;\n const score = records.reduce((s, r) => s + r.score, 0) / questions.length;\n return (\n <ModuleShell\n type=\"choice-challenge\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n appearance={config.appearance}\n className={className}\n announcement={message}\n >\n <CompletionCard\n score={score}\n passThreshold={Math.max(config.scoring.passThreshold, 0.7)}\n text={\n config.feedback.complete ?? t(\"choice.summary\", { correct, total: questions.length })\n }\n stats={[\n { label: t(\"common.correct\"), value: `${correct}/${questions.length}` },\n { label: t(\"common.attempts\"), value: records.reduce((s, r) => s + r.attempts, 0) },\n ]}\n onRetry={() => {\n life.reset();\n life.emit(\"module:reset\");\n }}\n >\n <ul className=\"nb-choice__summary-list\">\n {questions.map((q, i) => (\n <li\n key={i}\n className=\"nb-choice__summary-item\"\n data-ok={records[i]?.correct ? \"true\" : \"false\"}\n >\n {records[i]?.correct ? (\n <Check aria-label={t(\"common.correct\")} />\n ) : (\n <X aria-label={t(\"common.incorrect\")} />\n )}\n <RichText text={q.prompt} />\n </li>\n ))}\n </ul>\n </CompletionCard>\n </ModuleShell>\n );\n }\n\n return (\n <ModuleShell\n type=\"choice-challenge\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : config.instructions}\n appearance={config.appearance}\n className={className}\n announcement={message}\n aside={\n behavior.showCounter && questions.length > 1 ? (\n <span className=\"nb-counter\">\n {t(\"choice.question\", { current: index + 1, total: questions.length })}\n </span>\n ) : undefined\n }\n eyebrow={\n behavior.showCounter && questions.length > 1 ? (\n <ProgressBar value={progress} showLabel={false} size=\"sm\" />\n ) : undefined\n }\n onKeyDown={onKeyDown}\n >\n <AnimatePresence mode=\"wait\" initial={false}>\n <motion.div\n key={`${life.runId}-${index}`}\n className=\"nb-choice__question\"\n initial={reduced ? false : { opacity: 0, x: 24 }}\n animate={{ opacity: 1, x: 0 }}\n exit={reduced ? { opacity: 0 } : { opacity: 0, x: -24 }}\n transition={{ duration: reduced ? 0 : 0.24, ease: [0.2, 0.8, 0.2, 1] }}\n >\n {question.image && <SafeImage media={question.image} className=\"nb-choice__image\" />}\n <div>\n <div className=\"nb-choice__mode\">\n {mode === \"single\" ? t(\"choice.selectOne\") : t(\"choice.selectMany\")}\n </div>\n <h3 className=\"nb-choice__prompt\" id={`${config.id}-q${index}`}>\n <RichText text={question.prompt} />\n </h3>\n {question.context && (\n <p className=\"nb-choice__context\">\n <RichText text={question.context} />\n </p>\n )}\n </div>\n <div\n ref={optionsRef}\n className={[\"nb-choice__options\", hasImages && \"nb-choice__options--images\"]\n .filter(Boolean)\n .join(\" \")}\n role={mode === \"single\" ? \"radiogroup\" : \"group\"}\n aria-labelledby={`${config.id}-q${index}`}\n >\n {options.map((o, i) => (\n <OptionCard\n key={o.id}\n text={o.text}\n image={o.image}\n shortcut={LETTERS[i]}\n multiple={mode === \"multiple\"}\n state={stateFor(o)}\n explanation={locked ? o.explanation : undefined}\n disabled={locked}\n onClick={() => toggle(o.id)}\n className={hasImages ? \"nb-option--image-grid\" : undefined}\n />\n ))}\n </div>\n\n {!checked && (\n <Hint\n text={question.hint}\n onReveal={() => life.emit(\"module:hint\", { questionIndex: index })}\n />\n )}\n\n <AnimatedFeedback show={checked} tone={tone} title={feedbackTitle} text={feedbackText}>\n {evaluation &&\n locked &&\n !evaluation.correct &&\n evaluation.missedIds.length > 0 &&\n mode === \"multiple\" && (\n <span>\n {t(\"choice.youMissed\", {\n items: options\n .filter((o) => evaluation.missedIds.includes(o.id))\n .map((o) => o.text)\n .join(\", \"),\n })}\n </span>\n )}\n </AnimatedFeedback>\n\n {locked && behavior.showExplanation && <Explanation text={question.explanation} />}\n\n <div className=\"nb-choice__footer\">\n <span className=\"nb-muted nb-text-sm\">\n {!checked &&\n selected.length > 0 &&\n mode === \"multiple\" &&\n t(\"common.selected\") + `: ${selected.length}`}\n </span>\n <div className=\"nb-module__actions\">\n {checked && !locked && (\n <Button variant=\"secondary\" onClick={retry}>\n {t(\"common.retry\")}\n </Button>\n )}\n {!checked ? (\n <Button variant=\"primary\" onClick={check} disabled={selected.length === 0}>\n {t(\"common.check\")}\n </Button>\n ) : (\n locked && (\n <Button\n variant=\"primary\"\n onClick={next}\n trailing={<ArrowRight aria-hidden />}\n autoFocus\n >\n {index + 1 >= questions.length ? t(\"common.finish\") : t(\"common.next\")}\n </Button>\n )\n )}\n </div>\n </div>\n </motion.div>\n </AnimatePresence>\n </ModuleShell>\n );\n}\n\nexport default ChoiceChallenge;\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n} from \"react\";\nimport { AnimatePresence, motion, useMotionValue, useTransform, type PanInfo } from \"motion/react\";\nimport { ArrowRight, Check, Shuffle, X } from \"lucide-react\";\nimport { trueFalseSchema, shuffle, type Statement, type TrueFalseConfig } from \"@nibblearn/core\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Button } from \"../../primitives/Button\";\nimport { Badge } from \"../../primitives/Badge\";\nimport { ProgressBar } from \"../../primitives/ProgressBar\";\nimport { AnimatedFeedback } from \"../../primitives/Feedback\";\nimport { SafeImage } from \"../../primitives/SafeImage\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./true-false.css\";\n\nexport type TrueFalseProps = ModuleProps<TrueFalseConfig>;\n\ninterface Answer {\n choice: boolean;\n correct: boolean;\n}\n\nconst SWIPE_THRESHOLD = 100;\nconst EASE = [0.2, 0.8, 0.2, 1] as const;\n\nexport function TrueFalse({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: TrueFalseProps) {\n const parsed = useMemo(() => trueFalseSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"true-false\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <TrueFalseInner\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\n/** Owns the lifecycle; every reset remounts TrueFalseRun with fresh state (keyed by runId). */\nfunction TrueFalseInner(props: TrueFalseProps) {\n const { config, onComplete, onEvent, resetKey } = props;\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"true-false\",\n onComplete,\n onEvent,\n resetKey,\n });\n return <TrueFalseRun key={life.runId} {...props} life={life} />;\n}\n\nfunction TrueFalseRun({\n life,\n config,\n hideHeader,\n className,\n}: TrueFalseProps & { life: ModuleLifecycle }) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { statements } = config.content;\n const { behavior } = config;\n const total = statements.length;\n\n const order = useMemo(() => {\n const ids = statements.map((_, i) => i);\n return behavior.shuffle ? shuffle(ids, life.runId * 53 + 11) : ids;\n }, [statements, behavior.shuffle, life.runId]);\n\n const [pos, setPos] = useState(0);\n const [answer, setAnswer] = useState<Answer | null>(null);\n /** Keyed by statement index. */\n const [records, setRecords] = useState<Record<number, Answer>>({});\n const [finished, setFinished] = useState(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const stackRef = useRef<HTMLDivElement>(null);\n const pendingFocus = useRef(false);\n // After advancing, keep focus inside the module so keyboard shortcuts keep working\n // (the Continue / decision buttons that held focus have just been removed or disabled).\n useEffect(() => {\n if (!pendingFocus.current) return;\n pendingFocus.current = false;\n stackRef.current?.focus({ preventScroll: true });\n }, [pos]);\n\n useEffect(\n () => () => {\n if (timer.current) clearTimeout(timer.current);\n },\n [],\n );\n\n const stIndex = order[pos]!;\n const statement = statements[stIndex]!;\n const nextStatement = pos + 1 < total ? statements[order[pos + 1]!] : undefined;\n const correctCount = Object.values(records).filter((r) => r.correct).length;\n\n const advance = useCallback(\n (nextRecords: Record<number, Answer>) => {\n if (pos + 1 >= total) {\n const correct = Object.values(nextRecords).filter((r) => r.correct).length;\n setFinished(true);\n life.complete({\n score: correct / total,\n correct,\n total,\n details: { answers: nextRecords },\n });\n announce(t(\"a11y.moduleComplete\"));\n return;\n }\n setPos(pos + 1);\n setAnswer(null);\n pendingFocus.current = true;\n },\n [pos, total, life, announce, t],\n );\n\n const continueNext = useCallback(() => {\n if (!answer) return;\n advance(records);\n }, [answer, advance, records]);\n\n const decide = useCallback(\n (choice: boolean, via: \"button\" | \"swipe\" | \"key\") => {\n if (answer || finished) return;\n const correct = choice === statement.isTrue;\n const a: Answer = { choice, correct };\n const nextRecords = { ...records, [stIndex]: a };\n setAnswer(a);\n setRecords(nextRecords);\n life.attempt();\n life.emit(\"module:answer\", { statementIndex: stIndex, choice, correct, via });\n announce(correct ? t(\"a11y.correctAnswer\") : t(\"a11y.incorrectAnswer\"));\n if (!behavior.showExplanation) {\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => advance(nextRecords), reduced ? 200 : 700);\n }\n },\n [\n answer,\n finished,\n statement.isTrue,\n records,\n stIndex,\n life,\n announce,\n t,\n behavior.showExplanation,\n reduced,\n advance,\n ],\n );\n\n const onKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLElement>) => {\n if (finished) return;\n const target = e.target as HTMLElement | null;\n if (target && /^(INPUT|TEXTAREA|SELECT)$/.test(target.tagName)) return;\n const key = e.key.toUpperCase();\n if (key === \"ARROWLEFT\" || key === \"F\") {\n e.preventDefault();\n decide(false, \"key\");\n } else if (key === \"ARROWRIGHT\" || key === \"T\") {\n e.preventDefault();\n decide(true, \"key\");\n } else if (\n e.key === \"Enter\" &&\n answer &&\n behavior.showExplanation &&\n !(target instanceof HTMLButtonElement)\n ) {\n e.preventDefault();\n continueNext();\n }\n },\n [finished, decide, answer, behavior.showExplanation, continueNext],\n );\n\n const restart = () => {\n life.reset();\n life.emit(\"module:reset\");\n };\n\n if (finished) {\n return (\n <ModuleShell\n type=\"true-false\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n appearance={config.appearance}\n className={className}\n announcement={message}\n >\n <CompletionCard\n score={correctCount / total}\n passThreshold={config.scoring.passThreshold}\n text={config.feedback.complete ?? t(\"tf.summary\", { correct: correctCount, total })}\n stats={[\n { label: t(\"common.correct\"), value: `${correctCount}/${total}` },\n { label: t(\"common.incorrect\"), value: total - correctCount },\n ]}\n onRetry={restart}\n >\n <ul className=\"nb-tf__summary-list\">\n {order.map((si) => {\n const s = statements[si]!;\n const r = records[si];\n return (\n <li\n key={si}\n className=\"nb-tf__summary-item\"\n data-ok={r?.correct ? \"true\" : \"false\"}\n >\n {r?.correct ? (\n <Check aria-label={t(\"common.correct\")} strokeWidth={3} />\n ) : (\n <X aria-label={t(\"common.incorrect\")} strokeWidth={3} />\n )}\n <span className=\"nb-tf__summary-text\">\n <RichText text={s.text} />\n </span>\n <Badge tone={s.isTrue ? \"success\" : \"danger\"}>\n {s.isTrue ? behavior.trueLabel : behavior.falseLabel}\n </Badge>\n </li>\n );\n })}\n </ul>\n </CompletionCard>\n </ModuleShell>\n );\n }\n\n const exitDir = answer ? (answer.choice ? 1 : -1) : 0;\n\n return (\n <ModuleShell\n type=\"true-false\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : config.instructions}\n appearance={config.appearance}\n className={className}\n announcement={message}\n eyebrow={\n total > 1 ? <ProgressBar value={pos / total} showLabel={false} size=\"sm\" /> : undefined\n }\n aside={<span className=\"nb-counter\">{t(\"tf.statement\", { current: pos + 1, total })}</span>}\n onKeyDown={onKeyDown}\n >\n <div className=\"nb-tf\">\n <div\n className=\"nb-tf__stack\"\n ref={stackRef}\n tabIndex={-1}\n role=\"group\"\n aria-label={t(\"tf.statement\", { current: pos + 1, total })}\n >\n {nextStatement && (\n <div\n className=\"nb-tf__card nb-tf__card--peek\"\n aria-hidden\n key={`peek-${life.runId}-${pos + 1}`}\n >\n <div className=\"nb-tf__card-head\">\n {nextStatement.tag && <Badge>{nextStatement.tag}</Badge>}\n </div>\n <p className=\"nb-tf__text\">\n <RichText text={nextStatement.text} />\n </p>\n </div>\n )}\n <AnimatePresence mode=\"popLayout\" initial={false} custom={exitDir}>\n <StatementCard\n key={`${life.runId}-${pos}`}\n statement={statement}\n answer={answer}\n swipe={behavior.swipe && !answer}\n trueLabel={behavior.trueLabel}\n falseLabel={behavior.falseLabel}\n reduced={reduced}\n onDecide={(c) => decide(c, \"swipe\")}\n />\n </AnimatePresence>\n </div>\n\n <div className=\"nb-tf__actions\">\n <Button\n variant=\"secondary\"\n size=\"lg\"\n className=\"nb-tf__btn nb-tf__btn--false\"\n onClick={() => decide(false, \"button\")}\n disabled={Boolean(answer)}\n aria-label={`${t(\"tf.markFalse\")}: ${behavior.falseLabel}`}\n leading={<X aria-hidden strokeWidth={3} />}\n data-chosen={answer?.choice === false ? \"true\" : \"false\"}\n >\n {behavior.falseLabel}\n </Button>\n <Button\n variant=\"secondary\"\n size=\"lg\"\n className=\"nb-tf__btn nb-tf__btn--true\"\n onClick={() => decide(true, \"button\")}\n disabled={Boolean(answer)}\n aria-label={`${t(\"tf.markTrue\")}: ${behavior.trueLabel}`}\n leading={<Check aria-hidden strokeWidth={3} />}\n data-chosen={answer?.choice === true ? \"true\" : \"false\"}\n >\n {behavior.trueLabel}\n </Button>\n </div>\n\n {!answer && (behavior.swipe || behavior.shuffle) && (\n <p className=\"nb-tf__hint nb-subtle nb-text-xs\">\n {behavior.swipe ? t(\"tf.swipeHint\") : null}\n {behavior.shuffle && (\n <span className=\"nb-tf__hint-shuffle\">\n <Shuffle aria-hidden />\n {t(\"flash.shuffle\")}\n </span>\n )}\n </p>\n )}\n\n <div className=\"nb-tf__feedback\">\n <AnimatedFeedback\n show={Boolean(answer)}\n tone={answer?.correct ? \"correct\" : \"incorrect\"}\n title={answer?.correct ? t(\"common.correct\") : t(\"common.incorrect\")}\n text={behavior.showExplanation ? statement.explanation : undefined}\n />\n {answer && behavior.showExplanation && (\n <div className=\"nb-module__actions\">\n <Button\n variant=\"primary\"\n onClick={continueNext}\n trailing={<ArrowRight aria-hidden />}\n autoFocus\n >\n {pos + 1 >= total ? t(\"common.finish\") : t(\"common.continue\")}\n </Button>\n </div>\n )}\n </div>\n </div>\n </ModuleShell>\n );\n}\n\ninterface StatementCardProps {\n statement: Statement;\n answer: Answer | null;\n swipe: boolean;\n trueLabel: string;\n falseLabel: string;\n reduced: boolean;\n onDecide: (choice: boolean) => void;\n}\n\n// forwardRef: AnimatePresence mode=\"popLayout\" measures its child through this ref\n// (required on React 18, and for the pop-out layout to work at all).\nconst StatementCard = forwardRef<HTMLDivElement, StatementCardProps>(function StatementCard(\n { statement, answer, swipe, trueLabel, falseLabel, reduced, onDecide },\n ref,\n) {\n const x = useMotionValue(0);\n const rotate = useTransform(x, [-220, 0, 220], [-9, 0, 9]);\n const trueOpacity = useTransform(x, [20, SWIPE_THRESHOLD], [0, 1]);\n const falseOpacity = useTransform(x, [-SWIPE_THRESHOLD, -20], [1, 0]);\n\n const onDragEnd = (_: unknown, info: PanInfo) => {\n if (info.offset.x > SWIPE_THRESHOLD) onDecide(true);\n else if (info.offset.x < -SWIPE_THRESHOLD) onDecide(false);\n };\n\n return (\n <motion.div\n ref={ref}\n className=\"nb-tf__card\"\n data-answer={answer ? (answer.correct ? \"correct\" : \"incorrect\") : undefined}\n data-swipe={swipe ? \"true\" : \"false\"}\n style={{ x, rotate }}\n drag={swipe ? \"x\" : false}\n dragConstraints={{ left: 0, right: 0 }}\n dragElastic={0.85}\n dragSnapToOrigin\n onDragEnd={onDragEnd}\n whileDrag={{ scale: 1.02, cursor: \"grabbing\" }}\n variants={{\n enter: reduced ? { opacity: 0 } : { opacity: 0, y: 12, scale: 0.96 },\n center: { opacity: 1, x: 0, y: 0, scale: 1 },\n exit: (dir: number) =>\n reduced ? { opacity: 0 } : { opacity: 0, x: dir * 420, rotate: dir * 10, scale: 0.96 },\n }}\n initial=\"enter\"\n animate=\"center\"\n exit=\"exit\"\n transition={{ duration: reduced ? 0 : 0.3, ease: EASE }}\n >\n <div className=\"nb-tf__card-head\">\n {statement.tag ? <Badge>{statement.tag}</Badge> : <span />}\n {answer && (\n <span className=\"nb-tf__mark\" data-ok={answer.correct ? \"true\" : \"false\"} aria-hidden>\n {answer.correct ? <Check strokeWidth={3} /> : <X strokeWidth={3} />}\n </span>\n )}\n </div>\n {statement.image && (\n <SafeImage media={statement.image} className=\"nb-tf__image\" showCaption={false} />\n )}\n <p className=\"nb-tf__text\">\n <RichText text={statement.text} />\n </p>\n <motion.span\n className=\"nb-tf__stamp nb-tf__stamp--true\"\n aria-hidden\n style={{ opacity: trueOpacity }}\n animate={answer ? { opacity: answer.choice ? 1 : 0 } : undefined}\n transition={{ duration: reduced ? 0 : 0.15 }}\n >\n <Check strokeWidth={3} />\n {trueLabel}\n </motion.span>\n <motion.span\n className=\"nb-tf__stamp nb-tf__stamp--false\"\n aria-hidden\n style={{ opacity: falseOpacity }}\n animate={answer ? { opacity: answer.choice ? 0 : 1 } : undefined}\n transition={{ duration: reduced ? 0 : 0.15 }}\n >\n <X strokeWidth={3} />\n {falseLabel}\n </motion.span>\n </motion.div>\n );\n});\n\nexport default TrueFalse;\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { AnimatePresence, LayoutGroup, motion } from \"motion/react\";\nimport { Check, Clock, X } from \"lucide-react\";\nimport {\n DndContext,\n DragOverlay,\n PointerSensor,\n TouchSensor,\n useDraggable,\n useDroppable,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragStartEvent,\n} from \"@dnd-kit/core\";\nimport {\n matchPairsSchema,\n matchingScore,\n shuffle,\n type MatchPairsConfig,\n type Pair,\n seedFromString,\n} from \"@nibblearn/core\";\nimport clsx from \"clsx\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { AnimatedFeedback } from \"../../primitives/Feedback\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./match-pairs.css\";\n\nexport type MatchPairsProps = ModuleProps<MatchPairsConfig>;\n\ntype PairWithId = Pair & { id: string };\ntype Side = \"left\" | \"right\";\ntype TileState = \"idle\" | \"selected\" | \"matched\" | \"wrong\";\n\ninterface Selection {\n side: Side;\n id: string;\n}\n\nconst SHAKE_MS = 420;\nconst COLLAPSE_MS = 620;\nconst ROUND_MS = 760;\n\nfunction formatTime(totalSeconds: number): string {\n const s = Math.max(0, Math.floor(totalSeconds));\n const mm = Math.floor(s / 60)\n .toString()\n .padStart(2, \"0\");\n const ss = (s % 60).toString().padStart(2, \"0\");\n return `${mm}:${ss}`;\n}\n\nexport function MatchPairs({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: MatchPairsProps) {\n const parsed = useMemo(() => matchPairsSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"match-pairs\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <MatchPairsInner\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\nfunction MatchPairsInner({\n config,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: MatchPairsProps) {\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"match-pairs\",\n onComplete,\n onEvent,\n resetKey,\n });\n // Keying on runId remounts the game with fresh state (and a fresh shuffle) on every reset.\n return (\n <MatchPairsGame\n key={life.runId}\n config={config}\n life={life}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\ninterface GameProps {\n config: MatchPairsConfig;\n life: ModuleLifecycle;\n hideHeader?: boolean;\n className?: string;\n}\n\nfunction MatchPairsGame({ config, life, hideHeader, className }: GameProps) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { behavior } = config;\n\n const pairs = useMemo<PairWithId[]>(\n () => config.content.pairs.map((p, i) => ({ ...p, id: p.id ?? `pair-${i}` })),\n [config.content.pairs],\n );\n const total = pairs.length;\n const perRound = Math.min(behavior.pairsPerRound, total);\n\n // A fresh random seed for every mount (= every run) so retry reshuffles.\n const [seed] = useState(() => seedFromString(config.id, life.runId));\n\n const [roundIndex, setRoundIndex] = useState(0);\n const [matched, setMatched] = useState<string[]>([]);\n const [hidden, setHidden] = useState<string[]>([]);\n const [selected, setSelected] = useState<Selection | null>(null);\n const [wrong, setWrong] = useState<{ left: string; right: string } | null>(null);\n const [showMiss, setShowMiss] = useState(false);\n const [mistakes, setMistakes] = useState(0);\n const [finished, setFinished] = useState(false);\n const [elapsed, setElapsed] = useState(0);\n const [dragging, setDragging] = useState<string | null>(null);\n const timers = useRef<ReturnType<typeof setTimeout>[]>([]);\n\n const later = useCallback((fn: () => void, ms: number) => {\n const id = setTimeout(fn, ms);\n timers.current.push(id);\n return id;\n }, []);\n\n useEffect(() => {\n const list = timers.current;\n return () => list.forEach(clearTimeout);\n }, []);\n\n // Elapsed-time ticker.\n useEffect(() => {\n if (!behavior.timer || finished) return;\n const id = setInterval(() => setElapsed(Math.floor(life.elapsedMs() / 1000)), 1000);\n return () => clearInterval(id);\n }, [behavior.timer, finished, life]);\n\n const order = useMemo(\n () => (behavior.shuffle ? shuffle(pairs, seed) : pairs),\n [pairs, behavior.shuffle, seed],\n );\n const visible = useMemo(\n () => order.slice(roundIndex * perRound, (roundIndex + 1) * perRound),\n [order, roundIndex, perRound],\n );\n const leftTiles = useMemo(\n () => (behavior.shuffle ? shuffle(visible, seed + 17 + roundIndex) : visible),\n [visible, behavior.shuffle, seed, roundIndex],\n );\n const rightTiles = useMemo(\n () => (behavior.shuffle ? shuffle(visible, seed + 101 + roundIndex) : visible),\n [visible, behavior.shuffle, seed, roundIndex],\n );\n\n const byId = useMemo(() => new Map(pairs.map((p) => [p.id, p])), [pairs]);\n const rounds = Math.ceil(total / perRound);\n const isLastRound = roundIndex + 1 >= rounds;\n\n const finish = useCallback(\n (finalMistakes: number) => {\n const score = matchingScore(total, finalMistakes);\n setFinished(true);\n life.complete({ score, correct: total, total, details: { mistakes: finalMistakes, rounds } });\n announce(`${t(\"match.complete\")} ${t(\"a11y.moduleComplete\")}`);\n },\n [total, life, rounds, announce, t],\n );\n\n // Advance rounds when every visible pair is matched.\n useEffect(() => {\n if (finished || visible.length === 0) return;\n if (!visible.every((p) => matched.includes(p.id))) return;\n const id = later(() => {\n if (isLastRound) finish(mistakes);\n else {\n setRoundIndex((r) => r + 1);\n setHidden([]);\n }\n }, ROUND_MS);\n return () => clearTimeout(id);\n }, [visible, matched, finished, isLastRound, finish, mistakes, later]);\n\n const attemptMatch = useCallback(\n (leftId: string, rightId: string) => {\n const left = byId.get(leftId);\n const right = byId.get(rightId);\n if (!left || !right) return;\n setSelected(null);\n life.attempt();\n if (leftId === rightId) {\n setMatched((prev) => (prev.includes(leftId) ? prev : [...prev, leftId]));\n setShowMiss(false);\n later(() => setHidden((prev) => [...prev, leftId]), COLLAPSE_MS);\n life.emit(\"module:answer\", { pairId: leftId, correct: true });\n announce(t(\"match.pairMatched\", { left: left.left, right: right.right }));\n } else {\n setMistakes((m) => m + 1);\n setWrong({ left: leftId, right: rightId });\n setShowMiss(true);\n later(() => setWrong(null), SHAKE_MS);\n life.emit(\"module:answer\", { leftId, rightId, correct: false });\n announce(`${t(\"a11y.incorrectAnswer\")} ${t(\"match.notAPair\")}`);\n }\n },\n [byId, life, later, announce, t],\n );\n\n const tap = useCallback(\n (side: Side, id: string) => {\n if (finished || matched.includes(id)) return;\n if (!selected) {\n setSelected({ side, id });\n setShowMiss(false);\n life.emit(\"module:interact\", { side, id });\n return;\n }\n if (selected.side === side) {\n setSelected(selected.id === id ? null : { side, id });\n return;\n }\n const leftId = side === \"left\" ? id : selected.id;\n const rightId = side === \"right\" ? id : selected.id;\n attemptMatch(leftId, rightId);\n },\n [finished, matched, selected, life, attemptMatch],\n );\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n useSensor(TouchSensor, { activationConstraint: { delay: 120, tolerance: 8 } }),\n );\n\n const onDragStart = useCallback((e: DragStartEvent) => {\n const id = String(e.active.data.current?.pairId ?? \"\");\n setDragging(id);\n setSelected({ side: \"left\", id });\n setShowMiss(false);\n }, []);\n\n const onDragEnd = useCallback(\n (e: DragEndEvent) => {\n setDragging(null);\n const leftId = String(e.active.data.current?.pairId ?? \"\");\n const rightId = e.over ? String(e.over.data.current?.pairId ?? \"\") : \"\";\n if (leftId && rightId) attemptMatch(leftId, rightId);\n else setSelected(null);\n },\n [attemptMatch],\n );\n\n const onDragCancel = useCallback(() => {\n setDragging(null);\n setSelected(null);\n }, []);\n\n const stateFor = (side: Side, id: string): TileState => {\n if (matched.includes(id)) return \"matched\";\n if (wrong && (side === \"left\" ? wrong.left === id : wrong.right === id)) return \"wrong\";\n if (selected && selected.side === side && selected.id === id) return \"selected\";\n return \"idle\";\n };\n\n const matchedCount = matched.length;\n\n if (finished) {\n const score = matchingScore(total, mistakes);\n const stats: { label: string; value: string | number }[] = [\n { label: t(\"match.matched\", { count: total, total }), value: `${total}/${total}` },\n { label: t(\"match.mistakesLabel\"), value: mistakes },\n ];\n if (behavior.timer)\n stats.push({\n label: t(\"common.time\"),\n value: formatTime((life.result?.durationMs ?? life.elapsedMs()) / 1000),\n });\n const explained = pairs.filter((p) => p.explanation);\n return (\n <ModuleShell\n type=\"match-pairs\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n appearance={config.appearance}\n className={className}\n announcement={message}\n >\n <CompletionCard\n score={score}\n text={config.feedback.complete ?? t(\"match.complete\")}\n stats={stats}\n onRetry={() => {\n life.reset();\n life.emit(\"module:reset\");\n }}\n >\n {explained.length > 0 && (\n <ul className=\"nb-match__summary\">\n {explained.map((p) => (\n <li key={p.id} className=\"nb-match__summary-item\">\n <div className=\"nb-match__summary-pair\">\n <Check aria-hidden strokeWidth={3} />\n <span className=\"nb-match__summary-left\">\n <RichText text={p.left} />\n </span>\n <span className=\"nb-match__summary-arrow\" aria-hidden>\n →\n </span>\n <span className=\"nb-match__summary-right\">\n <RichText text={p.right} />\n </span>\n </div>\n <p className=\"nb-match__summary-explanation\">\n <RichText text={p.explanation!} />\n </p>\n </li>\n ))}\n </ul>\n )}\n </CompletionCard>\n </ModuleShell>\n );\n }\n\n const aside = (\n <div className=\"nb-match__stats\">\n <span className=\"nb-counter\">{t(\"match.matched\", { count: matchedCount, total })}</span>\n <span\n className={clsx(\n \"nb-counter\",\n \"nb-match__mistakes\",\n mistakes > 0 && \"nb-match__mistakes--some\",\n )}\n >\n {t(\"match.mistakes\", { count: mistakes })}\n </span>\n {behavior.timer && (\n <span\n className=\"nb-counter nb-match__timer\"\n aria-label={`${t(\"common.time\")}: ${formatTime(elapsed)}`}\n >\n <Clock aria-hidden size={14} />\n {formatTime(elapsed)}\n </span>\n )}\n </div>\n );\n\n const draggingPair = dragging ? byId.get(dragging) : undefined;\n\n return (\n <ModuleShell\n type=\"match-pairs\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : (config.instructions ?? t(\"match.instructions\"))}\n appearance={config.appearance}\n className={className}\n announcement={message}\n aside={aside}\n eyebrow={\n rounds > 1 ? (\n <span className=\"nb-counter\">\n {t(\"common.step\", { current: roundIndex + 1, total: rounds })}\n </span>\n ) : undefined\n }\n >\n <DndContext\n id={`${config.id}-dnd`}\n sensors={sensors}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragCancel={onDragCancel}\n accessibility={{\n screenReaderInstructions: { draggable: t(\"a11y.dragInstructions\") },\n announcements: {\n onDragStart: ({ active }) =>\n t(\"a11y.pickedUp\", { item: String(active.data.current?.label ?? \"\") }),\n onDragOver: () => undefined,\n onDragEnd: () => undefined,\n onDragCancel: ({ active }) =>\n t(\"a11y.dropCancelled\", { item: String(active.data.current?.label ?? \"\") }),\n },\n }}\n >\n <AnimatePresence mode=\"wait\" initial={false}>\n <motion.div\n key={roundIndex}\n className=\"nb-match__board\"\n initial={reduced ? false : { opacity: 0, y: 16 }}\n animate={{ opacity: 1, y: 0 }}\n exit={reduced ? { opacity: 0 } : { opacity: 0, y: -12 }}\n transition={{ duration: reduced ? 0 : 0.26, ease: [0.2, 0.8, 0.2, 1] }}\n >\n <LayoutGroup id={`${config.id}-${roundIndex}`}>\n <Column\n side=\"left\"\n label={config.content.leftLabel}\n tiles={leftTiles.filter((p) => !hidden.includes(p.id))}\n stateFor={stateFor}\n onTap={tap}\n drag={behavior.drag}\n reduced={reduced}\n dragging={dragging}\n t={t}\n />\n <Column\n side=\"right\"\n label={config.content.rightLabel}\n tiles={rightTiles.filter((p) => !hidden.includes(p.id))}\n stateFor={stateFor}\n onTap={tap}\n drag={behavior.drag}\n reduced={reduced}\n dragging={dragging}\n t={t}\n />\n </LayoutGroup>\n </motion.div>\n </AnimatePresence>\n\n <DragOverlay dropAnimation={reduced ? null : undefined}>\n {draggingPair ? (\n <div className=\"nb-match__tile nb-match__tile--overlay\" data-state=\"selected\">\n <span className=\"nb-match__tile-text\">\n <RichText text={draggingPair.left} />\n </span>\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n\n <AnimatedFeedback\n show={showMiss}\n tone=\"incorrect\"\n title={t(\"common.incorrect\")}\n text={t(\"match.notAPair\")}\n />\n </ModuleShell>\n );\n}\n\ninterface ColumnProps {\n side: Side;\n label?: string;\n tiles: PairWithId[];\n stateFor: (side: Side, id: string) => TileState;\n onTap: (side: Side, id: string) => void;\n drag: boolean;\n reduced: boolean;\n dragging: string | null;\n t: ReturnType<typeof useNibblearn>[\"t\"];\n}\n\nfunction Column({ side, label, tiles, stateFor, onTap, drag, reduced, dragging, t }: ColumnProps) {\n return (\n <div className=\"nb-match__column\" role=\"group\" aria-label={label}>\n {label && <div className=\"nb-match__label\">{label}</div>}\n <div className=\"nb-match__tiles\">\n <AnimatePresence initial={false}>\n {tiles.map((p) => {\n const state = stateFor(side, p.id);\n const props = {\n pair: p,\n state,\n onTap: () => onTap(side, p.id),\n drag,\n reduced,\n isDragSource: dragging === p.id,\n t,\n };\n return side === \"left\" ? (\n <LeftTile key={p.id} {...props} />\n ) : (\n <RightTile key={p.id} {...props} />\n );\n })}\n </AnimatePresence>\n </div>\n </div>\n );\n}\n\ninterface TileProps {\n pair: PairWithId;\n state: TileState;\n onTap: () => void;\n drag: boolean;\n reduced: boolean;\n isDragSource: boolean;\n t: ReturnType<typeof useNibblearn>[\"t\"];\n}\n\nfunction LeftTile(props: TileProps) {\n const { pair, state, drag } = props;\n const { setNodeRef, listeners, attributes } = useDraggable({\n id: `left-${pair.id}`,\n data: { pairId: pair.id, label: pair.left },\n disabled: !drag || state === \"matched\",\n });\n return (\n <Tile\n {...props}\n side=\"left\"\n text={pair.left}\n setNodeRef={setNodeRef}\n listeners={listeners}\n describedBy={attributes[\"aria-describedby\"]}\n />\n );\n}\n\nfunction RightTile(props: TileProps) {\n const { pair, state } = props;\n const { setNodeRef, isOver } = useDroppable({\n id: `right-${pair.id}`,\n data: { pairId: pair.id, label: pair.right },\n disabled: state === \"matched\",\n });\n return <Tile {...props} side=\"right\" text={pair.right} setNodeRef={setNodeRef} isOver={isOver} />;\n}\n\ninterface TileViewProps extends TileProps {\n side: Side;\n text: string;\n setNodeRef: (el: HTMLElement | null) => void;\n listeners?: Record<string, unknown>;\n describedBy?: string;\n isOver?: boolean;\n}\n\nfunction Tile({\n side,\n text,\n state,\n onTap,\n reduced,\n isDragSource,\n setNodeRef,\n listeners,\n describedBy,\n isOver,\n t,\n}: TileViewProps) {\n const matched = state === \"matched\";\n const shake = state === \"wrong\" && !reduced;\n return (\n <motion.div\n layout={!reduced}\n className=\"nb-match__slot\"\n initial={reduced ? false : { opacity: 0, scale: 0.92 }}\n animate={\n shake\n ? { opacity: 1, scale: 1, x: [0, -8, 8, -6, 6, -3, 3, 0] }\n : { opacity: 1, scale: 1, x: 0 }\n }\n exit={reduced ? { opacity: 0 } : { opacity: 0, scale: 0.86 }}\n transition={\n shake\n ? { duration: SHAKE_MS / 1000, ease: \"easeInOut\" }\n : { duration: reduced ? 0 : 0.22, ease: [0.2, 0.8, 0.2, 1] }\n }\n >\n <button\n ref={setNodeRef}\n type=\"button\"\n className=\"nb-match__tile\"\n data-state={state}\n data-side={side}\n data-over={isOver ? \"true\" : undefined}\n data-dragging={isDragSource ? \"true\" : undefined}\n aria-pressed={state === \"selected\"}\n aria-disabled={matched || undefined}\n aria-describedby={describedBy}\n disabled={matched}\n onClick={onTap}\n {...listeners}\n >\n <span className=\"nb-match__tile-text\">\n <RichText text={text} />\n </span>\n <span className=\"nb-match__tile-mark\" aria-hidden>\n {matched ? <Check strokeWidth={3} /> : state === \"wrong\" ? <X strokeWidth={3} /> : null}\n </span>\n {isOver && !matched && (\n <span className=\"nb-match__drop\" aria-hidden>\n {t(\"match.dropHere\")}\n </span>\n )}\n </button>\n </motion.div>\n );\n}\n\nexport default MatchPairs;\n","import { useCallback, useMemo, useState, type CSSProperties } from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { ArrowDown, ArrowUp, Check, Eye, GripVertical, X } from \"lucide-react\";\nimport {\n DndContext,\n DragOverlay,\n KeyboardSensor,\n PointerSensor,\n TouchSensor,\n closestCenter,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragStartEvent,\n} from \"@dnd-kit/core\";\nimport {\n SortableContext,\n arrayMove,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { restrictToParentElement, restrictToVerticalAxis } from \"@dnd-kit/modifiers\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport {\n evaluateSequence,\n moveItem,\n sequenceBuilderSchema,\n shuffleDerangement,\n type SequenceBuilderConfig,\n type SequenceEvaluation,\n type SequenceItem,\n seedFromString,\n} from \"@nibblearn/core\";\nimport clsx from \"clsx\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Button } from \"../../primitives/Button\";\nimport { AnimatedFeedback } from \"../../primitives/Feedback\";\nimport { Explanation } from \"../../primitives/Explanation\";\nimport { Hint } from \"../../primitives/Hint\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./sequence-builder.css\";\n\nexport type SequenceBuilderProps = ModuleProps<SequenceBuilderConfig>;\n\ntype RowState = \"idle\" | \"correct\" | \"incorrect\";\n\nexport function SequenceBuilder({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: SequenceBuilderProps) {\n const parsed = useMemo(() => sequenceBuilderSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"sequence-builder\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <SequenceBuilderInner\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\nfunction SequenceBuilderInner({\n config,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: SequenceBuilderProps) {\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"sequence-builder\",\n onComplete,\n onEvent,\n resetKey,\n });\n return (\n <SequenceGame\n key={life.runId}\n config={config}\n life={life}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\ninterface GameProps {\n config: SequenceBuilderConfig;\n life: ModuleLifecycle;\n hideHeader?: boolean;\n className?: string;\n}\n\n/** Score: full credit first time, decays per retry; half credit at most when the solution was revealed. */\nfunction sequenceScore(attempts: number, revealed: boolean, lastFraction: number): number {\n if (revealed) return lastFraction * 0.5;\n if (attempts <= 1) return 1;\n return Math.max(0.5, 1 - 0.25 * (attempts - 1));\n}\n\nfunction SequenceGame({ config, life, hideHeader, className }: GameProps) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { behavior } = config;\n const items = config.content.items;\n const total = items.length;\n const correctOrder = useMemo(() => items.map((i) => i.id), [items]);\n const byId = useMemo(() => new Map(items.map((i) => [i.id, i])), [items]);\n\n const [seed] = useState(() => behavior.shuffleSeed ?? seedFromString(config.id, life.runId));\n const [order, setOrder] = useState<string[]>(() => shuffleDerangement(correctOrder, seed));\n const [evaluation, setEvaluation] = useState<SequenceEvaluation | null>(null);\n const [attempts, setAttempts] = useState(0);\n const [revealed, setRevealed] = useState(false);\n const [finished, setFinished] = useState(false);\n const [activeId, setActiveId] = useState<string | null>(null);\n\n const checked = evaluation !== null;\n const locked = checked && (evaluation.correct || revealed);\n const exhausted = behavior.maxAttempts > 0 && attempts >= behavior.maxAttempts;\n const canRetry = checked && !locked && behavior.allowRetry && !exhausted;\n const canReveal = checked && !locked && (attempts >= 2 || exhausted || !behavior.allowRetry);\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n useSensor(TouchSensor, { activationConstraint: { delay: 120, tolerance: 8 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n );\n\n const move = useCallback(\n (from: number, to: number) => {\n if (checked || to < 0 || to >= total || from === to) return;\n setOrder((prev) => moveItem(prev, from, to));\n const item = byId.get(order[from]!);\n life.emit(\"module:interact\", { itemId: order[from], from, to });\n announce(t(\"a11y.movedTo\", { item: item?.text ?? \"\", position: to + 1 }));\n },\n [checked, total, order, byId, life, announce, t],\n );\n\n const onDragStart = useCallback((e: DragStartEvent) => setActiveId(String(e.active.id)), []);\n const onDragEnd = useCallback(\n (e: DragEndEvent) => {\n setActiveId(null);\n const { active, over } = e;\n if (!over || active.id === over.id) return;\n const from = order.indexOf(String(active.id));\n const to = order.indexOf(String(over.id));\n if (from < 0 || to < 0) return;\n setOrder((prev) => arrayMove(prev, from, to));\n life.emit(\"module:interact\", { itemId: active.id, from, to });\n announce(\n t(\"a11y.movedTo\", { item: byId.get(String(active.id))?.text ?? \"\", position: to + 1 }),\n );\n },\n [order, byId, life, announce, t],\n );\n const onDragCancel = useCallback(() => setActiveId(null), []);\n\n const check = useCallback(() => {\n if (checked) return;\n const ev = evaluateSequence(correctOrder, order);\n const n = attempts + 1;\n setAttempts(n);\n life.attempt();\n setEvaluation(ev);\n const willReveal =\n !ev.correct &&\n (!behavior.allowRetry || (behavior.maxAttempts > 0 && n >= behavior.maxAttempts));\n if (willReveal) setRevealed(true);\n life.emit(\"module:answer\", {\n order,\n correct: ev.correct,\n correctCount: ev.correctCount,\n attempts: n,\n });\n announce(\n ev.correct\n ? `${t(\"a11y.correctAnswer\")} ${t(\"seq.allCorrect\")}`\n : `${t(\"a11y.incorrectAnswer\")} ${t(\"seq.correctCount\", { correct: ev.correctCount, total })}`,\n );\n }, [checked, correctOrder, order, attempts, life, behavior, announce, t, total]);\n\n const retry = useCallback(() => {\n setEvaluation(null);\n life.emit(\"module:interact\", { action: \"retry\" });\n }, [life]);\n\n const reveal = useCallback(() => {\n setRevealed(true);\n life.emit(\"module:interact\", { action: \"reveal\" });\n announce(t(\"seq.correctOrder\"));\n }, [life, announce, t]);\n\n const finish = useCallback(() => {\n if (!evaluation) return;\n const score = sequenceScore(attempts, revealed, evaluation.score);\n setFinished(true);\n life.complete({\n score,\n correct: evaluation.correctCount,\n total,\n details: { order, attempts, revealed },\n });\n announce(t(\"a11y.moduleComplete\"));\n }, [evaluation, attempts, revealed, life, total, order, announce, t]);\n\n const rowState = (index: number): RowState => {\n if (!evaluation) return \"idle\";\n return evaluation.positions[index] ? \"correct\" : \"incorrect\";\n };\n\n if (finished && evaluation) {\n const score = sequenceScore(attempts, revealed, evaluation.score);\n return (\n <ModuleShell\n type=\"sequence-builder\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n appearance={config.appearance}\n className={className}\n announcement={message}\n >\n <CompletionCard\n score={score}\n text={\n config.feedback.complete ??\n (evaluation.correct\n ? t(\"seq.allCorrect\")\n : t(\"seq.correctCount\", { correct: evaluation.correctCount, total }))\n }\n stats={[\n { label: t(\"common.correct\"), value: `${evaluation.correctCount}/${total}` },\n { label: t(\"common.attempts\"), value: attempts },\n ]}\n onRetry={() => {\n life.reset();\n life.emit(\"module:reset\");\n }}\n >\n <ol className=\"nb-seq__solution nb-seq__solution--summary\">\n {items.map((item, i) => (\n <li key={item.id} className=\"nb-seq__solution-item\">\n <span className=\"nb-seq__badge nb-seq__badge--solution\">{i + 1}</span>\n <span className=\"nb-seq__solution-text\">\n <RichText text={item.text} />\n </span>\n </li>\n ))}\n </ol>\n </CompletionCard>\n </ModuleShell>\n );\n }\n\n const activeItem = activeId ? byId.get(activeId) : undefined;\n const showSolution = revealed;\n\n return (\n <ModuleShell\n type=\"sequence-builder\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : (config.instructions ?? t(\"seq.instructions\"))}\n appearance={config.appearance}\n className={className}\n announcement={message}\n aside={\n checked ? (\n <span className=\"nb-counter\">\n {t(\"seq.correctCount\", { correct: evaluation.correctCount, total })}\n </span>\n ) : undefined\n }\n >\n <DndContext\n id={`${config.id}-dnd`}\n sensors={sensors}\n collisionDetection={closestCenter}\n modifiers={[restrictToVerticalAxis, restrictToParentElement]}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragCancel={onDragCancel}\n accessibility={{\n screenReaderInstructions: { draggable: t(\"a11y.dragInstructions\") },\n announcements: {\n onDragStart: ({ active }) =>\n t(\"a11y.pickedUp\", { item: byId.get(String(active.id))?.text ?? \"\" }),\n onDragOver: ({ active, over }) =>\n over\n ? t(\"a11y.movedTo\", {\n item: byId.get(String(active.id))?.text ?? \"\",\n position: order.indexOf(String(over.id)) + 1,\n })\n : undefined,\n onDragEnd: ({ active, over }) =>\n over\n ? t(\"a11y.movedTo\", {\n item: byId.get(String(active.id))?.text ?? \"\",\n position: order.indexOf(String(over.id)) + 1,\n })\n : undefined,\n onDragCancel: ({ active }) =>\n t(\"a11y.dropCancelled\", { item: byId.get(String(active.id))?.text ?? \"\" }),\n },\n }}\n >\n <SortableContext items={order} strategy={verticalListSortingStrategy} disabled={checked}>\n <ol className=\"nb-seq__list\" aria-label={config.title}>\n {order.map((id, index) => (\n <SortableRow\n key={id}\n item={byId.get(id)!}\n index={index}\n total={total}\n state={rowState(index)}\n locked={checked}\n showPosition={behavior.showPositions}\n reduced={reduced}\n onMoveUp={() => move(index, index - 1)}\n onMoveDown={() => move(index, index + 1)}\n t={t}\n />\n ))}\n </ol>\n </SortableContext>\n <DragOverlay dropAnimation={reduced ? null : undefined}>\n {activeItem ? (\n <div className=\"nb-seq__row nb-seq__row--overlay\" data-state=\"idle\">\n {behavior.showPositions && (\n <span className=\"nb-seq__badge\">{order.indexOf(activeItem.id) + 1}</span>\n )}\n <span className=\"nb-seq__handle\" aria-hidden>\n <GripVertical />\n </span>\n <span className=\"nb-seq__text\">\n <RichText text={activeItem.text} />\n </span>\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n\n {!checked && <Hint text={config.content.hint} onReveal={() => life.emit(\"module:hint\")} />}\n\n <AnimatedFeedback\n show={checked}\n tone={\n evaluation?.correct\n ? \"correct\"\n : evaluation && evaluation.correctCount > 0\n ? \"partial\"\n : \"incorrect\"\n }\n title={evaluation?.correct ? t(\"seq.allCorrect\") : t(\"common.incorrect\")}\n text={\n evaluation\n ? evaluation.correct\n ? (config.feedback.correct ?? undefined)\n : (config.feedback.incorrect ??\n t(\"seq.correctCount\", { correct: evaluation.correctCount, total }))\n : undefined\n }\n />\n\n <AnimatePresence initial={false}>\n {showSolution && (\n <motion.section\n key=\"solution\"\n className=\"nb-seq__solution-panel\"\n aria-label={t(\"seq.correctOrder\")}\n initial={reduced ? false : { opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0 }}\n transition={{ duration: reduced ? 0 : 0.24, ease: [0.2, 0.8, 0.2, 1] }}\n >\n <h4 className=\"nb-seq__solution-title\">\n <Eye aria-hidden size={16} />\n {t(\"seq.correctOrder\")}\n </h4>\n <ol className=\"nb-seq__solution\">\n {items.map((item, i) => (\n <li key={item.id} className=\"nb-seq__solution-item\">\n <span className=\"nb-seq__badge nb-seq__badge--solution\">{i + 1}</span>\n <div className=\"nb-seq__solution-body\">\n <span className=\"nb-seq__solution-text\">\n <RichText text={item.text} />\n </span>\n {item.description && (\n <span className=\"nb-seq__solution-desc\">\n <RichText text={item.description} />\n </span>\n )}\n </div>\n </li>\n ))}\n </ol>\n </motion.section>\n )}\n </AnimatePresence>\n\n {locked && behavior.showExplanation && <Explanation text={config.content.explanation} />}\n\n <div className=\"nb-seq__footer\">\n <span className=\"nb-muted nb-text-sm\">\n {checked && !locked ? t(\"common.attempts\") + `: ${attempts}` : \"\"}\n </span>\n <div className=\"nb-module__actions\">\n {canReveal && (\n <Button variant=\"ghost\" onClick={reveal} leading={<Eye aria-hidden />}>\n {t(\"seq.showSolution\")}\n </Button>\n )}\n {canRetry && (\n <Button variant=\"secondary\" onClick={retry}>\n {t(\"common.retry\")}\n </Button>\n )}\n {!checked ? (\n <Button variant=\"primary\" onClick={check}>\n {t(\"common.check\")}\n </Button>\n ) : (\n locked && (\n <Button variant=\"primary\" onClick={finish} autoFocus>\n {t(\"common.finish\")}\n </Button>\n )\n )}\n </div>\n </div>\n </ModuleShell>\n );\n}\n\ninterface RowProps {\n item: SequenceItem;\n index: number;\n total: number;\n state: RowState;\n locked: boolean;\n showPosition: boolean;\n reduced: boolean;\n onMoveUp: () => void;\n onMoveDown: () => void;\n t: ReturnType<typeof useNibblearn>[\"t\"];\n}\n\nfunction SortableRow({\n item,\n index,\n total,\n state,\n locked,\n showPosition,\n reduced,\n onMoveUp,\n onMoveDown,\n t,\n}: RowProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n setActivatorNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: item.id, disabled: locked });\n const style: CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition: reduced ? undefined : transition,\n };\n const position = t(\"seq.position\", { position: index + 1 });\n return (\n <li\n ref={setNodeRef}\n style={style}\n className={clsx(\"nb-seq__row\", isDragging && \"nb-seq__row--ghost\")}\n data-state={state}\n aria-label={`${position}: ${item.text}`}\n >\n {showPosition && (\n <span className=\"nb-seq__badge\" aria-hidden>\n {index + 1}\n </span>\n )}\n <button\n ref={setActivatorNodeRef}\n type=\"button\"\n className=\"nb-seq__handle\"\n aria-label={item.text}\n disabled={locked}\n {...attributes}\n {...listeners}\n >\n <GripVertical aria-hidden />\n </button>\n <span className=\"nb-seq__text\">\n <RichText text={item.text} />\n </span>\n <span className=\"nb-seq__mark\" aria-hidden>\n {state === \"correct\" ? (\n <Check strokeWidth={3} />\n ) : state === \"incorrect\" ? (\n <X strokeWidth={3} />\n ) : null}\n </span>\n <span className=\"nb-seq__controls\">\n <Button\n icon\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`${t(\"a11y.moveUp\")}: ${item.text}`}\n disabled={locked || index === 0}\n onClick={onMoveUp}\n >\n <ArrowUp aria-hidden />\n </Button>\n <Button\n icon\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`${t(\"a11y.moveDown\")}: ${item.text}`}\n disabled={locked || index === total - 1}\n onClick={onMoveDown}\n >\n <ArrowDown aria-hidden />\n </Button>\n </span>\n </li>\n );\n}\n\nexport default SequenceBuilder;\n","import { useCallback, useMemo, useState, type CSSProperties } from \"react\";\nimport { LayoutGroup, motion } from \"motion/react\";\nimport { Check, CornerUpLeft, Eye, X } from \"lucide-react\";\nimport {\n DndContext,\n DragOverlay,\n PointerSensor,\n TouchSensor,\n useDraggable,\n useDroppable,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragStartEvent,\n} from \"@dnd-kit/core\";\nimport {\n categorySortSchema,\n evaluateCategorySort,\n shuffle,\n type Category,\n type CategorySortConfig,\n type CategorySortEvaluation,\n type SortItem,\n seedFromString,\n} from \"@nibblearn/core\";\nimport clsx from \"clsx\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Button } from \"../../primitives/Button\";\nimport { AnimatedFeedback } from \"../../primitives/Feedback\";\nimport { Hint } from \"../../primitives/Hint\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./category-sort.css\";\n\nexport type CategorySortProps = ModuleProps<CategorySortConfig>;\n\ntype ChipState = \"idle\" | \"selected\" | \"correct\" | \"incorrect\" | \"locked\" | \"revealed\";\ntype Assignments = Record<string, string | undefined>;\n\nconst POOL_ID = \"__pool\";\nconst COLOR_TOKENS: Record<string, string> = {\n accent: \"var(--nb-accent)\",\n success: \"var(--nb-success)\",\n info: \"var(--nb-info)\",\n warning: \"var(--nb-warning)\",\n};\n\nfunction categoryStyle(color?: string): CSSProperties | undefined {\n if (!color) return undefined;\n const token = Object.prototype.hasOwnProperty.call(COLOR_TOKENS, color)\n ? COLOR_TOKENS[color]\n : undefined;\n return { \"--nb-sort-color\": token ?? color } as CSSProperties;\n}\n\n/** Fraction correct on the first check; if eventually all correct, decays 0.25 per extra attempt down to 0.5. */\nfunction sortScore(attempts: number, allCorrect: boolean, firstFraction: number): number {\n if (allCorrect) return attempts <= 1 ? 1 : Math.max(0.5, 1 - 0.25 * (attempts - 1));\n return firstFraction;\n}\n\nexport function CategorySort({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: CategorySortProps) {\n const parsed = useMemo(() => categorySortSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"category-sort\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <CategorySortInner\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\nfunction CategorySortInner({\n config,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: CategorySortProps) {\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"category-sort\",\n onComplete,\n onEvent,\n resetKey,\n });\n return (\n <CategorySortGame\n key={life.runId}\n config={config}\n life={life}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\ninterface GameProps {\n config: CategorySortConfig;\n life: ModuleLifecycle;\n hideHeader?: boolean;\n className?: string;\n}\n\nfunction CategorySortGame({ config, life, hideHeader, className }: GameProps) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { behavior } = config;\n const { categories, items } = config.content;\n const total = items.length;\n const itemById = useMemo(() => new Map(items.map((i) => [i.id, i])), [items]);\n const categoryById = useMemo(() => new Map(categories.map((c) => [c.id, c])), [categories]);\n\n const [seed] = useState(() => behavior.shuffleSeed ?? seedFromString(config.id, life.runId));\n const order = useMemo(\n () => (behavior.shuffle ? shuffle(items, seed) : items),\n [items, behavior.shuffle, seed],\n );\n\n const [assignments, setAssignments] = useState<Assignments>({});\n const [selected, setSelected] = useState<string | null>(null);\n const [evaluation, setEvaluation] = useState<CategorySortEvaluation | null>(null);\n const [lockedIds, setLockedIds] = useState<string[]>([]);\n const [attempts, setAttempts] = useState(0);\n const [firstFraction, setFirstFraction] = useState<number | null>(null);\n const [revealed, setRevealed] = useState(false);\n const [finished, setFinished] = useState(false);\n const [activeId, setActiveId] = useState<string | null>(null);\n\n const checked = evaluation !== null;\n const locked = checked && (evaluation.correct || revealed);\n const exhausted = behavior.maxAttempts > 0 && attempts >= behavior.maxAttempts;\n const canRetry = checked && !locked && behavior.allowRetry && !exhausted;\n const canReveal = checked && !locked && (attempts >= 2 || exhausted || !behavior.allowRetry);\n const placedCount = items.filter((i) => assignments[i.id]).length;\n const itemsLeft = total - placedCount;\n const poolItems = order.filter((i) => !assignments[i.id]);\n const isMovable = useCallback(\n (id: string) => !checked && !lockedIds.includes(id),\n [checked, lockedIds],\n );\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n useSensor(TouchSensor, { activationConstraint: { delay: 120, tolerance: 8 } }),\n );\n\n const place = useCallback(\n (itemId: string, categoryId: string | undefined) => {\n const item = itemById.get(itemId);\n if (!item || !isMovable(itemId)) return;\n setAssignments((prev) => ({ ...prev, [itemId]: categoryId }));\n setSelected(null);\n life.emit(\"module:interact\", { itemId, categoryId: categoryId ?? null });\n const category = categoryId ? categoryById.get(categoryId) : undefined;\n announce(\n category\n ? t(\"sort.placed\", { item: item.text, category: category.label })\n : `${item.text}: ${t(\"sort.unsorted\")}`,\n );\n },\n [itemById, isMovable, life, categoryById, announce, t],\n );\n\n const toggleSelect = useCallback(\n (itemId: string) => {\n if (!isMovable(itemId)) return;\n setSelected((prev) => (prev === itemId ? null : itemId));\n },\n [isMovable],\n );\n\n const onDragStart = useCallback((e: DragStartEvent) => {\n const id = String(e.active.id);\n setActiveId(id);\n setSelected(id);\n }, []);\n const onDragEnd = useCallback(\n (e: DragEndEvent) => {\n setActiveId(null);\n const itemId = String(e.active.id);\n if (!e.over) {\n setSelected(null);\n return;\n }\n const target = String(e.over.id);\n place(itemId, target === POOL_ID ? undefined : target);\n },\n [place],\n );\n const onDragCancel = useCallback(() => {\n setActiveId(null);\n setSelected(null);\n }, []);\n\n const check = useCallback(() => {\n if (checked || itemsLeft > 0) return;\n const ev = evaluateCategorySort(items, assignments);\n const n = attempts + 1;\n setAttempts(n);\n life.attempt();\n setEvaluation(ev);\n setSelected(null);\n if (firstFraction === null) setFirstFraction(ev.score);\n const willReveal =\n !ev.correct &&\n (!behavior.allowRetry || (behavior.maxAttempts > 0 && n >= behavior.maxAttempts));\n if (willReveal) {\n setRevealed(true);\n setAssignments(Object.fromEntries(items.map((i) => [i.id, i.categoryId])));\n }\n life.emit(\"module:answer\", {\n assignments,\n correct: ev.correct,\n correctCount: ev.correctCount,\n attempts: n,\n });\n announce(\n ev.correct\n ? `${t(\"a11y.correctAnswer\")} ${t(\"sort.allCorrect\")}`\n : `${t(\"a11y.incorrectAnswer\")} ${t(\"sort.correctCount\", { correct: ev.correctCount, total })}`,\n );\n }, [\n checked,\n itemsLeft,\n items,\n assignments,\n attempts,\n life,\n firstFraction,\n behavior,\n announce,\n t,\n total,\n ]);\n\n const retry = useCallback(() => {\n if (!evaluation) return;\n const correctIds = items.filter((i) => evaluation.items[i.id]).map((i) => i.id);\n setLockedIds(correctIds);\n setAssignments((prev) =>\n Object.fromEntries(items.map((i) => [i.id, evaluation.items[i.id] ? prev[i.id] : undefined])),\n );\n setEvaluation(null);\n life.emit(\"module:interact\", { action: \"retry\" });\n }, [evaluation, items, life]);\n\n const reveal = useCallback(() => {\n setRevealed(true);\n setAssignments(Object.fromEntries(items.map((i) => [i.id, i.categoryId])));\n life.emit(\"module:interact\", { action: \"reveal\" });\n announce(t(\"common.showAnswer\"));\n }, [items, life, announce, t]);\n\n const finish = useCallback(() => {\n if (!evaluation) return;\n const score = sortScore(attempts, evaluation.correct, firstFraction ?? 0);\n setFinished(true);\n life.complete({\n score,\n correct: evaluation.correctCount,\n total,\n details: { attempts, revealed, firstFraction },\n });\n announce(t(\"a11y.moduleComplete\"));\n }, [evaluation, attempts, firstFraction, life, total, revealed, announce, t]);\n\n const chipState = (itemId: string): ChipState => {\n if (revealed && evaluation && !evaluation.items[itemId]) return \"revealed\";\n if (evaluation) return evaluation.items[itemId] ? \"correct\" : \"incorrect\";\n if (lockedIds.includes(itemId)) return \"locked\";\n if (selected === itemId) return \"selected\";\n return \"idle\";\n };\n\n if (finished && evaluation) {\n const score = sortScore(attempts, evaluation.correct, firstFraction ?? 0);\n return (\n <ModuleShell\n type=\"category-sort\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n appearance={config.appearance}\n className={className}\n announcement={message}\n >\n <CompletionCard\n score={score}\n text={\n config.feedback.complete ??\n (evaluation.correct\n ? t(\"sort.allCorrect\")\n : t(\"sort.correctCount\", { correct: evaluation.correctCount, total }))\n }\n stats={[\n { label: t(\"common.correct\"), value: `${evaluation.correctCount}/${total}` },\n { label: t(\"common.attempts\"), value: attempts },\n ]}\n onRetry={() => {\n life.reset();\n life.emit(\"module:reset\");\n }}\n >\n <ul className=\"nb-sort__summary\">\n {categories.map((c) => (\n <li key={c.id} className=\"nb-sort__summary-cat\" style={categoryStyle(c.color)}>\n <span className=\"nb-sort__summary-label\">{c.label}</span>\n <span className=\"nb-sort__summary-items\">\n {items\n .filter((i) => i.categoryId === c.id)\n .map((i) => i.text)\n .join(\" · \")}\n </span>\n </li>\n ))}\n </ul>\n </CompletionCard>\n </ModuleShell>\n );\n }\n\n const activeItem = activeId ? itemById.get(activeId) : undefined;\n const selectedItem = selected ? itemById.get(selected) : undefined;\n\n return (\n <ModuleShell\n type=\"category-sort\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : (config.instructions ?? t(\"sort.instructions\"))}\n appearance={config.appearance}\n className={className}\n width=\"wide\"\n announcement={message}\n aside={\n <span className=\"nb-counter\">\n {checked\n ? t(\"sort.correctCount\", { correct: evaluation.correctCount, total })\n : t(\"sort.itemsLeft\", { count: itemsLeft })}\n </span>\n }\n >\n <DndContext\n id={`${config.id}-dnd`}\n sensors={sensors}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragCancel={onDragCancel}\n accessibility={{\n screenReaderInstructions: { draggable: t(\"a11y.dragInstructions\") },\n announcements: {\n onDragStart: ({ active }) =>\n t(\"a11y.pickedUp\", { item: itemById.get(String(active.id))?.text ?? \"\" }),\n onDragOver: ({ over }) =>\n over && over.id !== POOL_ID\n ? t(\"sort.placeIn\", { category: categoryById.get(String(over.id))?.label ?? \"\" })\n : undefined,\n onDragEnd: () => undefined,\n onDragCancel: ({ active }) =>\n t(\"a11y.dropCancelled\", { item: itemById.get(String(active.id))?.text ?? \"\" }),\n },\n }}\n >\n <LayoutGroup id={config.id}>\n <Pool\n items={poolItems}\n chipState={chipState}\n isMovable={isMovable}\n selectedItem={selectedItem}\n onSelect={toggleSelect}\n onReturn={(id) => place(id, undefined)}\n reduced={reduced}\n t={t}\n />\n\n <div className=\"nb-sort__zones\" data-count={categories.length}>\n {categories.map((c) => (\n <Zone\n key={c.id}\n category={c}\n items={items.filter((i) => assignments[i.id] === c.id)}\n chipState={chipState}\n isMovable={isMovable}\n selectedItem={selectedItem}\n showExplanation={checked && behavior.showExplanation}\n categoryById={categoryById}\n onSelect={toggleSelect}\n onPlace={(id) => place(id, c.id)}\n onRemove={(id) => place(id, undefined)}\n reduced={reduced}\n t={t}\n />\n ))}\n </div>\n </LayoutGroup>\n\n <DragOverlay dropAnimation={reduced ? null : undefined}>\n {activeItem ? (\n <div className=\"nb-sort__chip nb-sort__chip--overlay\" data-state=\"selected\">\n <span className=\"nb-sort__chip-text\">\n <RichText text={activeItem.text} />\n </span>\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n\n {!checked && <Hint text={config.content.hint} onReveal={() => life.emit(\"module:hint\")} />}\n\n <AnimatedFeedback\n show={checked}\n tone={\n evaluation?.correct\n ? \"correct\"\n : evaluation && evaluation.correctCount > 0\n ? \"partial\"\n : \"incorrect\"\n }\n title={evaluation?.correct ? t(\"sort.allCorrect\") : t(\"common.incorrect\")}\n text={\n evaluation\n ? evaluation.correct\n ? (config.feedback.correct ?? undefined)\n : (config.feedback.incorrect ??\n t(\"sort.correctCount\", { correct: evaluation.correctCount, total }))\n : undefined\n }\n />\n\n <div className=\"nb-sort__footer\">\n <span className=\"nb-muted nb-text-sm\">\n {!checked && itemsLeft > 0 ? t(\"sort.itemsLeft\", { count: itemsLeft }) : \"\"}\n </span>\n <div className=\"nb-module__actions\">\n {canReveal && (\n <Button variant=\"ghost\" onClick={reveal} leading={<Eye aria-hidden />}>\n {t(\"common.showAnswer\")}\n </Button>\n )}\n {canRetry && (\n <Button variant=\"secondary\" onClick={retry}>\n {t(\"common.retry\")}\n </Button>\n )}\n {!checked ? (\n <Button variant=\"primary\" onClick={check} disabled={itemsLeft > 0}>\n {t(\"common.check\")}\n </Button>\n ) : (\n locked && (\n <Button variant=\"primary\" onClick={finish} autoFocus>\n {t(\"common.finish\")}\n </Button>\n )\n )}\n </div>\n </div>\n </ModuleShell>\n );\n}\n\ntype Translator = ReturnType<typeof useNibblearn>[\"t\"];\n\ninterface PoolProps {\n items: SortItem[];\n chipState: (id: string) => ChipState;\n isMovable: (id: string) => boolean;\n selectedItem?: SortItem;\n onSelect: (id: string) => void;\n onReturn: (id: string) => void;\n reduced: boolean;\n t: Translator;\n}\n\nfunction Pool({\n items,\n chipState,\n isMovable,\n selectedItem,\n onSelect,\n onReturn,\n reduced,\n t,\n}: PoolProps) {\n const { setNodeRef, isOver } = useDroppable({ id: POOL_ID });\n const canReturn = selectedItem && !items.some((i) => i.id === selectedItem.id);\n return (\n <section\n ref={setNodeRef}\n className=\"nb-sort__pool\"\n data-over={isOver ? \"true\" : undefined}\n data-empty={items.length === 0 ? \"true\" : undefined}\n aria-label={t(\"sort.unsorted\")}\n >\n <div className=\"nb-sort__pool-head\">\n <span className=\"nb-sort__pool-label\">{t(\"sort.unsorted\")}</span>\n {canReturn && (\n <Button\n size=\"sm\"\n variant=\"soft\"\n leading={<CornerUpLeft aria-hidden />}\n onClick={() => onReturn(selectedItem.id)}\n >\n {t(\"sort.removeFrom\")}\n </Button>\n )}\n </div>\n <div className=\"nb-sort__chips\">\n {items.map((item) => (\n <Chip\n key={item.id}\n item={item}\n state={chipState(item.id)}\n draggable={isMovable(item.id)}\n onSelect={() => onSelect(item.id)}\n reduced={reduced}\n />\n ))}\n {items.length === 0 && (\n <span className=\"nb-sort__empty\">{t(\"sort.itemsLeft\", { count: 0 })}</span>\n )}\n </div>\n </section>\n );\n}\n\ninterface ZoneProps {\n category: Category;\n items: SortItem[];\n chipState: (id: string) => ChipState;\n isMovable: (id: string) => boolean;\n selectedItem?: SortItem;\n showExplanation: boolean;\n categoryById: Map<string, Category>;\n onSelect: (id: string) => void;\n onPlace: (id: string) => void;\n onRemove: (id: string) => void;\n reduced: boolean;\n t: Translator;\n}\n\nfunction Zone({\n category,\n items,\n chipState,\n isMovable,\n selectedItem,\n showExplanation,\n categoryById,\n onSelect,\n onPlace,\n onRemove,\n reduced,\n t,\n}: ZoneProps) {\n const { setNodeRef, isOver } = useDroppable({ id: category.id });\n const canPlace = selectedItem && !items.some((i) => i.id === selectedItem.id);\n const placeLabel = t(\"sort.placeIn\", { category: category.label });\n return (\n <section\n ref={setNodeRef}\n className={clsx(\"nb-sort__zone\", canPlace && \"nb-sort__zone--target\")}\n style={categoryStyle(category.color)}\n data-over={isOver ? \"true\" : undefined}\n aria-label={category.label}\n onClick={canPlace ? () => onPlace(selectedItem.id) : undefined}\n >\n <header className=\"nb-sort__zone-head\">\n <div className=\"nb-sort__zone-title\">\n <span className=\"nb-sort__zone-label\">{category.label}</span>\n <span className=\"nb-sort__zone-count\" aria-hidden>\n {items.length}\n </span>\n </div>\n {category.description && (\n <p className=\"nb-sort__zone-desc\">\n <RichText text={category.description} />\n </p>\n )}\n </header>\n <div className=\"nb-sort__zone-body\">\n {items.map((item) => {\n const state = chipState(item.id);\n const wrong = state === \"incorrect\" || state === \"revealed\";\n const belongs = wrong ? categoryById.get(item.categoryId) : undefined;\n return (\n <div key={item.id} className=\"nb-sort__placed\">\n <div className=\"nb-sort__placed-row\">\n <Chip\n item={item}\n state={state}\n draggable={isMovable(item.id)}\n onSelect={() => onSelect(item.id)}\n reduced={reduced}\n />\n {isMovable(item.id) && (\n <Button\n icon\n size=\"sm\"\n variant=\"ghost\"\n className=\"nb-sort__remove\"\n aria-label={`${t(\"sort.removeFrom\")}: ${item.text}`}\n onClick={(e) => {\n e.stopPropagation();\n onRemove(item.id);\n }}\n >\n <X aria-hidden />\n </Button>\n )}\n </div>\n {wrong && belongs && (\n <div className=\"nb-sort__note\">\n <span className=\"nb-sort__note-title\">\n {t(\"sort.belongsIn\", { category: belongs.label })}\n </span>\n {showExplanation && item.explanation && (\n <span className=\"nb-sort__note-text\">\n <RichText text={item.explanation} />\n </span>\n )}\n </div>\n )}\n {state === \"correct\" && showExplanation && item.explanation && (\n <div className=\"nb-sort__note nb-sort__note--ok\">\n <span className=\"nb-sort__note-text\">\n <RichText text={item.explanation} />\n </span>\n </div>\n )}\n </div>\n );\n })}\n {items.length === 0 && !canPlace && (\n <span className=\"nb-sort__empty\" aria-hidden>\n {t(\"match.dropHere\")}\n </span>\n )}\n {canPlace && (\n <Button\n size=\"sm\"\n variant=\"soft\"\n className=\"nb-sort__place\"\n aria-label={placeLabel}\n onClick={(e) => {\n e.stopPropagation();\n onPlace(selectedItem.id);\n }}\n >\n {placeLabel}\n </Button>\n )}\n </div>\n </section>\n );\n}\n\ninterface ChipProps {\n item: SortItem;\n state: ChipState;\n draggable: boolean;\n onSelect: () => void;\n reduced: boolean;\n}\n\nfunction Chip({ item, state, draggable, onSelect, reduced }: ChipProps) {\n const { setNodeRef, listeners, attributes, isDragging } = useDraggable({\n id: item.id,\n disabled: !draggable,\n });\n const marked =\n state === \"correct\" || state === \"incorrect\" || state === \"revealed\" || state === \"locked\";\n return (\n <motion.div\n layoutId={reduced ? undefined : item.id}\n layout={!reduced}\n className=\"nb-sort__chip-slot\"\n transition={{ type: \"spring\", stiffness: 420, damping: 32 }}\n >\n <button\n ref={setNodeRef}\n type=\"button\"\n className=\"nb-sort__chip\"\n data-state={state}\n data-dragging={isDragging ? \"true\" : undefined}\n aria-pressed={state === \"selected\"}\n aria-disabled={!draggable || undefined}\n aria-describedby={attributes[\"aria-describedby\"]}\n onClick={(e) => {\n e.stopPropagation();\n onSelect();\n }}\n {...listeners}\n >\n <span className=\"nb-sort__chip-text\">\n <RichText text={item.text} />\n </span>\n {marked && (\n <span className=\"nb-sort__chip-mark\" aria-hidden>\n {state === \"incorrect\" ? <X strokeWidth={3} /> : <Check strokeWidth={3} />}\n </span>\n )}\n </button>\n </motion.div>\n );\n}\n\nexport default CategorySort;\n","import {\n Fragment,\n useCallback,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n} from \"react\";\nimport { motion } from \"motion/react\";\nimport { Check, Lightbulb, X } from \"lucide-react\";\nimport clsx from \"clsx\";\nimport {\n attemptScore,\n buildWordBank,\n evaluateFillBlanks,\n fillBlanksSchema,\n parseTemplate,\n type Blank,\n type FillBlanksConfig,\n type FillBlanksEvaluation,\n type WordBankEntry,\n} from \"@nibblearn/core\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Button } from \"../../primitives/Button\";\nimport { AnimatedFeedback } from \"../../primitives/Feedback\";\nimport { Explanation } from \"../../primitives/Explanation\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./fill-blanks.css\";\n\nexport type FillBlanksProps = ModuleProps<FillBlanksConfig>;\n\nexport function FillBlanks({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: FillBlanksProps) {\n const parsed = useMemo(() => fillBlanksSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"fill-blanks\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <FillBlanksLifecycle\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\nfunction FillBlanksLifecycle({\n config,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: FillBlanksProps) {\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"fill-blanks\",\n onComplete,\n onEvent,\n resetKey,\n });\n // Keying the body on runId resets every piece of local state on reset/retry.\n return (\n <FillBlanksBody\n key={life.runId}\n config={config}\n life={life}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\ninterface BodyProps {\n config: FillBlanksConfig;\n life: ModuleLifecycle;\n hideHeader?: boolean;\n className?: string;\n}\n\ntype SlotState = \"empty\" | \"filled\" | \"selected\" | \"correct\" | \"incorrect\";\n\nfunction FillBlanksBody({ config, life, hideHeader, className }: BodyProps) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { content, behavior } = config;\n const isBank = behavior.mode === \"word-bank\";\n\n const segments = useMemo(() => parseTemplate(content.template), [content.template]);\n const blankOrder = useMemo(\n () => segments.filter((s) => s.kind === \"blank\").map((s) => s.id),\n [segments],\n );\n const blankById = useMemo(() => new Map(content.blanks.map((b) => [b.id, b])), [content.blanks]);\n const bank = useMemo<WordBankEntry[]>(\n () =>\n buildWordBank(content.blanks, content.distractors, {\n shuffle: behavior.shuffleBank,\n seed: 17 + life.runId * 131,\n }),\n [content.blanks, content.distractors, behavior.shuffleBank, life.runId],\n );\n const chipById = useMemo(() => new Map(bank.map((c) => [c.id, c])), [bank]);\n const longestAnswer = useMemo(\n () =>\n Math.max(\n 6,\n ...content.blanks.flatMap((b) => b.answers.map((a) => a.length)),\n ...content.distractors.map((d) => d.length),\n ),\n [content.blanks, content.distractors],\n );\n\n // Word-bank: blankId -> chipId. Typed: blankId -> text.\n const [placed, setPlaced] = useState<Record<string, string>>({});\n const [typed, setTyped] = useState<Record<string, string>>({});\n const [selectedBlank, setSelectedBlank] = useState<string | null>(null);\n const [openHints, setOpenHints] = useState<string[]>([]);\n const [evaluation, setEvaluation] = useState<FillBlanksEvaluation | null>(null);\n const [attempts, setAttempts] = useState(0);\n const [locked, setLocked] = useState(false);\n const [finalScore, setFinalScore] = useState(0);\n\n const slotRefs = useRef(new Map<string, HTMLButtonElement | HTMLInputElement>());\n const checkRef = useRef<HTMLButtonElement>(null);\n\n const answers = useMemo<Record<string, string | undefined>>(() => {\n const out: Record<string, string | undefined> = {};\n for (const id of blankOrder) {\n out[id] = isBank ? chipById.get(placed[id] ?? \"\")?.text : typed[id];\n }\n return out;\n }, [blankOrder, isBank, chipById, placed, typed]);\n\n const allFilled = blankOrder.every((id) => (answers[id] ?? \"\").trim().length > 0);\n const checked = evaluation !== null;\n const usedChipIds = useMemo(() => new Set(Object.values(placed)), [placed]);\n\n const focusSlot = useCallback((id: string | null) => {\n requestAnimationFrame(() => {\n if (id) slotRefs.current.get(id)?.focus();\n else checkRef.current?.focus();\n });\n }, []);\n\n const nextEmpty = useCallback(\n (map: Record<string, string>, after?: string) => {\n const start = after ? blankOrder.indexOf(after) + 1 : 0;\n const ordered = [...blankOrder.slice(start), ...blankOrder.slice(0, start)];\n return ordered.find((id) => !map[id]) ?? null;\n },\n [blankOrder],\n );\n\n const placeChip = useCallback(\n (chipId: string) => {\n if (checked || locked || usedChipIds.has(chipId)) return;\n const target = selectedBlank && !placed[selectedBlank] ? selectedBlank : nextEmpty(placed);\n if (!target) return;\n const next = { ...placed, [target]: chipId };\n setPlaced(next);\n setSelectedBlank(null);\n life.emit(\"module:interact\", { blankId: target, word: chipById.get(chipId)?.text });\n focusSlot(nextEmpty(next, target));\n },\n [checked, locked, usedChipIds, selectedBlank, placed, nextEmpty, life, chipById, focusSlot],\n );\n\n const onSlotClick = useCallback(\n (id: string) => {\n if (locked) return;\n if (placed[id]) {\n if (checked && evaluation?.blanks[id]) return; // keep correct words after a check\n const next = { ...placed };\n delete next[id];\n setPlaced(next);\n setSelectedBlank(id);\n if (checked) setEvaluation(null);\n life.emit(\"module:interact\", { blankId: id, removed: true });\n return;\n }\n setSelectedBlank((prev) => (prev === id ? null : id));\n },\n [locked, placed, checked, evaluation, life],\n );\n\n const toggleHint = useCallback(\n (id: string) => {\n setOpenHints((prev) => {\n if (prev.includes(id)) return prev.filter((x) => x !== id);\n life.emit(\"module:hint\", { blankId: id });\n return [...prev, id];\n });\n },\n [life],\n );\n\n const check = useCallback(() => {\n if (!allFilled || checked || locked) return;\n const ev = evaluateFillBlanks(content.blanks, answers, {\n caseSensitive: behavior.caseSensitive,\n lenient: behavior.lenient,\n });\n const n = attempts + 1;\n setAttempts(n);\n life.attempt();\n setEvaluation(ev);\n setSelectedBlank(null);\n const exhausted = behavior.maxAttempts > 0 && n >= behavior.maxAttempts;\n const done = ev.correct || !behavior.allowRetry || exhausted;\n life.emit(\"module:answer\", {\n answers,\n correct: ev.correct,\n correctCount: ev.correctCount,\n attempts: n,\n });\n announce(\n ev.correct\n ? t(\"a11y.correctAnswer\")\n : `${t(\"a11y.incorrectAnswer\")} ${t(\"fill.correctCount\", { correct: ev.correctCount, total: content.blanks.length })}`,\n );\n if (done) {\n const score = ev.correct ? Math.max(0.5, attemptScore(n)) : ev.score * attemptScore(n);\n setLocked(true);\n setFinalScore(score);\n life.complete({\n score,\n correct: ev.correctCount,\n total: content.blanks.length,\n details: { answers, attempts: n },\n });\n announce(t(\"a11y.moduleComplete\"));\n }\n }, [allFilled, checked, locked, content.blanks, answers, behavior, attempts, life, announce, t]);\n\n const retry = useCallback(() => {\n if (!evaluation) return;\n const wrong = blankOrder.filter((id) => !evaluation.blanks[id]);\n if (isBank) {\n const next = { ...placed };\n for (const id of wrong) delete next[id];\n setPlaced(next);\n } else {\n const next = { ...typed };\n for (const id of wrong) next[id] = \"\";\n setTyped(next);\n }\n setEvaluation(null);\n setSelectedBlank(null);\n focusSlot(wrong[0] ?? null);\n }, [evaluation, blankOrder, isBank, placed, typed, focusSlot]);\n\n const onInputKey = useCallback(\n (e: ReactKeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (checked && !locked) retry();\n else check();\n }\n },\n [check, checked, locked, retry],\n );\n\n const slotState = (id: string): SlotState => {\n const filled = (answers[id] ?? \"\").trim().length > 0;\n if (checked && evaluation) return evaluation.blanks[id] ? \"correct\" : \"incorrect\";\n if (selectedBlank === id && !filled) return \"selected\";\n return filled ? \"filled\" : \"empty\";\n };\n\n const total = content.blanks.length;\n const tone = evaluation\n ? evaluation.correct\n ? \"correct\"\n : evaluation.correctCount > 0\n ? \"partial\"\n : \"incorrect\"\n : \"info\";\n const feedbackTitle = evaluation\n ? evaluation.correct\n ? t(\"fill.allCorrect\")\n : t(\"fill.correctCount\", { correct: evaluation.correctCount, total })\n : \"\";\n const feedbackText = evaluation\n ? evaluation.correct\n ? (config.feedback.correct ?? undefined)\n : (config.feedback.incorrect ?? (!locked ? t(\"common.tryAgainLater\") : undefined))\n : undefined;\n\n const renderSlot = (blank: Blank, index: number) => {\n const id = blank.id;\n const state = slotState(id);\n const text = answers[id] ?? \"\";\n const invalid = state === \"incorrect\";\n const showAnswer = locked && invalid;\n const hintOpen = openHints.includes(id);\n const chipId = placed[id];\n return (\n <span className=\"nb-fill__slot-wrap\" data-state={state}>\n {isBank ? (\n <button\n ref={(el) => {\n if (el) slotRefs.current.set(id, el);\n else slotRefs.current.delete(id);\n }}\n type=\"button\"\n className=\"nb-fill__slot\"\n data-state={state}\n aria-label={\n text\n ? `${t(\"fill.blank\", { index })}: ${text}. ${t(\"fill.removeWord\")}`\n : t(\"fill.blank\", { index })\n }\n aria-pressed={state === \"selected\"}\n aria-invalid={invalid || undefined}\n disabled={locked}\n onClick={() => onSlotClick(id)}\n style={{ [\"--_ch\" as string]: `${longestAnswer}ch` }}\n >\n {chipId ? (\n <motion.span\n className=\"nb-fill__word\"\n layoutId={reduced ? undefined : `${life.runId}-${chipId}`}\n >\n {text}\n </motion.span>\n ) : (\n <span className=\"nb-fill__placeholder\" aria-hidden>\n {index}\n </span>\n )}\n {(state === \"correct\" || state === \"incorrect\") && (\n <span className=\"nb-fill__mark\" aria-hidden>\n {state === \"correct\" ? <Check strokeWidth={3} /> : <X strokeWidth={3} />}\n </span>\n )}\n </button>\n ) : (\n <span\n className=\"nb-fill__slot nb-fill__slot--input\"\n data-state={state}\n style={{ [\"--_ch\" as string]: `${longestAnswer}ch` }}\n >\n <input\n ref={(el) => {\n if (el) slotRefs.current.set(id, el);\n else slotRefs.current.delete(id);\n }}\n className=\"nb-fill__input\"\n type=\"text\"\n autoComplete=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n aria-label={t(\"fill.blank\", { index })}\n aria-invalid={invalid || undefined}\n placeholder={t(\"fill.typeAnswer\")}\n value={text}\n disabled={locked || (checked && state === \"correct\")}\n readOnly={checked && !locked && state === \"incorrect\"}\n onChange={(e) => {\n setTyped((prev) => ({ ...prev, [id]: e.target.value }));\n }}\n onKeyDown={onInputKey}\n />\n {(state === \"correct\" || state === \"incorrect\") && (\n <span className=\"nb-fill__mark\" aria-hidden>\n {state === \"correct\" ? <Check strokeWidth={3} /> : <X strokeWidth={3} />}\n </span>\n )}\n </span>\n )}\n {blank.hint && !locked && (\n <button\n type=\"button\"\n className=\"nb-fill__hint-btn\"\n aria-label={`${t(\"common.hint\")}: ${t(\"fill.blank\", { index })}`}\n aria-expanded={hintOpen}\n onClick={() => toggleHint(id)}\n >\n <Lightbulb aria-hidden />\n </button>\n )}\n {showAnswer && (\n <span className=\"nb-fill__answer\">{t(\"fill.answer\", { answer: blank.answers[0]! })}</span>\n )}\n </span>\n );\n };\n\n return (\n <ModuleShell\n type=\"fill-blanks\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : (config.instructions ?? t(\"fill.instructions\"))}\n appearance={config.appearance}\n className={className}\n announcement={message}\n aside={\n <span className=\"nb-counter\">\n {t(\"common.item\", {\n current: blankOrder.filter((id) => (answers[id] ?? \"\").trim()).length,\n total,\n })}\n </span>\n }\n >\n <p\n className={clsx(\"nb-fill__text\", locked && \"nb-fill__text--locked\")}\n data-mode={behavior.mode}\n >\n {segments.map((seg, i) => {\n if (seg.kind === \"text\") return <RichText key={i} text={seg.value} />;\n const blank = blankById.get(seg.id);\n if (!blank) return null;\n return (\n <Fragment key={`${seg.id}-${i}`}>\n {renderSlot(blank, blankOrder.indexOf(seg.id) + 1)}\n </Fragment>\n );\n })}\n </p>\n\n {openHints.length > 0 && !locked && (\n <ul className=\"nb-fill__hints\">\n {blankOrder.map((id, i) => {\n const blank = blankById.get(id);\n if (!blank?.hint || !openHints.includes(id)) return null;\n return (\n <motion.li\n key={id}\n className=\"nb-fill__hint\"\n role=\"note\"\n initial={reduced ? false : { opacity: 0, y: -4 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: reduced ? 0 : 0.18 }}\n >\n <Lightbulb aria-hidden />\n <span>\n <strong>{t(\"fill.blank\", { index: i + 1 })}</strong> ·{\" \"}\n <RichText text={blank.hint} />\n </span>\n </motion.li>\n );\n })}\n </ul>\n )}\n\n {isBank && !locked && (\n <div className=\"nb-fill__bank\" role=\"group\" aria-label={t(\"fill.wordBank\")}>\n <div className=\"nb-fill__bank-label\">{t(\"fill.wordBank\")}</div>\n <div className=\"nb-fill__chips\">\n {bank.map((chip) => {\n const used = usedChipIds.has(chip.id);\n return (\n <span key={chip.id} className=\"nb-fill__chip-cell\">\n {used ? (\n <span className=\"nb-fill__chip nb-fill__chip--ghost\" aria-hidden>\n {chip.text}\n </span>\n ) : (\n <motion.button\n type=\"button\"\n className=\"nb-fill__chip\"\n layoutId={reduced ? undefined : `${life.runId}-${chip.id}`}\n disabled={checked || !nextEmpty(placed)}\n onClick={() => placeChip(chip.id)}\n whileTap={reduced ? undefined : { scale: 0.96 }}\n >\n {chip.text}\n </motion.button>\n )}\n </span>\n );\n })}\n </div>\n </div>\n )}\n\n <AnimatedFeedback show={checked} tone={tone} title={feedbackTitle} text={feedbackText} />\n\n {locked && behavior.showExplanation && <Explanation text={content.explanation} />}\n\n {!locked && (\n <div className=\"nb-fill__footer\">\n <span className=\"nb-muted nb-text-sm\">\n {!checked &&\n !allFilled &&\n t(\"common.remaining\", {\n count: blankOrder.filter((id) => !(answers[id] ?? \"\").trim()).length,\n })}\n </span>\n <div className=\"nb-module__actions\">\n {checked ? (\n <Button variant=\"primary\" onClick={retry} autoFocus>\n {t(\"common.retry\")}\n </Button>\n ) : (\n <Button ref={checkRef} variant=\"primary\" onClick={check} disabled={!allFilled}>\n {t(\"common.check\")}\n </Button>\n )}\n </div>\n </div>\n )}\n\n {locked && evaluation && (\n <CompletionCard\n score={finalScore}\n passThreshold={Math.max(config.scoring.passThreshold, 0.7)}\n text={config.feedback.complete ?? undefined}\n stats={[\n { label: t(\"common.correct\"), value: `${evaluation.correctCount}/${total}` },\n { label: t(\"common.attempts\"), value: attempts },\n ]}\n onRetry={() => {\n life.reset();\n life.emit(\"module:reset\");\n }}\n />\n )}\n </ModuleShell>\n );\n}\n\nexport default FillBlanks;\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n} from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { ArrowLeft, ArrowRight, Check, X } from \"lucide-react\";\nimport clsx from \"clsx\";\nimport { hotspotExplorerSchema, type Hotspot, type HotspotExplorerConfig } from \"@nibblearn/core\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Button } from \"../../primitives/Button\";\nimport { ProgressBar } from \"../../primitives/ProgressBar\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { SafeImage } from \"../../primitives/SafeImage\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./hotspot-explorer.css\";\n\nexport type HotspotExplorerProps = ModuleProps<HotspotExplorerConfig>;\n\n/** Container width (px) from which the info panel floats next to the marker. */\nconst FLOAT_BREAKPOINT = 720;\n\nexport function HotspotExplorer({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: HotspotExplorerProps) {\n const parsed = useMemo(() => hotspotExplorerSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"hotspot-explorer\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <HotspotLifecycle\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\nfunction HotspotLifecycle({\n config,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: HotspotExplorerProps) {\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"hotspot-explorer\",\n onComplete,\n onEvent,\n resetKey,\n });\n return (\n <HotspotBody\n key={life.runId}\n config={config}\n life={life}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\ninterface BodyProps {\n config: HotspotExplorerConfig;\n life: ModuleLifecycle;\n hideHeader?: boolean;\n className?: string;\n}\n\n/** Floating-card position derived from the marker position (percentages of the stage). */\nfunction floatingStyle(h: Hotspot): CSSProperties {\n const gap = 2.5; // % of stage\n const cx = h.shape === \"rect\" ? h.x + (h.width ?? 0) / 2 : h.x;\n const cy = h.shape === \"rect\" ? h.y + (h.height ?? 0) / 2 : h.y;\n const right = h.shape === \"rect\" ? h.x + (h.width ?? 0) : h.x;\n const bottom = h.shape === \"rect\" ? h.y + (h.height ?? 0) : h.y;\n const placement = h.placement === \"auto\" ? (cx > 50 ? \"left\" : \"right\") : h.placement;\n const style: CSSProperties = {};\n switch (placement) {\n case \"left\":\n style.right = `${100 - h.x + gap}%`;\n if (cy > 50) style.bottom = `${100 - bottom}%`;\n else style.top = `${h.y}%`;\n break;\n case \"right\":\n style.left = `${right + gap}%`;\n if (cy > 50) style.bottom = `${100 - bottom}%`;\n else style.top = `${h.y}%`;\n break;\n case \"top\":\n style.bottom = `${100 - h.y + gap}%`;\n if (cx > 50) style.right = `${100 - right}%`;\n else style.left = `${h.x}%`;\n break;\n case \"bottom\":\n style.top = `${bottom + gap}%`;\n if (cx > 50) style.right = `${100 - right}%`;\n else style.left = `${h.x}%`;\n break;\n }\n return style;\n}\n\nfunction HotspotBody({ config, life, hideHeader, className }: BodyProps) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { hotspots, image } = config.content;\n const { behavior } = config;\n const total = hotspots.length;\n\n const [visited, setVisited] = useState<string[]>([]);\n const [activeId, setActiveId] = useState<string | null>(null);\n const [finished, setFinished] = useState(false);\n const [naturalRatio, setNaturalRatio] = useState<number | null>(null);\n const [wide, setWide] = useState(false);\n\n const stageRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const markerRefs = useRef(new Map<string, HTMLButtonElement>());\n const returnFocusTo = useRef<string | null>(null);\n\n // Track the stage width to decide between a floating card and an in-flow panel.\n useEffect(() => {\n const el = stageRef.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const update = () => setWide(el.clientWidth >= FLOAT_BREAKPOINT);\n const ro = new ResizeObserver(update);\n ro.observe(el);\n update();\n return () => ro.disconnect();\n }, []);\n\n const activeIndex = activeId ? hotspots.findIndex((h) => h.id === activeId) : -1;\n const active = activeIndex >= 0 ? hotspots[activeIndex]! : null;\n const allVisited = visited.length >= total;\n\n const complete = useCallback(\n (ids: string[]) => {\n setFinished(true);\n life.complete({ details: { visited: ids } });\n announce(t(\"a11y.moduleComplete\"));\n },\n [life, announce, t],\n );\n\n const open = useCallback(\n (id: string, fromMarker = true) => {\n const h = hotspots.find((x) => x.id === id);\n if (!h) return;\n if (fromMarker) returnFocusTo.current = id;\n setActiveId(id);\n life.emit(\"module:interact\", { hotspotId: id });\n announce(h.title ?? h.label);\n if (!visited.includes(id)) {\n const next = [...visited, id];\n setVisited(next);\n if (behavior.requireAll && next.length >= total) complete(next);\n }\n requestAnimationFrame(() => panelRef.current?.focus());\n },\n [hotspots, life, announce, visited, behavior.requireAll, total, complete],\n );\n\n const close = useCallback(() => {\n setActiveId(null);\n const id = returnFocusTo.current;\n requestAnimationFrame(() => {\n if (id) markerRefs.current.get(id)?.focus();\n });\n }, []);\n\n const step = useCallback(\n (delta: number) => {\n if (activeIndex < 0) return;\n const next = hotspots[(activeIndex + delta + total) % total]!;\n open(next.id);\n },\n [activeIndex, hotspots, total, open],\n );\n\n const onKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLElement>) => {\n if (e.key === \"Escape\" && activeId) {\n e.preventDefault();\n close();\n }\n },\n [activeId, close],\n );\n\n const ratio =\n image.width && image.height\n ? `${image.width} / ${image.height}`\n : naturalRatio\n ? `${naturalRatio}`\n : undefined;\n const stageStyle: CSSProperties | undefined = ratio ? { aspectRatio: ratio } : undefined;\n\n const panel = active && (\n <motion.div\n key={active.id}\n ref={panelRef}\n className={clsx(\"nb-hotspot__panel\", wide && \"nb-hotspot__panel--floating\")}\n style={wide ? floatingStyle(active) : undefined}\n role=\"group\"\n aria-labelledby={`${config.id}-hs-${active.id}`}\n tabIndex={-1}\n initial={reduced ? false : { opacity: 0, y: 8, scale: 0.98 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={reduced ? { opacity: 0 } : { opacity: 0, y: 4, scale: 0.98 }}\n transition={{ duration: reduced ? 0 : 0.2, ease: [0.2, 0.8, 0.2, 1] }}\n >\n <div className=\"nb-hotspot__panel-head\">\n <span className=\"nb-hotspot__panel-index\" aria-hidden>\n {activeIndex + 1}\n </span>\n <h3 className=\"nb-hotspot__panel-title\" id={`${config.id}-hs-${active.id}`}>\n {active.title ?? active.label}\n </h3>\n <Button\n icon\n size=\"sm\"\n variant=\"ghost\"\n aria-label={t(\"common.close\")}\n onClick={close}\n className=\"nb-hotspot__close\"\n >\n <X aria-hidden />\n </Button>\n </div>\n <div className=\"nb-hotspot__panel-body\">\n <RichText text={active.description} paragraphs />\n </div>\n {total > 1 && (\n <div className=\"nb-hotspot__panel-nav\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n leading={<ArrowLeft aria-hidden />}\n onClick={() => step(-1)}\n >\n {t(\"common.previous\")}\n </Button>\n <span className=\"nb-counter\">\n {t(\"common.item\", { current: activeIndex + 1, total })}\n </span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n trailing={<ArrowRight aria-hidden />}\n onClick={() => step(1)}\n >\n {t(\"common.next\")}\n </Button>\n </div>\n )}\n </motion.div>\n );\n\n return (\n <ModuleShell\n type=\"hotspot-explorer\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : (config.instructions ?? t(\"hotspot.instructions\"))}\n appearance={config.appearance}\n className={className}\n announcement={message}\n width=\"wide\"\n aside={\n <span className=\"nb-counter\">\n {t(\"hotspot.explored\", { count: visited.length, total })}\n </span>\n }\n eyebrow={\n <ProgressBar\n value={visited.length / total}\n showLabel={false}\n size=\"sm\"\n tone={allVisited ? \"success\" : \"accent\"}\n />\n }\n onKeyDown={onKeyDown}\n >\n <div\n ref={stageRef}\n className=\"nb-hotspot__stage\"\n style={stageStyle}\n data-ratio={ratio ? \"true\" : undefined}\n data-pulse={behavior.pulse ? \"true\" : undefined}\n >\n <SafeImage\n media={image}\n className=\"nb-hotspot__image\"\n showCaption={false}\n onLoaded={({ width, height }) => {\n if (width && height && !(image.width && image.height)) setNaturalRatio(width / height);\n }}\n />\n {hotspots.map((h, i) => {\n const isVisited = visited.includes(h.id);\n const isActive = activeId === h.id;\n const style: CSSProperties =\n h.shape === \"rect\"\n ? {\n left: `${h.x}%`,\n top: `${h.y}%`,\n width: `${h.width ?? 10}%`,\n height: `${h.height ?? 10}%`,\n }\n : { left: `${h.x}%`, top: `${h.y}%` };\n return (\n <button\n key={h.id}\n ref={(el) => {\n if (el) markerRefs.current.set(h.id, el);\n else markerRefs.current.delete(h.id);\n }}\n type=\"button\"\n className=\"nb-hotspot__marker\"\n data-shape={h.shape}\n data-visited={isVisited ? \"true\" : \"false\"}\n data-active={isActive ? \"true\" : \"false\"}\n style={style}\n aria-label={t(\"hotspot.marker\", { index: i + 1, label: h.label })}\n aria-expanded={isActive}\n aria-controls={isActive ? `${config.id}-hs-${h.id}` : undefined}\n onClick={() => (isActive ? close() : open(h.id))}\n >\n <span className=\"nb-hotspot__dot\" aria-hidden>\n {isVisited && !isActive ? (\n <Check strokeWidth={3} />\n ) : behavior.numbered ? (\n i + 1\n ) : null}\n </span>\n </button>\n );\n })}\n {wide && (\n <AnimatePresence initial={false} mode=\"wait\">\n {panel}\n </AnimatePresence>\n )}\n </div>\n {image.caption && <p className=\"nb-hotspot__caption nb-muted nb-text-sm\">{image.caption}</p>}\n\n {!wide && (\n <AnimatePresence initial={false} mode=\"wait\">\n {panel}\n </AnimatePresence>\n )}\n\n <section className=\"nb-hotspot__list\" aria-label={t(\"hotspot.list\")}>\n <h3 className=\"nb-hotspot__list-title\">{t(\"hotspot.list\")}</h3>\n <ol className=\"nb-hotspot__items\">\n {hotspots.map((h, i) => {\n const isVisited = visited.includes(h.id);\n return (\n <li key={h.id}>\n <button\n type=\"button\"\n className=\"nb-hotspot__item\"\n data-visited={isVisited ? \"true\" : \"false\"}\n aria-current={activeId === h.id ? \"true\" : undefined}\n onClick={() => open(h.id, false)}\n >\n <span className=\"nb-hotspot__item-index\" aria-hidden>\n {isVisited ? <Check strokeWidth={3} /> : i + 1}\n </span>\n <span className=\"nb-hotspot__item-label\">{h.label}</span>\n {isVisited && (\n <span className=\"nb-hotspot__item-status\">{t(\"hotspot.visited\")}</span>\n )}\n </button>\n </li>\n );\n })}\n </ol>\n </section>\n\n {!finished && !behavior.requireAll && visited.length > 0 && (\n <div className=\"nb-module__actions\">\n <Button variant=\"primary\" onClick={() => complete(visited)}>\n {t(\"common.finish\")}\n </Button>\n </div>\n )}\n\n {finished && (\n <CompletionCard\n title={t(\"hotspot.allExplored\")}\n text={config.feedback.complete ?? undefined}\n stats={[{ label: t(\"hotspot.visited\"), value: `${visited.length}/${total}` }]}\n retryLabel={t(\"common.restart\")}\n onRetry={() => {\n life.reset();\n life.emit(\"module:reset\");\n }}\n />\n )}\n </ModuleShell>\n );\n}\n\nexport default HotspotExplorer;\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n} from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport {\n ArrowLeft,\n ArrowRight,\n Check,\n CornerDownLeft,\n MousePointer2,\n Sparkles,\n} from \"lucide-react\";\nimport clsx from \"clsx\";\nimport {\n findAllScore,\n pointInRect,\n screenshotWalkthroughSchema,\n toPercent,\n type ScreenshotWalkthroughConfig,\n type WalkthroughStep,\n} from \"@nibblearn/core\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Button } from \"../../primitives/Button\";\nimport { ProgressBar } from \"../../primitives/ProgressBar\";\nimport { AnimatedFeedback } from \"../../primitives/Feedback\";\nimport { SafeImage } from \"../../primitives/SafeImage\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./screenshot-walkthrough.css\";\n\n// useLayoutEffect warns during server rendering on React 18; fall back to useEffect there.\nconst useIsomorphicLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\nexport type ScreenshotWalkthroughProps = ModuleProps<ScreenshotWalkthroughConfig>;\n\ntype Placement = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype FeedbackKind = \"missed\" | \"wrongInput\" | null;\n\n/** Container width below which the tooltip is rendered as a card under the stage. */\nconst NARROW_BREAKPOINT = 640;\n/** Score penalty per miss (clicking outside the target or typing the wrong text). */\nconst MISS_PENALTY = 0.1;\n/** Default stage aspect ratio while the image is loading and no size is configured. */\nconst FALLBACK_RATIO = 16 / 10;\n\nexport function ScreenshotWalkthrough({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: ScreenshotWalkthroughProps) {\n const parsed = useMemo(() => screenshotWalkthroughSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"screenshot-walkthrough\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <ScreenshotWalkthroughInner\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\n/** Strip the inline markup subset so text can be used in `aria-label`s. */\nfunction plain(text: string): string {\n return text\n .replace(/\\*\\*(.+?)\\*\\*/g, \"$1\")\n .replace(/\\*(.+?)\\*/g, \"$1\")\n .replace(/`(.+?)`/g, \"$1\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction resolvePlacement(step: WalkthroughStep): Placement {\n if (step.tooltipPlacement !== \"auto\") return step.tooltipPlacement;\n return step.target.y < 50 ? \"bottom\" : \"top\";\n}\n\n/** Owns the lifecycle; every reset remounts ScreenshotWalkthroughRun with fresh state (keyed by runId). */\nfunction ScreenshotWalkthroughInner(props: ScreenshotWalkthroughProps) {\n const { config, onComplete, onEvent, resetKey } = props;\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"screenshot-walkthrough\",\n onComplete,\n onEvent,\n resetKey,\n });\n return <ScreenshotWalkthroughRun key={life.runId} {...props} life={life} />;\n}\n\nfunction ScreenshotWalkthroughRun({\n life,\n config,\n hideHeader,\n className,\n}: ScreenshotWalkthroughProps & { life: ModuleLifecycle }) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { steps } = config.content;\n const { behavior } = config;\n const total = steps.length;\n\n const [index, setIndex] = useState(0);\n const [done, setDone] = useState<boolean[]>(() => steps.map(() => false));\n const [misses, setMisses] = useState(0);\n const [stepMisses, setStepMisses] = useState(0);\n const [hint, setHint] = useState(false);\n const [feedback, setFeedback] = useState<FeedbackKind>(null);\n const [shaking, setShaking] = useState(false);\n const [value, setValue] = useState(\"\");\n const [finished, setFinished] = useState(false);\n const [naturalSizes, setNaturalSizes] = useState<\n Record<string, { width: number; height: number }>\n >({});\n const [narrow, setNarrow] = useState(true);\n const sceneRef = useRef<HTMLDivElement>(null);\n const targetRef = useRef<HTMLButtonElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Container-driven layout: the tooltip floats over the stage on wide containers, stacks below it on narrow ones.\n useIsomorphicLayoutEffect(() => {\n const el = sceneRef.current;\n if (!el) return;\n const update = () => setNarrow(el.getBoundingClientRect().width < NARROW_BREAKPOINT);\n update();\n if (typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const step = steps[index]!;\n const stepDone = done[index] ?? false;\n const placement = resolvePlacement(step);\n const doneCount = done.filter(Boolean).length;\n\n const ratio = useMemo(() => {\n const { width, height, src } = step.image;\n if (width && height) return width / height;\n const natural = naturalSizes[src];\n if (natural && natural.width > 0 && natural.height > 0) return natural.width / natural.height;\n return FALLBACK_RATIO;\n }, [step.image, naturalSizes]);\n\n const completeStep = useCallback(\n (i: number) => {\n const nextDone = done.map((d, j) => (j === i ? true : d));\n setDone(nextDone);\n setFeedback(null);\n setHint(false);\n setStepMisses(0);\n setValue(\"\");\n life.emit(\"module:answer\", { stepId: steps[i]!.id, stepIndex: i, misses: stepMisses });\n if (nextDone.every(Boolean)) {\n setFinished(true);\n life.complete({\n score: findAllScore(1, 1, misses, MISS_PENALTY),\n details: { misses, steps: total },\n });\n announce(t(\"a11y.moduleComplete\"));\n return;\n }\n if (i + 1 < total) {\n setIndex(i + 1);\n announce(\n `${t(\"common.step\", { current: i + 2, total })}. ${plain(steps[i + 1]!.instruction)}`,\n );\n }\n },\n [done, life, steps, stepMisses, misses, total, announce, t],\n );\n\n const showHint = useCallback(\n (auto: boolean) => {\n setHint(true);\n life.emit(\"module:hint\", { stepId: step.id, stepIndex: index, auto });\n },\n [life, step.id, index],\n );\n\n const registerMiss = useCallback(\n (kind: Exclude<FeedbackKind, null>, payload: Record<string, unknown>) => {\n const count = stepMisses + 1;\n setStepMisses(count);\n setMisses((m) => m + 1);\n life.attempt();\n setFeedback(kind);\n if (!reduced) setShaking(true);\n life.emit(\"module:interact\", { stepId: step.id, stepIndex: index, hit: false, ...payload });\n announce(\n kind === \"missed\"\n ? t(\"walk.missed\")\n : t(\"walk.wrongInput\", { expected: step.input?.expected ?? \"\" }),\n );\n if (behavior.autoHintAfterMisses > 0 && count >= behavior.autoHintAfterMisses && !hint)\n showHint(true);\n },\n [\n stepMisses,\n life,\n step.id,\n step.input?.expected,\n index,\n announce,\n t,\n behavior.autoHintAfterMisses,\n hint,\n showHint,\n reduced,\n ],\n );\n\n const hit = useCallback(() => {\n life.emit(\"module:interact\", { stepId: step.id, stepIndex: index, hit: true, action: \"click\" });\n completeStep(index);\n }, [life, step.id, index, completeStep]);\n\n const onStageClick = useCallback(\n (e: ReactMouseEvent<HTMLDivElement>) => {\n if (step.action !== \"click\" || finished) return;\n const p = toPercent(e.clientX, e.clientY, e.currentTarget.getBoundingClientRect());\n if (pointInRect(p.x, p.y, step.target, 1)) {\n hit();\n return;\n }\n if (stepDone) return;\n registerMiss(\"missed\", {\n action: \"click\",\n x: Math.round(p.x * 10) / 10,\n y: Math.round(p.y * 10) / 10,\n });\n },\n [step, finished, stepDone, hit, registerMiss],\n );\n\n const submitInput = useCallback(() => {\n const expected = step.input?.expected;\n const typed = value.trim();\n if (!typed) {\n inputRef.current?.focus();\n return;\n }\n if (expected && typed.toLowerCase() !== expected.trim().toLowerCase()) {\n registerMiss(\"wrongInput\", { action: \"type\", value: typed });\n inputRef.current?.focus();\n return;\n }\n life.emit(\"module:interact\", {\n stepId: step.id,\n stepIndex: index,\n hit: true,\n action: \"type\",\n value: typed,\n });\n completeStep(index);\n }, [step, value, registerMiss, life, index, completeStep]);\n\n const goTo = useCallback(\n (i: number) => {\n if (i < 0 || i >= total) return;\n setIndex(i);\n setFeedback(null);\n setHint(false);\n setStepMisses(0);\n setValue(\"\");\n announce(`${t(\"common.step\", { current: i + 1, total })}. ${plain(steps[i]!.instruction)}`);\n },\n [total, announce, t, steps],\n );\n\n const canGoNext = index + 1 < total && (stepDone || step.action === \"observe\");\n const canGoBack = behavior.allowBack && index > 0;\n\n const onInputKeyDown = (e: ReactKeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n submitInput();\n }\n };\n\n const retry = () => {\n life.reset();\n life.emit(\"module:reset\");\n };\n\n if (finished) {\n return (\n <ModuleShell\n type=\"screenshot-walkthrough\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n appearance={config.appearance}\n className={className}\n announcement={message}\n width=\"wide\"\n >\n <CompletionCard\n title={t(\"walk.complete\")}\n score={findAllScore(1, 1, misses, MISS_PENALTY)}\n passThreshold={Math.max(config.scoring.passThreshold, 0.5)}\n text={config.feedback.complete ?? config.content.summary}\n stats={[\n { label: t(\"walk.steps\"), value: total },\n { label: t(\"walk.misses\"), value: misses },\n ]}\n onRetry={retry}\n />\n </ModuleShell>\n );\n }\n\n const stageVars = {\n aspectRatio: `${ratio}`,\n [\"--_x\" as string]: `${step.target.x}%`,\n [\"--_y\" as string]: `${step.target.y}%`,\n [\"--_w\" as string]: `${step.target.width}%`,\n [\"--_h\" as string]: `${step.target.height}%`,\n [\"--_cx\" as string]: `${step.target.x + step.target.width / 2}%`,\n [\"--_cy\" as string]: `${step.target.y + step.target.height / 2}%`,\n } as CSSProperties;\n\n const instructionId = `${config.id}-walk-instruction-${index}`;\n const actionHint =\n step.action === \"click\"\n ? t(\"walk.clickTarget\")\n : step.action === \"type\"\n ? t(\"walk.typeAndConfirm\")\n : \"\";\n\n const simulatedInput = (\n <input\n ref={inputRef}\n className=\"nb-walk__input\"\n type=\"text\"\n aria-label={t(\"walk.inputLabel\")}\n aria-describedby={instructionId}\n aria-invalid={feedback === \"wrongInput\" || undefined}\n placeholder={step.input?.placeholder}\n value={value}\n autoComplete=\"off\"\n spellCheck={false}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={onInputKeyDown}\n />\n );\n\n let actions: ReactNode;\n if (step.action === \"observe\") {\n actions = (\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={() => completeStep(index)}\n trailing={<ArrowRight aria-hidden />}\n >\n {index + 1 >= total ? t(\"common.finish\") : t(\"common.continue\")}\n </Button>\n );\n } else if (step.action === \"type\") {\n actions = (\n <>\n {narrow && simulatedInput}\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={submitInput}\n trailing={<CornerDownLeft aria-hidden />}\n >\n {t(\"common.submit\")}\n </Button>\n </>\n );\n } else {\n actions = (\n <>\n {behavior.allowHint && !hint && stepMisses > 0 && !stepDone && (\n <Button\n variant=\"soft\"\n size=\"sm\"\n onClick={() => showHint(false)}\n leading={<Sparkles aria-hidden />}\n >\n {t(\"walk.showMe\")}\n </Button>\n )}\n {stepDone && (\n <span className=\"nb-walk__done-label\">\n <Check aria-hidden strokeWidth={3} />\n {t(\"common.completed\")}\n </span>\n )}\n </>\n );\n }\n\n const tooltip = (\n <div\n className=\"nb-walk__tooltip\"\n data-placement={narrow ? \"stacked\" : placement}\n role=\"group\"\n aria-labelledby={instructionId}\n >\n <motion.div\n className=\"nb-walk__card\"\n key={`${life.runId}-${index}`}\n initial={\n reduced ? false : { opacity: 0, y: placement === \"top\" && !narrow ? 8 : -8, scale: 0.98 }\n }\n animate={{ opacity: 1, y: 0, scale: 1 }}\n transition={{\n duration: reduced ? 0 : 0.26,\n ease: [0.2, 0.8, 0.2, 1],\n delay: reduced ? 0 : 0.12,\n }}\n >\n <div\n className={clsx(\"nb-walk__card-inner\", shaking && \"nb-walk__card-inner--shake\")}\n onAnimationEnd={() => setShaking(false)}\n >\n <div className=\"nb-walk__card-head\">\n {behavior.showStepNumbers && (\n <span className=\"nb-walk__step-badge\" data-done={stepDone ? \"true\" : \"false\"}>\n {stepDone ? <Check aria-hidden strokeWidth={3} /> : index + 1}\n <span className=\"nb-sr-only\">{t(\"walk.stepTitle\", { current: index + 1 })}</span>\n </span>\n )}\n {step.title && <h3 className=\"nb-walk__card-title\">{step.title}</h3>}\n </div>\n <p className=\"nb-walk__instruction\" id={instructionId}>\n <RichText text={step.instruction} />\n </p>\n {step.note && (\n <p className=\"nb-walk__note\">\n <RichText text={step.note} />\n </p>\n )}\n <AnimatedFeedback\n show={feedback !== null}\n tone=\"incorrect\"\n title={\n feedback === \"wrongInput\"\n ? t(\"walk.wrongInput\", { expected: step.input?.expected ?? \"\" })\n : t(\"walk.missed\")\n }\n className=\"nb-walk__feedback\"\n />\n <div className=\"nb-walk__card-actions\">\n {actionHint && !stepDone && <span className=\"nb-walk__action-hint\">{actionHint}</span>}\n <div className=\"nb-walk__buttons\">{actions}</div>\n </div>\n </div>\n </motion.div>\n </div>\n );\n\n return (\n <ModuleShell\n type=\"screenshot-walkthrough\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : (config.instructions ?? t(\"walk.instructions\"))}\n appearance={config.appearance}\n className={className}\n announcement={message}\n width=\"wide\"\n aside={<span className=\"nb-counter\">{t(\"common.step\", { current: index + 1, total })}</span>}\n eyebrow={<ProgressBar value={doneCount / total} showLabel={false} size=\"sm\" />}\n footer={\n <>\n {behavior.allowBack && (\n <Button\n variant=\"ghost\"\n onClick={() => goTo(index - 1)}\n disabled={!canGoBack}\n leading={<ArrowLeft aria-hidden />}\n >\n {t(\"common.back\")}\n </Button>\n )}\n <span className=\"nb-spacer\" />\n <ol className=\"nb-walk__dots\" aria-hidden>\n {steps.map((s, i) => (\n <li\n key={s.id}\n className=\"nb-walk__dot\"\n data-state={i === index ? \"active\" : done[i] ? \"done\" : \"todo\"}\n />\n ))}\n </ol>\n <span className=\"nb-spacer\" />\n <Button\n variant=\"secondary\"\n onClick={() => goTo(index + 1)}\n disabled={!canGoNext}\n trailing={<ArrowRight aria-hidden />}\n >\n {t(\"common.next\")}\n </Button>\n </>\n }\n >\n <p className=\"nb-sr-only\">\n {t(\"common.step\", { current: index + 1, total })}. {plain(step.instruction)}\n {actionHint ? ` ${actionHint}.` : \"\"}\n </p>\n\n <div\n ref={sceneRef}\n className={clsx(\"nb-walk__scene\", narrow && \"nb-walk__scene--narrow\")}\n data-action={step.action}\n >\n <div className=\"nb-walk__frame\">\n <div className=\"nb-walk__bar\" aria-hidden>\n <span className=\"nb-walk__bar-dot\" />\n <span className=\"nb-walk__bar-dot\" />\n <span className=\"nb-walk__bar-dot\" />\n <span className=\"nb-walk__bar-pill\">{step.image.caption ?? config.title ?? \"\"}</span>\n </div>\n <div className=\"nb-walk__stage\" style={stageVars}>\n <div\n className=\"nb-walk__canvas\"\n onClick={onStageClick}\n data-hint={hint ? \"true\" : undefined}\n >\n <AnimatePresence initial={false}>\n <motion.div\n key={step.image.src}\n className=\"nb-walk__layer\"\n initial={reduced ? false : { opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: reduced ? 0 : 0.32, ease: \"easeOut\" }}\n >\n <SafeImage\n media={step.image}\n rounded={false}\n showCaption={false}\n className=\"nb-walk__image\"\n onLoaded={(size) =>\n setNaturalSizes((prev) =>\n prev[step.image.src] ? prev : { ...prev, [step.image.src]: size },\n )\n }\n />\n </motion.div>\n </AnimatePresence>\n\n {step.action === \"click\" ? (\n <button\n ref={targetRef}\n type=\"button\"\n className=\"nb-walk__target nb-walk__target--button\"\n aria-label={plain(step.instruction)}\n aria-describedby={instructionId}\n data-done={stepDone ? \"true\" : \"false\"}\n data-hint={hint ? \"true\" : \"false\"}\n onClick={(e) => {\n e.stopPropagation();\n hit();\n }}\n />\n ) : (\n <div\n className=\"nb-walk__target\"\n data-done={stepDone ? \"true\" : \"false\"}\n data-hint={hint ? \"true\" : \"false\"}\n aria-hidden\n />\n )}\n\n {step.action === \"type\" && !narrow && (\n <div className=\"nb-walk__input-anchor\">{simulatedInput}</div>\n )}\n\n <AnimatePresence>\n {hint && step.action === \"click\" && (\n <motion.div\n className=\"nb-walk__pointer\"\n aria-hidden\n initial={reduced ? false : { opacity: 0 }}\n animate={\n reduced\n ? { opacity: 1, x: 0, y: 0 }\n : {\n opacity: [0, 1, 1, 1],\n x: [56, 0, 0, 0],\n y: [56, 0, 0, 0],\n scale: [1, 1, 0.82, 1],\n }\n }\n exit={{ opacity: 0 }}\n transition={\n reduced\n ? { duration: 0 }\n : { duration: 1.5, repeat: Infinity, repeatDelay: 0.5, ease: \"easeOut\" }\n }\n >\n <MousePointer2 aria-hidden strokeWidth={2.2} />\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n {!narrow && tooltip}\n </div>\n </div>\n {narrow && tooltip}\n </div>\n </ModuleShell>\n );\n}\n\nexport default ScreenshotWalkthrough;\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { AlertTriangle, ArrowRight, Compass, Play, Trophy } from \"lucide-react\";\nimport clsx from \"clsx\";\nimport {\n branchingScenarioSchema,\n chooseScenario,\n nodeMap,\n scenarioScore,\n startScenario,\n type BranchingScenarioConfig,\n type ScenarioChoice,\n type ScenarioNode,\n type ScenarioState,\n} from \"@nibblearn/core\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Button } from \"../../primitives/Button\";\nimport { Badge } from \"../../primitives/Badge\";\nimport { OptionCard } from \"../../primitives/OptionCard\";\nimport { AnimatedFeedback, type FeedbackTone } from \"../../primitives/Feedback\";\nimport { SafeImage } from \"../../primitives/SafeImage\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./branching-scenario.css\";\n\nexport type BranchingScenarioProps = ModuleProps<BranchingScenarioConfig>;\n\nconst LETTERS = \"ABCDEF\";\n\ntype Outcome = NonNullable<ScenarioNode[\"outcome\"]>;\n\nconst toneByQuality: Record<ScenarioChoice[\"quality\"], FeedbackTone> = {\n good: \"correct\",\n neutral: \"info\",\n poor: \"incorrect\",\n};\n\nconst badgeByOutcome: Record<Outcome, \"success\" | \"warning\" | \"danger\"> = {\n success: \"success\",\n neutral: \"warning\",\n failure: \"danger\",\n};\n\nfunction OutcomeIcon({ outcome }: { outcome: Outcome }) {\n if (outcome === \"success\") return <Trophy aria-hidden />;\n if (outcome === \"failure\") return <AlertTriangle aria-hidden />;\n return <Compass aria-hidden />;\n}\n\nfunction formatPoints(points: number): string {\n return points > 0 ? `+${points}` : String(points);\n}\n\nexport function BranchingScenario({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: BranchingScenarioProps) {\n const parsed = useMemo(() => branchingScenarioSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"branching-scenario\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <BranchingScenarioInner\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\nfunction BranchingScenarioInner({\n config,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: BranchingScenarioProps) {\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"branching-scenario\",\n onComplete,\n onEvent,\n resetKey,\n });\n // Keyed by runId so every reset starts from fresh local state.\n return (\n <ScenarioRun\n key={life.runId}\n config={config}\n life={life}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\ninterface ScenarioRunProps {\n config: BranchingScenarioConfig;\n life: ModuleLifecycle;\n hideHeader?: boolean;\n className?: string;\n}\n\nfunction ScenarioRun({ config, life, hideHeader, className }: ScenarioRunProps) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { behavior, content } = config;\n\n const nodes = useMemo(() => nodeMap(config), [config]);\n const [started, setStarted] = useState(!content.intro);\n const [state, setState] = useState<ScenarioState>(() => startScenario(config));\n const [selected, setSelected] = useState<number | null>(null);\n const [confirmed, setConfirmed] = useState(false);\n const completedRef = useRef(false);\n const choicesRef = useRef<HTMLDivElement>(null);\n\n const node = nodes.get(state.currentId)!;\n const isEnding = state.finished || node.kind === \"ending\";\n const outcome: Outcome = node.outcome ?? \"neutral\";\n const stepIndex = state.history.length + 1;\n\n const finish = useCallback(\n (next: ScenarioState) => {\n if (completedRef.current) return;\n completedRef.current = true;\n const endNode = nodes.get(next.currentId);\n const endOutcome: Outcome = endNode?.outcome ?? \"neutral\";\n life.complete({\n score: behavior.showScore ? scenarioScore(config, next) : undefined,\n details: {\n path: next.history.map((s) => ({ nodeId: s.nodeId, choiceIndex: s.choiceIndex })),\n points: next.points,\n ending: next.currentId,\n outcome: endOutcome,\n },\n });\n announce(\n `${t(\"scenario.ending\")}: ${t(`scenario.outcome.${endOutcome}`)}. ${t(\"a11y.moduleComplete\")}`,\n );\n },\n [nodes, life, behavior.showScore, config, announce, t],\n );\n\n // A scenario that starts on an ending (or reaches maxSteps) is complete immediately.\n useEffect(() => {\n if (started && state.finished) finish(state);\n }, [started, state, finish]);\n\n const start = useCallback(() => {\n setStarted(true);\n life.emit(\"module:interact\", { action: \"start\" });\n }, [life]);\n\n const select = useCallback(\n (index: number) => {\n if (confirmed || isEnding) return;\n setSelected((prev) => (prev === index ? null : index));\n life.emit(\"module:interact\", { nodeId: node.id, choiceIndex: index });\n },\n [confirmed, isEnding, life, node.id],\n );\n\n const advance = useCallback(\n (index: number) => {\n const next = chooseScenario(config, state, index);\n if (next === state) return;\n setState(next);\n setSelected(null);\n setConfirmed(false);\n if (next.finished) finish(next);\n else\n requestAnimationFrame(() =>\n choicesRef.current?.querySelector<HTMLButtonElement>(\"button\")?.focus(),\n );\n },\n [config, state, finish],\n );\n\n const confirm = useCallback(() => {\n if (selected === null || confirmed || isEnding) return;\n const choice = node.choices[selected];\n if (!choice) return;\n life.attempt();\n life.emit(\"module:answer\", {\n nodeId: node.id,\n choiceIndex: selected,\n choiceId: choice.id,\n next: choice.next,\n points: choice.points,\n quality: choice.quality,\n step: stepIndex,\n });\n const showPoints = behavior.showScore && choice.points !== 0;\n if (choice.feedback || showPoints) {\n setConfirmed(true);\n announce(\n [\n choice.feedback,\n showPoints\n ? t(\"scenario.pointsEarned\", { points: formatPoints(choice.points) })\n : undefined,\n ]\n .filter(Boolean)\n .join(\" \"),\n );\n } else {\n advance(selected);\n }\n }, [\n selected,\n confirmed,\n isEnding,\n node,\n life,\n stepIndex,\n behavior.showScore,\n announce,\n t,\n advance,\n ]);\n\n const next = useCallback(() => {\n if (selected === null || !confirmed) return;\n advance(selected);\n }, [selected, confirmed, advance]);\n\n const restart = useCallback(() => {\n life.reset();\n life.emit(\"module:reset\");\n }, [life]);\n\n // Keyboard: A–F select a choice, Enter confirms / continues.\n const onKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLElement>) => {\n if (!started || isEnding) return;\n const target = e.target as HTMLElement | null;\n if (target && /^(INPUT|TEXTAREA|SELECT)$/.test(target.tagName)) return;\n const key = e.key.toUpperCase();\n const li = key.length === 1 ? LETTERS.indexOf(key) : -1;\n if (li >= 0 && li < node.choices.length && !confirmed) {\n e.preventDefault();\n select(li);\n } else if (\n e.key === \"Enter\" &&\n (!(target instanceof HTMLButtonElement) || target.classList.contains(\"nb-option\"))\n ) {\n e.preventDefault();\n if (!confirmed) confirm();\n else next();\n }\n },\n [started, isEnding, node.choices.length, confirmed, select, confirm, next],\n );\n\n const chosen = selected !== null ? node.choices[selected] : undefined;\n const feedbackTone: FeedbackTone = chosen ? toneByQuality[chosen.quality] : \"info\";\n const showPointsChip = Boolean(chosen && behavior.showScore && chosen.points !== 0);\n\n const history = behavior.showHistory && state.history.length > 0 && (\n <ol className=\"nb-scn__history\" aria-label={t(\"scenario.history\")}>\n {state.history.map((step, i) => (\n <li\n key={`${step.nodeId}-${i}`}\n className=\"nb-scn__history-item\"\n data-quality={step.choice.quality}\n >\n <span className=\"nb-scn__history-dot\" aria-hidden />\n <span className=\"nb-scn__history-step\">{t(\"scenario.step\", { index: i + 1 })}</span>\n <span className=\"nb-scn__history-text\">{step.choice.text}</span>\n </li>\n ))}\n </ol>\n );\n\n const sceneMotion = {\n initial: reduced ? false : { opacity: 0, x: 28 },\n animate: { opacity: 1, x: 0 },\n exit: reduced ? { opacity: 0 } : { opacity: 0, x: -28 },\n transition: { duration: reduced ? 0 : 0.28, ease: [0.2, 0.8, 0.2, 1] as const },\n };\n\n let body: ReactNode;\n\n if (!started) {\n body = (\n <motion.div key=\"intro\" className=\"nb-scn__intro\" {...sceneMotion}>\n <span className=\"nb-scn__intro-icon\" aria-hidden>\n <Compass />\n </span>\n <RichText text={content.intro!} paragraphs className=\"nb-scn__intro-text\" />\n <Button\n variant=\"primary\"\n size=\"lg\"\n onClick={start}\n trailing={<Play aria-hidden />}\n autoFocus\n >\n {t(\"common.start\")}\n </Button>\n </motion.div>\n );\n } else if (isEnding) {\n const score = behavior.showScore ? scenarioScore(config, state) : undefined;\n body = (\n <motion.div\n key={`end-${life.runId}`}\n className=\"nb-scn__ending\"\n data-outcome={outcome}\n {...sceneMotion}\n >\n <div className=\"nb-scn__ending-card\">\n <Badge tone={badgeByOutcome[outcome]} className=\"nb-scn__outcome\">\n <OutcomeIcon outcome={outcome} />\n {t(`scenario.outcome.${outcome}`)}\n </Badge>\n <div className=\"nb-scn__eyebrow\">{t(\"scenario.ending\")}</div>\n {node.title && <h3 className=\"nb-scn__title\">{node.title}</h3>}\n <RichText text={node.text} paragraphs className=\"nb-scn__text\" />\n {node.image && <SafeImage media={node.image} className=\"nb-scn__image\" />}\n {node.summary && (\n <div className=\"nb-scn__summary\">\n <div className=\"nb-scn__summary-title\">{t(\"common.summary\")}</div>\n <RichText text={node.summary} paragraphs />\n </div>\n )}\n </div>\n {history}\n <CompletionCard\n score={score}\n passThreshold={0.7}\n title={\n outcome === \"success\"\n ? t(\"common.wellDone\")\n : outcome === \"neutral\"\n ? t(\"common.niceWork\")\n : t(\"common.keepGoing\")\n }\n text={config.feedback.complete}\n stats={[\n { label: t(\"scenario.decisions\"), value: state.history.length },\n ...(behavior.showScore\n ? [{ label: t(\"common.points\"), value: formatPoints(state.points) }]\n : []),\n ]}\n onRetry={behavior.allowRetry ? restart : undefined}\n retryLabel={t(\"scenario.explorePaths\")}\n />\n </motion.div>\n );\n } else {\n body = (\n <motion.div key={`${life.runId}-${node.id}`} className=\"nb-scn__scene\" {...sceneMotion}>\n {history}\n <article className=\"nb-scn__card\" aria-labelledby={`${config.id}-scene`}>\n <div className=\"nb-scn__card-head\">\n {node.speaker ? (\n <Badge tone=\"accent\" className=\"nb-scn__speaker\">\n {node.speaker}\n </Badge>\n ) : (\n <span />\n )}\n <span className=\"nb-counter\">{t(\"scenario.step\", { index: stepIndex })}</span>\n </div>\n {node.title && (\n <h3 className=\"nb-scn__title\" id={`${config.id}-scene`}>\n {node.title}\n </h3>\n )}\n {!node.title && (\n <span id={`${config.id}-scene`} className=\"nb-sr-only\">\n {t(\"scenario.step\", { index: stepIndex })}\n </span>\n )}\n <RichText text={node.text} paragraphs className=\"nb-scn__text\" />\n {node.image && <SafeImage media={node.image} className=\"nb-scn__image\" />}\n </article>\n\n <div className=\"nb-scn__decision\">\n <div className=\"nb-scn__question\" id={`${config.id}-decision`}>\n {t(\"scenario.decision\")}\n </div>\n <div\n ref={choicesRef}\n className=\"nb-scn__choices\"\n role=\"radiogroup\"\n aria-labelledby={`${config.id}-decision`}\n >\n {node.choices.map((c, i) => (\n <OptionCard\n key={c.id ?? i}\n text={c.text}\n shortcut={LETTERS[i]}\n state={selected === i ? \"selected\" : \"idle\"}\n disabled={confirmed}\n onClick={() => select(i)}\n className={clsx(confirmed && selected !== i && \"nb-scn__choice--dimmed\")}\n />\n ))}\n </div>\n\n <AnimatedFeedback\n show={confirmed && Boolean(chosen)}\n tone={feedbackTone}\n text={chosen?.feedback}\n >\n {showPointsChip && chosen && (\n <Badge tone={chosen.points > 0 ? \"success\" : \"danger\"} className=\"nb-scn__points\">\n {t(\"scenario.pointsEarned\", { points: formatPoints(chosen.points) })}\n </Badge>\n )}\n </AnimatedFeedback>\n\n <div className=\"nb-scn__footer\">\n {!confirmed ? (\n <Button\n key=\"confirm\"\n variant=\"primary\"\n onClick={confirm}\n disabled={selected === null}\n trailing={<ArrowRight aria-hidden />}\n >\n {t(\"common.continue\")}\n </Button>\n ) : (\n <Button\n key=\"next\"\n variant=\"primary\"\n onClick={next}\n trailing={<ArrowRight aria-hidden />}\n autoFocus\n >\n {t(\"common.continue\")}\n </Button>\n )}\n </div>\n </div>\n </motion.div>\n );\n }\n\n return (\n <ModuleShell\n type=\"branching-scenario\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : config.instructions}\n appearance={config.appearance}\n className={className}\n announcement={message}\n onKeyDown={onKeyDown}\n >\n <AnimatePresence mode=\"wait\" initial={false}>\n {body}\n </AnimatePresence>\n </ModuleShell>\n );\n}\n\nexport default BranchingScenario;\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n} from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { AlertTriangle, MessageCircle, Send, Smile } from \"lucide-react\";\nimport clsx from \"clsx\";\nimport {\n conversationSchema,\n createScriptedProvider,\n responsesOf,\n summarizeConversation,\n typingDelay,\n type ConversationConfig,\n type ConversationNode,\n type ConversationProvider,\n type ConversationTurn,\n type ScriptedResponse,\n} from \"@nibblearn/core\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Badge } from \"../../primitives/Badge\";\nimport { SafeImage } from \"../../primitives/SafeImage\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./conversation.css\";\n\nexport interface ConversationProps extends ModuleProps<ConversationConfig> {\n /**\n * Custom engine deciding what happens next (e.g. an AI-backed provider supplied by the host).\n * Defaults to the scripted provider that follows the JSON graph.\n */\n provider?: ConversationProvider;\n}\n\ntype Outcome = NonNullable<ConversationNode[\"outcome\"]>;\n\ninterface ChatMessage {\n key: string;\n from: \"them\" | \"system\" | \"you\";\n text: string;\n /** Coaching note attached to a learner message. */\n note?: { tone?: string; effectiveness: number; feedback?: string };\n}\n\nconst SYSTEM_DELAY = 400;\nconst STAGGER = 180;\n\nfunction initials(name: string): string {\n return name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((w) => w[0]!.toUpperCase())\n .join(\"\");\n}\n\nfunction badgeTone(effectiveness: number): \"success\" | \"warning\" | \"danger\" {\n return effectiveness >= 0.7 ? \"success\" : effectiveness >= 0.4 ? \"warning\" : \"danger\";\n}\n\nfunction OutcomeIcon({ outcome }: { outcome: Outcome }) {\n if (outcome === \"success\") return <Smile aria-hidden />;\n if (outcome === \"failure\") return <AlertTriangle aria-hidden />;\n return <MessageCircle aria-hidden />;\n}\n\nfunction EffectivenessMeter({ value, label }: { value: number; label: string }) {\n const filled = Math.round(Math.max(0, Math.min(1, value)) * 5);\n return (\n <span\n className=\"nb-conv__meter\"\n role=\"img\"\n aria-label={`${label}: ${Math.round(value * 100)}%`}\n data-tone={badgeTone(value)}\n >\n {Array.from({ length: 5 }, (_, i) => (\n <span key={i} className=\"nb-conv__meter-dot\" data-on={i < filled ? \"true\" : \"false\"} />\n ))}\n </span>\n );\n}\n\nexport function Conversation({ config: rawConfig, ...rest }: ConversationProps) {\n const parsed = useMemo(() => conversationSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"conversation\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return <ConversationInner config={parsed.data} {...rest} />;\n}\n\nfunction ConversationInner({\n config,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n provider,\n}: ConversationProps) {\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"conversation\",\n onComplete,\n onEvent,\n resetKey,\n });\n // Keyed by runId so every reset remounts with a fresh transcript and a restarted provider.\n return (\n <ConversationRun\n key={life.runId}\n config={config}\n life={life}\n provider={provider}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\ninterface ConversationRunProps {\n config: ConversationConfig;\n life: ModuleLifecycle;\n provider?: ConversationProvider;\n hideHeader?: boolean;\n className?: string;\n}\n\nfunction ConversationRun({ config, life, provider, hideHeader, className }: ConversationRunProps) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { contact } = config.content;\n const { behavior } = config;\n\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [typing, setTyping] = useState(false);\n const [turn, setTurn] = useState<ConversationTurn | null>(null);\n const [playing, setPlaying] = useState(true);\n const [chosen, setChosen] = useState<ScriptedResponse[]>([]);\n const [done, setDone] = useState(false);\n\n const providerRef = useRef<ConversationProvider | null>(null);\n /** Returns false once this run is unmounted; pending playback then stops. */\n const aliveRef = useRef<() => boolean>(() => false);\n const timersRef = useRef<Set<ReturnType<typeof setTimeout>>>(new Set());\n const logRef = useRef<HTMLDivElement>(null);\n const repliesRef = useRef<HTMLDivElement>(null);\n const completedRef = useRef(false);\n\n const wait = useCallback(\n (ms: number) =>\n new Promise<void>((resolve) => {\n const id = setTimeout(() => {\n timersRef.current.delete(id);\n resolve();\n }, ms);\n timersRef.current.add(id);\n }),\n [],\n );\n\n // Play a turn's messages one by one, honouring typing delays. Aborts once the run is unmounted.\n const playTurn = useCallback(\n async (next: ConversationTurn) => {\n const alive = aliveRef.current;\n setPlaying(true);\n setTurn(next);\n for (const [i, m] of next.node.messages.entries()) {\n if (!alive()) return;\n if (m.from === \"system\") {\n await wait(m.delayMs ?? SYSTEM_DELAY);\n } else if (behavior.typingIndicator) {\n setTyping(true);\n await wait(typingDelay(m.text, m.delayMs));\n setTyping(false);\n } else {\n await wait(m.delayMs ?? STAGGER);\n }\n if (!alive()) return;\n setMessages((prev) => [\n ...prev,\n { key: `${next.node.id}-${i}`, from: m.from, text: m.text },\n ]);\n }\n if (!alive()) return;\n setPlaying(false);\n if (next.done) setDone(true);\n else\n requestAnimationFrame(() =>\n repliesRef.current?.querySelector<HTMLButtonElement>(\"button\")?.focus(),\n );\n },\n [behavior.typingIndicator, wait],\n );\n\n // Start the conversation on mount; stop playback and clear timers on unmount.\n useEffect(() => {\n let alive = true;\n aliveRef.current = () => alive;\n const timers = timersRef.current;\n providerRef.current = provider ?? createScriptedProvider(config);\n Promise.resolve(providerRef.current.start()).then((first) => {\n if (alive) void playTurn(first);\n });\n return () => {\n alive = false;\n timers.forEach(clearTimeout);\n timers.clear();\n };\n }, [config, provider, playTurn]);\n\n // Keep the newest message in view.\n useEffect(() => {\n const el = logRef.current;\n if (!el) return;\n el.scrollTo({ top: el.scrollHeight, behavior: reduced ? \"auto\" : \"smooth\" });\n }, [messages.length, typing, done, reduced]);\n\n const summary = useMemo(\n () => (done ? summarizeConversation(chosen, turn?.node) : null),\n [done, chosen, turn],\n );\n\n // Complete once the ending has fully played out.\n useEffect(() => {\n if (!done || !summary || completedRef.current) return;\n completedRef.current = true;\n life.complete({\n score: summary.score,\n details: {\n outcome: summary.outcome,\n tones: summary.tones,\n path: chosen.map((r) => r.id),\n ending: turn?.node.id,\n },\n });\n announce(`${t(`conv.outcome.${summary.outcome}`)}. ${t(\"a11y.moduleComplete\")}`);\n }, [done, summary, chosen, turn, life, announce, t]);\n\n const responses = useMemo(() => (turn && !turn.done ? responsesOf(turn.node) : []), [turn]);\n const canReply = !playing && !done && responses.length > 0;\n\n const reply = useCallback(\n (r: ScriptedResponse) => {\n if (!canReply || !providerRef.current) return;\n life.attempt();\n life.emit(\"module:answer\", {\n nodeId: turn?.node.id,\n responseId: r.id,\n tone: r.tone,\n effectiveness: r.effectiveness,\n next: r.next,\n });\n setChosen((prev) => [...prev, r]);\n setMessages((prev) => [\n ...prev,\n {\n key: `you-${prev.length}`,\n from: \"you\",\n text: r.text,\n note: behavior.showFeedback\n ? { tone: r.tone, effectiveness: r.effectiveness, feedback: r.feedback }\n : undefined,\n },\n ]);\n if (behavior.showFeedback && r.feedback) announce(r.feedback);\n setPlaying(true);\n Promise.resolve(providerRef.current.respond(r.id)).then((next) => {\n if (aliveRef.current()) void playTurn(next);\n });\n },\n [canReply, life, turn, behavior.showFeedback, announce, playTurn],\n );\n\n const restart = useCallback(() => {\n life.reset();\n life.emit(\"module:reset\");\n }, [life]);\n\n // Keyboard: number keys 1–5 pick a reply.\n const onKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLElement>) => {\n if (!canReply) return;\n const target = e.target as HTMLElement | null;\n if (target && /^(INPUT|TEXTAREA|SELECT)$/.test(target.tagName)) return;\n if (!/^[1-5]$/.test(e.key)) return;\n const r = responses[Number(e.key) - 1];\n if (!r) return;\n e.preventDefault();\n reply(r);\n },\n [canReply, responses, reply],\n );\n\n const bubbleMotion = {\n initial: reduced ? false : { opacity: 0, y: 10, scale: 0.97 },\n animate: { opacity: 1, y: 0, scale: 1 },\n transition: { duration: reduced ? 0 : 0.22, ease: [0.2, 0.8, 0.2, 1] as const },\n };\n\n return (\n <ModuleShell\n type=\"conversation\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : config.instructions}\n appearance={config.appearance}\n className={className}\n announcement={message}\n onKeyDown={onKeyDown}\n >\n <div className=\"nb-conv\">\n <header className=\"nb-conv__header\">\n {contact.avatar ? (\n <SafeImage media={contact.avatar} className=\"nb-conv__avatar\" showCaption={false} />\n ) : (\n <span className=\"nb-conv__avatar nb-conv__avatar--initials\" aria-hidden>\n {initials(contact.name)}\n </span>\n )}\n <div className=\"nb-conv__contact\">\n <div className=\"nb-conv__name\">{contact.name}</div>\n {(contact.role || contact.status) && (\n <div className=\"nb-conv__meta\">\n {contact.role && <span>{contact.role}</span>}\n {contact.status && (\n <span className=\"nb-conv__status\">\n <span className=\"nb-conv__status-dot\" aria-hidden />\n {contact.status}\n </span>\n )}\n </div>\n )}\n </div>\n </header>\n\n <div\n ref={logRef}\n className=\"nb-conv__log\"\n role=\"log\"\n aria-live=\"polite\"\n aria-label={contact.name}\n >\n <AnimatePresence initial={false}>\n {messages.map((m) => (\n <motion.div\n key={m.key}\n className={clsx(\"nb-conv__row\", `nb-conv__row--${m.from}`)}\n {...bubbleMotion}\n layout={!reduced}\n >\n {m.from === \"system\" ? (\n <span className=\"nb-conv__system\">\n <RichText text={m.text} />\n </span>\n ) : (\n <div className=\"nb-conv__stack\">\n <span className=\"nb-sr-only\">\n {m.from === \"you\" ? t(\"conv.you\") : contact.name}:{\" \"}\n </span>\n <div className=\"nb-conv__bubble\">\n <RichText text={m.text} />\n </div>\n {m.note && (\n <div className=\"nb-conv__note\" data-tone={badgeTone(m.note.effectiveness)}>\n <div className=\"nb-conv__note-head\">\n {m.note.tone && (\n <Badge tone={badgeTone(m.note.effectiveness)}>{m.note.tone}</Badge>\n )}\n <EffectivenessMeter\n value={m.note.effectiveness}\n label={t(\"conv.effectiveness\")}\n />\n </div>\n {m.note.feedback && (\n <div className=\"nb-conv__note-text\">\n <RichText text={m.note.feedback} />\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </motion.div>\n ))}\n {typing && (\n <motion.div\n key=\"typing\"\n className=\"nb-conv__row nb-conv__row--them\"\n {...bubbleMotion}\n exit={{ opacity: 0, transition: { duration: 0.1 } }}\n >\n <div className=\"nb-conv__bubble nb-conv__bubble--typing\">\n <span className=\"nb-sr-only\">{t(\"conv.typing\", { name: contact.name })}</span>\n <span className=\"nb-conv__dots\" aria-hidden>\n <span />\n <span />\n <span />\n </span>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n\n <AnimatePresence initial={false}>\n {canReply && (\n <motion.div\n key={`composer-${turn?.node.id}`}\n className=\"nb-conv__composer\"\n initial={reduced ? false : { opacity: 0, y: 12 }}\n animate={{ opacity: 1, y: 0 }}\n exit={reduced ? { opacity: 0 } : { opacity: 0, y: 8 }}\n transition={{ duration: reduced ? 0 : 0.2 }}\n >\n <div className=\"nb-conv__composer-label\" id={`${config.id}-replies`}>\n <Send aria-hidden />\n {t(\"conv.chooseReply\")}\n </div>\n <div\n ref={repliesRef}\n className=\"nb-conv__replies\"\n role=\"group\"\n aria-labelledby={`${config.id}-replies`}\n >\n {responses.map((r, i) => (\n <button\n key={r.id}\n type=\"button\"\n className=\"nb-conv__reply\"\n onClick={() => reply(r)}\n >\n <span className=\"nb-conv__reply-key\" aria-hidden>\n {i + 1}\n </span>\n <span className=\"nb-conv__reply-text\">\n <RichText text={r.text} />\n </span>\n {r.tone && <Badge className=\"nb-conv__reply-tone\">{r.tone}</Badge>}\n </button>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {done && summary && (\n <div className=\"nb-conv__summary\" data-outcome={summary.outcome}>\n <CompletionCard\n score={summary.score}\n passThreshold={0.7}\n title={t(\"conv.summary\")}\n text={turn?.node.summary ?? config.feedback.complete}\n stats={[\n { label: t(\"conv.replies\"), value: chosen.length },\n { label: t(\"conv.tone\"), value: summary.tones.length },\n ]}\n onRetry={behavior.allowRetry ? restart : undefined}\n retryLabel={t(\"conv.replay\")}\n >\n <div className=\"nb-conv__outcome\" role=\"status\">\n <OutcomeIcon outcome={summary.outcome} />\n <span>{t(`conv.outcome.${summary.outcome}`)}</span>\n </div>\n {summary.tones.length > 0 && (\n <div className=\"nb-conv__tones\">\n <div className=\"nb-conv__section-title\">{t(\"conv.tones\")}</div>\n <div className=\"nb-conv__chips\">\n {summary.tones.map((tone) => (\n <Badge key={tone} tone=\"accent\">\n {tone}\n </Badge>\n ))}\n </div>\n </div>\n )}\n {chosen.length > 0 && (\n <div className=\"nb-conv__transcript\">\n <div className=\"nb-conv__section-title\">{t(\"conv.transcript\")}</div>\n <ol className=\"nb-conv__transcript-list\">\n {chosen.map((r, i) => (\n <li\n key={`${r.id}-${i}`}\n className=\"nb-conv__transcript-item\"\n data-tone={badgeTone(r.effectiveness)}\n >\n <div className=\"nb-conv__transcript-head\">\n <span className=\"nb-conv__transcript-text\">\n <RichText text={r.text} />\n </span>\n <EffectivenessMeter\n value={r.effectiveness}\n label={t(\"conv.effectiveness\")}\n />\n </div>\n {r.feedback && (\n <div className=\"nb-conv__transcript-feedback\">\n <RichText text={r.feedback} />\n </div>\n )}\n </li>\n ))}\n </ol>\n </div>\n )}\n </CompletionCard>\n </div>\n )}\n </div>\n </ModuleShell>\n );\n}\n\nexport default Conversation;\n","import {\n Award,\n BarChart3,\n Bell,\n BookOpen,\n Brain,\n Briefcase,\n Building,\n Calculator,\n Calendar,\n ChartBar,\n ChartColumn,\n ChartLine,\n ChartPie,\n CircleCheck,\n CircleHelp,\n ClipboardList,\n Clock,\n Code,\n Compass,\n CreditCard,\n Database,\n DollarSign,\n Eye,\n FileText,\n Filter,\n Flag,\n FlaskConical,\n Gauge,\n GitBranch,\n Globe,\n GraduationCap,\n Handshake,\n Heart,\n Image,\n Info,\n Key,\n Layers,\n Lightbulb,\n ListChecks,\n Lock,\n Mail,\n Map,\n Megaphone,\n MessageSquare,\n Milestone,\n Package,\n Palette,\n PenTool,\n Percent,\n Phone,\n Presentation,\n Radar,\n Receipt,\n RefreshCw,\n Rocket,\n Route,\n Scale,\n Search,\n Send,\n Settings,\n Shield,\n SlidersHorizontal,\n Smartphone,\n Sparkles,\n Star,\n Table,\n Target,\n ThumbsUp,\n TrendingUp,\n TriangleAlert,\n Trophy,\n Truck,\n UserCheck,\n Users,\n Video,\n Wallet,\n Wrench,\n Zap,\n type LucideIcon,\n} from \"lucide-react\";\n\n/**\n * Curated, tree-shakeable set of icons that content can reference by kebab-case name\n * (e.g. `\"icon\": \"rocket\"`). A curated map keeps bundles small; importing the full\n * lucide icon map would add thousands of icons to every consumer's bundle.\n */\nexport const contentIcons: Record<string, LucideIcon> = {\n award: Award,\n \"bar-chart\": BarChart3,\n \"bar-chart-3\": BarChart3,\n \"chart-bar\": ChartBar,\n \"chart-column\": ChartColumn,\n \"chart-line\": ChartLine,\n \"chart-pie\": ChartPie,\n \"line-chart\": ChartLine,\n \"pie-chart\": ChartPie,\n bell: Bell,\n \"book-open\": BookOpen,\n brain: Brain,\n briefcase: Briefcase,\n building: Building,\n calculator: Calculator,\n calendar: Calendar,\n \"circle-check\": CircleCheck,\n \"check-circle\": CircleCheck,\n \"circle-help\": CircleHelp,\n \"help-circle\": CircleHelp,\n \"clipboard-list\": ClipboardList,\n clock: Clock,\n code: Code,\n compass: Compass,\n \"credit-card\": CreditCard,\n database: Database,\n \"dollar-sign\": DollarSign,\n eye: Eye,\n \"file-text\": FileText,\n filter: Filter,\n flag: Flag,\n \"flask-conical\": FlaskConical,\n gauge: Gauge,\n \"git-branch\": GitBranch,\n globe: Globe,\n \"graduation-cap\": GraduationCap,\n handshake: Handshake,\n heart: Heart,\n image: Image,\n info: Info,\n key: Key,\n layers: Layers,\n lightbulb: Lightbulb,\n \"list-checks\": ListChecks,\n lock: Lock,\n mail: Mail,\n map: Map,\n megaphone: Megaphone,\n \"message-square\": MessageSquare,\n milestone: Milestone,\n package: Package,\n palette: Palette,\n \"pen-tool\": PenTool,\n percent: Percent,\n phone: Phone,\n presentation: Presentation,\n radar: Radar,\n receipt: Receipt,\n \"refresh-cw\": RefreshCw,\n rocket: Rocket,\n route: Route,\n scale: Scale,\n search: Search,\n send: Send,\n settings: Settings,\n shield: Shield,\n \"sliders-horizontal\": SlidersHorizontal,\n smartphone: Smartphone,\n sparkles: Sparkles,\n star: Star,\n table: Table,\n target: Target,\n \"thumbs-up\": ThumbsUp,\n \"trending-up\": TrendingUp,\n \"triangle-alert\": TriangleAlert,\n \"alert-triangle\": TriangleAlert,\n trophy: Trophy,\n truck: Truck,\n \"user-check\": UserCheck,\n users: Users,\n video: Video,\n wallet: Wallet,\n wrench: Wrench,\n zap: Zap,\n};\n\n/** Names accepted by `contentIcons`. */\nexport const contentIconNames = Object.keys(contentIcons);\n\n/** Resolve a kebab-case icon name to a component (null when unknown). */\nexport function resolveContentIcon(name: string | undefined): LucideIcon | null {\n if (!name) return null;\n const key = name.toLowerCase();\n // Own keys only, so names like \"constructor\" never resolve to Object.prototype members.\n return Object.prototype.hasOwnProperty.call(contentIcons, key)\n ? (contentIcons[key] ?? null)\n : null;\n}\n","import {\n useCallback,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n} from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport {\n ArrowLeft,\n ArrowRight,\n Check,\n Clock,\n CornerDownRight,\n GitBranch,\n ListChecks,\n UserRound,\n type LucideIcon,\n} from \"lucide-react\";\nimport clsx from \"clsx\";\nimport { processExplorerSchema, type ProcessExplorerConfig } from \"@nibblearn/core\";\nimport type { ModuleProps } from \"../types\";\nimport { resolveContentIcon } from \"../../primitives/icons\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Button } from \"../../primitives/Button\";\nimport { ProgressBar } from \"../../primitives/ProgressBar\";\nimport { SafeImage } from \"../../primitives/SafeImage\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./process-explorer.css\";\n\nexport type ProcessExplorerProps = ModuleProps<ProcessExplorerConfig>;\n\nexport function ProcessExplorer({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: ProcessExplorerProps) {\n const parsed = useMemo(() => processExplorerSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"process-explorer\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <ProcessExplorerInner\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\n/** Resolve a kebab-case icon name (\"bar-chart-3\") through the curated content icon set. */\nfunction resolveIcon(name: string | undefined): LucideIcon | null {\n return resolveContentIcon(name);\n}\n\n/** Owns the lifecycle; every reset remounts ProcessExplorerRun with fresh state (keyed by runId). */\nfunction ProcessExplorerInner(props: ProcessExplorerProps) {\n const { config, onComplete, onEvent, resetKey } = props;\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"process-explorer\",\n onComplete,\n onEvent,\n resetKey,\n });\n return <ProcessExplorerRun key={life.runId} {...props} life={life} />;\n}\n\nfunction ProcessExplorerRun({\n life,\n config,\n hideHeader,\n className,\n}: ProcessExplorerProps & { life: ModuleLifecycle }) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { stages } = config.content;\n const { behavior } = config;\n const total = stages.length;\n\n const [current, setCurrent] = useState(0);\n const [visited, setVisited] = useState<string[]>(() => [stages[0]!.id]);\n const [interacted, setInteracted] = useState(false);\n const [finished, setFinished] = useState(false);\n const [direction, setDirection] = useState(1);\n const [focusIndex, setFocusIndex] = useState(0);\n const nodeRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const iconFor = useMemo(() => stages.map((s) => resolveIcon(s.icon)), [stages]);\n const indexOf = useCallback((id: string) => stages.findIndex((s) => s.id === id), [stages]);\n const stage = stages[current]!;\n const allVisited = visited.length >= total;\n\n const select = useCallback(\n (i: number, via: string) => {\n if (i < 0 || i >= total) return;\n const target = stages[i]!;\n setDirection(i >= current ? 1 : -1);\n setCurrent(i);\n setFocusIndex(i);\n setInteracted(true);\n life.emit(\"module:interact\", { stageId: target.id, stageIndex: i, via });\n announce(`${t(\"process.stage\", { index: i + 1 })}: ${target.title}`);\n if (visited.includes(target.id)) return;\n const nextVisited = [...visited, target.id];\n setVisited(nextVisited);\n if (behavior.requireAll && nextVisited.length >= total) {\n life.complete({ details: { visited: nextVisited } });\n announce(`${t(\"process.allExplored\")} ${t(\"a11y.moduleComplete\")}`);\n }\n },\n [total, stages, current, life, announce, t, visited, behavior.requireAll],\n );\n\n const finish = useCallback(() => {\n life.complete({ details: { visited } });\n setFinished(true);\n announce(t(\"a11y.moduleComplete\"));\n }, [life, visited, announce, t]);\n\n const restart = () => {\n life.reset();\n life.emit(\"module:reset\");\n };\n\n const focusNode = (i: number) => {\n const clamped = Math.max(0, Math.min(total - 1, i));\n setFocusIndex(clamped);\n nodeRefs.current[clamped]?.focus();\n };\n\n const onStepperKeyDown = (e: ReactKeyboardEvent<HTMLOListElement>) => {\n const keys: Record<string, number | \"home\" | \"end\"> = {\n ArrowRight: 1,\n ArrowDown: 1,\n ArrowLeft: -1,\n ArrowUp: -1,\n Home: \"home\",\n End: \"end\",\n };\n const action = keys[e.key];\n if (action === undefined) return;\n e.preventDefault();\n if (action === \"home\") focusNode(0);\n else if (action === \"end\") focusNode(total - 1);\n else focusNode(focusIndex + action);\n };\n\n const canFinish = behavior.requireAll ? allVisited : interacted;\n\n if (finished) {\n return (\n <ModuleShell\n type=\"process-explorer\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n appearance={config.appearance}\n className={className}\n announcement={message}\n width=\"wide\"\n >\n <CompletionCard\n text={config.feedback.complete ?? t(\"process.allExplored\")}\n stats={[{ label: t(\"process.stages\"), value: `${visited.length}/${total}` }]}\n onRetry={restart}\n retryLabel={t(\"common.restart\")}\n >\n <ol className=\"nb-process__summary\">\n {stages.map((s, i) => {\n const Icon = iconFor[i];\n return (\n <li\n key={s.id}\n className=\"nb-process__summary-item\"\n data-visited={visited.includes(s.id) ? \"true\" : \"false\"}\n >\n <span className=\"nb-process__summary-icon\">\n {Icon ? <Icon aria-hidden /> : <span>{i + 1}</span>}\n </span>\n <span className=\"nb-process__summary-title\">{s.title}</span>\n {visited.includes(s.id) && <Check aria-label={t(\"process.visited\")} />}\n </li>\n );\n })}\n </ol>\n </CompletionCard>\n </ModuleShell>\n );\n }\n\n const StageIcon = iconFor[current];\n const panelId = `${config.id}-process-panel`;\n\n return (\n <ModuleShell\n type=\"process-explorer\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : (config.instructions ?? t(\"process.instructions\"))}\n appearance={config.appearance}\n className={className}\n announcement={message}\n width=\"wide\"\n aside={\n <span className=\"nb-counter\">\n {t(\"process.explored\", { count: visited.length, total })}\n </span>\n }\n eyebrow={\n <ProgressBar\n value={visited.length / total}\n showLabel={false}\n size=\"sm\"\n tone={allVisited ? \"success\" : \"accent\"}\n />\n }\n >\n <ul className=\"nb-sr-only\">\n {stages.map((s, i) => (\n <li key={s.id}>\n {t(\"process.stage\", { index: i + 1 })}: {s.title}\n {visited.includes(s.id) ? ` — ${t(\"process.visited\")}` : \"\"}\n </li>\n ))}\n </ul>\n\n <div className={clsx(\"nb-process\", `nb-process--${behavior.layout}`)}>\n <ol\n className=\"nb-process__stepper\"\n aria-label={t(\"process.stages\")}\n onKeyDown={onStepperKeyDown}\n >\n {stages.map((s, i) => {\n const Icon = iconFor[i];\n const isCurrent = i === current;\n const isVisited = visited.includes(s.id);\n const state = isCurrent ? \"current\" : isVisited ? \"visited\" : \"todo\";\n return (\n <li key={s.id} className=\"nb-process__item\" data-state={state}>\n <button\n ref={(el) => {\n nodeRefs.current[i] = el;\n }}\n type=\"button\"\n className=\"nb-process__node\"\n aria-current={isCurrent ? \"step\" : undefined}\n aria-controls={panelId}\n tabIndex={focusIndex === i ? 0 : -1}\n onFocus={() => setFocusIndex(i)}\n onClick={() => select(i, \"node\")}\n >\n <span className=\"nb-process__icon\" aria-hidden>\n {Icon ? <Icon /> : <span className=\"nb-process__icon-number\">{i + 1}</span>}\n {isVisited && !isCurrent && (\n <span className=\"nb-process__icon-check\">\n <Check strokeWidth={3} />\n </span>\n )}\n </span>\n <span className=\"nb-process__node-body\">\n <span className=\"nb-process__node-index\">\n {t(\"process.stage\", { index: i + 1 })}\n {isVisited && !isCurrent && (\n <span className=\"nb-sr-only\"> — {t(\"process.visited\")}</span>\n )}\n </span>\n <span className=\"nb-process__node-title\">{s.title}</span>\n {s.summary && <span className=\"nb-process__node-summary\">{s.summary}</span>}\n {(s.owner || s.duration) && (\n <span className=\"nb-process__chips\">\n {s.owner && (\n <span className=\"nb-process__chip\">\n <UserRound aria-hidden />\n <span className=\"nb-sr-only\">{t(\"process.owner\")}: </span>\n {s.owner}\n </span>\n )}\n {s.duration && (\n <span className=\"nb-process__chip\">\n <Clock aria-hidden />\n <span className=\"nb-sr-only\">{t(\"process.duration\")}: </span>\n {s.duration}\n </span>\n )}\n </span>\n )}\n </span>\n </button>\n </li>\n );\n })}\n </ol>\n\n <div className=\"nb-process__panel-wrap\" id={panelId} aria-live=\"polite\">\n <AnimatePresence mode=\"wait\" initial={false} custom={direction}>\n <motion.article\n key={`${life.runId}-${stage.id}`}\n className=\"nb-process__panel\"\n aria-labelledby={`${panelId}-title`}\n custom={direction}\n initial={reduced ? false : { opacity: 0, x: 16 * direction }}\n animate={{ opacity: 1, x: 0 }}\n exit={reduced ? { opacity: 0 } : { opacity: 0, x: -12 * direction }}\n transition={{ duration: reduced ? 0 : 0.22, ease: [0.2, 0.8, 0.2, 1] }}\n >\n <header className=\"nb-process__panel-head\">\n <span className=\"nb-process__panel-icon\" aria-hidden>\n {StageIcon ? <StageIcon /> : <span>{current + 1}</span>}\n </span>\n <div className=\"nb-process__panel-heading\">\n <span className=\"nb-process__eyebrow\">\n {t(\"common.step\", { current: current + 1, total })}\n </span>\n <h3 className=\"nb-process__panel-title\" id={`${panelId}-title`}>\n {stage.title}\n </h3>\n </div>\n </header>\n\n {(stage.owner || stage.duration) && (\n <dl className=\"nb-process__meta\">\n {stage.owner && (\n <div className=\"nb-process__meta-item\">\n <dt>\n <UserRound aria-hidden />\n {t(\"process.owner\")}\n </dt>\n <dd>{stage.owner}</dd>\n </div>\n )}\n {stage.duration && (\n <div className=\"nb-process__meta-item\">\n <dt>\n <Clock aria-hidden />\n {t(\"process.duration\")}\n </dt>\n <dd>{stage.duration}</dd>\n </div>\n )}\n </dl>\n )}\n\n {stage.dependsOn.length > 0 && (\n <div className=\"nb-process__deps\">\n <span className=\"nb-process__deps-label\">\n <CornerDownRight aria-hidden />\n {t(\"process.dependsOn\")}\n </span>\n <div className=\"nb-process__deps-list\">\n {stage.dependsOn.map((id) => {\n const i = indexOf(id);\n const dep = stages[i];\n if (!dep) return null;\n return (\n <button\n key={id}\n type=\"button\"\n className=\"nb-process__dep\"\n onClick={() => select(i, \"dependency\")}\n data-visited={visited.includes(id) ? \"true\" : \"false\"}\n >\n {visited.includes(id) ? (\n <Check aria-hidden strokeWidth={3} />\n ) : (\n <span className=\"nb-process__dep-index\" aria-hidden>\n {i + 1}\n </span>\n )}\n {dep.title}\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n <div className=\"nb-process__body\">\n <RichText text={stage.details} paragraphs className=\"nb-process__details\" />\n {stage.image && <SafeImage media={stage.image} className=\"nb-process__image\" />}\n </div>\n\n {stage.checklist.length > 0 && (\n <section className=\"nb-process__checklist\" aria-label={t(\"process.checklist\")}>\n <h4 className=\"nb-process__section-title\">\n <ListChecks aria-hidden />\n {t(\"process.checklist\")}\n </h4>\n <ul className=\"nb-process__checklist-items\">\n {stage.checklist.map((item, i) => (\n <li key={i} className=\"nb-process__checklist-item\">\n <span className=\"nb-process__checklist-mark\" aria-hidden>\n <Check strokeWidth={3} />\n </span>\n <RichText text={item} />\n </li>\n ))}\n </ul>\n </section>\n )}\n\n {stage.branches.length > 0 && (\n <section className=\"nb-process__branches\" aria-label={t(\"process.branches\")}>\n <h4 className=\"nb-process__section-title\">\n <GitBranch aria-hidden />\n {t(\"process.branches\")}\n </h4>\n <div className=\"nb-process__branch-list\">\n {stage.branches.map((b, i) => {\n const targetIndex = indexOf(b.to);\n const target = stages[targetIndex];\n return (\n <button\n key={i}\n type=\"button\"\n className=\"nb-process__branch\"\n onClick={() => select(targetIndex, \"branch\")}\n >\n <span className=\"nb-process__branch-label\">{b.label}</span>\n {target && (\n <span className=\"nb-process__branch-target\">\n <ArrowRight aria-hidden />\n {target.title}\n </span>\n )}\n </button>\n );\n })}\n </div>\n </section>\n )}\n\n <footer className=\"nb-process__panel-nav\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => select(current - 1, \"prev\")}\n disabled={current === 0}\n leading={<ArrowLeft aria-hidden />}\n >\n {t(\"process.previousStage\")}\n </Button>\n <span className=\"nb-spacer\" />\n {canFinish && (\n <Button\n variant={current + 1 >= total || allVisited ? \"primary\" : \"secondary\"}\n size=\"sm\"\n onClick={finish}\n leading={<Check aria-hidden />}\n >\n {t(\"common.finish\")}\n </Button>\n )}\n <Button\n variant={\n current + 1 >= total\n ? \"secondary\"\n : canFinish && allVisited\n ? \"secondary\"\n : \"primary\"\n }\n size=\"sm\"\n onClick={() => select(current + 1, \"next\")}\n disabled={current + 1 >= total}\n trailing={<ArrowRight aria-hidden />}\n >\n {t(\"process.nextStage\")}\n </Button>\n </footer>\n </motion.article>\n </AnimatePresence>\n </div>\n </div>\n </ModuleShell>\n );\n}\n\nexport default ProcessExplorer;\n","import { useCallback, useMemo, useState, type CSSProperties, type ReactNode } from \"react\";\nimport { motion } from \"motion/react\";\nimport { AlertCircle, Check, Eye, Lightbulb, Search, X } from \"lucide-react\";\nimport clsx from \"clsx\";\nimport {\n findAllScore,\n spotTheMistakeSchema,\n type Mistake,\n type SpotTheMistakeConfig,\n} from \"@nibblearn/core\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Button } from \"../../primitives/Button\";\nimport { Badge } from \"../../primitives/Badge\";\nimport { AnimatedFeedback, type FeedbackTone } from \"../../primitives/Feedback\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { SafeImage } from \"../../primitives/SafeImage\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./spot-the-mistake.css\";\n\nexport type SpotTheMistakeProps = ModuleProps<SpotTheMistakeConfig>;\n\nexport function SpotTheMistake({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: SpotTheMistakeProps) {\n const parsed = useMemo(() => spotTheMistakeSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"spot-the-mistake\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <SpotLifecycle\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\nfunction SpotLifecycle({\n config,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: SpotTheMistakeProps) {\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"spot-the-mistake\",\n onComplete,\n onEvent,\n resetKey,\n });\n return (\n <SpotBody\n key={life.runId}\n config={config}\n life={life}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\ninterface BodyProps {\n config: SpotTheMistakeConfig;\n life: ModuleLifecycle;\n hideHeader?: boolean;\n className?: string;\n}\n\ntype TargetState = \"idle\" | \"selected\" | \"found\" | \"wrong\" | \"missed\";\n\ninterface FeedbackState {\n key: number;\n tone: FeedbackTone;\n title: string;\n text?: string;\n}\n\n/** Values that read better in a monospace face: ids, amounts, dates, URLs, UTM strings. */\nconst MONO_RE = /^(https?:\\/\\/|[A-Z0-9_-]{3,}$|[\\d\\s.,:/+%€$£¥-]+$|[\\d]{2,})|[?&]utm_|\\{[a-z_]+\\}/;\n\nfunction SpotBody({ config, life, hideHeader, className }: BodyProps) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { canvas, mistakes, summary } = config.content;\n const { behavior } = config;\n const total = mistakes.length;\n const instant = behavior.checkMode === \"instant\";\n\n const mistakeByTarget = useMemo(() => new Map(mistakes.map((m) => [m.targetId, m])), [mistakes]);\n const mistakeIndex = useMemo(\n () => new Map(mistakes.map((m, i) => [m.targetId, i + 1])),\n [mistakes],\n );\n const targetLabel = useMemo(() => {\n const map = new Map<string, string>();\n if (canvas.kind === \"image\") canvas.regions.forEach((r) => map.set(r.id, r.label));\n else canvas.rows.forEach((r) => map.set(r.id, r.label));\n return map;\n }, [canvas]);\n const sectionOf = useMemo(() => {\n const map = new Map<string, string | undefined>();\n if (canvas.kind === \"document\") canvas.rows.forEach((r) => map.set(r.id, r.section));\n return map;\n }, [canvas]);\n\n const [found, setFound] = useState<string[]>([]);\n const [wrong, setWrong] = useState<string[]>([]);\n const [selected, setSelected] = useState<string[]>([]);\n const [shaking, setShaking] = useState<string | null>(null);\n const [feedback, setFeedback] = useState<FeedbackState | null>(null);\n const [hintCount, setHintCount] = useState(0);\n const [hint, setHint] = useState<{ text: string; targetId: string } | null>(null);\n const [finished, setFinished] = useState(false);\n const [revealed, setRevealed] = useState(false);\n\n const remaining = useMemo(\n () => mistakes.filter((m) => !found.includes(m.targetId)),\n [mistakes, found],\n );\n\n const finish = useCallback(\n (nextFound: string[], nextWrong: string[], reveal: boolean) => {\n const score = findAllScore(nextFound.length, total, nextWrong.length);\n setFinished(true);\n setRevealed(reveal);\n setHint(null);\n life.complete({\n score,\n correct: nextFound.length,\n total,\n details: {\n found: nextFound,\n wrongPicks: nextWrong,\n revealed: reveal,\n hintsUsed: hintCount,\n },\n });\n announce(nextFound.length === total ? t(\"spot.allFound\") : t(\"a11y.moduleComplete\"));\n },\n [total, life, hintCount, announce, t],\n );\n\n const describe = useCallback(\n (m: Mistake): { title: string; text: string } => ({\n title: m.title ? `${t(\"spot.foundOne\")} ${m.title}` : t(\"spot.foundOne\"),\n text: m.explanation,\n }),\n [t],\n );\n\n const applyPicks = useCallback(\n (picks: string[]) => {\n const hits = picks.filter((id) => mistakeByTarget.has(id) && !found.includes(id));\n const misses = picks.filter((id) => !mistakeByTarget.has(id) && !wrong.includes(id));\n const nextFound = [...found, ...hits];\n const nextWrong = [...wrong, ...misses];\n setFound(nextFound);\n setWrong(nextWrong);\n setSelected([]);\n life.attempt();\n life.emit(\"module:answer\", {\n picks,\n hits,\n misses,\n found: nextFound.length,\n wrongPicks: nextWrong.length,\n });\n if (hits.length) setHint(null);\n\n const allFound = nextFound.length >= total;\n const overLimit = behavior.maxWrong > 0 && nextWrong.length > behavior.maxWrong;\n if (instant) {\n const id = picks[0]!;\n const m = mistakeByTarget.get(id);\n if (m) {\n const d = describe(m);\n setFeedback({ key: Date.now(), tone: \"correct\", ...d });\n announce(`${t(\"a11y.correctAnswer\")} ${d.title}`);\n } else {\n setShaking(id);\n setFeedback({ key: Date.now(), tone: \"incorrect\", title: t(\"spot.notAMistake\") });\n announce(`${t(\"a11y.incorrectAnswer\")} ${t(\"spot.notAMistake\")}`);\n }\n } else {\n const tone: FeedbackTone =\n hits.length && !misses.length ? \"correct\" : hits.length ? \"partial\" : \"incorrect\";\n setFeedback({\n key: Date.now(),\n tone,\n title: t(\"spot.found\", { found: nextFound.length, total }),\n text: misses.length ? t(\"spot.wrongPicks\", { count: misses.length }) : undefined,\n });\n if (misses.length) setShaking(misses[0]!);\n announce(t(\"spot.found\", { found: nextFound.length, total }));\n }\n if (allFound) finish(nextFound, nextWrong, false);\n else if (overLimit) finish(nextFound, nextWrong, true);\n },\n [\n mistakeByTarget,\n found,\n wrong,\n life,\n total,\n behavior.maxWrong,\n instant,\n describe,\n announce,\n t,\n finish,\n ],\n );\n\n const onTarget = useCallback(\n (id: string) => {\n if (finished) return;\n if (found.includes(id)) return;\n life.emit(\"module:interact\", { targetId: id });\n if (instant) {\n if (wrong.includes(id)) return;\n applyPicks([id]);\n } else {\n setSelected((prev) => (prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]));\n }\n },\n [finished, found, wrong, instant, applyPicks, life],\n );\n\n const showHint = useCallback(() => {\n if (remaining.length === 0) return;\n const m = remaining[hintCount % remaining.length]!;\n setHint({ text: m.hint ?? t(\"spot.hintArea\"), targetId: m.targetId });\n setHintCount((c) => c + 1);\n life.emit(\"module:hint\", { targetId: m.targetId, index: hintCount });\n }, [remaining, hintCount, life, t]);\n\n const stateFor = (id: string): TargetState => {\n if (found.includes(id)) return \"found\";\n if (revealed && mistakeByTarget.has(id)) return \"missed\";\n if (wrong.includes(id)) return \"wrong\";\n if (selected.includes(id)) return \"selected\";\n return \"idle\";\n };\n\n const hintSection =\n hint && !mistakeByTarget.get(hint.targetId)?.hint ? sectionOf.get(hint.targetId) : undefined;\n const hintTarget =\n hint && !mistakeByTarget.get(hint.targetId)?.hint && !hintSection ? hint.targetId : undefined;\n\n const renderMarker = (id: string, state: TargetState): ReactNode => {\n if (state !== \"found\" && state !== \"missed\") return null;\n return (\n <span className=\"nb-spot__marker\" data-state={state} aria-hidden>\n {state === \"found\" ? mistakeIndex.get(id) : <AlertCircle strokeWidth={2.5} />}\n </span>\n );\n };\n\n const shakeProps = (id: string) =>\n !reduced && shaking === id\n ? {\n animate: { x: [0, -6, 6, -4, 4, 0] },\n transition: { duration: 0.36 },\n onAnimationComplete: () => setShaking(null),\n }\n : { animate: { x: 0 } };\n\n // Image regions have no visible text, so they get an aria-label. Document rows keep their\n // visible text as the accessible name (WCAG 2.5.3) with a visually hidden \"Select\" prefix.\n const targetAria = (id: string, state: TargetState, labelled = true) => ({\n \"aria-label\": labelled ? t(\"spot.selectArea\", { label: targetLabel.get(id) ?? id }) : undefined,\n \"aria-pressed\": instant ? undefined : state === \"selected\" || state === \"found\",\n disabled: finished || state === \"found\" || (instant && state === \"wrong\"),\n \"data-state\": state,\n \"data-hinted\": hintTarget === id ? \"true\" : undefined,\n });\n\n const documentCanvas = canvas.kind === \"document\" && (\n <article className=\"nb-spot__doc\" aria-label={canvas.title}>\n <header className=\"nb-spot__doc-head\">\n <div className=\"nb-spot__doc-kicker\">\n <span className=\"nb-spot__doc-dot\" aria-hidden />\n {canvas.title}\n </div>\n {canvas.subtitle && <p className=\"nb-spot__doc-subtitle\">{canvas.subtitle}</p>}\n </header>\n {groupRows(canvas.rows).map((group, gi) => (\n <section\n key={gi}\n className=\"nb-spot__section\"\n data-hinted={hintSection && group.section === hintSection ? \"true\" : undefined}\n aria-label={group.section}\n >\n {group.section && <h4 className=\"nb-spot__section-title\">{group.section}</h4>}\n <div className=\"nb-spot__rows\">\n {group.rows.map((row) => {\n const state = stateFor(row.id);\n return (\n <motion.div key={row.id} className=\"nb-spot__row-wrap\" {...shakeProps(row.id)}>\n <button\n type=\"button\"\n className=\"nb-spot__row\"\n onClick={() => onTarget(row.id)}\n {...targetAria(row.id, state, false)}\n >\n <span className=\"nb-sr-only\">\n {t(\"spot.selectArea\", { label: \"\" }).trim()}{\" \"}\n </span>\n <span className=\"nb-spot__row-label\">{row.label}</span>\n <span className=\"nb-spot__row-body\">\n <span\n className={clsx(\n \"nb-spot__row-value\",\n MONO_RE.test(row.value) && \"nb-spot__row-value--mono\",\n )}\n >\n {row.value}\n </span>\n {row.note && <span className=\"nb-spot__row-note\">{row.note}</span>}\n </span>\n <span className=\"nb-spot__row-end\" aria-hidden>\n {state === \"idle\" || state === \"selected\" ? (\n <span className=\"nb-spot__magnifier\">\n {state === \"selected\" ? <Check strokeWidth={3} /> : <Search />}\n </span>\n ) : state === \"wrong\" ? (\n <span className=\"nb-spot__marker\" data-state=\"wrong\">\n <X strokeWidth={3} />\n </span>\n ) : (\n renderMarker(row.id, state)\n )}\n </span>\n </button>\n </motion.div>\n );\n })}\n </div>\n </section>\n ))}\n </article>\n );\n\n const imageCanvas = canvas.kind === \"image\" && (\n <div\n className=\"nb-spot__stage\"\n style={\n canvas.image.width && canvas.image.height\n ? { aspectRatio: `${canvas.image.width} / ${canvas.image.height}` }\n : undefined\n }\n >\n <SafeImage media={canvas.image} className=\"nb-spot__image\" showCaption={false} />\n {canvas.regions.map((r) => {\n const state = stateFor(r.id);\n const style: CSSProperties = {\n left: `${r.x}%`,\n top: `${r.y}%`,\n width: `${r.width}%`,\n height: `${r.height}%`,\n };\n return (\n <motion.button\n key={r.id}\n type=\"button\"\n className=\"nb-spot__region\"\n style={style}\n onClick={() => onTarget(r.id)}\n {...targetAria(r.id, state)}\n {...shakeProps(r.id)}\n >\n {state === \"wrong\" ? (\n <span className=\"nb-spot__marker\" data-state=\"wrong\" aria-hidden>\n <X strokeWidth={3} />\n </span>\n ) : (\n renderMarker(r.id, state)\n )}\n </motion.button>\n );\n })}\n </div>\n );\n\n const score = findAllScore(found.length, total, wrong.length);\n\n return (\n <ModuleShell\n type=\"spot-the-mistake\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={\n hideHeader ? undefined : (config.instructions ?? t(\"spot.instructions\", { count: total }))\n }\n appearance={config.appearance}\n className={className}\n announcement={message}\n aside={\n <span className=\"nb-spot__stats\">\n <Badge tone={found.length === total ? \"success\" : \"accent\"}>\n <Check aria-hidden strokeWidth={3} />\n {t(\"spot.found\", { found: found.length, total })}\n </Badge>\n <Badge tone={wrong.length ? \"danger\" : \"neutral\"}>\n <X aria-hidden strokeWidth={3} />\n {t(\"spot.wrongPicks\", { count: wrong.length })}\n </Badge>\n </span>\n }\n >\n {documentCanvas}\n {imageCanvas}\n\n {hint && !finished && (\n <motion.div\n key={hint.targetId + hintCount}\n className=\"nb-spot__hint\"\n role=\"note\"\n initial={reduced ? false : { opacity: 0, y: -4 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: reduced ? 0 : 0.18 }}\n >\n <Lightbulb aria-hidden />\n <RichText text={hint.text} />\n </motion.div>\n )}\n\n <AnimatedFeedback\n show={feedback !== null && !finished}\n tone={feedback?.tone ?? \"info\"}\n title={feedback?.title}\n text={feedback?.text}\n />\n\n {!finished && (\n <div className=\"nb-spot__footer\">\n <div className=\"nb-spot__footer-left\">\n {behavior.allowHints && remaining.length > 0 && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n leading={<Lightbulb aria-hidden />}\n onClick={showHint}\n >\n {t(\"common.showHint\")}\n </Button>\n )}\n {wrong.length >= 2 && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n leading={<Eye aria-hidden />}\n onClick={() => finish(found, wrong, true)}\n >\n {t(\"spot.revealRemaining\")}\n </Button>\n )}\n </div>\n {!instant && (\n <div className=\"nb-module__actions\">\n <Button\n variant=\"primary\"\n onClick={() => applyPicks(selected)}\n disabled={selected.length === 0}\n >\n {t(\"common.submit\")}\n </Button>\n </div>\n )}\n </div>\n )}\n\n {finished && (\n <CompletionCard\n score={score}\n passThreshold={Math.max(config.scoring.passThreshold, 0.7)}\n title={found.length === total ? t(\"spot.allFound\") : undefined}\n text={config.feedback.complete ?? summary ?? undefined}\n onRetry={\n behavior.allowRetry\n ? () => {\n life.reset();\n life.emit(\"module:reset\");\n }\n : undefined\n }\n >\n <div className=\"nb-spot__result-badges\">\n <Badge tone={found.length === total ? \"success\" : \"accent\"}>\n <Check aria-hidden strokeWidth={3} />\n {t(\"spot.found\", { found: found.length, total })}\n </Badge>\n <Badge tone={wrong.length ? \"danger\" : \"neutral\"}>\n <X aria-hidden strokeWidth={3} />\n {t(\"spot.wrongPicks\", { count: wrong.length })}\n </Badge>\n </div>\n <section className=\"nb-spot__list\" aria-label={t(\"spot.mistakeList\")}>\n <h4 className=\"nb-spot__list-title\">{t(\"spot.mistakeList\")}</h4>\n <ol className=\"nb-spot__list-items\">\n {mistakes.map((m, i) => {\n const ok = found.includes(m.targetId);\n return (\n <li\n key={m.targetId}\n className=\"nb-spot__list-item\"\n data-ok={ok ? \"true\" : \"false\"}\n >\n <span className=\"nb-spot__list-icon\" aria-hidden>\n {ok ? <Check strokeWidth={3} /> : <X strokeWidth={3} />}\n </span>\n <span className=\"nb-spot__list-body\">\n <span className=\"nb-spot__list-head\">\n <span className=\"nb-spot__list-num\">{i + 1}</span>\n <strong>{m.title ?? targetLabel.get(m.targetId)}</strong>\n <span className=\"nb-spot__list-target\">{targetLabel.get(m.targetId)}</span>\n <span className=\"nb-sr-only\">\n {ok ? t(\"common.correct\") : t(\"common.incorrect\")}\n </span>\n </span>\n <span className=\"nb-spot__list-text\">\n <RichText text={m.explanation} />\n </span>\n </span>\n </li>\n );\n })}\n </ol>\n </section>\n {summary && config.feedback.complete && (\n <p className=\"nb-spot__summary\">\n <RichText text={summary} />\n </p>\n )}\n </CompletionCard>\n )}\n </ModuleShell>\n );\n}\n\n/** Group document rows by section, preserving first-appearance order. Rows without a section form their own group. */\nfunction groupRows<T extends { section?: string }>(rows: T[]): { section?: string; rows: T[] }[] {\n const groups: { section?: string; rows: T[] }[] = [];\n for (const row of rows) {\n const last = groups[groups.length - 1];\n if (last && last.section === row.section) last.rows.push(row);\n else groups.push({ section: row.section, rows: [row] });\n }\n return groups;\n}\n\nexport default SpotTheMistake;\n","import { useCallback, useEffect, useMemo, useRef, useState, type CSSProperties } from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { CircleCheck, Minus, Plus, RotateCcw, Target } from \"lucide-react\";\nimport clsx from \"clsx\";\nimport {\n activeInsights,\n challengeMet,\n computeOutputs,\n defaultInputs,\n formatValue,\n whatIfSimulatorSchema,\n type SimulatorInput,\n type SimulatorOutput,\n type SimulatorScope,\n type WhatIfSimulatorConfig,\n} from \"@nibblearn/core\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Button } from \"../../primitives/Button\";\nimport { Feedback, AnimatedFeedback, type FeedbackTone } from \"../../primitives/Feedback\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./what-if-simulator.css\";\n\nexport type WhatIfSimulatorProps = ModuleProps<WhatIfSimulatorConfig>;\n\ntype Format = SimulatorInput[\"format\"];\n\nconst INTERACT_DEBOUNCE_MS = 150;\nconst COMPLETE_DEBOUNCE_MS = 600;\nconst COUNT_UP_MS = 280;\n\nconst INSIGHT_TONE: Record<\"info\" | \"success\" | \"warning\", FeedbackTone> = {\n info: \"info\",\n success: \"correct\",\n warning: \"partial\",\n};\n\nexport function WhatIfSimulator({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: WhatIfSimulatorProps) {\n const parsed = useMemo(() => whatIfSimulatorSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"what-if-simulator\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <WhatIfSimulatorInner\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Helpers\n * -------------------------------------------------------------------------- */\n\nfunction decimalsOf(step: number): number {\n const s = String(step);\n const e = s.indexOf(\"e-\");\n if (e >= 0) return Number(s.slice(e + 2));\n const dot = s.indexOf(\".\");\n return dot >= 0 ? s.length - dot - 1 : 0;\n}\n\n/** Snap a raw number to the input's grid and clamp it to [min, max]. */\nfunction snap(input: SimulatorInput, raw: number): number {\n if (!Number.isFinite(raw)) return input.default;\n const steps = Math.round((raw - input.min) / input.step);\n const v = input.min + steps * input.step;\n const clamped = Math.min(input.max, Math.max(input.min, v));\n return Number(clamped.toFixed(decimalsOf(input.step)));\n}\n\nfunction pctOf(input: SimulatorInput, value: number): number {\n const p = ((value - input.min) / (input.max - input.min)) * 100;\n return Math.min(100, Math.max(0, p));\n}\n\n/** Format a value, respecting the module's currency and the provider locale. */\nfunction useFormatter(currency: string) {\n const { locale } = useNibblearn();\n return useCallback(\n (value: number, format: Format) => formatValue(value, format, { currency, locale }),\n [currency, locale],\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Animated number (rAF count-up, ≤ 300ms, skipped for reduced motion)\n * -------------------------------------------------------------------------- */\n\nfunction AnimatedNumber({\n value,\n format,\n className,\n}: {\n value: number;\n format: (v: number) => string;\n className?: string;\n}) {\n const reduced = useReducedMotion();\n const canAnimate = !reduced && typeof requestAnimationFrame === \"function\";\n const [shown, setShown] = useState(value);\n // Last painted value; only touched inside effects / rAF callbacks.\n const paintedRef = useRef(value);\n\n // Without animation the displayed value simply tracks the target.\n if (!canAnimate && shown !== value) setShown(value);\n\n useEffect(() => {\n if (!canAnimate) {\n paintedRef.current = value;\n return;\n }\n const from = paintedRef.current;\n const to = value;\n if (from === to) return;\n let frame: number;\n if (!Number.isFinite(from) || !Number.isFinite(to)) {\n frame = requestAnimationFrame(() => {\n paintedRef.current = to;\n setShown(to);\n });\n return () => cancelAnimationFrame(frame);\n }\n const start = performance.now();\n const tick = (now: number) => {\n const p = Math.min(1, (now - start) / COUNT_UP_MS);\n const eased = 1 - Math.pow(1 - p, 3);\n const current = p >= 1 ? to : from + (to - from) * eased;\n paintedRef.current = current;\n setShown(current);\n if (p < 1) frame = requestAnimationFrame(tick);\n };\n frame = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(frame);\n }, [value, canAnimate]);\n\n return (\n <span className={className}>\n <span aria-hidden className=\"nb-sim__num\">\n {format(shown)}\n </span>\n <span className=\"nb-sr-only\">{format(value)}</span>\n </span>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Slider\n * -------------------------------------------------------------------------- */\n\ninterface SliderProps {\n moduleId: string;\n input: SimulatorInput;\n value: number;\n format: (v: number, f: Format) => string;\n onChange: (id: string, value: number) => void;\n}\n\nfunction SimSlider({ moduleId, input, value, format, onChange }: SliderProps) {\n const { t } = useNibblearn();\n const id = `${moduleId}-in-${input.id}`;\n const helpId = input.help ? `${id}-help` : undefined;\n const pct = pctOf(input, value);\n const formatted = format(value, input.format);\n const atMin = value <= input.min;\n const atMax = value >= input.max;\n\n return (\n <div className=\"nb-sim__field\" data-input={input.id}>\n <div className=\"nb-sim__field-head\">\n <label htmlFor={id} className=\"nb-sim__label\">\n {input.label}\n </label>\n <output htmlFor={id} className=\"nb-sim__pill\" aria-live=\"off\">\n {formatted}\n </output>\n </div>\n <div className=\"nb-sim__control\">\n <Button\n icon\n size=\"sm\"\n variant=\"secondary\"\n className=\"nb-sim__step\"\n aria-label={t(\"sim.decrease\", { label: input.label })}\n disabled={atMin}\n onClick={() => onChange(input.id, snap(input, value - input.step))}\n >\n <Minus aria-hidden />\n </Button>\n <input\n id={id}\n type=\"range\"\n className=\"nb-sim__range\"\n min={input.min}\n max={input.max}\n step={input.step}\n value={value}\n aria-valuetext={formatted}\n aria-describedby={helpId}\n style={{ \"--_pct\": `${pct}%` } as CSSProperties}\n onChange={(e) => onChange(input.id, snap(input, Number(e.target.value)))}\n />\n <Button\n icon\n size=\"sm\"\n variant=\"secondary\"\n className=\"nb-sim__step\"\n aria-label={t(\"sim.increase\", { label: input.label })}\n disabled={atMax}\n onClick={() => onChange(input.id, snap(input, value + input.step))}\n >\n <Plus aria-hidden />\n </Button>\n </div>\n <div className=\"nb-sim__range-meta\" aria-hidden>\n <span>{format(input.min, input.format)}</span>\n <span>{format(input.max, input.format)}</span>\n </div>\n {input.help && (\n <p id={helpId} className=\"nb-sim__help\">\n <RichText text={input.help} />\n </p>\n )}\n </div>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Bars chart (pure CSS, with a screen-reader table alternative)\n * -------------------------------------------------------------------------- */\n\nfunction BarsChart({\n outputs,\n scope,\n peaks,\n format,\n}: {\n outputs: SimulatorOutput[];\n scope: SimulatorScope;\n peaks: Record<string, number>;\n format: (v: number, f: Format) => string;\n}) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n return (\n <div className=\"nb-sim__chart\">\n <ul className=\"nb-sim__bars\" aria-hidden>\n {outputs.map((o) => {\n const v = scope[o.id] ?? NaN;\n const peak = peaks[o.id] ?? 0;\n const w = Number.isFinite(v) && peak > 0 ? Math.min(100, (Math.abs(v) / peak) * 100) : 0;\n return (\n <li key={o.id} className=\"nb-sim__bar-row\" data-output={o.id}>\n <span className=\"nb-sim__bar-label\">{o.label}</span>\n <span className=\"nb-sim__bar-track\">\n <motion.span\n className=\"nb-sim__bar-fill\"\n initial={false}\n animate={{ width: `${w}%` }}\n transition={{ duration: reduced ? 0 : 0.28, ease: [0.2, 0.8, 0.2, 1] }}\n />\n </span>\n <span className=\"nb-sim__bar-value\">{format(v, o.format)}</span>\n </li>\n );\n })}\n </ul>\n <div className=\"nb-sr-only\">\n <table>\n <caption>{t(\"sim.outputs\")}</caption>\n <tbody>\n {outputs.map((o) => (\n <tr key={o.id}>\n <th scope=\"row\">{o.label}</th>\n <td>{format(scope[o.id] ?? NaN, o.format)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Module\n * -------------------------------------------------------------------------- */\n\nfunction WhatIfSimulatorInner({\n config,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: WhatIfSimulatorProps) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"what-if-simulator\",\n onComplete,\n onEvent,\n resetKey,\n });\n const { message, announce } = useAnnounce();\n const { content, behavior } = config;\n const format = useFormatter(content.currency);\n\n interface RunState {\n runId: number;\n inputs: SimulatorScope;\n /** Largest absolute value seen per output this run; drives relative bar lengths. */\n peaks: Record<string, number>;\n }\n const freshState = useCallback(\n (runId: number): RunState => ({ runId, inputs: defaultInputs(config), peaks: {} }),\n [config],\n );\n const [state, setState] = useState<RunState>(() => freshState(life.runId));\n\n // Reset local state on lifecycle reset (adjusted during render so children never see stale inputs).\n if (state.runId !== life.runId) setState(freshState(life.runId));\n\n const { inputs } = state;\n const scope = useMemo(() => computeOutputs(config, inputs), [config, inputs]);\n const insights = useMemo(() => activeInsights(config, scope), [config, scope]);\n const met = useMemo(() => challengeMet(config, scope), [config, scope]);\n\n // Track session peaks (monotonic) for the bar chart.\n const peaks = useMemo(() => {\n let changed = false;\n const next = { ...state.peaks };\n for (const o of content.outputs) {\n const v = scope[o.id];\n if (v === undefined || !Number.isFinite(v)) continue;\n const abs = Math.abs(v);\n if (abs > (next[o.id] ?? 0)) {\n next[o.id] = abs;\n changed = true;\n }\n }\n return changed ? next : state.peaks;\n }, [content.outputs, scope, state.peaks]);\n if (peaks !== state.peaks) setState((s) => (s.runId === state.runId ? { ...s, peaks } : s));\n\n const interactTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const completeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const latestInputs = useRef(inputs);\n useEffect(() => {\n latestInputs.current = inputs;\n }, [inputs]);\n // Clear pending timers on reset / unmount.\n useEffect(\n () => () => {\n if (interactTimer.current) clearTimeout(interactTimer.current);\n if (completeTimer.current) clearTimeout(completeTimer.current);\n interactTimer.current = null;\n completeTimer.current = null;\n },\n [life.runId],\n );\n\n const primary = useMemo(() => content.outputs.filter((o) => o.primary), [content.outputs]);\n const secondary = useMemo(() => content.outputs.filter((o) => !o.primary), [content.outputs]);\n const hasChallenge = Boolean(content.challenge);\n\n const scheduleInteract = useCallback(\n (extra?: Record<string, unknown>) => {\n if (interactTimer.current) clearTimeout(interactTimer.current);\n interactTimer.current = setTimeout(() => {\n interactTimer.current = null;\n life.emit(\"module:interact\", { inputs: { ...latestInputs.current }, ...extra });\n }, INTERACT_DEBOUNCE_MS);\n },\n [life],\n );\n\n const change = useCallback(\n (id: string, value: number) => {\n if (inputs[id] === value) return;\n const next = { ...inputs, [id]: value };\n latestInputs.current = next;\n setState((s) => ({ ...s, inputs: next }));\n scheduleInteract();\n if (life.completed) return;\n if (hasChallenge) {\n // Complete the moment the goal is met.\n if (challengeMet(config, computeOutputs(config, next))) {\n life.attempt();\n life.complete({ score: 1, details: { inputs: { ...next } } });\n announce(`${t(\"sim.challengeMet\")} ${t(\"a11y.moduleComplete\")}`);\n }\n } else if (behavior.completeOnInteract && !completeTimer.current) {\n // No challenge: complete (without a score) shortly after the first interaction.\n completeTimer.current = setTimeout(() => {\n completeTimer.current = null;\n if (life.complete({ details: { inputs: { ...latestInputs.current } } }))\n announce(t(\"a11y.moduleComplete\"));\n }, COMPLETE_DEBOUNCE_MS);\n }\n },\n [\n inputs,\n scheduleInteract,\n life,\n hasChallenge,\n config,\n behavior.completeOnInteract,\n announce,\n t,\n ],\n );\n\n const resetDefaults = useCallback(() => {\n const next = defaultInputs(config);\n latestInputs.current = next;\n setState((s) => ({ ...s, inputs: next }));\n scheduleInteract({ reset: true });\n }, [config, scheduleInteract]);\n\n const retry = useCallback(() => {\n life.reset();\n life.emit(\"module:reset\");\n }, [life]);\n\n const atDefaults = useMemo(\n () => content.inputs.every((i) => inputs[i.id] === i.default),\n [content.inputs, inputs],\n );\n const showBanner = !hasChallenge && life.completed;\n\n return (\n <ModuleShell\n type=\"what-if-simulator\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : config.instructions}\n appearance={config.appearance}\n className={className}\n announcement={message}\n width=\"wide\"\n footer={<p className=\"nb-sim__note nb-muted nb-text-xs\">{t(\"sim.illustrative\")}</p>}\n >\n <AnimatedFeedback\n show={showBanner}\n tone=\"correct\"\n title={t(\"common.niceWork\")}\n className=\"nb-sim__banner\"\n />\n\n <div className=\"nb-sim__layout\">\n {/* ---------------- Inputs ---------------- */}\n <section\n className=\"nb-sim__panel nb-sim__panel--inputs\"\n aria-labelledby={`${config.id}-inputs`}\n >\n <div className=\"nb-sim__panel-head\">\n <h3 id={`${config.id}-inputs`} className=\"nb-sim__panel-title\">\n {t(\"sim.inputs\")}\n </h3>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={resetDefaults}\n disabled={atDefaults}\n leading={<RotateCcw aria-hidden />}\n >\n {t(\"sim.resetDefaults\")}\n </Button>\n </div>\n <div className=\"nb-sim__fields\">\n {content.inputs.map((inp) => (\n <SimSlider\n key={inp.id}\n moduleId={config.id}\n input={inp}\n value={inputs[inp.id] ?? inp.default}\n format={format}\n onChange={change}\n />\n ))}\n </div>\n </section>\n\n {/* ---------------- Results ---------------- */}\n <section\n className=\"nb-sim__panel nb-sim__panel--results\"\n aria-labelledby={`${config.id}-outputs`}\n >\n <h3 id={`${config.id}-outputs`} className=\"nb-sim__panel-title\">\n {t(\"sim.outputs\")}\n </h3>\n\n {primary.length > 0 && (\n <div className={clsx(\"nb-sim__heroes\", primary.length > 1 && \"nb-sim__heroes--multi\")}>\n {primary.map((o) => (\n <div key={o.id} className=\"nb-sim__hero\" data-output={o.id}>\n <div className=\"nb-sim__hero-label\">{o.label}</div>\n <AnimatedNumber\n className=\"nb-sim__hero-value\"\n value={scope[o.id] ?? NaN}\n format={(v) => format(v, o.format)}\n />\n {o.help && (\n <p className=\"nb-sim__hero-help\">\n <RichText text={o.help} />\n </p>\n )}\n </div>\n ))}\n </div>\n )}\n\n {secondary.length > 0 && (\n <dl className=\"nb-sim__tiles\">\n {secondary.map((o) => (\n <div key={o.id} className=\"nb-sim__tile\" data-output={o.id}>\n <dt className=\"nb-sim__tile-label\">{o.label}</dt>\n <dd className=\"nb-sim__tile-value\">\n <AnimatedNumber\n value={scope[o.id] ?? NaN}\n format={(v) => format(v, o.format)}\n />\n </dd>\n {o.help && (\n <dd className=\"nb-sim__tile-help\">\n <RichText text={o.help} />\n </dd>\n )}\n </div>\n ))}\n </dl>\n )}\n\n {behavior.chart === \"bars\" && (\n <BarsChart outputs={content.outputs} scope={scope} peaks={peaks} format={format} />\n )}\n\n {content.insights.length > 0 && (\n <div className=\"nb-sim__insights\" aria-label={t(\"sim.insights\")} role=\"region\">\n <AnimatePresence initial={false}>\n {insights.map((ins) => (\n <motion.div\n key={ins.id}\n layout={!reduced}\n initial={reduced ? false : { opacity: 0, y: 8, scale: 0.98 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={reduced ? { opacity: 0 } : { opacity: 0, y: -4, scale: 0.98 }}\n transition={{ duration: reduced ? 0 : 0.22, ease: [0.2, 0.8, 0.2, 1] }}\n >\n <Feedback\n tone={INSIGHT_TONE[ins.tone]}\n text={ins.text}\n live={false}\n className=\"nb-sim__insight\"\n />\n </motion.div>\n ))}\n </AnimatePresence>\n </div>\n )}\n\n {content.challenge && (\n <motion.div\n className={clsx(\"nb-sim__challenge\", met && \"nb-sim__challenge--met\")}\n data-met={met ? \"true\" : \"false\"}\n animate={met && !reduced ? { scale: [1, 1.02, 1] } : { scale: 1 }}\n transition={{ duration: reduced ? 0 : 0.36, ease: [0.34, 1.56, 0.64, 1] }}\n >\n <div className=\"nb-sim__challenge-eyebrow\">{t(\"sim.challenge\")}</div>\n <p className=\"nb-sim__challenge-text\">\n <RichText text={content.challenge.description} />\n </p>\n <div className=\"nb-sim__challenge-status\" role=\"status\">\n {met ? <CircleCheck aria-hidden strokeWidth={2.5} /> : <Target aria-hidden />}\n <span>{met ? t(\"sim.challengeMet\") : t(\"sim.challengeOpen\")}</span>\n </div>\n {life.completed && (\n <CompletionCard\n className=\"nb-sim__complete\"\n title={t(\"sim.challengeMet\")}\n text={content.challenge.successMessage}\n onRetry={retry}\n />\n )}\n </motion.div>\n )}\n </section>\n </div>\n </ModuleShell>\n );\n}\n\nexport default WhatIfSimulator;\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n} from \"react\";\nimport { motion } from \"motion/react\";\nimport { CircleCheck, Lock, LockOpen, Minus, Plus, RotateCcw, Target } from \"lucide-react\";\nimport clsx from \"clsx\";\nimport {\n allocationBounds,\n allocationGoalMet,\n allocationGoalProgress,\n allocationScore,\n budgetAllocatorSchema,\n channelOutput,\n evaluateAllocation,\n formatValue,\n initialShares,\n optimalAllocation,\n rebalance,\n type AllocationBounds,\n type AllocationShares,\n type BudgetAllocatorConfig,\n type BudgetChannel,\n} from \"@nibblearn/core\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Button } from \"../../primitives/Button\";\nimport { Badge } from \"../../primitives/Badge\";\nimport { ProgressBar } from \"../../primitives/ProgressBar\";\nimport { Explanation } from \"../../primitives/Explanation\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./budget-allocator.css\";\n\nexport type BudgetAllocatorProps = ModuleProps<BudgetAllocatorConfig>;\n\nconst INTERACT_DEBOUNCE_MS = 250;\nconst COUNT_UP_MS = 280;\n/** Colour tokens a channel may reference by name; anything else is used as a CSS colour. */\nconst TONES = [\"accent\", \"info\", \"success\", \"warning\", \"pink\", \"violet\", \"lime\", \"sky\", \"danger\"];\n/** Default colour per channel position. */\nconst PALETTE = [\"accent\", \"violet\", \"pink\", \"warning\", \"success\", \"sky\", \"info\", \"lime\"];\n\nexport function BudgetAllocator({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: BudgetAllocatorProps) {\n const parsed = useMemo(() => budgetAllocatorSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"budget-allocator\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <BudgetAllocatorInner\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\n/** Owns the lifecycle; every reset remounts BudgetAllocatorRun with fresh state (keyed by runId). */\nfunction BudgetAllocatorInner(props: BudgetAllocatorProps) {\n const { config, onComplete, onEvent, resetKey } = props;\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"budget-allocator\",\n onComplete,\n onEvent,\n resetKey,\n });\n return <BudgetAllocatorRun key={life.runId} {...props} life={life} />;\n}\n\n/* ----------------------------------------------------------------------------\n * Helpers\n * -------------------------------------------------------------------------- */\n\ninterface Formatters {\n money: (v: number) => string;\n kpi: (v: number) => string;\n pct: (share: number) => string;\n}\n\nfunction useFormatters(currency: string): Formatters {\n const { locale } = useNibblearn();\n return useMemo(\n () => ({\n money: (v: number) => formatValue(v, \"currency\", { currency, locale }),\n kpi: (v: number) => formatValue(v, \"integer\", { locale }),\n pct: (share: number) => formatValue(share / 100, \"percent\", { locale }),\n }),\n [currency, locale],\n );\n}\n\n/** Data attribute for a named colour token, or a CSS custom property for a custom colour. */\nfunction toneProps(channel: BudgetChannel, index: number): HTMLAttributes<HTMLElement> {\n const color = channel.color ?? PALETTE[index % PALETTE.length]!;\n if (TONES.includes(color)) return { \"data-tone\": color } as HTMLAttributes<HTMLElement>;\n return { style: { \"--nb-budget-c\": color } as CSSProperties };\n}\n\nfunction sameShares(a: AllocationShares, b: AllocationShares): boolean {\n const keys = Object.keys(a);\n return keys.length === Object.keys(b).length && keys.every((k) => a[k] === b[k]);\n}\n\nfunction finiteOrNull(v: number): number | null {\n return Number.isFinite(v) ? Number(v.toFixed(2)) : null;\n}\n\n/* ----------------------------------------------------------------------------\n * Animated number (rAF count-up, ≤ 300ms, skipped for reduced motion)\n * -------------------------------------------------------------------------- */\n\nfunction AnimatedNumber({ value, format }: { value: number; format: (v: number) => string }) {\n const reduced = useReducedMotion();\n const canAnimate = !reduced && typeof requestAnimationFrame === \"function\";\n const [shown, setShown] = useState(value);\n // Last painted value; only touched inside effects / rAF callbacks.\n const paintedRef = useRef(value);\n\n // Without animation the displayed value simply tracks the target.\n if (!canAnimate && shown !== value) setShown(value);\n\n useEffect(() => {\n if (!canAnimate) {\n paintedRef.current = value;\n return;\n }\n const from = paintedRef.current;\n const to = value;\n if (from === to) return;\n let frame: number;\n if (!Number.isFinite(from) || !Number.isFinite(to)) {\n frame = requestAnimationFrame(() => {\n paintedRef.current = to;\n setShown(to);\n });\n return () => cancelAnimationFrame(frame);\n }\n const start = performance.now();\n const tick = (now: number) => {\n const p = Math.min(1, (now - start) / COUNT_UP_MS);\n const eased = 1 - Math.pow(1 - p, 3);\n const current = p >= 1 ? to : from + (to - from) * eased;\n paintedRef.current = current;\n setShown(current);\n if (p < 1) frame = requestAnimationFrame(tick);\n };\n frame = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(frame);\n }, [value, canAnimate]);\n\n return (\n <>\n <span aria-hidden className=\"nb-budget__num\">\n {format(shown)}\n </span>\n <span className=\"nb-sr-only\">{format(value)}</span>\n </>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Stacked allocation bar\n * -------------------------------------------------------------------------- */\n\nfunction AllocationBar({\n channels,\n shares,\n fmt,\n className,\n}: {\n channels: BudgetChannel[];\n shares: AllocationShares;\n fmt: Formatters;\n className?: string;\n}) {\n return (\n <div className={clsx(\"nb-budget__bar\", className)} aria-hidden>\n {channels.map((c, i) => {\n const share = shares[c.id] ?? 0;\n const tone = toneProps(c, i);\n return (\n <span\n key={c.id}\n {...tone}\n className=\"nb-budget__seg\"\n data-empty={share <= 0 ? \"true\" : undefined}\n style={{ ...tone.style, flexGrow: share }}\n >\n <span className=\"nb-budget__seg-label\">{fmt.pct(share)}</span>\n </span>\n );\n })}\n </div>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Response-curve sparkline\n * -------------------------------------------------------------------------- */\n\nconst SPARK_W = 96;\nconst SPARK_H = 32;\nconst SPARK_PAD = 4;\n\nfunction Sparkline({\n channel,\n share,\n totalBudget,\n}: {\n channel: BudgetChannel;\n share: number;\n totalBudget: number;\n}) {\n const peak = channelOutput(totalBudget, channel) || 1;\n const pt = useCallback(\n (fraction: number) => {\n const y = channelOutput(totalBudget * fraction, channel) / peak;\n return [\n SPARK_PAD + fraction * (SPARK_W - 2 * SPARK_PAD),\n SPARK_H - SPARK_PAD - y * (SPARK_H - 2 * SPARK_PAD),\n ] as const;\n },\n [channel, totalBudget, peak],\n );\n const curve = useMemo(\n () =>\n Array.from({ length: 33 }, (_, i) => pt(i / 32))\n .map(([x, y]) => `${x.toFixed(2)},${y.toFixed(2)}`)\n .join(\" \"),\n [pt],\n );\n const fraction = Math.min(1, Math.max(0, share / 100));\n const area = useMemo(() => {\n const n = Math.max(2, Math.round(fraction * 32));\n const pts = Array.from({ length: n + 1 }, (_, i) => pt((fraction * i) / n));\n const base = SPARK_H - SPARK_PAD;\n return [\n `${SPARK_PAD},${base}`,\n ...pts.map(([x, y]) => `${x.toFixed(2)},${y.toFixed(2)}`),\n `${pts[pts.length - 1]![0].toFixed(2)},${base}`,\n ].join(\" \");\n }, [fraction, pt]);\n const [cx, cy] = pt(fraction);\n return (\n <svg\n className=\"nb-budget__spark\"\n viewBox={`0 0 ${SPARK_W} ${SPARK_H}`}\n width={SPARK_W}\n height={SPARK_H}\n aria-hidden\n focusable=\"false\"\n >\n <line\n className=\"nb-budget__spark-base\"\n x1={SPARK_PAD}\n x2={SPARK_W - SPARK_PAD}\n y1={SPARK_H - SPARK_PAD}\n y2={SPARK_H - SPARK_PAD}\n />\n {fraction > 0 && <polygon className=\"nb-budget__spark-area\" points={area} />}\n <polyline className=\"nb-budget__spark-line\" points={curve} />\n <circle className=\"nb-budget__spark-dot\" cx={cx} cy={cy} r={3.5} />\n </svg>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Channel row\n * -------------------------------------------------------------------------- */\n\ninterface ChannelRowProps {\n moduleId: string;\n channel: BudgetChannel;\n index: number;\n share: number;\n spend: number;\n output: number;\n step: number;\n totalBudget: number;\n kpiLabel: string;\n locked: boolean;\n allowLock: boolean;\n canLock: boolean;\n canDecrease: boolean;\n canIncrease: boolean;\n readOnly: boolean;\n fmt: Formatters;\n onChange: (id: string, value: number) => void;\n onToggleLock: (id: string) => void;\n}\n\nfunction ChannelRow({\n moduleId,\n channel,\n index,\n share,\n spend,\n output,\n step,\n totalBudget,\n kpiLabel,\n locked,\n allowLock,\n canLock,\n canDecrease,\n canIncrease,\n readOnly,\n fmt,\n onChange,\n onToggleLock,\n}: ChannelRowProps) {\n const { t } = useNibblearn();\n const id = `${moduleId}-ch-${channel.id}`;\n const descId = channel.description ? `${id}-desc` : undefined;\n const valueText = t(\"budget.valueText\", { percent: fmt.pct(share), amount: fmt.money(spend) });\n const nextSpend = (totalBudget * Math.min(100, share + step)) / 100;\n const marginal = channelOutput(nextSpend, channel) - output;\n const bounds = [\n channel.min !== undefined && channel.min > 0\n ? t(\"budget.min\", { value: fmt.pct(channel.min) })\n : \"\",\n channel.max !== undefined && channel.max < 100\n ? t(\"budget.max\", { value: fmt.pct(channel.max) })\n : \"\",\n ].filter(Boolean);\n const tone = toneProps(channel, index);\n const fixed = readOnly || locked;\n\n return (\n <li\n {...tone}\n className={clsx(\n \"nb-budget__row\",\n locked && \"nb-budget__row--locked\",\n !allowLock && \"nb-budget__row--nolock\",\n )}\n data-channel={channel.id}\n >\n <div className=\"nb-budget__info\">\n <span className=\"nb-budget__swatch\" aria-hidden />\n <label htmlFor={id} className=\"nb-budget__label\">\n {channel.label}\n </label>\n </div>\n {(channel.description || bounds.length > 0) && (\n <div className=\"nb-budget__about\">\n {channel.description && (\n <p id={descId} className=\"nb-budget__desc\">\n {channel.description}\n </p>\n )}\n {bounds.length > 0 && <p className=\"nb-budget__bounds\">{bounds.join(\" · \")}</p>}\n </div>\n )}\n\n <div className=\"nb-budget__value\" aria-hidden>\n <span className=\"nb-budget__share\">{fmt.pct(share)}</span>\n <span className=\"nb-budget__spend\">{fmt.money(spend)}</span>\n </div>\n\n {allowLock && (\n <Button\n icon\n variant={locked ? \"soft\" : \"ghost\"}\n className=\"nb-budget__lock\"\n aria-label={t(\"budget.lock\", { label: channel.label })}\n aria-pressed={locked}\n title={locked ? t(\"budget.locked\") : undefined}\n disabled={readOnly || (!locked && !canLock)}\n onClick={() => onToggleLock(channel.id)}\n >\n {locked ? <Lock aria-hidden /> : <LockOpen aria-hidden />}\n </Button>\n )}\n\n <div className=\"nb-budget__control\">\n <Button\n icon\n variant=\"secondary\"\n className=\"nb-budget__step\"\n aria-label={t(\"budget.decrease\", { label: channel.label })}\n disabled={fixed || !canDecrease}\n onClick={() => onChange(channel.id, share - step)}\n >\n <Minus aria-hidden />\n </Button>\n <input\n id={id}\n type=\"range\"\n className=\"nb-budget__range\"\n min={0}\n max={100}\n step={step}\n value={share}\n aria-valuetext={valueText}\n aria-describedby={descId}\n disabled={fixed}\n style={{ \"--_pct\": `${share}%` } as CSSProperties}\n onChange={(e) => onChange(channel.id, Number(e.target.value))}\n />\n <Button\n icon\n variant=\"secondary\"\n className=\"nb-budget__step\"\n aria-label={t(\"budget.increase\", { label: channel.label })}\n disabled={fixed || !canIncrease}\n onClick={() => onChange(channel.id, share + step)}\n >\n <Plus aria-hidden />\n </Button>\n </div>\n\n <div className=\"nb-budget__curve\">\n <Sparkline channel={channel} share={share} totalBudget={totalBudget} />\n <div className=\"nb-budget__curve-text\">\n <p className=\"nb-budget__output\">\n <strong>{fmt.kpi(output)}</strong> <span>{kpiLabel}</span>\n </p>\n {share < 100 && (\n <p className=\"nb-budget__marginal\">\n {t(\"budget.marginal\", { step: fmt.pct(step), value: fmt.kpi(marginal) })}\n </p>\n )}\n </div>\n </div>\n </li>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Module\n * -------------------------------------------------------------------------- */\n\nfunction BudgetAllocatorRun({\n life,\n config,\n hideHeader,\n className,\n}: BudgetAllocatorProps & { life: ModuleLifecycle }) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { content, behavior } = config;\n const { channels, goal, totalBudget, kpiLabel } = content;\n const { step, allowLock, showOptimal, scoreAgainstOptimal } = behavior;\n const fmt = useFormatters(content.currency);\n\n const start = useMemo(() => initialShares(config), [config]);\n const bounds = useMemo<AllocationBounds>(\n () => allocationBounds(channels, step),\n [channels, step],\n );\n const [shares, setShares] = useState<AllocationShares>(start);\n const [locked, setLocked] = useState<string[]>([]);\n const [submitted, setSubmitted] = useState(false);\n\n const evaluation = useMemo(() => evaluateAllocation(config, shares), [config, shares]);\n const optimal = useMemo(() => optimalAllocation(config), [config]);\n const optimalEval = useMemo(() => evaluateAllocation(config, optimal), [config, optimal]);\n const goalMet = useMemo(() => allocationGoalMet(config, evaluation), [config, evaluation]);\n const score = scoreAgainstOptimal\n ? allocationScore(evaluation.totalKpi, optimalEval.totalKpi)\n : goal\n ? allocationGoalProgress(config, evaluation)\n : undefined;\n\n const interactTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const resultsRef = useRef<HTMLHeadingElement>(null);\n useEffect(\n () => () => {\n if (interactTimer.current) clearTimeout(interactTimer.current);\n },\n [],\n );\n useEffect(() => {\n if (submitted) resultsRef.current?.focus();\n }, [submitted]);\n\n const scheduleInteract = useCallback(\n (payload: Record<string, unknown>) => {\n if (interactTimer.current) clearTimeout(interactTimer.current);\n interactTimer.current = setTimeout(() => {\n interactTimer.current = null;\n life.emit(\"module:interact\", payload);\n }, INTERACT_DEBOUNCE_MS);\n },\n [life],\n );\n\n const apply = useCallback(\n (next: AllocationShares, extra?: Record<string, unknown>) => {\n if (sameShares(next, shares)) return;\n setShares(next);\n scheduleInteract({ shares: { ...next }, locked: [...locked], ...extra });\n if (goal) {\n const nowMet = allocationGoalMet(config, evaluateAllocation(config, next));\n if (nowMet !== goalMet) announce(nowMet ? t(\"budget.goalMet\") : t(\"budget.goalOpen\"));\n }\n },\n [shares, scheduleInteract, locked, goal, config, goalMet, announce, t],\n );\n\n const change = useCallback(\n (id: string, value: number) => {\n if (submitted) return;\n apply(rebalance(shares, id, value, locked, step, bounds));\n },\n [submitted, apply, shares, locked, step, bounds],\n );\n\n const unlockedCount = channels.length - locked.length;\n const toggleLock = useCallback(\n (id: string) => {\n if (submitted) return;\n const next = locked.includes(id) ? locked.filter((x) => x !== id) : [...locked, id];\n setLocked(next);\n scheduleInteract({ shares: { ...shares }, locked: next });\n },\n [submitted, locked, scheduleInteract, shares],\n );\n\n const resetSplit = useCallback(() => {\n setLocked([]);\n apply(start, { reset: true });\n }, [apply, start]);\n\n const lockIn = useCallback(() => {\n if (submitted) return;\n if (interactTimer.current) {\n clearTimeout(interactTimer.current);\n interactTimer.current = null;\n }\n life.attempt();\n setSubmitted(true);\n const details = {\n shares: { ...shares },\n kpi: finiteOrNull(evaluation.totalKpi),\n costPerKpi: finiteOrNull(evaluation.costPerKpi),\n optimalShares: { ...optimal },\n optimalKpi: finiteOrNull(optimalEval.totalKpi),\n goalMet: goal ? goalMet : null,\n };\n life.emit(\"module:answer\", details);\n life.complete({ score, details });\n const pct = Math.round(allocationScore(evaluation.totalKpi, optimalEval.totalKpi) * 100);\n announce(\n [\n showOptimal ? t(\"budget.ofOptimal\", { percent: pct }) : \"\",\n goal && goalMet ? t(\"budget.goalMet\") : \"\",\n t(\"a11y.moduleComplete\"),\n ]\n .filter(Boolean)\n .join(\" \"),\n );\n }, [\n submitted,\n life,\n shares,\n evaluation,\n optimal,\n optimalEval,\n goal,\n goalMet,\n score,\n announce,\n showOptimal,\n t,\n ]);\n\n const retry = useCallback(() => {\n life.reset();\n life.emit(\"module:reset\");\n }, [life]);\n\n const atStart = sameShares(shares, start) && locked.length === 0;\n const canMove = (id: string, dir: 1 | -1) =>\n rebalance(shares, id, (shares[id] ?? 0) + dir * step, locked, step, bounds)[id] !== shares[id];\n\n const pctOfOptimal = Math.round(allocationScore(evaluation.totalKpi, optimalEval.totalKpi) * 100);\n const gap = Math.max(0, optimalEval.totalKpi - evaluation.totalKpi);\n const matched = Math.round(gap) === 0;\n\n return (\n <ModuleShell\n type=\"budget-allocator\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : config.instructions}\n appearance={config.appearance}\n className={className}\n announcement={message}\n width=\"wide\"\n footer={<p className=\"nb-budget__note nb-muted nb-text-xs\">{t(\"sim.illustrative\")}</p>}\n >\n <div className=\"nb-budget\" data-submitted={submitted ? \"true\" : \"false\"}>\n {/* ---------------- Headline stats ---------------- */}\n <dl className=\"nb-budget__stats\">\n <div className=\"nb-budget__stat nb-budget__stat--budget\">\n <dt>{t(\"budget.totalBudget\")}</dt>\n <dd>{fmt.money(totalBudget)}</dd>\n </div>\n <div className=\"nb-budget__stat nb-budget__stat--kpi\">\n <dt>{kpiLabel}</dt>\n <dd>\n <AnimatedNumber value={evaluation.totalKpi} format={fmt.kpi} />\n </dd>\n </div>\n <div className=\"nb-budget__stat nb-budget__stat--cost\">\n <dt>{t(\"budget.costPerResult\")}</dt>\n <dd>\n <AnimatedNumber value={evaluation.costPerKpi} format={fmt.money} />\n </dd>\n </div>\n </dl>\n\n {/* ---------------- Goal ---------------- */}\n {goal && (\n <motion.div\n className={clsx(\"nb-budget__goal\", goalMet && \"nb-budget__goal--met\")}\n data-met={goalMet ? \"true\" : \"false\"}\n animate={goalMet && !reduced ? { scale: [1, 1.015, 1] } : { scale: 1 }}\n transition={{ duration: reduced ? 0 : 0.36, ease: [0.34, 1.56, 0.64, 1] }}\n >\n <div className=\"nb-budget__goal-head\">\n <span className=\"nb-budget__eyebrow\">{t(\"budget.goal\")}</span>\n <span className=\"nb-budget__goal-status\">\n {goalMet ? <CircleCheck aria-hidden strokeWidth={2.5} /> : <Target aria-hidden />}\n {goalMet ? t(\"budget.goalMet\") : t(\"budget.goalOpen\")}\n </span>\n </div>\n <p className=\"nb-budget__goal-text\">\n <RichText text={goal.description} />\n </p>\n {goal.minKpi !== undefined && (\n <div className=\"nb-budget__goal-meter\">\n <ProgressBar\n value={evaluation.totalKpi / goal.minKpi}\n label={kpiLabel}\n showLabel={false}\n size=\"sm\"\n tone={goalMet ? \"success\" : \"accent\"}\n />\n <span className=\"nb-budget__goal-count\">\n {t(\"budget.goalProgress\", {\n value: fmt.kpi(evaluation.totalKpi),\n target: fmt.kpi(goal.minKpi),\n })}\n </span>\n </div>\n )}\n {goal.maxCostPerKpi !== undefined && (\n <p className=\"nb-budget__goal-count\">\n {t(\"budget.costPerResult\")}: {fmt.money(evaluation.costPerKpi)} ≤{\" \"}\n {fmt.money(goal.maxCostPerKpi)}\n </p>\n )}\n </motion.div>\n )}\n\n {/* ---------------- Allocation bar ---------------- */}\n <section className=\"nb-budget__section\" aria-labelledby={`${config.id}-alloc`}>\n <h3 id={`${config.id}-alloc`} className=\"nb-budget__heading\">\n {t(\"budget.allocation\")}\n </h3>\n <AllocationBar channels={channels} shares={shares} fmt={fmt} />\n <div className=\"nb-sr-only\">\n <table>\n <caption>{t(\"budget.allocation\")}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{t(\"budget.channel\")}</th>\n <th scope=\"col\">{t(\"budget.share\")}</th>\n <th scope=\"col\">{t(\"budget.spend\")}</th>\n <th scope=\"col\">{kpiLabel}</th>\n </tr>\n </thead>\n <tbody>\n {evaluation.channels.map((r, i) => (\n <tr key={r.id}>\n <th scope=\"row\">{channels[i]!.label}</th>\n <td>{fmt.pct(r.share)}</td>\n <td>{fmt.money(r.spend)}</td>\n <td>{fmt.kpi(r.output)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </section>\n\n {/* ---------------- Channels ---------------- */}\n <section className=\"nb-budget__section\" aria-labelledby={`${config.id}-channels`}>\n <div className=\"nb-budget__section-head\">\n <h3 id={`${config.id}-channels`} className=\"nb-budget__heading\">\n {t(\"budget.channels\")}\n </h3>\n {allowLock && !submitted && <p className=\"nb-budget__hint\">{t(\"budget.lockHint\")}</p>}\n </div>\n <ul className=\"nb-budget__rows\">\n {channels.map((c, i) => {\n const r = evaluation.channels[i]!;\n const isLocked = locked.includes(c.id);\n return (\n <ChannelRow\n key={c.id}\n moduleId={config.id}\n channel={c}\n index={i}\n share={r.share}\n spend={r.spend}\n output={r.output}\n step={step}\n totalBudget={totalBudget}\n kpiLabel={kpiLabel}\n locked={isLocked}\n allowLock={allowLock}\n canLock={unlockedCount > 2}\n canDecrease={!submitted && !isLocked && canMove(c.id, -1)}\n canIncrease={!submitted && !isLocked && canMove(c.id, 1)}\n readOnly={submitted}\n fmt={fmt}\n onChange={change}\n onToggleLock={toggleLock}\n />\n );\n })}\n </ul>\n </section>\n\n {!submitted && (\n <div className=\"nb-budget__actions\">\n <Button\n variant=\"ghost\"\n onClick={resetSplit}\n disabled={atStart}\n leading={<RotateCcw aria-hidden />}\n >\n {t(\"budget.resetInitial\")}\n </Button>\n <Button variant=\"primary\" onClick={lockIn}>\n {t(\"budget.lockIn\")}\n </Button>\n </div>\n )}\n\n {/* ---------------- Reveal ---------------- */}\n {submitted && (\n <motion.section\n className=\"nb-budget__results\"\n aria-labelledby={`${config.id}-results`}\n initial={reduced ? false : { opacity: 0, y: 12 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: reduced ? 0 : 0.3, ease: [0.2, 0.8, 0.2, 1] }}\n >\n <h3\n id={`${config.id}-results`}\n ref={resultsRef}\n tabIndex={-1}\n className=\"nb-budget__heading\"\n >\n {t(\"budget.results\")}\n </h3>\n <div className=\"nb-budget__compare\">\n {[\n {\n key: \"learner\",\n label: t(\"budget.yourPlan\"),\n s: shares,\n kpi: evaluation.totalKpi,\n },\n ...(showOptimal\n ? [\n {\n key: \"optimal\",\n label: t(\"budget.optimalPlan\"),\n s: optimal,\n kpi: optimalEval.totalKpi,\n },\n ]\n : []),\n ].map((plan, i) => (\n <div key={plan.key} className=\"nb-budget__compare-row\" data-plan={plan.key}>\n <div className=\"nb-budget__compare-head\">\n <span className=\"nb-budget__compare-label\">{plan.label}</span>\n <span className=\"nb-budget__compare-kpi\">\n <strong>{fmt.kpi(plan.kpi)}</strong> {kpiLabel}\n </span>\n </div>\n <motion.div\n className=\"nb-budget__compare-bar\"\n initial={reduced ? false : { scaleX: 0 }}\n animate={{ scaleX: 1 }}\n transition={{\n duration: reduced ? 0 : 0.36,\n delay: reduced ? 0 : 0.1 + i * 0.12,\n ease: [0.2, 0.8, 0.2, 1],\n }}\n >\n <AllocationBar channels={channels} shares={plan.s} fmt={fmt} />\n </motion.div>\n </div>\n ))}\n </div>\n {showOptimal && (\n <div className=\"nb-budget__verdict\">\n <Badge\n tone={pctOfOptimal >= 98 ? \"success\" : pctOfOptimal >= 90 ? \"accent\" : \"warning\"}\n className=\"nb-budget__verdict-badge\"\n >\n {t(\"budget.ofOptimal\", { percent: pctOfOptimal })}\n </Badge>\n <span className=\"nb-budget__verdict-text\">\n {matched ? (\n t(\"budget.matchedOptimal\")\n ) : (\n <>\n {t(\"budget.gap\")}: <strong>−{fmt.kpi(gap)}</strong> {kpiLabel}\n </>\n )}\n </span>\n </div>\n )}\n {showOptimal && (\n <div className=\"nb-sr-only\">\n <table>\n <caption>{t(\"budget.comparison\")}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{t(\"budget.channel\")}</th>\n <th scope=\"col\">{t(\"budget.yourPlan\")}</th>\n <th scope=\"col\">{t(\"budget.optimalShare\")}</th>\n </tr>\n </thead>\n <tbody>\n {channels.map((c) => (\n <tr key={c.id}>\n <th scope=\"row\">{c.label}</th>\n <td>{fmt.pct(shares[c.id] ?? 0)}</td>\n <td>{fmt.pct(optimal[c.id] ?? 0)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n <Explanation text={content.explanation} />\n <CompletionCard\n className=\"nb-budget__complete\"\n score={score}\n passThreshold={config.scoring.passThreshold > 0 ? config.scoring.passThreshold : 0.9}\n title={goal && goalMet ? t(\"budget.goalMet\") : undefined}\n text={config.feedback.complete}\n stats={[\n { label: kpiLabel, value: fmt.kpi(evaluation.totalKpi) },\n { label: t(\"budget.costPerResult\"), value: fmt.money(evaluation.costPerKpi) },\n ...(showOptimal\n ? [{ label: t(\"budget.optimalPlan\"), value: fmt.kpi(optimalEval.totalKpi) }]\n : []),\n ]}\n onRetry={retry}\n />\n </motion.section>\n )}\n </div>\n </ModuleShell>\n );\n}\n\nexport default BudgetAllocator;\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { ArrowRight, CircleX, Minus, Plus, Target, ThumbsUp } from \"lucide-react\";\nimport clsx from \"clsx\";\nimport {\n estimateAccuracy,\n estimateSchema,\n estimateStart,\n formatEstimate,\n formatEstimateDelta,\n snapEstimate,\n type EstimateAccuracy,\n type EstimateBand,\n type EstimateConfig,\n type EstimateQuestion,\n} from \"@nibblearn/core\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Button } from \"../../primitives/Button\";\nimport { ProgressBar } from \"../../primitives/ProgressBar\";\nimport { Explanation } from \"../../primitives/Explanation\";\nimport { Hint } from \"../../primitives/Hint\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./estimate.css\";\n\nexport type EstimateProps = ModuleProps<EstimateConfig>;\n\ninterface EstimateRecord {\n id?: string;\n guess: number;\n answer: number;\n band: EstimateBand;\n score: number;\n}\n\nconst TICKS = 10;\n\nconst BAND_ICON: Record<EstimateBand, ReactNode> = {\n bullseye: <Target aria-hidden strokeWidth={2.5} />,\n close: <ThumbsUp aria-hidden strokeWidth={2.5} />,\n off: <CircleX aria-hidden strokeWidth={2.5} />,\n};\n\nexport function Estimate({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: EstimateProps) {\n const parsed = useMemo(() => estimateSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"estimate\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <EstimateInner\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\n/** Owns the lifecycle; every reset remounts EstimateRun with fresh state (keyed by runId). */\nfunction EstimateInner(props: EstimateProps) {\n const { config, onComplete, onEvent, resetKey } = props;\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"estimate\",\n onComplete,\n onEvent,\n resetKey,\n });\n return <EstimateRun key={life.runId} {...props} life={life} />;\n}\n\n/* ----------------------------------------------------------------------------\n * Helpers\n * -------------------------------------------------------------------------- */\n\nfunction decimalsOf(step: number): number {\n const s = String(step);\n const e = s.indexOf(\"e-\");\n if (e >= 0) return Number(s.slice(e + 2));\n const dot = s.indexOf(\".\");\n return dot >= 0 ? s.length - dot - 1 : 0;\n}\n\n/** Percent questions are typed as percentages (2.8), stored as fractions (0.028). */\nfunction inputScale(q: EstimateQuestion): number {\n return q.format === \"percent\" ? 100 : 1;\n}\n\nfunction toInputString(q: EstimateQuestion, value: number): string {\n const scale = inputScale(q);\n const digits = Math.max(0, decimalsOf(q.step) - (scale === 100 ? 2 : 0));\n return String(Number((value * scale).toFixed(Math.min(10, digits))));\n}\n\nfunction pctOf(q: EstimateQuestion, value: number): number {\n return Math.min(100, Math.max(0, ((value - q.min) / (q.max - q.min)) * 100));\n}\n\n/** Keep marker labels inside the scale near its edges. */\nfunction alignFor(pct: number): \"start\" | \"center\" | \"end\" {\n return pct < 12 ? \"start\" : pct > 88 ? \"end\" : \"center\";\n}\n\nfunction useCurrencySymbol(currency: string): string {\n const { locale } = useNibblearn();\n return useMemo(() => {\n try {\n return (\n new Intl.NumberFormat(locale, { style: \"currency\", currency })\n .formatToParts(0)\n .find((p) => p.type === \"currency\")?.value ?? currency\n );\n } catch {\n return currency;\n }\n }, [currency, locale]);\n}\n\n/* ----------------------------------------------------------------------------\n * Reveal scale: guess marker, answer marker dropping in, band between them\n * -------------------------------------------------------------------------- */\n\nfunction RevealScale({\n question,\n guess,\n band,\n format,\n}: {\n question: EstimateQuestion;\n guess: number;\n band: EstimateBand;\n format: (v: number) => string;\n}) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const g = pctOf(question, guess);\n const a = pctOf(question, question.answer);\n const left = Math.min(g, a);\n const width = Math.abs(g - a);\n return (\n <div className=\"nb-est__scale nb-est__scale--reveal\" data-band={band}>\n <div className=\"nb-est__rail\">\n <div className=\"nb-est__track\" aria-hidden />\n <motion.div\n className=\"nb-est__band\"\n aria-hidden\n style={\n {\n \"--_l\": left / 100,\n \"--_w\": width / 100,\n transformOrigin: a >= g ? \"left center\" : \"right center\",\n } as CSSProperties\n }\n initial={reduced ? false : { scaleX: 0 }}\n animate={{ scaleX: 1 }}\n transition={{ duration: reduced ? 0 : 0.36, delay: reduced ? 0 : 0.28, ease: \"easeOut\" }}\n />\n <div\n className=\"nb-est__marker nb-est__marker--guess\"\n data-align={alignFor(g)}\n style={{ \"--_p\": g / 100 } as CSSProperties}\n >\n <span className=\"nb-est__pin\" aria-hidden />\n <span className=\"nb-est__marker-label\">\n <span className=\"nb-est__marker-name\">{t(\"estimate.yourGuess\")}</span>{\" \"}\n <span className=\"nb-est__marker-value\">{format(guess)}</span>\n </span>\n </div>\n <motion.div\n className=\"nb-est__marker nb-est__marker--answer\"\n data-align={alignFor(a)}\n style={{ \"--_p\": a / 100 } as CSSProperties}\n initial={reduced ? false : { opacity: 0, y: -28 }}\n animate={{ opacity: 1, y: 0 }}\n transition={\n reduced ? { duration: 0 } : { type: \"spring\", stiffness: 420, damping: 22, delay: 0.08 }\n }\n >\n <span className=\"nb-est__marker-label\">\n <span className=\"nb-est__marker-name\">{t(\"estimate.answer\")}</span>{\" \"}\n <span className=\"nb-est__marker-value\">{format(question.answer)}</span>\n </span>\n <span className=\"nb-est__pin\" aria-hidden />\n </motion.div>\n </div>\n <div className=\"nb-est__range-meta\" aria-hidden>\n <span>{format(question.min)}</span>\n <span>{format(question.max)}</span>\n </div>\n </div>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * One question (keyed by index: fresh state per question)\n * -------------------------------------------------------------------------- */\n\ninterface QuestionViewProps {\n moduleId: string;\n question: EstimateQuestion;\n index: number;\n isLast: boolean;\n currency: string;\n focusOnMount: boolean;\n onLock: (guess: number, accuracy: EstimateAccuracy) => void;\n onNext: () => void;\n onHint: () => void;\n}\n\nfunction QuestionView({\n moduleId,\n question,\n index,\n isLast,\n currency,\n focusOnMount,\n onLock,\n onNext,\n onHint,\n}: QuestionViewProps) {\n const { t, locale } = useNibblearn();\n const reduced = useReducedMotion();\n const symbol = useCurrencySymbol(currency);\n const initial = useMemo(() => estimateStart(question), [question]);\n const [guess, setGuess] = useState(initial);\n const [inputText, setInputText] = useState(() => toInputString(question, initial));\n const [result, setResult] = useState<EstimateAccuracy | null>(null);\n const sliderRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (focusOnMount) sliderRef.current?.focus();\n }, [focusOnMount]);\n\n const format = useCallback(\n (v: number) => formatEstimate(question, v, { currency, locale }),\n [question, currency, locale],\n );\n\n const setValue = useCallback(\n (raw: number) => {\n const v = snapEstimate(question, raw);\n setGuess(v);\n setInputText(toInputString(question, v));\n },\n [question],\n );\n\n const commitInput = useCallback((): number => {\n const n = Number.parseFloat(inputText.replace(\",\", \".\"));\n if (!Number.isFinite(n)) {\n setInputText(toInputString(question, guess));\n return guess;\n }\n const v = snapEstimate(question, n / inputScale(question));\n setGuess(v);\n setInputText(toInputString(question, v));\n return v;\n }, [inputText, question, guess]);\n\n const lock = useCallback(\n (value: number = guess) => {\n if (result) return;\n const acc = estimateAccuracy(question, value);\n setGuess(value);\n setResult(acc);\n onLock(value, acc);\n },\n [result, guess, question, onLock],\n );\n\n const onKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLDivElement>) => {\n if (e.key !== \"Enter\") return;\n const target = e.target as HTMLElement | null;\n // Buttons (Lock in, Next, ± and hint) handle Enter themselves.\n if (target instanceof HTMLButtonElement) return;\n e.preventDefault();\n if (result) onNext();\n else if (target instanceof HTMLInputElement && target.type === \"number\") lock(commitInput());\n else lock();\n },\n [result, onNext, lock, commitInput],\n );\n\n const sliderId = `${moduleId}-q${index}-slider`;\n const inputId = `${moduleId}-q${index}-input`;\n const promptId = `${moduleId}-q${index}-prompt`;\n const pct = pctOf(question, guess);\n const scale = inputScale(question);\n const prefix = question.format === \"currency\" ? symbol : undefined;\n const suffix = question.format === \"percent\" ? \"%\" : question.unit;\n\n let deltaText = \"\";\n if (result) {\n const delta = formatEstimateDelta(question, result.delta, {\n currency,\n locale,\n pointsLabel: t(\"estimate.pp\"),\n });\n const negligible = result.error <= question.step / 2 + 1e-12;\n deltaText = negligible\n ? t(\"estimate.exact\")\n : result.delta > 0\n ? t(\"estimate.tooHigh\", { delta })\n : t(\"estimate.tooLow\", { delta });\n }\n\n return (\n <div className=\"nb-est__question\" onKeyDown={onKeyDown}>\n <div className=\"nb-est__prompt-wrap\">\n <h3 className=\"nb-est__prompt\" id={promptId}>\n <RichText text={question.prompt} />\n </h3>\n {question.context && (\n <p className=\"nb-est__context\">\n <RichText text={question.context} />\n </p>\n )}\n </div>\n\n <div className=\"nb-est__stage\" data-state={result ? \"revealed\" : \"guessing\"}>\n <div className=\"nb-est__readout\">\n {result ? (\n <span className=\"nb-est__readout-label\">{t(\"estimate.yourEstimate\")}</span>\n ) : (\n <label htmlFor={sliderId} className=\"nb-est__readout-label\">\n {t(\"estimate.yourEstimate\")}\n </label>\n )}\n <output htmlFor={result ? undefined : sliderId} className=\"nb-est__value\" aria-live=\"off\">\n {format(guess)}\n </output>\n </div>\n\n {result ? (\n <RevealScale question={question} guess={guess} band={result.band} format={format} />\n ) : (\n <div className=\"nb-est__scale\">\n <div className=\"nb-est__control\">\n <Button\n icon\n variant=\"secondary\"\n className=\"nb-est__step\"\n aria-label={t(\"estimate.decrease\")}\n disabled={guess <= question.min}\n onClick={() => setValue(guess - question.step)}\n >\n <Minus aria-hidden />\n </Button>\n <div className=\"nb-est__rail\">\n <input\n ref={sliderRef}\n id={sliderId}\n type=\"range\"\n className=\"nb-est__range\"\n min={question.min}\n max={question.max}\n step={question.step}\n value={guess}\n aria-valuetext={format(guess)}\n aria-describedby={promptId}\n style={{ \"--_pct\": `${pct}%` } as CSSProperties}\n onChange={(e) => setValue(Number(e.target.value))}\n />\n <div className=\"nb-est__ticks\" aria-hidden>\n {Array.from({ length: TICKS + 1 }, (_, i) => (\n <span\n key={i}\n className={clsx(\"nb-est__tick\", i % 5 === 0 && \"nb-est__tick--major\")}\n style={{ \"--_p\": i / TICKS } as CSSProperties}\n />\n ))}\n </div>\n </div>\n <Button\n icon\n variant=\"secondary\"\n className=\"nb-est__step\"\n aria-label={t(\"estimate.increase\")}\n disabled={guess >= question.max}\n onClick={() => setValue(guess + question.step)}\n >\n <Plus aria-hidden />\n </Button>\n </div>\n <div className=\"nb-est__range-meta\" aria-hidden>\n <span>{format(question.min)}</span>\n <span>{format(question.max)}</span>\n </div>\n </div>\n )}\n </div>\n\n {!result && (\n <div className=\"nb-est__entry\">\n <label htmlFor={inputId} className=\"nb-est__entry-label\">\n {t(\"estimate.exactValue\")}\n </label>\n <div className=\"nb-est__field\">\n {prefix && (\n <span className=\"nb-est__affix\" aria-hidden>\n {prefix}\n </span>\n )}\n <input\n id={inputId}\n type=\"number\"\n inputMode=\"decimal\"\n className=\"nb-est__input\"\n min={question.min * scale}\n max={question.max * scale}\n step={Number((question.step * scale).toFixed(10))}\n value={inputText}\n aria-describedby={`${inputId}-range`}\n onChange={(e) => {\n setInputText(e.target.value);\n const n = Number.parseFloat(e.target.value.replace(\",\", \".\"));\n if (Number.isFinite(n)) setGuess(snapEstimate(question, n / scale));\n }}\n onBlur={() => commitInput()}\n />\n {suffix && (\n <span className=\"nb-est__affix\" aria-hidden>\n {suffix}\n </span>\n )}\n </div>\n <span id={`${inputId}-range`} className=\"nb-est__entry-range\">\n {t(\"estimate.range\", { min: format(question.min), max: format(question.max) })}\n </span>\n </div>\n )}\n\n {!result && <Hint text={question.hint} onReveal={onHint} />}\n\n <AnimatePresence initial={false}>\n {result && (\n <motion.div\n key=\"result\"\n className=\"nb-est__result\"\n data-band={result.band}\n initial={reduced ? false : { opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: reduced ? 0 : 0.28, delay: reduced ? 0 : 0.3 }}\n >\n <div className=\"nb-est__verdict\">\n <span className=\"nb-est__badge\" data-band={result.band}>\n {BAND_ICON[result.band]}\n {t(`estimate.${result.band}`)}\n </span>\n <span className=\"nb-est__accuracy\">\n {t(\"estimate.accuracy\")}: <strong>{Math.round(result.score * 100)}%</strong>\n </span>\n </div>\n <p className=\"nb-est__delta\">\n {deltaText} {t(\"estimate.answerIs\", { value: format(question.answer) })}\n </p>\n </motion.div>\n )}\n </AnimatePresence>\n\n {result && <Explanation text={question.explanation} />}\n\n <div className=\"nb-est__footer\">\n {!result && <span className=\"nb-est__kbd nb-muted\">{t(\"estimate.keyboardHint\")}</span>}\n <div className=\"nb-module__actions\">\n {!result ? (\n <Button key=\"lock\" variant=\"primary\" onClick={() => lock()}>\n {t(\"estimate.lockIn\")}\n </Button>\n ) : (\n <Button\n key=\"next\"\n variant=\"primary\"\n onClick={onNext}\n trailing={<ArrowRight aria-hidden />}\n autoFocus\n >\n {isLast ? t(\"common.finish\") : t(\"common.next\")}\n </Button>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Module\n * -------------------------------------------------------------------------- */\n\nfunction EstimateRun({\n life,\n config,\n hideHeader,\n className,\n}: EstimateProps & { life: ModuleLifecycle }) {\n const { t, locale } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { questions, currency } = config.content;\n const { behavior } = config;\n\n const [index, setIndex] = useState(0);\n const [records, setRecords] = useState<EstimateRecord[]>([]);\n const [finished, setFinished] = useState(false);\n const question = questions[index]!;\n const answered = records.length > index;\n\n const onLock = useCallback(\n (guess: number, acc: EstimateAccuracy) => {\n life.attempt();\n const record: EstimateRecord = {\n ...(question.id ? { id: question.id } : {}),\n guess,\n answer: question.answer,\n band: acc.band,\n score: Number(acc.score.toFixed(4)),\n };\n setRecords((prev) => [...prev.slice(0, index), record]);\n life.emit(\"module:answer\", { questionIndex: index, ...record });\n const value = formatEstimate(question, question.answer, { currency, locale });\n announce(`${t(`estimate.${acc.band}`)} ${t(\"estimate.answerIs\", { value })}`);\n },\n [life, question, index, currency, locale, announce, t],\n );\n\n const onNext = useCallback(() => {\n if (!answered) return;\n if (index + 1 >= questions.length) {\n const total = questions.length;\n const bullseyes = records.filter((r) => r.band === \"bullseye\").length;\n const score = records.reduce((s, r) => s + r.score, 0) / total;\n setFinished(true);\n life.complete({ score, correct: bullseyes, total, details: { answers: records } });\n announce(t(\"a11y.moduleComplete\"));\n return;\n }\n setIndex(index + 1);\n }, [answered, index, questions.length, records, life, announce, t]);\n\n const onHint = useCallback(\n () => life.emit(\"module:hint\", { questionIndex: index }),\n [life, index],\n );\n\n const retry = useCallback(() => {\n life.reset();\n life.emit(\"module:reset\");\n }, [life]);\n\n const multi = behavior.showCounter && questions.length > 1;\n\n if (finished) {\n const total = questions.length;\n const bullseyes = records.filter((r) => r.band === \"bullseye\").length;\n const score = records.reduce((s, r) => s + r.score, 0) / total;\n return (\n <ModuleShell\n type=\"estimate\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n appearance={config.appearance}\n className={className}\n announcement={message}\n >\n <CompletionCard\n score={score}\n passThreshold={Math.max(config.scoring.passThreshold, 0.7)}\n text={config.feedback.complete ?? t(\"estimate.summary\", { count: bullseyes, total })}\n stats={[\n { label: t(\"estimate.averageAccuracy\"), value: `${Math.round(score * 100)}%` },\n { label: t(\"estimate.bullseyes\"), value: `${bullseyes}/${total}` },\n ]}\n onRetry={retry}\n >\n <ul className=\"nb-est__summary\">\n {questions.map((q, i) => {\n const r = records[i];\n if (!r) return null;\n const fmt = (v: number) => formatEstimate(q, v, { currency, locale });\n return (\n <li key={i} className=\"nb-est__summary-item\" data-band={r.band}>\n <span\n className=\"nb-est__summary-icon\"\n role=\"img\"\n aria-label={t(`estimate.${r.band}`)}\n >\n {BAND_ICON[r.band]}\n </span>\n <span className=\"nb-est__summary-body\">\n <span className=\"nb-est__summary-prompt\">\n <RichText text={q.prompt} />\n </span>\n <span className=\"nb-est__summary-meta\">\n {t(\"estimate.guessVsAnswer\", { guess: fmt(r.guess), answer: fmt(r.answer) })}\n </span>\n </span>\n <span className=\"nb-est__summary-score\">{Math.round(r.score * 100)}%</span>\n </li>\n );\n })}\n </ul>\n </CompletionCard>\n </ModuleShell>\n );\n }\n\n return (\n <ModuleShell\n type=\"estimate\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : config.instructions}\n appearance={config.appearance}\n className={className}\n announcement={message}\n aside={\n multi ? (\n <span className=\"nb-counter\">\n {t(\"estimate.question\", { current: index + 1, total: questions.length })}\n </span>\n ) : undefined\n }\n eyebrow={\n multi ? (\n <ProgressBar\n value={(index + (answered ? 1 : 0)) / questions.length}\n showLabel={false}\n size=\"sm\"\n />\n ) : undefined\n }\n >\n <AnimatePresence mode=\"wait\" initial={false}>\n <motion.div\n key={`${life.runId}-${index}`}\n className=\"nb-est\"\n initial={reduced ? false : { opacity: 0, x: 24 }}\n animate={{ opacity: 1, x: 0 }}\n exit={reduced ? { opacity: 0 } : { opacity: 0, x: -24 }}\n transition={{ duration: reduced ? 0 : 0.24, ease: [0.2, 0.8, 0.2, 1] }}\n >\n <QuestionView\n moduleId={config.id}\n question={question}\n index={index}\n isLast={index + 1 >= questions.length}\n currency={currency}\n focusOnMount={index > 0}\n onLock={onLock}\n onNext={onNext}\n onHint={onHint}\n />\n </motion.div>\n </AnimatePresence>\n </ModuleShell>\n );\n}\n\nexport default Estimate;\n","import { useCallback, useEffect, useMemo, useRef, useState, type CSSProperties } from \"react\";\nimport { Check, Eye, X } from \"lucide-react\";\nimport {\n DndContext,\n DragOverlay,\n PointerSensor,\n TouchSensor,\n pointerWithin,\n rectIntersection,\n useDraggable,\n useDroppable,\n useSensor,\n useSensors,\n type CollisionDetection,\n type DragEndEvent,\n type DragStartEvent,\n} from \"@dnd-kit/core\";\nimport {\n evaluateLabelDiagram,\n labelDiagramChips,\n labelDiagramSchema,\n labelDiagramScore,\n labelZoneSide,\n shuffle,\n type LabelChip,\n type LabelDiagramConfig,\n type LabelDiagramEvaluation,\n type LabelTarget,\n seedFromString,\n} from \"@nibblearn/core\";\nimport clsx from \"clsx\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Button } from \"../../primitives/Button\";\nimport { AnimatedFeedback } from \"../../primitives/Feedback\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { SafeImage } from \"../../primitives/SafeImage\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./label-diagram.css\";\n\nexport type LabelDiagramProps = ModuleProps<LabelDiagramConfig>;\n\n/** Container width (px) from which drop zones sit on the image instead of in a list. */\nconst WIDE_BREAKPOINT = 600;\nconst TRAY_ID = \"tray\";\nconst zoneDropId = (targetId: string) => `zone:${targetId}`;\n\ntype ZoneState = \"empty\" | \"filled\" | \"locked\" | \"correct\" | \"incorrect\";\ntype Translator = ReturnType<typeof useNibblearn>[\"t\"];\n\nexport function LabelDiagram({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: LabelDiagramProps) {\n const parsed = useMemo(() => labelDiagramSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"label-diagram\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <LabelDiagramInner\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\n/** Owns the lifecycle; every reset remounts LabelDiagramRun with fresh state (keyed by runId). */\nfunction LabelDiagramInner(props: LabelDiagramProps) {\n const { config, onComplete, onEvent, resetKey } = props;\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"label-diagram\",\n onComplete,\n onEvent,\n resetKey,\n });\n return <LabelDiagramRun key={life.runId} {...props} life={life} />;\n}\n\n/** Prefer the zone under the pointer; fall back to overlap for touch and keyboard-free drops. */\nconst collision: CollisionDetection = (args) => {\n const hits = pointerWithin(args);\n return hits.length ? hits : rectIntersection(args);\n};\n\nfunction LabelDiagramRun({\n config,\n life,\n hideHeader,\n className,\n}: LabelDiagramProps & { life: ModuleLifecycle }) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { behavior } = config;\n const { image, targets, distractors } = config.content;\n const total = targets.length;\n\n const chips = useMemo(() => labelDiagramChips(targets, distractors), [targets, distractors]);\n const chipById = useMemo(() => new Map(chips.map((c) => [c.id, c])), [chips]);\n const targetIndex = useMemo(() => new Map(targets.map((tg, i) => [tg.id, i + 1])), [targets]);\n const [seed] = useState(() => behavior.shuffleSeed ?? seedFromString(config.id, life.runId));\n const order = useMemo(\n () => (behavior.shuffle ? shuffle(chips, seed) : chips),\n [chips, behavior.shuffle, seed],\n );\n\n const [placements, setPlacements] = useState<Record<string, string | undefined>>({});\n const [selected, setSelected] = useState<string | null>(null);\n const [evaluation, setEvaluation] = useState<LabelDiagramEvaluation | null>(null);\n const [lockedIds, setLockedIds] = useState<string[]>([]);\n const [attempts, setAttempts] = useState(0);\n const [firstFraction, setFirstFraction] = useState<number | null>(null);\n const [revealed, setRevealed] = useState(false);\n const [finished, setFinished] = useState(false);\n const [activeId, setActiveId] = useState<string | null>(null);\n const [wide, setWide] = useState(false);\n const [naturalRatio, setNaturalRatio] = useState<number | null>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const el = rootRef.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const update = () => setWide(el.clientWidth >= WIDE_BREAKPOINT);\n const ro = new ResizeObserver(update);\n ro.observe(el);\n update();\n return () => ro.disconnect();\n }, []);\n\n const checked = evaluation !== null;\n const done = checked && (evaluation.correct || revealed);\n const exhausted = behavior.maxAttempts > 0 && attempts >= behavior.maxAttempts;\n const canRetry = checked && !done && behavior.allowRetry && !exhausted;\n const canReveal = checked && !done && (attempts >= 2 || exhausted || !behavior.allowRetry);\n\n const zoneOf = useMemo(() => {\n const m = new Map<string, string>();\n for (const [targetId, chipId] of Object.entries(placements))\n if (chipId) m.set(chipId, targetId);\n return m;\n }, [placements]);\n const trayChips = order.filter((c) => !zoneOf.has(c.id));\n const filled = targets.filter((tg) => placements[tg.id]).length;\n const zonesLeft = total - filled;\n\n const zoneMovable = useCallback(\n (targetId: string) => !checked && !lockedIds.includes(targetId),\n [checked, lockedIds],\n );\n const chipMovable = useCallback(\n (chipId: string) => {\n if (checked) return false;\n const z = zoneOf.get(chipId);\n return !z || !lockedIds.includes(z);\n },\n [checked, zoneOf, lockedIds],\n );\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n useSensor(TouchSensor, { activationConstraint: { delay: 120, tolerance: 8 } }),\n );\n\n const place = useCallback(\n (chipId: string, targetId: string) => {\n const chip = chipById.get(chipId);\n if (!chip || !chipMovable(chipId) || !zoneMovable(targetId)) return;\n const from = zoneOf.get(chipId);\n setPlacements((prev) => {\n const next = { ...prev };\n const existing = prev[targetId];\n if (from) next[from] = existing && existing !== chipId ? existing : undefined;\n next[targetId] = chipId;\n return next;\n });\n setSelected(null);\n life.emit(\"module:interact\", { action: \"place\", label: chip.text, targetId });\n announce(t(\"label.placed\", { label: chip.text, index: targetIndex.get(targetId) ?? 0 }));\n },\n [chipById, chipMovable, zoneMovable, zoneOf, life, announce, t, targetIndex],\n );\n\n const returnChip = useCallback(\n (chipId: string) => {\n const chip = chipById.get(chipId);\n const from = zoneOf.get(chipId);\n if (!chip || !from || !zoneMovable(from)) return;\n setPlacements((prev) => ({ ...prev, [from]: undefined }));\n setSelected(null);\n life.emit(\"module:interact\", { action: \"return\", label: chip.text, targetId: from });\n announce(t(\"label.returned\", { label: chip.text }));\n },\n [chipById, zoneOf, zoneMovable, life, announce, t],\n );\n\n const toggleSelect = useCallback(\n (chipId: string) => {\n if (!chipMovable(chipId)) return;\n const chip = chipById.get(chipId);\n setSelected((prev) => {\n if (prev === chipId) return null;\n if (chip) announce(t(\"label.selected\", { label: chip.text }));\n return chipId;\n });\n },\n [chipMovable, chipById, announce, t],\n );\n\n const activateZone = useCallback(\n (targetId: string) => {\n if (!zoneMovable(targetId)) return;\n const current = placements[targetId];\n if (selected && selected !== current) place(selected, targetId);\n else if (current) returnChip(current);\n },\n [zoneMovable, placements, selected, place, returnChip],\n );\n\n const onDragStart = useCallback((e: DragStartEvent) => {\n setActiveId(String(e.active.id));\n setSelected(null);\n }, []);\n const onDragEnd = useCallback(\n (e: DragEndEvent) => {\n setActiveId(null);\n if (!e.over) return;\n const chipId = String(e.active.id);\n const over = String(e.over.id);\n if (over === TRAY_ID) returnChip(chipId);\n else if (over.startsWith(\"zone:\")) place(chipId, over.slice(5));\n },\n [place, returnChip],\n );\n\n const check = useCallback(() => {\n if (checked || zonesLeft > 0) return;\n const ev = evaluateLabelDiagram(targets, placements);\n const n = attempts + 1;\n setAttempts(n);\n life.attempt();\n setEvaluation(ev);\n setSelected(null);\n if (firstFraction === null) setFirstFraction(ev.score);\n const willReveal =\n !ev.correct &&\n (!behavior.allowRetry || (behavior.maxAttempts > 0 && n >= behavior.maxAttempts));\n if (willReveal) setRevealed(true);\n life.emit(\"module:answer\", {\n placements: Object.fromEntries(\n targets.map((tg) => [tg.id, chipById.get(placements[tg.id] ?? \"\")?.text ?? null]),\n ),\n correct: ev.correct,\n correctCount: ev.correctCount,\n attempts: n,\n });\n announce(\n ev.correct\n ? `${t(\"a11y.correctAnswer\")} ${t(\"label.allCorrect\")}`\n : `${t(\"a11y.incorrectAnswer\")} ${t(\"label.correctCount\", { correct: ev.correctCount, total })}`,\n );\n }, [\n checked,\n zonesLeft,\n targets,\n placements,\n attempts,\n life,\n firstFraction,\n behavior,\n chipById,\n announce,\n t,\n total,\n ]);\n\n const retry = useCallback(() => {\n if (!evaluation) return;\n const ok = targets.filter((tg) => evaluation.targets[tg.id]).map((tg) => tg.id);\n setLockedIds(ok);\n setPlacements((prev) =>\n Object.fromEntries(\n targets.map((tg) => [tg.id, ok.includes(tg.id) ? prev[tg.id] : undefined]),\n ),\n );\n setEvaluation(null);\n life.emit(\"module:interact\", { action: \"retry\" });\n }, [evaluation, targets, life]);\n\n const reveal = useCallback(() => {\n setRevealed(true);\n life.emit(\"module:interact\", { action: \"reveal\" });\n announce(t(\"common.showAnswer\"));\n }, [life, announce, t]);\n\n const score = evaluation\n ? labelDiagramScore(attempts, evaluation.correct, firstFraction ?? 0)\n : 0;\n\n const finish = useCallback(() => {\n if (!evaluation) return;\n setFinished(true);\n life.complete({\n score,\n correct: evaluation.correctCount,\n total,\n details: { attempts, revealed, firstFraction },\n });\n announce(t(\"a11y.moduleComplete\"));\n }, [evaluation, score, life, total, attempts, revealed, firstFraction, announce, t]);\n\n const zoneState = (targetId: string): ZoneState => {\n if (evaluation) return evaluation.targets[targetId] ? \"correct\" : \"incorrect\";\n if (lockedIds.includes(targetId)) return \"locked\";\n return placements[targetId] ? \"filled\" : \"empty\";\n };\n\n const restart = () => {\n life.reset();\n life.emit(\"module:reset\");\n };\n\n if (finished && evaluation) {\n const withNotes = behavior.showExplanation && targets.some((tg) => tg.explanation);\n return (\n <ModuleShell\n type=\"label-diagram\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n appearance={config.appearance}\n className={className}\n announcement={message}\n >\n <CompletionCard\n score={score}\n text={\n config.feedback.complete ??\n (evaluation.correct\n ? t(\"label.allCorrect\")\n : t(\"label.correctCount\", { correct: evaluation.correctCount, total }))\n }\n stats={[\n { label: t(\"common.correct\"), value: `${evaluation.correctCount}/${total}` },\n { label: t(\"common.attempts\"), value: attempts },\n ]}\n onRetry={restart}\n >\n {(withNotes || (behavior.showExplanation && config.content.explanation)) && (\n <div className=\"nb-label__notes\">\n <h4 className=\"nb-label__notes-title\">{t(\"label.explanations\")}</h4>\n {withNotes && (\n <ol className=\"nb-label__notes-list\">\n {targets.map((tg, i) => (\n <li key={tg.id} className=\"nb-label__note\" data-ok={evaluation.targets[tg.id]}>\n <span className=\"nb-label__note-num\" aria-hidden>\n {i + 1}\n </span>\n <span className=\"nb-label__note-body\">\n <strong className=\"nb-label__note-label\">{tg.label}</strong>\n {tg.explanation && <RichText text={tg.explanation} />}\n </span>\n </li>\n ))}\n </ol>\n )}\n {config.content.explanation && (\n <p className=\"nb-label__notes-extra\">\n <RichText text={config.content.explanation} />\n </p>\n )}\n </div>\n )}\n </CompletionCard>\n </ModuleShell>\n );\n }\n\n const selectedChip = selected ? chipById.get(selected) : undefined;\n const activeChip = activeId ? chipById.get(activeId) : undefined;\n const targeting = Boolean(selectedChip || activeChip);\n const ratio =\n image.width && image.height\n ? `${image.width} / ${image.height}`\n : naturalRatio\n ? `${naturalRatio}`\n : undefined;\n\n const zoneProps = (tg: LabelTarget) => {\n const chipId = placements[tg.id];\n return {\n target: tg,\n index: targetIndex.get(tg.id) ?? 0,\n chip: chipId ? chipById.get(chipId) : undefined,\n state: zoneState(tg.id),\n movable: zoneMovable(tg.id),\n targeting: targeting && zoneMovable(tg.id),\n revealed,\n onActivate: () => activateZone(tg.id),\n t,\n };\n };\n\n return (\n <ModuleShell\n type=\"label-diagram\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : (config.instructions ?? t(\"label.instructions\"))}\n appearance={config.appearance}\n className={className}\n width=\"wide\"\n announcement={message}\n aside={\n <span className=\"nb-counter\">\n {checked\n ? t(\"label.correctCount\", { correct: evaluation.correctCount, total })\n : t(\"label.zonesLeft\", { count: zonesLeft })}\n </span>\n }\n >\n <DndContext\n id={`${config.id}-dnd`}\n sensors={sensors}\n collisionDetection={collision}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragCancel={() => setActiveId(null)}\n accessibility={{\n screenReaderInstructions: { draggable: t(\"a11y.dragInstructions\") },\n announcements: {\n onDragStart: ({ active }) =>\n t(\"a11y.pickedUp\", { item: chipById.get(String(active.id))?.text ?? \"\" }),\n onDragOver: ({ over }) =>\n over && String(over.id).startsWith(\"zone:\")\n ? t(\"label.dragTo\", { index: targetIndex.get(String(over.id).slice(5)) ?? 0 })\n : undefined,\n onDragEnd: () => undefined,\n onDragCancel: ({ active }) =>\n t(\"a11y.dropCancelled\", { item: chipById.get(String(active.id))?.text ?? \"\" }),\n },\n }}\n >\n <div ref={rootRef} className=\"nb-label\" data-wide={wide ? \"true\" : \"false\"}>\n <div\n className=\"nb-label__stage\"\n style={ratio ? { aspectRatio: ratio } : undefined}\n data-ratio={ratio ? \"true\" : undefined}\n data-targeting={targeting ? \"true\" : undefined}\n >\n <SafeImage\n media={image}\n className=\"nb-label__image\"\n showCaption={false}\n onLoaded={({ width, height }) => {\n if (width && height && !(image.width && image.height))\n setNaturalRatio(width / height);\n }}\n />\n {targets.map((tg) => {\n const z = zoneProps(tg);\n return (\n <div\n key={tg.id}\n className=\"nb-label__pin\"\n style={{ left: `${tg.x}%`, top: `${tg.y}%` } as CSSProperties}\n data-side={labelZoneSide(tg.x)}\n data-v={tg.y < 8 ? \"top\" : tg.y > 92 ? \"bottom\" : undefined}\n >\n <span\n className=\"nb-label__dot\"\n data-state={z.state}\n data-targeting={z.targeting ? \"true\" : undefined}\n aria-hidden\n >\n {z.state === \"correct\" || z.state === \"locked\" ? (\n <Check strokeWidth={3} />\n ) : z.state === \"incorrect\" ? (\n <X strokeWidth={3} />\n ) : (\n z.index\n )}\n </span>\n {wide && <Zone {...z} variant=\"pill\" />}\n </div>\n );\n })}\n </div>\n {image.caption && <p className=\"nb-label__caption\">{image.caption}</p>}\n\n {!wide && (\n <ol className=\"nb-label__list\" aria-label={t(\"label.zones\")}>\n {targets.map((tg) => (\n <li key={tg.id}>\n <Zone {...zoneProps(tg)} variant=\"row\" />\n </li>\n ))}\n </ol>\n )}\n\n <Tray\n chips={trayChips}\n selected={selected}\n disabled={checked}\n onSelect={toggleSelect}\n t={t}\n />\n </div>\n\n <DragOverlay dropAnimation={reduced ? null : undefined}>\n {activeChip ? (\n <span className=\"nb-label__chip nb-label__chip--overlay\" data-state=\"selected\">\n {activeChip.text}\n </span>\n ) : null}\n </DragOverlay>\n </DndContext>\n\n <AnimatedFeedback\n show={checked}\n tone={\n evaluation?.correct\n ? \"correct\"\n : evaluation && evaluation.correctCount > 0\n ? \"partial\"\n : \"incorrect\"\n }\n title={evaluation?.correct ? t(\"label.allCorrect\") : t(\"common.incorrect\")}\n text={\n evaluation\n ? evaluation.correct\n ? (config.feedback.correct ?? undefined)\n : (config.feedback.incorrect ??\n t(\"label.correctCount\", { correct: evaluation.correctCount, total }))\n : undefined\n }\n />\n\n <div className=\"nb-label__footer\">\n <span className=\"nb-muted nb-text-sm\">\n {!checked && zonesLeft > 0 ? t(\"label.zonesLeft\", { count: zonesLeft }) : \"\"}\n </span>\n <div className=\"nb-module__actions\">\n {canReveal && (\n <Button variant=\"ghost\" onClick={reveal} leading={<Eye aria-hidden />}>\n {t(\"common.showAnswer\")}\n </Button>\n )}\n {canRetry && (\n <Button variant=\"secondary\" onClick={retry}>\n {t(\"common.retry\")}\n </Button>\n )}\n {!checked ? (\n <Button variant=\"primary\" onClick={check} disabled={zonesLeft > 0}>\n {t(\"common.check\")}\n </Button>\n ) : (\n done && (\n <Button variant=\"primary\" onClick={finish} autoFocus>\n {t(\"common.finish\")}\n </Button>\n )\n )}\n </div>\n </div>\n </ModuleShell>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Zone: a drop target on the image (pill) or in the list (row)\n * -------------------------------------------------------------------------- */\n\ninterface ZoneProps {\n target: LabelTarget;\n index: number;\n chip?: LabelChip;\n state: ZoneState;\n movable: boolean;\n targeting: boolean;\n revealed: boolean;\n variant: \"pill\" | \"row\";\n onActivate: () => void;\n t: Translator;\n}\n\nfunction Zone({\n target,\n index,\n chip,\n state,\n movable,\n targeting,\n revealed,\n variant,\n onActivate,\n t,\n}: ZoneProps) {\n const { setNodeRef: setDropRef, isOver } = useDroppable({\n id: zoneDropId(target.id),\n disabled: !movable,\n });\n const {\n setNodeRef: setDragRef,\n listeners,\n attributes,\n isDragging,\n } = useDraggable({\n id: chip?.id ?? `empty:${target.id}`,\n disabled: !chip || !movable,\n });\n const showAnswer = state === \"incorrect\" && revealed;\n const visible = chip ? chip.text : targeting ? t(\"label.tapToPlace\") : t(\"label.dropHere\");\n return (\n <div\n ref={setDropRef}\n className={clsx(\"nb-label__zone\", `nb-label__zone--${variant}`)}\n data-over={isOver ? \"true\" : undefined}\n >\n {variant === \"pill\" && <span className=\"nb-label__leader\" aria-hidden />}\n <button\n ref={setDragRef}\n type=\"button\"\n className=\"nb-label__zone-btn\"\n data-state={state}\n data-targeting={targeting ? \"true\" : undefined}\n data-dragging={isDragging ? \"true\" : undefined}\n aria-disabled={!movable || undefined}\n aria-describedby={chip && movable ? attributes[\"aria-describedby\"] : undefined}\n title={chip?.text}\n onClick={onActivate}\n {...(chip && movable ? listeners : {})}\n >\n {variant === \"row\" && (\n <span className=\"nb-label__zone-num\" aria-hidden>\n {index}\n </span>\n )}\n <span className=\"nb-sr-only\">{`${t(\"label.zone\", { index })}:`}</span>{\" \"}\n <span className=\"nb-label__zone-text\" data-empty={chip ? undefined : \"true\"}>\n {state === \"incorrect\" && showAnswer && chip ? <s>{chip.text}</s> : visible}\n </span>\n {showAnswer && (\n <span className=\"nb-label__zone-answer\">\n {t(\"label.correctLabel\", { label: target.label })}\n </span>\n )}\n {(state === \"correct\" || state === \"locked\" || state === \"incorrect\") && (\n <span\n className=\"nb-label__zone-mark\"\n role=\"img\"\n aria-label={state === \"incorrect\" ? t(\"common.incorrect\") : t(\"common.correct\")}\n >\n {state === \"incorrect\" ? (\n <X strokeWidth={3} aria-hidden />\n ) : (\n <Check strokeWidth={3} aria-hidden />\n )}\n </span>\n )}\n </button>\n </div>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Tray of unplaced labels\n * -------------------------------------------------------------------------- */\n\ninterface TrayProps {\n chips: LabelChip[];\n selected: string | null;\n disabled: boolean;\n onSelect: (id: string) => void;\n t: Translator;\n}\n\nfunction Tray({ chips, selected, disabled, onSelect, t }: TrayProps) {\n const { setNodeRef, isOver } = useDroppable({ id: TRAY_ID, disabled });\n return (\n <section\n ref={setNodeRef}\n className=\"nb-label__tray\"\n data-over={isOver ? \"true\" : undefined}\n aria-label={t(\"label.tray\")}\n >\n <span className=\"nb-label__tray-title\" aria-hidden>\n {t(\"label.tray\")}\n </span>\n <div className=\"nb-label__chips\">\n {chips.map((chip) => (\n <TrayChip\n key={chip.id}\n chip={chip}\n selected={selected === chip.id}\n disabled={disabled}\n onSelect={() => onSelect(chip.id)}\n />\n ))}\n {chips.length === 0 && <span className=\"nb-label__tray-empty\">{t(\"label.trayEmpty\")}</span>}\n </div>\n </section>\n );\n}\n\nfunction TrayChip({\n chip,\n selected,\n disabled,\n onSelect,\n}: {\n chip: LabelChip;\n selected: boolean;\n disabled: boolean;\n onSelect: () => void;\n}) {\n const { setNodeRef, listeners, attributes, isDragging } = useDraggable({\n id: chip.id,\n disabled,\n });\n return (\n <button\n ref={setNodeRef}\n type=\"button\"\n className=\"nb-label__chip\"\n data-state={selected ? \"selected\" : \"idle\"}\n data-dragging={isDragging ? \"true\" : undefined}\n aria-pressed={selected}\n aria-disabled={disabled || undefined}\n aria-describedby={attributes[\"aria-describedby\"]}\n onClick={disabled ? undefined : onSelect}\n {...listeners}\n >\n {chip.text}\n </button>\n );\n}\n\nexport default LabelDiagram;\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n} from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { Check, ChevronLeft, ChevronRight, X } from \"lucide-react\";\nimport clsx from \"clsx\";\nimport {\n attemptScore,\n clampComparePosition,\n compareExploreProgress,\n compareKeyStep,\n evaluateChoice,\n imageCompareSchema,\n isAnnotationRevealed,\n revealPositionFor,\n trackCompareReach,\n type ChoiceEvaluation,\n type CompareAnnotation,\n type CompareReach,\n type ImageCompareConfig,\n} from \"@nibblearn/core\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Button } from \"../../primitives/Button\";\nimport { AnimatedFeedback } from \"../../primitives/Feedback\";\nimport { Explanation } from \"../../primitives/Explanation\";\nimport { OptionCard, type OptionState } from \"../../primitives/OptionCard\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { SafeImage } from \"../../primitives/SafeImage\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./image-compare.css\";\n\nexport type ImageCompareProps = ModuleProps<ImageCompareConfig>;\n\n/** Container width (px) from which annotation cards float over the image. */\nconst FLOAT_BREAKPOINT = 640;\nconst LETTERS = \"ABCDE\";\n/** Half the handle width plus a small inset (px). */\nconst HANDLE_HALF = 34;\n\nexport function ImageCompare({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: ImageCompareProps) {\n const parsed = useMemo(() => imageCompareSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"image-compare\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <ImageCompareInner\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\n/** Owns the lifecycle; every reset remounts ImageCompareRun with fresh state (keyed by runId). */\nfunction ImageCompareInner(props: ImageCompareProps) {\n const { config, onComplete, onEvent, resetKey } = props;\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"image-compare\",\n onComplete,\n onEvent,\n resetKey,\n });\n return <ImageCompareRun key={life.runId} {...props} life={life} />;\n}\n\n/** Floating-card position next to a marker (percentages of the stage). */\nfunction cardStyle(a: CompareAnnotation): CSSProperties {\n const gap = 3;\n const style: CSSProperties = {};\n if (a.x > 50) style.right = `${100 - a.x + gap}%`;\n else style.left = `${a.x + gap}%`;\n if (a.y > 55) style.bottom = `${Math.max(2, 100 - a.y - 6)}%`;\n else style.top = `${Math.max(2, a.y - 6)}%`;\n return style;\n}\n\ninterface DragState {\n id: number;\n mode: \"pending\" | \"drag\";\n startX: number;\n startY: number;\n}\n\nfunction ImageCompareRun({\n config,\n life,\n hideHeader,\n className,\n}: ImageCompareProps & { life: ModuleLifecycle }) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { before, after, annotations, question, takeaway } = config.content;\n const { behavior } = config;\n const annotationIds = useMemo(() => annotations.map((a) => a.id), [annotations]);\n const initial = clampComparePosition(behavior.initialPosition);\n\n const [position, setPosition] = useState(initial);\n const [dragging, setDragging] = useState(false);\n const [interacted, setInteracted] = useState(false);\n const [reach, setReach] = useState<CompareReach>({ min: initial, max: initial });\n const [opened, setOpened] = useState<string[]>([]);\n const [activeId, setActiveId] = useState<string | null>(null);\n const [stageWidth, setStageWidth] = useState(0);\n const [finished, setFinished] = useState(false);\n const [score, setScore] = useState<number | undefined>(undefined);\n const [attempts, setAttempts] = useState(0);\n const [naturalRatio, setNaturalRatio] = useState<number | null>(null);\n\n const stageRef = useRef<HTMLDivElement>(null);\n const handleRef = useRef<HTMLDivElement>(null);\n const cardRef = useRef<HTMLDivElement>(null);\n const markerRefs = useRef(new Map<string, HTMLButtonElement>());\n const dragRef = useRef<DragState | null>(null);\n const reachRef = useRef<CompareReach>(reach);\n const exploredRef = useRef(false);\n const positionRef = useRef(position);\n const openedRef = useRef<string[]>(opened);\n\n useEffect(() => {\n const el = stageRef.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const update = () => setStageWidth(el.clientWidth);\n const ro = new ResizeObserver(update);\n ro.observe(el);\n update();\n return () => ro.disconnect();\n }, []);\n\n const wide = stageWidth >= FLOAT_BREAKPOINT;\n // On small stages 44px markers would overlap; they become decorative and the notes\n // list below the image is the interactive (and accessible) way to open notes.\n const compactMarkers = stageWidth > 0 && stageWidth < 480;\n const progress = compareExploreProgress(reach, opened, annotationIds);\n const unlocked = !behavior.requireExplore || progress.explored;\n\n const complete = useCallback(\n (result: { score?: number; attempts?: number }) => {\n setFinished(true);\n setScore(result.score);\n life.complete({\n ...(result.score !== undefined\n ? { score: result.score, correct: result.score === 1 ? 1 : 0, total: 1 }\n : {}),\n details: {\n opened: openedRef.current,\n reach: reachRef.current,\n ...(result.attempts !== undefined ? { attempts: result.attempts } : {}),\n },\n });\n announce(t(\"a11y.moduleComplete\"));\n },\n [life, announce, t],\n );\n\n /** Runs after every reach / opened change made by the learner. */\n const checkExplored = useCallback(\n (nextReach: CompareReach, nextOpened: string[]) => {\n if (exploredRef.current || !behavior.requireExplore) return;\n if (!compareExploreProgress(nextReach, nextOpened, annotationIds).explored) return;\n exploredRef.current = true;\n life.emit(\"module:interact\", { action: \"explored\" });\n if (question) announce(`${t(\"compare.explored\")} ${t(\"compare.question\")}`);\n else complete({});\n },\n [behavior.requireExplore, annotationIds, life, question, announce, t, complete],\n );\n\n const moveTo = useCallback(\n (raw: number) => {\n const p = clampComparePosition(raw);\n positionRef.current = p;\n setPosition(p);\n setInteracted(true);\n const next = trackCompareReach(reachRef.current, p);\n if (next !== reachRef.current) {\n reachRef.current = next;\n setReach(next);\n checkExplored(next, openedRef.current);\n }\n },\n [checkExplored],\n );\n\n const positionFromClientX = (clientX: number): number => {\n const r = stageRef.current?.getBoundingClientRect();\n if (!r || r.width === 0) return positionRef.current;\n return ((clientX - r.left) / r.width) * 100;\n };\n\n const startDrag = (e: ReactPointerEvent<HTMLDivElement>) => {\n try {\n e.currentTarget.setPointerCapture(e.pointerId);\n } catch {\n /* capture is best effort (e.g. synthetic events) */\n }\n setDragging(true);\n };\n\n const onPointerDown = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (e.pointerType === \"mouse\" && e.button !== 0) return;\n const target = e.target as HTMLElement;\n if (target.closest(\"[data-nb-cmp-ignore]\")) return;\n const fromHandle = Boolean(target.closest(\".nb-cmp__handle\"));\n if (e.pointerType === \"mouse\" || fromHandle) {\n e.preventDefault();\n handleRef.current?.focus({ preventScroll: true });\n dragRef.current = { id: e.pointerId, mode: \"drag\", startX: e.clientX, startY: e.clientY };\n startDrag(e);\n if (!fromHandle) moveTo(positionFromClientX(e.clientX));\n } else {\n dragRef.current = { id: e.pointerId, mode: \"pending\", startX: e.clientX, startY: e.clientY };\n }\n };\n\n const onPointerMove = (e: ReactPointerEvent<HTMLDivElement>) => {\n const d = dragRef.current;\n if (!d || d.id !== e.pointerId) return;\n if (d.mode === \"pending\") {\n const dx = e.clientX - d.startX;\n const dy = e.clientY - d.startY;\n if (Math.abs(dx) < 6 || Math.abs(dx) < Math.abs(dy)) return;\n d.mode = \"drag\";\n startDrag(e);\n }\n moveTo(positionFromClientX(e.clientX));\n };\n\n const endDrag = (e: ReactPointerEvent<HTMLDivElement>, cancelled: boolean) => {\n const d = dragRef.current;\n if (!d || d.id !== e.pointerId) return;\n dragRef.current = null;\n if (d.mode === \"pending\" && !cancelled) moveTo(positionFromClientX(e.clientX));\n setDragging(false);\n if (d.mode === \"drag\" || !cancelled)\n life.emit(\"module:interact\", { action: \"slide\", position: positionRef.current });\n };\n\n const onSliderKey = (e: ReactKeyboardEvent<HTMLDivElement>) => {\n const next = compareKeyStep(positionRef.current, e.key);\n if (next === null) return;\n e.preventDefault();\n moveTo(next);\n life.emit(\"module:interact\", { action: \"slide\", position: next });\n };\n\n const openNote = useCallback(\n (a: CompareAnnotation, fromList: boolean) => {\n const target = revealPositionFor(a, positionRef.current);\n if (target !== positionRef.current) moveTo(target);\n setActiveId(a.id);\n life.emit(\"module:interact\", { annotationId: a.id });\n announce(a.title);\n if (!openedRef.current.includes(a.id)) {\n const next = [...openedRef.current, a.id];\n openedRef.current = next;\n setOpened(next);\n checkExplored(reachRef.current, next);\n }\n if (!fromList) requestAnimationFrame(() => cardRef.current?.focus({ preventScroll: true }));\n },\n [moveTo, life, announce, checkExplored],\n );\n\n const closeNote = useCallback(() => {\n const id = activeId;\n setActiveId(null);\n requestAnimationFrame(() => {\n if (id) markerRefs.current.get(id)?.focus({ preventScroll: true });\n });\n }, [activeId]);\n\n const restart = () => {\n life.reset();\n life.emit(\"module:reset\");\n };\n\n const ratio =\n before.image.width && before.image.height\n ? `${before.image.width} / ${before.image.height}`\n : naturalRatio\n ? `${naturalRatio}`\n : \"16 / 10\";\n const active = activeId ? annotations.find((a) => a.id === activeId) : undefined;\n const activeIndex = active ? annotations.indexOf(active) : -1;\n const activeVisible = active ? isAnnotationRevealed(active, position) : false;\n const sideLabel = (side: \"before\" | \"after\") => (side === \"before\" ? before.label : after.label);\n // Keep the handle inside the frame near the edges (it is 60px wide, centred on the divider).\n const handleX = (position / 100) * stageWidth;\n const handleShift =\n stageWidth > 0\n ? Math.max(0, HANDLE_HALF - handleX) - Math.max(0, handleX - (stageWidth - HANDLE_HALF))\n : 0;\n const valueText = t(\"compare.valueText\", { percent: Math.round(position), label: before.label });\n\n const card = active && (\n <motion.div\n key={active.id}\n ref={cardRef}\n className={clsx(\"nb-cmp__card\", wide && \"nb-cmp__card--floating\")}\n style={wide ? cardStyle(active) : undefined}\n data-side={active.side}\n data-nb-cmp-ignore=\"\"\n role=\"group\"\n aria-labelledby={`${config.id}-note-${active.id}`}\n tabIndex={-1}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n closeNote();\n }\n }}\n initial={reduced ? false : { opacity: 0, y: 6, scale: 0.97 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={reduced ? { opacity: 0 } : { opacity: 0, y: 4, scale: 0.97 }}\n transition={{ duration: reduced ? 0 : 0.2, ease: [0.2, 0.8, 0.2, 1] }}\n >\n <div className=\"nb-cmp__card-head\">\n <span className=\"nb-cmp__card-num\" aria-hidden>\n {activeIndex + 1}\n </span>\n <div className=\"nb-cmp__card-titles\">\n <span className=\"nb-cmp__card-side\">\n {t(\"compare.onSide\", { label: sideLabel(active.side) })}\n </span>\n <h3 className=\"nb-cmp__card-title\" id={`${config.id}-note-${active.id}`}>\n {active.title}\n </h3>\n </div>\n <Button\n icon\n size=\"sm\"\n variant=\"ghost\"\n aria-label={t(\"common.close\")}\n onClick={closeNote}\n className=\"nb-cmp__close\"\n >\n <X aria-hidden />\n </Button>\n </div>\n <div className=\"nb-cmp__card-body\">\n <RichText text={active.text} paragraphs />\n </div>\n </motion.div>\n );\n\n return (\n <ModuleShell\n type=\"image-compare\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : (config.instructions ?? t(\"compare.instructions\"))}\n appearance={config.appearance}\n className={className}\n width=\"wide\"\n announcement={message}\n aside={\n annotations.length > 0 ? (\n <span className=\"nb-counter\">\n {t(\"compare.notesOpened\", { count: progress.openedCount, total: progress.total })}\n </span>\n ) : undefined\n }\n >\n <div\n ref={stageRef}\n className=\"nb-cmp__stage\"\n style={\n {\n aspectRatio: ratio,\n \"--_pos\": position,\n \"--_shift\": `${Math.round(handleShift)}px`,\n } as CSSProperties\n }\n data-dragging={dragging ? \"true\" : undefined}\n data-interacted={interacted ? \"true\" : undefined}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={(e) => endDrag(e, false)}\n onPointerCancel={(e) => endDrag(e, true)}\n >\n <div className=\"nb-cmp__layer nb-cmp__layer--after\">\n <SafeImage media={after.image} showCaption={false} rounded={false} />\n </div>\n <div className=\"nb-cmp__layer nb-cmp__layer--before\">\n <SafeImage\n media={before.image}\n showCaption={false}\n rounded={false}\n onLoaded={({ width, height }) => {\n if (width && height && !(before.image.width && before.image.height))\n setNaturalRatio(width / height);\n }}\n />\n </div>\n\n <span\n className=\"nb-cmp__chip nb-cmp__chip--before\"\n data-dim={position < 14 ? \"true\" : undefined}\n aria-hidden\n >\n {before.label}\n </span>\n <span\n className=\"nb-cmp__chip nb-cmp__chip--after\"\n data-dim={position > 86 ? \"true\" : undefined}\n aria-hidden\n >\n {after.label}\n </span>\n\n {annotations.map((a, i) => {\n const visible = isAnnotationRevealed(a, position);\n const isOpen = opened.includes(a.id);\n if (compactMarkers) {\n return (\n <span\n key={a.id}\n className=\"nb-cmp__marker nb-cmp__marker--static\"\n style={{ left: `${a.x}%`, top: `${a.y}%` }}\n data-side={a.side}\n data-visible={visible ? \"true\" : \"false\"}\n data-opened={isOpen ? \"true\" : undefined}\n data-active={activeId === a.id ? \"true\" : undefined}\n aria-hidden\n >\n <span className=\"nb-cmp__marker-dot\">\n {isOpen && activeId !== a.id ? <Check strokeWidth={3} /> : i + 1}\n </span>\n </span>\n );\n }\n return (\n <button\n key={a.id}\n ref={(el) => {\n if (el) markerRefs.current.set(a.id, el);\n else markerRefs.current.delete(a.id);\n }}\n type=\"button\"\n className=\"nb-cmp__marker\"\n style={{ left: `${a.x}%`, top: `${a.y}%` }}\n data-side={a.side}\n data-visible={visible ? \"true\" : \"false\"}\n data-opened={isOpen ? \"true\" : undefined}\n data-active={activeId === a.id ? \"true\" : undefined}\n data-nb-cmp-ignore=\"\"\n tabIndex={visible ? 0 : -1}\n aria-hidden={visible ? undefined : true}\n aria-label={t(\"compare.note\", { index: i + 1, title: a.title })}\n aria-expanded={activeId === a.id}\n onClick={() => (activeId === a.id ? closeNote() : openNote(a, false))}\n >\n <span className=\"nb-cmp__marker-dot\" aria-hidden>\n {isOpen && activeId !== a.id ? <Check strokeWidth={3} /> : i + 1}\n </span>\n </button>\n );\n })}\n\n <div className=\"nb-cmp__divider\">\n <span className=\"nb-cmp__line\" aria-hidden />\n <div\n ref={handleRef}\n className=\"nb-cmp__handle\"\n role=\"slider\"\n tabIndex={0}\n aria-label={t(\"compare.slider\", { before: before.label, after: after.label })}\n aria-orientation=\"horizontal\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(position)}\n aria-valuetext={valueText}\n onKeyDown={onSliderKey}\n >\n <ChevronLeft aria-hidden strokeWidth={2.75} />\n <ChevronRight aria-hidden strokeWidth={2.75} />\n </div>\n </div>\n\n {wide && <AnimatePresence initial={false}>{activeVisible && card}</AnimatePresence>}\n </div>\n\n {!wide && <AnimatePresence initial={false}>{card}</AnimatePresence>}\n\n {behavior.requireExplore && (\n <div className=\"nb-cmp__progress\" data-done={progress.explored ? \"true\" : undefined}>\n {progress.explored ? (\n <span className=\"nb-cmp__progress-done\">\n <Check aria-hidden strokeWidth={3} />\n {t(\"compare.explored\")}\n </span>\n ) : (\n <>\n <span className=\"nb-cmp__progress-text\">{t(\"compare.explore\")}</span>\n <span className=\"nb-cmp__progress-steps\">\n <ProgressStep done={progress.afterSeen} label={after.label} t={t} />\n <ProgressStep done={progress.beforeSeen} label={before.label} t={t} />\n {annotations.length > 0 && (\n <span\n className=\"nb-cmp__step\"\n data-done={progress.openedCount >= progress.total ? \"true\" : undefined}\n >\n {t(\"compare.notesOpened\", {\n count: progress.openedCount,\n total: progress.total,\n })}\n </span>\n )}\n </span>\n </>\n )}\n </div>\n )}\n\n {annotations.length > 0 && (\n <section className=\"nb-cmp__notes\" aria-labelledby={`${config.id}-notes`}>\n <h3 className=\"nb-cmp__notes-title\" id={`${config.id}-notes`}>\n {t(\"compare.notes\")}\n </h3>\n <ol className=\"nb-cmp__note-list\">\n {annotations.map((a, i) => (\n <li key={a.id}>\n <button\n type=\"button\"\n className=\"nb-cmp__note\"\n data-side={a.side}\n data-opened={opened.includes(a.id) ? \"true\" : undefined}\n aria-current={activeId === a.id ? \"true\" : undefined}\n onClick={() => openNote(a, true)}\n >\n <span className=\"nb-cmp__note-num\" aria-hidden>\n {opened.includes(a.id) ? <Check strokeWidth={3} /> : i + 1}\n </span>\n <span className=\"nb-cmp__note-text\">\n <span className=\"nb-cmp__note-title\">{a.title}</span>\n <span className=\"nb-cmp__note-side\">\n {t(\"compare.onSide\", { label: sideLabel(a.side) })}\n </span>\n </span>\n </button>\n </li>\n ))}\n </ol>\n </section>\n )}\n\n <AnimatePresence initial={false}>\n {unlocked && !finished && question && (\n <motion.div\n key=\"question\"\n initial={reduced ? false : { opacity: 0, y: 12 }}\n animate={{ opacity: 1, y: 0 }}\n exit={reduced ? { opacity: 0 } : { opacity: 0, y: -6 }}\n transition={{ duration: reduced ? 0 : 0.28, ease: [0.2, 0.8, 0.2, 1] }}\n >\n <QuestionBlock\n moduleId={config.id}\n question={question}\n onAttempt={(n, ev, selected) => {\n setAttempts(n);\n life.attempt();\n life.emit(\"module:answer\", { selected, correct: ev.correct, attempts: n });\n announce(ev.correct ? t(\"a11y.correctAnswer\") : t(\"a11y.incorrectAnswer\"));\n }}\n onFinish={(n) => complete({ score: attemptScore(n), attempts: n })}\n />\n </motion.div>\n )}\n </AnimatePresence>\n\n {unlocked && !finished && !question && !behavior.requireExplore && (\n <div className=\"nb-module__actions\">\n <Button variant=\"primary\" onClick={() => complete({})}>\n {t(\"common.finish\")}\n </Button>\n </div>\n )}\n\n {finished && (\n <CompletionCard\n score={score}\n title={score === undefined ? t(\"compare.explored\") : undefined}\n text={config.feedback.complete ?? takeaway}\n stats={[\n ...(annotations.length > 0\n ? [{ label: t(\"compare.notesStat\"), value: `${opened.length}/${annotations.length}` }]\n : []),\n ...(question ? [{ label: t(\"common.attempts\"), value: attempts }] : []),\n ]}\n retryLabel={t(\"common.restart\")}\n onRetry={restart}\n />\n )}\n </ModuleShell>\n );\n}\n\nfunction ProgressStep({\n done,\n label,\n t,\n}: {\n done: boolean;\n label: string;\n t: ReturnType<typeof useNibblearn>[\"t\"];\n}) {\n return (\n <span className=\"nb-cmp__step\" data-done={done ? \"true\" : undefined}>\n <span className=\"nb-cmp__step-icon\" aria-hidden>\n {done && <Check strokeWidth={3} />}\n </span>\n <span aria-hidden>{label}</span>\n <span className=\"nb-sr-only\">\n {done ? t(\"compare.seenFull\", { label }) : t(\"compare.notSeen\", { label })}\n </span>\n </span>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Knowledge check\n * -------------------------------------------------------------------------- */\n\ninterface QuestionBlockProps {\n moduleId: string;\n question: NonNullable<ImageCompareConfig[\"content\"][\"question\"]>;\n onAttempt: (attempts: number, evaluation: ChoiceEvaluation, selected: string[]) => void;\n onFinish: (attempts: number) => void;\n}\n\nfunction QuestionBlock({ moduleId, question, onAttempt, onFinish }: QuestionBlockProps) {\n const { t } = useNibblearn();\n const options = useMemo(\n () => question.options.map((o, i) => ({ ...o, id: o.id ?? `opt${i}` })),\n [question.options],\n );\n const multiple = options.filter((o) => o.correct).length > 1;\n const [selected, setSelected] = useState<string[]>([]);\n const [eliminated, setEliminated] = useState<string[]>([]);\n const [evaluation, setEvaluation] = useState<ChoiceEvaluation | null>(null);\n const [attempts, setAttempts] = useState(0);\n const solved = evaluation?.correct ?? false;\n\n const toggle = (id: string) => {\n if (evaluation || eliminated.includes(id)) return;\n setSelected((prev) =>\n multiple ? (prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]) : [id],\n );\n };\n\n const check = () => {\n if (!selected.length || evaluation) return;\n const ev = evaluateChoice(options, selected, { partialCredit: false });\n const n = attempts + 1;\n setAttempts(n);\n setEvaluation(ev);\n onAttempt(n, ev, selected);\n };\n\n const retry = () => {\n if (!evaluation) return;\n setEliminated((prev) => [...new Set([...prev, ...evaluation.wrongIds])]);\n setSelected([]);\n setEvaluation(null);\n };\n\n const stateFor = (id: string, correct: boolean): OptionState => {\n if (eliminated.includes(id)) return \"incorrect\";\n if (solved) return correct ? \"correct\" : \"idle\";\n if (evaluation && selected.includes(id)) return correct ? \"correct\" : \"incorrect\";\n return selected.includes(id) ? \"selected\" : \"idle\";\n };\n\n const promptId = `${moduleId}-question`;\n return (\n <div className=\"nb-cmp__question\">\n <div>\n <div className=\"nb-cmp__question-eyebrow\">{t(\"compare.question\")}</div>\n <h3 className=\"nb-cmp__question-prompt\" id={promptId}>\n <RichText text={question.prompt} />\n </h3>\n <p className=\"nb-cmp__question-mode\">\n {multiple ? t(\"choice.selectMany\") : t(\"choice.selectOne\")}\n </p>\n </div>\n <div\n className=\"nb-cmp__options\"\n role={multiple ? \"group\" : \"radiogroup\"}\n aria-labelledby={promptId}\n >\n {options.map((o, i) => {\n const state = stateFor(o.id, o.correct);\n const showExplanation =\n solved || eliminated.includes(o.id) || (evaluation !== null && selected.includes(o.id));\n return (\n <OptionCard\n key={o.id}\n text={o.text}\n shortcut={LETTERS[i]}\n multiple={multiple}\n state={state}\n explanation={showExplanation ? o.explanation : undefined}\n disabled={solved || evaluation !== null || eliminated.includes(o.id)}\n onClick={() => toggle(o.id)}\n />\n );\n })}\n </div>\n\n <AnimatedFeedback\n show={evaluation !== null}\n tone={solved ? \"correct\" : \"incorrect\"}\n title={solved ? t(\"common.correct\") : t(\"common.incorrect\")}\n text={solved ? undefined : t(\"common.tryAgainLater\")}\n />\n {solved && <Explanation text={question.explanation} />}\n\n <div className=\"nb-module__actions\">\n {!evaluation && (\n <Button variant=\"primary\" onClick={check} disabled={!selected.length}>\n {t(\"common.check\")}\n </Button>\n )}\n {evaluation && !solved && (\n <Button variant=\"secondary\" onClick={retry} autoFocus>\n {t(\"common.retry\")}\n </Button>\n )}\n {solved && (\n <Button variant=\"primary\" onClick={() => onFinish(attempts)} autoFocus>\n {t(\"common.finish\")}\n </Button>\n )}\n </div>\n </div>\n );\n}\n\nexport default ImageCompare;\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n} from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { ArrowRight, Check, Eye, X } from \"lucide-react\";\nimport clsx from \"clsx\";\nimport {\n DndContext,\n DragOverlay,\n KeyboardSensor,\n PointerSensor,\n TouchSensor,\n closestCenter,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragStartEvent,\n} from \"@dnd-kit/core\";\nimport {\n SortableContext,\n arrayMove,\n rectSortingStrategy,\n sortableKeyboardCoordinates,\n useSortable,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport {\n buildWordTiles,\n evaluateWordOrder,\n isOperatorToken,\n scoreWordItem,\n wordBuilderSchema,\n type WordBuilderConfig,\n type WordBuilderItem,\n type WordOrderEvaluation,\n type WordTile,\n seedFromString,\n} from \"@nibblearn/core\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Button } from \"../../primitives/Button\";\nimport { ProgressBar } from \"../../primitives/ProgressBar\";\nimport { AnimatedFeedback } from \"../../primitives/Feedback\";\nimport { Explanation } from \"../../primitives/Explanation\";\nimport { Hint } from \"../../primitives/Hint\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./word-builder.css\";\n\nexport type WordBuilderProps = ModuleProps<WordBuilderConfig>;\n\ntype Translator = ReturnType<typeof useNibblearn>[\"t\"];\ntype Display = WordBuilderItem[\"display\"];\ntype TileState = \"idle\" | \"correct\" | \"incorrect\";\n\ninterface ItemRecord {\n id?: string;\n correct: boolean;\n revealed: boolean;\n attempts: number;\n score: number;\n /** Placed tokens at the last check. */\n placed: string[];\n}\n\nexport function WordBuilder({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: WordBuilderProps) {\n const parsed = useMemo(() => wordBuilderSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"word-builder\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <WordBuilderInner\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\n/** Owns the lifecycle; every reset remounts WordBuilderRun with fresh state (keyed by runId). */\nfunction WordBuilderInner(props: WordBuilderProps) {\n const { config, onComplete, onEvent, resetKey } = props;\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"word-builder\",\n onComplete,\n onEvent,\n resetKey,\n });\n return <WordBuilderRun key={life.runId} {...props} life={life} />;\n}\n\n/* ----------------------------------------------------------------------------\n * Token rendering (shared by tiles, the solution line and the summary)\n * -------------------------------------------------------------------------- */\n\nfunction tokenKind(display: Display, text: string): \"operator\" | \"word\" {\n return display === \"formula\" && isOperatorToken(text) ? \"operator\" : \"word\";\n}\n\nfunction AnswerLine({ tokens, display }: { tokens: readonly string[]; display: Display }) {\n if (display === \"sentence\") {\n return <span className=\"nb-word__line\">{tokens.join(\" \")}</span>;\n }\n return (\n <span className=\"nb-word__line\" data-display=\"formula\">\n {tokens.map((tok, i) => (\n <span key={i} className=\"nb-word__line-token\" data-kind={tokenKind(display, tok)}>\n {tok}\n </span>\n ))}\n </span>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * A placed tile: sortable, tap to send back\n * -------------------------------------------------------------------------- */\n\ninterface PlacedTileProps {\n tile: WordTile;\n index: number;\n display: Display;\n state: TileState;\n interactive: boolean;\n layoutId?: string;\n layoutDependency: string;\n reduced: boolean;\n onActivate: (id: string) => void;\n setRef: (id: string, el: HTMLButtonElement | null) => void;\n t: Translator;\n}\n\nfunction PlacedTile({\n tile,\n index,\n display,\n state,\n interactive,\n layoutId,\n layoutDependency,\n reduced,\n onActivate,\n setRef,\n t,\n}: PlacedTileProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n setActivatorNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: tile.id, disabled: !interactive });\n const style: CSSProperties = {\n transform: CSS.Translate.toString(transform),\n transition: reduced ? undefined : transition,\n };\n const label = t(\"word.placedTile\", { word: tile.text, position: index + 1 });\n const stateLabel =\n state === \"correct\" ? t(\"common.correct\") : state === \"incorrect\" ? t(\"common.incorrect\") : \"\";\n return (\n <li\n ref={setNodeRef}\n style={style}\n className=\"nb-word__slot\"\n data-dragging={isDragging ? \"true\" : undefined}\n >\n <motion.span\n className=\"nb-word__fly\"\n layoutId={layoutId}\n layoutDependency={layoutDependency}\n transition={{ type: \"spring\", stiffness: 520, damping: 38 }}\n >\n <button\n ref={(el) => {\n setActivatorNodeRef(el);\n setRef(tile.id, el);\n }}\n type=\"button\"\n className=\"nb-word__tile\"\n data-state={state}\n data-kind={tokenKind(display, tile.text)}\n data-display={display}\n aria-label={stateLabel ? `${label}, ${stateLabel}` : label}\n aria-describedby={interactive ? attributes[\"aria-describedby\"] : undefined}\n aria-disabled={!interactive || undefined}\n onClick={() => {\n if (interactive) onActivate(tile.id);\n }}\n {...(interactive ? listeners : {})}\n >\n <span className=\"nb-word__text\">{tile.text}</span>\n {state !== \"idle\" && (\n <span className=\"nb-word__mark\" aria-hidden>\n {state === \"correct\" ? <Check strokeWidth={3} /> : <X strokeWidth={3} />}\n </span>\n )}\n </button>\n </motion.span>\n </li>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * One item (keyed by index: fresh state per item)\n * -------------------------------------------------------------------------- */\n\ninterface ItemViewProps {\n moduleId: string;\n runId: number;\n item: WordBuilderItem;\n index: number;\n isLast: boolean;\n seed: number;\n behavior: WordBuilderConfig[\"behavior\"];\n feedback: WordBuilderConfig[\"feedback\"];\n focusOnMount: boolean;\n announce: (text: string) => void;\n life: ModuleLifecycle;\n onResolve: (record: ItemRecord) => void;\n onNext: () => void;\n}\n\nfunction ItemView({\n moduleId,\n runId,\n item,\n index,\n isLast,\n seed,\n behavior,\n feedback,\n focusOnMount,\n announce,\n life,\n onResolve,\n onNext,\n}: ItemViewProps) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const display = item.display;\n const tiles = useMemo(() => buildWordTiles(item, seed), [item, seed]);\n const tileById = useMemo(() => new Map(tiles.map((tile) => [tile.id, tile])), [tiles]);\n\n const [placed, setPlaced] = useState<string[]>([]);\n const [evaluation, setEvaluation] = useState<WordOrderEvaluation | null>(null);\n const [attempts, setAttempts] = useState(0);\n const [locked, setLocked] = useState(false);\n const [activeId, setActiveId] = useState<string | null>(null);\n\n const bankRefs = useRef(new Map<string, HTMLButtonElement>());\n const placedRefs = useRef(new Map<string, HTMLButtonElement>());\n const checkRef = useRef<HTMLButtonElement>(null);\n /** Clicks that follow a drag (pointer or keyboard) must not send the tile back. */\n const suppressClickUntil = useRef(0);\n\n const checked = evaluation !== null;\n const editable = !checked && !locked;\n const placedSet = useMemo(() => new Set(placed), [placed]);\n const placedTexts = useMemo(\n () => placed.map((id) => tileById.get(id)?.text ?? \"\"),\n [placed, tileById],\n );\n const exhausted = behavior.maxAttempts > 0 && attempts >= behavior.maxAttempts;\n const canRetry = checked && !locked && behavior.allowRetry && !exhausted;\n const canReveal = canRetry && attempts >= 2;\n const layoutDependency = `${placed.join(\",\")}|${locked ? 1 : 0}`;\n const layoutKey = (id: string) => (reduced ? undefined : `${moduleId}-${runId}-${index}-${id}`);\n\n useEffect(() => {\n if (!focusOnMount) return;\n const first = tiles.find((tile) => bankRefs.current.has(tile.id));\n if (first) bankRefs.current.get(first.id)?.focus();\n }, [focusOnMount, tiles]);\n\n const setBankRef = useCallback((id: string, el: HTMLButtonElement | null) => {\n if (el) bankRefs.current.set(id, el);\n else bankRefs.current.delete(id);\n }, []);\n const setPlacedRef = useCallback((id: string, el: HTMLButtonElement | null) => {\n if (el) placedRefs.current.set(id, el);\n else placedRefs.current.delete(id);\n }, []);\n\n const focusLater = useCallback((get: () => HTMLElement | null | undefined) => {\n requestAnimationFrame(() => get()?.focus());\n }, []);\n\n const add = useCallback(\n (id: string) => {\n if (!editable || placedSet.has(id)) return;\n const tile = tileById.get(id);\n if (!tile) return;\n const next = [...placed, id];\n setPlaced(next);\n life.emit(\"module:interact\", {\n itemIndex: index,\n action: \"add\",\n token: tile.text,\n position: next.length,\n });\n announce(t(\"word.added\", { word: tile.text, position: next.length }));\n // Keep keyboard focus in the bank: the next free tile after this one, else Check.\n const start = tiles.findIndex((x) => x.id === id);\n const rotated = [...tiles.slice(start + 1), ...tiles.slice(0, start)];\n const nextFree = rotated.find((x) => !next.includes(x.id));\n focusLater(() =>\n nextFree ? bankRefs.current.get(nextFree.id) : (checkRef.current ?? undefined),\n );\n },\n [editable, placedSet, tileById, placed, life, index, announce, t, tiles, focusLater],\n );\n\n const remove = useCallback(\n (id: string, moveFocus: boolean) => {\n if (!editable) return;\n const at = placed.indexOf(id);\n if (at < 0) return;\n const tile = tileById.get(id);\n const next = placed.filter((x) => x !== id);\n setPlaced(next);\n life.emit(\"module:interact\", {\n itemIndex: index,\n action: \"remove\",\n token: tile?.text,\n position: at + 1,\n });\n announce(t(\"word.removed\", { word: tile?.text ?? \"\" }));\n if (moveFocus) {\n const neighbour = next[at] ?? next[at - 1];\n focusLater(() =>\n neighbour ? placedRefs.current.get(neighbour) : bankRefs.current.get(id),\n );\n }\n },\n [editable, placed, tileById, life, index, announce, t, focusLater],\n );\n\n const onPlacedActivate = useCallback(\n (id: string) => {\n if (Date.now() < suppressClickUntil.current) return;\n remove(id, true);\n },\n [remove],\n );\n\n const onKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLDivElement>) => {\n if (e.key !== \"Backspace\" || activeId || !editable || placed.length === 0) return;\n const target = e.target as HTMLElement | null;\n if (target?.closest(\"input, textarea, [contenteditable='true']\")) return;\n e.preventDefault();\n const last = placed[placed.length - 1]!;\n const focusedPlaced = target ? placedRefs.current.get(last) === target : false;\n remove(last, focusedPlaced);\n },\n [activeId, editable, placed, remove],\n );\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n useSensor(TouchSensor, { activationConstraint: { delay: 150, tolerance: 6 } }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n // Enter sends the tile back (a click); Space picks it up to reorder.\n keyboardCodes: { start: [\"Space\"], cancel: [\"Escape\"], end: [\"Space\", \"Enter\"] },\n }),\n );\n\n const onDragStart = useCallback((e: DragStartEvent) => {\n suppressClickUntil.current = Number.POSITIVE_INFINITY;\n setActiveId(String(e.active.id));\n }, []);\n const endDrag = useCallback(() => {\n suppressClickUntil.current = Date.now() + 400;\n setActiveId(null);\n }, []);\n const onDragEnd = useCallback(\n (e: DragEndEvent) => {\n endDrag();\n const { active, over } = e;\n if (!over || active.id === over.id) return;\n const from = placed.indexOf(String(active.id));\n const to = placed.indexOf(String(over.id));\n if (from < 0 || to < 0) return;\n setPlaced((prev) => arrayMove(prev, from, to));\n const token = tileById.get(String(active.id))?.text ?? \"\";\n life.emit(\"module:interact\", { itemIndex: index, action: \"move\", token, from, to });\n announce(t(\"a11y.movedTo\", { item: token, position: to + 1 }));\n },\n [endDrag, placed, tileById, life, index, announce, t],\n );\n\n const check = useCallback(() => {\n if (!editable || placed.length === 0) return;\n const ev = evaluateWordOrder(item, placedTexts);\n const n = attempts + 1;\n setAttempts(n);\n life.attempt();\n setEvaluation(ev);\n const out = behavior.maxAttempts > 0 && n >= behavior.maxAttempts;\n const done = ev.correct || !behavior.allowRetry || out;\n life.emit(\"module:answer\", {\n itemIndex: index,\n placed: placedTexts,\n correct: ev.correct,\n correctCount: ev.correctCount,\n attempts: n,\n });\n announce(\n ev.correct\n ? `${t(\"a11y.correctAnswer\")} ${t(\"word.allCorrect\")}`\n : `${t(\"a11y.incorrectAnswer\")} ${t(\"word.positionsCorrect\", {\n correct: ev.correctCount,\n total: item.tokens.length,\n })}${done ? ` ${t(\"word.correctAnswer\")}: ${item.tokens.join(\" \")}` : \"\"}`,\n );\n if (done) {\n setLocked(true);\n onResolve({\n ...(item.id ? { id: item.id } : {}),\n correct: ev.correct,\n revealed: false,\n attempts: n,\n score: Number(\n scoreWordItem({ correct: ev.correct, attempts: n, lastScore: ev.score }).toFixed(4),\n ),\n placed: placedTexts,\n });\n }\n }, [\n editable,\n placed,\n item,\n placedTexts,\n attempts,\n life,\n behavior,\n index,\n announce,\n t,\n onResolve,\n ]);\n\n const retry = useCallback(() => {\n if (!evaluation) return;\n const keep = placed.slice(0, evaluation.prefix);\n setPlaced(keep);\n setEvaluation(null);\n life.emit(\"module:interact\", { itemIndex: index, action: \"retry\", kept: keep.length });\n announce(t(\"word.cleared\"));\n const firstFree = tiles.find((tile) => !keep.includes(tile.id));\n focusLater(() => (firstFree ? bankRefs.current.get(firstFree.id) : checkRef.current));\n }, [evaluation, placed, life, index, announce, t, tiles, focusLater]);\n\n const reveal = useCallback(() => {\n if (!evaluation) return;\n setLocked(true);\n life.emit(\"module:interact\", { itemIndex: index, action: \"reveal\" });\n announce(`${t(\"word.correctAnswer\")}: ${item.tokens.join(\" \")}`);\n onResolve({\n ...(item.id ? { id: item.id } : {}),\n correct: false,\n revealed: true,\n attempts,\n score: Number(\n scoreWordItem({ correct: false, attempts, lastScore: evaluation.score }).toFixed(4),\n ),\n placed: placedTexts,\n });\n }, [evaluation, life, index, announce, t, item, attempts, placedTexts, onResolve]);\n\n const tileState = (i: number): TileState => {\n if (!evaluation) return \"idle\";\n return evaluation.positions[i] ? \"correct\" : \"incorrect\";\n };\n\n const activeTile = activeId ? tileById.get(activeId) : undefined;\n const solved = locked && evaluation?.correct === true;\n const answerId = `${moduleId}-w${index}-answer`;\n\n return (\n <div className=\"nb-word__item\" onKeyDown={onKeyDown}>\n <h3 className=\"nb-word__prompt\">\n <RichText text={item.prompt} />\n </h3>\n\n <div\n className=\"nb-word__answer-wrap\"\n data-state={solved ? \"solved\" : checked ? \"checked\" : undefined}\n >\n <span id={answerId} className=\"nb-sr-only\">\n {t(\"word.answer\")}\n </span>\n <DndContext\n id={`${moduleId}-w${index}-dnd`}\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragCancel={endDrag}\n accessibility={{\n screenReaderInstructions: { draggable: t(\"word.dragInstructions\") },\n announcements: {\n onDragStart: ({ active }) =>\n t(\"a11y.pickedUp\", { item: tileById.get(String(active.id))?.text ?? \"\" }),\n onDragOver: ({ active, over }) =>\n over\n ? t(\"a11y.movedTo\", {\n item: tileById.get(String(active.id))?.text ?? \"\",\n position: placed.indexOf(String(over.id)) + 1,\n })\n : undefined,\n onDragEnd: ({ active, over }) =>\n over\n ? t(\"a11y.movedTo\", {\n item: tileById.get(String(active.id))?.text ?? \"\",\n position: placed.indexOf(String(over.id)) + 1,\n })\n : undefined,\n onDragCancel: ({ active }) =>\n t(\"a11y.dropCancelled\", { item: tileById.get(String(active.id))?.text ?? \"\" }),\n },\n }}\n >\n <SortableContext items={placed} strategy={rectSortingStrategy} disabled={!editable}>\n <ol className=\"nb-word__answer\" aria-labelledby={answerId} data-display={display}>\n {placed.map((id, i) => {\n const tile = tileById.get(id);\n if (!tile) return null;\n return (\n <PlacedTile\n key={id}\n tile={tile}\n index={i}\n display={display}\n state={tileState(i)}\n interactive={editable}\n layoutId={layoutKey(id)}\n layoutDependency={layoutDependency}\n reduced={reduced}\n onActivate={onPlacedActivate}\n setRef={setPlacedRef}\n t={t}\n />\n );\n })}\n </ol>\n </SortableContext>\n <DragOverlay dropAnimation={reduced ? null : undefined}>\n {activeTile ? (\n <span\n className=\"nb-word__tile nb-word__tile--overlay\"\n data-kind={tokenKind(display, activeTile.text)}\n data-display={display}\n >\n <span className=\"nb-word__text\">{activeTile.text}</span>\n </span>\n ) : null}\n </DragOverlay>\n </DndContext>\n {placed.length === 0 && (\n <span className=\"nb-word__empty\" aria-hidden>\n {t(\"word.empty\")}\n </span>\n )}\n </div>\n\n {!locked && (\n <div className=\"nb-word__bank\" role=\"group\" aria-label={t(\"word.bank\")}>\n {tiles.map((tile) => {\n const used = placedSet.has(tile.id);\n return (\n <span key={tile.id} className=\"nb-word__cell\">\n {used ? (\n <span\n className=\"nb-word__tile nb-word__tile--ghost\"\n data-display={display}\n data-kind={tokenKind(display, tile.text)}\n aria-hidden\n >\n <span className=\"nb-word__text\">{tile.text}</span>\n </span>\n ) : (\n <motion.span\n className=\"nb-word__fly\"\n layoutId={layoutKey(tile.id)}\n transition={{ type: \"spring\", stiffness: 520, damping: 38 }}\n >\n <button\n ref={(el) => setBankRef(tile.id, el)}\n type=\"button\"\n className=\"nb-word__tile\"\n data-kind={tokenKind(display, tile.text)}\n data-display={display}\n disabled={!editable}\n onClick={() => add(tile.id)}\n >\n <span className=\"nb-word__text\">{tile.text}</span>\n </button>\n </motion.span>\n )}\n </span>\n );\n })}\n </div>\n )}\n\n {!locked && (\n <Hint text={item.hint} onReveal={() => life.emit(\"module:hint\", { itemIndex: index })} />\n )}\n\n <AnimatedFeedback\n show={checked}\n tone={\n evaluation?.correct\n ? \"correct\"\n : evaluation && evaluation.correctCount > 0\n ? \"partial\"\n : \"incorrect\"\n }\n title={evaluation?.correct ? t(\"word.allCorrect\") : t(\"common.incorrect\")}\n text={\n evaluation\n ? evaluation.correct\n ? (feedback.correct ?? undefined)\n : (feedback.incorrect ??\n t(\"word.positionsCorrect\", {\n correct: evaluation.correctCount,\n total: item.tokens.length,\n }))\n : undefined\n }\n />\n\n <AnimatePresence initial={false}>\n {locked && !solved && (\n <motion.div\n key=\"solution\"\n className=\"nb-word__solution\"\n role=\"group\"\n aria-label={t(\"word.correctAnswer\")}\n initial={reduced ? false : { opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: reduced ? 0 : 0.24, ease: [0.2, 0.8, 0.2, 1] }}\n >\n <span className=\"nb-word__solution-label\">\n <Eye aria-hidden />\n {t(\"word.correctAnswer\")}\n </span>\n <AnswerLine tokens={item.tokens} display={display} />\n </motion.div>\n )}\n </AnimatePresence>\n\n {locked && behavior.showExplanation && <Explanation text={item.explanation} />}\n\n <div className=\"nb-word__footer\">\n {editable ? (\n <span className=\"nb-word__kbd nb-muted\">{t(\"word.keyboardHint\")}</span>\n ) : (\n <span />\n )}\n <div className=\"nb-module__actions\">\n {canReveal && (\n <Button variant=\"ghost\" onClick={reveal} leading={<Eye aria-hidden />}>\n {t(\"common.showAnswer\")}\n </Button>\n )}\n {locked ? (\n <Button\n key=\"next\"\n variant=\"primary\"\n onClick={onNext}\n trailing={<ArrowRight aria-hidden />}\n autoFocus\n >\n {isLast ? t(\"common.finish\") : t(\"common.next\")}\n </Button>\n ) : canRetry ? (\n <Button key=\"retry\" variant=\"primary\" onClick={retry} autoFocus>\n {t(\"common.retry\")}\n </Button>\n ) : (\n <Button\n key=\"check\"\n ref={checkRef}\n variant=\"primary\"\n onClick={check}\n disabled={!editable || placed.length === 0}\n >\n {t(\"common.check\")}\n </Button>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Module\n * -------------------------------------------------------------------------- */\n\nfunction WordBuilderRun({\n life,\n config,\n hideHeader,\n className,\n}: WordBuilderProps & { life: ModuleLifecycle }) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { items } = config.content;\n const { behavior } = config;\n const total = items.length;\n\n const [seed] = useState(() => behavior.shuffleSeed ?? seedFromString(config.id, life.runId));\n const [index, setIndex] = useState(0);\n const [records, setRecords] = useState<ItemRecord[]>([]);\n const [finished, setFinished] = useState(false);\n const item = items[index]!;\n const resolved = records.length > index;\n\n const onResolve = useCallback(\n (record: ItemRecord) => setRecords((prev) => [...prev.slice(0, index), record]),\n [index],\n );\n\n const onNext = useCallback(() => {\n if (!resolved) return;\n if (index + 1 >= total) {\n const correct = records.filter((r) => r.correct).length;\n const score = records.reduce((s, r) => s + r.score, 0) / total;\n setFinished(true);\n life.complete({ score, correct, total, details: { items: records } });\n announce(t(\"a11y.moduleComplete\"));\n return;\n }\n setIndex(index + 1);\n }, [resolved, index, total, records, life, announce, t]);\n\n const retryAll = useCallback(() => {\n life.reset();\n life.emit(\"module:reset\");\n }, [life]);\n\n const multi = behavior.showCounter && total > 1;\n\n if (finished) {\n const correct = records.filter((r) => r.correct).length;\n const firstTry = records.filter((r) => r.correct && r.attempts === 1).length;\n const score = records.reduce((s, r) => s + r.score, 0) / total;\n return (\n <ModuleShell\n type=\"word-builder\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n appearance={config.appearance}\n className={className}\n announcement={message}\n >\n <CompletionCard\n score={score}\n passThreshold={Math.max(config.scoring.passThreshold, 0.7)}\n text={config.feedback.complete ?? t(\"word.summary\", { correct, total })}\n stats={[\n { label: t(\"common.correct\"), value: `${correct}/${total}` },\n { label: t(\"word.firstTry\"), value: firstTry },\n ]}\n onRetry={retryAll}\n >\n <ul className=\"nb-word__summary\">\n {items.map((it, i) => {\n const r = records[i];\n if (!r) return null;\n return (\n <li\n key={i}\n className=\"nb-word__summary-item\"\n data-state={r.correct ? \"correct\" : \"incorrect\"}\n >\n <span\n className=\"nb-word__summary-icon\"\n role=\"img\"\n aria-label={r.correct ? t(\"common.correct\") : t(\"common.incorrect\")}\n >\n {r.correct ? <Check strokeWidth={3} /> : <X strokeWidth={3} />}\n </span>\n <span className=\"nb-word__summary-body\">\n <span className=\"nb-word__summary-prompt\">\n <RichText text={it.prompt} />\n </span>\n <AnswerLine tokens={it.tokens} display={it.display} />\n {!r.correct && r.placed.length > 0 && (\n <span className=\"nb-word__summary-meta\">\n {t(\"word.yourAnswer\", { answer: r.placed.join(\" \") })}\n </span>\n )}\n </span>\n </li>\n );\n })}\n </ul>\n </CompletionCard>\n </ModuleShell>\n );\n }\n\n return (\n <ModuleShell\n type=\"word-builder\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : (config.instructions ?? t(\"word.instructions\"))}\n appearance={config.appearance}\n className={className}\n announcement={message}\n aside={\n multi ? (\n <span className=\"nb-counter\">{t(\"word.item\", { current: index + 1, total })}</span>\n ) : undefined\n }\n eyebrow={\n multi ? (\n <ProgressBar value={(index + (resolved ? 1 : 0)) / total} showLabel={false} size=\"sm\" />\n ) : undefined\n }\n >\n <AnimatePresence mode=\"wait\" initial={false}>\n <motion.div\n key={`${life.runId}-${index}`}\n className={clsx(\"nb-word\")}\n initial={reduced ? false : { opacity: 0, x: 24 }}\n animate={{ opacity: 1, x: 0 }}\n exit={reduced ? { opacity: 0 } : { opacity: 0, x: -24 }}\n transition={{ duration: reduced ? 0 : 0.24, ease: [0.2, 0.8, 0.2, 1] }}\n >\n <ItemView\n moduleId={config.id}\n runId={life.runId}\n item={item}\n index={index}\n isLast={index + 1 >= total}\n seed={seed + index * 977}\n behavior={behavior}\n feedback={config.feedback}\n focusOnMount={index > 0}\n announce={announce}\n life={life}\n onResolve={onResolve}\n onNext={onNext}\n />\n </motion.div>\n </AnimatePresence>\n </ModuleShell>\n );\n}\n\nexport default WordBuilder;\n","import { useCallback, useMemo, useState, type CSSProperties } from \"react\";\nimport { LayoutGroup, motion } from \"motion/react\";\nimport { Check, CornerUpLeft, Eye, X } from \"lucide-react\";\nimport {\n DndContext,\n DragOverlay,\n PointerSensor,\n TouchSensor,\n useDraggable,\n useDroppable,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragStartEvent,\n} from \"@dnd-kit/core\";\nimport {\n evaluatePriorityMatrix,\n priorityMatrixSchema,\n priorityMatrixScore,\n quadrantCell,\n shuffle,\n sortQuadrants,\n type MatrixAxis,\n type MatrixItem,\n type MatrixQuadrant,\n type PriorityMatrixConfig,\n type PriorityMatrixEvaluation,\n seedFromString,\n} from \"@nibblearn/core\";\nimport clsx from \"clsx\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Button } from \"../../primitives/Button\";\nimport { AnimatedFeedback } from \"../../primitives/Feedback\";\nimport { Explanation } from \"../../primitives/Explanation\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./priority-matrix.css\";\n\nexport type PriorityMatrixProps = ModuleProps<PriorityMatrixConfig>;\n\ntype Translator = ReturnType<typeof useNibblearn>[\"t\"];\ntype ChipState = \"idle\" | \"selected\" | \"correct\" | \"incorrect\" | \"locked\" | \"revealed\";\ntype Assignments = Record<string, string | undefined>;\n\nconst TRAY_ID = \"__tray\";\nconst COLOR_TOKENS: Record<string, string> = {\n accent: \"var(--nb-accent)\",\n lime: \"var(--nb-highlight, var(--nb-lime, #f59e0b))\",\n highlight: \"var(--nb-highlight, var(--nb-lime, #f59e0b))\",\n pink: \"var(--nb-pink, var(--nb-danger))\",\n sky: \"var(--nb-sky, var(--nb-info))\",\n violet: \"var(--nb-violet, var(--nb-accent))\",\n success: \"var(--nb-success)\",\n info: \"var(--nb-info)\",\n warning: \"var(--nb-warning)\",\n danger: \"var(--nb-danger)\",\n};\nconst DEFAULT_COLOR: Record<MatrixQuadrant[\"position\"], string> = {\n \"top-left\": \"accent\",\n \"top-right\": \"pink\",\n \"bottom-left\": \"violet\",\n \"bottom-right\": \"sky\",\n};\n\nfunction quadrantStyle(q: MatrixQuadrant): CSSProperties {\n const color = q.color ?? DEFAULT_COLOR[q.position];\n const cell = quadrantCell(q.position);\n return {\n \"--_q\":\n (Object.prototype.hasOwnProperty.call(COLOR_TOKENS, color)\n ? COLOR_TOKENS[color]\n : undefined) ?? color,\n gridRow: cell.row,\n gridColumn: cell.column,\n } as CSSProperties;\n}\n\nexport function PriorityMatrix({\n config: rawConfig,\n onComplete,\n onEvent,\n resetKey,\n hideHeader,\n className,\n}: PriorityMatrixProps) {\n const parsed = useMemo(() => priorityMatrixSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"priority-matrix\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return (\n <PriorityMatrixInner\n config={parsed.data}\n onComplete={onComplete}\n onEvent={onEvent}\n resetKey={resetKey}\n hideHeader={hideHeader}\n className={className}\n />\n );\n}\n\n/** Owns the lifecycle; every reset remounts PriorityMatrixRun with fresh state (keyed by runId). */\nfunction PriorityMatrixInner(props: PriorityMatrixProps) {\n const { config, onComplete, onEvent, resetKey } = props;\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"priority-matrix\",\n onComplete,\n onEvent,\n resetKey,\n });\n return <PriorityMatrixRun key={life.runId} {...props} life={life} />;\n}\n\n/* ----------------------------------------------------------------------------\n * Axes\n * -------------------------------------------------------------------------- */\n\nfunction Axis({ axis, orientation }: { axis: MatrixAxis; orientation: \"x\" | \"y\" }) {\n return (\n <div className={`nb-matrix__axis nb-matrix__axis--${orientation}`} aria-hidden>\n <span className=\"nb-matrix__axis-end\">{axis.low}</span>\n <span className=\"nb-matrix__axis-line\" />\n <span className=\"nb-matrix__axis-name\">{axis.label}</span>\n <span className=\"nb-matrix__axis-line nb-matrix__axis-line--arrow\" />\n <span className=\"nb-matrix__axis-end\">{axis.high}</span>\n </div>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Chip\n * -------------------------------------------------------------------------- */\n\ninterface ChipProps {\n item: MatrixItem;\n state: ChipState;\n draggable: boolean;\n reduced: boolean;\n compact?: boolean;\n onSelect: () => void;\n}\n\nfunction Chip({ item, state, draggable, reduced, compact, onSelect }: ChipProps) {\n const { setNodeRef, listeners, attributes, isDragging } = useDraggable({\n id: item.id,\n disabled: !draggable,\n });\n const marked =\n state === \"correct\" || state === \"incorrect\" || state === \"revealed\" || state === \"locked\";\n return (\n <motion.div\n layoutId={reduced ? undefined : item.id}\n layout={!reduced}\n className=\"nb-matrix__chip-slot\"\n transition={{ type: \"spring\", stiffness: 420, damping: 32 }}\n >\n <button\n ref={setNodeRef}\n type=\"button\"\n className={clsx(\"nb-matrix__chip\", compact && \"nb-matrix__chip--placed\")}\n data-state={state}\n data-dragging={isDragging ? \"true\" : undefined}\n aria-pressed={draggable ? state === \"selected\" : undefined}\n aria-disabled={!draggable || undefined}\n aria-describedby={draggable ? attributes[\"aria-describedby\"] : undefined}\n onClick={(e) => {\n e.stopPropagation();\n onSelect();\n }}\n {...listeners}\n >\n <span className=\"nb-matrix__chip-text\">\n <RichText text={item.text} />\n </span>\n {marked && (\n <span className=\"nb-matrix__chip-mark\" aria-hidden>\n {state === \"incorrect\" ? (\n <X strokeWidth={3} />\n ) : state === \"revealed\" ? (\n <Eye />\n ) : (\n <Check strokeWidth={3} />\n )}\n </span>\n )}\n </button>\n </motion.div>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Tray\n * -------------------------------------------------------------------------- */\n\ninterface TrayProps {\n items: MatrixItem[];\n total: number;\n chipState: (id: string) => ChipState;\n isMovable: (id: string) => boolean;\n selectedItem?: MatrixItem;\n onSelect: (id: string) => void;\n onReturn: (id: string) => void;\n reduced: boolean;\n t: Translator;\n}\n\nfunction Tray({\n items,\n total,\n chipState,\n isMovable,\n selectedItem,\n onSelect,\n onReturn,\n reduced,\n t,\n}: TrayProps) {\n const { setNodeRef, isOver } = useDroppable({ id: TRAY_ID });\n const canReturn = selectedItem && !items.some((i) => i.id === selectedItem.id);\n return (\n <section\n ref={setNodeRef}\n className=\"nb-matrix__tray\"\n data-over={isOver ? \"true\" : undefined}\n data-empty={items.length === 0 ? \"true\" : undefined}\n aria-label={t(\"matrix.tray\")}\n >\n <div className=\"nb-matrix__tray-head\">\n <span className=\"nb-matrix__tray-label\">\n {t(\"matrix.tray\")}\n <span className=\"nb-matrix__count\" aria-hidden>\n {items.length}/{total}\n </span>\n </span>\n {canReturn && (\n <Button\n size=\"sm\"\n variant=\"soft\"\n leading={<CornerUpLeft aria-hidden />}\n onClick={() => onReturn(selectedItem.id)}\n >\n {t(\"matrix.returnToTray\")}\n </Button>\n )}\n </div>\n <div className=\"nb-matrix__chips\">\n {items.map((item) => (\n <Chip\n key={item.id}\n item={item}\n state={chipState(item.id)}\n draggable={isMovable(item.id)}\n reduced={reduced}\n onSelect={() => onSelect(item.id)}\n />\n ))}\n {items.length === 0 && <span className=\"nb-matrix__empty\">{t(\"matrix.trayEmpty\")}</span>}\n </div>\n </section>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Quadrant\n * -------------------------------------------------------------------------- */\n\ninterface QuadrantProps {\n moduleId: string;\n quadrant: MatrixQuadrant;\n axes: PriorityMatrixConfig[\"content\"][\"axes\"];\n items: MatrixItem[];\n chipState: (id: string) => ChipState;\n isMovable: (id: string) => boolean;\n selectedItem?: MatrixItem;\n showExplanation: boolean;\n quadrantById: Map<string, MatrixQuadrant>;\n onSelect: (id: string) => void;\n onPlace: (id: string) => void;\n reduced: boolean;\n t: Translator;\n}\n\nfunction Quadrant({\n moduleId,\n quadrant,\n axes,\n items,\n chipState,\n isMovable,\n selectedItem,\n showExplanation,\n quadrantById,\n onSelect,\n onPlace,\n reduced,\n t,\n}: QuadrantProps) {\n const { setNodeRef, isOver } = useDroppable({ id: quadrant.id });\n const canPlace = selectedItem && !items.some((i) => i.id === selectedItem.id);\n const cell = quadrantCell(quadrant.position);\n const posId = `${moduleId}-q-${quadrant.id}-pos`;\n const placeLabel = t(\"matrix.placeIn\", { quadrant: quadrant.label });\n return (\n <section\n ref={setNodeRef}\n className={clsx(\"nb-matrix__quadrant\", canPlace && \"nb-matrix__quadrant--target\")}\n style={quadrantStyle(quadrant)}\n data-position={quadrant.position}\n data-over={isOver ? \"true\" : undefined}\n aria-label={quadrant.label}\n aria-describedby={posId}\n onClick={canPlace ? () => onPlace(selectedItem.id) : undefined}\n >\n <span id={posId} className=\"nb-sr-only\">\n {t(\"matrix.cellPosition\", {\n yLabel: axes.y.label,\n y: cell.y === \"high\" ? axes.y.high : axes.y.low,\n xLabel: axes.x.label,\n x: cell.x === \"high\" ? axes.x.high : axes.x.low,\n })}\n </span>\n <header className=\"nb-matrix__q-head\">\n <span className=\"nb-matrix__q-label\">{quadrant.label}</span>\n {quadrant.description && (\n <span className=\"nb-matrix__q-desc\">\n <RichText text={quadrant.description} />\n </span>\n )}\n </header>\n <div className=\"nb-matrix__q-body\">\n {items.map((item) => {\n const state = chipState(item.id);\n const wrong = state === \"incorrect\" || state === \"revealed\";\n const belongs = wrong ? quadrantById.get(item.quadrantId) : undefined;\n return (\n <div key={item.id} className=\"nb-matrix__placed\">\n <Chip\n item={item}\n state={state}\n draggable={isMovable(item.id)}\n reduced={reduced}\n compact\n onSelect={() => onSelect(item.id)}\n />\n {state === \"incorrect\" && belongs && (\n <div className=\"nb-matrix__note\">\n <span className=\"nb-matrix__note-title\">\n {t(\"matrix.belongsIn\", { quadrant: belongs.label })}\n </span>\n {showExplanation && item.explanation && (\n <span className=\"nb-matrix__note-text\">\n <RichText text={item.explanation} />\n </span>\n )}\n </div>\n )}\n {(state === \"correct\" || state === \"revealed\") &&\n showExplanation &&\n item.explanation && (\n <div className=\"nb-matrix__note nb-matrix__note--ok\">\n <span className=\"nb-matrix__note-text\">\n <RichText text={item.explanation} />\n </span>\n </div>\n )}\n </div>\n );\n })}\n {items.length === 0 && !canPlace && (\n <span className=\"nb-matrix__drop\" aria-hidden>\n {t(\"matrix.dropHere\")}\n </span>\n )}\n {canPlace && (\n <Button\n size=\"sm\"\n variant=\"soft\"\n className=\"nb-matrix__place\"\n aria-label={placeLabel}\n onClick={(e) => {\n e.stopPropagation();\n onPlace(selectedItem.id);\n }}\n >\n {placeLabel}\n </Button>\n )}\n </div>\n </section>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Module\n * -------------------------------------------------------------------------- */\n\nfunction PriorityMatrixRun({\n life,\n config,\n hideHeader,\n className,\n}: PriorityMatrixProps & { life: ModuleLifecycle }) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message, announce } = useAnnounce();\n const { behavior } = config;\n const { axes, items } = config.content;\n const quadrants = useMemo(\n () => sortQuadrants(config.content.quadrants),\n [config.content.quadrants],\n );\n const total = items.length;\n const itemById = useMemo(() => new Map(items.map((i) => [i.id, i])), [items]);\n const quadrantById = useMemo(() => new Map(quadrants.map((q) => [q.id, q])), [quadrants]);\n\n const [seed] = useState(() => behavior.shuffleSeed ?? seedFromString(config.id, life.runId));\n const order = useMemo(\n () => (behavior.shuffle ? shuffle(items, seed) : items),\n [items, behavior.shuffle, seed],\n );\n\n const [assignments, setAssignments] = useState<Assignments>({});\n const [selected, setSelected] = useState<string | null>(null);\n const [evaluation, setEvaluation] = useState<PriorityMatrixEvaluation | null>(null);\n const [lockedIds, setLockedIds] = useState<string[]>([]);\n const [attempts, setAttempts] = useState(0);\n const [firstFraction, setFirstFraction] = useState<number | null>(null);\n const [revealed, setRevealed] = useState(false);\n const [finished, setFinished] = useState(false);\n const [activeId, setActiveId] = useState<string | null>(null);\n\n const checked = evaluation !== null;\n const locked = checked && (evaluation.correct || revealed);\n const exhausted = behavior.maxAttempts > 0 && attempts >= behavior.maxAttempts;\n const canRetry = checked && !locked && behavior.allowRetry && !exhausted;\n const canReveal = checked && !locked && (attempts >= 2 || exhausted || !behavior.allowRetry);\n const placedCount = items.filter((i) => assignments[i.id]).length;\n const itemsLeft = total - placedCount;\n const trayItems = order.filter((i) => !assignments[i.id]);\n const isMovable = useCallback(\n (id: string) => !checked && !lockedIds.includes(id),\n [checked, lockedIds],\n );\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n useSensor(TouchSensor, { activationConstraint: { delay: 120, tolerance: 8 } }),\n );\n\n const place = useCallback(\n (itemId: string, quadrantId: string | undefined) => {\n const item = itemById.get(itemId);\n if (!item || !isMovable(itemId)) return;\n setAssignments((prev) => ({ ...prev, [itemId]: quadrantId }));\n setSelected(null);\n life.emit(\"module:interact\", { itemId, quadrantId: quadrantId ?? null });\n const q = quadrantId ? quadrantById.get(quadrantId) : undefined;\n announce(\n q\n ? t(\"matrix.placed\", { item: item.text, quadrant: q.label })\n : t(\"matrix.returned\", { item: item.text }),\n );\n },\n [itemById, isMovable, life, quadrantById, announce, t],\n );\n\n const toggleSelect = useCallback(\n (itemId: string) => {\n if (!isMovable(itemId)) return;\n setSelected((prev) => (prev === itemId ? null : itemId));\n },\n [isMovable],\n );\n\n const onDragStart = useCallback((e: DragStartEvent) => {\n const id = String(e.active.id);\n setActiveId(id);\n setSelected(id);\n }, []);\n const onDragEnd = useCallback(\n (e: DragEndEvent) => {\n setActiveId(null);\n const itemId = String(e.active.id);\n if (!e.over) {\n setSelected(null);\n return;\n }\n const target = String(e.over.id);\n place(itemId, target === TRAY_ID ? undefined : target);\n },\n [place],\n );\n const onDragCancel = useCallback(() => {\n setActiveId(null);\n setSelected(null);\n }, []);\n\n const check = useCallback(() => {\n if (checked || itemsLeft > 0) return;\n const ev = evaluatePriorityMatrix(items, assignments);\n const n = attempts + 1;\n setAttempts(n);\n life.attempt();\n setEvaluation(ev);\n setSelected(null);\n if (firstFraction === null) setFirstFraction(ev.score);\n const willReveal =\n !ev.correct &&\n (!behavior.allowRetry || (behavior.maxAttempts > 0 && n >= behavior.maxAttempts));\n if (willReveal) {\n setRevealed(true);\n setAssignments(Object.fromEntries(items.map((i) => [i.id, i.quadrantId])));\n }\n life.emit(\"module:answer\", {\n assignments,\n correct: ev.correct,\n correctCount: ev.correctCount,\n attempts: n,\n });\n announce(\n ev.correct\n ? `${t(\"a11y.correctAnswer\")} ${t(\"matrix.allCorrect\")}`\n : `${t(\"a11y.incorrectAnswer\")} ${t(\"matrix.correctCount\", { correct: ev.correctCount, total })}`,\n );\n }, [\n checked,\n itemsLeft,\n items,\n assignments,\n attempts,\n life,\n firstFraction,\n behavior,\n announce,\n t,\n total,\n ]);\n\n const retry = useCallback(() => {\n if (!evaluation) return;\n setLockedIds(items.filter((i) => evaluation.items[i.id]).map((i) => i.id));\n setAssignments((prev) =>\n Object.fromEntries(items.map((i) => [i.id, evaluation.items[i.id] ? prev[i.id] : undefined])),\n );\n setEvaluation(null);\n life.emit(\"module:interact\", { action: \"retry\" });\n }, [evaluation, items, life]);\n\n const reveal = useCallback(() => {\n setRevealed(true);\n setAssignments(Object.fromEntries(items.map((i) => [i.id, i.quadrantId])));\n life.emit(\"module:interact\", { action: \"reveal\" });\n announce(t(\"matrix.expert\"));\n }, [items, life, announce, t]);\n\n const score = evaluation\n ? priorityMatrixScore({\n attempts,\n allCorrect: evaluation.correct,\n revealed,\n firstFraction: firstFraction ?? 0,\n })\n : 0;\n\n const finish = useCallback(() => {\n if (!evaluation) return;\n setFinished(true);\n life.complete({\n score,\n correct: evaluation.correctCount,\n total,\n details: { attempts, revealed, firstFraction, assignments },\n });\n announce(t(\"a11y.moduleComplete\"));\n }, [evaluation, score, life, total, attempts, revealed, firstFraction, assignments, announce, t]);\n\n const chipState = (itemId: string): ChipState => {\n if (revealed && evaluation && !evaluation.items[itemId]) return \"revealed\";\n if (evaluation) return evaluation.items[itemId] ? \"correct\" : \"incorrect\";\n if (lockedIds.includes(itemId)) return \"locked\";\n if (selected === itemId) return \"selected\";\n return \"idle\";\n };\n\n const matrixLabel = t(\"matrix.label\", { y: axes.y.label, x: axes.x.label });\n\n if (finished && evaluation) {\n return (\n <ModuleShell\n type=\"priority-matrix\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n appearance={config.appearance}\n className={className}\n width=\"wide\"\n announcement={message}\n >\n <CompletionCard\n score={score}\n text={\n config.feedback.complete ??\n (evaluation.correct\n ? t(\"matrix.allCorrect\")\n : t(\"matrix.correctCount\", { correct: evaluation.correctCount, total }))\n }\n stats={[\n { label: t(\"common.correct\"), value: `${evaluation.correctCount}/${total}` },\n { label: t(\"common.attempts\"), value: attempts },\n ]}\n onRetry={() => {\n life.reset();\n life.emit(\"module:reset\");\n }}\n >\n <div className=\"nb-matrix__summary\" role=\"group\" aria-label={t(\"matrix.expert\")}>\n {quadrants.map((q) => (\n <div key={q.id} className=\"nb-matrix__summary-cell\" style={quadrantStyle(q)}>\n <span className=\"nb-matrix__summary-label\">{q.label}</span>\n <ul className=\"nb-matrix__summary-items\">\n {items\n .filter((i) => i.quadrantId === q.id)\n .map((i) => (\n <li key={i.id}>\n <RichText text={i.text} />\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n </CompletionCard>\n </ModuleShell>\n );\n }\n\n const activeItem = activeId ? itemById.get(activeId) : undefined;\n const selectedItem = selected ? itemById.get(selected) : undefined;\n\n return (\n <ModuleShell\n type=\"priority-matrix\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : (config.instructions ?? t(\"matrix.instructions\"))}\n appearance={config.appearance}\n className={className}\n width=\"wide\"\n announcement={message}\n aside={\n <span className=\"nb-counter\">\n {checked\n ? t(\"matrix.correctCount\", { correct: evaluation.correctCount, total })\n : t(\"matrix.placedCount\", { count: placedCount, total })}\n </span>\n }\n >\n <DndContext\n id={`${config.id}-dnd`}\n sensors={sensors}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragCancel={onDragCancel}\n accessibility={{\n screenReaderInstructions: { draggable: t(\"matrix.selectInstructions\") },\n announcements: {\n onDragStart: ({ active }) =>\n t(\"a11y.pickedUp\", { item: itemById.get(String(active.id))?.text ?? \"\" }),\n onDragOver: ({ over }) =>\n over && over.id !== TRAY_ID\n ? t(\"matrix.placeIn\", { quadrant: quadrantById.get(String(over.id))?.label ?? \"\" })\n : undefined,\n onDragEnd: () => undefined,\n onDragCancel: ({ active }) =>\n t(\"a11y.dropCancelled\", { item: itemById.get(String(active.id))?.text ?? \"\" }),\n },\n }}\n >\n <LayoutGroup id={config.id}>\n {!locked && (\n <Tray\n items={trayItems}\n total={total}\n chipState={chipState}\n isMovable={isMovable}\n selectedItem={selectedItem}\n onSelect={toggleSelect}\n onReturn={(id) => place(id, undefined)}\n reduced={reduced}\n t={t}\n />\n )}\n\n <div className=\"nb-matrix\" role=\"group\" aria-label={matrixLabel}>\n <Axis axis={axes.y} orientation=\"y\" />\n <div className=\"nb-matrix__grid\">\n {quadrants.map((q) => (\n <Quadrant\n key={q.id}\n moduleId={config.id}\n quadrant={q}\n axes={axes}\n items={order.filter((i) => assignments[i.id] === q.id)}\n chipState={chipState}\n isMovable={isMovable}\n selectedItem={selectedItem}\n showExplanation={checked && behavior.showExplanation}\n quadrantById={quadrantById}\n onSelect={toggleSelect}\n onPlace={(id) => place(id, q.id)}\n reduced={reduced}\n t={t}\n />\n ))}\n </div>\n <span className=\"nb-matrix__corner\" aria-hidden />\n <Axis axis={axes.x} orientation=\"x\" />\n </div>\n </LayoutGroup>\n\n <DragOverlay dropAnimation={reduced ? null : undefined}>\n {activeItem ? (\n <div className=\"nb-matrix__chip nb-matrix__chip--overlay\" data-state=\"selected\">\n <span className=\"nb-matrix__chip-text\">\n <RichText text={activeItem.text} />\n </span>\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n\n {checked && behavior.showExplanation && (\n <ul className=\"nb-matrix__review\" aria-label={t(\"common.review\")}>\n {order\n .filter((i) => i.explanation)\n .map((i) => {\n const state = chipState(i.id);\n const belongs = quadrantById.get(i.quadrantId);\n return (\n <li key={i.id} className=\"nb-matrix__review-item\" data-state={state}>\n <span\n className=\"nb-matrix__review-icon\"\n role=\"img\"\n aria-label={state === \"incorrect\" ? t(\"common.incorrect\") : t(\"common.correct\")}\n >\n {state === \"incorrect\" ? <X strokeWidth={3} /> : <Check strokeWidth={3} />}\n </span>\n <span className=\"nb-matrix__review-body\">\n <strong>\n <RichText text={i.text} />\n </strong>\n {state === \"incorrect\" && belongs && (\n <span className=\"nb-matrix__review-belongs\">\n {t(\"matrix.belongsIn\", { quadrant: belongs.label })}\n </span>\n )}\n <RichText text={i.explanation!} />\n </span>\n </li>\n );\n })}\n </ul>\n )}\n\n <AnimatedFeedback\n show={checked}\n tone={\n evaluation?.correct\n ? \"correct\"\n : revealed\n ? \"info\"\n : evaluation && evaluation.correctCount > 0\n ? \"partial\"\n : \"incorrect\"\n }\n title={evaluation?.correct ? t(\"matrix.allCorrect\") : t(\"common.incorrect\")}\n text={\n evaluation\n ? evaluation.correct\n ? (config.feedback.correct ?? undefined)\n : (config.feedback.incorrect ??\n t(\"matrix.correctCount\", { correct: evaluation.correctCount, total }))\n : undefined\n }\n />\n\n {locked && behavior.showExplanation && <Explanation text={config.content.explanation} />}\n\n <div className=\"nb-matrix__footer\">\n <span className=\"nb-muted nb-text-sm\">\n {!checked && itemsLeft > 0 ? t(\"matrix.itemsLeft\", { count: itemsLeft }) : \"\"}\n </span>\n <div className=\"nb-module__actions\">\n {canReveal && (\n <Button variant=\"ghost\" onClick={reveal} leading={<Eye aria-hidden />}>\n {t(\"common.showAnswer\")}\n </Button>\n )}\n {canRetry && (\n <Button variant=\"secondary\" onClick={retry}>\n {t(\"common.retry\")}\n </Button>\n )}\n {!checked ? (\n <Button variant=\"primary\" onClick={check} disabled={itemsLeft > 0}>\n {t(\"common.check\")}\n </Button>\n ) : (\n locked && (\n <Button variant=\"primary\" onClick={finish} autoFocus>\n {t(\"common.finish\")}\n </Button>\n )\n )}\n </div>\n </div>\n </ModuleShell>\n );\n}\n\nexport default PriorityMatrix;\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport { motion } from \"motion/react\";\nimport {\n Archive,\n ArrowLeft,\n ArrowRight,\n CalendarClock,\n Check,\n CircleCheck,\n CircleDot,\n CircleX,\n Crown,\n Flag,\n Forward,\n Globe,\n Inbox,\n Mail,\n Paperclip,\n Reply,\n ShieldAlert,\n TriangleAlert,\n} from \"lucide-react\";\nimport clsx from \"clsx\";\nimport {\n evaluateTriage,\n gradeTriageDecision,\n inboxTriageSchema,\n isPriorityMessage,\n nextUnhandledIndex,\n type InboxAction,\n type InboxFlag,\n type InboxMessage,\n type InboxTriageConfig,\n type TriageDecisions,\n type TriageStatus,\n} from \"@nibblearn/core\";\nimport type { ModuleProps } from \"../types\";\nimport { useNibblearn } from \"../../context/NibblearnProvider\";\nimport { useModuleLifecycle, type ModuleLifecycle } from \"../../hooks/useModuleLifecycle\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useAnnounce } from \"../../hooks/useAnnounce\";\nimport { Badge } from \"../../primitives/Badge\";\nimport { Button } from \"../../primitives/Button\";\nimport { ProgressBar } from \"../../primitives/ProgressBar\";\nimport { RichText } from \"../../primitives/RichText\";\nimport { CompletionCard } from \"../../primitives/CompletionCard\";\nimport { ModuleShell, InvalidModule } from \"../../primitives/ModuleShell\";\nimport \"./inbox-triage.css\";\n\nexport type InboxTriageProps = ModuleProps<InboxTriageConfig>;\n\nconst ACTION_ICON: Record<NonNullable<InboxAction[\"icon\"]>, ReactNode> = {\n reply: <Reply aria-hidden />,\n forward: <Forward aria-hidden />,\n calendar: <CalendarClock aria-hidden />,\n archive: <Archive aria-hidden />,\n flag: <Flag aria-hidden />,\n alert: <TriangleAlert aria-hidden />,\n};\n\nconst FLAG_ICON: Record<InboxFlag, ReactNode> = {\n vip: <Crown aria-hidden />,\n external: <Globe aria-hidden />,\n attachment: <Paperclip aria-hidden />,\n \"suspicious-link\": <ShieldAlert aria-hidden />,\n};\n\nconst STATUS_ICON: Record<TriageStatus, ReactNode> = {\n correct: <CircleCheck aria-hidden />,\n acceptable: <CircleDot aria-hidden />,\n wrong: <CircleX aria-hidden />,\n pending: <Mail aria-hidden />,\n};\n\nconst AVATAR_TONES = [\"accent\", \"sky\", \"violet\", \"pink\", \"highlight\"] as const;\n\nfunction initials(name: string): string {\n return name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((w) => w[0]!.toUpperCase())\n .join(\"\");\n}\n\n/** Deterministic avatar tone per sender. */\nfunction avatarTone(name: string): (typeof AVATAR_TONES)[number] {\n let h = 0;\n for (const ch of name) h = (h * 31 + ch.charCodeAt(0)) >>> 0;\n return AVATAR_TONES[h % AVATAR_TONES.length]!;\n}\n\n/** Action tone as used by the CSS (\"lime\" maps to the highlight token). */\nfunction toneOf(action: InboxAction | undefined): string {\n if (!action?.tone) return \"neutral\";\n return action.tone === \"lime\" ? \"highlight\" : action.tone;\n}\n\nfunction actionIcon(action: InboxAction | undefined): ReactNode {\n return action?.icon ? ACTION_ICON[action.icon] : <Mail aria-hidden />;\n}\n\nfunction uniqueFlags(flags: readonly InboxFlag[]): InboxFlag[] {\n return [...new Set(flags)];\n}\n\nexport function InboxTriage({ config: rawConfig, ...rest }: InboxTriageProps) {\n const parsed = useMemo(() => inboxTriageSchema.safeParse(rawConfig), [rawConfig]);\n if (!parsed.success) {\n return (\n <InvalidModule\n type=\"inbox-triage\"\n issues={parsed.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message }))}\n />\n );\n }\n return <InboxTriageInner config={parsed.data} {...rest} />;\n}\n\n/** Owns the lifecycle; every reset remounts InboxTriageRun with fresh state (keyed by runId). */\nfunction InboxTriageInner(props: InboxTriageProps) {\n const { config, onComplete, onEvent, resetKey } = props;\n const life = useModuleLifecycle({\n moduleId: config.id,\n moduleType: \"inbox-triage\",\n onComplete,\n onEvent,\n resetKey,\n });\n return <InboxTriageRun key={life.runId} {...props} life={life} />;\n}\n\ntype FocusTarget = \"subject\" | \"summary\" | number;\n\nfunction InboxTriageRun({\n life,\n config,\n hideHeader,\n className,\n}: InboxTriageProps & { life: ModuleLifecycle }) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const { message: announcement, announce } = useAnnounce();\n const { owner, actions, messages } = config.content;\n const { behavior } = config;\n const instant = behavior.feedback === \"instant\";\n\n const [decisions, setDecisions] = useState<Record<string, string>>({});\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [view, setView] = useState<\"list\" | \"message\">(\"list\");\n const [read, setRead] = useState<Record<string, true>>({});\n const [focusIndex, setFocusIndex] = useState(0);\n const [finished, setFinished] = useState(false);\n const [focusTick, setFocusTick] = useState(0);\n\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const subjectRef = useRef<HTMLHeadingElement>(null);\n const summaryRef = useRef<HTMLDivElement>(null);\n const focusRequest = useRef<FocusTarget | null>(null);\n\n const actionById = useMemo(() => new Map(actions.map((a) => [a.id, a])), [actions]);\n const handled = Object.keys(decisions).length;\n const total = messages.length;\n const allHandled = handled >= total;\n const active = activeIndex === null ? null : messages[activeIndex]!;\n\n const requestFocus = useCallback((target: FocusTarget) => {\n focusRequest.current = target;\n setFocusTick((n) => n + 1);\n }, []);\n\n // Move focus after the view has re-rendered (refs are attached before effects run).\n useEffect(() => {\n const target = focusRequest.current;\n if (target === null) return;\n focusRequest.current = null;\n if (target === \"subject\") subjectRef.current?.focus();\n else if (target === \"summary\") summaryRef.current?.focus();\n else itemRefs.current[target]?.focus();\n }, [focusTick]);\n\n const open = useCallback(\n (index: number) => {\n const m = messages[index]!;\n setActiveIndex(index);\n setFocusIndex(index);\n setView(\"message\");\n setRead((prev) => (prev[m.id] ? prev : { ...prev, [m.id]: true }));\n life.emit(\"module:interact\", { action: \"open\", messageId: m.id });\n requestFocus(\"subject\");\n },\n [messages, life, requestFocus],\n );\n\n const backToList = useCallback(() => {\n setView(\"list\");\n if (activeIndex !== null) requestFocus(activeIndex);\n }, [activeIndex, requestFocus]);\n\n const choose = useCallback(\n (action: InboxAction) => {\n if (!active || finished) return;\n const prev = decisions[active.id];\n if (prev === action.id || (instant && prev !== undefined)) return;\n life.attempt();\n setDecisions({ ...decisions, [active.id]: action.id });\n const { status, points } = gradeTriageDecision(active, action.id);\n life.emit(\"module:answer\", {\n messageId: active.id,\n action: action.id,\n status,\n points,\n changed: prev !== undefined,\n });\n if (instant) {\n const expert = actionById.get(active.correctAction)?.label ?? active.correctAction;\n announce(\n status === \"correct\"\n ? `${t(\"inbox.status.correct\")}.`\n : `${t(`inbox.status.${status}`)}. ${t(\"inbox.expertCall\", { action: expert })}.`,\n );\n } else {\n announce(t(\"inbox.filedAs\", { action: action.label }));\n }\n },\n [active, finished, decisions, instant, life, actionById, announce, t],\n );\n\n const finish = useCallback(() => {\n if (!allHandled) return;\n const ev = evaluateTriage(config, decisions);\n setFinished(true);\n life.complete({\n score: ev.score,\n correct: ev.correct,\n total: ev.total,\n details: {\n decisions,\n statuses: Object.fromEntries(ev.messages.map((m) => [m.id, m.status])),\n actionCounts: ev.actionCounts,\n missedPriority: ev.missedPriority,\n },\n });\n announce(\n `${t(\"inbox.summary\", { correct: ev.correct, total: ev.total })} ${t(\"a11y.moduleComplete\")}`,\n );\n requestFocus(\"summary\");\n }, [allHandled, config, decisions, life, announce, t, requestFocus]);\n\n const goNext = useCallback(() => {\n const idx = nextUnhandledIndex(messages, decisions, activeIndex ?? -1);\n if (idx === -1) finish();\n else open(idx);\n }, [messages, decisions, activeIndex, finish, open]);\n\n const retry = useCallback(() => {\n life.reset();\n life.emit(\"module:reset\");\n }, [life]);\n\n // Roving focus in the message list.\n const onListKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLButtonElement>, index: number) => {\n let next: number | null = null;\n if (e.key === \"ArrowDown\") next = Math.min(total - 1, index + 1);\n else if (e.key === \"ArrowUp\") next = Math.max(0, index - 1);\n else if (e.key === \"Home\") next = 0;\n else if (e.key === \"End\") next = total - 1;\n if (next === null) return;\n e.preventDefault();\n setFocusIndex(next);\n itemRefs.current[next]?.focus();\n },\n [total],\n );\n\n // Module-wide shortcuts: 1–5 pick an action, Escape returns to the list.\n const onKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLElement>) => {\n if (finished || !active || e.defaultPrevented) return;\n if (e.altKey || e.ctrlKey || e.metaKey) return;\n const target = e.target as HTMLElement | null;\n if (target && /^(INPUT|TEXTAREA|SELECT)$/.test(target.tagName)) return;\n if (e.key === \"Escape\" && view === \"message\") {\n e.preventDefault();\n backToList();\n return;\n }\n if (!/^[1-9]$/.test(e.key)) return;\n const action = actions[Number(e.key) - 1];\n if (!action) return;\n e.preventDefault();\n choose(action);\n },\n [finished, active, view, backToList, actions, choose],\n );\n\n if (finished) {\n return (\n <ModuleShell\n type=\"inbox-triage\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n appearance={config.appearance}\n className={className}\n announcement={announcement}\n width=\"wide\"\n >\n <div ref={summaryRef} tabIndex={-1} className=\"nb-inbox__done\">\n <TriageSummary config={config} decisions={decisions} onRetry={retry} />\n </div>\n </ModuleShell>\n );\n }\n\n const unread = messages.filter((m) => !read[m.id]).length;\n const handledLabel = t(\"inbox.handledCount\", { count: handled, total });\n\n return (\n <ModuleShell\n type=\"inbox-triage\"\n id={config.id}\n title={hideHeader ? undefined : config.title}\n instructions={hideHeader ? undefined : config.instructions}\n appearance={config.appearance}\n className={className}\n announcement={announcement}\n width=\"wide\"\n onKeyDown={onKeyDown}\n aside={<span className=\"nb-counter\">{handledLabel}</span>}\n eyebrow={\n <ProgressBar value={handled / total} showLabel={false} size=\"sm\" label={handledLabel} />\n }\n >\n <div\n className=\"nb-inbox\"\n data-view={view}\n data-open={active ? \"true\" : \"false\"}\n data-feedback={behavior.feedback}\n >\n <div className=\"nb-inbox__topbar\">\n <span className=\"nb-inbox__brand\" aria-hidden>\n <Inbox />\n </span>\n <div className=\"nb-inbox__owner\">\n <span className=\"nb-inbox__folder\">{t(\"inbox.title\")}</span>\n <span className=\"nb-inbox__owner-name\">\n {owner.name}\n {owner.role && <span className=\"nb-inbox__owner-role\"> · {owner.role}</span>}\n </span>\n </div>\n <span className=\"nb-inbox__kbd-hint\" aria-hidden>\n {t(\"inbox.keyboardHint\", { count: actions.length })}\n </span>\n <span className=\"nb-inbox__unread\" data-zero={unread === 0 ? \"true\" : undefined}>\n {t(\"inbox.unreadCount\", { count: unread })}\n </span>\n </div>\n\n <div className=\"nb-inbox__panes\">\n <div className=\"nb-inbox__list-pane\">\n <ul className=\"nb-inbox__list\" aria-label={t(\"inbox.messages\")}>\n {messages.map((m, i) => {\n const decision = decisions[m.id];\n const action = decision ? actionById.get(decision) : undefined;\n const status = decision ? gradeTriageDecision(m, decision).status : \"pending\";\n const flags = uniqueFlags(m.flags);\n const isUnread = !read[m.id];\n const extras = [\n isUnread ? t(\"inbox.unread\") : null,\n ...flags.map((f) => t(`inbox.flag.${f}`)),\n action ? t(\"inbox.handledAs\", { action: action.label }) : null,\n action && instant ? t(`inbox.status.${status}`) : null,\n ].filter(Boolean);\n return (\n <li key={m.id} className=\"nb-inbox__row\">\n <button\n ref={(el) => {\n itemRefs.current[i] = el;\n }}\n type=\"button\"\n className=\"nb-inbox__item\"\n data-unread={isUnread ? \"true\" : undefined}\n data-handled={decision ? \"true\" : undefined}\n aria-current={activeIndex === i ? \"true\" : undefined}\n tabIndex={i === focusIndex ? 0 : -1}\n onClick={() => open(i)}\n onFocus={() => setFocusIndex(i)}\n onKeyDown={(e) => onListKeyDown(e, i)}\n >\n <span className=\"nb-inbox__unread-dot\" aria-hidden />\n <motion.span\n key={decision ?? \"avatar\"}\n className=\"nb-inbox__avatar\"\n data-tone={action ? toneOf(action) : avatarTone(m.from.name)}\n data-kind={action ? \"action\" : \"person\"}\n data-initials={action ? undefined : initials(m.from.name)}\n aria-hidden\n initial={reduced || !action ? false : { scale: 0.8, opacity: 0.4 }}\n animate={{ scale: 1, opacity: 1 }}\n transition={{ duration: reduced ? 0 : 0.24, ease: [0.34, 1.56, 0.64, 1] }}\n >\n {/* Initials are drawn via CSS so they never become part of the row's text. */}\n {action ? actionIcon(action) : null}\n </motion.span>\n <span className=\"nb-inbox__item-main\">\n <span className=\"nb-inbox__item-top\">\n <span className=\"nb-inbox__sender\">{m.from.name}</span>\n {flags.length > 0 && (\n <span className=\"nb-inbox__mini-flags\">\n {flags.map((f) => (\n <span\n key={f}\n className=\"nb-inbox__mini-flag\"\n data-flag={f}\n title={t(`inbox.flag.${f}`)}\n aria-hidden\n >\n {FLAG_ICON[f]}\n </span>\n ))}\n </span>\n )}\n <span className=\"nb-inbox__time\">{m.time}</span>\n </span>\n <span className=\"nb-inbox__subject\">{m.subject}</span>\n {action ? (\n <span className=\"nb-inbox__tag\" data-tone={toneOf(action)}>\n {instant && (\n <span className=\"nb-inbox__tag-status\" data-status={status}>\n {STATUS_ICON[status]}\n </span>\n )}\n {action.label}\n </span>\n ) : (\n <span className=\"nb-inbox__preview\">{m.preview}</span>\n )}\n </span>\n {/* Name = visible text (WCAG 2.5.3) + state that is only shown as icons. */}\n {extras.length > 0 && (\n <span className=\"nb-sr-only\">. {extras.join(\", \")}</span>\n )}\n </button>\n </li>\n );\n })}\n </ul>\n </div>\n\n <div className=\"nb-inbox__reader\">\n {active ? (\n <MessageView\n key={active.id}\n moduleId={config.id}\n message={active}\n ownerName={owner.name}\n actions={actions}\n decision={decisions[active.id]}\n instant={instant}\n allHandled={allHandled}\n subjectRef={subjectRef}\n onBack={backToList}\n onChoose={choose}\n onNext={goNext}\n />\n ) : (\n <div className=\"nb-inbox__empty\">\n <span className=\"nb-inbox__empty-icon\" aria-hidden>\n <Inbox />\n </span>\n <p className=\"nb-inbox__empty-title\">{t(\"inbox.emptyTitle\", { count: total })}</p>\n <p className=\"nb-inbox__empty-body\">{t(\"inbox.emptyBody\")}</p>\n <ul className=\"nb-inbox__legend\">\n {actions.map((a) => (\n <li key={a.id} className=\"nb-inbox__legend-item\" data-tone={toneOf(a)}>\n <span className=\"nb-inbox__action-icon\" aria-hidden>\n {actionIcon(a)}\n </span>\n <span>\n <strong>{a.label}</strong>\n {a.description && (\n <span className=\"nb-inbox__legend-desc\"> {a.description}</span>\n )}\n </span>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n </div>\n </div>\n </ModuleShell>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Reading pane\n * -------------------------------------------------------------------------- */\n\ninterface MessageViewProps {\n moduleId: string;\n message: InboxMessage;\n ownerName: string;\n actions: InboxAction[];\n decision?: string;\n instant: boolean;\n allHandled: boolean;\n subjectRef: React.RefObject<HTMLHeadingElement | null>;\n onBack: () => void;\n onChoose: (action: InboxAction) => void;\n onNext: () => void;\n}\n\nfunction MessageView({\n moduleId,\n message: m,\n ownerName,\n actions,\n decision,\n instant,\n allHandled,\n subjectRef,\n onBack,\n onChoose,\n onNext,\n}: MessageViewProps) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const flags = uniqueFlags(m.flags);\n const chosen = decision ? actions.find((a) => a.id === decision) : undefined;\n const expert = actions.find((a) => a.id === m.correctAction);\n const status = decision ? gradeTriageDecision(m, decision).status : \"pending\";\n const locked = instant && decision !== undefined;\n const subjectId = `${moduleId}-inbox-subject`;\n const dockId = `${moduleId}-inbox-dock`;\n\n return (\n <motion.article\n className=\"nb-inbox__message\"\n aria-labelledby={subjectId}\n initial={reduced ? false : { opacity: 0, x: 12 }}\n animate={{ opacity: 1, x: 0 }}\n transition={{ duration: reduced ? 0 : 0.22, ease: [0.2, 0.8, 0.2, 1] }}\n >\n <div className=\"nb-inbox__reader-bar\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"nb-inbox__back\"\n leading={<ArrowLeft aria-hidden />}\n onClick={onBack}\n >\n {t(\"inbox.back\")}\n </Button>\n </div>\n\n <header className=\"nb-inbox__msg-head\">\n <h3 ref={subjectRef} id={subjectId} tabIndex={-1} className=\"nb-inbox__msg-subject\">\n {m.subject}\n </h3>\n <div className=\"nb-inbox__sender-block\">\n <span\n className=\"nb-inbox__avatar nb-inbox__avatar--lg\"\n data-tone={avatarTone(m.from.name)}\n aria-hidden\n >\n {initials(m.from.name)}\n </span>\n <div className=\"nb-inbox__sender-meta\">\n <div className=\"nb-inbox__sender-line\">\n <span className=\"nb-inbox__sender-name\">{m.from.name}</span>\n {m.from.email && <span className=\"nb-inbox__email\">{m.from.email}</span>}\n </div>\n <div className=\"nb-inbox__sender-sub\">\n {m.from.role && <span>{m.from.role}</span>}\n <span>{t(\"inbox.to\", { name: ownerName })}</span>\n </div>\n </div>\n <span className=\"nb-inbox__msg-time\">{m.time}</span>\n </div>\n {flags.length > 0 && (\n <ul className=\"nb-inbox__flags\" aria-label={t(\"inbox.flags\")}>\n {flags.map((f) => (\n <li key={f} className=\"nb-inbox__flag\" data-flag={f}>\n {FLAG_ICON[f]}\n {t(`inbox.flag.${f}`)}\n </li>\n ))}\n </ul>\n )}\n </header>\n\n <div className=\"nb-inbox__msg-body\">\n <RichText text={m.body} paragraphs />\n </div>\n\n <div className=\"nb-inbox__dock\" role=\"group\" aria-labelledby={dockId}>\n <div className=\"nb-inbox__dock-label\" id={dockId}>\n {t(\"inbox.yourCall\")}\n </div>\n <div className=\"nb-inbox__actions\">\n {actions.map((a, i) => {\n const isChosen = decision === a.id;\n const descId = a.description ? `${moduleId}-inbox-action-${a.id}` : undefined;\n return (\n <button\n key={a.id}\n type=\"button\"\n className=\"nb-inbox__action\"\n data-tone={toneOf(a)}\n data-chosen={isChosen ? \"true\" : undefined}\n aria-pressed={isChosen}\n aria-keyshortcuts={i < 9 ? String(i + 1) : undefined}\n aria-describedby={descId}\n title={a.description}\n disabled={locked}\n onClick={() => onChoose(a)}\n >\n <span className=\"nb-inbox__action-icon\" aria-hidden>\n {isChosen ? <Check /> : actionIcon(a)}\n </span>\n <span className=\"nb-inbox__action-label\">{a.label}</span>\n {i < 9 && (\n <kbd className=\"nb-inbox__key\" aria-hidden>\n {i + 1}\n </kbd>\n )}\n {descId && (\n <span id={descId} className=\"nb-sr-only\">\n {a.description}\n </span>\n )}\n </button>\n );\n })}\n </div>\n\n {chosen && instant && (\n <motion.div\n className=\"nb-inbox__coach\"\n data-status={status}\n initial={reduced ? false : { opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: reduced ? 0 : 0.24, ease: [0.2, 0.8, 0.2, 1] }}\n >\n <div className=\"nb-inbox__coach-head\">\n <span className=\"nb-inbox__coach-icon\" aria-hidden>\n {STATUS_ICON[status]}\n </span>\n <span className=\"nb-inbox__coach-title\">{t(`inbox.status.${status}`)}</span>\n {status !== \"correct\" && (\n <span className=\"nb-inbox__coach-expert\" data-tone={toneOf(expert)}>\n {t(\"inbox.expertCall\", { action: expert?.label ?? m.correctAction })}\n </span>\n )}\n </div>\n <RichText className=\"nb-inbox__coach-text\" text={m.explanation} paragraphs />\n </motion.div>\n )}\n\n {chosen && !instant && (\n <p className=\"nb-inbox__filed\">\n <Check aria-hidden />\n {t(\"inbox.filedAs\", { action: chosen.label })}\n </p>\n )}\n\n {chosen && (\n <div className=\"nb-inbox__dock-foot\">\n <Button\n variant=\"primary\"\n autoFocus\n onClick={onNext}\n trailing={<ArrowRight aria-hidden />}\n >\n {allHandled ? t(\"inbox.seeResults\") : t(\"inbox.nextMessage\")}\n </Button>\n </div>\n )}\n </div>\n </motion.article>\n );\n}\n\n/* ----------------------------------------------------------------------------\n * Summary\n * -------------------------------------------------------------------------- */\n\nfunction TriageSummary({\n config,\n decisions,\n onRetry,\n}: {\n config: InboxTriageConfig;\n decisions: TriageDecisions;\n onRetry: () => void;\n}) {\n const { t } = useNibblearn();\n const { actions, messages, summary } = config.content;\n const { behavior } = config;\n const ev = useMemo(() => evaluateTriage(config, decisions), [config, decisions]);\n const byId = new Map(actions.map((a) => [a.id, a]));\n const labelOf = (id?: string) => (id ? (byId.get(id)?.label ?? id) : \"—\");\n const priorityCount = messages.filter((m) => isPriorityMessage(m, actions)).length;\n const missed = messages.filter((m) => ev.missedPriority.includes(m.id));\n\n return (\n <CompletionCard\n score={behavior.showScore ? ev.score : undefined}\n passThreshold={Math.max(config.scoring.passThreshold, 0.7)}\n title={t(\"inbox.doneTitle\")}\n text={\n config.feedback.complete ??\n summary ??\n t(\"inbox.summary\", { correct: ev.correct, total: ev.total })\n }\n stats={[\n { label: t(\"inbox.expertCalls\"), value: `${ev.correct}/${ev.total}` },\n { label: t(\"inbox.acceptableCalls\"), value: ev.acceptable },\n { label: t(\"inbox.missedCount\"), value: ev.missedPriority.length },\n ]}\n onRetry={behavior.allowRetry ? onRetry : undefined}\n >\n <div className=\"nb-inbox__report\">\n <section className=\"nb-inbox__report-section\">\n <h4 className=\"nb-inbox__section-title\">{t(\"inbox.yourCalls\")}</h4>\n <ul className=\"nb-inbox__chips\">\n {actions.map((a) => {\n const mine = ev.actionCounts[a.id] ?? 0;\n const expertN = ev.expertCounts[a.id] ?? 0;\n return (\n <li\n key={a.id}\n className=\"nb-inbox__chip\"\n data-tone={toneOf(a)}\n data-match={mine === expertN ? \"true\" : \"false\"}\n >\n <span className=\"nb-inbox__action-icon\" aria-hidden>\n {actionIcon(a)}\n </span>\n <span className=\"nb-sr-only\">\n {t(\"inbox.callCount\", { label: a.label, mine, expert: expertN })}\n </span>\n <span className=\"nb-inbox__chip-label\" aria-hidden>\n {a.label}\n </span>\n <strong className=\"nb-inbox__chip-count\" aria-hidden>\n {mine}\n </strong>\n <span className=\"nb-inbox__chip-expert\" aria-hidden>\n {t(\"inbox.expertShort\", { count: expertN })}\n </span>\n </li>\n );\n })}\n </ul>\n </section>\n\n {priorityCount > 0 &&\n (missed.length > 0 ? (\n <div className=\"nb-inbox__callout\" data-tone=\"danger\">\n <TriangleAlert aria-hidden />\n <div>\n <p className=\"nb-inbox__callout-title\">{t(\"inbox.missedTitle\")}</p>\n <p className=\"nb-inbox__callout-body\">{t(\"inbox.missedBody\")}</p>\n <ul className=\"nb-inbox__missed\">\n {missed.map((m) => (\n <li key={m.id}>\n <strong>{m.from.name}</strong> · {m.subject} ·{\" \"}\n {t(\"inbox.expert\", { action: labelOf(m.correctAction) })}\n </li>\n ))}\n </ul>\n </div>\n </div>\n ) : (\n <div className=\"nb-inbox__callout\" data-tone=\"success\">\n <CircleCheck aria-hidden />\n <p className=\"nb-inbox__callout-title\">{t(\"inbox.noneMissed\")}</p>\n </div>\n ))}\n\n <section className=\"nb-inbox__report-section\">\n <h4 className=\"nb-inbox__section-title\">{t(\"inbox.review\")}</h4>\n <ol className=\"nb-inbox__review\">\n {ev.messages.map((r, i) => {\n const m = messages[i]!;\n return (\n <li key={r.id} className=\"nb-inbox__review-item\" data-status={r.status}>\n <span\n className=\"nb-inbox__review-icon\"\n role=\"img\"\n aria-label={t(`inbox.status.${r.status}`)}\n >\n {STATUS_ICON[r.status]}\n </span>\n <div className=\"nb-inbox__review-body\">\n <div className=\"nb-inbox__review-head\">\n <span className=\"nb-inbox__review-subject\">{m.subject}</span>\n {r.priority && <Badge tone=\"warning\">{t(\"inbox.priority\")}</Badge>}\n </div>\n <div className=\"nb-inbox__review-from\">{m.from.name}</div>\n <div className=\"nb-inbox__review-calls\">\n <span\n className={clsx(\"nb-inbox__call\", \"nb-inbox__call--mine\")}\n data-tone={toneOf(byId.get(r.decision ?? \"\"))}\n >\n {t(\"inbox.youChose\", { action: labelOf(r.decision) })}\n </span>\n <span\n className={clsx(\"nb-inbox__call\", \"nb-inbox__call--expert\")}\n data-tone={toneOf(byId.get(r.correctAction))}\n >\n {t(\"inbox.expert\", { action: labelOf(r.correctAction) })}\n </span>\n {m.acceptable.length > 0 && (\n <span className=\"nb-inbox__also\">\n {t(\"inbox.alsoFine\", { actions: m.acceptable.map(labelOf).join(\", \") })}\n </span>\n )}\n </div>\n <RichText className=\"nb-inbox__review-text\" text={m.explanation} paragraphs />\n </div>\n </li>\n );\n })}\n </ol>\n </section>\n </div>\n </CompletionCard>\n );\n}\n\nexport default InboxTriage;\n","import { builtInModuleDefinitions } from \"@nibblearn/core\";\nimport { ModuleRegistry, type ModuleDefinition } from \"./registry\";\nimport type { ModuleComponent } from \"./modules/types\";\nimport { StoryCards } from \"./modules/story-cards/StoryCards\";\nimport { Flashcards } from \"./modules/flashcards/Flashcards\";\nimport { ChoiceChallenge } from \"./modules/choice-challenge/ChoiceChallenge\";\nimport { TrueFalse } from \"./modules/true-false/TrueFalse\";\nimport { MatchPairs } from \"./modules/match-pairs/MatchPairs\";\nimport { SequenceBuilder } from \"./modules/sequence-builder/SequenceBuilder\";\nimport { CategorySort } from \"./modules/category-sort/CategorySort\";\nimport { FillBlanks } from \"./modules/fill-blanks/FillBlanks\";\nimport { HotspotExplorer } from \"./modules/hotspot-explorer/HotspotExplorer\";\nimport { ScreenshotWalkthrough } from \"./modules/screenshot-walkthrough/ScreenshotWalkthrough\";\nimport { BranchingScenario } from \"./modules/branching-scenario/BranchingScenario\";\nimport { Conversation } from \"./modules/conversation/Conversation\";\nimport { ProcessExplorer } from \"./modules/process-explorer/ProcessExplorer\";\nimport { SpotTheMistake } from \"./modules/spot-the-mistake/SpotTheMistake\";\nimport { WhatIfSimulator } from \"./modules/what-if-simulator/WhatIfSimulator\";\nimport { BudgetAllocator } from \"./modules/budget-allocator/BudgetAllocator\";\nimport { Estimate } from \"./modules/estimate/Estimate\";\nimport { LabelDiagram } from \"./modules/label-diagram/LabelDiagram\";\nimport { ImageCompare } from \"./modules/image-compare/ImageCompare\";\nimport { WordBuilder } from \"./modules/word-builder/WordBuilder\";\nimport { PriorityMatrix } from \"./modules/priority-matrix/PriorityMatrix\";\nimport { InboxTriage } from \"./modules/inbox-triage/InboxTriage\";\n\n/** Built-in module components, keyed by type. */\nexport const builtInComponents: Record<string, ModuleComponent<never>> = {\n \"story-cards\": StoryCards,\n flashcards: Flashcards,\n \"choice-challenge\": ChoiceChallenge,\n \"true-false\": TrueFalse,\n \"match-pairs\": MatchPairs,\n \"sequence-builder\": SequenceBuilder,\n \"category-sort\": CategorySort,\n \"fill-blanks\": FillBlanks,\n \"hotspot-explorer\": HotspotExplorer,\n \"screenshot-walkthrough\": ScreenshotWalkthrough,\n \"branching-scenario\": BranchingScenario,\n conversation: Conversation,\n \"process-explorer\": ProcessExplorer,\n \"spot-the-mistake\": SpotTheMistake,\n \"what-if-simulator\": WhatIfSimulator,\n \"budget-allocator\": BudgetAllocator,\n estimate: Estimate,\n \"label-diagram\": LabelDiagram,\n \"image-compare\": ImageCompare,\n \"word-builder\": WordBuilder,\n \"priority-matrix\": PriorityMatrix,\n \"inbox-triage\": InboxTriage,\n};\n\n/** Create a registry pre-populated with all built-in modules. */\nexport function createDefaultRegistry(): ModuleRegistry {\n const defs = builtInModuleDefinitions\n .filter((d) => d.type in builtInComponents)\n .map((d) => ({ ...d, component: builtInComponents[d.type] }) as ModuleDefinition);\n return new ModuleRegistry(defs);\n}\n\n/** Registry containing every built-in module. */\n// PURE: lets bundlers drop the registry (and with it every module) when an app only\n// imports individual components.\nexport const defaultRegistry = /* @__PURE__ */ createDefaultRegistry();\n","import { useEffect, useState } from \"react\";\n\n/** SSR-safe media query hook. Returns `false` on the server and during hydration. */\nexport function useMediaQuery(query: string): boolean {\n const [matches, setMatches] = useState(false);\n useEffect(() => {\n if (typeof window === \"undefined\" || !window.matchMedia) return;\n const mql = window.matchMedia(query);\n const update = () => setMatches(mql.matches);\n update();\n mql.addEventListener?.(\"change\", update);\n return () => mql.removeEventListener?.(\"change\", update);\n }, [query]);\n return matches;\n}\n","import { forwardRef, type HTMLAttributes } from \"react\";\nimport clsx from \"clsx\";\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"elevated\" | \"soft\";\n padded?: boolean;\n}\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(\n { variant = \"default\", padded = true, className, ...rest },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={clsx(\n \"nb-card\",\n variant !== \"default\" && `nb-card--${variant}`,\n padded && \"nb-card--padded\",\n className,\n )}\n {...rest}\n />\n );\n});\n","import { Suspense, type ReactNode } from \"react\";\nimport type { ModuleRegistry } from \"./registry\";\nimport type { ModuleProps } from \"./modules/types\";\nimport { defaultRegistry } from \"./defaultRegistry\";\nimport { useNibblearn } from \"./context/NibblearnProvider\";\n\nexport interface ModuleRendererProps extends ModuleProps<{ id: string; type: string }> {\n /** Registry used to resolve `config.type`. Defaults to all built-in modules. */\n registry?: ModuleRegistry;\n /** Shown while a lazy module loads. */\n fallback?: ReactNode;\n}\n\n/**\n * Render any module config by its `type` through a registry.\n * The default registry is imported directly (no global side effects), so this works\n * in tree-shaken and code-split bundles.\n */\n// Components come from a stable registry map; they are not created during render.\n/* eslint-disable react-hooks/static-components */\nexport function ModuleRenderer({\n config,\n registry = defaultRegistry,\n fallback = null,\n ...rest\n}: ModuleRendererProps) {\n const { theme } = useNibblearn();\n const Component = registry.component(config.type);\n if (!Component) {\n return (\n <div className=\"nb-root nb-invalid\" role=\"alert\" data-nb-theme={theme}>\n <div className=\"nb-invalid__title\">\n Unknown module type: <code>{config.type}</code>\n </div>\n </div>\n );\n }\n return (\n <Suspense fallback={fallback}>\n <Component config={config} {...rest} />\n </Suspense>\n );\n}\n/* eslint-enable react-hooks/static-components */\n","import { useMemo } from \"react\";\nimport { motion } from \"motion/react\";\nimport { useReducedMotion } from \"../hooks/useReducedMotion\";\n\nconst COLORS = [\n \"var(--nb-accent)\",\n \"var(--nb-success)\",\n \"var(--nb-warning)\",\n \"var(--nb-info)\",\n \"var(--nb-danger)\",\n];\n\n/** Lightweight, original celebration: a handful of falling pieces. Skipped with reduced motion. */\nexport function Confetti({ count = 36 }: { count?: number }) {\n const reduced = useReducedMotion();\n const pieces = useMemo(\n () =>\n Array.from({ length: count }, (_, i) => ({\n id: i,\n x: (i / count) * 100 + (((i * 37) % 10) - 5),\n delay: ((i * 53) % 40) / 100,\n duration: 1.6 + ((i * 29) % 10) / 10,\n rotate: ((i * 71) % 360) - 180,\n color: COLORS[i % COLORS.length]!,\n scale: 0.7 + ((i * 13) % 6) / 10,\n })),\n [count],\n );\n if (reduced) return null;\n return (\n <div className=\"nb-confetti\" aria-hidden>\n {pieces.map((p) => (\n <motion.span\n key={p.id}\n className=\"nb-confetti__piece\"\n style={{ left: `${p.x}%`, background: p.color }}\n initial={{ y: -20, opacity: 0, rotate: 0, scale: p.scale }}\n animate={{ y: \"110vh\", opacity: [0, 1, 1, 0], rotate: p.rotate * 2 }}\n transition={{ duration: p.duration, delay: p.delay, ease: \"easeIn\" }}\n />\n ))}\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport {\n ArrowLeft,\n ArrowRight,\n Check,\n CircleDot,\n Clock,\n Flame,\n Layers,\n RotateCcw,\n Sparkles,\n Star,\n Target,\n X,\n} from \"lucide-react\";\nimport {\n computeLessonScore,\n createLocalStorage,\n createProgress,\n isLessonComplete,\n lessonProgressFraction,\n moduleResultPassed,\n validateLesson,\n type EventHandler,\n type Lesson,\n type LessonProgress,\n type LessonScore,\n type ModuleConfig,\n type ModuleResult,\n type ProgressStorage,\n type ValidationIssue,\n} from \"@nibblearn/core\";\nimport { NibblearnProvider, useNibblearn, type ThemeMode } from \"../context/NibblearnProvider\";\nimport type { ModuleRegistry } from \"../registry\";\nimport { ModuleRenderer } from \"../ModuleRenderer\";\nimport { defaultRegistry } from \"../defaultRegistry\";\nimport { Button } from \"../primitives/Button\";\nimport { ProgressBar } from \"../primitives/ProgressBar\";\nimport { Badge } from \"../primitives/Badge\";\nimport { RichText } from \"../primitives/RichText\";\nimport { SafeImage } from \"../primitives/SafeImage\";\nimport { CompletionCard } from \"../primitives/CompletionCard\";\nimport { InvalidModule } from \"../primitives/ModuleShell\";\nimport { LiveRegion } from \"../primitives/LiveRegion\";\nimport { useReducedMotion } from \"../hooks/useReducedMotion\";\nimport { Confetti } from \"./Confetti\";\nimport \"./player.css\";\n\nexport interface LessonCompletion extends LessonScore {\n lessonId: string;\n progress: LessonProgress;\n}\n\nexport interface LessonPlayerProps {\n /** A lesson object (from `defineLesson`) or raw lesson JSON (validated at runtime). */\n lesson: Lesson | unknown;\n /** Module registry (defaults to all built-in modules). */\n registry?: ModuleRegistry;\n /**\n * Progress persistence. Defaults to SSR-safe localStorage. Pass `false` to disable,\n * or any `ProgressStorage` adapter to persist elsewhere.\n */\n storage?: ProgressStorage | false;\n onEvent?: EventHandler;\n /** Called once when the lesson is completed. */\n onComplete?: (completion: LessonCompletion) => void;\n /** Called whenever a module completes. */\n onModuleComplete?: (result: ModuleResult) => void;\n /** UI locale. Defaults to the lesson language. */\n locale?: string;\n /** Theme override. Defaults to `lesson.theme.mode`. */\n theme?: ThemeMode;\n /** Render a bordered, elevated frame around the player (default true). */\n framed?: boolean;\n /** Skip the intro screen. */\n autoStart?: boolean;\n className?: string;\n /** Slot rendered under the top bar (e.g. a close button in a modal). */\n header?: ReactNode;\n}\n\ntype Phase = \"loading\" | \"intro\" | \"module\" | \"summary\";\n\n/** Shows a complete lesson: intro, modules, navigation, persistence and summary. */\nexport function LessonPlayer(props: LessonPlayerProps) {\n const outer = useNibblearn();\n const { registry = defaultRegistry } = props;\n const validated = useMemo(\n () => validateLesson(props.lesson, { registry: registry.schemas }),\n [props.lesson, registry],\n );\n\n const onEvent = props.onEvent;\n const forward = useCallback<EventHandler>(\n (e) => {\n outer.emit(e.type, {\n lessonId: e.lessonId,\n moduleId: e.moduleId,\n moduleType: e.moduleType,\n payload: e.payload,\n });\n onEvent?.(e);\n },\n [outer, onEvent],\n );\n\n if (!validated.success) {\n return <InvalidLesson issues={validated.issues} />;\n }\n const lesson = validated.data;\n return (\n <NibblearnProvider\n locale={props.locale ?? lesson.language ?? outer.locale}\n theme={props.theme ?? lesson.theme.mode}\n accent={lesson.theme.accent}\n radius={lesson.theme.radius}\n fontFamily={lesson.theme.fontFamily}\n reducedMotion={outer.reducedMotion}\n onEvent={forward}\n className=\"nb-player-root\"\n >\n <LessonPlayerInner {...props} lesson={lesson} registry={registry} />\n </NibblearnProvider>\n );\n}\n\nfunction InvalidLesson({ issues }: { issues: ValidationIssue[] }) {\n return <InvalidModule type=\"lesson\" issues={issues} />;\n}\n\nfunction LessonPlayerInner({\n lesson,\n registry,\n storage: storageProp,\n onComplete,\n onModuleComplete,\n framed = true,\n autoStart = false,\n className,\n header,\n}: Omit<LessonPlayerProps, \"lesson\"> & { lesson: Lesson; registry: ModuleRegistry }) {\n const { t, emit } = useNibblearn();\n const reduced = useReducedMotion();\n const storage = useMemo<ProgressStorage | null>(\n () => (storageProp === false ? null : (storageProp ?? createLocalStorage())),\n [storageProp],\n );\n\n const [phase, setPhase] = useState<Phase>(\"loading\");\n const [progress, setProgress] = useState<LessonProgress>(() => createProgress(lesson.id));\n const [resumable, setResumable] = useState<LessonProgress | null>(null);\n const [direction, setDirection] = useState(1);\n const [runId, setRunId] = useState(0);\n const [reviewing, setReviewing] = useState(false);\n const [announcement, setAnnouncement] = useState(\"\");\n const completedRef = useRef(false);\n const stageRef = useRef<HTMLDivElement>(null);\n\n const modules = lesson.modules;\n const index = progress.currentIndex;\n const current: ModuleConfig | undefined = modules[index];\n const score = useMemo(\n () => computeLessonScore(lesson, progress.results),\n [lesson, progress.results],\n );\n\n // Load persisted progress.\n useEffect(() => {\n let cancelled = false;\n (async () => {\n let saved: LessonProgress | null;\n try {\n saved = storage ? await storage.load(lesson.id) : null;\n } catch {\n saved = null; // a failing adapter must never block the lesson\n }\n if (cancelled) return;\n if (\n saved &&\n !saved.completedAt &&\n (saved.currentIndex >= 0 || Object.keys(saved.results).length > 0)\n ) {\n setResumable(saved);\n if (lesson.intro.show && !autoStart) setPhase(\"intro\");\n else resume(saved);\n return;\n }\n if (saved?.completedAt) {\n setProgress(saved);\n completedRef.current = true;\n setPhase(\"summary\");\n return;\n }\n if (lesson.intro.show && !autoStart) setPhase(\"intro\");\n else start();\n })();\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [lesson.id]);\n\n const persist = useCallback(\n (p: LessonProgress) => {\n setProgress(p);\n if (storage) void storage.save(p);\n },\n [storage],\n );\n\n const start = useCallback(() => {\n const p = { ...createProgress(lesson.id), currentIndex: 0 };\n completedRef.current = false;\n persist(p);\n setResumable(null);\n setReviewing(false);\n setDirection(1);\n setPhase(\"module\");\n emit(\"lesson:start\", { lessonId: lesson.id });\n setAnnouncement(t(\"lesson.activity\", { current: 1, total: modules.length }));\n }, [lesson.id, modules.length, persist, emit, t]);\n\n const resume = useCallback(\n (saved: LessonProgress) => {\n const idx = Math.max(0, Math.min(saved.currentIndex, modules.length - 1));\n persist({ ...saved, currentIndex: idx, updatedAt: new Date().toISOString() });\n setResumable(null);\n setPhase(\"module\");\n emit(\"lesson:resume\", { lessonId: lesson.id, payload: { index: idx } });\n },\n [modules.length, persist, emit, lesson.id],\n );\n\n const restart = useCallback(() => {\n if (storage) void storage.clear(lesson.id);\n setRunId((r) => r + 1);\n emit(\"lesson:reset\", { lessonId: lesson.id });\n start();\n }, [storage, lesson.id, emit, start]);\n\n const goTo = useCallback(\n (next: number) => {\n if (next < 0 || next >= modules.length) return;\n setDirection(next > index ? 1 : -1);\n persist({ ...progress, currentIndex: next, updatedAt: new Date().toISOString() });\n emit(\"lesson:navigate\", { lessonId: lesson.id, payload: { from: index, to: next } });\n setAnnouncement(t(\"lesson.activity\", { current: next + 1, total: modules.length }));\n requestAnimationFrame(() => stageRef.current?.focus({ preventScroll: true }));\n },\n [modules.length, index, progress, persist, emit, lesson.id, t],\n );\n\n const finish = useCallback(() => {\n const p = {\n ...progress,\n completedAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n persist(p);\n setReviewing(false);\n setPhase(\"summary\");\n if (!completedRef.current) {\n completedRef.current = true;\n const s = computeLessonScore(lesson, p.results);\n emit(\"lesson:complete\", {\n lessonId: lesson.id,\n payload: { score: s.score, points: s.points, passed: s.passed },\n });\n onComplete?.({ ...s, lessonId: lesson.id, progress: p });\n setAnnouncement(t(\"lesson.complete\"));\n }\n }, [progress, persist, lesson, emit, onComplete, t]);\n\n const handleModuleComplete = useCallback(\n (result: ModuleResult) => {\n const p = {\n ...progress,\n results: { ...progress.results, [result.moduleId]: result },\n updatedAt: new Date().toISOString(),\n };\n persist(p);\n onModuleComplete?.(result);\n },\n [progress, persist, onModuleComplete],\n );\n\n const currentDone = current ? Boolean(progress.results[current.id]) : false;\n const isLast = index === modules.length - 1;\n const canFinish =\n isLast && (lesson.completion.rule === \"any\" ? currentDone : isLessonComplete(lesson, progress));\n\n const streak = useMemo(() => {\n if (!lesson.gamification.streaks) return 0;\n let s = 0;\n for (let i = index; i >= 0; i--) {\n const r = progress.results[modules[i]!.id];\n if (!r) break;\n if (!moduleResultPassed(modules[i]!, r)) break;\n s++;\n }\n return s;\n }, [lesson.gamification.streaks, index, progress.results, modules]);\n\n const rootClass = [\"nb-root\", \"nb-player\", framed && \"nb-player--framed\", className]\n .filter(Boolean)\n .join(\" \");\n\n // ---------- Render ----------\n if (phase === \"loading\") {\n return <div className={rootClass} aria-busy=\"true\" style={{ minHeight: \"12rem\" }} />;\n }\n\n if (phase === \"intro\") {\n return (\n <div className={rootClass} data-nb-phase=\"intro\">\n {header}\n <LessonIntro lesson={lesson} onStart={start} resumable={resumable} onResume={resume} />\n <LiveRegion message={announcement} />\n </div>\n );\n }\n\n if (phase === \"summary\" && !reviewing) {\n return (\n <div className={rootClass} data-nb-phase=\"summary\">\n {header}\n {lesson.gamification.celebration && score.passed && <Confetti />}\n <LessonSummary\n lesson={lesson}\n progress={progress}\n score={score}\n onRetry={restart}\n onReview={(i) => {\n setReviewing(true);\n setDirection(1);\n persist({ ...progress, currentIndex: i });\n setPhase(\"module\");\n }}\n />\n <LiveRegion message={announcement} />\n </div>\n );\n }\n\n return (\n <div className={rootClass} data-nb-phase=\"module\">\n {header}\n <div className=\"nb-player__bar\">\n <ProgressBar\n value={lessonProgressFraction(lesson, progress)}\n showLabel={false}\n size=\"sm\"\n label={t(\"common.progress\")}\n />\n <span className=\"nb-player__counter\">\n {t(\"lesson.activity\", { current: index + 1, total: modules.length })}\n </span>\n {lesson.gamification.streaks && streak >= 2 && (\n <span className=\"nb-player__streak\">\n <Flame aria-hidden /> {t(\"lesson.streak\", { count: streak })}\n </span>\n )}\n {lesson.gamification.points && (\n <span\n className=\"nb-player__points\"\n aria-label={t(\"lesson.points\", { points: score.points, max: score.maxPoints })}\n >\n <Star aria-hidden /> {score.points}\n </span>\n )}\n </div>\n\n {reviewing && (\n <div className=\"nb-player__review-banner\">\n <span>{t(\"common.review\")}</span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setReviewing(false);\n setPhase(\"summary\");\n }}\n >\n {t(\"lesson.exitReview\")}\n </Button>\n </div>\n )}\n\n <div className=\"nb-player__stage\" ref={stageRef} tabIndex={-1}>\n <AnimatePresence mode=\"wait\" initial={false} custom={direction}>\n <motion.div\n key={`${runId}-${current?.id ?? index}`}\n className=\"nb-player__step\"\n custom={direction}\n initial={reduced ? false : { opacity: 0, x: 40 * direction }}\n animate={{ opacity: 1, x: 0 }}\n exit={reduced ? { opacity: 0 } : { opacity: 0, x: -40 * direction }}\n transition={{ duration: reduced ? 0 : 0.28, ease: [0.2, 0.8, 0.2, 1] }}\n >\n {current && (\n <ModuleRenderer\n key={`${runId}-${current.id}`}\n config={current}\n registry={registry}\n onComplete={handleModuleComplete}\n resetKey={runId}\n />\n )}\n </motion.div>\n </AnimatePresence>\n </div>\n\n <nav className=\"nb-player__nav\" aria-label={t(\"lesson.menu\")}>\n <Button\n variant=\"ghost\"\n onClick={() => goTo(index - 1)}\n disabled={index === 0}\n leading={<ArrowLeft aria-hidden />}\n >\n {t(\"common.back\")}\n </Button>\n <span className=\"nb-player__nav-hint\" aria-live=\"polite\">\n {!currentDone && !reviewing ? t(\"lesson.completeToContinue\") : \"\"}\n </span>\n {isLast ? (\n <Button\n variant=\"primary\"\n onClick={finish}\n disabled={!canFinish && !reviewing}\n trailing={<Check aria-hidden />}\n >\n {reviewing ? t(\"lesson.exitReview\") : t(\"lesson.finishLesson\")}\n </Button>\n ) : (\n <Button\n variant=\"primary\"\n onClick={() => goTo(index + 1)}\n disabled={!currentDone && !reviewing}\n trailing={<ArrowRight aria-hidden />}\n >\n {t(\"common.next\")}\n </Button>\n )}\n </nav>\n <LiveRegion message={announcement} />\n </div>\n );\n}\n\nfunction LessonIntro({\n lesson,\n onStart,\n resumable,\n onResume,\n}: {\n lesson: Lesson;\n onStart: () => void;\n resumable: LessonProgress | null;\n onResume: (p: LessonProgress) => void;\n}) {\n const { t } = useNibblearn();\n const reduced = useReducedMotion();\n const done = resumable ? Object.keys(resumable.results).length : 0;\n return (\n <motion.div\n className={[\"nb-intro\", !lesson.intro.image && \"nb-intro--no-image\"]\n .filter(Boolean)\n .join(\" \")}\n initial={reduced ? false : { opacity: 0, y: 12 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n >\n <div className=\"nb-intro__body\">\n <div className=\"nb-intro__eyebrow\">\n <Badge tone=\"accent\">\n <Layers aria-hidden /> {t(\"lesson.activities\", { count: lesson.modules.length })}\n </Badge>\n {lesson.intro.estimatedMinutes && (\n <Badge>\n <Clock aria-hidden />{\" \"}\n {t(\"lesson.estimated\", { minutes: lesson.intro.estimatedMinutes })}\n </Badge>\n )}\n </div>\n <h1 className=\"nb-intro__title\">{lesson.title}</h1>\n {lesson.description && (\n <p className=\"nb-intro__desc\">\n <RichText text={lesson.description} />\n </p>\n )}\n {lesson.objectives.length > 0 && (\n <div className=\"nb-intro__objectives\">\n <div className=\"nb-intro__objectives-title\">{t(\"lesson.objectives\")}</div>\n <ul>\n {lesson.objectives.map((o, i) => (\n <li key={i} className=\"nb-intro__objective\">\n <Target aria-hidden />\n <span>{o}</span>\n </li>\n ))}\n </ul>\n </div>\n )}\n {resumable ? (\n <div className=\"nb-resume\" role=\"region\">\n <span>\n {t(\"lesson.resume\")} ·{\" \"}\n {t(\"lesson.activity\", {\n current: Math.min(resumable.currentIndex + 1, lesson.modules.length),\n total: lesson.modules.length,\n })}\n {done > 0 ? ` · ${t(\"common.completed\")}: ${done}` : \"\"}\n </span>\n <div className=\"nb-resume__actions\">\n <Button\n variant=\"primary\"\n onClick={() => onResume(resumable)}\n trailing={<ArrowRight aria-hidden />}\n >\n {t(\"common.continue\")}\n </Button>\n <Button variant=\"ghost\" onClick={onStart} leading={<RotateCcw aria-hidden />}>\n {t(\"lesson.startOver\")}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"nb-intro__actions\">\n <Button\n variant=\"primary\"\n size=\"lg\"\n onClick={onStart}\n trailing={<ArrowRight aria-hidden />}\n >\n {lesson.intro.cta ?? t(\"lesson.start\")}\n </Button>\n </div>\n )}\n </div>\n {lesson.intro.image && <SafeImage media={lesson.intro.image} className=\"nb-intro__image\" />}\n </motion.div>\n );\n}\n\nfunction LessonSummary({\n lesson,\n progress,\n score,\n onRetry,\n onReview,\n}: {\n lesson: Lesson;\n progress: LessonProgress;\n score: LessonScore;\n onRetry: () => void;\n onReview: (index: number) => void;\n}) {\n const { t } = useNibblearn();\n const hasScore = score.scoredModules > 0;\n const stats = [\n { label: t(\"common.completed\"), value: `${score.completedModules}/${score.totalModules}` },\n ...(lesson.gamification.points\n ? [{ label: t(\"common.points\"), value: `${score.points}/${score.maxPoints}` }]\n : []),\n ...(hasScore ? [{ label: t(\"common.score\"), value: `${Math.round(score.score * 100)}%` }] : []),\n ];\n return (\n <div className=\"nb-summary\" data-nb-passed={score.passed}>\n <CompletionCard\n title={score.passed ? t(\"lesson.completeTitle\") : t(\"lesson.notPassed\")}\n text={\n score.passed\n ? t(\"lesson.completeBody\", { title: lesson.title })\n : t(\"lesson.notPassedBody\")\n }\n score={hasScore ? score.score : undefined}\n passThreshold={lesson.completion.rule === \"score\" ? lesson.completion.threshold : 0}\n stats={stats}\n onRetry={onRetry}\n retryLabel={t(\"lesson.retryLesson\")}\n >\n <ul className=\"nb-summary__list\" aria-label={t(\"lesson.reviewActivities\")}>\n {lesson.modules.map((m, i) => {\n const r = progress.results[m.id];\n const status = !r\n ? \"todo\"\n : typeof r.score === \"number\"\n ? moduleResultPassed(m, r)\n ? \"pass\"\n : \"fail\"\n : \"done\";\n const title = (m as { title?: string }).title ?? m.id;\n return (\n <li key={m.id}>\n <button\n type=\"button\"\n className=\"nb-summary__item\"\n data-status={status}\n onClick={() => onReview(i)}\n >\n <span className=\"nb-summary__icon\" aria-hidden>\n {status === \"pass\" ? (\n <Check />\n ) : status === \"fail\" ? (\n <X />\n ) : status === \"done\" ? (\n <Sparkles />\n ) : (\n <CircleDot />\n )}\n </span>\n <span className=\"nb-summary__text\">\n <span className=\"nb-summary__title\">{title}</span>\n <span className=\"nb-summary__meta\">{m.type}</span>\n </span>\n {r && typeof r.score === \"number\" && (\n <span className=\"nb-summary__score\">{Math.round(r.score * 100)}%</span>\n )}\n </button>\n </li>\n );\n })}\n </ul>\n </CompletionCard>\n </div>\n );\n}\n\nexport default LessonPlayer;\n"],"mappings":"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"}