@arbidocs/blocks 0.4.32 → 0.4.37
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/dist/agents/index.cjs +258 -216
- package/dist/agents/index.js +9 -7
- package/dist/agents/tasks/ConversationListView.d.ts +58 -0
- package/dist/agents/tasks/ConversationTurnSpeaker.d.ts +16 -0
- package/dist/agents/tasks/NewThreadDialog.d.ts +1 -1
- package/dist/agents/tasks/TaskActivityTimeline.d.ts +1 -1
- package/dist/agents/tasks/TaskFlow.d.ts +22 -0
- package/dist/agents/tasks/TaskInbox.d.ts +26 -0
- package/dist/agents/tasks/TaskReviewDialog.d.ts +22 -0
- package/dist/agents/tasks/TaskRowMenu.d.ts +10 -2
- package/dist/agents/tasks/TaskRunsDialog.d.ts +8 -3
- package/dist/agents/tasks/TaskStartDialog.d.ts +24 -0
- package/dist/agents/tasks/TaskTable.d.ts +1 -1
- package/dist/agents/tasks/ThreadNotifyDialog.d.ts +11 -0
- package/dist/agents/tasks/WorkflowComposer.d.ts +1 -1
- package/dist/agents/tasks/WorkflowsTable.d.ts +7 -0
- package/dist/agents/tasks/compact-thread-activity.d.ts +8 -0
- package/dist/agents/tasks/index.d.ts +10 -0
- package/dist/agents/tasks/taskComposerTypes.d.ts +16 -1
- package/dist/agents/tasks/taskRequest.d.ts +1 -0
- package/dist/agents/tasks/testGrid.d.ts +24 -0
- package/dist/agents/tasks/workflowColumns.d.ts +2 -1
- package/dist/agents/tasks/workflowRows.d.ts +6 -0
- package/dist/agents/workflows/types.d.ts +2 -0
- package/dist/auth/index.cjs +27 -27
- package/dist/auth/index.js +1 -1
- package/dist/chat/Message.d.ts +8 -2
- package/dist/chat/index.cjs +132 -120
- package/dist/chat/index.d.ts +2 -0
- package/dist/chat/index.js +2 -2
- package/dist/chat/participant-tints.d.ts +1 -0
- package/dist/chat/useRecipientDraft.d.ts +14 -0
- package/dist/{chunk-KF4EC5XU.js → chunk-24KQJYSB.js} +3 -3
- package/dist/{chunk-KF4EC5XU.js.map → chunk-24KQJYSB.js.map} +1 -1
- package/dist/{chunk-GVQOBJKR.cjs → chunk-2EAE5JP6.cjs} +7 -4
- package/dist/chunk-2EAE5JP6.cjs.map +1 -0
- package/dist/chunk-3AFWGEDJ.cjs +53 -0
- package/dist/chunk-3AFWGEDJ.cjs.map +1 -0
- package/dist/{chunk-UBNVIIBT.js → chunk-4WWM3GQ5.js} +23 -8
- package/dist/chunk-4WWM3GQ5.js.map +1 -0
- package/dist/{chunk-56BUD74K.cjs → chunk-65THHQVB.cjs} +27 -27
- package/dist/{chunk-56BUD74K.cjs.map → chunk-65THHQVB.cjs.map} +1 -1
- package/dist/{chunk-UTYQPVIW.cjs → chunk-7QDX2CO4.cjs} +6 -6
- package/dist/{chunk-UTYQPVIW.cjs.map → chunk-7QDX2CO4.cjs.map} +1 -1
- package/dist/{chunk-5B4PXAKI.cjs → chunk-7RGLTF76.cjs} +23 -8
- package/dist/chunk-7RGLTF76.cjs.map +1 -0
- package/dist/{chunk-PLGVMLBD.cjs → chunk-AMXQQCCB.cjs} +1975 -610
- package/dist/chunk-AMXQQCCB.cjs.map +1 -0
- package/dist/{chunk-NUPVHEJW.js → chunk-BUHKUKKB.js} +7 -4
- package/dist/chunk-BUHKUKKB.js.map +1 -0
- package/dist/{chunk-4XJZ6AAY.js → chunk-CKB64Z4R.js} +245 -6
- package/dist/chunk-CKB64Z4R.js.map +1 -0
- package/dist/chunk-DDW3M22Z.js +126 -0
- package/dist/chunk-DDW3M22Z.js.map +1 -0
- package/dist/{chunk-KXMDOTGW.js → chunk-DLBUFHLY.js} +10 -2
- package/dist/chunk-DLBUFHLY.js.map +1 -0
- package/dist/{chunk-ZHLMDJCO.cjs → chunk-DLVX6R6B.cjs} +62 -26
- package/dist/chunk-DLVX6R6B.cjs.map +1 -0
- package/dist/{chunk-JGZTRLKL.cjs → chunk-IA7RTPT3.cjs} +7 -4
- package/dist/chunk-IA7RTPT3.cjs.map +1 -0
- package/dist/{chunk-6YVI74BC.js → chunk-JH25QIZW.js} +439 -12
- package/dist/chunk-JH25QIZW.js.map +1 -0
- package/dist/{chunk-FRRDPYBR.cjs → chunk-L7B4W4LA.cjs} +74 -5
- package/dist/chunk-L7B4W4LA.cjs.map +1 -0
- package/dist/{chunk-NJL4LIXX.js → chunk-LFGJAZ5H.js} +11 -8
- package/dist/chunk-LFGJAZ5H.js.map +1 -0
- package/dist/{chunk-IAKUTBPX.js → chunk-LYUO3E6V.js} +3 -3
- package/dist/{chunk-IAKUTBPX.js.map → chunk-LYUO3E6V.js.map} +1 -1
- package/dist/{chunk-EYPPB5CY.cjs → chunk-M2YGPC5N.cjs} +4 -4
- package/dist/{chunk-EYPPB5CY.cjs.map → chunk-M2YGPC5N.cjs.map} +1 -1
- package/dist/{chunk-5ZBP7TCD.cjs → chunk-MJCCBMM5.cjs} +10 -2
- package/dist/chunk-MJCCBMM5.cjs.map +1 -0
- package/dist/{chunk-VMCOH3AY.cjs → chunk-NUF2WGGF.cjs} +527 -96
- package/dist/chunk-NUF2WGGF.cjs.map +1 -0
- package/dist/{chunk-OJSWQM4G.js → chunk-OZJ5PXA6.js} +29 -4
- package/dist/chunk-OZJ5PXA6.js.map +1 -0
- package/dist/{chunk-3NZR6PAG.js → chunk-PE7Z53RB.js} +70 -4
- package/dist/chunk-PE7Z53RB.js.map +1 -0
- package/dist/chunk-Q6LF7N3A.cjs +130 -0
- package/dist/chunk-Q6LF7N3A.cjs.map +1 -0
- package/dist/{chunk-RGHQFJOL.cjs → chunk-QFUF4A4J.cjs} +28 -2
- package/dist/chunk-QFUF4A4J.cjs.map +1 -0
- package/dist/chunk-RFXJYIDV.js +50 -0
- package/dist/chunk-RFXJYIDV.js.map +1 -0
- package/dist/{chunk-QN42OA5J.js → chunk-SFXVNFES.js} +4 -4
- package/dist/chunk-SFXVNFES.js.map +1 -0
- package/dist/{chunk-YVIOCITQ.cjs → chunk-VUEZARW5.cjs} +3 -3
- package/dist/chunk-VUEZARW5.cjs.map +1 -0
- package/dist/{chunk-JLOYWXRB.js → chunk-VZGBCBYB.js} +3 -3
- package/dist/chunk-VZGBCBYB.js.map +1 -0
- package/dist/{chunk-ZVPTFTGV.cjs → chunk-WBDK4PIA.cjs} +11 -8
- package/dist/chunk-WBDK4PIA.cjs.map +1 -0
- package/dist/{chunk-ZORQ5M3W.cjs → chunk-WQFGG2BV.cjs} +4 -4
- package/dist/chunk-WQFGG2BV.cjs.map +1 -0
- package/dist/{chunk-C75S6USL.js → chunk-WYVCXY7R.js} +7 -4
- package/dist/chunk-WYVCXY7R.js.map +1 -0
- package/dist/{chunk-WSJVHSGN.js → chunk-XWEJ5LV2.js} +63 -27
- package/dist/chunk-XWEJ5LV2.js.map +1 -0
- package/dist/{chunk-S5HZBXZA.cjs → chunk-YJQVLVBJ.cjs} +243 -2
- package/dist/chunk-YJQVLVBJ.cjs.map +1 -0
- package/dist/{chunk-YMHGF6R5.js → chunk-ZCF2JJFA.js} +3 -3
- package/dist/{chunk-YMHGF6R5.js.map → chunk-ZCF2JJFA.js.map} +1 -1
- package/dist/{chunk-TZ4QF7EP.js → chunk-ZDA5CZPS.js} +1948 -594
- package/dist/chunk-ZDA5CZPS.js.map +1 -0
- package/dist/collaboration/index.cjs +45 -41
- package/dist/collaboration/index.js +1 -1
- package/dist/collaboration/mail/MailMessagePreview.d.ts +11 -0
- package/dist/collaboration/mail/index.d.ts +1 -0
- package/dist/connect/docx.cjs +4 -4
- package/dist/connect/docx.js +1 -1
- package/dist/connect/index.cjs +32 -32
- package/dist/connect/index.js +3 -3
- package/dist/docx/NativeDocxEditor.d.ts +2 -2
- package/dist/docx/index.cjs +33 -30
- package/dist/docx/index.cjs.map +1 -1
- package/dist/docx/index.d.ts +2 -2
- package/dist/docx/index.js +3 -4
- package/dist/docx/index.js.map +1 -1
- package/dist/docx/review/DocxEditorReview.d.ts +16 -0
- package/dist/docx/review/index.d.ts +3 -0
- package/dist/docx/review/reviewModule.d.ts +6 -0
- package/dist/docx/review/useReview.d.ts +29 -0
- package/dist/facts/FactsFilterInput.d.ts +2 -46
- package/dist/facts/FactsToolbar.d.ts +5 -5
- package/dist/facts/index.cjs +27 -124
- package/dist/facts/index.cjs.map +1 -1
- package/dist/facts/index.js +13 -118
- package/dist/facts/index.js.map +1 -1
- package/dist/files/FilesPage.d.ts +1 -1
- package/dist/files/FilesToolbar.d.ts +1 -1
- package/dist/files/FolderPicker.d.ts +2 -1
- package/dist/files/ViewerChrome.d.ts +1 -1
- package/dist/files/bulk/FolderFilterButton.d.ts +3 -2
- package/dist/files/cells/BulkLabelSelect.d.ts +11 -0
- package/dist/files/cells/LabelMultiSelect.d.ts +2 -1
- package/dist/files/cells/index.d.ts +1 -0
- package/dist/files/index.cjs +110 -167
- package/dist/files/index.cjs.map +1 -1
- package/dist/files/index.js +96 -159
- package/dist/files/index.js.map +1 -1
- package/dist/home/index.cjs +20 -20
- package/dist/home/index.cjs.map +1 -1
- package/dist/home/index.js +5 -5
- package/dist/home/index.js.map +1 -1
- package/dist/index.cjs +646 -623
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +20 -68
- package/dist/index.js.map +1 -1
- package/dist/settings/SettingsPanel.d.ts +1 -1
- package/dist/settings/TriStateFilterMenu.d.ts +3 -1
- package/dist/settings/index.cjs +55 -280
- package/dist/settings/index.cjs.map +1 -1
- package/dist/settings/index.js +17 -248
- package/dist/settings/index.js.map +1 -1
- package/dist/shell/FilterInput.d.ts +48 -0
- package/dist/shell/TabHeader.d.ts +7 -1
- package/dist/shell/index.cjs +62 -49
- package/dist/shell/index.d.ts +1 -0
- package/dist/shell/index.js +4 -3
- package/dist/site/index.cjs +62 -62
- package/dist/site/index.js +2 -2
- package/dist/studio/index.cjs +75 -75
- package/dist/studio/index.js +6 -6
- package/dist/workspaces/WorkspaceCard.d.ts +2 -2
- package/dist/workspaces/index.cjs +9 -2
- package/dist/workspaces/index.cjs.map +1 -1
- package/dist/workspaces/index.js +9 -2
- package/dist/workspaces/index.js.map +1 -1
- package/package.json +9 -13
- package/src/blocks.css +4 -0
- package/src/components/grid.css +10 -0
- package/src/docx/styles.css +488 -43
- package/dist/chunk-3NZR6PAG.js.map +0 -1
- package/dist/chunk-4XJZ6AAY.js.map +0 -1
- package/dist/chunk-5B4PXAKI.cjs.map +0 -1
- package/dist/chunk-5ZBP7TCD.cjs.map +0 -1
- package/dist/chunk-6YVI74BC.js.map +0 -1
- package/dist/chunk-C75S6USL.js.map +0 -1
- package/dist/chunk-FRRDPYBR.cjs.map +0 -1
- package/dist/chunk-GVQOBJKR.cjs.map +0 -1
- package/dist/chunk-JGZTRLKL.cjs.map +0 -1
- package/dist/chunk-JLOYWXRB.js.map +0 -1
- package/dist/chunk-KXMDOTGW.js.map +0 -1
- package/dist/chunk-NJL4LIXX.js.map +0 -1
- package/dist/chunk-NUPVHEJW.js.map +0 -1
- package/dist/chunk-OJSWQM4G.js.map +0 -1
- package/dist/chunk-PLGVMLBD.cjs.map +0 -1
- package/dist/chunk-QN42OA5J.js.map +0 -1
- package/dist/chunk-RGHQFJOL.cjs.map +0 -1
- package/dist/chunk-S5HZBXZA.cjs.map +0 -1
- package/dist/chunk-TZ4QF7EP.js.map +0 -1
- package/dist/chunk-UBNVIIBT.js.map +0 -1
- package/dist/chunk-VMCOH3AY.cjs.map +0 -1
- package/dist/chunk-WSJVHSGN.js.map +0 -1
- package/dist/chunk-YVIOCITQ.cjs.map +0 -1
- package/dist/chunk-ZHLMDJCO.cjs.map +0 -1
- package/dist/chunk-ZORQ5M3W.cjs.map +0 -1
- package/dist/chunk-ZVPTFTGV.cjs.map +0 -1
package/dist/facts/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/facts/fact-text.ts","../../src/facts/factColumns.tsx","../../src/facts/FactRowActions.tsx","../../src/facts/FactsTable.tsx","../../src/facts/fact-row.ts","../../src/facts/FactLabelsCell.tsx","../../src/facts/timezone.ts","../../src/facts/fact-date.ts","../../src/facts/FactDateInput.tsx","../../src/facts/FactPassages.tsx","../../src/facts/FactSourceGroup.tsx","../../src/facts/FactsViewToggle.tsx","../../src/facts/FactsFilterInput.tsx","../../src/facts/FactsFieldsButton.tsx","../../src/facts/FactTimelineViews.tsx","../../src/facts/FactsEmptyState.tsx","../../src/facts/FactComposer.tsx","../../src/facts/FactsBulkBar.tsx","../../src/facts/FactsToolbar.tsx","../../src/facts/FactSearchParts.tsx"],"names":["jsx","Pin","testIdOr","cn","jsxs","formatSpan","CalendarDays","Quote","DropdownMenu","DropdownMenuTrigger","MoreVertical","DropdownMenuContent","DropdownMenuItem","Pencil","DropdownMenuSeparator","Trash2","useMemo","GridView","memo","FactLabelsCell","useState","useRef","useEffect","observeResize","Popover","PopoverTrigger","PencilLine","Fragment","Check","PopoverContent","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem","ChevronLeft","ChevronRight","Input","Button","X","Table2","CalendarRange","GanttChartSquare","Search","ViewToggle","Filter","SlidersHorizontal","Columns3","ChevronDown","RotateCcw","CommandSeparator","TimelineCalendar","TimelineGantt","CalendarClock","Scale","Lightbulb","Milestone","ArrowRight","Loader2","Tooltip","TooltipTrigger","Info","TooltipContent","SelectionBar","SelectionBarAction","PinOff","Tags","MoreHorizontal","FolderUp","BookMarked","TabHeader","Plus","SearchHit","CheckCircle2","CornerDownLeft"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * A fact's text is written in the rich markdown editor, which encodes\n * otherwise-insignificant whitespace as HTML character references so it survives\n * markdown's round-trip — a trailing space becomes ` `, a tab `	`, and\n * so on. The editor decodes them back when it re-renders, but anything that\n * shows the raw text (the grid cell, its tooltip) prints the reference verbatim,\n * so a fact reads like `This is a fact. ` instead of `This is a fact.`.\n *\n * {@link decodeWhitespaceEntities} turns those references back into the\n * characters they stand for. Only WHITESPACE code points are decoded, so the\n * result is safe both to store as markdown (an escaped `*` or `<` is never\n * turned back into active syntax) and to show as plain text.\n */\n\n// Horizontal whitespace the editor emits as an entity: space, tab, no-break\n// space. Newline/CR are deliberately left alone — decoding them could change a\n// stored fact's block structure.\nconst WHITESPACE_CODE_POINTS = new Set([0x20, 0x09, 0xa0])\n\nexport function decodeWhitespaceEntities(text: string | null | undefined): string {\n if (!text) return ''\n return text.replace(/&#x([0-9a-f]+);|&#(\\d+);/gi, (match, hex: string, dec: string) => {\n const code = hex ? parseInt(hex, 16) : parseInt(dec, 10)\n return WHITESPACE_CODE_POINTS.has(code) ? String.fromCodePoint(code) : match\n })\n}\n","/**\n * Column definitions for the Facts grid. Every column has an explicit `colId` (AG Grid persists\n * column state by id: see CLAUDE.md). The app supplies behaviour and app-specific cells through\n * slots; the structure, widths, sorting, filters and presentational cells live here.\n */\nimport type { CSSProperties, ReactNode } from 'react'\nimport type {\n ColDef,\n ICellRendererParams,\n IHeaderParams,\n ValueGetterParams,\n} from 'ag-grid-community'\nimport { CalendarDays, Pin, Quote } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { formatSpan } from '../timeline/span'\nimport { decodeWhitespaceEntities } from './fact-text'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactColumnLabels {\n pinnedHeaderTooltip: string\n pinnedTitle: string\n unpinnedTitle: string\n unpin: string\n pin: string\n fact: string\n dates: string\n dateTitle: string\n labels: string\n verified: string\n verifiedTooltip: string\n shared: string\n sharedTooltip: string\n createdBy: string\n sources: string\n /** Tooltip of the Sources cell for `count` cited documents. */\n sourcedFrom: (count: number) => string\n createdAt: string\n updated: string\n id: string\n}\n\nexport const DEFAULT_FACT_COLUMN_LABELS: FactColumnLabels = {\n pinnedHeaderTooltip: 'Pinned facts are given to the assistant every turn',\n pinnedTitle: 'Pinned — sent with every AI request. Click to unpin.',\n unpinnedTitle: 'Pin — send with every AI request',\n unpin: 'Unpin fact',\n pin: 'Pin fact',\n fact: 'Fact',\n dates: 'Dates',\n dateTitle: 'Date of the fact itself, not when this was saved',\n labels: 'Labels',\n verified: 'Verified',\n verifiedTooltip: 'Verified by a human',\n shared: 'Shared',\n sharedTooltip: 'Shared with the workspace, or private to you & your agents',\n createdBy: 'Created by',\n sources: 'Sources',\n sourcedFrom: (n) => `Sourced from ${n} document${n === 1 ? '' : 's'} — open the fact to see them`,\n createdAt: 'Created at',\n updated: 'Updated',\n id: 'ID',\n}\n\nexport interface FactColumnTestIds {\n pinned: (factId: string) => string\n text: (factId: string) => string\n date: (factId: string) => string\n}\n\n/** The fields of a fact the grid reads. Callers' richer types are accepted as-is. */\nexport interface FactRowView {\n external_id: string\n text: string\n pinned: boolean\n confirmed: boolean\n shared: boolean\n date_start?: string | null\n date_end?: string | null\n timezone?: string | null\n tags?: Array<{ name: string }> | null\n citations?: unknown[] | null\n created_by_ext_id?: string | null\n created_at?: string | null\n updated_at?: string | null\n}\n\nexport interface FactColumnSlots<T extends FactRowView> {\n onTogglePin: (fact: T) => void\n /** Custom header (persistent filter button) for the columns that use one. */\n renderHeader: (params: IHeaderParams, colId: string) => ReactNode\n /** Row action menu, shown at the right edge of the Fact cell. */\n renderRowActions: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** Inline label picker for the Labels cell. */\n renderLabels: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** The Verified switch. */\n renderVerified: (fact: T) => ReactNode\n /** The Shared switch. */\n renderShared: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** The creator avatar. */\n renderCreator: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** Sort/filter value for the Created by column (the creator's display name). */\n getCreatorName: (params: ValueGetterParams<T>) => string\n /** Friendly display of an ISO timestamp (Created at / Updated). */\n formatDate: (iso: string) => string\n labels?: Partial<FactColumnLabels>\n testIds?: Partial<FactColumnTestIds>\n}\n\n/**\n * Date-filter params for a column whose value is an ISO string. AG Grid hands the comparator a JS\n * `Date` from the picker and the raw cell value; this compares UTC day components so a filter\n * never shifts a date by a day for viewers west of UTC.\n */\nexport const ISO_DATE_FILTER_PARAMS = {\n browserDatePicker: true,\n comparator: (filterDate: Date, cellValue: unknown): number => {\n if (!cellValue || typeof cellValue !== 'string') return -1\n const cell = new Date(cellValue)\n if (Number.isNaN(cell.getTime())) return -1\n const cellDay = Date.UTC(cell.getUTCFullYear(), cell.getUTCMonth(), cell.getUTCDate())\n const filterDay = Date.UTC(\n filterDate.getFullYear(),\n filterDate.getMonth(),\n filterDate.getDate()\n )\n return cellDay < filterDay ? -1 : cellDay > filterDay ? 1 : 0\n },\n}\n\n/** How many source documents a fact cites (the Sources column counts documents, not passages). */\nexport function sourceDocCount(fact: Pick<FactRowView, 'citations'> | undefined): number {\n return fact?.citations?.length ?? 0\n}\n\n/** Default left-to-right order; default-hidden columns trail. Every colId must be listed. */\nexport const DEFAULT_FACT_COLUMN_ORDER = [\n 'pinned',\n 'text',\n 'sources',\n 'tags',\n 'date',\n 'confirmed',\n 'shared',\n 'created_by',\n 'created_at',\n 'updated_at',\n 'note_id',\n] as const\n\nexport function createFactColumns<T extends FactRowView>(slots: FactColumnSlots<T>): ColDef<T>[] {\n // AG Grid's `field` is a path type over the row; for a generic row we assert the known keys.\n const fieldOf = (name: keyof FactRowView) => name as ColDef<T>['field']\n const l = { ...DEFAULT_FACT_COLUMN_LABELS, ...slots.labels }\n const ids = slots.testIds\n\n const columns: ColDef<T>[] = [\n {\n colId: 'pinned',\n headerName: '',\n headerComponent: () => (\n <span className=\"flex size-full items-center justify-center\">\n <Pin className=\"size-3.5 text-muted-foreground\" />\n </span>\n ),\n field: fieldOf('pinned'),\n width: 44,\n minWidth: 44,\n maxWidth: 44,\n sortable: true,\n resizable: false,\n headerTooltip: l.pinnedHeaderTooltip,\n cellClass: 'cell-hcenter',\n // A toggle, not a readout: pinning is the row's most consequential switch (pinned facts\n // ride every AI request), so it flips in place.\n cellRenderer: (params: ICellRendererParams<T>) => {\n if (!params.data) return null\n const fact = params.data\n return (\n <button\n type=\"button\"\n onClick={() => slots.onTogglePin(fact)}\n title={fact.pinned ? l.pinnedTitle : l.unpinnedTitle}\n aria-label={fact.pinned ? l.unpin : l.pin}\n aria-pressed={fact.pinned}\n data-testid={testIdOr(ids?.pinned?.(fact.external_id), {\n testId: `facts-grid-pinned-${fact.external_id}`,\n })}\n className=\"flex h-full items-center\"\n >\n <Pin\n className={cn(\n 'size-3.5',\n fact.pinned\n ? 'fill-current text-yellow-text'\n : 'text-muted-foreground/30 transition-colors hover:text-muted-foreground'\n )}\n />\n </button>\n )\n },\n },\n {\n colId: 'text',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'text'),\n headerName: l.fact,\n field: fieldOf('text'),\n flex: 3,\n minWidth: 280,\n sortable: true,\n filter: 'agTextColumnFilter',\n // Decode the editor's whitespace entities (` ` for a trailing space) so the tooltip\n // reads as typed, not as raw markdown references.\n tooltipValueGetter: (p) => decodeWhitespaceEntities(p.data?.text),\n // Editable only via the grid api (Rename in the row's menu); clicks never open the editor\n // (suppressClickEdit on the grid).\n editable: true,\n cellEditor: 'agLargeTextCellEditor',\n cellEditorPopup: true,\n cellEditorParams: { rows: 8, cols: 60 },\n valueSetter: (params) => {\n if (!params.data) return false\n params.data.text = params.newValue\n return true\n },\n // NOT `cell-multiline`: this cell has its OWN clamp (the `.fact-clamp` span below, sized\n // from the row height). A second clamp cut the text in half at the minimum row height.\n cellClass: 'relative',\n cellRenderer: (params: ICellRendererParams<T>) => {\n if (!params.data) return null\n const fact = params.data\n // Clamp to however many WHOLE lines fit the row height (leading-snug ~ 20px/line),\n // top-aligned so the BEGINNING of the fact is always shown. No overflow clip here: the\n // wrapper is the cell's content box, shorter than a line at the density floor.\n const rowH = params.node.rowHeight ?? 52\n const clampLines = Math.max(1, Math.floor(rowH / 20))\n return (\n <div className=\"relative flex size-full items-start pr-6\">\n <span\n className=\"fact-clamp whitespace-normal break-words text-sm leading-snug text-foreground\"\n style={{ ['--fact-clamp-lines' as string]: clampLines } as CSSProperties}\n data-testid={testIdOr(ids?.text?.(fact.external_id), {\n testId: `facts-grid-text-${fact.external_id}`,\n })}\n >\n {decodeWhitespaceEntities(fact.text)}\n </span>\n {/* `facts-row-kebab` (app CSS) keeps the menu always visible: touch has no hover. */}\n <div className=\"facts-row-kebab absolute right-0.5 top-1/2 -translate-y-1/2\">\n {slots.renderRowActions(fact, params)}\n </div>\n </div>\n )\n },\n },\n {\n colId: 'date',\n // AG Grid's DEFAULT header, so the sort arrow and filter button are the native ones,\n // identical to the Files table's Date columns.\n headerName: l.dates,\n // Sort on the raw bound rather than the rendered string (\"Oct 2019\" sorts April first).\n field: fieldOf('date_start'),\n flex: 0.8,\n minWidth: 132,\n sortable: true,\n filter: 'agDateColumnFilter',\n filterParams: ISO_DATE_FILTER_PARAMS,\n // The edit value is the date-only slice: a lexical sort matches a chronological one, and\n // the inline editor shows \"2024-03-12\" rather than a full ISO timestamp. Inline typing\n // accepts YYYY, YYYY-MM or YYYY-MM-DD; clearing the cell undates the fact.\n editable: true,\n singleClickEdit: true,\n valueGetter: (params: ValueGetterParams<T>) =>\n params.data?.date_start ? params.data.date_start.slice(0, 10) : null,\n valueSetter: (params) => {\n if (!params.data) return false\n params.data.date_start = params.newValue\n return true\n },\n cellClass: 'relative cell-tnum',\n cellRenderer: (params: ICellRendererParams<T>) => {\n const when = formatSpan(\n params.data?.date_start,\n params.data?.date_end,\n params.data?.timezone\n )\n if (!when) return <span className=\"text-muted-foreground/50\">—</span>\n return (\n <span\n className=\"inline-flex items-center gap-1\"\n data-testid={testIdOr(ids?.date?.(params.data?.external_id ?? ''), {\n testId: `facts-grid-date-${params.data?.external_id}`,\n })}\n title={l.dateTitle}\n >\n <CalendarDays className=\"size-3 opacity-70\" />\n {when}\n </span>\n )\n },\n },\n {\n colId: 'tags',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'tags'),\n headerName: l.labels,\n flex: 0.9,\n // Never narrower than its own header, even with the filter button and sort indicator.\n minWidth: 160,\n sortable: true,\n filter: 'agTextColumnFilter',\n cellClass: 'overflow-visible',\n valueGetter: (params: ValueGetterParams<T>) =>\n (params.data?.tags ?? []).map((t) => t.name).join(', '),\n // Editable in place: toggling a label persists immediately, no dialog round-trip.\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? slots.renderLabels(params.data, params) : null,\n },\n {\n colId: 'confirmed',\n headerName: l.verified,\n headerTooltip: l.verifiedTooltip,\n field: fieldOf('confirmed'),\n // minWidth matches width so the header can't be clamped narrow enough to ellipsize.\n width: 116,\n minWidth: 116,\n sortable: true,\n cellDataType: 'boolean',\n valueGetter: (params) => params.data?.confirmed ?? false,\n cellClass: 'cell-hcenter',\n headerClass: 'header-hcenter',\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? (\n <div className=\"flex h-full items-center justify-center\">\n {slots.renderVerified(params.data)}\n </div>\n ) : null,\n },\n {\n colId: 'shared',\n headerName: l.shared,\n headerTooltip: l.sharedTooltip,\n field: fieldOf('shared'),\n // minWidth (not just width) is raised too: AG Grid clamps any persisted width up to it.\n width: 110,\n minWidth: 110,\n sortable: true,\n headerClass: 'header-hcenter',\n cellDataType: 'boolean',\n valueGetter: (params) => params.data?.shared ?? false,\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? (\n <div className=\"flex h-full items-center justify-center\">\n {slots.renderShared(params.data, params)}\n </div>\n ) : null,\n },\n {\n colId: 'created_by',\n headerName: l.createdBy,\n headerTooltip: l.createdBy,\n width: 138,\n minWidth: 138,\n sortable: true,\n valueGetter: (params) => slots.getCreatorName(params),\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? (\n <div className=\"flex h-full items-center justify-center\">\n {slots.renderCreator(params.data, params)}\n </div>\n ) : null,\n },\n {\n colId: 'sources',\n headerName: l.sources,\n width: 112,\n minWidth: 104,\n sortable: true,\n // A hand-written fact has no sources, which is information rather than a gap: it reads as\n // an em dash instead of a zero.\n valueGetter: (params) => sourceDocCount(params.data),\n cellRenderer: (params: ICellRendererParams<T>) => {\n const n = sourceDocCount(params.data)\n if (n === 0) return <span className=\"text-muted-foreground/40\">—</span>\n return (\n <span\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground\"\n title={l.sourcedFrom(n)}\n >\n <Quote className=\"size-3 opacity-70\" />\n {n}\n </span>\n )\n },\n },\n {\n colId: 'created_at',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'created_at'),\n headerName: l.createdAt,\n field: fieldOf('created_at'),\n width: 162,\n minWidth: 154,\n sortable: true,\n filter: 'agDateColumnFilter',\n filterParams: ISO_DATE_FILTER_PARAMS,\n // Display-only: a valueFormatter avoids mounting a React component per row.\n cellClass: 'text-muted-foreground',\n valueFormatter: (params) => (params.value ? slots.formatDate(params.value) : ''),\n },\n {\n colId: 'updated_at',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'updated_at'),\n headerName: l.updated,\n field: fieldOf('updated_at'),\n width: 140,\n minWidth: 140,\n // Hidden by default: a column-menu opt-in like the documents grid's long tail.\n hide: true,\n sortable: true,\n filter: 'agDateColumnFilter',\n filterParams: ISO_DATE_FILTER_PARAMS,\n valueFormatter: (params) => (params.value ? slots.formatDate(params.value) : ''),\n },\n {\n colId: 'note_id',\n headerName: l.id,\n field: fieldOf('external_id'),\n width: 120,\n minWidth: 100,\n sortable: true,\n filter: 'agTextColumnFilter',\n // Hidden by default like the documents ID column: needed when quoting a fact to support.\n hide: true,\n cellClass: 'font-mono text-xs text-muted-foreground',\n },\n ]\n\n // Persisted per-user column order still wins once set; bump the grid id to apply a new default.\n return DEFAULT_FACT_COLUMN_ORDER.map((id) => columns.find((c) => c.colId === id)).filter(\n (c): c is ColDef<T> => c !== undefined\n )\n}\n","/**\n * FactRowActions\n *\n * The ⋯ kebab menu for a Facts table row — mirroring the documents table's row\n * kebab. Carries Rename (inline-edit the fact text), Edit (the full dialog), and\n * Delete. Replaces the old inline edit-pencil affordance.\n */\nimport { MoreVertical, Pencil, Trash2 } from 'lucide-react'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactRowActionsLabels {\n actions: string\n edit: string\n /** Tooltip on a disabled Edit: rewording a fact is for its creator or a workspace owner. */\n editRestricted: string\n delete: string\n}\n\nexport const DEFAULT_FACT_ROW_ACTIONS_LABELS: FactRowActionsLabels = {\n actions: 'Fact actions',\n edit: 'Edit',\n editRestricted: 'Only the creator or a workspace owner can reword this fact',\n delete: 'Delete',\n}\n\nexport interface FactRowActionsTestIds {\n trigger: string\n edit: string\n delete: string\n}\n\nexport interface FactRowActionsProps {\n onEdit: () => void\n /** False when the viewer may not reword the fact: Edit is shown disabled, with the reason. */\n canEdit?: boolean\n onDelete: () => void\n labels?: Partial<FactRowActionsLabels>\n testIds?: Partial<FactRowActionsTestIds>\n}\n\nexport function FactRowActions({\n onEdit,\n canEdit = true,\n onDelete,\n labels,\n testIds,\n}: FactRowActionsProps) {\n const l = { ...DEFAULT_FACT_ROW_ACTIONS_LABELS, ...labels }\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n onClick={(e) => e.stopPropagation()}\n className=\"flex size-6 pointer-coarse:size-11 items-center justify-center rounded text-muted-foreground/70 transition-colors hover:bg-muted hover:text-foreground data-[state=open]:bg-muted data-[state=open]:text-foreground\"\n data-testid={testIdOr(testIds?.trigger, { testId: 'fact-row-actions' })}\n aria-label={l.actions}\n >\n <MoreVertical className=\"size-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" onClick={(e) => e.stopPropagation()}>\n <DropdownMenuItem\n onSelect={onEdit}\n disabled={!canEdit}\n title={canEdit ? undefined : l.editRestricted}\n data-testid={testIdOr(testIds?.edit, { testId: 'fact-action-edit' })}\n >\n <Pencil className=\"mr-2 size-4\" />\n {l.edit}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={onDelete}\n className=\"text-red-text focus:text-red-text\"\n data-testid={testIdOr(testIds?.delete, { testId: 'fact-action-delete' })}\n >\n <Trash2 className=\"mr-2 size-4\" />\n {l.delete}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","/**\n * FactsTable: the default facts grid. `createFactColumns` wired to `GridView` with ready-made\n * cells (pin, verified and shared switches, label chips, creator initials, row menu), so a host\n * only supplies rows and handlers. Hosts that need custom cells call `createFactColumns` with\n * their own slots and render `GridView` themselves.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport type { ColDef, ICellRendererParams } from 'ag-grid-community'\nimport { cn } from '@arbidocs/react/ui'\nimport { GridView, type GridViewProps } from '../files/GridView'\nimport { initials } from '../lib/format'\nimport { FactRowActions } from './FactRowActions'\nimport {\n DEFAULT_FACT_COLUMN_LABELS,\n createFactColumns,\n type FactColumnLabels,\n type FactRowView,\n} from './factColumns'\n\nexport interface FactsTableProps<T extends FactRowView> {\n facts: T[]\n onTogglePin: (fact: T) => void\n onToggleConfirmed: (fact: T) => void\n onToggleShared: (fact: T) => void\n /** The row menu appears when both `onEdit` and `onDelete` are provided. */\n onEdit?: (fact: T) => void\n onDelete?: (fact: T) => void\n /** Row click (opens the fact). */\n onOpen?: (fact: T) => void\n /** Display name of the fact's creator (sorting, filtering and the initials chip). */\n getCreatorName?: (fact: T) => string\n /** Friendly display of an ISO timestamp. Defaults to the locale date. */\n formatDate?: (iso: string) => string\n columnLabels?: Partial<FactColumnLabels>\n isLoading?: boolean\n /** Saved column state key (AG Grid persists by it). */\n gridId?: string\n height?: GridViewProps<T>['height']\n rowHeight?: number\n /** Escape hatch for any other `GridView` prop. */\n gridProps?: Partial<Omit<GridViewProps<T>, 'items' | 'columnDefs' | 'getItemId'>>\n testId?: string\n}\n\ninterface FactSwitchProps {\n checked: boolean\n label: string\n onToggle: () => void\n testId: string\n}\n\nfunction FactSwitch({ checked, label, onToggle, testId }: FactSwitchProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label}\n onClick={onToggle}\n data-testid={testId}\n className={cn(\n 'inline-flex h-5 w-9 items-center rounded-full p-0.5 transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n checked ? 'bg-green-solid' : 'bg-muted-foreground/30'\n )}\n >\n <span\n className={cn(\n 'size-4 rounded-full bg-background transition-transform',\n checked && 'translate-x-4'\n )}\n />\n </button>\n )\n}\n\nconst defaultFormatDate = (iso: string): string => {\n const d = new Date(iso)\n return Number.isNaN(d.getTime()) ? iso : d.toLocaleDateString()\n}\n\nconst EMPTY_STATE = { title: 'No facts yet' }\n\n/** The default facts table: columns, cells and the grid in one component. */\nexport function FactsTable<T extends FactRowView>({\n facts,\n onTogglePin,\n onToggleConfirmed,\n onToggleShared,\n onEdit,\n onDelete,\n onOpen,\n getCreatorName,\n formatDate = defaultFormatDate,\n columnLabels,\n isLoading,\n gridId = 'facts-table-v1',\n height = '100%',\n rowHeight = 52,\n gridProps,\n testId = 'facts-table',\n}: FactsTableProps<T>) {\n const l = { ...DEFAULT_FACT_COLUMN_LABELS, ...columnLabels }\n\n const columnDefs = useMemo<ColDef<T>[]>(\n () =>\n createFactColumns<T>({\n onTogglePin,\n renderHeader: (params) => (\n <span className=\"text-[12.5px] font-medium\">{params.displayName}</span>\n ),\n renderRowActions: (fact) =>\n onEdit && onDelete ? (\n <FactRowActions onEdit={() => onEdit(fact)} onDelete={() => onDelete(fact)} />\n ) : null,\n renderLabels: (fact): ReactNode => (\n <span className=\"flex flex-wrap items-center gap-1\">\n {(fact.tags ?? []).map((tag) => (\n <span\n key={tag.name}\n className=\"rounded-full bg-muted px-2 py-px text-xs text-muted-foreground\"\n >\n {tag.name}\n </span>\n ))}\n </span>\n ),\n renderVerified: (fact) => (\n <FactSwitch\n checked={fact.confirmed}\n label={l.verified}\n onToggle={() => onToggleConfirmed(fact)}\n testId={`facts-grid-confirmed-${fact.external_id}`}\n />\n ),\n renderShared: (fact) => (\n <FactSwitch\n checked={fact.shared}\n label={l.shared}\n onToggle={() => onToggleShared(fact)}\n testId={`facts-grid-shared-${fact.external_id}`}\n />\n ),\n renderCreator: (fact, _params: ICellRendererParams<T>) => {\n const name = getCreatorName?.(fact) ?? ''\n return name ? (\n <span\n title={name}\n className=\"inline-flex size-6 items-center justify-center rounded-full bg-muted text-[10px] font-medium text-muted-foreground\"\n >\n {initials(name)}\n </span>\n ) : null\n },\n getCreatorName: (params) => (params.data ? (getCreatorName?.(params.data) ?? '') : ''),\n formatDate,\n labels: columnLabels,\n }),\n [\n onTogglePin,\n onToggleConfirmed,\n onToggleShared,\n onEdit,\n onDelete,\n getCreatorName,\n formatDate,\n columnLabels,\n l.verified,\n l.shared,\n ]\n )\n\n return (\n <GridView<T>\n testId={testId}\n items={facts}\n columnDefs={columnDefs}\n getItemId={(fact) => fact.external_id}\n onRowClick={onOpen}\n isLoading={isLoading}\n emptyState={EMPTY_STATE}\n gridId={gridId}\n height={height}\n rowHeight={rowHeight}\n {...gridProps}\n gridOptions={{ suppressClickEdit: true, ...gridProps?.gridOptions }}\n />\n )\n}\n","import type { FactRowView } from './factColumns'\n\n/**\n * A fact as a host with plain records usually holds it: camelCase, optional flags, tags as\n * strings. `toFactRow` maps it to the `FactRowView` that `FactsTable` and `createFactColumns`\n * read, so a host without the SDK type needs no adapter of its own.\n */\nexport interface PlainFactRecord {\n id: string\n text: string\n pinned?: boolean\n confirmed?: boolean\n shared?: boolean\n /** ISO date (or date-time) the fact starts. */\n dateStart?: string | null\n dateEnd?: string | null\n timezone?: string | null\n tags?: Array<string | { name: string }> | null\n /** Passages that support the fact; only their count is shown. */\n citations?: unknown[] | null\n createdBy?: string | null\n createdAt?: string | null\n updatedAt?: string | null\n}\n\n/** The row plus the record it came from, so callbacks can hand the host its own object back. */\nexport type PlainFactRow<T extends PlainFactRecord> = FactRowView & { record: T }\n\n/** Map one plain record to a grid row. Missing flags are `false`, missing lists are empty. */\nexport function toFactRow<T extends PlainFactRecord>(record: T): PlainFactRow<T> {\n return {\n external_id: record.id,\n text: record.text,\n pinned: record.pinned ?? false,\n confirmed: record.confirmed ?? false,\n shared: record.shared ?? false,\n date_start: record.dateStart ?? null,\n date_end: record.dateEnd ?? null,\n timezone: record.timezone ?? null,\n tags: (record.tags ?? []).map((t) => (typeof t === 'string' ? { name: t } : t)),\n citations: record.citations ?? [],\n created_by_ext_id: record.createdBy ?? null,\n created_at: record.createdAt ?? null,\n updated_at: record.updatedAt ?? null,\n record,\n }\n}\n\nexport function toFactRows<T extends PlainFactRecord>(records: T[]): PlainFactRow<T>[] {\n return records.map(toFactRow)\n}\n","import { memo, useEffect, useMemo, useRef, useState } from 'react'\nimport { Check, PencilLine } from 'lucide-react'\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@arbidocs/react/ui'\nimport { observeResize } from '../lib/observe-resize'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactLabelsCellLabels {\n edit: string\n searchPlaceholder: string\n create: (name: string) => string\n empty: string\n}\n\nexport const DEFAULT_FACT_LABELS_CELL_LABELS: FactLabelsCellLabels = {\n edit: 'Edit labels',\n searchPlaceholder: 'Search or create...',\n create: (name) => `Create \\u201c${name}\\u201d`,\n empty: 'No labels yet',\n}\n\nexport interface FactLabelsCellTestIds {\n option: (labelId: string) => string\n}\n\n/** One selectable label: id, name and a colour (any CSS colour) that keys its chip. */\nexport interface FactLabelOption {\n id: string\n name: string\n color: string\n}\n\nexport interface FactLabelsCellProps {\n /** Every label that can be applied. */\n options: FactLabelOption[]\n /** The fact's full label id list (ids not in `options` are preserved on change). */\n selectedIds: string[]\n /** Persist the fact's full label id list. */\n onChange: (ids: string[]) => void\n /** Create a label and resolve with its id (undefined when creation failed). */\n onCreate: (name: string) => Promise<string | undefined>\n /** The grid row height; clamps the chips to the rows that fully fit. */\n rowHeight?: number\n labels?: Partial<FactLabelsCellLabels>\n testIds?: Partial<FactLabelsCellTestIds>\n}\n\n// Visible height reserved per chip row: a touch taller than a chip (~22px) so a row is never\n// clipped at the edges, but short enough that the gap hides the next row.\nconst CHIP_ROW_H = 24\nconst CHIP_GAP = 4\n\n/**\n * The Labels cell of the Facts table: applied labels as colour-keyed chips (an empty cell shows\n * a pencil), and a popover to toggle labels or create one with Enter.\n */\nexport const FactLabelsCell = memo(function FactLabelsCell({\n options,\n selectedIds,\n onChange,\n onCreate,\n rowHeight = 52,\n labels,\n testIds,\n}: FactLabelsCellProps) {\n const l = { ...DEFAULT_FACT_LABELS_CELL_LABELS, ...labels }\n const [open, setOpen] = useState(false)\n const [search, setSearch] = useState('')\n\n const applied = useMemo(\n () => new Set(selectedIds.filter((id) => options.some((o) => o.id === id))),\n [selectedIds, options]\n )\n\n const toggle = (option: FactLabelOption) =>\n onChange(\n applied.has(option.id)\n ? selectedIds.filter((id) => id !== option.id)\n : [...selectedIds, option.id]\n )\n\n const createAndApply = async (name: string) => {\n const trimmed = name.trim()\n if (!trimmed) return\n const existing = options.find((o) => o.name.toLowerCase() === trimmed.toLowerCase())\n if (existing) {\n if (!applied.has(existing.id)) onChange([...selectedIds, existing.id])\n setSearch('')\n return\n }\n const id = await onCreate(trimmed)\n if (id) onChange([...selectedIds, id])\n setSearch('')\n }\n\n const clampRows = Math.max(1, Math.floor((rowHeight + CHIP_GAP) / (CHIP_ROW_H + CHIP_GAP)))\n const appliedOptions = options.filter((o) => applied.has(o.id))\n\n // Show an ellipsis whenever chips are hidden below the clamp. A ResizeObserver re-measures on\n // any size change (column resize, row height, layout settling) so the indicator is reliable.\n const chipsRef = useRef<HTMLDivElement>(null)\n const [hasOverflow, setHasOverflow] = useState(false)\n useEffect(() => {\n const el = chipsRef.current\n if (!el) return\n const measure = () => setHasOverflow(el.scrollHeight > el.clientHeight + 1)\n measure()\n return observeResize(el, measure)\n }, [applied, clampRows, rowHeight, options])\n\n const searchMatchesExisting = options.some(\n (o) => o.name.toLowerCase() === search.trim().toLowerCase()\n )\n\n return (\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next)\n if (!next) setSearch('')\n }}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={l.edit}\n data-slot=\"fact-labels-cell\"\n className=\"group relative flex h-full w-full min-w-0 cursor-pointer items-center gap-1 pr-4 text-left hover:bg-muted\"\n >\n {appliedOptions.length === 0 ? (\n <span className=\"flex-1 text-muted-foreground opacity-50\">\n <PencilLine className=\"size-3.5\" />\n </span>\n ) : (\n <>\n <div\n ref={chipsRef}\n className=\"flex min-w-0 flex-1 flex-wrap content-start gap-1 overflow-hidden\"\n style={{ maxHeight: CHIP_ROW_H * clampRows + CHIP_GAP * (clampRows - 1) }}\n >\n {appliedOptions.map((o) => (\n <span\n key={o.id}\n className=\"inline-flex shrink-0 items-center gap-1 rounded border px-1.5 py-0.5 text-xs font-medium\"\n title={o.name}\n style={{ borderColor: o.color }}\n >\n <span\n className=\"flex size-3.5 shrink-0 items-center justify-center rounded\"\n style={{ backgroundColor: o.color }}\n >\n <Check className=\"size-2.5 text-white\" strokeWidth={3} />\n </span>\n <span className=\"max-w-[80px] truncate\">{o.name}</span>\n </span>\n ))}\n </div>\n {hasOverflow && (\n <span\n className=\"pointer-events-none absolute bottom-0.5 right-0.5 text-xs font-semibold leading-none text-muted-foreground\"\n aria-hidden\n >\n …\n </span>\n )}\n </>\n )}\n </button>\n </PopoverTrigger>\n {open && (\n <PopoverContent className=\"w-[360px] p-0\" align=\"start\" side=\"bottom\" sideOffset={4}>\n <Command shouldFilter={true}>\n <CommandInput\n placeholder={l.searchPlaceholder}\n value={search}\n onValueChange={setSearch}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && search.trim() && !searchMatchesExisting) {\n e.preventDefault()\n void createAndApply(search)\n }\n }}\n />\n <CommandList>\n <CommandEmpty>\n {search.trim() ? (\n <button\n type=\"button\"\n onClick={() => void createAndApply(search)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"w-full cursor-pointer rounded px-2 py-1.5 text-left text-sm text-primary hover:bg-accent pointer-coarse:min-h-11\"\n >\n {l.create(search.trim())}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">{l.empty}</span>\n )}\n </CommandEmpty>\n <CommandGroup>\n {options.map((o) => {\n const isApplied = applied.has(o.id)\n return (\n <CommandItem\n key={o.id}\n value={o.name}\n onSelect={() => toggle(o)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.option?.(o.id), {\n testId: `fact-label-select-${o.id}`,\n })}\n >\n <span\n className=\"mr-2 flex size-4 shrink-0 items-center justify-center rounded border-2\"\n style={\n isApplied\n ? { borderColor: o.color, backgroundColor: o.color }\n : { borderColor: o.color }\n }\n >\n {isApplied && <Check className=\"size-3 text-white\" strokeWidth={3} />}\n </span>\n <span className=\"flex-1 text-sm\">{o.name}</span>\n </CommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n )}\n </Popover>\n )\n})\n","/** The viewer's IANA timezone, or UTC when unavailable. */\nexport function detectTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC'\n } catch {\n return 'UTC'\n }\n}\n\n/** Every IANA timezone name the runtime knows, for a datalist. Empty on older engines. */\nexport function supportedTimezones(): string[] {\n try {\n const fn = (Intl as unknown as { supportedValuesOf?: (k: string) => string[] })\n .supportedValuesOf\n return fn ? fn('timeZone') : []\n } catch {\n return []\n }\n}\n","/**\n * A fact's date span, translated between the API's ISO instants and the\n * editable wall-clock fields FactDateInput renders. Kept apart from the\n * component so the conversions are plain functions with no React in them.\n */\nimport { detectTimezone } from './timezone'\n\nexport interface FactDateFields {\n /** `YYYY-MM-DD`. Empty means the fact has no date at all. */\n date: string\n /** `HH:MM`. Empty means `date` is a whole day, not an instant. */\n time: string\n /** IANA zone `time` is expressed in. Only meaningful (and only sent) when `time` is set. */\n timezone: string\n /** `YYYY-MM-DD` end of a range. Empty means a single day/instant, not a span. */\n endDate: string\n /** `HH:MM` paired with `endDate`, only offered once `time` is set. */\n endTime: string\n}\n\nexport const EMPTY_FACT_DATE_FIELDS: FactDateFields = {\n date: '',\n time: '',\n timezone: '',\n endDate: '',\n endTime: '',\n}\n\nfunction isMidnightUtc(d: Date): boolean {\n return d.getUTCHours() === 0 && d.getUTCMinutes() === 0 && d.getUTCSeconds() === 0\n}\n\nfunction isEndOfDayUtc(d: Date): boolean {\n return d.getUTCHours() === 23 && d.getUTCMinutes() === 59\n}\n\nfunction dayKeyUtc(d: Date): string {\n return d.toISOString().slice(0, 10)\n}\n\n/** A timezone name safe to hand to `Intl` — free-typed garbage falls back to UTC\n * rather than throwing and taking the whole date field down with it. */\nfunction safeTimeZone(tz: string): string {\n try {\n new Intl.DateTimeFormat('en-US', { timeZone: tz })\n return tz\n } catch {\n return 'UTC'\n }\n}\n\n/** Wall-clock parts (`YYYY-MM-DD`, `HH:MM`) an ISO instant reads as in `timeZone`. */\nfunction isoToZonedParts(iso: string, timeZone: string): { date: string; time: string } {\n const d = new Date(iso)\n const parts = Object.fromEntries(\n new Intl.DateTimeFormat('en-US', {\n timeZone: safeTimeZone(timeZone),\n hourCycle: 'h23',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n })\n .formatToParts(d)\n .map((p) => [p.type, p.value])\n )\n return {\n date: `${parts.year}-${parts.month}-${parts.day}`,\n time: `${parts.hour}:${parts.minute}`,\n }\n}\n\n/** The UTC instant a `YYYY-MM-DD` + `HH:MM` wall-clock pair means in `timeZone`,\n * found by reading a naive guess back through the zone and correcting for its\n * offset — no date library, at the cost of rare DST-boundary imprecision. */\nfunction zonedPartsToIso(date: string, time: string, timeZone: string): string {\n const tz = safeTimeZone(timeZone)\n const guess = new Date(`${date}T${time}:00Z`)\n const zoned = isoToZonedParts(guess.toISOString(), tz)\n const [y, m, dd] = zoned.date.split('-').map(Number)\n const [hh, mi] = zoned.time.split(':').map(Number)\n const asIfUtc = Date.UTC(y, m - 1, dd, hh, mi)\n const offsetMs = asIfUtc - guess.getTime()\n return new Date(guess.getTime() - offsetMs).toISOString()\n}\n\n/** Editable fields from a stored fact's date span — the inverse of `factDateFieldsToSpan`. */\nexport function factDateSpanToFields(\n dateStart: string | null | undefined,\n dateEnd: string | null | undefined,\n timezone: string | null | undefined\n): FactDateFields {\n if (!dateStart) return EMPTY_FACT_DATE_FIELDS\n const start = new Date(dateStart)\n if (Number.isNaN(start.getTime())) return EMPTY_FACT_DATE_FIELDS\n const end = dateEnd ? new Date(dateEnd) : start\n const dateOnly = isMidnightUtc(start) && (!dateEnd || isEndOfDayUtc(end))\n\n if (dateOnly) {\n const startKey = dayKeyUtc(start)\n const endKey = dateEnd ? dayKeyUtc(end) : startKey\n return { ...EMPTY_FACT_DATE_FIELDS, date: startKey, endDate: endKey !== startKey ? endKey : '' }\n }\n\n const tz = timezone || 'UTC'\n const startParts = isoToZonedParts(dateStart, tz)\n const isInstant = !dateEnd || dateStart === dateEnd\n const endParts = isInstant ? null : isoToZonedParts(dateEnd, tz)\n return {\n date: startParts.date,\n time: startParts.time,\n timezone: tz,\n endDate: endParts?.date ?? '',\n endTime: endParts?.time ?? '',\n }\n}\n\n/** A fact's date span for the API — the inverse of `factDateSpanToFields`. `null`s\n * clear the span entirely; a bare date (no time) stays timezone-agnostic. */\nexport function factDateFieldsToSpan(fields: FactDateFields): {\n date: string | null\n date_end: string | null\n timezone: string | null\n} {\n if (!fields.date) return { date: null, date_end: null, timezone: null }\n const tz = fields.timezone || detectTimezone()\n\n const startIso = fields.time\n ? zonedPartsToIso(fields.date, fields.time, tz)\n : `${fields.date}T00:00:00.000Z`\n\n let endIso: string\n if (fields.endDate) {\n endIso =\n fields.time && fields.endTime\n ? zonedPartsToIso(fields.endDate, fields.endTime, tz)\n : `${fields.endDate}T23:59:59.000Z`\n } else {\n endIso = fields.time ? startIso : `${fields.date}T23:59:59.000Z`\n }\n\n return { date: startIso, date_end: endIso, timezone: fields.time ? tz : null }\n}\n","/**\n * A fact's date, edited in a popover: a month calendar to pick the day, with\n * optional start time, end time and end date beneath it. Fully controlled —\n * the FactDateFields shape is unchanged, so fact-date.ts still converts to and\n * from the API's ISO span. A time silently brings the viewer's timezone with\n * it (editable), and an end time implies an end date (defaulting to the start\n * day) so a same-day interval round-trips through the span conversion.\n */\nimport { useMemo, useState } from 'react'\nimport { CalendarDays, ChevronLeft, ChevronRight, X } from 'lucide-react'\nimport { Button, Input, Popover, PopoverContent, PopoverTrigger, cn } from '@arbidocs/react/ui'\nimport { formatSpan } from '../timeline/span'\nimport { factDateFieldsToSpan, EMPTY_FACT_DATE_FIELDS, type FactDateFields } from './fact-date'\nimport { detectTimezone, supportedTimezones } from './timezone'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactDateInputLabels {\n weekdays: string[]\n months: string[]\n previousMonth: string\n earlierYears: string\n nextMonth: string\n laterYears: string\n pickYear: string\n addDate: string\n startTime: string\n endTime: string\n setStartFirst: string\n timezone: string\n endDate: string\n clearDate: string\n}\n\nexport const DEFAULT_FACT_DATE_INPUT_LABELS: FactDateInputLabels = {\n weekdays: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n months: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n previousMonth: 'Previous month',\n earlierYears: 'Earlier years',\n nextMonth: 'Next month',\n laterYears: 'Later years',\n pickYear: 'Pick a year',\n addDate: 'Add a date',\n startTime: 'Start time',\n endTime: 'End time',\n setStartFirst: 'Set a start time first',\n timezone: 'Timezone',\n endDate: 'End date (optional)',\n clearDate: 'Clear date',\n}\n\nexport interface FactDateInputTestIds {\n caption: string\n day: (dateKey: string) => string\n year: (year: number) => string\n}\n\n/** `YYYY-MM-DD` for a calendar cell — local parts, never toISOString (which\n * would shift the day for viewers west of UTC). */\nfunction dayKey(year: number, monthIndex: number, day: number): string {\n const m = String(monthIndex + 1).padStart(2, '0')\n const d = String(day).padStart(2, '0')\n return `${year}-${m}-${d}`\n}\n\n/** Pretty `YYYY-MM-DD` → \"Mar 12, 2024\" using UTC parts (no day shift). */\nfunction prettyDay(iso: string): string {\n const [y, m, d] = iso.split('-').map(Number)\n if (!y || !m || !d) return iso\n return new Date(Date.UTC(y, m - 1, d)).toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n timeZone: 'UTC',\n })\n}\n\n/** Trigger label when times are present — includes the Start time and, if set,\n * the End time (which formatSpan omits on a range). */\nfunction summarizeWithTimes(v: FactDateFields): string {\n const start = `${prettyDay(v.date)}, ${v.time}`\n const endDay = v.endDate || v.date\n if (v.endTime) return `${start} – ${prettyDay(endDay)}, ${v.endTime}`\n if (v.endDate && v.endDate !== v.date) return `${start} – ${prettyDay(v.endDate)}`\n return start\n}\n\n/** A month grid that reads and writes `YYYY-MM-DD` strings — no date library. */\nfunction MonthCalendar({\n selected,\n onSelect,\n labels: l,\n testIds,\n}: {\n selected: string\n onSelect: (dateKey: string) => void\n labels: FactDateInputLabels\n testIds?: Partial<FactDateInputTestIds>\n}) {\n const now = new Date()\n const todayKey = dayKey(now.getFullYear(), now.getMonth(), now.getDate())\n\n const initial = useMemo(() => {\n if (selected) {\n const [y, m] = selected.split('-').map(Number)\n if (y && m) return { year: y, monthIndex: m - 1 }\n }\n return { year: now.getFullYear(), monthIndex: now.getMonth() }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n const [view, setView] = useState(initial)\n // 'days' shows the month grid; 'years' shows a grid of years so a distant year\n // is one click away instead of dozens of month steps. yearStart is the first\n // year of the visible 12-year page.\n const [mode, setMode] = useState<'days' | 'years'>('days')\n const [yearStart, setYearStart] = useState(initial.year - 5)\n\n const firstWeekday = new Date(view.year, view.monthIndex, 1).getDay()\n const daysInMonth = new Date(view.year, view.monthIndex + 1, 0).getDate()\n\n const cells: Array<number | null> = [\n ...Array.from({ length: firstWeekday }, () => null),\n ...Array.from({ length: daysInMonth }, (_, i) => i + 1),\n ]\n\n const step = (delta: number) => {\n const next = view.monthIndex + delta\n setView({\n year: view.year + Math.floor(next / 12),\n monthIndex: ((next % 12) + 12) % 12,\n })\n }\n\n // The caption's chevrons page months in day view, and whole 12-year blocks in\n // year view. Clicking the caption opens the year grid; picking a year returns\n // to that year's month.\n const openYears = () => {\n setYearStart(view.year - 5)\n setMode('years')\n }\n const pickYear = (year: number) => {\n setView((v) => ({ ...v, year }))\n setMode('days')\n }\n const years = Array.from({ length: 12 }, (_, i) => yearStart + i)\n\n return (\n <div className=\"w-[248px]\">\n <div className=\"flex items-center justify-between px-1 pb-2\">\n <button\n type=\"button\"\n onClick={() => (mode === 'days' ? step(-1) : setYearStart((s) => s - 12))}\n className=\"rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground pointer-coarse:p-3\"\n aria-label={mode === 'days' ? l.previousMonth : l.earlierYears}\n >\n <ChevronLeft className=\"size-4\" />\n </button>\n {mode === 'days' ? (\n <button\n type=\"button\"\n onClick={openYears}\n className=\"rounded px-1.5 py-0.5 text-sm font-medium hover:bg-accent hover:text-foreground\"\n aria-label={l.pickYear}\n data-testid={testIdOr(testIds?.caption, { testId: 'fact-calendar-caption' })}\n >\n {l.months[view.monthIndex]} {view.year}\n </button>\n ) : (\n <span className=\"text-sm font-medium\">\n {yearStart} – {yearStart + 11}\n </span>\n )}\n <button\n type=\"button\"\n onClick={() => (mode === 'days' ? step(1) : setYearStart((s) => s + 12))}\n className=\"rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground pointer-coarse:p-3\"\n aria-label={mode === 'days' ? l.nextMonth : l.laterYears}\n >\n <ChevronRight className=\"size-4\" />\n </button>\n </div>\n {mode === 'days' ? (\n <div className=\"grid grid-cols-7 gap-0.5\">\n {l.weekdays.map((w) => (\n <div key={w} className=\"py-1 text-center text-xs font-medium text-muted-foreground\">\n {w}\n </div>\n ))}\n {cells.map((day, i) => {\n if (day === null) return <div key={`blank-${i}`} />\n const key = dayKey(view.year, view.monthIndex, day)\n const isSelected = key === selected\n const isToday = key === todayKey\n return (\n <button\n key={key}\n type=\"button\"\n onClick={() => onSelect(key)}\n data-testid={testIdOr(testIds?.day?.(key), { testId: `fact-calendar-day-${key}` })}\n className={cn(\n 'h-8 rounded text-xs transition-colors hover:bg-accent pointer-coarse:h-11',\n isSelected && 'bg-primary text-primary-foreground hover:bg-primary',\n !isSelected && isToday && 'ring-1 ring-inset ring-primary/50'\n )}\n >\n {day}\n </button>\n )\n })}\n </div>\n ) : (\n <div className=\"grid grid-cols-3 gap-1\">\n {years.map((y) => (\n <button\n key={y}\n type=\"button\"\n onClick={() => pickYear(y)}\n data-testid={testIdOr(testIds?.year?.(y), { testId: `fact-calendar-year-${y}` })}\n className={cn(\n 'h-9 rounded text-xs transition-colors hover:bg-accent pointer-coarse:h-11',\n y === view.year && 'bg-primary text-primary-foreground hover:bg-primary'\n )}\n >\n {y}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport interface FactDateInputProps {\n value: FactDateFields\n onChange: (next: FactDateFields) => void\n /** Prefix for data-testids: keeps composer vs. edit-row instances distinct. */\n idPrefix: string\n labels?: Partial<FactDateInputLabels>\n /** Overrides for the calendar's own ids (the field ids derive from `idPrefix`). */\n testIds?: Partial<FactDateInputTestIds>\n}\n\n/** A fact's date in a popover: month/year calendar plus optional times, timezone and end date. */\nexport function FactDateInput({ value, onChange, idPrefix, labels, testIds }: FactDateInputProps) {\n const l = { ...DEFAULT_FACT_DATE_INPUT_LABELS, ...labels }\n const [open, setOpen] = useState(false)\n const timezones = useMemo(() => supportedTimezones(), [])\n const timezoneListId = `${idPrefix}-timezone-options`\n\n // The trigger reads the same way a fact's date renders in the grid, so the\n // button label and the row agree — EXCEPT when explicit times are set:\n // formatSpan drops the clock time on a start/end-time range, so we build a\n // time-inclusive label ourselves in that case (formatSpan still handles the\n // day/month/year precisions nicely when there are no times).\n const span = factDateFieldsToSpan(value)\n const summary =\n value.time || value.endTime\n ? summarizeWithTimes(value)\n : formatSpan(span.date, span.date_end, span.timezone)\n\n const setDate = (dateKey: string) =>\n onChange({ ...value, date: dateKey, endDate: value.endDate && dateKey ? value.endDate : '' })\n\n // Setting a start time needs a timezone to be meaningful; setting an end time\n // needs an end date for the span conversion to keep it (defaults to the start\n // day, i.e. a same-day interval).\n const setStartTime = (time: string) =>\n onChange({\n ...value,\n time,\n timezone: time ? value.timezone || detectTimezone() : '',\n endTime: time ? value.endTime : '',\n })\n\n const setEndTime = (endTime: string) =>\n onChange({\n ...value,\n endTime,\n endDate: endTime ? value.endDate || value.date : value.endDate,\n })\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex h-9 w-full items-center gap-2 rounded-md border border-input bg-transparent px-3 text-sm transition-colors hover:bg-accent/50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n !summary && 'text-muted-foreground'\n )}\n data-testid={`${idPrefix}-date-trigger`}\n >\n <CalendarDays className=\"size-4 shrink-0 text-muted-foreground\" />\n <span className=\"truncate\">{summary || l.addDate}</span>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-3\" align=\"start\">\n <MonthCalendar selected={value.date} onSelect={setDate} labels={l} testIds={testIds} />\n\n {value.date && (\n <div className=\"mt-3 flex flex-col gap-2 border-t border-border pt-3\">\n <div className=\"grid grid-cols-2 gap-2\">\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-muted-foreground\">{l.startTime}</span>\n <Input\n type=\"time\"\n value={value.time}\n onChange={(e) => setStartTime(e.target.value)}\n className=\"h-8 text-xs\"\n data-testid={`${idPrefix}-time`}\n />\n </label>\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-muted-foreground\">{l.endTime}</span>\n <Input\n type=\"time\"\n value={value.endTime}\n onChange={(e) => setEndTime(e.target.value)}\n disabled={!value.time}\n title={value.time ? undefined : l.setStartFirst}\n className=\"h-8 text-xs\"\n data-testid={`${idPrefix}-end-time`}\n />\n </label>\n </div>\n\n {value.time && (\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-muted-foreground\">{l.timezone}</span>\n <Input\n list={timezoneListId}\n value={value.timezone}\n onChange={(e) => onChange({ ...value, timezone: e.target.value })}\n placeholder={detectTimezone()}\n className=\"h-8 text-xs\"\n data-testid={`${idPrefix}-timezone`}\n />\n <datalist id={timezoneListId}>\n {timezones.map((tz) => (\n <option key={tz} value={tz} />\n ))}\n </datalist>\n </label>\n )}\n\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-muted-foreground\">{l.endDate}</span>\n <Input\n type=\"date\"\n value={value.endDate}\n min={value.date}\n onChange={(e) => onChange({ ...value, endDate: e.target.value })}\n className=\"h-8 text-xs\"\n data-testid={`${idPrefix}-end-date`}\n />\n </label>\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 self-start text-muted-foreground hover:text-foreground\"\n onClick={() => onChange(EMPTY_FACT_DATE_FIELDS)}\n data-testid={`${idPrefix}-clear-date`}\n >\n <X className=\"mr-1 size-3.5\" /> {l.clearDate}\n </Button>\n </div>\n )}\n </PopoverContent>\n </Popover>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { X } from 'lucide-react'\nimport { PopoverContent, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactPassagesLabels {\n loading: string\n close: string\n}\n\nexport const DEFAULT_FACT_PASSAGES_LABELS: FactPassagesLabels = {\n loading: 'Loading passage…',\n close: 'Close',\n}\n\nexport interface FactSourcesPanelTestIds {\n popover: string\n close: string\n list: string\n}\n\n/**\n * Flatten a passage's markdown to one readable line for a list preview: headings, bullets,\n * emphasis, links and table pipes only add noise on a single truncated line.\n */\nexport function toPreviewLine(md: string): string {\n return md\n .replace(/`{1,3}([^`]*)`{1,3}/g, '$1') // inline / fenced code -> its content\n .replace(/!\\[[^\\]]*\\]\\([^)]*\\)/g, '') // images out\n .replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1') // links -> their text\n .replace(/^[>\\s]*#{1,6}\\s*/gm, '') // heading markers\n .replace(/^[>\\s]*[-*+]\\s+/gm, '') // list bullets\n .replace(/[*_~]/g, '') // emphasis marks\n .replace(/\\|/g, ' ') // table pipes\n .replace(/\\s+/g, ' ') // collapse whitespace/newlines\n .trim()\n}\n\n/** Inline `<sup>`/`<sub>` (footnote markers) kept by the flatten above, plus stray tag fragments. */\nconst SUP_SUB_RE = /<(sup|sub)>([\\s\\S]*?)<\\/\\1>/gi\nconst STRAY_SUP_SUB_RE = /<\\/?(?:sup|sub)>/gi\n\nconst stripStrayTags = (s: string): string => s.replace(STRAY_SUP_SUB_RE, '')\n\n/**\n * Render a flattened preview line with real super/subscripts: `<sup>15</sup>` shows as a\n * superscript 15, not literal tag text. Unpaired tag fragments are dropped.\n */\nexport function renderPreviewInline(line: string): ReactNode {\n const nodes: ReactNode[] = []\n let last = 0\n let key = 0\n for (const m of line.matchAll(SUP_SUB_RE)) {\n const start = m.index ?? 0\n if (start > last) nodes.push(stripStrayTags(line.slice(last, start)))\n const inner = stripStrayTags(m[2])\n nodes.push(\n m[1].toLowerCase() === 'sup' ? <sup key={key++}>{inner}</sup> : <sub key={key++}>{inner}</sub>\n )\n last = start + m[0].length\n }\n if (last < line.length) nodes.push(stripStrayTags(line.slice(last)))\n return nodes\n}\n\nexport interface FactPassageItemProps {\n /** Zero-based position in the list (shown as `n.`). */\n index: number\n page?: number | null\n /** The passage excerpt (markdown), or null/undefined while it loads. */\n excerpt?: string | null\n /** This passage is the one open in the viewer. */\n isViewing?: boolean\n onSelect: () => void\n testId?: string\n className?: string\n labels?: Partial<FactPassagesLabels>\n}\n\n/** One cited passage: index badge, page pill and a single quoted line. */\nexport function FactPassageItem({\n index,\n page,\n excerpt,\n isViewing,\n onSelect,\n testId,\n className,\n labels,\n}: FactPassageItemProps) {\n const l = { ...DEFAULT_FACT_PASSAGES_LABELS, ...labels }\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n data-testid={testIdOr(testId, { testId: 'fact-source-passage' })}\n aria-current={isViewing || undefined}\n className={cn(\n 'flex w-full items-start gap-2 rounded px-2 py-1.5 text-left text-xs transition-colors pointer-coarse:min-h-11',\n isViewing\n ? 'bg-ai-soft text-foreground ring-1 ring-ai-accent/40'\n : 'bg-ai-soft/60 text-foreground hover:bg-ai-soft',\n className\n )}\n >\n <span className=\"mt-0.5 shrink-0 rounded bg-muted px-1 py-0.5 font-mono text-xs text-muted-foreground\">\n {index + 1}.\n </span>\n {page != null && (\n <span className=\"mt-0.5 shrink-0 rounded-full bg-muted px-1.5 py-0.5 font-mono text-xs text-muted-foreground\">\n p.{page}\n </span>\n )}\n <span className=\"block min-w-0 flex-1 overflow-hidden text-ellipsis whitespace-nowrap\">\n {excerpt ? <>“{renderPreviewInline(toPreviewLine(excerpt))}”</> : l.loading}\n </span>\n </button>\n )\n}\n\nexport interface FactSourcesPanelProps {\n /** Header caption, e.g. \"Sources (2 documents)\". */\n title: string\n onClose: () => void\n /** The fact section the panel is portalled INTO and fenced WITHIN. */\n container?: HTMLElement | null\n children: ReactNode\n labels?: Partial<FactPassagesLabels>\n testIds?: Partial<FactSourcesPanelTestIds>\n}\n\n/**\n * Popover panel shell for a fact's sources: sticky header with a close control and a scrolling\n * list. Must sit inside a `Popover`. Stays open while the user works in the document viewer\n * (clicks inside the viewer, dialogs or other popper layers do not dismiss it).\n */\nexport function FactSourcesPanel({\n title,\n onClose,\n container,\n children,\n labels,\n testIds,\n}: FactSourcesPanelProps) {\n const l = { ...DEFAULT_FACT_PASSAGES_LABELS, ...labels }\n return (\n <PopoverContent\n align=\"start\"\n side=\"bottom\"\n sideOffset={4}\n collisionPadding={16}\n container={container}\n collisionBoundary={container ?? undefined}\n onInteractOutside={(e) => {\n const target = e.detail.originalEvent.target as Element | null\n if (\n target?.closest(\n '[data-testid=\"parsed-viewer\"], [role=\"dialog\"], [data-radix-popper-content-wrapper]'\n )\n ) {\n e.preventDefault()\n }\n }}\n // No exit animation: removing the last source unmounts the anchor in the same click, and an\n // animating popover would linger anchorless at the page's top-left.\n className=\"w-[34rem] max-w-[var(--radix-popover-content-available-width)] p-0 data-[state=closed]:animate-none\"\n data-testid={testIdOr(testIds?.popover, { testId: 'fact-sources-popover' })}\n data-slot=\"fact-sources-panel\"\n >\n <div className=\"sticky top-0 z-10 flex items-center justify-between gap-2 border-b border-border bg-popover px-3 py-2\">\n <span className=\"text-xs font-semibold text-muted-foreground\">{title}</span>\n <button\n type=\"button\"\n aria-label={l.close}\n data-testid={testIdOr(testIds?.close, { testId: 'fact-sources-close' })}\n onClick={onClose}\n className=\"-m-1.5 flex shrink-0 items-center justify-center rounded p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground pointer-coarse:p-3\"\n >\n <X className=\"size-3.5\" />\n </button>\n </div>\n <div\n className=\"flex max-h-[min(60vh,var(--radix-popover-content-available-height))] flex-col gap-2 overflow-y-auto p-1.5\"\n data-testid={testIdOr(testIds?.list, { testId: 'fact-sources-list' })}\n >\n {children}\n </div>\n </PopoverContent>\n )\n}\n","import type { ReactNode } from 'react'\nimport { X } from 'lucide-react'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactSourceGroupLabels {\n remove: string\n wholeDocument: string\n}\n\nexport const DEFAULT_FACT_SOURCE_GROUP_LABELS: FactSourceGroupLabels = {\n remove: 'Remove this document',\n wholeDocument: 'Whole document — open it to cite specific passages',\n}\n\nexport interface FactSourceGroupTestIds {\n root: (docId: string) => string\n remove: (docId: string) => string\n}\n\nexport interface FactSourceGroupProps {\n docId: string\n /** The document label/pill (the app supplies its entity pill). */\n document: ReactNode\n /** True when this document is the one on display in the viewer. */\n isViewing?: boolean\n onRemove: () => void\n /** The FactPassageItem children; when absent a \"whole document\" hint shows. */\n children?: ReactNode\n /** Whether any passages are cited from this document. */\n hasPassages: boolean\n labels?: Partial<FactSourceGroupLabels>\n testIds?: Partial<FactSourceGroupTestIds>\n}\n\n/** One cited document in the sources list: its label, a remove control and its passages. */\nexport function FactSourceGroup({\n docId,\n document,\n isViewing,\n onRemove,\n children,\n hasPassages,\n labels,\n testIds,\n}: FactSourceGroupProps) {\n const l = { ...DEFAULT_FACT_SOURCE_GROUP_LABELS, ...labels }\n return (\n <div\n className=\"flex flex-col gap-1\"\n data-testid={testIdOr(testIds?.root?.(docId), { testId: `citation-doc-${docId}` })}\n data-viewing={isViewing || undefined}\n data-slot=\"fact-source-group\"\n >\n <div className=\"flex items-center gap-1.5 px-1 text-sm\">\n {document}\n <span className=\"flex-1\" />\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label={l.remove}\n data-testid={testIdOr(testIds?.remove?.(docId), {\n testId: `fact-source-remove-${docId}`,\n })}\n className=\"shrink-0 rounded p-0.5 hover:bg-destructive/20 hover:text-destructive pointer-coarse:p-3\"\n >\n <X className=\"size-3\" />\n </button>\n </div>\n {hasPassages ? (\n children\n ) : (\n <span className=\"px-2 text-xs text-muted-foreground\">{l.wholeDocument}</span>\n )}\n </div>\n )\n}\n","/**\n * FactsViewToggle\n *\n * Table / Calendar / Timeline switch for the Notes page. (The list view\n * retired into the table — 'list' stays in the type for old deep links,\n * which the page maps to 'table'.) Uses the shared\n * ViewToggle so it matches Documents (Gallery / Table / Review), Home and Smart\n * Search rather than being a fifth bespoke button group, and sits in the tab\n * header where every other page puts its views.\n *\n * Calendar and Timeline read only the dated notes — a note without a date has\n * nowhere to sit on either — which the tooltips say rather than the labels.\n */\n\nimport { CalendarRange, GanttChartSquare, Search, Table2 } from 'lucide-react'\nimport { ViewToggle, type ViewToggleOption } from '../files/ViewToggle'\nimport { testIdOr } from '../chat/test-id'\n\nexport type FactsViewMode = 'list' | 'table' | 'calendar' | 'gantt' | 'smart_search'\n\nexport interface FactsViewToggleLabels {\n table: string\n calendar: string\n timeline: string\n smartSearch: string\n}\n\nexport const DEFAULT_FACTS_VIEW_TOGGLE_LABELS: FactsViewToggleLabels = {\n table: 'Table',\n calendar: 'Calendar',\n timeline: 'Timeline',\n smartSearch: 'Smart Search',\n}\n\nconst createOptions = (l: FactsViewToggleLabels): ViewToggleOption[] => [\n { value: 'table', icon: <Table2 className=\"size-3.5\" />, label: l.table },\n { value: 'calendar', icon: <CalendarRange className=\"size-3.5\" />, label: l.calendar },\n { value: 'gantt', icon: <GanttChartSquare className=\"size-3.5\" />, label: l.timeline },\n // Facts-only semantic/keyword recall — mirrors the Files \"Smart Search\" view\n // (same Search icon + label), but searches this workspace's facts, not docs.\n { value: 'smart_search', icon: <Search className=\"size-3.5\" />, label: l.smartSearch },\n]\n\nexport interface FactsViewToggleProps {\n viewMode: FactsViewMode\n onChange: (mode: FactsViewMode) => void\n /**\n * Collapse the labels to icons. Driven by a width measurement of the header\n * row (see FactsPage) rather than a `@container`, so the toggle can stay\n * absolutely centred — its position never shifts with the side controls —\n * while still collapsing when the row actually runs out of room.\n */\n collapsed?: boolean\n labels?: Partial<FactsViewToggleLabels>\n /** Item test ids are `${testIdPrefix}-${mode}-button` (default `facts-layout`). */\n testIdPrefix?: string\n /** Per-mode item ids that replace the prefixed ones. */\n testIds?: Partial<Record<FactsViewMode, string>>\n}\n\nexport function FactsViewToggle({\n viewMode,\n onChange,\n collapsed = false,\n labels,\n testIdPrefix,\n testIds,\n}: FactsViewToggleProps) {\n const options = createOptions({ ...DEFAULT_FACTS_VIEW_TOGGLE_LABELS, ...labels }).map((o) => ({\n ...o,\n testId: testIds?.[o.value as FactsViewMode],\n }))\n return (\n <ViewToggle\n options={options}\n value={viewMode}\n onChange={(value) => onChange(value as FactsViewMode)}\n testIdPrefix={testIdOr(testIdPrefix, { testId: 'facts-layout' })}\n showLabels={!collapsed}\n size=\"sm\"\n />\n )\n}\n","/**\n * FactsFilterInput\n *\n * The Facts table's \"Filter…\" box, styled to match the Documents table's filter\n * bar: a muted input with a leading funnel icon and an appended settings button\n * whose popover picks WHICH fields the text matches against (the fact text, its\n * labels, or both). The page owns the query + field state; this is a view.\n */\nimport type { ReactNode } from 'react'\nimport { X, Filter, SlidersHorizontal, Check } from 'lucide-react'\nimport {\n Command,\n CommandGroup,\n CommandItem,\n CommandList,\n Input,\n Popover,\n PopoverContent,\n PopoverTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport type FactsSearchField = 'text' | 'labels'\n\nexport const FACTS_SEARCH_FIELD_OPTIONS: { value: FactsSearchField; label: string }[] = [\n { value: 'text', label: 'Fact' },\n { value: 'labels', label: 'Labels' },\n]\n\nexport interface FactsFilterInputLabels {\n placeholder: string\n clear: string\n chooseFields: string\n fieldsHeading: string\n /** Display name per searchable field. */\n fieldNames: Record<FactsSearchField, string>\n}\n\nexport const DEFAULT_FACTS_FILTER_INPUT_LABELS: FactsFilterInputLabels = {\n placeholder: 'Filter...',\n clear: 'Clear filter',\n chooseFields: 'Choose fields to filter',\n fieldsHeading: 'Filter fields',\n fieldNames: { text: 'Fact', labels: 'Labels' },\n}\n\nexport interface FactsFilterInputTestIds {\n root: string\n quick: string\n input: string\n fieldsButton: string\n field: (field: FactsSearchField) => string\n}\n\nexport interface FactsFilterInputProps {\n value: string\n onChange: (q: string) => void\n fields: FactsSearchField[]\n onFieldsChange: (fields: FactsSearchField[]) => void\n /**\n * The quick-filter dropdown trigger, embedded inside the input on the left\n * (mirroring the Files search box). When absent, a static funnel icon shows.\n */\n filter?: ReactNode\n /** Width classes for the box (default `w-44`). */\n className?: string\n labels?: Partial<FactsFilterInputLabels>\n testIds?: Partial<FactsFilterInputTestIds>\n}\n\nexport function FactsFilterInput({\n value,\n onChange,\n fields,\n onFieldsChange,\n filter,\n className,\n labels,\n testIds,\n}: FactsFilterInputProps) {\n const l = { ...DEFAULT_FACTS_FILTER_INPUT_LABELS, ...labels }\n const toggleField = (field: FactsSearchField) =>\n onFieldsChange(fields.includes(field) ? fields.filter((f) => f !== field) : [...fields, field])\n\n return (\n <div\n className={cn('flex min-w-0 items-center', className ?? 'w-44 pointer-coarse:w-56')}\n data-testid={testIdOr(testIds?.root, { testId: 'facts-filter' })}\n >\n <div className=\"relative flex-1 min-w-0\">\n {filter ? (\n <div\n className=\"absolute left-1 top-1/2 z-10 -translate-y-1/2\"\n data-testid={testIdOr(testIds?.quick, { testId: 'facts-filter-quick' })}\n >\n {filter}\n </div>\n ) : (\n <Filter className=\"pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n )}\n <Input\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={l.placeholder}\n data-testid={testIdOr(testIds?.input, { testId: 'facts-filter-input' })}\n className={cn(\n 'h-7 bg-muted pr-12 text-sm shadow-none focus-visible:bg-muted focus-visible:ring-0 pointer-coarse:h-11 pointer-coarse:pr-24',\n filter ? 'pl-11' : 'pl-7'\n )}\n />\n {value && (\n <button\n type=\"button\"\n onClick={() => onChange('')}\n aria-label={l.clear}\n className=\"absolute right-7 top-1/2 z-10 -translate-y-1/2 text-muted-foreground hover:text-foreground pointer-coarse:right-11 pointer-coarse:flex pointer-coarse:size-11 pointer-coarse:items-center pointer-coarse:justify-center\"\n >\n <X className=\"size-3\" />\n </button>\n )}\n {/* Field picker — inside the input on the right, muted, exactly as the\n Files search box renders it. */}\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={l.chooseFields}\n data-testid={testIdOr(testIds?.fieldsButton, {\n testId: 'facts-filter-fields-button',\n })}\n className=\"absolute right-1.5 top-1/2 z-10 -translate-y-1/2 !h-5 !w-5 !p-0 text-muted-foreground/60 transition-colors hover:text-foreground pointer-coarse:right-0 pointer-coarse:!flex pointer-coarse:!h-11 pointer-coarse:!w-11 pointer-coarse:items-center pointer-coarse:justify-center\"\n >\n <SlidersHorizontal className=\"size-3.5\" />\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-44 p-0\" align=\"end\" sideOffset={4}>\n <Command shouldFilter={false}>\n <CommandList>\n <CommandGroup heading={l.fieldsHeading}>\n {FACTS_SEARCH_FIELD_OPTIONS.map((option) => {\n const isSelected = fields.includes(option.value)\n return (\n <CommandItem\n key={option.value}\n onSelect={() => toggleField(option.value)}\n className=\"cursor-pointer text-sm\"\n data-testid={testIdOr(testIds?.field?.(option.value), {\n testId: `facts-filter-field-${option.value}`,\n })}\n >\n <div\n className={cn(\n 'mr-2 flex size-3.5 items-center justify-center rounded-sm border border-primary',\n isSelected\n ? 'bg-primary text-primary-foreground'\n : 'opacity-50 [&_svg]:invisible'\n )}\n >\n <Check className=\"size-3\" />\n </div>\n {l.fieldNames[option.value]}\n </CommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n </div>\n </div>\n )\n}\n","/**\n * FactsFieldsButton\n *\n * The Facts table's column-visibility control — the same \"Fields\" affordance the\n * Documents table wears (Columns3 icon, ghost button), pared down to what facts\n * need: a checkbox per column that shows or hides it. Toggling writes straight\n * to the grid via the AG Grid api, so the change persists through GridView's own\n * column-state persistence (no separate saved-views machinery here).\n */\nimport { useMemo, useState } from 'react'\nimport { Columns3, ChevronDown, Check, RotateCcw } from 'lucide-react'\nimport type { GridApi } from 'ag-grid-community'\nimport {\n Button,\n Command,\n CommandGroup,\n CommandItem,\n CommandList,\n CommandSeparator,\n Popover,\n PopoverContent,\n PopoverTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactsFieldsButtonLabels {\n fields: string\n defaultView: string\n columns: string\n /** Names for icon-only columns, keyed by colId. */\n columnNames: Record<string, string>\n}\n\nexport const DEFAULT_FACTS_FIELDS_BUTTON_LABELS: FactsFieldsButtonLabels = {\n fields: 'Fields',\n defaultView: 'Default view',\n columns: 'Columns',\n columnNames: { pinned: 'Pinned' },\n}\n\nexport interface FactsFieldsButtonTestIds {\n trigger: string\n defaultView: string\n toggle: (colId: string) => string\n}\n\nexport interface FactsFieldsButtonProps<TData = unknown> {\n /** The facts grid api (read lazily: the grid may not exist yet). */\n getGridApi: () => GridApi<TData> | null | undefined\n labels?: Partial<FactsFieldsButtonLabels>\n testIds?: Partial<FactsFieldsButtonTestIds>\n}\n\nexport function FactsFieldsButton<TData = unknown>({\n getGridApi,\n labels,\n testIds,\n}: FactsFieldsButtonProps<TData>) {\n const l = { ...DEFAULT_FACTS_FIELDS_BUTTON_LABELS, ...labels }\n const [open, setOpen] = useState(false)\n // Bumped after each toggle so the list re-reads the grid's live column state.\n const [version, setVersion] = useState(0)\n\n const columns = useMemo(() => {\n if (!open) return []\n const api = getGridApi()\n if (!api || api.isDestroyed()) return []\n const state = api.getColumnState()\n return state\n .filter((c) => c.colId !== 'ag-Grid-SelectionColumn')\n .map((c) => {\n const def = api.getColumnDef(c.colId)\n const label =\n (def?.headerName && def.headerName.trim()) || l.columnNames[c.colId] || c.colId\n return { colId: c.colId, label, visible: !c.hide }\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, version, getGridApi, l.columnNames])\n\n const visibleCount = columns.filter((c) => c.visible).length\n\n const toggle = (colId: string, visible: boolean) => {\n const api = getGridApi()\n if (!api || api.isDestroyed()) return\n // Never hide the last remaining column — an empty grid has no headers to\n // bring back the chooser against.\n if (visible && visibleCount <= 1) return\n api.setColumnsVisible([colId], !visible)\n setVersion((v) => v + 1)\n }\n\n // Default view: restore the columns' built-in order, visibility and widths\n // from the column definitions (like the Files table's \"Default view\"). Handy\n // when a column got hidden or dragged and the table no longer reads right.\n const resetToDefault = () => {\n const api = getGridApi()\n if (!api || api.isDestroyed()) return\n api.resetColumnState()\n setVersion((v) => v + 1)\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 text-sm gap-1.5 text-muted-foreground hover:text-foreground font-light!\"\n data-testid={testIdOr(testIds?.trigger, { testId: 'facts-fields-trigger' })}\n >\n <Columns3 className=\"size-3.5\" />\n {l.fields}\n <ChevronDown className=\"size-3\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[220px] p-0\" align=\"end\" side=\"bottom\" sideOffset={4}>\n <Command shouldFilter={false}>\n <CommandList className=\"max-h-[60dvh]\">\n <CommandGroup>\n <CommandItem\n onSelect={resetToDefault}\n className=\"cursor-pointer text-sm text-muted-foreground\"\n data-testid={testIdOr(testIds?.defaultView, {\n testId: 'facts-fields-default-view',\n })}\n >\n <RotateCcw className=\"mr-2 size-3.5\" />\n {l.defaultView}\n </CommandItem>\n </CommandGroup>\n <CommandSeparator />\n <CommandGroup heading={l.columns}>\n {columns.map((col) => (\n <CommandItem\n key={col.colId}\n onSelect={() => toggle(col.colId, col.visible)}\n className=\"cursor-pointer text-sm\"\n data-testid={testIdOr(testIds?.toggle?.(col.colId), {\n testId: `facts-fields-toggle-${col.colId}`,\n })}\n >\n <div\n className={cn(\n 'mr-2 flex size-3.5 items-center justify-center rounded-sm border border-primary',\n col.visible\n ? 'bg-primary text-primary-foreground'\n : 'opacity-50 [&_svg]:invisible'\n )}\n >\n <Check className=\"size-3\" />\n </div>\n {col.label}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n}\n","import { useEffect, useMemo, useRef } from 'react'\nimport { TimelineCalendar } from '../timeline/TimelineCalendar'\nimport { TimelineGantt, type TimelineGanttProps } from '../timeline/TimelineGantt'\nimport type { TimelineItem } from '../timeline/types'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactTimelineLabels {\n ganttEmpty: string\n}\n\nexport const DEFAULT_FACT_TIMELINE_LABELS: FactTimelineLabels = {\n ganttEmpty: 'Give a fact a date and it appears here.',\n}\n\n/** The fields of a fact the calendar reads. */\nexport interface FactCalendarRow {\n external_id: string\n text: string\n date_start?: string | null\n date_end?: string | null\n}\n\ntype CalendarItem<T> = TimelineItem & { fact: T }\n\nexport interface FactsCalendarProps<T extends FactCalendarRow> {\n facts: T[]\n onSelect?: (fact: T) => void\n /** The fact currently open for editing: its bars are highlighted. */\n selectedId?: string | null\n /** Host element the n / N fact navigator portals into (see TimelineCalendar). */\n navigatorContainer?: HTMLElement | null\n /** Denominator for the navigator: the page's filtered fact count. */\n navigatorTotal?: number\n /** Calendar test id; entries are `${testId}-entry-${factId}` (default `facts-calendar`). */\n testId?: string\n}\n\n/**\n * Facts on the shared calendar. Maps a fact to a labelled span and hands the fact back on select,\n * so packing, spanning bars and continuous scroll stay one implementation shared with every\n * other timeline surface. Undated facts have nowhere to sit and are skipped.\n */\nexport function FactsCalendar<T extends FactCalendarRow>({\n facts,\n onSelect,\n selectedId,\n navigatorContainer,\n navigatorTotal,\n testId,\n}: FactsCalendarProps<T>) {\n const calendarTestId = testIdOr(testId, { testId: 'facts-calendar' })\n const items = useMemo<CalendarItem<T>[]>(\n () =>\n facts\n .filter((f) => f.date_start)\n .map((f) => ({\n id: f.external_id,\n label: f.text,\n start: f.date_start as string,\n end: f.date_end,\n fact: f,\n })),\n [facts]\n )\n\n // The shared calendar takes no \"selected\" prop, so mark the selected fact's entries (a\n // multi-day fact has several) directly in the DOM, re-applied when selection or items change.\n const rootRef = useRef<HTMLDivElement>(null)\n const entryId = testIdOr(testId && `${testId}-entry-${selectedId}`, {\n testId: `facts-calendar-entry-${selectedId}`,\n })\n useEffect(() => {\n const root = rootRef.current\n if (!root) return\n root\n .querySelectorAll('.fact-cal-selected')\n .forEach((el) => el.classList.remove('fact-cal-selected'))\n if (!selectedId) return\n root\n .querySelectorAll(`[data-testid=\"${entryId}\"]`)\n .forEach((el) => el.classList.add('fact-cal-selected'))\n }, [selectedId, items, entryId])\n\n return (\n <div ref={rootRef} className=\"h-full border-t border-border\" data-slot=\"facts-calendar\">\n <TimelineCalendar\n items={items}\n testId={calendarTestId}\n // Show every fact on a day, never \"+n more\": single-line bars keep a busy day compact.\n maxLanes={Infinity}\n selectedIds={selectedId ? [selectedId] : []}\n onSelect={(item) => onSelect?.(item.fact)}\n navigatorContainer={navigatorContainer}\n navigatorTotal={navigatorTotal}\n />\n </div>\n )\n}\n\n/**\n * The Facts timeline. `.facts-gantt` scopes CSS that truncates row labels to one line and hides\n * the built-in detail side panel: a fact's contents are seen and edited in the composer instead.\n */\nexport function FactsGanttPane({\n testId,\n emptyMessage,\n labels,\n ...props\n}: TimelineGanttProps & { labels?: Partial<FactTimelineLabels> }) {\n const l = { ...DEFAULT_FACT_TIMELINE_LABELS, ...labels }\n return (\n <div className=\"facts-gantt h-full border-t border-border\" data-slot=\"facts-gantt\">\n <TimelineGantt\n testId={testIdOr(testId, { testId: 'gantt' })}\n emptyMessage={emptyMessage ?? l.ganttEmpty}\n {...props}\n />\n </div>\n )\n}\n","import { ArrowRight, CalendarClock, Lightbulb, Loader2, Milestone, Scale } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactsEmptyStateLabels {\n title: string\n intro: string\n tryAdding: string\n /** Three kinds of durable knowledge a fact captures. */\n kinds: { label: string; desc: string }[]\n /** Starter fact texts offered as one-tap examples. */\n examples: string[]\n loading: string\n loadError: string\n retry: string\n}\n\nexport const DEFAULT_FACTS_EMPTY_STATE_LABELS: FactsEmptyStateLabels = {\n title: 'Everything this workspace knows',\n intro:\n 'Facts are durable knowledge — a deadline, a decision, a preference. Write them yourself, or let the assistant distill them from your documents and chats.',\n tryAdding: 'Try adding a fact',\n kinds: [\n {\n label: 'Deadlines & dates',\n desc: 'A due date or milestone — it lands on the calendar and timeline',\n },\n { label: 'Decisions', desc: 'What was agreed, and why — so it is not lost in a thread' },\n { label: 'Preferences', desc: 'How this workspace likes things done' },\n ],\n examples: [\n 'The renewal deadline is March 31, 2026',\n 'Payment terms are net 30',\n 'The team prefers email over phone for updates',\n 'Board approved the Q3 budget on May 12',\n ],\n loading: 'Loading facts…',\n loadError: 'Could not load facts.',\n retry: 'Try again',\n}\n\nconst KIND_ICONS = [CalendarClock, Scale, Lightbulb]\n\nexport interface FactsEmptyStateTestIds {\n root: string\n example: string\n}\n\nexport interface FactsEmptyStateProps {\n /** Open the composer prefilled with an example. */\n onUseExample: (text: string) => void\n labels?: Partial<FactsEmptyStateLabels>\n testIds?: Partial<FactsEmptyStateTestIds>\n}\n\n/** First-run state: what facts are, the kinds they capture, and one-tap examples. */\nexport function FactsEmptyState({ onUseExample, labels, testIds }: FactsEmptyStateProps) {\n const l = { ...DEFAULT_FACTS_EMPTY_STATE_LABELS, ...labels }\n return (\n <div\n className=\"flex min-h-full items-center justify-center p-10\"\n data-testid={testIdOr(testIds?.root, { testId: 'facts-page-empty-state' })}\n data-slot=\"facts-empty-state\"\n >\n <div className=\"w-full max-w-xl text-center\">\n <div className=\"mx-auto mb-4 flex size-12 items-center justify-center rounded-lg bg-accent text-accent-foreground\">\n <Milestone className=\"size-6\" />\n </div>\n\n <h2 className=\"mt-2 text-xl font-semibold text-foreground\">{l.title}</h2>\n <p className=\"mt-2 text-sm text-muted-foreground\">{l.intro}</p>\n\n <div className=\"mt-7 grid gap-3 text-left @xl:grid-cols-3\">\n {l.kinds.map(({ label, desc }, i) => {\n const KindIcon = KIND_ICONS[i % KIND_ICONS.length]\n return (\n <div key={label} className=\"rounded-lg bg-muted p-3\">\n <div className=\"flex items-center gap-1.5 text-sm font-medium text-foreground\">\n <KindIcon className=\"size-4 text-primary\" />\n {label}\n </div>\n <p className=\"mt-1 text-xs leading-snug text-muted-foreground\">{desc}</p>\n </div>\n )\n })}\n </div>\n\n <p className=\"mt-10 text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {l.tryAdding}\n </p>\n <div className=\"mt-4 flex flex-wrap justify-center gap-2.5\">\n {l.examples.map((fact) => (\n <button\n key={fact}\n type=\"button\"\n onClick={() => onUseExample(fact)}\n className=\"group inline-flex items-center gap-1.5 rounded-full bg-muted px-3.5 py-2 text-sm text-foreground transition-colors hover:bg-accent pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.example, { testId: 'facts-page-example' })}\n >\n {fact}\n <ArrowRight className=\"size-3.5 text-muted-foreground transition-colors group-hover:text-primary\" />\n </button>\n ))}\n </div>\n </div>\n </div>\n )\n}\n\n/** Centered \"Loading facts…\" line. */\nexport function FactsLoading({\n label = DEFAULT_FACTS_EMPTY_STATE_LABELS.loading,\n}: {\n label?: string\n}) {\n return (\n <div className=\"flex items-center justify-center py-10 text-muted-foreground\">\n <Loader2 className=\"mr-2 size-4 animate-spin\" /> {label}\n </div>\n )\n}\n\n/** Load-failure message with a retry action. */\nexport function FactsLoadError({\n onRetry,\n message = DEFAULT_FACTS_EMPTY_STATE_LABELS.loadError,\n retryLabel = DEFAULT_FACTS_EMPTY_STATE_LABELS.retry,\n}: {\n onRetry: () => void\n message?: string\n retryLabel?: string\n}) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-3 px-6 py-10 text-center\">\n <p className=\"text-sm text-muted-foreground\">{message}</p>\n <Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n {retryLabel}\n </Button>\n </div>\n )\n}\n","import type { ReactNode, Ref } from 'react'\nimport { Info, Loader2, Trash2 } from 'lucide-react'\nimport { Button, Tooltip, TooltipContent, TooltipTrigger, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactComposerLabels {\n shared: string\n verified: string\n dates: string\n deleteFact: string\n cancel: string\n saveFact: string\n saving: string\n addFact: string\n adding: string\n}\n\nexport const DEFAULT_FACT_COMPOSER_LABELS: FactComposerLabels = {\n shared: 'Shared',\n verified: 'Verified',\n dates: 'Dates',\n deleteFact: 'Delete fact',\n cancel: 'Cancel',\n saveFact: 'Save fact',\n saving: 'Saving…',\n addFact: 'Add fact',\n adding: 'Adding…',\n}\n\nexport interface FactComposerTestIds {\n tags: string\n delete: string\n save: string\n error: string\n}\n\nexport interface FactSourcesRowLabels {\n sources: string\n hintButton: string\n hint: string\n}\n\nexport const DEFAULT_FACT_SOURCES_ROW_LABELS: FactSourcesRowLabels = {\n sources: 'Sources',\n hintButton: 'How to add sources',\n hint: \"In the picker, tick a document's checkbox to add it as a source, or click its name to just open it. Inside a document, click a passage to add it — shift-click to take a whole range. Add as many as you like, from as many documents as you like.\",\n}\n\n/** Composer field: the name stacked above its control (\"Labels\", \"Dates\"...). */\nexport function FactFieldRow({\n label,\n children,\n className,\n}: {\n label: string\n children: ReactNode\n className?: string\n}) {\n return (\n <div className={cn('flex flex-col gap-1.5', className)} data-slot=\"fact-field-row\">\n <span className=\"text-sm font-medium text-foreground\">{label}</span>\n <div className=\"min-w-0\">{children}</div>\n </div>\n )\n}\n\nexport interface FactSourcesRowProps {\n /** The show/hide-sources toggle. */\n toggle: ReactNode\n /** The document picker. */\n picker: ReactNode\n labels?: Partial<FactSourcesRowLabels>\n /** Test id of the hint button (default `facts-source-hint`). */\n hintTestId?: string\n}\n\n/** Sources label (with passage-collection guidance), the sources toggle and the picker. */\nexport function FactSourcesRow({ toggle, picker, labels, hintTestId }: FactSourcesRowProps) {\n const l = { ...DEFAULT_FACT_SOURCES_ROW_LABELS, ...labels }\n return (\n <div className=\"flex flex-col gap-1.5\" data-slot=\"fact-sources-row\">\n <span className=\"flex items-center gap-1 text-sm font-medium text-foreground\">\n {l.sources}\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={l.hintButton}\n className=\"text-muted-foreground hover:text-foreground\"\n data-testid={testIdOr(hintTestId, { testId: 'facts-source-hint' })}\n >\n <Info className=\"size-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-xs\">{l.hint}</TooltipContent>\n </Tooltip>\n </span>\n <div className=\"flex items-start gap-3\">\n {toggle}\n <div className=\"min-w-0 flex-1\">{picker}</div>\n </div>\n </div>\n )\n}\n\nexport interface FactComposerProps {\n /** Whether the composer is open (it stays mounted so it animates both ways). */\n isOpen: boolean\n /** Ref to the panel (used to keep it measured/focus-managed by the page). */\n panelRef?: Ref<HTMLDivElement>\n /** The WYSIWYG fact editor, with its sources row. */\n editor: ReactNode\n /** The labels picker row. */\n labels: ReactNode\n /** The Shared switch (label is added here). */\n sharedToggle: ReactNode\n /** The Verified switch (label is added here). */\n verifiedToggle: ReactNode\n /** The date picker. */\n dateInput: ReactNode\n /** Editing an existing fact (shows Delete, \"Save fact\"). */\n isEditing: boolean\n canSave: boolean\n isSaving: boolean\n isDeleting: boolean\n onSave: () => void\n onCancel: () => void\n onDelete: () => void\n error?: string | null\n uiLabels?: Partial<FactComposerLabels>\n testIds?: Partial<FactComposerTestIds>\n}\n\n/**\n * The inline fact composer: editor on top, then labels + Shared / Verified, then the date with\n * Cancel / Save (and Delete when editing). Always mounted; the grid-rows transition animates it\n * open and closed symmetrically (a conditional mount could only animate one way).\n */\nexport function FactComposer({\n isOpen,\n panelRef,\n editor,\n labels,\n sharedToggle,\n verifiedToggle,\n dateInput,\n isEditing,\n canSave,\n isSaving,\n isDeleting,\n onSave,\n onCancel,\n onDelete,\n error,\n uiLabels: labelOverrides,\n testIds,\n}: FactComposerProps) {\n const l = { ...DEFAULT_FACT_COMPOSER_LABELS, ...labelOverrides }\n return (\n <div\n className={cn(\n 'grid shrink-0 transition-[grid-template-rows,opacity] duration-500 ease-in-out',\n isOpen ? 'grid-rows-[1fr] opacity-100' : 'grid-rows-[0fr] opacity-0'\n )}\n data-slot=\"fact-composer\"\n >\n <div className=\"overflow-hidden\">\n <div\n ref={panelRef}\n className=\"facts-composer flex flex-col gap-4 border-b border-border bg-muted px-4 py-4\"\n >\n <div className=\"flex flex-col gap-3\">\n {editor}\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2\">\n <div\n data-testid={testIdOr(testIds?.tags, { testId: 'facts-page-composer-tags' })}\n className=\"min-w-[14rem] flex-1\"\n >\n {labels}\n </div>\n <div className=\"flex shrink-0 items-center gap-6\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n {sharedToggle}\n {l.shared}\n </div>\n <div className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n {verifiedToggle}\n {l.verified}\n </div>\n </div>\n </div>\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-2\">\n <div className=\"flex min-w-[10rem] flex-1 flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-foreground\">{l.dates}</span>\n {dateInput}\n </div>\n <div className=\"flex shrink-0 items-center gap-2 self-end max-sm:w-full max-sm:justify-end\">\n {isEditing && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"size-7 p-0 text-destructive hover:bg-destructive/10 hover:text-destructive pointer-coarse:size-11\"\n onClick={onDelete}\n disabled={isDeleting}\n data-testid={testIdOr(testIds?.delete, {\n testId: 'facts-page-composer-delete',\n })}\n aria-label={l.deleteFact}\n title={l.deleteFact}\n >\n {isDeleting ? (\n <Loader2 className=\"size-3.5 animate-spin\" />\n ) : (\n <Trash2 className=\"size-3.5\" />\n )}\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 pointer-coarse:h-11\"\n onClick={onCancel}\n >\n {l.cancel}\n </Button>\n <Button\n size=\"sm\"\n className=\"h-7 pointer-coarse:h-11\"\n disabled={!canSave}\n onClick={onSave}\n data-testid={testIdOr(testIds?.save, { testId: 'facts-page-composer-save' })}\n >\n {isEditing\n ? isSaving\n ? l.saving\n : l.saveFact\n : isSaving\n ? l.adding\n : l.addFact}\n </Button>\n </div>\n </div>\n </div>\n </div>\n {error && (\n <p\n className=\"text-xs text-destructive\"\n data-testid={testIdOr(testIds?.error, { testId: 'facts-page-composer-error' })}\n >\n {error}\n </p>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { FolderUp, MoreHorizontal, Pin, PinOff, Tags, Trash2 } from 'lucide-react'\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { SelectionBar, SelectionBarAction } from '../files/SelectionBar'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactsBulkBarLabels {\n unpin: string\n pin: string\n label: string\n shared: string\n more: string\n export: string\n delete: string\n budgetHint: string\n /** The `~{tokens}/{cap} tokens` line (numbers arrive formatted). */\n budget: (tokens: string, cap: string) => string\n unpinTooltip: (pluralNoun: string) => string\n pinTooltip: (pluralNoun: string) => string\n labelTooltip: (pluralNoun: string) => string\n}\n\nexport const DEFAULT_FACTS_BULK_BAR_LABELS: FactsBulkBarLabels = {\n unpin: 'Unpin Facts',\n pin: 'Pin to Chats',\n label: 'Label',\n shared: 'Shared',\n more: 'More',\n export: 'Export',\n delete: 'Delete',\n budgetHint:\n 'Pinned facts ride every AI request, so they are always in context and share one budget. This estimates the tokens they add (≈4 characters per token), capped at ~2,000.',\n budget: (tokens, cap) => `~${tokens}/${cap} tokens`,\n unpinTooltip: (n) => `Unpin the selected ${n} so they no longer ride every chat`,\n pinTooltip: (n) => `Pin the selected ${n} so they ride every chat with the assistant`,\n labelTooltip: (n) => `Add or remove labels from selected ${n}`,\n}\n\nexport interface FactsBulkBarTestIds {\n budget: string\n pin: string\n label: string\n more: string\n export: string\n delete: string\n}\n\nexport interface FactsBulkBarProps {\n /** Number of selected facts. */\n count: number\n onClear: () => void\n /** True when every selected fact is already pinned (the action then unpins). */\n allSelectedPinned: boolean\n onTogglePin: () => void\n onLabel: () => void\n /** The aggregate Shared switch for the selection (the app binds its toggle). */\n sharedToggle: ReactNode\n onExport: () => void\n onDelete: () => void\n /** Pinned-core token budget, shown at the left (reflects the whole workspace, not the selection). */\n budget?: { tokens: number; cap: number; isOver: boolean } | null\n /** Plural noun for tooltips (lower case). */\n pluralNoun?: string\n labels?: Partial<FactsBulkBarLabels>\n testIds?: Partial<FactsBulkBarTestIds>\n}\n\n/**\n * Sticky bulk-action bar for the facts table: Pin, Label, Shared and a More menu (Export,\n * Delete). Actions are disabled until something is selected.\n */\nexport function FactsBulkBar({\n count,\n onClear,\n allSelectedPinned,\n onTogglePin,\n onLabel,\n sharedToggle,\n onExport,\n onDelete,\n budget,\n pluralNoun = 'facts',\n labels,\n testIds,\n}: FactsBulkBarProps) {\n const l = { ...DEFAULT_FACTS_BULK_BAR_LABELS, ...labels }\n const none = count === 0\n return (\n <div className=\"pb-3\" data-slot=\"facts-bulk-bar\">\n <SelectionBar\n count={count}\n onClear={onClear}\n status={\n budget ? (\n <span\n className={cn(\n 'shrink-0 text-xs tabular-nums',\n budget.isOver ? 'text-destructive' : 'text-muted-foreground'\n )}\n title={l.budgetHint}\n data-testid={testIdOr(testIds?.budget, { testId: 'facts-page-core-budget' })}\n >\n {l.budget(budget.tokens.toLocaleString(), budget.cap.toLocaleString())}\n </span>\n ) : null\n }\n >\n {(isCompact) => (\n <>\n <SelectionBarAction\n icon={allSelectedPinned ? PinOff : Pin}\n label={allSelectedPinned ? l.unpin : l.pin}\n onClick={onTogglePin}\n disabled={none}\n isCompact={isCompact}\n className=\"border-yellow-border text-yellow-text hover:bg-yellow-bg hover:text-yellow-text\"\n tooltip={allSelectedPinned ? l.unpinTooltip(pluralNoun) : l.pinTooltip(pluralNoun)}\n testId={testIdOr(testIds?.pin, { testId: 'bulk-pin-facts-button' })}\n />\n <SelectionBarAction\n icon={Tags}\n label={l.label}\n onClick={onLabel}\n disabled={none}\n isCompact={isCompact}\n className=\"border-green-border text-green-text hover:bg-green-bg hover:text-green-text\"\n tooltip={l.labelTooltip(pluralNoun)}\n testId={testIdOr(testIds?.label, { testId: 'bulk-label-facts-button' })}\n />\n <div className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2 py-1\">\n {sharedToggle}\n {!isCompact && <span className=\"text-sm text-muted-foreground\">{l.shared}</span>}\n </div>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 gap-1.5 px-2 pointer-coarse:h-11\"\n disabled={none}\n data-testid={testIdOr(testIds?.more, { testId: 'facts-bulk-more-button' })}\n >\n <MoreHorizontal className=\"size-4\" />\n {!isCompact && <span className=\"text-sm\">{l.more}</span>}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n onClick={onExport}\n disabled={none}\n data-testid={testIdOr(testIds?.export, { testId: 'export-facts-button' })}\n >\n <FolderUp className=\"mr-2 size-4\" />\n {l.export}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={onDelete}\n disabled={none}\n className=\"text-red-text focus:text-red-text\"\n data-testid={testIdOr(testIds?.delete, { testId: 'bulk-delete-facts-button' })}\n >\n <Trash2 className=\"mr-2 size-4\" />\n {l.delete}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </>\n )}\n </SelectionBar>\n </div>\n )\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react'\nimport { BookMarked, Milestone, Plus } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { TabHeader, type Tab } from '../shell/TabHeader'\nimport { observeResize } from '../lib/observe-resize'\nimport { testIdOr } from '../chat/test-id'\nimport {\n FactsFilterInput,\n type FactsFilterInputLabels,\n type FactsFilterInputTestIds,\n type FactsSearchField,\n} from './FactsFilterInput'\nimport { FactsViewToggle, type FactsViewMode, type FactsViewToggleLabels } from './FactsViewToggle'\n\nexport interface FactsToolbarLabels {\n tags: string\n newFact: string\n}\n\nexport const DEFAULT_FACTS_TOOLBAR_LABELS: FactsToolbarLabels = {\n tags: 'Tags',\n newFact: 'New fact',\n}\n\nexport interface FactsToolbarTestIds {\n tab: string\n tagsButton: string\n newFact: string\n filterBar: string\n filterBarNav: string\n}\n\nexport interface FactsToolbarProps {\n /** Facts matching the current filters (shown beside the glyph). */\n count: number\n /** Solid-fill the count while any filter is narrowing the list. */\n hasActiveFilters: boolean\n filterText: string\n onFilterTextChange: (text: string) => void\n searchFields: FactsSearchField[]\n onSearchFieldsChange: (fields: FactsSearchField[]) => void\n /** The quick-filter dropdown, embedded inside the filter box. */\n quickFilter?: ReactNode\n /** Open the Labels panel. Omit it to hide the Tags button. */\n onOpenTags?: () => void\n viewMode: FactsViewMode\n onViewModeChange: (mode: FactsViewMode) => void\n onNewFact: () => void\n /** Second row: left slot for the row navigator (portal host for calendar/timeline). */\n navSlotRef?: (el: HTMLElement | null) => void\n /** Table navigator rendered directly in the left slot. */\n navigator?: ReactNode\n /** Second row, right side: per-view controls (Fields, density, zoom). */\n tools?: ReactNode\n /** Smart Search has no toolbar row. */\n showToolbarRow?: boolean\n labels?: Partial<FactsToolbarLabels>\n testIds?: Partial<FactsToolbarTestIds>\n /** Overrides for the embedded filter box. */\n filterLabels?: Partial<FactsFilterInputLabels>\n filterTestIds?: Partial<FactsFilterInputTestIds>\n /** Overrides for the embedded view toggle. */\n viewToggleLabels?: Partial<FactsViewToggleLabels>\n viewToggleTestIdPrefix?: string\n}\n\n/**\n * Facts page header: count tab with filter box and Tags button, the view toggle centred, New fact\n * on the right (the page's one primary action), and a second row for per-view controls.\n */\nexport function FactsToolbar({\n count,\n hasActiveFilters,\n filterText,\n onFilterTextChange,\n searchFields,\n onSearchFieldsChange,\n quickFilter,\n onOpenTags,\n viewMode,\n onViewModeChange,\n onNewFact,\n navSlotRef,\n navigator,\n tools,\n showToolbarRow = true,\n labels,\n testIds,\n filterLabels,\n filterTestIds,\n viewToggleLabels,\n viewToggleTestIdPrefix,\n}: FactsToolbarProps) {\n const l = { ...DEFAULT_FACTS_TOOLBAR_LABELS, ...labels }\n // Collapse the view toggle's labels to icons when the row runs low on room, measured off the\n // row's own width (stable against side controls appearing) with hysteresis to avoid flicker.\n const headerRef = useRef<HTMLDivElement>(null)\n const [viewsCollapsed, setViewsCollapsed] = useState(false)\n // On phones the header cannot hold the view toggle beside the filter and New fact, so the\n // toggle moves to a row of its own beneath it.\n const [isNarrow, setIsNarrow] = useState(false)\n useEffect(() => {\n const el = headerRef.current\n if (!el) return\n const measure = () => {\n const w = el.clientWidth\n setViewsCollapsed((prev) => (prev ? w < 990 : w < 950))\n // Touch targets are 44px, so the one-row header needs more room on a touch device: a phone\n // held sideways (~760px) already clips the Tags button under the view toggle.\n const narrowAt = window.matchMedia?.('(pointer: coarse)')?.matches ? 820 : 640\n setIsNarrow((prev) => (prev ? w < narrowAt + 20 : w < narrowAt))\n }\n measure()\n return observeResize(el, measure)\n }, [])\n\n const tabs: Tab[] = [\n {\n id: 'facts',\n // No name: the page needs no self-label, but the fact glyph stays in front of the count.\n countIcon: <Milestone className=\"size-3.5\" />,\n label: '',\n count,\n countPlacement: 'leading',\n hasActiveFilters,\n testId: testIdOr(testIds?.tab, { testId: 'facts-tab' }),\n // Strip the folder-tab chrome: just the glyph and count, as in the Files header.\n tabClassName:\n '!bg-transparent hover:!bg-transparent !border-transparent !rounded-none !mb-0 !pl-0 before:!hidden after:!hidden shadow-none!',\n },\n ]\n\n // Filter box (+ Tags). In the header on wide rows; on phones it gets a full-width row of its\n // own so the filter is never squeezed to a stub.\n const filterControls = (\n <div className={isNarrow ? 'flex w-full items-center gap-1.5' : 'flex items-center gap-1.5'}>\n <FactsFilterInput\n value={filterText}\n onChange={onFilterTextChange}\n fields={searchFields}\n onFieldsChange={onSearchFieldsChange}\n filter={quickFilter}\n className={isNarrow ? 'min-w-0 flex-1' : undefined}\n labels={filterLabels}\n testIds={filterTestIds}\n />\n {onOpenTags && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-6 shrink-0 gap-1.5 px-2 pointer-coarse:h-11\"\n onClick={onOpenTags}\n data-testid={testIdOr(testIds?.tagsButton, { testId: 'facts-tags-button' })}\n >\n <BookMarked className=\"size-3.5\" />\n <span className=\"text-sm\">{l.tags}</span>\n </Button>\n )}\n </div>\n )\n\n return (\n <div ref={headerRef} className=\"sticky top-0 z-10 bg-background\" data-slot=\"facts-toolbar\">\n <TabHeader\n tabs={tabs}\n className=\"pr-3\"\n activeTabId=\"notes\"\n onTabChange={() => {}}\n afterTabs={isNarrow ? null : filterControls}\n centerContent={\n isNarrow ? null : (\n <div className=\"flex w-full items-center justify-center\">\n <FactsViewToggle\n viewMode={viewMode}\n onChange={onViewModeChange}\n collapsed={viewsCollapsed}\n labels={viewToggleLabels}\n testIdPrefix={viewToggleTestIdPrefix}\n />\n </div>\n )\n }\n rightContent={\n <Button\n onClick={onNewFact}\n data-testid={testIdOr(testIds?.newFact, { testId: 'facts-page-new' })}\n >\n <Plus className=\"mr-0.5 size-4\" />\n {l.newFact}\n </Button>\n }\n />\n {isNarrow && (\n <div\n className=\"flex flex-col gap-1.5 border-b border-border px-3 py-1.5\"\n data-slot=\"facts-toolbar-stack\"\n >\n {filterControls}\n <div className=\"flex justify-center\">\n <FactsViewToggle\n viewMode={viewMode}\n onChange={onViewModeChange}\n collapsed\n labels={viewToggleLabels}\n testIdPrefix={viewToggleTestIdPrefix}\n />\n </div>\n </div>\n )}\n {showToolbarRow && (\n <div\n className=\"flex min-h-8 flex-wrap items-center gap-x-1.5 border-b border-border bg-background px-3 py-0.5\"\n data-testid={testIdOr(testIds?.filterBar, { testId: 'facts-filter-bar' })}\n >\n <div\n ref={navSlotRef}\n className=\"flex shrink-0 items-center empty:hidden\"\n data-testid={testIdOr(testIds?.filterBarNav, { testId: 'facts-filter-bar-nav' })}\n >\n {navigator}\n </div>\n <div className=\"flex-1\" />\n <div className=\"flex shrink-0 items-center\">{tools}</div>\n </div>\n )}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Check, CheckCircle2, CornerDownLeft, Loader2, Pin, Search, X } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { SearchHit } from '../retrieval/SearchHit'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactSearchBarLabels {\n search: string\n placeholder: string\n clear: string\n submit: string\n}\n\nexport const DEFAULT_FACT_SEARCH_BAR_LABELS: FactSearchBarLabels = {\n search: 'Search:',\n // An example query rather than an instruction: shows the quoted-phrase syntax.\n placeholder: 'e.g. \"board meeting\" decision on the budget',\n clear: 'Clear search',\n submit: 'Search',\n}\n\nexport interface FactSearchBarTestIds {\n input: string\n clear: string\n submit: string\n}\n\nexport interface FactSearchResultLabels {\n core: string\n verified: string\n open: string\n}\n\nexport const DEFAULT_FACT_SEARCH_RESULT_LABELS: FactSearchResultLabels = {\n core: 'Core',\n verified: 'Verified',\n open: 'Open',\n}\n\nexport interface FactSearchResultTestIds {\n hit: (id: string) => string\n labels: (id: string) => string\n verified: (id: string) => string\n}\n\nexport interface FactSearchBarProps {\n query: string\n onQueryChange: (query: string) => void\n onSubmit: () => void\n onClear: () => void\n isSearching: boolean\n /** Wins over `labels.placeholder`. */\n placeholder?: string\n labels?: Partial<FactSearchBarLabels>\n testIds?: Partial<FactSearchBarTestIds>\n}\n\n/**\n * The facts Smart Search bar: the same bordered, auto-growing box as the Files Smart Search.\n * Enter searches; Shift+Enter breaks a line.\n */\nexport function FactSearchBar({\n query,\n onQueryChange,\n onSubmit,\n onClear,\n isSearching,\n placeholder,\n labels,\n testIds,\n}: FactSearchBarProps) {\n const l = { ...DEFAULT_FACT_SEARCH_BAR_LABELS, ...labels }\n return (\n <div className=\"border-t border-border px-6 pb-4 pt-6\" data-slot=\"fact-search-bar\">\n <form\n onSubmit={(e) => {\n e.preventDefault()\n onSubmit()\n }}\n className=\"mx-auto flex w-full max-w-2xl items-center gap-3\"\n >\n <label\n htmlFor=\"facts-smart-search-input\"\n className=\"shrink-0 text-base font-medium text-foreground\"\n >\n {l.search}\n </label>\n <div className=\"flex min-w-0 flex-1 items-start gap-2 rounded-lg border border-border bg-background px-3.5 py-2.5 transition-colors focus-within:border-ring focus-within:ring-2 focus-within:ring-ring\">\n <textarea\n id=\"facts-smart-search-input\"\n rows={1}\n value={query}\n onChange={(e) => {\n onQueryChange(e.target.value)\n e.target.style.height = 'auto'\n e.target.style.height = `${e.target.scrollHeight}px`\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n onSubmit()\n }\n }}\n placeholder={placeholder ?? l.placeholder}\n className=\"flex-1 resize-none overflow-hidden border-0 bg-transparent p-0 text-base leading-relaxed text-foreground outline-none placeholder:text-muted-foreground\"\n data-testid={testIdOr(testIds?.input, { testId: 'facts-smart-search-input' })}\n autoFocus\n />\n <div className=\"flex shrink-0 items-center gap-1\">\n {query && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 text-muted-foreground hover:text-foreground pointer-coarse:size-11\"\n onClick={onClear}\n aria-label={l.clear}\n title={l.clear}\n data-testid={testIdOr(testIds?.clear, { testId: 'facts-smart-search-clear' })}\n >\n <X className=\"size-4\" />\n </Button>\n )}\n <Button\n type=\"submit\"\n size=\"icon\"\n disabled={!query.trim() || isSearching}\n className=\"size-7 pointer-coarse:size-11\"\n data-testid={testIdOr(testIds?.submit, { testId: 'facts-smart-search-submit' })}\n title={l.submit}\n >\n {isSearching ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Search className=\"size-4\" />\n )}\n </Button>\n </div>\n </div>\n </form>\n </div>\n )\n}\n\n/** Totals headline pinned between the search bar and the scrolling results. */\nexport function FactSearchTotals({ children, testId }: { children: ReactNode; testId?: string }) {\n return (\n <div className=\"px-4 pb-3\">\n <p\n className=\"font-sans text-base font-semibold tabular-nums text-foreground\"\n data-testid={testIdOr(testId, { testId: 'facts-smart-search-totals' })}\n >\n {children}\n </p>\n </div>\n )\n}\n\n/** \"Searching facts…\" line. */\nexport function FactSearchPending({ children }: { children: ReactNode }) {\n return (\n <div className=\"flex items-center justify-center gap-2 py-16 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> {children}\n </div>\n )\n}\n\n/** No-matches message. */\nexport function FactSearchNoMatches({\n children,\n testId,\n}: {\n children: ReactNode\n testId?: string\n}) {\n return (\n <div\n className=\"py-16 text-center text-sm text-muted-foreground\"\n data-testid={testIdOr(testId, { testId: 'facts-smart-search-empty' })}\n >\n {children}\n </div>\n )\n}\n\nexport interface FactSearchResultLabel {\n id: string\n name: string\n color: string\n}\n\nexport interface FactSearchResultProps {\n /** Fact id: keys the test ids. */\n id: string\n /** 1-based rank, shown outside the card (it numbers the results, it is not part of the hit). */\n rank: number\n text: string\n terms: string[]\n renderSnippet: (content: string, terms: string[]) => ReactNode\n labels: FactSearchResultLabel[]\n isPinned?: boolean\n isVerified?: boolean\n /** The fact open in the composer. */\n isSelected?: boolean\n onOpen: () => void\n uiLabels?: Partial<FactSearchResultLabels>\n testIds?: Partial<FactSearchResultTestIds>\n /** Destination of the fact; the card stays a click target (see SearchHit `href`). */\n href?: string\n}\n\n/** One facts search result: rank, highlighted text, labels (and Core) and the Verified mark. */\nexport function FactSearchResult({\n id,\n rank,\n text,\n terms,\n renderSnippet,\n labels,\n isPinned,\n isVerified,\n isSelected,\n onOpen,\n uiLabels: labelOverrides,\n testIds,\n href,\n}: FactSearchResultProps) {\n const l = { ...DEFAULT_FACT_SEARCH_RESULT_LABELS, ...labelOverrides }\n return (\n <div className=\"flex items-start gap-2\" data-slot=\"fact-search-hit\">\n <span\n className=\"w-5 shrink-0 pt-3 text-right text-xs tabular-nums text-muted-foreground\"\n aria-hidden=\"true\"\n >\n {rank}\n </span>\n <SearchHit\n className=\"min-w-0 flex-1\"\n testId={testIdOr(testIds?.hit?.(id), { testId: `facts-smart-search-hit-${id}` })}\n href={href}\n selected={isSelected}\n onClick={onOpen}\n content={text}\n terms={terms}\n renderSnippet={renderSnippet}\n header={\n <div\n className=\"flex min-w-0 flex-1 flex-wrap items-center gap-1 text-xs text-muted-foreground\"\n data-testid={testIdOr(testIds?.labels?.(id), {\n testId: `facts-smart-search-hit-labels-${id}`,\n })}\n >\n {isPinned && (\n <span className=\"inline-flex items-center gap-1 pr-1\">\n <Pin className=\"size-3\" /> {l.core}\n </span>\n )}\n {labels.map((tag) => (\n <span\n key={tag.id}\n className=\"inline-flex shrink-0 items-center gap-1 rounded border px-1.5 py-0.5 text-xs font-medium text-foreground\"\n title={tag.name}\n style={{ borderColor: tag.color }}\n >\n <span\n className=\"flex size-3.5 shrink-0 items-center justify-center rounded\"\n style={{ backgroundColor: tag.color }}\n >\n <Check className=\"size-2.5 text-white\" strokeWidth={3} />\n </span>\n <span className=\"max-w-[120px] truncate\">{tag.name}</span>\n </span>\n ))}\n </div>\n }\n headerRight={\n <span className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n {isVerified && (\n <span\n className=\"inline-flex shrink-0 items-center gap-1 text-green-text\"\n data-testid={testIdOr(testIds?.verified?.(id), {\n testId: `facts-smart-search-hit-verified-${id}`,\n })}\n >\n <CheckCircle2 className=\"size-3\" /> {l.verified}\n </span>\n )}\n <span className=\"inline-flex items-center gap-1\">\n {l.open} <CornerDownLeft className=\"size-3\" />\n </span>\n </span>\n }\n />\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/facts/fact-text.ts","../../src/facts/factColumns.tsx","../../src/facts/FactRowActions.tsx","../../src/facts/FactsTable.tsx","../../src/facts/fact-row.ts","../../src/facts/FactLabelsCell.tsx","../../src/facts/timezone.ts","../../src/facts/fact-date.ts","../../src/facts/FactDateInput.tsx","../../src/facts/FactPassages.tsx","../../src/facts/FactSourceGroup.tsx","../../src/facts/FactsViewToggle.tsx","../../src/facts/FactsFieldsButton.tsx","../../src/facts/FactTimelineViews.tsx","../../src/facts/FactsEmptyState.tsx","../../src/facts/FactComposer.tsx","../../src/facts/FactsBulkBar.tsx","../../src/facts/FactsToolbar.tsx","../../src/facts/FactSearchParts.tsx"],"names":["jsx","Pin","testIdOr","cn","jsxs","formatSpan","CalendarDays","Quote","DropdownMenu","DropdownMenuTrigger","MoreVertical","DropdownMenuContent","DropdownMenuItem","Pencil","DropdownMenuSeparator","Trash2","useMemo","GridView","memo","FactLabelsCell","useState","useRef","useEffect","observeResize","Popover","PopoverTrigger","PencilLine","Fragment","Check","PopoverContent","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem","ChevronLeft","ChevronRight","Input","Button","X","Table2","CalendarRange","GanttChartSquare","Search","ViewToggle","Columns3","ChevronDown","RotateCcw","CommandSeparator","TimelineCalendar","TimelineGantt","CalendarClock","Scale","Lightbulb","Milestone","ArrowRight","Loader2","Tooltip","TooltipTrigger","Info","TooltipContent","SelectionBar","SelectionBarAction","PinOff","Tags","MoreHorizontal","FolderUp","FilterInput","BookMarked","TabHeader","Plus","SearchHit","CheckCircle2","CornerDownLeft"],"mappings":";;;;;;;;;;;;;;;;;;;AAiBA,IAAM,yCAAyB,IAAI,GAAA,CAAI,CAAC,EAAA,EAAM,CAAA,EAAM,GAAI,CAAC,CAAA;AAElD,SAAS,yBAAyB,IAAA,EAAyC;AAChF,EAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAClB,EAAA,OAAO,KAAK,OAAA,CAAQ,4BAAA,EAA8B,CAAC,KAAA,EAAO,KAAa,GAAA,KAAgB;AACrF,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,GAAA,EAAK,EAAE,CAAA,GAAI,QAAA,CAAS,KAAK,EAAE,CAAA;AACvD,IAAA,OAAO,uBAAuB,GAAA,CAAI,IAAI,IAAI,MAAA,CAAO,aAAA,CAAc,IAAI,CAAA,GAAI,KAAA;AAAA,EACzE,CAAC,CAAA;AACH;ACgBO,IAAM,0BAAA,GAA+C;AAAA,EAC1D,mBAAA,EAAqB,oDAAA;AAAA,EACrB,WAAA,EAAa,2DAAA;AAAA,EACb,aAAA,EAAe,uCAAA;AAAA,EACf,KAAA,EAAO,YAAA;AAAA,EACP,GAAA,EAAK,UAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,SAAA,EAAW,kDAAA;AAAA,EACX,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,eAAA,EAAiB,qBAAA;AAAA,EACjB,MAAA,EAAQ,QAAA;AAAA,EACR,aAAA,EAAe,4DAAA;AAAA,EACf,SAAA,EAAW,YAAA;AAAA,EACX,OAAA,EAAS,SAAA;AAAA,EACT,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,aAAA,EAAgB,CAAC,CAAA,SAAA,EAAY,CAAA,KAAM,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,iCAAA,CAAA;AAAA,EACnE,SAAA,EAAW,YAAA;AAAA,EACX,OAAA,EAAS,SAAA;AAAA,EACT,EAAA,EAAI;AACN;AAoDO,IAAM,sBAAA,GAAyB;AAAA,EACpC,iBAAA,EAAmB,IAAA;AAAA,EACnB,UAAA,EAAY,CAAC,UAAA,EAAkB,SAAA,KAA+B;AAC5D,IAAA,IAAI,CAAC,SAAA,IAAa,OAAO,SAAA,KAAc,UAAU,OAAO,EAAA;AACxD,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,SAAS,CAAA;AAC/B,IAAA,IAAI,OAAO,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,GAAG,OAAO,EAAA;AACzC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,cAAA,EAAe,EAAG,IAAA,CAAK,WAAA,EAAY,EAAG,IAAA,CAAK,UAAA,EAAY,CAAA;AACrF,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA;AAAA,MACrB,WAAW,WAAA,EAAY;AAAA,MACvB,WAAW,QAAA,EAAS;AAAA,MACpB,WAAW,OAAA;AAAQ,KACrB;AACA,IAAA,OAAO,OAAA,GAAU,SAAA,GAAY,EAAA,GAAK,OAAA,GAAU,YAAY,CAAA,GAAI,CAAA;AAAA,EAC9D;AACF;AAGO,SAAS,eAAe,IAAA,EAA0D;AACvF,EAAA,OAAO,IAAA,EAAM,WAAW,MAAA,IAAU,CAAA;AACpC;AAGO,IAAM,yBAAA,GAA4B;AAAA,EACvC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF;AAEO,SAAS,kBAAyC,KAAA,EAAwC;AAE/F,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAA4B,IAAA;AAC7C,EAAA,MAAM,IAAI,EAAE,GAAG,0BAAA,EAA4B,GAAG,MAAM,MAAA,EAAO;AAC3D,EAAA,MAAM,MAAM,KAAA,CAAM,OAAA;AAElB,EAAA,MAAM,OAAA,GAAuB;AAAA,IAC3B;AAAA,MACE,KAAA,EAAO,QAAA;AAAA,MACP,UAAA,EAAY,EAAA;AAAA,MACZ,eAAA,EAAiB,sBACfA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8CACd,QAAA,kBAAAA,cAAA,CAACC,eAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAiC,CAAA,EAClD,CAAA;AAAA,MAEF,KAAA,EAAO,QAAQ,QAAQ,CAAA;AAAA,MACvB,KAAA,EAAO,EAAA;AAAA,MACP,QAAA,EAAU,EAAA;AAAA,MACV,QAAA,EAAU,EAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA,MACV,SAAA,EAAW,KAAA;AAAA,MACX,eAAe,CAAA,CAAE,mBAAA;AAAA,MACjB,SAAA,EAAW,cAAA;AAAA;AAAA;AAAA,MAGX,YAAA,EAAc,CAAC,MAAA,KAAmC;AAChD,QAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAM,OAAO,IAAA;AACzB,QAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,QAAA,uBACED,cAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,KAAA,CAAM,WAAA,CAAY,IAAI,CAAA;AAAA,YACrC,KAAA,EAAO,IAAA,CAAK,MAAA,GAAS,CAAA,CAAE,cAAc,CAAA,CAAE,aAAA;AAAA,YACvC,YAAA,EAAY,IAAA,CAAK,MAAA,GAAS,CAAA,CAAE,QAAQ,CAAA,CAAE,GAAA;AAAA,YACtC,gBAAc,IAAA,CAAK,MAAA;AAAA,YACnB,eAAaE,0BAAA,CAAS,GAAA,EAAK,MAAA,GAAS,IAAA,CAAK,WAAW,CAAA,EAAG;AAAA,cACrD,MAAA,EAAQ,CAAA,kBAAA,EAAqB,IAAA,CAAK,WAAW,CAAA;AAAA,aAC9C,CAAA;AAAA,YACD,SAAA,EAAU,0BAAA;AAAA,YAEV,QAAA,kBAAAF,cAAA;AAAA,cAACC,eAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAWE,KAAA;AAAA,kBACT,UAAA;AAAA,kBACA,IAAA,CAAK,SACD,+BAAA,GACA;AAAA;AACN;AAAA;AACF;AAAA,SACF;AAAA,MAEJ;AAAA,KACF;AAAA,IACA;AAAA,MACE,KAAA,EAAO,MAAA;AAAA,MACP,0BAAA,EAA4B,IAAA;AAAA,MAC5B,iBAAiB,CAAC,CAAA,KAAqB,KAAA,CAAM,YAAA,CAAa,GAAG,MAAM,CAAA;AAAA,MACnE,YAAY,CAAA,CAAE,IAAA;AAAA,MACd,KAAA,EAAO,QAAQ,MAAM,CAAA;AAAA,MACrB,IAAA,EAAM,CAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAQ,oBAAA;AAAA;AAAA;AAAA,MAGR,oBAAoB,CAAC,CAAA,KAAM,wBAAA,CAAyB,CAAA,CAAE,MAAM,IAAI,CAAA;AAAA;AAAA;AAAA,MAGhE,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,uBAAA;AAAA,MACZ,eAAA,EAAiB,IAAA;AAAA,MACjB,gBAAA,EAAkB,EAAE,IAAA,EAAM,CAAA,EAAG,MAAM,EAAA,EAAG;AAAA,MACtC,WAAA,EAAa,CAAC,MAAA,KAAW;AACvB,QAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAM,OAAO,KAAA;AACzB,QAAA,MAAA,CAAO,IAAA,CAAK,OAAO,MAAA,CAAO,QAAA;AAC1B,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA;AAAA;AAAA,MAGA,SAAA,EAAW,UAAA;AAAA,MACX,YAAA,EAAc,CAAC,MAAA,KAAmC;AAChD,QAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAM,OAAO,IAAA;AACzB,QAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAIpB,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,SAAA,IAAa,EAAA;AACtC,QAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AACpD,QAAA,uBACEC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACb,QAAA,EAAA;AAAA,0BAAAJ,cAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,+EAAA;AAAA,cACV,KAAA,EAAO,EAAE,CAAC,oBAA8B,GAAG,UAAA,EAAW;AAAA,cACtD,eAAaE,0BAAA,CAAS,GAAA,EAAK,IAAA,GAAO,IAAA,CAAK,WAAW,CAAA,EAAG;AAAA,gBACnD,MAAA,EAAQ,CAAA,gBAAA,EAAmB,IAAA,CAAK,WAAW,CAAA;AAAA,eAC5C,CAAA;AAAA,cAEA,QAAA,EAAA,wBAAA,CAAyB,KAAK,IAAI;AAAA;AAAA,WACrC;AAAA,0BAEAF,cAAA,CAAC,SAAI,SAAA,EAAU,6DAAA,EACZ,gBAAM,gBAAA,CAAiB,IAAA,EAAM,MAAM,CAAA,EACtC;AAAA,SAAA,EACF,CAAA;AAAA,MAEJ;AAAA,KACF;AAAA,IACA;AAAA,MACE,KAAA,EAAO,MAAA;AAAA;AAAA;AAAA,MAGP,YAAY,CAAA,CAAE,KAAA;AAAA;AAAA,MAEd,KAAA,EAAO,QAAQ,YAAY,CAAA;AAAA,MAC3B,IAAA,EAAM,GAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAQ,oBAAA;AAAA,MACR,YAAA,EAAc,sBAAA;AAAA;AAAA;AAAA;AAAA,MAId,QAAA,EAAU,IAAA;AAAA,MACV,eAAA,EAAiB,IAAA;AAAA,MACjB,WAAA,EAAa,CAAC,MAAA,KACZ,MAAA,CAAO,IAAA,EAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA;AAAA,MAClE,WAAA,EAAa,CAAC,MAAA,KAAW;AACvB,QAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAM,OAAO,KAAA;AACzB,QAAA,MAAA,CAAO,IAAA,CAAK,aAAa,MAAA,CAAO,QAAA;AAChC,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MACA,SAAA,EAAW,oBAAA;AAAA,MACX,YAAA,EAAc,CAAC,MAAA,KAAmC;AAChD,QAAA,MAAM,IAAA,GAAOK,4BAAA;AAAA,UACX,OAAO,IAAA,EAAM,UAAA;AAAA,UACb,OAAO,IAAA,EAAM,QAAA;AAAA,UACb,OAAO,IAAA,EAAM;AAAA,SACf;AACA,QAAA,IAAI,CAAC,IAAA,EAAM,sCAAQ,MAAA,EAAA,EAAK,SAAA,EAAU,4BAA2B,QAAA,EAAA,QAAA,EAAC,CAAA;AAC9D,QAAA,uBACED,eAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,gCAAA;AAAA,YACV,aAAA,EAAaF,2BAAS,GAAA,EAAK,IAAA,GAAO,OAAO,IAAA,EAAM,WAAA,IAAe,EAAE,CAAA,EAAG;AAAA,cACjE,MAAA,EAAQ,CAAA,gBAAA,EAAmB,MAAA,CAAO,IAAA,EAAM,WAAW,CAAA;AAAA,aACpD,CAAA;AAAA,YACD,OAAO,CAAA,CAAE,SAAA;AAAA,YAET,QAAA,EAAA;AAAA,8BAAAF,cAAA,CAACM,wBAAA,EAAA,EAAa,WAAU,mBAAA,EAAoB,CAAA;AAAA,cAC3C;AAAA;AAAA;AAAA,SACH;AAAA,MAEJ;AAAA,KACF;AAAA,IACA;AAAA,MACE,KAAA,EAAO,MAAA;AAAA,MACP,0BAAA,EAA4B,IAAA;AAAA,MAC5B,iBAAiB,CAAC,CAAA,KAAqB,KAAA,CAAM,YAAA,CAAa,GAAG,MAAM,CAAA;AAAA,MACnE,YAAY,CAAA,CAAE,MAAA;AAAA,MACd,IAAA,EAAM,GAAA;AAAA;AAAA,MAEN,QAAA,EAAU,GAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAQ,oBAAA;AAAA,MACR,SAAA,EAAW,kBAAA;AAAA,MACX,WAAA,EAAa,CAAC,MAAA,KAAA,CACX,MAAA,CAAO,MAAM,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA;AAAA,MAExD,YAAA,EAAc,CAAC,MAAA,KACb,MAAA,CAAO,IAAA,GAAO,MAAM,YAAA,CAAa,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA,GAAI;AAAA,KAC5D;AAAA,IACA;AAAA,MACE,KAAA,EAAO,WAAA;AAAA,MACP,YAAY,CAAA,CAAE,QAAA;AAAA,MACd,eAAe,CAAA,CAAE,eAAA;AAAA,MACjB,KAAA,EAAO,QAAQ,WAAW,CAAA;AAAA;AAAA,MAE1B,KAAA,EAAO,GAAA;AAAA,MACP,QAAA,EAAU,GAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA,MACV,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa,CAAC,MAAA,KAAW,MAAA,CAAO,MAAM,SAAA,IAAa,KAAA;AAAA,MACnD,SAAA,EAAW,cAAA;AAAA,MACX,WAAA,EAAa,gBAAA;AAAA,MACb,YAAA,EAAc,CAAC,MAAA,KACb,MAAA,CAAO,uBACLN,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACZ,QAAA,EAAA,KAAA,CAAM,cAAA,CAAe,MAAA,CAAO,IAAI,GACnC,CAAA,GACE;AAAA,KACR;AAAA,IACA;AAAA,MACE,KAAA,EAAO,QAAA;AAAA,MACP,YAAY,CAAA,CAAE,MAAA;AAAA,MACd,eAAe,CAAA,CAAE,aAAA;AAAA,MACjB,KAAA,EAAO,QAAQ,QAAQ,CAAA;AAAA;AAAA,MAEvB,KAAA,EAAO,GAAA;AAAA,MACP,QAAA,EAAU,GAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA,MACV,WAAA,EAAa,gBAAA;AAAA,MACb,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa,CAAC,MAAA,KAAW,MAAA,CAAO,MAAM,MAAA,IAAU,KAAA;AAAA,MAChD,YAAA,EAAc,CAAC,MAAA,KACb,MAAA,CAAO,uBACLA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACZ,gBAAM,YAAA,CAAa,MAAA,CAAO,IAAA,EAAM,MAAM,GACzC,CAAA,GACE;AAAA,KACR;AAAA,IACA;AAAA,MACE,KAAA,EAAO,YAAA;AAAA,MACP,YAAY,CAAA,CAAE,SAAA;AAAA,MACd,eAAe,CAAA,CAAE,SAAA;AAAA,MACjB,KAAA,EAAO,GAAA;AAAA,MACP,QAAA,EAAU,GAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA,MACV,WAAA,EAAa,CAAC,MAAA,KAAW,KAAA,CAAM,eAAe,MAAM,CAAA;AAAA,MACpD,YAAA,EAAc,CAAC,MAAA,KACb,MAAA,CAAO,uBACLA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACZ,gBAAM,aAAA,CAAc,MAAA,CAAO,IAAA,EAAM,MAAM,GAC1C,CAAA,GACE;AAAA,KACR;AAAA,IACA;AAAA,MACE,KAAA,EAAO,SAAA;AAAA,MACP,YAAY,CAAA,CAAE,OAAA;AAAA,MACd,KAAA,EAAO,GAAA;AAAA,MACP,QAAA,EAAU,GAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA;AAAA;AAAA,MAGV,WAAA,EAAa,CAAC,MAAA,KAAW,cAAA,CAAe,OAAO,IAAI,CAAA;AAAA,MACnD,YAAA,EAAc,CAAC,MAAA,KAAmC;AAChD,QAAA,MAAM,CAAA,GAAI,cAAA,CAAe,MAAA,CAAO,IAAI,CAAA;AACpC,QAAA,IAAI,MAAM,CAAA,EAAG,sCAAQ,MAAA,EAAA,EAAK,SAAA,EAAU,4BAA2B,QAAA,EAAA,QAAA,EAAC,CAAA;AAChE,QAAA,uBACEI,eAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,8DAAA;AAAA,YACV,KAAA,EAAO,CAAA,CAAE,WAAA,CAAY,CAAC,CAAA;AAAA,YAEtB,QAAA,EAAA;AAAA,8BAAAJ,cAAA,CAACO,iBAAA,EAAA,EAAM,WAAU,mBAAA,EAAoB,CAAA;AAAA,cACpC;AAAA;AAAA;AAAA,SACH;AAAA,MAEJ;AAAA,KACF;AAAA,IACA;AAAA,MACE,KAAA,EAAO,YAAA;AAAA,MACP,0BAAA,EAA4B,IAAA;AAAA,MAC5B,iBAAiB,CAAC,CAAA,KAAqB,KAAA,CAAM,YAAA,CAAa,GAAG,YAAY,CAAA;AAAA,MACzE,YAAY,CAAA,CAAE,SAAA;AAAA,MACd,KAAA,EAAO,QAAQ,YAAY,CAAA;AAAA,MAC3B,KAAA,EAAO,GAAA;AAAA,MACP,QAAA,EAAU,GAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAQ,oBAAA;AAAA,MACR,YAAA,EAAc,sBAAA;AAAA;AAAA,MAEd,SAAA,EAAW,uBAAA;AAAA,MACX,cAAA,EAAgB,CAAC,MAAA,KAAY,MAAA,CAAO,QAAQ,KAAA,CAAM,UAAA,CAAW,MAAA,CAAO,KAAK,CAAA,GAAI;AAAA,KAC/E;AAAA,IACA;AAAA,MACE,KAAA,EAAO,YAAA;AAAA,MACP,0BAAA,EAA4B,IAAA;AAAA,MAC5B,iBAAiB,CAAC,CAAA,KAAqB,KAAA,CAAM,YAAA,CAAa,GAAG,YAAY,CAAA;AAAA,MACzE,YAAY,CAAA,CAAE,OAAA;AAAA,MACd,KAAA,EAAO,QAAQ,YAAY,CAAA;AAAA,MAC3B,KAAA,EAAO,GAAA;AAAA,MACP,QAAA,EAAU,GAAA;AAAA;AAAA,MAEV,IAAA,EAAM,IAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAQ,oBAAA;AAAA,MACR,YAAA,EAAc,sBAAA;AAAA,MACd,cAAA,EAAgB,CAAC,MAAA,KAAY,MAAA,CAAO,QAAQ,KAAA,CAAM,UAAA,CAAW,MAAA,CAAO,KAAK,CAAA,GAAI;AAAA,KAC/E;AAAA,IACA;AAAA,MACE,KAAA,EAAO,SAAA;AAAA,MACP,YAAY,CAAA,CAAE,EAAA;AAAA,MACd,KAAA,EAAO,QAAQ,aAAa,CAAA;AAAA,MAC5B,KAAA,EAAO,GAAA;AAAA,MACP,QAAA,EAAU,GAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAQ,oBAAA;AAAA;AAAA,MAER,IAAA,EAAM,IAAA;AAAA,MACN,SAAA,EAAW;AAAA;AACb,GACF;AAGA,EAAA,OAAO,yBAAA,CAA0B,GAAA,CAAI,CAAC,EAAA,KAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,EAAE,CAAC,CAAA,CAAE,MAAA;AAAA,IAChF,CAAC,MAAsB,CAAA,KAAM;AAAA,GAC/B;AACF;AClaO,IAAM,+BAAA,GAAwD;AAAA,EACnE,OAAA,EAAS,cAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,cAAA,EAAgB,4DAAA;AAAA,EAChB,MAAA,EAAQ;AACV;AAiBO,SAAS,cAAA,CAAe;AAAA,EAC7B,MAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,+BAAA,EAAiC,GAAG,MAAA,EAAO;AAC1D,EAAA,uBACEH,gBAACI,eAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAR,cAAAA,CAACS,sBAAA,EAAA,EAAoB,OAAA,EAAO,IAAA,EAC1B,QAAA,kBAAAT,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,QAClC,SAAA,EAAU,qNAAA;AAAA,QACV,eAAaE,0BAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,oBAAoB,CAAA;AAAA,QACtE,cAAY,CAAA,CAAE,OAAA;AAAA,QAEd,QAAA,kBAAAF,cAAAA,CAACU,wBAAA,EAAA,EAAa,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,KACnC,EACF,CAAA;AAAA,oBACAN,eAAAA,CAACO,sBAAA,EAAA,EAAoB,KAAA,EAAM,KAAA,EAAM,SAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB,EACjE,QAAA,EAAA;AAAA,sBAAAP,eAAAA;AAAA,QAACQ,mBAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,MAAA;AAAA,UACV,UAAU,CAAC,OAAA;AAAA,UACX,KAAA,EAAO,OAAA,GAAU,MAAA,GAAY,CAAA,CAAE,cAAA;AAAA,UAC/B,eAAaV,0BAAA,CAAS,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,oBAAoB,CAAA;AAAA,UAEnE,QAAA,EAAA;AAAA,4BAAAF,cAAAA,CAACa,kBAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,YAC/B,CAAA,CAAE;AAAA;AAAA;AAAA,OACL;AAAA,sBACAb,eAACc,wBAAA,EAAA,EAAsB,CAAA;AAAA,sBACvBV,eAAAA;AAAA,QAACQ,mBAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,QAAA;AAAA,UACV,SAAA,EAAU,mCAAA;AAAA,UACV,eAAaV,0BAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,sBAAsB,CAAA;AAAA,UAEvE,QAAA,EAAA;AAAA,4BAAAF,cAAAA,CAACe,kBAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,YAC/B,CAAA,CAAE;AAAA;AAAA;AAAA;AACL,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACvCA,SAAS,WAAW,EAAE,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,QAAO,EAAoB;AACzE,EAAA,uBACEf,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,IAAA,EAAK,QAAA;AAAA,MACL,cAAA,EAAc,OAAA;AAAA,MACd,YAAA,EAAY,KAAA;AAAA,MACZ,OAAA,EAAS,QAAA;AAAA,MACT,aAAA,EAAa,MAAA;AAAA,MACb,SAAA,EAAWG,KAAAA;AAAA,QACT,uEAAA;AAAA,QACA,yEAAA;AAAA,QACA,UAAU,gBAAA,GAAmB;AAAA,OAC/B;AAAA,MAEA,QAAA,kBAAAH,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAWG,KAAAA;AAAA,YACT,wDAAA;AAAA,YACA,OAAA,IAAW;AAAA;AACb;AAAA;AACF;AAAA,GACF;AAEJ;AAEA,IAAM,iBAAA,GAAoB,CAAC,GAAA,KAAwB;AACjD,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,GAAG,CAAA;AACtB,EAAA,OAAO,MAAA,CAAO,MAAM,CAAA,CAAE,OAAA,EAAS,CAAA,GAAI,GAAA,GAAM,EAAE,kBAAA,EAAmB;AAChE,CAAA;AAEA,IAAM,WAAA,GAAc,EAAE,KAAA,EAAO,cAAA,EAAe;AAGrC,SAAS,UAAA,CAAkC;AAAA,EAChD,KAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA,GAAa,iBAAA;AAAA,EACb,YAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA,GAAS,gBAAA;AAAA,EACT,MAAA,GAAS,MAAA;AAAA,EACT,SAAA,GAAY,EAAA;AAAA,EACZ,SAAA;AAAA,EACA,MAAA,GAAS;AACX,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,0BAAA,EAA4B,GAAG,YAAA,EAAa;AAE3D,EAAA,MAAM,UAAA,GAAaa,aAAA;AAAA,IACjB,MACE,iBAAA,CAAqB;AAAA,MACnB,WAAA;AAAA,MACA,YAAA,EAAc,CAAC,MAAA,qBACbhB,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA6B,QAAA,EAAA,MAAA,CAAO,WAAA,EAAY,CAAA;AAAA,MAElE,kBAAkB,CAAC,IAAA,KACjB,UAAU,QAAA,mBACRA,eAAC,cAAA,EAAA,EAAe,MAAA,EAAQ,MAAM,MAAA,CAAO,IAAI,CAAA,EAAG,QAAA,EAAU,MAAM,QAAA,CAAS,IAAI,GAAG,CAAA,GAC1E,IAAA;AAAA,MACN,YAAA,EAAc,CAAC,IAAA,qBACbA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EACZ,QAAA,EAAA,CAAA,IAAA,CAAK,QAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,wBACtBA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,gEAAA;AAAA,UAET,QAAA,EAAA,GAAA,CAAI;AAAA,SAAA;AAAA,QAHA,GAAA,CAAI;AAAA,OAKZ,CAAA,EACH,CAAA;AAAA,MAEF,cAAA,EAAgB,CAAC,IAAA,qBACfA,cAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,SAAS,IAAA,CAAK,SAAA;AAAA,UACd,OAAO,CAAA,CAAE,QAAA;AAAA,UACT,QAAA,EAAU,MAAM,iBAAA,CAAkB,IAAI,CAAA;AAAA,UACtC,MAAA,EAAQ,CAAA,qBAAA,EAAwB,IAAA,CAAK,WAAW,CAAA;AAAA;AAAA,OAClD;AAAA,MAEF,YAAA,EAAc,CAAC,IAAA,qBACbA,cAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,SAAS,IAAA,CAAK,MAAA;AAAA,UACd,OAAO,CAAA,CAAE,MAAA;AAAA,UACT,QAAA,EAAU,MAAM,cAAA,CAAe,IAAI,CAAA;AAAA,UACnC,MAAA,EAAQ,CAAA,kBAAA,EAAqB,IAAA,CAAK,WAAW,CAAA;AAAA;AAAA,OAC/C;AAAA,MAEF,aAAA,EAAe,CAAC,IAAA,EAAM,OAAA,KAAoC;AACxD,QAAA,MAAM,IAAA,GAAO,cAAA,GAAiB,IAAI,CAAA,IAAK,EAAA;AACvC,QAAA,OAAO,uBACLA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,IAAA;AAAA,YACP,SAAA,EAAU,oHAAA;AAAA,YAET,qCAAS,IAAI;AAAA;AAAA,SAChB,GACE,IAAA;AAAA,MACN,CAAA;AAAA,MACA,cAAA,EAAgB,CAAC,MAAA,KAAY,MAAA,CAAO,OAAQ,cAAA,GAAiB,MAAA,CAAO,IAAI,CAAA,IAAK,EAAA,GAAM,EAAA;AAAA,MACnF,UAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,IACH;AAAA,MACE,WAAA;AAAA,MACA,iBAAA;AAAA,MACA,cAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA,MACA,CAAA,CAAE,QAAA;AAAA,MACF,CAAA,CAAE;AAAA;AACJ,GACF;AAEA,EAAA,uBACEA,cAAAA;AAAA,IAACiB,0BAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,KAAA,EAAO,KAAA;AAAA,MACP,UAAA;AAAA,MACA,SAAA,EAAW,CAAC,IAAA,KAAS,IAAA,CAAK,WAAA;AAAA,MAC1B,UAAA,EAAY,MAAA;AAAA,MACZ,SAAA;AAAA,MACA,UAAA,EAAY,WAAA;AAAA,MACZ,MAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACC,GAAG,SAAA;AAAA,MACJ,aAAa,EAAE,iBAAA,EAAmB,IAAA,EAAM,GAAG,WAAW,WAAA;AAAY;AAAA,GACpE;AAEJ;;;AC/JO,SAAS,UAAqC,MAAA,EAA4B;AAC/E,EAAA,OAAO;AAAA,IACL,aAAa,MAAA,CAAO,EAAA;AAAA,IACpB,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,MAAA,EAAQ,OAAO,MAAA,IAAU,KAAA;AAAA,IACzB,SAAA,EAAW,OAAO,SAAA,IAAa,KAAA;AAAA,IAC/B,MAAA,EAAQ,OAAO,MAAA,IAAU,KAAA;AAAA,IACzB,UAAA,EAAY,OAAO,SAAA,IAAa,IAAA;AAAA,IAChC,QAAA,EAAU,OAAO,OAAA,IAAW,IAAA;AAAA,IAC5B,QAAA,EAAU,OAAO,QAAA,IAAY,IAAA;AAAA,IAC7B,IAAA,EAAA,CAAO,MAAA,CAAO,IAAA,IAAQ,IAAI,GAAA,CAAI,CAAC,CAAA,KAAO,OAAO,MAAM,QAAA,GAAW,EAAE,IAAA,EAAM,CAAA,KAAM,CAAE,CAAA;AAAA,IAC9E,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,EAAC;AAAA,IAChC,iBAAA,EAAmB,OAAO,SAAA,IAAa,IAAA;AAAA,IACvC,UAAA,EAAY,OAAO,SAAA,IAAa,IAAA;AAAA,IAChC,UAAA,EAAY,OAAO,SAAA,IAAa,IAAA;AAAA,IAChC;AAAA,GACF;AACF;AAEO,SAAS,WAAsC,OAAA,EAAiC;AACrF,EAAA,OAAO,OAAA,CAAQ,IAAI,SAAS,CAAA;AAC9B;AC3BO,IAAM,+BAAA,GAAwD;AAAA,EACnE,IAAA,EAAM,aAAA;AAAA,EACN,iBAAA,EAAmB,qBAAA;AAAA,EACnB,MAAA,EAAQ,CAAC,IAAA,KAAS,CAAA,aAAA,EAAgB,IAAI,CAAA,MAAA,CAAA;AAAA,EACtC,KAAA,EAAO;AACT;AA8BA,IAAM,UAAA,GAAa,EAAA;AACnB,IAAM,QAAA,GAAW,CAAA;AAMV,IAAM,cAAA,GAAiBC,UAAA,CAAK,SAASC,eAAAA,CAAe;AAAA,EACzD,OAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,MAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,+BAAA,EAAiC,GAAG,MAAA,EAAO;AAC1D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIC,eAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,EAAE,CAAA;AAEvC,EAAA,MAAM,OAAA,GAAUJ,aAAAA;AAAA,IACd,MAAM,IAAI,GAAA,CAAI,WAAA,CAAY,OAAO,CAAC,EAAA,KAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAC,CAAC,CAAA;AAAA,IAC1E,CAAC,aAAa,OAAO;AAAA,GACvB;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,MAAA,KACd,QAAA;AAAA,IACE,QAAQ,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,GACjB,YAAY,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,KAAO,OAAO,EAAE,CAAA,GAC3C,CAAC,GAAG,WAAA,EAAa,OAAO,EAAE;AAAA,GAChC;AAEF,EAAA,MAAM,cAAA,GAAiB,OAAO,IAAA,KAAiB;AAC7C,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,WAAA,EAAY,KAAM,OAAA,CAAQ,WAAA,EAAa,CAAA;AACnF,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA,EAAG,QAAA,CAAS,CAAC,GAAG,WAAA,EAAa,QAAA,CAAS,EAAE,CAAC,CAAA;AACrE,MAAA,SAAA,CAAU,EAAE,CAAA;AACZ,MAAA;AAAA,IACF;AACA,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,OAAO,CAAA;AACjC,IAAA,IAAI,IAAI,QAAA,CAAS,CAAC,GAAG,WAAA,EAAa,EAAE,CAAC,CAAA;AACrC,IAAA,SAAA,CAAU,EAAE,CAAA;AAAA,EACd,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,OAAO,SAAA,GAAY,QAAA,KAAa,UAAA,GAAa,QAAA,CAAS,CAAC,CAAA;AAC1F,EAAA,MAAM,cAAA,GAAiB,QAAQ,MAAA,CAAO,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAI9D,EAAA,MAAM,QAAA,GAAWK,aAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAID,eAAS,KAAK,CAAA;AACpD,EAAAE,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,QAAA,CAAS,OAAA;AACpB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,UAAU,MAAM,cAAA,CAAe,GAAG,YAAA,GAAe,EAAA,CAAG,eAAe,CAAC,CAAA;AAC1E,IAAA,OAAA,EAAQ;AACR,IAAA,OAAOC,+BAAA,CAAc,IAAI,OAAO,CAAA;AAAA,EAClC,GAAG,CAAC,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,OAAO,CAAC,CAAA;AAE3C,EAAA,MAAM,wBAAwB,OAAA,CAAQ,IAAA;AAAA,IACpC,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,aAAY,KAAM,MAAA,CAAO,IAAA,EAAK,CAAE,WAAA;AAAY,GAC5D;AAEA,EAAA,uBACEnB,eAAAA;AAAA,IAACoB,UAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,QAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,QAAA,IAAI,CAAC,IAAA,EAAM,SAAA,CAAU,EAAE,CAAA;AAAA,MACzB,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAxB,cAAAA,CAACyB,iBAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAAzB,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,cAAY,CAAA,CAAE,IAAA;AAAA,YACd,WAAA,EAAU,kBAAA;AAAA,YACV,SAAA,EAAU,2GAAA;AAAA,YAET,yBAAe,MAAA,KAAW,CAAA,mBACzBA,cAAAA,CAAC,UAAK,SAAA,EAAU,yCAAA,EACd,QAAA,kBAAAA,cAAAA,CAAC0B,0BAAW,SAAA,EAAU,UAAA,EAAW,GACnC,CAAA,mBAEAtB,gBAAAuB,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAA3B,cAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,GAAA,EAAK,QAAA;AAAA,kBACL,SAAA,EAAU,mEAAA;AAAA,kBACV,OAAO,EAAE,SAAA,EAAW,aAAa,SAAA,GAAY,QAAA,IAAY,YAAY,CAAA,CAAA,EAAG;AAAA,kBAEvE,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,qBACnBI,eAAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBAEC,SAAA,EAAU,0FAAA;AAAA,sBACV,OAAO,CAAA,CAAE,IAAA;AAAA,sBACT,KAAA,EAAO,EAAE,WAAA,EAAa,CAAA,CAAE,KAAA,EAAM;AAAA,sBAE9B,QAAA,EAAA;AAAA,wCAAAJ,cAAAA;AAAA,0BAAC,MAAA;AAAA,0BAAA;AAAA,4BACC,SAAA,EAAU,4DAAA;AAAA,4BACV,KAAA,EAAO,EAAE,eAAA,EAAiB,CAAA,CAAE,KAAA,EAAM;AAAA,4BAElC,0BAAAA,cAAAA,CAAC4B,iBAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EAAsB,aAAa,CAAA,EAAG;AAAA;AAAA,yBACzD;AAAA,wCACA5B,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,YAAE,IAAA,EAAK;AAAA;AAAA,qBAAA;AAAA,oBAX3C,CAAA,CAAE;AAAA,mBAaV;AAAA;AAAA,eACH;AAAA,cACC,+BACCA,cAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,4GAAA;AAAA,kBACV,aAAA,EAAW,IAAA;AAAA,kBACZ,QAAA,EAAA;AAAA;AAAA;AAED,aAAA,EAEJ;AAAA;AAAA,SAEJ,EACF,CAAA;AAAA,QACC,wBACCA,cAAAA,CAAC6B,iBAAA,EAAA,EAAe,SAAA,EAAU,iBAAgB,KAAA,EAAM,OAAA,EAAQ,IAAA,EAAK,QAAA,EAAS,YAAY,CAAA,EAChF,QAAA,kBAAAzB,eAAAA,CAAC0B,UAAA,EAAA,EAAQ,cAAc,IAAA,EACrB,QAAA,EAAA;AAAA,0BAAA9B,cAAAA;AAAA,YAAC+B,eAAA;AAAA,YAAA;AAAA,cACC,aAAa,CAAA,CAAE,iBAAA;AAAA,cACf,KAAA,EAAO,MAAA;AAAA,cACP,aAAA,EAAe,SAAA;AAAA,cACf,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,gBAAA,IAAI,EAAE,GAAA,KAAQ,OAAA,IAAW,OAAO,IAAA,EAAK,IAAK,CAAC,qBAAA,EAAuB;AAChE,kBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,kBAAA,KAAK,eAAe,MAAM,CAAA;AAAA,gBAC5B;AAAA,cACF;AAAA;AAAA,WACF;AAAA,0BACA3B,gBAAC4B,cAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAhC,cAAAA,CAACiC,eAAA,EAAA,EACE,QAAA,EAAA,MAAA,CAAO,IAAA,qBACNjC,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,KAAK,cAAA,CAAe,MAAM,CAAA;AAAA,gBACzC,aAAA,EAAe,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAe;AAAA,gBACvC,SAAA,EAAU,kHAAA;AAAA,gBAET,QAAA,EAAA,CAAA,CAAE,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM;AAAA;AAAA,aACzB,mBAEAA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,uBAAA,EAAyB,QAAA,EAAA,CAAA,CAAE,OAAM,CAAA,EAErD,CAAA;AAAA,4BACAA,cAAAA,CAACkC,eAAA,EAAA,EACE,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AAClB,cAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAClC,cAAA,uBACE9B,eAAAA;AAAA,gBAAC+B,cAAA;AAAA,gBAAA;AAAA,kBAEC,OAAO,CAAA,CAAE,IAAA;AAAA,kBACT,QAAA,EAAU,MAAM,MAAA,CAAO,CAAC,CAAA;AAAA,kBACxB,aAAA,EAAe,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAe;AAAA,kBACvC,SAAA,EAAU,wCAAA;AAAA,kBACV,eAAajC,0BAAA,CAAS,OAAA,EAAS,MAAA,GAAS,CAAA,CAAE,EAAE,CAAA,EAAG;AAAA,oBAC7C,MAAA,EAAQ,CAAA,kBAAA,EAAqB,CAAA,CAAE,EAAE,CAAA;AAAA,mBAClC,CAAA;AAAA,kBAED,QAAA,EAAA;AAAA,oCAAAF,cAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,SAAA,EAAU,wEAAA;AAAA,wBACV,KAAA,EACE,SAAA,GACI,EAAE,WAAA,EAAa,CAAA,CAAE,KAAA,EAAO,eAAA,EAAiB,CAAA,CAAE,KAAA,EAAM,GACjD,EAAE,WAAA,EAAa,EAAE,KAAA,EAAM;AAAA,wBAG5B,uCAAaA,cAAAA,CAAC4B,qBAAM,SAAA,EAAU,mBAAA,EAAoB,aAAa,CAAA,EAAG;AAAA;AAAA,qBACrE;AAAA,oCACA5B,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAkB,YAAE,IAAA,EAAK;AAAA;AAAA,iBAAA;AAAA,gBAnBpC,CAAA,CAAE;AAAA,eAoBT;AAAA,YAEJ,CAAC,CAAA,EACH;AAAA,WAAA,EACF;AAAA,SAAA,EACF,CAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ,CAAC;;;ACjPM,SAAS,cAAA,GAAyB;AACvC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,cAAA,EAAe,CAAE,eAAA,GAAkB,QAAA,IAAY,KAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGO,SAAS,kBAAA,GAA+B;AAC7C,EAAA,IAAI;AACF,IAAA,MAAM,KAAM,IAAA,CACT,iBAAA;AACH,IAAA,OAAO,EAAA,GAAK,EAAA,CAAG,UAAU,CAAA,GAAI,EAAC;AAAA,EAChC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;;;ACEO,IAAM,sBAAA,GAAyC;AAAA,EACpD,IAAA,EAAM,EAAA;AAAA,EACN,IAAA,EAAM,EAAA;AAAA,EACN,QAAA,EAAU,EAAA;AAAA,EACV,OAAA,EAAS,EAAA;AAAA,EACT,OAAA,EAAS;AACX;AAEA,SAAS,cAAc,CAAA,EAAkB;AACvC,EAAA,OAAO,CAAA,CAAE,WAAA,EAAY,KAAM,CAAA,IAAK,CAAA,CAAE,eAAc,KAAM,CAAA,IAAK,CAAA,CAAE,aAAA,EAAc,KAAM,CAAA;AACnF;AAEA,SAAS,cAAc,CAAA,EAAkB;AACvC,EAAA,OAAO,EAAE,WAAA,EAAY,KAAM,EAAA,IAAM,CAAA,CAAE,eAAc,KAAM,EAAA;AACzD;AAEA,SAAS,UAAU,CAAA,EAAiB;AAClC,EAAA,OAAO,CAAA,CAAE,WAAA,EAAY,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACpC;AAIA,SAAS,aAAa,EAAA,EAAoB;AACxC,EAAA,IAAI;AACF,IAAA,IAAI,KAAK,cAAA,CAAe,OAAA,EAAS,EAAE,QAAA,EAAU,IAAI,CAAA;AACjD,IAAA,OAAO,EAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGA,SAAS,eAAA,CAAgB,KAAa,QAAA,EAAkD;AACtF,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,GAAG,CAAA;AACtB,EAAA,MAAM,QAAQ,MAAA,CAAO,WAAA;AAAA,IACnB,IAAI,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS;AAAA,MAC/B,QAAA,EAAU,aAAa,QAAQ,CAAA;AAAA,MAC/B,SAAA,EAAW,KAAA;AAAA,MACX,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,GAAA,EAAK,SAAA;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACT,CAAA,CACE,aAAA,CAAc,CAAC,CAAA,CACf,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,KAAK,CAAC;AAAA,GACjC;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,GAAG,KAAA,CAAM,IAAI,IAAI,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,KAAA,CAAM,GAAG,CAAA,CAAA;AAAA,IAC/C,MAAM,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,MAAM,MAAM,CAAA;AAAA,GACrC;AACF;AAKA,SAAS,eAAA,CAAgB,IAAA,EAAc,IAAA,EAAc,QAAA,EAA0B;AAC7E,EAAA,MAAM,EAAA,GAAK,aAAa,QAAQ,CAAA;AAChC,EAAA,MAAM,wBAAQ,IAAI,IAAA,CAAK,GAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,IAAA,CAAM,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,KAAA,CAAM,WAAA,IAAe,EAAE,CAAA;AACrD,EAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACnD,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,KAAA,CAAM,KAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACjD,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,IAAI,EAAE,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,OAAA,GAAU,KAAA,CAAM,OAAA,EAAQ;AACzC,EAAA,OAAO,IAAI,IAAA,CAAK,KAAA,CAAM,SAAQ,GAAI,QAAQ,EAAE,WAAA,EAAY;AAC1D;AAGO,SAAS,oBAAA,CACd,SAAA,EACA,OAAA,EACA,QAAA,EACgB;AAChB,EAAA,IAAI,CAAC,WAAW,OAAO,sBAAA;AACvB,EAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,SAAS,CAAA;AAChC,EAAA,IAAI,OAAO,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,GAAG,OAAO,sBAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,OAAA,GAAU,IAAI,IAAA,CAAK,OAAO,CAAA,GAAI,KAAA;AAC1C,EAAA,MAAM,WAAW,aAAA,CAAc,KAAK,MAAM,CAAC,OAAA,IAAW,cAAc,GAAG,CAAA,CAAA;AAEvE,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,QAAA,GAAW,UAAU,KAAK,CAAA;AAChC,IAAA,MAAM,MAAA,GAAS,OAAA,GAAU,SAAA,CAAU,GAAG,CAAA,GAAI,QAAA;AAC1C,IAAA,OAAO,EAAE,GAAG,sBAAA,EAAwB,IAAA,EAAM,UAAU,OAAA,EAAS,MAAA,KAAW,QAAA,GAAW,MAAA,GAAS,EAAA,EAAG;AAAA,EACjG;AAEA,EAAA,MAAM,KAAK,QAAA,IAAY,KAAA;AACvB,EAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,SAAA,EAAW,EAAE,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY,CAAC,OAAA,IAAW,SAAA,KAAc,OAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,SAAA,GAAY,IAAA,GAAO,eAAA,CAAgB,SAAS,EAAE,CAAA;AAC/D,EAAA,OAAO;AAAA,IACL,MAAM,UAAA,CAAW,IAAA;AAAA,IACjB,MAAM,UAAA,CAAW,IAAA;AAAA,IACjB,QAAA,EAAU,EAAA;AAAA,IACV,OAAA,EAAS,UAAU,IAAA,IAAQ,EAAA;AAAA,IAC3B,OAAA,EAAS,UAAU,IAAA,IAAQ;AAAA,GAC7B;AACF;AAIO,SAAS,qBAAqB,MAAA,EAInC;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAM,OAAO,EAAE,MAAM,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK;AACtE,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,QAAA,IAAY,cAAA,EAAe;AAE7C,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,GACpB,eAAA,CAAgB,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,EAAE,CAAA,GAC5C,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,cAAA,CAAA;AAElB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,MAAA,GACE,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,OAAA,GAClB,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,EAAE,CAAA,GAClD,CAAA,EAAG,OAAO,OAAO,CAAA,cAAA,CAAA;AAAA,EACzB,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,MAAA,CAAO,IAAA,GAAO,QAAA,GAAW,CAAA,EAAG,OAAO,IAAI,CAAA,cAAA,CAAA;AAAA,EAClD;AAEA,EAAA,OAAO,EAAE,MAAM,QAAA,EAAU,QAAA,EAAU,QAAQ,QAAA,EAAU,MAAA,CAAO,IAAA,GAAO,EAAA,GAAK,IAAA,EAAK;AAC/E;AC9GO,IAAM,8BAAA,GAAsD;AAAA,EACjE,QAAA,EAAU,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAAA,EACnD,MAAA,EAAQ;AAAA,IACN,SAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,aAAA,EAAe,gBAAA;AAAA,EACf,YAAA,EAAc,eAAA;AAAA,EACd,SAAA,EAAW,YAAA;AAAA,EACX,UAAA,EAAY,aAAA;AAAA,EACZ,QAAA,EAAU,aAAA;AAAA,EACV,OAAA,EAAS,YAAA;AAAA,EACT,SAAA,EAAW,YAAA;AAAA,EACX,OAAA,EAAS,UAAA;AAAA,EACT,aAAA,EAAe,wBAAA;AAAA,EACf,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,qBAAA;AAAA,EACT,SAAA,EAAW;AACb;AAUA,SAAS,MAAA,CAAO,IAAA,EAAc,UAAA,EAAoB,GAAA,EAAqB;AACrE,EAAA,MAAM,IAAI,MAAA,CAAO,UAAA,GAAa,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAChD,EAAA,MAAM,IAAI,MAAA,CAAO,GAAG,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACrC,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,CAAA;AAC1B;AAGA,SAAS,UAAU,GAAA,EAAqB;AACtC,EAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,IAAI,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,IAAK,CAAC,GAAG,OAAO,GAAA;AAC3B,EAAA,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC,CAAA,CAAE,kBAAA,CAAmB,MAAA,EAAW;AAAA,IACnE,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,GAAA,EAAK,SAAA;AAAA,IACL,QAAA,EAAU;AAAA,GACX,CAAA;AACH;AAIA,SAAS,mBAAmB,CAAA,EAA2B;AACrD,EAAA,MAAM,KAAA,GAAQ,GAAG,SAAA,CAAU,CAAA,CAAE,IAAI,CAAC,CAAA,EAAA,EAAK,EAAE,IAAI,CAAA,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,IAAA;AAC9B,EAAA,IAAI,CAAA,CAAE,OAAA,EAAS,OAAO,CAAA,EAAG,KAAK,CAAA,QAAA,EAAM,SAAA,CAAU,MAAM,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAA;AACnE,EAAA,IAAI,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,KAAY,CAAA,CAAE,IAAA,EAAM,OAAO,CAAA,EAAG,KAAK,CAAA,QAAA,EAAM,SAAA,CAAU,CAAA,CAAE,OAAO,CAAC,CAAA,CAAA;AAChF,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,aAAA,CAAc;AAAA,EACrB,QAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA,EAAQ,CAAA;AAAA,EACR;AACF,CAAA,EAKG;AACD,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAY,EAAG,IAAI,QAAA,EAAS,EAAG,GAAA,CAAI,OAAA,EAAS,CAAA;AAExE,EAAA,MAAM,OAAA,GAAUgB,cAAQ,MAAM;AAC5B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,CAAC,GAAG,CAAC,CAAA,GAAI,SAAS,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAC7C,MAAA,IAAI,CAAA,IAAK,GAAG,OAAO,EAAE,MAAM,CAAA,EAAG,UAAA,EAAY,IAAI,CAAA,EAAE;AAAA,IAClD;AACA,IAAA,OAAO,EAAE,MAAM,GAAA,CAAI,WAAA,IAAe,UAAA,EAAY,GAAA,CAAI,UAAS,EAAE;AAAA,EAE/D,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAII,eAAS,OAAO,CAAA;AAIxC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAA2B,MAAM,CAAA;AACzD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,IAAIA,cAAAA,CAAS,OAAA,CAAQ,OAAO,CAAC,CAAA;AAE3D,EAAA,MAAM,YAAA,GAAe,IAAI,IAAA,CAAK,IAAA,CAAK,MAAM,IAAA,CAAK,UAAA,EAAY,CAAC,CAAA,CAAE,MAAA,EAAO;AACpE,EAAA,MAAM,WAAA,GAAc,IAAI,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,KAAK,UAAA,GAAa,CAAA,EAAG,CAAC,CAAA,CAAE,OAAA,EAAQ;AAExE,EAAA,MAAM,KAAA,GAA8B;AAAA,IAClC,GAAG,MAAM,IAAA,CAAK,EAAE,QAAQ,YAAA,EAAa,EAAG,MAAM,IAAI,CAAA;AAAA,IAClD,GAAG,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,WAAA,EAAY,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC;AAAA,GACxD;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAkB;AAC9B,IAAA,MAAM,IAAA,GAAO,KAAK,UAAA,GAAa,KAAA;AAC/B,IAAA,OAAA,CAAQ;AAAA,MACN,MAAM,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAO,EAAE,CAAA;AAAA,MACtC,UAAA,EAAA,CAAc,IAAA,GAAO,EAAA,GAAM,EAAA,IAAM;AAAA,KAClC,CAAA;AAAA,EACH,CAAA;AAKA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,YAAA,CAAa,IAAA,CAAK,OAAO,CAAC,CAAA;AAC1B,IAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,EACjB,CAAA;AACA,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAAiB;AACjC,IAAA,OAAA,CAAQ,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,MAAK,CAAE,CAAA;AAC/B,IAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,EAChB,CAAA;AACA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAA,EAAG,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,SAAA,GAAY,CAAC,CAAA;AAEhE,EAAA,uBACEhB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAO,IAAA,KAAS,MAAA,GAAS,IAAA,CAAK,EAAE,CAAA,GAAI,YAAA,CAAa,CAAC,CAAA,KAAM,CAAA,GAAI,EAAE,CAAA;AAAA,UACvE,SAAA,EAAU,4FAAA;AAAA,UACV,YAAA,EAAY,IAAA,KAAS,MAAA,GAAS,CAAA,CAAE,gBAAgB,CAAA,CAAE,YAAA;AAAA,UAElD,QAAA,kBAAAA,cAAAA,CAACoC,uBAAA,EAAA,EAAY,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,OAClC;AAAA,MACC,IAAA,KAAS,yBACRhC,eAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,SAAA;AAAA,UACT,SAAA,EAAU,iFAAA;AAAA,UACV,cAAY,CAAA,CAAE,QAAA;AAAA,UACd,eAAaF,0BAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,yBAAyB,CAAA;AAAA,UAE1E,QAAA,EAAA;AAAA,YAAA,CAAA,CAAE,MAAA,CAAO,KAAK,UAAU,CAAA;AAAA,YAAE,GAAA;AAAA,YAAE,IAAA,CAAK;AAAA;AAAA;AAAA,OACpC,mBAEAE,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,qBAAA,EACb,QAAA,EAAA;AAAA,QAAA,SAAA;AAAA,QAAU,UAAA;AAAA,QAAI,SAAA,GAAY;AAAA,OAAA,EAC7B,CAAA;AAAA,sBAEFJ,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAO,IAAA,KAAS,MAAA,GAAS,IAAA,CAAK,CAAC,CAAA,GAAI,YAAA,CAAa,CAAC,CAAA,KAAM,CAAA,GAAI,EAAE,CAAA;AAAA,UACtE,SAAA,EAAU,4FAAA;AAAA,UACV,YAAA,EAAY,IAAA,KAAS,MAAA,GAAS,CAAA,CAAE,YAAY,CAAA,CAAE,UAAA;AAAA,UAE9C,QAAA,kBAAAA,cAAAA,CAACqC,wBAAA,EAAA,EAAa,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA;AACnC,KAAA,EACF,CAAA;AAAA,IACC,SAAS,MAAA,mBACRjC,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0BAAA,EACZ,QAAA,EAAA;AAAA,MAAA,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,qBACfJ,cAAAA,CAAC,KAAA,EAAA,EAAY,SAAA,EAAU,4DAAA,EACpB,QAAA,EAAA,CAAA,EAAA,EADO,CAEV,CACD,CAAA;AAAA,MACA,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM;AACrB,QAAA,IAAI,GAAA,KAAQ,MAAM,uBAAOA,eAAC,KAAA,EAAA,EAAA,EAAS,CAAA,MAAA,EAAS,CAAC,CAAA,CAAI,CAAA;AACjD,QAAA,MAAM,MAAM,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,YAAY,GAAG,CAAA;AAClD,QAAA,MAAM,aAAa,GAAA,KAAQ,QAAA;AAC3B,QAAA,MAAM,UAAU,GAAA,KAAQ,QAAA;AACxB,QAAA,uBACEA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,QAAA,CAAS,GAAG,CAAA;AAAA,YAC3B,aAAA,EAAaE,0BAAA,CAAS,OAAA,EAAS,GAAA,GAAM,GAAG,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAA,kBAAA,EAAqB,GAAG,CAAA,CAAA,EAAI,CAAA;AAAA,YACjF,SAAA,EAAWC,KAAAA;AAAA,cACT,2EAAA;AAAA,cACA,UAAA,IAAc,qDAAA;AAAA,cACd,CAAC,cAAc,OAAA,IAAW;AAAA,aAC5B;AAAA,YAEC,QAAA,EAAA;AAAA,WAAA;AAAA,UAVI;AAAA,SAWP;AAAA,MAEJ,CAAC;AAAA,KAAA,EACH,CAAA,mBAEAH,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBACVA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,QAAA,CAAS,CAAC,CAAA;AAAA,QACzB,aAAA,EAAaE,0BAAA,CAAS,OAAA,EAAS,IAAA,GAAO,CAAC,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAA,mBAAA,EAAsB,CAAC,CAAA,CAAA,EAAI,CAAA;AAAA,QAC/E,SAAA,EAAWC,KAAAA;AAAA,UACT,2EAAA;AAAA,UACA,CAAA,KAAM,KAAK,IAAA,IAAQ;AAAA,SACrB;AAAA,QAEC,QAAA,EAAA;AAAA,OAAA;AAAA,MATI;AAAA,KAWR,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAaO,SAAS,cAAc,EAAE,KAAA,EAAO,UAAU,QAAA,EAAU,MAAA,EAAQ,SAAQ,EAAuB;AAChG,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,8BAAA,EAAgC,GAAG,MAAA,EAAO;AACzD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIiB,eAAS,KAAK,CAAA;AACtC,EAAA,MAAM,YAAYJ,aAAAA,CAAQ,MAAM,kBAAA,EAAmB,EAAG,EAAE,CAAA;AACxD,EAAA,MAAM,cAAA,GAAiB,GAAG,QAAQ,CAAA,iBAAA,CAAA;AAOlC,EAAA,MAAM,IAAA,GAAO,qBAAqB,KAAK,CAAA;AACvC,EAAA,MAAM,OAAA,GACJ,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,UAChB,kBAAA,CAAmB,KAAK,CAAA,GACxBX,4BAAA,CAAW,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,QAAA,EAAU,KAAK,QAAQ,CAAA;AAExD,EAAA,MAAM,UAAU,CAAC,OAAA,KACf,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,MAAM,OAAA,IAAW,OAAA,GAAU,KAAA,CAAM,OAAA,GAAU,IAAI,CAAA;AAK9F,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KACpB,QAAA,CAAS;AAAA,IACP,GAAG,KAAA;AAAA,IACH,IAAA;AAAA,IACA,QAAA,EAAU,IAAA,GAAO,KAAA,CAAM,QAAA,IAAY,gBAAe,GAAI,EAAA;AAAA,IACtD,OAAA,EAAS,IAAA,GAAO,KAAA,CAAM,OAAA,GAAU;AAAA,GACjC,CAAA;AAEH,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,KAClB,QAAA,CAAS;AAAA,IACP,GAAG,KAAA;AAAA,IACH,OAAA;AAAA,IACA,SAAS,OAAA,GAAU,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,OAAO,KAAA,CAAM;AAAA,GACxD,CAAA;AAEH,EAAA,uBACEL,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,kBAAAI,eAAAA,CAACoB,UAAAA,EAAA,EAAQ,IAAA,EAAY,YAAA,EAAc,OAAA,EACjC,QAAA,EAAA;AAAA,oBAAAxB,cAAAA,CAACyB,iBAAAA,EAAA,EAAe,OAAA,EAAO,MACrB,QAAA,kBAAArB,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAWD,KAAAA;AAAA,UACT,mNAAA;AAAA,UACA,CAAC,OAAA,IAAW;AAAA,SACd;AAAA,QACA,aAAA,EAAa,GAAG,QAAQ,CAAA,aAAA,CAAA;AAAA,QAExB,QAAA,EAAA;AAAA,0BAAAH,cAAAA,CAACM,wBAAAA,EAAA,EAAa,SAAA,EAAU,uCAAA,EAAwC,CAAA;AAAA,0BAChEN,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,UAAA,EAAY,QAAA,EAAA,OAAA,IAAW,EAAE,OAAA,EAAQ;AAAA;AAAA;AAAA,KACnD,EACF,CAAA;AAAA,oBACAI,eAAAA,CAACyB,iBAAAA,EAAA,EAAe,SAAA,EAAU,YAAA,EAAa,OAAM,OAAA,EAC3C,QAAA,EAAA;AAAA,sBAAA7B,cAAAA,CAAC,iBAAc,QAAA,EAAU,KAAA,CAAM,MAAM,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,CAAA,EAAG,OAAA,EAAkB,CAAA;AAAA,MAEpF,MAAM,IAAA,oBACLI,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sDAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EACf,QAAA,EAAA;AAAA,4BAAAJ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA6C,YAAE,SAAA,EAAU,CAAA;AAAA,4BACzEA,cAAAA;AAAA,cAACsC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,MAAA;AAAA,gBACL,OAAO,KAAA,CAAM,IAAA;AAAA,gBACb,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC5C,SAAA,EAAU,aAAA;AAAA,gBACV,aAAA,EAAa,GAAG,QAAQ,CAAA,KAAA;AAAA;AAAA;AAC1B,WAAA,EACF,CAAA;AAAA,0BACAlC,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EACf,QAAA,EAAA;AAAA,4BAAAJ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA6C,YAAE,OAAA,EAAQ,CAAA;AAAA,4BACvEA,cAAAA;AAAA,cAACsC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,MAAA;AAAA,gBACL,OAAO,KAAA,CAAM,OAAA;AAAA,gBACb,UAAU,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC1C,QAAA,EAAU,CAAC,KAAA,CAAM,IAAA;AAAA,gBACjB,KAAA,EAAO,KAAA,CAAM,IAAA,GAAO,MAAA,GAAY,CAAA,CAAE,aAAA;AAAA,gBAClC,SAAA,EAAU,aAAA;AAAA,gBACV,aAAA,EAAa,GAAG,QAAQ,CAAA,SAAA;AAAA;AAAA;AAC1B,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,QAEC,MAAM,IAAA,oBACLlC,eAAAA,CAAC,OAAA,EAAA,EAAM,WAAU,qBAAA,EACf,QAAA,EAAA;AAAA,0BAAAJ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA6C,YAAE,QAAA,EAAS,CAAA;AAAA,0BACxEA,cAAAA;AAAA,YAACsC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,cAAA;AAAA,cACN,OAAO,KAAA,CAAM,QAAA;AAAA,cACb,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,cAChE,aAAa,cAAA,EAAe;AAAA,cAC5B,SAAA,EAAU,aAAA;AAAA,cACV,aAAA,EAAa,GAAG,QAAQ,CAAA,SAAA;AAAA;AAAA,WAC1B;AAAA,0BACAtC,cAAAA,CAAC,UAAA,EAAA,EAAS,EAAA,EAAI,cAAA,EACX,oBAAU,GAAA,CAAI,CAAC,EAAA,qBACdA,eAAC,QAAA,EAAA,EAAgB,KAAA,EAAO,EAAA,EAAA,EAAX,EAAe,CAC7B,CAAA,EACH;AAAA,SAAA,EACF,CAAA;AAAA,wBAGFI,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EACf,QAAA,EAAA;AAAA,0BAAAJ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA6C,YAAE,OAAA,EAAQ,CAAA;AAAA,0BACvEA,cAAAA;AAAA,YAACsC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,MAAA;AAAA,cACL,OAAO,KAAA,CAAM,OAAA;AAAA,cACb,KAAK,KAAA,CAAM,IAAA;AAAA,cACX,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,cAC/D,SAAA,EAAU,aAAA;AAAA,cACV,aAAA,EAAa,GAAG,QAAQ,CAAA,SAAA;AAAA;AAAA;AAC1B,SAAA,EACF,CAAA;AAAA,wBAEAlC,eAAAA;AAAA,UAACmC,SAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,SAAA,EAAU,4DAAA;AAAA,YACV,OAAA,EAAS,MAAM,QAAA,CAAS,sBAAsB,CAAA;AAAA,YAC9C,aAAA,EAAa,GAAG,QAAQ,CAAA,WAAA,CAAA;AAAA,YAExB,QAAA,EAAA;AAAA,8BAAAvC,cAAAA,CAACwC,aAAA,EAAA,EAAE,SAAA,EAAU,eAAA,EAAgB,CAAA;AAAA,cAAE,GAAA;AAAA,cAAE,CAAA,CAAE;AAAA;AAAA;AAAA;AACrC,OAAA,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;ACxXO,IAAM,4BAAA,GAAmD;AAAA,EAC9D,OAAA,EAAS,uBAAA;AAAA,EACT,KAAA,EAAO;AACT;AAYO,SAAS,cAAc,EAAA,EAAoB;AAChD,EAAA,OAAO,EAAA,CACJ,OAAA,CAAQ,sBAAA,EAAwB,IAAI,EACpC,OAAA,CAAQ,uBAAA,EAAyB,EAAE,CAAA,CACnC,OAAA,CAAQ,wBAAA,EAA0B,IAAI,CAAA,CACtC,QAAQ,oBAAA,EAAsB,EAAE,CAAA,CAChC,OAAA,CAAQ,mBAAA,EAAqB,EAAE,CAAA,CAC/B,OAAA,CAAQ,UAAU,EAAE,CAAA,CACpB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,MAAA,EAAQ,GAAG,EACnB,IAAA,EAAK;AACV;AAGA,IAAM,UAAA,GAAa,+BAAA;AACnB,IAAM,gBAAA,GAAmB,oBAAA;AAEzB,IAAM,iBAAiB,CAAC,CAAA,KAAsB,CAAA,CAAE,OAAA,CAAQ,kBAAkB,EAAE,CAAA;AAMrE,SAAS,oBAAoB,IAAA,EAAyB;AAC3D,EAAA,MAAM,QAAqB,EAAC;AAC5B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,EAAG;AACzC,IAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,IAAS,CAAA;AACzB,IAAA,IAAI,KAAA,GAAQ,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,KAAK,KAAA,CAAM,IAAA,EAAM,KAAK,CAAC,CAAC,CAAA;AACpE,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,CAAA,CAAE,CAAC,CAAC,CAAA;AACjC,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,EAAE,CAAC,CAAA,CAAE,WAAA,EAAY,KAAM,wBAAQxC,cAAAA,CAAC,KAAA,EAAA,EAAiB,QAAA,EAAA,KAAA,EAAA,EAAR,KAAc,CAAA,mBAASA,cAAAA,CAAC,KAAA,EAAA,EAAiB,mBAAR,GAAA,EAAc;AAAA,KAC1F;AACA,IAAA,IAAA,GAAO,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA;AAAA,EACtB;AACA,EAAA,IAAI,IAAA,GAAO,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,eAAe,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAC,CAAA;AACnE,EAAA,OAAO,KAAA;AACT;AAiBO,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,4BAAA,EAA8B,GAAG,MAAA,EAAO;AACvD,EAAA,uBACEI,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,QAAA;AAAA,MACT,eAAaF,0BAAA,CAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,uBAAuB,CAAA;AAAA,MAC/D,gBAAc,SAAA,IAAa,MAAA;AAAA,MAC3B,SAAA,EAAWC,KAAAA;AAAA,QACT,+GAAA;AAAA,QACA,YACI,qDAAA,GACA,gDAAA;AAAA,QACJ;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAC,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sFAAA,EACb,QAAA,EAAA;AAAA,UAAA,KAAA,GAAQ,CAAA;AAAA,UAAE;AAAA,SAAA,EACb,CAAA;AAAA,QACC,QAAQ,IAAA,oBACPA,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,6FAAA,EAA8F,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,UACzG;AAAA,SAAA,EACL,CAAA;AAAA,wBAEFJ,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wEACb,QAAA,EAAA,OAAA,mBAAUI,eAAAA,CAAAuB,mBAAAA,EAAA,EAAE,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,UAAE,mBAAA,CAAoB,aAAA,CAAc,OAAO,CAAC,CAAA;AAAA,UAAE;AAAA,SAAA,EAAC,CAAA,GAAM,EAAE,OAAA,EACtE;AAAA;AAAA;AAAA,GACF;AAEJ;AAkBO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,4BAAA,EAA8B,GAAG,MAAA,EAAO;AACvD,EAAA,uBACEvB,eAAAA;AAAA,IAACyB,iBAAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAK,QAAA;AAAA,MACL,UAAA,EAAY,CAAA;AAAA,MACZ,gBAAA,EAAkB,EAAA;AAAA,MAClB,SAAA;AAAA,MACA,mBAAmB,SAAA,IAAa,MAAA;AAAA,MAChC,iBAAA,EAAmB,CAAC,CAAA,KAAM;AACxB,QAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,CAAO,aAAA,CAAc,MAAA;AACtC,QAAA,IACE,MAAA,EAAQ,OAAA;AAAA,UACN;AAAA,SACF,EACA;AACA,UAAA,CAAA,CAAE,cAAA,EAAe;AAAA,QACnB;AAAA,MACF,CAAA;AAAA,MAGA,SAAA,EAAU,qGAAA;AAAA,MACV,eAAa3B,0BAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,wBAAwB,CAAA;AAAA,MAC1E,WAAA,EAAU,oBAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uGAAA,EACb,QAAA,EAAA;AAAA,0BAAAJ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BACrEA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,cAAY,CAAA,CAAE,KAAA;AAAA,cACd,eAAaE,0BAAA,CAAS,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,sBAAsB,CAAA;AAAA,cACtE,OAAA,EAAS,OAAA;AAAA,cACT,SAAA,EAAU,gKAAA;AAAA,cAEV,QAAA,kBAAAF,cAAAA,CAACwC,aAAAA,EAAA,EAAE,WAAU,UAAA,EAAW;AAAA;AAAA;AAC1B,SAAA,EACF,CAAA;AAAA,wBACAxC,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,2GAAA;AAAA,YACV,eAAaE,0BAAA,CAAS,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,qBAAqB,CAAA;AAAA,YAEnE;AAAA;AAAA;AACH;AAAA;AAAA,GACF;AAEJ;ACpLO,IAAM,gCAAA,GAA0D;AAAA,EACrE,MAAA,EAAQ,sBAAA;AAAA,EACR,aAAA,EAAe;AACjB;AAuBO,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,gCAAA,EAAkC,GAAG,MAAA,EAAO;AAC3D,EAAA,uBACEE,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,qBAAA;AAAA,MACV,aAAA,EAAaF,0BAAA,CAAS,OAAA,EAAS,IAAA,GAAO,KAAK,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAA,aAAA,EAAgB,KAAK,CAAA,CAAA,EAAI,CAAA;AAAA,MACjF,gBAAc,SAAA,IAAa,MAAA;AAAA,MAC3B,WAAA,EAAU,mBAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACZ,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,0BACDJ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,0BACzBA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,QAAA;AAAA,cACT,cAAY,CAAA,CAAE,MAAA;AAAA,cACd,aAAA,EAAaE,0BAAA,CAAS,OAAA,EAAS,MAAA,GAAS,KAAK,CAAA,EAAG;AAAA,gBAC9C,MAAA,EAAQ,sBAAsB,KAAK,CAAA;AAAA,eACpC,CAAA;AAAA,cACD,SAAA,EAAU,0FAAA;AAAA,cAEV,QAAA,kBAAAF,cAAAA,CAACwC,aAAAA,EAAA,EAAE,WAAU,QAAA,EAAS;AAAA;AAAA;AACxB,SAAA,EACF,CAAA;AAAA,QACC,WAAA,GACC,2BAEAxC,cAAAA,CAAC,UAAK,SAAA,EAAU,oCAAA,EAAsC,YAAE,aAAA,EAAc;AAAA;AAAA;AAAA,GAE1E;AAEJ;AChDO,IAAM,gCAAA,GAA0D;AAAA,EACrE,KAAA,EAAO,OAAA;AAAA,EACP,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAU,UAAA;AAAA,EACV,WAAA,EAAa;AACf;AAEA,IAAM,aAAA,GAAgB,CAAC,CAAA,KAAiD;AAAA,EACtE,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,kBAAMA,cAAAA,CAACyC,kBAAA,EAAA,EAAO,SAAA,EAAU,UAAA,EAAW,CAAA,EAAI,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM;AAAA,EACxE,EAAE,KAAA,EAAO,UAAA,EAAY,IAAA,kBAAMzC,cAAAA,CAAC0C,yBAAA,EAAA,EAAc,SAAA,EAAU,UAAA,EAAW,CAAA,EAAI,KAAA,EAAO,CAAA,CAAE,QAAA,EAAS;AAAA,EACrF,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,kBAAM1C,cAAAA,CAAC2C,4BAAA,EAAA,EAAiB,SAAA,EAAU,UAAA,EAAW,CAAA,EAAI,KAAA,EAAO,CAAA,CAAE,QAAA,EAAS;AAAA;AAAA;AAAA,EAGrF,EAAE,KAAA,EAAO,cAAA,EAAgB,IAAA,kBAAM3C,cAAAA,CAAC4C,kBAAA,EAAA,EAAO,SAAA,EAAU,UAAA,EAAW,CAAA,EAAI,KAAA,EAAO,CAAA,CAAE,WAAA;AAC3E,CAAA;AAmBO,SAAS,eAAA,CAAgB;AAAA,EAC9B,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,MAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,EAAE,GAAG,gCAAA,EAAkC,GAAG,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC5F,GAAG,CAAA;AAAA,IACH,MAAA,EAAQ,OAAA,GAAU,CAAA,CAAE,KAAsB;AAAA,GAC5C,CAAE,CAAA;AACF,EAAA,uBACE5C,cAAAA;AAAA,IAAC6C,4BAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,KAAA,EAAO,QAAA;AAAA,MACP,QAAA,EAAU,CAAC,KAAA,KAAU,QAAA,CAAS,KAAsB,CAAA;AAAA,MACpD,cAAc3C,0BAAA,CAAS,YAAA,EAAc,EAAE,MAAA,EAAQ,gBAAgB,CAAA;AAAA,MAC/D,YAAY,CAAC,SAAA;AAAA,MACb,IAAA,EAAK;AAAA;AAAA,GACP;AAEJ;AChDO,IAAM,kCAAA,GAA8D;AAAA,EACzE,MAAA,EAAQ,QAAA;AAAA,EACR,WAAA,EAAa,cAAA;AAAA,EACb,OAAA,EAAS,SAAA;AAAA,EACT,WAAA,EAAa,EAAE,MAAA,EAAQ,QAAA;AACzB;AAeO,SAAS,iBAAA,CAAmC;AAAA,EACjD,UAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAkC;AAChC,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,kCAAA,EAAoC,GAAG,MAAA,EAAO;AAC7D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIkB,eAAS,KAAK,CAAA;AAEtC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,CAAC,CAAA;AAExC,EAAA,MAAM,OAAA,GAAUJ,cAAQ,MAAM;AAC5B,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,IAAA,MAAM,MAAM,UAAA,EAAW;AACvB,IAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,WAAA,EAAY,SAAU,EAAC;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAI,cAAA,EAAe;AACjC,IAAA,OAAO,KAAA,CACJ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,yBAAyB,CAAA,CACnD,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,YAAA,CAAa,CAAA,CAAE,KAAK,CAAA;AACpC,MAAA,MAAM,KAAA,GACH,GAAA,EAAK,UAAA,IAAc,GAAA,CAAI,UAAA,CAAW,IAAA,EAAK,IAAM,CAAA,CAAE,WAAA,CAAY,CAAA,CAAE,KAAK,CAAA,IAAK,CAAA,CAAE,KAAA;AAC5E,MAAA,OAAO,EAAE,OAAO,CAAA,CAAE,KAAA,EAAO,OAAO,OAAA,EAAS,CAAC,EAAE,IAAA,EAAK;AAAA,IACnD,CAAC,CAAA;AAAA,EAEL,GAAG,CAAC,IAAA,EAAM,SAAS,UAAA,EAAY,CAAA,CAAE,WAAW,CAAC,CAAA;AAE7C,EAAA,MAAM,eAAe,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AAEtD,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,EAAe,OAAA,KAAqB;AAClD,IAAA,MAAM,MAAM,UAAA,EAAW;AACvB,IAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,WAAA,EAAY,EAAG;AAG/B,IAAA,IAAI,OAAA,IAAW,gBAAgB,CAAA,EAAG;AAClC,IAAA,GAAA,CAAI,iBAAA,CAAkB,CAAC,KAAK,CAAA,EAAG,CAAC,OAAO,CAAA;AACvC,IAAA,UAAA,CAAW,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,EACzB,CAAA;AAKA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,MAAM,MAAM,UAAA,EAAW;AACvB,IAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,WAAA,EAAY,EAAG;AAC/B,IAAA,GAAA,CAAI,gBAAA,EAAiB;AACrB,IAAA,UAAA,CAAW,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,EACzB,CAAA;AAEA,EAAA,uBACEZ,eAAAA,CAACoB,UAAAA,EAAA,EAAQ,IAAA,EAAY,cAAc,OAAA,EACjC,QAAA,EAAA;AAAA,oBAAAxB,cAAAA,CAACyB,iBAAAA,EAAA,EAAe,OAAA,EAAO,MACrB,QAAA,kBAAArB,eAAAA;AAAA,MAACmC,SAAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAK,IAAA;AAAA,QACL,SAAA,EAAU,kFAAA;AAAA,QACV,eAAarC,0BAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,wBAAwB,CAAA;AAAA,QAE1E,QAAA,EAAA;AAAA,0BAAAF,cAAAA,CAAC8C,oBAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,UAC9B,CAAA,CAAE,MAAA;AAAA,0BACH9C,cAAAA,CAAC+C,uBAAA,EAAA,EAAY,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA;AAAA,KAClC,EACF,CAAA;AAAA,oBACA/C,eAAC6B,iBAAAA,EAAA,EAAe,WAAU,eAAA,EAAgB,KAAA,EAAM,KAAA,EAAM,IAAA,EAAK,QAAA,EAAS,UAAA,EAAY,GAC9E,QAAA,kBAAA7B,cAAAA,CAAC8B,UAAAA,EAAA,EAAQ,YAAA,EAAc,KAAA,EACrB,0BAAA1B,eAAAA,CAAC4B,cAAAA,EAAA,EAAY,SAAA,EAAU,eAAA,EACrB,QAAA,EAAA;AAAA,sBAAAhC,cAAAA,CAACkC,eAAAA,EAAA,EACC,QAAA,kBAAA9B,eAAAA;AAAA,QAAC+B,cAAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,cAAA;AAAA,UACV,SAAA,EAAU,8CAAA;AAAA,UACV,aAAA,EAAajC,0BAAA,CAAS,OAAA,EAAS,WAAA,EAAa;AAAA,YAC1C,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,UAED,QAAA,EAAA;AAAA,4BAAAF,cAAAA,CAACgD,qBAAA,EAAA,EAAU,SAAA,EAAU,eAAA,EAAgB,CAAA;AAAA,YACpC,CAAA,CAAE;AAAA;AAAA;AAAA,OACL,EACF,CAAA;AAAA,sBACAhD,eAACiD,mBAAA,EAAA,EAAiB,CAAA;AAAA,sBAClBjD,cAAAA,CAACkC,eAAAA,EAAA,EAAa,OAAA,EAAS,CAAA,CAAE,OAAA,EACtB,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,qBACZ9B,eAAAA;AAAA,QAAC+B,cAAAA;AAAA,QAAA;AAAA,UAEC,UAAU,MAAM,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,IAAI,OAAO,CAAA;AAAA,UAC7C,SAAA,EAAU,wBAAA;AAAA,UACV,eAAajC,0BAAA,CAAS,OAAA,EAAS,MAAA,GAAS,GAAA,CAAI,KAAK,CAAA,EAAG;AAAA,YAClD,MAAA,EAAQ,CAAA,oBAAA,EAAuB,GAAA,CAAI,KAAK,CAAA;AAAA,WACzC,CAAA;AAAA,UAED,QAAA,EAAA;AAAA,4BAAAF,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAWG,KAAAA;AAAA,kBACT,iFAAA;AAAA,kBACA,GAAA,CAAI,UACA,oCAAA,GACA;AAAA,iBACN;AAAA,gBAEA,QAAA,kBAAAH,cAAAA,CAAC4B,iBAAAA,EAAA,EAAM,WAAU,QAAA,EAAS;AAAA;AAAA,aAC5B;AAAA,YACC,GAAA,CAAI;AAAA;AAAA,SAAA;AAAA,QAjBA,GAAA,CAAI;AAAA,OAmBZ,CAAA,EACH;AAAA,KAAA,EACF,GACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACvJO,IAAM,4BAAA,GAAmD;AAAA,EAC9D,UAAA,EAAY;AACd;AA8BO,SAAS,aAAA,CAAyC;AAAA,EACvD,KAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,iBAAiB1B,0BAAA,CAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,kBAAkB,CAAA;AACpE,EAAA,MAAM,KAAA,GAAQc,aAAAA;AAAA,IACZ,MACE,KAAA,CACG,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA,CAC1B,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACX,IAAI,CAAA,CAAE,WAAA;AAAA,MACN,OAAO,CAAA,CAAE,IAAA;AAAA,MACT,OAAO,CAAA,CAAE,UAAA;AAAA,MACT,KAAK,CAAA,CAAE,QAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR,CAAE,CAAA;AAAA,IACN,CAAC,KAAK;AAAA,GACR;AAIA,EAAA,MAAM,OAAA,GAAUK,aAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,UAAUnB,0BAAA,CAAS,MAAA,IAAU,GAAG,MAAM,CAAA,OAAA,EAAU,UAAU,CAAA,CAAA,EAAI;AAAA,IAClE,MAAA,EAAQ,wBAAwB,UAAU,CAAA;AAAA,GAC3C,CAAA;AACD,EAAAoB,gBAAU,MAAM;AACd,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAA,CACG,gBAAA,CAAiB,oBAAoB,CAAA,CACrC,OAAA,CAAQ,CAAC,OAAO,EAAA,CAAG,SAAA,CAAU,MAAA,CAAO,mBAAmB,CAAC,CAAA;AAC3D,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,IAAA,CACG,gBAAA,CAAiB,CAAA,cAAA,EAAiB,OAAO,CAAA,EAAA,CAAI,CAAA,CAC7C,OAAA,CAAQ,CAAC,EAAA,KAAO,EAAA,CAAG,SAAA,CAAU,GAAA,CAAI,mBAAmB,CAAC,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,UAAA,EAAY,KAAA,EAAO,OAAO,CAAC,CAAA;AAE/B,EAAA,uBACEtB,eAAC,KAAA,EAAA,EAAI,GAAA,EAAK,SAAS,SAAA,EAAU,+BAAA,EAAgC,WAAA,EAAU,gBAAA,EACrE,QAAA,kBAAAA,cAAAA;AAAA,IAACkD,kCAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,MAAA,EAAQ,cAAA;AAAA,MAER,QAAA,EAAU,QAAA;AAAA,MACV,WAAA,EAAa,UAAA,GAAa,CAAC,UAAU,IAAI,EAAC;AAAA,MAC1C,QAAA,EAAU,CAAC,IAAA,KAAS,QAAA,GAAW,KAAK,IAAI,CAAA;AAAA,MACxC,kBAAA;AAAA,MACA;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;AAMO,SAAS,cAAA,CAAe;AAAA,EAC7B,MAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAkE;AAChE,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,4BAAA,EAA8B,GAAG,MAAA,EAAO;AACvD,EAAA,uBACElD,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2CAAA,EAA4C,WAAA,EAAU,eACnE,QAAA,kBAAAA,cAAAA;AAAA,IAACmD,+BAAA;AAAA,IAAA;AAAA,MACC,QAAQjD,0BAAA,CAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,SAAS,CAAA;AAAA,MAC5C,YAAA,EAAc,gBAAgB,CAAA,CAAE,UAAA;AAAA,MAC/B,GAAG;AAAA;AAAA,GACN,EACF,CAAA;AAEJ;ACtGO,IAAM,gCAAA,GAA0D;AAAA,EACrE,KAAA,EAAO,iCAAA;AAAA,EACP,KAAA,EACE,gKAAA;AAAA,EACF,SAAA,EAAW,mBAAA;AAAA,EACX,KAAA,EAAO;AAAA,IACL;AAAA,MACE,KAAA,EAAO,mBAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,IACA,EAAE,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,+DAAA,EAA2D;AAAA,IACvF,EAAE,KAAA,EAAO,aAAA,EAAe,IAAA,EAAM,sCAAA;AAAuC,GACvE;AAAA,EACA,QAAA,EAAU;AAAA,IACR,wCAAA;AAAA,IACA,0BAAA;AAAA,IACA,+CAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,OAAA,EAAS,qBAAA;AAAA,EACT,SAAA,EAAW,uBAAA;AAAA,EACX,KAAA,EAAO;AACT;AAEA,IAAM,UAAA,GAAa,CAACkD,yBAAA,EAAeC,iBAAA,EAAOC,qBAAS,CAAA;AAe5C,SAAS,eAAA,CAAgB,EAAE,YAAA,EAAc,MAAA,EAAQ,SAAQ,EAAyB;AACvF,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,gCAAA,EAAkC,GAAG,MAAA,EAAO;AAC3D,EAAA,uBACEtD,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,kDAAA;AAAA,MACV,eAAaE,0BAAA,CAAS,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,0BAA0B,CAAA;AAAA,MACzE,WAAA,EAAU,mBAAA;AAAA,MAEV,QAAA,kBAAAE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,wBAAAJ,cAAAA,CAAC,SAAI,SAAA,EAAU,mGAAA,EACb,0BAAAA,cAAAA,CAACuD,qBAAA,EAAA,EAAU,SAAA,EAAU,QAAA,EAAS,CAAA,EAChC,CAAA;AAAA,wBAEAvD,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4CAAA,EAA8C,YAAE,KAAA,EAAM,CAAA;AAAA,wBACpEA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EAAsC,YAAE,KAAA,EAAM,CAAA;AAAA,wBAE3DA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACZ,QAAA,EAAA,CAAA,CAAE,KAAA,CAAM,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,IAAA,IAAQ,CAAA,KAAM;AACnC,UAAA,MAAM,QAAA,GAAW,UAAA,CAAW,CAAA,GAAI,UAAA,CAAW,MAAM,CAAA;AACjD,UAAA,uBACEI,eAAAA,CAAC,KAAA,EAAA,EAAgB,SAAA,EAAU,uDAAA,EACzB,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EACb,QAAA,EAAA;AAAA,8BAAAJ,cAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAAA,cACzC;AAAA,aAAA,EACH,CAAA;AAAA,4BACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDAAmD,QAAA,EAAA,IAAA,EAAK;AAAA,WAAA,EAAA,EAL7D,KAMV,CAAA;AAAA,QAEJ,CAAC,CAAA,EACH,CAAA;AAAA,wBAEAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iDAAA,EAAmD,YAAE,SAAA,EAAU,CAAA;AAAA,wBAC5EA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACZ,YAAE,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,qBACfI,eAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,YAChC,SAAA,EAAU,sMAAA;AAAA,YACV,eAAaF,0BAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,sBAAsB,CAAA;AAAA,YAEvE,QAAA,EAAA;AAAA,cAAA,IAAA;AAAA,8BACDF,cAAAA,CAACwD,sBAAA,EAAA,EAAW,SAAA,EAAU,2EAAA,EAA4E;AAAA;AAAA,WAAA;AAAA,UAP7F;AAAA,SASR,CAAA,EACH;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;AAGO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAQ,gCAAA,CAAiC;AAC3C,CAAA,EAEG;AACD,EAAA,uBACEpD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EACb,QAAA,EAAA;AAAA,oBAAAJ,cAAAA,CAACyD,mBAAA,EAAA,EAAQ,SAAA,EAAU,0BAAA,EAA2B,CAAA;AAAA,IAAE,GAAA;AAAA,IAAE;AAAA,GAAA,EACpD,CAAA;AAEJ;AAGO,SAAS,cAAA,CAAe;AAAA,EAC7B,OAAA;AAAA,EACA,UAAU,gCAAA,CAAiC,SAAA;AAAA,EAC3C,aAAa,gCAAA,CAAiC;AAChD,CAAA,EAIG;AACD,EAAA,uBACErD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wEAAA,EACb,QAAA,EAAA;AAAA,oBAAAJ,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,oBACtDA,cAAAA,CAACuC,SAAAA,EAAA,EAAO,OAAA,EAAQ,WAAU,IAAA,EAAK,IAAA,EAAK,OAAA,EAAS,OAAA,EAC1C,QAAA,EAAA,UAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;ACzHO,IAAM,4BAAA,GAAmD;AAAA,EAC9D,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY,aAAA;AAAA,EACZ,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,WAAA;AAAA,EACV,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA,EAAS,UAAA;AAAA,EACT,MAAA,EAAQ;AACV;AAeO,IAAM,+BAAA,GAAwD;AAAA,EACnE,OAAA,EAAS,SAAA;AAAA,EACT,UAAA,EAAY,oBAAA;AAAA,EACZ,IAAA,EAAM;AACR;AAGO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACEnC,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAWD,MAAG,uBAAA,EAAyB,SAAS,CAAA,EAAG,WAAA,EAAU,gBAAA,EAChE,QAAA,EAAA;AAAA,oBAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAuC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAC7DA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAW,QAAA,EAAS;AAAA,GAAA,EACrC,CAAA;AAEJ;AAaO,SAAS,eAAe,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,YAAW,EAAwB;AAC1F,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,+BAAA,EAAiC,GAAG,MAAA,EAAO;AAC1D,EAAA,uBACEI,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAwB,aAAU,kBAAA,EAC/C,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6DAAA,EACb,QAAA,EAAA;AAAA,MAAA,CAAA,CAAE,OAAA;AAAA,sBACHA,gBAACsD,UAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA1D,cAAAA,CAAC2D,iBAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAA3D,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,cAAY,CAAA,CAAE,UAAA;AAAA,YACd,SAAA,EAAU,6CAAA;AAAA,YACV,eAAaE,0BAAA,CAAS,UAAA,EAAY,EAAE,MAAA,EAAQ,qBAAqB,CAAA;AAAA,YAEjE,QAAA,kBAAAF,cAAAA,CAAC4D,gBAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA,SAC7B,EACF,CAAA;AAAA,wBACA5D,cAAAA,CAAC6D,iBAAA,EAAA,EAAe,SAAA,EAAU,UAAA,EAAY,YAAE,IAAA,EAAK;AAAA,OAAA,EAC/C;AAAA,KAAA,EACF,CAAA;AAAA,oBACAzD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,MAAA;AAAA,sBACDJ,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAkB,QAAA,EAAA,MAAA,EAAO;AAAA,KAAA,EAC1C;AAAA,GAAA,EACF,CAAA;AAEJ;AAmCO,SAAS,YAAA,CAAa;AAAA,EAC3B,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA,EAAU,cAAA;AAAA,EACV;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,4BAAA,EAA8B,GAAG,cAAA,EAAe;AAC/D,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWG,KAAAA;AAAA,QACT,gFAAA;AAAA,QACA,SAAS,6BAAA,GAAgC;AAAA,OAC3C;AAAA,MACA,WAAA,EAAU,eAAA;AAAA,MAEV,QAAA,kBAAAH,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBACb,QAAA,kBAAAI,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,8EAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,cAAA,MAAA;AAAA,8BACDA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,gCAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACb,QAAA,EAAA;AAAA,kCAAAJ,cAAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,eAAaE,0BAAA,CAAS,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,4BAA4B,CAAA;AAAA,sBAC3E,SAAA,EAAU,sBAAA;AAAA,sBAET,QAAA,EAAA;AAAA;AAAA,mBACH;AAAA,kCACAE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,oCAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DAAA,EACZ,QAAA,EAAA;AAAA,sBAAA,YAAA;AAAA,sBACA,CAAA,CAAE;AAAA,qBAAA,EACL,CAAA;AAAA,oCACAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DAAA,EACZ,QAAA,EAAA;AAAA,sBAAA,cAAA;AAAA,sBACA,CAAA,CAAE;AAAA,qBAAA,EACL;AAAA,mBAAA,EACF;AAAA,iBAAA,EACF,CAAA;AAAA,gCACAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACb,QAAA,EAAA;AAAA,kCAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA;AAAA,oCAAAJ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAuC,YAAE,KAAA,EAAM,CAAA;AAAA,oBAC9D;AAAA,mBAAA,EACH,CAAA;AAAA,kCACAI,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4EAAA,EACZ,QAAA,EAAA;AAAA,oBAAA,SAAA,oBACCJ,cAAAA;AAAA,sBAACuC,SAAAA;AAAA,sBAAA;AAAA,wBACC,OAAA,EAAQ,OAAA;AAAA,wBACR,IAAA,EAAK,IAAA;AAAA,wBACL,SAAA,EAAU,mGAAA;AAAA,wBACV,OAAA,EAAS,QAAA;AAAA,wBACT,QAAA,EAAU,UAAA;AAAA,wBACV,aAAA,EAAarC,0BAAA,CAAS,OAAA,EAAS,MAAA,EAAQ;AAAA,0BACrC,MAAA,EAAQ;AAAA,yBACT,CAAA;AAAA,wBACD,cAAY,CAAA,CAAE,UAAA;AAAA,wBACd,OAAO,CAAA,CAAE,UAAA;AAAA,wBAER,QAAA,EAAA,UAAA,mBACCF,cAAAA,CAACyD,mBAAAA,EAAA,EAAQ,SAAA,EAAU,uBAAA,EAAwB,CAAA,mBAE3CzD,cAAAA,CAACe,kBAAAA,EAAA,EAAO,WAAU,UAAA,EAAW;AAAA;AAAA,qBAEjC;AAAA,oCAEFf,cAAAA;AAAA,sBAACuC,SAAAA;AAAA,sBAAA;AAAA,wBACC,OAAA,EAAQ,OAAA;AAAA,wBACR,IAAA,EAAK,IAAA;AAAA,wBACL,SAAA,EAAU,yBAAA;AAAA,wBACV,OAAA,EAAS,QAAA;AAAA,wBAER,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA,qBACL;AAAA,oCACAvC,cAAAA;AAAA,sBAACuC,SAAAA;AAAA,sBAAA;AAAA,wBACC,IAAA,EAAK,IAAA;AAAA,wBACL,SAAA,EAAU,yBAAA;AAAA,wBACV,UAAU,CAAC,OAAA;AAAA,wBACX,OAAA,EAAS,MAAA;AAAA,wBACT,eAAarC,0BAAA,CAAS,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,4BAA4B,CAAA;AAAA,wBAE1E,QAAA,EAAA,SAAA,GACG,WACE,CAAA,CAAE,MAAA,GACF,EAAE,QAAA,GACJ,QAAA,GACE,CAAA,CAAE,MAAA,GACF,CAAA,CAAE;AAAA;AAAA;AACV,mBAAA,EACF;AAAA,iBAAA,EACF;AAAA,eAAA,EACF;AAAA,aAAA,EACF,CAAA;AAAA,YACC,yBACCF,cAAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,0BAAA;AAAA,gBACV,eAAaE,0BAAA,CAAS,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,6BAA6B,CAAA;AAAA,gBAE5E,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,OAEJ,EACF;AAAA;AAAA,GACF;AAEJ;ACnOO,IAAM,6BAAA,GAAoD;AAAA,EAC/D,KAAA,EAAO,aAAA;AAAA,EACP,GAAA,EAAK,cAAA;AAAA,EACL,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EACE,8KAAA;AAAA,EACF,QAAQ,CAAC,MAAA,EAAQ,QAAQ,CAAA,CAAA,EAAI,MAAM,IAAI,GAAG,CAAA,OAAA,CAAA;AAAA,EAC1C,YAAA,EAAc,CAAC,CAAA,KAAM,CAAA,mBAAA,EAAsB,CAAC,CAAA,kCAAA,CAAA;AAAA,EAC5C,UAAA,EAAY,CAAC,CAAA,KAAM,CAAA,iBAAA,EAAoB,CAAC,CAAA,2CAAA,CAAA;AAAA,EACxC,YAAA,EAAc,CAAC,CAAA,KAAM,CAAA,mCAAA,EAAsC,CAAC,CAAA;AAC9D;AAmCO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA,GAAa,OAAA;AAAA,EACb,MAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,6BAAA,EAA+B,GAAG,MAAA,EAAO;AACxD,EAAA,MAAM,OAAO,KAAA,KAAU,CAAA;AACvB,EAAA,uBACEF,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EAAO,WAAA,EAAU,kBAC9B,QAAA,kBAAAA,cAAAA;AAAA,IAAC8D,8BAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA,EACE,yBACE9D,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAWG,KAAAA;AAAA,YACT,+BAAA;AAAA,YACA,MAAA,CAAO,SAAS,kBAAA,GAAqB;AAAA,WACvC;AAAA,UACA,OAAO,CAAA,CAAE,UAAA;AAAA,UACT,eAAaD,0BAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,0BAA0B,CAAA;AAAA,UAE1E,QAAA,EAAA,CAAA,CAAE,OAAO,MAAA,CAAO,MAAA,CAAO,gBAAe,EAAG,MAAA,CAAO,GAAA,CAAI,cAAA,EAAgB;AAAA;AAAA,OACvE,GACE,IAAA;AAAA,MAGL,QAAA,EAAA,CAAC,SAAA,qBACAE,eAAAA,CAAAuB,qBAAA,EACE,QAAA,EAAA;AAAA,wBAAA3B,cAAAA;AAAA,UAAC+D,oCAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,oBAAoBC,kBAAA,GAAS/D,eAAAA;AAAA,YACnC,KAAA,EAAO,iBAAA,GAAoB,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,GAAA;AAAA,YACvC,OAAA,EAAS,WAAA;AAAA,YACT,QAAA,EAAU,IAAA;AAAA,YACV,SAAA;AAAA,YACA,SAAA,EAAU,iFAAA;AAAA,YACV,OAAA,EAAS,oBAAoB,CAAA,CAAE,YAAA,CAAa,UAAU,CAAA,GAAI,CAAA,CAAE,WAAW,UAAU,CAAA;AAAA,YACjF,QAAQC,0BAAA,CAAS,OAAA,EAAS,KAAK,EAAE,MAAA,EAAQ,yBAAyB;AAAA;AAAA,SACpE;AAAA,wBACAF,cAAAA;AAAA,UAAC+D,oCAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAME,gBAAA;AAAA,YACN,OAAO,CAAA,CAAE,KAAA;AAAA,YACT,OAAA,EAAS,OAAA;AAAA,YACT,QAAA,EAAU,IAAA;AAAA,YACV,SAAA;AAAA,YACA,SAAA,EAAU,6EAAA;AAAA,YACV,OAAA,EAAS,CAAA,CAAE,YAAA,CAAa,UAAU,CAAA;AAAA,YAClC,QAAQ/D,0BAAA,CAAS,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,2BAA2B;AAAA;AAAA,SACxE;AAAA,wBACAE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0FAAA,EACZ,QAAA,EAAA;AAAA,UAAA,YAAA;AAAA,UACA,CAAC,6BAAaJ,cAAAA,CAAC,UAAK,SAAA,EAAU,+BAAA,EAAiC,YAAE,MAAA,EAAO;AAAA,SAAA,EAC3E,CAAA;AAAA,wBACAI,eAAAA,CAACI,eAAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAR,cAAAA,CAACS,sBAAAA,EAAA,EAAoB,OAAA,EAAO,MAC1B,QAAA,kBAAAL,eAAAA;AAAA,YAACmC,SAAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,SAAA;AAAA,cACR,IAAA,EAAK,IAAA;AAAA,cACL,SAAA,EAAU,sCAAA;AAAA,cACV,QAAA,EAAU,IAAA;AAAA,cACV,eAAarC,0BAAA,CAAS,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,0BAA0B,CAAA;AAAA,cAEzE,QAAA,EAAA;AAAA,gCAAAF,cAAAA,CAACkE,0BAAA,EAAA,EAAe,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,gBAClC,CAAC,6BAAalE,cAAAA,CAAC,UAAK,SAAA,EAAU,SAAA,EAAW,YAAE,IAAA,EAAK;AAAA;AAAA;AAAA,WACnD,EACF,CAAA;AAAA,0BACAI,eAAAA,CAACO,sBAAAA,EAAA,EAAoB,OAAM,KAAA,EACzB,QAAA,EAAA;AAAA,4BAAAP,eAAAA;AAAA,cAACQ,mBAAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,QAAA;AAAA,gBACT,QAAA,EAAU,IAAA;AAAA,gBACV,eAAaV,0BAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,uBAAuB,CAAA;AAAA,gBAExE,QAAA,EAAA;AAAA,kCAAAF,cAAAA,CAACmE,oBAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,kBACjC,CAAA,CAAE;AAAA;AAAA;AAAA,aACL;AAAA,4BACAnE,cAAAA,CAACc,wBAAAA,EAAA,EAAsB,CAAA;AAAA,4BACvBV,eAAAA;AAAA,cAACQ,mBAAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,QAAA;AAAA,gBACT,QAAA,EAAU,IAAA;AAAA,gBACV,SAAA,EAAU,mCAAA;AAAA,gBACV,eAAaV,0BAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,4BAA4B,CAAA;AAAA,gBAE7E,QAAA,EAAA;AAAA,kCAAAF,cAAAA,CAACe,kBAAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,kBAC/B,CAAA,CAAE;AAAA;AAAA;AAAA;AACL,WAAA,EACF;AAAA,SAAA,EACF;AAAA,OAAA,EACF;AAAA;AAAA,GAEJ,EACF,CAAA;AAEJ;ACjKO,IAAM,4BAAA,GAAmD;AAAA,EAC9D,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS;AACX;AAgDO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,kBAAA;AAAA,EACA,YAAA;AAAA,EACA,oBAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,cAAA,GAAiB,IAAA;AAAA,EACjB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,4BAAA,EAA8B,GAAG,MAAA,EAAO;AAGvD,EAAA,MAAM,SAAA,GAAYM,aAAuB,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAID,eAAS,KAAK,CAAA;AAG1D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC9C,EAAAE,gBAAU,MAAM;AACd,IAAA,MAAM,KAAK,SAAA,CAAU,OAAA;AACrB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,MAAM,IAAI,EAAA,CAAG,WAAA;AACb,MAAA,iBAAA,CAAkB,CAAC,IAAA,KAAU,IAAA,GAAO,CAAA,GAAI,GAAA,GAAM,IAAI,GAAI,CAAA;AAGtD,MAAA,MAAM,WAAW,MAAA,CAAO,UAAA,GAAa,mBAAmB,CAAA,EAAG,UAAU,GAAA,GAAM,GAAA;AAC3E,MAAA,WAAA,CAAY,CAAC,IAAA,KAAU,IAAA,GAAO,IAAI,QAAA,GAAW,EAAA,GAAK,IAAI,QAAS,CAAA;AAAA,IACjE,CAAA;AACA,IAAA,OAAA,EAAQ;AACR,IAAA,OAAOC,+BAAA,CAAc,IAAI,OAAO,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAc;AAAA,IAClB;AAAA,MACE,EAAA,EAAI,OAAA;AAAA;AAAA,MAEJ,2BAAWvB,cAAAA,CAACuD,qBAAAA,EAAA,EAAU,WAAU,UAAA,EAAW,CAAA;AAAA,MAC3C,KAAA,EAAO,EAAA;AAAA,MACP,KAAA;AAAA,MACA,cAAA,EAAgB,SAAA;AAAA,MAChB,gBAAA;AAAA,MACA,QAAQrD,0BAAA,CAAS,OAAA,EAAS,KAAK,EAAE,MAAA,EAAQ,aAAa,CAAA;AAAA,MACtD,YAAA,EAAc;AAAA;AAChB,GACF;AAIA,EAAA,MAAM,iCACJE,eAAAA,CAAC,SAAI,SAAA,EAAW,QAAA,GAAW,qCAAqC,2BAAA,EAC9D,QAAA,EAAA;AAAA,oBAAAJ,cAAAA;AAAA,MAACoE,6BAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,UAAA;AAAA,QACP,QAAA,EAAU,kBAAA;AAAA,QACV,MAAA,EAAQ,YAAA;AAAA,QACR,cAAA,EAAgB,oBAAA;AAAA,QAChB,MAAA,EAAQ,WAAA;AAAA,QACR,SAAA,EAAW,WAAW,gBAAA,GAAmB,MAAA;AAAA,QACzC,MAAA,EAAQ,YAAA;AAAA,QACR,OAAA,EAAS;AAAA;AAAA,KACX;AAAA,IACC,8BACChE,eAAAA;AAAA,MAACmC,SAAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAK,IAAA;AAAA,QACL,SAAA,EAAU,+CAAA;AAAA,QACV,OAAA,EAAS,UAAA;AAAA,QACT,eAAarC,0BAAA,CAAS,OAAA,EAAS,YAAY,EAAE,MAAA,EAAQ,qBAAqB,CAAA;AAAA,QAE1E,QAAA,EAAA;AAAA,0BAAAF,cAAAA,CAACqE,sBAAA,EAAA,EAAW,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,0BACjCrE,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,YAAE,IAAA,EAAK;AAAA;AAAA;AAAA;AACpC,GAAA,EAEJ,CAAA;AAGF,EAAA,uBACEI,gBAAC,KAAA,EAAA,EAAI,GAAA,EAAK,WAAW,SAAA,EAAU,iCAAA,EAAkC,aAAU,eAAA,EACzE,QAAA,EAAA;AAAA,oBAAAJ,cAAAA;AAAA,MAACsE,2BAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,WAAA,EAAY,OAAA;AAAA,QACZ,aAAa,MAAM;AAAA,QAAC,CAAA;AAAA,QACpB,eAAA,EAAiB,WAAW,IAAA,GAAO,cAAA;AAAA,QACnC,aAAA,EACE,WAAW,IAAA,mBACTtE,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,QAAA;AAAA,YACA,QAAA,EAAU,gBAAA;AAAA,YACV,SAAA,EAAW,cAAA;AAAA,YACX,MAAA,EAAQ,gBAAA;AAAA,YACR,YAAA,EAAc;AAAA;AAAA,SAChB,EACF,CAAA;AAAA,QAGJ,8BACEI,eAAAA;AAAA,UAACmC,SAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,SAAA;AAAA,YACT,eAAarC,0BAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,kBAAkB,CAAA;AAAA,YAEpE,QAAA,EAAA;AAAA,8BAAAF,cAAAA,CAACuE,gBAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAgB,CAAA;AAAA,cAC/B,CAAA,CAAE;AAAA;AAAA;AAAA;AACL;AAAA,KAEJ;AAAA,IACC,4BACCnE,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,0DAAA;AAAA,QACV,WAAA,EAAU,qBAAA;AAAA,QAET,QAAA,EAAA;AAAA,UAAA,cAAA;AAAA,0BACDJ,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBACb,QAAA,kBAAAA,cAAAA;AAAA,YAAC,eAAA;AAAA,YAAA;AAAA,cACC,QAAA;AAAA,cACA,QAAA,EAAU,gBAAA;AAAA,cACV,SAAA,EAAS,IAAA;AAAA,cACT,MAAA,EAAQ,gBAAA;AAAA,cACR,YAAA,EAAc;AAAA;AAAA,WAChB,EACF;AAAA;AAAA;AAAA,KACF;AAAA,IAED,kCACCI,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,gGAAA;AAAA,QACV,eAAaF,0BAAA,CAAS,OAAA,EAAS,WAAW,EAAE,MAAA,EAAQ,oBAAoB,CAAA;AAAA,QAExE,QAAA,EAAA;AAAA,0BAAAF,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,UAAA;AAAA,cACL,SAAA,EAAU,yCAAA;AAAA,cACV,eAAaE,0BAAA,CAAS,OAAA,EAAS,cAAc,EAAE,MAAA,EAAQ,wBAAwB,CAAA;AAAA,cAE9E,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,0BACAF,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,0BACxBA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAA8B,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA;AACrD,GAAA,EAEJ,CAAA;AAEJ;ACnNO,IAAM,8BAAA,GAAsD;AAAA,EACjE,MAAA,EAAQ,SAAA;AAAA;AAAA,EAER,WAAA,EAAa,6CAAA;AAAA,EACb,KAAA,EAAO,cAAA;AAAA,EACP,MAAA,EAAQ;AACV;AAcO,IAAM,iCAAA,GAA4D;AAAA,EACvE,IAAA,EAAM,MAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA,EACV,IAAA,EAAM;AACR;AAwBO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,8BAAA,EAAgC,GAAG,MAAA,EAAO;AACzD,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uCAAA,EAAwC,WAAA,EAAU,mBAC/D,QAAA,kBAAAI,eAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,QAAA,EAAS;AAAA,MACX,CAAA;AAAA,MACA,SAAA,EAAU,kDAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAJ,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,0BAAA;AAAA,YACR,SAAA,EAAU,gDAAA;AAAA,YAET,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA,SACL;AAAA,wBACAI,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yLAAA,EACb,QAAA,EAAA;AAAA,0BAAAJ,cAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAG,0BAAA;AAAA,cACH,IAAA,EAAM,CAAA;AAAA,cACN,KAAA,EAAO,KAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAC5B,gBAAA,CAAA,CAAE,MAAA,CAAO,MAAM,MAAA,GAAS,MAAA;AACxB,gBAAA,CAAA,CAAE,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,CAAE,OAAO,YAAY,CAAA,EAAA,CAAA;AAAA,cAClD,CAAA;AAAA,cACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,gBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AACpC,kBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,kBAAA,QAAA,EAAS;AAAA,gBACX;AAAA,cACF,CAAA;AAAA,cACA,WAAA,EAAa,eAAe,CAAA,CAAE,WAAA;AAAA,cAC9B,SAAA,EAAU,yJAAA;AAAA,cACV,eAAaE,0BAAA,CAAS,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,4BAA4B,CAAA;AAAA,cAC5E,SAAA,EAAS;AAAA;AAAA,WACX;AAAA,0BACAE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACZ,QAAA,EAAA;AAAA,YAAA,KAAA,oBACCJ,cAAAA;AAAA,cAACuC,SAAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAQ,OAAA;AAAA,gBACR,IAAA,EAAK,MAAA;AAAA,gBACL,SAAA,EAAU,2EAAA;AAAA,gBACV,OAAA,EAAS,OAAA;AAAA,gBACT,cAAY,CAAA,CAAE,KAAA;AAAA,gBACd,OAAO,CAAA,CAAE,KAAA;AAAA,gBACT,eAAarC,0BAAA,CAAS,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,4BAA4B,CAAA;AAAA,gBAE5E,QAAA,kBAAAF,cAAAA,CAACwC,aAAAA,EAAA,EAAE,WAAU,QAAA,EAAS;AAAA;AAAA,aACxB;AAAA,4BAEFxC,cAAAA;AAAA,cAACuC,SAAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,IAAA,EAAK,MAAA;AAAA,gBACL,QAAA,EAAU,CAAC,KAAA,CAAM,IAAA,EAAK,IAAK,WAAA;AAAA,gBAC3B,SAAA,EAAU,+BAAA;AAAA,gBACV,eAAarC,0BAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,6BAA6B,CAAA;AAAA,gBAC9E,OAAO,CAAA,CAAE,MAAA;AAAA,gBAER,QAAA,EAAA,WAAA,mBACCF,cAAAA,CAACyD,mBAAAA,EAAA,EAAQ,SAAA,EAAU,qBAAA,EAAsB,CAAA,mBAEzCzD,cAAAA,CAAC4C,kBAAAA,EAAA,EAAO,WAAU,QAAA,EAAS;AAAA;AAAA;AAE/B,WAAA,EACF;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;AAGO,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAU,MAAA,EAAO,EAA6C;AAC/F,EAAA,uBACE5C,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACb,QAAA,kBAAAA,cAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,gEAAA;AAAA,MACV,eAAaE,0BAAA,CAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,6BAA6B,CAAA;AAAA,MAEpE;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAGO,SAAS,iBAAA,CAAkB,EAAE,QAAA,EAAS,EAA4B;AACvE,EAAA,uBACEE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4EAAA,EACb,QAAA,EAAA;AAAA,oBAAAJ,cAAAA,CAACyD,mBAAAA,EAAA,EAAQ,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAAA,IAAE,GAAA;AAAA,IAAE;AAAA,GAAA,EAC/C,CAAA;AAEJ;AAGO,SAAS,mBAAA,CAAoB;AAAA,EAClC,QAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACEzD,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iDAAA;AAAA,MACV,eAAaE,0BAAA,CAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,4BAA4B,CAAA;AAAA,MAEnE;AAAA;AAAA,GACH;AAEJ;AA6BO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,EAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA,EAAU,cAAA;AAAA,EACV,OAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,iCAAA,EAAmC,GAAG,cAAA,EAAe;AACpE,EAAA,uBACEE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAyB,aAAU,iBAAA,EAChD,QAAA,EAAA;AAAA,oBAAAJ,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,yEAAA;AAAA,QACV,aAAA,EAAY,MAAA;AAAA,QAEX,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,oBACAA,cAAAA;AAAA,MAACwE,2BAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,gBAAA;AAAA,QACV,MAAA,EAAQtE,0BAAA,CAAS,OAAA,EAAS,GAAA,GAAM,EAAE,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAA,uBAAA,EAA0B,EAAE,CAAA,CAAA,EAAI,CAAA;AAAA,QAC/E,IAAA;AAAA,QACA,QAAA,EAAU,UAAA;AAAA,QACV,OAAA,EAAS,MAAA;AAAA,QACT,OAAA,EAAS,IAAA;AAAA,QACT,KAAA;AAAA,QACA,aAAA;AAAA,QACA,wBACEE,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,gFAAA;AAAA,YACV,aAAA,EAAaF,0BAAA,CAAS,OAAA,EAAS,MAAA,GAAS,EAAE,CAAA,EAAG;AAAA,cAC3C,MAAA,EAAQ,iCAAiC,EAAE,CAAA;AAAA,aAC5C,CAAA;AAAA,YAEA,QAAA,EAAA;AAAA,cAAA,QAAA,oBACCE,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EACd,QAAA,EAAA;AAAA,gCAAAJ,cAAAA,CAACC,eAAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,gBAAE,GAAA;AAAA,gBAAE,CAAA,CAAE;AAAA,eAAA,EAChC,CAAA;AAAA,cAED,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,qBACXG,eAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBAEC,SAAA,EAAU,0GAAA;AAAA,kBACV,OAAO,GAAA,CAAI,IAAA;AAAA,kBACX,KAAA,EAAO,EAAE,WAAA,EAAa,GAAA,CAAI,KAAA,EAAM;AAAA,kBAEhC,QAAA,EAAA;AAAA,oCAAAJ,cAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,SAAA,EAAU,4DAAA;AAAA,wBACV,KAAA,EAAO,EAAE,eAAA,EAAiB,GAAA,CAAI,KAAA,EAAM;AAAA,wBAEpC,0BAAAA,cAAAA,CAAC4B,iBAAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EAAsB,aAAa,CAAA,EAAG;AAAA;AAAA,qBACzD;AAAA,oCACA5B,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,cAAI,IAAA,EAAK;AAAA;AAAA,iBAAA;AAAA,gBAX9C,GAAA,CAAI;AAAA,eAaZ;AAAA;AAAA;AAAA,SACH;AAAA,QAEF,WAAA,kBACEI,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,uDAAA,EACb,QAAA,EAAA;AAAA,UAAA,UAAA,oBACCA,eAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,yDAAA;AAAA,cACV,aAAA,EAAaF,0BAAA,CAAS,OAAA,EAAS,QAAA,GAAW,EAAE,CAAA,EAAG;AAAA,gBAC7C,MAAA,EAAQ,mCAAmC,EAAE,CAAA;AAAA,eAC9C,CAAA;AAAA,cAED,QAAA,EAAA;AAAA,gCAAAF,cAAAA,CAACyE,wBAAA,EAAA,EAAa,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,gBAAE,GAAA;AAAA,gBAAE,CAAA,CAAE;AAAA;AAAA;AAAA,WACzC;AAAA,0BAEFrE,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,YAAA,CAAA,CAAE,IAAA;AAAA,YAAK,GAAA;AAAA,4BAACJ,cAAAA,CAAC0E,0BAAA,EAAA,EAAe,SAAA,EAAU,QAAA,EAAS;AAAA,WAAA,EAC9C;AAAA,SAAA,EACF;AAAA;AAAA;AAEJ,GAAA,EACF,CAAA;AAEJ","file":"index.cjs","sourcesContent":["/**\n * A fact's text is written in the rich markdown editor, which encodes\n * otherwise-insignificant whitespace as HTML character references so it survives\n * markdown's round-trip — a trailing space becomes ` `, a tab `	`, and\n * so on. The editor decodes them back when it re-renders, but anything that\n * shows the raw text (the grid cell, its tooltip) prints the reference verbatim,\n * so a fact reads like `This is a fact. ` instead of `This is a fact.`.\n *\n * {@link decodeWhitespaceEntities} turns those references back into the\n * characters they stand for. Only WHITESPACE code points are decoded, so the\n * result is safe both to store as markdown (an escaped `*` or `<` is never\n * turned back into active syntax) and to show as plain text.\n */\n\n// Horizontal whitespace the editor emits as an entity: space, tab, no-break\n// space. Newline/CR are deliberately left alone — decoding them could change a\n// stored fact's block structure.\nconst WHITESPACE_CODE_POINTS = new Set([0x20, 0x09, 0xa0])\n\nexport function decodeWhitespaceEntities(text: string | null | undefined): string {\n if (!text) return ''\n return text.replace(/&#x([0-9a-f]+);|&#(\\d+);/gi, (match, hex: string, dec: string) => {\n const code = hex ? parseInt(hex, 16) : parseInt(dec, 10)\n return WHITESPACE_CODE_POINTS.has(code) ? String.fromCodePoint(code) : match\n })\n}\n","/**\n * Column definitions for the Facts grid. Every column has an explicit `colId` (AG Grid persists\n * column state by id: see CLAUDE.md). The app supplies behaviour and app-specific cells through\n * slots; the structure, widths, sorting, filters and presentational cells live here.\n */\nimport type { CSSProperties, ReactNode } from 'react'\nimport type {\n ColDef,\n ICellRendererParams,\n IHeaderParams,\n ValueGetterParams,\n} from 'ag-grid-community'\nimport { CalendarDays, Pin, Quote } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { formatSpan } from '../timeline/span'\nimport { decodeWhitespaceEntities } from './fact-text'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactColumnLabels {\n pinnedHeaderTooltip: string\n pinnedTitle: string\n unpinnedTitle: string\n unpin: string\n pin: string\n fact: string\n dates: string\n dateTitle: string\n labels: string\n verified: string\n verifiedTooltip: string\n shared: string\n sharedTooltip: string\n createdBy: string\n sources: string\n /** Tooltip of the Sources cell for `count` cited documents. */\n sourcedFrom: (count: number) => string\n createdAt: string\n updated: string\n id: string\n}\n\nexport const DEFAULT_FACT_COLUMN_LABELS: FactColumnLabels = {\n pinnedHeaderTooltip: 'Pinned facts are given to the assistant every turn',\n pinnedTitle: 'Pinned — sent with every AI request. Click to unpin.',\n unpinnedTitle: 'Pin — send with every AI request',\n unpin: 'Unpin fact',\n pin: 'Pin fact',\n fact: 'Fact',\n dates: 'Dates',\n dateTitle: 'Date of the fact itself, not when this was saved',\n labels: 'Labels',\n verified: 'Verified',\n verifiedTooltip: 'Verified by a human',\n shared: 'Shared',\n sharedTooltip: 'Shared with the workspace, or private to you & your agents',\n createdBy: 'Created by',\n sources: 'Sources',\n sourcedFrom: (n) => `Sourced from ${n} document${n === 1 ? '' : 's'} — open the fact to see them`,\n createdAt: 'Created at',\n updated: 'Updated',\n id: 'ID',\n}\n\nexport interface FactColumnTestIds {\n pinned: (factId: string) => string\n text: (factId: string) => string\n date: (factId: string) => string\n}\n\n/** The fields of a fact the grid reads. Callers' richer types are accepted as-is. */\nexport interface FactRowView {\n external_id: string\n text: string\n pinned: boolean\n confirmed: boolean\n shared: boolean\n date_start?: string | null\n date_end?: string | null\n timezone?: string | null\n tags?: Array<{ name: string }> | null\n citations?: unknown[] | null\n created_by_ext_id?: string | null\n created_at?: string | null\n updated_at?: string | null\n}\n\nexport interface FactColumnSlots<T extends FactRowView> {\n onTogglePin: (fact: T) => void\n /** Custom header (persistent filter button) for the columns that use one. */\n renderHeader: (params: IHeaderParams, colId: string) => ReactNode\n /** Row action menu, shown at the right edge of the Fact cell. */\n renderRowActions: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** Inline label picker for the Labels cell. */\n renderLabels: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** The Verified switch. */\n renderVerified: (fact: T) => ReactNode\n /** The Shared switch. */\n renderShared: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** The creator avatar. */\n renderCreator: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** Sort/filter value for the Created by column (the creator's display name). */\n getCreatorName: (params: ValueGetterParams<T>) => string\n /** Friendly display of an ISO timestamp (Created at / Updated). */\n formatDate: (iso: string) => string\n labels?: Partial<FactColumnLabels>\n testIds?: Partial<FactColumnTestIds>\n}\n\n/**\n * Date-filter params for a column whose value is an ISO string. AG Grid hands the comparator a JS\n * `Date` from the picker and the raw cell value; this compares UTC day components so a filter\n * never shifts a date by a day for viewers west of UTC.\n */\nexport const ISO_DATE_FILTER_PARAMS = {\n browserDatePicker: true,\n comparator: (filterDate: Date, cellValue: unknown): number => {\n if (!cellValue || typeof cellValue !== 'string') return -1\n const cell = new Date(cellValue)\n if (Number.isNaN(cell.getTime())) return -1\n const cellDay = Date.UTC(cell.getUTCFullYear(), cell.getUTCMonth(), cell.getUTCDate())\n const filterDay = Date.UTC(\n filterDate.getFullYear(),\n filterDate.getMonth(),\n filterDate.getDate()\n )\n return cellDay < filterDay ? -1 : cellDay > filterDay ? 1 : 0\n },\n}\n\n/** How many source documents a fact cites (the Sources column counts documents, not passages). */\nexport function sourceDocCount(fact: Pick<FactRowView, 'citations'> | undefined): number {\n return fact?.citations?.length ?? 0\n}\n\n/** Default left-to-right order; default-hidden columns trail. Every colId must be listed. */\nexport const DEFAULT_FACT_COLUMN_ORDER = [\n 'pinned',\n 'text',\n 'sources',\n 'tags',\n 'date',\n 'confirmed',\n 'shared',\n 'created_by',\n 'created_at',\n 'updated_at',\n 'note_id',\n] as const\n\nexport function createFactColumns<T extends FactRowView>(slots: FactColumnSlots<T>): ColDef<T>[] {\n // AG Grid's `field` is a path type over the row; for a generic row we assert the known keys.\n const fieldOf = (name: keyof FactRowView) => name as ColDef<T>['field']\n const l = { ...DEFAULT_FACT_COLUMN_LABELS, ...slots.labels }\n const ids = slots.testIds\n\n const columns: ColDef<T>[] = [\n {\n colId: 'pinned',\n headerName: '',\n headerComponent: () => (\n <span className=\"flex size-full items-center justify-center\">\n <Pin className=\"size-3.5 text-muted-foreground\" />\n </span>\n ),\n field: fieldOf('pinned'),\n width: 44,\n minWidth: 44,\n maxWidth: 44,\n sortable: true,\n resizable: false,\n headerTooltip: l.pinnedHeaderTooltip,\n cellClass: 'cell-hcenter',\n // A toggle, not a readout: pinning is the row's most consequential switch (pinned facts\n // ride every AI request), so it flips in place.\n cellRenderer: (params: ICellRendererParams<T>) => {\n if (!params.data) return null\n const fact = params.data\n return (\n <button\n type=\"button\"\n onClick={() => slots.onTogglePin(fact)}\n title={fact.pinned ? l.pinnedTitle : l.unpinnedTitle}\n aria-label={fact.pinned ? l.unpin : l.pin}\n aria-pressed={fact.pinned}\n data-testid={testIdOr(ids?.pinned?.(fact.external_id), {\n testId: `facts-grid-pinned-${fact.external_id}`,\n })}\n className=\"flex h-full items-center\"\n >\n <Pin\n className={cn(\n 'size-3.5',\n fact.pinned\n ? 'fill-current text-yellow-text'\n : 'text-muted-foreground/30 transition-colors hover:text-muted-foreground'\n )}\n />\n </button>\n )\n },\n },\n {\n colId: 'text',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'text'),\n headerName: l.fact,\n field: fieldOf('text'),\n flex: 3,\n minWidth: 280,\n sortable: true,\n filter: 'agTextColumnFilter',\n // Decode the editor's whitespace entities (` ` for a trailing space) so the tooltip\n // reads as typed, not as raw markdown references.\n tooltipValueGetter: (p) => decodeWhitespaceEntities(p.data?.text),\n // Editable only via the grid api (Rename in the row's menu); clicks never open the editor\n // (suppressClickEdit on the grid).\n editable: true,\n cellEditor: 'agLargeTextCellEditor',\n cellEditorPopup: true,\n cellEditorParams: { rows: 8, cols: 60 },\n valueSetter: (params) => {\n if (!params.data) return false\n params.data.text = params.newValue\n return true\n },\n // NOT `cell-multiline`: this cell has its OWN clamp (the `.fact-clamp` span below, sized\n // from the row height). A second clamp cut the text in half at the minimum row height.\n cellClass: 'relative',\n cellRenderer: (params: ICellRendererParams<T>) => {\n if (!params.data) return null\n const fact = params.data\n // Clamp to however many WHOLE lines fit the row height (leading-snug ~ 20px/line),\n // top-aligned so the BEGINNING of the fact is always shown. No overflow clip here: the\n // wrapper is the cell's content box, shorter than a line at the density floor.\n const rowH = params.node.rowHeight ?? 52\n const clampLines = Math.max(1, Math.floor(rowH / 20))\n return (\n <div className=\"relative flex size-full items-start pr-6\">\n <span\n className=\"fact-clamp whitespace-normal break-words text-sm leading-snug text-foreground\"\n style={{ ['--fact-clamp-lines' as string]: clampLines } as CSSProperties}\n data-testid={testIdOr(ids?.text?.(fact.external_id), {\n testId: `facts-grid-text-${fact.external_id}`,\n })}\n >\n {decodeWhitespaceEntities(fact.text)}\n </span>\n {/* `facts-row-kebab` (app CSS) keeps the menu always visible: touch has no hover. */}\n <div className=\"facts-row-kebab absolute right-0.5 top-1/2 -translate-y-1/2\">\n {slots.renderRowActions(fact, params)}\n </div>\n </div>\n )\n },\n },\n {\n colId: 'date',\n // AG Grid's DEFAULT header, so the sort arrow and filter button are the native ones,\n // identical to the Files table's Date columns.\n headerName: l.dates,\n // Sort on the raw bound rather than the rendered string (\"Oct 2019\" sorts April first).\n field: fieldOf('date_start'),\n flex: 0.8,\n minWidth: 132,\n sortable: true,\n filter: 'agDateColumnFilter',\n filterParams: ISO_DATE_FILTER_PARAMS,\n // The edit value is the date-only slice: a lexical sort matches a chronological one, and\n // the inline editor shows \"2024-03-12\" rather than a full ISO timestamp. Inline typing\n // accepts YYYY, YYYY-MM or YYYY-MM-DD; clearing the cell undates the fact.\n editable: true,\n singleClickEdit: true,\n valueGetter: (params: ValueGetterParams<T>) =>\n params.data?.date_start ? params.data.date_start.slice(0, 10) : null,\n valueSetter: (params) => {\n if (!params.data) return false\n params.data.date_start = params.newValue\n return true\n },\n cellClass: 'relative cell-tnum',\n cellRenderer: (params: ICellRendererParams<T>) => {\n const when = formatSpan(\n params.data?.date_start,\n params.data?.date_end,\n params.data?.timezone\n )\n if (!when) return <span className=\"text-muted-foreground/50\">—</span>\n return (\n <span\n className=\"inline-flex items-center gap-1\"\n data-testid={testIdOr(ids?.date?.(params.data?.external_id ?? ''), {\n testId: `facts-grid-date-${params.data?.external_id}`,\n })}\n title={l.dateTitle}\n >\n <CalendarDays className=\"size-3 opacity-70\" />\n {when}\n </span>\n )\n },\n },\n {\n colId: 'tags',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'tags'),\n headerName: l.labels,\n flex: 0.9,\n // Never narrower than its own header, even with the filter button and sort indicator.\n minWidth: 160,\n sortable: true,\n filter: 'agTextColumnFilter',\n cellClass: 'overflow-visible',\n valueGetter: (params: ValueGetterParams<T>) =>\n (params.data?.tags ?? []).map((t) => t.name).join(', '),\n // Editable in place: toggling a label persists immediately, no dialog round-trip.\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? slots.renderLabels(params.data, params) : null,\n },\n {\n colId: 'confirmed',\n headerName: l.verified,\n headerTooltip: l.verifiedTooltip,\n field: fieldOf('confirmed'),\n // minWidth matches width so the header can't be clamped narrow enough to ellipsize.\n width: 116,\n minWidth: 116,\n sortable: true,\n cellDataType: 'boolean',\n valueGetter: (params) => params.data?.confirmed ?? false,\n cellClass: 'cell-hcenter',\n headerClass: 'header-hcenter',\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? (\n <div className=\"flex h-full items-center justify-center\">\n {slots.renderVerified(params.data)}\n </div>\n ) : null,\n },\n {\n colId: 'shared',\n headerName: l.shared,\n headerTooltip: l.sharedTooltip,\n field: fieldOf('shared'),\n // minWidth (not just width) is raised too: AG Grid clamps any persisted width up to it.\n width: 110,\n minWidth: 110,\n sortable: true,\n headerClass: 'header-hcenter',\n cellDataType: 'boolean',\n valueGetter: (params) => params.data?.shared ?? false,\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? (\n <div className=\"flex h-full items-center justify-center\">\n {slots.renderShared(params.data, params)}\n </div>\n ) : null,\n },\n {\n colId: 'created_by',\n headerName: l.createdBy,\n headerTooltip: l.createdBy,\n width: 138,\n minWidth: 138,\n sortable: true,\n valueGetter: (params) => slots.getCreatorName(params),\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? (\n <div className=\"flex h-full items-center justify-center\">\n {slots.renderCreator(params.data, params)}\n </div>\n ) : null,\n },\n {\n colId: 'sources',\n headerName: l.sources,\n width: 112,\n minWidth: 104,\n sortable: true,\n // A hand-written fact has no sources, which is information rather than a gap: it reads as\n // an em dash instead of a zero.\n valueGetter: (params) => sourceDocCount(params.data),\n cellRenderer: (params: ICellRendererParams<T>) => {\n const n = sourceDocCount(params.data)\n if (n === 0) return <span className=\"text-muted-foreground/40\">—</span>\n return (\n <span\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground\"\n title={l.sourcedFrom(n)}\n >\n <Quote className=\"size-3 opacity-70\" />\n {n}\n </span>\n )\n },\n },\n {\n colId: 'created_at',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'created_at'),\n headerName: l.createdAt,\n field: fieldOf('created_at'),\n width: 162,\n minWidth: 154,\n sortable: true,\n filter: 'agDateColumnFilter',\n filterParams: ISO_DATE_FILTER_PARAMS,\n // Display-only: a valueFormatter avoids mounting a React component per row.\n cellClass: 'text-muted-foreground',\n valueFormatter: (params) => (params.value ? slots.formatDate(params.value) : ''),\n },\n {\n colId: 'updated_at',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'updated_at'),\n headerName: l.updated,\n field: fieldOf('updated_at'),\n width: 140,\n minWidth: 140,\n // Hidden by default: a column-menu opt-in like the documents grid's long tail.\n hide: true,\n sortable: true,\n filter: 'agDateColumnFilter',\n filterParams: ISO_DATE_FILTER_PARAMS,\n valueFormatter: (params) => (params.value ? slots.formatDate(params.value) : ''),\n },\n {\n colId: 'note_id',\n headerName: l.id,\n field: fieldOf('external_id'),\n width: 120,\n minWidth: 100,\n sortable: true,\n filter: 'agTextColumnFilter',\n // Hidden by default like the documents ID column: needed when quoting a fact to support.\n hide: true,\n cellClass: 'font-mono text-xs text-muted-foreground',\n },\n ]\n\n // Persisted per-user column order still wins once set; bump the grid id to apply a new default.\n return DEFAULT_FACT_COLUMN_ORDER.map((id) => columns.find((c) => c.colId === id)).filter(\n (c): c is ColDef<T> => c !== undefined\n )\n}\n","/**\n * FactRowActions\n *\n * The ⋯ kebab menu for a Facts table row — mirroring the documents table's row\n * kebab. Carries Rename (inline-edit the fact text), Edit (the full dialog), and\n * Delete. Replaces the old inline edit-pencil affordance.\n */\nimport { MoreVertical, Pencil, Trash2 } from 'lucide-react'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactRowActionsLabels {\n actions: string\n edit: string\n /** Tooltip on a disabled Edit: rewording a fact is for its creator or a workspace owner. */\n editRestricted: string\n delete: string\n}\n\nexport const DEFAULT_FACT_ROW_ACTIONS_LABELS: FactRowActionsLabels = {\n actions: 'Fact actions',\n edit: 'Edit',\n editRestricted: 'Only the creator or a workspace owner can reword this fact',\n delete: 'Delete',\n}\n\nexport interface FactRowActionsTestIds {\n trigger: string\n edit: string\n delete: string\n}\n\nexport interface FactRowActionsProps {\n onEdit: () => void\n /** False when the viewer may not reword the fact: Edit is shown disabled, with the reason. */\n canEdit?: boolean\n onDelete: () => void\n labels?: Partial<FactRowActionsLabels>\n testIds?: Partial<FactRowActionsTestIds>\n}\n\nexport function FactRowActions({\n onEdit,\n canEdit = true,\n onDelete,\n labels,\n testIds,\n}: FactRowActionsProps) {\n const l = { ...DEFAULT_FACT_ROW_ACTIONS_LABELS, ...labels }\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n onClick={(e) => e.stopPropagation()}\n className=\"flex size-6 pointer-coarse:size-11 items-center justify-center rounded text-muted-foreground/70 transition-colors hover:bg-muted hover:text-foreground data-[state=open]:bg-muted data-[state=open]:text-foreground\"\n data-testid={testIdOr(testIds?.trigger, { testId: 'fact-row-actions' })}\n aria-label={l.actions}\n >\n <MoreVertical className=\"size-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" onClick={(e) => e.stopPropagation()}>\n <DropdownMenuItem\n onSelect={onEdit}\n disabled={!canEdit}\n title={canEdit ? undefined : l.editRestricted}\n data-testid={testIdOr(testIds?.edit, { testId: 'fact-action-edit' })}\n >\n <Pencil className=\"mr-2 size-4\" />\n {l.edit}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={onDelete}\n className=\"text-red-text focus:text-red-text\"\n data-testid={testIdOr(testIds?.delete, { testId: 'fact-action-delete' })}\n >\n <Trash2 className=\"mr-2 size-4\" />\n {l.delete}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","/**\n * FactsTable: the default facts grid. `createFactColumns` wired to `GridView` with ready-made\n * cells (pin, verified and shared switches, label chips, creator initials, row menu), so a host\n * only supplies rows and handlers. Hosts that need custom cells call `createFactColumns` with\n * their own slots and render `GridView` themselves.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport type { ColDef, ICellRendererParams } from 'ag-grid-community'\nimport { cn } from '@arbidocs/react/ui'\nimport { GridView, type GridViewProps } from '../files/GridView'\nimport { initials } from '../lib/format'\nimport { FactRowActions } from './FactRowActions'\nimport {\n DEFAULT_FACT_COLUMN_LABELS,\n createFactColumns,\n type FactColumnLabels,\n type FactRowView,\n} from './factColumns'\n\nexport interface FactsTableProps<T extends FactRowView> {\n facts: T[]\n onTogglePin: (fact: T) => void\n onToggleConfirmed: (fact: T) => void\n onToggleShared: (fact: T) => void\n /** The row menu appears when both `onEdit` and `onDelete` are provided. */\n onEdit?: (fact: T) => void\n onDelete?: (fact: T) => void\n /** Row click (opens the fact). */\n onOpen?: (fact: T) => void\n /** Display name of the fact's creator (sorting, filtering and the initials chip). */\n getCreatorName?: (fact: T) => string\n /** Friendly display of an ISO timestamp. Defaults to the locale date. */\n formatDate?: (iso: string) => string\n columnLabels?: Partial<FactColumnLabels>\n isLoading?: boolean\n /** Saved column state key (AG Grid persists by it). */\n gridId?: string\n height?: GridViewProps<T>['height']\n rowHeight?: number\n /** Escape hatch for any other `GridView` prop. */\n gridProps?: Partial<Omit<GridViewProps<T>, 'items' | 'columnDefs' | 'getItemId'>>\n testId?: string\n}\n\ninterface FactSwitchProps {\n checked: boolean\n label: string\n onToggle: () => void\n testId: string\n}\n\nfunction FactSwitch({ checked, label, onToggle, testId }: FactSwitchProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label}\n onClick={onToggle}\n data-testid={testId}\n className={cn(\n 'inline-flex h-5 w-9 items-center rounded-full p-0.5 transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n checked ? 'bg-green-solid' : 'bg-muted-foreground/30'\n )}\n >\n <span\n className={cn(\n 'size-4 rounded-full bg-background transition-transform',\n checked && 'translate-x-4'\n )}\n />\n </button>\n )\n}\n\nconst defaultFormatDate = (iso: string): string => {\n const d = new Date(iso)\n return Number.isNaN(d.getTime()) ? iso : d.toLocaleDateString()\n}\n\nconst EMPTY_STATE = { title: 'No facts yet' }\n\n/** The default facts table: columns, cells and the grid in one component. */\nexport function FactsTable<T extends FactRowView>({\n facts,\n onTogglePin,\n onToggleConfirmed,\n onToggleShared,\n onEdit,\n onDelete,\n onOpen,\n getCreatorName,\n formatDate = defaultFormatDate,\n columnLabels,\n isLoading,\n gridId = 'facts-table-v1',\n height = '100%',\n rowHeight = 52,\n gridProps,\n testId = 'facts-table',\n}: FactsTableProps<T>) {\n const l = { ...DEFAULT_FACT_COLUMN_LABELS, ...columnLabels }\n\n const columnDefs = useMemo<ColDef<T>[]>(\n () =>\n createFactColumns<T>({\n onTogglePin,\n renderHeader: (params) => (\n <span className=\"text-[12.5px] font-medium\">{params.displayName}</span>\n ),\n renderRowActions: (fact) =>\n onEdit && onDelete ? (\n <FactRowActions onEdit={() => onEdit(fact)} onDelete={() => onDelete(fact)} />\n ) : null,\n renderLabels: (fact): ReactNode => (\n <span className=\"flex flex-wrap items-center gap-1\">\n {(fact.tags ?? []).map((tag) => (\n <span\n key={tag.name}\n className=\"rounded-full bg-muted px-2 py-px text-xs text-muted-foreground\"\n >\n {tag.name}\n </span>\n ))}\n </span>\n ),\n renderVerified: (fact) => (\n <FactSwitch\n checked={fact.confirmed}\n label={l.verified}\n onToggle={() => onToggleConfirmed(fact)}\n testId={`facts-grid-confirmed-${fact.external_id}`}\n />\n ),\n renderShared: (fact) => (\n <FactSwitch\n checked={fact.shared}\n label={l.shared}\n onToggle={() => onToggleShared(fact)}\n testId={`facts-grid-shared-${fact.external_id}`}\n />\n ),\n renderCreator: (fact, _params: ICellRendererParams<T>) => {\n const name = getCreatorName?.(fact) ?? ''\n return name ? (\n <span\n title={name}\n className=\"inline-flex size-6 items-center justify-center rounded-full bg-muted text-[10px] font-medium text-muted-foreground\"\n >\n {initials(name)}\n </span>\n ) : null\n },\n getCreatorName: (params) => (params.data ? (getCreatorName?.(params.data) ?? '') : ''),\n formatDate,\n labels: columnLabels,\n }),\n [\n onTogglePin,\n onToggleConfirmed,\n onToggleShared,\n onEdit,\n onDelete,\n getCreatorName,\n formatDate,\n columnLabels,\n l.verified,\n l.shared,\n ]\n )\n\n return (\n <GridView<T>\n testId={testId}\n items={facts}\n columnDefs={columnDefs}\n getItemId={(fact) => fact.external_id}\n onRowClick={onOpen}\n isLoading={isLoading}\n emptyState={EMPTY_STATE}\n gridId={gridId}\n height={height}\n rowHeight={rowHeight}\n {...gridProps}\n gridOptions={{ suppressClickEdit: true, ...gridProps?.gridOptions }}\n />\n )\n}\n","import type { FactRowView } from './factColumns'\n\n/**\n * A fact as a host with plain records usually holds it: camelCase, optional flags, tags as\n * strings. `toFactRow` maps it to the `FactRowView` that `FactsTable` and `createFactColumns`\n * read, so a host without the SDK type needs no adapter of its own.\n */\nexport interface PlainFactRecord {\n id: string\n text: string\n pinned?: boolean\n confirmed?: boolean\n shared?: boolean\n /** ISO date (or date-time) the fact starts. */\n dateStart?: string | null\n dateEnd?: string | null\n timezone?: string | null\n tags?: Array<string | { name: string }> | null\n /** Passages that support the fact; only their count is shown. */\n citations?: unknown[] | null\n createdBy?: string | null\n createdAt?: string | null\n updatedAt?: string | null\n}\n\n/** The row plus the record it came from, so callbacks can hand the host its own object back. */\nexport type PlainFactRow<T extends PlainFactRecord> = FactRowView & { record: T }\n\n/** Map one plain record to a grid row. Missing flags are `false`, missing lists are empty. */\nexport function toFactRow<T extends PlainFactRecord>(record: T): PlainFactRow<T> {\n return {\n external_id: record.id,\n text: record.text,\n pinned: record.pinned ?? false,\n confirmed: record.confirmed ?? false,\n shared: record.shared ?? false,\n date_start: record.dateStart ?? null,\n date_end: record.dateEnd ?? null,\n timezone: record.timezone ?? null,\n tags: (record.tags ?? []).map((t) => (typeof t === 'string' ? { name: t } : t)),\n citations: record.citations ?? [],\n created_by_ext_id: record.createdBy ?? null,\n created_at: record.createdAt ?? null,\n updated_at: record.updatedAt ?? null,\n record,\n }\n}\n\nexport function toFactRows<T extends PlainFactRecord>(records: T[]): PlainFactRow<T>[] {\n return records.map(toFactRow)\n}\n","import { memo, useEffect, useMemo, useRef, useState } from 'react'\nimport { Check, PencilLine } from 'lucide-react'\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@arbidocs/react/ui'\nimport { observeResize } from '../lib/observe-resize'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactLabelsCellLabels {\n edit: string\n searchPlaceholder: string\n create: (name: string) => string\n empty: string\n}\n\nexport const DEFAULT_FACT_LABELS_CELL_LABELS: FactLabelsCellLabels = {\n edit: 'Edit labels',\n searchPlaceholder: 'Search or create...',\n create: (name) => `Create \\u201c${name}\\u201d`,\n empty: 'No labels yet',\n}\n\nexport interface FactLabelsCellTestIds {\n option: (labelId: string) => string\n}\n\n/** One selectable label: id, name and a colour (any CSS colour) that keys its chip. */\nexport interface FactLabelOption {\n id: string\n name: string\n color: string\n}\n\nexport interface FactLabelsCellProps {\n /** Every label that can be applied. */\n options: FactLabelOption[]\n /** The fact's full label id list (ids not in `options` are preserved on change). */\n selectedIds: string[]\n /** Persist the fact's full label id list. */\n onChange: (ids: string[]) => void\n /** Create a label and resolve with its id (undefined when creation failed). */\n onCreate: (name: string) => Promise<string | undefined>\n /** The grid row height; clamps the chips to the rows that fully fit. */\n rowHeight?: number\n labels?: Partial<FactLabelsCellLabels>\n testIds?: Partial<FactLabelsCellTestIds>\n}\n\n// Visible height reserved per chip row: a touch taller than a chip (~22px) so a row is never\n// clipped at the edges, but short enough that the gap hides the next row.\nconst CHIP_ROW_H = 24\nconst CHIP_GAP = 4\n\n/**\n * The Labels cell of the Facts table: applied labels as colour-keyed chips (an empty cell shows\n * a pencil), and a popover to toggle labels or create one with Enter.\n */\nexport const FactLabelsCell = memo(function FactLabelsCell({\n options,\n selectedIds,\n onChange,\n onCreate,\n rowHeight = 52,\n labels,\n testIds,\n}: FactLabelsCellProps) {\n const l = { ...DEFAULT_FACT_LABELS_CELL_LABELS, ...labels }\n const [open, setOpen] = useState(false)\n const [search, setSearch] = useState('')\n\n const applied = useMemo(\n () => new Set(selectedIds.filter((id) => options.some((o) => o.id === id))),\n [selectedIds, options]\n )\n\n const toggle = (option: FactLabelOption) =>\n onChange(\n applied.has(option.id)\n ? selectedIds.filter((id) => id !== option.id)\n : [...selectedIds, option.id]\n )\n\n const createAndApply = async (name: string) => {\n const trimmed = name.trim()\n if (!trimmed) return\n const existing = options.find((o) => o.name.toLowerCase() === trimmed.toLowerCase())\n if (existing) {\n if (!applied.has(existing.id)) onChange([...selectedIds, existing.id])\n setSearch('')\n return\n }\n const id = await onCreate(trimmed)\n if (id) onChange([...selectedIds, id])\n setSearch('')\n }\n\n const clampRows = Math.max(1, Math.floor((rowHeight + CHIP_GAP) / (CHIP_ROW_H + CHIP_GAP)))\n const appliedOptions = options.filter((o) => applied.has(o.id))\n\n // Show an ellipsis whenever chips are hidden below the clamp. A ResizeObserver re-measures on\n // any size change (column resize, row height, layout settling) so the indicator is reliable.\n const chipsRef = useRef<HTMLDivElement>(null)\n const [hasOverflow, setHasOverflow] = useState(false)\n useEffect(() => {\n const el = chipsRef.current\n if (!el) return\n const measure = () => setHasOverflow(el.scrollHeight > el.clientHeight + 1)\n measure()\n return observeResize(el, measure)\n }, [applied, clampRows, rowHeight, options])\n\n const searchMatchesExisting = options.some(\n (o) => o.name.toLowerCase() === search.trim().toLowerCase()\n )\n\n return (\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next)\n if (!next) setSearch('')\n }}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={l.edit}\n data-slot=\"fact-labels-cell\"\n className=\"group relative flex h-full w-full min-w-0 cursor-pointer items-center gap-1 pr-4 text-left hover:bg-muted\"\n >\n {appliedOptions.length === 0 ? (\n <span className=\"flex-1 text-muted-foreground opacity-50\">\n <PencilLine className=\"size-3.5\" />\n </span>\n ) : (\n <>\n <div\n ref={chipsRef}\n className=\"flex min-w-0 flex-1 flex-wrap content-start gap-1 overflow-hidden\"\n style={{ maxHeight: CHIP_ROW_H * clampRows + CHIP_GAP * (clampRows - 1) }}\n >\n {appliedOptions.map((o) => (\n <span\n key={o.id}\n className=\"inline-flex shrink-0 items-center gap-1 rounded border px-1.5 py-0.5 text-xs font-medium\"\n title={o.name}\n style={{ borderColor: o.color }}\n >\n <span\n className=\"flex size-3.5 shrink-0 items-center justify-center rounded\"\n style={{ backgroundColor: o.color }}\n >\n <Check className=\"size-2.5 text-white\" strokeWidth={3} />\n </span>\n <span className=\"max-w-[80px] truncate\">{o.name}</span>\n </span>\n ))}\n </div>\n {hasOverflow && (\n <span\n className=\"pointer-events-none absolute bottom-0.5 right-0.5 text-xs font-semibold leading-none text-muted-foreground\"\n aria-hidden\n >\n …\n </span>\n )}\n </>\n )}\n </button>\n </PopoverTrigger>\n {open && (\n <PopoverContent className=\"w-[360px] p-0\" align=\"start\" side=\"bottom\" sideOffset={4}>\n <Command shouldFilter={true}>\n <CommandInput\n placeholder={l.searchPlaceholder}\n value={search}\n onValueChange={setSearch}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && search.trim() && !searchMatchesExisting) {\n e.preventDefault()\n void createAndApply(search)\n }\n }}\n />\n <CommandList>\n <CommandEmpty>\n {search.trim() ? (\n <button\n type=\"button\"\n onClick={() => void createAndApply(search)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"w-full cursor-pointer rounded px-2 py-1.5 text-left text-sm text-primary hover:bg-accent pointer-coarse:min-h-11\"\n >\n {l.create(search.trim())}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">{l.empty}</span>\n )}\n </CommandEmpty>\n <CommandGroup>\n {options.map((o) => {\n const isApplied = applied.has(o.id)\n return (\n <CommandItem\n key={o.id}\n value={o.name}\n onSelect={() => toggle(o)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.option?.(o.id), {\n testId: `fact-label-select-${o.id}`,\n })}\n >\n <span\n className=\"mr-2 flex size-4 shrink-0 items-center justify-center rounded border-2\"\n style={\n isApplied\n ? { borderColor: o.color, backgroundColor: o.color }\n : { borderColor: o.color }\n }\n >\n {isApplied && <Check className=\"size-3 text-white\" strokeWidth={3} />}\n </span>\n <span className=\"flex-1 text-sm\">{o.name}</span>\n </CommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n )}\n </Popover>\n )\n})\n","/** The viewer's IANA timezone, or UTC when unavailable. */\nexport function detectTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC'\n } catch {\n return 'UTC'\n }\n}\n\n/** Every IANA timezone name the runtime knows, for a datalist. Empty on older engines. */\nexport function supportedTimezones(): string[] {\n try {\n const fn = (Intl as unknown as { supportedValuesOf?: (k: string) => string[] })\n .supportedValuesOf\n return fn ? fn('timeZone') : []\n } catch {\n return []\n }\n}\n","/**\n * A fact's date span, translated between the API's ISO instants and the\n * editable wall-clock fields FactDateInput renders. Kept apart from the\n * component so the conversions are plain functions with no React in them.\n */\nimport { detectTimezone } from './timezone'\n\nexport interface FactDateFields {\n /** `YYYY-MM-DD`. Empty means the fact has no date at all. */\n date: string\n /** `HH:MM`. Empty means `date` is a whole day, not an instant. */\n time: string\n /** IANA zone `time` is expressed in. Only meaningful (and only sent) when `time` is set. */\n timezone: string\n /** `YYYY-MM-DD` end of a range. Empty means a single day/instant, not a span. */\n endDate: string\n /** `HH:MM` paired with `endDate`, only offered once `time` is set. */\n endTime: string\n}\n\nexport const EMPTY_FACT_DATE_FIELDS: FactDateFields = {\n date: '',\n time: '',\n timezone: '',\n endDate: '',\n endTime: '',\n}\n\nfunction isMidnightUtc(d: Date): boolean {\n return d.getUTCHours() === 0 && d.getUTCMinutes() === 0 && d.getUTCSeconds() === 0\n}\n\nfunction isEndOfDayUtc(d: Date): boolean {\n return d.getUTCHours() === 23 && d.getUTCMinutes() === 59\n}\n\nfunction dayKeyUtc(d: Date): string {\n return d.toISOString().slice(0, 10)\n}\n\n/** A timezone name safe to hand to `Intl` — free-typed garbage falls back to UTC\n * rather than throwing and taking the whole date field down with it. */\nfunction safeTimeZone(tz: string): string {\n try {\n new Intl.DateTimeFormat('en-US', { timeZone: tz })\n return tz\n } catch {\n return 'UTC'\n }\n}\n\n/** Wall-clock parts (`YYYY-MM-DD`, `HH:MM`) an ISO instant reads as in `timeZone`. */\nfunction isoToZonedParts(iso: string, timeZone: string): { date: string; time: string } {\n const d = new Date(iso)\n const parts = Object.fromEntries(\n new Intl.DateTimeFormat('en-US', {\n timeZone: safeTimeZone(timeZone),\n hourCycle: 'h23',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n })\n .formatToParts(d)\n .map((p) => [p.type, p.value])\n )\n return {\n date: `${parts.year}-${parts.month}-${parts.day}`,\n time: `${parts.hour}:${parts.minute}`,\n }\n}\n\n/** The UTC instant a `YYYY-MM-DD` + `HH:MM` wall-clock pair means in `timeZone`,\n * found by reading a naive guess back through the zone and correcting for its\n * offset — no date library, at the cost of rare DST-boundary imprecision. */\nfunction zonedPartsToIso(date: string, time: string, timeZone: string): string {\n const tz = safeTimeZone(timeZone)\n const guess = new Date(`${date}T${time}:00Z`)\n const zoned = isoToZonedParts(guess.toISOString(), tz)\n const [y, m, dd] = zoned.date.split('-').map(Number)\n const [hh, mi] = zoned.time.split(':').map(Number)\n const asIfUtc = Date.UTC(y, m - 1, dd, hh, mi)\n const offsetMs = asIfUtc - guess.getTime()\n return new Date(guess.getTime() - offsetMs).toISOString()\n}\n\n/** Editable fields from a stored fact's date span — the inverse of `factDateFieldsToSpan`. */\nexport function factDateSpanToFields(\n dateStart: string | null | undefined,\n dateEnd: string | null | undefined,\n timezone: string | null | undefined\n): FactDateFields {\n if (!dateStart) return EMPTY_FACT_DATE_FIELDS\n const start = new Date(dateStart)\n if (Number.isNaN(start.getTime())) return EMPTY_FACT_DATE_FIELDS\n const end = dateEnd ? new Date(dateEnd) : start\n const dateOnly = isMidnightUtc(start) && (!dateEnd || isEndOfDayUtc(end))\n\n if (dateOnly) {\n const startKey = dayKeyUtc(start)\n const endKey = dateEnd ? dayKeyUtc(end) : startKey\n return { ...EMPTY_FACT_DATE_FIELDS, date: startKey, endDate: endKey !== startKey ? endKey : '' }\n }\n\n const tz = timezone || 'UTC'\n const startParts = isoToZonedParts(dateStart, tz)\n const isInstant = !dateEnd || dateStart === dateEnd\n const endParts = isInstant ? null : isoToZonedParts(dateEnd, tz)\n return {\n date: startParts.date,\n time: startParts.time,\n timezone: tz,\n endDate: endParts?.date ?? '',\n endTime: endParts?.time ?? '',\n }\n}\n\n/** A fact's date span for the API — the inverse of `factDateSpanToFields`. `null`s\n * clear the span entirely; a bare date (no time) stays timezone-agnostic. */\nexport function factDateFieldsToSpan(fields: FactDateFields): {\n date: string | null\n date_end: string | null\n timezone: string | null\n} {\n if (!fields.date) return { date: null, date_end: null, timezone: null }\n const tz = fields.timezone || detectTimezone()\n\n const startIso = fields.time\n ? zonedPartsToIso(fields.date, fields.time, tz)\n : `${fields.date}T00:00:00.000Z`\n\n let endIso: string\n if (fields.endDate) {\n endIso =\n fields.time && fields.endTime\n ? zonedPartsToIso(fields.endDate, fields.endTime, tz)\n : `${fields.endDate}T23:59:59.000Z`\n } else {\n endIso = fields.time ? startIso : `${fields.date}T23:59:59.000Z`\n }\n\n return { date: startIso, date_end: endIso, timezone: fields.time ? tz : null }\n}\n","/**\n * A fact's date, edited in a popover: a month calendar to pick the day, with\n * optional start time, end time and end date beneath it. Fully controlled —\n * the FactDateFields shape is unchanged, so fact-date.ts still converts to and\n * from the API's ISO span. A time silently brings the viewer's timezone with\n * it (editable), and an end time implies an end date (defaulting to the start\n * day) so a same-day interval round-trips through the span conversion.\n */\nimport { useMemo, useState } from 'react'\nimport { CalendarDays, ChevronLeft, ChevronRight, X } from 'lucide-react'\nimport { Button, Input, Popover, PopoverContent, PopoverTrigger, cn } from '@arbidocs/react/ui'\nimport { formatSpan } from '../timeline/span'\nimport { factDateFieldsToSpan, EMPTY_FACT_DATE_FIELDS, type FactDateFields } from './fact-date'\nimport { detectTimezone, supportedTimezones } from './timezone'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactDateInputLabels {\n weekdays: string[]\n months: string[]\n previousMonth: string\n earlierYears: string\n nextMonth: string\n laterYears: string\n pickYear: string\n addDate: string\n startTime: string\n endTime: string\n setStartFirst: string\n timezone: string\n endDate: string\n clearDate: string\n}\n\nexport const DEFAULT_FACT_DATE_INPUT_LABELS: FactDateInputLabels = {\n weekdays: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n months: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n previousMonth: 'Previous month',\n earlierYears: 'Earlier years',\n nextMonth: 'Next month',\n laterYears: 'Later years',\n pickYear: 'Pick a year',\n addDate: 'Add a date',\n startTime: 'Start time',\n endTime: 'End time',\n setStartFirst: 'Set a start time first',\n timezone: 'Timezone',\n endDate: 'End date (optional)',\n clearDate: 'Clear date',\n}\n\nexport interface FactDateInputTestIds {\n caption: string\n day: (dateKey: string) => string\n year: (year: number) => string\n}\n\n/** `YYYY-MM-DD` for a calendar cell — local parts, never toISOString (which\n * would shift the day for viewers west of UTC). */\nfunction dayKey(year: number, monthIndex: number, day: number): string {\n const m = String(monthIndex + 1).padStart(2, '0')\n const d = String(day).padStart(2, '0')\n return `${year}-${m}-${d}`\n}\n\n/** Pretty `YYYY-MM-DD` → \"Mar 12, 2024\" using UTC parts (no day shift). */\nfunction prettyDay(iso: string): string {\n const [y, m, d] = iso.split('-').map(Number)\n if (!y || !m || !d) return iso\n return new Date(Date.UTC(y, m - 1, d)).toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n timeZone: 'UTC',\n })\n}\n\n/** Trigger label when times are present — includes the Start time and, if set,\n * the End time (which formatSpan omits on a range). */\nfunction summarizeWithTimes(v: FactDateFields): string {\n const start = `${prettyDay(v.date)}, ${v.time}`\n const endDay = v.endDate || v.date\n if (v.endTime) return `${start} – ${prettyDay(endDay)}, ${v.endTime}`\n if (v.endDate && v.endDate !== v.date) return `${start} – ${prettyDay(v.endDate)}`\n return start\n}\n\n/** A month grid that reads and writes `YYYY-MM-DD` strings — no date library. */\nfunction MonthCalendar({\n selected,\n onSelect,\n labels: l,\n testIds,\n}: {\n selected: string\n onSelect: (dateKey: string) => void\n labels: FactDateInputLabels\n testIds?: Partial<FactDateInputTestIds>\n}) {\n const now = new Date()\n const todayKey = dayKey(now.getFullYear(), now.getMonth(), now.getDate())\n\n const initial = useMemo(() => {\n if (selected) {\n const [y, m] = selected.split('-').map(Number)\n if (y && m) return { year: y, monthIndex: m - 1 }\n }\n return { year: now.getFullYear(), monthIndex: now.getMonth() }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n const [view, setView] = useState(initial)\n // 'days' shows the month grid; 'years' shows a grid of years so a distant year\n // is one click away instead of dozens of month steps. yearStart is the first\n // year of the visible 12-year page.\n const [mode, setMode] = useState<'days' | 'years'>('days')\n const [yearStart, setYearStart] = useState(initial.year - 5)\n\n const firstWeekday = new Date(view.year, view.monthIndex, 1).getDay()\n const daysInMonth = new Date(view.year, view.monthIndex + 1, 0).getDate()\n\n const cells: Array<number | null> = [\n ...Array.from({ length: firstWeekday }, () => null),\n ...Array.from({ length: daysInMonth }, (_, i) => i + 1),\n ]\n\n const step = (delta: number) => {\n const next = view.monthIndex + delta\n setView({\n year: view.year + Math.floor(next / 12),\n monthIndex: ((next % 12) + 12) % 12,\n })\n }\n\n // The caption's chevrons page months in day view, and whole 12-year blocks in\n // year view. Clicking the caption opens the year grid; picking a year returns\n // to that year's month.\n const openYears = () => {\n setYearStart(view.year - 5)\n setMode('years')\n }\n const pickYear = (year: number) => {\n setView((v) => ({ ...v, year }))\n setMode('days')\n }\n const years = Array.from({ length: 12 }, (_, i) => yearStart + i)\n\n return (\n <div className=\"w-[248px]\">\n <div className=\"flex items-center justify-between px-1 pb-2\">\n <button\n type=\"button\"\n onClick={() => (mode === 'days' ? step(-1) : setYearStart((s) => s - 12))}\n className=\"rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground pointer-coarse:p-3\"\n aria-label={mode === 'days' ? l.previousMonth : l.earlierYears}\n >\n <ChevronLeft className=\"size-4\" />\n </button>\n {mode === 'days' ? (\n <button\n type=\"button\"\n onClick={openYears}\n className=\"rounded px-1.5 py-0.5 text-sm font-medium hover:bg-accent hover:text-foreground\"\n aria-label={l.pickYear}\n data-testid={testIdOr(testIds?.caption, { testId: 'fact-calendar-caption' })}\n >\n {l.months[view.monthIndex]} {view.year}\n </button>\n ) : (\n <span className=\"text-sm font-medium\">\n {yearStart} – {yearStart + 11}\n </span>\n )}\n <button\n type=\"button\"\n onClick={() => (mode === 'days' ? step(1) : setYearStart((s) => s + 12))}\n className=\"rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground pointer-coarse:p-3\"\n aria-label={mode === 'days' ? l.nextMonth : l.laterYears}\n >\n <ChevronRight className=\"size-4\" />\n </button>\n </div>\n {mode === 'days' ? (\n <div className=\"grid grid-cols-7 gap-0.5\">\n {l.weekdays.map((w) => (\n <div key={w} className=\"py-1 text-center text-xs font-medium text-muted-foreground\">\n {w}\n </div>\n ))}\n {cells.map((day, i) => {\n if (day === null) return <div key={`blank-${i}`} />\n const key = dayKey(view.year, view.monthIndex, day)\n const isSelected = key === selected\n const isToday = key === todayKey\n return (\n <button\n key={key}\n type=\"button\"\n onClick={() => onSelect(key)}\n data-testid={testIdOr(testIds?.day?.(key), { testId: `fact-calendar-day-${key}` })}\n className={cn(\n 'h-8 rounded text-xs transition-colors hover:bg-accent pointer-coarse:h-11',\n isSelected && 'bg-primary text-primary-foreground hover:bg-primary',\n !isSelected && isToday && 'ring-1 ring-inset ring-primary/50'\n )}\n >\n {day}\n </button>\n )\n })}\n </div>\n ) : (\n <div className=\"grid grid-cols-3 gap-1\">\n {years.map((y) => (\n <button\n key={y}\n type=\"button\"\n onClick={() => pickYear(y)}\n data-testid={testIdOr(testIds?.year?.(y), { testId: `fact-calendar-year-${y}` })}\n className={cn(\n 'h-9 rounded text-xs transition-colors hover:bg-accent pointer-coarse:h-11',\n y === view.year && 'bg-primary text-primary-foreground hover:bg-primary'\n )}\n >\n {y}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport interface FactDateInputProps {\n value: FactDateFields\n onChange: (next: FactDateFields) => void\n /** Prefix for data-testids: keeps composer vs. edit-row instances distinct. */\n idPrefix: string\n labels?: Partial<FactDateInputLabels>\n /** Overrides for the calendar's own ids (the field ids derive from `idPrefix`). */\n testIds?: Partial<FactDateInputTestIds>\n}\n\n/** A fact's date in a popover: month/year calendar plus optional times, timezone and end date. */\nexport function FactDateInput({ value, onChange, idPrefix, labels, testIds }: FactDateInputProps) {\n const l = { ...DEFAULT_FACT_DATE_INPUT_LABELS, ...labels }\n const [open, setOpen] = useState(false)\n const timezones = useMemo(() => supportedTimezones(), [])\n const timezoneListId = `${idPrefix}-timezone-options`\n\n // The trigger reads the same way a fact's date renders in the grid, so the\n // button label and the row agree — EXCEPT when explicit times are set:\n // formatSpan drops the clock time on a start/end-time range, so we build a\n // time-inclusive label ourselves in that case (formatSpan still handles the\n // day/month/year precisions nicely when there are no times).\n const span = factDateFieldsToSpan(value)\n const summary =\n value.time || value.endTime\n ? summarizeWithTimes(value)\n : formatSpan(span.date, span.date_end, span.timezone)\n\n const setDate = (dateKey: string) =>\n onChange({ ...value, date: dateKey, endDate: value.endDate && dateKey ? value.endDate : '' })\n\n // Setting a start time needs a timezone to be meaningful; setting an end time\n // needs an end date for the span conversion to keep it (defaults to the start\n // day, i.e. a same-day interval).\n const setStartTime = (time: string) =>\n onChange({\n ...value,\n time,\n timezone: time ? value.timezone || detectTimezone() : '',\n endTime: time ? value.endTime : '',\n })\n\n const setEndTime = (endTime: string) =>\n onChange({\n ...value,\n endTime,\n endDate: endTime ? value.endDate || value.date : value.endDate,\n })\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex h-9 w-full items-center gap-2 rounded-md border border-input bg-transparent px-3 text-sm transition-colors hover:bg-accent/50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n !summary && 'text-muted-foreground'\n )}\n data-testid={`${idPrefix}-date-trigger`}\n >\n <CalendarDays className=\"size-4 shrink-0 text-muted-foreground\" />\n <span className=\"truncate\">{summary || l.addDate}</span>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-3\" align=\"start\">\n <MonthCalendar selected={value.date} onSelect={setDate} labels={l} testIds={testIds} />\n\n {value.date && (\n <div className=\"mt-3 flex flex-col gap-2 border-t border-border pt-3\">\n <div className=\"grid grid-cols-2 gap-2\">\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-muted-foreground\">{l.startTime}</span>\n <Input\n type=\"time\"\n value={value.time}\n onChange={(e) => setStartTime(e.target.value)}\n className=\"h-8 text-xs\"\n data-testid={`${idPrefix}-time`}\n />\n </label>\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-muted-foreground\">{l.endTime}</span>\n <Input\n type=\"time\"\n value={value.endTime}\n onChange={(e) => setEndTime(e.target.value)}\n disabled={!value.time}\n title={value.time ? undefined : l.setStartFirst}\n className=\"h-8 text-xs\"\n data-testid={`${idPrefix}-end-time`}\n />\n </label>\n </div>\n\n {value.time && (\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-muted-foreground\">{l.timezone}</span>\n <Input\n list={timezoneListId}\n value={value.timezone}\n onChange={(e) => onChange({ ...value, timezone: e.target.value })}\n placeholder={detectTimezone()}\n className=\"h-8 text-xs\"\n data-testid={`${idPrefix}-timezone`}\n />\n <datalist id={timezoneListId}>\n {timezones.map((tz) => (\n <option key={tz} value={tz} />\n ))}\n </datalist>\n </label>\n )}\n\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-muted-foreground\">{l.endDate}</span>\n <Input\n type=\"date\"\n value={value.endDate}\n min={value.date}\n onChange={(e) => onChange({ ...value, endDate: e.target.value })}\n className=\"h-8 text-xs\"\n data-testid={`${idPrefix}-end-date`}\n />\n </label>\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 self-start text-muted-foreground hover:text-foreground\"\n onClick={() => onChange(EMPTY_FACT_DATE_FIELDS)}\n data-testid={`${idPrefix}-clear-date`}\n >\n <X className=\"mr-1 size-3.5\" /> {l.clearDate}\n </Button>\n </div>\n )}\n </PopoverContent>\n </Popover>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { X } from 'lucide-react'\nimport { PopoverContent, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactPassagesLabels {\n loading: string\n close: string\n}\n\nexport const DEFAULT_FACT_PASSAGES_LABELS: FactPassagesLabels = {\n loading: 'Loading passage…',\n close: 'Close',\n}\n\nexport interface FactSourcesPanelTestIds {\n popover: string\n close: string\n list: string\n}\n\n/**\n * Flatten a passage's markdown to one readable line for a list preview: headings, bullets,\n * emphasis, links and table pipes only add noise on a single truncated line.\n */\nexport function toPreviewLine(md: string): string {\n return md\n .replace(/`{1,3}([^`]*)`{1,3}/g, '$1') // inline / fenced code -> its content\n .replace(/!\\[[^\\]]*\\]\\([^)]*\\)/g, '') // images out\n .replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1') // links -> their text\n .replace(/^[>\\s]*#{1,6}\\s*/gm, '') // heading markers\n .replace(/^[>\\s]*[-*+]\\s+/gm, '') // list bullets\n .replace(/[*_~]/g, '') // emphasis marks\n .replace(/\\|/g, ' ') // table pipes\n .replace(/\\s+/g, ' ') // collapse whitespace/newlines\n .trim()\n}\n\n/** Inline `<sup>`/`<sub>` (footnote markers) kept by the flatten above, plus stray tag fragments. */\nconst SUP_SUB_RE = /<(sup|sub)>([\\s\\S]*?)<\\/\\1>/gi\nconst STRAY_SUP_SUB_RE = /<\\/?(?:sup|sub)>/gi\n\nconst stripStrayTags = (s: string): string => s.replace(STRAY_SUP_SUB_RE, '')\n\n/**\n * Render a flattened preview line with real super/subscripts: `<sup>15</sup>` shows as a\n * superscript 15, not literal tag text. Unpaired tag fragments are dropped.\n */\nexport function renderPreviewInline(line: string): ReactNode {\n const nodes: ReactNode[] = []\n let last = 0\n let key = 0\n for (const m of line.matchAll(SUP_SUB_RE)) {\n const start = m.index ?? 0\n if (start > last) nodes.push(stripStrayTags(line.slice(last, start)))\n const inner = stripStrayTags(m[2])\n nodes.push(\n m[1].toLowerCase() === 'sup' ? <sup key={key++}>{inner}</sup> : <sub key={key++}>{inner}</sub>\n )\n last = start + m[0].length\n }\n if (last < line.length) nodes.push(stripStrayTags(line.slice(last)))\n return nodes\n}\n\nexport interface FactPassageItemProps {\n /** Zero-based position in the list (shown as `n.`). */\n index: number\n page?: number | null\n /** The passage excerpt (markdown), or null/undefined while it loads. */\n excerpt?: string | null\n /** This passage is the one open in the viewer. */\n isViewing?: boolean\n onSelect: () => void\n testId?: string\n className?: string\n labels?: Partial<FactPassagesLabels>\n}\n\n/** One cited passage: index badge, page pill and a single quoted line. */\nexport function FactPassageItem({\n index,\n page,\n excerpt,\n isViewing,\n onSelect,\n testId,\n className,\n labels,\n}: FactPassageItemProps) {\n const l = { ...DEFAULT_FACT_PASSAGES_LABELS, ...labels }\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n data-testid={testIdOr(testId, { testId: 'fact-source-passage' })}\n aria-current={isViewing || undefined}\n className={cn(\n 'flex w-full items-start gap-2 rounded px-2 py-1.5 text-left text-xs transition-colors pointer-coarse:min-h-11',\n isViewing\n ? 'bg-ai-soft text-foreground ring-1 ring-ai-accent/40'\n : 'bg-ai-soft/60 text-foreground hover:bg-ai-soft',\n className\n )}\n >\n <span className=\"mt-0.5 shrink-0 rounded bg-muted px-1 py-0.5 font-mono text-xs text-muted-foreground\">\n {index + 1}.\n </span>\n {page != null && (\n <span className=\"mt-0.5 shrink-0 rounded-full bg-muted px-1.5 py-0.5 font-mono text-xs text-muted-foreground\">\n p.{page}\n </span>\n )}\n <span className=\"block min-w-0 flex-1 overflow-hidden text-ellipsis whitespace-nowrap\">\n {excerpt ? <>“{renderPreviewInline(toPreviewLine(excerpt))}”</> : l.loading}\n </span>\n </button>\n )\n}\n\nexport interface FactSourcesPanelProps {\n /** Header caption, e.g. \"Sources (2 documents)\". */\n title: string\n onClose: () => void\n /** The fact section the panel is portalled INTO and fenced WITHIN. */\n container?: HTMLElement | null\n children: ReactNode\n labels?: Partial<FactPassagesLabels>\n testIds?: Partial<FactSourcesPanelTestIds>\n}\n\n/**\n * Popover panel shell for a fact's sources: sticky header with a close control and a scrolling\n * list. Must sit inside a `Popover`. Stays open while the user works in the document viewer\n * (clicks inside the viewer, dialogs or other popper layers do not dismiss it).\n */\nexport function FactSourcesPanel({\n title,\n onClose,\n container,\n children,\n labels,\n testIds,\n}: FactSourcesPanelProps) {\n const l = { ...DEFAULT_FACT_PASSAGES_LABELS, ...labels }\n return (\n <PopoverContent\n align=\"start\"\n side=\"bottom\"\n sideOffset={4}\n collisionPadding={16}\n container={container}\n collisionBoundary={container ?? undefined}\n onInteractOutside={(e) => {\n const target = e.detail.originalEvent.target as Element | null\n if (\n target?.closest(\n '[data-testid=\"parsed-viewer\"], [role=\"dialog\"], [data-radix-popper-content-wrapper]'\n )\n ) {\n e.preventDefault()\n }\n }}\n // No exit animation: removing the last source unmounts the anchor in the same click, and an\n // animating popover would linger anchorless at the page's top-left.\n className=\"w-[34rem] max-w-[var(--radix-popover-content-available-width)] p-0 data-[state=closed]:animate-none\"\n data-testid={testIdOr(testIds?.popover, { testId: 'fact-sources-popover' })}\n data-slot=\"fact-sources-panel\"\n >\n <div className=\"sticky top-0 z-10 flex items-center justify-between gap-2 border-b border-border bg-popover px-3 py-2\">\n <span className=\"text-xs font-semibold text-muted-foreground\">{title}</span>\n <button\n type=\"button\"\n aria-label={l.close}\n data-testid={testIdOr(testIds?.close, { testId: 'fact-sources-close' })}\n onClick={onClose}\n className=\"-m-1.5 flex shrink-0 items-center justify-center rounded p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground pointer-coarse:p-3\"\n >\n <X className=\"size-3.5\" />\n </button>\n </div>\n <div\n className=\"flex max-h-[min(60vh,var(--radix-popover-content-available-height))] flex-col gap-2 overflow-y-auto p-1.5\"\n data-testid={testIdOr(testIds?.list, { testId: 'fact-sources-list' })}\n >\n {children}\n </div>\n </PopoverContent>\n )\n}\n","import type { ReactNode } from 'react'\nimport { X } from 'lucide-react'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactSourceGroupLabels {\n remove: string\n wholeDocument: string\n}\n\nexport const DEFAULT_FACT_SOURCE_GROUP_LABELS: FactSourceGroupLabels = {\n remove: 'Remove this document',\n wholeDocument: 'Whole document — open it to cite specific passages',\n}\n\nexport interface FactSourceGroupTestIds {\n root: (docId: string) => string\n remove: (docId: string) => string\n}\n\nexport interface FactSourceGroupProps {\n docId: string\n /** The document label/pill (the app supplies its entity pill). */\n document: ReactNode\n /** True when this document is the one on display in the viewer. */\n isViewing?: boolean\n onRemove: () => void\n /** The FactPassageItem children; when absent a \"whole document\" hint shows. */\n children?: ReactNode\n /** Whether any passages are cited from this document. */\n hasPassages: boolean\n labels?: Partial<FactSourceGroupLabels>\n testIds?: Partial<FactSourceGroupTestIds>\n}\n\n/** One cited document in the sources list: its label, a remove control and its passages. */\nexport function FactSourceGroup({\n docId,\n document,\n isViewing,\n onRemove,\n children,\n hasPassages,\n labels,\n testIds,\n}: FactSourceGroupProps) {\n const l = { ...DEFAULT_FACT_SOURCE_GROUP_LABELS, ...labels }\n return (\n <div\n className=\"flex flex-col gap-1\"\n data-testid={testIdOr(testIds?.root?.(docId), { testId: `citation-doc-${docId}` })}\n data-viewing={isViewing || undefined}\n data-slot=\"fact-source-group\"\n >\n <div className=\"flex items-center gap-1.5 px-1 text-sm\">\n {document}\n <span className=\"flex-1\" />\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label={l.remove}\n data-testid={testIdOr(testIds?.remove?.(docId), {\n testId: `fact-source-remove-${docId}`,\n })}\n className=\"shrink-0 rounded p-0.5 hover:bg-destructive/20 hover:text-destructive pointer-coarse:p-3\"\n >\n <X className=\"size-3\" />\n </button>\n </div>\n {hasPassages ? (\n children\n ) : (\n <span className=\"px-2 text-xs text-muted-foreground\">{l.wholeDocument}</span>\n )}\n </div>\n )\n}\n","/**\n * FactsViewToggle\n *\n * Table / Calendar / Timeline switch for the Notes page. (The list view\n * retired into the table — 'list' stays in the type for old deep links,\n * which the page maps to 'table'.) Uses the shared\n * ViewToggle so it matches Documents (Gallery / Table / Review), Home and Smart\n * Search rather than being a fifth bespoke button group, and sits in the tab\n * header where every other page puts its views.\n *\n * Calendar and Timeline read only the dated notes — a note without a date has\n * nowhere to sit on either — which the tooltips say rather than the labels.\n */\n\nimport { CalendarRange, GanttChartSquare, Search, Table2 } from 'lucide-react'\nimport { ViewToggle, type ViewToggleOption } from '../files/ViewToggle'\nimport { testIdOr } from '../chat/test-id'\n\nexport type FactsViewMode = 'list' | 'table' | 'calendar' | 'gantt' | 'smart_search'\n\nexport interface FactsViewToggleLabels {\n table: string\n calendar: string\n timeline: string\n smartSearch: string\n}\n\nexport const DEFAULT_FACTS_VIEW_TOGGLE_LABELS: FactsViewToggleLabels = {\n table: 'Table',\n calendar: 'Calendar',\n timeline: 'Timeline',\n smartSearch: 'Smart Search',\n}\n\nconst createOptions = (l: FactsViewToggleLabels): ViewToggleOption[] => [\n { value: 'table', icon: <Table2 className=\"size-3.5\" />, label: l.table },\n { value: 'calendar', icon: <CalendarRange className=\"size-3.5\" />, label: l.calendar },\n { value: 'gantt', icon: <GanttChartSquare className=\"size-3.5\" />, label: l.timeline },\n // Facts-only semantic/keyword recall — mirrors the Files \"Smart Search\" view\n // (same Search icon + label), but searches this workspace's facts, not docs.\n { value: 'smart_search', icon: <Search className=\"size-3.5\" />, label: l.smartSearch },\n]\n\nexport interface FactsViewToggleProps {\n viewMode: FactsViewMode\n onChange: (mode: FactsViewMode) => void\n /**\n * Collapse the labels to icons. Driven by a width measurement of the header\n * row (see FactsPage) rather than a `@container`, so the toggle can stay\n * absolutely centred — its position never shifts with the side controls —\n * while still collapsing when the row actually runs out of room.\n */\n collapsed?: boolean\n labels?: Partial<FactsViewToggleLabels>\n /** Item test ids are `${testIdPrefix}-${mode}-button` (default `facts-layout`). */\n testIdPrefix?: string\n /** Per-mode item ids that replace the prefixed ones. */\n testIds?: Partial<Record<FactsViewMode, string>>\n}\n\nexport function FactsViewToggle({\n viewMode,\n onChange,\n collapsed = false,\n labels,\n testIdPrefix,\n testIds,\n}: FactsViewToggleProps) {\n const options = createOptions({ ...DEFAULT_FACTS_VIEW_TOGGLE_LABELS, ...labels }).map((o) => ({\n ...o,\n testId: testIds?.[o.value as FactsViewMode],\n }))\n return (\n <ViewToggle\n options={options}\n value={viewMode}\n onChange={(value) => onChange(value as FactsViewMode)}\n testIdPrefix={testIdOr(testIdPrefix, { testId: 'facts-layout' })}\n showLabels={!collapsed}\n size=\"sm\"\n />\n )\n}\n","/**\n * FactsFieldsButton\n *\n * The Facts table's column-visibility control — the same \"Fields\" affordance the\n * Documents table wears (Columns3 icon, ghost button), pared down to what facts\n * need: a checkbox per column that shows or hides it. Toggling writes straight\n * to the grid via the AG Grid api, so the change persists through GridView's own\n * column-state persistence (no separate saved-views machinery here).\n */\nimport { useMemo, useState } from 'react'\nimport { Columns3, ChevronDown, Check, RotateCcw } from 'lucide-react'\nimport type { GridApi } from 'ag-grid-community'\nimport {\n Button,\n Command,\n CommandGroup,\n CommandItem,\n CommandList,\n CommandSeparator,\n Popover,\n PopoverContent,\n PopoverTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactsFieldsButtonLabels {\n fields: string\n defaultView: string\n columns: string\n /** Names for icon-only columns, keyed by colId. */\n columnNames: Record<string, string>\n}\n\nexport const DEFAULT_FACTS_FIELDS_BUTTON_LABELS: FactsFieldsButtonLabels = {\n fields: 'Fields',\n defaultView: 'Default view',\n columns: 'Columns',\n columnNames: { pinned: 'Pinned' },\n}\n\nexport interface FactsFieldsButtonTestIds {\n trigger: string\n defaultView: string\n toggle: (colId: string) => string\n}\n\nexport interface FactsFieldsButtonProps<TData = unknown> {\n /** The facts grid api (read lazily: the grid may not exist yet). */\n getGridApi: () => GridApi<TData> | null | undefined\n labels?: Partial<FactsFieldsButtonLabels>\n testIds?: Partial<FactsFieldsButtonTestIds>\n}\n\nexport function FactsFieldsButton<TData = unknown>({\n getGridApi,\n labels,\n testIds,\n}: FactsFieldsButtonProps<TData>) {\n const l = { ...DEFAULT_FACTS_FIELDS_BUTTON_LABELS, ...labels }\n const [open, setOpen] = useState(false)\n // Bumped after each toggle so the list re-reads the grid's live column state.\n const [version, setVersion] = useState(0)\n\n const columns = useMemo(() => {\n if (!open) return []\n const api = getGridApi()\n if (!api || api.isDestroyed()) return []\n const state = api.getColumnState()\n return state\n .filter((c) => c.colId !== 'ag-Grid-SelectionColumn')\n .map((c) => {\n const def = api.getColumnDef(c.colId)\n const label =\n (def?.headerName && def.headerName.trim()) || l.columnNames[c.colId] || c.colId\n return { colId: c.colId, label, visible: !c.hide }\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, version, getGridApi, l.columnNames])\n\n const visibleCount = columns.filter((c) => c.visible).length\n\n const toggle = (colId: string, visible: boolean) => {\n const api = getGridApi()\n if (!api || api.isDestroyed()) return\n // Never hide the last remaining column — an empty grid has no headers to\n // bring back the chooser against.\n if (visible && visibleCount <= 1) return\n api.setColumnsVisible([colId], !visible)\n setVersion((v) => v + 1)\n }\n\n // Default view: restore the columns' built-in order, visibility and widths\n // from the column definitions (like the Files table's \"Default view\"). Handy\n // when a column got hidden or dragged and the table no longer reads right.\n const resetToDefault = () => {\n const api = getGridApi()\n if (!api || api.isDestroyed()) return\n api.resetColumnState()\n setVersion((v) => v + 1)\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 text-sm gap-1.5 text-muted-foreground hover:text-foreground font-light!\"\n data-testid={testIdOr(testIds?.trigger, { testId: 'facts-fields-trigger' })}\n >\n <Columns3 className=\"size-3.5\" />\n {l.fields}\n <ChevronDown className=\"size-3\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[220px] p-0\" align=\"end\" side=\"bottom\" sideOffset={4}>\n <Command shouldFilter={false}>\n <CommandList className=\"max-h-[60dvh]\">\n <CommandGroup>\n <CommandItem\n onSelect={resetToDefault}\n className=\"cursor-pointer text-sm text-muted-foreground\"\n data-testid={testIdOr(testIds?.defaultView, {\n testId: 'facts-fields-default-view',\n })}\n >\n <RotateCcw className=\"mr-2 size-3.5\" />\n {l.defaultView}\n </CommandItem>\n </CommandGroup>\n <CommandSeparator />\n <CommandGroup heading={l.columns}>\n {columns.map((col) => (\n <CommandItem\n key={col.colId}\n onSelect={() => toggle(col.colId, col.visible)}\n className=\"cursor-pointer text-sm\"\n data-testid={testIdOr(testIds?.toggle?.(col.colId), {\n testId: `facts-fields-toggle-${col.colId}`,\n })}\n >\n <div\n className={cn(\n 'mr-2 flex size-3.5 items-center justify-center rounded-sm border border-primary',\n col.visible\n ? 'bg-primary text-primary-foreground'\n : 'opacity-50 [&_svg]:invisible'\n )}\n >\n <Check className=\"size-3\" />\n </div>\n {col.label}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n}\n","import { useEffect, useMemo, useRef } from 'react'\nimport { TimelineCalendar } from '../timeline/TimelineCalendar'\nimport { TimelineGantt, type TimelineGanttProps } from '../timeline/TimelineGantt'\nimport type { TimelineItem } from '../timeline/types'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactTimelineLabels {\n ganttEmpty: string\n}\n\nexport const DEFAULT_FACT_TIMELINE_LABELS: FactTimelineLabels = {\n ganttEmpty: 'Give a fact a date and it appears here.',\n}\n\n/** The fields of a fact the calendar reads. */\nexport interface FactCalendarRow {\n external_id: string\n text: string\n date_start?: string | null\n date_end?: string | null\n}\n\ntype CalendarItem<T> = TimelineItem & { fact: T }\n\nexport interface FactsCalendarProps<T extends FactCalendarRow> {\n facts: T[]\n onSelect?: (fact: T) => void\n /** The fact currently open for editing: its bars are highlighted. */\n selectedId?: string | null\n /** Host element the n / N fact navigator portals into (see TimelineCalendar). */\n navigatorContainer?: HTMLElement | null\n /** Denominator for the navigator: the page's filtered fact count. */\n navigatorTotal?: number\n /** Calendar test id; entries are `${testId}-entry-${factId}` (default `facts-calendar`). */\n testId?: string\n}\n\n/**\n * Facts on the shared calendar. Maps a fact to a labelled span and hands the fact back on select,\n * so packing, spanning bars and continuous scroll stay one implementation shared with every\n * other timeline surface. Undated facts have nowhere to sit and are skipped.\n */\nexport function FactsCalendar<T extends FactCalendarRow>({\n facts,\n onSelect,\n selectedId,\n navigatorContainer,\n navigatorTotal,\n testId,\n}: FactsCalendarProps<T>) {\n const calendarTestId = testIdOr(testId, { testId: 'facts-calendar' })\n const items = useMemo<CalendarItem<T>[]>(\n () =>\n facts\n .filter((f) => f.date_start)\n .map((f) => ({\n id: f.external_id,\n label: f.text,\n start: f.date_start as string,\n end: f.date_end,\n fact: f,\n })),\n [facts]\n )\n\n // The shared calendar takes no \"selected\" prop, so mark the selected fact's entries (a\n // multi-day fact has several) directly in the DOM, re-applied when selection or items change.\n const rootRef = useRef<HTMLDivElement>(null)\n const entryId = testIdOr(testId && `${testId}-entry-${selectedId}`, {\n testId: `facts-calendar-entry-${selectedId}`,\n })\n useEffect(() => {\n const root = rootRef.current\n if (!root) return\n root\n .querySelectorAll('.fact-cal-selected')\n .forEach((el) => el.classList.remove('fact-cal-selected'))\n if (!selectedId) return\n root\n .querySelectorAll(`[data-testid=\"${entryId}\"]`)\n .forEach((el) => el.classList.add('fact-cal-selected'))\n }, [selectedId, items, entryId])\n\n return (\n <div ref={rootRef} className=\"h-full border-t border-border\" data-slot=\"facts-calendar\">\n <TimelineCalendar\n items={items}\n testId={calendarTestId}\n // Show every fact on a day, never \"+n more\": single-line bars keep a busy day compact.\n maxLanes={Infinity}\n selectedIds={selectedId ? [selectedId] : []}\n onSelect={(item) => onSelect?.(item.fact)}\n navigatorContainer={navigatorContainer}\n navigatorTotal={navigatorTotal}\n />\n </div>\n )\n}\n\n/**\n * The Facts timeline. `.facts-gantt` scopes CSS that truncates row labels to one line and hides\n * the built-in detail side panel: a fact's contents are seen and edited in the composer instead.\n */\nexport function FactsGanttPane({\n testId,\n emptyMessage,\n labels,\n ...props\n}: TimelineGanttProps & { labels?: Partial<FactTimelineLabels> }) {\n const l = { ...DEFAULT_FACT_TIMELINE_LABELS, ...labels }\n return (\n <div className=\"facts-gantt h-full border-t border-border\" data-slot=\"facts-gantt\">\n <TimelineGantt\n testId={testIdOr(testId, { testId: 'gantt' })}\n emptyMessage={emptyMessage ?? l.ganttEmpty}\n {...props}\n />\n </div>\n )\n}\n","import { ArrowRight, CalendarClock, Lightbulb, Loader2, Milestone, Scale } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactsEmptyStateLabels {\n title: string\n intro: string\n tryAdding: string\n /** Three kinds of durable knowledge a fact captures. */\n kinds: { label: string; desc: string }[]\n /** Starter fact texts offered as one-tap examples. */\n examples: string[]\n loading: string\n loadError: string\n retry: string\n}\n\nexport const DEFAULT_FACTS_EMPTY_STATE_LABELS: FactsEmptyStateLabels = {\n title: 'Everything this workspace knows',\n intro:\n 'Facts are durable knowledge — a deadline, a decision, a preference. Write them yourself, or let the assistant distill them from your documents and chats.',\n tryAdding: 'Try adding a fact',\n kinds: [\n {\n label: 'Deadlines & dates',\n desc: 'A due date or milestone — it lands on the calendar and timeline',\n },\n { label: 'Decisions', desc: 'What was agreed, and why — so it is not lost in a thread' },\n { label: 'Preferences', desc: 'How this workspace likes things done' },\n ],\n examples: [\n 'The renewal deadline is March 31, 2026',\n 'Payment terms are net 30',\n 'The team prefers email over phone for updates',\n 'Board approved the Q3 budget on May 12',\n ],\n loading: 'Loading facts…',\n loadError: 'Could not load facts.',\n retry: 'Try again',\n}\n\nconst KIND_ICONS = [CalendarClock, Scale, Lightbulb]\n\nexport interface FactsEmptyStateTestIds {\n root: string\n example: string\n}\n\nexport interface FactsEmptyStateProps {\n /** Open the composer prefilled with an example. */\n onUseExample: (text: string) => void\n labels?: Partial<FactsEmptyStateLabels>\n testIds?: Partial<FactsEmptyStateTestIds>\n}\n\n/** First-run state: what facts are, the kinds they capture, and one-tap examples. */\nexport function FactsEmptyState({ onUseExample, labels, testIds }: FactsEmptyStateProps) {\n const l = { ...DEFAULT_FACTS_EMPTY_STATE_LABELS, ...labels }\n return (\n <div\n className=\"flex min-h-full items-center justify-center p-10\"\n data-testid={testIdOr(testIds?.root, { testId: 'facts-page-empty-state' })}\n data-slot=\"facts-empty-state\"\n >\n <div className=\"w-full max-w-xl text-center\">\n <div className=\"mx-auto mb-4 flex size-12 items-center justify-center rounded-lg bg-accent text-accent-foreground\">\n <Milestone className=\"size-6\" />\n </div>\n\n <h2 className=\"mt-2 text-xl font-semibold text-foreground\">{l.title}</h2>\n <p className=\"mt-2 text-sm text-muted-foreground\">{l.intro}</p>\n\n <div className=\"mt-7 grid gap-3 text-left @xl:grid-cols-3\">\n {l.kinds.map(({ label, desc }, i) => {\n const KindIcon = KIND_ICONS[i % KIND_ICONS.length]\n return (\n <div key={label} className=\"rounded-lg border border-border bg-card p-3 shadow-xs\">\n <div className=\"flex items-center gap-1.5 text-sm font-medium text-foreground\">\n <KindIcon className=\"size-4 text-primary\" />\n {label}\n </div>\n <p className=\"mt-1 text-xs leading-snug text-muted-foreground\">{desc}</p>\n </div>\n )\n })}\n </div>\n\n <p className=\"mt-10 text-sm font-medium text-muted-foreground\">{l.tryAdding}</p>\n <div className=\"mt-4 flex flex-wrap justify-center gap-2.5\">\n {l.examples.map((fact) => (\n <button\n key={fact}\n type=\"button\"\n onClick={() => onUseExample(fact)}\n className=\"group inline-flex items-center gap-1.5 rounded-md border border-border bg-card px-3.5 py-2 text-sm text-foreground transition-colors hover:border-ring/50 hover:bg-accent/40 pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.example, { testId: 'facts-page-example' })}\n >\n {fact}\n <ArrowRight className=\"size-3.5 text-muted-foreground transition-colors group-hover:text-primary\" />\n </button>\n ))}\n </div>\n </div>\n </div>\n )\n}\n\n/** Centered \"Loading facts…\" line. */\nexport function FactsLoading({\n label = DEFAULT_FACTS_EMPTY_STATE_LABELS.loading,\n}: {\n label?: string\n}) {\n return (\n <div className=\"flex items-center justify-center py-10 text-muted-foreground\">\n <Loader2 className=\"mr-2 size-4 animate-spin\" /> {label}\n </div>\n )\n}\n\n/** Load-failure message with a retry action. */\nexport function FactsLoadError({\n onRetry,\n message = DEFAULT_FACTS_EMPTY_STATE_LABELS.loadError,\n retryLabel = DEFAULT_FACTS_EMPTY_STATE_LABELS.retry,\n}: {\n onRetry: () => void\n message?: string\n retryLabel?: string\n}) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-3 px-6 py-10 text-center\">\n <p className=\"text-sm text-muted-foreground\">{message}</p>\n <Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n {retryLabel}\n </Button>\n </div>\n )\n}\n","import type { ReactNode, Ref } from 'react'\nimport { Info, Loader2, Trash2 } from 'lucide-react'\nimport { Button, Tooltip, TooltipContent, TooltipTrigger, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactComposerLabels {\n shared: string\n verified: string\n dates: string\n deleteFact: string\n cancel: string\n saveFact: string\n saving: string\n addFact: string\n adding: string\n}\n\nexport const DEFAULT_FACT_COMPOSER_LABELS: FactComposerLabels = {\n shared: 'Shared',\n verified: 'Verified',\n dates: 'Dates',\n deleteFact: 'Delete fact',\n cancel: 'Cancel',\n saveFact: 'Save fact',\n saving: 'Saving…',\n addFact: 'Add fact',\n adding: 'Adding…',\n}\n\nexport interface FactComposerTestIds {\n tags: string\n delete: string\n save: string\n error: string\n}\n\nexport interface FactSourcesRowLabels {\n sources: string\n hintButton: string\n hint: string\n}\n\nexport const DEFAULT_FACT_SOURCES_ROW_LABELS: FactSourcesRowLabels = {\n sources: 'Sources',\n hintButton: 'How to add sources',\n hint: \"In the picker, tick a document's checkbox to add it as a source, or click its name to just open it. Inside a document, click a passage to add it — shift-click to take a whole range. Add as many as you like, from as many documents as you like.\",\n}\n\n/** Composer field: the name stacked above its control (\"Labels\", \"Dates\"...). */\nexport function FactFieldRow({\n label,\n children,\n className,\n}: {\n label: string\n children: ReactNode\n className?: string\n}) {\n return (\n <div className={cn('flex flex-col gap-1.5', className)} data-slot=\"fact-field-row\">\n <span className=\"text-sm font-medium text-foreground\">{label}</span>\n <div className=\"min-w-0\">{children}</div>\n </div>\n )\n}\n\nexport interface FactSourcesRowProps {\n /** The show/hide-sources toggle. */\n toggle: ReactNode\n /** The document picker. */\n picker: ReactNode\n labels?: Partial<FactSourcesRowLabels>\n /** Test id of the hint button (default `facts-source-hint`). */\n hintTestId?: string\n}\n\n/** Sources label (with passage-collection guidance), the sources toggle and the picker. */\nexport function FactSourcesRow({ toggle, picker, labels, hintTestId }: FactSourcesRowProps) {\n const l = { ...DEFAULT_FACT_SOURCES_ROW_LABELS, ...labels }\n return (\n <div className=\"flex flex-col gap-1.5\" data-slot=\"fact-sources-row\">\n <span className=\"flex items-center gap-1 text-sm font-medium text-foreground\">\n {l.sources}\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={l.hintButton}\n className=\"text-muted-foreground hover:text-foreground\"\n data-testid={testIdOr(hintTestId, { testId: 'facts-source-hint' })}\n >\n <Info className=\"size-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-xs\">{l.hint}</TooltipContent>\n </Tooltip>\n </span>\n <div className=\"flex items-start gap-3\">\n {toggle}\n <div className=\"min-w-0 flex-1\">{picker}</div>\n </div>\n </div>\n )\n}\n\nexport interface FactComposerProps {\n /** Whether the composer is open (it stays mounted so it animates both ways). */\n isOpen: boolean\n /** Ref to the panel (used to keep it measured/focus-managed by the page). */\n panelRef?: Ref<HTMLDivElement>\n /** The WYSIWYG fact editor, with its sources row. */\n editor: ReactNode\n /** The labels picker row. */\n labels: ReactNode\n /** The Shared switch (label is added here). */\n sharedToggle: ReactNode\n /** The Verified switch (label is added here). */\n verifiedToggle: ReactNode\n /** The date picker. */\n dateInput: ReactNode\n /** Editing an existing fact (shows Delete, \"Save fact\"). */\n isEditing: boolean\n canSave: boolean\n isSaving: boolean\n isDeleting: boolean\n onSave: () => void\n onCancel: () => void\n onDelete: () => void\n error?: string | null\n uiLabels?: Partial<FactComposerLabels>\n testIds?: Partial<FactComposerTestIds>\n}\n\n/**\n * The inline fact composer: editor on top, then labels + Shared / Verified, then the date with\n * Cancel / Save (and Delete when editing). Always mounted; the grid-rows transition animates it\n * open and closed symmetrically (a conditional mount could only animate one way).\n */\nexport function FactComposer({\n isOpen,\n panelRef,\n editor,\n labels,\n sharedToggle,\n verifiedToggle,\n dateInput,\n isEditing,\n canSave,\n isSaving,\n isDeleting,\n onSave,\n onCancel,\n onDelete,\n error,\n uiLabels: labelOverrides,\n testIds,\n}: FactComposerProps) {\n const l = { ...DEFAULT_FACT_COMPOSER_LABELS, ...labelOverrides }\n return (\n <div\n className={cn(\n 'grid shrink-0 transition-[grid-template-rows,opacity] duration-500 ease-in-out',\n isOpen ? 'grid-rows-[1fr] opacity-100' : 'grid-rows-[0fr] opacity-0'\n )}\n data-slot=\"fact-composer\"\n >\n <div className=\"overflow-hidden\">\n <div\n ref={panelRef}\n className=\"facts-composer flex flex-col gap-4 border-b border-border bg-muted px-4 py-4\"\n >\n <div className=\"flex flex-col gap-3\">\n {editor}\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2\">\n <div\n data-testid={testIdOr(testIds?.tags, { testId: 'facts-page-composer-tags' })}\n className=\"min-w-[14rem] flex-1\"\n >\n {labels}\n </div>\n <div className=\"flex shrink-0 items-center gap-6\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n {sharedToggle}\n {l.shared}\n </div>\n <div className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n {verifiedToggle}\n {l.verified}\n </div>\n </div>\n </div>\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-2\">\n <div className=\"flex min-w-[10rem] flex-1 flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-foreground\">{l.dates}</span>\n {dateInput}\n </div>\n <div className=\"flex shrink-0 items-center gap-2 self-end max-sm:w-full max-sm:justify-end\">\n {isEditing && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"size-7 p-0 text-destructive hover:bg-destructive/10 hover:text-destructive pointer-coarse:size-11\"\n onClick={onDelete}\n disabled={isDeleting}\n data-testid={testIdOr(testIds?.delete, {\n testId: 'facts-page-composer-delete',\n })}\n aria-label={l.deleteFact}\n title={l.deleteFact}\n >\n {isDeleting ? (\n <Loader2 className=\"size-3.5 animate-spin\" />\n ) : (\n <Trash2 className=\"size-3.5\" />\n )}\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 pointer-coarse:h-11\"\n onClick={onCancel}\n >\n {l.cancel}\n </Button>\n <Button\n size=\"sm\"\n className=\"h-7 pointer-coarse:h-11\"\n disabled={!canSave}\n onClick={onSave}\n data-testid={testIdOr(testIds?.save, { testId: 'facts-page-composer-save' })}\n >\n {isEditing\n ? isSaving\n ? l.saving\n : l.saveFact\n : isSaving\n ? l.adding\n : l.addFact}\n </Button>\n </div>\n </div>\n </div>\n </div>\n {error && (\n <p\n className=\"text-xs text-destructive\"\n data-testid={testIdOr(testIds?.error, { testId: 'facts-page-composer-error' })}\n >\n {error}\n </p>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { FolderUp, MoreHorizontal, Pin, PinOff, Tags, Trash2 } from 'lucide-react'\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { SelectionBar, SelectionBarAction } from '../files/SelectionBar'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactsBulkBarLabels {\n unpin: string\n pin: string\n label: string\n shared: string\n more: string\n export: string\n delete: string\n budgetHint: string\n /** The `~{tokens}/{cap} tokens` line (numbers arrive formatted). */\n budget: (tokens: string, cap: string) => string\n unpinTooltip: (pluralNoun: string) => string\n pinTooltip: (pluralNoun: string) => string\n labelTooltip: (pluralNoun: string) => string\n}\n\nexport const DEFAULT_FACTS_BULK_BAR_LABELS: FactsBulkBarLabels = {\n unpin: 'Unpin Facts',\n pin: 'Pin to Chats',\n label: 'Label',\n shared: 'Shared',\n more: 'More',\n export: 'Export',\n delete: 'Delete',\n budgetHint:\n 'Pinned facts ride every AI request, so they are always in context and share one budget. This estimates the tokens they add (≈4 characters per token), capped at ~2,000.',\n budget: (tokens, cap) => `~${tokens}/${cap} tokens`,\n unpinTooltip: (n) => `Unpin the selected ${n} so they no longer ride every chat`,\n pinTooltip: (n) => `Pin the selected ${n} so they ride every chat with the assistant`,\n labelTooltip: (n) => `Add or remove labels from selected ${n}`,\n}\n\nexport interface FactsBulkBarTestIds {\n budget: string\n pin: string\n label: string\n more: string\n export: string\n delete: string\n}\n\nexport interface FactsBulkBarProps {\n /** Number of selected facts. */\n count: number\n onClear: () => void\n /** True when every selected fact is already pinned (the action then unpins). */\n allSelectedPinned: boolean\n onTogglePin: () => void\n onLabel: () => void\n /** The aggregate Shared switch for the selection (the app binds its toggle). */\n sharedToggle: ReactNode\n onExport: () => void\n onDelete: () => void\n /** Pinned-core token budget, shown at the left (reflects the whole workspace, not the selection). */\n budget?: { tokens: number; cap: number; isOver: boolean } | null\n /** Plural noun for tooltips (lower case). */\n pluralNoun?: string\n labels?: Partial<FactsBulkBarLabels>\n testIds?: Partial<FactsBulkBarTestIds>\n}\n\n/**\n * Sticky bulk-action bar for the facts table: Pin, Label, Shared and a More menu (Export,\n * Delete). Actions are disabled until something is selected.\n */\nexport function FactsBulkBar({\n count,\n onClear,\n allSelectedPinned,\n onTogglePin,\n onLabel,\n sharedToggle,\n onExport,\n onDelete,\n budget,\n pluralNoun = 'facts',\n labels,\n testIds,\n}: FactsBulkBarProps) {\n const l = { ...DEFAULT_FACTS_BULK_BAR_LABELS, ...labels }\n const none = count === 0\n return (\n <div className=\"pb-3\" data-slot=\"facts-bulk-bar\">\n <SelectionBar\n count={count}\n onClear={onClear}\n status={\n budget ? (\n <span\n className={cn(\n 'shrink-0 text-xs tabular-nums',\n budget.isOver ? 'text-destructive' : 'text-muted-foreground'\n )}\n title={l.budgetHint}\n data-testid={testIdOr(testIds?.budget, { testId: 'facts-page-core-budget' })}\n >\n {l.budget(budget.tokens.toLocaleString(), budget.cap.toLocaleString())}\n </span>\n ) : null\n }\n >\n {(isCompact) => (\n <>\n <SelectionBarAction\n icon={allSelectedPinned ? PinOff : Pin}\n label={allSelectedPinned ? l.unpin : l.pin}\n onClick={onTogglePin}\n disabled={none}\n isCompact={isCompact}\n className=\"border-yellow-border text-yellow-text hover:bg-yellow-bg hover:text-yellow-text\"\n tooltip={allSelectedPinned ? l.unpinTooltip(pluralNoun) : l.pinTooltip(pluralNoun)}\n testId={testIdOr(testIds?.pin, { testId: 'bulk-pin-facts-button' })}\n />\n <SelectionBarAction\n icon={Tags}\n label={l.label}\n onClick={onLabel}\n disabled={none}\n isCompact={isCompact}\n className=\"border-green-border text-green-text hover:bg-green-bg hover:text-green-text\"\n tooltip={l.labelTooltip(pluralNoun)}\n testId={testIdOr(testIds?.label, { testId: 'bulk-label-facts-button' })}\n />\n <div className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2 py-1\">\n {sharedToggle}\n {!isCompact && <span className=\"text-sm text-muted-foreground\">{l.shared}</span>}\n </div>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 gap-1.5 px-2 pointer-coarse:h-11\"\n disabled={none}\n data-testid={testIdOr(testIds?.more, { testId: 'facts-bulk-more-button' })}\n >\n <MoreHorizontal className=\"size-4\" />\n {!isCompact && <span className=\"text-sm\">{l.more}</span>}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n onClick={onExport}\n disabled={none}\n data-testid={testIdOr(testIds?.export, { testId: 'export-facts-button' })}\n >\n <FolderUp className=\"mr-2 size-4\" />\n {l.export}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={onDelete}\n disabled={none}\n className=\"text-red-text focus:text-red-text\"\n data-testid={testIdOr(testIds?.delete, { testId: 'bulk-delete-facts-button' })}\n >\n <Trash2 className=\"mr-2 size-4\" />\n {l.delete}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </>\n )}\n </SelectionBar>\n </div>\n )\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react'\nimport { BookMarked, Milestone, Plus } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { TabHeader, type Tab } from '../shell/TabHeader'\nimport { observeResize } from '../lib/observe-resize'\nimport { testIdOr } from '../chat/test-id'\nimport {\n FilterInput,\n type FilterInputLabels,\n type FilterInputTestIds,\n type FilterField,\n} from '../shell/FilterInput'\nimport { FactsViewToggle, type FactsViewMode, type FactsViewToggleLabels } from './FactsViewToggle'\n\nexport interface FactsToolbarLabels {\n tags: string\n newFact: string\n}\n\nexport const DEFAULT_FACTS_TOOLBAR_LABELS: FactsToolbarLabels = {\n tags: 'Tags',\n newFact: 'New fact',\n}\n\nexport interface FactsToolbarTestIds {\n tab: string\n tagsButton: string\n newFact: string\n filterBar: string\n filterBarNav: string\n}\n\nexport interface FactsToolbarProps {\n /** Facts matching the current filters (shown beside the glyph). */\n count: number\n /** Solid-fill the count while any filter is narrowing the list. */\n hasActiveFilters: boolean\n filterText: string\n onFilterTextChange: (text: string) => void\n searchFields: FilterField[]\n onSearchFieldsChange: (fields: FilterField[]) => void\n /** The quick-filter dropdown, embedded inside the filter box. */\n quickFilter?: ReactNode\n /** Open the Labels panel. Omit it to hide the Tags button. */\n onOpenTags?: () => void\n viewMode: FactsViewMode\n onViewModeChange: (mode: FactsViewMode) => void\n onNewFact: () => void\n /** Second row: left slot for the row navigator (portal host for calendar/timeline). */\n navSlotRef?: (el: HTMLElement | null) => void\n /** Table navigator rendered directly in the left slot. */\n navigator?: ReactNode\n /** Second row, right side: per-view controls (Fields, density, zoom). */\n tools?: ReactNode\n /** Smart Search has no toolbar row. */\n showToolbarRow?: boolean\n labels?: Partial<FactsToolbarLabels>\n testIds?: Partial<FactsToolbarTestIds>\n /** Overrides for the embedded filter box. */\n filterLabels?: Partial<FilterInputLabels>\n filterTestIds?: Partial<FilterInputTestIds>\n /** Overrides for the embedded view toggle. */\n viewToggleLabels?: Partial<FactsViewToggleLabels>\n viewToggleTestIdPrefix?: string\n}\n\n/**\n * Facts page header: count tab with filter box and Tags button, the view toggle centred, New fact\n * on the right (the page's one primary action), and a second row for per-view controls.\n */\nexport function FactsToolbar({\n count,\n hasActiveFilters,\n filterText,\n onFilterTextChange,\n searchFields,\n onSearchFieldsChange,\n quickFilter,\n onOpenTags,\n viewMode,\n onViewModeChange,\n onNewFact,\n navSlotRef,\n navigator,\n tools,\n showToolbarRow = true,\n labels,\n testIds,\n filterLabels,\n filterTestIds,\n viewToggleLabels,\n viewToggleTestIdPrefix,\n}: FactsToolbarProps) {\n const l = { ...DEFAULT_FACTS_TOOLBAR_LABELS, ...labels }\n // Collapse the view toggle's labels to icons when the row runs low on room, measured off the\n // row's own width (stable against side controls appearing) with hysteresis to avoid flicker.\n const headerRef = useRef<HTMLDivElement>(null)\n const [viewsCollapsed, setViewsCollapsed] = useState(false)\n // On phones the header cannot hold the view toggle beside the filter and New fact, so the\n // toggle moves to a row of its own beneath it.\n const [isNarrow, setIsNarrow] = useState(false)\n useEffect(() => {\n const el = headerRef.current\n if (!el) return\n const measure = () => {\n const w = el.clientWidth\n setViewsCollapsed((prev) => (prev ? w < 990 : w < 950))\n // Touch targets are 44px, so the one-row header needs more room on a touch device: a phone\n // held sideways (~760px) already clips the Tags button under the view toggle.\n const narrowAt = window.matchMedia?.('(pointer: coarse)')?.matches ? 820 : 640\n setIsNarrow((prev) => (prev ? w < narrowAt + 20 : w < narrowAt))\n }\n measure()\n return observeResize(el, measure)\n }, [])\n\n const tabs: Tab[] = [\n {\n id: 'facts',\n // No name: the page needs no self-label, but the fact glyph stays in front of the count.\n countIcon: <Milestone className=\"size-3.5\" />,\n label: '',\n count,\n countPlacement: 'leading',\n hasActiveFilters,\n testId: testIdOr(testIds?.tab, { testId: 'facts-tab' }),\n presentation: 'count',\n },\n ]\n\n // Filter box (+ Tags). In the header on wide rows; on phones it gets a full-width row of its\n // own so the filter is never squeezed to a stub.\n const filterControls = (\n <div className={isNarrow ? 'flex w-full items-center gap-1.5' : 'flex items-center gap-1.5'}>\n <FilterInput\n value={filterText}\n onChange={onFilterTextChange}\n fields={searchFields}\n onFieldsChange={onSearchFieldsChange}\n filter={quickFilter}\n className={isNarrow ? 'min-w-0 flex-1' : undefined}\n labels={filterLabels}\n testIds={filterTestIds}\n />\n {onOpenTags && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-6 shrink-0 gap-1.5 px-2 pointer-coarse:h-11\"\n onClick={onOpenTags}\n data-testid={testIdOr(testIds?.tagsButton, { testId: 'facts-tags-button' })}\n >\n <BookMarked className=\"size-3.5\" />\n <span className=\"text-sm\">{l.tags}</span>\n </Button>\n )}\n </div>\n )\n\n return (\n <div ref={headerRef} className=\"sticky top-0 z-10 bg-background\" data-slot=\"facts-toolbar\">\n <TabHeader\n tabs={tabs}\n activeTabId=\"notes\"\n onTabChange={() => {}}\n firstTabContent={isNarrow ? null : filterControls}\n centerContent={\n isNarrow ? null : (\n <div className=\"flex w-full items-center justify-center\">\n <FactsViewToggle\n viewMode={viewMode}\n onChange={onViewModeChange}\n collapsed={viewsCollapsed}\n labels={viewToggleLabels}\n testIdPrefix={viewToggleTestIdPrefix}\n />\n </div>\n )\n }\n rightContent={\n <Button\n onClick={onNewFact}\n data-testid={testIdOr(testIds?.newFact, { testId: 'facts-page-new' })}\n >\n <Plus className=\"mr-0.5 size-4\" />\n {l.newFact}\n </Button>\n }\n />\n {isNarrow && (\n <div\n className=\"flex flex-col gap-1.5 border-b border-border px-3 py-1.5\"\n data-slot=\"facts-toolbar-stack\"\n >\n {filterControls}\n <div className=\"flex justify-center\">\n <FactsViewToggle\n viewMode={viewMode}\n onChange={onViewModeChange}\n collapsed\n labels={viewToggleLabels}\n testIdPrefix={viewToggleTestIdPrefix}\n />\n </div>\n </div>\n )}\n {showToolbarRow && (\n <div\n className=\"flex min-h-8 flex-wrap items-center gap-x-1.5 border-b border-border bg-background px-3 py-0.5\"\n data-testid={testIdOr(testIds?.filterBar, { testId: 'facts-filter-bar' })}\n >\n <div\n ref={navSlotRef}\n className=\"flex shrink-0 items-center empty:hidden\"\n data-testid={testIdOr(testIds?.filterBarNav, { testId: 'facts-filter-bar-nav' })}\n >\n {navigator}\n </div>\n <div className=\"flex-1\" />\n <div className=\"flex shrink-0 items-center\">{tools}</div>\n </div>\n )}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Check, CheckCircle2, CornerDownLeft, Loader2, Pin, Search, X } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { SearchHit } from '../retrieval/SearchHit'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactSearchBarLabels {\n search: string\n placeholder: string\n clear: string\n submit: string\n}\n\nexport const DEFAULT_FACT_SEARCH_BAR_LABELS: FactSearchBarLabels = {\n search: 'Search:',\n // An example query rather than an instruction: shows the quoted-phrase syntax.\n placeholder: 'e.g. \"board meeting\" decision on the budget',\n clear: 'Clear search',\n submit: 'Search',\n}\n\nexport interface FactSearchBarTestIds {\n input: string\n clear: string\n submit: string\n}\n\nexport interface FactSearchResultLabels {\n core: string\n verified: string\n open: string\n}\n\nexport const DEFAULT_FACT_SEARCH_RESULT_LABELS: FactSearchResultLabels = {\n core: 'Core',\n verified: 'Verified',\n open: 'Open',\n}\n\nexport interface FactSearchResultTestIds {\n hit: (id: string) => string\n labels: (id: string) => string\n verified: (id: string) => string\n}\n\nexport interface FactSearchBarProps {\n query: string\n onQueryChange: (query: string) => void\n onSubmit: () => void\n onClear: () => void\n isSearching: boolean\n /** Wins over `labels.placeholder`. */\n placeholder?: string\n labels?: Partial<FactSearchBarLabels>\n testIds?: Partial<FactSearchBarTestIds>\n}\n\n/**\n * The facts Smart Search bar: the same bordered, auto-growing box as the Files Smart Search.\n * Enter searches; Shift+Enter breaks a line.\n */\nexport function FactSearchBar({\n query,\n onQueryChange,\n onSubmit,\n onClear,\n isSearching,\n placeholder,\n labels,\n testIds,\n}: FactSearchBarProps) {\n const l = { ...DEFAULT_FACT_SEARCH_BAR_LABELS, ...labels }\n return (\n <div className=\"border-t border-border px-6 pb-4 pt-6\" data-slot=\"fact-search-bar\">\n <form\n onSubmit={(e) => {\n e.preventDefault()\n onSubmit()\n }}\n className=\"mx-auto flex w-full max-w-2xl items-center gap-3\"\n >\n <label\n htmlFor=\"facts-smart-search-input\"\n className=\"shrink-0 text-base font-medium text-foreground\"\n >\n {l.search}\n </label>\n <div className=\"flex min-w-0 flex-1 items-start gap-2 rounded-lg border border-border bg-background px-3.5 py-2.5 transition-colors focus-within:border-ring focus-within:ring-2 focus-within:ring-ring\">\n <textarea\n id=\"facts-smart-search-input\"\n rows={1}\n value={query}\n onChange={(e) => {\n onQueryChange(e.target.value)\n e.target.style.height = 'auto'\n e.target.style.height = `${e.target.scrollHeight}px`\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n onSubmit()\n }\n }}\n placeholder={placeholder ?? l.placeholder}\n className=\"flex-1 resize-none overflow-hidden border-0 bg-transparent p-0 text-base leading-relaxed text-foreground outline-none placeholder:text-muted-foreground\"\n data-testid={testIdOr(testIds?.input, { testId: 'facts-smart-search-input' })}\n autoFocus\n />\n <div className=\"flex shrink-0 items-center gap-1\">\n {query && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 text-muted-foreground hover:text-foreground pointer-coarse:size-11\"\n onClick={onClear}\n aria-label={l.clear}\n title={l.clear}\n data-testid={testIdOr(testIds?.clear, { testId: 'facts-smart-search-clear' })}\n >\n <X className=\"size-4\" />\n </Button>\n )}\n <Button\n type=\"submit\"\n size=\"icon\"\n disabled={!query.trim() || isSearching}\n className=\"size-7 pointer-coarse:size-11\"\n data-testid={testIdOr(testIds?.submit, { testId: 'facts-smart-search-submit' })}\n title={l.submit}\n >\n {isSearching ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Search className=\"size-4\" />\n )}\n </Button>\n </div>\n </div>\n </form>\n </div>\n )\n}\n\n/** Totals headline pinned between the search bar and the scrolling results. */\nexport function FactSearchTotals({ children, testId }: { children: ReactNode; testId?: string }) {\n return (\n <div className=\"px-4 pb-3\">\n <p\n className=\"font-sans text-base font-semibold tabular-nums text-foreground\"\n data-testid={testIdOr(testId, { testId: 'facts-smart-search-totals' })}\n >\n {children}\n </p>\n </div>\n )\n}\n\n/** \"Searching facts…\" line. */\nexport function FactSearchPending({ children }: { children: ReactNode }) {\n return (\n <div className=\"flex items-center justify-center gap-2 py-16 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> {children}\n </div>\n )\n}\n\n/** No-matches message. */\nexport function FactSearchNoMatches({\n children,\n testId,\n}: {\n children: ReactNode\n testId?: string\n}) {\n return (\n <div\n className=\"py-16 text-center text-sm text-muted-foreground\"\n data-testid={testIdOr(testId, { testId: 'facts-smart-search-empty' })}\n >\n {children}\n </div>\n )\n}\n\nexport interface FactSearchResultLabel {\n id: string\n name: string\n color: string\n}\n\nexport interface FactSearchResultProps {\n /** Fact id: keys the test ids. */\n id: string\n /** 1-based rank, shown outside the card (it numbers the results, it is not part of the hit). */\n rank: number\n text: string\n terms: string[]\n renderSnippet: (content: string, terms: string[]) => ReactNode\n labels: FactSearchResultLabel[]\n isPinned?: boolean\n isVerified?: boolean\n /** The fact open in the composer. */\n isSelected?: boolean\n onOpen: () => void\n uiLabels?: Partial<FactSearchResultLabels>\n testIds?: Partial<FactSearchResultTestIds>\n /** Destination of the fact; the card stays a click target (see SearchHit `href`). */\n href?: string\n}\n\n/** One facts search result: rank, highlighted text, labels (and Core) and the Verified mark. */\nexport function FactSearchResult({\n id,\n rank,\n text,\n terms,\n renderSnippet,\n labels,\n isPinned,\n isVerified,\n isSelected,\n onOpen,\n uiLabels: labelOverrides,\n testIds,\n href,\n}: FactSearchResultProps) {\n const l = { ...DEFAULT_FACT_SEARCH_RESULT_LABELS, ...labelOverrides }\n return (\n <div className=\"flex items-start gap-2\" data-slot=\"fact-search-hit\">\n <span\n className=\"w-5 shrink-0 pt-3 text-right text-xs tabular-nums text-muted-foreground\"\n aria-hidden=\"true\"\n >\n {rank}\n </span>\n <SearchHit\n className=\"min-w-0 flex-1\"\n testId={testIdOr(testIds?.hit?.(id), { testId: `facts-smart-search-hit-${id}` })}\n href={href}\n selected={isSelected}\n onClick={onOpen}\n content={text}\n terms={terms}\n renderSnippet={renderSnippet}\n header={\n <div\n className=\"flex min-w-0 flex-1 flex-wrap items-center gap-1 text-xs text-muted-foreground\"\n data-testid={testIdOr(testIds?.labels?.(id), {\n testId: `facts-smart-search-hit-labels-${id}`,\n })}\n >\n {isPinned && (\n <span className=\"inline-flex items-center gap-1 pr-1\">\n <Pin className=\"size-3\" /> {l.core}\n </span>\n )}\n {labels.map((tag) => (\n <span\n key={tag.id}\n className=\"inline-flex shrink-0 items-center gap-1 rounded border px-1.5 py-0.5 text-xs font-medium text-foreground\"\n title={tag.name}\n style={{ borderColor: tag.color }}\n >\n <span\n className=\"flex size-3.5 shrink-0 items-center justify-center rounded\"\n style={{ backgroundColor: tag.color }}\n >\n <Check className=\"size-2.5 text-white\" strokeWidth={3} />\n </span>\n <span className=\"max-w-[120px] truncate\">{tag.name}</span>\n </span>\n ))}\n </div>\n }\n headerRight={\n <span className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n {isVerified && (\n <span\n className=\"inline-flex shrink-0 items-center gap-1 text-green-text\"\n data-testid={testIdOr(testIds?.verified?.(id), {\n testId: `facts-smart-search-hit-verified-${id}`,\n })}\n >\n <CheckCircle2 className=\"size-3\" /> {l.verified}\n </span>\n )}\n <span className=\"inline-flex items-center gap-1\">\n {l.open} <CornerDownLeft className=\"size-3\" />\n </span>\n </span>\n }\n />\n </div>\n )\n}\n"]}
|