@keboola/design 4.3.2 → 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.
@@ -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/internal/useIsLegacyBrand.ts
91
- var useIsLegacyBrand = () => {
92
- const context = react.use(ThemeContext);
93
- return context === null || context.brand.id === brandRegistry.keboolaLegacy.id;
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 isLegacy = useIsLegacyBrand();
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-500"]
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-[var(--radius-lg,0.25rem)]",
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-primary/50"
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-primary/50"
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
- "hover:not-disabled:tw-bg-accent",
576
- "hover:not-disabled:tw-text-accent-foreground",
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-primary/50"
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-accent",
586
- "hover:not-disabled:tw-text-accent-foreground",
587
- "hover:not-disabled:tw-border-accent",
588
- "focus-visible:tw-ring-primary/50"
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-primary/50"
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 isLegacy = useIsLegacyBrand();
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 baseThemeStyles = {
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: colors__default.default.secondary[500],
763
- color: `${colors__default.default.white} !important`
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: colors__default.default.neutral[200]
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.primary[100] },
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.primary[200] },
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.primary[200] },
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 customTheme = codemirrorThemeGithub.githubLightInit({
853
+ var buildCustomTheme = () => codemirrorThemeGithub.githubLightInit({
799
854
  settings: {
800
855
  fontFamily: `'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New'`,
801
- background: colors__default.default.neutral[50],
802
- gutterBackground: colors__default.default.neutral[100],
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: colors__default.default.secondary[500]
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
- view.EditorView.theme(baseThemeStyles)
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.secondary[300]}, inset 1px 0 0 0 ${colors__default.default.secondary[300]}`,
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.secondary[300]}, inset 1px 0 0 0 ${colors__default.default.secondary[300]}, inset 0 1px 0 0 ${colors__default.default.secondary[300]}`,
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.secondary[300]}, inset 1px 0 0 0 ${colors__default.default.secondary[300]}, inset 0 -1px 0 0 ${colors__default.default.secondary[300]}`,
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.secondary[300]}`,
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.secondary[500]
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.secondary[100]} !important`
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.secondary[100]
1454
+ backgroundColor: colors__default.default.blue[100]
1396
1455
  },
1397
1456
  ".cm-searchMatch > span": {
1398
- color: `${colors__default.default.secondary[600]} !important`
1457
+ color: `${colors__default.default.blue[600]} !important`
1399
1458
  },
1400
1459
  ".cm-searchMatch-selected": {
1401
- backgroundColor: colors__default.default.secondary[600]
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 theme = {
1430
- ...baseThemeStyles,
1488
+ var buildTheme = () => ({
1489
+ ...buildBaseThemeStyles(),
1431
1490
  "&.cm-editor": {
1432
1491
  border: "solid 1px transparent",
1433
- background: colors__default.default.white,
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: colors__default.default.secondary[500]
1498
+ borderColor: resolveToken("ring", "31 143 255")
1440
1499
  },
1441
1500
  '&.cm-editor:has(.cm-content[contenteditable="true"]):focus-within': {
1442
- borderColor: colors__default.default.secondary[500],
1443
- boxShadow: `0 0 0 4px ${colors__default.default.secondary[200]}`
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: colors__default.default.white },
1447
- '&.cm-editor:has(.cm-content[contenteditable="false"])': { background: colors__default.default.neutral[100] },
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: colors__default.default.neutral[100]
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
- CodeMirror.EditorView.theme(theme),
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 theme2 = view.EditorView.theme({
1723
+ const theme = view.EditorView.theme({
1660
1724
  ".cm-merge-safe-line": {
1661
- backgroundColor: `${colors__default.default.primary[100]} !important`,
1662
- boxShadow: `inset 3px 0 0 ${colors__default.default.primary[500]}`
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.primary[200]} !important`
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, theme2];
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
- createDiffHighlightExtension(),
1698
- view.EditorView.theme({
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
- [deleted]
1792
+ [diffHighlightExtension, themeExtension]
1719
1793
  );
1720
1794
  react.useEffect(() => {
1721
1795
  const view = editorRef.current?.view;