@refraction-ui/react 0.19.1 → 0.20.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 (342) hide show
  1. package/dist/chunk-533MCMSU.js +2355 -0
  2. package/dist/chunk-533MCMSU.js.map +7 -0
  3. package/dist/chunk-AMK4VCBG.js +250 -0
  4. package/dist/chunk-AMK4VCBG.js.map +7 -0
  5. package/dist/chunk-BOLFYVI6.js +90 -0
  6. package/dist/chunk-BOLFYVI6.js.map +7 -0
  7. package/dist/chunk-F7B64KT3.js +187 -0
  8. package/dist/chunk-F7B64KT3.js.map +7 -0
  9. package/dist/chunk-FD37DFCC.js +77 -0
  10. package/dist/chunk-FD37DFCC.js.map +7 -0
  11. package/dist/chunk-H54FLNAF.js +132 -0
  12. package/dist/chunk-H54FLNAF.js.map +7 -0
  13. package/dist/chunk-INP46354.js +664 -0
  14. package/dist/chunk-INP46354.js.map +7 -0
  15. package/dist/chunk-ONACRMG4.js +116 -0
  16. package/dist/chunk-ONACRMG4.js.map +7 -0
  17. package/dist/chunk-SDZ3LROZ.js +7 -0
  18. package/dist/chunk-SDZ3LROZ.js.map +7 -0
  19. package/dist/chunk-TOZBR4GL.js +154 -0
  20. package/dist/chunk-TOZBR4GL.js.map +7 -0
  21. package/dist/chunk-UNEM2TRI.js +225 -0
  22. package/dist/chunk-UNEM2TRI.js.map +7 -0
  23. package/dist/chunk-VK3EQ34F.js +92 -0
  24. package/dist/chunk-VK3EQ34F.js.map +7 -0
  25. package/dist/chunk-WK2IIUFO.js +316 -0
  26. package/dist/chunk-WK2IIUFO.js.map +7 -0
  27. package/dist/chunk-WSPJTQAV.js +59 -0
  28. package/dist/chunk-WSPJTQAV.js.map +7 -0
  29. package/dist/chunk-XWP763SH.js +3 -2
  30. package/dist/chunk-XWP763SH.js.map +7 -1
  31. package/dist/chunk-Y2FNNAIL.js +80 -0
  32. package/dist/chunk-Y2FNNAIL.js.map +1 -0
  33. package/dist/{chunk-4A4BW3GR.js → chunk-ZF3OHCGV.js} +28 -5
  34. package/dist/chunk-ZF3OHCGV.js.map +7 -0
  35. package/dist/form.cjs +5 -11
  36. package/dist/form.cjs.map +1 -1
  37. package/dist/form.js +6 -12
  38. package/dist/form.js.map +1 -1
  39. package/dist/index.cjs +2879 -33936
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.cts +1 -0
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.js +126 -28780
  44. package/dist/internal/react-app-shell/index.d.cts +2 -22
  45. package/dist/internal/react-app-shell/index.d.ts +2 -22
  46. package/dist/internal/react-badge/index.d.cts +5 -0
  47. package/dist/internal/react-badge/index.d.ts +5 -0
  48. package/dist/internal/react-callout/index.d.cts +4 -0
  49. package/dist/internal/react-callout/index.d.ts +4 -0
  50. package/dist/internal/react-card/index.d.cts +8 -1
  51. package/dist/internal/react-card/index.d.ts +8 -1
  52. package/dist/internal/react-collapsible/index.d.cts +0 -3
  53. package/dist/internal/react-collapsible/index.d.ts +0 -3
  54. package/dist/internal/react-combobox/index.d.cts +0 -3
  55. package/dist/internal/react-combobox/index.d.ts +0 -3
  56. package/dist/internal/react-command/index.d.cts +0 -3
  57. package/dist/internal/react-command/index.d.ts +0 -3
  58. package/dist/internal/react-data-table/index.d.cts +0 -3
  59. package/dist/internal/react-data-table/index.d.ts +0 -3
  60. package/dist/internal/react-dialog/index.d.cts +0 -3
  61. package/dist/internal/react-dialog/index.d.ts +0 -3
  62. package/dist/internal/react-dropdown-menu/index.d.cts +0 -3
  63. package/dist/internal/react-dropdown-menu/index.d.ts +0 -3
  64. package/dist/internal/react-feedback-dialog/index.d.cts +0 -3
  65. package/dist/internal/react-feedback-dialog/index.d.ts +0 -3
  66. package/dist/internal/react-form/index.d.cts +2 -21
  67. package/dist/internal/react-form/index.d.ts +2 -21
  68. package/dist/internal/react-keyboard-shortcut/index.d.cts +0 -6
  69. package/dist/internal/react-keyboard-shortcut/index.d.ts +0 -6
  70. package/dist/internal/react-link-card/index.d.cts +8 -2
  71. package/dist/internal/react-link-card/index.d.ts +8 -2
  72. package/dist/internal/react-popover/index.d.cts +0 -3
  73. package/dist/internal/react-popover/index.d.ts +0 -3
  74. package/dist/internal/react-sheet/index.d.cts +0 -3
  75. package/dist/internal/react-sheet/index.d.ts +0 -3
  76. package/dist/internal/react-slot/index.d.cts +23 -0
  77. package/dist/internal/react-slot/index.d.ts +23 -0
  78. package/dist/internal/react-toast/index.d.cts +0 -3
  79. package/dist/internal/react-toast/index.d.ts +0 -3
  80. package/dist/internal/react-tooltip/index.d.cts +0 -3
  81. package/dist/internal/react-tooltip/index.d.ts +0 -3
  82. package/dist/react-accordion.js +125 -0
  83. package/dist/react-accordion.js.map +7 -0
  84. package/dist/react-ai.js +257 -0
  85. package/dist/react-ai.js.map +7 -0
  86. package/dist/react-analytics.js +1698 -0
  87. package/dist/react-analytics.js.map +7 -0
  88. package/dist/react-animated-text.js +164 -0
  89. package/dist/react-animated-text.js.map +7 -0
  90. package/dist/react-app-shell.js +631 -0
  91. package/dist/react-app-shell.js.map +7 -0
  92. package/dist/react-audience-feature-card.js +53 -0
  93. package/dist/react-audience-feature-card.js.map +7 -0
  94. package/dist/react-audio-room.js +166 -0
  95. package/dist/react-audio-room.js.map +7 -0
  96. package/dist/react-auth.js +211 -0
  97. package/dist/react-auth.js.map +7 -0
  98. package/dist/react-avatar-group.js +154 -0
  99. package/dist/react-avatar-group.js.map +7 -0
  100. package/dist/react-avatar.js +168 -0
  101. package/dist/react-avatar.js.map +7 -0
  102. package/dist/react-badge.js +86 -0
  103. package/dist/react-badge.js.map +7 -0
  104. package/dist/react-bottom-nav.js +67 -0
  105. package/dist/react-bottom-nav.js.map +7 -0
  106. package/dist/react-brand-network-cell.js +92 -0
  107. package/dist/react-brand-network-cell.js.map +7 -0
  108. package/dist/react-breadcrumbs.js +104 -0
  109. package/dist/react-breadcrumbs.js.map +7 -0
  110. package/dist/react-browser-chrome-mock.js +89 -0
  111. package/dist/react-browser-chrome-mock.js.map +7 -0
  112. package/dist/react-button.js +13 -0
  113. package/dist/react-button.js.map +7 -0
  114. package/dist/react-calendar.js +301 -0
  115. package/dist/react-calendar.js.map +7 -0
  116. package/dist/react-call-controls.js +113 -0
  117. package/dist/react-call-controls.js.map +7 -0
  118. package/dist/react-callout.js +152 -0
  119. package/dist/react-callout.js.map +7 -0
  120. package/dist/react-card-grid.js +34 -0
  121. package/dist/react-card-grid.js.map +7 -0
  122. package/dist/react-card.js +200 -0
  123. package/dist/react-card.js.map +7 -0
  124. package/dist/react-carousel.js +132 -0
  125. package/dist/react-carousel.js.map +7 -0
  126. package/dist/react-charts.js +509 -0
  127. package/dist/react-charts.js.map +7 -0
  128. package/dist/react-checkbox.js +156 -0
  129. package/dist/react-checkbox.js.map +7 -0
  130. package/dist/react-checklist.js +168 -0
  131. package/dist/react-checklist.js.map +7 -0
  132. package/dist/react-code-block.js +78 -0
  133. package/dist/react-code-block.js.map +7 -0
  134. package/dist/react-code-editor.js +184 -0
  135. package/dist/react-code-editor.js.map +7 -0
  136. package/dist/react-collapsible.js +192 -0
  137. package/dist/react-collapsible.js.map +7 -0
  138. package/dist/react-combobox.js +609 -0
  139. package/dist/react-combobox.js.map +7 -0
  140. package/dist/react-command-input.js +202 -0
  141. package/dist/react-command-input.js.map +7 -0
  142. package/dist/react-command.js +364 -0
  143. package/dist/react-command.js.map +7 -0
  144. package/dist/react-composer.js +2036 -0
  145. package/dist/react-composer.js.map +7 -0
  146. package/dist/react-content-protection.js +133 -0
  147. package/dist/react-content-protection.js.map +7 -0
  148. package/dist/react-conversation.js +1226 -0
  149. package/dist/react-conversation.js.map +7 -0
  150. package/dist/react-cookie-consent.js +291 -0
  151. package/dist/react-cookie-consent.js.map +7 -0
  152. package/dist/react-data-table.js +310 -0
  153. package/dist/react-data-table.js.map +7 -0
  154. package/dist/react-date-picker.js +95 -0
  155. package/dist/react-date-picker.js.map +7 -0
  156. package/dist/react-device-frame.js +137 -0
  157. package/dist/react-device-frame.js.map +7 -0
  158. package/dist/react-dialog.js +218 -0
  159. package/dist/react-dialog.js.map +7 -0
  160. package/dist/react-diff-viewer.js +460 -0
  161. package/dist/react-diff-viewer.js.map +7 -0
  162. package/dist/react-dropdown-menu.js +292 -0
  163. package/dist/react-dropdown-menu.js.map +7 -0
  164. package/dist/react-editor-status-bar.js +148 -0
  165. package/dist/react-editor-status-bar.js.map +7 -0
  166. package/dist/react-editor-tabs.js +159 -0
  167. package/dist/react-editor-tabs.js.map +7 -0
  168. package/dist/react-emoji-picker.js +238 -0
  169. package/dist/react-emoji-picker.js.map +7 -0
  170. package/dist/react-empty-state.js +90 -0
  171. package/dist/react-empty-state.js.map +7 -0
  172. package/dist/react-feedback-dialog.js +275 -0
  173. package/dist/react-feedback-dialog.js.map +7 -0
  174. package/dist/react-file-tree.js +376 -0
  175. package/dist/react-file-tree.js.map +7 -0
  176. package/dist/react-file-upload.js +360 -0
  177. package/dist/react-file-upload.js.map +7 -0
  178. package/dist/react-floating-reactions.js +124 -0
  179. package/dist/react-floating-reactions.js.map +7 -0
  180. package/dist/react-flow-editor.js +198 -0
  181. package/dist/react-flow-editor.js.map +7 -0
  182. package/dist/react-footer.js +67 -0
  183. package/dist/react-footer.js.map +7 -0
  184. package/dist/react-graph-view.js +197 -0
  185. package/dist/react-graph-view.js.map +7 -0
  186. package/dist/react-icon-system.js +9 -0
  187. package/dist/react-icon-system.js.map +7 -0
  188. package/dist/react-infinite-canvas.js +8 -0
  189. package/dist/react-infinite-canvas.js.map +7 -0
  190. package/dist/react-inline-editor.js +216 -0
  191. package/dist/react-inline-editor.js.map +7 -0
  192. package/dist/react-input-group.js +150 -0
  193. package/dist/react-input-group.js.map +7 -0
  194. package/dist/react-input.js +10 -0
  195. package/dist/react-input.js.map +7 -0
  196. package/dist/react-install-prompt.js +132 -0
  197. package/dist/react-install-prompt.js.map +7 -0
  198. package/dist/react-kanban-board.js +198 -0
  199. package/dist/react-kanban-board.js.map +7 -0
  200. package/dist/react-keyboard-shortcut.js +36 -0
  201. package/dist/react-keyboard-shortcut.js.map +7 -0
  202. package/dist/react-language-selector.js +311 -0
  203. package/dist/react-language-selector.js.map +7 -0
  204. package/dist/react-link-card.js +48 -0
  205. package/dist/react-link-card.js.map +7 -0
  206. package/dist/react-live-captions.js +92 -0
  207. package/dist/react-live-captions.js.map +7 -0
  208. package/dist/react-live-cursors.js +145 -0
  209. package/dist/react-live-cursors.js.map +7 -0
  210. package/dist/react-live-transcript.js +117 -0
  211. package/dist/react-live-transcript.js.map +7 -0
  212. package/dist/react-location-selector.js +252 -0
  213. package/dist/react-location-selector.js.map +7 -0
  214. package/dist/react-logger.js +415 -0
  215. package/dist/react-logger.js.map +7 -0
  216. package/dist/react-markdown-renderer.js +12 -0
  217. package/dist/react-markdown-renderer.js.map +7 -0
  218. package/dist/react-marquee-strip.js +62 -0
  219. package/dist/react-marquee-strip.js.map +7 -0
  220. package/dist/react-mascot.js +367 -0
  221. package/dist/react-mascot.js.map +7 -0
  222. package/dist/react-mastery-bar.js +97 -0
  223. package/dist/react-mastery-bar.js.map +7 -0
  224. package/dist/react-mini-map.js +207 -0
  225. package/dist/react-mini-map.js.map +7 -0
  226. package/dist/react-mobile-nav.js +216 -0
  227. package/dist/react-mobile-nav.js.map +7 -0
  228. package/dist/react-navbar.js +96 -0
  229. package/dist/react-navbar.js.map +7 -0
  230. package/dist/react-numbered-steps.js +67 -0
  231. package/dist/react-numbered-steps.js.map +7 -0
  232. package/dist/react-otp-input.js +318 -0
  233. package/dist/react-otp-input.js.map +7 -0
  234. package/dist/react-pagination.js +199 -0
  235. package/dist/react-pagination.js.map +7 -0
  236. package/dist/react-password-input.js +104 -0
  237. package/dist/react-password-input.js.map +7 -0
  238. package/dist/react-payment.js +81 -0
  239. package/dist/react-payment.js.map +7 -0
  240. package/dist/react-popover.js +176 -0
  241. package/dist/react-popover.js.map +7 -0
  242. package/dist/react-pre-call-lobby.js +309 -0
  243. package/dist/react-pre-call-lobby.js.map +7 -0
  244. package/dist/react-presence-indicator.js +86 -0
  245. package/dist/react-presence-indicator.js.map +7 -0
  246. package/dist/react-pricing-card.js +142 -0
  247. package/dist/react-pricing-card.js.map +7 -0
  248. package/dist/react-progress-display.js +188 -0
  249. package/dist/react-progress-display.js.map +7 -0
  250. package/dist/react-radial-gauge.js +193 -0
  251. package/dist/react-radial-gauge.js.map +7 -0
  252. package/dist/react-radio.js +169 -0
  253. package/dist/react-radio.js.map +7 -0
  254. package/dist/react-rating-scale.js +171 -0
  255. package/dist/react-rating-scale.js.map +7 -0
  256. package/dist/react-reaction-bar.js +111 -0
  257. package/dist/react-reaction-bar.js.map +7 -0
  258. package/dist/react-resizable-layout.js +298 -0
  259. package/dist/react-resizable-layout.js.map +7 -0
  260. package/dist/react-rich-editor.js +1 -0
  261. package/dist/react-rich-editor.js.map +7 -0
  262. package/dist/react-search-bar.js +285 -0
  263. package/dist/react-search-bar.js.map +7 -0
  264. package/dist/react-section-head.js +65 -0
  265. package/dist/react-section-head.js.map +7 -0
  266. package/dist/react-segmented-control.js +215 -0
  267. package/dist/react-segmented-control.js.map +7 -0
  268. package/dist/react-select.js +389 -0
  269. package/dist/react-select.js.map +7 -0
  270. package/dist/react-separator.js +86 -0
  271. package/dist/react-separator.js.map +7 -0
  272. package/dist/react-sheet.js +310 -0
  273. package/dist/react-sheet.js.map +7 -0
  274. package/dist/react-sidebar.js +100 -0
  275. package/dist/react-sidebar.js.map +7 -0
  276. package/dist/react-skeleton.js +91 -0
  277. package/dist/react-skeleton.js.map +7 -0
  278. package/dist/react-skip-to-content.js +38 -0
  279. package/dist/react-skip-to-content.js.map +7 -0
  280. package/dist/react-slide-viewer.js +264 -0
  281. package/dist/react-slide-viewer.js.map +7 -0
  282. package/dist/react-slider.js +105 -0
  283. package/dist/react-slider.js.map +7 -0
  284. package/dist/react-slot-picker.js +184 -0
  285. package/dist/react-slot-picker.js.map +7 -0
  286. package/dist/react-slot.js +7 -0
  287. package/dist/react-slot.js.map +7 -0
  288. package/dist/react-social-auth-button.js +169 -0
  289. package/dist/react-social-auth-button.js.map +7 -0
  290. package/dist/react-sortable-list.js +204 -0
  291. package/dist/react-sortable-list.js.map +7 -0
  292. package/dist/react-stat-grid.js +69 -0
  293. package/dist/react-stat-grid.js.map +7 -0
  294. package/dist/react-status-indicator.js +117 -0
  295. package/dist/react-status-indicator.js.map +7 -0
  296. package/dist/react-steps.js +167 -0
  297. package/dist/react-steps.js.map +7 -0
  298. package/dist/react-sticky-note.js +131 -0
  299. package/dist/react-sticky-note.js.map +7 -0
  300. package/dist/react-switch.js +139 -0
  301. package/dist/react-switch.js.map +7 -0
  302. package/dist/react-table-of-contents.js +80 -0
  303. package/dist/react-table-of-contents.js.map +7 -0
  304. package/dist/react-tabs.js +230 -0
  305. package/dist/react-tabs.js.map +7 -0
  306. package/dist/react-terminal.js +101 -0
  307. package/dist/react-terminal.js.map +7 -0
  308. package/dist/react-test-results.js +158 -0
  309. package/dist/react-test-results.js.map +7 -0
  310. package/dist/react-textarea.js +89 -0
  311. package/dist/react-textarea.js.map +7 -0
  312. package/dist/react-thread-view.js +139 -0
  313. package/dist/react-thread-view.js.map +7 -0
  314. package/dist/react-timeline.js +153 -0
  315. package/dist/react-timeline.js.map +7 -0
  316. package/dist/react-toast.js +253 -0
  317. package/dist/react-toast.js.map +7 -0
  318. package/dist/react-tooltip.js +221 -0
  319. package/dist/react-tooltip.js.map +7 -0
  320. package/dist/react-version-selector.js +270 -0
  321. package/dist/react-version-selector.js.map +7 -0
  322. package/dist/react-video-grid.js +129 -0
  323. package/dist/react-video-grid.js.map +7 -0
  324. package/dist/react-video-player.js +206 -0
  325. package/dist/react-video-player.js.map +7 -0
  326. package/dist/react-video-tile.js +8 -0
  327. package/dist/react-video-tile.js.map +7 -0
  328. package/dist/react-voice-pill.js +314 -0
  329. package/dist/react-voice-pill.js.map +7 -0
  330. package/dist/react-waveform.js +558 -0
  331. package/dist/react-waveform.js.map +7 -0
  332. package/dist/react-wizard.js +337 -0
  333. package/dist/react-wizard.js.map +7 -0
  334. package/dist/styles.css +7 -0
  335. package/dist/theme.js +1 -1
  336. package/package.json +3 -2
  337. package/dist/applicationinsights-web-H7OBLIVJ.js +0 -23393
  338. package/dist/applicationinsights-web-H7OBLIVJ.js.map +0 -1
  339. package/dist/chunk-4A4BW3GR.js.map +0 -1
  340. package/dist/index.js.map +0 -1
  341. package/dist/module-X3HTTRQK.js +0 -6438
  342. package/dist/module-X3HTTRQK.js.map +0 -1
