@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.js CHANGED
@@ -1,4 +1,4 @@
1
- import { createContext, forwardRef, useMemo, useRef, useEffect, useCallback, useSyncExternalStore, useState, use, Children, Fragment as Fragment$1 } from 'react';
1
+ import { createContext, useMemo, useRef, useEffect, useCallback, useLayoutEffect, useSyncExternalStore, useState, use, Children, Fragment as Fragment$1 } from 'react';
2
2
  import { completeAnyWord, autocompletion } from '@codemirror/autocomplete';
3
3
  import { jsonParseLinter, json } from '@codemirror/lang-json';
4
4
  import { linter } from '@codemirror/lint';
@@ -12,37 +12,23 @@ import { cva } from 'class-variance-authority';
12
12
  import { keboolaLegacySidebar, keboolaLegacyTopnav } from '@keboola/brand-registry';
13
13
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
14
14
  import { Root, Slottable } from '@radix-ui/react-slot';
15
- import * as lucide_react_star from 'lucide-react';
15
+ import { X, ChevronsRight, ChevronsLeft, Loader2, Copy } from 'lucide-react';
16
16
  import { javascript } from '@codemirror/lang-javascript';
17
17
  import { python } from '@codemirror/lang-python';
18
- import { sql, PLSQL } from '@codemirror/lang-sql';
18
+ import { sql, PLSQL, MSSQL, PostgreSQL, MySQL } from '@codemirror/lang-sql';
19
19
  import { StreamLanguage } from '@codemirror/language';
20
20
  import { r } from '@codemirror/legacy-modes/mode/r';
21
21
  import { shell } from '@codemirror/legacy-modes/mode/shell';
22
+ import { toml } from '@codemirror/legacy-modes/mode/toml';
22
23
  import { githubLightInit } from '@uiw/codemirror-theme-github';
23
24
  import { sfsql } from '@keboola/codemirror-lang-sfsql';
24
25
  import colors from '@keboola/tailwind-config/colors';
26
+ import { simpleMode } from '@codemirror/legacy-modes/mode/simple-mode';
25
27
  import { defaultKeymap } from '@codemirror/commands';
26
28
  import { installExtensions } from '@keboola/codemirror-lang-sql';
27
29
  import { StateEffect, StateField, RangeSet, RangeSetBuilder } from '@codemirror/state';
28
30
 
29
- var __defProp = Object.defineProperty;
30
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
31
- var __getOwnPropNames = Object.getOwnPropertyNames;
32
- var __hasOwnProp = Object.prototype.hasOwnProperty;
33
- var __export = (target, all) => {
34
- for (var name in all)
35
- __defProp(target, name, { get: all[name], enumerable: true });
36
- };
37
- var __copyProps = (to, from, except, desc) => {
38
- if (from && typeof from === "object" || typeof from === "function") {
39
- for (let key of __getOwnPropNames(from))
40
- if (!__hasOwnProp.call(to, key) && key !== except)
41
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
42
- }
43
- return to;
44
- };
45
- var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget);
31
+ // src/components/CodeEditor/CodeEditor.tsx
46
32
 
47
33
  // src/constants/keyCodes.ts
