@luxfi/ui 8.2.7 → 8.2.9

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 (241) hide show
  1. package/dist/3d-model-viewer.cjs +25 -421
  2. package/dist/3d-model-viewer.js +20 -416
  3. package/dist/accordion.cjs +3 -10
  4. package/dist/accordion.js +2 -10
  5. package/dist/advanced-navigation-bar.cjs +5 -401
  6. package/dist/advanced-navigation-bar.js +5 -401
  7. package/dist/ai-agents.cjs +45 -890
  8. package/dist/ai-agents.js +8 -834
  9. package/dist/ai-assistant.cjs +13 -740
  10. package/dist/ai-assistant.js +10 -738
  11. package/dist/ai-chat.cjs +24 -770
  12. package/dist/ai-chat.js +18 -765
  13. package/dist/ai-code.cjs +67 -923
  14. package/dist/ai-code.js +49 -905
  15. package/dist/ai-playground.cjs +25 -801
  16. package/dist/ai-playground.js +18 -795
  17. package/dist/ai-tools.cjs +22 -767
  18. package/dist/ai-tools.js +15 -761
  19. package/dist/ai-vision.cjs +41 -993
  20. package/dist/ai-vision.js +30 -983
  21. package/dist/ai-voice-settings.cjs +35 -1006
  22. package/dist/ai-voice-settings.js +32 -1004
  23. package/dist/ai-voice.cjs +51 -1024
  24. package/dist/ai-voice.js +9 -963
  25. package/dist/alert.cjs +11 -129
  26. package/dist/alert.js +8 -127
  27. package/dist/announcement.cjs +6 -402
  28. package/dist/announcement.js +6 -402
  29. package/dist/app-switcher-navigation-bar.cjs +5 -401
  30. package/dist/app-switcher-navigation-bar.js +5 -401
  31. package/dist/apple-cards-carousel.cjs +84 -480
  32. package/dist/apple-cards-carousel.js +19 -415
  33. package/dist/auth.cjs +10 -387
  34. package/dist/auth.js +7 -385
  35. package/dist/avatar.cjs +2 -9
  36. package/dist/avatar.js +2 -10
  37. package/dist/badge.cjs +8 -228
  38. package/dist/badge.js +5 -210
  39. package/dist/button.cjs +14 -67
  40. package/dist/button.js +12 -65
  41. package/dist/chrome.cjs +29 -493
  42. package/dist/chrome.js +9 -474
  43. package/dist/code-block.cjs +16 -664
  44. package/dist/code-block.js +13 -662
  45. package/dist/code-compare.cjs +28 -1302
  46. package/dist/code-compare.js +18 -1293
  47. package/dist/code-diff.cjs +21 -669
  48. package/dist/code-diff.js +17 -666
  49. package/dist/code-editor.cjs +13 -409
  50. package/dist/code-editor.js +12 -408
  51. package/dist/code-explorer.cjs +14 -456
  52. package/dist/code-explorer.js +13 -456
  53. package/dist/code-preview.cjs +31 -983
  54. package/dist/code-preview.js +23 -976
  55. package/dist/code-snippet.cjs +19 -667
  56. package/dist/code-snippet.js +14 -663
  57. package/dist/code-terminal.cjs +24 -485
  58. package/dist/code-terminal.js +19 -481
  59. package/dist/collapsible.cjs +13 -347
  60. package/dist/collapsible.js +11 -330
  61. package/dist/color-picker.cjs +8 -450
  62. package/dist/color-picker.js +7 -450
  63. package/dist/combobox.cjs +6 -402
  64. package/dist/combobox.js +6 -402
  65. package/dist/communication-navigation-bar.cjs +7 -403
  66. package/dist/communication-navigation-bar.js +5 -401
  67. package/dist/dashboard-navigation-bar.cjs +6 -402
  68. package/dist/dashboard-navigation-bar.js +5 -401
  69. package/dist/dialog-stack.cjs +5 -401
  70. package/dist/dialog-stack.js +5 -401
  71. package/dist/dialog.cjs +13 -70
  72. package/dist/dialog.js +13 -70
  73. package/dist/drawer.cjs +23 -99
  74. package/dist/drawer.js +19 -96
  75. package/dist/e-commerce-navigation-bar.cjs +7 -403
  76. package/dist/e-commerce-navigation-bar.js +5 -401
  77. package/dist/editor.cjs +9 -405
  78. package/dist/editor.js +6 -402
  79. package/dist/iam.cjs +2 -123
  80. package/dist/iam.js +1 -122
  81. package/dist/icon-button.cjs +2 -56
  82. package/dist/icon-button.js +1 -55
  83. package/dist/identity.cjs +28 -242
  84. package/dist/identity.js +20 -235
  85. package/dist/image-crop.cjs +10 -406
  86. package/dist/image-crop.js +7 -403
  87. package/dist/image.cjs +14 -83
  88. package/dist/image.js +13 -67
  89. package/dist/index.cjs +1868 -38770
  90. package/dist/index.js +174 -38320
  91. package/dist/input-group.cjs +3 -10
  92. package/dist/input-group.js +2 -10
  93. package/dist/item.cjs +2 -27
  94. package/dist/item.js +1 -22
  95. package/dist/kanban.cjs +25 -751
  96. package/dist/kanban.js +15 -742
  97. package/dist/limelight-nav.cjs +10 -452
  98. package/dist/limelight-nav.js +9 -452
  99. package/dist/link.cjs +11 -80
  100. package/dist/link.js +6 -60
  101. package/dist/lux.config.cjs +14 -32
  102. package/dist/lux.config.js +3 -26
  103. package/dist/menu.cjs +5 -13
  104. package/dist/menu.js +1 -9
  105. package/dist/message-dock.cjs +5 -401
  106. package/dist/message-dock.js +5 -401
  107. package/dist/mini-calendar.cjs +7 -403
  108. package/dist/mini-calendar.js +6 -402
  109. package/dist/music-player.cjs +30 -528
  110. package/dist/music-player.js +22 -520
  111. package/dist/next.cjs +8 -89
  112. package/dist/next.js +3 -86
  113. package/dist/popover.cjs +17 -74
  114. package/dist/popover.js +16 -73
  115. package/dist/progress-circle.cjs +3 -10
  116. package/dist/progress-circle.js +2 -10
  117. package/dist/provider.cjs +7 -176
  118. package/dist/provider.js +4 -174
  119. package/dist/select.cjs +36 -89
  120. package/dist/select.js +35 -88
  121. package/dist/sidebar.cjs +22 -493
  122. package/dist/sidebar.js +17 -489
  123. package/dist/site/commerce/ui/context.cjs +9 -214
  124. package/dist/site/commerce/ui/context.js +6 -215
  125. package/dist/site/components/analytics.cjs +2 -42
  126. package/dist/site/components/analytics.js +1 -37
  127. package/dist/site/components/auth/callback.cjs +2 -8
  128. package/dist/site/components/auth/callback.js +1 -7
  129. package/dist/site/components/auth/login-panel.cjs +15 -74
  130. package/dist/site/components/auth/login-panel.js +12 -73
  131. package/dist/site/components/auth/login.cjs +2 -6
  132. package/dist/site/components/auth/login.js +1 -5
  133. package/dist/site/components/auth/widget.cjs +2 -6
  134. package/dist/site/components/auth/widget.js +1 -5
  135. package/dist/site/components/commerce/bag-button.cjs +2 -3
  136. package/dist/site/components/commerce/bag-button.js +2 -3
  137. package/dist/site/components/commerce/buy-button.cjs +2 -11
  138. package/dist/site/components/commerce/buy-button.js +1 -10
  139. package/dist/site/components/commerce/checkout-button.cjs +2 -3
  140. package/dist/site/components/commerce/checkout-button.js +2 -3
  141. package/dist/site/components/commerce/checkout-panel/desktop-cp.cjs +15 -173
  142. package/dist/site/components/commerce/checkout-panel/desktop-cp.js +14 -174
  143. package/dist/site/components/commerce/checkout-panel/index.cjs +9 -400
  144. package/dist/site/components/commerce/checkout-panel/index.js +10 -403
  145. package/dist/site/components/commerce/checkout-panel/mobile-cp.cjs +15 -236
  146. package/dist/site/components/commerce/checkout-panel/mobile-cp.js +13 -237
  147. package/dist/site/components/commerce/desktop-bag-popup.cjs +7 -8
  148. package/dist/site/components/commerce/desktop-bag-popup.js +3 -8
  149. package/dist/site/components/commerce/drawer/index.cjs +15 -289
  150. package/dist/site/components/commerce/drawer/index.js +10 -290
  151. package/dist/site/components/commerce/drawer/micro.cjs +8 -115
  152. package/dist/site/components/commerce/drawer/micro.js +4 -115
  153. package/dist/site/components/commerce/drawer/shell.cjs +2 -10
  154. package/dist/site/components/commerce/drawer/shell.js +2 -10
  155. package/dist/site/components/contact-dialog/index.cjs +6 -69
  156. package/dist/site/components/contact-dialog/index.js +7 -71
  157. package/dist/site/components/drawer-margin.cjs +2 -10
  158. package/dist/site/components/drawer-margin.js +2 -10
  159. package/dist/site/components/footer.cjs +11 -81
  160. package/dist/site/components/footer.js +8 -80
  161. package/dist/site/components/header/desktop.cjs +18 -374
  162. package/dist/site/components/header/desktop.js +12 -355
  163. package/dist/site/components/header/index.cjs +9 -674
  164. package/dist/site/components/header/index.js +8 -657
  165. package/dist/site/components/header/mobile-bag-drawer.cjs +6 -71
  166. package/dist/site/components/header/mobile-bag-drawer.js +5 -74
  167. package/dist/site/components/header/mobile-nav-menu-ai.cjs +2 -31
  168. package/dist/site/components/header/mobile-nav-menu-ai.js +1 -26
  169. package/dist/site/components/header/mobile-nav-menu-item.cjs +6 -60
  170. package/dist/site/components/header/mobile-nav-menu-item.js +6 -61
  171. package/dist/site/components/header/mobile-nav-menu.cjs +7 -110
  172. package/dist/site/components/header/mobile-nav-menu.js +7 -112
  173. package/dist/site/components/header/mobile.cjs +25 -330
  174. package/dist/site/components/header/mobile.js +20 -330
  175. package/dist/site/components/icons/index.cjs +34 -35
  176. package/dist/site/components/icons/index.js +5 -33
  177. package/dist/site/components/index.cjs +118 -1961
  178. package/dist/site/components/index.js +23 -1951
  179. package/dist/site/components/mini-chart/index.cjs +7 -90
  180. package/dist/site/components/mini-chart/index.js +1 -92
  181. package/dist/site/components/mini-chart/wrapper.cjs +7 -76
  182. package/dist/site/components/mini-chart/wrapper.js +4 -77
  183. package/dist/site/components/not-found/index.cjs +9 -819
  184. package/dist/site/components/not-found/index.js +8 -802
  185. package/dist/site/components/security/index.cjs +9 -819
  186. package/dist/site/components/security/index.js +8 -802
  187. package/dist/site/next/analytics/index.cjs +16 -49
  188. package/dist/site/next/analytics/index.js +3 -49
  189. package/dist/site/next/analytics/pixel-analytics.cjs +23 -8
  190. package/dist/site/next/analytics/pixel-analytics.js +4 -8
  191. package/dist/site/next/index.cjs +13 -140
  192. package/dist/site/next/index.js +2 -140
  193. package/dist/site/root-layout/index.cjs +12 -1435
  194. package/dist/site/root-layout/index.css +0 -133
  195. package/dist/site/root-layout/index.js +12 -1416
  196. package/dist/site/site-def/footer/community.cjs +11 -27
  197. package/dist/site/site-def/footer/community.js +2 -18
  198. package/dist/site/site-def/footer/company.d.ts +3 -3
  199. package/dist/site/site-def/footer/index.cjs +38 -218
  200. package/dist/site/site-def/footer/index.js +14 -215
  201. package/dist/site/site-def/index.cjs +28 -620
  202. package/dist/site/site-def/index.js +3 -624
  203. package/dist/table.cjs +20 -338
  204. package/dist/table.js +19 -338
  205. package/dist/tabs.cjs +3 -10
  206. package/dist/tabs.js +1 -9
  207. package/dist/tag.cjs +9 -270
  208. package/dist/tag.js +6 -268
  209. package/dist/tags.cjs +6 -314
  210. package/dist/tags.js +5 -314
  211. package/dist/textarea.cjs +4 -50
  212. package/dist/textarea.js +3 -49
  213. package/dist/tooltip.cjs +15 -34
  214. package/dist/tooltip.js +13 -33
  215. package/dist/vite.cjs +3 -82
  216. package/dist/vite.js +1 -80
  217. package/package.json +1 -1
  218. package/dist/index.css +0 -132
  219. package/dist/site/components/auth/login-panel.css +0 -4
  220. package/dist/site/components/commerce/bag-button.css +0 -4
  221. package/dist/site/components/commerce/checkout-button.css +0 -4
  222. package/dist/site/components/commerce/checkout-panel/desktop-cp.css +0 -132
  223. package/dist/site/components/commerce/checkout-panel/index.css +0 -132
  224. package/dist/site/components/commerce/checkout-panel/mobile-cp.css +0 -132
  225. package/dist/site/components/commerce/desktop-bag-popup.css +0 -4
  226. package/dist/site/components/commerce/drawer/index.css +0 -132
  227. package/dist/site/components/commerce/drawer/micro.css +0 -4
  228. package/dist/site/components/header/desktop.css +0 -4
  229. package/dist/site/components/header/index.css +0 -132
  230. package/dist/site/components/header/mobile-bag-drawer.css +0 -4
  231. package/dist/site/components/header/mobile-nav-menu-ai.css +0 -132
  232. package/dist/site/components/header/mobile-nav-menu-item.css +0 -132
  233. package/dist/site/components/header/mobile-nav-menu.css +0 -132
  234. package/dist/site/components/header/mobile.css +0 -132
  235. package/dist/site/components/icons/index.css +0 -4
  236. package/dist/site/components/index.css +0 -132
  237. package/dist/site/components/not-found/index.css +0 -132
  238. package/dist/site/components/security/index.css +0 -132
  239. package/dist/site/site-def/footer/community.css +0 -4
  240. package/dist/site/site-def/footer/index.css +0 -4
  241. package/dist/site/site-def/index.css +0 -4
