import { IValueDisposable } from '../../../lifecycle'; import { DockviewHeaderDirection } from '../../options'; import { Tab } from '../tab/tab'; import { ITabGroup } from '../../tabGroup'; import { TabGroupColorPalette } from '../../tabGroupAccent'; export interface TabGroupIndicatorContext { readonly tabsList: HTMLElement; getTabGroups(): readonly ITabGroup[]; getActivePanelId(): string | undefined; getTabMap(): Map>; getChipElement(groupId: string): HTMLElement | undefined; getDirection(): DockviewHeaderDirection; getColorPalette(): TabGroupColorPalette | undefined; } export interface ITabGroupIndicator { readonly underlines: ReadonlyMap; positionUnderlines(): void; trackUnderlines(): void; syncUnderlineElements(activeGroupIds: Set): void; getUnderline(groupId: string): HTMLElement | undefined; dispose(): void; } /** * Shared positioning logic for tab group indicators. * Subclasses implement `applyShape` to control the visual output. */ declare abstract class BaseTabGroupIndicator implements ITabGroupIndicator { protected readonly _ctx: TabGroupIndicatorContext; protected readonly _underlines: Map; private _rafId; get underlines(): ReadonlyMap; constructor(_ctx: TabGroupIndicatorContext); positionUnderlines(): void; /** * Continuously reposition underlines every frame for the duration * of a tab transition (~200ms), so the underline tracks tab sizes. */ trackUnderlines(): void; syncUnderlineElements(activeGroupIds: Set): void; getUnderline(groupId: string): HTMLElement | undefined; dispose(): void; /** * Apply the visual shape to the underline element. * Called once per tab group per frame with the computed geometry. */ protected abstract applyShape(underline: HTMLElement, tg: ITabGroup, startEdge: number, span: number, containerCrossSize: number, activePanelId: string | undefined, containerRect: DOMRect, isVertical: boolean): void; private _positionUnderlinesSync; } /** * Chrome-style wrap-around indicator using SVG paths. */ export declare class WrapTabGroupIndicator extends BaseTabGroupIndicator { private _applyStraightLine; /** * Chrome-style wrap-around underline: a stroked SVG path that runs * along the bottom (or left edge in vertical mode), curving up and * over the active tab with rounded corners. * * The SVG and path elements are created once per underline and reused; * only the `d`, `stroke`, and viewport attributes are updated each frame. */ protected applyShape(underline: HTMLElement, tg: ITabGroup, groupStart: number, groupSpan: number, containerCrossSize: number, activePanelId: string | undefined, containerRect: DOMRect, isVertical: boolean): void; } /** * Flat continuous bar indicator — no wrap-around, just a colored line * spanning the full tab group width. */ export declare class NoneTabGroupIndicator extends BaseTabGroupIndicator { protected applyShape(underline: HTMLElement, tg: ITabGroup, _startEdge: number, span: number, _containerCrossSize: number, _activePanelId: string | undefined, _containerRect: DOMRect, isVertical: boolean): void; } export {};