48
34
  var keyCodes = {
@@ -50,8 +36,15 @@ var keyCodes = {
50
36
  ESCAPE: "Escape",
51
37
  SPACE: " "
52
38
  };
39
+ var useStableCallback = (callback) => {
40
+ const latestRef = useRef(callback);
41
+ useLayoutEffect(() => {
42
+ latestRef.current = callback;
43
+ }, [callback]);
44
+ return useCallback((...args) => latestRef.current(...args), []);
45
+ };
53
46
  var twMerge = extendTailwindMerge({
54
- prefix: "tw-"
47
+ prefix: "tw"
55
48
  });
56
49
  var cn = (...classes) => twMerge(clsx(...classes));
57
50
 
@@ -95,39 +88,39 @@ var useArgoDesign = () => use(ArgoDesignContext);
95
88
  var tooltipVariants = cva(
96
89
  [
97
90
  "tailwindcss-preflight",
98
- "tw-inline-block",
99
- "tw-break-anywhere",
100
- "tw-max-h-96",
101
- "tw-overflow-y-auto",
102
- "tw-z-[1060]",
91
+ "tw:inline-block",
92
+ "tw:break-anywhere",
93
+ "tw:max-h-96",
94
+ "tw:overflow-y-auto",
95
+ "tw:z-[1060]",
103
96
  // legacy (dark) chrome — default
104
- "tw-rounded",
105
- "tw-bg-neutral-800",
106
- "tw-text-white",
97
+ "tw:rounded",
98
+ "tw:bg-neutral-800",
99
+ "tw:text-white",
107
100
  // argo chrome overrides — semantic floating-panel tokens
108
- "data-[argo=true]:tw-rounded-2xl",
109
- "data-[argo=true]:tw-border",
110
- "data-[argo=true]:tw-border-solid",
111
- "data-[argo=true]:tw-border-border",
112
- "data-[argo=true]:tw-bg-popover",
113
- "data-[argo=true]:tw-text-popover-foreground",
114
- "data-[argo=true]:tw-shadow-md",
101
+ "tw:data-[argo=true]:rounded-2xl",
102
+ "tw:data-[argo=true]:border",
103
+ "tw:data-[argo=true]:border-solid",
104
+ "tw:data-[argo=true]:border-border",
105
+ "tw:data-[argo=true]:bg-popover",
106
+ "tw:data-[argo=true]:text-popover-foreground",
107
+ "tw:data-[argo=true]:shadow-md",
115
108
  // argo open animation
116
- "data-[argo=true]:data-[state=delayed-open]:tw-animate-in",
117
- "data-[argo=true]:data-[state=instant-open]:tw-animate-in",
118
- "data-[argo=true]:data-[state=delayed-open]:tw-fade-in-0",
119
- "data-[argo=true]:data-[state=instant-open]:tw-fade-in-0",
120
- "data-[argo=true]:data-[state=delayed-open]:tw-zoom-in-95",
121
- "data-[argo=true]:data-[state=instant-open]:tw-zoom-in-95",
109
+ "tw:data-[argo=true]:data-[state=delayed-open]:animate-in",
110
+ "tw:data-[argo=true]:data-[state=instant-open]:animate-in",
111
+ "tw:data-[argo=true]:data-[state=delayed-open]:fade-in-0",
112
+ "tw:data-[argo=true]:data-[state=instant-open]:fade-in-0",
113
+ "tw:data-[argo=true]:data-[state=delayed-open]:zoom-in-95",
114
+ "tw:data-[argo=true]:data-[state=instant-open]:zoom-in-95",
122
115
  // argo closed animation
123
- "data-[argo=true]:data-[state=closed]:tw-animate-out",
124
- "data-[argo=true]:data-[state=closed]:tw-fade-out-0",
125
- "data-[argo=true]:data-[state=closed]:tw-zoom-out-95",
116
+ "tw:data-[argo=true]:data-[state=closed]:animate-out",
117
+ "tw:data-[argo=true]:data-[state=closed]:fade-out-0",
118
+ "tw:data-[argo=true]:data-[state=closed]:zoom-out-95",
126
119
  // argo position animation
127
- "data-[argo=true]:data-[side=bottom]:tw-slide-in-from-top-2",
128
- "data-[argo=true]:data-[side=left]:tw-slide-in-from-right-2",
129
- "data-[argo=true]:data-[side=right]:tw-slide-in-from-left-2",
130
- "data-[argo=true]:data-[side=top]:tw-slide-in-from-bottom-2"
120
+ "tw:data-[argo=true]:data-[side=bottom]:slide-in-from-top-2",
121
+ "tw:data-[argo=true]:data-[side=left]:slide-in-from-right-2",
122
+ "tw:data-[argo=true]:data-[side=right]:slide-in-from-left-2",
123
+ "tw:data-[argo=true]:data-[side=top]:slide-in-from-bottom-2"
131
124
  ],
132
125
  {
133
126
  defaultVariants: {
@@ -136,22 +129,26 @@ var tooltipVariants = cva(
136
129
  variants: {
137
130
  variant: {
138
131
  action: [
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
- "tw-uppercase",
146
- "tw-tracking-wider"
132
+ "tw:max-w-fit",
133
+ "tw:px-3",
134
+ "tw:py-2",
135
+ "tw:text-center",
136
+ "tw:text-xs",
137
+ "tw:font-medium",
138
+ // Legacy chrome uppercases the action tooltip; the Keboola V2 brand
139
+ // (`data-brand="keboola"`) renders it in standard case instead.
140
+ "tw:uppercase",
141
+ "tw:tracking-wider",
142
+ "tw:[[data-brand=keboola]_&]:normal-case",
143
+ "tw:[[data-brand=keboola]_&]:tracking-normal"
147
144
  ],
148
145
  explanatory: [
149
- "tw-max-w-80",
150
- "tw-px-4",
151
- "tw-py-3",
152
- "tw-text-left",
153
- "tw-text-sm",
154
- "tw-font-normal"
146
+ "tw:max-w-80",
147
+ "tw:px-4",
148
+ "tw:py-3",
149
+ "tw:text-left",
150
+ "tw:text-sm",
151
+ "tw:font-normal"
155
152
  ]
156
153
  }
157
154
  }
@@ -225,8 +222,8 @@ var TooltipTrigger = ({
225
222
  // (merged in via Slot) activates Tailwind's preflight inside the
226
223
  // span, which sets `svg { display: block }` — without an inline-flex
227
224
  // container that would stack any bare Lucide icon onto its own
228
- // line. `tw-inline-flex tw-items-center` keeps icon + text aligned.
229
- /* @__PURE__ */ jsx("span", { className: "tw-inline-flex tw-items-center", children })
225
+ // line. `tw:inline-flex tw:items-center` keeps icon + text aligned.
226
+ /* @__PURE__ */ jsx("span", { className: "tw:inline-flex tw:items-center", children })
230
227
  )
231
228
  }
232
229
  );
@@ -241,6 +238,7 @@ var Tooltip = ({
241
238
  placement = "right",
242
239
  forceHide = false,
243
240
  forceShow = false,
241
+ delayDuration,
244
242
  // trigger props
245
243
  triggerAsChild = false
246
244
  }) => {
@@ -260,6 +258,7 @@ var Tooltip = ({
260
258
  {
261
259
  open: !!tooltip && (open || forceShow) && !forceHide,
262
260
  onOpenChange: setOpen,
261
+ delayDuration,
263
262
  disableHoverableContent: isActionVariant,
264
263
  children: [
265
264
  /* @__PURE__ */ jsx(
@@ -291,14 +290,14 @@ Tooltip.Trigger = TooltipTrigger;
291
290
 
292
291
  // src/utils/escapeStringRegexp.ts
293
292
  var escapeStringRegexp = (string) => string.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d");
294
- var helpVariants = cva(["tw-m-0", "tw-text-xs"], {
293
+ var helpVariants = cva(["tw:m-0", "tw:text-xs"], {
295
294
  defaultVariants: {
296
295
  state: "default"
297
296
  },
298
297
  variants: {
299
298
  state: {
300
- default: ["tw-text-muted-foreground"],
301
- warning: ["tw-text-warning"]
299
+ default: ["tw:text-muted-foreground"],
300
+ warning: ["tw:text-warning"]
302
301
  }
303
302
  }
304
303
  });
@@ -306,145 +305,49 @@ var HelpBlock = ({ children, className, state = "default", ...rest }) => {
306
305
  if (!children) return null;
307
306
  return /* @__PURE__ */ jsx("p", { ...rest, className: helpVariants({ state, className }), children });
308
307
  };
309
-
310
- // src/icons/index.ts
311
- var icons_exports = {};
312
- __export(icons_exports, {
313
- Google: () => Google,
314
- Keboola: () => Keboola,
315
- Microsoft: () => Microsoft
316
- });
317
- __reExport(icons_exports, lucide_react_star);
318
- var Google = forwardRef(
319
- ({ size = 24, className, children, ...rest }, ref) => /* @__PURE__ */ jsxs(
320
- "svg",
321
- {
322
- ref,
323
- xmlns: "http://www.w3.org/2000/svg",
324
- width: size,
325
- height: size,
326
- viewBox: "12 10 20 20",
327
- fill: "none",
328
- className: cn("lucide", className),
329
- ...rest,
330
- children: [
331
- /* @__PURE__ */ jsx(
332
- "path",
333
- {
334
- 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",
335
- fill: "#4285F4"
336
- }
337
- ),
338
- /* @__PURE__ */ jsx(
339
- "path",
340
- {
341
- 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",
342
- fill: "#34A853"
343
- }
344
- ),
345
- /* @__PURE__ */ jsx(
346
- "path",
347
- {
348
- 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",
349
- fill: "#FBBC04"
350
- }
351
- ),
352
- /* @__PURE__ */ jsx(
353
- "path",
354
- {
355
- 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",
356
- fill: "#EA4335"
357
- }
358
- ),
359
- children
360
- ]
361
- }
362
- )
363
- );
364
- Google.displayName = "Google";
365
- var Keboola = forwardRef(
366
- ({ size = 24, color = "currentColor", className, children, ...rest }, ref) => /* @__PURE__ */ jsxs(
367
- "svg",
368
- {
369
- ref,
370
- xmlns: "http://www.w3.org/2000/svg",
371
- width: size,
372
- height: size,
373
- viewBox: "0 0 300 512",
374
- fill: color,
375
- className: cn("lucide", className),
376
- ...rest,
377
- children: [
378
- /* @__PURE__ */ 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" }),
379
- children
380
- ]
381
- }
382
- )
383
- );
384
- Keboola.displayName = "Keboola";
385
- var Microsoft = forwardRef(
386
- ({ size = 24, className, children, ...rest }, ref) => /* @__PURE__ */ jsxs(
387
- "svg",
388
- {
389
- ref,
390
- xmlns: "http://www.w3.org/2000/svg",
391
- width: size,
392
- height: size,
393
- viewBox: "0 0 21 21",
394
- fill: "none",
395
- className: cn("lucide", className),
396
- ...rest,
397
- children: [
398
- /* @__PURE__ */ jsx("rect", { x: "0", y: "0", width: "10", height: "10", fill: "#F25022" }),
399
- /* @__PURE__ */ jsx("rect", { x: "11", y: "0", width: "10", height: "10", fill: "#7FBA00" }),
400
- /* @__PURE__ */ jsx("rect", { x: "0", y: "11", width: "10", height: "10", fill: "#00A4EF" }),
401
- /* @__PURE__ */ jsx("rect", { x: "11", y: "11", width: "10", height: "10", fill: "#FFB900" }),
402
- children
403
- ]
404
- }
405
- )
406
- );
407
- Microsoft.displayName = "Microsoft";
408
308
  var variants = cva(
409
309
  [
410
310
  "tailwindcss-preflight",
411
- "tw-group/button",
412
- "tw-border-box",
311
+ "tw:group/button",
312
+ "tw:border-box",
413
313
  // layout
414
- "tw-relative",
415
- "tw-flex",
416
- "tw-items-center",
417
- "tw-justify-center",
418
- "tw-gap-2",
314
+ "tw:relative",
315
+ "tw:flex",
316
+ "tw:items-center",
317
+ "tw:justify-center",
318
+ "tw:gap-2",
419
319
  // text — chrome weight/tracking are brand-overridable tokens
420
- // (`--font-weight-medium` / `--letter-spacing-chrome`); casing stays `tw-uppercase`.
421
- "tw-text-xs",
422
- "tw-leading-5",
423
- "tw-font-medium",
424
- "tw-tracking-chrome",
425
- "tw-uppercase",
320
+ // (`--font-weight-medium` / `--letter-spacing-chrome`). Casing: standard case is
321
+ // the default; only legacy brands (`keboola-legacy-*`) uppercase the chrome, so
322
+ // modern brands (incl. Keboola V2) read naturally. Mirrors the V2 standard-case
323
+ // treatment shipped for Tooltip/Badge (PR 7629).
324
+ "tw:text-xs",
325
+ "tw:leading-5",
326
+ "tw:font-medium",
327
+ "tw:[[data-brand^=keboola-legacy]_&]:tracking-chrome",
328
+ "tw:[[data-brand^=keboola-legacy]_&]:uppercase",
426
329
  // border — legacy (non-argo) chrome uses a fixed radius, not the brand token.
427
- "tw-rounded",
428
- "tw-border",
429
- "tw-border-transparent",
330
+ "tw:rounded",
331
+ "tw:border",
332
+ "tw:border-transparent",
430
333
  // styling
431
- "tw-shadow-none",
432
- "[a]:tw-cursor-pointer",
334
+ "tw:shadow-none",
335
+ "tw:[a]:cursor-pointer",
433
336
  // explicitly set for anchor
434
- "focus-visible:tw-outline",
435
- "focus-visible:tw-outline-1",
436
- "focus-visible:-tw-outline-offset-1",
437
- "focus-visible:tw-outline-ring",
438
- "focus-visible:tw-ring-4",
439
- "focus-visible:tw-ring-ring/30",
337
+ "tw:focus-visible:outline",
338
+ "tw:focus-visible:outline-1",
339
+ "tw:focus-visible:-outline-offset-1",
340
+ "tw:focus-visible:outline-ring",
341
+ "tw:focus-visible:ring-4",
342
+ "tw:focus-visible:ring-ring/30",
440
343
  // disabled
441
- "disabled:tw-opacity-40",
442
- "disabled:tw-cursor-not-allowed",
344
+ "tw:disabled:opacity-40",
345
+ "tw:disabled:cursor-not-allowed",
443
346
  // anchor support
444
- "!tw-no-underline",
445
- "aria-disabled:tw-opacity-40",
446
- "aria-disabled:tw-cursor-not-allowed",
447
- "[&_svg]:tw-shrink-0"
347
+ "tw:!no-underline",
348
+ "tw:aria-disabled:opacity-40",
349
+ "tw:aria-disabled:cursor-not-allowed",
350
+ "tw:[&_svg]:shrink-0"
448
351
  ],
449
352
  {
450
353
  defaultVariants: {
@@ -454,113 +357,113 @@ var variants = cva(
454
357
  },
455
358
  variants: {
456
359
  block: {
457
- true: ["tw-w-full"]
360
+ true: ["tw:w-full"]
458
361
  },
459
362
  variant: {
460
363
  primary: [
461
- "tw-text-white",
462
- "tw-bg-primary-500",
463
- "focus:tw-text-white",
464
- "hover:tw-text-white",
465
- "hover:not-disabled:tw-bg-primary-600",
466
- "active:not-disabled:tw-bg-primary-800",
364
+ "tw:text-white",
365
+ "tw:bg-primary-500",
366
+ "tw:focus:text-white",
367
+ "tw:hover:text-white",
368
+ "tw:hover:not-disabled:bg-primary-600",
369
+ "tw:active:not-disabled:bg-primary-800",
467
370
  // anchor disabled override
468
- "aria-disabled:!tw-bg-primary-500"
371
+ "tw:aria-disabled:!bg-primary-500"
469
372
  ],
470
373
  secondary: [
471
- "tw-text-white",
472
- "tw-bg-secondary-500",
473
- "focus:tw-text-white",
474
- "hover:tw-text-white",
475
- "hover:not-disabled:tw-bg-secondary-700",
476
- "active:not-disabled:tw-bg-secondary-800",
374
+ "tw:text-white",
375
+ "tw:bg-secondary-500",
376
+ "tw:focus:text-white",
377
+ "tw:hover:text-white",
378
+ "tw:hover:not-disabled:bg-secondary-700",
379
+ "tw:active:not-disabled:bg-secondary-800",
477
380
  // anchor disabled override
478
- "aria-disabled:!tw-bg-secondary-500"
381
+ "tw:aria-disabled:!bg-secondary-500"
479
382
  ],
480
383
  danger: [
481
- "tw-text-white",
482
- "tw-bg-error-500",
483
- "focus:tw-text-white",
484
- "hover:tw-text-white",
485
- "hover:not-disabled:tw-bg-error-600",
486
- "active:not-disabled:tw-bg-error-700",
384
+ "tw:text-white",
385
+ "tw:bg-error-500",
386
+ "tw:focus:text-white",
387
+ "tw:hover:text-white",
388
+ "tw:hover:not-disabled:bg-error-600",
389
+ "tw:active:not-disabled:bg-error-700",
487
390
  // anchor disabled override
488
- "aria-disabled:!tw-bg-error-500"
391
+ "tw:aria-disabled:!bg-error-500"
489
392
  ],
490
393
  invisible: [
491
- "tw-text-neutral-800",
492
- "tw-bg-transparent",
493
- "focus:tw-text-neutral-800",
494
- "hover:not-disabled:tw-bg-neutral-100",
495
- "hover:tw-text-neutral-800",
496
- "active:not-disabled:tw-bg-neutral-150",
394
+ "tw:text-neutral-800",
395
+ "tw:bg-transparent",
396
+ "tw:focus:text-neutral-800",
397
+ "tw:hover:not-disabled:bg-neutral-100",
398
+ "tw:hover:text-neutral-800",
399
+ "tw:active:not-disabled:bg-neutral-150",
497
400
  // contrasting icon on hover/active
498
- "[&_svg]:tw-text-neutral-400",
499
- "[&_svg]:hover:not-disabled:tw-text-secondary-600",
500
- "[&_svg]:active:not-disabled:tw-text-secondary-600",
401
+ "tw:[&_svg]:text-neutral-400",
402
+ "tw:hover:not-disabled:[&_svg]:text-secondary-600",
403
+ "tw:active:not-disabled:[&_svg]:text-secondary-600",
501
404
  // anchor disabled override
502
- "aria-disabled:!tw-bg-transparent"
405
+ "tw:aria-disabled:!bg-transparent"
503
406
  ],
504
407
  outline: [
505
- "tw-text-neutral-800",
506
- "tw-bg-white",
408
+ "tw:text-neutral-800",
409
+ "tw:bg-white",
507
410
  // border
508
- "!tw-border-neutral-200",
509
- "hover:tw-text-neutral-800",
510
- "focus:tw-text-neutral-800",
511
- "hover:not-disabled:!tw-border-neutral-300",
512
- "hover:not-disabled:tw-bg-neutral-100",
513
- "active:not-disabled:tw-bg-neutral-200",
411
+ "tw:!border-neutral-200",
412
+ "tw:hover:text-neutral-800",
413
+ "tw:focus:text-neutral-800",
414
+ "tw:hover:not-disabled:!border-neutral-300",
415
+ "tw:hover:not-disabled:bg-neutral-100",
416
+ "tw:active:not-disabled:bg-neutral-200",
514
417
  // contrasting icon hover, same as invisible
515
- "[&_svg]:tw-text-neutral-400",
516
- "[&_svg]:not-disabled:hover:tw-text-secondary-600",
517
- "[&_svg]:active:not-disabled:tw-text-secondary-600",
418
+ "tw:[&_svg]:text-neutral-400",
419
+ "tw:not-disabled:hover:[&_svg]:text-secondary-600",
420
+ "tw:active:not-disabled:[&_svg]:text-secondary-600",
518
421
  // anchor disabled override
519
- "aria-disabled:!tw-bg-white",
520
- "aria-disabled:!tw-border-neutral-200"
422
+ "tw:aria-disabled:!bg-white",
423
+ "tw:aria-disabled:!border-neutral-200"
521
424
  ],
522
425
  inline: [
523
- "tw-text-neutral-800",
524
- "tw-bg-transparent",
525
- "tw-rounded-full",
526
- "[&_svg]:tw-text-neutral-400",
527
- "[&_svg]:not-disabled:hover:tw-text-secondary-600",
528
- "[&_svg]:not-disabled:focus:tw-text-secondary-600"
426
+ "tw:text-neutral-800",
427
+ "tw:bg-transparent",
428
+ "tw:rounded-full",
429
+ "tw:[&_svg]:text-neutral-400",
430
+ "tw:not-disabled:hover:[&_svg]:text-secondary-600",
431
+ "tw:not-disabled:focus:[&_svg]:text-secondary-600"
529
432
  ]
530
433
  },
531
434
  size: {
532
435
  medium: [
533
- "tw-max-h-10",
534
- "tw-min-h-10",
535
- "tw-px-4",
536
- "tw-py-2.5",
537
- '[&_svg:not([class*="tw-size-"])]:tw-size-4'
436
+ "tw:max-h-10",
437
+ "tw:min-h-10",
438
+ "tw:px-4",
439
+ "tw:py-2.5",
440
+ 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
538
441
  ],
539
442
  small: [
540
- "tw-max-h-8",
541
- "tw-min-h-8",
542
- "tw-px-4",
543
- "tw-py-1.5",
544
- '[&_svg:not([class*="tw-size-"])]:tw-size-4'
443
+ "tw:max-h-8",
444
+ "tw:min-h-8",
445
+ "tw:px-4",
446
+ "tw:py-1.5",
447
+ 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
545
448
  ],
546
449
  large: [
547
- "tw-max-h-12",
548
- "tw-min-h-12",
549
- "tw-px-4",
550
- "tw-py-3.5",
551
- '[&_svg:not([class*="tw-size-"])]:tw-size-4'
450
+ "tw:max-h-12",
451
+ "tw:min-h-12",
452
+ "tw:px-4",
453
+ "tw:py-3.5",
454
+ 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
552
455
  ],
553
- "icon-lg": ["tw-size-12", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-6'],
554
- icon: ["tw-size-10", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-4'],
555
- "icon-sm": ["tw-size-8", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-4'],
556
- "icon-xs": ["tw-size-6", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-4'],
456
+ "icon-lg": ["tw:size-12", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-6'],
457
+ icon: ["tw:size-10", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
458
+ "icon-sm": ["tw:size-8", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
459
+ "icon-xs": ["tw:size-6", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
557
460
  "icon-2xs": [
558
- "!tw-inline-flex",
559
- "tw-size-5",
560
- "tw-max-h-5",
561
- '[&_svg:not([class*="tw-size-"])]:tw-size-3'
461
+ "tw:!inline-flex",
462
+ "tw:size-5",
463
+ "tw:max-h-5",
464
+ 'tw:[&_svg:not([class*="tw:size-"])]:size-3'
562
465
  ],
563
- "icon-3xs": ["tw-h-fit", "tw-w-fit", '[&_svg:not([class*="tw-size-"])]:tw-size-4']
466
+ "icon-3xs": ["tw:h-fit", "tw:w-fit", 'tw:[&_svg:not([class*="tw:size-"])]:size-4']
564
467
  }
565
468
  }
566
469
  }
@@ -569,37 +472,37 @@ var argoVariants = cva(
569
472
  [
570
473
  "tailwindcss-preflight",
571
474
  // layout
572
- "tw-relative",
573
- "tw-inline-flex",
574
- "tw-items-center",
575
- "tw-justify-center",
576
- "tw-whitespace-nowrap",
577
- "tw-gap-2",
475
+ "tw:relative",
476
+ "tw:inline-flex",
477
+ "tw:items-center",
478
+ "tw:justify-center",
479
+ "tw:whitespace-nowrap",
480
+ "tw:gap-2",
578
481
  // border
579
- "tw-border",
580
- "tw-border-transparent",
581
- "tw-rounded-[var(--radius-lg,0.25rem)]",
482
+ "tw:border",
483
+ "tw:border-transparent",
484
+ "tw:rounded-[var(--radius-lg,0.25rem)]",
582
485
  // text
583
- "tw-font-medium",
584
- "tw-select-none",
486
+ "tw:font-medium",
487
+ "tw:select-none",
585
488
  // focus visible
586
- "!tw-outline-none",
587
- "focus-visible:tw-ring-2",
489
+ "tw:!outline-hidden",
490
+ "tw:focus-visible:ring-2",
588
491
  // disabled
589
- "disabled:tw-cursor-not-allowed",
590
- "disabled:tw-opacity-50",
591
- "active:tw-opacity-60",
592
- "tw-transition-all",
593
- "tw-bg-clip-padding",
492
+ "tw:disabled:cursor-not-allowed",
493
+ "tw:disabled:opacity-50",
494
+ "tw:active:opacity-60",
495
+ "tw:transition-all",
496
+ "tw:bg-clip-padding",
594
497
  // anchor support
595
- "!tw-no-underline",
596
- "aria-disabled:tw-cursor-not-allowed",
597
- "aria-disabled:tw-opacity-50",
498
+ "tw:!no-underline",
499
+ "tw:aria-disabled:cursor-not-allowed",
500
+ "tw:aria-disabled:opacity-50",
598
501
  // icon
599
- "tw-shrink-0",
600
- "[&_svg]:tw-pointer-events-none",
601
- "[&_svg]:tw-shrink-0",
602
- "[&_svg:not([class*='tw-size-'])]:tw-size-4"
502
+ "tw:shrink-0",
503
+ "tw:[&_svg]:pointer-events-none",
504
+ "tw:[&_svg]:shrink-0",
505
+ "tw:[&_svg:not([class*='tw:size-'])]:size-4"
603
506
  ],
604
507
  {
605
508
  defaultVariants: {
@@ -608,77 +511,77 @@ var argoVariants = cva(
608
511
  },
609
512
  variants: {
610
513
  block: {
611
- true: ["tw-w-full"]
514
+ true: ["tw:w-full"]
612
515
  },
613
516
  variant: {
614
517
  primary: [
615
- "tw-bg-primary",
616
- "tw-text-primary-foreground",
617
- "[a]:hover:tw-bg-primary/80",
618
- "hover:not-disabled:tw-bg-primary/90",
619
- "hover:tw-text-primary-foreground",
620
- "focus:tw-text-primary-foreground",
621
- "focus-visible:tw-border-primary",
622
- "focus-visible:tw-ring-ring/50"
518
+ "tw:bg-primary",
519
+ "tw:text-primary-foreground",
520
+ "tw:[a]:hover:bg-primary/80",
521
+ "tw:hover:not-disabled:bg-primary/90",
522
+ "tw:hover:text-primary-foreground",
523
+ "tw:focus:text-primary-foreground",
524
+ "tw:focus-visible:border-primary",
525
+ "tw:focus-visible:ring-ring/50"
623
526
  ],
624
527
  secondary: [
625
- "tw-bg-primary/10",
626
- "tw-text-primary",
627
- "hover:not-disabled:tw-bg-primary/20",
628
- "focus-visible:tw-border-primary",
629
- "focus-visible:tw-ring-ring/50"
528
+ "tw:bg-primary/10",
529
+ "tw:text-primary",
530
+ "tw:hover:not-disabled:bg-primary/20",
531
+ "tw:focus-visible:border-primary",
532
+ "tw:focus-visible:ring-ring/50"
630
533
  ],
631
534
  // should be called "destructive" by Figma
632
535
  danger: [
633
- "tw-bg-destructive",
634
- "tw-text-destructive-foreground",
635
- "hover:tw-text-destructive-foreground",
636
- "focus:tw-text-destructive-foreground",
637
- "focus-visible:tw-border-destructive",
638
- "focus-visible:tw-ring-destructive/20"
536
+ "tw:bg-destructive",
537
+ "tw:text-destructive-foreground",
538
+ "tw:hover:text-destructive-foreground",
539
+ "tw:focus:text-destructive-foreground",
540
+ "tw:focus-visible:border-destructive",
541
+ "tw:focus-visible:ring-destructive/20"
639
542
  ],
640
543
  outline: [
641
- "!tw-border-input",
642
- "tw-bg-background",
544
+ "tw:!border-input",
545
+ "tw:bg-background",
643
546
  // Semantic base text color so the label/icon flips in dark mode
644
547
  // (matches `invisible`); previously unset → inherited a fixed dark color.
645
- "tw-text-foreground",
548
+ "tw:text-foreground",
646
549
  // Hover follows the brand primary (translucent tint), matching the
647
550
  // `secondary` variant — not the fixed `accent` blue.
648
- "hover:not-disabled:tw-bg-primary/10",
649
- "hover:not-disabled:tw-text-primary",
650
- "hover:active:tw-bg-background",
651
- "focus-visible:!tw-border-primary",
652
- "focus-visible:tw-ring-ring/50"
551
+ "tw:hover:not-disabled:bg-primary/10",
552
+ "tw:hover:not-disabled:text-primary",
553
+ "tw:hover:active:bg-background",
554
+ "tw:focus-visible:!border-primary",
555
+ "tw:focus-visible:ring-ring/50"
653
556
  ],
654
557
  // should be called "ghost" by Figma
655
558
  invisible: [
656
- "tw-bg-transparent",
657
- "tw-text-foreground",
658
- "hover:not-disabled:tw-bg-primary/10",
659
- "hover:not-disabled:tw-text-primary",
660
- "hover:not-disabled:tw-border-primary/10",
661
- "focus-visible:tw-ring-ring/50"
559
+ "tw:bg-transparent",
560
+ "tw:text-foreground",
561
+ "tw:hover:not-disabled:bg-primary/10",
562
+ "tw:hover:not-disabled:text-primary",
563
+ "tw:hover:not-disabled:border-primary/10",
564
+ "tw:focus-visible:ring-ring/50"
662
565
  ],
663
566
  // should be called "link" by Figma
664
567
  inline: [
665
- "tw-bg-transparent",
666
- "tw-text-primary",
667
- "hover:tw-underline",
668
- "hover:active:tw-bg-transparent",
669
- "focus-visible:tw-ring-ring/50"
568
+ "tw:bg-transparent",
569
+ "tw:text-primary",
570
+ "tw:hover:underline",
571
+ "tw:hover:active:bg-transparent",
572
+ "tw:focus-visible:ring-ring/50"
670
573
  ]
671
574
  },
672
575
  size: {
673
576
  // should be called "default" by Figma
674
- medium: ["tw-max-h-9", "tw-py-2", "tw-px-4", "tw-text-sm"],
577
+ medium: ["tw:max-h-9", "tw:py-2", "tw:px-4", "tw:text-sm"],
675
578
  // should be called "small" by Figma
676
- small: ["tw-max-h-8", "tw-py-2", "tw-px-3", "tw-text-xs"],
579
+ small: ["tw:max-h-8", "tw:py-2", "tw:px-3", "tw:text-xs"],
677
580
  // should be called "large" by Figma
678
- large: ["tw-max-h-10", "tw-py-2.5", "tw-px-6", "tw-text-sm"],
679
- "icon-lg": ["tw-size-10"],
680
- icon: ["tw-size-9"],
681
- "icon-sm": ["tw-size-8"],
581
+ large: ["tw:max-h-10", "tw:py-2.5", "tw:px-6", "tw:text-sm"],
582
+ "icon-lg": ["tw:size-10"],
583
+ icon: ["tw:size-9"],
584
+ "icon-sm": ["tw:size-8"],
682
585
  // unsupported in ARGO, remove when old design is gone
683
586
  "icon-xs": [],
684
587
  "icon-2xs": [],
@@ -726,13 +629,13 @@ var Button = ({
726
629
  onClick: handleClick,
727
630
  className: cn(classNames),
728
631
  children: [
729
- isLoading && /* @__PURE__ */ jsx(icons_exports.Loader2, { className: "tw-size-4 tw-shrink-0 tw-animate-spin" }),
632
+ isLoading && /* @__PURE__ */ jsx(Loader2, { className: "tw:size-4 tw:shrink-0 tw:animate-spin" }),
730
633
  /* @__PURE__ */ jsx(Slottable, { children: isLoading && isIconOnly ? null : children })
731
634
  ]
732
635
  }
733
636
  );
734
637
  };
735
- var Clipboard = ({
638
+ var Clipboard2 = ({
736
639
  ref,
737
640
  text: textProp,
738
641
  children,
@@ -757,6 +660,7 @@ var Clipboard = ({
757
660
  }
758
661
  };
759
662
  const handleOnClick = (event) => {
663
+ setIsTooltipOpen(true);
760
664
  if (text && state === "ready") void copy(text);
761
665
  onClick?.(event);
762
666
  };
@@ -771,6 +675,7 @@ var Clipboard = ({
771
675
  return tooltip;
772
676
  })();
773
677
  const tooltipVariant = state === "ready" && !!text ? tooltipVariantProp : "action";
678
+ const hasTooltipContent = tooltipContent !== null && tooltipContent !== void 0;
774
679
  return /* @__PURE__ */ jsxs(Tooltip.Root, { open: isTooltipOpen, onOpenChange: handleOnOpenChange, children: [
775
680
  /* @__PURE__ */ jsx(
776
681
  Tooltip.Trigger,
@@ -779,12 +684,12 @@ var Clipboard = ({
779
684
  asChild,
780
685
  keepOpenOnClick: true,
781
686
  onClick: handleOnClick,
782
- className: cn("tw-cursor-pointer", className),
687
+ className: cn("tw:cursor-pointer", className),
783
688
  ref,
784
689
  children: children ?? text
785
690
  }
786
691
  ),
787
- /* @__PURE__ */ jsx(
692
+ hasTooltipContent && /* @__PURE__ */ jsx(
788
693
  Tooltip.Content,
789
694
  {
790
695
  keepOpenOnPointerDownOutside: true,
@@ -795,7 +700,7 @@ var Clipboard = ({
795
700
  )
796
701
  ] });
797
702
  };
798
- var DEFAULT_ICON = /* @__PURE__ */ jsx(icons_exports.Copy, {});
703
+ var DEFAULT_ICON = /* @__PURE__ */ jsx(Copy, {});
799
704
  var DEFAULT_ARIA_LABEL = "Copy";
800
705
  var ClipboardButton = ({
801
706
  // clipboard props
@@ -812,7 +717,7 @@ var ClipboardButton = ({
812
717
  const defaultAriaLabel = typeof tooltip === "string" && tooltip.trim() ? tooltip : DEFAULT_ARIA_LABEL;
813
718
  const ariaLabel = rest["aria-label"] ?? (children == null ? defaultAriaLabel : void 0);
814
719
  return /* @__PURE__ */ jsx(
815
- Clipboard,
720
+ Clipboard2,
816
721
  {
817
722
  asChild: true,
818
723
  tooltip,
@@ -828,13 +733,198 @@ var ClipboardButton = ({
828
733
  };
829
734
  var ButtonToolbar = ({ value, children }) => {
830
735
  if (!value && !children) return null;
831
- return /* @__PURE__ */ 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: [
736
+ return /* @__PURE__ */ 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: [
832
737
  !!value && /* @__PURE__ */ jsx(ClipboardButton, { size: "icon-sm", variant: "invisible", text: value }),
833
738
  children
834
739
  ] });
835
740
  };
741
+ var COMMANDS = [
742
+ "run-operation",
743
+ "source freshness",
744
+ "docs generate",
745
+ "run",
746
+ "test",
747
+ "seed",
748
+ "snapshot",
749
+ "list",
750
+ "ls",
751
+ "compile",
752
+ "build",
753
+ "deps"
754
+ ];
755
+ var ARGUMENTS = ["--select", "--exclude", "--selector", "--defer", "--resource-type", "-s"];
756
+ var METHODS = [
757
+ "path:",
758
+ "source:",
759
+ "tag:",
760
+ "package:",
761
+ "config:",
762
+ "test_type:",
763
+ "test_name:",
764
+ "state:",
765
+ "exposure:",
766
+ "metric:",
767
+ "result:",
768
+ "source_status:",
769
+ "column_name:"
770
+ ];
771
+ var FLAGS = [
772
+ "--fail-fast",
773
+ "--warn-error",
774
+ "--favor-state",
775
+ "--vars",
776
+ "--models",
777
+ "--threads",
778
+ "--profiles-dir",
779
+ "--profile",
780
+ "--full-refresh"
781
+ ];
782
+ var word = (list) => new RegExp(`^\\s+(?:${list.join("|")})\\b`, "i");
783
+ var prefix = (list) => new RegExp(`^\\s+(?:${list.join("|")})`, "i");
784
+ var dbt = simpleMode({
785
+ start: [
786
+ { regex: /"(?:[^\\]|\\.)*?(?:"|$)/, token: "string" },
787
+ { regex: /dbt/, token: "keyword", sol: true },
788
+ { regex: word(COMMANDS), token: "keyword" },
789
+ { regex: word(ARGUMENTS), token: "variableName" },
790
+ { regex: prefix(METHODS), token: "propertyName" },
791
+ { regex: prefix(FLAGS), token: "attributeName" },
792
+ { regex: /(?:@|\*|,|\+\d+|\d+\+|\+)/, token: "operator" },
793
+ { regex: /'.*'/, token: "string" },
794
+ { regex: /true|false/, token: "atom" }
795
+ ]
796
+ });
797
+
798
+ // src/components/CodeEditor/modes/jsonnet.ts
799
+ var COMMENT_END = /^\*\//;
800
+ var COMMENT_START = /^\/\/|^#/;
801
+ var C_COMMENT_START = /^\/\*/;
802
+ var TEXT_BLOCK = /^\|\|\|/;
803
+ var TEXT_BLOCK_END = /^\s*\|\|\|/;
804
+ var RAW_DOUBLE = /^""/;
805
+ var RAW_SINGLE = /^''/;
806
+ var CLOSE_DOUBLE = /^"/;
807
+ var CLOSE_SINGLE = /^'/;
808
+ var ESCAPE = /^\\[\\"'/bfnrt0]/;
809
+ var UNICODE_ESCAPE = /^\\u[0-9a-fA-F]{4}/;
810
+ var BACKSLASH = /^\\/;
811
+ var IMPORT = /^import(?:str)?\s*(@?)(["'])/;
812
+ var QUOTE = /^(@?)(["'])/;
813
+ var ROOT = /^\$/;
814
+ var NUMBER = /^(?:\.\d+|\d+\.?\d*)(?:e[-+]?\d+)?/i;
815
+ var OPERATOR = /^[-+/*=<>!&~^|$%]+/;
816
+ var IDENTIFIER = /^[a-zA-Z_][a-zA-Z0-9_]*/;
817
+ var KEYWORDS = {
818
+ local: "keyword",
819
+ self: "keyword",
820
+ super: "keyword",
821
+ assert: "keyword",
822
+ function: "keyword",
823
+ if: "keyword",
824
+ then: "keyword",
825
+ else: "keyword",
826
+ for: "keyword",
827
+ in: "keyword",
828
+ tailstrict: "keyword",
829
+ error: "keyword",
830
+ true: "atom",
831
+ false: "atom",
832
+ null: "atom"
833
+ };
834
+ var jsonnet = {
835
+ name: "jsonnet",
836
+ startState: () => ({
837
+ cComment: false,
838
+ textBlock: false,
839
+ textBlockIndent: null,
840
+ string: false,
841
+ importString: false,
842
+ stringSingle: false,
843
+ stringRaw: false
844
+ }),
845
+ token: (stream, state) => {
846
+ if (state.cComment) {
847
+ if (stream.match(COMMENT_END)) {
848
+ state.cComment = false;
849
+ return "comment";
850
+ }
851
+ stream.next();
852
+ return "comment";
853
+ }
854
+ if (state.textBlock) {
855
+ if (state.textBlockIndent == null) {
856
+ if (stream.match(TEXT_BLOCK_END)) {
857
+ state.textBlock = false;
858
+ return "string";
859
+ }
860
+ state.textBlockIndent = stream.indentation();
861
+ }
862
+ if (stream.indentation() >= state.textBlockIndent) {
863
+ stream.skipToEnd();
864
+ return "string";
865
+ }
866
+ if (stream.match(TEXT_BLOCK_END)) {
867
+ state.textBlock = false;
868
+ return "string";
869
+ }
870
+ stream.next();
871
+ return "invalid";
872
+ }
873
+ if (state.string || state.importString) {
874
+ const style = state.string ? "string" : "meta";
875
+ if (state.stringRaw) {
876
+ if (stream.match(state.stringSingle ? RAW_SINGLE : RAW_DOUBLE)) return "escape";
877
+ } else {
878
+ if (stream.match(ESCAPE)) return "escape";
879
+ if (stream.match(UNICODE_ESCAPE)) return "escape";
880
+ if (stream.match(BACKSLASH)) return "invalid";
881
+ }
882
+ if (stream.match(state.stringSingle ? CLOSE_SINGLE : CLOSE_DOUBLE)) {
883
+ state.string = false;
884
+ state.importString = false;
885
+ return style;
886
+ }
887
+ stream.next();
888
+ return style;
889
+ }
890
+ if (stream.match(COMMENT_START)) {
891
+ stream.skipToEnd();
892
+ return "comment";
893
+ }
894
+ if (stream.match(C_COMMENT_START)) {
895
+ state.cComment = true;
896
+ return "comment";
897
+ }
898
+ const imported = stream.match(IMPORT);
899
+ if (Array.isArray(imported)) {
900
+ state.importString = true;
901
+ state.stringRaw = imported[1] === "@";
902
+ state.stringSingle = imported[2] === "'";
903
+ return "meta";
904
+ }
905
+ const quoted = stream.match(QUOTE);
906
+ if (Array.isArray(quoted)) {
907
+ state.string = true;
908
+ state.stringRaw = quoted[1] === "@";
909
+ state.stringSingle = quoted[2] === "'";
910
+ return "string";
911
+ }
912
+ if (stream.match(TEXT_BLOCK)) {
913
+ state.textBlock = true;
914
+ state.textBlockIndent = null;
915
+ return "string";
916
+ }
917
+ if (stream.match(ROOT)) return "keyword";
918
+ if (stream.match(NUMBER)) return "number";
919
+ if (stream.match(OPERATOR)) return "operator";
920
+ const identifier = stream.match(IDENTIFIER);
921
+ if (Array.isArray(identifier)) return KEYWORDS[identifier[0]] ?? null;
922
+ stream.next();
923
+ return null;
924
+ }
925
+ };
836
926
  var resolveToken = (token, fallbackChannels, alpha) => {
837
- const channels = typeof document === "undefined" ? fallbackChannels : getComputedStyle(document.documentElement).getPropertyValue(`--color-${token}`).trim() || fallbackChannels;
927
+ const channels = typeof document === "undefined" ? fallbackChannels : getComputedStyle(document.documentElement).getPropertyValue(`--${token}`).trim() || fallbackChannels;
838
928
  return alpha === void 0 ? `rgb(${channels})` : `rgb(${channels} / ${alpha})`;
839
929
  };
840
930
  var SSR_SIGNAL = "ssr";
@@ -854,12 +944,38 @@ var subscribeThemeSignal = (onChange) => {
854
944
  return () => observer.disconnect();
855
945
  };
856
946
  var useThemeSignal = () => useSyncExternalStore(subscribeThemeSignal, readThemeSignal, () => SSR_SIGNAL);
857
- var useThemedExtension = (build, deps = []) => {
947
+ var themeCache = /* @__PURE__ */ new Map();
948
+ var useThemedExtension = (cacheKey, build) => {
858
949
  const themeSignal = useThemeSignal();
859
- return useMemo(build, [themeSignal, ...deps]);
950
+ const key = `${themeSignal} ${cacheKey}`;
951
+ let cached = themeCache.get(key);
952
+ if (!cached) {
953
+ cached = build();
954
+ themeCache.set(key, cached);
955
+ }
956
+ return cached;
860
957
  };
861
958
 
862
959
  // src/components/CodeEditor/helpers.ts
960
+ var LANGUAGE_MODES = [
961
+ "application/json",
962
+ "text/plain",
963
+ "text/x-python",
964
+ "text/x-sql",
965
+ "text/x-mysql",
966
+ "text/x-pgsql",
967
+ "text/x-mssql",
968
+ "text/x-sfsql",
969
+ "text/x-plsql",
970
+ "text/x-rsrc",
971
+ "text/x-sh",
972
+ "text/x-toml",
973
+ "text/jsonnet",
974
+ "text/x-dbt",
975
+ "text/javascript",
976
+ "text/typescript"
977
+ ];
978
+ var isLanguageMode = (mode) => LANGUAGE_MODES.includes(mode);
863
979
  var buildBaseThemeStyles = () => ({
864
980
  "*": { lineHeight: "20px" },
865
981
  "*::selection": {
@@ -900,7 +1016,27 @@ var buildBaseThemeStyles = () => ({
900
1016
  ".cm-changeGutter": { position: "absolute", zIndex: -1, width: "100%", paddingLeft: 0 },
901
1017
  '&[class*="cm-merge-"] .cm-changedLine,&[class*="cm-merge-"] .cm-line, &[class*="cm-merge-"] .cm-deletedChunk': { paddingLeft: 0 }
902
1018
  });
903
- var BASIS_SETUP = { drawSelection: false };
1019
+ var ALWAYS_OFF = {
1020
+ drawSelection: false,
1021
+ foldGutter: false,
1022
+ foldKeymap: false,
1023
+ highlightActiveLine: false,
1024
+ highlightActiveLineGutter: false
1025
+ };
1026
+ var buildBasicSetup = (readOnly) => ({
1027
+ ...ALWAYS_OFF,
1028
+ ...readOnly ? {
1029
+ history: false,
1030
+ historyKeymap: false,
1031
+ closeBrackets: false,
1032
+ closeBracketsKeymap: false,
1033
+ lintKeymap: false,
1034
+ indentOnInput: false,
1035
+ rectangularSelection: false,
1036
+ dropCursor: false,
1037
+ highlightSelectionMatches: false
1038
+ } : null
1039
+ });
904
1040
  var buildCustomTheme = () => githubLightInit({
905
1041
  settings: {
906
1042
  fontFamily: `'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New'`,
@@ -915,10 +1051,19 @@ var buildCustomTheme = () => githubLightInit({
915
1051
  });
916
1052
  var getLanguageMode = (mode) => {
917
1053
  switch (mode) {
1054
+ case void 0:
1055
+ case "application/json":
1056
+ return json();
918
1057
  case "text/x-python":
919
1058
  return python();
920
1059
  case "text/x-sql":
921
1060
  return sql({ upperCaseKeywords: true });
1061
+ case "text/x-mysql":
1062
+ return sql({ upperCaseKeywords: true, dialect: MySQL });
1063
+ case "text/x-pgsql":
1064
+ return sql({ upperCaseKeywords: true, dialect: PostgreSQL });
1065
+ case "text/x-mssql":
1066
+ return sql({ upperCaseKeywords: true, dialect: MSSQL });
922
1067
  case "text/x-sfsql":
923
1068
  return StreamLanguage.define(sfsql);
924
1069
  case "text/x-plsql":
@@ -927,28 +1072,32 @@ var getLanguageMode = (mode) => {
927
1072
  return StreamLanguage.define(r);
928
1073
  case "text/x-sh":
929
1074
  return StreamLanguage.define(shell);
1075
+ case "text/x-toml":
1076
+ return StreamLanguage.define(toml);
1077
+ case "text/jsonnet":
1078
+ return StreamLanguage.define(jsonnet);
1079
+ case "text/x-dbt":
1080
+ return StreamLanguage.define(dbt);
930
1081
  case "text/javascript":
931
1082
  return javascript({ jsx: true });
932
1083
  case "text/typescript":
933
1084
  return javascript({ jsx: true, typescript: true });
1085
+ // No language — `text/plain` lands here, and so does any mode added to
1086
+ // LANGUAGE_MODES without an arm above. Unstyled text is the safe degradation;
1087
+ // a `json()` default would colour unrelated content as if it were JSON.
934
1088
  default:
935
- return json();
1089
+ return [];
936
1090
  }
937
1091
  };
938
- var KbdSeparator = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { ...props, className: cn("tw-text-xs tw-text-muted-foreground", className) });
939
- var KbdGroup = ({
940
- ref,
941
- className,
942
- children,
943
- separator,
944
- ...props
945
- }) => {
1092
+ var shouldLintJson = (mode, readOnly) => mode === "application/json" && !readOnly;
1093
+ var KbdSeparator = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { ...props, className: cn("tw:text-xs tw:text-muted-foreground", className) });
1094
+ var KbdGroup = ({ ref, className, children, separator, ...props }) => {
946
1095
  return /* @__PURE__ */ jsx(
947
1096
  "kbd",
948
1097
  {
949
1098
  ...props,
950
1099
  ref,
951
- className: cn("tw-inline-flex", "tw-items-center", "tw-gap-1", className),
1100
+ className: cn("tw:inline-flex", "tw:items-center", "tw:gap-1", className),
952
1101
  children: separator ? (
953
1102
  // oxlint-disable-next-line react-x/no-children-to-array
954
1103
  Children.toArray(children).map((child, index) => (
@@ -966,22 +1115,22 @@ var kbdVariants = cva(
966
1115
  [
967
1116
  "tailwindcss-preflight",
968
1117
  // style
969
- "tw-pointer-events-none",
970
- "tw-w-fit",
971
- "tw-h-5",
972
- "tw-min-w-5",
1118
+ "tw:pointer-events-none",
1119
+ "tw:w-fit",
1120
+ "tw:h-5",
1121
+ "tw:min-w-5",
973
1122
  // layout
974
- "tw-inline-flex",
975
- "tw-items-center",
976
- "tw-justify-center",
977
- "tw-gap-1",
978
- "tw-shrink-0",
1123
+ "tw:inline-flex",
1124
+ "tw:items-center",
1125
+ "tw:justify-center",
1126
+ "tw:gap-1",
1127
+ "tw:shrink-0",
979
1128
  // spacing
980
- "tw-px-1",
981
- '[&_svg:not([class*="size-"])]:tw-size-2.5',
982
- "tw-text-xs",
983
- "tw-font-medium",
984
- "tw-rounded"
1129
+ "tw:px-1",
1130
+ 'tw:[&_svg:not([class*="size-"])]:size-2.5',
1131
+ "tw:text-xs",
1132
+ "tw:font-medium",
1133
+ "tw:rounded"
985
1134
  ],
986
1135
  {
987
1136
  defaultVariants: {
@@ -989,8 +1138,8 @@ var kbdVariants = cva(
989
1138
  },
990
1139
  variants: {
991
1140
  variant: {
992
- default: "tw-bg-muted tw-text-muted-foreground",
993
- primary: "tw-bg-white/20 tw-text-white"
1141
+ default: "tw:bg-muted tw:text-muted-foreground",
1142
+ primary: "tw:bg-white/20 tw:text-white"
994
1143
  }
995
1144
  }
996
1145
  }
@@ -1013,6 +1162,7 @@ var CodeEditor = ({
1013
1162
  onChange,
1014
1163
  mode = "application/json",
1015
1164
  placeholder: placeholder$1 = "",
1165
+ ariaLabel,
1016
1166
  readOnly = false,
1017
1167
  autocompletions = emptyArray,
1018
1168
  extraKeys = emptyObject,
@@ -1021,19 +1171,23 @@ var CodeEditor = ({
1021
1171
  withLineNumbers = true,
1022
1172
  withLineWrapping = true,
1023
1173
  withCollapseUnchanged = false,
1024
- withCopyButton = true,
1174
+ withCopyButton = false,
1025
1175
  completeAny = false,
1026
1176
  help = null,
1027
1177
  helpPostfix = null,
1028
1178
  renderAdditionalButtons,
1029
1179
  className
1030
1180
  }) => {
1031
- const customTheme = useThemedExtension(buildCustomTheme);
1032
- const baseTheme = useThemedExtension(() => EditorView.theme(buildBaseThemeStyles()));
1181
+ const handleChange = useStableCallback((next) => onChange?.(next));
1182
+ const customTheme = useThemedExtension("editor:syntax", buildCustomTheme);
1183
+ const baseTheme = useThemedExtension(
1184
+ "code-editor:chrome",
1185
+ () => EditorView.theme(buildBaseThemeStyles())
1186
+ );
1033
1187
  const commonExtensions = useMemo(() => {
1034
1188
  return [
1035
1189
  getLanguageMode(mode),
1036
- mode === "application/json" && linter(jsonParseLinter()),
1190
+ shouldLintJson(mode, readOnly) ? linter(jsonParseLinter()) : [],
1037
1191
  withLineWrapping ? EditorView.lineWrapping : [],
1038
1192
  EditorState.languageData.of(() => [
1039
1193
  { autocomplete: completeAny ? completeAnyWord : autocompletions }
@@ -1048,10 +1202,20 @@ var CodeEditor = ({
1048
1202
  }
1049
1203
  }))
1050
1204
  ),
1051
- autocompletion({ activateOnTyping: completeAny }),
1205
+ readOnly ? [] : autocompletion({ activateOnTyping: completeAny }),
1206
+ ariaLabel ? EditorView.contentAttributes.of({ "aria-label": ariaLabel }) : [],
1052
1207
  baseTheme
1053
- ].filter(Boolean);
1054
- }, [autocompletions, completeAny, extraKeys, mode, withLineWrapping, baseTheme]);
1208
+ ];
1209
+ }, [
1210
+ autocompletions,
1211
+ completeAny,
1212
+ extraKeys,
1213
+ mode,
1214
+ readOnly,
1215
+ withLineWrapping,
1216
+ baseTheme,
1217
+ ariaLabel
1218
+ ]);
1055
1219
  const extensions = useMemo(() => {
1056
1220
  return [
1057
1221
  ...commonExtensions,
@@ -1068,18 +1232,20 @@ var CodeEditor = ({
1068
1232
  }, [commonExtensions, placeholder$1, readOnly, previousValue, withCollapseUnchanged]);
1069
1233
  const config = useMemo(() => {
1070
1234
  return {
1071
- ...BASIS_SETUP,
1235
+ ...buildBasicSetup(readOnly),
1072
1236
  lineNumbers: withLineNumbers
1073
1237
  };
1074
- }, [withLineNumbers]);
1238
+ }, [withLineNumbers, readOnly]);
1239
+ const additionalButtons = renderAdditionalButtons?.(value);
1240
+ const hasToolbar = withCopyButton && !!value || !!additionalButtons;
1075
1241
  return (
1076
1242
  // oxlint-disable-next-line jsx-a11y/no-static-element-interactions
1077
1243
  /* @__PURE__ */ jsxs(
1078
1244
  "div",
1079
1245
  {
1080
1246
  className: cn(
1081
- "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",
1082
- { "tw-mt-5": !!renderAdditionalButtons },
1247
+ "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",
1248
+ { "tw:mt-8": hasToolbar },
1083
1249
  className
1084
1250
  ),
1085
1251
  onKeyDown: (event) => {
@@ -1088,19 +1254,19 @@ var CodeEditor = ({
1088
1254
  }
1089
1255
  },
1090
1256
  children: [
1091
- (withCopyButton || renderAdditionalButtons) && /* @__PURE__ */ 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__ */ jsx("div", { className: "tw-flex-1", children: /* @__PURE__ */ jsx(ButtonToolbar, { value: withCopyButton ? value : void 0, children: renderAdditionalButtons?.(value) }) }) }),
1257
+ hasToolbar && /* @__PURE__ */ 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__ */ jsx("div", { className: "tw:flex-1", children: /* @__PURE__ */ jsx(ButtonToolbar, { value: withCopyButton ? value : void 0, children: additionalButtons }) }) }),
1092
1258
  /* @__PURE__ */ jsx(
1093
1259
  CodeMirror,
1094
1260
  {
1095
1261
  theme: customTheme,
1096
1262
  value,
1097
- onChange,
1263
+ onChange: handleChange,
1098
1264
  extensions,
1099
1265
  autoFocus: withAutofocus,
1100
1266
  basicSetup: config
1101
1267
  }
1102
1268
  ),
1103
- !readOnly && (withToggleCommentHint || help || helpPostfix) && /* @__PURE__ */ jsxs(HelpBlock, { className: "tw-mt-2 tw-flex tw-flex-wrap tw-gap-1", children: [
1269
+ !readOnly && (withToggleCommentHint || help || helpPostfix) && /* @__PURE__ */ jsxs(HelpBlock, { className: "tw:mt-2 tw:flex tw:flex-wrap tw:gap-1", children: [
1104
1270
  help,
1105
1271
  withToggleCommentHint ? /* @__PURE__ */ jsx(ToggleComponentHelp, {}) : null,
1106
1272
  helpPostfix
@@ -1520,8 +1686,7 @@ function searchExtension() {
1520
1686
  function updateSearch(view, query, selectedMatchIndex) {
1521
1687
  view.dispatch({ effects: setSearchEffect.of({ query, selectedMatchIndex }) });
1522
1688
  }
1523
- var BASIS_SETUP2 = {
1524
- drawSelection: false,
1689
+ var OWN_KEYMAPS = {
1525
1690
  defaultKeymap: false,
1526
1691
  completionKeymap: false,
1527
1692
  searchKeymap: false
@@ -1586,8 +1751,11 @@ var SqlEditor = ({
1586
1751
  dialect
1587
1752
  }) => {
1588
1753
  const editorRef = useRef(null);
1589
- const customTheme = useThemedExtension(buildCustomTheme);
1590
- const themeExtension = useThemedExtension(() => EditorView$1.theme(buildTheme()));
1754
+ const customTheme = useThemedExtension("editor:syntax", buildCustomTheme);
1755
+ const themeExtension = useThemedExtension(
1756
+ "sql-editor:chrome",
1757
+ () => EditorView$1.theme(buildTheme())
1758
+ );
1591
1759
  const extensions = useMemo(() => {
1592
1760
  const baseKeymap = [...defaultKeymap, ...CUSTOM_KEYMAP];
1593
1761
  return [
@@ -1613,8 +1781,8 @@ var SqlEditor = ({
1613
1781
  themeExtension
1614
1782
  ]);
1615
1783
  const defaultSetup = useMemo(() => {
1616
- return { ...BASIS_SETUP2, lineNumbers };
1617
- }, [lineNumbers]);
1784
+ return { ...buildBasicSetup(readOnly), ...OWN_KEYMAPS, lineNumbers };
1785
+ }, [readOnly, lineNumbers]);
1618
1786
  useEffect(() => {
1619
1787
  if (editorRef.current?.view) {
1620
1788
  updateHighlighting(editorRef.current.view, highlightLines);
@@ -1680,25 +1848,25 @@ var LINE_HEIGHT_PX = 20;
1680
1848
  var PANE_HEADER_HEIGHT_PX = 58;
1681
1849
  var AcceptButton = ({ side, onAccept }) => {
1682
1850
  const label = `Accept ${side === "left" ? "production" : "branch"} version`;
1683
- const Chevron = side === "left" ? icons_exports.ChevronsRight : icons_exports.ChevronsLeft;
1684
- return /* @__PURE__ */ jsx(Button, { onClick: onAccept, variant: "outline", size: "icon-sm", title: label, "aria-label": label, children: /* @__PURE__ */ jsx(Chevron, { className: "tw-size-5" }) });
1851
+ const Chevron = side === "left" ? ChevronsRight : ChevronsLeft;
1852
+ return /* @__PURE__ */ jsx(Button, { onClick: onAccept, variant: "outline", size: "icon-sm", title: label, "aria-label": label, children: /* @__PURE__ */ jsx(Chevron, { className: "tw:size-5" }) });
1685
1853
  };
1686
1854
  var AcceptControls = ({ conflicts, side, onAccept, onDismiss, contentRef }) => /* @__PURE__ */ jsx(
1687
1855
  "div",
1688
1856
  {
1689
1857
  className: cn(
1690
- "tw-z-10 tw-flex tw-shrink-0 tw-flex-col tw-items-center",
1691
- conflicts.length > 0 ? "tw-w-7" : "tw-w-0"
1858
+ "tw:z-10 tw:flex tw:shrink-0 tw:flex-col tw:items-center",
1859
+ conflicts.length > 0 ? "tw:w-7" : "tw:w-0"
1692
1860
  ),
1693
1861
  children: conflicts.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
1694
- /* @__PURE__ */ jsx("div", { className: "tw-shrink-0", style: { height: `${PANE_HEADER_HEIGHT_PX}px` } }),
1695
- /* @__PURE__ */ jsx("div", { className: "tw-relative tw-w-full tw-flex-1 tw-overflow-y-clip tw-overflow-x-visible", children: /* @__PURE__ */ jsx("div", { ref: contentRef, className: "tw-relative tw-size-full", children: conflicts.map((conflict) => {
1862
+ /* @__PURE__ */ jsx("div", { className: "tw:shrink-0", style: { height: `${PANE_HEADER_HEIGHT_PX}px` } }),
1863
+ /* @__PURE__ */ jsx("div", { className: "tw:relative tw:w-full tw:flex-1 tw:overflow-y-clip tw:overflow-x-visible", children: /* @__PURE__ */ jsx("div", { ref: contentRef, className: "tw:relative tw:size-full", children: conflicts.map((conflict) => {
1696
1864
  const topLine = side === "left" ? conflict.oldStartLine : conflict.newStartLine;
1697
1865
  const topOffset = (topLine - 1) * LINE_HEIGHT_PX - 2;
1698
1866
  return /* @__PURE__ */ jsxs(
1699
1867
  "div",
1700
1868
  {
1701
- className: "tw-absolute tw-inset-x-0 tw-flex tw-flex-col tw-items-center tw-gap-0.5",
1869
+ className: "tw:absolute tw:inset-x-0 tw:flex tw:flex-col tw:items-center tw:gap-0.5",
1702
1870
  style: { top: `${topOffset}px` },
1703
1871
  children: [
1704
1872
  /* @__PURE__ */ jsx(AcceptButton, { side, onAccept: () => onAccept(conflict) }),
@@ -1710,7 +1878,7 @@ var AcceptControls = ({ conflicts, side, onAccept, onDismiss, contentRef }) => /
1710
1878
  size: "icon-sm",
1711
1879
  title: "Dismiss",
1712
1880
  "aria-label": `Dismiss ${side === "left" ? "production" : "branch"} change`,
1713
- children: /* @__PURE__ */ jsx(icons_exports.X, { className: "tw-size-4" })
1881
+ children: /* @__PURE__ */ jsx(X, { className: "tw:size-4" })
1714
1882
  }
1715
1883
  )
1716
1884
  ]
@@ -1807,13 +1975,15 @@ var MergePane = ({
1807
1975
  deleted = false
1808
1976
  }) => {
1809
1977
  const editorRef = useRef(null);
1978
+ const handleChange = useStableCallback((next) => onChange?.(next));
1810
1979
  const themeExtension = useThemedExtension(
1980
+ `merge-pane:${deleted}`,
1811
1981
  () => EditorView.theme({
1812
1982
  "&.cm-editor": {
1813
1983
  height: "100%",
1814
1984
  backgroundColor: deleted ? colors.error[100] : resolveToken("background", "249 250 251"),
1815
1985
  // Pair the token-driven surface with a token-driven text color so line
1816
- // content stays readable when the pane's `--color-background` goes dark.
1986
+ // content stays readable when the pane's `--background` goes dark.
1817
1987
  // The deleted pane keeps default dark text on its fixed light-red wash.
1818
1988
  ...deleted ? {} : { color: resolveToken("foreground", "30 41 59") },
1819
1989
  outline: "none"
@@ -1824,10 +1994,13 @@ var MergePane = ({
1824
1994
  },
1825
1995
  "*": { lineHeight: `${LINE_HEIGHT_PX}px` },
1826
1996
  ".cm-lineNumbers .cm-gutterElement": { padding: "0 0 0 25px" }
1827
- }),
1828
- [deleted]
1997
+ })
1829
1998
  );
1830
1999
  const diffHighlightExtension = useMemo(() => createDiffHighlightExtension(), []);
2000
+ const basicSetup = useMemo(
2001
+ () => ({ ...buildBasicSetup(readOnly), lineNumbers: true }),
2002
+ [readOnly]
2003
+ );
1831
2004
  const extensions = useMemo(
1832
2005
  () => [
1833
2006
  diffHighlightExtension,
@@ -1877,33 +2050,33 @@ var MergePane = ({
1877
2050
  "div",
1878
2051
  {
1879
2052
  className: cn(
1880
- "tw-flex tw-min-w-0 tw-flex-1 tw-flex-col tw-overflow-hidden",
2053
+ "tw:flex tw:min-w-0 tw:flex-1 tw:flex-col tw:overflow-hidden",
1881
2054
  className,
1882
- deleted && "tw-border-error-300"
2055
+ deleted && "tw:border-error-300"
1883
2056
  ),
1884
2057
  children: [
1885
2058
  header && /* @__PURE__ */ jsx(
1886
2059
  "div",
1887
2060
  {
1888
2061
  className: cn(
1889
- "tw-px-4 tw-py-3",
1890
- deleted ? "tw-border-b tw-border-error-200 tw-bg-error-100" : "tw-bg-background",
2062
+ "tw:px-4 tw:py-3",
2063
+ deleted ? "tw:border-b tw:border-error-200 tw:bg-error-100" : "tw:bg-background",
1891
2064
  headerClassName
1892
2065
  ),
1893
2066
  children: header
1894
2067
  }
1895
2068
  ),
1896
- /* @__PURE__ */ jsx("div", { className: "tw-flex tw-h-0 tw-flex-1 tw-flex-col [&_>div]:tw-h-full", children: /* @__PURE__ */ jsx(
2069
+ /* @__PURE__ */ jsx("div", { className: "tw:flex tw:h-0 tw:flex-1 tw:flex-col tw:[&_>div]:h-full", children: /* @__PURE__ */ jsx(
1897
2070
  CodeMirror,
1898
2071
  {
1899
2072
  ref: editorRef,
1900
2073
  height: "100%",
1901
2074
  value,
1902
- onChange,
2075
+ onChange: handleChange,
1903
2076
  extensions,
1904
2077
  readOnly,
1905
2078
  onCreateEditor: handleCreateEditor,
1906
- basicSetup: { lineNumbers: true, drawSelection: false }
2079
+ basicSetup
1907
2080
  }
1908
2081
  ) })
1909
2082
  ]
@@ -2003,7 +2176,7 @@ var MergeEditor = ({
2003
2176
  "div",
2004
2177
  {
2005
2178
  className: cn(
2006
- "tw-flex tw-h-full tw-min-h-0 tw-overflow-hidden tw-bg-background tw-gap-3",
2179
+ "tw:flex tw:h-full tw:min-h-0 tw:overflow-hidden tw:bg-background tw:gap-3",
2007
2180
  className
2008
2181
  ),
2009
2182
  children: [
@@ -2015,7 +2188,7 @@ var MergeEditor = ({
2015
2188
  lineClassification: leftClassification,
2016
2189
  readOnly: true,
2017
2190
  header: leftHeader,
2018
- className: "tw-rounded-r-lg tw-border tw-border-border",
2191
+ className: "tw:rounded-r-lg tw:border tw:border-border",
2019
2192
  onScrollDOMReady: registerScroller(0),
2020
2193
  deleted: leftDeleted
2021
2194
  }
@@ -2039,7 +2212,7 @@ var MergeEditor = ({
2039
2212
  onChange: handleMergeChange,
2040
2213
  header: middleHeader,
2041
2214
  headerClassName: middleHeaderClassName,
2042
- className: cn("tw-border tw-border-border tw-rounded-lg", middleClassName),
2215
+ className: cn("tw:border tw:border-border tw:rounded-lg", middleClassName),
2043
2216
  onScrollDOMReady: registerScroller(1)
2044
2217
  }
2045
2218
  ),
@@ -2061,7 +2234,7 @@ var MergeEditor = ({
2061
2234
  lineClassification: rightClassification,
2062
2235
  readOnly: true,
2063
2236
  header: rightHeader,
2064
- className: "tw-rounded-l-lg tw-border tw-border-border",
2237
+ className: "tw:rounded-l-lg tw:border tw:border-border",
2065
2238
  onScrollDOMReady: registerScroller(2),
2066
2239
  deleted: rightDeleted
2067
2240
  }
@@ -2071,6 +2244,6 @@ var MergeEditor = ({
2071
2244
  );
2072
2245
  };
2073
2246
 
2074
- export { CodeEditor, MergeEditor, SqlEditor };
2247
+ export { CodeEditor, LANGUAGE_MODES, MergeEditor, SqlEditor, isLanguageMode };
2075
2248
  //# sourceMappingURL=editors.js.map
2076
2249
  //# sourceMappingURL=editors.js.map