import type { CSSProperties, ReactNode } from 'react'; import type { MudletMap, MudletRoom } from '../mapIO'; import type { SwatchSet } from './types'; import type { SceneHandle } from './scene'; import type { LabelStyle } from './labelStyles'; import type { MapFormat } from './formats'; export interface PluginCheckResult { /** Stable identifier for this warning instance; used to namespace ack keys. */ id: string; /** Bold title shown in the warnings list. */ message: string; /** Optional secondary description. */ detail?: string; /** If set, the "Go" button navigates to this room. */ roomId?: number; } export interface SidebarTab { id: string; label: ReactNode; render(sceneRef: { current: SceneHandle | null; }): ReactNode; } export interface RoomSectionProps { roomId: number; room: NonNullable; map: MudletMap; sceneRef: { current: SceneHandle | null; }; } export interface RoomPanelSection { id: string; render(props: RoomSectionProps): ReactNode; } /** A button in the toolbar header row's file-action group. Plugins reshape the * list via `toolbarActions` — filter to hide built-ins, map to override * callbacks/labels, or push to add new entries. Built-in ids are 'new', * 'load', 'loadUrl', and 'save'. */ export interface ToolbarAction { /** Stable id; plugins target a specific action by matching on this. */ id: string; /** Tooltip text shown on hover. */ title?: string; /** Button contents — typically an SVG icon, but any node works. */ icon?: ReactNode; /** Click handler. Ignored when `filePicker` is set. */ onClick?: () => void; /** When set, the action renders as a `