@tocdk-oss/ng-spotlight 0.0.0-stage → 21.0.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tocdk-oss-ng-spotlight.mjs","sources":["../../../projects/ng-spotlight/src/lib/url.ts","../../../projects/ng-spotlight/src/lib/recent.ts","../../../projects/ng-spotlight/src/lib/sources/static-source.ts","../../../projects/ng-spotlight/src/lib/sources/route-walk.ts","../../../projects/ng-spotlight/src/lib/sources/route-source.ts","../../../projects/ng-spotlight/src/lib/sources/route-audit.ts","../../../projects/ng-spotlight/src/lib/normalize.ts","../../../projects/ng-spotlight/src/lib/tokens.ts","../../../projects/ng-spotlight/src/lib/sources/http-source.ts","../../../projects/ng-spotlight/src/lib/rank.ts","../../../projects/ng-spotlight/src/lib/texts.ts","../../../projects/ng-spotlight/src/lib/engine.ts","../../../projects/ng-spotlight/src/lib/hotkeys.ts","../../../projects/ng-spotlight/src/lib/spotlight.service.ts","../../../projects/ng-spotlight/src/lib/provide-spotlight.ts","../../../projects/ng-spotlight/src/lib/renderer.ts","../../../projects/ng-spotlight/src/lib/parts/default-parts.ts","../../../projects/ng-spotlight/src/lib/hotkey-arbiter.ts","../../../projects/ng-spotlight/src/lib/parts/default-theme.ts","../../../projects/ng-spotlight/src/lib/templates.ts","../../../projects/ng-spotlight/src/lib/spotlight-host.ts","../../../projects/ng-spotlight/src/public-api.ts","../../../projects/ng-spotlight/src/tocdk-oss-ng-spotlight.ts"],"sourcesContent":["const ALLOWED_SCHEMES = new Set(['http', 'https', 'mailto', 'tel']);\n\n/**\n * true for http(s), mailto, tel and path-relative URLs (`/x`, `./x`, `x`, `?q`, `#h`).\n *\n * - Browsers drop ASCII tab/newline and leading control characters before reading the scheme\n * (\"java\\nscript:\" runs script), so those are removed before the check.\n * - Protocol-relative URLs (`//host`, and `\\\\host` or `/\\host`, since browsers read `\\` as `/`\n * in http(s) URLs) point at another site, so they do not count as relative.\n */\nexport function isSafeUrl(url: string): boolean {\n // What the browser parses: leading C0 controls and spaces stripped, tab/LF/CR removed anywhere.\n const parsed = url.replace(/^[\\u0000- \\u007f]+/, '').replace(/[\\t\\n\\r]/g, '');\n if (/^[/\\\\]{2}/.test(parsed)) return false;\n const compact = url.replace(/[\\u0000- \\u007f]/g, '');\n const match = /^([a-z][a-z0-9+.-]*):/i.exec(compact);\n return match === null || ALLOWED_SCHEMES.has(match[1].toLowerCase());\n}\n","import { isSafeUrl } from './url';\nimport type { SpotlightBadge, SpotlightItem, SpotlightRecentEntry, SpotlightRecentStorage, SpotlightStoredAction } from './types';\n\nconst BADGE_TONES = new Set(['info', 'success', 'warn', 'danger']);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null) return false;\n const proto: unknown = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/** JSON data that reads back exactly as written: no undefined, functions, NaN or class instances. */\nfunction isJsonData(value: unknown, depth = 0): boolean {\n if (depth > 8) return false;\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true;\n if (typeof value === 'number') return Number.isFinite(value);\n if (Array.isArray(value)) return value.every((v) => isJsonData(v, depth + 1));\n return isPlainObject(value) && Object.values(value).every((v) => isJsonData(v, depth + 1));\n}\n\n/**\n * Route segments that survive storage: strings, finite numbers and plain JSON objects (matrix\n * params such as `{ tab: 'orders' }`, or `{ outlets: … }`). The same rule decides what is saved\n * and what is loaded back, so a saved route is never dropped on reload.\n */\nfunction isRouteSegments(value: unknown): boolean {\n return (\n Array.isArray(value) &&\n value.every(\n (segment) =>\n typeof segment === 'string' ||\n (typeof segment === 'number' && Number.isFinite(segment)) ||\n (isPlainObject(segment) && isJsonData(segment)),\n )\n );\n}\n\nfunction isBadge(value: unknown): value is SpotlightBadge {\n if (!isRecord(value) || typeof value['label'] !== 'string') return false;\n const tone = value['tone'];\n return tone === undefined || (typeof tone === 'string' && BADGE_TONES.has(tone));\n}\n\n/** Exactly one of route/url, each valid: unsafe URLs are dropped rather than replayed. */\nfunction isStoredAction(value: unknown): value is SpotlightStoredAction {\n if (!isRecord(value)) return false;\n const hasRoute = 'route' in value;\n const hasUrl = 'url' in value;\n if (hasRoute === hasUrl) return false;\n if (hasRoute) return typeof value['route'] === 'string' || isRouteSegments(value['route']);\n return typeof value['url'] === 'string' && isSafeUrl(value['url']);\n}\n\nexport function isRecentEntry(value: unknown): value is SpotlightRecentEntry {\n if (!isRecord(value)) return false;\n if (\n typeof value['id'] !== 'string' ||\n typeof value['title'] !== 'string' ||\n typeof value['group'] !== 'string' ||\n typeof value['sourceId'] !== 'string'\n ) {\n return false;\n }\n if (value['subtitle'] !== undefined && typeof value['subtitle'] !== 'string') return false;\n if (value['icon'] !== undefined && typeof value['icon'] !== 'string') return false;\n if (value['badges'] !== undefined && !(Array.isArray(value['badges']) && value['badges'].every(isBadge))) return false;\n return value['action'] === undefined || isStoredAction(value['action']);\n}\n\n/**\n * Recent items in localStorage under `ng-spotlight:recent:<key>`. Every access is wrapped\n * in try/catch, so the palette still works when storage is blocked, full or corrupted.\n */\nexport function localStorageRecent(key: string): SpotlightRecentStorage {\n const storageKey = `ng-spotlight:recent:${key}`;\n return {\n load(): Promise<SpotlightRecentEntry[]> {\n try {\n const raw = globalThis.localStorage?.getItem(storageKey);\n if (!raw) return Promise.resolve([]);\n const parsed: unknown = JSON.parse(raw);\n return Promise.resolve(Array.isArray(parsed) ? (parsed as unknown[]).filter(isRecentEntry) : []);\n } catch {\n return Promise.resolve([]);\n }\n },\n save(items: SpotlightRecentEntry[]): Promise<void> {\n try {\n globalThis.localStorage?.setItem(storageKey, JSON.stringify(items));\n } catch {\n // Blocked or full storage: Recent simply isn't persisted.\n }\n return Promise.resolve();\n },\n };\n}\n\n/**\n * Keeps only the fields needed to re-render the item and re-run a route or url action. A route\n * array that would not survive JSON (a Date, a function, `undefined`, NaN, …) is stored by id\n * only, like a run() item, and resolved through its source on the next load.\n */\nexport function toRecentEntry(item: SpotlightItem, sourceId: string): SpotlightRecentEntry {\n const entry: SpotlightRecentEntry = { id: item.id, title: item.title, group: item.group, sourceId };\n if (item.subtitle !== undefined) entry.subtitle = item.subtitle;\n if (item.icon !== undefined) entry.icon = item.icon;\n if (item.badges !== undefined) entry.badges = item.badges;\n const action = item.action;\n if ('route' in action) {\n if (typeof action.route === 'string' || isRouteSegments(action.route)) entry.action = { route: action.route };\n }\n else if ('url' in action) entry.action = action.newTab ? { url: action.url, newTab: true } : { url: action.url };\n return entry;\n}\n\n/** A stored route/url entry as an item; null for run() entries (resolve those through the source). */\nexport function entryToItem(entry: SpotlightRecentEntry): SpotlightItem | null {\n if (entry.action === undefined) return null;\n const item: SpotlightItem = { id: entry.id, title: entry.title, group: entry.group, action: entry.action };\n if (entry.subtitle !== undefined) item.subtitle = entry.subtitle;\n if (entry.icon !== undefined) item.icon = entry.icon;\n if (entry.badges !== undefined) item.badges = entry.badges;\n return item;\n}\n\n/** Most recent first, unique per source + id, at most `max` entries. */\nexport function pushRecent(\n list: readonly SpotlightRecentEntry[],\n entry: SpotlightRecentEntry,\n max: number,\n): SpotlightRecentEntry[] {\n const rest = list.filter((e) => !(e.id === entry.id && e.sourceId === entry.sourceId));\n return [entry, ...rest].slice(0, Math.max(0, max));\n}\n","import type { SpotlightItem, SpotlightItemInput, SpotlightSource } from '../types';\n\nexport interface StaticSourceOptions {\n /** Default `static:<group>`. */\n id?: string;\n group: string;\n items: SpotlightItemInput[];\n prefix?: string;\n priority?: number;\n}\n\n/** Fixed commands. Results are local: the library ranks and filters them. */\nexport function staticSource(options: StaticSourceOptions): SpotlightSource {\n const seen = new Set<string>();\n const items: SpotlightItem[] = [];\n for (const input of options.items) {\n const item: SpotlightItem = { ...input, group: input.group ?? options.group };\n // Ids must be unique per group; a later duplicate is dropped (as normalizeResult does).\n const key = `${item.group}::${item.id}`;\n if (seen.has(key)) continue;\n seen.add(key);\n items.push(item);\n }\n return {\n id: options.id ?? `static:${options.group}`,\n group: options.group,\n prefix: options.prefix,\n priority: options.priority,\n local: true,\n search: () => items,\n };\n}\n","import type { Route, Routes } from '@angular/router';\n\n/** The shape of `route.data.spotlight` (or `false` to opt the route out). */\nexport interface SpotlightRouteData {\n label?: string;\n keywords?: string[];\n suggested?: boolean;\n /** Not used by the library; apps use it in their own nav-coverage tests. */\n hiddenFromNav?: boolean;\n}\n\nexport interface WalkedRoute {\n route: Route;\n url: string;\n label: string | null;\n keywords: string[];\n suggested: boolean;\n optedOut: boolean;\n /** This route or an ancestor has a `:param` segment. */\n hasParam: boolean;\n /** Renders a component and has no children of its own. */\n isPage: boolean;\n /**\n * Navigating to the URL lands on something: the route renders a component, or one of its\n * children matches the empty path (a page or a redirect). Unloaded lazy children count.\n */\n routable: boolean;\n}\n\n/** Angular keeps lazily loaded children here (internal API; pinned by route-source.spec.ts). */\ntype RouteWithLoadedChildren = Route & { _loadedRoutes?: Routes };\n\n/** Depth-first walk of a Router config. Skips redirects, `**` and custom matchers. */\nexport function walkRoutes(\n routes: Routes,\n includeLazy: boolean,\n parentSegments: readonly string[] = [],\n parentHasParam = false,\n): WalkedRoute[] {\n const out: WalkedRoute[] = [];\n for (const route of routes) {\n if (route.path === '**' || route.redirectTo !== undefined || route.matcher !== undefined) continue;\n const segments = [...parentSegments, ...(route.path ?? '').split('/').filter((s) => s !== '')];\n const hasParam = parentHasParam || segments.some((s) => s.startsWith(':'));\n const data: Record<string, unknown> = route.data ?? {};\n const spotlight = data['spotlight'];\n const routeData: SpotlightRouteData =\n typeof spotlight === 'object' && spotlight !== null ? spotlight : {};\n const breadcrumb = data['breadcrumb'];\n const rawLabel =\n typeof route.title === 'string'\n ? route.title\n : typeof routeData.label === 'string'\n ? routeData.label\n : typeof breadcrumb === 'string'\n ? breadcrumb\n : null;\n const children = route.children ?? (includeLazy ? (route as RouteWithLoadedChildren)._loadedRoutes : undefined);\n const rendersComponent = route.component !== undefined || route.loadComponent !== undefined;\n out.push({\n route,\n url: '/' + segments.join('/'),\n label: rawLabel !== null && rawLabel.trim() !== '' ? rawLabel : null,\n keywords: Array.isArray(routeData.keywords)\n ? routeData.keywords.filter((k): k is string => typeof k === 'string')\n : [],\n suggested: routeData.suggested === true,\n optedOut: spotlight === false,\n hasParam,\n isPage: rendersComponent && route.children === undefined && route.loadChildren === undefined,\n routable:\n rendersComponent ||\n (children ? children.some((child) => (child.path ?? '') === '') : route.loadChildren !== undefined),\n });\n if (children) out.push(...walkRoutes(children, includeLazy, segments, hasParam));\n }\n return out;\n}\n","import { Router, type Route } from '@angular/router';\nimport type { SpotlightItem, SpotlightSource } from '../types';\nimport { walkRoutes } from './route-walk';\n\nexport interface RouteSourceOptions {\n /** Default 'routes'. */\n id?: string;\n /** Default 'Pages'. */\n group?: string;\n prefix?: string;\n priority?: number;\n /** Return false to hide a route, e.g. to apply the app's role gates. */\n filter?: (route: Route, url: string) => boolean;\n}\n\n/**\n * Every labelled static route that is a page, including lazy children once loaded. A labelled\n * parent that renders nothing at its own URL (no component, no empty-path child) is skipped;\n * its labelled children still appear. A deeper route with the same URL (an empty-path child)\n * wins over its parent. Results are local.\n */\nexport function routeSource(options: RouteSourceOptions = {}): SpotlightSource {\n const group = options.group ?? 'Pages';\n return {\n id: options.id ?? 'routes',\n group,\n prefix: options.prefix,\n priority: options.priority,\n local: true,\n search: (_query, ctx) => {\n const router = ctx.injector.get(Router);\n const byUrl = new Map<string, SpotlightItem>();\n for (const entry of walkRoutes(router.config, true)) {\n if (entry.optedOut || entry.hasParam || entry.label === null || !entry.routable) continue;\n if (options.filter && !options.filter(entry.route, entry.url)) continue;\n byUrl.set(entry.url, {\n id: `route:${entry.url}`,\n title: entry.label,\n subtitle: entry.url,\n group,\n keywords: entry.keywords,\n suggested: entry.suggested,\n action: { route: entry.url },\n });\n }\n return [...byUrl.values()];\n },\n };\n}\n","import type { Route, Routes } from '@angular/router';\nimport { walkRoutes } from './route-walk';\n\nexport interface SpotlightRouteAuditEntry {\n path: string;\n reason: 'missing-label';\n}\n\nexport interface SpotlightRouteAuditOptions {\n /** Return true to skip a route. */\n ignore?: (route: Route, url: string) => boolean;\n}\n\n/**\n * Static pages that have no label (title, data.spotlight.label or data.breadcrumb) and are not\n * opted out with data.spotlight: false. Synchronous: `loadChildren` is not followed, so pass\n * lazy route arrays in directly. A page whose URL a labelled parent already covers passes.\n *\n * expect(spotlightRouteAudit(adminRoutes)).toEqual([]);\n */\nexport function spotlightRouteAudit(\n routes: Routes,\n options: SpotlightRouteAuditOptions = {},\n): SpotlightRouteAuditEntry[] {\n const walked = walkRoutes(routes, false);\n const labelledUrls = new Set(walked.filter((w) => w.label !== null).map((w) => w.url));\n return walked\n .filter((w) => w.isPage && !w.hasParam && !w.optedOut && w.label === null && !labelledUrls.has(w.url))\n .filter((w) => !(options.ignore?.(w.route, w.url) ?? false))\n .map((w) => ({ path: w.url, reason: 'missing-label' as const }));\n}\n","import type { SpotlightItem, SpotlightResponse } from './types';\n\n/** A group after validation. Every item's `group` equals the group id. */\nexport interface NormalizedGroup {\n id: string;\n label: string;\n total?: number;\n items: SpotlightItem[];\n}\n\nexport class SpotlightResultError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'SpotlightResultError';\n }\n}\n\nexport function isSpotlightResponse(value: unknown): value is SpotlightResponse {\n return typeof value === 'object' && value !== null && Array.isArray((value as { groups?: unknown }).groups);\n}\n\nfunction isValidAction(value: unknown): boolean {\n if (typeof value !== 'object' || value === null) return false;\n const action = value as Record<string, unknown>;\n return (\n typeof action['route'] === 'string' ||\n Array.isArray(action['route']) ||\n typeof action['url'] === 'string' ||\n typeof action['run'] === 'function'\n );\n}\n\nfunction isOptionalString(value: unknown): boolean {\n return value === undefined || typeof value === 'string';\n}\n\nfunction isValidBadge(value: unknown): boolean {\n if (typeof value !== 'object' || value === null) return false;\n const badge = value as Record<string, unknown>;\n if (typeof badge['label'] !== 'string') return false;\n const tone = badge['tone'];\n return tone === undefined || tone === 'info' || tone === 'success' || tone === 'warn' || tone === 'danger';\n}\n\n/**\n * id and title are non-empty strings, the action is usable, optional fields have the right\n * shape and the reserved `children` key is absent (even when its value is undefined).\n */\nexport function isValidItem(value: unknown): value is SpotlightItem {\n if (typeof value !== 'object' || value === null) return false;\n const item = value as Record<string, unknown>;\n if (\n typeof item['id'] !== 'string' ||\n item['id'] === '' ||\n typeof item['title'] !== 'string' ||\n !isValidAction(item['action']) ||\n 'children' in item\n ) {\n return false;\n }\n if (!isOptionalString(item['subtitle']) || !isOptionalString(item['icon'])) return false;\n const keywords = item['keywords'];\n if (keywords !== undefined && !(Array.isArray(keywords) && keywords.every((k) => typeof k === 'string'))) {\n return false;\n }\n const badges = item['badges'];\n if (badges !== undefined && !(Array.isArray(badges) && badges.every(isValidBadge))) return false;\n const suggested = item['suggested'];\n return suggested === undefined || typeof suggested === 'boolean';\n}\n\n/** Optional item fields that JSON backends commonly send as `null` to mean \"absent\". */\nconst NULLABLE_FIELDS = ['subtitle', 'icon', 'keywords', 'badges', 'suggested', 'data'] as const;\n\n/** Strips `null` optional fields, then validates. Returns null for an invalid item. */\nfunction toItem(value: unknown): SpotlightItem | null {\n if (typeof value !== 'object' || value === null) return null;\n let candidate = value as Record<string, unknown>;\n if (NULLABLE_FIELDS.some((key) => candidate[key] === null)) {\n candidate = { ...candidate };\n for (const key of NULLABLE_FIELDS) if (candidate[key] === null) delete candidate[key];\n }\n return isValidItem(candidate) ? candidate : null;\n}\n\n/**\n * Turns whatever a source returned into validated groups. Invalid items and groups are\n * dropped, `null` optional fields count as absent, and a later item whose `group::id` was\n * already seen is dropped (ids must be unique per group). Grouped responses that repeat a\n * group id merge into the first group with that id. A value that is not a result at all\n * throws SpotlightResultError, which the engine turns into an error row for that source only.\n */\nexport function normalizeResult(result: unknown, fallbackGroup: string): NormalizedGroup[] {\n const byGroup = new Map<string, NormalizedGroup>();\n const seen = new Set<string>();\n const add = (group: NormalizedGroup, raw: unknown): void => {\n const item = toItem(raw);\n if (item === null) return;\n const key = `${group.id}::${item.id}`;\n if (seen.has(key)) return;\n seen.add(key);\n group.items.push({ ...item, group: group.id });\n };\n if (Array.isArray(result)) {\n for (const raw of result as unknown[]) {\n const rawGroup = (raw as { group?: unknown } | null)?.group;\n const id = typeof rawGroup === 'string' && rawGroup !== '' ? rawGroup : fallbackGroup;\n let group = byGroup.get(id);\n if (!group) {\n group = { id, label: id, items: [] };\n byGroup.set(id, group);\n }\n add(group, raw);\n }\n return [...byGroup.values()].filter((g) => g.items.length > 0);\n }\n if (isSpotlightResponse(result)) {\n for (const rawGroup of result.groups as unknown[]) {\n if (typeof rawGroup !== 'object' || rawGroup === null) continue;\n const g = rawGroup as Record<string, unknown>;\n const id = g['id'];\n if (typeof id !== 'string' || id === '') continue;\n let group = byGroup.get(id);\n if (!group) {\n group = { id, label: typeof g['label'] === 'string' ? g['label'] : id, items: [] };\n const total = g['total'];\n if (typeof total === 'number' && Number.isInteger(total) && total >= 0) group.total = total;\n byGroup.set(id, group);\n }\n const rawItems: unknown[] = Array.isArray(g['items']) ? (g['items'] as unknown[]) : [];\n for (const raw of rawItems) add(group, raw);\n }\n return [...byGroup.values()];\n }\n throw new SpotlightResultError(\n '[ng-spotlight] a source returned something that is neither SpotlightItem[] nor { groups: SpotlightGroup[] }',\n );\n}\n","import { InjectionToken } from '@angular/core';\nimport type { SpotlightHttpOptions } from './types';\n\n/** Global request/map defaults for httpSource. Provided by provideSpotlight({ http }). */\nexport const SPOTLIGHT_HTTP_DEFAULTS = new InjectionToken<SpotlightHttpOptions>('SPOTLIGHT_HTTP_DEFAULTS');\n","import { HttpClient } from '@angular/common/http';\nimport { map as mapResponse } from 'rxjs';\nimport { isSpotlightResponse } from '../normalize';\nimport { SPOTLIGHT_HTTP_DEFAULTS } from '../tokens';\nimport type { SpotlightContext, SpotlightHttpOptions, SpotlightHttpRequest, SpotlightResult, SpotlightSource } from '../types';\n\nexport interface HttpSourceOptions extends Partial<Omit<SpotlightSource, 'search'>>, SpotlightHttpOptions {\n url: string;\n}\n\nfunction defaultRequest(query: string, ctx: SpotlightContext): SpotlightHttpRequest {\n return { method: 'GET', params: ctx.chip !== null ? { q: query, chip: ctx.chip } : { q: query } };\n}\n\n/**\n * Remote results in the server's order. Default request: GET {url}?q={query}[&chip={groupId}].\n * Default response: SpotlightResponse or SpotlightItem[]. Per-source request/map win over\n * provideSpotlight({ http }), which wins over the defaults.\n */\nexport function httpSource(options: HttpSourceOptions): SpotlightSource {\n const { url, request, map, ...given } = options;\n // An explicit `undefined` (e.g. `minLength: config.minLength`) must not override a default.\n const rest = Object.fromEntries(Object.entries(given).filter(([, value]) => value !== undefined)) as typeof given;\n const defaultMap = (response: unknown): SpotlightResult => {\n if (Array.isArray(response) || isSpotlightResponse(response)) return response as SpotlightResult;\n throw new Error(`[ng-spotlight] httpSource ${url}: response is neither SpotlightResponse nor SpotlightItem[]`);\n };\n return {\n minLength: 2,\n debounceMs: 150,\n local: false,\n ...rest,\n id: rest.id ?? `http:${url}`,\n search: (query, ctx) => {\n const globals = ctx.injector.get(SPOTLIGHT_HTTP_DEFAULTS, {});\n const req = (request ?? globals.request ?? defaultRequest)(query, ctx);\n const toResult = map ?? globals.map ?? defaultMap;\n return ctx.injector\n .get(HttpClient)\n .request(req.method ?? 'GET', url, {\n params: req.params,\n headers: req.headers,\n body: req.body,\n responseType: 'json',\n })\n .pipe(mapResponse((response: unknown) => toResult(response, query)));\n },\n };\n}\n","import type { SpotlightItem } from './types';\n\nconst WORD_BOUNDARY = /[\\s\\-_/.:,()[\\]]/;\n\n/** Score bonus for items that are in Recent. Smaller than the gap between match tiers. */\nexport const RECENT_BOOST = 50;\n\n/**\n * 1000 exact, 800 start of text, 600 start of a word, 200–300 subsequence (tighter is higher),\n * -1 no match, 0 for the empty query.\n */\nexport function scoreText(text: string, query: string): number {\n if (query === '') return 0;\n const t = text.toLowerCase();\n const q = query.toLowerCase();\n if (t === q) return 1000;\n if (t.startsWith(q)) return 800;\n for (let i = t.indexOf(q, 1); i > 0; i = t.indexOf(q, i + 1)) {\n if (WORD_BOUNDARY.test(t[i - 1])) return 600;\n }\n let pos = -1;\n let first = -1;\n for (const ch of q) {\n pos = t.indexOf(ch, pos + 1);\n if (pos === -1) return -1;\n if (first === -1) first = pos;\n }\n const gaps = pos - first + 1 - q.length;\n return 200 + Math.max(0, 100 - gaps);\n}\n\n/** Title score, or half the best keyword score, plus the Recent boost. null = no match. */\nexport function scoreItem(item: SpotlightItem, query: string, recentIds: ReadonlySet<string>): number | null {\n let best = scoreText(item.title, query);\n for (const keyword of item.keywords ?? []) {\n const score = scoreText(keyword, query);\n if (score >= 0) best = Math.max(best, score / 2);\n }\n if (best < 0) return null;\n return best + (recentIds.has(item.id) ? RECENT_BOOST : 0);\n}\n\n/** Filters and sorts local results. Stable: equal scores keep the source's order. */\nexport function rankItems(\n items: readonly SpotlightItem[],\n query: string,\n recentIds: ReadonlySet<string> = new Set(),\n): SpotlightItem[] {\n if (query === '') return [...items];\n return items\n .map((item, index) => ({ item, index, score: scoreItem(item, query, recentIds) }))\n .filter((entry): entry is { item: SpotlightItem; index: number; score: number } => entry.score !== null)\n .sort((a, b) => b.score - a.score || a.index - b.index)\n .map((entry) => entry.item);\n}\n","import { Injector, isSignal, signal, type Signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { catchError, isObservable, of } from 'rxjs';\nimport type { SpotlightTexts, SpotlightTextValue } from './types';\n\nexport type SpotlightTextKey = Exclude<keyof SpotlightTexts, 'resultsAnnouncement'>;\n\nexport const SPOTLIGHT_TEXT_KEYS: readonly SpotlightTextKey[] = [\n 'placeholder',\n 'all',\n 'recent',\n 'noResults',\n 'loading',\n 'error',\n 'retry',\n 'hintNavigate',\n 'hintOpen',\n 'hintClose',\n];\n\nexport const DEFAULT_SPOTLIGHT_TEXTS: { readonly [K in SpotlightTextKey]: string } & {\n readonly resultsAnnouncement: (count: number) => string;\n} = {\n placeholder: 'Search…',\n all: 'All',\n recent: 'Recent',\n noResults: 'No results',\n loading: 'Loading…',\n error: 'Something went wrong',\n retry: 'Retry',\n hintNavigate: 'to navigate',\n hintOpen: 'to open',\n hintClose: 'to close',\n resultsAnnouncement: (count) => (count === 0 ? 'No results' : count === 1 ? '1 result' : `${count} results`),\n};\n\nexport type ResolvedSpotlightTexts = { readonly [K in SpotlightTextKey]: Signal<string> } & {\n readonly resultsAnnouncement: (count: number) => string;\n};\n\nfunction toTextSignal(value: SpotlightTextValue | undefined, fallback: string, injector: Injector): Signal<string> {\n if (value === undefined) return signal(fallback).asReadonly();\n if (isSignal(value)) return value;\n // An erroring source keeps the fallback; without this, toSignal rethrows on every read.\n if (isObservable(value)) {\n return toSignal(value.pipe(catchError(() => of(fallback))), { initialValue: fallback, injector });\n }\n return signal(value).asReadonly();\n}\n\n/** Every text becomes a Signal<string>; Observables are subscribed for the injector's lifetime. */\nexport function resolveTexts(texts: Partial<SpotlightTexts> | undefined, injector: Injector): ResolvedSpotlightTexts {\n const resolved = {} as Record<SpotlightTextKey, Signal<string>>;\n for (const key of SPOTLIGHT_TEXT_KEYS) {\n resolved[key] = toTextSignal(texts?.[key], DEFAULT_SPOTLIGHT_TEXTS[key], injector);\n }\n return {\n ...resolved,\n resultsAnnouncement: texts?.resultsAnnouncement ?? DEFAULT_SPOTLIGHT_TEXTS.resultsAnnouncement,\n };\n}\n","import type { Injector } from '@angular/core';\nimport {\n catchError,\n combineLatest,\n filter,\n from,\n isObservable,\n map,\n merge,\n Observable,\n of,\n shareReplay,\n startWith,\n switchMap,\n timeout,\n timer,\n withLatestFrom,\n type Subscription,\n} from 'rxjs';\nimport { normalizeResult, type NormalizedGroup } from './normalize';\nimport { rankItems } from './rank';\nimport { DEFAULT_SPOTLIGHT_TEXTS } from './texts';\nimport type { SpotlightItem, SpotlightResult, SpotlightSource } from './types';\n\nexport const DEFAULT_TIMEOUT_MS = 5000;\n\nexport interface SpotlightRegisteredSource {\n source: SpotlightSource;\n injector: Injector;\n order: number;\n}\n\nexport interface SpotlightQueryState {\n query: string;\n chip: string | null;\n}\n\nexport interface SpotlightGroupState {\n /** `<sourceId>::<groupId>`: unique across sources. */\n key: string;\n id: string;\n label: string;\n total?: number;\n sourceId: string;\n items: SpotlightItem[];\n loading: boolean;\n /** null when the source answered; the error otherwise. */\n error: unknown;\n}\n\nexport interface SpotlightEngineOptions {\n sources: readonly SpotlightRegisteredSource[];\n input$: Observable<SpotlightQueryState>;\n retry$: Observable<string>;\n /** Ids of this source's items that are in Recent; the boost never crosses sources. */\n recentIds: (sourceId: string) => ReadonlySet<string>;\n onError: (error: unknown, source: SpotlightSource) => void;\n /**\n * Group labels learned from earlier answers. Pass the same map on every restart so a\n * group-less source keeps its header label across close/open.\n */\n learned?: SpotlightLearnedGroups;\n /**\n * Header label for a group-less source that has not answered yet: the `loading` text while\n * it loads, the `error` text when it failed. Defaults to the built-in English texts.\n */\n placeholderLabel?: (state: 'loading' | 'error') => string;\n}\n\nexport interface SpotlightQueryPlan {\n query: string;\n only: SpotlightSource | null;\n}\n\ninterface SourceState {\n groups: NormalizedGroup[];\n loading: boolean;\n error: unknown;\n}\n\nconst IDLE: SourceState = { groups: [], loading: false, error: null };\n\n/** sourceId → (groupId → label), learned from answers so chips can target multi-group sources. */\nexport type SpotlightLearnedGroups = Map<string, Map<string, string>>;\ntype LearnedGroups = SpotlightLearnedGroups;\n\nexport function planQuery(sources: readonly SpotlightRegisteredSource[], raw: string): SpotlightQueryPlan {\n const trimmed = raw.trim();\n const prefixed = sources\n .filter((reg) => typeof reg.source.prefix === 'string' && reg.source.prefix !== '')\n .sort((a, b) => (b.source.prefix as string).length - (a.source.prefix as string).length);\n for (const reg of prefixed) {\n const prefix = reg.source.prefix as string;\n if (trimmed.startsWith(prefix)) return { query: trimmed.slice(prefix.length).trim(), only: reg.source };\n }\n return { query: trimmed, only: null };\n}\n\nexport function sortSources(sources: readonly SpotlightRegisteredSource[]): SpotlightRegisteredSource[] {\n return [...sources].sort(\n (a, b) => (a.source.priority ?? a.order) - (b.source.priority ?? b.order) || a.order - b.order,\n );\n}\n\nexport function toObservableResult(result: ReturnType<SpotlightSource['search']>): Observable<SpotlightResult> {\n if (isObservable(result)) return result;\n if (typeof (result as { then?: unknown }).then === 'function') return from(result as PromiseLike<SpotlightResult>);\n return of(result as SpotlightResult);\n}\n\nfunction knownGroups(learned: LearnedGroups, source: SpotlightSource): Map<string, string> {\n let known = learned.get(source.id);\n if (!known) {\n known = new Map<string, string>(source.group ? [[source.group, source.group]] : []);\n learned.set(source.id, known);\n }\n return known;\n}\n\n/** Calls search() with a fresh AbortSignal that is aborted if the call is superseded. */\nfunction callSource(reg: SpotlightRegisteredSource, query: string, chip: string | null): Observable<SpotlightResult> {\n return new Observable<SpotlightResult>((subscriber) => {\n const controller = new AbortController();\n let finished = false;\n let inner: Subscription | undefined;\n try {\n inner = toObservableResult(reg.source.search(query, { signal: controller.signal, chip, injector: reg.injector })).subscribe({\n next: (value) => subscriber.next(value),\n error: (error: unknown) => {\n finished = true;\n subscriber.error(error);\n },\n complete: () => {\n finished = true;\n subscriber.complete();\n },\n });\n } catch (error) {\n finished = true;\n subscriber.error(error);\n }\n return () => {\n if (!finished) controller.abort();\n inner?.unsubscribe();\n };\n });\n}\n\nfunction runSource(\n reg: SpotlightRegisteredSource,\n all: readonly SpotlightRegisteredSource[],\n input$: Observable<SpotlightQueryState>,\n options: SpotlightEngineOptions,\n learned: LearnedGroups,\n): Observable<SourceState> {\n const source = reg.source;\n let last: NormalizedGroup[] = [];\n const retried$ = options.retry$.pipe(\n filter((id) => id === source.id),\n withLatestFrom(input$),\n map(([, state]) => state),\n );\n return merge(input$, retried$).pipe(\n switchMap((state): Observable<SourceState> => {\n const plan = planQuery(all, state.query);\n const known = knownGroups(learned, source);\n const eligible =\n (plan.only === null || plan.only === source) &&\n (state.chip === null || known.has(state.chip)) &&\n plan.query.length >= (source.minLength ?? 0);\n if (!eligible) {\n last = [];\n return of(IDLE);\n }\n const browseAll = plan.only !== null;\n const result$ = callSource(reg, plan.query, state.chip).pipe(\n timeout({ first: source.timeoutMs ?? DEFAULT_TIMEOUT_MS }),\n map((result): SourceState => {\n let groups = normalizeResult(result, source.group ?? source.id);\n for (const g of groups) known.set(g.id, g.label);\n if (state.chip !== null) groups = groups.filter((g) => g.id === state.chip);\n if (source.local === true && plan.query !== '') {\n const recent = options.recentIds(source.id);\n groups = groups.map((g) => ({ ...g, items: rankItems(g.items, plan.query, recent) }));\n }\n if (plan.query === '' && !browseAll) {\n groups = groups.map((g) => ({ ...g, items: g.items.filter((i) => i.suggested === true) }));\n }\n groups = groups.filter((g) => g.items.length > 0);\n last = groups;\n return { groups, loading: false, error: null };\n }),\n catchError((error: unknown) => {\n last = [];\n try {\n options.onError(error, source);\n } catch {\n // a throwing consumer callback must not take down other groups\n }\n return of<SourceState>({ groups: [], loading: false, error });\n }),\n );\n const debounceMs = source.debounceMs ?? 0;\n const delayed$ = debounceMs > 0 ? timer(debounceMs).pipe(switchMap(() => result$)) : result$;\n return delayed$.pipe(startWith<SourceState>({ groups: last, loading: true, error: null }));\n }),\n );\n}\n\nfunction toGroupStates(\n reg: SpotlightRegisteredSource,\n state: SourceState,\n learned: LearnedGroups,\n placeholderLabel: (state: 'loading' | 'error') => string,\n): SpotlightGroupState[] {\n const source = reg.source;\n if (state.groups.length > 0) {\n return state.groups.map((g) => ({\n key: `${source.id}::${g.id}`,\n id: g.id,\n label: g.label,\n ...(g.total !== undefined ? { total: g.total } : {}),\n sourceId: source.id,\n items: g.items,\n loading: state.loading,\n error: null,\n }));\n }\n if (!state.loading && state.error === null) return [];\n // Placeholder header (spinner or error row) in the source's usual group. A group-less\n // source that never answered gets a neutral label, never its internal id.\n const known = learned.get(source.id);\n const id = source.group ?? (known && known.size > 0 ? [...known.keys()][0] : source.id);\n return [\n {\n key: `${source.id}::${id}`,\n id,\n label: known?.get(id) ?? placeholderLabel(state.error === null ? 'loading' : 'error'),\n sourceId: source.id,\n items: [],\n loading: state.loading,\n error: state.error,\n },\n ];\n}\n\n/** Streams the grouped results for every query emitted on input$ (spec §5). */\nexport function createSearchEngine(options: SpotlightEngineOptions): Observable<SpotlightGroupState[]> {\n const sources = sortSources(options.sources);\n if (sources.length === 0) return of([]);\n const learned: LearnedGroups = options.learned ?? new Map<string, Map<string, string>>();\n const placeholderLabel =\n options.placeholderLabel ?? ((state: 'loading' | 'error'): string => DEFAULT_SPOTLIGHT_TEXTS[state]);\n const input$ = options.input$.pipe(shareReplay({ bufferSize: 1, refCount: true }));\n return combineLatest(\n sources.map((reg) =>\n runSource(reg, sources, input$, options, learned).pipe(map((state) => toGroupStates(reg, state, learned, placeholderLabel))),\n ),\n ).pipe(map((lists) => lists.flat()));\n}\n","export interface ParsedHotkey {\n ctrl: boolean;\n alt: boolean;\n shift: boolean;\n meta: boolean;\n /** Lower-case KeyboardEvent.key value (' ' for space). */\n key: string;\n}\n\nexport const DEFAULT_HOTKEYS: readonly string[] = ['ctrl.space', 'mod.k'];\n\nconst MODIFIERS = new Set(['ctrl', 'alt', 'shift', 'meta', 'mod']);\n\nconst KEY_ALIASES: Record<string, string> = {\n space: ' ',\n slash: '/',\n period: '.',\n comma: ',',\n dash: '-',\n esc: 'escape',\n escape: 'escape',\n enter: 'enter',\n};\n\n/** Parses 'ctrl.space', 'mod.k', 'alt.shift.slash', … 'mod' = Cmd on macOS, Ctrl elsewhere. */\nexport function parseHotkey(spec: string, isMac: boolean): ParsedHotkey {\n const parts = spec.toLowerCase().split('.').filter((p) => p !== '');\n const key = parts.pop();\n if (key === undefined) throw new Error(`[ng-spotlight] invalid hotkey \"${spec}\"`);\n for (const modifier of parts) {\n if (!MODIFIERS.has(modifier)) throw new Error(`[ng-spotlight] unknown modifier \"${modifier}\" in hotkey \"${spec}\"`);\n }\n const mods = new Set(parts);\n return {\n ctrl: mods.has('ctrl') || (mods.has('mod') && !isMac),\n alt: mods.has('alt'),\n shift: mods.has('shift'),\n meta: mods.has('meta') || (mods.has('mod') && isMac),\n key: KEY_ALIASES[key] ?? key,\n };\n}\n\nexport function matchesHotkey(event: KeyboardEvent, hotkey: ParsedHotkey): boolean {\n if (event.isComposing) return false;\n // Autofill and synthetic keydown events can arrive without a key string.\n if (typeof event.key !== 'string') return false;\n if (\n event.ctrlKey !== hotkey.ctrl ||\n event.altKey !== hotkey.alt ||\n event.shiftKey !== hotkey.shift ||\n event.metaKey !== hotkey.meta\n ) {\n return false;\n }\n const key = event.key.toLowerCase();\n if (hotkey.key === ' ') return key === ' ' || event.code === 'Space';\n if (key === hotkey.key) return true;\n // On macOS, Alt changes event.key (Alt+P gives 'π'); compare the physical key instead.\n if (/^[a-z]$/.test(hotkey.key)) return event.code === `Key${hotkey.key.toUpperCase()}`;\n if (/^[0-9]$/.test(hotkey.key)) return event.code === `Digit${hotkey.key}`;\n return false;\n}\n\nexport function detectMac(): boolean {\n return typeof navigator !== 'undefined' && /Mac|iPhone|iPad|iPod/.test(navigator.userAgent);\n}\n","import { DOCUMENT } from '@angular/common';\nimport { computed, DestroyRef, inject, Injectable, Injector, signal, type EnvironmentInjector } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { BehaviorSubject, firstValueFrom, Subject, timeout, type Observable, type Subscription } from 'rxjs';\nimport {\n createSearchEngine,\n DEFAULT_TIMEOUT_MS,\n toObservableResult,\n type SpotlightGroupState,\n type SpotlightLearnedGroups,\n type SpotlightQueryState,\n type SpotlightRegisteredSource,\n} from './engine';\nimport { DEFAULT_HOTKEYS, detectMac, parseHotkey, type ParsedHotkey } from './hotkeys';\nimport { normalizeResult } from './normalize';\nimport { entryToItem, isRecentEntry, localStorageRecent, pushRecent, toRecentEntry } from './recent';\nimport { resolveTexts, type ResolvedSpotlightTexts } from './texts';\nimport type {\n SpotlightAction,\n SpotlightConfig,\n SpotlightItem,\n SpotlightRecentEntry,\n SpotlightRecentStorage,\n SpotlightSource,\n} from './types';\nimport { isSafeUrl } from './url';\n\nexport const RECENT_GROUP_ID = '__recent';\n\n/**\n * How long select() waits for a run() action before it closes the palette anyway (spec §5.9:\n * run() is awaited, then the palette closes). A run() that settles later still records Recent and\n * emits `selected` (or reports its error); it never locks the palette.\n */\nexport const RUN_WAIT_MS = 5000;\n\nexport interface SpotlightOption {\n /** `<groupKey>::<itemId>`, or `retry::<sourceId>` for an error row. */\n key: string;\n /** DOM id of the role=\"option\" element (target of aria-activedescendant). */\n domId: string;\n kind: 'item' | 'retry';\n item: SpotlightItem | null;\n sourceId: string;\n groupKey: string;\n}\n\nexport interface SpotlightChip {\n /** Group id, or null for \"All\". */\n id: string | null;\n label: string;\n}\n\nexport interface SpotlightSettings {\n hotkeys: readonly ParsedHotkey[];\n theme: 'default' | 'none';\n recentMax: number;\n storage: SpotlightRecentStorage;\n onError: (error: unknown, source: SpotlightSource) => void;\n}\n\nlet nextInstanceId = 0;\n\n/** Settings only the first (root or isolated) provideSpotlight() call may set. */\nconst IGNORED_IN_CHILD = ['hotkeys', 'texts', 'recent', 'theme', 'onError'] as const;\n\nconst defaultOnError = (error: unknown, source: SpotlightSource): void => {\n console.error(`[ng-spotlight] source \"${source.id}\" failed`, error);\n};\n\nfunction parseHotkeys(specs: readonly string[]): ParsedHotkey[] {\n const isMac = detectMac();\n return specs.map((spec) => parseHotkey(spec, isMac));\n}\n\nfunction chipsFrom(groups: readonly SpotlightGroupState[]): SpotlightChip[] {\n const seen = new Map<string, string>();\n for (const group of groups) {\n if (group.items.length > 0 && !seen.has(group.id)) seen.set(group.id, group.label);\n }\n return [...seen].map(([id, label]) => ({ id, label }));\n}\n\n/**\n * State and behaviour of one palette. Provided by provideSpotlight(); never providedIn root.\n * Deliberately has no ngOnDestroy: a child injector re-provides the parent's instance and\n * must not destroy it. Cleanup runs through the creating injector's DestroyRef.\n */\n@Injectable()\nexport class SpotlightService {\n private readonly document = inject(DOCUMENT);\n private readonly router = inject(Router, { optional: true });\n private readonly regs = signal<readonly SpotlightRegisteredSource[]>([]);\n private registrationOrder = 0;\n private configured = false;\n /** Token of the select() whose action is still running; null when none is. */\n private selecting: object | null = null;\n /** Incremented on every open(), so a late action never closes a palette opened after it. */\n private session = 0;\n\n /** @internal Prefix for this instance's DOM ids. */\n readonly idPrefix = `sp-${nextInstanceId++}`;\n\n private _settings: SpotlightSettings = {\n hotkeys: parseHotkeys(DEFAULT_HOTKEYS),\n theme: 'default',\n recentMax: 8,\n storage: localStorageRecent('default'),\n onError: defaultOnError,\n };\n private readonly _texts = signal<ResolvedSpotlightTexts>(resolveTexts(undefined, inject(Injector)));\n\n private readonly _isOpen = signal(false);\n readonly isOpen = this._isOpen.asReadonly();\n private readonly _query = signal('');\n /** @internal */\n readonly query = this._query.asReadonly();\n private readonly _chip = signal<string | null>(null);\n /** @internal */\n readonly chip = this._chip.asReadonly();\n private readonly _results = signal<readonly SpotlightGroupState[]>([]);\n private readonly _recent = signal<readonly SpotlightRecentEntry[]>([]);\n private readonly _resolvedRuns = signal<ReadonlyMap<string, SpotlightItem>>(new Map());\n private readonly _activeKey = signal<string | null>(null);\n private readonly _chipGroups = signal<readonly SpotlightChip[]>([]);\n private readonly selectedSubject = new Subject<SpotlightItem>();\n readonly selected: Observable<SpotlightItem> = this.selectedSubject.asObservable();\n\n private input$ = new BehaviorSubject<SpotlightQueryState>({ query: '', chip: null });\n private readonly retry$ = new Subject<string>();\n private engine: Subscription | null = null;\n /** Group labels learned from answers; outlives the engine, which restarts on every open(). */\n private readonly learnedGroups: SpotlightLearnedGroups = new Map();\n\n private readonly recentItems = computed(() => {\n const runs = this._resolvedRuns();\n const out: Array<{ item: SpotlightItem; sourceId: string }> = [];\n for (const entry of this._recent()) {\n const item = entryToItem(entry) ?? runs.get(`${entry.sourceId}::${entry.id}`) ?? null;\n if (item) out.push({ item, sourceId: entry.sourceId });\n }\n return out;\n });\n\n /** @internal Visible groups: Recent first on the empty query, then the sources' groups. */\n readonly groups = computed<readonly SpotlightGroupState[]>(() => {\n const results = this._results();\n if (this._query().trim() !== '' || this._chip() !== null) return results;\n const recent = this.recentItems();\n if (recent.length === 0) return results;\n const recentKeys = new Set(recent.map((r) => `${r.sourceId}::${r.item.id}`));\n const rest = results\n .map((g) => ({ ...g, items: g.items.filter((i) => !recentKeys.has(`${g.sourceId}::${i.id}`)) }))\n .filter((g) => g.items.length > 0 || g.loading || g.error !== null);\n const recentGroup: SpotlightGroupState = {\n key: RECENT_GROUP_ID,\n id: RECENT_GROUP_ID,\n label: this.texts.recent(),\n sourceId: RECENT_GROUP_ID,\n items: recent.map((r) => r.item),\n loading: false,\n error: null,\n };\n return [recentGroup, ...rest];\n });\n\n /** @internal Every selectable row in display order, including one retry row per failed source. */\n readonly options = computed<readonly SpotlightOption[]>(() => {\n const out: SpotlightOption[] = [];\n const recent = this.recentItems();\n for (const group of this.groups()) {\n if (group.error !== null) {\n out.push({\n key: `retry::${group.sourceId}`,\n domId: `${this.idPrefix}-o${out.length}`,\n kind: 'retry',\n item: null,\n sourceId: group.sourceId,\n groupKey: group.key,\n });\n continue;\n }\n // A loading group still shows the previous query's rows; they must not be selectable.\n if (group.loading) continue;\n group.items.forEach((item, index) => {\n const sourceId = group.key === RECENT_GROUP_ID ? recent[index].sourceId : group.sourceId;\n out.push({\n key: group.key === RECENT_GROUP_ID ? `${RECENT_GROUP_ID}::${sourceId}::${item.id}` : `${group.key}::${item.id}`,\n domId: `${this.idPrefix}-o${out.length}`,\n kind: 'item',\n item,\n sourceId,\n groupKey: group.key,\n });\n });\n }\n return out;\n });\n\n /** @internal */\n readonly activeIndex = computed(() => {\n const options = this.options();\n if (options.length === 0) return -1;\n const key = this._activeKey();\n if (key === null) return 0;\n const index = options.findIndex((o) => o.key === key);\n return index === -1 ? 0 : index;\n });\n\n /** @internal */\n readonly activeOption = computed<SpotlightOption | null>(() => {\n const index = this.activeIndex();\n return index === -1 ? null : this.options()[index];\n });\n\n /** @internal */\n readonly chips = computed<readonly SpotlightChip[]>(() => [{ id: null, label: this.texts.all() }, ...this._chipGroups()]);\n\n /** @internal */\n readonly loading = computed(() => this._results().some((g) => g.loading));\n\n /** @internal */\n readonly announcement = computed(() => {\n const count = this.options().filter((o) => o.kind === 'item').length;\n // Announce \"Loading…\" rather than \"No results\" while sources are still answering.\n if (count === 0 && this.loading()) return this.texts.loading();\n return this.texts.resultsAnnouncement(count);\n });\n\n constructor() {\n inject(DestroyRef).onDestroy(() => {\n this.close();\n this.selectedSubject.complete();\n });\n }\n\n /** @internal */\n get texts(): ResolvedSpotlightTexts {\n return this._texts();\n }\n\n /** @internal */\n get settings(): Readonly<SpotlightSettings> {\n return this._settings;\n }\n\n /** @internal Called by provideSpotlight(). The first call owns the settings; every call adds its sources. */\n configure(config: SpotlightConfig, injector: EnvironmentInjector): void {\n if (!this.configured) {\n this.configured = true;\n this._settings = {\n hotkeys: parseHotkeys(config.hotkeys ?? DEFAULT_HOTKEYS),\n theme: config.theme ?? 'default',\n recentMax: config.recent?.max ?? 8,\n storage: config.recent?.storage ?? localStorageRecent('default'),\n onError: config.onError ?? defaultOnError,\n };\n this._texts.set(resolveTexts(config.texts, injector));\n } else if (typeof ngDevMode === 'undefined' || ngDevMode) {\n const ignored = IGNORED_IN_CHILD.filter((key) => config[key] !== undefined);\n if (ignored.length > 0) {\n console.warn(\n `[ng-spotlight] a child provideSpotlight() only adds sources and http defaults; ${ignored.join(', ')} ` +\n 'ignored. Set them in the first provideSpotlight() call, or pass isolated: true for a separate palette.',\n );\n }\n }\n const added: SpotlightRegisteredSource[] = (config.sources ?? []).map((source) => ({\n source,\n injector,\n order: this.registrationOrder++,\n }));\n if (added.length === 0) return;\n this.regs.update((regs) => [...regs, ...added]);\n injector.get(DestroyRef).onDestroy(() => {\n this.regs.update((regs) => regs.filter((reg) => !added.includes(reg)));\n const removed = new Set(added.map((reg) => reg.source.id));\n const stillRegistered = new Set(this.regs().map((reg) => reg.source.id));\n this._resolvedRuns.update((runs) => {\n const next = new Map(runs);\n for (const key of runs.keys()) {\n const sourceId = key.slice(0, key.indexOf('::'));\n if (removed.has(sourceId) && !stillRegistered.has(sourceId)) next.delete(key);\n }\n return next;\n });\n this.restartEngine();\n });\n this.restartEngine();\n }\n\n open(query?: string): void {\n if (this._isOpen()) {\n if (query !== undefined) this.setQuery(query);\n return;\n }\n this._query.set(query ?? '');\n this._chip.set(null);\n this._activeKey.set(null);\n this._chipGroups.set([]);\n this.session++;\n this._isOpen.set(true);\n void this.loadRecent();\n this.restartEngine();\n }\n\n close(): void {\n if (!this._isOpen()) return;\n this.selecting = null;\n this._isOpen.set(false);\n this.engine?.unsubscribe();\n this.engine = null;\n this._results.set([]);\n this._query.set('');\n this._chip.set(null);\n this._activeKey.set(null);\n }\n\n /** @internal */\n toggle(): void {\n if (this._isOpen()) this.close();\n else this.open();\n }\n\n /** @internal */\n setQuery(query: string): void {\n this._query.set(query);\n this._activeKey.set(null);\n this.input$.next({ query, chip: this._chip() });\n }\n\n /** @internal */\n setChip(chip: string | null): void {\n this._chip.set(chip);\n this._activeKey.set(null);\n this.input$.next({ query: this._query(), chip });\n }\n\n /** @internal */\n cycleChip(direction: 1 | -1): void {\n const chips = this.chips();\n if (chips.length < 2) return;\n const index = chips.findIndex((c) => c.id === this._chip());\n this.setChip(chips[(index + direction + chips.length) % chips.length].id);\n }\n\n /** @internal */\n moveActive(delta: number): void {\n const options = this.options();\n if (options.length === 0) return;\n const n = options.length;\n const next = (((this.activeIndex() + delta) % n) + n) % n;\n this._activeKey.set(options[next].key);\n }\n\n /** @internal */\n setActive(key: string): void {\n this._activeKey.set(key);\n }\n\n /** @internal */\n retry(sourceId: string): void {\n this.retry$.next(sourceId);\n }\n\n /** @internal Runs the action, records Recent, closes and emits `selected` (spec §5.9). */\n async select(option: SpotlightOption, modifiers: { newTab?: boolean } = {}): Promise<void> {\n if (option.kind === 'retry' || option.item === null) {\n this.retry(option.sourceId);\n return;\n }\n if (this.selecting !== null) return;\n const token = {};\n this.selecting = token;\n const session = this.session;\n const item = option.item;\n const source: SpotlightSource = this.regs().find((reg) => reg.source.id === option.sourceId)?.source ?? {\n id: option.sourceId,\n search: () => [],\n };\n const done = this.runAction(item.action, modifiers.newTab === true, source).then(\n () => null,\n (error: unknown) => ({ error }),\n );\n let timer: ReturnType<typeof setTimeout> | undefined;\n const waited = new Promise<'waiting'>((resolve) => (timer = setTimeout(() => resolve('waiting'), RUN_WAIT_MS)));\n const first = await Promise.race([done, waited]);\n clearTimeout(timer);\n if (this.selecting === token) this.selecting = null;\n\n const finish = (outcome: { error: unknown } | null): void => {\n if (outcome === null) this.remember(item, option.sourceId);\n else this.report(outcome.error, source);\n // Don't close a palette the user opened again after this select().\n if (this.session === session) this.close();\n if (outcome === null) this.selectedSubject.next(item);\n };\n if (first !== 'waiting') {\n finish(first);\n return;\n }\n if (this.session === session) this.close();\n void done.then(finish);\n }\n\n private async runAction(action: SpotlightAction, newTab: boolean, source: SpotlightSource): Promise<void> {\n if ('run' in action) {\n await action.run();\n return;\n }\n if ('route' in action) {\n const router = this.router;\n if (!router) throw new Error('[ng-spotlight] a route action needs provideRouter()');\n const navigation =\n typeof action.route === 'string' ? router.navigateByUrl(action.route) : router.navigate(action.route);\n void navigation.catch((error: unknown) => this.report(error, source));\n return;\n }\n if (!isSafeUrl(action.url)) {\n throw new Error(`[ng-spotlight] blocked a url with an unsafe scheme: ${JSON.stringify(action.url)}`);\n }\n const view = this.document.defaultView;\n if (!view) return;\n if (action.newTab === true || newTab) view.open(action.url, '_blank', 'noopener');\n else view.location.assign(action.url);\n }\n\n private remember(item: SpotlightItem, sourceId: string): void {\n if ('run' in item.action) {\n const key = `${sourceId}::${item.id}`;\n this._resolvedRuns.update((runs) => new Map(runs).set(key, item));\n }\n const next = pushRecent(this._recent(), toRecentEntry(item, sourceId), this._settings.recentMax);\n this._recent.set(next);\n const storage = this._settings.storage;\n void Promise.resolve()\n .then(() => storage.save(next))\n .catch((error: unknown) => console.warn('[ng-spotlight] could not save recent items', error));\n }\n\n private async loadRecent(): Promise<void> {\n let loaded: unknown;\n try {\n loaded = await this._settings.storage.load();\n } catch (error) {\n console.warn('[ng-spotlight] could not load recent items', error);\n loaded = [];\n }\n const entries = Array.isArray(loaded)\n ? (loaded as unknown[]).filter(isRecentEntry).slice(0, this._settings.recentMax)\n : [];\n this._recent.set(entries);\n await this.resolveRunEntries(entries);\n }\n\n /** run() entries are stored without an action; look them up in their source by id. */\n private async resolveRunEntries(entries: readonly SpotlightRecentEntry[]): Promise<void> {\n const pending = entries.filter((e) => e.action === undefined && !this._resolvedRuns().has(`${e.sourceId}::${e.id}`));\n for (const sourceId of new Set(pending.map((e) => e.sourceId))) {\n const reg = this.regs().find((r) => r.source.id === sourceId);\n // Sources that need a query would be hit with an empty one just to open the palette.\n if (!reg || (reg.source.minLength ?? 0) > 0) continue;\n try {\n const result = await firstValueFrom(\n toObservableResult(\n reg.source.search('', { signal: new AbortController().signal, chip: null, injector: reg.injector }),\n ).pipe(timeout(reg.source.timeoutMs ?? DEFAULT_TIMEOUT_MS)),\n );\n const items = normalizeResult(result, reg.source.group ?? reg.source.id).flatMap((g) => g.items);\n this._resolvedRuns.update((runs) => {\n const next = new Map(runs);\n for (const item of items) next.set(`${sourceId}::${item.id}`, item);\n return next;\n });\n } catch {\n // An unresolvable run() entry stays hidden.\n }\n }\n }\n\n private restartEngine(): void {\n if (!this._isOpen()) return;\n this.engine?.unsubscribe();\n this.input$ = new BehaviorSubject<SpotlightQueryState>({ query: this._query(), chip: this._chip() });\n this.engine = createSearchEngine({\n sources: this.regs(),\n input$: this.input$,\n retry$: this.retry$,\n recentIds: (sourceId) =>\n new Set(this._recent().flatMap((entry) => (entry.sourceId === sourceId ? [entry.id] : []))),\n onError: (error, source) => this.report(error, source),\n learned: this.learnedGroups,\n placeholderLabel: (state) => (state === 'loading' ? this.texts.loading() : this.texts.error()),\n }).subscribe((groups) => {\n this._results.set(groups);\n if (this._chip() === null) this._chipGroups.set(chipsFrom(groups));\n });\n }\n\n private report(error: unknown, source: SpotlightSource): void {\n try {\n this._settings.onError(error, source);\n } catch (handlerError) {\n console.error('[ng-spotlight] onError threw', handlerError);\n }\n }\n}\n","import {\n EnvironmentInjector,\n inject,\n InjectionToken,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n type EnvironmentProviders,\n} from '@angular/core';\nimport { SpotlightService } from './spotlight.service';\nimport { SPOTLIGHT_HTTP_DEFAULTS } from './tokens';\nimport type { SpotlightConfig } from './types';\n\nconst SPOTLIGHT_LOCAL_CONFIG = new InjectionToken<SpotlightConfig>('SPOTLIGHT_LOCAL_CONFIG');\n\n/**\n * Sets up a palette. Call it once in the app config; call it again in a child injector (for\n * example a lazy route's `providers`) to add sources there. A child call only contributes\n * `sources` and `http` defaults: its `texts`, `hotkeys`, `recent`, `theme` and `onError` are\n * ignored (dev mode warns), since the first call owns the palette. Pass `isolated: true` for a\n * separate palette with its own settings. Pass a factory to build the config in an injection\n * context, e.g. `provideSpotlight(() => ({ texts: { placeholder: inject(I18n).t$('Search…') } }))`.\n */\nexport function provideSpotlight(config: SpotlightConfig | (() => SpotlightConfig) = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: SPOTLIGHT_LOCAL_CONFIG, useFactory: typeof config === 'function' ? config : () => config },\n {\n provide: SpotlightService,\n useFactory: (): SpotlightService => {\n const local = inject(SPOTLIGHT_LOCAL_CONFIG);\n const parent = local.isolated === true ? null : inject(SpotlightService, { skipSelf: true, optional: true });\n return parent ?? new SpotlightService();\n },\n },\n {\n provide: SPOTLIGHT_HTTP_DEFAULTS,\n useFactory: () =>\n inject(SPOTLIGHT_LOCAL_CONFIG).http ?? inject(SPOTLIGHT_HTTP_DEFAULTS, { skipSelf: true, optional: true }) ?? {},\n },\n provideEnvironmentInitializer(() => {\n inject(SpotlightService).configure(inject(SPOTLIGHT_LOCAL_CONFIG), inject(EnvironmentInjector));\n }),\n ]);\n}\n","import { InjectionToken, type Type } from '@angular/core';\nimport type { SpotlightBadge, SpotlightItem } from './types';\n\n/** Context of the `input` part. The part must copy every ARIA field onto its <input>. */\nexport interface SpotlightInputContext {\n id: string;\n value: string;\n placeholder: string;\n label: string;\n expanded: boolean;\n controls: string;\n activeDescendant: string | null;\n onInput: (value: string) => void;\n onKeydown: (event: KeyboardEvent) => void;\n}\n\n/** Context of the `chips` part (rendered once per chip, inside a host-owned <button>). */\nexport interface SpotlightChipContext {\n label: string;\n active: boolean;\n}\n\nexport interface SpotlightGroupHeaderContext {\n label: string;\n total: number | undefined;\n loading: boolean;\n /** Visually hidden text read after the label while loading; empty when the label already says it. */\n loadingText: string;\n}\n\n/** Context of the `row` part (rendered inside a host-owned role=\"option\" element). */\nexport interface SpotlightRowContext {\n item: SpotlightItem;\n active: boolean;\n query: string;\n /** The badge part to render badges with (NgComponentOutlet, input `ctx: SpotlightBadgeContext`). */\n badge: Type<unknown>;\n}\n\nexport interface SpotlightBadgeContext {\n badge: SpotlightBadge;\n}\n\n/**\n * Markup for each part of the palette. Every component takes one `ctx` input with the\n * part's context. Parts left out fall back to the core parts. `dialog` adds classes to the\n * overlay pane and backdrop (the core always owns the CDK overlay itself).\n */\nexport interface SpotlightRenderer {\n dialog?: { panelClass: string; backdropClass?: string };\n input?: Type<unknown>;\n chips?: Type<unknown>;\n groupHeader?: Type<unknown>;\n row?: Type<unknown>;\n badge?: Type<unknown>;\n}\n\nexport const SPOTLIGHT_RENDERER = new InjectionToken<SpotlightRenderer>('SPOTLIGHT_RENDERER');\n","import { NgComponentOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, type Type } from '@angular/core';\nimport type {\n SpotlightBadgeContext,\n SpotlightChipContext,\n SpotlightGroupHeaderContext,\n SpotlightInputContext,\n SpotlightRenderer,\n SpotlightRowContext,\n} from '../renderer';\n\n@Component({\n selector: 'spotlight-default-input',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <input\n class=\"sp-input-el\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-autocomplete=\"list\"\n [id]=\"ctx().id\"\n [value]=\"ctx().value\"\n [attr.placeholder]=\"ctx().placeholder\"\n [attr.aria-label]=\"ctx().label\"\n [attr.aria-expanded]=\"ctx().expanded\"\n [attr.aria-controls]=\"ctx().controls\"\n [attr.aria-activedescendant]=\"ctx().activeDescendant\"\n (input)=\"onInput($event)\"\n (keydown)=\"ctx().onKeydown($event)\"\n />\n `,\n})\nexport class SpotlightDefaultInput {\n readonly ctx = input.required<SpotlightInputContext>();\n\n /** @internal */\n protected onInput(event: Event): void {\n this.ctx().onInput((event.target as HTMLInputElement).value);\n }\n}\n\n@Component({\n selector: 'spotlight-default-chip',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<span class=\"sp-chip\" [class.sp-chip-active]=\"ctx().active\">{{ ctx().label }}</span>`,\n})\nexport class SpotlightDefaultChip {\n readonly ctx = input.required<SpotlightChipContext>();\n}\n\n@Component({\n selector: 'spotlight-default-group-header',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <span class=\"sp-group-label\">{{ ctx().label }}</span>\n @if (ctx().total !== undefined) {\n <!-- The separator keeps the group's accessible name readable: \"Customers, 2\". -->\n <span style=\"position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0\">, </span>\n <span class=\"sp-group-total\">{{ ctx().total }}</span>\n }\n @if (ctx().loading) {\n <span class=\"sp-spinner\" aria-hidden=\"true\"></span>\n @if (ctx().loadingText) {\n <span\n style=\"position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0\"\n >, {{ ctx().loadingText }}</span\n >\n }\n }\n `,\n})\nexport class SpotlightDefaultGroupHeader {\n readonly ctx = input.required<SpotlightGroupHeaderContext>();\n}\n\n@Component({\n selector: 'spotlight-default-badge',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<span class=\"sp-badge\" [attr.data-tone]=\"ctx().badge.tone ?? 'info'\">{{ ctx().badge.label }}</span>`,\n})\nexport class SpotlightDefaultBadge {\n readonly ctx = input.required<SpotlightBadgeContext>();\n}\n\n@Component({\n selector: 'spotlight-default-row',\n imports: [NgComponentOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @let item = ctx().item;\n @if (item.icon) {\n <span class=\"sp-icon\" aria-hidden=\"true\">\n @if (isImage(item.icon)) {\n <img [src]=\"item.icon\" alt=\"\" />\n } @else {\n <i [class]=\"item.icon\"></i>\n }\n </span>\n }\n <span class=\"sp-text\">\n <span class=\"sp-title\">{{ item.title }}</span>\n @if (item.subtitle) {\n <span class=\"sp-subtitle\">{{ item.subtitle }}</span>\n }\n </span>\n @if (item.badges?.length) {\n <span class=\"sp-badges\">\n @for (badge of item.badges ?? []; track $index) {\n <ng-container *ngComponentOutlet=\"ctx().badge; inputs: { ctx: { badge: badge } }\" />\n }\n </span>\n }\n `,\n})\nexport class SpotlightDefaultRow {\n readonly ctx = input.required<SpotlightRowContext>();\n\n /** @internal */\n protected isImage(icon: string): boolean {\n return /^(https?:|data:image\\/|\\/|\\.)/.test(icon);\n }\n}\n\nexport interface SpotlightResolvedParts {\n panelClass: string | null;\n backdropClass: string | null;\n input: Type<unknown>;\n chips: Type<unknown>;\n groupHeader: Type<unknown>;\n row: Type<unknown>;\n badge: Type<unknown>;\n}\n\nexport function resolveParts(renderer: SpotlightRenderer | null): SpotlightResolvedParts {\n return {\n panelClass: renderer?.dialog?.panelClass ?? null,\n backdropClass: renderer?.dialog?.backdropClass ?? null,\n input: renderer?.input ?? SpotlightDefaultInput,\n chips: renderer?.chips ?? SpotlightDefaultChip,\n groupHeader: renderer?.groupHeader ?? SpotlightDefaultGroupHeader,\n row: renderer?.row ?? SpotlightDefaultRow,\n badge: renderer?.badge ?? SpotlightDefaultBadge,\n };\n}\n","import { Injectable } from '@angular/core';\nimport { matchesHotkey, type ParsedHotkey } from './hotkeys';\n\n/** One <spotlight-host> as the arbiter sees it. */\nexport interface SpotlightHotkeyClient {\n hotkeys: () => readonly ParsedHotkey[];\n isOpen: () => boolean;\n /** Set by the arbiter: when this palette was last opened (0 = never). */\n openedAt: number;\n}\n\n/**\n * Decides which palette reacts when several `<spotlight-host>`s listen for the same hotkey\n * (for example the app shell's palette next to an `isolated` one), so one key press never opens\n * two palettes or toggles a shared one twice. Exactly one palette reacts:\n *\n * 1. an open palette, so the hotkey closes it (the one opened last if several are open);\n * 2. otherwise the palette opened most recently (by hotkey, trigger or `open()`);\n * 3. before any palette has been opened, the `<spotlight-host>` created first, normally the\n * app shell's.\n *\n * Only palettes whose own hotkeys match the event take part. Internal; not exported.\n */\n@Injectable({ providedIn: 'root' })\nexport class SpotlightHotkeyArbiter {\n private readonly clients: SpotlightHotkeyClient[] = [];\n private clock = 0;\n /** The decision for each event, so every host's listener for one key press agrees. */\n private readonly decisions = new WeakMap<Event, SpotlightHotkeyClient | null>();\n\n register(client: SpotlightHotkeyClient): () => void {\n this.clients.push(client);\n return () => {\n const index = this.clients.indexOf(client);\n if (index !== -1) this.clients.splice(index, 1);\n };\n }\n\n opened(client: SpotlightHotkeyClient): void {\n client.openedAt = ++this.clock;\n }\n\n /** The one palette that handles this hotkey event, or null when none listens for it. */\n handler(event: KeyboardEvent): SpotlightHotkeyClient | null {\n const known = this.decisions.get(event);\n if (known !== undefined) return known;\n const candidates = this.clients.filter((c) => c.hotkeys().some((hotkey) => matchesHotkey(event, hotkey)));\n // Stable sort: equal openedAt (never opened) keeps creation order.\n const latestFirst = (list: SpotlightHotkeyClient[]) => [...list].sort((a, b) => b.openedAt - a.openedAt);\n const choice = latestFirst(candidates.filter((c) => c.isOpen()))[0] ?? latestFirst(candidates)[0] ?? null;\n this.decisions.set(event, choice);\n return choice;\n }\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\n/**\n * The default theme: CSS variables only, light and dark. Variables sit on :where(:root)\n * (zero specificity) so apps override them with a plain :root or pane-class rule. Every\n * other rule is scoped under .sp-theme-default (set on the pane/backdrop by the host).\n */\nexport const SPOTLIGHT_DEFAULT_CSS = `\n:where(:root) {\n --sp-bg: #ffffff;\n --sp-fg: #1f2328;\n --sp-muted: #59636e;\n --sp-accent: #0969da;\n --sp-accent-fg: #ffffff;\n --sp-active-bg: #ddf4ff;\n --sp-border: #d1d9e0;\n --sp-backdrop: rgba(31, 35, 40, 0.4);\n --sp-radius: 12px;\n --sp-font: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n --sp-shadow: 0 16px 48px rgba(31, 35, 40, 0.24);\n --sp-info: #0969da;\n --sp-success: #1a7f37;\n --sp-warn: #9a6700;\n --sp-danger: #d1242f;\n}\n@media (prefers-color-scheme: dark) {\n :where(:root:not(.sp-light)) {\n --sp-bg: #151b23;\n --sp-fg: #f0f6fc;\n --sp-muted: #9198a1;\n --sp-accent: #4493f8;\n --sp-accent-fg: #0d1117;\n --sp-active-bg: #1d2d44;\n --sp-border: #3d444d;\n --sp-backdrop: rgba(1, 4, 9, 0.6);\n --sp-shadow: 0 16px 48px rgba(1, 4, 9, 0.6);\n --sp-info: #4493f8;\n --sp-success: #3fb950;\n --sp-warn: #d29922;\n --sp-danger: #f85149;\n }\n}\n:where(.sp-dark) {\n --sp-bg: #151b23;\n --sp-fg: #f0f6fc;\n --sp-muted: #9198a1;\n --sp-accent: #4493f8;\n --sp-accent-fg: #0d1117;\n --sp-active-bg: #1d2d44;\n --sp-border: #3d444d;\n --sp-backdrop: rgba(1, 4, 9, 0.6);\n --sp-shadow: 0 16px 48px rgba(1, 4, 9, 0.6);\n --sp-info: #4493f8;\n --sp-success: #3fb950;\n --sp-warn: #d29922;\n --sp-danger: #f85149;\n}\n.sp-backdrop.sp-theme-default { background: var(--sp-backdrop); }\n.sp-theme-default .sp-dialog {\n box-sizing: border-box; display: flex; flex-direction: column; width: 100%; max-height: min(70vh, 640px);\n background: var(--sp-bg); color: var(--sp-fg); font-family: var(--sp-font); font-size: 14px;\n border: 1px solid var(--sp-border); border-radius: var(--sp-radius); box-shadow: var(--sp-shadow); overflow: hidden;\n}\n.sp-theme-default.sp-sheet .sp-dialog { height: 100%; max-height: none; border: 0; border-radius: 0; }\n.sp-theme-default .sp-input { display: flex; align-items: center; border-bottom: 1px solid var(--sp-border); }\n.sp-theme-default .sp-input:focus-within { box-shadow: inset 0 -2px 0 var(--sp-accent); }\n.sp-theme-default .sp-input-el {\n flex: 1; min-width: 0; padding: 16px; border: 0; outline: none; background: transparent; color: inherit; font: inherit; font-size: 16px;\n}\n.sp-theme-default .sp-input-el::placeholder { color: var(--sp-muted); }\n.sp-theme-default .sp-chips { display: flex; flex-wrap: wrap; gap: 6px; padding: 8px 12px; border-bottom: 1px solid var(--sp-border); }\n.sp-theme-default .sp-chip-button { padding: 0; border: 0; background: none; color: inherit; font: inherit; cursor: pointer; border-radius: 999px; }\n.sp-theme-default .sp-chip { display: inline-block; padding: 2px 10px; border: 1px solid var(--sp-border); border-radius: 999px; color: var(--sp-muted); }\n.sp-theme-default .sp-chip-active { background: var(--sp-accent); border-color: var(--sp-accent); color: var(--sp-accent-fg); }\n.sp-theme-default .sp-list { flex: 1; overflow-y: auto; padding: 4px 0; outline: none; }\n.sp-theme-default .sp-group + .sp-group { border-top: 1px solid var(--sp-border); }\n.sp-theme-default .sp-group-header {\n display: flex; align-items: center; gap: 8px; padding: 8px 16px 4px; color: var(--sp-muted);\n font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em;\n}\n.sp-theme-default .sp-group-total { font-weight: 400; }\n.sp-theme-default .sp-option { display: flex; align-items: center; gap: 12px; padding: 8px 16px; cursor: pointer; }\n.sp-theme-default .sp-option[aria-selected='true'] { background: var(--sp-active-bg); box-shadow: inset 3px 0 0 var(--sp-accent); }\n.sp-theme-default .sp-icon { display: inline-flex; justify-content: center; width: 20px; color: var(--sp-muted); }\n.sp-theme-default .sp-icon img { width: 20px; height: 20px; object-fit: contain; }\n.sp-theme-default .sp-text { display: flex; flex: 1; flex-direction: column; min-width: 0; }\n.sp-theme-default .sp-title, .sp-theme-default .sp-subtitle { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.sp-theme-default .sp-subtitle { color: var(--sp-muted); font-size: 12px; }\n.sp-theme-default .sp-badges { display: inline-flex; gap: 4px; }\n.sp-theme-default .sp-badge { padding: 0 6px; background: var(--sp-bg); border: 1px solid currentColor; border-radius: 4px; font-size: 11px; line-height: 18px; color: var(--sp-info); }\n.sp-theme-default .sp-badge[data-tone='success'] { color: var(--sp-success); }\n.sp-theme-default .sp-badge[data-tone='warn'] { color: var(--sp-warn); }\n.sp-theme-default .sp-badge[data-tone='danger'] { color: var(--sp-danger); }\n.sp-theme-default .sp-error { flex: 1; color: var(--sp-muted); }\n.sp-theme-default .sp-retry { color: var(--sp-accent); text-decoration: underline; }\n.sp-theme-default .sp-empty { padding: 24px 16px; text-align: center; color: var(--sp-muted); }\n.sp-theme-default .sp-footer {\n display: flex; flex-wrap: wrap; gap: 16px; padding: 8px 16px; border-top: 1px solid var(--sp-border); color: var(--sp-muted); font-size: 12px;\n}\n.sp-theme-default .sp-footer kbd { padding: 0 4px; border: 1px solid var(--sp-border); border-radius: 4px; font-family: inherit; }\n.sp-theme-default .sp-spinner {\n width: 10px; height: 10px; border: 2px solid var(--sp-border); border-top-color: var(--sp-accent); border-radius: 50%;\n animation: sp-spin 0.8s linear infinite;\n}\n@keyframes sp-spin { to { transform: rotate(360deg); } }\n@media (prefers-reduced-motion: reduce) { .sp-theme-default .sp-spinner { animation: none; } }\n`;\n\n/** Rendered by <spotlight-host> only when theme is 'default'; theme 'none' never loads this CSS. */\n@Component({\n selector: 'spotlight-theme-default',\n template: '',\n styles: [SPOTLIGHT_DEFAULT_CSS],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { style: 'display:none' },\n})\nexport class SpotlightDefaultTheme {}\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\nimport { SpotlightService } from './spotlight.service';\nimport type { SpotlightItem } from './types';\n\nexport interface SpotlightItemTemplateContext {\n $implicit: SpotlightItem;\n active: boolean;\n query: string;\n}\n\nexport interface SpotlightEmptyTemplateContext {\n /** The current query. */\n $implicit: string;\n}\n\n/** `<ng-template spotlightItem=\"customers\" let-item>`: row for one group; without a value: for every group. */\n@Directive({ selector: '[spotlightItem]' })\nexport class SpotlightItemTemplate {\n readonly spotlightItem = input('');\n /** @internal */\n readonly template = inject<TemplateRef<SpotlightItemTemplateContext>>(TemplateRef);\n\n static ngTemplateContextGuard(_dir: SpotlightItemTemplate, _ctx: unknown): _ctx is SpotlightItemTemplateContext {\n return true;\n }\n}\n\n/** `<ng-template spotlightEmpty let-query>`: shown when a non-empty query has no results. */\n@Directive({ selector: '[spotlightEmpty]' })\nexport class SpotlightEmptyTemplate {\n /** @internal */\n readonly template = inject<TemplateRef<SpotlightEmptyTemplateContext>>(TemplateRef);\n\n static ngTemplateContextGuard(_dir: SpotlightEmptyTemplate, _ctx: unknown): _ctx is SpotlightEmptyTemplateContext {\n return true;\n }\n}\n\n/** `<ng-template spotlightFooter>`: replaces the default key hints. */\n@Directive({ selector: '[spotlightFooter]' })\nexport class SpotlightFooterTemplate {\n /** @internal */\n readonly template = inject<TemplateRef<void>>(TemplateRef);\n}\n\n/** Opens the palette on click. `spotlightTrigger=\"#\"` opens it with an initial query. */\n@Directive({\n selector: '[spotlightTrigger]',\n host: { '(click)': 'open()', 'aria-haspopup': 'dialog' },\n})\nexport class SpotlightTrigger {\n private readonly svc = inject(SpotlightService);\n readonly spotlightTrigger = input('');\n\n /** @internal */\n protected open(): void {\n this.svc.open(this.spotlightTrigger() || undefined);\n }\n}\n","import { FocusTrapFactory, type FocusTrap } from '@angular/cdk/a11y';\nimport { BreakpointObserver } from '@angular/cdk/layout';\nimport { Overlay, type OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { DOCUMENT, NgComponentOutlet, NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n DestroyRef,\n effect,\n inject,\n Injector,\n TemplateRef,\n untracked,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { SpotlightHotkeyArbiter, type SpotlightHotkeyClient } from './hotkey-arbiter';\nimport { matchesHotkey } from './hotkeys';\nimport { resolveParts } from './parts/default-parts';\nimport { SpotlightDefaultTheme } from './parts/default-theme';\nimport { SPOTLIGHT_RENDERER, type SpotlightInputContext } from './renderer';\nimport { SpotlightService, type SpotlightOption } from './spotlight.service';\nimport {\n SpotlightEmptyTemplate,\n SpotlightFooterTemplate,\n SpotlightItemTemplate,\n type SpotlightItemTemplateContext,\n} from './templates';\n\nconst PHONE_QUERY = '(max-width: 600px)';\n\n/** The palette. Place it once in the app shell. */\n@Component({\n selector: 'spotlight-host',\n imports: [NgComponentOutlet, NgTemplateOutlet, SpotlightDefaultTheme],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '(document:keydown)': 'onDocumentKeydown($event)' },\n template: `\n @if (themeDefault) {\n <spotlight-theme-default />\n }\n <ng-template #panel>\n <div class=\"sp-dialog\" role=\"dialog\" aria-modal=\"true\" [attr.aria-label]=\"texts.placeholder()\">\n <div class=\"sp-input\">\n <ng-container *ngComponentOutlet=\"parts.input; inputs: { ctx: inputCtx() }\" />\n </div>\n @if (svc.chips().length > 1) {\n <div class=\"sp-chips\">\n @for (chip of svc.chips(); track chip.id ?? '') {\n <button\n type=\"button\"\n class=\"sp-chip-button\"\n tabindex=\"-1\"\n [attr.aria-pressed]=\"chip.id === svc.chip()\"\n [attr.aria-label]=\"chip.label\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"svc.setChip(chip.id)\"\n >\n <ng-container\n *ngComponentOutlet=\"parts.chips; inputs: { ctx: { label: chip.label, active: chip.id === svc.chip() } }\"\n />\n </button>\n }\n </div>\n }\n <div class=\"sp-list\" role=\"listbox\" tabindex=\"-1\" [attr.aria-busy]=\"svc.loading() || null\" [id]=\"ids.listbox\" [attr.aria-label]=\"texts.placeholder()\">\n @for (group of svc.groups(); track group.key; let g = $index) {\n <div class=\"sp-group\" role=\"group\" [attr.aria-labelledby]=\"ids.prefix + '-g' + g\">\n <div class=\"sp-group-header\" [id]=\"ids.prefix + '-g' + g\">\n <ng-container\n *ngComponentOutlet=\"\n parts.groupHeader;\n inputs: { ctx: { label: group.label, total: group.total, loading: group.loading, loadingText: loadingTextFor(group.label) } }\n \"\n />\n </div>\n @for (opt of optionsByGroup().get(group.key) ?? []; track opt.key) {\n <div\n class=\"sp-option\"\n role=\"option\"\n [id]=\"opt.domId\"\n [attr.aria-selected]=\"opt.domId === activeId()\"\n (mousedown)=\"$event.preventDefault()\"\n (mousemove)=\"svc.setActive(opt.key)\"\n (click)=\"choose(opt, $event)\"\n >\n @if (opt.item; as item) {\n @let rowTemplate = templateFor(item.group);\n @if (rowTemplate) {\n <ng-container\n *ngTemplateOutlet=\"rowTemplate; context: { $implicit: item, active: opt.domId === activeId(), query: svc.query() }\"\n />\n } @else {\n <ng-container\n *ngComponentOutlet=\"\n parts.row;\n inputs: { ctx: { item: item, active: opt.domId === activeId(), query: svc.query(), badge: parts.badge } }\n \"\n />\n }\n } @else {\n <span class=\"sp-error\">{{ texts.error() }}</span>\n <span class=\"sp-retry\">{{ texts.retry() }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n @if (showEmpty()) {\n <div class=\"sp-empty\">\n @if (emptyTemplate(); as empty) {\n <ng-container *ngTemplateOutlet=\"empty.template; context: { $implicit: svc.query() }\" />\n } @else {\n {{ texts.noResults() }}\n }\n </div>\n }\n <div class=\"sp-footer\">\n @if (footerTemplate(); as footer) {\n <ng-container *ngTemplateOutlet=\"footer.template\" />\n } @else {\n <span><kbd>↑</kbd><kbd>↓</kbd> {{ texts.hintNavigate() }}</span>\n <span><kbd>↵</kbd> {{ texts.hintOpen() }}</span>\n <span><kbd>esc</kbd> {{ texts.hintClose() }}</span>\n }\n </div>\n <div\n role=\"status\"\n aria-live=\"polite\"\n style=\"position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0\"\n >\n {{ svc.announcement() }}\n </div>\n </div>\n </ng-template>\n `,\n})\nexport class SpotlightHost {\n /** @internal */\n protected readonly svc = inject(SpotlightService);\n private readonly overlay = inject(Overlay);\n private readonly focusTrapFactory = inject(FocusTrapFactory);\n private readonly breakpoints = inject(BreakpointObserver);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly injector = inject(Injector);\n private readonly document = inject(DOCUMENT);\n private readonly arbiter = inject(SpotlightHotkeyArbiter);\n private readonly hotkeyClient: SpotlightHotkeyClient = {\n hotkeys: () => this.svc.settings.hotkeys,\n isOpen: () => this.svc.isOpen(),\n openedAt: 0,\n };\n\n /** @internal */\n protected readonly parts = resolveParts(inject(SPOTLIGHT_RENDERER, { optional: true }));\n /** @internal */\n protected readonly themeDefault = this.svc.settings.theme === 'default';\n /** @internal */\n protected readonly ids = {\n prefix: this.svc.idPrefix,\n input: `${this.svc.idPrefix}-input`,\n listbox: `${this.svc.idPrefix}-listbox`,\n };\n\n private readonly panel = viewChild.required<TemplateRef<unknown>>('panel');\n private readonly itemTemplates = contentChildren(SpotlightItemTemplate);\n /** @internal */\n protected readonly emptyTemplate = contentChild(SpotlightEmptyTemplate);\n /** @internal */\n protected readonly footerTemplate = contentChild(SpotlightFooterTemplate);\n\n private overlayRef: OverlayRef | null = null;\n private focusTrap: FocusTrap | null = null;\n private restoreFocus: HTMLElement | null = null;\n\n /** @internal */\n protected readonly activeId = computed(() => this.svc.activeOption()?.domId ?? null);\n\n /** @internal */\n protected readonly optionsByGroup = computed(() => {\n const byGroup = new Map<string, SpotlightOption[]>();\n for (const option of this.svc.options()) {\n const list = byGroup.get(option.groupKey) ?? [];\n list.push(option);\n byGroup.set(option.groupKey, list);\n }\n return byGroup;\n });\n\n /** @internal */\n protected readonly showEmpty = computed(\n () => this.svc.query().trim() !== '' && this.svc.options().length === 0 && !this.svc.loading(),\n );\n\n private readonly handleInput = (value: string): void => this.svc.setQuery(value);\n private readonly handleKeydown = (event: KeyboardEvent): void => this.onInputKeydown(event);\n\n /** @internal */\n protected readonly inputCtx = computed<SpotlightInputContext>(() => ({\n id: this.ids.input,\n value: this.svc.query(),\n placeholder: this.texts.placeholder(),\n label: this.texts.placeholder(),\n expanded: this.svc.options().length > 0 || this.svc.loading(),\n controls: this.ids.listbox,\n activeDescendant: this.activeId(),\n onInput: this.handleInput,\n onKeydown: this.handleKeydown,\n }));\n\n constructor() {\n const unregister = this.arbiter.register(this.hotkeyClient);\n effect(() => {\n const open = this.svc.isOpen();\n untracked(() => {\n if (open) {\n this.arbiter.opened(this.hotkeyClient);\n this.attach();\n } else {\n this.detach();\n }\n });\n });\n afterRenderEffect(() => {\n const id = this.activeId();\n if (id === null || this.overlayRef === null) return;\n this.document.getElementById(id)?.scrollIntoView?.({ block: 'nearest' });\n });\n inject(DestroyRef).onDestroy(() => {\n unregister();\n this.svc.close();\n this.detach();\n });\n }\n\n /** @internal */\n protected get texts() {\n return this.svc.texts;\n }\n\n /** @internal A placeholder header already reads \"Loading…\"; don't announce it twice. */\n protected loadingTextFor(label: string): string {\n const loading = this.texts.loading();\n return label === loading ? '' : loading;\n }\n\n /** @internal */\n protected templateFor(groupId: string): TemplateRef<SpotlightItemTemplateContext> | null {\n const templates = this.itemTemplates();\n const match =\n templates.find((t) => t.spotlightItem() === groupId) ?? templates.find((t) => t.spotlightItem() === '');\n return match?.template ?? null;\n }\n\n /** @internal */\n protected choose(option: SpotlightOption, event: MouseEvent): void {\n void this.svc.select(option, { newTab: event.ctrlKey || event.metaKey });\n }\n\n /** @internal */\n protected onDocumentKeydown(event: KeyboardEvent): void {\n if (!this.svc.settings.hotkeys.some((hotkey) => matchesHotkey(event, hotkey))) return;\n event.preventDefault();\n if (event.repeat) return;\n // With several palettes on the page, exactly one reacts (see SpotlightHotkeyArbiter).\n if (this.arbiter.handler(event) !== this.hotkeyClient) return;\n this.svc.toggle();\n }\n\n private onInputKeydown(event: KeyboardEvent): void {\n if (event.isComposing) return;\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.svc.moveActive(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.svc.moveActive(-1);\n break;\n case 'Enter': {\n event.preventDefault();\n const option = this.svc.activeOption();\n if (option) void this.svc.select(option, { newTab: event.ctrlKey || event.metaKey });\n break;\n }\n case 'Tab':\n if (this.svc.chips().length > 1) {\n event.preventDefault();\n this.svc.cycleChip(event.shiftKey ? -1 : 1);\n }\n break;\n }\n }\n\n private attach(): void {\n if (this.overlayRef) return;\n const active = this.document.activeElement;\n this.restoreFocus = active instanceof HTMLElement ? active : null;\n const sheet = this.breakpoints.isMatched(PHONE_QUERY);\n const theme = this.themeDefault ? ['sp-theme-default'] : [];\n const position = this.overlay.position().global();\n const ref = this.overlay.create({\n hasBackdrop: true,\n backdropClass: ['sp-backdrop', ...theme, ...(this.parts.backdropClass ? [this.parts.backdropClass] : [])],\n panelClass: ['sp-pane', ...theme, ...(sheet ? ['sp-sheet'] : []), ...(this.parts.panelClass ? [this.parts.panelClass] : [])],\n positionStrategy: sheet ? position.top('0').left('0') : position.centerHorizontally().top('12vh'),\n scrollStrategy: this.overlay.scrollStrategies.block(),\n width: sheet ? '100vw' : 'min(640px, calc(100vw - 32px))',\n height: sheet ? '100dvh' : undefined,\n });\n ref.attach(new TemplatePortal(this.panel(), this.viewContainerRef));\n ref.backdropClick().subscribe(() => this.svc.close());\n ref.keydownEvents().subscribe((event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.svc.close();\n }\n });\n this.focusTrap = this.focusTrapFactory.create(ref.overlayElement);\n this.overlayRef = ref;\n afterNextRender(() => this.overlayRef?.overlayElement.querySelector<HTMLElement>('[role=\"combobox\"]')?.focus(), {\n injector: this.injector,\n });\n }\n\n private detach(): void {\n if (!this.overlayRef) return;\n this.focusTrap?.destroy();\n this.focusTrap = null;\n this.overlayRef.dispose();\n this.overlayRef = null;\n const target = this.restoreFocus;\n this.restoreFocus = null;\n if (target?.isConnected) target.focus();\n }\n}\n","// Public API for @tocdk-oss/ng-spotlight. Every change here must show up in api/ng-spotlight.api.md\n// (npm run check:api). Members tagged internal in their JSDoc are stripped from the published .d.ts.\n\nexport type {\n SpotlightAction,\n SpotlightBadge,\n SpotlightBadgeTone,\n SpotlightConfig,\n SpotlightContext,\n SpotlightGroup,\n SpotlightHttpOptions,\n SpotlightHttpRequest,\n SpotlightItem,\n SpotlightItemInput,\n SpotlightRecentEntry,\n SpotlightRecentStorage,\n SpotlightResponse,\n SpotlightResult,\n SpotlightSource,\n SpotlightStoredAction,\n SpotlightTexts,\n SpotlightTextValue,\n} from './lib/types';\nexport { localStorageRecent } from './lib/recent';\nexport { staticSource, type StaticSourceOptions } from './lib/sources/static-source';\nexport { routeSource, type RouteSourceOptions } from './lib/sources/route-source';\nexport type { SpotlightRouteData } from './lib/sources/route-walk';\nexport {\n spotlightRouteAudit,\n type SpotlightRouteAuditEntry,\n type SpotlightRouteAuditOptions,\n} from './lib/sources/route-audit';\nexport { httpSource, type HttpSourceOptions } from './lib/sources/http-source';\n\nexport { provideSpotlight } from './lib/provide-spotlight';\nexport { SpotlightService } from './lib/spotlight.service';\nexport {\n SPOTLIGHT_RENDERER,\n type SpotlightBadgeContext,\n type SpotlightChipContext,\n type SpotlightGroupHeaderContext,\n type SpotlightInputContext,\n type SpotlightRenderer,\n type SpotlightRowContext,\n} from './lib/renderer';\nexport {\n SpotlightDefaultBadge,\n SpotlightDefaultChip,\n SpotlightDefaultGroupHeader,\n SpotlightDefaultInput,\n SpotlightDefaultRow,\n} from './lib/parts/default-parts';\nexport { SpotlightHost } from './lib/spotlight-host';\nexport {\n SpotlightEmptyTemplate,\n SpotlightFooterTemplate,\n SpotlightItemTemplate,\n SpotlightTrigger,\n type SpotlightEmptyTemplateContext,\n type SpotlightItemTemplateContext,\n} from './lib/templates';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["map","mapResponse"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,60 @@
1
1
  {
2
2
  "name": "@tocdk-oss/ng-spotlight",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "21.0.1",
4
+ "description": "Keyboard-first spotlight / command palette for Angular: headless core plus a PrimeNG adapter.",
5
+ "license": "MIT",
6
+ "author": "Thomas Christensen (tocDK)",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/tocDK/ng-spotlight.git"
10
+ },
11
+ "homepage": "https://tocdk.github.io/ng-spotlight/",
12
+ "bugs": "https://github.com/tocDK/ng-spotlight/issues",
13
+ "keywords": [
14
+ "angular",
15
+ "command-palette",
16
+ "spotlight",
17
+ "quick-search",
18
+ "cmdk",
19
+ "primeng",
20
+ "a11y"
21
+ ],
22
+ "peerDependencies": {
23
+ "@angular/cdk": "^21.0.0",
24
+ "@angular/common": "^21.0.0",
25
+ "@angular/core": "^21.0.0",
26
+ "@angular/router": "^21.0.0",
27
+ "primeng": "^21.0.0",
28
+ "rxjs": "^7.8.0"
29
+ },
30
+ "peerDependenciesMeta": {
31
+ "primeng": {
32
+ "optional": true
33
+ }
34
+ },
35
+ "dependencies": {
36
+ "tslib": "^2.3.0"
37
+ },
38
+ "sideEffects": false,
39
+ "exports": {
40
+ "./schema/spotlight-response.schema.json": "./schema/spotlight-response.schema.json",
41
+ "./package.json": {
42
+ "default": "./package.json"
43
+ },
44
+ ".": {
45
+ "types": "./types/tocdk-oss-ng-spotlight.d.ts",
46
+ "default": "./fesm2022/tocdk-oss-ng-spotlight.mjs"
47
+ },
48
+ "./primeng": {
49
+ "types": "./types/tocdk-oss-ng-spotlight-primeng.d.ts",
50
+ "default": "./fesm2022/tocdk-oss-ng-spotlight-primeng.mjs"
51
+ }
52
+ },
53
+ "publishConfig": {
54
+ "access": "public",
55
+ "provenance": true
56
+ },
57
+ "module": "fesm2022/tocdk-oss-ng-spotlight.mjs",
58
+ "typings": "types/tocdk-oss-ng-spotlight.d.ts",
59
+ "type": "module"
6
60
  }
