import { RadiantElement } from '@ecopages/radiant'; export type RuiSidebarTriggerPlacement = 'header' | 'inset'; export type RuiSidebarTriggerProps = { /** ID of the `rui-sidebar` this trigger controls. */ controls?: string; /** Accessible name for the trigger button. Default: `Toggle sidebar`. */ triggerLabel?: string; /** * Where the trigger is rendered. `header` is shown while the sidebar is expanded; * `inset` while collapsed (desktop icon rail / mobile drawer closed). CSS on * `.rui-sidebar-provider` hides the inactive placement. */ placement?: RuiSidebarTriggerPlacement; /** Variant passed through to the rendered button. */ variant?: 'filled' | 'outline' | 'ghost'; /** Size passed through to the rendered button. */ size?: 'sm' | 'md' | 'lg'; }; /** * `` — toggle button for a sibling `rui-sidebar`. * * The trigger looks up the sidebar by `id` on every click so it works even * when the trigger element is re-mounted independently of the sidebar. The * trigger also subscribes to `rui-sidebar-toggle` events to mirror the * sidebar's `data-state` in its own `aria-expanded` attribute. * * @remarks * Button chrome and icons are authored in the `RuiSidebarTrigger` view; this host * only syncs ARIA and presentation attrs on the light-DOM button. * * @element rui-sidebar-trigger */ export declare class RuiSidebarTrigger extends RadiantElement { controls: string; /** `label` is not a safe reactive attribute name in the DOM; bind via `button-label`. */ buttonLabel: string; placement: RuiSidebarTriggerPlacement | ''; variant: NonNullable; size: NonNullable; buttonTarget: HTMLButtonElement; private sidebarState; private sidebarListener; private attachedSidebar; private initialSyncFrame; /** * @remarks JSX `.prop` bindings flush after connect when the trigger is nested in sidebar chrome. * * The triple sync is deliberate, not redundant: * - the synchronous call covers triggers rendered outside any sidebar; * - the nested microtasks hop past the *sidebar's* own `onConnected` sync * (connection order does not guarantee the sidebar ran first), so state * read here is post-sync; * - the animation frame is a final pass after layout settles (mobile media * query flips land there). */ connectedCallback(): void; disconnectedCallback(): void; onBindingUpdated(): void; onPresentationUpdated(): void; private resolveSidebar; private syncWithSidebar; private detachFromSidebar; private readState; private resolvedPlacement; private resolvedButtonLabel; private applyState; private syncButtonPresentation; onButtonClick(event: Event): void; private placementClass; }