@@ -0,0 +1,460 @@
1
+ import {
2
+ cn,
3
+ cva
4
+ } from "./chunk-ZF3OHCGV.js";
5
+
6
+ // ../react-diff-viewer/dist/index.js
7
+ import * as React from "react";
8
+
9
+ // ../diff-viewer/dist/index.js
10
+ var extToLanguage = {
11
+ ts: "typescript",
12
+ tsx: "typescript",
13
+ js: "javascript",
14
+ jsx: "javascript",
15
+ py: "python",
16
+ go: "go",
17
+ rs: "rust",
18
+ rb: "ruby",
19
+ java: "java",
20
+ swift: "swift",
21
+ kt: "kotlin",
22
+ dart: "dart",
23
+ php: "php",
24
+ lua: "lua",
25
+ r: "r",
26
+ scala: "scala",
27
+ json: "json",
28
+ yaml: "yaml",
29
+ yml: "yaml",
30
+ md: "markdown",
31
+ html: "html",
32
+ css: "css",
33
+ scss: "scss",
34
+ sql: "sql",
35
+ sh: "shell",
36
+ bash: "shell",
37
+ zsh: "shell",
38
+ xml: "xml",
39
+ toml: "toml",
40
+ proto: "protobuf",
41
+ dockerfile: "dockerfile",
42
+ cpp: "cpp",
43
+ c: "c"
44
+ };
45
+ function getLanguageForFile(filePath) {
46
+ const ext = filePath.split(".").pop()?.toLowerCase() || "";
47
+ const basename = filePath.split("/").pop()?.toLowerCase() || "";
48
+ if (basename === "dockerfile") return "dockerfile";
49
+ return extToLanguage[ext] || "plaintext";
50
+ }
51
+ var statusIcons = {
52
+ added: "\u{1F7E2}",
53
+ // green circle
54
+ modified: "\u{1F7E1}",
55
+ // yellow circle
56
+ deleted: "\u{1F534}",
57
+ // red circle
58
+ renamed: "\u{1F535}"
59
+ // blue circle
60
+ };
61
+ function createDiffViewer(props = {}) {
62
+ const {
63
+ files = [],
64
+ activeFileIndex = 0,
65
+ viewMode = "side-by-side",
66
+ theme = "dark",
67
+ language,
68
+ sidebarOpen = true,
69
+ onFileSelect,
70
+ onViewModeChange,
71
+ onSidebarToggle
72
+ } = props;
73
+ let currentIndex = Math.min(activeFileIndex, Math.max(0, files.length - 1));
74
+ let currentViewMode = viewMode;
75
+ let currentSidebarOpen = sidebarOpen;
76
+ const state = {
77
+ activeFileIndex: currentIndex,
78
+ viewMode: currentViewMode,
79
+ theme,
80
+ language: language || (files[currentIndex] ? getLanguageForFile(files[currentIndex].path) : "plaintext"),
81
+ sidebarOpen: currentSidebarOpen,
82
+ files
83
+ };
84
+ const ariaProps = {
85
+ role: "region",
86
+ "aria-label": "Diff viewer"
87
+ };
88
+ const dataAttributes = {
89
+ "data-view-mode": currentViewMode,
90
+ "data-theme": theme,
91
+ "data-file-count": String(files.length)
92
+ };
93
+ if (!currentSidebarOpen) {
94
+ dataAttributes["data-sidebar-collapsed"] = "";
95
+ }
96
+ function selectFile(index) {
97
+ if (index >= 0 && index < files.length) {
98
+ currentIndex = index;
99
+ state.activeFileIndex = index;
100
+ state.language = language || getLanguageForFile(files[index].path);
101
+ onFileSelect?.(index);
102
+ }
103
+ }
104
+ function nextFile() {
105
+ if (currentIndex < files.length - 1) {
106
+ selectFile(currentIndex + 1);
107
+ }
108
+ }
109
+ function prevFile() {
110
+ if (currentIndex > 0) {
111
+ selectFile(currentIndex - 1);
112
+ }
113
+ }
114
+ function toggleViewMode() {
115
+ currentViewMode = currentViewMode === "side-by-side" ? "inline" : "side-by-side";
116
+ state.viewMode = currentViewMode;
117
+ dataAttributes["data-view-mode"] = currentViewMode;
118
+ onViewModeChange?.(currentViewMode);
119
+ }
120
+ function toggleSidebar() {
121
+ currentSidebarOpen = !currentSidebarOpen;
122
+ state.sidebarOpen = currentSidebarOpen;
123
+ if (currentSidebarOpen) {
124
+ delete dataAttributes["data-sidebar-collapsed"];
125
+ } else {
126
+ dataAttributes["data-sidebar-collapsed"] = "";
127
+ }
128
+ onSidebarToggle?.();
129
+ }
130
+ function totalAdditions() {
131
+ return files.reduce((sum, f) => sum + f.additions, 0);
132
+ }
133
+ function totalDeletions() {
134
+ return files.reduce((sum, f) => sum + f.deletions, 0);
135
+ }
136
+ return {
137
+ state,
138
+ ariaProps,
139
+ dataAttributes,
140
+ selectFile,
141
+ nextFile,
142
+ prevFile,
143
+ toggleViewMode,
144
+ toggleSidebar,
145
+ getLanguageForFile,
146
+ getFileStatusIcon: (status) => statusIcons[status] || "\u26AA",
147
+ totalAdditions,
148
+ totalDeletions
149
+ };
150
+ }
151
+ var diffViewerTokens = {
152
+ name: "diff-viewer",
153
+ tokens: {
154
+ bg: { variable: "--rfr-diff-bg", fallback: "hsl(var(--background))" },
155
+ fg: { variable: "--rfr-diff-fg", fallback: "hsl(var(--foreground))" },
156
+ sidebarBg: { variable: "--rfr-diff-sidebar-bg", fallback: "hsl(var(--muted))" },
157
+ headerBg: { variable: "--rfr-diff-header-bg", fallback: "hsl(var(--muted))" },
158
+ border: { variable: "--rfr-diff-border", fallback: "hsl(var(--border))" },
159
+ addBg: { variable: "--rfr-diff-add-bg", fallback: "rgba(46, 160, 67, 0.15)" },
160
+ delBg: { variable: "--rfr-diff-del-bg", fallback: "rgba(248, 81, 73, 0.15)" },
161
+ addFg: { variable: "--rfr-diff-add-fg", fallback: "#3fb950" },
162
+ delFg: { variable: "--rfr-diff-del-fg", fallback: "#f85149" },
163
+ statusbar: { variable: "--rfr-diff-statusbar", fallback: "hsl(var(--primary))" },
164
+ statusbarFg: { variable: "--rfr-diff-statusbar-fg", fallback: "hsl(var(--primary-foreground))" }
165
+ }
166
+ };
167
+ var diffViewerVariants = cva({
168
+ base: "flex flex-col overflow-hidden font-sans text-sm",
169
+ variants: {
170
+ theme: {
171
+ light: "bg-white text-gray-900",
172
+ dark: "bg-gray-950 text-gray-100"
173
+ },
174
+ fullscreen: {
175
+ "true": "h-screen",
176
+ "false": ""
177
+ }
178
+ },
179
+ defaultVariants: {
180
+ theme: "dark",
181
+ fullscreen: "true"
182
+ }
183
+ });
184
+ var sidebarVariants = cva({
185
+ base: "border-r overflow-auto flex-shrink-0",
186
+ variants: {
187
+ theme: {
188
+ light: "bg-gray-50 border-gray-200",
189
+ dark: "bg-gray-900 border-gray-800"
190
+ }
191
+ },
192
+ defaultVariants: {
193
+ theme: "dark"
194
+ }
195
+ });
196
+ var sidebarItemVariants = cva({
197
+ base: "px-2.5 py-1 cursor-pointer text-xs font-mono transition-colors",
198
+ variants: {
199
+ active: {
200
+ "true": "border-l-2 border-blue-500",
201
+ "false": "border-l-2 border-transparent"
202
+ },
203
+ theme: {
204
+ light: "",
205
+ dark: ""
206
+ }
207
+ },
208
+ compoundVariants: [
209
+ { active: "true", theme: "dark", class: "bg-gray-800 text-gray-100" },
210
+ { active: "false", theme: "dark", class: "text-gray-400 hover:bg-gray-800/50" },
211
+ { active: "true", theme: "light", class: "bg-blue-50 text-gray-900" },
212
+ { active: "false", theme: "light", class: "text-gray-600 hover:bg-gray-100" }
213
+ ],
214
+ defaultVariants: {
215
+ active: "false",
216
+ theme: "dark"
217
+ }
218
+ });
219
+ var tabBarVariants = cva({
220
+ base: "flex items-center border-b overflow-auto flex-shrink-0",
221
+ variants: {
222
+ theme: {
223
+ light: "bg-gray-50 border-gray-200",
224
+ dark: "bg-gray-900 border-gray-800"
225
+ }
226
+ },
227
+ defaultVariants: {
228
+ theme: "dark"
229
+ }
230
+ });
231
+ var tabVariants = cva({
232
+ base: "px-3 h-[35px] flex items-center gap-1 cursor-pointer text-xs font-mono border-r shrink-0",
233
+ variants: {
234
+ active: {
235
+ "true": "",
236
+ "false": ""
237
+ },
238
+ theme: {
239
+ light: "border-gray-200",
240
+ dark: "border-gray-800"
241
+ }
242
+ },
243
+ compoundVariants: [
244
+ { active: "true", theme: "dark", class: "bg-gray-950 text-gray-100 border-b-gray-950 -mb-px" },
245
+ { active: "false", theme: "dark", class: "text-gray-400" },
246
+ { active: "true", theme: "light", class: "bg-white text-gray-900 border-b-white -mb-px" },
247
+ { active: "false", theme: "light", class: "text-gray-500" }
248
+ ],
249
+ defaultVariants: {
250
+ active: "false",
251
+ theme: "dark"
252
+ }
253
+ });
254
+ var statusBarVariants = cva({
255
+ base: "h-[22px] flex items-center px-2.5 gap-3 text-[11px] font-mono flex-shrink-0",
256
+ variants: {
257
+ theme: {
258
+ light: "bg-blue-600 text-white",
259
+ dark: "bg-blue-700 text-white"
260
+ }
261
+ },
262
+ defaultVariants: {
263
+ theme: "dark"
264
+ }
265
+ });
266
+
267
+ // ../react-diff-viewer/dist/index.js
268
+ import { jsxs, jsx } from "react/jsx-runtime";
269
+ var MonacoDiffEditor = React.lazy(
270
+ () => import("./chunk-INP46354.js").then((m) => ({ default: m.DiffEditor }))
271
+ );
272
+ var DiffViewer = React.forwardRef(
273
+ function DiffViewer2({
274
+ files,
275
+ original = "",
276
+ modified = "",
277
+ language,
278
+ monacoTheme = "vs-dark",
279
+ theme = "dark",
280
+ viewMode: controlledViewMode = "side-by-side",
281
+ showSidebar = true,
282
+ showTabs = true,
283
+ showStatusBar = true,
284
+ sidebarWidth = 220,
285
+ activeFileIndex: controlledIndex = 0,
286
+ onFileSelect,
287
+ onViewModeChange,
288
+ statusBarTitle,
289
+ statusBarStatus,
290
+ className,
291
+ editorOptions
292
+ }, ref) {
293
+ const [activeIdx, setActiveIdx] = React.useState(controlledIndex);
294
+ const [sidebarOpen, setSidebarOpen] = React.useState(showSidebar);
295
+ const [viewMode, setViewMode] = React.useState(controlledViewMode);
296
+ React.useEffect(() => setActiveIdx(controlledIndex), [controlledIndex]);
297
+ React.useEffect(() => setViewMode(controlledViewMode), [controlledViewMode]);
298
+ const api = React.useMemo(
299
+ () => createDiffViewer({
300
+ files,
301
+ activeFileIndex: activeIdx,
302
+ viewMode,
303
+ theme,
304
+ language,
305
+ sidebarOpen,
306
+ onFileSelect: (i) => {
307
+ setActiveIdx(i);
308
+ onFileSelect?.(i);
309
+ },
310
+ onViewModeChange: (m) => {
311
+ setViewMode(m);
312
+ onViewModeChange?.(m);
313
+ },
314
+ onSidebarToggle: () => setSidebarOpen((s) => !s)
315
+ }),
316
+ [files, activeIdx, viewMode, theme, language, sidebarOpen, onFileSelect, onViewModeChange]
317
+ );
318
+ const activeFile = files[activeIdx];
319
+ const detectedLang = language || (activeFile ? api.getLanguageForFile(activeFile.path) : "plaintext");
320
+ React.useEffect(() => {
321
+ function onKey(e) {
322
+ if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return;
323
+ if (e.key === "j") {
324
+ setActiveIdx((i) => {
325
+ const next = Math.min(i + 1, files.length - 1);
326
+ onFileSelect?.(next);
327
+ return next;
328
+ });
329
+ } else if (e.key === "k") {
330
+ setActiveIdx((i) => {
331
+ const prev = Math.max(i - 1, 0);
332
+ onFileSelect?.(prev);
333
+ return prev;
334
+ });
335
+ } else if (e.key === "b") {
336
+ setSidebarOpen((s) => !s);
337
+ }
338
+ }
339
+ window.addEventListener("keydown", onKey);
340
+ return () => window.removeEventListener("keydown", onKey);
341
+ }, [files.length, onFileSelect]);
342
+ return /* @__PURE__ */ jsxs(
343
+ "div",
344
+ {
345
+ ref,
346
+ className: cn(diffViewerVariants({ theme, fullscreen: "true" }), className),
347
+ ...api.ariaProps,
348
+ ...api.dataAttributes,
349
+ children: [
350
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1, display: "flex", overflow: "hidden" }, children: [
351
+ sidebarOpen && /* @__PURE__ */ jsxs("div", { className: sidebarVariants({ theme }), style: { width: sidebarWidth }, children: [
352
+ /* @__PURE__ */ jsx("div", { className: "px-2.5 py-2 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground", children: `Files (${files.length})` }),
353
+ files.map((f, i) => {
354
+ const active = i === activeIdx;
355
+ const fname = f.path.split("/").pop() || f.path;
356
+ const dir = f.path.split("/").slice(0, -1).join("/");
357
+ return /* @__PURE__ */ jsxs(
358
+ "div",
359
+ {
360
+ onClick: () => {
361
+ setActiveIdx(i);
362
+ onFileSelect?.(i);
363
+ },
364
+ className: sidebarItemVariants({ active: active ? "true" : "false", theme }),
365
+ children: [
366
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
367
+ /* @__PURE__ */ jsx("span", { className: "text-[10px]", children: api.getFileStatusIcon(f.status) }),
368
+ /* @__PURE__ */ jsx("span", { className: active ? "" : "opacity-70", children: fname }),
369
+ /* @__PURE__ */ jsxs("span", { className: "ml-auto text-[10px]", children: [
370
+ /* @__PURE__ */ jsx("span", { className: "text-green-500", children: `+${f.additions}` }),
371
+ f.deletions > 0 && /* @__PURE__ */ jsx("span", { className: "text-red-500", children: `-${f.deletions}` })
372
+ ] })
373
+ ] }),
374
+ dir && /* @__PURE__ */ jsx("div", { className: "text-[10px] opacity-50 mt-0.5 pl-4", children: dir })
375
+ ]
376
+ },
377
+ f.path
378
+ );
379
+ })
380
+ ] }),
381
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1, display: "flex", flexDirection: "column", overflow: "hidden" }, children: [
382
+ showTabs && activeFile && /* @__PURE__ */ jsx("div", { className: tabBarVariants({ theme }), children: files.map((f, i) => {
383
+ const active = i === activeIdx;
384
+ const fname = f.path.split("/").pop() || f.path;
385
+ return /* @__PURE__ */ jsxs(
386
+ "div",
387
+ {
388
+ onClick: () => {
389
+ setActiveIdx(i);
390
+ onFileSelect?.(i);
391
+ },
392
+ className: tabVariants({ active: active ? "true" : "false", theme }),
393
+ children: [
394
+ /* @__PURE__ */ jsx("span", { className: "text-[9px]", children: api.getFileStatusIcon(f.status) }),
395
+ fname
396
+ ]
397
+ },
398
+ f.path
399
+ );
400
+ }) }),
401
+ /* @__PURE__ */ jsx("div", { style: { flex: 1 }, children: /* @__PURE__ */ jsx(
402
+ React.Suspense,
403
+ {
404
+ fallback: /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full text-xs opacity-50", children: "Loading editor..." }),
405
+ children: /* @__PURE__ */ jsx(
406
+ MonacoDiffEditor,
407
+ {
408
+ original,
409
+ modified,
410
+ language: detectedLang,
411
+ theme: monacoTheme,
412
+ options: {
413
+ readOnly: true,
414
+ renderSideBySide: viewMode === "side-by-side",
415
+ minimap: { enabled: true, scale: 1, showSlider: "mouseover" },
416
+ fontSize: 13,
417
+ lineHeight: 20,
418
+ fontFamily: "'JetBrains Mono', 'Fira Code', 'SF Mono', Menlo, monospace",
419
+ fontLigatures: true,
420
+ scrollBeyondLastLine: false,
421
+ renderOverviewRuler: true,
422
+ scrollbar: { verticalScrollbarSize: 10, horizontalScrollbarSize: 10 },
423
+ padding: { top: 8, bottom: 8 },
424
+ renderWhitespace: "selection",
425
+ bracketPairColorization: { enabled: true },
426
+ guides: { indentation: true },
427
+ smoothScrolling: true,
428
+ cursorBlinking: "smooth",
429
+ ...editorOptions
430
+ }
431
+ }
432
+ )
433
+ }
434
+ ) })
435
+ ] })
436
+ ] }),
437
+ showStatusBar && /* @__PURE__ */ jsxs("div", { className: statusBarVariants({ theme }), children: [
438
+ statusBarTitle && /* @__PURE__ */ jsx("span", { children: statusBarTitle }),
439
+ activeFile && /* @__PURE__ */ jsx("span", { children: activeFile.path }),
440
+ /* @__PURE__ */ jsx("span", { style: { marginLeft: "auto" }, children: `+${api.totalAdditions()} -${api.totalDeletions()}` }),
441
+ statusBarStatus && /* @__PURE__ */ jsx("span", { children: statusBarStatus }),
442
+ /* @__PURE__ */ jsx("span", { children: `${files.length} ${files.length === 1 ? "file" : "files"}` })
443
+ ] })
444
+ ]
445
+ }
446
+ );
447
+ }
448
+ );
449
+ export {
450
+ DiffViewer,
451
+ createDiffViewer,
452
+ diffViewerTokens,
453
+ diffViewerVariants,
454
+ sidebarItemVariants,
455
+ sidebarVariants,
456
+ statusBarVariants,
457
+ tabBarVariants,
458
+ tabVariants
459
+ };
460
+ //# sourceMappingURL=react-diff-viewer.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../diff-viewer/src/diff-viewer.ts", "../../diff-viewer/src/diff-viewer.styles.ts", "../../react-diff-viewer/src/DiffViewer.tsx"],
4
+ "sourcesContent": ["import type { AccessibilityProps } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type DiffViewerTheme = 'light' | 'dark'\nexport type DiffViewMode = 'side-by-side' | 'inline'\n\nexport type DiffFileStatus = 'added' | 'modified' | 'deleted' | 'renamed'\n\nexport interface DiffFile {\n /** File path */\n path: string\n /** Change status */\n status: DiffFileStatus\n /** Lines added */\n additions: number\n /** Lines deleted */\n deletions: number\n /** Unified diff content for this file */\n diff?: string\n /** Old path for renamed files */\n oldPath?: string\n}\n\nexport interface DiffViewerProps {\n /** Files in this diff */\n files?: DiffFile[]\n /** Index of the active file */\n activeFileIndex?: number\n /** View mode */\n viewMode?: DiffViewMode\n /** Theme */\n theme?: DiffViewerTheme\n /** Language for syntax highlighting */\n language?: string\n /** Whether the sidebar is visible */\n sidebarOpen?: boolean\n /** Callback when active file changes */\n onFileSelect?: (index: number) => void\n /** Callback when view mode changes */\n onViewModeChange?: (mode: DiffViewMode) => void\n /** Callback when sidebar toggled */\n onSidebarToggle?: () => void\n}\n\nexport interface DiffViewerState {\n activeFileIndex: number\n viewMode: DiffViewMode\n theme: DiffViewerTheme\n language: string\n sidebarOpen: boolean\n files: DiffFile[]\n}\n\nexport interface DiffViewerAPI {\n /** Current viewer state */\n state: DiffViewerState\n /** ARIA attributes for the root element */\n ariaProps: Partial<AccessibilityProps> & Record<string, unknown>\n /** Data attributes for CSS styling hooks */\n dataAttributes: Record<string, string>\n /** Select a file by index */\n selectFile: (index: number) => void\n /** Move to next file */\n nextFile: () => void\n /** Move to previous file */\n prevFile: () => void\n /** Toggle view mode */\n toggleViewMode: () => void\n /** Toggle sidebar */\n toggleSidebar: () => void\n /** Get language label for a file path */\n getLanguageForFile: (path: string) => string\n /** Get human-readable file status icon */\n getFileStatusIcon: (status: DiffFileStatus) => string\n /** Get total additions across all files */\n totalAdditions: () => number\n /** Get total deletions across all files */\n totalDeletions: () => number\n}\n\n// ---------------------------------------------------------------------------\n// Language detection\n// ---------------------------------------------------------------------------\n\nconst extToLanguage: Record<string, string> = {\n ts: 'typescript',\n tsx: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n py: 'python',\n go: 'go',\n rs: 'rust',\n rb: 'ruby',\n java: 'java',\n swift: 'swift',\n kt: 'kotlin',\n dart: 'dart',\n php: 'php',\n lua: 'lua',\n r: 'r',\n scala: 'scala',\n json: 'json',\n yaml: 'yaml',\n yml: 'yaml',\n md: 'markdown',\n html: 'html',\n css: 'css',\n scss: 'scss',\n sql: 'sql',\n sh: 'shell',\n bash: 'shell',\n zsh: 'shell',\n xml: 'xml',\n toml: 'toml',\n proto: 'protobuf',\n dockerfile: 'dockerfile',\n cpp: 'cpp',\n c: 'c',\n}\n\nfunction getLanguageForFile(filePath: string): string {\n const ext = filePath.split('.').pop()?.toLowerCase() || ''\n const basename = filePath.split('/').pop()?.toLowerCase() || ''\n if (basename === 'dockerfile') return 'dockerfile'\n return extToLanguage[ext] || 'plaintext'\n}\n\n// ---------------------------------------------------------------------------\n// Status icons\n// ---------------------------------------------------------------------------\n\nconst statusIcons: Record<DiffFileStatus, string> = {\n added: '\\u{1F7E2}', // green circle\n modified: '\\u{1F7E1}', // yellow circle\n deleted: '\\u{1F534}', // red circle\n renamed: '\\u{1F535}', // blue circle\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a headless diff viewer API.\n *\n * Manages file selection, view mode, sidebar state, and produces ARIA/data\n * attributes. The actual rendering (Monaco DiffEditor, custom renderer, etc.)\n * is handled by framework-specific wrappers.\n */\nexport function createDiffViewer(props: DiffViewerProps = {}): DiffViewerAPI {\n const {\n files = [],\n activeFileIndex = 0,\n viewMode = 'side-by-side',\n theme = 'dark',\n language,\n sidebarOpen = true,\n onFileSelect,\n onViewModeChange,\n onSidebarToggle,\n } = props\n\n let currentIndex = Math.min(activeFileIndex, Math.max(0, files.length - 1))\n let currentViewMode = viewMode\n let currentSidebarOpen = sidebarOpen\n\n const state: DiffViewerState = {\n activeFileIndex: currentIndex,\n viewMode: currentViewMode,\n theme,\n language: language || (files[currentIndex] ? getLanguageForFile(files[currentIndex].path) : 'plaintext'),\n sidebarOpen: currentSidebarOpen,\n files,\n }\n\n const ariaProps: Partial<AccessibilityProps> & Record<string, unknown> = {\n role: 'region',\n 'aria-label': 'Diff viewer',\n }\n\n const dataAttributes: Record<string, string> = {\n 'data-view-mode': currentViewMode,\n 'data-theme': theme,\n 'data-file-count': String(files.length),\n }\n\n if (!currentSidebarOpen) {\n dataAttributes['data-sidebar-collapsed'] = ''\n }\n\n function selectFile(index: number) {\n if (index >= 0 && index < files.length) {\n currentIndex = index\n state.activeFileIndex = index\n state.language = language || getLanguageForFile(files[index].path)\n onFileSelect?.(index)\n }\n }\n\n function nextFile() {\n if (currentIndex < files.length - 1) {\n selectFile(currentIndex + 1)\n }\n }\n\n function prevFile() {\n if (currentIndex > 0) {\n selectFile(currentIndex - 1)\n }\n }\n\n function toggleViewMode() {\n currentViewMode = currentViewMode === 'side-by-side' ? 'inline' : 'side-by-side'\n state.viewMode = currentViewMode\n dataAttributes['data-view-mode'] = currentViewMode\n onViewModeChange?.(currentViewMode)\n }\n\n function toggleSidebar() {\n currentSidebarOpen = !currentSidebarOpen\n state.sidebarOpen = currentSidebarOpen\n if (currentSidebarOpen) {\n delete dataAttributes['data-sidebar-collapsed']\n } else {\n dataAttributes['data-sidebar-collapsed'] = ''\n }\n onSidebarToggle?.()\n }\n\n function totalAdditions(): number {\n return files.reduce((sum, f) => sum + f.additions, 0)\n }\n\n function totalDeletions(): number {\n return files.reduce((sum, f) => sum + f.deletions, 0)\n }\n\n return {\n state,\n ariaProps,\n dataAttributes,\n selectFile,\n nextFile,\n prevFile,\n toggleViewMode,\n toggleSidebar,\n getLanguageForFile,\n getFileStatusIcon: (status: DiffFileStatus) => statusIcons[status] || '\\u{26AA}',\n totalAdditions,\n totalDeletions,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\nimport type { TokenContract } from '@refraction-ui/shared'\n\nexport const diffViewerTokens: TokenContract = {\n name: 'diff-viewer',\n tokens: {\n bg: { variable: '--rfr-diff-bg', fallback: 'hsl(var(--background))' },\n fg: { variable: '--rfr-diff-fg', fallback: 'hsl(var(--foreground))' },\n sidebarBg: { variable: '--rfr-diff-sidebar-bg', fallback: 'hsl(var(--muted))' },\n headerBg: { variable: '--rfr-diff-header-bg', fallback: 'hsl(var(--muted))' },\n border: { variable: '--rfr-diff-border', fallback: 'hsl(var(--border))' },\n addBg: { variable: '--rfr-diff-add-bg', fallback: 'rgba(46, 160, 67, 0.15)' },\n delBg: { variable: '--rfr-diff-del-bg', fallback: 'rgba(248, 81, 73, 0.15)' },\n addFg: { variable: '--rfr-diff-add-fg', fallback: '#3fb950' },\n delFg: { variable: '--rfr-diff-del-fg', fallback: '#f85149' },\n statusbar: { variable: '--rfr-diff-statusbar', fallback: 'hsl(var(--primary))' },\n statusbarFg: { variable: '--rfr-diff-statusbar-fg', fallback: 'hsl(var(--primary-foreground))' },\n },\n}\n\nexport const diffViewerVariants = cva({\n base: 'flex flex-col overflow-hidden font-sans text-sm',\n variants: {\n theme: {\n light: 'bg-white text-gray-900',\n dark: 'bg-gray-950 text-gray-100',\n },\n fullscreen: {\n 'true': 'h-screen',\n 'false': '',\n },\n },\n defaultVariants: {\n theme: 'dark',\n fullscreen: 'true',\n },\n})\n\nexport const sidebarVariants = cva({\n base: 'border-r overflow-auto flex-shrink-0',\n variants: {\n theme: {\n light: 'bg-gray-50 border-gray-200',\n dark: 'bg-gray-900 border-gray-800',\n },\n },\n defaultVariants: {\n theme: 'dark',\n },\n})\n\nexport const sidebarItemVariants = cva({\n base: 'px-2.5 py-1 cursor-pointer text-xs font-mono transition-colors',\n variants: {\n active: {\n 'true': 'border-l-2 border-blue-500',\n 'false': 'border-l-2 border-transparent',\n },\n theme: {\n light: '',\n dark: '',\n },\n },\n compoundVariants: [\n { active: 'true', theme: 'dark', class: 'bg-gray-800 text-gray-100' },\n { active: 'false', theme: 'dark', class: 'text-gray-400 hover:bg-gray-800/50' },\n { active: 'true', theme: 'light', class: 'bg-blue-50 text-gray-900' },\n { active: 'false', theme: 'light', class: 'text-gray-600 hover:bg-gray-100' },\n ],\n defaultVariants: {\n active: 'false',\n theme: 'dark',\n },\n})\n\nexport const tabBarVariants = cva({\n base: 'flex items-center border-b overflow-auto flex-shrink-0',\n variants: {\n theme: {\n light: 'bg-gray-50 border-gray-200',\n dark: 'bg-gray-900 border-gray-800',\n },\n },\n defaultVariants: {\n theme: 'dark',\n },\n})\n\nexport const tabVariants = cva({\n base: 'px-3 h-[35px] flex items-center gap-1 cursor-pointer text-xs font-mono border-r shrink-0',\n variants: {\n active: {\n 'true': '',\n 'false': '',\n },\n theme: {\n light: 'border-gray-200',\n dark: 'border-gray-800',\n },\n },\n compoundVariants: [\n { active: 'true', theme: 'dark', class: 'bg-gray-950 text-gray-100 border-b-gray-950 -mb-px' },\n { active: 'false', theme: 'dark', class: 'text-gray-400' },\n { active: 'true', theme: 'light', class: 'bg-white text-gray-900 border-b-white -mb-px' },\n { active: 'false', theme: 'light', class: 'text-gray-500' },\n ],\n defaultVariants: {\n active: 'false',\n theme: 'dark',\n },\n})\n\nexport const statusBarVariants = cva({\n base: 'h-[22px] flex items-center px-2.5 gap-3 text-[11px] font-mono flex-shrink-0',\n variants: {\n theme: {\n light: 'bg-blue-600 text-white',\n dark: 'bg-blue-700 text-white',\n },\n },\n defaultVariants: {\n theme: 'dark',\n },\n})\n", "import * as React from 'react'\nimport {\n createDiffViewer,\n diffViewerVariants,\n sidebarVariants,\n sidebarItemVariants,\n tabBarVariants,\n tabVariants,\n statusBarVariants,\n type DiffFile,\n type DiffViewerTheme,\n type DiffViewMode,\n} from '@refraction-ui/diff-viewer'\nimport { cn } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface DiffViewerProps {\n /** Files in this diff */\n files: DiffFile[]\n /** Original file content (left side) */\n original?: string\n /** Modified file content (right side) */\n modified?: string\n /** Language for syntax highlighting (auto-detected from file if omitted) */\n language?: string\n /** Monaco theme name */\n monacoTheme?: string\n /** Color theme */\n theme?: DiffViewerTheme\n /** View mode */\n viewMode?: DiffViewMode\n /** Whether to show the file sidebar */\n showSidebar?: boolean\n /** Whether to show the tab bar */\n showTabs?: boolean\n /** Whether to show the status bar */\n showStatusBar?: boolean\n /** Sidebar width in pixels */\n sidebarWidth?: number\n /** Active file index */\n activeFileIndex?: number\n /** Called when the active file changes */\n onFileSelect?: (index: number) => void\n /** Called when view mode changes */\n onViewModeChange?: (mode: DiffViewMode) => void\n /** Title shown in the status bar */\n statusBarTitle?: string\n /** Status text shown in the status bar */\n statusBarStatus?: string\n /** Additional class name */\n className?: string\n /** Monaco DiffEditor options override */\n editorOptions?: Record<string, unknown>\n}\n\n// ---------------------------------------------------------------------------\n// Lazy Monaco import\n// ---------------------------------------------------------------------------\n\nconst MonacoDiffEditor = React.lazy(() =>\n import('@monaco-editor/react').then((m) => ({ default: m.DiffEditor })),\n)\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport const DiffViewer = React.forwardRef<HTMLDivElement, DiffViewerProps>(\n function DiffViewer(\n {\n files,\n original = '',\n modified = '',\n language,\n monacoTheme = 'vs-dark',\n theme = 'dark',\n viewMode: controlledViewMode = 'side-by-side',\n showSidebar = true,\n showTabs = true,\n showStatusBar = true,\n sidebarWidth = 220,\n activeFileIndex: controlledIndex = 0,\n onFileSelect,\n onViewModeChange,\n statusBarTitle,\n statusBarStatus,\n className,\n editorOptions,\n },\n ref,\n ) {\n const [activeIdx, setActiveIdx] = React.useState(controlledIndex)\n const [sidebarOpen, setSidebarOpen] = React.useState(showSidebar)\n const [viewMode, setViewMode] = React.useState<DiffViewMode>(controlledViewMode)\n\n // Sync controlled props\n React.useEffect(() => setActiveIdx(controlledIndex), [controlledIndex])\n React.useEffect(() => setViewMode(controlledViewMode), [controlledViewMode])\n\n const api = React.useMemo(\n () =>\n createDiffViewer({\n files,\n activeFileIndex: activeIdx,\n viewMode,\n theme,\n language,\n sidebarOpen,\n onFileSelect: (i: number) => {\n setActiveIdx(i)\n onFileSelect?.(i)\n },\n onViewModeChange: (m: DiffViewMode) => {\n setViewMode(m)\n onViewModeChange?.(m)\n },\n onSidebarToggle: () => setSidebarOpen((s) => !s),\n }),\n [files, activeIdx, viewMode, theme, language, sidebarOpen, onFileSelect, onViewModeChange],\n )\n\n const activeFile = files[activeIdx]\n const detectedLang = language || (activeFile ? api.getLanguageForFile(activeFile.path) : 'plaintext')\n\n // Keyboard navigation\n React.useEffect(() => {\n function onKey(e: KeyboardEvent) {\n if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return\n if (e.key === 'j') {\n setActiveIdx((i) => {\n const next = Math.min(i + 1, files.length - 1)\n onFileSelect?.(next)\n return next\n })\n } else if (e.key === 'k') {\n setActiveIdx((i) => {\n const prev = Math.max(i - 1, 0)\n onFileSelect?.(prev)\n return prev\n })\n } else if (e.key === 'b') {\n setSidebarOpen((s) => !s)\n }\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [files.length, onFileSelect])\n\n return (\n <div\n ref={ref}\n className={cn(diffViewerVariants({ theme, fullscreen: 'true' }), className)}\n {...api.ariaProps}\n {...api.dataAttributes}\n >\n {/* Main area: sidebar + editor */}\n <div style={{ flex: 1, display: 'flex', overflow: 'hidden' }}>\n {/* File sidebar */}\n {sidebarOpen && (\n <div className={sidebarVariants({ theme })} style={{ width: sidebarWidth }}>\n <div className=\"px-2.5 py-2 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground\">\n {`Files (${files.length})`}\n </div>\n {files.map((f, i) => {\n const active = i === activeIdx\n const fname = f.path.split('/').pop() || f.path\n const dir = f.path.split('/').slice(0, -1).join('/')\n return (\n <div\n key={f.path}\n onClick={() => {\n setActiveIdx(i)\n onFileSelect?.(i)\n }}\n className={sidebarItemVariants({ active: active ? 'true' : 'false', theme })}\n >\n <div className=\"flex items-center gap-1\">\n <span className=\"text-[10px]\">{api.getFileStatusIcon(f.status)}</span>\n <span className={active ? '' : 'opacity-70'}>{fname}</span>\n <span className=\"ml-auto text-[10px]\">\n <span className=\"text-green-500\">{`+${f.additions}`}</span>\n {f.deletions > 0 && <span className=\"text-red-500\">{`-${f.deletions}`}</span>}\n </span>\n </div>\n {dir && (\n <div className=\"text-[10px] opacity-50 mt-0.5 pl-4\">{dir}</div>\n )}\n </div>\n )\n })}\n </div>\n )}\n\n {/* Editor area */}\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', overflow: 'hidden' }}>\n {/* Tab bar */}\n {showTabs && activeFile && (\n <div className={tabBarVariants({ theme })}>\n {files.map((f, i) => {\n const active = i === activeIdx\n const fname = f.path.split('/').pop() || f.path\n return (\n <div\n key={f.path}\n onClick={() => {\n setActiveIdx(i)\n onFileSelect?.(i)\n }}\n className={tabVariants({ active: active ? 'true' : 'false', theme })}\n >\n <span className=\"text-[9px]\">{api.getFileStatusIcon(f.status)}</span>\n {fname}\n </div>\n )\n })}\n </div>\n )}\n\n {/* Monaco DiffEditor */}\n <div style={{ flex: 1 }}>\n <React.Suspense\n fallback={\n <div className=\"flex items-center justify-center h-full text-xs opacity-50\">\n Loading editor...\n </div>\n }\n >\n <MonacoDiffEditor\n original={original}\n modified={modified}\n language={detectedLang}\n theme={monacoTheme}\n options={{\n readOnly: true,\n renderSideBySide: viewMode === 'side-by-side',\n minimap: { enabled: true, scale: 1, showSlider: 'mouseover' },\n fontSize: 13,\n lineHeight: 20,\n fontFamily: \"'JetBrains Mono', 'Fira Code', 'SF Mono', Menlo, monospace\",\n fontLigatures: true,\n scrollBeyondLastLine: false,\n renderOverviewRuler: true,\n scrollbar: { verticalScrollbarSize: 10, horizontalScrollbarSize: 10 },\n padding: { top: 8, bottom: 8 },\n renderWhitespace: 'selection',\n bracketPairColorization: { enabled: true },\n guides: { indentation: true },\n smoothScrolling: true,\n cursorBlinking: 'smooth',\n ...editorOptions,\n }}\n />\n </React.Suspense>\n </div>\n </div>\n </div>\n\n {/* Status bar */}\n {showStatusBar && (\n <div className={statusBarVariants({ theme })}>\n {statusBarTitle && <span>{statusBarTitle}</span>}\n {activeFile && <span>{activeFile.path}</span>}\n <span style={{ marginLeft: 'auto' }}>\n {`+${api.totalAdditions()} -${api.totalDeletions()}`}\n </span>\n {statusBarStatus && <span>{statusBarStatus}</span>}\n <span>\n {`${files.length} ${files.length === 1 ? 'file' : 'files'}`}\n </span>\n </div>\n )}\n </div>\n )\n },\n)\n"],
5
+ "mappings": "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",
6
+ "names": ["DiffViewer"]
7
+ }