@arbidocs/blocks 0.5.90 → 0.5.91

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/{ConnectedCallDock-FNJRJ653.js → ConnectedCallDock-PJE7EZ6T.js} +4 -4
  2. package/dist/{ConnectedCallDock-FNJRJ653.js.map → ConnectedCallDock-PJE7EZ6T.js.map} +1 -1
  3. package/dist/{ConnectedCallDock-W66NDZIJ.cjs → ConnectedCallDock-ZRSZYSLO.cjs} +4 -4
  4. package/dist/{ConnectedCallDock-W66NDZIJ.cjs.map → ConnectedCallDock-ZRSZYSLO.cjs.map} +1 -1
  5. package/dist/ConnectedCallRoom-S7DO2MP6.js +2 -2
  6. package/dist/ConnectedCallRoom-XK2RPNO6.cjs +2 -2
  7. package/dist/{ConnectedMailInviteCard-RSNELYZX.cjs → ConnectedMailInviteCard-OBDYWUFM.cjs} +5 -5
  8. package/dist/{ConnectedMailInviteCard-RSNELYZX.cjs.map → ConnectedMailInviteCard-OBDYWUFM.cjs.map} +1 -1
  9. package/dist/{ConnectedMailInviteCard-2TXUPVV7.js → ConnectedMailInviteCard-YYPLRL6G.js} +4 -4
  10. package/dist/{ConnectedMailInviteCard-2TXUPVV7.js.map → ConnectedMailInviteCard-YYPLRL6G.js.map} +1 -1
  11. package/dist/{ConnectedNativeDocxComparison-77BRPLGW.js → ConnectedNativeDocxComparison-2RIERXLW.js} +11 -11
  12. package/dist/{ConnectedNativeDocxComparison-77BRPLGW.js.map → ConnectedNativeDocxComparison-2RIERXLW.js.map} +1 -1
  13. package/dist/{ConnectedNativeDocxComparison-7G57TZC7.cjs → ConnectedNativeDocxComparison-46C7LYGT.cjs} +12 -12
  14. package/dist/{ConnectedNativeDocxComparison-7G57TZC7.cjs.map → ConnectedNativeDocxComparison-46C7LYGT.cjs.map} +1 -1
  15. package/dist/{ConnectedNativeDocxEditor-YKLNR2FO.cjs → ConnectedNativeDocxEditor-6XMB2XT7.cjs} +12 -12
  16. package/dist/{ConnectedNativeDocxEditor-YKLNR2FO.cjs.map → ConnectedNativeDocxEditor-6XMB2XT7.cjs.map} +1 -1
  17. package/dist/{ConnectedNativeDocxEditor-JSZURNVZ.js → ConnectedNativeDocxEditor-K6X63CPL.js} +10 -10
  18. package/dist/{ConnectedNativeDocxEditor-JSZURNVZ.js.map → ConnectedNativeDocxEditor-K6X63CPL.js.map} +1 -1
  19. package/dist/{ConnectedProductionSetDialog-ZEKYUQXE.js → ConnectedProductionSetDialog-JXQLGDIH.js} +3 -3
  20. package/dist/{ConnectedProductionSetDialog-ZEKYUQXE.js.map → ConnectedProductionSetDialog-JXQLGDIH.js.map} +1 -1
  21. package/dist/{ConnectedProductionSetDialog-MQ5OLTSR.cjs → ConnectedProductionSetDialog-T3Q32XPJ.cjs} +3 -3
  22. package/dist/{ConnectedProductionSetDialog-MQ5OLTSR.cjs.map → ConnectedProductionSetDialog-T3Q32XPJ.cjs.map} +1 -1
  23. package/dist/{ConnectedStreamedWordArtifact-TMVTOSEP.js → ConnectedStreamedWordArtifact-6UMLSR3G.js} +11 -11
  24. package/dist/ConnectedStreamedWordArtifact-6UMLSR3G.js.map +1 -0
  25. package/dist/{ConnectedStreamedWordArtifact-WOE4WNJO.cjs → ConnectedStreamedWordArtifact-GFFLCGF7.cjs} +12 -12
  26. package/dist/ConnectedStreamedWordArtifact-GFFLCGF7.cjs.map +1 -0
  27. package/dist/{DocumentReviewCard-FOYUZWAW.js → DocumentReviewCard-SAKLHM4Y.js} +4 -4
  28. package/dist/{DocumentReviewCard-FOYUZWAW.js.map → DocumentReviewCard-SAKLHM4Y.js.map} +1 -1
  29. package/dist/{DocumentReviewCard-JY2WZCEK.cjs → DocumentReviewCard-XGYMO5YS.cjs} +4 -4
  30. package/dist/{DocumentReviewCard-JY2WZCEK.cjs.map → DocumentReviewCard-XGYMO5YS.cjs.map} +1 -1
  31. package/dist/{FilesViewerDialog-SVT7CVAZ.cjs → FilesViewerDialog-3C6JUMVS.cjs} +11 -11
  32. package/dist/{FilesViewerDialog-SVT7CVAZ.cjs.map → FilesViewerDialog-3C6JUMVS.cjs.map} +1 -1
  33. package/dist/{FilesViewerDialog-MPMYI5NP.js → FilesViewerDialog-HNBRY7RQ.js} +10 -10
  34. package/dist/{FilesViewerDialog-MPMYI5NP.js.map → FilesViewerDialog-HNBRY7RQ.js.map} +1 -1
  35. package/dist/WorkspaceTableView-DFN4WGRI.js +1 -1
  36. package/dist/WorkspaceTableView-UOP3EB2F.cjs +1 -1
  37. package/dist/agents/index.cjs +254 -254
  38. package/dist/agents/index.js +4 -4
  39. package/dist/calendar/index.cjs +116 -116
  40. package/dist/calendar/index.js +1 -1
  41. package/dist/calls/index.cjs +2 -2
  42. package/dist/calls/index.js +2 -2
  43. package/dist/chat/index.cjs +18 -18
  44. package/dist/chat/index.js +2 -2
  45. package/dist/{chunk-WVCTH42C.cjs → chunk-3TECBO75.cjs} +12 -12
  46. package/dist/{chunk-WVCTH42C.cjs.map → chunk-3TECBO75.cjs.map} +1 -1
  47. package/dist/{chunk-AJ4TBTA3.js → chunk-4KARJ4CC.js} +3 -3
  48. package/dist/{chunk-AJ4TBTA3.js.map → chunk-4KARJ4CC.js.map} +1 -1
  49. package/dist/{chunk-PIFTGL57.js → chunk-4RFNQRUD.js} +5 -5
  50. package/dist/{chunk-PIFTGL57.js.map → chunk-4RFNQRUD.js.map} +1 -1
  51. package/dist/{chunk-K2AVKRZI.cjs → chunk-4VUKYB32.cjs} +4 -4
  52. package/dist/{chunk-K2AVKRZI.cjs.map → chunk-4VUKYB32.cjs.map} +1 -1
  53. package/dist/{chunk-7MFZS24I.cjs → chunk-5YBH5CQD.cjs} +9 -9
  54. package/dist/{chunk-7MFZS24I.cjs.map → chunk-5YBH5CQD.cjs.map} +1 -1
  55. package/dist/{chunk-JSWF2AMA.js → chunk-636KUL53.js} +4 -4
  56. package/dist/{chunk-JSWF2AMA.js.map → chunk-636KUL53.js.map} +1 -1
  57. package/dist/{chunk-B5FFLDK7.js → chunk-6T4ZMGGT.js} +3 -3
  58. package/dist/{chunk-B5FFLDK7.js.map → chunk-6T4ZMGGT.js.map} +1 -1
  59. package/dist/{chunk-7E3SUV4J.cjs → chunk-6Y7MHSIT.cjs} +3 -3
  60. package/dist/{chunk-7E3SUV4J.cjs.map → chunk-6Y7MHSIT.cjs.map} +1 -1
  61. package/dist/{chunk-KUBNSEQP.cjs → chunk-CLPDKHSP.cjs} +10 -10
  62. package/dist/{chunk-KUBNSEQP.cjs.map → chunk-CLPDKHSP.cjs.map} +1 -1
  63. package/dist/{chunk-UPG4IEQV.js → chunk-EXZPKMMP.js} +11 -11
  64. package/dist/{chunk-UPG4IEQV.js.map → chunk-EXZPKMMP.js.map} +1 -1
  65. package/dist/{chunk-IMINN6RD.js → chunk-FKPFKSDT.js} +3 -3
  66. package/dist/{chunk-IMINN6RD.js.map → chunk-FKPFKSDT.js.map} +1 -1
  67. package/dist/{chunk-WVEYUH6C.cjs → chunk-GNKQVCMW.cjs} +6 -6
  68. package/dist/{chunk-WVEYUH6C.cjs.map → chunk-GNKQVCMW.cjs.map} +1 -1
  69. package/dist/{chunk-EZGK7FLE.js → chunk-GUGSUCIK.js} +3 -3
  70. package/dist/{chunk-EZGK7FLE.js.map → chunk-GUGSUCIK.js.map} +1 -1
  71. package/dist/{chunk-GS5OCYNQ.cjs → chunk-HMS3GRMI.cjs} +3 -3
  72. package/dist/{chunk-GS5OCYNQ.cjs.map → chunk-HMS3GRMI.cjs.map} +1 -1
  73. package/dist/{chunk-I6SPGHFY.cjs → chunk-HUE76NAI.cjs} +2 -2
  74. package/dist/{chunk-I6SPGHFY.cjs.map → chunk-HUE76NAI.cjs.map} +1 -1
  75. package/dist/{chunk-KFKRZ5WX.js → chunk-IXA534S4.js} +7 -7
  76. package/dist/{chunk-KFKRZ5WX.js.map → chunk-IXA534S4.js.map} +1 -1
  77. package/dist/{chunk-MTSXOBK2.js → chunk-KPD7WAXP.js} +3 -3
  78. package/dist/{chunk-MTSXOBK2.js.map → chunk-KPD7WAXP.js.map} +1 -1
  79. package/dist/{chunk-KLRYWHLD.cjs → chunk-KXRGVY3M.cjs} +4 -4
  80. package/dist/{chunk-KLRYWHLD.cjs.map → chunk-KXRGVY3M.cjs.map} +1 -1
  81. package/dist/{chunk-6GSKZGLR.cjs → chunk-NZ26UYEQ.cjs} +11 -11
  82. package/dist/{chunk-6GSKZGLR.cjs.map → chunk-NZ26UYEQ.cjs.map} +1 -1
  83. package/dist/{chunk-LTRFQ2IC.js → chunk-PYLG3M6G.js} +2 -2
  84. package/dist/{chunk-LTRFQ2IC.js.map → chunk-PYLG3M6G.js.map} +1 -1
  85. package/dist/{chunk-F3KBCQKH.cjs → chunk-RCOJ7JG5.cjs} +4 -4
  86. package/dist/{chunk-F3KBCQKH.cjs.map → chunk-RCOJ7JG5.cjs.map} +1 -1
  87. package/dist/{chunk-FHJOI5GV.js → chunk-TSP5JJ56.js} +3 -3
  88. package/dist/{chunk-FHJOI5GV.js.map → chunk-TSP5JJ56.js.map} +1 -1
  89. package/dist/{chunk-SUP6LS22.js → chunk-TVLY7FTU.js} +3 -3
  90. package/dist/{chunk-SUP6LS22.js.map → chunk-TVLY7FTU.js.map} +1 -1
  91. package/dist/{chunk-LFXUJNXJ.cjs → chunk-VJLW3UPL.cjs} +6 -6
  92. package/dist/{chunk-LFXUJNXJ.cjs.map → chunk-VJLW3UPL.cjs.map} +1 -1
  93. package/dist/{chunk-D3ABKS7T.cjs → chunk-VK5Q5JXU.cjs} +3 -3
  94. package/dist/{chunk-D3ABKS7T.cjs.map → chunk-VK5Q5JXU.cjs.map} +1 -1
  95. package/dist/{chunk-B36GZ4FJ.js → chunk-WWMVVAA5.js} +6 -6
  96. package/dist/{chunk-B36GZ4FJ.js.map → chunk-WWMVVAA5.js.map} +1 -1
  97. package/dist/{chunk-VEG4LR55.cjs → chunk-YACOI5ZU.cjs} +48 -48
  98. package/dist/{chunk-VEG4LR55.cjs.map → chunk-YACOI5ZU.cjs.map} +1 -1
  99. package/dist/{chunk-6U6IY7DB.js → chunk-YIJ4MFYM.js} +3 -3
  100. package/dist/{chunk-6U6IY7DB.js.map → chunk-YIJ4MFYM.js.map} +1 -1
  101. package/dist/connect/docx.cjs +15 -15
  102. package/dist/connect/docx.js +11 -11
  103. package/dist/connect/index.cjs +432 -431
  104. package/dist/connect/index.cjs.map +1 -1
  105. package/dist/connect/index.js +40 -39
  106. package/dist/connect/index.js.map +1 -1
  107. package/dist/connect/viewer.cjs +9 -9
  108. package/dist/connect/viewer.js +8 -8
  109. package/dist/connection/files/ConnectedBulkTagCrumbs.d.ts +6 -1
  110. package/dist/embed/index.cjs +15 -15
  111. package/dist/embed/index.js +9 -9
  112. package/dist/facts/index.cjs +44 -44
  113. package/dist/facts/index.js +3 -3
  114. package/dist/index.cjs +430 -430
  115. package/dist/index.js +13 -13
  116. package/dist/settings/index.cjs +1 -1
  117. package/dist/settings/index.js +1 -1
  118. package/dist/site/index.cjs +5 -5
  119. package/dist/site/index.js +1 -1
  120. package/dist/studio/index.cjs +1 -1
  121. package/dist/studio/index.js +1 -1
  122. package/dist/workflow-canvas/index.cjs +32 -32
  123. package/dist/workflow-canvas/index.js +17 -17
  124. package/node_modules/@arbidocs/coedit/package.json +1 -1
  125. package/package.json +5 -5
  126. package/dist/ConnectedStreamedWordArtifact-TMVTOSEP.js.map +0 -1
  127. package/dist/ConnectedStreamedWordArtifact-WOE4WNJO.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/facts/FactComposer.tsx","../src/facts/FactDateInput.tsx","../src/facts/FactsBulkBar.tsx","../src/facts/FactsEmptyState.tsx","../src/facts/FactsFieldsButton.tsx","../src/facts/FactTimelineViews.tsx","../src/facts/FactsViewToggle.tsx","../src/facts/FactsToolbar.tsx","../src/facts/FactSearchParts.tsx","../src/facts/fact-table-column-resize.ts","../src/facts/FactSourceGroup.tsx","../src/facts/FactLabelsCell.tsx","../src/facts/factColumns.tsx","../src/facts/FactRowActions.tsx"],"names":["jsxs","cn","jsx","Tooltip","TooltipTrigger","testIdOr","Info","TooltipContent","Button","Loader2","Trash2","useMemo","useState","ChevronLeft","ChevronRight","listTimeZones","factDateFieldsToSpan","formatSpan","detectTimeZone","Popover","PopoverTrigger","CalendarDays","PopoverContent","Input","EMPTY_FACT_DATE_FIELDS","X","SelectionBar","Fragment","SelectionBarAction","Paperclip","Tags","DropdownMenu","DropdownMenuTrigger","MoreHorizontal","DropdownMenuContent","DropdownMenuItem","FolderUp","DropdownMenuSeparator","CalendarClock","Scale","Lightbulb","Milestone","ArrowRight","Columns3","ChevronDown","Command","CommandList","CommandGroup","CommandItem","RotateCcw","CommandSeparator","Check","useRef","useEffect","TimelineCalendar","TimelineGantt","Table2","CalendarRange","GanttChartSquare","Search","ViewToggle","observeResize","FilterInput","BookMarked","TabHeader","Plus","SearchHit","TagEntity","CheckCircle2","CornerDownLeft","document","memo","FactLabelsCell","PencilLine","CommandInput","CommandEmpty","decodeWhitespaceEntities","Quote","MoreVertical","Pencil"],"mappings":"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","file":"chunk-D3ABKS7T.cjs","sourcesContent":["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","/**\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, listTimeZones } from '../calendar/zone'\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(() => listTimeZones(), [])\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 { FolderUp, MoreHorizontal, Paperclip, 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 removeFromChat: string\n addToChat: 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 removeFromChatTooltip: (pluralNoun: string) => string\n addToChatTooltip: (pluralNoun: string) => string\n labelTooltip: (pluralNoun: string) => string\n}\n\nexport const DEFAULT_FACTS_BULK_BAR_LABELS: FactsBulkBarLabels = {\n removeFromChat: 'Remove from Chat',\n addToChat: 'Add to Chat',\n label: 'Label',\n shared: 'Shared',\n more: 'More',\n export: 'Export',\n delete: 'Delete',\n budgetHint:\n \"Facts added to this chat are always in ARBI's context for this chat, so they 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 removeFromChatTooltip: (n) => `Remove the selected ${n} from this chat`,\n addToChatTooltip: (n) => `Add the selected ${n} to this chat, so they are always in its context`,\n labelTooltip: (n) => `Add or remove labels from selected ${n}`,\n}\n\nexport interface FactsBulkBarTestIds {\n budget: string\n inChat: 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 in the current chat (the action then removes). */\n allSelectedInChat: boolean\n /** Add the selection to the current chat, or take it out (absent: no chat, no action). */\n onToggleInChat?: () => void\n /** Label the selection (absent: no action). */\n onLabel?: () => void\n /** The aggregate Shared switch for the selection (the app binds its toggle). */\n sharedToggle: ReactNode\n /** Export the selection (absent: no action). */\n onExport?: () => void\n onDelete: () => void\n /** The current chat's facts token budget, shown at the left (the chat's facts, 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: Add to Chat, 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 allSelectedInChat,\n onToggleInChat,\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-chat-budget' })}\n >\n {l.budget(budget.tokens.toLocaleString(), budget.cap.toLocaleString())}\n </span>\n ) : null\n }\n >\n {(isCompact) => (\n <>\n {onToggleInChat && (\n <SelectionBarAction\n icon={Paperclip}\n label={allSelectedInChat ? l.removeFromChat : l.addToChat}\n onClick={onToggleInChat}\n disabled={none}\n isCompact={isCompact}\n className=\"border-blue-border text-blue-text hover:bg-blue-bg hover:text-blue-text\"\n tooltip={\n allSelectedInChat\n ? l.removeFromChatTooltip(pluralNoun)\n : l.addToChatTooltip(pluralNoun)\n }\n testId={testIdOr(testIds?.inChat, { testId: 'bulk-in-chat-facts-button' })}\n />\n )}\n {onLabel && (\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 )}\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 {onExport && (\n <>\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 </>\n )}\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 { 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","/**\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: { in_chat: 'In chat' },\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","/**\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","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 { CheckCircle2, CornerDownLeft, Loader2, Paperclip, Search, X } from 'lucide-react'\nimport { Button, TagEntity } 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 inChat: string\n verified: string\n open: string\n}\n\nexport const DEFAULT_FACT_SEARCH_RESULT_LABELS: FactSearchResultLabels = {\n inChat: 'In this chat',\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 /** The fact is in the host's current chat. */\n isInChat?: 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 In this chat) and the Verified mark. */\nexport function FactSearchResult({\n id,\n rank,\n text,\n terms,\n renderSnippet,\n labels,\n isInChat,\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 {isInChat && (\n <span\n className=\"inline-flex items-center gap-1 pr-1\"\n data-testid={`facts-smart-search-hit-in-chat-${id}`}\n >\n <Paperclip className=\"size-3\" /> {l.inChat}\n </span>\n )}\n {labels.map((tag) => (\n <TagEntity\n key={tag.id}\n tag={{ external_id: tag.id, name: tag.name, color: tag.color }}\n size=\"sm\"\n showTooltip={false}\n />\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","/**\n * Drag-to-resize columns for the tables rendered inside the fact editor's\n * MDXEditor.\n *\n * MDXEditor's table has no built-in column resizing, but it renders a\n * `<colgroup>` of `<col>` elements — one per column plus the leading/trailing\n * tool columns. Column widths are honoured by setting a width on those `<col>`\n * elements and switching the table to `table-layout: fixed`. MDXEditor only\n * manages each `<col>`'s `className` (alignment), so an inline `style.width`\n * survives typing edits; it only resets when the column count changes (a new\n * `<colgroup>` is rendered) — acceptable for an editing-time affordance, since\n * markdown tables can't store widths anyway.\n *\n * Wiring: attach once to the editor container. Listeners are delegated, so\n * they work for tables that appear/disappear as the user edits. Returns a\n * cleanup that removes every listener and any lingering drag state.\n */\n\n/** How close (px) to a cell's right edge the pointer must be to grab it. */\nconst EDGE = 6\n/** Never let a column get narrower than this (px). */\nconst MIN_WIDTH = 48\n\ninterface DragState {\n col: HTMLTableColElement\n table: HTMLTableElement\n startX: number\n startWidth: number\n}\n\nexport function enableFactTableColumnResize(container: HTMLElement): () => void {\n let drag: DragState | null = null\n\n const cellFromEvent = (e: PointerEvent): HTMLTableCellElement | null => {\n const el = e.target as HTMLElement | null\n const cell = el?.closest?.('td, th') as HTMLTableCellElement | null\n // Only content cells resize — never the row/column tool cells.\n if (!cell || cell.hasAttribute('data-tool-cell')) return null\n if (!container.contains(cell)) return null\n return cell\n }\n\n const nearRightEdge = (cell: HTMLTableCellElement, clientX: number): boolean => {\n const rect = cell.getBoundingClientRect()\n return clientX >= rect.right - EDGE && clientX <= rect.right + 2\n }\n\n /** The `<col>` that governs `cell`'s column. Body rows and the colgroup both\n * lead with a tool element, so the cell's index in its row maps 1:1 to the\n * colgroup child index. */\n const colForCell = (cell: HTMLTableCellElement): HTMLTableColElement | null => {\n const row = cell.parentElement\n const table = cell.closest('table')\n const colgroup = table?.querySelector('colgroup')\n if (!row || !table || !colgroup) return null\n const index = Array.prototype.indexOf.call(row.children, cell)\n return (colgroup.children[index] as HTMLTableColElement | undefined) ?? null\n }\n\n /** Freeze every column at its current rendered width before switching to a\n * fixed layout, so grabbing a border doesn't make the whole table jump. The\n * header row has a cell for every colgroup entry (incl. the tool columns),\n * so it's the reliable ruler. */\n const freezeWidths = (table: HTMLTableElement) => {\n const colgroup = table.querySelector('colgroup')\n if (!colgroup) return\n const ruler = table.querySelector('thead tr') ?? table.querySelector('tbody tr')\n const cells = ruler ? Array.from(ruler.children) : []\n Array.from(colgroup.children).forEach((node, i) => {\n const col = node as HTMLTableColElement\n const cell = cells[i] as HTMLElement | undefined\n if (!col.style.width && cell) col.style.width = `${cell.getBoundingClientRect().width}px`\n })\n table.style.tableLayout = 'fixed'\n }\n\n const onPointerMove = (e: PointerEvent) => {\n if (drag) {\n const next = Math.max(MIN_WIDTH, drag.startWidth + (e.clientX - drag.startX))\n drag.col.style.width = `${next}px`\n e.preventDefault()\n return\n }\n // Hover affordance: show the resize cursor only in a cell's right margin.\n const cell = cellFromEvent(e)\n if (cell && nearRightEdge(cell, e.clientX)) {\n cell.style.cursor = 'col-resize'\n } else if (cell) {\n cell.style.cursor = ''\n }\n }\n\n const endDrag = () => {\n if (!drag) return\n drag = null\n document.documentElement.classList.remove('fact-col-resizing')\n document.removeEventListener('pointermove', onPointerMove, true)\n document.removeEventListener('pointerup', endDrag, true)\n }\n\n const onPointerDown = (e: PointerEvent) => {\n if (e.button !== 0) return\n const cell = cellFromEvent(e)\n if (!cell || !nearRightEdge(cell, e.clientX)) return\n const table = cell.closest('table') as HTMLTableElement | null\n if (!table) return\n freezeWidths(table)\n const col = colForCell(cell)\n if (!col) return\n drag = {\n col,\n table,\n startX: e.clientX,\n startWidth: parseFloat(col.style.width) || cell.getBoundingClientRect().width,\n }\n // Grab the border, not the caret: suppress the click-to-edit + selection.\n e.preventDefault()\n document.documentElement.classList.add('fact-col-resizing')\n document.addEventListener('pointermove', onPointerMove, true)\n document.addEventListener('pointerup', endDrag, true)\n }\n\n container.addEventListener('pointerdown', onPointerDown)\n container.addEventListener('pointermove', onPointerMove)\n\n return () => {\n endDrag()\n container.removeEventListener('pointerdown', onPointerDown)\n container.removeEventListener('pointermove', onPointerMove)\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 /** Remove this document from the sources. Absent: a read-only list, no remove control. */\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 {onRemove && (\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 )}\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","import { memo, useEffect, useMemo, useRef, useState } from 'react'\nimport { PencilLine } from 'lucide-react'\nimport {\n TagEntity,\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 <TagEntity\n key={o.id}\n tag={{ external_id: o.id, name: o.name, color: o.color }}\n size=\"sm\"\n showTooltip={false}\n />\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 <TagEntity\n tag={{ external_id: o.id, name: o.name, color: o.color }}\n checked={isApplied}\n onCheckedChange={() => toggle(o)}\n size=\"sm\"\n showTooltip={false}\n />\n </CommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n )}\n </Popover>\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, Paperclip, 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 inChatHeaderTooltip: string\n inChatTitle: string\n notInChatTitle: string\n removeFromChat: string\n addToChat: 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 inChatHeaderTooltip: 'Facts added to this chat are always in context for this chat',\n inChatTitle: 'In this chat — always in context for it. Click to remove from chat.',\n notInChatTitle: 'Add to chat — always in context for this chat',\n removeFromChat: 'Remove from chat',\n addToChat: 'Add to chat',\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 inChat: (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 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 /** Whether the fact is in the host's current chat. With `onToggleInChat`, adds the In chat\n * column; a host without chats leaves both out. Read at render time: the host refreshes the\n * column when its chat changes. */\n isInChat?: (fact: T) => boolean\n /** Add the fact to the current chat, or take it out. */\n onToggleInChat?: (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 'in_chat',\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 { isInChat, onToggleInChat } = slots\n const inChatColumn: ColDef<T>[] =\n isInChat && onToggleInChat\n ? [\n {\n colId: 'in_chat',\n headerName: '',\n headerComponent: () => (\n <span className=\"flex size-full items-center justify-center\">\n <Paperclip className=\"size-3.5 text-muted-foreground\" />\n </span>\n ),\n valueGetter: (params: ValueGetterParams<T>) =>\n params.data ? isInChat(params.data) : false,\n width: 44,\n minWidth: 44,\n maxWidth: 44,\n sortable: true,\n resizable: false,\n headerTooltip: l.inChatHeaderTooltip,\n cellClass: 'cell-hcenter',\n // A toggle, not a readout: a fact in the chat rides every message of it, so it flips\n // in place.\n cellRenderer: (params: ICellRendererParams<T>) => {\n if (!params.data) return null\n const fact = params.data\n const inChat = isInChat(fact)\n return (\n <button\n type=\"button\"\n onClick={() => onToggleInChat(fact)}\n title={inChat ? l.inChatTitle : l.notInChatTitle}\n aria-label={inChat ? l.removeFromChat : l.addToChat}\n aria-pressed={inChat}\n data-testid={testIdOr(ids?.inChat?.(fact.external_id), {\n testId: `facts-grid-in-chat-${fact.external_id}`,\n })}\n className=\"flex h-full items-center\"\n >\n <Paperclip\n className={cn(\n 'size-3.5',\n inChat\n ? 'text-primary'\n : 'text-muted-foreground/30 transition-colors hover:text-muted-foreground'\n )}\n />\n </button>\n )\n },\n },\n ]\n : []\n\n const columns: ColDef<T>[] = [\n ...inChatColumn,\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 (`&#x20;` 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"]}
1
+ {"version":3,"sources":["../src/facts/FactComposer.tsx","../src/facts/FactDateInput.tsx","../src/facts/FactsBulkBar.tsx","../src/facts/FactsEmptyState.tsx","../src/facts/FactsFieldsButton.tsx","../src/facts/FactTimelineViews.tsx","../src/facts/FactsViewToggle.tsx","../src/facts/FactsToolbar.tsx","../src/facts/FactSearchParts.tsx","../src/facts/fact-table-column-resize.ts","../src/facts/FactSourceGroup.tsx","../src/facts/FactLabelsCell.tsx","../src/facts/factColumns.tsx","../src/facts/FactRowActions.tsx"],"names":["jsxs","cn","jsx","Tooltip","TooltipTrigger","testIdOr","Info","TooltipContent","Button","Loader2","Trash2","useMemo","useState","ChevronLeft","ChevronRight","listTimeZones","factDateFieldsToSpan","formatSpan","detectTimeZone","Popover","PopoverTrigger","CalendarDays","PopoverContent","Input","EMPTY_FACT_DATE_FIELDS","X","SelectionBar","Fragment","SelectionBarAction","Paperclip","Tags","DropdownMenu","DropdownMenuTrigger","MoreHorizontal","DropdownMenuContent","DropdownMenuItem","FolderUp","DropdownMenuSeparator","CalendarClock","Scale","Lightbulb","Milestone","ArrowRight","Columns3","ChevronDown","Command","CommandList","CommandGroup","CommandItem","RotateCcw","CommandSeparator","Check","useRef","useEffect","TimelineCalendar","TimelineGantt","Table2","CalendarRange","GanttChartSquare","Search","ViewToggle","observeResize","FilterInput","BookMarked","TabHeader","Plus","SearchHit","TagEntity","CheckCircle2","CornerDownLeft","document","memo","FactLabelsCell","PencilLine","CommandInput","CommandEmpty","decodeWhitespaceEntities","Quote","MoreVertical","Pencil"],"mappings":";;;;;;;;;;;;;;;;;;AAiBO,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,uBACEA,eAAA,CAAC,SAAI,SAAA,EAAWC,KAAA,CAAG,yBAAyB,SAAS,CAAA,EAAG,aAAU,gBAAA,EAChE,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAuC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAC7DA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAW,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,uBACEF,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAwB,aAAU,kBAAA,EAC/C,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,MAAA,EAAA,EAAK,WAAU,6DAAA,EACb,QAAA,EAAA;AAAA,MAAA,CAAA,CAAE,OAAA;AAAA,sCACFG,UAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,cAAA,CAACE,iBAAA,EAAA,EAAe,SAAO,IAAA,EACrB,QAAA,kBAAAF,cAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,cAAY,CAAA,CAAE,UAAA;AAAA,YACd,SAAA,EAAU,6CAAA;AAAA,YACV,eAAaG,0BAAA,CAAS,UAAA,EAAY,EAAE,MAAA,EAAQ,qBAAqB,CAAA;AAAA,YAEjE,QAAA,kBAAAH,cAAA,CAACI,gBAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA,SAC7B,EACF,CAAA;AAAA,wBACAJ,cAAA,CAACK,iBAAA,EAAA,EAAe,SAAA,EAAU,UAAA,EAAY,YAAE,IAAA,EAAK;AAAA,OAAA,EAC/C;AAAA,KAAA,EACF,CAAA;AAAA,oBACAP,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,MAAA;AAAA,sBACDE,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAkB,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,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWD,KAAA;AAAA,QACT,gFAAA;AAAA,QACA,SAAS,6BAAA,GAAgC;AAAA,OAC3C;AAAA,MACA,WAAA,EAAU,eAAA;AAAA,MAEV,QAAA,kBAAAC,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACb,QAAA,kBAAAF,eAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,8EAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,cAAA,MAAA;AAAA,8BACDA,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,gCAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6CAAA,EACb,QAAA,EAAA;AAAA,kCAAAE,cAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,eAAaG,0BAAA,CAAS,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,4BAA4B,CAAA;AAAA,sBAC3E,SAAA,EAAU,sBAAA;AAAA,sBAET,QAAA,EAAA;AAAA;AAAA,mBACH;AAAA,kCACAL,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,oCAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6DAAA,EACZ,QAAA,EAAA;AAAA,sBAAA,YAAA;AAAA,sBACA,CAAA,CAAE;AAAA,qBAAA,EACL,CAAA;AAAA,oCACAA,eAAA,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,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACb,QAAA,EAAA;AAAA,kCAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4CAAA,EACb,QAAA,EAAA;AAAA,oCAAAE,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAuC,QAAA,EAAA,CAAA,CAAE,KAAA,EAAM,CAAA;AAAA,oBAC9D;AAAA,mBAAA,EACH,CAAA;AAAA,kCACAF,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4EAAA,EACZ,QAAA,EAAA;AAAA,oBAAA,SAAA,oBACCE,cAAA;AAAA,sBAACM,SAAA;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,EAAaH,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,kCACEI,mBAAA,EAAA,EAAQ,SAAA,EAAU,yBAAwB,CAAA,mBAE3CP,cAAA,CAACQ,kBAAA,EAAA,EAAO,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA,qBAEjC;AAAA,oCAEFR,cAAA;AAAA,sBAACM,SAAA;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,oCACAN,cAAA;AAAA,sBAACM,SAAA;AAAA,sBAAA;AAAA,wBACC,IAAA,EAAK,IAAA;AAAA,wBACL,SAAA,EAAU,yBAAA;AAAA,wBACV,UAAU,CAAC,OAAA;AAAA,wBACX,OAAA,EAAS,MAAA;AAAA,wBACT,eAAaH,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,KAAA,oBACCH,cAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,0BAAA;AAAA,gBACV,eAAaG,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;AChOO,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,GAAUM,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,GAAIC,eAAS,OAAO,CAAA;AAIxC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAA2B,MAAM,CAAA;AACzD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,IAAIA,cAAA,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,uBACEZ,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,sBAAAE,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,CAACW,uBAAA,EAAA,EAAY,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,OAClC;AAAA,MACC,IAAA,KAAS,yBACRb,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,eAAaK,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,mBAEAL,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,sBAEFE,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,CAACY,wBAAA,EAAA,EAAa,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA;AACnC,KAAA,EACF,CAAA;AAAA,IACC,SAAS,MAAA,mBACRd,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0BAAA,EACZ,QAAA,EAAA;AAAA,MAAA,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,qBACfE,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,EAAaG,0BAAA,CAAS,OAAA,EAAS,GAAA,GAAM,GAAG,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAA,kBAAA,EAAqB,GAAG,CAAA,CAAA,EAAI,CAAA;AAAA,YACjF,SAAA,EAAWJ,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,mBAEAC,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,EAAaG,0BAAA,CAAS,OAAA,EAAS,IAAA,GAAO,CAAC,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAA,mBAAA,EAAsB,CAAC,CAAA,CAAA,EAAI,CAAA;AAAA,QAC/E,SAAA,EAAWJ,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,GAAIW,eAAS,KAAK,CAAA;AACtC,EAAA,MAAM,YAAYD,aAAA,CAAQ,MAAMI,+BAAA,EAAc,EAAG,EAAE,CAAA;AACnD,EAAA,MAAM,cAAA,GAAiB,GAAG,QAAQ,CAAA,iBAAA,CAAA;AAOlC,EAAA,MAAM,IAAA,GAAOC,uCAAqB,KAAK,CAAA;AACvC,EAAA,MAAM,OAAA,GACJ,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,UAChB,kBAAA,CAAmB,KAAK,CAAA,GACxBC,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,IAAYC,kCAAe,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,uBACEhB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,0BAAAF,eAAAA,CAACmB,UAAA,EAAA,EAAQ,IAAA,EAAY,YAAA,EAAc,OAAA,EACjC,QAAA,EAAA;AAAA,oBAAAjB,cAAAA,CAACkB,iBAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAApB,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAWC,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,0BAAAC,cAAAA,CAACmB,wBAAA,EAAA,EAAa,SAAA,EAAU,uCAAA,EAAwC,CAAA;AAAA,0BAChEnB,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,UAAA,EAAY,QAAA,EAAA,OAAA,IAAW,EAAE,OAAA,EAAQ;AAAA;AAAA;AAAA,KACnD,EACF,CAAA;AAAA,oBACAF,eAAAA,CAACsB,iBAAA,EAAA,EAAe,SAAA,EAAU,YAAA,EAAa,OAAM,OAAA,EAC3C,QAAA,EAAA;AAAA,sBAAApB,cAAAA,CAAC,iBAAc,QAAA,EAAU,KAAA,CAAM,MAAM,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,CAAA,EAAG,OAAA,EAAkB,CAAA;AAAA,MAEpF,MAAM,IAAA,oBACLF,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,4BAAAE,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA6C,YAAE,SAAA,EAAU,CAAA;AAAA,4BACzEA,cAAAA;AAAA,cAACqB,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,0BACAvB,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EACf,QAAA,EAAA;AAAA,4BAAAE,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA6C,YAAE,OAAA,EAAQ,CAAA;AAAA,4BACvEA,cAAAA;AAAA,cAACqB,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,oBACLvB,eAAAA,CAAC,OAAA,EAAA,EAAM,WAAU,qBAAA,EACf,QAAA,EAAA;AAAA,0BAAAE,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA6C,YAAE,QAAA,EAAS,CAAA;AAAA,0BACxEA,cAAAA;AAAA,YAACqB,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,aAAaL,gCAAA,EAAe;AAAA,cAC5B,SAAA,EAAU,aAAA;AAAA,cACV,aAAA,EAAa,GAAG,QAAQ,CAAA,SAAA;AAAA;AAAA,WAC1B;AAAA,0BACAhB,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,wBAGFF,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EACf,QAAA,EAAA;AAAA,0BAAAE,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA6C,YAAE,OAAA,EAAQ,CAAA;AAAA,0BACvEA,cAAAA;AAAA,YAACqB,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,wBAEAvB,eAAAA;AAAA,UAACQ,SAAAA;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,CAASgB,wCAAsB,CAAA;AAAA,YAC9C,aAAA,EAAa,GAAG,QAAQ,CAAA,WAAA,CAAA;AAAA,YAExB,QAAA,EAAA;AAAA,8BAAAtB,cAAAA,CAACuB,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;ACpWO,IAAM,6BAAA,GAAoD;AAAA,EAC/D,cAAA,EAAgB,kBAAA;AAAA,EAChB,SAAA,EAAW,aAAA;AAAA,EACX,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,qLAAA;AAAA,EACF,QAAQ,CAAC,MAAA,EAAQ,QAAQ,CAAA,CAAA,EAAI,MAAM,IAAI,GAAG,CAAA,OAAA,CAAA;AAAA,EAC1C,qBAAA,EAAuB,CAAC,CAAA,KAAM,CAAA,oBAAA,EAAuB,CAAC,CAAA,eAAA,CAAA;AAAA,EACtD,gBAAA,EAAkB,CAAC,CAAA,KAAM,CAAA,iBAAA,EAAoB,CAAC,CAAA,gDAAA,CAAA;AAAA,EAC9C,YAAA,EAAc,CAAC,CAAA,KAAM,CAAA,mCAAA,EAAsC,CAAC,CAAA;AAC9D;AAsCO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;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,uBACEvB,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EAAO,WAAA,EAAU,kBAC9B,QAAA,kBAAAA,cAAAA;AAAA,IAACwB,8BAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA,EACE,yBACExB,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAWD,KAAAA;AAAA,YACT,+BAAA;AAAA,YACA,MAAA,CAAO,SAAS,kBAAA,GAAqB;AAAA,WACvC;AAAA,UACA,OAAO,CAAA,CAAE,UAAA;AAAA,UACT,eAAaI,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,qBACAL,eAAAA,CAAA2B,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,QAAA,cAAA,oBACCzB,cAAAA;AAAA,UAAC0B,oCAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAMC,qBAAA;AAAA,YACN,KAAA,EAAO,iBAAA,GAAoB,CAAA,CAAE,cAAA,GAAiB,CAAA,CAAE,SAAA;AAAA,YAChD,OAAA,EAAS,cAAA;AAAA,YACT,QAAA,EAAU,IAAA;AAAA,YACV,SAAA;AAAA,YACA,SAAA,EAAU,yEAAA;AAAA,YACV,OAAA,EACE,oBACI,CAAA,CAAE,qBAAA,CAAsB,UAAU,CAAA,GAClC,CAAA,CAAE,iBAAiB,UAAU,CAAA;AAAA,YAEnC,QAAQxB,0BAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,6BAA6B;AAAA;AAAA,SAC3E;AAAA,QAED,2BACCH,cAAAA;AAAA,UAAC0B,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,QAAQzB,0BAAA,CAAS,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,2BAA2B;AAAA;AAAA,SACxE;AAAA,wBAEFL,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0FAAA,EACZ,QAAA,EAAA;AAAA,UAAA,YAAA;AAAA,UACA,CAAC,6BAAaE,cAAAA,CAAC,UAAK,SAAA,EAAU,+BAAA,EAAiC,YAAE,MAAA,EAAO;AAAA,SAAA,EAC3E,CAAA;AAAA,wBACAF,gBAAC+B,eAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA7B,cAAAA,CAAC8B,sBAAA,EAAA,EAAoB,OAAA,EAAO,IAAA,EAC1B,QAAA,kBAAAhC,eAAAA;AAAA,YAACQ,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,eAAaH,0BAAA,CAAS,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,0BAA0B,CAAA;AAAA,cAEzE,QAAA,EAAA;AAAA,gCAAAH,cAAAA,CAAC+B,0BAAA,EAAA,EAAe,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,gBAClC,CAAC,6BAAa/B,cAAAA,CAAC,UAAK,SAAA,EAAU,SAAA,EAAW,YAAE,IAAA,EAAK;AAAA;AAAA;AAAA,WACnD,EACF,CAAA;AAAA,0BACAF,eAAAA,CAACkC,sBAAA,EAAA,EAAoB,KAAA,EAAM,KAAA,EACxB,QAAA,EAAA;AAAA,YAAA,QAAA,oBACClC,gBAAA2B,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAA3B,eAAAA;AAAA,gBAACmC,mBAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,QAAA;AAAA,kBACT,QAAA,EAAU,IAAA;AAAA,kBACV,eAAa9B,0BAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,uBAAuB,CAAA;AAAA,kBAExE,QAAA,EAAA;AAAA,oCAAAH,cAAAA,CAACkC,oBAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,oBACjC,CAAA,CAAE;AAAA;AAAA;AAAA,eACL;AAAA,8BACAlC,eAACmC,wBAAA,EAAA,EAAsB;AAAA,aAAA,EACzB,CAAA;AAAA,4BAEFrC,eAAAA;AAAA,cAACmC,mBAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,QAAA;AAAA,gBACT,QAAA,EAAU,IAAA;AAAA,gBACV,SAAA,EAAU,mCAAA;AAAA,gBACV,eAAa9B,0BAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,4BAA4B,CAAA;AAAA,gBAE7E,QAAA,EAAA;AAAA,kCAAAH,cAAAA,CAACQ,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;AClLO,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,CAAC4B,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,uBACEtC,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,kDAAA;AAAA,MACV,eAAaG,0BAAA,CAAS,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,0BAA0B,CAAA;AAAA,MACzE,WAAA,EAAU,mBAAA;AAAA,MAEV,QAAA,kBAAAL,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,wBAAAE,cAAAA,CAAC,SAAI,SAAA,EAAU,mGAAA,EACb,0BAAAA,cAAAA,CAACuC,qBAAA,EAAA,EAAU,SAAA,EAAU,QAAA,EAAS,CAAA,EAChC,CAAA;AAAA,wBAEAvC,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,uBACEF,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,8BAAAE,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,qBACfF,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,eAAaK,0BAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,sBAAsB,CAAA;AAAA,YAEvE,QAAA,EAAA;AAAA,cAAA,IAAA;AAAA,8BACDH,cAAAA,CAACwC,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,uBACE1C,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EACb,QAAA,EAAA;AAAA,oBAAAE,cAAAA,CAACO,mBAAAA,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,uBACET,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wEAAA,EACb,QAAA,EAAA;AAAA,oBAAAE,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,oBACtDA,cAAAA,CAACM,SAAAA,EAAA,EAAO,OAAA,EAAQ,WAAU,IAAA,EAAK,IAAA,EAAK,OAAA,EAAS,OAAA,EAC1C,QAAA,EAAA,UAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;ACxGO,IAAM,kCAAA,GAA8D;AAAA,EACzE,MAAA,EAAQ,QAAA;AAAA,EACR,WAAA,EAAa,cAAA;AAAA,EACb,OAAA,EAAS,SAAA;AAAA,EACT,WAAA,EAAa,EAAE,OAAA,EAAS,SAAA;AAC1B;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,GAAII,eAAS,KAAK,CAAA;AAEtC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,CAAC,CAAA;AAExC,EAAA,MAAM,OAAA,GAAUD,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,uBACEX,eAAAA,CAACmB,UAAAA,EAAA,EAAQ,IAAA,EAAY,cAAc,OAAA,EACjC,QAAA,EAAA;AAAA,oBAAAjB,cAAAA,CAACkB,iBAAAA,EAAA,EAAe,OAAA,EAAO,MACrB,QAAA,kBAAApB,eAAAA;AAAA,MAACQ,SAAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAK,IAAA;AAAA,QACL,SAAA,EAAU,kFAAA;AAAA,QACV,eAAaH,0BAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,wBAAwB,CAAA;AAAA,QAE1E,QAAA,EAAA;AAAA,0BAAAH,cAAAA,CAACyC,oBAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,UAC9B,CAAA,CAAE,MAAA;AAAA,0BACHzC,cAAAA,CAAC0C,uBAAA,EAAA,EAAY,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA;AAAA,KAClC,EACF,CAAA;AAAA,oBACA1C,eAACoB,iBAAAA,EAAA,EAAe,WAAU,eAAA,EAAgB,KAAA,EAAM,OAAM,IAAA,EAAK,QAAA,EAAS,YAAY,CAAA,EAC9E,QAAA,kBAAApB,eAAC2C,UAAA,EAAA,EAAQ,YAAA,EAAc,OACrB,QAAA,kBAAA7C,eAAAA,CAAC8C,cAAA,EAAA,EAAY,SAAA,EAAU,eAAA,EACrB,QAAA,EAAA;AAAA,sBAAA5C,cAAAA,CAAC6C,mBACC,QAAA,kBAAA/C,eAAAA;AAAA,QAACgD,cAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,cAAA;AAAA,UACV,SAAA,EAAU,8CAAA;AAAA,UACV,aAAA,EAAa3C,0BAAA,CAAS,OAAA,EAAS,WAAA,EAAa;AAAA,YAC1C,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,UAED,QAAA,EAAA;AAAA,4BAAAH,cAAAA,CAAC+C,qBAAA,EAAA,EAAU,SAAA,EAAU,eAAA,EAAgB,CAAA;AAAA,YACpC,CAAA,CAAE;AAAA;AAAA;AAAA,OACL,EACF,CAAA;AAAA,sBACA/C,eAACgD,mBAAA,EAAA,EAAiB,CAAA;AAAA,sBAClBhD,cAAAA,CAAC6C,eAAA,EAAA,EAAa,OAAA,EAAS,CAAA,CAAE,SACtB,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,qBACZ/C,eAAAA;AAAA,QAACgD,cAAA;AAAA,QAAA;AAAA,UAEC,UAAU,MAAM,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,IAAI,OAAO,CAAA;AAAA,UAC7C,SAAA,EAAU,wBAAA;AAAA,UACV,eAAa3C,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,4BAAAH,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAWD,KAAAA;AAAA,kBACT,iFAAA;AAAA,kBACA,GAAA,CAAI,UACA,oCAAA,GACA;AAAA,iBACN;AAAA,gBAEA,QAAA,kBAAAC,cAAAA,CAACiD,iBAAA,EAAA,EAAM,SAAA,EAAU,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,iBAAiB9C,0BAAA,CAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,kBAAkB,CAAA;AACpE,EAAA,MAAM,KAAA,GAAQM,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,GAAUyC,aAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,UAAU/C,0BAAA,CAAS,MAAA,IAAU,GAAG,MAAM,CAAA,OAAA,EAAU,UAAU,CAAA,CAAA,EAAI;AAAA,IAClE,MAAA,EAAQ,wBAAwB,UAAU,CAAA;AAAA,GAC3C,CAAA;AACD,EAAAgD,eAAA,CAAU,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,uBACEnD,eAAC,KAAA,EAAA,EAAI,GAAA,EAAK,SAAS,SAAA,EAAU,+BAAA,EAAgC,WAAA,EAAU,gBAAA,EACrE,QAAA,kBAAAA,cAAAA;AAAA,IAACoD,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,uBACEpD,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2CAAA,EAA4C,WAAA,EAAU,eACnE,QAAA,kBAAAA,cAAAA;AAAA,IAACqD,+BAAA;AAAA,IAAA;AAAA,MACC,QAAQlD,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;AC5FO,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,kBAAMH,cAAAA,CAACsD,kBAAA,EAAA,EAAO,SAAA,EAAU,UAAA,EAAW,CAAA,EAAI,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM;AAAA,EACxE,EAAE,KAAA,EAAO,UAAA,EAAY,IAAA,kBAAMtD,cAAAA,CAACuD,yBAAA,EAAA,EAAc,SAAA,EAAU,UAAA,EAAW,CAAA,EAAI,KAAA,EAAO,CAAA,CAAE,QAAA,EAAS;AAAA,EACrF,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,kBAAMvD,cAAAA,CAACwD,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,kBAAMxD,cAAAA,CAACyD,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,uBACEzD,cAAAA;AAAA,IAAC0D,4BAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,KAAA,EAAO,QAAA;AAAA,MACP,QAAA,EAAU,CAAC,KAAA,KAAU,QAAA,CAAS,KAAsB,CAAA;AAAA,MACpD,cAAcvD,0BAAA,CAAS,YAAA,EAAc,EAAE,MAAA,EAAQ,gBAAgB,CAAA;AAAA,MAC/D,YAAY,CAAC,SAAA;AAAA,MACb,IAAA,EAAK;AAAA;AAAA,GACP;AAEJ;AC/DO,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,GAAY+C,aAAuB,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIxC,eAAS,KAAK,CAAA;AAG1D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC9C,EAAAyC,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,OAAOQ,+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,2BAAW3D,cAAAA,CAACuC,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,QAAQpC,0BAAA,CAAS,OAAA,EAAS,KAAK,EAAE,MAAA,EAAQ,aAAa,CAAA;AAAA,MACtD,YAAA,EAAc;AAAA;AAChB,GACF;AAIA,EAAA,MAAM,iCACJL,eAAAA,CAAC,SAAI,SAAA,EAAW,QAAA,GAAW,qCAAqC,2BAAA,EAC9D,QAAA,EAAA;AAAA,oBAAAE,cAAAA;AAAA,MAAC4D,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,8BACC9D,eAAAA;AAAA,MAACQ,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,eAAaH,0BAAA,CAAS,OAAA,EAAS,YAAY,EAAE,MAAA,EAAQ,qBAAqB,CAAA;AAAA,QAE1E,QAAA,EAAA;AAAA,0BAAAH,cAAAA,CAAC6D,sBAAA,EAAA,EAAW,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,0BACjC7D,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,YAAE,IAAA,EAAK;AAAA;AAAA;AAAA;AACpC,GAAA,EAEJ,CAAA;AAGF,EAAA,uBACEF,gBAAC,KAAA,EAAA,EAAI,GAAA,EAAK,WAAW,SAAA,EAAU,iCAAA,EAAkC,aAAU,eAAA,EACzE,QAAA,EAAA;AAAA,oBAAAE,cAAAA;AAAA,MAAC8D,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,mBACT9D,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,8BACEF,eAAAA;AAAA,UAACQ,SAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,SAAA;AAAA,YACT,eAAaH,0BAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,kBAAkB,CAAA;AAAA,YAEpE,QAAA,EAAA;AAAA,8BAAAH,cAAAA,CAAC+D,gBAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAgB,CAAA;AAAA,cAC/B,CAAA,CAAE;AAAA;AAAA;AAAA;AACL;AAAA,KAEJ;AAAA,IACC,4BACCjE,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,0DAAA;AAAA,QACV,WAAA,EAAU,qBAAA;AAAA,QAET,QAAA,EAAA;AAAA,UAAA,cAAA;AAAA,0BACDE,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,kCACCF,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,gGAAA;AAAA,QACV,eAAaK,0BAAA,CAAS,OAAA,EAAS,WAAW,EAAE,MAAA,EAAQ,oBAAoB,CAAA;AAAA,QAExE,QAAA,EAAA;AAAA,0BAAAH,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,UAAA;AAAA,cACL,SAAA,EAAU,yCAAA;AAAA,cACV,eAAaG,0BAAA,CAAS,OAAA,EAAS,cAAc,EAAE,MAAA,EAAQ,wBAAwB,CAAA;AAAA,cAE9E,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,0BACAH,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,MAAA,EAAQ,cAAA;AAAA,EACR,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,kBAAAF,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,wBAAAE,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,wBACAF,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yLAAA,EACb,QAAA,EAAA;AAAA,0BAAAE,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,eAAaG,0BAAA,CAAS,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,4BAA4B,CAAA;AAAA,cAC5E,SAAA,EAAS;AAAA;AAAA,WACX;AAAA,0BACAL,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACZ,QAAA,EAAA;AAAA,YAAA,KAAA,oBACCE,cAAAA;AAAA,cAACM,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,eAAaH,0BAAA,CAAS,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,4BAA4B,CAAA;AAAA,gBAE5E,QAAA,kBAAAH,cAAAA,CAACuB,aAAAA,EAAA,EAAE,WAAU,QAAA,EAAS;AAAA;AAAA,aACxB;AAAA,4BAEFvB,cAAAA;AAAA,cAACM,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,eAAaH,0BAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,6BAA6B,CAAA;AAAA,gBAC9E,OAAO,CAAA,CAAE,MAAA;AAAA,gBAER,QAAA,EAAA,WAAA,mBACCH,cAAAA,CAACO,mBAAAA,EAAA,EAAQ,SAAA,EAAU,qBAAA,EAAsB,CAAA,mBAEzCP,cAAAA,CAACyD,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,uBACEzD,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACb,QAAA,kBAAAA,cAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,gEAAA;AAAA,MACV,eAAaG,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,uBACEL,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4EAAA,EACb,QAAA,EAAA;AAAA,oBAAAE,cAAAA,CAACO,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,uBACEP,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iDAAA;AAAA,MACV,eAAaG,0BAAA,CAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,4BAA4B,CAAA;AAAA,MAEnE;AAAA;AAAA,GACH;AAEJ;AA8BO,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,uBACEL,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAyB,aAAU,iBAAA,EAChD,QAAA,EAAA;AAAA,oBAAAE,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,MAACgE,2BAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,gBAAA;AAAA,QACV,MAAA,EAAQ7D,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,wBACEL,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,gFAAA;AAAA,YACV,aAAA,EAAaK,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,oBACCL,eAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,qCAAA;AAAA,kBACV,aAAA,EAAa,kCAAkC,EAAE,CAAA,CAAA;AAAA,kBAEjD,QAAA,EAAA;AAAA,oCAAAE,cAAAA,CAAC2B,qBAAAA,EAAA,EAAU,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,oBAAE,GAAA;AAAA,oBAAE,CAAA,CAAE;AAAA;AAAA;AAAA,eACtC;AAAA,cAED,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,qBACX3B,cAAAA;AAAA,gBAACiE,YAAA;AAAA,gBAAA;AAAA,kBAEC,GAAA,EAAK,EAAE,WAAA,EAAa,GAAA,CAAI,EAAA,EAAI,MAAM,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,GAAA,CAAI,KAAA,EAAM;AAAA,kBAC7D,IAAA,EAAK,IAAA;AAAA,kBACL,WAAA,EAAa;AAAA,iBAAA;AAAA,gBAHR,GAAA,CAAI;AAAA,eAKZ;AAAA;AAAA;AAAA,SACH;AAAA,QAEF,WAAA,kBACEnE,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,EAAaK,0BAAA,CAAS,OAAA,EAAS,QAAA,GAAW,EAAE,CAAA,EAAG;AAAA,gBAC7C,MAAA,EAAQ,mCAAmC,EAAE,CAAA;AAAA,eAC9C,CAAA;AAAA,cAED,QAAA,EAAA;AAAA,gCAAAH,cAAAA,CAACkE,wBAAA,EAAA,EAAa,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,gBAAE,GAAA;AAAA,gBAAE,CAAA,CAAE;AAAA;AAAA;AAAA,WACzC;AAAA,0BAEFpE,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,YAAA,CAAA,CAAE,IAAA;AAAA,YAAK,GAAA;AAAA,4BAACE,cAAAA,CAACmE,0BAAA,EAAA,EAAe,SAAA,EAAU,QAAA,EAAS;AAAA,WAAA,EAC9C;AAAA,SAAA,EACF;AAAA;AAAA;AAEJ,GAAA,EACF,CAAA;AAEJ;;;AChRA,IAAM,IAAA,GAAO,CAAA;AAEb,IAAM,SAAA,GAAY,EAAA;AASX,SAAS,4BAA4B,SAAA,EAAoC;AAC9E,EAAA,IAAI,IAAA,GAAyB,IAAA;AAE7B,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAiD;AACtE,IAAA,MAAM,KAAK,CAAA,CAAE,MAAA;AACb,IAAA,MAAM,IAAA,GAAO,EAAA,EAAI,OAAA,GAAU,QAAQ,CAAA;AAEnC,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,YAAA,CAAa,gBAAgB,GAAG,OAAO,IAAA;AACzD,IAAA,IAAI,CAAC,SAAA,CAAU,QAAA,CAAS,IAAI,GAAG,OAAO,IAAA;AACtC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,IAAA,EAA4B,OAAA,KAA6B;AAC9E,IAAA,MAAM,IAAA,GAAO,KAAK,qBAAA,EAAsB;AACxC,IAAA,OAAO,WAAW,IAAA,CAAK,KAAA,GAAQ,IAAA,IAAQ,OAAA,IAAW,KAAK,KAAA,GAAQ,CAAA;AAAA,EACjE,CAAA;AAKA,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAA2D;AAC7E,IAAA,MAAM,MAAM,IAAA,CAAK,aAAA;AACjB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AAClC,IAAA,MAAM,QAAA,GAAW,KAAA,EAAO,aAAA,CAAc,UAAU,CAAA;AAChD,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,KAAA,IAAS,CAAC,UAAU,OAAO,IAAA;AACxC,IAAA,MAAM,QAAQ,KAAA,CAAM,SAAA,CAAU,QAAQ,IAAA,CAAK,GAAA,CAAI,UAAU,IAAI,CAAA;AAC7D,IAAA,OAAQ,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,IAAyC,IAAA;AAAA,EAC1E,CAAA;AAMA,EAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAA4B;AAChD,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,aAAA,CAAc,UAAU,CAAA;AAC/C,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,QAAQ,KAAA,CAAM,aAAA,CAAc,UAAU,CAAA,IAAK,KAAA,CAAM,cAAc,UAAU,CAAA;AAC/E,IAAA,MAAM,QAAQ,KAAA,GAAQ,KAAA,CAAM,KAAK,KAAA,CAAM,QAAQ,IAAI,EAAC;AACpD,IAAA,KAAA,CAAM,KAAK,QAAA,CAAS,QAAQ,EAAE,OAAA,CAAQ,CAAC,MAAM,CAAA,KAAM;AACjD,MAAA,MAAM,GAAA,GAAM,IAAA;AACZ,MAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,qBAAA,EAAsB,CAAE,KAAK,CAAA,EAAA,CAAA;AAAA,IACvF,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,MAAM,WAAA,GAAc,OAAA;AAAA,EAC5B,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAoB;AACzC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,SAAA,EAAW,KAAK,UAAA,IAAc,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,CAAA;AAC5E,MAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AAC9B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,cAAc,CAAC,CAAA;AAC5B,IAAA,IAAI,IAAA,IAAQ,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,OAAO,CAAA,EAAG;AAC1C,MAAA,IAAA,CAAK,MAAM,MAAA,GAAS,YAAA;AAAA,IACtB,WAAW,IAAA,EAAM;AACf,MAAA,IAAA,CAAK,MAAM,MAAA,GAAS,EAAA;AAAA,IACtB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAA,GAAO,IAAA;AACP,IAAA,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,MAAA,CAAO,mBAAmB,CAAA;AAC7D,IAAA,QAAA,CAAS,mBAAA,CAAoB,aAAA,EAAe,aAAA,EAAe,IAAI,CAAA;AAC/D,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,OAAA,EAAS,IAAI,CAAA;AAAA,EACzD,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAoB;AACzC,IAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AACpB,IAAA,MAAM,IAAA,GAAO,cAAc,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,cAAc,IAAA,EAAM,CAAA,CAAE,OAAO,CAAA,EAAG;AAC9C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AAClC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,MAAM,GAAA,GAAM,WAAW,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,IAAA,GAAO;AAAA,MACL,GAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAQ,CAAA,CAAE,OAAA;AAAA,MACV,UAAA,EAAY,WAAW,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,IAAK,IAAA,CAAK,uBAAsB,CAAE;AAAA,KAC1E;AAEA,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,GAAA,CAAI,mBAAmB,CAAA;AAC1D,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAA,EAAe,aAAA,EAAe,IAAI,CAAA;AAC5D,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,OAAA,EAAS,IAAI,CAAA;AAAA,EACtD,CAAA;AAEA,EAAA,SAAA,CAAU,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACvD,EAAA,SAAA,CAAU,gBAAA,CAAiB,eAAe,aAAa,CAAA;AAEvD,EAAA,OAAO,MAAM;AACX,IAAA,OAAA,EAAQ;AACR,IAAA,SAAA,CAAU,mBAAA,CAAoB,eAAe,aAAa,CAAA;AAC1D,IAAA,SAAA,CAAU,mBAAA,CAAoB,eAAe,aAAa,CAAA;AAAA,EAC5D,CAAA;AACF;ACzHO,IAAM,gCAAA,GAA0D;AAAA,EACrE,MAAA,EAAQ,sBAAA;AAAA,EACR,aAAA,EAAe;AACjB;AAwBO,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EACA,QAAA,EAAAC,SAAAA;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,uBACEtE,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,qBAAA;AAAA,MACV,aAAA,EAAaK,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,wBAAAL,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACZ,QAAA,EAAA;AAAA,UAAAsE,SAAAA;AAAA,0BACDpE,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,UACxB,4BACCA,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,EAAaG,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,kBAAAH,cAAAA,CAACuB,aAAAA,EAAA,EAAE,WAAU,QAAA,EAAS;AAAA;AAAA;AACxB,SAAA,EAEJ,CAAA;AAAA,QACC,WAAA,GACC,2BAEAvB,cAAAA,CAAC,UAAK,SAAA,EAAU,oCAAA,EAAsC,YAAE,aAAA,EAAc;AAAA;AAAA;AAAA,GAE1E;AAEJ;ACtDO,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,GAAiBqE,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,GAAI5D,eAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,EAAE,CAAA;AAEvC,EAAA,MAAM,OAAA,GAAUD,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,GAAWyC,aAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIxC,eAAS,KAAK,CAAA;AACpD,EAAAyC,gBAAU,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,OAAOQ,+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,uBACE7D,eAAAA;AAAA,IAACmB,UAAAA;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,wBAAAjB,cAAAA,CAACkB,iBAAAA,EAAA,EAAe,OAAA,EAAO,MACrB,QAAA,kBAAAlB,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,MAAA,EAAA,EAAK,WAAU,yCAAA,EACd,QAAA,kBAAAA,cAAAA,CAACuE,sBAAA,EAAA,EAAW,WAAU,UAAA,EAAW,CAAA,EACnC,oBAEAzE,eAAAA,CAAA2B,qBAAA,EACE,QAAA,EAAA;AAAA,8BAAAzB,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,qBACnBA,cAAAA;AAAA,oBAACiE,YAAAA;AAAA,oBAAA;AAAA,sBAEC,GAAA,EAAK,EAAE,WAAA,EAAa,CAAA,CAAE,EAAA,EAAI,MAAM,CAAA,CAAE,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM;AAAA,sBACvD,IAAA,EAAK,IAAA;AAAA,sBACL,WAAA,EAAa;AAAA,qBAAA;AAAA,oBAHR,CAAA,CAAE;AAAA,mBAKV;AAAA;AAAA,eACH;AAAA,cACC,+BACCjE,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,CAACoB,mBAAA,EAAe,SAAA,EAAU,iBAAgB,KAAA,EAAM,OAAA,EAAQ,IAAA,EAAK,QAAA,EAAS,YAAY,CAAA,EAChF,QAAA,kBAAAtB,gBAAC6C,UAAAA,EAAA,EAAQ,cAAc,IAAA,EACrB,QAAA,EAAA;AAAA,0BAAA3C,cAAAA;AAAA,YAACwE,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,0BACA1E,eAAAA,CAAC8C,cAAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAA5C,cAAAA,CAACyE,eAAA,EAAA,EACE,QAAA,EAAA,MAAA,CAAO,IAAA,qBACNzE,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,CAAC6C,eAAAA,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,uBACE7C,cAAAA;AAAA,gBAAC8C,cAAAA;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,eAAa3C,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,kBAAAH,cAAAA;AAAA,oBAACiE,YAAAA;AAAA,oBAAA;AAAA,sBACC,GAAA,EAAK,EAAE,WAAA,EAAa,CAAA,CAAE,EAAA,EAAI,MAAM,CAAA,CAAE,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM;AAAA,sBACvD,OAAA,EAAS,SAAA;AAAA,sBACT,eAAA,EAAiB,MAAM,MAAA,CAAO,CAAC,CAAA;AAAA,sBAC/B,IAAA,EAAK,IAAA;AAAA,sBACL,WAAA,EAAa;AAAA;AAAA;AACf,iBAAA;AAAA,gBAfK,CAAA,CAAE;AAAA,eAgBT;AAAA,YAEJ,CAAC,CAAA,EACH;AAAA,WAAA,EACF;AAAA,SAAA,EACF,CAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ,CAAC;AC9LM,IAAM,0BAAA,GAA+C;AAAA,EAC1D,mBAAA,EAAqB,8DAAA;AAAA,EACrB,WAAA,EAAa,0EAAA;AAAA,EACb,cAAA,EAAgB,oDAAA;AAAA,EAChB,cAAA,EAAgB,kBAAA;AAAA,EAChB,SAAA,EAAW,aAAA;AAAA,EACX,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;AAwDO,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,SAAA;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,EAAE,QAAA,EAAU,cAAA,EAAe,GAAI,KAAA;AACrC,EAAA,MAAM,YAAA,GACJ,YAAY,cAAA,GACR;AAAA,IACE;AAAA,MACE,KAAA,EAAO,SAAA;AAAA,MACP,UAAA,EAAY,EAAA;AAAA,MACZ,eAAA,EAAiB,sBACfjE,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACd,QAAA,kBAAAA,cAAAA,CAAC2B,qBAAAA,EAAA,EAAU,SAAA,EAAU,kCAAiC,CAAA,EACxD,CAAA;AAAA,MAEF,WAAA,EAAa,CAAC,MAAA,KACZ,MAAA,CAAO,OAAO,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA,GAAI,KAAA;AAAA,MACxC,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,MAAM,MAAA,GAAS,SAAS,IAAI,CAAA;AAC5B,QAAA,uBACE3B,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,cAAA,CAAe,IAAI,CAAA;AAAA,YAClC,KAAA,EAAO,MAAA,GAAS,CAAA,CAAE,WAAA,GAAc,CAAA,CAAE,cAAA;AAAA,YAClC,YAAA,EAAY,MAAA,GAAS,CAAA,CAAE,cAAA,GAAiB,CAAA,CAAE,SAAA;AAAA,YAC1C,cAAA,EAAc,MAAA;AAAA,YACd,eAAaG,0BAAA,CAAS,GAAA,EAAK,MAAA,GAAS,IAAA,CAAK,WAAW,CAAA,EAAG;AAAA,cACrD,MAAA,EAAQ,CAAA,mBAAA,EAAsB,IAAA,CAAK,WAAW,CAAA;AAAA,aAC/C,CAAA;AAAA,YACD,SAAA,EAAU,0BAAA;AAAA,YAEV,QAAA,kBAAAH,cAAAA;AAAA,cAAC2B,qBAAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW5B,KAAAA;AAAA,kBACT,UAAA;AAAA,kBACA,SACI,cAAA,GACA;AAAA;AACN;AAAA;AACF;AAAA,SACF;AAAA,MAEJ;AAAA;AACF,MAEF,EAAC;AAEP,EAAA,MAAM,OAAA,GAAuB;AAAA,IAC3B,GAAG,YAAA;AAAA,IACH;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,KAAM2E,0CAAA,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,uBACE5E,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACb,QAAA,EAAA;AAAA,0BAAAE,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,+EAAA;AAAA,cACV,KAAA,EAAO,EAAE,CAAC,oBAA8B,GAAG,UAAA,EAAW;AAAA,cACtD,eAAaG,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,EAAAuE,0CAAA,CAAyB,KAAK,IAAI;AAAA;AAAA,WACrC;AAAA,0BAEA1E,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DACZ,QAAA,EAAA,KAAA,CAAM,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,GAAOe,4BAAA;AAAA,UACX,OAAO,IAAA,EAAM,UAAA;AAAA,UACb,OAAO,IAAA,EAAM,QAAA;AAAA,UACb,OAAO,IAAA,EAAM;AAAA,SACf;AACA,QAAA,IAAI,CAAC,MAAM,uBAAOf,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAA2B,QAAA,EAAA,QAAA,EAAC,CAAA;AAC9D,QAAA,uBACEF,eAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,gCAAA;AAAA,YACV,aAAA,EAAaK,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,8BAAAH,cAAAA,CAACmB,wBAAAA,EAAA,EAAa,SAAA,EAAU,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,uBACLnB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CACZ,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,cAAc,CAAC,MAAA,KACb,MAAA,CAAO,IAAA,mBACLA,cAAAA,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,cAAc,CAAC,MAAA,KACb,MAAA,CAAO,IAAA,mBACLA,cAAAA,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,CAAA,KAAM,GAAG,uBAAOA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAA2B,QAAA,EAAA,QAAA,EAAC,CAAA;AAChE,QAAA,uBACEF,eAAAA;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,8BAAAE,cAAAA,CAAC2E,iBAAA,EAAA,EAAM,SAAA,EAAU,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;AChbO,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,uBACE7E,eAAAA,CAAC+B,eAAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA7B,cAAAA,CAAC8B,sBAAAA,EAAA,EAAoB,OAAA,EAAO,MAC1B,QAAA,kBAAA9B,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,eAAaG,0BAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,oBAAoB,CAAA;AAAA,QACtE,cAAY,CAAA,CAAE,OAAA;AAAA,QAEd,QAAA,kBAAAH,cAAAA,CAAC4E,wBAAA,EAAA,EAAa,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,KACnC,EACF,CAAA;AAAA,oBACA9E,eAAAA,CAACkC,sBAAAA,EAAA,EAAoB,KAAA,EAAM,KAAA,EAAM,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB,EACjE,QAAA,EAAA;AAAA,sBAAAlC,eAAAA;AAAA,QAACmC,mBAAAA;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,eAAa9B,0BAAA,CAAS,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,oBAAoB,CAAA;AAAA,UAEnE,QAAA,EAAA;AAAA,4BAAAH,cAAAA,CAAC6E,kBAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,YAC/B,CAAA,CAAE;AAAA;AAAA;AAAA,OACL;AAAA,sBACA7E,cAAAA,CAACmC,wBAAAA,EAAA,EAAsB,CAAA;AAAA,sBACvBrC,eAAAA;AAAA,QAACmC,mBAAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,QAAA;AAAA,UACV,SAAA,EAAU,mCAAA;AAAA,UACV,eAAa9B,0BAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,sBAAsB,CAAA;AAAA,UAEvE,QAAA,EAAA;AAAA,4BAAAH,cAAAA,CAACQ,kBAAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,YAC/B,CAAA,CAAE;AAAA;AAAA;AAAA;AACL,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"chunk-VK5Q5JXU.cjs","sourcesContent":["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","/**\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, listTimeZones } from '../calendar/zone'\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(() => listTimeZones(), [])\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 { FolderUp, MoreHorizontal, Paperclip, 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 removeFromChat: string\n addToChat: 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 removeFromChatTooltip: (pluralNoun: string) => string\n addToChatTooltip: (pluralNoun: string) => string\n labelTooltip: (pluralNoun: string) => string\n}\n\nexport const DEFAULT_FACTS_BULK_BAR_LABELS: FactsBulkBarLabels = {\n removeFromChat: 'Remove from Chat',\n addToChat: 'Add to Chat',\n label: 'Label',\n shared: 'Shared',\n more: 'More',\n export: 'Export',\n delete: 'Delete',\n budgetHint:\n \"Facts added to this chat are always in ARBI's context for this chat, so they 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 removeFromChatTooltip: (n) => `Remove the selected ${n} from this chat`,\n addToChatTooltip: (n) => `Add the selected ${n} to this chat, so they are always in its context`,\n labelTooltip: (n) => `Add or remove labels from selected ${n}`,\n}\n\nexport interface FactsBulkBarTestIds {\n budget: string\n inChat: 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 in the current chat (the action then removes). */\n allSelectedInChat: boolean\n /** Add the selection to the current chat, or take it out (absent: no chat, no action). */\n onToggleInChat?: () => void\n /** Label the selection (absent: no action). */\n onLabel?: () => void\n /** The aggregate Shared switch for the selection (the app binds its toggle). */\n sharedToggle: ReactNode\n /** Export the selection (absent: no action). */\n onExport?: () => void\n onDelete: () => void\n /** The current chat's facts token budget, shown at the left (the chat's facts, 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: Add to Chat, 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 allSelectedInChat,\n onToggleInChat,\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-chat-budget' })}\n >\n {l.budget(budget.tokens.toLocaleString(), budget.cap.toLocaleString())}\n </span>\n ) : null\n }\n >\n {(isCompact) => (\n <>\n {onToggleInChat && (\n <SelectionBarAction\n icon={Paperclip}\n label={allSelectedInChat ? l.removeFromChat : l.addToChat}\n onClick={onToggleInChat}\n disabled={none}\n isCompact={isCompact}\n className=\"border-blue-border text-blue-text hover:bg-blue-bg hover:text-blue-text\"\n tooltip={\n allSelectedInChat\n ? l.removeFromChatTooltip(pluralNoun)\n : l.addToChatTooltip(pluralNoun)\n }\n testId={testIdOr(testIds?.inChat, { testId: 'bulk-in-chat-facts-button' })}\n />\n )}\n {onLabel && (\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 )}\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 {onExport && (\n <>\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 </>\n )}\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 { 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","/**\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: { in_chat: 'In chat' },\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","/**\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","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 { CheckCircle2, CornerDownLeft, Loader2, Paperclip, Search, X } from 'lucide-react'\nimport { Button, TagEntity } 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 inChat: string\n verified: string\n open: string\n}\n\nexport const DEFAULT_FACT_SEARCH_RESULT_LABELS: FactSearchResultLabels = {\n inChat: 'In this chat',\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 /** The fact is in the host's current chat. */\n isInChat?: 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 In this chat) and the Verified mark. */\nexport function FactSearchResult({\n id,\n rank,\n text,\n terms,\n renderSnippet,\n labels,\n isInChat,\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 {isInChat && (\n <span\n className=\"inline-flex items-center gap-1 pr-1\"\n data-testid={`facts-smart-search-hit-in-chat-${id}`}\n >\n <Paperclip className=\"size-3\" /> {l.inChat}\n </span>\n )}\n {labels.map((tag) => (\n <TagEntity\n key={tag.id}\n tag={{ external_id: tag.id, name: tag.name, color: tag.color }}\n size=\"sm\"\n showTooltip={false}\n />\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","/**\n * Drag-to-resize columns for the tables rendered inside the fact editor's\n * MDXEditor.\n *\n * MDXEditor's table has no built-in column resizing, but it renders a\n * `<colgroup>` of `<col>` elements — one per column plus the leading/trailing\n * tool columns. Column widths are honoured by setting a width on those `<col>`\n * elements and switching the table to `table-layout: fixed`. MDXEditor only\n * manages each `<col>`'s `className` (alignment), so an inline `style.width`\n * survives typing edits; it only resets when the column count changes (a new\n * `<colgroup>` is rendered) — acceptable for an editing-time affordance, since\n * markdown tables can't store widths anyway.\n *\n * Wiring: attach once to the editor container. Listeners are delegated, so\n * they work for tables that appear/disappear as the user edits. Returns a\n * cleanup that removes every listener and any lingering drag state.\n */\n\n/** How close (px) to a cell's right edge the pointer must be to grab it. */\nconst EDGE = 6\n/** Never let a column get narrower than this (px). */\nconst MIN_WIDTH = 48\n\ninterface DragState {\n col: HTMLTableColElement\n table: HTMLTableElement\n startX: number\n startWidth: number\n}\n\nexport function enableFactTableColumnResize(container: HTMLElement): () => void {\n let drag: DragState | null = null\n\n const cellFromEvent = (e: PointerEvent): HTMLTableCellElement | null => {\n const el = e.target as HTMLElement | null\n const cell = el?.closest?.('td, th') as HTMLTableCellElement | null\n // Only content cells resize — never the row/column tool cells.\n if (!cell || cell.hasAttribute('data-tool-cell')) return null\n if (!container.contains(cell)) return null\n return cell\n }\n\n const nearRightEdge = (cell: HTMLTableCellElement, clientX: number): boolean => {\n const rect = cell.getBoundingClientRect()\n return clientX >= rect.right - EDGE && clientX <= rect.right + 2\n }\n\n /** The `<col>` that governs `cell`'s column. Body rows and the colgroup both\n * lead with a tool element, so the cell's index in its row maps 1:1 to the\n * colgroup child index. */\n const colForCell = (cell: HTMLTableCellElement): HTMLTableColElement | null => {\n const row = cell.parentElement\n const table = cell.closest('table')\n const colgroup = table?.querySelector('colgroup')\n if (!row || !table || !colgroup) return null\n const index = Array.prototype.indexOf.call(row.children, cell)\n return (colgroup.children[index] as HTMLTableColElement | undefined) ?? null\n }\n\n /** Freeze every column at its current rendered width before switching to a\n * fixed layout, so grabbing a border doesn't make the whole table jump. The\n * header row has a cell for every colgroup entry (incl. the tool columns),\n * so it's the reliable ruler. */\n const freezeWidths = (table: HTMLTableElement) => {\n const colgroup = table.querySelector('colgroup')\n if (!colgroup) return\n const ruler = table.querySelector('thead tr') ?? table.querySelector('tbody tr')\n const cells = ruler ? Array.from(ruler.children) : []\n Array.from(colgroup.children).forEach((node, i) => {\n const col = node as HTMLTableColElement\n const cell = cells[i] as HTMLElement | undefined\n if (!col.style.width && cell) col.style.width = `${cell.getBoundingClientRect().width}px`\n })\n table.style.tableLayout = 'fixed'\n }\n\n const onPointerMove = (e: PointerEvent) => {\n if (drag) {\n const next = Math.max(MIN_WIDTH, drag.startWidth + (e.clientX - drag.startX))\n drag.col.style.width = `${next}px`\n e.preventDefault()\n return\n }\n // Hover affordance: show the resize cursor only in a cell's right margin.\n const cell = cellFromEvent(e)\n if (cell && nearRightEdge(cell, e.clientX)) {\n cell.style.cursor = 'col-resize'\n } else if (cell) {\n cell.style.cursor = ''\n }\n }\n\n const endDrag = () => {\n if (!drag) return\n drag = null\n document.documentElement.classList.remove('fact-col-resizing')\n document.removeEventListener('pointermove', onPointerMove, true)\n document.removeEventListener('pointerup', endDrag, true)\n }\n\n const onPointerDown = (e: PointerEvent) => {\n if (e.button !== 0) return\n const cell = cellFromEvent(e)\n if (!cell || !nearRightEdge(cell, e.clientX)) return\n const table = cell.closest('table') as HTMLTableElement | null\n if (!table) return\n freezeWidths(table)\n const col = colForCell(cell)\n if (!col) return\n drag = {\n col,\n table,\n startX: e.clientX,\n startWidth: parseFloat(col.style.width) || cell.getBoundingClientRect().width,\n }\n // Grab the border, not the caret: suppress the click-to-edit + selection.\n e.preventDefault()\n document.documentElement.classList.add('fact-col-resizing')\n document.addEventListener('pointermove', onPointerMove, true)\n document.addEventListener('pointerup', endDrag, true)\n }\n\n container.addEventListener('pointerdown', onPointerDown)\n container.addEventListener('pointermove', onPointerMove)\n\n return () => {\n endDrag()\n container.removeEventListener('pointerdown', onPointerDown)\n container.removeEventListener('pointermove', onPointerMove)\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 /** Remove this document from the sources. Absent: a read-only list, no remove control. */\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 {onRemove && (\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 )}\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","import { memo, useEffect, useMemo, useRef, useState } from 'react'\nimport { PencilLine } from 'lucide-react'\nimport {\n TagEntity,\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 <TagEntity\n key={o.id}\n tag={{ external_id: o.id, name: o.name, color: o.color }}\n size=\"sm\"\n showTooltip={false}\n />\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 <TagEntity\n tag={{ external_id: o.id, name: o.name, color: o.color }}\n checked={isApplied}\n onCheckedChange={() => toggle(o)}\n size=\"sm\"\n showTooltip={false}\n />\n </CommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n )}\n </Popover>\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, Paperclip, 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 inChatHeaderTooltip: string\n inChatTitle: string\n notInChatTitle: string\n removeFromChat: string\n addToChat: 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 inChatHeaderTooltip: 'Facts added to this chat are always in context for this chat',\n inChatTitle: 'In this chat — always in context for it. Click to remove from chat.',\n notInChatTitle: 'Add to chat — always in context for this chat',\n removeFromChat: 'Remove from chat',\n addToChat: 'Add to chat',\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 inChat: (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 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 /** Whether the fact is in the host's current chat. With `onToggleInChat`, adds the In chat\n * column; a host without chats leaves both out. Read at render time: the host refreshes the\n * column when its chat changes. */\n isInChat?: (fact: T) => boolean\n /** Add the fact to the current chat, or take it out. */\n onToggleInChat?: (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 'in_chat',\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 { isInChat, onToggleInChat } = slots\n const inChatColumn: ColDef<T>[] =\n isInChat && onToggleInChat\n ? [\n {\n colId: 'in_chat',\n headerName: '',\n headerComponent: () => (\n <span className=\"flex size-full items-center justify-center\">\n <Paperclip className=\"size-3.5 text-muted-foreground\" />\n </span>\n ),\n valueGetter: (params: ValueGetterParams<T>) =>\n params.data ? isInChat(params.data) : false,\n width: 44,\n minWidth: 44,\n maxWidth: 44,\n sortable: true,\n resizable: false,\n headerTooltip: l.inChatHeaderTooltip,\n cellClass: 'cell-hcenter',\n // A toggle, not a readout: a fact in the chat rides every message of it, so it flips\n // in place.\n cellRenderer: (params: ICellRendererParams<T>) => {\n if (!params.data) return null\n const fact = params.data\n const inChat = isInChat(fact)\n return (\n <button\n type=\"button\"\n onClick={() => onToggleInChat(fact)}\n title={inChat ? l.inChatTitle : l.notInChatTitle}\n aria-label={inChat ? l.removeFromChat : l.addToChat}\n aria-pressed={inChat}\n data-testid={testIdOr(ids?.inChat?.(fact.external_id), {\n testId: `facts-grid-in-chat-${fact.external_id}`,\n })}\n className=\"flex h-full items-center\"\n >\n <Paperclip\n className={cn(\n 'size-3.5',\n inChat\n ? 'text-primary'\n : 'text-muted-foreground/30 transition-colors hover:text-muted-foreground'\n )}\n />\n </button>\n )\n },\n },\n ]\n : []\n\n const columns: ColDef<T>[] = [\n ...inChatColumn,\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 (`&#x20;` 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"]}