@mieweb/ui 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MIGRATION.md +112 -0
- package/dist/{Animated-Cs-naa2g.d.cts → Animated-XmH6k8pZ.d.cts} +16 -3
- package/dist/{Animated-Cs-naa2g.d.ts → Animated-XmH6k8pZ.d.ts} +16 -3
- package/dist/{chunk-XUVEF2RQ.js → chunk-24SEAAOH.js} +2 -2
- package/dist/{chunk-XUVEF2RQ.js.map → chunk-24SEAAOH.js.map} +1 -1
- package/dist/{chunk-FUFBRKOG.cjs → chunk-2WBPNXO2.cjs} +21 -21
- package/dist/{chunk-FUFBRKOG.cjs.map → chunk-2WBPNXO2.cjs.map} +1 -1
- package/dist/{chunk-IUDY6S7I.cjs → chunk-37UZHCLM.cjs} +35 -14
- package/dist/chunk-37UZHCLM.cjs.map +1 -0
- package/dist/{chunk-L52N6BEN.cjs → chunk-AUOTJQGO.cjs} +7 -7
- package/dist/{chunk-L52N6BEN.cjs.map → chunk-AUOTJQGO.cjs.map} +1 -1
- package/dist/{chunk-6XDPJWSC.cjs → chunk-E7G22IQM.cjs} +32 -28
- package/dist/chunk-E7G22IQM.cjs.map +1 -0
- package/dist/chunk-IIFQ6BSJ.js +1888 -0
- package/dist/chunk-IIFQ6BSJ.js.map +1 -0
- package/dist/{chunk-ONNY7UO4.js → chunk-JDJQTKTX.js} +3 -3
- package/dist/{chunk-ONNY7UO4.js.map → chunk-JDJQTKTX.js.map} +1 -1
- package/dist/{chunk-BJKAVWED.js → chunk-MBWF36DJ.js} +35 -14
- package/dist/chunk-MBWF36DJ.js.map +1 -0
- package/dist/chunk-NV2CWBI2.cjs +290 -0
- package/dist/chunk-NV2CWBI2.cjs.map +1 -0
- package/dist/{chunk-FQBTGS3E.cjs → chunk-OFUKTVBN.cjs} +363 -285
- package/dist/chunk-OFUKTVBN.cjs.map +1 -0
- package/dist/{chunk-7KN6J7XV.cjs → chunk-OMAACCFW.cjs} +7 -7
- package/dist/{chunk-7KN6J7XV.cjs.map → chunk-OMAACCFW.cjs.map} +1 -1
- package/dist/chunk-OYQ7GYAA.cjs +1921 -0
- package/dist/chunk-OYQ7GYAA.cjs.map +1 -0
- package/dist/{chunk-YJP6DUFO.cjs → chunk-PKD3JLS2.cjs} +6 -6
- package/dist/{chunk-YJP6DUFO.cjs.map → chunk-PKD3JLS2.cjs.map} +1 -1
- package/dist/{chunk-CXDMZT45.cjs → chunk-PY7XAG4D.cjs} +27 -4
- package/dist/chunk-PY7XAG4D.cjs.map +1 -0
- package/dist/{chunk-5H7SAEQO.js → chunk-QKFJDQEK.js} +3 -3
- package/dist/{chunk-5H7SAEQO.js.map → chunk-QKFJDQEK.js.map} +1 -1
- package/dist/{chunk-XJTFZLWH.cjs → chunk-QO6PRHDX.cjs} +2 -2
- package/dist/{chunk-XJTFZLWH.cjs.map → chunk-QO6PRHDX.cjs.map} +1 -1
- package/dist/{chunk-OHDIJOGG.js → chunk-RD3JDFYJ.js} +3 -3
- package/dist/{chunk-OHDIJOGG.js.map → chunk-RD3JDFYJ.js.map} +1 -1
- package/dist/{chunk-4SM3I7WE.cjs → chunk-RXPEZXAB.cjs} +67 -38
- package/dist/chunk-RXPEZXAB.cjs.map +1 -0
- package/dist/{chunk-VTR2KGLY.cjs → chunk-S3BCHPXT.cjs} +9 -9
- package/dist/{chunk-VTR2KGLY.cjs.map → chunk-S3BCHPXT.cjs.map} +1 -1
- package/dist/{chunk-KU3XRHWA.js → chunk-TZX76ZNZ.js} +67 -38
- package/dist/chunk-TZX76ZNZ.js.map +1 -0
- package/dist/{chunk-MXQ7J4BB.js → chunk-VSVGMMNO.js} +361 -284
- package/dist/chunk-VSVGMMNO.js.map +1 -0
- package/dist/{chunk-Q7G56ZIO.js → chunk-WUBMDOTG.js} +3 -3
- package/dist/{chunk-Q7G56ZIO.js.map → chunk-WUBMDOTG.js.map} +1 -1
- package/dist/{chunk-DGRXAIWK.js → chunk-X5YM3KXY.js} +27 -4
- package/dist/chunk-X5YM3KXY.js.map +1 -0
- package/dist/chunk-XCP454Q6.js +263 -0
- package/dist/chunk-XCP454Q6.js.map +1 -0
- package/dist/{chunk-I3DQXUSC.js → chunk-Y6DFMDMH.js} +3 -3
- package/dist/{chunk-I3DQXUSC.js.map → chunk-Y6DFMDMH.js.map} +1 -1
- package/dist/{chunk-ODYQYLO2.js → chunk-YSEMAI4I.js} +8 -4
- package/dist/chunk-YSEMAI4I.js.map +1 -0
- package/dist/components/AlertDialog/index.cjs +4 -4
- package/dist/components/AlertDialog/index.js +3 -3
- package/dist/components/Collapsible/index.cjs +6 -4
- package/dist/components/Collapsible/index.js +3 -1
- package/dist/components/Dropdown/index.cjs +9 -8
- package/dist/components/Dropdown/index.js +2 -1
- package/dist/components/KeyboardShortcutsOverlay/index.cjs +5 -5
- package/dist/components/KeyboardShortcutsOverlay/index.js +3 -3
- package/dist/components/MediaEditor/index.cjs +8 -8
- package/dist/components/MediaEditor/index.js +3 -3
- package/dist/components/Modal/index.cjs +10 -10
- package/dist/components/Modal/index.js +2 -2
- package/dist/components/RichTextEditor/index.cjs +6 -5
- package/dist/components/RichTextEditor/index.js +3 -2
- package/dist/components/SuperChat/index.cjs +40 -17
- package/dist/components/SuperChat/index.cjs.map +1 -1
- package/dist/components/SuperChat/index.d.cts +20 -7
- package/dist/components/SuperChat/index.d.ts +20 -7
- package/dist/components/SuperChat/index.js +35 -12
- package/dist/components/SuperChat/index.js.map +1 -1
- package/dist/components/SuperChat/plugins/index.cjs +10 -3
- package/dist/components/SuperChat/plugins/index.cjs.map +1 -1
- package/dist/components/SuperChat/plugins/index.d.cts +3 -3
- package/dist/components/SuperChat/plugins/index.d.ts +3 -3
- package/dist/components/SuperChat/plugins/index.js +9 -2
- package/dist/components/SuperChat/plugins/index.js.map +1 -1
- package/dist/esheet.cjs +6 -6
- package/dist/esheet.js +3 -3
- package/dist/hooks/index.cjs +13 -13
- package/dist/hooks/index.js +1 -1
- package/dist/index.cjs +720 -1671
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +347 -347
- package/dist/index.d.ts +347 -347
- package/dist/index.js +459 -1405
- package/dist/index.js.map +1 -1
- package/dist/motion.cjs +7 -7
- package/dist/motion.d.cts +1 -1
- package/dist/motion.d.ts +1 -1
- package/dist/motion.js +2 -2
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +4 -4
- package/dist/tailwind-preset.js +1 -1
- package/dist/{types-DZDroUW8.d.cts → types-B97JNRNQ.d.cts} +1 -1
- package/dist/{types-B2RLmdVd.d.ts → types-CnPEwzlp.d.cts} +6 -2
- package/dist/{types-B2RLmdVd.d.cts → types-CnPEwzlp.d.ts} +6 -2
- package/dist/{types-9vK_YdEb.d.ts → types-gZXrfLj6.d.ts} +1 -1
- package/package.json +2 -1
- package/dist/chunk-4SM3I7WE.cjs.map +0 -1
- package/dist/chunk-5BVFVXHN.cjs +0 -1244
- package/dist/chunk-5BVFVXHN.cjs.map +0 -1
- package/dist/chunk-6XDPJWSC.cjs.map +0 -1
- package/dist/chunk-BJKAVWED.js.map +0 -1
- package/dist/chunk-BN75TLUN.cjs +0 -163
- package/dist/chunk-BN75TLUN.cjs.map +0 -1
- package/dist/chunk-CXDMZT45.cjs.map +0 -1
- package/dist/chunk-DGRXAIWK.js.map +0 -1
- package/dist/chunk-FQBTGS3E.cjs.map +0 -1
- package/dist/chunk-IUDY6S7I.cjs.map +0 -1
- package/dist/chunk-KU3XRHWA.js.map +0 -1
- package/dist/chunk-MXQ7J4BB.js.map +0 -1
- package/dist/chunk-O6GJ4IYS.js +0 -1210
- package/dist/chunk-O6GJ4IYS.js.map +0 -1
- package/dist/chunk-ODYQYLO2.js.map +0 -1
- package/dist/chunk-WYMO3IIK.js +0 -136
- package/dist/chunk-WYMO3IIK.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Messaging/AttachmentPicker.tsx","../src/components/Messaging/useMentionAutocomplete.tsx","../src/components/Messaging/MessageComposer.tsx"],"names":["React","React2","jsx","jsxs"],"mappings":"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","file":"chunk-O6GJ4IYS.js","sourcesContent":["import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport type { AttachmentType, AttachmentState } from './types';\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Get file type from MIME type.\n */\nfunction getFileType(mimeType: string): AttachmentType {\n if (mimeType.startsWith('image/')) return 'image';\n if (mimeType.startsWith('video/')) return 'video';\n if (mimeType.startsWith('audio/')) return 'audio';\n if (\n mimeType.includes('pdf') ||\n mimeType.includes('document') ||\n mimeType.includes('text')\n ) {\n return 'document';\n }\n return 'file';\n}\n\n/**\n * Format file size in human-readable format.\n */\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Validate file type and size.\n */\nfunction validateFile(\n file: File,\n acceptedTypes?: string[],\n maxSize?: number\n): { valid: boolean; error?: string } {\n if (acceptedTypes && acceptedTypes.length > 0) {\n const isAccepted = acceptedTypes.some((type) => {\n if (type.startsWith('.')) {\n return file.name.toLowerCase().endsWith(type.toLowerCase());\n }\n if (type.endsWith('/*')) {\n return file.type.startsWith(type.replace('/*', '/'));\n }\n return file.type === type;\n });\n if (!isAccepted) {\n return { valid: false, error: 'File type not supported' };\n }\n }\n\n if (maxSize && file.size > maxSize) {\n return {\n valid: false,\n error: `File too large (max ${formatFileSize(maxSize)})`,\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Generate a unique ID for attachments.\n */\nfunction generateAttachmentId(): string {\n return `attachment-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n// ============================================================================\n// Attachment Preview Item Component\n// ============================================================================\n\nexport interface AttachmentPreviewItemProps {\n /** The attachment to preview */\n attachment: {\n id: string;\n file: File;\n previewUrl?: string;\n type: AttachmentType;\n state: AttachmentState;\n progress?: number;\n error?: string;\n };\n /** Called when remove is clicked */\n onRemove: () => void;\n /** Called when retry is clicked */\n onRetry?: () => void;\n /** Disables the remove/retry actions. */\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Preview item for a pending attachment.\n */\nfunction AttachmentPreviewItem({\n attachment,\n onRemove,\n onRetry,\n disabled = false,\n className,\n}: AttachmentPreviewItemProps) {\n const { file, previewUrl, type, state, progress } = attachment;\n const isImage = type === 'image';\n const isVideo = type === 'video';\n const isUploading = state === 'uploading';\n const isFailed = state === 'failed';\n\n return (\n <div\n className={cn(\n 'group relative overflow-hidden rounded-lg',\n 'bg-neutral-100 dark:bg-neutral-800',\n 'border border-neutral-200 dark:border-neutral-700',\n isFailed && 'border-red-500',\n className\n )}\n >\n {/* Image/Video preview */}\n {(isImage || isVideo) && previewUrl ? (\n <div className=\"relative h-20 w-20\">\n {isVideo ? (\n <video\n src={previewUrl}\n aria-label={file.name}\n muted\n playsInline\n preload=\"metadata\"\n className={cn(\n 'h-full w-full object-cover',\n (isUploading || isFailed) && 'opacity-50'\n )}\n />\n ) : (\n <img\n src={previewUrl}\n alt={file.name}\n className={cn(\n 'h-full w-full object-cover',\n (isUploading || isFailed) && 'opacity-50'\n )}\n />\n )}\n {isVideo && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <svg\n aria-hidden=\"true\"\n className=\"h-6 w-6 text-white drop-shadow\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n </div>\n )}\n </div>\n ) : (\n /* File preview */\n <div className=\"flex h-20 w-20 flex-col items-center justify-center p-2\">\n <svg\n aria-hidden=\"true\"\n className=\"h-8 w-8 text-neutral-500\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n <span className=\"mt-1 max-w-full truncate px-1 text-xs text-neutral-600 dark:text-neutral-400\">\n {file.name.split('.').pop()?.toUpperCase()}\n </span>\n </div>\n )}\n\n {/* Upload progress overlay */}\n {isUploading && progress !== undefined && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/50\">\n <div className=\"text-center text-white\">\n <svg\n aria-hidden=\"true\"\n className=\"mx-auto h-6 w-6 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n <span className=\"mt-1 text-xs\">{progress}%</span>\n </div>\n </div>\n )}\n\n {/* Error overlay */}\n {isFailed && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/50\">\n <div className=\"text-center\">\n <svg\n aria-hidden=\"true\"\n className=\"mx-auto h-6 w-6 text-red-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n disabled={disabled}\n className=\"mt-1 text-xs text-white underline hover:no-underline disabled:no-underline disabled:opacity-50\"\n >\n Retry\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Remove button */}\n <button\n type=\"button\"\n onClick={onRemove}\n disabled={disabled}\n className={cn(\n 'absolute -end-1 -top-1 z-10',\n 'rounded-full p-1',\n 'bg-neutral-900 text-white',\n 'opacity-0 group-hover:opacity-100',\n 'focus:ring-primary-500 focus:opacity-100 focus:ring-2 focus:outline-none',\n 'transition-opacity',\n 'disabled:cursor-not-allowed disabled:group-hover:opacity-0'\n )}\n aria-label={`Remove ${file.name}`}\n >\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n\n {/* File name tooltip on hover */}\n <div\n className={cn(\n 'absolute start-0 end-0 bottom-0',\n 'bg-black/70 px-1 py-0.5',\n 'opacity-0 group-hover:opacity-100',\n 'transition-opacity'\n )}\n >\n <p className=\"truncate text-xs text-white\">{file.name}</p>\n </div>\n </div>\n );\n}\n\nAttachmentPreviewItem.displayName = 'AttachmentPreviewItem';\n\n// ============================================================================\n// Attachment Picker Component\n// ============================================================================\n\nexport interface AttachmentPickerProps {\n /** Called when files are selected */\n onFilesSelected: (files: File[]) => void;\n /** Accepted file types (MIME types or extensions) */\n acceptedTypes?: string[];\n /** Maximum file size in bytes */\n maxFileSize?: number;\n /** Maximum number of files */\n maxFiles?: number;\n /** Whether multiple files can be selected */\n multiple?: boolean;\n /** Whether the picker is disabled */\n disabled?: boolean;\n /** Called when an error occurs */\n onError?: (error: string) => void;\n className?: string;\n children?: React.ReactNode;\n}\n\n/**\n * A button/trigger component for selecting attachments.\n */\nconst AttachmentPicker = React.forwardRef<\n HTMLInputElement,\n AttachmentPickerProps\n>(\n (\n {\n onFilesSelected,\n acceptedTypes = ['image/*', 'video/*', '.pdf', '.doc', '.docx'],\n maxFileSize = 25 * 1024 * 1024, // 25MB\n maxFiles = 10,\n multiple = true,\n disabled = false,\n onError,\n className,\n children,\n },\n ref\n ) => {\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // Combine refs\n React.useImperativeHandle(ref, () => inputRef.current!);\n\n const handleClick = () => {\n inputRef.current?.click();\n };\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(event.target.files || []);\n if (files.length === 0) return;\n\n // Validate files\n const validFiles: File[] = [];\n for (const file of files.slice(0, maxFiles)) {\n const validation = validateFile(file, acceptedTypes, maxFileSize);\n if (validation.valid) {\n validFiles.push(file);\n } else if (onError) {\n onError(`${file.name}: ${validation.error}`);\n }\n }\n\n if (files.length > maxFiles && onError) {\n onError(`Maximum ${maxFiles} files allowed`);\n }\n\n if (validFiles.length > 0) {\n onFilesSelected(validFiles);\n }\n\n // Reset input\n event.target.value = '';\n };\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n accept={acceptedTypes.join(',')}\n multiple={multiple}\n onChange={handleChange}\n disabled={disabled}\n className=\"sr-only\"\n aria-label=\"Select files to attach\"\n />\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n data-slot=\"attachment-picker-button\"\n className={cn(\n 'inline-flex items-center justify-center',\n 'rounded-full p-2',\n 'text-neutral-500 hover:text-neutral-700',\n 'dark:text-neutral-400 dark:hover:text-neutral-200',\n 'hover:bg-neutral-100 dark:hover:bg-neutral-800',\n 'focus:ring-primary-500 focus:ring-2 focus:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'transition-colors',\n className\n )}\n aria-label=\"Attach files\"\n >\n {children || (\n <svg\n aria-hidden=\"true\"\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15.172 7l-6.586 6.586a2 2 0 102.828 2.828l6.414-6.586a4 4 0 00-5.656-5.656l-6.415 6.585a6 6 0 108.486 8.486L20.5 13\"\n />\n </svg>\n )}\n </button>\n </>\n );\n }\n);\n\nAttachmentPicker.displayName = 'AttachmentPicker';\n\n// ============================================================================\n// Drag Drop Zone Component\n// ============================================================================\n\nexport interface DragDropZoneProps {\n /** Called when files are dropped */\n onFilesDropped: (files: File[]) => void;\n /** Accepted file types */\n acceptedTypes?: string[];\n /** Maximum file size */\n maxFileSize?: number;\n /** Maximum number of files */\n maxFiles?: number;\n /** Whether the zone is disabled */\n disabled?: boolean;\n /** Called when an error occurs */\n onError?: (error: string) => void;\n /** Overlay text shown while dragging files over the zone. @default 'Drop files here' */\n overlayLabel?: string;\n /** Children to render inside the zone */\n children: React.ReactNode;\n className?: string;\n}\n\n/**\n * A wrapper component that accepts drag-and-drop files.\n */\nfunction DragDropZone({\n onFilesDropped,\n acceptedTypes,\n maxFileSize,\n maxFiles = 10,\n disabled = false,\n onError,\n overlayLabel = 'Drop files here',\n children,\n className,\n}: DragDropZoneProps) {\n const [isDragging, setIsDragging] = React.useState(false);\n const dragCounterRef = React.useRef(0);\n\n const handleDragEnter = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (disabled) return;\n\n dragCounterRef.current++;\n if (event.dataTransfer.items && event.dataTransfer.items.length > 0) {\n setIsDragging(true);\n }\n };\n\n const handleDragLeave = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (disabled) return;\n\n dragCounterRef.current--;\n if (dragCounterRef.current === 0) {\n setIsDragging(false);\n }\n };\n\n const handleDragOver = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n const handleDrop = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (disabled) return;\n\n setIsDragging(false);\n dragCounterRef.current = 0;\n\n const files = Array.from(event.dataTransfer.files);\n if (files.length === 0) return;\n\n // Validate files\n const validFiles: File[] = [];\n for (const file of files.slice(0, maxFiles)) {\n const validation = validateFile(file, acceptedTypes, maxFileSize);\n if (validation.valid) {\n validFiles.push(file);\n } else if (onError) {\n onError(`${file.name}: ${validation.error}`);\n }\n }\n\n if (files.length > maxFiles && onError) {\n onError(`Maximum ${maxFiles} files allowed`);\n }\n\n if (validFiles.length > 0) {\n onFilesDropped(validFiles);\n }\n };\n\n return (\n <div\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n className={cn('relative', className)}\n >\n {children}\n\n {/* Drag overlay */}\n {isDragging && (\n <div\n className={cn(\n 'absolute inset-0 z-50',\n 'flex items-center justify-center',\n 'bg-primary-50/90 dark:bg-primary-900/90',\n 'border-primary-500 border-2 border-dashed',\n 'rounded-lg'\n )}\n >\n <div className=\"text-center\">\n <svg\n aria-hidden=\"true\"\n className=\"text-primary-800 mx-auto h-12 w-12\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\"\n />\n </svg>\n <p className=\"text-primary-700 dark:text-primary-300 mt-2 text-sm font-medium\">\n {overlayLabel}\n </p>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nDragDropZone.displayName = 'DragDropZone';\n\n// ============================================================================\n// Camera Button Component (Mobile)\n// ============================================================================\n\nexport interface CameraButtonProps {\n /** Called when a photo is captured */\n onCapture: (file: File) => void;\n /** Whether to use front camera */\n useFrontCamera?: boolean;\n /** Whether the button is disabled */\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Button to capture photos from camera (mobile).\n */\nfunction CameraButton({\n onCapture,\n useFrontCamera = false,\n disabled = false,\n className,\n}: CameraButtonProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const handleClick = () => {\n inputRef.current?.click();\n };\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (file) {\n onCapture(file);\n }\n event.target.value = '';\n };\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/*\"\n capture={useFrontCamera ? 'user' : 'environment'}\n onChange={handleChange}\n disabled={disabled}\n className=\"sr-only\"\n aria-label=\"Take a photo\"\n />\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={cn(\n 'inline-flex items-center justify-center',\n 'rounded-full p-2',\n 'text-neutral-500 hover:text-neutral-700',\n 'dark:text-neutral-400 dark:hover:text-neutral-200',\n 'hover:bg-neutral-100 dark:hover:bg-neutral-800',\n 'focus:ring-primary-500 focus:ring-2 focus:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'transition-colors',\n className\n )}\n aria-label=\"Take a photo\"\n >\n <svg\n aria-hidden=\"true\"\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 13a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n </button>\n </>\n );\n}\n\nCameraButton.displayName = 'CameraButton';\n\nexport {\n AttachmentPicker,\n AttachmentPreviewItem,\n DragDropZone,\n CameraButton,\n getFileType,\n formatFileSize,\n validateFile,\n generateAttachmentId,\n};\n","import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\n\n// ============================================================================\n// @mention autocomplete — shared between MessageComposer and ChatComposer.\n//\n// Extracted verbatim from MessageComposer so both composers expose identical\n// mention behavior (query detection, keyboard navigation, insertion, ARIA\n// combobox wiring, listbox rendering). Do not change semantics here without\n// running both composers' test suites — SuperChat pins this behavior through\n// MessageComposer today.\n// ============================================================================\n\n/**\n * A candidate for the composer's `@mention` autocomplete. Generic so any\n * surface (multi-party chat, agent picker, …) can supply its own list.\n */\nexport interface MentionOption {\n /** Stable unique key for the suggestion list. */\n id: string;\n /** Display name shown in the suggestion list. */\n label: string;\n /** Text inserted after `@` on selection. Defaults to the first word of `label`. */\n value?: string;\n /** Optional secondary text shown after the label. */\n description?: string;\n /** Optional leading node (e.g. an avatar). */\n icon?: React.ReactNode;\n /** Optional trailing meta text (e.g. a kind tag). */\n meta?: string;\n}\n\n/**\n * Find the active `@query` immediately before the caret, if any. The `@` must\n * start the string or follow whitespace, and the token must contain no spaces\n * or further `@`.\n */\nexport function activeMentionQuery(\n value: string,\n caret: number\n): { query: string; start: number } | null {\n const upToCaret = value.slice(0, caret);\n const match = /(^|\\s)@([^\\s@]*)$/.exec(upToCaret);\n if (!match) return null;\n const query = match[2];\n return { query, start: caret - query.length - 1 };\n}\n\nexport interface UseMentionAutocompleteOptions {\n /** Mention candidates. Mentions are disabled when undefined or empty. */\n options?: MentionOption[];\n /** Current composer text. */\n value: string;\n /** Write the composer text (host handles controlled/uncontrolled). */\n setValue: (next: string) => void;\n /** The composer textarea, for caret restore after insertion. */\n textareaRef: React.RefObject<HTMLTextAreaElement | null>;\n}\n\nexport interface MentionAutocomplete {\n /** Whether mention support is active (options provided and non-empty). */\n enabled: boolean;\n /** Whether the suggestion menu is currently open. */\n menuOpen: boolean;\n /** Suggestions matching the active query. */\n suggestions: MentionOption[];\n /** Clamped highlight index (`-1` while the menu is closed). */\n highlight: number;\n /** id of the listbox element. */\n listId: string;\n /** id for the option at `index`. */\n optionId: (index: number) => string;\n /** Ref for the element the menu anchors to (the input wrapper). */\n anchorRef: React.RefObject<HTMLDivElement | null>;\n /** Ref for the floating listbox. */\n floatingRef: React.RefObject<HTMLUListElement | null>;\n /** Fixed-position style for the floating listbox. */\n menuStyle: React.CSSProperties;\n /** Re-derive the active query from the value and caret position. */\n sync: (value: string, caret: number) => void;\n /** Insert the given option at the active query and restore the caret. */\n insert: (option: MentionOption) => void;\n /** Move the highlight (mouse hover). */\n setHighlight: (index: number) => void;\n /**\n * Menu keyboard navigation. Returns `true` when the event was consumed\n * (callers must skip their own key handling, e.g. Enter-to-send).\n */\n handleKeyDown: (event: React.KeyboardEvent<HTMLTextAreaElement>) => boolean;\n /** ARIA combobox attributes to spread onto the textarea. */\n inputProps: React.TextareaHTMLAttributes<HTMLTextAreaElement>;\n}\n\n/**\n * State machine for `@mention` autocomplete in a composer textarea. Pair with\n * {@link MentionMenu} for the floating listbox.\n */\nexport function useMentionAutocomplete({\n options,\n value,\n setValue,\n textareaRef,\n}: UseMentionAutocompleteOptions): MentionAutocomplete {\n const enabled = !!options && options.length > 0;\n const [mention, setMention] = React.useState<{\n query: string;\n start: number;\n } | null>(null);\n const [highlight, setHighlight] = React.useState(0);\n const listId = React.useId();\n const optionId = React.useCallback(\n (index: number) => `${listId}-option-${index}`,\n [listId]\n );\n\n const suggestions = React.useMemo(() => {\n if (!mention || !options) return [];\n const q = mention.query.toLowerCase();\n return options.filter((o) => o.label.toLowerCase().includes(q));\n }, [mention, options]);\n\n const menuOpen = enabled && mention !== null && suggestions.length > 0;\n\n // Portal + fixed positioning so the mention menu escapes overflow-hidden\n // ancestors.\n const {\n anchorRef,\n floatingRef,\n style: menuStyle,\n } = useAnchoredPosition<HTMLDivElement, HTMLUListElement>({\n open: menuOpen,\n placement: 'top-start',\n maxHeight: 224,\n });\n\n // Clamp the highlight to the current suggestion range so the active option\n // never points at a stale/out-of-range index (the list can shrink while the\n // menu is open as the query narrows). The same clamped index drives\n // `aria-activedescendant`, `aria-selected`, and the visual highlight so they\n // can never disagree.\n const clampedHighlight = menuOpen\n ? Math.min(highlight, suggestions.length - 1)\n : -1;\n const activeOptionId = menuOpen ? optionId(clampedHighlight) : undefined;\n\n const sync = React.useCallback(\n (nextValue: string, caret: number) => {\n if (!enabled) return;\n setMention(activeMentionQuery(nextValue, caret));\n setHighlight(0);\n },\n [enabled]\n );\n\n const insert = (option: MentionOption) => {\n if (!mention) return;\n const insertValue = option.value ?? option.label.split(' ')[0];\n const before = value.slice(0, mention.start);\n const after = value.slice(mention.start + 1 + mention.query.length);\n const insertText = `@${insertValue} `;\n setValue(before + insertText + after);\n setMention(null);\n // Restore caret just after the inserted mention.\n const caret = before.length + insertText.length;\n requestAnimationFrame(() => {\n const el = textareaRef.current;\n if (el) {\n el.focus();\n el.setSelectionRange(caret, caret);\n }\n });\n };\n\n const handleKeyDown = (\n event: React.KeyboardEvent<HTMLTextAreaElement>\n ): boolean => {\n if (!menuOpen) return false;\n // All keyboard branches index with the clamped highlight so keyboard\n // behavior always agrees with the visible/ARIA selection, even when the\n // list shrank while the menu was open (e.g. the host swapped `options`\n // asynchronously).\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setHighlight(\n (h) => (Math.min(h, suggestions.length - 1) + 1) % suggestions.length\n );\n return true;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setHighlight(\n (h) =>\n (Math.min(h, suggestions.length - 1) - 1 + suggestions.length) %\n suggestions.length\n );\n return true;\n }\n if (event.key === 'Enter' || event.key === 'Tab') {\n event.preventDefault();\n const chosen = suggestions[clampedHighlight];\n if (chosen) insert(chosen);\n return true;\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n setMention(null);\n return true;\n }\n return false;\n };\n\n const inputProps: React.TextareaHTMLAttributes<HTMLTextAreaElement> = enabled\n ? {\n 'aria-controls': menuOpen ? listId : undefined,\n 'aria-activedescendant': activeOptionId,\n 'aria-autocomplete': 'list' as const,\n }\n : {};\n\n return {\n enabled,\n menuOpen,\n suggestions,\n highlight: clampedHighlight,\n listId,\n optionId,\n anchorRef,\n floatingRef,\n menuStyle,\n sync,\n insert,\n setHighlight,\n handleKeyDown,\n inputProps,\n };\n}\n\nexport interface MentionMenuProps {\n /** State returned by {@link useMentionAutocomplete}. */\n mention: MentionAutocomplete;\n /** Accessible label for the listbox. @default 'Mention' */\n label?: string;\n /** `data-slot` for the listbox. @default 'composer-mention-list' */\n dataSlot?: string;\n}\n\n/**\n * The floating `@mention` suggestion listbox. Rendered in a portal so it\n * escapes overflow-hidden ancestors; renders nothing while closed.\n */\nexport function MentionMenu({\n mention,\n label = 'Mention',\n dataSlot = 'composer-mention-list',\n}: MentionMenuProps) {\n if (!mention.menuOpen) return null;\n return createPortal(\n <ul\n ref={mention.floatingRef}\n style={mention.menuStyle}\n id={mention.listId}\n role=\"listbox\"\n aria-label={label}\n data-slot={dataSlot}\n className=\"w-64 overflow-y-auto rounded-lg border border-neutral-200 bg-white py-1 shadow-lg dark:border-neutral-700 dark:bg-neutral-800\"\n >\n {mention.suggestions.map((option, i) => (\n <li key={option.id}>\n <button\n type=\"button\"\n id={mention.optionId(i)}\n role=\"option\"\n aria-selected={i === mention.highlight}\n // onMouseDown (not onClick) so the textarea keeps focus.\n onMouseDown={(e) => {\n e.preventDefault();\n mention.insert(option);\n }}\n onMouseEnter={() => mention.setHighlight(i)}\n className={cn(\n 'flex w-full items-center gap-2 px-3 py-1.5 text-start text-sm',\n i === mention.highlight\n ? 'bg-primary-100 text-primary-900 dark:bg-primary-900/40 dark:text-primary-100'\n : 'text-neutral-700 dark:text-neutral-200'\n )}\n >\n {option.icon}\n <span className=\"min-w-0 flex-1 truncate\">\n <span className=\"font-medium\">{option.label}</span>\n {option.description && (\n <span className=\"ms-1 text-xs text-neutral-400\">\n {option.description}\n </span>\n )}\n </span>\n {option.meta && (\n <span className=\"text-[10px] text-neutral-400\">\n {option.meta}\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>,\n document.body\n );\n}\n\nMentionMenu.displayName = 'MentionMenu';\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport {\n MentionMenu,\n useMentionAutocomplete,\n type MentionOption,\n} from './useMentionAutocomplete';\nimport type { AttachmentType, NewMessage } from './types';\nimport {\n AttachmentPicker,\n AttachmentPreviewItem,\n CameraButton,\n DragDropZone,\n getFileType,\n generateAttachmentId,\n} from './AttachmentPicker';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface PendingAttachment {\n id: string;\n file: File;\n previewUrl?: string;\n type: AttachmentType;\n state: 'pending' | 'uploading' | 'uploaded' | 'failed';\n progress?: number;\n error?: string;\n}\n\n// `MentionOption` lives in the shared mention module (used by ChatComposer\n// too); re-exported here so existing deep imports keep working.\nexport type { MentionOption };\n\n/**\n * Whether a file satisfies one of the accepted `<input accept>` tokens.\n * Supports `type/*` wildcards, exact `type/subtype` tokens, and `.ext`\n * extension tokens (matched against the file name, mirroring the native\n * `<input accept>` behavior used by the picker and drag-and-drop).\n */\nfunction isFileAccepted(file: File, accepted: string[]): boolean {\n if (!accepted || accepted.length === 0) return true;\n const mime = file.type;\n const name = file.name.toLowerCase();\n return accepted.some((token) => {\n if (token.startsWith('.')) return name.endsWith(token.toLowerCase());\n if (token.endsWith('/*')) return mime.startsWith(token.slice(0, -1));\n if (token.includes('/')) return mime === token;\n return false;\n });\n}\n\n// ============================================================================\n// Character Counter Component\n// ============================================================================\n\nexport interface CharacterCounterProps {\n current: number;\n max: number;\n showWarningAt?: number;\n className?: string;\n}\n\n/**\n * Displays character count with warning colors.\n */\nfunction CharacterCounter({\n current,\n max,\n showWarningAt = 0.9,\n className,\n}: CharacterCounterProps) {\n const percentage = current / max;\n const isWarning = percentage >= showWarningAt && percentage < 1;\n const isOver = current > max;\n\n return (\n <span\n className={cn(\n 'text-xs tabular-nums',\n isOver\n ? 'font-medium text-red-700 dark:text-red-400'\n : isWarning\n ? 'text-amber-700 dark:text-amber-400'\n : 'text-neutral-600 dark:text-neutral-400',\n className\n )}\n aria-live=\"polite\"\n aria-label={`${current} of ${max} characters`}\n >\n {current}/{max}\n </span>\n );\n}\n\nCharacterCounter.displayName = 'CharacterCounter';\n\n// ============================================================================\n// Send Button Component\n// ============================================================================\n\nconst sendButtonVariants = cva(\n [\n 'inline-flex items-center justify-center',\n 'rounded-full p-3 self-start',\n 'transition-all duration-200',\n 'focus:outline-none focus:ring-2 focus:ring-primary-500',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n ],\n {\n variants: {\n variant: {\n primary: [\n 'bg-primary-800 text-white',\n 'hover:bg-primary-900',\n 'active:scale-95',\n ],\n subtle: [\n 'bg-transparent text-primary-800',\n 'hover:bg-primary-50 dark:hover:bg-primary-900/20',\n ],\n },\n canSend: {\n true: '',\n false: 'opacity-50 cursor-not-allowed',\n },\n },\n defaultVariants: {\n variant: 'primary',\n canSend: false,\n },\n }\n);\n\nexport interface SendButtonProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof sendButtonVariants> {\n isLoading?: boolean;\n}\n\n/**\n * Send button with loading state.\n */\nconst SendButton = React.forwardRef<HTMLButtonElement, SendButtonProps>(\n ({ className, variant, canSend, isLoading, disabled, ...props }, ref) => {\n return (\n <button\n ref={ref}\n type=\"submit\"\n disabled={disabled || !canSend || isLoading}\n data-slot=\"composer-send-button\"\n className={cn(sendButtonVariants({ variant, canSend }), className)}\n aria-label={isLoading ? 'Sending message' : 'Send message'}\n {...props}\n >\n {isLoading ? (\n <svg\n aria-hidden=\"true\"\n className=\"h-5 w-5 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n ) : (\n <svg\n aria-hidden=\"true\"\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 19l9 2-9-18-9 18 9-2zm0 0v-8\"\n />\n </svg>\n )}\n </button>\n );\n }\n);\n\nSendButton.displayName = 'SendButton';\n\n// ============================================================================\n// Message Composer Component\n// ============================================================================\n\nexport interface MessageComposerProps {\n /** Called when a message is sent */\n onSend: (message: NewMessage) => void | Promise<void>;\n /** Called when the user starts typing */\n onTypingStart?: () => void;\n /** Called when the user stops typing */\n onTypingStop?: () => void;\n /** Controlled value for the textarea */\n value?: string;\n /** Callback when value changes (for controlled mode) */\n onValueChange?: (value: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Maximum message length */\n maxLength?: number;\n /** Show character count */\n showCharacterCount?: boolean;\n /** Whether the composer is disabled */\n disabled?: boolean;\n /** Whether a message is currently being sent */\n isSending?: boolean;\n /** Show attachment picker */\n showAttachmentPicker?: boolean;\n /** Show camera button (mobile) */\n showCameraButton?: boolean;\n /** Accepted file types */\n acceptedFileTypes?: string[];\n /** Maximum file size */\n maxFileSize?: number;\n /** Maximum number of attachments */\n maxAttachments?: number;\n /** Called when an error occurs */\n onError?: (error: string) => void;\n /** Auto-focus the input */\n autoFocus?: boolean;\n /** Reply-to message reference */\n replyTo?: {\n id: string;\n content: string;\n senderName: string;\n } | null;\n /** Called when reply is cancelled */\n onCancelReply?: () => void;\n /** Visual variant - 'default' shows border-t, 'minimal' has no border */\n variant?: 'default' | 'minimal';\n /** Content to render inside the input wrapper (e.g. a mic button) */\n inputTrailing?: React.ReactNode;\n /**\n * Candidates for `@mention` autocomplete. When provided (non-empty), typing\n * `@` opens a picker. Omit to disable mentions entirely (default).\n */\n mentionOptions?: MentionOption[];\n /** Additional class name */\n className?: string;\n}\n\n/**\n * A message input component with attachment support and send button.\n *\n * @example\n * ```tsx\n * <MessageComposer\n * onSend={handleSend}\n * placeholder=\"Type a message...\"\n * showAttachmentPicker\n * maxLength={1600}\n * />\n * ```\n */\nconst MessageComposer = React.forwardRef<\n HTMLTextAreaElement,\n MessageComposerProps\n>(\n (\n {\n onSend,\n onTypingStart,\n onTypingStop,\n value: controlledValue,\n onValueChange,\n placeholder = 'Type a message...',\n maxLength = 1600,\n showCharacterCount = false,\n disabled = false,\n isSending = false,\n showAttachmentPicker = true,\n showCameraButton = false,\n acceptedFileTypes = ['image/*', 'video/*', '.pdf', '.doc', '.docx'],\n maxFileSize = 25 * 1024 * 1024,\n maxAttachments = 10,\n onError,\n autoFocus = false,\n replyTo = null,\n onCancelReply,\n variant = 'default',\n inputTrailing,\n mentionOptions,\n className,\n },\n ref\n ) => {\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const [internalContent, setInternalContent] = React.useState('');\n const isControlled = controlledValue !== undefined;\n const content = isControlled ? controlledValue : internalContent;\n const setContent = React.useCallback(\n (val: string | ((prev: string) => string)) => {\n if (isControlled) {\n const newVal = typeof val === 'function' ? val(controlledValue) : val;\n onValueChange?.(newVal);\n } else {\n setInternalContent(val);\n }\n },\n [isControlled, controlledValue, onValueChange]\n );\n const [attachments, setAttachments] = React.useState<PendingAttachment[]>(\n []\n );\n const [isTyping, setIsTyping] = React.useState(false);\n const typingTimeoutRef = React.useRef<NodeJS.Timeout | null>(null);\n\n // Combine refs\n React.useImperativeHandle(ref, () => textareaRef.current!);\n\n // Auto-resize textarea\n React.useEffect(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.style.height = 'auto';\n textarea.style.height = `${Math.min(textarea.scrollHeight, 150)}px`;\n }\n }, [content]);\n\n // Handle typing indicators\n React.useEffect(() => {\n if (content.length > 0 && !isTyping) {\n setIsTyping(true);\n onTypingStart?.();\n }\n\n // Clear previous timeout\n if (typingTimeoutRef.current) {\n clearTimeout(typingTimeoutRef.current);\n }\n\n // Set timeout to stop typing indicator\n typingTimeoutRef.current = setTimeout(() => {\n if (isTyping) {\n setIsTyping(false);\n onTypingStop?.();\n }\n }, 2000);\n\n return () => {\n if (typingTimeoutRef.current) {\n clearTimeout(typingTimeoutRef.current);\n }\n };\n }, [content, isTyping, onTypingStart, onTypingStop]);\n\n // Focus on mount if autoFocus\n React.useEffect(() => {\n if (autoFocus) {\n textareaRef.current?.focus();\n }\n }, [autoFocus]);\n\n // Focus when reply is set\n React.useEffect(() => {\n if (replyTo) {\n textareaRef.current?.focus();\n }\n }, [replyTo]);\n\n // --- @mention autocomplete (opt-in via `mentionOptions`) ---\n const mention = useMentionAutocomplete({\n options: mentionOptions,\n value: content,\n setValue: setContent,\n textareaRef,\n });\n\n const canSend =\n (content.trim().length > 0 || attachments.length > 0) &&\n content.length <= maxLength &&\n !disabled &&\n !isSending;\n\n const handleSubmit = async (event: React.FormEvent) => {\n event.preventDefault();\n if (!canSend) return;\n\n const message: NewMessage = {\n content: content.trim(),\n attachments: attachments.map((a) => a.file),\n replyToId: replyTo?.id,\n };\n\n // Clear state before sending for optimistic UI\n setContent('');\n setAttachments([]);\n setIsTyping(false);\n onTypingStop?.();\n\n try {\n await onSend(message);\n } catch {\n // Restore content on failure\n setContent(message.content);\n // Note: attachments would need to be re-added manually\n onError?.('Failed to send message');\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // @mention menu navigation takes priority over send.\n if (mention.handleKeyDown(event)) return;\n // Send on Enter (without Shift)\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n if (canSend) {\n handleSubmit(event);\n }\n }\n };\n\n const handleFilesSelected = (files: File[]) => {\n const remainingSlots = maxAttachments - attachments.length;\n const filesToAdd = files.slice(0, remainingSlots);\n\n if (files.length > remainingSlots) {\n onError?.(`Maximum ${maxAttachments} attachments allowed`);\n }\n\n const newAttachments: PendingAttachment[] = filesToAdd.map((file) => {\n const type = getFileType(file.type);\n let previewUrl: string | undefined;\n\n if (type === 'image' || type === 'video') {\n previewUrl = URL.createObjectURL(file);\n }\n\n return {\n id: generateAttachmentId(),\n file,\n previewUrl,\n type,\n state: 'pending' as const,\n };\n });\n\n setAttachments((prev) => [...prev, ...newAttachments]);\n };\n\n // Paste-to-attach: route pasted files through the same path as the picker.\n const handlePaste = (event: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (!showAttachmentPicker || disabled) return;\n const pasted = Array.from(event.clipboardData.items)\n .filter((item) => item.kind === 'file')\n .map((item) => item.getAsFile())\n .filter((f): f is File => f !== null)\n .filter((f) => isFileAccepted(f, acceptedFileTypes));\n if (pasted.length === 0) return;\n // We're attaching the file ourselves; don't also paste a blob/path.\n event.preventDefault();\n handleFilesSelected(pasted);\n };\n\n const handleRemoveAttachment = (attachmentId: string) => {\n setAttachments((prev) => {\n const attachment = prev.find((a) => a.id === attachmentId);\n if (attachment?.previewUrl) {\n URL.revokeObjectURL(attachment.previewUrl);\n }\n return prev.filter((a) => a.id !== attachmentId);\n });\n };\n\n // Cleanup preview URLs on unmount\n React.useEffect(() => {\n // Capture current attachments for cleanup\n const currentAttachments = attachments;\n return () => {\n currentAttachments.forEach((a) => {\n if (a.previewUrl) {\n URL.revokeObjectURL(a.previewUrl);\n }\n });\n };\n }, [attachments]);\n\n return (\n <DragDropZone\n onFilesDropped={handleFilesSelected}\n acceptedTypes={acceptedFileTypes}\n maxFileSize={maxFileSize}\n maxFiles={maxAttachments - attachments.length}\n disabled={disabled || attachments.length >= maxAttachments}\n onError={onError}\n className={cn('w-full', className)}\n >\n <form\n onSubmit={handleSubmit}\n data-slot=\"message-composer\"\n className=\"w-full\"\n >\n {/* Reply preview */}\n {replyTo && (\n <div\n data-slot=\"composer-reply-preview\"\n className={cn(\n 'flex items-center gap-2 px-4 py-2',\n 'bg-neutral-50 dark:bg-neutral-800/50',\n 'border-primary-500 border-s-4'\n )}\n >\n <div className=\"min-w-0 flex-1\">\n <span className=\"text-primary-800 dark:text-primary-400 text-xs font-medium\">\n Replying to {replyTo.senderName}\n </span>\n <p className=\"truncate text-sm text-neutral-600 dark:text-neutral-300\">\n {replyTo.content}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={onCancelReply}\n className={cn(\n 'shrink-0 rounded p-1',\n 'text-neutral-500 hover:text-neutral-700',\n 'dark:text-neutral-400 dark:hover:text-neutral-200',\n 'focus:ring-primary-500 focus:ring-2 focus:outline-none'\n )}\n aria-label=\"Cancel reply\"\n >\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n )}\n\n {/* Attachment previews */}\n {attachments.length > 0 && (\n <div\n data-slot=\"composer-attachments\"\n className={cn(\n 'flex flex-wrap gap-2 p-3',\n 'border-t border-neutral-200 dark:border-neutral-700'\n )}\n >\n {attachments.map((attachment) => (\n <AttachmentPreviewItem\n key={attachment.id}\n attachment={attachment}\n onRemove={() => handleRemoveAttachment(attachment.id)}\n />\n ))}\n </div>\n )}\n\n {/* Input area */}\n <div\n data-slot=\"composer-input-area\"\n className={cn(\n 'flex items-center gap-2 p-3',\n 'bg-white dark:bg-neutral-900',\n variant === 'default' &&\n 'border-t border-neutral-200 dark:border-neutral-700'\n )}\n >\n {/* Attachment buttons */}\n {showAttachmentPicker && (\n <AttachmentPicker\n onFilesSelected={handleFilesSelected}\n acceptedTypes={acceptedFileTypes}\n maxFileSize={maxFileSize}\n maxFiles={maxAttachments - attachments.length}\n disabled={disabled || attachments.length >= maxAttachments}\n onError={onError}\n />\n )}\n\n {showCameraButton && (\n <CameraButton\n onCapture={(file) => handleFilesSelected([file])}\n disabled={disabled || attachments.length >= maxAttachments}\n />\n )}\n\n {/* Text input */}\n <div\n data-slot=\"composer-input-wrapper\"\n className=\"relative flex-1\"\n ref={mention.anchorRef}\n >\n <MentionMenu mention={mention} />\n <textarea\n ref={textareaRef}\n data-slot=\"composer-input\"\n value={content}\n onChange={(e) => {\n setContent(e.target.value);\n mention.sync(\n e.target.value,\n e.target.selectionStart ?? e.target.value.length\n );\n }}\n onClick={(e) => {\n const el = e.currentTarget;\n mention.sync(el.value, el.selectionStart ?? el.value.length);\n }}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={placeholder}\n disabled={disabled || isSending}\n rows={1}\n className={cn(\n 'w-full resize-none rounded-2xl py-2.5',\n inputTrailing ? 'ps-4 pe-10' : 'px-4',\n 'bg-neutral-100 dark:bg-neutral-800',\n 'text-neutral-900 dark:text-neutral-100',\n 'placeholder:text-neutral-400 dark:placeholder:text-neutral-500',\n 'focus:ring-primary-500 focus:ring-2 focus:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'transition-colors',\n 'max-h-[150px]'\n )}\n aria-label=\"Message\"\n aria-describedby={showCharacterCount ? 'char-count' : undefined}\n {...mention.inputProps}\n />\n\n {/* Trailing content (e.g. record button) */}\n {inputTrailing && (\n <div\n data-slot=\"composer-input-trailing\"\n className=\"pointer-events-none absolute end-1 top-0 flex h-[44px] items-center [&>*]:pointer-events-auto\"\n >\n {inputTrailing}\n </div>\n )}\n\n {/* Character count */}\n {showCharacterCount && (\n <div\n data-slot=\"composer-char-count\"\n id=\"char-count\"\n className=\"absolute end-3 bottom-1.5\"\n >\n <CharacterCounter current={content.length} max={maxLength} />\n </div>\n )}\n </div>\n\n {/* Send button */}\n <SendButton\n canSend={canSend}\n isLoading={isSending}\n disabled={disabled}\n />\n </div>\n </form>\n </DragDropZone>\n );\n }\n);\n\nMessageComposer.displayName = 'MessageComposer';\n\nexport { MessageComposer, CharacterCounter, SendButton, sendButtonVariants };\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/RowActionToolbar/RowActionToolbar.tsx","../src/components/AllergyList/AllergyList.tsx","../src/components/CodeLookup/context.tsx","../src/components/AllergyList/AllergyManager.tsx","../src/components/MedicationList/MedicationList.tsx","../src/components/MedicationList/MedicationEditor.tsx","../src/components/MedicationList/MedicationReconciliation.tsx"],"names":["jsx","React","React2","jsxs","DEFAULT_ACTIONS","ACTION_META","React4","newId","React5","Fragment","React6"],"mappings":"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","file":"chunk-ODYQYLO2.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport { Tooltip } from '../Tooltip';\n\n/**\n * Toolbar / group arrow-key navigation (WAI-ARIA toolbar pattern).\n * Attach to a container's onKeyDown: ←/→ move focus between enabled\n * buttons, Home/End jump to first/last.\n */\nexport function toolbarKeyNav(e: React.KeyboardEvent<HTMLElement>) {\n if (e.altKey || e.ctrlKey || e.metaKey) return;\n if (!['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(e.key)) return;\n const buttons = Array.from(\n e.currentTarget.querySelectorAll<HTMLButtonElement>(\n 'button:not([disabled])'\n )\n );\n const i = buttons.indexOf(document.activeElement as HTMLButtonElement);\n if (i === -1 || buttons.length === 0) return;\n e.preventDefault();\n e.stopPropagation();\n const next =\n e.key === 'ArrowLeft'\n ? (i - 1 + buttons.length) % buttons.length\n : e.key === 'ArrowRight'\n ? (i + 1) % buttons.length\n : e.key === 'Home'\n ? 0\n : buttons.length - 1;\n buttons[next]?.focus();\n}\n\n// Alignment of the floating (fine-pointer) overlay within the row.\nconst ALIGN = {\n /** Vertically centered on the row's right edge (single-line rows). */\n center:\n 'pointer-fine:top-1/2 pointer-fine:end-0 pointer-fine:-translate-y-1/2',\n /** Pinned near the row's top-right corner (multi-line rows). */\n top: 'pointer-fine:top-1.5 pointer-fine:end-1.5',\n} as const;\n\n// Which hover scope reveals the toolbar. Rows nested inside another `group`\n// (e.g. order rows inside an assessed problem) use a named group so hovering\n// the outer block doesn't reveal every nested toolbar. `grid` keys off the\n// datavis (NITRO) table row (`.wcdv-tr`) for toolbars rendered into grid\n// cells via `formatCell`.\nconst REVEAL = {\n row: cn(\n 'group-hover:pointer-events-auto group-hover:opacity-100',\n 'group-focus-within:pointer-events-auto group-focus-within:opacity-100',\n 'group-focus:pointer-events-auto group-focus:opacity-100'\n ),\n order: cn(\n 'group-hover/order:pointer-events-auto group-hover/order:opacity-100',\n 'group-focus-within/order:pointer-events-auto group-focus-within/order:opacity-100',\n 'group-focus/order:pointer-events-auto group-focus/order:opacity-100'\n ),\n grid: cn(\n '[.wcdv-tr:hover_&]:pointer-events-auto [.wcdv-tr:hover_&]:opacity-100',\n '[.wcdv-tr:focus-within_&]:pointer-events-auto [.wcdv-tr:focus-within_&]:opacity-100'\n ),\n} as const;\n\nexport interface RowActionToolbarProps {\n /** Accessible name, e.g. `Actions for penicillin`. */\n label: string;\n /** Overlay alignment on fine-pointer devices. @default 'center' */\n align?: keyof typeof ALIGN;\n /**\n * Hover scope for the reveal. Use `'order'` when the row is a\n * `group/order` nested inside another `group`; use `'grid'` inside a\n * datavis (NITRO) grid cell — the toolbar then stays in flow (the cell\n * reserves its space) and reveals when the `.wcdv-tr` row is hovered.\n * @default 'row'\n */\n group?: keyof typeof REVEAL;\n className?: string;\n children: React.ReactNode;\n}\n\n/**\n * Per-row action toolbar for clinical lists.\n *\n * On hover-capable (fine pointer) devices it floats over the row's right\n * edge as a card-styled overlay, hidden until the row is hovered or\n * keyboard-focused. Touch devices can't hover, so the toolbar stays in\n * flow at the end of the row (`ms-auto`) and is always visible.\n *\n * Implements WAI-ARIA toolbar arrow-key navigation. The parent row must be\n * `relative` and carry the matching `group` (or `group/order`) class.\n */\nexport function RowActionToolbar({\n label,\n align = 'center',\n group = 'row',\n className,\n children,\n}: RowActionToolbarProps) {\n return (\n <div\n role=\"toolbar\"\n aria-label={label}\n onKeyDown={toolbarKeyNav}\n className={cn(\n 'z-10 ms-auto flex items-center gap-0.5 transition-opacity',\n // Inside a grid cell the column already reserves the space, so the\n // toolbar stays in flow — no absolute overlay. It keeps the card\n // chrome, though: pair with a `sticky end-0` actions column and it\n // floats over scrolled-under content at the grid's right edge.\n group !== 'grid' && [\n 'pointer-fine:absolute',\n ALIGN[align],\n 'pointer-fine:bg-card pointer-fine:border-border pointer-fine:rounded-md pointer-fine:border pointer-fine:p-0.5 pointer-fine:shadow-sm',\n ],\n group === 'grid' &&\n 'bg-card border-border rounded-md border p-0.5 shadow-sm',\n 'pointer-fine:pointer-events-none pointer-fine:opacity-0',\n REVEAL[group],\n 'focus-within:pointer-events-auto focus-within:opacity-100',\n className\n )}\n >\n {children}\n </div>\n );\n}\n\nexport interface RowIconButtonProps {\n label: string;\n icon: React.ComponentType<{ size?: number | string }>;\n onClick: () => void;\n /** Toggle-button state (renders `aria-pressed` + tinted background). */\n active?: boolean;\n /** `md` = 32px button / 16px icon; `sm` = 28px / 14px. @default 'md' */\n size?: 'md' | 'sm';\n}\n\n/** Tooltip-labeled ghost icon button for `RowActionToolbar`. */\nexport function RowIconButton({\n label,\n icon: Icon,\n onClick,\n active,\n size = 'md',\n}: RowIconButtonProps) {\n return (\n <Tooltip content={label}>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={label}\n aria-pressed={active}\n onClick={(e) => {\n e.stopPropagation();\n onClick();\n }}\n className={cn(\n size === 'sm' ? 'h-7 w-7' : 'h-8 w-8',\n 'shrink-0',\n active &&\n 'bg-primary-50 text-primary-700 dark:bg-primary-950 dark:text-primary-400'\n )}\n >\n <Icon size={size === 'sm' ? 14 : 16} />\n </Button>\n </Tooltip>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge/Badge';\nimport { Button } from '../Button';\nimport { Card, CardHeader, CardContent } from '../Card/Card';\nimport { useLiveAnnouncement } from '../../hooks/useLiveAnnouncement';\nimport { RowActionToolbar, RowIconButton } from '../RowActionToolbar';\nimport {\n useDragReorder,\n dragIndicatorClasses,\n type UseDragReorderReturn,\n} from '../../hooks/useDragReorder';\nimport {\n PencilIcon,\n StickyNoteIcon,\n BanIcon,\n PlusIcon,\n AlertCircleIcon,\n GripVerticalIcon,\n} from '../Icons';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Allergy category (FHIR AllergyIntolerance.category). */\nexport type AllergyType = 'drug' | 'food' | 'environmental' | 'other';\n\n/**\n * Mechanism distinction (FHIR AllergyIntolerance.type): a true\n * immune-mediated allergy vs a non-immune intolerance (e.g. GI upset).\n * The distinction matters clinically — an intolerance mislabeled as an\n * allergy causes unnecessary avoidance of first-line drugs.\n */\nexport type AllergyKind = 'allergy' | 'intolerance';\n\n/** Reaction severity (FHIR reaction.severity). */\nexport type AllergySeverity = 'mild' | 'moderate' | 'severe';\n\n/** Coding-system reference for an allergen (RxNorm / FDB / SNOMED …). */\nexport interface AllergyCode {\n system: string;\n code: string;\n display?: string;\n}\n\n/**\n * A single allergy / intolerance.\n *\n * Loosely follows FHIR AllergyIntolerance: allergen (+ optional code),\n * category, reaction, severity, onset, and clinical status.\n */\nexport interface Allergy {\n /** Stable unique id */\n id: string;\n /** Allergen display name, e.g. \"penicillin\" */\n allergen: string;\n /** Category — groups the list */\n type?: AllergyType;\n /** Allergy vs intolerance (FHIR AllergyIntolerance.type; default 'allergy') */\n kind?: AllergyKind;\n /** Reaction description, e.g. \"hives\" */\n reaction?: string;\n /** Reaction severity — drives the badge color */\n severity?: AllergySeverity;\n /** Onset date (display string) */\n onsetDate?: string;\n /** Free-text note */\n note?: string;\n /** Inactive/resolved entries render struck through */\n inactive?: boolean;\n /** Code reference (RxNorm/FDB for drugs, SNOMED otherwise) */\n code?: AllergyCode;\n}\n\n/** Row actions revealed on hover. */\nexport type AllergyAction = 'correct' | 'note' | 'remove';\n\nexport interface AllergyListProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'className' | 'title'\n> {\n /** Allergies to display (controlled) */\n allergies: Allergy[];\n /**\n * No-known-allergies flag (NKA/NKDA). An empty list is ambiguous —\n * \"not asked\" vs \"asked, none\" — so this is explicit tri-state:\n * undefined = not recorded, true = no known allergies.\n * Ignored when `allergies` is non-empty.\n */\n noKnownAllergies?: boolean;\n /** Called when the no-known-allergies affordance is toggled */\n onNoKnownAllergiesChange?: (value: boolean) => void;\n /** Header title (pass null to hide) */\n title?: string | null;\n /** Row actions to show (default: all) */\n actions?: AllergyAction[];\n /** Called when a row action is clicked */\n onAction?: (allergy: Allergy, action: AllergyAction) => void;\n /**\n * Called with the full new id order after a drag/keyboard reorder.\n * Omit to disable reordering. Drops are restricted to the same\n * category group.\n */\n onReorder?: (allergyIds: string[]) => void;\n /** Custom add UI (e.g. an inline CodeLookup search) */\n addSearch?: React.ReactNode;\n /** Called when the \"Add allergy\" button is clicked (omit to hide) */\n onAdd?: () => void;\n /** Hide all action affordances (display only) */\n readOnly?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst TYPE_ORDER: AllergyType[] = ['drug', 'food', 'environmental', 'other'];\n\nexport const ALLERGY_TYPE_LABELS: Record<AllergyType, string> = {\n drug: 'Drug',\n food: 'Food',\n environmental: 'Environmental',\n other: 'Other',\n};\n\nconst SEVERITY_BADGE: Record<\n AllergySeverity,\n 'danger' | 'warning' | 'secondary'\n> = {\n severe: 'danger',\n moderate: 'warning',\n mild: 'secondary',\n};\n\nconst DEFAULT_ACTIONS: AllergyAction[] = ['correct', 'note', 'remove'];\n\nconst ACTION_META: Record<\n AllergyAction,\n { label: string; icon: React.ComponentType<{ size?: number | string }> }\n> = {\n correct: { label: 'Correct', icon: PencilIcon },\n note: { label: 'Notes', icon: StickyNoteIcon },\n remove: { label: 'Remove', icon: BanIcon },\n};\n\n// =============================================================================\n// Sub-components\n// =============================================================================\n\nfunction AllergyRow({\n allergy,\n actions,\n readOnly,\n drag,\n onMove,\n onAction,\n}: {\n allergy: Allergy;\n actions: AllergyAction[];\n readOnly: boolean;\n drag: UseDragReorderReturn;\n /** Keyboard equivalent of drag reordering (Alt+↑/↓) */\n onMove?: (allergy: Allergy, dir: -1 | 1) => void;\n onAction?: (allergy: Allergy, action: AllergyAction) => void;\n}) {\n const handleRowKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.altKey && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {\n e.preventDefault();\n onMove?.(allergy, e.key === 'ArrowUp' ? -1 : 1);\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const list = e.currentTarget.closest('ul');\n if (!list) return;\n const rows = Array.from(\n list.querySelectorAll<HTMLElement>('li[data-allergy-id]')\n );\n const i = rows.indexOf(e.currentTarget as HTMLElement);\n rows[\n e.key === 'ArrowUp'\n ? Math.max(0, i - 1)\n : Math.min(rows.length - 1, i + 1)\n ]?.focus();\n }\n };\n\n return (\n // Rows are focus stops when reordering is enabled so drag & drop has a\n // keyboard equivalent (Alt+↑/↓) — 508.\n /* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */\n <li\n data-slot=\"clinical-list-row\"\n data-allergy-id={allergy.id}\n tabIndex={drag.enabled ? 0 : undefined}\n onKeyDown={drag.enabled ? handleRowKeyDown : undefined}\n aria-label={\n drag.enabled\n ? `${allergy.allergen}. Alt plus arrow keys to reorder.`\n : undefined\n }\n {...drag.rowProps(allergy.id)}\n className={cn(\n 'group border-border/60 relative flex min-h-11 flex-wrap items-center gap-x-2 gap-y-1 border-b px-1 py-2',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n drag.enabled && 'cursor-grab active:cursor-grabbing',\n dragIndicatorClasses(drag, allergy.id)\n )}\n >\n {/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n {drag.enabled ? (\n <GripVerticalIcon\n size={14}\n aria-hidden\n className=\"text-muted-foreground/50 shrink-0\"\n />\n ) : (\n <span className=\"text-muted-foreground/60 select-none\">•</span>\n )}\n <span\n className={cn(\n 'text-foreground font-medium',\n allergy.inactive && 'text-muted-foreground line-through'\n )}\n >\n {allergy.allergen}\n </span>\n {allergy.code && (\n <span\n className=\"text-muted-foreground/70 text-xs\"\n title={allergy.code.display}\n >\n {allergy.code.system} {allergy.code.code}\n </span>\n )}\n {allergy.severity && (\n <Badge variant={SEVERITY_BADGE[allergy.severity]} size=\"sm\">\n {allergy.severity}\n </Badge>\n )}\n {allergy.kind === 'intolerance' && (\n <Badge variant=\"secondary\" size=\"sm\">\n intolerance\n </Badge>\n )}\n {allergy.reaction && (\n <span className=\"text-muted-foreground text-sm\">\n — {allergy.reaction}\n </span>\n )}\n {allergy.onsetDate && (\n <span className=\"text-muted-foreground text-xs\">\n since {allergy.onsetDate}\n </span>\n )}\n {allergy.inactive && (\n <Badge variant=\"secondary\" size=\"sm\">\n inactive\n </Badge>\n )}\n {allergy.note && (\n <span className=\"flex w-full basis-full items-center gap-1.5 ps-4\">\n <StickyNoteIcon size={12} className=\"text-muted-foreground\" />\n <span className=\"text-muted-foreground text-xs\">{allergy.note}</span>\n </span>\n )}\n\n {!readOnly && actions.length > 0 && (\n <RowActionToolbar label={`Actions for ${allergy.allergen}`}>\n {actions.map((action) => (\n <RowIconButton\n key={action}\n label={ACTION_META[action].label}\n icon={ACTION_META[action].icon}\n onClick={() => onAction?.(allergy, action)}\n />\n ))}\n </RowActionToolbar>\n )}\n </li>\n );\n}\n\n// =============================================================================\n// AllergyList\n// =============================================================================\n\n/**\n * Allergy / intolerance list — presentational layer.\n *\n * Controlled: allergies come in via props; every interaction is reported\n * through callbacks. Entries group by category (Drug → Food →\n * Environmental → Other); severity renders as a colored badge; hover (or\n * keyboard-focus) a row for Correct / Notes / Remove.\n *\n * The empty state is explicit tri-state via `noKnownAllergies` (NKA):\n * an empty list shows \"Allergy status not recorded\" until the No Known\n * Allergies affordance is confirmed — an empty list must never silently\n * read as \"no allergies\".\n *\n * Pair with `AllergyManager` for the batteries-included experience.\n */\nexport const AllergyList = React.forwardRef<HTMLDivElement, AllergyListProps>(\n (\n {\n allergies,\n noKnownAllergies,\n onNoKnownAllergiesChange,\n title = 'Allergies',\n actions = DEFAULT_ACTIONS,\n onAction,\n onReorder,\n addSearch,\n onAdd,\n readOnly = false,\n className,\n 'data-testid': dataTestId,\n ...props\n },\n ref\n ) => {\n const [announcement, setAnnouncement] = useLiveAnnouncement();\n\n const groups = TYPE_ORDER.map((type) => ({\n type,\n label: ALLERGY_TYPE_LABELS[type],\n items: allergies.filter((a) => (a.type ?? 'other') === type),\n })).filter((g) => g.items.length > 0);\n\n const empty = allergies.length === 0;\n\n // Drag & drop reordering, restricted to the same category group.\n const typeOf = React.useCallback(\n (id: string) => allergies.find((a) => a.id === id)?.type ?? 'other',\n [allergies]\n );\n const drag = useDragReorder({\n ids: allergies.map((a) => a.id),\n onReorder:\n readOnly || !onReorder\n ? undefined\n : (ids) => {\n setAnnouncement('Allergy list reordered');\n onReorder(ids);\n },\n canDropOn: (dragged, target) => typeOf(dragged) === typeOf(target),\n });\n\n /** Keyboard equivalent of dragging a row: swap within the category. */\n const moveAllergy = React.useCallback(\n (allergy: Allergy, dir: -1 | 1) => {\n if (readOnly || !onReorder) return;\n const ids = allergies.map((a) => a.id);\n const from = ids.indexOf(allergy.id);\n let to = from + dir;\n while (\n to >= 0 &&\n to < allergies.length &&\n (allergies[to].type ?? 'other') !== (allergy.type ?? 'other')\n ) {\n to += dir;\n }\n if (to < 0 || to >= allergies.length) return;\n [ids[from], ids[to]] = [ids[to], ids[from]];\n setAnnouncement(\n `${allergy.allergen} moved ${dir === -1 ? 'up' : 'down'}`\n );\n onReorder(ids);\n },\n [allergies, onReorder, readOnly, setAnnouncement]\n );\n\n return (\n <Card\n ref={ref}\n padding=\"none\"\n className={cn('w-full', className)}\n data-testid={dataTestId}\n {...props}\n >\n {title !== null && (\n <CardHeader className=\"border-border bg-muted/50 border-b px-4 py-3\">\n <h3 className=\"text-foreground flex items-center gap-2 text-sm font-semibold tracking-wide uppercase\">\n <AlertCircleIcon\n size={16}\n className=\"text-red-600 dark:text-red-400\"\n />\n {title}\n </h3>\n </CardHeader>\n )}\n\n <CardContent className=\"space-y-5 px-4 py-4\">\n {empty ? (\n <div className=\"space-y-2\">\n {noKnownAllergies ? (\n <p className=\"text-foreground flex items-center gap-1.5 text-sm\">\n <Badge variant=\"success\" size=\"sm\">\n ✓\n </Badge>\n No known allergies (NKA)\n </p>\n ) : (\n <p className=\"text-muted-foreground text-sm\">\n Allergy status not recorded.\n </p>\n )}\n {!readOnly && onNoKnownAllergiesChange && (\n <Button\n variant={noKnownAllergies ? 'secondary' : 'outline'}\n size=\"sm\"\n onClick={() => onNoKnownAllergiesChange(!noKnownAllergies)}\n >\n {noKnownAllergies\n ? 'Clear no-known-allergies'\n : 'Confirm: no known allergies'}\n </Button>\n )}\n </div>\n ) : (\n groups.map(({ type, label, items }) => (\n <section key={type} aria-label={label}>\n <h4\n data-slot=\"clinical-list-heading\"\n className=\"border-border text-foreground border-b pb-1 text-sm font-semibold tracking-wide uppercase\"\n >\n {label}\n </h4>\n <ul className=\"mt-1\">\n {items.map((allergy) => (\n <AllergyRow\n key={allergy.id}\n allergy={allergy}\n actions={actions}\n readOnly={readOnly}\n drag={drag}\n onMove={moveAllergy}\n onAction={onAction}\n />\n ))}\n </ul>\n </section>\n ))\n )}\n\n {!readOnly && (addSearch || onAdd) && (\n <div className=\"space-y-2\">\n <span className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n Add allergy\n </span>\n {addSearch}\n {onAdd && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onAdd}\n leftIcon={<PlusIcon size={12} />}\n className=\"h-auto rounded-full px-2.5 py-1 text-xs\"\n >\n Add allergy…\n </Button>\n )}\n </div>\n )}\n </CardContent>\n\n <div aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </div>\n </Card>\n );\n }\n);\n\nAllergyList.displayName = 'AllergyList';\n\nexport default AllergyList;\n","'use client';\n\n/**\n * CodeLookupProvider — supply an offline `CodeLookup` once so the clinical\n * components (allergies, medications, conditions, orders, assessment) default\n * to coded search without per-component wiring.\n *\n * `CodeLookup` ships a module Web Worker the library's tsup build can't bundle,\n * so it can't be imported here — the app injects the component (import it from\n * its own bundler, e.g. Vite/Next) and this context distributes it:\n *\n * ```tsx\n * import { CodeLookupProvider } from '@mieweb/ui';\n * import { CodeLookup } from '…/CodeLookup'; // app bundler resolves the worker\n *\n * <CodeLookupProvider component={CodeLookup} indexUrl=\"/codify\">\n * <App />\n * </CodeLookupProvider>\n * ```\n *\n * Components read the context as their default; an explicit `codeLookup` /\n * `renderCodeSearch` prop overrides it, and `codeLookup={false}` (or\n * `renderCodeSearch={false}`) opts a component out back to plain text.\n *\n * This module is intentionally worker-free (only a `import type` of\n * `CodeLookupProps`, which is erased at build) so it is safe to ship in the\n * main `@mieweb/ui` entry.\n */\n\nimport * as React from 'react';\nimport type { CodeLookupProps } from './CodeLookup';\nimport type { MemoryStorage } from './memoryBackend';\n\n/**\n * The CodeLookup component the provider distributes to consumers.\n *\n * Typed as a bare function component (not `ComponentType`) so it stays\n * structurally assignable into the narrower per-domain lookup configs\n * (`MedicationLookupProps`, `OrderLookupProps`, …) — a `ComponentType` union\n * drags in `ComponentClass.defaultProps`, whose contravariance breaks that\n * assignment. `CodeLookup` is a function component, so this is exact.\n */\nexport type CodeLookupComponent = (\n props: CodeLookupProps\n) => React.ReactElement | null;\n\n/**\n * App-wide defaults for the CodeLookup memory picklist. Naming a signed-in\n * `userId` here turns the picklist on for every lookup below the provider —\n * instances need no wiring, and `memory={false}` (here or per-instance) turns\n * it back off.\n */\nexport interface CodeLookupMemoryDefaults {\n /** Signed-in user the counts belong to. No id, no memory. */\n userId?: string;\n /** Default count-sync endpoint (per-instance prop wins). */\n serverUrl?: string;\n /**\n * Bucket the counts are scoped to. Defaults per instance to that lookup's\n * `domains`, which keeps a med picker and a problem picker apart; set this\n * to pool every lookup into one list instead.\n */\n context?: string;\n /**\n * Where picks are cached on this machine. `'local'` (IndexedDB) asserts a\n * per-user device secured by a browser login; the default `'session'` keeps\n * them in RAM for the tab, which is what a public kiosk wants.\n */\n storage?: MemoryStorage;\n}\n\n/** Resolved lookup wiring a component consumes (from prop or context). */\nexport interface CodeLookupProviderConfig {\n /** The injected CodeLookup component (worker-capable, from the app bundle). */\n component: CodeLookupComponent;\n /** Base URL the codify worker fetches `{locale}/manifest.json` + shards from. */\n indexUrl: string;\n /** Shard-set locale (default 'en'). */\n locale?: string;\n /**\n * Defaults for the memory picklist, or `false` to disable it everywhere\n * below this provider (a public kiosk build). Naming a `userId` here is all\n * an instance needs; `false` overrides a component's own `memory` config.\n */\n memory?: false | CodeLookupMemoryDefaults;\n}\n\nconst CodeLookupContext = React.createContext<CodeLookupProviderConfig | null>(\n null\n);\n\nexport interface CodeLookupProviderProps {\n /** The CodeLookup component to distribute (import it in your app). */\n component: CodeLookupComponent;\n /** Where the codify index is served (default '/codify'). */\n indexUrl?: string;\n /** Shard-set locale (default 'en'). */\n locale?: string;\n /** Defaults for the memory picklist, or `false` to disable it everywhere. */\n memory?: false | CodeLookupMemoryDefaults;\n children: React.ReactNode;\n}\n\nexport function CodeLookupProvider({\n component,\n indexUrl = '/codify',\n locale = 'en',\n memory,\n children,\n}: CodeLookupProviderProps): React.ReactElement {\n const value = React.useMemo<CodeLookupProviderConfig>(\n () => ({ component, indexUrl, locale, memory }),\n [component, indexUrl, locale, memory]\n );\n return (\n <CodeLookupContext.Provider value={value}>\n {children}\n </CodeLookupContext.Provider>\n );\n}\n\n/**\n * The ambient CodeLookup config supplied by the nearest `CodeLookupProvider`,\n * or `null` when none is mounted (components then fall back to plain text).\n */\nexport function useCodeLookupConfig(): CodeLookupProviderConfig | null {\n return React.useContext(CodeLookupContext);\n}\n","'use client';\n\n/**\n * AllergyManager — batteries-included allergy list.\n *\n * Wraps the presentational `AllergyList` with the interaction layer: the\n * allergy editor (Correct / Add with CodeLookup allergen coding), the note\n * dialog, removal, and the no-known-allergies (NKA) flow. Uncontrolled via\n * `defaultAllergies` / controlled via `allergies` + `onChange` — same\n * pattern as `MedicationReconciliation`.\n */\n\nimport * as React from 'react';\nimport {\n AllergyList,\n type Allergy,\n type AllergyAction,\n type AllergyKind,\n type AllergySeverity,\n type AllergyType,\n} from './AllergyList';\nimport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalClose,\n ModalBody,\n ModalFooter,\n} from '../Modal';\nimport { Button } from '../Button';\nimport { Input } from '../Input';\nimport { Textarea } from '../Textarea';\nimport { Label } from '../Label';\nimport { Select } from '../Select';\nimport { RadioGroup, Radio } from '../Radio';\nimport { DateInput } from '../DateInput';\nimport type { CodeLookupConfig } from '../MedicationList';\nimport { useCodeLookupConfig } from '../CodeLookup/context';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface AllergyManagerProps {\n /** Controlled allergy list (use with `onChange`) */\n allergies?: Allergy[];\n /** Initial allergy list (uncontrolled) */\n defaultAllergies?: Allergy[];\n /** Called with the next list after every mutation */\n onChange?: (allergies: Allergy[]) => void;\n /** No-known-allergies flag (controlled; see AllergyList) */\n noKnownAllergies?: boolean;\n /** Called when NKA is toggled */\n onNoKnownAllergiesChange?: (value: boolean) => void;\n /** Header title (pass null to hide) */\n title?: string | null;\n /**\n * CodeLookup wiring for allergen search (drug shard). Enables both the\n * inline add bar and coded allergens in the editor. Defaults to the ambient\n * `CodeLookupProvider`; pass `false` to force plain text.\n */\n codeLookup?: CodeLookupConfig | false;\n /** Render an inline allergen search bar in the add section (requires codeLookup) */\n inlineAddSearch?: boolean;\n /** Hide all action affordances (display only) */\n readOnly?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\nfunction newId(): string {\n return `alg-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n// =============================================================================\n// Editor dialog\n// =============================================================================\n\nconst TYPE_OPTIONS = [\n { value: 'drug', label: 'Drug' },\n { value: 'food', label: 'Food' },\n { value: 'environmental', label: 'Environmental' },\n { value: 'other', label: 'Other' },\n];\n\nfunction AllergyEditor({\n allergy,\n codeLookup,\n onClose,\n onSave,\n}: {\n allergy?: Allergy;\n codeLookup?: CodeLookupConfig;\n onClose: () => void;\n onSave: (allergy: Allergy) => void;\n}) {\n const [draft, setDraft] = React.useState<Allergy>(\n () => allergy ?? { id: newId(), allergen: '', type: 'drug' }\n );\n\n const patch = (p: Partial<Allergy>) =>\n setDraft((prev) => ({ ...prev, ...p }));\n\n // Focus the allergen search / input when the dialog opens.\n const bodyRef = React.useRef<HTMLDivElement>(null);\n React.useEffect(() => {\n bodyRef.current?.querySelector('input')?.focus();\n }, []);\n\n const canSave = draft.allergen.trim().length > 0;\n\n // CodeLookup's shards cover drugs (RxNorm/FDB — the 'med' domain); food\n // and environmental allergens have no shard, so the search only renders\n // for drug-type allergies and other types use a plain text input.\n const isDrug = (draft.type ?? 'drug') === 'drug';\n\n return (\n <Modal open onOpenChange={(o) => !o && onClose()} size=\"md\">\n <ModalHeader>\n <ModalTitle>{allergy ? 'Correct Allergy' : 'Add Allergy'}</ModalTitle>\n <ModalClose />\n </ModalHeader>\n <ModalBody className=\"space-y-4\">\n <div ref={bodyRef} className=\"contents\">\n <RadioGroup\n name=\"alg-kind\"\n label=\"Mechanism\"\n description=\"A true immune-mediated allergy, or a non-immune intolerance (e.g. GI upset)\"\n value={draft.kind ?? 'allergy'}\n onValueChange={(v) => patch({ kind: v as AllergyKind })}\n orientation=\"horizontal\"\n size=\"sm\"\n >\n <Radio value=\"allergy\" label=\"Allergy\" />\n <Radio value=\"intolerance\" label=\"Intolerance\" />\n </RadioGroup>\n\n <Select\n label=\"Type\"\n options={TYPE_OPTIONS}\n value={draft.type ?? 'drug'}\n onValueChange={(v) => {\n const type = v as AllergyType;\n // A drug code is wrong on a non-drug allergen.\n patch({\n type,\n ...(type !== 'drug' && { code: undefined }),\n });\n }}\n />\n\n {isDrug && codeLookup ? (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alg-search\">Allergen</Label>\n <codeLookup.component\n indexUrl={codeLookup.indexUrl}\n locale={codeLookup.locale}\n domains={['med']}\n bare\n clearOnSelect={false}\n placeholder=\"Search drug allergens — e.g. penicillin\"\n onSelect={(result) =>\n patch({\n allergen: result.label,\n code: {\n system: result.codetype,\n code: result.fullcode,\n display: result.label,\n },\n })\n }\n onFreeText={(text) =>\n patch({ allergen: text, code: undefined })\n }\n />\n <p className=\"text-muted-foreground text-xs\">\n {draft.code\n ? `Coded: ${draft.code.system} ${draft.code.code}`\n : draft.allergen\n ? `Uncoded free text: \"${draft.allergen}\"`\n : 'Pick a result to code the allergen, or press Enter for free text'}\n </p>\n </div>\n ) : (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alg-name\">Allergen</Label>\n <Input\n id=\"alg-name\"\n value={draft.allergen}\n onChange={(e) => patch({ allergen: e.target.value })}\n />\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alg-reaction\">Reaction</Label>\n <Input\n id=\"alg-reaction\"\n value={draft.reaction ?? ''}\n onChange={(e) => patch({ reaction: e.target.value })}\n />\n </div>\n\n <RadioGroup\n name=\"alg-severity\"\n label=\"Severity\"\n value={draft.severity ?? ''}\n onValueChange={(v) =>\n patch({ severity: (v || undefined) as AllergySeverity })\n }\n orientation=\"horizontal\"\n size=\"sm\"\n >\n <Radio value=\"mild\" label=\"Mild\" />\n <Radio value=\"moderate\" label=\"Moderate\" />\n <Radio value=\"severe\" label=\"Severe\" />\n </RadioGroup>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alg-onset\">Onset date</Label>\n <DateInput\n id=\"alg-onset\"\n value={draft.onsetDate ?? ''}\n onChange={(v) => patch({ onsetDate: v })}\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alg-note\">Note</Label>\n <Textarea\n id=\"alg-note\"\n value={draft.note ?? ''}\n onChange={(e) => patch({ note: e.target.value })}\n rows={2}\n />\n </div>\n </div>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"secondary\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n onClick={() => {\n onSave({ ...draft, allergen: draft.allergen.trim() });\n onClose();\n }}\n disabled={!canSave}\n >\n Save\n </Button>\n </ModalFooter>\n </Modal>\n );\n}\n\n// =============================================================================\n// AllergyManager\n// =============================================================================\n\ntype DialogState =\n | { kind: 'correct'; allergy: Allergy }\n | { kind: 'note'; allergy: Allergy }\n | { kind: 'add' }\n | null;\n\n/**\n * @example Patient intake (uncontrolled, inline search, NKA)\n * ```tsx\n * <AllergyManager\n * defaultAllergies={[]}\n * inlineAddSearch\n * codeLookup={{ component: CodeLookup, indexUrl: '/codify' }}\n * noKnownAllergies={nka}\n * onNoKnownAllergiesChange={setNka}\n * onChange={save}\n * />\n * ```\n */\nexport function AllergyManager({\n allergies: controlled,\n defaultAllergies,\n onChange,\n noKnownAllergies,\n onNoKnownAllergiesChange,\n title = 'Allergies',\n codeLookup,\n inlineAddSearch = false,\n readOnly = false,\n className,\n 'data-testid': dataTestId,\n}: AllergyManagerProps): React.JSX.Element {\n const isControlled = controlled !== undefined;\n const [internal, setInternal] = React.useState<Allergy[]>(\n defaultAllergies ?? []\n );\n const allergies = isControlled ? controlled : internal;\n\n // Default the lookup to the ambient provider; `false` forces plain text.\n const ambientCodeLookup = useCodeLookupConfig();\n const effectiveCodeLookup: CodeLookupConfig | undefined =\n codeLookup === false\n ? undefined\n : (codeLookup ?? ambientCodeLookup ?? undefined);\n\n const [dialog, setDialog] = React.useState<DialogState>(null);\n const [noteDraft, setNoteDraft] = React.useState('');\n\n const commit = (next: Allergy[]) => {\n if (!isControlled) setInternal(next);\n onChange?.(next);\n // Any recorded allergy clears the NKA flag.\n if (next.length > 0 && noKnownAllergies) {\n onNoKnownAllergiesChange?.(false);\n }\n };\n\n const handleAction = (allergy: Allergy, action: AllergyAction) => {\n switch (action) {\n case 'remove':\n commit(allergies.filter((a) => a.id !== allergy.id));\n break;\n case 'correct':\n setDialog({ kind: 'correct', allergy });\n break;\n case 'note':\n setNoteDraft(allergy.note ?? '');\n setDialog({ kind: 'note', allergy });\n break;\n }\n };\n\n const addSearch =\n inlineAddSearch && effectiveCodeLookup && !readOnly ? (\n <effectiveCodeLookup.component\n indexUrl={effectiveCodeLookup.indexUrl}\n locale={effectiveCodeLookup.locale}\n domains={['med']}\n bare\n clearOnSelect\n placeholder=\"Search drug allergens to add — use Add allergy… for food/environmental\"\n onSelect={(result) =>\n commit([\n ...allergies,\n {\n id: newId(),\n allergen: result.label,\n type: 'drug',\n code: {\n system: result.codetype,\n code: result.fullcode,\n display: result.label,\n },\n },\n ])\n }\n onFreeText={(text) =>\n // this search bar is explicitly for drug allergens — free-text\n // entries carry type 'drug' like the coded path\n commit([...allergies, { id: newId(), allergen: text, type: 'drug' }])\n }\n />\n ) : undefined;\n\n return (\n <>\n <AllergyList\n allergies={allergies}\n noKnownAllergies={noKnownAllergies}\n onNoKnownAllergiesChange={onNoKnownAllergiesChange}\n title={title}\n onAction={handleAction}\n onReorder={(ids) =>\n commit(\n [...allergies].sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id))\n )\n }\n addSearch={addSearch}\n onAdd={() => setDialog({ kind: 'add' })}\n readOnly={readOnly}\n className={className}\n data-testid={dataTestId}\n />\n\n {dialog && (dialog.kind === 'correct' || dialog.kind === 'add') && (\n <AllergyEditor\n key={dialog.kind === 'correct' ? dialog.allergy.id : 'add'}\n allergy={dialog.kind === 'correct' ? dialog.allergy : undefined}\n codeLookup={effectiveCodeLookup}\n onClose={() => setDialog(null)}\n onSave={(saved) => {\n if (dialog.kind === 'correct') {\n commit(allergies.map((a) => (a.id === saved.id ? saved : a)));\n } else {\n commit([...allergies, saved]);\n }\n }}\n />\n )}\n\n {dialog?.kind === 'note' && (\n <Modal open onOpenChange={(o) => !o && setDialog(null)} size=\"md\">\n <ModalHeader>\n <ModalTitle>Allergy Notes</ModalTitle>\n <ModalClose />\n </ModalHeader>\n <ModalBody className=\"space-y-4\">\n <p className=\"text-muted-foreground text-sm\">\n {dialog.allergy.allergen}\n </p>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alg-note-dlg\">Note</Label>\n <Textarea\n id=\"alg-note-dlg\"\n value={noteDraft}\n onChange={(e) => setNoteDraft(e.target.value)}\n rows={4}\n />\n </div>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"secondary\" onClick={() => setDialog(null)}>\n Cancel\n </Button>\n <Button\n onClick={() => {\n commit(\n allergies.map((a) =>\n a.id === dialog.allergy.id\n ? { ...a, note: noteDraft.trim() || undefined }\n : a\n )\n );\n setDialog(null);\n }}\n >\n Save\n </Button>\n </ModalFooter>\n </Modal>\n )}\n </>\n );\n}\n\nexport default AllergyManager;\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge/Badge';\nimport { Button } from '../Button';\nimport { Card, CardHeader, CardContent } from '../Card/Card';\nimport {\n ThumbsUpIcon,\n ThumbsDownIcon,\n HandMetalIcon,\n HelpCircleIcon,\n PencilIcon,\n RefreshIcon,\n CalendarCheckIcon,\n StickyNoteIcon,\n BanIcon,\n ChevronUpIcon,\n ChevronDownIcon,\n ExternalLinkIcon,\n PlusIcon,\n GripVerticalIcon,\n} from '../Icons';\nimport {\n useDragReorder,\n dragIndicatorClasses,\n type UseDragReorderReturn,\n} from '../../hooks/useDragReorder';\nimport { RowActionToolbar, RowIconButton } from '../RowActionToolbar';\nimport { useLiveAnnouncement } from '../../hooks/useLiveAnnouncement';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Reconciliation status of a medication. */\nexport type MedicationStatus =\n | 'unreconciled'\n | 'taking'\n | 'taking-noncompliant'\n | 'not-taking'\n | 'unknown';\n\n/** Coding-system reference for a medication (RxNorm / FDB / NDC …). */\nexport interface MedicationCode {\n /** Coding system, e.g. 'RxNORM', 'FDB', 'NDC' */\n system: string;\n /** Code within the system */\n code: string;\n /** Human-readable label the code was selected under */\n display?: string;\n}\n\n/**\n * A single medication in the presenting-medications list.\n *\n * Prescription-detail fields follow the NCPDP SCRIPT NewRx\n * `MedicationPrescribed` composite — see the README for the field mapping.\n * All are optional: a bare `{ id, name, status }` renders fine.\n */\nexport interface Medication {\n /** Stable unique id */\n id: string;\n /** Display name, e.g. \"lisinopril 10 mg tablet\" (NCPDP DrugDescription) */\n name: string;\n /** Patient-friendly instructions (NCPDP Sig / Directions) */\n sig?: string;\n /** Current reconciliation status */\n status: MedicationStatus;\n /** Whether the medication's end date has passed */\n expired?: boolean;\n /** Discontinued date (display string) — shown as \"Discontinued on: date\" */\n discontinuedDate?: string;\n /** Free-text note attached to the medication */\n note?: string;\n /** Follow-up task attached to the medication */\n task?: string;\n\n // —— Coding (NCPDP DrugCoded) ——\n /** Code reference (RxNorm / FDB / NDC) */\n code?: MedicationCode;\n\n // —— NCPDP SCRIPT NewRx prescription fields ——\n /** Strength, e.g. \"10 mg\" (Strength + StrengthUnitOfMeasure) */\n strength?: string;\n /** Dose form, e.g. \"tablet\" (DrugCoded/FormCode) */\n doseForm?: string;\n /** Quantity dispensed (Quantity/Value) */\n quantity?: string;\n /** Quantity unit of measure (Quantity/QuantityUnitOfMeasure) */\n quantityUnit?: string;\n /** Days supply (DaysSupply) */\n daysSupply?: string;\n /** Route of administration, e.g. \"oral\" */\n route?: string;\n /** Administration frequency, e.g. \"Twice daily\" */\n frequency?: string;\n /** As-needed flag (PRN) */\n prn?: boolean;\n /** Number of refills (NumberOfRefills) */\n refills?: string;\n /** Substitution / DAW: '0' permitted, '1' dispense as written */\n substitution?: '0' | '1';\n /** Start / written date (ISO yyyy-mm-dd) */\n startDate?: string;\n /** End date (ISO yyyy-mm-dd) */\n endDate?: string;\n /** Indication / diagnosis the medication treats */\n indication?: string;\n /** Note to pharmacy (Note) */\n pharmacyNotes?: string;\n}\n\n/** Non-status row actions revealed on hover. */\nexport type MedicationAction =\n | 'open'\n | 'correct'\n | 'refill'\n | 'add-task'\n | 'note'\n | 'remove'\n | 'move-up'\n | 'move-down';\n\nexport interface MedicationListProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'className' | 'title'\n> {\n /** Medications to display (controlled — grouping is derived from status) */\n medications: Medication[];\n /** Header title (pass null to hide) */\n title?: string | null;\n /** Called when a status button is clicked on a row */\n onStatusChange?: (medication: Medication, status: MedicationStatus) => void;\n /** Called when a non-status row action is clicked */\n onAction?: (medication: Medication, action: MedicationAction) => void;\n /**\n * Called with the full ordered list of medication ids after a drag —\n * enables drag & drop reordering within a status group. The list renders in\n * props order; persist the ids and feed them back in.\n */\n onReorder?: (medicationIds: string[]) => void;\n /** Which non-status actions to show on each row (default: all) */\n actions?: MedicationAction[];\n /** Common medication names for the quick-add list (omit to hide) */\n quickAddOptions?: string[];\n /** Called when a quick-add option is clicked */\n onQuickAdd?: (name: string) => void;\n /** Called when \"Other…\" is clicked in the quick-add list */\n onAddOther?: () => void;\n /** Hide all action buttons (display only) */\n readOnly?: boolean;\n /** Message shown when the Unreconciled group is empty */\n reconciledMessage?: string;\n /** Message shown when the medication list has no entries at all */\n emptyMessage?: string;\n /**\n * Custom add UI (e.g. an inline CodeLookup search) rendered in the\n * add-medication section, before any quick-add pills. Use for\n * patient-facing entry where suggested medications would be leading.\n */\n addSearch?: React.ReactNode;\n /** Additional CSS classes */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst GROUP_ORDER: MedicationStatus[] = [\n 'unreconciled',\n 'taking',\n 'taking-noncompliant',\n 'not-taking',\n 'unknown',\n];\n\nexport const MEDICATION_STATUS_LABELS: Record<MedicationStatus, string> = {\n unreconciled: 'Unreconciled',\n taking: 'Taking as Directed',\n 'taking-noncompliant': 'Not Taking as Directed',\n 'not-taking': 'Not Taking',\n unknown: 'Unknown',\n};\n\nconst DEFAULT_ACTIONS: MedicationAction[] = [\n 'open',\n 'correct',\n 'refill',\n 'add-task',\n 'note',\n 'remove',\n];\n\nconst ACTION_META: Record<\n MedicationAction,\n { label: string; icon: React.ComponentType<{ size?: number | string }> }\n> = {\n open: { label: 'Open', icon: ExternalLinkIcon },\n correct: { label: 'Correct', icon: PencilIcon },\n refill: { label: 'Refill', icon: RefreshIcon },\n 'add-task': { label: 'Add Task', icon: CalendarCheckIcon },\n note: { label: 'Notes', icon: StickyNoteIcon },\n remove: { label: 'Remove', icon: BanIcon },\n 'move-up': { label: 'Move Up', icon: ChevronUpIcon },\n 'move-down': { label: 'Move Down', icon: ChevronDownIcon },\n};\n\nconst STATUS_BUTTON_META: {\n status: MedicationStatus;\n label: string;\n icon: React.ComponentType<{ size?: number | string }>;\n}[] = [\n { status: 'taking', label: 'Taking', icon: ThumbsUpIcon },\n {\n status: 'taking-noncompliant',\n label: 'Taking – Noncompliant',\n icon: HandMetalIcon,\n },\n { status: 'not-taking', label: 'Not Taking', icon: ThumbsDownIcon },\n { status: 'unknown', label: 'Unknown', icon: HelpCircleIcon },\n];\n\n// =============================================================================\n// Sub-components\n// =============================================================================\n\nfunction MedicationRow({\n medication,\n actions,\n readOnly,\n drag,\n onMove,\n onStatusChange,\n onAction,\n}: {\n medication: Medication;\n actions: MedicationAction[];\n readOnly: boolean;\n drag: UseDragReorderReturn;\n /** Keyboard equivalent of drag reordering (Alt+↑/↓) */\n onMove?: (medication: Medication, dir: -1 | 1) => void;\n onStatusChange?: (medication: Medication, status: MedicationStatus) => void;\n onAction?: (medication: Medication, action: MedicationAction) => void;\n}) {\n const handleRowKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.altKey && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {\n e.preventDefault();\n onMove?.(medication, e.key === 'ArrowUp' ? -1 : 1);\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const list = e.currentTarget.closest('ul');\n if (!list) return;\n const rows = Array.from(\n list.querySelectorAll<HTMLElement>('li[data-medication-id]')\n );\n const i = rows.indexOf(e.currentTarget as HTMLElement);\n rows[\n e.key === 'ArrowUp'\n ? Math.max(0, i - 1)\n : Math.min(rows.length - 1, i + 1)\n ]?.focus();\n }\n };\n\n return (\n // Rows are focus stops when reordering is enabled so drag & drop has a\n // keyboard equivalent (Alt+↑/↓) — 508.\n /* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */\n <li\n data-slot=\"clinical-list-row\"\n data-medication-id={medication.id}\n tabIndex={drag.enabled ? 0 : undefined}\n onKeyDown={drag.enabled ? handleRowKeyDown : undefined}\n aria-label={\n drag.enabled\n ? `${medication.name}. Alt plus arrow keys to reorder.`\n : undefined\n }\n {...drag.rowProps(medication.id)}\n className={cn(\n 'group border-border/60 relative flex min-h-11 flex-wrap items-center gap-x-2 gap-y-1 border-b px-1 py-2',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n drag.enabled && 'cursor-grab active:cursor-grabbing',\n dragIndicatorClasses(drag, medication.id)\n )}\n >\n {/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n {drag.enabled ? (\n <GripVerticalIcon\n size={14}\n aria-hidden\n className=\"text-muted-foreground/50 shrink-0\"\n />\n ) : (\n <span className=\"text-muted-foreground/60 select-none\">•</span>\n )}\n <span className=\"text-foreground font-medium\">{medication.name}</span>\n {medication.code && (\n <span\n className=\"text-muted-foreground/70 text-xs\"\n title={medication.code.display}\n >\n {medication.code.system} {medication.code.code}\n </span>\n )}\n {medication.sig && (\n <span className=\"text-muted-foreground text-sm\">{medication.sig}</span>\n )}\n {medication.expired && (\n <span className=\"text-sm font-bold text-red-600 dark:text-red-400\">\n EXPIRED\n </span>\n )}\n {medication.discontinuedDate && (\n <span className=\"text-muted-foreground text-sm\">\n Discontinued on: {medication.discontinuedDate}\n </span>\n )}\n {(medication.note || medication.task) && (\n <span className=\"flex w-full basis-full flex-col gap-0.5 ps-4\">\n {medication.note && (\n <span className=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n <StickyNoteIcon size={12} />\n {medication.note}\n </span>\n )}\n {medication.task && (\n <span className=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n <CalendarCheckIcon size={12} />\n Task: {medication.task}\n </span>\n )}\n </span>\n )}\n\n {!readOnly && (\n <RowActionToolbar label={`Actions for ${medication.name}`}>\n {actions.includes('open') && (\n <RowIconButton\n label={ACTION_META.open.label}\n icon={ACTION_META.open.icon}\n onClick={() => onAction?.(medication, 'open')}\n />\n )}\n {STATUS_BUTTON_META.map(({ status, label, icon }) => (\n <RowIconButton\n key={status}\n label={label}\n icon={icon}\n active={medication.status === status}\n onClick={() => onStatusChange?.(medication, status)}\n />\n ))}\n {actions\n .filter((a): a is Exclude<MedicationAction, 'open'> => a !== 'open')\n .map((action) => (\n <RowIconButton\n key={action}\n label={ACTION_META[action].label}\n icon={ACTION_META[action].icon}\n onClick={() => onAction?.(medication, action)}\n />\n ))}\n </RowActionToolbar>\n )}\n </li>\n );\n}\n\n// =============================================================================\n// MedicationList\n// =============================================================================\n\n/**\n * Presenting-medications list with medication reconciliation.\n *\n * Controlled component: medications (with their statuses) come in via props;\n * every user interaction is reported through callbacks. Rows are grouped by\n * reconciliation status; hovering (or keyboard-focusing) a row reveals the\n * status buttons and other row actions.\n *\n * @example\n * ```tsx\n * <MedicationList\n * medications={meds}\n * onStatusChange={(med, status) =>\n * setMeds((prev) =>\n * prev.map((m) => (m.id === med.id ? { ...m, status } : m))\n * )\n * }\n * onAction={(med, action) => handleAction(med, action)}\n * />\n * ```\n */\nexport const MedicationList = React.forwardRef<\n HTMLDivElement,\n MedicationListProps\n>(\n (\n {\n medications,\n title = 'Presenting medications',\n onStatusChange,\n onAction,\n onReorder,\n actions = DEFAULT_ACTIONS,\n quickAddOptions,\n onQuickAdd,\n onAddOther,\n readOnly = false,\n reconciledMessage = 'All medications reconciled.',\n emptyMessage = 'No medications recorded.',\n addSearch,\n className,\n 'data-testid': dataTestId,\n ...props\n },\n ref\n ) => {\n // clears-then-sets so repeated identical messages re-announce\n const [announcement, setAnnouncement] = useLiveAnnouncement();\n\n const handleStatusChange = React.useCallback(\n (medication: Medication, status: MedicationStatus) => {\n setAnnouncement(\n `${medication.name} marked ${MEDICATION_STATUS_LABELS[status]}`\n );\n onStatusChange?.(medication, status);\n },\n [onStatusChange, setAnnouncement]\n );\n\n const groups = GROUP_ORDER.map((status) => ({\n status,\n label: MEDICATION_STATUS_LABELS[status],\n items: medications.filter((m) => m.status === status),\n })).filter((g) => g.items.length > 0 || g.status === 'unreconciled');\n\n // Drag & drop reordering, restricted to the same status group (a cross-\n // group drop would silently imply a reconciliation change). Precomputed\n // map — dragover fires too frequently for a linear scan per event.\n const statusById = React.useMemo(\n () => new Map(medications.map((m) => [m.id, m.status] as const)),\n [medications]\n );\n const statusOf = React.useCallback(\n (id: string) => statusById.get(id),\n [statusById]\n );\n const drag = useDragReorder({\n ids: medications.map((m) => m.id),\n onReorder:\n readOnly || !onReorder\n ? undefined\n : (ids) => {\n // announce pointer drops too, not just keyboard moves\n setAnnouncement('Medication list reordered');\n onReorder(ids);\n },\n canDropOn: (dragged, target) => statusOf(dragged) === statusOf(target),\n });\n\n /** Keyboard equivalent of dragging a row: swap within the status group. */\n const moveMedication = React.useCallback(\n (medication: Medication, dir: -1 | 1) => {\n if (readOnly || !onReorder) return;\n const ids = medications.map((m) => m.id);\n const from = ids.indexOf(medication.id);\n let to = from + dir;\n while (\n to >= 0 &&\n to < medications.length &&\n medications[to].status !== medication.status\n ) {\n to += dir;\n }\n if (to < 0 || to >= medications.length) return;\n [ids[from], ids[to]] = [ids[to], ids[from]];\n setAnnouncement(\n `${medication.name} moved ${dir === -1 ? 'up' : 'down'}`\n );\n onReorder(ids);\n },\n [medications, onReorder, readOnly, setAnnouncement]\n );\n\n return (\n <Card\n ref={ref}\n padding=\"none\"\n className={cn('w-full', className)}\n data-testid={dataTestId}\n {...props}\n >\n {title !== null && (\n <CardHeader className=\"border-border bg-muted/50 border-b px-4 py-3\">\n <h3 className=\"text-foreground text-sm font-semibold tracking-wide uppercase\">\n {title}\n </h3>\n </CardHeader>\n )}\n\n <CardContent className=\"space-y-6 px-4 py-4\">\n {groups.map(({ status, label, items }) => (\n <section key={status} aria-label={label}>\n <h4\n data-slot=\"clinical-list-heading\"\n className=\"border-border text-foreground border-b pb-1 text-sm font-semibold tracking-wide uppercase\"\n >\n {label}\n </h4>\n {items.length > 0 ? (\n <ul className=\"mt-1\">\n {items.map((medication) => (\n <MedicationRow\n key={medication.id}\n medication={medication}\n actions={actions}\n readOnly={readOnly}\n drag={drag}\n onMove={moveMedication}\n onStatusChange={handleStatusChange}\n onAction={onAction}\n />\n ))}\n </ul>\n ) : medications.length === 0 ? (\n <p className=\"text-muted-foreground mt-2 text-sm\">\n {emptyMessage}\n </p>\n ) : (\n <p className=\"text-muted-foreground mt-2 flex items-center gap-1.5 text-sm\">\n <Badge variant=\"success\" size=\"sm\">\n ✓\n </Badge>\n {reconciledMessage}\n </p>\n )}\n </section>\n ))}\n\n {!readOnly &&\n (addSearch || quickAddOptions?.length || onAddOther) && (\n <div className=\"space-y-2\">\n <span className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n Add medication\n </span>\n {addSearch}\n {(quickAddOptions?.length || onAddOther) && (\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {quickAddOptions?.map((name) => (\n <Button\n key={name}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onQuickAdd?.(name)}\n leftIcon={<PlusIcon size={12} />}\n className=\"border-border h-auto rounded-full border px-2.5 py-1 text-xs\"\n >\n {name}\n </Button>\n ))}\n {onAddOther && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onAddOther}\n leftIcon={<PlusIcon size={12} />}\n className=\"h-auto rounded-full px-2.5 py-1 text-xs\"\n >\n Other…\n </Button>\n )}\n </div>\n )}\n </div>\n )}\n </CardContent>\n\n {/* Confirmation announcement for screen readers */}\n <div aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </div>\n </Card>\n );\n }\n);\n\nMedicationList.displayName = 'MedicationList';\n\nexport default MedicationList;\n","'use client';\n\n/**\n * MedicationEditor — prescription editor modal for a `Medication`.\n *\n * Captures the NCPDP SCRIPT NewRx `MedicationPrescribed` field set and codes\n * the drug via `CodeLookup` (RxNorm / FDB, offline). Used by\n * `MedicationReconciliation` for both **Correct** (edit) and **Add\n * Medication**, and usable directly:\n *\n * ```tsx\n * <MedicationEditor\n * open={editing !== null}\n * medication={editing ?? undefined}\n * codeLookup={{ indexUrl: '/codify' }}\n * onClose={() => setEditing(null)}\n * onSave={(med) => upsert(med)}\n * />\n * ```\n *\n * NCPDP mapping (NewRx / MedicationPrescribed):\n *\n * | Editor field | NCPDP element |\n * |----------------|----------------------------------------|\n * | Medication | DrugDescription |\n * | Code | DrugCoded (ProductCode / DrugDBCode) |\n * | Strength | Strength + StrengthUnitOfMeasure |\n * | Dose form | DrugCoded/FormCode |\n * | Quantity | Quantity/Value |\n * | Quantity unit | Quantity/QuantityUnitOfMeasure |\n * | Days supply | DaysSupply |\n * | Directions | Sig/SigText |\n * | Refills | NumberOfRefills |\n * | Substitution | Substitutions (0 permitted / 1 DAW) |\n * | Start date | WrittenDate / EffectiveDate |\n * | Indication | Diagnosis/Primary |\n * | Pharmacy notes | Note |\n */\n\nimport * as React from 'react';\nimport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalClose,\n ModalBody,\n ModalFooter,\n} from '../Modal';\nimport { Button } from '../Button';\nimport { Input } from '../Input';\nimport { Textarea } from '../Textarea';\nimport { Label } from '../Label';\nimport { RadioGroup, Radio } from '../Radio';\nimport { DateInput } from '../DateInput';\nimport type { Medication } from './MedicationList';\nimport { useCodeLookupConfig } from '../CodeLookup/context';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Minimal shape of a CodeLookup selection the editor consumes. */\nexport interface MedicationLookupResult {\n label: string;\n codetype: string;\n fullcode: string;\n}\n\n/**\n * Structural subset of `CodeLookupProps` the editor uses. `CodeLookup`\n * satisfies this — it is injected (not imported) because its Web Worker\n * keeps it out of the library build (see CodeLookup/index.ts).\n */\nexport interface MedicationLookupProps {\n indexUrl: string;\n locale?: string;\n domains?: 'med'[];\n bare?: boolean;\n clearOnSelect?: boolean;\n placeholder?: string;\n initialQuery?: string;\n initialSearch?: boolean;\n onSelect?: (result: MedicationLookupResult) => void;\n onFreeText?: (text: string) => void;\n}\n\n/** CodeLookup wiring for the editor (component injected by the consumer). */\nexport interface CodeLookupConfig {\n /** The CodeLookup component: `import { CodeLookup } from '…/CodeLookup'` */\n component: React.ComponentType<MedicationLookupProps>;\n /** Base URL of the codify index, e.g. '/codify' */\n indexUrl: string;\n /** Shard locale (default 'en') */\n locale?: string;\n}\n\nexport interface MedicationEditorProps {\n /** Whether the editor is open */\n open: boolean;\n /** Medication being edited — omit for \"add\" mode */\n medication?: Medication;\n /**\n * Codify shard location for RxNorm/FDB coding. Defaults to the ambient\n * `CodeLookupProvider`; pass `false` to force a plain name input.\n */\n codeLookup?: CodeLookupConfig | false;\n /** Called when the editor is dismissed without saving */\n onClose: () => void;\n /** Called with the complete medication on save */\n onSave: (medication: Medication) => void;\n}\n\n// =============================================================================\n// Parsers — drug label → strength/form, sig → route/frequency/PRN\n// =============================================================================\n\nconst DOSE_FORMS = [\n 'tablet',\n 'capsule',\n 'solution',\n 'suspension',\n 'syrup',\n 'cream',\n 'ointment',\n 'gel',\n 'patch',\n 'suppository',\n 'spray',\n 'drops',\n 'inhaler',\n 'injection',\n 'lozenge',\n 'powder',\n 'film',\n];\n\n/** Quantity unit implied by each dose form (NCPDP QuantityUnitOfMeasure). */\nconst FORM_TO_UNIT: Record<string, string> = {\n tablet: 'tablet',\n capsule: 'capsule',\n solution: 'milliliter',\n suspension: 'milliliter',\n syrup: 'milliliter',\n cream: 'gram',\n ointment: 'gram',\n gel: 'gram',\n patch: 'patch',\n suppository: 'suppository',\n spray: 'spray',\n drops: 'milliliter',\n inhaler: 'each',\n injection: 'milliliter',\n lozenge: 'each',\n powder: 'gram',\n film: 'each',\n};\n\n/**\n * Parse strength + dose form out of a coded drug label,\n * e.g. \"lisinopril 20 mg tablet\" → { strength: '20 mg', doseForm: 'tablet' }.\n */\nexport function parseMedicationLabel(label: string): {\n strength?: string;\n doseForm?: string;\n} {\n const lower = label.toLowerCase();\n // bounded quantifiers keep the match linear-time on adversarial inputs\n // (unbounded \\d+ groups backtrack polynomially on long digit runs)\n const strengthMatch = lower.match(\n /(\\d{1,7}(?:\\.\\d{1,4})?(?:\\s{0,4}\\/\\s{0,4}\\d{1,7}(?:\\.\\d{1,4})?)?)\\s{0,4}(mg\\/ml|mcg\\/ml|mg|mcg|g|ml|units?|%|meq)\\b/\n );\n const doseForm = DOSE_FORMS.find((f) => lower.includes(f));\n return {\n strength: strengthMatch\n ? `${strengthMatch[1].replace(/\\s+/g, '')} ${strengthMatch[2]}`\n : undefined,\n doseForm,\n };\n}\n\nconst SIG_ROUTES: [RegExp, string][] = [\n [/\\bby mouth\\b|\\boral(ly)?\\b|\\bpo\\b/, 'oral'],\n [/\\bsublingual(ly)?\\b|\\bunder the tongue\\b|\\bsl\\b/, 'sublingual'],\n [/\\bsubcutaneous(ly)?\\b|\\bsubq\\b|\\bsc\\b|\\bsq\\b/, 'subcutaneous'],\n [/\\bintramuscular(ly)?\\b|\\bim\\b/, 'intramuscular'],\n [/\\bintravenous(ly)?\\b|\\biv\\b/, 'intravenous'],\n [/\\binhal(e|ation|ed)\\b|\\bpuffs?\\b|\\bnebuliz/, 'inhalation'],\n [/\\beyes?\\b|\\bophthalmic\\b/, 'ophthalmic'],\n [/\\bears?\\b|\\botic\\b/, 'otic'],\n [/\\bnostrils?\\b|\\bnasal(ly)?\\b|\\bintranasal/, 'nasal'],\n [/\\brectal(ly)?\\b|\\bpr\\b/, 'rectal'],\n [/\\btransdermal\\b|\\bto (the )?skin\\b|\\bapply\\b|\\btopical(ly)?\\b/, 'topical'],\n];\n\n// Order matters: specific patterns must precede the bare-\"daily\" fallback\n// (\"twice daily\" must not match Once daily's \\bdaily\\b).\nconst SIG_FREQUENCIES: [RegExp, string][] = [\n [/\\bevery other day\\b|\\bqod\\b/, 'Every other day'],\n [/\\btwice (a |per )?day\\b|\\btwice daily\\b|\\bbid\\b/, 'Twice daily'],\n [\n /\\b(three times|3 times)( a| per)? day\\b|\\b(three times|3 times) daily\\b|\\btid\\b/,\n 'Three times daily',\n ],\n [\n /\\b(four times|4 times)( a| per)? day\\b|\\b(four times|4 times) daily\\b|\\bqid\\b/,\n 'Four times daily',\n ],\n [/\\bevery morning\\b|\\bqam\\b/, 'Every morning'],\n [/\\b(at )?bedtime\\b|\\bqhs\\b|\\bat night\\b/, 'Every bedtime'],\n [/\\bweekly\\b|\\bonce a week\\b|\\bevery week\\b/, 'Weekly'],\n [\n /\\bonce (a |per )?day\\b|\\bonce daily\\b|\\bdaily\\b|\\bevery day\\b|\\bqd\\b/,\n 'Once daily',\n ],\n];\n\n/**\n * Derive route / frequency / PRN from free-text sig,\n * e.g. \"1 tablet by mouth daily as needed\" →\n * { route: 'oral', frequency: 'Once daily', prn: true }.\n */\nexport function parseSig(sig: string): {\n route?: string;\n frequency?: string;\n prn: boolean;\n} {\n const lower = sig.toLowerCase();\n const route = SIG_ROUTES.find(([re]) => re.test(lower))?.[1];\n const frequency = SIG_FREQUENCIES.find(([re]) => re.test(lower))?.[1];\n const prn = /\\bas needed\\b|\\bprn\\b/.test(lower);\n return { route, frequency, prn };\n}\n\n/**\n * Derive the label-parsed Medication fields — strength, dose form, and the\n * form-implied quantity unit — from a drug display label,\n * e.g. \"lisinopril 10 mg tablet\" → { strength: '10 mg', doseForm: 'tablet',\n * quantityUnit: 'tablet' }.\n */\nexport function labelToMedicationFields(label: string): Partial<Medication> {\n const { strength, doseForm } = parseMedicationLabel(label);\n return {\n ...(strength && { strength }),\n ...(doseForm && {\n doseForm,\n quantityUnit: FORM_TO_UNIT[doseForm] ?? doseForm,\n }),\n };\n}\n\n/**\n * Derive Medication fields from a CodeLookup pick: name, code reference,\n * and — parsed from the label — strength, dose form, and quantity unit.\n * Used by the editor and by inline add-search flows.\n */\nexport function lookupToMedicationFields(\n result: MedicationLookupResult\n): Partial<Medication> {\n return {\n name: result.label,\n code: {\n system: result.codetype,\n code: result.fullcode,\n display: result.label,\n },\n ...labelToMedicationFields(result.label),\n };\n}\n\nfunction newId(): string {\n return `med-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n// =============================================================================\n// MedicationEditor\n// =============================================================================\n\nexport function MedicationEditor({\n open,\n medication,\n codeLookup,\n onClose,\n onSave,\n}: MedicationEditorProps): React.JSX.Element | null {\n // Default the lookup to the ambient provider; `false` forces plain text.\n const ambientCodeLookup = useCodeLookupConfig();\n const effectiveCodeLookup: CodeLookupConfig | undefined =\n codeLookup === false\n ? undefined\n : (codeLookup ?? ambientCodeLookup ?? undefined);\n\n const [draft, setDraft] = React.useState<Medication>(\n () =>\n medication ?? {\n id: newId(),\n name: '',\n status: 'unreconciled',\n }\n );\n\n // NOTE: draft state is seeded once per mount — give the editor a `key`\n // (e.g. the medication id) so a different target remounts it.\n\n // Focus the medication search / name input when the dialog opens.\n const bodyRef = React.useRef<HTMLDivElement>(null);\n React.useEffect(() => {\n const input = bodyRef.current?.querySelector('input');\n input?.focus();\n }, []);\n\n const patch = (p: Partial<Medication>) =>\n setDraft((prev) => ({ ...prev, ...p }));\n\n const handleCodeSelect = (result: MedicationLookupResult) => {\n // Populate strength / dose form / quantity unit from the coded label.\n patch(lookupToMedicationFields(result));\n };\n\n const handleSigChange = (sig: string) => {\n // Route / frequency / PRN are derived from the sig text.\n const { route, frequency, prn } = parseSig(sig);\n patch({ sig, route, frequency, prn: prn || undefined });\n };\n\n const canSave = draft.name.trim().length > 0;\n\n if (!open) return null;\n\n return (\n <Modal open onOpenChange={(o) => !o && onClose()} size=\"lg\">\n <ModalHeader>\n <ModalTitle>\n {medication ? 'Correct Medication' : 'Add Medication'}\n </ModalTitle>\n <ModalClose />\n </ModalHeader>\n <ModalBody className=\"space-y-5\">\n <div ref={bodyRef} className=\"contents\">\n {/* ——— Medication + coding ——— */}\n <section className=\"space-y-3\" aria-label=\"Medication\">\n {effectiveCodeLookup ? (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-search\">Medication</Label>\n <effectiveCodeLookup.component\n indexUrl={effectiveCodeLookup.indexUrl}\n locale={effectiveCodeLookup.locale}\n domains={['med']}\n bare\n clearOnSelect={false}\n placeholder=\"Search RxNorm / FDB — e.g. lisinopril\"\n // Seed the search box with the medication name. Editing an\n // uncoded medication also runs the search immediately so the\n // closest coded matches are offered (a pick fills coding,\n // strength, and dose form); coded ones just show their name.\n initialQuery={medication?.name || undefined}\n initialSearch={medication ? !medication.code : undefined}\n onSelect={handleCodeSelect}\n onFreeText={(text) => patch({ name: text, code: undefined })}\n />\n <p className=\"text-muted-foreground text-xs\">\n {draft.code\n ? `Coded: ${draft.code.system} ${draft.code.code}`\n : draft.name\n ? `Uncoded free text: \"${draft.name}\" — pick a result to code it`\n : 'Pick a result to code the medication, or press Enter for free text'}\n </p>\n </div>\n ) : (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-name\">Medication</Label>\n <Input\n id=\"med-name\"\n value={draft.name}\n onChange={(e) => patch({ name: e.target.value })}\n />\n </div>\n )}\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-strength\">Strength</Label>\n <Input\n id=\"med-strength\"\n value={draft.strength ?? ''}\n onChange={(e) => patch({ strength: e.target.value })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-form\">Dose form</Label>\n <Input\n id=\"med-form\"\n value={draft.doseForm ?? ''}\n onChange={(e) => {\n const doseForm = e.target.value;\n const normalized = doseForm.toLowerCase().trim();\n // Quantity unit follows the dose form (tablet → tablet,\n // solution → milliliter, …)\n patch({\n doseForm,\n quantityUnit:\n (FORM_TO_UNIT[normalized] ?? normalized) || undefined,\n });\n }}\n />\n </div>\n </div>\n </section>\n\n {/* ——— Dispensing ——— */}\n <section className=\"space-y-3\" aria-label=\"Dispensing\">\n <h4 className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n Dispensing\n </h4>\n <div className=\"grid grid-cols-3 gap-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-qty\">\n Quantity\n {draft.quantityUnit ? ` (${draft.quantityUnit}s)` : ''}\n </Label>\n <Input\n id=\"med-qty\"\n inputMode=\"decimal\"\n value={draft.quantity ?? ''}\n onChange={(e) => patch({ quantity: e.target.value })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-days\">Days supply</Label>\n <Input\n id=\"med-days\"\n inputMode=\"numeric\"\n value={draft.daysSupply ?? ''}\n onChange={(e) => patch({ daysSupply: e.target.value })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-refills\">Refills</Label>\n <Input\n id=\"med-refills\"\n inputMode=\"numeric\"\n value={draft.refills ?? ''}\n onChange={(e) => patch({ refills: e.target.value })}\n />\n </div>\n </div>\n <RadioGroup\n name=\"med-substitution\"\n label=\"Substitution\"\n value={draft.substitution ?? '0'}\n onValueChange={(v) => patch({ substitution: v as '0' | '1' })}\n orientation=\"horizontal\"\n size=\"sm\"\n >\n <Radio value=\"0\" label=\"Substitution permitted\" />\n <Radio value=\"1\" label=\"Dispense as written (DAW)\" />\n </RadioGroup>\n </section>\n\n {/* ——— Directions ——— */}\n <section className=\"space-y-3\" aria-label=\"Directions\">\n <h4 className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n Directions\n </h4>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-sig\">Sig (patient directions)</Label>\n <Textarea\n id=\"med-sig\"\n value={draft.sig ?? ''}\n onChange={(e) => handleSigChange(e.target.value)}\n rows={2}\n />\n <p className=\"text-muted-foreground text-xs\" aria-live=\"polite\">\n {draft.route || draft.frequency || draft.prn ? (\n <>\n Derived:{' '}\n {[\n draft.route && `route ${draft.route}`,\n draft.frequency && draft.frequency.toLowerCase(),\n draft.prn && 'PRN (as needed)',\n ]\n .filter(Boolean)\n .join(' · ')}\n </>\n ) : (\n 'Route, frequency, and PRN are derived from the directions'\n )}\n </p>\n </div>\n </section>\n\n {/* ——— Dates & context ——— */}\n <section className=\"space-y-3\" aria-label=\"Dates and context\">\n <h4 className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n Dates & context\n </h4>\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-start\">Start date</Label>\n <DateInput\n id=\"med-start\"\n value={draft.startDate ?? ''}\n onChange={(v) => patch({ startDate: v })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-end\">End date</Label>\n <DateInput\n id=\"med-end\"\n value={draft.endDate ?? ''}\n onChange={(v) => patch({ endDate: v })}\n />\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-indication\">Indication</Label>\n <Input\n id=\"med-indication\"\n value={draft.indication ?? ''}\n onChange={(e) => patch({ indication: e.target.value })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-pharmacy-notes\">Pharmacy notes</Label>\n <Textarea\n id=\"med-pharmacy-notes\"\n value={draft.pharmacyNotes ?? ''}\n onChange={(e) => patch({ pharmacyNotes: e.target.value })}\n rows={2}\n />\n </div>\n </section>\n </div>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"secondary\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n onClick={() => {\n onSave({ ...draft, name: draft.name.trim() });\n onClose();\n }}\n disabled={!canSave}\n >\n Save\n </Button>\n </ModalFooter>\n </Modal>\n );\n}\n\nexport default MedicationEditor;\n","'use client';\n\n/**\n * MedicationReconciliation — batteries-included medication reconciliation.\n *\n * Wraps the presentational `MedicationList` with the full interaction layer:\n * status changes, Correct / Notes / Add Task modal dialogs, reordering,\n * removal, and adding medications (quick-add pills + \"Other…\" modal).\n *\n * Works standalone (uncontrolled with `defaultMedications`, or controlled\n * with `medications` + `onChange`) and is the engine behind the eSheet\n * `medicationList` question type.\n */\n\nimport * as React from 'react';\nimport {\n MedicationList,\n type Medication,\n type MedicationAction,\n} from './MedicationList';\nimport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalClose,\n ModalBody,\n ModalFooter,\n} from '../Modal';\nimport { Button } from '../Button';\nimport { Textarea } from '../Textarea';\nimport { Label } from '../Label';\nimport {\n MedicationEditor,\n lookupToMedicationFields,\n type CodeLookupConfig,\n} from './MedicationEditor';\nimport { useCodeLookupConfig } from '../CodeLookup/context';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nconst MANAGED_ACTIONS: MedicationAction[] = [\n 'correct',\n 'add-task',\n 'note',\n 'remove',\n];\n\nexport interface MedicationReconciliationProps {\n /** Controlled medication list (use with `onChange`) */\n medications?: Medication[];\n /** Initial medication list (uncontrolled) */\n defaultMedications?: Medication[];\n /** Called with the next list after every mutation */\n onChange?: (medications: Medication[]) => void;\n /** Header title (pass null to hide) */\n title?: string | null;\n /** Common medication names for the quick-add list (omit to hide) */\n quickAddOptions?: string[];\n /** Row actions to show (default: correct, add-task, note, remove) */\n actions?: MedicationAction[];\n /**\n * Called for host-specific actions this component does not manage\n * (e.g. 'open', 'refill' when included in `actions`).\n */\n onAction?: (medication: Medication, action: MedicationAction) => void;\n /**\n * CodeLookup wiring for the medication editor (Correct / Add Medication):\n * pass the CodeLookup component + shard location to enable RxNorm/FDB\n * coding. Defaults to the ambient `CodeLookupProvider` when one is mounted;\n * pass `false` to force a plain-text medication name input.\n *\n * ```tsx\n * import { CodeLookup } from '@mieweb/ui/…/CodeLookup';\n * <MedicationReconciliation codeLookup={{ component: CodeLookup, indexUrl: '/codify' }} … />\n * ```\n */\n codeLookup?: CodeLookupConfig | false;\n /**\n * Render an inline CodeLookup search bar in the add-medication section\n * (requires `codeLookup`). Picks add immediately as Unreconciled — the\n * fastest entry path, and non-leading (no suggested medications), which\n * makes it the right choice for patient-facing intake.\n */\n inlineAddSearch?: boolean;\n /** Hide all action buttons (display only) */\n readOnly?: boolean;\n /** Message shown when the Unreconciled group is empty */\n reconciledMessage?: string;\n /** Message shown when the medication list has no entries at all */\n emptyMessage?: string;\n /** Additional CSS classes */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\nfunction newId(): string {\n return `med-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n// =============================================================================\n// Modal dialogs\n// =============================================================================\n\ntype DialogState =\n | { kind: 'correct'; medication: Medication }\n | { kind: 'note'; medication: Medication }\n | { kind: 'add-task'; medication: Medication }\n | { kind: 'add' }\n | null;\n\n/** Small note / task dialog. Correct + Add use the full MedicationEditor. */\nfunction MedicationDialog({\n dialog,\n onClose,\n onSave,\n}: {\n dialog: { kind: 'note' | 'add-task'; medication: Medication };\n onClose: () => void;\n onSave: (fields: Record<string, string>) => void;\n}) {\n const [form, setForm] = React.useState<Record<string, string>>(() =>\n dialog.kind === 'note'\n ? ({ note: dialog.medication.note ?? '' } as Record<string, string>)\n : ({ task: dialog.medication.task ?? '' } as Record<string, string>)\n );\n\n const set =\n (key: string) =>\n (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) =>\n setForm((prev) => ({ ...prev, [key]: e.target.value }));\n\n const handleSave = () => {\n onSave(form);\n onClose();\n };\n\n return (\n <Modal open onOpenChange={(open) => !open && onClose()} size=\"md\">\n <ModalHeader>\n <ModalTitle>\n {dialog.kind === 'note' ? 'Medication Notes' : 'Add Task'}\n </ModalTitle>\n <ModalClose />\n </ModalHeader>\n <ModalBody className=\"space-y-4\">\n <p className=\"text-muted-foreground text-sm\">\n {dialog.medication.name}\n </p>\n {dialog.kind === 'note' ? (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-note\">Note</Label>\n <Textarea\n id=\"med-note\"\n value={form.note}\n onChange={set('note')}\n rows={4}\n />\n </div>\n ) : (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-task\">Task</Label>\n <Textarea\n id=\"med-task\"\n value={form.task}\n onChange={set('task')}\n rows={3}\n placeholder=\"Follow-up task for this medication\"\n />\n </div>\n )}\n </ModalBody>\n <ModalFooter>\n <Button variant=\"secondary\" onClick={onClose}>\n Cancel\n </Button>\n <Button onClick={handleSave}>Save</Button>\n </ModalFooter>\n </Modal>\n );\n}\n\n// =============================================================================\n// MedicationReconciliation\n// =============================================================================\n\n/**\n * @example Standalone (uncontrolled)\n * ```tsx\n * <MedicationReconciliation\n * defaultMedications={presentingMeds}\n * quickAddOptions={['aspirin 81 mg tablet']}\n * onChange={(meds) => save(meds)}\n * />\n * ```\n *\n * @example Controlled\n * ```tsx\n * <MedicationReconciliation medications={meds} onChange={setMeds} />\n * ```\n */\nexport function MedicationReconciliation({\n medications: controlledMedications,\n defaultMedications,\n onChange,\n title = 'Presenting medications',\n quickAddOptions,\n actions = MANAGED_ACTIONS,\n onAction,\n codeLookup,\n inlineAddSearch = false,\n readOnly = false,\n reconciledMessage,\n emptyMessage,\n className,\n 'data-testid': dataTestId,\n}: MedicationReconciliationProps): React.JSX.Element {\n const isControlled = controlledMedications !== undefined;\n const [internal, setInternal] = React.useState<Medication[]>(\n defaultMedications ?? []\n );\n const medications = isControlled ? controlledMedications : internal;\n\n // Default the lookup to the ambient provider; `false` forces plain text.\n const ambientCodeLookup = useCodeLookupConfig();\n const effectiveCodeLookup: CodeLookupConfig | undefined =\n codeLookup === false\n ? undefined\n : (codeLookup ?? ambientCodeLookup ?? undefined);\n\n const [dialog, setDialog] = React.useState<DialogState>(null);\n\n const commit = (next: Medication[]) => {\n if (!isControlled) setInternal(next);\n onChange?.(next);\n };\n\n const patchMedication = (id: string, patch: Partial<Medication>) => {\n commit(medications.map((m) => (m.id === id ? { ...m, ...patch } : m)));\n };\n\n const moveMedication = (med: Medication, direction: -1 | 1) => {\n // Reorder within the same status group.\n const meds = [...medications];\n const group = meds.filter((m) => m.status === med.status);\n const groupIndex = group.findIndex((m) => m.id === med.id);\n const swapWith = group[groupIndex + direction];\n if (!swapWith) return;\n const i = meds.findIndex((m) => m.id === med.id);\n const j = meds.findIndex((m) => m.id === swapWith.id);\n [meds[i], meds[j]] = [meds[j], meds[i]];\n commit(meds);\n };\n\n const handleAction = (med: Medication, action: MedicationAction) => {\n switch (action) {\n case 'remove':\n commit(medications.filter((m) => m.id !== med.id));\n break;\n case 'move-up':\n moveMedication(med, -1);\n break;\n case 'move-down':\n moveMedication(med, 1);\n break;\n case 'correct':\n case 'note':\n case 'add-task':\n setDialog({ kind: action, medication: med });\n break;\n default:\n // Host-specific actions ('open', 'refill') are delegated.\n onAction?.(med, action);\n break;\n }\n };\n\n const addMedication = (name: string, sig?: string) => {\n commit([\n ...medications,\n { id: newId(), name, sig: sig || undefined, status: 'unreconciled' },\n ]);\n };\n\n const handleDialogSave = (form: Record<string, string>) => {\n if (!dialog) return;\n switch (dialog.kind) {\n case 'note':\n patchMedication(dialog.medication.id, {\n note: form.note.trim() || undefined,\n });\n break;\n case 'add-task':\n patchMedication(dialog.medication.id, {\n task: form.task.trim() || undefined,\n });\n break;\n }\n };\n\n /** Correct + Add flow through the full NCPDP MedicationEditor. */\n const editorOpen = dialog?.kind === 'correct' || dialog?.kind === 'add';\n const editorTarget =\n dialog?.kind === 'correct' ? dialog.medication : undefined;\n\n const handleEditorSave = (med: Medication) => {\n if (dialog?.kind === 'correct') {\n commit(medications.map((m) => (m.id === med.id ? med : m)));\n } else {\n commit([...medications, { ...med, status: 'unreconciled' }]);\n }\n };\n\n /** Inline CodeLookup add bar — picks/free text land in Unreconciled. */\n const addSearch =\n inlineAddSearch && effectiveCodeLookup && !readOnly ? (\n <effectiveCodeLookup.component\n indexUrl={effectiveCodeLookup.indexUrl}\n locale={effectiveCodeLookup.locale}\n domains={['med']}\n bare\n clearOnSelect\n placeholder=\"Search medications to add\"\n onSelect={(result) =>\n commit([\n ...medications,\n {\n id: newId(),\n name: result.label,\n status: 'unreconciled',\n ...lookupToMedicationFields(result),\n },\n ])\n }\n onFreeText={(text) => addMedication(text)}\n />\n ) : undefined;\n\n return (\n <>\n <MedicationList\n medications={medications}\n title={title}\n readOnly={readOnly}\n actions={actions}\n onStatusChange={(med, status) => patchMedication(med.id, { status })}\n onAction={handleAction}\n onReorder={(ids) =>\n commit(\n [...medications].sort(\n (a, b) => ids.indexOf(a.id) - ids.indexOf(b.id)\n )\n )\n }\n quickAddOptions={quickAddOptions}\n onQuickAdd={(name) => addMedication(name)}\n onAddOther={() => setDialog({ kind: 'add' })}\n addSearch={addSearch}\n reconciledMessage={reconciledMessage}\n emptyMessage={emptyMessage}\n className={className}\n data-testid={dataTestId}\n />\n {dialog && (dialog.kind === 'note' || dialog.kind === 'add-task') && (\n <MedicationDialog\n key={dialog.kind + dialog.medication.id}\n dialog={dialog}\n onClose={() => setDialog(null)}\n onSave={handleDialogSave}\n />\n )}\n {editorOpen && (\n <MedicationEditor\n key={editorTarget?.id ?? 'add'}\n open\n medication={editorTarget}\n codeLookup={codeLookup === false ? false : effectiveCodeLookup}\n onClose={() => setDialog(null)}\n onSave={handleEditorSave}\n />\n )}\n </>\n );\n}\n\nexport default MedicationReconciliation;\n"]}
|