@keboola/design 8.0.0 → 9.1.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants/keyCodes.ts","../src/hooks/useStableCallback.ts","../src/utils/classNames.ts","../src/utils/copyToClipboard.ts","../src/components/ThemeProvider/utils.ts","../src/components/ThemeProvider/defaults.ts","../src/components/ThemeProvider/context.tsx","../src/components/Tooltip/TooltipContent.tsx","../src/components/Tooltip/TooltipRoot.tsx","../src/components/Tooltip/TooltipTrigger.tsx","../src/components/Tooltip/Tooltip.tsx","../src/utils/escapeStringRegexp.ts","../src/components/HelpBlock/HelpBlock.tsx","../src/components/Button/styles.ts","../src/components/Button/Button.tsx","../src/components/Clipboard/Clipboard.tsx","../src/blocks/ClipboardButton/ClipboardButton.tsx","../src/components/CodeEditor/ButtonToolbar.tsx","../src/components/CodeEditor/modes/dbt.ts","../src/components/CodeEditor/modes/jsonnet.ts","../src/components/CodeEditor/tokenTheme.ts","../src/components/CodeEditor/helpers.ts","../src/components/Kbd/KbdSeparator.tsx","../src/components/Kbd/KbdGroup.tsx","../src/components/Kbd/styles.ts","../src/components/Kbd/Kbd.tsx","../src/components/CodeEditor/ToggleComponentHelp.tsx","../src/components/CodeEditor/CodeEditor.tsx","../src/components/CodeEditor/activeQueryHighlight.ts","../src/components/CodeEditor/highlighting.ts","../src/components/CodeEditor/search.ts","../src/components/CodeEditor/SqlEditor.tsx","../src/components/MergeEditor/constants.ts","../src/components/MergeEditor/AcceptControls/AcceptButton.tsx","../src/components/MergeEditor/AcceptControls/AcceptControls.tsx","../src/components/MergeEditor/decorations.ts","../src/components/MergeEditor/MergePane.tsx","../src/components/MergeEditor/useScrollSync.ts","../src/components/MergeEditor/MergeEditor.tsx"],"names":["useRef","useLayoutEffect","useCallback","extendTailwindMerge","clsx","keboolaLegacySidebar","keboolaLegacyTopnav","createContext","use","cva","Portal","jsx","Content","Root","Trigger","useState","jsxs","Loader2","Slottable","Clipboard","text","Copy","simpleMode","useSyncExternalStore","colors","githubLightInit","json","python","sql","MySQL","PostgreSQL","MSSQL","StreamLanguage","sfsql","PLSQL","r","shell","toml","javascript","Children","Fragment","EditorView","useMemo","linter","jsonParseLinter","EditorState","completeAnyWord","keymap","autocompletion","cmPlaceholder","unifiedMergeView","CodeMirror","Decoration","view","ViewPlugin","GutterMarker","StateEffect","StateField","gutter","RangeSet","defaultKeymap","installExtensions","useEffect","ChevronsRight","ChevronsLeft","X","RangeSetBuilder","gutterLineClass","EMPTY_LINES","EMPTY_CLASSIFICATION"],"mappings":"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","file":"editors.cjs","sourcesContent":["export const keyCodes = {\n ENTER: 'Enter',\n ESCAPE: 'Escape',\n SPACE: ' ',\n};\n","import { useCallback, useLayoutEffect, useRef } from 'react';\n\n/**\n * A callback with a permanently stable identity that always sees the latest\n * render's values — for handing to a third-party component that compares\n * handlers by identity and does expensive work when one changes.\n *\n * React 19.2's `useEffectEvent` does this in one line, but it is scoped to\n * Effects and explicitly not to be passed to another component, which is the\n * whole point here.\n *\n * The swap is a layout effect rather than a passive one so it lands before the\n * browser can paint and accept input against the previous render's handler.\n */\nexport const useStableCallback = <Args extends unknown[], Result>(\n callback: (...args: Args) => Result,\n): ((...args: Args) => Result) => {\n const latestRef = useRef(callback);\n\n useLayoutEffect(() => {\n latestRef.current = callback;\n }, [callback]);\n\n return useCallback((...args: Args) => latestRef.current(...args), []);\n};\n","import { type ClassValue, clsx } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\n// tailwind-merge v3 (Tailwind v4): the prefix drops the trailing separator —\n// `tw:` → `tw` (the `:` separator is implied).\nconst twMerge = extendTailwindMerge({\n prefix: 'tw',\n});\n\nexport const cn = (...classes: ClassValue[]) => twMerge(clsx(...classes));\n","export const copyToClipboard = (text: string) => {\n return navigator.clipboard.writeText(text);\n};\n","import type { Brand } from '@keboola/brand-registry';\n\nimport type { Theme } from './types';\n\nexport const createTheme = (brand: Brand): Theme => ({\n id: brand.id,\n name: brand.name,\n shell: brand.shell,\n logo: brand.logo,\n});\n\nexport type CssVars = {\n set: (name: string, value: string | undefined) => void;\n expose: () => Record<string, string>;\n};\n\nexport const createCssVars = (): CssVars => {\n const vars: Record<string, string> = {};\n return {\n set: (name, value) => {\n if (value !== undefined) vars[name] = value;\n },\n expose: () => ({ ...vars }),\n };\n};\n","import type { Brand } from '@keboola/brand-registry';\nimport { keboolaLegacySidebar, keboolaLegacyTopnav } from '@keboola/brand-registry';\n\nimport type { ResolvedColorScheme } from './types';\nimport { createTheme } from './utils';\n\nexport const keboolaLegacyIds = [keboolaLegacySidebar.id, keboolaLegacyTopnav.id];\nexport const DEFAULT_COLOR_SCHEME: ResolvedColorScheme = 'light';\n\n// Sentinel active-brand id that maps to no registry brand. It resolves to\n// `defaultBrand` below, whose empty theme injects nothing — so the design-system\n// stylesheet defaults (`:root` / `[data-theme='dark']`) provide every token.\nexport const DEFAULT_BRAND_ID = 'design-system';\n\n// The \"no brand\" fallback: an empty theme → no CSS vars injected → the\n// stylesheet defaults win. Its shell/name still drive AppShell + switcher label.\nexport const defaultBrand: Brand = {\n id: DEFAULT_BRAND_ID,\n name: 'Design System',\n shell: 'sidebar',\n theme: {},\n};\nexport const defaultTheme = createTheme(defaultBrand);\n\nexport const DEFAULT_BRANDS: Brand[] = [];\n","import { createContext, use } from 'react';\n\nimport { DEFAULT_COLOR_SCHEME, defaultTheme } from './defaults';\nimport type { Theme } from './types';\nimport type { useBrandState } from './useBrandState';\nimport type { useColorSchemeState } from './useColorSchemeState';\n\nexport type ThemeContextValue = ReturnType<typeof useColorSchemeState> &\n ReturnType<typeof useBrandState> & {\n themes: Theme[];\n currentTheme: Theme;\n };\n\nconst noop = () => void 0;\n\nconst defaultContext: ThemeContextValue = {\n scheme: DEFAULT_COLOR_SCHEME,\n resolvedScheme: DEFAULT_COLOR_SCHEME,\n setScheme: noop,\n brandId: defaultTheme.id,\n setBrand: noop,\n\n themes: [defaultTheme],\n currentTheme: defaultTheme,\n};\n\nexport const ThemeContext = createContext(defaultContext);\n\nexport const useTheme = () => use(ThemeContext);\n\n/**\n * TEMPORARY — kbc-ui-internal only.\n *\n * Flags whether the subtree renders the argo design language. Defaults to argo\n * (`true`) — the modern default; legacy chrome is the exception. It exists\n * solely to bridge kbc-ui while its chrome is migrated off the legacy design\n * language: kbc-ui provides `false` for legacy brands/surfaces (see its\n * `AppThemeProvider`) and reads it via `useArgoDesign`. `ThemeProvider` does\n * not set it — argo is decoupled from the brand. Once every kbc-ui surface has\n * been migrated, this context and its hook can be deleted.\n */\nexport const ArgoDesignContext = createContext<boolean>(true);\n\nexport const useArgoDesign = () => use(ArgoDesignContext);\n","import type { ComponentProps } from 'react';\nimport { Content, Portal } from '@radix-ui/react-tooltip';\nimport type { VariantProps } from 'class-variance-authority';\nimport { cva } from 'class-variance-authority';\n\nimport { useArgoDesign } from '../ThemeProvider/context';\n\nconst tooltipVariants = cva(\n [\n 'tailwindcss-preflight',\n 'tw:inline-block',\n 'tw:break-anywhere',\n 'tw:max-h-96',\n 'tw:overflow-y-auto',\n 'tw:z-[1060]',\n\n // legacy (dark) chrome — default\n 'tw:rounded',\n 'tw:bg-neutral-800',\n 'tw:text-white',\n\n // argo chrome overrides — semantic floating-panel tokens\n 'tw:data-[argo=true]:rounded-2xl',\n 'tw:data-[argo=true]:border',\n 'tw:data-[argo=true]:border-solid',\n 'tw:data-[argo=true]:border-border',\n 'tw:data-[argo=true]:bg-popover',\n 'tw:data-[argo=true]:text-popover-foreground',\n 'tw:data-[argo=true]:shadow-md',\n\n // argo open animation\n 'tw:data-[argo=true]:data-[state=delayed-open]:animate-in',\n 'tw:data-[argo=true]:data-[state=instant-open]:animate-in',\n 'tw:data-[argo=true]:data-[state=delayed-open]:fade-in-0',\n 'tw:data-[argo=true]:data-[state=instant-open]:fade-in-0',\n 'tw:data-[argo=true]:data-[state=delayed-open]:zoom-in-95',\n 'tw:data-[argo=true]:data-[state=instant-open]:zoom-in-95',\n\n // argo closed animation\n 'tw:data-[argo=true]:data-[state=closed]:animate-out',\n 'tw:data-[argo=true]:data-[state=closed]:fade-out-0',\n 'tw:data-[argo=true]:data-[state=closed]:zoom-out-95',\n\n // argo position animation\n 'tw:data-[argo=true]:data-[side=bottom]:slide-in-from-top-2',\n 'tw:data-[argo=true]:data-[side=left]:slide-in-from-right-2',\n 'tw:data-[argo=true]:data-[side=right]:slide-in-from-left-2',\n 'tw:data-[argo=true]:data-[side=top]:slide-in-from-bottom-2',\n ],\n {\n defaultVariants: {\n variant: 'action',\n },\n variants: {\n variant: {\n action: [\n 'tw:max-w-fit',\n 'tw:px-3',\n 'tw:py-2',\n\n 'tw:text-center',\n 'tw:text-xs',\n 'tw:font-medium',\n // Legacy chrome uppercases the action tooltip; the Keboola V2 brand\n // (`data-brand=\"keboola\"`) renders it in standard case instead.\n 'tw:uppercase',\n 'tw:tracking-wider',\n 'tw:[[data-brand=keboola]_&]:normal-case',\n 'tw:[[data-brand=keboola]_&]:tracking-normal',\n ],\n explanatory: [\n 'tw:max-w-80',\n 'tw:px-4',\n 'tw:py-3',\n 'tw:text-left',\n\n 'tw:text-sm',\n 'tw:font-normal',\n ],\n },\n },\n },\n);\n\ntype Props = {\n keepOpenOnPointerDownOutside?: boolean;\n placement?: ComponentProps<typeof Content>['side'];\n} & Omit<ComponentProps<typeof Content>, 'side'> &\n VariantProps<typeof tooltipVariants>;\n\nexport const TooltipContent = ({\n className,\n variant,\n keepOpenOnPointerDownOutside = false,\n children,\n onPointerDownOutside,\n sideOffset = 8,\n collisionPadding = 8,\n hideWhenDetached = true,\n placement = 'right',\n ...rest\n}: Props) => {\n const renderArgo = useArgoDesign();\n\n const handlePointerDownOutside: ComponentProps<typeof Content>['onPointerDownOutside'] = (\n event,\n ) => {\n if (keepOpenOnPointerDownOutside) event.preventDefault();\n onPointerDownOutside?.(event);\n };\n\n return (\n <Portal>\n <Content\n {...rest}\n // Marks the dark (non-argo) tooltip chrome so styles.css can invert\n // nested `.tw-prose` for contrast.\n data-tooltip-content={renderArgo ? undefined : true}\n data-argo={renderArgo}\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n onPointerDownOutside={handlePointerDownOutside}\n className={tooltipVariants({ className, variant })}\n hideWhenDetached={hideWhenDetached}\n side={placement}\n >\n {children}\n </Content>\n </Portal>\n );\n};\n","import type { ComponentProps } from 'react';\nimport { Root } from '@radix-ui/react-tooltip';\n\ntype Props = ComponentProps<typeof Root>;\n\nconst DELAY_SHOW_TOOLTIP = 300;\n\nexport const TooltipRoot = ({ children, delayDuration = DELAY_SHOW_TOOLTIP, ...rest }: Props) => (\n <Root {...rest} delayDuration={delayDuration}>\n {children}\n </Root>\n);\n","import type { ComponentProps } from 'react';\nimport { Trigger } from '@radix-ui/react-tooltip';\n\nimport { cn } from '../../utils';\n\ntype Props = {\n keepOpenOnClick?: boolean;\n} & ComponentProps<typeof Trigger>;\n\nexport const TooltipTrigger = ({\n ref,\n children,\n className,\n keepOpenOnClick = false,\n onClick,\n onPointerDown,\n asChild,\n ...rest\n}: Props) => {\n const handleClick: ComponentProps<typeof Trigger>['onClick'] = (event) => {\n if (keepOpenOnClick) event.preventDefault();\n onClick?.(event);\n };\n\n const handlePointerDown: ComponentProps<typeof Trigger>['onPointerDown'] = (event) => {\n if (keepOpenOnClick) event.preventDefault();\n onPointerDown?.(event);\n };\n\n return (\n <Trigger\n {...rest}\n asChild\n ref={ref}\n className={cn('tailwindcss-preflight', className)}\n onClick={handleClick}\n onPointerDown={handlePointerDown}\n >\n {asChild ? (\n children\n ) : (\n // Default-mode trigger wraps children in a span so Radix has a\n // single DOM element to attach handlers to. `tailwindcss-preflight`\n // (merged in via Slot) activates Tailwind's preflight inside the\n // span, which sets `svg { display: block }` — without an inline-flex\n // container that would stack any bare Lucide icon onto its own\n // line. `tw:inline-flex tw:items-center` keeps icon + text aligned.\n <span className=\"tw:inline-flex tw:items-center\">{children}</span>\n )}\n </Trigger>\n );\n};\n","import { useState } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport type { Content, Trigger } from '@radix-ui/react-tooltip';\nimport { Provider } from '@radix-ui/react-tooltip';\n\nimport { keyCodes } from '../../constants/keyCodes';\n\nimport { TooltipContent } from './TooltipContent';\nimport { TooltipRoot } from './TooltipRoot';\nimport { TooltipTrigger } from './TooltipTrigger';\n\nconst ACTION_TOOLTIP_LIMIT = 30;\n\ntype TriggerProps = {\n triggerAsChild?: boolean;\n};\n\n/**\n * Props for `Tooltip`. `tooltip` is the popup content; `children` is the trigger element.\n * `variant` auto-resolves to `\"explanatory\"` for strings >30 chars, else `\"action\"`.\n */\nexport type Props = {\n /** Keep the tooltip visible when the user clicks the trigger (useful for click-to-copy feedback). */\n keepOpenOnTriggerClick?: boolean;\n /** Content rendered inside the tooltip. Plain text only — no interactive elements (use `HoverCard` or `Popover` for that). */\n tooltip: ReactNode;\n children: ReactNode;\n placement?: ComponentProps<typeof Content>['side'];\n /** Forcibly hide the tooltip regardless of hover state. */\n forceHide?: boolean;\n /** Forcibly show the tooltip regardless of hover state. Useful for guided-tour overlays. */\n forceShow?: boolean;\n /** Hover delay before the tooltip opens, in ms. Defaults to the shared 300ms. */\n delayDuration?: number;\n className?: string;\n} & TriggerProps &\n Pick<ComponentProps<typeof TooltipContent>, 'variant' | 'className'>;\n\n/** Re-export of Radix `Tooltip.Provider`. Mount once at the app root so tooltips share delay state. */\nexport const TooltipProvider = Provider;\n\n/**\n * Short plain-text label that appears on hover or focus.\n *\n * **When to use:** describing an icon-only `Button`, explaining a disabled control, or labelling a\n * truncated value. Plain text only — auto-switches to the longer `\"explanatory\"` variant when the string\n * exceeds 30 characters.\n * **When NOT to use:** for rich preview content (multiple lines, formatted text, structured data) use\n * `HoverCard`; for tooltips containing links or buttons use `Popover` (interactive elements break a11y\n * inside a `Tooltip`).\n * **Composition:** wrap any focusable element via `triggerAsChild` so the tooltip targets the underlying\n * native element. Mount `TooltipProvider` once at the app root.\n *\n * @see RECIPES.md#disabled-button-tooltip — for the disabled-button + tooltip pattern\n */\nexport const Tooltip = ({\n tooltip,\n children,\n className,\n keepOpenOnTriggerClick = false,\n variant,\n placement = 'right',\n forceHide = false,\n forceShow = false,\n delayDuration,\n // trigger props\n triggerAsChild = false,\n}: Props) => {\n const [open, setOpen] = useState(false);\n\n const resolvedVariant = (() => {\n if (!!variant) return variant;\n if (typeof tooltip === 'string' && tooltip.length > ACTION_TOOLTIP_LIMIT) return 'explanatory';\n\n return 'action';\n })();\n\n const isActionVariant = resolvedVariant === 'action';\n\n const handleKeyUp: ComponentProps<typeof Trigger>['onKeyUp'] = (event) => {\n if (![keyCodes.ENTER, keyCodes.SPACE].includes(event.key)) return;\n event.stopPropagation();\n };\n\n return (\n <TooltipRoot\n open={!!tooltip && (open || forceShow) && !forceHide}\n onOpenChange={setOpen}\n delayDuration={delayDuration}\n disableHoverableContent={isActionVariant}\n >\n <TooltipTrigger\n asChild={triggerAsChild}\n keepOpenOnClick={keepOpenOnTriggerClick}\n onKeyUp={handleKeyUp}\n >\n {children}\n </TooltipTrigger>\n\n <TooltipContent\n className={className}\n variant={resolvedVariant}\n placement={placement}\n keepOpenOnPointerDownOutside={keepOpenOnTriggerClick}\n >\n {tooltip}\n </TooltipContent>\n </TooltipRoot>\n );\n};\n\nTooltip.Root = TooltipRoot;\nTooltip.Content = TooltipContent;\nTooltip.Trigger = TooltipTrigger;\n","// Escape characters with special meaning either inside or outside character sets.\n// Use a simple backslash escape when it's always valid, and a `\\xnn` escape when the simpler form would be disallowed by Unicode patterns' stricter grammar.\nexport const escapeStringRegexp = (string: string) =>\n string.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n","import type { ComponentPropsWithRef } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nconst helpVariants = cva(['tw:m-0', 'tw:text-xs'], {\n defaultVariants: {\n state: 'default',\n },\n variants: {\n state: {\n default: ['tw:text-muted-foreground'],\n warning: ['tw:text-warning'],\n },\n },\n});\n\ntype Props = ComponentPropsWithRef<'p'> & VariantProps<typeof helpVariants>;\n\nexport const HelpBlock = ({ children, className, state = 'default', ...rest }: Props) => {\n if (!children) return null;\n\n return (\n <p {...rest} className={helpVariants({ state, className })}>\n {children}\n </p>\n );\n};\n","import { cva } from 'class-variance-authority';\n\nexport const variants = cva(\n [\n 'tailwindcss-preflight',\n 'tw:group/button',\n 'tw:border-box',\n\n // layout\n 'tw:relative',\n 'tw:flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:gap-2',\n\n // text — chrome weight/tracking are brand-overridable tokens\n // (`--font-weight-medium` / `--letter-spacing-chrome`). Casing: standard case is\n // the default; only legacy brands (`keboola-legacy-*`) uppercase the chrome, so\n // modern brands (incl. Keboola V2) read naturally. Mirrors the V2 standard-case\n // treatment shipped for Tooltip/Badge (PR 7629).\n 'tw:text-xs',\n 'tw:leading-5',\n 'tw:font-medium',\n 'tw:[[data-brand^=keboola-legacy]_&]:tracking-chrome',\n 'tw:[[data-brand^=keboola-legacy]_&]:uppercase',\n\n // border — legacy (non-argo) chrome uses a fixed radius, not the brand token.\n 'tw:rounded',\n 'tw:border',\n 'tw:border-transparent',\n\n // styling\n 'tw:shadow-none',\n 'tw:[a]:cursor-pointer', // explicitly set for anchor\n\n 'tw:focus-visible:outline',\n 'tw:focus-visible:outline-1',\n 'tw:focus-visible:-outline-offset-1',\n 'tw:focus-visible:outline-ring',\n 'tw:focus-visible:ring-4',\n 'tw:focus-visible:ring-ring/30',\n\n // disabled\n 'tw:disabled:opacity-40',\n 'tw:disabled:cursor-not-allowed',\n\n // anchor support\n 'tw:!no-underline',\n 'tw:aria-disabled:opacity-40',\n 'tw:aria-disabled:cursor-not-allowed',\n\n 'tw:[&_svg]:shrink-0',\n ],\n {\n defaultVariants: {\n size: 'medium',\n variant: 'primary',\n block: false,\n },\n variants: {\n block: {\n true: ['tw:w-full'],\n },\n variant: {\n primary: [\n 'tw:text-white',\n 'tw:bg-primary-500',\n\n 'tw:focus:text-white',\n 'tw:hover:text-white',\n 'tw:hover:not-disabled:bg-primary-600',\n 'tw:active:not-disabled:bg-primary-800',\n\n // anchor disabled override\n 'tw:aria-disabled:!bg-primary-500',\n ],\n secondary: [\n 'tw:text-white',\n 'tw:bg-secondary-500',\n\n 'tw:focus:text-white',\n 'tw:hover:text-white',\n 'tw:hover:not-disabled:bg-secondary-700',\n 'tw:active:not-disabled:bg-secondary-800',\n\n // anchor disabled override\n 'tw:aria-disabled:!bg-secondary-500',\n ],\n danger: [\n 'tw:text-white',\n 'tw:bg-error-500',\n\n 'tw:focus:text-white',\n 'tw:hover:text-white',\n 'tw:hover:not-disabled:bg-error-600',\n 'tw:active:not-disabled:bg-error-700',\n\n // anchor disabled override\n 'tw:aria-disabled:!bg-error-500',\n ],\n invisible: [\n 'tw:text-neutral-800',\n 'tw:bg-transparent',\n\n 'tw:focus:text-neutral-800',\n 'tw:hover:not-disabled:bg-neutral-100',\n 'tw:hover:text-neutral-800',\n 'tw:active:not-disabled:bg-neutral-150',\n\n // contrasting icon on hover/active\n 'tw:[&_svg]:text-neutral-400',\n 'tw:hover:not-disabled:[&_svg]:text-secondary-600',\n 'tw:active:not-disabled:[&_svg]:text-secondary-600',\n\n // anchor disabled override\n 'tw:aria-disabled:!bg-transparent',\n ],\n outline: [\n 'tw:text-neutral-800',\n 'tw:bg-white',\n // border\n 'tw:!border-neutral-200',\n 'tw:hover:text-neutral-800',\n 'tw:focus:text-neutral-800',\n 'tw:hover:not-disabled:!border-neutral-300',\n 'tw:hover:not-disabled:bg-neutral-100',\n 'tw:active:not-disabled:bg-neutral-200',\n\n // contrasting icon hover, same as invisible\n 'tw:[&_svg]:text-neutral-400',\n 'tw:not-disabled:hover:[&_svg]:text-secondary-600',\n 'tw:active:not-disabled:[&_svg]:text-secondary-600',\n\n // anchor disabled override\n 'tw:aria-disabled:!bg-white',\n 'tw:aria-disabled:!border-neutral-200',\n ],\n\n inline: [\n 'tw:text-neutral-800',\n 'tw:bg-transparent',\n 'tw:rounded-full',\n\n 'tw:[&_svg]:text-neutral-400',\n 'tw:not-disabled:hover:[&_svg]:text-secondary-600',\n 'tw:not-disabled:focus:[&_svg]:text-secondary-600',\n ],\n },\n size: {\n medium: [\n 'tw:max-h-10',\n 'tw:min-h-10',\n 'tw:px-4',\n 'tw:py-2.5',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4',\n ],\n small: [\n 'tw:max-h-8',\n 'tw:min-h-8',\n 'tw:px-4',\n 'tw:py-1.5',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4',\n ],\n large: [\n 'tw:max-h-12',\n 'tw:min-h-12',\n 'tw:px-4',\n 'tw:py-3.5',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4',\n ],\n\n 'icon-lg': ['tw:size-12', 'tw:p-0', 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-6'],\n icon: ['tw:size-10', 'tw:p-0', 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4'],\n 'icon-sm': ['tw:size-8', 'tw:p-0', 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4'],\n 'icon-xs': ['tw:size-6', 'tw:p-0', 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4'],\n 'icon-2xs': [\n 'tw:!inline-flex',\n 'tw:size-5',\n 'tw:max-h-5',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-3',\n ],\n 'icon-3xs': ['tw:h-fit', 'tw:w-fit', 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4'],\n },\n },\n },\n);\n\nexport const argoVariants = cva(\n [\n 'tailwindcss-preflight',\n\n // layout\n 'tw:relative',\n 'tw:inline-flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:whitespace-nowrap',\n 'tw:gap-2',\n\n // border\n 'tw:border',\n 'tw:border-transparent',\n 'tw:rounded-[var(--radius-lg,0.25rem)]',\n\n // text\n 'tw:font-medium',\n 'tw:select-none',\n\n // focus visible\n 'tw:!outline-hidden',\n 'tw:focus-visible:ring-2',\n\n // disabled\n 'tw:disabled:cursor-not-allowed',\n 'tw:disabled:opacity-50',\n 'tw:active:opacity-60',\n\n 'tw:transition-all',\n 'tw:bg-clip-padding',\n\n // anchor support\n 'tw:!no-underline',\n 'tw:aria-disabled:cursor-not-allowed',\n 'tw:aria-disabled:opacity-50',\n\n // icon\n 'tw:shrink-0',\n 'tw:[&_svg]:pointer-events-none',\n 'tw:[&_svg]:shrink-0',\n \"tw:[&_svg:not([class*='tw:size-'])]:size-4\",\n ],\n {\n defaultVariants: {\n variant: 'primary',\n size: 'medium',\n },\n variants: {\n block: {\n true: ['tw:w-full'],\n },\n variant: {\n primary: [\n 'tw:bg-primary',\n 'tw:text-primary-foreground',\n 'tw:[a]:hover:bg-primary/80',\n 'tw:hover:not-disabled:bg-primary/90',\n 'tw:hover:text-primary-foreground',\n 'tw:focus:text-primary-foreground',\n\n 'tw:focus-visible:border-primary',\n 'tw:focus-visible:ring-ring/50',\n ],\n secondary: [\n 'tw:bg-primary/10',\n 'tw:text-primary',\n 'tw:hover:not-disabled:bg-primary/20',\n\n 'tw:focus-visible:border-primary',\n 'tw:focus-visible:ring-ring/50',\n ],\n\n // should be called \"destructive\" by Figma\n danger: [\n 'tw:bg-destructive',\n 'tw:text-destructive-foreground',\n 'tw:hover:text-destructive-foreground',\n 'tw:focus:text-destructive-foreground',\n\n 'tw:focus-visible:border-destructive',\n 'tw:focus-visible:ring-destructive/20',\n ],\n outline: [\n 'tw:!border-input',\n 'tw:bg-background',\n // Semantic base text color so the label/icon flips in dark mode\n // (matches `invisible`); previously unset → inherited a fixed dark color.\n 'tw:text-foreground',\n // Hover follows the brand primary (translucent tint), matching the\n // `secondary` variant — not the fixed `accent` blue.\n 'tw:hover:not-disabled:bg-primary/10',\n 'tw:hover:not-disabled:text-primary',\n 'tw:hover:active:bg-background',\n 'tw:focus-visible:!border-primary',\n 'tw:focus-visible:ring-ring/50',\n ],\n\n // should be called \"ghost\" by Figma\n invisible: [\n 'tw:bg-transparent',\n 'tw:text-foreground',\n 'tw:hover:not-disabled:bg-primary/10',\n 'tw:hover:not-disabled:text-primary',\n 'tw:hover:not-disabled:border-primary/10',\n\n 'tw:focus-visible:ring-ring/50',\n ],\n // should be called \"link\" by Figma\n inline: [\n 'tw:bg-transparent',\n 'tw:text-primary',\n 'tw:hover:underline',\n 'tw:hover:active:bg-transparent',\n 'tw:focus-visible:ring-ring/50',\n ],\n },\n size: {\n // should be called \"default\" by Figma\n medium: ['tw:max-h-9', 'tw:py-2', 'tw:px-4', 'tw:text-sm'],\n // should be called \"small\" by Figma\n small: ['tw:max-h-8', 'tw:py-2', 'tw:px-3', 'tw:text-xs'],\n // should be called \"large\" by Figma\n large: ['tw:max-h-10', 'tw:py-2.5', 'tw:px-6', 'tw:text-sm'],\n\n 'icon-lg': ['tw:size-10'],\n icon: ['tw:size-9'],\n 'icon-sm': ['tw:size-8'],\n // unsupported in ARGO, remove when old design is gone\n 'icon-xs': [],\n 'icon-2xs': [],\n 'icon-3xs': [],\n },\n },\n },\n);\n","import type { ComponentProps } from 'react';\nimport { Root, Slottable } from '@radix-ui/react-slot';\nimport type { VariantProps } from 'class-variance-authority';\n\nimport { Loader2 } from '../../icons';\nimport { cn } from '../../utils';\nimport { useArgoDesign } from '../ThemeProvider/context';\n\nimport { argoVariants, variants } from './styles';\n\n/**\n * Props for the `Button` component.\n *\n * Pass `variant` for primary/secondary/danger/outline/invisible looks, `size`\n * for height (including `icon-*` sizes when rendering icon-only). Icons are\n * composed as children — `<Button><Trash2 className=\"tw:size-4\" /> Delete</Button>`.\n */\ntype Props = {\n /** Replaces the leading content with a spinner and disables the button visually. The caller still controls `disabled`. */\n isLoading?: boolean;\n /** Render as a Radix `Slot` so the parent JSX (e.g. a `react-router` `<Link>`) becomes the button element. */\n asChild?: boolean;\n} & ComponentProps<'button'> &\n VariantProps<typeof variants>;\n\n/**\n * Primary action surface for the design system — covers all clickable controls except inline text links.\n *\n * **When to use:** any user-initiated action (submit, save, open modal, run job). Use `size=\"icon-*\"` with no\n * children for an icon-only button; there is no separate `IconButton` component.\n * **When NOT to use:** for inline text-link actions inside body copy use `ButtonInline`; for navigation that\n * opens a URL use `Link`; for \"primary action + dropdown of related actions\" use `SplitButton`.\n * **Composition:** wrap in `Tooltip` when icon-only or when disabled state needs an explanation; pair with\n * `Popconfirm` for destructive confirmations; pass through `Modal.Trigger` / `DropdownMenu.Trigger` via `asChild`.\n *\n * @see RECIPES.md#disabled-button-tooltip — for the disabled-button + tooltip pattern\n * @see RECIPES.md#confirm-dialog — for destructive-action confirmation\n */\nexport const Button = ({\n ref,\n children,\n disabled = false,\n className,\n type = 'button',\n isLoading = false,\n asChild = false,\n onClick,\n variant = 'primary',\n size = 'medium',\n block = false,\n ...buttonProps\n}: Props) => {\n const renderArgo = useArgoDesign();\n const Comp = asChild ? Root : 'button';\n const isIconOnly = String(size).startsWith('icon');\n const classNames = renderArgo\n ? argoVariants({ variant, size, block, className })\n : variants({ size, variant, block, className });\n\n const handleClick: ComponentProps<'button'>['onClick'] = (event) => {\n const isAnchor = event.currentTarget.tagName === 'A';\n\n // <a/> does not support disabled by default, and we cannot use pointer-events: none because cursor-not-allowed would not work.\n if (isAnchor && disabled) {\n event.preventDefault();\n return;\n }\n\n onClick?.(event);\n };\n\n return (\n <Comp\n {...buttonProps}\n ref={ref}\n disabled={disabled}\n aria-disabled={disabled}\n data-variant={variant}\n // `size=\"icon\"` / `size=\"icon-*\"` flags the button as icon-only — needed\n // by `ButtonGroup space=\"block\"` which stretches non-icon children to\n // equal width.\n data-icon-only={isIconOnly}\n type={type}\n onClick={handleClick}\n className={cn(classNames)}\n >\n {isLoading && <Loader2 className=\"tw:size-4 tw:shrink-0 tw:animate-spin\" />}\n <Slottable>{isLoading && isIconOnly ? null : children}</Slottable>\n </Comp>\n );\n};\n","import { useState } from 'react';\nimport type { ComponentProps, MouseEventHandler } from 'react';\n\nimport { cn, copyToClipboard } from '../../utils';\nimport { type Props as TooltipProps, Tooltip } from '../Tooltip';\n\ntype Props = {\n tooltip?: TooltipProps['tooltip'];\n tooltipPlacement?: TooltipProps['placement'];\n tooltipVariant?: TooltipProps['variant'];\n asChild?: TooltipProps['triggerAsChild'];\n text?: string | (() => string);\n} & ComponentProps<'button'>;\n\nexport const Clipboard = ({\n ref,\n text: textProp,\n children,\n tooltip = 'Copy to Clipboard',\n tooltipPlacement = 'top',\n tooltipVariant: tooltipVariantProp = 'action',\n asChild = false,\n onClick,\n className,\n ...restButtonProps\n}: Props) => {\n const [isTooltipOpen, setIsTooltipOpen] = useState(false);\n const [state, setState] = useState<'ready' | 'copied' | 'error'>('ready');\n const text = typeof textProp === 'function' ? textProp() : textProp;\n\n const copy = async (text: string) => {\n try {\n // For the clipboard feature to work reliably, the window must be in focus for security reasons.\n // However, the button can be clicked without the window being focused.\n if (!document.hasFocus()) window.focus();\n\n await copyToClipboard(text);\n setState('copied');\n } catch {\n setState('error');\n }\n };\n\n const handleOnClick: MouseEventHandler<HTMLButtonElement> = (event) => {\n // Open on click rather than waiting for hover. Radix opens on pointer-enter via a\n // `delayDuration` timer (300ms here), so clicking faster than that left the outcome invisible\n // until the timer caught up — the message was already rendered, just inside a closed tooltip.\n setIsTooltipOpen(true);\n if (text && state === 'ready') void copy(text);\n onClick?.(event);\n };\n\n const handleOnOpenChange: ComponentProps<typeof Tooltip.Root>['onOpenChange'] = (open) => {\n // Reset when the tooltip closes, allowing the user to leave the copy button.\n if (!open && state !== 'ready') setState('ready');\n setIsTooltipOpen(open);\n };\n\n const tooltipContent = (() => {\n if (!text) return 'Nothing to copy';\n if (state === 'error') return 'Failed to copy';\n if (state === 'copied') return 'Copied to Clipboard';\n return tooltip;\n })();\n\n const tooltipVariant: TooltipProps['variant'] =\n state === 'ready' && !!text ? tooltipVariantProp : 'action';\n\n // `tooltip={null}` leaves nothing to say until there is an outcome. Not rendering `Content` at all\n // is what makes that work: hovering still opens the tooltip, there is simply nothing in it, and\n // the copied / failed message appears in place the moment `state` changes. It also keeps Radix\n // from pointing the trigger's `aria-describedby` at content that has no text.\n const hasTooltipContent = tooltipContent !== null && tooltipContent !== undefined;\n\n return (\n <Tooltip.Root open={isTooltipOpen} onOpenChange={handleOnOpenChange}>\n <Tooltip.Trigger\n {...restButtonProps}\n asChild={asChild}\n keepOpenOnClick\n onClick={handleOnClick}\n className={cn('tw:cursor-pointer', className)}\n ref={ref}\n >\n {children ?? text}\n </Tooltip.Trigger>\n\n {hasTooltipContent && (\n <Tooltip.Content\n keepOpenOnPointerDownOutside\n placement={tooltipPlacement}\n variant={tooltipVariant}\n >\n {tooltipContent}\n </Tooltip.Content>\n )}\n </Tooltip.Root>\n );\n};\n","import type { ComponentProps, ReactNode } from 'react';\n\nimport { Button } from '../../components/Button';\nimport { Clipboard } from '../../components/Clipboard';\nimport { Copy } from '../../icons';\n\ntype ClipboardProps = Pick<\n ComponentProps<typeof Clipboard>,\n 'text' | 'tooltip' | 'tooltipPlacement' | 'tooltipVariant'\n>;\n\ntype ButtonProps = Omit<ComponentProps<typeof Button>, 'disabled' | 'icon'>;\n\ntype Props = ClipboardProps & ButtonProps & { icon?: ReactNode };\n\nconst DEFAULT_ICON: ReactNode = <Copy />;\nconst DEFAULT_ARIA_LABEL = 'Copy';\n\nexport const ClipboardButton = ({\n // clipboard props\n text,\n tooltip,\n tooltipPlacement,\n tooltipVariant,\n\n // button props\n icon = DEFAULT_ICON,\n variant = 'outline',\n children,\n ...rest\n}: Props) => {\n // Icon-only (no text children): the `tooltip` is visual only, not an accessible\n // name, so fall back to it (when it's a string) or a sensible default. A\n // consumer-supplied `aria-label` in `rest` still wins.\n // A non-empty string tooltip names the action; an empty/absent tooltip still\n // needs a name, so fall back to the default rather than an empty aria-label.\n const defaultAriaLabel =\n typeof tooltip === 'string' && tooltip.trim() ? tooltip : DEFAULT_ARIA_LABEL;\n const ariaLabel = rest['aria-label'] ?? (children == null ? defaultAriaLabel : undefined);\n\n return (\n <Clipboard\n asChild\n tooltip={tooltip}\n tooltipPlacement={tooltipPlacement}\n tooltipVariant={tooltipVariant}\n text={text}\n >\n <Button {...rest} aria-label={ariaLabel} variant={variant} disabled={!text}>\n {icon}\n {children}\n </Button>\n </Clipboard>\n );\n};\n","import type { ReactNode } from 'react';\n\nimport { ClipboardButton } from '../../blocks/ClipboardButton';\n\nexport const ButtonToolbar = ({ value, children }: { value?: string; children?: ReactNode }) => {\n if (!value && !children) return null;\n\n return (\n <div className=\"tw:pointer-events-auto tw:ml-auto tw:mr-4 tw:flex tw:w-fit tw:gap-1 tw:overflow-visible tw:rounded-lg tw:border tw:border-solid tw:border-border tw:!bg-background tw:p-[3px] tw:shadow\">\n {!!value && <ClipboardButton size=\"icon-sm\" variant=\"invisible\" text={value} />}\n {children}\n </div>\n );\n};\n","import { simpleMode } from '@codemirror/legacy-modes/mode/simple-mode';\n\n// Order is load-bearing inside each list: alternation is first-match, so a\n// command that prefixes another has to come after it (`run-operation` before\n// `run`).\nconst COMMANDS = [\n 'run-operation',\n 'source freshness',\n 'docs generate',\n 'run',\n 'test',\n 'seed',\n 'snapshot',\n 'list',\n 'ls',\n 'compile',\n 'build',\n 'deps',\n];\nconst ARGUMENTS = ['--select', '--exclude', '--selector', '--defer', '--resource-type', '-s'];\nconst METHODS = [\n 'path:',\n 'source:',\n 'tag:',\n 'package:',\n 'config:',\n 'test_type:',\n 'test_name:',\n 'state:',\n 'exposure:',\n 'metric:',\n 'result:',\n 'source_status:',\n 'column_name:',\n];\nconst FLAGS = [\n '--fail-fast',\n '--warn-error',\n '--favor-state',\n '--vars',\n '--models',\n '--threads',\n '--profiles-dir',\n '--profile',\n '--full-refresh',\n];\n\n// Every keyword follows whitespace, so the leading run is part of the match.\n// Commands and arguments end on a word boundary; methods and flags carry their\n// own terminator (`:`) or need none.\nconst word = (list: string[]) => new RegExp(`^\\\\s+(?:${list.join('|')})\\\\b`, 'i');\nconst prefix = (list: string[]) => new RegExp(`^\\\\s+(?:${list.join('|')})`, 'i');\n\nexport const dbt = simpleMode({\n start: [\n { regex: /\"(?:[^\\\\]|\\\\.)*?(?:\"|$)/, token: 'string' },\n { regex: /dbt/, token: 'keyword', sol: true },\n { regex: word(COMMANDS), token: 'keyword' },\n { regex: word(ARGUMENTS), token: 'variableName' },\n { regex: prefix(METHODS), token: 'propertyName' },\n { regex: prefix(FLAGS), token: 'attributeName' },\n { regex: /(?:@|\\*|,|\\+\\d+|\\d+\\+|\\+)/, token: 'operator' },\n { regex: /'.*'/, token: 'string' },\n { regex: /true|false/, token: 'atom' },\n ],\n});\n","import type { StreamParser } from '@codemirror/language';\n\n/**\n * Ported from google/codemirror-mode-jsonnet (Apache-2.0), the mode written by\n * the language's own authors, which was never taken past CodeMirror 5.\n * CodeMirror 5 style names are replaced by their CodeMirror 6 highlight tags:\n * `string-2` is `escape`, `error` is `invalid`.\n *\n * Every pattern is anchored and hoisted. `StringStream.match` slices the rest of\n * the line and, without `^`, scans all of it for a match it then discards unless\n * it started at the cursor — so an unanchored probe costs the whole remaining\n * line, and this tokenizer makes up to twenty of them per token.\n */\n\nconst COMMENT_END = /^\\*\\//;\nconst COMMENT_START = /^\\/\\/|^#/;\nconst C_COMMENT_START = /^\\/\\*/;\nconst TEXT_BLOCK = /^\\|\\|\\|/;\nconst TEXT_BLOCK_END = /^\\s*\\|\\|\\|/;\nconst RAW_DOUBLE = /^\"\"/;\nconst RAW_SINGLE = /^''/;\nconst CLOSE_DOUBLE = /^\"/;\nconst CLOSE_SINGLE = /^'/;\nconst ESCAPE = /^\\\\[\\\\\"'/bfnrt0]/;\nconst UNICODE_ESCAPE = /^\\\\u[0-9a-fA-F]{4}/;\nconst BACKSLASH = /^\\\\/;\nconst IMPORT = /^import(?:str)?\\s*(@?)([\"'])/;\nconst QUOTE = /^(@?)([\"'])/;\nconst ROOT = /^\\$/;\nconst NUMBER = /^(?:\\.\\d+|\\d+\\.?\\d*)(?:e[-+]?\\d+)?/i;\nconst OPERATOR = /^[-+/*=<>!&~^|$%]+/;\nconst IDENTIFIER = /^[a-zA-Z_][a-zA-Z0-9_]*/;\n\nconst KEYWORDS: Record<string, 'keyword' | 'atom'> = {\n local: 'keyword',\n self: 'keyword',\n super: 'keyword',\n assert: 'keyword',\n function: 'keyword',\n if: 'keyword',\n then: 'keyword',\n else: 'keyword',\n for: 'keyword',\n in: 'keyword',\n tailstrict: 'keyword',\n error: 'keyword',\n true: 'atom',\n false: 'atom',\n null: 'atom',\n};\n\ntype State = {\n cComment: boolean;\n textBlock: boolean;\n textBlockIndent: number | null;\n string: boolean;\n importString: boolean;\n stringSingle: boolean;\n stringRaw: boolean;\n};\n\nexport const jsonnet: StreamParser<State> = {\n name: 'jsonnet',\n\n startState: () => ({\n cComment: false,\n textBlock: false,\n textBlockIndent: null,\n string: false,\n importString: false,\n stringSingle: false,\n stringRaw: false,\n }),\n\n token: (stream, state) => {\n if (state.cComment) {\n if (stream.match(COMMENT_END)) {\n state.cComment = false;\n return 'comment';\n }\n stream.next();\n return 'comment';\n }\n\n // A `|||` block runs from its own first content line to the first line\n // indented less than that — so the closing `|||` has to be recognised\n // before the indent is measured, or a block closed at column 0 never ends.\n if (state.textBlock) {\n if (state.textBlockIndent == null) {\n if (stream.match(TEXT_BLOCK_END)) {\n state.textBlock = false;\n return 'string';\n }\n state.textBlockIndent = stream.indentation();\n }\n if (stream.indentation() >= state.textBlockIndent) {\n stream.skipToEnd();\n return 'string';\n }\n if (stream.match(TEXT_BLOCK_END)) {\n state.textBlock = false;\n return 'string';\n }\n stream.next();\n return 'invalid';\n }\n\n // Quoted and `@`-raw strings, single or double, plain or after an import.\n if (state.string || state.importString) {\n const style = state.string ? 'string' : 'meta';\n\n if (state.stringRaw) {\n if (stream.match(state.stringSingle ? RAW_SINGLE : RAW_DOUBLE)) return 'escape';\n } else {\n if (stream.match(ESCAPE)) return 'escape';\n if (stream.match(UNICODE_ESCAPE)) return 'escape';\n if (stream.match(BACKSLASH)) return 'invalid';\n }\n\n if (stream.match(state.stringSingle ? CLOSE_SINGLE : CLOSE_DOUBLE)) {\n state.string = false;\n state.importString = false;\n return style;\n }\n\n stream.next();\n return style;\n }\n\n if (stream.match(COMMENT_START)) {\n stream.skipToEnd();\n return 'comment';\n }\n if (stream.match(C_COMMENT_START)) {\n state.cComment = true;\n return 'comment';\n }\n\n // An import opens a string that is styled as meta rather than as content.\n const imported = stream.match(IMPORT);\n if (Array.isArray(imported)) {\n state.importString = true;\n state.stringRaw = imported[1] === '@';\n state.stringSingle = imported[2] === \"'\";\n return 'meta';\n }\n\n const quoted = stream.match(QUOTE);\n if (Array.isArray(quoted)) {\n state.string = true;\n state.stringRaw = quoted[1] === '@';\n state.stringSingle = quoted[2] === \"'\";\n return 'string';\n }\n\n if (stream.match(TEXT_BLOCK)) {\n state.textBlock = true;\n state.textBlockIndent = null;\n return 'string';\n }\n\n if (stream.match(ROOT)) return 'keyword';\n if (stream.match(NUMBER)) return 'number';\n if (stream.match(OPERATOR)) return 'operator';\n\n // Consumed whole so that a keyword's prefix (`locally`) is not styled.\n const identifier = stream.match(IDENTIFIER);\n if (Array.isArray(identifier)) return KEYWORDS[identifier[0]] ?? null;\n\n stream.next();\n return null;\n },\n};\n","import { useSyncExternalStore } from 'react';\nimport { type Extension } from '@codemirror/state';\n\n/**\n * CodeMirror themes are plain objects handed to CodeMirror at build time — they\n * cannot reference CSS custom properties the way a Tailwind class can. To let the\n * in-editor chrome (surface, gutter, selection, read-only wash) re-skin with the\n * active brand and light/dark mode, we resolve the live `--*` values at\n * theme-build time and feed the resulting `rgb()` strings into the theme.\n *\n * Mirrors `MermaidDiagram.resolvePrimary()`: SSR/no-document guard, read the\n * space-separated RGB channels off `<html>`, fall back to a literal when the\n * variable is absent, and wrap in `rgb(...)`.\n */\nexport const resolveToken = (token: string, fallbackChannels: string, alpha?: number): string => {\n const channels =\n typeof document === 'undefined'\n ? fallbackChannels\n : getComputedStyle(document.documentElement).getPropertyValue(`--${token}`).trim() ||\n fallbackChannels;\n return alpha === undefined ? `rgb(${channels})` : `rgb(${channels} / ${alpha})`;\n};\n\nconst SSR_SIGNAL = 'ssr';\n\n// Both axes that change the resolved `--*` values live as attributes on\n// `<html>` (see ThemeProvider): `data-theme` (light/dark) and `data-brand`.\nconst readThemeSignal = (): string => {\n if (typeof document === 'undefined') return SSR_SIGNAL;\n const root = document.documentElement;\n return `${root.getAttribute('data-theme') ?? ''}:${root.getAttribute('data-brand') ?? ''}`;\n};\n\nconst subscribeThemeSignal = (onChange: () => void): (() => void) => {\n if (typeof document === 'undefined') return () => {};\n const observer = new MutationObserver(onChange);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'data-brand'],\n });\n return () => observer.disconnect();\n};\n\n// Deliberately reads `<html>` attributes rather than `useColorScheme()` /\n// `useTheme()`: the editors must re-skin even when rendered without a\n// `ThemeProvider` (matching MermaidDiagram), and a DOM subscription is the only\n// provider-independent source of the light/dark + brand signal.\nconst useThemeSignal = (): string =>\n useSyncExternalStore(subscribeThemeSignal, readThemeSignal, () => SSR_SIGNAL);\n\n// Cached across component instances, not just across renders. A CodeMirror theme\n// extension carries its own StyleModule, and mounting an EditorView appends its\n// rules to a document-level stylesheet — which invalidates style for the whole\n// document. Sharing one module per theme keeps the stylesheet a constant size no\n// matter how many editors mount.\nconst themeCache = new Map<string, Extension>();\n\n/**\n * Memoize a CodeMirror theme/extension built from `resolveToken`, shared across\n * every instance that passes the same `cacheKey` and rebuilt whenever the active\n * brand / light-dark mode changes. `build` reads live `--*` values off\n * `<html>`, so the theme signal is an invisible dependency a deps array can't see.\n *\n * `cacheKey` is the extension's full identity: anything the builder closes over\n * must be part of it (e.g. `` `merge-pane:${deleted}` ``), or instances built\n * from different inputs would share one theme.\n */\nexport const useThemedExtension = (cacheKey: string, build: () => Extension): Extension => {\n const themeSignal = useThemeSignal();\n const key = `${themeSignal} ${cacheKey}`;\n\n // The module-level cache is the memo; reading and filling it during render is\n // idempotent and keyed only on values already stable for the render.\n let cached = themeCache.get(key);\n if (!cached) {\n cached = build();\n themeCache.set(key, cached);\n }\n\n return cached;\n};\n","import { javascript } from '@codemirror/lang-javascript';\nimport { json } from '@codemirror/lang-json';\nimport { python } from '@codemirror/lang-python';\nimport { MSSQL, MySQL, PLSQL, PostgreSQL, sql } from '@codemirror/lang-sql';\nimport { StreamLanguage } from '@codemirror/language';\nimport { r } from '@codemirror/legacy-modes/mode/r';\nimport { shell } from '@codemirror/legacy-modes/mode/shell';\nimport { toml } from '@codemirror/legacy-modes/mode/toml';\nimport { githubLightInit } from '@uiw/codemirror-theme-github';\nimport type { BasicSetupOptions } from '@uiw/react-codemirror';\n\nimport { sfsql } from '@keboola/codemirror-lang-sfsql';\nimport colors from '@keboola/tailwind-config/colors';\n\nimport { dbt } from './modes/dbt';\nimport { jsonnet } from './modes/jsonnet';\nimport { resolveToken } from './tokenTheme';\n\n// The MIME vocabulary callers pass. Kept as a const so the runtime whitelist and\n// the type stay one list — an annotated `LANGUAGE_MODE[]` copy elsewhere silently\n// drifts, since the type checker accepts a short one.\nexport const LANGUAGE_MODES = [\n 'application/json',\n 'text/plain',\n 'text/x-python',\n 'text/x-sql',\n 'text/x-mysql',\n 'text/x-pgsql',\n 'text/x-mssql',\n 'text/x-sfsql',\n 'text/x-plsql',\n 'text/x-rsrc',\n 'text/x-sh',\n 'text/x-toml',\n 'text/jsonnet',\n 'text/x-dbt',\n 'text/javascript',\n 'text/typescript',\n] as const;\n\nexport type LANGUAGE_MODE = (typeof LANGUAGE_MODES)[number];\n\nexport const isLanguageMode = (mode: string): mode is LANGUAGE_MODE =>\n (LANGUAGE_MODES as readonly string[]).includes(mode);\n\n// Chrome surfaces (selection, read-only wash) resolve from live `--*`\n// tokens so they re-skin with brand + dark mode; diff/syntax colors below stay\n// categorical (fixed across brands). Fallback channels mirror the light-mode\n// token values for SSR / no-provider parity.\nexport const buildBaseThemeStyles = () => ({\n '*': { lineHeight: '20px' },\n '*::selection': {\n backgroundColor: resolveToken('primary', '31 143 255'),\n color: `${resolveToken('primary-foreground', '255 255 255')} !important`,\n },\n '&.cm-editor:has(.cm-content[contenteditable=\"false\"])': {\n backgroundColor: resolveToken('secondary', '226 232 240'),\n },\n '&.cm-editor:has(.cm-content[contenteditable=\"false\"]) .cm-gutters': {\n backgroundColor: resolveToken('border', '229 231 235'),\n },\n '&.cm-editor .cm-scroller': { overflowAnchor: 'none' },\n '&.cm-editor, &.cm-editor .cm-scroller': {\n minHeight: '100%',\n flexGrow: 1,\n alignItems: 'stretch !important',\n outline: 'none',\n },\n '.cm-gutter.cm-foldGutter': { display: 'none !important' },\n '.cm-gutter.cm-lineNumbers': { paddingLeft: '20px', paddingRight: '6px' },\n '.cm-gutters': { height: 'auto' },\n\n // tokens overrides\n '.cm-line .tok-string': { color: colors.warning[700] },\n\n // merge (diff) view\n '&[class*=\"cm-merge-\"] .cm-deletedLine': { backgroundColor: colors.error[100] },\n '&[class*=\"cm-merge-\"] .cm-changedLine': { backgroundColor: colors.green[100] },\n '&[class*=\"cm-merge-\"] .cm-deletedLineGutter': { backgroundColor: colors.error[200] },\n '&[class*=\"cm-merge-\"] .cm-changedLineGutter': { backgroundColor: colors.green[200] },\n '&[class*=\"cm-merge-\"] .cm-deletedText': { background: colors.error[200] },\n '&[class*=\"cm-merge-\"] .cm-changedText': { background: colors.green[200] },\n '&[class*=\"cm-merge-\"]': {\n backgroundColor: `${colors.white} !important`,\n },\n '&[class*=\"cm-merge-\"] .cm-gutters': {\n backgroundColor: `${colors.white} !important`,\n },\n '.cm-changeGutter': { position: 'absolute', zIndex: -1, width: '100%', paddingLeft: 0 },\n '&[class*=\"cm-merge-\"] .cm-changedLine,&[class*=\"cm-merge-\"] .cm-line, &[class*=\"cm-merge-\"] .cm-deletedChunk':\n { paddingLeft: 0 },\n});\n\n// Dead whatever the editor does with them: `buildBaseThemeStyles` hides the fold\n// gutter outright, and `buildCustomTheme` paints the active line transparent.\nconst ALWAYS_OFF = {\n drawSelection: false,\n foldGutter: false,\n foldKeymap: false,\n highlightActiveLine: false,\n highlightActiveLineGutter: false,\n} as const;\n\n// `basicSetup` enables everything it is not told to skip, so a viewer would\n// otherwise install undo history that can never receive an entry, bracket\n// closing, and keybindings for commands a read-only document rejects. Search\n// stays — Mod-f is useful on a viewer. Same reasoning as `shouldLintJson` below.\n//\n// Autocompletion is absent here on purpose: `CodeEditor` installs its own\n// `autocompletion()` extension, which is appended after this object and would\n// re-add the plugin and its keymap. It gates that call on `readOnly` instead.\nexport const buildBasicSetup = (readOnly: boolean): BasicSetupOptions => ({\n ...ALWAYS_OFF,\n ...(readOnly\n ? {\n history: false,\n historyKeymap: false,\n closeBrackets: false,\n closeBracketsKeymap: false,\n lintKeymap: false,\n indentOnInput: false,\n rectangularSelection: false,\n dropCursor: false,\n highlightSelectionMatches: false,\n }\n : null),\n});\n\n// Editor surface + gutter resolve from live `--*` tokens; the github\n// syntax palette stays categorical. Fallback channels mirror the light-mode\n// token values. `foreground` / `gutterForeground` pair the token-driven\n// surfaces with token-driven text so line content and line numbers stay\n// readable when the background goes dark (e.g. standalone, no surrounding\n// `tw:text-foreground`).\nexport const buildCustomTheme = () =>\n githubLightInit({\n settings: {\n fontFamily: `'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New'`,\n background: resolveToken('background', '249 250 251'),\n foreground: resolveToken('foreground', '30 41 59'),\n gutterBackground: resolveToken('muted', '241 245 249'),\n gutterForeground: resolveToken('muted-foreground', '100 116 139'),\n gutterBorder: 'transparent',\n lineHighlight: 'transparent',\n selection: resolveToken('primary', '31 143 255'),\n },\n });\n\nexport const getLanguageMode = (mode?: LANGUAGE_MODE) => {\n switch (mode) {\n case undefined:\n case 'application/json':\n return json();\n case 'text/x-python':\n return python();\n case 'text/x-sql':\n return sql({ upperCaseKeywords: true });\n case 'text/x-mysql':\n return sql({ upperCaseKeywords: true, dialect: MySQL });\n case 'text/x-pgsql':\n return sql({ upperCaseKeywords: true, dialect: PostgreSQL });\n case 'text/x-mssql':\n return sql({ upperCaseKeywords: true, dialect: MSSQL });\n case 'text/x-sfsql':\n return StreamLanguage.define(sfsql);\n case 'text/x-plsql':\n return sql({ upperCaseKeywords: true, dialect: PLSQL });\n case 'text/x-rsrc':\n return StreamLanguage.define(r);\n case 'text/x-sh':\n return StreamLanguage.define(shell);\n case 'text/x-toml':\n return StreamLanguage.define(toml);\n case 'text/jsonnet':\n return StreamLanguage.define(jsonnet);\n case 'text/x-dbt':\n return StreamLanguage.define(dbt);\n case 'text/javascript':\n return javascript({ jsx: true });\n case 'text/typescript':\n return javascript({ jsx: true, typescript: true });\n // No language — `text/plain` lands here, and so does any mode added to\n // LANGUAGE_MODES without an arm above. Unstyled text is the safe degradation;\n // a `json()` default would colour unrelated content as if it were JSON.\n default:\n return [];\n }\n};\n\n// The JSON parse linter is only useful on an editable editor — a read-only one\n// can't act on the errors, so running it is wasted work and its underlines are\n// noise (e.g. non-strict JSON shown read-only in Kai chat).\nexport const shouldLintJson = (mode: LANGUAGE_MODE | undefined, readOnly: boolean): boolean =>\n mode === 'application/json' && !readOnly;\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'span'>;\n\nexport const KbdSeparator = ({ className, ...props }: Props) => (\n <span {...props} className={cn('tw:text-xs tw:text-muted-foreground', className)} />\n);\n","import { Children, Fragment } from 'react';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\nimport { KbdSeparator } from './KbdSeparator';\n\ntype Props = { separator?: string } & ComponentProps<'kbd'>;\n\nexport const KbdGroup = ({ ref, className, children, separator, ...props }: Props) => {\n return (\n <kbd\n {...props}\n ref={ref}\n className={cn('tw:inline-flex', 'tw:items-center', 'tw:gap-1', className)}\n >\n {separator\n ? // oxlint-disable-next-line react-x/no-children-to-array\n Children.toArray(children).map((child, index) => (\n // oxlint-disable-next-line\n <Fragment key={index}>\n {index > 0 && <KbdSeparator>{separator}</KbdSeparator>}\n {child}\n </Fragment>\n ))\n : children}\n </kbd>\n );\n};\n","import { cva } from 'class-variance-authority';\n\nexport const kbdVariants = cva(\n [\n 'tailwindcss-preflight',\n // style\n 'tw:pointer-events-none',\n 'tw:w-fit',\n 'tw:h-5',\n 'tw:min-w-5',\n\n // layout\n 'tw:inline-flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:gap-1',\n 'tw:shrink-0',\n\n // spacing\n 'tw:px-1',\n 'tw:[&_svg:not([class*=\"size-\"])]:size-2.5',\n\n 'tw:text-xs',\n 'tw:font-medium',\n\n 'tw:rounded',\n ],\n {\n defaultVariants: {\n variant: 'default',\n },\n variants: {\n variant: {\n default: 'tw:bg-muted tw:text-muted-foreground',\n primary: 'tw:bg-white/20 tw:text-white',\n },\n },\n },\n);\n","import type { ComponentProps } from 'react';\nimport type { VariantProps } from 'class-variance-authority';\n\nimport { KbdGroup } from './KbdGroup';\nimport { KbdSeparator } from './KbdSeparator';\nimport { kbdVariants } from './styles';\n\ntype Props = ComponentProps<'kbd'> & VariantProps<typeof kbdVariants>;\n\nexport const Kbd = ({ children, className, variant, ...rest }: Props) => (\n <kbd {...rest} className={kbdVariants({ className, variant })}>\n {children}\n </kbd>\n);\n\nKbd.Group = KbdGroup;\nKbd.Separator = KbdSeparator;\n","import { Kbd } from '../Kbd';\n\nexport const ToggleComponentHelp = () => (\n <div>\n Use <Kbd>Ctrl+/</Kbd> or <Kbd>Command+/</Kbd> to toggle comments.\n </div>\n);\n","import { useMemo } from 'react';\nimport type { KeyboardEvent, ReactNode } from 'react';\nimport { autocompletion, completeAnyWord } from '@codemirror/autocomplete';\nimport { jsonParseLinter } from '@codemirror/lang-json';\nimport { linter } from '@codemirror/lint';\nimport { unifiedMergeView } from '@codemirror/merge';\nimport { EditorView, keymap, placeholder as cmPlaceholder } from '@codemirror/view';\nimport CodeMirror, { EditorState, type Extension } from '@uiw/react-codemirror';\n\nimport { keyCodes } from '../../constants/keyCodes';\nimport { useStableCallback } from '../../hooks/useStableCallback';\nimport { cn } from '../../utils';\nimport { HelpBlock } from '../HelpBlock';\n\nimport { ButtonToolbar } from './ButtonToolbar';\nimport type { LANGUAGE_MODE } from './helpers';\nimport {\n buildBaseThemeStyles,\n buildBasicSetup,\n buildCustomTheme,\n getLanguageMode,\n shouldLintJson,\n} from './helpers';\nimport { ToggleComponentHelp } from './ToggleComponentHelp';\nimport { useThemedExtension } from './tokenTheme';\n\ntype Props = {\n value: string;\n previousValue?: string;\n mode?: LANGUAGE_MODE;\n placeholder?: string;\n /** Names the editable region for screen readers — the editor has no visible label of its own. */\n ariaLabel?: string;\n readOnly?: boolean;\n autocompletions?: string[];\n extraKeys?: Record<string, () => void>;\n withToggleCommentHint?: boolean;\n withAutofocus?: boolean;\n withLineNumbers?: boolean;\n withLineWrapping?: boolean;\n withCollapseUnchanged?: boolean;\n withCopyButton?: boolean;\n completeAny?: boolean;\n help?: ReactNode;\n helpPostfix?: ReactNode;\n renderAdditionalButtons?: (value?: string) => ReactNode;\n className?: string;\n} & (\n | { readOnly: true; onChange?: never }\n // `boolean` rather than `false`: a field the user's permissions may lock still\n // needs its handler for the case where they can edit.\n | { readOnly?: boolean; onChange: (value: string) => void }\n);\n\nconst emptyArray: string[] = [];\nconst emptyObject = {};\n\nexport const CodeEditor = ({\n value,\n previousValue,\n onChange,\n mode = 'application/json',\n placeholder = '',\n ariaLabel,\n readOnly = false,\n autocompletions = emptyArray,\n extraKeys = emptyObject,\n withToggleCommentHint = false,\n withAutofocus = false,\n withLineNumbers = true,\n withLineWrapping = true,\n withCollapseUnchanged = false,\n withCopyButton = false,\n completeAny = false,\n help = null,\n helpPostfix = null,\n renderAdditionalButtons,\n className,\n}: Props) => {\n // CodeMirror rebuilds and re-resolves the whole extension tree whenever the\n // change handler's identity moves, and callers pass inline arrows.\n const handleChange = useStableCallback((next: string) => onChange?.(next));\n\n // Themes re-resolve their `--*` tokens on brand / light-dark change. The\n // syntax palette is keyed without a component prefix so `SqlEditor` — which\n // builds it from the same `buildCustomTheme` — shares this one module.\n const customTheme = useThemedExtension('editor:syntax', buildCustomTheme);\n const baseTheme = useThemedExtension('code-editor:chrome', () =>\n EditorView.theme(buildBaseThemeStyles()),\n );\n\n const commonExtensions: Extension[] = useMemo(() => {\n return [\n getLanguageMode(mode),\n shouldLintJson(mode, readOnly) ? linter(jsonParseLinter()) : [],\n withLineWrapping ? EditorView.lineWrapping : [],\n EditorState.languageData.of(() => [\n { autocomplete: completeAny ? completeAnyWord : autocompletions },\n ]),\n keymap.of(\n Object.entries(extraKeys).map(([key, run]) => ({\n key,\n run: () => {\n if (typeof run === 'string') return run;\n\n run();\n return true;\n },\n })),\n ),\n readOnly ? [] : autocompletion({ activateOnTyping: completeAny }),\n ariaLabel ? EditorView.contentAttributes.of({ 'aria-label': ariaLabel }) : [],\n baseTheme,\n ];\n }, [\n autocompletions,\n completeAny,\n extraKeys,\n mode,\n readOnly,\n withLineWrapping,\n baseTheme,\n ariaLabel,\n ]);\n\n const extensions = useMemo(() => {\n return [\n ...commonExtensions,\n cmPlaceholder(placeholder),\n EditorView.editable.of(!readOnly),\n EditorState.readOnly.of(readOnly),\n previousValue\n ? unifiedMergeView({\n original: previousValue,\n mergeControls: false,\n highlightChanges: false,\n collapseUnchanged: withCollapseUnchanged ? {} : undefined,\n })\n : [],\n ];\n }, [commonExtensions, placeholder, readOnly, previousValue, withCollapseUnchanged]);\n\n const config = useMemo(() => {\n return {\n ...buildBasicSetup(readOnly),\n lineNumbers: withLineNumbers,\n };\n }, [withLineNumbers, readOnly]);\n\n // `ButtonToolbar` renders nothing without content, so keying the reserved space\n // off the props alone would leave a gap above an empty editor. The toolbar is out\n // of flow and translated above the top edge, overhanging it by 32px — a 40px chip\n // shifted up by all but 8px of itself.\n const additionalButtons = renderAdditionalButtons?.(value);\n const hasToolbar = (withCopyButton && !!value) || !!additionalButtons;\n\n return (\n // oxlint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n className={cn(\n 'tw:relative tw:flex tw:min-h-0 tw:flex-col tw:[&_.cm-mergeViewEditor]:overflow-visible tw:[&_.cm-mergeViewEditors]:h-full tw:[&_.cm-mergeView]:h-full tw:[&_>div]:h-full tw:[&_>div]:overflow-auto tw:[&_>div]:bg-background',\n { 'tw:mt-8': hasToolbar },\n className,\n )}\n onKeyDown={(event: KeyboardEvent) => {\n if (event.key === keyCodes.ESCAPE) {\n event.stopPropagation();\n }\n }}\n >\n {hasToolbar && (\n <div className=\"tw:pointer-events-none tw:absolute tw:z-10 tw:flex tw:!h-auto tw:w-full tw:translate-y-[calc(-100%_+_8px)] tw:!overflow-visible tw:!bg-transparent\">\n <div className=\"tw:flex-1\">\n <ButtonToolbar value={withCopyButton ? value : undefined}>\n {additionalButtons}\n </ButtonToolbar>\n </div>\n </div>\n )}\n <CodeMirror\n theme={customTheme}\n value={value}\n onChange={handleChange}\n extensions={extensions}\n autoFocus={withAutofocus}\n basicSetup={config}\n />\n {!readOnly && (withToggleCommentHint || help || helpPostfix) && (\n <HelpBlock className=\"tw:mt-2 tw:flex tw:flex-wrap tw:gap-1\">\n {help}\n {withToggleCommentHint ? <ToggleComponentHelp /> : null}\n {helpPostfix}\n </HelpBlock>\n )}\n </div>\n );\n};\n","import type { ChangeSet, Range } from '@codemirror/state';\nimport { Decoration, EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\n\nimport colors from '@keboola/tailwind-config/colors';\n\nconst activeQueryFirstLine = Decoration.line({ class: 'cm-active-query cm-active-query-first' });\nconst activeQueryMiddleLine = Decoration.line({ class: 'cm-active-query' });\nconst activeQueryLastLine = Decoration.line({ class: 'cm-active-query cm-active-query-last' });\nconst activeQuerySingleLine = Decoration.line({\n class: 'cm-active-query cm-active-query-first cm-active-query-last',\n});\n\ntype QueryBoundary = { from: number; to: number };\n\n/**\n * Given pre-computed query boundaries and a cursor position, find which query\n * the cursor is in. Returns trimmed character offsets or null.\n */\nexport const findActiveQueryRange = (\n doc: string,\n cursorPos: number,\n boundaries: QueryBoundary[],\n): { from: number; to: number } | null => {\n if (boundaries.length === 0) return null;\n\n let match: QueryBoundary | undefined = boundaries[boundaries.length - 1];\n for (const boundary of boundaries) {\n if (cursorPos <= boundary.to) {\n match = boundary;\n break;\n }\n }\n\n if (!match) return null;\n\n // Trim leading/trailing whitespace from the query range for tighter boundaries\n const queryText = doc.slice(match.from, match.to);\n const leadingWhitespace = queryText.length - queryText.trimStart().length;\n const trailingWhitespace = queryText.length - queryText.trimEnd().length;\n\n const trimmedStart = match.from + leadingWhitespace;\n const trimmedEnd = match.to - trailingWhitespace;\n\n if (trimmedStart >= trimmedEnd) return null;\n\n return { from: trimmedStart, to: trimmedEnd };\n};\n\n/**\n * Convert splitSqlQueries result (array of query strings that join back to the\n * original doc) into character-offset boundaries.\n */\nconst computeBoundaries = (queries: string[]): QueryBoundary[] => {\n const boundaries: QueryBoundary[] = [];\n let offset = 0;\n for (const query of queries) {\n boundaries.push({ from: offset, to: offset + query.length });\n offset += query.length;\n }\n return boundaries;\n};\n\n/**\n * Synchronously map cached boundaries through a changeset.\n *\n * Boundaries can outlive the document state they were computed from (the async\n * re-parse in `scheduleDocParse` is debounced, so several edits may land\n * before new boundaries are produced). When that happens a cached position\n * can exceed the changeset's pre-change length and `ChangeSet.mapPos` throws\n * `RangeError: Position X is out of range for changeset of length Y`.\n *\n * Clamp positions into the valid `[0, changes.length]` range before mapping\n * and drop degenerate boundaries so the mapping is safe even with stale cache.\n */\nexport const mapBoundariesThroughChanges = (\n boundaries: QueryBoundary[],\n changes: ChangeSet,\n): QueryBoundary[] => {\n const prevLen = changes.length;\n const mapped: QueryBoundary[] = [];\n for (const b of boundaries) {\n const from = changes.mapPos(Math.max(0, Math.min(b.from, prevLen)), -1);\n const to = changes.mapPos(Math.max(0, Math.min(b.to, prevLen)), 1);\n if (from < to) mapped.push({ from, to });\n }\n return mapped;\n};\n\nconst buildDecorations = (view: EditorView, range: { from: number; to: number }) => {\n const startLine = view.state.doc.lineAt(range.from).number;\n const endLine = view.state.doc.lineAt(range.to).number;\n\n const decorations: Range<Decoration>[] = [];\n for (let lineNum = startLine; lineNum <= endLine; lineNum++) {\n const lineStart = view.state.doc.line(lineNum).from;\n if (startLine === endLine) {\n decorations.push(activeQuerySingleLine.range(lineStart));\n } else if (lineNum === startLine) {\n decorations.push(activeQueryFirstLine.range(lineStart));\n } else if (lineNum === endLine) {\n decorations.push(activeQueryLastLine.range(lineStart));\n } else {\n decorations.push(activeQueryMiddleLine.range(lineStart));\n }\n }\n\n return Decoration.set(decorations);\n};\n\nexport const activeQueryHighlight = (splitQueries: (sql: string) => Promise<string[]>) => {\n return [\n ViewPlugin.fromClass(\n class {\n decorations = Decoration.none;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private seq = 0;\n private cachedDoc = '';\n private cachedBoundaries: QueryBoundary[] = [];\n private destroyed = false;\n\n constructor(view: EditorView) {\n this.scheduleDocParse(view);\n }\n\n update(update: ViewUpdate) {\n if (update.focusChanged && !update.view.hasFocus) {\n this.decorations = Decoration.none;\n return;\n }\n\n if (update.docChanged) {\n // Synchronously map cached boundaries through document changes\n // so decorations update immediately without waiting for async re-parse.\n // Positions are clamped inside mapBoundariesThroughChanges because\n // the async re-parse is debounced and boundaries can be stale.\n if (this.cachedBoundaries.length > 0) {\n this.cachedBoundaries = mapBoundariesThroughChanges(\n this.cachedBoundaries,\n update.changes,\n );\n this.cachedDoc = update.state.doc.toString();\n this.updateFromCache(update.view);\n }\n // Still re-parse for accurate boundaries (handles structural changes like new semicolons)\n this.scheduleDocParse(update.view);\n } else if (update.selectionSet || (update.focusChanged && update.view.hasFocus)) {\n this.updateFromCache(update.view);\n }\n }\n\n destroy() {\n this.destroyed = true;\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n }\n\n /**\n * Update decorations using cached query boundaries.\n * Only mutates this.decorations — does NOT call view.dispatch().\n * When called from update() (sync), CodeMirror picks up the new\n * decorations via the accessor. When called from the async\n * scheduleDocParse callback, the caller must dispatch separately.\n */\n private updateFromCache(view: EditorView) {\n if (!view.hasFocus) {\n this.decorations = Decoration.none;\n return;\n }\n\n const { main } = view.state.selection;\n\n if (main.from !== main.to) {\n // User has text selected — hide highlight\n this.decorations = Decoration.none;\n return;\n }\n\n const doc = view.state.doc.toString();\n if (doc !== this.cachedDoc) return;\n if (this.cachedBoundaries.length === 0) {\n this.decorations = Decoration.none;\n return;\n }\n\n const range = findActiveQueryRange(doc, main.head, this.cachedBoundaries);\n this.decorations = range ? buildDecorations(view, range) : Decoration.none;\n }\n\n /** Parse queries async (debounced) and update decorations. */\n private scheduleDocParse(view: EditorView) {\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n\n this.debounceTimer = setTimeout(async () => {\n const seq = ++this.seq;\n const doc = view.state.doc.toString();\n\n if (!doc.trim()) {\n this.cachedDoc = doc;\n this.cachedBoundaries = [];\n if (this.decorations !== Decoration.none) {\n this.decorations = Decoration.none;\n if (!this.destroyed) view.dispatch();\n }\n return;\n }\n\n let queries: string[];\n try {\n queries = await splitQueries(doc);\n } catch {\n return;\n }\n\n // Discard stale results\n if (this.destroyed || seq !== this.seq) return;\n\n this.cachedDoc = doc;\n this.cachedBoundaries = computeBoundaries(queries);\n\n this.updateFromCache(view);\n if (!this.destroyed) view.dispatch();\n }, 100);\n }\n },\n { decorations: (v) => v.decorations },\n ),\n EditorView.baseTheme({\n '.cm-active-query': {\n boxShadow: `inset -1px 0 0 0 ${colors.blue[300]}, inset 1px 0 0 0 ${colors.blue[300]}`,\n marginRight: '8px',\n },\n '.cm-active-query-first': {\n 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]}`,\n borderRadius: '4px 4px 0 0',\n },\n '.cm-active-query-last': {\n 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]}`,\n borderRadius: '0 0 4px 4px',\n },\n '.cm-active-query-first.cm-active-query-last': {\n boxShadow: `inset 0 0 0 1px ${colors.blue[300]}`,\n borderRadius: '4px',\n },\n }),\n ];\n};\n","import type { Extension } from '@codemirror/state';\nimport { RangeSet, StateEffect, StateField } from '@codemirror/state';\nimport { Decoration, EditorView, gutter, GutterMarker } from '@codemirror/view';\n\nimport colors from '@keboola/tailwind-config/colors';\n\nimport { activeQueryHighlight } from './activeQueryHighlight';\n\nexport type HighlightedLines = {\n from: number;\n to: number;\n error?: { from: number; to: number };\n processing?: { from: number; to: number };\n} | null;\n\n// Gutter markers for highlighting\nclass HighlightMarker extends GutterMarker {\n override toDOM() {\n const marker = document.createElement('div');\n marker.className = 'cm-highlight-marker';\n return marker;\n }\n}\n\nconst highlightMarker = new HighlightMarker();\n\n// Helper function to iterate over line range and apply a callback\nconst forEachLineInRange = <T>(\n doc: { lines: number; line: (n: number) => { from: number } },\n from: number,\n to: number,\n callback: (lineFrom: number) => T,\n): T[] => {\n const results: T[] = [];\n\n // Convert 0-based to 1-based for CodeMirror\n const fromLine = Math.max(1, from + 1);\n const toLine = Math.min(doc.lines, to + 1);\n\n for (let i = fromLine; i <= toLine; i++) {\n const line = doc.line(i);\n results.push(callback(line.from));\n }\n\n return results;\n};\n\n// State effect for setting highlighted lines\nconst setHighlightedLinesEffect = StateEffect.define<HighlightedLines>();\n\n// State field for storing highlighted lines info\nconst highlightedLinesField = StateField.define<HighlightedLines>({\n create() {\n return null;\n },\n update(value, transaction) {\n for (const effect of transaction.effects) {\n if (effect.is(setHighlightedLinesEffect)) {\n return effect.value;\n }\n }\n return value;\n },\n});\n\n// Gutter extension that displays highlight markers\nconst highlightGutter = gutter({\n class: 'cm-highlight-gutter',\n markers: (view): RangeSet<GutterMarker> => {\n const highlightInfo = view.state.field(highlightedLinesField, false);\n\n if (!highlightInfo) {\n return RangeSet.empty;\n }\n\n // Add blue markers for all running query lines\n const markers = forEachLineInRange(\n view.state.doc,\n highlightInfo.from,\n highlightInfo.to,\n (lineFrom) => highlightMarker.range(lineFrom),\n );\n\n return RangeSet.of(markers);\n },\n});\n\n// State field for error line background decorations\nconst errorLineDecorations = StateField.define({\n create() {\n return Decoration.none;\n },\n update(decorations, transaction) {\n decorations = decorations.map(transaction.changes);\n for (const effect of transaction.effects) {\n if (!effect.is(setHighlightedLinesEffect)) {\n continue;\n }\n\n if (!effect.value || !effect.value.error) {\n return Decoration.none;\n }\n\n // Add error line background decorations\n const decorationArray = forEachLineInRange(\n transaction.state.doc,\n effect.value.error.from,\n effect.value.error.to,\n (lineFrom) => Decoration.line({ class: 'cm-error-line' }).range(lineFrom),\n );\n\n return Decoration.set(decorationArray);\n }\n return decorations;\n },\n provide: (f) => EditorView.decorations.from(f),\n});\n\n// State field for processing line background decorations\nconst processingLineDecorations = StateField.define({\n create() {\n return Decoration.none;\n },\n update(decorations, transaction) {\n decorations = decorations.map(transaction.changes);\n for (const effect of transaction.effects) {\n if (!effect.is(setHighlightedLinesEffect)) {\n continue;\n }\n\n if (!effect.value || !effect.value.processing) {\n return Decoration.none;\n }\n\n const decorationArray = forEachLineInRange(\n transaction.state.doc,\n effect.value.processing.from,\n effect.value.processing.to,\n (lineFrom) => Decoration.line({ class: 'cm-processing-line' }).range(lineFrom),\n );\n\n return Decoration.set(decorationArray);\n }\n return decorations;\n },\n provide: (f) => EditorView.decorations.from(f),\n});\n\n// Theme for highlighted lines\nconst highlightedLinesTheme = EditorView.baseTheme({\n '.cm-highlight-gutter': {\n width: '2px',\n marginRight: '2px',\n },\n '.cm-highlight-marker': {\n width: '2px',\n height: '100%',\n backgroundColor: colors.blue[500],\n },\n '.cm-error-line': {\n backgroundColor: `${colors.error[100]} !important`,\n },\n '.cm-processing-line': {\n backgroundColor: `${colors.blue[100]} !important`,\n },\n});\n\n// Install highlight lines extension\nexport function highlightingExtension(\n queryParser?: (sql: string) => Promise<string[]>,\n): Extension[] {\n return [\n highlightedLinesField,\n highlightGutter,\n errorLineDecorations,\n processingLineDecorations,\n highlightedLinesTheme,\n ...(queryParser ? activeQueryHighlight(queryParser) : []),\n ];\n}\n\nexport function updateHighlighting(view: EditorView, lines?: HighlightedLines) {\n view.dispatch({ effects: setHighlightedLinesEffect.of(lines ?? null) });\n}\n","import { StateEffect, StateField, type Text } from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n ViewPlugin,\n type ViewUpdate,\n} from '@codemirror/view';\n\nimport colors from '@keboola/tailwind-config/colors';\n\nimport { escapeStringRegexp } from '../../utils/escapeStringRegexp';\n\n// Represents a single search match in the editor\ntype SearchMatch = {\n /** Start position in document */\n from: number;\n /** End position in document */\n to: number;\n /** Text content of the match */\n text: string;\n /** Local match index within this editor (0-based) */\n localIndex: number;\n};\n\n// Effect to update search state\nconst setSearchEffect = StateEffect.define<{\n query: string;\n selectedMatchIndex?: number;\n}>();\n\n// State to track current search matches\ntype SearchState = {\n query: string;\n selectedMatchIndex?: number;\n matches: SearchMatch[];\n decorations: DecorationSet;\n};\n\n// Find all matches in the document\nfunction findMatches(doc: Text, query: string): SearchMatch[] {\n if (!query) return [];\n\n const text = doc.toString();\n\n try {\n const regex = new RegExp(escapeStringRegexp(query), 'gi');\n\n return Array.from(text.matchAll(regex)).map((match, index) => {\n const from = match.index!;\n const to = from + match[0].length;\n\n return { from, to, text: match[0], localIndex: index };\n });\n } catch (e) {\n // Invalid regex - return no matches\n console.warn('Invalid search regex:', e);\n return [];\n }\n}\n\n// Create decorations for search matches\nfunction createDecorations(matches: SearchMatch[], selectedLocalIndex?: number): DecorationSet {\n const decorations = matches.map((match) => {\n const isSelected = match.localIndex === selectedLocalIndex;\n\n const decoration = Decoration.mark({\n class: isSelected ? 'cm-searchMatch-selected' : 'cm-searchMatch',\n });\n\n return decoration.range(match.from, match.to);\n });\n\n return Decoration.set(decorations, true);\n}\n\n// StateField to manage search state\nconst searchField = StateField.define<SearchState>({\n create() {\n return {\n query: '',\n selectedMatchIndex: undefined,\n matches: [],\n decorations: Decoration.none,\n };\n },\n\n update(state, tr) {\n let newState = state;\n\n // Handle search effect\n for (const effect of tr.effects) {\n if (!effect.is(setSearchEffect)) {\n continue;\n }\n\n const { query, selectedMatchIndex } = effect.value;\n\n // Find matches\n const matches = findMatches(tr.state.doc, query);\n\n // Create decorations\n const decorations = createDecorations(matches, selectedMatchIndex);\n\n newState = {\n query,\n selectedMatchIndex,\n matches,\n decorations,\n };\n }\n\n // Map decorations through document changes\n if (tr.docChanged && newState.query) {\n const matches = findMatches(tr.state.doc, newState.query);\n const decorations = createDecorations(matches, newState.selectedMatchIndex);\n\n newState = {\n ...newState,\n matches,\n decorations,\n };\n }\n\n return newState;\n },\n\n provide: (field) => EditorView.decorations.from(field, (state) => state.decorations),\n});\n\n// View plugin to handle scrolling to selected match\nconst searchViewPlugin = ViewPlugin.fromClass(\n class {\n private lastSelectedIndex?: number;\n\n update(update: ViewUpdate) {\n const state = update.state.field(searchField);\n\n // Scroll to selected match when it changes\n if (\n state.selectedMatchIndex !== undefined &&\n state.selectedMatchIndex !== this.lastSelectedIndex\n ) {\n const match = state.matches[state.selectedMatchIndex];\n\n if (match) {\n requestAnimationFrame(() => {\n update.view.dispatch({\n effects: EditorView.scrollIntoView(match.from, { y: 'center' }),\n });\n });\n }\n\n this.lastSelectedIndex = state.selectedMatchIndex;\n }\n\n // Reset if no selection\n if (state.selectedMatchIndex === undefined) {\n this.lastSelectedIndex = undefined;\n }\n }\n },\n);\n\nconst searchTheme = EditorView.baseTheme({\n '.cm-searchMatch': {\n backgroundColor: colors.blue[100],\n },\n '.cm-searchMatch > span': {\n color: `${colors.blue[600]} !important`,\n },\n '.cm-searchMatch-selected': {\n backgroundColor: colors.blue[600],\n },\n '.cm-searchMatch-selected > span': {\n color: `${colors.white} !important`,\n },\n});\n\nexport function searchExtension() {\n return [searchField, searchViewPlugin, searchTheme];\n}\n\nexport function updateSearch(view: EditorView, query: string, selectedMatchIndex?: number) {\n view.dispatch({ effects: setSearchEffect.of({ query, selectedMatchIndex }) });\n}\n","import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { defaultKeymap } from '@codemirror/commands';\nimport type { SQLNamespace } from '@codemirror/lang-sql';\nimport type {\n EditorState,\n KeyBinding,\n ReactCodeMirrorRef,\n ViewUpdate,\n} from '@uiw/react-codemirror';\nimport CodeMirror, { EditorView, keymap } from '@uiw/react-codemirror';\n\nimport { installExtensions, type SqlDialectName } from '@keboola/codemirror-lang-sql';\n\nimport { buildBaseThemeStyles, buildBasicSetup, buildCustomTheme } from './helpers';\nimport type { HighlightedLines } from './highlighting';\nimport { highlightingExtension, updateHighlighting } from './highlighting';\nimport { searchExtension, updateSearch } from './search';\nimport { resolveToken, useThemedExtension } from './tokenTheme';\n\n// SqlEditor installs its own keymaps: `CUSTOM_KEYMAP` ahead of `defaultKeymap`\n// for Escape, a Tab/Enter-filtered completion keymap from\n// `@keboola/codemirror-lang-sql`, and search driven by props rather than the\n// CodeMirror panel.\nconst OWN_KEYMAPS = {\n defaultKeymap: false,\n completionKeymap: false,\n searchKeymap: false,\n} as const;\n\nconst CUSTOM_KEYMAP: KeyBinding[] = [\n {\n key: 'Escape',\n stopPropagation: true,\n run: (view: EditorView) => {\n view.contentDOM.blur();\n return true;\n },\n },\n];\n\n// Editor surface, focus ring, and read-only wash resolve from live `--*`\n// tokens so the SQL editor chrome re-skins with brand + dark mode. Fallback\n// channels mirror the light-mode token values.\nconst buildTheme = () => ({\n ...buildBaseThemeStyles(),\n '&.cm-editor': {\n border: 'solid 1px transparent',\n background: resolveToken('card', '255 255 255'),\n borderRadius: '8px',\n paddingTop: '8px',\n paddingBottom: '8px',\n },\n '&.cm-editor:has(.cm-content[contenteditable=\"true\"]):hover': {\n borderColor: resolveToken('ring', '31 143 255'),\n },\n '&.cm-editor:has(.cm-content[contenteditable=\"true\"]):focus-within': {\n borderColor: resolveToken('ring', '31 143 255'),\n boxShadow: `0 0 0 4px ${resolveToken('ring', '31 143 255', 0.3)}`,\n },\n '&.cm-editor .cm-scroller': { overflowAnchor: 'none' },\n '&.cm-editor :is(.cm-gutters,.cm-scroller)': { background: resolveToken('card', '255 255 255') },\n '&.cm-editor:has(.cm-content[contenteditable=\"false\"])': {\n background: resolveToken('muted', '241 245 249'),\n },\n '&.cm-editor:has(.cm-content[contenteditable=\"false\"]) :is(.cm-scroller,.cm-gutters)': {\n background: resolveToken('muted', '241 245 249'),\n },\n});\n\ntype Props = {\n value: string;\n onChange?: (value: string) => void;\n onSelectionChange?: (text: string) => void;\n onCreateEditor?: (view: EditorView, state: EditorState) => void;\n onDestroyEditor?: () => void;\n onBlurEditor?: (view: EditorView) => void;\n onFocusEditor?: (view: EditorView) => void;\n readOnly: boolean;\n placeholder?: string;\n searchQuery?: string;\n searchMatchIndex?: number;\n extraKeys?: KeyBinding[];\n queryParser?: (sql: string) => Promise<string[]>;\n autoFocus?: boolean;\n lineNumbers?: boolean;\n className?: string;\n schema?: SQLNamespace;\n variables?: string[];\n defaultSchema?: string;\n defaultDatabase?: string;\n highlightLines?: HighlightedLines;\n dialect?: SqlDialectName;\n};\n\nexport const SqlEditor = ({\n value,\n onChange,\n onSelectionChange,\n onCreateEditor,\n onDestroyEditor,\n onBlurEditor,\n onFocusEditor,\n placeholder = '',\n searchQuery = '',\n searchMatchIndex,\n readOnly = false,\n extraKeys,\n queryParser,\n autoFocus = false,\n lineNumbers = true,\n className,\n schema,\n variables,\n defaultDatabase,\n defaultSchema,\n highlightLines,\n dialect,\n}: Props) => {\n const editorRef = useRef<ReactCodeMirrorRef>(null);\n\n // Themes re-resolve their `--*` tokens on brand / light-dark change. The\n // syntax palette shares `CodeEditor`'s cache entry — same `buildCustomTheme`.\n const customTheme = useThemedExtension('editor:syntax', buildCustomTheme);\n const themeExtension = useThemedExtension('sql-editor:chrome', () =>\n EditorView.theme(buildTheme()),\n );\n\n const extensions = useMemo(() => {\n const baseKeymap = [...defaultKeymap, ...CUSTOM_KEYMAP];\n\n return [\n EditorView.lineWrapping,\n keymap.of(extraKeys ? [...extraKeys, ...baseKeymap] : baseKeymap),\n ...installExtensions({ schema, defaultDatabase, defaultSchema, variables, dialect }),\n searchExtension(),\n highlightingExtension(queryParser),\n themeExtension,\n onBlurEditor ? EditorView.domEventHandlers({ blur: (_, view) => onBlurEditor(view) }) : [],\n onFocusEditor ? EditorView.domEventHandlers({ focus: (_, view) => onFocusEditor(view) }) : [],\n ];\n }, [\n extraKeys,\n queryParser,\n schema,\n defaultDatabase,\n defaultSchema,\n variables,\n dialect,\n onBlurEditor,\n onFocusEditor,\n themeExtension,\n ]);\n\n const defaultSetup = useMemo(() => {\n return { ...buildBasicSetup(readOnly), ...OWN_KEYMAPS, lineNumbers };\n }, [readOnly, lineNumbers]);\n\n useEffect(() => {\n if (editorRef.current?.view) {\n updateHighlighting(editorRef.current.view, highlightLines);\n }\n }, [highlightLines]);\n\n useEffect(() => {\n if (editorRef.current?.view) {\n updateSearch(editorRef.current.view, searchQuery, searchMatchIndex);\n }\n }, [searchQuery, searchMatchIndex]);\n\n useEffect(() => {\n if (!onDestroyEditor) return;\n\n return () => {\n onDestroyEditor();\n };\n }, [onDestroyEditor]);\n\n const handleOnCreate = useCallback(\n (view: EditorView, state: EditorState) => {\n onCreateEditor?.(view, state);\n\n if (highlightLines) {\n updateHighlighting(view, highlightLines);\n }\n\n if (searchQuery) {\n updateSearch(view, searchQuery, searchMatchIndex);\n }\n },\n [onCreateEditor, highlightLines, searchQuery, searchMatchIndex],\n );\n\n const handleOnUpdate = useCallback(\n (update: ViewUpdate) => {\n if (update.selectionSet) {\n const { main } = update.state.selection;\n const text = update.state.sliceDoc(main.from, main.to);\n\n onSelectionChange?.(text);\n }\n },\n [onSelectionChange],\n );\n\n return (\n <CodeMirror\n ref={editorRef}\n theme={customTheme}\n extensions={extensions}\n value={value}\n onChange={onChange}\n onUpdate={handleOnUpdate}\n onCreateEditor={handleOnCreate}\n autoFocus={autoFocus}\n placeholder={placeholder}\n className={className}\n readOnly={readOnly}\n editable={!readOnly}\n basicSetup={defaultSetup}\n />\n );\n};\n","export const CHUNK_TYPE = {\n UNCHANGED: 'unchanged',\n ADDED: 'added',\n REMOVED: 'removed',\n} as const;\n\ntype ChunkType = (typeof CHUNK_TYPE)[keyof typeof CHUNK_TYPE];\n\nexport type DiffChunk = {\n type: ChunkType;\n value: string;\n /** 1-indexed start line in the old (left) text */\n oldStart: number;\n /** 1-indexed end line in the old (left) text */\n oldEnd: number;\n /** 1-indexed start line in the new (right) text */\n newStart: number;\n /** 1-indexed end line in the new (right) text */\n newEnd: number;\n};\n\n/**\n * A paired conflict: adjacent REMOVED + ADDED chunks from diffLines,\n * representing a section that was modified. If only one side exists,\n * the other is empty (pure insertion or deletion).\n */\nexport type MergeConflict = {\n id: string;\n oldValue: string;\n oldStartLine: number;\n oldEndLine: number;\n newValue: string;\n newStartLine: number;\n newEndLine: number;\n};\n\nexport const CHANGE_CLASS = {\n SAFE: 'safe',\n CONFLICT: 'conflict',\n} as const;\n\nexport type ChangeClassification = (typeof CHANGE_CLASS)[keyof typeof CHANGE_CLASS];\n\n/** Must match the CodeMirror line-height set in MergePane */\nexport const LINE_HEIGHT_PX = 20;\n\n/** Must match the rendered header height in MergePane (py-3 + content + border) */\nexport const PANE_HEADER_HEIGHT_PX = 58;\n","import { ChevronsLeft, ChevronsRight } from '../../../icons';\nimport { Button } from '../../Button';\n\ntype Props = {\n side: 'left' | 'right';\n onAccept: () => void;\n};\n\nexport const AcceptButton = ({ side, onAccept }: Props) => {\n const label = `Accept ${side === 'left' ? 'production' : 'branch'} version`;\n const Chevron = side === 'left' ? ChevronsRight : ChevronsLeft;\n return (\n <Button onClick={onAccept} variant=\"outline\" size=\"icon-sm\" title={label} aria-label={label}>\n <Chevron className=\"tw:size-5\" />\n </Button>\n );\n};\n","import type { RefCallback } from 'react';\n\nimport { X } from '../../../icons';\nimport { cn } from '../../../utils';\nimport { Button } from '../../Button';\nimport { LINE_HEIGHT_PX, type MergeConflict, PANE_HEADER_HEIGHT_PX } from '../constants';\n\nimport { AcceptButton } from './AcceptButton';\n\ntype Props = {\n conflicts: MergeConflict[];\n side: 'left' | 'right';\n onAccept: (conflict: MergeConflict) => void;\n onDismiss?: (conflict: MergeConflict) => void;\n contentRef?: RefCallback<HTMLDivElement>;\n};\n\n// 28px column when there are conflicts to render — wide enough to fit the\n// 24px icon-xs accept chevron + dismiss icon without overflowing into the\n// adjacent panes (which use `tw:overflow-hidden` and would clip absolutely-\n// positioned children that crossed the boundary). Collapses to 0 when idle\n// so empty merges don't reserve a sliver of layout. Inner wrapper allows\n// horizontal overflow so the icon buttons' focus-visible ring stays visible\n// past the column edge. Buttons stay aligned with their source-pane chunk\n// via the parent's `translateY(-scrollTop)` follower applied to `contentRef`.\nexport const AcceptControls = ({ conflicts, side, onAccept, onDismiss, contentRef }: Props) => (\n <div\n className={cn(\n 'tw:z-10 tw:flex tw:shrink-0 tw:flex-col tw:items-center',\n conflicts.length > 0 ? 'tw:w-7' : 'tw:w-0',\n )}\n >\n {conflicts.length > 0 && (\n <>\n <div className=\"tw:shrink-0\" style={{ height: `${PANE_HEADER_HEIGHT_PX}px` }} />\n <div className=\"tw:relative tw:w-full tw:flex-1 tw:overflow-y-clip tw:overflow-x-visible\">\n <div ref={contentRef} className=\"tw:relative tw:size-full\">\n {conflicts.map((conflict) => {\n const topLine = side === 'left' ? conflict.oldStartLine : conflict.newStartLine;\n const topOffset = (topLine - 1) * LINE_HEIGHT_PX - 2;\n\n return (\n <div\n key={conflict.id}\n className=\"tw:absolute tw:inset-x-0 tw:flex tw:flex-col tw:items-center tw:gap-0.5\"\n style={{ top: `${topOffset}px` }}\n >\n <AcceptButton side={side} onAccept={() => onAccept(conflict)} />\n {onDismiss && (\n <Button\n onClick={() => onDismiss(conflict)}\n variant=\"outline\"\n size=\"icon-sm\"\n title=\"Dismiss\"\n aria-label={`Dismiss ${side === 'left' ? 'production' : 'branch'} change`}\n >\n <X className=\"tw:size-4\" />\n </Button>\n )}\n </div>\n );\n })}\n </div>\n </div>\n </>\n )}\n </div>\n);\n","import {\n type Extension,\n RangeSet,\n RangeSetBuilder,\n StateEffect,\n StateField,\n} from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n gutterLineClass,\n GutterMarker,\n} from '@codemirror/view';\n\nimport colors from '@keboola/tailwind-config/colors';\n\nimport type { ChangeClassification } from './constants';\nimport { CHANGE_CLASS } from './constants';\n\ntype HighlightPayload = {\n lines: Set<number>;\n classification: Map<number, ChangeClassification>;\n};\n\nconst setHighlightedLines = StateEffect.define<HighlightPayload>();\n\nconst safeDecoration = Decoration.line({ class: 'cm-merge-safe-line' });\nconst conflictDecoration = Decoration.line({ class: 'cm-merge-conflict-line' });\n\nclass SafeGutterMarker extends GutterMarker {\n override elementClass = 'cm-merge-safe-gutter';\n}\n\nclass ConflictGutterMarker extends GutterMarker {\n override elementClass = 'cm-merge-conflict-gutter';\n}\n\nconst safeGutterMarker = new SafeGutterMarker();\nconst conflictGutterMarker = new ConflictGutterMarker();\n\ntype FieldValue = {\n decorations: DecorationSet;\n gutterMarkers: RangeSet<GutterMarker>;\n};\n\nexport const createDiffHighlightExtension = (): Extension => {\n const field = StateField.define<FieldValue>({\n create: () => ({ decorations: Decoration.none, gutterMarkers: RangeSet.empty }),\n update(value, tr) {\n // Use the last effect if multiple are dispatched in a single transaction\n let payload: HighlightPayload | null = null;\n for (const effect of tr.effects) {\n if (effect.is(setHighlightedLines)) {\n payload = effect.value;\n }\n }\n\n if (!payload) {\n return {\n decorations: value.decorations.map(tr.changes),\n gutterMarkers: value.gutterMarkers.map(tr.changes),\n };\n }\n\n const decoBuilder = new RangeSetBuilder<Decoration>();\n const gutterBuilder = new RangeSetBuilder<GutterMarker>();\n const doc = tr.state.doc;\n const { lines, classification } = payload;\n\n // Iterate the (typically small) highlighted set instead of all doc lines.\n // RangeSetBuilder requires positions in order, so sort first.\n const sorted = [...lines].filter((l) => l >= 1 && l <= doc.lines).sort((a, b) => a - b);\n for (const i of sorted) {\n const cls = classification.get(i);\n if (!cls) continue;\n\n const isSafe = cls === CHANGE_CLASS.SAFE;\n const line = doc.line(i);\n decoBuilder.add(line.from, line.from, isSafe ? safeDecoration : conflictDecoration);\n gutterBuilder.add(line.from, line.from, isSafe ? safeGutterMarker : conflictGutterMarker);\n }\n\n return {\n decorations: decoBuilder.finish(),\n gutterMarkers: gutterBuilder.finish(),\n };\n },\n provide: (f) => [\n EditorView.decorations.from(f, (val) => val.decorations),\n gutterLineClass.from(f, (val: FieldValue) => val.gutterMarkers),\n ],\n });\n\n // !important needed to override CodeMirror's built-in active-line and selection backgrounds.\n // SAFE = change present on one side only (green). CONFLICT = both sides edited this region\n // (amber/warning — NOT red, since red reads as \"deletion\" and the 3-pane editor only ever\n // displays additions in each side pane). The colored left border doubles as a scan-lane so\n // changes are easy to spot when zoomed out.\n const theme = EditorView.theme({\n '.cm-merge-safe-line': {\n backgroundColor: `${colors.green[100]} !important`,\n boxShadow: `inset 3px 0 0 ${colors.green[500]}`,\n },\n '.cm-merge-conflict-line': {\n backgroundColor: `${colors.warning[100]} !important`,\n boxShadow: `inset 3px 0 0 ${colors.warning[500]}`,\n },\n '.cm-merge-safe-gutter': {\n backgroundColor: `${colors.green[200]} !important`,\n },\n '.cm-merge-conflict-gutter': {\n backgroundColor: `${colors.warning[200]} !important`,\n },\n });\n\n return [field, theme];\n};\n\nexport const updateHighlightedLines = (\n view: EditorView,\n lines: Set<number>,\n classification: Map<number, ChangeClassification>,\n) => {\n view.dispatch({ effects: setHighlightedLines.of({ lines, classification }) });\n};\n","import { type ReactNode, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { type Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport CodeMirror, { type ReactCodeMirrorRef } from '@uiw/react-codemirror';\n\nimport colors from '@keboola/tailwind-config/colors';\n\nimport { useStableCallback } from '../../hooks/useStableCallback';\nimport { cn } from '../../utils';\nimport { buildBasicSetup } from '../CodeEditor/helpers';\nimport { resolveToken, useThemedExtension } from '../CodeEditor/tokenTheme';\n\nimport { type ChangeClassification, LINE_HEIGHT_PX } from './constants';\nimport { createDiffHighlightExtension, updateHighlightedLines } from './decorations';\n\nconst EMPTY_LINES: Set<number> = new Set();\nconst EMPTY_CLASSIFICATION: Map<number, ChangeClassification> = new Map();\n\ntype Props = {\n value: string;\n highlightedLines: Set<number>;\n lineClassification: Map<number, ChangeClassification>;\n readOnly?: boolean;\n onChange?: (value: string) => void;\n header?: ReactNode;\n headerClassName?: string;\n className?: string;\n onScrollDOMReady?: (el: HTMLElement | null) => void;\n /**\n * When true, the pane renders with the error palette to signal the side has\n * been deleted upstream. The CodeMirror editor is still mounted so the diff\n * remains visible — only the background, gutter, header, and border switch.\n */\n deleted?: boolean;\n};\n\nexport const MergePane = ({\n value,\n highlightedLines,\n lineClassification,\n readOnly = false,\n onChange,\n header,\n headerClassName,\n className,\n onScrollDOMReady,\n deleted = false,\n}: Props) => {\n const editorRef = useRef<ReactCodeMirrorRef>(null);\n const handleChange = useStableCallback((next: string) => onChange?.(next));\n\n // Non-deleted pane chrome re-resolves its `--*` tokens on brand /\n // light-dark change. The deleted pane keeps the categorical error wash\n // (deletion is meaning-encoding, not chrome).\n const themeExtension = useThemedExtension(`merge-pane:${deleted}`, () =>\n EditorView.theme({\n '&.cm-editor': {\n height: '100%',\n backgroundColor: deleted ? colors.error[100] : resolveToken('background', '249 250 251'),\n // Pair the token-driven surface with a token-driven text color so line\n // content stays readable when the pane's `--background` goes dark.\n // The deleted pane keeps default dark text on its fixed light-red wash.\n ...(deleted ? {} : { color: resolveToken('foreground', '30 41 59') }),\n outline: 'none',\n },\n '.cm-gutters': {\n backgroundColor: deleted ? colors.error[200] : resolveToken('muted', '241 245 249'),\n ...(deleted ? {} : { color: resolveToken('muted-foreground', '100 116 139') }),\n },\n '*': { lineHeight: `${LINE_HEIGHT_PX}px` },\n '.cm-lineNumbers .cm-gutterElement': { padding: '0 0 0 25px' },\n }),\n );\n\n // Memoized independently of the theme so its `StateField` instance stays\n // stable when the editor reconfigures on brand / light-dark change. A fresh\n // extension would re-init the field and drop the current highlights.\n const diffHighlightExtension = useMemo(() => createDiffHighlightExtension(), []);\n\n // Two of a merge view's three panes are read-only.\n const basicSetup = useMemo(\n () => ({ ...buildBasicSetup(readOnly), lineNumbers: true }),\n [readOnly],\n );\n\n const extensions = useMemo(\n (): Extension[] => [\n diffHighlightExtension,\n themeExtension,\n // Recalc viewport after every doc change so late-settling layouts (alerts\n // appearing above the editor) don't leave trailing lines blank.\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n requestAnimationFrame(() => update.view.dispatch({}));\n }\n }),\n ],\n [diffHighlightExtension, themeExtension],\n );\n\n // A deleted side is a file-level conflict, not a line-level one — suppress\n // per-line markers so the pane wears only the red wash. `deleted` stays in\n // the dep list so highlights switch between the empty and populated sets when\n // the side toggles.\n useEffect(() => {\n const view = editorRef.current?.view;\n if (!view) return;\n updateHighlightedLines(\n view,\n deleted ? EMPTY_LINES : highlightedLines,\n deleted ? EMPTY_CLASSIFICATION : lineClassification,\n );\n }, [highlightedLines, lineClassification, deleted]);\n\n const handleCreateEditor = useCallback(\n (view: EditorView) => {\n updateHighlightedLines(\n view,\n deleted ? EMPTY_LINES : highlightedLines,\n deleted ? EMPTY_CLASSIFICATION : lineClassification,\n );\n onScrollDOMReady?.(view.scrollDOM);\n },\n [highlightedLines, lineClassification, onScrollDOMReady, deleted],\n );\n\n useEffect(() => {\n return () => onScrollDOMReady?.(null);\n }, [onScrollDOMReady]);\n\n // Re-measure on wrapper resize — parent dimensions settle after CM mounts\n // (fullscreen modal, alerts appearing above the editor).\n useEffect(() => {\n const view = editorRef.current?.view;\n const wrapper = view?.dom.parentElement;\n if (!view || !wrapper) return;\n\n const observer = new ResizeObserver(() => view.dispatch({}));\n observer.observe(wrapper);\n\n return () => observer.disconnect();\n }, []);\n\n return (\n <div\n className={cn(\n 'tw:flex tw:min-w-0 tw:flex-1 tw:flex-col tw:overflow-hidden',\n className,\n deleted && 'tw:border-error-300',\n )}\n >\n {header && (\n <div\n className={cn(\n 'tw:px-4 tw:py-3',\n deleted ? 'tw:border-b tw:border-error-200 tw:bg-error-100' : 'tw:bg-background',\n headerClassName,\n )}\n >\n {header}\n </div>\n )}\n <div className=\"tw:flex tw:h-0 tw:flex-1 tw:flex-col tw:[&_>div]:h-full\">\n <CodeMirror\n ref={editorRef}\n height=\"100%\"\n value={value}\n onChange={handleChange}\n extensions={extensions}\n readOnly={readOnly}\n onCreateEditor={handleCreateEditor}\n basicSetup={basicSetup}\n />\n </div>\n </div>\n );\n};\n","import { useCallback, useRef } from 'react';\n\nexport const useScrollSync = () => {\n const scrollersRef = useRef<(HTMLElement | null)[]>([]);\n const followersRef = useRef<Map<string, { paneIndex: number; el: HTMLElement }>>(new Map());\n const isSyncingRef = useRef(false);\n const scrollerCallbacksRef = useRef<Map<number, (el: HTMLElement | null) => void>>(new Map());\n const followerCallbacksRef = useRef<Map<string, (el: HTMLElement | null) => void>>(new Map());\n\n const updateFollowers = useCallback(() => {\n for (const [, { paneIndex, el }] of followersRef.current) {\n const scroller = scrollersRef.current[paneIndex];\n if (!scroller) continue;\n el.style.transform = `translateY(-${scroller.scrollTop}px)`;\n }\n }, []);\n\n const handleScroll = useCallback(\n (e: Event) => {\n if (isSyncingRef.current) return;\n isSyncingRef.current = true;\n\n // Px-aligned sync. All panes share LINE_HEIGHT_PX, so matching scrollTop is the same\n // as matching the line at the top of the viewport. Previous ratio-based sync drifted\n // badly when pane heights differed (e.g. 50 lines vs 500 — half-scrolling left snapped\n // right to its midpoint, not to the equivalent line). Clamp to each target's max so\n // the source can scroll past where shorter panes bottom out without errors.\n const sourceScrollTop = (e.target as HTMLElement).scrollTop;\n\n for (const scroller of scrollersRef.current) {\n if (!scroller || scroller === e.target) continue;\n const targetMax = Math.max(0, scroller.scrollHeight - scroller.clientHeight);\n scroller.scrollTop = Math.min(sourceScrollTop, targetMax);\n }\n\n updateFollowers();\n isSyncingRef.current = false;\n },\n [updateFollowers],\n );\n\n const registerScroller = useCallback(\n (index: number) => {\n const existing = scrollerCallbacksRef.current.get(index);\n if (existing) return existing;\n\n const callback = (el: HTMLElement | null) => {\n const prev = scrollersRef.current[index];\n if (prev === el) return;\n\n prev?.removeEventListener('scroll', handleScroll);\n scrollersRef.current[index] = el;\n el?.addEventListener('scroll', handleScroll, { passive: true });\n };\n\n scrollerCallbacksRef.current.set(index, callback);\n return callback;\n },\n [handleScroll],\n );\n\n const registerFollower = useCallback((paneIndex: number, key: string) => {\n const existing = followerCallbacksRef.current.get(key);\n if (existing) return existing;\n\n const callback = (el: HTMLElement | null) => {\n if (el) {\n followersRef.current.set(key, { paneIndex, el });\n } else {\n followersRef.current.delete(key);\n }\n };\n\n followerCallbacksRef.current.set(key, callback);\n return callback;\n }, []);\n\n return { registerScroller, registerFollower };\n};\n","import type { ReactNode } from 'react';\n\nimport { cn } from '../../utils';\n\nimport { AcceptControls } from './AcceptControls/AcceptControls';\nimport type { ChangeClassification, MergeConflict } from './constants';\nimport { MergePane } from './MergePane';\nimport { useScrollSync } from './useScrollSync';\n\nconst EMPTY_LINES: Set<number> = new Set();\nconst EMPTY_CLASSIFICATION: Map<number, ChangeClassification> = new Map();\n\ntype Props = {\n mergeValue: string;\n handleMergeChange: (value: string) => void;\n leftText: string;\n rightText: string;\n leftConflicts: MergeConflict[];\n rightConflicts: MergeConflict[];\n leftHighlightedLines: Set<number>;\n rightHighlightedLines: Set<number>;\n leftClassification: Map<number, ChangeClassification>;\n rightClassification: Map<number, ChangeClassification>;\n mergeHighlightedLines: Set<number>;\n mergeClassification: Map<number, ChangeClassification>;\n acceptLeft: (conflict: MergeConflict) => void;\n acceptRight: (conflict: MergeConflict) => void;\n dismissLeft: (conflict: MergeConflict) => void;\n dismissRight: (conflict: MergeConflict) => void;\n leftHeader?: ReactNode;\n middleHeader?: ReactNode;\n middleHeaderClassName?: string;\n middleClassName?: string;\n rightHeader?: ReactNode;\n className?: string;\n /**\n * Paint the corresponding read-only pane with the error palette to signal the\n * side has been deleted upstream. The diff is still rendered so the user can\n * see what was lost; accept/dismiss controls for that side are suppressed.\n */\n leftDeleted?: boolean;\n rightDeleted?: boolean;\n};\n\nexport const MergeEditor = ({\n mergeValue,\n handleMergeChange,\n leftText,\n rightText,\n leftConflicts,\n rightConflicts,\n leftHighlightedLines,\n rightHighlightedLines,\n leftClassification,\n rightClassification,\n mergeHighlightedLines,\n mergeClassification,\n acceptLeft,\n acceptRight,\n dismissLeft,\n dismissRight,\n leftHeader,\n middleHeader,\n middleHeaderClassName,\n middleClassName,\n rightHeader,\n className,\n leftDeleted = false,\n rightDeleted = false,\n}: Props) => {\n const { registerScroller, registerFollower } = useScrollSync();\n\n // When either side is deleted the merge is a binary \"keep or drop the file\"\n // choice, not a line-level merge — suppress per-line markers in the middle\n // pane so the indicator/markers don't contradict the red deleted pane.\n const anySideDeleted = leftDeleted || rightDeleted;\n\n return (\n <div\n className={cn(\n 'tw:flex tw:h-full tw:min-h-0 tw:overflow-hidden tw:bg-background tw:gap-3',\n className,\n )}\n >\n <MergePane\n value={leftText}\n highlightedLines={leftHighlightedLines}\n lineClassification={leftClassification}\n readOnly\n header={leftHeader}\n className=\"tw:rounded-r-lg tw:border tw:border-border\"\n onScrollDOMReady={registerScroller(0)}\n deleted={leftDeleted}\n />\n\n <AcceptControls\n conflicts={leftDeleted ? [] : leftConflicts}\n side=\"left\"\n onAccept={acceptLeft}\n onDismiss={dismissLeft}\n contentRef={registerFollower(0, 'left-controls')}\n />\n\n <MergePane\n value={mergeValue}\n highlightedLines={anySideDeleted ? EMPTY_LINES : mergeHighlightedLines}\n lineClassification={anySideDeleted ? EMPTY_CLASSIFICATION : mergeClassification}\n onChange={handleMergeChange}\n header={middleHeader}\n headerClassName={middleHeaderClassName}\n className={cn('tw:border tw:border-border tw:rounded-lg', middleClassName)}\n onScrollDOMReady={registerScroller(1)}\n />\n\n <AcceptControls\n conflicts={rightDeleted ? [] : rightConflicts}\n side=\"right\"\n onAccept={acceptRight}\n onDismiss={dismissRight}\n contentRef={registerFollower(2, 'right-controls')}\n />\n\n <MergePane\n value={rightText}\n highlightedLines={rightHighlightedLines}\n lineClassification={rightClassification}\n readOnly\n header={rightHeader}\n className=\"tw:rounded-l-lg tw:border tw:border-border\"\n onScrollDOMReady={registerScroller(2)}\n deleted={rightDeleted}\n />\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/constants/keyCodes.ts","../src/hooks/useStableCallback.ts","../src/utils/classNames.ts","../src/utils/copyToClipboard.ts","../src/components/ThemeProvider/utils.ts","../src/components/ThemeProvider/defaults.ts","../src/components/ThemeProvider/context.tsx","../src/components/Tooltip/TooltipContent.tsx","../src/components/Tooltip/TooltipRoot.tsx","../src/components/Tooltip/TooltipTrigger.tsx","../src/components/Tooltip/Tooltip.tsx","../src/utils/escapeStringRegexp.ts","../src/utils/isMac.ts","../src/components/HelpBlock/HelpBlock.tsx","../src/components/Button/styles.ts","../src/components/Button/Button.tsx","../src/components/Clipboard/Clipboard.tsx","../src/blocks/ClipboardButton/ClipboardButton.tsx","../src/components/CodeEditor/ButtonToolbar.tsx","../src/components/CodeEditor/modes/dbt.ts","../src/components/CodeEditor/modes/jsonnet.ts","../src/components/CodeEditor/tokenTheme.ts","../src/components/CodeEditor/helpers.ts","../src/components/CodeEditor/search.ts","../src/components/Kbd/KbdSeparator.tsx","../src/components/Kbd/KbdGroup.tsx","../src/components/Kbd/styles.ts","../src/components/Kbd/Kbd.tsx","../src/components/CodeEditor/ToggleComponentHelp.tsx","../src/components/CodeEditor/tooltips.ts","../src/components/CodeEditor/variableCompletion.ts","../src/components/CodeEditor/CodeEditor.tsx","../src/components/CodeEditor/activeQueryHighlight.ts","../src/components/CodeEditor/highlighting.ts","../src/components/CodeEditor/SqlEditor.tsx","../src/components/MergeEditor/constants.ts","../src/components/MergeEditor/AcceptControls/AcceptButton.tsx","../src/components/MergeEditor/AcceptControls/AcceptControls.tsx","../src/components/MergeEditor/decorations.ts","../src/components/MergeEditor/MergePane.tsx","../src/components/MergeEditor/useScrollSync.ts","../src/components/MergeEditor/MergeEditor.tsx"],"names":["useRef","useLayoutEffect","useCallback","extendTailwindMerge","clsx","keboolaLegacySidebar","keboolaLegacyTopnav","createContext","use","cva","Portal","jsx","Content","Root","Trigger","useState","jsxs","Loader2","Slottable","Clipboard","text","Copy","simpleMode","useSyncExternalStore","colors","githubLightInit","json","python","sql","MySQL","PostgreSQL","MSSQL","getSqlDialect","PLSQL","StreamLanguage","r","shell","toml","javascript","StateEffect","Decoration","StateField","EditorView","ViewPlugin","Children","Fragment","Compartment","tooltips","view","useMemo","useEffect","completeAnyWord","linter","jsonParseLinter","EditorState","keymap","autocompletion","cmPlaceholder","unifiedMergeView","CodeMirror","GutterMarker","gutter","RangeSet","defaultKeymap","installExtensions","ChevronsRight","ChevronsLeft","X","RangeSetBuilder","gutterLineClass","EMPTY_LINES","EMPTY_CLASSIFICATION"],"mappings":"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","file":"editors.cjs","sourcesContent":["export const keyCodes = {\n ENTER: 'Enter',\n ESCAPE: 'Escape',\n SPACE: ' ',\n};\n","import { useCallback, useLayoutEffect, useRef } from 'react';\n\n/**\n * A callback with a permanently stable identity that always sees the latest\n * render's values — for any consumer that keys off the handler's identity: a\n * third-party component that redoes expensive work when it changes, or a\n * memoized context value.\n *\n * React 19.2's `useEffectEvent` does this in one line, but it is scoped to\n * Effects and explicitly not to be passed to another component, which is the\n * whole point here.\n *\n * The swap is a layout effect rather than a passive one so it lands before the\n * browser can paint and accept input against the previous render's handler. It\n * is still an effect, and a child's runs before its parent's — so a consumer\n * calling the returned function from its own layout effect can still see the\n * previous render's closure.\n */\nexport const useStableCallback = <Args extends unknown[], Result>(\n callback: (...args: Args) => Result,\n): ((...args: Args) => Result) => {\n const latestRef = useRef(callback);\n\n useLayoutEffect(() => {\n latestRef.current = callback;\n }, [callback]);\n\n return useCallback((...args: Args) => latestRef.current(...args), []);\n};\n","import { type ClassValue, clsx } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\n// tailwind-merge v3 (Tailwind v4): the prefix drops the trailing separator —\n// `tw:` → `tw` (the `:` separator is implied).\nconst twMerge = extendTailwindMerge({\n prefix: 'tw',\n});\n\nexport const cn = (...classes: ClassValue[]) => twMerge(clsx(...classes));\n","export const copyToClipboard = (text: string) => {\n return navigator.clipboard.writeText(text);\n};\n","import type { Brand } from '@keboola/brand-registry';\n\nimport type { Theme } from './types';\n\nexport const createTheme = (brand: Brand): Theme => ({\n id: brand.id,\n name: brand.name,\n shell: brand.shell,\n logo: brand.logo,\n});\n\nexport type CssVars = {\n set: (name: string, value: string | undefined) => void;\n expose: () => Record<string, string>;\n};\n\nexport const createCssVars = (): CssVars => {\n const vars: Record<string, string> = {};\n return {\n set: (name, value) => {\n if (value !== undefined) vars[name] = value;\n },\n expose: () => ({ ...vars }),\n };\n};\n","import type { Brand } from '@keboola/brand-registry';\nimport { keboolaLegacySidebar, keboolaLegacyTopnav } from '@keboola/brand-registry';\n\nimport type { ResolvedColorScheme } from './types';\nimport { createTheme } from './utils';\n\nexport const keboolaLegacyIds = [keboolaLegacySidebar.id, keboolaLegacyTopnav.id];\nexport const DEFAULT_COLOR_SCHEME: ResolvedColorScheme = 'light';\n\n// Sentinel active-brand id that maps to no registry brand. It resolves to\n// `defaultBrand` below, whose empty theme injects nothing — so the design-system\n// stylesheet defaults (`:root` / `[data-theme='dark']`) provide every token.\nexport const DEFAULT_BRAND_ID = 'design-system';\n\n// The \"no brand\" fallback: an empty theme → no CSS vars injected → the\n// stylesheet defaults win. Its shell/name still drive AppShell + switcher label.\nexport const defaultBrand: Brand = {\n id: DEFAULT_BRAND_ID,\n name: 'Design System',\n shell: 'sidebar',\n theme: {},\n};\nexport const defaultTheme = createTheme(defaultBrand);\n\nexport const DEFAULT_BRANDS: Brand[] = [];\n","import { createContext, use } from 'react';\n\nimport { DEFAULT_COLOR_SCHEME, defaultTheme } from './defaults';\nimport type { Theme } from './types';\nimport type { useBrandState } from './useBrandState';\nimport type { useColorSchemeState } from './useColorSchemeState';\n\nexport type ThemeContextValue = ReturnType<typeof useColorSchemeState> &\n ReturnType<typeof useBrandState> & {\n themes: Theme[];\n currentTheme: Theme;\n };\n\nconst noop = () => void 0;\n\nconst defaultContext: ThemeContextValue = {\n scheme: DEFAULT_COLOR_SCHEME,\n resolvedScheme: DEFAULT_COLOR_SCHEME,\n setScheme: noop,\n brandId: defaultTheme.id,\n setBrand: noop,\n\n themes: [defaultTheme],\n currentTheme: defaultTheme,\n};\n\nexport const ThemeContext = createContext(defaultContext);\n\nexport const useTheme = () => use(ThemeContext);\n\n/**\n * TEMPORARY — kbc-ui-internal only.\n *\n * Flags whether the subtree renders the argo design language. Defaults to argo\n * (`true`) — the modern default; legacy chrome is the exception. It exists\n * solely to bridge kbc-ui while its chrome is migrated off the legacy design\n * language: kbc-ui provides `false` for legacy brands/surfaces (see its\n * `AppThemeProvider`) and reads it via `useArgoDesign`. `ThemeProvider` does\n * not set it — argo is decoupled from the brand. Once every kbc-ui surface has\n * been migrated, this context and its hook can be deleted.\n */\nexport const ArgoDesignContext = createContext<boolean>(true);\n\nexport const useArgoDesign = () => use(ArgoDesignContext);\n","import type { ComponentProps } from 'react';\nimport { Content, Portal } from '@radix-ui/react-tooltip';\nimport type { VariantProps } from 'class-variance-authority';\nimport { cva } from 'class-variance-authority';\n\nimport { useArgoDesign } from '../ThemeProvider/context';\n\nconst tooltipVariants = cva(\n [\n 'tailwindcss-preflight',\n 'tw:inline-block',\n 'tw:break-anywhere',\n 'tw:max-h-96',\n 'tw:overflow-y-auto',\n 'tw:z-[1060]',\n\n // legacy (dark) chrome — default\n 'tw:rounded',\n 'tw:bg-neutral-800',\n 'tw:text-white',\n\n // argo chrome overrides — semantic floating-panel tokens\n 'tw:data-[argo=true]:rounded-2xl',\n 'tw:data-[argo=true]:border',\n 'tw:data-[argo=true]:border-solid',\n 'tw:data-[argo=true]:border-border',\n 'tw:data-[argo=true]:bg-popover',\n 'tw:data-[argo=true]:text-popover-foreground',\n 'tw:data-[argo=true]:shadow-md',\n\n // argo open animation\n 'tw:data-[argo=true]:data-[state=delayed-open]:animate-in',\n 'tw:data-[argo=true]:data-[state=instant-open]:animate-in',\n 'tw:data-[argo=true]:data-[state=delayed-open]:fade-in-0',\n 'tw:data-[argo=true]:data-[state=instant-open]:fade-in-0',\n 'tw:data-[argo=true]:data-[state=delayed-open]:zoom-in-95',\n 'tw:data-[argo=true]:data-[state=instant-open]:zoom-in-95',\n\n // argo closed animation\n 'tw:data-[argo=true]:data-[state=closed]:animate-out',\n 'tw:data-[argo=true]:data-[state=closed]:fade-out-0',\n 'tw:data-[argo=true]:data-[state=closed]:zoom-out-95',\n\n // argo position animation\n 'tw:data-[argo=true]:data-[side=bottom]:slide-in-from-top-2',\n 'tw:data-[argo=true]:data-[side=left]:slide-in-from-right-2',\n 'tw:data-[argo=true]:data-[side=right]:slide-in-from-left-2',\n 'tw:data-[argo=true]:data-[side=top]:slide-in-from-bottom-2',\n ],\n {\n defaultVariants: {\n variant: 'action',\n },\n variants: {\n variant: {\n action: [\n 'tw:max-w-fit',\n 'tw:px-3',\n 'tw:py-2',\n\n 'tw:text-center',\n 'tw:text-xs',\n 'tw:font-medium',\n // Legacy chrome uppercases the action tooltip; the Keboola V2 brand\n // (`data-brand=\"keboola\"`) renders it in standard case instead.\n 'tw:uppercase',\n 'tw:tracking-wider',\n 'tw:[[data-brand=keboola]_&]:normal-case',\n 'tw:[[data-brand=keboola]_&]:tracking-normal',\n ],\n explanatory: [\n 'tw:max-w-80',\n 'tw:px-4',\n 'tw:py-3',\n 'tw:text-left',\n\n 'tw:text-sm',\n 'tw:font-normal',\n ],\n },\n },\n },\n);\n\ntype Props = {\n keepOpenOnPointerDownOutside?: boolean;\n placement?: ComponentProps<typeof Content>['side'];\n} & Omit<ComponentProps<typeof Content>, 'side'> &\n VariantProps<typeof tooltipVariants>;\n\nexport const TooltipContent = ({\n className,\n variant,\n keepOpenOnPointerDownOutside = false,\n children,\n onPointerDownOutside,\n sideOffset = 8,\n collisionPadding = 8,\n hideWhenDetached = true,\n placement = 'right',\n ...rest\n}: Props) => {\n const renderArgo = useArgoDesign();\n\n const handlePointerDownOutside: ComponentProps<typeof Content>['onPointerDownOutside'] = (\n event,\n ) => {\n if (keepOpenOnPointerDownOutside) event.preventDefault();\n onPointerDownOutside?.(event);\n };\n\n return (\n <Portal>\n <Content\n {...rest}\n // Marks the dark (non-argo) tooltip chrome so styles.css can invert\n // nested `.tw-prose` for contrast.\n data-tooltip-content={renderArgo ? undefined : true}\n data-argo={renderArgo}\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n onPointerDownOutside={handlePointerDownOutside}\n className={tooltipVariants({ className, variant })}\n hideWhenDetached={hideWhenDetached}\n side={placement}\n >\n {children}\n </Content>\n </Portal>\n );\n};\n","import type { ComponentProps } from 'react';\nimport { Root } from '@radix-ui/react-tooltip';\n\ntype Props = ComponentProps<typeof Root>;\n\nconst DELAY_SHOW_TOOLTIP = 300;\n\nexport const TooltipRoot = ({ children, delayDuration = DELAY_SHOW_TOOLTIP, ...rest }: Props) => (\n <Root {...rest} delayDuration={delayDuration}>\n {children}\n </Root>\n);\n","import type { ComponentProps } from 'react';\nimport { Trigger } from '@radix-ui/react-tooltip';\n\nimport { cn } from '../../utils';\n\ntype Props = {\n keepOpenOnClick?: boolean;\n} & ComponentProps<typeof Trigger>;\n\nexport const TooltipTrigger = ({\n ref,\n children,\n className,\n keepOpenOnClick = false,\n onClick,\n onPointerDown,\n asChild,\n ...rest\n}: Props) => {\n const handleClick: ComponentProps<typeof Trigger>['onClick'] = (event) => {\n if (keepOpenOnClick) event.preventDefault();\n onClick?.(event);\n };\n\n const handlePointerDown: ComponentProps<typeof Trigger>['onPointerDown'] = (event) => {\n if (keepOpenOnClick) event.preventDefault();\n onPointerDown?.(event);\n };\n\n return (\n <Trigger\n {...rest}\n asChild\n ref={ref}\n className={cn('tailwindcss-preflight', className)}\n onClick={handleClick}\n onPointerDown={handlePointerDown}\n >\n {asChild ? (\n children\n ) : (\n // Default-mode trigger wraps children in a span so Radix has a\n // single DOM element to attach handlers to. `tailwindcss-preflight`\n // (merged in via Slot) activates Tailwind's preflight inside the\n // span, which sets `svg { display: block }` — without an inline-flex\n // container that would stack any bare Lucide icon onto its own\n // line. `tw:inline-flex tw:items-center` keeps icon + text aligned.\n <span className=\"tw:inline-flex tw:items-center\">{children}</span>\n )}\n </Trigger>\n );\n};\n","import { useState } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport type { Content, Trigger } from '@radix-ui/react-tooltip';\nimport { Provider } from '@radix-ui/react-tooltip';\n\nimport { keyCodes } from '../../constants/keyCodes';\n\nimport { TooltipContent } from './TooltipContent';\nimport { TooltipRoot } from './TooltipRoot';\nimport { TooltipTrigger } from './TooltipTrigger';\n\nconst ACTION_TOOLTIP_LIMIT = 30;\n\ntype TriggerProps = {\n triggerAsChild?: boolean;\n};\n\n/**\n * Props for `Tooltip`. `tooltip` is the popup content; `children` is the trigger element.\n * `variant` auto-resolves to `\"explanatory\"` for strings >30 chars, else `\"action\"`.\n */\nexport type Props = {\n /** Keep the tooltip visible when the user clicks the trigger (useful for click-to-copy feedback). */\n keepOpenOnTriggerClick?: boolean;\n /** Content rendered inside the tooltip. Plain text only — no interactive elements (use `HoverCard` or `Popover` for that). */\n tooltip: ReactNode;\n children: ReactNode;\n placement?: ComponentProps<typeof Content>['side'];\n /** Forcibly hide the tooltip regardless of hover state. */\n forceHide?: boolean;\n /** Forcibly show the tooltip regardless of hover state. Useful for guided-tour overlays. */\n forceShow?: boolean;\n /** Hover delay before the tooltip opens, in ms. Defaults to the shared 300ms. */\n delayDuration?: number;\n className?: string;\n} & TriggerProps &\n Pick<ComponentProps<typeof TooltipContent>, 'variant' | 'className'>;\n\n/** Re-export of Radix `Tooltip.Provider`. Mount once at the app root so tooltips share delay state. */\nexport const TooltipProvider = Provider;\n\n/**\n * Short plain-text label that appears on hover or focus.\n *\n * **When to use:** describing an icon-only `Button`, explaining a disabled control, or labelling a\n * truncated value. Plain text only — auto-switches to the longer `\"explanatory\"` variant when the string\n * exceeds 30 characters.\n * **When NOT to use:** for rich preview content (multiple lines, formatted text, structured data) use\n * `HoverCard`; for tooltips containing links or buttons use `Popover` (interactive elements break a11y\n * inside a `Tooltip`).\n * **Composition:** wrap any focusable element via `triggerAsChild` so the tooltip targets the underlying\n * native element. Mount `TooltipProvider` once at the app root.\n *\n * @see RECIPES.md#disabled-button-tooltip — for the disabled-button + tooltip pattern\n */\nexport const Tooltip = ({\n tooltip,\n children,\n className,\n keepOpenOnTriggerClick = false,\n variant,\n placement = 'right',\n forceHide = false,\n forceShow = false,\n delayDuration,\n // trigger props\n triggerAsChild = false,\n}: Props) => {\n const [open, setOpen] = useState(false);\n\n const resolvedVariant = (() => {\n if (!!variant) return variant;\n if (typeof tooltip === 'string' && tooltip.length > ACTION_TOOLTIP_LIMIT) return 'explanatory';\n\n return 'action';\n })();\n\n const isActionVariant = resolvedVariant === 'action';\n\n const handleKeyUp: ComponentProps<typeof Trigger>['onKeyUp'] = (event) => {\n if (![keyCodes.ENTER, keyCodes.SPACE].includes(event.key)) return;\n event.stopPropagation();\n };\n\n return (\n <TooltipRoot\n open={!!tooltip && (open || forceShow) && !forceHide}\n onOpenChange={setOpen}\n delayDuration={delayDuration}\n disableHoverableContent={isActionVariant}\n >\n <TooltipTrigger\n asChild={triggerAsChild}\n keepOpenOnClick={keepOpenOnTriggerClick}\n onKeyUp={handleKeyUp}\n >\n {children}\n </TooltipTrigger>\n\n <TooltipContent\n className={className}\n variant={resolvedVariant}\n placement={placement}\n keepOpenOnPointerDownOutside={keepOpenOnTriggerClick}\n >\n {tooltip}\n </TooltipContent>\n </TooltipRoot>\n );\n};\n\nTooltip.Root = TooltipRoot;\nTooltip.Content = TooltipContent;\nTooltip.Trigger = TooltipTrigger;\n","// Escape characters with special meaning either inside or outside character sets.\n// Use a simple backslash escape when it's always valid, and a `\\xnn` escape when the simpler form would be disallowed by Unicode patterns' stricter grammar.\nexport const escapeStringRegexp = (string: string) =>\n string.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n","// Platform detection\ntype NavigatorUAData = {\n platform: string;\n brands: { brand: string; version: string }[];\n mobile: boolean;\n};\n\nconst getIsMac = (): boolean => {\n // Modern approach using navigator.userAgentData\n if (typeof navigator !== 'undefined' && 'userAgentData' in navigator) {\n const platform = (navigator.userAgentData as NavigatorUAData).platform;\n\n if (typeof platform === 'string') {\n return platform.toLowerCase() === 'macos';\n }\n }\n\n if (typeof navigator !== 'undefined' && typeof navigator.platform === 'string') {\n return navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n }\n\n // Server-side rendering fallback\n return false;\n};\n\nexport const isMac = getIsMac();\n","import type { ComponentPropsWithRef } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nconst helpVariants = cva(['tw:m-0', 'tw:text-xs'], {\n defaultVariants: {\n state: 'default',\n },\n variants: {\n state: {\n default: ['tw:text-muted-foreground'],\n warning: ['tw:text-warning'],\n },\n },\n});\n\ntype Props = ComponentPropsWithRef<'p'> & VariantProps<typeof helpVariants>;\n\nexport const HelpBlock = ({ children, className, state = 'default', ...rest }: Props) => {\n if (!children) return null;\n\n return (\n <p {...rest} className={helpVariants({ state, className })}>\n {children}\n </p>\n );\n};\n","import { cva } from 'class-variance-authority';\n\nexport const variants = cva(\n [\n 'tailwindcss-preflight',\n 'tw:group/button',\n 'tw:border-box',\n\n // layout\n 'tw:relative',\n 'tw:flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:gap-2',\n\n // text — chrome weight/tracking are brand-overridable tokens\n // (`--font-weight-medium` / `--letter-spacing-chrome`). Casing: standard case is\n // the default; only legacy brands (`keboola-legacy-*`) uppercase the chrome, so\n // modern brands (incl. Keboola V2) read naturally. Mirrors the V2 standard-case\n // treatment shipped for Tooltip/Badge (PR 7629).\n 'tw:text-xs',\n 'tw:leading-5',\n 'tw:font-medium',\n 'tw:[[data-brand^=keboola-legacy]_&]:tracking-chrome',\n 'tw:[[data-brand^=keboola-legacy]_&]:uppercase',\n\n // border — legacy (non-argo) chrome uses a fixed radius, not the brand token.\n 'tw:rounded',\n 'tw:border',\n 'tw:border-transparent',\n\n // styling\n 'tw:shadow-none',\n 'tw:[a]:cursor-pointer', // explicitly set for anchor\n\n 'tw:focus-visible:outline',\n 'tw:focus-visible:outline-1',\n 'tw:focus-visible:-outline-offset-1',\n 'tw:focus-visible:outline-ring',\n 'tw:focus-visible:ring-4',\n 'tw:focus-visible:ring-ring/30',\n\n // disabled\n 'tw:disabled:opacity-40',\n 'tw:disabled:cursor-not-allowed',\n\n // anchor support\n 'tw:!no-underline',\n 'tw:aria-disabled:opacity-40',\n 'tw:aria-disabled:cursor-not-allowed',\n\n 'tw:[&_svg]:shrink-0',\n ],\n {\n defaultVariants: {\n size: 'medium',\n variant: 'primary',\n block: false,\n },\n variants: {\n block: {\n true: ['tw:w-full'],\n },\n variant: {\n primary: [\n 'tw:text-white',\n 'tw:bg-primary-500',\n\n 'tw:focus:text-white',\n 'tw:hover:text-white',\n 'tw:hover:not-disabled:bg-primary-600',\n 'tw:active:not-disabled:bg-primary-800',\n\n // anchor disabled override\n 'tw:aria-disabled:!bg-primary-500',\n ],\n secondary: [\n 'tw:text-white',\n 'tw:bg-secondary-500',\n\n 'tw:focus:text-white',\n 'tw:hover:text-white',\n 'tw:hover:not-disabled:bg-secondary-700',\n 'tw:active:not-disabled:bg-secondary-800',\n\n // anchor disabled override\n 'tw:aria-disabled:!bg-secondary-500',\n ],\n danger: [\n 'tw:text-white',\n 'tw:bg-error-500',\n\n 'tw:focus:text-white',\n 'tw:hover:text-white',\n 'tw:hover:not-disabled:bg-error-600',\n 'tw:active:not-disabled:bg-error-700',\n\n // anchor disabled override\n 'tw:aria-disabled:!bg-error-500',\n ],\n invisible: [\n 'tw:text-neutral-800',\n 'tw:bg-transparent',\n\n 'tw:focus:text-neutral-800',\n 'tw:hover:not-disabled:bg-neutral-100',\n 'tw:hover:text-neutral-800',\n 'tw:active:not-disabled:bg-neutral-150',\n\n // contrasting icon on hover/active\n 'tw:[&_svg]:text-neutral-400',\n 'tw:hover:not-disabled:[&_svg]:text-secondary-600',\n 'tw:active:not-disabled:[&_svg]:text-secondary-600',\n\n // anchor disabled override\n 'tw:aria-disabled:!bg-transparent',\n ],\n outline: [\n 'tw:text-neutral-800',\n 'tw:bg-white',\n // border\n 'tw:!border-neutral-200',\n 'tw:hover:text-neutral-800',\n 'tw:focus:text-neutral-800',\n 'tw:hover:not-disabled:!border-neutral-300',\n 'tw:hover:not-disabled:bg-neutral-100',\n 'tw:active:not-disabled:bg-neutral-200',\n\n // contrasting icon hover, same as invisible\n 'tw:[&_svg]:text-neutral-400',\n 'tw:not-disabled:hover:[&_svg]:text-secondary-600',\n 'tw:active:not-disabled:[&_svg]:text-secondary-600',\n\n // anchor disabled override\n 'tw:aria-disabled:!bg-white',\n 'tw:aria-disabled:!border-neutral-200',\n ],\n\n inline: [\n 'tw:text-neutral-800',\n 'tw:bg-transparent',\n 'tw:rounded-full',\n\n 'tw:[&_svg]:text-neutral-400',\n 'tw:not-disabled:hover:[&_svg]:text-secondary-600',\n 'tw:not-disabled:focus:[&_svg]:text-secondary-600',\n ],\n },\n size: {\n medium: [\n 'tw:max-h-10',\n 'tw:min-h-10',\n 'tw:px-4',\n 'tw:py-2.5',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4',\n ],\n small: [\n 'tw:max-h-8',\n 'tw:min-h-8',\n 'tw:px-4',\n 'tw:py-1.5',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4',\n ],\n large: [\n 'tw:max-h-12',\n 'tw:min-h-12',\n 'tw:px-4',\n 'tw:py-3.5',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4',\n ],\n\n 'icon-lg': ['tw:size-12', 'tw:p-0', 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-6'],\n icon: ['tw:size-10', 'tw:p-0', 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4'],\n 'icon-sm': ['tw:size-8', 'tw:p-0', 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4'],\n 'icon-xs': ['tw:size-6', 'tw:p-0', 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4'],\n 'icon-2xs': [\n 'tw:!inline-flex',\n 'tw:size-5',\n 'tw:max-h-5',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-3',\n ],\n 'icon-3xs': ['tw:h-fit', 'tw:w-fit', 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4'],\n },\n },\n },\n);\n\nexport const argoVariants = cva(\n [\n 'tailwindcss-preflight',\n\n // layout\n 'tw:relative',\n 'tw:inline-flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:whitespace-nowrap',\n 'tw:gap-2',\n\n // border\n 'tw:border',\n 'tw:border-transparent',\n 'tw:rounded-[var(--radius-lg,0.25rem)]',\n\n // text\n 'tw:font-medium',\n 'tw:select-none',\n\n // focus visible\n 'tw:!outline-hidden',\n 'tw:focus-visible:ring-2',\n\n // disabled\n 'tw:disabled:cursor-not-allowed',\n 'tw:disabled:opacity-50',\n 'tw:active:opacity-60',\n\n 'tw:transition-all',\n 'tw:bg-clip-padding',\n\n // anchor support\n 'tw:!no-underline',\n 'tw:aria-disabled:cursor-not-allowed',\n 'tw:aria-disabled:opacity-50',\n\n // icon\n 'tw:shrink-0',\n 'tw:[&_svg]:pointer-events-none',\n 'tw:[&_svg]:shrink-0',\n \"tw:[&_svg:not([class*='tw:size-'])]:size-4\",\n ],\n {\n defaultVariants: {\n variant: 'primary',\n size: 'medium',\n },\n variants: {\n block: {\n true: ['tw:w-full'],\n },\n variant: {\n primary: [\n 'tw:bg-primary',\n 'tw:text-primary-foreground',\n 'tw:[a]:hover:bg-primary/80',\n 'tw:hover:not-disabled:bg-primary/90',\n 'tw:hover:text-primary-foreground',\n 'tw:focus:text-primary-foreground',\n\n 'tw:focus-visible:border-primary',\n 'tw:focus-visible:ring-ring/50',\n ],\n secondary: [\n 'tw:bg-primary/10',\n 'tw:text-primary',\n 'tw:hover:not-disabled:bg-primary/20',\n\n 'tw:focus-visible:border-primary',\n 'tw:focus-visible:ring-ring/50',\n ],\n\n // should be called \"destructive\" by Figma\n danger: [\n 'tw:bg-destructive',\n 'tw:text-destructive-foreground',\n 'tw:hover:text-destructive-foreground',\n 'tw:focus:text-destructive-foreground',\n\n 'tw:focus-visible:border-destructive',\n 'tw:focus-visible:ring-destructive/20',\n ],\n outline: [\n 'tw:!border-input',\n 'tw:bg-background',\n // Semantic base text color so the label/icon flips in dark mode\n // (matches `invisible`); previously unset → inherited a fixed dark color.\n 'tw:text-foreground',\n // Hover follows the brand primary (translucent tint), matching the\n // `secondary` variant — not the fixed `accent` blue.\n 'tw:hover:not-disabled:bg-primary/10',\n 'tw:hover:not-disabled:text-primary',\n 'tw:hover:active:bg-background',\n 'tw:focus-visible:!border-primary',\n 'tw:focus-visible:ring-ring/50',\n ],\n\n // should be called \"ghost\" by Figma\n invisible: [\n 'tw:bg-transparent',\n 'tw:text-foreground',\n 'tw:hover:not-disabled:bg-primary/10',\n 'tw:hover:not-disabled:text-primary',\n 'tw:hover:not-disabled:border-primary/10',\n\n 'tw:focus-visible:ring-ring/50',\n ],\n // should be called \"link\" by Figma\n inline: [\n 'tw:bg-transparent',\n 'tw:text-primary',\n 'tw:hover:underline',\n 'tw:hover:active:bg-transparent',\n 'tw:focus-visible:ring-ring/50',\n ],\n },\n size: {\n // should be called \"default\" by Figma\n medium: ['tw:max-h-9', 'tw:py-2', 'tw:px-4', 'tw:text-sm'],\n // should be called \"small\" by Figma\n small: ['tw:max-h-8', 'tw:py-2', 'tw:px-3', 'tw:text-xs'],\n // should be called \"large\" by Figma\n large: ['tw:max-h-10', 'tw:py-2.5', 'tw:px-6', 'tw:text-sm'],\n\n 'icon-lg': ['tw:size-10'],\n icon: ['tw:size-9'],\n 'icon-sm': ['tw:size-8'],\n // unsupported in ARGO, remove when old design is gone\n 'icon-xs': [],\n 'icon-2xs': [],\n 'icon-3xs': [],\n },\n },\n },\n);\n","import type { ComponentProps } from 'react';\nimport { Root, Slottable } from '@radix-ui/react-slot';\nimport type { VariantProps } from 'class-variance-authority';\n\nimport { Loader2 } from '../../icons';\nimport { cn } from '../../utils';\nimport { useArgoDesign } from '../ThemeProvider/context';\n\nimport { argoVariants, variants } from './styles';\n\n/**\n * Props for the `Button` component.\n *\n * Pass `variant` for primary/secondary/danger/outline/invisible looks, `size`\n * for height (including `icon-*` sizes when rendering icon-only). Icons are\n * composed as children — `<Button><Trash2 className=\"tw:size-4\" /> Delete</Button>`.\n */\ntype Props = {\n /** Replaces the leading content with a spinner and disables the button visually. The caller still controls `disabled`. */\n isLoading?: boolean;\n /** Render as a Radix `Slot` so the parent JSX (e.g. a `react-router` `<Link>`) becomes the button element. */\n asChild?: boolean;\n} & ComponentProps<'button'> &\n VariantProps<typeof variants>;\n\n/**\n * Primary action surface for the design system — covers all clickable controls except inline text links.\n *\n * **When to use:** any user-initiated action (submit, save, open modal, run job). Use `size=\"icon-*\"` with no\n * children for an icon-only button; there is no separate `IconButton` component.\n * **When NOT to use:** for inline text-link actions inside body copy use `ButtonInline`; for navigation that\n * opens a URL use `Link`; for \"primary action + dropdown of related actions\" use `SplitButton`.\n * **Composition:** wrap in `Tooltip` when icon-only or when disabled state needs an explanation; pair with\n * `Popconfirm` for destructive confirmations; pass through `Modal.Trigger` / `DropdownMenu.Trigger` via `asChild`.\n *\n * @see RECIPES.md#disabled-button-tooltip — for the disabled-button + tooltip pattern\n * @see RECIPES.md#confirm-dialog — for destructive-action confirmation\n */\nexport const Button = ({\n ref,\n children,\n disabled = false,\n className,\n type = 'button',\n isLoading = false,\n asChild = false,\n onClick,\n variant = 'primary',\n size = 'medium',\n block = false,\n ...buttonProps\n}: Props) => {\n const renderArgo = useArgoDesign();\n const Comp = asChild ? Root : 'button';\n const isIconOnly = String(size).startsWith('icon');\n const classNames = renderArgo\n ? argoVariants({ variant, size, block, className })\n : variants({ size, variant, block, className });\n\n const handleClick: ComponentProps<'button'>['onClick'] = (event) => {\n const isAnchor = event.currentTarget.tagName === 'A';\n\n // <a/> does not support disabled by default, and we cannot use pointer-events: none because cursor-not-allowed would not work.\n if (isAnchor && disabled) {\n event.preventDefault();\n return;\n }\n\n onClick?.(event);\n };\n\n return (\n <Comp\n {...buttonProps}\n ref={ref}\n disabled={disabled}\n aria-disabled={disabled}\n data-variant={variant}\n // `size=\"icon\"` / `size=\"icon-*\"` flags the button as icon-only — needed\n // by `ButtonGroup space=\"block\"` which stretches non-icon children to\n // equal width.\n data-icon-only={isIconOnly}\n type={type}\n onClick={handleClick}\n className={cn(classNames)}\n >\n {isLoading && <Loader2 className=\"tw:size-4 tw:shrink-0 tw:animate-spin\" />}\n <Slottable>{isLoading && isIconOnly ? null : children}</Slottable>\n </Comp>\n );\n};\n","import { useState } from 'react';\nimport type { ComponentProps, MouseEventHandler } from 'react';\n\nimport { cn, copyToClipboard } from '../../utils';\nimport { type Props as TooltipProps, Tooltip } from '../Tooltip';\n\ntype Props = {\n tooltip?: TooltipProps['tooltip'];\n tooltipPlacement?: TooltipProps['placement'];\n tooltipVariant?: TooltipProps['variant'];\n asChild?: TooltipProps['triggerAsChild'];\n text?: string | (() => string);\n} & ComponentProps<'button'>;\n\nexport const Clipboard = ({\n ref,\n text: textProp,\n children,\n tooltip = 'Copy to Clipboard',\n tooltipPlacement = 'top',\n tooltipVariant: tooltipVariantProp = 'action',\n asChild = false,\n onClick,\n className,\n ...restButtonProps\n}: Props) => {\n const [isTooltipOpen, setIsTooltipOpen] = useState(false);\n const [state, setState] = useState<'ready' | 'copied' | 'error'>('ready');\n const text = typeof textProp === 'function' ? textProp() : textProp;\n\n const copy = async (text: string) => {\n try {\n // For the clipboard feature to work reliably, the window must be in focus for security reasons.\n // However, the button can be clicked without the window being focused.\n if (!document.hasFocus()) window.focus();\n\n await copyToClipboard(text);\n setState('copied');\n } catch {\n setState('error');\n }\n };\n\n const handleOnClick: MouseEventHandler<HTMLButtonElement> = (event) => {\n // Open on click rather than waiting for hover. Radix opens on pointer-enter via a\n // `delayDuration` timer (300ms here), so clicking faster than that left the outcome invisible\n // until the timer caught up — the message was already rendered, just inside a closed tooltip.\n setIsTooltipOpen(true);\n if (text && state === 'ready') void copy(text);\n onClick?.(event);\n };\n\n const handleOnOpenChange: ComponentProps<typeof Tooltip.Root>['onOpenChange'] = (open) => {\n // Reset when the tooltip closes, allowing the user to leave the copy button.\n if (!open && state !== 'ready') setState('ready');\n setIsTooltipOpen(open);\n };\n\n const tooltipContent = (() => {\n if (!text) return 'Nothing to copy';\n if (state === 'error') return 'Failed to copy';\n if (state === 'copied') return 'Copied to Clipboard';\n return tooltip;\n })();\n\n const tooltipVariant: TooltipProps['variant'] =\n state === 'ready' && !!text ? tooltipVariantProp : 'action';\n\n // `tooltip={null}` leaves nothing to say until there is an outcome. Not rendering `Content` at all\n // is what makes that work: hovering still opens the tooltip, there is simply nothing in it, and\n // the copied / failed message appears in place the moment `state` changes. It also keeps Radix\n // from pointing the trigger's `aria-describedby` at content that has no text.\n const hasTooltipContent = tooltipContent !== null && tooltipContent !== undefined;\n\n return (\n <Tooltip.Root open={isTooltipOpen} onOpenChange={handleOnOpenChange}>\n <Tooltip.Trigger\n {...restButtonProps}\n asChild={asChild}\n keepOpenOnClick\n onClick={handleOnClick}\n className={cn('tw:cursor-pointer', className)}\n ref={ref}\n >\n {children ?? text}\n </Tooltip.Trigger>\n\n {hasTooltipContent && (\n <Tooltip.Content\n keepOpenOnPointerDownOutside\n placement={tooltipPlacement}\n variant={tooltipVariant}\n >\n {tooltipContent}\n </Tooltip.Content>\n )}\n </Tooltip.Root>\n );\n};\n","import type { ComponentProps, ReactNode } from 'react';\n\nimport { Button } from '../../components/Button';\nimport { Clipboard } from '../../components/Clipboard';\nimport { Copy } from '../../icons';\n\ntype ClipboardProps = Pick<\n ComponentProps<typeof Clipboard>,\n 'text' | 'tooltip' | 'tooltipPlacement' | 'tooltipVariant'\n>;\n\ntype ButtonProps = Omit<ComponentProps<typeof Button>, 'disabled' | 'icon'>;\n\ntype Props = ClipboardProps & ButtonProps & { icon?: ReactNode };\n\nconst DEFAULT_ICON: ReactNode = <Copy />;\nconst DEFAULT_ARIA_LABEL = 'Copy';\n\nexport const ClipboardButton = ({\n // clipboard props\n text,\n tooltip,\n tooltipPlacement,\n tooltipVariant,\n\n // button props\n icon = DEFAULT_ICON,\n variant = 'outline',\n children,\n ...rest\n}: Props) => {\n // Icon-only (no text children): the `tooltip` is visual only, not an accessible\n // name, so fall back to it (when it's a string) or a sensible default. A\n // consumer-supplied `aria-label` in `rest` still wins.\n // A non-empty string tooltip names the action; an empty/absent tooltip still\n // needs a name, so fall back to the default rather than an empty aria-label.\n const defaultAriaLabel =\n typeof tooltip === 'string' && tooltip.trim() ? tooltip : DEFAULT_ARIA_LABEL;\n const ariaLabel = rest['aria-label'] ?? (children == null ? defaultAriaLabel : undefined);\n\n return (\n <Clipboard\n asChild\n tooltip={tooltip}\n tooltipPlacement={tooltipPlacement}\n tooltipVariant={tooltipVariant}\n text={text}\n >\n <Button {...rest} aria-label={ariaLabel} variant={variant} disabled={!text}>\n {icon}\n {children}\n </Button>\n </Clipboard>\n );\n};\n","import type { ReactNode } from 'react';\n\nimport { ClipboardButton } from '../../blocks/ClipboardButton';\n\nexport const ButtonToolbar = ({ value, children }: { value?: string; children?: ReactNode }) => {\n if (!value && !children) return null;\n\n return (\n <div className=\"tw:pointer-events-auto tw:ml-auto tw:mr-4 tw:flex tw:w-fit tw:gap-1 tw:overflow-visible tw:rounded-lg tw:border tw:border-solid tw:border-border tw:!bg-background tw:p-[3px] tw:shadow\">\n {!!value && <ClipboardButton size=\"icon-sm\" variant=\"invisible\" text={value} />}\n {children}\n </div>\n );\n};\n","import type { Completion, CompletionContext, CompletionResult } from '@codemirror/autocomplete';\nimport { simpleMode } from '@codemirror/legacy-modes/mode/simple-mode';\n\n// A dbt step is `dbt <command> [<subcommand>] [arguments, flags and selectors]`,\n// and the vocabulary below is grouped by the slot it belongs to — both to colour\n// it and to decide what is worth offering where.\nconst COMMANDS = [\n 'run-operation',\n 'run',\n 'test',\n 'seed',\n 'snapshot',\n 'list',\n 'ls',\n 'compile',\n 'build',\n 'deps',\n 'docs',\n 'source',\n];\nconst SUBCOMMANDS: Record<string, string[]> = { docs: ['generate'], source: ['freshness'] };\nconst ARGUMENTS = ['--select', '--exclude', '--selector', '--defer', '--resource-type', '-s'];\n// The arguments whose value is a graph selector, and so the only ones a selector\n// method has anything to attach to.\nconst SELECTORS = ['--select', '--exclude', '-s'];\nconst METHODS = [\n 'path:',\n 'source:',\n 'tag:',\n 'package:',\n 'config:',\n 'test_type:',\n 'test_name:',\n 'state:',\n 'exposure:',\n 'metric:',\n 'result:',\n 'source_status:',\n 'column_name:',\n];\nconst FLAGS = [\n '--fail-fast',\n '--warn-error',\n '--favor-state',\n '--vars',\n '--models',\n '--threads',\n '--profiles-dir',\n '--profile',\n '--full-refresh',\n];\n\n// A subcommand only ever highlights together with its command, so `dbt docs` stays\n// unpainted until `generate` follows it.\nconst COMMAND_PHRASES = COMMANDS.flatMap((command) => {\n const subcommands = SUBCOMMANDS[command];\n\n return subcommands ? subcommands.map((subcommand) => `${command} ${subcommand}`) : [command];\n});\n\n// Alternation is first-match, so a word that prefixes another has to come first\n// (`run-operation` before `run`, `--profiles-dir` before `--profile`). Sorting by\n// length keeps that true however the lists above are written.\nconst alternation = (list: string[]) => [...list].sort((a, b) => b.length - a.length).join('|');\n\n// Every keyword follows whitespace, so the leading run is part of the match.\n// Commands and arguments end on a word boundary; methods and flags carry their\n// own terminator (`:`) or need none.\nconst word = (list: string[]) => new RegExp(`^\\\\s+(?:${alternation(list)})\\\\b`, 'i');\nconst prefix = (list: string[]) => new RegExp(`^\\\\s+(?:${alternation(list)})`, 'i');\n\n// The word being completed: letters, digits, `_`, `-` and the `:` a selector\n// method ends with. Whitespace stays out of it, so a two-word label like `docs\n// generate` cannot stretch the match back across the words before the cursor.\nconst WORD = /[\\w:-]*$/;\n\nconst asOptions = (list: string[], type: string): Completion[] =>\n list.map((label) => ({ label, type }));\n\n// `type` drives the popup icon, so each group carries the one that matches the\n// colour the mode paints it in.\nconst DBT: Completion[] = [{ label: 'dbt', type: 'keyword' }];\nconst COMMAND_OPTIONS = asOptions(COMMANDS, 'keyword');\nconst SUBCOMMAND_OPTIONS: Record<string, Completion[]> = Object.fromEntries(\n Object.entries(SUBCOMMANDS).map(([command, subcommands]) => [\n command,\n asOptions(subcommands, 'keyword'),\n ]),\n);\nconst ARGUMENT_OPTIONS = asOptions(ARGUMENTS, 'variable');\nconst FLAG_OPTIONS = asOptions(FLAGS, 'constant');\nconst METHOD_OPTIONS = asOptions(METHODS, 'property');\n\n// Which slice of the vocabulary the cursor's slot can hold, given the words\n// already finished ahead of it. Offering the whole vocabulary everywhere proposes\n// `dbt` mid-command and a selector method with no selector to attach to.\nconst optionsAfter = (words: string[]): Completion[] => {\n const [step, command, ...rest] = words;\n\n if (step === undefined) return DBT;\n if (step.toLowerCase() !== 'dbt') return [];\n if (command === undefined) return COMMAND_OPTIONS;\n\n const subcommands = SUBCOMMAND_OPTIONS[command.toLowerCase()];\n if (subcommands && rest.length === 0) return subcommands;\n\n // A selector argument takes any number of space-separated values, so what\n // decides the slot is the last argument, not whether a selector appeared at all:\n // `--select tag:a tag:b` keeps offering methods, `--select a --profile p` stops.\n const lastArgument = rest.filter((it) => it.startsWith('-')).at(-1);\n const selecting = lastArgument !== undefined && SELECTORS.includes(lastArgument.toLowerCase());\n\n return selecting\n ? [...ARGUMENT_OPTIONS, ...FLAG_OPTIONS, ...METHOD_OPTIONS]\n : [...ARGUMENT_OPTIONS, ...FLAG_OPTIONS];\n};\n\nconst complete = (context: CompletionContext): CompletionResult | null => {\n const typed = context.matchBefore(WORD);\n\n // `WORD` also matches the empty string, so without this the popup would open on\n // every space. Asking for completions explicitly still opens it there.\n if (!typed?.text && !context.explicit) return null;\n\n const from = typed?.from ?? context.pos;\n const line = context.state.doc.lineAt(from);\n const options = optionsAfter(\n line.text\n .slice(0, from - line.from)\n .split(/\\s+/)\n .filter(Boolean),\n );\n\n return options.length > 0 ? { from, options, validFor: WORD } : null;\n};\n\nexport const dbt = simpleMode({\n languageData: {\n // `toggleComment` is a no-op without these, so Mod-/ silently does nothing.\n commentTokens: { line: '--', block: { open: '/*', close: '*/' } },\n autocomplete: complete,\n },\n start: [\n { regex: /\"(?:[^\\\\]|\\\\.)*?(?:\"|$)/, token: 'string' },\n // Word-bounded, so `dbtX` is not a dbt step whose first word happens to\n // colour — the same thing the completion source asks of it.\n { regex: /dbt\\b/, token: 'keyword', sol: true },\n { regex: word(COMMAND_PHRASES), token: 'keyword' },\n { regex: word(ARGUMENTS), token: 'variableName' },\n { regex: prefix(METHODS), token: 'propertyName' },\n { regex: prefix(FLAGS), token: 'attributeName' },\n { regex: /(?:@|\\*|,|\\+\\d+|\\d+\\+|\\+)/, token: 'operator' },\n { regex: /'.*'/, token: 'string' },\n { regex: /true|false/, token: 'atom' },\n ],\n});\n","import type { StreamParser } from '@codemirror/language';\n\n/**\n * Ported from google/codemirror-mode-jsonnet (Apache-2.0), the mode written by\n * the language's own authors, which was never taken past CodeMirror 5.\n * CodeMirror 5 style names are replaced by their CodeMirror 6 highlight tags:\n * `string-2` is `escape`, `error` is `invalid`.\n *\n * Every pattern is anchored and hoisted. `StringStream.match` slices the rest of\n * the line and, without `^`, scans all of it for a match it then discards unless\n * it started at the cursor — so an unanchored probe costs the whole remaining\n * line, and this tokenizer makes up to twenty of them per token.\n */\n\nconst COMMENT_END = /^\\*\\//;\nconst COMMENT_START = /^\\/\\/|^#/;\nconst C_COMMENT_START = /^\\/\\*/;\nconst TEXT_BLOCK = /^\\|\\|\\|/;\nconst TEXT_BLOCK_END = /^\\s*\\|\\|\\|/;\nconst RAW_DOUBLE = /^\"\"/;\nconst RAW_SINGLE = /^''/;\nconst CLOSE_DOUBLE = /^\"/;\nconst CLOSE_SINGLE = /^'/;\nconst ESCAPE = /^\\\\[\\\\\"'/bfnrt0]/;\nconst UNICODE_ESCAPE = /^\\\\u[0-9a-fA-F]{4}/;\nconst BACKSLASH = /^\\\\/;\nconst IMPORT = /^import(?:str)?\\s*(@?)([\"'])/;\nconst QUOTE = /^(@?)([\"'])/;\nconst ROOT = /^\\$/;\nconst NUMBER = /^(?:\\.\\d+|\\d+\\.?\\d*)(?:e[-+]?\\d+)?/i;\nconst OPERATOR = /^[-+/*=<>!&~^|$%]+/;\nconst IDENTIFIER = /^[a-zA-Z_][a-zA-Z0-9_]*/;\n\nconst KEYWORDS: Record<string, 'keyword' | 'atom'> = {\n local: 'keyword',\n self: 'keyword',\n super: 'keyword',\n assert: 'keyword',\n function: 'keyword',\n if: 'keyword',\n then: 'keyword',\n else: 'keyword',\n for: 'keyword',\n in: 'keyword',\n tailstrict: 'keyword',\n error: 'keyword',\n true: 'atom',\n false: 'atom',\n null: 'atom',\n};\n\ntype State = {\n cComment: boolean;\n textBlock: boolean;\n textBlockIndent: number | null;\n string: boolean;\n importString: boolean;\n stringSingle: boolean;\n stringRaw: boolean;\n};\n\nexport const jsonnet: StreamParser<State> = {\n name: 'jsonnet',\n\n // `toggleComment` is a no-op without these, so Mod-/ silently does nothing.\n languageData: { commentTokens: { line: '//', block: { open: '/*', close: '*/' } } },\n\n startState: () => ({\n cComment: false,\n textBlock: false,\n textBlockIndent: null,\n string: false,\n importString: false,\n stringSingle: false,\n stringRaw: false,\n }),\n\n token: (stream, state) => {\n if (state.cComment) {\n if (stream.match(COMMENT_END)) {\n state.cComment = false;\n return 'comment';\n }\n stream.next();\n return 'comment';\n }\n\n // A `|||` block runs from its own first content line to the first line\n // indented less than that — so the closing `|||` has to be recognised\n // before the indent is measured, or a block closed at column 0 never ends.\n if (state.textBlock) {\n if (state.textBlockIndent == null) {\n if (stream.match(TEXT_BLOCK_END)) {\n state.textBlock = false;\n return 'string';\n }\n state.textBlockIndent = stream.indentation();\n }\n if (stream.indentation() >= state.textBlockIndent) {\n stream.skipToEnd();\n return 'string';\n }\n if (stream.match(TEXT_BLOCK_END)) {\n state.textBlock = false;\n return 'string';\n }\n stream.next();\n return 'invalid';\n }\n\n // Quoted and `@`-raw strings, single or double, plain or after an import.\n if (state.string || state.importString) {\n const style = state.string ? 'string' : 'meta';\n\n if (state.stringRaw) {\n if (stream.match(state.stringSingle ? RAW_SINGLE : RAW_DOUBLE)) return 'escape';\n } else {\n if (stream.match(ESCAPE)) return 'escape';\n if (stream.match(UNICODE_ESCAPE)) return 'escape';\n if (stream.match(BACKSLASH)) return 'invalid';\n }\n\n if (stream.match(state.stringSingle ? CLOSE_SINGLE : CLOSE_DOUBLE)) {\n state.string = false;\n state.importString = false;\n return style;\n }\n\n stream.next();\n return style;\n }\n\n if (stream.match(COMMENT_START)) {\n stream.skipToEnd();\n return 'comment';\n }\n if (stream.match(C_COMMENT_START)) {\n state.cComment = true;\n return 'comment';\n }\n\n // An import opens a string that is styled as meta rather than as content.\n const imported = stream.match(IMPORT);\n if (Array.isArray(imported)) {\n state.importString = true;\n state.stringRaw = imported[1] === '@';\n state.stringSingle = imported[2] === \"'\";\n return 'meta';\n }\n\n const quoted = stream.match(QUOTE);\n if (Array.isArray(quoted)) {\n state.string = true;\n state.stringRaw = quoted[1] === '@';\n state.stringSingle = quoted[2] === \"'\";\n return 'string';\n }\n\n if (stream.match(TEXT_BLOCK)) {\n state.textBlock = true;\n state.textBlockIndent = null;\n return 'string';\n }\n\n if (stream.match(ROOT)) return 'keyword';\n if (stream.match(NUMBER)) return 'number';\n if (stream.match(OPERATOR)) return 'operator';\n\n // Consumed whole so that a keyword's prefix (`locally`) is not styled.\n const identifier = stream.match(IDENTIFIER);\n if (Array.isArray(identifier)) return KEYWORDS[identifier[0]] ?? null;\n\n stream.next();\n return null;\n },\n};\n","import { useSyncExternalStore } from 'react';\nimport { type Extension } from '@codemirror/state';\n\n/**\n * CodeMirror themes are plain objects handed to CodeMirror at build time — they\n * cannot reference CSS custom properties the way a Tailwind class can. To let the\n * in-editor chrome (surface, gutter, selection, read-only wash) re-skin with the\n * active brand and light/dark mode, we resolve the live `--*` values at\n * theme-build time and feed the resulting `rgb()` strings into the theme.\n *\n * Mirrors `MermaidDiagram.resolvePrimary()`: SSR/no-document guard, read the\n * space-separated RGB channels off `<html>`, fall back to a literal when the\n * variable is absent, and wrap in `rgb(...)`.\n */\nexport const resolveToken = (token: string, fallbackChannels: string, alpha?: number): string => {\n const channels =\n typeof document === 'undefined'\n ? fallbackChannels\n : getComputedStyle(document.documentElement).getPropertyValue(`--${token}`).trim() ||\n fallbackChannels;\n return alpha === undefined ? `rgb(${channels})` : `rgb(${channels} / ${alpha})`;\n};\n\nconst SSR_SIGNAL = 'ssr';\n\n// Both axes that change the resolved `--*` values live as attributes on\n// `<html>` (see ThemeProvider): `data-theme` (light/dark) and `data-brand`.\nconst readThemeSignal = (): string => {\n if (typeof document === 'undefined') return SSR_SIGNAL;\n const root = document.documentElement;\n return `${root.getAttribute('data-theme') ?? ''}:${root.getAttribute('data-brand') ?? ''}`;\n};\n\nconst subscribeThemeSignal = (onChange: () => void): (() => void) => {\n if (typeof document === 'undefined') return () => {};\n const observer = new MutationObserver(onChange);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'data-brand'],\n });\n return () => observer.disconnect();\n};\n\n// Deliberately reads `<html>` attributes rather than `useColorScheme()` /\n// `useTheme()`: the editors must re-skin even when rendered without a\n// `ThemeProvider` (matching MermaidDiagram), and a DOM subscription is the only\n// provider-independent source of the light/dark + brand signal.\nconst useThemeSignal = (): string =>\n useSyncExternalStore(subscribeThemeSignal, readThemeSignal, () => SSR_SIGNAL);\n\n// Cached across component instances, not just across renders. A CodeMirror theme\n// extension carries its own StyleModule, and mounting an EditorView appends its\n// rules to a document-level stylesheet — which invalidates style for the whole\n// document. Sharing one module per theme keeps the stylesheet a constant size no\n// matter how many editors mount.\nconst themeCache = new Map<string, Extension>();\n\n/**\n * Memoize a CodeMirror theme/extension built from `resolveToken`, shared across\n * every instance that passes the same `cacheKey` and rebuilt whenever the active\n * brand / light-dark mode changes. `build` reads live `--*` values off\n * `<html>`, so the theme signal is an invisible dependency a deps array can't see.\n *\n * `cacheKey` is the extension's full identity: anything the builder closes over\n * must be part of it (e.g. `` `merge-pane:${deleted}` ``), or instances built\n * from different inputs would share one theme.\n */\nexport const useThemedExtension = (cacheKey: string, build: () => Extension): Extension => {\n const themeSignal = useThemeSignal();\n const key = `${themeSignal} ${cacheKey}`;\n\n // The module-level cache is the memo; reading and filling it during render is\n // idempotent and keyed only on values already stable for the render.\n let cached = themeCache.get(key);\n if (!cached) {\n cached = build();\n themeCache.set(key, cached);\n }\n\n return cached;\n};\n","import { javascript } from '@codemirror/lang-javascript';\nimport { json } from '@codemirror/lang-json';\nimport { python } from '@codemirror/lang-python';\nimport { MSSQL, MySQL, PLSQL, PostgreSQL, sql } from '@codemirror/lang-sql';\nimport { StreamLanguage } from '@codemirror/language';\nimport { r } from '@codemirror/legacy-modes/mode/r';\nimport { shell } from '@codemirror/legacy-modes/mode/shell';\nimport { toml } from '@codemirror/legacy-modes/mode/toml';\nimport { githubLightInit } from '@uiw/codemirror-theme-github';\nimport type { BasicSetupOptions } from '@uiw/react-codemirror';\n\nimport { getSqlDialect } from '@keboola/codemirror-lang-sql';\nimport colors from '@keboola/tailwind-config/colors';\n\nimport { dbt } from './modes/dbt';\nimport { jsonnet } from './modes/jsonnet';\nimport { resolveToken } from './tokenTheme';\n\n// The MIME vocabulary callers pass. Kept as a const so the runtime whitelist and\n// the type stay one list — an annotated `LANGUAGE_MODE[]` copy elsewhere silently\n// drifts, since the type checker accepts a short one.\nexport const LANGUAGE_MODES = [\n 'application/json',\n 'text/plain',\n 'text/x-python',\n 'text/x-sql',\n 'text/x-mysql',\n 'text/x-pgsql',\n 'text/x-mssql',\n // Snowflake, under a historical name — these strings are a published prop contract.\n 'text/x-sfsql',\n 'text/x-plsql',\n 'text/x-rsrc',\n 'text/x-sh',\n 'text/x-toml',\n 'text/jsonnet',\n 'text/x-dbt',\n 'text/javascript',\n 'text/typescript',\n] as const;\n\nexport type LANGUAGE_MODE = (typeof LANGUAGE_MODES)[number];\n\nexport const isLanguageMode = (mode: string): mode is LANGUAGE_MODE =>\n (LANGUAGE_MODES as readonly string[]).includes(mode);\n\n// Chrome surfaces (selection, read-only wash) resolve from live `--*`\n// tokens so they re-skin with brand + dark mode; diff/syntax colors below stay\n// categorical (fixed across brands). Fallback channels mirror the light-mode\n// token values for SSR / no-provider parity.\nexport const buildBaseThemeStyles = () => ({\n '*': { lineHeight: '20px' },\n '*::selection': {\n backgroundColor: resolveToken('primary', '31 143 255'),\n color: `${resolveToken('primary-foreground', '255 255 255')} !important`,\n },\n '&.cm-editor:has(.cm-content[contenteditable=\"false\"])': {\n backgroundColor: resolveToken('secondary', '226 232 240'),\n },\n '&.cm-editor:has(.cm-content[contenteditable=\"false\"]) .cm-gutters': {\n backgroundColor: resolveToken('border', '229 231 235'),\n },\n '&.cm-editor .cm-scroller': { overflowAnchor: 'none' },\n '&.cm-editor, &.cm-editor .cm-scroller': {\n minHeight: '100%',\n flexGrow: 1,\n alignItems: 'stretch !important',\n outline: 'none',\n },\n '.cm-gutter.cm-foldGutter': { display: 'none !important' },\n '.cm-gutter.cm-lineNumbers': { paddingLeft: '20px', paddingRight: '6px' },\n '.cm-gutters': { height: 'auto' },\n\n // tokens overrides\n '.cm-line .tok-string': { color: colors.warning[700] },\n\n // merge (diff) view\n '&[class*=\"cm-merge-\"] .cm-deletedLine': { backgroundColor: colors.error[100] },\n '&[class*=\"cm-merge-\"] .cm-changedLine': { backgroundColor: colors.green[100] },\n '&[class*=\"cm-merge-\"] .cm-deletedLineGutter': { backgroundColor: colors.error[200] },\n '&[class*=\"cm-merge-\"] .cm-changedLineGutter': { backgroundColor: colors.green[200] },\n '&[class*=\"cm-merge-\"] .cm-deletedText': { background: colors.error[200] },\n '&[class*=\"cm-merge-\"] .cm-changedText': { background: colors.green[200] },\n '&[class*=\"cm-merge-\"]': {\n backgroundColor: `${colors.white} !important`,\n },\n '&[class*=\"cm-merge-\"] .cm-gutters': {\n backgroundColor: `${colors.white} !important`,\n },\n '.cm-changeGutter': { position: 'absolute', zIndex: -1, width: '100%', paddingLeft: 0 },\n '&[class*=\"cm-merge-\"] .cm-changedLine,&[class*=\"cm-merge-\"] .cm-line, &[class*=\"cm-merge-\"] .cm-deletedChunk':\n { paddingLeft: 0 },\n});\n\n// Dead whatever the editor does with them: `buildBaseThemeStyles` hides the fold\n// gutter outright, and `buildCustomTheme` paints the active line transparent.\nconst ALWAYS_OFF = {\n drawSelection: false,\n foldGutter: false,\n foldKeymap: false,\n highlightActiveLine: false,\n highlightActiveLineGutter: false,\n} as const;\n\n// `basicSetup` enables everything it is not told to skip, so a viewer would\n// otherwise install bracket closing and keybindings for commands a read-only\n// document rejects. Search stays — Mod-f is useful on a viewer. Same reasoning\n// as `shouldLintJson` below.\n//\n// `history` stays too, though a viewer can never add an entry: a caller that\n// flips `readOnly` mid-session reconfigures the view, and a reconfigure discards\n// state fields the new configuration doesn't have. Leaving it out saves nothing\n// and costs the editable session its undo stack.\n//\n// Autocompletion is absent here on purpose: `CodeEditor` installs its own\n// `autocompletion()` extension, which is appended after this object and would\n// re-add the plugin and its keymap. It gates that call on `readOnly` instead.\nexport const buildBasicSetup = (readOnly: boolean): BasicSetupOptions => ({\n ...ALWAYS_OFF,\n ...(readOnly\n ? {\n closeBrackets: false,\n closeBracketsKeymap: false,\n lintKeymap: false,\n indentOnInput: false,\n rectangularSelection: false,\n dropCursor: false,\n highlightSelectionMatches: false,\n }\n : null),\n});\n\n// Editor surface + gutter resolve from live `--*` tokens; the github\n// syntax palette stays categorical. Fallback channels mirror the light-mode\n// token values. `foreground` / `gutterForeground` pair the token-driven\n// surfaces with token-driven text so line content and line numbers stay\n// readable when the background goes dark (e.g. standalone, no surrounding\n// `tw:text-foreground`).\nexport const buildCustomTheme = () =>\n githubLightInit({\n settings: {\n fontFamily: `'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New'`,\n background: resolveToken('background', '249 250 251'),\n foreground: resolveToken('foreground', '30 41 59'),\n gutterBackground: resolveToken('muted', '241 245 249'),\n gutterForeground: resolveToken('muted-foreground', '100 116 139'),\n gutterBorder: 'transparent',\n lineHighlight: 'transparent',\n selection: resolveToken('primary', '31 143 255'),\n },\n });\n\nexport const getLanguageMode = (mode?: LANGUAGE_MODE) => {\n switch (mode) {\n case undefined:\n case 'application/json':\n return json();\n case 'text/x-python':\n return python();\n case 'text/x-sql':\n return sql({ upperCaseKeywords: true });\n case 'text/x-mysql':\n return sql({ upperCaseKeywords: true, dialect: MySQL });\n case 'text/x-pgsql':\n return sql({ upperCaseKeywords: true, dialect: PostgreSQL });\n case 'text/x-mssql':\n return sql({ upperCaseKeywords: true, dialect: MSSQL });\n case 'text/x-sfsql':\n return sql({ upperCaseKeywords: true, dialect: getSqlDialect('snowflake') });\n case 'text/x-plsql':\n return sql({ upperCaseKeywords: true, dialect: PLSQL });\n case 'text/x-rsrc':\n return StreamLanguage.define(r);\n case 'text/x-sh':\n return StreamLanguage.define(shell);\n case 'text/x-toml':\n return StreamLanguage.define(toml);\n case 'text/jsonnet':\n return StreamLanguage.define(jsonnet);\n case 'text/x-dbt':\n return StreamLanguage.define(dbt);\n case 'text/javascript':\n return javascript({ jsx: true });\n case 'text/typescript':\n return javascript({ jsx: true, typescript: true });\n // No language — `text/plain` lands here, and so does any mode added to\n // LANGUAGE_MODES without an arm above. Unstyled text is the safe degradation;\n // a `json()` default would colour unrelated content as if it were JSON.\n default:\n return [];\n }\n};\n\n// The JSON parse linter is only useful on an editable editor — a read-only one\n// can't act on the errors, so running it is wasted work and its underlines are\n// noise (e.g. non-strict JSON shown read-only in Kai chat).\nexport const shouldLintJson = (mode: LANGUAGE_MODE | undefined, readOnly: boolean): boolean =>\n mode === 'application/json' && !readOnly;\n","import { StateEffect, StateField, type Text } from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n ViewPlugin,\n type ViewUpdate,\n} from '@codemirror/view';\n\nimport colors from '@keboola/tailwind-config/colors';\n\nimport { escapeStringRegexp } from '../../utils/escapeStringRegexp';\n\n// Represents a single search match in the editor\ntype SearchMatch = {\n /** Start position in document */\n from: number;\n /** End position in document */\n to: number;\n /** Text content of the match */\n text: string;\n /** Local match index within this editor (0-based) */\n localIndex: number;\n};\n\n// Effect to update search state\nconst setSearchEffect = StateEffect.define<{\n query: string;\n selectedMatchIndex?: number;\n}>();\n\n// State to track current search matches\ntype SearchState = {\n query: string;\n selectedMatchIndex?: number;\n matches: SearchMatch[];\n decorations: DecorationSet;\n};\n\n// Find all matches in the document\nfunction findMatches(doc: Text, query: string): SearchMatch[] {\n if (!query) return [];\n\n const text = doc.toString();\n\n try {\n const regex = new RegExp(escapeStringRegexp(query), 'gi');\n\n return Array.from(text.matchAll(regex)).map((match, index) => {\n const from = match.index!;\n const to = from + match[0].length;\n\n return { from, to, text: match[0], localIndex: index };\n });\n } catch (e) {\n // Invalid regex - return no matches\n console.warn('Invalid search regex:', e);\n return [];\n }\n}\n\n// Create decorations for search matches\nfunction createDecorations(matches: SearchMatch[], selectedLocalIndex?: number): DecorationSet {\n const decorations = matches.map((match) => {\n const isSelected = match.localIndex === selectedLocalIndex;\n\n const decoration = Decoration.mark({\n class: isSelected ? 'cm-searchMatch-selected' : 'cm-searchMatch',\n });\n\n return decoration.range(match.from, match.to);\n });\n\n return Decoration.set(decorations, true);\n}\n\n// StateField to manage search state\nconst searchField = StateField.define<SearchState>({\n create() {\n return {\n query: '',\n selectedMatchIndex: undefined,\n matches: [],\n decorations: Decoration.none,\n };\n },\n\n update(state, tr) {\n let newState = state;\n\n // Handle search effect\n for (const effect of tr.effects) {\n if (!effect.is(setSearchEffect)) {\n continue;\n }\n\n const { query, selectedMatchIndex } = effect.value;\n\n // Find matches\n const matches = findMatches(tr.state.doc, query);\n\n // Create decorations\n const decorations = createDecorations(matches, selectedMatchIndex);\n\n newState = {\n query,\n selectedMatchIndex,\n matches,\n decorations,\n };\n }\n\n // Map decorations through document changes\n if (tr.docChanged && newState.query) {\n const matches = findMatches(tr.state.doc, newState.query);\n const decorations = createDecorations(matches, newState.selectedMatchIndex);\n\n newState = {\n ...newState,\n matches,\n decorations,\n };\n }\n\n return newState;\n },\n\n provide: (field) => EditorView.decorations.from(field, (state) => state.decorations),\n});\n\n// View plugin to handle scrolling to selected match\nconst searchViewPlugin = ViewPlugin.fromClass(\n class {\n private lastSelectedIndex?: number;\n\n update(update: ViewUpdate) {\n const state = update.state.field(searchField);\n\n // Scroll to selected match when it changes\n if (\n state.selectedMatchIndex !== undefined &&\n state.selectedMatchIndex !== this.lastSelectedIndex\n ) {\n const match = state.matches[state.selectedMatchIndex];\n\n if (match) {\n requestAnimationFrame(() => {\n update.view.dispatch({\n effects: EditorView.scrollIntoView(match.from, { y: 'center' }),\n });\n });\n }\n\n this.lastSelectedIndex = state.selectedMatchIndex;\n }\n\n // Reset if no selection\n if (state.selectedMatchIndex === undefined) {\n this.lastSelectedIndex = undefined;\n }\n }\n },\n);\n\nconst searchTheme = EditorView.baseTheme({\n '.cm-searchMatch': {\n backgroundColor: colors.blue[100],\n },\n '.cm-searchMatch > span': {\n color: `${colors.blue[600]} !important`,\n },\n '.cm-searchMatch-selected': {\n backgroundColor: colors.blue[600],\n },\n '.cm-searchMatch-selected > span': {\n color: `${colors.white} !important`,\n },\n});\n\nexport function searchExtension() {\n return [searchField, searchViewPlugin, searchTheme];\n}\n\nexport function updateSearch(view: EditorView, query: string, selectedMatchIndex?: number) {\n view.dispatch({ effects: setSearchEffect.of({ query, selectedMatchIndex }) });\n}\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'span'>;\n\nexport const KbdSeparator = ({ className, ...props }: Props) => (\n <span {...props} className={cn('tw:text-xs tw:text-muted-foreground', className)} />\n);\n","import { Children, Fragment } from 'react';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\nimport { KbdSeparator } from './KbdSeparator';\n\ntype Props = { separator?: string } & ComponentProps<'kbd'>;\n\nexport const KbdGroup = ({ ref, className, children, separator, ...props }: Props) => {\n return (\n <kbd\n {...props}\n ref={ref}\n className={cn('tw:inline-flex', 'tw:items-center', 'tw:gap-1', className)}\n >\n {separator\n ? // oxlint-disable-next-line react-x/no-children-to-array\n Children.toArray(children).map((child, index) => (\n // oxlint-disable-next-line\n <Fragment key={index}>\n {index > 0 && <KbdSeparator>{separator}</KbdSeparator>}\n {child}\n </Fragment>\n ))\n : children}\n </kbd>\n );\n};\n","import { cva } from 'class-variance-authority';\n\nexport const kbdVariants = cva(\n [\n 'tailwindcss-preflight',\n // style\n 'tw:pointer-events-none',\n 'tw:w-fit',\n 'tw:h-5',\n 'tw:min-w-5',\n\n // layout\n 'tw:inline-flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:gap-1',\n 'tw:shrink-0',\n\n // spacing\n 'tw:px-1',\n 'tw:[&_svg:not([class*=\"size-\"])]:size-2.5',\n\n 'tw:text-xs',\n 'tw:font-medium',\n\n 'tw:rounded',\n ],\n {\n defaultVariants: {\n variant: 'default',\n },\n variants: {\n variant: {\n default: 'tw:bg-muted tw:text-muted-foreground',\n primary: 'tw:bg-white/20 tw:text-white',\n },\n },\n },\n);\n","import type { ComponentProps } from 'react';\nimport type { VariantProps } from 'class-variance-authority';\n\nimport { KbdGroup } from './KbdGroup';\nimport { KbdSeparator } from './KbdSeparator';\nimport { kbdVariants } from './styles';\n\ntype Props = ComponentProps<'kbd'> & VariantProps<typeof kbdVariants>;\n\nexport const Kbd = ({ children, className, variant, ...rest }: Props) => (\n <kbd {...rest} className={kbdVariants({ className, variant })}>\n {children}\n </kbd>\n);\n\nKbd.Group = KbdGroup;\nKbd.Separator = KbdSeparator;\n","import { isMac } from '../../utils';\nimport { Kbd } from '../Kbd';\n\nexport const ToggleComponentHelp = () => (\n <div>\n Use <Kbd>{isMac ? 'Command+/' : 'Ctrl+/'}</Kbd> to toggle comments.\n </div>\n);\n","import { useMemo } from 'react';\nimport { Compartment, type Extension } from '@codemirror/state';\nimport { tooltips, ViewPlugin } from '@codemirror/view';\n\n// A `position: fixed` box is laid out against the viewport — and so escapes\n// every scroll container above it — only while no ancestor claims the job of\n// being its containing block. This encodes the CSS rule for who claims it\n// rather than the subset this repo happens to use today; `contain` and\n// `will-change` take value lists, so those two are matched loosely.\n//\n// `content-visibility` is absent on purpose: it implies containment without\n// saying so through `contain`, and it is handled below as a clipper — which is\n// the stronger of the two properties for our purposes.\nconst establishesFixedContainingBlock = (style: CSSStyleDeclaration) =>\n style.transform !== 'none' ||\n style.translate !== 'none' ||\n style.rotate !== 'none' ||\n style.scale !== 'none' ||\n style.perspective !== 'none' ||\n style.filter !== 'none' ||\n style.backdropFilter !== 'none' ||\n /\\b(paint|layout|strict|content)\\b/.test(style.contain) ||\n /\\b(transform|perspective|filter|contain)\\b/.test(style.willChange);\n\n// Crops its content, so hosting the tooltip inside it would not help. Paint\n// containment — which `content-visibility: auto` turns on without ever showing\n// up in computed `contain` — crops even a fixed-position descendant, and so\n// does a mask.\nconst crops = (style: CSSStyleDeclaration) =>\n style.overflowX !== 'visible' ||\n style.overflowY !== 'visible' ||\n style.maskImage !== 'none' ||\n style.contentVisibility !== 'visible' ||\n /\\b(paint|strict|content)\\b/.test(style.contain);\n\n/**\n * Where a tooltip can hang without being cropped, or `null` for \"wherever\n * CodeMirror would put it anyway\".\n *\n * Two ancestors matter, and they are not the same ancestor. The **outermost\n * cropper** is the one to get above — landing anywhere below it leaves the\n * tooltip inside the box doing the cropping. The **containing block** is where\n * the search can stop, because from there upwards `position: fixed` is measured\n * against that element and nothing higher can crop it.\n *\n * `document.body` and `<html>` are not treated as croppers: a fixed box whose\n * containing block is the viewport is not clipped by their overflow, and\n * hosting outside `<body>` would drop the tooltip out of the app's stacking and\n * pointer-events scope for no gain.\n */\nconst findTooltipHost = (from: HTMLElement) => {\n let outermostCropper: HTMLElement | null = null;\n\n for (let node = from.parentElement; node && node !== document.body; node = node.parentElement) {\n const style = getComputedStyle(node);\n\n if (crops(style)) {\n outermostCropper = node;\n } else if (establishesFixedContainingBlock(style)) {\n return outermostCropper?.parentElement ?? node;\n }\n }\n\n return outermostCropper?.parentElement ?? null;\n};\n\n/**\n * `tooltips()`, re-hosted so the completion popup is never cropped.\n *\n * CodeMirror hangs tooltips inside the editor and lets `position: fixed` carry\n * them past its edges. That holds only while the viewport is their containing\n * block — a modal centred with a translate, a sheet sliding in, or a box under\n * paint containment takes that job, and then every scroller, mask and contained\n * box in between crops the popup instead. A tall editor hides the damage; a\n * one-line one shows a sliver of an unreadable list.\n *\n * The two shapes this has to survive in production are a `Modal`, whose body\n * scrolls and carries the argo fade mask, and kbc-ui's SQL editor, which wraps\n * every code block in `content-visibility: auto` to keep long scripts cheap.\n *\n * Hosting the layer above the outermost cropper clears all of that while keeping\n * the popup inside the modal's stacking, focus and pointer-events scope — which\n * `document.body` would not: the popup would sit behind the modal, and Radix\n * leaves the body `pointer-events: none` while a dialog is open.\n *\n * Both editors install this, and it is the only place either of them configures\n * a tooltip host. Keep it that way: CodeMirror's tooltip config takes the first\n * contributor that names a parent, so a second mechanism would not compose with\n * this one — it would silently win or lose on extension order.\n */\nconst tooltipsExtension = (): Extension => {\n // The resolved host lives in a compartment, not in an appended config: React\n // hands CodeMirror a new extension array whenever the editor's props move,\n // which dispatches a full reconfigure. That replaces appended config, while\n // compartment contents are carried over.\n const layer = new Compartment();\n\n return [\n layer.of(tooltips()),\n ViewPlugin.define((view) => {\n // Deferred on two counts: a plugin cannot dispatch while the view it\n // belongs to is still being built, and reading computed styles here would\n // force a style and layout flush in the middle of the commit that inserted\n // the editor. The lookup is one-shot — an ancestor that gains a transform\n // afterwards is not picked up.\n const scheduled = setTimeout(() => {\n if (!view.dom.isConnected) return;\n\n const parent = findTooltipHost(view.dom);\n if (parent) view.dispatch({ effects: layer.reconfigure(tooltips({ parent })) });\n });\n\n return { destroy: () => clearTimeout(scheduled) };\n }),\n ];\n};\n\n/**\n * The extension above, built once per editor. Rebuilding it would hand\n * CodeMirror a fresh compartment and plugin on every reconfigure, dropping the\n * host it had already resolved — so it is only ever reached through this hook.\n */\nexport const useTooltipsExtension = () => useMemo(tooltipsExtension, []);\n","import type { Completion, CompletionContext, CompletionSource } from '@codemirror/autocomplete';\n\nimport { useStableCallback } from '../../hooks/useStableCallback';\n\nexport type EditorVariable = { name: string; value?: string };\n\n// Keywords come by the hundred from the language, so a variable would otherwise rank\n// below every one of them that shares a prefix.\nconst BOOST = 2000;\n\n// One brace or two, because `closeBrackets` turns a typed `{` into `{}` and a caret\n// that has only opened the placeholder is still asking for a variable. One charset\n// for the name throughout: a second, narrower one would start the range mid-name on\n// anything it disagreed about, and a range that starts mid-name never matches.\nconst NAME = String.raw`[\\w-]*`;\nconst AT_CARET = new RegExp(String.raw`(?:\\{{1,2} ?)?${NAME}$`);\nconst NAME_AT_END = new RegExp(`${NAME}$`);\nconst OPENING = /\\{{1,2} ?$/;\nconst CLOSING = /^ ?\\}{1,2}/;\n\n/**\n * Completes a mustache-style `{{name}}` placeholder.\n */\nexport const completeVariables = (variables: EditorVariable[] = []): CompletionSource => {\n if (variables.length === 0) return () => null;\n\n const options: Completion[] = variables.map(({ name, value }) => ({\n // The bare name: `SqlEditor` filters prefix-only while `CodeEditor` filters\n // fuzzily, and this is the only spelling both accept whether or not the caret\n // has typed the braces. The braces are `displayLabel`, which is what renders.\n label: name,\n displayLabel: `{{${name}}}`,\n detail: value,\n type: 'variable',\n boost: BOOST,\n apply: (view, completion, from, to) => {\n const { doc } = view.state;\n const line = doc.lineAt(from);\n const insert = `{{${completion.label}}}`;\n\n // The range covers the name alone, so the braces around it are found rather\n // than assumed — `closeBrackets` may have added a closing one nobody typed.\n const opening = OPENING.exec(doc.sliceString(line.from, from));\n const closing = CLOSING.exec(doc.sliceString(to, line.to));\n const start = opening ? from - opening[0].length : from;\n const end = closing ? to + closing[0].length : to;\n\n view.dispatch({\n changes: { from: start, to: end, insert },\n selection: { anchor: start + insert.length },\n });\n },\n }));\n\n return (context: CompletionContext) => {\n const match = context.matchBefore(AT_CARET);\n\n if (!match?.text) return null;\n\n const [name = ''] = NAME_AT_END.exec(match.text) ?? [];\n\n return { from: match.to - name.length, options };\n };\n};\n\n/**\n * The completion source both editors install, with an identity that never moves.\n *\n * Both hold it inside the memo that keys their whole extension tree, and callers\n * build the list inline — a config row mapped to `{ name, value }` in a store\n * selector, so a fresh array arrives on every store push. Because CodeMirror asks\n * the source for options rather than reading them up front, holding it steady costs\n * nothing: a completion request always reaches the latest render's variables.\n */\nexport const useVariableCompletion = (variables: EditorVariable[] = []): CompletionSource =>\n useStableCallback(completeVariables(variables));\n","import { useEffect, useLayoutEffect, useMemo, useRef } from 'react';\nimport type { KeyboardEvent, ReactNode } from 'react';\nimport type { CompletionSource } from '@codemirror/autocomplete';\nimport { autocompletion, completeAnyWord } from '@codemirror/autocomplete';\nimport { jsonParseLinter } from '@codemirror/lang-json';\nimport { linter } from '@codemirror/lint';\nimport { unifiedMergeView } from '@codemirror/merge';\nimport { EditorView, keymap, placeholder as cmPlaceholder } from '@codemirror/view';\nimport CodeMirror, {\n EditorState,\n type Extension,\n type ReactCodeMirrorRef,\n} from '@uiw/react-codemirror';\n\nimport { keyCodes } from '../../constants/keyCodes';\nimport { useStableCallback } from '../../hooks/useStableCallback';\nimport { cn } from '../../utils';\nimport { HelpBlock } from '../HelpBlock';\n\nimport { ButtonToolbar } from './ButtonToolbar';\nimport type { LANGUAGE_MODE } from './helpers';\nimport {\n buildBaseThemeStyles,\n buildBasicSetup,\n buildCustomTheme,\n getLanguageMode,\n shouldLintJson,\n} from './helpers';\nimport { searchExtension, updateSearch } from './search';\nimport { ToggleComponentHelp } from './ToggleComponentHelp';\nimport { useThemedExtension } from './tokenTheme';\nimport { useTooltipsExtension } from './tooltips';\nimport { type EditorVariable, useVariableCompletion } from './variableCompletion';\n\ntype Props = {\n value: string;\n previousValue?: string;\n mode?: LANGUAGE_MODE;\n placeholder?: string;\n /** Names the editable region for screen readers — the editor has no visible label of its own. */\n ariaLabel?: string;\n /**\n * Highlights every occurrence and scrolls the selected one into view. The find\n * UI is the caller's — pass the query it holds, and omit both props entirely to\n * leave the search extension uninstalled.\n */\n searchQuery?: string;\n searchMatchIndex?: number;\n readOnly?: boolean;\n /**\n * Refuses edits while leaving the editor looking and behaving as it did — for a\n * transient lock such as an in-flight save, where a keystroke landing mid-request\n * would be overwritten by the response. `readOnly` is the wrong prop for that:\n * it turns the editor into a viewer, greying the surface and taking the lint\n * marks and completions with it.\n */\n inputLocked?: boolean;\n /**\n * A flat list of completions, offered everywhere in the document. One word per\n * label: CodeMirror derives the pattern for the word being completed from the\n * labels' characters, so a space in one widens it across whitespace and the\n * editor offers nothing past the first word of a line. A phrase belongs in\n * `completionSource`.\n *\n * Compared by identity, like `completionSource` — hand the editor a stable array.\n */\n autocompletions?: string[];\n /**\n * Completions that depend on where the cursor is — a column list offered only\n * after its table, say. Wins over both `autocompletions` and `completeAny`,\n * which stay the right props for a list that is the same everywhere in the\n * document and for having no list at all. Like them, it opens on typing.\n *\n * Compared by identity: build it in a `useMemo` or the editor rebuilds its whole\n * extension tree on every render.\n */\n completionSource?: CompletionSource;\n /**\n * Configuration variables, completed into `{{name}}`. Independent of\n * `completionSource`: both are offered, so a caller keeps its own completions and\n * gets variables spelled the way the rest of the platform writes them.\n */\n variables?: EditorVariable[];\n extraKeys?: Record<string, () => void>;\n withToggleCommentHint?: boolean;\n withAutofocus?: boolean;\n withLineNumbers?: boolean;\n withLineWrapping?: boolean;\n withCollapseUnchanged?: boolean;\n withCopyButton?: boolean;\n completeAny?: boolean;\n help?: ReactNode;\n helpPostfix?: ReactNode;\n renderAdditionalButtons?: (value?: string) => ReactNode;\n className?: string;\n} & (\n | { readOnly: true; onChange?: never }\n // `boolean` rather than `false`: a field the user's permissions may lock still\n // needs its handler for the case where they can edit.\n | { readOnly?: boolean; onChange: (value: string) => void }\n);\n\nconst emptyObject = {};\n\nexport const CodeEditor = ({\n value,\n previousValue,\n onChange,\n mode = 'application/json',\n placeholder = '',\n ariaLabel,\n searchQuery,\n searchMatchIndex,\n readOnly = false,\n inputLocked = false,\n autocompletions,\n completionSource,\n variables,\n extraKeys = emptyObject,\n withToggleCommentHint = false,\n withAutofocus = false,\n withLineNumbers = true,\n withLineWrapping = true,\n withCollapseUnchanged = false,\n withCopyButton = false,\n completeAny = false,\n help = null,\n helpPostfix = null,\n renderAdditionalButtons,\n className,\n}: Props) => {\n // CodeMirror rebuilds and re-resolves the whole extension tree whenever the\n // change handler's identity moves, and callers pass inline arrows.\n const handleChange = useStableCallback((next: string) => onChange?.(next));\n\n // Themes re-resolve their `--*` tokens on brand / light-dark change. The\n // syntax palette is keyed without a component prefix so `SqlEditor` — which\n // builds it from the same `buildCustomTheme` — shares this one module.\n // Presence, not truthiness: a caller that searches always passes the prop, so\n // the extension set stays stable while the query changes.\n const withSearch = searchQuery !== undefined;\n const editorRef = useRef<ReactCodeMirrorRef>(null);\n\n useEffect(() => {\n const view = editorRef.current?.view;\n if (view && withSearch) updateSearch(view, searchQuery, searchMatchIndex);\n }, [withSearch, searchQuery, searchMatchIndex]);\n\n // A view created while a query is already set — a remount, a tab switch —\n // starts with no highlights unless the search is applied as it is built.\n const handleCreateEditor = useStableCallback((view: EditorView) => {\n if (searchQuery) updateSearch(view, searchQuery, searchMatchIndex);\n });\n\n // Same reasoning as `onChange` above, one level out: callers build this object\n // inline, so keying the extensions on it would reconfigure the editor on every\n // parent render. Only the set of bound keys can change what the keymap *is* —\n // the handlers behind them are read when the key is actually pressed.\n const extraKeysRef = useRef(extraKeys);\n useLayoutEffect(() => {\n extraKeysRef.current = extraKeys;\n });\n\n const boundKeysSignature = Object.keys(extraKeys).join('\\n');\n const boundKeys = useMemo(\n () => boundKeysSignature.split('\\n').filter(Boolean),\n [boundKeysSignature],\n );\n\n const tooltipLayer = useTooltipsExtension();\n\n // `languageData.of` takes a function CodeMirror calls per completion request, so\n // the source is built here rather than inside it — otherwise every keystroke that\n // opens the popup rebuilds an option per variable.\n const variableCompletion = useVariableCompletion(variables);\n\n const customTheme = useThemedExtension('editor:syntax', buildCustomTheme);\n const baseTheme = useThemedExtension('code-editor:chrome', () =>\n EditorView.theme(buildBaseThemeStyles()),\n );\n\n const commonExtensions: Extension[] = useMemo(() => {\n const callerCompletions =\n completionSource ??\n (completeAny ? completeAnyWord : autocompletions?.length ? autocompletions : null);\n\n // An empty list is left out: CodeMirror wraps a list in `completeFromList`, which\n // answers an empty result rather than none, so the editor would run a source that\n // can never match on every keystroke.\n const completionEntries = [\n ...(callerCompletions ? [{ autocomplete: callerCompletions }] : []),\n { autocomplete: variableCompletion },\n ];\n\n return [\n getLanguageMode(mode),\n shouldLintJson(mode, readOnly) ? linter(jsonParseLinter()) : [],\n withLineWrapping ? EditorView.lineWrapping : [],\n EditorState.languageData.of(() => completionEntries),\n keymap.of(\n boundKeys.map((key) => ({\n key,\n run: () => {\n extraKeysRef.current[key]?.();\n return true;\n },\n })),\n ),\n readOnly\n ? []\n : [\n // CodeMirror's own default. Gating it on the props hid completions the\n // *language* supplies — dbt's vocabulary, Snowflake's keywords — behind\n // a shortcut, and macOS leaves no usable one. With nothing to offer, no\n // popup opens anyway.\n autocompletion(),\n ],\n ariaLabel ? EditorView.contentAttributes.of({ 'aria-label': ariaLabel }) : [],\n withSearch ? searchExtension() : [],\n tooltipLayer,\n baseTheme,\n ];\n }, [\n autocompletions,\n completionSource,\n variableCompletion,\n completeAny,\n boundKeys,\n mode,\n readOnly,\n withLineWrapping,\n baseTheme,\n ariaLabel,\n withSearch,\n tooltipLayer,\n ]);\n\n const extensions = useMemo(() => {\n return [\n ...commonExtensions,\n cmPlaceholder(placeholder),\n EditorView.editable.of(!readOnly),\n // The lock is this facet and nothing else. `contenteditable` is what the\n // read-only wash keys off, and `basicSetup` is what holds the undo history,\n // so leaving both alone is what makes the lock invisible.\n EditorState.readOnly.of(readOnly || inputLocked),\n previousValue\n ? unifiedMergeView({\n original: previousValue,\n mergeControls: false,\n highlightChanges: false,\n collapseUnchanged: withCollapseUnchanged ? {} : undefined,\n })\n : [],\n ];\n }, [commonExtensions, placeholder, readOnly, inputLocked, previousValue, withCollapseUnchanged]);\n\n const config = useMemo(() => {\n return {\n ...buildBasicSetup(readOnly),\n lineNumbers: withLineNumbers,\n // Mod-f opens CodeMirror's own panel, which would run a second query and a\n // second match count over the same document beside the caller's input.\n ...(withSearch ? { searchKeymap: false } : null),\n };\n }, [withLineNumbers, readOnly, withSearch]);\n\n // `ButtonToolbar` renders nothing without content, so keying the reserved space\n // off the props alone would leave a gap above an empty editor. The toolbar is out\n // of flow and translated above the top edge, overhanging it by 32px — a 40px chip\n // shifted up by all but 8px of itself.\n const additionalButtons = renderAdditionalButtons?.(value);\n const hasToolbar = (withCopyButton && !!value) || !!additionalButtons;\n\n return (\n // oxlint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n className={cn(\n 'tw:relative tw:flex tw:min-h-0 tw:flex-col tw:[&_.cm-mergeViewEditor]:overflow-visible tw:[&_.cm-mergeViewEditors]:h-full tw:[&_.cm-mergeView]:h-full tw:[&_>div]:h-full tw:[&_>div]:overflow-auto tw:[&_>div]:bg-background',\n { 'tw:mt-8': hasToolbar },\n className,\n )}\n onKeyDown={(event: KeyboardEvent) => {\n if (event.key === keyCodes.ESCAPE) {\n event.stopPropagation();\n }\n }}\n >\n {hasToolbar && (\n <div className=\"tw:pointer-events-none tw:absolute tw:z-10 tw:flex tw:!h-auto tw:w-full tw:translate-y-[calc(-100%_+_8px)] tw:!overflow-visible tw:!bg-transparent\">\n <div className=\"tw:flex-1\">\n <ButtonToolbar value={withCopyButton ? value : undefined}>\n {additionalButtons}\n </ButtonToolbar>\n </div>\n </div>\n )}\n <CodeMirror\n ref={editorRef}\n onCreateEditor={handleCreateEditor}\n theme={customTheme}\n value={value}\n onChange={handleChange}\n extensions={extensions}\n autoFocus={withAutofocus}\n basicSetup={config}\n />\n {!readOnly && (withToggleCommentHint || help || helpPostfix) && (\n <HelpBlock className=\"tw:mt-2 tw:flex tw:flex-wrap tw:gap-1\">\n {help}\n {withToggleCommentHint ? <ToggleComponentHelp /> : null}\n {helpPostfix}\n </HelpBlock>\n )}\n </div>\n );\n};\n","import type { ChangeSet, Range } from '@codemirror/state';\nimport { Decoration, EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\n\nimport colors from '@keboola/tailwind-config/colors';\n\nconst activeQueryFirstLine = Decoration.line({ class: 'cm-active-query cm-active-query-first' });\nconst activeQueryMiddleLine = Decoration.line({ class: 'cm-active-query' });\nconst activeQueryLastLine = Decoration.line({ class: 'cm-active-query cm-active-query-last' });\nconst activeQuerySingleLine = Decoration.line({\n class: 'cm-active-query cm-active-query-first cm-active-query-last',\n});\n\ntype QueryBoundary = { from: number; to: number };\n\n/**\n * Given pre-computed query boundaries and a cursor position, find which query\n * the cursor is in. Returns trimmed character offsets or null.\n */\nexport const findActiveQueryRange = (\n doc: string,\n cursorPos: number,\n boundaries: QueryBoundary[],\n): { from: number; to: number } | null => {\n if (boundaries.length === 0) return null;\n\n let match: QueryBoundary | undefined = boundaries[boundaries.length - 1];\n for (const boundary of boundaries) {\n if (cursorPos <= boundary.to) {\n match = boundary;\n break;\n }\n }\n\n if (!match) return null;\n\n // Trim leading/trailing whitespace from the query range for tighter boundaries\n const queryText = doc.slice(match.from, match.to);\n const leadingWhitespace = queryText.length - queryText.trimStart().length;\n const trailingWhitespace = queryText.length - queryText.trimEnd().length;\n\n const trimmedStart = match.from + leadingWhitespace;\n const trimmedEnd = match.to - trailingWhitespace;\n\n if (trimmedStart >= trimmedEnd) return null;\n\n return { from: trimmedStart, to: trimmedEnd };\n};\n\n/**\n * Convert splitSqlQueries result (array of query strings that join back to the\n * original doc) into character-offset boundaries.\n */\nconst computeBoundaries = (queries: string[]): QueryBoundary[] => {\n const boundaries: QueryBoundary[] = [];\n let offset = 0;\n for (const query of queries) {\n boundaries.push({ from: offset, to: offset + query.length });\n offset += query.length;\n }\n return boundaries;\n};\n\n/**\n * Synchronously map cached boundaries through a changeset.\n *\n * Boundaries can outlive the document state they were computed from (the async\n * re-parse in `scheduleDocParse` is debounced, so several edits may land\n * before new boundaries are produced). When that happens a cached position\n * can exceed the changeset's pre-change length and `ChangeSet.mapPos` throws\n * `RangeError: Position X is out of range for changeset of length Y`.\n *\n * Clamp positions into the valid `[0, changes.length]` range before mapping\n * and drop degenerate boundaries so the mapping is safe even with stale cache.\n */\nexport const mapBoundariesThroughChanges = (\n boundaries: QueryBoundary[],\n changes: ChangeSet,\n): QueryBoundary[] => {\n const prevLen = changes.length;\n const mapped: QueryBoundary[] = [];\n for (const b of boundaries) {\n const from = changes.mapPos(Math.max(0, Math.min(b.from, prevLen)), -1);\n const to = changes.mapPos(Math.max(0, Math.min(b.to, prevLen)), 1);\n if (from < to) mapped.push({ from, to });\n }\n return mapped;\n};\n\nconst buildDecorations = (view: EditorView, range: { from: number; to: number }) => {\n const startLine = view.state.doc.lineAt(range.from).number;\n const endLine = view.state.doc.lineAt(range.to).number;\n\n const decorations: Range<Decoration>[] = [];\n for (let lineNum = startLine; lineNum <= endLine; lineNum++) {\n const lineStart = view.state.doc.line(lineNum).from;\n if (startLine === endLine) {\n decorations.push(activeQuerySingleLine.range(lineStart));\n } else if (lineNum === startLine) {\n decorations.push(activeQueryFirstLine.range(lineStart));\n } else if (lineNum === endLine) {\n decorations.push(activeQueryLastLine.range(lineStart));\n } else {\n decorations.push(activeQueryMiddleLine.range(lineStart));\n }\n }\n\n return Decoration.set(decorations);\n};\n\nexport const activeQueryHighlight = (splitQueries: (sql: string) => Promise<string[]>) => {\n return [\n ViewPlugin.fromClass(\n class {\n decorations = Decoration.none;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private seq = 0;\n private cachedDoc = '';\n private cachedBoundaries: QueryBoundary[] = [];\n private destroyed = false;\n\n constructor(view: EditorView) {\n this.scheduleDocParse(view);\n }\n\n update(update: ViewUpdate) {\n if (update.focusChanged && !update.view.hasFocus) {\n this.decorations = Decoration.none;\n return;\n }\n\n if (update.docChanged) {\n // Synchronously map cached boundaries through document changes\n // so decorations update immediately without waiting for async re-parse.\n // Positions are clamped inside mapBoundariesThroughChanges because\n // the async re-parse is debounced and boundaries can be stale.\n if (this.cachedBoundaries.length > 0) {\n this.cachedBoundaries = mapBoundariesThroughChanges(\n this.cachedBoundaries,\n update.changes,\n );\n this.cachedDoc = update.state.doc.toString();\n this.updateFromCache(update.view);\n }\n // Still re-parse for accurate boundaries (handles structural changes like new semicolons)\n this.scheduleDocParse(update.view);\n } else if (update.selectionSet || (update.focusChanged && update.view.hasFocus)) {\n this.updateFromCache(update.view);\n }\n }\n\n destroy() {\n this.destroyed = true;\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n }\n\n /**\n * Update decorations using cached query boundaries.\n * Only mutates this.decorations — does NOT call view.dispatch().\n * When called from update() (sync), CodeMirror picks up the new\n * decorations via the accessor. When called from the async\n * scheduleDocParse callback, the caller must dispatch separately.\n */\n private updateFromCache(view: EditorView) {\n if (!view.hasFocus) {\n this.decorations = Decoration.none;\n return;\n }\n\n const { main } = view.state.selection;\n\n if (main.from !== main.to) {\n // User has text selected — hide highlight\n this.decorations = Decoration.none;\n return;\n }\n\n const doc = view.state.doc.toString();\n if (doc !== this.cachedDoc) return;\n if (this.cachedBoundaries.length === 0) {\n this.decorations = Decoration.none;\n return;\n }\n\n const range = findActiveQueryRange(doc, main.head, this.cachedBoundaries);\n this.decorations = range ? buildDecorations(view, range) : Decoration.none;\n }\n\n /** Parse queries async (debounced) and update decorations. */\n private scheduleDocParse(view: EditorView) {\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n\n this.debounceTimer = setTimeout(async () => {\n const seq = ++this.seq;\n const doc = view.state.doc.toString();\n\n if (!doc.trim()) {\n this.cachedDoc = doc;\n this.cachedBoundaries = [];\n if (this.decorations !== Decoration.none) {\n this.decorations = Decoration.none;\n if (!this.destroyed) view.dispatch();\n }\n return;\n }\n\n let queries: string[];\n try {\n queries = await splitQueries(doc);\n } catch {\n return;\n }\n\n // Discard stale results\n if (this.destroyed || seq !== this.seq) return;\n\n this.cachedDoc = doc;\n this.cachedBoundaries = computeBoundaries(queries);\n\n this.updateFromCache(view);\n if (!this.destroyed) view.dispatch();\n }, 100);\n }\n },\n { decorations: (v) => v.decorations },\n ),\n EditorView.baseTheme({\n '.cm-active-query': {\n boxShadow: `inset -1px 0 0 0 ${colors.blue[300]}, inset 1px 0 0 0 ${colors.blue[300]}`,\n marginRight: '8px',\n },\n '.cm-active-query-first': {\n 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]}`,\n borderRadius: '4px 4px 0 0',\n },\n '.cm-active-query-last': {\n 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]}`,\n borderRadius: '0 0 4px 4px',\n },\n '.cm-active-query-first.cm-active-query-last': {\n boxShadow: `inset 0 0 0 1px ${colors.blue[300]}`,\n borderRadius: '4px',\n },\n }),\n ];\n};\n","import type { Extension } from '@codemirror/state';\nimport { RangeSet, StateEffect, StateField } from '@codemirror/state';\nimport { Decoration, EditorView, gutter, GutterMarker } from '@codemirror/view';\n\nimport colors from '@keboola/tailwind-config/colors';\n\nexport type HighlightedLines = {\n from: number;\n to: number;\n error?: { from: number; to: number };\n processing?: { from: number; to: number };\n} | null;\n\n// Gutter markers for highlighting\nclass HighlightMarker extends GutterMarker {\n override toDOM() {\n const marker = document.createElement('div');\n marker.className = 'cm-highlight-marker';\n return marker;\n }\n}\n\nconst highlightMarker = new HighlightMarker();\n\n// Helper function to iterate over line range and apply a callback\nconst forEachLineInRange = <T>(\n doc: { lines: number; line: (n: number) => { from: number } },\n from: number,\n to: number,\n callback: (lineFrom: number) => T,\n): T[] => {\n const results: T[] = [];\n\n // Convert 0-based to 1-based for CodeMirror\n const fromLine = Math.max(1, from + 1);\n const toLine = Math.min(doc.lines, to + 1);\n\n for (let i = fromLine; i <= toLine; i++) {\n const line = doc.line(i);\n results.push(callback(line.from));\n }\n\n return results;\n};\n\n// State effect for setting highlighted lines\nconst setHighlightedLinesEffect = StateEffect.define<HighlightedLines>();\n\n// State field for storing highlighted lines info\nconst highlightedLinesField = StateField.define<HighlightedLines>({\n create() {\n return null;\n },\n update(value, transaction) {\n for (const effect of transaction.effects) {\n if (effect.is(setHighlightedLinesEffect)) {\n return effect.value;\n }\n }\n return value;\n },\n});\n\n// Gutter extension that displays highlight markers\nconst highlightGutter = gutter({\n class: 'cm-highlight-gutter',\n markers: (view): RangeSet<GutterMarker> => {\n const highlightInfo = view.state.field(highlightedLinesField, false);\n\n if (!highlightInfo) {\n return RangeSet.empty;\n }\n\n // Add blue markers for all running query lines\n const markers = forEachLineInRange(\n view.state.doc,\n highlightInfo.from,\n highlightInfo.to,\n (lineFrom) => highlightMarker.range(lineFrom),\n );\n\n return RangeSet.of(markers);\n },\n});\n\n// State field for error line background decorations\nconst errorLineDecorations = StateField.define({\n create() {\n return Decoration.none;\n },\n update(decorations, transaction) {\n decorations = decorations.map(transaction.changes);\n for (const effect of transaction.effects) {\n if (!effect.is(setHighlightedLinesEffect)) {\n continue;\n }\n\n if (!effect.value || !effect.value.error) {\n return Decoration.none;\n }\n\n // Add error line background decorations\n const decorationArray = forEachLineInRange(\n transaction.state.doc,\n effect.value.error.from,\n effect.value.error.to,\n (lineFrom) => Decoration.line({ class: 'cm-error-line' }).range(lineFrom),\n );\n\n return Decoration.set(decorationArray);\n }\n return decorations;\n },\n provide: (f) => EditorView.decorations.from(f),\n});\n\n// State field for processing line background decorations\nconst processingLineDecorations = StateField.define({\n create() {\n return Decoration.none;\n },\n update(decorations, transaction) {\n decorations = decorations.map(transaction.changes);\n for (const effect of transaction.effects) {\n if (!effect.is(setHighlightedLinesEffect)) {\n continue;\n }\n\n if (!effect.value || !effect.value.processing) {\n return Decoration.none;\n }\n\n const decorationArray = forEachLineInRange(\n transaction.state.doc,\n effect.value.processing.from,\n effect.value.processing.to,\n (lineFrom) => Decoration.line({ class: 'cm-processing-line' }).range(lineFrom),\n );\n\n return Decoration.set(decorationArray);\n }\n return decorations;\n },\n provide: (f) => EditorView.decorations.from(f),\n});\n\n// Theme for highlighted lines\nconst highlightedLinesTheme = EditorView.baseTheme({\n '.cm-highlight-gutter': {\n width: '2px',\n marginRight: '2px',\n },\n '.cm-highlight-marker': {\n width: '2px',\n height: '100%',\n backgroundColor: colors.blue[500],\n },\n '.cm-error-line': {\n backgroundColor: `${colors.error[100]} !important`,\n },\n '.cm-processing-line': {\n backgroundColor: `${colors.blue[100]} !important`,\n },\n});\n\n// Install highlight lines extension\nexport function highlightingExtension(): Extension[] {\n return [\n highlightedLinesField,\n highlightGutter,\n errorLineDecorations,\n processingLineDecorations,\n highlightedLinesTheme,\n ];\n}\n\nexport function updateHighlighting(view: EditorView, lines?: HighlightedLines) {\n view.dispatch({ effects: setHighlightedLinesEffect.of(lines ?? null) });\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport { defaultKeymap } from '@codemirror/commands';\nimport type { SQLNamespace } from '@codemirror/lang-sql';\nimport type {\n EditorState,\n KeyBinding,\n ReactCodeMirrorRef,\n ViewUpdate,\n} from '@uiw/react-codemirror';\nimport CodeMirror, { EditorView, keymap } from '@uiw/react-codemirror';\n\nimport { installExtensions, type SqlDialectName } from '@keboola/codemirror-lang-sql';\n\nimport { useStableCallback } from '../../hooks/useStableCallback';\n\nimport { activeQueryHighlight } from './activeQueryHighlight';\nimport { buildBaseThemeStyles, buildBasicSetup, buildCustomTheme } from './helpers';\nimport type { HighlightedLines } from './highlighting';\nimport { highlightingExtension, updateHighlighting } from './highlighting';\nimport { searchExtension, updateSearch } from './search';\nimport { resolveToken, useThemedExtension } from './tokenTheme';\nimport { useTooltipsExtension } from './tooltips';\nimport { type EditorVariable, useVariableCompletion } from './variableCompletion';\n\n// SqlEditor installs its own keymaps: `CUSTOM_KEYMAP` ahead of `defaultKeymap`\n// for Escape, a Tab/Enter-filtered completion keymap from\n// `@keboola/codemirror-lang-sql`, and search driven by props rather than the\n// CodeMirror panel.\nconst OWN_KEYMAPS = {\n defaultKeymap: false,\n completionKeymap: false,\n searchKeymap: false,\n} as const;\n\nconst CUSTOM_KEYMAP: KeyBinding[] = [\n {\n key: 'Escape',\n stopPropagation: true,\n run: (view: EditorView) => {\n view.contentDOM.blur();\n return true;\n },\n },\n];\n\nconst OWN_KEYMAP_EXTENSION = keymap.of([...defaultKeymap, ...CUSTOM_KEYMAP]);\n\n// Editor surface, focus ring, and read-only wash resolve from live `--*`\n// tokens so the SQL editor chrome re-skins with brand + dark mode. Fallback\n// channels mirror the light-mode token values.\nconst buildTheme = () => ({\n ...buildBaseThemeStyles(),\n '&.cm-editor': {\n border: 'solid 1px transparent',\n background: resolveToken('card', '255 255 255'),\n borderRadius: '8px',\n paddingTop: '8px',\n paddingBottom: '8px',\n },\n '&.cm-editor:has(.cm-content[contenteditable=\"true\"]):hover': {\n borderColor: resolveToken('ring', '31 143 255'),\n },\n '&.cm-editor:has(.cm-content[contenteditable=\"true\"]):focus-within': {\n borderColor: resolveToken('ring', '31 143 255'),\n boxShadow: `0 0 0 4px ${resolveToken('ring', '31 143 255', 0.3)}`,\n },\n '&.cm-editor .cm-scroller': { overflowAnchor: 'none' },\n '&.cm-editor :is(.cm-gutters,.cm-scroller)': { background: resolveToken('card', '255 255 255') },\n '&.cm-editor:has(.cm-content[contenteditable=\"false\"])': {\n background: resolveToken('muted', '241 245 249'),\n },\n '&.cm-editor:has(.cm-content[contenteditable=\"false\"]) :is(.cm-scroller,.cm-gutters)': {\n background: resolveToken('muted', '241 245 249'),\n },\n});\n\ntype Props = {\n value: string;\n onChange?: (value: string) => void;\n onSelectionChange?: (text: string) => void;\n onCreateEditor?: (view: EditorView, state: EditorState) => void;\n onDestroyEditor?: () => void;\n onBlurEditor?: (view: EditorView) => void;\n onFocusEditor?: (view: EditorView) => void;\n readOnly: boolean;\n placeholder?: string;\n searchQuery?: string;\n searchMatchIndex?: number;\n queryParser?: (sql: string) => Promise<string[]>;\n autoFocus?: boolean;\n lineNumbers?: boolean;\n className?: string;\n /**\n * A schema is too large to compare by value, so this one prop keeps the\n * identity requirement every other prop here is now free of: hand the editor\n * a stable object, or it rebuilds its whole extension tree on every render.\n */\n schema?: SQLNamespace;\n variables?: EditorVariable[];\n defaultSchema?: string;\n defaultDatabase?: string;\n highlightLines?: HighlightedLines;\n dialect?: SqlDialectName;\n};\n\nexport const SqlEditor = ({\n value,\n onChange,\n onSelectionChange,\n onCreateEditor,\n onDestroyEditor,\n onBlurEditor,\n onFocusEditor,\n placeholder = '',\n searchQuery = '',\n searchMatchIndex,\n readOnly = false,\n queryParser,\n autoFocus = false,\n lineNumbers = true,\n className,\n schema,\n variables,\n defaultDatabase,\n defaultSchema,\n highlightLines,\n dialect,\n}: Props) => {\n const editorRef = useRef<ReactCodeMirrorRef>(null);\n\n // CodeMirror holds these by identity and rebuilds its whole extension tree when one\n // moves, which is every render for the inline arrows callers pass.\n const handleChange = useStableCallback((next: string) => onChange?.(next));\n const parseQueries = useStableCallback(async (sql: string) => (await queryParser?.(sql)) ?? []);\n const handleBlur = useStableCallback((view: EditorView) => onBlurEditor?.(view));\n const handleFocus = useStableCallback((view: EditorView) => onFocusEditor?.(view));\n\n const handleUpdate = useStableCallback((update: ViewUpdate) => {\n if (update.selectionSet) {\n const { main } = update.state.selection;\n\n onSelectionChange?.(update.state.sliceDoc(main.from, main.to));\n }\n });\n\n const variableCompletion = useVariableCompletion(variables);\n\n // Whether a parser was given decides whether the active-query highlighter is\n // installed at all; which parser it is does not, so the caller's may change\n // without a reconfigure.\n const withQueryParser = queryParser !== undefined;\n\n const tooltipLayer = useTooltipsExtension();\n\n // Themes re-resolve their `--*` tokens on brand / light-dark change. The\n // syntax palette shares `CodeEditor`'s cache entry — same `buildCustomTheme`.\n const customTheme = useThemedExtension('editor:syntax', buildCustomTheme);\n const themeExtension = useThemedExtension('sql-editor:chrome', () =>\n EditorView.theme(buildTheme()),\n );\n\n const extensions = useMemo(() => {\n return [\n EditorView.lineWrapping,\n OWN_KEYMAP_EXTENSION,\n ...installExtensions({\n schema,\n defaultDatabase,\n defaultSchema,\n variableCompletion,\n dialect,\n }),\n searchExtension(),\n highlightingExtension(),\n withQueryParser ? activeQueryHighlight(parseQueries) : [],\n tooltipLayer,\n themeExtension,\n EditorView.domEventHandlers({\n blur: (_, view) => handleBlur(view),\n focus: (_, view) => handleFocus(view),\n }),\n ];\n }, [\n withQueryParser,\n parseQueries,\n schema,\n defaultDatabase,\n defaultSchema,\n variableCompletion,\n dialect,\n handleBlur,\n handleFocus,\n themeExtension,\n tooltipLayer,\n ]);\n\n const defaultSetup = useMemo(() => {\n return { ...buildBasicSetup(readOnly), ...OWN_KEYMAPS, lineNumbers };\n }, [readOnly, lineNumbers]);\n\n useEffect(() => {\n if (editorRef.current?.view) {\n updateHighlighting(editorRef.current.view, highlightLines);\n }\n }, [highlightLines]);\n\n useEffect(() => {\n if (editorRef.current?.view) {\n updateSearch(editorRef.current.view, searchQuery, searchMatchIndex);\n }\n }, [searchQuery, searchMatchIndex]);\n\n // Reports once, as the editor goes away, to whichever handler the last render passed.\n const handleDestroy = useStableCallback(() => onDestroyEditor?.());\n useEffect(() => handleDestroy, [handleDestroy]);\n\n const handleCreate = useStableCallback((view: EditorView, state: EditorState) => {\n onCreateEditor?.(view, state);\n\n if (highlightLines) {\n updateHighlighting(view, highlightLines);\n }\n\n if (searchQuery) {\n updateSearch(view, searchQuery, searchMatchIndex);\n }\n });\n\n return (\n <CodeMirror\n ref={editorRef}\n theme={customTheme}\n extensions={extensions}\n value={value}\n onChange={handleChange}\n onUpdate={handleUpdate}\n onCreateEditor={handleCreate}\n autoFocus={autoFocus}\n placeholder={placeholder}\n className={className}\n readOnly={readOnly}\n editable={!readOnly}\n basicSetup={defaultSetup}\n />\n );\n};\n","export const CHUNK_TYPE = {\n UNCHANGED: 'unchanged',\n ADDED: 'added',\n REMOVED: 'removed',\n} as const;\n\ntype ChunkType = (typeof CHUNK_TYPE)[keyof typeof CHUNK_TYPE];\n\nexport type DiffChunk = {\n type: ChunkType;\n value: string;\n /** 1-indexed start line in the old (left) text */\n oldStart: number;\n /** 1-indexed end line in the old (left) text */\n oldEnd: number;\n /** 1-indexed start line in the new (right) text */\n newStart: number;\n /** 1-indexed end line in the new (right) text */\n newEnd: number;\n};\n\n/**\n * A paired conflict: adjacent REMOVED + ADDED chunks from diffLines,\n * representing a section that was modified. If only one side exists,\n * the other is empty (pure insertion or deletion).\n */\nexport type MergeConflict = {\n id: string;\n oldValue: string;\n oldStartLine: number;\n oldEndLine: number;\n newValue: string;\n newStartLine: number;\n newEndLine: number;\n};\n\nexport const CHANGE_CLASS = {\n SAFE: 'safe',\n CONFLICT: 'conflict',\n} as const;\n\nexport type ChangeClassification = (typeof CHANGE_CLASS)[keyof typeof CHANGE_CLASS];\n\n/** Must match the CodeMirror line-height set in MergePane */\nexport const LINE_HEIGHT_PX = 20;\n\n/** Must match the rendered header height in MergePane (py-3 + content + border) */\nexport const PANE_HEADER_HEIGHT_PX = 58;\n","import { ChevronsLeft, ChevronsRight } from '../../../icons';\nimport { Button } from '../../Button';\n\ntype Props = {\n side: 'left' | 'right';\n onAccept: () => void;\n};\n\nexport const AcceptButton = ({ side, onAccept }: Props) => {\n const label = `Accept ${side === 'left' ? 'production' : 'branch'} version`;\n const Chevron = side === 'left' ? ChevronsRight : ChevronsLeft;\n return (\n <Button onClick={onAccept} variant=\"outline\" size=\"icon-sm\" title={label} aria-label={label}>\n <Chevron className=\"tw:size-5\" />\n </Button>\n );\n};\n","import type { RefCallback } from 'react';\n\nimport { X } from '../../../icons';\nimport { cn } from '../../../utils';\nimport { Button } from '../../Button';\nimport { LINE_HEIGHT_PX, type MergeConflict, PANE_HEADER_HEIGHT_PX } from '../constants';\n\nimport { AcceptButton } from './AcceptButton';\n\ntype Props = {\n conflicts: MergeConflict[];\n side: 'left' | 'right';\n onAccept: (conflict: MergeConflict) => void;\n onDismiss?: (conflict: MergeConflict) => void;\n contentRef?: RefCallback<HTMLDivElement>;\n};\n\n// 28px column when there are conflicts to render — wide enough to fit the\n// 24px icon-xs accept chevron + dismiss icon without overflowing into the\n// adjacent panes (which use `tw:overflow-hidden` and would clip absolutely-\n// positioned children that crossed the boundary). Collapses to 0 when idle\n// so empty merges don't reserve a sliver of layout. Inner wrapper allows\n// horizontal overflow so the icon buttons' focus-visible ring stays visible\n// past the column edge. Buttons stay aligned with their source-pane chunk\n// via the parent's `translateY(-scrollTop)` follower applied to `contentRef`.\nexport const AcceptControls = ({ conflicts, side, onAccept, onDismiss, contentRef }: Props) => (\n <div\n className={cn(\n 'tw:z-10 tw:flex tw:shrink-0 tw:flex-col tw:items-center',\n conflicts.length > 0 ? 'tw:w-7' : 'tw:w-0',\n )}\n >\n {conflicts.length > 0 && (\n <>\n <div className=\"tw:shrink-0\" style={{ height: `${PANE_HEADER_HEIGHT_PX}px` }} />\n <div className=\"tw:relative tw:w-full tw:flex-1 tw:overflow-y-clip tw:overflow-x-visible\">\n <div ref={contentRef} className=\"tw:relative tw:size-full\">\n {conflicts.map((conflict) => {\n const topLine = side === 'left' ? conflict.oldStartLine : conflict.newStartLine;\n const topOffset = (topLine - 1) * LINE_HEIGHT_PX - 2;\n\n return (\n <div\n key={conflict.id}\n className=\"tw:absolute tw:inset-x-0 tw:flex tw:flex-col tw:items-center tw:gap-0.5\"\n style={{ top: `${topOffset}px` }}\n >\n <AcceptButton side={side} onAccept={() => onAccept(conflict)} />\n {onDismiss && (\n <Button\n onClick={() => onDismiss(conflict)}\n variant=\"outline\"\n size=\"icon-sm\"\n title=\"Dismiss\"\n aria-label={`Dismiss ${side === 'left' ? 'production' : 'branch'} change`}\n >\n <X className=\"tw:size-4\" />\n </Button>\n )}\n </div>\n );\n })}\n </div>\n </div>\n </>\n )}\n </div>\n);\n","import {\n type Extension,\n RangeSet,\n RangeSetBuilder,\n StateEffect,\n StateField,\n} from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n gutterLineClass,\n GutterMarker,\n} from '@codemirror/view';\n\nimport colors from '@keboola/tailwind-config/colors';\n\nimport type { ChangeClassification } from './constants';\nimport { CHANGE_CLASS } from './constants';\n\ntype HighlightPayload = {\n lines: Set<number>;\n classification: Map<number, ChangeClassification>;\n};\n\nconst setHighlightedLines = StateEffect.define<HighlightPayload>();\n\nconst safeDecoration = Decoration.line({ class: 'cm-merge-safe-line' });\nconst conflictDecoration = Decoration.line({ class: 'cm-merge-conflict-line' });\n\nclass SafeGutterMarker extends GutterMarker {\n override elementClass = 'cm-merge-safe-gutter';\n}\n\nclass ConflictGutterMarker extends GutterMarker {\n override elementClass = 'cm-merge-conflict-gutter';\n}\n\nconst safeGutterMarker = new SafeGutterMarker();\nconst conflictGutterMarker = new ConflictGutterMarker();\n\ntype FieldValue = {\n decorations: DecorationSet;\n gutterMarkers: RangeSet<GutterMarker>;\n};\n\nexport const createDiffHighlightExtension = (): Extension => {\n const field = StateField.define<FieldValue>({\n create: () => ({ decorations: Decoration.none, gutterMarkers: RangeSet.empty }),\n update(value, tr) {\n // Use the last effect if multiple are dispatched in a single transaction\n let payload: HighlightPayload | null = null;\n for (const effect of tr.effects) {\n if (effect.is(setHighlightedLines)) {\n payload = effect.value;\n }\n }\n\n if (!payload) {\n return {\n decorations: value.decorations.map(tr.changes),\n gutterMarkers: value.gutterMarkers.map(tr.changes),\n };\n }\n\n const decoBuilder = new RangeSetBuilder<Decoration>();\n const gutterBuilder = new RangeSetBuilder<GutterMarker>();\n const doc = tr.state.doc;\n const { lines, classification } = payload;\n\n // Iterate the (typically small) highlighted set instead of all doc lines.\n // RangeSetBuilder requires positions in order, so sort first.\n const sorted = [...lines].filter((l) => l >= 1 && l <= doc.lines).sort((a, b) => a - b);\n for (const i of sorted) {\n const cls = classification.get(i);\n if (!cls) continue;\n\n const isSafe = cls === CHANGE_CLASS.SAFE;\n const line = doc.line(i);\n decoBuilder.add(line.from, line.from, isSafe ? safeDecoration : conflictDecoration);\n gutterBuilder.add(line.from, line.from, isSafe ? safeGutterMarker : conflictGutterMarker);\n }\n\n return {\n decorations: decoBuilder.finish(),\n gutterMarkers: gutterBuilder.finish(),\n };\n },\n provide: (f) => [\n EditorView.decorations.from(f, (val) => val.decorations),\n gutterLineClass.from(f, (val: FieldValue) => val.gutterMarkers),\n ],\n });\n\n // !important needed to override CodeMirror's built-in active-line and selection backgrounds.\n // SAFE = change present on one side only (green). CONFLICT = both sides edited this region\n // (amber/warning — NOT red, since red reads as \"deletion\" and the 3-pane editor only ever\n // displays additions in each side pane). The colored left border doubles as a scan-lane so\n // changes are easy to spot when zoomed out.\n const theme = EditorView.theme({\n '.cm-merge-safe-line': {\n backgroundColor: `${colors.green[100]} !important`,\n boxShadow: `inset 3px 0 0 ${colors.green[500]}`,\n },\n '.cm-merge-conflict-line': {\n backgroundColor: `${colors.warning[100]} !important`,\n boxShadow: `inset 3px 0 0 ${colors.warning[500]}`,\n },\n '.cm-merge-safe-gutter': {\n backgroundColor: `${colors.green[200]} !important`,\n },\n '.cm-merge-conflict-gutter': {\n backgroundColor: `${colors.warning[200]} !important`,\n },\n });\n\n return [field, theme];\n};\n\nexport const updateHighlightedLines = (\n view: EditorView,\n lines: Set<number>,\n classification: Map<number, ChangeClassification>,\n) => {\n view.dispatch({ effects: setHighlightedLines.of({ lines, classification }) });\n};\n","import { type ReactNode, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { type Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport CodeMirror, { type ReactCodeMirrorRef } from '@uiw/react-codemirror';\n\nimport colors from '@keboola/tailwind-config/colors';\n\nimport { useStableCallback } from '../../hooks/useStableCallback';\nimport { cn } from '../../utils';\nimport { buildBasicSetup } from '../CodeEditor/helpers';\nimport { resolveToken, useThemedExtension } from '../CodeEditor/tokenTheme';\n\nimport { type ChangeClassification, LINE_HEIGHT_PX } from './constants';\nimport { createDiffHighlightExtension, updateHighlightedLines } from './decorations';\n\nconst EMPTY_LINES: Set<number> = new Set();\nconst EMPTY_CLASSIFICATION: Map<number, ChangeClassification> = new Map();\n\ntype Props = {\n value: string;\n highlightedLines: Set<number>;\n lineClassification: Map<number, ChangeClassification>;\n readOnly?: boolean;\n onChange?: (value: string) => void;\n header?: ReactNode;\n headerClassName?: string;\n className?: string;\n onScrollDOMReady?: (el: HTMLElement | null) => void;\n /**\n * When true, the pane renders with the error palette to signal the side has\n * been deleted upstream. The CodeMirror editor is still mounted so the diff\n * remains visible — only the background, gutter, header, and border switch.\n */\n deleted?: boolean;\n};\n\nexport const MergePane = ({\n value,\n highlightedLines,\n lineClassification,\n readOnly = false,\n onChange,\n header,\n headerClassName,\n className,\n onScrollDOMReady,\n deleted = false,\n}: Props) => {\n const editorRef = useRef<ReactCodeMirrorRef>(null);\n const handleChange = useStableCallback((next: string) => onChange?.(next));\n\n // Non-deleted pane chrome re-resolves its `--*` tokens on brand /\n // light-dark change. The deleted pane keeps the categorical error wash\n // (deletion is meaning-encoding, not chrome).\n const themeExtension = useThemedExtension(`merge-pane:${deleted}`, () =>\n EditorView.theme({\n '&.cm-editor': {\n height: '100%',\n backgroundColor: deleted ? colors.error[100] : resolveToken('background', '249 250 251'),\n // Pair the token-driven surface with a token-driven text color so line\n // content stays readable when the pane's `--background` goes dark.\n // The deleted pane keeps default dark text on its fixed light-red wash.\n ...(deleted ? {} : { color: resolveToken('foreground', '30 41 59') }),\n outline: 'none',\n },\n '.cm-gutters': {\n backgroundColor: deleted ? colors.error[200] : resolveToken('muted', '241 245 249'),\n ...(deleted ? {} : { color: resolveToken('muted-foreground', '100 116 139') }),\n },\n '*': { lineHeight: `${LINE_HEIGHT_PX}px` },\n '.cm-lineNumbers .cm-gutterElement': { padding: '0 0 0 25px' },\n }),\n );\n\n // Memoized independently of the theme so its `StateField` instance stays\n // stable when the editor reconfigures on brand / light-dark change. A fresh\n // extension would re-init the field and drop the current highlights.\n const diffHighlightExtension = useMemo(() => createDiffHighlightExtension(), []);\n\n // Two of a merge view's three panes are read-only.\n const basicSetup = useMemo(\n () => ({ ...buildBasicSetup(readOnly), lineNumbers: true }),\n [readOnly],\n );\n\n const extensions = useMemo(\n (): Extension[] => [\n diffHighlightExtension,\n themeExtension,\n // Recalc viewport after every doc change so late-settling layouts (alerts\n // appearing above the editor) don't leave trailing lines blank.\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n requestAnimationFrame(() => update.view.dispatch({}));\n }\n }),\n ],\n [diffHighlightExtension, themeExtension],\n );\n\n // A deleted side is a file-level conflict, not a line-level one — suppress\n // per-line markers so the pane wears only the red wash. `deleted` stays in\n // the dep list so highlights switch between the empty and populated sets when\n // the side toggles.\n useEffect(() => {\n const view = editorRef.current?.view;\n if (!view) return;\n updateHighlightedLines(\n view,\n deleted ? EMPTY_LINES : highlightedLines,\n deleted ? EMPTY_CLASSIFICATION : lineClassification,\n );\n }, [highlightedLines, lineClassification, deleted]);\n\n const handleCreateEditor = useCallback(\n (view: EditorView) => {\n updateHighlightedLines(\n view,\n deleted ? EMPTY_LINES : highlightedLines,\n deleted ? EMPTY_CLASSIFICATION : lineClassification,\n );\n onScrollDOMReady?.(view.scrollDOM);\n },\n [highlightedLines, lineClassification, onScrollDOMReady, deleted],\n );\n\n useEffect(() => {\n return () => onScrollDOMReady?.(null);\n }, [onScrollDOMReady]);\n\n // Re-measure on wrapper resize — parent dimensions settle after CM mounts\n // (fullscreen modal, alerts appearing above the editor).\n useEffect(() => {\n const view = editorRef.current?.view;\n const wrapper = view?.dom.parentElement;\n if (!view || !wrapper) return;\n\n const observer = new ResizeObserver(() => view.dispatch({}));\n observer.observe(wrapper);\n\n return () => observer.disconnect();\n }, []);\n\n return (\n <div\n className={cn(\n 'tw:flex tw:min-w-0 tw:flex-1 tw:flex-col tw:overflow-hidden',\n className,\n deleted && 'tw:border-error-300',\n )}\n >\n {header && (\n <div\n className={cn(\n 'tw:px-4 tw:py-3',\n deleted ? 'tw:border-b tw:border-error-200 tw:bg-error-100' : 'tw:bg-background',\n headerClassName,\n )}\n >\n {header}\n </div>\n )}\n <div className=\"tw:flex tw:h-0 tw:flex-1 tw:flex-col tw:[&_>div]:h-full\">\n <CodeMirror\n ref={editorRef}\n height=\"100%\"\n value={value}\n onChange={handleChange}\n extensions={extensions}\n readOnly={readOnly}\n onCreateEditor={handleCreateEditor}\n basicSetup={basicSetup}\n />\n </div>\n </div>\n );\n};\n","import { useCallback, useRef } from 'react';\n\nexport const useScrollSync = () => {\n const scrollersRef = useRef<(HTMLElement | null)[]>([]);\n const followersRef = useRef<Map<string, { paneIndex: number; el: HTMLElement }>>(new Map());\n const isSyncingRef = useRef(false);\n const scrollerCallbacksRef = useRef<Map<number, (el: HTMLElement | null) => void>>(new Map());\n const followerCallbacksRef = useRef<Map<string, (el: HTMLElement | null) => void>>(new Map());\n\n const updateFollowers = useCallback(() => {\n for (const [, { paneIndex, el }] of followersRef.current) {\n const scroller = scrollersRef.current[paneIndex];\n if (!scroller) continue;\n el.style.transform = `translateY(-${scroller.scrollTop}px)`;\n }\n }, []);\n\n const handleScroll = useCallback(\n (e: Event) => {\n if (isSyncingRef.current) return;\n isSyncingRef.current = true;\n\n // Px-aligned sync. All panes share LINE_HEIGHT_PX, so matching scrollTop is the same\n // as matching the line at the top of the viewport. Previous ratio-based sync drifted\n // badly when pane heights differed (e.g. 50 lines vs 500 — half-scrolling left snapped\n // right to its midpoint, not to the equivalent line). Clamp to each target's max so\n // the source can scroll past where shorter panes bottom out without errors.\n const sourceScrollTop = (e.target as HTMLElement).scrollTop;\n\n for (const scroller of scrollersRef.current) {\n if (!scroller || scroller === e.target) continue;\n const targetMax = Math.max(0, scroller.scrollHeight - scroller.clientHeight);\n scroller.scrollTop = Math.min(sourceScrollTop, targetMax);\n }\n\n updateFollowers();\n isSyncingRef.current = false;\n },\n [updateFollowers],\n );\n\n const registerScroller = useCallback(\n (index: number) => {\n const existing = scrollerCallbacksRef.current.get(index);\n if (existing) return existing;\n\n const callback = (el: HTMLElement | null) => {\n const prev = scrollersRef.current[index];\n if (prev === el) return;\n\n prev?.removeEventListener('scroll', handleScroll);\n scrollersRef.current[index] = el;\n el?.addEventListener('scroll', handleScroll, { passive: true });\n };\n\n scrollerCallbacksRef.current.set(index, callback);\n return callback;\n },\n [handleScroll],\n );\n\n const registerFollower = useCallback((paneIndex: number, key: string) => {\n const existing = followerCallbacksRef.current.get(key);\n if (existing) return existing;\n\n const callback = (el: HTMLElement | null) => {\n if (el) {\n followersRef.current.set(key, { paneIndex, el });\n } else {\n followersRef.current.delete(key);\n }\n };\n\n followerCallbacksRef.current.set(key, callback);\n return callback;\n }, []);\n\n return { registerScroller, registerFollower };\n};\n","import type { ReactNode } from 'react';\n\nimport { cn } from '../../utils';\n\nimport { AcceptControls } from './AcceptControls/AcceptControls';\nimport type { ChangeClassification, MergeConflict } from './constants';\nimport { MergePane } from './MergePane';\nimport { useScrollSync } from './useScrollSync';\n\nconst EMPTY_LINES: Set<number> = new Set();\nconst EMPTY_CLASSIFICATION: Map<number, ChangeClassification> = new Map();\n\ntype Props = {\n mergeValue: string;\n handleMergeChange: (value: string) => void;\n leftText: string;\n rightText: string;\n leftConflicts: MergeConflict[];\n rightConflicts: MergeConflict[];\n leftHighlightedLines: Set<number>;\n rightHighlightedLines: Set<number>;\n leftClassification: Map<number, ChangeClassification>;\n rightClassification: Map<number, ChangeClassification>;\n mergeHighlightedLines: Set<number>;\n mergeClassification: Map<number, ChangeClassification>;\n acceptLeft: (conflict: MergeConflict) => void;\n acceptRight: (conflict: MergeConflict) => void;\n dismissLeft: (conflict: MergeConflict) => void;\n dismissRight: (conflict: MergeConflict) => void;\n leftHeader?: ReactNode;\n middleHeader?: ReactNode;\n middleHeaderClassName?: string;\n middleClassName?: string;\n rightHeader?: ReactNode;\n className?: string;\n /**\n * Paint the corresponding read-only pane with the error palette to signal the\n * side has been deleted upstream. The diff is still rendered so the user can\n * see what was lost; accept/dismiss controls for that side are suppressed.\n */\n leftDeleted?: boolean;\n rightDeleted?: boolean;\n};\n\nexport const MergeEditor = ({\n mergeValue,\n handleMergeChange,\n leftText,\n rightText,\n leftConflicts,\n rightConflicts,\n leftHighlightedLines,\n rightHighlightedLines,\n leftClassification,\n rightClassification,\n mergeHighlightedLines,\n mergeClassification,\n acceptLeft,\n acceptRight,\n dismissLeft,\n dismissRight,\n leftHeader,\n middleHeader,\n middleHeaderClassName,\n middleClassName,\n rightHeader,\n className,\n leftDeleted = false,\n rightDeleted = false,\n}: Props) => {\n const { registerScroller, registerFollower } = useScrollSync();\n\n // When either side is deleted the merge is a binary \"keep or drop the file\"\n // choice, not a line-level merge — suppress per-line markers in the middle\n // pane so the indicator/markers don't contradict the red deleted pane.\n const anySideDeleted = leftDeleted || rightDeleted;\n\n return (\n <div\n className={cn(\n 'tw:flex tw:h-full tw:min-h-0 tw:overflow-hidden tw:bg-background tw:gap-3',\n className,\n )}\n >\n <MergePane\n value={leftText}\n highlightedLines={leftHighlightedLines}\n lineClassification={leftClassification}\n readOnly\n header={leftHeader}\n className=\"tw:rounded-r-lg tw:border tw:border-border\"\n onScrollDOMReady={registerScroller(0)}\n deleted={leftDeleted}\n />\n\n <AcceptControls\n conflicts={leftDeleted ? [] : leftConflicts}\n side=\"left\"\n onAccept={acceptLeft}\n onDismiss={dismissLeft}\n contentRef={registerFollower(0, 'left-controls')}\n />\n\n <MergePane\n value={mergeValue}\n highlightedLines={anySideDeleted ? EMPTY_LINES : mergeHighlightedLines}\n lineClassification={anySideDeleted ? EMPTY_CLASSIFICATION : mergeClassification}\n onChange={handleMergeChange}\n header={middleHeader}\n headerClassName={middleHeaderClassName}\n className={cn('tw:border tw:border-border tw:rounded-lg', middleClassName)}\n onScrollDOMReady={registerScroller(1)}\n />\n\n <AcceptControls\n conflicts={rightDeleted ? [] : rightConflicts}\n side=\"right\"\n onAccept={acceptRight}\n onDismiss={dismissRight}\n contentRef={registerFollower(2, 'right-controls')}\n />\n\n <MergePane\n value={rightText}\n highlightedLines={rightHighlightedLines}\n lineClassification={rightClassification}\n readOnly\n header={rightHeader}\n className=\"tw:rounded-l-lg tw:border tw:border-border\"\n onScrollDOMReady={registerScroller(2)}\n deleted={rightDeleted}\n />\n </div>\n );\n};\n"]}