@keboola/design 4.4.0 → 5.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.
package/dist/editors.js CHANGED
@@ -1,4 +1,4 @@
1
- import { createContext, forwardRef, useMemo, useRef, useEffect, useCallback, useState, use, Children, Fragment as Fragment$1 } from 'react';
1
+ import { createContext, forwardRef, useMemo, useRef, useEffect, useCallback, 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';
@@ -9,7 +9,7 @@ import { clsx } from 'clsx';
9
9
  import { extendTailwindMerge } from 'tailwind-merge';
10
10
  import { Root as Root$1, Trigger, Portal, Content } from '@radix-ui/react-tooltip';
11
11
  import { cva } from 'class-variance-authority';
12
- import { keboolaLegacy } from '@keboola/brand-registry';
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
15
  import * as lucide_react_star from 'lucide-react';
@@ -59,13 +59,39 @@ var cn = (...classes) => twMerge(clsx(...classes));
59
59
  var copyToClipboard = (text) => {
60
60
  return navigator.clipboard.writeText(text);
61
61
  };
62
- var ThemeContext = createContext(null);
63
62
 
64
- // src/components/internal/useIsLegacyBrand.ts
65
- var useIsLegacyBrand = () => {
66
- const context = use(ThemeContext);
67
- return context === null || context.brand.id === keboolaLegacy.id;
63
+ // src/components/ThemeProvider/utils.ts
64
+ var createTheme = (brand) => ({
65
+ id: brand.id,
66
+ name: brand.name,
67
+ shell: brand.shell,
68
+ logo: brand.logo
69
+ });
70
+
71
+ // src/components/ThemeProvider/defaults.ts
72
+ [keboolaLegacySidebar.id, keboolaLegacyTopnav.id];
73
+ var DEFAULT_COLOR_SCHEME = "light";
74
+ var DEFAULT_BRAND_ID = "design-system";
75
+ var defaultBrand = {
76
+ id: DEFAULT_BRAND_ID,
77
+ name: "Design System",
78
+ shell: "sidebar"};
79
+ var defaultTheme = createTheme(defaultBrand);
80
+
81
+ // src/components/ThemeProvider/context.tsx
82
+ var noop = () => void 0;
83
+ var defaultContext = {
84
+ scheme: DEFAULT_COLOR_SCHEME,
85
+ resolvedScheme: DEFAULT_COLOR_SCHEME,
86
+ setScheme: noop,
87
+ brandId: defaultTheme.id,
88
+ setBrand: noop,
89
+ themes: [defaultTheme],
90
+ currentTheme: defaultTheme
68
91
  };
92
+ createContext(defaultContext);
93
+ var ArgoDesignContext = createContext(true);
94
+ var useArgoDesign = () => use(ArgoDesignContext);
69
95
  var tooltipVariants = cva(
70
96
  [
71
97
  "tailwindcss-preflight",
@@ -143,8 +169,7 @@ var TooltipContent = ({
143
169
  placement = "right",
144
170
  ...rest
145
171
  }) => {
146
- const isLegacy = useIsLegacyBrand();
147
- const renderArgo = !isLegacy;
172
+ const renderArgo = useArgoDesign();
148
173
  const handlePointerDownOutside = (event) => {
149
174
  if (keepOpenOnPointerDownOutside) event.preventDefault();
150
175
  onPointerDownOutside?.(event);
@@ -274,7 +299,7 @@ var helpVariants = cva(["tw-m-0", "tw-text-xs"], {
274
299
  state: {
275
300
  default: ["tw-text-muted-foreground"],
276
301
  error: ["tw-text-destructive"],
277
- warning: ["tw-text-warning-500"]
302
+ warning: ["tw-text-warning"]
278
303
  }
279
304
  }
280
305
  });
@@ -326,8 +351,8 @@ var variants = cva(
326
351
  "tw-font-medium",
327
352
  "tw-tracking-[1px]",
328
353
  "tw-uppercase",
329
- // border
330
- "tw-rounded-[var(--radius-lg,0.25rem)]",
354
+ // border — legacy (non-argo) chrome uses a fixed radius, not the brand token.
355
+ "tw-rounded",
331
356
  "tw-border",
332
357
  "tw-border-transparent",
333
358
  // styling
@@ -522,14 +547,14 @@ var argoVariants = cva(
522
547
  "hover:tw-text-primary-foreground",
523
548
  "focus:tw-text-primary-foreground",
524
549
  "focus-visible:tw-border-primary",
525
- "focus-visible:tw-ring-primary/50"
550
+ "focus-visible:tw-ring-ring/50"
526
551
  ],
527
552
  secondary: [
528
553
  "tw-bg-primary/10",
529
554
  "tw-text-primary",
530
555
  "hover:not-disabled:tw-bg-primary/20",
531
556
  "focus-visible:tw-border-primary",
532
- "focus-visible:tw-ring-primary/50"
557
+ "focus-visible:tw-ring-ring/50"
533
558
  ],
534
559
  // should be called "destructive" by Figma
535
560
  danger: [
@@ -546,20 +571,22 @@ var argoVariants = cva(
546
571
  // Semantic base text color so the label/icon flips in dark mode
547
572
  // (matches `invisible`); previously unset → inherited a fixed dark color.
548
573
  "tw-text-foreground",
549
- "hover:not-disabled:tw-bg-accent",
550
- "hover:not-disabled:tw-text-accent-foreground",
574
+ // Hover follows the brand primary (translucent tint), matching the
575
+ // `secondary` variant — not the fixed `accent` blue.
576
+ "hover:not-disabled:tw-bg-primary/10",
577
+ "hover:not-disabled:tw-text-primary",
551
578
  "hover:active:tw-bg-background",
552
579
  "focus-visible:!tw-border-primary",
553
- "focus-visible:tw-ring-primary/50"
580
+ "focus-visible:tw-ring-ring/50"
554
581
  ],
555
582
  // should be called "ghost" by Figma
556
583
  invisible: [
557
584
  "tw-bg-transparent",
558
585
  "tw-text-foreground",
559
- "hover:not-disabled:tw-bg-accent",
560
- "hover:not-disabled:tw-text-accent-foreground",
561
- "hover:not-disabled:tw-border-accent",
562
- "focus-visible:tw-ring-primary/50"
586
+ "hover:not-disabled:tw-bg-primary/10",
587
+ "hover:not-disabled:tw-text-primary",
588
+ "hover:not-disabled:tw-border-primary/10",
589
+ "focus-visible:tw-ring-ring/50"
563
590
  ],
564
591
  // should be called "link" by Figma
565
592
  inline: [
@@ -567,7 +594,7 @@ var argoVariants = cva(
567
594
  "tw-text-primary",
568
595
  "hover:tw-underline",
569
596
  "hover:active:tw-bg-transparent",
570
- "focus-visible:tw-ring-primary/50"
597
+ "focus-visible:tw-ring-ring/50"
571
598
  ]
572
599
  },
573
600
  size: {
@@ -602,8 +629,7 @@ var Button = ({
602
629
  block = false,
603
630
  ...buttonProps
604
631
  }) => {
605
- const isLegacy = useIsLegacyBrand();
606
- const renderArgo = !isLegacy;
632
+ const renderArgo = useArgoDesign();
607
633
  const Comp = asChild ? Root : "button";
608
634
  const isIconOnly = String(size).startsWith("icon");
609
635
  const classNames = renderArgo ? argoVariants({ variant, size, block, className }) : variants({ size, variant, block, className });
@@ -730,15 +756,44 @@ var ButtonToolbar = ({ value, children }) => {
730
756
  children
731
757
  ] });
732
758
  };
733
- var baseThemeStyles = {
759
+ var resolveToken = (token, fallbackChannels, alpha) => {
760
+ const channels = typeof document === "undefined" ? fallbackChannels : getComputedStyle(document.documentElement).getPropertyValue(`--color-${token}`).trim() || fallbackChannels;
761
+ return alpha === void 0 ? `rgb(${channels})` : `rgb(${channels} / ${alpha})`;
762
+ };
763
+ var SSR_SIGNAL = "ssr";
764
+ var readThemeSignal = () => {
765
+ if (typeof document === "undefined") return SSR_SIGNAL;
766
+ const root = document.documentElement;
767
+ return `${root.getAttribute("data-theme") ?? ""}:${root.getAttribute("data-brand") ?? ""}`;
768
+ };
769
+ var subscribeThemeSignal = (onChange) => {
770
+ if (typeof document === "undefined") return () => {
771
+ };
772
+ const observer = new MutationObserver(onChange);
773
+ observer.observe(document.documentElement, {
774
+ attributes: true,
775
+ attributeFilter: ["data-theme", "data-brand"]
776
+ });
777
+ return () => observer.disconnect();
778
+ };
779
+ var useThemeSignal = () => useSyncExternalStore(subscribeThemeSignal, readThemeSignal, () => SSR_SIGNAL);
780
+ var useThemedExtension = (build, deps = []) => {
781
+ const themeSignal = useThemeSignal();
782
+ return useMemo(build, [themeSignal, ...deps]);
783
+ };
784
+
785
+ // src/components/CodeEditor/helpers.ts
786
+ var buildBaseThemeStyles = () => ({
734
787
  "*": { lineHeight: "20px" },
735
788
  "*::selection": {
736
- backgroundColor: colors.secondary[500],
737
- color: `${colors.white} !important`
789
+ backgroundColor: resolveToken("primary", "31 143 255"),
790
+ color: `${resolveToken("primary-foreground", "255 255 255")} !important`
791
+ },
792
+ '&.cm-editor:has(.cm-content[contenteditable="false"])': {
793
+ backgroundColor: resolveToken("secondary", "226 232 240")
738
794
  },
739
- '&.cm-editor:has(.cm-content[contenteditable="false"])': { backgroundColor: colors.neutral[150] },
740
795
  '&.cm-editor:has(.cm-content[contenteditable="false"]) .cm-gutters': {
741
- backgroundColor: colors.neutral[200]
796
+ backgroundColor: resolveToken("border", "229 231 235")
742
797
  },
743
798
  "&.cm-editor .cm-scroller": { overflowAnchor: "none" },
744
799
  "&.cm-editor, &.cm-editor .cm-scroller": {
@@ -754,11 +809,11 @@ var baseThemeStyles = {
754
809
  ".cm-line .tok-string": { color: colors.warning[700] },
755
810
  // merge (diff) view
756
811
  '&[class*="cm-merge-"] .cm-deletedLine': { backgroundColor: colors.error[100] },
757
- '&[class*="cm-merge-"] .cm-changedLine': { backgroundColor: colors.primary[100] },
812
+ '&[class*="cm-merge-"] .cm-changedLine': { backgroundColor: colors.green[100] },
758
813
  '&[class*="cm-merge-"] .cm-deletedLineGutter': { backgroundColor: colors.error[200] },
759
- '&[class*="cm-merge-"] .cm-changedLineGutter': { backgroundColor: colors.primary[200] },
814
+ '&[class*="cm-merge-"] .cm-changedLineGutter': { backgroundColor: colors.green[200] },
760
815
  '&[class*="cm-merge-"] .cm-deletedText': { background: colors.error[200] },
761
- '&[class*="cm-merge-"] .cm-changedText': { background: colors.primary[200] },
816
+ '&[class*="cm-merge-"] .cm-changedText': { background: colors.green[200] },
762
817
  '&[class*="cm-merge-"]': {
763
818
  backgroundColor: `${colors.white} !important`
764
819
  },
@@ -767,16 +822,18 @@ var baseThemeStyles = {
767
822
  },
768
823
  ".cm-changeGutter": { position: "absolute", zIndex: -1, width: "100%", paddingLeft: 0 },
769
824
  '&[class*="cm-merge-"] .cm-changedLine,&[class*="cm-merge-"] .cm-line, &[class*="cm-merge-"] .cm-deletedChunk': { paddingLeft: 0 }
770
- };
825
+ });
771
826
  var BASIS_SETUP = { drawSelection: false };
772
- var customTheme = githubLightInit({
827
+ var buildCustomTheme = () => githubLightInit({
773
828
  settings: {
774
829
  fontFamily: `'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New'`,
775
- background: colors.neutral[50],
776
- gutterBackground: colors.neutral[100],
830
+ background: resolveToken("background", "249 250 251"),
831
+ foreground: resolveToken("foreground", "30 41 59"),
832
+ gutterBackground: resolveToken("muted", "241 245 249"),
833
+ gutterForeground: resolveToken("muted-foreground", "100 116 139"),
777
834
  gutterBorder: "transparent",
778
835
  lineHighlight: "transparent",
779
- selection: colors.secondary[500]
836
+ selection: resolveToken("primary", "31 143 255")
780
837
  }
781
838
  });
782
839
  var getLanguageMode = (mode) => {
@@ -894,6 +951,8 @@ var CodeEditor = ({
894
951
  renderAdditionalButtons,
895
952
  className
896
953
  }) => {
954
+ const customTheme = useThemedExtension(buildCustomTheme);
955
+ const baseTheme = useThemedExtension(() => EditorView.theme(buildBaseThemeStyles()));
897
956
  const commonExtensions = useMemo(() => {
898
957
  return [
899
958
  getLanguageMode(mode),
@@ -913,9 +972,9 @@ var CodeEditor = ({
913
972
  }))
914
973
  ),
915
974
  autocompletion({ activateOnTyping: completeAny }),
916
- EditorView.theme(baseThemeStyles)
975
+ baseTheme
917
976
  ].filter(Boolean);
918
- }, [autocompletions, completeAny, extraKeys, mode, withLineWrapping]);
977
+ }, [autocompletions, completeAny, extraKeys, mode, withLineWrapping, baseTheme]);
919
978
  const extensions = useMemo(() => {
920
979
  return [
921
980
  ...commonExtensions,
@@ -1130,19 +1189,19 @@ var activeQueryHighlight = (splitQueries) => {
1130
1189
  ),
1131
1190
  EditorView.baseTheme({
1132
1191
  ".cm-active-query": {
1133
- boxShadow: `inset -1px 0 0 0 ${colors.secondary[300]}, inset 1px 0 0 0 ${colors.secondary[300]}`,
1192
+ boxShadow: `inset -1px 0 0 0 ${colors.blue[300]}, inset 1px 0 0 0 ${colors.blue[300]}`,
1134
1193
  marginRight: "8px"
1135
1194
  },
1136
1195
  ".cm-active-query-first": {
1137
- boxShadow: `inset -1px 0 0 0 ${colors.secondary[300]}, inset 1px 0 0 0 ${colors.secondary[300]}, inset 0 1px 0 0 ${colors.secondary[300]}`,
1196
+ boxShadow: `inset -1px 0 0 0 ${colors.blue[300]}, inset 1px 0 0 0 ${colors.blue[300]}, inset 0 1px 0 0 ${colors.blue[300]}`,
1138
1197
  borderRadius: "4px 4px 0 0"
1139
1198
  },
1140
1199
  ".cm-active-query-last": {
1141
- boxShadow: `inset -1px 0 0 0 ${colors.secondary[300]}, inset 1px 0 0 0 ${colors.secondary[300]}, inset 0 -1px 0 0 ${colors.secondary[300]}`,
1200
+ boxShadow: `inset -1px 0 0 0 ${colors.blue[300]}, inset 1px 0 0 0 ${colors.blue[300]}, inset 0 -1px 0 0 ${colors.blue[300]}`,
1142
1201
  borderRadius: "0 0 4px 4px"
1143
1202
  },
1144
1203
  ".cm-active-query-first.cm-active-query-last": {
1145
- boxShadow: `inset 0 0 0 1px ${colors.secondary[300]}`,
1204
+ boxShadow: `inset 0 0 0 1px ${colors.blue[300]}`,
1146
1205
  borderRadius: "4px"
1147
1206
  }
1148
1207
  })
@@ -1256,13 +1315,13 @@ var highlightedLinesTheme = EditorView.baseTheme({
1256
1315
  ".cm-highlight-marker": {
1257
1316
  width: "2px",
1258
1317
  height: "100%",
1259
- backgroundColor: colors.secondary[500]
1318
+ backgroundColor: colors.blue[500]
1260
1319
  },
1261
1320
  ".cm-error-line": {
1262
1321
  backgroundColor: `${colors.error[100]} !important`
1263
1322
  },
1264
1323
  ".cm-processing-line": {
1265
- backgroundColor: `${colors.secondary[100]} !important`
1324
+ backgroundColor: `${colors.blue[100]} !important`
1266
1325
  }
1267
1326
  });
1268
1327
  function highlightingExtension(queryParser) {
@@ -1366,13 +1425,13 @@ var searchViewPlugin = ViewPlugin.fromClass(
1366
1425
  );
1367
1426
  var searchTheme = EditorView.baseTheme({
1368
1427
  ".cm-searchMatch": {
1369
- backgroundColor: colors.secondary[100]
1428
+ backgroundColor: colors.blue[100]
1370
1429
  },
1371
1430
  ".cm-searchMatch > span": {
1372
- color: `${colors.secondary[600]} !important`
1431
+ color: `${colors.blue[600]} !important`
1373
1432
  },
1374
1433
  ".cm-searchMatch-selected": {
1375
- backgroundColor: colors.secondary[600]
1434
+ backgroundColor: colors.blue[600]
1376
1435
  },
1377
1436
  ".cm-searchMatch-selected > span": {
1378
1437
  color: `${colors.white} !important`
@@ -1400,29 +1459,31 @@ var CUSTOM_KEYMAP = [
1400
1459
  }
1401
1460
  }
1402
1461
  ];
1403
- var theme = {
1404
- ...baseThemeStyles,
1462
+ var buildTheme = () => ({
1463
+ ...buildBaseThemeStyles(),
1405
1464
  "&.cm-editor": {
1406
1465
  border: "solid 1px transparent",
1407
- background: colors.white,
1466
+ background: resolveToken("card", "255 255 255"),
1408
1467
  borderRadius: "8px",
1409
1468
  paddingTop: "8px",
1410
1469
  paddingBottom: "8px"
1411
1470
  },
1412
1471
  '&.cm-editor:has(.cm-content[contenteditable="true"]):hover': {
1413
- borderColor: colors.secondary[500]
1472
+ borderColor: resolveToken("ring", "31 143 255")
1414
1473
  },
1415
1474
  '&.cm-editor:has(.cm-content[contenteditable="true"]):focus-within': {
1416
- borderColor: colors.secondary[500],
1417
- boxShadow: `0 0 0 4px ${colors.secondary[200]}`
1475
+ borderColor: resolveToken("ring", "31 143 255"),
1476
+ boxShadow: `0 0 0 4px ${resolveToken("ring", "31 143 255", 0.3)}`
1418
1477
  },
1419
1478
  "&.cm-editor .cm-scroller": { overflowAnchor: "none" },
1420
- "&.cm-editor :is(.cm-gutters,.cm-scroller)": { background: colors.white },
1421
- '&.cm-editor:has(.cm-content[contenteditable="false"])': { background: colors.neutral[100] },
1479
+ "&.cm-editor :is(.cm-gutters,.cm-scroller)": { background: resolveToken("card", "255 255 255") },
1480
+ '&.cm-editor:has(.cm-content[contenteditable="false"])': {
1481
+ background: resolveToken("muted", "241 245 249")
1482
+ },
1422
1483
  '&.cm-editor:has(.cm-content[contenteditable="false"]) :is(.cm-scroller,.cm-gutters)': {
1423
- background: colors.neutral[100]
1484
+ background: resolveToken("muted", "241 245 249")
1424
1485
  }
1425
- };
1486
+ });
1426
1487
  var SqlEditor = ({
1427
1488
  value,
1428
1489
  onChange,
@@ -1448,6 +1509,8 @@ var SqlEditor = ({
1448
1509
  dialect
1449
1510
  }) => {
1450
1511
  const editorRef = useRef(null);
1512
+ const customTheme = useThemedExtension(buildCustomTheme);
1513
+ const themeExtension = useThemedExtension(() => EditorView$1.theme(buildTheme()));
1451
1514
  const extensions = useMemo(() => {
1452
1515
  const baseKeymap = [...defaultKeymap, ...CUSTOM_KEYMAP];
1453
1516
  return [
@@ -1456,7 +1519,7 @@ var SqlEditor = ({
1456
1519
  ...installExtensions({ schema, defaultDatabase, defaultSchema, variables, dialect }),
1457
1520
  searchExtension(),
1458
1521
  highlightingExtension(queryParser),
1459
- EditorView$1.theme(theme),
1522
+ themeExtension,
1460
1523
  onBlurEditor ? EditorView$1.domEventHandlers({ blur: (_, view) => onBlurEditor(view) }) : [],
1461
1524
  onFocusEditor ? EditorView$1.domEventHandlers({ focus: (_, view) => onFocusEditor(view) }) : []
1462
1525
  ];
@@ -1469,7 +1532,8 @@ var SqlEditor = ({
1469
1532
  variables,
1470
1533
  dialect,
1471
1534
  onBlurEditor,
1472
- onFocusEditor
1535
+ onFocusEditor,
1536
+ themeExtension
1473
1537
  ]);
1474
1538
  const defaultSetup = useMemo(() => {
1475
1539
  return { ...BASIS_SETUP2, lineNumbers };
@@ -1630,23 +1694,23 @@ var createDiffHighlightExtension = () => {
1630
1694
  gutterLineClass.from(f, (val) => val.gutterMarkers)
1631
1695
  ]
1632
1696
  });
1633
- const theme2 = EditorView.theme({
1697
+ const theme = EditorView.theme({
1634
1698
  ".cm-merge-safe-line": {
1635
- backgroundColor: `${colors.primary[100]} !important`,
1636
- boxShadow: `inset 3px 0 0 ${colors.primary[500]}`
1699
+ backgroundColor: `${colors.green[100]} !important`,
1700
+ boxShadow: `inset 3px 0 0 ${colors.green[500]}`
1637
1701
  },
1638
1702
  ".cm-merge-conflict-line": {
1639
1703
  backgroundColor: `${colors.warning[100]} !important`,
1640
1704
  boxShadow: `inset 3px 0 0 ${colors.warning[500]}`
1641
1705
  },
1642
1706
  ".cm-merge-safe-gutter": {
1643
- backgroundColor: `${colors.primary[200]} !important`
1707
+ backgroundColor: `${colors.green[200]} !important`
1644
1708
  },
1645
1709
  ".cm-merge-conflict-gutter": {
1646
1710
  backgroundColor: `${colors.warning[200]} !important`
1647
1711
  }
1648
1712
  });
1649
- return [field, theme2];
1713
+ return [field, theme];
1650
1714
  };
1651
1715
  var updateHighlightedLines = (view, lines, classification) => {
1652
1716
  view.dispatch({ effects: setHighlightedLines.of({ lines, classification }) });
@@ -1666,21 +1730,31 @@ var MergePane = ({
1666
1730
  deleted = false
1667
1731
  }) => {
1668
1732
  const editorRef = useRef(null);
1733
+ const themeExtension = useThemedExtension(
1734
+ () => EditorView.theme({
1735
+ "&.cm-editor": {
1736
+ height: "100%",
1737
+ backgroundColor: deleted ? colors.error[100] : resolveToken("background", "249 250 251"),
1738
+ // Pair the token-driven surface with a token-driven text color so line
1739
+ // content stays readable when the pane's `--color-background` goes dark.
1740
+ // The deleted pane keeps default dark text on its fixed light-red wash.
1741
+ ...deleted ? {} : { color: resolveToken("foreground", "30 41 59") },
1742
+ outline: "none"
1743
+ },
1744
+ ".cm-gutters": {
1745
+ backgroundColor: deleted ? colors.error[200] : resolveToken("muted", "241 245 249"),
1746
+ ...deleted ? {} : { color: resolveToken("muted-foreground", "100 116 139") }
1747
+ },
1748
+ "*": { lineHeight: `${LINE_HEIGHT_PX}px` },
1749
+ ".cm-lineNumbers .cm-gutterElement": { padding: "0 0 0 25px" }
1750
+ }),
1751
+ [deleted]
1752
+ );
1753
+ const diffHighlightExtension = useMemo(() => createDiffHighlightExtension(), []);
1669
1754
  const extensions = useMemo(
1670
1755
  () => [
1671
- createDiffHighlightExtension(),
1672
- EditorView.theme({
1673
- "&.cm-editor": {
1674
- height: "100%",
1675
- backgroundColor: deleted ? colors.error[100] : colors.neutral[50],
1676
- outline: "none"
1677
- },
1678
- ".cm-gutters": {
1679
- backgroundColor: deleted ? colors.error[200] : colors.neutral[100]
1680
- },
1681
- "*": { lineHeight: `${LINE_HEIGHT_PX}px` },
1682
- ".cm-lineNumbers .cm-gutterElement": { padding: "0 0 0 25px" }
1683
- }),
1756
+ diffHighlightExtension,
1757
+ themeExtension,
1684
1758
  // Recalc viewport after every doc change so late-settling layouts (alerts
1685
1759
  // appearing above the editor) don't leave trailing lines blank.
1686
1760
  EditorView.updateListener.of((update) => {
@@ -1689,7 +1763,7 @@ var MergePane = ({
1689
1763
  }
1690
1764
  })
1691
1765
  ],
1692
- [deleted]
1766
+ [diffHighlightExtension, themeExtension]
1693
1767
  );
1694
1768
  useEffect(() => {
1695
1769
  const view = editorRef.current?.view;