@miethe/ui 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/README.md +1536 -0
  3. package/dist/bulk-actions/Button.d.ts +28 -0
  4. package/dist/bulk-actions/Button.d.ts.map +1 -0
  5. package/dist/bulk-actions/Button.js +45 -0
  6. package/dist/bulk-actions/Button.js.map +1 -0
  7. package/dist/bulk-actions/bulk-action-bar.d.ts +91 -0
  8. package/dist/bulk-actions/bulk-action-bar.d.ts.map +1 -0
  9. package/dist/bulk-actions/bulk-action-bar.js +94 -0
  10. package/dist/bulk-actions/bulk-action-bar.js.map +1 -0
  11. package/dist/bulk-actions/index.d.ts +5 -0
  12. package/dist/bulk-actions/index.d.ts.map +1 -0
  13. package/dist/bulk-actions/index.js +7 -0
  14. package/dist/bulk-actions/index.js.map +1 -0
  15. package/dist/bulk-actions/utils.d.ts +6 -0
  16. package/dist/bulk-actions/utils.d.ts.map +1 -0
  17. package/dist/bulk-actions/utils.js +9 -0
  18. package/dist/bulk-actions/utils.js.map +1 -0
  19. package/dist/components/ui/alert.d.ts +9 -0
  20. package/dist/components/ui/alert.d.ts.map +1 -0
  21. package/dist/components/ui/alert.js +23 -0
  22. package/dist/components/ui/alert.js.map +1 -0
  23. package/dist/components/ui/button.d.ts +12 -0
  24. package/dist/components/ui/button.d.ts.map +1 -0
  25. package/dist/components/ui/button.js +34 -0
  26. package/dist/components/ui/button.js.map +1 -0
  27. package/dist/components/ui/collapsible.d.ts +6 -0
  28. package/dist/components/ui/collapsible.d.ts.map +1 -0
  29. package/dist/components/ui/collapsible.js +7 -0
  30. package/dist/components/ui/collapsible.js.map +1 -0
  31. package/dist/components/ui/skeleton.d.ts +4 -0
  32. package/dist/components/ui/skeleton.d.ts.map +1 -0
  33. package/dist/components/ui/skeleton.js +7 -0
  34. package/dist/components/ui/skeleton.js.map +1 -0
  35. package/dist/content-viewer/ContentPane.d.ts +107 -0
  36. package/dist/content-viewer/ContentPane.d.ts.map +1 -0
  37. package/dist/content-viewer/ContentPane.js +247 -0
  38. package/dist/content-viewer/ContentPane.js.map +1 -0
  39. package/dist/content-viewer/ContentViewerProvider.d.ts +83 -0
  40. package/dist/content-viewer/ContentViewerProvider.d.ts.map +1 -0
  41. package/dist/content-viewer/ContentViewerProvider.js +92 -0
  42. package/dist/content-viewer/ContentViewerProvider.js.map +1 -0
  43. package/dist/content-viewer/FileTree.d.ts +71 -0
  44. package/dist/content-viewer/FileTree.d.ts.map +1 -0
  45. package/dist/content-viewer/FileTree.js +294 -0
  46. package/dist/content-viewer/FileTree.js.map +1 -0
  47. package/dist/content-viewer/adapters.d.ts +101 -0
  48. package/dist/content-viewer/adapters.d.ts.map +1 -0
  49. package/dist/content-viewer/adapters.js +32 -0
  50. package/dist/content-viewer/adapters.js.map +1 -0
  51. package/dist/content-viewer/index.d.ts +8 -0
  52. package/dist/content-viewer/index.d.ts.map +1 -0
  53. package/dist/content-viewer/index.js +5 -0
  54. package/dist/content-viewer/index.js.map +1 -0
  55. package/dist/diff/DiffViewer.d.ts +112 -0
  56. package/dist/diff/DiffViewer.d.ts.map +1 -0
  57. package/dist/diff/DiffViewer.js +414 -0
  58. package/dist/diff/DiffViewer.js.map +1 -0
  59. package/dist/diff/diff.d.ts +32 -0
  60. package/dist/diff/diff.d.ts.map +1 -0
  61. package/dist/diff/diff.js +8 -0
  62. package/dist/diff/diff.js.map +1 -0
  63. package/dist/diff/index.d.ts +4 -0
  64. package/dist/diff/index.d.ts.map +1 -0
  65. package/dist/diff/index.js +3 -0
  66. package/dist/diff/index.js.map +1 -0
  67. package/dist/display/FilePreviewPane.d.ts +31 -0
  68. package/dist/display/FilePreviewPane.d.ts.map +1 -0
  69. package/dist/display/FilePreviewPane.js +144 -0
  70. package/dist/display/FilePreviewPane.js.map +1 -0
  71. package/dist/display/FrontmatterDisplay.d.ts +33 -0
  72. package/dist/display/FrontmatterDisplay.d.ts.map +1 -0
  73. package/dist/display/FrontmatterDisplay.js +79 -0
  74. package/dist/display/FrontmatterDisplay.js.map +1 -0
  75. package/dist/display/index.d.ts +5 -0
  76. package/dist/display/index.d.ts.map +1 -0
  77. package/dist/display/index.js +4 -0
  78. package/dist/display/index.js.map +1 -0
  79. package/dist/editor/MarkdownEditor.d.ts +28 -0
  80. package/dist/editor/MarkdownEditor.d.ts.map +1 -0
  81. package/dist/editor/MarkdownEditor.js +160 -0
  82. package/dist/editor/MarkdownEditor.js.map +1 -0
  83. package/dist/editor/SplitPreview.d.ts +28 -0
  84. package/dist/editor/SplitPreview.d.ts.map +1 -0
  85. package/dist/editor/SplitPreview.js +34 -0
  86. package/dist/editor/SplitPreview.js.map +1 -0
  87. package/dist/editor/index.d.ts +5 -0
  88. package/dist/editor/index.d.ts.map +1 -0
  89. package/dist/editor/index.js +4 -0
  90. package/dist/editor/index.js.map +1 -0
  91. package/dist/filters/filters-dropdown.d.ts +24 -0
  92. package/dist/filters/filters-dropdown.d.ts.map +1 -0
  93. package/dist/filters/filters-dropdown.js +36 -0
  94. package/dist/filters/filters-dropdown.js.map +1 -0
  95. package/dist/filters/index.d.ts +9 -0
  96. package/dist/filters/index.d.ts.map +1 -0
  97. package/dist/filters/index.js +5 -0
  98. package/dist/filters/index.js.map +1 -0
  99. package/dist/filters/sort-dropdown.d.ts +13 -0
  100. package/dist/filters/sort-dropdown.d.ts.map +1 -0
  101. package/dist/filters/sort-dropdown.js +20 -0
  102. package/dist/filters/sort-dropdown.js.map +1 -0
  103. package/dist/filters/tag-filter-popover.d.ts +39 -0
  104. package/dist/filters/tag-filter-popover.d.ts.map +1 -0
  105. package/dist/filters/tag-filter-popover.js +72 -0
  106. package/dist/filters/tag-filter-popover.js.map +1 -0
  107. package/dist/filters/tool-filter-popover.d.ts +42 -0
  108. package/dist/filters/tool-filter-popover.d.ts.map +1 -0
  109. package/dist/filters/tool-filter-popover.js +67 -0
  110. package/dist/filters/tool-filter-popover.js.map +1 -0
  111. package/dist/hooks/use-debounce.d.ts +9 -0
  112. package/dist/hooks/use-debounce.d.ts.map +1 -0
  113. package/dist/hooks/use-debounce.js +21 -0
  114. package/dist/hooks/use-debounce.js.map +1 -0
  115. package/dist/hooks/use-intersection-observer.d.ts +11 -0
  116. package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
  117. package/dist/hooks/use-intersection-observer.js +25 -0
  118. package/dist/hooks/use-intersection-observer.js.map +1 -0
  119. package/dist/index.d.ts +10 -0
  120. package/dist/index.d.ts.map +1 -0
  121. package/dist/index.js +10 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/pickers/EntityPickerDialog.d.ts +233 -0
  124. package/dist/pickers/EntityPickerDialog.d.ts.map +1 -0
  125. package/dist/pickers/EntityPickerDialog.js +355 -0
  126. package/dist/pickers/EntityPickerDialog.js.map +1 -0
  127. package/dist/pickers/EntityPickerViewToggle.d.ts +8 -0
  128. package/dist/pickers/EntityPickerViewToggle.d.ts.map +1 -0
  129. package/dist/pickers/EntityPickerViewToggle.js +17 -0
  130. package/dist/pickers/EntityPickerViewToggle.js.map +1 -0
  131. package/dist/pickers/index.d.ts +5 -0
  132. package/dist/pickers/index.d.ts.map +1 -0
  133. package/dist/pickers/index.js +3 -0
  134. package/dist/pickers/index.js.map +1 -0
  135. package/dist/primitives/Badge.d.ts +16 -0
  136. package/dist/primitives/Badge.d.ts.map +1 -0
  137. package/dist/primitives/Badge.js +43 -0
  138. package/dist/primitives/Badge.js.map +1 -0
  139. package/dist/primitives/BaseArtifactModal.d.ts +114 -0
  140. package/dist/primitives/BaseArtifactModal.d.ts.map +1 -0
  141. package/dist/primitives/BaseArtifactModal.js +76 -0
  142. package/dist/primitives/BaseArtifactModal.js.map +1 -0
  143. package/dist/primitives/Dialog.d.ts +20 -0
  144. package/dist/primitives/Dialog.d.ts.map +1 -0
  145. package/dist/primitives/Dialog.js +24 -0
  146. package/dist/primitives/Dialog.js.map +1 -0
  147. package/dist/primitives/DropdownMenu.d.ts +28 -0
  148. package/dist/primitives/DropdownMenu.d.ts.map +1 -0
  149. package/dist/primitives/DropdownMenu.js +34 -0
  150. package/dist/primitives/DropdownMenu.js.map +1 -0
  151. package/dist/primitives/EnterpriseOwnerBadge.d.ts +9 -0
  152. package/dist/primitives/EnterpriseOwnerBadge.d.ts.map +1 -0
  153. package/dist/primitives/EnterpriseOwnerBadge.js +12 -0
  154. package/dist/primitives/EnterpriseOwnerBadge.js.map +1 -0
  155. package/dist/primitives/GroupedSelect.d.ts +30 -0
  156. package/dist/primitives/GroupedSelect.d.ts.map +1 -0
  157. package/dist/primitives/GroupedSelect.js +47 -0
  158. package/dist/primitives/GroupedSelect.js.map +1 -0
  159. package/dist/primitives/Input.d.ts +6 -0
  160. package/dist/primitives/Input.d.ts.map +1 -0
  161. package/dist/primitives/Input.js +9 -0
  162. package/dist/primitives/Input.js.map +1 -0
  163. package/dist/primitives/LockIcon.d.ts +11 -0
  164. package/dist/primitives/LockIcon.d.ts.map +1 -0
  165. package/dist/primitives/LockIcon.js +15 -0
  166. package/dist/primitives/LockIcon.js.map +1 -0
  167. package/dist/primitives/MaskedSecretInput.d.ts +16 -0
  168. package/dist/primitives/MaskedSecretInput.d.ts.map +1 -0
  169. package/dist/primitives/MaskedSecretInput.js +42 -0
  170. package/dist/primitives/MaskedSecretInput.js.map +1 -0
  171. package/dist/primitives/ModalHeader.d.ts +66 -0
  172. package/dist/primitives/ModalHeader.d.ts.map +1 -0
  173. package/dist/primitives/ModalHeader.js +58 -0
  174. package/dist/primitives/ModalHeader.js.map +1 -0
  175. package/dist/primitives/Popover.d.ts +9 -0
  176. package/dist/primitives/Popover.d.ts.map +1 -0
  177. package/dist/primitives/Popover.js +13 -0
  178. package/dist/primitives/Popover.js.map +1 -0
  179. package/dist/primitives/ScrollArea.d.ts +6 -0
  180. package/dist/primitives/ScrollArea.d.ts.map +1 -0
  181. package/dist/primitives/ScrollArea.js +11 -0
  182. package/dist/primitives/ScrollArea.js.map +1 -0
  183. package/dist/primitives/SearchableCombobox.d.ts +30 -0
  184. package/dist/primitives/SearchableCombobox.d.ts.map +1 -0
  185. package/dist/primitives/SearchableCombobox.js +124 -0
  186. package/dist/primitives/SearchableCombobox.js.map +1 -0
  187. package/dist/primitives/SearchablePickerDialog.d.ts +20 -0
  188. package/dist/primitives/SearchablePickerDialog.d.ts.map +1 -0
  189. package/dist/primitives/SearchablePickerDialog.js +78 -0
  190. package/dist/primitives/SearchablePickerDialog.js.map +1 -0
  191. package/dist/primitives/StatusBadge.d.ts +21 -0
  192. package/dist/primitives/StatusBadge.d.ts.map +1 -0
  193. package/dist/primitives/StatusBadge.js +25 -0
  194. package/dist/primitives/StatusBadge.js.map +1 -0
  195. package/dist/primitives/TabNavigation.d.ts +68 -0
  196. package/dist/primitives/TabNavigation.d.ts.map +1 -0
  197. package/dist/primitives/TabNavigation.js +74 -0
  198. package/dist/primitives/TabNavigation.js.map +1 -0
  199. package/dist/primitives/Tabs.d.ts +8 -0
  200. package/dist/primitives/Tabs.d.ts.map +1 -0
  201. package/dist/primitives/Tabs.js +14 -0
  202. package/dist/primitives/Tabs.js.map +1 -0
  203. package/dist/primitives/Tooltip.d.ts +8 -0
  204. package/dist/primitives/Tooltip.d.ts.map +1 -0
  205. package/dist/primitives/Tooltip.js +12 -0
  206. package/dist/primitives/Tooltip.js.map +1 -0
  207. package/dist/primitives/VerticalTabNavigation.d.ts +75 -0
  208. package/dist/primitives/VerticalTabNavigation.d.ts.map +1 -0
  209. package/dist/primitives/VerticalTabNavigation.js +166 -0
  210. package/dist/primitives/VerticalTabNavigation.js.map +1 -0
  211. package/dist/primitives/ViewModeToggle.d.ts +12 -0
  212. package/dist/primitives/ViewModeToggle.d.ts.map +1 -0
  213. package/dist/primitives/ViewModeToggle.js +56 -0
  214. package/dist/primitives/ViewModeToggle.js.map +1 -0
  215. package/dist/primitives/WizardShell.d.ts +81 -0
  216. package/dist/primitives/WizardShell.d.ts.map +1 -0
  217. package/dist/primitives/WizardShell.js +73 -0
  218. package/dist/primitives/WizardShell.js.map +1 -0
  219. package/dist/primitives/index.d.ts +38 -0
  220. package/dist/primitives/index.d.ts.map +1 -0
  221. package/dist/primitives/index.js +24 -0
  222. package/dist/primitives/index.js.map +1 -0
  223. package/dist/primitives/utils.d.ts +6 -0
  224. package/dist/primitives/utils.d.ts.map +1 -0
  225. package/dist/primitives/utils.js +9 -0
  226. package/dist/primitives/utils.js.map +1 -0
  227. package/dist/types/index.d.ts +63 -0
  228. package/dist/types/index.d.ts.map +1 -0
  229. package/dist/types/index.js +9 -0
  230. package/dist/types/index.js.map +1 -0
  231. package/dist/utils/frontmatter.d.ts +63 -0
  232. package/dist/utils/frontmatter.d.ts.map +1 -0
  233. package/dist/utils/frontmatter.js +345 -0
  234. package/dist/utils/frontmatter.js.map +1 -0
  235. package/dist/utils/index.d.ts +6 -0
  236. package/dist/utils/index.d.ts.map +1 -0
  237. package/dist/utils/index.js +6 -0
  238. package/dist/utils/index.js.map +1 -0
  239. package/dist/utils/perf-marks.d.ts +28 -0
  240. package/dist/utils/perf-marks.d.ts.map +1 -0
  241. package/dist/utils/perf-marks.js +45 -0
  242. package/dist/utils/perf-marks.js.map +1 -0
  243. package/dist/utils/readme-utils.d.ts +67 -0
  244. package/dist/utils/readme-utils.d.ts.map +1 -0
  245. package/dist/utils/readme-utils.js +164 -0
  246. package/dist/utils/readme-utils.js.map +1 -0
  247. package/dist/utils/type-colors.d.ts +70 -0
  248. package/dist/utils/type-colors.d.ts.map +1 -0
  249. package/dist/utils/type-colors.js +118 -0
  250. package/dist/utils/type-colors.js.map +1 -0
  251. package/package.json +131 -0
