@keboola/design 6.4.0 → 8.0.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 (49) hide show
  1. package/AGENTS.md +9 -10
  2. package/COMPONENT-API.md +162 -160
  3. package/README.md +3 -3
  4. package/dist/charts.cjs +22 -22
  5. package/dist/charts.cjs.map +1 -1
  6. package/dist/charts.d.cts +5 -5
  7. package/dist/charts.d.ts +5 -5
  8. package/dist/charts.js +22 -22
  9. package/dist/charts.js.map +1 -1
  10. package/dist/editors.cjs +594 -438
  11. package/dist/editors.cjs.map +1 -1
  12. package/dist/editors.d.cts +8 -4
  13. package/dist/editors.d.ts +8 -4
  14. package/dist/editors.js +595 -422
  15. package/dist/editors.js.map +1 -1
  16. package/dist/icons.cjs +23818 -45
  17. package/dist/icons.cjs.map +1 -1
  18. package/dist/icons.d.cts +12 -3
  19. package/dist/icons.d.ts +12 -3
  20. package/dist/icons.js +298 -40
  21. package/dist/icons.js.map +1 -1
  22. package/dist/index.cjs +11519 -11718
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +679 -1227
  25. package/dist/index.d.ts +679 -1227
  26. package/dist/index.js +10315 -10516
  27. package/dist/index.js.map +1 -1
  28. package/dist/markdown-editor.cjs +1015 -1134
  29. package/dist/markdown-editor.cjs.map +1 -1
  30. package/dist/markdown-editor.js +1016 -1134
  31. package/dist/markdown-editor.js.map +1 -1
  32. package/dist/mermaid.cjs +366 -452
  33. package/dist/mermaid.cjs.map +1 -1
  34. package/dist/mermaid.d.cts +5 -1
  35. package/dist/mermaid.d.ts +5 -1
  36. package/dist/mermaid.js +368 -435
  37. package/dist/mermaid.js.map +1 -1
  38. package/dist/rjsf.cjs +2540 -2419
  39. package/dist/rjsf.cjs.map +1 -1
  40. package/dist/rjsf.js +2541 -2419
  41. package/dist/rjsf.js.map +1 -1
  42. package/dist/styles.css +2 -5
  43. package/dist/testing.cjs +86 -82
  44. package/dist/testing.cjs.map +1 -1
  45. package/dist/testing.js +86 -82
  46. package/dist/testing.js.map +1 -1
  47. package/package.json +30 -22
  48. package/src/styles.css +125 -105
  49. package/src/theme.css +264 -0
package/dist/editors.cjs CHANGED
@@ -14,61 +14,28 @@ var classVarianceAuthority = require('class-variance-authority');
14
14
  var brandRegistry = require('@keboola/brand-registry');
15
15
  var jsxRuntime = require('react/jsx-runtime');
16
16
  var reactSlot = require('@radix-ui/react-slot');
17
- var lucide_react_star = require('lucide-react');
17
+ var lucideReact = require('lucide-react');
18
18
  var langJavascript = require('@codemirror/lang-javascript');
19
19
  var langPython = require('@codemirror/lang-python');
20
20
  var langSql = require('@codemirror/lang-sql');
21
21
  var language = require('@codemirror/language');
22
22
  var r = require('@codemirror/legacy-modes/mode/r');
23
23
  var shell = require('@codemirror/legacy-modes/mode/shell');
24
+ var toml = require('@codemirror/legacy-modes/mode/toml');
24
25
  var codemirrorThemeGithub = require('@uiw/codemirror-theme-github');
25
26
  var codemirrorLangSfsql = require('@keboola/codemirror-lang-sfsql');
26
27
  var colors = require('@keboola/tailwind-config/colors');
28
+ var simpleMode = require('@codemirror/legacy-modes/mode/simple-mode');
27
29
  var commands = require('@codemirror/commands');
28
30
  var codemirrorLangSql = require('@keboola/codemirror-lang-sql');
29
31
  var state = require('@codemirror/state');
30
32
 
31
33
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
32
34
 
33
- function _interopNamespace(e) {
34
- if (e && e.__esModule) return e;
35
- var n = Object.create(null);
36
- if (e) {
37
- Object.keys(e).forEach(function (k) {
38
- if (k !== 'default') {
39
- var d = Object.getOwnPropertyDescriptor(e, k);
40
- Object.defineProperty(n, k, d.get ? d : {
41
- enumerable: true,
42
- get: function () { return e[k]; }
43
- });
44
- }
45
- });
46
- }
47
- n.default = e;
48
- return Object.freeze(n);
49
- }
50
-
51
35
  var CodeMirror__default = /*#__PURE__*/_interopDefault(CodeMirror);
52
- var lucide_react_star__namespace = /*#__PURE__*/_interopNamespace(lucide_react_star);
53
36
  var colors__default = /*#__PURE__*/_interopDefault(colors);
54
37
 
55
- var __defProp = Object.defineProperty;
56
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
57
- var __getOwnPropNames = Object.getOwnPropertyNames;
58
- var __hasOwnProp = Object.prototype.hasOwnProperty;
59
- var __export = (target, all) => {
60
- for (var name in all)
61
- __defProp(target, name, { get: all[name], enumerable: true });
62
- };
63
- var __copyProps = (to, from, except, desc) => {
64
- if (from && typeof from === "object" || typeof from === "function") {
65
- for (let key of __getOwnPropNames(from))
66
- if (!__hasOwnProp.call(to, key) && key !== except)
67
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
68
- }
69
- return to;
70
- };
71
- var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget);
38
+ // src/components/CodeEditor/CodeEditor.tsx
72
39
 
73
40
  // src/constants/keyCodes.ts
