@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/AGENTS.md +68 -44
- package/COMPONENT-API.md +35 -6
- package/README.md +1 -1
- package/dist/charts.cjs +268 -0
- package/dist/charts.cjs.map +1 -0
- package/dist/charts.d.cts +181 -0
- package/dist/charts.d.ts +181 -0
- package/dist/charts.js +259 -0
- package/dist/charts.js.map +1 -0
- package/dist/editors.cjs +151 -77
- package/dist/editors.cjs.map +1 -1
- package/dist/editors.js +153 -79
- package/dist/editors.js.map +1 -1
- package/dist/index.cjs +2610 -1537
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +486 -467
- package/dist/index.d.ts +486 -467
- package/dist/index.js +2337 -1273
- package/dist/index.js.map +1 -1
- package/dist/markdown-editor.cjs +155 -119
- package/dist/markdown-editor.cjs.map +1 -1
- package/dist/markdown-editor.js +155 -119
- package/dist/markdown-editor.js.map +1 -1
- package/dist/mermaid.cjs +62 -36
- package/dist/mermaid.cjs.map +1 -1
- package/dist/mermaid.js +63 -37
- package/dist/mermaid.js.map +1 -1
- package/dist/rjsf.cjs +459 -385
- package/dist/rjsf.cjs.map +1 -1
- package/dist/rjsf.js +363 -289
- package/dist/rjsf.js.map +1 -1
- package/dist/styles.css +4 -2
- package/dist/testing.cjs +238 -111
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +6 -0
- package/dist/testing.d.ts +6 -0
- package/dist/testing.js +240 -113
- package/dist/testing.js.map +1 -1
- package/package.json +35 -16
- package/src/styles.css +72 -30
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/classNames.ts","../src/blocks/Charts/ChartContainer.tsx","../src/blocks/Charts/ChartTooltip.tsx","../src/blocks/Charts/format.ts","../src/blocks/Charts/cartesian.tsx","../src/blocks/Charts/theme.ts","../src/blocks/Charts/LineChart.tsx","../src/blocks/Charts/BarChart.tsx","../src/blocks/Charts/AreaChart.tsx","../src/blocks/Charts/PieChart.tsx"],"names":["jsx","RechartsTooltip","jsxs","RechartsLineChart","RechartsBarChart","RechartsAreaChart","RechartsPieChart","Legend"],"mappings":"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","file":"charts.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\nconst twMerge = extendTailwindMerge({\n prefix: 'tw-',\n});\n\nexport const cn = (...classes: ClassValue[]) => twMerge(clsx(...classes));\n","import { type ComponentProps, type ReactElement } from 'react';\nimport { ResponsiveContainer } from 'recharts';\n\nimport { cn } from '../../utils';\n\n/** A length that recharts' `<ResponsiveContainer>` accepts: px number or `\"NN%\"`. */\nexport type ChartDimension = number | `${number}%`;\n\nexport type ChartContainerProps = Omit<ComponentProps<'div'>, 'children'> & {\n /**\n * Height as a px number or percentage string. Charts have no intrinsic\n * height, so a container needs one either here or from a sized ancestor.\n * Defaults to 300.\n */\n height?: ChartDimension;\n /** Width as a px number or percentage. Defaults to `\"100%\"` (fills parent). */\n width?: ChartDimension;\n /** A single recharts chart element (`<LineChart>`, `<BarChart>`, …). */\n children: ReactElement;\n};\n\n/**\n * Responsive, brand-themed frame for a chart. Wraps the chart in recharts'\n * `<ResponsiveContainer>` and applies the semantic-token chrome (axis text,\n * grid, cursor) through CSS so every chart inside inherits it. Sizing is\n * intrinsic: give it a `height` (default 300) and it fills the parent width.\n */\nexport const ChartContainer = ({\n height = 300,\n width = '100%',\n className,\n children,\n ...props\n}: ChartContainerProps) => (\n <div\n className={cn(\n 'tw-text-xs',\n // Axis ticks and labels follow the muted foreground token.\n '[&_.recharts-cartesian-axis-tick_text]:tw-fill-muted-foreground',\n '[&_.recharts-polar-angle-axis-tick_text]:tw-fill-muted-foreground',\n '[&_.recharts-label]:tw-fill-muted-foreground',\n '[&_.recharts-legend-item-text]:!tw-text-muted-foreground',\n // Grid lines, axis lines and the hover cursor follow the border token.\n '[&_.recharts-cartesian-grid_line]:tw-stroke-border/60',\n '[&_.recharts-cartesian-axis-line]:tw-stroke-border',\n '[&_.recharts-cartesian-axis-tick-line]:tw-stroke-border',\n '[&_.recharts-curve.recharts-tooltip-cursor]:tw-stroke-border',\n '[&_.recharts-rectangle.recharts-tooltip-cursor]:tw-fill-muted/60',\n '[&_.recharts-surface]:tw-outline-none',\n className,\n )}\n {...props}\n >\n <ResponsiveContainer width={width} height={height}>\n {children}\n </ResponsiveContainer>\n </div>\n);\n","import { type ComponentProps } from 'react';\nimport { Tooltip as RechartsTooltip } from 'recharts';\n\nimport { cn } from '../../utils';\n\ntype TooltipPayloadEntry = {\n name?: string | number;\n value?: string | number;\n color?: string;\n dataKey?: string | number;\n};\n\ntype ChartTooltipContentProps = {\n active?: boolean;\n label?: string | number;\n payload?: TooltipPayloadEntry[];\n /** Format a value for display (e.g. currency, percentage). */\n valueFormatter?: (value: string | number, name: string) => string;\n className?: string;\n};\n\n/**\n * Brand-themed tooltip body. Surfaces (background, border, text) resolve from\n * semantic tokens, and each series swatch reuses the recharts-provided series\n * `color` (already a `--color-chart-*` token from this package's charts).\n */\nexport const ChartTooltipContent = ({\n active,\n label,\n payload,\n valueFormatter,\n className,\n}: ChartTooltipContentProps) => {\n if (!active || !payload?.length) return null;\n\n return (\n <div\n className={cn(\n 'tw-min-w-32 tw-rounded-md tw-border tw-border-border tw-bg-popover tw-px-2.5 tw-py-1.5 tw-text-xs tw-text-popover-foreground tw-shadow-md',\n className,\n )}\n >\n {label != null && <div className=\"tw-mb-1 tw-font-medium\">{label}</div>}\n <div className=\"tw-flex tw-flex-col tw-gap-1\">\n {payload.map((entry) => {\n const name = String(entry.name ?? entry.dataKey ?? '');\n const value = entry.value;\n // Missing / non-numeric values render blank rather than \"NaN\"/\"0\";\n // only well-formed numbers reach the formatter.\n const hasNumber = value != null && value !== '' && Number.isFinite(Number(value));\n const display = hasNumber\n ? valueFormatter\n ? valueFormatter(Number(value), name)\n : String(Number(value))\n : (value ?? '');\n return (\n <div\n key={String(entry.dataKey ?? name)}\n className=\"tw-flex tw-items-center tw-justify-between tw-gap-3\"\n >\n <span className=\"tw-flex tw-items-center tw-gap-1.5\">\n <span\n className=\"tw-size-2 tw-shrink-0 tw-rounded-[2px]\"\n style={{ backgroundColor: entry.color }}\n />\n <span className=\"tw-text-muted-foreground\">{name}</span>\n </span>\n <span className=\"tw-font-medium tw-tabular-nums\">{display}</span>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport type ChartTooltipProps = ComponentProps<typeof RechartsTooltip> & {\n valueFormatter?: (value: string | number, name: string) => string;\n};\n\n/**\n * Drop-in recharts `<Tooltip>` pre-wired to render {@link ChartTooltipContent}.\n * Each chart mounts one by default; pass `showTooltip={false}` on the chart to omit.\n */\nexport const ChartTooltip = ({ valueFormatter, ...props }: ChartTooltipProps) => (\n <RechartsTooltip\n cursor={{ strokeWidth: 1 }}\n content={<ChartTooltipContent valueFormatter={valueFormatter} />}\n {...props}\n />\n);\n","/**\n * Apply a numeric `valueFormatter` safely. recharts hands axis ticks and\n * tooltip payload values as `string | number | null | undefined`, and partial\n * or streaming data can carry gaps. Coercing those straight through\n * `Number(value)` would render `$0` (empty string → 0) or `$NaN` (non-numeric),\n * so a missing / non-finite value is rendered as an empty string instead of\n * being fed to the formatter.\n */\nexport const formatValue = (\n value: string | number | null | undefined,\n valueFormatter?: (value: number) => string,\n): string => {\n if (value == null || value === '') return '';\n const num = Number(value);\n if (!Number.isFinite(num)) return '';\n return valueFormatter ? valueFormatter(num) : String(num);\n};\n","import { CartesianGrid, Legend, XAxis, YAxis } from 'recharts';\n\nimport { ChartTooltip } from './ChartTooltip';\nimport { formatValue } from './format';\nimport { type CartesianChartProps } from './types';\n\nconst AXIS_PROPS = {\n tickLine: false,\n axisLine: false,\n tick: { fontSize: 11 },\n} as const;\n\n/**\n * The grid + axes + tooltip + legend shared by the line, bar, and area charts.\n * Colors are applied via `ChartContainer`'s CSS chrome, not inline props, so\n * these stay brand-safe.\n */\nexport const cartesianChrome = ({\n xKey,\n showGrid = true,\n showYAxis = true,\n showLegend = false,\n showTooltip = true,\n valueFormatter,\n}: Pick<\n CartesianChartProps,\n 'xKey' | 'showGrid' | 'showYAxis' | 'showLegend' | 'showTooltip' | 'valueFormatter'\n>) => (\n <>\n {showGrid && <CartesianGrid strokeDasharray=\"3 3\" vertical={false} />}\n <XAxis dataKey={xKey} {...AXIS_PROPS} />\n {showYAxis && (\n <YAxis\n width={48}\n {...AXIS_PROPS}\n tickFormatter={\n valueFormatter\n ? (value: string | number) => formatValue(value, valueFormatter)\n : undefined\n }\n />\n )}\n {showTooltip && (\n <ChartTooltip\n valueFormatter={valueFormatter ? (value) => formatValue(value, valueFormatter) : undefined}\n />\n )}\n {showLegend && <Legend wrapperStyle={{ fontSize: 11 }} />}\n </>\n);\n","/**\n * The design system ships a five-slot categorical chart palette as CSS\n * variables (`--color-chart-1` … `--color-chart-5`). Charts resolve their\n * series colors from these tokens only — never from inline hex or a primitive\n * scale — so they follow both the active color scheme (light/dark, via\n * `data-theme` in `styles.css`) and the active brand: a brand reskins charts\n * by defining `colors.chart` (and `colorsDark.chart`) in its\n * `@keboola/brand-registry` definition, which `ThemeProvider` emits as the\n * `--color-chart-*` variables.\n *\n * The CSS variables hold raw `R G B` channels (for Tailwind's `<alpha-value>`\n * opacity modifiers), so they are wrapped in `rgb(...)` before handing them to\n * recharts as ordinary SVG `stroke` / `fill` strings.\n */\nconst CHART_TOKEN_COUNT = 5;\n\n/** Number of the semantic chart token (`1`–`5`) a series maps to. */\nexport type ChartColorToken = 1 | 2 | 3 | 4 | 5;\n\n/**\n * The CSS color for a chart token. `index` is 0-based (series position); it\n * wraps around the five-slot palette so any number of series stays on-brand.\n */\nexport const chartTokenColor = (index: number): string => {\n // Euclidean modulo so negative indices still land in 1..CHART_TOKEN_COUNT\n // (plain `%` would yield e.g. `--color-chart-0` for index -1).\n const slot = (((index % CHART_TOKEN_COUNT) + CHART_TOKEN_COUNT) % CHART_TOKEN_COUNT) + 1;\n return `rgb(var(--color-chart-${slot}))`;\n};\n\n/** Resolve an explicit token (1–5) or fall back to the series position. */\nexport const resolveSeriesColor = (index: number, token?: ChartColorToken): string =>\n chartTokenColor(token ? token - 1 : index);\n","import { Line, LineChart as RechartsLineChart } from 'recharts';\n\nimport { cartesianChrome } from './cartesian';\nimport { ChartContainer } from './ChartContainer';\nimport { resolveSeriesColor } from './theme';\nimport { type CartesianChartProps } from './types';\n\n/**\n * A themed multi-series line chart. Each series' color comes from the semantic\n * `--color-chart-*` palette (by order, or pinned via `series[].color`), which\n * follows the active color scheme and the active brand's `colors.chart` when it\n * defines one. Wrap-free — mounts its own {@link ChartContainer}.\n *\n * @example\n * <LineChart\n * data={data}\n * xKey=\"month\"\n * series={[{ dataKey: 'revenue', name: 'Revenue' }, { dataKey: 'cost' }]}\n * />\n */\nexport const LineChart = ({\n data,\n xKey,\n series,\n height,\n width,\n className,\n ...chrome\n}: CartesianChartProps) => (\n <ChartContainer height={height} width={width} className={className}>\n <RechartsLineChart data={data} margin={{ top: 8, right: 8, left: 0, bottom: 0 }}>\n {cartesianChrome({ xKey, ...chrome })}\n {series.map((s, index) => {\n const color = resolveSeriesColor(index, s.color);\n return (\n <Line\n key={s.dataKey}\n type=\"monotone\"\n dataKey={s.dataKey}\n name={s.name ?? s.dataKey}\n stroke={color}\n strokeWidth={2}\n dot={{ r: 3, fill: color, stroke: color }}\n activeDot={{ r: 4 }}\n isAnimationActive={false}\n />\n );\n })}\n </RechartsLineChart>\n </ChartContainer>\n);\n","import { Bar, BarChart as RechartsBarChart } from 'recharts';\n\nimport { cartesianChrome } from './cartesian';\nimport { ChartContainer } from './ChartContainer';\nimport { resolveSeriesColor } from './theme';\nimport { type CartesianChartProps } from './types';\n\nexport type BarChartProps = CartesianChartProps & {\n /** Stack the series into a single bar per category. Defaults to grouped. */\n stacked?: boolean;\n};\n\n/**\n * A themed multi-series bar chart. Series colors come from the semantic\n * `--color-chart-*` palette (by order, or pinned via `series[].color`), which\n * follows the active color scheme and the active brand's `colors.chart` when it\n * defines one. Pass `stacked` to stack the series instead of grouping them.\n *\n * @example\n * <BarChart data={data} xKey=\"month\" series={[{ dataKey: 'revenue' }]} />\n */\nexport const BarChart = ({\n data,\n xKey,\n series,\n height,\n width,\n className,\n stacked = false,\n ...chrome\n}: BarChartProps) => (\n <ChartContainer height={height} width={width} className={className}>\n <RechartsBarChart data={data} margin={{ top: 8, right: 8, left: 0, bottom: 0 }}>\n {cartesianChrome({ xKey, ...chrome })}\n {series.map((s, index) => (\n <Bar\n key={s.dataKey}\n dataKey={s.dataKey}\n name={s.name ?? s.dataKey}\n fill={resolveSeriesColor(index, s.color)}\n radius={stacked ? 0 : [4, 4, 0, 0]}\n stackId={stacked ? 'stack' : undefined}\n isAnimationActive={false}\n />\n ))}\n </RechartsBarChart>\n </ChartContainer>\n);\n","import { Area, AreaChart as RechartsAreaChart } from 'recharts';\n\nimport { cartesianChrome } from './cartesian';\nimport { ChartContainer } from './ChartContainer';\nimport { resolveSeriesColor } from './theme';\nimport { type CartesianChartProps } from './types';\n\nexport type AreaChartProps = CartesianChartProps & {\n /** Stack the series into a cumulative area. Defaults to overlaid. */\n stacked?: boolean;\n};\n\n/**\n * A themed multi-series area chart. Each series is stroked and softly filled\n * from the semantic `--color-chart-*` palette (by order, or pinned via\n * `series[].color`), which follows the active color scheme and the active\n * brand's `colors.chart` when it defines one. Pass `stacked` to stack the\n * series cumulatively.\n *\n * @example\n * <AreaChart data={data} xKey=\"month\" series={[{ dataKey: 'revenue' }]} />\n */\nexport const AreaChart = ({\n data,\n xKey,\n series,\n height,\n width,\n className,\n stacked = false,\n ...chrome\n}: AreaChartProps) => (\n <ChartContainer height={height} width={width} className={className}>\n <RechartsAreaChart data={data} margin={{ top: 8, right: 8, left: 0, bottom: 0 }}>\n {cartesianChrome({ xKey, ...chrome })}\n {series.map((s, index) => {\n const color = resolveSeriesColor(index, s.color);\n return (\n <Area\n key={s.dataKey}\n type=\"monotone\"\n dataKey={s.dataKey}\n name={s.name ?? s.dataKey}\n stroke={color}\n fill={color}\n fillOpacity={0.15}\n strokeWidth={2}\n stackId={stacked ? 'stack' : undefined}\n isAnimationActive={false}\n />\n );\n })}\n </RechartsAreaChart>\n </ChartContainer>\n);\n","import { Cell, Legend, Pie, PieChart as RechartsPieChart } from 'recharts';\n\nimport { ChartContainer, type ChartDimension } from './ChartContainer';\nimport { ChartTooltip } from './ChartTooltip';\nimport { formatValue } from './format';\nimport { chartTokenColor } from './theme';\nimport { type ChartDatum } from './types';\n\nexport type PieChartProps = {\n /** The rows to plot — one sector per row. */\n data: ChartDatum[];\n /** Key into each datum for the sector label. */\n nameKey: string;\n /** Key into each datum for the sector value. */\n dataKey: string;\n /** Render as a donut with a hole of this inner radius (px or %). */\n innerRadius?: ChartDimension;\n /** Height as a px number or percentage. Defaults to 300. */\n height?: ChartDimension;\n /** Width as a px number or percentage. Defaults to `\"100%\"`. */\n width?: ChartDimension;\n /** Show a legend below the chart. Defaults to `true`. */\n showLegend?: boolean;\n /** Show the hover tooltip. Defaults to `true`. */\n showTooltip?: boolean;\n /** Format a sector value for the tooltip. */\n valueFormatter?: (value: number) => string;\n className?: string;\n};\n\n/**\n * A themed pie / donut chart. Each sector cycles through the semantic\n * `--color-chart-*` palette, which follows the active color scheme and the\n * active brand's `colors.chart` when it defines one. Pass `innerRadius` to make\n * a donut.\n *\n * @example\n * <PieChart data={data} nameKey=\"engine\" dataKey=\"rows\" innerRadius=\"60%\" />\n */\nexport const PieChart = ({\n data,\n nameKey,\n dataKey,\n innerRadius = 0,\n height,\n width,\n className,\n showLegend = true,\n showTooltip = true,\n valueFormatter,\n}: PieChartProps) => (\n <ChartContainer height={height} width={width} className={className}>\n <RechartsPieChart>\n {showTooltip && (\n <ChartTooltip\n valueFormatter={\n valueFormatter ? (value) => formatValue(value, valueFormatter) : undefined\n }\n />\n )}\n {showLegend && <Legend wrapperStyle={{ fontSize: 11 }} />}\n <Pie\n data={data}\n nameKey={nameKey}\n dataKey={dataKey}\n innerRadius={innerRadius}\n // Separate sectors with the brand surface color rather than recharts'\n // hardcoded white default.\n stroke=\"rgb(var(--color-background))\"\n isAnimationActive={false}\n >\n {data.map((datum, index) => (\n <Cell key={String(datum[nameKey] ?? index)} fill={chartTokenColor(index)} />\n ))}\n </Pie>\n </RechartsPieChart>\n </ChartContainer>\n);\n"]}
|
package/dist/editors.cjs
CHANGED
|
@@ -85,13 +85,39 @@ var cn = (...classes) => twMerge(clsx.clsx(...classes));
|
|
|
85
85
|
var copyToClipboard = (text) => {
|
|
86
86
|
return navigator.clipboard.writeText(text);
|
|
87
87
|
};
|
|
88
|
-
var ThemeContext = react.createContext(null);
|
|
89
88
|
|
|
90
|
-
// src/components/
|
|
91
|
-
var
|
|
92
|
-
|
|
93
|
-
|
|
89
|
+
// src/components/ThemeProvider/utils.ts
|
|
90
|
+
var createTheme = (brand) => ({
|
|
91
|
+
id: brand.id,
|
|
92
|
+
name: brand.name,
|
|
93
|
+
shell: brand.shell,
|
|
94
|
+
logo: brand.logo
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
// src/components/ThemeProvider/defaults.ts
|
|
98
|
+
[brandRegistry.keboolaLegacySidebar.id, brandRegistry.keboolaLegacyTopnav.id];
|
|
99
|
+
var DEFAULT_COLOR_SCHEME = "light";
|
|
100
|
+
var DEFAULT_BRAND_ID = "design-system";
|
|
101
|
+
var defaultBrand = {
|
|
102
|
+
id: DEFAULT_BRAND_ID,
|
|
103
|
+
name: "Design System",
|
|
104
|
+
shell: "sidebar"};
|
|
105
|
+
var defaultTheme = createTheme(defaultBrand);
|
|
106
|
+
|
|
107
|
+
// src/components/ThemeProvider/context.tsx
|
|
108
|
+
var noop = () => void 0;
|
|
109
|
+
var defaultContext = {
|
|
110
|
+
scheme: DEFAULT_COLOR_SCHEME,
|
|
111
|
+
resolvedScheme: DEFAULT_COLOR_SCHEME,
|
|
112
|
+
setScheme: noop,
|
|
113
|
+
brandId: defaultTheme.id,
|
|
114
|
+
setBrand: noop,
|
|
115
|
+
themes: [defaultTheme],
|
|
116
|
+
currentTheme: defaultTheme
|
|
94
117
|
};
|
|
118
|
+
react.createContext(defaultContext);
|
|
119
|
+
var ArgoDesignContext = react.createContext(true);
|
|
120
|
+
var useArgoDesign = () => react.use(ArgoDesignContext);
|
|
95
121
|
var tooltipVariants = classVarianceAuthority.cva(
|
|
96
122
|
[
|
|
97
123
|
"tailwindcss-preflight",
|
|
@@ -169,8 +195,7 @@ var TooltipContent = ({
|
|
|
169
195
|
placement = "right",
|
|
170
196
|
...rest
|
|
171
197
|
}) => {
|
|
172
|
-
const
|
|
173
|
-
const renderArgo = !isLegacy;
|
|
198
|
+
const renderArgo = useArgoDesign();
|
|
174
199
|
const handlePointerDownOutside = (event) => {
|
|
175
200
|
if (keepOpenOnPointerDownOutside) event.preventDefault();
|
|
176
201
|
onPointerDownOutside?.(event);
|
|
@@ -300,7 +325,7 @@ var helpVariants = classVarianceAuthority.cva(["tw-m-0", "tw-text-xs"], {
|
|
|
300
325
|
state: {
|
|
301
326
|
default: ["tw-text-muted-foreground"],
|
|
302
327
|
error: ["tw-text-destructive"],
|
|
303
|
-
warning: ["tw-text-warning
|
|
328
|
+
warning: ["tw-text-warning"]
|
|
304
329
|
}
|
|
305
330
|
}
|
|
306
331
|
});
|
|
@@ -352,8 +377,8 @@ var variants = classVarianceAuthority.cva(
|
|
|
352
377
|
"tw-font-medium",
|
|
353
378
|
"tw-tracking-[1px]",
|
|
354
379
|
"tw-uppercase",
|
|
355
|
-
// border
|
|
356
|
-
"tw-rounded
|
|
380
|
+
// border — legacy (non-argo) chrome uses a fixed radius, not the brand token.
|
|
381
|
+
"tw-rounded",
|
|
357
382
|
"tw-border",
|
|
358
383
|
"tw-border-transparent",
|
|
359
384
|
// styling
|
|
@@ -548,14 +573,14 @@ var argoVariants = classVarianceAuthority.cva(
|
|
|
548
573
|
"hover:tw-text-primary-foreground",
|
|
549
574
|
"focus:tw-text-primary-foreground",
|
|
550
575
|
"focus-visible:tw-border-primary",
|
|
551
|
-
"focus-visible:tw-ring-
|
|
576
|
+
"focus-visible:tw-ring-ring/50"
|
|
552
577
|
],
|
|
553
578
|
secondary: [
|
|
554
579
|
"tw-bg-primary/10",
|
|
555
580
|
"tw-text-primary",
|
|
556
581
|
"hover:not-disabled:tw-bg-primary/20",
|
|
557
582
|
"focus-visible:tw-border-primary",
|
|
558
|
-
"focus-visible:tw-ring-
|
|
583
|
+
"focus-visible:tw-ring-ring/50"
|
|
559
584
|
],
|
|
560
585
|
// should be called "destructive" by Figma
|
|
561
586
|
danger: [
|
|
@@ -572,20 +597,22 @@ var argoVariants = classVarianceAuthority.cva(
|
|
|
572
597
|
// Semantic base text color so the label/icon flips in dark mode
|
|
573
598
|
// (matches `invisible`); previously unset → inherited a fixed dark color.
|
|
574
599
|
"tw-text-foreground",
|
|
575
|
-
|
|
576
|
-
|
|
600
|
+
// Hover follows the brand primary (translucent tint), matching the
|
|
601
|
+
// `secondary` variant — not the fixed `accent` blue.
|
|
602
|
+
"hover:not-disabled:tw-bg-primary/10",
|
|
603
|
+
"hover:not-disabled:tw-text-primary",
|
|
577
604
|
"hover:active:tw-bg-background",
|
|
578
605
|
"focus-visible:!tw-border-primary",
|
|
579
|
-
"focus-visible:tw-ring-
|
|
606
|
+
"focus-visible:tw-ring-ring/50"
|
|
580
607
|
],
|
|
581
608
|
// should be called "ghost" by Figma
|
|
582
609
|
invisible: [
|
|
583
610
|
"tw-bg-transparent",
|
|
584
611
|
"tw-text-foreground",
|
|
585
|
-
"hover:not-disabled:tw-bg-
|
|
586
|
-
"hover:not-disabled:tw-text-
|
|
587
|
-
"hover:not-disabled:tw-border-
|
|
588
|
-
"focus-visible:tw-ring-
|
|
612
|
+
"hover:not-disabled:tw-bg-primary/10",
|
|
613
|
+
"hover:not-disabled:tw-text-primary",
|
|
614
|
+
"hover:not-disabled:tw-border-primary/10",
|
|
615
|
+
"focus-visible:tw-ring-ring/50"
|
|
589
616
|
],
|
|
590
617
|
// should be called "link" by Figma
|
|
591
618
|
inline: [
|
|
@@ -593,7 +620,7 @@ var argoVariants = classVarianceAuthority.cva(
|
|
|
593
620
|
"tw-text-primary",
|
|
594
621
|
"hover:tw-underline",
|
|
595
622
|
"hover:active:tw-bg-transparent",
|
|
596
|
-
"focus-visible:tw-ring-
|
|
623
|
+
"focus-visible:tw-ring-ring/50"
|
|
597
624
|
]
|
|
598
625
|
},
|
|
599
626
|
size: {
|
|
@@ -628,8 +655,7 @@ var Button = ({
|
|
|
628
655
|
block = false,
|
|
629
656
|
...buttonProps
|
|
630
657
|
}) => {
|
|
631
|
-
const
|
|
632
|
-
const renderArgo = !isLegacy;
|
|
658
|
+
const renderArgo = useArgoDesign();
|
|
633
659
|
const Comp = asChild ? reactSlot.Root : "button";
|
|
634
660
|
const isIconOnly = String(size).startsWith("icon");
|
|
635
661
|
const classNames = renderArgo ? argoVariants({ variant, size, block, className }) : variants({ size, variant, block, className });
|
|
@@ -756,15 +782,44 @@ var ButtonToolbar = ({ value, children }) => {
|
|
|
756
782
|
children
|
|
757
783
|
] });
|
|
758
784
|
};
|
|
759
|
-
var
|
|
785
|
+
var resolveToken = (token, fallbackChannels, alpha) => {
|
|
786
|
+
const channels = typeof document === "undefined" ? fallbackChannels : getComputedStyle(document.documentElement).getPropertyValue(`--color-${token}`).trim() || fallbackChannels;
|
|
787
|
+
return alpha === void 0 ? `rgb(${channels})` : `rgb(${channels} / ${alpha})`;
|
|
788
|
+
};
|
|
789
|
+
var SSR_SIGNAL = "ssr";
|
|
790
|
+
var readThemeSignal = () => {
|
|
791
|
+
if (typeof document === "undefined") return SSR_SIGNAL;
|
|
792
|
+
const root = document.documentElement;
|
|
793
|
+
return `${root.getAttribute("data-theme") ?? ""}:${root.getAttribute("data-brand") ?? ""}`;
|
|
794
|
+
};
|
|
795
|
+
var subscribeThemeSignal = (onChange) => {
|
|
796
|
+
if (typeof document === "undefined") return () => {
|
|
797
|
+
};
|
|
798
|
+
const observer = new MutationObserver(onChange);
|
|
799
|
+
observer.observe(document.documentElement, {
|
|
800
|
+
attributes: true,
|
|
801
|
+
attributeFilter: ["data-theme", "data-brand"]
|
|
802
|
+
});
|
|
803
|
+
return () => observer.disconnect();
|
|
804
|
+
};
|
|
805
|
+
var useThemeSignal = () => react.useSyncExternalStore(subscribeThemeSignal, readThemeSignal, () => SSR_SIGNAL);
|
|
806
|
+
var useThemedExtension = (build, deps = []) => {
|
|
807
|
+
const themeSignal = useThemeSignal();
|
|
808
|
+
return react.useMemo(build, [themeSignal, ...deps]);
|
|
809
|
+
};
|
|
810
|
+
|
|
811
|
+
// src/components/CodeEditor/helpers.ts
|
|
812
|
+
var buildBaseThemeStyles = () => ({
|
|
760
813
|
"*": { lineHeight: "20px" },
|
|
761
814
|
"*::selection": {
|
|
762
|
-
backgroundColor:
|
|
763
|
-
color: `${
|
|
815
|
+
backgroundColor: resolveToken("primary", "31 143 255"),
|
|
816
|
+
color: `${resolveToken("primary-foreground", "255 255 255")} !important`
|
|
817
|
+
},
|
|
818
|
+
'&.cm-editor:has(.cm-content[contenteditable="false"])': {
|
|
819
|
+
backgroundColor: resolveToken("secondary", "226 232 240")
|
|
764
820
|
},
|
|
765
|
-
'&.cm-editor:has(.cm-content[contenteditable="false"])': { backgroundColor: colors__default.default.neutral[150] },
|
|
766
821
|
'&.cm-editor:has(.cm-content[contenteditable="false"]) .cm-gutters': {
|
|
767
|
-
backgroundColor:
|
|
822
|
+
backgroundColor: resolveToken("border", "229 231 235")
|
|
768
823
|
},
|
|
769
824
|
"&.cm-editor .cm-scroller": { overflowAnchor: "none" },
|
|
770
825
|
"&.cm-editor, &.cm-editor .cm-scroller": {
|
|
@@ -780,11 +835,11 @@ var baseThemeStyles = {
|
|
|
780
835
|
".cm-line .tok-string": { color: colors__default.default.warning[700] },
|
|
781
836
|
// merge (diff) view
|
|
782
837
|
'&[class*="cm-merge-"] .cm-deletedLine': { backgroundColor: colors__default.default.error[100] },
|
|
783
|
-
'&[class*="cm-merge-"] .cm-changedLine': { backgroundColor: colors__default.default.
|
|
838
|
+
'&[class*="cm-merge-"] .cm-changedLine': { backgroundColor: colors__default.default.green[100] },
|
|
784
839
|
'&[class*="cm-merge-"] .cm-deletedLineGutter': { backgroundColor: colors__default.default.error[200] },
|
|
785
|
-
'&[class*="cm-merge-"] .cm-changedLineGutter': { backgroundColor: colors__default.default.
|
|
840
|
+
'&[class*="cm-merge-"] .cm-changedLineGutter': { backgroundColor: colors__default.default.green[200] },
|
|
786
841
|
'&[class*="cm-merge-"] .cm-deletedText': { background: colors__default.default.error[200] },
|
|
787
|
-
'&[class*="cm-merge-"] .cm-changedText': { background: colors__default.default.
|
|
842
|
+
'&[class*="cm-merge-"] .cm-changedText': { background: colors__default.default.green[200] },
|
|
788
843
|
'&[class*="cm-merge-"]': {
|
|
789
844
|
backgroundColor: `${colors__default.default.white} !important`
|
|
790
845
|
},
|
|
@@ -793,16 +848,18 @@ var baseThemeStyles = {
|
|
|
793
848
|
},
|
|
794
849
|
".cm-changeGutter": { position: "absolute", zIndex: -1, width: "100%", paddingLeft: 0 },
|
|
795
850
|
'&[class*="cm-merge-"] .cm-changedLine,&[class*="cm-merge-"] .cm-line, &[class*="cm-merge-"] .cm-deletedChunk': { paddingLeft: 0 }
|
|
796
|
-
};
|
|
851
|
+
});
|
|
797
852
|
var BASIS_SETUP = { drawSelection: false };
|
|
798
|
-
var
|
|
853
|
+
var buildCustomTheme = () => codemirrorThemeGithub.githubLightInit({
|
|
799
854
|
settings: {
|
|
800
855
|
fontFamily: `'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New'`,
|
|
801
|
-
background:
|
|
802
|
-
|
|
856
|
+
background: resolveToken("background", "249 250 251"),
|
|
857
|
+
foreground: resolveToken("foreground", "30 41 59"),
|
|
858
|
+
gutterBackground: resolveToken("muted", "241 245 249"),
|
|
859
|
+
gutterForeground: resolveToken("muted-foreground", "100 116 139"),
|
|
803
860
|
gutterBorder: "transparent",
|
|
804
861
|
lineHighlight: "transparent",
|
|
805
|
-
selection:
|
|
862
|
+
selection: resolveToken("primary", "31 143 255")
|
|
806
863
|
}
|
|
807
864
|
});
|
|
808
865
|
var getLanguageMode = (mode) => {
|
|
@@ -920,6 +977,8 @@ var CodeEditor = ({
|
|
|
920
977
|
renderAdditionalButtons,
|
|
921
978
|
className
|
|
922
979
|
}) => {
|
|
980
|
+
const customTheme = useThemedExtension(buildCustomTheme);
|
|
981
|
+
const baseTheme = useThemedExtension(() => view.EditorView.theme(buildBaseThemeStyles()));
|
|
923
982
|
const commonExtensions = react.useMemo(() => {
|
|
924
983
|
return [
|
|
925
984
|
getLanguageMode(mode),
|
|
@@ -939,9 +998,9 @@ var CodeEditor = ({
|
|
|
939
998
|
}))
|
|
940
999
|
),
|
|
941
1000
|
autocomplete.autocompletion({ activateOnTyping: completeAny }),
|
|
942
|
-
|
|
1001
|
+
baseTheme
|
|
943
1002
|
].filter(Boolean);
|
|
944
|
-
}, [autocompletions, completeAny, extraKeys, mode, withLineWrapping]);
|
|
1003
|
+
}, [autocompletions, completeAny, extraKeys, mode, withLineWrapping, baseTheme]);
|
|
945
1004
|
const extensions = react.useMemo(() => {
|
|
946
1005
|
return [
|
|
947
1006
|
...commonExtensions,
|
|
@@ -1156,19 +1215,19 @@ var activeQueryHighlight = (splitQueries) => {
|
|
|
1156
1215
|
),
|
|
1157
1216
|
view.EditorView.baseTheme({
|
|
1158
1217
|
".cm-active-query": {
|
|
1159
|
-
boxShadow: `inset -1px 0 0 0 ${colors__default.default.
|
|
1218
|
+
boxShadow: `inset -1px 0 0 0 ${colors__default.default.blue[300]}, inset 1px 0 0 0 ${colors__default.default.blue[300]}`,
|
|
1160
1219
|
marginRight: "8px"
|
|
1161
1220
|
},
|
|
1162
1221
|
".cm-active-query-first": {
|
|
1163
|
-
boxShadow: `inset -1px 0 0 0 ${colors__default.default.
|
|
1222
|
+
boxShadow: `inset -1px 0 0 0 ${colors__default.default.blue[300]}, inset 1px 0 0 0 ${colors__default.default.blue[300]}, inset 0 1px 0 0 ${colors__default.default.blue[300]}`,
|
|
1164
1223
|
borderRadius: "4px 4px 0 0"
|
|
1165
1224
|
},
|
|
1166
1225
|
".cm-active-query-last": {
|
|
1167
|
-
boxShadow: `inset -1px 0 0 0 ${colors__default.default.
|
|
1226
|
+
boxShadow: `inset -1px 0 0 0 ${colors__default.default.blue[300]}, inset 1px 0 0 0 ${colors__default.default.blue[300]}, inset 0 -1px 0 0 ${colors__default.default.blue[300]}`,
|
|
1168
1227
|
borderRadius: "0 0 4px 4px"
|
|
1169
1228
|
},
|
|
1170
1229
|
".cm-active-query-first.cm-active-query-last": {
|
|
1171
|
-
boxShadow: `inset 0 0 0 1px ${colors__default.default.
|
|
1230
|
+
boxShadow: `inset 0 0 0 1px ${colors__default.default.blue[300]}`,
|
|
1172
1231
|
borderRadius: "4px"
|
|
1173
1232
|
}
|
|
1174
1233
|
})
|
|
@@ -1282,13 +1341,13 @@ var highlightedLinesTheme = view.EditorView.baseTheme({
|
|
|
1282
1341
|
".cm-highlight-marker": {
|
|
1283
1342
|
width: "2px",
|
|
1284
1343
|
height: "100%",
|
|
1285
|
-
backgroundColor: colors__default.default.
|
|
1344
|
+
backgroundColor: colors__default.default.blue[500]
|
|
1286
1345
|
},
|
|
1287
1346
|
".cm-error-line": {
|
|
1288
1347
|
backgroundColor: `${colors__default.default.error[100]} !important`
|
|
1289
1348
|
},
|
|
1290
1349
|
".cm-processing-line": {
|
|
1291
|
-
backgroundColor: `${colors__default.default.
|
|
1350
|
+
backgroundColor: `${colors__default.default.blue[100]} !important`
|
|
1292
1351
|
}
|
|
1293
1352
|
});
|
|
1294
1353
|
function highlightingExtension(queryParser) {
|
|
@@ -1392,13 +1451,13 @@ var searchViewPlugin = view.ViewPlugin.fromClass(
|
|
|
1392
1451
|
);
|
|
1393
1452
|
var searchTheme = view.EditorView.baseTheme({
|
|
1394
1453
|
".cm-searchMatch": {
|
|
1395
|
-
backgroundColor: colors__default.default.
|
|
1454
|
+
backgroundColor: colors__default.default.blue[100]
|
|
1396
1455
|
},
|
|
1397
1456
|
".cm-searchMatch > span": {
|
|
1398
|
-
color: `${colors__default.default.
|
|
1457
|
+
color: `${colors__default.default.blue[600]} !important`
|
|
1399
1458
|
},
|
|
1400
1459
|
".cm-searchMatch-selected": {
|
|
1401
|
-
backgroundColor: colors__default.default.
|
|
1460
|
+
backgroundColor: colors__default.default.blue[600]
|
|
1402
1461
|
},
|
|
1403
1462
|
".cm-searchMatch-selected > span": {
|
|
1404
1463
|
color: `${colors__default.default.white} !important`
|
|
@@ -1426,29 +1485,31 @@ var CUSTOM_KEYMAP = [
|
|
|
1426
1485
|
}
|
|
1427
1486
|
}
|
|
1428
1487
|
];
|
|
1429
|
-
var
|
|
1430
|
-
...
|
|
1488
|
+
var buildTheme = () => ({
|
|
1489
|
+
...buildBaseThemeStyles(),
|
|
1431
1490
|
"&.cm-editor": {
|
|
1432
1491
|
border: "solid 1px transparent",
|
|
1433
|
-
background:
|
|
1492
|
+
background: resolveToken("card", "255 255 255"),
|
|
1434
1493
|
borderRadius: "8px",
|
|
1435
1494
|
paddingTop: "8px",
|
|
1436
1495
|
paddingBottom: "8px"
|
|
1437
1496
|
},
|
|
1438
1497
|
'&.cm-editor:has(.cm-content[contenteditable="true"]):hover': {
|
|
1439
|
-
borderColor:
|
|
1498
|
+
borderColor: resolveToken("ring", "31 143 255")
|
|
1440
1499
|
},
|
|
1441
1500
|
'&.cm-editor:has(.cm-content[contenteditable="true"]):focus-within': {
|
|
1442
|
-
borderColor:
|
|
1443
|
-
boxShadow: `0 0 0 4px ${
|
|
1501
|
+
borderColor: resolveToken("ring", "31 143 255"),
|
|
1502
|
+
boxShadow: `0 0 0 4px ${resolveToken("ring", "31 143 255", 0.3)}`
|
|
1444
1503
|
},
|
|
1445
1504
|
"&.cm-editor .cm-scroller": { overflowAnchor: "none" },
|
|
1446
|
-
"&.cm-editor :is(.cm-gutters,.cm-scroller)": { background:
|
|
1447
|
-
'&.cm-editor:has(.cm-content[contenteditable="false"])': {
|
|
1505
|
+
"&.cm-editor :is(.cm-gutters,.cm-scroller)": { background: resolveToken("card", "255 255 255") },
|
|
1506
|
+
'&.cm-editor:has(.cm-content[contenteditable="false"])': {
|
|
1507
|
+
background: resolveToken("muted", "241 245 249")
|
|
1508
|
+
},
|
|
1448
1509
|
'&.cm-editor:has(.cm-content[contenteditable="false"]) :is(.cm-scroller,.cm-gutters)': {
|
|
1449
|
-
background:
|
|
1510
|
+
background: resolveToken("muted", "241 245 249")
|
|
1450
1511
|
}
|
|
1451
|
-
};
|
|
1512
|
+
});
|
|
1452
1513
|
var SqlEditor = ({
|
|
1453
1514
|
value,
|
|
1454
1515
|
onChange,
|
|
@@ -1474,6 +1535,8 @@ var SqlEditor = ({
|
|
|
1474
1535
|
dialect
|
|
1475
1536
|
}) => {
|
|
1476
1537
|
const editorRef = react.useRef(null);
|
|
1538
|
+
const customTheme = useThemedExtension(buildCustomTheme);
|
|
1539
|
+
const themeExtension = useThemedExtension(() => CodeMirror.EditorView.theme(buildTheme()));
|
|
1477
1540
|
const extensions = react.useMemo(() => {
|
|
1478
1541
|
const baseKeymap = [...commands.defaultKeymap, ...CUSTOM_KEYMAP];
|
|
1479
1542
|
return [
|
|
@@ -1482,7 +1545,7 @@ var SqlEditor = ({
|
|
|
1482
1545
|
...codemirrorLangSql.installExtensions({ schema, defaultDatabase, defaultSchema, variables, dialect }),
|
|
1483
1546
|
searchExtension(),
|
|
1484
1547
|
highlightingExtension(queryParser),
|
|
1485
|
-
|
|
1548
|
+
themeExtension,
|
|
1486
1549
|
onBlurEditor ? CodeMirror.EditorView.domEventHandlers({ blur: (_, view) => onBlurEditor(view) }) : [],
|
|
1487
1550
|
onFocusEditor ? CodeMirror.EditorView.domEventHandlers({ focus: (_, view) => onFocusEditor(view) }) : []
|
|
1488
1551
|
];
|
|
@@ -1495,7 +1558,8 @@ var SqlEditor = ({
|
|
|
1495
1558
|
variables,
|
|
1496
1559
|
dialect,
|
|
1497
1560
|
onBlurEditor,
|
|
1498
|
-
onFocusEditor
|
|
1561
|
+
onFocusEditor,
|
|
1562
|
+
themeExtension
|
|
1499
1563
|
]);
|
|
1500
1564
|
const defaultSetup = react.useMemo(() => {
|
|
1501
1565
|
return { ...BASIS_SETUP2, lineNumbers };
|
|
@@ -1656,23 +1720,23 @@ var createDiffHighlightExtension = () => {
|
|
|
1656
1720
|
view.gutterLineClass.from(f, (val) => val.gutterMarkers)
|
|
1657
1721
|
]
|
|
1658
1722
|
});
|
|
1659
|
-
const
|
|
1723
|
+
const theme = view.EditorView.theme({
|
|
1660
1724
|
".cm-merge-safe-line": {
|
|
1661
|
-
backgroundColor: `${colors__default.default.
|
|
1662
|
-
boxShadow: `inset 3px 0 0 ${colors__default.default.
|
|
1725
|
+
backgroundColor: `${colors__default.default.green[100]} !important`,
|
|
1726
|
+
boxShadow: `inset 3px 0 0 ${colors__default.default.green[500]}`
|
|
1663
1727
|
},
|
|
1664
1728
|
".cm-merge-conflict-line": {
|
|
1665
1729
|
backgroundColor: `${colors__default.default.warning[100]} !important`,
|
|
1666
1730
|
boxShadow: `inset 3px 0 0 ${colors__default.default.warning[500]}`
|
|
1667
1731
|
},
|
|
1668
1732
|
".cm-merge-safe-gutter": {
|
|
1669
|
-
backgroundColor: `${colors__default.default.
|
|
1733
|
+
backgroundColor: `${colors__default.default.green[200]} !important`
|
|
1670
1734
|
},
|
|
1671
1735
|
".cm-merge-conflict-gutter": {
|
|
1672
1736
|
backgroundColor: `${colors__default.default.warning[200]} !important`
|
|
1673
1737
|
}
|
|
1674
1738
|
});
|
|
1675
|
-
return [field,
|
|
1739
|
+
return [field, theme];
|
|
1676
1740
|
};
|
|
1677
1741
|
var updateHighlightedLines = (view, lines, classification) => {
|
|
1678
1742
|
view.dispatch({ effects: setHighlightedLines.of({ lines, classification }) });
|
|
@@ -1692,21 +1756,31 @@ var MergePane = ({
|
|
|
1692
1756
|
deleted = false
|
|
1693
1757
|
}) => {
|
|
1694
1758
|
const editorRef = react.useRef(null);
|
|
1759
|
+
const themeExtension = useThemedExtension(
|
|
1760
|
+
() => view.EditorView.theme({
|
|
1761
|
+
"&.cm-editor": {
|
|
1762
|
+
height: "100%",
|
|
1763
|
+
backgroundColor: deleted ? colors__default.default.error[100] : resolveToken("background", "249 250 251"),
|
|
1764
|
+
// Pair the token-driven surface with a token-driven text color so line
|
|
1765
|
+
// content stays readable when the pane's `--color-background` goes dark.
|
|
1766
|
+
// The deleted pane keeps default dark text on its fixed light-red wash.
|
|
1767
|
+
...deleted ? {} : { color: resolveToken("foreground", "30 41 59") },
|
|
1768
|
+
outline: "none"
|
|
1769
|
+
},
|
|
1770
|
+
".cm-gutters": {
|
|
1771
|
+
backgroundColor: deleted ? colors__default.default.error[200] : resolveToken("muted", "241 245 249"),
|
|
1772
|
+
...deleted ? {} : { color: resolveToken("muted-foreground", "100 116 139") }
|
|
1773
|
+
},
|
|
1774
|
+
"*": { lineHeight: `${LINE_HEIGHT_PX}px` },
|
|
1775
|
+
".cm-lineNumbers .cm-gutterElement": { padding: "0 0 0 25px" }
|
|
1776
|
+
}),
|
|
1777
|
+
[deleted]
|
|
1778
|
+
);
|
|
1779
|
+
const diffHighlightExtension = react.useMemo(() => createDiffHighlightExtension(), []);
|
|
1695
1780
|
const extensions = react.useMemo(
|
|
1696
1781
|
() => [
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
"&.cm-editor": {
|
|
1700
|
-
height: "100%",
|
|
1701
|
-
backgroundColor: deleted ? colors__default.default.error[100] : colors__default.default.neutral[50],
|
|
1702
|
-
outline: "none"
|
|
1703
|
-
},
|
|
1704
|
-
".cm-gutters": {
|
|
1705
|
-
backgroundColor: deleted ? colors__default.default.error[200] : colors__default.default.neutral[100]
|
|
1706
|
-
},
|
|
1707
|
-
"*": { lineHeight: `${LINE_HEIGHT_PX}px` },
|
|
1708
|
-
".cm-lineNumbers .cm-gutterElement": { padding: "0 0 0 25px" }
|
|
1709
|
-
}),
|
|
1782
|
+
diffHighlightExtension,
|
|
1783
|
+
themeExtension,
|
|
1710
1784
|
// Recalc viewport after every doc change so late-settling layouts (alerts
|
|
1711
1785
|
// appearing above the editor) don't leave trailing lines blank.
|
|
1712
1786
|
view.EditorView.updateListener.of((update) => {
|
|
@@ -1715,7 +1789,7 @@ var MergePane = ({
|
|
|
1715
1789
|
}
|
|
1716
1790
|
})
|
|
1717
1791
|
],
|
|
1718
|
-
[
|
|
1792
|
+
[diffHighlightExtension, themeExtension]
|
|
1719
1793
|
);
|
|
1720
1794
|
react.useEffect(() => {
|
|
1721
1795
|
const view = editorRef.current?.view;
|