@@ -0,0 +1,74 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://tocdk.github.io/ng-spotlight/schema/spotlight-response.schema.json",
4
+ "title": "SpotlightResult",
5
+ "description": "Response format for @tocdk-oss/ng-spotlight httpSource: a grouped SpotlightResponse or a flat SpotlightItem array (grouped by item.group).",
6
+ "oneOf": [
7
+ { "$ref": "#/$defs/SpotlightResponse" },
8
+ { "type": "array", "items": { "$ref": "#/$defs/SpotlightItem" } }
9
+ ],
10
+ "$defs": {
11
+ "SpotlightResponse": {
12
+ "type": "object",
13
+ "required": ["groups"],
14
+ "properties": {
15
+ "groups": { "type": "array", "items": { "$ref": "#/$defs/SpotlightGroup" } }
16
+ }
17
+ },
18
+ "SpotlightGroup": {
19
+ "type": "object",
20
+ "required": ["id", "label", "items"],
21
+ "properties": {
22
+ "id": { "type": "string", "minLength": 1 },
23
+ "label": { "type": "string" },
24
+ "total": { "type": "integer", "minimum": 0 },
25
+ "items": { "type": "array", "items": { "$ref": "#/$defs/SpotlightItem" } }
26
+ }
27
+ },
28
+ "SpotlightItem": {
29
+ "type": "object",
30
+ "required": ["id", "title", "action"],
31
+ "properties": {
32
+ "id": { "type": "string", "minLength": 1 },
33
+ "title": { "type": "string" },
34
+ "subtitle": { "type": "string" },
35
+ "icon": { "type": "string" },
36
+ "group": {
37
+ "type": "string",
38
+ "description": "Optional inside a group (the group id wins); in a flat array it defaults to the source's group."
39
+ },
40
+ "keywords": { "type": "array", "items": { "type": "string" } },
41
+ "badges": { "type": "array", "items": { "$ref": "#/$defs/SpotlightBadge" } },
42
+ "suggested": { "type": "boolean" },
43
+ "data": {},
44
+ "action": { "$ref": "#/$defs/SpotlightAction" },
45
+ "children": false
46
+ }
47
+ },
48
+ "SpotlightBadge": {
49
+ "type": "object",
50
+ "required": ["label"],
51
+ "properties": {
52
+ "label": { "type": "string" },
53
+ "tone": { "enum": ["info", "success", "warn", "danger"] }
54
+ },
55
+ "additionalProperties": false
56
+ },
57
+ "SpotlightAction": {
58
+ "oneOf": [
59
+ {
60
+ "type": "object",
61
+ "required": ["route"],
62
+ "properties": { "route": { "oneOf": [{ "type": "string" }, { "type": "array" }] } },
63
+ "additionalProperties": false
64
+ },
65
+ {
66
+ "type": "object",
67
+ "required": ["url"],
68
+ "properties": { "url": { "type": "string" }, "newTab": { "type": "boolean" } },
69
+ "additionalProperties": false
70
+ }
71
+ ]
72
+ }
73
+ }
74
+ }
@@ -0,0 +1,35 @@
1
+ import * as i0 from '@angular/core';
2
+ import { EnvironmentProviders } from '@angular/core';
3
+ import { SpotlightRenderer, SpotlightBadgeContext, SpotlightChipContext, SpotlightGroupHeaderContext, SpotlightInputContext, SpotlightRowContext } from '@tocdk-oss/ng-spotlight';
4
+
5
+ declare const SPOTLIGHT_PRIMENG_RENDERER: SpotlightRenderer;
6
+ /** Renders the palette with PrimeNG components. Use next to provideSpotlight() and providePrimeNG(). */
7
+ declare function provideSpotlightPrimeNG(): EnvironmentProviders;
8
+
9
+ declare class SpotlightPrimeNgInput {
10
+ readonly ctx: i0.InputSignal<SpotlightInputContext>;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<SpotlightPrimeNgInput, never>;
12
+ static ɵcmp: i0.ɵɵComponentDeclaration<SpotlightPrimeNgInput, "spotlight-primeng-input", never, { "ctx": { "alias": "ctx"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
13
+ }
14
+ declare class SpotlightPrimeNgChip {
15
+ readonly ctx: i0.InputSignal<SpotlightChipContext>;
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<SpotlightPrimeNgChip, never>;
17
+ static ɵcmp: i0.ɵɵComponentDeclaration<SpotlightPrimeNgChip, "spotlight-primeng-chip", never, { "ctx": { "alias": "ctx"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
18
+ }
19
+ declare class SpotlightPrimeNgGroupHeader {
20
+ readonly ctx: i0.InputSignal<SpotlightGroupHeaderContext>;
21
+ static ɵfac: i0.ɵɵFactoryDeclaration<SpotlightPrimeNgGroupHeader, never>;
22
+ static ɵcmp: i0.ɵɵComponentDeclaration<SpotlightPrimeNgGroupHeader, "spotlight-primeng-group-header", never, { "ctx": { "alias": "ctx"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
23
+ }
24
+ declare class SpotlightPrimeNgBadge {
25
+ readonly ctx: i0.InputSignal<SpotlightBadgeContext>;
26
+ static ɵfac: i0.ɵɵFactoryDeclaration<SpotlightPrimeNgBadge, never>;
27
+ static ɵcmp: i0.ɵɵComponentDeclaration<SpotlightPrimeNgBadge, "spotlight-primeng-badge", never, { "ctx": { "alias": "ctx"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
28
+ }
29
+ declare class SpotlightPrimeNgRow {
30
+ readonly ctx: i0.InputSignal<SpotlightRowContext>;
31
+ static ɵfac: i0.ɵɵFactoryDeclaration<SpotlightPrimeNgRow, never>;
32
+ static ɵcmp: i0.ɵɵComponentDeclaration<SpotlightPrimeNgRow, "spotlight-primeng-row", never, { "ctx": { "alias": "ctx"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
33
+ }
34
+
35
+ export { SPOTLIGHT_PRIMENG_RENDERER, SpotlightPrimeNgBadge, SpotlightPrimeNgChip, SpotlightPrimeNgGroupHeader, SpotlightPrimeNgInput, SpotlightPrimeNgRow, provideSpotlightPrimeNG };