inspector-ng 0.0.13 → 0.0.15

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,"file":"inspector-ng.mjs","sources":["../../../projects/inspector-ng/src/lib/constants.ts","../../../projects/inspector-ng/src/lib/checkpoints.ts","../../../projects/inspector-ng/src/lib/geometry.ts","../../../projects/inspector-ng/src/lib/distances.ts","../../../projects/inspector-ng/src/lib/dom.ts","../../../projects/inspector-ng/src/lib/checkpoint-search.ts","../../../projects/inspector-ng/src/lib/utils.ts","../../../projects/inspector-ng/src/lib/runcat.ts","../../../projects/inspector-ng/src/lib/inspector.component.ts","../../../projects/inspector-ng/src/lib/inspector.component.html","../../../projects/inspector-ng/src/inspector-ng.ts"],"sourcesContent":["export const inspector_STORAGE_KEY = \"inspector-state\";\nexport const inspector_STATE_VERSION = 2;\nexport const GUIDE_SNAP_DISTANCE = 10;\nexport const GUIDE_HITBOX_SIZE = 14;\n","import {\n EnvironmentProviders,\n Inject,\n Injectable,\n InjectionToken,\n Optional,\n PLATFORM_ID,\n makeEnvironmentProviders,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Router } from '@angular/router';\nimport {\n Action,\n ActionReducer,\n META_REDUCERS,\n Store,\n} from '@ngrx/store';\nimport { firstValueFrom, take } from 'rxjs';\n\nexport interface InspectorCheckpointRecord {\n version: 1;\n id: string;\n name: string;\n route: string;\n createdAt: string;\n lastUsedAt?: string;\n state: unknown;\n}\n\ninterface RestoreCheckpointAction extends Action {\n type: typeof RESTORE_CHECKPOINT;\n state: unknown;\n}\n\nconst RESTORE_CHECKPOINT = '[Inspector Checkpoints] Restore';\nconst DATABASE_NAME = 'inspector-ng';\nconst DATABASE_VERSION = 1;\nconst STORE_NAME = 'checkpoints';\n\nexport const INSPECTOR_CHECKPOINT_REPOSITORY =\n new InjectionToken<InspectorCheckpointRepository>('INSPECTOR_CHECKPOINT_REPOSITORY');\n\nexport function inspectorCheckpointMetaReducer<T>(\n reducer: ActionReducer<T>,\n): ActionReducer<T> {\n return (state, action) => {\n if (action.type === RESTORE_CHECKPOINT) {\n return (action as RestoreCheckpointAction).state as T;\n }\n return reducer(state, action);\n };\n}\n\nexport abstract class InspectorCheckpointRepository {\n abstract list(): Promise<InspectorCheckpointRecord[]>;\n abstract put(checkpoint: InspectorCheckpointRecord): Promise<void>;\n abstract delete(id: string): Promise<void>;\n}\n\n@Injectable()\nexport class IndexedDbCheckpointRepository extends InspectorCheckpointRepository {\n private databasePromise: Promise<IDBDatabase> | null = null;\n\n constructor(@Inject(PLATFORM_ID) private readonly platformId: object) {\n super();\n }\n\n async list(): Promise<InspectorCheckpointRecord[]> {\n const database = await this.database();\n const values = await this.request<unknown[]>(\n database.transaction(STORE_NAME, 'readonly').objectStore(STORE_NAME).getAll(),\n );\n return values\n .filter(isCheckpointRecord)\n .sort(recentActivityFirst);\n }\n\n async put(checkpoint: InspectorCheckpointRecord): Promise<void> {\n const database = await this.database();\n await this.transactionComplete(database, 'readwrite', (store) => store.put(checkpoint));\n }\n\n async delete(id: string): Promise<void> {\n const database = await this.database();\n await this.transactionComplete(database, 'readwrite', (store) => store.delete(id));\n }\n\n private database(): Promise<IDBDatabase> {\n if (!isPlatformBrowser(this.platformId) || typeof indexedDB === 'undefined') {\n return Promise.reject(new Error('Checkpoints are only available in a browser with IndexedDB.'));\n }\n if (this.databasePromise) return this.databasePromise;\n\n this.databasePromise = new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n request.onupgradeneeded = () => {\n const database = request.result;\n if (database.objectStoreNames.contains(STORE_NAME)) return;\n const store = database.createObjectStore(STORE_NAME, { keyPath: 'id' });\n store.createIndex('createdAt', 'createdAt');\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('IndexedDB could not be opened.'));\n request.onblocked = () => reject(new Error('IndexedDB is blocked by another open tab.'));\n });\n return this.databasePromise;\n }\n\n private request<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('IndexedDB request failed.'));\n });\n }\n\n private transactionComplete(\n database: IDBDatabase,\n mode: IDBTransactionMode,\n operation: (store: IDBObjectStore) => IDBRequest,\n ): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, mode);\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error ?? new Error('IndexedDB transaction failed.'));\n transaction.onabort = () => reject(transaction.error ?? new Error('IndexedDB transaction was aborted.'));\n operation(transaction.objectStore(STORE_NAME));\n });\n }\n}\n\n@Injectable()\nexport class InspectorCheckpointService {\n readonly checkpoints = signal<InspectorCheckpointRecord[]>([]);\n readonly loading = signal(false);\n readonly busy = signal(false);\n readonly error = signal<string | null>(null);\n\n constructor(\n @Inject(INSPECTOR_CHECKPOINT_REPOSITORY)\n private readonly repository: InspectorCheckpointRepository,\n @Optional() @Inject(Store) private readonly store: Store | null,\n @Optional() @Inject(Router) private readonly router: Router | null,\n @Inject(PLATFORM_ID) private readonly platformId: object,\n ) {}\n\n async load(): Promise<void> {\n this.error.set(null);\n this.loading.set(true);\n try {\n this.checkpoints.set((await this.repository.list()).sort(recentActivityFirst));\n } catch (error) {\n this.error.set(this.messageFor(error, 'Saved checkpoints could not be loaded. Try reloading the page.'));\n } finally {\n this.loading.set(false);\n }\n }\n\n async save(): Promise<InspectorCheckpointRecord | null> {\n this.error.set(null);\n if (!this.store) {\n this.error.set(this.missingStoreMessage());\n return null;\n }\n\n this.busy.set(true);\n try {\n const currentState = await firstValueFrom(this.store.pipe(take(1)));\n const state = cloneJson(currentState);\n const persisted = await this.repository.list();\n const route = this.currentRoute();\n const pathname = this.currentPathname();\n const checkpoint: InspectorCheckpointRecord = {\n version: 1,\n id: createCheckpointId(),\n name: nextAutomaticName(pathname, persisted.map(({ name }) => name)),\n route,\n createdAt: new Date().toISOString(),\n state,\n };\n await this.repository.put(checkpoint);\n this.checkpoints.set([checkpoint, ...persisted].sort(recentActivityFirst));\n return checkpoint;\n } catch (error) {\n this.error.set(this.storageMessage(error, 'The checkpoint could not be saved.'));\n return null;\n } finally {\n this.busy.set(false);\n }\n }\n\n async restore(id: string): Promise<boolean> {\n this.error.set(null);\n if (!this.store) {\n this.error.set(this.missingStoreMessage());\n return false;\n }\n this.busy.set(true);\n try {\n const checkpoints = await this.repository.list();\n const checkpoint = checkpoints.find((item) => item.id === id);\n if (!checkpoint) throw new Error('Checkpoint not found. It may have been deleted in another tab.');\n const state = cloneJson(\n checkpoint.state,\n `“${checkpoint.name}” could not be decoded. Delete it and save a new checkpoint.`,\n );\n this.store.dispatch({ type: RESTORE_CHECKPOINT, state } as RestoreCheckpointAction);\n if (\n this.router &&\n this.router.url !== checkpoint.route &&\n !await this.router.navigateByUrl(checkpoint.route)\n ) {\n throw new Error(`The state was restored, but navigation to “${checkpoint.route}” was cancelled.`);\n }\n const recentlyUsedCheckpoint = {\n ...checkpoint,\n lastUsedAt: new Date().toISOString(),\n };\n await this.repository.put(recentlyUsedCheckpoint);\n this.checkpoints.set(\n checkpoints\n .map((item) => item.id === id ? recentlyUsedCheckpoint : item)\n .sort(recentActivityFirst),\n );\n return true;\n } catch (error) {\n this.error.set(this.messageFor(error, 'The checkpoint could not be restored. Delete it and save a new one.'));\n return false;\n } finally {\n this.busy.set(false);\n }\n }\n\n async rename(id: string, name: string): Promise<boolean> {\n this.error.set(null);\n const nextName = name.trim();\n if (!nextName) {\n this.error.set('Please enter a checkpoint name.');\n return false;\n }\n\n this.busy.set(true);\n try {\n const checkpoints = await this.repository.list();\n if (checkpoints.some((item) => item.id !== id && item.name.toLocaleLowerCase() === nextName.toLocaleLowerCase())) {\n throw new Error(`A checkpoint named “${nextName}” already exists. Choose a different name.`);\n }\n const checkpoint = checkpoints.find((item) => item.id === id);\n if (!checkpoint) throw new Error('Checkpoint not found. It may have been deleted in another tab.');\n await this.repository.put({ ...checkpoint, name: nextName });\n this.checkpoints.set(\n checkpoints.map((item) => item.id === id ? { ...item, name: nextName } : item).sort(recentActivityFirst),\n );\n return true;\n } catch (error) {\n this.error.set(this.storageMessage(error, 'The checkpoint could not be renamed.'));\n return false;\n } finally {\n this.busy.set(false);\n }\n }\n\n async delete(id: string): Promise<boolean> {\n this.error.set(null);\n this.busy.set(true);\n try {\n await this.repository.delete(id);\n this.checkpoints.set(this.checkpoints().filter((item) => item.id !== id));\n return true;\n } catch (error) {\n this.error.set(this.storageMessage(error, 'The checkpoint could not be deleted.'));\n return false;\n } finally {\n this.busy.set(false);\n }\n }\n\n clearError(): void {\n this.error.set(null);\n }\n\n private currentRoute(): string {\n if (!isPlatformBrowser(this.platformId)) return '/';\n return `${this.currentPathname()}${window.location.search}${window.location.hash}`;\n }\n\n private currentPathname(): string {\n if (!isPlatformBrowser(this.platformId)) return '/';\n return window.location.pathname || '/';\n }\n\n private missingStoreMessage(): string {\n return 'The NgRx root store is unavailable. Check that provideInspectorCheckpoints() is registered after provideStore().';\n }\n\n private storageMessage(error: unknown, fallback: string): string {\n if (isQuotaError(error)) {\n return 'Browser storage is full. Delete old checkpoints, then try saving again.';\n }\n return this.messageFor(error, fallback);\n }\n\n private messageFor(error: unknown, fallback: string): string {\n return error instanceof Error && error.message ? error.message : fallback;\n }\n}\n\nexport function provideInspectorCheckpoints(): EnvironmentProviders {\n return makeEnvironmentProviders([\n IndexedDbCheckpointRepository,\n {\n provide: INSPECTOR_CHECKPOINT_REPOSITORY,\n useExisting: IndexedDbCheckpointRepository,\n },\n InspectorCheckpointService,\n {\n provide: META_REDUCERS,\n multi: true,\n useValue: inspectorCheckpointMetaReducer,\n },\n ]);\n}\n\nexport function nextAutomaticName(route: string, names: string[]): string {\n const used = new Set(names.map((name) => name.toLocaleLowerCase()));\n if (!used.has(route.toLocaleLowerCase())) return route;\n for (let suffix = 2; ; suffix += 1) {\n const candidate = `${route} ${suffix}`;\n if (!used.has(candidate.toLocaleLowerCase())) return candidate;\n }\n}\n\nfunction cloneJson(\n value: unknown,\n failureMessage = 'The NgRx root state is not JSON-serializable. Remove circular or unsupported values and try again.',\n): unknown {\n try {\n const serialized = JSON.stringify(value);\n if (serialized === undefined) throw new Error();\n return JSON.parse(serialized) as unknown;\n } catch {\n throw new Error(failureMessage);\n }\n}\n\nfunction createCheckpointId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return `checkpoint-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction isQuotaError(error: unknown): boolean {\n return error instanceof DOMException && (\n error.name === 'QuotaExceededError' || error.name === 'NS_ERROR_DOM_QUOTA_REACHED'\n );\n}\n\nexport function checkpointActivityAt(checkpoint: InspectorCheckpointRecord): string {\n return checkpoint.lastUsedAt && checkpoint.lastUsedAt > checkpoint.createdAt\n ? checkpoint.lastUsedAt\n : checkpoint.createdAt;\n}\n\nexport function recentActivityFirst(\n a: InspectorCheckpointRecord,\n b: InspectorCheckpointRecord,\n): number {\n return checkpointActivityAt(b).localeCompare(checkpointActivityAt(a)) ||\n b.createdAt.localeCompare(a.createdAt) ||\n b.id.localeCompare(a.id);\n}\n\nfunction isCheckpointRecord(value: unknown): value is InspectorCheckpointRecord {\n if (!value || typeof value !== 'object') return false;\n const checkpoint = value as Partial<InspectorCheckpointRecord>;\n return checkpoint.version === 1 &&\n typeof checkpoint.id === 'string' &&\n typeof checkpoint.name === 'string' &&\n typeof checkpoint.route === 'string' &&\n typeof checkpoint.createdAt === 'string' &&\n (checkpoint.lastUsedAt === undefined || typeof checkpoint.lastUsedAt === 'string') &&\n 'state' in checkpoint;\n}\n","import { Rect } from './types';\n\nexport const clamp = (value: number, min: number, max: number) =>\n Math.max(min, Math.min(max, value));\n\nexport const getViewportSize = () => ({\n width: typeof window === 'undefined' ? 1 : window.innerWidth || 1,\n height: typeof window === 'undefined' ? 1 : window.innerHeight || 1,\n});\n\nexport const rectContainsPoint = (\n rect: Rect,\n point: { x: number; y: number },\n) =>\n point.x >= rect.left &&\n point.x <= rect.left + rect.width &&\n point.y >= rect.top &&\n point.y <= rect.top + rect.height;\n\nexport const rectsEqual = (a: Rect | null, b: Rect | null, epsilon = 0.5) => {\n if (a === b) {\n return true;\n }\n\n if (!a || !b) {\n return false;\n }\n\n return (\n Math.abs(a.left - b.left) < epsilon &&\n Math.abs(a.top - b.top) < epsilon &&\n Math.abs(a.width - b.width) < epsilon &&\n Math.abs(a.height - b.height) < epsilon\n );\n};\n","import { clamp, getViewportSize } from './geometry';\nimport { DistanceOverlay, Rect } from './types';\n\nexport const getDistanceOverlay = (rectA: Rect, rectB: Rect): DistanceOverlay => {\n const rightA = rectA.left + rectA.width;\n const bottomA = rectA.top + rectA.height;\n const rightB = rectB.left + rectB.width;\n const bottomB = rectB.top + rectB.height;\n const centerAX = rectA.left + rectA.width / 2;\n const centerAY = rectA.top + rectA.height / 2;\n\n let horizontal: DistanceOverlay['horizontal'] = null;\n let vertical: DistanceOverlay['vertical'] = null;\n const connectors: DistanceOverlay['connectors'] = [];\n\n const separatedX = rightA <= rectB.left || rightB <= rectA.left;\n const separatedY = bottomA <= rectB.top || bottomB <= rectA.top;\n\n if (separatedX) {\n const aIsLeft = rightA <= rectB.left;\n const x1 = aIsLeft ? rightA : rightB;\n const x2 = aIsLeft ? rectB.left : rectA.left;\n const y = centerAY;\n horizontal = { x1, x2, y, value: Math.abs(x2 - x1) };\n\n const edgeBX = aIsLeft ? rectB.left : rightB;\n if (y < rectB.top) {\n connectors.push({ x1: edgeBX, y1: y, x2: edgeBX, y2: rectB.top });\n } else if (y > bottomB) {\n connectors.push({ x1: edgeBX, y1: y, x2: edgeBX, y2: bottomB });\n }\n }\n\n if (separatedY) {\n const aIsTop = bottomA <= rectB.top;\n const y1 = aIsTop ? bottomA : bottomB;\n const y2 = aIsTop ? rectB.top : rectA.top;\n const x = centerAX;\n vertical = { y1, y2, x, value: Math.abs(y2 - y1) };\n\n const edgeBY = aIsTop ? rectB.top : bottomB;\n if (x < rectB.left) {\n connectors.push({ x1: x, y1: edgeBY, x2: rectB.left, y2: edgeBY });\n } else if (x > rightB) {\n connectors.push({ x1: x, y1: edgeBY, x2: rightB, y2: edgeBY });\n }\n }\n\n const viewport = getViewportSize();\n\n return {\n rectA,\n rectB,\n horizontal,\n vertical,\n connectors: connectors\n .map((segment) => ({\n x1: clamp(segment.x1, 0, viewport.width),\n y1: clamp(segment.y1, 0, viewport.height),\n x2: clamp(segment.x2, 0, viewport.width),\n y2: clamp(segment.y2, 0, viewport.height),\n }))\n .filter(\n (segment) =>\n Math.abs(segment.x1 - segment.x2) > 0.5 ||\n Math.abs(segment.y1 - segment.y2) > 0.5,\n ),\n };\n};\n","import { InspectMeasurement, Rect, TextBlockAnnotation, TextInspection } from './types';\n\nexport const getRectFromDom = (element: Element): Rect => {\n const rect = element.getBoundingClientRect();\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n };\n};\n\nexport const getElementLabel = (element: HTMLElement) => {\n const tag = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : '';\n const className = element.className\n ? `.${element.className.toString().split(' ')[0]}`\n : '';\n return `${tag}${id}${className}`;\n};\n\nconst toHex = (value: number) => value.toString(16).padStart(2, '0');\n\nconst normalizeColorToHex = (color: string) => {\n const trimmed = color.trim().toLowerCase();\n if (trimmed.startsWith('#')) {\n if (trimmed.length === 4) {\n return `#${trimmed[1]}${trimmed[1]}${trimmed[2]}${trimmed[2]}${trimmed[3]}${trimmed[3]}`;\n }\n return trimmed;\n }\n\n const rgbMatch = trimmed.match(\n /^rgba?\\(\\s*([0-9.]+)\\s*,\\s*([0-9.]+)\\s*,\\s*([0-9.]+)(?:\\s*,\\s*[0-9.]+\\s*)?\\)$/,\n );\n if (!rgbMatch) {\n return color;\n }\n\n const [, r, g, b] = rgbMatch;\n return `#${toHex(Math.round(Number(r)))}${toHex(Math.round(Number(g)))}${toHex(Math.round(Number(b)))}`;\n};\n\nexport const getTextInspection = (element: HTMLElement): TextInspection => {\n const style = window.getComputedStyle(element);\n return {\n fontFamily: style.fontFamily,\n fontSize: style.fontSize,\n fontWeight: style.fontWeight,\n lineHeight: style.lineHeight,\n letterSpacing: style.letterSpacing,\n color: normalizeColorToHex(style.color),\n textAlign: style.textAlign,\n };\n};\n\nconst parseEdge = (value: string) => Number.parseFloat(value) || 0;\n\nexport const getInspectMeasurement = (element: HTMLElement): InspectMeasurement => {\n const rect = getRectFromDom(element);\n const style = window.getComputedStyle(element);\n const parentElement = element.parentElement;\n const parentStyle = parentElement ? window.getComputedStyle(parentElement) : null;\n const padding = {\n top: parseEdge(style.paddingTop),\n right: parseEdge(style.paddingRight),\n bottom: parseEdge(style.paddingBottom),\n left: parseEdge(style.paddingLeft),\n };\n const margin = {\n top: parseEdge(style.marginTop),\n right: parseEdge(style.marginRight),\n bottom: parseEdge(style.marginBottom),\n left: parseEdge(style.marginLeft),\n };\n const rowGap = parentStyle ? parseEdge(parentStyle.rowGap) : 0;\n const columnGap = parentStyle ? parseEdge(parentStyle.columnGap) : 0;\n const parentDisplay = parentStyle?.display ?? '';\n const hasGap =\n !!parentElement &&\n (parentDisplay.includes('flex') || parentDisplay.includes('grid')) &&\n (rowGap > 0 || columnGap > 0);\n\n return {\n rect,\n paddingRect: {\n left: rect.left + padding.left,\n top: rect.top + padding.top,\n width: Math.max(0, rect.width - padding.left - padding.right),\n height: Math.max(0, rect.height - padding.top - padding.bottom),\n },\n marginRect: {\n left: rect.left - margin.left,\n top: rect.top - margin.top,\n width: rect.width + margin.left + margin.right,\n height: rect.height + margin.top + margin.bottom,\n },\n padding,\n margin,\n gap: {\n row: rowGap,\n column: columnGap,\n active: hasGap,\n },\n parentRect: hasGap && parentElement ? getRectFromDom(parentElement) : null,\n label: getElementLabel(element),\n styles: getTextInspection(element),\n };\n};\n\nconst isVisibleTextCandidate = (element: HTMLElement) => {\n const text = element.innerText?.trim() ?? '';\n if (!text) {\n return false;\n }\n\n const style = window.getComputedStyle(element);\n if (\n style.display === 'none' ||\n style.visibility === 'hidden' ||\n Number.parseFloat(style.opacity || '1') === 0\n ) {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n if (rect.width < 8 || rect.height < 8) {\n return false;\n }\n\n for (const child of Array.from(element.children)) {\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n if ((child.innerText?.trim() ?? '') && child.getBoundingClientRect().height > 0) {\n return false;\n }\n }\n\n return true;\n};\n\nexport const getVisibleTextBlocks = (\n overlayElement: HTMLElement | null,\n limit = 160,\n): TextBlockAnnotation[] => {\n if (typeof document === 'undefined') {\n return [];\n }\n\n const nodes = Array.from(document.querySelectorAll('body *'));\n const blocks: TextBlockAnnotation[] = [];\n\n for (const node of nodes) {\n if (!(node instanceof HTMLElement)) {\n continue;\n }\n if (overlayElement && overlayElement.contains(node)) {\n continue;\n }\n if (!isVisibleTextCandidate(node)) {\n continue;\n }\n\n const rect = getRectFromDom(node);\n const text = (node.innerText || node.textContent || '').replace(/\\s+/g, ' ').trim();\n blocks.push({\n id: `${node.tagName.toLowerCase()}-${Math.round(rect.left)}-${Math.round(rect.top)}-${text.slice(0, 24)}`,\n rect,\n text,\n styles: getTextInspection(node),\n });\n\n if (blocks.length >= limit) {\n break;\n }\n }\n\n return blocks;\n};\n\nexport const getTargetElement = (\n point: { x: number; y: number },\n overlayElement: HTMLElement | null,\n) => {\n if (typeof document === 'undefined') {\n return null;\n }\n\n if (overlayElement) {\n const previous = overlayElement.style.pointerEvents;\n overlayElement.style.pointerEvents = 'none';\n const elements = document.elementsFromPoint(point.x, point.y);\n overlayElement.style.pointerEvents = previous;\n\n for (const element of elements) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (overlayElement.contains(element)) {\n continue;\n }\n if (element === document.body || element === document.documentElement) {\n continue;\n }\n const rect = element.getBoundingClientRect();\n if (rect.width <= 2 || rect.height <= 2) {\n continue;\n }\n return element;\n }\n\n return null;\n }\n\n return document.elementFromPoint(point.x, point.y) as HTMLElement | null;\n};\n","import {\n InspectorCheckpointRecord,\n recentActivityFirst,\n} from './checkpoints';\n\ninterface RankedCheckpoint {\n checkpoint: InspectorCheckpointRecord;\n score: number;\n}\n\nexport function fuzzyCheckpoints(\n checkpoints: InspectorCheckpointRecord[],\n query: string,\n): InspectorCheckpointRecord[] {\n const normalizedQuery = normalize(query.trim());\n if (!normalizedQuery) return [...checkpoints].sort(recentActivityFirst);\n\n return checkpoints\n .map((checkpoint): RankedCheckpoint | null => {\n const score = fuzzyScore(checkpoint.name, normalizedQuery);\n return score === null ? null : { checkpoint, score };\n })\n .filter((item): item is RankedCheckpoint => item !== null)\n .sort((a, b) => b.score - a.score || recentActivityFirst(a.checkpoint, b.checkpoint))\n .map(({ checkpoint }) => checkpoint);\n}\n\nexport function fuzzyScore(value: string, normalizedQuery: string): number | null {\n const candidate = normalize(value);\n if (candidate === normalizedQuery) return 10_000;\n if (candidate.startsWith(normalizedQuery)) return 8_000 - candidate.length;\n\n const substringIndex = candidate.indexOf(normalizedQuery);\n if (substringIndex >= 0) return 6_000 - substringIndex * 10 - candidate.length;\n\n let queryIndex = 0;\n let firstIndex = -1;\n let lastIndex = -1;\n let gapPenalty = 0;\n for (let index = 0; index < candidate.length && queryIndex < normalizedQuery.length; index += 1) {\n if (candidate[index] !== normalizedQuery[queryIndex]) continue;\n if (firstIndex < 0) firstIndex = index;\n if (lastIndex >= 0) gapPenalty += index - lastIndex - 1;\n lastIndex = index;\n queryIndex += 1;\n }\n if (queryIndex !== normalizedQuery.length) return null;\n return 4_000 - firstIndex * 10 - gapPenalty * 20 - candidate.length;\n}\n\nfunction normalize(value: string): string {\n return value\n .normalize('NFKD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLocaleLowerCase();\n}\n","export const createId = () =>\n typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID()\n : `${Date.now()}-${Math.random()}`;\n\nexport const formatValue = (value: number) => Math.round(value);\n\n/** Ultra-compact relative time for dense command-palette metadata. */\nexport const formatRelativeTime = (iso: string, now = Date.now()): string => {\n const then = Date.parse(iso);\n if (Number.isNaN(then)) {\n return '';\n }\n\n const seconds = Math.round((now - then) / 1000);\n if (seconds < 45) {\n return 'now';\n }\n if (seconds < 90) {\n return '1m';\n }\n\n const minutes = Math.round(seconds / 60);\n if (minutes < 60) {\n return `${minutes}m`;\n }\n\n const hours = Math.round(minutes / 60);\n if (hours < 24) {\n return `${hours}h`;\n }\n\n const days = Math.round(hours / 24);\n if (days < 30) {\n return `${days}d`;\n }\n\n const months = Math.round(days / 30);\n if (months < 12) {\n return `${months}mo`;\n }\n\n return `${Math.round(months / 12)}y`;\n};\n","/**\n * RunCat frames from Jas0nG/RunCat_for_Linux, licensed under Apache-2.0.\n * The original ICO frames were converted into a WebP sprite sheet.\n * See the packaged THIRD_PARTY_NOTICES.md for attribution.\n */\nexport const RUNCAT_SPRITE_SRC = 'data:image/webp;base64,UklGRhoEAABXRUJQVlA4TA4EAAAvn8AHEAUcSZLDNvP/T3cA4ADJduQkggKy/YvjiK9uK/WGMPWQyvld3Xvu7rrGEdaou67W3d1dV4cQQl1Xpu6pexvCSlgZ3glI//ZNYyW7wPl3yfF98symzxgCPrOcU2DQnyUNxsnyyLLPuCjBBrA88OlHtFYhJjli1sYyFQCvv79MS70+YpCLvlcGRfwfMUjAGqgCeBmLXtLkuOqibRI0v+B0W4kxFgjZtrHJK/cEAWVivokbViQ5tr2zj88GAJD4CX5AQfLMIhF2pZSkYc+WpvmI3zIJEHbEiM3KJVEQZl0wTFD/nZ4CDphlkaAjzzRXBhjhY3Dx8DzTQRYAJodHjolBSsnn0nzNLYJhiHmAVwYkUb4X4+3Fl3AMwoASdU8pJVtg3IgHHiRT5OhwwfCjRB8urltmFMBv3DN7AOiXYJgVrAdc0phKnGCxcfYsTXXiA+R5AcBFHh18C0BR4mWJ8/8o8cMIWfZI1Hgj1XXJNtgm4JV+E83FMNkAFPEYZAsE4BEbLj/wrwMuOmaVUwAg6AkAc3Ya+tgUW+xRwLRHlm9Nwy3b+6OULMBcCcNVG5ITMx9idc+AlJIfYYMcgGmG+idvWiaEsV1JkeuWiBkxfG+EZGdwydIwpaSTGDl4zrKIO13adrF1ZMa3AXjU9yUANpMNm5KfXTWHI2lskC24dcqHQjIS78CHfLhXYZG6KaUkFWBZIdXP+umnF7fLV7akuQ7GsfBQgHPka5w9AgB/JmETjPC9fwF4IAyA1yz2CIBHgg4s6id1DWMCTKkyLtzkTFt1ddEy7XX36AqKvDnxszAeCng7jbV1e7DlMwe6iLEteVMeAJYR3k5J+AbgSikJCAsAsM+7KXFemJJuOWRg7BnfAvj6JBVPVfGJG0nAUx+mlLTl4kirDTO2mzZxp5SSI4CAWbqnlBKnqpnkG32UYajGKVM0Tz5nLqYdjMDZK0VesVWxhTYAZEx0f2JMGmvp8sQsRjqK0jgdmTs5pvED0OtCT2HsLZMo2YecaWsAyyNd0tEquGiGRGFAjWQRSQSDg6G57nYslojRZyJiccQuVQPL/KxLuuQeCKSn9mxMSUkUG46kObcawCovAFX+TnNN01mUASkZATjBlYZ+dw+wL81tAkxLicOPZinwaCMrXXtzIO8NCx4oA3ybkgTAoAsJUMDNLQzXdUofBRxIc41lKYNRM20B76etpkILBM240ZpX6GDNG5PAEuEMPFM3SXXd3+lSfY6UHIInotJPdxk8u2QSoMo9wJmblDQXA3giRhkseqMhYECywzn102OXoXv68fZAn0NyGap04tQzvTTDOp2SI+B/k/wOaJ1+dQ6D0plDCHLSe70Axpsk0VU9f7e5XoJeaPou+dUiLR/9ywY=';\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n Inject,\n Input,\n OnDestroy,\n PLATFORM_ID,\n computed,\n effect,\n inject,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n GUIDE_HITBOX_SIZE,\n GUIDE_SNAP_DISTANCE,\n inspector_STATE_VERSION,\n inspector_STORAGE_KEY,\n} from './constants';\nimport {\n getInspectMeasurement,\n getRectFromDom,\n getTargetElement,\n getVisibleTextBlocks,\n} from './dom';\nimport { getDistanceOverlay } from './distances';\nimport { clamp, getViewportSize, rectsEqual } from './geometry';\nimport {\n DistanceOverlay,\n Guide,\n GuideOrientation,\n InspectMeasurement,\n inspectorLegacyPersistedState,\n inspectorPersistedState,\n Rect,\n TextBlockAnnotation,\n ToolMode,\n} from './types';\nimport {\n checkpointActivityAt,\n InspectorCheckpointRecord,\n InspectorCheckpointService,\n} from './checkpoints';\nimport { fuzzyCheckpoints } from './checkpoint-search';\nimport { createId, formatRelativeTime, formatValue } from './utils';\nimport { RUNCAT_SPRITE_SRC } from './runcat';\n\ntype InspectorCommandActionId = 'select' | 'type' | 'save' | 'vertical' | 'horizontal' | 'off';\n\ninterface InspectorCommandAction {\n readonly id: InspectorCommandActionId;\n readonly label: string;\n readonly ariaLabel: string;\n readonly keywords: string;\n}\n\nconst INSPECTOR_COMMAND_ACTIONS: readonly InspectorCommandAction[] = [\n { id: 'save', label: 'Save', ariaLabel: 'Save checkpoint', keywords: 'save checkpoint capture state' },\n { id: 'select', label: 'Select', ariaLabel: 'Select mode', keywords: 'select inspect pointer element' },\n { id: 'type', label: 'Type', ariaLabel: 'Toggle typography overlay', keywords: 'type typography text overlay' },\n { id: 'vertical', label: 'V', ariaLabel: 'Vertical guides', keywords: 'vertical v guide guides' },\n { id: 'horizontal', label: 'H', ariaLabel: 'Horizontal guides', keywords: 'horizontal h guide guides' },\n { id: 'off', label: 'Off', ariaLabel: 'Disable inspector', keywords: 'off disable inspector power' },\n];\n\n@Component({\n selector: 'inspector-overlay',\n standalone: true,\n imports: [],\n templateUrl: './inspector.component.html',\n styleUrl: './inspector.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class inspectorComponent implements OnDestroy {\n readonly Math = Math;\n readonly runcatSpriteSrc = RUNCAT_SPRITE_SRC;\n readonly checkpointActivityAt = checkpointActivityAt;\n readonly formatValue = formatValue;\n readonly formatRelativeTime = formatRelativeTime;\n readonly guideHitboxSize = GUIDE_HITBOX_SIZE;\n readonly overlayRoot = viewChild<ElementRef<HTMLElement>>('overlayRoot');\n readonly checkpointDialog = viewChild<ElementRef<HTMLDialogElement>>('checkpointDialog');\n readonly checkpointSearch = viewChild<ElementRef<HTMLInputElement>>('checkpointSearch');\n\n @Input() highlightColor = '#4f8cff';\n @Input() guideColor = '#ff7a00';\n @Input() hoverHighlightEnabled = true;\n @Input() persistOnReload = false;\n\n readonly checkpointService = inject(InspectorCheckpointService, { optional: true });\n readonly commandBarOpen = signal(false);\n readonly checkpointQuery = signal('');\n readonly activeCommandIndex = signal(0);\n readonly editingCheckpointId = signal<string | null>(null);\n readonly deletingCheckpointId = signal<string | null>(null);\n readonly renameDraft = signal('');\n readonly checkpointToast = signal<string | null>(null);\n readonly checkpointToastIsError = signal(false);\n readonly filteredCheckpoints = computed(() =>\n fuzzyCheckpoints(\n this.checkpointService?.checkpoints() ?? [],\n this.checkpointQuery(),\n ),\n );\n readonly filteredInspectorActions = computed(() => {\n const terms = this.checkpointQuery().trim().toLocaleLowerCase().split(/\\s+/).filter(Boolean);\n if (!terms.length) return INSPECTOR_COMMAND_ACTIONS;\n return INSPECTOR_COMMAND_ACTIONS.filter((action) => {\n const searchableText = `${action.label} ${action.ariaLabel} ${action.keywords}`.toLocaleLowerCase();\n return terms.every((term) => searchableText.includes(term));\n });\n });\n readonly commandResultCount = computed(\n () => this.filteredCheckpoints().length + this.filteredInspectorActions().length,\n );\n readonly activeCommandResultId = computed(() => {\n const checkpoint = this.filteredCheckpoints()[this.activeCommandIndex()];\n if (checkpoint) return `inspector-checkpoint-${checkpoint.id}`;\n const actionIndex = this.activeCommandIndex() - this.filteredCheckpoints().length;\n const action = this.filteredInspectorActions()[actionIndex];\n return action ? `inspector-action-${action.id}` : null;\n });\n\n readonly enabled = signal(true);\n readonly toolMode = signal<ToolMode>('none');\n readonly guideOrientation = signal<GuideOrientation>('vertical');\n readonly guides = signal<Guide[]>([]);\n readonly hoverRect = signal<Rect | null>(null);\n readonly selectedGuideId = signal<string | null>(null);\n readonly selectedMeasurement = signal<InspectMeasurement | null>(null);\n readonly showTypography = signal(false);\n readonly altPressed = signal(false);\n readonly distanceOverlay = signal<DistanceOverlay | null>(null);\n readonly textBlocks = signal<TextBlockAnnotation[]>([]);\n readonly guidePreview = signal<Guide | null>(null);\n\n readonly selectedMetaLine = computed(() => {\n const selected = this.selectedMeasurement();\n if (!selected) {\n return '';\n }\n return `${selected.label} · ${formatValue(selected.rect.width)} x ${formatValue(selected.rect.height)} · ${selected.styles.fontSize} / ${selected.styles.lineHeight} / ${selected.styles.color}`;\n });\n\n private readonly isBrowser: boolean;\n private readonly hydrated = signal(false);\n private readonly history = signal<Guide[][]>([]);\n private readonly historyIndex = signal(-1);\n private readonly handleCapturedClick = (event: MouseEvent) => {\n if (\n !event.shiftKey ||\n !this.canInspectClick(event) ||\n !this.selectElementAtPoint(event)\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n };\n private draggingGuideId: string | null = null;\n private selectedElement: HTMLElement | null = null;\n private hoverElement: HTMLElement | null = null;\n private toastTimer: ReturnType<typeof setTimeout> | null = null;\n\n readonly canUndo = computed(() => this.historyIndex() > 0);\n readonly canRedo = computed(\n () =>\n this.historyIndex() >= 0 &&\n this.historyIndex() < this.history().length - 1,\n );\n\n constructor(@Inject(PLATFORM_ID) platformId: object) {\n this.isBrowser = isPlatformBrowser(platformId);\n\n effect(() => {\n if (!this.persistOnReload || !this.isBrowser || !this.hydrated()) {\n return;\n }\n\n const payload: inspectorPersistedState = {\n version: inspector_STATE_VERSION,\n enabled: this.enabled(),\n toolMode: this.toolMode(),\n guideOrientation: this.guideOrientation(),\n guides: this.guides(),\n showTypography: this.showTypography(),\n };\n\n window.localStorage.setItem(\n inspector_STORAGE_KEY,\n JSON.stringify(payload),\n );\n });\n }\n\n ngOnInit() {\n if (!this.isBrowser) {\n this.hydrated.set(true);\n return;\n }\n\n window.addEventListener('click', this.handleCapturedClick, {\n capture: true,\n });\n\n if (!this.persistOnReload) {\n this.hydrated.set(true);\n return;\n }\n\n const stored = window.localStorage.getItem(inspector_STORAGE_KEY);\n if (!stored) {\n this.hydrated.set(true);\n return;\n }\n\n try {\n const parsed = JSON.parse(stored) as\n | inspectorPersistedState\n | inspectorLegacyPersistedState;\n if (parsed.version === inspector_STATE_VERSION || parsed.version === 1) {\n this.enabled.set(true);\n this.toolMode.set(parsed.toolMode);\n this.guideOrientation.set(parsed.guideOrientation);\n this.guides.set(parsed.guides ?? []);\n this.showTypography.set(\n parsed.version === 1 ? false : (parsed.showTypography ?? false),\n );\n this.recordHistory(parsed.guides ?? []);\n }\n } catch {\n // ignore malformed state\n }\n\n this.hydrated.set(true);\n this.refreshTypographyBlocks();\n }\n\n ngOnDestroy() {\n if (!this.isBrowser) {\n return;\n }\n\n window.removeEventListener('click', this.handleCapturedClick, {\n capture: true,\n });\n if (this.toastTimer) clearTimeout(this.toastTimer);\n }\n\n setToolMode(mode: ToolMode) {\n if (!this.enabled()) {\n this.enabled.set(true);\n }\n\n this.toolMode.set(this.toolMode() === mode ? 'none' : mode);\n this.hoverRect.set(null);\n this.guidePreview.set(null);\n this.distanceOverlay.set(null);\n this.refreshTypographyBlocks();\n }\n\n setGuideOrientation(orientation: GuideOrientation) {\n this.guideOrientation.set(orientation);\n this.guidePreview.set(null);\n }\n\n activateGuideOrientation(orientation: GuideOrientation) {\n const isActive = this.toolMode() === 'guides' && this.guideOrientation() === orientation;\n this.setGuideOrientation(orientation);\n if (isActive || this.toolMode() !== 'guides') {\n this.setToolMode('guides');\n }\n }\n\n toggleTypography() {\n this.showTypography.update((value) => !value);\n this.refreshTypographyBlocks();\n }\n\n disableInspector() {\n this.setInspectorEnabled(false);\n }\n\n async saveCheckpoint() {\n const checkpoint = await this.checkpointService?.save();\n if (checkpoint) {\n this.showCheckpointToast(`Saved “${checkpoint.name}”.`);\n } else if (this.checkpointService?.error()) {\n this.showCheckpointToast(this.checkpointService.error()!, true);\n }\n }\n\n async openCheckpointCommandBar() {\n if (!this.checkpointService || !this.isBrowser || this.commandBarOpen()) return;\n this.commandBarOpen.set(true);\n this.checkpointQuery.set('');\n this.activeCommandIndex.set(0);\n this.editingCheckpointId.set(null);\n this.deletingCheckpointId.set(null);\n this.checkpointService.clearError();\n this.checkpointDialog()?.nativeElement.showModal();\n queueMicrotask(() => this.checkpointSearch()?.nativeElement.focus());\n await this.checkpointService.load();\n this.clampActiveCommand();\n }\n\n closeCheckpointCommandBar() {\n if (this.checkpointService?.busy()) return;\n this.checkpointDialog()?.nativeElement.close();\n this.commandBarOpen.set(false);\n this.editingCheckpointId.set(null);\n this.deletingCheckpointId.set(null);\n }\n\n updateCheckpointQuery(event: Event) {\n this.checkpointQuery.set((event.target as HTMLInputElement).value);\n this.activeCommandIndex.set(0);\n this.editingCheckpointId.set(null);\n this.deletingCheckpointId.set(null);\n this.checkpointService?.clearError();\n }\n\n setActiveCheckpoint(index: number) {\n this.activeCommandIndex.set(index);\n }\n\n shouldShowCheckpointRoute(checkpoint: InspectorCheckpointRecord) {\n if (!checkpoint.route.trim()) return false;\n return this.normalizeCheckpointLabel(checkpoint.name) !== this.normalizeCheckpointLabel(checkpoint.route);\n }\n\n setActiveInspectorAction(index: number) {\n this.activeCommandIndex.set(this.filteredCheckpoints().length + index);\n }\n\n async executeInspectorAction(action: InspectorCommandAction) {\n if (this.checkpointService?.busy()) return;\n switch (action.id) {\n case 'select':\n this.setToolMode('select');\n this.closeCheckpointCommandBar();\n break;\n case 'type':\n this.toggleTypography();\n this.closeCheckpointCommandBar();\n break;\n case 'save':\n await this.saveCheckpoint();\n if (this.commandBarOpen()) {\n const index = this.filteredInspectorActions().findIndex(({ id }) => id === action.id);\n if (index >= 0) this.setActiveInspectorAction(index);\n }\n break;\n case 'vertical':\n this.activateGuideOrientation('vertical');\n this.closeCheckpointCommandBar();\n break;\n case 'horizontal':\n this.activateGuideOrientation('horizontal');\n this.closeCheckpointCommandBar();\n break;\n case 'off':\n this.closeCheckpointCommandBar();\n this.disableInspector();\n break;\n }\n }\n\n async restoreCheckpoint(checkpoint: InspectorCheckpointRecord) {\n if (!this.checkpointService || this.checkpointService.busy()) return;\n const restored = await this.checkpointService.restore(checkpoint.id);\n if (!restored) return;\n this.checkpointDialog()?.nativeElement.close();\n this.commandBarOpen.set(false);\n this.showCheckpointToast(`Restored “${checkpoint.name}”.`);\n }\n\n beginRename(checkpoint: InspectorCheckpointRecord, event?: Event) {\n event?.stopPropagation();\n if (this.checkpointService?.busy()) return;\n this.editingCheckpointId.set(checkpoint.id);\n this.deletingCheckpointId.set(null);\n this.renameDraft.set(checkpoint.name);\n queueMicrotask(() => {\n const input = this.checkpointDialog()?.nativeElement.querySelector<HTMLInputElement>(\n '.inspector-command-row__rename',\n );\n input?.focus();\n input?.select();\n });\n }\n\n updateRenameDraft(event: Event) {\n this.renameDraft.set((event.target as HTMLInputElement).value);\n this.checkpointService?.clearError();\n }\n\n async finishRename(checkpoint: InspectorCheckpointRecord) {\n if (await this.checkpointService?.rename(checkpoint.id, this.renameDraft())) {\n this.editingCheckpointId.set(null);\n this.checkpointSearch()?.nativeElement.focus();\n }\n }\n\n cancelRename() {\n this.editingCheckpointId.set(null);\n this.checkpointService?.clearError();\n this.checkpointSearch()?.nativeElement.focus();\n }\n\n beginDelete(checkpoint: InspectorCheckpointRecord, event?: Event) {\n event?.stopPropagation();\n if (this.checkpointService?.busy()) return;\n this.deletingCheckpointId.set(checkpoint.id);\n this.editingCheckpointId.set(null);\n }\n\n cancelDelete(event?: Event) {\n event?.stopPropagation();\n this.deletingCheckpointId.set(null);\n this.checkpointSearch()?.nativeElement.focus();\n }\n\n async confirmDelete(checkpoint: InspectorCheckpointRecord, event?: Event) {\n event?.stopPropagation();\n if (!await this.checkpointService?.delete(checkpoint.id)) return;\n this.deletingCheckpointId.set(null);\n this.clampActiveCommand();\n this.checkpointSearch()?.nativeElement.focus();\n }\n\n handleCheckpointDialogClick(event: MouseEvent) {\n if (\n event.target === this.checkpointDialog()?.nativeElement &&\n !this.checkpointService?.busy() &&\n !this.deletingCheckpointId()\n ) {\n this.closeCheckpointCommandBar();\n }\n }\n\n clearGuides() {\n this.guides.set([]);\n this.selectedGuideId.set(null);\n this.recordHistory([]);\n }\n\n trackGuide = (_index: number, guide: Guide) => guide.id;\n trackTextBlock = (_index: number, block: TextBlockAnnotation) => block.id;\n trackConnector = (\n _index: number,\n connector: DistanceOverlay['connectors'][number],\n ) => `${connector.x1}:${connector.y1}:${connector.x2}:${connector.y2}`;\n\n startGuideDrag(event: PointerEvent, guide: Guide) {\n event.preventDefault();\n event.stopPropagation();\n this.draggingGuideId = guide.id;\n this.selectedGuideId.set(guide.id);\n }\n\n formatEdges(edges: InspectMeasurement['padding']) {\n return `${formatValue(edges.top)} ${formatValue(edges.right)} ${formatValue(edges.bottom)} ${formatValue(edges.left)}`;\n }\n\n formatGap(selected: InspectMeasurement) {\n return `${formatValue(selected.gap.row)} / ${formatValue(selected.gap.column)}`;\n }\n\n @HostListener('window:keydown', ['$event'])\n handleKeydown(event: KeyboardEvent) {\n const key = event.key.toLowerCase();\n\n if (\n this.checkpointService &&\n !event.repeat &&\n (event.metaKey || event.ctrlKey) &&\n event.shiftKey &&\n key === 'p'\n ) {\n event.preventDefault();\n this.commandBarOpen() ? this.closeCheckpointCommandBar() : void this.openCheckpointCommandBar();\n return;\n }\n\n if (this.commandBarOpen()) {\n this.handleCommandBarKeydown(event, key);\n return;\n }\n\n if (key === 'escape') {\n event.preventDefault();\n this.clearInspectorCanvas();\n }\n }\n\n private clearInspectorCanvas() {\n this.selectedMeasurement.set(null);\n this.selectedGuideId.set(null);\n this.hoverRect.set(null);\n this.distanceOverlay.set(null);\n this.altPressed.set(false);\n this.selectedElement = null;\n this.hoverElement = null;\n this.guidePreview.set(null);\n this.draggingGuideId = null;\n this.clearGuides();\n this.refreshTypographyBlocks();\n }\n\n private normalizeCheckpointLabel(value: string) {\n return value\n .trim()\n .toLocaleLowerCase()\n .replace(/^\\/+|\\/+$/g, '');\n }\n\n @HostListener('window:pointermove', ['$event'])\n handlePointerMove(event: PointerEvent) {\n if (!this.enabled() || !this.isBrowser) {\n return;\n }\n\n if (this.draggingGuideId) {\n this.guidePreview.set(null);\n const viewport = getViewportSize();\n this.guides.set(\n this.guides().map((guide) => {\n if (guide.id !== this.draggingGuideId) {\n return guide;\n }\n const rawPosition =\n guide.orientation === 'vertical' ? event.clientX : event.clientY;\n const max =\n guide.orientation === 'vertical' ? viewport.width : viewport.height;\n return { ...guide, position: clamp(rawPosition, 0, max) };\n }),\n );\n return;\n }\n\n if (this.toolMode() === 'guides') {\n this.hoverRect.set(null);\n this.hoverElement = null;\n this.distanceOverlay.set(null);\n\n if (\n this.overlayRoot()?.nativeElement.contains(event.target as Node) ??\n false\n ) {\n this.guidePreview.set(null);\n return;\n }\n\n this.guidePreview.set(this.getGuidePreview(event));\n return;\n }\n\n this.guidePreview.set(null);\n\n if (this.toolMode() !== 'select' || !this.hoverHighlightEnabled) {\n this.hoverRect.set(null);\n this.hoverElement = null;\n if (!this.altPressed()) {\n return;\n }\n }\n\n const target = getTargetElement(\n { x: event.clientX, y: event.clientY },\n this.overlayRoot()?.nativeElement ?? null,\n );\n if (!target) {\n this.hoverRect.set(null);\n this.hoverElement = null;\n this.distanceOverlay.set(null);\n return;\n }\n\n const rect = getRectFromDom(target);\n this.hoverElement = target;\n if (!rectsEqual(rect, this.hoverRect())) {\n this.hoverRect.set(rect);\n }\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n }\n\n @HostListener('window:pointerup')\n handlePointerUp() {\n if (!this.draggingGuideId) {\n return;\n }\n this.recordHistory(this.guides());\n this.draggingGuideId = null;\n }\n\n @HostListener('window:click', ['$event'])\n handleClick(event: MouseEvent) {\n if (!this.enabled() || !this.isBrowser) {\n return;\n }\n\n const overlay = this.overlayRoot()?.nativeElement ?? null;\n\n if (this.toolMode() === 'guides') {\n if (overlay && overlay.contains(event.target as Node)) {\n return;\n }\n const guide = this.getGuidePreview(event);\n this.addGuide({ ...guide, id: createId() });\n this.guidePreview.set(guide);\n return;\n }\n\n if (!this.canInspectClick(event)) {\n return;\n }\n\n this.selectElementAtPoint(event);\n }\n\n @HostListener('window:resize')\n @HostListener('window:scroll')\n handleViewportChange() {\n if (this.selectedElement && document.contains(this.selectedElement)) {\n this.selectedMeasurement.set(getInspectMeasurement(this.selectedElement));\n }\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n }\n\n private canInspectClick(event: MouseEvent) {\n if (!this.enabled() || !this.isBrowser || this.toolMode() !== 'select') {\n return false;\n }\n\n const overlay = this.overlayRoot()?.nativeElement ?? null;\n return !(overlay && overlay.contains(event.target as Node));\n }\n\n private setInspectorEnabled(enabled: boolean) {\n this.enabled.set(enabled);\n if (!enabled) {\n this.toolMode.set('none');\n this.hoverRect.set(null);\n this.selectedGuideId.set(null);\n this.selectedMeasurement.set(null);\n this.distanceOverlay.set(null);\n this.textBlocks.set([]);\n this.guidePreview.set(null);\n this.altPressed.set(false);\n this.selectedElement = null;\n this.hoverElement = null;\n this.draggingGuideId = null;\n }\n this.refreshTypographyBlocks();\n }\n\n private handleCommandBarKeydown(event: KeyboardEvent, key: string) {\n const checkpoints = this.filteredCheckpoints();\n const actions = this.filteredInspectorActions();\n const activeCheckpoint = checkpoints[this.activeCommandIndex()];\n const activeActionIndex = this.activeCommandIndex() - checkpoints.length;\n const activeAction = actions[activeActionIndex];\n const target = event.target as HTMLElement | null;\n const isRenameInput = target?.classList?.contains('inspector-command-row__rename') ?? false;\n\n if (key === 'escape') {\n event.preventDefault();\n if (this.editingCheckpointId()) this.cancelRename();\n else if (this.deletingCheckpointId()) this.cancelDelete();\n else this.closeCheckpointCommandBar();\n return;\n }\n if (this.checkpointService?.busy()) return;\n const editingCheckpoint = checkpoints.find(({ id }) => id === this.editingCheckpointId());\n if (isRenameInput && key === 'enter' && editingCheckpoint) {\n event.preventDefault();\n void this.finishRename(editingCheckpoint);\n return;\n }\n if (isRenameInput) return;\n if (key === 'arrowdown') {\n event.preventDefault();\n if (activeCheckpoint) {\n const nextIndex = this.activeCommandIndex() < checkpoints.length - 1\n ? this.activeCommandIndex() + 1\n : actions.length ? checkpoints.length : this.activeCommandIndex();\n this.activeCommandIndex.set(nextIndex);\n }\n this.scrollActiveCommandIntoView();\n return;\n }\n if (key === 'arrowup') {\n event.preventDefault();\n if (activeAction && checkpoints.length) {\n this.activeCommandIndex.set(checkpoints.length - 1);\n } else if (activeCheckpoint) {\n this.activeCommandIndex.set(Math.max(0, this.activeCommandIndex() - 1));\n }\n this.scrollActiveCommandIntoView();\n return;\n }\n if (key === 'arrowright' && (activeCheckpoint || activeAction) && actions.length) {\n event.preventDefault();\n const nextActionIndex = activeAction\n ? Math.min(activeActionIndex + 1, actions.length - 1)\n : 0;\n this.activeCommandIndex.set(checkpoints.length + nextActionIndex);\n this.scrollActiveCommandIntoView();\n return;\n }\n if (key === 'arrowleft' && activeAction) {\n event.preventDefault();\n this.activeCommandIndex.set(checkpoints.length + Math.max(0, activeActionIndex - 1));\n this.scrollActiveCommandIntoView();\n return;\n }\n if (key === 'enter' && activeCheckpoint && !this.deletingCheckpointId()) {\n event.preventDefault();\n void this.restoreCheckpoint(activeCheckpoint);\n return;\n }\n if (key === 'enter' && activeAction) {\n event.preventDefault();\n void this.executeInspectorAction(activeAction);\n return;\n }\n }\n\n private clampActiveCommand() {\n this.activeCommandIndex.set(\n Math.min(this.activeCommandIndex(), Math.max(0, this.commandResultCount() - 1)),\n );\n }\n\n private scrollActiveCommandIntoView() {\n queueMicrotask(() => {\n const row = this.checkpointDialog()?.nativeElement.querySelector<HTMLElement>(\n `[data-command-index=\"${this.activeCommandIndex()}\"]`,\n );\n row?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n private showCheckpointToast(message: string, isError = false) {\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.checkpointToastIsError.set(isError);\n this.checkpointToast.set(message);\n this.toastTimer = setTimeout(() => {\n this.checkpointToast.set(null);\n this.checkpointToastIsError.set(false);\n }, 2500);\n }\n\n private selectElementAtPoint(event: MouseEvent) {\n const overlay = this.overlayRoot()?.nativeElement ?? null;\n const target = getTargetElement(\n { x: event.clientX, y: event.clientY },\n overlay,\n );\n if (!target) {\n this.selectedMeasurement.set(null);\n this.selectedElement = null;\n this.distanceOverlay.set(null);\n this.refreshTypographyBlocks();\n return false;\n }\n\n // Ctrl+click: select the minimum common parent of current selection and clicked element\n if ((event.ctrlKey || event.metaKey) && this.selectedElement) {\n const commonParent = this.findMinimumCommonParent(\n this.selectedElement,\n target,\n );\n if (\n commonParent &&\n commonParent !== document.body &&\n commonParent !== document.documentElement\n ) {\n this.selectedMeasurement.set(getInspectMeasurement(commonParent));\n this.selectedElement = commonParent;\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n return true;\n }\n }\n\n this.selectedMeasurement.set(getInspectMeasurement(target));\n this.selectedElement = target;\n this.selectedGuideId.set(\n this.findGuideAtPoint(event.clientX, event.clientY),\n );\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n return true;\n }\n\n private updateDistanceOverlay() {\n if (\n !this.altPressed() ||\n !this.selectedElement ||\n !this.hoverElement ||\n this.selectedElement === this.hoverElement ||\n this.selectedElement.contains(this.hoverElement) ||\n this.hoverElement.contains(this.selectedElement)\n ) {\n this.distanceOverlay.set(null);\n return;\n }\n\n this.distanceOverlay.set(\n getDistanceOverlay(\n getRectFromDom(this.selectedElement),\n getRectFromDom(this.hoverElement),\n ),\n );\n }\n\n private refreshTypographyBlocks() {\n if (!this.isBrowser || !this.enabled() || !this.showTypography()) {\n this.textBlocks.set([]);\n return;\n }\n\n const viewport = getViewportSize();\n this.textBlocks.set(\n getVisibleTextBlocks(this.overlayRoot()?.nativeElement ?? null)\n .filter(\n (block) =>\n block.rect.top >= 0 &&\n block.rect.top <= viewport.height &&\n block.rect.left >= 0 &&\n block.rect.left <= viewport.width,\n )\n .map((block) => ({\n ...block,\n rect: {\n ...block.rect,\n left: clamp(block.rect.left, 0, viewport.width - 12),\n top: clamp(block.rect.top, 14, viewport.height),\n },\n })),\n );\n }\n\n private addGuide(guide: Guide) {\n const nextGuides = [...this.guides(), guide];\n this.guides.set(nextGuides);\n this.selectedGuideId.set(guide.id);\n this.recordHistory(nextGuides);\n }\n\n private getGuidePreview(event: PointerEvent | MouseEvent): Guide {\n const viewport = getViewportSize();\n const orientation = this.guideOrientation();\n const rawPosition =\n orientation === 'vertical' ? event.clientX : event.clientY;\n const max = orientation === 'vertical' ? viewport.width : viewport.height;\n\n return {\n id: 'preview',\n orientation,\n position: this.snapGuide(clamp(rawPosition, 0, max)),\n };\n }\n\n private snapGuide(position: number) {\n for (const guide of this.guides()) {\n if (Math.abs(guide.position - position) <= GUIDE_SNAP_DISTANCE) {\n return guide.position;\n }\n }\n return position;\n }\n\n private findGuideAtPoint(x: number, y: number) {\n for (const guide of this.guides()) {\n if (\n guide.orientation === 'vertical' &&\n Math.abs(guide.position - x) <= GUIDE_HITBOX_SIZE\n ) {\n return guide.id;\n }\n if (\n guide.orientation === 'horizontal' &&\n Math.abs(guide.position - y) <= GUIDE_HITBOX_SIZE\n ) {\n return guide.id;\n }\n }\n return null;\n }\n\n private undo() {\n if (!this.canUndo()) {\n return;\n }\n const nextIndex = this.historyIndex() - 1;\n this.historyIndex.set(nextIndex);\n this.guides.set(this.cloneGuides(this.history()[nextIndex]));\n }\n\n private redo() {\n if (!this.canRedo()) {\n return;\n }\n const nextIndex = this.historyIndex() + 1;\n this.historyIndex.set(nextIndex);\n this.guides.set(this.cloneGuides(this.history()[nextIndex]));\n }\n\n private recordHistory(guides: Guide[]) {\n const base = this.history().slice(0, this.historyIndex() + 1);\n base.push(this.cloneGuides(guides));\n this.history.set(base);\n this.historyIndex.set(base.length - 1);\n }\n\n private cloneGuides(guides: Guide[]) {\n return guides.map((guide) => ({ ...guide }));\n }\n\n private findMinimumCommonParent(\n elementA: HTMLElement,\n elementB: HTMLElement,\n ): HTMLElement | null {\n // Build ancestor chain for element A\n const ancestorsA = new Set<Element>();\n let current: Element | null = elementA;\n while (current) {\n ancestorsA.add(current);\n current = current.parentElement;\n }\n\n // Walk up from elementB until we find a common ancestor\n current = elementB;\n while (current) {\n if (ancestorsA.has(current)) {\n return current as HTMLElement;\n }\n current = current.parentElement;\n }\n\n return null;\n }\n}\n","<div class=\"inspector-root\" #overlayRoot>\n @if (checkpointService) {\n <dialog\n #checkpointDialog\n class=\"inspector-command-dialog\"\n aria-labelledby=\"inspector-command-title\"\n (cancel)=\"$event.preventDefault(); closeCheckpointCommandBar()\"\n (click)=\"handleCheckpointDialogClick($event)\"\n >\n <section class=\"inspector-command\" (click)=\"$event.stopPropagation()\">\n <header class=\"inspector-command__search\">\n <label\n id=\"inspector-command-title\"\n class=\"inspector-visually-hidden\"\n for=\"inspector-checkpoint-search\"\n >\n inspector-ng command palette\n </label>\n <span class=\"inspector-command__runcat\" aria-hidden=\"true\">\n <img\n class=\"inspector-command__runcat-sprite\"\n [src]=\"runcatSpriteSrc\"\n alt=\"\"\n draggable=\"false\"\n />\n </span>\n <input\n #checkpointSearch\n id=\"inspector-checkpoint-search\"\n type=\"search\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n placeholder=\"inspector-ng…\"\n [value]=\"checkpointQuery()\"\n [attr.aria-controls]=\"'inspector-checkpoint-results inspector-command-actions'\"\n [attr.aria-activedescendant]=\"activeCommandResultId()\"\n (input)=\"updateCheckpointQuery($event)\"\n />\n </header>\n\n @if (checkpointService.error(); as error) {\n <p\n class=\"inspector-command__message inspector-command__message--error\"\n role=\"alert\"\n >\n {{ error }}\n </p>\n }\n\n <div\n id=\"inspector-checkpoint-results\"\n class=\"inspector-command__results\"\n role=\"listbox\"\n aria-label=\"Saved checkpoints\"\n >\n @if (checkpointService.loading()) {\n <p class=\"inspector-command__message\" role=\"status\">Loading…</p>\n } @else if (\n !checkpointService.checkpoints().length && !checkpointQuery().trim()\n ) {\n <p class=\"inspector-command__message\" role=\"status\">\n No checkpoints yet\n </p>\n } @else if (\n !filteredCheckpoints().length && !filteredInspectorActions().length\n ) {\n <p class=\"inspector-command__message\" role=\"status\">No matches</p>\n } @else {\n @for (\n checkpoint of filteredCheckpoints();\n track checkpoint.id;\n let index = $index\n ) {\n <div\n class=\"inspector-command-row\"\n role=\"option\"\n [id]=\"'inspector-checkpoint-' + checkpoint.id\"\n [attr.data-command-index]=\"index\"\n [attr.aria-selected]=\"activeCommandIndex() === index\"\n [class.is-active]=\"activeCommandIndex() === index\"\n [class.is-busy]=\"\n checkpointService.busy() && activeCommandIndex() === index\n \"\n (mouseenter)=\"setActiveCheckpoint(index)\"\n (click)=\"\n deletingCheckpointId() === checkpoint.id ||\n editingCheckpointId() === checkpoint.id\n ? null\n : restoreCheckpoint(checkpoint)\n \"\n >\n @if (deletingCheckpointId() === checkpoint.id) {\n <span class=\"inspector-command-row__confirm\"\n >Delete “{{ checkpoint.name }}”?</span\n >\n <span class=\"inspector-command-row__confirm-actions\">\n <button\n type=\"button\"\n class=\"is-danger\"\n (click)=\"confirmDelete(checkpoint, $event)\"\n >\n Delete\n </button>\n <button type=\"button\" (click)=\"cancelDelete($event)\">\n Keep\n </button>\n </span>\n } @else if (editingCheckpointId() === checkpoint.id) {\n <input\n class=\"inspector-command-row__rename\"\n aria-label=\"Checkpoint name\"\n [value]=\"renameDraft()\"\n (input)=\"updateRenameDraft($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n <span class=\"inspector-command-row__content\">\n <span class=\"inspector-command-row__name\">\n @if (\n checkpointService.busy() &&\n activeCommandIndex() === index\n ) {\n Restoring…\n } @else {\n {{ checkpoint.name }}\n }\n </span>\n <span class=\"inspector-command-row__meta\">\n @if (shouldShowCheckpointRoute(checkpoint)) {\n <span class=\"inspector-command-row__route\">{{\n checkpoint.route\n }}</span>\n <span\n class=\"inspector-command-row__separator\"\n aria-hidden=\"true\"\n >·</span\n >\n }\n <span class=\"inspector-command-row__activity\">\n {{ checkpoint.lastUsedAt ? \"Used\" : \"Saved\" }}\n {{\n formatRelativeTime(checkpointActivityAt(checkpoint))\n }}\n </span>\n </span>\n </span>\n <span class=\"inspector-command-row__actions\">\n <button\n type=\"button\"\n (click)=\"beginRename(checkpoint, $event)\"\n [attr.aria-label]=\"'Rename ' + checkpoint.name\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"m11.8 1.8 2.4 2.4-8.3 8.3-3.1.7.7-3.1zm-8 10.4 1.5-.3-1.2-1.2z\"\n />\n </svg>\n </button>\n <button\n type=\"button\"\n (click)=\"beginDelete(checkpoint, $event)\"\n [attr.aria-label]=\"'Delete ' + checkpoint.name\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M5.5 2h5l.5 1H14v1.25H2V3h3zm-2 3.25h9L12 14H4z\"\n />\n </svg>\n </button>\n </span>\n }\n </div>\n }\n }\n </div>\n\n @if (filteredInspectorActions().length) {\n <footer\n id=\"inspector-command-actions\"\n class=\"inspector-command__actions\"\n role=\"listbox\"\n aria-label=\"Inspector actions\"\n aria-orientation=\"horizontal\"\n >\n @for (\n action of filteredInspectorActions();\n track action.id;\n let index = $index\n ) {\n <button\n type=\"button\"\n role=\"option\"\n class=\"inspector-command-action\"\n [id]=\"'inspector-action-' + action.id\"\n [attr.data-command-index]=\"filteredCheckpoints().length + index\"\n [attr.aria-label]=\"action.ariaLabel\"\n [attr.aria-selected]=\"\n activeCommandIndex() === filteredCheckpoints().length + index\n \"\n [attr.aria-disabled]=\"checkpointService.busy()\"\n [class.is-selected]=\"\n activeCommandIndex() === filteredCheckpoints().length + index\n \"\n [class.is-active]=\"\n (action.id === 'select' && toolMode() === 'select') ||\n (action.id === 'type' && showTypography()) ||\n (action.id === 'vertical' &&\n toolMode() === 'guides' &&\n guideOrientation() === 'vertical') ||\n (action.id === 'horizontal' &&\n toolMode() === 'guides' &&\n guideOrientation() === 'horizontal')\n \"\n [class.inspector-command-action--danger]=\"action.id === 'off'\"\n [disabled]=\"checkpointService.busy()\"\n (mouseenter)=\"setActiveInspectorAction(index)\"\n (click)=\"executeInspectorAction(action)\"\n >\n @switch (action.id) {\n @case (\"select\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2l8 8-3 .7L6.7 13 6 10 3 2z\" />\n </svg>\n }\n @case (\"type\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 4V2h10v2h-4v10H7V4z\" />\n </svg>\n }\n @case (\"save\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M2.5 2h9.6l1.4 1.4V14h-11zm2 1.5v3h6v-3zm.5 6V12h6V9.5z\"\n />\n </svg>\n }\n @case (\"vertical\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M7.25 2h1.5v12h-1.5z\" />\n </svg>\n }\n @case (\"horizontal\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M2 7.25h12v1.5H2z\" />\n </svg>\n }\n @case (\"off\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M7.25 1.5h1.5v6h-1.5zM4.1 3.35l.96 1.15A4.25 4.25 0 1 0 10.94 4.5l.96-1.15A5.75 5.75 0 1 1 4.1 3.35z\"\n />\n </svg>\n }\n }\n <span>{{ action.label }}</span>\n </button>\n }\n </footer>\n }\n </section>\n </dialog>\n }\n\n @if (checkpointToast(); as toast) {\n <p\n class=\"inspector-checkpoint-toast\"\n [class.inspector-checkpoint-toast--error]=\"checkpointToastIsError()\"\n [attr.role]=\"checkpointToastIsError() ? 'alert' : 'status'\"\n >\n {{ toast }}\n </p>\n }\n\n @if (enabled() && toolMode() === \"select\") {\n @if (hoverRect() && hoverHighlightEnabled) {\n <div\n class=\"inspector-box inspector-box--hover\"\n [style.left.px]=\"hoverRect()!.left\"\n [style.top.px]=\"hoverRect()!.top\"\n [style.width.px]=\"hoverRect()!.width\"\n [style.height.px]=\"hoverRect()!.height\"\n [style.--inspector-accent]=\"highlightColor\"\n ></div>\n }\n\n @if (selectedMeasurement(); as selected) {\n @if (selected.gap.active && selected.parentRect) {\n <div\n class=\"inspector-box inspector-box--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top\"\n [style.width.px]=\"selected.parentRect.width\"\n [style.height.px]=\"selected.parentRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top - 8\"\n >\n G {{ formatGap(selected) }}\n </div>\n }\n\n <div\n class=\"inspector-box inspector-box--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top\"\n [style.width.px]=\"selected.marginRect.width\"\n [style.height.px]=\"selected.marginRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top - 8\"\n >\n M {{ formatEdges(selected.margin) }}\n </div>\n\n <div\n class=\"inspector-box inspector-box--selected\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top\"\n [style.width.px]=\"selected.rect.width\"\n [style.height.px]=\"selected.rect.height\"\n [style.--inspector-accent]=\"highlightColor\"\n >\n <div class=\"inspector-label\">{{ selectedMetaLine() }}</div>\n </div>\n\n <div\n class=\"inspector-box inspector-box--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"selected.paddingRect.top\"\n [style.width.px]=\"selected.paddingRect.width\"\n [style.height.px]=\"selected.paddingRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"\n selected.paddingRect.top + selected.paddingRect.height + 8\n \"\n >\n P {{ formatEdges(selected.padding) }}\n </div>\n }\n }\n\n @if (enabled() && showTypography()) {\n @for (block of textBlocks(); track block.id) {\n <div\n class=\"inspector-text-chip\"\n [style.left.px]=\"block.rect.left\"\n [style.top.px]=\"block.rect.top - 8\"\n >\n <span\n class=\"inspector-text-chip__swatch\"\n [style.background]=\"block.styles.color\"\n ></span>\n <span>{{ block.styles.fontSize }}</span>\n <span>{{ block.styles.lineHeight }}</span>\n <span>{{ block.styles.color }}</span>\n </div>\n }\n }\n\n @if (enabled() && altPressed() && distanceOverlay(); as distance) {\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectA.left\"\n [style.top.px]=\"distance.rectA.top\"\n [style.width.px]=\"distance.rectA.width\"\n [style.height.px]=\"distance.rectA.height\"\n ></div>\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectB.left\"\n [style.top.px]=\"distance.rectB.top\"\n [style.width.px]=\"distance.rectB.width\"\n [style.height.px]=\"distance.rectB.height\"\n ></div>\n\n @for (\n connector of distance.connectors;\n track trackConnector($index, connector)\n ) {\n <div\n class=\"inspector-connector\"\n [class.inspector-connector--vertical]=\"connector.x1 === connector.x2\"\n [class.inspector-connector--horizontal]=\"connector.y1 === connector.y2\"\n [style.left.px]=\"Math.min(connector.x1, connector.x2)\"\n [style.top.px]=\"Math.min(connector.y1, connector.y2)\"\n [style.width.px]=\"Math.max(1, Math.abs(connector.x2 - connector.x1))\"\n [style.height.px]=\"Math.max(1, Math.abs(connector.y2 - connector.y1))\"\n ></div>\n }\n\n @if (distance.horizontal && distance.horizontal.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--horizontal\"\n [style.left.px]=\"\n Math.min(distance.horizontal.x1!, distance.horizontal.x2!)\n \"\n [style.top.px]=\"distance.horizontal.y!\"\n [style.width.px]=\"\n Math.abs(distance.horizontal.x2! - distance.horizontal.x1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag\"\n [style.left.px]=\"\n (distance.horizontal.x1! + distance.horizontal.x2!) / 2\n \"\n [style.top.px]=\"distance.horizontal.y! + 10\"\n >\n {{ formatValue(distance.horizontal.value) }}\n </div>\n }\n\n @if (distance.vertical && distance.vertical.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--vertical\"\n [style.left.px]=\"distance.vertical.x!\"\n [style.top.px]=\"Math.min(distance.vertical.y1!, distance.vertical.y2!)\"\n [style.height.px]=\"\n Math.abs(distance.vertical.y2! - distance.vertical.y1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag inspector-distance-tag--vertical\"\n [style.left.px]=\"distance.vertical.x! + 10\"\n [style.top.px]=\"(distance.vertical.y1! + distance.vertical.y2!) / 2\"\n >\n {{ formatValue(distance.vertical.value) }}\n </div>\n }\n }\n\n @if (enabled()) {\n @if (toolMode() === \"guides\") {\n @if (guidePreview(); as preview) {\n <div\n class=\"inspector-guide inspector-guide--preview\"\n [class.inspector-guide--vertical]=\"preview.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"\n preview.orientation === 'horizontal'\n \"\n [style.left.px]=\"\n preview.orientation === 'vertical' ? preview.position : null\n \"\n [style.top.px]=\"\n preview.orientation === 'horizontal' ? preview.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n >\n <span class=\"inspector-guide-line\"></span>\n </div>\n }\n }\n\n @for (guide of guides(); track guide.id) {\n <button\n type=\"button\"\n class=\"inspector-guide\"\n [class.inspector-guide--vertical]=\"guide.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"guide.orientation === 'horizontal'\"\n [class.inspector-guide--selected]=\"selectedGuideId() === guide.id\"\n [style.left.px]=\"\n guide.orientation === 'vertical' ? guide.position : null\n \"\n [style.top.px]=\"\n guide.orientation === 'horizontal' ? guide.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n (pointerdown)=\"startGuideDrag($event, guide)\"\n >\n <span class=\"inspector-guide-line\"></span>\n </button>\n }\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inspector-ng.mjs","sources":["../../../projects/inspector-ng/src/lib/constants.ts","../../../projects/inspector-ng/src/lib/checkpoints.ts","../../../projects/inspector-ng/src/lib/geometry.ts","../../../projects/inspector-ng/src/lib/distances.ts","../../../projects/inspector-ng/src/lib/dom.ts","../../../projects/inspector-ng/src/lib/checkpoint-search.ts","../../../projects/inspector-ng/src/lib/utils.ts","../../../projects/inspector-ng/src/lib/measure-caterpillar.ts","../../../projects/inspector-ng/src/lib/pet-cat.ts","../../../projects/inspector-ng/src/lib/pet-dog.ts","../../../projects/inspector-ng/src/lib/pet-bunny.ts","../../../projects/inspector-ng/src/lib/generated-pets.ts","../../../projects/inspector-ng/src/lib/generated-pets-extra.ts","../../../projects/inspector-ng/src/lib/inspector.component.ts","../../../projects/inspector-ng/src/lib/inspector.component.html","../../../projects/inspector-ng/src/inspector-ng.ts"],"sourcesContent":["export const GUIDE_SNAP_DISTANCE = 10;\nexport const GUIDE_HITBOX_SIZE = 14;\n","import {\n EnvironmentProviders,\n Inject,\n Injectable,\n InjectionToken,\n Optional,\n PLATFORM_ID,\n makeEnvironmentProviders,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Router } from '@angular/router';\nimport {\n Action,\n ActionReducer,\n META_REDUCERS,\n Store,\n} from '@ngrx/store';\nimport { firstValueFrom, take } from 'rxjs';\n\nexport interface InspectorCheckpointRecord {\n version: 1;\n id: string;\n name: string;\n route: string;\n createdAt: string;\n lastUsedAt?: string;\n state: unknown;\n}\n\ninterface RestoreCheckpointAction extends Action {\n type: typeof RESTORE_CHECKPOINT;\n state: unknown;\n}\n\nconst RESTORE_CHECKPOINT = '[Inspector Checkpoints] Restore';\nconst DATABASE_NAME = 'inspector-ng';\nconst DATABASE_VERSION = 1;\nconst STORE_NAME = 'checkpoints';\n\nexport const INSPECTOR_CHECKPOINT_REPOSITORY =\n new InjectionToken<InspectorCheckpointRepository>('INSPECTOR_CHECKPOINT_REPOSITORY');\n\nexport function inspectorCheckpointMetaReducer<T>(\n reducer: ActionReducer<T>,\n): ActionReducer<T> {\n return (state, action) => {\n if (action.type === RESTORE_CHECKPOINT) {\n return (action as RestoreCheckpointAction).state as T;\n }\n return reducer(state, action);\n };\n}\n\nexport abstract class InspectorCheckpointRepository {\n abstract list(): Promise<InspectorCheckpointRecord[]>;\n abstract put(checkpoint: InspectorCheckpointRecord): Promise<void>;\n abstract delete(id: string): Promise<void>;\n}\n\n@Injectable()\nexport class IndexedDbCheckpointRepository extends InspectorCheckpointRepository {\n private databasePromise: Promise<IDBDatabase> | null = null;\n\n constructor(@Inject(PLATFORM_ID) private readonly platformId: object) {\n super();\n }\n\n async list(): Promise<InspectorCheckpointRecord[]> {\n const database = await this.database();\n const values = await this.request<unknown[]>(\n database.transaction(STORE_NAME, 'readonly').objectStore(STORE_NAME).getAll(),\n );\n return values\n .filter(isCheckpointRecord)\n .sort(recentActivityFirst);\n }\n\n async put(checkpoint: InspectorCheckpointRecord): Promise<void> {\n const database = await this.database();\n await this.transactionComplete(database, 'readwrite', (store) => store.put(checkpoint));\n }\n\n async delete(id: string): Promise<void> {\n const database = await this.database();\n await this.transactionComplete(database, 'readwrite', (store) => store.delete(id));\n }\n\n private database(): Promise<IDBDatabase> {\n if (!isPlatformBrowser(this.platformId) || typeof indexedDB === 'undefined') {\n return Promise.reject(new Error('Checkpoints are only available in a browser with IndexedDB.'));\n }\n if (this.databasePromise) return this.databasePromise;\n\n let rejected = false;\n const databasePromise = new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n request.onupgradeneeded = () => {\n const database = request.result;\n if (database.objectStoreNames.contains(STORE_NAME)) return;\n const store = database.createObjectStore(STORE_NAME, { keyPath: 'id' });\n store.createIndex('createdAt', 'createdAt');\n };\n request.onsuccess = () => {\n if (rejected) {\n request.result.close();\n return;\n }\n request.result.onversionchange = () => request.result.close();\n resolve(request.result);\n };\n request.onerror = () => {\n rejected = true;\n reject(request.error ?? new Error('IndexedDB could not be opened.'));\n };\n request.onblocked = () => {\n rejected = true;\n reject(new Error('IndexedDB is blocked by another open tab.'));\n };\n });\n this.databasePromise = databasePromise;\n void databasePromise.catch(() => {\n if (this.databasePromise === databasePromise) {\n this.databasePromise = null;\n }\n });\n return databasePromise;\n }\n\n private request<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('IndexedDB request failed.'));\n });\n }\n\n private transactionComplete(\n database: IDBDatabase,\n mode: IDBTransactionMode,\n operation: (store: IDBObjectStore) => IDBRequest,\n ): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, mode);\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error ?? new Error('IndexedDB transaction failed.'));\n transaction.onabort = () => reject(transaction.error ?? new Error('IndexedDB transaction was aborted.'));\n operation(transaction.objectStore(STORE_NAME));\n });\n }\n}\n\n@Injectable()\nexport class InspectorCheckpointService {\n readonly checkpoints = signal<InspectorCheckpointRecord[]>([]);\n readonly loading = signal(false);\n readonly busy = signal(false);\n readonly error = signal<string | null>(null);\n\n constructor(\n @Inject(INSPECTOR_CHECKPOINT_REPOSITORY)\n private readonly repository: InspectorCheckpointRepository,\n @Optional() @Inject(Store) private readonly store: Store | null,\n @Optional() @Inject(Router) private readonly router: Router | null,\n @Inject(PLATFORM_ID) private readonly platformId: object,\n ) {}\n\n async load(): Promise<void> {\n this.error.set(null);\n this.loading.set(true);\n try {\n this.checkpoints.set((await this.repository.list()).sort(recentActivityFirst));\n } catch (error) {\n this.error.set(this.messageFor(error, 'Saved checkpoints could not be loaded. Try reloading the page.'));\n } finally {\n this.loading.set(false);\n }\n }\n\n async save(): Promise<InspectorCheckpointRecord | null> {\n this.error.set(null);\n if (!this.store) {\n this.error.set(this.missingStoreMessage());\n return null;\n }\n\n this.busy.set(true);\n try {\n const currentState = await firstValueFrom(this.store.pipe(take(1)));\n const state = cloneJson(currentState);\n const persisted = await this.repository.list();\n const route = this.currentRoute();\n const pathname = this.currentPathname();\n const checkpoint: InspectorCheckpointRecord = {\n version: 1,\n id: createCheckpointId(),\n name: nextAutomaticName(pathname, persisted.map(({ name }) => name)),\n route,\n createdAt: new Date().toISOString(),\n state,\n };\n await this.repository.put(checkpoint);\n this.checkpoints.set([checkpoint, ...persisted].sort(recentActivityFirst));\n return checkpoint;\n } catch (error) {\n this.error.set(this.storageMessage(error, 'The checkpoint could not be saved.'));\n return null;\n } finally {\n this.busy.set(false);\n }\n }\n\n async restore(id: string): Promise<boolean> {\n this.error.set(null);\n if (!this.store) {\n this.error.set(this.missingStoreMessage());\n return false;\n }\n this.busy.set(true);\n try {\n const checkpoints = await this.repository.list();\n const checkpoint = checkpoints.find((item) => item.id === id);\n if (!checkpoint) throw new Error('Checkpoint not found. It may have been deleted in another tab.');\n const state = cloneJson(\n checkpoint.state,\n `“${checkpoint.name}” could not be decoded. Delete it and save a new checkpoint.`,\n );\n this.store.dispatch({ type: RESTORE_CHECKPOINT, state } as RestoreCheckpointAction);\n if (\n this.router &&\n this.router.url !== checkpoint.route &&\n !await this.router.navigateByUrl(checkpoint.route)\n ) {\n throw new Error(`The state was restored, but navigation to “${checkpoint.route}” was cancelled.`);\n }\n const recentlyUsedCheckpoint = {\n ...checkpoint,\n lastUsedAt: new Date().toISOString(),\n };\n await this.repository.put(recentlyUsedCheckpoint);\n this.checkpoints.set(\n checkpoints\n .map((item) => item.id === id ? recentlyUsedCheckpoint : item)\n .sort(recentActivityFirst),\n );\n return true;\n } catch (error) {\n this.error.set(this.messageFor(error, 'The checkpoint could not be restored. Delete it and save a new one.'));\n return false;\n } finally {\n this.busy.set(false);\n }\n }\n\n async rename(id: string, name: string): Promise<boolean> {\n this.error.set(null);\n const nextName = name.trim();\n if (!nextName) {\n this.error.set('Please enter a checkpoint name.');\n return false;\n }\n\n this.busy.set(true);\n try {\n const checkpoints = await this.repository.list();\n if (checkpoints.some((item) => item.id !== id && item.name.toLocaleLowerCase() === nextName.toLocaleLowerCase())) {\n throw new Error(`A checkpoint named “${nextName}” already exists. Choose a different name.`);\n }\n const checkpoint = checkpoints.find((item) => item.id === id);\n if (!checkpoint) throw new Error('Checkpoint not found. It may have been deleted in another tab.');\n await this.repository.put({ ...checkpoint, name: nextName });\n this.checkpoints.set(\n checkpoints.map((item) => item.id === id ? { ...item, name: nextName } : item).sort(recentActivityFirst),\n );\n return true;\n } catch (error) {\n this.error.set(this.storageMessage(error, 'The checkpoint could not be renamed.'));\n return false;\n } finally {\n this.busy.set(false);\n }\n }\n\n async delete(id: string): Promise<boolean> {\n this.error.set(null);\n this.busy.set(true);\n try {\n await this.repository.delete(id);\n this.checkpoints.set(this.checkpoints().filter((item) => item.id !== id));\n return true;\n } catch (error) {\n this.error.set(this.storageMessage(error, 'The checkpoint could not be deleted.'));\n return false;\n } finally {\n this.busy.set(false);\n }\n }\n\n clearError(): void {\n this.error.set(null);\n }\n\n private currentRoute(): string {\n if (!isPlatformBrowser(this.platformId)) return '/';\n return `${this.currentPathname()}${window.location.search}${window.location.hash}`;\n }\n\n private currentPathname(): string {\n if (!isPlatformBrowser(this.platformId)) return '/';\n return window.location.pathname || '/';\n }\n\n private missingStoreMessage(): string {\n return 'The NgRx root store is unavailable. Check that provideInspectorCheckpoints() is registered after provideStore().';\n }\n\n private storageMessage(error: unknown, fallback: string): string {\n if (isQuotaError(error)) {\n return 'Browser storage is full. Delete old checkpoints, then try saving again.';\n }\n return this.messageFor(error, fallback);\n }\n\n private messageFor(error: unknown, fallback: string): string {\n return error instanceof Error && error.message ? error.message : fallback;\n }\n}\n\nexport function provideInspectorCheckpoints(): EnvironmentProviders {\n return makeEnvironmentProviders([\n IndexedDbCheckpointRepository,\n {\n provide: INSPECTOR_CHECKPOINT_REPOSITORY,\n useExisting: IndexedDbCheckpointRepository,\n },\n InspectorCheckpointService,\n {\n provide: META_REDUCERS,\n multi: true,\n useValue: inspectorCheckpointMetaReducer,\n },\n ]);\n}\n\nexport function nextAutomaticName(route: string, names: string[]): string {\n const used = new Set(names.map((name) => name.toLocaleLowerCase()));\n if (!used.has(route.toLocaleLowerCase())) return route;\n for (let suffix = 2; ; suffix += 1) {\n const candidate = `${route} ${suffix}`;\n if (!used.has(candidate.toLocaleLowerCase())) return candidate;\n }\n}\n\nfunction cloneJson(\n value: unknown,\n failureMessage = 'The NgRx root state is not JSON-serializable. Remove circular or unsupported values and try again.',\n): unknown {\n try {\n const serialized = JSON.stringify(value);\n if (serialized === undefined) throw new Error();\n return JSON.parse(serialized) as unknown;\n } catch {\n throw new Error(failureMessage);\n }\n}\n\nfunction createCheckpointId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return `checkpoint-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction isQuotaError(error: unknown): boolean {\n return error instanceof DOMException && (\n error.name === 'QuotaExceededError' || error.name === 'NS_ERROR_DOM_QUOTA_REACHED'\n );\n}\n\nexport function checkpointActivityAt(checkpoint: InspectorCheckpointRecord): string {\n return checkpoint.lastUsedAt && checkpoint.lastUsedAt > checkpoint.createdAt\n ? checkpoint.lastUsedAt\n : checkpoint.createdAt;\n}\n\nexport function recentActivityFirst(\n a: InspectorCheckpointRecord,\n b: InspectorCheckpointRecord,\n): number {\n return checkpointActivityAt(b).localeCompare(checkpointActivityAt(a)) ||\n b.createdAt.localeCompare(a.createdAt) ||\n b.id.localeCompare(a.id);\n}\n\nfunction isCheckpointRecord(value: unknown): value is InspectorCheckpointRecord {\n if (!value || typeof value !== 'object') return false;\n const checkpoint = value as Partial<InspectorCheckpointRecord>;\n return checkpoint.version === 1 &&\n typeof checkpoint.id === 'string' &&\n typeof checkpoint.name === 'string' &&\n typeof checkpoint.route === 'string' &&\n typeof checkpoint.createdAt === 'string' &&\n (checkpoint.lastUsedAt === undefined || typeof checkpoint.lastUsedAt === 'string') &&\n 'state' in checkpoint;\n}\n","import { Rect } from './types';\n\nexport const clamp = (value: number, min: number, max: number) =>\n Math.max(min, Math.min(max, value));\n\nexport const getViewportSize = () => ({\n width: typeof window === 'undefined' ? 1 : window.innerWidth || 1,\n height: typeof window === 'undefined' ? 1 : window.innerHeight || 1,\n});\n\nexport const rectContainsPoint = (\n rect: Rect,\n point: { x: number; y: number },\n) =>\n point.x >= rect.left &&\n point.x <= rect.left + rect.width &&\n point.y >= rect.top &&\n point.y <= rect.top + rect.height;\n\nexport const rectsEqual = (a: Rect | null, b: Rect | null, epsilon = 0.5) => {\n if (a === b) {\n return true;\n }\n\n if (!a || !b) {\n return false;\n }\n\n return (\n Math.abs(a.left - b.left) < epsilon &&\n Math.abs(a.top - b.top) < epsilon &&\n Math.abs(a.width - b.width) < epsilon &&\n Math.abs(a.height - b.height) < epsilon\n );\n};\n","import { clamp, getViewportSize } from './geometry';\nimport { DistanceOverlay, Rect } from './types';\n\nexport const getDistanceOverlay = (rectA: Rect, rectB: Rect): DistanceOverlay => {\n const rightA = rectA.left + rectA.width;\n const bottomA = rectA.top + rectA.height;\n const rightB = rectB.left + rectB.width;\n const bottomB = rectB.top + rectB.height;\n const centerAX = rectA.left + rectA.width / 2;\n const centerAY = rectA.top + rectA.height / 2;\n\n let horizontal: DistanceOverlay['horizontal'] = null;\n let vertical: DistanceOverlay['vertical'] = null;\n const connectors: DistanceOverlay['connectors'] = [];\n\n const separatedX = rightA <= rectB.left || rightB <= rectA.left;\n const separatedY = bottomA <= rectB.top || bottomB <= rectA.top;\n\n if (separatedX) {\n const aIsLeft = rightA <= rectB.left;\n const x1 = aIsLeft ? rightA : rightB;\n const x2 = aIsLeft ? rectB.left : rectA.left;\n const y = centerAY;\n horizontal = { x1, x2, y, value: Math.abs(x2 - x1) };\n\n const edgeBX = aIsLeft ? rectB.left : rightB;\n if (y < rectB.top) {\n connectors.push({ x1: edgeBX, y1: y, x2: edgeBX, y2: rectB.top });\n } else if (y > bottomB) {\n connectors.push({ x1: edgeBX, y1: y, x2: edgeBX, y2: bottomB });\n }\n }\n\n if (separatedY) {\n const aIsTop = bottomA <= rectB.top;\n const y1 = aIsTop ? bottomA : bottomB;\n const y2 = aIsTop ? rectB.top : rectA.top;\n const x = centerAX;\n vertical = { y1, y2, x, value: Math.abs(y2 - y1) };\n\n const edgeBY = aIsTop ? rectB.top : bottomB;\n if (x < rectB.left) {\n connectors.push({ x1: x, y1: edgeBY, x2: rectB.left, y2: edgeBY });\n } else if (x > rightB) {\n connectors.push({ x1: x, y1: edgeBY, x2: rightB, y2: edgeBY });\n }\n }\n\n const viewport = getViewportSize();\n\n return {\n rectA,\n rectB,\n horizontal,\n vertical,\n connectors: connectors\n .map((segment) => ({\n x1: clamp(segment.x1, 0, viewport.width),\n y1: clamp(segment.y1, 0, viewport.height),\n x2: clamp(segment.x2, 0, viewport.width),\n y2: clamp(segment.y2, 0, viewport.height),\n }))\n .filter(\n (segment) =>\n Math.abs(segment.x1 - segment.x2) > 0.5 ||\n Math.abs(segment.y1 - segment.y2) > 0.5,\n ),\n };\n};\n","import { InspectMeasurement, Rect, TextBlockAnnotation, TextInspection } from './types';\n\nexport const getRectFromDom = (element: Element): Rect => {\n const rect = element.getBoundingClientRect();\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n };\n};\n\nexport const getElementLabel = (element: HTMLElement) => {\n const tag = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : '';\n const className = element.className\n ? `.${element.className.toString().split(' ')[0]}`\n : '';\n return `${tag}${id}${className}`;\n};\n\nconst toHex = (value: number) => value.toString(16).padStart(2, '0');\n\nconst normalizeColorToHex = (color: string) => {\n const trimmed = color.trim().toLowerCase();\n if (trimmed.startsWith('#')) {\n if (trimmed.length === 4) {\n return `#${trimmed[1]}${trimmed[1]}${trimmed[2]}${trimmed[2]}${trimmed[3]}${trimmed[3]}`;\n }\n return trimmed;\n }\n\n const rgbMatch = trimmed.match(\n /^rgba?\\(\\s*([0-9.]+)\\s*,\\s*([0-9.]+)\\s*,\\s*([0-9.]+)(?:\\s*,\\s*[0-9.]+\\s*)?\\)$/,\n );\n if (!rgbMatch) {\n return color;\n }\n\n const [, r, g, b] = rgbMatch;\n return `#${toHex(Math.round(Number(r)))}${toHex(Math.round(Number(g)))}${toHex(Math.round(Number(b)))}`;\n};\n\nexport const getTextInspection = (element: HTMLElement): TextInspection => {\n const style = window.getComputedStyle(element);\n return {\n fontFamily: style.fontFamily,\n fontSize: style.fontSize,\n fontWeight: style.fontWeight,\n lineHeight: style.lineHeight,\n letterSpacing: style.letterSpacing,\n color: normalizeColorToHex(style.color),\n textAlign: style.textAlign,\n };\n};\n\nconst parseEdge = (value: string) => Number.parseFloat(value) || 0;\n\nexport const getInspectMeasurement = (element: HTMLElement): InspectMeasurement => {\n const rect = getRectFromDom(element);\n const style = window.getComputedStyle(element);\n const parentElement = element.parentElement;\n const parentStyle = parentElement ? window.getComputedStyle(parentElement) : null;\n const padding = {\n top: parseEdge(style.paddingTop),\n right: parseEdge(style.paddingRight),\n bottom: parseEdge(style.paddingBottom),\n left: parseEdge(style.paddingLeft),\n };\n const margin = {\n top: parseEdge(style.marginTop),\n right: parseEdge(style.marginRight),\n bottom: parseEdge(style.marginBottom),\n left: parseEdge(style.marginLeft),\n };\n const rowGap = parentStyle ? parseEdge(parentStyle.rowGap) : 0;\n const columnGap = parentStyle ? parseEdge(parentStyle.columnGap) : 0;\n const parentDisplay = parentStyle?.display ?? '';\n const hasGap =\n !!parentElement &&\n (parentDisplay.includes('flex') || parentDisplay.includes('grid')) &&\n (rowGap > 0 || columnGap > 0);\n\n return {\n rect,\n paddingRect: {\n left: rect.left + padding.left,\n top: rect.top + padding.top,\n width: Math.max(0, rect.width - padding.left - padding.right),\n height: Math.max(0, rect.height - padding.top - padding.bottom),\n },\n marginRect: {\n left: rect.left - margin.left,\n top: rect.top - margin.top,\n width: rect.width + margin.left + margin.right,\n height: rect.height + margin.top + margin.bottom,\n },\n padding,\n margin,\n gap: {\n row: rowGap,\n column: columnGap,\n active: hasGap,\n },\n parentRect: hasGap && parentElement ? getRectFromDom(parentElement) : null,\n label: getElementLabel(element),\n styles: getTextInspection(element),\n };\n};\n\nconst isVisibleTextCandidate = (element: HTMLElement) => {\n const text = element.innerText?.trim() ?? '';\n if (!text) {\n return false;\n }\n\n const style = window.getComputedStyle(element);\n if (\n style.display === 'none' ||\n style.visibility === 'hidden' ||\n Number.parseFloat(style.opacity || '1') === 0\n ) {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n if (rect.width < 8 || rect.height < 8) {\n return false;\n }\n\n for (const child of Array.from(element.children)) {\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n if ((child.innerText?.trim() ?? '') && child.getBoundingClientRect().height > 0) {\n return false;\n }\n }\n\n return true;\n};\n\nexport const getVisibleTextBlocks = (\n overlayElement: HTMLElement | null,\n limit = 160,\n): TextBlockAnnotation[] => {\n if (typeof document === 'undefined') {\n return [];\n }\n\n const nodes = Array.from(document.querySelectorAll('body *'));\n const blocks: TextBlockAnnotation[] = [];\n\n for (const node of nodes) {\n if (!(node instanceof HTMLElement)) {\n continue;\n }\n if (overlayElement && overlayElement.contains(node)) {\n continue;\n }\n if (!isVisibleTextCandidate(node)) {\n continue;\n }\n\n const rect = getRectFromDom(node);\n const text = (node.innerText || node.textContent || '').replace(/\\s+/g, ' ').trim();\n blocks.push({\n id: `${node.tagName.toLowerCase()}-${Math.round(rect.left)}-${Math.round(rect.top)}-${text.slice(0, 24)}`,\n rect,\n text,\n styles: getTextInspection(node),\n });\n\n if (blocks.length >= limit) {\n break;\n }\n }\n\n return blocks;\n};\n\nexport const getTargetElement = (\n point: { x: number; y: number },\n overlayElement: HTMLElement | null,\n) => {\n if (typeof document === 'undefined') {\n return null;\n }\n\n if (overlayElement) {\n const previous = overlayElement.style.pointerEvents;\n overlayElement.style.pointerEvents = 'none';\n const elements = document.elementsFromPoint(point.x, point.y);\n overlayElement.style.pointerEvents = previous;\n\n for (const element of elements) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (overlayElement.contains(element)) {\n continue;\n }\n if (element === document.body || element === document.documentElement) {\n continue;\n }\n const rect = element.getBoundingClientRect();\n if (rect.width <= 2 || rect.height <= 2) {\n continue;\n }\n return element;\n }\n\n return null;\n }\n\n return document.elementFromPoint(point.x, point.y) as HTMLElement | null;\n};\n","import {\n InspectorCheckpointRecord,\n recentActivityFirst,\n} from './checkpoints';\n\ninterface RankedCheckpoint {\n checkpoint: InspectorCheckpointRecord;\n score: number;\n}\n\nexport function fuzzyCheckpoints(\n checkpoints: InspectorCheckpointRecord[],\n query: string,\n): InspectorCheckpointRecord[] {\n const normalizedQuery = normalize(query.trim());\n if (!normalizedQuery) return [...checkpoints].sort(recentActivityFirst);\n\n return checkpoints\n .map((checkpoint): RankedCheckpoint | null => {\n const score = fuzzyScore(checkpoint.name, normalizedQuery);\n return score === null ? null : { checkpoint, score };\n })\n .filter((item): item is RankedCheckpoint => item !== null)\n .sort((a, b) => b.score - a.score || recentActivityFirst(a.checkpoint, b.checkpoint))\n .map(({ checkpoint }) => checkpoint);\n}\n\nexport function fuzzyScore(value: string, normalizedQuery: string): number | null {\n const candidate = normalize(value);\n if (candidate === normalizedQuery) return 10_000;\n if (candidate.startsWith(normalizedQuery)) return 8_000 - candidate.length;\n\n const substringIndex = candidate.indexOf(normalizedQuery);\n if (substringIndex >= 0) return 6_000 - substringIndex * 10 - candidate.length;\n\n let queryIndex = 0;\n let firstIndex = -1;\n let lastIndex = -1;\n let gapPenalty = 0;\n for (let index = 0; index < candidate.length && queryIndex < normalizedQuery.length; index += 1) {\n if (candidate[index] !== normalizedQuery[queryIndex]) continue;\n if (firstIndex < 0) firstIndex = index;\n if (lastIndex >= 0) gapPenalty += index - lastIndex - 1;\n lastIndex = index;\n queryIndex += 1;\n }\n if (queryIndex !== normalizedQuery.length) return null;\n return 4_000 - firstIndex * 10 - gapPenalty * 20 - candidate.length;\n}\n\nfunction normalize(value: string): string {\n return value\n .normalize('NFKD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLocaleLowerCase();\n}\n","export const createId = () =>\n typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID()\n : `${Date.now()}-${Math.random()}`;\n\nexport const formatValue = (value: number) => Math.round(value);\n\n/** Ultra-compact relative time for dense command-palette metadata. */\nexport const formatRelativeTime = (iso: string, now = Date.now()): string => {\n const then = Date.parse(iso);\n if (Number.isNaN(then)) {\n return '';\n }\n\n const seconds = Math.round((now - then) / 1000);\n if (seconds < 45) {\n return 'now';\n }\n if (seconds < 90) {\n return '1m';\n }\n\n const minutes = Math.round(seconds / 60);\n if (minutes < 60) {\n return `${minutes}m`;\n }\n\n const hours = Math.round(minutes / 60);\n if (hours < 24) {\n return `${hours}h`;\n }\n\n const days = Math.round(hours / 24);\n if (days < 30) {\n return `${days}d`;\n }\n\n const months = Math.round(days / 30);\n if (months < 12) {\n return `${months}mo`;\n }\n\n return `${Math.round(months / 12)}y`;\n};\n","/**\n * Five-frame measuring caterpillar sprite generated for inspector-ng.\n */\nexport const MEASURE_CATERPILLAR_SPRITE_SRC =\n 'data:image/png;base64,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';\n","/**\n * Five-frame cat sprite generated for inspector-ng.\n */\nexport const CAT_PET_SPRITE_SRC =\n 'data:image/png;base64,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';\n","/**\n * Five-frame corgi sprite generated for inspector-ng.\n */\nexport const DOG_PET_SPRITE_SRC =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAUBAMAAACJ7oWmAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAAnUExURQAAAE0fCC0UA+uiI+edH/z339y1Yfzws3Q7NfHclrJvFCQVCgAAAK1KMdAAAAABdFJOUwBA5thmAAAAAWJLR0QAiAUdSAAAAAd0SU1FB+oHDw8WCxFedWAAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjYtMDctMTVUMTU6MjE6MTArMDA6MDAyiCFoAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDI2LTA3LTE1VDE1OjIxOjEwKzAwOjAwQ9WZ1AAAACh0RVh0ZGF0ZTp0aW1lc3RhbXAAMjAyNi0wNy0xNVQxNToyMjoxMSswMDowMFmACLwAAAAQY2FOdgAAABQAAAAUAAAAAAAAAADWpPidAAABfElEQVQoz+1SsU7DMBA9JwEhJqcJRHRKuzAwoTOygKl1IIIupC1FbJUYWJu0kjsyIDEjIXVF4guY+D1sxzYLEzOeXt67d37OHcD/+cuhxCHyi5p7klJfx9Lcwr2eY4mjSJVaFM4H3nJSeEvlLOE6tupt31HTobdcYu0sonH6vbNMxMKiKfdXI15YWCB3lplFuwJtmx2Gc6tGgn3lznKkkulwCeNPQBSKCjZS31sanX+aKADbyA4bCG5UR4YKkTHEMROjGshriqeClWOATF2MhdStwwGKJZcq7nVSCGnQQ4LsTQyVfiywbNUwVWgjTRaByKV+foQaVfpxipsILqnKrCgpaasaYOIL9BaUTfs/dKUiI6YL1zoNommijylctCQyOTZPNy29Obcqb3NBUko07md2INn6SrklfiAOVrrycbPiTbsicsns+LIu3O1r8NKdxxIyCkFFY7ksZ7q0U2VnZgBB/U5qO5Ygho4ZdKC2rvezjcSuTsduZUyhr6lvyShR59gPvCUAAAAASUVORK5CYII=';\n","/**\n * Five-frame bunny sprite generated for inspector-ng.\n */\nexport const BUNNY_PET_SPRITE_SRC =\n 'data:image/png;base64,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';\n","/**\n * Five-frame pet sprites generated for inspector-ng.\n */\nexport const GENERATED_PET_SPRITES = {\n fox: 'data:image/png;base64,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',\n panda: 'data:image/png;base64,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',\n frog: 'data:image/png;base64,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',\n axolotl: 'data:image/png;base64,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',\n raccoon: 'data:image/png;base64,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',\n duckling: 'data:image/png;base64,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',\n turtle: 'data:image/png;base64,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',\n hedgehog: 'data:image/png;base64,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',\n 'red-panda': 'data:image/png;base64,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',\n penguin: 'data:image/png;base64,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',\n} as const;\n\n","/**\n * Five-frame pet sprites generated for inspector-ng.\n */\nexport const GENERATED_EXTRA_PET_SPRITES = {\n otter: 'data:image/png;base64,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',\n capybara: 'data:image/png;base64,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',\n shiba: 'data:image/png;base64,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',\n mouse: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAUCAYAAAB7wJiVAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAAGYktHRAAAAAAAAPlDu38AAAAHdElNRQfqBw8QGRQMtIAXAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDI2LTA3LTE1VDE2OjI1OjIwKzAwOjAwCCbqPwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyNi0wNy0xNVQxNjoyNToyMCswMDowMHl7UoMAAAAodEVYdGRhdGU6dGltZXN0YW1wADIwMjYtMDctMTVUMTY6MjU6MjArMDA6MDAubnNcAAAAEGNhTnYAAAAUAAAAFAAAAAAAAAAA1qT4nQAACshJREFUWMPtmHl0VVWWh79z33t5BGJCEjITMo+8kIRJnEIQZDBMBSpYqIgEgZRKgICgFjhBCVKUjaxUlc0oiCCDoDLjgFBCYdKMCYQkAhkgEOYQSN579+7+A1faNFA86O6lqxf7r7vOuedbv3t/e5997oV7cS/uxb34zcSO7Vtkb/4OudW8+dcW+P85skdmS1LreLy9vXBqOqdP1VJ+rAqlCTGRNin+6ZD672vuGfJ/FNEhLcU3Mp5BzeHy0cPsioth+aqFVFZUY7VaMGmWu4cH9Q6WFcuWSmD7QAFYNH+BfL9tq9wtr/koX1n32XJpHhYgAMsWLZbt/wPebzG2rF0t+vqlom9eLmfffls+Gz5OvtuyWb7btFG+3fiVlO7dLXOmz7zhmbXbgTOH/0GGBw2lw45/8unbi0iITJLyY9V8+/WeuxIaGhQpk91GkbA7j6XvzSUyNEqKj1Tw7bY84p+O+U2YEtuirfy4Y5ucOl56PWEWLpLN69bdmTaTG2J1RzQN73ZxtJI6HA4dA0FQlFWdJTk1kb153zTiqttxv9uyWR52VqNE2LdqN1eG9MOkNHTdgdVqoVPnbrdl/DI2r/tcupprUCaN/KU7cQ5/CrvTieg6fj5e2Do+eEe8/+1IiEySD995jdiD+1lxxUzBhTJ8mwZgsmisCVhNydQSl/SF+PvLDy+MIDgtCc1iZvGeUsLbJYEIKBPK0EFTWMwWhh96kaLsYwpcqBAFYHajYP2P+Ad6UnykhLp6O4YuXLtWT+mhfXeUOSZNgdlK0Yb9hAb7UVRUgq7rgOLsxRoO5+3+Vatk9ux3SffWCX60Lb/3Uwx9fgi9nkjj8f7pbOi/FFt0kkv6Ks+cUb1XreWrS034pKiGgPg4MASUoluvXvTs05emHp7Y7fXEfBXXsO62hixbvJLz3xymdUZH5mw7RGRMBEoJ9Y46Jkx+g4pTp0iKSnT5JY4Ylk3FD0eI7ZHKpPU7aRXWEg2F3WknvXsPqs5dJNq/1a9myrX6ayizO0o0AqOCuXa1Hk3MiChOVV/iw7nvucw6WFKgsua8RsmJUzRtZr2e3SJs2/glG7/4nMsXqwnysfL+ay8R7OUnLhny90/mqSe37uL5JVvpPiULAEHo88Qg9h44iKELuX/7i8sij509roZu28mzizfR7/XRCCDo9OjdFwDD0Fm0fP6v5QcDBg1W8/ZXcHpnHhPnrMXd3YoYQl19HY/1ykApjcd6PHpDwrQdFCtd23SQjJD0RnMZCT3RlY6u6wQ0t+LR1Io4hIMHj7Nt404iQzzo9mQmP44YgkuGAGzP36QiwmMwWwTD6SQ55D7qKg/grDlGWpIfH05/l5ovVruc1dv/sVX5tfDHy7sZGAbhPk1wVB1EaitJT2nBp8uWcf6jv91xlcz/+0dSsDf/50a8QD5fufKuKm3khDGq07wVtBn+NGIYaJrCrGkoud6Sp746keDEsAZ2vK2T5I+aQdnVqxSrcrqmPCAAreM6SI8u7XjogUT25R+h6nwdly9fIcSnGfbLF5mc1ZOLZy9xn5cnIbM+UOBCUwfIyZokXXs9QHFhGbbkKDQBT3fFT/kFdM3oRDMvC25B97vcjF8ZmSOPP/4ghQVlpKTG4rDXEdLCkxYeBp7+wZg0B9aA1Dtq7l9vXCfp7nDl2z3sT3uE3w8eDZpOxemyuzokTM6eIkGBASTawmjp70n1uVry9hwk+9UB1F/SqXl/Pn6zZiqA4rnTpf+MBRSUX2/4YX5hQr8mTEqaQGxM8M+mwrVaO9EtHChdJ3PyHOqu2tlT8B+N9N32w7BjmzTp0qMTZqWR0Dqcr7fsYVg/G4YhvDR9Do53/8q5C6UuP3RQQJj07tsZpTTaJEfjdDqorDjLk8+NxOpmwquJByXlrp1kfhmBX21CBnTj5Nk6dLuwZMlfMQwdfx8vSer0sMs837eC5E/ebxEeHoCIcKSwjLLjJjIe9Me9XTiqSSzx0dEcKTnawDxXeQGncf36gdhOsuvobtW5sJdE9A3A0J2cPHmOVmFBKFM9MWl9MaqLWPLnHMLSnrhB1223rB6PdcVqMVNwoAwNE13SU4jq+AhRcRHYVd0dmQEw4pnM6xcCStPQlIXQsBC+WLGElUsWcjj3TUIDw8Xx5WKXt5vYmEQpSesCuk5segoOw4khBiaziXOXa8n/YYfLrFfqsomMDqGg8DgWNzf2FhzguYEduHj+Cu17P6XAUL80A+D06SvsWzQVgF1HdyuA5OS2mMwmNLOZqupqxo99ne66HTasQdd1Hnp6HFfXrrz5h2FcQJI4lsyT1FZtG90QFB4vYZHBGIZBYptWlFVU8tywLC58sAgxN2VqQlts8yJugMYmdhDnwrmSFH9/o7nQVjbx9vYEAU1dPwLfH9uUIOsVLhzazbMvvISlzzOqvOq4svQZelujx46ZKF9vWC+5//Y+Tdyb0Gb0O4SNeh2F6Xoy9e7HpStXuVJTe8Pa1JiUG3W/dr/EJYQAYLNF8nJWDrn9OmI3NKLiorAvmHdTY1/9/gfObClsNNasiQV7XT2I0K5tIrNmv0Ohh4EjxYbJbMFhr6dp/ydvXiEHcsdieTZT7S1rvJ+J5sBud6CUCU0pQkODePkPY/B8vjtKnIzZsUkdyjx2A3TflJGYh72kDh75Z2PeVQN3D3dEBFEKp1PHIzCI+NYxZAzuTfnJm1dby/YhjV5Esl+MZPYeKBk9038+2ivMFhPTpk1h2PAX0NBRCr5ctZz8HbvolOjDj4NebGD8lDtLqgbUcOrNKTK11+8axs37zmO/6kABmsnEB3NmkDpuOlazCY/Ynri9kHlTfUdK9qs1Jcewr/usgSVOoaLsDIJCKYWIsGFXOWY3BYbBfe6+N00yM0DhZ4do/0q85M050rjBuLlzvLQKk2YhMioQhaKivBKUorTo6C0z98A3h/F+NlguLDnZiJe8LJy8jw/icDpJSAzHQLhQdgIvXx86dBl9S15FXqWyL1koprAAqrftYO3eo5RExmE4dTRNcelCDZ5eHjTzsNI5rS3784qpMwld45ozJCMV28NDKD5R3KAlMitHAQTxNrY4mzhz54pDCQ/N/HfsjxsIoCEUFZSy6eNp7NuxixC/CErL9t9S49jPl6vcnQVSOnS0+CeF8dSXOwkJDeDMmfME+jcHpRHuA2cqTqHqHJSUFd7U3IbB8vdniW9sEGmTZmA1m9k+MZPi/EoGrlnHmPFjCA1pzuXaenxqj+Ph48GEy2v4x4vf33JbufDeDLG2aUXX8TPBTbFzejaH1x7giS/WMX58Du4+VqbN/AuzsweRM3sFBSX7Xe5Fwzo/Iv1HvUwzz2ZUn7mEt72Cbn26cexQIevzzpNoCyNn3Bu8OS6LAVmjXeY6NqyWxFFT6ZeRwarNqxGnEBcczaGaIk4WHHeZkxiQLErXebRvd8LCQ9E0mPvRIqaO/h1/zF2IMtxwTLBzMvvEv2b6PRMvtpgUscWmSkpEckP5BdoipebP78nJl0dIbIRN5j82TKo//VgSQlr+y2YZFZwgSTEpkhrXXtqE/Rdv0+DRUrt/s1zbuk78ouJlz8BMOTHtTy43XvvCXAGIiIiVTc9n3bAu2NdXrn4yT6qWLhDficEuc4/lvHHDvRV/fEuKxmbf9Z+D0smTRHZvEKneJcHNE6Rf1IMyOL6DDOyQflPmfwISYKHFYe3G0AAAAABJRU5ErkJggg==',\n hamster: 'data:image/png;base64,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',\n koala: 'data:image/png;base64,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',\n sloth: 'data:image/png;base64,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',\n seal: 'data:image/png;base64,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',\n octopus: 'data:image/png;base64,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',\n crab: 'data:image/png;base64,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',\n bee: 'data:image/png;base64,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',\n moth: 'data:image/png;base64,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',\n bat: 'data:image/png;base64,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',\n owl: 'data:image/png;base64,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',\n parrot: 'data:image/png;base64,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',\n chameleon: 'data:image/png;base64,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',\n gecko: 'data:image/png;base64,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',\n snail: 'data:image/png;base64,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',\n triceratops: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAUCAYAAAB7wJiVAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAAGYktHRAAAAAAAAPlDu38AAAAHdElNRQfqBw8QGRrrDK0QAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDI2LTA3LTE1VDE2OjI1OjI2KzAwOjAwa/bfBQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyNi0wNy0xNVQxNjoyNToyNiswMDowMBqrZ7kAAAAodEVYdGRhdGU6dGltZXN0YW1wADIwMjYtMDctMTVUMTY6MjU6MjYrMDA6MDBNvkZmAAAAEGNhTnYAAAAUAAAAFAAAAAAAAAAA1qT4nQAAC5VJREFUWMPtmGl4VVWWht+1z7lDJm4gkCCGME8qCqIgKliABSVqqyCTOBQiZduAj7aKqFTJo2UhqGhbKiVtiRMlERAEZBQoEGVQQR4QLI0yFwQSk5Dp3nvO2at/xKKbgkC0fOw/fH/PXt9ee317fXvvA2dwBmdwBmdwBj8TvE/v1Fj2VfpT8dnND+qwyPM/Gd9PjW4XXKAp6b/42fJz6zqw/K93atT1+PWWDpQuSCKX/GsTex//u4p3hGGfZBMe+S289HMtuW6o2nCvOtXFjCjowrrm6wj98l/ju7bfL7WpreKlFR/JqcadVpCMWD8tWZTNbTvOJWk9ImLoMS+XzEaXa+mRdXK6+H9GWv1uWrLgPG7/4hyCqjihlDB+p9ZE0s7RROWOH8z3U6OfO0EXr93L8K15uLYZxsDAzzoSy9qjZcWbfnB+uu0O9b47ym07ujL1vC+5a0yudh18kOrE2pNymdMRuhoB6/FKu4+JOCEIOeQ2rc/2r57430l1dZ1b2niCsVUMTD+IpkVQ6/Ptlwf4au+0/8O39v/Nwkr8wxAkeb3Np2jIARxS6sVockmTY2MiDfvXOb/3d8bAhCASZeQXnbl9VQvqXXY2JuXfFOBI+fvHcZ22Q/bmhxn+RTcccTAEBAIv/qYxFXY/blo33VUyBhMeUecF78vPodeipmS3OYuIb0moMveJrrihMkKN+uquA3eQ0Wb0jy5ouH4vlbBDovCDH9Vt6z/16bnwHJo1z8K1Fh+fzzcXsPLdAbTPKtedxbfx2fYjXN9l8Wm5Muv11LeO5vFmYVNMxGIFoqkRPlsygNbtZvC3nW/rDcNeOy7mtIKkZESIGEgai0gIY6H7qA14VWEGP3sTSzaVot7uOi0+Fh2kabEQzc/NRT0H6wiuOhQcLmfkI9sYNOka3l27n4qCbT+4mFmZXfTgwg6M+qo7L7dZQ7TnjxM0qDxKXtMGiO+D40BgyGyUxZtLv+Oqp/rz5a5KCq5oWSeuwiWtMN4qbv1bb6oqfTLSQ9hQGvmrCxgwoT/jZx0lsSr3uJjTWlbjcR6795cjHogqjmvoemkbul+Zh6PC+m/qfC+gLD5bus44m+ID1RD4GCM4Aq8sK+WSHrm4GDb/vd4PLmLVX2/Vu6feyE1bO+Mlffq834G0Blf+KNvL6Lud0sLvEHUIPIsgtG6RxY6DhpC4TJlZxP0VN9Rpw6T138KgLT0QX6mXEUXE0DIvjS370lEvwPE9tjsFAGQ26qu1CvLI2nn62MYZ2mb8k3ro2VTW9PscJ+qgQOD7vPvoSuaMm0ugUFkRJ9aovxZ6b9ZagMfW/lmnbs3XdmMm6sejSnFzGqKqKGDVcnPnJrwzbjZBYEkk4qQ27KV74+/UuaBDt3fikbbbSQuHkahLbvNMCg6OBSArY6gejOefkuv2GS/qU5+9ph3u/r3GN17E4h77AYtxXdRa3v3te8yeMAdroeFZGWQ0HKgJb3mtnE9+NF8f2/iGVi67jHc6bkbCDtZaQNDA8vb42UTCEVC4YXIf9sXzteTwY5xUkPvmTdUtH31KYEOkx0vpOCOHznO6YnwfAQRDvHIvKgGOY3Adh537RzFzxZ6TJtf5nt/q7oMem78pok/Pxlz4egPiR4pQBBQQQ/8+U7HfC+SI8OW+0cz7oKBOYkj4XH2g6bf0XtgMK4L4yvMjWvH514UMnfaMbj5yPW2zptcan/er23T9tqOUxA2X/yJG19dy6b2yJaFQhMD3UQOJuI/v+biugzgu2/cP5Ui8+qR854x+SKfP2Mau3Udp/4pw49bz2b+7CFWLqiUUDnPTU0MICEAVAjhYnkJG9ria9fwzYdu7JurFXRoQ+BZjDArMeeh1Kt9owR17exAYBzGKaE2oBVxjefvuJSSrlhzHF3OHaJ9pfYgGVYgjqAqIMK7+drLLvuKBxPWoEYwIYgxqLcnAJ+Q6zLl3GYnK909pDeEGfRQnzuA/XIvYVKxQI7JaVARBKNh2gI0vTK6V59LfP62J0jJatMoiEnIp+a6SlVNWsf5xh6nha7CehzGCtYqIwYjw9c5its7YSHXp4uN4Q/Wv1uuevoqoq3hxMG6I+2U55zRRur3XivM756EIAqgYNLAkqqqJZKQy9z/nkyj/QI7rkJSGF2m3Lo0QK7jGwRGDgzB08u2MONAT34Gt6/fg4oBjiHtxIuEQuJETxABIZhWRonGMcRFxMBiMGKaUnMf9/gDUNWzfdAA1ggJJ3yOWkQbGOaUYD294Q1vcNV5b3dKb3CG9+e82n2AtiBNCjMNf7n+DhQ9NQozQqlNTmqYO0V2Vc0+wmHBmJ22RHaFDuxwijoMoZMZSGfSHq5lY1pugOsHOnUcgUAyCui5WhFbt6jPQ73JCXv3G9yJFBeMZQgIm8Jia7MU1a84lO7seKoavd/wdx7igFuMaVr28hGRJgkR5za3w2Il8HWM1Y1Lb731ACKwlKi6+BDVtJAYReH3qxaxac5Df3bKAIJIBfgXJspNfMQc9cQM2CMCAIOz6qpAW7XIQC2JqdtsLk9rz4ZpiHr1jGeIa8Evxjm48jm/k9Of1rQkL8aqTDJw8gG92B5hkiE6d6yFpDci8fhG9Hr6EBhkWCbkYE6bKbwYiiFrWFt3AnOX7Tsxv8khUwRipsaRIGNeAWktG/TBqhBfGX8CYsbOxjTrQ8aJm7Fi/ky/f2UpVxfIT1hyrH0YDBSOIcRFbY3lNWp6FolhrGdGvKWvW72XWY5OOxc8Zt/oYhwBEGl6uNz4+GEIuFosJAFEOb9pAWawl7dvnoMA9A2KIRFm9eg/3Dby/1h0czemlQyfdiBf3ePuRt7h87EDyctOxIjw4JJUp+ZWghv37iul7YZTlHyUIJGDdUxNr5Rz+55dUkz5FxXGys1MRI+j3e94S8FL7rfSdlU2bjk0Qw/cWqCStxTUw+4HFeGVLBeDXM6erX5EkGglR7fkYAazl4ZtzSSSqmZJfhHEMvudx7+CGTHz0E5a8+Pwp7fOW6S+oFXAdQQOwVvFSDKFqRdUiIcM912XhYbmi1XMkyzbV/lJPFK2T/AdnMu/epbiOg6L4ClddexGb/msugQoBsHTVLi5pPYUlW5Knyo144WrJf2gVc3+3iOHP3Epe0wzUwuHDlSxYfAAwCPDhHxfx6PAVRNOFs1s2IO/82n/i5d/zJibkkJ2dhjEGMBhTc064bpj/+OJ82nZszNdfHyKcXh9rLWKgXmY6NgiOiQHw2vDfyFt3jpGkWkRBfUsghvnLCli5trDmvEPplBPm8rbPUJ0ao8d9D2tP976T5ufW76vViSoWv7qSQAWLYl3onO4x88FXEUfw4kk+WLOfK86bhm9rr92xM8Q/ulGqyhcIWtM2c8fPZP7qIjCKcWpKOHfZYbqP+BXYak6H6sK5Ei/6QJ4cmk1KqIot6/ax9b1PeX9dBWotxgjpJolftUJaNMuhV55S8u3JeaOxK/Sm525GVDGOUP5dOQsnzeTixgHDeka465oYpcVVIELbtjl41aWsnDafZS+tYP7kxVQcPAB0P66YoSb91fpKMuGxYf5m/jJqtDx08yIWrjqEEcHBMGHELCZUTsAPAm7sm0Xk1oqT5ueXLJc5Y8dJyfp5IgK+VWaNns6CNYVoVRzjOLhhl4Xrj9L9lj6o1P52O+GL9T0ah4vZtW8MLfJmYlLP4oXh2QREafb4KiT5ITiZpxXkHzg7dahEYpdqouxjScm7Wvcs30TzC1vRPOUQ+/Y8QixjEH8aMeqUdhCNpBBNlHH1Rem8OnMvXXo24NDunoy9eqwMTHlAfRWOBuV8nrqP1ndczJuPN+PZYWO4dewsVsw7wO2Pj2QRTx83h5PwMMWHaJcb4Z2lM2q+Va6Ry3oO08M2TN+WFfzx8H3EotcLU8F/+UHdUPny6R+EojSMFlNV+SixRn9CIlk8PSQHK4bc5u9x73NXMnppLwZf+vFJw/8HiDoF0acerF4AAAAASUVORK5CYII=',\n alpaca: 'data:image/png;base64,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',\n} as const;\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n Inject,\n Input,\n OnDestroy,\n PLATFORM_ID,\n computed,\n inject,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n GUIDE_HITBOX_SIZE,\n GUIDE_SNAP_DISTANCE,\n} from './constants';\nimport {\n getInspectMeasurement,\n getRectFromDom,\n getTargetElement,\n getVisibleTextBlocks,\n} from './dom';\nimport { getDistanceOverlay } from './distances';\nimport { clamp, getViewportSize, rectsEqual } from './geometry';\nimport {\n DistanceOverlay,\n Guide,\n GuideOrientation,\n InspectMeasurement,\n Rect,\n TextBlockAnnotation,\n ToolMode,\n} from './types';\nimport {\n checkpointActivityAt,\n InspectorCheckpointRecord,\n InspectorCheckpointService,\n} from './checkpoints';\nimport { fuzzyCheckpoints } from './checkpoint-search';\nimport { createId, formatRelativeTime, formatValue } from './utils';\nimport { MEASURE_CATERPILLAR_SPRITE_SRC } from './measure-caterpillar';\nimport { CAT_PET_SPRITE_SRC } from './pet-cat';\nimport { DOG_PET_SPRITE_SRC } from './pet-dog';\nimport { BUNNY_PET_SPRITE_SRC } from './pet-bunny';\nimport { GENERATED_PET_SPRITES } from './generated-pets';\nimport { GENERATED_EXTRA_PET_SPRITES } from './generated-pets-extra';\n\ntype InspectorCommandActionId = 'select' | 'type' | 'save' | 'vertical' | 'horizontal' | 'off';\n\ninterface InspectorCommandAction {\n readonly id: InspectorCommandActionId;\n readonly label: string;\n readonly ariaLabel: string;\n readonly keywords: string;\n}\n\nconst INSPECTOR_COMMAND_ACTIONS: readonly InspectorCommandAction[] = [\n { id: 'save', label: 'Save', ariaLabel: 'Save checkpoint', keywords: 'save checkpoint capture state' },\n { id: 'select', label: 'Select', ariaLabel: 'Select mode', keywords: 'select inspect pointer element' },\n { id: 'type', label: 'Type', ariaLabel: 'Toggle typography overlay', keywords: 'type typography text overlay' },\n { id: 'vertical', label: 'V', ariaLabel: 'Vertical guides', keywords: 'vertical v guide guides' },\n { id: 'horizontal', label: 'H', ariaLabel: 'Horizontal guides', keywords: 'horizontal h guide guides' },\n { id: 'off', label: 'Off', ariaLabel: 'Disable inspector', keywords: 'off disable inspector power' },\n];\n\nconst INSPECTOR_PETS = [\n {\n name: 'Measuring caterpillar',\n spriteSrc: MEASURE_CATERPILLAR_SPRITE_SRC,\n },\n {\n name: 'Pixel cat',\n spriteSrc: CAT_PET_SPRITE_SRC,\n },\n {\n name: 'Corgi',\n spriteSrc: DOG_PET_SPRITE_SRC,\n },\n {\n name: 'Bunny',\n spriteSrc: BUNNY_PET_SPRITE_SRC,\n },\n {\n name: 'Fox',\n spriteSrc: GENERATED_PET_SPRITES.fox,\n },\n {\n name: 'Panda',\n spriteSrc: GENERATED_PET_SPRITES.panda,\n },\n {\n name: 'Frog',\n spriteSrc: GENERATED_PET_SPRITES.frog,\n },\n {\n name: 'Axolotl',\n spriteSrc: GENERATED_PET_SPRITES.axolotl,\n },\n {\n name: 'Raccoon',\n spriteSrc: GENERATED_PET_SPRITES.raccoon,\n },\n {\n name: 'Duckling',\n spriteSrc: GENERATED_PET_SPRITES.duckling,\n },\n {\n name: 'Turtle',\n spriteSrc: GENERATED_PET_SPRITES.turtle,\n },\n {\n name: 'Hedgehog',\n spriteSrc: GENERATED_PET_SPRITES.hedgehog,\n },\n {\n name: 'Red panda',\n spriteSrc: GENERATED_PET_SPRITES['red-panda'],\n },\n {\n name: 'Penguin',\n spriteSrc: GENERATED_PET_SPRITES.penguin,\n },\n {\n name: 'Otter',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.otter,\n },\n {\n name: 'Capybara',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.capybara,\n },\n {\n name: 'Shiba inu',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.shiba,\n },\n {\n name: 'Mouse',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.mouse,\n },\n {\n name: 'Hamster',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.hamster,\n },\n {\n name: 'Koala',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.koala,\n },\n {\n name: 'Sloth',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.sloth,\n },\n {\n name: 'Baby seal',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.seal,\n },\n {\n name: 'Octopus',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.octopus,\n },\n {\n name: 'Crab',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.crab,\n },\n {\n name: 'Bumblebee',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.bee,\n },\n {\n name: 'Moth',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.moth,\n },\n {\n name: 'Tiny bat',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.bat,\n },\n {\n name: 'Owl',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.owl,\n },\n {\n name: 'Parrot',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.parrot,\n },\n {\n name: 'Chameleon',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.chameleon,\n },\n {\n name: 'Gecko',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.gecko,\n },\n {\n name: 'Snail',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.snail,\n },\n {\n name: 'Baby triceratops',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.triceratops,\n },\n {\n name: 'Alpaca',\n spriteSrc: GENERATED_EXTRA_PET_SPRITES.alpaca,\n },\n] as const;\n\n@Component({\n selector: 'inspector-overlay',\n standalone: true,\n imports: [],\n templateUrl: './inspector.component.html',\n styleUrl: './inspector.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class inspectorComponent implements OnDestroy {\n readonly Math = Math;\n readonly checkpointActivityAt = checkpointActivityAt;\n readonly formatValue = formatValue;\n readonly formatRelativeTime = formatRelativeTime;\n readonly guideHitboxSize = GUIDE_HITBOX_SIZE;\n readonly overlayRoot = viewChild<ElementRef<HTMLElement>>('overlayRoot');\n readonly checkpointDialog = viewChild<ElementRef<HTMLDialogElement>>('checkpointDialog');\n readonly checkpointSearch = viewChild<ElementRef<HTMLInputElement>>('checkpointSearch');\n\n @Input() highlightColor = '#4f8cff';\n @Input() guideColor = '#ff7a00';\n @Input() hoverHighlightEnabled = true;\n\n readonly checkpointService = inject(InspectorCheckpointService, { optional: true });\n readonly commandBarOpen = signal(false);\n readonly checkpointQuery = signal('');\n readonly activeCommandIndex = signal(0);\n readonly editingCheckpointId = signal<string | null>(null);\n readonly deletingCheckpointId = signal<string | null>(null);\n readonly renameDraft = signal('');\n readonly checkpointToast = signal<string | null>(null);\n readonly checkpointToastIsError = signal(false);\n readonly petIndex = signal(0);\n readonly activePet = computed(() => INSPECTOR_PETS[this.petIndex()]);\n readonly filteredCheckpoints = computed(() =>\n fuzzyCheckpoints(\n this.checkpointService?.checkpoints() ?? [],\n this.checkpointQuery(),\n ),\n );\n readonly filteredInspectorActions = computed(() => {\n const terms = this.checkpointQuery().trim().toLocaleLowerCase().split(/\\s+/).filter(Boolean);\n if (!terms.length) return INSPECTOR_COMMAND_ACTIONS;\n return INSPECTOR_COMMAND_ACTIONS.filter((action) => {\n const searchableText = `${action.label} ${action.ariaLabel} ${action.keywords}`.toLocaleLowerCase();\n return terms.every((term) => searchableText.includes(term));\n });\n });\n readonly commandResultCount = computed(\n () => this.filteredCheckpoints().length + this.filteredInspectorActions().length,\n );\n readonly activeCommandResultId = computed(() => {\n const checkpoint = this.filteredCheckpoints()[this.activeCommandIndex()];\n if (checkpoint) return `inspector-checkpoint-${checkpoint.id}`;\n const actionIndex = this.activeCommandIndex() - this.filteredCheckpoints().length;\n const action = this.filteredInspectorActions()[actionIndex];\n return action ? `inspector-action-${action.id}` : null;\n });\n\n readonly enabled = signal(true);\n readonly toolMode = signal<ToolMode>('none');\n readonly guideOrientation = signal<GuideOrientation>('vertical');\n readonly guides = signal<Guide[]>([]);\n readonly hoverRect = signal<Rect | null>(null);\n readonly selectedGuideId = signal<string | null>(null);\n readonly selectedMeasurement = signal<InspectMeasurement | null>(null);\n readonly showTypography = signal(false);\n readonly altPressed = signal(false);\n readonly distanceOverlay = signal<DistanceOverlay | null>(null);\n readonly textBlocks = signal<TextBlockAnnotation[]>([]);\n readonly guidePreview = signal<Guide | null>(null);\n\n readonly selectedMetaLine = computed(() => {\n const selected = this.selectedMeasurement();\n if (!selected) {\n return '';\n }\n return `${selected.label} · ${formatValue(selected.rect.width)} x ${formatValue(selected.rect.height)} · ${selected.styles.fontSize} / ${selected.styles.lineHeight} / ${selected.styles.color}`;\n });\n\n private readonly isBrowser: boolean;\n private readonly handleCapturedClick = (event: MouseEvent) => {\n if (\n !event.shiftKey ||\n !this.canInspectClick(event) ||\n !this.selectElementAtPoint(event)\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n };\n private draggingGuideId: string | null = null;\n private selectedElement: HTMLElement | null = null;\n private hoverElement: HTMLElement | null = null;\n private toastTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(@Inject(PLATFORM_ID) platformId: object) {\n this.isBrowser = isPlatformBrowser(platformId);\n }\n\n ngOnInit() {\n if (!this.isBrowser) return;\n\n window.addEventListener('click', this.handleCapturedClick, {\n capture: true,\n });\n }\n\n ngOnDestroy() {\n if (!this.isBrowser) {\n return;\n }\n\n window.removeEventListener('click', this.handleCapturedClick, {\n capture: true,\n });\n if (this.toastTimer) clearTimeout(this.toastTimer);\n }\n\n setToolMode(mode: ToolMode) {\n if (!this.enabled()) {\n this.enabled.set(true);\n }\n\n this.toolMode.set(this.toolMode() === mode ? 'none' : mode);\n this.hoverRect.set(null);\n this.guidePreview.set(null);\n this.distanceOverlay.set(null);\n this.refreshTypographyBlocks();\n }\n\n setGuideOrientation(orientation: GuideOrientation) {\n this.guideOrientation.set(orientation);\n this.guidePreview.set(null);\n }\n\n activateGuideOrientation(orientation: GuideOrientation) {\n const isActive = this.toolMode() === 'guides' && this.guideOrientation() === orientation;\n this.setGuideOrientation(orientation);\n if (isActive || this.toolMode() !== 'guides') {\n this.setToolMode('guides');\n }\n }\n\n toggleTypography() {\n this.showTypography.update((value) => !value);\n this.refreshTypographyBlocks();\n }\n\n disableInspector() {\n this.setInspectorEnabled(false);\n }\n\n async saveCheckpoint() {\n const checkpoint = await this.checkpointService?.save();\n if (checkpoint) {\n this.showCheckpointToast(`Saved “${checkpoint.name}”.`);\n } else if (this.checkpointService?.error()) {\n this.showCheckpointToast(this.checkpointService.error()!, true);\n }\n }\n\n async openCheckpointCommandBar() {\n if (!this.checkpointService || !this.isBrowser || this.commandBarOpen()) return;\n this.commandBarOpen.set(true);\n this.checkpointQuery.set('');\n this.activeCommandIndex.set(0);\n this.editingCheckpointId.set(null);\n this.deletingCheckpointId.set(null);\n this.checkpointService.clearError();\n this.checkpointDialog()?.nativeElement.showModal();\n queueMicrotask(() => this.checkpointSearch()?.nativeElement.focus());\n await this.checkpointService.load();\n this.clampActiveCommand();\n }\n\n closeCheckpointCommandBar() {\n if (this.checkpointService?.busy()) return;\n this.checkpointDialog()?.nativeElement.close();\n this.commandBarOpen.set(false);\n this.editingCheckpointId.set(null);\n this.deletingCheckpointId.set(null);\n }\n\n updateCheckpointQuery(event: Event) {\n this.checkpointQuery.set((event.target as HTMLInputElement).value);\n this.activeCommandIndex.set(0);\n this.editingCheckpointId.set(null);\n this.deletingCheckpointId.set(null);\n this.checkpointService?.clearError();\n }\n\n cyclePet(event?: Event) {\n event?.stopPropagation();\n this.petIndex.update((index) => (index + 1) % INSPECTOR_PETS.length);\n this.checkpointSearch()?.nativeElement.focus();\n }\n\n setActiveCheckpoint(index: number) {\n this.activeCommandIndex.set(index);\n }\n\n shouldShowCheckpointRoute(checkpoint: InspectorCheckpointRecord) {\n if (!checkpoint.route.trim()) return false;\n return this.normalizeCheckpointLabel(checkpoint.name) !== this.normalizeCheckpointLabel(checkpoint.route);\n }\n\n setActiveInspectorAction(index: number) {\n this.activeCommandIndex.set(this.filteredCheckpoints().length + index);\n }\n\n async executeInspectorAction(action: InspectorCommandAction) {\n if (this.checkpointService?.busy()) return;\n switch (action.id) {\n case 'select':\n this.setToolMode('select');\n this.closeCheckpointCommandBar();\n break;\n case 'type':\n this.toggleTypography();\n this.closeCheckpointCommandBar();\n break;\n case 'save':\n await this.saveCheckpoint();\n if (this.commandBarOpen()) {\n const index = this.filteredInspectorActions().findIndex(({ id }) => id === action.id);\n if (index >= 0) this.setActiveInspectorAction(index);\n }\n break;\n case 'vertical':\n this.activateGuideOrientation('vertical');\n this.closeCheckpointCommandBar();\n break;\n case 'horizontal':\n this.activateGuideOrientation('horizontal');\n this.closeCheckpointCommandBar();\n break;\n case 'off':\n this.closeCheckpointCommandBar();\n this.disableInspector();\n break;\n }\n }\n\n async restoreCheckpoint(checkpoint: InspectorCheckpointRecord) {\n if (!this.checkpointService || this.checkpointService.busy()) return;\n const restored = await this.checkpointService.restore(checkpoint.id);\n if (!restored) return;\n this.checkpointDialog()?.nativeElement.close();\n this.commandBarOpen.set(false);\n this.showCheckpointToast(`Restored “${checkpoint.name}”.`);\n }\n\n beginRename(checkpoint: InspectorCheckpointRecord, event?: Event) {\n event?.stopPropagation();\n if (this.checkpointService?.busy()) return;\n this.editingCheckpointId.set(checkpoint.id);\n this.deletingCheckpointId.set(null);\n this.renameDraft.set(checkpoint.name);\n queueMicrotask(() => {\n const input = this.checkpointDialog()?.nativeElement.querySelector<HTMLInputElement>(\n '.inspector-command-row__rename',\n );\n input?.focus();\n input?.select();\n });\n }\n\n updateRenameDraft(event: Event) {\n this.renameDraft.set((event.target as HTMLInputElement).value);\n this.checkpointService?.clearError();\n }\n\n async finishRename(checkpoint: InspectorCheckpointRecord) {\n if (await this.checkpointService?.rename(checkpoint.id, this.renameDraft())) {\n this.editingCheckpointId.set(null);\n this.checkpointSearch()?.nativeElement.focus();\n }\n }\n\n cancelRename() {\n this.editingCheckpointId.set(null);\n this.checkpointService?.clearError();\n this.checkpointSearch()?.nativeElement.focus();\n }\n\n beginDelete(checkpoint: InspectorCheckpointRecord, event?: Event) {\n event?.stopPropagation();\n if (this.checkpointService?.busy()) return;\n this.deletingCheckpointId.set(checkpoint.id);\n this.editingCheckpointId.set(null);\n }\n\n cancelDelete(event?: Event) {\n event?.stopPropagation();\n this.deletingCheckpointId.set(null);\n this.checkpointSearch()?.nativeElement.focus();\n }\n\n async confirmDelete(checkpoint: InspectorCheckpointRecord, event?: Event) {\n event?.stopPropagation();\n if (!await this.checkpointService?.delete(checkpoint.id)) return;\n this.deletingCheckpointId.set(null);\n this.clampActiveCommand();\n this.checkpointSearch()?.nativeElement.focus();\n }\n\n handleCheckpointDialogClick(event: MouseEvent) {\n if (\n event.target === this.checkpointDialog()?.nativeElement &&\n !this.checkpointService?.busy() &&\n !this.deletingCheckpointId()\n ) {\n this.closeCheckpointCommandBar();\n }\n }\n\n clearGuides() {\n this.guides.set([]);\n this.selectedGuideId.set(null);\n }\n\n trackGuide = (_index: number, guide: Guide) => guide.id;\n trackTextBlock = (_index: number, block: TextBlockAnnotation) => block.id;\n trackConnector = (\n _index: number,\n connector: DistanceOverlay['connectors'][number],\n ) => `${connector.x1}:${connector.y1}:${connector.x2}:${connector.y2}`;\n\n startGuideDrag(event: PointerEvent, guide: Guide) {\n event.preventDefault();\n event.stopPropagation();\n this.draggingGuideId = guide.id;\n this.selectedGuideId.set(guide.id);\n }\n\n formatEdges(edges: InspectMeasurement['padding']) {\n return `${formatValue(edges.top)} ${formatValue(edges.right)} ${formatValue(edges.bottom)} ${formatValue(edges.left)}`;\n }\n\n formatGap(selected: InspectMeasurement) {\n return `${formatValue(selected.gap.row)} / ${formatValue(selected.gap.column)}`;\n }\n\n @HostListener('window:keydown', ['$event'])\n handleKeydown(event: KeyboardEvent) {\n const key = event.key.toLowerCase();\n\n if (\n this.checkpointService &&\n !event.repeat &&\n (event.metaKey || event.ctrlKey) &&\n event.shiftKey &&\n key === 'p'\n ) {\n event.preventDefault();\n this.commandBarOpen() ? this.closeCheckpointCommandBar() : void this.openCheckpointCommandBar();\n return;\n }\n\n if (this.commandBarOpen()) {\n this.handleCommandBarKeydown(event, key);\n return;\n }\n\n if (\n event.key === 'Alt' &&\n this.enabled() &&\n this.toolMode() === 'select'\n ) {\n this.altPressed.set(true);\n this.updateDistanceOverlay();\n return;\n }\n\n if (key === 'escape' && this.hasInspectorCanvasState()) {\n event.preventDefault();\n this.clearInspectorCanvas();\n }\n }\n\n @HostListener('window:keyup', ['$event'])\n handleKeyup(event: KeyboardEvent) {\n if (event.key === 'Alt') {\n this.altPressed.set(false);\n this.distanceOverlay.set(null);\n }\n }\n\n private hasInspectorCanvasState(): boolean {\n return this.guides().length > 0 ||\n this.selectedMeasurement() !== null ||\n this.selectedGuideId() !== null ||\n this.hoverRect() !== null ||\n this.distanceOverlay() !== null ||\n this.altPressed() ||\n this.guidePreview() !== null ||\n this.draggingGuideId !== null;\n }\n\n private clearInspectorCanvas() {\n this.selectedMeasurement.set(null);\n this.selectedGuideId.set(null);\n this.hoverRect.set(null);\n this.distanceOverlay.set(null);\n this.altPressed.set(false);\n this.selectedElement = null;\n this.hoverElement = null;\n this.guidePreview.set(null);\n this.draggingGuideId = null;\n this.clearGuides();\n this.refreshTypographyBlocks();\n }\n\n private normalizeCheckpointLabel(value: string) {\n return value\n .trim()\n .toLocaleLowerCase()\n .replace(/^\\/+|\\/+$/g, '');\n }\n\n @HostListener('window:pointermove', ['$event'])\n handlePointerMove(event: PointerEvent) {\n if (!this.enabled() || !this.isBrowser) {\n return;\n }\n\n if (this.draggingGuideId) {\n this.guidePreview.set(null);\n const viewport = getViewportSize();\n this.guides.set(\n this.guides().map((guide) => {\n if (guide.id !== this.draggingGuideId) {\n return guide;\n }\n const rawPosition =\n guide.orientation === 'vertical' ? event.clientX : event.clientY;\n const max =\n guide.orientation === 'vertical' ? viewport.width : viewport.height;\n return { ...guide, position: clamp(rawPosition, 0, max) };\n }),\n );\n return;\n }\n\n if (this.toolMode() === 'guides') {\n this.hoverRect.set(null);\n this.hoverElement = null;\n this.distanceOverlay.set(null);\n\n if (\n this.overlayRoot()?.nativeElement.contains(event.target as Node) ??\n false\n ) {\n this.guidePreview.set(null);\n return;\n }\n\n this.guidePreview.set(this.getGuidePreview(event));\n return;\n }\n\n this.guidePreview.set(null);\n\n if (this.toolMode() !== 'select' || !this.hoverHighlightEnabled) {\n this.hoverRect.set(null);\n this.hoverElement = null;\n if (!this.altPressed()) {\n return;\n }\n }\n\n const target = getTargetElement(\n { x: event.clientX, y: event.clientY },\n this.overlayRoot()?.nativeElement ?? null,\n );\n if (!target) {\n this.hoverRect.set(null);\n this.hoverElement = null;\n this.distanceOverlay.set(null);\n return;\n }\n\n const rect = getRectFromDom(target);\n this.hoverElement = target;\n if (!rectsEqual(rect, this.hoverRect())) {\n this.hoverRect.set(rect);\n }\n this.updateDistanceOverlay();\n }\n\n @HostListener('window:pointerup')\n handlePointerUp() {\n if (!this.draggingGuideId) {\n return;\n }\n this.draggingGuideId = null;\n }\n\n @HostListener('window:click', ['$event'])\n handleClick(event: MouseEvent) {\n if (!this.enabled() || !this.isBrowser) {\n return;\n }\n\n const overlay = this.overlayRoot()?.nativeElement ?? null;\n\n if (this.toolMode() === 'guides') {\n if (overlay && overlay.contains(event.target as Node)) {\n return;\n }\n const guide = this.getGuidePreview(event);\n this.addGuide({ ...guide, id: createId() });\n this.guidePreview.set(guide);\n return;\n }\n\n if (!this.canInspectClick(event)) {\n return;\n }\n\n this.selectElementAtPoint(event);\n }\n\n @HostListener('window:resize')\n @HostListener('window:scroll')\n handleViewportChange() {\n if (this.selectedElement && document.contains(this.selectedElement)) {\n this.selectedMeasurement.set(getInspectMeasurement(this.selectedElement));\n }\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n }\n\n private canInspectClick(event: MouseEvent) {\n if (!this.enabled() || !this.isBrowser || this.toolMode() !== 'select') {\n return false;\n }\n\n const overlay = this.overlayRoot()?.nativeElement ?? null;\n return !(overlay && overlay.contains(event.target as Node));\n }\n\n private setInspectorEnabled(enabled: boolean) {\n this.enabled.set(enabled);\n if (!enabled) {\n this.toolMode.set('none');\n this.hoverRect.set(null);\n this.selectedGuideId.set(null);\n this.selectedMeasurement.set(null);\n this.distanceOverlay.set(null);\n this.textBlocks.set([]);\n this.guidePreview.set(null);\n this.altPressed.set(false);\n this.selectedElement = null;\n this.hoverElement = null;\n this.draggingGuideId = null;\n }\n this.refreshTypographyBlocks();\n }\n\n private handleCommandBarKeydown(event: KeyboardEvent, key: string) {\n const checkpoints = this.filteredCheckpoints();\n const actions = this.filteredInspectorActions();\n const activeCheckpoint = checkpoints[this.activeCommandIndex()];\n const activeActionIndex = this.activeCommandIndex() - checkpoints.length;\n const activeAction = actions[activeActionIndex];\n const target = event.target as HTMLElement | null;\n const isRenameInput = target?.classList?.contains('inspector-command-row__rename') ?? false;\n\n if (key === 'escape') {\n event.preventDefault();\n if (this.editingCheckpointId()) this.cancelRename();\n else if (this.deletingCheckpointId()) this.cancelDelete();\n else this.closeCheckpointCommandBar();\n return;\n }\n if (this.checkpointService?.busy()) return;\n const editingCheckpoint = checkpoints.find(({ id }) => id === this.editingCheckpointId());\n if (isRenameInput && key === 'enter' && editingCheckpoint) {\n event.preventDefault();\n void this.finishRename(editingCheckpoint);\n return;\n }\n if (isRenameInput) return;\n if (key === 'arrowdown') {\n event.preventDefault();\n if (activeCheckpoint) {\n const nextIndex = this.activeCommandIndex() < checkpoints.length - 1\n ? this.activeCommandIndex() + 1\n : actions.length ? checkpoints.length : this.activeCommandIndex();\n this.activeCommandIndex.set(nextIndex);\n }\n this.scrollActiveCommandIntoView();\n return;\n }\n if (key === 'arrowup') {\n event.preventDefault();\n if (activeAction && checkpoints.length) {\n this.activeCommandIndex.set(checkpoints.length - 1);\n } else if (activeCheckpoint) {\n this.activeCommandIndex.set(Math.max(0, this.activeCommandIndex() - 1));\n }\n this.scrollActiveCommandIntoView();\n return;\n }\n if (key === 'arrowright' && (activeCheckpoint || activeAction) && actions.length) {\n event.preventDefault();\n const nextActionIndex = activeAction\n ? Math.min(activeActionIndex + 1, actions.length - 1)\n : 0;\n this.activeCommandIndex.set(checkpoints.length + nextActionIndex);\n this.scrollActiveCommandIntoView();\n return;\n }\n if (key === 'arrowleft' && activeAction) {\n event.preventDefault();\n this.activeCommandIndex.set(checkpoints.length + Math.max(0, activeActionIndex - 1));\n this.scrollActiveCommandIntoView();\n return;\n }\n if (key === 'enter' && activeCheckpoint && !this.deletingCheckpointId()) {\n event.preventDefault();\n void this.restoreCheckpoint(activeCheckpoint);\n return;\n }\n if (key === 'enter' && activeAction) {\n event.preventDefault();\n void this.executeInspectorAction(activeAction);\n return;\n }\n }\n\n private clampActiveCommand() {\n this.activeCommandIndex.set(\n Math.min(this.activeCommandIndex(), Math.max(0, this.commandResultCount() - 1)),\n );\n }\n\n private scrollActiveCommandIntoView() {\n queueMicrotask(() => {\n const row = this.checkpointDialog()?.nativeElement.querySelector<HTMLElement>(\n `[data-command-index=\"${this.activeCommandIndex()}\"]`,\n );\n row?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n private showCheckpointToast(message: string, isError = false) {\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.checkpointToastIsError.set(isError);\n this.checkpointToast.set(message);\n this.toastTimer = setTimeout(() => {\n this.checkpointToast.set(null);\n this.checkpointToastIsError.set(false);\n }, 2500);\n }\n\n private selectElementAtPoint(event: MouseEvent) {\n const overlay = this.overlayRoot()?.nativeElement ?? null;\n const target = getTargetElement(\n { x: event.clientX, y: event.clientY },\n overlay,\n );\n if (!target) {\n this.selectedMeasurement.set(null);\n this.selectedElement = null;\n this.distanceOverlay.set(null);\n this.refreshTypographyBlocks();\n return false;\n }\n\n // Ctrl+click: select the minimum common parent of current selection and clicked element\n if ((event.ctrlKey || event.metaKey) && this.selectedElement) {\n const commonParent = this.findMinimumCommonParent(\n this.selectedElement,\n target,\n );\n if (\n commonParent &&\n commonParent !== document.body &&\n commonParent !== document.documentElement\n ) {\n this.selectedMeasurement.set(getInspectMeasurement(commonParent));\n this.selectedElement = commonParent;\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n return true;\n }\n }\n\n this.selectedMeasurement.set(getInspectMeasurement(target));\n this.selectedElement = target;\n this.selectedGuideId.set(\n this.findGuideAtPoint(event.clientX, event.clientY),\n );\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n return true;\n }\n\n private updateDistanceOverlay() {\n if (\n !this.altPressed() ||\n !this.selectedElement ||\n !this.hoverElement ||\n this.selectedElement === this.hoverElement ||\n this.selectedElement.contains(this.hoverElement) ||\n this.hoverElement.contains(this.selectedElement)\n ) {\n this.distanceOverlay.set(null);\n return;\n }\n\n this.distanceOverlay.set(\n getDistanceOverlay(\n getRectFromDom(this.selectedElement),\n getRectFromDom(this.hoverElement),\n ),\n );\n }\n\n private refreshTypographyBlocks() {\n if (!this.isBrowser || !this.enabled() || !this.showTypography()) {\n this.textBlocks.set([]);\n return;\n }\n\n const viewport = getViewportSize();\n this.textBlocks.set(\n getVisibleTextBlocks(this.overlayRoot()?.nativeElement ?? null)\n .filter(\n (block) =>\n block.rect.top >= 0 &&\n block.rect.top <= viewport.height &&\n block.rect.left >= 0 &&\n block.rect.left <= viewport.width,\n )\n .map((block) => ({\n ...block,\n rect: {\n ...block.rect,\n left: clamp(block.rect.left, 0, viewport.width - 12),\n top: clamp(block.rect.top, 14, viewport.height),\n },\n })),\n );\n }\n\n private addGuide(guide: Guide) {\n const nextGuides = [...this.guides(), guide];\n this.guides.set(nextGuides);\n this.selectedGuideId.set(guide.id);\n }\n\n private getGuidePreview(event: PointerEvent | MouseEvent): Guide {\n const viewport = getViewportSize();\n const orientation = this.guideOrientation();\n const rawPosition =\n orientation === 'vertical' ? event.clientX : event.clientY;\n const max = orientation === 'vertical' ? viewport.width : viewport.height;\n\n return {\n id: 'preview',\n orientation,\n position: this.snapGuide(clamp(rawPosition, 0, max)),\n };\n }\n\n private snapGuide(position: number) {\n for (const guide of this.guides()) {\n if (Math.abs(guide.position - position) <= GUIDE_SNAP_DISTANCE) {\n return guide.position;\n }\n }\n return position;\n }\n\n private findGuideAtPoint(x: number, y: number) {\n for (const guide of this.guides()) {\n if (\n guide.orientation === 'vertical' &&\n Math.abs(guide.position - x) <= GUIDE_HITBOX_SIZE\n ) {\n return guide.id;\n }\n if (\n guide.orientation === 'horizontal' &&\n Math.abs(guide.position - y) <= GUIDE_HITBOX_SIZE\n ) {\n return guide.id;\n }\n }\n return null;\n }\n\n private findMinimumCommonParent(\n elementA: HTMLElement,\n elementB: HTMLElement,\n ): HTMLElement | null {\n // Build ancestor chain for element A\n const ancestorsA = new Set<Element>();\n let current: Element | null = elementA;\n while (current) {\n ancestorsA.add(current);\n current = current.parentElement;\n }\n\n // Walk up from elementB until we find a common ancestor\n current = elementB;\n while (current) {\n if (ancestorsA.has(current)) {\n return current as HTMLElement;\n }\n current = current.parentElement;\n }\n\n return null;\n }\n}\n","<div class=\"inspector-root\" #overlayRoot>\n @if (checkpointService) {\n <dialog\n #checkpointDialog\n class=\"inspector-command-dialog\"\n aria-labelledby=\"inspector-command-title\"\n (cancel)=\"$event.preventDefault(); closeCheckpointCommandBar()\"\n (click)=\"handleCheckpointDialogClick($event)\"\n >\n <section class=\"inspector-command\" (click)=\"$event.stopPropagation()\">\n <header class=\"inspector-command__search\">\n <label\n id=\"inspector-command-title\"\n class=\"inspector-visually-hidden\"\n for=\"inspector-checkpoint-search\"\n >\n inspector-ng command palette\n </label>\n <button\n type=\"button\"\n class=\"inspector-command__pet-switcher\"\n [attr.aria-label]=\"'Change pet. Current pet: ' + activePet().name\"\n [title]=\"'Change pet: ' + activePet().name\"\n (click)=\"cyclePet($event)\"\n >\n <img\n class=\"inspector-command__pet-sprite\"\n [src]=\"activePet().spriteSrc\"\n alt=\"\"\n aria-hidden=\"true\"\n draggable=\"false\"\n />\n </button>\n <input\n #checkpointSearch\n id=\"inspector-checkpoint-search\"\n type=\"search\"\n role=\"combobox\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n placeholder=\"inspector-ng…\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"commandBarOpen()\"\n [value]=\"checkpointQuery()\"\n [attr.aria-controls]=\"'inspector-checkpoint-results inspector-command-actions'\"\n [attr.aria-activedescendant]=\"activeCommandResultId()\"\n (input)=\"updateCheckpointQuery($event)\"\n />\n </header>\n\n @if (checkpointService.error(); as error) {\n <p\n class=\"inspector-command__message inspector-command__message--error\"\n role=\"alert\"\n >\n {{ error }}\n </p>\n }\n\n <div\n id=\"inspector-checkpoint-results\"\n class=\"inspector-command__results\"\n role=\"listbox\"\n aria-label=\"Saved checkpoints\"\n >\n @if (checkpointService.loading()) {\n <p class=\"inspector-command__message\" role=\"status\">Loading…</p>\n } @else if (\n !checkpointService.checkpoints().length && !checkpointQuery().trim()\n ) {\n <p class=\"inspector-command__message\" role=\"status\">\n No checkpoints yet\n </p>\n } @else if (\n !filteredCheckpoints().length && !filteredInspectorActions().length\n ) {\n <p class=\"inspector-command__message\" role=\"status\">No matches</p>\n } @else {\n @for (\n checkpoint of filteredCheckpoints();\n track checkpoint.id;\n let index = $index\n ) {\n <div\n class=\"inspector-command-row\"\n role=\"option\"\n [id]=\"'inspector-checkpoint-' + checkpoint.id\"\n [attr.data-command-index]=\"index\"\n [attr.aria-selected]=\"activeCommandIndex() === index\"\n [class.is-active]=\"activeCommandIndex() === index\"\n [class.is-busy]=\"\n checkpointService.busy() && activeCommandIndex() === index\n \"\n (mouseenter)=\"setActiveCheckpoint(index)\"\n (click)=\"\n deletingCheckpointId() === checkpoint.id ||\n editingCheckpointId() === checkpoint.id\n ? null\n : restoreCheckpoint(checkpoint)\n \"\n >\n @if (deletingCheckpointId() === checkpoint.id) {\n <span class=\"inspector-command-row__confirm\"\n >Delete “{{ checkpoint.name }}”?</span\n >\n <span class=\"inspector-command-row__confirm-actions\">\n <button\n type=\"button\"\n class=\"is-danger\"\n (click)=\"confirmDelete(checkpoint, $event)\"\n >\n Delete\n </button>\n <button type=\"button\" (click)=\"cancelDelete($event)\">\n Keep\n </button>\n </span>\n } @else if (editingCheckpointId() === checkpoint.id) {\n <input\n class=\"inspector-command-row__rename\"\n aria-label=\"Checkpoint name\"\n [value]=\"renameDraft()\"\n (input)=\"updateRenameDraft($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n <span class=\"inspector-command-row__content\">\n <span class=\"inspector-command-row__name\">\n @if (\n checkpointService.busy() &&\n activeCommandIndex() === index\n ) {\n Restoring…\n } @else {\n {{ checkpoint.name }}\n }\n </span>\n <span class=\"inspector-command-row__meta\">\n @if (shouldShowCheckpointRoute(checkpoint)) {\n <span class=\"inspector-command-row__route\">{{\n checkpoint.route\n }}</span>\n <span\n class=\"inspector-command-row__separator\"\n aria-hidden=\"true\"\n >·</span\n >\n }\n <span class=\"inspector-command-row__activity\">\n {{ checkpoint.lastUsedAt ? \"Used\" : \"Saved\" }}\n {{\n formatRelativeTime(checkpointActivityAt(checkpoint))\n }}\n </span>\n </span>\n </span>\n <span class=\"inspector-command-row__actions\">\n <button\n type=\"button\"\n (click)=\"beginRename(checkpoint, $event)\"\n [attr.aria-label]=\"'Rename ' + checkpoint.name\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"m11.8 1.8 2.4 2.4-8.3 8.3-3.1.7.7-3.1zm-8 10.4 1.5-.3-1.2-1.2z\"\n />\n </svg>\n </button>\n <button\n type=\"button\"\n (click)=\"beginDelete(checkpoint, $event)\"\n [attr.aria-label]=\"'Delete ' + checkpoint.name\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M5.5 2h5l.5 1H14v1.25H2V3h3zm-2 3.25h9L12 14H4z\"\n />\n </svg>\n </button>\n </span>\n }\n </div>\n }\n }\n </div>\n\n @if (filteredInspectorActions().length) {\n <footer\n id=\"inspector-command-actions\"\n class=\"inspector-command__actions\"\n role=\"listbox\"\n aria-label=\"Inspector actions\"\n aria-orientation=\"horizontal\"\n >\n @for (\n action of filteredInspectorActions();\n track action.id;\n let index = $index\n ) {\n <button\n type=\"button\"\n role=\"option\"\n class=\"inspector-command-action\"\n [id]=\"'inspector-action-' + action.id\"\n [attr.data-command-index]=\"filteredCheckpoints().length + index\"\n [attr.aria-label]=\"action.ariaLabel\"\n [attr.aria-selected]=\"\n activeCommandIndex() === filteredCheckpoints().length + index\n \"\n [attr.aria-disabled]=\"checkpointService.busy()\"\n [class.is-selected]=\"\n activeCommandIndex() === filteredCheckpoints().length + index\n \"\n [class.is-active]=\"\n (action.id === 'select' && toolMode() === 'select') ||\n (action.id === 'type' && showTypography()) ||\n (action.id === 'vertical' &&\n toolMode() === 'guides' &&\n guideOrientation() === 'vertical') ||\n (action.id === 'horizontal' &&\n toolMode() === 'guides' &&\n guideOrientation() === 'horizontal')\n \"\n [class.inspector-command-action--danger]=\"action.id === 'off'\"\n [disabled]=\"checkpointService.busy()\"\n (mouseenter)=\"setActiveInspectorAction(index)\"\n (click)=\"executeInspectorAction(action)\"\n >\n @switch (action.id) {\n @case (\"select\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2l8 8-3 .7L6.7 13 6 10 3 2z\" />\n </svg>\n }\n @case (\"type\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 4V2h10v2h-4v10H7V4z\" />\n </svg>\n }\n @case (\"save\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M2.5 2h9.6l1.4 1.4V14h-11zm2 1.5v3h6v-3zm.5 6V12h6V9.5z\"\n />\n </svg>\n }\n @case (\"vertical\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M7.25 2h1.5v12h-1.5z\" />\n </svg>\n }\n @case (\"horizontal\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M2 7.25h12v1.5H2z\" />\n </svg>\n }\n @case (\"off\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M7.25 1.5h1.5v6h-1.5zM4.1 3.35l.96 1.15A4.25 4.25 0 1 0 10.94 4.5l.96-1.15A5.75 5.75 0 1 1 4.1 3.35z\"\n />\n </svg>\n }\n }\n <span>{{ action.label }}</span>\n </button>\n }\n </footer>\n }\n </section>\n </dialog>\n }\n\n @if (checkpointToast(); as toast) {\n <p\n class=\"inspector-checkpoint-toast\"\n [class.inspector-checkpoint-toast--error]=\"checkpointToastIsError()\"\n [attr.role]=\"checkpointToastIsError() ? 'alert' : 'status'\"\n >\n {{ toast }}\n </p>\n }\n\n @if (enabled() && toolMode() === \"select\") {\n @if (hoverRect() && hoverHighlightEnabled) {\n <div\n class=\"inspector-box inspector-box--hover\"\n [style.left.px]=\"hoverRect()!.left\"\n [style.top.px]=\"hoverRect()!.top\"\n [style.width.px]=\"hoverRect()!.width\"\n [style.height.px]=\"hoverRect()!.height\"\n [style.--inspector-accent]=\"highlightColor\"\n ></div>\n }\n\n @if (selectedMeasurement(); as selected) {\n @if (selected.gap.active && selected.parentRect) {\n <div\n class=\"inspector-box inspector-box--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top\"\n [style.width.px]=\"selected.parentRect.width\"\n [style.height.px]=\"selected.parentRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top - 8\"\n >\n G {{ formatGap(selected) }}\n </div>\n }\n\n <div\n class=\"inspector-box inspector-box--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top\"\n [style.width.px]=\"selected.marginRect.width\"\n [style.height.px]=\"selected.marginRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top - 8\"\n >\n M {{ formatEdges(selected.margin) }}\n </div>\n\n <div\n class=\"inspector-box inspector-box--selected\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top\"\n [style.width.px]=\"selected.rect.width\"\n [style.height.px]=\"selected.rect.height\"\n [style.--inspector-accent]=\"highlightColor\"\n >\n <div class=\"inspector-label\">{{ selectedMetaLine() }}</div>\n </div>\n\n <div\n class=\"inspector-box inspector-box--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"selected.paddingRect.top\"\n [style.width.px]=\"selected.paddingRect.width\"\n [style.height.px]=\"selected.paddingRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"\n selected.paddingRect.top + selected.paddingRect.height + 8\n \"\n >\n P {{ formatEdges(selected.padding) }}\n </div>\n }\n }\n\n @if (enabled() && showTypography()) {\n @for (block of textBlocks(); track block.id) {\n <div\n class=\"inspector-text-chip\"\n [style.left.px]=\"block.rect.left\"\n [style.top.px]=\"block.rect.top - 8\"\n >\n <span\n class=\"inspector-text-chip__swatch\"\n [style.background]=\"block.styles.color\"\n ></span>\n <span>{{ block.styles.fontSize }}</span>\n <span>{{ block.styles.lineHeight }}</span>\n <span>{{ block.styles.color }}</span>\n </div>\n }\n }\n\n @if (enabled() && altPressed() && distanceOverlay(); as distance) {\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectA.left\"\n [style.top.px]=\"distance.rectA.top\"\n [style.width.px]=\"distance.rectA.width\"\n [style.height.px]=\"distance.rectA.height\"\n ></div>\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectB.left\"\n [style.top.px]=\"distance.rectB.top\"\n [style.width.px]=\"distance.rectB.width\"\n [style.height.px]=\"distance.rectB.height\"\n ></div>\n\n @for (\n connector of distance.connectors;\n track trackConnector($index, connector)\n ) {\n <div\n class=\"inspector-connector\"\n [class.inspector-connector--vertical]=\"connector.x1 === connector.x2\"\n [class.inspector-connector--horizontal]=\"connector.y1 === connector.y2\"\n [style.left.px]=\"Math.min(connector.x1, connector.x2)\"\n [style.top.px]=\"Math.min(connector.y1, connector.y2)\"\n [style.width.px]=\"Math.max(1, Math.abs(connector.x2 - connector.x1))\"\n [style.height.px]=\"Math.max(1, Math.abs(connector.y2 - connector.y1))\"\n ></div>\n }\n\n @if (distance.horizontal && distance.horizontal.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--horizontal\"\n [style.left.px]=\"\n Math.min(distance.horizontal.x1!, distance.horizontal.x2!)\n \"\n [style.top.px]=\"distance.horizontal.y!\"\n [style.width.px]=\"\n Math.abs(distance.horizontal.x2! - distance.horizontal.x1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag\"\n [style.left.px]=\"\n (distance.horizontal.x1! + distance.horizontal.x2!) / 2\n \"\n [style.top.px]=\"distance.horizontal.y! + 10\"\n >\n {{ formatValue(distance.horizontal.value) }}\n </div>\n }\n\n @if (distance.vertical && distance.vertical.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--vertical\"\n [style.left.px]=\"distance.vertical.x!\"\n [style.top.px]=\"Math.min(distance.vertical.y1!, distance.vertical.y2!)\"\n [style.height.px]=\"\n Math.abs(distance.vertical.y2! - distance.vertical.y1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag inspector-distance-tag--vertical\"\n [style.left.px]=\"distance.vertical.x! + 10\"\n [style.top.px]=\"(distance.vertical.y1! + distance.vertical.y2!) / 2\"\n >\n {{ formatValue(distance.vertical.value) }}\n </div>\n }\n }\n\n @if (enabled()) {\n @if (toolMode() === \"guides\") {\n @if (guidePreview(); as preview) {\n <div\n class=\"inspector-guide inspector-guide--preview\"\n [class.inspector-guide--vertical]=\"preview.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"\n preview.orientation === 'horizontal'\n \"\n [style.left.px]=\"\n preview.orientation === 'vertical' ? preview.position : null\n \"\n [style.top.px]=\"\n preview.orientation === 'horizontal' ? preview.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n >\n <span class=\"inspector-guide-line\"></span>\n </div>\n }\n }\n\n @for (guide of guides(); track guide.id) {\n <button\n type=\"button\"\n class=\"inspector-guide\"\n [class.inspector-guide--vertical]=\"guide.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"guide.orientation === 'horizontal'\"\n [class.inspector-guide--selected]=\"selectedGuideId() === guide.id\"\n [style.left.px]=\"\n guide.orientation === 'vertical' ? guide.position : null\n \"\n [style.top.px]=\"\n guide.orientation === 'horizontal' ? guide.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n [attr.aria-label]=\"\n (guide.orientation === 'vertical' ? 'Vertical' : 'Horizontal') +\n ' guide at ' +\n formatValue(guide.position) +\n ' pixels'\n \"\n (pointerdown)=\"startGuideDrag($event, guide)\"\n >\n <span class=\"inspector-guide-line\"></span>\n </button>\n }\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}