@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,1054 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { OnDestroy, OnInit, ElementRef, InjectionToken, Type, Provider } from '@angular/core';
3
+ import { Router } from '@angular/router';
4
+ import * as _orfeu_angular_core from '@orfeu/angular/core';
5
+ import { AuthorizationService, ViewService, UserProfile, AppDef, RealmAppsService } from '@orfeu/angular/core';
6
+ import * as _trismegisto_spine from '@trismegisto/spine';
7
+ import { SpineConfig, SpineNewsSlide, Route, ThemeService, ThemePresetService, DensityService, SpinePreferencesService } from '@trismegisto/spine';
8
+ import { BehaviorSubject, Subject } from 'rxjs';
9
+ import * as _trismegisto_angular from '@trismegisto/angular';
10
+ import { HermesShortcutItem, WorkspaceStore, TabItem, MenuItem, SidebarNode, HermesSidebarService, SegmentedOption, HermesThemeMode, HermesDensity, ComboboxOption } from '@trismegisto/angular';
11
+ import * as _trismegisto_primitives from '@trismegisto/primitives';
12
+ import { formatMessage, HermesFont } from '@trismegisto/primitives';
13
+ import * as _trismegisto_tokens from '@trismegisto/tokens';
14
+ import * as _trismegisto_spine_layout from '@trismegisto/spine/layout';
15
+ import { RouteDocument } from '@trismegisto/spine/routing';
16
+ import { SafeHtml } from '@angular/platform-browser';
17
+
18
+ interface OnboardingStep {
19
+ /** seletor CSS do alvo; ausente = passo centralizado (boas-vindas/encerramento). */
20
+ target?: string;
21
+ title: string;
22
+ /** pode conter HTML simples (<b>). */
23
+ description: string;
24
+ }
25
+ /**
26
+ * Primeiro elemento do seletor que está de fato na tela (tem tamanho e conteúdo). Não usa
27
+ * `offsetParent`: ele é `null` pra `position: fixed` (a sidebar) e pra `display: contents`, e o
28
+ * passo sumia do tour mesmo com o alvo visível. Com as abas vivas do workspace há uma barra de
29
+ * página por aba — só a da aba ativa tem tamanho, e é ela que o holofote precisa achar.
30
+ */
31
+ declare function findTourTarget(selector: string): HTMLElement | null;
32
+ /**
33
+ * Onboarding interativo próprio (sem dependência externa). O overlay/holofote e o
34
+ * balão são renderizados pelo OnboardingOverlayComponent, que escuta este serviço.
35
+ * Aparece uma vez por máquina (flag em localStorage), namespaced por cliente.
36
+ */
37
+ declare class OnboardingService {
38
+ private readonly text;
39
+ /** Passo atual (null = tour inativo). O overlay component reage a isto. */
40
+ readonly current$: BehaviorSubject<{
41
+ step: OnboardingStep;
42
+ index: number;
43
+ total: number;
44
+ } | null>;
45
+ private readonly doneKey;
46
+ private steps;
47
+ private index;
48
+ private waiting;
49
+ constructor(config: SpineConfig | null);
50
+ private get done();
51
+ private markDone;
52
+ /** Dispara o tour só se ainda não foi visto nesta máquina. Chamar após o login. */
53
+ maybeStart(): void;
54
+ /** Reabre o tour manualmente (menu Ajuda), ignorando a flag. */
55
+ restart(): void;
56
+ /** Passos no idioma ativo (o texto é lido do catálogo ao começar o tour). Descrições com `<b>`. */
57
+ private allSteps;
58
+ /**
59
+ * Começa do primeiro passo assim que todos os alvos estão na tela, ou no fim do prazo só com os passos
60
+ * que têm alvo visível (e os sem alvo). Sem nenhum passo, só marca como visto. Não bloqueia: confere
61
+ * de novo a cada `TARGET_POLL_MS`.
62
+ */
63
+ private start;
64
+ private emit;
65
+ next(): void;
66
+ prev(): void;
67
+ /** Encerra o tour (concluído ou pulado) e marca como visto. */
68
+ finish(): void;
69
+ get isFirst(): boolean;
70
+ get isLast(): boolean;
71
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<OnboardingService, [{ optional: true; }]>;
72
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<OnboardingService>;
73
+ }
74
+
75
+ /**
76
+ * Painel de novidades do app (ver `provideSpineNews`). Decide o que está devido — ainda não visto
77
+ * NESTE navegador e ainda dentro do `until` — e abre sozinho uma vez, depois do tour de boas-vindas.
78
+ * O "já visto" é por app (`hermes_<clientId>_news_seen`): novidade de um app não some por ter sido
79
+ * vista em outro no mesmo domínio.
80
+ */
81
+ declare class SpineNewsService {
82
+ private readonly onboarding;
83
+ private readonly items;
84
+ private readonly seenKey;
85
+ /** Slides em exibição (os devidos, ou todos os vigentes quando reaberto pelo menu). */
86
+ readonly slides: _angular_core.WritableSignal<readonly SpineNewsSlide[]>;
87
+ readonly isOpen: _angular_core.WritableSignal<boolean>;
88
+ /** Há alguma novidade vigente — o item "Novidades" do menu só aparece com isto. */
89
+ readonly hasAny: _angular_core.Signal<boolean>;
90
+ constructor();
91
+ /** Chamado uma vez pelo layout na entrada: abre as devidas, esperando o tour terminar. */
92
+ scheduleOnEntry(): void;
93
+ /** Marca como vistas todas as novidades devidas e as abre num único painel. */
94
+ showDue(): void;
95
+ /** Reabre todas as vigentes (menu do perfil), vistas ou não. */
96
+ showAll(): void;
97
+ close(): void;
98
+ private open;
99
+ /** Vigentes: sem `until`, ou com `until` ainda não passado (comparação por data, AAAA-MM-DD). */
100
+ private current;
101
+ private due;
102
+ private readSeen;
103
+ private markSeen;
104
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SpineNewsService, never>;
105
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<SpineNewsService>;
106
+ }
107
+
108
+ /** Grupo do painel de atalhos. Id estável; o nome exibido vem do catálogo da lib (`shortcuts.groups`). */
109
+ type ShortcutGroupId = 'navigation' | 'actions' | 'general';
110
+ /** Item exibido no painel de atalhos (cheatsheet, aberto com "?"). */
111
+ interface ShortcutItem {
112
+ /** Teclas já em texto, na plataforma atual (`'Ctrl + K'`, `'⌘K'`, `'G depois H'`). */
113
+ keys: string;
114
+ description: string;
115
+ group: ShortcutGroupId;
116
+ }
117
+ /** Atalhos agrupados, já com o nome do grupo no idioma ativo. */
118
+ interface ShortcutGroup {
119
+ id: ShortcutGroupId;
120
+ name: string;
121
+ items: ShortcutItem[];
122
+ }
123
+ /** Ações concretas que o atalho dispara — ligadas pelo LayoutComponent. */
124
+ interface ShortcutActions {
125
+ navigate?: (url: string) => void;
126
+ toggleTheme?: () => void;
127
+ toggleFullscreen?: () => void;
128
+ logout?: () => void;
129
+ openSettings?: () => void;
130
+ }
131
+ /**
132
+ * Atalhos de teclado globais do sistema, sobre o `HermesShortcutService` da lib (um listener só,
133
+ * sequência `G H`, conflito, campo editável, interruptor de tecla única da WCAG 2.1.4).
134
+ *
135
+ * `setActions` registra os atalhos do shell: `G H` (Home), `G 1`…`G 9` (favoritos), `Mod+,`
136
+ * (configurações), `Mod+.` (tema), `Mod+Shift+F` (tela cheia), `Mod+Shift+L` (sair) e `?` (painel
137
+ * de atalhos, via `help$`). Os combos com `Mod` valem também com o foco num campo; `G …` e `?`, não.
138
+ *
139
+ * O painel (`spine-shortcuts-cheatsheet` e a seção Atalhos das configurações) usa o
140
+ * `hm-shortcut-list` com `panelItems()`: tudo o que está registrado no `HermesShortcutService`
141
+ * (inclusive o que o app liga com `[hmShortcut]`) mais o que o spine só exibe e outra peça dispara
142
+ * (`Mod+K` do `hm-header`, `Alt+←/→` do navegador, `Esc` dos diálogos).
143
+ */
144
+ declare class ShortcutService implements OnDestroy {
145
+ private actions;
146
+ private removers;
147
+ private readonly favKey;
148
+ private readonly hermes;
149
+ private readonly lib;
150
+ private readonly text;
151
+ /** Emite quando o usuário pede o painel de atalhos (tecla "?" ou menu do perfil). */
152
+ readonly help$: Subject<void>;
153
+ /** Teclas (referência) → descrição viva, para o painel acompanhar a troca de idioma. */
154
+ private readonly own;
155
+ /** Os atalhos do shell. `describe` lê o catálogo na hora (o idioma pode mudar depois do registro). */
156
+ private definitions;
157
+ /** Só exibidos: quem dispara é outra peça (hm-header, navegador, diálogos). */
158
+ private displayOnly;
159
+ /**
160
+ * O que o painel lista (`<hm-shortcut-list [registered]="false" [items]="panelItems()">`): os
161
+ * atalhos registrados no `HermesShortcutService`, com os favoritos numa linha só, e os só exibidos.
162
+ * Acompanha registro/remoção e a troca de idioma do catálogo da lib.
163
+ */
164
+ readonly panelItems: _angular_core.Signal<readonly HermesShortcutItem[]>;
165
+ /**
166
+ * Lista do painel em texto, no idioma e na plataforma atuais.
167
+ * @deprecated Use o `hm-shortcut-list` com `panelItems()` (ou `HermesShortcutService.list()`).
168
+ * Mantido para quem montava o próprio painel; sai numa próxima versão.
169
+ */
170
+ get shortcuts(): ShortcutItem[];
171
+ /**
172
+ * Atalhos por grupo, na ordem navegação → ações → geral, com o nome do grupo traduzido.
173
+ * @deprecated Use o `hm-shortcut-list` (agrupa, traduz e desenha as teclas). Sai numa próxima versão.
174
+ */
175
+ groups(): ShortcutGroup[];
176
+ /** Liga as ações e registra os atalhos no `HermesShortcutService` (idempotente: chamadas seguintes só trocam as ações). */
177
+ setActions(actions: ShortcutActions): void;
178
+ ngOnDestroy(): void;
179
+ /** Ação ausente devolve `false`: o evento segue sem `preventDefault` (o navegador faz o dele). */
180
+ private call;
181
+ private navigate;
182
+ /** Navega para o N-ésimo favorito (1-based) lido da store da navegação; N = o dígito do evento. */
183
+ private goToFavorite;
184
+ /** Texto corrido das teclas para a API antiga (`shortcuts`): "Ctrl + K", "G depois H", "… ou …". */
185
+ private keysText;
186
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShortcutService, never>;
187
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ShortcutService>;
188
+ }
189
+
190
+ /**
191
+ * Dono do `WorkspaceStore` do shell — mesmo padrão do `WorkspaceNavService` do docs/website
192
+ * (`packages/hermes-ui/docs/website/src/app/workspace-nav.service.ts`), adaptado pra ler a
193
+ * árvore de rotas do BACKEND (`ViewService.currentView`) em vez de um `page-registry.ts`
194
+ * estático. Cada página visitada vira uma aba, pertencente a um painel; a navegação real do
195
+ * `Router` (routerLink, busca, sidebar) sempre atualiza a aba ativa do painel FOCADO.
196
+ */
197
+ declare class SpineWorkspaceNavService {
198
+ private readonly router;
199
+ private readonly viewService;
200
+ readonly store: WorkspaceStore;
201
+ private readonly state;
202
+ readonly root: _angular_core.Signal<_trismegisto_primitives.PanelNode>;
203
+ readonly focusedPanelId: _angular_core.Signal<string>;
204
+ /** Cadeia resolvida (header→…→page) da aba ativa do painel FOCADO — é o que `spine-sidebar`
205
+ * (menu) e `spine-navigation` (breadcrumb) leem pra saber "onde estamos", no lugar do antigo
206
+ * `viewService.logControl$`/`breadCrumb$` globais (que só existiam porque havia uma página
207
+ * "atual" só; agora cada painel tem a sua). */
208
+ readonly focusedChain: _angular_core.Signal<Route[] | null>;
209
+ private lastKnownPath;
210
+ constructor();
211
+ /** Resolve a cadeia de rotas pra uma URL, direto na view atual — sem `Router`, sem `async`
212
+ * (o componente da folha só é carregado por quem for de fato desenhar o painel). Desce sozinho
213
+ * por nós organizacionais (com filhos, sem conteúdo próprio) — o rótulo/ícone da aba e o que a
214
+ * sidebar/breadcrumb mostram refletem o destino DE VERDADE, não a rota-container clicada. */
215
+ private chainFor;
216
+ tabFor(url: string): TabItem;
217
+ /** O `+` de um painel: abre a home ali, como um navegador. */
218
+ openNewTab(panelId: string): void;
219
+ /** Navegação LOCAL a um painel específico (usada pelo `PanelLocalLinkDirective`) — troca o
220
+ * ASSUNTO da aba ativa daquele painel, não empilha uma aba nova. */
221
+ navigateLocally(panelId: string, href: string): void;
222
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SpineWorkspaceNavService, never>;
223
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<SpineWorkspaceNavService>;
224
+ }
225
+
226
+ /**
227
+ * Shell do spine — MESMA estrutura do `docs/website`'s `app.component.html`/`.scss` (decisão de
228
+ * 2026-09-28, ver `hefesto-migration-plan.md`): `.shell` com altura de viewport de verdade
229
+ * (`100dvh`, não `%` cascateado — `@trismegisto/core` não fixa altura de `html`/`body`, é
230
+ * responsabilidade de quem consome, mesmo tanto quanto o docs faz no próprio `styles.scss`),
231
+ * `hm-header` (utilitários — tema/densidade/apps/perfil, nunca navegação de página) + `.body`
232
+ * (`hm-sidebar` fixa + `.main` com `hm-workspace`). **Sem barra de breadcrumb própria** — isso
233
+ * era resíduo do spine antigo (`spine-navigation`), removido: o docs não tem uma, a navegação
234
+ * inteira mora na sidebar. Entre o header e o corpo fica o `spine-connection-banner` (aviso de conexão
235
+ * do `@orfeu/angular`, vazio quando `online`).
236
+ *
237
+ * O `<router-outlet>` que sobra aqui é só pra `/no-permission` (a única rota do shell com
238
+ * `component` de verdade — o resto da árvore do backend nunca passa pelo `Router` pra renderizar,
239
+ * só pra `ViewGuard` confirmar que a URL resolve). Fica sempre montado (nunca dentro de um `@if`)
240
+ * e escondido via `[hidden]` quando não é a rota ativa — destruir/recriar o outlet num `@if`
241
+ * arriscaria perder a ativação da rota se a navegação e a checagem de `isNoPermission` não
242
+ * corressem na mesma volta de detecção de mudanças.
243
+ */
244
+ declare class LayoutComponent implements OnInit {
245
+ private router;
246
+ private theme;
247
+ private auth;
248
+ private shortcuts;
249
+ private onboarding;
250
+ private news;
251
+ /** Aplica no boot o idioma e o fuso que a pessoa escolheu nas configurações. */
252
+ private readonly preferences;
253
+ protected readonly workspace: SpineWorkspaceNavService;
254
+ private readonly settings;
255
+ /** Esconde sidebar e área de trabalho quando a rota ATIVA (do Router real, ver
256
+ * `router.events` abaixo) é a de sem-permissão — nesse caso não existe menu/página válido
257
+ * como contexto. Note que isto reflete só a URL do painel FOCADO (dona do Router real); um
258
+ * painel secundário navegando localmente pra `/no-permission` não passa por aqui — cenário raro
259
+ * o bastante (sem-permissão normalmente bloqueia o app inteiro, não uma aba) pra não justificar
260
+ * mais complexidade agora. */
261
+ isNoPermission: boolean;
262
+ constructor(router: Router, theme: ThemeService, auth: AuthorizationService, shortcuts: ShortcutService, onboarding: OnboardingService, news: SpineNewsService);
263
+ private matchesNoPermission;
264
+ ngOnInit(): void;
265
+ protected onLocalNavigate(panelId: string, href: string): void;
266
+ private toggleFullscreen;
267
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LayoutComponent, never>;
268
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LayoutComponent, "spine-layout", never, {}, {}, never, never, true, never>;
269
+ }
270
+
271
+ /** Item achatado da árvore de rotas, usado pela busca global (quick-launcher). */
272
+ interface QuickItem {
273
+ name: string;
274
+ icon: string;
275
+ redirect: string;
276
+ path: string;
277
+ }
278
+ declare class HeaderComponent implements OnInit {
279
+ private authService;
280
+ protected themeService: ThemeService;
281
+ protected themePresetService: ThemePresetService;
282
+ protected densityService: DensityService;
283
+ private viewService;
284
+ private router;
285
+ private onboarding;
286
+ private shortcuts;
287
+ isFullscreen: boolean;
288
+ element: HTMLElement;
289
+ headerBlocked: boolean;
290
+ /** route_redirect da primeira rota navegável da view atual — usado pela marca do header.
291
+ * null quando a view não tem nenhuma rota (nesse caso a marca não é link). */
292
+ homeRoute: string | null;
293
+ /** Nome do app (SpineConfig.appName; padrão "Hermes") — quem desenha é o `spine-brand`. */
294
+ protected readonly appName: string;
295
+ private readonly injector;
296
+ protected readonly text: {
297
+ home: string;
298
+ apps: string;
299
+ themeDark: string;
300
+ themeLight: string;
301
+ densityComfortable: string;
302
+ densityCompact: string;
303
+ fullscreen: string;
304
+ exitFullscreen: string;
305
+ user: string;
306
+ accessLevels: string;
307
+ settings: string;
308
+ appearance: string;
309
+ shortcuts: string;
310
+ tour: string;
311
+ news: string;
312
+ logout: string;
313
+ search: string;
314
+ searchPlaceholder: string;
315
+ recentSearches: string;
316
+ clearRecent: string;
317
+ noResults: string;
318
+ };
319
+ protected readonly fmt: typeof formatMessage;
320
+ private readonly settings;
321
+ private readonly news;
322
+ private readonly recentSearchKey;
323
+ constructor(authService: AuthorizationService, themeService: ThemeService, themePresetService: ThemePresetService, densityService: DensityService, viewService: ViewService, router: Router, onboarding: OnboardingService, shortcuts: ShortcutService, config: SpineConfig | null);
324
+ ngOnInit(): Promise<void>;
325
+ updateView(data: any): void;
326
+ /** Primeira rota navegável (DFS), atravessando grupos "transparentes" sem route_redirect. */
327
+ private findFirstNavigable;
328
+ setTheme(theme: 'light' | 'dark'): void;
329
+ setDensity(): void;
330
+ get isCompactDensity(): boolean;
331
+ toggleFullscreen(): void;
332
+ get badge(): _orfeu_angular_core.Badge | null;
333
+ get badges(): _orfeu_angular_core.Badge[];
334
+ get profile(): UserProfile;
335
+ switchBadge(badgeTypeId: string): Promise<void>;
336
+ logout(): void;
337
+ /** Reabre o tour guiado de onboarding. */
338
+ startTour(): void;
339
+ /** Abre o painel de atalhos de teclado. */
340
+ openShortcuts(): void;
341
+ /** Menu do perfil: achatado (badges, se houver mais de um, + ações), já que `hm-menu`
342
+ * não tem submenu aninhado como o `hermes-dropdown` antigo tinha para a troca de crachá. */
343
+ get profileMenuItems(): MenuItem[];
344
+ onProfileMenuChosen(id: string): void;
345
+ quickBox?: ElementRef<HTMLElement>;
346
+ quickQuery: string;
347
+ quickOpen: boolean;
348
+ quickResults: QuickItem[];
349
+ quickActive: number;
350
+ private quickIndex;
351
+ /** Histórico de buscas (mostrado ao focar com o campo vazio). */
352
+ recentSearches: QuickItem[];
353
+ /** Verdadeiro quando o painel está exibindo o histórico (campo vazio). */
354
+ showingRecent: boolean;
355
+ /** Achata a árvore de rotas em itens navegáveis (com trilha de ancestrais). */
356
+ private flattenRoutes;
357
+ /** Chamado pelo `(searchRequested)` do `hm-header` (clique no campo ou `Ctrl K`, já tratado
358
+ * internamente por ele) — abre o modal de busca, mesmo padrão do `docs/website`
359
+ * (`openSearch()` em `app.component.ts`: `@if` monta o `hm-modal` só quando aberto). */
360
+ onSearchRequested(): void;
361
+ /** `(openChange)` do `hm-modal` — fecha ao clicar fora/Esc/botão de fechar. */
362
+ onQuickModalOpenChange(open: boolean): void;
363
+ onQuickSearch(): void;
364
+ quickGo(item: QuickItem): void;
365
+ quickMove(delta: number): void;
366
+ private readJson;
367
+ private loadRecent;
368
+ private pushRecent;
369
+ clearRecent(event?: Event): void;
370
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderComponent, [null, null, null, null, null, null, null, null, { optional: true; }]>;
371
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderComponent, "spine-header", never, {}, {}, never, never, true, never>;
372
+ }
373
+
374
+ /**
375
+ * A grade de apps não cabe no `MenuItem` de linha única do `hm-menu` (ícone grande + nome
376
+ * embaixo, em coluna) — em vez de forçar isso num componente pensado pra lista de ações, usa
377
+ * um popover próprio (mesmo padrão do backdrop-fecha-fora da busca global do header).
378
+ */
379
+ declare class AppLauncherComponent implements OnInit {
380
+ private authService;
381
+ private realmAppsService;
382
+ protected readonly text: {
383
+ home: string;
384
+ apps: string;
385
+ themeDark: string;
386
+ themeLight: string;
387
+ densityComfortable: string;
388
+ densityCompact: string;
389
+ fullscreen: string;
390
+ exitFullscreen: string;
391
+ user: string;
392
+ accessLevels: string;
393
+ settings: string;
394
+ appearance: string;
395
+ shortcuts: string;
396
+ tour: string;
397
+ news: string;
398
+ logout: string;
399
+ search: string;
400
+ searchPlaceholder: string;
401
+ recentSearches: string;
402
+ clearRecent: string;
403
+ noResults: string;
404
+ };
405
+ private readonly cdr;
406
+ apps: AppDef[];
407
+ loading: boolean;
408
+ open: boolean;
409
+ constructor(authService: AuthorizationService, realmAppsService: RealmAppsService);
410
+ ngOnInit(): Promise<void>;
411
+ toggle(): void;
412
+ close(): void;
413
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppLauncherComponent, never>;
414
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppLauncherComponent, "spine-app-launcher", never, {}, {}, never, never, true, never>;
415
+ }
416
+
417
+ /**
418
+ * Marca do header: logo do app (`SpineConfig.logo`, padrão `assets/images/logo.svg`) + `appName`, dentro
419
+ * de um link para a home. Ordem: componente de `SPINE_BRAND` > imagem > só o nome.
420
+ *
421
+ * - Tema escuro usa `logo.dark` quando houver; se ele falhar, volta para `logo.light`.
422
+ * - Imagem que não carrega (404/erro) some — nada de ícone quebrado — e o nome aparece mesmo com
423
+ * `showAppName: false`, para o link nunca ficar sem texto.
424
+ * - Texto alternativo: `logo.alt` se configurado; senão o `appName` quando o nome está escondido, e vazio
425
+ * (imagem decorativa) quando o nome já está ao lado — o leitor de tela não lê o nome duas vezes.
426
+ */
427
+ declare class SpineBrandComponent {
428
+ /** Rota da home (primeira rota navegável); `null` desenha a marca sem link. */
429
+ readonly homeRoute: _angular_core.InputSignal<string | null>;
430
+ /** Dica do link (ex.: "Página inicial"). */
431
+ readonly label: _angular_core.InputSignal<string>;
432
+ private readonly config;
433
+ private readonly theme;
434
+ protected readonly brand: _angular_core.Type<unknown> | null;
435
+ protected readonly appName: string;
436
+ private readonly sources;
437
+ private readonly showAppName;
438
+ /** Endereços que já deram erro nesta sessão do componente. */
439
+ private readonly failed;
440
+ /** Imagem a mostrar agora (tema atual, sem as que falharam); `null` = nenhuma. */
441
+ readonly src: _angular_core.Signal<string | null>;
442
+ readonly nameVisible: _angular_core.Signal<boolean>;
443
+ readonly alt: _angular_core.Signal<string>;
444
+ onError(src: string): void;
445
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SpineBrandComponent, never>;
446
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SpineBrandComponent, "spine-brand", never, { "homeRoute": { "alias": "homeRoute"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
447
+ }
448
+
449
+ /**
450
+ * Componente de marca que o header do shell desenha no lugar da imagem de `SpineConfig.logo` (tem
451
+ * prioridade sobre ela). Injeção em vez de projeção de conteúdo porque o `LayoutComponent` é montado
452
+ * pelo `Router`, não pelo template do app — não existe `<ng-content>` alcançável de fora. O componente
453
+ * fica dentro do link da marca (que leva à home): não ponha link nem botão nele, e se ele for só
454
+ * imagem, dê nome acessível ou deixe o `appName` visível (`showAppName`, padrão `true`).
455
+ * `null` (padrão) usa a imagem. Ex.: `{ provide: SPINE_BRAND, useValue: MarcaComponent }` no
456
+ * `app.config.ts`.
457
+ */
458
+ declare const SPINE_BRAND: InjectionToken<Type<unknown> | null>;
459
+
460
+ /**
461
+ * Menu lateral fixo — TODA a navegação do shell mora aqui agora, nunca no header (decisão
462
+ * explícita do usuário: "não deve ter ícones de navegação no menu superior, deve ter um menu
463
+ * lateral de navegação fixa" — o antigo `h-nav`/`hm-menu-button` de nível 'header'/'menu' do
464
+ * `header.component.html` foi removido, essa navegação virou `modules` abaixo).
465
+ *
466
+ * Dois níveis, um de cada vez — MESMO padrão de back/forward do `docs/website`'s sidebar (achado
467
+ * real, 2026-09-28: a primeira versão mostrava os dois SEMPRE juntos, empilhados, achando que o
468
+ * modelo de rotas do backend não permitia "sair" de um módulo — errado; nada impede mostrar só um
469
+ * nível por vez com um botão de voltar, é só um `signal` local):
470
+ * - `modules` (nível 1, 'header', de `ViewService.currentView` direto — não muda com a navegação
471
+ * do painel): a lista pra trocar de módulo.
472
+ * - `menus`: a cadeia resolvida da aba ativa do painel FOCADO
473
+ * (`SpineWorkspaceNavService.focusedChain`) — os itens do módulo ATUAL.
474
+ * `viewingModules` decide qual dos dois aparece; volta pra `false` sozinho sempre que o módulo
475
+ * atual muda (navegação real feita, mesma UX do `leaveModule()` do docs).
476
+ */
477
+ declare class SidebarComponent {
478
+ protected readonly text: {
479
+ modules: string;
480
+ moduleNavigation: string;
481
+ apps: string;
482
+ };
483
+ protected readonly fmt: typeof formatMessage;
484
+ private readonly workspace;
485
+ private readonly viewService;
486
+ private readonly authService;
487
+ private readonly realmApps;
488
+ /** Aplicações do realm (o app atual já vem excluído pelo backend) — exibidas só no mobile. */
489
+ protected readonly apps: _angular_core.WritableSignal<AppDef[]>;
490
+ private readonly currentView;
491
+ /** Sem nenhum crachá (nenhum grupo do app — ver `ViewGuard`, tela `/blocked`), o menu fica vazio
492
+ * mesmo que a view traga rotas públicas: listar o que leva de volta ao "Acesso bloqueado" não
493
+ * ajuda. `badges` não é sinal, mas a view sempre é refeita depois do token (`view.update`), e é
494
+ * ela que recalcula isto. */
495
+ protected readonly modules: _angular_core.Signal<SidebarNode[]>;
496
+ protected readonly currentModule: _angular_core.Signal<Route | null>;
497
+ /** Filhos diretos do módulo atual — sem filtrar por `route_type` (ver `toSidebarNode`). */
498
+ protected readonly menus: _angular_core.Signal<SidebarNode[]>;
499
+ /** Nem todo nível 1 é um "módulo" navegável — "Início"/"Monitoração" na árvore real são
500
+ * `route_type: 'page'` SEM filhos, folhas diretas (achado real, 2026-09-28: mostravam
501
+ * cabeçalho + botão voltar + área de conteúdo vazia, como se fossem módulos de verdade). Só
502
+ * entra no modo "dentro do módulo" quando há algo pra mostrar como submenu. */
503
+ protected readonly currentModuleHasChildren: _angular_core.Signal<boolean>;
504
+ /** `true` = mostrando a lista de módulos; `false` = mostrando o menu do módulo atual. Cai pra
505
+ * `true` sozinho quando o módulo atual não tem submenu nenhum — nesse caso não existe "dentro
506
+ * do módulo" pra mostrar. */
507
+ private readonly wantsModules;
508
+ protected readonly viewingModules: _angular_core.Signal<boolean>;
509
+ /** Sem teto artificial de nível de grupo — o template não enxerga o global `Infinity`, só
510
+ * membros da classe. Ver comentário no `.html`: o backend já limita a árvore sozinho. */
511
+ protected readonly maxDepth: number;
512
+ constructor();
513
+ protected showModules(): void;
514
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SidebarComponent, never>;
515
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SidebarComponent, "spine-sidebar", never, {}, {}, never, never, true, never>;
516
+ }
517
+
518
+ /**
519
+ * Aviso discreto de conexão no topo do shell, sobre o `connectionState$` e o `reauthorizationRequired$` do
520
+ * `@orfeu/angular`. A sessão nunca cai por nada disto (sem rede, Argos fora do ar, refresh recusado):
521
+ * a lib segue tentando sozinha e este banner só conta o que está acontecendo.
522
+ *
523
+ * - `offline`: aviso (`warning`) — Argos inalcançável; a lib tenta de novo com backoff e na volta da rede/foco.
524
+ * - `reconnecting` / `reauthorizing`: informativo (`info`), some quando volta a `online`.
525
+ * - `reauthorizationRequired$`: o Argos recusou a renovação e a reautorização automática não aconteceu
526
+ * (desligada, outra aba cuidando ou proteção contra loop). Oferece "Entrar novamente", que chama
527
+ * `authorize(urlAtual)` — o login volta para a mesma tela. Nunca chama `logout()`.
528
+ *
529
+ * `hm-alert` em `appearance="banner"` e `size="small"`: faixa de largura total, sem cantos, com os tokens
530
+ * de status do Hermes (`--hm-warning-*`/`--hm-info-*`); `role="status"` (não interrompe o leitor de tela).
531
+ */
532
+ declare class SpineConnectionBannerComponent {
533
+ protected readonly text: {
534
+ offline: string;
535
+ reconnecting: string;
536
+ reauthorizing: string;
537
+ reauthorizationRequired: string;
538
+ signInAgain: string;
539
+ callbackFailedHeading: string;
540
+ callbackFailedText: string;
541
+ };
542
+ private readonly auth;
543
+ private readonly router;
544
+ private readonly state;
545
+ private readonly reauthRequired;
546
+ /** O que mostrar: a decisão pendente da pessoa vence o estado da conexão; `online` não mostra nada. */
547
+ protected readonly notice: _angular_core.Signal<_orfeu_angular_core.ConnectionState | "reauthorizationRequired">;
548
+ protected signInAgain(): void;
549
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SpineConnectionBannerComponent, never>;
550
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SpineConnectionBannerComponent, "spine-connection-banner", never, {}, {}, never, never, true, never>;
551
+ }
552
+
553
+ interface Box {
554
+ top: number;
555
+ left: number;
556
+ width: number;
557
+ height: number;
558
+ }
559
+ /**
560
+ * Desenho do tour guiado: escurece a tela, recorta um holofote sobre o alvo do passo e põe o balão
561
+ * (título, texto, progresso e navegação) onde couber. Segue o `OnboardingService`; recalcula a cada
562
+ * passo e quando a janela rola ou muda de tamanho.
563
+ */
564
+ declare class OnboardingOverlayComponent implements OnInit, OnDestroy {
565
+ private onboarding;
566
+ protected readonly text: {
567
+ progress: string;
568
+ skip: string;
569
+ back: string;
570
+ next: string;
571
+ finish: string;
572
+ welcomeTitle: string;
573
+ welcomeText: string;
574
+ appsTitle: string;
575
+ appsText: string;
576
+ searchTitle: string;
577
+ searchText: string;
578
+ navModulesTitle: string;
579
+ navModulesText: string;
580
+ navModeTitle: string;
581
+ navModeText: string;
582
+ tabsTitle: string;
583
+ tabsText: string;
584
+ splitTitle: string;
585
+ splitText: string;
586
+ whereTitle: string;
587
+ whereText: string;
588
+ themeTitle: string;
589
+ themeText: string;
590
+ densityTitle: string;
591
+ densityText: string;
592
+ fullscreenTitle: string;
593
+ fullscreenText: string;
594
+ profileTitle: string;
595
+ profileText: string;
596
+ doneTitle: string;
597
+ doneText: string;
598
+ };
599
+ protected readonly fmt: typeof formatMessage;
600
+ cardRef?: ElementRef<HTMLDivElement>;
601
+ step: OnboardingStep | null;
602
+ index: number;
603
+ total: number;
604
+ /** holofote (null = passo centralizado, sem recorte). */
605
+ spot: Box | null;
606
+ /** posição do balão. */
607
+ card: {
608
+ top: number;
609
+ left: number;
610
+ centered: boolean;
611
+ };
612
+ private sub?;
613
+ private reposition?;
614
+ private readonly cdr;
615
+ private readonly injector;
616
+ constructor(onboarding: OnboardingService);
617
+ get isFirst(): boolean;
618
+ get isLast(): boolean;
619
+ ngOnInit(): void;
620
+ ngOnDestroy(): void;
621
+ /** Holofote e balão do passo atual: primeiro com a altura estimada, depois com a medida real. */
622
+ private layout;
623
+ /**
624
+ * Refina a posição depois que o balão foi desenhado (a altura depende do texto). Roda depois do
625
+ * render e só marca a view se a posição mudou: sem NG0100 e sem precisar do zone.js.
626
+ */
627
+ private positionCard;
628
+ /** Alvo fora da faixa visível: rola até o meio antes de medir (o `scroll` da janela refaz a conta). */
629
+ private bringIntoView;
630
+ /** Largura que o CSS dá ao balão (medida quando já existe) e a altura informada. */
631
+ private cardSize;
632
+ private viewport;
633
+ private samePosition;
634
+ onViewportChange(): void;
635
+ next(): void;
636
+ prev(): void;
637
+ skip(): void;
638
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<OnboardingOverlayComponent, never>;
639
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<OnboardingOverlayComponent, "spine-onboarding-overlay", never, {}, {}, never, never, true, never>;
640
+ }
641
+
642
+ /**
643
+ * Painel de atalhos (cheatsheet). Abre com "?" (via `ShortcutService.help$`) e lista, com o
644
+ * `hm-shortcut-list` da lib, os atalhos agrupados — com busca e o interruptor dos atalhos de tecla
645
+ * única (WCAG 2.1.4; a escolha persiste no `SpinePreferencesService`). Também é o último passo do
646
+ * onboarding.
647
+ */
648
+ declare class ShortcutsCheatsheetComponent implements OnInit, OnDestroy {
649
+ open: boolean;
650
+ protected readonly text: {
651
+ heading: string;
652
+ hint: string;
653
+ replayTour: string;
654
+ dismiss: string;
655
+ openSearch: string;
656
+ goHome: string;
657
+ goFavorite: string;
658
+ history: string;
659
+ openSettings: string;
660
+ toggleTheme: string;
661
+ fullscreen: string;
662
+ logout: string;
663
+ showHelp: string;
664
+ closeOverlay: string;
665
+ };
666
+ private readonly shortcuts;
667
+ private readonly onboarding;
668
+ /** Atalhos do painel: registrados (favoritos numa linha só) + os que outra peça dispara. */
669
+ protected readonly items: _angular_core.Signal<readonly _trismegisto_angular.HermesShortcutItem[]>;
670
+ /** Atalhos de tecla única ligados — sem eles o "?" da dica não funciona. */
671
+ protected readonly characterKeys: _angular_core.Signal<boolean>;
672
+ /** Dica com a tecla no meio: o texto do catálogo partido em volta de `{key}`. */
673
+ protected get hintParts(): string[];
674
+ /** @deprecated O painel agora é o `hm-shortcut-list`; use `ShortcutService.panelItems()`. Sai numa próxima versão. */
675
+ get groups(): ShortcutGroup[];
676
+ /** @deprecated As teclas são desenhadas pelo `hm-shortcut-list`. Sai numa próxima versão. */
677
+ chips(keys: string): string[];
678
+ private sub?;
679
+ /** Reabre o tour de onboarding e fecha este painel. */
680
+ replayTour(): void;
681
+ ngOnInit(): void;
682
+ ngOnDestroy(): void;
683
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShortcutsCheatsheetComponent, never>;
684
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ShortcutsCheatsheetComponent, "spine-shortcuts-cheatsheet", never, {}, {}, never, never, true, never>;
685
+ }
686
+
687
+ /** Seções que o próprio spine já traz. `key` é também o valor de `?settings=` na URL. */
688
+ declare const SPINE_SETTINGS_KEYS: {
689
+ readonly appearance: "aparencia";
690
+ readonly region: "regiao";
691
+ readonly shortcuts: "atalhos";
692
+ readonly account: "conta";
693
+ readonly about: "sobre";
694
+ };
695
+ /** Seção extra do painel, registrada pelo app (ex.: preferências de deploy do hefesto). */
696
+ interface SpineSettingsSection {
697
+ /** Identificador estável; também o que `?settings=<key>` abre. Não repetir os do spine. */
698
+ key: string;
699
+ label: string;
700
+ /** Ícone do hermes-icon na navegação. */
701
+ icon?: string;
702
+ description?: string;
703
+ /** Termos extras que acham a seção inteira na busca. */
704
+ keywords?: string;
705
+ /** Conteúdo da seção — de preferência `hm-settings-row`s, para a busca achar cada linha. */
706
+ component: Type<unknown>;
707
+ }
708
+ declare const SPINE_SETTINGS_SECTIONS: InjectionToken<SpineSettingsSection[]>;
709
+ /** Registra uma seção do app no painel de configurações (aparece depois das do spine, antes de
710
+ * "Sobre"). Pode ser chamado várias vezes, uma por seção. */
711
+ declare function provideSettingsSection(section: SpineSettingsSection): Provider;
712
+ /** Abre/fecha o painel de configurações de qualquer lugar (menu do perfil, atalho, link). */
713
+ declare class SpineSettingsService {
714
+ readonly isOpen: _angular_core.WritableSignal<boolean>;
715
+ /** Seção pedida na abertura (vazio = a primeira). */
716
+ readonly section: _angular_core.WritableSignal<string>;
717
+ open(section?: string): void;
718
+ close(): void;
719
+ toggle(): void;
720
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SpineSettingsService, never>;
721
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<SpineSettingsService>;
722
+ }
723
+
724
+ /**
725
+ * Painel de configurações do shell (substitui as telas do antigo módulo "Sistema"): Aparência,
726
+ * Região, Atalhos, Conta e Sobre, mais as seções que o app registrar com
727
+ * `provideSettingsSection`. Tudo vale na hora — cada controle chama o serviço que já persiste
728
+ * aquela preferência (tema, densidade, menu lateral, fuso).
729
+ *
730
+ * Aberto por `SpineSettingsService.open()` — menu do perfil, `Ctrl+,` ou `?settings=<seção>`.
731
+ */
732
+ declare class SettingsPanelComponent {
733
+ protected readonly settings: SpineSettingsService;
734
+ private readonly messages;
735
+ protected readonly text: {
736
+ heading: string;
737
+ appearance: string;
738
+ appearanceKeywords: string;
739
+ theme: string;
740
+ themeDescription: string;
741
+ themeKeywords: string;
742
+ themeLight: string;
743
+ themeDark: string;
744
+ themeSystem: string;
745
+ accent: string;
746
+ accentDescription: string;
747
+ accentKeywords: string;
748
+ density: string;
749
+ densityDescription: string;
750
+ densityKeywords: string;
751
+ comfortable: string;
752
+ compact: string;
753
+ font: string;
754
+ fontDescription: string;
755
+ fontKeywords: string;
756
+ sidebar: string;
757
+ sidebarDescription: string;
758
+ sidebarKeywords: string;
759
+ sidebarAuto: string;
760
+ sidebarFixed: string;
761
+ sidebarCompact: string;
762
+ region: string;
763
+ regionKeywords: string;
764
+ language: string;
765
+ languageDescription: string;
766
+ languageKeywords: string;
767
+ languageAuto: string;
768
+ timeZone: string;
769
+ timeZoneKeywords: string;
770
+ timeZoneHint: string;
771
+ timeZoneAuto: string;
772
+ shortcuts: string;
773
+ shortcutsDescription: string;
774
+ shortcutsKeywords: string;
775
+ tour: string;
776
+ tourDescription: string;
777
+ tourKeywords: string;
778
+ replayTour: string;
779
+ account: string;
780
+ accountKeywords: string;
781
+ user: string;
782
+ accessLevel: string;
783
+ accessLevelKeywords: string;
784
+ session: string;
785
+ sessionDescription: string;
786
+ sessionKeywords: string;
787
+ sessionUnknown: string;
788
+ sessionExpired: string;
789
+ sessionExpiresIn: string;
790
+ sessionExpiresAt: string;
791
+ accessToken: string;
792
+ accessTokenDescription: string;
793
+ accessTokenKeywords: string;
794
+ copy: string;
795
+ appTokens: string;
796
+ appTokensDescription: string;
797
+ appTokensKeywords: string;
798
+ logout: string;
799
+ logoutDescription: string;
800
+ logoutKeywords: string;
801
+ about: string;
802
+ aboutKeywords: string;
803
+ application: string;
804
+ version: string;
805
+ versionKeywords: string;
806
+ buildDate: string;
807
+ environment: string;
808
+ environmentKeywords: string;
809
+ links: string;
810
+ linksKeywords: string;
811
+ docs: string;
812
+ reportIssue: string;
813
+ repository: string;
814
+ dependencies: string;
815
+ dependenciesDescription: string;
816
+ dependenciesKeywords: string;
817
+ supportInfo: string;
818
+ supportInfoDescription: string;
819
+ supportInfoKeywords: string;
820
+ noSessionToken: string;
821
+ tokenCopied: string;
822
+ supportCopied: string;
823
+ copyBlocked: string;
824
+ };
825
+ protected readonly fmt: typeof formatMessage;
826
+ protected readonly keys: {
827
+ readonly appearance: "aparencia";
828
+ readonly region: "regiao";
829
+ readonly shortcuts: "atalhos";
830
+ readonly account: "conta";
831
+ readonly about: "sobre";
832
+ };
833
+ private readonly theme;
834
+ private readonly hermesTheme;
835
+ private readonly presets;
836
+ private readonly density;
837
+ protected readonly sidebar: HermesSidebarService;
838
+ protected readonly preferences: SpinePreferencesService;
839
+ private readonly shortcutService;
840
+ private readonly onboarding;
841
+ private readonly auth;
842
+ private readonly toast;
843
+ protected readonly packageInfo: _trismegisto_spine.PackageInfo;
844
+ private readonly config;
845
+ protected readonly appSections: _trismegisto_spine_layout.SpineSettingsSection[];
846
+ protected readonly appName: string;
847
+ protected readonly themeOptions: _angular_core.Signal<readonly SegmentedOption<string>[]>;
848
+ protected readonly densityOptions: _angular_core.Signal<readonly SegmentedOption<string>[]>;
849
+ protected readonly fontOptions: readonly SegmentedOption[];
850
+ protected readonly sidebarOptions: _angular_core.Signal<readonly SegmentedOption<string>[]>;
851
+ protected readonly themeMode: _angular_core.Signal<HermesThemeMode>;
852
+ protected readonly appliedTheme: _angular_core.Signal<_trismegisto_tokens.HermesThemeName>;
853
+ protected readonly family: _angular_core.Signal<string>;
854
+ protected readonly densityValue: _angular_core.Signal<HermesDensity>;
855
+ protected readonly fontValue: _angular_core.Signal<HermesFont>;
856
+ protected readonly families: readonly _trismegisto_tokens.HermesFamily[];
857
+ protected setThemeMode(mode: string): void;
858
+ protected setFamily(id: string): void;
859
+ protected setDensity(value: string): void;
860
+ protected setFont(value: string): void;
861
+ protected setSidebarMode(value: string): void;
862
+ protected readonly languageOptions: _angular_core.Signal<{
863
+ readonly value: string;
864
+ readonly label: string;
865
+ }[]>;
866
+ /** ~400 fusos, cada um com o deslocamento calculado: só monta quando o painel abre pela
867
+ * primeira vez, não no carregamento de toda página (o painel vive no layout desde o início). */
868
+ private timeZoneCache;
869
+ protected readonly timeZoneOptions: _angular_core.Signal<readonly ComboboxOption[]>;
870
+ /** Hora agora no fuso efetivo — prévia de como as datas vão aparecer. */
871
+ protected readonly timeZonePreview: _angular_core.Signal<string>;
872
+ /** Atalhos registrados (favoritos numa linha só) + os que outra peça dispara — os mesmos do painel "?". */
873
+ protected readonly shortcutItems: _angular_core.Signal<readonly _trismegisto_angular.HermesShortcutItem[]>;
874
+ protected replayTour(): void;
875
+ protected get profile(): _orfeu_angular_core.UserProfile;
876
+ protected get badge(): _orfeu_angular_core.Badge | null;
877
+ /** Validade da sessão lida do `exp` do próprio token (só leitura do payload, sem validar). */
878
+ protected get sessionExpiry(): string;
879
+ protected copyToken(): Promise<void>;
880
+ protected logout(): void;
881
+ protected readonly dependencies: {
882
+ version: string | undefined;
883
+ name: string;
884
+ label: string;
885
+ }[];
886
+ protected get buildDate(): string;
887
+ /** Texto pronto pra colar num chamado: app, versão, ambiente, navegador, tela, fuso e página. */
888
+ protected copySupportInfo(): Promise<void>;
889
+ private copy;
890
+ protected onOpenChange(open: boolean): void;
891
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SettingsPanelComponent, never>;
892
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SettingsPanelComponent, "spine-settings-panel", never, {}, {}, never, never, true, never>;
893
+ }
894
+
895
+ /** Um token de aplicação do usuário, como o argos-admin devolve (nunca o valor, só o prefixo). */
896
+ interface AppToken {
897
+ id: string;
898
+ name: string;
899
+ description: string | null;
900
+ prefix: string;
901
+ badge_id: string;
902
+ badge_name: string;
903
+ expires_at: string;
904
+ created_at: string;
905
+ last_used_at: string | null;
906
+ expired: boolean;
907
+ }
908
+ interface AppTokenList {
909
+ tokens: AppToken[];
910
+ max_active: number;
911
+ max_days: number;
912
+ }
913
+ /** A aplicação logada e os níveis de acesso que o usuário pode escolher nela ao criar um token. */
914
+ interface AppTokenOptions {
915
+ client: {
916
+ id: string;
917
+ name: string | null;
918
+ };
919
+ badges: {
920
+ id: string;
921
+ name: string;
922
+ }[];
923
+ max_days: number;
924
+ }
925
+ interface CreatedAppToken {
926
+ id: string;
927
+ /** Valor bruto — só existe nesta resposta. */
928
+ token: string;
929
+ expires_at: string;
930
+ }
931
+ /**
932
+ * Tokens de aplicação pessoais (`x-app-token`) do usuário logado — `argos-admin /me/app-tokens`.
933
+ * Sempre da aplicação LOGADA: o servidor tira o client do próprio access-token da sessão, então
934
+ * aqui não existe escolha de aplicação.
935
+ * Autentica com o access-token da sessão (o servidor recusa um app-token aqui: token não cria
936
+ * token). `available` é falso quando o app não tem a URL do argos-admin (`SPINE_ADMIN_API`).
937
+ */
938
+ declare class SpineAppTokensService {
939
+ private readonly http;
940
+ private readonly auth;
941
+ private readonly adminApi;
942
+ readonly available: boolean;
943
+ private get baseUrl();
944
+ private get headers();
945
+ list(): Promise<AppTokenList>;
946
+ options(): Promise<AppTokenOptions>;
947
+ create(body: {
948
+ badge_id: string;
949
+ name: string;
950
+ validity_days: number;
951
+ }): Promise<CreatedAppToken>;
952
+ revoke(id: string): Promise<void>;
953
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SpineAppTokensService, never>;
954
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<SpineAppTokensService>;
955
+ }
956
+
957
+ /** Documento de uma tela que a pessoa logada pode abrir. */
958
+ interface DocsEntry extends RouteDocument {
959
+ /** Chave da tela (router_id ou, sem ele, o do template), sempre em minúsculas. */
960
+ readonly id: string;
961
+ readonly title: string;
962
+ readonly group: string;
963
+ }
964
+ interface DocsGroup {
965
+ readonly title: string;
966
+ readonly entries: readonly DocsEntry[];
967
+ }
968
+ type DocsView = 'usage' | 'technical';
969
+ /**
970
+ * Estado da documentação das telas: o que está registrado em `COMPONENT_ROUTES` com `document`,
971
+ * filtrado pelas telas que existem na árvore da pessoa (documento de tela sem acesso nunca é oferecido),
972
+ * e a leitura em andamento no modal `spine-docs`.
973
+ */
974
+ declare class SpineDocsService {
975
+ #private;
976
+ /** Visão técnica liberada (`SpineConfig.technicalDocs`; sem configuração, só em desenvolvimento). */
977
+ readonly technicalAvailable: boolean;
978
+ readonly isOpen: _angular_core.Signal<boolean>;
979
+ readonly current: _angular_core.Signal<DocsEntry | null>;
980
+ readonly view: _angular_core.Signal<DocsView>;
981
+ readonly content: _angular_core.Signal<string>;
982
+ readonly loading: _angular_core.Signal<boolean>;
983
+ readonly error: _angular_core.Signal<string>;
984
+ readonly showTechnical: _angular_core.Signal<boolean>;
985
+ readonly index: _angular_core.Signal<DocsGroup[]>;
986
+ constructor();
987
+ documentFor(routerId: string | null | undefined, sourceTemplateRouterId?: string | null): DocsEntry | null;
988
+ openForRoute(routerId: string | null | undefined, sourceTemplateRouterId?: string | null): void;
989
+ openIndex(): void;
990
+ close(): void;
991
+ open(entry: DocsEntry, view?: DocsView): Promise<void>;
992
+ show(view: DocsView): Promise<void>;
993
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SpineDocsService, never>;
994
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<SpineDocsService>;
995
+ }
996
+
997
+ /**
998
+ * Painel de novidades: um diálogo com carrossel — "olha o que mudou", não tutorial (esse é o tour
999
+ * de boas-vindas). Montado uma vez no layout; quem decide quando abre é o `SpineNewsService`.
1000
+ */
1001
+ declare class SpineNewsComponent {
1002
+ protected readonly news: SpineNewsService;
1003
+ protected readonly text: {
1004
+ heading: string;
1005
+ carousel: string;
1006
+ dismiss: string;
1007
+ };
1008
+ private readonly document;
1009
+ /** O hm-carousel pede `image`/`alt` sempre presentes (vazios = sem imagem / decorativa). A
1010
+ * ilustração é desenhada na hora de abrir, com as cores do tema daquele momento. */
1011
+ protected readonly slides: _angular_core.Signal<{
1012
+ title: string;
1013
+ text: string;
1014
+ image: string;
1015
+ alt: string;
1016
+ }[]>;
1017
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SpineNewsComponent, never>;
1018
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SpineNewsComponent, "spine-news", never, {}, {}, never, never, true, never>;
1019
+ }
1020
+
1021
+ /**
1022
+ * Modal de documentação das telas: índice (com busca) à esquerda e leitura à direita. Montado uma vez
1023
+ * pelo `spine-layout`; abrir, fechar e o que se lê vêm todos do `SpineDocsService`.
1024
+ */
1025
+ declare class SpineDocsComponent {
1026
+ protected readonly docs: SpineDocsService;
1027
+ protected readonly text: _trismegisto_spine.SpineMessages;
1028
+ protected readonly query: _angular_core.WritableSignal<string>;
1029
+ protected readonly groupId: string;
1030
+ protected readonly viewOptions: _angular_core.Signal<SegmentedOption<DocsView>[]>;
1031
+ protected readonly filtered: _angular_core.Signal<DocsGroup[]>;
1032
+ protected readonly readingKey: _angular_core.Signal<string[]>;
1033
+ protected select(entry: DocsEntry): void;
1034
+ protected switchView(view: string): void;
1035
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SpineDocsComponent, never>;
1036
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SpineDocsComponent, "spine-docs", never, {}, {}, never, never, true, never>;
1037
+ }
1038
+
1039
+ /**
1040
+ * Renderiza Markdown (GFM) como HTML com a tipografia do design system. O texto é tratado como dado:
1041
+ * o HTML gerado passa pelo DOMPurify antes de chegar ao DOM.
1042
+ */
1043
+ declare class SpineMarkdownComponent {
1044
+ #private;
1045
+ /** Markdown cru. Vazio não desenha nada. */
1046
+ readonly content: _angular_core.InputSignal<string>;
1047
+ protected readonly html: _angular_core.Signal<SafeHtml | null>;
1048
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SpineMarkdownComponent, never>;
1049
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SpineMarkdownComponent, "spine-markdown", never, { "content": { "alias": "content"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1050
+ }
1051
+
1052
+ export { AppLauncherComponent, HeaderComponent, LayoutComponent, OnboardingOverlayComponent, OnboardingService, SPINE_BRAND, SPINE_SETTINGS_KEYS, SPINE_SETTINGS_SECTIONS, SettingsPanelComponent, ShortcutService, ShortcutsCheatsheetComponent, SidebarComponent, SpineAppTokensService, SpineBrandComponent, SpineConnectionBannerComponent, SpineDocsComponent, SpineDocsService, SpineMarkdownComponent, SpineNewsComponent, SpineNewsService, SpineSettingsService, findTourTarget, provideSettingsSection };
1053
+ export type { AppToken, AppTokenList, AppTokenOptions, CreatedAppToken, DocsEntry, DocsGroup, DocsView, OnboardingStep, ShortcutActions, ShortcutGroup, ShortcutGroupId, ShortcutItem, SpineSettingsSection };
1054
+ //# sourceMappingURL=trismegisto-spine-layout.d.ts.map