@trismegisto/spine 2.0.0

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.
Files changed (55) hide show
  1. package/LICENSE +56 -0
  2. package/README.md +207 -0
  3. package/fesm2022/trismegisto-spine-audit.mjs +1299 -0
  4. package/fesm2022/trismegisto-spine-audit.mjs.map +1 -0
  5. package/fesm2022/trismegisto-spine-auto-service-auto-service-audit.component-CCiz-q8o.mjs +37 -0
  6. package/fesm2022/trismegisto-spine-auto-service-auto-service-audit.component-CCiz-q8o.mjs.map +1 -0
  7. package/fesm2022/trismegisto-spine-auto-service-auto-service-client-picker.component-Z0wCANF6.mjs +51 -0
  8. package/fesm2022/trismegisto-spine-auto-service-auto-service-client-picker.component-Z0wCANF6.mjs.map +1 -0
  9. package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-BYkUOwWL.mjs +595 -0
  10. package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-BYkUOwWL.mjs.map +1 -0
  11. package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-CqIVe2LU.mjs +357 -0
  12. package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-CqIVe2LU.mjs.map +1 -0
  13. package/fesm2022/trismegisto-spine-auto-service-auto-service.component-B5tyJ2zY.mjs +477 -0
  14. package/fesm2022/trismegisto-spine-auto-service-auto-service.component-B5tyJ2zY.mjs.map +1 -0
  15. package/fesm2022/trismegisto-spine-auto-service-home.component-vl3BPFnk.mjs +238 -0
  16. package/fesm2022/trismegisto-spine-auto-service-home.component-vl3BPFnk.mjs.map +1 -0
  17. package/fesm2022/trismegisto-spine-auto-service.mjs +154 -0
  18. package/fesm2022/trismegisto-spine-auto-service.mjs.map +1 -0
  19. package/fesm2022/trismegisto-spine-graphql.mjs +347 -0
  20. package/fesm2022/trismegisto-spine-graphql.mjs.map +1 -0
  21. package/fesm2022/trismegisto-spine-layout.mjs +2848 -0
  22. package/fesm2022/trismegisto-spine-layout.mjs.map +1 -0
  23. package/fesm2022/trismegisto-spine-modal.mjs +141 -0
  24. package/fesm2022/trismegisto-spine-modal.mjs.map +1 -0
  25. package/fesm2022/trismegisto-spine-notification.mjs +122 -0
  26. package/fesm2022/trismegisto-spine-notification.mjs.map +1 -0
  27. package/fesm2022/trismegisto-spine-routing.mjs +398 -0
  28. package/fesm2022/trismegisto-spine-routing.mjs.map +1 -0
  29. package/fesm2022/trismegisto-spine-shell.mjs +409 -0
  30. package/fesm2022/trismegisto-spine-shell.mjs.map +1 -0
  31. package/fesm2022/trismegisto-spine-side-panel.mjs +142 -0
  32. package/fesm2022/trismegisto-spine-side-panel.mjs.map +1 -0
  33. package/fesm2022/trismegisto-spine.mjs +2574 -0
  34. package/fesm2022/trismegisto-spine.mjs.map +1 -0
  35. package/package.json +94 -0
  36. package/types/trismegisto-spine-audit.d.ts +948 -0
  37. package/types/trismegisto-spine-audit.d.ts.map +1 -0
  38. package/types/trismegisto-spine-auto-service.d.ts +110 -0
  39. package/types/trismegisto-spine-auto-service.d.ts.map +1 -0
  40. package/types/trismegisto-spine-graphql.d.ts +72 -0
  41. package/types/trismegisto-spine-graphql.d.ts.map +1 -0
  42. package/types/trismegisto-spine-layout.d.ts +1054 -0
  43. package/types/trismegisto-spine-layout.d.ts.map +1 -0
  44. package/types/trismegisto-spine-modal.d.ts +68 -0
  45. package/types/trismegisto-spine-modal.d.ts.map +1 -0
  46. package/types/trismegisto-spine-notification.d.ts +62 -0
  47. package/types/trismegisto-spine-notification.d.ts.map +1 -0
  48. package/types/trismegisto-spine-routing.d.ts +205 -0
  49. package/types/trismegisto-spine-routing.d.ts.map +1 -0
  50. package/types/trismegisto-spine-shell.d.ts +143 -0
  51. package/types/trismegisto-spine-shell.d.ts.map +1 -0
  52. package/types/trismegisto-spine-side-panel.d.ts +66 -0
  53. package/types/trismegisto-spine-side-panel.d.ts.map +1 -0
  54. package/types/trismegisto-spine.d.ts +1161 -0
  55. package/types/trismegisto-spine.d.ts.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trismegisto-spine-layout.mjs","sources":["../../../projects/ui/layout/src/header/app-launcher.component.ts","../../../projects/ui/layout/src/header/app-launcher.component.html","../../../projects/ui/layout/src/brand.token.ts","../../../projects/ui/layout/src/header/brand.component.ts","../../../projects/ui/layout/src/onboarding/onboarding.service.ts","../../../projects/ui/layout/src/news/news.service.ts","../../../projects/ui/layout/src/settings/settings.service.ts","../../../projects/ui/layout/src/shortcuts/shortcut.service.ts","../../../projects/ui/layout/src/header/header.component.ts","../../../projects/ui/layout/src/header/header.component.html","../../../projects/ui/layout/src/workspace/spine-workspace-nav.service.ts","../../../projects/ui/layout/src/sidebar/sidebar.component.ts","../../../projects/ui/layout/src/sidebar/sidebar.component.html","../../../projects/ui/layout/src/onboarding/onboarding-placement.ts","../../../projects/ui/layout/src/onboarding/onboarding-overlay.component.ts","../../../projects/ui/layout/src/onboarding/onboarding-overlay.component.html","../../../projects/ui/layout/src/news/news-illustration.ts","../../../projects/ui/layout/src/news/news.component.ts","../../../projects/ui/layout/src/shortcuts/shortcuts-cheatsheet.component.ts","../../../projects/ui/layout/src/shortcuts/shortcuts-cheatsheet.component.html","../../../projects/ui/layout/src/settings/app-tokens.service.ts","../../../projects/ui/layout/src/settings/app-tokens.component.ts","../../../projects/ui/layout/src/settings/app-tokens.component.html","../../../projects/ui/layout/src/settings/settings-panel.component.ts","../../../projects/ui/layout/src/settings/settings-panel.component.html","../../../projects/ui/layout/src/docs/docs.service.ts","../../../projects/ui/layout/src/workspace/spine-page-bar.component.ts","../../../projects/ui/layout/src/workspace/spine-page-panel.component.ts","../../../projects/ui/layout/src/workspace/panel-local-link.directive.ts","../../../projects/ui/layout/src/docs/markdown.component.ts","../../../projects/ui/layout/src/docs/docs-modal.component.ts","../../../projects/ui/layout/src/connection/connection-banner.component.ts","../../../projects/ui/layout/src/layout.component.ts","../../../projects/ui/layout/src/trismegisto-spine-layout.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { ChangeDetectorRef, Component, OnInit, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { AppDef, AuthorizationService, RealmAppsService } from '@orfeu/angular/core';\nimport { IconButtonComponent, IconComponent, LoadingSquareComponent } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\n/**\n * A grade de apps não cabe no `MenuItem` de linha única do `hm-menu` (ícone grande + nome\n * embaixo, em coluna) — em vez de forçar isso num componente pensado pra lista de ações, usa\n * um popover próprio (mesmo padrão do backdrop-fecha-fora da busca global do header).\n */\n@Component({\n selector: 'spine-app-launcher',\n imports: [CommonModule, IconComponent, IconButtonComponent, LoadingSquareComponent],\n templateUrl: './app-launcher.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './app-launcher.component.scss',\n})\nexport class AppLauncherComponent implements OnInit {\n protected readonly text = inject(SPINE_MESSAGES).header;\n private readonly cdr = inject(ChangeDetectorRef);\n\n public apps: AppDef[] = [];\n public loading = false;\n public open = false;\n\n constructor(\n private authService: AuthorizationService,\n private realmAppsService: RealmAppsService,\n ) {}\n\n async ngOnInit(): Promise<void> {\n this.loading = true;\n const token = this.authService.getToken();\n // O client atual (o app em que o usuário já está) já vem excluído aqui —\n // OpenIDController.view no argos filtra por client_id no próprio backend\n // (apps/argos/auth/server/.../openid.controller.ts), então não há\n // necessidade de repetir essa checagem no front.\n try {\n this.apps = (await this.realmAppsService.getApplications(token)) ?? [];\n } catch {\n // Sem a lista não há o que oferecer: o botão some, em vez de ficar carregando para sempre.\n this.apps = [];\n } finally {\n this.loading = false;\n // A lista chega fora de qualquer evento do template: sem isto, app zoneless não redesenha.\n this.cdr.markForCheck();\n }\n }\n\n toggle(): void {\n this.open = !this.open;\n }\n\n close(): void {\n this.open = false;\n }\n}\n","<div class=\"app-launcher-trigger\" data-tour=\"apps\" *ngIf=\"loading || apps.length > 0\">\n <hm-icon-button emphasis=\"subtle\" icon=\"grid\" [label]=\"text.apps\" (clicked)=\"toggle()\"></hm-icon-button>\n\n <button type=\"button\" class=\"app-launcher-backdrop\" *ngIf=\"open\" (click)=\"close()\" aria-hidden=\"true\"></button>\n\n <div class=\"app-launcher-menu\" *ngIf=\"open\">\n <div class=\"app-launcher-header\">{{ text.apps }}</div>\n <div class=\"app-launcher-grid\">\n <div class=\"app-launcher-loading\" *ngIf=\"loading\">\n <hm-loading-square></hm-loading-square>\n </div>\n <a *ngFor=\"let app of apps\" [href]=\"app.app_url\" class=\"app-launcher-card\" target=\"_blank\"\n rel=\"noopener noreferrer\">\n <div class=\"app-launcher-icon\">\n <hm-icon shape=\"applications\" size=\"32\"></hm-icon>\n </div>\n <span class=\"app-launcher-name\">{{ app.name }}</span>\n </a>\n </div>\n </div>\n</div>\n","import { InjectionToken, Type } from '@angular/core';\n\n/**\n * Componente de marca que o header do shell desenha no lugar da imagem de `SpineConfig.logo` (tem\n * prioridade sobre ela). Injeção em vez de projeção de conteúdo porque o `LayoutComponent` é montado\n * pelo `Router`, não pelo template do app — não existe `<ng-content>` alcançável de fora. O componente\n * fica dentro do link da marca (que leva à home): não ponha link nem botão nele, e se ele for só\n * imagem, dê nome acessível ou deixe o `appName` visível (`showAppName`, padrão `true`).\n * `null` (padrão) usa a imagem. Ex.: `{ provide: SPINE_BRAND, useValue: MarcaComponent }` no\n * `app.config.ts`.\n */\nexport const SPINE_BRAND = new InjectionToken<Type<unknown> | null>('SPINE_BRAND', {\n providedIn: 'root',\n factory: () => null,\n});\n","import { NgComponentOutlet, NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, signal } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { SPINE_CONFIG, ThemeService, resolveSpineLogo } from '@trismegisto/spine';\nimport { SPINE_BRAND } from '../brand.token';\n\n/**\n * Marca do header: logo do app (`SpineConfig.logo`, padrão `assets/images/logo.svg`) + `appName`, dentro\n * de um link para a home. Ordem: componente de `SPINE_BRAND` > imagem > só o nome.\n *\n * - Tema escuro usa `logo.dark` quando houver; se ele falhar, volta para `logo.light`.\n * - Imagem que não carrega (404/erro) some — nada de ícone quebrado — e o nome aparece mesmo com\n * `showAppName: false`, para o link nunca ficar sem texto.\n * - Texto alternativo: `logo.alt` se configurado; senão o `appName` quando o nome está escondido, e vazio\n * (imagem decorativa) quando o nome já está ao lado — o leitor de tela não lê o nome duas vezes.\n */\n@Component({\n selector: 'spine-brand',\n imports: [RouterLink, NgTemplateOutlet, NgComponentOutlet],\n template: `\n @if (homeRoute()) {\n <a class=\"brand\" [routerLink]=\"homeRoute()\" [title]=\"label()\">\n <ng-container *ngTemplateOutlet=\"content\" />\n </a>\n } @else {\n <span class=\"brand\" [title]=\"label()\">\n <ng-container *ngTemplateOutlet=\"content\" />\n </span>\n }\n <ng-template #content>\n @if (brand) {\n <ng-container *ngComponentOutlet=\"brand\" />\n } @else if (src(); as s) {\n <img class=\"brand__logo\" [src]=\"s\" [alt]=\"alt()\" (error)=\"onError(s)\" />\n }\n @if (nameVisible()) {\n <span class=\"brand__name\">{{ appName }}</span>\n }\n </ng-template>\n `,\n styleUrl: './brand.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SpineBrandComponent {\n /** Rota da home (primeira rota navegável); `null` desenha a marca sem link. */\n readonly homeRoute = input<string | null>(null);\n /** Dica do link (ex.: \"Página inicial\"). */\n readonly label = input('');\n\n private readonly config = inject(SPINE_CONFIG, { optional: true });\n private readonly theme = inject(ThemeService);\n protected readonly brand = inject(SPINE_BRAND);\n protected readonly appName = this.config?.appName ?? 'Hermes';\n private readonly sources = resolveSpineLogo(this.config?.logo);\n private readonly showAppName = this.config?.showAppName !== false;\n /** Endereços que já deram erro nesta sessão do componente. */\n private readonly failed = signal<ReadonlySet<string>>(new Set());\n\n /** Imagem a mostrar agora (tema atual, sem as que falharam); `null` = nenhuma. */\n readonly src = computed<string | null>(() => {\n const logo = this.sources;\n if (!logo || this.brand) return null;\n const failed = this.failed();\n if (this.theme.current === 'dark' && logo.dark && !failed.has(logo.dark)) return logo.dark;\n return failed.has(logo.light) ? null : logo.light;\n });\n\n readonly nameVisible = computed(() => this.showAppName || (!this.brand && !this.src()));\n\n readonly alt = computed(() => this.sources?.alt ?? (this.nameVisible() ? '' : this.appName));\n\n onError(src: string): void {\n if (this.failed().has(src)) return;\n this.failed.update((set) => new Set(set).add(src));\n }\n}\n","import { Inject, Injectable, Optional, inject } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { SPINE_CONFIG, SpineConfig, SPINE_MESSAGES } from '@trismegisto/spine';\n\nexport interface OnboardingStep {\n /** seletor CSS do alvo; ausente = passo centralizado (boas-vindas/encerramento). */\n target?: string;\n title: string;\n /** pode conter HTML simples (<b>). */\n description: string;\n}\n\n// Entra na chave de \"já visto\": trocar a versão faz o tour aparecer de novo para todo mundo.\nconst ONBOARDING_VERSION = 'v3';\n\n// Partes do shell chegam depois do login (abas, barra de página): o tour espera por elas, mas não\n// para sempre. Os passos cujo alvo não apareceu no prazo ficam de fora.\nconst TARGET_WAIT_MS = 3000;\nconst TARGET_POLL_MS = 150;\n\n/**\n * Primeiro elemento do seletor que está de fato na tela (tem tamanho e conteúdo). Não usa\n * `offsetParent`: ele é `null` pra `position: fixed` (a sidebar) e pra `display: contents`, e o\n * passo sumia do tour mesmo com o alvo visível. Com as abas vivas do workspace há uma barra de\n * página por aba — só a da aba ativa tem tamanho, e é ela que o holofote precisa achar.\n */\nexport function findTourTarget(selector: string): HTMLElement | null {\n for (const el of Array.from(document.querySelectorAll<HTMLElement>(selector))) {\n const r = el.getBoundingClientRect();\n if (r.width > 0 && r.height > 0 && el.children.length > 0) return el;\n }\n return null;\n}\n\n/**\n * Onboarding interativo próprio (sem dependência externa). O overlay/holofote e o\n * balão são renderizados pelo OnboardingOverlayComponent, que escuta este serviço.\n * Aparece uma vez por máquina (flag em localStorage), namespaced por cliente.\n */\n@Injectable({ providedIn: 'root' })\nexport class OnboardingService {\n private readonly text = inject(SPINE_MESSAGES).tour;\n /** Passo atual (null = tour inativo). O overlay component reage a isto. */\n public readonly current$ = new BehaviorSubject<{\n step: OnboardingStep;\n index: number;\n total: number;\n } | null>(null);\n\n private readonly doneKey: string;\n private steps: OnboardingStep[] = [];\n private index = 0;\n private waiting: ReturnType<typeof setTimeout> | null = null;\n\n constructor(@Optional() @Inject(SPINE_CONFIG) config: SpineConfig | null) {\n const ns = config?.clientId ?? 'app';\n this.doneKey = `${ns}_onboarding_${ONBOARDING_VERSION}`;\n }\n\n private get done(): boolean {\n try { return localStorage.getItem(this.doneKey) === 'done'; } catch { return true; }\n }\n private markDone(): void {\n try { localStorage.setItem(this.doneKey, 'done'); } catch { /* sem localStorage → não insiste */ }\n }\n\n /** Dispara o tour só se ainda não foi visto nesta máquina. Chamar após o login. */\n maybeStart(): void {\n if (this.done) return;\n setTimeout(() => this.start(), 700); // garante header/breadcrumb renderizados\n }\n\n /** Reabre o tour manualmente (menu Ajuda), ignorando a flag. */\n restart(): void {\n this.start();\n }\n\n /** Passos no idioma ativo (o texto é lido do catálogo ao começar o tour). Descrições com `<b>`. */\n private allSteps(): OnboardingStep[] {\n const t = this.text;\n return [\n { title: t.welcomeTitle, description: t.welcomeText },\n { target: '[data-tour=\"apps\"]', title: t.appsTitle, description: t.appsText },\n { target: '[data-tour=\"search\"]', title: t.searchTitle, description: t.searchText },\n { target: '[data-tour=\"nav\"] .hm-sidebar__content', title: t.navModulesTitle, description: t.navModulesText },\n { target: '[data-tour=\"nav\"] .hm-sidebar__footer', title: t.navModeTitle, description: t.navModeText },\n { target: '[data-tour=\"tabs\"] hm-tab-bar', title: t.tabsTitle, description: t.tabsText },\n { target: '[data-tour=\"tabs\"]', title: t.splitTitle, description: t.splitText },\n { target: '[data-tour=\"breadcrumb\"]', title: t.whereTitle, description: t.whereText },\n { target: '[data-tour=\"theme\"]', title: t.themeTitle, description: t.themeText },\n { target: '[data-tour=\"density\"]', title: t.densityTitle, description: t.densityText },\n { target: '[data-tour=\"fullscreen\"]', title: t.fullscreenTitle, description: t.fullscreenText },\n { target: '[data-tour=\"profile\"]', title: t.profileTitle, description: t.profileText },\n { title: t.doneTitle, description: t.doneText },\n ];\n }\n\n /**\n * Começa do primeiro passo assim que todos os alvos estão na tela, ou no fim do prazo só com os passos\n * que têm alvo visível (e os sem alvo). Sem nenhum passo, só marca como visto. Não bloqueia: confere\n * de novo a cada `TARGET_POLL_MS`.\n */\n private start(): void {\n if (this.waiting !== null) clearTimeout(this.waiting);\n this.waiting = null;\n const steps = this.allSteps();\n const present = (step: OnboardingStep) => !step.target || findTourTarget(step.target) !== null;\n\n const attempt = (waited: number): void => {\n if (!steps.every(present) && waited < TARGET_WAIT_MS) {\n this.waiting = setTimeout(() => attempt(waited + TARGET_POLL_MS), TARGET_POLL_MS);\n return;\n }\n this.waiting = null;\n this.steps = steps.filter(present);\n this.index = 0;\n if (!this.steps.length) {\n this.markDone();\n return;\n }\n this.emit();\n };\n attempt(0);\n }\n\n private emit(): void {\n this.current$.next({ step: this.steps[this.index], index: this.index, total: this.steps.length });\n }\n\n next(): void {\n if (this.index >= this.steps.length - 1) { this.finish(); return; }\n this.index++;\n this.emit();\n }\n\n prev(): void {\n if (this.index <= 0) return;\n this.index--;\n this.emit();\n }\n\n /** Encerra o tour (concluído ou pulado) e marca como visto. */\n finish(): void {\n this.markDone();\n this.current$.next(null);\n }\n\n get isFirst(): boolean { return this.index === 0; }\n get isLast(): boolean { return this.index === this.steps.length - 1; }\n}\n","import { Injectable, computed, inject, signal } from '@angular/core';\nimport { SPINE_CONFIG, SPINE_NEWS, SpineNewsItem, SpineNewsSlide } from '@trismegisto/spine';\nimport { filter, take } from 'rxjs';\nimport { OnboardingService } from '../onboarding/onboarding.service';\n\n/** Intervalo entre o fim do tour (ou a entrada, sem tour) e o painel de novidades, para os dois não se\n * emendarem na tela. */\nconst AFTER_TOUR_MS = 800;\n/** Tempo mínimo desde a entrada antes de oferecer — o tour, se devido, já começou (ele espera 700ms). */\nconst FIRST_CHECK_MS = 1500;\n\n/**\n * Painel de novidades do app (ver `provideSpineNews`). Decide o que está devido — ainda não visto\n * NESTE navegador e ainda dentro do `until` — e abre sozinho uma vez, depois do tour de boas-vindas.\n * O \"já visto\" é por app (`hermes_<clientId>_news_seen`): novidade de um app não some por ter sido\n * vista em outro no mesmo domínio.\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineNewsService {\n private readonly onboarding = inject(OnboardingService);\n private readonly items: readonly SpineNewsItem[] = (inject(SPINE_NEWS, { optional: true }) ?? []).flat();\n private readonly seenKey: string;\n\n /** Slides em exibição (os devidos, ou todos os vigentes quando reaberto pelo menu). */\n readonly slides = signal<readonly SpineNewsSlide[]>([]);\n readonly isOpen = signal(false);\n /** Há alguma novidade vigente — o item \"Novidades\" do menu só aparece com isto. */\n readonly hasAny = computed(() => this.current().length > 0);\n\n constructor() {\n const ns = inject(SPINE_CONFIG, { optional: true })?.clientId;\n this.seenKey = `${ns ? `hermes_${ns}` : 'hermes'}_news_seen`;\n }\n\n /** Chamado uma vez pelo layout na entrada: abre as devidas, esperando o tour terminar. */\n scheduleOnEntry(): void {\n if (this.due().length === 0) return;\n setTimeout(() => {\n this.onboarding.current$\n .pipe(filter((step) => step === null), take(1))\n .subscribe(() => setTimeout(() => this.showDue(), AFTER_TOUR_MS));\n }, FIRST_CHECK_MS);\n }\n\n /** Marca como vistas todas as novidades devidas e as abre num único painel. */\n showDue(): void {\n const due = this.due();\n if (due.length === 0) return;\n this.markSeen(due.map((i) => i.id));\n this.open(due);\n }\n\n /** Reabre todas as vigentes (menu do perfil), vistas ou não. */\n showAll(): void {\n this.open(this.current());\n }\n\n close(): void {\n this.isOpen.set(false);\n }\n\n private open(items: readonly SpineNewsItem[]): void {\n const slides = items.flatMap((i) => i.slides);\n if (slides.length === 0) return;\n this.slides.set(slides);\n this.isOpen.set(true);\n }\n\n /** Vigentes: sem `until`, ou com `until` ainda não passado (comparação por data, AAAA-MM-DD). */\n private current(): readonly SpineNewsItem[] {\n const today = new Date().toISOString().slice(0, 10);\n return this.items.filter((i) => !i.until || today <= i.until);\n }\n\n private due(): readonly SpineNewsItem[] {\n const seen = this.readSeen();\n return this.current().filter((i) => !seen.has(i.id));\n }\n\n private readSeen(): Set<string> {\n try {\n return new Set(JSON.parse(localStorage.getItem(this.seenKey) || '[]') as string[]);\n } catch {\n return new Set();\n }\n }\n\n private markSeen(ids: readonly string[]): void {\n try {\n const seen = this.readSeen();\n ids.forEach((id) => seen.add(id));\n localStorage.setItem(this.seenKey, JSON.stringify([...seen]));\n } catch {\n /* sem localStorage: mostra de novo na próxima entrada, sem quebrar nada */\n }\n }\n}\n","import { InjectionToken, Injectable, Provider, Type, signal } from '@angular/core';\n\n/** Seções que o próprio spine já traz. `key` é também o valor de `?settings=` na URL. */\nexport const SPINE_SETTINGS_KEYS = {\n appearance: 'aparencia',\n region: 'regiao',\n shortcuts: 'atalhos',\n account: 'conta',\n about: 'sobre',\n} as const;\n\n/** Seção extra do painel, registrada pelo app (ex.: preferências de deploy do hefesto). */\nexport interface SpineSettingsSection {\n /** Identificador estável; também o que `?settings=<key>` abre. Não repetir os do spine. */\n key: string;\n label: string;\n /** Ícone do hermes-icon na navegação. */\n icon?: string;\n description?: string;\n /** Termos extras que acham a seção inteira na busca. */\n keywords?: string;\n /** Conteúdo da seção — de preferência `hm-settings-row`s, para a busca achar cada linha. */\n component: Type<unknown>;\n}\n\nexport const SPINE_SETTINGS_SECTIONS = new InjectionToken<SpineSettingsSection[]>('SPINE_SETTINGS_SECTIONS');\n\n/** Registra uma seção do app no painel de configurações (aparece depois das do spine, antes de\n * \"Sobre\"). Pode ser chamado várias vezes, uma por seção. */\nexport function provideSettingsSection(section: SpineSettingsSection): Provider {\n return { provide: SPINE_SETTINGS_SECTIONS, useValue: section, multi: true };\n}\n\n/** Abre/fecha o painel de configurações de qualquer lugar (menu do perfil, atalho, link). */\n@Injectable({ providedIn: 'root' })\nexport class SpineSettingsService {\n readonly isOpen = signal(false);\n /** Seção pedida na abertura (vazio = a primeira). */\n readonly section = signal('');\n\n open(section = ''): void {\n this.section.set(section);\n this.isOpen.set(true);\n }\n\n close(): void {\n this.isOpen.set(false);\n }\n\n toggle(): void {\n if (this.isOpen()) this.close();\n else this.open();\n }\n}\n","import { Injectable, OnDestroy, computed, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { HERMES_MESSAGES, HermesShortcut, HermesShortcutItem, HermesShortcutService } from '@trismegisto/angular';\nimport { SPINE_CONFIG, SPINE_MESSAGES } from '@trismegisto/spine';\n\n/** Grupo do painel de atalhos. Id estável; o nome exibido vem do catálogo da lib (`shortcuts.groups`). */\nexport type ShortcutGroupId = 'navigation' | 'actions' | 'general';\n\n/** Item exibido no painel de atalhos (cheatsheet, aberto com \"?\"). */\nexport interface ShortcutItem {\n /** Teclas já em texto, na plataforma atual (`'Ctrl + K'`, `'⌘K'`, `'G depois H'`). */\n keys: string;\n description: string;\n group: ShortcutGroupId;\n}\n\n/** Atalhos agrupados, já com o nome do grupo no idioma ativo. */\nexport interface ShortcutGroup {\n id: ShortcutGroupId;\n name: string;\n items: ShortcutItem[];\n}\n\n/** Ações concretas que o atalho dispara — ligadas pelo LayoutComponent. */\nexport interface ShortcutActions {\n navigate?: (url: string) => void; // navega para uma rota (ex.: '/home', favorito)\n toggleTheme?: () => void; // alterna claro/escuro\n toggleFullscreen?: () => void; // tela cheia\n logout?: () => void; // sair\n openSettings?: () => void; // painel de configurações\n}\n\n/** `G 1` … `G 9`: um registro só (o dígito sai do evento); a referência identifica o item no painel. */\nconst FAVORITE_KEYS: readonly string[] = Array.from({ length: 9 }, (_, i) => `G ${i + 1}`);\n/** Como os favoritos aparecem no painel: uma linha \"G depois 1…9\" em vez de nove alternativas. */\nconst FAVORITE_DISPLAY_KEYS = 'G 1…9';\n\n/**\n * Atalhos de teclado globais do sistema, sobre o `HermesShortcutService` da lib (um listener só,\n * sequência `G H`, conflito, campo editável, interruptor de tecla única da WCAG 2.1.4).\n *\n * `setActions` registra os atalhos do shell: `G H` (Home), `G 1`…`G 9` (favoritos), `Mod+,`\n * (configurações), `Mod+.` (tema), `Mod+Shift+F` (tela cheia), `Mod+Shift+L` (sair) e `?` (painel\n * de atalhos, via `help$`). Os combos com `Mod` valem também com o foco num campo; `G …` e `?`, não.\n *\n * O painel (`spine-shortcuts-cheatsheet` e a seção Atalhos das configurações) usa o\n * `hm-shortcut-list` com `panelItems()`: tudo o que está registrado no `HermesShortcutService`\n * (inclusive o que o app liga com `[hmShortcut]`) mais o que o spine só exibe e outra peça dispara\n * (`Mod+K` do `hm-header`, `Alt+←/→` do navegador, `Esc` dos diálogos).\n */\n@Injectable({ providedIn: 'root' })\nexport class ShortcutService implements OnDestroy {\n private actions: ShortcutActions = {};\n private removers: (() => void)[] = [];\n private readonly favKey = `${inject(SPINE_CONFIG, { optional: true })?.clientId ?? 'app'}_nav_favorites`;\n private readonly hermes = inject(HermesShortcutService);\n private readonly lib = inject(HERMES_MESSAGES);\n private readonly text = inject(SPINE_MESSAGES).shortcuts;\n\n /** Emite quando o usuário pede o painel de atalhos (tecla \"?\" ou menu do perfil). */\n public readonly help$ = new Subject<void>();\n\n /** Teclas (referência) → descrição viva, para o painel acompanhar a troca de idioma. */\n private readonly own = new Map<string | readonly string[], () => string>();\n\n /** Os atalhos do shell. `describe` lê o catálogo na hora (o idioma pode mudar depois do registro). */\n private definitions(): (Omit<HermesShortcut, 'description'> & { describe: () => string })[] {\n const t = this.text;\n return [\n { keys: ['G H'], describe: () => t.goHome, group: 'navigation', handler: () => this.navigate('/home') },\n { keys: FAVORITE_KEYS, describe: () => t.goFavorite, group: 'navigation', handler: (e) => this.goToFavorite(e) },\n { keys: ['Mod+,'], describe: () => t.openSettings, group: 'actions', allowInInputs: true, handler: () => this.call(this.actions.openSettings) },\n { keys: ['Mod+.'], describe: () => t.toggleTheme, group: 'actions', allowInInputs: true, handler: () => this.call(this.actions.toggleTheme) },\n { keys: ['Mod+Shift+F'], describe: () => t.fullscreen, group: 'actions', allowInInputs: true, handler: () => this.call(this.actions.toggleFullscreen) },\n { keys: ['Mod+Shift+L'], describe: () => t.logout, group: 'actions', allowInInputs: true, handler: () => this.call(this.actions.logout) },\n { keys: ['?'], describe: () => t.showHelp, group: 'general', handler: () => this.help$.next() },\n ];\n }\n\n /** Só exibidos: quem dispara é outra peça (hm-header, navegador, diálogos). */\n private displayOnly(): HermesShortcutItem[] {\n const t = this.text;\n return [\n { keys: 'Mod+K', description: t.openSearch, group: 'navigation' },\n { keys: ['Alt+Left', 'Alt+Right'], description: t.history, group: 'navigation' },\n { keys: 'Esc', description: t.closeOverlay, group: 'general' },\n ];\n }\n\n /**\n * O que o painel lista (`<hm-shortcut-list [registered]=\"false\" [items]=\"panelItems()\">`): os\n * atalhos registrados no `HermesShortcutService`, com os favoritos numa linha só, e os só exibidos.\n * Acompanha registro/remoção e a troca de idioma do catálogo da lib.\n */\n public readonly panelItems = computed<readonly HermesShortcutItem[]>(() => {\n const registered = this.hermes.list().map((item) => {\n const describe = this.own.get(item.keys);\n if (!describe) return item;\n return { ...item, description: describe(), keys: item.keys === FAVORITE_KEYS ? FAVORITE_DISPLAY_KEYS : item.keys };\n });\n const display = this.displayOnly();\n // Ordem do painel antigo: busca e histórico abrem a navegação, Esc fecha o geral.\n return [display[0], ...registered, display[1], display[2]];\n });\n\n /**\n * Lista do painel em texto, no idioma e na plataforma atuais.\n * @deprecated Use o `hm-shortcut-list` com `panelItems()` (ou `HermesShortcutService.list()`).\n * Mantido para quem montava o próprio painel; sai numa próxima versão.\n */\n public get shortcuts(): ShortcutItem[] {\n return this.panelItems().map((item) => ({\n keys: this.keysText(item.keys),\n description: item.description,\n group: toSpineGroup(item.group),\n }));\n }\n\n /**\n * Atalhos por grupo, na ordem navegação → ações → geral, com o nome do grupo traduzido.\n * @deprecated Use o `hm-shortcut-list` (agrupa, traduz e desenha as teclas). Sai numa próxima versão.\n */\n public groups(): ShortcutGroup[] {\n const all = this.shortcuts;\n return (['navigation', 'actions', 'general'] as const)\n .map((id) => ({ id, name: this.hermes.groupName(id), items: all.filter((s) => s.group === id) }))\n .filter((g) => g.items.length);\n }\n\n /** Liga as ações e registra os atalhos no `HermesShortcutService` (idempotente: chamadas seguintes só trocam as ações). */\n setActions(actions: ShortcutActions): void {\n this.actions = { ...this.actions, ...actions };\n if (this.removers.length) return;\n this.removers = this.definitions().map(({ describe, ...definition }) => {\n // Teclas sempre em lista própria: a referência identifica o registro do spine no painel.\n this.own.set(definition.keys, describe);\n const remove = this.hermes.register({ ...definition, description: describe() });\n return () => {\n remove();\n this.own.delete(definition.keys);\n };\n });\n }\n\n ngOnDestroy(): void {\n this.removers.forEach((remove) => remove());\n this.removers = [];\n }\n\n // ── interno ────────────────────────────────────────────────────────────────\n\n /** Ação ausente devolve `false`: o evento segue sem `preventDefault` (o navegador faz o dele). */\n private call(fn?: () => void): boolean {\n if (!fn) return false;\n fn();\n return true;\n }\n\n private navigate(url: string): boolean {\n return this.call(this.actions.navigate && (() => this.actions.navigate!(url)));\n }\n\n /** Navega para o N-ésimo favorito (1-based) lido da store da navegação; N = o dígito do evento. */\n private goToFavorite(event: KeyboardEvent): boolean {\n const digit = /^[1-9]$/.test(event.key) ? event.key : /^Digit([1-9])$/.exec(event.code)?.[1];\n if (!digit) return false;\n let url: string | null = null;\n try {\n const list = JSON.parse(localStorage.getItem(this.favKey) || '[]');\n const fav = Array.isArray(list) ? list[Number(digit) - 1] : null;\n url = fav?.redirect || (typeof fav?.id === 'string' && fav.id.startsWith('/') ? fav.id : null);\n } catch { /* store inválida → ignora */ }\n return url ? this.navigate(url) : false;\n }\n\n /** Texto corrido das teclas para a API antiga (`shortcuts`): \"Ctrl + K\", \"G depois H\", \"… ou …\". */\n private keysText(keys: string | readonly string[]): string {\n const { then, or } = this.lib.shortcuts;\n const join = this.hermes.platform === 'mac' ? '' : ' + ';\n return this.hermes\n .format(keys)\n .map((steps) => steps.map((step) => step.map((key) => key.label).join(join)).join(` ${then} `))\n .join(` ${or} `);\n }\n}\n\nfunction toSpineGroup(group: string | undefined): ShortcutGroupId {\n return group === 'navigation' || group === 'actions' ? group : 'general';\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, ElementRef, Injector, OnInit, Optional, Inject, Type, ViewChild, afterNextRender, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { filter, take } from 'rxjs';\nimport { AuthorizationService, UserProfile, ViewService } from '@orfeu/angular/core';\nimport {\n AccountAvatarComponent,\n HeaderComponent as HermesHeaderComponent,\n IconButtonComponent,\n IconComponent,\n InputComponent,\n MenuButtonComponent,\n MenuItem,\n ModalComponent,\n} from '@trismegisto/angular';\nimport { DensityService, Route, SPINE_CONFIG, SpineConfig, ThemePresetService, ThemeService, SPINE_MESSAGES, spineRoutesOf } from '@trismegisto/spine';\nimport { AppLauncherComponent } from './app-launcher.component';\nimport { SpineBrandComponent } from './brand.component';\nimport { OnboardingService } from '../onboarding/onboarding.service';\nimport { SpineNewsService } from '../news/news.service';\nimport { ShortcutService } from '../shortcuts/shortcut.service';\nimport { SpineSettingsService, SPINE_SETTINGS_KEYS } from '../settings/settings.service';\nimport { formatMessage } from '@trismegisto/primitives';\n\n/** Item achatado da árvore de rotas, usado pela busca global (quick-launcher). */\ninterface QuickItem { name: string; icon: string; redirect: string; path: string; }\n\nconst MAX_RECENT_SEARCH = 6;\n\n@Component({\n selector: 'spine-header',\n imports: [\n CommonModule, FormsModule,\n HermesHeaderComponent, IconButtonComponent, IconComponent, InputComponent, MenuButtonComponent, AccountAvatarComponent, ModalComponent,\n AppLauncherComponent, SpineBrandComponent,\n ],\n templateUrl: './header.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './header.component.scss',\n})\nexport class HeaderComponent implements OnInit {\n\n public isFullscreen = !!document.fullscreenElement;\n public element = document.documentElement;\n public headerBlocked = false;\n /** route_redirect da primeira rota navegável da view atual — usado pela marca do header.\n * null quando a view não tem nenhuma rota (nesse caso a marca não é link). */\n public homeRoute: string | null = null;\n /** Nome do app (SpineConfig.appName; padrão \"Hermes\") — quem desenha é o `spine-brand`. */\n protected readonly appName: string;\n\n private readonly injector = inject(Injector);\n protected readonly text = inject(SPINE_MESSAGES).header;\n protected readonly fmt = formatMessage;\n private readonly settings = inject(SpineSettingsService);\n private readonly news = inject(SpineNewsService);\n private readonly recentSearchKey: string;\n\n constructor(\n private authService: AuthorizationService,\n protected themeService: ThemeService,\n protected themePresetService: ThemePresetService,\n protected densityService: DensityService,\n private viewService: ViewService,\n private router: Router,\n private onboarding: OnboardingService,\n private shortcuts: ShortcutService,\n @Optional() @Inject(SPINE_CONFIG) config: SpineConfig | null,\n ) {\n this.appName = config?.appName ?? 'Hermes';\n const ns = config?.clientId ?? 'app';\n this.recentSearchKey = `${ns}_header_recent_searches`;\n }\n\n async ngOnInit(): Promise<void> {\n this.updateView(this.viewService.currentView);\n this.viewService.currentView$.subscribe((data: any) => this.updateView(data));\n\n // Depois de trocar de badge, a view/rotas mudam — sem isso o usuário fica\n // parado numa rota que pode não existir mais pro badge novo. Se o badge novo\n // não tiver nenhuma view disponível, manda pro no-permission em vez de travar.\n //\n // badgeChanged$ dispara ANTES do ViewService.currentView ser atualizado\n // (AuthorizationService.switchBadge emite o evento em applyToken() e só\n // depois faz `await view.update(token)`), então não dá pra usar\n // currentView na hora do evento — ele ainda é a view do badge anterior.\n // Por isso esperamos a próxima emissão *diferente* de currentView$ antes\n // de decidir o redirect.\n this.authService.badgeChanged$.subscribe(() => {\n const staleView = this.viewService.currentView;\n this.viewService.currentView$\n .pipe(filter((v: any) => v !== staleView), take(1))\n .subscribe((data: any) => {\n const firstRoute = this.findFirstNavigable(spineRoutesOf(data));\n this.router.navigate([firstRoute ?? '/no-permission']);\n });\n });\n\n this.recentSearches = this.loadRecent();\n }\n\n updateView(data: any) {\n const routes = spineRoutesOf(data);\n this.quickIndex = this.flattenRoutes(routes, []);\n this.homeRoute = this.findFirstNavigable(routes);\n }\n\n /** Primeira rota navegável (DFS), atravessando grupos \"transparentes\" sem route_redirect. */\n private findFirstNavigable(routes: Route[]): string | null {\n for (const r of routes || []) {\n if (!r) continue;\n if (r.route_redirect) return r.route_redirect;\n if (r.routes?.length) {\n const found = this.findFirstNavigable(r.routes as Route[]);\n if (found) return found;\n }\n }\n return null;\n }\n\n setTheme(theme: 'light' | 'dark') {\n this.themeService.setTheme(theme);\n }\n\n setDensity() { this.densityService.toggleDensity(); }\n get isCompactDensity(): boolean { return this.densityService.current.name === 'compact'; }\n\n toggleFullscreen() {\n if (!document.fullscreenElement) {\n this.element.requestFullscreen()\n .then(() => { this.isFullscreen = true; })\n .catch(err => console.error(`Erro ao ativar tela cheia: ${err.message}`));\n } else {\n document.exitFullscreen()\n .then(() => { this.isFullscreen = false; })\n .catch(err => console.error(`Erro ao sair da tela cheia: ${err.message}`));\n }\n }\n\n get badge() { return this.authService.badge; }\n get badges() { return this.authService.badges; }\n get profile(): UserProfile { return this.authService.profile; }\n\n async switchBadge(badgeTypeId: string): Promise<void> {\n await this.authService.switchBadge(badgeTypeId);\n }\n\n logout() { this.authService.logout(); }\n\n /** Reabre o tour guiado de onboarding. */\n startTour() { this.onboarding.restart(); }\n\n /** Abre o painel de atalhos de teclado. */\n openShortcuts() { this.shortcuts.help$.next(); }\n\n /** Menu do perfil: achatado (badges, se houver mais de um, + ações), já que `hm-menu`\n * não tem submenu aninhado como o `hermes-dropdown` antigo tinha para a troca de crachá. */\n get profileMenuItems(): MenuItem[] {\n const items: MenuItem[] = [];\n // Vários níveis de acesso: um item que abre um segundo menu (MenuItem.children) em vez de listar\n // todos os níveis direto no menu do perfil.\n if (this.badges.length > 1) {\n items.push({\n id: 'badges',\n label: this.text.accessLevels,\n icon: 'shield-check',\n children: this.badges.map(b => ({ id: `badge:${b.id}`, label: b.name, icon: 'shield-check', disabled: b.id === this.badge?.id })),\n });\n }\n items.push({ id: 'settings', label: this.text.settings, icon: 'cog', separatorAbove: items.length > 0 });\n items.push({ id: 'theme', label: this.text.appearance, icon: 'color-palette' });\n items.push({ id: 'shortcuts', label: this.text.shortcuts, icon: 'keyboard' });\n items.push({ id: 'tour', label: this.text.tour, icon: 'play' });\n // Só quando o app registrou alguma novidade vigente (provideSpineNews).\n if (this.news.hasAny()) items.push({ id: 'news', label: this.text.news, icon: 'star' });\n items.push({ id: 'logout', label: this.text.logout, icon: 'logout', danger: true, separatorAbove: true });\n return items;\n }\n\n onProfileMenuChosen(id: string): void {\n if (id.startsWith('badge:')) { void this.switchBadge(id.slice('badge:'.length)); return; }\n switch (id) {\n case 'tour': this.startTour(); return;\n case 'news': this.news.showAll(); return;\n case 'shortcuts': this.openShortcuts(); return;\n case 'settings': this.settings.open(); return;\n // \"Aparência\" abre o painel direto na seção (era o modal de tema, que virou parte dela).\n case 'theme': this.settings.open(SPINE_SETTINGS_KEYS.appearance); return;\n case 'logout': this.logout(); return;\n }\n }\n\n // ─── Busca global (quick-launcher) ──────────────────────────────────────────\n @ViewChild('quickBox') quickBox?: ElementRef<HTMLElement>;\n public quickQuery = '';\n public quickOpen = false;\n public quickResults: QuickItem[] = [];\n public quickActive = 0;\n private quickIndex: QuickItem[] = [];\n /** Histórico de buscas (mostrado ao focar com o campo vazio). */\n public recentSearches: QuickItem[] = [];\n /** Verdadeiro quando o painel está exibindo o histórico (campo vazio). */\n public showingRecent = false;\n\n /** Achata a árvore de rotas em itens navegáveis (com trilha de ancestrais). */\n private flattenRoutes(routes: Route[], trail: string[]): QuickItem[] {\n const skip = new Set(['search', 'theme', 'logout']);\n const out: QuickItem[] = [];\n for (const r of routes || []) {\n if (!r) continue;\n const name = r.route_display_name || '';\n if (r.route_redirect && name && !skip.has(r.route_type as string)) {\n out.push({ name, icon: r.route_icon || 'application', redirect: r.route_redirect, path: trail.join(' › ') });\n }\n if (r.routes?.length) out.push(...this.flattenRoutes(r.routes as Route[], name ? [...trail, name] : trail));\n }\n return out;\n }\n\n /** Chamado pelo `(searchRequested)` do `hm-header` (clique no campo ou `Ctrl K`, já tratado\n * internamente por ele) — abre o modal de busca, mesmo padrão do `docs/website`\n * (`openSearch()` em `app.component.ts`: `@if` monta o `hm-modal` só quando aberto). */\n onSearchRequested(): void {\n this.quickQuery = '';\n this.quickOpen = true;\n this.onQuickSearch();\n // O `#quickBox` (e o input do hm-input dentro dele) só existe no DOM depois do `@if`/`hm-modal` montarem — foca assim que\n // a próxima renderização terminar (mesmo problema documentado em WorkspaceNavService: query\n // de view não existe antes do primeiro ciclo depois do `@if` virar true).\n afterNextRender(() => this.quickBox?.nativeElement?.querySelector('input')?.focus(), { injector: this.injector });\n }\n\n /** `(openChange)` do `hm-modal` — fecha ao clicar fora/Esc/botão de fechar. */\n onQuickModalOpenChange(open: boolean): void {\n this.quickOpen = open;\n if (!open) {\n this.quickQuery = '';\n this.quickResults = [];\n this.showingRecent = false;\n }\n }\n\n onQuickSearch() {\n const q = (this.quickQuery || '').trim().toLowerCase();\n this.quickActive = 0;\n // Campo vazio: mostra o histórico (recalculado na hora, para refletir as\n // últimas navegações) em vez de nada.\n if (!q) {\n this.showingRecent = true;\n this.recentSearches = this.loadRecent();\n this.quickResults = this.recentSearches.slice(0, 8);\n return;\n }\n this.showingRecent = false;\n const seen = new Set<string>();\n this.quickResults = this.quickIndex\n .filter((x) => (x.name.toLowerCase().includes(q) || x.path.toLowerCase().includes(q)))\n .filter((x) => (seen.has(x.redirect) ? false : (seen.add(x.redirect), true)))\n .slice(0, 8);\n }\n\n quickGo(item: QuickItem) {\n if (!item?.redirect) return;\n this.pushRecent(item);\n this.onQuickModalOpenChange(false);\n this.router.navigateByUrl(item.redirect);\n }\n\n quickMove(delta: number) {\n if (!this.quickResults.length) return;\n this.quickActive = (this.quickActive + delta + this.quickResults.length) % this.quickResults.length;\n }\n\n // ─── Histórico de buscas ────────────────────────────────────────────────────\n private readJson(key: string): any[] {\n try { const v = JSON.parse(localStorage.getItem(key) || '[]'); return Array.isArray(v) ? v : []; }\n catch { return []; }\n }\n\n private loadRecent(): QuickItem[] {\n return this.readJson(this.recentSearchKey)\n .filter((x) => x?.redirect && x?.name)\n .map((x) => ({ name: x.name, icon: x.icon || 'application', redirect: x.redirect, path: x.path || '' }))\n .slice(0, MAX_RECENT_SEARCH);\n }\n private pushRecent(item: QuickItem) {\n const entry: QuickItem = { name: item.name, icon: item.icon || 'application', redirect: item.redirect, path: item.path || '' };\n const next = [entry, ...this.recentSearches.filter((x) => x.redirect !== entry.redirect)].slice(0, MAX_RECENT_SEARCH);\n this.recentSearches = next;\n try { localStorage.setItem(this.recentSearchKey, JSON.stringify(next)); } catch { /* storage cheio/indisponível */ }\n }\n clearRecent(event?: Event) {\n event?.preventDefault();\n event?.stopPropagation();\n this.recentSearches = [];\n try { localStorage.removeItem(this.recentSearchKey); } catch { /* noop */ }\n this.quickResults = [];\n }\n}\n","<hm-header [class.header-blocked]=\"headerBlocked\" (searchRequested)=\"onSearchRequested()\">\n <div *ngIf=\"headerBlocked\" class=\"header-overlay\"></div>\n\n <spine-app-launcher></spine-app-launcher>\n\n <!-- Marca: logo do app (SpineConfig.logo, padrão assets/images/logo.svg) + SpineConfig.appName,\n levando à primeira rota navegável. Ver SpineBrandComponent. -->\n <spine-brand [homeRoute]=\"homeRoute\" [label]=\"text.home\" />\n\n <div actions class=\"h-right\">\n <!-- tema claro/escuro -->\n <hm-icon-button emphasis=\"subtle\" data-tour=\"theme\" (clicked)=\"setTheme(themeService.current == 'light' ? 'dark' : 'light')\"\n [icon]=\"themeService.current == 'light' ? 'moon' : 'sun'\"\n [label]=\"themeService.current == 'light' ? text.themeDark : text.themeLight\">\n </hm-icon-button>\n\n <!-- densidade -->\n <hm-icon-button emphasis=\"subtle\" data-tour=\"density\" (clicked)=\"setDensity()\"\n [icon]=\"isCompactDensity ? 'density-comfortable' : 'density-compact'\"\n [label]=\"isCompactDensity ? text.densityComfortable : text.densityCompact\">\n </hm-icon-button>\n\n <!-- tela cheia -->\n <hm-icon-button emphasis=\"subtle\" data-tour=\"fullscreen\" (clicked)=\"toggleFullscreen()\"\n [icon]=\"isFullscreen ? 'shrink' : 'resize'\"\n [label]=\"isFullscreen ? text.exitFullscreen : text.fullscreen\">\n </hm-icon-button>\n\n <span class=\"h-divider\" aria-hidden=\"true\"></span>\n\n <!-- perfil: crachá, ajuda, tema e sair ficam dentro do menu -->\n <hm-menu-button class=\"h-profile\" data-tour=\"profile\" [label]=\"profile.name ?? text.user\" align=\"end\" [items]=\"profileMenuItems\" (chosen)=\"onProfileMenuChosen($event)\">\n <hm-account-avatar [name]=\"profile.name ?? text.user\" [imageUrl]=\"profile.picture\"></hm-account-avatar>\n <span class=\"h-profile-info\">\n <span class=\"h-profile-name\">{{ profile.name ?? text.user }}</span>\n <span class=\"h-profile-role\" *ngIf=\"badge\">{{ badge?.name }}</span>\n </span>\n </hm-menu-button>\n </div>\n</hm-header>\n\n<!-- Busca global (quick-launcher) — mesmo padrão do docs/website: modal aberto por\n (searchRequested), não um overlay próprio sempre presente no DOM. -->\n@if (quickOpen) {\n <hm-modal [open]=\"quickOpen\" (openChange)=\"onQuickModalOpenChange($event)\" [heading]=\"text.search\" size=\"medium\">\n <!-- Mesmo padrão da busca do design system: hm-input + lista simples (nome · onde). Setas/Enter navegam. -->\n <div class=\"search\" data-tour=\"search\" #quickBox\n (keydown.arrowdown)=\"$event.preventDefault(); quickMove(1)\"\n (keydown.arrowup)=\"$event.preventDefault(); quickMove(-1)\"\n (keydown.enter)=\"quickGo(quickResults[quickActive])\">\n <hm-input [label]=\"text.search\" [placeholder]=\"text.searchPlaceholder\" icon=\"search\"\n [(ngModel)]=\"quickQuery\" (ngModelChange)=\"onQuickSearch()\" />\n\n @if (showingRecent && quickResults.length) {\n <div class=\"search__recent\">\n <span>{{ text.recentSearches }}</span>\n <button type=\"button\" (mousedown)=\"clearRecent($event)\">{{ text.clearRecent }}</button>\n </div>\n }\n @if (quickResults.length) {\n <ul class=\"search__results\">\n @for (r of quickResults; track $index; let i = $index) {\n <li>\n <button type=\"button\" [class.active]=\"i === quickActive\" (mouseenter)=\"quickActive = i\" (mousedown)=\"quickGo(r)\">\n <strong><hm-icon [shape]=\"showingRecent ? 'history' : r.icon\" />{{ r.name }}</strong>\n @if (r.path) { <span>{{ r.path }}</span> }\n </button>\n </li>\n }\n </ul>\n } @else if (quickQuery) {\n <p class=\"search__empty\">{{ fmt(text.noResults, { term: quickQuery }) }}</p>\n }\n </div>\n </hm-modal>\n}\n\n","import { Injectable, computed, effect, inject, signal } from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { ViewService } from '@orfeu/angular/core';\nimport {\n HERMES_WORKSPACE_PERSISTENCE_CONFIG,\n TabItem,\n WorkspaceState,\n WorkspaceStore,\n createPersistedWorkspaceStore,\n findPanelTabs,\n} from '@trismegisto/angular';\nimport { Route, spineRoutesOf } from '@trismegisto/spine';\nimport { resolveEffectiveRouteChain } from '@trismegisto/spine/routing';\n\nconst HOME_PATH = '/home';\n\n/**\n * Dono do `WorkspaceStore` do shell — mesmo padrão do `WorkspaceNavService` do docs/website\n * (`packages/hermes-ui/docs/website/src/app/workspace-nav.service.ts`), adaptado pra ler a\n * árvore de rotas do BACKEND (`ViewService.currentView`) em vez de um `page-registry.ts`\n * estático. Cada página visitada vira uma aba, pertencente a um painel; a navegação real do\n * `Router` (routerLink, busca, sidebar) sempre atualiza a aba ativa do painel FOCADO.\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineWorkspaceNavService {\n private readonly router = inject(Router);\n private readonly viewService = inject(ViewService);\n\n readonly store: WorkspaceStore = createPersistedWorkspaceStore(\n { tabs: [this.tabFor(HOME_PATH)], activeId: HOME_PATH },\n (id) => (this.chainFor(id) ? this.tabFor(id) : null),\n inject(HERMES_WORKSPACE_PERSISTENCE_CONFIG),\n );\n\n private readonly state = signal<WorkspaceState>(this.store.getState());\n readonly root = computed(() => this.state().root);\n readonly focusedPanelId = computed(() => this.state().focusedPanelId);\n\n /** Cadeia resolvida (header→…→page) da aba ativa do painel FOCADO — é o que `spine-sidebar`\n * (menu) e `spine-navigation` (breadcrumb) leem pra saber \"onde estamos\", no lugar do antigo\n * `viewService.logControl$`/`breadCrumb$` globais (que só existiam porque havia uma página\n * \"atual\" só; agora cada painel tem a sua). */\n readonly focusedChain = computed<Route[] | null>(() => {\n const s = this.state();\n const activeId = findPanelTabs(s.root, s.focusedPanelId)?.activeId;\n return activeId ? this.chainFor(activeId) : null;\n });\n\n private lastKnownPath = '';\n\n constructor() {\n this.store.subscribe((s) => this.state.set(s));\n\n this.router.events.subscribe((event) => {\n if (!(event instanceof NavigationEnd)) return;\n const path = event.urlAfterRedirects.split(/[?#]/)[0] || HOME_PATH;\n this.lastKnownPath = path;\n this.store.navigateActiveTab(this.state().focusedPanelId, this.tabFor(event.urlAfterRedirects));\n });\n\n // Mesma corrida documentada no WorkspaceNavService do docs/website: pula a 1ª execução, senão\n // o estado inicial (hardcoded ou recém-restaurado do sessionStorage) vence a navegação real\n // (mais lenta, resolve async) e qualquer link direto/F5 cai sempre em HOME_PATH.\n let first = true;\n effect(() => {\n const s = this.state();\n const activeId = findPanelTabs(s.root, s.focusedPanelId)?.activeId;\n if (first) {\n first = false;\n return;\n }\n if (!activeId || activeId === this.lastKnownPath) return;\n this.lastKnownPath = activeId;\n void this.router.navigateByUrl(activeId);\n });\n }\n\n /** Resolve a cadeia de rotas pra uma URL, direto na view atual — sem `Router`, sem `async`\n * (o componente da folha só é carregado por quem for de fato desenhar o painel). Desce sozinho\n * por nós organizacionais (com filhos, sem conteúdo próprio) — o rótulo/ícone da aba e o que a\n * sidebar/breadcrumb mostram refletem o destino DE VERDADE, não a rota-container clicada. */\n private chainFor(url: string): Route[] | null {\n const currentRoutes = spineRoutesOf(this.viewService.currentView);\n return resolveEffectiveRouteChain(\n currentRoutes,\n (u) => this.viewService.getLevel(u),\n (u, level) => this.viewService.getUrlAtLevel(u, level),\n url,\n );\n }\n\n tabFor(url: string): TabItem {\n const path = url.split(/[?#]/)[0] || HOME_PATH;\n const leaf = this.chainFor(path)?.at(-1);\n return {\n id: path,\n label: leaf?.route_display_name ?? path,\n icon: leaf?.route_icon ?? undefined,\n };\n }\n\n /** O `+` de um painel: abre a home ali, como um navegador. */\n openNewTab(panelId: string): void {\n this.store.openTab(panelId, this.tabFor(HOME_PATH));\n }\n\n /** Navegação LOCAL a um painel específico (usada pelo `PanelLocalLinkDirective`) — troca o\n * ASSUNTO da aba ativa daquele painel, não empilha uma aba nova. */\n navigateLocally(panelId: string, href: string): void {\n this.store.navigateActiveTab(panelId, this.tabFor(href));\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, inject, signal, ChangeDetectionStrategy } from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, NavigationSkipped, Router } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { AppDef, AuthorizationService, RealmAppsService, ViewService } from '@orfeu/angular/core';\nimport { IconComponent, SidebarComponent as HermesSidebarComponent, SidebarNode, SidebarNodeComponent } from '@trismegisto/angular';\nimport { Route, routerIdOf, SPINE_MESSAGES, spineRoutesOf } from '@trismegisto/spine';\nimport { SpineWorkspaceNavService } from '../workspace/spine-workspace-nav.service';\nimport { formatMessage } from '@trismegisto/primitives';\n\n/**\n * `Route` (árvore do backend) → `SidebarNode` (genérico, o que `hm-sidebar-node` sabe desenhar).\n * Sem filtrar por `route_type`: a árvore real mistura tipos livremente por PAPEL, não por\n * profundidade fixa (achado real, 2026-09-28, com a árvore de verdade em mãos — 'menu'/'item'/\n * 'submenu'/'page' aparecem intercalados; um nó 'item' pode ter filhos 'submenu' que têm filhos\n * 'page', por exemplo \"Sistema\"). `hm-sidebar-node` já decide sozinho link-vs-grupo pela presença\n * de filhos + profundidade restante — não precisa saber o `route_type` pra nada.\n */\nfunction toSidebarNode(route: Route): SidebarNode {\n return {\n // Página: o router (a tela); grupo (sem router próprio): a rota.\n id: routerIdOf(route) ?? route.routed_id,\n label: route.route_display_name ?? '',\n icon: route.route_icon ?? undefined,\n route: route.route_redirect ?? '',\n children: (route.routes ?? []).map(toSidebarNode),\n };\n}\n\n/**\n * Menu lateral fixo — TODA a navegação do shell mora aqui agora, nunca no header (decisão\n * explícita do usuário: \"não deve ter ícones de navegação no menu superior, deve ter um menu\n * lateral de navegação fixa\" — o antigo `h-nav`/`hm-menu-button` de nível 'header'/'menu' do\n * `header.component.html` foi removido, essa navegação virou `modules` abaixo).\n *\n * Dois níveis, um de cada vez — MESMO padrão de back/forward do `docs/website`'s sidebar (achado\n * real, 2026-09-28: a primeira versão mostrava os dois SEMPRE juntos, empilhados, achando que o\n * modelo de rotas do backend não permitia \"sair\" de um módulo — errado; nada impede mostrar só um\n * nível por vez com um botão de voltar, é só um `signal` local):\n * - `modules` (nível 1, 'header', de `ViewService.currentView` direto — não muda com a navegação\n * do painel): a lista pra trocar de módulo.\n * - `menus`: a cadeia resolvida da aba ativa do painel FOCADO\n * (`SpineWorkspaceNavService.focusedChain`) — os itens do módulo ATUAL.\n * `viewingModules` decide qual dos dois aparece; volta pra `false` sozinho sempre que o módulo\n * atual muda (navegação real feita, mesma UX do `leaveModule()` do docs).\n */\n@Component({\n selector: 'spine-sidebar',\n imports: [CommonModule, HermesSidebarComponent, SidebarNodeComponent, IconComponent],\n templateUrl: './sidebar.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [`\n /* Aplicações (só no mobile): o seletor de apps do header some abaixo de 768px e vem para a sidebar. */\n .spine-sidebar-apps { display: none; }\n @media (max-width: 767px) {\n .spine-sidebar-apps {\n display: flex;\n flex-direction: column;\n gap: var(--hm-space-micro);\n margin-bottom: var(--hm-space-sm);\n padding-bottom: var(--hm-space-sm);\n border-bottom: var(--hm-border-hairline) solid var(--hm-divider);\n }\n .spine-sidebar-apps__title {\n display: flex;\n align-items: center;\n gap: var(--hm-space-nano);\n margin: 0 var(--hm-space-xxxs);\n color: var(--hm-muted);\n font-size: var(--hm-font-size-xs);\n font-weight: var(--hm-font-weight-semibold);\n letter-spacing: 0.04em;\n text-transform: uppercase;\n }\n .spine-sidebar-apps__link {\n display: flex;\n align-items: center;\n gap: var(--hm-space-nano);\n min-height: var(--hm-space-2xl);\n padding: var(--hm-space-nano) var(--hm-space-xxxs);\n border-radius: var(--hm-radius-control);\n color: inherit;\n font-size: var(--hm-font-size-sm);\n text-decoration: none;\n }\n .spine-sidebar-apps__link:hover,\n .spine-sidebar-apps__link:focus-visible { background: var(--hm-hover); }\n }\n\n /* Achado real, 2026-09-28: \\`hm-sidebar\\` (a TAG) é \\`display: contents\\` no @trismegisto/core\n * (repassa os filhos pro pai, sem caixa própria) — \\`height\\` nela não faz NADA, por spec CSS\n * (display:contents não gera caixa principal, propriedade de tamanho é ignorada). Quem\n * realmente precisa da altura é \\`.hm-sidebar\\` (a classe, o <nav> de verdade lá dentro) — e\n * ele só recebe de verdade se ESTE host também tiver altura definida (senão \"100%\" de um pai\n * com altura automática também não é nada). Era isto que sobrava como espaço em branco: o\n * <nav> ficava do tamanho do próprio conteúdo, mas o layout ao redor já reservava a coluna\n * inteira pro sidebar.\n *\n * Segunda rodada do MESMO bug, achada ao vivo 2026-09-28 (barra branca sobrevivia ao fix\n * acima, \\`height:100%\\` sem efeito nenhum medido no DOM real): a regra \\`.hm-sidebar\\` deste\n * bloco NUNCA bateu no \\`<nav class=\"hm-sidebar\">\\` de verdade. Motivo: encapsulamento emulado\n * do Angular tagueia cada seletor com o atributo \\`_ngcontent\\` do componente DONO do template\n * onde o elemento nasce — e o \\`<nav class=\"hm-sidebar\">\\` nasce dentro do template do\n * \\`HermesSidebarComponent\\` (\\`@trismegisto/angular\\`, seletor \\`hm-sidebar\\`), não do template\n * deste \\`SidebarComponent\\` do spine. \\`<hm-sidebar>\\` (a TAG, que É filha direta do template\n * daqui) recebe o atributo certo; o \\`<nav>\\` que \\`display:contents\\` \"promove\" pra cima, não —\n * então \\`.hm-sidebar[_ngcontent-spine-x]\\` vira um seletor que não existe em lugar nenhum do\n * DOM real, silenciosamente inerte. \\`::ng-deep\\` é o jeito suportado de escrever uma regra sem\n * esse atributo, alcançando de fato o DOM interno de um componente filho.\n *\n * E o que essa regra precisa fazer: \\`.hm-sidebar\\` no \\`_sidebar.scss\\` do core tem\n * \\`flex: none\\` — certo pro caso comum (filho de um flex EM LINHA, onde só a LARGURA deve ser\n * travada por \\`width\\`/\\`min-width\\`/\\`max-width\\`, nunca deve \"crescer\"). Mas aqui \\`:host\\` é um\n * flex EM COLUNA — nesse eixo, \\`flex: none\\` também zera \\`flex-grow\\`, então o <nav> (único\n * item do eixo vertical) nunca cresce pra preencher o restante da coluna. \\`flex-grow: 1\\`\n * reforça o preenchimento pelo eixo certo (altura) sem tocar a LARGURA (eixo cruzado, continua\n * só sob controle de width/min-width/max-width do core) — escopado só no spine (\\`:host\\` na\n * frente), o core continua \\`flex: none\\` pra quem usa \\`hm-sidebar\\` direto num flex em linha\n * (docs/website, hefesto sem o wrapper de coluna). */\n :host { display: flex; flex-direction: column; height: 100%; }\n :host ::ng-deep .hm-sidebar { height: 100%; flex-grow: 1; }\n `],\n})\nexport class SidebarComponent {\n protected readonly text = inject(SPINE_MESSAGES).sidebar;\n protected readonly fmt = formatMessage;\n private readonly workspace = inject(SpineWorkspaceNavService);\n private readonly viewService = inject(ViewService);\n private readonly authService = inject(AuthorizationService);\n private readonly realmApps = inject(RealmAppsService);\n\n /** Aplicações do realm (o app atual já vem excluído pelo backend) — exibidas só no mobile. */\n protected readonly apps = signal<AppDef[]>([]);\n\n private readonly currentView = toSignal(this.viewService.currentView$, { initialValue: this.viewService.currentView });\n /** Sem nenhum crachá (nenhum grupo do app — ver `ViewGuard`, tela `/blocked`), o menu fica vazio\n * mesmo que a view traga rotas públicas: listar o que leva de volta ao \"Acesso bloqueado\" não\n * ajuda. `badges` não é sinal, mas a view sempre é refeita depois do token (`view.update`), e é\n * ela que recalcula isto. */\n protected readonly modules = computed<SidebarNode[]>(() => {\n // Irmãos de mesmo endereço já fundidos: um \"laboratorio\" só, não um por nível (ver `mergeRouteTree`).\n const routes = spineRoutesOf(this.currentView());\n if (this.authService.authenticated && !this.authService.badges.length) return [];\n return routes.map(toSidebarNode);\n });\n\n protected readonly currentModule = computed<Route | null>(() => this.workspace.focusedChain()?.[0] ?? null);\n\n /** Filhos diretos do módulo atual — sem filtrar por `route_type` (ver `toSidebarNode`). */\n protected readonly menus = computed<SidebarNode[]>(() => (this.currentModule()?.routes ?? []).map(toSidebarNode));\n\n /** Nem todo nível 1 é um \"módulo\" navegável — \"Início\"/\"Monitoração\" na árvore real são\n * `route_type: 'page'` SEM filhos, folhas diretas (achado real, 2026-09-28: mostravam\n * cabeçalho + botão voltar + área de conteúdo vazia, como se fossem módulos de verdade). Só\n * entra no modo \"dentro do módulo\" quando há algo pra mostrar como submenu. */\n protected readonly currentModuleHasChildren = computed(() => (this.currentModule()?.routes?.length ?? 0) > 0);\n\n /** `true` = mostrando a lista de módulos; `false` = mostrando o menu do módulo atual. Cai pra\n * `true` sozinho quando o módulo atual não tem submenu nenhum — nesse caso não existe \"dentro\n * do módulo\" pra mostrar. */\n private readonly wantsModules = signal(false);\n protected readonly viewingModules = computed(() => this.wantsModules() || !this.currentModuleHasChildren());\n\n /** Sem teto artificial de nível de grupo — o template não enxerga o global `Infinity`, só\n * membros da classe. Ver comentário no `.html`: o backend já limita a árvore sozinho. */\n protected readonly maxDepth = Infinity;\n\n constructor() {\n void this.realmApps.getApplications(this.authService.getToken()).then(\n list => this.apps.set(list ?? []),\n () => this.apps.set([]), // sem a lista, o bloco de aplicações só não aparece\n );\n\n // Navegou de verdade (clicou num módulo, ou entrou direto por link/F5) -> volta pro menu do\n // módulo novo. Só faz sentido reagir à IDENTIDADE do módulo (router da página ou, num grupo, a\n // rota -- módulo costuma ser grupo, sem router próprio), não ao objeto inteiro\n // (a cadeia inteira muda a cada troca de aba dentro do MESMO módulo também).\n let lastModuleId: string | null | undefined;\n effect(() => {\n const module = this.currentModule();\n const id = module ? routerIdOf(module) ?? module.routed_id : null;\n if (id !== lastModuleId) {\n lastModuleId = id;\n this.wantsModules.set(false);\n }\n });\n\n // O efeito acima não cobre voltar pro MESMO módulo: dentro de \"Sistema\", \"← Módulos\" e\n // clicar em \"Sistema\" de novo navega (a rota muda), mas a identidade do módulo é a mesma — o\n // efeito não dispara e a lista de módulos ficava na tela (achado real, 2026-09-29: só\n // funcionava passando por outro módulo antes). Qualquer navegação concluída é um \"entrar\".\n // NavigationSkipped também: clicar no módulo cuja página já está aberta cai no ViewGuard\n // (`/sys` cancela e redireciona pra `/sys/about/resources`), e o redirect pra URL ATUAL é\n // descartado pelo Router como \"mesma URL\" — não emite NavigationEnd nenhum.\n inject(Router).events.pipe(\n filter(e => e instanceof NavigationEnd || e instanceof NavigationSkipped),\n takeUntilDestroyed(),\n ).subscribe(() => this.wantsModules.set(false));\n }\n\n protected showModules(): void {\n this.wantsModules.set(true);\n }\n}\n","<hm-sidebar\n *ngIf=\"modules().length != 0 || menus().length != 0\"\n [label]=\"!viewingModules() && currentModule() ? fmt(text.moduleNavigation, { module: currentModule()!.route_display_name ?? '' }) : text.modules\"\n [heading]=\"!viewingModules() ? (currentModule()?.route_display_name ?? '') : ''\"\n [headingIcon]=\"currentModule()?.route_icon ?? 'grid'\"\n [backLabel]=\"!viewingModules() && modules().length > 1 ? text.modules : ''\"\n [direction]=\"viewingModules() ? 'back' : 'forward'\"\n (back)=\"showModules()\"\n>\n <!-- Só no mobile: o seletor de aplicações do header some e vem para cá. -->\n @if (apps().length) {\n <section class=\"spine-sidebar-apps\" [attr.aria-label]=\"text.apps\">\n <p class=\"spine-sidebar-apps__title\"><hm-icon shape=\"grid\" /> {{ text.apps }}</p>\n @for (app of apps(); track app.app_url) {\n <a class=\"spine-sidebar-apps__link\" [href]=\"app.app_url\" target=\"_blank\" rel=\"noopener noreferrer\">\n <hm-icon shape=\"applications\" />\n <span>{{ app.name }}</span>\n </a>\n }\n </section>\n }\n @if (viewingModules()) {\n @for (m of modules(); track m.id) {\n <hm-sidebar-node [node]=\"m\" [depth]=\"0\" />\n }\n } @else {\n @for (menu of menus(); track menu.id) {\n <!-- Infinity, não um número fixo: o backend do spine já usa `route_type` pra limitar a\n árvore a 6 níveis (header→navigation→menu→item→submenu→page — ver `route.model.ts`),\n então não há necessidade de um segundo teto aqui. Um teto baixo (achado ao vivo,\n 2026-09-28: `depth=2`) forçava o penúltimo nível a virar link plano mesmo tendo\n filhos reais (ex.: \"submenu\" com páginas embaixo sumia da árvore visível). -->\n <hm-sidebar-node [node]=\"menu\" [depth]=\"maxDepth\" />\n }\n }\n</hm-sidebar>\n","// Geometria do tour: o recorte iluminado (holofote) em volta do alvo e onde o balão cabe. Funções\n// puras, sem DOM — o componente mede e aplica.\n\nexport interface TourRect {\n readonly top: number;\n readonly left: number;\n readonly width: number;\n readonly height: number;\n}\n\nexport interface TourSize {\n readonly width: number;\n readonly height: number;\n}\n\nexport interface TourCardPosition {\n top: number;\n left: number;\n centered: boolean;\n}\n\n/** Folga do holofote em volta do alvo (cada lado). */\nexport const TOUR_SPOT_PADDING = 6;\n/** Distância entre o holofote e o balão. */\nexport const TOUR_CARD_GAP = 14;\n/** Distância mínima do balão às bordas da janela — a mesma do `max-width: calc(100vw - 24px)` do SCSS. */\nexport const TOUR_EDGE = 12;\n/** Largura do balão no SCSS (`.ob-card`), usada enquanto ele ainda não foi medido. */\nexport const TOUR_CARD_WIDTH = 332;\n/** Altura provável do balão antes da primeira medida (título + duas linhas + rodapé). */\nexport const TOUR_CARD_HEIGHT_GUESS = 190;\n\n/** Holofote: o retângulo do alvo com a mesma folga nos quatro lados. */\nexport function tourSpotlight(target: TourRect, padding = TOUR_SPOT_PADDING): TourRect {\n return {\n top: target.top - padding,\n left: target.left - padding,\n width: target.width + padding * 2,\n height: target.height + padding * 2,\n };\n}\n\n/** Largura que o balão de fato ocupa: a do CSS, limitada pela janela menos as margens. */\nexport function tourCardWidth(width: number, viewport: TourSize): number {\n return Math.max(0, Math.min(width, viewport.width - TOUR_EDGE * 2));\n}\n\n/** Prende `value` entre a margem e o maior início que ainda deixa `size` dentro de `room`. */\nfunction clampStart(value: number, size: number, room: number): number {\n return Math.max(TOUR_EDGE, Math.min(value, room - TOUR_EDGE - size));\n}\n\n/**\n * Onde o balão fica. Sem holofote: no meio da janela (`centered`). Com holofote, a primeira posição que\n * cabe: embaixo, em cima (ambas alinhadas à esquerda do holofote), à direita, à esquerda (ambas\n * alinhadas ao topo dele) e, se nada couber, no meio da janela por cima do alvo.\n */\nexport function placeTourCard(spot: TourRect | null, card: TourSize, viewport: TourSize): TourCardPosition {\n const width = tourCardWidth(card.width, viewport);\n const height = card.height;\n const centerTop = Math.max(TOUR_EDGE, (viewport.height - height) / 2);\n const centerLeft = Math.max(TOUR_EDGE, (viewport.width - width) / 2);\n if (!spot) return { top: centerTop, left: centerLeft, centered: true };\n\n const left = clampStart(spot.left, width, viewport.width);\n const top = clampStart(spot.top, height, viewport.height);\n\n const below = spot.top + spot.height + TOUR_CARD_GAP;\n if (below + height <= viewport.height - TOUR_EDGE) return { top: below, left, centered: false };\n\n const above = spot.top - TOUR_CARD_GAP - height;\n if (above >= TOUR_EDGE) return { top: above, left, centered: false };\n\n const right = spot.left + spot.width + TOUR_CARD_GAP;\n if (right + width <= viewport.width - TOUR_EDGE) return { top, left: right, centered: false };\n\n const leftSide = spot.left - TOUR_CARD_GAP - width;\n if (leftSide >= TOUR_EDGE) return { top, left: leftSide, centered: false };\n\n return {\n top: clampStart(centerTop, height, viewport.height),\n left: clampStart(centerLeft, width, viewport.width),\n centered: false,\n };\n}\n","import { CommonModule } from '@angular/common';\nimport { AfterRenderRef, ChangeDetectorRef, Component, ElementRef, HostListener, Injector, OnDestroy, OnInit, ViewChild, ChangeDetectionStrategy, afterNextRender, inject } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ButtonComponent } from '@trismegisto/angular';\nimport { OnboardingService, OnboardingStep, findTourTarget } from './onboarding.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { formatMessage } from '@trismegisto/primitives';\nimport {\n TOUR_CARD_HEIGHT_GUESS,\n TOUR_CARD_WIDTH,\n TourCardPosition,\n TourSize,\n placeTourCard,\n tourSpotlight,\n} from './onboarding-placement';\n\ninterface Box {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/**\n * Desenho do tour guiado: escurece a tela, recorta um holofote sobre o alvo do passo e põe o balão\n * (título, texto, progresso e navegação) onde couber. Segue o `OnboardingService`; recalcula a cada\n * passo e quando a janela rola ou muda de tamanho.\n */\n@Component({\n selector: 'spine-onboarding-overlay',\n imports: [CommonModule, ButtonComponent],\n templateUrl: './onboarding-overlay.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './onboarding-overlay.component.scss',\n})\nexport class OnboardingOverlayComponent implements OnInit, OnDestroy {\n protected readonly text = inject(SPINE_MESSAGES).tour;\n protected readonly fmt = formatMessage;\n @ViewChild('cardEl') cardRef?: ElementRef<HTMLDivElement>;\n\n public step: OnboardingStep | null = null;\n public index = 0;\n public total = 0;\n\n /** holofote (null = passo centralizado, sem recorte). */\n public spot: Box | null = null;\n /** posição do balão. */\n public card: { top: number; left: number; centered: boolean } = { top: 0, left: 0, centered: true };\n\n private sub?: Subscription;\n private reposition?: AfterRenderRef;\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly injector = inject(Injector);\n\n constructor(private onboarding: OnboardingService) {}\n\n get isFirst(): boolean { return this.onboarding.isFirst; }\n get isLast(): boolean { return this.onboarding.isLast; }\n\n ngOnInit(): void {\n this.sub = this.onboarding.current$.subscribe((cur) => {\n // O passo chega de fora da detecção de mudanças (timer do serviço, clique no balão): marca a\n // view, senão um app sem zone.js não redesenha.\n this.cdr.markForCheck();\n if (!cur) { this.step = null; this.spot = null; return; }\n this.step = cur.step;\n this.index = cur.index;\n this.total = cur.total;\n this.layout();\n });\n }\n\n ngOnDestroy(): void {\n this.sub?.unsubscribe();\n this.reposition?.destroy();\n }\n\n /** Holofote e balão do passo atual: primeiro com a altura estimada, depois com a medida real. */\n private layout(): void {\n const step = this.step;\n if (!step) return;\n const target = step.target ? findTourTarget(step.target) : null;\n if (target) this.bringIntoView(target);\n this.spot = target ? tourSpotlight(target.getBoundingClientRect()) : null;\n this.card = placeTourCard(this.spot, this.cardSize(TOUR_CARD_HEIGHT_GUESS), this.viewport());\n this.positionCard();\n }\n\n /**\n * Refina a posição depois que o balão foi desenhado (a altura depende do texto). Roda depois do\n * render e só marca a view se a posição mudou: sem NG0100 e sem precisar do zone.js.\n */\n private positionCard(): void {\n this.reposition?.destroy();\n this.reposition = afterNextRender(\n {\n read: () => {\n const height = this.cardRef?.nativeElement.offsetHeight ?? 0;\n if (!this.step || !height) return;\n const next = placeTourCard(this.spot, this.cardSize(height), this.viewport());\n if (!this.samePosition(next)) {\n this.card = next;\n this.cdr.markForCheck();\n }\n },\n },\n { injector: this.injector },\n );\n }\n\n /** Alvo fora da faixa visível: rola até o meio antes de medir (o `scroll` da janela refaz a conta). */\n private bringIntoView(target: HTMLElement): void {\n const rect = target.getBoundingClientRect();\n if (rect.top >= 0 && rect.bottom <= window.innerHeight) return;\n const calm = typeof window.matchMedia === 'function' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n target.scrollIntoView({ block: 'center', inline: 'nearest', behavior: calm ? 'auto' : 'smooth' });\n }\n\n /** Largura que o CSS dá ao balão (medida quando já existe) e a altura informada. */\n private cardSize(height: number): TourSize {\n const measured = this.cardRef?.nativeElement.offsetWidth ?? 0;\n return { width: measured || TOUR_CARD_WIDTH, height };\n }\n\n private viewport(): TourSize {\n return { width: window.innerWidth, height: window.innerHeight };\n }\n\n private samePosition(next: TourCardPosition): boolean {\n return next.top === this.card.top && next.left === this.card.left && next.centered === this.card.centered;\n }\n\n @HostListener('window:resize')\n @HostListener('window:scroll')\n onViewportChange(): void {\n if (this.step) this.layout();\n }\n\n // ── ações ──\n next(): void { this.onboarding.next(); }\n prev(): void { this.onboarding.prev(); }\n skip(): void { this.onboarding.finish(); }\n}\n","<div class=\"ob-root\" *ngIf=\"step\">\n <!-- Holofote: recorte iluminado sobre o alvo (o escuro vem do box-shadow gigante). -->\n <div class=\"ob-spot\" *ngIf=\"spot\"\n [style.top.px]=\"spot.top\" [style.left.px]=\"spot.left\"\n [style.width.px]=\"spot.width\" [style.height.px]=\"spot.height\"></div>\n\n <!-- Passos centralizados (sem alvo): escurece a tela inteira. -->\n <div class=\"ob-dim\" *ngIf=\"!spot\"></div>\n\n <!-- Balão -->\n <div #cardEl class=\"ob-card\" [class.is-centered]=\"card.centered\"\n [style.top.px]=\"card.top\" [style.left.px]=\"card.left\">\n <div class=\"ob-card__head\">\n <h3 class=\"ob-card__title\">{{ step.title }}</h3>\n <span class=\"ob-progress\">{{ fmt(text.progress, { current: index + 1, total: total }) }}</span>\n </div>\n <p class=\"ob-card__desc\" [innerHTML]=\"step.description\"></p>\n\n <div class=\"ob-card__foot\">\n <hm-button class=\"ob-skip\" emphasis=\"minimal\" (clicked)=\"skip()\">{{ text.skip }}</hm-button>\n <div class=\"ob-card__foot-actions\">\n <hm-button *ngIf=\"!isFirst\" emphasis=\"medium\" (clicked)=\"prev()\">{{ text.back }}</hm-button>\n <hm-button (clicked)=\"next()\">\n {{ isLast ? text.finish : text.next }}\n </hm-button>\n </div>\n </div>\n </div>\n</div>\n","import { renderIconSvg } from '@trismegisto/icons';\nimport { SpineNewsIllustration } from '@trismegisto/spine';\n\n/** Literal colors and font for the slide artwork (an image cannot see the page's CSS variables). */\nexport interface NewsPalette {\n readonly background: string;\n readonly icon: string;\n readonly badge: string;\n readonly badgeBorder: string;\n readonly label: string;\n readonly font: string;\n}\n\nconst LIGHT_FALLBACK: NewsPalette = {\n background: '#f3f4f6',\n icon: '#2f6fdb',\n badge: '#ffffff',\n badgeBorder: '#d5d9e0',\n label: '#1e2329',\n font: 'sans-serif',\n};\n\nexport function readNewsPalette(doc: Document): NewsPalette {\n const style = doc.body ? doc.defaultView?.getComputedStyle(doc.body) : undefined;\n const pick = (prop: string, fallback: string) => (style?.getPropertyValue(prop) ?? '').trim() || fallback;\n return {\n background: pick('--hm-surface-raised', LIGHT_FALLBACK.background),\n icon: pick('--hm-accent', LIGHT_FALLBACK.icon),\n badge: pick('--hm-surface', LIGHT_FALLBACK.badge),\n badgeBorder: pick('--hm-divider', LIGHT_FALLBACK.badgeBorder),\n label: pick('--hm-text', LIGHT_FALLBACK.label),\n font: (style?.fontFamily ?? '').trim() || LIGHT_FALLBACK.font,\n };\n}\n\nconst XML_ENTITIES: Record<string, string> = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&apos;' };\n\nfunction xml(value: string): string {\n return value.replace(/[&<>\"']/g, (ch) => XML_ENTITIES[ch]);\n}\n\nconst WIDTH = 640;\nconst HEIGHT = 360;\nconst CX = WIDTH / 2;\nconst CY = 168;\n\n/** Places a catalog icon (24-unit grid, stroked with currentColor) as a nested, tinted <svg>. */\nfunction icon(shape: string, x: number, y: number, size: number, color: string): string {\n return renderIconSvg(shape).replace(\n /^<svg\\b/,\n `<svg x=\"${x}\" y=\"${y}\" width=\"${size}\" height=\"${size}\" color=\"${xml(color)}\"`,\n );\n}\n\n/** Four-point twinkle, the \"something new\" cue drawn around the hero icon. */\nfunction sparkle(x: number, y: number, r: number, color: string, opacity: number): string {\n const k = r * 0.28;\n const d = `M${x} ${y - r}Q${x + k} ${y - k} ${x + r} ${y}Q${x + k} ${y + k} ${x} ${y + r}Q${x - k} ${y + k} ${x - r} ${y}Q${x - k} ${y - k} ${x} ${y - r}Z`;\n return `<path d=\"${d}\" fill=\"${xml(color)}\" opacity=\"${opacity}\"/>`;\n}\n\nfunction round(n: number): number {\n return Math.round(n * 10) / 10;\n}\n\nexport function buildNewsIllustration(illustration: SpineNewsIllustration, palette: NewsPalette): string {\n const satellites = illustration.satellites ?? [];\n const orbiting = satellites.length > 0;\n const c = {\n bg: xml(palette.background),\n accent: xml(palette.icon),\n badge: xml(palette.badge),\n border: xml(palette.badgeBorder),\n label: xml(palette.label),\n };\n\n const heroRadius = orbiting ? 58 : 92;\n const heroIcon = orbiting ? 64 : 104;\n const parts: string[] = [`<rect width=\"${WIDTH}\" height=\"${HEIGHT}\" rx=\"28\" fill=\"${c.bg}\"/>`];\n\n if (orbiting) {\n parts.push(\n `<ellipse cx=\"${CX}\" cy=\"${CY}\" rx=\"214\" ry=\"104\" fill=\"none\" stroke=\"${c.accent}\" stroke-opacity=\".22\" stroke-width=\"2\" stroke-dasharray=\"2 10\" stroke-linecap=\"round\"/>`,\n );\n } else {\n parts.push(`<circle cx=\"${CX}\" cy=\"${CY + 8}\" r=\"${heroRadius + 34}\" fill=\"${c.accent}\" opacity=\".07\"/>`);\n }\n\n parts.push(\n `<circle cx=\"${CX}\" cy=\"${CY}\" r=\"${heroRadius}\" fill=\"${c.badge}\" stroke=\"${c.border}\" stroke-width=\"2\"/>`,\n `<circle cx=\"${CX}\" cy=\"${CY}\" r=\"${heroRadius - 10}\" fill=\"${c.accent}\" opacity=\".1\"/>`,\n icon(illustration.icon, CX - heroIcon / 2, CY - heroIcon / 2, heroIcon, palette.icon),\n sparkle(CX + heroRadius + 14, CY - heroRadius + 4, 13, palette.icon, 0.85),\n sparkle(CX - heroRadius - 8, CY + heroRadius - 18, 8, palette.icon, 0.5),\n );\n\n satellites.forEach((sat, i) => {\n // Start at the top-left so a lone satellite never sits on the hero's sparkle.\n const angle = -Math.PI * 0.75 + (i * 2 * Math.PI) / satellites.length;\n const x = round(CX + 214 * Math.cos(angle));\n const y = round(CY + 104 * Math.sin(angle));\n parts.push(\n `<g transform=\"translate(${x} ${y})\"><g class=\"sat\" style=\"animation-delay:${-(i * 1.3).toFixed(1)}s\">`,\n `<circle r=\"28\" fill=\"${c.badge}\" stroke=\"${c.border}\" stroke-width=\"2\"/>`,\n icon(sat.icon, -14, -14, 28, palette.icon),\n `<text y=\"48\" text-anchor=\"middle\" font-size=\"15\" fill=\"${c.label}\">${xml(sat.label)}</text>`,\n `</g></g>`,\n );\n });\n\n const style = orbiting\n ? '<style>.sat{animation:drift 5.6s ease-in-out infinite alternate}' +\n '@keyframes drift{from{transform:translateY(-5px)}to{transform:translateY(5px)}}' +\n '@media (prefers-reduced-motion:reduce){.sat{animation:none}}</style>'\n : '';\n\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${WIDTH} ${HEIGHT}\" width=\"${WIDTH}\" height=\"${HEIGHT}\" ` +\n `font-family=\"${xml(palette.font)}\">${style}${parts.join('')}</svg>`;\n return `data:image/svg+xml,${encodeURIComponent(svg)}`;\n}\n","import { ChangeDetectionStrategy, Component, DOCUMENT, computed, inject } from '@angular/core';\nimport { ButtonComponent, CarouselComponent, ModalComponent } from '@trismegisto/angular';\nimport { buildNewsIllustration, readNewsPalette } from './news-illustration';\nimport { SpineNewsService } from './news.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\n/**\n * Painel de novidades: um diálogo com carrossel — \"olha o que mudou\", não tutorial (esse é o tour\n * de boas-vindas). Montado uma vez no layout; quem decide quando abre é o `SpineNewsService`.\n */\n@Component({\n selector: 'spine-news',\n imports: [ModalComponent, CarouselComponent, ButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (news.isOpen()) {\n <hm-modal [heading]=\"text.heading\" size=\"medium\" [open]=\"true\" (closed)=\"news.close()\">\n <hm-carousel [label]=\"text.carousel\" [slides]=\"slides()\" />\n <ng-container footer>\n <hm-button (clicked)=\"news.close()\">{{ text.dismiss }}</hm-button>\n </ng-container>\n </hm-modal>\n }\n `,\n})\nexport class SpineNewsComponent {\n protected readonly news = inject(SpineNewsService);\n protected readonly text = inject(SPINE_MESSAGES).news;\n private readonly document = inject(DOCUMENT);\n\n /** O hm-carousel pede `image`/`alt` sempre presentes (vazios = sem imagem / decorativa). A\n * ilustração é desenhada na hora de abrir, com as cores do tema daquele momento. */\n protected readonly slides = computed(() => {\n if (!this.news.isOpen()) return [];\n const palette = readNewsPalette(this.document);\n return this.news.slides().map((s) => ({\n title: s.title,\n text: s.text,\n image: s.image ?? (s.illustration ? buildNewsIllustration(s.illustration, palette) : ''),\n // Ilustração é decorativa: o título e o texto do slide já dizem tudo.\n alt: s.image ? (s.alt ?? '') : '',\n }));\n });\n}\n","import { Component, OnDestroy, OnInit, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ButtonComponent, HermesShortcutService, ModalComponent, ShortcutListComponent } from '@trismegisto/angular';\nimport { ShortcutGroup, ShortcutService } from './shortcut.service';\nimport { OnboardingService } from '../onboarding/onboarding.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\n/**\n * Painel de atalhos (cheatsheet). Abre com \"?\" (via `ShortcutService.help$`) e lista, com o\n * `hm-shortcut-list` da lib, os atalhos agrupados — com busca e o interruptor dos atalhos de tecla\n * única (WCAG 2.1.4; a escolha persiste no `SpinePreferencesService`). Também é o último passo do\n * onboarding.\n */\n@Component({\n selector: 'spine-shortcuts-cheatsheet',\n imports: [ModalComponent, ButtonComponent, ShortcutListComponent],\n templateUrl: './shortcuts-cheatsheet.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './shortcuts-cheatsheet.component.scss',\n})\nexport class ShortcutsCheatsheetComponent implements OnInit, OnDestroy {\n public open = false;\n protected readonly text = inject(SPINE_MESSAGES).shortcuts;\n private readonly shortcuts = inject(ShortcutService);\n private readonly onboarding = inject(OnboardingService);\n /** Atalhos do painel: registrados (favoritos numa linha só) + os que outra peça dispara. */\n protected readonly items = this.shortcuts.panelItems;\n /** Atalhos de tecla única ligados — sem eles o \"?\" da dica não funciona. */\n protected readonly characterKeys = inject(HermesShortcutService).characterKeys;\n /** Dica com a tecla no meio: o texto do catálogo partido em volta de `{key}`. */\n protected get hintParts(): string[] {\n return this.text.hint.split('{key}');\n }\n\n /** @deprecated O painel agora é o `hm-shortcut-list`; use `ShortcutService.panelItems()`. Sai numa próxima versão. */\n public get groups(): ShortcutGroup[] {\n return this.shortcuts.groups();\n }\n\n /** @deprecated As teclas são desenhadas pelo `hm-shortcut-list`. Sai numa próxima versão. */\n chips(keys: string): string[] {\n return keys.split('+').map((k) => k.trim()).filter(Boolean);\n }\n\n private sub?: Subscription;\n\n /** Reabre o tour de onboarding e fecha este painel. */\n replayTour(): void {\n this.open = false;\n this.onboarding.restart();\n }\n\n ngOnInit(): void {\n this.sub = this.shortcuts.help$.subscribe(() => (this.open = !this.open));\n }\n\n ngOnDestroy(): void {\n this.sub?.unsubscribe();\n }\n}\n","<hm-modal [open]=\"open\" (openChange)=\"open = $event\" [heading]=\"text.heading\" size=\"large\">\n <!-- Com a tecla única desligada (WCAG 2.1.4) o \"?\" não abre o painel: a dica some junto. -->\n @if (characterKeys()) {\n <p class=\"sc-hint\">\n {{ hintParts[0] }}<kbd class=\"sc-chip\">?</kbd>{{ hintParts[1] }}\n </p>\n }\n\n <hm-shortcut-list searchable characterKeysToggle [registered]=\"false\" [items]=\"items()\" />\n\n <ng-container footer>\n <hm-button emphasis=\"medium\" icon=\"play\" (clicked)=\"replayTour()\">{{ text.replayTour }}</hm-button>\n <hm-button (clicked)=\"open = false\">{{ text.dismiss }}</hm-button>\n </ng-container>\n</hm-modal>\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { SPINE_ADMIN_API } from '@trismegisto/spine';\n\n/** Um token de aplicação do usuário, como o argos-admin devolve (nunca o valor, só o prefixo). */\nexport interface AppToken {\n id: string;\n name: string;\n description: string | null;\n prefix: string;\n badge_id: string;\n badge_name: string;\n expires_at: string;\n created_at: string;\n last_used_at: string | null;\n expired: boolean;\n}\n\nexport interface AppTokenList {\n tokens: AppToken[];\n max_active: number;\n max_days: number;\n}\n\n/** A aplicação logada e os níveis de acesso que o usuário pode escolher nela ao criar um token. */\nexport interface AppTokenOptions {\n client: { id: string; name: string | null };\n badges: { id: string; name: string }[];\n max_days: number;\n}\n\nexport interface CreatedAppToken {\n id: string;\n /** Valor bruto — só existe nesta resposta. */\n token: string;\n expires_at: string;\n}\n\n/**\n * Tokens de aplicação pessoais (`x-app-token`) do usuário logado — `argos-admin /me/app-tokens`.\n * Sempre da aplicação LOGADA: o servidor tira o client do próprio access-token da sessão, então\n * aqui não existe escolha de aplicação.\n * Autentica com o access-token da sessão (o servidor recusa um app-token aqui: token não cria\n * token). `available` é falso quando o app não tem a URL do argos-admin (`SPINE_ADMIN_API`).\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineAppTokensService {\n private readonly http = inject(HttpClient);\n private readonly auth = inject(AuthorizationService);\n private readonly adminApi = inject(SPINE_ADMIN_API, { optional: true });\n\n readonly available = !!this.adminApi;\n\n private get baseUrl(): string {\n return `${this.adminApi}/me/app-tokens`;\n }\n\n private get headers(): HttpHeaders {\n return new HttpHeaders({ 'x-access-token': this.auth.getToken() ?? '' });\n }\n\n list(): Promise<AppTokenList> {\n return firstValueFrom(this.http.get<AppTokenList>(this.baseUrl, { headers: this.headers }));\n }\n\n options(): Promise<AppTokenOptions> {\n return firstValueFrom(this.http.get<AppTokenOptions>(`${this.baseUrl}/options`, { headers: this.headers }));\n }\n\n create(body: { badge_id: string; name: string; validity_days: number }): Promise<CreatedAppToken> {\n return firstValueFrom(this.http.post<CreatedAppToken>(this.baseUrl, body, { headers: this.headers }));\n }\n\n revoke(id: string): Promise<void> {\n return firstValueFrom(this.http.delete<void>(`${this.baseUrl}/${id}`, { headers: this.headers }));\n }\n}\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { FormControl, Validators, ReactiveFormsModule } from '@angular/forms';\nimport {\n ButtonComponent,\n InputComponent,\n HermesToastService,\n IconComponent,\n SegmentedControlComponent,\n SegmentedOption,\n} from '@trismegisto/angular';\nimport { SpinePreferencesService, SPINE_MESSAGES } from '@trismegisto/spine';\nimport { AppToken, SpineAppTokensService } from './app-tokens.service';\nimport { formatMessage } from '@trismegisto/primitives';\n\n/** Validades oferecidas (dias). O servidor recusa acima de 365 — o CHECK no banco também. */\n\n/**\n * Tokens de aplicação do usuário (seção Conta do painel de configurações): lista, criação e\n * revogação. O valor do token só aparece uma vez, logo depois de criado, e some quando o painel\n * fecha (o componente vive dentro do `@if` do painel).\n */\n@Component({\n selector: 'spine-app-tokens',\n imports: [ReactiveFormsModule, ButtonComponent, InputComponent, IconComponent, SegmentedControlComponent],\n templateUrl: './app-tokens.component.html',\n styleUrl: './app-tokens.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppTokensComponent {\n protected readonly text = inject(SPINE_MESSAGES).appTokens;\n protected readonly fmt = formatMessage;\n private readonly locale = inject(SPINE_MESSAGES);\n private readonly service = inject(SpineAppTokensService);\n private readonly toast = inject(HermesToastService);\n private readonly preferences = inject(SpinePreferencesService);\n\n protected readonly available = this.service.available;\n protected readonly loading = signal(true);\n protected readonly loadError = signal('');\n protected readonly tokens = signal<AppToken[]>([]);\n protected readonly maxActive = signal(10);\n\n protected readonly validCount = computed(() => this.tokens().filter((t) => !t.expired).length);\n protected readonly atLimit = computed(() => this.validCount() >= this.maxActive());\n\n // ── criação ─────────────────────────────────────────────────────────────────\n protected readonly creating = signal(false);\n protected readonly submitting = signal(false);\n /** Nome da aplicação logada (a única para a qual dá pra criar token aqui). */\n protected readonly clientName = signal('');\n protected readonly badges = signal<{ id: string; name: string }[]>([]);\n protected readonly badgeId = signal('');\n protected readonly validity = signal('90');\n protected readonly nameControl = new FormControl('', { nonNullable: true, validators: [Validators.required, Validators.maxLength(80)] });\n protected readonly validityOptions = computed<readonly SegmentedOption[]>(() => [\n { value: '30', label: this.text.days30 },\n { value: '90', label: this.text.days90 },\n { value: '180', label: this.text.months6 },\n { value: '365', label: this.text.year1 },\n ]);\n\n protected readonly badgeOptions = computed<SegmentedOption[]>(() =>\n this.badges().map((b) => ({ value: b.id, label: b.name })),\n );\n\n /** Token recém-criado, mostrado uma única vez. */\n protected readonly created = signal<{ name: string; token: string; expiresAt: string } | null>(null);\n /** Token com a revogação aguardando confirmação (segundo clique). */\n protected readonly confirmingRevoke = signal<string | null>(null);\n\n constructor() {\n if (this.available) void this.load();\n else this.loading.set(false);\n }\n\n private async load(): Promise<void> {\n this.loading.set(true);\n this.loadError.set('');\n try {\n const list = await this.service.list();\n this.tokens.set(list.tokens);\n this.maxActive.set(list.max_active);\n } catch (err) {\n this.loadError.set(this.errorText(err, this.text.loadError));\n } finally {\n this.loading.set(false);\n }\n }\n\n protected async startCreate(): Promise<void> {\n this.created.set(null);\n this.nameControl.reset('');\n this.validity.set('90');\n this.creating.set(true);\n try {\n const { client, badges } = await this.service.options();\n this.clientName.set(client.name ?? '');\n this.badges.set(badges);\n // Um nível só: já vem escolhido. Vários: o de maior nível vem primeiro (ordem do servidor).\n this.badgeId.set(badges[0]?.id ?? '');\n } catch (err) {\n this.toast.error(this.errorText(err, this.text.badgesError));\n this.creating.set(false);\n }\n }\n\n protected cancelCreate(): void {\n this.creating.set(false);\n }\n\n protected readonly canSubmit = computed(() => !!this.badgeId() && !this.submitting());\n\n protected async submit(): Promise<void> {\n this.nameControl.markAsTouched();\n if (!this.canSubmit() || this.nameControl.invalid) return;\n this.submitting.set(true);\n try {\n const name = this.nameControl.value.trim();\n const result = await this.service.create({\n badge_id: this.badgeId(),\n name,\n validity_days: Number(this.validity()),\n });\n this.created.set({ name, token: result.token, expiresAt: result.expires_at });\n this.creating.set(false);\n await this.load();\n } catch (err) {\n this.toast.error(this.errorText(err, this.text.createError));\n } finally {\n this.submitting.set(false);\n }\n }\n\n protected async copyCreated(): Promise<void> {\n const token = this.created()?.token;\n if (!token) return;\n try {\n await navigator.clipboard.writeText(token);\n this.toast.success(this.text.copied);\n } catch {\n this.toast.error(this.text.copyFailed);\n }\n }\n\n protected dismissCreated(): void {\n this.created.set(null);\n }\n\n protected async revoke(token: AppToken): Promise<void> {\n if (this.confirmingRevoke() !== token.id) {\n this.confirmingRevoke.set(token.id);\n return;\n }\n this.confirmingRevoke.set(null);\n try {\n await this.service.revoke(token.id);\n this.tokens.update((list) => list.filter((t) => t.id !== token.id));\n this.toast.success(formatMessage(this.text.revoked, { name: token.name }));\n } catch (err) {\n this.toast.error(this.errorText(err, this.text.revokeError));\n }\n }\n\n protected formatDate(value: string | null): string {\n if (!value) return this.text.never;\n return new Intl.DateTimeFormat(this.locale.meta.locale, { dateStyle: 'short', timeStyle: 'short', timeZone: this.preferences.effectiveTimeZone() })\n .format(new Date(value));\n }\n\n private errorText(err: unknown, fallback: string): string {\n const detail = err instanceof HttpErrorResponse ? (err.error?.detail as string | undefined) : undefined;\n return detail || fallback;\n }\n}\n","@if (!available) {\n <p class=\"sp-tokens__note\">{{ text.unavailable }}</p>\n} @else {\n <!-- Token recém-criado: única vez em que o valor aparece. -->\n @if (created(); as c) {\n <div class=\"sp-tokens__created\" role=\"status\">\n <p class=\"sp-tokens__created-title\">\n <hm-icon shape=\"check-circle\" /> {{ fmt(text.created, { name: c.name }) }}\n </p>\n <code class=\"sp-tokens__secret\">{{ c.token }}</code>\n <p class=\"sp-tokens__note\" [innerHTML]=\"fmt(text.sendHeader, { date: formatDate(c.expiresAt) })\"></p>\n <div class=\"sp-tokens__actions\">\n <hm-button emphasis=\"high\" icon=\"copy\" (clicked)=\"copyCreated()\">{{ text.copyToken }}</hm-button>\n <hm-button emphasis=\"minimal\" (clicked)=\"dismissCreated()\">{{ text.saved }}</hm-button>\n </div>\n </div>\n }\n\n @if (loading()) {\n <p class=\"sp-tokens__note\">{{ text.loading }}</p>\n } @else if (loadError()) {\n <p class=\"sp-tokens__note sp-tokens__note--error\">{{ loadError() }}</p>\n } @else {\n @if (tokens().length) {\n <ul class=\"sp-tokens__list\">\n @for (t of tokens(); track t.id) {\n <li class=\"sp-tokens__item\" [class.sp-tokens__item--expired]=\"t.expired\">\n <span class=\"sp-tokens__item-main\">\n <strong>{{ t.name }}</strong>\n <span class=\"sp-tokens__meta\">{{ t.badge_name }} · <code>{{ t.prefix }}</code></span>\n <span class=\"sp-tokens__meta\">\n @if (t.expired) { <span class=\"sp-tokens__expired\">{{ fmt(text.expiredOn, { date: formatDate(t.expires_at) }) }}</span> }\n @else { {{ fmt(text.expiresOn, { date: formatDate(t.expires_at) }) }} }\n · {{ fmt(text.lastUsed, { date: formatDate(t.last_used_at) }) }}\n </span>\n </span>\n <hm-button emphasis=\"minimal\" intent=\"danger\" (clicked)=\"revoke(t)\">\n {{ confirmingRevoke() === t.id ? text.confirmRevoke : text.revoke }}\n </hm-button>\n </li>\n }\n </ul>\n } @else if (!creating()) {\n <p class=\"sp-tokens__note\">{{ text.empty }}</p>\n }\n\n @if (creating()) {\n <form class=\"sp-tokens__form\" (submit)=\"$event.preventDefault(); submit()\">\n @if (!badges().length) {\n <p class=\"sp-tokens__note\">{{ text.noBadges }}</p>\n } @else {\n @if (clientName()) {\n <p class=\"sp-tokens__note\" [innerHTML]=\"fmt(text.appOnly, { name: clientName() })\"></p>\n }\n @if (badgeOptions().length > 1) {\n <div class=\"sp-tokens__field\">\n <span class=\"sp-tokens__label\">{{ text.accessLevel }}</span>\n <hm-segmented-control emphasis=\"action\" [label]=\"text.accessLevel\" [options]=\"badgeOptions()\" [value]=\"badgeId()\" (valueChange)=\"badgeId.set($event)\" />\n </div>\n }\n <hm-input [label]=\"text.name\" [placeholder]=\"text.namePlaceholder\" [formControl]=\"nameControl\" [messages]=\"{ required: text.nameRequired, maxlength: text.nameMax }\" />\n <div class=\"sp-tokens__field\">\n <span class=\"sp-tokens__label\">{{ text.validity }}</span>\n <hm-segmented-control emphasis=\"action\" [label]=\"text.validity\" [options]=\"validityOptions()\" [value]=\"validity()\" (valueChange)=\"validity.set($event)\" />\n </div>\n }\n <div class=\"sp-tokens__actions\">\n @if (badges().length) {\n <hm-button type=\"submit\" emphasis=\"high\" icon=\"key\" [disabled]=\"!canSubmit()\" [loading]=\"submitting()\">{{ text.create }}</hm-button>\n }\n <hm-button emphasis=\"minimal\" (clicked)=\"cancelCreate()\">{{ text.cancel }}</hm-button>\n </div>\n </form>\n } @else {\n <div class=\"sp-tokens__actions\">\n <hm-button emphasis=\"medium\" icon=\"plus\" [disabled]=\"atLimit()\" (clicked)=\"startCreate()\">{{ text.newToken }}</hm-button>\n <span class=\"sp-tokens__note\">{{ fmt(text.validCount, { valid: validCount(), max: maxActive() }) }}</span>\n </div>\n @if (atLimit()) {\n <p class=\"sp-tokens__note\">{{ text.limit }}</p>\n }\n }\n }\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { AccountAvatarComponent, ButtonComponent, ComboboxComponent, ComboboxOption, HermesDensity, HermesSidebarService, HermesThemeMode, HermesThemeService, HermesToastService, IconComponent, SegmentedControlComponent, SegmentedOption, SettingsDialogComponent, SettingsRowComponent, SettingsSectionComponent, ShortcutListComponent, ThemePickerComponent, SelectComponent } from '@trismegisto/angular';\nimport { APP_PACKAGE_INFO, DensityService, SPINE_CONFIG, SpinePreferencesService, ThemePresetService, ThemeService, SPINE_MESSAGES } from '@trismegisto/spine';\nimport { HERMES_FONTS, HermesFont, formatMessage } from '@trismegisto/primitives';\nimport { OnboardingService } from '../onboarding/onboarding.service';\nimport { AppTokensComponent } from './app-tokens.component';\nimport { ShortcutService } from '../shortcuts/shortcut.service';\nimport { SPINE_SETTINGS_KEYS, SPINE_SETTINGS_SECTIONS, SpineSettingsService } from './settings.service';\n\n/** Dependências que valem mostrar em \"Sobre\" (as demais são detalhe de build). */\n// check-strings: off — nomes de produto, não se traduzem.\nconst KEY_DEPENDENCIES: readonly { name: string; label: string }[] = [\n { name: '@angular/core', label: 'Angular' },\n { name: '@trismegisto/angular', label: 'Hermes DS' },\n { name: '@trismegisto/spine', label: 'Hermes Spine' },\n { name: '@orfeu/angular', label: 'Orfeu' },\n { name: 'apollo-angular', label: 'Apollo' },\n { name: 'graphql', label: 'GraphQL' },\n { name: 'rxjs', label: 'RxJS' },\n // check-strings: on\n];\n\n/**\n * Painel de configurações do shell (substitui as telas do antigo módulo \"Sistema\"): Aparência,\n * Região, Atalhos, Conta e Sobre, mais as seções que o app registrar com\n * `provideSettingsSection`. Tudo vale na hora — cada controle chama o serviço que já persiste\n * aquela preferência (tema, densidade, menu lateral, fuso).\n *\n * Aberto por `SpineSettingsService.open()` — menu do perfil, `Ctrl+,` ou `?settings=<seção>`.\n */\n@Component({\n selector: 'spine-settings-panel',\n imports: [\n NgComponentOutlet, AppTokensComponent,\n AccountAvatarComponent, ButtonComponent, ComboboxComponent, IconComponent,\n SegmentedControlComponent, SettingsDialogComponent, SettingsRowComponent, SettingsSectionComponent,\n SelectComponent, ShortcutListComponent, ThemePickerComponent,\n ],\n templateUrl: './settings-panel.component.html',\n styleUrl: './settings-panel.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SettingsPanelComponent {\n protected readonly settings = inject(SpineSettingsService);\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly text = this.messages.settings;\n protected readonly fmt = formatMessage;\n protected readonly keys = SPINE_SETTINGS_KEYS;\n\n private readonly theme = inject(ThemeService);\n private readonly hermesTheme = inject(HermesThemeService);\n private readonly presets = inject(ThemePresetService);\n private readonly density = inject(DensityService);\n protected readonly sidebar = inject(HermesSidebarService);\n protected readonly preferences = inject(SpinePreferencesService);\n private readonly shortcutService = inject(ShortcutService);\n private readonly onboarding = inject(OnboardingService);\n private readonly auth = inject(AuthorizationService);\n private readonly toast = inject(HermesToastService);\n protected readonly packageInfo = inject(APP_PACKAGE_INFO, { optional: true }) ?? {};\n private readonly config = inject(SPINE_CONFIG, { optional: true });\n protected readonly appSections = inject(SPINE_SETTINGS_SECTIONS, { optional: true }) ?? [];\n\n protected readonly appName = this.config?.appName ?? 'Hermes';\n\n // ── Aparência ───────────────────────────────────────────────────────────────\n protected readonly themeOptions = computed<readonly SegmentedOption[]>(() => [\n { value: 'light', label: this.text.themeLight, icon: 'sun' },\n { value: 'dark', label: this.text.themeDark, icon: 'moon' },\n { value: 'system', label: this.text.themeSystem, icon: 'computer' },\n ]);\n protected readonly densityOptions = computed<readonly SegmentedOption[]>(() => [\n { value: 'comfortable', label: this.text.comfortable },\n { value: 'compact', label: this.text.compact },\n ]);\n // As fontes do config (as da lib, ou as do app via `provideUi({ theme: { fonts, replaceFonts } })`).\n protected readonly fontOptions: readonly SegmentedOption[] = (this.hermesTheme.fonts ?? HERMES_FONTS).map((f) => ({ value: f.id, label: f.label }));\n protected readonly sidebarOptions = computed<readonly SegmentedOption[]>(() => [\n { value: 'auto', label: this.text.sidebarAuto },\n { value: 'fixed', label: this.text.sidebarFixed },\n { value: 'compact', label: this.text.sidebarCompact },\n ]);\n\n protected readonly themeMode = computed(() => this.hermesTheme.mode());\n protected readonly appliedTheme = computed(() => this.hermesTheme.theme());\n protected readonly family = computed(() => this.hermesTheme.family());\n protected readonly densityValue = computed(() => this.hermesTheme.density());\n protected readonly fontValue = computed(() => this.hermesTheme.font());\n protected readonly families = this.presets.families;\n\n protected setThemeMode(mode: string): void {\n this.theme.setMode(mode as HermesThemeMode);\n }\n\n protected setFamily(id: string): void {\n const family = this.families.find((f) => f.id === id);\n if (family) this.presets.setPreset(family);\n }\n\n protected setDensity(value: string): void {\n this.density.setDensity(value as HermesDensity);\n }\n\n protected setFont(value: string): void {\n this.hermesTheme.setFont(value as HermesFont);\n }\n\n protected setSidebarMode(value: string): void {\n this.sidebar.setMode(value as 'auto' | 'fixed' | 'compact');\n }\n\n // ── Região ──────────────────────────────────────────────────────────────────\n protected readonly languageOptions = computed(() => {\n const appLanguage = this.preferences.languages.find((l) => l.value === this.preferences.appLanguage)?.label ?? this.preferences.appLanguage;\n return [\n { value: '', label: formatMessage(this.text.languageAuto, { language: appLanguage }) },\n ...this.preferences.languages,\n ];\n });\n\n /** ~400 fusos, cada um com o deslocamento calculado: só monta quando o painel abre pela\n * primeira vez, não no carregamento de toda página (o painel vive no layout desde o início). */\n private timeZoneCache: readonly ComboboxOption[] | null = null;\n protected readonly timeZoneOptions = computed<readonly ComboboxOption[]>(() => [\n { value: '', label: formatMessage(this.text.timeZoneAuto, { zone: this.preferences.browserTimeZone }) },\n ...(this.timeZoneCache ??= this.preferences\n .supportedTimeZones()\n .map((tz) => ({ value: tz, label: `${tz.replace(/_/g, ' ')} (${offsetOf(tz)})` }))),\n ]);\n\n /** Hora agora no fuso efetivo — prévia de como as datas vão aparecer. */\n protected readonly timeZonePreview = computed(() => {\n const zone = this.preferences.effectiveTimeZone();\n try {\n return new Intl.DateTimeFormat(this.messages.meta.locale, { dateStyle: 'short', timeStyle: 'short', timeZone: zone }).format(new Date())\n + ` (${offsetOf(zone)})`;\n } catch {\n return zone;\n }\n });\n\n // ── Atalhos ─────────────────────────────────────────────────────────────────\n /** Atalhos registrados (favoritos numa linha só) + os que outra peça dispara — os mesmos do painel \"?\". */\n protected readonly shortcutItems = this.shortcutService.panelItems;\n\n protected replayTour(): void {\n this.settings.close();\n this.onboarding.restart();\n }\n\n // ── Conta ───────────────────────────────────────────────────────────────────\n protected get profile() { return this.auth.profile; }\n protected get badge() { return this.auth.badge; }\n\n /** Validade da sessão lida do `exp` do próprio token (só leitura do payload, sem validar). */\n protected get sessionExpiry(): string {\n const exp = decodeTokenPayload(this.auth.getToken())?.['exp'];\n if (typeof exp !== 'number') return this.text.sessionUnknown;\n const at = new Date(exp * 1000);\n const minutes = Math.round((at.getTime() - Date.now()) / 60000);\n const when = new Intl.DateTimeFormat(this.messages.meta.locale, { timeStyle: 'short', timeZone: this.preferences.effectiveTimeZone() }).format(at);\n if (minutes <= 0) return formatMessage(this.text.sessionExpired, { time: when });\n return minutes < 60\n ? formatMessage(this.text.sessionExpiresIn, { minutes, time: when })\n : formatMessage(this.text.sessionExpiresAt, { time: when });\n }\n\n protected async copyToken(): Promise<void> {\n const token = this.auth.getToken();\n if (!token) { this.toast.warning(this.text.noSessionToken); return; }\n await this.copy(token, this.text.tokenCopied);\n }\n\n protected logout(): void {\n this.settings.close();\n this.auth.logout();\n }\n\n // ── Sobre ───────────────────────────────────────────────────────────────────\n protected readonly dependencies = KEY_DEPENDENCIES\n .map((d) => ({ ...d, version: this.packageInfo.dependencies?.[d.name] }))\n .filter((d) => !!d.version);\n\n protected get buildDate(): string {\n const date = this.packageInfo.buildDate;\n return date ? new Intl.DateTimeFormat(this.messages.meta.locale, { dateStyle: 'short', timeStyle: 'short' }).format(new Date(date)) : '';\n }\n\n /** Texto pronto pra colar num chamado: app, versão, ambiente, navegador, tela, fuso e página. */\n protected async copySupportInfo(): Promise<void> {\n const info = this.packageInfo;\n const s = this.messages.support;\n const theme = formatMessage(s.themeValue, {\n theme: this.appliedTheme(), mode: this.themeMode(), family: this.family(), density: this.densityValue(), font: this.fontValue(),\n });\n const lines = [\n `${s.application}: ${this.appName}${info.name ? ` (${info.name})` : ''}`,\n `${s.version}: ${info.version ?? '—'}`,\n info.buildDate ? `${s.build}: ${this.buildDate}` : '',\n info.environment ? `${s.environment}: ${info.environment}` : '',\n `${s.page}: ${location.href}`,\n `${s.browser}: ${navigator.userAgent}`,\n `${s.screen}: ${window.innerWidth}×${window.innerHeight} @${window.devicePixelRatio}x`,\n `${s.theme}: ${theme}`,\n `${s.timeZone}: ${this.preferences.effectiveTimeZone()}`,\n `${s.accessLevel}: ${this.badge?.name ?? '—'}`,\n `${s.date}: ${new Date().toISOString()}`,\n ].filter(Boolean);\n await this.copy(lines.join('\\n'), this.text.supportCopied);\n }\n\n private async copy(text: string, success: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text);\n this.toast.success(success);\n } catch {\n this.toast.error(this.text.copyBlocked);\n }\n }\n\n protected onOpenChange(open: boolean): void {\n if (!open) this.settings.close();\n }\n}\n\n/** \"UTC−03:00\" para um fuso IANA. */\nfunction offsetOf(timeZone: string): string {\n try {\n const part = new Intl.DateTimeFormat('en-US', { timeZone, timeZoneName: 'longOffset' })\n .formatToParts(new Date())\n .find((p) => p.type === 'timeZoneName')?.value;\n return (part ?? 'GMT').replace('GMT', 'UTC').replace('-', '−') || 'UTC';\n } catch {\n return 'UTC';\n }\n}\n\nfunction decodeTokenPayload(token: string | null): Record<string, unknown> | null {\n const payload = token?.split('.')[1];\n if (!payload) return null;\n try {\n const json = atob(payload.replace(/-/g, '+').replace(/_/g, '/').padEnd(Math.ceil(payload.length / 4) * 4, '='));\n return JSON.parse(json) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n","<!-- Montado só enquanto aberto: nada disto (lista de fusos, leitura do token...) custa no\n carregamento de toda página. -->\n@if (settings.isOpen()) {\n <hm-settings-dialog\n [heading]=\"text.heading\"\n [open]=\"true\"\n (openChange)=\"onOpenChange($event)\"\n [activeSection]=\"settings.section()\"\n (activeSectionChange)=\"settings.section.set($event)\"\n >\n <!-- ── Conta ─────────────────────────────────────────────────────────── -->\n <hm-settings-section [key]=\"keys.account\" [label]=\"text.account\" icon=\"user\" [keywords]=\"text.accountKeywords\">\n <div class=\"sp-settings__profile\">\n <hm-account-avatar [name]=\"profile.name ?? text.user\" [imageUrl]=\"profile.picture\" />\n <span class=\"sp-settings__profile-text\">\n <strong>{{ profile.name ?? text.user }}</strong>\n @if (profile.role) { <span>{{ profile.role }}</span> }\n </span>\n </div>\n\n <!-- Só informativo: a troca de nível fica no menu do perfil, perto de onde se trabalha. -->\n @if (badge) {\n <hm-settings-row [label]=\"text.accessLevel\" [keywords]=\"text.accessLevelKeywords\">\n <span class=\"sp-settings__value\">{{ badge.name }}</span>\n </hm-settings-row>\n }\n\n <hm-settings-row [label]=\"text.session\" [description]=\"text.sessionDescription\" [keywords]=\"text.sessionKeywords\">\n <span class=\"sp-settings__value\">{{ sessionExpiry }}</span>\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.accessToken\" [description]=\"text.accessTokenDescription\" [keywords]=\"text.accessTokenKeywords\">\n <hm-button emphasis=\"medium\" icon=\"copy\" (clicked)=\"copyToken()\">{{ text.copy }}</hm-button>\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.appTokens\" [stacked]=\"true\"\n [description]=\"text.appTokensDescription\"\n [keywords]=\"text.appTokensKeywords\">\n <spine-app-tokens />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.logout\" [description]=\"text.logoutDescription\" [keywords]=\"text.logoutKeywords\">\n <hm-button emphasis=\"medium\" intent=\"danger\" icon=\"logout\" (clicked)=\"logout()\">{{ text.logout }}</hm-button>\n </hm-settings-row>\n </hm-settings-section>\n\n <!-- ── Aparência ─────────────────────────────────────────────────────── -->\n <hm-settings-section [key]=\"keys.appearance\" [label]=\"text.appearance\" icon=\"color-palette\" [keywords]=\"text.appearanceKeywords\">\n <hm-settings-row [label]=\"text.theme\" [description]=\"text.themeDescription\" [keywords]=\"text.themeKeywords\">\n <hm-segmented-control emphasis=\"action\" [label]=\"text.theme\" [options]=\"themeOptions()\" [value]=\"themeMode()\" (valueChange)=\"setThemeMode($event)\" />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.accent\" [description]=\"text.accentDescription\" [keywords]=\"text.accentKeywords\" [stacked]=\"true\">\n <hm-theme-picker\n [families]=\"families\"\n [family]=\"family()\"\n [theme]=\"appliedTheme()\"\n [showMode]=\"false\"\n (familyChosen)=\"setFamily($event)\"\n />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.density\" [description]=\"text.densityDescription\" [keywords]=\"text.densityKeywords\">\n <hm-segmented-control emphasis=\"action\" [label]=\"text.density\" [options]=\"densityOptions()\" [value]=\"densityValue()\" (valueChange)=\"setDensity($event)\" />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.font\" [description]=\"text.fontDescription\" [keywords]=\"text.fontKeywords\">\n <hm-segmented-control emphasis=\"action\" [label]=\"text.font\" [options]=\"fontOptions\" [value]=\"fontValue()\" (valueChange)=\"setFont($event)\" />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.sidebar\" [description]=\"text.sidebarDescription\" [keywords]=\"text.sidebarKeywords\">\n <hm-segmented-control emphasis=\"action\" [label]=\"text.sidebar\" [options]=\"sidebarOptions()\" [value]=\"sidebar.mode()\" (valueChange)=\"setSidebarMode($event)\" />\n </hm-settings-row>\n </hm-settings-section>\n\n <!-- ── Região ────────────────────────────────────────────────────────── -->\n <hm-settings-section [key]=\"keys.region\" [label]=\"text.region\" icon=\"clock\" [keywords]=\"text.regionKeywords\">\n <hm-settings-row [label]=\"text.language\" [description]=\"text.languageDescription\" [keywords]=\"text.languageKeywords\">\n <hm-select\n class=\"sp-settings__language\"\n [label]=\"text.language\"\n [labelHidden]=\"true\"\n [value]=\"preferences.language()\"\n (valueChange)=\"preferences.setLanguage($event ?? '')\"\n >\n @for (option of languageOptions(); track option.value) {\n <option [value]=\"option.value\" [attr.lang]=\"option.value || null\">{{ option.label }}</option>\n }\n </hm-select>\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.timeZone\" [keywords]=\"text.timeZoneKeywords\">\n <span rowDescription class=\"sp-settings__hint\">{{ fmt(text.timeZoneHint, { now: timeZonePreview() }) }}</span>\n <hm-combobox\n class=\"sp-settings__timezone\"\n [label]=\"text.timeZone\"\n [labelHidden]=\"true\"\n icon=\"world\"\n [options]=\"timeZoneOptions()\"\n [value]=\"preferences.timeZone()\"\n (valueChange)=\"preferences.setTimeZone($event)\"\n />\n </hm-settings-row>\n </hm-settings-section>\n\n <!-- ── Atalhos ───────────────────────────────────────────────────────── -->\n <hm-settings-section [key]=\"keys.shortcuts\" [label]=\"text.shortcuts\" icon=\"keyboard\" [description]=\"text.shortcutsDescription\" [keywords]=\"text.shortcutsKeywords\">\n <!-- Mesma lista do painel \"?\", sem busca (a do diálogo de configurações já cobre a seção);\n o interruptor de tecla única (WCAG 2.1.4) persiste no SpinePreferencesService. -->\n <hm-shortcut-list characterKeysToggle [registered]=\"false\" [items]=\"shortcutItems()\" [headingLevel]=\"4\" />\n <hm-settings-row [label]=\"text.tour\" [description]=\"text.tourDescription\" [keywords]=\"text.tourKeywords\">\n <hm-button emphasis=\"medium\" icon=\"play\" (clicked)=\"replayTour()\">{{ text.replayTour }}</hm-button>\n </hm-settings-row>\n </hm-settings-section>\n\n <!-- ── Seções do app (provideSettingsSection) ────────────────────────── -->\n @for (s of appSections; track s.key) {\n <hm-settings-section [key]=\"s.key\" [label]=\"s.label\" [icon]=\"s.icon ?? 'cog'\" [description]=\"s.description ?? ''\" [keywords]=\"s.keywords ?? ''\">\n <ng-container *ngComponentOutlet=\"s.component\" />\n </hm-settings-section>\n }\n\n <!-- ── Sobre ─────────────────────────────────────────────────────────── -->\n <hm-settings-section [key]=\"keys.about\" [label]=\"text.about\" icon=\"info-circle\" [keywords]=\"text.aboutKeywords\">\n <hm-settings-row [label]=\"text.application\">\n <span class=\"sp-settings__value\">{{ appName }}@if (packageInfo.name) { <span class=\"sp-settings__muted\"> · {{ packageInfo.name }}</span> }</span>\n </hm-settings-row>\n <hm-settings-row [label]=\"text.version\" [keywords]=\"text.versionKeywords\">\n <span class=\"sp-settings__value sp-settings__mono\">{{ packageInfo.version ?? '—' }}</span>\n </hm-settings-row>\n @if (buildDate) {\n <hm-settings-row [label]=\"text.buildDate\">\n <span class=\"sp-settings__value\">{{ buildDate }}</span>\n </hm-settings-row>\n }\n @if (packageInfo.environment) {\n <hm-settings-row [label]=\"text.environment\" [keywords]=\"text.environmentKeywords\">\n <span class=\"sp-settings__value\">{{ packageInfo.environment }}</span>\n </hm-settings-row>\n }\n @if (packageInfo.repository?.url || packageInfo.docs || packageInfo.issues) {\n <hm-settings-row [label]=\"text.links\" [keywords]=\"text.linksKeywords\">\n <span class=\"sp-settings__links\">\n @if (packageInfo.docs) { <hm-button emphasis=\"minimal\" icon=\"book\" [link]=\"packageInfo.docs\" [newTab]=\"true\">{{ text.docs }}</hm-button> }\n @if (packageInfo.issues) { <hm-button emphasis=\"minimal\" icon=\"bug\" [link]=\"packageInfo.issues\" [newTab]=\"true\">{{ text.reportIssue }}</hm-button> }\n @if (packageInfo.repository?.url) { <hm-button emphasis=\"minimal\" icon=\"link\" [link]=\"packageInfo.repository!.url!\" [newTab]=\"true\">{{ text.repository }}</hm-button> }\n </span>\n </hm-settings-row>\n }\n @if (dependencies.length) {\n <hm-settings-row [label]=\"text.dependencies\" [description]=\"text.dependenciesDescription\" [keywords]=\"text.dependenciesKeywords\" [stacked]=\"true\">\n <dl class=\"sp-settings__deps\">\n @for (d of dependencies; track d.name) {\n <div><dt>{{ d.label }}</dt><dd class=\"sp-settings__mono\">{{ d.version }}</dd></div>\n }\n </dl>\n </hm-settings-row>\n }\n <hm-settings-row [label]=\"text.supportInfo\" [description]=\"text.supportInfoDescription\" [keywords]=\"text.supportInfoKeywords\">\n <hm-button emphasis=\"medium\" icon=\"clipboard\" (clicked)=\"copySupportInfo()\">{{ text.copy }}</hm-button>\n </hm-settings-row>\n </hm-settings-section>\n </hm-settings-dialog>\n}\n","import { DestroyRef, Injectable, computed, inject, isDevMode, signal } from '@angular/core';\nimport { ViewService } from '@orfeu/angular/core';\nimport { Route, SPINE_CONFIG, SPINE_MESSAGES, routerIdOf, spineRoutesOf } from '@trismegisto/spine';\nimport { ComponentDistributorService, RouteDocument, componentRouterId } from '@trismegisto/spine/routing';\n\n/** Documento de uma tela que a pessoa logada pode abrir. */\nexport interface DocsEntry extends RouteDocument {\n /** Chave da tela (router_id ou, sem ele, o do template), sempre em minúsculas. */\n readonly id: string;\n readonly title: string;\n readonly group: string;\n}\n\nexport interface DocsGroup {\n readonly title: string;\n readonly entries: readonly DocsEntry[];\n}\n\nexport type DocsView = 'usage' | 'technical';\n\ninterface ScreenInfo {\n readonly label: string;\n readonly module: string;\n}\n\n/**\n * Estado da documentação das telas: o que está registrado em `COMPONENT_ROUTES` com `document`,\n * filtrado pelas telas que existem na árvore da pessoa (documento de tela sem acesso nunca é oferecido),\n * e a leitura em andamento no modal `spine-docs`.\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineDocsService {\n readonly #distributor = inject(ComponentDistributorService);\n readonly #views = inject(ViewService);\n readonly #messages = inject(SPINE_MESSAGES);\n\n /** Visão técnica liberada (`SpineConfig.technicalDocs`; sem configuração, só em desenvolvimento). */\n readonly technicalAvailable: boolean = inject(SPINE_CONFIG, { optional: true })?.technicalDocs ?? isDevMode();\n\n readonly #isOpen = signal(false);\n readonly #current = signal<DocsEntry | null>(null);\n readonly #view = signal<DocsView>('usage');\n readonly #content = signal('');\n readonly #loading = signal(false);\n readonly #failed = signal(false);\n /** Identifica a leitura vigente; respostas de leituras anteriores são ignoradas. */\n #ticket = 0;\n /** A view do Orfeu não é um signal: este contador força a releitura da árvore. */\n readonly #treeRevision = signal(0);\n\n readonly isOpen = this.#isOpen.asReadonly();\n readonly current = this.#current.asReadonly();\n readonly view = this.#view.asReadonly();\n readonly content = this.#content.asReadonly();\n readonly loading = this.#loading.asReadonly();\n readonly error = computed(() => (this.#failed() ? this.#messages.docs.loadError : ''));\n readonly showTechnical = computed(\n () => this.technicalAvailable && !!this.#current()?.loadTechnical,\n );\n\n readonly #offered = computed<ReadonlyMap<string, DocsEntry>>(() => {\n this.#treeRevision();\n const screens = this.#screens();\n const offered = new Map<string, DocsEntry>();\n for (const registered of this.#distributor.entries) {\n const document = registered.document;\n if (!document) continue;\n const key = (componentRouterId(registered) ?? registered.source_template_router_id)?.toLowerCase();\n if (!key || offered.has(key)) continue;\n const screen = screens.get(key);\n if (!screen) continue;\n offered.set(key, {\n ...document,\n id: key,\n title: document.title ?? screen.label,\n group: document.group ?? screen.module,\n });\n }\n return offered;\n });\n\n readonly index = computed<DocsGroup[]>(() => {\n const locale = this.#messages.meta.locale;\n const compare = (a: string, b: string) => a.localeCompare(b, locale);\n const byGroup = new Map<string, DocsEntry[]>();\n for (const entry of this.#offered().values()) {\n const list = byGroup.get(entry.group);\n if (list) list.push(entry);\n else byGroup.set(entry.group, [entry]);\n }\n return [...byGroup]\n .map(([title, entries]) => ({ title, entries: entries.sort((a, b) => compare(a.title, b.title)) }))\n .sort((a, b) => compare(a.title, b.title));\n });\n\n constructor() {\n // Quando a view muda (login, troca de crachá), o botão da barra da página acompanha sem esperar\n // a próxima abertura.\n const changes = (this.#views as Partial<Pick<ViewService, 'currentView$'>>).currentView$;\n // A emissão síncrona da inscrição é a view que o `#offered` já lê; só as seguintes importam.\n let subscribed = false;\n const subscription = changes?.subscribe?.(() => {\n if (subscribed) this.#refreshTree();\n });\n subscribed = true;\n if (subscription) inject(DestroyRef).onDestroy(() => subscription.unsubscribe());\n }\n\n documentFor(routerId: string | null | undefined, sourceTemplateRouterId?: string | null): DocsEntry | null {\n const offered = this.#offered();\n for (const candidate of [routerId, sourceTemplateRouterId]) {\n if (!candidate) continue;\n const entry = offered.get(candidate.toLowerCase());\n if (entry) return entry;\n }\n return null;\n }\n\n openForRoute(routerId: string | null | undefined, sourceTemplateRouterId?: string | null): void {\n this.#refreshTree();\n this.#isOpen.set(true);\n const entry = this.documentFor(routerId, sourceTemplateRouterId);\n if (entry) void this.open(entry);\n }\n\n openIndex(): void {\n this.#refreshTree();\n this.#isOpen.set(true);\n }\n\n close(): void {\n this.#isOpen.set(false);\n }\n\n open(entry: DocsEntry, view: DocsView = 'usage'): Promise<void> {\n this.#current.set(entry);\n return this.show(view);\n }\n\n async show(view: DocsView): Promise<void> {\n const entry = this.#current();\n if (!entry) return;\n const technical = view === 'technical' && this.technicalAvailable ? entry.loadTechnical : undefined;\n const ticket = ++this.#ticket;\n\n this.#view.set(technical ? 'technical' : 'usage');\n this.#loading.set(true);\n this.#failed.set(false);\n\n let text = '';\n let failed = false;\n try {\n text = await (technical ?? entry.load)();\n } catch {\n failed = true;\n }\n if (ticket !== this.#ticket) return;\n\n this.#content.set(failed ? '' : text);\n this.#failed.set(failed);\n this.#loading.set(false);\n }\n\n #refreshTree(): void {\n this.#treeRevision.update((n) => n + 1);\n }\n\n /** Telas da árvore da pessoa, por router_id e por template, com rótulo e módulo de topo. */\n #screens(): Map<string, ScreenInfo> {\n const screens = new Map<string, ScreenInfo>();\n const visit = (node: Route, module: string) => {\n const info: ScreenInfo = { label: node.route_display_name ?? '', module };\n for (const key of [routerIdOf(node), node.source_template_router_id]) {\n if (key && !screens.has(key.toLowerCase())) screens.set(key.toLowerCase(), info);\n }\n for (const child of node.routes ?? []) visit(child, module);\n };\n for (const root of spineRoutesOf(this.#views.currentView)) visit(root, root.route_display_name ?? '');\n return screens;\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, input, signal } from '@angular/core';\nimport { BreadcrumbComponent, BreadcrumbItem, IconButtonComponent, IconComponent, TooltipDirective } from '@trismegisto/angular';\nimport { QuickAccessItem, Route, routerIdOf, SpineQuickAccessService, SPINE_MESSAGES } from '@trismegisto/spine';\nimport { SpineDocsService } from '../docs/docs.service';\n\n/**\n * Barra de contexto do topo de CADA painel do workspace: título e ícone da página e as\n * ações que valem pra página inteira (favoritar, copiar link, documentação) em cima; a descrição da\n * tela logo abaixo do título; a trilha (breadcrumb) embaixo.\n *\n * A descrição é do ROUTER (`web.router.description`, editada no Argos), não da tela: é aqui que todo\n * app mostra \"o que esta página faz\", então as telas NÃO repetem título+descrição internos.\n * Tela identificada pelo `router_id` do nó 'page' (`routerIdOf`), nunca pelo `web.routes.route_id`.\n *\n * Mora dentro do painel (não num shell global) porque cada painel do `hm-workspace` resolve a\n * própria aba: dois painéis lado a lado mostram duas trilhas diferentes ao mesmo tempo. Por isso\n * recebe a `chain` (header→…→page) do painel em vez de ler a \"página atual\" de algum serviço global.\n *\n * Só o painel focado alimenta os \"recentes\" (`recordRecent`) — os outros apenas exibem.\n *\n * Favoritos e recentes moram no `SpineQuickAccessService` (compartilhado com a tela inicial): o\n * coração daqui e a seção \"Favoritos\" do Início mudam juntos.\n */\n@Component({\n selector: 'spine-page-bar',\n imports: [BreadcrumbComponent, IconComponent, IconButtonComponent, TooltipDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (title(); as pageTitle) {\n <header class=\"spine-page-bar\" data-tour=\"breadcrumb\">\n <div class=\"spine-page-bar__identity\">\n <div class=\"spine-page-bar__title-row\">\n @if (icon(); as ic) {\n <hm-icon class=\"spine-page-bar__icon\" [shape]=\"ic\" />\n }\n <h1 class=\"spine-page-bar__title\">{{ pageTitle }}</h1>\n\n <span class=\"spine-page-bar__actions\">\n <!-- O estado vai no nome (\"Favoritar\" / \"Remover dos favoritos\"). Sem aria-pressed: no host\n <hm-icon-button> ele caía num elemento sem papel, e não no <button> (o leitor não lia).\n A dica (hmTooltip) repete o nome para quem enxerga: só ícone, sem texto, o botão não diz\n o que faz até ser clicado. -->\n <hm-icon-button\n emphasis=\"subtle\"\n icon=\"heart\" [solid]=\"isFavorite()\"\n [label]=\"isFavorite() ? text.unfavorite : text.favorite\"\n [hmTooltip]=\"isFavorite() ? text.unfavorite : text.favorite\"\n [class.spine-page-bar__fav--on]=\"isFavorite()\"\n (clicked)=\"toggleFavorite()\"\n />\n <hm-icon-button\n emphasis=\"subtle\"\n [icon]=\"linkCopied() ? 'check' : 'copy'\"\n [label]=\"linkCopied() ? text.linkCopied : text.copyLink\"\n [hmTooltip]=\"linkCopied() ? text.linkCopied : text.copyLink\"\n (clicked)=\"copyLink()\"\n />\n <!-- Só quando a tela tem documento registrado (\\`document\\` no mapa de componentes). -->\n @if (hasDoc()) {\n <hm-icon-button emphasis=\"subtle\" icon=\"doc-list\" [label]=\"text.docs\" [hmTooltip]=\"text.docs\" (clicked)=\"openDocs()\" />\n }\n </span>\n </div>\n\n @if (description(); as desc) {\n <p class=\"spine-page-bar__description\">{{ desc }}</p>\n }\n\n <!-- Trilha: o hm-breadcrumb da lib (nav nomeado, lista ordenada, aria-current no último degrau,\n recolhe o meio de trilha longa). Só com mais de um nível — numa página de nível 1 a trilha\n repetiria o título. -->\n @if (crumbs().length > 1) {\n <hm-breadcrumb class=\"spine-page-bar__trail\" [items]=\"trail()\" [label]=\"text.trail\" />\n }\n </div>\n\n <!-- Conteúdo projetado pela tela (botões dela). -->\n <div class=\"spine-page-bar__extra\"><ng-content /></div>\n </header>\n }\n `,\n styles: [`\n :host { display: block; }\n .spine-page-bar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--hm-space-sm);\n padding: var(--hm-space-sm) var(--hm-space-md);\n margin: 0;\n /* Faixa própria: fundo elevado e uma linha embaixo separam a barra do conteúdo da página. */\n background: var(--hm-surface-raised);\n border-block-end: var(--hm-border-hairline, 1px) solid var(--hm-divider);\n }\n /* Cresce para a trilha ter a largura da barra (e recolher/truncar nela), sem empurrar as ações extras.\n Entre o nome da página e a trilha: --hm-space-md até o TEXTO da trilha (com menos as linhas liam como um bloco\n só) — o respiro interno de cada degrau do hm-breadcrumb (--hm-space-micro) já conta nessa distância. */\n .spine-page-bar__identity {\n display: flex;\n flex: 1 1 auto;\n min-inline-size: 0;\n flex-direction: column;\n gap: calc(var(--hm-space-md) - var(--hm-space-micro));\n }\n .spine-page-bar__title-row { display: flex; align-items: center; gap: var(--hm-space-xs); min-inline-size: 0; }\n .spine-page-bar__icon { flex: none; color: var(--hm-accent); font-size: var(--hm-font-size-xxl, 28px); }\n .spine-page-bar__title {\n min-inline-size: 0;\n margin: 0;\n overflow: hidden;\n color: var(--hm-text);\n font-size: var(--hm-font-size-xl, 22px);\n font-weight: var(--hm-font-weight-bold, 700);\n line-height: var(--hm-line-height-tight, 1.2);\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n /* Colada no título (desconta o gap da coluna, que é o respiro título→trilha): fica --hm-space-nano\n abaixo dele. Texto secundário, quebra em mais linhas sem truncar. */\n .spine-page-bar__description {\n max-inline-size: 80ch;\n margin: calc(var(--hm-space-nano) - (var(--hm-space-md) - var(--hm-space-micro))) 0 0;\n color: var(--hm-muted);\n font-size: var(--hm-font-size-sm, 14px);\n line-height: var(--hm-line-height-normal, 1.5);\n }\n .spine-page-bar__actions { display: inline-flex; flex: none; align-items: center; gap: var(--hm-space-micro); margin-inline-start: var(--hm-space-nano); }\n /* Favorito ativo: ícone preenchido em --hm-danger (o mesmo tratamento da tela inicial). */\n .spine-page-bar__fav--on { color: var(--hm-danger); }\n /* Trilha = hm-breadcrumb (visual do @trismegisto/core: degrau clicável na cor de ação, o atual em texto\n secundário, separador em ângulo). Cada degrau tem um respiro interno (alvo de foco/hover); a margem\n negativa do mesmo tamanho alinha o texto do primeiro degrau com o título, em qualquer densidade. */\n .spine-page-bar__trail { margin-inline-start: calc(-1 * var(--hm-space-micro)); margin-block-end: calc(-1 * var(--hm-space-micro)); }\n .spine-page-bar__extra { display: flex; flex: none; align-items: center; gap: var(--hm-space-xxxs); }\n .spine-page-bar__extra:empty { display: none; }\n `],\n})\nexport class SpinePageBarComponent {\n protected readonly text = inject(SPINE_MESSAGES).pageBar;\n /** Cadeia resolvida (header→…→page) do painel; `null` enquanto a URL não resolve. */\n readonly chain = input<Route[] | null>(null);\n /** Só o painel focado registra a página em \"recentes\". */\n readonly recordRecent = input(false);\n\n protected readonly linkCopied = signal(false);\n private readonly docs = inject(SpineDocsService);\n\n /** A página (último nó da cadeia). */\n private readonly page = computed(() => this.chain()?.at(-1) ?? null);\n /** router_id da página -- chave do documento dela (o router do template entra como alternativa). */\n private readonly routerId = computed(() => routerIdOf(this.page()));\n private readonly sourceTemplateRouterId = computed(() => this.page()?.source_template_router_id ?? null);\n protected readonly hasDoc = computed(() => !!this.docs.documentFor(this.routerId(), this.sourceTemplateRouterId()));\n\n /** Descrição do router da página (`web.router.description`); vazia = sem a linha. */\n protected readonly description = computed(() => this.page()?.description?.trim() || '');\n\n protected openDocs(): void {\n this.docs.openForRoute(this.routerId(), this.sourceTemplateRouterId());\n }\n\n private readonly quickAccess = inject(SpineQuickAccessService);\n\n constructor() {\n effect(() => {\n const item = this.currentItem();\n if (this.recordRecent() && item) this.quickAccess.recordVisit(item);\n });\n }\n\n protected readonly crumbs = computed<{ label: string; link: string }[]>(() =>\n (this.chain() ?? [])\n .filter((r): r is Route & { route_display_name: string } => !!r.route_display_name)\n .map((r) => ({ label: r.route_display_name, link: r.route_redirect ?? '' })),\n );\n\n /** Degraus do `hm-breadcrumb`: nível sem endereço (grupo) vira texto, sem link. */\n protected readonly trail = computed<BreadcrumbItem[]>(() =>\n this.crumbs().map(({ label, link }) => (link ? { label, routerLink: link } : { label })),\n );\n\n protected readonly title = computed<string>(() => this.crumbs().at(-1)?.label ?? '');\n\n /** Ícone da própria página; cai no do módulo quando a página não tem. */\n protected readonly icon = computed<string | null>(() => {\n const chain = this.chain() ?? [];\n return chain.at(-1)?.route_icon || chain[0]?.route_icon || null;\n });\n\n /** A página do painel como item de favorito/recente, com a trilha (\"onde fica\") dela. */\n private readonly currentItem = computed<QuickAccessItem | null>(() => {\n const crumbs = this.crumbs();\n const last = crumbs.at(-1);\n if (!last?.link) return null;\n return {\n id: last.link,\n icon: this.icon() || 'application',\n displayName: last.label,\n redirect: last.link,\n trail: crumbs.slice(0, -1).map((c) => c.label),\n };\n });\n\n protected readonly isFavorite = computed(() => this.quickAccess.isFavorite(this.currentItem()?.id));\n\n protected toggleFavorite(): void {\n const item = this.currentItem();\n if (item) this.quickAccess.toggleFavorite(item);\n }\n\n protected copyLink(): void {\n try {\n void navigator.clipboard?.writeText(window.location.href);\n this.linkCopied.set(true);\n setTimeout(() => this.linkCopied.set(false), 2000);\n } catch {\n /* clipboard indisponível */\n }\n }\n\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, Type, effect, inject, input, signal } from '@angular/core';\nimport { Title } from '@angular/platform-browser';\nimport { ViewService } from '@orfeu/angular/core';\nimport { IconComponent, LoadingSquareComponent } from '@trismegisto/angular';\nimport { Route, routerIdOf, SPINE_MESSAGES, spineRoutesOf } from '@trismegisto/spine';\nimport { ComponentDistributorService, LoggerService, resolveEffectiveRouteChain } from '@trismegisto/spine/routing';\nimport { SpinePageBarComponent } from './spine-page-bar.component';\n\n// Componente já carregado para cada url, comum a todos os painéis: reabrir a mesma tela em outro\n// painel (ou voltar a ela) não passa de novo pelo distribuidor.\nconst componentCache = new Map<string, Type<unknown>>();\n\n/**\n * Conteúdo de um painel do `hm-workspace`. Como vários painéis ficam visíveis ao mesmo tempo, cada\n * um monta a sua tela a partir da própria `url`, sem `<router-outlet>`: o roteador só conhece uma\n * rota ativa, e aqui cada painel precisa manter a sua.\n *\n * Mostra o quadrado de carregamento enquanto o componente chega, a tela quando ele chega, ou o\n * aviso de \"não encontrado\" quando a url não leva a nenhuma rota com tela.\n */\n@Component({\n selector: 'spine-page-panel',\n imports: [NgComponentOutlet, LoadingSquareComponent, IconComponent, SpinePageBarComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <spine-page-bar [chain]=\"chain()\" [recordRecent]=\"isFocusedPanel()\" />\n <div class=\"spine-page-panel__content\">\n @if (loading()) {\n <div class=\"spine-page-panel__loading\"><hm-loading-square /></div>\n } @else if (component(); as cmp) {\n <ng-container [ngComponentOutlet]=\"cmp\" />\n } @else {\n <div class=\"spine-page-panel__empty\">\n <hm-icon shape=\"search-magnify\" size=\"xl\" />\n <p class=\"spine-page-panel__empty-title\">{{ text.notFoundTitle }}</p>\n <p class=\"spine-page-panel__empty-description\">{{ text.notFoundText }}</p>\n </div>\n }\n </div>\n `,\n styles: [`\n :host { display: flex; flex-direction: column; block-size: 100%; min-block-size: 0; }\n .spine-page-panel__content { flex: 1; min-block-size: 0; display: flex; flex-direction: column; padding: var(--hm-space-lg, 1.5rem) var(--hm-space-md, 1rem); }\n .spine-page-panel__loading { display: flex; flex: 1; align-items: center; justify-content: center; min-block-size: 50vh; padding: var(--hm-space-xl); }\n .spine-page-panel__empty {\n display: flex;\n flex: 1;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--hm-space-sm);\n padding: var(--hm-space-xl);\n text-align: center;\n color: var(--hm-muted);\n }\n .spine-page-panel__empty hm-icon { color: var(--hm-muted); }\n .spine-page-panel__empty-title { margin: 0; color: var(--hm-text); font-size: var(--hm-font-size-lg, 18px); font-weight: 600; }\n .spine-page-panel__empty-description { margin: 0; max-inline-size: 32ch; font-size: var(--hm-font-size-sm, 14px); }\n `],\n})\nexport class SpinePagePanelComponent {\n protected readonly text = inject(SPINE_MESSAGES).pagePanel;\n readonly url = input.required<string>();\n /** Só o painel focado fala pela página inteira: visita recente, título da aba e rota no logger. */\n readonly isFocusedPanel = input(true);\n\n private readonly viewService = inject(ViewService);\n private readonly distributor = inject(ComponentDistributorService);\n private readonly logger = inject(LoggerService);\n private readonly title = inject(Title);\n\n protected readonly loading = signal(true);\n protected readonly component = signal<Type<unknown> | null>(null);\n protected readonly chain = signal<Route[] | null>(null);\n\n constructor() {\n effect(() => {\n const url = this.url();\n void this.resolve(url);\n });\n // Com as abas mantidas vivas, o painel que recebe o foco de volta já tem a tela pronta; basta\n // reaplicar o que só o focado faz, sem carregar nada de novo.\n effect(() => {\n if (this.isFocusedPanel() && this.chain()) this.afterResolved();\n });\n }\n\n /** Cadeia de rotas da url (sem os nós que só agrupam) e o componente da última delas. */\n private async resolve(url: string): Promise<void> {\n const chain = resolveEffectiveRouteChain(\n spineRoutesOf(this.viewService.currentView),\n (u) => this.viewService.getLevel(u),\n (u, level) => this.viewService.getUrlAtLevel(u, level),\n url,\n );\n this.chain.set(chain);\n\n const leaf = chain?.at(-1) ?? null;\n if (!leaf) {\n this.component.set(null);\n this.loading.set(false);\n return;\n }\n\n const cached = componentCache.get(url);\n if (cached) {\n this.component.set(cached);\n this.loading.set(false);\n this.afterResolved();\n return;\n }\n\n this.loading.set(true);\n this.component.set(null);\n\n const component = await this.distributor.getComponent(routerIdOf(leaf) ?? '', leaf.source_template_router_id);\n\n // A url mudou enquanto o carregamento corria: este resultado já não interessa.\n if (url !== this.url()) return;\n\n componentCache.set(url, component);\n this.component.set(component);\n this.loading.set(false);\n this.afterResolved();\n }\n\n /** O que acontece quando a tela do painel focado fica pronta. */\n private afterResolved(): void {\n if (!this.isFocusedPanel()) return;\n const chain = this.chain();\n if (chain) this.logger.setLogger(chain);\n const leafName = chain?.at(-1)?.route_display_name;\n if (leafName) this.title.setTitle(leafName);\n }\n}\n","import { Directive, DestroyRef, ElementRef, inject, input, output } from '@angular/core';\n\n/**\n * Em painéis NÃO focados do `hm-workspace`, um `<a href>`/`[routerLink]` clicado navegaria o\n * `Router` de verdade — que só existe UM na aplicação, e está sempre atrelado ao painel FOCADO\n * (ver `SpineWorkspaceNavService`). Sem isto, clicar num link dentro de um painel secundário (um\n * item da sidebar, uma aba de submenu, um link de breadcrumb, qualquer `routerLink` dentro de uma\n * tela de feature) navegaria a tela ERRADA — o painel focado, não o painel onde o clique\n * aconteceu. Porte 1:1 do mesmo diretório do docs/website\n * (`docs/website/src/app/workspace/panel-local-link.directive.ts`) — genérico, sem nada\n * específico do site de documentação.\n *\n * Intercepta em fase de CAPTURA pra resolver a navegação LOCALMENTE antes do `RouterLink`\n * conseguir agir. Abrir em nova aba (Ctrl/⌘ + clique, clique do meio) continua funcionando\n * normalmente — só intercepta o clique comum.\n */\n@Directive({ selector: '[appPanelLocalLink]' })\nexport class PanelLocalLinkDirective {\n /** `true` = intercepta (painel não-focado); `false` = deixa o `RouterLink` normal agir. */\n readonly appPanelLocalLink = input(false);\n readonly localNavigate = output<string>();\n\n constructor() {\n const host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n const destroyRef = inject(DestroyRef);\n\n const onClick = (event: MouseEvent): void => {\n if (!this.appPanelLocalLink()) return;\n if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n\n const anchor = (event.target as HTMLElement).closest('a[href]');\n if (!anchor || !host.contains(anchor)) return;\n const href = anchor.getAttribute('href');\n if (!href || !href.startsWith('/')) return; // só rotas internas do próprio app\n\n event.preventDefault();\n event.stopPropagation();\n this.localNavigate.emit(href);\n };\n\n host.addEventListener('click', onClick, true);\n destroyRef.onDestroy(() => host.removeEventListener('click', onClick, true));\n }\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, inject, input } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport DOMPurify from 'dompurify';\nimport { Marked } from 'marked';\n\n// Instância própria: não mexe nas opções globais do `marked` que o app possa usar.\nconst parser = new Marked({ gfm: true, breaks: false, async: false });\n\n/**\n * Renderiza Markdown (GFM) como HTML com a tipografia do design system. O texto é tratado como dado:\n * o HTML gerado passa pelo DOMPurify antes de chegar ao DOM.\n */\n@Component({\n selector: 'spine-markdown',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // O HTML injetado não recebe os atributos do encapsulamento; os estilos ficam presos a `.spine-md`.\n encapsulation: ViewEncapsulation.None,\n template: `\n @if (html(); as markup) {\n <div class=\"spine-md\" [innerHTML]=\"markup\"></div>\n }\n `,\n styles: `\n .spine-md {\n color: var(--hm-text);\n font-size: var(--hm-font-size-sm);\n line-height: var(--hm-line-height-normal);\n overflow-wrap: anywhere;\n }\n .spine-md > :first-child { margin-block-start: 0; }\n .spine-md > :last-child { margin-block-end: 0; }\n .spine-md :is(h1, h2, h3, h4, h5, h6) {\n margin-block: var(--hm-space-lg) var(--hm-space-sm);\n color: var(--hm-text);\n font-weight: var(--hm-font-weight-semibold);\n line-height: var(--hm-line-height-snug);\n }\n .spine-md h1 { font-size: var(--hm-font-size-xxl); }\n .spine-md h2 { font-size: var(--hm-font-size-xl); }\n .spine-md h3 { font-size: var(--hm-font-size-lg); }\n .spine-md :is(h4, h5, h6) { font-size: var(--hm-font-size-md); }\n .spine-md :is(p, ul, ol, blockquote, pre, table) { margin-block: 0 var(--hm-space-md); }\n .spine-md :is(ul, ol) { padding-inline-start: var(--hm-space-lg); }\n .spine-md li + li { margin-block-start: var(--hm-space-micro); }\n .spine-md blockquote {\n margin-inline: 0;\n padding-inline-start: var(--hm-space-md);\n border-inline-start: var(--hm-border-thin) solid var(--hm-divider);\n color: var(--hm-muted);\n }\n .spine-md code {\n padding-inline: var(--hm-space-micro);\n border-radius: var(--hm-radius-micro);\n background: var(--hm-surface-raised);\n font-family: var(--hm-font-mono);\n font-size: var(--hm-font-size-xs);\n }\n .spine-md pre {\n padding: var(--hm-space-sm) var(--hm-space-md);\n border-radius: var(--hm-radius);\n background: var(--hm-surface-raised);\n white-space: pre-wrap;\n }\n .spine-md pre code { padding: 0; background: none; }\n .spine-md table {\n display: block;\n max-inline-size: 100%;\n overflow-x: auto;\n border-collapse: collapse;\n overflow-wrap: normal;\n }\n .spine-md :is(th, td) {\n padding: var(--hm-space-xs) var(--hm-space-sm);\n border: var(--hm-border-hairline) solid var(--hm-divider);\n text-align: start;\n vertical-align: top;\n }\n .spine-md th { background: var(--hm-surface-raised); font-weight: var(--hm-font-weight-semibold); }\n .spine-md hr {\n margin-block: var(--hm-space-lg);\n border: 0;\n border-block-start: var(--hm-border-hairline) solid var(--hm-divider);\n }\n .spine-md a {\n color: var(--hm-accent);\n text-decoration: underline;\n text-underline-offset: 0.2em;\n }\n .spine-md a:focus-visible {\n outline: var(--hm-border-thin) solid var(--hm-accent);\n outline-offset: var(--hm-border-hairline);\n border-radius: var(--hm-radius-micro);\n }\n .spine-md img { max-inline-size: 100%; block-size: auto; }\n `,\n})\nexport class SpineMarkdownComponent {\n /** Markdown cru. Vazio não desenha nada. */\n readonly content = input('');\n\n readonly #sanitizer = inject(DomSanitizer);\n\n protected readonly html = computed<SafeHtml | null>(() => {\n const source = this.content();\n // Sem DOM (SSR) o DOMPurify não limpa nada; melhor não renderizar.\n if (!source || !DOMPurify.isSupported) return null;\n const clean = DOMPurify.sanitize(parser.parse(source) as string);\n return this.#sanitizer.bypassSecurityTrustHtml(clean);\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport {\n AlertComponent,\n ModalComponent,\n SegmentedControlComponent,\n SegmentedOption,\n SkeletonComponent,\n} from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { DocsEntry, DocsGroup, DocsView, SpineDocsService } from './docs.service';\nimport { SpineMarkdownComponent } from './markdown.component';\n\nlet sequence = 0;\n\n/** Compara sem acento e sem caixa. */\nfunction fold(text: string): string {\n return text.normalize('NFD').replace(/\\p{M}/gu, '').toLowerCase();\n}\n\n/**\n * Modal de documentação das telas: índice (com busca) à esquerda e leitura à direita. Montado uma vez\n * pelo `spine-layout`; abrir, fechar e o que se lê vêm todos do `SpineDocsService`.\n */\n@Component({\n selector: 'spine-docs',\n imports: [ModalComponent, AlertComponent, SkeletonComponent, SegmentedControlComponent, SpineMarkdownComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (docs.isOpen()) {\n <hm-modal [heading]=\"text.docs.heading\" size=\"large\" [open]=\"true\" (closed)=\"docs.close()\">\n <div class=\"layout\">\n <nav class=\"index\" [attr.aria-label]=\"text.docs.index\">\n <input\n class=\"filter\"\n type=\"search\"\n [placeholder]=\"text.docs.search\"\n [attr.aria-label]=\"text.docs.search\"\n [value]=\"query()\"\n (input)=\"query.set($any($event.target).value)\"\n />\n @for (group of filtered(); track group.title; let g = $index) {\n <p class=\"group-title\" [id]=\"groupId + g\">{{ group.title }}</p>\n <ul class=\"entries\" [attr.aria-labelledby]=\"groupId + g\">\n @for (entry of group.entries; track entry.id) {\n <li>\n <button\n type=\"button\"\n class=\"entry\"\n [class.entry--active]=\"entry.id === docs.current()?.id\"\n [attr.aria-current]=\"entry.id === docs.current()?.id ? 'true' : null\"\n (click)=\"select(entry)\"\n >\n {{ entry.title }}\n </button>\n </li>\n }\n </ul>\n } @empty {\n <p class=\"note\">{{ query().trim() ? text.docs.noMatch : text.docs.empty }}</p>\n }\n </nav>\n\n <section class=\"reader\">\n @if (docs.current(); as entry) {\n <h3 class=\"reader-title\">{{ entry.title }}</h3>\n @if (docs.showTechnical()) {\n <hm-segmented-control\n [label]=\"text.docs.view\"\n [options]=\"viewOptions()\"\n [value]=\"docs.view()\"\n (valueChange)=\"switchView($event)\"\n />\n }\n <!-- A chave muda com o documento ou a visão: o bloco é recriado e entra de novo. -->\n @for (key of readingKey(); track key) {\n <div class=\"reading\">\n @if (docs.loading()) {\n <hm-skeleton shape=\"text\" [count]=\"6\" [label]=\"text.docs.loading\" />\n } @else if (docs.error()) {\n <hm-alert variant=\"error\">{{ docs.error() }}</hm-alert>\n } @else {\n <spine-markdown [content]=\"docs.content()\" />\n }\n </div>\n }\n } @else {\n <p class=\"note\">{{ text.docs.invite }}</p>\n }\n </section>\n </div>\n </hm-modal>\n }\n `,\n styles: `\n .layout {\n display: grid;\n grid-template-columns: minmax(12rem, 16rem) minmax(0, 1fr);\n gap: var(--hm-space-lg);\n block-size: min(70vh, 48rem);\n min-block-size: 0;\n }\n .index,\n .reader {\n min-block-size: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n }\n .index {\n display: flex;\n flex-direction: column;\n gap: var(--hm-space-xs);\n padding-inline-end: var(--hm-space-md);\n border-inline-end: var(--hm-border-hairline) solid var(--hm-divider);\n }\n .filter {\n box-sizing: border-box;\n inline-size: 100%;\n min-block-size: var(--hm-control-height);\n margin-block-end: var(--hm-space-sm);\n padding-inline: var(--hm-space-sm);\n border: var(--hm-border-hairline) solid var(--hm-border);\n border-radius: var(--hm-radius-control);\n background: var(--hm-surface-raised);\n color: var(--hm-text);\n font: inherit;\n font-size: var(--hm-font-size-sm);\n }\n .filter::placeholder { color: var(--hm-placeholder); }\n .filter:focus-visible {\n outline: var(--hm-border-thin) solid var(--hm-accent);\n outline-offset: var(--hm-border-hairline);\n }\n .group-title {\n margin: var(--hm-space-sm) 0 0;\n color: var(--hm-muted);\n font-size: var(--hm-font-size-xs);\n font-weight: var(--hm-font-weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n .entries {\n display: flex;\n flex-direction: column;\n gap: var(--hm-space-micro);\n margin: 0;\n padding: 0;\n list-style: none;\n }\n .entry {\n inline-size: 100%;\n padding: var(--hm-space-xs) var(--hm-space-sm);\n border: var(--hm-border-hairline) solid transparent;\n border-radius: var(--hm-radius-control);\n background: transparent;\n color: var(--hm-text);\n font: inherit;\n font-size: var(--hm-font-size-sm);\n text-align: start;\n cursor: pointer;\n transition: background-color var(--hm-duration-quick) var(--hm-ease);\n }\n .entry:hover { background: var(--hm-hover); }\n .entry:focus-visible {\n outline: var(--hm-border-thin) solid var(--hm-accent);\n outline-offset: calc(var(--hm-border-thin) * -1);\n }\n .entry--active {\n background: var(--hm-accent-subtle);\n color: var(--hm-accent-strong);\n font-weight: var(--hm-font-weight-semibold);\n }\n .reader {\n display: flex;\n flex-direction: column;\n gap: var(--hm-space-md);\n align-items: stretch;\n }\n .reader-title {\n margin: 0;\n color: var(--hm-text);\n font-size: var(--hm-font-size-lg);\n font-weight: var(--hm-font-weight-semibold);\n }\n .reading { animation: spine-docs-enter var(--hm-duration-standard) var(--hm-ease-decelerate); }\n .note {\n margin: 0;\n color: var(--hm-muted);\n font-size: var(--hm-font-size-sm);\n }\n @keyframes spine-docs-enter {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @media (max-width: 767px) {\n .layout {\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: minmax(0, 2fr) minmax(0, 3fr);\n }\n .index {\n padding-inline-end: 0;\n padding-block-end: var(--hm-space-md);\n border-inline-end: 0;\n border-block-end: var(--hm-border-hairline) solid var(--hm-divider);\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .reading { animation: none; }\n .entry { transition: none; }\n }\n @media (forced-colors: active) {\n .entry--active { border-color: Highlight; }\n }\n `,\n})\nexport class SpineDocsComponent {\n protected readonly docs = inject(SpineDocsService);\n protected readonly text = inject(SPINE_MESSAGES);\n protected readonly query = signal('');\n protected readonly groupId = `spine-docs-group-${++sequence}-`;\n\n protected readonly viewOptions = computed<SegmentedOption<DocsView>[]>(() => [\n { value: 'usage', label: this.text.docs.usage },\n { value: 'technical', label: this.text.docs.technical },\n ]);\n\n protected readonly filtered = computed<DocsGroup[]>(() => {\n const needle = fold(this.query().trim());\n const groups = this.docs.index();\n if (!needle) return groups;\n return groups\n .map((group) => ({\n title: group.title,\n entries: group.entries.filter((entry) => fold(`${entry.title} ${group.title}`).includes(needle)),\n }))\n .filter((group) => group.entries.length > 0);\n });\n\n protected readonly readingKey = computed(() => [`${this.docs.current()?.id ?? ''}:${this.docs.view()}`]);\n\n protected select(entry: DocsEntry): void {\n void this.docs.open(entry);\n }\n\n protected switchView(view: string): void {\n void this.docs.show(view === 'technical' ? 'technical' : 'usage');\n }\n}\n\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { Router } from '@angular/router';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { AlertComponent, ButtonComponent } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\n/**\n * Aviso discreto de conexão no topo do shell, sobre o `connectionState$` e o `reauthorizationRequired$` do\n * `@orfeu/angular`. A sessão nunca cai por nada disto (sem rede, Argos fora do ar, refresh recusado):\n * a lib segue tentando sozinha e este banner só conta o que está acontecendo.\n *\n * - `offline`: aviso (`warning`) — Argos inalcançável; a lib tenta de novo com backoff e na volta da rede/foco.\n * - `reconnecting` / `reauthorizing`: informativo (`info`), some quando volta a `online`.\n * - `reauthorizationRequired$`: o Argos recusou a renovação e a reautorização automática não aconteceu\n * (desligada, outra aba cuidando ou proteção contra loop). Oferece \"Entrar novamente\", que chama\n * `authorize(urlAtual)` — o login volta para a mesma tela. Nunca chama `logout()`.\n *\n * `hm-alert` em `appearance=\"banner\"` e `size=\"small\"`: faixa de largura total, sem cantos, com os tokens\n * de status do Hermes (`--hm-warning-*`/`--hm-info-*`); `role=\"status\"` (não interrompe o leitor de tela).\n */\n@Component({\n selector: 'spine-connection-banner',\n imports: [AlertComponent, ButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @switch (notice()) {\n @case ('reauthorizationRequired') {\n <hm-alert appearance=\"banner\" size=\"small\" variant=\"warning\">\n {{ text.reauthorizationRequired }}\n <hm-button actions emphasis=\"medium\" size=\"small\" icon=\"login\" (clicked)=\"signInAgain()\">{{ text.signInAgain }}</hm-button>\n </hm-alert>\n }\n @case ('offline') {\n <hm-alert appearance=\"banner\" size=\"small\" variant=\"warning\">{{ text.offline }}</hm-alert>\n }\n @case ('reconnecting') {\n <hm-alert appearance=\"banner\" size=\"small\" variant=\"info\">{{ text.reconnecting }}</hm-alert>\n }\n @case ('reauthorizing') {\n <hm-alert appearance=\"banner\" size=\"small\" variant=\"info\">{{ text.reauthorizing }}</hm-alert>\n }\n }\n `,\n styles: [`:host { display: block; flex: none; }`],\n})\nexport class SpineConnectionBannerComponent {\n protected readonly text = inject(SPINE_MESSAGES).session;\n private readonly auth = inject(AuthorizationService);\n private readonly router = inject(Router);\n\n private readonly state = toSignal(this.auth.connectionState$, { initialValue: this.auth.connectionState });\n private readonly reauthRequired = toSignal(this.auth.reauthorizationRequired$, {\n initialValue: this.auth.reauthorizationRequired,\n });\n\n /** O que mostrar: a decisão pendente da pessoa vence o estado da conexão; `online` não mostra nada. */\n protected readonly notice = computed(() => (this.reauthRequired() ? 'reauthorizationRequired' : this.state()));\n\n protected signInAgain(): void {\n void this.auth.authorize(this.router.url);\n }\n}\n","import { Component, OnInit, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { NavigationEnd, Router, RouterOutlet } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { WorkspaceComponent } from '@trismegisto/angular';\nimport { ModalComponent } from '@trismegisto/spine/modal';\nimport { NotificationComponent } from '@trismegisto/spine/notification';\nimport { SidePanelComponent } from '@trismegisto/spine/side-panel';\nimport { ThemeService, SpinePreferencesService } from '@trismegisto/spine';\nimport { HeaderComponent } from './header/header.component';\nimport { SidebarComponent } from './sidebar/sidebar.component';\nimport { OnboardingOverlayComponent } from './onboarding/onboarding-overlay.component';\nimport { OnboardingService } from './onboarding/onboarding.service';\nimport { SpineNewsComponent } from './news/news.component';\nimport { SpineNewsService } from './news/news.service';\nimport { ShortcutsCheatsheetComponent } from './shortcuts/shortcuts-cheatsheet.component';\nimport { SettingsPanelComponent } from './settings/settings-panel.component';\nimport { SpineSettingsService } from './settings/settings.service';\nimport { ShortcutService } from './shortcuts/shortcut.service';\nimport { SpineWorkspaceNavService } from './workspace/spine-workspace-nav.service';\nimport { SpinePagePanelComponent } from './workspace/spine-page-panel.component';\nimport { PanelLocalLinkDirective } from './workspace/panel-local-link.directive';\nimport { SpineDocsComponent } from './docs/docs-modal.component';\nimport { SpineConnectionBannerComponent } from './connection/connection-banner.component';\n\n/**\n * Shell do spine — MESMA estrutura do `docs/website`'s `app.component.html`/`.scss` (decisão de\n * 2026-09-28, ver `hefesto-migration-plan.md`): `.shell` com altura de viewport de verdade\n * (`100dvh`, não `%` cascateado — `@trismegisto/core` não fixa altura de `html`/`body`, é\n * responsabilidade de quem consome, mesmo tanto quanto o docs faz no próprio `styles.scss`),\n * `hm-header` (utilitários — tema/densidade/apps/perfil, nunca navegação de página) + `.body`\n * (`hm-sidebar` fixa + `.main` com `hm-workspace`). **Sem barra de breadcrumb própria** — isso\n * era resíduo do spine antigo (`spine-navigation`), removido: o docs não tem uma, a navegação\n * inteira mora na sidebar. Entre o header e o corpo fica o `spine-connection-banner` (aviso de conexão\n * do `@orfeu/angular`, vazio quando `online`).\n *\n * O `<router-outlet>` que sobra aqui é só pra `/no-permission` (a única rota do shell com\n * `component` de verdade — o resto da árvore do backend nunca passa pelo `Router` pra renderizar,\n * só pra `ViewGuard` confirmar que a URL resolve). Fica sempre montado (nunca dentro de um `@if`)\n * e escondido via `[hidden]` quando não é a rota ativa — destruir/recriar o outlet num `@if`\n * arriscaria perder a ativação da rota se a navegação e a checagem de `isNoPermission` não\n * corressem na mesma volta de detecção de mudanças.\n */\n@Component({\n selector: 'spine-layout',\n imports: [\n SpineNewsComponent,\n SpineDocsComponent,\n HeaderComponent,\n SidebarComponent,\n SpineConnectionBannerComponent,\n SpinePagePanelComponent,\n PanelLocalLinkDirective,\n WorkspaceComponent,\n RouterOutlet,\n ModalComponent,\n NotificationComponent,\n SidePanelComponent,\n OnboardingOverlayComponent,\n ShortcutsCheatsheetComponent,\n SettingsPanelComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"shell\">\n <spine-header></spine-header>\n <!-- Aviso de conexão do @orfeu/angular (offline/reconectando/reautorizando): faixa entre o header e o corpo. -->\n <spine-connection-banner />\n <div class=\"body\">\n @if (!isNoPermission) {\n <spine-sidebar class=\"sidebar\" data-tour=\"nav\"></spine-sidebar>\n }\n <div class=\"main\" role=\"main\">\n <div [hidden]=\"isNoPermission\" class=\"workspace-area\">\n <hm-workspace data-tour=\"tabs\" [keepAlive]=\"true\" [providedStore]=\"workspace.store\" (newTabRequested)=\"workspace.openNewTab($event)\">\n <ng-template #content let-tab let-panelId=\"panelId\" let-active=\"active\">\n <div\n class=\"panel-content\"\n [appPanelLocalLink]=\"panelId !== workspace.focusedPanelId()\"\n (localNavigate)=\"onLocalNavigate(panelId, $event)\"\n >\n <spine-page-panel [url]=\"tab.id\" [isFocusedPanel]=\"active && panelId === workspace.focusedPanelId()\" />\n </div>\n </ng-template>\n </hm-workspace>\n </div>\n <router-outlet></router-outlet>\n </div>\n </div>\n </div>\n <spine-notification></spine-notification>\n <spine-side-panel />\n <spine-modal />\n <spine-shortcuts-cheatsheet></spine-shortcuts-cheatsheet>\n <spine-settings-panel></spine-settings-panel>\n <spine-docs />\n <spine-news />\n <spine-onboarding-overlay></spine-onboarding-overlay>\n `,\n styles: [`\n :host { display: block; }\n .shell { display: flex; flex-direction: column; height: 100vh; height: 100dvh; background: var(--hm-surface); color: var(--hm-text); }\n .body { position: relative; display: flex; flex: 1; min-height: 0; overflow: hidden; }\n .main { display: flex; flex: 1; min-width: 0; flex-direction: column; }\n /* Abaixo da barra de abas vem a barra de contexto (spine-page-bar, tom elevado), não a folha da\n página: a aba ativa toma o tom dela — o encosto que emenda aba e barra — e a faixa das abas\n inativas fica no outro tom. Só aqui: o padrão do DS (aba ativa = tom da folha) continua valendo\n para quem usa o hm-workspace com o conteúdo direto embaixo. */\n .workspace-area {\n flex: 1; min-height: 0; display: flex; flex-direction: column;\n --hm-tab-strip-bg: var(--hm-surface);\n --hm-tab-active-bg: var(--hm-surface-raised);\n }\n hm-workspace { flex: 1; min-height: 0; }\n /* Sem padding aqui: a barra de contexto (spine-page-bar) ocupa a largura toda do painel; o respiro\n do conteúdo da página é do .spine-page-panel__content (ver spine-page-panel.component.ts). */\n .panel-content { display: flex; flex-direction: column; height: 100%; min-height: 0; }\n `],\n})\nexport class LayoutComponent implements OnInit {\n /** Aplica no boot o idioma e o fuso que a pessoa escolheu nas configurações. */\n private readonly preferences = inject(SpinePreferencesService);\n protected readonly workspace = inject(SpineWorkspaceNavService);\n private readonly settings = inject(SpineSettingsService);\n\n /** Esconde sidebar e área de trabalho quando a rota ATIVA (do Router real, ver\n * `router.events` abaixo) é a de sem-permissão — nesse caso não existe menu/página válido\n * como contexto. Note que isto reflete só a URL do painel FOCADO (dona do Router real); um\n * painel secundário navegando localmente pra `/no-permission` não passa por aqui — cenário raro\n * o bastante (sem-permissão normalmente bloqueia o app inteiro, não uma aba) pra não justificar\n * mais complexidade agora. */\n public isNoPermission: boolean;\n\n constructor(\n private router: Router,\n private theme: ThemeService,\n private auth: AuthorizationService,\n private shortcuts: ShortcutService,\n private onboarding: OnboardingService,\n private news: SpineNewsService,\n ) {\n this.isNoPermission = this.matchesNoPermission(this.router.url);\n this.router.events.pipe(filter((e): e is NavigationEnd => e instanceof NavigationEnd))\n .subscribe(e => { this.isNoPermission = this.matchesNoPermission(e.urlAfterRedirects); });\n }\n\n private matchesNoPermission(url: string): boolean {\n return url.split(/[?#]/)[0] === '/no-permission';\n }\n\n ngOnInit(): void {\n // Liga os atalhos de teclado globais às ações reais do sistema.\n this.shortcuts.setActions({\n navigate: (url) => this.router.navigateByUrl(url),\n toggleTheme: () => this.theme.setTheme(this.theme.current === 'light' ? 'dark' : 'light'),\n toggleFullscreen: () => this.toggleFullscreen(),\n logout: () => this.auth.logout(),\n openSettings: () => this.settings.toggle(),\n });\n\n // Link direto pra uma seção do painel de configurações: `?settings=aparencia` (ou só\n // `?settings`). Tira o parâmetro da URL depois de abrir — senão ele volta a abrir o painel a\n // cada F5 e acompanha a URL copiada pra outra pessoa.\n const params = new URLSearchParams(window.location.search);\n if (params.has('settings')) {\n this.settings.open(params.get('settings') ?? '');\n void this.router.navigate([], { queryParams: { settings: null }, queryParamsHandling: 'merge', replaceUrl: true });\n }\n\n // Onboarding interativo na primeira entrada nesta máquina.\n this.onboarding.maybeStart();\n // Novidades do app (provideSpineNews): abrem sozinhas uma vez, depois do tour.\n this.news.scheduleOnEntry();\n }\n\n protected onLocalNavigate(panelId: string, href: string): void {\n this.workspace.navigateLocally(panelId, href);\n }\n\n private toggleFullscreen(): void {\n if (!document.fullscreenElement) {\n document.documentElement.requestFullscreen?.().catch(() => { /* bloqueado pelo navegador */ });\n } else {\n document.exitFullscreen?.();\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i7","HermesHeaderComponent","HermesSidebarComponent","i1.OnboardingService","i1","i2","i3","i4.ShortcutService","i5.OnboardingService","i6.SpineNewsService","ModalComponent"],"mappings":"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"}