@keboola/design 6.5.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 +7 -7
  2. package/COMPONENT-API.md +3 -9
  3. package/README.md +1 -1
  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 +590 -432
  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 +591 -416
  15. package/dist/editors.js.map +1 -1
  16. package/dist/icons.cjs +23817 -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 +297 -40
  21. package/dist/icons.js.map +1 -1
  22. package/dist/index.cjs +4702 -4755
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +183 -169
  25. package/dist/index.d.ts +183 -169
  26. package/dist/index.js +4700 -4754
  27. package/dist/index.js.map +1 -1
  28. package/dist/markdown-editor.cjs +817 -923
  29. package/dist/markdown-editor.cjs.map +1 -1
  30. package/dist/markdown-editor.js +818 -923
  31. package/dist/markdown-editor.js.map +1 -1
  32. package/dist/mermaid.cjs +308 -425
  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 +310 -408
  37. package/dist/mermaid.js.map +1 -1
  38. package/dist/rjsf.cjs +1398 -1225
  39. package/dist/rjsf.cjs.map +1 -1
  40. package/dist/rjsf.js +1399 -1225
  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 +26 -19
  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
  );
@@ -319,14 +297,14 @@ Tooltip.Trigger = TooltipTrigger;
319
297
 
320
298
  // src/utils/escapeStringRegexp.ts
321
299
  var escapeStringRegexp = (string) => string.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d");
