@hanzo/ui 5.3.25 → 5.3.28

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 (326) hide show
  1. package/content/index.ts +26 -0
  2. package/docs/_registry/index.ts +426 -0
  3. package/docs/_registry/layout/docs-min.tsx +197 -0
  4. package/docs/_registry/layout/page-min.tsx +128 -0
  5. package/docs/components/accordion.tsx +118 -0
  6. package/docs/components/banner.tsx +144 -0
  7. package/docs/components/callout.tsx +112 -0
  8. package/docs/components/card.tsx +52 -0
  9. package/docs/components/codeblock.tsx +258 -0
  10. package/docs/components/dialog/search-algolia.tsx +132 -0
  11. package/docs/components/dialog/search-default.tsx +131 -0
  12. package/docs/components/dialog/search-orama.tsx +143 -0
  13. package/docs/components/dialog/search.tsx +529 -0
  14. package/docs/components/dynamic-codeblock.tsx +129 -0
  15. package/docs/components/files.tsx +81 -0
  16. package/docs/components/github-info.tsx +107 -0
  17. package/docs/components/heading.tsx +33 -0
  18. package/docs/components/image-zoom.css +77 -0
  19. package/docs/components/image-zoom.tsx +58 -0
  20. package/docs/components/index.ts +7 -0
  21. package/docs/components/inline-toc.tsx +48 -0
  22. package/docs/components/sidebar/base.tsx +451 -0
  23. package/docs/components/sidebar/link-item.tsx +65 -0
  24. package/docs/components/sidebar/page-tree.tsx +113 -0
  25. package/docs/components/sidebar/tabs/dropdown.tsx +109 -0
  26. package/docs/components/sidebar/tabs/index.tsx +89 -0
  27. package/docs/components/steps.tsx +9 -0
  28. package/docs/components/tabs.tsx +203 -0
  29. package/docs/components/toc/clerk.tsx +173 -0
  30. package/docs/components/toc/default.tsx +57 -0
  31. package/docs/components/toc/index.tsx +136 -0
  32. package/docs/components/type-table.tsx +174 -0
  33. package/docs/components/ui/accordion.tsx +88 -0
  34. package/docs/components/ui/button.tsx +28 -0
  35. package/docs/components/ui/collapsible.tsx +42 -0
  36. package/docs/components/ui/navigation-menu.tsx +83 -0
  37. package/docs/components/ui/popover.tsx +32 -0
  38. package/docs/components/ui/scroll-area.tsx +59 -0
  39. package/docs/components/ui/tabs.tsx +145 -0
  40. package/docs/contexts/i18n.tsx +56 -0
  41. package/docs/contexts/search.tsx +165 -0
  42. package/docs/contexts/tree.tsx +65 -0
  43. package/docs/css/black.css +39 -0
  44. package/docs/css/catppuccin.css +49 -0
  45. package/docs/css/colors/index.css +51 -0
  46. package/docs/css/dusk.css +47 -0
  47. package/docs/css/layouts/docs.css +1 -0
  48. package/docs/css/layouts/home.css +1 -0
  49. package/docs/css/layouts/notebook.css +1 -0
  50. package/docs/css/neutral.css +7 -0
  51. package/docs/css/ocean.css +48 -0
  52. package/docs/css/preset.css +305 -0
  53. package/docs/css/purple.css +39 -0
  54. package/docs/css/shadcn.css +36 -0
  55. package/docs/css/shiki.css +90 -0
  56. package/docs/css/solar.css +75 -0
  57. package/docs/css/style.css +9 -0
  58. package/docs/css/vitepress.css +77 -0
  59. package/docs/i18n.tsx +30 -0
  60. package/docs/icons.tsx +354 -0
  61. package/docs/layouts/docs/client.tsx +129 -0
  62. package/docs/layouts/docs/index.tsx +321 -0
  63. package/docs/layouts/docs/page/client.tsx +376 -0
  64. package/docs/layouts/docs/page/index.tsx +251 -0
  65. package/docs/layouts/docs/sidebar.tsx +265 -0
  66. package/docs/layouts/home/client.tsx +375 -0
  67. package/docs/layouts/home/index.tsx +51 -0
  68. package/docs/layouts/home/navbar.tsx +55 -0
  69. package/docs/layouts/notebook/client.tsx +281 -0
  70. package/docs/layouts/notebook/index.tsx +461 -0
  71. package/docs/layouts/notebook/page/client.tsx +375 -0
  72. package/docs/layouts/notebook/page/index.tsx +251 -0
  73. package/docs/layouts/notebook/sidebar.tsx +248 -0
  74. package/docs/layouts/shared/index.tsx +89 -0
  75. package/docs/layouts/shared/language-toggle.tsx +66 -0
  76. package/docs/layouts/shared/link-item.tsx +119 -0
  77. package/docs/layouts/shared/search-toggle.tsx +78 -0
  78. package/docs/layouts/shared/theme-toggle.tsx +86 -0
  79. package/docs/mdx.server.tsx +37 -0
  80. package/docs/mdx.tsx +97 -0
  81. package/docs/og.tsx +101 -0
  82. package/docs/page.tsx +85 -0
  83. package/docs/provider/base.tsx +173 -0
  84. package/docs/provider/next.tsx +23 -0
  85. package/docs/provider/react-router.tsx +23 -0
  86. package/docs/provider/tanstack.tsx +23 -0
  87. package/docs/provider/waku.tsx +23 -0
  88. package/docs/source.ts +3 -0
  89. package/docs/theme/typography/LICENSE +21 -0
  90. package/docs/theme/typography/index.ts +201 -0
  91. package/docs/theme/typography/styles.ts +449 -0
  92. package/docs/utils/cn.ts +1 -0
  93. package/docs/utils/is-active.ts +23 -0
  94. package/docs/utils/merge-refs.ts +15 -0
  95. package/docs/utils/use-copy-button.ts +39 -0
  96. package/docs/utils/use-footer-items.ts +27 -0
  97. package/docs/utils/use-is-scroll-top.ts +21 -0
  98. package/package.json +8 -2
  99. package/dist/3d/button.js +0 -298
  100. package/dist/3d/button.mjs +0 -273
  101. package/dist/3d/card.js +0 -234
  102. package/dist/3d/card.mjs +0 -207
  103. package/dist/3d/carousel.js +0 -371
  104. package/dist/3d/carousel.mjs +0 -344
  105. package/dist/3d/grid.js +0 -362
  106. package/dist/3d/grid.mjs +0 -337
  107. package/dist/3d/index.js +0 -1518
  108. package/dist/3d/index.mjs +0 -1472
  109. package/dist/3d/marquee.js +0 -352
  110. package/dist/3d/marquee.mjs +0 -327
  111. package/dist/3d/pin.js +0 -46
  112. package/dist/3d/pin.mjs +0 -24
  113. package/dist/accordion.js +0 -80
  114. package/dist/accordion.mjs +0 -55
  115. package/dist/alert-dialog.js +0 -220
  116. package/dist/alert-dialog.mjs +0 -187
  117. package/dist/alert.js +0 -68
  118. package/dist/alert.mjs +0 -64
  119. package/dist/animation/animated-background.js +0 -424
  120. package/dist/animation/animated-background.mjs +0 -418
  121. package/dist/animation/animated-beam.js +0 -119
  122. package/dist/animation/animated-beam.mjs +0 -97
  123. package/dist/animation/animated-cursor.js +0 -275
  124. package/dist/animation/animated-cursor.mjs +0 -270
  125. package/dist/animation/animated-icon.js +0 -357
  126. package/dist/animation/animated-icon.mjs +0 -351
  127. package/dist/animation/animated-list.js +0 -339
  128. package/dist/animation/animated-list.mjs +0 -333
  129. package/dist/animation/animated-number.js +0 -283
  130. package/dist/animation/animated-number.mjs +0 -277
  131. package/dist/animation/animated-testimonials.js +0 -97
  132. package/dist/animation/animated-testimonials.mjs +0 -75
  133. package/dist/animation/animated-tooltip.js +0 -67
  134. package/dist/animation/animated-tooltip.mjs +0 -45
  135. package/dist/animation/apple-cards-carousel.js +0 -308
  136. package/dist/animation/apple-cards-carousel.mjs +0 -285
  137. package/dist/animation/apple-hello-effect.js +0 -60
  138. package/dist/animation/apple-hello-effect.mjs +0 -38
  139. package/dist/animation/index.js +0 -1952
  140. package/dist/animation/index.mjs +0 -1921
  141. package/dist/avatar.js +0 -71
  142. package/dist/avatar.mjs +0 -47
  143. package/dist/badge.js +0 -66
  144. package/dist/badge.mjs +0 -40
  145. package/dist/blocks/index.js +0 -1665
  146. package/dist/blocks/index.mjs +0 -1626
  147. package/dist/breadcrumb.js +0 -107
  148. package/dist/breadcrumb.mjs +0 -99
  149. package/dist/calendar.js +0 -189
  150. package/dist/calendar.mjs +0 -164
  151. package/dist/carousel.js +0 -278
  152. package/dist/carousel.mjs +0 -249
  153. package/dist/checkbox.js +0 -60
  154. package/dist/checkbox.mjs +0 -35
  155. package/dist/code/block.js +0 -226
  156. package/dist/code/block.mjs +0 -203
  157. package/dist/code/compare.js +0 -446
  158. package/dist/code/compare.mjs +0 -423
  159. package/dist/code/diff.js +0 -430
  160. package/dist/code/diff.mjs +0 -407
  161. package/dist/code/editor.js +0 -243
  162. package/dist/code/editor.mjs +0 -218
  163. package/dist/code/explorer.js +0 -291
  164. package/dist/code/explorer.mjs +0 -268
  165. package/dist/code/index.js +0 -2551
  166. package/dist/code/index.mjs +0 -2510
  167. package/dist/code/preview.js +0 -400
  168. package/dist/code/preview.mjs +0 -377
  169. package/dist/code/snippet.js +0 -274
  170. package/dist/code/snippet.mjs +0 -250
  171. package/dist/code/tabs.js +0 -75
  172. package/dist/code/tabs.mjs +0 -53
  173. package/dist/code/terminal.js +0 -437
  174. package/dist/code/terminal.mjs +0 -414
  175. package/dist/collapsible.js +0 -33
  176. package/dist/collapsible.mjs +0 -9
  177. package/dist/command.js +0 -262
  178. package/dist/command.mjs +0 -232
  179. package/dist/context-menu.js +0 -207
  180. package/dist/context-menu.mjs +0 -171
  181. package/dist/device/index.js +0 -3
  182. package/dist/device/index.mjs +0 -2
  183. package/dist/dialog.js +0 -151
  184. package/dist/dialog.mjs +0 -121
  185. package/dist/dock/basic.js +0 -174
  186. package/dist/dock/basic.mjs +0 -151
  187. package/dist/dock/index.js +0 -628
  188. package/dist/dock/index.mjs +0 -601
  189. package/dist/dock/limelight-nav.js +0 -295
  190. package/dist/dock/limelight-nav.mjs +0 -274
  191. package/dist/dock/macos.js +0 -141
  192. package/dist/dock/macos.mjs +0 -118
  193. package/dist/dock/menu.js +0 -70
  194. package/dist/dock/menu.mjs +0 -48
  195. package/dist/dock/message.js +0 -144
  196. package/dist/dock/message.mjs +0 -122
  197. package/dist/drawer.js +0 -115
  198. package/dist/drawer.mjs +0 -103
  199. package/dist/dropdown-menu.js +0 -202
  200. package/dist/dropdown-menu.mjs +0 -166
  201. package/dist/finance/AdvancedChart.js +0 -48
  202. package/dist/finance/AdvancedChart.mjs +0 -46
  203. package/dist/finance/CompanyProfile.js +0 -48
  204. package/dist/finance/CompanyProfile.mjs +0 -46
  205. package/dist/finance/CryptoScreener.js +0 -45
  206. package/dist/finance/CryptoScreener.mjs +0 -43
  207. package/dist/finance/Financials.js +0 -52
  208. package/dist/finance/Financials.mjs +0 -50
  209. package/dist/finance/ForexScreener.js +0 -46
  210. package/dist/finance/ForexScreener.mjs +0 -44
  211. package/dist/finance/MarketOverview.js +0 -104
  212. package/dist/finance/MarketOverview.mjs +0 -102
  213. package/dist/finance/NewsTimeline.js +0 -44
  214. package/dist/finance/NewsTimeline.mjs +0 -42
  215. package/dist/finance/OrderEntry.js +0 -131
  216. package/dist/finance/OrderEntry.mjs +0 -129
  217. package/dist/finance/OrdersHistory.js +0 -64
  218. package/dist/finance/OrdersHistory.mjs +0 -62
  219. package/dist/finance/PositionsList.js +0 -80
  220. package/dist/finance/PositionsList.mjs +0 -78
  221. package/dist/finance/StockScreener.js +0 -46
  222. package/dist/finance/StockScreener.mjs +0 -44
  223. package/dist/finance/SymbolInfo.js +0 -46
  224. package/dist/finance/SymbolInfo.mjs +0 -44
  225. package/dist/finance/TechnicalAnalysis.js +0 -54
  226. package/dist/finance/TechnicalAnalysis.mjs +0 -52
  227. package/dist/finance/TickerTape.js +0 -56
  228. package/dist/finance/TickerTape.mjs +0 -54
  229. package/dist/finance/TradingPanel.js +0 -191
  230. package/dist/finance/TradingPanel.mjs +0 -189
  231. package/dist/finance/index.js +0 -930
  232. package/dist/finance/index.mjs +0 -914
  233. package/dist/form/index.js +0 -155
  234. package/dist/form/index.mjs +0 -125
  235. package/dist/form.js +0 -172
  236. package/dist/form.mjs +0 -142
  237. package/dist/hover-card.js +0 -58
  238. package/dist/hover-card.mjs +0 -34
  239. package/dist/index.js +0 -10179
  240. package/dist/index.mjs +0 -9785
  241. package/dist/input-otp.js +0 -79
  242. package/dist/input-otp.mjs +0 -54
  243. package/dist/lib/utils.js +0 -28
  244. package/dist/lib/utils.mjs +0 -24
  245. package/dist/navigation/index.js +0 -98
  246. package/dist/navigation/index.mjs +0 -79
  247. package/dist/navigation-menu.js +0 -149
  248. package/dist/navigation-menu.mjs +0 -116
  249. package/dist/pattern/grid-pattern.js +0 -333
  250. package/dist/pattern/grid-pattern.mjs +0 -310
  251. package/dist/pattern/index.js +0 -333
  252. package/dist/pattern/index.mjs +0 -310
  253. package/dist/popover.js +0 -63
  254. package/dist/popover.mjs +0 -37
  255. package/dist/primitives/index.js +0 -10179
  256. package/dist/primitives/index.mjs +0 -9785
  257. package/dist/primitives-export.js +0 -10179
  258. package/dist/primitives-export.mjs +0 -9785
  259. package/dist/progress.js +0 -62
  260. package/dist/progress.mjs +0 -37
  261. package/dist/project/gantt.js +0 -65
  262. package/dist/project/gantt.mjs +0 -43
  263. package/dist/project/index.js +0 -636
  264. package/dist/project/index.mjs +0 -611
  265. package/dist/project/kanban.js +0 -597
  266. package/dist/project/kanban.mjs +0 -572
  267. package/dist/project/list.js +0 -35
  268. package/dist/project/list.mjs +0 -12
  269. package/dist/radio-group.js +0 -68
  270. package/dist/radio-group.mjs +0 -45
  271. package/dist/resizable.js +0 -72
  272. package/dist/resizable.mjs +0 -48
  273. package/dist/scroll-area.js +0 -89
  274. package/dist/scroll-area.mjs +0 -66
  275. package/dist/select.js +0 -140
  276. package/dist/select.mjs +0 -111
  277. package/dist/separator.js +0 -59
  278. package/dist/separator.mjs +0 -34
  279. package/dist/sheet.js +0 -148
  280. package/dist/sheet.mjs +0 -117
  281. package/dist/skeleton.js +0 -32
  282. package/dist/skeleton.mjs +0 -27
  283. package/dist/slider.js +0 -99
  284. package/dist/slider.mjs +0 -73
  285. package/dist/sonner.js +0 -34
  286. package/dist/sonner.mjs +0 -29
  287. package/dist/switch.js +0 -62
  288. package/dist/switch.mjs +0 -37
  289. package/dist/table.js +0 -110
  290. package/dist/table.mjs +0 -101
  291. package/dist/tabs.js +0 -82
  292. package/dist/tabs.mjs +0 -57
  293. package/dist/tailwind/index.js +0 -2023
  294. package/dist/tailwind/index.mjs +0 -2011
  295. package/dist/textarea.js +0 -78
  296. package/dist/textarea.mjs +0 -56
  297. package/dist/toggle-group.js +0 -118
  298. package/dist/toggle-group.mjs +0 -93
  299. package/dist/toggle.js +0 -71
  300. package/dist/toggle.mjs +0 -48
  301. package/dist/tooltip.js +0 -67
  302. package/dist/tooltip.mjs +0 -40
  303. package/dist/types/index.js +0 -57
  304. package/dist/types/index.mjs +0 -51
  305. package/dist/ui/announcement.js +0 -129
  306. package/dist/ui/announcement.mjs +0 -107
  307. package/dist/ui/avatar-group.js +0 -88
  308. package/dist/ui/avatar-group.mjs +0 -65
  309. package/dist/ui/banner.js +0 -85
  310. package/dist/ui/banner.mjs +0 -62
  311. package/dist/ui/cursor.js +0 -78
  312. package/dist/ui/cursor.mjs +0 -56
  313. package/dist/ui/index.js +0 -475
  314. package/dist/ui/index.mjs +0 -442
  315. package/dist/ui/marquee.js +0 -74
  316. package/dist/ui/marquee.mjs +0 -52
  317. package/dist/ui/pill.js +0 -85
  318. package/dist/ui/pill.mjs +0 -62
  319. package/dist/ui/spinner.js +0 -28
  320. package/dist/ui/spinner.mjs +0 -26
  321. package/dist/ui/tags.js +0 -101
  322. package/dist/ui/tags.mjs +0 -79
  323. package/dist/ui/ticker.js +0 -73
  324. package/dist/ui/ticker.mjs +0 -51
  325. package/dist/util/index.js +0 -457
  326. package/dist/util/index.mjs +0 -399
