@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,1161 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Type, InjectionToken, NgZone, EnvironmentProviders, Provider } from '@angular/core';
3
+ import { HermesThemeName, HermesThemeMode, HermesFamily, HermesDensity } from '@trismegisto/angular';
4
+ import { HermesThemeExtension, PluralMessage, CatalogOverride } from '@trismegisto/primitives';
5
+
6
+ interface Route {
7
+ route_display_name?: string | null;
8
+ route_icon?: string | null;
9
+ /**
10
+ * @deprecated use `router_id` (ou `routerIdOf`). Nome histórico: no nó 'page' o argos-auth-server
11
+ * sempre mandou aqui o `router_id` (nunca o `web.routes.route_id`, que é `routed_id`). Continua
12
+ * vindo, com o mesmo valor, para spines/Orfeu antigos.
13
+ */
14
+ route_id?: string | null;
15
+ route_name?: string | null;
16
+ route_order?: number | null;
17
+ route_path?: string | null;
18
+ route_redirect?: string | null;
19
+ route_redirect_to?: string | null;
20
+ route_type?: string | null;
21
+ /** A ROTA do nó (`web.routes.route_id`): nome/ícone/path. Reaproveitável em vários routers. */
22
+ routed_id: string;
23
+ routes?: Route[] | null;
24
+ /**
25
+ * Identidade da TELA: o router do client (`web.router.router_id`, a posição da tela na
26
+ * navegação). Só no nó 'page' -- nó de grupo (navigation/menu/...) é compartilhado por vários
27
+ * routers e não tem um próprio. É por ele que o spine acha o componente (`COMPONENT_ROUTES`),
28
+ * o documento e a descrição. Argos anterior a 2026-10-05 não manda: use `routerIdOf`, que cai
29
+ * no `route_id` (mesmo valor).
30
+ */
31
+ router_id?: string | null;
32
+ /** Texto curto da tela (`web.router.description`), exibido na barra da página abaixo do título. */
33
+ description?: string | null;
34
+ source_template_router_id?: string | null;
35
+ }
36
+ /** `router_id` da tela (nó 'page'), aceitando o argos antigo (que só mandava `route_id`, mesmo valor). */
37
+ declare function routerIdOf(route: Route | null | undefined): string | null;
38
+
39
+ /**
40
+ * Funde nós IRMÃOS que apontam para o mesmo endereço (`route_redirect`), em toda a árvore.
41
+ *
42
+ * Herança do roteamento antigo: o nível do nó (header/navigation/menu/item/submenu/page) dizia ONDE ele
43
+ * era desenhado — header no topo, menu na lateral, o resto no `<router-outlet>` de cada app. Agora tudo
44
+ * é menu (`spine-sidebar`) e o nível não importa mais, só o endereço. Só que o argos-auth-server monta a
45
+ * view pulando nível vazio: um router header("laboratorio")→page("prova-de-conceito") e outro
46
+ * navigation("laboratorio")→page("dashboard") viram dois nós de topo DIFERENTES com o mesmo
47
+ * `/laboratorio`. Resultado: dois "laboratorio" no menu, e a resolução por nível (`findRouteThrough`, que
48
+ * pega o PRIMEIRO irmão que casa) só enxergava os filhos de um deles — a página do outro caía no
49
+ * fallback do `ViewGuard` (volta para o início). Achado real, 2026-10-07.
50
+ *
51
+ * Regras:
52
+ * - Só funde irmãos da MESMA lista, com `route_redirect` igual e não vazio (grupo transparente, sem
53
+ * endereço, nunca é fundido — não há o que comparar).
54
+ * - O nó fundido é o primeiro da lista (mantém posição, nome, ícone e `routed_id` dele); `router_id`/
55
+ * `description`/`source_template_router_id` vêm do primeiro que tiver. Os filhos de todos são
56
+ * juntados (ordenados por `route_order`, estável) e fundidos de novo, recursivamente.
57
+ * - Lista sem nenhum endereço repetido sai IGUAL (mesmo array, mesmos objetos): nada muda para app cuja
58
+ * árvore já era consistente.
59
+ * - Nunca muta a entrada (a view é do `ViewService` do orfeu, compartilhada).
60
+ *
61
+ * Use `spineRoutesOf(view)` em vez de ler `view.routes` direto: o resultado é guardado por identidade do
62
+ * array, então todo consumidor (guard, painel, sidebar, busca...) recebe a MESMA árvore fundida.
63
+ */
64
+ declare function mergeRouteTree(routes: readonly Route[] | null | undefined): Route[];
65
+ /** A árvore fundida da view atual (`ViewService.currentView`) — ver `mergeRouteTree`. */
66
+ declare function spineRoutesOf(view: {
67
+ routes?: readonly Route[] | null;
68
+ } | null | undefined): Route[];
69
+
70
+ /**
71
+ * Ponto único de import dos componentes standalone do `@trismegisto/angular` usados nos templates do
72
+ * spine. O DS novo é standalone-only (sem agregador), então este array cumpre o mesmo papel prático:
73
+ * um `@Component({ imports: [...HERMES_DS_IMPORTS] })` em vez de listar cada símbolo em cada arquivo
74
+ * que usa `hm-*`.
75
+ */
76
+ declare const HERMES_DS_IMPORTS: readonly Type<unknown>[];
77
+
78
+ /**
79
+ * Logo e favicon do app (`SpineConfig.logo`/`SpineConfig.favicon`). O spine não embute marca nenhuma:
80
+ * o arquivo é sempre do app, servido de `src/assets`.
81
+ */
82
+ /** Logo do header: um caminho (os dois temas) ou as variantes clara/escura + texto alternativo. */
83
+ type SpineLogoConfig = string | {
84
+ light: string;
85
+ dark?: string;
86
+ alt?: string;
87
+ };
88
+ /** Convenção quando o app não configura `logo`: `src/assets/images/logo.svg` servido em `assets/images/`. */
89
+ declare const SPINE_DEFAULT_LOGO = "assets/images/logo.svg";
90
+ /** Logo já normalizado. */
91
+ interface SpineLogoSources {
92
+ light: string;
93
+ dark: string | null;
94
+ /** Texto alternativo explícito; `null` usa o padrão (o nome do app). */
95
+ alt: string | null;
96
+ }
97
+ /** Normaliza `SpineConfig.logo`: omitido → convenção; `false`/vazio → sem imagem (`null`). */
98
+ declare function resolveSpineLogo(logo: SpineLogoConfig | false | null | undefined): SpineLogoSources | null;
99
+ /**
100
+ * Aponta o favicon do documento para `href`: atualiza o primeiro `<link rel="icon">` (ou `shortcut icon`)
101
+ * e remove os outros (senão o navegador pode continuar escolhendo um deles); sem nenhum, cria um no
102
+ * `<head>`. O `type` acompanha a extensão (some quando ela é desconhecida).
103
+ */
104
+ declare function applySpineFavicon(doc: Document, href: string): HTMLLinkElement | null;
105
+
106
+ interface SpineConfig {
107
+ clientId: string;
108
+ /**
109
+ * Famílias de cor próprias do app (opcional): acrescentar (`families`), trocar uma existente
110
+ * (`replace: { poseidon: minhaFamilia }` — posição e preferência salva passam para a nova) e a
111
+ * família inicial (`defaultFamily`). Ver `extendThemeConfig` do `@trismegisto/primitives`; a família
112
+ * se monta e exporta no `hm-theme-builder`.
113
+ */
114
+ theme?: HermesThemeExtension;
115
+ /** Nome do app exibido ao lado do logo no header (ex.: "Hefesto"). Padrão: "Hermes". */
116
+ appName?: string;
117
+ /**
118
+ * Logo do header, servido pelo próprio app (caminho relativo ao `<base href>`, ex.: arquivo em
119
+ * `src/assets/images/`). Formas:
120
+ * - omitido: convenção `assets/images/logo.svg` (`SPINE_DEFAULT_LOGO`);
121
+ * - `'assets/images/logo.png'`: um arquivo só, para os dois temas;
122
+ * - `{ light, dark?, alt? }`: `dark` é usado no tema escuro (do `ThemeService`); `alt` substitui o texto
123
+ * alternativo padrão;
124
+ * - `false`: sem imagem (só o nome, sem nenhuma requisição).
125
+ * Se a imagem não carregar (404/erro), o header esconde a imagem e mostra só o nome. Um componente de
126
+ * marca em `SPINE_BRAND` (`@trismegisto/spine/layout`) tem prioridade sobre a imagem.
127
+ */
128
+ logo?: SpineLogoConfig | false;
129
+ /** Mostra o `appName` ao lado do logo. Padrão: `true`. Com `false` o nome só aparece se não houver logo
130
+ * visível (sem imagem, ou imagem que falhou) — o link da marca nunca fica sem texto. */
131
+ showAppName?: boolean;
132
+ /** Favicon do app (ex.: `'assets/favicon.ico'`). Se definido, o `provideUi` atualiza o `<link rel="icon">`
133
+ * do `index.html` (ou cria um) no bootstrap; sem isto o spine não mexe no favicon. */
134
+ favicon?: string;
135
+ /** Exibe a aba "Especificação técnica" da documentação das telas (`RouteDocument.loadTechnical`).
136
+ * Padrão: `isDevMode()`. Apps com build de produção em homologação passam
137
+ * `!environment.production` (ou equivalente) para mostrá-la fora de produção. */
138
+ technicalDocs?: boolean;
139
+ }
140
+ declare const SPINE_CONFIG: InjectionToken<SpineConfig>;
141
+
142
+ /**
143
+ * Wrapper fino sobre `HermesThemeService` (que já persiste em `localStorage` e aplica
144
+ * `data-theme`/`--hm-*` via `HermesThemeDirective`): mantém o mesmo nome/API de injeção do
145
+ * spine antigo, e adiciona só o que o DS novo não cobre — sincronização entre ABAS do
146
+ * navegador via `BroadcastChannel` (o `ThemeService` antigo tinha isso; `HermesThemeService`
147
+ * é por-aba). Aplica os atributos diretamente no `<body>` em vez de exigir que cada app
148
+ * consumidor lembre de colocar `hermesTheme` no template — mesmo espírito do antigo, que
149
+ * também escrevia `hermes-theme` no `<body>` a partir do serviço, não do template.
150
+ */
151
+ declare class ThemeService {
152
+ private document;
153
+ private platformId;
154
+ private zone;
155
+ private readonly hermesTheme;
156
+ private channel;
157
+ private readonly channelName;
158
+ constructor(document: Document, platformId: Object, zone: NgZone, config: SpineConfig | null);
159
+ get current(): HermesThemeName;
160
+ /** Escolha do usuário: `light`, `dark` ou `system` (acompanha o sistema operacional). */
161
+ get mode(): HermesThemeMode;
162
+ setMode(mode: HermesThemeMode): void;
163
+ setTheme(theme: HermesThemeName): void;
164
+ static ɵfac: i0.ɵɵFactoryDeclaration<ThemeService, [null, null, null, { optional: true; }]>;
165
+ static ɵprov: i0.ɵɵInjectableDeclaration<ThemeService>;
166
+ }
167
+
168
+ /**
169
+ * Wrapper fino sobre `HermesThemeService.family`/`setFamily`/`families` — substitui o
170
+ * `applyThemePreset`/`PRESETS` do addon `theme-builder` antigo (que já expunha só paletas
171
+ * FIXAS pré-definidas, nunca cor arbitrária digitada pelo usuário: o spine antigo usava só
172
+ * essa lista fixa, então trocar para `family` do DS novo é a mesma mecânica de UX — grid de
173
+ * paletas prontas —, só muda o catálogo de opções e como cada uma deriva claro/escuro
174
+ * internamente). Persistência entre abas já vem de `HermesThemeService` (localStorage).
175
+ */
176
+ declare class ThemePresetService {
177
+ private readonly hermesTheme;
178
+ get current(): HermesFamily;
179
+ get families(): readonly HermesFamily[];
180
+ setPreset(family: HermesFamily): void;
181
+ static ɵfac: i0.ɵɵFactoryDeclaration<ThemePresetService, never>;
182
+ static ɵprov: i0.ɵɵInjectableDeclaration<ThemePresetService>;
183
+ }
184
+
185
+ interface DensitySetting {
186
+ name: HermesDensity;
187
+ }
188
+ /**
189
+ * Wrapper fino sobre `HermesThemeService.density`/`setDensity` (já persistido em
190
+ * `localStorage` pelo DS novo) — mantém o nome/API do spine antigo e adiciona a
191
+ * sincronização entre abas via `BroadcastChannel` que `HermesThemeService` não tem
192
+ * (é por-aba). Ver `ThemeService` (mesmo padrão, mesmo motivo).
193
+ */
194
+ declare class DensityService {
195
+ private platformId;
196
+ private zone;
197
+ private readonly hermesTheme;
198
+ private channel;
199
+ private readonly channelName;
200
+ constructor(platformId: Object, zone: NgZone, config: SpineConfig | null);
201
+ get current(): DensitySetting;
202
+ setDensity(density: HermesDensity): void;
203
+ /** Só alterna entre comfortable e compact — mesmo comportamento do spine antigo
204
+ * (que chamava a densidade não-compacta de "regular"; o DS novo chama de "comfortable"). */
205
+ toggleDensity(): void;
206
+ static ɵfac: i0.ɵɵFactoryDeclaration<DensityService, [null, null, { optional: true; }]>;
207
+ static ɵprov: i0.ɵɵInjectableDeclaration<DensityService>;
208
+ }
209
+
210
+ /** Registra o catálogo de ícones inteiro — o spine (header/sidebar/navegação/modal/onboarding)
211
+ * usa ícones de várias origens (shield, pencil, trash, floppy, chevrons...) que não vêm
212
+ * embutidos de graça (os componentes do hermes só registram os ícones que eles próprios usam); sem isto, todo `hm-icon` do spine cai
213
+ * silenciosamente no hambúrguer de fallback pra qualquer app que consuma este pacote. */
214
+ declare function provideUi(config?: SpineConfig): EnvironmentProviders;
215
+
216
+ /** Dados do `package.json` do app (nome, versão, dependências...), passados em
217
+ * `provideShell({ packageInfo })`. Mora no pacote raiz (e não em `@trismegisto/spine/shell`, onde
218
+ * nasceu) porque o painel de configurações do `@trismegisto/spine/layout` também lê — e o shell
219
+ * importa o layout, então o layout importar o shell fecharia um ciclo. O shell reexporta o
220
+ * MESMO token (mesma instância), então quem importava de lá continua funcionando. */
221
+ interface PackageInfo {
222
+ name?: string;
223
+ version?: string;
224
+ description?: string;
225
+ license?: string;
226
+ buildDate?: string;
227
+ environment?: string;
228
+ repository?: {
229
+ url?: string;
230
+ };
231
+ developer?: {
232
+ name?: string;
233
+ homepage?: string;
234
+ email?: string;
235
+ };
236
+ docs?: string;
237
+ issues?: string;
238
+ dependencies?: Record<string, string>;
239
+ [key: string]: any;
240
+ }
241
+ declare const APP_PACKAGE_INFO: InjectionToken<PackageInfo>;
242
+
243
+ /**
244
+ * Preferências do usuário que não são de tema (tema/família/densidade continuam no
245
+ * `HermesThemeService`; modo do menu lateral no `HermesSidebarService`): fuso horário, idioma e o
246
+ * interruptor dos atalhos de tecla única (WCAG 2.1.4) do `HermesShortcutService`.
247
+ *
248
+ * Por enquanto vive no navegador (localStorage, sincronizado entre abas). A sincronização com o
249
+ * servidor (argos-admin `/me/preferences`) entra depois sem mudar esta API: quem lê `timeZone()`
250
+ * não precisa saber de onde o valor veio.
251
+ */
252
+ declare class SpinePreferencesService {
253
+ private readonly browser;
254
+ private readonly zone;
255
+ private readonly ns;
256
+ private readonly timeZoneKey;
257
+ private readonly languageKey;
258
+ private readonly characterKeysKey;
259
+ private readonly shortcuts;
260
+ private readonly i18n;
261
+ /** Idioma com que o app subiu (`provideHermesI18n`) — vale quando a pessoa não escolheu nenhum. */
262
+ readonly appLanguage: string;
263
+ private readonly channel;
264
+ /** Fuso escolhido (IANA, ex.: "America/Sao_Paulo"). Vazio = o do navegador. */
265
+ readonly timeZone: i0.WritableSignal<string>;
266
+ /** Fuso do navegador, para mostrar ao lado da opção "automático". */
267
+ readonly browserTimeZone: string;
268
+ /** O fuso que vale de fato: o escolhido ou, sem escolha, o do navegador. */
269
+ readonly effectiveTimeZone: i0.Signal<string>;
270
+ /** Idioma escolhido (BCP 47: `pt-BR`, `en`, `es`). Vazio = o padrão do app. */
271
+ readonly language: i0.WritableSignal<string>;
272
+ /**
273
+ * Atalhos de tecla única (`?`, `G H`) ligados — WCAG 2.1.4. Guardado por app (`'on'`/`'off'`);
274
+ * sem escolha salva, vale o padrão do `HermesShortcutService` (`provideHermesShortcuts`).
275
+ */
276
+ readonly characterKeys: i0.WritableSignal<boolean>;
277
+ /** Idiomas oferecidos na configuração, cada um com o nome no próprio idioma (padrão de mercado). */
278
+ readonly languages: readonly {
279
+ readonly value: string;
280
+ readonly label: string;
281
+ }[];
282
+ constructor();
283
+ /** Liga/desliga os atalhos de tecla única na hora, guarda e avisa as outras abas. */
284
+ setCharacterKeys(enabled: boolean): void;
285
+ private saveCharacterKeys;
286
+ private applyCharacterKeys;
287
+ private readCharacterKeys;
288
+ /** Troca o idioma da lib e do spine na hora, guarda e avisa as outras abas. Vazio = padrão do app. */
289
+ setLanguage(value: string): void;
290
+ private applyLanguage;
291
+ setTimeZone(value: string): void;
292
+ /** Todos os fusos IANA que o navegador conhece (vazio em navegador antigo). */
293
+ supportedTimeZones(): string[];
294
+ private read;
295
+ private write;
296
+ static ɵfac: i0.ɵɵFactoryDeclaration<SpinePreferencesService, never>;
297
+ static ɵprov: i0.ɵɵInjectableDeclaration<SpinePreferencesService>;
298
+ }
299
+
300
+ /**
301
+ * Base da API do argos-admin-server (ex.: `https://exemplo.com.br/argos/admin/api`) —
302
+ * recursos do próprio usuário (`/me/*`, hoje os tokens de aplicação) que o painel de
303
+ * configurações usa. Quem chama `provideAutoService({ adminApi })` já fornece este token (é a
304
+ * mesma URL); um app sem auto-service fornece direto, ou fica sem as partes do painel que
305
+ * dependem do servidor (elas se escondem em vez de quebrar).
306
+ */
307
+ declare const SPINE_ADMIN_API: InjectionToken<string>;
308
+
309
+ /** A page remembered by the shell, either as a favorite or as a recent visit. */
310
+ interface QuickAccessItem {
311
+ readonly id: string;
312
+ readonly icon: string;
313
+ readonly displayName: string;
314
+ readonly redirect: string;
315
+ /** Ancestor labels, top-down. `[]` = top-level page; absent = stored by an older version. */
316
+ readonly trail?: readonly string[];
317
+ }
318
+ /**
319
+ * Favorites and recently visited pages, shared by every consumer in the app (page bar, home screen)
320
+ * and persisted per client in `localStorage`.
321
+ */
322
+ declare class SpineQuickAccessService {
323
+ private readonly browser;
324
+ private readonly favoritesKey;
325
+ private readonly recentsKey;
326
+ private readonly favoriteList;
327
+ private readonly recentList;
328
+ readonly favorites: i0.Signal<readonly QuickAccessItem[]>;
329
+ readonly recents: i0.Signal<readonly QuickAccessItem[]>;
330
+ private readonly favoriteSet;
331
+ constructor(config: SpineConfig | null);
332
+ isFavorite(id: string | null | undefined): boolean;
333
+ toggleFavorite(item: QuickAccessItem): void;
334
+ recordVisit(item: QuickAccessItem): void;
335
+ forgetRecent(id: string): void;
336
+ private commit;
337
+ private load;
338
+ static ɵfac: i0.ɵɵFactoryDeclaration<SpineQuickAccessService, [{ optional: true; }]>;
339
+ static ɵprov: i0.ɵɵInjectableDeclaration<SpineQuickAccessService>;
340
+ }
341
+
342
+ /**
343
+ * O mínimo do `environment` de um app que dá pra derivar em tempo de execução. Estrutural de
344
+ * propósito (não importa o `Environment` de nenhum app): serve pra todos.
345
+ */
346
+ interface RuntimeEnvironmentShape {
347
+ authorizationServer: {
348
+ authority?: string;
349
+ redirectUrl?: string;
350
+ postLogoutRedirectUri?: string;
351
+ };
352
+ graphql?: Record<string, {
353
+ http: string;
354
+ ws?: string;
355
+ }>;
356
+ }
357
+ interface RuntimeEnvironmentInfo {
358
+ /** `window.location.origin`. */
359
+ readonly origin: string;
360
+ /** Prefixo do app (base href sem a barra final), ex.: `/prometeu`. Vazio na raiz. */
361
+ readonly basePath: string;
362
+ /** Sem porta na URL: o app está atrás do proxy (Caddy), não na porta direta do container. */
363
+ readonly behindProxy: boolean;
364
+ /** URL ainda sem valor real (vazia ou `CHANGE_ME`) — a única que pode ser derivada. */
365
+ readonly unset: (url: string | undefined) => boolean;
366
+ }
367
+ /**
368
+ * Ajusta o `environment` ao lugar onde o app está rodando — chamar no `main.ts`, ANTES do
369
+ * `bootstrapApplication`. Antes cada app tinha a sua versão (só o Hefesto derivava as URLs); agora a
370
+ * regra é uma só:
371
+ *
372
+ * - **Sempre:** `redirectUrl`/`postLogoutRedirectUri` = origem + prefixo atual. O servidor exige
373
+ * `redirect_uri` absoluto e o app pode viver sob um prefixo (`/prometeu`); um valor fixo no
374
+ * environment não bate com a rota real e o callback nunca casa.
375
+ * - **Atrás do proxy (sem porta na URL):**
376
+ * - `authority` = `<origem>/argos` — mesmo domínio da página, senão o cookie de sessão sai com o
377
+ * escopo errado e a sessão não persiste (bug já visto no argos);
378
+ * - cada endpoint GraphQL **ainda sem valor real** vira `<origem><prefixo>/graphql` (HTTP e WS —
379
+ * o WebSocket atende no mesmo caminho do HTTP em todo GraphQL do astra). URL explícita no
380
+ * environment sempre ganha: em prod o front pode estar num domínio e o backend em outro.
381
+ *
382
+ * Devolve `origin`/`basePath`/`behindProxy`/`unset` pro que for específico do app (ex.: a URL da
383
+ * API REST do hefesto-server).
384
+ */
385
+ declare function applyRuntimeEnvironment(environment: RuntimeEnvironmentShape): RuntimeEnvironmentInfo;
386
+
387
+ /**
388
+ * Ilustração gerada pelo spine, nas cores do tema em vigor: o ícone da novidade no centro e,
389
+ * opcionalmente, selos (ícone + rótulo) orbitando em volta. Ícones são nomes do @trismegisto/icons.
390
+ */
391
+ interface SpineNewsIllustration {
392
+ readonly icon: string;
393
+ readonly satellites?: readonly {
394
+ readonly icon: string;
395
+ readonly label: string;
396
+ }[];
397
+ }
398
+ /** Um slide do painel de novidades. */
399
+ interface SpineNewsSlide {
400
+ readonly title: string;
401
+ readonly text: string;
402
+ /** Ilustração desenhada pelo spine (recomendado — acompanha tema claro/escuro e família). */
403
+ readonly illustration?: SpineNewsIllustration;
404
+ /** Imagem própria (caminho em `assets/` do app); vence a `illustration`. Sem nenhuma das duas, o
405
+ * slide é só texto. */
406
+ readonly image?: string;
407
+ /** Descrição da imagem pra quem não a vê. Vazia marca a imagem como decorativa. */
408
+ readonly alt?: string;
409
+ }
410
+ /**
411
+ * Uma novidade do app: aparece sozinha uma vez por navegador, depois do tour de boas-vindas, e fica
412
+ * marcada como vista ao ser exibida.
413
+ */
414
+ interface SpineNewsItem {
415
+ /** Chave estável. Trocar o id faz a novidade aparecer de novo para todo mundo. */
416
+ readonly id: string;
417
+ readonly slides: readonly SpineNewsSlide[];
418
+ /** Data (AAAA-MM-DD) a partir da qual a novidade deixa de ser oferecida. Opcional. */
419
+ readonly until?: string;
420
+ }
421
+ /** Multi: cada chamada de `provideSpineNews` contribui com uma lista. */
422
+ declare const SPINE_NEWS: InjectionToken<readonly (readonly SpineNewsItem[])[]>;
423
+ /**
424
+ * Registra as novidades do app (no `app.config.ts`, junto do `provideUi`). Ficam no código, no
425
+ * mesmo commit da funcionalidade que anunciam. A ordem da lista é a ordem dos slides.
426
+ *
427
+ * ```ts
428
+ * provideSpineNews([
429
+ * { id: 'build-com-versao-2026-09', slides: [{ title: 'Build direto da linha', text: '…' }] },
430
+ * ]),
431
+ * ```
432
+ */
433
+ declare function provideSpineNews(items: readonly SpineNewsItem[]): EnvironmentProviders;
434
+
435
+ /**
436
+ * Textos do próprio spine (cabeçalho, navegação, configurações, tour, telas do auto-serviço…), no
437
+ * mesmo formato do `HermesMessages` da lib: seção → chave, parâmetros nomeados (`{name}`) e plural
438
+ * por `PluralMessage`. Alguns textos levam marcação simples (`<b>`, `<strong>`, `<code>`) e são
439
+ * exibidos com `[innerHTML]` — estão indicados no comentário.
440
+ *
441
+ * O idioma ativo é o do `HermesI18nService` da lib: `setLocale` troca a lib e o spine juntos.
442
+ */
443
+ interface SpineMessages {
444
+ meta: {
445
+ locale: string;
446
+ };
447
+ header: {
448
+ home: string;
449
+ apps: string;
450
+ themeDark: string;
451
+ themeLight: string;
452
+ densityComfortable: string;
453
+ densityCompact: string;
454
+ fullscreen: string;
455
+ exitFullscreen: string;
456
+ user: string;
457
+ accessLevels: string;
458
+ settings: string;
459
+ appearance: string;
460
+ shortcuts: string;
461
+ tour: string;
462
+ news: string;
463
+ logout: string;
464
+ search: string;
465
+ searchPlaceholder: string;
466
+ recentSearches: string;
467
+ clearRecent: string;
468
+ /** `{term}` = o que foi digitado. */
469
+ noResults: string;
470
+ };
471
+ navigation: {
472
+ back: string;
473
+ home: string;
474
+ favorite: string;
475
+ unfavorite: string;
476
+ copyLink: string;
477
+ linkCopied: string;
478
+ };
479
+ sidebar: {
480
+ modules: string;
481
+ /** `{module}` = nome do módulo aberto. */
482
+ moduleNavigation: string;
483
+ apps: string;
484
+ };
485
+ pageBar: {
486
+ favorite: string;
487
+ unfavorite: string;
488
+ copyLink: string;
489
+ linkCopied: string;
490
+ docs: string;
491
+ trail: string;
492
+ };
493
+ pagePanel: {
494
+ notFoundTitle: string;
495
+ notFoundText: string;
496
+ };
497
+ docs: {
498
+ heading: string;
499
+ index: string;
500
+ search: string;
501
+ noMatch: string;
502
+ empty: string;
503
+ view: string;
504
+ usage: string;
505
+ technical: string;
506
+ loading: string;
507
+ loadError: string;
508
+ /** Convite no lado da leitura enquanto nenhuma página do índice foi aberta. */
509
+ invite: string;
510
+ };
511
+ news: {
512
+ heading: string;
513
+ carousel: string;
514
+ dismiss: string;
515
+ };
516
+ /** Tour guiado. As descrições (`*Text`) levam `<b>` e são exibidas com `[innerHTML]`. */
517
+ tour: {
518
+ /** `{current}` de `{total}`. */
519
+ progress: string;
520
+ skip: string;
521
+ back: string;
522
+ next: string;
523
+ finish: string;
524
+ welcomeTitle: string;
525
+ welcomeText: string;
526
+ appsTitle: string;
527
+ appsText: string;
528
+ searchTitle: string;
529
+ searchText: string;
530
+ navModulesTitle: string;
531
+ navModulesText: string;
532
+ navModeTitle: string;
533
+ navModeText: string;
534
+ tabsTitle: string;
535
+ tabsText: string;
536
+ splitTitle: string;
537
+ splitText: string;
538
+ whereTitle: string;
539
+ whereText: string;
540
+ themeTitle: string;
541
+ themeText: string;
542
+ densityTitle: string;
543
+ densityText: string;
544
+ fullscreenTitle: string;
545
+ fullscreenText: string;
546
+ profileTitle: string;
547
+ profileText: string;
548
+ doneTitle: string;
549
+ doneText: string;
550
+ };
551
+ shortcuts: {
552
+ heading: string;
553
+ /** `{key}` vira a tecla desenhada como chip. */
554
+ hint: string;
555
+ replayTour: string;
556
+ dismiss: string;
557
+ openSearch: string;
558
+ goHome: string;
559
+ goFavorite: string;
560
+ history: string;
561
+ openSettings: string;
562
+ toggleTheme: string;
563
+ fullscreen: string;
564
+ logout: string;
565
+ showHelp: string;
566
+ closeOverlay: string;
567
+ };
568
+ settings: {
569
+ heading: string;
570
+ appearance: string;
571
+ appearanceKeywords: string;
572
+ theme: string;
573
+ themeDescription: string;
574
+ themeKeywords: string;
575
+ themeLight: string;
576
+ themeDark: string;
577
+ themeSystem: string;
578
+ accent: string;
579
+ accentDescription: string;
580
+ accentKeywords: string;
581
+ density: string;
582
+ densityDescription: string;
583
+ densityKeywords: string;
584
+ comfortable: string;
585
+ compact: string;
586
+ font: string;
587
+ fontDescription: string;
588
+ fontKeywords: string;
589
+ sidebar: string;
590
+ sidebarDescription: string;
591
+ sidebarKeywords: string;
592
+ sidebarAuto: string;
593
+ sidebarFixed: string;
594
+ sidebarCompact: string;
595
+ region: string;
596
+ regionKeywords: string;
597
+ language: string;
598
+ languageDescription: string;
599
+ languageKeywords: string;
600
+ /** `{language}` = idioma padrão do app. */
601
+ languageAuto: string;
602
+ timeZone: string;
603
+ timeZoneKeywords: string;
604
+ /** `{now}` = data e hora agora no fuso escolhido. */
605
+ timeZoneHint: string;
606
+ /** `{zone}` = fuso detectado no navegador. */
607
+ timeZoneAuto: string;
608
+ shortcuts: string;
609
+ shortcutsDescription: string;
610
+ shortcutsKeywords: string;
611
+ tour: string;
612
+ tourDescription: string;
613
+ tourKeywords: string;
614
+ replayTour: string;
615
+ account: string;
616
+ accountKeywords: string;
617
+ user: string;
618
+ accessLevel: string;
619
+ accessLevelKeywords: string;
620
+ session: string;
621
+ sessionDescription: string;
622
+ sessionKeywords: string;
623
+ sessionUnknown: string;
624
+ /** `{time}` = hora. */
625
+ sessionExpired: string;
626
+ /** `{minutes}` e `{time}`. */
627
+ sessionExpiresIn: string;
628
+ sessionExpiresAt: string;
629
+ accessToken: string;
630
+ accessTokenDescription: string;
631
+ accessTokenKeywords: string;
632
+ copy: string;
633
+ appTokens: string;
634
+ appTokensDescription: string;
635
+ appTokensKeywords: string;
636
+ logout: string;
637
+ logoutDescription: string;
638
+ logoutKeywords: string;
639
+ about: string;
640
+ aboutKeywords: string;
641
+ application: string;
642
+ version: string;
643
+ versionKeywords: string;
644
+ buildDate: string;
645
+ environment: string;
646
+ environmentKeywords: string;
647
+ links: string;
648
+ linksKeywords: string;
649
+ docs: string;
650
+ reportIssue: string;
651
+ repository: string;
652
+ dependencies: string;
653
+ dependenciesDescription: string;
654
+ dependenciesKeywords: string;
655
+ supportInfo: string;
656
+ supportInfoDescription: string;
657
+ supportInfoKeywords: string;
658
+ noSessionToken: string;
659
+ tokenCopied: string;
660
+ supportCopied: string;
661
+ copyBlocked: string;
662
+ };
663
+ /** Rótulos do texto que "Informações para suporte" copia. */
664
+ support: {
665
+ application: string;
666
+ version: string;
667
+ build: string;
668
+ environment: string;
669
+ page: string;
670
+ browser: string;
671
+ screen: string;
672
+ theme: string;
673
+ /** `{theme}`, `{mode}`, `{family}`, `{density}`, `{font}`. */
674
+ themeValue: string;
675
+ timeZone: string;
676
+ accessLevel: string;
677
+ date: string;
678
+ };
679
+ appTokens: {
680
+ unavailable: string;
681
+ /** `{name}`. */
682
+ created: string;
683
+ /** `[innerHTML]`; `{date}`. */
684
+ sendHeader: string;
685
+ copyToken: string;
686
+ saved: string;
687
+ loading: string;
688
+ /** `{date}`. */
689
+ expiredOn: string;
690
+ expiresOn: string;
691
+ lastUsed: string;
692
+ never: string;
693
+ revoke: string;
694
+ confirmRevoke: string;
695
+ empty: string;
696
+ noBadges: string;
697
+ /** `[innerHTML]`; `{name}` = aplicação. */
698
+ appOnly: string;
699
+ accessLevel: string;
700
+ name: string;
701
+ namePlaceholder: string;
702
+ nameRequired: string;
703
+ nameMax: string;
704
+ validity: string;
705
+ days30: string;
706
+ days90: string;
707
+ months6: string;
708
+ year1: string;
709
+ create: string;
710
+ cancel: string;
711
+ newToken: string;
712
+ /** `{valid}` de `{max}`. */
713
+ validCount: string;
714
+ limit: string;
715
+ loadError: string;
716
+ badgesError: string;
717
+ createError: string;
718
+ copied: string;
719
+ copyFailed: string;
720
+ /** `{name}`. */
721
+ revoked: string;
722
+ revokeError: string;
723
+ };
724
+ notification: {
725
+ genericError: string;
726
+ };
727
+ graphql: {
728
+ /** Envelope ausente: o resolver estourou e o campo voltou `null` (`unwrap`). */
729
+ noResponse: string;
730
+ serviceFailure: string;
731
+ done: string;
732
+ failed: string;
733
+ };
734
+ /** Telas de acesso do shell (`/blocked`, `/no-permission`). */
735
+ access: {
736
+ blockedText: string;
737
+ blockedAction: string;
738
+ noRightsText: string;
739
+ };
740
+ /**
741
+ * Retorno do login (`/callback`) e aviso de conexão do shell (`spine-connection-banner`), sobre o
742
+ * `connectionState$`/`reauthorizationRequired$` do `@orfeu/angular`. A sessão nunca cai por isso.
743
+ */
744
+ session: {
745
+ /** Argos inalcançável (sem acesso à rede, servidor fora do ar): a sessão continua, a lib tenta de novo sozinha. */
746
+ offline: string;
747
+ reconnecting: string;
748
+ reauthorizing: string;
749
+ /** O Argos recusou a renovação e a reautorização automática não aconteceu: a pessoa decide. */
750
+ reauthorizationRequired: string;
751
+ signInAgain: string;
752
+ callbackFailedHeading: string;
753
+ callbackFailedText: string;
754
+ };
755
+ routing: {
756
+ notPublished: string;
757
+ /** `{code}` = id da rota. */
758
+ notPublishedCode: string;
759
+ };
760
+ home: {
761
+ noAccessTitle: string;
762
+ noAccessText: string;
763
+ yourScreens: string;
764
+ modules: string;
765
+ privileged: string;
766
+ recent: string;
767
+ recentCaption: string;
768
+ screenCount: PluralMessage;
769
+ /** `{name}`. */
770
+ favorite: string;
771
+ unfavorite: string;
772
+ favorites: string;
773
+ navigate: string;
774
+ settings: string;
775
+ tools: string;
776
+ systemDocs: string;
777
+ colScreen: string;
778
+ colWhere: string;
779
+ colFavorite: string;
780
+ noModule: string;
781
+ };
782
+ /** Telas do auto-serviço. Textos com `[innerHTML]` indicados. */
783
+ autoService: {
784
+ loading: string;
785
+ cancel: string;
786
+ save: string;
787
+ create: string;
788
+ edit: string;
789
+ remove: string;
790
+ search: string;
791
+ active: string;
792
+ inactive: string;
793
+ confirmChanges: string;
794
+ appsTitle: string;
795
+ appsIntro: string;
796
+ clientTitle: string;
797
+ clientIntro: string;
798
+ /** Nome acessível da faixa de abas da tela Cliente (Rotas/Roteadores/Acesso). */
799
+ clientSections: string;
800
+ tabRoutes: string;
801
+ tabRouters: string;
802
+ tabAccess: string;
803
+ /** `[innerHTML]`. */
804
+ noClients: string;
805
+ pickClient: string;
806
+ groupsTitle: string;
807
+ groupsIntro: string;
808
+ /** @deprecated não é mais exibido (o auto-serviço não repete título/explicação que a barra da página e a aba já dão). */
809
+ groupsFixed: string;
810
+ pickGroup: string;
811
+ noDescription: string;
812
+ /** @deprecated não é mais exibido (o auto-serviço não repete título/explicação que a barra da página e a aba já dão). */
813
+ pickGroupHint: string;
814
+ manageMembers: string;
815
+ membersCaption: string;
816
+ noMembers: string;
817
+ colUser: string;
818
+ colMemberSince: string;
819
+ /** `{group}`. */
820
+ membersHeading: string;
821
+ addUser: string;
822
+ userSearch: string;
823
+ role: string;
824
+ pickRole: string;
825
+ add: string;
826
+ suggestions: string;
827
+ moreSuggestions: string;
828
+ /** `{group}`. */
829
+ membersOf: string;
830
+ noMembersShort: string;
831
+ newMember: string;
832
+ /** `{user}`. */
833
+ addedBy: string;
834
+ removal: string;
835
+ removalEmpty: string;
836
+ undoRemoval: string;
837
+ saveChanges: string;
838
+ colRole: string;
839
+ colAddedAt: string;
840
+ newAccess: string;
841
+ newAccessHeading: string;
842
+ accessCaption: string;
843
+ noAccess: string;
844
+ colGroup: string;
845
+ colBadge: string;
846
+ manageRoutes: string;
847
+ group: string;
848
+ /** `{group}`. */
849
+ routesOf: string;
850
+ /** `[innerHTML]`; `{badge}`. */
851
+ guardsHint: string;
852
+ noPrivateRoutes: string;
853
+ register: string;
854
+ appsSearchIntro: string;
855
+ secretCreated: string;
856
+ pickApp: string;
857
+ disable: string;
858
+ enable: string;
859
+ delete: string;
860
+ /** Nome acessível da faixa de abas da aplicação escolhida (Operações/Acessos). */
861
+ appSections: string;
862
+ tabOperations: string;
863
+ tabAccesses: string;
864
+ editApp: string;
865
+ newApp: string;
866
+ name: string;
867
+ grants: string;
868
+ appAccessCaption: string;
869
+ noAppAccess: string;
870
+ colType: string;
871
+ manageOperations: string;
872
+ /** `{group}`. */
873
+ operationsOf: string;
874
+ noOperations: string;
875
+ operationsCaption: string;
876
+ colIdentifier: string;
877
+ colMethod: string;
878
+ colLevel: string;
879
+ colDescription: string;
880
+ colAllowedGroups: string;
881
+ groupCount: PluralMessage;
882
+ /** @deprecated não é mais exibido (o auto-serviço não repete título/explicação que a barra da página e a aba já dão). */
883
+ routersTitle: string;
884
+ newRouter: string;
885
+ routersCaption: string;
886
+ noRouters: string;
887
+ private: string;
888
+ public: string;
889
+ editRouter: string;
890
+ page: string;
891
+ hierarchy: string;
892
+ levelHeader: string;
893
+ levelNavigation: string;
894
+ levelMenu: string;
895
+ levelItem: string;
896
+ levelSubmenu: string;
897
+ privateHint: string;
898
+ routerDescription: string;
899
+ routerDescriptionHint: string;
900
+ colPage: string;
901
+ colBuiltPath: string;
902
+ colVisibility: string;
903
+ /** @deprecated não é mais exibido (o auto-serviço não repete título/explicação que a barra da página e a aba já dão). */
904
+ routesTitle: string;
905
+ newRoute: string;
906
+ routesCaption: string;
907
+ noRoutes: string;
908
+ editRoute: string;
909
+ internalName: string;
910
+ displayName: string;
911
+ icon: string;
912
+ iconPlaceholder: string;
913
+ path: string;
914
+ info: string;
915
+ excludable: string;
916
+ /** Dica do "Excluível" ao editar rota protegida: o auto-serviço não libera, só o Argos central. */
917
+ excludableLocked: string;
918
+ /** Selo da rota/roteador que veio de template (não editável pelo auto-serviço) e a explicação dele. */
919
+ templateTag: string;
920
+ templateLocked: string;
921
+ /** Exemplo e regra do caminho: um trecho só do endereço (o "/" entre níveis é o roteador que põe). */
922
+ pathPlaceholder: string;
923
+ pathHint: string;
924
+ pathInvalid: string;
925
+ colExcludable: string;
926
+ excludableYes: string;
927
+ excludableNo: string;
928
+ colName: string;
929
+ colDisplay: string;
930
+ colIcon: string;
931
+ colPath: string;
932
+ };
933
+ /**
934
+ * Tela "Auditoria" (`@trismegisto/spine/audit`, `SpineAuditComponent`): a mesma nos dois escopos — o
935
+ * auto-serviço (apps do projeto do client) e o painel central do argos admin (`scope: 'admin'`). O nome
936
+ * da chave ficou do tempo em que só o auto-serviço a tinha.
937
+ */
938
+ autoServiceAudit: {
939
+ title: string;
940
+ intro: string;
941
+ /** Aba da tela de Aplicações que abre a auditoria ali mesmo. */
942
+ tabApps: string;
943
+ period: string;
944
+ periodLastHour: string;
945
+ period24h: string;
946
+ period7d: string;
947
+ period30d: string;
948
+ /** Aviso quando o período vem das datas da faixa de filtros (a escolha rápida fica sem efeito). */
949
+ periodFromFilters: string;
950
+ filters: string;
951
+ filterDates: string;
952
+ filterApp: string;
953
+ filterUser: string;
954
+ filterOperation: string;
955
+ filterMethod: string;
956
+ filterOutcome: string;
957
+ filterEntry: string;
958
+ userPlaceholder: string;
959
+ operationPlaceholder: string;
960
+ methodRead: string;
961
+ methodWrite: string;
962
+ methodDelete: string;
963
+ methodStream: string;
964
+ outcomeSuccess: string;
965
+ outcomeFailure: string;
966
+ outcomeDenied: string;
967
+ kpiTotal: string;
968
+ kpiTotalDescription: string;
969
+ kpiFailures: string;
970
+ kpiDenied: string;
971
+ /** `{percent}`. */
972
+ kpiShare: string;
973
+ kpis: string;
974
+ timeline: string;
975
+ /** `{from}`, `{to}`. */
976
+ timelineSummary: string;
977
+ /** `{time}`, `{total}`, `{failures}`, `{denied}`. */
978
+ bucketSummary: string;
979
+ timelineEmpty: string;
980
+ topOperations: string;
981
+ topUsers: string;
982
+ topApps: string;
983
+ noTop: string;
984
+ eventCount: PluralMessage;
985
+ failureCount: PluralMessage;
986
+ deniedCount: PluralMessage;
987
+ /** `{name}`. */
988
+ filterBy: string;
989
+ eventsCaption: string;
990
+ colWhen: string;
991
+ colApp: string;
992
+ colUser: string;
993
+ colOperation: string;
994
+ colMethod: string;
995
+ colOutcome: string;
996
+ colStatus: string;
997
+ colDuration: string;
998
+ /** `{ms}`. */
999
+ durationMs: string;
1000
+ /** Rodapé da tabela: o que vem depois da contagem ("1 - 50 de 120 {pageItems}"). */
1001
+ pageItems: string;
1002
+ /** Rodapé da tabela: rótulo do seletor de eventos por página. */
1003
+ pageSize: string;
1004
+ /** Falha ao trocar de página (o resumo e a página anterior continuam). */
1005
+ pageError: string;
1006
+ loading: string;
1007
+ emptyTitle: string;
1008
+ emptyText: string;
1009
+ clearFilters: string;
1010
+ errorTitle: string;
1011
+ errorText: string;
1012
+ retry: string;
1013
+ rangeTooLarge: string;
1014
+ forbidden: string;
1015
+ anonymous: string;
1016
+ detailHeading: string;
1017
+ detailLoading: string;
1018
+ detailError: string;
1019
+ fieldWhen: string;
1020
+ fieldApp: string;
1021
+ fieldUser: string;
1022
+ fieldActor: string;
1023
+ fieldIp: string;
1024
+ fieldOperation: string;
1025
+ fieldIdentifier: string;
1026
+ fieldMethod: string;
1027
+ fieldLevel: string;
1028
+ fieldPermission: string;
1029
+ fieldOutcome: string;
1030
+ fieldStatus: string;
1031
+ fieldDuration: string;
1032
+ fieldRoute: string;
1033
+ fieldTarget: string;
1034
+ fieldOrigin: string;
1035
+ originEntry: string;
1036
+ originInternal: string;
1037
+ fieldTrace: string;
1038
+ fieldEventId: string;
1039
+ fieldMessage: string;
1040
+ fieldReceivedAt: string;
1041
+ fieldInstance: string;
1042
+ fieldSdk: string;
1043
+ fieldDetails: string;
1044
+ viewTrace: string;
1045
+ traceHeading: string;
1046
+ traceLoading: string;
1047
+ traceError: string;
1048
+ traceEmpty: string;
1049
+ traceHidden: PluralMessage;
1050
+ traceCurrent: string;
1051
+ /** `{operation}`, `{time}`. */
1052
+ openTraceEvent: string;
1053
+ /** Introdução da tela no escopo `admin` (painel central, todos os apps). */
1054
+ introAdmin: string;
1055
+ period6h: string;
1056
+ refresh: string;
1057
+ autoRefresh: string;
1058
+ /** `{time}`. */
1059
+ updatedAt: string;
1060
+ /** Rótulo do indicador enquanto a tabela/rankings recarregam (as linhas atuais continuam à vista). */
1061
+ updating: string;
1062
+ filterUserId: string;
1063
+ filterLevel: string;
1064
+ filterPermission: string;
1065
+ filterActor: string;
1066
+ filterStatus: string;
1067
+ filterTrace: string;
1068
+ userIdPlaceholder: string;
1069
+ statusPlaceholder: string;
1070
+ tracePlaceholder: string;
1071
+ levelPublic: string;
1072
+ levelPrivate: string;
1073
+ levelProtected: string;
1074
+ levelOptional: string;
1075
+ permissionAllowed: string;
1076
+ permissionForbidden: string;
1077
+ permissionUnauthorized: string;
1078
+ permissionPublic: string;
1079
+ actorUser: string;
1080
+ actorAppToken: string;
1081
+ actorApiToken: string;
1082
+ actorPublic: string;
1083
+ actorUnauthenticated: string;
1084
+ /** Escopo `admin`: a conta não tem as operações `admin:audit:*`. */
1085
+ forbiddenAdmin: string;
1086
+ /** 400 `invalid_filter` do servidor. `{detail}` = explicação dele. */
1087
+ invalidFilter: string;
1088
+ /** Descrição dos KPIs clicáveis (falhas/negados viram filtro). */
1089
+ kpiFilterHint: string;
1090
+ /** Rodapé dos rankings: `{from}`, `{to}`, `{total}`. */
1091
+ topsRange: string;
1092
+ /** `{name}` = título do ranking. */
1093
+ topsPrevious: string;
1094
+ /** `{name}` = título do ranking. */
1095
+ topsNext: string;
1096
+ topsError: string;
1097
+ filterByTrace: string;
1098
+ /** Rótulo do alternador "Ações | Eventos". */
1099
+ unitLabel: string;
1100
+ unitActions: string;
1101
+ unitEvents: string;
1102
+ kpiTotalActions: string;
1103
+ kpiTotalActionsDescription: string;
1104
+ /** `{from}`, `{to}`. */
1105
+ timelineSummaryActions: string;
1106
+ /** `{time}`, `{total}`, `{failures}`, `{denied}`. */
1107
+ bucketSummaryActions: string;
1108
+ timelineEmptyActions: string;
1109
+ actionsCaption: string;
1110
+ pageItemsActions: string;
1111
+ pageErrorActions: string;
1112
+ emptyTitleActions: string;
1113
+ /** Coluna com a quantidade de spans (registros) da ação. */
1114
+ colSpans: string;
1115
+ /** Dica da célula de spans: `{apps}` = aplicações envolvidas. */
1116
+ spansApps: string;
1117
+ /** Spans de fora do escopo do client: contados à parte. */
1118
+ spansHidden: PluralMessage;
1119
+ actionDetailHeading: string;
1120
+ /** Ação sem a entrada (entry) no período: começa por uma chamada entre aplicações. */
1121
+ orphanNote: string;
1122
+ orphanTag: string;
1123
+ spansHeading: string;
1124
+ /** Linha do tempo dos spans: `{count}` spans em `{duration}`. */
1125
+ spansSummary: string;
1126
+ /** `{app}`, `{operation}`, `{outcome}`, `{offset}`, `{duration}`. */
1127
+ spanRow: string;
1128
+ };
1129
+ }
1130
+ declare const SPINE_MESSAGES_PT_BR: SpineMessages;
1131
+
1132
+ declare const SPINE_MESSAGES_EN: SpineMessages;
1133
+
1134
+ declare const SPINE_MESSAGES_ES: SpineMessages;
1135
+
1136
+ type SpineMessagesOverride = CatalogOverride<SpineMessages>;
1137
+ interface SpineI18nConfig {
1138
+ /** Catálogos extras ou substitutos, por idioma (mesmas chaves do `SpineMessages`). */
1139
+ readonly catalogs?: Readonly<Record<string, SpineMessages>>;
1140
+ /** Textos avulsos sobrescritos por cima do catálogo ativo, em qualquer idioma. */
1141
+ readonly override?: SpineMessagesOverride;
1142
+ }
1143
+ declare const SPINE_I18N_CONFIG: InjectionToken<SpineI18nConfig>;
1144
+ /**
1145
+ * Textos do spine no idioma ativo para quem não tem injeção (funções puras como o `unwrap` do
1146
+ * `@trismegisto/spine/graphql`, chamado em qualquer lugar do app). É o mesmo catálogo vivo do
1147
+ * `SPINE_MESSAGES` — segue `setLocale` — assim que o shell o injetou; antes disso, o pt-BR.
1148
+ */
1149
+ declare function currentSpineMessages(): SpineMessages;
1150
+ /**
1151
+ * Textos do spine no idioma ativo da lib (`HermesI18nService.locale`): uma troca de idioma com
1152
+ * `setLocale` atualiza a lib e o spine juntos, sem recarregar. Leitura igual à do `HERMES_MESSAGES`
1153
+ * (`inject(SPINE_MESSAGES).header.settings`), viva também em template.
1154
+ */
1155
+ declare const SPINE_MESSAGES: InjectionToken<SpineMessages>;
1156
+ /** Sobrescreve textos do spine e/ou acrescenta idiomas. O idioma em si vem de `provideHermesI18n`. */
1157
+ declare function provideSpineMessages(config: SpineI18nConfig): Provider;
1158
+
1159
+ export { APP_PACKAGE_INFO, DensityService, HERMES_DS_IMPORTS, SPINE_ADMIN_API, SPINE_CONFIG, SPINE_DEFAULT_LOGO, SPINE_I18N_CONFIG, SPINE_MESSAGES, SPINE_MESSAGES_EN, SPINE_MESSAGES_ES, SPINE_MESSAGES_PT_BR, SPINE_NEWS, SpinePreferencesService, SpineQuickAccessService, ThemePresetService, ThemeService, applyRuntimeEnvironment, applySpineFavicon, currentSpineMessages, mergeRouteTree, provideSpineMessages, provideSpineNews, provideUi, resolveSpineLogo, routerIdOf, spineRoutesOf };
1160
+ export type { DensitySetting, PackageInfo, QuickAccessItem, Route, RuntimeEnvironmentInfo, RuntimeEnvironmentShape, SpineConfig, SpineI18nConfig, SpineLogoConfig, SpineLogoSources, SpineMessages, SpineMessagesOverride, SpineNewsIllustration, SpineNewsItem, SpineNewsSlide };
1161
+ //# sourceMappingURL=trismegisto-spine.d.ts.map