import type { MudletColor, MudletRoom } from '../mapIO'; export type LabelFont = { family: string; size: number; bold: boolean; italic: boolean; underline: boolean; strikeout: boolean; }; export declare const DEFAULT_LABEL_FONT: LabelFont; export type LabelTextAlign = 'left' | 'center' | 'right'; export type LabelSnapshot = { id: number; pos: [number, number, number]; size: [number, number]; text: string; fgColor: MudletColor; bgColor: MudletColor; noScaling: boolean; showOnTop: boolean; font: LabelFont; /** Text outline color loaded from area userData (system.labelOutlineColor_N). */ outlineColor?: MudletColor; /** Registered label style id (see labelStyles.ts); undefined / 'plain' = default rendering. Persisted to area userData as editor.labelStyle_N. */ styleId?: string; /** Horizontal text alignment; undefined = 'center' (default). Persisted to area userData as editor.labelAlign_N. */ textAlign?: LabelTextAlign; /** Base64 PNG data URL, or empty string if no pixmap. */ pixMap: string; /** Original image data URL set by the user (editor-only, not persisted to .dat). */ imageSrc?: string; }; export type ToolId = 'select' | 'connect' | 'unlink' | 'addRoom' | 'delete' | 'pan' | 'customLine' | 'addLabel' | 'paint'; export type Swatch = { id: string; name: string; symbol: string; environment: number; /** `#rrggbb` written to `system.fallback_symbol_color`; null/undefined leaves the room's symbol colour untouched. */ symbolColor?: string | null; /** `#rrggbb` (stored as Qt `#aarrggbb`); null/undefined leaves the room's border colour untouched. */ borderColor?: string | null; /** 1..10; null/undefined leaves the room's border thickness untouched. */ borderThickness?: number | null; }; export type SwatchSet = { id: string; name: string; swatches: Swatch[]; readonly?: boolean; }; export type Direction = 'north' | 'northeast' | 'east' | 'southeast' | 'south' | 'southwest' | 'west' | 'northwest' | 'up' | 'down' | 'in' | 'out'; export declare const CARDINAL_DIRECTIONS: Direction[]; export declare const OPPOSITE: Record; export declare const DIR_SHORT: Record; export declare const DIR_LONG: Record; /** 1-based direction index used by Mudlet's stubs/exitLocks arrays. */ export declare const DIR_INDEX: Record; /** Inverse of DIR_SHORT — short-form cardinal key → full Direction name. */ export declare const SHORT_TO_DIR: Record; /** * Convert a user-typed exit name into the storage key Mudlet / the renderer * expect. Cardinal directions must be their short form ('north' → 'n'), while * special-exit names are preserved. Case-insensitive for the cardinal mapping. */ export declare function normalizeCustomLineKey(name: string): string; export type HitItem = { kind: 'room'; id: number; } | { kind: 'exit'; fromId: number; toId: number; dir: Direction; } | { kind: 'customLine'; roomId: number; exitName: string; } | { kind: 'stub'; roomId: number; dir: Direction; } | { kind: 'label'; id: number; areaId: number; }; export type Selection = { kind: 'room'; ids: number[]; } | { kind: 'exit'; fromId: number; toId: number; dir: Direction; } | { kind: 'customLine'; roomId: number; exitName: string; pointIndex?: number; } | { kind: 'stub'; roomId: number; dir: Direction; } | { kind: 'label'; id: number; areaId: number; } | null; export type HoverTarget = { kind: 'room'; id: number; handleDir: Direction | null; } | { kind: 'exit'; fromId: number; toId: number; dir: Direction; } | { kind: 'customLine'; roomId: number; exitName: string; } | { kind: 'stub'; roomId: number; dir: Direction; } | { kind: 'label'; id: number; areaId: number; } | null; export type PendingDrag = { kind: 'drag'; roomId: number; originX: number; originY: number; /** Origins of other selected rooms for multi-drag; raw Mudlet-space coords. */ multiOrigins?: { id: number; x: number; y: number; }[]; /** Render-space offset from room centre to click point, to avoid jump on drag start. */ offsetX: number; offsetY: number; /** Custom line waypoints at drag start for all dragged rooms, for live translation, cancel restore, and undo. */ customLineSnapshots?: ({ roomId: number; exitName: string; } & CustomLineSnapshot)[]; }; export type PendingConnect = { kind: 'connect'; sourceId: number; /** Direction chosen from a source handle, or null if the drag started on room body. */ sourceDir: Direction | null; cursorMap: { x: number; y: number; } | null; hoverTargetId: number | null; /** Direction on the target picked from a target handle. Null ⇒ use opposite of sourceDir. */ targetDir: Direction | null; }; export type PendingCustomLine = { kind: 'customLine'; roomId: number; /** Normalized storage key (short form for cardinals). */ exitName: string; color: MudletColor; style: number; arrow: boolean; /** Accumulated waypoints in render-space [x, y]. points[0] is the room centre. */ points: [number, number][]; /** Current cursor position for preview. */ cursor: { x: number; y: number; } | null; /** Raw-map snapshot of the customLine under `exitName` before drawing started; null if none. */ previousSnapshot: CustomLineSnapshot | null; /** * Opposite-side stub written on the partner room so the renderer's two-way * skip check fires. Null when drawing "one side only" or when no reciprocal * cardinal exit exists. */ companion: CustomLineCompanion | null; }; /** Metadata + pre-draw snapshot of the partner-room stub used for two-way coverage. */ export type CustomLineCompanion = { roomId: number; /** Short-form cardinal key (e.g. 's' when main side is 'n'). */ exitName: string; previousSnapshot: CustomLineSnapshot | null; }; export type PendingCustomLinePoint = { kind: 'customLinePoint'; roomId: number; exitName: string; pointIndex: number; /** Raw Mudlet-space snapshot of all points before drag, for undo. */ originPoints: [number, number][]; }; export type PendingPickExit = { kind: 'pickExit'; fromId: number; dir: Direction; }; export type PendingPickSpecialExit = { kind: 'pickSpecialExit'; fromId: number; }; /** Generic "click a room to fill a field" pick. `target` identifies which * field/slot requested the pick so the requester can route the result. */ export type PendingPickRoom = { kind: 'pickRoom'; target: string; }; export type LabelResizeHandle = 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w'; export type PendingLabelDrag = { kind: 'labelDrag'; labelId: number; areaId: number; /** Raw Mudlet-space origin (before drag). */ originPos: [number, number, number]; /** Render-space offset from label top-left to click point, to avoid jump on drag start. */ offsetX: number; offsetY: number; }; export type PendingLabelRect = { kind: 'labelRect'; areaId: number; z: number; startX: number; startY: number; currentX: number; currentY: number; }; export type PendingLabelResize = { kind: 'labelResize'; labelId: number; areaId: number; handle: LabelResizeHandle; /** LabelSnapshot.pos of origin (renderX, mudletY, z). */ originPos: [number, number, number]; originSize: [number, number]; }; export type PendingMarquee = { kind: 'marquee'; /** Render-space start corner. */ startX: number; startY: number; /** Render-space current corner (updated on every pointer-move). */ currentX: number; currentY: number; ctrlHeld: boolean; shiftHeld: boolean; /** Room IDs that were selected before the drag began; used for Ctrl toggle / Shift add. */ preExistingIds: number[]; }; export type PendingPaint = { kind: 'paint'; painted: { id: number; prevSymbol: string; prevEnv: number; /** Previous values of the userData keys this swatch touches, for live revert / undo. */ prevUserData: { key: string; from: string | null; }[]; }[]; }; export type PendingPickSwatch = { kind: 'pickSwatch'; }; /** Armed room placement: a ghost preview of `clipboard` follows the cursor; * a click pastes at that spot, Esc / right-click cancels. */ export type PendingPlaceRooms = { kind: 'placeRooms'; clipboard: import('./store').RoomClipboard; }; export type Pending = PendingDrag | PendingConnect | PendingCustomLine | PendingCustomLinePoint | PendingPickExit | PendingPickSpecialExit | PendingPickRoom | PendingMarquee | PendingLabelDrag | PendingLabelRect | PendingLabelResize | PendingPaint | PendingPickSwatch | PendingPlaceRooms | null; export type RoomSnapshot = MudletRoom; export type CustomLineSnapshot = { points: [number, number][]; color: MudletColor; style: number; arrow: boolean; }; /** Opposite-side stub applied alongside a setCustomLine for two-way coverage. */ export type SetCustomLineCompanion = { roomId: number; exitName: string; data: CustomLineSnapshot; previous: CustomLineSnapshot | null; }; export type Command = { kind: 'moveRoom'; id: number; from: { x: number; y: number; z: number; }; to: { x: number; y: number; z: number; }; } | { kind: 'addRoom'; id: number; room: RoomSnapshot; areaId: number; } | { kind: 'deleteRoom'; id: number; room: RoomSnapshot; areaId: number; neighborEdits: NeighborEdit[]; } | { kind: 'renameRoomId'; fromId: number; toId: number; } | { kind: 'addExit'; fromId: number; dir: Direction; toId: number; previous: number; reverse: { fromId: number; dir: Direction; previous: number; } | null; } | { kind: 'removeExit'; fromId: number; dir: Direction; was: number; reverse: { fromId: number; dir: Direction; was: number; } | null; } | { kind: 'removeAllExits'; roomId: number; exits: Array<{ dir: Direction; was: number; reverse: { fromId: number; dir: Direction; was: number; } | null; }>; specialExits: Array<{ name: string; toId: number; }>; } | { kind: 'setRoomField'; id: number; field: 'name' | 'environment' | 'weight' | 'symbol'; from: string | number; to: string | number; } | { kind: 'setRoomHash'; id: number; from: string | null; to: string | null; } | { kind: 'addArea'; id: number; name: string; } | { kind: 'deleteArea'; id: number; name: string; } | { kind: 'deleteAreaWithRooms'; areaId: number; areaName: string; areaSnapshot: any; rooms: Array<{ id: number; room: RoomSnapshot; }>; crossAreaNeighborEdits: NeighborEdit[]; affectedOtherAreaIds: number[]; } | { kind: 'renameArea'; id: number; from: string; to: string; } | { kind: 'setCustomEnvColor'; envId: number; from: MudletColor | null; to: MudletColor | null; } | { kind: 'addSpecialExit'; roomId: number; name: string; toId: number; } | { kind: 'removeSpecialExit'; roomId: number; name: string; toId: number; } | { kind: 'setCustomLine'; roomId: number; exitName: string; data: CustomLineSnapshot; previous: CustomLineSnapshot | null; companion?: SetCustomLineCompanion; } | { kind: 'removeCustomLine'; roomId: number; exitName: string; snapshot: CustomLineSnapshot; } | { kind: 'moveRoomsToArea'; roomIds: number[]; fromAreaId: number; toAreaId: number; } | { kind: 'setRoomLock'; id: number; lock: boolean; } | { kind: 'setDoor'; roomId: number; dir: Direction; from: number; to: number; } | { kind: 'setExitWeight'; roomId: number; dir: Direction; from: number; to: number; } | { kind: 'setExitLock'; roomId: number; dir: Direction; lock: boolean; } | { kind: 'setStub'; roomId: number; dir: Direction; stub: boolean; } | { kind: 'setUserDataEntry'; roomId: number; key: string; from: string | null; to: string | null; } | { kind: 'setAreaUserDataEntry'; areaId: number; key: string; from: string | null; to: string | null; } | { kind: 'setMapUserDataEntry'; key: string; from: string | null; to: string | null; } | { kind: 'setSpecialExitDoor'; roomId: number; name: string; from: number; to: number; } | { kind: 'setSpecialExitWeight'; roomId: number; name: string; from: number; to: number; } | { kind: 'addLabel'; areaId: number; label: LabelSnapshot; } | { kind: 'deleteLabel'; areaId: number; label: LabelSnapshot; } | { kind: 'moveLabel'; areaId: number; id: number; from: [number, number, number]; to: [number, number, number]; } | { kind: 'setLabelText'; areaId: number; id: number; from: string; to: string; } | { kind: 'setLabelSize'; areaId: number; id: number; from: [number, number]; to: [number, number]; } | { kind: 'setLabelColors'; areaId: number; id: number; fromFg: MudletColor; toFg: MudletColor; fromBg: MudletColor; toBg: MudletColor; } | { kind: 'setLabelNoScaling'; areaId: number; id: number; from: boolean; to: boolean; } | { kind: 'setLabelShowOnTop'; areaId: number; id: number; from: boolean; to: boolean; } | { kind: 'setLabelFont'; areaId: number; id: number; from: LabelFont; to: LabelFont; } | { kind: 'setLabelOutlineColor'; areaId: number; id: number; from: MudletColor | undefined; to: MudletColor | undefined; } | { kind: 'setLabelStyle'; areaId: number; id: number; from: string | undefined; to: string | undefined; } | { kind: 'setLabelAlign'; areaId: number; id: number; from: LabelTextAlign | undefined; to: LabelTextAlign | undefined; } | { kind: 'setLabelPixmap'; areaId: number; id: number; from: string; to: string; } | { kind: 'setLabelImageSrc'; areaId: number; id: number; from: string | undefined; to: string | undefined; } | { kind: 'resizeLabel'; areaId: number; id: number; fromPos: [number, number, number]; toPos: [number, number, number]; fromSize: [number, number]; toSize: [number, number]; } | { kind: 'batch'; cmds: Command[]; }; export type NeighborEdit = { roomId: number; dir: Direction; was: number; }; export type LoadedMap = { fileName: string; };