@@ -1,423 +0,0 @@
1
- "use client";
2
- import * as React from 'react';
3
- import { cva } from 'class-variance-authority';
4
- import { Check, Copy, MoreHorizontal, RotateCcw, Settings } from 'lucide-react';
5
- import { cn } from '@hanzo/ui/lib/utils';
6
- import { Badge } from '@hanzo/ui/badge';
7
- import { Button } from '@hanzo/ui/button';
8
- import { CodeDiff } from '@hanzo/ui/code/diff';
9
- import { CodeSnippet } from '@hanzo/ui/code/snippet';
10
- import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem } from '@hanzo/ui/dropdown-menu';
11
- import { ScrollArea } from '@hanzo/ui/scroll-area';
12
- import { Tabs, TabsList, TabsTrigger } from '@hanzo/ui/tabs';
13
- import { jsxs, jsx } from 'react/jsx-runtime';
14
-
15
- var __defProp = Object.defineProperty;
16
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
17
- var codeCompareVariants = cva(
18
- "relative flex flex-col overflow-hidden rounded-lg border bg-background",
19
- {
20
- variants: {
21
- layout: {
22
- horizontal: "flex-col",
23
- vertical: "flex-row"
24
- },
25
- size: {
26
- sm: "text-xs",
27
- default: "text-sm",
28
- lg: "text-base"
29
- }
30
- },
31
- defaultVariants: {
32
- layout: "horizontal",
33
- size: "default"
34
- }
35
- }
36
- );
37
- var CodeCompare = React.forwardRef(
38
- ({
39
- className,
40
- layout,
41
- size,
42
- files,
43
- defaultView = "side-by-side",
44
- showLineNumbers = true,
45
- showCopyButton = true,
46
- allowMerge = false,
47
- conflictMarkers = [],
48
- onMergeConflict,
49
- onFileSelect,
50
- height = "600px",
51
- syncScroll = true,
52
- ...props
53
- }, ref) => {
54
- const [view, setView] = React.useState(defaultView);
55
- const [selectedFiles, setSelectedFiles] = React.useState(() => {
56
- if (files.length >= 2) {
57
- return [files[0].id, files[1].id];
58
- }
59
- return files.length > 0 ? [files[0].id] : [];
60
- });
61
- const [mergeState, setMergeState] = React.useState({
62
- resolved: {},
63
- conflicts: conflictMarkers
64
- });
65
- const [copied, setCopied] = React.useState(false);
66
- const scrollRefs = React.useRef({});
67
- const handleScroll = React.useCallback(
68
- (sourceId, scrollTop) => {
69
- if (!syncScroll) return;
70
- Object.entries(scrollRefs.current).forEach(([id, ref2]) => {
71
- if (id !== sourceId && ref2) {
72
- ref2.scrollTop = scrollTop;
73
- }
74
- });
75
- },
76
- [syncScroll]
77
- );
78
- const copyComparison = React.useCallback(async () => {
79
- const comparison = selectedFiles.map((fileId) => {
80
- const file = files.find((f) => f.id === fileId);
81
- return file ? `=== ${file.filename} ===
82
- ${file.content}` : "";
83
- }).join("\n\n");
84
- try {
85
- await navigator.clipboard.writeText(comparison);
86
- setCopied(true);
87
- setTimeout(() => setCopied(false), 2e3);
88
- } catch (error) {
89
- console.error("Failed to copy comparison:", error);
90
- }
91
- }, [files, selectedFiles]);
92
- const resolveConflict = React.useCallback(
93
- (conflictIndex, resolution) => {
94
- setMergeState((prev) => ({
95
- ...prev,
96
- resolved: {
97
- ...prev.resolved,
98
- [conflictIndex]: resolution
99
- }
100
- }));
101
- onMergeConflict?.(resolution);
102
- },
103
- [onMergeConflict]
104
- );
105
- const getFileStats = React.useCallback(
106
- (file1, file2) => {
107
- const lines1 = file1.content.split("\n");
108
- const lines2 = file2.content.split("\n");
109
- let added = 0;
110
- let removed = 0;
111
- let modified = 0;
112
- const maxLines = Math.max(lines1.length, lines2.length);
113
- for (let i = 0; i < maxLines; i++) {
114
- const line1 = lines1[i];
115
- const line2 = lines2[i];
116
- if (line1 === void 0) {
117
- added++;
118
- } else if (line2 === void 0) {
119
- removed++;
120
- } else if (line1 !== line2) {
121
- modified++;
122
- }
123
- }
124
- return { added, removed, modified };
125
- },
126
- []
127
- );
128
- const renderFileSelector = /* @__PURE__ */ __name(() => /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2 flex-wrap", children: files.map((file, index) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
129
- /* @__PURE__ */ jsxs(
130
- Button,
131
- {
132
- variant: selectedFiles.includes(file.id) ? "default" : "outline",
133
- size: "sm",
134
- onClick: () => {
135
- if (view === "three-way") {
136
- setSelectedFiles((prev) => {
137
- if (prev.includes(file.id)) {
138
- return prev.filter((id) => id !== file.id);
139
- }
140
- return prev.length < 3 ? [...prev, file.id] : [prev[1], prev[2], file.id];
141
- });
142
- } else {
143
- setSelectedFiles((prev) => {
144
- if (prev.includes(file.id)) {
145
- return prev.filter((id) => id !== file.id);
146
- }
147
- return prev.length < 2 ? [...prev, file.id] : [prev[1], file.id];
148
- });
149
- }
150
- onFileSelect?.(file.id);
151
- },
152
- className: "gap-2",
153
- children: [
154
- file.label || file.filename,
155
- file.version && /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "text-xs", children: file.version })
156
- ]
157
- }
158
- ),
159
- index < files.length - 1 && view !== "three-way" && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "vs" })
160
- ] }, file.id)) }), "renderFileSelector");
161
- const renderSideBySide = /* @__PURE__ */ __name(() => {
162
- const [file1, file2] = selectedFiles.map((id) => files.find((f) => f.id === id)).filter(Boolean);
163
- if (!file1 || !file2) {
164
- return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-32 text-muted-foreground", children: "Select two files to compare" });
165
- }
166
- const stats = getFileStats(file1, file2);
167
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col h-full", children: [
168
- /* @__PURE__ */ jsx("div", { className: "flex items-center justify-between border-b px-4 py-2 bg-muted/30", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
169
- /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "Comparison" }),
170
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 text-xs", children: [
171
- /* @__PURE__ */ jsxs("span", { className: "text-green-600", children: [
172
- "+",
173
- stats.added
174
- ] }),
175
- /* @__PURE__ */ jsxs("span", { className: "text-red-600", children: [
176
- "-",
177
- stats.removed
178
- ] }),
179
- /* @__PURE__ */ jsxs("span", { className: "text-yellow-600", children: [
180
- "~",
181
- stats.modified
182
- ] })
183
- ] })
184
- ] }) }),
185
- /* @__PURE__ */ jsx("div", { className: "flex-1 min-h-0", children: /* @__PURE__ */ jsx(
186
- CodeDiff,
187
- {
188
- oldCode: file1.content,
189
- newCode: file2.content,
190
- language: file1.language,
191
- oldFilename: file1.filename,
192
- newFilename: file2.filename,
193
- showLineNumbers,
194
- showCopyButton: false,
195
- maxHeight: "100%",
196
- defaultView: "split",
197
- className: "border-0 rounded-none h-full"
198
- }
199
- ) })
200
- ] });
201
- }, "renderSideBySide");
202
- const renderUnified = /* @__PURE__ */ __name(() => {
203
- const [file1, file2] = selectedFiles.map((id) => files.find((f) => f.id === id)).filter(Boolean);
204
- if (!file1 || !file2) {
205
- return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-32 text-muted-foreground", children: "Select two files to compare" });
206
- }
207
- return /* @__PURE__ */ jsx(
208
- CodeDiff,
209
- {
210
- oldCode: file1.content,
211
- newCode: file2.content,
212
- language: file1.language,
213
- filename: `${file1.filename} \u2192 ${file2.filename}`,
214
- showLineNumbers,
215
- showCopyButton: false,
216
- maxHeight: "100%",
217
- defaultView: "unified",
218
- className: "border-0 rounded-none"
219
- }
220
- );
221
- }, "renderUnified");
222
- const renderThreeWay = /* @__PURE__ */ __name(() => {
223
- const [base, current, incoming] = selectedFiles.map((id) => files.find((f) => f.id === id)).filter(Boolean);
224
- if (!base || !current || !incoming) {
225
- return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-32 text-muted-foreground", children: "Select three files for three-way merge (base, current, incoming)" });
226
- }
227
- return /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-3 gap-0 h-full", children: [
228
- /* @__PURE__ */ jsxs("div", { className: "border-r", children: [
229
- /* @__PURE__ */ jsx("div", { className: "border-b px-4 py-2 bg-muted/30", children: /* @__PURE__ */ jsxs("span", { className: "text-sm font-medium", children: [
230
- "Base (",
231
- base.filename,
232
- ")"
233
- ] }) }),
234
- /* @__PURE__ */ jsx(
235
- ScrollArea,
236
- {
237
- className: "h-full",
238
- ref: (ref2) => {
239
- scrollRefs.current["base"] = ref2;
240
- },
241
- onScrollCapture: (e) => {
242
- const target = e.target;
243
- handleScroll("base", target.scrollTop);
244
- },
245
- children: /* @__PURE__ */ jsx(
246
- CodeSnippet,
247
- {
248
- code: base.content,
249
- language: base.language,
250
- showLineNumbers,
251
- showCopyButton: false,
252
- showHeader: false,
253
- className: "border-0 rounded-none"
254
- }
255
- )
256
- }
257
- )
258
- ] }),
259
- /* @__PURE__ */ jsxs("div", { className: "border-r", children: [
260
- /* @__PURE__ */ jsx("div", { className: "border-b px-4 py-2 bg-blue-500/10", children: /* @__PURE__ */ jsxs("span", { className: "text-sm font-medium text-blue-600 dark:text-blue-400", children: [
261
- "Current (",
262
- current.filename,
263
- ")"
264
- ] }) }),
265
- /* @__PURE__ */ jsx(
266
- ScrollArea,
267
- {
268
- className: "h-full",
269
- ref: (ref2) => {
270
- scrollRefs.current["current"] = ref2;
271
- },
272
- onScrollCapture: (e) => {
273
- const target = e.target;
274
- handleScroll("current", target.scrollTop);
275
- },
276
- children: /* @__PURE__ */ jsx(
277
- CodeSnippet,
278
- {
279
- code: current.content,
280
- language: current.language,
281
- showLineNumbers,
282
- showCopyButton: false,
283
- showHeader: false,
284
- className: "border-0 rounded-none"
285
- }
286
- )
287
- }
288
- )
289
- ] }),
290
- /* @__PURE__ */ jsxs("div", { children: [
291
- /* @__PURE__ */ jsx("div", { className: "border-b px-4 py-2 bg-green-500/10", children: /* @__PURE__ */ jsxs("span", { className: "text-sm font-medium text-green-600 dark:text-green-400", children: [
292
- "Incoming (",
293
- incoming.filename,
294
- ")"
295
- ] }) }),
296
- /* @__PURE__ */ jsx(
297
- ScrollArea,
298
- {
299
- className: "h-full",
300
- ref: (ref2) => {
301
- scrollRefs.current["incoming"] = ref2;
302
- },
303
- onScrollCapture: (e) => {
304
- const target = e.target;
305
- handleScroll("incoming", target.scrollTop);
306
- },
307
- children: /* @__PURE__ */ jsx(
308
- CodeSnippet,
309
- {
310
- code: incoming.content,
311
- language: incoming.language,
312
- showLineNumbers,
313
- showCopyButton: false,
314
- showHeader: false,
315
- className: "border-0 rounded-none"
316
- }
317
- )
318
- }
319
- )
320
- ] })
321
- ] });
322
- }, "renderThreeWay");
323
- const renderMergeConflicts = /* @__PURE__ */ __name(() => {
324
- if (!allowMerge || mergeState.conflicts.length === 0) return null;
325
- return /* @__PURE__ */ jsx("div", { className: "border-t bg-muted/30", children: /* @__PURE__ */ jsxs("div", { className: "px-4 py-2", children: [
326
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
327
- /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "Merge Conflicts" }),
328
- /* @__PURE__ */ jsx(Badge, { variant: "destructive", className: "text-xs", children: mergeState.conflicts.length })
329
- ] }),
330
- /* @__PURE__ */ jsx("div", { className: "mt-2 space-y-2", children: mergeState.conflicts.map((conflict, index) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-xs", children: [
331
- /* @__PURE__ */ jsxs("span", { children: [
332
- "Lines ",
333
- conflict.startLine,
334
- "-",
335
- conflict.endLine
336
- ] }),
337
- /* @__PURE__ */ jsxs("div", { className: "flex gap-1", children: [
338
- /* @__PURE__ */ jsx(
339
- Button,
340
- {
341
- variant: "outline",
342
- size: "sm",
343
- onClick: () => resolveConflict(index, "current"),
344
- className: "h-6 text-xs",
345
- children: "Keep Current"
346
- }
347
- ),
348
- /* @__PURE__ */ jsx(
349
- Button,
350
- {
351
- variant: "outline",
352
- size: "sm",
353
- onClick: () => resolveConflict(index, "incoming"),
354
- className: "h-6 text-xs",
355
- children: "Accept Incoming"
356
- }
357
- )
358
- ] })
359
- ] }, index)) })
360
- ] }) });
361
- }, "renderMergeConflicts");
362
- return /* @__PURE__ */ jsxs(
363
- "div",
364
- {
365
- ref,
366
- className: cn(codeCompareVariants({ layout, size }), className),
367
- style: { height },
368
- ...props,
369
- children: [
370
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b px-4 py-2", children: [
371
- /* @__PURE__ */ jsx("div", { className: "flex items-center gap-4", children: renderFileSelector() }),
372
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
373
- /* @__PURE__ */ jsx(Tabs, { value: view, onValueChange: (value) => setView(value), children: /* @__PURE__ */ jsxs(TabsList, { className: "grid w-full grid-cols-3", children: [
374
- /* @__PURE__ */ jsx(TabsTrigger, { value: "side-by-side", className: "text-xs", children: "Side by Side" }),
375
- /* @__PURE__ */ jsx(TabsTrigger, { value: "unified", className: "text-xs", children: "Unified" }),
376
- /* @__PURE__ */ jsx(TabsTrigger, { value: "three-way", className: "text-xs", children: "Three-way" })
377
- ] }) }),
378
- showCopyButton && /* @__PURE__ */ jsx(
379
- Button,
380
- {
381
- variant: "ghost",
382
- size: "sm",
383
- onClick: copyComparison,
384
- className: "h-8 w-8 p-0",
385
- children: copied ? /* @__PURE__ */ jsx(Check, { className: "h-3.5 w-3.5 text-green-500" }) : /* @__PURE__ */ jsx(Copy, { className: "h-3.5 w-3.5" })
386
- }
387
- ),
388
- /* @__PURE__ */ jsxs(DropdownMenu, { children: [
389
- /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", className: "h-8 w-8 p-0", children: /* @__PURE__ */ jsx(MoreHorizontal, { className: "h-3.5 w-3.5" }) }) }),
390
- /* @__PURE__ */ jsxs(DropdownMenuContent, { align: "end", children: [
391
- /* @__PURE__ */ jsxs(
392
- DropdownMenuItem,
393
- {
394
- onClick: () => setSelectedFiles([]),
395
- className: "gap-2",
396
- children: [
397
- /* @__PURE__ */ jsx(RotateCcw, { className: "h-4 w-4" }),
398
- "Reset Selection"
399
- ]
400
- }
401
- ),
402
- /* @__PURE__ */ jsxs(DropdownMenuItem, { className: "gap-2", children: [
403
- /* @__PURE__ */ jsx(Settings, { className: "h-4 w-4" }),
404
- "Settings"
405
- ] })
406
- ] })
407
- ] })
408
- ] })
409
- ] }),
410
- /* @__PURE__ */ jsxs("div", { className: "flex-1 min-h-0", children: [
411
- view === "side-by-side" && renderSideBySide(),
412
- view === "unified" && renderUnified(),
413
- view === "three-way" && renderThreeWay()
414
- ] }),
415
- renderMergeConflicts()
416
- ]
417
- }
418
- );
419
- }
420
- );
421
- CodeCompare.displayName = "CodeCompare";
422
-
423
- export { CodeCompare, codeCompareVariants };