322
- var helpVariants = classVarianceAuthority.cva(["tw-m-0", "tw-text-xs"], {
300
+ var helpVariants = classVarianceAuthority.cva(["tw:m-0", "tw:text-xs"], {
323
301
  defaultVariants: {
324
302
  state: "default"
325
303
  },
326
304
  variants: {
327
305
  state: {
328
- default: ["tw-text-muted-foreground"],
329
- warning: ["tw-text-warning"]
306
+ default: ["tw:text-muted-foreground"],
307
+ warning: ["tw:text-warning"]
330
308
  }
331
309
  }
332
310
  });
@@ -334,146 +312,49 @@ var HelpBlock = ({ children, className, state = "default", ...rest }) => {
334
312
  if (!children) return null;
335
313
  return /* @__PURE__ */ jsxRuntime.jsx("p", { ...rest, className: helpVariants({ state, className }), children });
336
314
  };
337
-
338
- // src/icons/index.ts
339
- var icons_exports = {};
340
- __export(icons_exports, {
341
- Google: () => Google,
342
- Keboola: () => Keboola,
343
- Microsoft: () => Microsoft
344
- });
345
- __reExport(icons_exports, lucide_react_star__namespace);
346
- var Google = react.forwardRef(
347
- ({ size = 24, className, children, ...rest }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
348
- "svg",
349
- {
350
- ref,
351
- xmlns: "http://www.w3.org/2000/svg",
352
- width: size,
353
- height: size,
354
- viewBox: "12 10 20 20",
355
- fill: "none",
356
- className: cn("lucide", className),
357
- ...rest,
358
- children: [
359
- /* @__PURE__ */ jsxRuntime.jsx(
360
- "path",
361
- {
362
- 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",
363
- fill: "#4285F4"
364
- }
365
- ),
366
- /* @__PURE__ */ jsxRuntime.jsx(
367
- "path",
368
- {
369
- 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",
370
- fill: "#34A853"
371
- }
372
- ),
373
- /* @__PURE__ */ jsxRuntime.jsx(
374
- "path",
375
- {
376
- 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",
377
- fill: "#FBBC04"
378
- }
379
- ),
380
- /* @__PURE__ */ jsxRuntime.jsx(
381
- "path",
382
- {
383
- 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",
384
- fill: "#EA4335"
385
- }
386
- ),
387
- children
388
- ]
389
- }
390
- )
391
- );
392
- Google.displayName = "Google";
393
- var Keboola = react.forwardRef(
394
- ({ size = 24, color = "currentColor", className, children, ...rest }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
395
- "svg",
396
- {
397
- ref,
398
- xmlns: "http://www.w3.org/2000/svg",
399
- width: size,
400
- height: size,
401
- viewBox: "0 0 300 512",
402
- overflow: "visible",
403
- fill: color,
404
- className: cn("lucide", className),
405
- ...rest,
406
- children: [
407
- /* @__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" }),
408
- children
409
- ]
410
- }
411
- )
412
- );
413
- Keboola.displayName = "Keboola";
414
- var Microsoft = react.forwardRef(
415
- ({ size = 24, className, children, ...rest }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
416
- "svg",
417
- {
418
- ref,
419
- xmlns: "http://www.w3.org/2000/svg",
420
- width: size,
421
- height: size,
422
- viewBox: "0 0 21 21",
423
- fill: "none",
424
- className: cn("lucide", className),
425
- ...rest,
426
- children: [
427
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "0", y: "0", width: "10", height: "10", fill: "#F25022" }),
428
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "11", y: "0", width: "10", height: "10", fill: "#7FBA00" }),
429
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "0", y: "11", width: "10", height: "10", fill: "#00A4EF" }),
430
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "11", y: "11", width: "10", height: "10", fill: "#FFB900" }),
431
- children
432
- ]
433
- }
434
- )
435
- );
436
- Microsoft.displayName = "Microsoft";
437
315
  var variants = classVarianceAuthority.cva(
438
316
  [
439
317
  "tailwindcss-preflight",
440
- "tw-group/button",
441
- "tw-border-box",
318
+ "tw:group/button",
319
+ "tw:border-box",
442
320
  // layout
443
- "tw-relative",
444
- "tw-flex",
445
- "tw-items-center",
446
- "tw-justify-center",
447
- "tw-gap-2",
321
+ "tw:relative",
322
+ "tw:flex",
323
+ "tw:items-center",
324
+ "tw:justify-center",
325
+ "tw:gap-2",
448
326
  // text — chrome weight/tracking are brand-overridable tokens
449
- // (`--font-weight-medium` / `--letter-spacing-chrome`); casing stays `tw-uppercase`.
450
- "tw-text-xs",
451
- "tw-leading-5",
452
- "tw-font-medium",
453
- "tw-tracking-chrome",
454
- "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",
455
336
  // border — legacy (non-argo) chrome uses a fixed radius, not the brand token.
456
- "tw-rounded",
457
- "tw-border",
458
- "tw-border-transparent",
337
+ "tw:rounded",
338
+ "tw:border",
339
+ "tw:border-transparent",
459
340
  // styling
460
- "tw-shadow-none",
461
- "[a]:tw-cursor-pointer",
341
+ "tw:shadow-none",
342
+ "tw:[a]:cursor-pointer",
462
343
  // explicitly set for anchor
463
- "focus-visible:tw-outline",
464
- "focus-visible:tw-outline-1",
465
- "focus-visible:-tw-outline-offset-1",
466
- "focus-visible:tw-outline-ring",
467
- "focus-visible:tw-ring-4",
468
- "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",
469
350
  // disabled
470
- "disabled:tw-opacity-40",
471
- "disabled:tw-cursor-not-allowed",
351
+ "tw:disabled:opacity-40",
352
+ "tw:disabled:cursor-not-allowed",
472
353
  // anchor support
473
- "!tw-no-underline",
474
- "aria-disabled:tw-opacity-40",
475
- "aria-disabled:tw-cursor-not-allowed",
476
- "[&_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"
477
358
  ],
478
359
  {
479
360
  defaultVariants: {
@@ -483,113 +364,113 @@ var variants = classVarianceAuthority.cva(
483
364
  },
484
365
  variants: {
485
366
  block: {
486
- true: ["tw-w-full"]
367
+ true: ["tw:w-full"]
487
368
  },
488
369
  variant: {
489
370
  primary: [
490
- "tw-text-white",
491
- "tw-bg-primary-500",
492
- "focus:tw-text-white",
493
- "hover:tw-text-white",
494
- "hover:not-disabled:tw-bg-primary-600",
495
- "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",
496
377
  // anchor disabled override
497
- "aria-disabled:!tw-bg-primary-500"
378
+ "tw:aria-disabled:!bg-primary-500"
498
379
  ],
499
380
  secondary: [
500
- "tw-text-white",
501
- "tw-bg-secondary-500",
502
- "focus:tw-text-white",
503
- "hover:tw-text-white",
504
- "hover:not-disabled:tw-bg-secondary-700",
505
- "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",
506
387
  // anchor disabled override
507
- "aria-disabled:!tw-bg-secondary-500"
388
+ "tw:aria-disabled:!bg-secondary-500"
508
389
  ],
509
390
  danger: [
510
- "tw-text-white",
511
- "tw-bg-error-500",
512
- "focus:tw-text-white",
513
- "hover:tw-text-white",
514
- "hover:not-disabled:tw-bg-error-600",
515
- "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",
516
397
  // anchor disabled override
517
- "aria-disabled:!tw-bg-error-500"
398
+ "tw:aria-disabled:!bg-error-500"
518
399
  ],
519
400
  invisible: [
520
- "tw-text-neutral-800",
521
- "tw-bg-transparent",
522
- "focus:tw-text-neutral-800",
523
- "hover:not-disabled:tw-bg-neutral-100",
524
- "hover:tw-text-neutral-800",
525
- "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",
526
407
  // contrasting icon on hover/active
527
- "[&_svg]:tw-text-neutral-400",
528
- "[&_svg]:hover:not-disabled:tw-text-secondary-600",
529
- "[&_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",
530
411
  // anchor disabled override
531
- "aria-disabled:!tw-bg-transparent"
412
+ "tw:aria-disabled:!bg-transparent"
532
413
  ],
533
414
  outline: [
534
- "tw-text-neutral-800",
535
- "tw-bg-white",
415
+ "tw:text-neutral-800",
416
+ "tw:bg-white",
536
417
  // border
537
- "!tw-border-neutral-200",
538
- "hover:tw-text-neutral-800",
539
- "focus:tw-text-neutral-800",
540
- "hover:not-disabled:!tw-border-neutral-300",
541
- "hover:not-disabled:tw-bg-neutral-100",
542
- "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",
543
424
  // contrasting icon hover, same as invisible
544
- "[&_svg]:tw-text-neutral-400",
545
- "[&_svg]:not-disabled:hover:tw-text-secondary-600",
546
- "[&_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",
547
428
  // anchor disabled override
548
- "aria-disabled:!tw-bg-white",
549
- "aria-disabled:!tw-border-neutral-200"
429
+ "tw:aria-disabled:!bg-white",
430
+ "tw:aria-disabled:!border-neutral-200"
550
431
  ],
551
432
  inline: [
552
- "tw-text-neutral-800",
553
- "tw-bg-transparent",
554
- "tw-rounded-full",
555
- "[&_svg]:tw-text-neutral-400",
556
- "[&_svg]:not-disabled:hover:tw-text-secondary-600",
557
- "[&_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"
558
439
  ]
559
440
  },
560
441
  size: {
561
442
  medium: [
562
- "tw-max-h-10",
563
- "tw-min-h-10",
564
- "tw-px-4",
565
- "tw-py-2.5",
566
- '[&_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'
567
448
  ],
568
449
  small: [
569
- "tw-max-h-8",
570
- "tw-min-h-8",
571
- "tw-px-4",
572
- "tw-py-1.5",
573
- '[&_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'
574
455
  ],
575
456
  large: [
576
- "tw-max-h-12",
577
- "tw-min-h-12",
578
- "tw-px-4",
579
- "tw-py-3.5",
580
- '[&_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'
581
462
  ],
582
- "icon-lg": ["tw-size-12", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-6'],
583
- icon: ["tw-size-10", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-4'],
584
- "icon-sm": ["tw-size-8", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-4'],
585
- "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'],
586
467
  "icon-2xs": [
587
- "!tw-inline-flex",
588
- "tw-size-5",
589
- "tw-max-h-5",
590
- '[&_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'
591
472
  ],
592
- "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']
593
474
  }
594
475
  }
595
476
  }
@@ -598,37 +479,37 @@ var argoVariants = classVarianceAuthority.cva(
598
479
  [
599
480
  "tailwindcss-preflight",
600
481
  // layout
601
- "tw-relative",
602
- "tw-inline-flex",
603
- "tw-items-center",
604
- "tw-justify-center",
605
- "tw-whitespace-nowrap",
606
- "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",
607
488
  // border
608
- "tw-border",
609
- "tw-border-transparent",
610
- "tw-rounded-[var(--radius-lg,0.25rem)]",
489
+ "tw:border",
490
+ "tw:border-transparent",
491
+ "tw:rounded-[var(--radius-lg,0.25rem)]",
611
492
  // text
612
- "tw-font-medium",
613
- "tw-select-none",
493
+ "tw:font-medium",
494
+ "tw:select-none",
614
495
  // focus visible
615
- "!tw-outline-none",
616
- "focus-visible:tw-ring-2",
496
+ "tw:!outline-hidden",
497
+ "tw:focus-visible:ring-2",
617
498
  // disabled
618
- "disabled:tw-cursor-not-allowed",
619
- "disabled:tw-opacity-50",
620
- "active:tw-opacity-60",
621
- "tw-transition-all",
622
- "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",
623
504
  // anchor support
624
- "!tw-no-underline",
625
- "aria-disabled:tw-cursor-not-allowed",
626
- "aria-disabled:tw-opacity-50",
505
+ "tw:!no-underline",
506
+ "tw:aria-disabled:cursor-not-allowed",
507
+ "tw:aria-disabled:opacity-50",
627
508
  // icon
628
- "tw-shrink-0",
629
- "[&_svg]:tw-pointer-events-none",
630
- "[&_svg]:tw-shrink-0",
631
- "[&_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"
632
513
  ],
633
514
  {
634
515
  defaultVariants: {
@@ -637,77 +518,77 @@ var argoVariants = classVarianceAuthority.cva(
637
518
  },
638
519
  variants: {
639
520
  block: {
640
- true: ["tw-w-full"]
521
+ true: ["tw:w-full"]
641
522
  },
642
523
  variant: {
643
524
  primary: [
644
- "tw-bg-primary",
645
- "tw-text-primary-foreground",
646
- "[a]:hover:tw-bg-primary/80",
647
- "hover:not-disabled:tw-bg-primary/90",
648
- "hover:tw-text-primary-foreground",
649
- "focus:tw-text-primary-foreground",
650
- "focus-visible:tw-border-primary",
651
- "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"
652
533
  ],
653
534
  secondary: [
654
- "tw-bg-primary/10",
655
- "tw-text-primary",
656
- "hover:not-disabled:tw-bg-primary/20",
657
- "focus-visible:tw-border-primary",
658
- "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"
659
540
  ],
660
541
  // should be called "destructive" by Figma
661
542
  danger: [
662
- "tw-bg-destructive",
663
- "tw-text-destructive-foreground",
664
- "hover:tw-text-destructive-foreground",
665
- "focus:tw-text-destructive-foreground",
666
- "focus-visible:tw-border-destructive",
667
- "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"
668
549
  ],
669
550
  outline: [
670
- "!tw-border-input",
671
- "tw-bg-background",
551
+ "tw:!border-input",
552
+ "tw:bg-background",
672
553
  // Semantic base text color so the label/icon flips in dark mode
673
554
  // (matches `invisible`); previously unset → inherited a fixed dark color.
674
- "tw-text-foreground",
555
+ "tw:text-foreground",
675
556
  // Hover follows the brand primary (translucent tint), matching the
676
557
  // `secondary` variant — not the fixed `accent` blue.
677
- "hover:not-disabled:tw-bg-primary/10",
678
- "hover:not-disabled:tw-text-primary",
679
- "hover:active:tw-bg-background",
680
- "focus-visible:!tw-border-primary",
681
- "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"
682
563
  ],
683
564
  // should be called "ghost" by Figma
684
565
  invisible: [
685
- "tw-bg-transparent",
686
- "tw-text-foreground",
687
- "hover:not-disabled:tw-bg-primary/10",
688
- "hover:not-disabled:tw-text-primary",
689
- "hover:not-disabled:tw-border-primary/10",
690
- "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"
691
572
  ],
692
573
  // should be called "link" by Figma
693
574
  inline: [
694
- "tw-bg-transparent",
695
- "tw-text-primary",
696
- "hover:tw-underline",
697
- "hover:active:tw-bg-transparent",
698
- "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"
699
580
  ]
700
581
  },
701
582
  size: {
702
583
  // should be called "default" by Figma
703
- 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"],
704
585
  // should be called "small" by Figma
705
- 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"],
706
587
  // should be called "large" by Figma
707
- large: ["tw-max-h-10", "tw-py-2.5", "tw-px-6", "tw-text-sm"],
708
- "icon-lg": ["tw-size-10"],
709
- icon: ["tw-size-9"],
710
- "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"],
711
592
  // unsupported in ARGO, remove when old design is gone
712
593
  "icon-xs": [],
713
594
  "icon-2xs": [],
@@ -755,13 +636,13 @@ var Button = ({
755
636
  onClick: handleClick,
756
637
  className: cn(classNames),
757
638
  children: [
758
- 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" }),
759
640
  /* @__PURE__ */ jsxRuntime.jsx(reactSlot.Slottable, { children: isLoading && isIconOnly ? null : children })
760
641
  ]
761
642
  }
762
643
  );
763
644
  };
764
- var Clipboard = ({
645
+ var Clipboard2 = ({
765
646
  ref,
766
647
  text: textProp,
767
648
  children,
@@ -786,6 +667,7 @@ var Clipboard = ({
786
667
  }
787
668
  };
788
669
  const handleOnClick = (event) => {
670
+ setIsTooltipOpen(true);
789
671
  if (text && state === "ready") void copy(text);
790
672
  onClick?.(event);
791
673
  };
@@ -800,6 +682,7 @@ var Clipboard = ({
800
682
  return tooltip;
801
683
  })();
802
684
  const tooltipVariant = state === "ready" && !!text ? tooltipVariantProp : "action";
685
+ const hasTooltipContent = tooltipContent !== null && tooltipContent !== void 0;
803
686
  return /* @__PURE__ */ jsxRuntime.jsxs(Tooltip.Root, { open: isTooltipOpen, onOpenChange: handleOnOpenChange, children: [
804
687
  /* @__PURE__ */ jsxRuntime.jsx(
805
688
  Tooltip.Trigger,
@@ -808,12 +691,12 @@ var Clipboard = ({
808
691
  asChild,
809
692
  keepOpenOnClick: true,
810
693
  onClick: handleOnClick,
811
- className: cn("tw-cursor-pointer", className),
694
+ className: cn("tw:cursor-pointer", className),
812
695
  ref,
813
696
  children: children ?? text
814
697
  }
815
698
  ),
816
- /* @__PURE__ */ jsxRuntime.jsx(
699
+ hasTooltipContent && /* @__PURE__ */ jsxRuntime.jsx(
817
700
  Tooltip.Content,
818
701
  {
819
702
  keepOpenOnPointerDownOutside: true,
@@ -824,7 +707,7 @@ var Clipboard = ({
824
707
  )
825
708
  ] });
826
709
  };
827
- var DEFAULT_ICON = /* @__PURE__ */ jsxRuntime.jsx(icons_exports.Copy, {});
710
+ var DEFAULT_ICON = /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Copy, {});
828
711
  var DEFAULT_ARIA_LABEL = "Copy";
829
712
  var ClipboardButton = ({
830
713
  // clipboard props
@@ -841,7 +724,7 @@ var ClipboardButton = ({
841
724
  const defaultAriaLabel = typeof tooltip === "string" && tooltip.trim() ? tooltip : DEFAULT_ARIA_LABEL;
842
725
  const ariaLabel = rest["aria-label"] ?? (children == null ? defaultAriaLabel : void 0);
843
726
  return /* @__PURE__ */ jsxRuntime.jsx(
844
- Clipboard,
727
+ Clipboard2,
845
728
  {
846
729
  asChild: true,
847
730
  tooltip,
@@ -857,13 +740,198 @@ var ClipboardButton = ({
857
740
  };
858
741
  var ButtonToolbar = ({ value, children }) => {
859
742
  if (!value && !children) return null;
860
- 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: [
861
744
  !!value && /* @__PURE__ */ jsxRuntime.jsx(ClipboardButton, { size: "icon-sm", variant: "invisible", text: value }),
862
745
  children
863
746
  ] });
864
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
+ };
865
933
  var resolveToken = (token, fallbackChannels, alpha) => {
866
- 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;
867
935
  return alpha === void 0 ? `rgb(${channels})` : `rgb(${channels} / ${alpha})`;
868
936
  };
869
937
  var SSR_SIGNAL = "ssr";
@@ -883,12 +951,38 @@ var subscribeThemeSignal = (onChange) => {
883
951
  return () => observer.disconnect();
884
952
  };
885
953
  var useThemeSignal = () => react.useSyncExternalStore(subscribeThemeSignal, readThemeSignal, () => SSR_SIGNAL);
886
- var useThemedExtension = (build, deps = []) => {
954
+ var themeCache = /* @__PURE__ */ new Map();
955
+ var useThemedExtension = (cacheKey, build) => {
887
956
  const themeSignal = useThemeSignal();
888
- 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;
889
964
  };
890
965
 
891
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);
892
986
  var buildBaseThemeStyles = () => ({
893
987
  "*": { lineHeight: "20px" },
894
988
  "*::selection": {
@@ -929,7 +1023,27 @@ var buildBaseThemeStyles = () => ({
929
1023
  ".cm-changeGutter": { position: "absolute", zIndex: -1, width: "100%", paddingLeft: 0 },
930
1024
  '&[class*="cm-merge-"] .cm-changedLine,&[class*="cm-merge-"] .cm-line, &[class*="cm-merge-"] .cm-deletedChunk': { paddingLeft: 0 }
931
1025
  });
932
- 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
+ });
933
1047
  var buildCustomTheme = () => codemirrorThemeGithub.githubLightInit({
934
1048
  settings: {
935
1049
  fontFamily: `'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New'`,
@@ -944,10 +1058,19 @@ var buildCustomTheme = () => codemirrorThemeGithub.githubLightInit({
944
1058
  });
945
1059
  var getLanguageMode = (mode) => {
946
1060
  switch (mode) {
1061
+ case void 0:
1062
+ case "application/json":
1063
+ return langJson.json();
947
1064
  case "text/x-python":
948
1065
  return langPython.python();
949
1066
  case "text/x-sql":
950
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 });
951
1074
  case "text/x-sfsql":
952
1075
  return language.StreamLanguage.define(codemirrorLangSfsql.sfsql);
953
1076
  case "text/x-plsql":
@@ -956,23 +1079,32 @@ var getLanguageMode = (mode) => {
956
1079
  return language.StreamLanguage.define(r.r);
957
1080
  case "text/x-sh":
958
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);
959
1088
  case "text/javascript":
960
1089
  return langJavascript.javascript({ jsx: true });
961
1090
  case "text/typescript":
962
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.
963
1095
  default:
964
- return langJson.json();
1096
+ return [];
965
1097
  }
966
1098
  };
967
1099
  var shouldLintJson = (mode, readOnly) => mode === "application/json" && !readOnly;
968
- var KbdSeparator = ({ className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx("span", { ...props, className: cn("tw-text-xs tw-text-muted-foreground", className) });
1100
+ var KbdSeparator = ({ className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx("span", { ...props, className: cn("tw:text-xs tw:text-muted-foreground", className) });
969
1101
  var KbdGroup = ({ ref, className, children, separator, ...props }) => {
970
1102
  return /* @__PURE__ */ jsxRuntime.jsx(
971
1103
  "kbd",
972
1104
  {
973
1105
  ...props,
974
1106
  ref,
975
- 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),
976
1108
  children: separator ? (
977
1109
  // oxlint-disable-next-line react-x/no-children-to-array
978
1110
  react.Children.toArray(children).map((child, index) => (
@@ -990,22 +1122,22 @@ var kbdVariants = classVarianceAuthority.cva(
990
1122
  [
991
1123
  "tailwindcss-preflight",
992
1124
  // style
993
- "tw-pointer-events-none",
994
- "tw-w-fit",
995
- "tw-h-5",
996
- "tw-min-w-5",
1125
+ "tw:pointer-events-none",
1126
+ "tw:w-fit",
1127
+ "tw:h-5",
1128
+ "tw:min-w-5",
997
1129
  // layout
998
- "tw-inline-flex",
999
- "tw-items-center",
1000
- "tw-justify-center",
1001
- "tw-gap-1",
1002
- "tw-shrink-0",
1130
+ "tw:inline-flex",
1131
+ "tw:items-center",
1132
+ "tw:justify-center",
1133
+ "tw:gap-1",
1134
+ "tw:shrink-0",
1003
1135
  // spacing
1004
- "tw-px-1",
1005
- '[&_svg:not([class*="size-"])]:tw-size-2.5',
1006
- "tw-text-xs",
1007
- "tw-font-medium",
1008
- "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"
1009
1141
  ],
1010
1142
  {
1011
1143
  defaultVariants: {
@@ -1013,8 +1145,8 @@ var kbdVariants = classVarianceAuthority.cva(
1013
1145
  },
1014
1146
  variants: {
1015
1147
  variant: {
1016
- default: "tw-bg-muted tw-text-muted-foreground",
1017
- 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"
1018
1150
  }
1019
1151
  }
1020
1152
  }
@@ -1037,6 +1169,7 @@ var CodeEditor = ({
1037
1169
  onChange,
1038
1170
  mode = "application/json",
1039
1171
  placeholder = "",
1172
+ ariaLabel,
1040
1173
  readOnly = false,
1041
1174
  autocompletions = emptyArray,
1042
1175
  extraKeys = emptyObject,
@@ -1045,19 +1178,23 @@ var CodeEditor = ({
1045
1178
  withLineNumbers = true,
1046
1179
  withLineWrapping = true,
1047
1180
  withCollapseUnchanged = false,
1048
- withCopyButton = true,
1181
+ withCopyButton = false,
1049
1182
  completeAny = false,
1050
1183
  help = null,
1051
1184
  helpPostfix = null,
1052
1185
  renderAdditionalButtons,
1053
1186
  className
1054
1187
  }) => {
1055
- const customTheme = useThemedExtension(buildCustomTheme);
1056
- 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
+ );
1057
1194
  const commonExtensions = react.useMemo(() => {
1058
1195
  return [
1059
1196
  getLanguageMode(mode),
1060
- shouldLintJson(mode, readOnly) && lint.linter(langJson.jsonParseLinter()),
1197
+ shouldLintJson(mode, readOnly) ? lint.linter(langJson.jsonParseLinter()) : [],
1061
1198
  withLineWrapping ? view.EditorView.lineWrapping : [],
1062
1199
  CodeMirror.EditorState.languageData.of(() => [
1063
1200
  { autocomplete: completeAny ? autocomplete.completeAnyWord : autocompletions }
@@ -1072,10 +1209,20 @@ var CodeEditor = ({
1072
1209
  }
1073
1210
  }))
1074
1211
  ),
1075
- autocomplete.autocompletion({ activateOnTyping: completeAny }),
1212
+ readOnly ? [] : autocomplete.autocompletion({ activateOnTyping: completeAny }),
1213
+ ariaLabel ? view.EditorView.contentAttributes.of({ "aria-label": ariaLabel }) : [],
1076
1214
  baseTheme
1077
- ].filter(Boolean);
1078
- }, [autocompletions, completeAny, extraKeys, mode, readOnly, withLineWrapping, baseTheme]);
1215
+ ];
1216
+ }, [
1217
+ autocompletions,
1218
+ completeAny,
1219
+ extraKeys,
1220
+ mode,
1221
+ readOnly,
1222
+ withLineWrapping,
1223
+ baseTheme,
1224
+ ariaLabel
1225
+ ]);
1079
1226
  const extensions = react.useMemo(() => {
1080
1227
  return [
1081
1228
  ...commonExtensions,
@@ -1092,18 +1239,20 @@ var CodeEditor = ({
1092
1239
  }, [commonExtensions, placeholder, readOnly, previousValue, withCollapseUnchanged]);
1093
1240
  const config = react.useMemo(() => {
1094
1241
  return {
1095
- ...BASIS_SETUP,
1242
+ ...buildBasicSetup(readOnly),
1096
1243
  lineNumbers: withLineNumbers
1097
1244
  };
1098
- }, [withLineNumbers]);
1245
+ }, [withLineNumbers, readOnly]);
1246
+ const additionalButtons = renderAdditionalButtons?.(value);
1247
+ const hasToolbar = withCopyButton && !!value || !!additionalButtons;
1099
1248
  return (
1100
1249
  // oxlint-disable-next-line jsx-a11y/no-static-element-interactions
1101
1250
  /* @__PURE__ */ jsxRuntime.jsxs(
1102
1251
  "div",
1103
1252
  {
1104
1253
  className: cn(
1105
- "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",
1106
- { "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 },
1107
1256
  className
1108
1257
  ),
1109
1258
  onKeyDown: (event) => {
@@ -1112,19 +1261,19 @@ var CodeEditor = ({
1112
1261
  }
1113
1262
  },
1114
1263
  children: [
1115
- (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 }) }) }),
1116
1265
  /* @__PURE__ */ jsxRuntime.jsx(
1117
1266
  CodeMirror__default.default,
1118
1267
  {
1119
1268
  theme: customTheme,
1120
1269
  value,
1121
- onChange,
1270
+ onChange: handleChange,
1122
1271
  extensions,
1123
1272
  autoFocus: withAutofocus,
1124
1273
  basicSetup: config
1125
1274
  }
1126
1275
  ),
1127
- !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: [
1128
1277
  help,
1129
1278
  withToggleCommentHint ? /* @__PURE__ */ jsxRuntime.jsx(ToggleComponentHelp, {}) : null,
1130
1279
  helpPostfix
@@ -1544,8 +1693,7 @@ function searchExtension() {
1544
1693
  function updateSearch(view, query, selectedMatchIndex) {
1545
1694
  view.dispatch({ effects: setSearchEffect.of({ query, selectedMatchIndex }) });
1546
1695
  }
1547
- var BASIS_SETUP2 = {
1548
- drawSelection: false,
1696
+ var OWN_KEYMAPS = {
1549
1697
  defaultKeymap: false,
1550
1698
  completionKeymap: false,
1551
1699
  searchKeymap: false
@@ -1610,8 +1758,11 @@ var SqlEditor = ({
1610
1758
  dialect
1611
1759
  }) => {
1612
1760
  const editorRef = react.useRef(null);
1613
- const customTheme = useThemedExtension(buildCustomTheme);
1614
- 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
+ );
1615
1766
  const extensions = react.useMemo(() => {
1616
1767
  const baseKeymap = [...commands.defaultKeymap, ...CUSTOM_KEYMAP];
1617
1768
  return [
@@ -1637,8 +1788,8 @@ var SqlEditor = ({
1637
1788
  themeExtension
1638
1789
  ]);
1639
1790
  const defaultSetup = react.useMemo(() => {
1640
- return { ...BASIS_SETUP2, lineNumbers };
1641
- }, [lineNumbers]);
1791
+ return { ...buildBasicSetup(readOnly), ...OWN_KEYMAPS, lineNumbers };
1792
+ }, [readOnly, lineNumbers]);
1642
1793
  react.useEffect(() => {
1643
1794
  if (editorRef.current?.view) {
1644
1795
  updateHighlighting(editorRef.current.view, highlightLines);
@@ -1704,25 +1855,25 @@ var LINE_HEIGHT_PX = 20;
1704
1855
  var PANE_HEADER_HEIGHT_PX = 58;
1705
1856
  var AcceptButton = ({ side, onAccept }) => {
1706
1857
  const label = `Accept ${side === "left" ? "production" : "branch"} version`;
1707
- const Chevron = side === "left" ? icons_exports.ChevronsRight : icons_exports.ChevronsLeft;
1708
- 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" }) });
1709
1860
  };
1710
1861
  var AcceptControls = ({ conflicts, side, onAccept, onDismiss, contentRef }) => /* @__PURE__ */ jsxRuntime.jsx(
1711
1862
  "div",
1712
1863
  {
1713
1864
  className: cn(
1714
- "tw-z-10 tw-flex tw-shrink-0 tw-flex-col tw-items-center",
1715
- 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"
1716
1867
  ),
1717
1868
  children: conflicts.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1718
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tw-shrink-0", style: { height: `${PANE_HEADER_HEIGHT_PX}px` } }),
1719
- /* @__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) => {
1720
1871
  const topLine = side === "left" ? conflict.oldStartLine : conflict.newStartLine;
1721
1872
  const topOffset = (topLine - 1) * LINE_HEIGHT_PX - 2;
1722
1873
  return /* @__PURE__ */ jsxRuntime.jsxs(
1723
1874
  "div",
1724
1875
  {
1725
- 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",
1726
1877
  style: { top: `${topOffset}px` },
1727
1878
  children: [
1728
1879
  /* @__PURE__ */ jsxRuntime.jsx(AcceptButton, { side, onAccept: () => onAccept(conflict) }),
@@ -1734,7 +1885,7 @@ var AcceptControls = ({ conflicts, side, onAccept, onDismiss, contentRef }) => /
1734
1885
  size: "icon-sm",
1735
1886
  title: "Dismiss",
1736
1887
  "aria-label": `Dismiss ${side === "left" ? "production" : "branch"} change`,
1737
- children: /* @__PURE__ */ jsxRuntime.jsx(icons_exports.X, { className: "tw-size-4" })
1888
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "tw:size-4" })
1738
1889
  }
1739
1890
  )
1740
1891
  ]
@@ -1831,13 +1982,15 @@ var MergePane = ({
1831
1982
  deleted = false
1832
1983
  }) => {
1833
1984
  const editorRef = react.useRef(null);
1985
+ const handleChange = useStableCallback((next) => onChange?.(next));
1834
1986
  const themeExtension = useThemedExtension(
1987
+ `merge-pane:${deleted}`,
1835
1988
  () => view.EditorView.theme({
1836
1989
  "&.cm-editor": {
1837
1990
  height: "100%",
1838
1991
  backgroundColor: deleted ? colors__default.default.error[100] : resolveToken("background", "249 250 251"),
1839
1992
  // Pair the token-driven surface with a token-driven text color so line
1840
- // content stays readable when the pane's `--color-background` goes dark.
1993
+ // content stays readable when the pane's `--background` goes dark.
1841
1994
  // The deleted pane keeps default dark text on its fixed light-red wash.
1842
1995
  ...deleted ? {} : { color: resolveToken("foreground", "30 41 59") },
1843
1996
  outline: "none"
@@ -1848,10 +2001,13 @@ var MergePane = ({
1848
2001
  },
1849
2002
  "*": { lineHeight: `${LINE_HEIGHT_PX}px` },
1850
2003
  ".cm-lineNumbers .cm-gutterElement": { padding: "0 0 0 25px" }
1851
- }),
1852
- [deleted]
2004
+ })
1853
2005
  );
1854
2006
  const diffHighlightExtension = react.useMemo(() => createDiffHighlightExtension(), []);
2007
+ const basicSetup = react.useMemo(
2008
+ () => ({ ...buildBasicSetup(readOnly), lineNumbers: true }),
2009
+ [readOnly]
2010
+ );
1855
2011
  const extensions = react.useMemo(
1856
2012
  () => [
1857
2013
  diffHighlightExtension,
@@ -1901,33 +2057,33 @@ var MergePane = ({
1901
2057
  "div",
1902
2058
  {
1903
2059
  className: cn(
1904
- "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",
1905
2061
  className,
1906
- deleted && "tw-border-error-300"
2062
+ deleted && "tw:border-error-300"
1907
2063
  ),
1908
2064
  children: [
1909
2065
  header && /* @__PURE__ */ jsxRuntime.jsx(
1910
2066
  "div",
1911
2067
  {
1912
2068
  className: cn(
1913
- "tw-px-4 tw-py-3",
1914
- 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",
1915
2071
  headerClassName
1916
2072
  ),
1917
2073
  children: header
1918
2074
  }
1919
2075
  ),
1920
- /* @__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(
1921
2077
  CodeMirror__default.default,
1922
2078
  {
1923
2079
  ref: editorRef,
1924
2080
  height: "100%",
1925
2081
  value,
1926
- onChange,
2082
+ onChange: handleChange,
1927
2083
  extensions,
1928
2084
  readOnly,
1929
2085
  onCreateEditor: handleCreateEditor,
1930
- basicSetup: { lineNumbers: true, drawSelection: false }
2086
+ basicSetup
1931
2087
  }
1932
2088
  ) })
1933
2089
  ]
@@ -2027,7 +2183,7 @@ var MergeEditor = ({
2027
2183
  "div",
2028
2184
  {
2029
2185
  className: cn(
2030
- "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",
2031
2187
  className
2032
2188
  ),
2033
2189
  children: [
@@ -2039,7 +2195,7 @@ var MergeEditor = ({
2039
2195
  lineClassification: leftClassification,
2040
2196
  readOnly: true,
2041
2197
  header: leftHeader,
2042
- className: "tw-rounded-r-lg tw-border tw-border-border",
2198
+ className: "tw:rounded-r-lg tw:border tw:border-border",
2043
2199
  onScrollDOMReady: registerScroller(0),
2044
2200
  deleted: leftDeleted
2045
2201
  }
@@ -2063,7 +2219,7 @@ var MergeEditor = ({
2063
2219
  onChange: handleMergeChange,
2064
2220
  header: middleHeader,
2065
2221
  headerClassName: middleHeaderClassName,
2066
- className: cn("tw-border tw-border-border tw-rounded-lg", middleClassName),
2222
+ className: cn("tw:border tw:border-border tw:rounded-lg", middleClassName),
2067
2223
  onScrollDOMReady: registerScroller(1)
2068
2224
  }
2069
2225
  ),
@@ -2085,7 +2241,7 @@ var MergeEditor = ({
2085
2241
  lineClassification: rightClassification,
2086
2242
  readOnly: true,
2087
2243
  header: rightHeader,
2088
- className: "tw-rounded-l-lg tw-border tw-border-border",
2244
+ className: "tw:rounded-l-lg tw:border tw:border-border",
2089
2245
  onScrollDOMReady: registerScroller(2),
2090
2246
  deleted: rightDeleted
2091
2247
  }
@@ -2096,7 +2252,9 @@ var MergeEditor = ({
2096
2252
  };
2097
2253
 
2098
2254
  exports.CodeEditor = CodeEditor;
2255
+ exports.LANGUAGE_MODES = LANGUAGE_MODES;
2099
2256
  exports.MergeEditor = MergeEditor;
2100
2257
  exports.SqlEditor = SqlEditor;
2258
+ exports.isLanguageMode = isLanguageMode;
2101
2259
  //# sourceMappingURL=editors.cjs.map
2102
2260
  //# sourceMappingURL=editors.cjs.map