@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.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
  );
@@ -293,14 +290,14 @@ Tooltip.Trigger = TooltipTrigger;
293
290
 
294
291
  // src/utils/escapeStringRegexp.ts
295
292
  var escapeStringRegexp = (string) => string.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d");
296
- var helpVariants = cva(["tw-m-0", "tw-text-xs"], {
293
+ var helpVariants = cva(["tw:m-0", "tw:text-xs"], {
297
294
  defaultVariants: {
298
295
  state: "default"
299
296
  },
300
297
  variants: {
301
298
  state: {
302
- default: ["tw-text-muted-foreground"],
303
- warning: ["tw-text-warning"]
299
+ default: ["tw:text-muted-foreground"],
300
+ warning: ["tw:text-warning"]
304
301
  }
305
302
  }
306
303
  });
@@ -308,146 +305,49 @@ var HelpBlock = ({ children, className, state = "default", ...rest }) => {
308
305
  if (!children) return null;
309
306
  return /* @__PURE__ */ jsx("p", { ...rest, className: helpVariants({ state, className }), children });
310
307
  };
311
-
312
- // src/icons/index.ts
313
- var icons_exports = {};
314
- __export(icons_exports, {
315
- Google: () => Google,
316
- Keboola: () => Keboola,
317
- Microsoft: () => Microsoft
318
- });
319
- __reExport(icons_exports, lucide_react_star);
320
- var Google = forwardRef(
321
- ({ size = 24, className, children, ...rest }, ref) => /* @__PURE__ */ jsxs(
322
- "svg",
323
- {
324
- ref,
325
- xmlns: "http://www.w3.org/2000/svg",
326
- width: size,
327
- height: size,
328
- viewBox: "12 10 20 20",
329
- fill: "none",
330
- className: cn("lucide", className),
331
- ...rest,
332
- children: [
333
- /* @__PURE__ */ jsx(
334
- "path",
335
- {
336
- 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",
337
- fill: "#4285F4"
338
- }
339
- ),
340
- /* @__PURE__ */ jsx(
341
- "path",
342
- {
343
- 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",
344
- fill: "#34A853"
345
- }
346
- ),
347
- /* @__PURE__ */ jsx(
348
- "path",
349
- {
350
- 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",
351
- fill: "#FBBC04"
352
- }
353
- ),
354
- /* @__PURE__ */ jsx(
355
- "path",
356
- {
357
- 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",
358
- fill: "#EA4335"
359
- }
360
- ),
361
- children
362
- ]
363
- }
364
- )
365
- );
366
- Google.displayName = "Google";
367
- var Keboola = forwardRef(
368
- ({ size = 24, color = "currentColor", className, children, ...rest }, ref) => /* @__PURE__ */ jsxs(
369
- "svg",
370
- {
371
- ref,
372
- xmlns: "http://www.w3.org/2000/svg",
373
- width: size,
374
- height: size,
375
- viewBox: "0 0 300 512",
376
- overflow: "visible",
377
- fill: color,
378
- className: cn("lucide", className),
379
- ...rest,
380
- children: [
381
- /* @__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" }),
382
- children
383
- ]
384
- }
385
- )
386
- );
387
- Keboola.displayName = "Keboola";
388
- var Microsoft = forwardRef(
389
- ({ size = 24, className, children, ...rest }, ref) => /* @__PURE__ */ jsxs(
390
- "svg",
391
- {
392
- ref,
393
- xmlns: "http://www.w3.org/2000/svg",
394
- width: size,
395
- height: size,
396
- viewBox: "0 0 21 21",
397
- fill: "none",
398
- className: cn("lucide", className),
399
- ...rest,
400
- children: [
401
- /* @__PURE__ */ jsx("rect", { x: "0", y: "0", width: "10", height: "10", fill: "#F25022" }),
402
- /* @__PURE__ */ jsx("rect", { x: "11", y: "0", width: "10", height: "10", fill: "#7FBA00" }),
403
- /* @__PURE__ */ jsx("rect", { x: "0", y: "11", width: "10", height: "10", fill: "#00A4EF" }),
404
- /* @__PURE__ */ jsx("rect", { x: "11", y: "11", width: "10", height: "10", fill: "#FFB900" }),
405
- children
406
- ]
407
- }
408
- )
409
- );
410
- Microsoft.displayName = "Microsoft";
411
308
  var variants = cva(
412
309
  [
413
310
  "tailwindcss-preflight",
414
- "tw-group/button",
415
- "tw-border-box",
311
+ "tw:group/button",
312
+ "tw:border-box",
416
313
  // layout
417
- "tw-relative",
418
- "tw-flex",
419
- "tw-items-center",
420
- "tw-justify-center",
421
- "tw-gap-2",
314
+ "tw:relative",
315
+ "tw:flex",
316
+ "tw:items-center",
317
+ "tw:justify-center",
318
+ "tw:gap-2",
422
319
  // text — chrome weight/tracking are brand-overridable tokens
423
- // (`--font-weight-medium` / `--letter-spacing-chrome`); casing stays `tw-uppercase`.
424
- "tw-text-xs",
425
- "tw-leading-5",
426
- "tw-font-medium",
427
- "tw-tracking-chrome",
428
- "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",
429
329
  // border — legacy (non-argo) chrome uses a fixed radius, not the brand token.
430
- "tw-rounded",
431
- "tw-border",
432
- "tw-border-transparent",
330
+ "tw:rounded",
331
+ "tw:border",
332
+ "tw:border-transparent",
433
333
  // styling
434
- "tw-shadow-none",
435
- "[a]:tw-cursor-pointer",
334
+ "tw:shadow-none",
335
+ "tw:[a]:cursor-pointer",
436
336
  // explicitly set for anchor
437
- "focus-visible:tw-outline",
438
- "focus-visible:tw-outline-1",
439
- "focus-visible:-tw-outline-offset-1",
440
- "focus-visible:tw-outline-ring",
441
- "focus-visible:tw-ring-4",
442
- "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",
443
343
  // disabled
444
- "disabled:tw-opacity-40",
445
- "disabled:tw-cursor-not-allowed",
344
+ "tw:disabled:opacity-40",
345
+ "tw:disabled:cursor-not-allowed",
446
346
  // anchor support
447
- "!tw-no-underline",
448
- "aria-disabled:tw-opacity-40",
449
- "aria-disabled:tw-cursor-not-allowed",
450
- "[&_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"
451
351
  ],
452
352
  {
453
353
  defaultVariants: {
@@ -457,113 +357,113 @@ var variants = cva(
457
357
  },
458
358
  variants: {
459
359
  block: {
460
- true: ["tw-w-full"]
360
+ true: ["tw:w-full"]
461
361
  },
462
362
  variant: {
463
363
  primary: [
464
- "tw-text-white",
465
- "tw-bg-primary-500",
466
- "focus:tw-text-white",
467
- "hover:tw-text-white",
468
- "hover:not-disabled:tw-bg-primary-600",
469
- "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",
470
370
  // anchor disabled override
471
- "aria-disabled:!tw-bg-primary-500"
371
+ "tw:aria-disabled:!bg-primary-500"
472
372
  ],
473
373
  secondary: [
474
- "tw-text-white",
475
- "tw-bg-secondary-500",
476
- "focus:tw-text-white",
477
- "hover:tw-text-white",
478
- "hover:not-disabled:tw-bg-secondary-700",
479
- "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",
480
380
  // anchor disabled override
481
- "aria-disabled:!tw-bg-secondary-500"
381
+ "tw:aria-disabled:!bg-secondary-500"
482
382
  ],
483
383
  danger: [
484
- "tw-text-white",
485
- "tw-bg-error-500",
486
- "focus:tw-text-white",
487
- "hover:tw-text-white",
488
- "hover:not-disabled:tw-bg-error-600",
489
- "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",
490
390
  // anchor disabled override
491
- "aria-disabled:!tw-bg-error-500"
391
+ "tw:aria-disabled:!bg-error-500"
492
392
  ],
493
393
  invisible: [
494
- "tw-text-neutral-800",
495
- "tw-bg-transparent",
496
- "focus:tw-text-neutral-800",
497
- "hover:not-disabled:tw-bg-neutral-100",
498
- "hover:tw-text-neutral-800",
499
- "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",
500
400
  // contrasting icon on hover/active
501
- "[&_svg]:tw-text-neutral-400",
502
- "[&_svg]:hover:not-disabled:tw-text-secondary-600",
503
- "[&_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",
504
404
  // anchor disabled override
505
- "aria-disabled:!tw-bg-transparent"
405
+ "tw:aria-disabled:!bg-transparent"
506
406
  ],
507
407
  outline: [
508
- "tw-text-neutral-800",
509
- "tw-bg-white",
408
+ "tw:text-neutral-800",
409
+ "tw:bg-white",
510
410
  // border
511
- "!tw-border-neutral-200",
512
- "hover:tw-text-neutral-800",
513
- "focus:tw-text-neutral-800",
514
- "hover:not-disabled:!tw-border-neutral-300",
515
- "hover:not-disabled:tw-bg-neutral-100",
516
- "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",
517
417
  // contrasting icon hover, same as invisible
518
- "[&_svg]:tw-text-neutral-400",
519
- "[&_svg]:not-disabled:hover:tw-text-secondary-600",
520
- "[&_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",
521
421
  // anchor disabled override
522
- "aria-disabled:!tw-bg-white",
523
- "aria-disabled:!tw-border-neutral-200"
422
+ "tw:aria-disabled:!bg-white",
423
+ "tw:aria-disabled:!border-neutral-200"
524
424
  ],
525
425
  inline: [
526
- "tw-text-neutral-800",
527
- "tw-bg-transparent",
528
- "tw-rounded-full",
529
- "[&_svg]:tw-text-neutral-400",
530
- "[&_svg]:not-disabled:hover:tw-text-secondary-600",
531
- "[&_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"
532
432
  ]
533
433
  },
534
434
  size: {
535
435
  medium: [
536
- "tw-max-h-10",
537
- "tw-min-h-10",
538
- "tw-px-4",
539
- "tw-py-2.5",
540
- '[&_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'
541
441
  ],
542
442
  small: [
543
- "tw-max-h-8",
544
- "tw-min-h-8",
545
- "tw-px-4",
546
- "tw-py-1.5",
547
- '[&_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'
548
448
  ],
549
449
  large: [
550
- "tw-max-h-12",
551
- "tw-min-h-12",
552
- "tw-px-4",
553
- "tw-py-3.5",
554
- '[&_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'
555
455
  ],
556
- "icon-lg": ["tw-size-12", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-6'],
557
- icon: ["tw-size-10", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-4'],
558
- "icon-sm": ["tw-size-8", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-4'],
559
- "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'],
560
460
  "icon-2xs": [
561
- "!tw-inline-flex",
562
- "tw-size-5",
563
- "tw-max-h-5",
564
- '[&_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'
565
465
  ],
566
- "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']
567
467
  }
568
468
  }
569
469
  }
@@ -572,37 +472,37 @@ var argoVariants = cva(
572
472
  [
573
473
  "tailwindcss-preflight",
574
474
  // layout
575
- "tw-relative",
576
- "tw-inline-flex",
577
- "tw-items-center",
578
- "tw-justify-center",
579
- "tw-whitespace-nowrap",
580
- "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",
581
481
  // border
582
- "tw-border",
583
- "tw-border-transparent",
584
- "tw-rounded-[var(--radius-lg,0.25rem)]",
482
+ "tw:border",
483
+ "tw:border-transparent",
484
+ "tw:rounded-[var(--radius-lg,0.25rem)]",
585
485
  // text
586
- "tw-font-medium",
587
- "tw-select-none",
486
+ "tw:font-medium",
487
+ "tw:select-none",
588
488
  // focus visible
589
- "!tw-outline-none",
590
- "focus-visible:tw-ring-2",
489
+ "tw:!outline-hidden",
490
+ "tw:focus-visible:ring-2",
591
491
  // disabled
592
- "disabled:tw-cursor-not-allowed",
593
- "disabled:tw-opacity-50",
594
- "active:tw-opacity-60",
595
- "tw-transition-all",
596
- "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",
597
497
  // anchor support
598
- "!tw-no-underline",
599
- "aria-disabled:tw-cursor-not-allowed",
600
- "aria-disabled:tw-opacity-50",
498
+ "tw:!no-underline",
499
+ "tw:aria-disabled:cursor-not-allowed",
500
+ "tw:aria-disabled:opacity-50",
601
501
  // icon
602
- "tw-shrink-0",
603
- "[&_svg]:tw-pointer-events-none",
604
- "[&_svg]:tw-shrink-0",
605
- "[&_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"
606
506
  ],
607
507
  {
608
508
  defaultVariants: {
@@ -611,77 +511,77 @@ var argoVariants = cva(
611
511
  },
612
512
  variants: {
613
513
  block: {
614
- true: ["tw-w-full"]
514
+ true: ["tw:w-full"]
615
515
  },
616
516
  variant: {
617
517
  primary: [
618
- "tw-bg-primary",
619
- "tw-text-primary-foreground",
620
- "[a]:hover:tw-bg-primary/80",
621
- "hover:not-disabled:tw-bg-primary/90",
622
- "hover:tw-text-primary-foreground",
623
- "focus:tw-text-primary-foreground",
624
- "focus-visible:tw-border-primary",
625
- "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"
626
526
  ],
627
527
  secondary: [
628
- "tw-bg-primary/10",
629
- "tw-text-primary",
630
- "hover:not-disabled:tw-bg-primary/20",
631
- "focus-visible:tw-border-primary",
632
- "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"
633
533
  ],
634
534
  // should be called "destructive" by Figma
635
535
  danger: [
636
- "tw-bg-destructive",
637
- "tw-text-destructive-foreground",
638
- "hover:tw-text-destructive-foreground",
639
- "focus:tw-text-destructive-foreground",
640
- "focus-visible:tw-border-destructive",
641
- "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"
642
542
  ],
643
543
  outline: [
644
- "!tw-border-input",
645
- "tw-bg-background",
544
+ "tw:!border-input",
545
+ "tw:bg-background",
646
546
  // Semantic base text color so the label/icon flips in dark mode
647
547
  // (matches `invisible`); previously unset → inherited a fixed dark color.
648
- "tw-text-foreground",
548
+ "tw:text-foreground",
649
549
  // Hover follows the brand primary (translucent tint), matching the
650
550
  // `secondary` variant — not the fixed `accent` blue.
651
- "hover:not-disabled:tw-bg-primary/10",
652
- "hover:not-disabled:tw-text-primary",
653
- "hover:active:tw-bg-background",
654
- "focus-visible:!tw-border-primary",
655
- "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"
656
556
  ],
657
557
  // should be called "ghost" by Figma
658
558
  invisible: [
659
- "tw-bg-transparent",
660
- "tw-text-foreground",
661
- "hover:not-disabled:tw-bg-primary/10",
662
- "hover:not-disabled:tw-text-primary",
663
- "hover:not-disabled:tw-border-primary/10",
664
- "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"
665
565
  ],
666
566
  // should be called "link" by Figma
667
567
  inline: [
668
- "tw-bg-transparent",
669
- "tw-text-primary",
670
- "hover:tw-underline",
671
- "hover:active:tw-bg-transparent",
672
- "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"
673
573
  ]
674
574
  },
675
575
  size: {
676
576
  // should be called "default" by Figma
677
- 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"],
678
578
  // should be called "small" by Figma
679
- 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"],
680
580
  // should be called "large" by Figma
681
- large: ["tw-max-h-10", "tw-py-2.5", "tw-px-6", "tw-text-sm"],
682
- "icon-lg": ["tw-size-10"],
683
- icon: ["tw-size-9"],
684
- "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"],
685
585
  // unsupported in ARGO, remove when old design is gone
686
586
  "icon-xs": [],
687
587
  "icon-2xs": [],
@@ -729,13 +629,13 @@ var Button = ({
729
629
  onClick: handleClick,
730
630
  className: cn(classNames),
731
631
  children: [
732
- 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" }),
733
633
  /* @__PURE__ */ jsx(Slottable, { children: isLoading && isIconOnly ? null : children })
734
634
  ]
735
635
  }
736
636
  );
737
637
  };
738
- var Clipboard = ({
638
+ var Clipboard2 = ({
739
639
  ref,
740
640
  text: textProp,
741
641
  children,
@@ -760,6 +660,7 @@ var Clipboard = ({
760
660
  }
761
661
  };
762
662
  const handleOnClick = (event) => {
663
+ setIsTooltipOpen(true);
763
664
  if (text && state === "ready") void copy(text);
764
665
  onClick?.(event);
765
666
  };
@@ -774,6 +675,7 @@ var Clipboard = ({
774
675
  return tooltip;
775
676
  })();
776
677
  const tooltipVariant = state === "ready" && !!text ? tooltipVariantProp : "action";
678
+ const hasTooltipContent = tooltipContent !== null && tooltipContent !== void 0;
777
679
  return /* @__PURE__ */ jsxs(Tooltip.Root, { open: isTooltipOpen, onOpenChange: handleOnOpenChange, children: [
778
680
  /* @__PURE__ */ jsx(
779
681
  Tooltip.Trigger,
@@ -782,12 +684,12 @@ var Clipboard = ({
782
684
  asChild,
783
685
  keepOpenOnClick: true,
784
686
  onClick: handleOnClick,
785
- className: cn("tw-cursor-pointer", className),
687
+ className: cn("tw:cursor-pointer", className),
786
688
  ref,
787
689
  children: children ?? text
788
690
  }
789
691
  ),
790
- /* @__PURE__ */ jsx(
692
+ hasTooltipContent && /* @__PURE__ */ jsx(
791
693
  Tooltip.Content,
792
694
  {
793
695
  keepOpenOnPointerDownOutside: true,
@@ -798,7 +700,7 @@ var Clipboard = ({
798
700
  )
799
701
  ] });
800
702
  };
801
- var DEFAULT_ICON = /* @__PURE__ */ jsx(icons_exports.Copy, {});
703
+ var DEFAULT_ICON = /* @__PURE__ */ jsx(Copy, {});
802
704
  var DEFAULT_ARIA_LABEL = "Copy";
803
705
  var ClipboardButton = ({
804
706
  // clipboard props
@@ -815,7 +717,7 @@ var ClipboardButton = ({
815
717
  const defaultAriaLabel = typeof tooltip === "string" && tooltip.trim() ? tooltip : DEFAULT_ARIA_LABEL;
816
718
  const ariaLabel = rest["aria-label"] ?? (children == null ? defaultAriaLabel : void 0);
817
719
  return /* @__PURE__ */ jsx(
818
- Clipboard,
720
+ Clipboard2,
819
721
  {
820
722
  asChild: true,
821
723
  tooltip,
@@ -831,13 +733,198 @@ var ClipboardButton = ({
831
733
  };
832
734
  var ButtonToolbar = ({ value, children }) => {
833
735
  if (!value && !children) return null;
834
- 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: [
835
737
  !!value && /* @__PURE__ */ jsx(ClipboardButton, { size: "icon-sm", variant: "invisible", text: value }),
836
738
  children
837
739
  ] });
838
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
+ };
839
926
  var resolveToken = (token, fallbackChannels, alpha) => {
840
- 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;
841
928
  return alpha === void 0 ? `rgb(${channels})` : `rgb(${channels} / ${alpha})`;
842
929
  };
843
930
  var SSR_SIGNAL = "ssr";
@@ -857,12 +944,38 @@ var subscribeThemeSignal = (onChange) => {
857
944
  return () => observer.disconnect();
858
945
  };
859
946
  var useThemeSignal = () => useSyncExternalStore(subscribeThemeSignal, readThemeSignal, () => SSR_SIGNAL);
860
- var useThemedExtension = (build, deps = []) => {
947
+ var themeCache = /* @__PURE__ */ new Map();
948
+ var useThemedExtension = (cacheKey, build) => {
861
949
  const themeSignal = useThemeSignal();
862
- 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;
863
957
  };
864
958
 
865
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);
866
979
  var buildBaseThemeStyles = () => ({
867
980
  "*": { lineHeight: "20px" },
868
981
  "*::selection": {
@@ -903,7 +1016,27 @@ var buildBaseThemeStyles = () => ({
903
1016
  ".cm-changeGutter": { position: "absolute", zIndex: -1, width: "100%", paddingLeft: 0 },
904
1017
  '&[class*="cm-merge-"] .cm-changedLine,&[class*="cm-merge-"] .cm-line, &[class*="cm-merge-"] .cm-deletedChunk': { paddingLeft: 0 }
905
1018
  });
906
- 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
+ });
907
1040
  var buildCustomTheme = () => githubLightInit({
908
1041
  settings: {
909
1042
  fontFamily: `'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New'`,
@@ -918,10 +1051,19 @@ var buildCustomTheme = () => githubLightInit({
918
1051
  });
919
1052
  var getLanguageMode = (mode) => {
920
1053
  switch (mode) {
1054
+ case void 0:
1055
+ case "application/json":
1056
+ return json();
921
1057
  case "text/x-python":
922
1058
  return python();
923
1059
  case "text/x-sql":
924
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 });
925
1067
  case "text/x-sfsql":
926
1068
  return StreamLanguage.define(sfsql);
927
1069
  case "text/x-plsql":
@@ -930,23 +1072,32 @@ var getLanguageMode = (mode) => {
930
1072
  return StreamLanguage.define(r);
931
1073
  case "text/x-sh":
932
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);
933
1081
  case "text/javascript":
934
1082
  return javascript({ jsx: true });
935
1083
  case "text/typescript":
936
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.
937
1088
  default:
938
- return json();
1089
+ return [];
939
1090
  }
940
1091
  };
941
1092
  var shouldLintJson = (mode, readOnly) => mode === "application/json" && !readOnly;
942
- var KbdSeparator = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { ...props, className: cn("tw-text-xs tw-text-muted-foreground", className) });
1093
+ var KbdSeparator = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { ...props, className: cn("tw:text-xs tw:text-muted-foreground", className) });
943
1094
  var KbdGroup = ({ ref, className, children, separator, ...props }) => {
944
1095
  return /* @__PURE__ */ jsx(
945
1096
  "kbd",
946
1097
  {
947
1098
  ...props,
948
1099
  ref,
949
- 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),
950
1101
  children: separator ? (
951
1102
  // oxlint-disable-next-line react-x/no-children-to-array
952
1103
  Children.toArray(children).map((child, index) => (
@@ -964,22 +1115,22 @@ var kbdVariants = cva(
964
1115
  [
965
1116
  "tailwindcss-preflight",
966
1117
  // style
967
- "tw-pointer-events-none",
968
- "tw-w-fit",
969
- "tw-h-5",
970
- "tw-min-w-5",
1118
+ "tw:pointer-events-none",
1119
+ "tw:w-fit",
1120
+ "tw:h-5",
1121
+ "tw:min-w-5",
971
1122
  // layout
972
- "tw-inline-flex",
973
- "tw-items-center",
974
- "tw-justify-center",
975
- "tw-gap-1",
976
- "tw-shrink-0",
1123
+ "tw:inline-flex",
1124
+ "tw:items-center",
1125
+ "tw:justify-center",
1126
+ "tw:gap-1",
1127
+ "tw:shrink-0",
977
1128
  // spacing
978
- "tw-px-1",
979
- '[&_svg:not([class*="size-"])]:tw-size-2.5',
980
- "tw-text-xs",
981
- "tw-font-medium",
982
- "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"
983
1134
  ],
984
1135
  {
985
1136
  defaultVariants: {
@@ -987,8 +1138,8 @@ var kbdVariants = cva(
987
1138
  },
988
1139
  variants: {
989
1140
  variant: {
990
- default: "tw-bg-muted tw-text-muted-foreground",
991
- 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"
992
1143
  }
993
1144
  }
994
1145
  }
@@ -1011,6 +1162,7 @@ var CodeEditor = ({
1011
1162
  onChange,
1012
1163
  mode = "application/json",
1013
1164
  placeholder: placeholder$1 = "",
1165
+ ariaLabel,
1014
1166
  readOnly = false,
1015
1167
  autocompletions = emptyArray,
1016
1168
  extraKeys = emptyObject,
@@ -1019,19 +1171,23 @@ var CodeEditor = ({
1019
1171
  withLineNumbers = true,
1020
1172
  withLineWrapping = true,
1021
1173
  withCollapseUnchanged = false,
1022
- withCopyButton = true,
1174
+ withCopyButton = false,
1023
1175
  completeAny = false,
1024
1176
  help = null,
1025
1177
  helpPostfix = null,
1026
1178
  renderAdditionalButtons,
1027
1179
  className
1028
1180
  }) => {
1029
- const customTheme = useThemedExtension(buildCustomTheme);
1030
- 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
+ );
1031
1187
  const commonExtensions = useMemo(() => {
1032
1188
  return [
1033
1189
  getLanguageMode(mode),
1034
- shouldLintJson(mode, readOnly) && linter(jsonParseLinter()),
1190
+ shouldLintJson(mode, readOnly) ? linter(jsonParseLinter()) : [],
1035
1191
  withLineWrapping ? EditorView.lineWrapping : [],
1036
1192
  EditorState.languageData.of(() => [
1037
1193
  { autocomplete: completeAny ? completeAnyWord : autocompletions }
@@ -1046,10 +1202,20 @@ var CodeEditor = ({
1046
1202
  }
1047
1203
  }))
1048
1204
  ),
1049
- autocompletion({ activateOnTyping: completeAny }),
1205
+ readOnly ? [] : autocompletion({ activateOnTyping: completeAny }),
1206
+ ariaLabel ? EditorView.contentAttributes.of({ "aria-label": ariaLabel }) : [],
1050
1207
  baseTheme
1051
- ].filter(Boolean);
1052
- }, [autocompletions, completeAny, extraKeys, mode, readOnly, withLineWrapping, baseTheme]);
1208
+ ];
1209
+ }, [
1210
+ autocompletions,
1211
+ completeAny,
1212
+ extraKeys,
1213
+ mode,
1214
+ readOnly,
1215
+ withLineWrapping,
1216
+ baseTheme,
1217
+ ariaLabel
1218
+ ]);
1053
1219
  const extensions = useMemo(() => {
1054
1220
  return [
1055
1221
  ...commonExtensions,
@@ -1066,18 +1232,20 @@ var CodeEditor = ({
1066
1232
  }, [commonExtensions, placeholder$1, readOnly, previousValue, withCollapseUnchanged]);
1067
1233
  const config = useMemo(() => {
1068
1234
  return {
1069
- ...BASIS_SETUP,
1235
+ ...buildBasicSetup(readOnly),
1070
1236
  lineNumbers: withLineNumbers
1071
1237
  };
1072
- }, [withLineNumbers]);
1238
+ }, [withLineNumbers, readOnly]);
1239
+ const additionalButtons = renderAdditionalButtons?.(value);
1240
+ const hasToolbar = withCopyButton && !!value || !!additionalButtons;
1073
1241
  return (
1074
1242
  // oxlint-disable-next-line jsx-a11y/no-static-element-interactions
1075
1243
  /* @__PURE__ */ jsxs(
1076
1244
  "div",
1077
1245
  {
1078
1246
  className: cn(
1079
- "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",
1080
- { "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 },
1081
1249
  className
1082
1250
  ),
1083
1251
  onKeyDown: (event) => {
@@ -1086,19 +1254,19 @@ var CodeEditor = ({
1086
1254
  }
1087
1255
  },
1088
1256
  children: [
1089
- (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 }) }) }),
1090
1258
  /* @__PURE__ */ jsx(
1091
1259
  CodeMirror,
1092
1260
  {
1093
1261
  theme: customTheme,
1094
1262
  value,
1095
- onChange,
1263
+ onChange: handleChange,
1096
1264
  extensions,
1097
1265
  autoFocus: withAutofocus,
1098
1266
  basicSetup: config
1099
1267
  }
1100
1268
  ),
1101
- !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: [
1102
1270
  help,
1103
1271
  withToggleCommentHint ? /* @__PURE__ */ jsx(ToggleComponentHelp, {}) : null,
1104
1272
  helpPostfix
@@ -1518,8 +1686,7 @@ function searchExtension() {
1518
1686
  function updateSearch(view, query, selectedMatchIndex) {
1519
1687
  view.dispatch({ effects: setSearchEffect.of({ query, selectedMatchIndex }) });
1520
1688
  }
1521
- var BASIS_SETUP2 = {
1522
- drawSelection: false,
1689
+ var OWN_KEYMAPS = {
1523
1690
  defaultKeymap: false,
1524
1691
  completionKeymap: false,
1525
1692
  searchKeymap: false
@@ -1584,8 +1751,11 @@ var SqlEditor = ({
1584
1751
  dialect
1585
1752
  }) => {
1586
1753
  const editorRef = useRef(null);
1587
- const customTheme = useThemedExtension(buildCustomTheme);
1588
- 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
+ );
1589
1759
  const extensions = useMemo(() => {
1590
1760
  const baseKeymap = [...defaultKeymap, ...CUSTOM_KEYMAP];
1591
1761
  return [
@@ -1611,8 +1781,8 @@ var SqlEditor = ({
1611
1781
  themeExtension
1612
1782
  ]);
1613
1783
  const defaultSetup = useMemo(() => {
1614
- return { ...BASIS_SETUP2, lineNumbers };
1615
- }, [lineNumbers]);
1784
+ return { ...buildBasicSetup(readOnly), ...OWN_KEYMAPS, lineNumbers };
1785
+ }, [readOnly, lineNumbers]);
1616
1786
  useEffect(() => {
1617
1787
  if (editorRef.current?.view) {
1618
1788
  updateHighlighting(editorRef.current.view, highlightLines);
@@ -1678,25 +1848,25 @@ var LINE_HEIGHT_PX = 20;
1678
1848
  var PANE_HEADER_HEIGHT_PX = 58;
1679
1849
  var AcceptButton = ({ side, onAccept }) => {
1680
1850
  const label = `Accept ${side === "left" ? "production" : "branch"} version`;
1681
- const Chevron = side === "left" ? icons_exports.ChevronsRight : icons_exports.ChevronsLeft;
1682
- 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" }) });
1683
1853
  };
1684
1854
  var AcceptControls = ({ conflicts, side, onAccept, onDismiss, contentRef }) => /* @__PURE__ */ jsx(
1685
1855
  "div",
1686
1856
  {
1687
1857
  className: cn(
1688
- "tw-z-10 tw-flex tw-shrink-0 tw-flex-col tw-items-center",
1689
- 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"
1690
1860
  ),
1691
1861
  children: conflicts.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
1692
- /* @__PURE__ */ jsx("div", { className: "tw-shrink-0", style: { height: `${PANE_HEADER_HEIGHT_PX}px` } }),
1693
- /* @__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) => {
1694
1864
  const topLine = side === "left" ? conflict.oldStartLine : conflict.newStartLine;
1695
1865
  const topOffset = (topLine - 1) * LINE_HEIGHT_PX - 2;
1696
1866
  return /* @__PURE__ */ jsxs(
1697
1867
  "div",
1698
1868
  {
1699
- 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",
1700
1870
  style: { top: `${topOffset}px` },
1701
1871
  children: [
1702
1872
  /* @__PURE__ */ jsx(AcceptButton, { side, onAccept: () => onAccept(conflict) }),
@@ -1708,7 +1878,7 @@ var AcceptControls = ({ conflicts, side, onAccept, onDismiss, contentRef }) => /
1708
1878
  size: "icon-sm",
1709
1879
  title: "Dismiss",
1710
1880
  "aria-label": `Dismiss ${side === "left" ? "production" : "branch"} change`,
1711
- children: /* @__PURE__ */ jsx(icons_exports.X, { className: "tw-size-4" })
1881
+ children: /* @__PURE__ */ jsx(X, { className: "tw:size-4" })
1712
1882
  }
1713
1883
  )
1714
1884
  ]
@@ -1805,13 +1975,15 @@ var MergePane = ({
1805
1975
  deleted = false
1806
1976
  }) => {
1807
1977
  const editorRef = useRef(null);
1978
+ const handleChange = useStableCallback((next) => onChange?.(next));
1808
1979
  const themeExtension = useThemedExtension(
1980
+ `merge-pane:${deleted}`,
1809
1981
  () => EditorView.theme({
1810
1982
  "&.cm-editor": {
1811
1983
  height: "100%",
1812
1984
  backgroundColor: deleted ? colors.error[100] : resolveToken("background", "249 250 251"),
1813
1985
  // Pair the token-driven surface with a token-driven text color so line
1814
- // content stays readable when the pane's `--color-background` goes dark.
1986
+ // content stays readable when the pane's `--background` goes dark.
1815
1987
  // The deleted pane keeps default dark text on its fixed light-red wash.
1816
1988
  ...deleted ? {} : { color: resolveToken("foreground", "30 41 59") },
1817
1989
  outline: "none"
@@ -1822,10 +1994,13 @@ var MergePane = ({
1822
1994
  },
1823
1995
  "*": { lineHeight: `${LINE_HEIGHT_PX}px` },
1824
1996
  ".cm-lineNumbers .cm-gutterElement": { padding: "0 0 0 25px" }
1825
- }),
1826
- [deleted]
1997
+ })
1827
1998
  );
1828
1999
  const diffHighlightExtension = useMemo(() => createDiffHighlightExtension(), []);
2000
+ const basicSetup = useMemo(
2001
+ () => ({ ...buildBasicSetup(readOnly), lineNumbers: true }),
2002
+ [readOnly]
2003
+ );
1829
2004
  const extensions = useMemo(
1830
2005
  () => [
1831
2006
  diffHighlightExtension,
@@ -1875,33 +2050,33 @@ var MergePane = ({
1875
2050
  "div",
1876
2051
  {
1877
2052
  className: cn(
1878
- "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",
1879
2054
  className,
1880
- deleted && "tw-border-error-300"
2055
+ deleted && "tw:border-error-300"
1881
2056
  ),
1882
2057
  children: [
1883
2058
  header && /* @__PURE__ */ jsx(
1884
2059
  "div",
1885
2060
  {
1886
2061
  className: cn(
1887
- "tw-px-4 tw-py-3",
1888
- 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",
1889
2064
  headerClassName
1890
2065
  ),
1891
2066
  children: header
1892
2067
  }
1893
2068
  ),
1894
- /* @__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(
1895
2070
  CodeMirror,
1896
2071
  {
1897
2072
  ref: editorRef,
1898
2073
  height: "100%",
1899
2074
  value,
1900
- onChange,
2075
+ onChange: handleChange,
1901
2076
  extensions,
1902
2077
  readOnly,
1903
2078
  onCreateEditor: handleCreateEditor,
1904
- basicSetup: { lineNumbers: true, drawSelection: false }
2079
+ basicSetup
1905
2080
  }
1906
2081
  ) })
1907
2082
  ]
@@ -2001,7 +2176,7 @@ var MergeEditor = ({
2001
2176
  "div",
2002
2177
  {
2003
2178
  className: cn(
2004
- "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",
2005
2180
  className
2006
2181
  ),
2007
2182
  children: [
@@ -2013,7 +2188,7 @@ var MergeEditor = ({
2013
2188
  lineClassification: leftClassification,
2014
2189
  readOnly: true,
2015
2190
  header: leftHeader,
2016
- className: "tw-rounded-r-lg tw-border tw-border-border",
2191
+ className: "tw:rounded-r-lg tw:border tw:border-border",
2017
2192
  onScrollDOMReady: registerScroller(0),
2018
2193
  deleted: leftDeleted
2019
2194
  }
@@ -2037,7 +2212,7 @@ var MergeEditor = ({
2037
2212
  onChange: handleMergeChange,
2038
2213
  header: middleHeader,
2039
2214
  headerClassName: middleHeaderClassName,
2040
- className: cn("tw-border tw-border-border tw-rounded-lg", middleClassName),
2215
+ className: cn("tw:border tw:border-border tw:rounded-lg", middleClassName),
2041
2216
  onScrollDOMReady: registerScroller(1)
2042
2217
  }
2043
2218
  ),
@@ -2059,7 +2234,7 @@ var MergeEditor = ({
2059
2234
  lineClassification: rightClassification,
2060
2235
  readOnly: true,
2061
2236
  header: rightHeader,
2062
- className: "tw-rounded-l-lg tw-border tw-border-border",
2237
+ className: "tw:rounded-l-lg tw:border tw:border-border",
2063
2238
  onScrollDOMReady: registerScroller(2),
2064
2239
  deleted: rightDeleted
2065
2240
  }
@@ -2069,6 +2244,6 @@ var MergeEditor = ({
2069
2244
  );
2070
2245
  };
2071
2246
 
2072
- export { CodeEditor, MergeEditor, SqlEditor };
2247
+ export { CodeEditor, LANGUAGE_MODES, MergeEditor, SqlEditor, isLanguageMode };
2073
2248
  //# sourceMappingURL=editors.js.map
2074
2249
  //# sourceMappingURL=editors.js.map