@tribepad/themis 1.0.4 → 1.0.6

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.
Files changed (50) hide show
  1. package/dist/elements/MatrixGrid/MatrixGrid.d.ts +31 -0
  2. package/dist/elements/MatrixGrid/MatrixGrid.d.ts.map +1 -0
  3. package/dist/elements/MatrixGrid/MatrixGrid.styles.d.ts +48 -0
  4. package/dist/elements/MatrixGrid/MatrixGrid.styles.d.ts.map +1 -0
  5. package/dist/elements/MatrixGrid/MatrixGrid.types.d.ts +75 -0
  6. package/dist/elements/MatrixGrid/MatrixGrid.types.d.ts.map +1 -0
  7. package/dist/elements/MatrixGrid/index.d.ts +5 -0
  8. package/dist/elements/MatrixGrid/index.d.ts.map +1 -0
  9. package/dist/elements/MatrixGrid/index.js +3 -0
  10. package/dist/elements/MatrixGrid/index.js.map +1 -0
  11. package/dist/elements/MatrixGrid/index.mjs +3 -0
  12. package/dist/elements/MatrixGrid/index.mjs.map +1 -0
  13. package/dist/elements/RatingScale/RatingScale.d.ts +32 -0
  14. package/dist/elements/RatingScale/RatingScale.d.ts.map +1 -0
  15. package/dist/elements/RatingScale/RatingScale.styles.d.ts +52 -0
  16. package/dist/elements/RatingScale/RatingScale.styles.d.ts.map +1 -0
  17. package/dist/elements/RatingScale/RatingScale.types.d.ts +73 -0
  18. package/dist/elements/RatingScale/RatingScale.types.d.ts.map +1 -0
  19. package/dist/elements/RatingScale/index.d.ts +5 -0
  20. package/dist/elements/RatingScale/index.d.ts.map +1 -0
  21. package/dist/elements/RatingScale/index.js +3 -0
  22. package/dist/elements/RatingScale/index.js.map +1 -0
  23. package/dist/elements/RatingScale/index.mjs +3 -0
  24. package/dist/elements/RatingScale/index.mjs.map +1 -0
  25. package/dist/elements/SituationalJudgement/SituationalJudgement.d.ts +36 -0
  26. package/dist/elements/SituationalJudgement/SituationalJudgement.d.ts.map +1 -0
  27. package/dist/elements/SituationalJudgement/SituationalJudgement.styles.d.ts +19 -0
  28. package/dist/elements/SituationalJudgement/SituationalJudgement.styles.d.ts.map +1 -0
  29. package/dist/elements/SituationalJudgement/SituationalJudgement.types.d.ts +67 -0
  30. package/dist/elements/SituationalJudgement/SituationalJudgement.types.d.ts.map +1 -0
  31. package/dist/elements/SituationalJudgement/index.d.ts +5 -0
  32. package/dist/elements/SituationalJudgement/index.d.ts.map +1 -0
  33. package/dist/elements/SituationalJudgement/index.js +3 -0
  34. package/dist/elements/SituationalJudgement/index.js.map +1 -0
  35. package/dist/elements/SituationalJudgement/index.mjs +3 -0
  36. package/dist/elements/SituationalJudgement/index.mjs.map +1 -0
  37. package/dist/elements/index.d.ts +6 -0
  38. package/dist/elements/index.d.ts.map +1 -1
  39. package/dist/elements/index.js +1 -1
  40. package/dist/elements/index.js.map +1 -1
  41. package/dist/elements/index.mjs +1 -1
  42. package/dist/elements/index.mjs.map +1 -1
  43. package/dist/index.js +2 -2
  44. package/dist/index.js.map +1 -1
  45. package/dist/index.mjs +2 -2
  46. package/dist/index.mjs.map +1 -1
  47. package/package.json +5 -2
  48. package/src/elements/MatrixGrid/MatrixGrid.stories.tsx +292 -0
  49. package/src/elements/RatingScale/RatingScale.stories.tsx +379 -0
  50. package/src/elements/SituationalJudgement/SituationalJudgement.stories.tsx +305 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/cn.ts","../../../src/styles/interaction-states.ts","../../../src/elements/RadioGroup/RadioGroup.tsx","../../../src/elements/Accordion/Accordion.tsx","../../../src/elements/SituationalJudgement/SituationalJudgement.styles.ts","../../../src/elements/SituationalJudgement/SituationalJudgement.tsx","../../../src/schemas/BaseComponentProps.ts","../../../src/elements/SituationalJudgement/SituationalJudgement.types.ts"],"names":["cn","inputs","twMerge","clsx","FOCUS_STYLES","HIGH_CONTRAST_FOCUS","RadioGroupContext","createContext","radioGroupVariants","cva","radioItemVariants","radioIndicatorVariants","radioInnerDotVariants","RadioLabel","children","className","jsx","RadioDescription","RadioComponent","value","isDisabled","variant","size","isInvalid","useContext","AriaRadio","renderProps","jsxs","Fragment","Radio","RadioGroup","forwardRef","props","ref","label","description","errorMessage","defaultValue","isReadOnly","isRequired","orientation","name","onChange","onFocusChange","id","ariaLabel","ariaLabelledby","ariaDescribedby","dataTestId","restProps","generatedId","useId","radioGroupId","labelId","descriptionId","errorId","describedByParts","computedAriaDescribedBy","AriaRadioGroup","Label","Text","FieldError","Activity","ReactActivity","mode","AccordionContext","accordionVariants","accordionItemVariants","accordionTriggerVariants","accordionChevronVariants","accordionContentVariants","accordionContentInnerVariants","getHeadingLevel","level","getFirstAccordionItemId","childArray","Children","child","isValidElement","childProps","AccordionRoot","type","collapsible","expandedKeys","defaultExpandedKeys","onExpandedChange","disabledKeys","allowsMultipleExpanded","effectiveDefaultExpandedKeys","useMemo","firstItemId","contextValue","DisclosureGroup","AccordionItemComponent","isDisabledProp","isDisabledFromKeys","Disclosure","composeRenderProps","AccordionTriggerComponent","headingLevel","icon","hideIcon","isExpanded","DisclosureStateContext","Heading","Button","ChevronDown","AccordionContentInner","preserveState","AccordionContentComponent","DisclosurePanel","Accordion","AccordionItem","AccordionTrigger","AccordionContent","sjtContainerVariants","sjtScenarioVariants","sjtOrdinalVariants","ALLOWED_TAGS","sanitiseHtml","html","doc","walkNode","node","escapeHtml","el","tagName","childHtml","result","text","ordinalToLetter","ordinal","SituationalJudgement","scenarioText","collapsibleScenario","responses","groupId","scenarioId","sortedResponses","a","b","sanitisedScenario","response","BaseComponentPropsSchema","z","SJTSizeSchema","SJTResponseSchema","SituationalJudgementPropsSchema","data","values","r"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Class Name Utility\n * Merges Tailwind CSS classes with conflict resolution\n *\n * Combines clsx for conditional classes and tailwind-merge for deduplication\n *\n * @example\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4' (px-4 overrides px-2)\n * cn('text-red-500', condition && 'text-blue-500') // => conditional application\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Global Interaction State Styles\n *\n * Consistent interaction patterns across all Themis components.\n * These styles ensure WCAG 2.2 AAA compliance and predictable UX.\n *\n * @see spec.md FR-010 (Visible focus ring for keyboard navigation)\n * @see spec.md FR-031 (Pressed state feedback)\n * @see spec.md FR-012 (High contrast mode support)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\n/**\n * Focus state styles (FR-010)\n * Visible focus ring for keyboard navigation - WCAG 2.2 Level AAA\n *\n * Components can override by extending these styles:\n * @example\n * cn(FOCUS_STYLES, \"ring-4\") // Increases ring width to 4px\n */\nexport const FOCUS_STYLES = \"data-[focus-visible]:ring-2 data-[focus-visible]:ring-[var(--themis-ring)] data-[focus-visible]:ring-offset-2\";\n\n/**\n * Pressed/Active state styles (FR-031)\n * Visual feedback for press interactions\n *\n * Components can override the scale amount:\n * @example\n * cn(PRESSED_STYLES_BASE, \"data-[pressed]:scale-[0.95]\") // More pronounced scale\n */\nexport const PRESSED_STYLES = \"data-[pressed]:scale-[0.97]\";\n\n/**\n * Base pressed styles without scale (for components that need different feedback)\n */\nexport const PRESSED_STYLES_BASE = \"data-[pressed]:transition-transform data-[pressed]:duration-100\";\n\n/**\n * Hover state styles\n * Elevation change on hover for better affordance\n *\n * Components can override shadow depth:\n * @example\n * cn(HOVER_STYLES_BASE, \"data-[hovered]:shadow-lg\") // Larger shadow\n */\nexport const HOVER_STYLES = \"data-[hovered]:shadow-md\";\n\n/**\n * Base hover styles without shadow (for components that use different hover effects)\n */\nexport const HOVER_STYLES_BASE = \"data-[hovered]:transition-shadow data-[hovered]:duration-200\";\n\n/**\n * High contrast mode focus (FR-012)\n * Enhanced outlines for users requiring high contrast\n *\n * Uses 'hc:' prefix for prefers-contrast: more media query\n */\nexport const HIGH_CONTRAST_FOCUS = \"hc:data-[focus-visible]:outline hc:data-[focus-visible]:outline-4 hc:data-[focus-visible]:outline-offset-2 hc:data-[focus-visible]:outline-foreground\";\n\n/**\n * High contrast mode hover (FR-012)\n * Enhanced outlines for hover in high contrast mode\n */\nexport const HIGH_CONTRAST_HOVER = \"hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground\";\n\n/**\n * High contrast mode pressed state\n * Enhanced outlines for pressed state in high contrast mode\n */\nexport const HIGH_CONTRAST_PRESSED = \"hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground\";\n\n/**\n * Combined high contrast styles\n * Use this for components that need all high contrast interaction states\n */\nexport const HIGH_CONTRAST_INTERACTIONS = `${HIGH_CONTRAST_FOCUS} ${HIGH_CONTRAST_HOVER} ${HIGH_CONTRAST_PRESSED}`;\n\n/**\n * Disabled state styles\n * Consistent disabled appearance across all components\n */\nexport const DISABLED_STYLES = \"disabled:pointer-events-none disabled:opacity-50\";\n\n/**\n * Default interaction bundle\n * Most common combination for interactive components\n *\n * Includes: focus ring, pressed scale, hover shadow, high contrast enhancements\n *\n * @example\n * <button className={cn(DEFAULT_INTERACTIONS, \"bg-primary\")}>Click</button>\n */\nexport const DEFAULT_INTERACTIONS = `${FOCUS_STYLES} ${PRESSED_STYLES} ${HOVER_STYLES} ${HIGH_CONTRAST_FOCUS} ${HIGH_CONTRAST_HOVER} ${HIGH_CONTRAST_PRESSED}`;\n\n/**\n * Subtle interaction bundle\n * For components that need less pronounced feedback\n *\n * Includes: focus ring and high contrast, but no hover shadow or pressed scale\n */\nexport const SUBTLE_INTERACTIONS = `${FOCUS_STYLES} ${HIGH_CONTRAST_FOCUS}`;\n\n/**\n * Non-interactive element styles\n * For elements that should indicate they are not interactive\n */\nexport const NON_INTERACTIVE = \"cursor-default select-none\";\n","\"use client\";\n\n/**\n * RadioGroup Component\n * Accessible single-selection radio group with React Aria primitives and CVA styling\n *\n * Key Features:\n * - Bordered container design with explicit 44px+ touch targets\n * - 2 variants: default, destructive (no outline per clarification)\n * - 3 sizes: sm (44px), default (48px), lg (56px)\n * - Arrow keys move focus AND select (WAI-ARIA standard selection-follows-focus)\n * - Error styling on ALL items (cognitive accessibility)\n * - Spring animation for selection indicator\n * - RTL support (indicator auto-flips)\n * - Radio.Label and Radio.Description sub-components\n *\n * @see radiogroup-prd.md (Product Requirements)\n * @see plan.md (11 Key Clarifications)\n * @see React Aria RadioGroup: https://react-spectrum.adobe.com/react-aria/RadioGroup.html\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AAA)\n */\n\nimport {\n forwardRef,\n createContext,\n useContext,\n useId,\n type ReactNode,\n type ForwardedRef,\n} from 'react';\nimport {\n RadioGroup as AriaRadioGroup,\n Radio as AriaRadio,\n Label,\n Text,\n FieldError,\n} from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { FOCUS_STYLES, HIGH_CONTRAST_FOCUS } from '../../styles/interaction-states';\nimport type {\n RadioGroupProps,\n RadioProps,\n RadioLabelProps,\n RadioDescriptionProps,\n RadioGroupVariant,\n RadioGroupSize,\n} from './RadioGroup.types';\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface RadioGroupContextValue {\n variant: RadioGroupVariant;\n size: RadioGroupSize;\n isInvalid: boolean;\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue>({\n variant: 'default',\n size: 'default',\n isInvalid: false,\n});\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * RadioGroup container variants\n * Controls orientation and spacing (gap-2 = 8px per clarification)\n */\nconst radioGroupVariants = cva(\n // Base: flex container\n \"flex\",\n {\n variants: {\n orientation: {\n vertical: \"flex-col gap-2\",\n horizontal: \"flex-row flex-wrap gap-2\",\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n },\n }\n);\n\n/**\n * Radio item bordered container variants\n * Bordered container design with explicit touch targets\n * All sizes maintain 44px minimum height (WCAG 2.2 AAA)\n * All sizes use rounded-md (6px) per clarification\n */\nconst radioItemVariants = cva(\n // Base: bordered container with flex layout, RTL support\n [\n \"flex items-center gap-3 rounded-md border cursor-pointer\",\n \"transition-colors duration-200\",\n \"rtl:flex-row-reverse\", // RTL: indicator flips to right\n // Focus ring on entire container\n FOCUS_STYLES,\n HIGH_CONTRAST_FOCUS,\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: [\n \"border-[var(--border)]\",\n \"data-[hovered]:bg-[var(--accent)]/10\",\n \"data-[selected]:border-[var(--primary)]\",\n \"data-[selected]:bg-[var(--primary)]/10\",\n ].join(\" \"),\n destructive: [\n \"border-[var(--border)]\",\n \"data-[hovered]:bg-[var(--destructive-background)]/10\",\n \"data-[selected]:border-[var(--destructive-background)]\",\n \"data-[selected]:bg-[var(--destructive-background)]/10\",\n ].join(\" \"),\n },\n size: {\n sm: \"min-h-[44px] py-2 px-3 text-sm\",\n default: \"min-h-[48px] py-3 px-4 text-sm\",\n lg: \"min-h-[56px] py-4 px-5 text-base\",\n },\n isDisabled: {\n true: \"opacity-50 cursor-not-allowed\",\n false: \"\",\n },\n isInvalid: {\n // Error: ALL items get destructive border (cognitive accessibility)\n true: \"border-[var(--destructive-background)]\",\n false: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n isDisabled: false,\n isInvalid: false,\n },\n }\n);\n\n/**\n * Circle indicator (outer ring) variants\n */\nconst radioIndicatorVariants = cva(\n // Base: circle with border, flex-shrink-0 to prevent squishing\n \"flex-shrink-0 rounded-full border-2 flex items-center justify-center transition-colors duration-200\",\n {\n variants: {\n variant: {\n default: [\n \"border-[var(--border)]\",\n \"data-[selected]:border-[var(--primary)]\",\n ].join(\" \"),\n destructive: [\n \"border-[var(--border)]\",\n \"data-[selected]:border-[var(--destructive-background)]\",\n ].join(\" \"),\n },\n size: {\n sm: \"h-4 w-4\",\n default: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\n/**\n * Inner dot variants (appears when selected)\n * Spring animation: cubic-bezier(0.34, 1.56, 0.64, 1) with slight overshoot\n */\nconst radioInnerDotVariants = cva(\n // Base: centered dot with spring animation\n [\n \"rounded-full transition-transform duration-200\",\n // Spring animation with overshoot\n \"[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)]\",\n // Respect reduced motion preference\n \"motion-reduce:transition-none\",\n // Scale from 0 to 1 on selection\n \"scale-0 data-[selected]:scale-100\",\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: \"bg-[var(--primary)]\",\n destructive: \"bg-[var(--destructive-background)]\",\n },\n size: {\n sm: \"h-2 w-2\",\n default: \"h-2.5 w-2.5\",\n lg: \"h-3 w-3\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\n// ============================================================================\n// Sub-components\n// ============================================================================\n\n/**\n * Radio.Label - Styled label for radio item content\n */\nfunction RadioLabel({ children, className }: RadioLabelProps): ReactNode {\n return (\n <span className={cn(\"font-medium text-[var(--content-foreground)]\", className)}>\n {children}\n </span>\n );\n}\n\nRadioLabel.displayName = \"Radio.Label\";\n\n/**\n * Radio.Description - Styled description for radio item content (muted)\n */\nfunction RadioDescription({ children, className }: RadioDescriptionProps): ReactNode {\n return (\n <span className={cn(\"text-sm text-[var(--menu-muted)]\", className)}>\n {children}\n </span>\n );\n}\n\nRadioDescription.displayName = \"Radio.Description\";\n\n// ============================================================================\n// Radio Component\n// ============================================================================\n\n/**\n * Radio item component with bordered container design\n */\nfunction RadioComponent({ value, isDisabled, children, className }: RadioProps): ReactNode {\n const { variant, size, isInvalid } = useContext(RadioGroupContext);\n\n return (\n <AriaRadio\n value={value}\n isDisabled={isDisabled}\n className={(renderProps) =>\n cn(\n radioItemVariants({\n variant,\n size,\n isDisabled: renderProps.isDisabled,\n isInvalid,\n }),\n className\n )\n }\n >\n {(renderProps) => (\n <>\n {/* Circle indicator */}\n <div\n className={radioIndicatorVariants({ variant, size })}\n data-selected={renderProps.isSelected || undefined}\n >\n {/* Inner dot with spring animation */}\n <div\n className={radioInnerDotVariants({ variant, size })}\n data-selected={renderProps.isSelected || undefined}\n />\n </div>\n\n {/* Children content (flexible - text, icons, complex layouts) */}\n <div className=\"flex-1 flex flex-col\">\n {children}\n </div>\n </>\n )}\n </AriaRadio>\n );\n}\n\n// Attach sub-components\nconst Radio = Object.assign(RadioComponent, {\n Label: RadioLabel,\n Description: RadioDescription,\n}) as typeof RadioComponent & {\n Label: typeof RadioLabel;\n Description: typeof RadioDescription;\n displayName: string;\n};\n\nRadio.displayName = \"Radio\";\n\n// ============================================================================\n// RadioGroup Component\n// ============================================================================\n\n/**\n * RadioGroup root component\n * Accessible single-selection control with bordered container design\n */\nconst RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\n function RadioGroup(props: RadioGroupProps, ref: ForwardedRef<HTMLDivElement>) {\n const {\n // Display props\n label,\n description,\n errorMessage,\n // Selection props\n value,\n defaultValue,\n // State props\n isDisabled = false,\n isReadOnly = false,\n isRequired = false,\n isInvalid = false,\n // Layout props\n orientation = 'vertical',\n // Variant props\n variant = 'default',\n size = 'default',\n // Form props\n name,\n // Event handlers\n onChange,\n onFocusChange,\n // Standard props\n className,\n children,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n 'data-testid': dataTestId,\n ...restProps\n } = props;\n\n // Generate unique IDs for accessibility\n const generatedId = useId();\n const radioGroupId = id ?? generatedId;\n const labelId = `${radioGroupId}-label`;\n const descriptionId = `${radioGroupId}-description`;\n const errorId = `${radioGroupId}-error`;\n\n // Build aria-describedby from description and error\n const describedByParts: string[] = [];\n if (ariaDescribedby) describedByParts.push(ariaDescribedby);\n if (description) describedByParts.push(descriptionId);\n if (isInvalid && errorMessage) describedByParts.push(errorId);\n const computedAriaDescribedBy = describedByParts.length > 0\n ? describedByParts.join(' ')\n : undefined;\n\n return (\n <RadioGroupContext.Provider value={{ variant, size, isInvalid }}>\n <AriaRadioGroup\n ref={ref}\n id={radioGroupId}\n name={name}\n value={value ?? undefined}\n defaultValue={defaultValue ?? undefined}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isRequired={isRequired}\n isInvalid={isInvalid}\n orientation={orientation}\n onChange={onChange}\n onFocusChange={onFocusChange}\n aria-label={ariaLabel}\n aria-labelledby={label ? labelId : ariaLabelledby}\n aria-describedby={computedAriaDescribedBy}\n data-testid={dataTestId}\n data-orientation={orientation}\n className={cn(\"flex flex-col gap-1.5\", className)}\n {...restProps}\n >\n {/* Label with optional required asterisk */}\n {label && (\n <Label id={labelId} className=\"text-sm font-medium text-[var(--content-foreground)]\">\n {label}\n {isRequired && (\n <span className=\"ml-1 text-[var(--destructive-background)]\" aria-hidden=\"true\">\n *\n </span>\n )}\n </Label>\n )}\n\n {/* Description */}\n {description && (\n <Text\n id={descriptionId}\n slot=\"description\"\n className=\"text-sm text-[var(--menu-muted)]\"\n >\n {description}\n </Text>\n )}\n\n {/* Radio items container with orientation */}\n <div className={radioGroupVariants({ orientation })}>\n {children}\n </div>\n\n {/* Error message with role=\"alert\" for screen reader announcements */}\n {isInvalid && errorMessage && (\n <FieldError\n id={errorId}\n className=\"text-sm text-[var(--destructive-background)]\"\n >\n <span role=\"alert\">{errorMessage}</span>\n </FieldError>\n )}\n </AriaRadioGroup>\n </RadioGroupContext.Provider>\n );\n }\n);\n\nRadioGroup.displayName = \"RadioGroup\";\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n RadioGroup,\n Radio,\n radioGroupVariants,\n radioItemVariants,\n radioIndicatorVariants,\n radioInnerDotVariants,\n};\n","'use client';\n\n/**\n * Accordion Component - Implementation\n *\n * Accessible accordion/disclosure group component combining React Aria primitives with CVA styling.\n * Follows Themis library patterns with compound component structure and direct named exports.\n *\n * Key Features:\n * - React Aria DisclosureGroup for full accessibility (WCAG 2.2 AAA)\n * - CVA variants for consistent styling\n * - React 19.2 Activity API for state preservation (preserveState prop)\n * - Single/Multiple expansion modes\n * - Controlled and uncontrolled state management\n * - Configurable heading levels for document structure\n * - Custom icon support\n *\n * @see accordion-prd.md (Full requirements)\n * @see Accordion.types.ts (Zod schemas)\n * @see plan.md (Implementation approach)\n */\n\n// React 19.2 Activity API - may not be available in all builds\n// Import conditionally to support environments where Activity is unavailable\nimport {\n Activity as ReactActivity,\n type ReactNode,\n type ReactElement,\n useMemo,\n useContext,\n createContext,\n Children,\n isValidElement,\n} from 'react';\n\n// Activity component with fallback for environments where it's not available\n// The fallback simply renders children directly - no state preservation when Activity unavailable\nconst Activity = ReactActivity ?? function ActivityFallback({\n children,\n mode,\n}: {\n children: ReactNode;\n mode: 'visible' | 'hidden';\n}): ReactElement {\n return <div data-activity-mode={mode}>{children}</div>;\n};\n\nimport {\n DisclosureGroup,\n Disclosure,\n DisclosurePanel,\n Heading,\n Button,\n composeRenderProps,\n DisclosureStateContext,\n type Key as AriaKey,\n} from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { ChevronDown } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type {\n AccordionProps,\n AccordionItemProps,\n AccordionTriggerProps,\n AccordionContentProps,\n HeadingLevel,\n} from './Accordion.types';\n\n// ============================================================================\n// Context for disabledKeys\n// ============================================================================\n\n/**\n * Context to pass disabledKeys from Accordion to AccordionItem\n * Since DisclosureGroup doesn't support disabledKeys directly, we handle it via context\n */\ninterface AccordionContextValue {\n disabledKeys?: (string | number)[];\n}\n\nconst AccordionContext = createContext<AccordionContextValue>({});\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * Accordion root CVA variants\n *\n * @see accordion-prd.md FR-001 (Accordion Root)\n */\nexport const accordionVariants = cva('w-full', {\n variants: {},\n defaultVariants: {},\n});\n\n/**\n * AccordionItem CVA variants\n *\n * @see accordion-prd.md FR-002 (AccordionItem)\n * @see accordion-prd.md DS-001 (Visual Design - borders)\n */\nexport const accordionItemVariants = cva(\n [\n 'border-b border-[var(--border)]',\n // Last item has no border (handled by last:border-b-0)\n 'last:border-b-0',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * AccordionTrigger CVA variants\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger)\n * @see accordion-prd.md AR-006 (Touch Target Size - 44x44px)\n * @see accordion-prd.md DS-002 (Typography)\n */\nexport const accordionTriggerVariants = cva(\n [\n // Layout\n 'flex flex-1 items-center justify-between py-4 font-medium w-full',\n // Text styling\n 'text-sm text-[var(--content-foreground)]',\n // Hover state\n 'hover:underline',\n // Focus visible ring (WCAG 2.4.13)\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2',\n 'focus-visible:ring-offset-[var(--content-background)]',\n // WCAG 2.2 AAA: 44px minimum touch target\n 'min-h-[44px]',\n // Disabled state\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n // Transition for smooth interactions\n 'transition-all',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * Chevron icon CVA variants\n *\n * @see accordion-prd.md FR-010 (Animated Transitions)\n */\nexport const accordionChevronVariants = cva(\n [\n 'h-4 w-4 shrink-0',\n 'text-[var(--menu-muted)]',\n // Smooth rotation transition\n 'transition-transform duration-200 ease-out',\n // Reduced motion support\n 'motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n isExpanded: {\n true: 'rotate-180',\n false: 'rotate-0',\n },\n },\n defaultVariants: {\n isExpanded: false,\n },\n }\n);\n\n/**\n * AccordionContent CVA variants\n *\n * @see accordion-prd.md FR-004 (AccordionContent)\n * @see accordion-prd.md FR-010 (Animated Transitions)\n */\nexport const accordionContentVariants = cva(\n [\n 'overflow-hidden',\n 'text-sm text-[var(--menu-muted)]',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * AccordionContent inner wrapper CVA variants\n */\nexport const accordionContentInnerVariants = cva('pb-4 pt-0', {\n variants: {},\n defaultVariants: {},\n});\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Convert heading level string to number for React Aria Heading\n */\nfunction getHeadingLevel(level: HeadingLevel): 1 | 2 | 3 | 4 | 5 | 6 {\n const levelMap: Record<HeadingLevel, 1 | 2 | 3 | 4 | 5 | 6> = {\n h1: 1,\n h2: 2,\n h3: 3,\n h4: 4,\n h5: 5,\n h6: 6,\n };\n return levelMap[level];\n}\n\n/**\n * Get the first AccordionItem id from children\n * Used for auto-expanding first item when collapsible={false}\n */\nfunction getFirstAccordionItemId(children: ReactNode): AriaKey | undefined {\n const childArray = Children.toArray(children);\n for (const child of childArray) {\n if (isValidElement(child)) {\n const childProps = child.props as Record<string, unknown>;\n if (childProps && typeof childProps === 'object' && 'id' in childProps) {\n return childProps.id as AriaKey;\n }\n }\n }\n return undefined;\n}\n\n// ============================================================================\n// Components\n// ============================================================================\n\n/**\n * Accordion Root Component\n *\n * Container for accordion items. Manages expansion state and provides\n * context to child components.\n *\n * @see accordion-prd.md FR-001 (Accordion Root Component)\n * @see accordion-prd.md FR-005 (Single Expansion Mode)\n * @see accordion-prd.md FR-006 (Multiple Expansion Mode)\n * @see accordion-prd.md FR-007 (Controlled Mode)\n * @see accordion-prd.md FR-008 (Uncontrolled Mode)\n *\n * @example\n * // Uncontrolled single mode\n * <Accordion type=\"single\" collapsible>\n * <AccordionItem id=\"item-1\">\n * <AccordionTrigger>Section 1</AccordionTrigger>\n * <AccordionContent>Content 1</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n *\n * @example\n * // Controlled multiple mode\n * <Accordion\n * type=\"multiple\"\n * expandedKeys={expandedKeys}\n * onExpandedChange={setExpandedKeys}\n * >\n * ...\n * </Accordion>\n */\nfunction AccordionRoot({\n type = 'single',\n collapsible = false,\n expandedKeys,\n defaultExpandedKeys,\n onExpandedChange,\n isDisabled = false,\n disabledKeys,\n className,\n children,\n ...props\n}: AccordionProps) {\n // Map type prop to React Aria's allowsMultipleExpanded\n const allowsMultipleExpanded = type === 'multiple';\n\n // Auto-expand first item when collapsible={false} and no default provided\n // This ensures one item is always expanded in non-collapsible single mode\n const effectiveDefaultExpandedKeys = useMemo(() => {\n if (!collapsible && type === 'single' && !defaultExpandedKeys && !expandedKeys) {\n const firstItemId = getFirstAccordionItemId(children);\n return firstItemId ? [firstItemId] : undefined;\n }\n return defaultExpandedKeys;\n }, [collapsible, type, defaultExpandedKeys, expandedKeys, children]);\n\n // Context value for passing disabledKeys to AccordionItem\n const contextValue = useMemo(\n () => ({ disabledKeys }),\n [disabledKeys]\n );\n\n return (\n <AccordionContext.Provider value={contextValue}>\n <DisclosureGroup\n allowsMultipleExpanded={allowsMultipleExpanded}\n expandedKeys={expandedKeys as Set<AriaKey> | undefined}\n defaultExpandedKeys={effectiveDefaultExpandedKeys as Iterable<AriaKey> | undefined}\n onExpandedChange={onExpandedChange as ((keys: Set<AriaKey>) => void) | undefined}\n isDisabled={isDisabled}\n className={cn(accordionVariants(), className)}\n {...props}\n >\n {children}\n </DisclosureGroup>\n </AccordionContext.Provider>\n );\n}\n\nAccordionRoot.displayName = 'Accordion';\n\n/**\n * AccordionItem Component\n *\n * Wrapper for each expandable disclosure section.\n *\n * @see accordion-prd.md FR-002 (AccordionItem Component)\n *\n * @example\n * <AccordionItem id=\"faq-1\" isDisabled={!isAuthenticated}>\n * <AccordionTrigger>Members-only FAQ</AccordionTrigger>\n * <AccordionContent>This content is for members only.</AccordionContent>\n * </AccordionItem>\n */\nfunction AccordionItemComponent({\n id,\n isDisabled: isDisabledProp,\n className,\n children,\n ...props\n}: AccordionItemProps) {\n // Check if this item is in the disabledKeys array\n const { disabledKeys } = useContext(AccordionContext);\n const isDisabledFromKeys = disabledKeys?.includes(id as string | number) ?? false;\n const isDisabled = isDisabledProp || isDisabledFromKeys;\n\n return (\n <Disclosure\n id={id}\n isDisabled={isDisabled}\n className={composeRenderProps(className, (className) =>\n cn(accordionItemVariants(), className)\n )}\n {...props}\n >\n {children}\n </Disclosure>\n );\n}\n\nAccordionItemComponent.displayName = 'AccordionItem';\n\n/**\n * AccordionTrigger Component\n *\n * Clickable button that toggles accordion content visibility.\n * Wrapped in a Heading for proper document structure.\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger Component)\n * @see accordion-prd.md AR-002 (ARIA Attributes)\n * @see accordion-prd.md AR-003 (Keyboard Navigation)\n *\n * @example\n * // Default with chevron\n * <AccordionTrigger>Is it accessible?</AccordionTrigger>\n *\n * @example\n * // Custom heading level\n * <AccordionTrigger as=\"h2\">Important Section</AccordionTrigger>\n *\n * @example\n * // Custom icon\n * <AccordionTrigger icon={<PlusIcon className=\"h-4 w-4\" />}>\n * Click to expand\n * </AccordionTrigger>\n */\nfunction AccordionTriggerComponent({\n as: headingLevel = 'h3',\n icon,\n hideIcon = false,\n className,\n children,\n ...props\n}: AccordionTriggerProps) {\n // Access disclosure state from context\n const state = useContext(DisclosureStateContext);\n const isExpanded = state?.isExpanded ?? false;\n\n return (\n <Heading level={getHeadingLevel(headingLevel)}>\n <Button\n slot=\"trigger\"\n className={composeRenderProps(className, (className) =>\n cn(accordionTriggerVariants(), className)\n )}\n {...props}\n >\n <span className=\"flex-1 text-left\">{children}</span>\n {!hideIcon && (\n icon ?? (\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(accordionChevronVariants({ isExpanded }))}\n />\n )\n )}\n </Button>\n </Heading>\n );\n}\n\nAccordionTriggerComponent.displayName = 'AccordionTrigger';\n\n/**\n * AccordionContent Component\n *\n * Expandable container for accordion content.\n * Supports animated height transitions and React Activity state preservation.\n *\n * @see accordion-prd.md FR-004 (AccordionContent Component)\n * @see accordion-prd.md FR-010 (Animated Transitions)\n *\n * @example\n * // Standard content\n * <AccordionContent>\n * Yes. It adheres to the WAI-ARIA design pattern.\n * </AccordionContent>\n *\n * @example\n * // With state preservation\n * <AccordionContent preserveState>\n * <form>\n * <input name=\"email\" />\n * </form>\n * </AccordionContent>\n */\n/**\n * Inner component for AccordionContent with state preservation\n * Uses DisclosureStateContext to get isExpanded state\n */\nfunction AccordionContentInner({\n preserveState,\n children,\n}: {\n preserveState: boolean;\n children: ReactNode;\n}) {\n const state = useContext(DisclosureStateContext);\n const isExpanded = state?.isExpanded ?? false;\n\n if (preserveState) {\n return (\n <Activity mode={isExpanded ? 'visible' : 'hidden'}>\n <div className={accordionContentInnerVariants()}>{children}</div>\n </Activity>\n );\n }\n\n return <div className={accordionContentInnerVariants()}>{children}</div>;\n}\n\nfunction AccordionContentComponent({\n preserveState = false,\n className,\n children,\n ...props\n}: AccordionContentProps) {\n return (\n <DisclosurePanel\n className={composeRenderProps(className, (className) =>\n cn(accordionContentVariants(), 'animate-accordion', className)\n )}\n {...props}\n >\n <AccordionContentInner preserveState={preserveState}>\n {children}\n </AccordionContentInner>\n </DisclosurePanel>\n );\n}\n\nAccordionContentComponent.displayName = 'AccordionContent';\n\n// ============================================================================\n// Exports\n// ============================================================================\n\n/**\n * Direct named exports (not Object.assign compound pattern)\n *\n * Accordion follows React Aria's direct export pattern because:\n * - Simpler structure (only 4 components)\n * - Better tree-shaking with named exports\n * - Clearer imports: import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from '...'\n */\nexport const Accordion = AccordionRoot;\nexport const AccordionItem = AccordionItemComponent;\nexport const AccordionTrigger = AccordionTriggerComponent;\nexport const AccordionContent = AccordionContentComponent;\n\n// Re-export types for convenience\nexport type {\n AccordionProps,\n AccordionItemProps,\n AccordionTriggerProps,\n AccordionContentProps,\n};\n","import { cva } from 'class-variance-authority';\n\n/**\n * SituationalJudgement CVA Variant Definitions\n *\n * Minimal styling since this component composes existing RadioGroup, Radio,\n * and Accordion components. These variants cover the container and scenario panel.\n */\n\n// =============================================================================\n// Container\n// =============================================================================\n\n/** Root wrapper */\nexport const sjtContainerVariants = cva(\"flex flex-col gap-3\", {\n variants: {\n size: {\n sm: \"text-sm\",\n default: \"text-sm\",\n lg: \"text-base\",\n },\n },\n defaultVariants: { size: \"default\" },\n});\n\n// =============================================================================\n// Scenario Panel\n// =============================================================================\n\n/** Scenario text panel (non-collapsible mode) */\nexport const sjtScenarioVariants = cva(\n [\n \"rounded-md border border-[var(--border)]\",\n \"bg-[var(--muted)] text-[var(--content-foreground)]\",\n ].join(\" \"),\n {\n variants: {\n size: {\n sm: \"p-3 text-sm\",\n default: \"p-4 text-sm\",\n lg: \"p-5 text-base\",\n },\n },\n defaultVariants: { size: \"default\" },\n }\n);\n\n/** Ordinal letter label (\"A.\", \"B.\", etc.) */\nexport const sjtOrdinalVariants = cva(\n \"font-semibold text-[var(--muted-foreground)] flex-shrink-0\",\n {\n variants: {\n size: {\n sm: \"text-xs w-5\",\n default: \"text-sm w-6\",\n lg: \"text-base w-7\",\n },\n },\n defaultVariants: { size: \"default\" },\n }\n);\n","\"use client\";\n\n/**\n * SituationalJudgement Component\n *\n * Assessment component presenting a scenario with 3-6 response options.\n * Composes existing Themis RadioGroup + Radio for response selection\n * and Accordion for collapsible scenario panel.\n *\n * Features:\n * - HTML scenario text with built-in sanitiser (XSS protection)\n * - Collapsible scenario via Accordion\n * - Responses sorted by ordinal, labeled with letters (A, B, C, ...)\n * - Standard radio group behaviour (no deselection)\n *\n * @see WCAG 2.2 AAA — 44x44px touch targets, keyboard navigation\n */\n\nimport {\n forwardRef,\n useId,\n useMemo,\n type ForwardedRef,\n} from 'react';\nimport { Label, Text } from 'react-aria-components';\nimport { cn } from '../../utils/cn';\nimport { RadioGroup, Radio } from '../RadioGroup/RadioGroup';\nimport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n} from '../Accordion/Accordion';\nimport type { SituationalJudgementProps, SJTResponse } from './SituationalJudgement.types';\nimport {\n sjtContainerVariants,\n sjtScenarioVariants,\n sjtOrdinalVariants,\n} from './SituationalJudgement.styles';\n\n// =============================================================================\n// HTML Sanitiser\n// =============================================================================\n\nconst ALLOWED_TAGS = new Set([\n 'b', 'strong', 'i', 'em', 'ul', 'ol', 'li', 'p', 'br',\n]);\n\n/**\n * Sanitise HTML string using DOMParser.\n * Only preserves allowed tags, strips ALL attributes.\n * Returns clean HTML safe for dangerouslySetInnerHTML.\n */\nfunction sanitiseHtml(html: string): string {\n if (typeof window === 'undefined' || typeof DOMParser === 'undefined') {\n // SSR fallback: strip all HTML tags\n return html.replace(/<[^>]*>/g, '');\n }\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n\n function walkNode(node: Node): string {\n if (node.nodeType === Node.TEXT_NODE) {\n return escapeHtml(node.textContent ?? '');\n }\n\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n const tagName = el.tagName.toLowerCase();\n\n if (!ALLOWED_TAGS.has(tagName)) {\n // Strip disallowed tag but process children\n let childHtml = '';\n for (const child of Array.from(el.childNodes)) {\n childHtml += walkNode(child);\n }\n return childHtml;\n }\n\n // Allowed tag — render without attributes\n let childHtml = '';\n for (const child of Array.from(el.childNodes)) {\n childHtml += walkNode(child);\n }\n\n if (tagName === 'br') {\n return '<br />';\n }\n\n return `<${tagName}>${childHtml}</${tagName}>`;\n }\n\n return '';\n }\n\n let result = '';\n for (const child of Array.from(doc.body.childNodes)) {\n result += walkNode(child);\n }\n return result;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/** Convert ordinal index to letter: 0 → \"A\", 1 → \"B\", etc. */\nfunction ordinalToLetter(ordinal: number): string {\n return String.fromCharCode(65 + ordinal);\n}\n\n// =============================================================================\n// SituationalJudgement Component\n// =============================================================================\n\nconst SituationalJudgement = forwardRef<HTMLDivElement, SituationalJudgementProps>(\n function SituationalJudgement(\n props: SituationalJudgementProps,\n ref: ForwardedRef<HTMLDivElement>,\n ) {\n const {\n // Value\n value,\n onChange,\n // Scenario\n scenarioText,\n collapsibleScenario = false,\n // Responses\n responses,\n // Labels\n label,\n description,\n errorMessage,\n // State\n isRequired = false,\n isDisabled = false,\n isReadOnly = false,\n isInvalid = false,\n // Sizing\n size = 'default',\n // Standard\n className,\n id,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedby,\n 'data-testid': dataTestId,\n } = props;\n\n const generatedId = useId();\n const groupId = id ?? generatedId;\n const labelId = `${groupId}-label`;\n const descriptionId = `${groupId}-description`;\n const errorId = `${groupId}-error`;\n const scenarioId = `${groupId}-scenario`;\n\n const describedByParts: string[] = [];\n if (ariaDescribedby) describedByParts.push(ariaDescribedby);\n if (description) describedByParts.push(descriptionId);\n if (scenarioText) describedByParts.push(scenarioId);\n if (isInvalid && errorMessage) describedByParts.push(errorId);\n\n // Sort responses by ordinal\n const sortedResponses = useMemo(\n () => [...responses].sort((a, b) => a.ordinal - b.ordinal),\n [responses],\n );\n\n // Sanitise scenario HTML\n const sanitisedScenario = useMemo(\n () => sanitiseHtml(scenarioText),\n [scenarioText],\n );\n\n return (\n <div\n ref={ref}\n id={groupId}\n aria-label={ariaLabel}\n aria-labelledby={label ? labelId : undefined}\n data-testid={dataTestId}\n className={cn(sjtContainerVariants({ size }), className)}\n >\n {/* Label */}\n {label && (\n <Label id={labelId} className=\"text-sm font-medium text-[var(--content-foreground)]\">\n {label}\n {isRequired && (\n <span className=\"ml-1 text-[var(--destructive-background)]\" aria-hidden=\"true\">\n *\n </span>\n )}\n </Label>\n )}\n\n {/* Description */}\n {description && (\n <Text\n id={descriptionId}\n slot=\"description\"\n className=\"text-sm text-[var(--menu-muted)]\"\n >\n {description}\n </Text>\n )}\n\n {/* Scenario Panel */}\n {collapsibleScenario ? (\n <Accordion type=\"single\" collapsible isDisabled={false} defaultExpandedKeys={['scenario']}>\n <AccordionItem id=\"scenario\">\n <AccordionTrigger as=\"h3\" hideIcon={false}>Scenario</AccordionTrigger>\n <AccordionContent preserveState={false}>\n <div\n id={scenarioId}\n className={sjtScenarioVariants({ size })}\n dangerouslySetInnerHTML={{ __html: sanitisedScenario }}\n />\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n ) : (\n <div\n id={scenarioId}\n role=\"document\"\n className={sjtScenarioVariants({ size })}\n dangerouslySetInnerHTML={{ __html: sanitisedScenario }}\n />\n )}\n\n {/* Response options via existing RadioGroup + Radio */}\n <RadioGroup\n label={undefined}\n aria-label={label ? undefined : ariaLabel}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={describedByParts.length > 0 ? describedByParts.join(' ') : undefined}\n value={value ?? undefined}\n onChange={onChange}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isRequired={isRequired}\n isInvalid={isInvalid}\n orientation=\"vertical\"\n variant=\"default\"\n size={size}\n >\n {sortedResponses.map((response: SJTResponse) => (\n <Radio key={response.value} value={response.value} isDisabled={false}>\n <div className=\"flex items-start gap-2\">\n <span className={sjtOrdinalVariants({ size })}>\n {ordinalToLetter(response.ordinal)}.\n </span>\n <span className=\"flex-1\">{response.text}</span>\n </div>\n </Radio>\n ))}\n </RadioGroup>\n\n {/* Error message */}\n {isInvalid && errorMessage && (\n <div\n id={errorId}\n role=\"alert\"\n className=\"text-sm text-[var(--destructive-background)]\"\n >\n {errorMessage}\n </div>\n )}\n </div>\n );\n },\n);\n\nSituationalJudgement.displayName = \"SituationalJudgement\";\n\nexport { SituationalJudgement, sanitiseHtml };\n","import { z } from 'zod';\n\n/**\n * Base props schema for all Themis components\n * Ensures consistent accessibility and styling APIs across the library\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements)\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AA minimum)\n */\nexport const BaseComponentPropsSchema = z.object({\n // Styling\n className: z.string().optional(),\n\n // React\n children: z.any().optional(), // ReactNode not directly supported by Zod\n id: z.string().optional(),\n\n // Accessibility (WCAG 2.2 AA requirements)\n 'aria-label': z.string().optional(),\n 'aria-labelledby': z.string().optional(),\n 'aria-describedby': z.string().optional(),\n 'aria-live': z.enum(['off', 'polite', 'assertive']).optional(),\n 'aria-hidden': z.boolean().optional(),\n\n // Testing & Development\n 'data-testid': z.string().optional(),\n});\n\nexport type BaseComponentProps = z.infer<typeof BaseComponentPropsSchema>;\n","import { z } from 'zod';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\n\n/**\n * SituationalJudgement size schema\n */\nexport const SJTSizeSchema = z.enum(['sm', 'default', 'lg']);\nexport type SJTSize = z.infer<typeof SJTSizeSchema>;\n\n/**\n * Individual response option schema\n */\nexport const SJTResponseSchema = z.object({\n value: z.string(),\n text: z.string(),\n ordinal: z.number(),\n});\n\nexport type SJTResponse = z.infer<typeof SJTResponseSchema>;\n\n/**\n * SituationalJudgement props schema\n *\n * Assessment component presenting a scenario with 3-6 response options.\n * Composes existing RadioGroup + Radio for response selection\n * and Accordion for collapsible scenario panel.\n *\n * Uses .refine() to enforce unique response values — requires getShape()\n * helper from test-utils.ts in contract tests.\n */\nexport const SituationalJudgementPropsSchema = BaseComponentPropsSchema.extend({\n // Value — the selected response value\n value: z.string().nullable().optional(),\n onChange: z.custom<(value: string) => void>().optional(),\n\n // Scenario\n scenarioText: z.string(),\n collapsibleScenario: z.boolean().optional().default(false),\n\n // Responses (3-6 options)\n responses: z.array(SJTResponseSchema).min(3).max(6),\n\n // Labels\n label: z.string().optional(),\n description: z.string().optional(),\n errorMessage: z.string().optional(),\n\n // State\n isRequired: z.boolean().optional().default(false),\n isDisabled: z.boolean().optional().default(false),\n isReadOnly: z.boolean().optional().default(false),\n isInvalid: z.boolean().optional().default(false),\n\n // Sizing\n size: SJTSizeSchema.optional().default('default'),\n}).refine(\n (data) => {\n const values = data.responses.map((r) => r.value);\n return new Set(values).size === values.length;\n },\n { message: 'Response values must be unique', path: ['responses'] },\n);\n\nexport type SituationalJudgementProps = z.infer<typeof SituationalJudgementPropsSchema>;\n"]}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import {createContext,forwardRef,useId,useMemo,useContext,Children,isValidElement,Activity}from'react';import {RadioGroup,Label,Text,FieldError,Radio,DisclosureGroup,Disclosure,composeRenderProps,DisclosureStateContext,Heading,Button,DisclosurePanel}from'react-aria-components';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {cva}from'class-variance-authority';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {ChevronDown}from'lucide-react';import {z}from'zod';function c(...e){return twMerge(clsx(e))}var O="data-[focus-visible]:ring-2 data-[focus-visible]:ring-[var(--themis-ring)] data-[focus-visible]:ring-offset-2";var P="hc:data-[focus-visible]:outline hc:data-[focus-visible]:outline-4 hc:data-[focus-visible]:outline-offset-2 hc:data-[focus-visible]:outline-foreground";var ee=createContext({variant:"default",size:"default",isInvalid:false}),Ge=cva("flex",{variants:{orientation:{vertical:"flex-col gap-2",horizontal:"flex-row flex-wrap gap-2"}},defaultVariants:{orientation:"vertical"}}),He=cva(["flex items-center gap-3 rounded-md border cursor-pointer","transition-colors duration-200","rtl:flex-row-reverse",O,P].join(" "),{variants:{variant:{default:["border-[var(--border)]","data-[hovered]:bg-[var(--accent)]/10","data-[selected]:border-[var(--primary)]","data-[selected]:bg-[var(--primary)]/10"].join(" "),destructive:["border-[var(--border)]","data-[hovered]:bg-[var(--destructive-background)]/10","data-[selected]:border-[var(--destructive-background)]","data-[selected]:bg-[var(--destructive-background)]/10"].join(" ")},size:{sm:"min-h-[44px] py-2 px-3 text-sm",default:"min-h-[48px] py-3 px-4 text-sm",lg:"min-h-[56px] py-4 px-5 text-base"},isDisabled:{true:"opacity-50 cursor-not-allowed",false:""},isInvalid:{true:"border-[var(--destructive-background)]",false:""}},defaultVariants:{variant:"default",size:"default",isDisabled:false,isInvalid:false}}),Oe=cva("flex-shrink-0 rounded-full border-2 flex items-center justify-center transition-colors duration-200",{variants:{variant:{default:["border-[var(--border)]","data-[selected]:border-[var(--primary)]"].join(" "),destructive:["border-[var(--border)]","data-[selected]:border-[var(--destructive-background)]"].join(" ")},size:{sm:"h-4 w-4",default:"h-5 w-5",lg:"h-6 w-6"}},defaultVariants:{variant:"default",size:"default"}}),_e=cva(["rounded-full transition-transform duration-200","[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)]","motion-reduce:transition-none","scale-0 data-[selected]:scale-100"].join(" "),{variants:{variant:{default:"bg-[var(--primary)]",destructive:"bg-[var(--destructive-background)]"},size:{sm:"h-2 w-2",default:"h-2.5 w-2.5",lg:"h-3 w-3"}},defaultVariants:{variant:"default",size:"default"}});function te({children:e,className:t}){return jsx("span",{className:c("font-medium text-[var(--content-foreground)]",t),children:e})}te.displayName="Radio.Label";function ae({children:e,className:t}){return jsx("span",{className:c("text-sm text-[var(--menu-muted)]",t),children:e})}ae.displayName="Radio.Description";function Je({value:e,isDisabled:t,children:o,className:a}){let{variant:i,size:r,isInvalid:l}=useContext(ee);return jsx(Radio,{value:e,isDisabled:t,className:n=>c(He({variant:i,size:r,isDisabled:n.isDisabled,isInvalid:l}),a),children:n=>jsxs(Fragment,{children:[jsx("div",{className:Oe({variant:i,size:r}),"data-selected":n.isSelected||void 0,children:jsx("div",{className:_e({variant:i,size:r}),"data-selected":n.isSelected||void 0})}),jsx("div",{className:"flex-1 flex flex-col",children:o})]})})}var B=Object.assign(Je,{Label:te,Description:ae});B.displayName="Radio";var K=forwardRef(function(t,o){let{label:a,description:i,errorMessage:r,value:l,defaultValue:n,isDisabled:s=false,isReadOnly:u=false,isRequired:b=false,isInvalid:x=false,orientation:S="vertical",variant:A="default",size:I="default",name:y,onChange:j,onFocusChange:$,className:L,children:w,id:k,"aria-label":M,"aria-labelledby":R,"aria-describedby":T,"data-testid":z,...G}=t,D=useId(),m=k??D,H=`${m}-label`,E=`${m}-description`,h=`${m}-error`,N=[];T&&N.push(T),i&&N.push(E),x&&r&&N.push(h);let ye=N.length>0?N.join(" "):void 0;return jsx(ee.Provider,{value:{variant:A,size:I,isInvalid:x},children:jsxs(RadioGroup,{ref:o,id:m,name:y,value:l??void 0,defaultValue:n??void 0,isDisabled:s,isReadOnly:u,isRequired:b,isInvalid:x,orientation:S,onChange:j,onFocusChange:$,"aria-label":M,"aria-labelledby":a?H:R,"aria-describedby":ye,"data-testid":z,"data-orientation":S,className:c("flex flex-col gap-1.5",L),...G,children:[a&&jsxs(Label,{id:H,className:"text-sm font-medium text-[var(--content-foreground)]",children:[a,b&&jsx("span",{className:"ml-1 text-[var(--destructive-background)]","aria-hidden":"true",children:"*"})]}),i&&jsx(Text,{id:E,slot:"description",className:"text-sm text-[var(--menu-muted)]",children:i}),jsx("div",{className:Ge({orientation:S}),children:w}),x&&r&&jsx(FieldError,{id:h,className:"text-sm text-[var(--destructive-background)]",children:jsx("span",{role:"alert",children:r})})]})})});K.displayName="RadioGroup";var Be=Activity??function({children:t,mode:o}){return jsx("div",{"data-activity-mode":o,children:t})},ne=createContext({}),Qe=cva("w-full",{variants:{},defaultVariants:{}}),Ze=cva(["border-b border-[var(--border)]","last:border-b-0"].join(" "),{variants:{},defaultVariants:{}}),et=cva(["flex flex-1 items-center justify-between py-4 font-medium w-full","text-sm text-[var(--content-foreground)]","hover:underline","focus-visible:outline-none focus-visible:ring-2","focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2","focus-visible:ring-offset-[var(--content-background)]","min-h-[44px]","data-[disabled]:pointer-events-none data-[disabled]:opacity-50","transition-all"].join(" "),{variants:{},defaultVariants:{}}),tt=cva(["h-4 w-4 shrink-0","text-[var(--menu-muted)]","transition-transform duration-200 ease-out","motion-reduce:transition-none"].join(" "),{variants:{isExpanded:{true:"rotate-180",false:"rotate-0"}},defaultVariants:{isExpanded:false}}),at=cva(["overflow-hidden","text-sm text-[var(--menu-muted)]"].join(" "),{variants:{},defaultVariants:{}}),re=cva("pb-4 pt-0",{variants:{},defaultVariants:{}});function ot(e){return {h1:1,h2:2,h3:3,h4:4,h5:5,h6:6}[e]}function rt(e){let t=Children.toArray(e);for(let o of t)if(isValidElement(o)){let a=o.props;if(a&&typeof a=="object"&&"id"in a)return a.id}}function se({type:e="single",collapsible:t=false,expandedKeys:o,defaultExpandedKeys:a,onExpandedChange:i,isDisabled:r=false,disabledKeys:l,className:n,children:s,...u}){let b=e==="multiple",x=useMemo(()=>{if(!t&&e==="single"&&!a&&!o){let A=rt(s);return A?[A]:void 0}return a},[t,e,a,o,s]),S=useMemo(()=>({disabledKeys:l}),[l]);return jsx(ne.Provider,{value:S,children:jsx(DisclosureGroup,{allowsMultipleExpanded:b,expandedKeys:o,defaultExpandedKeys:x,onExpandedChange:i,isDisabled:r,className:c(Qe(),n),...u,children:s})})}se.displayName="Accordion";function de({id:e,isDisabled:t,className:o,children:a,...i}){let{disabledKeys:r}=useContext(ne),l=r?.includes(e)??false;return jsx(Disclosure,{id:e,isDisabled:t||l,className:composeRenderProps(o,s=>c(Ze(),s)),...i,children:a})}de.displayName="AccordionItem";function le({as:e="h3",icon:t,hideIcon:o=false,className:a,children:i,...r}){let n=useContext(DisclosureStateContext)?.isExpanded??false;return jsx(Heading,{level:ot(e),children:jsxs(Button,{slot:"trigger",className:composeRenderProps(a,s=>c(et(),s)),...r,children:[jsx("span",{className:"flex-1 text-left",children:i}),!o&&(t??jsx(ChevronDown,{"aria-hidden":"true",className:c(tt({isExpanded:n}))}))]})})}le.displayName="AccordionTrigger";function it({preserveState:e,children:t}){let a=useContext(DisclosureStateContext)?.isExpanded??false;return e?jsx(Be,{mode:a?"visible":"hidden",children:jsx("div",{className:re(),children:t})}):jsx("div",{className:re(),children:t})}function ce({preserveState:e=false,className:t,children:o,...a}){return jsx(DisclosurePanel,{className:composeRenderProps(t,i=>c(at(),"animate-accordion",i)),...a,children:jsx(it,{preserveState:e,children:o})})}ce.displayName="AccordionContent";var ue=se,pe=de,fe=le,me=ce;var W=cva("flex flex-col gap-3",{variants:{size:{sm:"text-sm",default:"text-sm",lg:"text-base"}},defaultVariants:{size:"default"}}),J=cva(["rounded-md border border-[var(--border)]","bg-[var(--muted)] text-[var(--content-foreground)]"].join(" "),{variants:{size:{sm:"p-3 text-sm",default:"p-4 text-sm",lg:"p-5 text-base"}},defaultVariants:{size:"default"}}),X=cva("font-semibold text-[var(--muted-foreground)] flex-shrink-0",{variants:{size:{sm:"text-xs w-5",default:"text-sm w-6",lg:"text-base w-7"}},defaultVariants:{size:"default"}});var ut=new Set(["b","strong","i","em","ul","ol","li","p","br"]);function be(e){if(typeof window>"u"||typeof DOMParser>"u")return e.replace(/<[^>]*>/g,"");let o=new DOMParser().parseFromString(e,"text/html");function a(r){if(r.nodeType===Node.TEXT_NODE)return pt(r.textContent??"");if(r.nodeType===Node.ELEMENT_NODE){let l=r,n=l.tagName.toLowerCase();if(!ut.has(n)){let u="";for(let b of Array.from(l.childNodes))u+=a(b);return u}let s="";for(let u of Array.from(l.childNodes))s+=a(u);return n==="br"?"<br />":`<${n}>${s}</${n}>`}return ""}let i="";for(let r of Array.from(o.body.childNodes))i+=a(r);return i}function pt(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function ft(e){return String.fromCharCode(65+e)}var ge=forwardRef(function(t,o){let{value:a,onChange:i,scenarioText:r,collapsibleScenario:l=false,responses:n,label:s,description:u,errorMessage:b,isRequired:x=false,isDisabled:S=false,isReadOnly:A=false,isInvalid:I=false,size:y="default",className:j,id:$,"aria-label":L,"aria-describedby":w,"data-testid":k}=t,M=useId(),R=$??M,T=`${R}-label`,z=`${R}-description`,G=`${R}-error`,D=`${R}-scenario`,m=[];w&&m.push(w),u&&m.push(z),r&&m.push(D),I&&b&&m.push(G);let H=useMemo(()=>[...n].sort((h,N)=>h.ordinal-N.ordinal),[n]),E=useMemo(()=>be(r),[r]);return jsxs("div",{ref:o,id:R,"aria-label":L,"aria-labelledby":s?T:void 0,"data-testid":k,className:c(W({size:y}),j),children:[s&&jsxs(Label,{id:T,className:"text-sm font-medium text-[var(--content-foreground)]",children:[s,x&&jsx("span",{className:"ml-1 text-[var(--destructive-background)]","aria-hidden":"true",children:"*"})]}),u&&jsx(Text,{id:z,slot:"description",className:"text-sm text-[var(--menu-muted)]",children:u}),l?jsx(ue,{type:"single",collapsible:true,isDisabled:false,defaultExpandedKeys:["scenario"],children:jsxs(pe,{id:"scenario",children:[jsx(fe,{as:"h3",hideIcon:false,children:"Scenario"}),jsx(me,{preserveState:false,children:jsx("div",{id:D,className:J({size:y}),dangerouslySetInnerHTML:{__html:E}})})]})}):jsx("div",{id:D,role:"document",className:J({size:y}),dangerouslySetInnerHTML:{__html:E}}),jsx(K,{label:void 0,"aria-label":s?void 0:L,"aria-labelledby":s?T:void 0,"aria-describedby":m.length>0?m.join(" "):void 0,value:a??void 0,onChange:i,isDisabled:S,isReadOnly:A,isRequired:x,isInvalid:I,orientation:"vertical",variant:"default",size:y,children:H.map(h=>jsx(B,{value:h.value,isDisabled:false,children:jsxs("div",{className:"flex items-start gap-2",children:[jsxs("span",{className:X({size:y}),children:[ft(h.ordinal),"."]}),jsx("span",{className:"flex-1",children:h.text})]})},h.value))}),I&&b&&jsx("div",{id:G,role:"alert",className:"text-sm text-[var(--destructive-background)]",children:b})]})});ge.displayName="SituationalJudgement";var xe=z.object({className:z.string().optional(),children:z.any().optional(),id:z.string().optional(),"aria-label":z.string().optional(),"aria-labelledby":z.string().optional(),"aria-describedby":z.string().optional(),"aria-live":z.enum(["off","polite","assertive"]).optional(),"aria-hidden":z.boolean().optional(),"data-testid":z.string().optional()});var he=z.enum(["sm","default","lg"]),Se=z.object({value:z.string(),text:z.string(),ordinal:z.number()}),mt=xe.extend({value:z.string().nullable().optional(),onChange:z.custom().optional(),scenarioText:z.string(),collapsibleScenario:z.boolean().optional().default(false),responses:z.array(Se).min(3).max(6),label:z.string().optional(),description:z.string().optional(),errorMessage:z.string().optional(),isRequired:z.boolean().optional().default(false),isDisabled:z.boolean().optional().default(false),isReadOnly:z.boolean().optional().default(false),isInvalid:z.boolean().optional().default(false),size:he.optional().default("default")}).refine(e=>{let t=e.responses.map(o=>o.value);return new Set(t).size===t.length},{message:"Response values must be unique",path:["responses"]});export{Se as SJTResponseSchema,he as SJTSizeSchema,ge as SituationalJudgement,mt as SituationalJudgementPropsSchema,be as sanitiseHtml,W as sjtContainerVariants,X as sjtOrdinalVariants,J as sjtScenarioVariants};//# sourceMappingURL=index.mjs.map
3
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/cn.ts","../../../src/styles/interaction-states.ts","../../../src/elements/RadioGroup/RadioGroup.tsx","../../../src/elements/Accordion/Accordion.tsx","../../../src/elements/SituationalJudgement/SituationalJudgement.styles.ts","../../../src/elements/SituationalJudgement/SituationalJudgement.tsx","../../../src/schemas/BaseComponentProps.ts","../../../src/elements/SituationalJudgement/SituationalJudgement.types.ts"],"names":["cn","inputs","twMerge","clsx","FOCUS_STYLES","HIGH_CONTRAST_FOCUS","RadioGroupContext","createContext","radioGroupVariants","cva","radioItemVariants","radioIndicatorVariants","radioInnerDotVariants","RadioLabel","children","className","jsx","RadioDescription","RadioComponent","value","isDisabled","variant","size","isInvalid","useContext","AriaRadio","renderProps","jsxs","Fragment","Radio","RadioGroup","forwardRef","props","ref","label","description","errorMessage","defaultValue","isReadOnly","isRequired","orientation","name","onChange","onFocusChange","id","ariaLabel","ariaLabelledby","ariaDescribedby","dataTestId","restProps","generatedId","useId","radioGroupId","labelId","descriptionId","errorId","describedByParts","computedAriaDescribedBy","AriaRadioGroup","Label","Text","FieldError","Activity","ReactActivity","mode","AccordionContext","accordionVariants","accordionItemVariants","accordionTriggerVariants","accordionChevronVariants","accordionContentVariants","accordionContentInnerVariants","getHeadingLevel","level","getFirstAccordionItemId","childArray","Children","child","isValidElement","childProps","AccordionRoot","type","collapsible","expandedKeys","defaultExpandedKeys","onExpandedChange","disabledKeys","allowsMultipleExpanded","effectiveDefaultExpandedKeys","useMemo","firstItemId","contextValue","DisclosureGroup","AccordionItemComponent","isDisabledProp","isDisabledFromKeys","Disclosure","composeRenderProps","AccordionTriggerComponent","headingLevel","icon","hideIcon","isExpanded","DisclosureStateContext","Heading","Button","ChevronDown","AccordionContentInner","preserveState","AccordionContentComponent","DisclosurePanel","Accordion","AccordionItem","AccordionTrigger","AccordionContent","sjtContainerVariants","sjtScenarioVariants","sjtOrdinalVariants","ALLOWED_TAGS","sanitiseHtml","html","doc","walkNode","node","escapeHtml","el","tagName","childHtml","result","text","ordinalToLetter","ordinal","SituationalJudgement","scenarioText","collapsibleScenario","responses","groupId","scenarioId","sortedResponses","a","b","sanitisedScenario","response","BaseComponentPropsSchema","z","SJTSizeSchema","SJTResponseSchema","SituationalJudgementPropsSchema","data","values","r"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Class Name Utility\n * Merges Tailwind CSS classes with conflict resolution\n *\n * Combines clsx for conditional classes and tailwind-merge for deduplication\n *\n * @example\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4' (px-4 overrides px-2)\n * cn('text-red-500', condition && 'text-blue-500') // => conditional application\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Global Interaction State Styles\n *\n * Consistent interaction patterns across all Themis components.\n * These styles ensure WCAG 2.2 AAA compliance and predictable UX.\n *\n * @see spec.md FR-010 (Visible focus ring for keyboard navigation)\n * @see spec.md FR-031 (Pressed state feedback)\n * @see spec.md FR-012 (High contrast mode support)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\n/**\n * Focus state styles (FR-010)\n * Visible focus ring for keyboard navigation - WCAG 2.2 Level AAA\n *\n * Components can override by extending these styles:\n * @example\n * cn(FOCUS_STYLES, \"ring-4\") // Increases ring width to 4px\n */\nexport const FOCUS_STYLES = \"data-[focus-visible]:ring-2 data-[focus-visible]:ring-[var(--themis-ring)] data-[focus-visible]:ring-offset-2\";\n\n/**\n * Pressed/Active state styles (FR-031)\n * Visual feedback for press interactions\n *\n * Components can override the scale amount:\n * @example\n * cn(PRESSED_STYLES_BASE, \"data-[pressed]:scale-[0.95]\") // More pronounced scale\n */\nexport const PRESSED_STYLES = \"data-[pressed]:scale-[0.97]\";\n\n/**\n * Base pressed styles without scale (for components that need different feedback)\n */\nexport const PRESSED_STYLES_BASE = \"data-[pressed]:transition-transform data-[pressed]:duration-100\";\n\n/**\n * Hover state styles\n * Elevation change on hover for better affordance\n *\n * Components can override shadow depth:\n * @example\n * cn(HOVER_STYLES_BASE, \"data-[hovered]:shadow-lg\") // Larger shadow\n */\nexport const HOVER_STYLES = \"data-[hovered]:shadow-md\";\n\n/**\n * Base hover styles without shadow (for components that use different hover effects)\n */\nexport const HOVER_STYLES_BASE = \"data-[hovered]:transition-shadow data-[hovered]:duration-200\";\n\n/**\n * High contrast mode focus (FR-012)\n * Enhanced outlines for users requiring high contrast\n *\n * Uses 'hc:' prefix for prefers-contrast: more media query\n */\nexport const HIGH_CONTRAST_FOCUS = \"hc:data-[focus-visible]:outline hc:data-[focus-visible]:outline-4 hc:data-[focus-visible]:outline-offset-2 hc:data-[focus-visible]:outline-foreground\";\n\n/**\n * High contrast mode hover (FR-012)\n * Enhanced outlines for hover in high contrast mode\n */\nexport const HIGH_CONTRAST_HOVER = \"hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground\";\n\n/**\n * High contrast mode pressed state\n * Enhanced outlines for pressed state in high contrast mode\n */\nexport const HIGH_CONTRAST_PRESSED = \"hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground\";\n\n/**\n * Combined high contrast styles\n * Use this for components that need all high contrast interaction states\n */\nexport const HIGH_CONTRAST_INTERACTIONS = `${HIGH_CONTRAST_FOCUS} ${HIGH_CONTRAST_HOVER} ${HIGH_CONTRAST_PRESSED}`;\n\n/**\n * Disabled state styles\n * Consistent disabled appearance across all components\n */\nexport const DISABLED_STYLES = \"disabled:pointer-events-none disabled:opacity-50\";\n\n/**\n * Default interaction bundle\n * Most common combination for interactive components\n *\n * Includes: focus ring, pressed scale, hover shadow, high contrast enhancements\n *\n * @example\n * <button className={cn(DEFAULT_INTERACTIONS, \"bg-primary\")}>Click</button>\n */\nexport const DEFAULT_INTERACTIONS = `${FOCUS_STYLES} ${PRESSED_STYLES} ${HOVER_STYLES} ${HIGH_CONTRAST_FOCUS} ${HIGH_CONTRAST_HOVER} ${HIGH_CONTRAST_PRESSED}`;\n\n/**\n * Subtle interaction bundle\n * For components that need less pronounced feedback\n *\n * Includes: focus ring and high contrast, but no hover shadow or pressed scale\n */\nexport const SUBTLE_INTERACTIONS = `${FOCUS_STYLES} ${HIGH_CONTRAST_FOCUS}`;\n\n/**\n * Non-interactive element styles\n * For elements that should indicate they are not interactive\n */\nexport const NON_INTERACTIVE = \"cursor-default select-none\";\n","\"use client\";\n\n/**\n * RadioGroup Component\n * Accessible single-selection radio group with React Aria primitives and CVA styling\n *\n * Key Features:\n * - Bordered container design with explicit 44px+ touch targets\n * - 2 variants: default, destructive (no outline per clarification)\n * - 3 sizes: sm (44px), default (48px), lg (56px)\n * - Arrow keys move focus AND select (WAI-ARIA standard selection-follows-focus)\n * - Error styling on ALL items (cognitive accessibility)\n * - Spring animation for selection indicator\n * - RTL support (indicator auto-flips)\n * - Radio.Label and Radio.Description sub-components\n *\n * @see radiogroup-prd.md (Product Requirements)\n * @see plan.md (11 Key Clarifications)\n * @see React Aria RadioGroup: https://react-spectrum.adobe.com/react-aria/RadioGroup.html\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AAA)\n */\n\nimport {\n forwardRef,\n createContext,\n useContext,\n useId,\n type ReactNode,\n type ForwardedRef,\n} from 'react';\nimport {\n RadioGroup as AriaRadioGroup,\n Radio as AriaRadio,\n Label,\n Text,\n FieldError,\n} from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { FOCUS_STYLES, HIGH_CONTRAST_FOCUS } from '../../styles/interaction-states';\nimport type {\n RadioGroupProps,\n RadioProps,\n RadioLabelProps,\n RadioDescriptionProps,\n RadioGroupVariant,\n RadioGroupSize,\n} from './RadioGroup.types';\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface RadioGroupContextValue {\n variant: RadioGroupVariant;\n size: RadioGroupSize;\n isInvalid: boolean;\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue>({\n variant: 'default',\n size: 'default',\n isInvalid: false,\n});\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * RadioGroup container variants\n * Controls orientation and spacing (gap-2 = 8px per clarification)\n */\nconst radioGroupVariants = cva(\n // Base: flex container\n \"flex\",\n {\n variants: {\n orientation: {\n vertical: \"flex-col gap-2\",\n horizontal: \"flex-row flex-wrap gap-2\",\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n },\n }\n);\n\n/**\n * Radio item bordered container variants\n * Bordered container design with explicit touch targets\n * All sizes maintain 44px minimum height (WCAG 2.2 AAA)\n * All sizes use rounded-md (6px) per clarification\n */\nconst radioItemVariants = cva(\n // Base: bordered container with flex layout, RTL support\n [\n \"flex items-center gap-3 rounded-md border cursor-pointer\",\n \"transition-colors duration-200\",\n \"rtl:flex-row-reverse\", // RTL: indicator flips to right\n // Focus ring on entire container\n FOCUS_STYLES,\n HIGH_CONTRAST_FOCUS,\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: [\n \"border-[var(--border)]\",\n \"data-[hovered]:bg-[var(--accent)]/10\",\n \"data-[selected]:border-[var(--primary)]\",\n \"data-[selected]:bg-[var(--primary)]/10\",\n ].join(\" \"),\n destructive: [\n \"border-[var(--border)]\",\n \"data-[hovered]:bg-[var(--destructive-background)]/10\",\n \"data-[selected]:border-[var(--destructive-background)]\",\n \"data-[selected]:bg-[var(--destructive-background)]/10\",\n ].join(\" \"),\n },\n size: {\n sm: \"min-h-[44px] py-2 px-3 text-sm\",\n default: \"min-h-[48px] py-3 px-4 text-sm\",\n lg: \"min-h-[56px] py-4 px-5 text-base\",\n },\n isDisabled: {\n true: \"opacity-50 cursor-not-allowed\",\n false: \"\",\n },\n isInvalid: {\n // Error: ALL items get destructive border (cognitive accessibility)\n true: \"border-[var(--destructive-background)]\",\n false: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n isDisabled: false,\n isInvalid: false,\n },\n }\n);\n\n/**\n * Circle indicator (outer ring) variants\n */\nconst radioIndicatorVariants = cva(\n // Base: circle with border, flex-shrink-0 to prevent squishing\n \"flex-shrink-0 rounded-full border-2 flex items-center justify-center transition-colors duration-200\",\n {\n variants: {\n variant: {\n default: [\n \"border-[var(--border)]\",\n \"data-[selected]:border-[var(--primary)]\",\n ].join(\" \"),\n destructive: [\n \"border-[var(--border)]\",\n \"data-[selected]:border-[var(--destructive-background)]\",\n ].join(\" \"),\n },\n size: {\n sm: \"h-4 w-4\",\n default: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\n/**\n * Inner dot variants (appears when selected)\n * Spring animation: cubic-bezier(0.34, 1.56, 0.64, 1) with slight overshoot\n */\nconst radioInnerDotVariants = cva(\n // Base: centered dot with spring animation\n [\n \"rounded-full transition-transform duration-200\",\n // Spring animation with overshoot\n \"[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)]\",\n // Respect reduced motion preference\n \"motion-reduce:transition-none\",\n // Scale from 0 to 1 on selection\n \"scale-0 data-[selected]:scale-100\",\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: \"bg-[var(--primary)]\",\n destructive: \"bg-[var(--destructive-background)]\",\n },\n size: {\n sm: \"h-2 w-2\",\n default: \"h-2.5 w-2.5\",\n lg: \"h-3 w-3\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\n// ============================================================================\n// Sub-components\n// ============================================================================\n\n/**\n * Radio.Label - Styled label for radio item content\n */\nfunction RadioLabel({ children, className }: RadioLabelProps): ReactNode {\n return (\n <span className={cn(\"font-medium text-[var(--content-foreground)]\", className)}>\n {children}\n </span>\n );\n}\n\nRadioLabel.displayName = \"Radio.Label\";\n\n/**\n * Radio.Description - Styled description for radio item content (muted)\n */\nfunction RadioDescription({ children, className }: RadioDescriptionProps): ReactNode {\n return (\n <span className={cn(\"text-sm text-[var(--menu-muted)]\", className)}>\n {children}\n </span>\n );\n}\n\nRadioDescription.displayName = \"Radio.Description\";\n\n// ============================================================================\n// Radio Component\n// ============================================================================\n\n/**\n * Radio item component with bordered container design\n */\nfunction RadioComponent({ value, isDisabled, children, className }: RadioProps): ReactNode {\n const { variant, size, isInvalid } = useContext(RadioGroupContext);\n\n return (\n <AriaRadio\n value={value}\n isDisabled={isDisabled}\n className={(renderProps) =>\n cn(\n radioItemVariants({\n variant,\n size,\n isDisabled: renderProps.isDisabled,\n isInvalid,\n }),\n className\n )\n }\n >\n {(renderProps) => (\n <>\n {/* Circle indicator */}\n <div\n className={radioIndicatorVariants({ variant, size })}\n data-selected={renderProps.isSelected || undefined}\n >\n {/* Inner dot with spring animation */}\n <div\n className={radioInnerDotVariants({ variant, size })}\n data-selected={renderProps.isSelected || undefined}\n />\n </div>\n\n {/* Children content (flexible - text, icons, complex layouts) */}\n <div className=\"flex-1 flex flex-col\">\n {children}\n </div>\n </>\n )}\n </AriaRadio>\n );\n}\n\n// Attach sub-components\nconst Radio = Object.assign(RadioComponent, {\n Label: RadioLabel,\n Description: RadioDescription,\n}) as typeof RadioComponent & {\n Label: typeof RadioLabel;\n Description: typeof RadioDescription;\n displayName: string;\n};\n\nRadio.displayName = \"Radio\";\n\n// ============================================================================\n// RadioGroup Component\n// ============================================================================\n\n/**\n * RadioGroup root component\n * Accessible single-selection control with bordered container design\n */\nconst RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\n function RadioGroup(props: RadioGroupProps, ref: ForwardedRef<HTMLDivElement>) {\n const {\n // Display props\n label,\n description,\n errorMessage,\n // Selection props\n value,\n defaultValue,\n // State props\n isDisabled = false,\n isReadOnly = false,\n isRequired = false,\n isInvalid = false,\n // Layout props\n orientation = 'vertical',\n // Variant props\n variant = 'default',\n size = 'default',\n // Form props\n name,\n // Event handlers\n onChange,\n onFocusChange,\n // Standard props\n className,\n children,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n 'data-testid': dataTestId,\n ...restProps\n } = props;\n\n // Generate unique IDs for accessibility\n const generatedId = useId();\n const radioGroupId = id ?? generatedId;\n const labelId = `${radioGroupId}-label`;\n const descriptionId = `${radioGroupId}-description`;\n const errorId = `${radioGroupId}-error`;\n\n // Build aria-describedby from description and error\n const describedByParts: string[] = [];\n if (ariaDescribedby) describedByParts.push(ariaDescribedby);\n if (description) describedByParts.push(descriptionId);\n if (isInvalid && errorMessage) describedByParts.push(errorId);\n const computedAriaDescribedBy = describedByParts.length > 0\n ? describedByParts.join(' ')\n : undefined;\n\n return (\n <RadioGroupContext.Provider value={{ variant, size, isInvalid }}>\n <AriaRadioGroup\n ref={ref}\n id={radioGroupId}\n name={name}\n value={value ?? undefined}\n defaultValue={defaultValue ?? undefined}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isRequired={isRequired}\n isInvalid={isInvalid}\n orientation={orientation}\n onChange={onChange}\n onFocusChange={onFocusChange}\n aria-label={ariaLabel}\n aria-labelledby={label ? labelId : ariaLabelledby}\n aria-describedby={computedAriaDescribedBy}\n data-testid={dataTestId}\n data-orientation={orientation}\n className={cn(\"flex flex-col gap-1.5\", className)}\n {...restProps}\n >\n {/* Label with optional required asterisk */}\n {label && (\n <Label id={labelId} className=\"text-sm font-medium text-[var(--content-foreground)]\">\n {label}\n {isRequired && (\n <span className=\"ml-1 text-[var(--destructive-background)]\" aria-hidden=\"true\">\n *\n </span>\n )}\n </Label>\n )}\n\n {/* Description */}\n {description && (\n <Text\n id={descriptionId}\n slot=\"description\"\n className=\"text-sm text-[var(--menu-muted)]\"\n >\n {description}\n </Text>\n )}\n\n {/* Radio items container with orientation */}\n <div className={radioGroupVariants({ orientation })}>\n {children}\n </div>\n\n {/* Error message with role=\"alert\" for screen reader announcements */}\n {isInvalid && errorMessage && (\n <FieldError\n id={errorId}\n className=\"text-sm text-[var(--destructive-background)]\"\n >\n <span role=\"alert\">{errorMessage}</span>\n </FieldError>\n )}\n </AriaRadioGroup>\n </RadioGroupContext.Provider>\n );\n }\n);\n\nRadioGroup.displayName = \"RadioGroup\";\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n RadioGroup,\n Radio,\n radioGroupVariants,\n radioItemVariants,\n radioIndicatorVariants,\n radioInnerDotVariants,\n};\n","'use client';\n\n/**\n * Accordion Component - Implementation\n *\n * Accessible accordion/disclosure group component combining React Aria primitives with CVA styling.\n * Follows Themis library patterns with compound component structure and direct named exports.\n *\n * Key Features:\n * - React Aria DisclosureGroup for full accessibility (WCAG 2.2 AAA)\n * - CVA variants for consistent styling\n * - React 19.2 Activity API for state preservation (preserveState prop)\n * - Single/Multiple expansion modes\n * - Controlled and uncontrolled state management\n * - Configurable heading levels for document structure\n * - Custom icon support\n *\n * @see accordion-prd.md (Full requirements)\n * @see Accordion.types.ts (Zod schemas)\n * @see plan.md (Implementation approach)\n */\n\n// React 19.2 Activity API - may not be available in all builds\n// Import conditionally to support environments where Activity is unavailable\nimport {\n Activity as ReactActivity,\n type ReactNode,\n type ReactElement,\n useMemo,\n useContext,\n createContext,\n Children,\n isValidElement,\n} from 'react';\n\n// Activity component with fallback for environments where it's not available\n// The fallback simply renders children directly - no state preservation when Activity unavailable\nconst Activity = ReactActivity ?? function ActivityFallback({\n children,\n mode,\n}: {\n children: ReactNode;\n mode: 'visible' | 'hidden';\n}): ReactElement {\n return <div data-activity-mode={mode}>{children}</div>;\n};\n\nimport {\n DisclosureGroup,\n Disclosure,\n DisclosurePanel,\n Heading,\n Button,\n composeRenderProps,\n DisclosureStateContext,\n type Key as AriaKey,\n} from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { ChevronDown } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type {\n AccordionProps,\n AccordionItemProps,\n AccordionTriggerProps,\n AccordionContentProps,\n HeadingLevel,\n} from './Accordion.types';\n\n// ============================================================================\n// Context for disabledKeys\n// ============================================================================\n\n/**\n * Context to pass disabledKeys from Accordion to AccordionItem\n * Since DisclosureGroup doesn't support disabledKeys directly, we handle it via context\n */\ninterface AccordionContextValue {\n disabledKeys?: (string | number)[];\n}\n\nconst AccordionContext = createContext<AccordionContextValue>({});\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * Accordion root CVA variants\n *\n * @see accordion-prd.md FR-001 (Accordion Root)\n */\nexport const accordionVariants = cva('w-full', {\n variants: {},\n defaultVariants: {},\n});\n\n/**\n * AccordionItem CVA variants\n *\n * @see accordion-prd.md FR-002 (AccordionItem)\n * @see accordion-prd.md DS-001 (Visual Design - borders)\n */\nexport const accordionItemVariants = cva(\n [\n 'border-b border-[var(--border)]',\n // Last item has no border (handled by last:border-b-0)\n 'last:border-b-0',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * AccordionTrigger CVA variants\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger)\n * @see accordion-prd.md AR-006 (Touch Target Size - 44x44px)\n * @see accordion-prd.md DS-002 (Typography)\n */\nexport const accordionTriggerVariants = cva(\n [\n // Layout\n 'flex flex-1 items-center justify-between py-4 font-medium w-full',\n // Text styling\n 'text-sm text-[var(--content-foreground)]',\n // Hover state\n 'hover:underline',\n // Focus visible ring (WCAG 2.4.13)\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2',\n 'focus-visible:ring-offset-[var(--content-background)]',\n // WCAG 2.2 AAA: 44px minimum touch target\n 'min-h-[44px]',\n // Disabled state\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n // Transition for smooth interactions\n 'transition-all',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * Chevron icon CVA variants\n *\n * @see accordion-prd.md FR-010 (Animated Transitions)\n */\nexport const accordionChevronVariants = cva(\n [\n 'h-4 w-4 shrink-0',\n 'text-[var(--menu-muted)]',\n // Smooth rotation transition\n 'transition-transform duration-200 ease-out',\n // Reduced motion support\n 'motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n isExpanded: {\n true: 'rotate-180',\n false: 'rotate-0',\n },\n },\n defaultVariants: {\n isExpanded: false,\n },\n }\n);\n\n/**\n * AccordionContent CVA variants\n *\n * @see accordion-prd.md FR-004 (AccordionContent)\n * @see accordion-prd.md FR-010 (Animated Transitions)\n */\nexport const accordionContentVariants = cva(\n [\n 'overflow-hidden',\n 'text-sm text-[var(--menu-muted)]',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * AccordionContent inner wrapper CVA variants\n */\nexport const accordionContentInnerVariants = cva('pb-4 pt-0', {\n variants: {},\n defaultVariants: {},\n});\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Convert heading level string to number for React Aria Heading\n */\nfunction getHeadingLevel(level: HeadingLevel): 1 | 2 | 3 | 4 | 5 | 6 {\n const levelMap: Record<HeadingLevel, 1 | 2 | 3 | 4 | 5 | 6> = {\n h1: 1,\n h2: 2,\n h3: 3,\n h4: 4,\n h5: 5,\n h6: 6,\n };\n return levelMap[level];\n}\n\n/**\n * Get the first AccordionItem id from children\n * Used for auto-expanding first item when collapsible={false}\n */\nfunction getFirstAccordionItemId(children: ReactNode): AriaKey | undefined {\n const childArray = Children.toArray(children);\n for (const child of childArray) {\n if (isValidElement(child)) {\n const childProps = child.props as Record<string, unknown>;\n if (childProps && typeof childProps === 'object' && 'id' in childProps) {\n return childProps.id as AriaKey;\n }\n }\n }\n return undefined;\n}\n\n// ============================================================================\n// Components\n// ============================================================================\n\n/**\n * Accordion Root Component\n *\n * Container for accordion items. Manages expansion state and provides\n * context to child components.\n *\n * @see accordion-prd.md FR-001 (Accordion Root Component)\n * @see accordion-prd.md FR-005 (Single Expansion Mode)\n * @see accordion-prd.md FR-006 (Multiple Expansion Mode)\n * @see accordion-prd.md FR-007 (Controlled Mode)\n * @see accordion-prd.md FR-008 (Uncontrolled Mode)\n *\n * @example\n * // Uncontrolled single mode\n * <Accordion type=\"single\" collapsible>\n * <AccordionItem id=\"item-1\">\n * <AccordionTrigger>Section 1</AccordionTrigger>\n * <AccordionContent>Content 1</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n *\n * @example\n * // Controlled multiple mode\n * <Accordion\n * type=\"multiple\"\n * expandedKeys={expandedKeys}\n * onExpandedChange={setExpandedKeys}\n * >\n * ...\n * </Accordion>\n */\nfunction AccordionRoot({\n type = 'single',\n collapsible = false,\n expandedKeys,\n defaultExpandedKeys,\n onExpandedChange,\n isDisabled = false,\n disabledKeys,\n className,\n children,\n ...props\n}: AccordionProps) {\n // Map type prop to React Aria's allowsMultipleExpanded\n const allowsMultipleExpanded = type === 'multiple';\n\n // Auto-expand first item when collapsible={false} and no default provided\n // This ensures one item is always expanded in non-collapsible single mode\n const effectiveDefaultExpandedKeys = useMemo(() => {\n if (!collapsible && type === 'single' && !defaultExpandedKeys && !expandedKeys) {\n const firstItemId = getFirstAccordionItemId(children);\n return firstItemId ? [firstItemId] : undefined;\n }\n return defaultExpandedKeys;\n }, [collapsible, type, defaultExpandedKeys, expandedKeys, children]);\n\n // Context value for passing disabledKeys to AccordionItem\n const contextValue = useMemo(\n () => ({ disabledKeys }),\n [disabledKeys]\n );\n\n return (\n <AccordionContext.Provider value={contextValue}>\n <DisclosureGroup\n allowsMultipleExpanded={allowsMultipleExpanded}\n expandedKeys={expandedKeys as Set<AriaKey> | undefined}\n defaultExpandedKeys={effectiveDefaultExpandedKeys as Iterable<AriaKey> | undefined}\n onExpandedChange={onExpandedChange as ((keys: Set<AriaKey>) => void) | undefined}\n isDisabled={isDisabled}\n className={cn(accordionVariants(), className)}\n {...props}\n >\n {children}\n </DisclosureGroup>\n </AccordionContext.Provider>\n );\n}\n\nAccordionRoot.displayName = 'Accordion';\n\n/**\n * AccordionItem Component\n *\n * Wrapper for each expandable disclosure section.\n *\n * @see accordion-prd.md FR-002 (AccordionItem Component)\n *\n * @example\n * <AccordionItem id=\"faq-1\" isDisabled={!isAuthenticated}>\n * <AccordionTrigger>Members-only FAQ</AccordionTrigger>\n * <AccordionContent>This content is for members only.</AccordionContent>\n * </AccordionItem>\n */\nfunction AccordionItemComponent({\n id,\n isDisabled: isDisabledProp,\n className,\n children,\n ...props\n}: AccordionItemProps) {\n // Check if this item is in the disabledKeys array\n const { disabledKeys } = useContext(AccordionContext);\n const isDisabledFromKeys = disabledKeys?.includes(id as string | number) ?? false;\n const isDisabled = isDisabledProp || isDisabledFromKeys;\n\n return (\n <Disclosure\n id={id}\n isDisabled={isDisabled}\n className={composeRenderProps(className, (className) =>\n cn(accordionItemVariants(), className)\n )}\n {...props}\n >\n {children}\n </Disclosure>\n );\n}\n\nAccordionItemComponent.displayName = 'AccordionItem';\n\n/**\n * AccordionTrigger Component\n *\n * Clickable button that toggles accordion content visibility.\n * Wrapped in a Heading for proper document structure.\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger Component)\n * @see accordion-prd.md AR-002 (ARIA Attributes)\n * @see accordion-prd.md AR-003 (Keyboard Navigation)\n *\n * @example\n * // Default with chevron\n * <AccordionTrigger>Is it accessible?</AccordionTrigger>\n *\n * @example\n * // Custom heading level\n * <AccordionTrigger as=\"h2\">Important Section</AccordionTrigger>\n *\n * @example\n * // Custom icon\n * <AccordionTrigger icon={<PlusIcon className=\"h-4 w-4\" />}>\n * Click to expand\n * </AccordionTrigger>\n */\nfunction AccordionTriggerComponent({\n as: headingLevel = 'h3',\n icon,\n hideIcon = false,\n className,\n children,\n ...props\n}: AccordionTriggerProps) {\n // Access disclosure state from context\n const state = useContext(DisclosureStateContext);\n const isExpanded = state?.isExpanded ?? false;\n\n return (\n <Heading level={getHeadingLevel(headingLevel)}>\n <Button\n slot=\"trigger\"\n className={composeRenderProps(className, (className) =>\n cn(accordionTriggerVariants(), className)\n )}\n {...props}\n >\n <span className=\"flex-1 text-left\">{children}</span>\n {!hideIcon && (\n icon ?? (\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(accordionChevronVariants({ isExpanded }))}\n />\n )\n )}\n </Button>\n </Heading>\n );\n}\n\nAccordionTriggerComponent.displayName = 'AccordionTrigger';\n\n/**\n * AccordionContent Component\n *\n * Expandable container for accordion content.\n * Supports animated height transitions and React Activity state preservation.\n *\n * @see accordion-prd.md FR-004 (AccordionContent Component)\n * @see accordion-prd.md FR-010 (Animated Transitions)\n *\n * @example\n * // Standard content\n * <AccordionContent>\n * Yes. It adheres to the WAI-ARIA design pattern.\n * </AccordionContent>\n *\n * @example\n * // With state preservation\n * <AccordionContent preserveState>\n * <form>\n * <input name=\"email\" />\n * </form>\n * </AccordionContent>\n */\n/**\n * Inner component for AccordionContent with state preservation\n * Uses DisclosureStateContext to get isExpanded state\n */\nfunction AccordionContentInner({\n preserveState,\n children,\n}: {\n preserveState: boolean;\n children: ReactNode;\n}) {\n const state = useContext(DisclosureStateContext);\n const isExpanded = state?.isExpanded ?? false;\n\n if (preserveState) {\n return (\n <Activity mode={isExpanded ? 'visible' : 'hidden'}>\n <div className={accordionContentInnerVariants()}>{children}</div>\n </Activity>\n );\n }\n\n return <div className={accordionContentInnerVariants()}>{children}</div>;\n}\n\nfunction AccordionContentComponent({\n preserveState = false,\n className,\n children,\n ...props\n}: AccordionContentProps) {\n return (\n <DisclosurePanel\n className={composeRenderProps(className, (className) =>\n cn(accordionContentVariants(), 'animate-accordion', className)\n )}\n {...props}\n >\n <AccordionContentInner preserveState={preserveState}>\n {children}\n </AccordionContentInner>\n </DisclosurePanel>\n );\n}\n\nAccordionContentComponent.displayName = 'AccordionContent';\n\n// ============================================================================\n// Exports\n// ============================================================================\n\n/**\n * Direct named exports (not Object.assign compound pattern)\n *\n * Accordion follows React Aria's direct export pattern because:\n * - Simpler structure (only 4 components)\n * - Better tree-shaking with named exports\n * - Clearer imports: import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from '...'\n */\nexport const Accordion = AccordionRoot;\nexport const AccordionItem = AccordionItemComponent;\nexport const AccordionTrigger = AccordionTriggerComponent;\nexport const AccordionContent = AccordionContentComponent;\n\n// Re-export types for convenience\nexport type {\n AccordionProps,\n AccordionItemProps,\n AccordionTriggerProps,\n AccordionContentProps,\n};\n","import { cva } from 'class-variance-authority';\n\n/**\n * SituationalJudgement CVA Variant Definitions\n *\n * Minimal styling since this component composes existing RadioGroup, Radio,\n * and Accordion components. These variants cover the container and scenario panel.\n */\n\n// =============================================================================\n// Container\n// =============================================================================\n\n/** Root wrapper */\nexport const sjtContainerVariants = cva(\"flex flex-col gap-3\", {\n variants: {\n size: {\n sm: \"text-sm\",\n default: \"text-sm\",\n lg: \"text-base\",\n },\n },\n defaultVariants: { size: \"default\" },\n});\n\n// =============================================================================\n// Scenario Panel\n// =============================================================================\n\n/** Scenario text panel (non-collapsible mode) */\nexport const sjtScenarioVariants = cva(\n [\n \"rounded-md border border-[var(--border)]\",\n \"bg-[var(--muted)] text-[var(--content-foreground)]\",\n ].join(\" \"),\n {\n variants: {\n size: {\n sm: \"p-3 text-sm\",\n default: \"p-4 text-sm\",\n lg: \"p-5 text-base\",\n },\n },\n defaultVariants: { size: \"default\" },\n }\n);\n\n/** Ordinal letter label (\"A.\", \"B.\", etc.) */\nexport const sjtOrdinalVariants = cva(\n \"font-semibold text-[var(--muted-foreground)] flex-shrink-0\",\n {\n variants: {\n size: {\n sm: \"text-xs w-5\",\n default: \"text-sm w-6\",\n lg: \"text-base w-7\",\n },\n },\n defaultVariants: { size: \"default\" },\n }\n);\n","\"use client\";\n\n/**\n * SituationalJudgement Component\n *\n * Assessment component presenting a scenario with 3-6 response options.\n * Composes existing Themis RadioGroup + Radio for response selection\n * and Accordion for collapsible scenario panel.\n *\n * Features:\n * - HTML scenario text with built-in sanitiser (XSS protection)\n * - Collapsible scenario via Accordion\n * - Responses sorted by ordinal, labeled with letters (A, B, C, ...)\n * - Standard radio group behaviour (no deselection)\n *\n * @see WCAG 2.2 AAA — 44x44px touch targets, keyboard navigation\n */\n\nimport {\n forwardRef,\n useId,\n useMemo,\n type ForwardedRef,\n} from 'react';\nimport { Label, Text } from 'react-aria-components';\nimport { cn } from '../../utils/cn';\nimport { RadioGroup, Radio } from '../RadioGroup/RadioGroup';\nimport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n} from '../Accordion/Accordion';\nimport type { SituationalJudgementProps, SJTResponse } from './SituationalJudgement.types';\nimport {\n sjtContainerVariants,\n sjtScenarioVariants,\n sjtOrdinalVariants,\n} from './SituationalJudgement.styles';\n\n// =============================================================================\n// HTML Sanitiser\n// =============================================================================\n\nconst ALLOWED_TAGS = new Set([\n 'b', 'strong', 'i', 'em', 'ul', 'ol', 'li', 'p', 'br',\n]);\n\n/**\n * Sanitise HTML string using DOMParser.\n * Only preserves allowed tags, strips ALL attributes.\n * Returns clean HTML safe for dangerouslySetInnerHTML.\n */\nfunction sanitiseHtml(html: string): string {\n if (typeof window === 'undefined' || typeof DOMParser === 'undefined') {\n // SSR fallback: strip all HTML tags\n return html.replace(/<[^>]*>/g, '');\n }\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n\n function walkNode(node: Node): string {\n if (node.nodeType === Node.TEXT_NODE) {\n return escapeHtml(node.textContent ?? '');\n }\n\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n const tagName = el.tagName.toLowerCase();\n\n if (!ALLOWED_TAGS.has(tagName)) {\n // Strip disallowed tag but process children\n let childHtml = '';\n for (const child of Array.from(el.childNodes)) {\n childHtml += walkNode(child);\n }\n return childHtml;\n }\n\n // Allowed tag — render without attributes\n let childHtml = '';\n for (const child of Array.from(el.childNodes)) {\n childHtml += walkNode(child);\n }\n\n if (tagName === 'br') {\n return '<br />';\n }\n\n return `<${tagName}>${childHtml}</${tagName}>`;\n }\n\n return '';\n }\n\n let result = '';\n for (const child of Array.from(doc.body.childNodes)) {\n result += walkNode(child);\n }\n return result;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/** Convert ordinal index to letter: 0 → \"A\", 1 → \"B\", etc. */\nfunction ordinalToLetter(ordinal: number): string {\n return String.fromCharCode(65 + ordinal);\n}\n\n// =============================================================================\n// SituationalJudgement Component\n// =============================================================================\n\nconst SituationalJudgement = forwardRef<HTMLDivElement, SituationalJudgementProps>(\n function SituationalJudgement(\n props: SituationalJudgementProps,\n ref: ForwardedRef<HTMLDivElement>,\n ) {\n const {\n // Value\n value,\n onChange,\n // Scenario\n scenarioText,\n collapsibleScenario = false,\n // Responses\n responses,\n // Labels\n label,\n description,\n errorMessage,\n // State\n isRequired = false,\n isDisabled = false,\n isReadOnly = false,\n isInvalid = false,\n // Sizing\n size = 'default',\n // Standard\n className,\n id,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedby,\n 'data-testid': dataTestId,\n } = props;\n\n const generatedId = useId();\n const groupId = id ?? generatedId;\n const labelId = `${groupId}-label`;\n const descriptionId = `${groupId}-description`;\n const errorId = `${groupId}-error`;\n const scenarioId = `${groupId}-scenario`;\n\n const describedByParts: string[] = [];\n if (ariaDescribedby) describedByParts.push(ariaDescribedby);\n if (description) describedByParts.push(descriptionId);\n if (scenarioText) describedByParts.push(scenarioId);\n if (isInvalid && errorMessage) describedByParts.push(errorId);\n\n // Sort responses by ordinal\n const sortedResponses = useMemo(\n () => [...responses].sort((a, b) => a.ordinal - b.ordinal),\n [responses],\n );\n\n // Sanitise scenario HTML\n const sanitisedScenario = useMemo(\n () => sanitiseHtml(scenarioText),\n [scenarioText],\n );\n\n return (\n <div\n ref={ref}\n id={groupId}\n aria-label={ariaLabel}\n aria-labelledby={label ? labelId : undefined}\n data-testid={dataTestId}\n className={cn(sjtContainerVariants({ size }), className)}\n >\n {/* Label */}\n {label && (\n <Label id={labelId} className=\"text-sm font-medium text-[var(--content-foreground)]\">\n {label}\n {isRequired && (\n <span className=\"ml-1 text-[var(--destructive-background)]\" aria-hidden=\"true\">\n *\n </span>\n )}\n </Label>\n )}\n\n {/* Description */}\n {description && (\n <Text\n id={descriptionId}\n slot=\"description\"\n className=\"text-sm text-[var(--menu-muted)]\"\n >\n {description}\n </Text>\n )}\n\n {/* Scenario Panel */}\n {collapsibleScenario ? (\n <Accordion type=\"single\" collapsible isDisabled={false} defaultExpandedKeys={['scenario']}>\n <AccordionItem id=\"scenario\">\n <AccordionTrigger as=\"h3\" hideIcon={false}>Scenario</AccordionTrigger>\n <AccordionContent preserveState={false}>\n <div\n id={scenarioId}\n className={sjtScenarioVariants({ size })}\n dangerouslySetInnerHTML={{ __html: sanitisedScenario }}\n />\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n ) : (\n <div\n id={scenarioId}\n role=\"document\"\n className={sjtScenarioVariants({ size })}\n dangerouslySetInnerHTML={{ __html: sanitisedScenario }}\n />\n )}\n\n {/* Response options via existing RadioGroup + Radio */}\n <RadioGroup\n label={undefined}\n aria-label={label ? undefined : ariaLabel}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={describedByParts.length > 0 ? describedByParts.join(' ') : undefined}\n value={value ?? undefined}\n onChange={onChange}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isRequired={isRequired}\n isInvalid={isInvalid}\n orientation=\"vertical\"\n variant=\"default\"\n size={size}\n >\n {sortedResponses.map((response: SJTResponse) => (\n <Radio key={response.value} value={response.value} isDisabled={false}>\n <div className=\"flex items-start gap-2\">\n <span className={sjtOrdinalVariants({ size })}>\n {ordinalToLetter(response.ordinal)}.\n </span>\n <span className=\"flex-1\">{response.text}</span>\n </div>\n </Radio>\n ))}\n </RadioGroup>\n\n {/* Error message */}\n {isInvalid && errorMessage && (\n <div\n id={errorId}\n role=\"alert\"\n className=\"text-sm text-[var(--destructive-background)]\"\n >\n {errorMessage}\n </div>\n )}\n </div>\n );\n },\n);\n\nSituationalJudgement.displayName = \"SituationalJudgement\";\n\nexport { SituationalJudgement, sanitiseHtml };\n","import { z } from 'zod';\n\n/**\n * Base props schema for all Themis components\n * Ensures consistent accessibility and styling APIs across the library\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements)\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AA minimum)\n */\nexport const BaseComponentPropsSchema = z.object({\n // Styling\n className: z.string().optional(),\n\n // React\n children: z.any().optional(), // ReactNode not directly supported by Zod\n id: z.string().optional(),\n\n // Accessibility (WCAG 2.2 AA requirements)\n 'aria-label': z.string().optional(),\n 'aria-labelledby': z.string().optional(),\n 'aria-describedby': z.string().optional(),\n 'aria-live': z.enum(['off', 'polite', 'assertive']).optional(),\n 'aria-hidden': z.boolean().optional(),\n\n // Testing & Development\n 'data-testid': z.string().optional(),\n});\n\nexport type BaseComponentProps = z.infer<typeof BaseComponentPropsSchema>;\n","import { z } from 'zod';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\n\n/**\n * SituationalJudgement size schema\n */\nexport const SJTSizeSchema = z.enum(['sm', 'default', 'lg']);\nexport type SJTSize = z.infer<typeof SJTSizeSchema>;\n\n/**\n * Individual response option schema\n */\nexport const SJTResponseSchema = z.object({\n value: z.string(),\n text: z.string(),\n ordinal: z.number(),\n});\n\nexport type SJTResponse = z.infer<typeof SJTResponseSchema>;\n\n/**\n * SituationalJudgement props schema\n *\n * Assessment component presenting a scenario with 3-6 response options.\n * Composes existing RadioGroup + Radio for response selection\n * and Accordion for collapsible scenario panel.\n *\n * Uses .refine() to enforce unique response values — requires getShape()\n * helper from test-utils.ts in contract tests.\n */\nexport const SituationalJudgementPropsSchema = BaseComponentPropsSchema.extend({\n // Value — the selected response value\n value: z.string().nullable().optional(),\n onChange: z.custom<(value: string) => void>().optional(),\n\n // Scenario\n scenarioText: z.string(),\n collapsibleScenario: z.boolean().optional().default(false),\n\n // Responses (3-6 options)\n responses: z.array(SJTResponseSchema).min(3).max(6),\n\n // Labels\n label: z.string().optional(),\n description: z.string().optional(),\n errorMessage: z.string().optional(),\n\n // State\n isRequired: z.boolean().optional().default(false),\n isDisabled: z.boolean().optional().default(false),\n isReadOnly: z.boolean().optional().default(false),\n isInvalid: z.boolean().optional().default(false),\n\n // Sizing\n size: SJTSizeSchema.optional().default('default'),\n}).refine(\n (data) => {\n const values = data.responses.map((r) => r.value);\n return new Set(values).size === values.length;\n },\n { message: 'Response values must be unique', path: ['responses'] },\n);\n\nexport type SituationalJudgementProps = z.infer<typeof SituationalJudgementPropsSchema>;\n"]}
@@ -51,4 +51,10 @@ export { SearchField, searchFieldVariants, searchFieldLabelVariants, searchField
51
51
  export type { SearchFieldProps, SearchFieldSize } from './SearchField';
52
52
  export { PasswordField, passwordFieldVariants, passwordFieldLabelVariants, passwordFieldDescriptionVariants, passwordFieldErrorVariants, } from './PasswordField';
53
53
  export type { PasswordFieldProps, PasswordFieldSize } from './PasswordField';
54
+ export { RatingScale, ratingScaleContainerVariants, ratingScaleRowVariants, ratingScaleButtonOuterVariants, ratingScaleButtonVisualVariants, ratingScaleStarOuterVariants, ratingScaleStarVisualVariants, ratingScaleSliderTrackVariants, ratingScaleSliderFillVariants, ratingScaleSliderThumbVariants, ratingScaleSliderTickVariants, ratingScaleNAButtonVariants, RatingScalePropsSchema, RatingScaleDisplayStyleSchema, RatingScaleSizeSchema, } from './RatingScale';
55
+ export type { RatingScaleProps, RatingScaleDisplayStyle, RatingScaleSize, } from './RatingScale';
56
+ export { SituationalJudgement, sanitiseHtml, sjtContainerVariants, sjtScenarioVariants, sjtOrdinalVariants, SituationalJudgementPropsSchema, SJTResponseSchema, SJTSizeSchema, } from './SituationalJudgement';
57
+ export type { SituationalJudgementProps, SJTResponse, SJTSize, } from './SituationalJudgement';
58
+ export { MatrixGrid, matrixGridContainerVariants, matrixGridScrollContainerVariants, matrixGridTableVariants, matrixGridColumnHeaderVariants, matrixGridRowHeaderVariants, matrixGridCellVariants, matrixGridRadioOuterVariants, matrixGridRadioVisualVariants, matrixGridRadioDotVariants, matrixGridRowVariants, MatrixGridPropsSchema, MatrixGridRowSchema, MatrixGridColumnSchema, MatrixGridSizeSchema, } from './MatrixGrid';
59
+ export type { MatrixGridProps, MatrixGridRow, MatrixGridColumn, MatrixGridSize, } from './MatrixGrid';
54
60
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/elements/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/elements/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,MAAM,EACN,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,KAAK,EACL,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,sBAAsB,EACtB,+BAA+B,EAC/B,mBAAmB,EACnB,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,gBAAgB,EAChB,yBAAyB,EACzB,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,IAAI,EACJ,UAAU,EACV,SAAS,EACT,eAAe,EACf,WAAW,EACX,UAAU,EACV,UAAU,EACV,0BAA0B,GAC3B,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EACL,QAAQ,EACR,yBAAyB,EACzB,yBAAyB,EACzB,iBAAiB,IAAI,yBAAyB,EAC9C,aAAa,IAAI,qBAAqB,EACtC,SAAS,IAAI,iBAAiB,GAC/B,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EACL,aAAa,EACb,QAAQ,IAAI,qBAAqB,EACjC,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,IAAI,8BAA8B,EAC3D,iBAAiB,IAAI,8BAA8B,EACnD,aAAa,IAAI,0BAA0B,EAC3C,SAAS,IAAI,sBAAsB,EACnC,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,EACL,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,UAAU,EACV,SAAS,EACT,UAAU,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,UAAU,EACV,eAAe,EACf,SAAS,EACT,iBAAiB,GAClB,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,UAAU,EACV,eAAe,EACf,SAAS,EACT,QAAQ,EACR,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EACzB,oBAAoB,EACpB,8BAA8B,EAC9B,yBAAyB,EACzB,yBAAyB,EACzB,6BAA6B,EAC7B,uBAAuB,EACvB,uBAAuB,EACvB,SAAS,EACT,aAAa,EACb,kBAAkB,EAClB,KAAK,EACL,GAAG,EACH,gBAAgB,EAChB,SAAS,GACV,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,SAAS,EACT,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,0BAA0B,EAC1B,yBAAyB,EACzB,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,cAAc,EACd,aAAa,EACb,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,8BAA8B,EAC9B,wBAAwB,GACzB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EACL,QAAQ,EACR,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,aAAa,EACb,eAAe,EACf,YAAY,EACZ,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,UAAU,EACV,KAAK,EACL,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,qBAAqB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,EACL,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,WAAW,EACX,YAAY,EACZ,MAAM,EACN,GAAG,EACH,IAAI,EACJ,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,WAAW,EACX,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,IAAI,EACJ,OAAO,EACP,GAAG,EACH,QAAQ,EACR,eAAe,EACf,WAAW,EACX,gBAAgB,GACjB,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EACL,SAAS,EACT,IAAI,EACJ,SAAS,EACT,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,EACL,UAAU,EACV,aAAa,EACb,eAAe,EACf,aAAa,EACb,OAAO,EACP,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,OAAO,EACP,cAAc,EACd,cAAc,EACd,YAAY,EACZ,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,WAAW,EACX,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACrE,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,8BAA8B,EAC9B,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EACpB,uBAAuB,EACvB,6BAA6B,EAC7B,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,eAAe,EACf,cAAc,EACd,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,wBAAwB,EACxB,8BAA8B,EAC9B,wBAAwB,GACzB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,0BAA0B,EAC1B,gCAAgC,EAChC,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EACL,WAAW,EACX,4BAA4B,EAC5B,sBAAsB,EACtB,8BAA8B,EAC9B,+BAA+B,EAC/B,4BAA4B,EAC5B,6BAA6B,EAC7B,8BAA8B,EAC9B,6BAA6B,EAC7B,8BAA8B,EAC9B,6BAA6B,EAC7B,2BAA2B,EAC3B,sBAAsB,EACtB,6BAA6B,EAC7B,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,+BAA+B,EAC/B,iBAAiB,EACjB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,yBAAyB,EACzB,WAAW,EACX,OAAO,GACR,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,UAAU,EACV,2BAA2B,EAC3B,iCAAiC,EACjC,uBAAuB,EACvB,8BAA8B,EAC9B,2BAA2B,EAC3B,sBAAsB,EACtB,4BAA4B,EAC5B,6BAA6B,EAC7B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,cAAc,GACf,MAAM,cAAc,CAAC"}