@franzzemen/brokenstock-shell 0.0.30 → 0.0.31
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.
|
@@ -884,9 +884,10 @@ class FaqModal {
|
|
|
884
884
|
const entry = this.faq.activeEntry();
|
|
885
885
|
if (!content)
|
|
886
886
|
return '';
|
|
887
|
-
|
|
887
|
+
const parsed = this.renderer.parse(content);
|
|
888
|
+
return this.renderer.render(parsed.body, {
|
|
888
889
|
context: 'modal',
|
|
889
|
-
imagePrefix: entry?.imagePrefix,
|
|
890
|
+
imagePrefix: entry?.imagePrefix ?? parsed.frontmatter['image-prefix'],
|
|
890
891
|
});
|
|
891
892
|
}, ...(ngDevMode ? [{ debugName: "renderedHtml" }] : /* istanbul ignore next */ []));
|
|
892
893
|
this.toc = computed(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"franzzemen-brokenstock-shell.mjs","sources":["../../src/lib/tokens/shell-tokens.ts","../../src/lib/provide-shell-config.ts","../../src/lib/services/thinking.service.ts","../../src/lib/services/authentication.service.ts","../../src/lib/guards/auth.guard.ts","../../src/lib/guards/guest.guard.ts","../../src/lib/interceptors/auth.interceptor.ts","../../src/lib/directives/regex-validator.directive.ts","../../src/lib/faq/faq.types.ts","../../src/lib/faq/faq-content-loader.token.ts","../../src/lib/faq/faq-markdown-renderer.service.ts","../../src/lib/faq/http-faq-content-loader.service.ts","../../src/lib/faq/faq-history.service.ts","../../src/lib/faq/faq.service.ts","../../src/lib/faq/faq-dev-mode.token.ts","../../src/lib/faq/faq-modal/faq-modal.ts","../../src/lib/faq/faq-modal/faq-modal.html","../../src/lib/faq/faq-authoring-panel/faq-authoring-panel.ts","../../src/lib/faq/faq-authoring-panel/faq-authoring-panel.html","../../src/lib/faq/faq-seo.tokens.ts","../../src/lib/faq/public-faq-index/public-faq-index.ts","../../src/lib/faq/public-faq-page/public-faq-page.ts","../../src/lib/services/theme.service.ts","../../src/lib/services/terminal-focus.service.ts","../../src/lib/services/keyboard-shortcut.service.ts","../../src/lib/commands/faq.command.ts","../../src/lib/services/command-registry.service.ts","../../src/lib/commands/command.utils.ts","../../src/lib/services/command.service.ts","../../src/lib/components/status-bar/status-bar.ts","../../src/lib/components/status-bar/status-bar.html","../../src/lib/components/side-menu/side-menu.ts","../../src/lib/components/side-menu/side-menu.html","../../src/lib/components/main-content/main-content.ts","../../src/lib/components/main-content/main-content.html","../../src/lib/components/command-terminal/command-terminal.ts","../../src/lib/components/command-terminal/command-terminal.html","../../src/lib/components/shell/shell.ts","../../src/lib/components/shell/shell.html","../../src/lib/components/login/login.ts","../../src/lib/components/login/login.html","../../src/lib/components/confirm-dialog/confirm-dialog.ts","../../src/public-api.ts","../../src/franzzemen-brokenstock-shell.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { CommandDefinition } from '../types/command.types';\nimport { MenuItem } from '../types/menu.types';\n\nexport interface ShellAuthUrls {\n login: string;\n logout: string;\n refresh: string;\n}\n\nexport const SHELL_APP_NAME = new InjectionToken<string>('SHELL_APP_NAME');\nexport const SHELL_MENU_ITEMS = new InjectionToken<MenuItem[]>('SHELL_MENU_ITEMS');\nexport const SHELL_AUTH_URLS = new InjectionToken<ShellAuthUrls>('SHELL_AUTH_URLS');\n\n/**\n * App-specific commands to register alongside the built-in command set.\n * Provide via provideShellConfig().\n */\nexport const SHELL_COMMANDS = new InjectionToken<CommandDefinition[]>('SHELL_COMMANDS');\n\nexport const SHELL_POST_LOGIN_ROUTE = new InjectionToken<string>('SHELL_POST_LOGIN_ROUTE');\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { CommandDefinition } from './types/command.types';\nimport { MenuItem } from './types/menu.types';\nimport { SHELL_APP_NAME, SHELL_AUTH_URLS, SHELL_COMMANDS, SHELL_MENU_ITEMS, ShellAuthUrls } from './tokens/shell-tokens';\n\nexport interface ShellConfig {\n appName: string;\n menuItems: MenuItem[];\n authUrls: ShellAuthUrls;\n commands?: CommandDefinition[];\n}\n\nexport function provideShellConfig(config: ShellConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: SHELL_APP_NAME, useValue: config.appName },\n { provide: SHELL_MENU_ITEMS, useValue: config.menuItems },\n { provide: SHELL_AUTH_URLS, useValue: config.authUrls },\n { provide: SHELL_COMMANDS, useValue: config.commands ?? [] },\n ]);\n}\n","import { Injectable, signal, computed } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class ThinkingService {\n readonly #activeCount = signal(0);\n\n readonly isThinking = computed(() => this.#activeCount() > 0);\n\n startThinking(): void {\n this.#activeCount.update(c => c + 1);\n }\n\n stopThinking(): void {\n this.#activeCount.update(c => Math.max(0, c - 1));\n }\n\n reset(): void {\n this.#activeCount.set(0);\n }\n}\n","import { computed, inject, Injectable, signal } from '@angular/core';\nimport { BEARER_TOKEN_REGEX, BearerToken, HttpHeader } from '@franzzemen/utility';\nimport { AuthenticationResponse, Credentials, EffectivePermissions, RoleNames, SessionSummary, UserSession, validateCredentials } from '@franzzemen/identity';\nimport { HttpClient, HttpErrorResponse, HttpResponse } from '@angular/common/http';\nimport { Router } from '@angular/router';\nimport { ThinkingService } from './thinking.service';\nimport { SHELL_AUTH_URLS } from '../tokens/shell-tokens';\n\n@Injectable({ providedIn: 'root' })\nexport class AuthenticationService {\n readonly authenticated = signal(false);\n readonly authenticating = signal(false);\n readonly userSession = signal<UserSession | undefined>(undefined);\n readonly effectivePermissions = signal<EffectivePermissions>({});\n readonly conflictSessions = signal<SessionSummary[] | undefined>(undefined);\n readonly pendingCredentials = signal<Credentials | undefined>(undefined);\n\n #refreshing: Promise<boolean> | null = null;\n #auth: BearerToken = 'Bearer ..' as BearerToken;\n\n readonly #httpClient = inject(HttpClient);\n readonly #thinkingService = inject(ThinkingService);\n readonly #router = inject(Router);\n readonly #authUrls = inject(SHELL_AUTH_URLS);\n\n get auth(): BearerToken {\n return this.#auth;\n }\n\n /** Check if the current user has a specific role. */\n hasRole(roleName: RoleNames): boolean {\n return this.authenticated() && this.userSession()?.roles.includes(roleName) === true;\n }\n\n /** Check if the current user has any of the specified roles. */\n hasAnyRole(roleNames: RoleNames[]): boolean {\n return this.authenticated() && roleNames.some(r => this.userSession()?.roles.includes(r) === true);\n }\n\n refresh(): Promise<boolean> {\n if (this.#refreshing) {\n return this.#refreshing;\n }\n this.#refreshing = this.#doRefresh().finally(() => { this.#refreshing = null; });\n return this.#refreshing;\n }\n\n clearConflict(): void {\n this.conflictSessions.set(undefined);\n this.pendingCredentials.set(undefined);\n }\n\n logout(): void {\n const subscription = this.#httpClient\n .get<void>(this.#authUrls.logout, {\n headers: {\n [HttpHeader.Authorization]: this.#auth,\n [HttpHeader.AppContext]: 'brokenstock',\n },\n })\n .subscribe({\n next: () => {\n this.#clearSession();\n subscription.unsubscribe();\n },\n error: () => {\n this.#thinkingService.reset();\n this.#clearSession();\n },\n });\n }\n\n login(credentials: Credentials, force = false): Promise<void> {\n const validation = validateCredentials(credentials);\n if (validation !== true) {\n return Promise.reject('Invalid credentials');\n }\n this.conflictSessions.set(undefined);\n this.#thinkingService.startThinking();\n return new Promise((resolve, reject) => {\n this.authenticating.set(true);\n const body = force ? {...credentials, force: true} : credentials;\n const subscription = this.#httpClient\n .post<HttpResponse<AuthenticationResponse>>(\n this.#authUrls.login,\n body,\n {\n headers: {\n [HttpHeader.ContentType]: 'application/json',\n [HttpHeader.AppContext]: 'brokenstock',\n },\n observe: 'response',\n responseType: 'json',\n withCredentials: true,\n },\n )\n .subscribe({\n next: (response: HttpResponse<any>) => {\n try {\n const authResponse: AuthenticationResponse = response.body;\n // @ts-ignore\n delete authResponse.session.token;\n this.userSession.set(authResponse.session);\n this.effectivePermissions.set(authResponse.effectivePermissions ?? {});\n const auth = response.headers.get(HttpHeader.Authorization);\n if (!auth || !BEARER_TOKEN_REGEX.test(auth)) {\n reject('Unable to login');\n return;\n }\n this.#auth = auth as BearerToken;\n this.authenticated.set(true);\n this.pendingCredentials.set(undefined);\n resolve();\n } catch {\n reject('Unable to login');\n } finally {\n this.authenticating.set(false);\n subscription.unsubscribe();\n this.#thinkingService.stopThinking();\n }\n },\n error: (err: HttpErrorResponse) => {\n try {\n if (err.status === 409) {\n this.conflictSessions.set(err.error?.activeSessions ?? []);\n this.pendingCredentials.set(credentials);\n reject('conflict');\n } else {\n reject(err.message ?? 'Unable to login');\n }\n } finally {\n this.authenticating.set(false);\n subscription.unsubscribe();\n this.#thinkingService.stopThinking();\n }\n },\n });\n });\n }\n\n async #doRefresh(): Promise<boolean> {\n try {\n const response = await fetch(this.#authUrls.refresh, {\n method: 'POST',\n headers: {\n [HttpHeader.Authorization]: this.#auth,\n [HttpHeader.AppContext]: 'brokenstock',\n },\n credentials: 'include',\n });\n if (!response.ok) return false;\n const auth = response.headers.get(HttpHeader.Authorization);\n if (!auth || !BEARER_TOKEN_REGEX.test(auth)) return false;\n const body: AuthenticationResponse = await response.json();\n this.#auth = auth as BearerToken;\n this.userSession.set(body.session);\n this.effectivePermissions.set(body.effectivePermissions ?? {});\n return true;\n } catch {\n return false;\n }\n }\n\n #clearSession(): void {\n this.authenticated.set(false);\n this.userSession.set(undefined);\n this.effectivePermissions.set({});\n this.conflictSessions.set(undefined);\n this.pendingCredentials.set(undefined);\n this.#auth = 'Bearer ..' as BearerToken;\n this.#router.navigate(['/login']).catch(console.error);\n }\n}\n","import { inject } from '@angular/core';\nimport {\n ActivatedRouteSnapshot,\n CanActivateFn,\n Router,\n RouterStateSnapshot,\n} from '@angular/router';\nimport { AuthenticationService } from '../services/authentication.service';\n\nexport const authGuard: CanActivateFn = (\n _route: ActivatedRouteSnapshot,\n state: RouterStateSnapshot,\n) => {\n const authService = inject(AuthenticationService);\n const router = inject(Router);\n\n if (authService.authenticated()) {\n return true;\n }\n return router.createUrlTree(['/login'], {\n queryParams: { returnUrl: state.url },\n });\n};\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\nimport { AuthenticationService } from '../services/authentication.service';\nimport { SHELL_POST_LOGIN_ROUTE } from '../tokens/shell-tokens';\n\nexport const guestGuard: CanActivateFn = () => {\n const authService = inject(AuthenticationService);\n const router = inject(Router);\n const postLoginRoute = inject(SHELL_POST_LOGIN_ROUTE, { optional: true }) ?? '/';\n\n if (authService.authenticated()) {\n return router.parseUrl(postLoginRoute);\n }\n return true;\n};\n","import { HttpInterceptorFn } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { from, switchMap, catchError, tap, throwError } from 'rxjs';\nimport { AuthenticationService } from '../services/authentication.service';\nimport { ThinkingService } from '../services/thinking.service';\nimport { SHELL_AUTH_URLS } from '../tokens/shell-tokens';\nimport { HttpHeader } from '@franzzemen/utility';\n\nexport const authInterceptor: HttpInterceptorFn = (req, next) => {\n const authService = inject(AuthenticationService);\n const thinkingService = inject(ThinkingService);\n const authUrls = inject(SHELL_AUTH_URLS);\n const router = inject(Router);\n\n return next(req).pipe(\n tap({\n next: (event) => {\n if ('headers' in event && event.headers?.get('x-permissions-stale') === 'true') {\n authService.refresh();\n }\n },\n }),\n catchError((error) => {\n const isRefreshOrLogin = req.url === authUrls.refresh || req.url === authUrls.login;\n if (error.status === 401 && !isRefreshOrLogin) {\n return from(authService.refresh()).pipe(\n switchMap((refreshed) => {\n if (refreshed) {\n const retryReq = req.clone({\n setHeaders: { [HttpHeader.Authorization]: authService.auth },\n });\n return next(retryReq);\n }\n thinkingService.reset();\n authService.authenticated.set(false);\n authService.userSession.set(undefined);\n router.navigate(['/login']);\n return throwError(() => error);\n }),\n catchError(() => {\n thinkingService.reset();\n authService.authenticated.set(false);\n authService.userSession.set(undefined);\n router.navigate(['/login']);\n return throwError(() => error);\n }),\n );\n }\n return throwError(() => error);\n }),\n );\n};\n","import { Directive, input } from '@angular/core';\nimport { AbstractControl, NG_VALIDATORS, ValidationErrors, Validator } from '@angular/forms';\n\n@Directive({\n selector: '[regexValidator]',\n providers: [{ provide: NG_VALIDATORS, useExisting: RegexValidatorDirective, multi: true }],\n})\nexport class RegexValidatorDirective implements Validator {\n regex = input(/^[A-Z0-9._%+-@!?]{4,64}$/i);\n\n validate(control: AbstractControl): ValidationErrors | null {\n if (!control.value || !this.regex().test(control.value)) {\n return { regexValidator: { value: control.value } };\n }\n return null;\n }\n}\n","/**\n * Shared types for the FAQ help system.\n *\n * Manifest is generated by the build-time validator (E9) and read at runtime\n * by FaqContentLoader (E1) and FaqService (E2).\n */\n\nexport type FaqAudience = 'public' | 'authenticated';\nexport type FaqRenderContext = 'modal' | 'page';\n\n/** Raw frontmatter as authored in the `.md` file. */\nexport interface FaqFrontmatter {\n title: string;\n category: string;\n order?: number;\n audience?: FaqAudience;\n 'image-prefix'?: string;\n description?: string;\n 'seo-ready'?: boolean;\n}\n\n/** One row in the generated manifest — normalized form of frontmatter + file path. */\nexport interface FaqEntry {\n /** Dot-notation key, e.g. \"trade.segments\". */\n key: string;\n title: string;\n category: string;\n order: number;\n audience: FaqAudience;\n description?: string;\n seoReady: boolean;\n imagePrefix?: string;\n /**\n * Path to the source file relative to `/assets/faq/`, without `.md`.\n * Example: `trade/segments` (subdirs allowed; key path-separator is `.`,\n * file path-separator is `/`).\n */\n file: string;\n}\n\nexport interface FaqManifest {\n /** ISO timestamp set by the validator at generation time. */\n generatedAt: string;\n entries: FaqEntry[];\n}\n\nexport interface ParsedFaq {\n frontmatter: FaqFrontmatter;\n body: string;\n}\n\nexport interface FaqRenderOptions {\n context: FaqRenderContext;\n /**\n * Optional override for the entry's `image-prefix` frontmatter.\n * When set, relative image hrefs are prefixed with this string.\n */\n imagePrefix?: string;\n}\n","import { InjectionToken } from '@angular/core';\nimport { FaqManifest } from './faq.types';\n\n/**\n * Pluggable content source for FAQ markdown + manifest.\n *\n * Default implementation is `HttpFaqContentLoader`, which fetches from\n * `/assets/faq/manifest.json` and `/assets/faq/<file>.md`. Consumer apps\n * may override (e.g. broken-stock-admin pulling from an internal source),\n * but most apps will just use the HTTP default.\n */\nexport interface FaqContentLoader {\n /** Loads (and may cache) the manifest. Idempotent. */\n loadManifest(): Promise<FaqManifest>;\n\n /**\n * Resolves the manifest entry for `key`, then loads its .md body.\n * Returns `null` when the key is not in the manifest.\n */\n loadContent(key: string): Promise<string | null>;\n}\n\nexport const FAQ_CONTENT_LOADER = new InjectionToken<FaqContentLoader>(\n 'FAQ_CONTENT_LOADER',\n);\n","import { Injectable } from '@angular/core';\nimport { Marked, Renderer } from 'marked';\nimport { gfmHeadingId } from 'marked-gfm-heading-id';\nimport fm from 'front-matter';\nimport { FaqFrontmatter, FaqRenderOptions, ParsedFaq } from './faq.types';\n\n/**\n * Stateless markdown renderer for FAQ content.\n *\n * Two responsibilities:\n * 1. Split a `.md` file into `{ frontmatter, body }` (front-matter parser).\n * 2. Render the body to HTML via marked with a context-aware link hook:\n * - `faq:<key>` — in-modal nav (modal) | `<a href=\"/help/<file>\">` (page)\n * - `app:/path` — close-modal-and-route (modal) | `<a href=\"/path\">` (page)\n * - `http(s)://...` — external, target=_blank rel=noopener (both)\n * - `#anchor` — intra-page scroll (both)\n *\n * In modal context, links are emitted with `data-faq-href` / `data-faq-kind`\n * sentinels so the modal's click handler (E5) can intercept and dispatch.\n * In page context, links are emitted as plain navigable anchors; the prerendered\n * static HTML can be clicked through directly.\n */\n@Injectable({ providedIn: 'root' })\nexport class FaqMarkdownRendererService {\n parse(raw: string): ParsedFaq {\n const parsed = fm<FaqFrontmatter>(raw);\n return {\n frontmatter: parsed.attributes,\n body: parsed.body,\n };\n }\n\n render(body: string, opts: FaqRenderOptions): string {\n const marked = new Marked({ gfm: true, breaks: false });\n marked.use(gfmHeadingId());\n marked.use({ renderer: this.buildRenderer(opts) });\n return marked.parse(body, { async: false }) as string;\n }\n\n private buildRenderer(opts: FaqRenderOptions): Partial<Renderer> {\n const { context, imagePrefix } = opts;\n return {\n link: ({ href, title, tokens }) => {\n // marked passes child tokens; we render their textual form ourselves.\n const text = tokens.map((t) => ('text' in t ? t.text : '')).join('');\n const titleAttr = title ? ` title=\"${escapeAttr(title)}\"` : '';\n\n // Intra-page anchor\n if (href.startsWith('#')) {\n return `<a href=\"${escapeAttr(href)}\"${titleAttr} data-faq-kind=\"anchor\">${text}</a>`;\n }\n\n // faq: protocol — in-modal nav (modal) | static link to /help/<key path> (page)\n if (href.startsWith('faq:')) {\n const key = href.slice('faq:'.length);\n if (context === 'modal') {\n return `<a href=\"#\" data-faq-href=\"${escapeAttr(href)}\" data-faq-kind=\"faq\">${text}</a>`;\n }\n const filePath = key.replace(/\\./g, '/');\n return `<a href=\"/help/${escapeAttr(filePath)}\"${titleAttr} data-faq-kind=\"faq\">${text}</a>`;\n }\n\n // app: protocol — close modal + route (modal) | normal anchor (page)\n if (href.startsWith('app:')) {\n const path = href.slice('app:'.length);\n if (context === 'modal') {\n return `<a href=\"#\" data-faq-href=\"${escapeAttr(href)}\" data-faq-kind=\"app\">${text} <span class=\"faq-app-arrow\" aria-hidden=\"true\">→</span></a>`;\n }\n return `<a href=\"${escapeAttr(path)}\"${titleAttr} data-faq-kind=\"app\">${text} <span class=\"faq-app-arrow\" aria-hidden=\"true\">→</span></a>`;\n }\n\n // External\n if (/^https?:\\/\\//i.test(href)) {\n return `<a href=\"${escapeAttr(href)}\"${titleAttr} target=\"_blank\" rel=\"noopener\" data-faq-kind=\"external\">${text}</a>`;\n }\n\n // Fallback: treat as relative; render plain anchor.\n return `<a href=\"${escapeAttr(href)}\"${titleAttr}>${text}</a>`;\n },\n image: ({ href, title, text }) => {\n const resolved = resolveImageHref(href, imagePrefix);\n const titleAttr = title ? ` title=\"${escapeAttr(title)}\"` : '';\n return `<img src=\"${escapeAttr(resolved)}\" alt=\"${escapeAttr(text)}\"${titleAttr} loading=\"lazy\" />`;\n },\n };\n }\n}\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<');\n}\n\nfunction resolveImageHref(href: string, prefix: string | undefined): string {\n if (!prefix) return href;\n if (/^([a-z]+:)?\\/\\//i.test(href) || href.startsWith('/')) return href;\n const cleaned = prefix.endsWith('/') ? prefix : `${prefix}/`;\n return `${cleaned}${href}`;\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { FaqContentLoader } from './faq-content-loader.token';\nimport { FaqEntry, FaqManifest } from './faq.types';\n\n/**\n * Default FaqContentLoader. Reads the build-generated manifest from\n * `/assets/faq/manifest.json` and lazy-fetches individual `.md` files\n * from `/assets/faq/<entry.file>.md`.\n *\n * Manifest is cached after first load; .md fetches are cached per key.\n */\n@Injectable({ providedIn: 'root' })\nexport class HttpFaqContentLoader implements FaqContentLoader {\n private readonly http = inject(HttpClient);\n private manifestPromise: Promise<FaqManifest> | null = null;\n private readonly contentCache = new Map<string, Promise<string | null>>();\n\n loadManifest(): Promise<FaqManifest> {\n if (!this.manifestPromise) {\n this.manifestPromise = firstValueFrom(\n this.http.get<FaqManifest>('/assets/faq/manifest.json'),\n ).catch((err) => {\n this.manifestPromise = null;\n throw err;\n });\n }\n return this.manifestPromise;\n }\n\n async loadContent(key: string): Promise<string | null> {\n const cached = this.contentCache.get(key);\n if (cached) return cached;\n\n const manifest = await this.loadManifest();\n const entry = manifest.entries.find((e: FaqEntry) => e.key === key);\n if (!entry) return null;\n\n const fetchPromise = firstValueFrom(\n this.http.get(`/assets/faq/${entry.file}.md`, { responseType: 'text' }),\n ).catch(() => null);\n this.contentCache.set(key, fetchPromise);\n return fetchPromise;\n }\n}\n","import { Injectable, signal } from '@angular/core';\n\n/**\n * E8 — In-modal navigation history.\n *\n * The browser's `history` API is shared by Angular Router and any other\n * code that calls `pushState`. We tag each FAQ entry's state object with\n * `faq: true` so we can distinguish our entries from router/app entries.\n *\n * On open: `pushState({faq:true, faqPosition:0})` once; stack=[initialKey].\n * On in-modal nav: truncate forward, push key, `pushState({faq:true,\n * faqPosition:position})`.\n * On browser back/forward (`popstate`):\n * - If next state has `faq:true` → set position to its `faqPosition`,\n * swap content for `stack[position]`.\n * - If next state lacks `faq:true` (user backed out of the modal entirely)\n * → close modal without further history manipulation.\n * On explicit close (close button / Esc / backdrop): `history.go(-(position+1))`\n * to unwind our entries; suppress in-flight popstates while unwinding;\n * finalize close once we've seen the expected number of popstates.\n */\n@Injectable({ providedIn: 'root' })\nexport class FaqHistoryService {\n private readonly _stack = signal<string[]>([]);\n private readonly _position = signal(0);\n readonly stack = this._stack.asReadonly();\n readonly position = this._position.asReadonly();\n\n /** True when popstate is processing the unwind kicked off by closeAndUnwind(). */\n private unwinding = false;\n private unwindRemaining = 0;\n private onUnwindComplete: (() => void) | null = null;\n\n private popstateListener: ((e: PopStateEvent) => void) | null = null;\n private onInModalNav: ((key: string) => void) | null = null;\n private onExitModal: (() => void) | null = null;\n\n /**\n * Begin a new FAQ history session. Pushes the initial state entry and\n * starts listening for popstate. Callbacks fire for in-modal navs and\n * for popping out of FAQ entirely.\n */\n begin(\n initialKey: string,\n onNav: (key: string) => void,\n onExit: () => void,\n ): void {\n this._stack.set([initialKey]);\n this._position.set(0);\n this.onInModalNav = onNav;\n this.onExitModal = onExit;\n this.pushHistoryState(0);\n this.attachListener();\n }\n\n /** Push a new key onto the stack. Truncates any forward history. */\n navigate(key: string): void {\n const stack = this._stack();\n const pos = this._position();\n const next = [...stack.slice(0, pos + 1), key];\n const nextPos = next.length - 1;\n this._stack.set(next);\n this._position.set(nextPos);\n this.pushHistoryState(nextPos);\n }\n\n canGoBack(): boolean {\n return this._position() > 0;\n }\n\n canGoForward(): boolean {\n return this._position() < this._stack().length - 1;\n }\n\n /** Programmatic back — triggers a real browser back so popstate handles UI. */\n back(): void {\n if (!this.canGoBack()) return;\n history.back();\n }\n\n forward(): void {\n if (!this.canGoForward()) return;\n history.forward();\n }\n\n /** Currently rendered key. */\n currentKey(): string | null {\n return this._stack()[this._position()] ?? null;\n }\n\n /**\n * Close the modal cleanly by unwinding our FAQ history entries so the\n * underlying app route is left exactly where it was before the modal opened.\n * `onComplete` fires after the unwind settles.\n */\n closeAndUnwind(onComplete: () => void): void {\n const depth = this._position() + 1;\n if (depth === 0) {\n this.teardown();\n onComplete();\n return;\n }\n this.unwinding = true;\n this.unwindRemaining = depth;\n this.onUnwindComplete = () => {\n this.teardown();\n onComplete();\n };\n history.go(-depth);\n }\n\n private teardown(): void {\n this._stack.set([]);\n this._position.set(0);\n this.detachListener();\n this.onInModalNav = null;\n this.onExitModal = null;\n this.unwinding = false;\n this.unwindRemaining = 0;\n this.onUnwindComplete = null;\n }\n\n private pushHistoryState(position: number): void {\n history.pushState({ faq: true, faqPosition: position }, '');\n }\n\n private attachListener(): void {\n if (this.popstateListener) return;\n this.popstateListener = (e: PopStateEvent) => this.handlePopState(e);\n window.addEventListener('popstate', this.popstateListener);\n }\n\n private detachListener(): void {\n if (!this.popstateListener) return;\n window.removeEventListener('popstate', this.popstateListener);\n this.popstateListener = null;\n }\n\n private handlePopState(e: PopStateEvent): void {\n if (this.unwinding) {\n this.unwindRemaining--;\n if (this.unwindRemaining <= 0) {\n const cb = this.onUnwindComplete;\n this.onUnwindComplete = null;\n cb?.();\n }\n return;\n }\n const state = e.state as { faq?: boolean; faqPosition?: number } | null;\n if (state?.faq && typeof state.faqPosition === 'number') {\n // In-modal back/forward\n const target = state.faqPosition;\n this._position.set(target);\n const key = this._stack()[target];\n if (key && this.onInModalNav) this.onInModalNav(key);\n return;\n }\n // User backed out beyond our entries — close modal, leave history alone.\n const exit = this.onExitModal;\n this.teardown();\n exit?.();\n }\n}\n","import { Injectable, computed, inject, signal } from '@angular/core';\nimport { AuthenticationService } from '../services/authentication.service';\nimport { FAQ_CONTENT_LOADER } from './faq-content-loader.token';\nimport { FaqHistoryService } from './faq-history.service';\nimport { FaqAudience, FaqEntry, FaqManifest } from './faq.types';\n\nexport interface FaqRegistrationHandle {\n /** Call from the component's destroy hook (or DestroyRef) to clear the registration. */\n deregister(): void;\n}\n\nexport interface FaqResolution {\n /** The key that produced a content match, or `null` when nothing matched. */\n key: string | null;\n /** Raw .md content for `key`, or `null` when nothing matched. */\n content: string | null;\n /** The entry whose content was returned, or `null` when nothing matched. */\n entry: FaqEntry | null;\n /**\n * The chain of keys actually attempted, in order\n * (e.g. `[\"trade.segments\", \"trade\", \"index\"]`).\n */\n attempted: string[];\n}\n\n/**\n * Central FAQ state + resolution service.\n *\n * Responsibilities:\n * - Track the current route's FAQ key (set by components on activation /\n * tab change via `register()`).\n * - Lazy-load and cache the FAQ manifest from the configured FaqContentLoader.\n * - Resolve a dot-notation key against the manifest with parent fallback,\n * audience filtering, and `index` as the terminal fallback.\n */\n@Injectable({ providedIn: 'root' })\nexport class FaqService {\n private readonly loader = inject(FAQ_CONTENT_LOADER);\n private readonly history = inject(FaqHistoryService);\n private readonly auth = inject(AuthenticationService);\n\n private readonly _currentFaqKey = signal<string | null>(null);\n /** Component-set current key. Bare `faq` opens at this key. */\n readonly currentFaqKey = this._currentFaqKey.asReadonly();\n\n private readonly _manifest = signal<FaqManifest | null>(null);\n readonly manifest = this._manifest.asReadonly();\n readonly entries = computed(() => this._manifest()?.entries ?? []);\n\n // Modal state (E3 + E8).\n private readonly _modalOpen = signal(false);\n readonly modalOpen = this._modalOpen.asReadonly();\n\n private readonly _activeEntry = signal<FaqEntry | null>(null);\n readonly activeEntry = this._activeEntry.asReadonly();\n\n private readonly _activeContent = signal<string | null>(null);\n readonly activeContent = this._activeContent.asReadonly();\n\n private readonly _activeAttempted = signal<string[]>([]);\n readonly activeAttempted = this._activeAttempted.asReadonly();\n\n private readonly _navigating = signal(false);\n readonly navigating = this._navigating.asReadonly();\n\n // Search pre-fill consumed by E4 search UI on modal open / navigateTo.\n private readonly _initialSearchTerm = signal<string | null>(null);\n readonly initialSearchTerm = this._initialSearchTerm.asReadonly();\n\n /** Called by the search UI once it has consumed the pre-fill term. */\n consumeInitialSearchTerm(): void {\n this._initialSearchTerm.set(null);\n }\n\n readonly canGoBack = computed(() => this.history.position() > 0);\n readonly canGoForward = computed(\n () => this.history.position() < this.history.stack().length - 1,\n );\n\n private manifestPromise: Promise<FaqManifest> | null = null;\n\n /**\n * Triggers manifest load if not already loaded. Idempotent. Subsequent\n * calls return the cached promise.\n */\n ensureManifest(): Promise<FaqManifest> {\n if (this._manifest()) return Promise.resolve(this._manifest()!);\n if (!this.manifestPromise) {\n this.manifestPromise = this.loader\n .loadManifest()\n .then((m) => {\n this._manifest.set(m);\n return m;\n })\n .catch((err) => {\n this.manifestPromise = null;\n throw err;\n });\n }\n return this.manifestPromise;\n }\n\n /**\n * Walks the dot-notation fallback chain (`a.b.c` → `a.b` → `a` → `index`)\n * and returns the first entry whose audience allows the caller and whose\n * content loads. Audience filtering: unauthenticated callers only see\n * `audience: public` entries.\n */\n async resolveKey(\n key: string | null,\n isAuthenticated: boolean,\n ): Promise<FaqResolution> {\n await this.ensureManifest();\n const entries = this.entries();\n const chain = buildFallbackChain(key);\n\n for (const candidate of chain) {\n const entry = entries.find((e) => e.key === candidate);\n if (!entry) continue;\n if (!audienceAllowed(entry.audience, isAuthenticated)) continue;\n const content = await this.loader.loadContent(entry.key);\n if (content === null) continue;\n return { key: entry.key, content, entry, attempted: chain };\n }\n\n return { key: null, content: null, entry: null, attempted: chain };\n }\n\n /**\n * Component registration. Sets `currentFaqKey`; on `deregister()` the\n * key is cleared only if it still matches (so a sibling tab activating\n * mid-teardown doesn't get its key clobbered).\n */\n register(key: string): FaqRegistrationHandle {\n this._currentFaqKey.set(key);\n return {\n deregister: () => {\n if (this._currentFaqKey() === key) this._currentFaqKey.set(null);\n },\n };\n }\n\n /**\n * E3 — Open the FAQ modal. If `initialKey` is omitted, falls back to\n * `currentFaqKey` and then to `'index'`. Resolves the key, loads content,\n * and starts an E8 history session so subsequent in-modal nav uses\n * `history.pushState`.\n */\n async openModal(\n initialKey?: string,\n opts?: { searchTerm?: string },\n ): Promise<void> {\n const searchTerm = opts?.searchTerm?.trim();\n this._initialSearchTerm.set(searchTerm && searchTerm.length > 0 ? searchTerm : null);\n if (this._modalOpen()) {\n // Already open — treat as a navigate-to instead.\n if (initialKey) await this.navigateTo(initialKey);\n return;\n }\n const target = initialKey ?? this._currentFaqKey() ?? 'index';\n this._modalOpen.set(true);\n await this.loadIntoActive(target);\n const resolved = this._activeEntry()?.key ?? target;\n this.history.begin(\n resolved,\n (key) => {\n // popstate-driven in-modal nav: load without pushing a new entry.\n void this.loadIntoActive(key);\n },\n () => {\n // User backed out of FAQ history entirely — close without unwinding.\n this.finalizeClose();\n },\n );\n }\n\n /**\n * Programmatic in-modal nav. Pushes a new history entry and loads `key`\n * into the active slot. Use this for click handlers on `faq:` links and\n * for the TOC sidebar.\n */\n async navigateTo(key: string): Promise<void> {\n if (!this._modalOpen()) {\n await this.openModal(key);\n return;\n }\n await this.loadIntoActive(key);\n const resolved = this._activeEntry()?.key ?? key;\n this.history.navigate(resolved);\n }\n\n back(): void {\n this.history.back();\n }\n forward(): void {\n this.history.forward();\n }\n\n /**\n * Close button / Esc / backdrop close. Unwinds the FAQ history entries\n * so the underlying app route is left untouched.\n */\n closeModal(): void {\n if (!this._modalOpen()) return;\n this.history.closeAndUnwind(() => this.finalizeClose());\n }\n\n private finalizeClose(): void {\n this._modalOpen.set(false);\n this._activeContent.set(null);\n this._activeEntry.set(null);\n this._activeAttempted.set([]);\n }\n\n private async loadIntoActive(key: string): Promise<void> {\n this._navigating.set(true);\n try {\n const resolution = await this.resolveKey(key, this.auth.authenticated());\n this._activeEntry.set(resolution.entry);\n this._activeContent.set(resolution.content);\n this._activeAttempted.set(resolution.attempted);\n } finally {\n this._navigating.set(false);\n }\n }\n}\n\nexport function buildFallbackChain(key: string | null): string[] {\n if (!key) return ['index'];\n const parts = key.split('.').filter(Boolean);\n if (parts.length === 0) return ['index'];\n const chain: string[] = [];\n for (let i = parts.length; i > 0; i--) {\n chain.push(parts.slice(0, i).join('.'));\n }\n chain.push('index');\n return chain;\n}\n\nexport function audienceAllowed(\n audience: FaqAudience,\n isAuthenticated: boolean,\n): boolean {\n if (audience === 'public') return true;\n return isAuthenticated;\n}\n","import { InjectionToken, isDevMode } from '@angular/core';\n\n/**\n * Gate for the dev-only FAQ authoring panel (E11).\n *\n * Defaults to Angular's `isDevMode()` so the panel auto-enables in `ng serve`\n * and auto-disables in production builds. Consumers can override with an\n * explicit value (e.g. `!environment.production`, or `true` for a staging\n * diagnostic build) via `{provide: FAQ_DEV_MODE, useValue: ...}`.\n *\n * The panel is loaded via dynamic `import()` and lives in its own lazy chunk;\n * builds where this resolves to `false` never request the chunk.\n */\nexport const FAQ_DEV_MODE = new InjectionToken<boolean>('FAQ_DEV_MODE', {\n providedIn: 'root',\n factory: () => isDevMode(),\n});\n\n/**\n * Optional absolute filesystem root of the consuming app's workspace (e.g.\n * `/Users/foo/dev/broken-stock`). When set, the authoring panel emits\n * `webstorm://open?file=<root>/<relative-path>` deeplinks pointing at the\n * exact source file. When unset, the panel falls back to a relative path.\n */\nexport const FAQ_DEV_WORKSPACE_ROOT = new InjectionToken<string>(\n 'FAQ_DEV_WORKSPACE_ROOT',\n { providedIn: 'root', factory: () => '' },\n);\n\n/**\n * Editor URL scheme for the \"Open in editor\" deeplink. Defaults to WebStorm.\n * Set to `'vscode'` (or any custom scheme handler) per consuming app.\n */\nexport type FaqDevEditor = 'webstorm' | 'vscode';\nexport const FAQ_DEV_EDITOR = new InjectionToken<FaqDevEditor>(\n 'FAQ_DEV_EDITOR',\n { providedIn: 'root', factory: () => 'webstorm' },\n);\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n ViewChild,\n computed,\n effect,\n inject,\n signal,\n untracked,\n} from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AuthenticationService } from '../../services/authentication.service';\nimport { FaqAuthoringPanel } from '../faq-authoring-panel/faq-authoring-panel';\nimport { FAQ_CONTENT_LOADER } from '../faq-content-loader.token';\nimport { FAQ_DEV_MODE } from '../faq-dev-mode.token';\nimport { FaqMarkdownRendererService } from '../faq-markdown-renderer.service';\nimport { FaqService } from '../faq.service';\nimport { FaqEntry } from '../faq.types';\n\ninterface TocGroup {\n category: string;\n entries: FaqEntry[];\n}\n\ninterface SearchResult {\n key: string;\n title: string;\n category: string;\n snippet: string;\n}\n\n// Minimal structural type so we don't depend on fuse.js types at parse time\n// (the package is dynamic-imported on first search activation).\ninterface FuseLike<T> {\n search(query: string): Array<{\n item: T;\n matches?: ReadonlyArray<{\n key?: string;\n indices: ReadonlyArray<readonly [number, number]>;\n }>;\n }>;\n}\n\ninterface SearchDoc {\n key: string;\n title: string;\n category: string;\n body: string;\n}\n\n/**\n * E3 — FAQ modal. Two-pane layout (TOC sidebar + content pane), 80% viewport.\n *\n * E4 — Search uses a lazy-imported `fuse.js` index over title + body,\n * built on first search activation, filtered by audience, cached for the\n * modal session and invalidated on auth state change.\n *\n * E5 — `app:` link clicks close the modal and route to the app path; the\n * returnUrl-aware `authGuard` funnels unauthenticated users through\n * `/login?returnUrl=...`, and `Login` honors returnUrl on success.\n */\n@Component({\n selector: 'faq-modal',\n standalone: true,\n imports: [FaqAuthoringPanel],\n templateUrl: './faq-modal.html',\n styleUrl: './faq-modal.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FaqModal {\n readonly devMode = inject(FAQ_DEV_MODE);\n\n private readonly faq = inject(FaqService);\n private readonly renderer = inject(FaqMarkdownRendererService);\n private readonly auth = inject(AuthenticationService);\n private readonly router = inject(Router);\n private readonly loader = inject(FAQ_CONTENT_LOADER);\n\n readonly open = this.faq.modalOpen;\n readonly navigating = this.faq.navigating;\n readonly activeEntry = this.faq.activeEntry;\n readonly attempted = this.faq.activeAttempted;\n readonly canGoBack = this.faq.canGoBack;\n readonly canGoForward = this.faq.canGoForward;\n\n readonly sidebarCollapsed = signal(false);\n readonly searchMode = signal(false);\n readonly searchQuery = signal('');\n readonly searchLoading = signal(false);\n readonly searchResults = signal<SearchResult[]>([]);\n\n private fuse: FuseLike<SearchDoc> | null = null;\n private fuseBuild: Promise<void> | null = null;\n\n readonly renderedHtml = computed(() => {\n const content = this.faq.activeContent();\n const entry = this.faq.activeEntry();\n if (!content) return '';\n return this.renderer.render(content, {\n context: 'modal',\n imagePrefix: entry?.imagePrefix,\n });\n });\n\n readonly toc = computed<TocGroup[]>(() => {\n const isAuth = this.auth.authenticated();\n const entries = this.faq.entries().filter((e) => {\n if (e.audience === 'public') return true;\n return isAuth;\n });\n const groups = new Map<string, FaqEntry[]>();\n for (const e of entries) {\n const list = groups.get(e.category) ?? [];\n list.push(e);\n groups.set(e.category, list);\n }\n return [...groups.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([category, list]) => ({\n category,\n entries: list.sort(\n (a, b) =>\n a.order - b.order || a.title.localeCompare(b.title),\n ),\n }));\n });\n\n @ViewChild('contentPane') contentPaneRef?: ElementRef<HTMLDivElement>;\n\n constructor() {\n // Scroll content pane to top on key change.\n effect(() => {\n this.activeEntry();\n queueMicrotask(() => {\n this.contentPaneRef?.nativeElement.scrollTo({ top: 0 });\n });\n });\n\n // Invalidate the search index on auth state change so the audience\n // filter is re-applied on next search activation.\n effect(() => {\n this.auth.authenticated();\n this.fuse = null;\n this.fuseBuild = null;\n if (this.searchMode()) this.searchResults.set([]);\n });\n\n // Consume `faq search <term>` pre-fill: when FaqService.initialSearchTerm\n // is non-null while the modal is open, switch to search mode with that\n // query and immediately invoke the index build.\n effect(() => {\n const term = this.faq.initialSearchTerm();\n if (!term || !this.faq.modalOpen()) return;\n untracked(() => {\n this.searchMode.set(true);\n this.searchQuery.set(term);\n this.faq.consumeInitialSearchTerm();\n void this.ensureSearchIndex().then(() => this.runSearch(term));\n });\n });\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.open()) this.close();\n }\n\n close(): void {\n this.faq.closeModal();\n }\n\n onBackdropClick(): void {\n this.close();\n }\n\n stopPropagation(event: Event): void {\n event.stopPropagation();\n }\n\n toggleSidebar(): void {\n this.sidebarCollapsed.update((v) => !v);\n }\n\n goBack(): void {\n this.faq.back();\n }\n\n goForward(): void {\n this.faq.forward();\n }\n\n goIndex(): void {\n void this.faq.navigateTo('index');\n }\n\n toggleSearch(): void {\n const next = !this.searchMode();\n this.searchMode.set(next);\n if (next) {\n void this.ensureSearchIndex().then(() => this.runSearch(this.searchQuery()));\n }\n }\n\n onSearchInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.searchQuery.set(value);\n void this.ensureSearchIndex().then(() => this.runSearch(value));\n }\n\n onSearchResultClick(key: string): void {\n void this.faq.navigateTo(key);\n }\n\n onTocClick(key: string): void {\n void this.faq.navigateTo(key);\n }\n\n private async ensureSearchIndex(): Promise<void> {\n if (this.fuse) return;\n if (this.fuseBuild) return this.fuseBuild;\n this.searchLoading.set(true);\n this.fuseBuild = (async () => {\n const [{ default: Fuse }] = await Promise.all([\n import('fuse.js'),\n this.faq.ensureManifest(),\n ]);\n const isAuth = this.auth.authenticated();\n const entries = this.faq.entries().filter((e) =>\n e.audience === 'public' ? true : isAuth,\n );\n const docs: SearchDoc[] = await Promise.all(\n entries.map(async (e) => {\n const body = (await this.loader.loadContent(e.key)) ?? '';\n return { key: e.key, title: e.title, category: e.category, body };\n }),\n );\n this.fuse = new Fuse(docs, {\n keys: [\n { name: 'title', weight: 0.6 },\n { name: 'body', weight: 0.4 },\n ],\n includeMatches: true,\n ignoreLocation: true,\n threshold: 0.4,\n minMatchCharLength: 2,\n }) as unknown as FuseLike<SearchDoc>;\n })()\n .catch((err) => {\n console.error('FAQ search index build failed', err);\n this.fuseBuild = null;\n })\n .finally(() => {\n this.searchLoading.set(false);\n });\n return this.fuseBuild;\n }\n\n private runSearch(query: string): void {\n const q = query.trim();\n if (!q || !this.fuse) {\n this.searchResults.set([]);\n return;\n }\n const hits = this.fuse.search(q).slice(0, 30);\n this.searchResults.set(\n hits.map((h) => ({\n key: h.item.key,\n title: h.item.title,\n category: h.item.category,\n snippet: buildSnippet(h.item.body, h.matches),\n })),\n );\n }\n\n /**\n * Event-delegated click handler for the rendered content pane.\n * Intercepts our sentinel anchors emitted by FaqMarkdownRendererService.\n */\n onContentClick(event: MouseEvent): void {\n const target = event.target;\n if (!(target instanceof HTMLElement)) return;\n const anchor = target.closest<HTMLAnchorElement>('a[data-faq-kind]');\n if (!anchor) return;\n const kind = anchor.getAttribute('data-faq-kind');\n\n if (kind === 'external') {\n return;\n }\n\n if (kind === 'anchor') {\n event.preventDefault();\n const href = anchor.getAttribute('href') ?? '';\n const id = href.startsWith('#') ? href.slice(1) : href;\n if (!id) return;\n const pane = this.contentPaneRef?.nativeElement;\n const el = pane?.querySelector(`#${CSS.escape(id)}`);\n el?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n return;\n }\n\n const faqHref = anchor.getAttribute('data-faq-href') ?? '';\n\n if (kind === 'faq' && faqHref.startsWith('faq:')) {\n event.preventDefault();\n const key = faqHref.slice('faq:'.length);\n void this.faq.navigateTo(key);\n return;\n }\n\n if (kind === 'app' && faqHref.startsWith('app:')) {\n event.preventDefault();\n const path = faqHref.slice('app:'.length);\n this.close();\n // Defer route until after modal close finishes unwinding history,\n // so navigation lands as a fresh entry on top of the pre-modal URL.\n // The returnUrl-aware authGuard handles unauthenticated callers by\n // redirecting to /login?returnUrl=<path>; Login honors it on success.\n queueMicrotask(() => {\n void this.router.navigateByUrl(path);\n });\n return;\n }\n }\n}\n\n/**\n * Builds a short contextual snippet around the first body match. Falls back\n * to the head of the body when the only matches are in the title.\n */\nfunction buildSnippet(\n body: string,\n matches:\n | ReadonlyArray<{\n key?: string;\n indices: ReadonlyArray<readonly [number, number]>;\n }>\n | undefined,\n): string {\n const RADIUS = 60;\n const MAX = 180;\n const bodyMatch = matches?.find((m) => m.key === 'body' && m.indices.length);\n if (!bodyMatch) {\n return body.replace(/\\s+/g, ' ').slice(0, MAX).trim();\n }\n const [start, end] = bodyMatch.indices[0];\n const from = Math.max(0, start - RADIUS);\n const to = Math.min(body.length, end + RADIUS);\n let snippet = body.slice(from, to).replace(/\\s+/g, ' ').trim();\n if (from > 0) snippet = '…' + snippet;\n if (to < body.length) snippet = snippet + '…';\n return snippet.length > MAX ? snippet.slice(0, MAX) + '…' : snippet;\n}\n","@if (open()) {\n <div class=\"faq-backdrop\" (click)=\"onBackdropClick()\" role=\"presentation\">\n <div\n class=\"faq-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"activeEntry()?.title ?? 'FAQ'\"\n (click)=\"stopPropagation($event)\"\n >\n <header class=\"faq-toolbar\">\n <div class=\"faq-toolbar-nav\">\n <button\n type=\"button\"\n class=\"faq-icon-btn\"\n (click)=\"toggleSidebar()\"\n [attr.aria-label]=\"sidebarCollapsed() ? 'Show contents' : 'Hide contents'\"\n [attr.aria-pressed]=\"!sidebarCollapsed()\"\n >☰</button>\n <button\n type=\"button\"\n class=\"faq-icon-btn\"\n (click)=\"goBack()\"\n [disabled]=\"!canGoBack()\"\n aria-label=\"Back\"\n >‹</button>\n <button\n type=\"button\"\n class=\"faq-icon-btn\"\n (click)=\"goForward()\"\n [disabled]=\"!canGoForward()\"\n aria-label=\"Forward\"\n >›</button>\n <button\n type=\"button\"\n class=\"faq-icon-btn\"\n (click)=\"goIndex()\"\n aria-label=\"Index\"\n >⌂</button>\n </div>\n <div class=\"faq-toolbar-title\">\n @if (activeEntry(); as entry) {\n <span class=\"faq-category\">{{ entry.category }}</span>\n <span class=\"faq-sep\">/</span>\n <span class=\"faq-title\">{{ entry.title }}</span>\n } @else {\n <span class=\"faq-title\">FAQ</span>\n }\n </div>\n <div class=\"faq-toolbar-actions\">\n <button\n type=\"button\"\n class=\"faq-icon-btn\"\n (click)=\"toggleSearch()\"\n [class.active]=\"searchMode()\"\n aria-label=\"Search\"\n >⌕</button>\n <button\n type=\"button\"\n class=\"faq-icon-btn faq-close-btn\"\n (click)=\"close()\"\n aria-label=\"Close\"\n >✕</button>\n </div>\n </header>\n\n <div class=\"faq-body\" [class.sidebar-collapsed]=\"sidebarCollapsed()\">\n <aside class=\"faq-sidebar\" aria-label=\"FAQ contents\">\n @if (searchMode()) {\n <div class=\"faq-search\">\n <input\n type=\"search\"\n class=\"faq-search-input\"\n placeholder=\"Search FAQ…\"\n aria-label=\"Search FAQ\"\n [value]=\"searchQuery()\"\n (input)=\"onSearchInput($event)\"\n />\n @if (searchLoading()) {\n <p class=\"faq-search-status\">Building index…</p>\n } @else if (!searchQuery().trim()) {\n <p class=\"faq-search-status\">Type to search titles and content.</p>\n } @else if (searchResults().length === 0) {\n <p class=\"faq-search-status\">No matches.</p>\n } @else {\n <ul class=\"faq-search-results\">\n @for (r of searchResults(); track r.key) {\n <li>\n <button\n type=\"button\"\n class=\"faq-search-result\"\n [class.active]=\"activeEntry()?.key === r.key\"\n (click)=\"onSearchResultClick(r.key)\"\n >\n <span class=\"faq-search-result-title\">{{ r.title }}</span>\n <span class=\"faq-search-result-category\">{{ r.category }}</span>\n @if (r.snippet) {\n <span class=\"faq-search-result-snippet\">{{ r.snippet }}</span>\n }\n </button>\n </li>\n }\n </ul>\n }\n </div>\n } @else {\n <nav class=\"faq-toc\">\n @for (group of toc(); track group.category) {\n <div class=\"faq-toc-group\">\n <h3 class=\"faq-toc-category\">{{ group.category }}</h3>\n <ul>\n @for (entry of group.entries; track entry.key) {\n <li>\n <button\n type=\"button\"\n class=\"faq-toc-link\"\n [class.active]=\"activeEntry()?.key === entry.key\"\n (click)=\"onTocClick(entry.key)\"\n >{{ entry.title }}</button>\n </li>\n }\n </ul>\n </div>\n } @empty {\n <p class=\"faq-toc-empty\">No FAQ entries yet.</p>\n }\n </nav>\n }\n </aside>\n\n <main\n #contentPane\n class=\"faq-content\"\n (click)=\"onContentClick($event)\"\n >\n @if (navigating()) {\n <div class=\"faq-loading\">Loading…</div>\n } @else if (renderedHtml(); as html) {\n <article class=\"faq-article\" [innerHTML]=\"html\"></article>\n @if (devMode && activeEntry(); as entry) {\n @defer (when devMode) {\n <faq-authoring-panel\n mode=\"existing\"\n [key]=\"entry.key\"\n [attempted]=\"attempted()\"\n [entry]=\"entry\"\n />\n }\n }\n } @else {\n <div class=\"faq-empty\">\n <h2>No FAQ available</h2>\n <p>No content is registered for this route.</p>\n @if (attempted().length) {\n <p class=\"faq-empty-chain\">\n Attempted keys:\n <code>{{ attempted().join(' → ') }}</code>\n </p>\n }\n @if (devMode && attempted().length) {\n @defer (when devMode) {\n <faq-authoring-panel\n mode=\"missing\"\n [key]=\"attempted()[0]\"\n [attempted]=\"attempted()\"\n />\n } @loading (minimum 100ms) {\n <p class=\"faq-empty-hint\">Loading authoring panel…</p>\n }\n }\n </div>\n }\n </main>\n </div>\n </div>\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport {\n FAQ_DEV_EDITOR,\n FAQ_DEV_WORKSPACE_ROOT,\n FaqDevEditor,\n} from '../faq-dev-mode.token';\nimport { FaqService } from '../faq.service';\nimport { FaqEntry } from '../faq.types';\n\n/**\n * E11 — Dev-only FAQ authoring panel.\n *\n * Two modes, both dynamic-imported by `FaqModal` and gated behind\n * `FAQ_DEV_MODE`:\n * - `missing`: full scaffold panel rendered when no FAQ resolved.\n * - `existing`: collapsed source strip rendered below the article when an\n * entry IS resolved.\n *\n * The panel never imports `environment.*` directly — gating is the modal's\n * responsibility (via the FAQ_DEV_MODE token + dynamic import).\n */\n@Component({\n selector: 'faq-authoring-panel',\n standalone: true,\n imports: [NgClass],\n templateUrl: './faq-authoring-panel.html',\n styleUrl: './faq-authoring-panel.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FaqAuthoringPanel {\n private readonly faq = inject(FaqService);\n private readonly workspaceRoot = inject(FAQ_DEV_WORKSPACE_ROOT);\n private readonly editor: FaqDevEditor = inject(FAQ_DEV_EDITOR);\n\n /** `'missing'` shows the full scaffold; `'existing'` shows the collapsed strip. */\n readonly mode = input.required<'missing' | 'existing'>();\n /**\n * The dot-notation key actually being authored. For `missing` mode this is\n * the deepest attempted key (chain[0]); for `existing` it's the resolved key.\n */\n readonly key = input.required<string>();\n /** Fallback chain that was attempted. For `missing` every entry is missing. */\n readonly attempted = input<string[]>([]);\n /** Resolved entry — only set in `existing` mode. */\n readonly entry = input<FaqEntry | null>(null);\n\n readonly expanded = signal(false);\n readonly showAllFiles = signal(false);\n readonly copyState = signal<string | null>(null);\n\n readonly relPath = computed(() => {\n const e = this.entry();\n if (e) return `src/assets/faq/${e.file}.md`;\n return `src/assets/faq/${keyToFilePath(this.key())}.md`;\n });\n\n readonly absPath = computed(() => {\n const rel = this.relPath();\n return this.workspaceRoot ? joinPosix(this.workspaceRoot, rel) : rel;\n });\n\n readonly editorHref = computed(() => {\n const abs = this.absPath();\n if (this.editor === 'vscode') return `vscode://file/${abs}`;\n return `webstorm://open?file=${encodeURI(abs)}`;\n });\n\n readonly editorLabel = computed(() =>\n this.editor === 'vscode' ? 'Open in VS Code' : 'Open in WebStorm',\n );\n\n readonly scaffoldCmd = computed(() => `npm run faq:new -- ${this.key()}`);\n\n readonly frontmatterScaffold = computed(() => {\n const k = this.key();\n const title = humanize(k);\n const category = humanize(k.split('.')[0]);\n return [\n '---',\n `title: \"${title}\"`,\n `category: \"${category}\"`,\n 'audience: authenticated',\n 'seo-ready: false',\n 'description: \"\"',\n '---',\n '',\n `# ${title}`,\n '',\n `TODO: write content for \"${title}\".`,\n '',\n ].join('\\n');\n });\n\n readonly allEntries = computed(() => this.faq.entries());\n\n readonly missedChain = computed(() => {\n const present = new Set(this.allEntries().map((e) => e.key));\n return this.attempted().map((k) => ({ key: k, present: present.has(k) }));\n });\n\n toggleExpanded(): void {\n this.expanded.update((v) => !v);\n }\n\n toggleAllFiles(): void {\n this.showAllFiles.update((v) => !v);\n }\n\n async copy(text: string, label: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text);\n this.copyState.set(label);\n setTimeout(() => {\n if (this.copyState() === label) this.copyState.set(null);\n }, 1500);\n } catch {\n this.copyState.set(`${label}:err`);\n }\n }\n}\n\nfunction keyToFilePath(key: string): string {\n return key.split('.').join('/');\n}\n\nfunction humanize(s: string): string {\n return s\n .split(/[.\\-_/]/)\n .filter(Boolean)\n .map((seg) => seg.charAt(0).toUpperCase() + seg.slice(1))\n .join(' ');\n}\n\nfunction joinPosix(a: string, b: string): string {\n const left = a.endsWith('/') ? a.slice(0, -1) : a;\n const right = b.startsWith('/') ? b.slice(1) : b;\n return `${left}/${right}`;\n}\n","@if (mode() === 'missing') {\n <section class=\"faq-authoring missing\" aria-label=\"FAQ authoring panel\">\n <header class=\"faq-authoring-header\">\n <span class=\"faq-authoring-tag\">[dev]</span>\n <h3>Start authoring this FAQ</h3>\n </header>\n\n <dl class=\"faq-authoring-meta\">\n <dt>Key</dt>\n <dd><code>{{ key() }}</code></dd>\n\n <dt>Fallback chain</dt>\n <dd>\n <ul class=\"faq-authoring-chain\">\n @for (step of missedChain(); track step.key) {\n <li [ngClass]=\"step.present ? 'present' : 'missed'\">\n <span class=\"mark\">{{ step.present ? '✓' : '✗' }}</span>\n <code>{{ step.key }}</code>\n </li>\n }\n </ul>\n </dd>\n\n <dt>Target file</dt>\n <dd>\n <code>{{ relPath() }}</code>\n <a\n class=\"faq-authoring-editor\"\n [href]=\"editorHref()\"\n >{{ editorLabel() }} ↗</a>\n </dd>\n </dl>\n\n <div class=\"faq-authoring-block\">\n <div class=\"faq-authoring-block-head\">\n <span>Scaffold via CLI</span>\n <button type=\"button\" (click)=\"copy(scaffoldCmd(), 'cmd')\">\n {{ copyState() === 'cmd' ? 'Copied ✓' : 'Copy' }}\n </button>\n </div>\n <pre><code>{{ scaffoldCmd() }}</code></pre>\n </div>\n\n <div class=\"faq-authoring-block\">\n <div class=\"faq-authoring-block-head\">\n <span>Frontmatter scaffold</span>\n <button type=\"button\" (click)=\"copy(frontmatterScaffold(), 'fm')\">\n {{ copyState() === 'fm' ? 'Copied ✓' : 'Copy' }}\n </button>\n </div>\n <pre><code>{{ frontmatterScaffold() }}</code></pre>\n </div>\n\n <details class=\"faq-authoring-cheat\">\n <summary>Link syntax cheat sheet</summary>\n <ul>\n <li><code>[label](faq:trade.segments)</code> — in-modal nav</li>\n <li><code>[label](app:/settings)</code> — navigates the app (modal closes)</li>\n <li><code>[label](https://example.com)</code> — external (new tab)</li>\n <li><code>[label](#section-id)</code> — intra-page anchor</li>\n <li><code></code> — image (drop into <code>src/assets/faq/images/</code>)</li>\n </ul>\n </details>\n\n <details class=\"faq-authoring-all\" [open]=\"showAllFiles()\">\n <summary (click)=\"toggleAllFiles(); $event.preventDefault()\">\n Show all FAQ files ({{ allEntries().length }})\n </summary>\n <ul class=\"faq-authoring-file-list\">\n @for (e of allEntries(); track e.key) {\n <li>\n <code>{{ e.key }}</code>\n <span class=\"faq-authoring-file-path\">src/assets/faq/{{ e.file }}.md</span>\n </li>\n } @empty {\n <li class=\"empty\">Manifest is empty.</li>\n }\n </ul>\n </details>\n </section>\n} @else {\n <aside class=\"faq-authoring existing\" aria-label=\"FAQ source info\">\n <div class=\"faq-authoring-strip\">\n <span class=\"faq-authoring-tag\">[dev]</span>\n <span>Key: <code>{{ key() }}</code></span>\n <span class=\"sep\">•</span>\n <span>Source: <code>{{ relPath() }}</code></span>\n <a class=\"faq-authoring-editor\" [href]=\"editorHref()\">{{ editorLabel() }} ↗</a>\n <button type=\"button\" class=\"faq-authoring-more\" (click)=\"toggleExpanded()\">\n {{ expanded() ? '▲ Less' : '▼ More' }}\n </button>\n </div>\n @if (expanded()) {\n <div class=\"faq-authoring-expanded\">\n <div>\n <strong>Fallback chain attempted:</strong>\n <ul class=\"faq-authoring-chain inline\">\n @for (step of missedChain(); track step.key) {\n <li [ngClass]=\"step.present ? 'present' : 'missed'\">\n <span class=\"mark\">{{ step.present ? '✓' : '✗' }}</span>\n <code>{{ step.key }}</code>\n </li>\n }\n </ul>\n </div>\n <details class=\"faq-authoring-cheat\" open>\n <summary>Link syntax cheat sheet</summary>\n <ul>\n <li><code>[label](faq:trade.segments)</code> — in-modal nav</li>\n <li><code>[label](app:/settings)</code> — navigates the app</li>\n <li><code>[label](https://example.com)</code> — external</li>\n <li><code>[label](#section-id)</code> — intra-page anchor</li>\n <li><code></code> — image</li>\n </ul>\n </details>\n <div class=\"faq-authoring-rescaffold\">\n <span>Re-scaffold (overwrites if you delete first):</span>\n <code>{{ scaffoldCmd() }}</code>\n <button type=\"button\" (click)=\"copy(scaffoldCmd(), 'cmd')\">\n {{ copyState() === 'cmd' ? 'Copied ✓' : 'Copy' }}\n </button>\n </div>\n </div>\n }\n </aside>\n}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Canonical public base URL (no trailing slash) used for OpenGraph,\n * Twitter, JSON-LD canonical URLs, and sitemap entries on the\n * public FAQ pages. Default empty string — falls back to relative\n * `og:url` etc. when unset, which is fine for previewing but\n * suboptimal for production SEO. Consumer apps should override.\n */\nexport const FAQ_PUBLIC_SITE_BASE_URL = new InjectionToken<string>(\n 'FAQ_PUBLIC_SITE_BASE_URL',\n { providedIn: 'root', factory: () => '' },\n);\n\n/**\n * Publisher / author Organization embedded in schema.org JSON-LD on\n * public FAQ pages. `logo` is optional — Google's validator warns but\n * does not error when omitted. Add it later via a one-line provider\n * override.\n */\nexport interface FaqPublicPublisher {\n name: string;\n url?: string;\n logo?: string;\n}\n\nexport const FAQ_PUBLIC_PUBLISHER = new InjectionToken<FaqPublicPublisher>(\n 'FAQ_PUBLIC_PUBLISHER',\n { providedIn: 'root', factory: () => ({ name: '' }) },\n);\n","import { CommonModule } from '@angular/common';\nimport { Component, OnInit, computed, inject, signal } from '@angular/core';\nimport { Meta, Title } from '@angular/platform-browser';\nimport { RouterLink } from '@angular/router';\nimport { FAQ_CONTENT_LOADER } from '../faq-content-loader.token';\nimport {\n FAQ_PUBLIC_PUBLISHER,\n FAQ_PUBLIC_SITE_BASE_URL,\n} from '../faq-seo.tokens';\nimport { FaqEntry } from '../faq.types';\n\ninterface CategoryGroup {\n category: string;\n entries: FaqEntry[];\n}\n\n/**\n * Public, SEO-targeted FAQ index. Prerendered at build time on the\n * consumer side (e.g. /help in broken-stock). Lists every manifest\n * entry where `audience === 'public' && seoReady === true`, grouped\n * by category and ordered by `order`.\n *\n * SEO (E17): sets <title>, meta description, OG, and Twitter tags.\n * JSON-LD (E18): emits a schema.org CollectionPage referencing\n * each child entry as an ItemList.\n */\n@Component({\n selector: 'public-faq-index',\n standalone: true,\n imports: [CommonModule, RouterLink],\n template: `\n <article class=\"public-faq-index\">\n <header>\n <h1>Brokenstock Help</h1>\n <p class=\"lead\">Documentation and walkthroughs for the Brokenstock trade-journal platform.</p>\n </header>\n @if (loading()) {\n <p>Loading…</p>\n } @else if (groups().length === 0) {\n <p>No help pages are published yet.</p>\n } @else {\n @for (group of groups(); track group.category) {\n <section>\n <h2>{{ group.category }}</h2>\n <ul>\n @for (entry of group.entries; track entry.key) {\n <li>\n <a [routerLink]=\"['/help', entry.file]\">{{ entry.title }}</a>\n @if (entry.description) {\n <span class=\"desc\"> — {{ entry.description }}</span>\n }\n </li>\n }\n </ul>\n </section>\n }\n }\n @if (jsonLd(); as ld) {\n <script type=\"application/ld+json\">{{ ld }}</script>\n }\n </article>\n `,\n styles: [`\n :host { display: block; }\n .public-faq-index {\n max-width: 860px;\n margin: 0 auto;\n padding: 2rem 1.25rem 4rem;\n font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif;\n line-height: 1.55;\n }\n header h1 { font-size: 2.25rem; margin: 0 0 0.5rem; }\n .lead { color: #555; margin: 0 0 2rem; font-size: 1.1rem; }\n h2 { font-size: 1.35rem; margin: 1.75rem 0 0.5rem; border-bottom: 1px solid #eee; padding-bottom: 0.25rem; }\n ul { list-style: none; padding: 0; margin: 0; }\n li { padding: 0.4rem 0; }\n a { color: #1565c0; text-decoration: none; font-weight: 500; }\n a:hover { text-decoration: underline; }\n .desc { color: #666; font-weight: 400; }\n `],\n})\nexport class PublicFaqIndex implements OnInit {\n private readonly loader = inject(FAQ_CONTENT_LOADER);\n private readonly title = inject(Title);\n private readonly meta = inject(Meta);\n private readonly siteBase = inject(FAQ_PUBLIC_SITE_BASE_URL);\n private readonly publisher = inject(FAQ_PUBLIC_PUBLISHER);\n\n private readonly _entries = signal<FaqEntry[]>([]);\n readonly loading = signal(true);\n\n readonly visibleEntries = computed(() =>\n this._entries().filter((e) => e.audience === 'public' && e.seoReady),\n );\n\n readonly groups = computed<CategoryGroup[]>(() => {\n const visible = this.visibleEntries();\n const byCategory = new Map<string, FaqEntry[]>();\n for (const entry of visible) {\n const list = byCategory.get(entry.category) ?? [];\n list.push(entry);\n byCategory.set(entry.category, list);\n }\n const groups: CategoryGroup[] = [];\n for (const [category, entries] of byCategory) {\n entries.sort((a, b) => a.order - b.order || a.title.localeCompare(b.title));\n groups.push({ category, entries });\n }\n groups.sort((a, b) => a.category.localeCompare(b.category));\n return groups;\n });\n\n readonly jsonLd = computed<string | null>(() => {\n const entries = this.visibleEntries();\n if (entries.length === 0) return null;\n const base = this.siteBase.replace(/\\/+$/, '');\n const indexUrl = `${base}/help`;\n const ld: Record<string, unknown> = {\n '@context': 'https://schema.org',\n '@type': 'CollectionPage',\n name: 'Brokenstock Help',\n url: indexUrl,\n mainEntity: {\n '@type': 'ItemList',\n itemListElement: entries.map((entry, idx) => ({\n '@type': 'ListItem',\n position: idx + 1,\n url: `${base}/help/${entry.file}`,\n name: entry.title,\n })),\n },\n };\n if (this.publisher.name) {\n const pub: Record<string, unknown> = {\n '@type': 'Organization',\n name: this.publisher.name,\n };\n if (this.publisher.url) pub['url'] = this.publisher.url;\n if (this.publisher.logo) pub['logo'] = this.publisher.logo;\n ld['publisher'] = pub;\n }\n return serializeJsonLd(ld);\n });\n\n async ngOnInit(): Promise<void> {\n try {\n const manifest = await this.loader.loadManifest();\n this._entries.set(manifest.entries);\n this.applyMeta();\n } finally {\n this.loading.set(false);\n }\n }\n\n private applyMeta(): void {\n const base = this.siteBase.replace(/\\/+$/, '');\n const url = `${base}/help`;\n const description =\n 'Documentation and walkthroughs for the Brokenstock trade-journal platform.';\n this.title.setTitle('Help — Brokenstock');\n this.meta.updateTag({ name: 'description', content: description });\n this.meta.updateTag({ property: 'og:type', content: 'website' });\n this.meta.updateTag({ property: 'og:title', content: 'Help — Brokenstock' });\n this.meta.updateTag({ property: 'og:description', content: description });\n this.meta.updateTag({ property: 'og:url', content: url });\n if (this.publisher.name) {\n this.meta.updateTag({ property: 'og:site_name', content: this.publisher.name });\n }\n this.meta.updateTag({ name: 'twitter:card', content: 'summary' });\n this.meta.updateTag({ name: 'twitter:title', content: 'Help — Brokenstock' });\n this.meta.updateTag({ name: 'twitter:description', content: description });\n }\n}\n\nfunction serializeJsonLd(obj: unknown): string {\n return JSON.stringify(obj).replace(/</g, '\\\\u003c');\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, OnInit, computed, inject, signal } from '@angular/core';\nimport { Meta, Title } from '@angular/platform-browser';\nimport { ActivatedRoute, RouterLink } from '@angular/router';\nimport { FAQ_CONTENT_LOADER } from '../faq-content-loader.token';\nimport { FaqMarkdownRendererService } from '../faq-markdown-renderer.service';\nimport {\n FAQ_PUBLIC_PUBLISHER,\n FAQ_PUBLIC_SITE_BASE_URL,\n} from '../faq-seo.tokens';\nimport { FaqEntry } from '../faq.types';\n\n/**\n * Public, SEO-targeted FAQ page. Prerendered at build time per\n * qualifying manifest entry (e.g. /help/landing, /help/trade/segments).\n *\n * The route is `help/**` so multi-segment file paths work; this\n * component reads the wildcard path off `ActivatedRoute.url`.\n *\n * SEO (E17): sets <title>, meta description, OpenGraph and Twitter\n * Card tags using Angular's Title + Meta services (SSR-compatible).\n * JSON-LD (E18): emits a schema.org Article (or BlogPosting) object\n * via an inline <script type=\"application/ld+json\"> element. The\n * raw JSON has `<` escaped to `<` so a stray `</script>` inside\n * data won't break the surrounding tag.\n */\n@Component({\n selector: 'public-faq-page',\n standalone: true,\n imports: [CommonModule, RouterLink],\n template: `\n <article class=\"public-faq-page\">\n <nav class=\"crumbs\">\n <a routerLink=\"/help\">← Help</a>\n </nav>\n @if (loading()) {\n <p>Loading…</p>\n } @else if (!entry()) {\n <header>\n <h1>Page not found</h1>\n <p>That help page doesn't exist or isn't published. Try the <a routerLink=\"/help\">help index</a>.</p>\n </header>\n } @else {\n <header>\n <h1>{{ entry()!.title }}</h1>\n @if (entry()!.description) {\n <p class=\"lead\">{{ entry()!.description }}</p>\n }\n </header>\n <div class=\"body\" [innerHTML]=\"renderedHtml()\"></div>\n @if (jsonLd(); as ld) {\n <script type=\"application/ld+json\">{{ ld }}</script>\n }\n }\n </article>\n `,\n styles: [`\n :host { display: block; }\n .public-faq-page {\n max-width: 860px;\n margin: 0 auto;\n padding: 2rem 1.25rem 4rem;\n font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif;\n line-height: 1.6;\n }\n .crumbs { margin-bottom: 1.5rem; font-size: 0.9rem; }\n .crumbs a { color: #1565c0; text-decoration: none; }\n .crumbs a:hover { text-decoration: underline; }\n header h1 { font-size: 2.1rem; margin: 0 0 0.5rem; }\n .lead { color: #555; font-size: 1.1rem; margin: 0 0 1.5rem; }\n .body :is(h1, h2, h3, h4) { margin-top: 2rem; }\n .body a { color: #1565c0; }\n .body img { max-width: 100%; height: auto; }\n .body pre { background: #f6f8fa; padding: 0.75rem 1rem; border-radius: 6px; overflow-x: auto; }\n .body code { background: #f6f8fa; padding: 0.1rem 0.3rem; border-radius: 3px; font-size: 0.9em; }\n .body pre code { background: transparent; padding: 0; }\n `],\n})\nexport class PublicFaqPage implements OnInit {\n private readonly route = inject(ActivatedRoute);\n private readonly loader = inject(FAQ_CONTENT_LOADER);\n private readonly renderer = inject(FaqMarkdownRendererService);\n private readonly title = inject(Title);\n private readonly meta = inject(Meta);\n private readonly siteBase = inject(FAQ_PUBLIC_SITE_BASE_URL);\n private readonly publisher = inject(FAQ_PUBLIC_PUBLISHER);\n\n readonly entry = signal<FaqEntry | null>(null);\n readonly body = signal<string>('');\n readonly loading = signal(true);\n\n readonly renderedHtml = computed(() => {\n const entry = this.entry();\n const body = this.body();\n if (!entry || !body) return '';\n return this.renderer.render(body, {\n context: 'page',\n imagePrefix: entry.imagePrefix\n ? `/assets/faq/${entry.imagePrefix}`\n : undefined,\n });\n });\n\n readonly jsonLd = computed<string | null>(() => {\n const entry = this.entry();\n if (!entry) return null;\n const url = this.canonicalUrl(entry);\n const ld: Record<string, unknown> = {\n '@context': 'https://schema.org',\n '@type': 'Article',\n headline: entry.title,\n url,\n mainEntityOfPage: url,\n };\n if (entry.description) ld['description'] = entry.description;\n if (this.publisher.name) {\n const pub: Record<string, unknown> = {\n '@type': 'Organization',\n name: this.publisher.name,\n };\n if (this.publisher.url) pub['url'] = this.publisher.url;\n if (this.publisher.logo) pub['logo'] = this.publisher.logo;\n ld['publisher'] = pub;\n ld['author'] = pub;\n }\n return serializeJsonLd(ld);\n });\n\n async ngOnInit(): Promise<void> {\n try {\n const segments = this.route.snapshot.url.map((s) => s.path);\n const filePath = segments.join('/');\n if (!filePath) {\n this.applyNotFoundMeta();\n return;\n }\n const manifest = await this.loader.loadManifest();\n const match = manifest.entries.find(\n (e) => e.file === filePath && e.audience === 'public' && e.seoReady,\n );\n if (!match) {\n this.applyNotFoundMeta();\n return;\n }\n const content = await this.loader.loadContent(match.key);\n if (content === null) {\n this.applyNotFoundMeta();\n return;\n }\n const parsed = this.renderer.parse(content);\n this.entry.set(match);\n this.body.set(parsed.body);\n this.applyMeta(match);\n } finally {\n this.loading.set(false);\n }\n }\n\n private applyMeta(entry: FaqEntry): void {\n const url = this.canonicalUrl(entry);\n const description = entry.description ?? '';\n const title = `${entry.title} — Help`;\n this.title.setTitle(title);\n this.meta.updateTag({ name: 'description', content: description });\n this.meta.updateTag({ property: 'og:type', content: 'article' });\n this.meta.updateTag({ property: 'og:title', content: entry.title });\n this.meta.updateTag({ property: 'og:description', content: description });\n this.meta.updateTag({ property: 'og:url', content: url });\n if (this.publisher.name) {\n this.meta.updateTag({ property: 'og:site_name', content: this.publisher.name });\n }\n this.meta.updateTag({ name: 'twitter:card', content: 'summary' });\n this.meta.updateTag({ name: 'twitter:title', content: entry.title });\n this.meta.updateTag({ name: 'twitter:description', content: description });\n }\n\n private applyNotFoundMeta(): void {\n this.title.setTitle('Page not found — Help');\n this.meta.updateTag({ name: 'robots', content: 'noindex' });\n }\n\n private canonicalUrl(entry: FaqEntry): string {\n const base = this.siteBase.replace(/\\/+$/, '');\n return `${base}/help/${entry.file}`;\n }\n}\n\n/**\n * Serializes a JSON-LD object for safe inclusion in a\n * `<script type=\"application/ld+json\">` element. Escapes `<` so a\n * stray `</script>` inside any string field cannot break out of the\n * script tag. (Browsers and crawlers parse the resulting `<`\n * back to `<` per JSON spec.)\n */\nfunction serializeJsonLd(obj: unknown): string {\n return JSON.stringify(obj).replace(/</g, '\\\\u003c');\n}\n","import { Injectable, signal, computed } from '@angular/core';\n\nexport type ThemeMode = 'dark';\n\n@Injectable({ providedIn: 'root' })\nexport class ThemeService {\n readonly mode = signal<ThemeMode>('dark');\n readonly isDark = computed(() => this.mode() === 'dark');\n}\n","import { Injectable, signal } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class TerminalFocusService {\n readonly focusRequested = signal(0);\n\n requestFocus(): void {\n this.focusRequested.update(v => v + 1);\n }\n}\n","import { computed, inject, Injectable, NgZone, signal } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { TerminalFocusService } from './terminal-focus.service';\n\nexport interface ShortcutRegistration {\n key: string;\n modifier?: 'Alt';\n action: () => void;\n description: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class KeyboardShortcutService {\n readonly #groups = new Map<string, ShortcutRegistration[]>();\n readonly #activeGroupId = signal<string | null>(null);\n\n readonly #document = inject(DOCUMENT);\n readonly #zone = inject(NgZone);\n readonly #focusService = inject(TerminalFocusService);\n\n readonly helpVisible = signal(false);\n\n readonly activeShortcuts = computed(() => {\n const groupId = this.#activeGroupId();\n if (!groupId) return null;\n const shortcuts = this.#groups.get(groupId);\n if (!shortcuts) return null;\n return { groupId, shortcuts };\n });\n\n constructor() {\n this.#zone.runOutsideAngular(() => {\n this.#document.addEventListener('keydown', (event: KeyboardEvent) => {\n this.#handleKeydown(event);\n });\n });\n }\n\n registerGroup(groupId: string, shortcuts: ShortcutRegistration[]): void {\n this.#groups.set(groupId, shortcuts);\n this.#activeGroupId.set(groupId);\n }\n\n unregisterGroup(groupId: string): void {\n this.#groups.delete(groupId);\n if (this.#activeGroupId() === groupId) {\n const keys = [...this.#groups.keys()];\n this.#activeGroupId.set(keys.length > 0 ? keys[keys.length - 1] : null);\n }\n }\n\n toggleHelp(): void {\n this.helpVisible.update(v => !v);\n }\n\n #handleKeydown(event: KeyboardEvent): boolean {\n const activeId = this.#activeGroupId();\n if (activeId) {\n const shortcuts = this.#groups.get(activeId);\n if (shortcuts) {\n const match = shortcuts.find(s => {\n if (s.modifier === 'Alt') return event.altKey && s.key === event.key;\n return !event.altKey && !event.ctrlKey && !event.metaKey && s.key === event.key;\n });\n if (match) {\n event.preventDefault();\n this.#zone.run(() => match.action());\n return true;\n }\n }\n }\n\n if (event.key === 'Escape') {\n event.preventDefault();\n this.#zone.run(() => {\n this.helpVisible.set(false);\n this.#focusService.requestFocus();\n });\n return true;\n }\n\n if (!event.altKey) return false;\n\n if (event.key === '?' || event.key === '/') {\n event.preventDefault();\n this.#zone.run(() => this.toggleHelp());\n return true;\n }\n\n return false;\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { z } from 'zod/v4';\nimport { CommandDefinition, CommandResult } from '../types/command.types';\nimport { FaqService } from '../faq/faq.service';\n\nconst FAQ_USAGE =\n 'faq\\n' +\n 'faq <key>\\n' +\n 'faq search <term>\\n' +\n 'faq index\\n' +\n 'faq help\\n\\n' +\n ' Opens the in-app FAQ help system. Does not require authentication.\\n\\n' +\n ' Subcommands:\\n' +\n ' (none) Open the FAQ at the current route\\'s resolved key.\\n' +\n ' <key> Open at a specific dot-notation key (e.g. trade.segments).\\n' +\n ' search <term> Open with the search field pre-filled.\\n' +\n ' index Open at the index table-of-contents.\\n' +\n ' help Show this help.';\n\n@Injectable({ providedIn: 'root' })\nexport class FaqCommand implements CommandDefinition {\n private readonly faqService = inject(FaqService);\n\n readonly name = 'faq';\n readonly description = 'Open the in-app FAQ help system';\n readonly usage = FAQ_USAGE;\n readonly requiresAuth = false;\n readonly argsSchema = z.array(z.string()).max(50);\n\n execute(args: string[]): CommandResult {\n const ts = () => new Date();\n if (args.length === 0) {\n void this.faqService.openModal();\n return { success: true, message: '', timestamp: ts() };\n }\n const sub = args[0].toLowerCase();\n if (sub === 'index') {\n void this.faqService.openModal('index');\n return { success: true, message: '', timestamp: ts() };\n }\n if (sub === 'search') {\n const term = args.slice(1).join(' ').trim();\n if (!term) {\n return {\n success: false,\n message: 'Usage: faq search <term>',\n timestamp: ts(),\n };\n }\n void this.faqService.openModal(undefined, { searchTerm: term });\n return { success: true, message: '', timestamp: ts() };\n }\n void this.faqService.openModal(args[0]);\n return { success: true, message: '', timestamp: ts() };\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { CommandDefinition } from '../types/command.types';\nimport { SHELL_COMMANDS } from '../tokens/shell-tokens';\nimport { FaqCommand } from '../commands/faq.command';\n\n@Injectable({ providedIn: 'root' })\nexport class CommandRegistryService {\n private readonly commands = new Map<string, CommandDefinition>();\n\n constructor() {\n // Built-in shell commands registered ahead of app-provided commands so\n // an app cannot accidentally shadow them.\n this.register(inject(FaqCommand));\n\n const appCommands = inject(SHELL_COMMANDS, { optional: true }) ?? [];\n for (const cmd of appCommands) {\n this.register(cmd);\n }\n }\n\n register(command: CommandDefinition): void {\n this.commands.set(command.name, command);\n }\n\n get(name: string): CommandDefinition | undefined {\n return this.commands.get(name);\n }\n\n getAll(): CommandDefinition[] {\n return Array.from(this.commands.values());\n }\n\n /**\n * Returns command name suggestions for tab-completion.\n * Built-ins (clear, help) are included when authenticated.\n */\n getSuggestions(prefix: string, isAuthenticated: boolean): string[] {\n if (!prefix) return [];\n if (!isAuthenticated) {\n const open = ['login', ...[...this.commands.values()].filter(c => c.requiresAuth === false).map(c => c.name)];\n return open.filter(name => name.startsWith(prefix) && name !== prefix).sort();\n }\n const builtIns = ['clear', 'help'];\n const registered = [...this.commands.values()].map(c => c.name);\n return [...builtIns, ...registered]\n .filter(name => name.startsWith(prefix) && name !== prefix)\n .sort();\n }\n}\n","/**\n * Quote-aware command tokenizer. Treats \"...\" as single tokens and strips enclosing quotes.\n */\nexport function tokenize(input: string): string[] {\n return (input.match(/(?:\"[^\"]*\"|\\S)+/g) ?? []).map(t => t.replace(/\"([^\"]*)\"/g, '$1'));\n}\n\nexport const CLEAR_USAGE =\n 'clear\\n\\n' +\n ' Clears the terminal history.\\n' +\n ' No arguments required.';\n\nexport const HELP_USAGE =\n 'help [command]\\n\\n' +\n ' With no arguments, lists all available commands.\\n' +\n ' With a command name, shows detailed usage for that command.\\n\\n' +\n ' Arguments:\\n' +\n ' [command] Optional command name to show detailed help for';\n","import { inject, Injectable, signal, computed, effect } from '@angular/core';\nimport { z } from 'zod/v4';\nimport { CommandResult, CommandHistoryEntry, Severity } from '../types/command.types';\nimport { tokenize, CLEAR_USAGE, HELP_USAGE } from '../commands/command.utils';\nimport { CommandRegistryService } from './command-registry.service';\nimport { AuthenticationService } from './authentication.service';\n\nexport type { CommandResult, CommandHistoryEntry, Severity };\n\nconst CommandInputSchema = z.string().trim().min(1, 'Command cannot be empty');\n\n@Injectable({ providedIn: 'root' })\nexport class CommandService {\n readonly history = signal<CommandHistoryEntry[]>([]);\n readonly currentInput = signal('');\n readonly isProcessing = signal(false);\n readonly helpOverlay = signal<string | null>(null);\n\n private readonly authService = inject(AuthenticationService);\n private readonly registry = inject(CommandRegistryService);\n\n constructor() {\n effect(() => {\n if (!this.authService.authenticated()) {\n this.history.set([]);\n }\n });\n }\n\n readonly lastResult = computed(() => {\n const h = this.history();\n return h.length > 0 ? h[h.length - 1].result : null;\n });\n\n dismissHelp(): void {\n this.helpOverlay.set(null);\n }\n\n echoCommand(input: string): void {\n if (this.#coalesce(input)) return;\n this.history.update(h => [...h, {\n input,\n result: { success: true, message: '', timestamp: new Date() },\n repeatCount: 1,\n }]);\n }\n\n pushNotification(notification: { message: string; severity: Severity }): void {\n this.history.update(h => [...h, {\n input: '',\n result: {\n success: notification.severity !== 'error',\n message: notification.message,\n timestamp: new Date(),\n severity: notification.severity,\n },\n }]);\n }\n\n execute(rawInput: string): void {\n const validation = CommandInputSchema.safeParse(rawInput);\n if (!validation.success) {\n this.history.update(h => [...h, {\n input: rawInput,\n result: { success: false, message: validation.error.issues[0].message, timestamp: new Date() },\n }]);\n this.currentInput.set('');\n return;\n }\n\n const input = validation.data;\n const parts = tokenize(input);\n const command = parts[0].toLowerCase();\n\n const def = this.registry.get(command);\n const displayInput = def?.sanitizeInput ? def.sanitizeInput(input) : input;\n\n const resultOrPromise = this.#dispatch(command, parts.slice(1));\n this.currentInput.set('');\n\n if (resultOrPromise instanceof Promise) {\n this.isProcessing.set(true);\n resultOrPromise\n .then(result => {\n if (result.isHelp && result.message) {\n this.helpOverlay.set(result.message);\n }\n const historyResult = result.isHelp ? { ...result, message: '' } : result;\n if (!this.#coalesce(displayInput)) {\n this.history.update(h => [...h, { input: displayInput, result: historyResult, repeatCount: 1 }]);\n }\n })\n .finally(() => this.isProcessing.set(false));\n } else {\n if (resultOrPromise.isHelp && resultOrPromise.message) {\n this.helpOverlay.set(resultOrPromise.message);\n }\n const historyResult = resultOrPromise.isHelp ? { ...resultOrPromise, message: '' } : resultOrPromise;\n if (!this.#coalesce(displayInput)) {\n this.history.update(h => [...h, { input: displayInput, result: historyResult, repeatCount: 1 }]);\n }\n }\n }\n\n #coalesce(input: string): boolean {\n if (!input) return false;\n const h = this.history();\n for (let i = h.length - 1; i >= 0; i--) {\n if (h[i].input) {\n if (h[i].input === input) {\n this.history.update(history => {\n const updated = [...history];\n updated[i] = { ...updated[i], repeatCount: (updated[i].repeatCount ?? 1) + 1 };\n return updated;\n });\n return true;\n }\n return false;\n }\n }\n return false;\n }\n\n #dispatch(command: string, args: string[]): CommandResult | Promise<CommandResult> {\n // Normalize \"help <command>\" → \"<command> help\" so auth and dispatch rules apply uniformly\n if (command === 'help' && args.length > 0 && args[0].toLowerCase() !== 'help') {\n [command, args] = [args[0].toLowerCase(), ['help']];\n }\n\n const hasHelp = args.some(a => a.toLowerCase() === 'help');\n const isAuthenticated = this.authService.authenticated();\n const notLoggedIn = (): CommandResult => ({\n success: false,\n message: 'Not logged in. Use \"login\" to authenticate.',\n timestamp: new Date(),\n });\n\n if (command === 'clear') {\n if (!isAuthenticated) return notLoggedIn();\n if (hasHelp) return { success: true, message: CLEAR_USAGE, timestamp: new Date(), isHelp: true };\n this.history.set([]);\n return { success: true, message: '', timestamp: new Date() };\n }\n\n if (command === 'help') {\n if (!isAuthenticated) return notLoggedIn();\n const target = args[0]?.toLowerCase();\n if (target) return this.#commandHelp(target);\n const registered = this.registry.getAll();\n const lines = [\n ' clear — Clear terminal history',\n ' help — List available commands',\n ...registered.map(c => ` ${c.name} — ${c.description}`),\n ];\n return {\n success: true,\n message: 'Available commands:\\n' + lines.join('\\n') + '\\n\\nType \"help <command>\" or \"<command> help\" for detailed usage.',\n timestamp: new Date(),\n isHelp: true,\n };\n }\n\n let def = this.registry.get(command);\n if (!def) {\n // Try swapping the first two tokens: \"disable user foo\" → \"user disable foo\"\n const swapped = args[0]?.toLowerCase();\n if (swapped && this.registry.get(swapped)) {\n def = this.registry.get(swapped)!;\n args = [command, ...args.slice(1)];\n command = swapped;\n } else {\n if (!isAuthenticated && command !== 'login') return notLoggedIn();\n return { success: false, message: `Unknown command: ${command}`, timestamp: new Date() };\n }\n }\n\n if (!isAuthenticated && command !== 'login' && def.requiresAuth !== false) {\n return notLoggedIn();\n }\n\n if (hasHelp) {\n return { success: true, message: def.usage, timestamp: new Date(), isHelp: true };\n }\n\n const validation = def.argsSchema.safeParse(args);\n if (!validation.success) {\n return { success: false, message: `Invalid arguments for '${command}': ${validation.error.issues[0].message}`, timestamp: new Date() };\n }\n\n return def.execute(args);\n }\n\n #commandHelp(name: string): CommandResult {\n if (name === 'clear') return { success: true, message: CLEAR_USAGE, timestamp: new Date(), isHelp: true };\n if (name === 'help') return { success: true, message: HELP_USAGE, timestamp: new Date(), isHelp: true };\n const def = this.registry.get(name);\n if (!def) return { success: false, message: `Unknown command: ${name}`, timestamp: new Date() };\n return { success: true, message: def.usage, timestamp: new Date(), isHelp: true };\n }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { AuthenticationService } from '../../services/authentication.service';\nimport { CommandService } from '../../services/command.service';\nimport { TerminalFocusService } from '../../services/terminal-focus.service';\n\n@Component({\n selector: 'shell-status-bar',\n templateUrl: './status-bar.html',\n styleUrl: './status-bar.css',\n})\nexport class StatusBar {\n readonly #authService = inject(AuthenticationService);\n readonly #focusService = inject(TerminalFocusService);\n readonly #commandService = inject(CommandService);\n\n readonly isAuthenticated = this.#authService.authenticated;\n readonly loginStatus = computed(() =>\n this.#authService.authenticating()\n ? 'Authenticating...'\n : this.#authService.authenticated()\n ? 'Logged in'\n : 'Not logged in',\n );\n\n logout(): void {\n this.#authService.logout();\n this.#commandService.echoCommand('logout');\n this.#focusService.requestFocus();\n }\n\n openFaq(): void {\n this.#commandService.execute('faq');\n this.#focusService.requestFocus();\n }\n}\n","<div class=\"status-bar\">\n <div class=\"status-item\">\n <span class=\"status-label text-secondary-info\">Status:</span>\n @if (isAuthenticated()) {\n <a class=\"status-value text-interactive logout-link\" (click)=\"logout()\">Log Out</a>\n } @else {\n <span class=\"status-value text-loss\">{{ loginStatus() }}</span>\n }\n </div>\n @if (isAuthenticated()) {\n <ng-content />\n }\n <button\n type=\"button\"\n class=\"faq-button text-interactive\"\n (click)=\"openFaq()\"\n title=\"Open FAQ (or type `faq`)\"\n aria-label=\"Open FAQ\"\n >?</button>\n</div>\n","import { Component, computed, inject } from '@angular/core';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { TerminalFocusService } from '../../services/terminal-focus.service';\nimport { CommandService } from '../../services/command.service';\nimport { KeyboardShortcutService } from '../../services/keyboard-shortcut.service';\nimport { SHELL_MENU_ITEMS } from '../../tokens/shell-tokens';\nimport { MenuItem } from '../../types/menu.types';\n\nexport { MenuItem };\n\n@Component({\n selector: 'shell-side-menu',\n imports: [RouterLink, RouterLinkActive, MatIconModule, MatTooltipModule],\n templateUrl: './side-menu.html',\n styleUrl: './side-menu.css',\n})\nexport class SideMenu {\n readonly #focusService = inject(TerminalFocusService);\n readonly #commandService = inject(CommandService);\n readonly #shortcutService = inject(KeyboardShortcutService);\n readonly hasShortcuts = this.#shortcutService.activeShortcuts;\n\n readonly #allMenuItems: MenuItem[] = inject(SHELL_MENU_ITEMS, { optional: true }) ?? [];\n\n readonly menuItems = computed(() =>\n this.#allMenuItems.filter(item => !item.visible || item.visible()),\n );\n\n onMenuClick(item: MenuItem): void {\n if (item.command) {\n this.#commandService.echoCommand(item.command);\n }\n this.#focusService.requestFocus();\n }\n\n toggleHelp(): void {\n this.#shortcutService.toggleHelp();\n }\n}\n","<nav class=\"side-menu\">\n @for (item of menuItems(); track item.route) {\n <a\n class=\"menu-item\"\n [routerLink]=\"item.route\"\n routerLinkActive=\"active\"\n [matTooltip]=\"item.label\"\n matTooltipPosition=\"right\"\n (click)=\"onMenuClick(item)\"\n >\n <mat-icon>{{ item.icon }}</mat-icon>\n </a>\n }\n <div class=\"menu-spacer\"></div>\n @if (hasShortcuts()) {\n <button\n class=\"help-button\"\n matTooltip=\"Keyboard shortcuts\"\n matTooltipPosition=\"right\"\n (click)=\"toggleHelp()\"\n >\n <span class=\"help-modifier\">Alt+</span><span class=\"help-key\">?</span>\n </button>\n }\n</nav>\n","import { Component, inject } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { ThinkingService } from '../../services/thinking.service';\nimport { KeyboardShortcutService } from '../../services/keyboard-shortcut.service';\n\n@Component({\n selector: 'shell-main-content',\n imports: [RouterOutlet, MatProgressSpinnerModule],\n templateUrl: './main-content.html',\n styleUrl: './main-content.css',\n})\nexport class MainContent {\n readonly #thinkingService = inject(ThinkingService);\n readonly #shortcutService = inject(KeyboardShortcutService);\n readonly isThinking = this.#thinkingService.isThinking;\n readonly shortcutHelpVisible = this.#shortcutService.helpVisible;\n readonly activeShortcuts = this.#shortcutService.activeShortcuts;\n\n formatKey(key: string): string {\n const keyMap: Record<string, string> = {\n ArrowUp: '↑', ArrowDown: '↓', ArrowLeft: '←', ArrowRight: '→',\n PageUp: 'PgUp', PageDown: 'PgDn',\n };\n return keyMap[key] ?? key;\n }\n\n closeShortcutHelp(): void {\n this.#shortcutService.helpVisible.set(false);\n }\n}\n","<div class=\"main-content\">\n <div class=\"content-area\">\n <router-outlet />\n </div>\n @if (shortcutHelpVisible() && activeShortcuts()) {\n <div class=\"shortcut-overlay\" (click)=\"closeShortcutHelp()\">\n <div class=\"shortcut-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"shortcut-title text-secondary-info\">{{ activeShortcuts()!.groupId }} shortcuts</div>\n @for (s of activeShortcuts()!.shortcuts; track s.key) {\n <div class=\"shortcut-row\">\n <kbd class=\"shortcut-key\">Alt+{{ formatKey(s.key) }}</kbd>\n <span class=\"shortcut-desc text-text-primary\">{{ s.description }}</span>\n </div>\n }\n <div class=\"shortcut-row shortcut-dismiss\">\n <kbd class=\"shortcut-key\">Alt+?</kbd>\n <span class=\"shortcut-desc text-secondary-info\">or</span>\n <kbd class=\"shortcut-key\">Esc</kbd>\n <span class=\"shortcut-desc text-secondary-info\">dismiss</span>\n </div>\n </div>\n </div>\n }\n @if (isThinking()) {\n <div class=\"thinking-overlay\">\n <mat-spinner diameter=\"48\" />\n </div>\n }\n</div>\n","import { Component, inject, ElementRef, viewChild, effect, afterNextRender, computed } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CommandService } from '../../services/command.service';\nimport { CommandRegistryService } from '../../services/command-registry.service';\nimport { AuthenticationService } from '../../services/authentication.service';\nimport { TerminalFocusService } from '../../services/terminal-focus.service';\nimport { CommandResult } from '../../types/command.types';\n\n@Component({\n selector: 'shell-command-terminal',\n imports: [FormsModule],\n templateUrl: './command-terminal.html',\n styleUrl: './command-terminal.css',\n})\nexport class CommandTerminal {\n private readonly commandService = inject(CommandService);\n private readonly registry = inject(CommandRegistryService);\n private readonly authService = inject(AuthenticationService);\n private readonly terminalFocusService = inject(TerminalFocusService);\n\n readonly history = computed(() => [...this.commandService.history()].reverse());\n readonly currentInput = this.commandService.currentInput;\n readonly isProcessing = this.commandService.isProcessing;\n\n private readonly inputEl = viewChild<ElementRef<HTMLInputElement>>('terminalInput');\n\n private tabCycleIndex = -1;\n private lastTabPrefix = '';\n\n readonly ghostText = computed(() => {\n const input = this.currentInput().trim();\n if (!input || input.includes(' ')) return '';\n const prefix = input.toLowerCase();\n const suggestions = this.registry.getSuggestions(prefix, this.authService.authenticated());\n return suggestions.length > 0 ? suggestions[0] : '';\n });\n\n constructor() {\n afterNextRender(() => this.focusInput());\n\n effect(() => {\n if (!this.isProcessing()) {\n setTimeout(() => this.focusInput());\n }\n });\n\n effect(() => {\n this.terminalFocusService.focusRequested();\n setTimeout(() => this.focusInput());\n });\n }\n\n onSubmit(): void {\n const input = this.currentInput();\n if (!input.trim()) return;\n this.commandService.execute(input);\n this.tabCycleIndex = -1;\n this.lastTabPrefix = '';\n this.focusInput();\n }\n\n onInputChange(value: string): void {\n this.currentInput.set(value);\n this.tabCycleIndex = -1;\n this.lastTabPrefix = '';\n if (this.commandService.helpOverlay()) {\n this.commandService.dismissHelp();\n }\n }\n\n dismissHelp(): void {\n this.commandService.dismissHelp();\n }\n\n onTab(event: KeyboardEvent): void {\n event.preventDefault();\n const input = this.currentInput().trim();\n if (!input || input.includes(' ')) return;\n\n const prefix = input.toLowerCase();\n const suggestions = this.registry.getSuggestions(prefix, this.authService.authenticated());\n if (suggestions.length === 0) return;\n\n if (suggestions.length === 1) {\n this.currentInput.set(suggestions[0] + ' ');\n this.tabCycleIndex = -1;\n this.lastTabPrefix = '';\n return;\n }\n\n if (this.lastTabPrefix !== prefix) {\n this.lastTabPrefix = prefix;\n this.tabCycleIndex = -1;\n }\n\n if (event.shiftKey) {\n this.tabCycleIndex = this.tabCycleIndex <= 0 ? suggestions.length - 1 : this.tabCycleIndex - 1;\n } else {\n this.tabCycleIndex = (this.tabCycleIndex + 1) % suggestions.length;\n }\n\n this.currentInput.set(suggestions[this.tabCycleIndex]);\n }\n\n getSeverityClass(result: CommandResult): string {\n if (result.severity === 'info') return 'info';\n if (result.severity === 'warning') return 'warning';\n if (result.severity === 'error' || !result.success) return 'error';\n return '';\n }\n\n focusInput(): void {\n this.inputEl()?.nativeElement.focus();\n }\n}\n","<div class=\"terminal\">\n <div class=\"terminal-input-row\">\n <span class=\"prompt\">$</span>\n <div class=\"input-wrapper\">\n @if (ghostText()) {\n <input\n class=\"ghost-input\"\n type=\"text\"\n [value]=\"ghostText()\"\n disabled\n tabindex=\"-1\"\n aria-hidden=\"true\"\n />\n }\n <input\n #terminalInput\n class=\"terminal-input\"\n type=\"text\"\n [ngModel]=\"currentInput()\"\n (ngModelChange)=\"onInputChange($event)\"\n (keydown.enter)=\"onSubmit()\"\n (keydown.tab)=\"onTab($any($event))\"\n (keydown.escape)=\"dismissHelp()\"\n placeholder=\"Type a command...\"\n [disabled]=\"isProcessing()\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n </div>\n </div>\n <div class=\"terminal-output\">\n @for (entry of history(); track entry.result.timestamp) {\n @if (entry.input) {\n <div class=\"terminal-line\">\n <span class=\"prompt\">$</span>\n <span class=\"command-text\">{{ entry.input }}@if ((entry.repeatCount ?? 1) > 1) { <span class=\"repeat-count\">(×{{ entry.repeatCount }})</span>}</span>\n </div>\n }\n @if (entry.result.message) {\n <div class=\"terminal-line\" [class]=\"getSeverityClass(entry.result)\">{{ entry.result.message }}</div>\n }\n }\n </div>\n</div>\n","import { Component, inject, signal } from '@angular/core';\nimport { StatusBar } from '../status-bar/status-bar';\nimport { SideMenu } from '../side-menu/side-menu';\nimport { MainContent } from '../main-content/main-content';\nimport { CommandTerminal } from '../command-terminal/command-terminal';\nimport { FaqModal } from '../../faq/faq-modal/faq-modal';\nimport { ThinkingService } from '../../services/thinking.service';\nimport { CommandService } from '../../services/command.service';\nimport { AuthenticationService } from '../../services/authentication.service';\n\nconst MIN_TERMINAL_HEIGHT = 80;\nconst MAX_TERMINAL_RATIO = 0.6;\nconst DEFAULT_TERMINAL_HEIGHT = 160;\n\n@Component({\n selector: 'shell-root',\n imports: [StatusBar, SideMenu, MainContent, CommandTerminal, FaqModal],\n templateUrl: './shell.html',\n styleUrl: './shell.css',\n})\nexport class Shell {\n readonly #thinkingService = inject(ThinkingService);\n readonly #commandService = inject(CommandService);\n readonly #authService = inject(AuthenticationService);\n readonly isThinking = this.#thinkingService.isThinking;\n readonly isAuthenticated = this.#authService.authenticated;\n readonly helpOverlay = this.#commandService.helpOverlay;\n\n dismissHelp(): void {\n this.#commandService.dismissHelp();\n }\n readonly terminalHeight = signal(`${DEFAULT_TERMINAL_HEIGHT}px`);\n readonly isDragging = signal(false);\n\n #startY = 0;\n #startHeight = DEFAULT_TERMINAL_HEIGHT;\n\n readonly #onMouseMove = (event: MouseEvent) => {\n const deltaY = event.clientY - this.#startY;\n const maxHeight = Math.floor(window.innerHeight * MAX_TERMINAL_RATIO);\n const newHeight = Math.min(maxHeight, Math.max(MIN_TERMINAL_HEIGHT, this.#startHeight - deltaY));\n this.terminalHeight.set(`${newHeight}px`);\n };\n\n readonly #onMouseUp = () => {\n this.isDragging.set(false);\n document.removeEventListener('mousemove', this.#onMouseMove);\n document.removeEventListener('mouseup', this.#onMouseUp);\n };\n\n onResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.#startY = event.clientY;\n this.#startHeight = parseInt(this.terminalHeight(), 10);\n this.isDragging.set(true);\n document.addEventListener('mousemove', this.#onMouseMove);\n document.addEventListener('mouseup', this.#onMouseUp);\n }\n}\n","<div class=\"shell\" [style.--terminal-height]=\"terminalHeight()\" [class.is-dragging]=\"isDragging()\">\n <shell-status-bar class=\"shell-status\" [class.disabled-zone]=\"isThinking()\">\n <ng-content />\n </shell-status-bar>\n @if (isAuthenticated()) {\n <shell-side-menu class=\"shell-menu\" [class.disabled-zone]=\"isThinking()\" />\n }\n <shell-main-content class=\"shell-main\" [class.full-width]=\"!isAuthenticated()\" />\n <div class=\"shell-resize\" [class.dragging]=\"isDragging()\" (mousedown)=\"onResizeStart($event)\"></div>\n <shell-command-terminal class=\"shell-terminal\" [class.disabled-zone]=\"isThinking()\" />\n <faq-modal />\n\n @if (helpOverlay(); as helpText) {\n <div class=\"help-backdrop\" (click)=\"dismissHelp()\">\n <div class=\"help-panel\" (click)=\"$event.stopPropagation()\" role=\"dialog\" aria-label=\"Command help\">\n <div class=\"help-panel-header\">\n <span class=\"help-panel-title\">Help</span>\n <button class=\"help-panel-close\" type=\"button\" (click)=\"dismissHelp()\" aria-label=\"Close help\">✕</button>\n </div>\n <div class=\"help-panel-content\">{{ helpText }}</div>\n <div class=\"help-panel-footer\">\n <span>Tip: for most commands you can swap the first and second words — e.g. \"disable user\" works the same as \"user disable\"</span>\n <span class=\"help-panel-footer-dismiss\">Press Escape, click outside, or start typing to close</span>\n </div>\n </div>\n </div>\n }\n</div>\n","import { Component, inject, signal } from '@angular/core';\nimport { AutofillEvent, TextFieldModule } from '@angular/cdk/text-field';\nimport { Credentials, validateCredentials } from '@franzzemen/identity';\nimport { PASSWORD_REGEX, USERNAME_REGEX } from '@franzzemen/utility';\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\nimport { MatInput, MatInputModule } from '@angular/material/input';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatIconModule } from '@angular/material/icon';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { DatePipe } from '@angular/common';\nimport { AuthenticationService } from '../../services/authentication.service';\nimport { CommandService } from '../../services/command.service';\nimport { TerminalFocusService } from '../../services/terminal-focus.service';\nimport { RegexValidatorDirective } from '../../directives/regex-validator.directive';\nimport { SHELL_APP_NAME, SHELL_POST_LOGIN_ROUTE } from '../../tokens/shell-tokens';\n\n@Component({\n selector: 'shell-login',\n templateUrl: './login.html',\n styleUrl: './login.css',\n imports: [\n FormsModule,\n MatFormField,\n MatLabel,\n MatInput,\n MatInputModule,\n MatButtonModule,\n MatCheckboxModule,\n MatIconModule,\n RegexValidatorDirective,\n TextFieldModule,\n DatePipe,\n ],\n})\nexport class Login {\n model: Credentials = { username: '', password: '' };\n submitted = false;\n hide = signal(true);\n takeover = signal(true);\n errors: { ndx: number; message: string }[] = [];\n\n protected readonly USERNAME_REGEX = USERNAME_REGEX;\n protected readonly PASSWORD_REGEX = PASSWORD_REGEX;\n protected readonly appName = inject(SHELL_APP_NAME, { optional: true }) ?? 'Application';\n readonly #postLoginRoute = inject(SHELL_POST_LOGIN_ROUTE, { optional: true }) ?? '/';\n\n readonly #commandService = inject(CommandService);\n readonly #terminalFocusService = inject(TerminalFocusService);\n\n readonly #activatedRoute = inject(ActivatedRoute);\n\n constructor(\n protected authenticationService: AuthenticationService,\n protected router: Router,\n ) {}\n\n /**\n * Returns the post-login destination. Honors a `returnUrl` query param if\n * present and safe (same-origin, leading `/`, not protocol-relative);\n * otherwise falls back to `SHELL_POST_LOGIN_ROUTE`.\n */\n #resolvePostLoginUrl(): string {\n const candidate = this.#activatedRoute.snapshot.queryParamMap.get('returnUrl');\n if (!candidate) return this.#postLoginRoute;\n if (!candidate.startsWith('/')) return this.#postLoginRoute;\n if (candidate.startsWith('//')) return this.#postLoginRoute;\n if (/^https?:\\/\\//i.test(candidate)) return this.#postLoginRoute;\n return candidate;\n }\n\n onAutofill(event: AutofillEvent, inputEl: HTMLInputElement): void {\n if (event.isAutofilled) {\n setTimeout(() => {\n const length = inputEl.value.length;\n inputEl.setSelectionRange(length, length);\n });\n }\n }\n\n clickEvent(event: MouseEvent): void {\n this.hide.set(!this.hide());\n event.stopPropagation();\n }\n\n onSubmit(event: Event): void {\n this.errors = [];\n event.preventDefault();\n this.submitted = true;\n const result = validateCredentials(this.model);\n if (result === true) {\n this.#doLogin(this.takeover());\n } else {\n for (let ndx = 0; ndx < result.length; ndx++) {\n this.errors.push({\n ndx,\n message: `${result[ndx].message ?? 'Unknown error'}: ${result[ndx].field ?? 'Unknown field'} ${result[ndx].type ?? 'Unknown type'} Expected: ${result[ndx].expected} Actual: ${result[ndx].actual}`,\n });\n }\n this.submitted = false;\n }\n }\n\n onTakeOver(): void {\n this.errors = [];\n this.#commandService.execute('login --force');\n }\n\n onCancelConflict(): void {\n this.authenticationService.clearConflict();\n this.submitted = false;\n }\n\n #doLogin(force: boolean): void {\n this.authenticationService\n .login(this.model, force)\n .then(() => {\n this.#commandService.echoCommand(`login ${this.model.username}`);\n this.router.navigateByUrl(this.#resolvePostLoginUrl()).then(() => {\n setTimeout(() => this.#terminalFocusService.requestFocus());\n }).catch(console.error);\n })\n .catch((err) => {\n if (err !== 'conflict') {\n this.errors.push({ ndx: 0, message: typeof err === 'string' ? err : 'Unable to login' });\n }\n this.submitted = false;\n });\n }\n}\n","@let usernameRegex = USERNAME_REGEX;\n@let passwordRegex = PASSWORD_REGEX;\n<div class=\"login-container\">\n <div class=\"login-header\">\n <h2 class=\"text-text-primary\">{{ appName }}</h2>\n <p class=\"text-secondary-info\">Sign in to continue</p>\n </div>\n <form #loginForm=\"ngForm\" (ngSubmit)=\"onSubmit($event)\" class=\"login-form\">\n <mat-form-field appearance=\"outline\" class=\"login-field\">\n <mat-label>Username</mat-label>\n <input\n #usernameInput\n matInput\n placeholder=\"Enter username\"\n [(ngModel)]=\"model.username\"\n name=\"username\"\n [disabled]=\"submitted\"\n required\n regexValidator\n [regex]=\"usernameRegex\"\n (cdkAutofill)=\"onAutofill($event, usernameInput)\"\n />\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"login-field\">\n <mat-label>Password</mat-label>\n <input\n #passwordInput\n matInput\n placeholder=\"Enter password\"\n [type]=\"hide() ? 'password' : 'text'\"\n [(ngModel)]=\"model.password\"\n name=\"password\"\n [disabled]=\"submitted\"\n regexValidator\n [regex]=\"passwordRegex\"\n (cdkAutofill)=\"onAutofill($event, passwordInput)\"\n />\n <button\n mat-icon-button\n matSuffix\n type=\"button\"\n (click)=\"clickEvent($event)\"\n [attr.aria-label]=\"'Hide password'\"\n [attr.aria-pressed]=\"hide()\"\n >\n <mat-icon>{{ hide() ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n </mat-form-field>\n <mat-checkbox\n class=\"login-takeover\"\n name=\"takeover\"\n [checked]=\"takeover()\"\n (change)=\"takeover.set($event.checked)\"\n [disabled]=\"submitted\"\n >\n Takeover session if logged in elsewhere\n </mat-checkbox>\n <button mat-flat-button type=\"submit\" [disabled]=\"submitted\" class=\"login-button\">\n Login\n </button>\n </form>\n @if (errors.length > 0) {\n <div class=\"login-errors\">\n @for (error of errors; track error.ndx) {\n <div class=\"login-error text-loss\">{{ error.message }}</div>\n }\n </div>\n }\n @if (authenticationService.conflictSessions(); as sessions) {\n <div class=\"login-conflict\">\n @for (session of sessions; track $index) {\n <p class=\"text-secondary-info\">\n Already logged in from <strong>{{ session.appContext }}</strong>\n since {{ session.startEpoch | date:'short' }}.\n </p>\n }\n <p class=\"text-secondary-info\">Log in here and end that session?</p>\n <div class=\"login-conflict-actions\">\n <button mat-stroked-button type=\"button\" (click)=\"onCancelConflict()\">Cancel</button>\n <button mat-flat-button type=\"button\" (click)=\"onTakeOver()\">Take Over</button>\n </div>\n </div>\n }\n</div>\n","import { Component, inject } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\n\nexport interface ConfirmDialogData {\n title: string;\n message: string;\n warningMessage?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n}\n\n@Component({\n selector: 'shell-confirm-dialog',\n imports: [MatDialogModule, MatButtonModule],\n template: `\n <h2 mat-dialog-title>{{ data.title }}</h2>\n <mat-dialog-content>\n <p>{{ data.message }}</p>\n @if (data.warningMessage) {\n <p class=\"warning-message\">{{ data.warningMessage }}</p>\n }\n </mat-dialog-content>\n <mat-dialog-actions align=\"end\">\n <button mat-button (click)=\"dialogRef.close(false)\">{{ data.cancelLabel ?? 'Cancel' }}</button>\n <button mat-flat-button color=\"warn\" (click)=\"dialogRef.close(true)\">{{ data.confirmLabel ?? 'Confirm' }}</button>\n </mat-dialog-actions>\n `,\n styles: [`\n :host { display: block; }\n .warning-message { color: var(--color-warning); margin-top: 8px; }\n `],\n})\nexport class ConfirmDialog {\n readonly data = inject<ConfirmDialogData>(MAT_DIALOG_DATA);\n readonly dialogRef = inject(MatDialogRef<ConfirmDialog>);\n}\n","/*\n * Public API surface for @franzzemen/brokenstock-shell\n */\n\n// Types\nexport * from './lib/types/command.types';\nexport * from './lib/types/menu.types';\n\n// Tokens & config\nexport * from './lib/tokens/shell-tokens';\nexport * from './lib/provide-shell-config';\n\n// Guards\nexport * from './lib/guards/auth.guard';\nexport * from './lib/guards/guest.guard';\n\n// Interceptors\nexport * from './lib/interceptors/auth.interceptor';\n\n// Directives\nexport * from './lib/directives/regex-validator.directive';\n\n// FAQ help system\nexport * from './lib/faq/faq.types';\nexport * from './lib/faq/faq-content-loader.token';\nexport * from './lib/faq/faq-markdown-renderer.service';\nexport * from './lib/faq/http-faq-content-loader.service';\nexport * from './lib/faq/faq.service';\nexport * from './lib/faq/faq-history.service';\nexport * from './lib/faq/faq-modal/faq-modal';\nexport * from './lib/faq/faq-dev-mode.token';\nexport * from './lib/faq/faq-authoring-panel/faq-authoring-panel';\nexport * from './lib/faq/public-faq-index/public-faq-index';\nexport * from './lib/faq/public-faq-page/public-faq-page';\nexport * from './lib/faq/faq-seo.tokens';\n\n// Services\nexport * from './lib/services/thinking.service';\nexport * from './lib/services/theme.service';\nexport * from './lib/services/terminal-focus.service';\nexport * from './lib/services/keyboard-shortcut.service';\nexport * from './lib/services/authentication.service';\nexport * from './lib/services/command-registry.service';\nexport * from './lib/services/command.service';\n\n// Commands\nexport * from './lib/commands/command.utils';\n\n// Components\nexport * from './lib/components/shell/shell';\nexport * from './lib/components/side-menu/side-menu';\nexport * from './lib/components/status-bar/status-bar';\nexport * from './lib/components/main-content/main-content';\nexport * from './lib/components/command-terminal/command-terminal';\nexport * from './lib/components/login/login';\nexport * from './lib/components/confirm-dialog/confirm-dialog';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["serializeJsonLd","i1","i1.AuthenticationService","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"franzzemen-brokenstock-shell.mjs","sources":["../../src/lib/tokens/shell-tokens.ts","../../src/lib/provide-shell-config.ts","../../src/lib/services/thinking.service.ts","../../src/lib/services/authentication.service.ts","../../src/lib/guards/auth.guard.ts","../../src/lib/guards/guest.guard.ts","../../src/lib/interceptors/auth.interceptor.ts","../../src/lib/directives/regex-validator.directive.ts","../../src/lib/faq/faq.types.ts","../../src/lib/faq/faq-content-loader.token.ts","../../src/lib/faq/faq-markdown-renderer.service.ts","../../src/lib/faq/http-faq-content-loader.service.ts","../../src/lib/faq/faq-history.service.ts","../../src/lib/faq/faq.service.ts","../../src/lib/faq/faq-dev-mode.token.ts","../../src/lib/faq/faq-modal/faq-modal.ts","../../src/lib/faq/faq-modal/faq-modal.html","../../src/lib/faq/faq-authoring-panel/faq-authoring-panel.ts","../../src/lib/faq/faq-authoring-panel/faq-authoring-panel.html","../../src/lib/faq/faq-seo.tokens.ts","../../src/lib/faq/public-faq-index/public-faq-index.ts","../../src/lib/faq/public-faq-page/public-faq-page.ts","../../src/lib/services/theme.service.ts","../../src/lib/services/terminal-focus.service.ts","../../src/lib/services/keyboard-shortcut.service.ts","../../src/lib/commands/faq.command.ts","../../src/lib/services/command-registry.service.ts","../../src/lib/commands/command.utils.ts","../../src/lib/services/command.service.ts","../../src/lib/components/status-bar/status-bar.ts","../../src/lib/components/status-bar/status-bar.html","../../src/lib/components/side-menu/side-menu.ts","../../src/lib/components/side-menu/side-menu.html","../../src/lib/components/main-content/main-content.ts","../../src/lib/components/main-content/main-content.html","../../src/lib/components/command-terminal/command-terminal.ts","../../src/lib/components/command-terminal/command-terminal.html","../../src/lib/components/shell/shell.ts","../../src/lib/components/shell/shell.html","../../src/lib/components/login/login.ts","../../src/lib/components/login/login.html","../../src/lib/components/confirm-dialog/confirm-dialog.ts","../../src/public-api.ts","../../src/franzzemen-brokenstock-shell.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { CommandDefinition } from '../types/command.types';\nimport { MenuItem } from '../types/menu.types';\n\nexport interface ShellAuthUrls {\n login: string;\n logout: string;\n refresh: string;\n}\n\nexport const SHELL_APP_NAME = new InjectionToken<string>('SHELL_APP_NAME');\nexport const SHELL_MENU_ITEMS = new InjectionToken<MenuItem[]>('SHELL_MENU_ITEMS');\nexport const SHELL_AUTH_URLS = new InjectionToken<ShellAuthUrls>('SHELL_AUTH_URLS');\n\n/**\n * App-specific commands to register alongside the built-in command set.\n * Provide via provideShellConfig().\n */\nexport const SHELL_COMMANDS = new InjectionToken<CommandDefinition[]>('SHELL_COMMANDS');\n\nexport const SHELL_POST_LOGIN_ROUTE = new InjectionToken<string>('SHELL_POST_LOGIN_ROUTE');\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { CommandDefinition } from './types/command.types';\nimport { MenuItem } from './types/menu.types';\nimport { SHELL_APP_NAME, SHELL_AUTH_URLS, SHELL_COMMANDS, SHELL_MENU_ITEMS, ShellAuthUrls } from './tokens/shell-tokens';\n\nexport interface ShellConfig {\n appName: string;\n menuItems: MenuItem[];\n authUrls: ShellAuthUrls;\n commands?: CommandDefinition[];\n}\n\nexport function provideShellConfig(config: ShellConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: SHELL_APP_NAME, useValue: config.appName },\n { provide: SHELL_MENU_ITEMS, useValue: config.menuItems },\n { provide: SHELL_AUTH_URLS, useValue: config.authUrls },\n { provide: SHELL_COMMANDS, useValue: config.commands ?? [] },\n ]);\n}\n","import { Injectable, signal, computed } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class ThinkingService {\n readonly #activeCount = signal(0);\n\n readonly isThinking = computed(() => this.#activeCount() > 0);\n\n startThinking(): void {\n this.#activeCount.update(c => c + 1);\n }\n\n stopThinking(): void {\n this.#activeCount.update(c => Math.max(0, c - 1));\n }\n\n reset(): void {\n this.#activeCount.set(0);\n }\n}\n","import { computed, inject, Injectable, signal } from '@angular/core';\nimport { BEARER_TOKEN_REGEX, BearerToken, HttpHeader } from '@franzzemen/utility';\nimport { AuthenticationResponse, Credentials, EffectivePermissions, RoleNames, SessionSummary, UserSession, validateCredentials } from '@franzzemen/identity';\nimport { HttpClient, HttpErrorResponse, HttpResponse } from '@angular/common/http';\nimport { Router } from '@angular/router';\nimport { ThinkingService } from './thinking.service';\nimport { SHELL_AUTH_URLS } from '../tokens/shell-tokens';\n\n@Injectable({ providedIn: 'root' })\nexport class AuthenticationService {\n readonly authenticated = signal(false);\n readonly authenticating = signal(false);\n readonly userSession = signal<UserSession | undefined>(undefined);\n readonly effectivePermissions = signal<EffectivePermissions>({});\n readonly conflictSessions = signal<SessionSummary[] | undefined>(undefined);\n readonly pendingCredentials = signal<Credentials | undefined>(undefined);\n\n #refreshing: Promise<boolean> | null = null;\n #auth: BearerToken = 'Bearer ..' as BearerToken;\n\n readonly #httpClient = inject(HttpClient);\n readonly #thinkingService = inject(ThinkingService);\n readonly #router = inject(Router);\n readonly #authUrls = inject(SHELL_AUTH_URLS);\n\n get auth(): BearerToken {\n return this.#auth;\n }\n\n /** Check if the current user has a specific role. */\n hasRole(roleName: RoleNames): boolean {\n return this.authenticated() && this.userSession()?.roles.includes(roleName) === true;\n }\n\n /** Check if the current user has any of the specified roles. */\n hasAnyRole(roleNames: RoleNames[]): boolean {\n return this.authenticated() && roleNames.some(r => this.userSession()?.roles.includes(r) === true);\n }\n\n refresh(): Promise<boolean> {\n if (this.#refreshing) {\n return this.#refreshing;\n }\n this.#refreshing = this.#doRefresh().finally(() => { this.#refreshing = null; });\n return this.#refreshing;\n }\n\n clearConflict(): void {\n this.conflictSessions.set(undefined);\n this.pendingCredentials.set(undefined);\n }\n\n logout(): void {\n const subscription = this.#httpClient\n .get<void>(this.#authUrls.logout, {\n headers: {\n [HttpHeader.Authorization]: this.#auth,\n [HttpHeader.AppContext]: 'brokenstock',\n },\n })\n .subscribe({\n next: () => {\n this.#clearSession();\n subscription.unsubscribe();\n },\n error: () => {\n this.#thinkingService.reset();\n this.#clearSession();\n },\n });\n }\n\n login(credentials: Credentials, force = false): Promise<void> {\n const validation = validateCredentials(credentials);\n if (validation !== true) {\n return Promise.reject('Invalid credentials');\n }\n this.conflictSessions.set(undefined);\n this.#thinkingService.startThinking();\n return new Promise((resolve, reject) => {\n this.authenticating.set(true);\n const body = force ? {...credentials, force: true} : credentials;\n const subscription = this.#httpClient\n .post<HttpResponse<AuthenticationResponse>>(\n this.#authUrls.login,\n body,\n {\n headers: {\n [HttpHeader.ContentType]: 'application/json',\n [HttpHeader.AppContext]: 'brokenstock',\n },\n observe: 'response',\n responseType: 'json',\n withCredentials: true,\n },\n )\n .subscribe({\n next: (response: HttpResponse<any>) => {\n try {\n const authResponse: AuthenticationResponse = response.body;\n // @ts-ignore\n delete authResponse.session.token;\n this.userSession.set(authResponse.session);\n this.effectivePermissions.set(authResponse.effectivePermissions ?? {});\n const auth = response.headers.get(HttpHeader.Authorization);\n if (!auth || !BEARER_TOKEN_REGEX.test(auth)) {\n reject('Unable to login');\n return;\n }\n this.#auth = auth as BearerToken;\n this.authenticated.set(true);\n this.pendingCredentials.set(undefined);\n resolve();\n } catch {\n reject('Unable to login');\n } finally {\n this.authenticating.set(false);\n subscription.unsubscribe();\n this.#thinkingService.stopThinking();\n }\n },\n error: (err: HttpErrorResponse) => {\n try {\n if (err.status === 409) {\n this.conflictSessions.set(err.error?.activeSessions ?? []);\n this.pendingCredentials.set(credentials);\n reject('conflict');\n } else {\n reject(err.message ?? 'Unable to login');\n }\n } finally {\n this.authenticating.set(false);\n subscription.unsubscribe();\n this.#thinkingService.stopThinking();\n }\n },\n });\n });\n }\n\n async #doRefresh(): Promise<boolean> {\n try {\n const response = await fetch(this.#authUrls.refresh, {\n method: 'POST',\n headers: {\n [HttpHeader.Authorization]: this.#auth,\n [HttpHeader.AppContext]: 'brokenstock',\n },\n credentials: 'include',\n });\n if (!response.ok) return false;\n const auth = response.headers.get(HttpHeader.Authorization);\n if (!auth || !BEARER_TOKEN_REGEX.test(auth)) return false;\n const body: AuthenticationResponse = await response.json();\n this.#auth = auth as BearerToken;\n this.userSession.set(body.session);\n this.effectivePermissions.set(body.effectivePermissions ?? {});\n return true;\n } catch {\n return false;\n }\n }\n\n #clearSession(): void {\n this.authenticated.set(false);\n this.userSession.set(undefined);\n this.effectivePermissions.set({});\n this.conflictSessions.set(undefined);\n this.pendingCredentials.set(undefined);\n this.#auth = 'Bearer ..' as BearerToken;\n this.#router.navigate(['/login']).catch(console.error);\n }\n}\n","import { inject } from '@angular/core';\nimport {\n ActivatedRouteSnapshot,\n CanActivateFn,\n Router,\n RouterStateSnapshot,\n} from '@angular/router';\nimport { AuthenticationService } from '../services/authentication.service';\n\nexport const authGuard: CanActivateFn = (\n _route: ActivatedRouteSnapshot,\n state: RouterStateSnapshot,\n) => {\n const authService = inject(AuthenticationService);\n const router = inject(Router);\n\n if (authService.authenticated()) {\n return true;\n }\n return router.createUrlTree(['/login'], {\n queryParams: { returnUrl: state.url },\n });\n};\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\nimport { AuthenticationService } from '../services/authentication.service';\nimport { SHELL_POST_LOGIN_ROUTE } from '../tokens/shell-tokens';\n\nexport const guestGuard: CanActivateFn = () => {\n const authService = inject(AuthenticationService);\n const router = inject(Router);\n const postLoginRoute = inject(SHELL_POST_LOGIN_ROUTE, { optional: true }) ?? '/';\n\n if (authService.authenticated()) {\n return router.parseUrl(postLoginRoute);\n }\n return true;\n};\n","import { HttpInterceptorFn } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { from, switchMap, catchError, tap, throwError } from 'rxjs';\nimport { AuthenticationService } from '../services/authentication.service';\nimport { ThinkingService } from '../services/thinking.service';\nimport { SHELL_AUTH_URLS } from '../tokens/shell-tokens';\nimport { HttpHeader } from '@franzzemen/utility';\n\nexport const authInterceptor: HttpInterceptorFn = (req, next) => {\n const authService = inject(AuthenticationService);\n const thinkingService = inject(ThinkingService);\n const authUrls = inject(SHELL_AUTH_URLS);\n const router = inject(Router);\n\n return next(req).pipe(\n tap({\n next: (event) => {\n if ('headers' in event && event.headers?.get('x-permissions-stale') === 'true') {\n authService.refresh();\n }\n },\n }),\n catchError((error) => {\n const isRefreshOrLogin = req.url === authUrls.refresh || req.url === authUrls.login;\n if (error.status === 401 && !isRefreshOrLogin) {\n return from(authService.refresh()).pipe(\n switchMap((refreshed) => {\n if (refreshed) {\n const retryReq = req.clone({\n setHeaders: { [HttpHeader.Authorization]: authService.auth },\n });\n return next(retryReq);\n }\n thinkingService.reset();\n authService.authenticated.set(false);\n authService.userSession.set(undefined);\n router.navigate(['/login']);\n return throwError(() => error);\n }),\n catchError(() => {\n thinkingService.reset();\n authService.authenticated.set(false);\n authService.userSession.set(undefined);\n router.navigate(['/login']);\n return throwError(() => error);\n }),\n );\n }\n return throwError(() => error);\n }),\n );\n};\n","import { Directive, input } from '@angular/core';\nimport { AbstractControl, NG_VALIDATORS, ValidationErrors, Validator } from '@angular/forms';\n\n@Directive({\n selector: '[regexValidator]',\n providers: [{ provide: NG_VALIDATORS, useExisting: RegexValidatorDirective, multi: true }],\n})\nexport class RegexValidatorDirective implements Validator {\n regex = input(/^[A-Z0-9._%+-@!?]{4,64}$/i);\n\n validate(control: AbstractControl): ValidationErrors | null {\n if (!control.value || !this.regex().test(control.value)) {\n return { regexValidator: { value: control.value } };\n }\n return null;\n }\n}\n","/**\n * Shared types for the FAQ help system.\n *\n * Manifest is generated by the build-time validator (E9) and read at runtime\n * by FaqContentLoader (E1) and FaqService (E2).\n */\n\nexport type FaqAudience = 'public' | 'authenticated';\nexport type FaqRenderContext = 'modal' | 'page';\n\n/** Raw frontmatter as authored in the `.md` file. */\nexport interface FaqFrontmatter {\n title: string;\n category: string;\n order?: number;\n audience?: FaqAudience;\n 'image-prefix'?: string;\n description?: string;\n 'seo-ready'?: boolean;\n}\n\n/** One row in the generated manifest — normalized form of frontmatter + file path. */\nexport interface FaqEntry {\n /** Dot-notation key, e.g. \"trade.segments\". */\n key: string;\n title: string;\n category: string;\n order: number;\n audience: FaqAudience;\n description?: string;\n seoReady: boolean;\n imagePrefix?: string;\n /**\n * Path to the source file relative to `/assets/faq/`, without `.md`.\n * Example: `trade/segments` (subdirs allowed; key path-separator is `.`,\n * file path-separator is `/`).\n */\n file: string;\n}\n\nexport interface FaqManifest {\n /** ISO timestamp set by the validator at generation time. */\n generatedAt: string;\n entries: FaqEntry[];\n}\n\nexport interface ParsedFaq {\n frontmatter: FaqFrontmatter;\n body: string;\n}\n\nexport interface FaqRenderOptions {\n context: FaqRenderContext;\n /**\n * Optional override for the entry's `image-prefix` frontmatter.\n * When set, relative image hrefs are prefixed with this string.\n */\n imagePrefix?: string;\n}\n","import { InjectionToken } from '@angular/core';\nimport { FaqManifest } from './faq.types';\n\n/**\n * Pluggable content source for FAQ markdown + manifest.\n *\n * Default implementation is `HttpFaqContentLoader`, which fetches from\n * `/assets/faq/manifest.json` and `/assets/faq/<file>.md`. Consumer apps\n * may override (e.g. broken-stock-admin pulling from an internal source),\n * but most apps will just use the HTTP default.\n */\nexport interface FaqContentLoader {\n /** Loads (and may cache) the manifest. Idempotent. */\n loadManifest(): Promise<FaqManifest>;\n\n /**\n * Resolves the manifest entry for `key`, then loads its .md body.\n * Returns `null` when the key is not in the manifest.\n */\n loadContent(key: string): Promise<string | null>;\n}\n\nexport const FAQ_CONTENT_LOADER = new InjectionToken<FaqContentLoader>(\n 'FAQ_CONTENT_LOADER',\n);\n","import { Injectable } from '@angular/core';\nimport { Marked, Renderer } from 'marked';\nimport { gfmHeadingId } from 'marked-gfm-heading-id';\nimport fm from 'front-matter';\nimport { FaqFrontmatter, FaqRenderOptions, ParsedFaq } from './faq.types';\n\n/**\n * Stateless markdown renderer for FAQ content.\n *\n * Two responsibilities:\n * 1. Split a `.md` file into `{ frontmatter, body }` (front-matter parser).\n * 2. Render the body to HTML via marked with a context-aware link hook:\n * - `faq:<key>` — in-modal nav (modal) | `<a href=\"/help/<file>\">` (page)\n * - `app:/path` — close-modal-and-route (modal) | `<a href=\"/path\">` (page)\n * - `http(s)://...` — external, target=_blank rel=noopener (both)\n * - `#anchor` — intra-page scroll (both)\n *\n * In modal context, links are emitted with `data-faq-href` / `data-faq-kind`\n * sentinels so the modal's click handler (E5) can intercept and dispatch.\n * In page context, links are emitted as plain navigable anchors; the prerendered\n * static HTML can be clicked through directly.\n */\n@Injectable({ providedIn: 'root' })\nexport class FaqMarkdownRendererService {\n parse(raw: string): ParsedFaq {\n const parsed = fm<FaqFrontmatter>(raw);\n return {\n frontmatter: parsed.attributes,\n body: parsed.body,\n };\n }\n\n render(body: string, opts: FaqRenderOptions): string {\n const marked = new Marked({ gfm: true, breaks: false });\n marked.use(gfmHeadingId());\n marked.use({ renderer: this.buildRenderer(opts) });\n return marked.parse(body, { async: false }) as string;\n }\n\n private buildRenderer(opts: FaqRenderOptions): Partial<Renderer> {\n const { context, imagePrefix } = opts;\n return {\n link: ({ href, title, tokens }) => {\n // marked passes child tokens; we render their textual form ourselves.\n const text = tokens.map((t) => ('text' in t ? t.text : '')).join('');\n const titleAttr = title ? ` title=\"${escapeAttr(title)}\"` : '';\n\n // Intra-page anchor\n if (href.startsWith('#')) {\n return `<a href=\"${escapeAttr(href)}\"${titleAttr} data-faq-kind=\"anchor\">${text}</a>`;\n }\n\n // faq: protocol — in-modal nav (modal) | static link to /help/<key path> (page)\n if (href.startsWith('faq:')) {\n const key = href.slice('faq:'.length);\n if (context === 'modal') {\n return `<a href=\"#\" data-faq-href=\"${escapeAttr(href)}\" data-faq-kind=\"faq\">${text}</a>`;\n }\n const filePath = key.replace(/\\./g, '/');\n return `<a href=\"/help/${escapeAttr(filePath)}\"${titleAttr} data-faq-kind=\"faq\">${text}</a>`;\n }\n\n // app: protocol — close modal + route (modal) | normal anchor (page)\n if (href.startsWith('app:')) {\n const path = href.slice('app:'.length);\n if (context === 'modal') {\n return `<a href=\"#\" data-faq-href=\"${escapeAttr(href)}\" data-faq-kind=\"app\">${text} <span class=\"faq-app-arrow\" aria-hidden=\"true\">→</span></a>`;\n }\n return `<a href=\"${escapeAttr(path)}\"${titleAttr} data-faq-kind=\"app\">${text} <span class=\"faq-app-arrow\" aria-hidden=\"true\">→</span></a>`;\n }\n\n // External\n if (/^https?:\\/\\//i.test(href)) {\n return `<a href=\"${escapeAttr(href)}\"${titleAttr} target=\"_blank\" rel=\"noopener\" data-faq-kind=\"external\">${text}</a>`;\n }\n\n // Fallback: treat as relative; render plain anchor.\n return `<a href=\"${escapeAttr(href)}\"${titleAttr}>${text}</a>`;\n },\n image: ({ href, title, text }) => {\n const resolved = resolveImageHref(href, imagePrefix);\n const titleAttr = title ? ` title=\"${escapeAttr(title)}\"` : '';\n return `<img src=\"${escapeAttr(resolved)}\" alt=\"${escapeAttr(text)}\"${titleAttr} loading=\"lazy\" />`;\n },\n };\n }\n}\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<');\n}\n\nfunction resolveImageHref(href: string, prefix: string | undefined): string {\n if (!prefix) return href;\n if (/^([a-z]+:)?\\/\\//i.test(href) || href.startsWith('/')) return href;\n const cleaned = prefix.endsWith('/') ? prefix : `${prefix}/`;\n return `${cleaned}${href}`;\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { FaqContentLoader } from './faq-content-loader.token';\nimport { FaqEntry, FaqManifest } from './faq.types';\n\n/**\n * Default FaqContentLoader. Reads the build-generated manifest from\n * `/assets/faq/manifest.json` and lazy-fetches individual `.md` files\n * from `/assets/faq/<entry.file>.md`.\n *\n * Manifest is cached after first load; .md fetches are cached per key.\n */\n@Injectable({ providedIn: 'root' })\nexport class HttpFaqContentLoader implements FaqContentLoader {\n private readonly http = inject(HttpClient);\n private manifestPromise: Promise<FaqManifest> | null = null;\n private readonly contentCache = new Map<string, Promise<string | null>>();\n\n loadManifest(): Promise<FaqManifest> {\n if (!this.manifestPromise) {\n this.manifestPromise = firstValueFrom(\n this.http.get<FaqManifest>('/assets/faq/manifest.json'),\n ).catch((err) => {\n this.manifestPromise = null;\n throw err;\n });\n }\n return this.manifestPromise;\n }\n\n async loadContent(key: string): Promise<string | null> {\n const cached = this.contentCache.get(key);\n if (cached) return cached;\n\n const manifest = await this.loadManifest();\n const entry = manifest.entries.find((e: FaqEntry) => e.key === key);\n if (!entry) return null;\n\n const fetchPromise = firstValueFrom(\n this.http.get(`/assets/faq/${entry.file}.md`, { responseType: 'text' }),\n ).catch(() => null);\n this.contentCache.set(key, fetchPromise);\n return fetchPromise;\n }\n}\n","import { Injectable, signal } from '@angular/core';\n\n/**\n * E8 — In-modal navigation history.\n *\n * The browser's `history` API is shared by Angular Router and any other\n * code that calls `pushState`. We tag each FAQ entry's state object with\n * `faq: true` so we can distinguish our entries from router/app entries.\n *\n * On open: `pushState({faq:true, faqPosition:0})` once; stack=[initialKey].\n * On in-modal nav: truncate forward, push key, `pushState({faq:true,\n * faqPosition:position})`.\n * On browser back/forward (`popstate`):\n * - If next state has `faq:true` → set position to its `faqPosition`,\n * swap content for `stack[position]`.\n * - If next state lacks `faq:true` (user backed out of the modal entirely)\n * → close modal without further history manipulation.\n * On explicit close (close button / Esc / backdrop): `history.go(-(position+1))`\n * to unwind our entries; suppress in-flight popstates while unwinding;\n * finalize close once we've seen the expected number of popstates.\n */\n@Injectable({ providedIn: 'root' })\nexport class FaqHistoryService {\n private readonly _stack = signal<string[]>([]);\n private readonly _position = signal(0);\n readonly stack = this._stack.asReadonly();\n readonly position = this._position.asReadonly();\n\n /** True when popstate is processing the unwind kicked off by closeAndUnwind(). */\n private unwinding = false;\n private unwindRemaining = 0;\n private onUnwindComplete: (() => void) | null = null;\n\n private popstateListener: ((e: PopStateEvent) => void) | null = null;\n private onInModalNav: ((key: string) => void) | null = null;\n private onExitModal: (() => void) | null = null;\n\n /**\n * Begin a new FAQ history session. Pushes the initial state entry and\n * starts listening for popstate. Callbacks fire for in-modal navs and\n * for popping out of FAQ entirely.\n */\n begin(\n initialKey: string,\n onNav: (key: string) => void,\n onExit: () => void,\n ): void {\n this._stack.set([initialKey]);\n this._position.set(0);\n this.onInModalNav = onNav;\n this.onExitModal = onExit;\n this.pushHistoryState(0);\n this.attachListener();\n }\n\n /** Push a new key onto the stack. Truncates any forward history. */\n navigate(key: string): void {\n const stack = this._stack();\n const pos = this._position();\n const next = [...stack.slice(0, pos + 1), key];\n const nextPos = next.length - 1;\n this._stack.set(next);\n this._position.set(nextPos);\n this.pushHistoryState(nextPos);\n }\n\n canGoBack(): boolean {\n return this._position() > 0;\n }\n\n canGoForward(): boolean {\n return this._position() < this._stack().length - 1;\n }\n\n /** Programmatic back — triggers a real browser back so popstate handles UI. */\n back(): void {\n if (!this.canGoBack()) return;\n history.back();\n }\n\n forward(): void {\n if (!this.canGoForward()) return;\n history.forward();\n }\n\n /** Currently rendered key. */\n currentKey(): string | null {\n return this._stack()[this._position()] ?? null;\n }\n\n /**\n * Close the modal cleanly by unwinding our FAQ history entries so the\n * underlying app route is left exactly where it was before the modal opened.\n * `onComplete` fires after the unwind settles.\n */\n closeAndUnwind(onComplete: () => void): void {\n const depth = this._position() + 1;\n if (depth === 0) {\n this.teardown();\n onComplete();\n return;\n }\n this.unwinding = true;\n this.unwindRemaining = depth;\n this.onUnwindComplete = () => {\n this.teardown();\n onComplete();\n };\n history.go(-depth);\n }\n\n private teardown(): void {\n this._stack.set([]);\n this._position.set(0);\n this.detachListener();\n this.onInModalNav = null;\n this.onExitModal = null;\n this.unwinding = false;\n this.unwindRemaining = 0;\n this.onUnwindComplete = null;\n }\n\n private pushHistoryState(position: number): void {\n history.pushState({ faq: true, faqPosition: position }, '');\n }\n\n private attachListener(): void {\n if (this.popstateListener) return;\n this.popstateListener = (e: PopStateEvent) => this.handlePopState(e);\n window.addEventListener('popstate', this.popstateListener);\n }\n\n private detachListener(): void {\n if (!this.popstateListener) return;\n window.removeEventListener('popstate', this.popstateListener);\n this.popstateListener = null;\n }\n\n private handlePopState(e: PopStateEvent): void {\n if (this.unwinding) {\n this.unwindRemaining--;\n if (this.unwindRemaining <= 0) {\n const cb = this.onUnwindComplete;\n this.onUnwindComplete = null;\n cb?.();\n }\n return;\n }\n const state = e.state as { faq?: boolean; faqPosition?: number } | null;\n if (state?.faq && typeof state.faqPosition === 'number') {\n // In-modal back/forward\n const target = state.faqPosition;\n this._position.set(target);\n const key = this._stack()[target];\n if (key && this.onInModalNav) this.onInModalNav(key);\n return;\n }\n // User backed out beyond our entries — close modal, leave history alone.\n const exit = this.onExitModal;\n this.teardown();\n exit?.();\n }\n}\n","import { Injectable, computed, inject, signal } from '@angular/core';\nimport { AuthenticationService } from '../services/authentication.service';\nimport { FAQ_CONTENT_LOADER } from './faq-content-loader.token';\nimport { FaqHistoryService } from './faq-history.service';\nimport { FaqAudience, FaqEntry, FaqManifest } from './faq.types';\n\nexport interface FaqRegistrationHandle {\n /** Call from the component's destroy hook (or DestroyRef) to clear the registration. */\n deregister(): void;\n}\n\nexport interface FaqResolution {\n /** The key that produced a content match, or `null` when nothing matched. */\n key: string | null;\n /** Raw .md content for `key`, or `null` when nothing matched. */\n content: string | null;\n /** The entry whose content was returned, or `null` when nothing matched. */\n entry: FaqEntry | null;\n /**\n * The chain of keys actually attempted, in order\n * (e.g. `[\"trade.segments\", \"trade\", \"index\"]`).\n */\n attempted: string[];\n}\n\n/**\n * Central FAQ state + resolution service.\n *\n * Responsibilities:\n * - Track the current route's FAQ key (set by components on activation /\n * tab change via `register()`).\n * - Lazy-load and cache the FAQ manifest from the configured FaqContentLoader.\n * - Resolve a dot-notation key against the manifest with parent fallback,\n * audience filtering, and `index` as the terminal fallback.\n */\n@Injectable({ providedIn: 'root' })\nexport class FaqService {\n private readonly loader = inject(FAQ_CONTENT_LOADER);\n private readonly history = inject(FaqHistoryService);\n private readonly auth = inject(AuthenticationService);\n\n private readonly _currentFaqKey = signal<string | null>(null);\n /** Component-set current key. Bare `faq` opens at this key. */\n readonly currentFaqKey = this._currentFaqKey.asReadonly();\n\n private readonly _manifest = signal<FaqManifest | null>(null);\n readonly manifest = this._manifest.asReadonly();\n readonly entries = computed(() => this._manifest()?.entries ?? []);\n\n // Modal state (E3 + E8).\n private readonly _modalOpen = signal(false);\n readonly modalOpen = this._modalOpen.asReadonly();\n\n private readonly _activeEntry = signal<FaqEntry | null>(null);\n readonly activeEntry = this._activeEntry.asReadonly();\n\n private readonly _activeContent = signal<string | null>(null);\n readonly activeContent = this._activeContent.asReadonly();\n\n private readonly _activeAttempted = signal<string[]>([]);\n readonly activeAttempted = this._activeAttempted.asReadonly();\n\n private readonly _navigating = signal(false);\n readonly navigating = this._navigating.asReadonly();\n\n // Search pre-fill consumed by E4 search UI on modal open / navigateTo.\n private readonly _initialSearchTerm = signal<string | null>(null);\n readonly initialSearchTerm = this._initialSearchTerm.asReadonly();\n\n /** Called by the search UI once it has consumed the pre-fill term. */\n consumeInitialSearchTerm(): void {\n this._initialSearchTerm.set(null);\n }\n\n readonly canGoBack = computed(() => this.history.position() > 0);\n readonly canGoForward = computed(\n () => this.history.position() < this.history.stack().length - 1,\n );\n\n private manifestPromise: Promise<FaqManifest> | null = null;\n\n /**\n * Triggers manifest load if not already loaded. Idempotent. Subsequent\n * calls return the cached promise.\n */\n ensureManifest(): Promise<FaqManifest> {\n if (this._manifest()) return Promise.resolve(this._manifest()!);\n if (!this.manifestPromise) {\n this.manifestPromise = this.loader\n .loadManifest()\n .then((m) => {\n this._manifest.set(m);\n return m;\n })\n .catch((err) => {\n this.manifestPromise = null;\n throw err;\n });\n }\n return this.manifestPromise;\n }\n\n /**\n * Walks the dot-notation fallback chain (`a.b.c` → `a.b` → `a` → `index`)\n * and returns the first entry whose audience allows the caller and whose\n * content loads. Audience filtering: unauthenticated callers only see\n * `audience: public` entries.\n */\n async resolveKey(\n key: string | null,\n isAuthenticated: boolean,\n ): Promise<FaqResolution> {\n await this.ensureManifest();\n const entries = this.entries();\n const chain = buildFallbackChain(key);\n\n for (const candidate of chain) {\n const entry = entries.find((e) => e.key === candidate);\n if (!entry) continue;\n if (!audienceAllowed(entry.audience, isAuthenticated)) continue;\n const content = await this.loader.loadContent(entry.key);\n if (content === null) continue;\n return { key: entry.key, content, entry, attempted: chain };\n }\n\n return { key: null, content: null, entry: null, attempted: chain };\n }\n\n /**\n * Component registration. Sets `currentFaqKey`; on `deregister()` the\n * key is cleared only if it still matches (so a sibling tab activating\n * mid-teardown doesn't get its key clobbered).\n */\n register(key: string): FaqRegistrationHandle {\n this._currentFaqKey.set(key);\n return {\n deregister: () => {\n if (this._currentFaqKey() === key) this._currentFaqKey.set(null);\n },\n };\n }\n\n /**\n * E3 — Open the FAQ modal. If `initialKey` is omitted, falls back to\n * `currentFaqKey` and then to `'index'`. Resolves the key, loads content,\n * and starts an E8 history session so subsequent in-modal nav uses\n * `history.pushState`.\n */\n async openModal(\n initialKey?: string,\n opts?: { searchTerm?: string },\n ): Promise<void> {\n const searchTerm = opts?.searchTerm?.trim();\n this._initialSearchTerm.set(searchTerm && searchTerm.length > 0 ? searchTerm : null);\n if (this._modalOpen()) {\n // Already open — treat as a navigate-to instead.\n if (initialKey) await this.navigateTo(initialKey);\n return;\n }\n const target = initialKey ?? this._currentFaqKey() ?? 'index';\n this._modalOpen.set(true);\n await this.loadIntoActive(target);\n const resolved = this._activeEntry()?.key ?? target;\n this.history.begin(\n resolved,\n (key) => {\n // popstate-driven in-modal nav: load without pushing a new entry.\n void this.loadIntoActive(key);\n },\n () => {\n // User backed out of FAQ history entirely — close without unwinding.\n this.finalizeClose();\n },\n );\n }\n\n /**\n * Programmatic in-modal nav. Pushes a new history entry and loads `key`\n * into the active slot. Use this for click handlers on `faq:` links and\n * for the TOC sidebar.\n */\n async navigateTo(key: string): Promise<void> {\n if (!this._modalOpen()) {\n await this.openModal(key);\n return;\n }\n await this.loadIntoActive(key);\n const resolved = this._activeEntry()?.key ?? key;\n this.history.navigate(resolved);\n }\n\n back(): void {\n this.history.back();\n }\n forward(): void {\n this.history.forward();\n }\n\n /**\n * Close button / Esc / backdrop close. Unwinds the FAQ history entries\n * so the underlying app route is left untouched.\n */\n closeModal(): void {\n if (!this._modalOpen()) return;\n this.history.closeAndUnwind(() => this.finalizeClose());\n }\n\n private finalizeClose(): void {\n this._modalOpen.set(false);\n this._activeContent.set(null);\n this._activeEntry.set(null);\n this._activeAttempted.set([]);\n }\n\n private async loadIntoActive(key: string): Promise<void> {\n this._navigating.set(true);\n try {\n const resolution = await this.resolveKey(key, this.auth.authenticated());\n this._activeEntry.set(resolution.entry);\n this._activeContent.set(resolution.content);\n this._activeAttempted.set(resolution.attempted);\n } finally {\n this._navigating.set(false);\n }\n }\n}\n\nexport function buildFallbackChain(key: string | null): string[] {\n if (!key) return ['index'];\n const parts = key.split('.').filter(Boolean);\n if (parts.length === 0) return ['index'];\n const chain: string[] = [];\n for (let i = parts.length; i > 0; i--) {\n chain.push(parts.slice(0, i).join('.'));\n }\n chain.push('index');\n return chain;\n}\n\nexport function audienceAllowed(\n audience: FaqAudience,\n isAuthenticated: boolean,\n): boolean {\n if (audience === 'public') return true;\n return isAuthenticated;\n}\n","import { InjectionToken, isDevMode } from '@angular/core';\n\n/**\n * Gate for the dev-only FAQ authoring panel (E11).\n *\n * Defaults to Angular's `isDevMode()` so the panel auto-enables in `ng serve`\n * and auto-disables in production builds. Consumers can override with an\n * explicit value (e.g. `!environment.production`, or `true` for a staging\n * diagnostic build) via `{provide: FAQ_DEV_MODE, useValue: ...}`.\n *\n * The panel is loaded via dynamic `import()` and lives in its own lazy chunk;\n * builds where this resolves to `false` never request the chunk.\n */\nexport const FAQ_DEV_MODE = new InjectionToken<boolean>('FAQ_DEV_MODE', {\n providedIn: 'root',\n factory: () => isDevMode(),\n});\n\n/**\n * Optional absolute filesystem root of the consuming app's workspace (e.g.\n * `/Users/foo/dev/broken-stock`). When set, the authoring panel emits\n * `webstorm://open?file=<root>/<relative-path>` deeplinks pointing at the\n * exact source file. When unset, the panel falls back to a relative path.\n */\nexport const FAQ_DEV_WORKSPACE_ROOT = new InjectionToken<string>(\n 'FAQ_DEV_WORKSPACE_ROOT',\n { providedIn: 'root', factory: () => '' },\n);\n\n/**\n * Editor URL scheme for the \"Open in editor\" deeplink. Defaults to WebStorm.\n * Set to `'vscode'` (or any custom scheme handler) per consuming app.\n */\nexport type FaqDevEditor = 'webstorm' | 'vscode';\nexport const FAQ_DEV_EDITOR = new InjectionToken<FaqDevEditor>(\n 'FAQ_DEV_EDITOR',\n { providedIn: 'root', factory: () => 'webstorm' },\n);\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n ViewChild,\n computed,\n effect,\n inject,\n signal,\n untracked,\n} from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AuthenticationService } from '../../services/authentication.service';\nimport { FaqAuthoringPanel } from '../faq-authoring-panel/faq-authoring-panel';\nimport { FAQ_CONTENT_LOADER } from '../faq-content-loader.token';\nimport { FAQ_DEV_MODE } from '../faq-dev-mode.token';\nimport { FaqMarkdownRendererService } from '../faq-markdown-renderer.service';\nimport { FaqService } from '../faq.service';\nimport { FaqEntry } from '../faq.types';\n\ninterface TocGroup {\n category: string;\n entries: FaqEntry[];\n}\n\ninterface SearchResult {\n key: string;\n title: string;\n category: string;\n snippet: string;\n}\n\n// Minimal structural type so we don't depend on fuse.js types at parse time\n// (the package is dynamic-imported on first search activation).\ninterface FuseLike<T> {\n search(query: string): Array<{\n item: T;\n matches?: ReadonlyArray<{\n key?: string;\n indices: ReadonlyArray<readonly [number, number]>;\n }>;\n }>;\n}\n\ninterface SearchDoc {\n key: string;\n title: string;\n category: string;\n body: string;\n}\n\n/**\n * E3 — FAQ modal. Two-pane layout (TOC sidebar + content pane), 80% viewport.\n *\n * E4 — Search uses a lazy-imported `fuse.js` index over title + body,\n * built on first search activation, filtered by audience, cached for the\n * modal session and invalidated on auth state change.\n *\n * E5 — `app:` link clicks close the modal and route to the app path; the\n * returnUrl-aware `authGuard` funnels unauthenticated users through\n * `/login?returnUrl=...`, and `Login` honors returnUrl on success.\n */\n@Component({\n selector: 'faq-modal',\n standalone: true,\n imports: [FaqAuthoringPanel],\n templateUrl: './faq-modal.html',\n styleUrl: './faq-modal.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FaqModal {\n readonly devMode = inject(FAQ_DEV_MODE);\n\n private readonly faq = inject(FaqService);\n private readonly renderer = inject(FaqMarkdownRendererService);\n private readonly auth = inject(AuthenticationService);\n private readonly router = inject(Router);\n private readonly loader = inject(FAQ_CONTENT_LOADER);\n\n readonly open = this.faq.modalOpen;\n readonly navigating = this.faq.navigating;\n readonly activeEntry = this.faq.activeEntry;\n readonly attempted = this.faq.activeAttempted;\n readonly canGoBack = this.faq.canGoBack;\n readonly canGoForward = this.faq.canGoForward;\n\n readonly sidebarCollapsed = signal(false);\n readonly searchMode = signal(false);\n readonly searchQuery = signal('');\n readonly searchLoading = signal(false);\n readonly searchResults = signal<SearchResult[]>([]);\n\n private fuse: FuseLike<SearchDoc> | null = null;\n private fuseBuild: Promise<void> | null = null;\n\n readonly renderedHtml = computed(() => {\n const content = this.faq.activeContent();\n const entry = this.faq.activeEntry();\n if (!content) return '';\n const parsed = this.renderer.parse(content);\n return this.renderer.render(parsed.body, {\n context: 'modal',\n imagePrefix: entry?.imagePrefix ?? parsed.frontmatter['image-prefix'],\n });\n });\n\n readonly toc = computed<TocGroup[]>(() => {\n const isAuth = this.auth.authenticated();\n const entries = this.faq.entries().filter((e) => {\n if (e.audience === 'public') return true;\n return isAuth;\n });\n const groups = new Map<string, FaqEntry[]>();\n for (const e of entries) {\n const list = groups.get(e.category) ?? [];\n list.push(e);\n groups.set(e.category, list);\n }\n return [...groups.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([category, list]) => ({\n category,\n entries: list.sort(\n (a, b) =>\n a.order - b.order || a.title.localeCompare(b.title),\n ),\n }));\n });\n\n @ViewChild('contentPane') contentPaneRef?: ElementRef<HTMLDivElement>;\n\n constructor() {\n // Scroll content pane to top on key change.\n effect(() => {\n this.activeEntry();\n queueMicrotask(() => {\n this.contentPaneRef?.nativeElement.scrollTo({ top: 0 });\n });\n });\n\n // Invalidate the search index on auth state change so the audience\n // filter is re-applied on next search activation.\n effect(() => {\n this.auth.authenticated();\n this.fuse = null;\n this.fuseBuild = null;\n if (this.searchMode()) this.searchResults.set([]);\n });\n\n // Consume `faq search <term>` pre-fill: when FaqService.initialSearchTerm\n // is non-null while the modal is open, switch to search mode with that\n // query and immediately invoke the index build.\n effect(() => {\n const term = this.faq.initialSearchTerm();\n if (!term || !this.faq.modalOpen()) return;\n untracked(() => {\n this.searchMode.set(true);\n this.searchQuery.set(term);\n this.faq.consumeInitialSearchTerm();\n void this.ensureSearchIndex().then(() => this.runSearch(term));\n });\n });\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.open()) this.close();\n }\n\n close(): void {\n this.faq.closeModal();\n }\n\n onBackdropClick(): void {\n this.close();\n }\n\n stopPropagation(event: Event): void {\n event.stopPropagation();\n }\n\n toggleSidebar(): void {\n this.sidebarCollapsed.update((v) => !v);\n }\n\n goBack(): void {\n this.faq.back();\n }\n\n goForward(): void {\n this.faq.forward();\n }\n\n goIndex(): void {\n void this.faq.navigateTo('index');\n }\n\n toggleSearch(): void {\n const next = !this.searchMode();\n this.searchMode.set(next);\n if (next) {\n void this.ensureSearchIndex().then(() => this.runSearch(this.searchQuery()));\n }\n }\n\n onSearchInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.searchQuery.set(value);\n void this.ensureSearchIndex().then(() => this.runSearch(value));\n }\n\n onSearchResultClick(key: string): void {\n void this.faq.navigateTo(key);\n }\n\n onTocClick(key: string): void {\n void this.faq.navigateTo(key);\n }\n\n private async ensureSearchIndex(): Promise<void> {\n if (this.fuse) return;\n if (this.fuseBuild) return this.fuseBuild;\n this.searchLoading.set(true);\n this.fuseBuild = (async () => {\n const [{ default: Fuse }] = await Promise.all([\n import('fuse.js'),\n this.faq.ensureManifest(),\n ]);\n const isAuth = this.auth.authenticated();\n const entries = this.faq.entries().filter((e) =>\n e.audience === 'public' ? true : isAuth,\n );\n const docs: SearchDoc[] = await Promise.all(\n entries.map(async (e) => {\n const body = (await this.loader.loadContent(e.key)) ?? '';\n return { key: e.key, title: e.title, category: e.category, body };\n }),\n );\n this.fuse = new Fuse(docs, {\n keys: [\n { name: 'title', weight: 0.6 },\n { name: 'body', weight: 0.4 },\n ],\n includeMatches: true,\n ignoreLocation: true,\n threshold: 0.4,\n minMatchCharLength: 2,\n }) as unknown as FuseLike<SearchDoc>;\n })()\n .catch((err) => {\n console.error('FAQ search index build failed', err);\n this.fuseBuild = null;\n })\n .finally(() => {\n this.searchLoading.set(false);\n });\n return this.fuseBuild;\n }\n\n private runSearch(query: string): void {\n const q = query.trim();\n if (!q || !this.fuse) {\n this.searchResults.set([]);\n return;\n }\n const hits = this.fuse.search(q).slice(0, 30);\n this.searchResults.set(\n hits.map((h) => ({\n key: h.item.key,\n title: h.item.title,\n category: h.item.category,\n snippet: buildSnippet(h.item.body, h.matches),\n })),\n );\n }\n\n /**\n * Event-delegated click handler for the rendered content pane.\n * Intercepts our sentinel anchors emitted by FaqMarkdownRendererService.\n */\n onContentClick(event: MouseEvent): void {\n const target = event.target;\n if (!(target instanceof HTMLElement)) return;\n const anchor = target.closest<HTMLAnchorElement>('a[data-faq-kind]');\n if (!anchor) return;\n const kind = anchor.getAttribute('data-faq-kind');\n\n if (kind === 'external') {\n return;\n }\n\n if (kind === 'anchor') {\n event.preventDefault();\n const href = anchor.getAttribute('href') ?? '';\n const id = href.startsWith('#') ? href.slice(1) : href;\n if (!id) return;\n const pane = this.contentPaneRef?.nativeElement;\n const el = pane?.querySelector(`#${CSS.escape(id)}`);\n el?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n return;\n }\n\n const faqHref = anchor.getAttribute('data-faq-href') ?? '';\n\n if (kind === 'faq' && faqHref.startsWith('faq:')) {\n event.preventDefault();\n const key = faqHref.slice('faq:'.length);\n void this.faq.navigateTo(key);\n return;\n }\n\n if (kind === 'app' && faqHref.startsWith('app:')) {\n event.preventDefault();\n const path = faqHref.slice('app:'.length);\n this.close();\n // Defer route until after modal close finishes unwinding history,\n // so navigation lands as a fresh entry on top of the pre-modal URL.\n // The returnUrl-aware authGuard handles unauthenticated callers by\n // redirecting to /login?returnUrl=<path>; Login honors it on success.\n queueMicrotask(() => {\n void this.router.navigateByUrl(path);\n });\n return;\n }\n }\n}\n\n/**\n * Builds a short contextual snippet around the first body match. Falls back\n * to the head of the body when the only matches are in the title.\n */\nfunction buildSnippet(\n body: string,\n matches:\n | ReadonlyArray<{\n key?: string;\n indices: ReadonlyArray<readonly [number, number]>;\n }>\n | undefined,\n): string {\n const RADIUS = 60;\n const MAX = 180;\n const bodyMatch = matches?.find((m) => m.key === 'body' && m.indices.length);\n if (!bodyMatch) {\n return body.replace(/\\s+/g, ' ').slice(0, MAX).trim();\n }\n const [start, end] = bodyMatch.indices[0];\n const from = Math.max(0, start - RADIUS);\n const to = Math.min(body.length, end + RADIUS);\n let snippet = body.slice(from, to).replace(/\\s+/g, ' ').trim();\n if (from > 0) snippet = '…' + snippet;\n if (to < body.length) snippet = snippet + '…';\n return snippet.length > MAX ? snippet.slice(0, MAX) + '…' : snippet;\n}\n","@if (open()) {\n <div class=\"faq-backdrop\" (click)=\"onBackdropClick()\" role=\"presentation\">\n <div\n class=\"faq-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"activeEntry()?.title ?? 'FAQ'\"\n (click)=\"stopPropagation($event)\"\n >\n <header class=\"faq-toolbar\">\n <div class=\"faq-toolbar-nav\">\n <button\n type=\"button\"\n class=\"faq-icon-btn\"\n (click)=\"toggleSidebar()\"\n [attr.aria-label]=\"sidebarCollapsed() ? 'Show contents' : 'Hide contents'\"\n [attr.aria-pressed]=\"!sidebarCollapsed()\"\n >☰</button>\n <button\n type=\"button\"\n class=\"faq-icon-btn\"\n (click)=\"goBack()\"\n [disabled]=\"!canGoBack()\"\n aria-label=\"Back\"\n >‹</button>\n <button\n type=\"button\"\n class=\"faq-icon-btn\"\n (click)=\"goForward()\"\n [disabled]=\"!canGoForward()\"\n aria-label=\"Forward\"\n >›</button>\n <button\n type=\"button\"\n class=\"faq-icon-btn\"\n (click)=\"goIndex()\"\n aria-label=\"Index\"\n >⌂</button>\n </div>\n <div class=\"faq-toolbar-title\">\n @if (activeEntry(); as entry) {\n <span class=\"faq-category\">{{ entry.category }}</span>\n <span class=\"faq-sep\">/</span>\n <span class=\"faq-title\">{{ entry.title }}</span>\n } @else {\n <span class=\"faq-title\">FAQ</span>\n }\n </div>\n <div class=\"faq-toolbar-actions\">\n <button\n type=\"button\"\n class=\"faq-icon-btn\"\n (click)=\"toggleSearch()\"\n [class.active]=\"searchMode()\"\n aria-label=\"Search\"\n >⌕</button>\n <button\n type=\"button\"\n class=\"faq-icon-btn faq-close-btn\"\n (click)=\"close()\"\n aria-label=\"Close\"\n >✕</button>\n </div>\n </header>\n\n <div class=\"faq-body\" [class.sidebar-collapsed]=\"sidebarCollapsed()\">\n <aside class=\"faq-sidebar\" aria-label=\"FAQ contents\">\n @if (searchMode()) {\n <div class=\"faq-search\">\n <input\n type=\"search\"\n class=\"faq-search-input\"\n placeholder=\"Search FAQ…\"\n aria-label=\"Search FAQ\"\n [value]=\"searchQuery()\"\n (input)=\"onSearchInput($event)\"\n />\n @if (searchLoading()) {\n <p class=\"faq-search-status\">Building index…</p>\n } @else if (!searchQuery().trim()) {\n <p class=\"faq-search-status\">Type to search titles and content.</p>\n } @else if (searchResults().length === 0) {\n <p class=\"faq-search-status\">No matches.</p>\n } @else {\n <ul class=\"faq-search-results\">\n @for (r of searchResults(); track r.key) {\n <li>\n <button\n type=\"button\"\n class=\"faq-search-result\"\n [class.active]=\"activeEntry()?.key === r.key\"\n (click)=\"onSearchResultClick(r.key)\"\n >\n <span class=\"faq-search-result-title\">{{ r.title }}</span>\n <span class=\"faq-search-result-category\">{{ r.category }}</span>\n @if (r.snippet) {\n <span class=\"faq-search-result-snippet\">{{ r.snippet }}</span>\n }\n </button>\n </li>\n }\n </ul>\n }\n </div>\n } @else {\n <nav class=\"faq-toc\">\n @for (group of toc(); track group.category) {\n <div class=\"faq-toc-group\">\n <h3 class=\"faq-toc-category\">{{ group.category }}</h3>\n <ul>\n @for (entry of group.entries; track entry.key) {\n <li>\n <button\n type=\"button\"\n class=\"faq-toc-link\"\n [class.active]=\"activeEntry()?.key === entry.key\"\n (click)=\"onTocClick(entry.key)\"\n >{{ entry.title }}</button>\n </li>\n }\n </ul>\n </div>\n } @empty {\n <p class=\"faq-toc-empty\">No FAQ entries yet.</p>\n }\n </nav>\n }\n </aside>\n\n <main\n #contentPane\n class=\"faq-content\"\n (click)=\"onContentClick($event)\"\n >\n @if (navigating()) {\n <div class=\"faq-loading\">Loading…</div>\n } @else if (renderedHtml(); as html) {\n <article class=\"faq-article\" [innerHTML]=\"html\"></article>\n @if (devMode && activeEntry(); as entry) {\n @defer (when devMode) {\n <faq-authoring-panel\n mode=\"existing\"\n [key]=\"entry.key\"\n [attempted]=\"attempted()\"\n [entry]=\"entry\"\n />\n }\n }\n } @else {\n <div class=\"faq-empty\">\n <h2>No FAQ available</h2>\n <p>No content is registered for this route.</p>\n @if (attempted().length) {\n <p class=\"faq-empty-chain\">\n Attempted keys:\n <code>{{ attempted().join(' → ') }}</code>\n </p>\n }\n @if (devMode && attempted().length) {\n @defer (when devMode) {\n <faq-authoring-panel\n mode=\"missing\"\n [key]=\"attempted()[0]\"\n [attempted]=\"attempted()\"\n />\n } @loading (minimum 100ms) {\n <p class=\"faq-empty-hint\">Loading authoring panel…</p>\n }\n }\n </div>\n }\n </main>\n </div>\n </div>\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport {\n FAQ_DEV_EDITOR,\n FAQ_DEV_WORKSPACE_ROOT,\n FaqDevEditor,\n} from '../faq-dev-mode.token';\nimport { FaqService } from '../faq.service';\nimport { FaqEntry } from '../faq.types';\n\n/**\n * E11 — Dev-only FAQ authoring panel.\n *\n * Two modes, both dynamic-imported by `FaqModal` and gated behind\n * `FAQ_DEV_MODE`:\n * - `missing`: full scaffold panel rendered when no FAQ resolved.\n * - `existing`: collapsed source strip rendered below the article when an\n * entry IS resolved.\n *\n * The panel never imports `environment.*` directly — gating is the modal's\n * responsibility (via the FAQ_DEV_MODE token + dynamic import).\n */\n@Component({\n selector: 'faq-authoring-panel',\n standalone: true,\n imports: [NgClass],\n templateUrl: './faq-authoring-panel.html',\n styleUrl: './faq-authoring-panel.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FaqAuthoringPanel {\n private readonly faq = inject(FaqService);\n private readonly workspaceRoot = inject(FAQ_DEV_WORKSPACE_ROOT);\n private readonly editor: FaqDevEditor = inject(FAQ_DEV_EDITOR);\n\n /** `'missing'` shows the full scaffold; `'existing'` shows the collapsed strip. */\n readonly mode = input.required<'missing' | 'existing'>();\n /**\n * The dot-notation key actually being authored. For `missing` mode this is\n * the deepest attempted key (chain[0]); for `existing` it's the resolved key.\n */\n readonly key = input.required<string>();\n /** Fallback chain that was attempted. For `missing` every entry is missing. */\n readonly attempted = input<string[]>([]);\n /** Resolved entry — only set in `existing` mode. */\n readonly entry = input<FaqEntry | null>(null);\n\n readonly expanded = signal(false);\n readonly showAllFiles = signal(false);\n readonly copyState = signal<string | null>(null);\n\n readonly relPath = computed(() => {\n const e = this.entry();\n if (e) return `src/assets/faq/${e.file}.md`;\n return `src/assets/faq/${keyToFilePath(this.key())}.md`;\n });\n\n readonly absPath = computed(() => {\n const rel = this.relPath();\n return this.workspaceRoot ? joinPosix(this.workspaceRoot, rel) : rel;\n });\n\n readonly editorHref = computed(() => {\n const abs = this.absPath();\n if (this.editor === 'vscode') return `vscode://file/${abs}`;\n return `webstorm://open?file=${encodeURI(abs)}`;\n });\n\n readonly editorLabel = computed(() =>\n this.editor === 'vscode' ? 'Open in VS Code' : 'Open in WebStorm',\n );\n\n readonly scaffoldCmd = computed(() => `npm run faq:new -- ${this.key()}`);\n\n readonly frontmatterScaffold = computed(() => {\n const k = this.key();\n const title = humanize(k);\n const category = humanize(k.split('.')[0]);\n return [\n '---',\n `title: \"${title}\"`,\n `category: \"${category}\"`,\n 'audience: authenticated',\n 'seo-ready: false',\n 'description: \"\"',\n '---',\n '',\n `# ${title}`,\n '',\n `TODO: write content for \"${title}\".`,\n '',\n ].join('\\n');\n });\n\n readonly allEntries = computed(() => this.faq.entries());\n\n readonly missedChain = computed(() => {\n const present = new Set(this.allEntries().map((e) => e.key));\n return this.attempted().map((k) => ({ key: k, present: present.has(k) }));\n });\n\n toggleExpanded(): void {\n this.expanded.update((v) => !v);\n }\n\n toggleAllFiles(): void {\n this.showAllFiles.update((v) => !v);\n }\n\n async copy(text: string, label: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text);\n this.copyState.set(label);\n setTimeout(() => {\n if (this.copyState() === label) this.copyState.set(null);\n }, 1500);\n } catch {\n this.copyState.set(`${label}:err`);\n }\n }\n}\n\nfunction keyToFilePath(key: string): string {\n return key.split('.').join('/');\n}\n\nfunction humanize(s: string): string {\n return s\n .split(/[.\\-_/]/)\n .filter(Boolean)\n .map((seg) => seg.charAt(0).toUpperCase() + seg.slice(1))\n .join(' ');\n}\n\nfunction joinPosix(a: string, b: string): string {\n const left = a.endsWith('/') ? a.slice(0, -1) : a;\n const right = b.startsWith('/') ? b.slice(1) : b;\n return `${left}/${right}`;\n}\n","@if (mode() === 'missing') {\n <section class=\"faq-authoring missing\" aria-label=\"FAQ authoring panel\">\n <header class=\"faq-authoring-header\">\n <span class=\"faq-authoring-tag\">[dev]</span>\n <h3>Start authoring this FAQ</h3>\n </header>\n\n <dl class=\"faq-authoring-meta\">\n <dt>Key</dt>\n <dd><code>{{ key() }}</code></dd>\n\n <dt>Fallback chain</dt>\n <dd>\n <ul class=\"faq-authoring-chain\">\n @for (step of missedChain(); track step.key) {\n <li [ngClass]=\"step.present ? 'present' : 'missed'\">\n <span class=\"mark\">{{ step.present ? '✓' : '✗' }}</span>\n <code>{{ step.key }}</code>\n </li>\n }\n </ul>\n </dd>\n\n <dt>Target file</dt>\n <dd>\n <code>{{ relPath() }}</code>\n <a\n class=\"faq-authoring-editor\"\n [href]=\"editorHref()\"\n >{{ editorLabel() }} ↗</a>\n </dd>\n </dl>\n\n <div class=\"faq-authoring-block\">\n <div class=\"faq-authoring-block-head\">\n <span>Scaffold via CLI</span>\n <button type=\"button\" (click)=\"copy(scaffoldCmd(), 'cmd')\">\n {{ copyState() === 'cmd' ? 'Copied ✓' : 'Copy' }}\n </button>\n </div>\n <pre><code>{{ scaffoldCmd() }}</code></pre>\n </div>\n\n <div class=\"faq-authoring-block\">\n <div class=\"faq-authoring-block-head\">\n <span>Frontmatter scaffold</span>\n <button type=\"button\" (click)=\"copy(frontmatterScaffold(), 'fm')\">\n {{ copyState() === 'fm' ? 'Copied ✓' : 'Copy' }}\n </button>\n </div>\n <pre><code>{{ frontmatterScaffold() }}</code></pre>\n </div>\n\n <details class=\"faq-authoring-cheat\">\n <summary>Link syntax cheat sheet</summary>\n <ul>\n <li><code>[label](faq:trade.segments)</code> — in-modal nav</li>\n <li><code>[label](app:/settings)</code> — navigates the app (modal closes)</li>\n <li><code>[label](https://example.com)</code> — external (new tab)</li>\n <li><code>[label](#section-id)</code> — intra-page anchor</li>\n <li><code></code> — image (drop into <code>src/assets/faq/images/</code>)</li>\n </ul>\n </details>\n\n <details class=\"faq-authoring-all\" [open]=\"showAllFiles()\">\n <summary (click)=\"toggleAllFiles(); $event.preventDefault()\">\n Show all FAQ files ({{ allEntries().length }})\n </summary>\n <ul class=\"faq-authoring-file-list\">\n @for (e of allEntries(); track e.key) {\n <li>\n <code>{{ e.key }}</code>\n <span class=\"faq-authoring-file-path\">src/assets/faq/{{ e.file }}.md</span>\n </li>\n } @empty {\n <li class=\"empty\">Manifest is empty.</li>\n }\n </ul>\n </details>\n </section>\n} @else {\n <aside class=\"faq-authoring existing\" aria-label=\"FAQ source info\">\n <div class=\"faq-authoring-strip\">\n <span class=\"faq-authoring-tag\">[dev]</span>\n <span>Key: <code>{{ key() }}</code></span>\n <span class=\"sep\">•</span>\n <span>Source: <code>{{ relPath() }}</code></span>\n <a class=\"faq-authoring-editor\" [href]=\"editorHref()\">{{ editorLabel() }} ↗</a>\n <button type=\"button\" class=\"faq-authoring-more\" (click)=\"toggleExpanded()\">\n {{ expanded() ? '▲ Less' : '▼ More' }}\n </button>\n </div>\n @if (expanded()) {\n <div class=\"faq-authoring-expanded\">\n <div>\n <strong>Fallback chain attempted:</strong>\n <ul class=\"faq-authoring-chain inline\">\n @for (step of missedChain(); track step.key) {\n <li [ngClass]=\"step.present ? 'present' : 'missed'\">\n <span class=\"mark\">{{ step.present ? '✓' : '✗' }}</span>\n <code>{{ step.key }}</code>\n </li>\n }\n </ul>\n </div>\n <details class=\"faq-authoring-cheat\" open>\n <summary>Link syntax cheat sheet</summary>\n <ul>\n <li><code>[label](faq:trade.segments)</code> — in-modal nav</li>\n <li><code>[label](app:/settings)</code> — navigates the app</li>\n <li><code>[label](https://example.com)</code> — external</li>\n <li><code>[label](#section-id)</code> — intra-page anchor</li>\n <li><code></code> — image</li>\n </ul>\n </details>\n <div class=\"faq-authoring-rescaffold\">\n <span>Re-scaffold (overwrites if you delete first):</span>\n <code>{{ scaffoldCmd() }}</code>\n <button type=\"button\" (click)=\"copy(scaffoldCmd(), 'cmd')\">\n {{ copyState() === 'cmd' ? 'Copied ✓' : 'Copy' }}\n </button>\n </div>\n </div>\n }\n </aside>\n}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Canonical public base URL (no trailing slash) used for OpenGraph,\n * Twitter, JSON-LD canonical URLs, and sitemap entries on the\n * public FAQ pages. Default empty string — falls back to relative\n * `og:url` etc. when unset, which is fine for previewing but\n * suboptimal for production SEO. Consumer apps should override.\n */\nexport const FAQ_PUBLIC_SITE_BASE_URL = new InjectionToken<string>(\n 'FAQ_PUBLIC_SITE_BASE_URL',\n { providedIn: 'root', factory: () => '' },\n);\n\n/**\n * Publisher / author Organization embedded in schema.org JSON-LD on\n * public FAQ pages. `logo` is optional — Google's validator warns but\n * does not error when omitted. Add it later via a one-line provider\n * override.\n */\nexport interface FaqPublicPublisher {\n name: string;\n url?: string;\n logo?: string;\n}\n\nexport const FAQ_PUBLIC_PUBLISHER = new InjectionToken<FaqPublicPublisher>(\n 'FAQ_PUBLIC_PUBLISHER',\n { providedIn: 'root', factory: () => ({ name: '' }) },\n);\n","import { CommonModule } from '@angular/common';\nimport { Component, OnInit, computed, inject, signal } from '@angular/core';\nimport { Meta, Title } from '@angular/platform-browser';\nimport { RouterLink } from '@angular/router';\nimport { FAQ_CONTENT_LOADER } from '../faq-content-loader.token';\nimport {\n FAQ_PUBLIC_PUBLISHER,\n FAQ_PUBLIC_SITE_BASE_URL,\n} from '../faq-seo.tokens';\nimport { FaqEntry } from '../faq.types';\n\ninterface CategoryGroup {\n category: string;\n entries: FaqEntry[];\n}\n\n/**\n * Public, SEO-targeted FAQ index. Prerendered at build time on the\n * consumer side (e.g. /help in broken-stock). Lists every manifest\n * entry where `audience === 'public' && seoReady === true`, grouped\n * by category and ordered by `order`.\n *\n * SEO (E17): sets <title>, meta description, OG, and Twitter tags.\n * JSON-LD (E18): emits a schema.org CollectionPage referencing\n * each child entry as an ItemList.\n */\n@Component({\n selector: 'public-faq-index',\n standalone: true,\n imports: [CommonModule, RouterLink],\n template: `\n <article class=\"public-faq-index\">\n <header>\n <h1>Brokenstock Help</h1>\n <p class=\"lead\">Documentation and walkthroughs for the Brokenstock trade-journal platform.</p>\n </header>\n @if (loading()) {\n <p>Loading…</p>\n } @else if (groups().length === 0) {\n <p>No help pages are published yet.</p>\n } @else {\n @for (group of groups(); track group.category) {\n <section>\n <h2>{{ group.category }}</h2>\n <ul>\n @for (entry of group.entries; track entry.key) {\n <li>\n <a [routerLink]=\"['/help', entry.file]\">{{ entry.title }}</a>\n @if (entry.description) {\n <span class=\"desc\"> — {{ entry.description }}</span>\n }\n </li>\n }\n </ul>\n </section>\n }\n }\n @if (jsonLd(); as ld) {\n <script type=\"application/ld+json\">{{ ld }}</script>\n }\n </article>\n `,\n styles: [`\n :host { display: block; }\n .public-faq-index {\n max-width: 860px;\n margin: 0 auto;\n padding: 2rem 1.25rem 4rem;\n font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif;\n line-height: 1.55;\n }\n header h1 { font-size: 2.25rem; margin: 0 0 0.5rem; }\n .lead { color: #555; margin: 0 0 2rem; font-size: 1.1rem; }\n h2 { font-size: 1.35rem; margin: 1.75rem 0 0.5rem; border-bottom: 1px solid #eee; padding-bottom: 0.25rem; }\n ul { list-style: none; padding: 0; margin: 0; }\n li { padding: 0.4rem 0; }\n a { color: #1565c0; text-decoration: none; font-weight: 500; }\n a:hover { text-decoration: underline; }\n .desc { color: #666; font-weight: 400; }\n `],\n})\nexport class PublicFaqIndex implements OnInit {\n private readonly loader = inject(FAQ_CONTENT_LOADER);\n private readonly title = inject(Title);\n private readonly meta = inject(Meta);\n private readonly siteBase = inject(FAQ_PUBLIC_SITE_BASE_URL);\n private readonly publisher = inject(FAQ_PUBLIC_PUBLISHER);\n\n private readonly _entries = signal<FaqEntry[]>([]);\n readonly loading = signal(true);\n\n readonly visibleEntries = computed(() =>\n this._entries().filter((e) => e.audience === 'public' && e.seoReady),\n );\n\n readonly groups = computed<CategoryGroup[]>(() => {\n const visible = this.visibleEntries();\n const byCategory = new Map<string, FaqEntry[]>();\n for (const entry of visible) {\n const list = byCategory.get(entry.category) ?? [];\n list.push(entry);\n byCategory.set(entry.category, list);\n }\n const groups: CategoryGroup[] = [];\n for (const [category, entries] of byCategory) {\n entries.sort((a, b) => a.order - b.order || a.title.localeCompare(b.title));\n groups.push({ category, entries });\n }\n groups.sort((a, b) => a.category.localeCompare(b.category));\n return groups;\n });\n\n readonly jsonLd = computed<string | null>(() => {\n const entries = this.visibleEntries();\n if (entries.length === 0) return null;\n const base = this.siteBase.replace(/\\/+$/, '');\n const indexUrl = `${base}/help`;\n const ld: Record<string, unknown> = {\n '@context': 'https://schema.org',\n '@type': 'CollectionPage',\n name: 'Brokenstock Help',\n url: indexUrl,\n mainEntity: {\n '@type': 'ItemList',\n itemListElement: entries.map((entry, idx) => ({\n '@type': 'ListItem',\n position: idx + 1,\n url: `${base}/help/${entry.file}`,\n name: entry.title,\n })),\n },\n };\n if (this.publisher.name) {\n const pub: Record<string, unknown> = {\n '@type': 'Organization',\n name: this.publisher.name,\n };\n if (this.publisher.url) pub['url'] = this.publisher.url;\n if (this.publisher.logo) pub['logo'] = this.publisher.logo;\n ld['publisher'] = pub;\n }\n return serializeJsonLd(ld);\n });\n\n async ngOnInit(): Promise<void> {\n try {\n const manifest = await this.loader.loadManifest();\n this._entries.set(manifest.entries);\n this.applyMeta();\n } finally {\n this.loading.set(false);\n }\n }\n\n private applyMeta(): void {\n const base = this.siteBase.replace(/\\/+$/, '');\n const url = `${base}/help`;\n const description =\n 'Documentation and walkthroughs for the Brokenstock trade-journal platform.';\n this.title.setTitle('Help — Brokenstock');\n this.meta.updateTag({ name: 'description', content: description });\n this.meta.updateTag({ property: 'og:type', content: 'website' });\n this.meta.updateTag({ property: 'og:title', content: 'Help — Brokenstock' });\n this.meta.updateTag({ property: 'og:description', content: description });\n this.meta.updateTag({ property: 'og:url', content: url });\n if (this.publisher.name) {\n this.meta.updateTag({ property: 'og:site_name', content: this.publisher.name });\n }\n this.meta.updateTag({ name: 'twitter:card', content: 'summary' });\n this.meta.updateTag({ name: 'twitter:title', content: 'Help — Brokenstock' });\n this.meta.updateTag({ name: 'twitter:description', content: description });\n }\n}\n\nfunction serializeJsonLd(obj: unknown): string {\n return JSON.stringify(obj).replace(/</g, '\\\\u003c');\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, OnInit, computed, inject, signal } from '@angular/core';\nimport { Meta, Title } from '@angular/platform-browser';\nimport { ActivatedRoute, RouterLink } from '@angular/router';\nimport { FAQ_CONTENT_LOADER } from '../faq-content-loader.token';\nimport { FaqMarkdownRendererService } from '../faq-markdown-renderer.service';\nimport {\n FAQ_PUBLIC_PUBLISHER,\n FAQ_PUBLIC_SITE_BASE_URL,\n} from '../faq-seo.tokens';\nimport { FaqEntry } from '../faq.types';\n\n/**\n * Public, SEO-targeted FAQ page. Prerendered at build time per\n * qualifying manifest entry (e.g. /help/landing, /help/trade/segments).\n *\n * The route is `help/**` so multi-segment file paths work; this\n * component reads the wildcard path off `ActivatedRoute.url`.\n *\n * SEO (E17): sets <title>, meta description, OpenGraph and Twitter\n * Card tags using Angular's Title + Meta services (SSR-compatible).\n * JSON-LD (E18): emits a schema.org Article (or BlogPosting) object\n * via an inline <script type=\"application/ld+json\"> element. The\n * raw JSON has `<` escaped to `<` so a stray `</script>` inside\n * data won't break the surrounding tag.\n */\n@Component({\n selector: 'public-faq-page',\n standalone: true,\n imports: [CommonModule, RouterLink],\n template: `\n <article class=\"public-faq-page\">\n <nav class=\"crumbs\">\n <a routerLink=\"/help\">← Help</a>\n </nav>\n @if (loading()) {\n <p>Loading…</p>\n } @else if (!entry()) {\n <header>\n <h1>Page not found</h1>\n <p>That help page doesn't exist or isn't published. Try the <a routerLink=\"/help\">help index</a>.</p>\n </header>\n } @else {\n <header>\n <h1>{{ entry()!.title }}</h1>\n @if (entry()!.description) {\n <p class=\"lead\">{{ entry()!.description }}</p>\n }\n </header>\n <div class=\"body\" [innerHTML]=\"renderedHtml()\"></div>\n @if (jsonLd(); as ld) {\n <script type=\"application/ld+json\">{{ ld }}</script>\n }\n }\n </article>\n `,\n styles: [`\n :host { display: block; }\n .public-faq-page {\n max-width: 860px;\n margin: 0 auto;\n padding: 2rem 1.25rem 4rem;\n font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif;\n line-height: 1.6;\n }\n .crumbs { margin-bottom: 1.5rem; font-size: 0.9rem; }\n .crumbs a { color: #1565c0; text-decoration: none; }\n .crumbs a:hover { text-decoration: underline; }\n header h1 { font-size: 2.1rem; margin: 0 0 0.5rem; }\n .lead { color: #555; font-size: 1.1rem; margin: 0 0 1.5rem; }\n .body :is(h1, h2, h3, h4) { margin-top: 2rem; }\n .body a { color: #1565c0; }\n .body img { max-width: 100%; height: auto; }\n .body pre { background: #f6f8fa; padding: 0.75rem 1rem; border-radius: 6px; overflow-x: auto; }\n .body code { background: #f6f8fa; padding: 0.1rem 0.3rem; border-radius: 3px; font-size: 0.9em; }\n .body pre code { background: transparent; padding: 0; }\n `],\n})\nexport class PublicFaqPage implements OnInit {\n private readonly route = inject(ActivatedRoute);\n private readonly loader = inject(FAQ_CONTENT_LOADER);\n private readonly renderer = inject(FaqMarkdownRendererService);\n private readonly title = inject(Title);\n private readonly meta = inject(Meta);\n private readonly siteBase = inject(FAQ_PUBLIC_SITE_BASE_URL);\n private readonly publisher = inject(FAQ_PUBLIC_PUBLISHER);\n\n readonly entry = signal<FaqEntry | null>(null);\n readonly body = signal<string>('');\n readonly loading = signal(true);\n\n readonly renderedHtml = computed(() => {\n const entry = this.entry();\n const body = this.body();\n if (!entry || !body) return '';\n return this.renderer.render(body, {\n context: 'page',\n imagePrefix: entry.imagePrefix\n ? `/assets/faq/${entry.imagePrefix}`\n : undefined,\n });\n });\n\n readonly jsonLd = computed<string | null>(() => {\n const entry = this.entry();\n if (!entry) return null;\n const url = this.canonicalUrl(entry);\n const ld: Record<string, unknown> = {\n '@context': 'https://schema.org',\n '@type': 'Article',\n headline: entry.title,\n url,\n mainEntityOfPage: url,\n };\n if (entry.description) ld['description'] = entry.description;\n if (this.publisher.name) {\n const pub: Record<string, unknown> = {\n '@type': 'Organization',\n name: this.publisher.name,\n };\n if (this.publisher.url) pub['url'] = this.publisher.url;\n if (this.publisher.logo) pub['logo'] = this.publisher.logo;\n ld['publisher'] = pub;\n ld['author'] = pub;\n }\n return serializeJsonLd(ld);\n });\n\n async ngOnInit(): Promise<void> {\n try {\n const segments = this.route.snapshot.url.map((s) => s.path);\n const filePath = segments.join('/');\n if (!filePath) {\n this.applyNotFoundMeta();\n return;\n }\n const manifest = await this.loader.loadManifest();\n const match = manifest.entries.find(\n (e) => e.file === filePath && e.audience === 'public' && e.seoReady,\n );\n if (!match) {\n this.applyNotFoundMeta();\n return;\n }\n const content = await this.loader.loadContent(match.key);\n if (content === null) {\n this.applyNotFoundMeta();\n return;\n }\n const parsed = this.renderer.parse(content);\n this.entry.set(match);\n this.body.set(parsed.body);\n this.applyMeta(match);\n } finally {\n this.loading.set(false);\n }\n }\n\n private applyMeta(entry: FaqEntry): void {\n const url = this.canonicalUrl(entry);\n const description = entry.description ?? '';\n const title = `${entry.title} — Help`;\n this.title.setTitle(title);\n this.meta.updateTag({ name: 'description', content: description });\n this.meta.updateTag({ property: 'og:type', content: 'article' });\n this.meta.updateTag({ property: 'og:title', content: entry.title });\n this.meta.updateTag({ property: 'og:description', content: description });\n this.meta.updateTag({ property: 'og:url', content: url });\n if (this.publisher.name) {\n this.meta.updateTag({ property: 'og:site_name', content: this.publisher.name });\n }\n this.meta.updateTag({ name: 'twitter:card', content: 'summary' });\n this.meta.updateTag({ name: 'twitter:title', content: entry.title });\n this.meta.updateTag({ name: 'twitter:description', content: description });\n }\n\n private applyNotFoundMeta(): void {\n this.title.setTitle('Page not found — Help');\n this.meta.updateTag({ name: 'robots', content: 'noindex' });\n }\n\n private canonicalUrl(entry: FaqEntry): string {\n const base = this.siteBase.replace(/\\/+$/, '');\n return `${base}/help/${entry.file}`;\n }\n}\n\n/**\n * Serializes a JSON-LD object for safe inclusion in a\n * `<script type=\"application/ld+json\">` element. Escapes `<` so a\n * stray `</script>` inside any string field cannot break out of the\n * script tag. (Browsers and crawlers parse the resulting `<`\n * back to `<` per JSON spec.)\n */\nfunction serializeJsonLd(obj: unknown): string {\n return JSON.stringify(obj).replace(/</g, '\\\\u003c');\n}\n","import { Injectable, signal, computed } from '@angular/core';\n\nexport type ThemeMode = 'dark';\n\n@Injectable({ providedIn: 'root' })\nexport class ThemeService {\n readonly mode = signal<ThemeMode>('dark');\n readonly isDark = computed(() => this.mode() === 'dark');\n}\n","import { Injectable, signal } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class TerminalFocusService {\n readonly focusRequested = signal(0);\n\n requestFocus(): void {\n this.focusRequested.update(v => v + 1);\n }\n}\n","import { computed, inject, Injectable, NgZone, signal } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { TerminalFocusService } from './terminal-focus.service';\n\nexport interface ShortcutRegistration {\n key: string;\n modifier?: 'Alt';\n action: () => void;\n description: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class KeyboardShortcutService {\n readonly #groups = new Map<string, ShortcutRegistration[]>();\n readonly #activeGroupId = signal<string | null>(null);\n\n readonly #document = inject(DOCUMENT);\n readonly #zone = inject(NgZone);\n readonly #focusService = inject(TerminalFocusService);\n\n readonly helpVisible = signal(false);\n\n readonly activeShortcuts = computed(() => {\n const groupId = this.#activeGroupId();\n if (!groupId) return null;\n const shortcuts = this.#groups.get(groupId);\n if (!shortcuts) return null;\n return { groupId, shortcuts };\n });\n\n constructor() {\n this.#zone.runOutsideAngular(() => {\n this.#document.addEventListener('keydown', (event: KeyboardEvent) => {\n this.#handleKeydown(event);\n });\n });\n }\n\n registerGroup(groupId: string, shortcuts: ShortcutRegistration[]): void {\n this.#groups.set(groupId, shortcuts);\n this.#activeGroupId.set(groupId);\n }\n\n unregisterGroup(groupId: string): void {\n this.#groups.delete(groupId);\n if (this.#activeGroupId() === groupId) {\n const keys = [...this.#groups.keys()];\n this.#activeGroupId.set(keys.length > 0 ? keys[keys.length - 1] : null);\n }\n }\n\n toggleHelp(): void {\n this.helpVisible.update(v => !v);\n }\n\n #handleKeydown(event: KeyboardEvent): boolean {\n const activeId = this.#activeGroupId();\n if (activeId) {\n const shortcuts = this.#groups.get(activeId);\n if (shortcuts) {\n const match = shortcuts.find(s => {\n if (s.modifier === 'Alt') return event.altKey && s.key === event.key;\n return !event.altKey && !event.ctrlKey && !event.metaKey && s.key === event.key;\n });\n if (match) {\n event.preventDefault();\n this.#zone.run(() => match.action());\n return true;\n }\n }\n }\n\n if (event.key === 'Escape') {\n event.preventDefault();\n this.#zone.run(() => {\n this.helpVisible.set(false);\n this.#focusService.requestFocus();\n });\n return true;\n }\n\n if (!event.altKey) return false;\n\n if (event.key === '?' || event.key === '/') {\n event.preventDefault();\n this.#zone.run(() => this.toggleHelp());\n return true;\n }\n\n return false;\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { z } from 'zod/v4';\nimport { CommandDefinition, CommandResult } from '../types/command.types';\nimport { FaqService } from '../faq/faq.service';\n\nconst FAQ_USAGE =\n 'faq\\n' +\n 'faq <key>\\n' +\n 'faq search <term>\\n' +\n 'faq index\\n' +\n 'faq help\\n\\n' +\n ' Opens the in-app FAQ help system. Does not require authentication.\\n\\n' +\n ' Subcommands:\\n' +\n ' (none) Open the FAQ at the current route\\'s resolved key.\\n' +\n ' <key> Open at a specific dot-notation key (e.g. trade.segments).\\n' +\n ' search <term> Open with the search field pre-filled.\\n' +\n ' index Open at the index table-of-contents.\\n' +\n ' help Show this help.';\n\n@Injectable({ providedIn: 'root' })\nexport class FaqCommand implements CommandDefinition {\n private readonly faqService = inject(FaqService);\n\n readonly name = 'faq';\n readonly description = 'Open the in-app FAQ help system';\n readonly usage = FAQ_USAGE;\n readonly requiresAuth = false;\n readonly argsSchema = z.array(z.string()).max(50);\n\n execute(args: string[]): CommandResult {\n const ts = () => new Date();\n if (args.length === 0) {\n void this.faqService.openModal();\n return { success: true, message: '', timestamp: ts() };\n }\n const sub = args[0].toLowerCase();\n if (sub === 'index') {\n void this.faqService.openModal('index');\n return { success: true, message: '', timestamp: ts() };\n }\n if (sub === 'search') {\n const term = args.slice(1).join(' ').trim();\n if (!term) {\n return {\n success: false,\n message: 'Usage: faq search <term>',\n timestamp: ts(),\n };\n }\n void this.faqService.openModal(undefined, { searchTerm: term });\n return { success: true, message: '', timestamp: ts() };\n }\n void this.faqService.openModal(args[0]);\n return { success: true, message: '', timestamp: ts() };\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { CommandDefinition } from '../types/command.types';\nimport { SHELL_COMMANDS } from '../tokens/shell-tokens';\nimport { FaqCommand } from '../commands/faq.command';\n\n@Injectable({ providedIn: 'root' })\nexport class CommandRegistryService {\n private readonly commands = new Map<string, CommandDefinition>();\n\n constructor() {\n // Built-in shell commands registered ahead of app-provided commands so\n // an app cannot accidentally shadow them.\n this.register(inject(FaqCommand));\n\n const appCommands = inject(SHELL_COMMANDS, { optional: true }) ?? [];\n for (const cmd of appCommands) {\n this.register(cmd);\n }\n }\n\n register(command: CommandDefinition): void {\n this.commands.set(command.name, command);\n }\n\n get(name: string): CommandDefinition | undefined {\n return this.commands.get(name);\n }\n\n getAll(): CommandDefinition[] {\n return Array.from(this.commands.values());\n }\n\n /**\n * Returns command name suggestions for tab-completion.\n * Built-ins (clear, help) are included when authenticated.\n */\n getSuggestions(prefix: string, isAuthenticated: boolean): string[] {\n if (!prefix) return [];\n if (!isAuthenticated) {\n const open = ['login', ...[...this.commands.values()].filter(c => c.requiresAuth === false).map(c => c.name)];\n return open.filter(name => name.startsWith(prefix) && name !== prefix).sort();\n }\n const builtIns = ['clear', 'help'];\n const registered = [...this.commands.values()].map(c => c.name);\n return [...builtIns, ...registered]\n .filter(name => name.startsWith(prefix) && name !== prefix)\n .sort();\n }\n}\n","/**\n * Quote-aware command tokenizer. Treats \"...\" as single tokens and strips enclosing quotes.\n */\nexport function tokenize(input: string): string[] {\n return (input.match(/(?:\"[^\"]*\"|\\S)+/g) ?? []).map(t => t.replace(/\"([^\"]*)\"/g, '$1'));\n}\n\nexport const CLEAR_USAGE =\n 'clear\\n\\n' +\n ' Clears the terminal history.\\n' +\n ' No arguments required.';\n\nexport const HELP_USAGE =\n 'help [command]\\n\\n' +\n ' With no arguments, lists all available commands.\\n' +\n ' With a command name, shows detailed usage for that command.\\n\\n' +\n ' Arguments:\\n' +\n ' [command] Optional command name to show detailed help for';\n","import { inject, Injectable, signal, computed, effect } from '@angular/core';\nimport { z } from 'zod/v4';\nimport { CommandResult, CommandHistoryEntry, Severity } from '../types/command.types';\nimport { tokenize, CLEAR_USAGE, HELP_USAGE } from '../commands/command.utils';\nimport { CommandRegistryService } from './command-registry.service';\nimport { AuthenticationService } from './authentication.service';\n\nexport type { CommandResult, CommandHistoryEntry, Severity };\n\nconst CommandInputSchema = z.string().trim().min(1, 'Command cannot be empty');\n\n@Injectable({ providedIn: 'root' })\nexport class CommandService {\n readonly history = signal<CommandHistoryEntry[]>([]);\n readonly currentInput = signal('');\n readonly isProcessing = signal(false);\n readonly helpOverlay = signal<string | null>(null);\n\n private readonly authService = inject(AuthenticationService);\n private readonly registry = inject(CommandRegistryService);\n\n constructor() {\n effect(() => {\n if (!this.authService.authenticated()) {\n this.history.set([]);\n }\n });\n }\n\n readonly lastResult = computed(() => {\n const h = this.history();\n return h.length > 0 ? h[h.length - 1].result : null;\n });\n\n dismissHelp(): void {\n this.helpOverlay.set(null);\n }\n\n echoCommand(input: string): void {\n if (this.#coalesce(input)) return;\n this.history.update(h => [...h, {\n input,\n result: { success: true, message: '', timestamp: new Date() },\n repeatCount: 1,\n }]);\n }\n\n pushNotification(notification: { message: string; severity: Severity }): void {\n this.history.update(h => [...h, {\n input: '',\n result: {\n success: notification.severity !== 'error',\n message: notification.message,\n timestamp: new Date(),\n severity: notification.severity,\n },\n }]);\n }\n\n execute(rawInput: string): void {\n const validation = CommandInputSchema.safeParse(rawInput);\n if (!validation.success) {\n this.history.update(h => [...h, {\n input: rawInput,\n result: { success: false, message: validation.error.issues[0].message, timestamp: new Date() },\n }]);\n this.currentInput.set('');\n return;\n }\n\n const input = validation.data;\n const parts = tokenize(input);\n const command = parts[0].toLowerCase();\n\n const def = this.registry.get(command);\n const displayInput = def?.sanitizeInput ? def.sanitizeInput(input) : input;\n\n const resultOrPromise = this.#dispatch(command, parts.slice(1));\n this.currentInput.set('');\n\n if (resultOrPromise instanceof Promise) {\n this.isProcessing.set(true);\n resultOrPromise\n .then(result => {\n if (result.isHelp && result.message) {\n this.helpOverlay.set(result.message);\n }\n const historyResult = result.isHelp ? { ...result, message: '' } : result;\n if (!this.#coalesce(displayInput)) {\n this.history.update(h => [...h, { input: displayInput, result: historyResult, repeatCount: 1 }]);\n }\n })\n .finally(() => this.isProcessing.set(false));\n } else {\n if (resultOrPromise.isHelp && resultOrPromise.message) {\n this.helpOverlay.set(resultOrPromise.message);\n }\n const historyResult = resultOrPromise.isHelp ? { ...resultOrPromise, message: '' } : resultOrPromise;\n if (!this.#coalesce(displayInput)) {\n this.history.update(h => [...h, { input: displayInput, result: historyResult, repeatCount: 1 }]);\n }\n }\n }\n\n #coalesce(input: string): boolean {\n if (!input) return false;\n const h = this.history();\n for (let i = h.length - 1; i >= 0; i--) {\n if (h[i].input) {\n if (h[i].input === input) {\n this.history.update(history => {\n const updated = [...history];\n updated[i] = { ...updated[i], repeatCount: (updated[i].repeatCount ?? 1) + 1 };\n return updated;\n });\n return true;\n }\n return false;\n }\n }\n return false;\n }\n\n #dispatch(command: string, args: string[]): CommandResult | Promise<CommandResult> {\n // Normalize \"help <command>\" → \"<command> help\" so auth and dispatch rules apply uniformly\n if (command === 'help' && args.length > 0 && args[0].toLowerCase() !== 'help') {\n [command, args] = [args[0].toLowerCase(), ['help']];\n }\n\n const hasHelp = args.some(a => a.toLowerCase() === 'help');\n const isAuthenticated = this.authService.authenticated();\n const notLoggedIn = (): CommandResult => ({\n success: false,\n message: 'Not logged in. Use \"login\" to authenticate.',\n timestamp: new Date(),\n });\n\n if (command === 'clear') {\n if (!isAuthenticated) return notLoggedIn();\n if (hasHelp) return { success: true, message: CLEAR_USAGE, timestamp: new Date(), isHelp: true };\n this.history.set([]);\n return { success: true, message: '', timestamp: new Date() };\n }\n\n if (command === 'help') {\n if (!isAuthenticated) return notLoggedIn();\n const target = args[0]?.toLowerCase();\n if (target) return this.#commandHelp(target);\n const registered = this.registry.getAll();\n const lines = [\n ' clear — Clear terminal history',\n ' help — List available commands',\n ...registered.map(c => ` ${c.name} — ${c.description}`),\n ];\n return {\n success: true,\n message: 'Available commands:\\n' + lines.join('\\n') + '\\n\\nType \"help <command>\" or \"<command> help\" for detailed usage.',\n timestamp: new Date(),\n isHelp: true,\n };\n }\n\n let def = this.registry.get(command);\n if (!def) {\n // Try swapping the first two tokens: \"disable user foo\" → \"user disable foo\"\n const swapped = args[0]?.toLowerCase();\n if (swapped && this.registry.get(swapped)) {\n def = this.registry.get(swapped)!;\n args = [command, ...args.slice(1)];\n command = swapped;\n } else {\n if (!isAuthenticated && command !== 'login') return notLoggedIn();\n return { success: false, message: `Unknown command: ${command}`, timestamp: new Date() };\n }\n }\n\n if (!isAuthenticated && command !== 'login' && def.requiresAuth !== false) {\n return notLoggedIn();\n }\n\n if (hasHelp) {\n return { success: true, message: def.usage, timestamp: new Date(), isHelp: true };\n }\n\n const validation = def.argsSchema.safeParse(args);\n if (!validation.success) {\n return { success: false, message: `Invalid arguments for '${command}': ${validation.error.issues[0].message}`, timestamp: new Date() };\n }\n\n return def.execute(args);\n }\n\n #commandHelp(name: string): CommandResult {\n if (name === 'clear') return { success: true, message: CLEAR_USAGE, timestamp: new Date(), isHelp: true };\n if (name === 'help') return { success: true, message: HELP_USAGE, timestamp: new Date(), isHelp: true };\n const def = this.registry.get(name);\n if (!def) return { success: false, message: `Unknown command: ${name}`, timestamp: new Date() };\n return { success: true, message: def.usage, timestamp: new Date(), isHelp: true };\n }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { AuthenticationService } from '../../services/authentication.service';\nimport { CommandService } from '../../services/command.service';\nimport { TerminalFocusService } from '../../services/terminal-focus.service';\n\n@Component({\n selector: 'shell-status-bar',\n templateUrl: './status-bar.html',\n styleUrl: './status-bar.css',\n})\nexport class StatusBar {\n readonly #authService = inject(AuthenticationService);\n readonly #focusService = inject(TerminalFocusService);\n readonly #commandService = inject(CommandService);\n\n readonly isAuthenticated = this.#authService.authenticated;\n readonly loginStatus = computed(() =>\n this.#authService.authenticating()\n ? 'Authenticating...'\n : this.#authService.authenticated()\n ? 'Logged in'\n : 'Not logged in',\n );\n\n logout(): void {\n this.#authService.logout();\n this.#commandService.echoCommand('logout');\n this.#focusService.requestFocus();\n }\n\n openFaq(): void {\n this.#commandService.execute('faq');\n this.#focusService.requestFocus();\n }\n}\n","<div class=\"status-bar\">\n <div class=\"status-item\">\n <span class=\"status-label text-secondary-info\">Status:</span>\n @if (isAuthenticated()) {\n <a class=\"status-value text-interactive logout-link\" (click)=\"logout()\">Log Out</a>\n } @else {\n <span class=\"status-value text-loss\">{{ loginStatus() }}</span>\n }\n </div>\n @if (isAuthenticated()) {\n <ng-content />\n }\n <button\n type=\"button\"\n class=\"faq-button text-interactive\"\n (click)=\"openFaq()\"\n title=\"Open FAQ (or type `faq`)\"\n aria-label=\"Open FAQ\"\n >?</button>\n</div>\n","import { Component, computed, inject } from '@angular/core';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { TerminalFocusService } from '../../services/terminal-focus.service';\nimport { CommandService } from '../../services/command.service';\nimport { KeyboardShortcutService } from '../../services/keyboard-shortcut.service';\nimport { SHELL_MENU_ITEMS } from '../../tokens/shell-tokens';\nimport { MenuItem } from '../../types/menu.types';\n\nexport { MenuItem };\n\n@Component({\n selector: 'shell-side-menu',\n imports: [RouterLink, RouterLinkActive, MatIconModule, MatTooltipModule],\n templateUrl: './side-menu.html',\n styleUrl: './side-menu.css',\n})\nexport class SideMenu {\n readonly #focusService = inject(TerminalFocusService);\n readonly #commandService = inject(CommandService);\n readonly #shortcutService = inject(KeyboardShortcutService);\n readonly hasShortcuts = this.#shortcutService.activeShortcuts;\n\n readonly #allMenuItems: MenuItem[] = inject(SHELL_MENU_ITEMS, { optional: true }) ?? [];\n\n readonly menuItems = computed(() =>\n this.#allMenuItems.filter(item => !item.visible || item.visible()),\n );\n\n onMenuClick(item: MenuItem): void {\n if (item.command) {\n this.#commandService.echoCommand(item.command);\n }\n this.#focusService.requestFocus();\n }\n\n toggleHelp(): void {\n this.#shortcutService.toggleHelp();\n }\n}\n","<nav class=\"side-menu\">\n @for (item of menuItems(); track item.route) {\n <a\n class=\"menu-item\"\n [routerLink]=\"item.route\"\n routerLinkActive=\"active\"\n [matTooltip]=\"item.label\"\n matTooltipPosition=\"right\"\n (click)=\"onMenuClick(item)\"\n >\n <mat-icon>{{ item.icon }}</mat-icon>\n </a>\n }\n <div class=\"menu-spacer\"></div>\n @if (hasShortcuts()) {\n <button\n class=\"help-button\"\n matTooltip=\"Keyboard shortcuts\"\n matTooltipPosition=\"right\"\n (click)=\"toggleHelp()\"\n >\n <span class=\"help-modifier\">Alt+</span><span class=\"help-key\">?</span>\n </button>\n }\n</nav>\n","import { Component, inject } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { ThinkingService } from '../../services/thinking.service';\nimport { KeyboardShortcutService } from '../../services/keyboard-shortcut.service';\n\n@Component({\n selector: 'shell-main-content',\n imports: [RouterOutlet, MatProgressSpinnerModule],\n templateUrl: './main-content.html',\n styleUrl: './main-content.css',\n})\nexport class MainContent {\n readonly #thinkingService = inject(ThinkingService);\n readonly #shortcutService = inject(KeyboardShortcutService);\n readonly isThinking = this.#thinkingService.isThinking;\n readonly shortcutHelpVisible = this.#shortcutService.helpVisible;\n readonly activeShortcuts = this.#shortcutService.activeShortcuts;\n\n formatKey(key: string): string {\n const keyMap: Record<string, string> = {\n ArrowUp: '↑', ArrowDown: '↓', ArrowLeft: '←', ArrowRight: '→',\n PageUp: 'PgUp', PageDown: 'PgDn',\n };\n return keyMap[key] ?? key;\n }\n\n closeShortcutHelp(): void {\n this.#shortcutService.helpVisible.set(false);\n }\n}\n","<div class=\"main-content\">\n <div class=\"content-area\">\n <router-outlet />\n </div>\n @if (shortcutHelpVisible() && activeShortcuts()) {\n <div class=\"shortcut-overlay\" (click)=\"closeShortcutHelp()\">\n <div class=\"shortcut-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"shortcut-title text-secondary-info\">{{ activeShortcuts()!.groupId }} shortcuts</div>\n @for (s of activeShortcuts()!.shortcuts; track s.key) {\n <div class=\"shortcut-row\">\n <kbd class=\"shortcut-key\">Alt+{{ formatKey(s.key) }}</kbd>\n <span class=\"shortcut-desc text-text-primary\">{{ s.description }}</span>\n </div>\n }\n <div class=\"shortcut-row shortcut-dismiss\">\n <kbd class=\"shortcut-key\">Alt+?</kbd>\n <span class=\"shortcut-desc text-secondary-info\">or</span>\n <kbd class=\"shortcut-key\">Esc</kbd>\n <span class=\"shortcut-desc text-secondary-info\">dismiss</span>\n </div>\n </div>\n </div>\n }\n @if (isThinking()) {\n <div class=\"thinking-overlay\">\n <mat-spinner diameter=\"48\" />\n </div>\n }\n</div>\n","import { Component, inject, ElementRef, viewChild, effect, afterNextRender, computed } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CommandService } from '../../services/command.service';\nimport { CommandRegistryService } from '../../services/command-registry.service';\nimport { AuthenticationService } from '../../services/authentication.service';\nimport { TerminalFocusService } from '../../services/terminal-focus.service';\nimport { CommandResult } from '../../types/command.types';\n\n@Component({\n selector: 'shell-command-terminal',\n imports: [FormsModule],\n templateUrl: './command-terminal.html',\n styleUrl: './command-terminal.css',\n})\nexport class CommandTerminal {\n private readonly commandService = inject(CommandService);\n private readonly registry = inject(CommandRegistryService);\n private readonly authService = inject(AuthenticationService);\n private readonly terminalFocusService = inject(TerminalFocusService);\n\n readonly history = computed(() => [...this.commandService.history()].reverse());\n readonly currentInput = this.commandService.currentInput;\n readonly isProcessing = this.commandService.isProcessing;\n\n private readonly inputEl = viewChild<ElementRef<HTMLInputElement>>('terminalInput');\n\n private tabCycleIndex = -1;\n private lastTabPrefix = '';\n\n readonly ghostText = computed(() => {\n const input = this.currentInput().trim();\n if (!input || input.includes(' ')) return '';\n const prefix = input.toLowerCase();\n const suggestions = this.registry.getSuggestions(prefix, this.authService.authenticated());\n return suggestions.length > 0 ? suggestions[0] : '';\n });\n\n constructor() {\n afterNextRender(() => this.focusInput());\n\n effect(() => {\n if (!this.isProcessing()) {\n setTimeout(() => this.focusInput());\n }\n });\n\n effect(() => {\n this.terminalFocusService.focusRequested();\n setTimeout(() => this.focusInput());\n });\n }\n\n onSubmit(): void {\n const input = this.currentInput();\n if (!input.trim()) return;\n this.commandService.execute(input);\n this.tabCycleIndex = -1;\n this.lastTabPrefix = '';\n this.focusInput();\n }\n\n onInputChange(value: string): void {\n this.currentInput.set(value);\n this.tabCycleIndex = -1;\n this.lastTabPrefix = '';\n if (this.commandService.helpOverlay()) {\n this.commandService.dismissHelp();\n }\n }\n\n dismissHelp(): void {\n this.commandService.dismissHelp();\n }\n\n onTab(event: KeyboardEvent): void {\n event.preventDefault();\n const input = this.currentInput().trim();\n if (!input || input.includes(' ')) return;\n\n const prefix = input.toLowerCase();\n const suggestions = this.registry.getSuggestions(prefix, this.authService.authenticated());\n if (suggestions.length === 0) return;\n\n if (suggestions.length === 1) {\n this.currentInput.set(suggestions[0] + ' ');\n this.tabCycleIndex = -1;\n this.lastTabPrefix = '';\n return;\n }\n\n if (this.lastTabPrefix !== prefix) {\n this.lastTabPrefix = prefix;\n this.tabCycleIndex = -1;\n }\n\n if (event.shiftKey) {\n this.tabCycleIndex = this.tabCycleIndex <= 0 ? suggestions.length - 1 : this.tabCycleIndex - 1;\n } else {\n this.tabCycleIndex = (this.tabCycleIndex + 1) % suggestions.length;\n }\n\n this.currentInput.set(suggestions[this.tabCycleIndex]);\n }\n\n getSeverityClass(result: CommandResult): string {\n if (result.severity === 'info') return 'info';\n if (result.severity === 'warning') return 'warning';\n if (result.severity === 'error' || !result.success) return 'error';\n return '';\n }\n\n focusInput(): void {\n this.inputEl()?.nativeElement.focus();\n }\n}\n","<div class=\"terminal\">\n <div class=\"terminal-input-row\">\n <span class=\"prompt\">$</span>\n <div class=\"input-wrapper\">\n @if (ghostText()) {\n <input\n class=\"ghost-input\"\n type=\"text\"\n [value]=\"ghostText()\"\n disabled\n tabindex=\"-1\"\n aria-hidden=\"true\"\n />\n }\n <input\n #terminalInput\n class=\"terminal-input\"\n type=\"text\"\n [ngModel]=\"currentInput()\"\n (ngModelChange)=\"onInputChange($event)\"\n (keydown.enter)=\"onSubmit()\"\n (keydown.tab)=\"onTab($any($event))\"\n (keydown.escape)=\"dismissHelp()\"\n placeholder=\"Type a command...\"\n [disabled]=\"isProcessing()\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n </div>\n </div>\n <div class=\"terminal-output\">\n @for (entry of history(); track entry.result.timestamp) {\n @if (entry.input) {\n <div class=\"terminal-line\">\n <span class=\"prompt\">$</span>\n <span class=\"command-text\">{{ entry.input }}@if ((entry.repeatCount ?? 1) > 1) { <span class=\"repeat-count\">(×{{ entry.repeatCount }})</span>}</span>\n </div>\n }\n @if (entry.result.message) {\n <div class=\"terminal-line\" [class]=\"getSeverityClass(entry.result)\">{{ entry.result.message }}</div>\n }\n }\n </div>\n</div>\n","import { Component, inject, signal } from '@angular/core';\nimport { StatusBar } from '../status-bar/status-bar';\nimport { SideMenu } from '../side-menu/side-menu';\nimport { MainContent } from '../main-content/main-content';\nimport { CommandTerminal } from '../command-terminal/command-terminal';\nimport { FaqModal } from '../../faq/faq-modal/faq-modal';\nimport { ThinkingService } from '../../services/thinking.service';\nimport { CommandService } from '../../services/command.service';\nimport { AuthenticationService } from '../../services/authentication.service';\n\nconst MIN_TERMINAL_HEIGHT = 80;\nconst MAX_TERMINAL_RATIO = 0.6;\nconst DEFAULT_TERMINAL_HEIGHT = 160;\n\n@Component({\n selector: 'shell-root',\n imports: [StatusBar, SideMenu, MainContent, CommandTerminal, FaqModal],\n templateUrl: './shell.html',\n styleUrl: './shell.css',\n})\nexport class Shell {\n readonly #thinkingService = inject(ThinkingService);\n readonly #commandService = inject(CommandService);\n readonly #authService = inject(AuthenticationService);\n readonly isThinking = this.#thinkingService.isThinking;\n readonly isAuthenticated = this.#authService.authenticated;\n readonly helpOverlay = this.#commandService.helpOverlay;\n\n dismissHelp(): void {\n this.#commandService.dismissHelp();\n }\n readonly terminalHeight = signal(`${DEFAULT_TERMINAL_HEIGHT}px`);\n readonly isDragging = signal(false);\n\n #startY = 0;\n #startHeight = DEFAULT_TERMINAL_HEIGHT;\n\n readonly #onMouseMove = (event: MouseEvent) => {\n const deltaY = event.clientY - this.#startY;\n const maxHeight = Math.floor(window.innerHeight * MAX_TERMINAL_RATIO);\n const newHeight = Math.min(maxHeight, Math.max(MIN_TERMINAL_HEIGHT, this.#startHeight - deltaY));\n this.terminalHeight.set(`${newHeight}px`);\n };\n\n readonly #onMouseUp = () => {\n this.isDragging.set(false);\n document.removeEventListener('mousemove', this.#onMouseMove);\n document.removeEventListener('mouseup', this.#onMouseUp);\n };\n\n onResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.#startY = event.clientY;\n this.#startHeight = parseInt(this.terminalHeight(), 10);\n this.isDragging.set(true);\n document.addEventListener('mousemove', this.#onMouseMove);\n document.addEventListener('mouseup', this.#onMouseUp);\n }\n}\n","<div class=\"shell\" [style.--terminal-height]=\"terminalHeight()\" [class.is-dragging]=\"isDragging()\">\n <shell-status-bar class=\"shell-status\" [class.disabled-zone]=\"isThinking()\">\n <ng-content />\n </shell-status-bar>\n @if (isAuthenticated()) {\n <shell-side-menu class=\"shell-menu\" [class.disabled-zone]=\"isThinking()\" />\n }\n <shell-main-content class=\"shell-main\" [class.full-width]=\"!isAuthenticated()\" />\n <div class=\"shell-resize\" [class.dragging]=\"isDragging()\" (mousedown)=\"onResizeStart($event)\"></div>\n <shell-command-terminal class=\"shell-terminal\" [class.disabled-zone]=\"isThinking()\" />\n <faq-modal />\n\n @if (helpOverlay(); as helpText) {\n <div class=\"help-backdrop\" (click)=\"dismissHelp()\">\n <div class=\"help-panel\" (click)=\"$event.stopPropagation()\" role=\"dialog\" aria-label=\"Command help\">\n <div class=\"help-panel-header\">\n <span class=\"help-panel-title\">Help</span>\n <button class=\"help-panel-close\" type=\"button\" (click)=\"dismissHelp()\" aria-label=\"Close help\">✕</button>\n </div>\n <div class=\"help-panel-content\">{{ helpText }}</div>\n <div class=\"help-panel-footer\">\n <span>Tip: for most commands you can swap the first and second words — e.g. \"disable user\" works the same as \"user disable\"</span>\n <span class=\"help-panel-footer-dismiss\">Press Escape, click outside, or start typing to close</span>\n </div>\n </div>\n </div>\n }\n</div>\n","import { Component, inject, signal } from '@angular/core';\nimport { AutofillEvent, TextFieldModule } from '@angular/cdk/text-field';\nimport { Credentials, validateCredentials } from '@franzzemen/identity';\nimport { PASSWORD_REGEX, USERNAME_REGEX } from '@franzzemen/utility';\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\nimport { MatInput, MatInputModule } from '@angular/material/input';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatIconModule } from '@angular/material/icon';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { DatePipe } from '@angular/common';\nimport { AuthenticationService } from '../../services/authentication.service';\nimport { CommandService } from '../../services/command.service';\nimport { TerminalFocusService } from '../../services/terminal-focus.service';\nimport { RegexValidatorDirective } from '../../directives/regex-validator.directive';\nimport { SHELL_APP_NAME, SHELL_POST_LOGIN_ROUTE } from '../../tokens/shell-tokens';\n\n@Component({\n selector: 'shell-login',\n templateUrl: './login.html',\n styleUrl: './login.css',\n imports: [\n FormsModule,\n MatFormField,\n MatLabel,\n MatInput,\n MatInputModule,\n MatButtonModule,\n MatCheckboxModule,\n MatIconModule,\n RegexValidatorDirective,\n TextFieldModule,\n DatePipe,\n ],\n})\nexport class Login {\n model: Credentials = { username: '', password: '' };\n submitted = false;\n hide = signal(true);\n takeover = signal(true);\n errors: { ndx: number; message: string }[] = [];\n\n protected readonly USERNAME_REGEX = USERNAME_REGEX;\n protected readonly PASSWORD_REGEX = PASSWORD_REGEX;\n protected readonly appName = inject(SHELL_APP_NAME, { optional: true }) ?? 'Application';\n readonly #postLoginRoute = inject(SHELL_POST_LOGIN_ROUTE, { optional: true }) ?? '/';\n\n readonly #commandService = inject(CommandService);\n readonly #terminalFocusService = inject(TerminalFocusService);\n\n readonly #activatedRoute = inject(ActivatedRoute);\n\n constructor(\n protected authenticationService: AuthenticationService,\n protected router: Router,\n ) {}\n\n /**\n * Returns the post-login destination. Honors a `returnUrl` query param if\n * present and safe (same-origin, leading `/`, not protocol-relative);\n * otherwise falls back to `SHELL_POST_LOGIN_ROUTE`.\n */\n #resolvePostLoginUrl(): string {\n const candidate = this.#activatedRoute.snapshot.queryParamMap.get('returnUrl');\n if (!candidate) return this.#postLoginRoute;\n if (!candidate.startsWith('/')) return this.#postLoginRoute;\n if (candidate.startsWith('//')) return this.#postLoginRoute;\n if (/^https?:\\/\\//i.test(candidate)) return this.#postLoginRoute;\n return candidate;\n }\n\n onAutofill(event: AutofillEvent, inputEl: HTMLInputElement): void {\n if (event.isAutofilled) {\n setTimeout(() => {\n const length = inputEl.value.length;\n inputEl.setSelectionRange(length, length);\n });\n }\n }\n\n clickEvent(event: MouseEvent): void {\n this.hide.set(!this.hide());\n event.stopPropagation();\n }\n\n onSubmit(event: Event): void {\n this.errors = [];\n event.preventDefault();\n this.submitted = true;\n const result = validateCredentials(this.model);\n if (result === true) {\n this.#doLogin(this.takeover());\n } else {\n for (let ndx = 0; ndx < result.length; ndx++) {\n this.errors.push({\n ndx,\n message: `${result[ndx].message ?? 'Unknown error'}: ${result[ndx].field ?? 'Unknown field'} ${result[ndx].type ?? 'Unknown type'} Expected: ${result[ndx].expected} Actual: ${result[ndx].actual}`,\n });\n }\n this.submitted = false;\n }\n }\n\n onTakeOver(): void {\n this.errors = [];\n this.#commandService.execute('login --force');\n }\n\n onCancelConflict(): void {\n this.authenticationService.clearConflict();\n this.submitted = false;\n }\n\n #doLogin(force: boolean): void {\n this.authenticationService\n .login(this.model, force)\n .then(() => {\n this.#commandService.echoCommand(`login ${this.model.username}`);\n this.router.navigateByUrl(this.#resolvePostLoginUrl()).then(() => {\n setTimeout(() => this.#terminalFocusService.requestFocus());\n }).catch(console.error);\n })\n .catch((err) => {\n if (err !== 'conflict') {\n this.errors.push({ ndx: 0, message: typeof err === 'string' ? err : 'Unable to login' });\n }\n this.submitted = false;\n });\n }\n}\n","@let usernameRegex = USERNAME_REGEX;\n@let passwordRegex = PASSWORD_REGEX;\n<div class=\"login-container\">\n <div class=\"login-header\">\n <h2 class=\"text-text-primary\">{{ appName }}</h2>\n <p class=\"text-secondary-info\">Sign in to continue</p>\n </div>\n <form #loginForm=\"ngForm\" (ngSubmit)=\"onSubmit($event)\" class=\"login-form\">\n <mat-form-field appearance=\"outline\" class=\"login-field\">\n <mat-label>Username</mat-label>\n <input\n #usernameInput\n matInput\n placeholder=\"Enter username\"\n [(ngModel)]=\"model.username\"\n name=\"username\"\n [disabled]=\"submitted\"\n required\n regexValidator\n [regex]=\"usernameRegex\"\n (cdkAutofill)=\"onAutofill($event, usernameInput)\"\n />\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"login-field\">\n <mat-label>Password</mat-label>\n <input\n #passwordInput\n matInput\n placeholder=\"Enter password\"\n [type]=\"hide() ? 'password' : 'text'\"\n [(ngModel)]=\"model.password\"\n name=\"password\"\n [disabled]=\"submitted\"\n regexValidator\n [regex]=\"passwordRegex\"\n (cdkAutofill)=\"onAutofill($event, passwordInput)\"\n />\n <button\n mat-icon-button\n matSuffix\n type=\"button\"\n (click)=\"clickEvent($event)\"\n [attr.aria-label]=\"'Hide password'\"\n [attr.aria-pressed]=\"hide()\"\n >\n <mat-icon>{{ hide() ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n </mat-form-field>\n <mat-checkbox\n class=\"login-takeover\"\n name=\"takeover\"\n [checked]=\"takeover()\"\n (change)=\"takeover.set($event.checked)\"\n [disabled]=\"submitted\"\n >\n Takeover session if logged in elsewhere\n </mat-checkbox>\n <button mat-flat-button type=\"submit\" [disabled]=\"submitted\" class=\"login-button\">\n Login\n </button>\n </form>\n @if (errors.length > 0) {\n <div class=\"login-errors\">\n @for (error of errors; track error.ndx) {\n <div class=\"login-error text-loss\">{{ error.message }}</div>\n }\n </div>\n }\n @if (authenticationService.conflictSessions(); as sessions) {\n <div class=\"login-conflict\">\n @for (session of sessions; track $index) {\n <p class=\"text-secondary-info\">\n Already logged in from <strong>{{ session.appContext }}</strong>\n since {{ session.startEpoch | date:'short' }}.\n </p>\n }\n <p class=\"text-secondary-info\">Log in here and end that session?</p>\n <div class=\"login-conflict-actions\">\n <button mat-stroked-button type=\"button\" (click)=\"onCancelConflict()\">Cancel</button>\n <button mat-flat-button type=\"button\" (click)=\"onTakeOver()\">Take Over</button>\n </div>\n </div>\n }\n</div>\n","import { Component, inject } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\n\nexport interface ConfirmDialogData {\n title: string;\n message: string;\n warningMessage?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n}\n\n@Component({\n selector: 'shell-confirm-dialog',\n imports: [MatDialogModule, MatButtonModule],\n template: `\n <h2 mat-dialog-title>{{ data.title }}</h2>\n <mat-dialog-content>\n <p>{{ data.message }}</p>\n @if (data.warningMessage) {\n <p class=\"warning-message\">{{ data.warningMessage }}</p>\n }\n </mat-dialog-content>\n <mat-dialog-actions align=\"end\">\n <button mat-button (click)=\"dialogRef.close(false)\">{{ data.cancelLabel ?? 'Cancel' }}</button>\n <button mat-flat-button color=\"warn\" (click)=\"dialogRef.close(true)\">{{ data.confirmLabel ?? 'Confirm' }}</button>\n </mat-dialog-actions>\n `,\n styles: [`\n :host { display: block; }\n .warning-message { color: var(--color-warning); margin-top: 8px; }\n `],\n})\nexport class ConfirmDialog {\n readonly data = inject<ConfirmDialogData>(MAT_DIALOG_DATA);\n readonly dialogRef = inject(MatDialogRef<ConfirmDialog>);\n}\n","/*\n * Public API surface for @franzzemen/brokenstock-shell\n */\n\n// Types\nexport * from './lib/types/command.types';\nexport * from './lib/types/menu.types';\n\n// Tokens & config\nexport * from './lib/tokens/shell-tokens';\nexport * from './lib/provide-shell-config';\n\n// Guards\nexport * from './lib/guards/auth.guard';\nexport * from './lib/guards/guest.guard';\n\n// Interceptors\nexport * from './lib/interceptors/auth.interceptor';\n\n// Directives\nexport * from './lib/directives/regex-validator.directive';\n\n// FAQ help system\nexport * from './lib/faq/faq.types';\nexport * from './lib/faq/faq-content-loader.token';\nexport * from './lib/faq/faq-markdown-renderer.service';\nexport * from './lib/faq/http-faq-content-loader.service';\nexport * from './lib/faq/faq.service';\nexport * from './lib/faq/faq-history.service';\nexport * from './lib/faq/faq-modal/faq-modal';\nexport * from './lib/faq/faq-dev-mode.token';\nexport * from './lib/faq/faq-authoring-panel/faq-authoring-panel';\nexport * from './lib/faq/public-faq-index/public-faq-index';\nexport * from './lib/faq/public-faq-page/public-faq-page';\nexport * from './lib/faq/faq-seo.tokens';\n\n// Services\nexport * from './lib/services/thinking.service';\nexport * from './lib/services/theme.service';\nexport * from './lib/services/terminal-focus.service';\nexport * from './lib/services/keyboard-shortcut.service';\nexport * from './lib/services/authentication.service';\nexport * from './lib/services/command-registry.service';\nexport * from './lib/services/command.service';\n\n// Commands\nexport * from './lib/commands/command.utils';\n\n// Components\nexport * from './lib/components/shell/shell';\nexport * from './lib/components/side-menu/side-menu';\nexport * from './lib/components/status-bar/status-bar';\nexport * from './lib/components/main-content/main-content';\nexport * from './lib/components/command-terminal/command-terminal';\nexport * from './lib/components/login/login';\nexport * from './lib/components/confirm-dialog/confirm-dialog';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["serializeJsonLd","i1","i1.AuthenticationService","i2"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"franzzemen-brokenstock-shell.d.ts","sources":["../../src/lib/types/command.types.ts","../../src/lib/types/menu.types.ts","../../src/lib/tokens/shell-tokens.ts","../../src/lib/provide-shell-config.ts","../../src/lib/guards/auth.guard.ts","../../src/lib/guards/guest.guard.ts","../../src/lib/interceptors/auth.interceptor.ts","../../src/lib/directives/regex-validator.directive.ts","../../src/lib/faq/faq.types.ts","../../src/lib/faq/faq-content-loader.token.ts","../../src/lib/faq/faq-markdown-renderer.service.ts","../../src/lib/faq/http-faq-content-loader.service.ts","../../src/lib/faq/faq.service.ts","../../src/lib/faq/faq-history.service.ts","../../src/lib/faq/faq-modal/faq-modal.ts","../../src/lib/faq/faq-dev-mode.token.ts","../../src/lib/faq/faq-authoring-panel/faq-authoring-panel.ts","../../src/lib/faq/public-faq-index/public-faq-index.ts","../../src/lib/faq/public-faq-page/public-faq-page.ts","../../src/lib/faq/faq-seo.tokens.ts","../../src/lib/services/thinking.service.ts","../../src/lib/services/theme.service.ts","../../src/lib/services/terminal-focus.service.ts","../../src/lib/services/keyboard-shortcut.service.ts","../../src/lib/services/authentication.service.ts","../../src/lib/services/command-registry.service.ts","../../src/lib/services/command.service.ts","../../src/lib/commands/command.utils.ts","../../src/lib/components/shell/shell.ts","../../src/lib/components/side-menu/side-menu.ts","../../src/lib/components/status-bar/status-bar.ts","../../src/lib/components/main-content/main-content.ts","../../src/lib/components/command-terminal/command-terminal.ts","../../src/lib/components/login/login.ts","../../src/lib/components/confirm-dialog/confirm-dialog.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"franzzemen-brokenstock-shell.d.ts","sources":["../../src/lib/types/command.types.ts","../../src/lib/types/menu.types.ts","../../src/lib/tokens/shell-tokens.ts","../../src/lib/provide-shell-config.ts","../../src/lib/guards/auth.guard.ts","../../src/lib/guards/guest.guard.ts","../../src/lib/interceptors/auth.interceptor.ts","../../src/lib/directives/regex-validator.directive.ts","../../src/lib/faq/faq.types.ts","../../src/lib/faq/faq-content-loader.token.ts","../../src/lib/faq/faq-markdown-renderer.service.ts","../../src/lib/faq/http-faq-content-loader.service.ts","../../src/lib/faq/faq.service.ts","../../src/lib/faq/faq-history.service.ts","../../src/lib/faq/faq-modal/faq-modal.ts","../../src/lib/faq/faq-dev-mode.token.ts","../../src/lib/faq/faq-authoring-panel/faq-authoring-panel.ts","../../src/lib/faq/public-faq-index/public-faq-index.ts","../../src/lib/faq/public-faq-page/public-faq-page.ts","../../src/lib/faq/faq-seo.tokens.ts","../../src/lib/services/thinking.service.ts","../../src/lib/services/theme.service.ts","../../src/lib/services/terminal-focus.service.ts","../../src/lib/services/keyboard-shortcut.service.ts","../../src/lib/services/authentication.service.ts","../../src/lib/services/command-registry.service.ts","../../src/lib/services/command.service.ts","../../src/lib/commands/command.utils.ts","../../src/lib/components/shell/shell.ts","../../src/lib/components/side-menu/side-menu.ts","../../src/lib/components/status-bar/status-bar.ts","../../src/lib/components/main-content/main-content.ts","../../src/lib/components/command-terminal/command-terminal.ts","../../src/lib/components/login/login.ts","../../src/lib/components/confirm-dialog/confirm-dialog.ts"],"mappings":"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","names":[]}
|