@@ -2,12 +2,13 @@
2
2
  'use strict';
3
3
 
4
4
  var ui = require('@hanzo/ui');
5
- var React6 = require('react');
5
+ var React = require('react');
6
6
  var lucideReact = require('lucide-react');
7
- var gui = require('@hanzo/gui');
7
+ var badge_cjs = require('./badge.cjs');
8
+ var button_cjs = require('./button.cjs');
9
+ var codeDiff_cjs = require('./code-diff.cjs');
10
+ var codeSnippet_cjs = require('./code-snippet.cjs');
8
11
  var jsxRuntime = require('react/jsx-runtime');
9
- var usehooks = require('@uidotdev/usehooks');
10
- var shiki = require('shiki');
11
12
 
12
13
  function _interopNamespace(e) {
13
14
  if (e && e.__esModule) return e;
@@ -27,1283 +28,8 @@ function _interopNamespace(e) {
27
28
  return Object.freeze(n);
28
29
  }
29
30
 
30
- var React6__namespace = /*#__PURE__*/_interopNamespace(React6);
31
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
31
32
 
32
- var SKELETON_CLASSES = "lux-skeleton rounded-sm";
33
- var Skeleton = React6__namespace.forwardRef(
34
- function Skeleton2(props, ref) {
35
- const { loading = true, asChild, className, children, style, ...rest } = props;
36
- if (!loading) {
37
- if (asChild && React6__namespace.isValidElement(children)) return children;
38
- return /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { ref, className, style, ...rest, children });
39
- }
40
- return /* @__PURE__ */ jsxRuntime.jsx(
41
- "div",
42
- {
43
- ref,
44
- "data-loading": true,
45
- ...ui.sx(
46
- SKELETON_CLASSES,
47
- asChild || children ? "[&_*]:invisible" : "min-h-5",
48
- className
49
- ),
50
- style,
51
- ...rest,
52
- children
53
- }
54
- );
55
- }
56
- );
57
- React6__namespace.forwardRef(
58
- function SkeletonCircle2(props, ref) {
59
- const { size = 40, loading = true, className, ...rest } = props;
60
- const dimension = typeof size === "number" ? `${size}px` : size;
61
- return /* @__PURE__ */ jsxRuntime.jsx(
62
- Skeleton,
63
- {
64
- ref,
65
- loading,
66
- ...ui.sx("rounded-full shrink-0", className),
67
- style: { width: dimension, height: dimension, ...rest.style },
68
- ...rest
69
- }
70
- );
71
- }
72
- );
73
- React6__namespace.forwardRef(
74
- function SkeletonText2(props, ref) {
75
- const { noOfLines = 3, loading = true, className, ...rest } = props;
76
- return /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { ref, className: ui.cn("flex w-full flex-col gap-2", className), ...rest, children: Array.from({ length: noOfLines }).map((_, index) => /* @__PURE__ */ jsxRuntime.jsx(
77
- Skeleton,
78
- {
79
- loading,
80
- ...ui.sx(ui.cn("h-4", index === noOfLines - 1 && "max-w-[80%]"))
81
- },
82
- index
83
- )) });
84
- }
85
- );
86
- var ink = (children, Wrap = gui.Text, props = {}) => {
87
- let hasText = false;
88
- React6.Children.forEach(children, (child) => {
89
- if (typeof child === "string" || typeof child === "number") hasText = true;
90
- });
91
- if (!hasText) return children;
92
- return React6.Children.map(children, (child) => typeof child === "string" || typeof child === "number" ? React6.createElement(Wrap, props, child) : child);
93
- };
94
- var TOUCH_PX = 1024;
95
- function useBelow(px) {
96
- const [below, setBelow] = React6__namespace.useState(false);
97
- React6__namespace.useEffect(() => {
98
- const mql = window.matchMedia(`(max-width: ${px - 1}px)`);
99
- const apply = () => setBelow(mql.matches);
100
- apply();
101
- mql.addEventListener("change", apply);
102
- return () => mql.removeEventListener("change", apply);
103
- }, [px]);
104
- return below;
105
- }
106
- var useIsTouch = () => useBelow(TOUCH_PX);
107
- function mapPlacement(p) {
108
- if (!p) return void 0;
109
- return p;
110
- }
111
- var Tooltip = React6__namespace.forwardRef(
112
- function Tooltip2(props, ref) {
113
- const {
114
- showArrow: showArrowProp,
115
- onOpenChange,
116
- variant,
117
- selected,
118
- children,
119
- disabled,
120
- disableOnMobile,
121
- content,
122
- contentProps,
123
- defaultOpen = false,
124
- triggerProps,
125
- closeDelay = 100,
126
- openDelay = 100,
127
- interactive,
128
- positioning
129
- } = props;
130
- const [open, setOpen] = React6__namespace.useState(defaultOpen);
131
- const timeoutRef = React6__namespace.useRef(null);
132
- const isMobile = useIsTouch();
133
- const handleOpenChange = React6__namespace.useCallback((nextOpen) => {
134
- setOpen(nextOpen);
135
- onOpenChange?.({ open: nextOpen });
136
- }, [onOpenChange]);
137
- const handleOpenChangeManual = React6__namespace.useCallback((nextOpen) => {
138
- timeoutRef.current && window.clearTimeout(timeoutRef.current);
139
- timeoutRef.current = window.setTimeout(() => {
140
- setOpen(nextOpen);
141
- onOpenChange?.({ open: nextOpen });
142
- }, nextOpen ? openDelay : closeDelay);
143
- }, [closeDelay, openDelay, onOpenChange]);
144
- const handleClickAway = React6__namespace.useCallback(() => {
145
- if (open) handleOpenChangeManual(false);
146
- }, [open, handleOpenChangeManual]);
147
- const triggerRef = usehooks.useClickAway(handleClickAway);
148
- const handleTriggerClick = React6__namespace.useCallback(() => {
149
- handleOpenChangeManual(!open);
150
- }, [handleOpenChangeManual, open]);
151
- const handleContentClick = React6__namespace.useCallback((event) => {
152
- event.stopPropagation();
153
- if (interactive) {
154
- const closestLink = event.target?.closest("a");
155
- if (closestLink) {
156
- handleOpenChangeManual(false);
157
- }
158
- }
159
- }, [interactive, handleOpenChangeManual]);
160
- React6__namespace.useEffect(() => {
161
- return () => {
162
- if (timeoutRef.current) {
163
- clearTimeout(timeoutRef.current);
164
- }
165
- };
166
- }, []);
167
- if (disabled || disableOnMobile && isMobile) return children;
168
- const defaultShowArrow = variant === "popover" ? false : true;
169
- const showArrow = showArrowProp !== void 0 ? showArrowProp : defaultShowArrow;
170
- const isPopover = variant === "popover";
171
- const placement = mapPlacement(positioning?.placement) ?? "top";
172
- const offset = positioning?.offset?.mainAxis ?? 4;
173
- return /* @__PURE__ */ jsxRuntime.jsx(gui.TooltipGroup, { delay: openDelay, children: /* @__PURE__ */ jsxRuntime.jsxs(
174
- gui.Tooltip,
175
- {
176
- open,
177
- onOpenChange: handleOpenChange,
178
- delay: { open: openDelay, close: closeDelay },
179
- placement,
180
- offset,
181
- unstyled: true,
182
- children: [
183
- /* @__PURE__ */ jsxRuntime.jsx(
184
- gui.Tooltip.Trigger,
185
- {
186
- ref: triggerRef,
187
- asChild: true,
188
- ...isMobile ? { onClick: handleTriggerClick } : {},
189
- ...triggerProps,
190
- children
191
- }
192
- ),
193
- /* @__PURE__ */ jsxRuntime.jsxs(
194
- gui.Tooltip.Content,
195
- {
196
- ref,
197
- unstyled: true,
198
- zIndex: 9999,
199
- overflow: "hidden",
200
- borderRadius: 8,
201
- paddingHorizontal: 12,
202
- paddingVertical: 8,
203
- maxWidth: isPopover ? 384 : 320,
204
- backgroundColor: isPopover ? "var(--color-popover-bg)" : "var(--color-tooltip-bg)",
205
- transition: "quick",
206
- enterStyle: { opacity: 0, scale: 0.95 },
207
- exitStyle: { opacity: 0, scale: 0.95 },
208
- ...isPopover ? {
209
- borderWidth: 1,
210
- borderColor: "var(--color-border-divider)",
211
- shadowColor: "var(--shadow-popover)"
212
- } : {},
213
- onClick: interactive ? handleContentClick : void 0,
214
- ...selected ? { "data-selected": true } : {},
215
- ...contentProps,
216
- children: [
217
- showArrow && /* @__PURE__ */ jsxRuntime.jsx(
218
- gui.Tooltip.Arrow,
219
- {
220
- unstyled: true,
221
- backgroundColor: isPopover ? "var(--color-popover-bg)" : "var(--color-tooltip-bg)"
222
- }
223
- ),
224
- ink(content, void 0, {
225
- fontSize: 14,
226
- color: isPopover ? "var(--color-text-primary)" : "var(--color-tooltip-fg)"
227
- })
228
- ]
229
- }
230
- )
231
- ]
232
- }
233
- ) });
234
- }
235
- );
236
- function TruncatedTextTooltip({ label, children }) {
237
- return /* @__PURE__ */ jsxRuntime.jsx(Tooltip, { content: label, positioning: { placement: "top" }, children });
238
- }
239
- var SIZE = {
240
- sm: { padding: 4, height: 18, minHeight: 18 },
241
- md: { paddingHorizontal: 4, paddingVertical: 2, minHeight: 24 },
242
- lg: { paddingHorizontal: 8, paddingVertical: 4, minHeight: 28 }
243
- };
244
- var SIZE_TEXT = {
245
- sm: { fontSize: 12, fontWeight: "500" },
246
- md: { fontSize: 14, fontWeight: "500" },
247
- lg: { fontSize: 14, fontWeight: "600" }
248
- };
249
- var COLOR_PALETTE = {
250
- gray: { bg: "var(--color-badge-gray-bg)", fg: "var(--color-badge-gray-fg)" },
251
- green: { bg: "var(--color-badge-green-bg)", fg: "var(--color-badge-green-fg)" },
252
- red: { bg: "var(--color-badge-red-bg)", fg: "var(--color-badge-red-fg)" },
253
- purple: { bg: "var(--color-badge-purple-bg)", fg: "var(--color-badge-purple-fg)" },
254
- orange: { bg: "var(--color-badge-orange-bg)", fg: "var(--color-badge-orange-fg)" },
255
- blue: { bg: "var(--color-badge-blue-bg)", fg: "var(--color-badge-blue-fg)" },
256
- yellow: { bg: "var(--color-badge-yellow-bg)", fg: "var(--color-badge-yellow-fg)" },
257
- teal: { bg: "var(--color-badge-teal-bg)", fg: "var(--color-badge-teal-fg)" },
258
- cyan: { bg: "var(--color-badge-cyan-bg)", fg: "var(--color-badge-cyan-fg)" },
259
- pink: { bg: "var(--color-badge-pink-bg)", fg: "var(--color-badge-pink-fg)" },
260
- purple_alt: { bg: "var(--color-badge-purple-alt-bg)", fg: "var(--color-badge-purple-alt-fg)" },
261
- blue_alt: { bg: "var(--color-badge-blue-alt-bg)", fg: "var(--color-badge-blue-alt-fg)" },
262
- bright_gray: { bg: "var(--color-badge-bright-gray-bg)", fg: "var(--color-badge-bright-gray-fg)" },
263
- bright_green: { bg: "var(--color-badge-bright-green-bg)", fg: "var(--color-badge-bright-green-fg)" },
264
- bright_red: { bg: "var(--color-badge-bright-red-bg)", fg: "var(--color-badge-bright-red-fg)" },
265
- bright_blue: { bg: "var(--color-badge-bright-blue-bg)", fg: "var(--color-badge-bright-blue-fg)" },
266
- bright_yellow: { bg: "var(--color-badge-bright-yellow-bg)", fg: "var(--color-badge-bright-yellow-fg)" },
267
- bright_teal: { bg: "var(--color-badge-bright-teal-bg)", fg: "var(--color-badge-bright-teal-fg)" },
268
- bright_cyan: { bg: "var(--color-badge-bright-cyan-bg)", fg: "var(--color-badge-bright-cyan-fg)" },
269
- bright_orange: { bg: "var(--color-badge-bright-orange-bg)", fg: "var(--color-badge-bright-orange-fg)" },
270
- bright_purple: { bg: "var(--color-badge-bright-purple-bg)", fg: "var(--color-badge-bright-purple-fg)" },
271
- bright_pink: { bg: "var(--color-badge-bright-pink-bg)", fg: "var(--color-badge-bright-pink-fg)" }
272
- };
273
- var TONE = {
274
- subtle: (p) => ({ backgroundColor: p.bg, color: p.fg, borderWidth: 0 }),
275
- solid: (p) => ({ backgroundColor: p.fg, color: p.bg, borderWidth: 0 }),
276
- outline: (p) => ({
277
- backgroundColor: "transparent",
278
- color: p.fg,
279
- borderWidth: 1,
280
- borderColor: p.fg
281
- })
282
- };
283
- var Badge = React6__namespace.default.forwardRef(
284
- function Badge2(props, ref) {
285
- const {
286
- loading,
287
- startElement,
288
- children,
289
- truncated = false,
290
- endElement,
291
- variant = "subtle",
292
- size = "md",
293
- colorPalette = "gray",
294
- className,
295
- style: badgeStyle,
296
- ...rest
297
- } = props;
298
- const palette = COLOR_PALETTE[colorPalette];
299
- const tone = TONE[variant](palette);
300
- const child = children ? (
301
- // `ellipsis` is gui Text's own built-in variant for single-line
302
- // truncation — it expands to the same overflow/text-overflow/
303
- // white-space/max-width rule Tailwind's `text-ellipsis` did, but
304
- // through the component's own variants (guaranteed to compile),
305
- // rather than naming each longhand as a separate style prop.
306
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { ellipsis: true, ...SIZE_TEXT[size], color: tone.color, children })
307
- ) : null;
308
- const childrenElement = truncated ? /* @__PURE__ */ jsxRuntime.jsx(TruncatedTextTooltip, { label: children, children: child }) : child;
309
- const badgeElement = /* @__PURE__ */ jsxRuntime.jsxs(
310
- gui.XStack,
311
- {
312
- ref,
313
- render: /* @__PURE__ */ jsxRuntime.jsx("span", {}),
314
- display: "inline-flex",
315
- alignItems: "center",
316
- alignSelf: "flex-start",
317
- borderRadius: 2,
318
- gap: 4,
319
- maxWidth: "100%",
320
- userSelect: "text",
321
- ...SIZE[size],
322
- ...tone,
323
- className,
324
- style: badgeStyle,
325
- ...rest,
326
- children: [
327
- startElement,
328
- childrenElement,
329
- endElement
330
- ]
331
- }
332
- );
333
- if (loading) {
334
- return /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { loading, asChild: true, children: badgeElement });
335
- }
336
- return badgeElement;
337
- }
338
- );
339
- var SpinnerFrame = gui.styled(gui.View, {
340
- name: "ButtonSpinner",
341
- render: /* @__PURE__ */ jsxRuntime.jsx("span", {}),
342
- width: 16,
343
- height: 16,
344
- borderRadius: 1e3,
345
- borderWidth: 2,
346
- borderColor: "currentColor",
347
- borderBottomColor: "transparent",
348
- borderLeftColor: "transparent"
349
- });
350
- function Spinner({ className }) {
351
- return /* @__PURE__ */ jsxRuntime.jsx(
352
- SpinnerFrame,
353
- {
354
- role: "status",
355
- "aria-label": "Loading",
356
- className: [
357
- "animate-spin",
358
- className
359
- ].filter(Boolean).join(" ")
360
- }
361
- );
362
- }
363
- var ButtonFrame = gui.styled(gui.View, {
364
- name: "LuxButton",
365
- render: /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button" }),
366
- role: "button",
367
- tabIndex: 0,
368
- cursor: "pointer",
369
- userSelect: "none",
370
- display: "inline-flex",
371
- alignItems: "center",
372
- justifyContent: "center",
373
- gap: 0,
374
- overflow: "hidden",
375
- borderRadius: 6,
376
- // Whitespace nowrap via className since hanzogui doesn't have a direct token
377
- // Transition via className
378
- variants: {
379
- size: {
380
- "2xs": { paddingHorizontal: 8, height: 20, minWidth: 20, fontSize: 12, borderRadius: 4, gap: 4 },
381
- xs: { paddingHorizontal: 8, height: 24, minWidth: 24, fontSize: 14, borderRadius: 4, gap: 4 },
382
- sm: { paddingHorizontal: 12, height: 32, minWidth: 32, fontSize: 14, borderRadius: 6, gap: 4 },
383
- md: { paddingHorizontal: 12, height: 40, minWidth: 40, fontSize: 16, borderRadius: 6, gap: 8 }
384
- },
385
- disabled: {
386
- true: {
387
- opacity: 0.2,
388
- cursor: "not-allowed",
389
- pointerEvents: "none"
390
- }
391
- }
392
- },
393
- defaultVariants: {
394
- size: "md"
395
- }
396
- });
397
- var VARIANT_CLASSES = {
398
- solid: [
399
- "bg-[var(--color-button-solid-bg)] text-[var(--color-button-solid-text)]",
400
- "hover:bg-[var(--color-hover)]",
401
- "data-[expanded]:bg-[var(--color-hover)]"
402
- ].join(" "),
403
- solid_danger: [
404
- "bg-[var(--color-button-danger-bg)] text-[var(--color-button-danger-fg)]",
405
- "hover:bg-[var(--color-button-danger-bg-hover)]",
406
- "data-[expanded]:bg-[var(--color-button-danger-bg-hover)]"
407
- ].join(" "),
408
- outline: [
409
- "border-2 border-solid bg-transparent",
410
- "text-[var(--color-button-outline-fg)] border-[var(--color-button-outline-fg)]",
411
- "hover:bg-transparent hover:text-[var(--color-hover)] hover:border-[var(--color-hover)]"
412
- ].join(" "),
413
- outline_danger: [
414
- "border-2 border-solid bg-transparent",
415
- "text-[var(--color-button-danger-bg)] border-[var(--color-button-danger-bg)]",
416
- "hover:bg-transparent hover:text-[var(--color-button-danger-bg-hover)] hover:border-[var(--color-button-danger-bg-hover)]"
417
- ].join(" "),
418
- dropdown: [
419
- "border-2 border-solid bg-transparent",
420
- "text-[var(--color-button-dropdown-fg)] border-[var(--color-button-dropdown-border)]",
421
- "hover:bg-transparent hover:text-[var(--color-hover)] hover:border-[var(--color-hover)]",
422
- "data-[expanded]:bg-transparent data-[expanded]:text-[var(--color-hover)] data-[expanded]:border-[var(--color-hover)]",
423
- "data-[selected]:bg-[var(--color-selected-control-bg)] data-[selected]:text-[var(--color-selected-control-text)] data-[selected]:border-transparent",
424
- "data-[selected]:hover:bg-[var(--color-selected-control-bg)]",
425
- "data-[selected]:hover:text-[var(--color-hover)] data-[selected]:hover:border-transparent",
426
- "data-[selected]:data-[expanded]:text-[var(--color-hover)]"
427
- ].join(" "),
428
- header: [
429
- "bg-transparent border-2 border-solid",
430
- "text-[var(--color-button-header-fg)] border-[var(--color-button-header-border)]",
431
- "hover:bg-transparent hover:text-[var(--color-hover)] hover:border-[var(--color-hover)]",
432
- "data-[selected]:bg-[var(--color-button-header-bg-selected)]",
433
- "data-[selected]:text-[var(--color-button-header-fg-selected)] data-[selected]:border-transparent data-[selected]:border-0",
434
- "data-[selected]:hover:bg-[var(--color-button-header-bg-selected)] data-[selected]:hover:text-[var(--color-hover)]",
435
- "data-[selected]:data-[expanded]:text-[var(--color-hover)]",
436
- "data-[selected]:data-[highlighted]:bg-[var(--color-button-header-bg-highlighted)]",
437
- "data-[selected]:data-[highlighted]:text-[var(--color-button-header-fg-highlighted)]",
438
- "data-[selected]:data-[highlighted]:border-transparent data-[selected]:data-[highlighted]:border-0",
439
- "data-[selected]:data-[highlighted]:hover:bg-[var(--color-button-header-bg-highlighted)]",
440
- "data-[selected]:data-[highlighted]:hover:text-[var(--color-hover)]",
441
- "data-[selected]:data-[highlighted]:data-[expanded]:text-[var(--color-hover)]"
442
- ].join(" "),
443
- hero: [
444
- "bg-[var(--color-button-hero-bg)] text-[var(--color-button-hero-fg)]",
445
- "hover:bg-[var(--color-button-hero-bg-hover)] hover:text-[var(--color-button-hero-fg-hover)]",
446
- "data-[selected]:bg-[var(--color-button-hero-bg-selected)] data-[selected]:text-[var(--color-button-hero-fg-selected)]",
447
- "data-[selected]:hover:bg-[var(--color-button-hero-bg-selected)] data-[selected]:hover:text-[var(--color-hover)]",
448
- "data-[selected]:data-[expanded]:text-[var(--color-hover)]"
449
- ].join(" "),
450
- segmented: [
451
- "bg-transparent border-2 border-solid rounded-none",
452
- "text-[var(--color-button-segmented-fg)] border-[var(--color-selected-control-bg)]",
453
- "hover:text-[var(--color-hover)]",
454
- "data-[selected]:bg-[var(--color-selected-control-bg)] data-[selected]:text-[var(--color-selected-control-text)]",
455
- "data-[selected]:hover:bg-[var(--color-selected-control-bg)] data-[selected]:hover:text-[var(--color-selected-control-text)]",
456
- "[&:not(:last-child)]:border-r-0 data-[selected]:[&:not(:last-child)]:border-r-2",
457
- "data-[selected]+*:border-l-0",
458
- "first:rounded-l-md last:rounded-r-md"
459
- ].join(" "),
460
- plain: "bg-transparent text-inherit border-none hover:bg-transparent",
461
- subtle: [
462
- "bg-[var(--color-button-subtle-bg)] text-[var(--color-button-subtle-fg)]",
463
- "hover:bg-[var(--color-button-subtle-bg)] hover:text-[var(--color-hover)]",
464
- "disabled:bg-[var(--color-button-subtle-bg)] disabled:text-[var(--color-button-subtle-fg)]"
465
- ].join(" "),
466
- link: [
467
- "bg-transparent text-[var(--color-link-primary)] border-none font-normal",
468
- "px-0 h-auto",
469
- "hover:bg-transparent hover:text-[var(--color-link-primary-hover)]",
470
- "disabled:text-[var(--color-text-secondary)]"
471
- ].join(" "),
472
- icon_secondary: [
473
- "bg-transparent text-[var(--color-icon-secondary)] border-none",
474
- "hover:text-[var(--color-hover)]",
475
- "data-[selected]:bg-[var(--color-selected-control-bg)] data-[selected]:text-[var(--color-selected-control-text)]",
476
- "data-[selected]:hover:bg-[var(--color-selected-control-bg)] data-[selected]:hover:text-[var(--color-hover)]",
477
- "data-[selected]:data-[expanded]:text-[var(--color-hover)]",
478
- "data-[expanded]:text-[var(--color-hover)]"
479
- ].join(" "),
480
- icon_background: [
481
- "bg-[var(--color-button-icon-background-bg)] text-[var(--color-icon-secondary)] border-none",
482
- "hover:text-[var(--color-hover)]",
483
- "data-[selected]:bg-[var(--color-selected-control-bg)] data-[selected]:text-[var(--color-selected-control-text)]",
484
- "data-[selected]:hover:bg-[var(--color-selected-control-bg)] data-[selected]:hover:text-[var(--color-hover)]",
485
- "data-[selected]:data-[expanded]:text-[var(--color-hover)]",
486
- "data-[expanded]:text-[var(--color-hover)]"
487
- ].join(" "),
488
- pagination: [
489
- "border-2 border-solid bg-transparent",
490
- "text-[var(--color-button-pagination-fg)] border-[var(--color-button-pagination-border)]",
491
- "hover:bg-transparent hover:text-[var(--color-hover)] hover:border-[var(--color-hover)]",
492
- "data-[selected]:bg-[var(--color-selected-control-bg)] data-[selected]:text-[var(--color-selected-control-text)] data-[selected]:border-transparent",
493
- "data-[selected]:hover:bg-[var(--color-selected-control-bg)]",
494
- "data-[selected]:hover:text-[var(--color-selected-control-text)] data-[selected]:hover:border-transparent"
495
- ].join(" ")
496
- };
497
- var BASE_CLASSES = "font-semibold whitespace-nowrap transition-colors duration-150";
498
- var SP = 4;
499
- function buildShimStyle(props) {
500
- const s = { ...props.style };
501
- if (props.mt !== void 0) s.marginTop = typeof props.mt === "number" ? `${props.mt * SP}px` : props.mt;
502
- if (props.ml !== void 0) s.marginLeft = typeof props.ml === "number" ? `${props.ml * SP}px` : props.ml;
503
- if (props.mr !== void 0) s.marginRight = typeof props.mr === "number" ? `${props.mr * SP}px` : props.mr;
504
- if (props.px !== void 0) {
505
- const v = typeof props.px === "number" ? `${props.px * SP}px` : props.px;
506
- s.paddingLeft = v;
507
- s.paddingRight = v;
508
- }
509
- if (props.py !== void 0) {
510
- const v = typeof props.py === "number" ? `${props.py * SP}px` : props.py;
511
- s.paddingTop = v;
512
- s.paddingBottom = v;
513
- }
514
- if (props.fontWeight !== void 0) s.fontWeight = props.fontWeight;
515
- if (props.gap !== void 0) s.gap = typeof props.gap === "number" ? `${props.gap * SP}px` : props.gap;
516
- if (props.flexShrink !== void 0) s.flexShrink = props.flexShrink;
517
- if (props.columnGap !== void 0) s.columnGap = typeof props.columnGap === "number" ? `${props.columnGap * SP}px` : props.columnGap;
518
- if (props.gridColumn !== void 0) s.gridColumn = typeof props.gridColumn === "number" ? String(props.gridColumn) : props.gridColumn;
519
- if (props.gridRow) s.gridRow = props.gridRow;
520
- if (props.justifySelf) s.justifySelf = props.justifySelf;
521
- if (props.alignSelf) s.alignSelf = props.alignSelf;
522
- if (props.h) s.height = props.h;
523
- if (props.w) s.width = props.w;
524
- if (props.display) s.display = props.display;
525
- if (props.borderBottomRightRadius !== void 0) s.borderBottomRightRadius = typeof props.borderBottomRightRadius === "number" ? `${props.borderBottomRightRadius}px` : props.borderBottomRightRadius;
526
- if (props.borderTopRightRadius !== void 0) s.borderTopRightRadius = typeof props.borderTopRightRadius === "number" ? `${props.borderTopRightRadius}px` : props.borderTopRightRadius;
527
- return Object.keys(s).length > 0 ? s : void 0;
528
- }
529
- var Button = React6__namespace.forwardRef(
530
- function Button2(props, ref) {
531
- const {
532
- className,
533
- variant = "solid",
534
- size = "md",
535
- asChild = false,
536
- loading = false,
537
- loadingText,
538
- loadingSkeleton = false,
539
- expanded,
540
- selected,
541
- highlighted,
542
- disabled,
543
- children,
544
- style: styleProp,
545
- // Strip Chakra style props
546
- mt,
547
- ml,
548
- mr,
549
- px,
550
- py,
551
- fontWeight,
552
- gap,
553
- flexShrink,
554
- columnGap,
555
- gridColumn,
556
- gridRow,
557
- justifySelf,
558
- alignSelf,
559
- textStyle: _textStyle,
560
- h,
561
- w,
562
- display,
563
- borderBottomRightRadius,
564
- borderTopRightRadius,
565
- ...rest
566
- } = props;
567
- const mergedStyle = buildShimStyle({
568
- style: styleProp,
569
- mt,
570
- ml,
571
- mr,
572
- px,
573
- py,
574
- fontWeight,
575
- gap,
576
- flexShrink,
577
- columnGap,
578
- gridColumn,
579
- gridRow,
580
- justifySelf,
581
- alignSelf,
582
- h,
583
- w,
584
- display,
585
- borderBottomRightRadius,
586
- borderTopRightRadius
587
- });
588
- const dataAttrs = {};
589
- if (expanded) dataAttrs["data-expanded"] = true;
590
- if (selected) dataAttrs["data-selected"] = true;
591
- if (highlighted) dataAttrs["data-highlighted"] = true;
592
- if (loadingSkeleton) dataAttrs["data-loading-skeleton"] = true;
593
- const isDisabled = !loadingSkeleton && (loading || disabled);
594
- const inner = loading ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
595
- /* @__PURE__ */ jsxRuntime.jsx(Spinner, {}),
596
- loadingText != null && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { marginLeft: 8 }, children: loadingText })
597
- ] }) : children;
598
- const variantClass = VARIANT_CLASSES[variant] ?? VARIANT_CLASSES.solid;
599
- const combinedClassName = [BASE_CLASSES, variantClass, className].filter(Boolean).join(" ");
600
- const button = /* @__PURE__ */ jsxRuntime.jsx(
601
- ButtonFrame,
602
- {
603
- ref,
604
- size,
605
- disabled: isDisabled || void 0,
606
- asChild: asChild || void 0,
607
- className: combinedClassName,
608
- style: mergedStyle,
609
- ...dataAttrs,
610
- ...rest,
611
- children: inner
612
- }
613
- );
614
- if (loadingSkeleton) {
615
- return /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { loading: loadingSkeleton, asChild: true, ref, children: button });
616
- }
617
- return button;
618
- }
619
- );
620
- React6__namespace.forwardRef(
621
- function ButtonGroup2(props, ref) {
622
- const { className, ...rest } = props;
623
- return /* @__PURE__ */ jsxRuntime.jsx(
624
- ui.Box,
625
- {
626
- ref,
627
- className: ["inline-flex", className].filter(Boolean).join(" "),
628
- role: "group",
629
- ...rest
630
- }
631
- );
632
- }
633
- );
634
- React6__namespace.forwardRef(
635
- function ButtonGroupRadio2(props, ref) {
636
- const {
637
- children,
638
- onChange,
639
- variant = "segmented",
640
- defaultValue,
641
- loading = false,
642
- equalWidth = false,
643
- className,
644
- ...rest
645
- } = props;
646
- const firstChildValue = React6__namespace.useMemo(() => {
647
- const firstChild = Array.isArray(children) ? children[0] : void 0;
648
- return typeof firstChild?.props.value === "string" ? firstChild.props.value : void 0;
649
- }, [children]);
650
- const [value, setValue] = React6__namespace.useState(defaultValue ?? firstChildValue);
651
- const handleItemClick = React6__namespace.useCallback((event) => {
652
- const v = event.currentTarget.value;
653
- setValue(v);
654
- onChange?.(v);
655
- }, [onChange]);
656
- const clonedChildren = React6__namespace.Children.map(children, (child) => {
657
- return React6__namespace.cloneElement(child, {
658
- onClick: handleItemClick,
659
- selected: value === child.props.value,
660
- variant
661
- });
662
- });
663
- const childrenLength = React6__namespace.Children.count(children);
664
- return /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { loading, children: /* @__PURE__ */ jsxRuntime.jsx(
665
- ui.Box,
666
- {
667
- ref,
668
- className: [
669
- "inline-flex gap-0",
670
- equalWidth ? "grid" : "",
671
- className
672
- ].filter(Boolean).join(" "),
673
- style: equalWidth ? { gridTemplateColumns: `repeat(${childrenLength}, 1fr)` } : void 0,
674
- role: "group",
675
- ...rest,
676
- children: clonedChildren
677
- }
678
- ) });
679
- }
680
- );
681
- var codeDiffVariants = ui.variants(
682
- "relative overflow-hidden rounded-lg border bg-muted/50",
683
- {
684
- variants: {
685
- theme: {
686
- dark: "bg-[var(--color-bg-primary)] border-[var(--color-border-divider)]",
687
- light: "bg-[var(--color-bg-body)] border-[var(--color-border-divider)]",
688
- github: "bg-white border-[var(--color-border-divider)]",
689
- "github-dark": "bg-[var(--color-bg-primary)] border-[var(--color-border-divider)]"
690
- },
691
- size: {
692
- sm: "text-xs",
693
- default: "text-sm",
694
- lg: "text-base"
695
- }
696
- },
697
- defaultVariants: {
698
- theme: "dark",
699
- size: "default"
700
- }
701
- }
702
- );
703
- var DiffLine = React6__namespace.memo(
704
- ({
705
- change,
706
- showLineNumbers,
707
- isUnified = false,
708
- highlightedContent
709
- }) => {
710
- const getLineClasses = () => {
711
- const base = "group relative flex min-h-[1.5rem] items-center py-0.5";
712
- if (isUnified) {
713
- switch (change.type) {
714
- case "add":
715
- return ui.cn(base, "bg-[var(--lux-state-success)]/10 border-l-2 border-l-green-500");
716
- case "remove":
717
- return ui.cn(base, "bg-[var(--lux-state-error)]/10 border-l-2 border-l-red-500");
718
- default:
719
- return ui.cn(base, "hover:bg-muted/50");
720
- }
721
- }
722
- return ui.cn(base, "hover:bg-muted/50");
723
- };
724
- const getLinePrefix = () => {
725
- if (!isUnified) return null;
726
- switch (change.type) {
727
- case "add":
728
- return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { style: ui.css("h-3 w-3 text-[var(--lux-state-success)] mr-2 flex-shrink-0") });
729
- case "remove":
730
- return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Minus, { style: ui.css("h-3 w-3 text-[var(--lux-state-error)] mr-2 flex-shrink-0") });
731
- default:
732
- return /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { tag: "span", className: "w-3 mr-2 flex-shrink-0" });
733
- }
734
- };
735
- return /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { className: getLineClasses(), children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { className: "flex items-center px-4 w-full", children: [
736
- showLineNumbers && /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { className: "flex items-center gap-2 mr-4", children: !isUnified ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
737
- /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { tag: "span", className: "inline-block w-8 select-none text-right text-xs text-muted-foreground", children: change.oldLineNumber || "" }),
738
- /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { tag: "span", className: "inline-block w-8 select-none text-right text-xs text-muted-foreground", children: change.newLineNumber || "" })
739
- ] }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { tag: "span", className: "inline-block w-8 select-none text-right text-xs text-muted-foreground", children: change.lineNumber }) }),
740
- getLinePrefix(),
741
- /* @__PURE__ */ jsxRuntime.jsx(
742
- ui.Box,
743
- {
744
- className: "flex-1 overflow-x-auto font-mono",
745
- dangerouslySetInnerHTML: {
746
- __html: highlightedContent || change.content
747
- }
748
- }
749
- )
750
- ] }) });
751
- }
752
- );
753
- DiffLine.displayName = "DiffLine";
754
- function generateDiff(oldCode, newCode) {
755
- const oldLines = oldCode.split("\n");
756
- const newLines = newCode.split("\n");
757
- const changes = [];
758
- let oldIndex = 0;
759
- let newIndex = 0;
760
- let lineNumber = 1;
761
- while (oldIndex < oldLines.length || newIndex < newLines.length) {
762
- const oldLine = oldLines[oldIndex];
763
- const newLine = newLines[newIndex];
764
- if (oldIndex >= oldLines.length) {
765
- changes.push({
766
- type: "add",
767
- lineNumber: lineNumber++,
768
- content: newLine,
769
- newLineNumber: newIndex + 1
770
- });
771
- newIndex++;
772
- } else if (newIndex >= newLines.length) {
773
- changes.push({
774
- type: "remove",
775
- lineNumber: lineNumber++,
776
- content: oldLine,
777
- oldLineNumber: oldIndex + 1
778
- });
779
- oldIndex++;
780
- } else if (oldLine === newLine) {
781
- changes.push({
782
- type: "unchanged",
783
- lineNumber: lineNumber++,
784
- content: oldLine,
785
- oldLineNumber: oldIndex + 1,
786
- newLineNumber: newIndex + 1
787
- });
788
- oldIndex++;
789
- newIndex++;
790
- } else {
791
- changes.push({
792
- type: "remove",
793
- lineNumber: lineNumber++,
794
- content: oldLine,
795
- oldLineNumber: oldIndex + 1
796
- });
797
- changes.push({
798
- type: "add",
799
- lineNumber: lineNumber++,
800
- content: newLine,
801
- newLineNumber: newIndex + 1
802
- });
803
- oldIndex++;
804
- newIndex++;
805
- }
806
- }
807
- return changes;
808
- }
809
- var CodeDiff = React6__namespace.forwardRef(
810
- ({
811
- className,
812
- theme,
813
- size,
814
- oldCode,
815
- newCode,
816
- language = "text",
817
- filename,
818
- oldFilename,
819
- newFilename,
820
- showLineNumbers = true,
821
- showCopyButton = true,
822
- maxHeight = "500px",
823
- defaultView = "unified",
824
- collapseUnchanged = false,
825
- contextLines = 3,
826
- ...props
827
- }, ref) => {
828
- const [view, setView] = React6__namespace.useState(defaultView);
829
- const [copied, setCopied] = React6__namespace.useState(false);
830
- const [isLoading, setIsLoading] = React6__namespace.useState(true);
831
- const [highlightedOldCode, setHighlightedOldCode] = React6__namespace.useState("");
832
- const [highlightedNewCode, setHighlightedNewCode] = React6__namespace.useState("");
833
- const [changes, setChanges] = React6__namespace.useState([]);
834
- const themeMap = {
835
- dark: "github-dark",
836
- light: "github-light",
837
- github: "github-light",
838
- "github-dark": "github-dark"
839
- };
840
- React6__namespace.useEffect(() => {
841
- const highlightCode = async () => {
842
- setIsLoading(true);
843
- try {
844
- const [oldHighlighted, newHighlighted] = await Promise.all([
845
- shiki.codeToHtml(oldCode, {
846
- lang: language,
847
- theme: themeMap[theme || "dark"]
848
- }),
849
- shiki.codeToHtml(newCode, {
850
- lang: language,
851
- theme: themeMap[theme || "dark"]
852
- })
853
- ]);
854
- const extractContent = (html) => {
855
- const tempDiv = document.createElement("div");
856
- tempDiv.innerHTML = html;
857
- const codeElement = tempDiv.querySelector("code");
858
- return codeElement?.innerHTML || html;
859
- };
860
- setHighlightedOldCode(extractContent(oldHighlighted));
861
- setHighlightedNewCode(extractContent(newHighlighted));
862
- const diffChanges = generateDiff(oldCode, newCode);
863
- setChanges(diffChanges);
864
- } catch (error) {
865
- console.error("Failed to highlight code:", error);
866
- setHighlightedOldCode(oldCode);
867
- setHighlightedNewCode(newCode);
868
- setChanges(generateDiff(oldCode, newCode));
869
- } finally {
870
- setIsLoading(false);
871
- }
872
- };
873
- highlightCode();
874
- }, [oldCode, newCode, language, theme]);
875
- const copyToClipboard = React6__namespace.useCallback(async () => {
876
- try {
877
- const diffText = view === "unified" ? changes.map((change) => {
878
- const prefix = change.type === "add" ? "+" : change.type === "remove" ? "-" : " ";
879
- return `${prefix}${change.content}`;
880
- }).join("\n") : `--- ${oldFilename || "old"}
881
- +++ ${newFilename || "new"}
882
- ${oldCode}
883
-
884
- ${newCode}`;
885
- await navigator.clipboard.writeText(diffText);
886
- setCopied(true);
887
- setTimeout(() => setCopied(false), 2e3);
888
- } catch (error) {
889
- console.error("Failed to copy diff:", error);
890
- }
891
- }, [changes, view, oldCode, newCode, oldFilename, newFilename]);
892
- const filteredChanges = React6__namespace.useMemo(() => {
893
- if (!collapseUnchanged) return changes;
894
- const result = [];
895
- let i = 0;
896
- while (i < changes.length) {
897
- const change = changes[i];
898
- if (change.type !== "unchanged") {
899
- result.push(change);
900
- i++;
901
- continue;
902
- }
903
- const unchangedStart = i;
904
- while (i < changes.length && changes[i].type === "unchanged") {
905
- i++;
906
- }
907
- const unchangedCount = i - unchangedStart;
908
- if (unchangedCount <= contextLines * 2) {
909
- for (let j = unchangedStart; j < i; j++) {
910
- result.push(changes[j]);
911
- }
912
- } else {
913
- for (let j = unchangedStart; j < unchangedStart + contextLines; j++) {
914
- result.push(changes[j]);
915
- }
916
- result.push({
917
- type: "unchanged",
918
- lineNumber: -1,
919
- content: `... ${unchangedCount - contextLines * 2} unchanged lines ...`
920
- });
921
- for (let j = i - contextLines; j < i; j++) {
922
- result.push(changes[j]);
923
- }
924
- }
925
- }
926
- return result;
927
- }, [changes, collapseUnchanged, contextLines]);
928
- const stats = React6__namespace.useMemo(() => {
929
- const additions = changes.filter((c) => c.type === "add").length;
930
- const deletions = changes.filter((c) => c.type === "remove").length;
931
- return { additions, deletions };
932
- }, [changes]);
933
- const renderUnifiedView = () => {
934
- const oldLines = highlightedOldCode.split("\n");
935
- const newLines = highlightedNewCode.split("\n");
936
- return /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { className: "font-mono", children: filteredChanges.map((change, index) => {
937
- if (change.lineNumber === -1) {
938
- return /* @__PURE__ */ jsxRuntime.jsx(
939
- ui.Box,
940
- {
941
- className: "flex items-center justify-center py-2 text-muted-foreground bg-muted/30",
942
- children: /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { tag: "span", className: "text-xs", children: change.content })
943
- },
944
- index
945
- );
946
- }
947
- let highlightedContent = change.content;
948
- if (change.type === "add" && change.newLineNumber) {
949
- highlightedContent = newLines[change.newLineNumber - 1] || change.content;
950
- } else if (change.type === "remove" && change.oldLineNumber) {
951
- highlightedContent = oldLines[change.oldLineNumber - 1] || change.content;
952
- } else if (change.type === "unchanged" && change.oldLineNumber) {
953
- highlightedContent = oldLines[change.oldLineNumber - 1] || change.content;
954
- }
955
- return /* @__PURE__ */ jsxRuntime.jsx(
956
- DiffLine,
957
- {
958
- change,
959
- showLineNumbers,
960
- isUnified: true,
961
- highlightedContent
962
- },
963
- index
964
- );
965
- }) });
966
- };
967
- const renderSplitView = () => {
968
- const oldLines = highlightedOldCode.split("\n");
969
- const newLines = highlightedNewCode.split("\n");
970
- return /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { className: "grid grid-cols-2 gap-0", children: [
971
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { className: "border-r", children: [
972
- /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { className: "border-b px-4 py-2 bg-[var(--lux-state-error)]/10", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { tag: "span", className: "text-sm font-medium text-[var(--lux-state-error)] dark:text-[var(--lux-state-error)]", children: oldFilename || filename || "Old" }) }),
973
- /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { className: "font-mono", children: oldLines.map((line, index) => /* @__PURE__ */ jsxRuntime.jsx(
974
- DiffLine,
975
- {
976
- change: {
977
- type: "remove",
978
- lineNumber: index + 1,
979
- content: line,
980
- oldLineNumber: index + 1
981
- },
982
- showLineNumbers,
983
- highlightedContent: line
984
- },
985
- `old-${index}`
986
- )) })
987
- ] }),
988
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
989
- /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { className: "border-b px-4 py-2 bg-[var(--lux-state-success)]/10", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { tag: "span", className: "text-sm font-medium text-[var(--lux-state-success)] dark:text-[var(--lux-state-success)]", children: newFilename || filename || "New" }) }),
990
- /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { className: "font-mono", children: newLines.map((line, index) => /* @__PURE__ */ jsxRuntime.jsx(
991
- DiffLine,
992
- {
993
- change: {
994
- type: "add",
995
- lineNumber: index + 1,
996
- content: line,
997
- newLineNumber: index + 1
998
- },
999
- showLineNumbers,
1000
- highlightedContent: line
1001
- },
1002
- `new-${index}`
1003
- )) })
1004
- ] })
1005
- ] });
1006
- };
1007
- return /* @__PURE__ */ jsxRuntime.jsxs(
1008
- ui.Box,
1009
- {
1010
- ref,
1011
- className: ui.cn(codeDiffVariants({ theme, size, className })),
1012
- ...props,
1013
- children: [
1014
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { className: "flex items-center justify-between border-b px-4 py-2", children: [
1015
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { className: "flex items-center gap-4", children: [
1016
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { className: "flex items-center gap-2", children: [
1017
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.GitCompare, { style: ui.css("h-4 w-4 text-muted-foreground") }),
1018
- filename && /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { tag: "span", className: "text-sm font-medium", children: filename }),
1019
- language && /* @__PURE__ */ jsxRuntime.jsx(Badge, { colorPalette: "gray", ...ui.sx("text-xs"), children: language })
1020
- ] }),
1021
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { className: "flex items-center gap-2 text-xs text-muted-foreground", children: [
1022
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { tag: "span", className: "flex items-center gap-1", children: [
1023
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { style: ui.css("h-3 w-3 text-[var(--lux-state-success)]") }),
1024
- stats.additions
1025
- ] }),
1026
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { tag: "span", className: "flex items-center gap-1", children: [
1027
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Minus, { style: ui.css("h-3 w-3 text-[var(--lux-state-error)]") }),
1028
- stats.deletions
1029
- ] })
1030
- ] })
1031
- ] }),
1032
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { className: "flex items-center gap-2", children: [
1033
- /* @__PURE__ */ jsxRuntime.jsxs(
1034
- ui.ToggleGroup,
1035
- {
1036
- type: "single",
1037
- value: view,
1038
- onValueChange: (value) => value && setView(value),
1039
- size: "sm",
1040
- children: [
1041
- /* @__PURE__ */ jsxRuntime.jsx(ui.ToggleGroupItem, { value: "unified", "aria-label": "Unified view", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Square, { style: ui.css("h-3 w-3") }) }),
1042
- /* @__PURE__ */ jsxRuntime.jsx(ui.ToggleGroupItem, { value: "split", "aria-label": "Split view", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SplitSquareHorizontal, { style: ui.css("h-3 w-3") }) })
1043
- ]
1044
- }
1045
- ),
1046
- showCopyButton && /* @__PURE__ */ jsxRuntime.jsxs(
1047
- Button,
1048
- {
1049
- variant: "ghost",
1050
- size: "sm",
1051
- onClick: copyToClipboard,
1052
- ...ui.sx("h-8 w-8 p-0"),
1053
- children: [
1054
- copied ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { style: ui.css("h-3.5 w-3.5 text-[var(--lux-state-success)]") }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Copy, { style: ui.css("h-3.5 w-3.5") }),
1055
- /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { tag: "span", className: "sr-only", children: copied ? "Copied" : "Copy diff" })
1056
- ]
1057
- }
1058
- )
1059
- ] })
1060
- ] }),
1061
- /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { className: "overflow-auto", style: { maxHeight }, children: isLoading ? /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { className: "p-4 space-y-2", children: Array.from({ length: 10 }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { className: "flex items-center gap-4", children: [
1062
- showLineNumbers && /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { ...ui.sx("h-4 w-8") }),
1063
- /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { ...ui.sx("h-4 flex-1") })
1064
- ] }, i)) }) : view === "unified" ? renderUnifiedView() : renderSplitView() })
1065
- ]
1066
- }
1067
- );
1068
- }
1069
- );
1070
- CodeDiff.displayName = "CodeDiff";
1071
- var codeSnippetVariants = ui.variants("relative group", {
1072
- variants: {
1073
- variant: {
1074
- default: "rounded-lg border bg-muted/50",
1075
- inline: "inline-block rounded-md bg-muted px-2 py-1",
1076
- minimal: "bg-transparent"
1077
- },
1078
- theme: {
1079
- dark: "bg-[var(--color-bg-primary)] border-[var(--color-border-divider)]",
1080
- light: "bg-[var(--color-bg-body)] border-[var(--color-border-divider)]",
1081
- github: "bg-white border-[var(--color-border-divider)]",
1082
- "github-dark": "bg-[var(--color-bg-primary)] border-[var(--color-border-divider)]",
1083
- terminal: "bg-black border-[var(--lux-state-success)]/30 text-[var(--lux-state-success)]",
1084
- retro: "bg-[var(--lux-state-notice)] border-[var(--lux-state-notice)] text-[var(--lux-state-notice)]"
1085
- },
1086
- size: {
1087
- xs: "text-xs",
1088
- sm: "text-sm",
1089
- default: "text-sm",
1090
- lg: "text-base"
1091
- }
1092
- },
1093
- defaultVariants: {
1094
- variant: "default",
1095
- theme: "dark",
1096
- size: "default"
1097
- }
1098
- });
1099
- var CodeSnippet = React6__namespace.forwardRef(
1100
- ({
1101
- className,
1102
- variant,
1103
- theme,
1104
- size,
1105
- code,
1106
- language = "text",
1107
- filename,
1108
- showLineNumbers = false,
1109
- highlightLines = [],
1110
- showCopyButton = true,
1111
- showLanguageBadge = true,
1112
- showHeader = true,
1113
- maxHeight,
1114
- expandable = false,
1115
- collapsedHeight = "200px",
1116
- wrapLines = false,
1117
- startLineNumber = 1,
1118
- ...props
1119
- }, ref) => {
1120
- const [highlightedCode, setHighlightedCode] = React6__namespace.useState("");
1121
- const [copied, setCopied] = React6__namespace.useState(false);
1122
- const [isLoading, setIsLoading] = React6__namespace.useState(true);
1123
- const [isExpanded, setIsExpanded] = React6__namespace.useState(!expandable);
1124
- const themeMap = {
1125
- dark: "github-dark",
1126
- light: "github-light",
1127
- github: "github-light",
1128
- "github-dark": "github-dark",
1129
- terminal: "github-dark",
1130
- retro: "github-light"
1131
- };
1132
- React6__namespace.useEffect(() => {
1133
- const highlightCode = async () => {
1134
- setIsLoading(true);
1135
- try {
1136
- const supportedLang = Object.keys(shiki.bundledLanguages).includes(language);
1137
- const highlighted = await shiki.codeToHtml(code, {
1138
- lang: supportedLang ? language : "text",
1139
- theme: themeMap[theme || "dark"]
1140
- });
1141
- const tempDiv = document.createElement("div");
1142
- tempDiv.innerHTML = highlighted;
1143
- const codeElement = tempDiv.querySelector("code");
1144
- setHighlightedCode(codeElement?.innerHTML || highlighted);
1145
- } catch (error) {
1146
- console.error("Failed to highlight code:", error);
1147
- const escaped = code.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
1148
- setHighlightedCode(escaped);
1149
- } finally {
1150
- setIsLoading(false);
1151
- }
1152
- };
1153
- highlightCode();
1154
- }, [code, language, theme]);
1155
- const copyToClipboard = React6__namespace.useCallback(async () => {
1156
- try {
1157
- await navigator.clipboard.writeText(code);
1158
- setCopied(true);
1159
- setTimeout(() => setCopied(false), 2e3);
1160
- } catch (error) {
1161
- console.error("Failed to copy code:", error);
1162
- }
1163
- }, [code]);
1164
- const lines = highlightedCode.split("\n").filter((line, index, array) => {
1165
- return line.trim() !== "" || index < array.length - 1;
1166
- });
1167
- const renderInline = () => /* @__PURE__ */ jsxRuntime.jsx(
1168
- ui.Box,
1169
- {
1170
- tag: "code",
1171
- className: ui.cn(
1172
- codeSnippetVariants({ variant, theme, size }),
1173
- "font-mono",
1174
- className
1175
- ),
1176
- dangerouslySetInnerHTML: { __html: highlightedCode }
1177
- }
1178
- );
1179
- const renderBlock = () => /* @__PURE__ */ jsxRuntime.jsxs(
1180
- ui.Box,
1181
- {
1182
- ref,
1183
- className: ui.cn(
1184
- codeSnippetVariants({ variant, theme, size }),
1185
- "overflow-hidden",
1186
- className
1187
- ),
1188
- ...props,
1189
- children: [
1190
- showHeader && (filename || language || showCopyButton || expandable) && /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { className: "flex items-center justify-between border-b px-4 py-2 bg-muted/30", children: [
1191
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { className: "flex items-center gap-2", children: [
1192
- filename && /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { className: "flex items-center gap-1.5", children: [
1193
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { style: ui.css("h-3.5 w-3.5 text-muted-foreground") }),
1194
- /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { tag: "span", className: "text-sm font-medium", children: filename })
1195
- ] }),
1196
- showLanguageBadge && language && /* @__PURE__ */ jsxRuntime.jsx(Badge, { colorPalette: "gray", ...ui.sx("text-xs"), children: language })
1197
- ] }),
1198
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { className: "flex items-center gap-1", children: [
1199
- expandable && /* @__PURE__ */ jsxRuntime.jsxs(
1200
- Button,
1201
- {
1202
- variant: "ghost",
1203
- size: "sm",
1204
- onClick: () => setIsExpanded(!isExpanded),
1205
- ...ui.sx("h-8 w-8 p-0"),
1206
- children: [
1207
- isExpanded ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Minimize2, { style: ui.css("h-3.5 w-3.5") }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Maximize2, { style: ui.css("h-3.5 w-3.5") }),
1208
- /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { tag: "span", className: "sr-only", children: isExpanded ? "Collapse" : "Expand" })
1209
- ]
1210
- }
1211
- ),
1212
- showCopyButton && /* @__PURE__ */ jsxRuntime.jsxs(
1213
- Button,
1214
- {
1215
- variant: "ghost",
1216
- size: "sm",
1217
- onClick: copyToClipboard,
1218
- ...ui.sx("h-8 w-8 p-0 opacity-0 group-hover:opacity-100 transition-opacity"),
1219
- children: [
1220
- copied ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { style: ui.css("h-3.5 w-3.5 text-[var(--lux-state-success)]") }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Copy, { style: ui.css("h-3.5 w-3.5") }),
1221
- /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { tag: "span", className: "sr-only", children: copied ? "Copied" : "Copy code" })
1222
- ]
1223
- }
1224
- )
1225
- ] })
1226
- ] }),
1227
- /* @__PURE__ */ jsxRuntime.jsx(
1228
- ui.Box,
1229
- {
1230
- className: ui.cn("overflow-auto", !wrapLines && "overflow-x-auto"),
1231
- style: {
1232
- maxHeight: isExpanded ? maxHeight : collapsedHeight
1233
- },
1234
- children: isLoading ? /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { className: "p-4 space-y-2", children: Array.from({ length: Math.min(lines.length || 5, 10) }).map(
1235
- (_, i) => /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { className: "flex items-center gap-4", children: [
1236
- showLineNumbers && /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { ...ui.sx("h-4 w-8") }),
1237
- /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { ...ui.sx("h-4 flex-1") })
1238
- ] }, i)
1239
- ) }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { className: "font-mono", children: lines.map((line, index) => {
1240
- const lineNumber = index + startLineNumber;
1241
- const isHighlighted = highlightLines.includes(lineNumber);
1242
- return /* @__PURE__ */ jsxRuntime.jsxs(
1243
- ui.Box,
1244
- {
1245
- className: ui.cn(
1246
- "group relative flex min-h-[1.5rem] items-center px-4 py-0.5",
1247
- isHighlighted && "bg-[var(--color-link-primary)]/10 border-l-2 border-l-blue-500",
1248
- !wrapLines && "whitespace-nowrap"
1249
- ),
1250
- children: [
1251
- showLineNumbers && /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { tag: "span", className: "mr-4 inline-block w-8 select-none text-right text-xs text-muted-foreground", children: lineNumber }),
1252
- /* @__PURE__ */ jsxRuntime.jsx(
1253
- ui.Box,
1254
- {
1255
- className: ui.cn(
1256
- "flex-1",
1257
- wrapLines ? "whitespace-pre-wrap break-words" : "overflow-x-auto"
1258
- ),
1259
- dangerouslySetInnerHTML: { __html: line }
1260
- }
1261
- )
1262
- ]
1263
- },
1264
- index
1265
- );
1266
- }) })
1267
- }
1268
- ),
1269
- expandable && !isExpanded && /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { className: "absolute bottom-0 left-0 right-0 h-8 bg-gradient-to-t from-background to-transparent pointer-events-none" }),
1270
- variant === "minimal" && showCopyButton && /* @__PURE__ */ jsxRuntime.jsx(
1271
- Button,
1272
- {
1273
- variant: "ghost",
1274
- size: "sm",
1275
- onClick: copyToClipboard,
1276
- ...ui.sx("absolute top-2 right-2 h-8 w-8 p-0 opacity-0 group-hover:opacity-100 transition-opacity"),
1277
- children: copied ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { style: ui.css("h-3.5 w-3.5 text-[var(--lux-state-success)]") }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Copy, { style: ui.css("h-3.5 w-3.5") })
1278
- }
1279
- )
1280
- ]
1281
- }
1282
- );
1283
- if (variant === "inline") {
1284
- return renderInline();
1285
- }
1286
- return renderBlock();
1287
- }
1288
- );
1289
- CodeSnippet.displayName = "CodeSnippet";
1290
- var InlineCode = React6__namespace.forwardRef(({ children, language, className, ...props }, ref) => {
1291
- return /* @__PURE__ */ jsxRuntime.jsx(
1292
- CodeSnippet,
1293
- {
1294
- ref,
1295
- code: children,
1296
- language,
1297
- variant: "inline",
1298
- showCopyButton: false,
1299
- showLanguageBadge: false,
1300
- showHeader: false,
1301
- className,
1302
- ...props
1303
- }
1304
- );
1305
- });
1306
- InlineCode.displayName = "InlineCode";
1307
33
  var codeCompareVariants = ui.variants(
1308
34
  "relative flex flex-col overflow-hidden rounded-lg border bg-background",
1309
35
  {
@@ -1324,7 +50,7 @@ var codeCompareVariants = ui.variants(
1324
50
  }
1325
51
  }
1326
52
  );