74
41
  var keyCodes = {
@@ -76,8 +43,15 @@ var keyCodes = {
76
43
  ESCAPE: "Escape",
77
44
  SPACE: " "
78
45
  };
46
+ var useStableCallback = (callback) => {
47
+ const latestRef = react.useRef(callback);
48
+ react.useLayoutEffect(() => {
49
+ latestRef.current = callback;
50
+ }, [callback]);
51
+ return react.useCallback((...args) => latestRef.current(...args), []);
52
+ };
79
53
  var twMerge = tailwindMerge.extendTailwindMerge({
80
- prefix: "tw-"
54
+ prefix: "tw"
81
55
  });
82
56
  var cn = (...classes) => twMerge(clsx.clsx(...classes));
83
57
 
@@ -121,39 +95,39 @@ var useArgoDesign = () => react.use(ArgoDesignContext);
121
95
  var tooltipVariants = classVarianceAuthority.cva(
122
96
  [
123
97
  "tailwindcss-preflight",
124
- "tw-inline-block",
125
- "tw-break-anywhere",
126
- "tw-max-h-96",
127
- "tw-overflow-y-auto",
128
- "tw-z-[1060]",
98
+ "tw:inline-block",
99
+ "tw:break-anywhere",
100
+ "tw:max-h-96",
101
+ "tw:overflow-y-auto",
102
+ "tw:z-[1060]",
129
103
  // legacy (dark) chrome — default
130
- "tw-rounded",
131
- "tw-bg-neutral-800",
132
- "tw-text-white",
104
+ "tw:rounded",
105
+ "tw:bg-neutral-800",
106
+ "tw:text-white",
133
107
  // argo chrome overrides — semantic floating-panel tokens
134
- "data-[argo=true]:tw-rounded-2xl",
135
- "data-[argo=true]:tw-border",
136
- "data-[argo=true]:tw-border-solid",
137
- "data-[argo=true]:tw-border-border",
138
- "data-[argo=true]:tw-bg-popover",
139
- "data-[argo=true]:tw-text-popover-foreground",
140
- "data-[argo=true]:tw-shadow-md",
108
+ "tw:data-[argo=true]:rounded-2xl",
109
+ "tw:data-[argo=true]:border",
110
+ "tw:data-[argo=true]:border-solid",
111
+ "tw:data-[argo=true]:border-border",
112
+ "tw:data-[argo=true]:bg-popover",
113
+ "tw:data-[argo=true]:text-popover-foreground",
114
+ "tw:data-[argo=true]:shadow-md",
141
115
  // argo open animation
142
- "data-[argo=true]:data-[state=delayed-open]:tw-animate-in",
143
- "data-[argo=true]:data-[state=instant-open]:tw-animate-in",
144
- "data-[argo=true]:data-[state=delayed-open]:tw-fade-in-0",
145
- "data-[argo=true]:data-[state=instant-open]:tw-fade-in-0",
146
- "data-[argo=true]:data-[state=delayed-open]:tw-zoom-in-95",
147
- "data-[argo=true]:data-[state=instant-open]:tw-zoom-in-95",
116
+ "tw:data-[argo=true]:data-[state=delayed-open]:animate-in",
117
+ "tw:data-[argo=true]:data-[state=instant-open]:animate-in",
118
+ "tw:data-[argo=true]:data-[state=delayed-open]:fade-in-0",
119
+ "tw:data-[argo=true]:data-[state=instant-open]:fade-in-0",
120
+ "tw:data-[argo=true]:data-[state=delayed-open]:zoom-in-95",
121
+ "tw:data-[argo=true]:data-[state=instant-open]:zoom-in-95",
148
122
  // argo closed animation
149
- "data-[argo=true]:data-[state=closed]:tw-animate-out",
150
- "data-[argo=true]:data-[state=closed]:tw-fade-out-0",
151
- "data-[argo=true]:data-[state=closed]:tw-zoom-out-95",
123
+ "tw:data-[argo=true]:data-[state=closed]:animate-out",
124
+ "tw:data-[argo=true]:data-[state=closed]:fade-out-0",
125
+ "tw:data-[argo=true]:data-[state=closed]:zoom-out-95",
152
126
  // argo position animation
153
- "data-[argo=true]:data-[side=bottom]:tw-slide-in-from-top-2",
154
- "data-[argo=true]:data-[side=left]:tw-slide-in-from-right-2",
155
- "data-[argo=true]:data-[side=right]:tw-slide-in-from-left-2",
156
- "data-[argo=true]:data-[side=top]:tw-slide-in-from-bottom-2"
127
+ "tw:data-[argo=true]:data-[side=bottom]:slide-in-from-top-2",
128
+ "tw:data-[argo=true]:data-[side=left]:slide-in-from-right-2",
129
+ "tw:data-[argo=true]:data-[side=right]:slide-in-from-left-2",
130
+ "tw:data-[argo=true]:data-[side=top]:slide-in-from-bottom-2"
157
131
  ],
158
132
  {
159
133
  defaultVariants: {
@@ -162,22 +136,26 @@ var tooltipVariants = classVarianceAuthority.cva(
162
136
  variants: {
163
137
  variant: {
164
138
  action: [
165
- "tw-max-w-fit",
166
- "tw-px-3",
167
- "tw-py-2",
168
- "tw-text-center",
169
- "tw-text-xs",
170
- "tw-font-medium",
171
- "tw-uppercase",
172
- "tw-tracking-wider"
139
+ "tw:max-w-fit",
140
+ "tw:px-3",
141
+ "tw:py-2",
142
+ "tw:text-center",
143
+ "tw:text-xs",
144
+ "tw:font-medium",
145
+ // Legacy chrome uppercases the action tooltip; the Keboola V2 brand
146
+ // (`data-brand="keboola"`) renders it in standard case instead.
147
+ "tw:uppercase",
148
+ "tw:tracking-wider",
149
+ "tw:[[data-brand=keboola]_&]:normal-case",
150
+ "tw:[[data-brand=keboola]_&]:tracking-normal"
173
151
  ],
174
152
  explanatory: [
175
- "tw-max-w-80",
176
- "tw-px-4",
177
- "tw-py-3",
178
- "tw-text-left",
179
- "tw-text-sm",
180
- "tw-font-normal"
153
+ "tw:max-w-80",
154
+ "tw:px-4",
155
+ "tw:py-3",
156
+ "tw:text-left",
157
+ "tw:text-sm",
158
+ "tw:font-normal"
181
159
  ]
182
160
  }
183
161
  }
@@ -251,8 +229,8 @@ var TooltipTrigger = ({
251
229
  // (merged in via Slot) activates Tailwind's preflight inside the
252
230
  // span, which sets `svg { display: block }` — without an inline-flex
253
231
  // container that would stack any bare Lucide icon onto its own
254
- // line. `tw-inline-flex tw-items-center` keeps icon + text aligned.
255
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tw-inline-flex tw-items-center", children })
232
+ // line. `tw:inline-flex tw:items-center` keeps icon + text aligned.
233
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tw:inline-flex tw:items-center", children })
256
234
  )
257
235
  }
258
236
  );
@@ -267,6 +245,7 @@ var Tooltip = ({
267
245
  placement = "right",
268
246
  forceHide = false,
269
247
  forceShow = false,
248
+ delayDuration,
270
249
  // trigger props
271
250
  triggerAsChild = false
272
251
  }) => {
@@ -286,6 +265,7 @@ var Tooltip = ({
286
265
  {
287
266
  open: !!tooltip && (open || forceShow) && !forceHide,
288
267
  onOpenChange: setOpen,
268
+ delayDuration,
289
269
  disableHoverableContent: isActionVariant,
290
270
  children: [
291
271
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -317,14 +297,14 @@ Tooltip.Trigger = TooltipTrigger;
317
297
 
318
298
  // src/utils/escapeStringRegexp.ts
319
299
  var escapeStringRegexp = (string) => string.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d");
320
- var helpVariants = classVarianceAuthority.cva(["tw-m-0", "tw-text-xs"], {
300
+ var helpVariants = classVarianceAuthority.cva(["tw:m-0", "tw:text-xs"], {
321
301
  defaultVariants: {
322
302
  state: "default"
323
303
  },
324
304
  variants: {
325
305
  state: {
326
- default: ["tw-text-muted-foreground"],
327
- warning: ["tw-text-warning"]
306
+ default: ["tw:text-muted-foreground"],
307
+ warning: ["tw:text-warning"]
328
308
  }
329
309
  }
330
310
  });
@@ -332,145 +312,49 @@ var HelpBlock = ({ children, className, state = "default", ...rest }) => {
332
312
  if (!children) return null;
333
313
  return /* @__PURE__ */ jsxRuntime.jsx("p", { ...rest, className: helpVariants({ state, className }), children });
334
314
  };
335
-
336
- // src/icons/index.ts
337
- var icons_exports = {};
338
- __export(icons_exports, {
339
- Google: () => Google,
340
- Keboola: () => Keboola,
341
- Microsoft: () => Microsoft
342
- });
343
- __reExport(icons_exports, lucide_react_star__namespace);
344
- var Google = react.forwardRef(
345
- ({ size = 24, className, children, ...rest }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
346
- "svg",
347
- {
348
- ref,
349
- xmlns: "http://www.w3.org/2000/svg",
350
- width: size,
351
- height: size,
352
- viewBox: "12 10 20 20",
353
- fill: "none",
354
- className: cn("lucide", className),
355
- ...rest,
356
- children: [
357
- /* @__PURE__ */ jsxRuntime.jsx(
358
- "path",
359
- {
360
- d: "M31.6 20.2273C31.6 19.5182 31.5364 18.8364 31.4182 18.1818H22V22.05H27.3818C27.15 23.3 26.4455 24.3591 25.3864 25.0682V27.5773H28.6182C30.5091 25.8364 31.6 23.2727 31.6 20.2273Z",
361
- fill: "#4285F4"
362
- }
363
- ),
364
- /* @__PURE__ */ jsxRuntime.jsx(
365
- "path",
366
- {
367
- d: "M22 30C24.7 30 26.9636 29.1045 28.6181 27.5773L25.3863 25.0682C24.4909 25.6682 23.3454 26.0227 22 26.0227C19.3954 26.0227 17.1909 24.2636 16.4045 21.9H13.0636V24.4909C14.7091 27.7591 18.0909 30 22 30Z",
368
- fill: "#34A853"
369
- }
370
- ),
371
- /* @__PURE__ */ jsxRuntime.jsx(
372
- "path",
373
- {
374
- d: "M16.4045 21.9C16.2045 21.3 16.0909 20.6591 16.0909 20C16.0909 19.3409 16.2045 18.7 16.4045 18.1V15.5091H13.0636C12.3864 16.8591 12 18.3864 12 20C12 21.6136 12.3864 23.1409 13.0636 24.4909L16.4045 21.9Z",
375
- fill: "#FBBC04"
376
- }
377
- ),
378
- /* @__PURE__ */ jsxRuntime.jsx(
379
- "path",
380
- {
381
- d: "M22 13.9773C23.4681 13.9773 24.7863 14.4818 25.8227 15.4727L28.6909 12.6045C26.9591 10.9909 24.6954 10 22 10C18.0909 10 14.7091 12.2409 13.0636 15.5091L16.4045 18.1C17.1909 15.7364 19.3954 13.9773 22 13.9773Z",
382
- fill: "#EA4335"
383
- }
384
- ),
385
- children
386
- ]
387
- }
388
- )
389
- );
390
- Google.displayName = "Google";
391
- var Keboola = react.forwardRef(
392
- ({ size = 24, color = "currentColor", className, children, ...rest }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
393
- "svg",
394
- {
395
- ref,
396
- xmlns: "http://www.w3.org/2000/svg",
397
- width: size,
398
- height: size,
399
- viewBox: "0 0 300 512",
400
- fill: color,
401
- className: cn("lucide", className),
402
- ...rest,
403
- children: [
404
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M152 320C79.7 320 24.5 233.9 24.5 124.7C24.5 15.6 70.5 0 152 0s123.6 15.6 123.6 124.7C275.5 233.9 217.7 320 152 320zm-8.7-50.5c0-11.2-9.5-20.3-21.2-20.3s-21.2 9.1-21.2 20.3c0 11.2 9.5 20.3 21.2 20.3s21.2-9.1 21.2-20.3zm55.7 0c0-11.2-9.5-20.3-21.2-20.3s-21.2 9.1-21.2 20.3c0 11.2 9.5 20.3 21.2 20.3s21.2-9.1 21.2-20.3zm68.9 115.1c10.2 9.3 20.2 20.5 29 35c5.9 9.7 2.6 22.1-7.5 27.8c-3.4 1.9-7.1 2.8-10.7 2.8c-7.2 0-14.3-3.6-18.3-10c-6.8-11.1-13.8-18.9-21.7-26.1c-7.3-6.7-15.6-12.7-24.9-19.5c-.7-.5-1.4-1-2.1-1.5c-5-3.6-10-6.8-14.9-9.4c.6 1 1.2 2.1 1.8 3.2c14.4 26.4 29.2 63.1 29.2 104.9c0 11.2-9.5 20.3-21.2 20.3c-11.7 0-21.2-9.1-21.2-20.3c.1-31.8-11.6-62.3-23.8-84.9c-4-7.4-8-13.9-11.6-19.3c-3.4 5.2-7.2 11.3-11 18.3c-12.5 22.7-24.5 53.8-24.4 86c0 11.2-9.5 20.3-21.2 20.3s-21.2-9.1-21.2-20.3c.1-41.8 14.9-78.4 29.2-104.9c.6-1.1 1.2-2.1 1.8-3.2c-5 2.7-9.9 5.8-14.9 9.4c-.6 .5-1.3 .9-1.9 1.4c-9.5 6.9-17.8 12.9-25.1 19.7c-7.9 7.2-14.9 15.1-21.7 26.1c-5.9 9.7-18.9 12.9-29 7.2C.5 441.8-2.9 429.3 3.1 419.7c8.9-14.4 18.8-25.7 29-35c9.2-8.4 18.5-15.1 27.6-21.7c1-.7 2-1.4 3-2.2c4.7-3.5 9.6-6.7 14.6-9.6c-5-2.9-9.8-6.1-14.6-9.6C39.8 325 19.9 302.5 3.1 275.1c-5.9-9.7-2.6-22.1 7.5-27.8c10.1-5.7 23.1-2.5 29 7.2c14.6 23.7 31.1 42 48.7 54.9c18.9 13.7 37.4 20.5 56.5 21.5c1.7-.1 3.5-.1 5.2-.1c1.8 0 3.5 .1 5.2 .1c0 0 0 0 0 0c19.1-1.1 37.6-7.9 56.5-21.5c17.6-12.8 34.2-31.2 48.7-54.9c6-9.7 18.9-12.9 29-7.2c10.1 5.7 13.4 18.1 7.5 27.8c-16.8 27.4-36.7 49.9-59.6 66.6c-4.7 3.5-9.6 6.7-14.5 9.6c4.9 2.9 9.8 6.1 14.5 9.6c.9 .7 1.8 1.3 2.7 2c9.2 6.7 18.5 13.5 27.9 22z" }),
405
- children
406
- ]
407
- }
408
- )
409
- );
410
- Keboola.displayName = "Keboola";
411
- var Microsoft = react.forwardRef(
412
- ({ size = 24, className, children, ...rest }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
413
- "svg",
414
- {
415
- ref,
416
- xmlns: "http://www.w3.org/2000/svg",
417
- width: size,
418
- height: size,
419
- viewBox: "0 0 21 21",
420
- fill: "none",
421
- className: cn("lucide", className),
422
- ...rest,
423
- children: [
424
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "0", y: "0", width: "10", height: "10", fill: "#F25022" }),
425
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "11", y: "0", width: "10", height: "10", fill: "#7FBA00" }),
426
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "0", y: "11", width: "10", height: "10", fill: "#00A4EF" }),
427
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "11", y: "11", width: "10", height: "10", fill: "#FFB900" }),
428
- children
429
- ]
430
- }
431
- )
432
- );
433
- Microsoft.displayName = "Microsoft";
434
315
  var variants = classVarianceAuthority.cva(
435
316
  [
436
317
  "tailwindcss-preflight",
437
- "tw-group/button",
438
- "tw-border-box",
318
+ "tw:group/button",
319
+ "tw:border-box",
439
320
  // layout
440
- "tw-relative",
441
- "tw-flex",
442
- "tw-items-center",
443
- "tw-justify-center",
444
- "tw-gap-2",
321
+ "tw:relative",
322
+ "tw:flex",
323
+ "tw:items-center",
324
+ "tw:justify-center",
325
+ "tw:gap-2",
445
326
  // text — chrome weight/tracking are brand-overridable tokens
446
- // (`--font-weight-medium` / `--letter-spacing-chrome`); casing stays `tw-uppercase`.
447
- "tw-text-xs",
448
- "tw-leading-5",
449
- "tw-font-medium",
450
- "tw-tracking-chrome",
451
- "tw-uppercase",
327
+ // (`--font-weight-medium` / `--letter-spacing-chrome`). Casing: standard case is
328
+ // the default; only legacy brands (`keboola-legacy-*`) uppercase the chrome, so
329
+ // modern brands (incl. Keboola V2) read naturally. Mirrors the V2 standard-case
330
+ // treatment shipped for Tooltip/Badge (PR 7629).
331
+ "tw:text-xs",
332
+ "tw:leading-5",
333
+ "tw:font-medium",
334
+ "tw:[[data-brand^=keboola-legacy]_&]:tracking-chrome",
335
+ "tw:[[data-brand^=keboola-legacy]_&]:uppercase",
452
336
  // border — legacy (non-argo) chrome uses a fixed radius, not the brand token.
453
- "tw-rounded",
454
- "tw-border",
455
- "tw-border-transparent",
337
+ "tw:rounded",
338
+ "tw:border",
339
+ "tw:border-transparent",
456
340
  // styling
457
- "tw-shadow-none",
458
- "[a]:tw-cursor-pointer",
341
+ "tw:shadow-none",
342
+ "tw:[a]:cursor-pointer",
459
343
  // explicitly set for anchor
460
- "focus-visible:tw-outline",
461
- "focus-visible:tw-outline-1",
462
- "focus-visible:-tw-outline-offset-1",
463
- "focus-visible:tw-outline-ring",
464
- "focus-visible:tw-ring-4",
465
- "focus-visible:tw-ring-ring/30",
344
+ "tw:focus-visible:outline",
345
+ "tw:focus-visible:outline-1",
346
+ "tw:focus-visible:-outline-offset-1",
347
+ "tw:focus-visible:outline-ring",
348
+ "tw:focus-visible:ring-4",
349
+ "tw:focus-visible:ring-ring/30",
466
350
  // disabled
467
- "disabled:tw-opacity-40",
468
- "disabled:tw-cursor-not-allowed",
351
+ "tw:disabled:opacity-40",
352
+ "tw:disabled:cursor-not-allowed",
469
353
  // anchor support
470
- "!tw-no-underline",
471
- "aria-disabled:tw-opacity-40",
472
- "aria-disabled:tw-cursor-not-allowed",
473
- "[&_svg]:tw-shrink-0"
354
+ "tw:!no-underline",
355
+ "tw:aria-disabled:opacity-40",
356
+ "tw:aria-disabled:cursor-not-allowed",
357
+ "tw:[&_svg]:shrink-0"
474
358
  ],
475
359
  {
476
360
  defaultVariants: {
@@ -480,113 +364,113 @@ var variants = classVarianceAuthority.cva(
480
364
  },
481
365
  variants: {
482
366
  block: {
483
- true: ["tw-w-full"]
367
+ true: ["tw:w-full"]
484
368
  },
485
369
  variant: {
486
370
  primary: [
487
- "tw-text-white",
488
- "tw-bg-primary-500",
489
- "focus:tw-text-white",
490
- "hover:tw-text-white",
491
- "hover:not-disabled:tw-bg-primary-600",
492
- "active:not-disabled:tw-bg-primary-800",
371
+ "tw:text-white",
372
+ "tw:bg-primary-500",
373
+ "tw:focus:text-white",
374
+ "tw:hover:text-white",
375
+ "tw:hover:not-disabled:bg-primary-600",
376
+ "tw:active:not-disabled:bg-primary-800",
493
377
  // anchor disabled override
494
- "aria-disabled:!tw-bg-primary-500"
378
+ "tw:aria-disabled:!bg-primary-500"
495
379
  ],
496
380
  secondary: [
497
- "tw-text-white",
498
- "tw-bg-secondary-500",
499
- "focus:tw-text-white",
500
- "hover:tw-text-white",
501
- "hover:not-disabled:tw-bg-secondary-700",
502
- "active:not-disabled:tw-bg-secondary-800",
381
+ "tw:text-white",
382
+ "tw:bg-secondary-500",
383
+ "tw:focus:text-white",
384
+ "tw:hover:text-white",
385
+ "tw:hover:not-disabled:bg-secondary-700",
386
+ "tw:active:not-disabled:bg-secondary-800",
503
387
  // anchor disabled override
504
- "aria-disabled:!tw-bg-secondary-500"
388
+ "tw:aria-disabled:!bg-secondary-500"
505
389
  ],
506
390
  danger: [
507
- "tw-text-white",
508
- "tw-bg-error-500",
509
- "focus:tw-text-white",
510
- "hover:tw-text-white",
511
- "hover:not-disabled:tw-bg-error-600",
512
- "active:not-disabled:tw-bg-error-700",
391
+ "tw:text-white",
392
+ "tw:bg-error-500",
393
+ "tw:focus:text-white",
394
+ "tw:hover:text-white",
395
+ "tw:hover:not-disabled:bg-error-600",
396
+ "tw:active:not-disabled:bg-error-700",
513
397
  // anchor disabled override
514
- "aria-disabled:!tw-bg-error-500"
398
+ "tw:aria-disabled:!bg-error-500"
515
399
  ],
516
400
  invisible: [
517
- "tw-text-neutral-800",
518
- "tw-bg-transparent",
519
- "focus:tw-text-neutral-800",
520
- "hover:not-disabled:tw-bg-neutral-100",
521
- "hover:tw-text-neutral-800",
522
- "active:not-disabled:tw-bg-neutral-150",
401
+ "tw:text-neutral-800",
402
+ "tw:bg-transparent",
403
+ "tw:focus:text-neutral-800",
404
+ "tw:hover:not-disabled:bg-neutral-100",
405
+ "tw:hover:text-neutral-800",
406
+ "tw:active:not-disabled:bg-neutral-150",
523
407
  // contrasting icon on hover/active
524
- "[&_svg]:tw-text-neutral-400",
525
- "[&_svg]:hover:not-disabled:tw-text-secondary-600",
526
- "[&_svg]:active:not-disabled:tw-text-secondary-600",
408
+ "tw:[&_svg]:text-neutral-400",
409
+ "tw:hover:not-disabled:[&_svg]:text-secondary-600",
410
+ "tw:active:not-disabled:[&_svg]:text-secondary-600",
527
411
  // anchor disabled override
528
- "aria-disabled:!tw-bg-transparent"
412
+ "tw:aria-disabled:!bg-transparent"
529
413
  ],
530
414
  outline: [
531
- "tw-text-neutral-800",
532
- "tw-bg-white",
415
+ "tw:text-neutral-800",
416
+ "tw:bg-white",
533
417
  // border
534
- "!tw-border-neutral-200",
535
- "hover:tw-text-neutral-800",
536
- "focus:tw-text-neutral-800",
537
- "hover:not-disabled:!tw-border-neutral-300",
538
- "hover:not-disabled:tw-bg-neutral-100",
539
- "active:not-disabled:tw-bg-neutral-200",
418
+ "tw:!border-neutral-200",
419
+ "tw:hover:text-neutral-800",
420
+ "tw:focus:text-neutral-800",
421
+ "tw:hover:not-disabled:!border-neutral-300",
422
+ "tw:hover:not-disabled:bg-neutral-100",
423
+ "tw:active:not-disabled:bg-neutral-200",
540
424
  // contrasting icon hover, same as invisible
541
- "[&_svg]:tw-text-neutral-400",
542
- "[&_svg]:not-disabled:hover:tw-text-secondary-600",
543
- "[&_svg]:active:not-disabled:tw-text-secondary-600",
425
+ "tw:[&_svg]:text-neutral-400",
426
+ "tw:not-disabled:hover:[&_svg]:text-secondary-600",
427
+ "tw:active:not-disabled:[&_svg]:text-secondary-600",
544
428
  // anchor disabled override
545
- "aria-disabled:!tw-bg-white",
546
- "aria-disabled:!tw-border-neutral-200"
429
+ "tw:aria-disabled:!bg-white",
430
+ "tw:aria-disabled:!border-neutral-200"
547
431
  ],
548
432
  inline: [
549
- "tw-text-neutral-800",
550
- "tw-bg-transparent",
551
- "tw-rounded-full",
552
- "[&_svg]:tw-text-neutral-400",
553
- "[&_svg]:not-disabled:hover:tw-text-secondary-600",
554
- "[&_svg]:not-disabled:focus:tw-text-secondary-600"
433
+ "tw:text-neutral-800",
434
+ "tw:bg-transparent",
435
+ "tw:rounded-full",
436
+ "tw:[&_svg]:text-neutral-400",
437
+ "tw:not-disabled:hover:[&_svg]:text-secondary-600",
438
+ "tw:not-disabled:focus:[&_svg]:text-secondary-600"
555
439
  ]
556
440
  },
557
441
  size: {
558
442
  medium: [
559
- "tw-max-h-10",
560
- "tw-min-h-10",
561
- "tw-px-4",
562
- "tw-py-2.5",
563
- '[&_svg:not([class*="tw-size-"])]:tw-size-4'
443
+ "tw:max-h-10",
444
+ "tw:min-h-10",
445
+ "tw:px-4",
446
+ "tw:py-2.5",
447
+ 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
564
448
  ],
565
449
  small: [
566
- "tw-max-h-8",
567
- "tw-min-h-8",
568
- "tw-px-4",
569
- "tw-py-1.5",
570
- '[&_svg:not([class*="tw-size-"])]:tw-size-4'
450
+ "tw:max-h-8",
451
+ "tw:min-h-8",
452
+ "tw:px-4",
453
+ "tw:py-1.5",
454
+ 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
571
455
  ],
572
456
  large: [
573
- "tw-max-h-12",
574
- "tw-min-h-12",
575
- "tw-px-4",
576
- "tw-py-3.5",
577
- '[&_svg:not([class*="tw-size-"])]:tw-size-4'
457
+ "tw:max-h-12",
458
+ "tw:min-h-12",
459
+ "tw:px-4",
460
+ "tw:py-3.5",
461
+ 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
578
462
  ],
579
- "icon-lg": ["tw-size-12", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-6'],
580
- icon: ["tw-size-10", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-4'],
581
- "icon-sm": ["tw-size-8", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-4'],
582
- "icon-xs": ["tw-size-6", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-4'],
463
+ "icon-lg": ["tw:size-12", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-6'],
464
+ icon: ["tw:size-10", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
465
+ "icon-sm": ["tw:size-8", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
466
+ "icon-xs": ["tw:size-6", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
583
467
  "icon-2xs": [
584
- "!tw-inline-flex",
585
- "tw-size-5",
586
- "tw-max-h-5",
587
- '[&_svg:not([class*="tw-size-"])]:tw-size-3'
468
+ "tw:!inline-flex",
469
+ "tw:size-5",
470
+ "tw:max-h-5",
471
+ 'tw:[&_svg:not([class*="tw:size-"])]:size-3'
588
472
  ],
589
- "icon-3xs": ["tw-h-fit", "tw-w-fit", '[&_svg:not([class*="tw-size-"])]:tw-size-4']
473
+ "icon-3xs": ["tw:h-fit", "tw:w-fit", 'tw:[&_svg:not([class*="tw:size-"])]:size-4']
590
474
  }
591
475
  }
592
476
  }
@@ -595,37 +479,37 @@ var argoVariants = classVarianceAuthority.cva(
595
479
  [
596
480
  "tailwindcss-preflight",
597
481
  // layout
598
- "tw-relative",
599
- "tw-inline-flex",
600
- "tw-items-center",
601
- "tw-justify-center",
602
- "tw-whitespace-nowrap",
603
- "tw-gap-2",
482
+ "tw:relative",
483
+ "tw:inline-flex",
484
+ "tw:items-center",
485
+ "tw:justify-center",
486
+ "tw:whitespace-nowrap",
487
+ "tw:gap-2",
604
488
  // border
605
- "tw-border",
606
- "tw-border-transparent",
607
- "tw-rounded-[var(--radius-lg,0.25rem)]",
489
+ "tw:border",
490
+ "tw:border-transparent",
491
+ "tw:rounded-[var(--radius-lg,0.25rem)]",
608
492
  // text
609
- "tw-font-medium",
610
- "tw-select-none",
493
+ "tw:font-medium",
494
+ "tw:select-none",
611
495
  // focus visible
612
- "!tw-outline-none",
613
- "focus-visible:tw-ring-2",
496
+ "tw:!outline-hidden",
497
+ "tw:focus-visible:ring-2",
614
498
  // disabled
615
- "disabled:tw-cursor-not-allowed",
616
- "disabled:tw-opacity-50",
617
- "active:tw-opacity-60",
618
- "tw-transition-all",
619
- "tw-bg-clip-padding",
499
+ "tw:disabled:cursor-not-allowed",
500
+ "tw:disabled:opacity-50",
501
+ "tw:active:opacity-60",
502
+ "tw:transition-all",
503
+ "tw:bg-clip-padding",
620
504
  // anchor support
621
- "!tw-no-underline",
622
- "aria-disabled:tw-cursor-not-allowed",
623
- "aria-disabled:tw-opacity-50",
505
+ "tw:!no-underline",
506
+ "tw:aria-disabled:cursor-not-allowed",
507
+ "tw:aria-disabled:opacity-50",
624
508
  // icon
625
- "tw-shrink-0",
626
- "[&_svg]:tw-pointer-events-none",
627
- "[&_svg]:tw-shrink-0",
628
- "[&_svg:not([class*='tw-size-'])]:tw-size-4"
509
+ "tw:shrink-0",
510
+ "tw:[&_svg]:pointer-events-none",
511
+ "tw:[&_svg]:shrink-0",
512
+ "tw:[&_svg:not([class*='tw:size-'])]:size-4"
629
513
  ],
630
514
  {
631
515
  defaultVariants: {
@@ -634,77 +518,77 @@ var argoVariants = classVarianceAuthority.cva(
634
518
  },
635
519
  variants: {
636
520
  block: {
637
- true: ["tw-w-full"]
521
+ true: ["tw:w-full"]
638
522
  },
639
523
  variant: {
640
524
  primary: [
641
- "tw-bg-primary",
642
- "tw-text-primary-foreground",
643
- "[a]:hover:tw-bg-primary/80",
644
- "hover:not-disabled:tw-bg-primary/90",
645
- "hover:tw-text-primary-foreground",
646
- "focus:tw-text-primary-foreground",
647
- "focus-visible:tw-border-primary",
648
- "focus-visible:tw-ring-ring/50"
525
+ "tw:bg-primary",
526
+ "tw:text-primary-foreground",
527
+ "tw:[a]:hover:bg-primary/80",
528
+ "tw:hover:not-disabled:bg-primary/90",
529
+ "tw:hover:text-primary-foreground",
530
+ "tw:focus:text-primary-foreground",
531
+ "tw:focus-visible:border-primary",
532
+ "tw:focus-visible:ring-ring/50"
649
533
  ],
650
534
  secondary: [
651
- "tw-bg-primary/10",
652
- "tw-text-primary",
653
- "hover:not-disabled:tw-bg-primary/20",
654
- "focus-visible:tw-border-primary",
655
- "focus-visible:tw-ring-ring/50"
535
+ "tw:bg-primary/10",
536
+ "tw:text-primary",
537
+ "tw:hover:not-disabled:bg-primary/20",
538
+ "tw:focus-visible:border-primary",
539
+ "tw:focus-visible:ring-ring/50"
656
540
  ],
657
541
  // should be called "destructive" by Figma
658
542
  danger: [
659
- "tw-bg-destructive",
660
- "tw-text-destructive-foreground",
661
- "hover:tw-text-destructive-foreground",
662
- "focus:tw-text-destructive-foreground",
663
- "focus-visible:tw-border-destructive",
664
- "focus-visible:tw-ring-destructive/20"
543
+ "tw:bg-destructive",
544
+ "tw:text-destructive-foreground",
545
+ "tw:hover:text-destructive-foreground",
546
+ "tw:focus:text-destructive-foreground",
547
+ "tw:focus-visible:border-destructive",
548
+ "tw:focus-visible:ring-destructive/20"
665
549
  ],
666
550
  outline: [
667
- "!tw-border-input",
668
- "tw-bg-background",
551
+ "tw:!border-input",
552
+ "tw:bg-background",
669
553
  // Semantic base text color so the label/icon flips in dark mode
670
554
  // (matches `invisible`); previously unset → inherited a fixed dark color.
671
- "tw-text-foreground",
555
+ "tw:text-foreground",
672
556
  // Hover follows the brand primary (translucent tint), matching the
673
557
  // `secondary` variant — not the fixed `accent` blue.
674
- "hover:not-disabled:tw-bg-primary/10",
675
- "hover:not-disabled:tw-text-primary",
676
- "hover:active:tw-bg-background",
677
- "focus-visible:!tw-border-primary",
678
- "focus-visible:tw-ring-ring/50"
558
+ "tw:hover:not-disabled:bg-primary/10",
559
+ "tw:hover:not-disabled:text-primary",
560
+ "tw:hover:active:bg-background",
561
+ "tw:focus-visible:!border-primary",
562
+ "tw:focus-visible:ring-ring/50"
679
563
  ],
680
564
  // should be called "ghost" by Figma
681
565
  invisible: [
682
- "tw-bg-transparent",
683
- "tw-text-foreground",
684
- "hover:not-disabled:tw-bg-primary/10",
685
- "hover:not-disabled:tw-text-primary",
686
- "hover:not-disabled:tw-border-primary/10",
687
- "focus-visible:tw-ring-ring/50"
566
+ "tw:bg-transparent",
567
+ "tw:text-foreground",
568
+ "tw:hover:not-disabled:bg-primary/10",
569
+ "tw:hover:not-disabled:text-primary",
570
+ "tw:hover:not-disabled:border-primary/10",
571
+ "tw:focus-visible:ring-ring/50"
688
572
  ],
689
573
  // should be called "link" by Figma
690
574
  inline: [
691
- "tw-bg-transparent",
692
- "tw-text-primary",
693
- "hover:tw-underline",
694
- "hover:active:tw-bg-transparent",
695
- "focus-visible:tw-ring-ring/50"
575
+ "tw:bg-transparent",
576
+ "tw:text-primary",
577
+ "tw:hover:underline",
578
+ "tw:hover:active:bg-transparent",
579
+ "tw:focus-visible:ring-ring/50"
696
580
  ]
697
581
  },
698
582
  size: {
699
583
  // should be called "default" by Figma
700
- medium: ["tw-max-h-9", "tw-py-2", "tw-px-4", "tw-text-sm"],
584
+ medium: ["tw:max-h-9", "tw:py-2", "tw:px-4", "tw:text-sm"],
701
585
  // should be called "small" by Figma
702
- small: ["tw-max-h-8", "tw-py-2", "tw-px-3", "tw-text-xs"],
586
+ small: ["tw:max-h-8", "tw:py-2", "tw:px-3", "tw:text-xs"],
703
587
  // should be called "large" by Figma
704
- large: ["tw-max-h-10", "tw-py-2.5", "tw-px-6", "tw-text-sm"],
705
- "icon-lg": ["tw-size-10"],
706
- icon: ["tw-size-9"],
707
- "icon-sm": ["tw-size-8"],
588
+ large: ["tw:max-h-10", "tw:py-2.5", "tw:px-6", "tw:text-sm"],
589
+ "icon-lg": ["tw:size-10"],
590
+ icon: ["tw:size-9"],
591
+ "icon-sm": ["tw:size-8"],
708
592
  // unsupported in ARGO, remove when old design is gone
709
593
  "icon-xs": [],
710
594
  "icon-2xs": [],
@@ -752,13 +636,13 @@ var Button = ({
752
636
  onClick: handleClick,
753
637
  className: cn(classNames),
754
638
  children: [
755
- isLoading && /* @__PURE__ */ jsxRuntime.jsx(icons_exports.Loader2, { className: "tw-size-4 tw-shrink-0 tw-animate-spin" }),
639
+ isLoading && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "tw:size-4 tw:shrink-0 tw:animate-spin" }),
756
640
  /* @__PURE__ */ jsxRuntime.jsx(reactSlot.Slottable, { children: isLoading && isIconOnly ? null : children })
757
641
  ]
758
642
  }
759
643
  );
760
644
  };
761
- var Clipboard = ({
645
+ var Clipboard2 = ({
762
646
  ref,
763
647
  text: textProp,
764
648
  children,
@@ -783,6 +667,7 @@ var Clipboard = ({
783
667
  }
784
668
  };
785
669
  const handleOnClick = (event) => {
670
+ setIsTooltipOpen(true);
786
671
  if (text && state === "ready") void copy(text);
787
672
  onClick?.(event);
788
673
  };
@@ -797,6 +682,7 @@ var Clipboard = ({
797
682
  return tooltip;
798
683
  })();
799
684
  const tooltipVariant = state === "ready" && !!text ? tooltipVariantProp : "action";
685
+ const hasTooltipContent = tooltipContent !== null && tooltipContent !== void 0;
800
686
  return /* @__PURE__ */ jsxRuntime.jsxs(Tooltip.Root, { open: isTooltipOpen, onOpenChange: handleOnOpenChange, children: [
801
687
  /* @__PURE__ */ jsxRuntime.jsx(
802
688
  Tooltip.Trigger,
@@ -805,12 +691,12 @@ var Clipboard = ({
805
691
  asChild,
806
692
  keepOpenOnClick: true,
807
693
  onClick: handleOnClick,
808
- className: cn("tw-cursor-pointer", className),
694
+ className: cn("tw:cursor-pointer", className),
809
695
  ref,
810
696
  children: children ?? text
811
697
  }
812
698
  ),
813
- /* @__PURE__ */ jsxRuntime.jsx(
699
+ hasTooltipContent && /* @__PURE__ */ jsxRuntime.jsx(
814
700
  Tooltip.Content,
815
701
  {
816
702
  keepOpenOnPointerDownOutside: true,
@@ -821,7 +707,7 @@ var Clipboard = ({
821
707
  )
822
708
  ] });
823
709
  };
824
- var DEFAULT_ICON = /* @__PURE__ */ jsxRuntime.jsx(icons_exports.Copy, {});
710
+ var DEFAULT_ICON = /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Copy, {});
825
711
  var DEFAULT_ARIA_LABEL = "Copy";
826
712
  var ClipboardButton = ({
827
713
  // clipboard props
@@ -838,7 +724,7 @@ var ClipboardButton = ({
838
724
  const defaultAriaLabel = typeof tooltip === "string" && tooltip.trim() ? tooltip : DEFAULT_ARIA_LABEL;
839
725
  const ariaLabel = rest["aria-label"] ?? (children == null ? defaultAriaLabel : void 0);
840
726
  return /* @__PURE__ */ jsxRuntime.jsx(
841
- Clipboard,
727
+ Clipboard2,
842
728
  {
843
729
  asChild: true,
844
730
  tooltip,
@@ -854,13 +740,198 @@ var ClipboardButton = ({
854
740
  };
855
741
  var ButtonToolbar = ({ value, children }) => {
856
742
  if (!value && !children) return null;
857
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "tw-pointer-events-auto tw-ml-auto tw-mr-4 tw-flex tw-w-fit tw-gap-1 tw-overflow-visible tw-rounded-lg tw-border tw-border-solid tw-border-border !tw-bg-background tw-p-[3px] tw-shadow", children: [
743
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "tw:pointer-events-auto tw:ml-auto tw:mr-4 tw:flex tw:w-fit tw:gap-1 tw:overflow-visible tw:rounded-lg tw:border tw:border-solid tw:border-border tw:!bg-background tw:p-[3px] tw:shadow", children: [
858
744
  !!value && /* @__PURE__ */ jsxRuntime.jsx(ClipboardButton, { size: "icon-sm", variant: "invisible", text: value }),
859
745
  children
860
746
  ] });
861
747
  };
748
+ var COMMANDS = [
749
+ "run-operation",
750
+ "source freshness",
751
+ "docs generate",
752
+ "run",
753
+ "test",
754
+ "seed",
755
+ "snapshot",
756
+ "list",
757
+ "ls",
758
+ "compile",
759
+ "build",
760
+ "deps"
761
+ ];
762
+ var ARGUMENTS = ["--select", "--exclude", "--selector", "--defer", "--resource-type", "-s"];
763
+ var METHODS = [
764
+ "path:",
765
+ "source:",
766
+ "tag:",
767
+ "package:",
768
+ "config:",
769
+ "test_type:",
770
+ "test_name:",
771
+ "state:",
772
+ "exposure:",
773
+ "metric:",
774
+ "result:",
775
+ "source_status:",
776
+ "column_name:"
777
+ ];
778
+ var FLAGS = [
779
+ "--fail-fast",
780
+ "--warn-error",
781
+ "--favor-state",
782
+ "--vars",
783
+ "--models",
784
+ "--threads",
785
+ "--profiles-dir",
786
+ "--profile",
787
+ "--full-refresh"
788
+ ];
789
+ var word = (list) => new RegExp(`^\\s+(?:${list.join("|")})\\b`, "i");
790
+ var prefix = (list) => new RegExp(`^\\s+(?:${list.join("|")})`, "i");
791
+ var dbt = simpleMode.simpleMode({
792
+ start: [
793
+ { regex: /"(?:[^\\]|\\.)*?(?:"|$)/, token: "string" },
794
+ { regex: /dbt/, token: "keyword", sol: true },
795
+ { regex: word(COMMANDS), token: "keyword" },
796
+ { regex: word(ARGUMENTS), token: "variableName" },
797
+ { regex: prefix(METHODS), token: "propertyName" },
798
+ { regex: prefix(FLAGS), token: "attributeName" },
799
+ { regex: /(?:@|\*|,|\+\d+|\d+\+|\+)/, token: "operator" },
800
+ { regex: /'.*'/, token: "string" },
801
+ { regex: /true|false/, token: "atom" }
802
+ ]
803
+ });
804
+
805
+ // src/components/CodeEditor/modes/jsonnet.ts
806
+ var COMMENT_END = /^\*\//;
807
+ var COMMENT_START = /^\/\/|^#/;
808
+ var C_COMMENT_START = /^\/\*/;
809
+ var TEXT_BLOCK = /^\|\|\|/;
810
+ var TEXT_BLOCK_END = /^\s*\|\|\|/;
811
+ var RAW_DOUBLE = /^""/;
812
+ var RAW_SINGLE = /^''/;
813
+ var CLOSE_DOUBLE = /^"/;
814
+ var CLOSE_SINGLE = /^'/;
815
+ var ESCAPE = /^\\[\\"'/bfnrt0]/;
816
+ var UNICODE_ESCAPE = /^\\u[0-9a-fA-F]{4}/;
817
+ var BACKSLASH = /^\\/;
818
+ var IMPORT = /^import(?:str)?\s*(@?)(["'])/;
819
+ var QUOTE = /^(@?)(["'])/;
820
+ var ROOT = /^\$/;
821
+ var NUMBER = /^(?:\.\d+|\d+\.?\d*)(?:e[-+]?\d+)?/i;
822
+ var OPERATOR = /^[-+/*=<>!&~^|$%]+/;
823
+ var IDENTIFIER = /^[a-zA-Z_][a-zA-Z0-9_]*/;
824
+ var KEYWORDS = {
825
+ local: "keyword",
826
+ self: "keyword",
827
+ super: "keyword",
828
+ assert: "keyword",
829
+ function: "keyword",
830
+ if: "keyword",
831
+ then: "keyword",
832
+ else: "keyword",
833
+ for: "keyword",
834
+ in: "keyword",
835
+ tailstrict: "keyword",
836
+ error: "keyword",
837
+ true: "atom",
838
+ false: "atom",
839
+ null: "atom"
840
+ };
841
+ var jsonnet = {
842
+ name: "jsonnet",
843
+ startState: () => ({
844
+ cComment: false,
845
+ textBlock: false,
846
+ textBlockIndent: null,
847
+ string: false,
848
+ importString: false,
849
+ stringSingle: false,
850
+ stringRaw: false
851
+ }),
852
+ token: (stream, state) => {
853
+ if (state.cComment) {
854
+ if (stream.match(COMMENT_END)) {
855
+ state.cComment = false;
856
+ return "comment";
857
+ }
858
+ stream.next();
859
+ return "comment";
860
+ }
861
+ if (state.textBlock) {
862
+ if (state.textBlockIndent == null) {
863
+ if (stream.match(TEXT_BLOCK_END)) {
864
+ state.textBlock = false;
865
+ return "string";
866
+ }
867
+ state.textBlockIndent = stream.indentation();
868
+ }
869
+ if (stream.indentation() >= state.textBlockIndent) {
870
+ stream.skipToEnd();
871
+ return "string";
872
+ }
873
+ if (stream.match(TEXT_BLOCK_END)) {
874
+ state.textBlock = false;
875
+ return "string";
876
+ }
877
+ stream.next();
878
+ return "invalid";
879
+ }
880
+ if (state.string || state.importString) {
881
+ const style = state.string ? "string" : "meta";
882
+ if (state.stringRaw) {
883
+ if (stream.match(state.stringSingle ? RAW_SINGLE : RAW_DOUBLE)) return "escape";
884
+ } else {
885
+ if (stream.match(ESCAPE)) return "escape";
886
+ if (stream.match(UNICODE_ESCAPE)) return "escape";
887
+ if (stream.match(BACKSLASH)) return "invalid";
888
+ }
889
+ if (stream.match(state.stringSingle ? CLOSE_SINGLE : CLOSE_DOUBLE)) {
890
+ state.string = false;
891
+ state.importString = false;
892
+ return style;
893
+ }
894
+ stream.next();
895
+ return style;
896
+ }
897
+ if (stream.match(COMMENT_START)) {
898
+ stream.skipToEnd();
899
+ return "comment";
900
+ }
901
+ if (stream.match(C_COMMENT_START)) {
902
+ state.cComment = true;
903
+ return "comment";
904
+ }
905
+ const imported = stream.match(IMPORT);
906
+ if (Array.isArray(imported)) {
907
+ state.importString = true;
908
+ state.stringRaw = imported[1] === "@";
909
+ state.stringSingle = imported[2] === "'";
910
+ return "meta";
911
+ }
912
+ const quoted = stream.match(QUOTE);
913
+ if (Array.isArray(quoted)) {
914
+ state.string = true;
915
+ state.stringRaw = quoted[1] === "@";
916
+ state.stringSingle = quoted[2] === "'";
917
+ return "string";
918
+ }
919
+ if (stream.match(TEXT_BLOCK)) {
920
+ state.textBlock = true;
921
+ state.textBlockIndent = null;
922
+ return "string";
923
+ }
924
+ if (stream.match(ROOT)) return "keyword";
925
+ if (stream.match(NUMBER)) return "number";
926
+ if (stream.match(OPERATOR)) return "operator";
927
+ const identifier = stream.match(IDENTIFIER);
928
+ if (Array.isArray(identifier)) return KEYWORDS[identifier[0]] ?? null;
929
+ stream.next();
930
+ return null;
931
+ }
932
+ };
862
933
  var resolveToken = (token, fallbackChannels, alpha) => {
863
- const channels = typeof document === "undefined" ? fallbackChannels : getComputedStyle(document.documentElement).getPropertyValue(`--color-${token}`).trim() || fallbackChannels;
934
+ const channels = typeof document === "undefined" ? fallbackChannels : getComputedStyle(document.documentElement).getPropertyValue(`--${token}`).trim() || fallbackChannels;
864
935
  return alpha === void 0 ? `rgb(${channels})` : `rgb(${channels} / ${alpha})`;
865
936
  };
866
937
  var SSR_SIGNAL = "ssr";
@@ -880,12 +951,38 @@ var subscribeThemeSignal = (onChange) => {
880
951
  return () => observer.disconnect();
881
952
  };
882
953
  var useThemeSignal = () => react.useSyncExternalStore(subscribeThemeSignal, readThemeSignal, () => SSR_SIGNAL);
883
- var useThemedExtension = (build, deps = []) => {
954
+ var themeCache = /* @__PURE__ */ new Map();
955
+ var useThemedExtension = (cacheKey, build) => {
884
956
  const themeSignal = useThemeSignal();
885
- return react.useMemo(build, [themeSignal, ...deps]);
957
+ const key = `${themeSignal} ${cacheKey}`;
958
+ let cached = themeCache.get(key);
959
+ if (!cached) {
960
+ cached = build();
961
+ themeCache.set(key, cached);
962
+ }
963
+ return cached;
886
964
  };
887
965
 
888
966
  // src/components/CodeEditor/helpers.ts
967
+ var LANGUAGE_MODES = [
968
+ "application/json",
969
+ "text/plain",
970
+ "text/x-python",
971
+ "text/x-sql",
972
+ "text/x-mysql",
973
+ "text/x-pgsql",
974
+ "text/x-mssql",
975
+ "text/x-sfsql",
976
+ "text/x-plsql",
977
+ "text/x-rsrc",
978
+ "text/x-sh",
979
+ "text/x-toml",
980
+ "text/jsonnet",
981
+ "text/x-dbt",
982
+ "text/javascript",
983
+ "text/typescript"
984
+ ];
985
+ var isLanguageMode = (mode) => LANGUAGE_MODES.includes(mode);
889
986
  var buildBaseThemeStyles = () => ({
890
987
  "*": { lineHeight: "20px" },
891
988
  "*::selection": {
@@ -926,7 +1023,27 @@ var buildBaseThemeStyles = () => ({
926
1023
  ".cm-changeGutter": { position: "absolute", zIndex: -1, width: "100%", paddingLeft: 0 },
927
1024
  '&[class*="cm-merge-"] .cm-changedLine,&[class*="cm-merge-"] .cm-line, &[class*="cm-merge-"] .cm-deletedChunk': { paddingLeft: 0 }
928
1025
  });
929
- var BASIS_SETUP = { drawSelection: false };
1026
+ var ALWAYS_OFF = {
1027
+ drawSelection: false,
1028
+ foldGutter: false,
1029
+ foldKeymap: false,
1030
+ highlightActiveLine: false,
1031
+ highlightActiveLineGutter: false
1032
+ };
1033
+ var buildBasicSetup = (readOnly) => ({
1034
+ ...ALWAYS_OFF,
1035
+ ...readOnly ? {
1036
+ history: false,
1037
+ historyKeymap: false,
1038
+ closeBrackets: false,
1039
+ closeBracketsKeymap: false,
1040
+ lintKeymap: false,
1041
+ indentOnInput: false,
1042
+ rectangularSelection: false,
1043
+ dropCursor: false,
1044
+ highlightSelectionMatches: false
1045
+ } : null
1046
+ });
930
1047
  var buildCustomTheme = () => codemirrorThemeGithub.githubLightInit({
931
1048
  settings: {
932
1049
  fontFamily: `'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New'`,
@@ -941,10 +1058,19 @@ var buildCustomTheme = () => codemirrorThemeGithub.githubLightInit({
941
1058
  });
942
1059
  var getLanguageMode = (mode) => {
943
1060
  switch (mode) {
1061
+ case void 0:
1062
+ case "application/json":
1063
+ return langJson.json();
944
1064
  case "text/x-python":
945
1065
  return langPython.python();
946
1066
  case "text/x-sql":
947
1067
  return langSql.sql({ upperCaseKeywords: true });
1068
+ case "text/x-mysql":
1069
+ return langSql.sql({ upperCaseKeywords: true, dialect: langSql.MySQL });
1070
+ case "text/x-pgsql":
1071
+ return langSql.sql({ upperCaseKeywords: true, dialect: langSql.PostgreSQL });
1072
+ case "text/x-mssql":
1073
+ return langSql.sql({ upperCaseKeywords: true, dialect: langSql.MSSQL });
948
1074
  case "text/x-sfsql":
949
1075
  return language.StreamLanguage.define(codemirrorLangSfsql.sfsql);
950
1076
  case "text/x-plsql":
@@ -953,28 +1079,32 @@ var getLanguageMode = (mode) => {
953
1079
  return language.StreamLanguage.define(r.r);
954
1080
  case "text/x-sh":
955
1081
  return language.StreamLanguage.define(shell.shell);
1082
+ case "text/x-toml":
1083
+ return language.StreamLanguage.define(toml.toml);
1084
+ case "text/jsonnet":
1085
+ return language.StreamLanguage.define(jsonnet);
1086
+ case "text/x-dbt":
1087
+ return language.StreamLanguage.define(dbt);
956
1088
  case "text/javascript":
957
1089
  return langJavascript.javascript({ jsx: true });
958
1090
  case "text/typescript":
959
1091
  return langJavascript.javascript({ jsx: true, typescript: true });
1092
+ // No language — `text/plain` lands here, and so does any mode added to
1093
+ // LANGUAGE_MODES without an arm above. Unstyled text is the safe degradation;
1094
+ // a `json()` default would colour unrelated content as if it were JSON.
960
1095
  default:
961
- return langJson.json();
1096
+ return [];
962
1097
  }
963
1098
  };
964
- var KbdSeparator = ({ className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx("span", { ...props, className: cn("tw-text-xs tw-text-muted-foreground", className) });
965
- var KbdGroup = ({
966
- ref,
967
- className,
968
- children,
969
- separator,
970
- ...props
971
- }) => {
1099
+ var shouldLintJson = (mode, readOnly) => mode === "application/json" && !readOnly;
1100
+ var KbdSeparator = ({ className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx("span", { ...props, className: cn("tw:text-xs tw:text-muted-foreground", className) });
1101
+ var KbdGroup = ({ ref, className, children, separator, ...props }) => {
972
1102
  return /* @__PURE__ */ jsxRuntime.jsx(
973
1103
  "kbd",
974
1104
  {
975
1105
  ...props,
976
1106
  ref,
977
- className: cn("tw-inline-flex", "tw-items-center", "tw-gap-1", className),
1107
+ className: cn("tw:inline-flex", "tw:items-center", "tw:gap-1", className),
978
1108
  children: separator ? (
979
1109
  // oxlint-disable-next-line react-x/no-children-to-array
980
1110
  react.Children.toArray(children).map((child, index) => (
@@ -992,22 +1122,22 @@ var kbdVariants = classVarianceAuthority.cva(
992
1122
  [
993
1123
  "tailwindcss-preflight",
994
1124
  // style
995
- "tw-pointer-events-none",
996
- "tw-w-fit",
997
- "tw-h-5",
998
- "tw-min-w-5",
1125
+ "tw:pointer-events-none",
1126
+ "tw:w-fit",
1127
+ "tw:h-5",
1128
+ "tw:min-w-5",
999
1129
  // layout
1000
- "tw-inline-flex",
1001
- "tw-items-center",
1002
- "tw-justify-center",
1003
- "tw-gap-1",
1004
- "tw-shrink-0",
1130
+ "tw:inline-flex",
1131
+ "tw:items-center",
1132
+ "tw:justify-center",
1133
+ "tw:gap-1",
1134
+ "tw:shrink-0",
1005
1135
  // spacing
1006
- "tw-px-1",
1007
- '[&_svg:not([class*="size-"])]:tw-size-2.5',
1008
- "tw-text-xs",
1009
- "tw-font-medium",
1010
- "tw-rounded"
1136
+ "tw:px-1",
1137
+ 'tw:[&_svg:not([class*="size-"])]:size-2.5',
1138
+ "tw:text-xs",
1139
+ "tw:font-medium",
1140
+ "tw:rounded"
1011
1141
  ],
1012
1142
  {
1013
1143
  defaultVariants: {
@@ -1015,8 +1145,8 @@ var kbdVariants = classVarianceAuthority.cva(
1015
1145
  },
1016
1146
  variants: {
1017
1147
  variant: {
1018
- default: "tw-bg-muted tw-text-muted-foreground",
1019
- primary: "tw-bg-white/20 tw-text-white"
1148
+ default: "tw:bg-muted tw:text-muted-foreground",
1149
+ primary: "tw:bg-white/20 tw:text-white"
1020
1150
  }
1021
1151
  }
1022
1152
  }
@@ -1039,6 +1169,7 @@ var CodeEditor = ({
1039
1169
  onChange,
1040
1170
  mode = "application/json",
1041
1171
  placeholder = "",
1172
+ ariaLabel,
1042
1173
  readOnly = false,
1043
1174
  autocompletions = emptyArray,
1044
1175
  extraKeys = emptyObject,
@@ -1047,19 +1178,23 @@ var CodeEditor = ({
1047
1178
  withLineNumbers = true,
1048
1179
  withLineWrapping = true,
1049
1180
  withCollapseUnchanged = false,
1050
- withCopyButton = true,
1181
+ withCopyButton = false,
1051
1182
  completeAny = false,
1052
1183
  help = null,
1053
1184
  helpPostfix = null,
1054
1185
  renderAdditionalButtons,
1055
1186
  className
1056
1187
  }) => {
1057
- const customTheme = useThemedExtension(buildCustomTheme);
1058
- const baseTheme = useThemedExtension(() => view.EditorView.theme(buildBaseThemeStyles()));
1188
+ const handleChange = useStableCallback((next) => onChange?.(next));
1189
+ const customTheme = useThemedExtension("editor:syntax", buildCustomTheme);
1190
+ const baseTheme = useThemedExtension(
1191
+ "code-editor:chrome",
1192
+ () => view.EditorView.theme(buildBaseThemeStyles())
1193
+ );
1059
1194
  const commonExtensions = react.useMemo(() => {
1060
1195
  return [
1061
1196
  getLanguageMode(mode),
1062
- mode === "application/json" && lint.linter(langJson.jsonParseLinter()),
1197
+ shouldLintJson(mode, readOnly) ? lint.linter(langJson.jsonParseLinter()) : [],
1063
1198
  withLineWrapping ? view.EditorView.lineWrapping : [],
1064
1199
  CodeMirror.EditorState.languageData.of(() => [
1065
1200
  { autocomplete: completeAny ? autocomplete.completeAnyWord : autocompletions }
@@ -1074,10 +1209,20 @@ var CodeEditor = ({
1074
1209
  }
1075
1210
  }))
1076
1211
  ),
1077
- autocomplete.autocompletion({ activateOnTyping: completeAny }),
1212
+ readOnly ? [] : autocomplete.autocompletion({ activateOnTyping: completeAny }),
1213
+ ariaLabel ? view.EditorView.contentAttributes.of({ "aria-label": ariaLabel }) : [],
1078
1214
  baseTheme
1079
- ].filter(Boolean);
1080
- }, [autocompletions, completeAny, extraKeys, mode, withLineWrapping, baseTheme]);
1215
+ ];
1216
+ }, [
1217
+ autocompletions,
1218
+ completeAny,
1219
+ extraKeys,
1220
+ mode,
1221
+ readOnly,
1222
+ withLineWrapping,
1223
+ baseTheme,
1224
+ ariaLabel
1225
+ ]);
1081
1226
  const extensions = react.useMemo(() => {
1082
1227
  return [
1083
1228
  ...commonExtensions,
@@ -1094,18 +1239,20 @@ var CodeEditor = ({
1094
1239
  }, [commonExtensions, placeholder, readOnly, previousValue, withCollapseUnchanged]);
1095
1240
  const config = react.useMemo(() => {
1096
1241
  return {
1097
- ...BASIS_SETUP,
1242
+ ...buildBasicSetup(readOnly),
1098
1243
  lineNumbers: withLineNumbers
1099
1244
  };
1100
- }, [withLineNumbers]);
1245
+ }, [withLineNumbers, readOnly]);
1246
+ const additionalButtons = renderAdditionalButtons?.(value);
1247
+ const hasToolbar = withCopyButton && !!value || !!additionalButtons;
1101
1248
  return (
1102
1249
  // oxlint-disable-next-line jsx-a11y/no-static-element-interactions
1103
1250
  /* @__PURE__ */ jsxRuntime.jsxs(
1104
1251
  "div",
1105
1252
  {
1106
1253
  className: cn(
1107
- "tw-relative tw-flex tw-min-h-0 tw-flex-col [&_.cm-mergeViewEditor]:tw-overflow-visible [&_.cm-mergeViewEditors]:tw-h-full [&_.cm-mergeView]:tw-h-full [&_>div]:tw-h-full [&_>div]:tw-overflow-auto [&_>div]:tw-bg-background",
1108
- { "tw-mt-5": !!renderAdditionalButtons },
1254
+ "tw:relative tw:flex tw:min-h-0 tw:flex-col tw:[&_.cm-mergeViewEditor]:overflow-visible tw:[&_.cm-mergeViewEditors]:h-full tw:[&_.cm-mergeView]:h-full tw:[&_>div]:h-full tw:[&_>div]:overflow-auto tw:[&_>div]:bg-background",
1255
+ { "tw:mt-8": hasToolbar },
1109
1256
  className
1110
1257
  ),
1111
1258
  onKeyDown: (event) => {
@@ -1114,19 +1261,19 @@ var CodeEditor = ({
1114
1261
  }
1115
1262
  },
1116
1263
  children: [
1117
- (withCopyButton || renderAdditionalButtons) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tw-pointer-events-none tw-absolute tw-z-10 tw-flex !tw-h-auto tw-w-full tw-translate-y-[calc(-100%_+_8px)] !tw-overflow-visible !tw-bg-transparent", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tw-flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(ButtonToolbar, { value: withCopyButton ? value : void 0, children: renderAdditionalButtons?.(value) }) }) }),
1264
+ hasToolbar && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tw:pointer-events-none tw:absolute tw:z-10 tw:flex tw:!h-auto tw:w-full tw:translate-y-[calc(-100%_+_8px)] tw:!overflow-visible tw:!bg-transparent", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tw:flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(ButtonToolbar, { value: withCopyButton ? value : void 0, children: additionalButtons }) }) }),
1118
1265
  /* @__PURE__ */ jsxRuntime.jsx(
1119
1266
  CodeMirror__default.default,
1120
1267
  {
1121
1268
  theme: customTheme,
1122
1269
  value,
1123
- onChange,
1270
+ onChange: handleChange,
1124
1271
  extensions,
1125
1272
  autoFocus: withAutofocus,
1126
1273
  basicSetup: config
1127
1274
  }
1128
1275
  ),
1129
- !readOnly && (withToggleCommentHint || help || helpPostfix) && /* @__PURE__ */ jsxRuntime.jsxs(HelpBlock, { className: "tw-mt-2 tw-flex tw-flex-wrap tw-gap-1", children: [
1276
+ !readOnly && (withToggleCommentHint || help || helpPostfix) && /* @__PURE__ */ jsxRuntime.jsxs(HelpBlock, { className: "tw:mt-2 tw:flex tw:flex-wrap tw:gap-1", children: [
1130
1277
  help,
1131
1278
  withToggleCommentHint ? /* @__PURE__ */ jsxRuntime.jsx(ToggleComponentHelp, {}) : null,
1132
1279
  helpPostfix
@@ -1546,8 +1693,7 @@ function searchExtension() {
1546
1693
  function updateSearch(view, query, selectedMatchIndex) {
1547
1694
  view.dispatch({ effects: setSearchEffect.of({ query, selectedMatchIndex }) });
1548
1695
  }
1549
- var BASIS_SETUP2 = {
1550
- drawSelection: false,
1696
+ var OWN_KEYMAPS = {
1551
1697
  defaultKeymap: false,
1552
1698
  completionKeymap: false,
1553
1699
  searchKeymap: false
@@ -1612,8 +1758,11 @@ var SqlEditor = ({
1612
1758
  dialect
1613
1759
  }) => {
1614
1760
  const editorRef = react.useRef(null);
1615
- const customTheme = useThemedExtension(buildCustomTheme);
1616
- const themeExtension = useThemedExtension(() => CodeMirror.EditorView.theme(buildTheme()));
1761
+ const customTheme = useThemedExtension("editor:syntax", buildCustomTheme);
1762
+ const themeExtension = useThemedExtension(
1763
+ "sql-editor:chrome",
1764
+ () => CodeMirror.EditorView.theme(buildTheme())
1765
+ );
1617
1766
  const extensions = react.useMemo(() => {
1618
1767
  const baseKeymap = [...commands.defaultKeymap, ...CUSTOM_KEYMAP];
1619
1768
  return [
@@ -1639,8 +1788,8 @@ var SqlEditor = ({
1639
1788
  themeExtension
1640
1789
  ]);
1641
1790
  const defaultSetup = react.useMemo(() => {
1642
- return { ...BASIS_SETUP2, lineNumbers };
1643
- }, [lineNumbers]);
1791
+ return { ...buildBasicSetup(readOnly), ...OWN_KEYMAPS, lineNumbers };
1792
+ }, [readOnly, lineNumbers]);
1644
1793
  react.useEffect(() => {
1645
1794
  if (editorRef.current?.view) {
1646
1795
  updateHighlighting(editorRef.current.view, highlightLines);
@@ -1706,25 +1855,25 @@ var LINE_HEIGHT_PX = 20;
1706
1855
  var PANE_HEADER_HEIGHT_PX = 58;
1707
1856
  var AcceptButton = ({ side, onAccept }) => {
1708
1857
  const label = `Accept ${side === "left" ? "production" : "branch"} version`;
1709
- const Chevron = side === "left" ? icons_exports.ChevronsRight : icons_exports.ChevronsLeft;
1710
- return /* @__PURE__ */ jsxRuntime.jsx(Button, { onClick: onAccept, variant: "outline", size: "icon-sm", title: label, "aria-label": label, children: /* @__PURE__ */ jsxRuntime.jsx(Chevron, { className: "tw-size-5" }) });
1858
+ const Chevron = side === "left" ? lucideReact.ChevronsRight : lucideReact.ChevronsLeft;
1859
+ return /* @__PURE__ */ jsxRuntime.jsx(Button, { onClick: onAccept, variant: "outline", size: "icon-sm", title: label, "aria-label": label, children: /* @__PURE__ */ jsxRuntime.jsx(Chevron, { className: "tw:size-5" }) });
1711
1860
  };
1712
1861
  var AcceptControls = ({ conflicts, side, onAccept, onDismiss, contentRef }) => /* @__PURE__ */ jsxRuntime.jsx(
1713
1862
  "div",
1714
1863
  {
1715
1864
  className: cn(
1716
- "tw-z-10 tw-flex tw-shrink-0 tw-flex-col tw-items-center",
1717
- conflicts.length > 0 ? "tw-w-7" : "tw-w-0"
1865
+ "tw:z-10 tw:flex tw:shrink-0 tw:flex-col tw:items-center",
1866
+ conflicts.length > 0 ? "tw:w-7" : "tw:w-0"
1718
1867
  ),
1719
1868
  children: conflicts.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1720
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tw-shrink-0", style: { height: `${PANE_HEADER_HEIGHT_PX}px` } }),
1721
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tw-relative tw-w-full tw-flex-1 tw-overflow-y-clip tw-overflow-x-visible", children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref: contentRef, className: "tw-relative tw-size-full", children: conflicts.map((conflict) => {
1869
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tw:shrink-0", style: { height: `${PANE_HEADER_HEIGHT_PX}px` } }),
1870
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tw:relative tw:w-full tw:flex-1 tw:overflow-y-clip tw:overflow-x-visible", children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref: contentRef, className: "tw:relative tw:size-full", children: conflicts.map((conflict) => {
1722
1871
  const topLine = side === "left" ? conflict.oldStartLine : conflict.newStartLine;
1723
1872
  const topOffset = (topLine - 1) * LINE_HEIGHT_PX - 2;
1724
1873
  return /* @__PURE__ */ jsxRuntime.jsxs(
1725
1874
  "div",
1726
1875
  {
1727
- className: "tw-absolute tw-inset-x-0 tw-flex tw-flex-col tw-items-center tw-gap-0.5",
1876
+ className: "tw:absolute tw:inset-x-0 tw:flex tw:flex-col tw:items-center tw:gap-0.5",
1728
1877
  style: { top: `${topOffset}px` },
1729
1878
  children: [
1730
1879
  /* @__PURE__ */ jsxRuntime.jsx(AcceptButton, { side, onAccept: () => onAccept(conflict) }),
@@ -1736,7 +1885,7 @@ var AcceptControls = ({ conflicts, side, onAccept, onDismiss, contentRef }) => /
1736
1885
  size: "icon-sm",
1737
1886
  title: "Dismiss",
1738
1887
  "aria-label": `Dismiss ${side === "left" ? "production" : "branch"} change`,
1739
- children: /* @__PURE__ */ jsxRuntime.jsx(icons_exports.X, { className: "tw-size-4" })
1888
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "tw:size-4" })
1740
1889
  }
1741
1890
  )
1742
1891
  ]
@@ -1833,13 +1982,15 @@ var MergePane = ({
1833
1982
  deleted = false
1834
1983
  }) => {
1835
1984
  const editorRef = react.useRef(null);
1985
+ const handleChange = useStableCallback((next) => onChange?.(next));
1836
1986
  const themeExtension = useThemedExtension(
1987
+ `merge-pane:${deleted}`,
1837
1988
  () => view.EditorView.theme({
1838
1989
  "&.cm-editor": {
1839
1990
  height: "100%",
1840
1991
  backgroundColor: deleted ? colors__default.default.error[100] : resolveToken("background", "249 250 251"),
1841
1992
  // Pair the token-driven surface with a token-driven text color so line
1842
- // content stays readable when the pane's `--color-background` goes dark.
1993
+ // content stays readable when the pane's `--background` goes dark.
1843
1994
  // The deleted pane keeps default dark text on its fixed light-red wash.
1844
1995
  ...deleted ? {} : { color: resolveToken("foreground", "30 41 59") },
1845
1996
  outline: "none"
@@ -1850,10 +2001,13 @@ var MergePane = ({
1850
2001
  },
1851
2002
  "*": { lineHeight: `${LINE_HEIGHT_PX}px` },
1852
2003
  ".cm-lineNumbers .cm-gutterElement": { padding: "0 0 0 25px" }
1853
- }),
1854
- [deleted]
2004
+ })
1855
2005
  );
1856
2006
  const diffHighlightExtension = react.useMemo(() => createDiffHighlightExtension(), []);
2007
+ const basicSetup = react.useMemo(
2008
+ () => ({ ...buildBasicSetup(readOnly), lineNumbers: true }),
2009
+ [readOnly]
2010
+ );
1857
2011
  const extensions = react.useMemo(
1858
2012
  () => [
1859
2013
  diffHighlightExtension,
@@ -1903,33 +2057,33 @@ var MergePane = ({
1903
2057
  "div",
1904
2058
  {
1905
2059
  className: cn(
1906
- "tw-flex tw-min-w-0 tw-flex-1 tw-flex-col tw-overflow-hidden",
2060
+ "tw:flex tw:min-w-0 tw:flex-1 tw:flex-col tw:overflow-hidden",
1907
2061
  className,
1908
- deleted && "tw-border-error-300"
2062
+ deleted && "tw:border-error-300"
1909
2063
  ),
1910
2064
  children: [
1911
2065
  header && /* @__PURE__ */ jsxRuntime.jsx(
1912
2066
  "div",
1913
2067
  {
1914
2068
  className: cn(
1915
- "tw-px-4 tw-py-3",
1916
- deleted ? "tw-border-b tw-border-error-200 tw-bg-error-100" : "tw-bg-background",
2069
+ "tw:px-4 tw:py-3",
2070
+ deleted ? "tw:border-b tw:border-error-200 tw:bg-error-100" : "tw:bg-background",
1917
2071
  headerClassName
1918
2072
  ),
1919
2073
  children: header
1920
2074
  }
1921
2075
  ),
1922
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tw-flex tw-h-0 tw-flex-1 tw-flex-col [&_>div]:tw-h-full", children: /* @__PURE__ */ jsxRuntime.jsx(
2076
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tw:flex tw:h-0 tw:flex-1 tw:flex-col tw:[&_>div]:h-full", children: /* @__PURE__ */ jsxRuntime.jsx(
1923
2077
  CodeMirror__default.default,
1924
2078
  {
1925
2079
  ref: editorRef,
1926
2080
  height: "100%",
1927
2081
  value,
1928
- onChange,
2082
+ onChange: handleChange,
1929
2083
  extensions,
1930
2084
  readOnly,
1931
2085
  onCreateEditor: handleCreateEditor,
1932
- basicSetup: { lineNumbers: true, drawSelection: false }
2086
+ basicSetup
1933
2087
  }
1934
2088
  ) })
1935
2089
  ]
@@ -2029,7 +2183,7 @@ var MergeEditor = ({
2029
2183
  "div",
2030
2184
  {
2031
2185
  className: cn(
2032
- "tw-flex tw-h-full tw-min-h-0 tw-overflow-hidden tw-bg-background tw-gap-3",
2186
+ "tw:flex tw:h-full tw:min-h-0 tw:overflow-hidden tw:bg-background tw:gap-3",
2033
2187
  className
2034
2188
  ),
2035
2189
  children: [
@@ -2041,7 +2195,7 @@ var MergeEditor = ({
2041
2195
  lineClassification: leftClassification,
2042
2196
  readOnly: true,
2043
2197
  header: leftHeader,
2044
- className: "tw-rounded-r-lg tw-border tw-border-border",
2198
+ className: "tw:rounded-r-lg tw:border tw:border-border",
2045
2199
  onScrollDOMReady: registerScroller(0),
2046
2200
  deleted: leftDeleted
2047
2201
  }
@@ -2065,7 +2219,7 @@ var MergeEditor = ({
2065
2219
  onChange: handleMergeChange,
2066
2220
  header: middleHeader,
2067
2221
  headerClassName: middleHeaderClassName,
2068
- className: cn("tw-border tw-border-border tw-rounded-lg", middleClassName),
2222
+ className: cn("tw:border tw:border-border tw:rounded-lg", middleClassName),
2069
2223
  onScrollDOMReady: registerScroller(1)
2070
2224
  }
2071
2225
  ),
@@ -2087,7 +2241,7 @@ var MergeEditor = ({
2087
2241
  lineClassification: rightClassification,
2088
2242
  readOnly: true,
2089
2243
  header: rightHeader,
2090
- className: "tw-rounded-l-lg tw-border tw-border-border",
2244
+ className: "tw:rounded-l-lg tw:border tw:border-border",
2091
2245
  onScrollDOMReady: registerScroller(2),
2092
2246
  deleted: rightDeleted
2093
2247
  }
@@ -2098,7 +2252,9 @@ var MergeEditor = ({
2098
2252
  };
2099
2253
 
2100
2254
  exports.CodeEditor = CodeEditor;
2255
+ exports.LANGUAGE_MODES = LANGUAGE_MODES;
2101
2256
  exports.MergeEditor = MergeEditor;
2102
2257
  exports.SqlEditor = SqlEditor;
2258
+ exports.isLanguageMode = isLanguageMode;
2103
2259
  //# sourceMappingURL=editors.cjs.map
2104
2260
  //# sourceMappingURL=editors.cjs.map