@@ -0,0 +1,414 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useMemo, useRef, useState } from 'react';
4
+ import { ChevronDown, ChevronRight, X, Loader2 } from 'lucide-react';
5
+ import { Badge } from '../primitives/Badge';
6
+ import { Button } from '../components/ui/button';
7
+ import { Skeleton } from '../components/ui/skeleton';
8
+ import { cn } from '../primitives/utils';
9
+ import { markStart, markEnd } from '../utils/perf-marks';
10
+ /**
11
+ * Maximum number of files to render in the sidebar by default.
12
+ * When the diff contains more files than this, only the first N are shown
13
+ * and a "Show all N files" banner appears at the bottom of the sidebar.
14
+ */
15
+ const LARGE_DIFF_FILE_THRESHOLD = 50;
16
+ /**
17
+ * Maximum number of lines in a unified diff before the file is considered
18
+ * "large" and collapsed by default in the diff panel. The user must click
19
+ * "Load diff" to expand and parse the content.
20
+ */
21
+ const LARGE_DIFF_LINE_THRESHOLD = 1000;
22
+ /**
23
+ * Maximum size in bytes for a unified diff string before it is treated as
24
+ * "large" and collapsed by default (whichever threshold is hit first).
25
+ */
26
+ const LARGE_DIFF_BYTES_THRESHOLD = 50 * 1024; // 50 KB
27
+ /**
28
+ * Returns true when a unified diff string exceeds either the line or byte threshold.
29
+ */
30
+ function isLargeFileDiff(unifiedDiff) {
31
+ if (unifiedDiff.length > LARGE_DIFF_BYTES_THRESHOLD)
32
+ return true;
33
+ let lineCount = 0;
34
+ for (let i = 0; i < unifiedDiff.length; i++) {
35
+ if (unifiedDiff[i] === '\n') {
36
+ lineCount++;
37
+ if (lineCount >= LARGE_DIFF_LINE_THRESHOLD)
38
+ return true;
39
+ }
40
+ }
41
+ return false;
42
+ }
43
+ function DiffLine({ content, type, lineNumber }) {
44
+ const lineClasses = cn('flex font-mono text-sm border-b border-border/50', type === 'addition' && 'bg-green-500/10 text-green-700 dark:text-green-400', type === 'deletion' && 'bg-red-500/10 text-red-700 dark:text-red-400', type === 'context' && 'text-foreground', type === 'header' && 'bg-muted/50 text-muted-foreground font-semibold');
45
+ return (_jsxs("div", { className: lineClasses, children: [_jsx("span", { className: "w-12 flex-shrink-0 select-none border-r border-border/50 pr-2 text-right text-gray-400", children: lineNumber !== undefined ? lineNumber : '' }), _jsx("span", { className: "flex-1 whitespace-pre px-2", children: content })] }));
46
+ }
47
+ function SpacerLine() {
48
+ return (_jsxs("div", { className: "flex bg-muted/40 font-mono text-sm", children: [_jsx("span", { className: "w-12 flex-shrink-0 select-none border-r border-border/50 pr-2 text-right text-gray-400", children: "\u00A0" }), _jsx("span", { className: "flex-1 whitespace-pre px-2", children: "\u00A0" })] }));
49
+ }
50
+ /** Predetermined widths for skeleton lines to avoid hydration mismatches */
51
+ const LINE_WIDTHS = [72, 55, 88, 43, 65, 80, 50, 95, 60, 75, 48, 83];
52
+ /**
53
+ * DiffViewerSkeleton - Loading skeleton matching the DiffViewer layout
54
+ *
55
+ * Mimics the side-by-side diff viewer structure:
56
+ * - Summary header bar with skeleton badges
57
+ * - File list sidebar with skeleton entries
58
+ * - Main diff area with side-by-side skeleton code lines
59
+ */
60
+ export function DiffViewerSkeleton() {
61
+ return (_jsxs("div", { className: "flex h-full min-h-0 min-w-0 flex-col overflow-hidden", children: [_jsx("div", { className: "flex flex-shrink-0 items-center justify-between border-b p-4", children: _jsxs("div", { className: "flex items-center gap-4", children: [_jsx(Skeleton, { className: "h-6 w-28" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Skeleton, { className: "h-5 w-12" }), _jsx(Skeleton, { className: "h-5 w-12" }), _jsx(Skeleton, { className: "h-5 w-12" })] })] }) }), _jsxs("div", { className: "flex min-h-0 min-w-0 flex-1 overflow-hidden", children: [_jsx("div", { className: "min-h-0 w-64 flex-shrink-0 overflow-y-auto border-r bg-muted/20", children: _jsx("div", { className: "space-y-1 p-2", children: Array.from({ length: 4 }).map((_, i) => (_jsxs("div", { className: "flex items-center gap-2 rounded px-2 py-1.5", children: [_jsx(Skeleton, { className: "h-3 w-3 flex-shrink-0" }), _jsx(Skeleton, { className: "h-4 flex-1" }), _jsx(Skeleton, { className: "h-5 w-16 flex-shrink-0" })] }, i))) }) }), _jsxs("div", { className: "flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden", children: [_jsx("div", { className: "flex-shrink-0 border-b bg-muted/30 px-4 py-2", children: _jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Skeleton, { className: "h-4 w-48" }), _jsx(Skeleton, { className: "h-5 w-16" })] }) }), _jsxs("div", { className: "flex min-h-0 min-w-0 flex-1 overflow-hidden", children: [_jsxs("div", { className: "flex min-h-0 min-w-0 flex-1 flex-col border-r", children: [_jsx("div", { className: "flex-shrink-0 border-b bg-muted/50 px-4 py-2", children: _jsx(Skeleton, { className: "h-4 w-20" }) }), _jsx("div", { className: "min-h-0 min-w-0 flex-1 p-0", children: Array.from({ length: 12 }).map((_, i) => (_jsxs("div", { className: "flex border-b border-border/50 font-mono text-sm", children: [_jsx("span", { className: "w-12 flex-shrink-0 border-r border-border/50 px-2 py-0.5", children: _jsx(Skeleton, { className: "h-3.5 w-6" }) }), _jsx("span", { className: "flex-1 px-2 py-0.5", children: _jsx(Skeleton, { className: "h-3.5", style: { width: `${LINE_WIDTHS[i % LINE_WIDTHS.length]}%` } }) })] }, i))) })] }), _jsxs("div", { className: "flex min-h-0 min-w-0 flex-1 flex-col", children: [_jsx("div", { className: "flex-shrink-0 border-b bg-muted/50 px-4 py-2", children: _jsx(Skeleton, { className: "h-4 w-20" }) }), _jsx("div", { className: "min-h-0 min-w-0 flex-1 p-0", children: Array.from({ length: 12 }).map((_, i) => (_jsxs("div", { className: "flex border-b border-border/50 font-mono text-sm", children: [_jsx("span", { className: "w-12 flex-shrink-0 border-r border-border/50 px-2 py-0.5", children: _jsx(Skeleton, { className: "h-3.5 w-6" }) }), _jsx("span", { className: "flex-1 px-2 py-0.5", children: _jsx(Skeleton, { className: "h-3.5", style: { width: `${LINE_WIDTHS[(i + 5) % LINE_WIDTHS.length]}%` } }) })] }, i))) })] })] })] })] })] }));
62
+ }
63
+ function parseDiff(unifiedDiff) {
64
+ const lines = unifiedDiff.split('\n');
65
+ const parsed = [];
66
+ let leftLineNum = 0;
67
+ let rightLineNum = 0;
68
+ for (const line of lines) {
69
+ // Skip file headers
70
+ if (line.startsWith('---') || line.startsWith('+++')) {
71
+ continue;
72
+ }
73
+ // Parse hunk header: @@ -1,5 +1,6 @@
74
+ if (line.startsWith('@@')) {
75
+ const match = line.match(/@@ -(\d+),?\d* \+(\d+),?\d* @@/);
76
+ if (match && match[1] && match[2]) {
77
+ leftLineNum = parseInt(match[1], 10);
78
+ rightLineNum = parseInt(match[2], 10);
79
+ }
80
+ parsed.push({
81
+ type: 'header',
82
+ content: line,
83
+ });
84
+ continue;
85
+ }
86
+ // Parse diff lines
87
+ if (line.startsWith('+')) {
88
+ parsed.push({
89
+ rightLineNumber: rightLineNum++,
90
+ type: 'addition',
91
+ content: line.substring(1),
92
+ });
93
+ }
94
+ else if (line.startsWith('-')) {
95
+ parsed.push({
96
+ leftLineNumber: leftLineNum++,
97
+ type: 'deletion',
98
+ content: line.substring(1),
99
+ });
100
+ }
101
+ else {
102
+ // Context line (no prefix or space prefix)
103
+ const content = line.startsWith(' ') ? line.substring(1) : line;
104
+ parsed.push({
105
+ leftLineNumber: leftLineNum++,
106
+ rightLineNumber: rightLineNum++,
107
+ type: 'context',
108
+ content,
109
+ });
110
+ }
111
+ }
112
+ return parsed;
113
+ }
114
+ /**
115
+ * Compute sidebar stats (additions + deletions count) from a raw unified diff string
116
+ * without allocating full ParsedDiffLine objects. O(n) line scan with minimal allocations.
117
+ */
118
+ function computeDiffStats(unifiedDiff) {
119
+ let additions = 0;
120
+ let deletions = 0;
121
+ const lines = unifiedDiff.split('\n');
122
+ for (const line of lines) {
123
+ if (line.startsWith('---') || line.startsWith('+++') || line.startsWith('@@'))
124
+ continue;
125
+ if (line.startsWith('+'))
126
+ additions++;
127
+ else if (line.startsWith('-'))
128
+ deletions++;
129
+ }
130
+ return { additions, deletions };
131
+ }
132
+ /**
133
+ * Map a numeric tier level to a human-readable tier name.
134
+ *
135
+ * The mapping mirrors the enterprise edition tiers defined in the backend.
136
+ * Unknown tier levels fall back to a generic "Tier N" label.
137
+ */
138
+ function tierName(tier) {
139
+ const names = {
140
+ 0: 'Developer',
141
+ 1: 'Team',
142
+ 2: 'Enterprise',
143
+ };
144
+ return names[tier] ?? `Tier ${tier}`;
145
+ }
146
+ /**
147
+ * TierBadge — renders an enterprise tier pill for use in diff panel headers.
148
+ *
149
+ * Displays the numeric tier alongside its human-readable name derived from
150
+ * the ownerType, e.g. "Tier 1 · Team" or "Tier 2 · Enterprise".
151
+ */
152
+ function TierBadge({ tier, ownerType }) {
153
+ // Resolve name: prefer ownerType label if it already looks like a tier name,
154
+ // otherwise fall back to the tier number mapping.
155
+ const resolvedName = ownerType
156
+ ? ownerType.charAt(0).toUpperCase() + ownerType.slice(1)
157
+ : tierName(tier);
158
+ const variantMap = {
159
+ 0: 'outline',
160
+ 1: 'secondary',
161
+ 2: 'default',
162
+ };
163
+ const variant = variantMap[tier] ?? 'secondary';
164
+ return (_jsxs("span", { className: "inline-flex items-center gap-1.5", children: [_jsxs(Badge, { variant: variant, className: "text-xs font-medium tabular-nums", children: ["Tier ", tier] }), _jsx("span", { className: "text-xs text-muted-foreground", children: resolvedName })] }));
165
+ }
166
+ function FileStatusBadge({ status }) {
167
+ const variants = {
168
+ added: { variant: 'default', label: 'Added' },
169
+ modified: { variant: 'secondary', label: 'Modified' },
170
+ deleted: { variant: 'destructive', label: 'Deleted' },
171
+ unchanged: { variant: 'outline', label: 'Unchanged' },
172
+ };
173
+ const { variant, label } = variants[status];
174
+ return (_jsx(Badge, { variant: variant, className: "text-xs", children: label }));
175
+ }
176
+ /**
177
+ * DiffViewer - Side-by-side diff viewer with file browser
178
+ *
179
+ * Displays unified diffs in a professional side-by-side format. Features include:
180
+ * - File list sidebar with expandable items showing change statistics
181
+ * - Side-by-side diff panels with independent scrollbars
182
+ * - Color-coded additions (green), deletions (red), and context lines
183
+ * - File status badges (added, modified, deleted, unchanged)
184
+ * - Change summary (total files added, modified, deleted)
185
+ * - Optional sync conflict resolution actions (keep local/remote/merge)
186
+ *
187
+ * @example
188
+ * Basic diff viewer:
189
+ * ```tsx
190
+ * <DiffViewer
191
+ * files={diffData.files}
192
+ * leftLabel="Collection"
193
+ * rightLabel="Project"
194
+ * onClose={() => closeDiff()}
195
+ * />
196
+ * ```
197
+ *
198
+ * @example
199
+ * With sync resolution actions:
200
+ * ```tsx
201
+ * <DiffViewer
202
+ * files={diffData.files}
203
+ * leftLabel="Collection"
204
+ * rightLabel="Project"
205
+ * showResolutionActions={true}
206
+ * onResolve={(resolution) => handleResolve(resolution)}
207
+ * localLabel="Project"
208
+ * remoteLabel="Collection"
209
+ * isResolving={isResolving}
210
+ * previewMode={true}
211
+ * />
212
+ * ```
213
+ *
214
+ * @param props - DiffViewerProps configuration
215
+ * @returns Full-height diff viewer component
216
+ */
217
+ export function DiffViewer({ files, leftLabel = 'Before', rightLabel = 'After', onClose, showResolutionActions = false, onResolve, localLabel, remoteLabel, previewMode = false, isResolving = false, isLoading = false, tierContext, }) {
218
+ const [selectedFileIndex, setSelectedFileIndex] = useState(0);
219
+ const [expandedFiles, setExpandedFiles] = useState(new Set([0]));
220
+ /**
221
+ * When the diff has more than LARGE_DIFF_FILE_THRESHOLD files, the sidebar
222
+ * initially renders only the first N. This flag lifts that cap.
223
+ */
224
+ const [showAllFiles, setShowAllFiles] = useState(false);
225
+ /**
226
+ * Set of file indices for which the user has explicitly requested to load
227
+ * the full diff content. Files whose unified_diff is "large" (exceeds line/
228
+ * byte thresholds) start collapsed; clicking "Load diff" adds them here.
229
+ */
230
+ const [loadedLargeFiles, setLoadedLargeFiles] = useState(new Set());
231
+ const selectedFile = files[selectedFileIndex];
232
+ /**
233
+ * On-demand parse cache keyed by file_path.
234
+ *
235
+ * Previously, a `parsedDiffs` useMemo iterated ALL files and called parseDiff() on every
236
+ * unified_diff string at mount time, regardless of whether the user ever expanded those files.
237
+ * For large diffs (50+ files) this blocked the main thread unnecessarily on mount.
238
+ *
239
+ * Now we parse lazily: only when a file is first selected or first expanded in the sidebar.
240
+ * The cache persists across renders via useRef so each file is parsed at most once per
241
+ * component lifetime. If the `files` prop identity changes (new data arrives) we clear
242
+ * the cache so stale results are never served.
243
+ */
244
+ const parseCacheRef = useRef(new Map());
245
+ const filesCacheKeyRef = useRef('');
246
+ // Invalidate the parse cache when the files array changes (new diff data received)
247
+ const filesKey = files.map((f) => f.file_path).join(',');
248
+ if (filesKey !== filesCacheKeyRef.current) {
249
+ filesCacheKeyRef.current = filesKey;
250
+ parseCacheRef.current = new Map();
251
+ // Reset large-diff UX state so new data starts fresh
252
+ setShowAllFiles(false);
253
+ setLoadedLargeFiles(new Set());
254
+ }
255
+ /**
256
+ * Get parsed lines for a given file path, parsing on first access and caching the result.
257
+ * Only call this for files the user has actually expanded/selected.
258
+ */
259
+ const getParsedLines = (filePath, unifiedDiff) => {
260
+ const cache = parseCacheRef.current;
261
+ if (!cache.has(filePath)) {
262
+ cache.set(filePath, parseDiff(unifiedDiff));
263
+ }
264
+ return cache.get(filePath);
265
+ };
266
+ /**
267
+ * Sidebar stat cache: stores pre-computed {additions, deletions} per file_path.
268
+ * Uses the lightweight computeDiffStats scanner (no object allocation per line)
269
+ * instead of the full parseDiff. Keyed separately from parseCacheRef because
270
+ * sidebar stats are shown without needing full ParsedDiffLine arrays.
271
+ */
272
+ const statsCacheRef = useRef(new Map());
273
+ const statsCacheKeyRef = useRef('');
274
+ if (filesKey !== statsCacheKeyRef.current) {
275
+ statsCacheKeyRef.current = filesKey;
276
+ statsCacheRef.current = new Map();
277
+ }
278
+ const getFileStats = (filePath, unifiedDiff) => {
279
+ const cache = statsCacheRef.current;
280
+ if (!cache.has(filePath)) {
281
+ cache.set(filePath, computeDiffStats(unifiedDiff));
282
+ }
283
+ return cache.get(filePath);
284
+ };
285
+ // Parsed diff for the currently selected file -- computed on demand, cached in parseCacheRef
286
+ const parsedDiff = useMemo(() => {
287
+ return selectedFile?.unified_diff
288
+ ? getParsedLines(selectedFile.file_path, selectedFile.unified_diff)
289
+ : [];
290
+ // eslint-disable-next-line react-hooks/exhaustive-deps
291
+ }, [selectedFile?.file_path, selectedFile?.unified_diff]);
292
+ // Performance instrumentation: start timing diff summary and render on mount
293
+ useEffect(() => {
294
+ markStart('diff-viewer.summary-ready');
295
+ }, []);
296
+ // Refs for synchronized scrolling between left and right panels
297
+ const leftScrollRef = useRef(null);
298
+ const rightScrollRef = useRef(null);
299
+ // Synchronized scrolling between left and right diff panels
300
+ useEffect(() => {
301
+ const leftScroll = leftScrollRef.current;
302
+ const rightScroll = rightScrollRef.current;
303
+ if (!leftScroll || !rightScroll)
304
+ return;
305
+ let isSyncing = false;
306
+ const syncScroll = (source, target) => {
307
+ if (isSyncing)
308
+ return;
309
+ isSyncing = true;
310
+ target.scrollTop = source.scrollTop;
311
+ requestAnimationFrame(() => {
312
+ isSyncing = false;
313
+ });
314
+ };
315
+ const onLeftScroll = () => syncScroll(leftScroll, rightScroll);
316
+ const onRightScroll = () => syncScroll(rightScroll, leftScroll);
317
+ leftScroll.addEventListener('scroll', onLeftScroll);
318
+ rightScroll.addEventListener('scroll', onRightScroll);
319
+ return () => {
320
+ leftScroll.removeEventListener('scroll', onLeftScroll);
321
+ rightScroll.removeEventListener('scroll', onRightScroll);
322
+ };
323
+ }, [selectedFile]);
324
+ // Performance instrumentation: mark when diff summary data arrives (files prop populated)
325
+ const diffSummaryMarked = useRef(false);
326
+ useEffect(() => {
327
+ if (files.length > 0 && !diffSummaryMarked.current) {
328
+ diffSummaryMarked.current = true;
329
+ markEnd('diff-viewer.summary-ready');
330
+ }
331
+ }, [files]);
332
+ // Performance instrumentation: mark when the full diff content finishes rendering
333
+ // (fires after paint for the current selected file's unified diff)
334
+ const prevFilesKey = useRef('');
335
+ useEffect(() => {
336
+ if (files.length > 0 && filesKey !== prevFilesKey.current) {
337
+ prevFilesKey.current = filesKey;
338
+ markStart('diff-viewer.render');
339
+ // Defer end mark until after browser has painted the diff content
340
+ const id = requestAnimationFrame(() => {
341
+ markEnd('diff-viewer.render');
342
+ });
343
+ return () => cancelAnimationFrame(id);
344
+ }
345
+ }, [files, filesKey]);
346
+ // Memoize summary calculation (reads only file.status, no diff parsing needed)
347
+ const summary = useMemo(() => {
348
+ return files.reduce((acc, file) => {
349
+ if (file.status === 'added')
350
+ acc.added++;
351
+ else if (file.status === 'modified')
352
+ acc.modified++;
353
+ else if (file.status === 'deleted')
354
+ acc.deleted++;
355
+ else
356
+ acc.unchanged++;
357
+ return acc;
358
+ }, { added: 0, modified: 0, deleted: 0, unchanged: 0 });
359
+ }, [files]);
360
+ const toggleFileExpansion = (index) => {
361
+ const newExpanded = new Set(expandedFiles);
362
+ if (newExpanded.has(index)) {
363
+ newExpanded.delete(index);
364
+ }
365
+ else {
366
+ newExpanded.add(index);
367
+ }
368
+ setExpandedFiles(newExpanded);
369
+ };
370
+ if (isLoading) {
371
+ return _jsx(DiffViewerSkeleton, {});
372
+ }
373
+ if (files.length === 0) {
374
+ return (_jsx("div", { className: "flex h-64 items-center justify-center text-muted-foreground", children: _jsx("p", { children: "No changes to display" }) }));
375
+ }
376
+ return (_jsxs("div", { className: "flex h-full min-h-0 min-w-0 flex-col overflow-hidden", children: [_jsxs("div", { className: "flex flex-shrink-0 items-center justify-between border-b p-4", children: [_jsxs("div", { className: "flex items-center gap-4", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Diff Viewer" }), _jsxs("div", { className: "flex items-center gap-2 text-sm", children: [summary.added > 0 && (_jsxs("span", { className: "text-green-600 dark:text-green-400", children: ["+", summary.added] })), summary.modified > 0 && (_jsxs("span", { className: "text-blue-600 dark:text-blue-400", children: ["~", summary.modified] })), summary.deleted > 0 && (_jsxs("span", { className: "text-red-600 dark:text-red-400", children: ["-", summary.deleted] }))] })] }), onClose && (_jsx(Button, { variant: "ghost", size: "icon", onClick: onClose, children: _jsx(X, { className: "h-4 w-4" }) }))] }), _jsxs("div", { className: "flex min-h-0 min-w-0 flex-1 overflow-hidden", children: [_jsx("div", { className: "min-h-0 w-64 flex-shrink-0 overflow-y-auto border-r bg-muted/20", children: _jsxs("div", { className: "space-y-1 p-2", children: [(showAllFiles ? files : files.slice(0, LARGE_DIFF_FILE_THRESHOLD)).map((file, index) => {
377
+ const isExpanded = expandedFiles.has(index);
378
+ const isSelected = index === selectedFileIndex;
379
+ return (_jsxs("div", { children: [_jsxs("button", { onClick: () => {
380
+ setSelectedFileIndex(index);
381
+ if (!isExpanded) {
382
+ toggleFileExpansion(index);
383
+ }
384
+ }, className: cn('flex w-full items-center gap-2 rounded px-2 py-1.5 text-left text-sm transition-colors hover:bg-accent', isSelected && 'bg-accent'), children: [_jsx("span", { role: "button", tabIndex: -1, onClick: (e) => {
385
+ e.stopPropagation();
386
+ toggleFileExpansion(index);
387
+ }, className: "flex-shrink-0", children: isExpanded ? (_jsx(ChevronDown, { className: "h-3 w-3" })) : (_jsx(ChevronRight, { className: "h-3 w-3" })) }), _jsx("span", { className: "flex-1 truncate font-mono text-xs", children: file.file_path }), _jsx(FileStatusBadge, { status: file.status })] }), isExpanded && file.status === 'modified' && file.unified_diff && (() => {
388
+ const stats = getFileStats(file.file_path, file.unified_diff);
389
+ return (_jsx("div", { className: "ml-6 mt-1 space-y-0.5 text-xs text-muted-foreground", children: _jsxs("div", { className: "font-mono", children: [stats.additions, " additions, ", stats.deletions, " deletions"] }) }));
390
+ })()] }, index));
391
+ }), !showAllFiles && files.length > LARGE_DIFF_FILE_THRESHOLD && (_jsxs("div", { className: "mt-2 rounded border border-border/60 bg-muted/40 px-3 py-2 text-xs text-muted-foreground", children: [_jsxs("p", { className: "mb-1.5", children: ["Showing ", LARGE_DIFF_FILE_THRESHOLD, " of ", files.length, " files"] }), _jsxs(Button, { variant: "outline", size: "sm", className: "h-7 w-full text-xs", onClick: () => setShowAllFiles(true), children: ["Load all ", files.length, " files"] })] }))] }) }), _jsxs("div", { className: "flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden", children: [_jsx("div", { className: "flex-shrink-0 border-b bg-muted/30 px-4 py-2", children: _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "font-mono text-sm font-semibold", children: selectedFile?.file_path }), _jsx(FileStatusBadge, { status: selectedFile?.status || 'unchanged' })] }) }), selectedFile?.status === 'modified' && selectedFile.unified_diff ? (
392
+ // Large-file guard: if the diff exceeds the line/byte threshold AND the user
393
+ // has not explicitly loaded it, show a collapsed placeholder instead of
394
+ // parsing and rendering potentially thousands of DOM nodes.
395
+ isLargeFileDiff(selectedFile.unified_diff) &&
396
+ !loadedLargeFiles.has(selectedFileIndex) ? (_jsxs("div", { className: "flex flex-1 flex-col items-center justify-center gap-3 p-6 text-center text-sm text-muted-foreground", children: [_jsxs("p", { className: "max-w-xs", children: ["This file diff is large (", Math.round(selectedFile.unified_diff.length / 1024), " KB). Loading it may slow down the browser."] }), _jsx(Button, { variant: "outline", size: "sm", onClick: () => setLoadedLargeFiles((prev) => new Set([...prev, selectedFileIndex])), children: "Load diff" })] })) : (_jsxs("div", { className: "flex min-h-0 min-w-0 flex-1 overflow-hidden", children: [_jsxs("div", { className: "flex min-h-0 min-w-0 flex-1 flex-col border-r", children: [_jsx("div", { className: "flex flex-shrink-0 items-center gap-2 border-b bg-muted/50 px-4 py-2 text-sm font-medium", children: tierContext ? (_jsx(TierBadge, { tier: tierContext.leftTier, ownerType: tierContext.leftOwnerType })) : (leftLabel) }), _jsx("div", { ref: leftScrollRef, className: "min-h-0 min-w-0 flex-1 overflow-auto", tabIndex: 0, "aria-label": "Left diff panel \u2014 scroll to see more", children: parsedDiff.map((line, idx) => {
397
+ if (line.type === 'addition') {
398
+ return _jsx(SpacerLine, {}, idx);
399
+ }
400
+ if (line.type === 'header') {
401
+ return (_jsx(DiffLine, { content: line.content, type: "header", side: "left" }, idx));
402
+ }
403
+ return (_jsx(DiffLine, { content: line.content, type: line.type, lineNumber: line.leftLineNumber, side: "left" }, idx));
404
+ }) })] }), _jsxs("div", { className: "flex min-h-0 min-w-0 flex-1 flex-col", children: [_jsx("div", { className: "flex flex-shrink-0 items-center gap-2 border-b bg-muted/50 px-4 py-2 text-sm font-medium", children: tierContext ? (_jsx(TierBadge, { tier: tierContext.rightTier, ownerType: tierContext.rightOwnerType })) : (rightLabel) }), _jsx("div", { ref: rightScrollRef, className: "min-h-0 min-w-0 flex-1 overflow-auto", tabIndex: 0, "aria-label": "Right diff panel \u2014 scroll to see more", children: parsedDiff.map((line, idx) => {
405
+ if (line.type === 'deletion') {
406
+ return _jsx(SpacerLine, {}, idx);
407
+ }
408
+ if (line.type === 'header') {
409
+ return (_jsx(DiffLine, { content: line.content, type: "header", side: "right" }, idx));
410
+ }
411
+ return (_jsx(DiffLine, { content: line.content, type: line.type, lineNumber: line.rightLineNumber, side: "right" }, idx));
412
+ }) })] })] }))) : selectedFile?.status === 'added' ? (_jsxs("div", { className: "flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden", children: [_jsxs("div", { className: "flex-shrink-0 bg-green-500/10 px-4 py-2 text-sm text-green-700 dark:text-green-400", children: ["This file was added in ", rightLabel] }), _jsx("div", { className: "min-h-0 min-w-0 flex-1 overflow-y-auto p-4 text-sm text-muted-foreground", children: "Content preview not available for added files." })] })) : selectedFile?.status === 'deleted' ? (_jsxs("div", { className: "flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden", children: [_jsxs("div", { className: "flex-shrink-0 bg-red-500/10 px-4 py-2 text-sm text-red-700 dark:text-red-400", children: ["This file was deleted from ", leftLabel] }), _jsx("div", { className: "min-h-0 min-w-0 flex-1 overflow-y-auto p-4 text-sm text-muted-foreground", children: "Content preview not available for deleted files." })] })) : (_jsx("div", { className: "flex flex-1 items-center justify-center text-muted-foreground", children: _jsx("p", { children: "No changes in this file" }) }))] })] }), showResolutionActions && (_jsxs("div", { className: "flex flex-shrink-0 items-center justify-end gap-2 border-t bg-muted/20 p-4", children: [previewMode && (_jsx("span", { className: "mr-auto text-sm text-muted-foreground", children: "Preview mode - select which version to keep" })), _jsxs(Button, { variant: "outline", onClick: () => onResolve?.('keep_local'), disabled: isResolving, className: "hover:bg-accent", title: `Keep the ${localLabel || 'local (project)'} version`, children: ["Keep ", localLabel || 'Local (Project)'] }), _jsxs(Button, { variant: "outline", onClick: () => onResolve?.('keep_remote'), disabled: isResolving, className: "hover:bg-accent", title: `Keep the ${remoteLabel || 'remote (collection)'} version`, children: ["Keep ", remoteLabel || 'Remote (Collection)'] }), _jsx(Button, { variant: "secondary", onClick: () => onResolve?.('merge'), disabled: isResolving, className: "hover:bg-secondary/80", title: "Manually merge changes (coming soon)", children: "Merge" }), isResolving && _jsx(Loader2, { className: "ml-2 h-4 w-4 animate-spin text-muted-foreground" })] }))] }));
413
+ }
414
+ //# sourceMappingURL=DiffViewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiffViewer.js","sourceRoot":"","sources":["../../src/diff/DiffViewer.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAErE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAyBzD;;;;GAIG;AACH,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAErC;;;;GAIG;AACH,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAEvC;;;GAGG;AACH,MAAM,0BAA0B,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,QAAQ;AAEtD;;GAEG;AACH,SAAS,eAAe,CAAC,WAAmB;IAC1C,IAAI,WAAW,CAAC,MAAM,GAAG,0BAA0B;QAAE,OAAO,IAAI,CAAC;IACjE,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5B,SAAS,EAAE,CAAC;YACZ,IAAI,SAAS,IAAI,yBAAyB;gBAAE,OAAO,IAAI,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAuDD,SAAS,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAiB;IAC5D,MAAM,WAAW,GAAG,EAAE,CACpB,kDAAkD,EAClD,IAAI,KAAK,UAAU,IAAI,oDAAoD,EAC3E,IAAI,KAAK,UAAU,IAAI,8CAA8C,EACrE,IAAI,KAAK,SAAS,IAAI,iBAAiB,EACvC,IAAI,KAAK,QAAQ,IAAI,iDAAiD,CACvE,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAE,WAAW,aACzB,eAAM,SAAS,EAAC,wFAAwF,YACrG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GACtC,EACP,eAAM,SAAS,EAAC,4BAA4B,YAAE,OAAO,GAAQ,IACzD,CACP,CAAC;AACJ,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,CACL,eAAK,SAAS,EAAC,oCAAoC,aACjD,eAAM,SAAS,EAAC,wFAAwF,uBAEjG,EACP,eAAM,SAAS,EAAC,4BAA4B,uBAAc,IACtD,CACP,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,MAAM,WAAW,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAErE;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,CACL,eAAK,SAAS,EAAC,sDAAsD,aAEnE,cAAK,SAAS,EAAC,8DAA8D,YAC3E,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,EACjC,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,EACjC,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,EACjC,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,IAC7B,IACF,GACF,EAEN,eAAK,SAAS,EAAC,6CAA6C,aAE1D,cAAK,SAAS,EAAC,iEAAiE,YAC9E,cAAK,SAAS,EAAC,eAAe,YAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACvC,eAAa,SAAS,EAAC,6CAA6C,aAClE,KAAC,QAAQ,IAAC,SAAS,EAAC,uBAAuB,GAAG,EAC9C,KAAC,QAAQ,IAAC,SAAS,EAAC,YAAY,GAAG,EACnC,KAAC,QAAQ,IAAC,SAAS,EAAC,wBAAwB,GAAG,KAHvC,CAAC,CAIL,CACP,CAAC,GACE,GACF,EAGN,eAAK,SAAS,EAAC,sDAAsD,aAEnE,cAAK,SAAS,EAAC,8CAA8C,YAC3D,eAAK,SAAS,EAAC,mCAAmC,aAChD,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,EACjC,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,IAC7B,GACF,EAGN,eAAK,SAAS,EAAC,6CAA6C,aAE1D,eAAK,SAAS,EAAC,+CAA+C,aAC5D,cAAK,SAAS,EAAC,8CAA8C,YAC3D,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,GAC7B,EACN,cAAK,SAAS,EAAC,4BAA4B,YACxC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACxC,eAAa,SAAS,EAAC,kDAAkD,aACvE,eAAM,SAAS,EAAC,0DAA0D,YACxE,KAAC,QAAQ,IAAC,SAAS,EAAC,WAAW,GAAG,GAC7B,EACP,eAAM,SAAS,EAAC,oBAAoB,YAClC,KAAC,QAAQ,IACP,SAAS,EAAC,OAAO,EACjB,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,GAC3D,GACG,KATC,CAAC,CAUL,CACP,CAAC,GACE,IACF,EAGN,eAAK,SAAS,EAAC,sCAAsC,aACnD,cAAK,SAAS,EAAC,8CAA8C,YAC3D,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,GAC7B,EACN,cAAK,SAAS,EAAC,4BAA4B,YACxC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACxC,eAAa,SAAS,EAAC,kDAAkD,aACvE,eAAM,SAAS,EAAC,0DAA0D,YACxE,KAAC,QAAQ,IAAC,SAAS,EAAC,WAAW,GAAG,GAC7B,EACP,eAAM,SAAS,EAAC,oBAAoB,YAClC,KAAC,QAAQ,IACP,SAAS,EAAC,OAAO,EACjB,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,GACjE,GACG,KATC,CAAC,CAUL,CACP,CAAC,GACE,IACF,IACF,IACF,IACF,IACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,WAAmB;IACpC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,oBAAoB;QACpB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACrD,SAAS;QACX,CAAC;QAED,qCAAqC;QACrC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAC3D,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClC,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrC,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,mBAAmB;QACnB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC;gBACV,eAAe,EAAE,YAAY,EAAE;gBAC/B,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;aAC3B,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC;gBACV,cAAc,EAAE,WAAW,EAAE;gBAC7B,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;aAC3B,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,2CAA2C;YAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAChE,MAAM,CAAC,IAAI,CAAC;gBACV,cAAc,EAAE,WAAW,EAAE;gBAC7B,eAAe,EAAE,YAAY,EAAE;gBAC/B,IAAI,EAAE,SAAS;gBACf,OAAO;aACR,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,WAAmB;IAC3C,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QACxF,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,EAAE,CAAC;aACjC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,EAAE,CAAC;IAC7C,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAClC,CAAC;AAED;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,KAAK,GAA2B;QACpC,CAAC,EAAE,WAAW;QACd,CAAC,EAAE,MAAM;QACT,CAAC,EAAE,YAAY;KAChB,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,QAAQ,IAAI,EAAE,CAAC;AACvC,CAAC;AAED;;;;;GAKG;AACH,SAAS,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAuC;IACzE,6EAA6E;IAC7E,kDAAkD;IAClD,MAAM,YAAY,GAAG,SAAS;QAC5B,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEnB,MAAM,UAAU,GAAwD;QACtE,CAAC,EAAE,SAAS;QACZ,CAAC,EAAE,WAAW;QACd,CAAC,EAAE,SAAS;KACb,CAAC;IACF,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC;IAEhD,OAAO,CACL,gBAAM,SAAS,EAAC,kCAAkC,aAChD,MAAC,KAAK,IAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAC,kCAAkC,sBAC7D,IAAI,IACJ,EACR,eAAM,SAAS,EAAC,+BAA+B,YAAE,YAAY,GAAQ,IAChE,CACR,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,EAAE,MAAM,EAAkC;IACjE,MAAM,QAAQ,GAGV;QACF,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE;QAC7C,QAAQ,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE;QACrD,OAAO,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE;QACrD,SAAS,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE;KACtD,CAAC;IAEF,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE5C,OAAO,CACL,KAAC,KAAK,IAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAC,SAAS,YACzC,KAAK,GACA,CACT,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,SAAS,GAAG,QAAQ,EACpB,UAAU,GAAG,OAAO,EACpB,OAAO,EACP,qBAAqB,GAAG,KAAK,EAC7B,SAAS,EACT,UAAU,EACV,WAAW,EACX,WAAW,GAAG,KAAK,EACnB,WAAW,GAAG,KAAK,EACnB,SAAS,GAAG,KAAK,EACjB,WAAW,GACK;IAChB,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAc,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9E;;;OAGG;IACH,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAExD;;;;OAIG;IACH,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IAEjF,MAAM,YAAY,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAE9C;;;;;;;;;;;OAWG;IACH,MAAM,aAAa,GAAG,MAAM,CAAgC,IAAI,GAAG,EAAE,CAAC,CAAC;IACvE,MAAM,gBAAgB,GAAG,MAAM,CAAS,EAAE,CAAC,CAAC;IAE5C,mFAAmF;IACnF,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,IAAI,QAAQ,KAAK,gBAAgB,CAAC,OAAO,EAAE,CAAC;QAC1C,gBAAgB,CAAC,OAAO,GAAG,QAAQ,CAAC;QACpC,aAAa,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QAClC,qDAAqD;QACrD,eAAe,CAAC,KAAK,CAAC,CAAC;QACvB,mBAAmB,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAE,WAAmB,EAAoB,EAAE;QACjF,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;IAC9B,CAAC,CAAC;IAEF;;;;;OAKG;IACH,MAAM,aAAa,GAAG,MAAM,CAAwD,IAAI,GAAG,EAAE,CAAC,CAAC;IAC/F,MAAM,gBAAgB,GAAG,MAAM,CAAS,EAAE,CAAC,CAAC;IAC5C,IAAI,QAAQ,KAAK,gBAAgB,CAAC,OAAO,EAAE,CAAC;QAC1C,gBAAgB,CAAC,OAAO,GAAG,QAAQ,CAAC;QACpC,aAAa,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAE,WAAmB,EAAE,EAAE;QAC7D,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;IAC9B,CAAC,CAAC;IAEF,6FAA6F;IAC7F,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9B,OAAO,YAAY,EAAE,YAAY;YAC/B,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,YAAY,CAAC;YACnE,CAAC,CAAC,EAAE,CAAC;QACP,uDAAuD;IACzD,CAAC,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;IAE1D,6EAA6E;IAC7E,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,CAAC,2BAA2B,CAAC,CAAC;IACzC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,gEAAgE;IAChE,MAAM,aAAa,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACnD,MAAM,cAAc,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAEpD,4DAA4D;IAC5D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC;QACzC,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC;QAC3C,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW;YAAE,OAAO;QAExC,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,MAAM,UAAU,GAAG,CAAC,MAAsB,EAAE,MAAsB,EAAE,EAAE;YACpE,IAAI,SAAS;gBAAE,OAAO;YACtB,SAAS,GAAG,IAAI,CAAC;YACjB,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;YACpC,qBAAqB,CAAC,GAAG,EAAE;gBACzB,SAAS,GAAG,KAAK,CAAC;YACpB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC/D,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAEhE,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACpD,WAAW,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAEtD,OAAO,GAAG,EAAE;YACV,UAAU,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACvD,WAAW,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC3D,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,0FAA0F;IAC1F,MAAM,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACxC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;YACnD,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC;YACjC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,kFAAkF;IAClF,mEAAmE;IACnE,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAChC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;YAC1D,YAAY,CAAC,OAAO,GAAG,QAAQ,CAAC;YAChC,SAAS,CAAC,oBAAoB,CAAC,CAAC;YAChC,kEAAkE;YAClE,MAAM,EAAE,GAAG,qBAAqB,CAAC,GAAG,EAAE;gBACpC,OAAO,CAAC,oBAAoB,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEtB,+EAA+E;IAC/E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;QAC3B,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACZ,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO;gBAAE,GAAG,CAAC,KAAK,EAAE,CAAC;iBACpC,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU;gBAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;iBAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;gBAAE,GAAG,CAAC,OAAO,EAAE,CAAC;;gBAC7C,GAAG,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CACpD,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,mBAAmB,GAAG,CAAC,KAAa,EAAE,EAAE;QAC5C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3C,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QACD,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,KAAC,kBAAkB,KAAG,CAAC;IAChC,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CACL,cAAK,SAAS,EAAC,6DAA6D,YAC1E,gDAA4B,GACxB,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,sDAAsD,aAEnE,eAAK,SAAS,EAAC,8DAA8D,aAC3E,eAAK,SAAS,EAAC,yBAAyB,aACtC,aAAI,SAAS,EAAC,uBAAuB,4BAAiB,EACtD,eAAK,SAAS,EAAC,iCAAiC,aAC7C,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,CACpB,gBAAM,SAAS,EAAC,oCAAoC,kBAAG,OAAO,CAAC,KAAK,IAAQ,CAC7E,EACA,OAAO,CAAC,QAAQ,GAAG,CAAC,IAAI,CACvB,gBAAM,SAAS,EAAC,kCAAkC,kBAAG,OAAO,CAAC,QAAQ,IAAQ,CAC9E,EACA,OAAO,CAAC,OAAO,GAAG,CAAC,IAAI,CACtB,gBAAM,SAAS,EAAC,gCAAgC,kBAAG,OAAO,CAAC,OAAO,IAAQ,CAC3E,IACG,IACF,EACL,OAAO,IAAI,CACV,KAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAE,OAAO,YAClD,KAAC,CAAC,IAAC,SAAS,EAAC,SAAS,GAAG,GAClB,CACV,IACG,EAEN,eAAK,SAAS,EAAC,6CAA6C,aAE1D,cAAK,SAAS,EAAC,iEAAiE,YAC9E,eAAK,SAAS,EAAC,eAAe,aAI3B,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;oCACtF,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oCAC5C,MAAM,UAAU,GAAG,KAAK,KAAK,iBAAiB,CAAC;oCAE/C,OAAO,CACL,0BACE,kBACE,OAAO,EAAE,GAAG,EAAE;oDACZ,oBAAoB,CAAC,KAAK,CAAC,CAAC;oDAC5B,IAAI,CAAC,UAAU,EAAE,CAAC;wDAChB,mBAAmB,CAAC,KAAK,CAAC,CAAC;oDAC7B,CAAC;gDACH,CAAC,EACD,SAAS,EAAE,EAAE,CACX,wGAAwG,EACxG,UAAU,IAAI,WAAW,CAC1B,aAED,eACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,CAAC,CAAC,EACZ,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;4DACb,CAAC,CAAC,eAAe,EAAE,CAAC;4DACpB,mBAAmB,CAAC,KAAK,CAAC,CAAC;wDAC7B,CAAC,EACD,SAAS,EAAC,eAAe,YAExB,UAAU,CAAC,CAAC,CAAC,CACZ,KAAC,WAAW,IAAC,SAAS,EAAC,SAAS,GAAG,CACpC,CAAC,CAAC,CAAC,CACF,KAAC,YAAY,IAAC,SAAS,EAAC,SAAS,GAAG,CACrC,GACI,EACP,eAAM,SAAS,EAAC,mCAAmC,YAAE,IAAI,CAAC,SAAS,GAAQ,EAC3E,KAAC,eAAe,IAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAI,IACjC,EAKR,UAAU,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,GAAG,EAAE;gDACtE,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gDAC9D,OAAO,CACL,cAAK,SAAS,EAAC,qDAAqD,YAClE,eAAK,SAAS,EAAC,WAAW,aACvB,KAAK,CAAC,SAAS,kBAAc,KAAK,CAAC,SAAS,kBACzC,GACF,CACP,CAAC;4CACJ,CAAC,CAAC,EAAE,KA5CI,KAAK,CA6CT,CACP,CAAC;gCACJ,CAAC,CAAC,EAID,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,GAAG,yBAAyB,IAAI,CAC5D,eAAK,SAAS,EAAC,0FAA0F,aACvG,aAAG,SAAS,EAAC,QAAQ,yBACV,yBAAyB,UAAM,KAAK,CAAC,MAAM,cAClD,EACJ,MAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,IAAI,EACT,SAAS,EAAC,oBAAoB,EAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,0BAE1B,KAAK,CAAC,MAAM,cACf,IACL,CACP,IACG,GACF,EAGN,eAAK,SAAS,EAAC,sDAAsD,aAEnE,cAAK,SAAS,EAAC,8CAA8C,YAC3D,eAAK,SAAS,EAAC,mCAAmC,aAChD,eAAM,SAAS,EAAC,iCAAiC,YAAE,YAAY,EAAE,SAAS,GAAQ,EAClF,KAAC,eAAe,IAAC,MAAM,EAAE,YAAY,EAAE,MAAM,IAAI,WAAW,GAAI,IAC5D,GACF,EAGL,YAAY,EAAE,MAAM,KAAK,UAAU,IAAI,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;4BAClE,6EAA6E;4BAC7E,wEAAwE;4BACxE,4DAA4D;4BAC5D,eAAe,CAAC,YAAY,CAAC,YAAY,CAAC;gCAC1C,CAAC,gBAAgB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CACzC,eAAK,SAAS,EAAC,sGAAsG,aACnH,aAAG,SAAS,EAAC,UAAU,0CACK,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,mDAE3E,EACJ,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,GAAG,EAAE,CACZ,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,0BAI/D,IACL,CACP,CAAC,CAAC,CAAC,CACJ,eAAK,SAAS,EAAC,6CAA6C,aAE1D,eAAK,SAAS,EAAC,+CAA+C,aAC5D,cAAK,SAAS,EAAC,0FAA0F,YACtG,WAAW,CAAC,CAAC,CAAC,CACb,KAAC,SAAS,IAAC,IAAI,EAAE,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,aAAa,GAAI,CAChF,CAAC,CAAC,CAAC,CACF,SAAS,CACV,GACG,EACN,cACE,GAAG,EAAE,aAAa,EAClB,SAAS,EAAC,sCAAsC,EAChD,QAAQ,EAAE,CAAC,gBACA,2CAAsC,YAEhD,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;oDAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;wDAC7B,OAAO,KAAC,UAAU,MAAM,GAAG,CAAI,CAAC;oDAClC,CAAC;oDACD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wDAC3B,OAAO,CACL,KAAC,QAAQ,IAAW,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAC,QAAQ,EAAC,IAAI,EAAC,MAAM,IAArD,GAAG,CAAqD,CACxE,CAAC;oDACJ,CAAC;oDACD,OAAO,CACL,KAAC,QAAQ,IAEP,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,UAAU,EAAE,IAAI,CAAC,cAAc,EAC/B,IAAI,EAAC,MAAM,IAJN,GAAG,CAKR,CACH,CAAC;gDACJ,CAAC,CAAC,GACE,IACF,EAGN,eAAK,SAAS,EAAC,sCAAsC,aACnD,cAAK,SAAS,EAAC,0FAA0F,YACtG,WAAW,CAAC,CAAC,CAAC,CACb,KAAC,SAAS,IAAC,IAAI,EAAE,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,cAAc,GAAI,CAClF,CAAC,CAAC,CAAC,CACF,UAAU,CACX,GACG,EACN,cACE,GAAG,EAAE,cAAc,EACnB,SAAS,EAAC,sCAAsC,EAChD,QAAQ,EAAE,CAAC,gBACA,4CAAuC,YAEjD,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;oDAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;wDAC7B,OAAO,KAAC,UAAU,MAAM,GAAG,CAAI,CAAC;oDAClC,CAAC;oDACD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wDAC3B,OAAO,CACL,KAAC,QAAQ,IAAW,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAC,QAAQ,EAAC,IAAI,EAAC,OAAO,IAAtD,GAAG,CAAsD,CACzE,CAAC;oDACJ,CAAC;oDACD,OAAO,CACL,KAAC,QAAQ,IAEP,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,UAAU,EAAE,IAAI,CAAC,eAAe,EAChC,IAAI,EAAC,OAAO,IAJP,GAAG,CAKR,CACH,CAAC;gDACJ,CAAC,CAAC,GACE,IACF,IACF,CACL,CACF,CAAC,CAAC,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CACrC,eAAK,SAAS,EAAC,sDAAsD,aACnE,eAAK,SAAS,EAAC,oFAAoF,wCACzE,UAAU,IAC9B,EACN,cAAK,SAAS,EAAC,0EAA0E,+DAEnF,IACF,CACP,CAAC,CAAC,CAAC,YAAY,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CACvC,eAAK,SAAS,EAAC,sDAAsD,aACnE,eAAK,SAAS,EAAC,8EAA8E,4CAC/D,SAAS,IACjC,EACN,cAAK,SAAS,EAAC,0EAA0E,iEAEnF,IACF,CACP,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,+DAA+D,YAC5E,kDAA8B,GAC1B,CACP,IACG,IACF,EAGL,qBAAqB,IAAI,CACxB,eAAK,SAAS,EAAC,4EAA4E,aACxF,WAAW,IAAI,CACd,eAAM,SAAS,EAAC,uCAAuC,4DAEhD,CACR,EACD,MAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,YAAY,CAAC,EACxC,QAAQ,EAAE,WAAW,EACrB,SAAS,EAAC,iBAAiB,EAC3B,KAAK,EAAE,YAAY,UAAU,IAAI,iBAAiB,UAAU,sBAEtD,UAAU,IAAI,iBAAiB,IAC9B,EACT,MAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,EACzC,QAAQ,EAAE,WAAW,EACrB,SAAS,EAAC,iBAAiB,EAC3B,KAAK,EAAE,YAAY,WAAW,IAAI,qBAAqB,UAAU,sBAE3D,WAAW,IAAI,qBAAqB,IACnC,EACT,KAAC,MAAM,IACL,OAAO,EAAC,WAAW,EACnB,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,EACnC,QAAQ,EAAE,WAAW,EACrB,SAAS,EAAC,uBAAuB,EACjC,KAAK,EAAC,sCAAsC,sBAGrC,EACR,WAAW,IAAI,KAAC,OAAO,IAAC,SAAS,EAAC,iDAAiD,GAAG,IACnF,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @skillmeat/content-viewer — Diff Types
3
+ *
4
+ * Generic diff types used by DiffViewer. These mirror the SkillMeat API
5
+ * FileDiff model but contain no domain-specific logic.
6
+ */
7
+ /**
8
+ * Diff information for a single file within an artifact comparison.
9
+ */
10
+ export interface FileDiff {
11
+ /**
12
+ * Relative path to file within artifact
13
+ */
14
+ file_path: string;
15
+ /**
16
+ * Change status of file
17
+ */
18
+ status: 'added' | 'modified' | 'deleted' | 'unchanged';
19
+ /**
20
+ * SHA-256 hash for the left/before version (e.g. collection)
21
+ */
22
+ collection_hash?: string | null;
23
+ /**
24
+ * SHA-256 hash for the right/after version (e.g. project)
25
+ */
26
+ project_hash?: string | null;
27
+ /**
28
+ * Unified diff content (for modified files)
29
+ */
30
+ unified_diff?: string | null;
31
+ }
32
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/diff/diff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;IACvD;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @skillmeat/content-viewer — Diff Types
3
+ *
4
+ * Generic diff types used by DiffViewer. These mirror the SkillMeat API
5
+ * FileDiff model but contain no domain-specific logic.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/diff/diff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,4 @@
1
+ export { DiffViewer, DiffViewerSkeleton } from './DiffViewer';
2
+ export type { DiffViewerProps, ResolutionType, TierContext } from './DiffViewer';
3
+ export type { FileDiff } from './diff';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/diff/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC9D,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACjF,YAAY,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,3 @@
1
+ // @miethe/ui — diff submodule
2
+ export { DiffViewer, DiffViewerSkeleton } from './DiffViewer';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/diff/index.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,31 @@
1
+ export interface FilePreviewPaneProps {
2
+ filePath: string | null;
3
+ content: string | null;
4
+ tier: 'source' | 'collection' | 'project';
5
+ isLoading: boolean;
6
+ }
7
+ /**
8
+ * FilePreviewPane - Displays file content with appropriate rendering
9
+ *
10
+ * Features:
11
+ * - Markdown rendering with basic HTML conversion
12
+ * - Syntax-highlighted code display
13
+ * - Plain text display for other files
14
+ * - Loading skeleton state
15
+ * - Empty state when no file selected
16
+ * - Error state for unavailable content
17
+ * - Tier badge showing which version is displayed
18
+ * - Dark mode support
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * <FilePreviewPane
23
+ * filePath="README.md"
24
+ * content={fileContent}
25
+ * tier="collection"
26
+ * isLoading={false}
27
+ * />
28
+ * ```
29
+ */
30
+ export declare function FilePreviewPane({ filePath, content, tier, isLoading }: FilePreviewPaneProps): import("react/jsx-runtime").JSX.Element;
31
+ //# sourceMappingURL=FilePreviewPane.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilePreviewPane.d.ts","sourceRoot":"","sources":["../../src/display/FilePreviewPane.tsx"],"names":[],"mappings":"AAYA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS,CAAC;IAC1C,SAAS,EAAE,OAAO,CAAC;CACpB;AA8LD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,oBAAoB,2CAgD3F"}