1327
- var CodeCompare = React6__namespace.forwardRef(
53
+ var CodeCompare = React__namespace.forwardRef(
1328
54
  ({
1329
55
  className,
1330
56
  layout,
@@ -1341,20 +67,20 @@ var CodeCompare = React6__namespace.forwardRef(
1341
67
  syncScroll = true,
1342
68
  ...props
1343
69
  }, ref) => {
1344
- const [view, setView] = React6__namespace.useState(defaultView);
1345
- const [selectedFiles, setSelectedFiles] = React6__namespace.useState(() => {
70
+ const [view, setView] = React__namespace.useState(defaultView);
71
+ const [selectedFiles, setSelectedFiles] = React__namespace.useState(() => {
1346
72
  if (files.length >= 2) {
1347
73
  return [files[0].id, files[1].id];
1348
74
  }
1349
75
  return files.length > 0 ? [files[0].id] : [];
1350
76
  });
1351
- const [mergeState, setMergeState] = React6__namespace.useState({
77
+ const [mergeState, setMergeState] = React__namespace.useState({
1352
78
  resolved: {},
1353
79
  conflicts: conflictMarkers
1354
80
  });
1355
- const [copied, setCopied] = React6__namespace.useState(false);
1356
- const scrollRefs = React6__namespace.useRef({});
1357
- const handleScroll = React6__namespace.useCallback(
81
+ const [copied, setCopied] = React__namespace.useState(false);
82
+ const scrollRefs = React__namespace.useRef({});
83
+ const handleScroll = React__namespace.useCallback(
1358
84
  (sourceId, scrollTop) => {
1359
85
  if (!syncScroll) return;
1360
86
  Object.entries(scrollRefs.current).forEach(([id, ref2]) => {
@@ -1365,7 +91,7 @@ var CodeCompare = React6__namespace.forwardRef(
1365
91
  },
1366
92
  [syncScroll]
1367
93
  );
1368
- const copyComparison = React6__namespace.useCallback(async () => {
94
+ const copyComparison = React__namespace.useCallback(async () => {
1369
95
  const comparison = selectedFiles.map((fileId) => {
1370
96
  const file = files.find((f) => f.id === fileId);
1371
97
  return file ? `=== ${file.filename} ===
@@ -1379,7 +105,7 @@ ${file.content}` : "";
1379
105
  console.error("Failed to copy comparison:", error);
1380
106
  }
1381
107
  }, [files, selectedFiles]);
1382
- const resolveConflict = React6__namespace.useCallback(
108
+ const resolveConflict = React__namespace.useCallback(
1383
109
  (conflictIndex, resolution) => {
1384
110
  setMergeState((prev) => ({
1385
111
  ...prev,
@@ -1392,7 +118,7 @@ ${file.content}` : "";
1392
118
  },
1393
119
  [onMergeConflict]
1394
120
  );
1395
- const getFileStats = React6__namespace.useCallback(
121
+ const getFileStats = React__namespace.useCallback(
1396
122
  (file1, file2) => {
1397
123
  const lines1 = file1.content.split("\n");
1398
124
  const lines2 = file2.content.split("\n");
@@ -1417,7 +143,7 @@ ${file.content}` : "";
1417
143
  );
1418
144
  const renderFileSelector = () => /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { className: "flex items-center gap-2 flex-wrap", children: files.map((file, index) => /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { className: "flex items-center gap-2", children: [
1419
145
  /* @__PURE__ */ jsxRuntime.jsxs(
1420
- Button,
146
+ button_cjs.Button,
1421
147
  {
1422
148
  variant: selectedFiles.includes(file.id) ? "default" : "outline",
1423
149
  size: "sm",
@@ -1442,7 +168,7 @@ ${file.content}` : "";
1442
168
  ...ui.sx("gap-2"),
1443
169
  children: [
1444
170
  file.label || file.filename,
1445
- file.version && /* @__PURE__ */ jsxRuntime.jsx(Badge, { colorPalette: "gray", ...ui.sx("text-xs"), children: file.version })
171
+ file.version && /* @__PURE__ */ jsxRuntime.jsx(badge_cjs.Badge, { colorPalette: "gray", ...ui.sx("text-xs"), children: file.version })
1446
172
  ]
1447
173
  }
1448
174
  ),
@@ -1473,7 +199,7 @@ ${file.content}` : "";
1473
199
  ] })
1474
200
  ] }) }),
1475
201
  /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { className: "flex-1 min-h-0", children: /* @__PURE__ */ jsxRuntime.jsx(
1476
- CodeDiff,
202
+ codeDiff_cjs.CodeDiff,
1477
203
  {
1478
204
  oldCode: file1.content,
1479
205
  newCode: file2.content,
@@ -1495,7 +221,7 @@ ${file.content}` : "";
1495
221
  return /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { className: "flex items-center justify-center h-32 text-muted-foreground", children: "Select two files to compare" });
1496
222
  }
1497
223
  return /* @__PURE__ */ jsxRuntime.jsx(
1498
- CodeDiff,
224
+ codeDiff_cjs.CodeDiff,
1499
225
  {
1500
226
  oldCode: file1.content,
1501
227
  newCode: file2.content,
@@ -1533,7 +259,7 @@ ${file.content}` : "";
1533
259
  handleScroll("base", target.scrollTop);
1534
260
  },
1535
261
  children: /* @__PURE__ */ jsxRuntime.jsx(
1536
- CodeSnippet,
262
+ codeSnippet_cjs.CodeSnippet,
1537
263
  {
1538
264
  code: base.content,
1539
265
  language: base.language,
@@ -1564,7 +290,7 @@ ${file.content}` : "";
1564
290
  handleScroll("current", target.scrollTop);
1565
291
  },
1566
292
  children: /* @__PURE__ */ jsxRuntime.jsx(
1567
- CodeSnippet,
293
+ codeSnippet_cjs.CodeSnippet,
1568
294
  {
1569
295
  code: current.content,
1570
296
  language: current.language,
@@ -1595,7 +321,7 @@ ${file.content}` : "";
1595
321
  handleScroll("incoming", target.scrollTop);
1596
322
  },
1597
323
  children: /* @__PURE__ */ jsxRuntime.jsx(
1598
- CodeSnippet,
324
+ codeSnippet_cjs.CodeSnippet,
1599
325
  {
1600
326
  code: incoming.content,
1601
327
  language: incoming.language,
@@ -1615,7 +341,7 @@ ${file.content}` : "";
1615
341
  return /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { className: "border-t bg-muted/30", children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { className: "px-4 py-2", children: [
1616
342
  /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { className: "flex items-center justify-between", children: [
1617
343
  /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { tag: "span", className: "text-sm font-medium", children: "Merge Conflicts" }),
1618
- /* @__PURE__ */ jsxRuntime.jsx(Badge, { colorPalette: "red", ...ui.sx("text-xs"), children: mergeState.conflicts.length })
344
+ /* @__PURE__ */ jsxRuntime.jsx(badge_cjs.Badge, { colorPalette: "red", ...ui.sx("text-xs"), children: mergeState.conflicts.length })
1619
345
  ] }),
1620
346
  /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { className: "mt-2 space-y-2", children: mergeState.conflicts.map((conflict, index) => /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { className: "flex items-center gap-2 text-xs", children: [
1621
347
  /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
@@ -1626,7 +352,7 @@ ${file.content}` : "";
1626
352
  ] }),
1627
353
  /* @__PURE__ */ jsxRuntime.jsxs(ui.Box, { className: "flex gap-1", children: [
1628
354
  /* @__PURE__ */ jsxRuntime.jsx(
1629
- Button,
355
+ button_cjs.Button,
1630
356
  {
1631
357
  variant: "outline",
1632
358
  size: "sm",
@@ -1636,7 +362,7 @@ ${file.content}` : "";
1636
362
  }
1637
363
  ),
1638
364
  /* @__PURE__ */ jsxRuntime.jsx(
1639
- Button,
365
+ button_cjs.Button,
1640
366
  {
1641
367
  variant: "outline",
1642
368
  size: "sm",
@@ -1666,7 +392,7 @@ ${file.content}` : "";
1666
392
  /* @__PURE__ */ jsxRuntime.jsx(ui.TabsTrigger, { value: "three-way", ...ui.sx("text-xs"), children: "Three-way" })
1667
393
  ] }) }),
1668
394
  showCopyButton && /* @__PURE__ */ jsxRuntime.jsx(
1669
- Button,
395
+ button_cjs.Button,
1670
396
  {
1671
397
  variant: "ghost",
1672
398
  size: "sm",
@@ -1676,7 +402,7 @@ ${file.content}` : "";
1676
402
  }
1677
403
  ),
1678
404
  /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
1679
- /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", ...ui.sx("h-8 w-8 p-0"), children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MoreHorizontal, { style: ui.css("h-3.5 w-3.5") }) }) }),
405
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(button_cjs.Button, { variant: "ghost", size: "sm", ...ui.sx("h-8 w-8 p-0"), children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MoreHorizontal, { style: ui.css("h-3.5 w-3.5") }) }) }),
1680
406
  /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenuContent, { align: "end", children: [
1681
407
  /* @__PURE__ */ jsxRuntime.jsxs(
1682
408
  ui.DropdownMenuItem,