@eka-care/medical-records-ui 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +151 -0
- package/dist/DocumentViewer-WXL7OZXK.mjs +197 -0
- package/dist/DocumentViewer-WXL7OZXK.mjs.map +1 -0
- package/dist/DocumentViewer-Z3GOU5NU.js +197 -0
- package/dist/DocumentViewer-Z3GOU5NU.js.map +1 -0
- package/dist/PdfViewer-EAN6EQAB.js +141 -0
- package/dist/PdfViewer-EAN6EQAB.js.map +1 -0
- package/dist/PdfViewer-WIV5AUJB.mjs +141 -0
- package/dist/PdfViewer-WIV5AUJB.mjs.map +1 -0
- package/dist/index.css +3869 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.mts +390 -0
- package/dist/index.d.ts +390 -0
- package/dist/index.js +4796 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +4796 -0
- package/dist/index.mjs.map +1 -0
- package/dist/styles.css +3869 -0
- package/dist/styles.css.map +1 -0
- package/dist/styles.d.mts +2 -0
- package/dist/styles.d.ts +2 -0
- package/package.json +57 -0
- package/src/index.ts +40 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/connection/SdkProvider.tsx","../src/workers/shared/coreTypes.ts","../src/connection/workerClient.ts","../src/stores/createPatientStore.ts","../src/stores/slices/recordsSlice.ts","../src/stores/slices/casesSlice.ts","../src/stores/slices/uploadSlice.ts","../src/stores/slices/selectionSlice.ts","../src/stores/slices/filtersSlice.ts","../src/stores/slices/syncSlice.ts","../src/stores/slices/detailsSlice.ts","../src/connection/SdkContext.ts","../src/helpers/documentTypeLabels.ts","../src/components/icons/EmptyRecordsIcon.tsx","../src/connection/useSdk.ts","../src/views/RecordsView/RecordsView.tsx","../src/components/icons/FilteredEmptyIcon.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/DeleteConfirmModal/DeleteConfirmModal.tsx","../src/helpers/formatters.ts","../src/views/RecordsView/RecordsToolbar.tsx","../src/components/FilterChip/FilterChip.tsx","../src/components/Tooltip/Tooltip.tsx","../src/views/RecordsView/FilterPopover.tsx","../src/components/PresetSelect/PresetSelect.tsx","../src/components/MultiSelect/MultiSelect.tsx","../src/connection/useRecordsConnection.ts","../src/helpers/mappings.ts","../src/connection/useRecordDetail.ts","../src/connection/useAllRecordTags.ts","../src/connection/useRecordPreview.ts","../src/helpers/smartReport.ts","../src/connection/useCasesConnection.ts","../src/connection/useUploadConnection.ts","../src/connection/useLogout.ts","../src/stores/selectors/recordsSelectors.ts","../src/stores/selectors/casesSelectors.ts","../src/stores/selectors/filteredSelectors.ts","../src/helpers/recordFilter.ts","../src/connection/useRecordSelectors.ts","../src/components/SidebarItem/SidebarItem.tsx","../src/views/RecordsView/SidebarPagination.tsx","../src/components/CasePicker/CasePicker.tsx","../src/views/RecordsView/RecordsSidebar.tsx","../src/views/RecordsView/RecordsGrid.tsx","../src/views/RecordsView/RecordCardContainer.tsx","../src/components/RecordCard/RecordCard.tsx","../src/components/Badge/Badge.tsx","../src/components/icons/AnalysingIcon.tsx","../src/components/icons/UploadingIcon.tsx","../src/components/icons/FailedUploadIcon.tsx","../src/components/IconButton/IconButton.tsx","../src/components/TagChip/TagChip.tsx","../src/components/Thumbnail/Thumbnail.tsx","../src/components/OverflowMenu/OverflowMenu.tsx","../src/components/icons/AttachContextIcon.tsx","../src/views/RecordsView/AddToContextSubPanel.tsx","../src/views/RecordsView/RecordsActionsContext.ts","../src/views/RecordsView/useRecordItem.ts","../src/views/RecordsView/copyRecordNotes.ts","../src/views/RecordsView/useInViewport.ts","../src/views/RecordsView/RecordRowContainer.tsx","../src/components/RecordRow/RecordRow.tsx","../src/views/RecordsView/RecordsSelectionFooter.tsx","../src/views/RecordPreview/RecordPreview.tsx","../src/views/RecordPreview/SmartReportPanel.tsx","../src/views/RecordsView/UploadModal.tsx","../src/views/RecordsView/useRecordsView.ts","../src/views/RecordsView/useRecordSections.ts","../src/views/RecordsView/useSectionPages.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useMemo, type ReactNode } from 'react';\nimport { initWorkerClient, getCore } from './workerClient';\nimport { createPatientStore } from '../stores/createPatientStore';\nimport { SdkContext, type SdkContextValue } from './SdkContext';\nimport { createDocumentTypeLabelResolver } from '../helpers/documentTypeLabels';\nimport { EmptyRecordsIcon } from '../components/icons/EmptyRecordsIcon';\nimport type { SdkConfig, DocumentTypeConfig } from '../workers/shared';\nimport { DOCUMENT_TYPE_LABELS } from '../workers/shared';\n\nexport interface SdkProviderProps {\n config: SdkConfig;\n bid?: string;\n patientId?: string;\n /**\n * Document-type definitions from the host's onboarding config\n * (`mr_document_type`). Drives the code → display-name labels shown across\n * the feature; the SDK's static map is the fallback when a code is absent.\n */\n documentTypes?: DocumentTypeConfig[];\n children: ReactNode;\n}\n\nfunction RecordsPlaceholder() {\n return (\n <div className=\"mr-records-view__empty\">\n <EmptyRecordsIcon size={96} />\n <p className=\"mr-records-view__empty-title\">No records yet</p>\n <p className=\"mr-records-view__empty-desc\">\n Browse and attach the patient's medical records here.\n </p>\n </div>\n );\n}\n\ninterface SdkProviderInnerProps {\n config: SdkConfig;\n bid: string;\n patientId: string;\n documentTypes?: DocumentTypeConfig[];\n children: ReactNode;\n}\n\nfunction SdkProviderInner({ config, bid, patientId, documentTypes, children }: SdkProviderInnerProps) {\n // The Core SDK client constructs synchronously, so it's ready on first render.\n useEffect(() => {\n initWorkerClient(config, patientId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n // Ensure it's initialised before children render the first time too.\n initWorkerClient(config, patientId);\n\n const store = useMemo(() => createPatientStore(bid, patientId), [bid, patientId]);\n\n // Dispose the store's resources when the patient changes or the provider unmounts.\n useEffect(() => () => store.getState().__cleanup(), [store]);\n\n // Trigger SDK sync when internet comes back — the SDK doesn't wire this itself.\n // This causes SyncManager.syncAll() to retry queued uploads/edits and fire\n // records:changed so cards update from upload_failure → upload_success.\n useEffect(() => {\n const handleOnline = () => {\n void getCore().sync();\n };\n window.addEventListener('online', handleOnline);\n return () => window.removeEventListener('online', handleOnline);\n }, []);\n\n const labelOf = useMemo(\n () => createDocumentTypeLabelResolver(documentTypes),\n [documentTypes],\n );\n const docTypes = useMemo(\n () =>\n documentTypes ??\n Object.entries(DOCUMENT_TYPE_LABELS).map(([id, display_name]) => ({ id, display_name })),\n [documentTypes],\n );\n\n const value = useMemo<SdkContextValue>(\n () => ({ bid, patientId, store, ready: true, labelOf, documentTypes: docTypes }),\n [bid, patientId, store, labelOf, docTypes],\n );\n\n return <SdkContext.Provider value={value}>{children}</SdkContext.Provider>;\n}\n\nexport function SdkProvider({ config, bid, patientId, documentTypes, children }: SdkProviderProps) {\n if (!bid || !patientId) return <RecordsPlaceholder />;\n return (\n <SdkProviderInner config={config} bid={bid} patientId={patientId} documentTypes={documentTypes}>\n {children}\n </SdkProviderInner>\n );\n}\n","export type {\n SDKConfig,\n SDKEnvironment,\n CacheConfig,\n DocumentItem,\n DocumentMetadata,\n DocumentFileType,\n FileContentType,\n BatchRequest,\n FileSpec,\n ListDocumentsOptions,\n ListDocumentsFilter,\n AddRecordOptions,\n DescribeDocumentOptions,\n DescribeDocumentResponse,\n ObtainAuthorizationResponse,\n EditRecordOptions,\n EditRecordRequest,\n DeleteRecordOptions,\n CaseItem,\n CaseItemDetails,\n ListCasesOptions,\n CreateCaseOptions,\n CreateCaseRequest,\n CreateCaseResponse,\n UpdateCaseOptions,\n UpdateCaseRequest,\n DeleteCaseOptions,\n} from '@eka-care/medical-records-ts-sdk';\n\nexport {\n MedicalRecordsClient,\n EkaCareApiError,\n UploadFailedError,\n UPLOAD_CONSTRAINTS,\n} from '@eka-care/medical-records-ts-sdk';\n\nexport const DOCUMENT_TYPE_LABELS: Record<string, string> = {\n ps: 'Prescription',\n lr: 'Lab Report',\n dc: 'Discharge Summary',\n vc: 'Vaccine Certificate',\n in: 'Insurance',\n iv: 'Invoice',\n sc: 'Scan',\n op: 'Other',\n};\n","import { MedicalRecordsClient } from '../workers/shared/coreTypes';\nimport type { SdkConfig } from '../workers/shared';\n\n/**\n * Holds the single Core SDK client instance for the app session.\n *\n * The Core SDK (`@eka-care/medical-records-ts-sdk`, linked locally) is an HTTP\n * client with optional IndexedDB caching + delta sync. `getCore()` returns it;\n * the connection hooks call its methods directly.\n */\nlet core: MedicalRecordsClient | null = null;\n\n/** True now that the Core SDK package is installed and wired in. */\nexport const CORE_SDK_AVAILABLE = true;\n\nexport function initWorkerClient(config: SdkConfig, oid?: string): void {\n if (core) {\n if (config.accessToken) core.setAuthToken(config.accessToken);\n return;\n }\n const resolvedOid = oid ?? config.oid;\n core = new MedicalRecordsClient({\n environment: config.environment,\n baseUrl: config.baseUrl,\n defaultHeaders: config.defaultHeaders,\n onError: config.onError,\n onUnauthorized: config.onUnauthorized,\n transport: config.transport,\n cache: resolvedOid ? { oid: resolvedOid } : undefined,\n });\n if (config.accessToken) core.setAuthToken(config.accessToken);\n}\n\nexport function getCore(): MedicalRecordsClient {\n if (!core) {\n throw new Error('SDK not initialised — wrap your tree in <SdkProvider>');\n }\n return core;\n}\n\nexport function isWorkerReady(): boolean {\n return core != null;\n}\n\n/** Update the auth token on the live client (e.g. after a refresh). */\nexport function setAuthToken(token: string | undefined): void {\n core?.setAuthToken(token);\n}\n\n/** Drop the client reference (logout). */\nexport function teardownWorkerClient(): void {\n core = null;\n}\n\n/** Clear cached DB data for the bid then drop the client reference. */\nexport async function logoutMedicalRecords(bid?: string): Promise<void> {\n if (bid && core) {\n try { await core.clearDbForBid(bid); } catch { /* best-effort */ }\n }\n core = null;\n}\n","import { createStore } from 'zustand/vanilla';\nimport { subscribeWithSelector } from 'zustand/middleware';\nimport { createRecordsSlice } from './slices/recordsSlice';\nimport { createCasesSlice } from './slices/casesSlice';\nimport { createUploadSlice } from './slices/uploadSlice';\nimport { createSelectionSlice } from './slices/selectionSlice';\nimport { createFiltersSlice } from './slices/filtersSlice';\nimport { createSyncSlice } from './slices/syncSlice';\nimport { createDetailsSlice } from './slices/detailsSlice';\nimport type { PatientState } from './types';\n\n/**\n * Builds one Zustand store per patient. `subscribeWithSelector` is required so\n * per-slice selectors re-render only on the state they read.\n */\nexport function createPatientStore(bid: string, patientId: string) {\n return createStore<PatientState>()(\n subscribeWithSelector((...a) => ({\n bid,\n patientId,\n ...createRecordsSlice(...a),\n ...createCasesSlice(...a),\n ...createDetailsSlice(...a),\n ...createUploadSlice(...a),\n ...createSelectionSlice(...a),\n ...createFiltersSlice(...a),\n ...createSyncSlice(...a),\n __cleanup: () => {\n // No GPU/IO resources to release today; kept as the eviction hook.\n },\n })),\n );\n}\n\nexport type PatientStore = ReturnType<typeof createPatientStore>;\n","import type { StateCreator } from 'zustand';\nimport type { PatientState } from '../types';\nimport type { RecordItem } from '../../helpers/mappings';\n\nexport type RecordsStatus = 'idle' | 'loading' | 'stale' | 'fresh' | 'error';\n\n/** Shallow value-equality for a record — so unchanged rows keep their object\n * reference across re-maps (prevents needless card/thumbnail re-renders). */\nfunction sameRecord(a: RecordItem, b: RecordItem): boolean {\n return (\n a.id === b.id &&\n a.title === b.title &&\n a.type === b.type &&\n a.typeCode === b.typeCode &&\n a.thumbnailUrl === b.thumbnailUrl &&\n a.createdAtEpoch === b.createdAtEpoch &&\n a.updatedAtEpoch === b.updatedAtEpoch &&\n a.syncState === b.syncState &&\n a.fileType === b.fileType &&\n a.isSmart === b.isSmart &&\n a.isAnalysing === b.isAnalysing &&\n a.tags.length === b.tags.length &&\n a.tags.every((t, i) => t === b.tags[i]) &&\n a.cases.length === b.cases.length &&\n a.cases.every((c, i) => c === b.cases[i])\n );\n}\n\nexport interface RecordsSlice {\n byId: Record<string, RecordItem>;\n ids: string[]; // sorted: most recent first (createdAtEpoch desc)\n status: RecordsStatus;\n error: string | null;\n pendingIds: Set<string>; // optimistic delete/edit in-flight\n\n setAll: (records: RecordItem[]) => void;\n upsert: (record: RecordItem) => void;\n remove: (id: string) => void;\n markPending: (id: string) => void;\n unmarkPending: (id: string) => void;\n setStatus: (status: RecordsStatus) => void;\n setError: (error: string | null) => void;\n}\n\nexport const createRecordsSlice: StateCreator<\n PatientState,\n [],\n [],\n { records: RecordsSlice }\n> = (set) => ({\n records: {\n byId: {},\n ids: [],\n status: 'idle',\n error: null,\n pendingIds: new Set(),\n\n setAll: (records) =>\n set((state) => {\n const prev = state.records.byId;\n // Reuse the previous object for unchanged rows so card/thumbnail\n // identities stay stable across re-maps (no re-decode / flicker).\n const byId: Record<string, RecordItem> = {};\n let changed = records.length !== state.records.ids.length;\n for (const r of records) {\n const existing = prev[r.id];\n byId[r.id] = existing && sameRecord(existing, r) ? existing : r;\n if (!existing || byId[r.id] !== existing) changed = true;\n }\n const nextIds = records\n .map((r) => r.id)\n .sort((a, b) => byId[b].createdAtEpoch - byId[a].createdAtEpoch);\n // Keep the previous ids array reference when the order/membership is\n // identical, so id-list subscribers don't re-render.\n const sameIds =\n nextIds.length === state.records.ids.length &&\n nextIds.every((id, i) => id === state.records.ids[i]);\n const ids = sameIds ? state.records.ids : nextIds;\n // Nothing meaningful changed → return the same state (no notify).\n if (!changed && sameIds) return state;\n return { records: { ...state.records, byId, ids } };\n }),\n\n upsert: (record) =>\n set((state) => {\n const byId = { ...state.records.byId, [record.id]: record };\n // Existing record → keep order; new record → prepend (newest at top).\n const ids =\n record.id in state.records.byId\n ? state.records.ids\n : [record.id, ...state.records.ids];\n return { records: { ...state.records, byId, ids } };\n }),\n\n remove: (id) =>\n set((state) => {\n const { [id]: _removed, ...byId } = state.records.byId;\n return {\n records: {\n ...state.records,\n byId,\n ids: state.records.ids.filter((i) => i !== id),\n },\n };\n }),\n\n markPending: (id) =>\n set((state) => {\n const pendingIds = new Set(state.records.pendingIds);\n pendingIds.add(id);\n return { records: { ...state.records, pendingIds } };\n }),\n\n unmarkPending: (id) =>\n set((state) => {\n const pendingIds = new Set(state.records.pendingIds);\n pendingIds.delete(id);\n return { records: { ...state.records, pendingIds } };\n }),\n\n setStatus: (status) =>\n set((state) => ({ records: { ...state.records, status } })),\n\n setError: (error) =>\n set((state) => ({ records: { ...state.records, error, status: 'error' } })),\n },\n});\n","import type { StateCreator } from 'zustand';\nimport type { PatientState } from '../types';\nimport type { CaseUiItem } from '../../helpers/mappings';\nimport type { RecordsStatus } from './recordsSlice';\n\nexport interface CasesSlice {\n byId: Record<string, CaseUiItem>;\n ids: string[];\n status: RecordsStatus;\n error: string | null;\n\n setAll: (cases: CaseUiItem[]) => void;\n upsert: (caseItem: CaseUiItem) => void;\n remove: (id: string) => void;\n setStatus: (status: RecordsStatus) => void;\n setError: (error: string | null) => void;\n}\n\nexport const createCasesSlice: StateCreator<\n PatientState,\n [],\n [],\n { cases: CasesSlice }\n> = (set) => ({\n cases: {\n byId: {},\n ids: [],\n status: 'idle',\n error: null,\n\n setAll: (cases) =>\n set((state) => {\n const byId: Record<string, CaseUiItem> = {};\n for (const c of cases) byId[c.id] = c;\n const ids = cases\n .map((c) => c.id)\n .sort((a, b) => byId[b].createdAtEpoch - byId[a].createdAtEpoch);\n return { cases: { ...state.cases, byId, ids } };\n }),\n\n upsert: (caseItem) =>\n set((state) => {\n const byId = { ...state.cases.byId, [caseItem.id]: caseItem };\n const ids =\n caseItem.id in state.cases.byId\n ? state.cases.ids\n : [caseItem.id, ...state.cases.ids];\n return { cases: { ...state.cases, byId, ids } };\n }),\n\n remove: (id) =>\n set((state) => {\n const { [id]: _removed, ...byId } = state.cases.byId;\n return {\n cases: { ...state.cases, byId, ids: state.cases.ids.filter((i) => i !== id) },\n };\n }),\n\n setStatus: (status) => set((state) => ({ cases: { ...state.cases, status } })),\n setError: (error) =>\n set((state) => ({ cases: { ...state.cases, error, status: 'error' } })),\n },\n});\n","import type { StateCreator } from 'zustand';\nimport type { PatientState } from '../types';\nimport type { UploadQueueItem } from '../../helpers/mappings';\n\nexport interface UploadSlice {\n queue: UploadQueueItem[];\n\n add: (item: UploadQueueItem) => void;\n updateProgress: (id: string, progress: number) => void; // 0–100\n markCompleted: (id: string, documentId: string) => void;\n markFailed: (id: string) => void;\n remove: (id: string) => void;\n}\n\nexport const createUploadSlice: StateCreator<\n PatientState,\n [],\n [],\n { uploadQueue: UploadSlice }\n> = (set) => ({\n uploadQueue: {\n queue: [],\n\n add: (item) =>\n set((state) => ({\n uploadQueue: { ...state.uploadQueue, queue: [...state.uploadQueue.queue, item] },\n })),\n\n updateProgress: (id, progress) =>\n set((state) => ({\n uploadQueue: {\n ...state.uploadQueue,\n queue: state.uploadQueue.queue.map((q) =>\n q.id === id ? { ...q, progress, status: 'uploading' } : q,\n ),\n },\n })),\n\n markCompleted: (id, documentId) =>\n set((state) => ({\n uploadQueue: {\n ...state.uploadQueue,\n queue: state.uploadQueue.queue.map((q) =>\n q.id === id ? { ...q, status: 'completed', progress: 100, documentId } : q,\n ),\n },\n })),\n\n markFailed: (id) =>\n set((state) => ({\n uploadQueue: {\n ...state.uploadQueue,\n queue: state.uploadQueue.queue.map((q) =>\n q.id === id ? { ...q, status: 'upload_failure' } : q,\n ),\n },\n })),\n\n remove: (id) =>\n set((state) => ({\n uploadQueue: {\n ...state.uploadQueue,\n queue: state.uploadQueue.queue.filter((q) => q.id !== id),\n },\n })),\n },\n});\n","import type { StateCreator } from 'zustand';\nimport type { PatientState } from '../types';\n\nexport interface SelectionSlice {\n recordIds: Set<string>; \n openDetailId: string | null; \n toggleRecord: (id: string, max?: number) => void;\n clearSelection: () => void;\n openDetail: (id: string | null) => void;\n}\n\nexport const createSelectionSlice: StateCreator<\n PatientState,\n [],\n [],\n { selection: SelectionSlice }\n> = (set) => ({\n selection: {\n recordIds: new Set(),\n openDetailId: null,\n\n toggleRecord: (id, max) =>\n set((state) => {\n const recordIds = new Set(state.selection.recordIds);\n if (recordIds.has(id)) {\n recordIds.delete(id);\n } else {\n if (max !== undefined && recordIds.size >= max) return state; // at cap — ignore\n recordIds.add(id);\n }\n return { selection: { ...state.selection, recordIds } };\n }),\n\n clearSelection: () =>\n set((state) => {\n if (state.selection.recordIds.size === 0) return state;\n return { selection: { ...state.selection, recordIds: new Set() } };\n }),\n\n openDetail: (id) =>\n set((state) => ({ selection: { ...state.selection, openDetailId: id } })),\n },\n});\n","import type { StateCreator } from 'zustand';\nimport type { PatientState } from '../types';\n\nexport type DatePreset = 'anytime' | 'last7' | 'last30' | 'last3m' | 'custom';\n\nexport interface PopoverFilters {\n documentDateFrom: number | null;\n documentDateTo: number | null;\n uploadDateFrom: number | null;\n uploadDateTo: number | null;\n documentDatePreset: DatePreset;\n uploadDatePreset: DatePreset;\n tags: string[];\n}\nexport interface FiltersSlice {\n type: string | null; // record type filter (toolbar chip rail)\n search: string;\n documentDateFrom: number | null;\n documentDateTo: number | null;\n uploadDateFrom: number | null;\n uploadDateTo: number | null;\n documentDatePreset: DatePreset;\n uploadDatePreset: DatePreset;\n tags: string[];\n sortBy: 'date' | 'name';\n sortDir: 'asc' | 'desc';\n setType: (type: string | null) => void;\n setSearch: (q: string) => void;\n applyPopoverFilters: (filters: PopoverFilters) => void;\n setSortBy: (by: FiltersSlice['sortBy']) => void;\n setSortDir: (dir: FiltersSlice['sortDir']) => void;\n clearPopoverFilters: () => void;\n reset: () => void;\n}\n\nconst EMPTY_POPOVER: PopoverFilters = {\n documentDateFrom: null,\n documentDateTo: null,\n uploadDateFrom: null,\n uploadDateTo: null,\n documentDatePreset: 'anytime',\n uploadDatePreset: 'anytime',\n tags: [],\n};\n\nconst INITIAL = {\n type: null,\n search: '',\n ...EMPTY_POPOVER,\n sortBy: 'date' as const,\n sortDir: 'desc' as const,\n};\n\nexport const createFiltersSlice: StateCreator<\n PatientState,\n [],\n [],\n { filters: FiltersSlice }\n> = (set) => ({\n filters: {\n ...INITIAL,\n\n setType: (type) => set((state) => ({ filters: { ...state.filters, type } })),\n setSearch: (search) => set((state) => ({ filters: { ...state.filters, search } })),\n applyPopoverFilters: (f) => set((state) => ({ filters: { ...state.filters, ...f } })),\n setSortBy: (sortBy) => set((state) => ({ filters: { ...state.filters, sortBy } })),\n setSortDir: (sortDir) => set((state) => ({ filters: { ...state.filters, sortDir } })),\n clearPopoverFilters: () =>\n set((state) => ({ filters: { ...state.filters, ...EMPTY_POPOVER } })),\n reset: () => set((state) => ({ filters: { ...state.filters, ...INITIAL } })),\n },\n});\n","import type { StateCreator } from 'zustand';\nimport type { PatientState } from '../types';\n\nexport type SyncStatus = 'online' | 'offline' | 'syncing';\n\nexport interface SyncSlice {\n status: SyncStatus;\n pendingSyncCount: number;\n\n setStatus: (status: SyncStatus) => void;\n incrementPending: () => void;\n decrementPending: () => void;\n}\n\nexport const createSyncSlice: StateCreator<\n PatientState,\n [],\n [],\n { sync: SyncSlice }\n> = (set) => ({\n sync: {\n status: 'online',\n pendingSyncCount: 0,\n\n setStatus: (status) => set((state) => ({ sync: { ...state.sync, status } })),\n incrementPending: () =>\n set((state) => ({\n sync: { ...state.sync, pendingSyncCount: state.sync.pendingSyncCount + 1 },\n })),\n decrementPending: () =>\n set((state) => ({\n sync: {\n ...state.sync,\n pendingSyncCount: Math.max(0, state.sync.pendingSyncCount - 1),\n },\n })),\n },\n});\n","import type { StateCreator } from 'zustand';\nimport type { PatientState } from '../types';\n\nexport type DetailStatus = 'idle' | 'loading' | 'loaded' | 'error';\n\nexport interface RecordDetail {\n status: DetailStatus;\n isSmart: boolean;\n /** Verified smart-report fields as `name: value` lines, ready to copy/paste. */\n smartText: string;\n}\n\nexport interface DetailsSlice {\n byId: Record<string, RecordDetail>;\n setDetailLoading: (id: string) => void;\n setDetail: (id: string, detail: { isSmart: boolean; smartText: string }) => void;\n setDetailError: (id: string) => void;\n}\n\nexport const createDetailsSlice: StateCreator<\n PatientState,\n [],\n [],\n { details: DetailsSlice }\n> = (set) => ({\n details: {\n byId: {},\n\n setDetailLoading: (id) =>\n set((state) => {\n if (state.details.byId[id]?.status === 'loading') return state;\n return {\n details: {\n ...state.details,\n byId: {\n ...state.details.byId,\n [id]: { status: 'loading', isSmart: false, smartText: '' },\n },\n },\n };\n }),\n\n setDetail: (id, { isSmart, smartText }) =>\n set((state) => ({\n details: {\n ...state.details,\n byId: {\n ...state.details.byId,\n [id]: { status: 'loaded', isSmart, smartText },\n },\n },\n })),\n\n setDetailError: (id) =>\n set((state) => ({\n details: {\n ...state.details,\n byId: {\n ...state.details.byId,\n [id]: { status: 'error', isSmart: false, smartText: '' },\n },\n },\n })),\n },\n});\n","import { createContext } from 'react';\nimport type { PatientStore } from '../stores/createPatientStore';\nimport type { DocumentTypeLabelResolver } from '../helpers/documentTypeLabels';\nimport type { DocumentTypeConfig } from '../workers/shared';\nexport interface SdkContextValue {\n bid: string;\n patientId: string;\n store: PatientStore;\n ready: boolean; // true once the core sdk worker has initialised\n labelOf: DocumentTypeLabelResolver; // fallback\n documentTypes: DocumentTypeConfig[];\n}\n\nexport const SdkContext = createContext<SdkContextValue | null>(null);\n","import { DOCUMENT_TYPE_LABELS } from '../workers/shared/coreTypes';\nimport type { DocumentTypeConfig } from '../workers/shared/messageTypes';\n\nexport type DocumentTypeLabelResolver = (code: string) => string;\n\nconst STATIC_LABELS: Record<string, string> = DOCUMENT_TYPE_LABELS ?? {};\n\n\nexport function createDocumentTypeLabelResolver(\n types?: DocumentTypeConfig[],\n): DocumentTypeLabelResolver {\n const fromConfig = new Map<string, string>();\n for (const t of types ?? []) {\n if (t.id && t.display_name) fromConfig.set(t.id, t.display_name);\n }\n return (code: string) => fromConfig.get(code) ?? STATIC_LABELS[code] ?? code;\n}\n","export function EmptyRecordsIcon({ size = 96 }: { size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 96 96\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n >\n <g clipPath=\"url(#mr-empty-clip)\">\n <path\n d=\"M73.92 0H22.08C9.88555 0 0 9.88555 0 22.08V73.92C0 86.1144 9.88555 96 22.08 96H73.92C86.1144 96 96 86.1144 96 73.92V22.08C96 9.88555 86.1144 0 73.92 0Z\"\n fill=\"#E8F0FF\"\n />\n <g opacity=\"0.75\" filter=\"url(#mr-empty-f0)\">\n <path\n d=\"M73.0797 17.5H29.8797C25.9032 17.5 22.6797 20.7235 22.6797 24.7V61.18C22.6797 65.1565 25.9032 68.38 29.8797 68.38H73.0797C77.0561 68.38 80.2797 65.1565 80.2797 61.18V24.7C80.2797 20.7235 77.0561 17.5 73.0797 17.5Z\"\n fill=\"white\"\n />\n </g>\n <g filter=\"url(#mr-empty-f1)\">\n <path\n d=\"M65.4 25.1797H22.2C18.2235 25.1797 15 28.4032 15 32.3797V68.8597C15 72.8361 18.2235 76.0597 22.2 76.0597H65.4C69.3764 76.0597 72.6 72.8361 72.6 68.8597V32.3797C72.6 28.4032 69.3764 25.1797 65.4 25.1797Z\"\n fill=\"white\"\n />\n </g>\n <path\n d=\"M50.2802 40.54H37.3202C36.1272 40.54 35.1602 41.5071 35.1602 42.7C35.1602 43.893 36.1272 44.86 37.3202 44.86H50.2802C51.4731 44.86 52.4402 43.893 52.4402 42.7C52.4402 41.5071 51.4731 40.54 50.2802 40.54Z\"\n fill=\"#93B8DA\"\n />\n <path\n d=\"M45.7204 36.4598C45.7204 35.2669 44.7533 34.2998 43.5604 34.2998C42.3675 34.2998 41.4004 35.2669 41.4004 36.4598V49.4198C41.4004 50.6127 42.3675 51.5798 43.5604 51.5798C44.7533 51.5798 45.7204 50.6127 45.7204 49.4198V36.4598Z\"\n fill=\"#93B8DA\"\n />\n <path\n d=\"M63.7197 59.7402H23.8797C23.2169 59.7402 22.6797 60.2775 22.6797 60.9402C22.6797 61.603 23.2169 62.1402 23.8797 62.1402H63.7197C64.3824 62.1402 64.9197 61.603 64.9197 60.9402C64.9197 60.2775 64.3824 59.7402 63.7197 59.7402Z\"\n fill=\"#C2D9EE\"\n />\n <path\n d=\"M52.1997 65.5H23.8797C23.2169 65.5 22.6797 66.0373 22.6797 66.7C22.6797 67.3627 23.2169 67.9 23.8797 67.9H52.1997C52.8624 67.9 53.3997 67.3627 53.3997 66.7C53.3997 66.0373 52.8624 65.5 52.1997 65.5Z\"\n fill=\"#C2D9EE\"\n />\n <g filter=\"url(#mr-empty-f2)\">\n <path\n d=\"M65.8799 84.2198C73.0375 84.2198 78.8399 78.4174 78.8399 71.2598C78.8399 64.1022 73.0375 58.2998 65.8799 58.2998C58.7223 58.2998 52.9199 64.1022 52.9199 71.2598C52.9199 78.4174 58.7223 84.2198 65.8799 84.2198Z\"\n fill=\"#2563EB\"\n />\n </g>\n <path d=\"M65.8789 66.46V76.06\" stroke=\"white\" strokeWidth=\"1.68\" strokeLinecap=\"round\" />\n <path d=\"M61.0801 71.2598H70.6801\" stroke=\"white\" strokeWidth=\"1.68\" strokeLinecap=\"round\" />\n </g>\n <defs>\n <filter\n id=\"mr-empty-f0\"\n x=\"19.6797\"\n y=\"15.5\"\n width=\"63.6\"\n height=\"56.8799\"\n filterUnits=\"userSpaceOnUse\"\n colorInterpolationFilters=\"sRGB\"\n >\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\n <feMorphology radius=\"1\" operator=\"erode\" in=\"SourceAlpha\" result=\"effect1\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feComposite in2=\"hardAlpha\" operator=\"out\" />\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1.5\" />\n <feComposite in2=\"hardAlpha\" operator=\"out\" />\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0\" />\n <feBlend mode=\"normal\" in2=\"effect1\" result=\"effect2\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect2\" result=\"shape\" />\n </filter>\n <filter\n id=\"mr-empty-f1\"\n x=\"12\"\n y=\"23.1797\"\n width=\"63.6\"\n height=\"56.8799\"\n filterUnits=\"userSpaceOnUse\"\n colorInterpolationFilters=\"sRGB\"\n >\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\n <feMorphology radius=\"1\" operator=\"erode\" in=\"SourceAlpha\" result=\"effect1\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feComposite in2=\"hardAlpha\" operator=\"out\" />\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1.5\" />\n <feComposite in2=\"hardAlpha\" operator=\"out\" />\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0\" />\n <feBlend mode=\"normal\" in2=\"effect1\" result=\"effect2\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect2\" result=\"shape\" />\n </filter>\n <filter\n id=\"mr-empty-f2\"\n x=\"49.9199\"\n y=\"56.2998\"\n width=\"31.92\"\n height=\"31.9199\"\n filterUnits=\"userSpaceOnUse\"\n colorInterpolationFilters=\"sRGB\"\n >\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\n <feMorphology radius=\"1\" operator=\"erode\" in=\"SourceAlpha\" result=\"effect1\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feComposite in2=\"hardAlpha\" operator=\"out\" />\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1.5\" />\n <feComposite in2=\"hardAlpha\" operator=\"out\" />\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0\" />\n <feBlend mode=\"normal\" in2=\"effect1\" result=\"effect2\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect2\" result=\"shape\" />\n </filter>\n <clipPath id=\"mr-empty-clip\">\n <rect width=\"96\" height=\"96\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n );\n}\n","import { useContext } from 'react';\nimport { SdkContext, type SdkContextValue } from './SdkContext';\n\nexport function useSdk(): SdkContextValue {\n const ctx = useContext(SdkContext);\n if (!ctx) {\n throw new Error('useSdk must be used within <SdkProvider>');\n }\n return ctx;\n}\n","'use client';\n\nimport { TriangleAlert, RefreshCcw, Upload } from 'lucide-react';\nimport { FilteredEmptyIcon } from '../../components/icons/FilteredEmptyIcon';\nimport { Skeleton } from '../../components/Skeleton/Skeleton';\nimport { DeleteConfirmModal } from '../../components/DeleteConfirmModal/DeleteConfirmModal';\nimport { epochToDisplay } from '../../helpers/formatters';\nimport { RecordsToolbar } from './RecordsToolbar';\nimport { RecordsSidebar } from './RecordsSidebar';\nimport { RecordsGrid } from './RecordsGrid';\nimport { RecordsSelectionFooter } from './RecordsSelectionFooter';\nimport { RecordPreview } from '../RecordPreview/RecordPreview';\nimport { UploadModal } from './UploadModal';\nimport { RecordsActionsProvider } from './RecordsActionsContext';\nimport { EmptyRecordsIcon } from '../../components/icons/EmptyRecordsIcon';\nimport { useRecordsView } from './useRecordsView';\nimport type { FiltersSlice } from '../../stores/slices/filtersSlice';\nimport type { DocumentTypeLabelResolver } from '../../helpers/documentTypeLabels';\n\nexport type SidebarTab = 'date' | 'careContext';\n\nexport const MAX_CONTEXT_ATTACHMENTS = 1;\n\nexport interface RecordsViewProps {\n className?: string;\n onUpload?: () => void;\n allowUpload?: boolean;\n onCopyToNote?: (text: string, anchor?: { x: number; y: number }) => void | Promise<void>;\n attachedIds?: string[];\n onAttachManyToContext?: (\n records: Array<{ documentId: string; name: string }>,\n ) => void | Promise<void>;\n onRemoveAttachment?: (documentId: string) => void | Promise<void>;\n onToast?: (message: string, type?: 'error' | 'success') => void;\n}\n\nexport function RecordsView({\n className,\n onUpload,\n allowUpload = true,\n onCopyToNote,\n attachedIds,\n onAttachManyToContext,\n onRemoveAttachment,\n onToast,\n}: RecordsViewProps) {\n const {\n store,\n labelOf,\n viewMode,\n setViewMode,\n sidebarTab,\n activeKey,\n selectionMode,\n page,\n pageCount,\n uploadOpen,\n setUploadOpen,\n openDetailId,\n activeFilters,\n selectedCount,\n attachedIdSet,\n filteredSections,\n pageSections,\n deleteTarget,\n deleting,\n isInitialLoading,\n isLoadFailed,\n isTabEmpty,\n upload,\n refresh,\n sourceRefreshedAt,\n actions,\n handleTabChange,\n handleSelectSection,\n handleToggleSelectionMode,\n clearSelection,\n handleAttachMany,\n openUpload,\n cancelDelete,\n confirmDelete,\n setPage,\n } = useRecordsView({\n onUpload,\n allowUpload,\n onCopyToNote,\n attachedIds,\n onAttachManyToContext,\n onRemoveAttachment,\n onToast,\n });\n\n if (isInitialLoading) {\n return (\n <div className={`mr-records-view${className ? ` ${className}` : ''}`}>\n <RecordsLoadingState />\n </div>\n );\n }\n\n if (isLoadFailed || isTabEmpty) {\n return (\n <>\n <div className={`mr-records-view mr-records-view--state${className ? ` ${className}` : ''}`}>\n {isLoadFailed ? (\n <RecordsErrorState onRetry={refresh} />\n ) : (\n <RecordsEmptyState onUpload={allowUpload ? openUpload : undefined} />\n )}\n </div>\n {uploadOpen && (\n <UploadModal\n onUpload={upload}\n onError={(msg) => onToast?.(msg, 'error')}\n onSuccess={(msg) => onToast?.(msg, 'success')}\n onClose={() => setUploadOpen(false)}\n />\n )}\n </>\n );\n }\n\n return (\n <RecordsActionsProvider value={actions}>\n <div className={`mr-records-view${className ? ` ${className}` : ''}`}>\n <div className=\"mr-records-view__grid\" hidden={!!openDetailId}>\n <RecordsToolbar\n viewMode={viewMode}\n onViewModeChange={setViewMode}\n onUpload={allowUpload ? openUpload : undefined}\n onRefresh={refresh}\n sourceRefreshedAt={sourceRefreshedAt}\n selectionMode={selectionMode}\n onToggleSelect={handleToggleSelectionMode}\n />\n <div className=\"mr-records-view__body\">\n <RecordsSidebar\n tab={sidebarTab}\n onTabChange={handleTabChange}\n sections={pageSections}\n activeKey={activeKey}\n onSelectSection={handleSelectSection}\n page={page}\n pageCount={pageCount}\n onPageChange={setPage}\n />\n <div className=\"mr-records-view__main\">\n <ActiveFiltersBar\n filters={activeFilters}\n labelOf={labelOf}\n onRemoveType={() => store.getState().filters.setType(null)}\n onRemoveTags={(tag: string) => store.getState().filters.applyPopoverFilters({ ...activeFilters, tags: activeFilters.tags.filter((t) => t !== tag) })}\n onRemoveDocDate={() => store.getState().filters.applyPopoverFilters({ ...activeFilters, documentDateFrom: null, documentDateTo: null, documentDatePreset: 'anytime' })}\n onRemoveUploadDate={() => store.getState().filters.applyPopoverFilters({ ...activeFilters, uploadDateFrom: null, uploadDateTo: null, uploadDatePreset: 'anytime' })}\n onClearAll={() => { store.getState().filters.setType(null); store.getState().filters.clearPopoverFilters(); }}\n />\n <div className=\"mr-records-view__content\">\n {filteredSections.length === 0 ? (\n <RecordsFilteredEmpty />\n ) : (\n <RecordsGrid\n sections={filteredSections}\n viewMode={viewMode}\n selectionMode={selectionMode}\n maxSelectable={MAX_CONTEXT_ATTACHMENTS}\n showMonths={sidebarTab === 'date'}\n scrollToKey={activeKey}\n />\n )}\n </div>\n {selectionMode && (\n <RecordsSelectionFooter\n selectedCount={attachedIdSet.size + selectedCount}\n maxCount={MAX_CONTEXT_ATTACHMENTS}\n actionsDisabled={selectedCount === 0 || attachedIdSet.size >= MAX_CONTEXT_ATTACHMENTS}\n onClear={clearSelection}\n onAttach={handleAttachMany}\n />\n )}\n </div>\n </div>\n </div>\n\n {openDetailId && (\n <div className=\"mr-records-view__preview\">\n <RecordPreview\n recordId={openDetailId}\n onBack={() => store.getState().selection.openDetail(null)}\n />\n </div>\n )}\n\n {deleteTarget && (\n <DeleteConfirmModal\n recordLabel={`${deleteTarget.type} (${epochToDisplay(deleteTarget.createdAtEpoch)})`}\n deleting={deleting}\n onConfirm={confirmDelete}\n onCancel={cancelDelete}\n />\n )}\n {uploadOpen && (\n <UploadModal\n onUpload={upload}\n onError={(msg) => onToast?.(msg, 'error')}\n onSuccess={(msg) => onToast?.(msg, 'success')}\n onClose={() => setUploadOpen(false)}\n />\n )}\n </div>\n </RecordsActionsProvider>\n );\n}\n\nfunction RecordsEmptyState({ onUpload }: { onUpload?: () => void }) {\n return (\n <div className=\"mr-records-view__empty\">\n <EmptyRecordsIcon size={96} />\n <p className=\"mr-records-view__empty-title\">No records yet</p>\n <p className=\"mr-records-view__empty-desc\">\n Upload your first record to get started — lab reports, scans,\n prescriptions, anything works.\n </p>\n {onUpload && (\n <button type=\"button\" className=\"mr-records-view__upload-cta\" onClick={onUpload}>\n <Upload size={16} aria-hidden />\n Upload\n </button>\n )}\n </div>\n );\n}\n\nfunction RecordsFilteredEmpty() {\n return (\n <div className=\"mr-records-view__filtered-empty\">\n <FilteredEmptyIcon size={96} />\n <div className=\"mr-records-view__filtered-empty-text\">\n <p className=\"mr-records-view__filtered-empty-title\">No records found</p>\n <p className=\"mr-records-view__filtered-empty-desc\">Nothing matched your filters. Try adjusting or clearing them.</p>\n </div>\n </div>\n );\n}\n\nfunction RecordsLoadingState() {\n return (\n <div className=\"mr-records-loading\">\n <div className=\"mr-records-loading__toolbar\">\n <Skeleton variant=\"circle\" width={36} height={36} />\n <Skeleton variant=\"text\" width={220} height={32} />\n <div className=\"mr-records-loading__toolbar-spacer\" />\n <Skeleton variant=\"text\" width={72} height={36} />\n <Skeleton variant=\"text\" width={92} height={36} />\n </div>\n <div className=\"mr-records-loading__body\">\n <div className=\"mr-records-loading__sidebar\">\n <Skeleton variant=\"text\" width={120} height={20} />\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"mr-records-loading__sidebar-item\">\n <Skeleton variant=\"card\" width={40} height={40} />\n <div className=\"mr-records-loading__sidebar-lines\">\n <Skeleton variant=\"text\" width={90} height={14} />\n <Skeleton variant=\"text\" width={130} height={12} />\n </div>\n </div>\n ))}\n </div>\n <div className=\"mr-records-loading__grid\">\n <Skeleton variant=\"text\" width={100} height={16} />\n <div className=\"mr-records-loading__cards\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"mr-records-loading__card\">\n <div className=\"mr-records-loading__card-head\">\n <Skeleton variant=\"text\" width={120} height={16} />\n <Skeleton variant=\"text\" width={70} height={12} />\n </div>\n <Skeleton variant=\"card\" height={118} />\n <Skeleton variant=\"text\" width=\"60%\" height={16} />\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\ninterface ActiveFiltersBarProps {\n filters: FiltersSlice;\n labelOf: DocumentTypeLabelResolver;\n onRemoveType: () => void;\n onRemoveTags: (tag: string) => void;\n onRemoveDocDate: () => void;\n onRemoveUploadDate: () => void;\n onClearAll: () => void;\n}\n\nfunction ActiveFiltersBar({ filters, labelOf, onRemoveType, onRemoveTags, onRemoveDocDate, onRemoveUploadDate, onClearAll }: ActiveFiltersBarProps) {\n const fmt = (ms: number | null) => ms == null ? '' : new Date(ms).toLocaleDateString(undefined, { day: '2-digit', month: '2-digit', year: 'numeric' });\n\n const chips: { key: string; label: string; onRemove: () => void }[] = [];\n\n if (filters.type) chips.push({ key: 'type', label: labelOf(filters.type), onRemove: onRemoveType });\n if (filters.documentDateFrom != null || filters.documentDateTo != null) {\n const from = fmt(filters.documentDateFrom);\n const to = fmt(filters.documentDateTo);\n const label = from && to ? `Date: ${from} to ${to}` : from ? `Date: from ${from}` : `Date: until ${to}`;\n chips.push({ key: 'docDate', label, onRemove: onRemoveDocDate });\n }\n if (filters.uploadDateFrom != null || filters.uploadDateTo != null) {\n const from = fmt(filters.uploadDateFrom);\n const to = fmt(filters.uploadDateTo);\n const label = from && to ? `Upload: ${from} to ${to}` : from ? `Upload: from ${from}` : `Upload: until ${to}`;\n chips.push({ key: 'upDate', label, onRemove: onRemoveUploadDate });\n }\n filters.tags.forEach((tag) => chips.push({ key: `tag:${tag}`, label: `Tag: ${tag}`, onRemove: () => onRemoveTags(tag) }));\n\n if (chips.length === 0) return null;\n\n return (\n <div className=\"mr-active-filters\">\n {chips.map((chip) => (\n <span key={chip.key} className=\"mr-active-filters__chip\">\n <span className=\"mr-active-filters__chip-label\">{chip.label}</span>\n <button type=\"button\" className=\"mr-active-filters__chip-x\" aria-label={`Remove ${chip.label}`} onClick={chip.onRemove}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden>\n <path d=\"M9 3L3 9M3 3l6 6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </span>\n ))}\n <button type=\"button\" className=\"mr-active-filters__clear\" onClick={onClearAll}>\n Clear all filters\n </button>\n </div>\n );\n}\n\nfunction RecordsErrorState({ onRetry }: { onRetry: () => void | Promise<void> }) {\n return (\n <div className=\"mr-records-view__empty mr-records-view__empty--error\">\n <span className=\"mr-records-view__empty-icon mr-records-view__empty-icon--error\">\n <TriangleAlert size={24} aria-hidden />\n </span>\n <p className=\"mr-records-view__empty-title\">Couldn't load records</p>\n <p className=\"mr-records-view__empty-desc\">\n Something went wrong while loading this patient's records.\n </p>\n <button\n type=\"button\"\n className=\"mr-records-view__retry\"\n onClick={() => void onRetry()}\n >\n <RefreshCcw size={16} aria-hidden />\n Try again\n </button>\n </div>\n );\n}\n","export function FilteredEmptyIcon({ size = 96 }: { size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 96 96\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n >\n {/* Background rounded rect */}\n <rect width=\"96\" height=\"96\" rx=\"22.08\" fill=\"#E8F0FF\" />\n\n {/* Back document */}\n <rect x=\"15.36\" y=\"19.68\" width=\"57.6\" height=\"50.88\" rx=\"4.32\" fill=\"white\"\n style={{ filter: 'drop-shadow(0px 1px 3px rgba(0,0,0,0.10))' }} />\n\n {/* Front document */}\n <rect x=\"24\" y=\"12.48\" width=\"57.6\" height=\"50.88\" rx=\"4.32\" fill=\"white\"\n style={{ filter: 'drop-shadow(0px 1px 3px rgba(0,0,0,0.10))' }} />\n\n {/* Line 1 */}\n <rect x=\"33.6\" y=\"30.72\" width=\"19.2\" height=\"2.4\" rx=\"1.2\" fill=\"#93B8DA\" />\n {/* Line 2 */}\n <rect x=\"33.6\" y=\"36.48\" width=\"28.8\" height=\"2.4\" rx=\"1.2\" fill=\"#BDD1E8\" />\n {/* Line 3 */}\n <rect x=\"33.6\" y=\"42.24\" width=\"24\" height=\"2.4\" rx=\"1.2\" fill=\"#BDD1E8\" />\n {/* Short line */}\n <rect x=\"33.6\" y=\"48\" width=\"16.8\" height=\"2.4\" rx=\"1.2\" fill=\"#DDE9F5\" />\n\n {/* Filter icon circle */}\n <circle cx=\"67.2\" cy=\"66.24\" r=\"12.96\" fill=\"#2563EB\" />\n {/* Filter icon lines */}\n <line x1=\"61\" y1=\"62.5\" x2=\"73\" y2=\"62.5\" stroke=\"white\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <line x1=\"63\" y1=\"66.5\" x2=\"71\" y2=\"66.5\" stroke=\"white\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <line x1=\"65\" y1=\"70.5\" x2=\"69\" y2=\"70.5\" stroke=\"white\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n","export interface SkeletonProps {\n variant: 'card' | 'list-item' | 'text' | 'circle';\n width?: number | string;\n height?: number | string;\n className?: string;\n}\n\nexport function Skeleton({ variant, width, height, className }: SkeletonProps) {\n const classes = ['mr-skeleton', `mr-skeleton--${variant}`, className]\n .filter(Boolean)\n .join(' ');\n return <div className={classes} style={{ width, height }} />;\n}\n","import { useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nexport interface DeleteConfirmModalProps {\n recordLabel: string;\n patientName?: string;\n deleting?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function DeleteConfirmModal({\n recordLabel,\n patientName,\n deleting,\n onConfirm,\n onCancel,\n}: DeleteConfirmModalProps) {\n \n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onCancel();\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [onCancel]);\n\n if (typeof document === 'undefined') return null;\n\n return createPortal(\n <div className=\"mr-delete-modal\" role=\"presentation\" onClick={onCancel}>\n <div\n className=\"mr-delete-modal__dialog\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-label=\"Delete this record?\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"mr-delete-modal__content\">\n <p className=\"mr-delete-modal__title\">Delete this record?</p>\n <p className=\"mr-delete-modal__desc\">\n <strong>{recordLabel}</strong>\n {' will be permanently removed from '}\n {patientName ? <strong>{patientName}’s</strong> : 'these'} records. This\n action cannot be undone.\n </p>\n </div>\n <div className=\"mr-delete-modal__footer\">\n <button\n type=\"button\"\n className=\"mr-delete-modal__cancel\"\n disabled={deleting}\n onClick={onCancel}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"mr-delete-modal__delete\"\n disabled={deleting}\n onClick={onConfirm}\n >\n {deleting ? 'Deleting…' : 'Delete'}\n </button>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n","const KB = 1024;\nconst MB = KB * 1024;\nconst GB = MB * 1024;\n\n/** Format a byte count as a short human-readable size, e.g. `1.4 MB`. */\nexport function formatFileSize(bytes: number): string {\n if (bytes < KB) return `${bytes} B`;\n if (bytes < MB) return `${(bytes / KB).toFixed(1)} KB`;\n if (bytes < GB) return `${(bytes / MB).toFixed(1)} MB`;\n return `${(bytes / GB).toFixed(1)} GB`;\n}\n\n/** Format an epoch (ms) as a locale date string, e.g. `5 Jun 2026`. */\nexport function epochToDisplay(epochMs: number): string {\n return new Date(epochMs).toLocaleDateString(undefined, {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n });\n}\n\n/**\n * Relative time from `epochMs` to `now` (defaults to current time).\n * `now` is injectable so the function stays pure and testable.\n */\nexport function relativeTime(epochMs: number, now: number = Date.now()): string {\n const diff = now - epochMs;\n const sec = Math.round(diff / 1000);\n const min = Math.round(sec / 60);\n const hr = Math.round(min / 60);\n const day = Math.round(hr / 24);\n\n if (sec < 60) return 'just now';\n if (min < 60) return `${min}m ago`;\n if (hr < 24) return `${hr}h ago`;\n if (day < 30) return `${day}d ago`;\n return epochToDisplay(epochMs);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useStore } from 'zustand';\nimport {\n ChevronLeft,\n ChevronRight,\n Filter,\n LayoutGrid,\n List,\n RefreshCcw,\n SquareCheck,\n Upload,\n} from 'lucide-react';\nimport { FilterChip } from '../../components/FilterChip/FilterChip';\nimport { Tooltip } from '../../components/Tooltip/Tooltip';\nimport { FilterPopover } from './FilterPopover';\nimport { relativeTime } from '../../helpers/formatters';\nimport { recordMatchesFilters } from '../../helpers/recordFilter';\nimport { useSdk, useFilteredRecordIds } from '../../connection';\n\nconst ALL = '__all__';\n\nexport type RecordsViewMode = 'grid' | 'list';\n\nexport interface RecordsToolbarProps {\n viewMode: RecordsViewMode;\n onViewModeChange: (mode: RecordsViewMode) => void;\n onUpload?: () => void;\n onRefresh?: () => void | Promise<void>;\n sourceRefreshedAt?: number | null;\n onFilter?: () => void;\n onToggleSelect?: () => void;\n selectionMode?: boolean;\n}\n\nexport function RecordsToolbar({\n viewMode,\n onViewModeChange,\n onUpload,\n onRefresh,\n sourceRefreshedAt,\n onFilter,\n onToggleSelect,\n selectionMode,\n}: RecordsToolbarProps) {\n const { store, labelOf } = useSdk();\n const byId = useStore(store, (s) => s.records.byId);\n const ids = useStore(store, (s) => s.records.ids);\n const filteredIds = useFilteredRecordIds();\n const filters = useStore(store, (s) => s.filters);\n const activeType = filters.type;\n const activeFilterCount = useStore(store, (s) => {\n const f = s.filters;\n const docDate = f.documentDateFrom != null || f.documentDateTo != null ? 1 : 0;\n const upDate = f.uploadDateFrom != null || f.uploadDateTo != null ? 1 : 0;\n return docDate + upDate + f.tags.length;\n });\n\n const scrollRef = useRef<HTMLDivElement>(null);\n const [filterOpen, setFilterOpen] = useState(false);\n const filterRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!filterOpen) return;\n const onDown = (e: MouseEvent) => {\n const t = e.target as Node;\n\n if ((t as Element).closest?.('[data-mr-portal]')) return;\n if (filterRef.current && !filterRef.current.contains(t)) setFilterOpen(false);\n };\n document.addEventListener('mousedown', onDown);\n return () => document.removeEventListener('mousedown', onDown);\n }, [filterOpen]);\n\n const [isRefreshing, setIsRefreshing] = useState(false);\n // Tick every 30s so the \"x ago\" label stays current.\n const [, setNow] = useState(0);\n useEffect(() => {\n const t = setInterval(() => setNow((n) => n + 1), 30_000);\n return () => clearInterval(t);\n }, []);\n\n const handleRefresh = useCallback(async () => {\n if (isRefreshing) return;\n setIsRefreshing(true);\n try {\n await onRefresh?.();\n } finally {\n setIsRefreshing(false);\n }\n }, [isRefreshing, onRefresh]);\n\n // Use the SDK's sourceRefreshedAt — updated after every refreshDocumentSource call.\n const lastSyncedLabel =\n sourceRefreshedAt != null ? relativeTime(sourceRefreshedAt) : null;\n\n const typeChips = useMemo(() => {\n \n const counts = new Map<string, number>();\n for (const id of ids) {\n const r = byId[id];\n if (!r) continue;\n if (!counts.has(r.typeCode)) counts.set(r.typeCode, 0);\n if (recordMatchesFilters(r, filters, { skipType: true })) {\n counts.set(r.typeCode, (counts.get(r.typeCode) ?? 0) + 1);\n }\n }\n return [...counts.entries()].map(([code, count]) => ({\n code,\n label: labelOf(code),\n count,\n }));\n }, [ids, byId, labelOf, filters]);\n\n const selectType = (id: string) => {\n store.getState().filters.setType(id === ALL ? null : id);\n };\n\n const scrollBy = (delta: number) => {\n scrollRef.current?.scrollBy({ left: delta, behavior: 'smooth' });\n };\n\n return (\n <div className=\"mr-records-toolbar\">\n <div className=\"mr-toolbar-filter\" ref={filterRef}>\n <Tooltip content=\"Filter\">\n <button\n type=\"button\"\n className={`mr-toolbar-icon-btn${filterOpen ? ' mr-toolbar-icon-btn--active' : ''}`}\n aria-label=\"Filter\"\n aria-expanded={filterOpen}\n onClick={() => {\n setFilterOpen((o) => !o);\n onFilter?.();\n }}\n >\n <Filter size={16} aria-hidden color=\"var(--mr-primary)\" />\n {activeFilterCount > 0 && (\n <span className=\"mr-toolbar-filter__badge\">{activeFilterCount}</span>\n )}\n </button>\n </Tooltip>\n {filterOpen && <FilterPopover onClose={() => setFilterOpen(false)} />}\n </div>\n\n <div className=\"mr-toolbar-chiprail\">\n <button\n type=\"button\"\n className=\"mr-toolbar-chiprail__chevron\"\n aria-label=\"Scroll filters left\"\n onClick={() => scrollBy(-200)}\n >\n <ChevronLeft size={16} aria-hidden />\n </button>\n\n <div className=\"mr-toolbar-chiprail__scroll\" ref={scrollRef}>\n <FilterChip\n id={ALL}\n label=\"All Records\"\n count={filteredIds?.length}\n active={activeType == null}\n onSelect={selectType}\n />\n {typeChips.map(({ code, label, count }) => (\n <FilterChip\n key={code}\n id={code}\n label={label}\n count={count}\n active={activeType === code}\n onSelect={selectType}\n />\n ))}\n </div>\n\n <span className=\"mr-toolbar-chiprail__fade\" aria-hidden />\n <button\n type=\"button\"\n className=\"mr-toolbar-chiprail__chevron\"\n aria-label=\"Scroll filters right\"\n onClick={() => scrollBy(200)}\n >\n <ChevronRight size={16} aria-hidden />\n </button>\n </div>\n\n <div className=\"mr-toolbar-toggle\" role=\"group\" aria-label=\"View mode\">\n <Tooltip content=\"Grid view\">\n <button\n type=\"button\"\n className={`mr-toolbar-toggle__btn${viewMode === 'grid' ? ' mr-toolbar-toggle__btn--active' : ''}`}\n aria-label=\"Grid view\"\n aria-pressed={viewMode === 'grid'}\n onClick={() => onViewModeChange('grid')}\n >\n <LayoutGrid size={16} aria-hidden />\n </button>\n </Tooltip>\n <Tooltip content=\"List view\">\n <button\n type=\"button\"\n className={`mr-toolbar-toggle__btn${viewMode === 'list' ? ' mr-toolbar-toggle__btn--active' : ''}`}\n aria-label=\"List view\"\n aria-pressed={viewMode === 'list'}\n onClick={() => onViewModeChange('list')}\n >\n <List size={16} aria-hidden />\n </button>\n </Tooltip>\n </div>\n\n <span className=\"mr-toolbar-divider\" aria-hidden />\n\n <Tooltip content=\"Select multiple records to add to context\">\n <button\n type=\"button\"\n className={`mr-toolbar-icon-btn${selectionMode ? ' mr-toolbar-icon-btn--active' : ''}`}\n aria-label=\"Select multiple records to add to context\"\n aria-pressed={selectionMode}\n onClick={onToggleSelect}\n >\n <SquareCheck size={16} aria-hidden color=\"var(--mr-primary)\" />\n </button>\n </Tooltip>\n\n <Tooltip content=\"Refresh\">\n <button\n type=\"button\"\n className=\"mr-toolbar-sync\"\n aria-label=\"Refresh\"\n disabled={isRefreshing}\n onClick={handleRefresh}\n >\n <RefreshCcw\n size={16}\n aria-hidden\n className={isRefreshing ? 'mr-toolbar-sync__icon--spinning' : undefined}\n />\n {lastSyncedLabel && <span className=\"mr-toolbar-sync__label\">{lastSyncedLabel}</span>}\n </button>\n </Tooltip>\n\n {onUpload && (\n <button type=\"button\" className=\"mr-toolbar-upload\" onClick={onUpload}>\n <Upload size={16} aria-hidden />\n Upload\n </button>\n )}\n </div>\n );\n}\n","import { memo } from 'react';\nexport interface FilterChipProps {\n id: string;\n label: string;\n count?: number;\n active: boolean;\n onSelect: (id: string) => void;\n}\n\nexport const FilterChip = memo(function FilterChip({\n id,\n label,\n count,\n active,\n onSelect,\n}: FilterChipProps) {\n return (\n <button\n type=\"button\"\n className={`mr-filter-chip${active ? ' mr-filter-chip--active' : ''}`}\n aria-pressed={active}\n onClick={() => onSelect(id)}\n >\n {count == null ? label : `${label} (${count})`}\n </button>\n );\n});\n","import { useRef, useState, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface TooltipProps {\n content: ReactNode;\n children: ReactNode;\n}\n\nexport function Tooltip({ content, children }: TooltipProps) {\n const triggerRef = useRef<HTMLSpanElement>(null);\n const [coords, setCoords] = useState<{ top: number; left: number } | null>(null);\n\n const show = () => {\n const el = triggerRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n setCoords({ top: r.bottom, left: r.left + r.width / 2 });\n };\n const hide = () => setCoords(null);\n\n return (\n <span\n ref={triggerRef}\n className=\"mr-tooltip\"\n tabIndex={0}\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n >\n {children}\n {coords !== null &&\n typeof document !== 'undefined' &&\n createPortal(\n <span\n className=\"mr-tooltip__bubble\"\n role=\"tooltip\"\n style={{ top: coords.top, left: coords.left }}\n >\n {content}\n </span>,\n document.body,\n )}\n </span>\n );\n}\n","import { useMemo, useState } from 'react';\nimport { useStore } from 'zustand';\nimport { PresetSelect } from '../../components/PresetSelect/PresetSelect';\nimport { MultiSelect } from '../../components/MultiSelect/MultiSelect';\nimport { useSdk, useAllTags } from '../../connection';\n\nexport interface FilterPopoverProps {\n onClose: () => void;\n}\n\ntype DatePreset = 'anytime' | 'last7' | 'last30' | 'last3m' | 'custom';\n\nconst PRESET_OPTIONS: { value: DatePreset; label: string }[] = [\n { value: 'anytime', label: 'Any time' },\n { value: 'last7', label: 'Last 7 days' },\n { value: 'last30', label: 'Last 30 days' },\n { value: 'last3m', label: 'Last 3 months' },\n { value: 'custom', label: 'Custom range' },\n];\n\nconst DAY = 24 * 60 * 60 * 1000;\n\nconst toInput = (ms: number | null): string =>\n ms == null ? '' : new Date(ms).toISOString().slice(0, 10);\n\nconst fromInput = (v: string, endOfDay = false): number | null => {\n if (!v) return null;\n const d = new Date(v + (endOfDay ? 'T23:59:59.999' : 'T00:00:00'));\n return Number.isNaN(d.getTime()) ? null : d.getTime();\n};\n\nfunction resolveRange(\n preset: DatePreset,\n customFrom: string,\n customTo: string,\n): { from: number | null; to: number | null } {\n const now = Date.now();\n switch (preset) {\n case 'last7': return { from: now - 7 * DAY, to: now };\n case 'last30': return { from: now - 30 * DAY, to: now };\n case 'last3m': return { from: now - 90 * DAY, to: now };\n case 'custom': return { from: fromInput(customFrom), to: fromInput(customTo, true) };\n default: return { from: null, to: null };\n }\n}\n\nexport function FilterPopover({ onClose }: FilterPopoverProps) {\n const { store, labelOf } = useSdk();\n const allTags = useAllTags();\n const filters = useStore(store, (s) => s.filters);\n const byId = useStore(store, (s) => s.records.byId);\n const ids = useStore(store, (s) => s.records.ids);\n\n // Derive distinct document type options from loaded records.\n const typeOptions = useMemo(() => {\n const seen = new Set<string>();\n return ids\n .map((id) => byId[id]?.typeCode)\n .filter((code): code is string => !!code && !seen.has(code) && !!seen.add(code))\n .map((code) => ({ value: code, label: labelOf(code) }));\n }, [ids, byId, labelOf]);\n\n // Local state — all edits are pending until \"Apply filters\".\n const [docType, setDocType] = useState<string>(filters.type ?? '');\n const [docPreset, setDocPreset] = useState<DatePreset>(filters.documentDatePreset);\n const [docFrom, setDocFrom] = useState(toInput(filters.documentDateFrom));\n const [docTo, setDocTo] = useState(toInput(filters.documentDateTo));\n const [upPreset, setUpPreset] = useState<DatePreset>(filters.uploadDatePreset);\n const [upFrom, setUpFrom] = useState(toInput(filters.uploadDateFrom));\n const [upTo, setUpTo] = useState(toInput(filters.uploadDateTo));\n const [tags, setTags] = useState<string[]>(filters.tags);\n\n const handleClear = () => {\n setDocType('');\n setDocPreset('anytime');\n setDocFrom('');\n setDocTo('');\n setUpPreset('anytime');\n setUpFrom('');\n setUpTo('');\n setTags([]);\n store.getState().filters.setType(null);\n store.getState().filters.clearPopoverFilters();\n onClose();\n };\n\n const handleApply = () => {\n store.getState().filters.setType(docType || null);\n const doc = resolveRange(docPreset, docFrom, docTo);\n const up = resolveRange(upPreset, upFrom, upTo);\n store.getState().filters.applyPopoverFilters({\n documentDateFrom: doc.from,\n documentDateTo: doc.to,\n uploadDateFrom: up.from,\n uploadDateTo: up.to,\n documentDatePreset: docPreset,\n uploadDatePreset: upPreset,\n tags,\n });\n onClose();\n };\n\n return (\n <div className=\"mr-filter-popover\" role=\"dialog\" aria-label=\"Filters\">\n <p className=\"mr-filter-popover__title\">Filters</p>\n\n <div className=\"mr-filter-popover__body\">\n {typeOptions.length > 0 && (\n <div className=\"mr-filter-popover__group\">\n <p className=\"mr-filter-popover__label\">Document type</p>\n <PresetSelect<string>\n value={docType}\n options={[{ value: '', label: 'All types' }, ...typeOptions]}\n onChange={(v) => setDocType(v)}\n active={!!docType}\n placeholder=\"All types\"\n />\n </div>\n )}\n <PresetDateRange\n label=\"Document date\"\n preset={docPreset}\n from={docFrom}\n to={docTo}\n onPreset={setDocPreset}\n onFrom={setDocFrom}\n onTo={setDocTo}\n />\n <PresetDateRange\n label=\"Upload date\"\n preset={upPreset}\n from={upFrom}\n to={upTo}\n onPreset={setUpPreset}\n onFrom={setUpFrom}\n onTo={setUpTo}\n />\n\n <div className=\"mr-filter-popover__group\">\n <p className=\"mr-filter-popover__label\">Tags</p>\n <MultiSelect\n value={tags}\n options={allTags ?? []}\n onChange={setTags}\n placeholder=\"Search or select tags\"\n />\n </div>\n </div>\n\n <div className=\"mr-filter-popover__cta\">\n <button type=\"button\" className=\"mr-filter-popover__clear\" onClick={handleClear}>\n Clear filters\n </button>\n <button type=\"button\" className=\"mr-filter-popover__apply\" onClick={handleApply}>\n Apply filters\n </button>\n </div>\n </div>\n );\n}\n\nfunction PresetDateRange({\n label,\n preset,\n from,\n to,\n onPreset,\n onFrom,\n onTo,\n}: {\n label: string;\n preset: DatePreset;\n from: string;\n to: string;\n onPreset: (p: DatePreset) => void;\n onFrom: (v: string) => void;\n onTo: (v: string) => void;\n}) {\n return (\n <div className=\"mr-filter-popover__group\">\n <p className=\"mr-filter-popover__label\">{label}</p>\n <PresetSelect\n value={preset}\n options={PRESET_OPTIONS}\n onChange={onPreset}\n active={preset !== 'anytime'}\n />\n {preset === 'custom' && (\n <div className=\"mr-filter-popover__range\">\n <input\n type=\"date\"\n className=\"mr-filter-popover__date\"\n value={from}\n max={to || undefined}\n onChange={(e) => onFrom(e.target.value)}\n />\n <span className=\"mr-filter-popover__to\">to</span>\n <input\n type=\"date\"\n className=\"mr-filter-popover__date\"\n value={to}\n min={from || undefined}\n onChange={(e) => onTo(e.target.value)}\n />\n </div>\n )}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { ChevronsUpDown, Check } from 'lucide-react';\nexport interface PresetSelectOption<T extends string> {\n value: T;\n label: string;\n}\nexport interface PresetSelectProps<T extends string> {\n value: T;\n options: PresetSelectOption<T>[];\n onChange: (value: T) => void;\n active?: boolean;\n placeholder?: string;\n}\n\nconst MENU_MAX_H = 240;\n\nexport function PresetSelect<T extends string>({\n value,\n options,\n onChange,\n active,\n placeholder,\n}: PresetSelectProps<T>) {\n const [menu, setMenu] = useState<{\n left: number;\n width: number;\n top?: number;\n bottom?: number;\n maxH: number;\n } | null>(null);\n const fieldRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLUListElement>(null);\n const open = menu !== null;\n const selected = options.find((o) => o.value === value);\n\n const place = () => {\n const el = fieldRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n const margin = 8;\n const spaceBelow = window.innerHeight - (r.bottom + 4) - margin;\n setMenu({\n left: r.left,\n width: r.width,\n top: r.bottom + 4,\n maxH: Math.min(MENU_MAX_H, spaceBelow),\n });\n };\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n const n = e.target as Node;\n if (fieldRef.current?.contains(n) || menuRef.current?.contains(n)) return;\n setMenu(null);\n };\n const onScroll = (e: Event) => {\n if (menuRef.current && menuRef.current.contains(e.target as Node)) return;\n place();\n };\n const onResize = () => setMenu(null);\n document.addEventListener('mousedown', onDown);\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', onResize);\n return () => {\n document.removeEventListener('mousedown', onDown);\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', onResize);\n };\n }, [open]);\n\n return (\n <div className=\"mr-preset-select\">\n <button\n ref={fieldRef}\n type=\"button\"\n className={`mr-preset-select__field${active ? ' mr-preset-select__field--active' : ''}`}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n onClick={() => (open ? setMenu(null) : place())}\n >\n <span\n className={`mr-preset-select__value${selected ? '' : ' mr-preset-select__value--placeholder'}`}\n >\n {selected?.label ?? placeholder ?? ''}\n </span>\n <ChevronsUpDown size={16} aria-hidden className=\"mr-preset-select__chevron\" />\n </button>\n {open &&\n typeof document !== 'undefined' &&\n createPortal(\n <ul\n ref={menuRef}\n className=\"mr-preset-select__menu\"\n role=\"listbox\"\n data-mr-portal\n style={{\n left: menu.left,\n width: menu.width,\n top: menu.top,\n bottom: menu.bottom,\n maxHeight: menu.maxH,\n }}\n >\n {options.map((o) => (\n <li key={o.value}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={o.value === value}\n className={`mr-preset-select__option${o.value === value ? ' mr-preset-select__option--active' : ''}`}\n onClick={() => {\n onChange(o.value);\n setMenu(null);\n }}\n >\n <span>{o.label}</span>\n {o.value === value && <Check size={14} aria-hidden />}\n </button>\n </li>\n ))}\n </ul>,\n document.body,\n )}\n </div>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { ChevronsUpDown, Check, Plus, X, Search } from 'lucide-react';\n\nexport interface MultiSelectProps {\n value: string[];\n options: string[];\n onChange: (value: string[]) => void;\n placeholder?: string;\n searchPlaceholder?: string;\n allowCreate?: boolean;\n validate?: (raw: string) => boolean;\n max?: number;\n}\n\nexport function MultiSelect({\n value,\n options,\n onChange,\n placeholder = 'Select',\n searchPlaceholder = 'Search…',\n allowCreate = false,\n validate,\n max,\n}: MultiSelectProps) {\n const [query, setQuery] = useState('');\n const [menu, setMenu] = useState<{\n left: number;\n width: number;\n top?: number;\n bottom?: number;\n maxH: number;\n } | null>(null);\n const fieldRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const open = menu !== null;\n\n const MENU_MAX_H = 260;\n\n const place = () => {\n const el = fieldRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n const margin = 8;\n const spaceBelow = window.innerHeight - (r.bottom + 4) - margin;\n setMenu({\n left: r.left,\n width: r.width,\n top: r.bottom + 4,\n maxH: Math.min(MENU_MAX_H, spaceBelow),\n });\n };\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n const n = e.target as Node;\n if (fieldRef.current?.contains(n) || menuRef.current?.contains(n)) return;\n setMenu(null);\n };\n\n const onScroll = (e: Event) => {\n if (menuRef.current && menuRef.current.contains(e.target as Node)) return;\n place();\n };\n const onResize = () => setMenu(null);\n document.addEventListener('mousedown', onDown);\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', onResize);\n return () => {\n document.removeEventListener('mousedown', onDown);\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', onResize);\n };\n }, [open]);\n\n useEffect(() => {\n if (!open) setQuery('');\n }, [open]);\n\n const atMax = max != null && value.length >= max;\n\n const toggle = (v: string) => {\n if (value.includes(v)) onChange(value.filter((x) => x !== v));\n else if (!atMax) onChange([...value, v]);\n };\n\n const q = query.trim();\n const filtered = useMemo(() => {\n const ql = q.toLowerCase();\n return ql ? options.filter((o) => o.toLowerCase().includes(ql)) : options;\n }, [options, q]);\n\n const canCreate =\n allowCreate &&\n q.length > 0 &&\n !options.some((o) => o.toLowerCase() === q.toLowerCase()) &&\n !value.some((v) => v.toLowerCase() === q.toLowerCase()) &&\n (!validate || validate(q)) &&\n !atMax;\n\n const create = () => {\n onChange([...value, q]);\n setQuery('');\n };\n\n return (\n <div className=\"mr-multi-select\">\n <button\n ref={fieldRef}\n type=\"button\"\n className={`mr-multi-select__field${value.length ? ' mr-multi-select__field--active' : ''}`}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n onClick={() => (open ? setMenu(null) : place())}\n >\n <Search size={14} aria-hidden className=\"mr-multi-select__field-search-icon\" />\n <span\n className={`mr-multi-select__value${value.length ? '' : ' mr-multi-select__value--placeholder'}`}\n >\n {value.length === 0\n ? placeholder\n : `${value.length} ${value.length === 1 ? 'tag' : 'tags'} selected`}\n </span>\n <ChevronsUpDown size={16} aria-hidden className=\"mr-multi-select__chevron\" />\n </button>\n\n {value.length > 0 && (\n <div className=\"mr-multi-select__selected\">\n {value.map((v) => (\n <span key={v} className=\"mr-multi-select__chip\">\n <span className=\"mr-multi-select__chip-label\">{v}</span>\n <button\n type=\"button\"\n aria-label={`Remove ${v}`}\n className=\"mr-multi-select__chip-x\"\n onClick={() => onChange(value.filter((x) => x !== v))}\n >\n <X size={11} aria-hidden />\n </button>\n </span>\n ))}\n </div>\n )}\n\n {open &&\n typeof document !== 'undefined' &&\n createPortal(\n <div\n ref={menuRef}\n className=\"mr-multi-select__menu\"\n role=\"listbox\"\n aria-multiselectable\n data-mr-portal\n style={{\n left: menu.left,\n width: menu.width,\n top: menu.top,\n bottom: menu.bottom,\n maxHeight: menu.maxH,\n }}\n >\n <div className=\"mr-multi-select__search\">\n <input\n type=\"text\"\n className=\"mr-multi-select__search-input\"\n placeholder={searchPlaceholder}\n value={query}\n autoFocus\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && canCreate) {\n e.preventDefault();\n create();\n }\n }}\n />\n </div>\n <ul className=\"mr-multi-select__options\">\n {filtered.map((o) => {\n const selected = value.includes(o);\n return (\n <li key={o}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n className={`mr-multi-select__option${selected ? ' mr-multi-select__option--active' : ''}`}\n disabled={!selected && atMax}\n onClick={() => toggle(o)}\n >\n <span className=\"mr-multi-select__option-label\">{o}</span>\n {selected && <Check size={14} aria-hidden />}\n </button>\n </li>\n );\n })}\n {canCreate && (\n <li>\n <button\n type=\"button\"\n className=\"mr-multi-select__option mr-multi-select__create\"\n onClick={create}\n >\n <Plus size={14} aria-hidden />\n Add “{q}”\n </button>\n </li>\n )}\n {filtered.length === 0 && !canCreate && (\n <li className=\"mr-multi-select__empty text-center\">No data</li>\n )}\n </ul>\n </div>,\n document.body\n )}\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useSdk } from './useSdk';\nimport { getCore } from './workerClient';\nimport { documentItemToUi } from '../helpers/mappings';\nimport type { EditRecordRequest } from '../workers/shared';\n\nexport interface RecordsConnectionActions {\n refresh: () => Promise<void>;\n /** Unix epoch ms of the last successful server refresh, or null before first call. */\n sourceRefreshedAt: number | null;\n editRecord: (documentId: string, data: EditRecordRequest) => Promise<void>;\n deleteRecord: (documentId: string) => Promise<void>;\n}\n\nconst LIMIT = 100;\n\nexport function useRecordsConnection(): RecordsConnectionActions {\n const { bid, patientId, store, labelOf } = useSdk();\n const [sourceRefreshedAt, setSourceRefreshedAt] = useState<number | null>(\n () => getCore().sourceRefreshedAt,\n );\n // Guards the mount load so it fires once per patient — immune to StrictMode's\n // double-invoke and to re-renders that re-create `load`.\n const loadedKeyRef = useRef<string | null>(null);\n\n const applyItems = useCallback(\n (items: Parameters<typeof documentItemToUi>[0][]) => {\n store.getState().records.setAll(items.map((d) => documentItemToUi(d, labelOf)));\n },\n [store, labelOf],\n );\n\n const load = useCallback(async () => {\n const records = store.getState().records;\n records.setStatus('loading');\n try {\n const fresh = await getCore().listDocuments({\n bid,\n patientId,\n limit: LIMIT,\n preferenceType: 'HTML',\n onStale: (cached) => {\n applyItems(cached);\n store.getState().records.setStatus('stale');\n },\n });\n applyItems(fresh);\n records.setStatus('fresh');\n } catch (e) {\n records.setError(e instanceof Error ? e.message : 'Failed to load records');\n }\n }, [bid, patientId, store, applyItems]);\n\n // Load once per patient (not per render / StrictMode double-invoke).\n useEffect(() => {\n const key = `${bid}::${patientId}`;\n if (loadedKeyRef.current === key) return;\n loadedKeyRef.current = key;\n void load();\n }, [bid, patientId, load]);\n\n // The document-type labels arrive asynchronously from the host config — after\n // records may already be mapped with the fallback labels. Re-map the local\n // records when the resolver changes so titles/types pick up the display names.\n useEffect(() => {\n if (loadedKeyRef.current !== `${bid}::${patientId}`) return;\n void getCore()\n .listLocalDocuments({ bid, patientId, limit: LIMIT })\n .then(applyItems);\n }, [bid, patientId, labelOf, applyItems]);\n\n // Stay live: re-read local DB whenever records change (local mutation or sync).\n useEffect(() => {\n const unsubscribe = getCore().subscribe('records:changed', () => {\n void getCore()\n .listLocalDocuments({ bid, patientId, limit: LIMIT })\n .then(applyItems);\n });\n return unsubscribe;\n }, [bid, patientId, applyItems]);\n\n const editRecord = useCallback(\n async (documentId: string, data: EditRecordRequest) => {\n await getCore().editRecord({ documentId, data, bid, patientId });\n },\n [bid, patientId],\n );\n\n const deleteRecord = useCallback(\n async (documentId: string) => {\n const records = store.getState().records;\n records.markPending(documentId);\n try {\n await getCore().deleteRecord({ documentId, bid, patientId });\n records.remove(documentId);\n } catch (e) {\n records.unmarkPending(documentId);\n throw e;\n }\n },\n [bid, patientId, store],\n );\n\n const refresh = useCallback(async () => {\n store.getState().records.setStatus('loading');\n try {\n\n const fresh = await getCore().refreshDocumentSource({ bid, patientId, preferenceType: 'HTML' });\n if (fresh.length > 0) applyItems(fresh);\n setSourceRefreshedAt(getCore().sourceRefreshedAt);\n store.getState().records.setStatus('fresh');\n } catch (e) {\n store.getState().records.setError(e instanceof Error ? e.message : 'Failed to refresh');\n }\n }, [bid, patientId, store, applyItems]);\n\n return { refresh, sourceRefreshedAt, editRecord, deleteRecord };\n}\n","import type { CaseItem, DocumentItem } from '../workers/shared/coreTypes';\nimport type { DocumentTypeLabelResolver } from './documentTypeLabels';\nimport { createDocumentTypeLabelResolver } from './documentTypeLabels';\n\nconst defaultLabelOf = createDocumentTypeLabelResolver();\n\nexport interface RecordItemProps {\n record: RecordItem;\n selected: boolean;\n selectionMode?: boolean;\n thumbnailUrl?: string | null;\n inContext?: boolean;\n attachDisabled?: boolean;\n selectDisabled?: boolean;\n isUploading?: boolean;\n isUploadFailed?: boolean;\n isAnalysing?: boolean;\n isSmart?: boolean;\n dateDisplay: string;\n onSelect: (id: string) => void;\n onOpen: (id: string) => void;\n onDelete: (id: string) => void;\n onAddToContext: (id: string) => void;\n onCopyNotes: (id: string, anchor?: { x: number; y: number }) => void;\n}\n\nexport interface RecordItem {\n id: string;\n patientId: string;\n title: string;\n typeCode: string;\n type: string;\n thumbnailUrl: string | null;\n createdAtEpoch: number;\n updatedAtEpoch: number;\n tags: string[];\n cases: string[];\n syncState: 'uploading' | 'upload_success' | 'upload_failure' | null;\n fileType: string | null;\n isSmart: boolean;\n isAnalysing: boolean;\n}\nexport interface UploadQueueItem {\n id: string; // local upload ID (not documentId)\n fileName: string;\n mimeType: string;\n sizeBytes: number;\n progress: number; // 0–100\n status: 'pending' | 'uploading' | 'completed' | 'upload_failure';\n documentId?: string;\n}\nexport interface CaseUiItem {\n id: string;\n name: string;\n typeCode: string;\n createdAtEpoch: number; \n updatedAtEpoch: number; \n occurredAtEpoch: number | null; \n}\n\nconst toMs = (epochSeconds?: number): number =>\n epochSeconds ? epochSeconds * 1000 : 0;\n\nexport function documentItemToUi(\n doc: DocumentItem,\n labelOf: DocumentTypeLabelResolver = defaultLabelOf,\n): RecordItem {\n const meta = doc.metadata ?? {};\n const typeCode = doc.document_type ?? doc.file_type ?? '';\n const created = toMs(meta.document_date ?? doc.upload_date);\n const typeLabel = labelOf(typeCode) || 'Untitled';\n return {\n id: doc.document_id,\n patientId: doc.patient_id,\n title: typeLabel,\n typeCode,\n type: typeLabel,\n thumbnailUrl: meta.thumbnail ?? null,\n createdAtEpoch: created,\n updatedAtEpoch: toMs(doc.upload_date) || created,\n tags: meta.tags ?? [],\n cases: doc.cases ?? [],\n syncState: doc.sync_state ?? null,\n fileType: doc.file_type ?? null,\n isSmart: doc.is_smart ?? false,\n isAnalysing: doc.is_analyzing ?? false,\n };\n}\n\nexport function caseItemToUi(raw: CaseItem): CaseUiItem {\n const item = raw.item ?? {};\n const created = toMs(item.created_at);\n return {\n id: raw.id,\n name: item.display_name ?? 'Untitled case',\n typeCode: item.type ?? '',\n createdAtEpoch: created,\n updatedAtEpoch: toMs(raw.updated_at) || created,\n occurredAtEpoch: item.occurred_at ? toMs(item.occurred_at) : null,\n };\n}\n\nexport function fileToQueueItem(localId: string, file: File): UploadQueueItem {\n return {\n id: localId,\n fileName: file.name,\n mimeType: file.type,\n sizeBytes: file.size,\n progress: 0,\n status: 'pending',\n };\n}\n","import { useEffect } from 'react';\nimport { useStore } from 'zustand';\nimport { useSdk } from './useSdk';\nimport { getCore } from './workerClient';\nimport type { RecordDetail } from '../stores/slices/detailsSlice';\n\nconst EMPTY: RecordDetail = { status: 'idle', isSmart: false, smartText: '' };\n\n/**\n * Format the verified smart-report fields as `name: value` lines. The SDK types\n * each field as an open record, so we probe common name/value key shapes and\n * fall back to a compact JSON rendering.\n */\nfunction formatVerifiedFields(verified: Array<Record<string, unknown>>): string {\n const pick = (o: Record<string, unknown>, keys: string[]): string | null => {\n for (const k of keys) {\n const v = o[k];\n if (typeof v === 'string' && v.trim()) return v.trim();\n if (typeof v === 'number') return String(v);\n }\n return null;\n };\n return verified\n .map((f) => {\n const name = pick(f, ['name', 'label', 'parameter', 'key', 'title']);\n const value = pick(f, ['value', 'result', 'val', 'reading']);\n const unit = pick(f, ['unit', 'units']);\n if (name && value) return `${name}: ${value}${unit ? ` ${unit}` : ''}`;\n if (name) return name;\n // Unknown shape — render whatever primitive values it holds.\n const vals = Object.values(f).filter(\n (v) => typeof v === 'string' || typeof v === 'number',\n );\n return vals.length ? vals.join(': ') : '';\n })\n .filter(Boolean)\n .join('\\n');\n}\n\n/**\n * Lazily resolve a record's smart detail (is it a Smart report, and its verified\n * fields as copy-ready text). Fires `getSmartReport` only when `enabled` — the\n * card container passes its on-screen visibility so we never fan out a\n * describe/smart-report call across the whole dataset.\n *\n * Result is cached in the store, so re-entering the viewport is free.\n */\nexport function useRecordDetail(id: string, enabled: boolean): RecordDetail {\n const { bid, patientId, store } = useSdk();\n const detail = useStore(store, (s) => s.details.byId[id]) ?? EMPTY;\n\n useEffect(() => {\n if (!enabled) return;\n // Resolve once per record — skip if already loading or loaded.\n const current = store.getState().details.byId[id];\n if (current && current.status !== 'idle' && current.status !== 'error') return;\n\n let cancelled = false;\n store.getState().details.setDetailLoading(id);\n\n (async () => {\n try {\n const report = await getCore().getSmartReport({ documentId: id, bid, patientId });\n if (cancelled) return;\n const isSmart = report != null;\n const smartText = isSmart\n ? formatVerifiedFields((report.verified ?? []) as unknown as Array<Record<string, unknown>>)\n : '';\n store.getState().details.setDetail(id, { isSmart, smartText });\n } catch {\n if (!cancelled) store.getState().details.setDetailError(id);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [id, enabled, bid, patientId, store]);\n\n return detail;\n}\n","import { useEffect, useState } from 'react';\nimport { useStore } from 'zustand';\nimport { useSdk } from './useSdk';\nimport { getCore } from './workerClient';\n\nexport function useAllRecordTags(): string[] {\n const { bid, patientId, store } = useSdk();\n const [sdkTags, setSdkTags] = useState<string[] | null>(null);\n // fallback source: tags on the records currently loaded in the store.\n const byId = useStore(store, (s) => s.records.byId);\n\n useEffect(() => {\n let cancelled = false;\n const load = () => {\n const core = getCore();\n if (typeof core.getAllTags !== 'function') {\n setSdkTags(null); // method missing → use the store fallback\n return;\n }\n void core\n .getAllTags({ bid, patientId })\n .then((t) => {\n if (!cancelled) setSdkTags(t);\n })\n .catch(() => {\n if (!cancelled) setSdkTags(null);\n });\n };\n load();\n const unsubscribe = getCore().subscribe('records:changed', load);\n return () => {\n cancelled = true;\n unsubscribe();\n };\n }, [bid, patientId]);\n\n if (sdkTags) return sdkTags;\n // Fallback — distinct, sorted tags from the loaded records.\n const set = new Set<string>();\n for (const id in byId) for (const t of byId[id].tags) set.add(t);\n return [...set].sort((a, b) => a.localeCompare(b));\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { useSdk } from './useSdk';\nimport { getCore } from './workerClient';\nimport { parseVitals, type Vital } from '../helpers/smartReport';\n\nexport type PreviewFileKind = 'pdf' | 'image' | 'text';\nexport interface PreviewFile {\n url: string;\n kind: PreviewFileKind;\n}\n\n/**\n * The SDK's `file_type` is inconsistent — sometimes the typed union ('PDF'|'IMG'\n * |'HTML'), sometimes a MIME string ('application/pdf', 'image/png') when served\n * from the blob cache. Normalise both into a viewer kind.\n */\nfunction classifyFile(rawType: string | undefined): PreviewFileKind {\n const t = (rawType ?? '').toLowerCase();\n if (t.includes('pdf')) return 'pdf';\n if (t.includes('image') || t === 'img' || /(png|jpe?g|gif|webp|heic)/.test(t)) return 'image';\n return 'text';\n}\n\nexport interface RecordPreviewData {\n status: 'loading' | 'loaded' | 'error';\n files: PreviewFile[];\n vitals: Vital[];\n hasSmartReport: boolean;\n}\n\nconst EMPTY: RecordPreviewData = {\n status: 'loading',\n files: [],\n vitals: [],\n hasSmartReport: false,\n};\n\n/**\n * Fetch the full detail of the open record — the file attachments (signed URLs)\n * for the document viewer and the smart report parsed into vitals. Runs only\n * for the single record being previewed (not every card).\n */\nexport function useRecordPreview(documentId: string | null): RecordPreviewData {\n const { bid, patientId } = useSdk();\n const [data, setData] = useState<RecordPreviewData>(EMPTY);\n const inflightRef = useRef<string | null>(null);\n\n useEffect(() => {\n if (!documentId) {\n setData(EMPTY);\n return;\n }\n\n if (inflightRef.current === documentId) return;\n inflightRef.current = documentId;\n\n let cancelled = false;\n setData(EMPTY);\n\n (async () => {\n try {\n const res = await getCore().describeDocument({ documentId, bid, patientId, preferenceType: 'HTML' });\n if (cancelled) return;\n const files: PreviewFile[] = (res.files ?? [])\n .filter((f) => f.asset_url)\n .map((f) => ({ url: f.asset_url, kind: classifyFile(f.file_type) }));\n const vitals = res.smart_report ? parseVitals(res.smart_report as unknown as Parameters<typeof parseVitals>[0]) : [];\n setData({\n status: 'loaded',\n files,\n vitals,\n hasSmartReport: res.smart_report != null,\n });\n } catch {\n if (!cancelled) setData({ status: 'error', files: [], vitals: [], hasSmartReport: false });\n }\n })();\n\n return () => {\n cancelled = true;\n inflightRef.current = null;\n };\n }, [documentId, bid, patientId]);\n\n return data;\n}\n","export type VitalStatus = 'high' | 'low' | 'normal' | 'unknown';\n\nexport interface VitalHistoryPoint {\n value: string;\n label: string; \n}\nexport interface Vital {\n id: string;\n name: string;\n value: string;\n unit: string;\n refRange: string;\n status: VitalStatus;\n history: VitalHistoryPoint[];\n}\n\ntype RawField = Record<string, unknown>;\n\nconst str = (o: RawField, keys: string[]): string => {\n for (const k of keys) {\n const v = o[k];\n if (typeof v === 'string' && v.trim()) return v.trim();\n if (typeof v === 'number') return String(v);\n }\n return '';\n};\n\nconst normalizeStatus = (raw: string): VitalStatus => {\n const s = raw.toLowerCase();\n if (s.includes('high') || s === 'h' || s.includes('above') || s === 'abnormal_high') return 'high';\n if (s.includes('low') || s === 'l' || s.includes('below') || s === 'abnormal_low') return 'low';\n if (s.includes('normal') || s.includes('in range') || s === 'n' || s === 'ok') return 'normal';\n return 'unknown';\n};\n\n/**\n * Derive a status by comparing the numeric value against the reference range\n * when the report didn't give an explicit status. Handles \"min-max\",\n * \"min – max\", \"< x\" / \"<= x\", \"> x\" / \">= x\", and \"up to x\".\n */\nconst deriveStatusFromRange = (value: string, refRange: string): VitalStatus => {\n const num = parseFloat(value.replace(/,/g, ''));\n if (Number.isNaN(num) || !refRange) return 'unknown';\n const r = refRange.toLowerCase().replace(/,/g, '');\n\n // \"min - max\" (en-dash, hyphen, or \"to\")\n const between = r.match(/(-?\\d+\\.?\\d*)\\s*(?:-|–|to)\\s*(-?\\d+\\.?\\d*)/);\n if (between) {\n const lo = parseFloat(between[1]);\n const hi = parseFloat(between[2]);\n if (num < lo) return 'low';\n if (num > hi) return 'high';\n return 'normal';\n }\n // \"<= x\" / \"< x\" / \"up to x\" → only an upper bound\n const upper = r.match(/(?:<=?|up to|below)\\s*(-?\\d+\\.?\\d*)/);\n if (upper) return num > parseFloat(upper[1]) ? 'high' : 'normal';\n // \">= x\" / \"> x\" → only a lower bound\n const lower = r.match(/(?:>=?|above)\\s*(-?\\d+\\.?\\d*)/);\n if (lower) return num < parseFloat(lower[1]) ? 'low' : 'normal';\n\n return 'unknown';\n};\n\nfunction parseHistory(field: RawField): VitalHistoryPoint[] {\n const raw = field.history ?? field.previous ?? field.trend ?? field.historical;\n if (!Array.isArray(raw)) return [];\n return raw\n .map((p): VitalHistoryPoint | null => {\n if (p == null || typeof p !== 'object') return null;\n const o = p as RawField;\n const value = str(o, ['value', 'result', 'val', 'reading']);\n const label = str(o, ['date', 'label', 'when', 'at']);\n if (!value) return null;\n return { value, label: label || '' };\n })\n .filter((p): p is VitalHistoryPoint => p !== null);\n}\n\nexport function parseVitals(report: {\n verified?: RawField[];\n unverified?: RawField[];\n}): Vital[] {\n const fields = [...(report.verified ?? []), ...(report.unverified ?? [])];\n return fields\n .map((field, i): Vital | null => {\n const name = str(field, ['name', 'label', 'parameter', 'key', 'title', 'test']);\n const value = str(field, ['value', 'result', 'val', 'reading']);\n if (!name && !value) return null;\n const refRange = str(field, ['range', 'ref_range', 'reference', 'refRange', 'normal_range']);\n // Prefer an explicit status; otherwise compute it from value vs. range.\n let status = normalizeStatus(str(field, ['status', 'flag', 'interpretation', 'severity']));\n if (status === 'unknown') status = deriveStatusFromRange(value, refRange);\n return {\n id: str(field, ['id', 'code']) || `${name || 'vital'}-${i}`,\n name: name || 'Unknown',\n value,\n unit: str(field, ['unit', 'units']),\n refRange,\n status,\n history: parseHistory(field),\n };\n })\n .filter((v): v is Vital => v !== null);\n}\n\nexport const isOutOfRange = (v: Vital): boolean => v.status === 'high' || v.status === 'low';\n\nexport function vitalsNoteHeading(opts?: { reportName?: string; date?: string }): string {\n return `**Vitals / Lab parameters — ${opts?.reportName ?? 'Report'}${\n opts?.date ? ` (${opts.date})` : ''\n }:**`;\n}\n\nexport function vitalsToNoteText(\n vitals: Vital[],\n opts?: { reportName?: string; date?: string },\n): string {\n const lines = vitals.map((v) => {\n const val = [v.value, v.unit].filter(Boolean).join(' ');\n return val ? `${v.name}: ${val}` : v.name;\n });\n return [vitalsNoteHeading(opts), ...lines].join('\\n');\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport { useSdk } from './useSdk';\nimport { getCore } from './workerClient';\nimport { caseItemToUi } from '../helpers/mappings';\nimport type { CreateCaseRequest, UpdateCaseRequest } from '../workers/shared';\nexport interface CasesConnectionActions {\n refresh: () => Promise<void>;\n createCase: (data: Omit<CreateCaseRequest, 'id'> & { id?: string }) => Promise<string>;\n updateCase: (caseId: string, data: UpdateCaseRequest) => Promise<void>;\n deleteCase: (caseId: string) => Promise<void>;\n}\n\n/**\n * Loads cases for the current patient — but only when `enabled` (the Care\n * Context tab is active), so the Date tab never triggers a cases fetch. Loads\n * once per patient (cache-then-network via onStale); a `cases:changed`\n * subscription keeps the store live while enabled.\n */\nexport function useCasesConnection(enabled = true): CasesConnectionActions {\n const { bid, patientId, store } = useSdk();\n // Load cases at most once per patient, only after the tab is first enabled.\n const loadedKeyRef = useRef<string | null>(null);\n\n const applyItems = useCallback(\n (items: Parameters<typeof caseItemToUi>[0][]) => {\n store.getState().cases.setAll(items.map(caseItemToUi));\n },\n [store],\n );\n\n const load = useCallback(async () => {\n const cases = store.getState().cases;\n cases.setStatus('loading');\n try {\n const fresh = await getCore().listCases({\n bid,\n patientId,\n onStale: (cached) => {\n applyItems(cached);\n store.getState().cases.setStatus('stale');\n },\n });\n applyItems(fresh);\n cases.setStatus('fresh');\n } catch (e) {\n cases.setError(e instanceof Error ? e.message : 'Failed to load cases');\n }\n }, [bid, patientId, store, applyItems]);\n\n // Load once per patient — only when enabled (Care Context tab active).\n useEffect(() => {\n if (!enabled) return;\n const key = `${bid}::${patientId}`;\n if (loadedKeyRef.current === key) return;\n loadedKeyRef.current = key;\n void load();\n }, [enabled, bid, patientId, load]);\n\n // Subscribe to cases changes only while enabled.\n useEffect(() => {\n if (!enabled) return;\n const unsubscribe = getCore().subscribe('cases:changed', () => {\n void getCore().listLocalCases({ bid, patientId }).then(applyItems);\n });\n return unsubscribe;\n }, [enabled, bid, patientId, applyItems]);\n\n const createCase = useCallback(\n async (data: Omit<CreateCaseRequest, 'id'> & { id?: string }) => {\n const id = data.id ?? crypto.randomUUID();\n const res = await getCore().createCase({ data: { ...data, id }, bid, patientId });\n // The 'cases:changed' subscription refreshes the store.\n return res.id;\n },\n [bid, patientId],\n );\n\n const updateCase = useCallback(\n async (caseId: string, data: UpdateCaseRequest) => {\n await getCore().updateCase({ caseId, data, bid, patientId });\n },\n [bid, patientId],\n );\n\n const deleteCase = useCallback(\n async (caseId: string) => {\n await getCore().deleteCase({ caseId, bid, patientId });\n store.getState().cases.remove(caseId);\n },\n [bid, patientId, store],\n );\n\n return { refresh: load, createCase, updateCase, deleteCase };\n}\n","import { useCallback, useRef } from 'react';\nimport { useSdk } from './useSdk';\nimport { getCore } from './workerClient';\nimport { fileToQueueItem } from '../helpers/mappings';\nimport type { BatchRequest, FileContentType } from '../workers/shared';\n\nexport interface UploadFileInput {\n file: File;\n documentType: string;\n documentDateMs: number;\n caseIds?: string[];\n tags?: string[];\n}\nexport interface UploadConnectionActions {\n upload: (items: UploadFileInput[]) => Promise<void>;\n}\n\nfunction resolveContentType(file: File): FileContentType {\n const t = file.type.toLowerCase();\n if (t === 'image/jpeg' || t === 'image/jpg' || t === 'image/png' || t === 'application/pdf') {\n return t as FileContentType;\n }\n const ext = file.name.split('.').pop()?.toLowerCase();\n if (ext === 'pdf') return 'application/pdf';\n if (ext === 'png') return 'image/png';\n if (ext === 'jpg' || ext === 'jpeg') return 'image/jpeg';\n // Unknown — default to PDF (the most permissive 25 MB limit); the server\n // still validates the actual bytes.\n return 'application/pdf';\n}\n\nexport function useUploadConnection(): UploadConnectionActions {\n const { bid, patientId, store } = useSdk();\n const seq = useRef(0);\n\n const upload = useCallback(\n async (items: UploadFileInput[]) => {\n if (items.length === 0) return;\n\n const localIds = items.map(({ file }) => {\n const id = `upload-${(seq.current += 1)}-${file.name}`;\n store.getState().uploadQueue.add(fileToQueueItem(id, file));\n return id;\n });\n\n // One batch item per file — each its own document with its own metadata.\n const batchRequests: BatchRequest[] = items.map((it) => ({\n dt: it.documentType,\n dd_e: Math.floor(it.documentDateMs / 1000), // epoch seconds\n ...(it.tags && it.tags.length ? { tg: it.tags } : {}),\n ...(it.caseIds && it.caseIds.length ? { cases: it.caseIds } : {}),\n files: [\n {\n contentType: resolveContentType(it.file),\n file_size: it.file.size,\n },\n ],\n }));\n\n localIds.forEach((id) => store.getState().uploadQueue.updateProgress(id, 0));\n\n try {\n const res = await getCore().addRecord({\n batchRequests,\n files: items.map((it) => [it.file]),\n filenames: items.map((it) => [it.file.name]),\n bid,\n patientId,\n });\n const queue = store.getState().uploadQueue;\n\n // SDK returns queued_offline when there's no internet — batch_response is\n // empty. The SDK will sync when connectivity returns and fire records:changed\n // with the real sync_state. Throw so the modal shows an error, not a success toast.\n if (res.message === 'queued_offline' || !res.batch_response?.length) {\n throw new Error('No internet connection. Your upload will retry automatically when you\\'re back online.');\n }\n\n localIds.forEach((id, i) => {\n const documentId = res.batch_response?.[i]?.document_id ?? '';\n const errorDetails = res.batch_response?.[i]?.error_details;\n if (errorDetails) {\n queue.markFailed(id);\n } else {\n console.log('[MR:upload] status → completed', { localId: id, documentId });\n queue.markCompleted(id, documentId);\n }\n });\n } catch (e) {\n const queue = store.getState().uploadQueue;\n localIds.forEach((id) => {\n queue.markFailed(id);\n });\n throw e;\n }\n },\n [bid, patientId, store],\n );\n\n return { upload };\n}\n","import { useCallback } from 'react';\nimport { teardownWorkerClient } from './workerClient';\n\n/**\n * Tear down UI SDK state: drop the Core SDK client reference. The active patient\n * store is owned by SdkProvider and disposed on unmount, so there's nothing else\n * to clear here. (The Core SDK holds no persistent worker to shut down — auth\n * lives in the host app.)\n */\nexport function useLogout(): () => void {\n return useCallback(() => {\n teardownWorkerClient();\n }, []);\n}\n","import { useMemo } from 'react';\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/react/shallow';\nimport type { PatientStore } from '../createPatientStore';\nimport type { RecordItem } from '../../helpers/mappings';\nimport type { RecordsStatus } from '../slices/recordsSlice';\n\n/**\n * Selectors take the patient store explicitly. Layer 3 will wrap these with a\n * `useSdk()`-backed variant once `SdkProvider` exists; keeping them store-first\n * means Layer 4 has no dependency on the connection layer.\n *\n * Each hook subscribes to the smallest slice possible so a change to one record\n * re-renders only the row that reads it.\n */\n\nexport function useRecordById(store: PatientStore, id: string): RecordItem | undefined {\n return useStore(store, (s) => s.records.byId[id]);\n}\n\nexport function useRecordIdRange(store: PatientStore, start: number, end: number): string[] {\n return useStore(store, useShallow((s) => s.records.ids.slice(start, end)));\n}\n\nexport function useRecordsCount(store: PatientStore): number {\n return useStore(store, (s) => s.records.ids.length);\n}\n\nexport function useRecordsStatus(store: PatientStore): RecordsStatus {\n return useStore(store, (s) => s.records.status);\n}\n\nexport function useThumbnailUrl(store: PatientStore, id: string): string | null {\n return useStore(store, (s) => s.records.byId[id]?.thumbnailUrl ?? null);\n}\n\nexport function useIsSelected(store: PatientStore, id: string): boolean {\n return useStore(store, (s) => s.selection.recordIds.has(id));\n}\n\nexport function useAllTags(store: PatientStore): string[] {\n const byId = useStore(store, (s) => s.records.byId);\n return useMemo(() => {\n const set = new Set<string>();\n for (const id in byId) {\n for (const t of byId[id].tags) set.add(t);\n }\n return [...set].sort((a, b) => a.localeCompare(b));\n }, [byId]);\n}\n","import { useStore } from 'zustand';\nimport { useShallow } from 'zustand/react/shallow';\nimport type { PatientStore } from '../createPatientStore';\nimport type { CaseUiItem } from '../../helpers/mappings';\nimport type { RecordsStatus } from '../slices/recordsSlice';\n\nexport function useCaseById(store: PatientStore, id: string): CaseUiItem | undefined {\n return useStore(store, (s) => s.cases.byId[id]);\n}\n\nexport function useCaseIds(store: PatientStore): string[] {\n return useStore(store, useShallow((s) => s.cases.ids));\n}\n\nexport function useCasesStatus(store: PatientStore): RecordsStatus {\n return useStore(store, (s) => s.cases.status);\n}\n","import { useMemo } from 'react';\nimport { useStore } from 'zustand';\nimport type { PatientStore } from '../createPatientStore';\nimport { recordMatchesFilters } from '../../helpers/recordFilter';\n\n/**\n * Sorted + filtered record IDs. Recomputes only when records or filters change.\n * For full-text search across many fields, push to the Core SDK worker instead.\n */\nexport function useFilteredRecordIds(store: PatientStore): string[] {\n const ids = useStore(store, (s) => s.records.ids);\n const byId = useStore(store, (s) => s.records.byId);\n const filters = useStore(store, (s) => s.filters);\n\n return useMemo(() => {\n const filtered = ids.filter((id) => {\n const r = byId[id];\n return r ? recordMatchesFilters(r, filters) : false;\n });\n\n const dir = filters.sortDir === 'asc' ? 1 : -1;\n const sorted = [...filtered].sort((a, b) => {\n const ra = byId[a];\n const rb = byId[b];\n if (filters.sortBy === 'name') return dir * ra.title.localeCompare(rb.title);\n return dir * (ra.createdAtEpoch - rb.createdAtEpoch);\n });\n\n return sorted;\n }, [ids, byId, filters]);\n}\n","import type { RecordItem } from './mappings';\nimport type { FiltersSlice } from '../stores/slices/filtersSlice';\n\ntype RecordFilters = Pick<\n FiltersSlice,\n | 'type'\n | 'search'\n | 'documentDateFrom'\n | 'documentDateTo'\n | 'uploadDateFrom'\n | 'uploadDateTo'\n | 'tags'\n>;\n\n/**\n * Whether a record passes the active filters. `skipType` ignores the type-chip\n * filter — the toolbar uses this so each chip's count reflects the OTHER active\n * filters (date / tags / search) without a selected type zeroing the rest.\n */\nexport function recordMatchesFilters(\n r: RecordItem,\n filters: RecordFilters,\n { skipType = false }: { skipType?: boolean } = {},\n): boolean {\n if (!skipType && filters.type && r.typeCode !== filters.type) return false;\n\n const search = filters.search.trim().toLowerCase();\n if (search && !r.title.toLowerCase().includes(search)) return false;\n\n // Document date = createdAtEpoch; Upload date = updatedAtEpoch.\n if (filters.documentDateFrom != null && r.createdAtEpoch < filters.documentDateFrom) return false;\n if (filters.documentDateTo != null && r.createdAtEpoch > filters.documentDateTo) return false;\n if (filters.uploadDateFrom != null && r.updatedAtEpoch < filters.uploadDateFrom) return false;\n if (filters.uploadDateTo != null && r.updatedAtEpoch > filters.uploadDateTo) return false;\n\n // Tags: OR — keep records carrying at least one selected tag.\n if (filters.tags.length) {\n const tagSet = new Set(filters.tags);\n if (!r.tags.some((t) => tagSet.has(t))) return false;\n }\n\n return true;\n}\n","import { useSdk } from './useSdk';\nimport {\n useRecordById as useRecordByIdBase,\n useRecordIdRange as useRecordIdRangeBase,\n useRecordsCount as useRecordsCountBase,\n useRecordsStatus as useRecordsStatusBase,\n useThumbnailUrl as useThumbnailUrlBase,\n useIsSelected as useIsSelectedBase,\n useAllTags as useAllTagsBase,\n} from '../stores/selectors/recordsSelectors';\nimport {\n useCaseById as useCaseByIdBase,\n useCaseIds as useCaseIdsBase,\n useCasesStatus as useCasesStatusBase,\n} from '../stores/selectors/casesSelectors';\nimport { useFilteredRecordIds as useFilteredRecordIdsBase } from '../stores/selectors/filteredSelectors';\n\nexport function useRecordById(id: string) {\n return useRecordByIdBase(useSdk().store, id);\n}\n\nexport function useRecordIdRange(start: number, end: number) {\n return useRecordIdRangeBase(useSdk().store, start, end);\n}\n\nexport function useRecordsCount() {\n return useRecordsCountBase(useSdk().store);\n}\n\nexport function useRecordsStatus() {\n return useRecordsStatusBase(useSdk().store);\n}\n\nexport function useThumbnailUrl(id: string) {\n return useThumbnailUrlBase(useSdk().store, id);\n}\n\nexport function useIsSelected(id: string) {\n return useIsSelectedBase(useSdk().store, id);\n}\n\nexport function useAllTags() {\n return useAllTagsBase(useSdk().store);\n}\n\nexport function useCaseById(id: string) {\n return useCaseByIdBase(useSdk().store, id);\n}\n\nexport function useCaseIds() {\n return useCaseIdsBase(useSdk().store);\n}\n\nexport function useCasesStatus() {\n return useCasesStatusBase(useSdk().store);\n}\n\nexport function useFilteredRecordIds() {\n return useFilteredRecordIdsBase(useSdk().store);\n}\n","import { memo } from 'react';\n\nexport interface SidebarItemProps {\n id: string;\n dayNumber: string;\n weekday: string;\n countLabel: string;\n summary: string;\n selected: boolean;\n onSelect: (id: string) => void;\n}\n\nexport const SidebarItem = memo(function SidebarItem({\n id,\n dayNumber,\n weekday,\n countLabel,\n summary,\n selected,\n onSelect,\n}: SidebarItemProps) {\n return (\n <button\n type=\"button\"\n className={`mr-sidebar-item${selected ? ' mr-sidebar-item--selected' : ''}`}\n aria-pressed={selected}\n onClick={() => onSelect(id)}\n >\n <span className=\"mr-sidebar-item__date\">\n <span className=\"mr-sidebar-item__day-num\">{dayNumber}</span>\n <span className=\"mr-sidebar-item__weekday\">{weekday}</span>\n </span>\n <span className=\"mr-sidebar-item__text\">\n <span className=\"mr-sidebar-item__count\">{countLabel}</span>\n <span className=\"mr-sidebar-item__summary\">{summary}</span>\n </span>\n {selected && <span className=\"mr-sidebar-item__indicator\" aria-hidden />}\n </button>\n );\n});\n","import { ChevronLeft, ChevronRight } from 'lucide-react';\n\nexport interface SidebarPaginationProps {\n page: number;\n pageCount: number;\n onChange: (page: number) => void;\n}\n\nexport function SidebarPagination({ page, pageCount, onChange }: SidebarPaginationProps) {\n if (pageCount <= 1) return null;\n\n const goToPage = (val: string) => {\n const n = parseInt(val, 10);\n if (!isNaN(n) && n >= 1 && n <= pageCount) onChange(n - 1);\n };\n\n return (\n <div className=\"mr-sidebar-pagination\">\n <button\n type=\"button\"\n className=\"mr-sidebar-pagination__btn\"\n aria-label=\"Previous page\"\n disabled={page <= 0}\n onClick={() => onChange(page - 1)}\n >\n <ChevronLeft size={16} aria-hidden />\n </button>\n\n <div className=\"mr-sidebar-pagination__jumper\">\n <span className=\"mr-sidebar-pagination__text\">Page</span>\n <input\n type=\"number\"\n className=\"mr-sidebar-pagination__page-box\"\n min={1}\n max={pageCount}\n defaultValue={page + 1}\n key={page}\n onBlur={(e) => goToPage(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') goToPage((e.target as HTMLInputElement).value);\n }}\n />\n <span className=\"mr-sidebar-pagination__text\">of {pageCount}</span>\n </div>\n\n <button\n type=\"button\"\n className=\"mr-sidebar-pagination__btn\"\n aria-label=\"Next page\"\n disabled={page >= pageCount - 1}\n onClick={() => onChange(page + 1)}\n >\n <ChevronRight size={16} aria-hidden />\n </button>\n </div>\n );\n}\n","'use client';\n\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Search, Check, Plus, ChevronDown, X } from 'lucide-react';\nimport { useStore } from 'zustand';\nimport { useSdk } from '../../connection/useSdk';\nimport { useCasesConnection } from '../../connection/useCasesConnection';\nimport { PresetSelect } from '../PresetSelect/PresetSelect';\n\nexport type CasePickerMode = 'dropdown' | 'inline';\n\nexport interface CasePickerProps {\n selected: string | null;\n onChange: (caseId: string | null) => void;\n mode?: CasePickerMode;\n}\n\nconst CASE_TYPE_OPTIONS = [\n { value: 'OP', label: 'Out-patient' },\n { value: 'IP', label: 'In-patient' },\n { value: 'EM', label: 'Emergency' },\n { value: 'HH', label: 'Home Health' },\n { value: 'DC', label: 'Day Care' },\n];\n\nconst todayISO = () => new Date().toISOString().slice(0, 10);\n\nexport function CasePicker({ selected, onChange, mode = 'dropdown' }: CasePickerProps) {\n const { store } = useSdk();\n const { createCase } = useCasesConnection();\n\n const caseIds = useStore(store, (s) => s.cases.ids);\n const casesById = useStore(store, (s) => s.cases.byId);\n\n const cases = useMemo(\n () => caseIds.map((id) => casesById[id]).filter(Boolean),\n [caseIds, casesById],\n );\n\n const selectedCase = cases.find((c) => c.id === selected) ?? null;\n\n // Shared create state\n const [creating, setCreating] = useState(false);\n const [newName, setNewName] = useState('');\n const [newType, setNewType] = useState('OP');\n const [newDate, setNewDate] = useState(todayISO());\n const [saving, setSaving] = useState(false);\n\n // Dropdown-only state\n const [query, setQuery] = useState('');\n const [menuPos, setMenuPos] = useState<{\n top?: number; bottom?: number; left: number; width: number; maxH: number;\n } | null>(null);\n const fieldRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const open = menuPos !== null;\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n return q ? cases.filter((c) => c.name.toLowerCase().includes(q)) : cases;\n }, [cases, query]);\n\n const place = () => {\n const el = fieldRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - r.bottom - 8;\n const spaceAbove = r.top - 8;\n if (spaceBelow >= 200 || spaceBelow >= spaceAbove) {\n setMenuPos({ top: r.bottom + 4, left: r.left, width: r.width, maxH: Math.min(320, spaceBelow) });\n } else {\n setMenuPos({ bottom: window.innerHeight - r.top + 4, left: r.left, width: r.width, maxH: Math.min(320, spaceAbove) });\n }\n };\n\n useEffect(() => {\n if (!open) { setQuery(''); setCreating(false); setNewName(''); return; }\n const onDown = (e: MouseEvent) => {\n const t = e.target as Node;\n if (fieldRef.current?.contains(t) || menuRef.current?.contains(t)) return;\n if ((t as Element).closest?.('[data-mr-portal]')) return;\n setMenuPos(null);\n };\n const onResize = () => setMenuPos(null);\n document.addEventListener('mousedown', onDown);\n window.addEventListener('resize', onResize);\n return () => {\n document.removeEventListener('mousedown', onDown);\n window.removeEventListener('resize', onResize);\n };\n }, [open]);\n\n const handleCreate = async () => {\n const name = newName.trim();\n if (!name) return;\n setSaving(true);\n try {\n const occurred_at = newDate\n ? Math.floor(new Date(newDate + 'T00:00:00').getTime() / 1000)\n : undefined;\n const id = await createCase({ display_name: name, type: newType, occurred_at });\n onChange(id);\n setCreating(false);\n setNewName('');\n setNewType('OP');\n setNewDate(todayISO());\n if (mode === 'dropdown') setMenuPos(null);\n } finally {\n setSaving(false);\n }\n };\n\n const resetCreate = () => { setCreating(false); setNewName(''); setNewType('OP'); setNewDate(todayISO()); };\n\n // ── Shared: case list + create form ─────────────────────────────────────\n const listContent = creating ? (\n // Create mode — replace list entirely with the create form\n <div className=\"mr-case-picker__create-form\">\n <input\n type=\"text\"\n className=\"mr-case-picker__create-input\"\n placeholder=\"Case name\"\n autoFocus\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Escape') resetCreate(); }}\n />\n <PresetSelect\n value={newType}\n options={CASE_TYPE_OPTIONS}\n onChange={setNewType}\n active={newType !== 'OP'}\n />\n <input\n type=\"date\"\n className=\"mr-case-picker__create-input\"\n value={newDate}\n max={todayISO()}\n onChange={(e) => setNewDate(e.target.value)}\n />\n <div className=\"mr-case-picker__create-actions\">\n <button type=\"button\" className=\"mr-case-picker__create-cancel\" onClick={resetCreate}>\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"mr-case-picker__create-save\"\n disabled={!newName.trim() || saving}\n onClick={() => void handleCreate()}\n >\n {saving ? '…' : 'Create and Add'}\n </button>\n </div>\n </div>\n ) : (\n // List mode — show cases + footer button\n <>\n <ul className=\"mr-case-picker__list\">\n {filtered.length === 0 ? (\n <li className=\"mr-case-picker__empty\">No cases found</li>\n ) : (\n filtered.map((c) => (\n <li key={c.id}>\n <button\n type=\"button\"\n className={`mr-case-picker__option${selected === c.id ? ' mr-case-picker__option--active' : ''}`}\n onClick={() => { onChange(c.id); if (mode === 'dropdown') setMenuPos(null); }}\n >\n <span>{c.name}</span>\n {selected === c.id && <Check size={14} aria-hidden />}\n </button>\n </li>\n ))\n )}\n </ul>\n <div className=\"mr-case-picker__footer\">\n <button type=\"button\" className=\"mr-case-picker__create-btn\" onClick={() => setCreating(true)}>\n <Plus size={14} aria-hidden />\n New care context\n </button>\n </div>\n </>\n );\n\n // ── Inline mode — no cases exist; just show create button → form ─────────\n if (mode === 'inline') {\n return (\n <div className=\"mr-case-picker mr-case-picker--inline\">\n {creating ? (\n <div className=\"mr-case-picker__create-form\">\n <input\n type=\"text\"\n className=\"mr-case-picker__create-input\"\n placeholder=\"Case name\"\n autoFocus\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Escape') resetCreate(); }}\n />\n <PresetSelect\n value={newType}\n options={CASE_TYPE_OPTIONS}\n onChange={setNewType}\n active={newType !== 'OP'}\n />\n <input\n type=\"date\"\n className=\"mr-case-picker__create-input\"\n value={newDate}\n max={todayISO()}\n onChange={(e) => setNewDate(e.target.value)}\n />\n <div className=\"mr-case-picker__create-actions\">\n <button type=\"button\" className=\"mr-case-picker__create-cancel\" onClick={resetCreate}>\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"mr-case-picker__create-save\"\n disabled={!newName.trim() || saving}\n onClick={() => void handleCreate()}\n >\n {saving ? '…' : 'Create and Add'}\n </button>\n </div>\n </div>\n ) : (\n <button type=\"button\" className=\"mr-case-picker__create-btn\" onClick={() => setCreating(true)}>\n <Plus size={14} aria-hidden />\n New care context\n </button>\n )}\n </div>\n );\n }\n\n // ── Dropdown mode ────────────────────────────────────────────────────────\n return (\n <>\n <button\n ref={fieldRef}\n type=\"button\"\n className={`mr-case-picker__field${open ? ' mr-case-picker__field--open' : ''}${selected ? ' mr-case-picker__field--active' : ''}`}\n onClick={() => open ? setMenuPos(null) : place()}\n >\n <Search size={14} aria-hidden className=\"mr-case-picker__field-icon\" />\n <span className={selectedCase ? 'mr-case-picker__field-value' : 'mr-case-picker__field-placeholder'}>\n {selectedCase?.name ?? 'Search or select case…'}\n </span>\n {selected\n ? <X size={14} aria-hidden className=\"mr-case-picker__field-icon\" onClick={(e) => { e.stopPropagation(); onChange(null); }} />\n : <ChevronDown size={14} aria-hidden className=\"mr-case-picker__field-icon\" />}\n </button>\n\n {open && typeof document !== 'undefined' && createPortal(\n <div\n ref={menuRef}\n className=\"mr-case-picker__menu\"\n data-mr-portal\n style={{\n ...(menuPos!.top !== undefined ? { top: menuPos!.top } : { bottom: menuPos!.bottom }),\n left: menuPos!.left,\n width: menuPos!.width,\n maxHeight: menuPos!.maxH,\n }}\n >\n {!creating && (\n <div className=\"mr-case-picker__search-row\">\n <Search size={14} className=\"mr-case-picker__search-icon\" aria-hidden />\n <input\n type=\"text\"\n className=\"mr-case-picker__search-input\"\n placeholder=\"Search cases…\"\n autoFocus={!creating}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n />\n </div>\n )}\n {listContent}\n </div>,\n document.body,\n )}\n </>\n );\n}\n","import { SidebarItem } from '../../components/SidebarItem/SidebarItem';\nimport { SidebarPagination } from './SidebarPagination';\nimport { CasePicker } from '../../components/CasePicker/CasePicker';\nimport type { SidebarTab } from './RecordsView';\nimport type { RecordSection } from './useRecordSections';\n\nexport interface RecordsSidebarProps {\n tab: SidebarTab;\n onTabChange: (tab: SidebarTab) => void;\n sections: RecordSection[];\n activeKey: string | null;\n onSelectSection: (key: string) => void;\n page: number;\n pageCount: number;\n onPageChange: (page: number) => void;\n}\n\nexport function RecordsSidebar({\n tab,\n onTabChange,\n sections,\n activeKey,\n onSelectSection,\n page,\n pageCount,\n onPageChange,\n}: RecordsSidebarProps) {\n const showCareContextEmpty = tab === 'careContext' && sections.length === 0;\n\n return (\n <nav className=\"mr-records-sidebar\">\n <div className=\"mr-records-sidebar__tabs\">\n <div className=\"mr-records-sidebar__tabsrow\" role=\"tablist\">\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === 'date'}\n className={`mr-records-sidebar__tab${tab === 'date' ? ' mr-records-sidebar__tab--active' : ''}`}\n onClick={() => onTabChange('date')}\n >\n Date\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === 'careContext'}\n className={`mr-records-sidebar__tab${tab === 'careContext' ? ' mr-records-sidebar__tab--active' : ''}`}\n onClick={() => onTabChange('careContext')}\n >\n Care Context\n </button>\n </div>\n </div>\n\n <div key={tab} className=\"mr-records-sidebar__body\">\n {showCareContextEmpty ? (\n <div className=\"mr-records-sidebar__empty-context\">\n <p className=\"mr-records-sidebar__empty-text\">No cases yet. Create one.</p>\n <CasePicker selected={null} onChange={() => {}} mode=\"inline\" />\n </div>\n ) : (\n sections.map((s, i) => {\n const showMonth =\n tab === 'date' && (i === 0 || sections[i - 1].monthKey !== s.monthKey);\n return (\n <div key={s.key}>\n {showMonth && <div className=\"mr-records-sidebar__month\">{s.monthLabel}</div>}\n <SidebarItem\n id={s.key}\n dayNumber={s.dayNumber}\n weekday={s.weekday}\n countLabel={s.countLabel}\n summary={s.summary}\n selected={activeKey === s.key}\n onSelect={onSelectSection}\n />\n </div>\n );\n })\n )}\n </div>\n\n <SidebarPagination page={page} pageCount={pageCount} onChange={onPageChange} />\n </nav>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport { RecordCardContainer } from './RecordCardContainer';\nimport { RecordRowContainer } from './RecordRowContainer';\nimport type { RecordsViewMode } from './RecordsToolbar';\nimport type { RecordSection } from './useRecordSections';\n\nexport interface RecordsGridProps {\n sections: RecordSection[];\n viewMode: RecordsViewMode;\n selectionMode: boolean;\n maxSelectable: number;\n showMonths: boolean;\n scrollToKey: string | null;\n}\n\nexport function RecordsGrid({\n sections,\n viewMode,\n selectionMode,\n maxSelectable,\n showMonths,\n scrollToKey,\n}: RecordsGridProps) {\n const isList = viewMode === 'list';\n const headerRefs = useRef(new Map<string, HTMLElement>());\n\n useEffect(() => {\n if (!scrollToKey) return;\n headerRefs.current.get(scrollToKey)?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }, [scrollToKey]);\n\n return (\n <div className=\"mr-records-grid\">\n {sections.map((section, i) => {\n const showMonth =\n showMonths && (i === 0 || sections[i - 1].monthKey !== section.monthKey);\n const active = section.key === scrollToKey;\n return (\n <section key={section.key} className=\"mr-records-grid__section gap-20\">\n {showMonth && <div className=\"mr-records-sidebar__month\">{section.monthLabel}</div>}\n <header\n className={`mr-records-grid__section-header${active ? ' mr-records-grid__section-header--active' : ''}`}\n data-section-key={section.key}\n ref={(el) => {\n if (el) headerRefs.current.set(section.key, el);\n else headerRefs.current.delete(section.key);\n }}\n >\n </header>\n <div className={isList ? 'mr-records-grid__rows' : 'mr-records-grid__cards'}>\n {section.recordIds.map((id) =>\n isList ? (\n <RecordRowContainer\n key={id}\n id={id}\n selectionMode={selectionMode}\n maxSelectable={maxSelectable}\n />\n ) : (\n <RecordCardContainer\n key={id}\n id={id}\n selectionMode={selectionMode}\n maxSelectable={maxSelectable}\n />\n ),\n )}\n </div>\n </section>\n );\n })}\n </div>\n );\n}\n","import { memo } from 'react';\nimport { RecordCard } from '../../components/RecordCard/RecordCard';\nimport { useRecordItem } from './useRecordItem';\n\nexport interface RecordContainerProps {\n id: string;\n selectionMode: boolean;\n maxSelectable: number;\n}\n\nexport const RecordCardContainer = memo(function RecordCardContainer(props: RecordContainerProps) {\n const item = useRecordItem(props);\n if (!item) return null;\n return (\n <div ref={item.ref} className=\"mr-record-slot\">\n <RecordCard {...item.props} />\n </div>\n );\n});\n","import { memo, useMemo } from 'react';\nimport { Check, Copy, Eye, FolderPlus, Trash2 } from 'lucide-react';\nimport { Badge } from '../Badge/Badge';\nimport { IconButton } from '../IconButton/IconButton';\nimport { TagChip } from '../TagChip/TagChip';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { Thumbnail } from '../Thumbnail/Thumbnail';\nimport { OverflowMenu } from '../OverflowMenu/OverflowMenu';\nimport { AttachContextIcon } from '../icons/AttachContextIcon';\nimport { AddToContextSubPanel } from '../../views/RecordsView/AddToContextSubPanel';\nimport { RecordItemProps } from '../../helpers/mappings';\n\nexport interface RecordCardProps extends RecordItemProps {\n dense?: boolean;\n}\n\nexport const RecordCard = memo(\n function RecordCard({\n record,\n selected,\n selectionMode,\n thumbnailUrl,\n inContext,\n attachDisabled,\n selectDisabled,\n isUploading,\n isUploadFailed,\n isAnalysing,\n isSmart,\n dateDisplay,\n onSelect,\n onOpen,\n onDelete,\n onAddToContext,\n onCopyNotes,\n }: RecordCardProps) {\n const [firstTag, ...restTags] = record.tags;\n\n const overflowItems = useMemo(() => [\n {\n key: 'case',\n label: 'Add to care context',\n icon: <FolderPlus size={16} aria-hidden />,\n subPanel: (_onBack: () => void, onClose: () => void) => (\n <AddToContextSubPanel\n recordId={record.id}\n linkedCaseIds={record.cases}\n onClose={onClose}\n />\n ),\n },\n {\n key: 'delete',\n label: 'Delete record',\n icon: <Trash2 size={16} aria-hidden />,\n destructive: true,\n onSelect: () => onDelete(record.id),\n },\n ], [record.id, record.cases, onDelete]);\n\n const selectBlocked = selectionMode && selectDisabled && !selected;\n const handleCardClick = () => {\n if (isUploading || isUploadFailed) return;\n if (selectionMode) {\n if (!selectBlocked) onSelect(record.id);\n } else {\n onOpen(record.id);\n }\n };\n\n const badge = isUploading\n ? <Badge variant=\"uploading\" label=\"Uploading\" />\n : isUploadFailed\n ? <Badge variant=\"upload_failure\" label=\"Upload failure\" />\n : isAnalysing\n ? <Badge variant=\"analysing\" label=\"Analysing\" />\n : isSmart\n ? <Badge variant=\"smart\" label=\"Smart\" />\n : null;\n\n return (\n <article\n className={`mr-record-card${selected ? ' mr-record-card--selected' : ''}${selectBlocked ? ' mr-record-card--disabled' : ''}${isUploadFailed ? ' mr-record-card--failed' : ''}`}\n onClick={handleCardClick}\n >\n <header className=\"mr-record-card__header\">\n {selectionMode && !isUploading && !isUploadFailed && (\n <span\n className={`mr-record-card__checkbox${selected ? ' mr-record-card__checkbox--checked' : ''}${\n selectBlocked ? ' mr-record-card__checkbox--disabled' : ''\n }`}\n aria-hidden\n >\n {selected && <Check size={14} strokeWidth={3} />}\n </span>\n )}\n <div className=\"mr-record-card__heading\">\n <span className=\"mr-record-card__title\">{record.title}</span>\n <span className=\"mr-record-card__date\">{dateDisplay}</span>\n </div>\n {badge}\n </header>\n\n <div className=\"mr-record-card__preview\">\n <Thumbnail url={thumbnailUrl ?? null} alt={record.title} />\n {record.fileType && (\n <span className=\"mr-record-card__filetype\">{record.fileType}</span>\n )}\n </div>\n\n <footer className=\"mr-record-card__footer\">\n {record.tags.length > 0 ? (\n <div className=\"mr-record-card__tags\">\n <TagChip label={firstTag} />\n {restTags.length > 0 && (\n <Tooltip content={record.tags.join(', ')}>\n <TagChip label={`+${restTags.length}`} onClick={(e) => e.stopPropagation()} />\n </Tooltip>\n )}\n </div>\n ) : (\n <span className=\"mr-record-card__tags-spacer\" />\n )}\n <div className=\"mr-record-card__actions\">\n {isUploading && (\n <Tooltip content=\"Cancel upload\">\n <IconButton\n variant=\"destructive\"\n aria-label=\"Cancel upload\"\n icon={<Trash2 size={16} aria-hidden />}\n onClick={(e) => { e.stopPropagation(); onDelete(record.id); }}\n />\n </Tooltip>\n )}\n\n {isUploadFailed && (\n <>\n <Tooltip content=\"Delete record\">\n <IconButton\n variant=\"destructive\"\n aria-label=\"Delete record\"\n icon={<Trash2 size={16} aria-hidden />}\n onClick={(e) => { e.stopPropagation(); onDelete(record.id); }}\n />\n </Tooltip>\n </>\n )}\n\n {!isUploading && !isUploadFailed && (\n <>\n {selectionMode ? (\n <Tooltip content=\"View record\">\n <IconButton\n variant=\"primary\"\n aria-label=\"View record\"\n icon={<Eye size={16} aria-hidden />}\n onClick={(e) => { e.stopPropagation(); onOpen(record.id); }}\n />\n </Tooltip>\n ) : inContext ? (\n <Tooltip content=\"Remove from Context\">\n <IconButton\n variant=\"solid\"\n aria-label=\"Remove from Context\"\n icon={<Check size={16} strokeWidth={3} aria-hidden />}\n onClick={(e) => { e.stopPropagation(); onAddToContext(record.id); }}\n />\n </Tooltip>\n ) : (\n <Tooltip content=\"Add to session context\">\n <button\n type=\"button\"\n className=\"mr-attach-context-btn\"\n aria-label=\"Add to care context\"\n disabled={attachDisabled}\n onClick={(e) => { e.stopPropagation(); onAddToContext(record.id); }}\n >\n <AttachContextIcon size={28} />\n </button>\n </Tooltip>\n )}\n {!selectionMode && (\n <>\n {isSmart && (\n <Tooltip content=\"Copy to note\">\n <IconButton\n variant=\"primary\"\n aria-label=\"Copy to note\"\n icon={<Copy size={16} />}\n onClick={(e) => { e.stopPropagation(); onCopyNotes(record.id, { x: e.clientX, y: e.clientY }); }}\n />\n </Tooltip>\n )}\n <OverflowMenu items={overflowItems} />\n </>\n )}\n </>\n )}\n </div>\n </footer>\n </article>\n );\n },\n (prev, next) =>\n prev.selected === next.selected &&\n prev.selectionMode === next.selectionMode &&\n prev.inContext === next.inContext &&\n prev.attachDisabled === next.attachDisabled &&\n prev.selectDisabled === next.selectDisabled &&\n prev.isUploading === next.isUploading &&\n prev.isUploadFailed === next.isUploadFailed &&\n prev.isAnalysing === next.isAnalysing &&\n prev.isSmart === next.isSmart &&\n prev.thumbnailUrl === next.thumbnailUrl &&\n prev.dateDisplay === next.dateDisplay &&\n prev.record.id === next.record.id &&\n prev.record.updatedAtEpoch === next.record.updatedAtEpoch,\n);\n","import { memo } from 'react';\nimport { Star } from 'lucide-react';\nimport { AnalysingIcon } from '../icons/AnalysingIcon';\nimport { UploadingIcon } from '../icons/UploadingIcon';\nimport { FailedUploadIcon } from '../icons/FailedUploadIcon';\n\nexport interface BadgeProps {\n variant: 'smart' | 'analysing' | 'uploading' | 'upload_failure';\n label: string;\n}\n\nexport const Badge = memo(function Badge({ variant, label }: BadgeProps) {\n if (variant === 'uploading') return <UploadingIcon />;\n if (variant === 'analysing') return <AnalysingIcon />;\n if (variant === 'upload_failure') return <FailedUploadIcon />;\n return (\n <span className=\"mr-badge mr-badge--smart\">\n <Star className=\"mr-badge__icon\" aria-hidden />\n {label}\n </span>\n );\n});\n","export function AnalysingIcon({ size = 89 }: { size?: number }) {\n const scale = size / 89;\n return (\n <svg\n width={89 * scale}\n height={24 * scale}\n viewBox=\"0 0 89 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n >\n <path d=\"M0 6C0 2.68629 2.68629 0 6 0H83C86.3137 0 89 2.68629 89 6V18C89 21.3137 86.3137 24 83 24H6C2.68629 24 0 21.3137 0 18V6Z\" fill=\"#FFFAEB\"/>\n <g clipPath=\"url(#mr-analysing-clip)\">\n <path d=\"M14 7V9M16.1 9.89995L17.55 8.44995M17 12H19M16.1 14.1L17.55 15.55M14 15V17M10.45 15.55L11.9 14.1M9 12H11M10.45 8.44995L11.9 9.89995\" stroke=\"#B45309\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </g>\n <path d=\"M25.696 16H24.2983L27.4389 7.27273H28.9602L32.1009 16H30.7031L28.2358 8.85795H28.1676L25.696 16ZM25.9304 12.5824H30.4645V13.6903H25.9304V12.5824ZM34.533 12.1136V16H33.2589V9.45455H34.4819V10.5199H34.5629C34.7134 10.1733 34.9492 9.89489 35.2702 9.68466C35.5941 9.47443 36.0018 9.36932 36.4933 9.36932C36.9393 9.36932 37.3299 9.46307 37.6651 9.65057C38.0004 9.83523 38.2603 10.1108 38.445 10.4773C38.6296 10.8437 38.7219 11.2969 38.7219 11.8366V16H37.4478V11.9901C37.4478 11.5156 37.3242 11.1449 37.0771 10.8778C36.8299 10.608 36.4904 10.473 36.0586 10.473C35.7631 10.473 35.5004 10.5369 35.2702 10.6648C35.043 10.7926 34.8626 10.9801 34.729 11.2273C34.5984 11.4716 34.533 11.767 34.533 12.1136ZM42.3356 16.1449C41.9208 16.1449 41.5458 16.0682 41.2106 15.9148C40.8754 15.7585 40.6097 15.5327 40.4137 15.2372C40.2205 14.9418 40.1239 14.5795 40.1239 14.1506C40.1239 13.7812 40.195 13.4773 40.337 13.2386C40.479 13 40.6708 12.8111 40.9123 12.6719C41.1538 12.5327 41.4237 12.4276 41.7219 12.3565C42.0202 12.2855 42.3242 12.2315 42.6339 12.1946C43.0259 12.1491 43.3441 12.1122 43.5884 12.0838C43.8327 12.0526 44.0103 12.0028 44.1211 11.9347C44.2319 11.8665 44.2873 11.7557 44.2873 11.6023V11.5724C44.2873 11.2003 44.1822 10.9119 43.9719 10.7074C43.7646 10.5028 43.4549 10.4006 43.043 10.4006C42.614 10.4006 42.2759 10.4957 42.0288 10.6861C41.7844 10.8736 41.6154 11.0824 41.5217 11.3125L40.3242 11.0398C40.4663 10.642 40.6737 10.321 40.9464 10.0767C41.2219 9.82955 41.5387 9.65057 41.8967 9.53977C42.2546 9.42614 42.631 9.36932 43.0259 9.36932C43.2873 9.36932 43.5643 9.40057 43.8569 9.46307C44.1523 9.52273 44.4279 9.63352 44.6836 9.79545C44.9421 9.95739 45.1538 10.1889 45.3185 10.4901C45.4833 10.7884 45.5657 11.1761 45.5657 11.6534V16H44.3214V15.1051H44.2702C44.1879 15.2699 44.0643 15.4318 43.8995 15.5909C43.7347 15.75 43.5231 15.8821 43.2646 15.9872C43.006 16.0923 42.6964 16.1449 42.3356 16.1449ZM42.6126 15.1222C42.9648 15.1222 43.266 15.0526 43.516 14.9134C43.7688 14.7741 43.9606 14.5923 44.0913 14.3679C44.2248 14.1406 44.2915 13.8977 44.2915 13.6392V12.7955C44.2461 12.8409 44.158 12.8835 44.0273 12.9233C43.8995 12.9602 43.7532 12.9929 43.5884 13.0213C43.4237 13.0469 43.2631 13.071 43.1069 13.0938C42.9506 13.1136 42.82 13.1307 42.7148 13.1449C42.4677 13.1761 42.2418 13.2287 42.0373 13.3026C41.8356 13.3764 41.6737 13.483 41.5515 13.6222C41.4322 13.7585 41.3725 13.9403 41.3725 14.1676C41.3725 14.483 41.489 14.7216 41.7219 14.8835C41.9549 15.0426 42.2518 15.1222 42.6126 15.1222ZM48.5369 7.27273V16H47.2628V7.27273H48.5369ZM51.0565 18.4545C50.8661 18.4545 50.6928 18.4389 50.5366 18.4077C50.3803 18.3793 50.2638 18.348 50.1871 18.3139L50.494 17.2699C50.7269 17.3324 50.9343 17.3594 51.1161 17.3509C51.2979 17.3423 51.4585 17.2741 51.5977 17.1463C51.7397 17.0185 51.8647 16.8097 51.9727 16.5199L52.1303 16.0852L49.7354 9.45455H51.0991L52.7567 14.5341H52.8249L54.4826 9.45455H55.8505L53.1531 16.8736C53.0281 17.2145 52.869 17.5028 52.6758 17.7386C52.4826 17.9773 52.2525 18.1563 51.9854 18.2756C51.7184 18.3949 51.4087 18.4545 51.0565 18.4545ZM61.9528 11.0526L60.7979 11.2571C60.7496 11.1094 60.6729 10.9687 60.5678 10.8352C60.4656 10.7017 60.3263 10.5923 60.1502 10.5071C59.9741 10.4219 59.7539 10.3793 59.4897 10.3793C59.1289 10.3793 58.8278 10.4602 58.5863 10.6222C58.3448 10.7812 58.2241 10.9872 58.2241 11.2401C58.2241 11.4588 58.305 11.6349 58.467 11.7685C58.6289 11.902 58.8903 12.0114 59.2511 12.0966L60.2908 12.3352C60.8931 12.4744 61.342 12.6889 61.6374 12.9787C61.9329 13.2685 62.0806 13.6449 62.0806 14.108C62.0806 14.5 61.967 14.8494 61.7397 15.1562C61.5153 15.4602 61.2013 15.6989 60.7979 15.8722C60.3974 16.0455 59.9329 16.1321 59.4045 16.1321C58.6715 16.1321 58.0735 15.9759 57.6104 15.6634C57.1474 15.348 56.8633 14.9006 56.7582 14.321L57.9897 14.1335C58.0664 14.4545 58.2241 14.6974 58.4627 14.8622C58.7013 15.0241 59.0124 15.1051 59.396 15.1051C59.8136 15.1051 60.1474 15.0185 60.3974 14.8452C60.6474 14.669 60.7724 14.4545 60.7724 14.2017C60.7724 13.9972 60.6957 13.8253 60.5423 13.6861C60.3917 13.5469 60.1602 13.4418 59.8477 13.3707L58.7397 13.1278C58.1289 12.9886 57.6772 12.767 57.3846 12.4631C57.0948 12.1591 56.9499 11.7741 56.9499 11.3082C56.9499 10.9219 57.0579 10.5838 57.2738 10.294C57.4897 10.0043 57.788 9.77841 58.1687 9.61648C58.5494 9.4517 58.9854 9.36932 59.4769 9.36932C60.1843 9.36932 60.7411 9.52273 61.1474 9.82955C61.5536 10.1335 61.8221 10.5412 61.9528 11.0526ZM63.4815 16V9.45455H64.7557V16H63.4815ZM64.125 8.4446C63.9034 8.4446 63.7131 8.37074 63.554 8.22301C63.3977 8.07244 63.3196 7.89347 63.3196 7.68608C63.3196 7.47585 63.3977 7.29687 63.554 7.14915C63.7131 6.99858 63.9034 6.9233 64.125 6.9233C64.3466 6.9233 64.5355 6.99858 64.6918 7.14915C64.8509 7.29687 64.9304 7.47585 64.9304 7.68608C64.9304 7.89347 64.8509 8.07244 64.6918 8.22301C64.5355 8.37074 64.3466 8.4446 64.125 8.4446ZM67.744 12.1136V16H66.4698V9.45455H67.6928V10.5199H67.7738C67.9244 10.1733 68.1602 9.89489 68.4812 9.68466C68.805 9.47443 69.2127 9.36932 69.7042 9.36932C70.1502 9.36932 70.5408 9.46307 70.8761 9.65057C71.2113 9.83523 71.4712 10.1108 71.6559 10.4773C71.8406 10.8437 71.9329 11.2969 71.9329 11.8366V16H70.6587V11.9901C70.6587 11.5156 70.5352 11.1449 70.288 10.8778C70.0408 10.608 69.7013 10.473 69.2695 10.473C68.9741 10.473 68.7113 10.5369 68.4812 10.6648C68.2539 10.7926 68.0735 10.9801 67.94 11.2273C67.8093 11.4716 67.744 11.767 67.744 12.1136ZM76.386 18.5909C75.8661 18.5909 75.4187 18.5227 75.0437 18.3864C74.6715 18.25 74.3675 18.0696 74.1317 17.8452C73.896 17.6207 73.7198 17.375 73.6033 17.108L74.6985 16.6562C74.7752 16.7812 74.8775 16.9134 75.0053 17.0526C75.136 17.1946 75.3121 17.3153 75.5337 17.4148C75.7582 17.5142 76.0465 17.5639 76.3988 17.5639C76.8817 17.5639 77.2809 17.446 77.5962 17.2102C77.9116 16.9773 78.0692 16.6051 78.0692 16.0938V14.8068H77.9883C77.9116 14.946 77.8008 15.1009 77.6559 15.2713C77.5138 15.4418 77.3178 15.5895 77.0678 15.7145C76.8178 15.8395 76.4925 15.902 76.092 15.902C75.5749 15.902 75.109 15.7812 74.6942 15.5398C74.2823 15.2955 73.9556 14.9361 73.7141 14.4616C73.4755 13.9844 73.3562 13.3977 73.3562 12.7017C73.3562 12.0057 73.4741 11.4091 73.7099 10.9119C73.9485 10.4148 74.2752 10.0341 74.69 9.76989C75.1048 9.50284 75.5749 9.36932 76.1005 9.36932C76.5067 9.36932 76.8349 9.4375 77.0849 9.57386C77.3349 9.70739 77.5295 9.86364 77.6687 10.0426C77.8107 10.2216 77.9201 10.3793 77.9968 10.5156H78.0906V9.45455H79.3391V16.1449C79.3391 16.7074 79.2085 17.169 78.9471 17.5298C78.6857 17.8906 78.332 18.1577 77.886 18.331C77.4428 18.5043 76.9428 18.5909 76.386 18.5909ZM76.3732 14.8452C76.7397 14.8452 77.0494 14.7599 77.3022 14.5895C77.5579 14.4162 77.7511 14.169 77.8817 13.848C78.0153 13.5241 78.082 13.1364 78.082 12.6847C78.082 12.2443 78.0167 11.8565 77.886 11.5213C77.7553 11.1861 77.5636 10.9247 77.3107 10.7372C77.0579 10.5469 76.7454 10.4517 76.3732 10.4517C75.9897 10.4517 75.6701 10.5511 75.4144 10.75C75.1587 10.946 74.9656 11.2131 74.8349 11.5511C74.707 11.8892 74.6431 12.267 74.6431 12.6847C74.6431 13.1136 74.7085 13.4901 74.8391 13.8139C74.9698 14.1378 75.163 14.3906 75.4187 14.5724C75.6772 14.7543 75.9954 14.8452 76.3732 14.8452Z\" fill=\"#B45309\"/>\n <defs>\n <clipPath id=\"mr-analysing-clip\">\n <rect width=\"12\" height=\"12\" fill=\"white\" transform=\"translate(8 6)\"/>\n </clipPath>\n </defs>\n </svg>\n );\n}\n","export function UploadingIcon() {\n return (\n <svg width=\"75\" height=\"24\" viewBox=\"0 0 75 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden>\n <g style={{ transformOrigin: '6px 12px', animation: 'mr-spin 1s linear infinite' }}>\n <path d=\"M10.5 12.0002C10.5 12.9505 10.1991 13.8764 9.64047 14.6452C9.08187 15.414 8.29423 15.9862 7.39044 16.2798C6.48665 16.5734 5.5131 16.5734 4.60932 16.2797C3.70555 15.986 2.91794 15.4138 2.35938 14.645C1.80083 13.8762 1.49999 12.9503 1.5 12C1.50001 11.0497 1.80085 10.1238 2.35942 9.35497C2.91799 8.58617 3.7056 8.01392 4.60938 7.72026C5.51316 7.42659 6.48671 7.42658 7.3905 7.72022\" stroke=\"#215FFF\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </g>\n <path d=\"M22.571 7.27273H23.892V13.0128C23.892 13.6236 23.7486 14.1648 23.4616 14.6364C23.1747 15.1051 22.7713 15.4744 22.2514 15.7443C21.7315 16.0114 21.1222 16.1449 20.4233 16.1449C19.7273 16.1449 19.1193 16.0114 18.5994 15.7443C18.0795 15.4744 17.6761 15.1051 17.3892 14.6364C17.1023 14.1648 16.9588 13.6236 16.9588 13.0128V7.27273H18.2756V12.9062C18.2756 13.3011 18.3622 13.652 18.5355 13.9588C18.7116 14.2656 18.9602 14.5071 19.2812 14.6832C19.6023 14.8565 19.983 14.9432 20.4233 14.9432C20.8665 14.9432 21.2486 14.8565 21.5696 14.6832C21.8935 14.5071 22.1406 14.2656 22.3111 13.9588C22.4844 13.652 22.571 13.3011 22.571 12.9062V7.27273ZM25.7042 18.4545V9.45455H26.9485V10.5156H27.055C27.1289 10.3793 27.2354 10.2216 27.3746 10.0426C27.5138 9.86364 27.707 9.70739 27.9542 9.57386C28.2013 9.4375 28.5281 9.36932 28.9343 9.36932C29.4627 9.36932 29.9343 9.50284 30.3491 9.76989C30.7638 10.0369 31.0891 10.4219 31.3249 10.9247C31.5636 11.4276 31.6829 12.0327 31.6829 12.7401C31.6829 13.4474 31.565 14.054 31.3292 14.5597C31.0934 15.0625 30.7695 15.4503 30.3576 15.723C29.9457 15.9929 29.4755 16.1278 28.9471 16.1278C28.5494 16.1278 28.2241 16.0611 27.9712 15.9276C27.7212 15.794 27.5252 15.6378 27.3832 15.4588C27.2411 15.2798 27.1317 15.1207 27.055 14.9815H26.9783V18.4545H25.7042ZM26.9528 12.7273C26.9528 13.1875 27.0195 13.5909 27.1531 13.9375C27.2866 14.2841 27.4798 14.5554 27.7326 14.7514C27.9854 14.9446 28.2951 15.0412 28.6616 15.0412C29.0423 15.0412 29.3604 14.9403 29.6161 14.7386C29.8718 14.5341 30.065 14.2571 30.1957 13.9077C30.3292 13.5582 30.396 13.1648 30.396 12.7273C30.396 12.2955 30.3306 11.9077 30.1999 11.5639C30.0721 11.2202 29.8789 10.9489 29.6204 10.75C29.3647 10.5511 29.0451 10.4517 28.6616 10.4517C28.2923 10.4517 27.9798 10.5469 27.7241 10.7372C27.4712 10.9276 27.2795 11.1932 27.1488 11.5341C27.0181 11.875 26.9528 12.2727 26.9528 12.7273ZM34.3846 7.27273V16H33.1104V7.27273H34.3846ZM38.8558 16.1321C38.2422 16.1321 37.7067 15.9915 37.2493 15.7102C36.7919 15.429 36.4368 15.0355 36.1839 14.5298C35.9311 14.0241 35.8047 13.4332 35.8047 12.7571C35.8047 12.0781 35.9311 11.4844 36.1839 10.9759C36.4368 10.4673 36.7919 10.0724 37.2493 9.79119C37.7067 9.50994 38.2422 9.36932 38.8558 9.36932C39.4695 9.36932 40.005 9.50994 40.4624 9.79119C40.9197 10.0724 41.2749 10.4673 41.5277 10.9759C41.7805 11.4844 41.907 12.0781 41.907 12.7571C41.907 13.4332 41.7805 14.0241 41.5277 14.5298C41.2749 15.0355 40.9197 15.429 40.4624 15.7102C40.005 15.9915 39.4695 16.1321 38.8558 16.1321ZM38.8601 15.0625C39.2578 15.0625 39.5874 14.9574 39.8487 14.7472C40.1101 14.5369 40.3033 14.2571 40.4283 13.9077C40.5561 13.5582 40.62 13.1733 40.62 12.7528C40.62 12.3352 40.5561 11.9517 40.4283 11.6023C40.3033 11.25 40.1101 10.9673 39.8487 10.7543C39.5874 10.5412 39.2578 10.4347 38.8601 10.4347C38.4595 10.4347 38.1271 10.5412 37.8629 10.7543C37.6016 10.9673 37.407 11.25 37.2791 11.6023C37.1541 11.9517 37.0916 12.3352 37.0916 12.7528C37.0916 13.1733 37.1541 13.5582 37.2791 13.9077C37.407 14.2571 37.6016 14.5369 37.8629 14.7472C38.1271 14.9574 38.4595 15.0625 38.8601 15.0625ZM45.234 16.1449C44.8192 16.1449 44.4442 16.0682 44.109 15.9148C43.7738 15.7585 43.5082 15.5327 43.3121 15.2372C43.119 14.9418 43.0224 14.5795 43.0224 14.1506C43.0224 13.7812 43.0934 13.4773 43.2354 13.2386C43.3775 13 43.5692 12.8111 43.8107 12.6719C44.0522 12.5327 44.3221 12.4276 44.6204 12.3565C44.9187 12.2855 45.2227 12.2315 45.5323 12.1946C45.9244 12.1491 46.2425 12.1122 46.4869 12.0838C46.7312 12.0526 46.9087 12.0028 47.0195 11.9347C47.1303 11.8665 47.1857 11.7557 47.1857 11.6023V11.5724C47.1857 11.2003 47.0806 10.9119 46.8704 10.7074C46.663 10.5028 46.3533 10.4006 45.9414 10.4006C45.5124 10.4006 45.1744 10.4957 44.9272 10.6861C44.6829 10.8736 44.5138 11.0824 44.4201 11.3125L43.2227 11.0398C43.3647 10.642 43.5721 10.321 43.8448 10.0767C44.1204 9.82955 44.4371 9.65057 44.7951 9.53977C45.1531 9.42614 45.5295 9.36932 45.9244 9.36932C46.1857 9.36932 46.4627 9.40057 46.7553 9.46307C47.0508 9.52273 47.3263 9.63352 47.582 9.79545C47.8406 9.95739 48.0522 10.1889 48.217 10.4901C48.3817 10.7884 48.4641 11.1761 48.4641 11.6534V16H47.2198V15.1051H47.1687C47.0863 15.2699 46.9627 15.4318 46.7979 15.5909C46.6332 15.75 46.4215 15.8821 46.163 15.9872C45.9045 16.0923 45.5948 16.1449 45.234 16.1449ZM45.511 15.1222C45.8633 15.1222 46.1644 15.0526 46.4144 14.9134C46.6673 14.7741 46.859 14.5923 46.9897 14.3679C47.1232 14.1406 47.19 13.8977 47.19 13.6392V12.7955C47.1445 12.8409 47.0565 12.8835 46.9258 12.9233C46.7979 12.9602 46.6516 12.9929 46.4869 13.0213C46.3221 13.0469 46.1616 13.071 46.0053 13.0938C45.8491 13.1136 45.7184 13.1307 45.6133 13.1449C45.3661 13.1761 45.1403 13.2287 44.9357 13.3026C44.734 13.3764 44.5721 13.483 44.4499 13.6222C44.3306 13.7585 44.271 13.9403 44.271 14.1676C44.271 14.483 44.3874 14.7216 44.6204 14.8835C44.8533 15.0426 45.1502 15.1222 45.511 15.1222ZM52.6115 16.1278C52.0831 16.1278 51.6115 15.9929 51.1967 15.723C50.7848 15.4503 50.4609 15.0625 50.2251 14.5597C49.9922 14.054 49.8757 13.4474 49.8757 12.7401C49.8757 12.0327 49.9936 11.4276 50.2294 10.9247C50.468 10.4219 50.7947 10.0369 51.2095 9.76989C51.6243 9.50284 52.0945 9.36932 52.62 9.36932C53.0263 9.36932 53.353 9.4375 53.6001 9.57386C53.8501 9.70739 54.0433 9.86364 54.1797 10.0426C54.3189 10.2216 54.4268 10.3793 54.5036 10.5156H54.5803V7.27273H55.8544V16H54.6101V14.9815H54.5036C54.4268 15.1207 54.3161 15.2798 54.1712 15.4588C54.0291 15.6378 53.8331 15.794 53.5831 15.9276C53.3331 16.0611 53.0092 16.1278 52.6115 16.1278ZM52.8928 15.0412C53.2592 15.0412 53.5689 14.9446 53.8217 14.7514C54.0774 14.5554 54.2706 14.2841 54.4013 13.9375C54.5348 13.5909 54.6016 13.1875 54.6016 12.7273C54.6016 12.2727 54.5362 11.875 54.4055 11.5341C54.2749 11.1932 54.0831 10.9276 53.8303 10.7372C53.5774 10.5469 53.2649 10.4517 52.8928 10.4517C52.5092 10.4517 52.1896 10.5511 51.9339 10.75C51.6783 10.9489 51.4851 11.2202 51.3544 11.5639C51.2266 11.9077 51.1626 12.2955 51.1626 12.7273C51.1626 13.1648 51.228 13.5582 51.3587 13.9077C51.4893 14.2571 51.6825 14.5341 51.9382 14.7386C52.1967 14.9403 52.5149 15.0412 52.8928 15.0412ZM57.6729 16V9.45455H58.9471V16H57.6729ZM58.3164 8.4446C58.0948 8.4446 57.9045 8.37074 57.7454 8.22301C57.5891 8.07244 57.511 7.89347 57.511 7.68608C57.511 7.47585 57.5891 7.29687 57.7454 7.14915C57.9045 6.99858 58.0948 6.9233 58.3164 6.9233C58.538 6.9233 58.7269 6.99858 58.8832 7.14915C59.0423 7.29687 59.1218 7.47585 59.1218 7.68608C59.1218 7.89347 59.0423 8.07244 58.8832 8.22301C58.7269 8.37074 58.538 8.4446 58.3164 8.4446ZM61.9354 12.1136V16H60.6612V9.45455H61.8842V10.5199H61.9652C62.1158 10.1733 62.3516 9.89489 62.6726 9.68466C62.9964 9.47443 63.4041 9.36932 63.8956 9.36932C64.3416 9.36932 64.7322 9.46307 65.0675 9.65057C65.4027 9.83523 65.6626 10.1108 65.8473 10.4773C66.032 10.8437 66.1243 11.2969 66.1243 11.8366V16H64.8501V11.9901C64.8501 11.5156 64.7266 11.1449 64.4794 10.8778C64.2322 10.608 63.8928 10.473 63.4609 10.473C63.1655 10.473 62.9027 10.5369 62.6726 10.6648C62.4453 10.7926 62.2649 10.9801 62.1314 11.2273C62.0007 11.4716 61.9354 11.767 61.9354 12.1136ZM70.5774 18.5909C70.0575 18.5909 69.6101 18.5227 69.2351 18.3864C68.8629 18.25 68.5589 18.0696 68.3232 17.8452C68.0874 17.6207 67.9112 17.375 67.7947 17.108L68.8899 16.6562C68.9666 16.7812 69.0689 16.9134 69.1967 17.0526C69.3274 17.1946 69.5036 17.3153 69.7251 17.4148C69.9496 17.5142 70.2379 17.5639 70.5902 17.5639C71.0732 17.5639 71.4723 17.446 71.7876 17.2102C72.103 16.9773 72.2607 16.6051 72.2607 16.0938V14.8068H72.1797C72.103 14.946 71.9922 15.1009 71.8473 15.2713C71.7053 15.4418 71.5092 15.5895 71.2592 15.7145C71.0092 15.8395 70.6839 15.902 70.2834 15.902C69.7663 15.902 69.3004 15.7812 68.8857 15.5398C68.4737 15.2955 68.147 14.9361 67.9055 14.4616C67.6669 13.9844 67.5476 13.3977 67.5476 12.7017C67.5476 12.0057 67.6655 11.4091 67.9013 10.9119C68.1399 10.4148 68.4666 10.0341 68.8814 9.76989C69.2962 9.50284 69.7663 9.36932 70.2919 9.36932C70.6982 9.36932 71.0263 9.4375 71.2763 9.57386C71.5263 9.70739 71.7209 9.86364 71.8601 10.0426C72.0021 10.2216 72.1115 10.3793 72.1882 10.5156H72.282V9.45455H73.5305V16.1449C73.5305 16.7074 73.3999 17.169 73.1385 17.5298C72.8771 17.8906 72.5234 18.1577 72.0774 18.331C71.6342 18.5043 71.1342 18.5909 70.5774 18.5909ZM70.5646 14.8452C70.9311 14.8452 71.2408 14.7599 71.4936 14.5895C71.7493 14.4162 71.9425 14.169 72.0732 13.848C72.2067 13.5241 72.2734 13.1364 72.2734 12.6847C72.2734 12.2443 72.2081 11.8565 72.0774 11.5213C71.9467 11.1861 71.755 10.9247 71.5021 10.7372C71.2493 10.5469 70.9368 10.4517 70.5646 10.4517C70.1811 10.4517 69.8615 10.5511 69.6058 10.75C69.3501 10.946 69.157 11.2131 69.0263 11.5511C68.8984 11.8892 68.8345 12.267 68.8345 12.6847C68.8345 13.1136 68.8999 13.4901 69.0305 13.8139C69.1612 14.1378 69.3544 14.3906 69.6101 14.5724C69.8686 14.7543 70.1868 14.8452 70.5646 14.8452Z\" fill=\"#215FFF\"/>\n </svg>\n );\n}\n","export function FailedUploadIcon() {\n return (\n <svg width=\"108\" height=\"24\" viewBox=\"0 0 108 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden>\n <path d=\"M6 10.5001V12.5001M6 14.5001H6.005M10.865 15.0001L6.86496 8.00011C6.77775 7.84621 6.65127 7.71821 6.49843 7.62915C6.34559 7.54009 6.17186 7.49316 5.99496 7.49316C5.81807 7.49316 5.64434 7.54009 5.4915 7.62915C5.33866 7.71821 5.21218 7.84621 5.12496 8.00011L1.12496 15.0001C1.03681 15.1528 0.990579 15.3261 0.990969 15.5024C0.99136 15.6787 1.03835 15.8517 1.12719 16.004C1.21602 16.1563 1.34354 16.2824 1.49681 16.3695C1.65009 16.4566 1.82367 16.5017 1.99996 16.5001H9.99996C10.1754 16.4999 10.3477 16.4536 10.4996 16.3658C10.6515 16.2779 10.7776 16.1517 10.8652 15.9997C10.9529 15.8477 10.999 15.6753 10.9989 15.4999C10.9989 15.3244 10.9527 15.1521 10.865 15.0001Z\" stroke=\"#D92D20\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M16.9588 16V7.27273H22.3707V8.40625H18.2756V11.0653H21.983V12.1946H18.2756V16H16.9588ZM25.7692 16.1449C25.3544 16.1449 24.9794 16.0682 24.6442 15.9148C24.3089 15.7585 24.0433 15.5327 23.8473 15.2372C23.6541 14.9418 23.5575 14.5795 23.5575 14.1506C23.5575 13.7812 23.6286 13.4773 23.7706 13.2386C23.9126 13 24.1044 12.8111 24.3459 12.6719C24.5874 12.5327 24.8572 12.4276 25.1555 12.3565C25.4538 12.2855 25.7578 12.2315 26.0675 12.1946C26.4595 12.1491 26.7777 12.1122 27.022 12.0838C27.2663 12.0526 27.4439 12.0028 27.5547 11.9347C27.6655 11.8665 27.7209 11.7557 27.7209 11.6023V11.5724C27.7209 11.2003 27.6158 10.9119 27.4055 10.7074C27.1982 10.5028 26.8885 10.4006 26.4766 10.4006C26.0476 10.4006 25.7095 10.4957 25.4624 10.6861C25.218 10.8736 25.049 11.0824 24.9553 11.3125L23.7578 11.0398C23.8999 10.642 24.1072 10.321 24.38 10.0767C24.6555 9.82955 24.9723 9.65057 25.3303 9.53977C25.6882 9.42614 26.0646 9.36932 26.4595 9.36932C26.7209 9.36932 26.9979 9.40057 27.2905 9.46307C27.5859 9.52273 27.8615 9.63352 28.1172 9.79545C28.3757 9.95739 28.5874 10.1889 28.7521 10.4901C28.9169 10.7884 28.9993 11.1761 28.9993 11.6534V16H27.755V15.1051H27.7038C27.6214 15.2699 27.4979 15.4318 27.3331 15.5909C27.1683 15.75 26.9567 15.8821 26.6982 15.9872C26.4396 16.0923 26.13 16.1449 25.7692 16.1449ZM26.0462 15.1222C26.3984 15.1222 26.6996 15.0526 26.9496 14.9134C27.2024 14.7741 27.3942 14.5923 27.5249 14.3679C27.6584 14.1406 27.7251 13.8977 27.7251 13.6392V12.7955C27.6797 12.8409 27.5916 12.8835 27.4609 12.9233C27.3331 12.9602 27.1868 12.9929 27.022 13.0213C26.8572 13.0469 26.6967 13.071 26.5405 13.0938C26.3842 13.1136 26.2536 13.1307 26.1484 13.1449C25.9013 13.1761 25.6754 13.2287 25.4709 13.3026C25.2692 13.3764 25.1072 13.483 24.9851 13.6222C24.8658 13.7585 24.8061 13.9403 24.8061 14.1676C24.8061 14.483 24.9226 14.7216 25.1555 14.8835C25.3885 15.0426 25.6854 15.1222 26.0462 15.1222ZM30.6964 16V9.45455H31.9705V16H30.6964ZM31.3398 8.4446C31.1183 8.4446 30.9279 8.37074 30.7688 8.22301C30.6126 8.07244 30.5344 7.89347 30.5344 7.68608C30.5344 7.47585 30.6126 7.29687 30.7688 7.14915C30.9279 6.99858 31.1183 6.9233 31.3398 6.9233C31.5614 6.9233 31.7504 6.99858 31.9066 7.14915C32.0657 7.29687 32.1452 7.47585 32.1452 7.68608C32.1452 7.89347 32.0657 8.07244 31.9066 8.22301C31.7504 8.37074 31.5614 8.4446 31.3398 8.4446ZM34.9588 7.27273V16H33.6847V7.27273H34.9588ZM39.494 16.1321C38.8491 16.1321 38.2937 15.9943 37.8278 15.7188C37.3647 15.4403 37.0067 15.0497 36.7539 14.5469C36.5039 14.0412 36.3789 13.4489 36.3789 12.7699C36.3789 12.0994 36.5039 11.5085 36.7539 10.9972C37.0067 10.4858 37.359 10.0866 37.8107 9.79972C38.2653 9.51278 38.7965 9.36932 39.4045 9.36932C39.7738 9.36932 40.1317 9.4304 40.4783 9.55256C40.8249 9.67472 41.136 9.86648 41.4116 10.1278C41.6871 10.3892 41.9045 10.7287 42.0636 11.1463C42.2227 11.5611 42.3022 12.0653 42.3022 12.6591V13.1108H37.0991V12.1562H41.0536C41.0536 11.821 40.9854 11.5241 40.8491 11.2656C40.7127 11.0043 40.521 10.7983 40.2738 10.6477C40.0295 10.4972 39.7425 10.4219 39.413 10.4219C39.055 10.4219 38.7425 10.5099 38.4755 10.6861C38.2113 10.8594 38.0067 11.0866 37.8619 11.3679C37.7198 11.6463 37.6488 11.9489 37.6488 12.2756V13.0213C37.6488 13.4588 37.7255 13.831 37.8789 14.1378C38.0352 14.4446 38.2525 14.679 38.5309 14.8409C38.8093 15 39.1346 15.0795 39.5067 15.0795C39.7482 15.0795 39.9684 15.0455 40.1673 14.9773C40.3661 14.9062 40.538 14.8011 40.6829 14.6619C40.8278 14.5227 40.9386 14.3509 41.0153 14.1463L42.2212 14.3636C42.1246 14.7187 41.9513 15.0298 41.7013 15.2969C41.4542 15.5611 41.1431 15.767 40.7681 15.9148C40.396 16.0597 39.9712 16.1321 39.494 16.1321ZM46.1662 16.1278C45.6378 16.1278 45.1662 15.9929 44.7514 15.723C44.3395 15.4503 44.0156 15.0625 43.7798 14.5597C43.5469 14.054 43.4304 13.4474 43.4304 12.7401C43.4304 12.0327 43.5483 11.4276 43.7841 10.9247C44.0227 10.4219 44.3494 10.0369 44.7642 9.76989C45.179 9.50284 45.6491 9.36932 46.1747 9.36932C46.581 9.36932 46.9077 9.4375 47.1548 9.57386C47.4048 9.70739 47.598 9.86364 47.7344 10.0426C47.8736 10.2216 47.9815 10.3793 48.0582 10.5156H48.1349V7.27273H49.4091V16H48.1648V14.9815H48.0582C47.9815 15.1207 47.8707 15.2798 47.7259 15.4588C47.5838 15.6378 47.3878 15.794 47.1378 15.9276C46.8878 16.0611 46.5639 16.1278 46.1662 16.1278ZM46.4474 15.0412C46.8139 15.0412 47.1236 14.9446 47.3764 14.7514C47.6321 14.5554 47.8253 14.2841 47.956 13.9375C48.0895 13.5909 48.1562 13.1875 48.1562 12.7273C48.1562 12.2727 48.0909 11.875 47.9602 11.5341C47.8295 11.1932 47.6378 10.9276 47.3849 10.7372C47.1321 10.5469 46.8196 10.4517 46.4474 10.4517C46.0639 10.4517 45.7443 10.5511 45.4886 10.75C45.233 10.9489 45.0398 11.2202 44.9091 11.5639C44.7813 11.9077 44.7173 12.2955 44.7173 12.7273C44.7173 13.1648 44.7827 13.5582 44.9134 13.9077C45.044 14.2571 45.2372 14.5341 45.4929 14.7386C45.7514 14.9403 46.0696 15.0412 46.4474 15.0412ZM57.4588 9.45455V10.4773H53.8835V9.45455H57.4588ZM54.8423 7.88636H56.1165V14.0781C56.1165 14.3253 56.1534 14.5114 56.2273 14.6364C56.3011 14.7585 56.3963 14.8423 56.5128 14.8878C56.6321 14.9304 56.7614 14.9517 56.9006 14.9517C57.0028 14.9517 57.0923 14.9446 57.169 14.9304C57.2457 14.9162 57.3054 14.9048 57.348 14.8963L57.5781 15.9489C57.5043 15.9773 57.3991 16.0057 57.2628 16.0341C57.1264 16.0653 56.956 16.0824 56.7514 16.0852C56.4162 16.0909 56.1037 16.0312 55.8139 15.9062C55.5241 15.7812 55.2898 15.5881 55.1108 15.3267C54.9318 15.0653 54.8423 14.7372 54.8423 14.3423V7.88636ZM61.555 16.1321C60.9414 16.1321 60.4059 15.9915 59.9485 15.7102C59.4911 15.429 59.136 15.0355 58.8832 14.5298C58.6303 14.0241 58.5039 13.4332 58.5039 12.7571C58.5039 12.0781 58.6303 11.4844 58.8832 10.9759C59.136 10.4673 59.4911 10.0724 59.9485 9.79119C60.4059 9.50994 60.9414 9.36932 61.555 9.36932C62.1687 9.36932 62.7042 9.50994 63.1616 9.79119C63.619 10.0724 63.9741 10.4673 64.2269 10.9759C64.4798 11.4844 64.6062 12.0781 64.6062 12.7571C64.6062 13.4332 64.4798 14.0241 64.2269 14.5298C63.9741 15.0355 63.619 15.429 63.1616 15.7102C62.7042 15.9915 62.1687 16.1321 61.555 16.1321ZM61.5593 15.0625C61.957 15.0625 62.2866 14.9574 62.5479 14.7472C62.8093 14.5369 63.0025 14.2571 63.1275 13.9077C63.2553 13.5582 63.3192 13.1733 63.3192 12.7528C63.3192 12.3352 63.2553 11.9517 63.1275 11.6023C63.0025 11.25 62.8093 10.9673 62.5479 10.7543C62.2866 10.5412 61.957 10.4347 61.5593 10.4347C61.1587 10.4347 60.8263 10.5412 60.5621 10.7543C60.3008 10.9673 60.1062 11.25 59.9783 11.6023C59.8533 11.9517 59.7908 12.3352 59.7908 12.7528C59.7908 13.1733 59.8533 13.5582 59.9783 13.9077C60.1062 14.2571 60.3008 14.5369 60.5621 14.7472C60.8263 14.9574 61.1587 15.0625 61.5593 15.0625ZM73.3505 13.2855V9.45455H74.6289V16H73.3761V14.8665H73.3079C73.1573 15.2159 72.9158 15.5071 72.5835 15.7401C72.2539 15.9702 71.8434 16.0852 71.3519 16.0852C70.9315 16.0852 70.5593 15.9929 70.2354 15.8082C69.9144 15.6207 69.6616 15.3438 69.4769 14.9773C69.2951 14.6108 69.2042 14.1577 69.2042 13.6179V9.45455H70.4783V13.4645C70.4783 13.9105 70.6019 14.2656 70.8491 14.5298C71.0962 14.794 71.4173 14.9261 71.8121 14.9261C72.0508 14.9261 72.288 14.8665 72.5238 14.7472C72.7624 14.6278 72.9599 14.4474 73.1161 14.206C73.2752 13.9645 73.3533 13.6577 73.3505 13.2855ZM76.3409 18.4545V9.45455H77.5852V10.5156H77.6918C77.7656 10.3793 77.8722 10.2216 78.0114 10.0426C78.1506 9.86364 78.3438 9.70739 78.5909 9.57386C78.8381 9.4375 79.1648 9.36932 79.571 9.36932C80.0994 9.36932 80.571 9.50284 80.9858 9.76989C81.4006 10.0369 81.7259 10.4219 81.9616 10.9247C82.2003 11.4276 82.3196 12.0327 82.3196 12.7401C82.3196 13.4474 82.2017 14.054 81.9659 14.5597C81.7301 15.0625 81.4063 15.4503 80.9943 15.723C80.5824 15.9929 80.1122 16.1278 79.5838 16.1278C79.1861 16.1278 78.8608 16.0611 78.608 15.9276C78.358 15.794 78.1619 15.6378 78.0199 15.4588C77.8778 15.2798 77.7685 15.1207 77.6918 14.9815H77.6151V18.4545H76.3409ZM77.5895 12.7273C77.5895 13.1875 77.6563 13.5909 77.7898 13.9375C77.9233 14.2841 78.1165 14.5554 78.3693 14.7514C78.6222 14.9446 78.9318 15.0412 79.2983 15.0412C79.679 15.0412 79.9972 14.9403 80.2528 14.7386C80.5085 14.5341 80.7017 14.2571 80.8324 13.9077C80.9659 13.5582 81.0327 13.1648 81.0327 12.7273C81.0327 12.2955 80.9673 11.9077 80.8366 11.5639C80.7088 11.2202 80.5156 10.9489 80.2571 10.75C80.0014 10.5511 79.6818 10.4517 79.2983 10.4517C78.929 10.4517 78.6165 10.5469 78.3608 10.7372C78.108 10.9276 77.9162 11.1932 77.7855 11.5341C77.6548 11.875 77.5895 12.2727 77.5895 12.7273ZM85.0213 7.27273V16H83.7472V7.27273H85.0213ZM89.4925 16.1321C88.8789 16.1321 88.3434 15.9915 87.886 15.7102C87.4286 15.429 87.0735 15.0355 86.8207 14.5298C86.5678 14.0241 86.4414 13.4332 86.4414 12.7571C86.4414 12.0781 86.5678 11.4844 86.8207 10.9759C87.0735 10.4673 87.4286 10.0724 87.886 9.79119C88.3434 9.50994 88.8789 9.36932 89.4925 9.36932C90.1062 9.36932 90.6417 9.50994 91.0991 9.79119C91.5565 10.0724 91.9116 10.4673 92.1644 10.9759C92.4173 11.4844 92.5437 12.0781 92.5437 12.7571C92.5437 13.4332 92.4173 14.0241 92.1644 14.5298C91.9116 15.0355 91.5565 15.429 91.0991 15.7102C90.6417 15.9915 90.1062 16.1321 89.4925 16.1321ZM89.4968 15.0625C89.8945 15.0625 90.2241 14.9574 90.4854 14.7472C90.7468 14.5369 90.94 14.2571 91.065 13.9077C91.1928 13.5582 91.2567 13.1733 91.2567 12.7528C91.2567 12.3352 91.1928 11.9517 91.065 11.6023C90.94 11.25 90.7468 10.9673 90.4854 10.7543C90.2241 10.5412 89.8945 10.4347 89.4968 10.4347C89.0962 10.4347 88.7638 10.5412 88.4996 10.7543C88.2383 10.9673 88.0437 11.25 87.9158 11.6023C87.7908 11.9517 87.7283 12.3352 87.7283 12.7528C87.7283 13.1733 87.7908 13.5582 87.9158 13.9077C88.0437 14.2571 88.2383 14.5369 88.4996 14.7472C88.7638 14.9574 89.0962 15.0625 89.4968 15.0625ZM95.8707 16.1449C95.456 16.1449 95.081 16.0682 94.7457 15.9148C94.4105 15.7585 94.1449 15.5327 93.9489 15.2372C93.7557 14.9418 93.6591 14.5795 93.6591 14.1506C93.6591 13.7812 93.7301 13.4773 93.8722 13.2386C94.0142 13 94.206 12.8111 94.4474 12.6719C94.6889 12.5327 94.9588 12.4276 95.2571 12.3565C95.5554 12.2855 95.8594 12.2315 96.169 12.1946C96.5611 12.1491 96.8793 12.1122 97.1236 12.0838C97.3679 12.0526 97.5455 12.0028 97.6562 11.9347C97.767 11.8665 97.8224 11.7557 97.8224 11.6023V11.5724C97.8224 11.2003 97.7173 10.9119 97.5071 10.7074C97.2997 10.5028 96.9901 10.4006 96.5781 10.4006C96.1491 10.4006 95.8111 10.4957 95.5639 10.6861C95.3196 10.8736 95.1506 11.0824 95.0568 11.3125L93.8594 11.0398C94.0014 10.642 94.2088 10.321 94.4815 10.0767C94.7571 9.82955 95.0739 9.65057 95.4318 9.53977C95.7898 9.42614 96.1662 9.36932 96.5611 9.36932C96.8224 9.36932 97.0994 9.40057 97.392 9.46307C97.6875 9.52273 97.9631 9.63352 98.2188 9.79545C98.4773 9.95739 98.6889 10.1889 98.8537 10.4901C99.0185 10.7884 99.1009 11.1761 99.1009 11.6534V16H97.8565V15.1051H97.8054C97.723 15.2699 97.5994 15.4318 97.4347 15.5909C97.2699 15.75 97.0582 15.8821 96.7997 15.9872C96.5412 16.0923 96.2315 16.1449 95.8707 16.1449ZM96.1477 15.1222C96.5 15.1222 96.8011 15.0526 97.0511 14.9134C97.304 14.7741 97.4957 14.5923 97.6264 14.3679C97.7599 14.1406 97.8267 13.8977 97.8267 13.6392V12.7955C97.7813 12.8409 97.6932 12.8835 97.5625 12.9233C97.4347 12.9602 97.2884 12.9929 97.1236 13.0213C96.9588 13.0469 96.7983 13.071 96.642 13.0938C96.4858 13.1136 96.3551 13.1307 96.25 13.1449C96.0028 13.1761 95.777 13.2287 95.5724 13.3026C95.3707 13.3764 95.2088 13.483 95.0866 13.6222C94.9673 13.7585 94.9077 13.9403 94.9077 14.1676C94.9077 14.483 95.0241 14.7216 95.2571 14.8835C95.4901 15.0426 95.7869 15.1222 96.1477 15.1222ZM103.248 16.1278C102.72 16.1278 102.248 15.9929 101.833 15.723C101.422 15.4503 101.098 15.0625 100.862 14.5597C100.629 14.054 100.512 13.4474 100.512 12.7401C100.512 12.0327 100.63 11.4276 100.866 10.9247C101.105 10.4219 101.431 10.0369 101.846 9.76989C102.261 9.50284 102.731 9.36932 103.257 9.36932C103.663 9.36932 103.99 9.4375 104.237 9.57386C104.487 9.70739 104.68 9.86364 104.816 10.0426C104.956 10.2216 105.064 10.3793 105.14 10.5156H105.217V7.27273H106.491V16H105.247V14.9815H105.14C105.064 15.1207 104.953 15.2798 104.808 15.4588C104.666 15.6378 104.47 15.794 104.22 15.9276C103.97 16.0611 103.646 16.1278 103.248 16.1278ZM103.529 15.0412C103.896 15.0412 104.206 14.9446 104.458 14.7514C104.714 14.5554 104.907 14.2841 105.038 13.9375C105.172 13.5909 105.238 13.1875 105.238 12.7273C105.238 12.2727 105.173 11.875 105.042 11.5341C104.912 11.1932 104.72 10.9276 104.467 10.7372C104.214 10.5469 103.902 10.4517 103.529 10.4517C103.146 10.4517 102.826 10.5511 102.571 10.75C102.315 10.9489 102.122 11.2202 101.991 11.5639C101.863 11.9077 101.799 12.2955 101.799 12.7273C101.799 13.1648 101.865 13.5582 101.995 13.9077C102.126 14.2571 102.319 14.5341 102.575 14.7386C102.833 14.9403 103.152 15.0412 103.529 15.0412Z\" fill=\"#D92D20\"/>\n </svg>\n );\n}\n","import { memo, type MouseEvent, type ReactNode } from 'react';\n\nexport interface IconButtonProps {\n icon: ReactNode;\n 'aria-label': string;\n title?: string;\n variant?: 'default' | 'primary' | 'solid' | 'ghost' | 'destructive';\n disabled?: boolean;\n onClick?: (e: MouseEvent<HTMLButtonElement>) => void;\n}\n\nexport const IconButton = memo(function IconButton({\n icon,\n variant = 'default',\n disabled,\n onClick,\n title,\n 'aria-label': ariaLabel,\n}: IconButtonProps) {\n return (\n <button\n type=\"button\"\n className={`mr-icon-button mr-icon-button--${variant}`}\n aria-label={ariaLabel}\n title={title}\n disabled={disabled}\n onClick={onClick}\n >\n {icon}\n </button>\n );\n});\n","import { memo, type MouseEvent } from 'react';\nimport { X } from 'lucide-react';\nexport interface TagChipProps {\n label: string;\n removable?: boolean;\n onRemove?: () => void;\n onClick?: (e: MouseEvent<HTMLSpanElement>) => void;\n}\n\nexport const TagChip = memo(function TagChip({ label, removable, onRemove, onClick }: TagChipProps) {\n return (\n <span className=\"mr-tag-chip\" onClick={onClick}>\n <span className=\"mr-tag-chip__label\">{label}</span>\n {removable && (\n <button\n type=\"button\"\n className=\"mr-tag-chip__remove\"\n aria-label={`Remove ${label}`}\n onClick={(e) => {\n e.stopPropagation();\n onRemove?.();\n }}\n >\n <X size={12} aria-hidden />\n </button>\n )}\n </span>\n );\n});\n","import { memo, useEffect, useRef, useState } from 'react';\n\nconst blobCache = new Map<string, Blob>();\n\nexport interface ThumbnailProps {\n url: string | null;\n size?: number;\n alt?: string;\n}\n\nexport const Thumbnail = memo(function Thumbnail({ url, size, alt }: ThumbnailProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const bitmapRef = useRef<ImageBitmap | null>(null);\n const [decoded, setDecoded] = useState(false);\n const [errored, setErrored] = useState(false);\n const decodedUrlRef = useRef<string | null>(null);\n\n useEffect(() => {\n if (url && decoded && decodedUrlRef.current !== null) return;\n\n setErrored(false);\n\n if (!url) {\n setDecoded(false);\n return;\n }\n\n let cancelled = false;\n const controller = new AbortController();\n\n const paint = (bitmap: ImageBitmap) => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n canvas.width = bitmap.width;\n canvas.height = bitmap.height;\n const bmpCtx = canvas.getContext('bitmaprenderer');\n if (bmpCtx) {\n bmpCtx.transferFromImageBitmap(bitmap);\n bitmapRef.current = null;\n } else {\n const ctx2d = canvas.getContext('2d');\n ctx2d?.drawImage(bitmap, 0, 0);\n bitmap.close();\n bitmapRef.current = null;\n }\n setDecoded(true);\n };\n\n const nextFrame = () =>\n new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));\n\n (async () => {\n try {\n let blob = blobCache.get(url) ?? null;\n if (!blob) {\n const res = await fetch(url, { signal: controller.signal });\n if (!res.ok) throw new Error(`thumbnail fetch ${res.status}`);\n blob = await res.blob();\n blobCache.set(url, blob);\n }\n if (cancelled) return;\n\n const probe = await createImageBitmap(blob);\n if (cancelled) { probe.close(); return; }\n\n await nextFrame();\n if (cancelled) { probe.close(); return; }\n\n const dpr = typeof window === 'undefined' ? 1 : window.devicePixelRatio || 1;\n const box = wrapRef.current;\n const boxW = size || box?.clientWidth || probe.width;\n const boxH = size || box?.clientHeight || probe.height;\n const boxRatio = boxW > 0 && boxH > 0 ? boxW / boxH : probe.width / probe.height;\n const srcRatio = probe.width / probe.height;\n\n let sw = probe.width;\n let sh = probe.height;\n if (srcRatio > boxRatio) {\n sw = Math.max(1, Math.round(probe.height * boxRatio));\n } else {\n sh = Math.max(1, Math.round(probe.width / boxRatio));\n }\n const sx = Math.round((probe.width - sw) / 2);\n const sy = 0;\n\n const targetW = Math.max(1, Math.round(boxW * dpr));\n const targetH = Math.max(1, Math.round(boxH * dpr));\n const bitmap = await createImageBitmap(blob, sx, sy, sw, sh, {\n resizeWidth: targetW,\n resizeHeight: targetH,\n resizeQuality: 'high',\n });\n probe.close();\n if (cancelled) { bitmap.close(); return; }\n bitmapRef.current = bitmap;\n decodedUrlRef.current = url;\n paint(bitmap);\n } catch (err) {\n if (cancelled || (err instanceof DOMException && err.name === 'AbortError')) return;\n setErrored(true);\n }\n })();\n\n return () => {\n cancelled = true;\n controller.abort();\n bitmapRef.current?.close();\n bitmapRef.current = null;\n };\n }, [url, size]);\n\n const style = size ? { width: size, height: size } : undefined;\n\n if (!url || errored) {\n return (\n <div className=\"mr-thumbnail mr-thumbnail--empty\" style={style} role=\"img\" aria-label={alt ?? ''}>\n <ThumbnailFallbackIcon />\n </div>\n );\n }\n\n return (\n <div ref={wrapRef} className=\"mr-thumbnail\" style={style} role=\"img\" aria-label={alt ?? ''}>\n {!decoded && <div className=\"mr-thumbnail__placeholder mr-skeleton\" />}\n <canvas\n ref={canvasRef}\n className={`mr-thumbnail__img${decoded ? ' mr-thumbnail__img--ready' : ''}`}\n aria-hidden\n />\n </div>\n );\n});\n\nfunction ThumbnailFallbackIcon() {\n return (\n <svg\n className=\"mr-thumbnail__fallback-icon\"\n viewBox=\"0 0 46 46\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n >\n <path\n d=\"M26.8333 3.83333H11.5C9.38433 3.83333 7.66667 5.55099 7.66667 7.66667V38.3333C7.66667 40.449 9.38433 42.1667 11.5 42.1667H34.5C36.6157 42.1667 38.3333 40.449 38.3333 38.3333V15.3333L26.8333 3.83333\"\n stroke=\"currentColor\"\n strokeWidth=\"3.06667\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M26.8333 3.83333V15.3333H38.3333\"\n stroke=\"currentColor\"\n strokeWidth=\"3.06667\"\n strokeLinecap=\"round\"\n />\n <path d=\"M17.25 24.9167H28.75\" stroke=\"currentColor\" strokeWidth=\"3.06667\" strokeLinecap=\"round\" />\n <path d=\"M17.25 32.5833H24.9167\" stroke=\"currentColor\" strokeWidth=\"3.06667\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { ChevronLeft, EllipsisVertical } from 'lucide-react';\n\nexport interface OverflowMenuItem {\n key: string;\n label: string;\n icon?: ReactNode;\n destructive?: boolean;\n subPanel?: (onBack: () => void, onClose: () => void) => ReactNode;\n onSelect?: (triggerRect: DOMRect) => void;\n}\n\nexport interface OverflowMenuProps {\n items: OverflowMenuItem[];\n 'aria-label'?: string;\n}\n\nconst ITEM_HEIGHT = 36;\nconst MENU_PADDING = 8;\nconst GAP = 4;\n\nexport function OverflowMenu({ items, 'aria-label': ariaLabel = 'More options' }: OverflowMenuProps) {\n const [coords, setCoords] = useState<{ right: number; top?: number; bottom?: number } | null>(null);\n const [activeSubPanel, setActiveSubPanel] = useState<string | null>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const open = coords !== null;\n\n const close = () => { setCoords(null); setActiveSubPanel(null); };\n\n const place = () => {\n const el = triggerRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n const right = window.innerWidth - r.right;\n const estHeight = items.length * ITEM_HEIGHT + MENU_PADDING;\n const spaceBelow = window.innerHeight - r.bottom;\n if (spaceBelow < estHeight + GAP && r.top > estHeight + GAP) {\n setCoords({ right, bottom: window.innerHeight - r.top + GAP });\n } else {\n setCoords({ right, top: r.bottom + GAP });\n }\n };\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n const node = e.target as Node;\n if (triggerRef.current?.contains(node) || menuRef.current?.contains(node)) return;\n // Ignore clicks inside portalled elements (dropdowns opened by sub-panels).\n if ((node as Element).closest?.('[data-mr-portal]')) return;\n close();\n };\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') close(); };\n document.addEventListener('mousedown', onDown);\n document.addEventListener('keydown', onKey);\n window.addEventListener('scroll', close, true);\n return () => {\n document.removeEventListener('mousedown', onDown);\n document.removeEventListener('keydown', onKey);\n window.removeEventListener('scroll', close, true);\n };\n }, [open]);\n\n const activeItem = activeSubPanel ? items.find((i) => i.key === activeSubPanel) : null;\n\n return (\n <>\n <button\n ref={triggerRef}\n type=\"button\"\n className={`mr-overflow-btn${open ? ' mr-overflow-btn--active' : ''}`}\n aria-label={ariaLabel}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={(e) => { e.stopPropagation(); if (open) close(); else place(); }}\n >\n <EllipsisVertical size={16} aria-hidden />\n </button>\n {open && typeof document !== 'undefined' && createPortal(\n <div\n ref={menuRef}\n className=\"mr-overflow-menu-wrap\"\n data-mr-portal\n style={{ top: coords.top, bottom: coords.bottom, right: coords.right }}\n onClick={(e) => e.stopPropagation()}\n >\n {activeItem?.subPanel ? (\n <div className=\"mr-overflow-subpanel\">\n <div className=\"mr-overflow-subpanel__back\">\n <button\n type=\"button\"\n className=\"mr-overflow-subpanel__back-btn\"\n onClick={() => setActiveSubPanel(null)}\n >\n <ChevronLeft size={16} aria-hidden />\n Back\n </button>\n </div>\n {activeItem.subPanel(() => setActiveSubPanel(null), close)}\n </div>\n ) : (\n <ul className=\"mr-overflow-menu\" role=\"menu\">\n {items.map((item) => (\n <li key={item.key}>\n <button\n type=\"button\"\n role=\"menuitem\"\n className={`mr-overflow-menu__item${item.destructive ? ' mr-overflow-menu__item--destructive' : ''}`}\n onClick={(e) => {\n e.stopPropagation();\n if (item.subPanel) {\n setActiveSubPanel(item.key);\n } else if (item.onSelect) {\n const triggerRect = triggerRef.current?.getBoundingClientRect() ?? new DOMRect();\n close();\n item.onSelect(triggerRect);\n }\n }}\n >\n {item.icon && <span className=\"mr-overflow-menu__icon\">{item.icon}</span>}\n {item.label}\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>,\n document.body,\n )}\n </>\n );\n}\n","export function AttachContextIcon({ size = 28 }: { size?: number }) {\n return (\n <span className=\"mr-attach-orbit\" style={{ width: size, height: size }}>\n <span className=\"mr-attach-orbit__ring\" aria-hidden />\n <span className=\"mr-attach-orbit__face\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n >\n <path\n d=\"M9.3333 1.3335V4.0002C9.3333 4.3538 9.4738 4.6929 9.7238 4.943C9.9739 5.193 10.313 5.3335 10.6667 5.3335H13.3333M6 10.0002H10M8 12.0002V8.0002M10 1.3335H3.99999C3.64637 1.3335 3.30723 1.47397 3.05718 1.72402C2.80713 1.97407 2.66666 2.31321 2.66666 2.66683V13.3335C2.66666 13.6871 2.80713 14.0263 3.05718 14.2763C3.30723 14.5264 3.64637 14.6668 3.99999 14.6668H12C12.3536 14.6668 12.6928 14.5264 12.9428 14.2763C13.1928 14.0263 13.3333 13.6871 13.3333 13.3335V4.6668L10 1.3335Z\"\n stroke=\"#215FFF\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n </span>\n );\n}\n","'use client';\n\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useStore } from 'zustand';\nimport { Check, Search, Plus, ChevronsUpDown } from 'lucide-react';\nimport { useSdk } from '../../connection/useSdk';\nimport { useCasesConnection } from '../../connection/useCasesConnection';\nimport { useRecordsConnection } from '../../connection/useRecordsConnection';\nimport { useRecordsActions } from './RecordsActionsContext';\nimport { PresetSelect } from '../../components/PresetSelect/PresetSelect';\n\ninterface AddToContextSubPanelProps {\n recordId: string;\n linkedCaseIds: string[];\n onClose: () => void;\n}\n\nconst CASE_TYPE_OPTIONS = [\n { value: 'OP', label: 'Out-patient' },\n { value: 'IP', label: 'In-patient' },\n { value: 'EM', label: 'Emergency' },\n { value: 'HH', label: 'Home Health' },\n { value: 'DC', label: 'Day Care' },\n];\n\nconst todayISO = () => new Date().toISOString().slice(0, 10);\n\nexport function AddToContextSubPanel({\n recordId,\n linkedCaseIds,\n onClose,\n}: AddToContextSubPanelProps) {\n const { store } = useSdk();\n const { createCase } = useCasesConnection();\n const { editRecord } = useRecordsConnection();\n const { onToast } = useRecordsActions();\n\n const caseIds = useStore(store, (s) => s.cases.ids);\n const casesById = useStore(store, (s) => s.cases.byId);\n\n const cases = useMemo(\n () => caseIds.map((id) => casesById[id]).filter(Boolean),\n [caseIds, casesById],\n );\n\n const [selected, setSelected] = useState<string | null>(\n linkedCaseIds.length > 0 ? linkedCaseIds[0] : null,\n );\n\n // Dropdown state\n const [dropPos, setDropPos] = useState<{\n top?: number; bottom?: number; left: number; width: number; maxH: number;\n } | null>(null);\n const [query, setQuery] = useState('');\n const [creating, setCreating] = useState(false);\n const [newName, setNewName] = useState('');\n const [newType, setNewType] = useState('OP');\n const [newDate, setNewDate] = useState(todayISO());\n const [saving, setSaving] = useState(false);\n\n const fieldRef = useRef<HTMLButtonElement>(null);\n const dropRef = useRef<HTMLDivElement>(null);\n const dropOpen = dropPos !== null;\n\n const selectedCase = selected ? casesById[selected] : null;\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n return q ? cases.filter((c) => c.name.toLowerCase().includes(q)) : cases;\n }, [cases, query]);\n\n const openDrop = () => {\n const el = fieldRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n const MARGIN = 16; // keep dropdown this far from viewport edges\n const GAP = 4;\n const spaceBelow = window.innerHeight - r.bottom - MARGIN;\n const spaceAbove = r.top - MARGIN;\n // Prefer above if there's more room, otherwise open below.\n if (spaceAbove > spaceBelow && spaceAbove >= 120) {\n const maxH = Math.min(280, spaceAbove);\n setDropPos({ bottom: window.innerHeight - r.top + GAP, left: r.left, width: r.width, maxH });\n } else {\n const maxH = Math.min(280, Math.max(120, spaceBelow));\n setDropPos({ top: r.bottom + GAP, left: r.left, width: r.width, maxH });\n }\n };\n\n useEffect(() => {\n if (!dropOpen) { setQuery(''); setCreating(false); setNewName(''); return; }\n const onDown = (e: MouseEvent) => {\n const t = e.target as Node;\n if (fieldRef.current?.contains(t) || dropRef.current?.contains(t)) return;\n if ((t as Element).closest?.('[data-mr-portal]')) return;\n setDropPos(null);\n };\n document.addEventListener('mousedown', onDown);\n return () => document.removeEventListener('mousedown', onDown);\n }, [dropOpen]);\n\n const handleAdd = async () => {\n if (!selected) return;\n // A record belongs to one case at a time — replace, don't append.\n try {\n await editRecord(recordId, { cases: [selected] });\n onToast?.(`Moved to ${selectedCase?.name ?? 'care context'}`, 'success');\n onClose();\n } catch {\n onToast?.('Failed to add to care context', 'error');\n }\n };\n\n const handleCreate = async () => {\n const name = newName.trim();\n if (!name) return;\n setSaving(true);\n try {\n const occurred_at = newDate\n ? Math.floor(new Date(newDate + 'T00:00:00').getTime() / 1000)\n : undefined;\n const id = await createCase({ display_name: name, type: newType, occurred_at });\n // Create and immediately link — no extra confirmation step needed.\n await editRecord(recordId, { cases: [id] });\n onToast?.(`Created and added to \"${name}\"`, 'success');\n onClose();\n } catch {\n onToast?.('Failed to create care context', 'error');\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <div className=\"mr-ctx-subpanel\">\n <div className=\"mr-ctx-subpanel__body\">\n <p className=\"mr-ctx-subpanel__label\">Adding to care context</p>\n\n {/* Closed trigger field */}\n <button\n ref={fieldRef}\n type=\"button\"\n className={`mr-ctx-subpanel__field${dropOpen ? ' mr-ctx-subpanel__field--open' : ''}`}\n onClick={() => dropOpen ? setDropPos(null) : openDrop()}\n >\n <span className={selectedCase ? 'mr-ctx-subpanel__field-value' : 'mr-ctx-subpanel__field-placeholder'}>\n {selectedCase?.name ?? 'Search or select'}\n </span>\n <ChevronsUpDown size={16} aria-hidden className=\"mr-ctx-subpanel__field-chevron\" />\n </button>\n </div>\n\n {/* Fixed bottom button */}\n <div className=\"mr-ctx-subpanel__footer\">\n <button\n type=\"button\"\n className=\"mr-ctx-subpanel__add-btn\"\n disabled={!selected || (linkedCaseIds.length === 1 && linkedCaseIds[0] === selected)}\n onClick={() => void handleAdd()}\n >\n Add to care context\n </button>\n </div>\n\n {/* Portalled dropdown */}\n {dropOpen && typeof document !== 'undefined' && createPortal(\n <div\n ref={dropRef}\n className=\"mr-ctx-subpanel__drop\"\n data-mr-portal\n style={{\n ...(dropPos!.top !== undefined ? { top: dropPos!.top } : { bottom: dropPos!.bottom }),\n left: dropPos!.left,\n width: dropPos!.width,\n maxHeight: dropPos!.maxH,\n }}\n >\n {!creating ? (\n <>\n <div className=\"mr-ctx-subpanel__search-row\">\n <Search size={14} className=\"mr-ctx-subpanel__search-icon\" aria-hidden />\n <input\n type=\"text\"\n className=\"mr-ctx-subpanel__search-input\"\n placeholder=\"Search care context...\"\n autoFocus\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n />\n </div>\n\n <ul className=\"mr-ctx-subpanel__list\">\n {filtered.length === 0 ? (\n <li className=\"mr-ctx-subpanel__empty\">No cases found</li>\n ) : (\n filtered.map((c) => {\n const isCurrent = linkedCaseIds.includes(c.id);\n return (\n <li key={c.id}>\n <button\n type=\"button\"\n className={`mr-ctx-subpanel__option${selected === c.id ? ' mr-ctx-subpanel__option--active' : ''}`}\n onClick={() => { setSelected(c.id); setDropPos(null); }}\n >\n <span>{c.name}</span>\n {isCurrent\n ? <span className=\"mr-ctx-subpanel__option-tag\">Current</span>\n : selected === c.id && <Check size={14} aria-hidden />}\n </button>\n </li>\n );\n })\n )}\n </ul>\n\n <div className=\"mr-ctx-subpanel__panel-footer\">\n <button\n type=\"button\"\n className=\"mr-ctx-subpanel__create-btn\"\n onClick={() => setCreating(true)}\n >\n <Plus size={14} aria-hidden />\n Add new care context\n </button>\n </div>\n </>\n ) : (\n <div className=\"mr-ctx-subpanel__create-form\">\n <input\n type=\"text\"\n className=\"mr-ctx-subpanel__create-input\"\n placeholder=\"Case name\"\n autoFocus\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Escape') { setCreating(false); setNewName(''); } }}\n />\n <PresetSelect\n value={newType}\n options={CASE_TYPE_OPTIONS}\n onChange={setNewType}\n active={newType !== 'OP'}\n />\n <input\n type=\"date\"\n className=\"mr-ctx-subpanel__create-input\"\n value={newDate}\n max={todayISO()}\n onChange={(e) => setNewDate(e.target.value)}\n />\n <div className=\"mr-ctx-subpanel__create-actions\">\n <button type=\"button\" className=\"mr-ctx-subpanel__create-cancel\"\n onClick={() => { setCreating(false); setNewName(''); }}>\n Cancel\n </button>\n <button type=\"button\" className=\"mr-ctx-subpanel__create-save\"\n disabled={!newName.trim() || saving}\n onClick={() => void handleCreate()}>\n {saving ? '…' : 'Create and Add'}\n </button>\n </div>\n </div>\n )}\n </div>,\n document.body,\n )}\n </div>\n );\n}\n","import { createContext, useContext } from 'react';\nexport interface RecordsActions {\n onCopyToNote?: (text: string, anchor?: { x: number; y: number }) => void | Promise<void>;\n attachedIds?: Set<string>;\n onAttachToContext?: (records: Array<{ documentId: string; name: string }>) => void | Promise<void>;\n onRemoveAttachment?: (documentId: string) => void | Promise<void>;\n onRequestDelete?: (documentId: string) => void;\n onToast?: (message: string, type?: 'success' | 'error') => void;\n}\n\nconst RecordsActionsContext = createContext<RecordsActions>({});\n\nexport const RecordsActionsProvider = RecordsActionsContext.Provider;\n\nexport function useRecordsActions(): RecordsActions {\n return useContext(RecordsActionsContext);\n}\n","import { useCallback } from 'react';\nimport { useStore } from 'zustand';\nimport { epochToDisplay } from '../../helpers/formatters';\nimport { vitalsToNoteText, parseVitals } from '../../helpers/smartReport';\nimport { copyRecordNotes } from './copyRecordNotes';\nimport { useInViewport } from './useInViewport';\nimport { useRecordsActions } from './RecordsActionsContext';\nimport {\n useRecordById,\n useThumbnailUrl,\n useIsSelected,\n useSdk,\n} from '../../connection';\nimport { getCore } from '../../connection/workerClient';\nimport type { RecordItemProps } from '../../helpers/mappings';\nimport type { RecordContainerProps } from './RecordCardContainer';\n\nexport interface RecordItemResult {\n ref: React.RefObject<HTMLDivElement | null>;\n props: RecordItemProps;\n}\n\nexport function useRecordItem({ id, selectionMode, maxSelectable }: RecordContainerProps): RecordItemResult | null {\n const { store, bid, patientId } = useSdk();\n const { onCopyToNote, attachedIds, onAttachToContext, onRemoveAttachment, onRequestDelete } =\n useRecordsActions();\n const { ref, seen } = useInViewport<HTMLDivElement>();\n const record = useRecordById(id);\n const thumbnailUrl = useThumbnailUrl(id);\n const pendingSelected = useIsSelected(id);\n const pendingCount = useStore(store, (s) => s.selection.recordIds.size);\n\n const attachedCount = attachedIds?.size ?? 0;\n const attached = attachedIds?.has(id) ?? false;\n const checked = pendingSelected || attached;\n const attachDisabled = attachedCount >= maxSelectable && !attached;\n const selectDisabled = attachedCount + pendingCount >= maxSelectable && !checked;\n const pendingLimit = Math.max(0, maxSelectable - attachedCount);\n\n const handleOpen = useCallback(\n () => store.getState().selection.openDetail(id),\n [store, id],\n );\n\n const handleSelect = useCallback(() => {\n if (attached) {\n void onRemoveAttachment?.(id);\n } else {\n store.getState().selection.toggleRecord(id, pendingLimit);\n }\n }, [store, id, pendingLimit, attached, onRemoveAttachment]);\n\n const handleAddToContext = useCallback(() => {\n if (attached) {\n void onRemoveAttachment?.(id);\n } else {\n const r = store.getState().records.byId[id];\n if (r && onAttachToContext) void onAttachToContext([{ documentId: id, name: r.title }]);\n }\n }, [store, id, attached, onAttachToContext, onRemoveAttachment]);\n\n const handleCopyNotes = useCallback(\n async (_id: string, anchor?: { x: number; y: number }) => {\n const r = store.getState().records.byId[id];\n if (!r) return;\n\n let text = `${r.title} · ${r.type}`;\n\n try {\n const report = await getCore().getSmartReport({ documentId: id, bid, patientId });\n if (report) {\n const vitals = parseVitals(report as unknown as Parameters<typeof parseVitals>[0]);\n if (vitals.length > 0) {\n text = vitalsToNoteText(vitals, {\n reportName: r.title,\n date: epochToDisplay(r.createdAtEpoch),\n });\n }\n }\n } catch { /* fall back to title · type */ }\n\n if (onCopyToNote) void onCopyToNote(text, anchor);\n else void copyRecordNotes(r);\n },\n [store, id, bid, patientId, onCopyToNote],\n );\n\n const handleDelete = useCallback(() => {\n onRequestDelete?.(id);\n }, [onRequestDelete, id]);\n\n if (!record) return null;\n\n return {\n ref,\n props: {\n record,\n selectionMode,\n selected: checked,\n thumbnailUrl: seen ? thumbnailUrl : null,\n inContext: attached,\n attachDisabled,\n selectDisabled,\n isUploading: record.syncState === 'uploading',\n isUploadFailed: record.syncState === 'upload_failure',\n isAnalysing: record.isAnalysing,\n isSmart: record.isSmart,\n dateDisplay: epochToDisplay(record.createdAtEpoch),\n onOpen: handleOpen,\n onSelect: handleSelect,\n onAddToContext: handleAddToContext,\n onCopyNotes: handleCopyNotes,\n onDelete: handleDelete,\n },\n };\n}\n","import type { RecordItem } from '../../helpers/mappings';\n\nexport async function copyRecordNotes(record: RecordItem): Promise<void> {\n const text = `${record.title} · ${record.type}`;\n await navigator.clipboard.writeText(text);\n}\n","import { useEffect, useRef, useState } from 'react';\n\nexport function useInViewport<T extends HTMLElement>() {\n const ref = useRef<T>(null);\n const [seen, setSeen] = useState(false);\n\n useEffect(() => {\n if (seen) return;\n const el = ref.current;\n if (!el) return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((e) => e.isIntersecting)) {\n setSeen(true);\n observer.disconnect();\n }\n },\n { rootMargin: '100px' }, \n );\n observer.observe(el);\n return () => observer.disconnect();\n }, [seen]);\n\n return { ref, seen };\n}\n","import { memo } from 'react';\nimport { RecordRow } from '../../components/RecordRow/RecordRow';\nimport { useRecordItem } from './useRecordItem';\nimport type { RecordContainerProps } from './RecordCardContainer';\n\nexport const RecordRowContainer = memo(function RecordRowContainer(props: RecordContainerProps) {\n const item = useRecordItem(props);\n if (!item) return null;\n return (\n <div ref={item.ref} className=\"mr-record-slot\">\n <RecordRow {...item.props} />\n </div>\n );\n});\n","import { memo, useMemo } from 'react';\nimport { Check, Copy, Eye, FolderPlus, Trash2 } from 'lucide-react';\nimport { AttachContextIcon } from '../icons/AttachContextIcon';\n\nimport { AddToContextSubPanel } from '../../views/RecordsView/AddToContextSubPanel';\nimport { Badge } from '../Badge/Badge';\nimport { IconButton } from '../IconButton/IconButton';\nimport { TagChip } from '../TagChip/TagChip';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { OverflowMenu } from '../OverflowMenu/OverflowMenu';\nimport { Thumbnail } from '../Thumbnail/Thumbnail';\nimport { RecordItemProps } from '../../helpers/mappings';\n\n/** Tags shown before collapsing the rest into a \"+N\" chip (matches Figma's 280px cap). */\nconst MAX_VISIBLE_TAGS = 4;\n\nexport type RecordRowProps = RecordItemProps;\n\nexport const RecordRow = memo(\n function RecordRow({\n record,\n selected,\n selectionMode,\n thumbnailUrl,\n inContext,\n attachDisabled,\n selectDisabled,\n isUploading,\n isUploadFailed,\n isSmart,\n isAnalysing,\n dateDisplay,\n onSelect,\n onOpen,\n onAddToContext,\n onCopyNotes,\n onDelete,\n }: RecordRowProps) {\n const overflowItems = useMemo(() => [\n {\n key: 'case',\n label: 'Add to care context',\n icon: <FolderPlus size={16} aria-hidden />,\n subPanel: (_onBack: () => void, onClose: () => void) => (\n <AddToContextSubPanel\n recordId={record.id}\n linkedCaseIds={record.cases}\n onClose={onClose}\n />\n ),\n },\n {\n key: 'delete',\n label: 'Delete record',\n icon: <Trash2 size={16} aria-hidden />,\n destructive: true,\n onSelect: () => onDelete(record.id),\n },\n ], [record.id, record.cases, onDelete]);\n\n const visibleTags = record.tags.slice(0, MAX_VISIBLE_TAGS);\n const overflowCount = record.tags.length - visibleTags.length;\n const selectBlocked = selectionMode && selectDisabled && !selected;\n const handleRowClick = () => {\n if (selectionMode) {\n if (!selectBlocked) onSelect(record.id);\n } else {\n onOpen(record.id);\n }\n };\n\n return (\n <article\n className={`mr-record-row${selected ? ' mr-record-row--selected' : ''}${selectBlocked ? ' mr-record-row--disabled' : ''}`}\n onClick={handleRowClick}\n >\n {selectionMode && (\n <span\n className={`mr-record-row__checkbox${selected ? ' mr-record-row__checkbox--checked' : ''}${\n selectBlocked ? ' mr-record-row__checkbox--disabled' : ''\n }`}\n aria-hidden\n >\n {selected && <Check size={14} strokeWidth={3} />}\n </span>\n )}\n <div className=\"mr-record-row__thumb\">\n <Thumbnail url={thumbnailUrl ?? null} alt={record.title} />\n </div>\n\n <div className=\"mr-record-row__main\">\n <div className=\"mr-record-row__heading\">\n <span className=\"mr-record-row__title\">{record.title}</span>\n {isUploading\n ? <Badge variant=\"uploading\" label=\"Uploading\" />\n : isUploadFailed\n ? <Badge variant=\"upload_failure\" label=\"Upload failure\" />\n : isAnalysing\n ? <Badge variant=\"analysing\" label=\"Analysing\" />\n : isSmart && <Badge variant=\"smart\" label=\"Smart\" />}\n </div>\n <span className=\"mr-record-row__date\">{dateDisplay}</span>\n </div>\n\n <div className=\"mr-record-row__meta\">\n {record.tags.length > 0 && (\n <div className=\"mr-record-row__tags\">\n {visibleTags.map((t) => (\n <TagChip key={t} label={t} />\n ))}\n {overflowCount > 0 && (\n <Tooltip content={record.tags.join(', ')}>\n <TagChip label={`+${overflowCount}`} onClick={(e) => e.stopPropagation()} />\n </Tooltip>\n )}\n </div>\n )}\n <div className=\"mr-record-row__actions\">\n {selectionMode ? (\n <Tooltip content=\"View record\">\n <IconButton\n variant=\"primary\"\n aria-label=\"View record\"\n icon={<Eye size={16} aria-hidden />}\n onClick={(e) => {\n e.stopPropagation();\n onOpen(record.id);\n }}\n />\n </Tooltip>\n ) : inContext ? (\n <Tooltip content=\"Remove from Context\">\n <IconButton\n variant=\"solid\"\n aria-label=\"Remove from Context\"\n icon={<Check size={16} strokeWidth={3} aria-hidden />}\n onClick={(e) => {\n e.stopPropagation();\n onAddToContext(record.id);\n }}\n />\n </Tooltip>\n ) : (\n <Tooltip content=\"Add to session context\">\n <button\n type=\"button\"\n className=\"mr-attach-context-btn\"\n aria-label=\"Attach to Session Context\"\n disabled={attachDisabled}\n onClick={(e) => {\n e.stopPropagation();\n onAddToContext(record.id);\n }}\n >\n <AttachContextIcon size={28} />\n </button>\n </Tooltip>\n )}\n \n {!selectionMode && (\n <>\n {isSmart && (\n <Tooltip content=\"Copy to note\">\n <IconButton\n variant=\"primary\"\n aria-label=\"Copy to note\"\n icon={<Copy size={16} />}\n onClick={(e) => { e.stopPropagation(); onCopyNotes(record.id, { x: e.clientX, y: e.clientY }); }}\n />\n </Tooltip>\n )}\n <OverflowMenu items={overflowItems} />\n </>\n )}\n </div>\n </div>\n </article>\n );\n },\n (prev, next) =>\n prev.selected === next.selected &&\n prev.selectionMode === next.selectionMode &&\n prev.inContext === next.inContext &&\n prev.attachDisabled === next.attachDisabled &&\n prev.selectDisabled === next.selectDisabled &&\n prev.isUploading === next.isUploading &&\n prev.isUploadFailed === next.isUploadFailed &&\n prev.isSmart === next.isSmart &&\n prev.isAnalysing === next.isAnalysing &&\n prev.thumbnailUrl === next.thumbnailUrl &&\n prev.dateDisplay === next.dateDisplay &&\n prev.record.id === next.record.id &&\n prev.record.updatedAtEpoch === next.record.updatedAtEpoch,\n);\n","export interface RecordsSelectionFooterProps {\n selectedCount: number;\n maxCount: number;\n actionsDisabled?: boolean;\n onClear: () => void;\n onAttach: () => void;\n}\n\nexport function RecordsSelectionFooter({\n selectedCount,\n maxCount,\n actionsDisabled,\n onClear,\n onAttach,\n}: RecordsSelectionFooterProps) {\n const disabled = actionsDisabled ?? selectedCount === 0;\n return (\n <div className=\"mr-selection-footer\">\n <div className=\"mr-selection-footer__text\">\n <p className=\"mr-selection-footer__count\">\n {selectedCount} of {maxCount} records selected\n </p>\n <p className=\"mr-selection-footer__hint\">\n You can attach upto {maxCount} files to a session context\n </p>\n </div>\n <div className=\"mr-selection-footer__actions\">\n <button\n type=\"button\"\n className=\"mr-selection-footer__clear\"\n disabled={disabled}\n onClick={onClear}\n >\n Clear selection\n </button>\n <button\n type=\"button\"\n className=\"mr-selection-footer__attach\"\n disabled={disabled}\n onClick={onAttach}\n >\n Attach to session context\n </button>\n </div>\n </div>\n );\n}\n","import { lazy, Suspense, useState } from 'react';\nimport { ChevronLeft, FilePlus, Check, Copy } from 'lucide-react';\nimport { TagChip } from '../../components/TagChip/TagChip';\nimport { Tooltip } from '../../components/Tooltip/Tooltip';\nimport { Skeleton } from '../../components/Skeleton/Skeleton';\nimport { epochToDisplay } from '../../helpers/formatters';\nimport { useRecordById, useRecordPreview } from '../../connection';\nimport { useRecordsActions } from '../RecordsView/RecordsActionsContext';\nimport { MAX_CONTEXT_ATTACHMENTS } from '../RecordsView/RecordsView';\nimport TurndownService from 'turndown';\nimport { SmartReportPanel } from './SmartReportPanel';\n\nconst turndown = new TurndownService({ headingStyle: 'atx', bulletListMarker: '-' });\n\nconst DocumentViewer = lazy(() =>\n import('./DocumentViewer').then((m) => ({ default: m.DocumentViewer })),\n);\n\nexport interface RecordPreviewProps {\n recordId: string;\n onBack: () => void;\n}\n\nconst MAX_PREVIEW_TAGS = 2;\n\nexport function RecordPreview({ recordId, onBack }: RecordPreviewProps) {\n const record = useRecordById(recordId);\n const preview = useRecordPreview(recordId);\n const { attachedIds, onAttachToContext, onRemoveAttachment, onCopyToNote } = useRecordsActions();\n const [smartOpen, setSmartOpen] = useState(true);\n\n if (!record) return null;\n\n const attached = attachedIds?.has(recordId) ?? false;\n const attachFull = !attached && (attachedIds?.size ?? 0) >= MAX_CONTEXT_ATTACHMENTS;\n const handleAttach = () => {\n if (attachFull) return;\n if (attached) void onRemoveAttachment?.(recordId);\n else void onAttachToContext?.([{ documentId: recordId, name: record.title }]);\n };\n\n return (\n <div className=\"mr-record-preview\">\n <header className=\"mr-record-preview__header\">\n <div className=\"mr-record-preview__left\">\n <button type=\"button\" className=\"mr-record-preview__back\" onClick={onBack}>\n <ChevronLeft size={16} aria-hidden />\n Back to records\n </button>\n <div className=\"mr-record-preview__heading\">\n <span className=\"mr-record-preview__title\">{record.title}</span>\n <span className=\"mr-record-preview__date\">{epochToDisplay(record.createdAtEpoch)}</span>\n </div>\n </div>\n\n {record.tags.length > 0 && (\n <div className=\"mr-record-preview__tags\">\n {record.tags.slice(0, MAX_PREVIEW_TAGS).map((t) => (\n <TagChip key={t} label={t} />\n ))}\n {record.tags.length > MAX_PREVIEW_TAGS && (\n <Tooltip content={record.tags.join(', ')}>\n <TagChip label={`+${record.tags.length - MAX_PREVIEW_TAGS}`} />\n </Tooltip>\n )}\n </div>\n )}\n\n <div className=\"mr-record-preview__actions\">\n {preview.hasSmartReport && !smartOpen && (\n <button\n type=\"button\"\n className=\"mr-record-preview__smart-cta\"\n onClick={() => setSmartOpen(true)}\n >\n Show smart report\n </button>\n )}\n\n {record.fileType?.toUpperCase() === 'HTML' && onCopyToNote && (\n <button\n type=\"button\"\n className=\"mr-record-preview__copy-btn\"\n onClick={async (e) => {\n const url = preview.files[0]?.url;\n if (!url) return;\n const res = await fetch(url);\n const html = await res.text();\n const plain = turndown.turndown(html).trim();\n void onCopyToNote(plain, { x: e.clientX, y: e.clientY });\n }}\n >\n <Copy size={16} aria-hidden />\n Copy to note\n </button>\n )}\n\n {attachFull ? (\n <Tooltip content={`You can attach up to ${MAX_CONTEXT_ATTACHMENTS} records. Remove one to add this.`}>\n <button type=\"button\" className=\"mr-record-preview__attach\" disabled>\n <FilePlus size={16} aria-hidden />\n Add to session context\n </button>\n </Tooltip>\n ) : attached ? (\n <button\n type=\"button\"\n className=\"mr-record-preview__attach mr-record-preview__attach--on\"\n onClick={handleAttach}\n >\n <Check size={16} aria-hidden />\n Remove from context\n </button>\n ) : (\n <button\n type=\"button\"\n className=\"mr-record-preview__attach-orbit\"\n onClick={handleAttach}\n >\n <span className=\"mr-record-preview__attach-face\">\n <FilePlus size={16} aria-hidden />\n Add to session context\n </span>\n </button>\n\n )}\n </div>\n </header>\n\n <div className=\"mr-record-preview__body\">\n {preview.status === 'loading' ? (\n <div className=\"mr-record-preview__loading\">\n <Skeleton variant=\"card\" />\n </div>\n ) : (\n <Suspense fallback={<div className=\"mr-doc-viewer__status\">Loading viewer…</div>}>\n <DocumentViewer\n files={preview.files}\n title={record.title}\n isHtml={record.fileType?.toUpperCase() === 'HTML'}\n />\n </Suspense>\n )}\n\n {preview.hasSmartReport && smartOpen && (\n <SmartReportPanel\n vitals={preview.vitals}\n reportName={record.title}\n reportDate={epochToDisplay(record.createdAtEpoch)}\n onHide={() => setSmartOpen(false)}\n onCopyToNote={onCopyToNote}\n />\n )}\n </div>\n </div>\n );\n}\n","import { useMemo, useState } from 'react';\nimport { Search, ChevronRight, ArrowRight, Check, Copy } from 'lucide-react';\nimport { isOutOfRange, vitalsToNoteText, type Vital, type VitalStatus } from '../../helpers/smartReport';\n\nexport interface SmartReportPanelProps {\n vitals: Vital[];\n reportName: string;\n reportDate: string;\n onHide: () => void;\n onCopyToNote?: (text: string, anchor?: { x: number; y: number }) => void | Promise<void>;\n}\n\ntype VitalTab = 'all' | 'outOfRange';\n\nconst STATUS_LABEL: Record<VitalStatus, string> = {\n high: 'HIGH',\n low: 'LOW',\n normal: 'NORMAL',\n unknown: '',\n};\n\nexport function SmartReportPanel({\n vitals,\n reportName,\n reportDate,\n onHide,\n onCopyToNote,\n}: SmartReportPanelProps) {\n const [tab, setTab] = useState<VitalTab>('all');\n const [search, setSearch] = useState('');\n const [selected, setSelected] = useState<Set<string>>(new Set());\n\n const outOfRangeCount = useMemo(() => vitals.filter(isOutOfRange).length, [vitals]);\n\n const shown = useMemo(() => {\n const q = search.trim().toLowerCase();\n return vitals.filter((v) => {\n if (tab === 'outOfRange' && !isOutOfRange(v)) return false;\n if (q && !v.name.toLowerCase().includes(q)) return false;\n return true;\n });\n }, [vitals, tab, search]);\n\n const allShownSelected = shown.length > 0 && shown.every((v) => selected.has(v.id));\n\n const toggle = (id: string) =>\n setSelected((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n\n const toggleAll = () =>\n setSelected((prev) => {\n const next = new Set(prev);\n if (allShownSelected) shown.forEach((v) => next.delete(v.id));\n else shown.forEach((v) => next.add(v.id));\n return next;\n });\n\n const handleCopy = (e: React.MouseEvent) => {\n const chosen = vitals.filter((v) => selected.has(v.id));\n if (chosen.length && onCopyToNote) {\n const text = vitalsToNoteText(chosen, { reportName, date: reportDate });\n void onCopyToNote(text, { x: e.clientX, y: e.clientY });\n }\n };\n\n return (\n <aside className=\"mr-smart-panel\">\n <div className=\"mr-smart-panel__top\">\n <div className=\"mr-smart-panel__header\">\n <span className=\"mr-smart-panel__title\">Smart Report</span>\n <button type=\"button\" className=\"mr-smart-panel__hide\" onClick={onHide}>\n <ChevronRight size={16} aria-hidden />\n Hide\n </button>\n </div>\n\n <div className=\"mr-smart-panel__search\">\n <Search size={16} aria-hidden />\n <input\n type=\"text\"\n placeholder=\"Search vitals or parameters\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n\n <div className=\"mr-smart-panel__tabs\" role=\"tablist\">\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === 'all'}\n className={`mr-smart-panel__tab${tab === 'all' ? ' mr-smart-panel__tab--active' : ''}`}\n onClick={() => setTab('all')}\n >\n All vitals\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === 'outOfRange'}\n className={`mr-smart-panel__tab${tab === 'outOfRange' ? ' mr-smart-panel__tab--active' : ''}`}\n onClick={() => setTab('outOfRange')}\n >\n Out of range ({outOfRangeCount})\n </button>\n </div>\n </div>\n\n <div className=\"mr-smart-panel__list\">\n {shown.length === 0 ? (\n <p className=\"mr-smart-panel__empty\">No vitals to show.</p>\n ) : (\n shown.map((v) => (\n <VitalCard key={v.id} vital={v} selected={selected.has(v.id)} onToggle={toggle} />\n ))\n )}\n </div>\n\n <div className=\"mr-smart-panel__cta\">\n <label className=\"mr-smart-panel__selectall\">\n <span\n className={`mr-smart-panel__checkbox${allShownSelected ? ' mr-smart-panel__checkbox--checked' : ''}`}\n aria-hidden\n >\n {allShownSelected && <Check size={12} strokeWidth={3} />}\n </span>\n <input\n type=\"checkbox\"\n checked={allShownSelected}\n onChange={toggleAll}\n className=\"mr-visually-hidden\"\n />\n Select all\n </label>\n <button\n type=\"button\"\n className=\"mr-smart-panel__copy\"\n disabled={selected.size === 0}\n onClick={handleCopy}\n >\n <Copy size={16} aria-hidden />\n Copy to note\n </button>\n </div>\n </aside>\n );\n}\n\nfunction VitalCard({\n vital,\n selected,\n onToggle,\n}: {\n vital: Vital;\n selected: boolean;\n onToggle: (id: string) => void;\n}) {\n return (\n <div\n className={`mr-vital-card mr-vital-card--${vital.status}${selected ? ' mr-vital-card--selected' : ''}`}\n role=\"button\"\n aria-pressed={selected}\n onClick={() => onToggle(vital.id)}\n >\n <div className=\"mr-vital-card__header\">\n <div className=\"mr-vital-card__left\">\n <span className=\"mr-vital-card__name\">{vital.name}</span>\n <div className=\"mr-vital-card__subtitle\">\n <span className=\"mr-vital-card__value\">\n {vital.value}\n {vital.unit && <span className=\"mr-vital-card__unit\"> {vital.unit}</span>}\n </span>\n {vital.refRange && (\n <span className=\"mr-vital-card__ref\">(Ref: {vital.refRange})</span>\n )}\n </div>\n </div>\n\n <div className=\"mr-vital-card__right\">\n {STATUS_LABEL[vital.status] && (\n <span className={`mr-vital-card__badge mr-vital-card__badge--${vital.status}`}>\n {STATUS_LABEL[vital.status]}\n </span>\n )}\n <span\n className={`mr-vital-card__checkbox${selected ? ' mr-vital-card__checkbox--checked' : ''}`}\n aria-hidden\n >\n {selected && <Check size={14} strokeWidth={3} aria-hidden />}\n </span>\n </div>\n </div>\n\n {vital.history.length > 0 && (\n <div className=\"mr-vital-card__history\">\n <span className=\"mr-vital-card__history-label\">From previous records</span>\n <div className=\"mr-vital-card__history-row\">\n {vital.history.map((h, i) => (\n <div key={i} className=\"mr-vital-card__history-point\">\n {i > 0 && <ArrowRight size={16} aria-hidden className=\"mr-vital-card__history-arrow\" />}\n <span className=\"mr-vital-card__history-value\">{h.value}</span>\n {h.label && <span className=\"mr-vital-card__history-date\">{h.label}</span>}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { Upload, X } from 'lucide-react';\nimport { PresetSelect } from '../../components/PresetSelect/PresetSelect';\nimport { CasePicker } from '../../components/CasePicker/CasePicker';\nimport { formatFileSize } from '../../helpers/formatters';\nimport { useSdk } from '../../connection';\nimport type { UploadFileInput } from '../../connection/useUploadConnection';\n\nexport interface UploadModalProps {\n onUpload: (items: UploadFileInput[]) => Promise<void>;\n onError: (message: string) => void;\n onSuccess?: (message: string) => void;\n onClose: () => void;\n}\n\nconst ACCEPT = '.pdf,.jpg,.jpeg,.png,image/*,application/pdf';\n\ninterface FileForm {\n id: string;\n file: File;\n documentType: string;\n date: string;\n caseId: string | null;\n}\n\nlet fileSeq = 0;\n\nexport function UploadModal({ onUpload, onError, onSuccess, onClose }: UploadModalProps) {\n const { documentTypes } = useSdk();\n\n const [files, setFiles] = useState<FileForm[]>([]);\n const [dragging, setDragging] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const docTypeOptions = useMemo(\n () => documentTypes.map((t) => ({ value: t.id, label: t.display_name })),\n [documentTypes],\n );\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [onClose]);\n\n const fileKey = (f: File) => `${f.name}::${f.size}::${f.lastModified}`;\n\n const addFiles = (incoming: FileList | File[]) => {\n setFiles((prev) => {\n const existing = new Set(prev.map((f) => fileKey(f.file)));\n const deduped = Array.from(incoming).filter((f) => !existing.has(fileKey(f)));\n if (!deduped.length) return prev;\n const next = deduped.map((file) => ({\n id: `f-${(fileSeq += 1)}`,\n file,\n documentType: '',\n date: new Date().toISOString().slice(0, 10),\n caseId: null,\n }));\n return [...prev, ...next];\n });\n };\n\n const patch = (id: string, p: Partial<FileForm>) =>\n setFiles((prev) => prev.map((f) => (f.id === id ? { ...f, ...p } : f)));\n const removeFile = (id: string) => setFiles((prev) => prev.filter((f) => f.id !== id));\n\n const allValid = files.length > 0 && files.every((f) => f.documentType);\n\n const handleUpload = () => {\n if (files.length === 0) return;\n if (!allValid) {\n onError('Add a document type and investigation date for every file.');\n return;\n }\n const items: UploadFileInput[] = files.map((f) => ({\n file: f.file,\n documentType: f.documentType,\n documentDateMs: new Date(`${f.date}T00:00:00`).getTime(),\n caseIds: f.caseId ? [f.caseId] : undefined,\n }));\n onClose();\n void onUpload(items).then(() => {\n onSuccess?.(items.length > 1 ? `${items.length} records uploaded` : 'Record uploaded');\n }).catch((e) => {\n onError(e instanceof Error ? e.message : 'Upload failed. Please try again.');\n });\n };\n\n const onDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setDragging(false);\n if (e.dataTransfer.files?.length) addFiles(e.dataTransfer.files);\n };\n\n return (\n <div className=\"mr-upload-modal\" role=\"presentation\" onClick={onClose}>\n <div\n className={`mr-upload-modal__dialog${dragging ? ' mr-upload-modal__dialog--dragging' : ''}`}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Upload a new record\"\n onClick={(e) => e.stopPropagation()}\n onDragOver={(e) => { e.preventDefault(); setDragging(true); }}\n onDragLeave={(e) => { if (e.currentTarget === e.target) setDragging(false); }}\n onDrop={onDrop}\n >\n <div className=\"mr-upload-modal__header\">\n <div>\n <p className=\"mr-upload-modal__title\">Upload a new record</p>\n <p className=\"mr-upload-modal__subtitle\">\n Add a document or photo to this patient's medical records.\n </p>\n </div>\n <button type=\"button\" className=\"mr-upload-modal__close\" aria-label=\"Close\" onClick={onClose}>\n <X size={18} aria-hidden />\n </button>\n </div>\n\n <button type=\"button\" className=\"mr-upload-dropzone\" onClick={() => inputRef.current?.click()}>\n <span className=\"mr-upload-dropzone__icon\"><Upload size={20} aria-hidden /></span>\n <span className=\"mr-upload-dropzone__title\">Drop files here or click to browse</span>\n <span className=\"mr-upload-dropzone__hint\">PDF, JPG, PNG · up to 25 MB each · multiple files supported</span>\n </button>\n <input\n ref={inputRef}\n type=\"file\"\n accept={ACCEPT}\n multiple\n hidden\n onChange={(e) => { if (e.target.files) addFiles(e.target.files); e.target.value = ''; }}\n />\n\n <div className=\"mr-upload-modal__files\">\n {files.map((f) => (\n <div key={f.id} className=\"mr-upload-file\">\n <div className=\"mr-upload-file__head\">\n <div className=\"mr-upload-file__titles\">\n <p className=\"mr-upload-file__title\">{f.file.name}</p>\n <p className=\"mr-upload-file__meta\">{f.file.name} · {formatFileSize(f.file.size)}</p>\n </div>\n <button type=\"button\" className=\"mr-upload-file__remove\" aria-label=\"Remove file\" onClick={() => removeFile(f.id)}>\n <X size={16} aria-hidden />\n </button>\n </div>\n\n <div className=\"mr-upload-file__fields\">\n <label className=\"mr-upload-field\">\n <span className=\"mr-upload-field__label\">\n Document type<span className=\"mr-upload-field__req\">*</span>\n </span>\n <PresetSelect\n value={f.documentType}\n options={docTypeOptions}\n placeholder=\"Select type\"\n active={!!f.documentType}\n onChange={(v) => patch(f.id, { documentType: v })}\n />\n </label>\n\n <label className=\"mr-upload-field\">\n <span className=\"mr-upload-field__label\">\n Investigation date<span className=\"mr-upload-field__req\">*</span>\n </span>\n <input\n type=\"date\"\n className=\"mr-upload-field__date\"\n value={f.date}\n max={new Date().toISOString().slice(0, 10)}\n onChange={(e) => patch(f.id, { date: e.target.value })}\n />\n </label>\n\n <div className=\"mr-upload-field\">\n <span className=\"mr-upload-field__label\">Care context</span>\n <CasePicker\n selected={f.caseId}\n onChange={(id) => patch(f.id, { caseId: id })}\n mode=\"dropdown\"\n />\n </div>\n </div>\n </div>\n ))}\n </div>\n\n <div className=\"mr-upload-modal__footer\">\n <button\n type=\"button\"\n className=\"mr-upload-modal__submit\"\n disabled={!allValid}\n onClick={handleUpload}\n >\n <Upload size={16} aria-hidden />\n Upload\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useStore } from 'zustand';\nimport {\n useRecordsConnection,\n useCasesConnection,\n useUploadConnection,\n useRecordsStatus,\n useFilteredRecordIds,\n useSdk,\n} from '../../connection';\nimport { useRecordSections } from './useRecordSections';\nimport { useSectionPages } from './useSectionPages';\nimport type { RecordsViewMode } from './RecordsToolbar';\nimport type { SidebarTab } from './RecordsView';\n\nexport interface RecordsViewCallbacks {\n onUpload?: () => void;\n allowUpload?: boolean;\n onCopyToNote?: (text: string, anchor?: { x: number; y: number }) => void | Promise<void>;\n attachedIds?: string[];\n onAttachManyToContext?: (records: Array<{ documentId: string; name: string }>) => void | Promise<void>;\n onRemoveAttachment?: (documentId: string) => void | Promise<void>;\n onToast?: (message: string, type?: 'error' | 'success') => void;\n}\n\nexport function useRecordsView({\n onUpload,\n allowUpload = true,\n onCopyToNote,\n attachedIds,\n onAttachManyToContext,\n onRemoveAttachment,\n onToast,\n}: RecordsViewCallbacks) {\n const { store, labelOf } = useSdk();\n const { refresh, sourceRefreshedAt, deleteRecord } = useRecordsConnection();\n const { upload } = useUploadConnection();\n\n const status = useRecordsStatus();\n const filteredIds = useFilteredRecordIds();\n\n const allIds = useStore(store, (s) => s.records.ids);\n const selectedCount = useStore(store, (s) => s.selection.recordIds.size);\n const openDetailId = useStore(store, (s) => s.selection.openDetailId);\n const activeFilters = useStore(store, (s) => s.filters);\n\n const attachedIdSet = useMemo(() => new Set(attachedIds ?? []), [attachedIds]);\n\n const [viewMode, setViewMode] = useState<RecordsViewMode>('grid');\n const [sidebarTab, setSidebarTab] = useState<SidebarTab>('date');\n const [activeKey, setActiveKey] = useState<string | null>(null);\n const [selectionMode, setSelectionMode] = useState(false);\n const [page, setPage] = useState(0);\n const [deleteTargetId, setDeleteTargetId] = useState<string | null>(null);\n const [deleting, setDeleting] = useState(false);\n const [uploadOpen, setUploadOpen] = useState(false);\n\n useCasesConnection();\n\n const sections = useRecordSections(sidebarTab, allIds);\n\n const autoSelectedRef = useRef(false);\n useEffect(() => {\n if (sidebarTab !== 'careContext') {\n autoSelectedRef.current = false;\n return;\n }\n if (autoSelectedRef.current || sections.length === 0) return;\n autoSelectedRef.current = true;\n setActiveKey(sections[0].key);\n }, [sidebarTab, sections]);\n\n const { pageSections, pageCount, page: safePage } = useSectionPages(sidebarTab, sections, page);\n\n const resolvedActiveKey = activeKey && pageSections.some((s) => s.key === activeKey) ? activeKey : null;\n\n const filteredSections = useMemo(() => {\n const allowed = new Set(filteredIds);\n const source = resolvedActiveKey\n ? pageSections.filter((s) => s.key === resolvedActiveKey)\n : pageSections;\n const trimmed = source\n .map((s) => ({ ...s, recordIds: s.recordIds.filter((id) => allowed.has(id)) }))\n .filter((s) => s.recordIds.length > 0);\n\n if (sidebarTab !== 'date' || resolvedActiveKey) return trimmed;\n\n const byMonth = new Map<string, (typeof trimmed)[number]>();\n for (const s of trimmed) {\n const existing = byMonth.get(s.monthKey);\n if (existing) existing.recordIds.push(...s.recordIds);\n else byMonth.set(s.monthKey, { ...s, key: s.monthKey, recordIds: [...s.recordIds] });\n }\n return [...byMonth.values()];\n }, [pageSections, resolvedActiveKey, filteredIds, sidebarTab]);\n\n const handleTabChange = useCallback((tab: SidebarTab) => {\n setSidebarTab(tab);\n setActiveKey(null);\n setPage(0);\n store.getState().selection.clearSelection();\n }, [store]);\n\n const handleSelectSection = useCallback((key: string) => {\n setActiveKey((prev) => (prev === key ? null : key));\n }, []);\n\n const handleToggleSelectionMode = useCallback(() => {\n setSelectionMode((on) => {\n if (on) store.getState().selection.clearSelection();\n return !on;\n });\n }, [store]);\n\n const clearSelection = useCallback(() => {\n store.getState().selection.clearSelection();\n }, [store]);\n\n const handlePageChange = useCallback((p: number) => {\n setPage(p);\n setActiveKey(null);\n store.getState().selection.clearSelection();\n store.getState().selection.openDetail(null);\n }, [store]);\n\n const handleAttachMany = useCallback(() => {\n const state = store.getState();\n const byId = state.records.byId;\n const records = [...state.selection.recordIds]\n .map((rid) => byId[rid])\n .filter(Boolean)\n .map((r) => ({ documentId: r.id, name: r.title }));\n state.selection.clearSelection();\n setSelectionMode(false);\n if (records.length && onAttachManyToContext) void onAttachManyToContext(records);\n }, [store, onAttachManyToContext]);\n\n const openUpload = useCallback(() => {\n onUpload?.();\n setUploadOpen(true);\n }, [onUpload]);\n\n const requestDelete = useCallback((id: string) => setDeleteTargetId(id), []);\n\n const cancelDelete = useCallback(() => {\n if (!deleting) setDeleteTargetId(null);\n }, [deleting]);\n\n const confirmDelete = useCallback(async () => {\n if (!deleteTargetId) return;\n const target = store.getState().records.byId[deleteTargetId];\n setDeleting(true);\n try {\n await deleteRecord(deleteTargetId);\n onToast?.(`${target?.title ?? 'Record'} deleted`, 'success');\n setDeleteTargetId(null);\n } catch (e) {\n const msg = e instanceof Error ? e.message : 'Delete failed';\n onToast?.(`Could not delete record. ${msg}`, 'error');\n } finally {\n setDeleting(false);\n }\n }, [deleteTargetId, deleteRecord, store, onToast]);\n\n const deleteTarget = useStore(store, (s) =>\n deleteTargetId ? s.records.byId[deleteTargetId] : undefined,\n );\n\n const actions = useMemo(\n () => ({\n onCopyToNote,\n attachedIds: attachedIdSet,\n onAttachToContext: onAttachManyToContext,\n onRemoveAttachment,\n onRequestDelete: requestDelete,\n onToast,\n }),\n [onCopyToNote, attachedIdSet, onAttachManyToContext, onRemoveAttachment, requestDelete, onToast],\n );\n\n const noRecords = allIds.length === 0;\n const isInitialLoading = status === 'loading' && noRecords;\n const isLoadFailed = status === 'error' && noRecords;\n const isTabEmpty = !isInitialLoading && !isLoadFailed && noRecords;\n\n return {\n // state\n store,\n labelOf,\n viewMode,\n setViewMode,\n sidebarTab,\n activeKey: resolvedActiveKey,\n selectionMode,\n page: safePage,\n pageCount,\n uploadOpen,\n setUploadOpen,\n openDetailId,\n activeFilters,\n // derived\n allIds,\n selectedCount,\n attachedIdSet,\n filteredSections,\n pageSections,\n sections,\n deleteTarget,\n deleting,\n isInitialLoading,\n isLoadFailed,\n isTabEmpty,\n // data\n upload,\n refresh,\n sourceRefreshedAt,\n actions,\n allowUpload,\n // handlers\n handleTabChange,\n handleSelectSection,\n handleToggleSelectionMode,\n clearSelection,\n handleAttachMany,\n openUpload,\n requestDelete,\n cancelDelete,\n confirmDelete,\n setPage: handlePageChange,\n };\n}\n","import { useMemo } from 'react';\nimport { useStore } from 'zustand';\nimport { useSdk } from '../../connection';\nimport { recordMatchesFilters } from '../../helpers/recordFilter';\nimport type { SidebarTab } from './RecordsView';\nexport interface RecordSection {\n key: string;\n recordIds: string[];\n dayNumber: string;\n weekday: string;\n monthLabel: string;\n monthKey: string;\n countLabel: string;\n summary: string;\n}\n\nconst WEEKDAYS = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'];\nconst MONTHS = [\n 'JANUARY', 'FEBRUARY', 'MARCH', 'APRIL', 'MAY', 'JUNE',\n 'JULY', 'AUGUST', 'SEPTEMBER', 'OCTOBER', 'NOVEMBER', 'DECEMBER',\n];\n\nconst dayBox = (epoch: number) => {\n const d = new Date(epoch);\n return { dayNumber: String(d.getDate()), weekday: WEEKDAYS[d.getDay()] };\n};\n\nexport const dayKeyOf = (epoch: number) => {\n const d = new Date(epoch);\n return `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n};\n\nexport function useRecordSections(tab: SidebarTab, ids: string[]): RecordSection[] {\n const { store } = useSdk();\n const byId = useStore(store, (s) => s.records.byId);\n const caseIds = useStore(store, (s) => s.cases.ids);\n const casesById = useStore(store, (s) => s.cases.byId);\n const filters = useStore(store, (s) => s.filters);\n\n return useMemo<RecordSection[]>(() => {\n const matchCount = (recordIds: string[]) =>\n recordIds.reduce((n, id) => {\n const r = byId[id];\n return r && recordMatchesFilters(r, filters) ? n + 1 : n;\n }, 0);\n const recordsLabel = (n: number) => `${n} record${n === 1 ? '' : 's'}`;\n\n if (tab === 'careContext') {\n return caseIds\n .map((caseId): RecordSection | null => {\n const c = casesById[caseId];\n if (!c) return null;\n const recordIds = ids.filter((id) => byId[id]?.cases.includes(caseId));\n const type = (c.typeCode ?? '').toUpperCase();\n return {\n key: caseId,\n recordIds,\n dayNumber: type,\n weekday: '',\n monthLabel: '',\n monthKey: '',\n countLabel: c.name,\n summary: recordsLabel(matchCount(recordIds)),\n };\n })\n .filter((s): s is RecordSection => s !== null);\n }\n\n const map = new Map<string, { date: Date; types: Set<string>; recordIds: string[] }>();\n for (const id of ids) {\n const r = byId[id];\n if (!r) continue;\n const key = dayKeyOf(r.createdAtEpoch);\n let entry = map.get(key);\n if (!entry) {\n entry = { date: new Date(r.createdAtEpoch), types: new Set(), recordIds: [] };\n map.set(key, entry);\n }\n entry.recordIds.push(id);\n entry.types.add(r.type);\n }\n return [...map.entries()]\n .sort((a, b) => b[1].date.getTime() - a[1].date.getTime())\n .map(([key, { date, types, recordIds }]) => ({\n key,\n recordIds,\n ...dayBox(date.getTime()),\n monthLabel: `${MONTHS[date.getMonth()]} ${date.getFullYear()}`,\n monthKey: `${date.getFullYear()}-${date.getMonth()}`,\n countLabel: recordsLabel(matchCount(recordIds)),\n summary: [...types].join(' · '),\n }));\n }, [tab, ids, byId, caseIds, casesById, filters]);\n}\n","import { useMemo } from 'react';\nimport type { RecordSection } from './useRecordSections';\nimport type { SidebarTab } from './RecordsView';\n\nexport const MONTHS_PER_PAGE = 5;\nexport const CASES_PER_PAGE = 10;\n\nexport interface SectionPages {\n pageSections: RecordSection[];\n pageCount: number;\n page: number;\n}\n\nexport function useSectionPages(\n tab: SidebarTab,\n sections: RecordSection[],\n page: number,\n): SectionPages {\n return useMemo<SectionPages>(() => {\n if (sections.length === 0) {\n return { pageSections: [], pageCount: 1, page: 0 };\n }\n\n if (tab === 'date') {\n const monthKeys: string[] = [];\n for (const s of sections) {\n if (monthKeys[monthKeys.length - 1] !== s.monthKey) monthKeys.push(s.monthKey);\n }\n const pageCount = Math.max(1, Math.ceil(monthKeys.length / MONTHS_PER_PAGE));\n const clamped = Math.min(Math.max(page, 0), pageCount - 1);\n const windowKeys = new Set(\n monthKeys.slice(clamped * MONTHS_PER_PAGE, (clamped + 1) * MONTHS_PER_PAGE),\n );\n return {\n pageSections: sections.filter((s) => windowKeys.has(s.monthKey)),\n pageCount,\n page: clamped,\n };\n }\n\n const pageCount = Math.max(1, Math.ceil(sections.length / CASES_PER_PAGE));\n const clamped = Math.min(Math.max(page, 0), pageCount - 1);\n return {\n pageSections: sections.slice(clamped * CASES_PER_PAGE, (clamped + 1) * CASES_PER_PAGE),\n pageCount,\n page: clamped,\n };\n }, [tab, sections, page]);\n}\n"],"mappings":"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","names":["jsx","jsxs","RefreshCcw","Upload","jsx","jsxs","jsx","useEffect","jsx","jsxs","useCallback","useEffect","useMemo","useRef","useState","useStore","jsx","FilterChip","createPortal","jsx","jsxs","useMemo","useState","useStore","useEffect","useRef","useState","createPortal","jsx","jsxs","useEffect","useMemo","useRef","useState","createPortal","ChevronsUpDown","Check","jsx","jsxs","MENU_MAX_H","useEffect","useRef","useState","useState","useRef","useEffect","useEffect","useEffect","useState","useStore","useEffect","useRef","useState","useState","useRef","useEffect","useCallback","useEffect","useRef","useRef","useCallback","useEffect","useCallback","useRef","useRef","useCallback","useCallback","useCallback","useMemo","useStore","useStore","useShallow","useMemo","useStore","useStore","useMemo","useRecordById","useRecordIdRange","useRecordsCount","useRecordsStatus","useThumbnailUrl","useIsSelected","useAllTags","useCaseById","useCaseIds","useCasesStatus","useFilteredRecordIds","jsx","jsxs","useAllTags","useStore","useMemo","useState","jsx","jsxs","useStore","useFilteredRecordIds","useRef","useState","useEffect","useCallback","useMemo","memo","jsx","jsxs","SidebarItem","ChevronLeft","ChevronRight","jsx","jsxs","useEffect","useMemo","useRef","useState","createPortal","Search","Check","Plus","X","useStore","jsx","jsxs","useStore","useMemo","useState","useRef","useEffect","Check","Plus","Search","X","createPortal","jsx","jsxs","useEffect","useRef","memo","memo","useMemo","Check","memo","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","memo","Badge","memo","jsx","IconButton","memo","X","jsx","jsxs","TagChip","memo","useEffect","useRef","useState","jsx","jsxs","Thumbnail","useEffect","useRef","useState","createPortal","ChevronLeft","Fragment","jsx","jsxs","jsx","jsxs","useEffect","useMemo","useRef","useState","createPortal","useStore","Check","Search","Plus","ChevronsUpDown","createContext","useContext","Fragment","jsx","jsxs","CASE_TYPE_OPTIONS","todayISO","useStore","useMemo","useState","useRef","GAP","useEffect","ChevronsUpDown","createPortal","Search","Check","Plus","Fragment","jsx","jsxs","memo","RecordCard","useMemo","Check","useCallback","useStore","useEffect","useRef","useState","useRecordById","useThumbnailUrl","useIsSelected","useStore","useCallback","jsx","memo","RecordCardContainer","memo","memo","useMemo","Check","Copy","Eye","FolderPlus","Trash2","Fragment","jsx","jsxs","memo","RecordRow","useMemo","FolderPlus","Trash2","Check","Eye","Copy","jsx","memo","RecordRowContainer","jsx","jsxs","useRef","useEffect","jsx","jsxs","useState","ChevronLeft","Check","Copy","useMemo","useState","Search","ChevronRight","Check","Copy","jsx","jsxs","useState","useMemo","ChevronRight","Search","Check","Copy","jsx","jsxs","useRecordById","useState","ChevronLeft","Copy","Check","useEffect","useMemo","useRef","useState","Upload","X","jsx","jsxs","useState","useRef","useMemo","useEffect","X","Upload","useCallback","useEffect","useMemo","useRef","useState","useStore","useMemo","useStore","useStore","useMemo","useMemo","pageCount","clamped","useRecordsStatus","useFilteredRecordIds","useStore","useMemo","useState","useRef","useEffect","useCallback","Fragment","jsx","jsxs","Upload","RefreshCcw"]}
|