@praxisui/core 1.0.0-beta.59 → 1.0.0-beta.61

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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Component, InjectionToken, Injectable, inject, Inject, makeEnvironmentProviders, Optional, ENVIRONMENT_INITIALIZER, ErrorHandler, APP_INITIALIZER, Input, Directive, ViewContainerRef, EventEmitter, Output, ContentChild, ChangeDetectionStrategy, signal, HostListener, computed, ViewChild } from '@angular/core';
2
+ import { Component, InjectionToken, Injectable, inject, Inject, makeEnvironmentProviders, Optional, ENVIRONMENT_INITIALIZER, ErrorHandler, APP_INITIALIZER, Input, ChangeDetectionStrategy, Directive, SecurityContext, EventEmitter, Output, ViewContainerRef, ContentChild, signal, HostListener, computed, ViewChild } from '@angular/core';
3
3
  import * as i1 from '@angular/common/http';
4
4
  import { HttpHeaders, HttpClient, HttpParams, HttpContextToken, HTTP_INTERCEPTORS, withInterceptors } from '@angular/common/http';
5
5
  import { of, defer, throwError, from, EMPTY, BehaviorSubject, firstValueFrom, Subject } from 'rxjs';
@@ -10,10 +10,11 @@ import { Router, ActivatedRoute } from '@angular/router';
10
10
  import * as i2$1 from '@angular/forms';
11
11
  import { Validators, FormGroup, FormControl, FormsModule } from '@angular/forms';
12
12
  import { MatSnackBar } from '@angular/material/snack-bar';
13
- import * as i2 from '@angular/material/button';
14
- import { MatButtonModule } from '@angular/material/button';
15
13
  import * as i3 from '@angular/material/icon';
16
14
  import { MatIconModule } from '@angular/material/icon';
15
+ import { DomSanitizer } from '@angular/platform-browser';
16
+ import * as i2 from '@angular/material/button';
17
+ import { MatButtonModule } from '@angular/material/button';
17
18
  import * as i4 from '@angular/material/menu';
18
19
  import { MatMenuModule } from '@angular/material/menu';
19
20
  import * as i5 from '@angular/material/tooltip';
@@ -3748,6 +3749,18 @@ function inferType(def) {
3748
3749
  return 'string';
3749
3750
  }
3750
3751
 
3752
+ const EDITORIAL_WIDGET_CONVENTION_INPUTS = [
3753
+ 'instanceId',
3754
+ 'analyticsId',
3755
+ 'ariaLabel',
3756
+ 'contentFormat',
3757
+ 'links',
3758
+ ];
3759
+ const EDITORIAL_WIDGET_TAG = 'editorial-widget';
3760
+ function isEditorialComponentMeta(meta) {
3761
+ return !!meta?.tags?.includes(EDITORIAL_WIDGET_TAG);
3762
+ }
3763
+
3751
3764
  /**
3752
3765
  * Simple in-memory registry of component documentation metadata.
3753
3766
  *
@@ -3794,6 +3807,16 @@ class ComponentMetadataRegistry {
3794
3807
  filterCriteria: { label: 'Filtro', description: 'Critérios de filtro (JSON/expressão) aplicados a dados/listas.' },
3795
3808
  bindingOrder: { label: 'Ordem de Binding', description: 'Ordem de avaliação/atribuição das entradas do componente.' },
3796
3809
  };
3810
+ const editorialInputDefaults = {
3811
+ instanceId: { label: 'Instance ID', description: 'Identificador estável da instância do widget para telemetria, testes e correlação.' },
3812
+ analyticsId: { label: 'Analytics ID', description: 'Identificador lógico usado para telemetria e análise agregada do widget.' },
3813
+ ariaLabel: { label: 'Aria Label', description: 'Rótulo acessível aplicado ao bloco editorial quando necessário.' },
3814
+ contentFormat: { label: 'Formato do conteúdo', description: 'Formato editorial permitido para renderização do conteúdo (ex.: plain, markdown).' },
3815
+ links: { label: 'Links', description: 'Lista de links editoriais com política explícita de navegação e segurança.' },
3816
+ };
3817
+ const effectiveInputDefaults = isEditorialComponentMeta(meta)
3818
+ ? { ...inputDefaults, ...editorialInputDefaults }
3819
+ : inputDefaults;
3797
3820
  const outputDefaults = {
3798
3821
  rowClick: { label: 'Clique na linha', description: 'Emitido ao clicar/selecionar uma linha na tabela.' },
3799
3822
  widgetEvent: { label: 'Evento do widget', description: 'Eventos internos reemitidos com contexto do container.' },
@@ -3805,7 +3828,7 @@ class ComponentMetadataRegistry {
3805
3828
  change: { label: 'Alteração', description: 'Eventos genéricos de alteração.' },
3806
3829
  };
3807
3830
  const normInputs = (meta.inputs || []).map((inp) => {
3808
- const d = inputDefaults[inp.name];
3831
+ const d = effectiveInputDefaults[inp.name];
3809
3832
  if (!d)
3810
3833
  return inp;
3811
3834
  return {
@@ -8042,6 +8065,9 @@ function createDefaultFormConfig() {
8042
8065
  ],
8043
8066
  },
8044
8067
  ],
8068
+ formBlocksBefore: [],
8069
+ formBlocksBeforeActions: [],
8070
+ formBlocksAfter: [],
8045
8071
  // Default mode hints (didactic tooltips)
8046
8072
  hints: getDefaultFormHints(),
8047
8073
  };
@@ -8054,7 +8080,7 @@ function isValidFormConfig(config) {
8054
8080
  * Cria configuração vazia para inicialização
8055
8081
  */
8056
8082
  function createEmptyFormConfig() {
8057
- return { sections: [] };
8083
+ return { sections: [], formBlocksBefore: [], formBlocksBeforeActions: [], formBlocksAfter: [] };
8058
8084
  }
8059
8085
  /**
8060
8086
  * Default hint texts for data and UI modes.
@@ -11236,6 +11262,330 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
11236
11262
  ],
11237
11263
  };
11238
11264
 
11265
+ const EDITORIAL_ALLOWED_CONTENT_FORMATS = ['plain', 'markdown'];
11266
+ const EDITORIAL_HTML_ENABLED = false;
11267
+ const EDITORIAL_MARKDOWN_IMAGES_ENABLED = false;
11268
+ const EDITORIAL_EXTERNAL_LINK_REL = 'noopener noreferrer';
11269
+ const DISALLOWED_HREF_PROTOCOL = /^(javascript|data|vbscript|file):/i;
11270
+ const ABSOLUTE_HTTP_PROTOCOL = /^https?:\/\//i;
11271
+ const RELATIVE_OR_SPECIAL_HREF = /^(\/|\.\/|\.\.\/|#|mailto:|tel:)/i;
11272
+ function isAllowedEditorialContentFormat(value) {
11273
+ return value === 'plain' || value === 'markdown';
11274
+ }
11275
+ function isAllowedEditorialHref(href) {
11276
+ if (typeof href !== 'string')
11277
+ return false;
11278
+ const trimmed = href.trim();
11279
+ if (!trimmed)
11280
+ return false;
11281
+ if (DISALLOWED_HREF_PROTOCOL.test(trimmed))
11282
+ return false;
11283
+ return ABSOLUTE_HTTP_PROTOCOL.test(trimmed) || RELATIVE_OR_SPECIAL_HREF.test(trimmed);
11284
+ }
11285
+ function normalizeEditorialLink(link) {
11286
+ const label = typeof link?.label === 'string' ? link.label.trim() : '';
11287
+ const href = typeof link?.href === 'string' ? link.href.trim() : '';
11288
+ if (!label || !isAllowedEditorialHref(href)) {
11289
+ return null;
11290
+ }
11291
+ const isExternalHttp = ABSOLUTE_HTTP_PROTOCOL.test(href);
11292
+ const external = isExternalHttp ? true : (link.external ?? false);
11293
+ const target = external ? '_blank' : (link.target ?? '_self');
11294
+ const rel = external ? mergeRel(link.rel, EDITORIAL_EXTERNAL_LINK_REL) : link.rel;
11295
+ return {
11296
+ ...link,
11297
+ label,
11298
+ href,
11299
+ external,
11300
+ target,
11301
+ rel,
11302
+ };
11303
+ }
11304
+ function mergeRel(current, required) {
11305
+ const parts = new Set((current || '').split(/\s+/).filter(Boolean));
11306
+ for (const token of required.split(/\s+/)) {
11307
+ parts.add(token);
11308
+ }
11309
+ return Array.from(parts).join(' ');
11310
+ }
11311
+
11312
+ class PraxisFooterLinksComponent {
11313
+ instanceId;
11314
+ analyticsId;
11315
+ ariaLabel;
11316
+ brandText;
11317
+ secondaryText;
11318
+ links = [];
11319
+ layout = 'inline';
11320
+ get normalizedLinks() {
11321
+ return (this.links || [])
11322
+ .map((link) => normalizeEditorialLink(link))
11323
+ .filter((link) => !!link);
11324
+ }
11325
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisFooterLinksComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11326
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.17", type: PraxisFooterLinksComponent, isStandalone: true, selector: "praxis-footer-links", inputs: { instanceId: "instanceId", analyticsId: "analyticsId", ariaLabel: "ariaLabel", brandText: "brandText", secondaryText: "secondaryText", links: "links", layout: "layout" }, host: { attributes: { "role": "contentinfo" }, properties: { "attr.data-instance-id": "instanceId || null", "attr.data-analytics-id": "analyticsId || null", "attr.aria-label": "ariaLabel || null" }, classAttribute: "praxis-footer-links" }, ngImport: i0, template: `
11327
+ <footer class="pfl-shell" [class.pfl-stacked]="layout === 'stacked'">
11328
+ <div class="pfl-brand" *ngIf="brandText || secondaryText">
11329
+ <strong class="pfl-brand-text" *ngIf="brandText">{{ brandText }}</strong>
11330
+ <span class="pfl-secondary-text" *ngIf="secondaryText">{{ secondaryText }}</span>
11331
+ </div>
11332
+
11333
+ <nav class="pfl-nav" aria-label="Links institucionais">
11334
+ <a
11335
+ *ngFor="let link of normalizedLinks"
11336
+ class="pfl-link"
11337
+ [href]="link.href"
11338
+ [attr.target]="link.target || null"
11339
+ [attr.rel]="link.rel || null"
11340
+ >
11341
+ {{ link.label }}
11342
+ </a>
11343
+ </nav>
11344
+ </footer>
11345
+ `, isInline: true, styles: [":host{display:block}.pfl-shell{display:flex;align-items:center;justify-content:space-between;gap:16px 24px;padding:16px 4px 4px;border-top:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 78%,transparent)}.pfl-stacked{flex-direction:column;align-items:flex-start}.pfl-brand{display:grid;gap:4px}.pfl-brand-text{color:var(--md-sys-color-on-surface);font-size:.92rem;font-weight:700}.pfl-secondary-text{color:var(--md-sys-color-on-surface-variant);font-size:.8rem;line-height:1.5}.pfl-nav{display:flex;flex-wrap:wrap;gap:10px 16px}.pfl-link{color:var(--md-sys-color-primary);font-size:.84rem;line-height:1.5;text-decoration:underline;text-underline-offset:2px}@media(max-width:720px){.pfl-shell{flex-direction:column;align-items:flex-start}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11346
+ }
11347
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisFooterLinksComponent, decorators: [{
11348
+ type: Component,
11349
+ args: [{ selector: 'praxis-footer-links', standalone: true, imports: [CommonModule], host: {
11350
+ 'class': 'praxis-footer-links',
11351
+ '[attr.data-instance-id]': 'instanceId || null',
11352
+ '[attr.data-analytics-id]': 'analyticsId || null',
11353
+ '[attr.aria-label]': 'ariaLabel || null',
11354
+ 'role': 'contentinfo',
11355
+ }, template: `
11356
+ <footer class="pfl-shell" [class.pfl-stacked]="layout === 'stacked'">
11357
+ <div class="pfl-brand" *ngIf="brandText || secondaryText">
11358
+ <strong class="pfl-brand-text" *ngIf="brandText">{{ brandText }}</strong>
11359
+ <span class="pfl-secondary-text" *ngIf="secondaryText">{{ secondaryText }}</span>
11360
+ </div>
11361
+
11362
+ <nav class="pfl-nav" aria-label="Links institucionais">
11363
+ <a
11364
+ *ngFor="let link of normalizedLinks"
11365
+ class="pfl-link"
11366
+ [href]="link.href"
11367
+ [attr.target]="link.target || null"
11368
+ [attr.rel]="link.rel || null"
11369
+ >
11370
+ {{ link.label }}
11371
+ </a>
11372
+ </nav>
11373
+ </footer>
11374
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.pfl-shell{display:flex;align-items:center;justify-content:space-between;gap:16px 24px;padding:16px 4px 4px;border-top:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 78%,transparent)}.pfl-stacked{flex-direction:column;align-items:flex-start}.pfl-brand{display:grid;gap:4px}.pfl-brand-text{color:var(--md-sys-color-on-surface);font-size:.92rem;font-weight:700}.pfl-secondary-text{color:var(--md-sys-color-on-surface-variant);font-size:.8rem;line-height:1.5}.pfl-nav{display:flex;flex-wrap:wrap;gap:10px 16px}.pfl-link{color:var(--md-sys-color-primary);font-size:.84rem;line-height:1.5;text-decoration:underline;text-underline-offset:2px}@media(max-width:720px){.pfl-shell{flex-direction:column;align-items:flex-start}}\n"] }]
11375
+ }], propDecorators: { instanceId: [{
11376
+ type: Input
11377
+ }], analyticsId: [{
11378
+ type: Input
11379
+ }], ariaLabel: [{
11380
+ type: Input
11381
+ }], brandText: [{
11382
+ type: Input
11383
+ }], secondaryText: [{
11384
+ type: Input
11385
+ }], links: [{
11386
+ type: Input
11387
+ }], layout: [{
11388
+ type: Input
11389
+ }] } });
11390
+
11391
+ const PRAXIS_FOOTER_LINKS_METADATA = {
11392
+ id: 'widget:footer-links',
11393
+ selector: 'praxis-footer-links',
11394
+ component: PraxisFooterLinksComponent,
11395
+ friendlyName: 'Footer Links',
11396
+ description: 'Rodapé institucional com marca opcional, texto secundário e links normalizados pela policy editorial.',
11397
+ icon: 'footer',
11398
+ inputs: [
11399
+ { name: 'instanceId', type: 'string', label: 'Instance ID', description: 'Identificador estável da instância editorial.' },
11400
+ { name: 'analyticsId', type: 'string', label: 'Analytics ID', description: 'Identificador opcional de telemetria agregada.' },
11401
+ { name: 'ariaLabel', type: 'string', label: 'Aria Label', description: 'Rótulo acessível opcional do rodapé institucional.' },
11402
+ { name: 'brandText', type: 'string', label: 'Marca', description: 'Texto principal opcional da marca ou instituição.' },
11403
+ { name: 'secondaryText', type: 'string', label: 'Texto secundário', description: 'Texto secundário opcional do rodapé.' },
11404
+ { name: 'links', type: 'EditorialLinkDefinition[]', label: 'Links', description: 'Lista ordenada de links institucionais.' },
11405
+ { name: 'layout', type: "'inline' | 'stacked'", label: 'Layout', description: 'Layout inicial do rodapé institucional.', default: 'inline' },
11406
+ ],
11407
+ outputs: [],
11408
+ tags: ['widget', 'editorial', 'footer', 'links', EDITORIAL_WIDGET_TAG],
11409
+ lib: '@praxisui/core',
11410
+ };
11411
+ function providePraxisFooterLinksMetadata() {
11412
+ return {
11413
+ provide: ENVIRONMENT_INITIALIZER,
11414
+ multi: true,
11415
+ useFactory: (registry) => () => {
11416
+ registry.register(PRAXIS_FOOTER_LINKS_METADATA);
11417
+ },
11418
+ deps: [ComponentMetadataRegistry],
11419
+ };
11420
+ }
11421
+
11422
+ class PraxisHeroBannerComponent {
11423
+ instanceId;
11424
+ analyticsId;
11425
+ ariaLabel;
11426
+ title;
11427
+ subtitle;
11428
+ description;
11429
+ imageUrl;
11430
+ imageAlt;
11431
+ badges = [];
11432
+ metaItems = [];
11433
+ variant = 'default';
11434
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisHeroBannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11435
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.17", type: PraxisHeroBannerComponent, isStandalone: true, selector: "praxis-hero-banner", inputs: { instanceId: "instanceId", analyticsId: "analyticsId", ariaLabel: "ariaLabel", title: "title", subtitle: "subtitle", description: "description", imageUrl: "imageUrl", imageAlt: "imageAlt", badges: "badges", metaItems: "metaItems", variant: "variant" }, host: { properties: { "attr.data-instance-id": "instanceId || null", "attr.data-analytics-id": "analyticsId || null", "attr.aria-label": "ariaLabel || null", "attr.role": "ariaLabel ? \"region\" : null", "attr.data-variant": "variant" }, classAttribute: "praxis-hero-banner" }, ngImport: i0, template: `
11436
+ <section class="phb-shell" [class.phb-event]="variant === 'event'" [class.phb-institutional]="variant === 'institutional'">
11437
+ <div class="phb-copy">
11438
+ <div class="phb-badges" *ngIf="badges?.length">
11439
+ <span
11440
+ class="phb-badge"
11441
+ *ngFor="let badge of badges"
11442
+ [class.phb-badge-highlight]="badge.tone === 'highlight'"
11443
+ [class.phb-badge-muted]="badge.tone === 'muted'"
11444
+ [class.phb-badge-warning]="badge.tone === 'warning'"
11445
+ >
11446
+ {{ badge.label }}
11447
+ </span>
11448
+ </div>
11449
+
11450
+ <div class="phb-text">
11451
+ <p class="phb-subtitle" *ngIf="subtitle">{{ subtitle }}</p>
11452
+ <h2 class="phb-title" *ngIf="title">{{ title }}</h2>
11453
+ <p class="phb-description" *ngIf="description">{{ description }}</p>
11454
+ </div>
11455
+
11456
+ <dl class="phb-meta" *ngIf="metaItems?.length">
11457
+ <div class="phb-meta-item" *ngFor="let item of metaItems">
11458
+ <dt>{{ item.label }}</dt>
11459
+ <dd>{{ item.value }}</dd>
11460
+ </div>
11461
+ </dl>
11462
+ </div>
11463
+
11464
+ <div class="phb-visual" *ngIf="imageUrl; else noImage">
11465
+ <img class="phb-image" [src]="imageUrl" [alt]="imageAlt || title || subtitle || 'Imagem do destaque'" />
11466
+ </div>
11467
+
11468
+ <ng-template #noImage>
11469
+ <div class="phb-visual phb-visual-fallback" aria-hidden="true">
11470
+ <div class="phb-orb phb-orb-a"></div>
11471
+ <div class="phb-orb phb-orb-b"></div>
11472
+ <div class="phb-grid"></div>
11473
+ </div>
11474
+ </ng-template>
11475
+ </section>
11476
+ `, isInline: true, styles: [":host{display:block}.phb-shell{display:grid;grid-template-columns:minmax(0,1.45fr) minmax(240px,.95fr);gap:22px;align-items:stretch;padding:22px;border-radius:28px;overflow:hidden;background:radial-gradient(circle at top right,rgba(65,142,255,.18),transparent 38%),linear-gradient(135deg,#fbfcff,#eef4ff 54%,#f8f9fc);border:1px solid rgba(58,84,135,.14);box-shadow:0 24px 60px #10182814}.phb-event{background:radial-gradient(circle at top right,rgba(255,184,77,.26),transparent 34%),linear-gradient(135deg,#fffaf0,#fff1d6 45%,#fff9f2)}.phb-institutional{background:radial-gradient(circle at top right,rgba(17,94,89,.18),transparent 34%),linear-gradient(135deg,#f7fbfa,#e9f6f3 48%,#f8fcfb)}.phb-copy{display:grid;gap:18px;min-width:0}.phb-badges{display:flex;flex-wrap:wrap;gap:8px}.phb-badge{display:inline-flex;align-items:center;min-height:28px;padding:0 12px;border-radius:999px;background:#0e1f3514;color:#17314f;font-size:.76rem;font-weight:700;letter-spacing:.02em}.phb-badge-highlight{background:#1f63ff1f;color:#1843ad}.phb-badge-muted{background:#6373811f;color:#43515f}.phb-badge-warning{background:#c628281f;color:#a62828}.phb-text{display:grid;gap:8px}.phb-subtitle{margin:0;color:#31506f;font-size:.9rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.phb-title{margin:0;color:#10233a;font-size:clamp(1.6rem,2.2vw,2.5rem);line-height:1.08;letter-spacing:-.03em}.phb-description{margin:0;max-width:56ch;color:#39506a;font-size:.98rem;line-height:1.65}.phb-meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin:0}.phb-meta-item{display:grid;gap:4px;padding:12px 14px;border-radius:16px;background:#ffffff9e;border:1px solid rgba(58,84,135,.12);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.phb-meta-item dt{margin:0;color:#5e7185;font-size:.73rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.phb-meta-item dd{margin:0;color:#17314f;font-size:.92rem;line-height:1.45}.phb-visual{position:relative;min-height:220px;border-radius:22px;overflow:hidden;background:linear-gradient(160deg,#0d1d3324,#3c76ff14)}.phb-image{display:block;width:100%;height:100%;object-fit:cover}.phb-visual-fallback{background:linear-gradient(180deg,#ffffff47,#ffffff14),linear-gradient(145deg,#21417c38,#71a1ff1f)}.phb-orb{position:absolute;border-radius:999px;filter:blur(2px)}.phb-orb-a{inset:24px auto auto 20px;width:86px;height:86px;background:#ffffff9e}.phb-orb-b{inset:auto 16px 18px auto;width:132px;height:132px;background:#346aff38}.phb-grid{position:absolute;inset:0;background-image:linear-gradient(rgba(255,255,255,.16) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.16) 1px,transparent 1px);background-size:24px 24px;opacity:.5}@media(max-width:900px){.phb-shell{grid-template-columns:1fr;padding:18px}.phb-visual{order:-1;min-height:180px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11477
+ }
11478
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisHeroBannerComponent, decorators: [{
11479
+ type: Component,
11480
+ args: [{ selector: 'praxis-hero-banner', standalone: true, imports: [CommonModule], host: {
11481
+ 'class': 'praxis-hero-banner',
11482
+ '[attr.data-instance-id]': 'instanceId || null',
11483
+ '[attr.data-analytics-id]': 'analyticsId || null',
11484
+ '[attr.aria-label]': 'ariaLabel || null',
11485
+ '[attr.role]': 'ariaLabel ? "region" : null',
11486
+ '[attr.data-variant]': 'variant',
11487
+ }, template: `
11488
+ <section class="phb-shell" [class.phb-event]="variant === 'event'" [class.phb-institutional]="variant === 'institutional'">
11489
+ <div class="phb-copy">
11490
+ <div class="phb-badges" *ngIf="badges?.length">
11491
+ <span
11492
+ class="phb-badge"
11493
+ *ngFor="let badge of badges"
11494
+ [class.phb-badge-highlight]="badge.tone === 'highlight'"
11495
+ [class.phb-badge-muted]="badge.tone === 'muted'"
11496
+ [class.phb-badge-warning]="badge.tone === 'warning'"
11497
+ >
11498
+ {{ badge.label }}
11499
+ </span>
11500
+ </div>
11501
+
11502
+ <div class="phb-text">
11503
+ <p class="phb-subtitle" *ngIf="subtitle">{{ subtitle }}</p>
11504
+ <h2 class="phb-title" *ngIf="title">{{ title }}</h2>
11505
+ <p class="phb-description" *ngIf="description">{{ description }}</p>
11506
+ </div>
11507
+
11508
+ <dl class="phb-meta" *ngIf="metaItems?.length">
11509
+ <div class="phb-meta-item" *ngFor="let item of metaItems">
11510
+ <dt>{{ item.label }}</dt>
11511
+ <dd>{{ item.value }}</dd>
11512
+ </div>
11513
+ </dl>
11514
+ </div>
11515
+
11516
+ <div class="phb-visual" *ngIf="imageUrl; else noImage">
11517
+ <img class="phb-image" [src]="imageUrl" [alt]="imageAlt || title || subtitle || 'Imagem do destaque'" />
11518
+ </div>
11519
+
11520
+ <ng-template #noImage>
11521
+ <div class="phb-visual phb-visual-fallback" aria-hidden="true">
11522
+ <div class="phb-orb phb-orb-a"></div>
11523
+ <div class="phb-orb phb-orb-b"></div>
11524
+ <div class="phb-grid"></div>
11525
+ </div>
11526
+ </ng-template>
11527
+ </section>
11528
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.phb-shell{display:grid;grid-template-columns:minmax(0,1.45fr) minmax(240px,.95fr);gap:22px;align-items:stretch;padding:22px;border-radius:28px;overflow:hidden;background:radial-gradient(circle at top right,rgba(65,142,255,.18),transparent 38%),linear-gradient(135deg,#fbfcff,#eef4ff 54%,#f8f9fc);border:1px solid rgba(58,84,135,.14);box-shadow:0 24px 60px #10182814}.phb-event{background:radial-gradient(circle at top right,rgba(255,184,77,.26),transparent 34%),linear-gradient(135deg,#fffaf0,#fff1d6 45%,#fff9f2)}.phb-institutional{background:radial-gradient(circle at top right,rgba(17,94,89,.18),transparent 34%),linear-gradient(135deg,#f7fbfa,#e9f6f3 48%,#f8fcfb)}.phb-copy{display:grid;gap:18px;min-width:0}.phb-badges{display:flex;flex-wrap:wrap;gap:8px}.phb-badge{display:inline-flex;align-items:center;min-height:28px;padding:0 12px;border-radius:999px;background:#0e1f3514;color:#17314f;font-size:.76rem;font-weight:700;letter-spacing:.02em}.phb-badge-highlight{background:#1f63ff1f;color:#1843ad}.phb-badge-muted{background:#6373811f;color:#43515f}.phb-badge-warning{background:#c628281f;color:#a62828}.phb-text{display:grid;gap:8px}.phb-subtitle{margin:0;color:#31506f;font-size:.9rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.phb-title{margin:0;color:#10233a;font-size:clamp(1.6rem,2.2vw,2.5rem);line-height:1.08;letter-spacing:-.03em}.phb-description{margin:0;max-width:56ch;color:#39506a;font-size:.98rem;line-height:1.65}.phb-meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin:0}.phb-meta-item{display:grid;gap:4px;padding:12px 14px;border-radius:16px;background:#ffffff9e;border:1px solid rgba(58,84,135,.12);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.phb-meta-item dt{margin:0;color:#5e7185;font-size:.73rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.phb-meta-item dd{margin:0;color:#17314f;font-size:.92rem;line-height:1.45}.phb-visual{position:relative;min-height:220px;border-radius:22px;overflow:hidden;background:linear-gradient(160deg,#0d1d3324,#3c76ff14)}.phb-image{display:block;width:100%;height:100%;object-fit:cover}.phb-visual-fallback{background:linear-gradient(180deg,#ffffff47,#ffffff14),linear-gradient(145deg,#21417c38,#71a1ff1f)}.phb-orb{position:absolute;border-radius:999px;filter:blur(2px)}.phb-orb-a{inset:24px auto auto 20px;width:86px;height:86px;background:#ffffff9e}.phb-orb-b{inset:auto 16px 18px auto;width:132px;height:132px;background:#346aff38}.phb-grid{position:absolute;inset:0;background-image:linear-gradient(rgba(255,255,255,.16) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.16) 1px,transparent 1px);background-size:24px 24px;opacity:.5}@media(max-width:900px){.phb-shell{grid-template-columns:1fr;padding:18px}.phb-visual{order:-1;min-height:180px}}\n"] }]
11529
+ }], propDecorators: { instanceId: [{
11530
+ type: Input
11531
+ }], analyticsId: [{
11532
+ type: Input
11533
+ }], ariaLabel: [{
11534
+ type: Input
11535
+ }], title: [{
11536
+ type: Input
11537
+ }], subtitle: [{
11538
+ type: Input
11539
+ }], description: [{
11540
+ type: Input
11541
+ }], imageUrl: [{
11542
+ type: Input
11543
+ }], imageAlt: [{
11544
+ type: Input
11545
+ }], badges: [{
11546
+ type: Input
11547
+ }], metaItems: [{
11548
+ type: Input
11549
+ }], variant: [{
11550
+ type: Input
11551
+ }] } });
11552
+
11553
+ const PRAXIS_HERO_BANNER_METADATA = {
11554
+ id: 'widget:hero-banner',
11555
+ selector: 'praxis-hero-banner',
11556
+ component: PraxisHeroBannerComponent,
11557
+ friendlyName: 'Hero Banner',
11558
+ description: 'Bloco editorial de abertura para experiências institucionais, com badges, metadados e visual responsivo.',
11559
+ icon: 'campaign',
11560
+ inputs: [
11561
+ { name: 'instanceId', type: 'string', label: 'Instance ID', description: 'Identificador estável da instância editorial.' },
11562
+ { name: 'analyticsId', type: 'string', label: 'Analytics ID', description: 'Identificador opcional de telemetria agregada.' },
11563
+ { name: 'ariaLabel', type: 'string', label: 'Aria Label', description: 'Rótulo acessível opcional do hero.' },
11564
+ { name: 'title', type: 'string', label: 'Título', description: 'Título principal do hero.' },
11565
+ { name: 'subtitle', type: 'string', label: 'Subtítulo', description: 'Kicker ou subtítulo acima do título.' },
11566
+ { name: 'description', type: 'string', label: 'Descrição', description: 'Descrição principal do destaque.' },
11567
+ { name: 'imageUrl', type: 'string', label: 'Imagem', description: 'URL opcional da imagem de apoio.' },
11568
+ { name: 'imageAlt', type: 'string', label: 'Alt da imagem', description: 'Texto alternativo da imagem, quando presente.' },
11569
+ { name: 'badges', type: 'Array<{ label: string; tone?: "default" | "highlight" | "muted" | "warning" }>', label: 'Badges', description: 'Badges curatoriais no topo do hero.' },
11570
+ { name: 'metaItems', type: 'Array<{ label: string; value: string }>', label: 'Metadados', description: 'Metadados como data, local ou tenant.' },
11571
+ { name: 'variant', type: "'default' | 'event' | 'institutional'", label: 'Variante', description: 'Variante visual inicial do hero banner.', default: 'default' },
11572
+ ],
11573
+ outputs: [],
11574
+ tags: ['widget', 'editorial', 'hero', 'banner', EDITORIAL_WIDGET_TAG],
11575
+ lib: '@praxisui/core',
11576
+ layoutHints: { recommendedCols: 8, recommendedRows: 3, minCols: 4, minRows: 2 },
11577
+ };
11578
+ function providePraxisHeroBannerMetadata() {
11579
+ return {
11580
+ provide: ENVIRONMENT_INITIALIZER,
11581
+ multi: true,
11582
+ useFactory: (registry) => () => {
11583
+ registry.register(PRAXIS_HERO_BANNER_METADATA);
11584
+ },
11585
+ deps: [ComponentMetadataRegistry],
11586
+ };
11587
+ }
11588
+
11239
11589
  /**
11240
11590
  * Binds a stored icon string to a mat-icon element supporting:
11241
11591
  * - Material Icons (classic ligatures): "mi:pending" or "pending"
@@ -11322,6 +11672,511 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
11322
11672
  args: ['praxisIcon']
11323
11673
  }] } });
11324
11674
 
11675
+ class PraxisRichTextBlockComponent {
11676
+ sanitizer = inject(DomSanitizer);
11677
+ instanceId;
11678
+ analyticsId;
11679
+ ariaLabel;
11680
+ title;
11681
+ subtitle;
11682
+ icon;
11683
+ variant = 'default';
11684
+ contentFormat = 'plain';
11685
+ content = '';
11686
+ get renderedContent() {
11687
+ const format = isAllowedEditorialContentFormat(this.contentFormat) ? this.contentFormat : 'plain';
11688
+ const html = format === 'markdown'
11689
+ ? renderEditorialMarkdown(this.content)
11690
+ : renderEditorialPlain(this.content);
11691
+ return this.sanitizer.sanitize(SecurityContext.HTML, html) ?? '';
11692
+ }
11693
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisRichTextBlockComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11694
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.17", type: PraxisRichTextBlockComponent, isStandalone: true, selector: "praxis-rich-text-block", inputs: { instanceId: "instanceId", analyticsId: "analyticsId", ariaLabel: "ariaLabel", title: "title", subtitle: "subtitle", icon: "icon", variant: "variant", contentFormat: "contentFormat", content: "content" }, host: { properties: { "attr.data-instance-id": "instanceId || null", "attr.data-analytics-id": "analyticsId || null", "attr.data-variant": "variant", "attr.aria-label": "ariaLabel || null", "attr.role": "ariaLabel ? \"region\" : null" }, classAttribute: "praxis-rich-text-block" }, ngImport: i0, template: `
11695
+ <section class="prt-block" [class.prt-block-emphasis]="variant === 'emphasis'" [class.prt-block-subtle]="variant === 'subtle'">
11696
+ <header class="prt-head" *ngIf="icon || title || subtitle">
11697
+ <mat-icon class="prt-icon" *ngIf="icon" aria-hidden="true" [praxisIcon]="icon"></mat-icon>
11698
+ <div class="prt-title-wrap">
11699
+ <h3 class="prt-title" *ngIf="title">{{ title }}</h3>
11700
+ <p class="prt-subtitle" *ngIf="subtitle">{{ subtitle }}</p>
11701
+ </div>
11702
+ </header>
11703
+
11704
+ <div class="prt-content" [innerHTML]="renderedContent"></div>
11705
+ </section>
11706
+ `, isInline: true, styles: [":host{display:block}.prt-block{display:grid;gap:12px;padding:16px 18px;border-radius:16px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent);background:linear-gradient(180deg,color-mix(in srgb,var(--md-sys-color-surface) 96%,white),color-mix(in srgb,var(--md-sys-color-surface-container-low) 92%,white));color:var(--md-sys-color-on-surface)}.prt-block-emphasis{border-color:color-mix(in srgb,var(--md-sys-color-primary) 32%,var(--md-sys-color-outline-variant));background:linear-gradient(180deg,color-mix(in srgb,var(--md-sys-color-primary-container) 36%,white),color-mix(in srgb,var(--md-sys-color-surface) 96%,white))}.prt-block-subtle{background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 82%,white);border-style:dashed}.prt-head{display:grid;grid-template-columns:auto 1fr;gap:12px;align-items:start}.prt-icon{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-primary) 12%,white);color:var(--md-sys-color-primary);font-size:20px;line-height:1}.prt-title-wrap{display:grid;gap:4px}.prt-title{margin:0;font-size:1rem;font-weight:700;line-height:1.3}.prt-subtitle{margin:0;color:var(--md-sys-color-on-surface-variant);font-size:.86rem;line-height:1.4}.prt-content{color:var(--md-sys-color-on-surface);font-size:.94rem;line-height:1.6}.prt-content :where(p,ul){margin:0}.prt-content :where(p+p,p+ul,ul+p,ul+ul){margin-top:10px}.prt-content ul{padding-left:18px}.prt-content a{color:var(--md-sys-color-primary);text-decoration:underline;text-underline-offset:2px}.prt-content strong{font-weight:700}.prt-content em{font-style:italic}.prt-content code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.88em;padding:.1em .35em;border-radius:6px;background:color-mix(in srgb,var(--md-sys-color-surface-container-highest) 82%,white)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11707
+ }
11708
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisRichTextBlockComponent, decorators: [{
11709
+ type: Component,
11710
+ args: [{ selector: 'praxis-rich-text-block', standalone: true, imports: [CommonModule, MatIconModule, PraxisIconDirective], host: {
11711
+ 'class': 'praxis-rich-text-block',
11712
+ '[attr.data-instance-id]': 'instanceId || null',
11713
+ '[attr.data-analytics-id]': 'analyticsId || null',
11714
+ '[attr.data-variant]': 'variant',
11715
+ '[attr.aria-label]': 'ariaLabel || null',
11716
+ '[attr.role]': 'ariaLabel ? "region" : null',
11717
+ }, template: `
11718
+ <section class="prt-block" [class.prt-block-emphasis]="variant === 'emphasis'" [class.prt-block-subtle]="variant === 'subtle'">
11719
+ <header class="prt-head" *ngIf="icon || title || subtitle">
11720
+ <mat-icon class="prt-icon" *ngIf="icon" aria-hidden="true" [praxisIcon]="icon"></mat-icon>
11721
+ <div class="prt-title-wrap">
11722
+ <h3 class="prt-title" *ngIf="title">{{ title }}</h3>
11723
+ <p class="prt-subtitle" *ngIf="subtitle">{{ subtitle }}</p>
11724
+ </div>
11725
+ </header>
11726
+
11727
+ <div class="prt-content" [innerHTML]="renderedContent"></div>
11728
+ </section>
11729
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.prt-block{display:grid;gap:12px;padding:16px 18px;border-radius:16px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent);background:linear-gradient(180deg,color-mix(in srgb,var(--md-sys-color-surface) 96%,white),color-mix(in srgb,var(--md-sys-color-surface-container-low) 92%,white));color:var(--md-sys-color-on-surface)}.prt-block-emphasis{border-color:color-mix(in srgb,var(--md-sys-color-primary) 32%,var(--md-sys-color-outline-variant));background:linear-gradient(180deg,color-mix(in srgb,var(--md-sys-color-primary-container) 36%,white),color-mix(in srgb,var(--md-sys-color-surface) 96%,white))}.prt-block-subtle{background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 82%,white);border-style:dashed}.prt-head{display:grid;grid-template-columns:auto 1fr;gap:12px;align-items:start}.prt-icon{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-primary) 12%,white);color:var(--md-sys-color-primary);font-size:20px;line-height:1}.prt-title-wrap{display:grid;gap:4px}.prt-title{margin:0;font-size:1rem;font-weight:700;line-height:1.3}.prt-subtitle{margin:0;color:var(--md-sys-color-on-surface-variant);font-size:.86rem;line-height:1.4}.prt-content{color:var(--md-sys-color-on-surface);font-size:.94rem;line-height:1.6}.prt-content :where(p,ul){margin:0}.prt-content :where(p+p,p+ul,ul+p,ul+ul){margin-top:10px}.prt-content ul{padding-left:18px}.prt-content a{color:var(--md-sys-color-primary);text-decoration:underline;text-underline-offset:2px}.prt-content strong{font-weight:700}.prt-content em{font-style:italic}.prt-content code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.88em;padding:.1em .35em;border-radius:6px;background:color-mix(in srgb,var(--md-sys-color-surface-container-highest) 82%,white)}\n"] }]
11730
+ }], propDecorators: { instanceId: [{
11731
+ type: Input
11732
+ }], analyticsId: [{
11733
+ type: Input
11734
+ }], ariaLabel: [{
11735
+ type: Input
11736
+ }], title: [{
11737
+ type: Input
11738
+ }], subtitle: [{
11739
+ type: Input
11740
+ }], icon: [{
11741
+ type: Input
11742
+ }], variant: [{
11743
+ type: Input
11744
+ }], contentFormat: [{
11745
+ type: Input
11746
+ }], content: [{
11747
+ type: Input
11748
+ }] } });
11749
+ function renderEditorialPlain(content) {
11750
+ const blocks = splitParagraphs(content).map((paragraph) => `<p>${escapeHtml(paragraph)}</p>`);
11751
+ return blocks.join('');
11752
+ }
11753
+ function renderEditorialMarkdown(content) {
11754
+ const withoutImages = EDITORIAL_MARKDOWN_IMAGES_ENABLED
11755
+ ? content
11756
+ : content.replace(/!\[([^\]]*)\]\(([^)]+)\)/g, '');
11757
+ const lines = withoutImages.replace(/\r\n/g, '\n').split('\n');
11758
+ const html = [];
11759
+ let listItems = [];
11760
+ const flushList = () => {
11761
+ if (!listItems.length)
11762
+ return;
11763
+ html.push(`<ul>${listItems.join('')}</ul>`);
11764
+ listItems = [];
11765
+ };
11766
+ for (const line of lines) {
11767
+ const trimmed = line.trim();
11768
+ if (!trimmed) {
11769
+ flushList();
11770
+ continue;
11771
+ }
11772
+ const listMatch = /^[-*]\s+(.+)$/.exec(trimmed);
11773
+ if (listMatch) {
11774
+ listItems.push(`<li>${renderInlineMarkdown(listMatch[1])}</li>`);
11775
+ continue;
11776
+ }
11777
+ flushList();
11778
+ html.push(`<p>${renderInlineMarkdown(trimmed)}</p>`);
11779
+ }
11780
+ flushList();
11781
+ return html.join('');
11782
+ }
11783
+ function renderInlineMarkdown(text) {
11784
+ const placeholders = new Map();
11785
+ let index = 0;
11786
+ const reserve = (html) => {
11787
+ const token = `__PRT_TOKEN_${index++}__`;
11788
+ placeholders.set(token, html);
11789
+ return token;
11790
+ };
11791
+ let escaped = escapeHtml(text);
11792
+ escaped = escaped.replace(/`([^`]+)`/g, (_match, code) => reserve(`<code>${escapeHtml(decodeHtml(code))}</code>`));
11793
+ escaped = escaped.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_match, label, href) => {
11794
+ const normalized = normalizeEditorialLink({
11795
+ label: decodeHtml(label),
11796
+ href: decodeHtml(href),
11797
+ });
11798
+ if (!normalized) {
11799
+ return escapeHtml(decodeHtml(label));
11800
+ }
11801
+ const target = normalized.target ? ` target="${escapeHtml(normalized.target)}"` : '';
11802
+ const rel = normalized.rel || EDITORIAL_EXTERNAL_LINK_REL;
11803
+ return reserve(`<a href="${escapeHtml(normalized.href)}"${target} rel="${escapeHtml(rel)}">${escapeHtml(normalized.label)}</a>`);
11804
+ });
11805
+ escaped = escaped.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>');
11806
+ escaped = escaped.replace(/\*([^*]+)\*/g, '<em>$1</em>');
11807
+ placeholders.forEach((value, token) => {
11808
+ escaped = escaped.replaceAll(token, value);
11809
+ });
11810
+ return escaped;
11811
+ }
11812
+ function splitParagraphs(content) {
11813
+ return content
11814
+ .replace(/\r\n/g, '\n')
11815
+ .split(/\n{2,}/)
11816
+ .map((part) => part.trim())
11817
+ .filter(Boolean);
11818
+ }
11819
+ function escapeHtml(value) {
11820
+ return value
11821
+ .replace(/&/g, '&amp;')
11822
+ .replace(/</g, '&lt;')
11823
+ .replace(/>/g, '&gt;')
11824
+ .replace(/"/g, '&quot;')
11825
+ .replace(/'/g, '&#39;');
11826
+ }
11827
+ function decodeHtml(value) {
11828
+ return value
11829
+ .replace(/&lt;/g, '<')
11830
+ .replace(/&gt;/g, '>')
11831
+ .replace(/&quot;/g, '"')
11832
+ .replace(/&#39;/g, '\'')
11833
+ .replace(/&amp;/g, '&');
11834
+ }
11835
+
11836
+ class PraxisLegalNoticeComponent {
11837
+ instanceId;
11838
+ analyticsId;
11839
+ ariaLabel;
11840
+ title;
11841
+ subtitle;
11842
+ contentFormat = 'plain';
11843
+ content = '';
11844
+ severity = 'info';
11845
+ links = [];
11846
+ get normalizedLinks() {
11847
+ return (this.links || [])
11848
+ .map((link) => normalizeEditorialLink(link))
11849
+ .filter((link) => !!link);
11850
+ }
11851
+ get resolvedIcon() {
11852
+ switch (this.severity) {
11853
+ case 'warning':
11854
+ return 'warning';
11855
+ case 'muted':
11856
+ return 'gavel';
11857
+ default:
11858
+ return 'policy';
11859
+ }
11860
+ }
11861
+ get resolvedVariant() {
11862
+ switch (this.severity) {
11863
+ case 'warning':
11864
+ return 'emphasis';
11865
+ case 'muted':
11866
+ return 'subtle';
11867
+ default:
11868
+ return 'default';
11869
+ }
11870
+ }
11871
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisLegalNoticeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11872
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.17", type: PraxisLegalNoticeComponent, isStandalone: true, selector: "praxis-legal-notice", inputs: { instanceId: "instanceId", analyticsId: "analyticsId", ariaLabel: "ariaLabel", title: "title", subtitle: "subtitle", contentFormat: "contentFormat", content: "content", severity: "severity", links: "links" }, host: { attributes: { "role": "note" }, properties: { "attr.data-instance-id": "instanceId || null", "attr.data-analytics-id": "analyticsId || null", "attr.aria-label": "ariaLabel || title || \"Aviso legal\"" }, classAttribute: "praxis-legal-notice" }, ngImport: i0, template: `
11873
+ <section class="pln-shell" [class.pln-warning]="severity === 'warning'" [class.pln-muted]="severity === 'muted'">
11874
+ <praxis-rich-text-block
11875
+ [instanceId]="instanceId"
11876
+ [analyticsId]="analyticsId"
11877
+ [ariaLabel]="ariaLabel"
11878
+ [title]="title"
11879
+ [subtitle]="subtitle"
11880
+ [icon]="resolvedIcon"
11881
+ [variant]="resolvedVariant"
11882
+ [contentFormat]="contentFormat"
11883
+ [content]="content"
11884
+ ></praxis-rich-text-block>
11885
+
11886
+ <nav class="pln-links" *ngIf="normalizedLinks.length" aria-label="Links do aviso legal">
11887
+ <a
11888
+ *ngFor="let link of normalizedLinks"
11889
+ class="pln-link"
11890
+ [href]="link.href"
11891
+ [attr.target]="link.target || null"
11892
+ [attr.rel]="link.rel || null"
11893
+ >
11894
+ {{ link.label }}
11895
+ </a>
11896
+ </nav>
11897
+ </section>
11898
+ `, isInline: true, styles: [":host{display:block}.pln-shell{display:grid;gap:10px}.pln-shell .praxis-rich-text-block .prt-block,.pln-shell .prt-block{border-left:4px solid color-mix(in srgb,var(--md-sys-color-primary) 56%,transparent)}.pln-warning .praxis-rich-text-block .prt-block,.pln-warning .prt-block{border-left-color:var(--md-sys-color-error)}.pln-muted .praxis-rich-text-block .prt-block,.pln-muted .prt-block{opacity:.92}.pln-links{display:flex;flex-wrap:wrap;gap:8px 12px;padding-left:18px}.pln-link{color:var(--md-sys-color-primary);font-size:.84rem;line-height:1.4;text-decoration:underline;text-underline-offset:2px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PraxisRichTextBlockComponent, selector: "praxis-rich-text-block", inputs: ["instanceId", "analyticsId", "ariaLabel", "title", "subtitle", "icon", "variant", "contentFormat", "content"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11899
+ }
11900
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisLegalNoticeComponent, decorators: [{
11901
+ type: Component,
11902
+ args: [{ selector: 'praxis-legal-notice', standalone: true, imports: [CommonModule, PraxisRichTextBlockComponent], host: {
11903
+ 'class': 'praxis-legal-notice',
11904
+ '[attr.data-instance-id]': 'instanceId || null',
11905
+ '[attr.data-analytics-id]': 'analyticsId || null',
11906
+ '[attr.aria-label]': 'ariaLabel || title || "Aviso legal"',
11907
+ 'role': 'note',
11908
+ }, template: `
11909
+ <section class="pln-shell" [class.pln-warning]="severity === 'warning'" [class.pln-muted]="severity === 'muted'">
11910
+ <praxis-rich-text-block
11911
+ [instanceId]="instanceId"
11912
+ [analyticsId]="analyticsId"
11913
+ [ariaLabel]="ariaLabel"
11914
+ [title]="title"
11915
+ [subtitle]="subtitle"
11916
+ [icon]="resolvedIcon"
11917
+ [variant]="resolvedVariant"
11918
+ [contentFormat]="contentFormat"
11919
+ [content]="content"
11920
+ ></praxis-rich-text-block>
11921
+
11922
+ <nav class="pln-links" *ngIf="normalizedLinks.length" aria-label="Links do aviso legal">
11923
+ <a
11924
+ *ngFor="let link of normalizedLinks"
11925
+ class="pln-link"
11926
+ [href]="link.href"
11927
+ [attr.target]="link.target || null"
11928
+ [attr.rel]="link.rel || null"
11929
+ >
11930
+ {{ link.label }}
11931
+ </a>
11932
+ </nav>
11933
+ </section>
11934
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.pln-shell{display:grid;gap:10px}.pln-shell .praxis-rich-text-block .prt-block,.pln-shell .prt-block{border-left:4px solid color-mix(in srgb,var(--md-sys-color-primary) 56%,transparent)}.pln-warning .praxis-rich-text-block .prt-block,.pln-warning .prt-block{border-left-color:var(--md-sys-color-error)}.pln-muted .praxis-rich-text-block .prt-block,.pln-muted .prt-block{opacity:.92}.pln-links{display:flex;flex-wrap:wrap;gap:8px 12px;padding-left:18px}.pln-link{color:var(--md-sys-color-primary);font-size:.84rem;line-height:1.4;text-decoration:underline;text-underline-offset:2px}\n"] }]
11935
+ }], propDecorators: { instanceId: [{
11936
+ type: Input
11937
+ }], analyticsId: [{
11938
+ type: Input
11939
+ }], ariaLabel: [{
11940
+ type: Input
11941
+ }], title: [{
11942
+ type: Input
11943
+ }], subtitle: [{
11944
+ type: Input
11945
+ }], contentFormat: [{
11946
+ type: Input
11947
+ }], content: [{
11948
+ type: Input
11949
+ }], severity: [{
11950
+ type: Input
11951
+ }], links: [{
11952
+ type: Input
11953
+ }] } });
11954
+
11955
+ const PRAXIS_LEGAL_NOTICE_METADATA = {
11956
+ id: 'widget:legal-notice',
11957
+ selector: 'praxis-legal-notice',
11958
+ component: PraxisLegalNoticeComponent,
11959
+ friendlyName: 'Legal Notice',
11960
+ description: 'Aviso editorial/jurídico informativo com conteúdo seguro e links normalizados pela policy editorial.',
11961
+ icon: 'policy',
11962
+ inputs: [
11963
+ { name: 'instanceId', type: 'string', label: 'Instance ID', description: 'Identificador estável da instância editorial.' },
11964
+ { name: 'analyticsId', type: 'string', label: 'Analytics ID', description: 'Identificador opcional de telemetria agregada.' },
11965
+ { name: 'ariaLabel', type: 'string', label: 'Aria Label', description: 'Rótulo acessível opcional do aviso legal.' },
11966
+ { name: 'title', type: 'string', label: 'Título', description: 'Título principal do aviso legal.' },
11967
+ { name: 'subtitle', type: 'string', label: 'Subtítulo', description: 'Subtítulo opcional do aviso.' },
11968
+ { name: 'contentFormat', type: "'plain' | 'markdown'", label: 'Formato do conteúdo', description: 'Formato editorial permitido para o corpo do aviso.', default: 'plain' },
11969
+ { name: 'content', type: 'string', label: 'Conteúdo', description: 'Corpo principal do aviso legal.' },
11970
+ { name: 'severity', type: "'info' | 'warning' | 'muted'", label: 'Severidade', description: 'Tom visual/semântico do aviso legal.', default: 'info' },
11971
+ { name: 'links', type: 'EditorialLinkDefinition[]', label: 'Links', description: 'Links complementares do aviso, sempre normalizados pela policy editorial.' },
11972
+ ],
11973
+ outputs: [],
11974
+ tags: ['widget', 'editorial', 'notice', 'legal', EDITORIAL_WIDGET_TAG],
11975
+ lib: '@praxisui/core',
11976
+ };
11977
+ function providePraxisLegalNoticeMetadata() {
11978
+ return {
11979
+ provide: ENVIRONMENT_INITIALIZER,
11980
+ multi: true,
11981
+ useFactory: (registry) => () => {
11982
+ registry.register(PRAXIS_LEGAL_NOTICE_METADATA);
11983
+ },
11984
+ deps: [ComponentMetadataRegistry],
11985
+ };
11986
+ }
11987
+
11988
+ const PRAXIS_RICH_TEXT_BLOCK_METADATA = {
11989
+ id: 'widget:rich-text-block',
11990
+ selector: 'praxis-rich-text-block',
11991
+ component: PraxisRichTextBlockComponent,
11992
+ friendlyName: 'Rich Text Block',
11993
+ description: 'Bloco editorial compartilhado para instruções, contexto institucional e conteúdo de apoio em plain text ou markdown seguro.',
11994
+ icon: 'article',
11995
+ inputs: [
11996
+ { name: 'instanceId', type: 'string', label: 'Instance ID', description: 'Identificador estável da instância editorial.' },
11997
+ { name: 'analyticsId', type: 'string', label: 'Analytics ID', description: 'Identificador opcional de telemetria agregada.' },
11998
+ { name: 'ariaLabel', type: 'string', label: 'Aria Label', description: 'Rótulo acessível opcional do bloco.' },
11999
+ { name: 'title', type: 'string', label: 'Título', description: 'Título principal do bloco.' },
12000
+ { name: 'subtitle', type: 'string', label: 'Subtítulo', description: 'Texto curto complementar abaixo do título.' },
12001
+ { name: 'icon', type: 'string', label: 'Ícone', description: 'Ícone Material Symbols exibido no cabeçalho do bloco.' },
12002
+ { name: 'variant', type: "'default' | 'emphasis' | 'subtle'", label: 'Variante', description: 'Variante visual do bloco editorial.', default: 'default' },
12003
+ { name: 'contentFormat', type: "'plain' | 'markdown'", label: 'Formato do conteúdo', description: 'Formato editorial permitido para renderização do conteúdo.', default: 'plain' },
12004
+ { name: 'content', type: 'string', label: 'Conteúdo', description: 'Corpo principal do bloco em plain text ou markdown seguro.' },
12005
+ ],
12006
+ outputs: [],
12007
+ tags: ['widget', 'editorial', 'content', EDITORIAL_WIDGET_TAG],
12008
+ lib: '@praxisui/core',
12009
+ };
12010
+ function providePraxisRichTextBlockMetadata() {
12011
+ return {
12012
+ provide: ENVIRONMENT_INITIALIZER,
12013
+ multi: true,
12014
+ useFactory: (registry) => () => {
12015
+ registry.register(PRAXIS_RICH_TEXT_BLOCK_METADATA);
12016
+ },
12017
+ deps: [ComponentMetadataRegistry],
12018
+ };
12019
+ }
12020
+
12021
+ class PraxisUserContextSummaryComponent {
12022
+ instanceId;
12023
+ analyticsId;
12024
+ ariaLabel;
12025
+ title;
12026
+ subtitle;
12027
+ source = 'context';
12028
+ context = null;
12029
+ fields = [];
12030
+ actionId = 'change-context';
12031
+ actionLabel;
12032
+ actionTriggered = new EventEmitter();
12033
+ get resolvedFields() {
12034
+ return (this.fields || []).map((field) => ({
12035
+ label: field.label,
12036
+ value: this.resolveFieldValue(field),
12037
+ }));
12038
+ }
12039
+ emitAction() {
12040
+ this.actionTriggered.emit({ actionId: this.actionId || 'change-context' });
12041
+ }
12042
+ resolveFieldValue(field) {
12043
+ if (typeof field.value === 'string' && field.value.trim()) {
12044
+ return field.value;
12045
+ }
12046
+ if (this.source === 'context' && field.valuePath) {
12047
+ const resolved = lookupPath(this.context, field.valuePath);
12048
+ if (resolved != null && String(resolved).trim() !== '') {
12049
+ return String(resolved);
12050
+ }
12051
+ }
12052
+ return field.fallback || '-';
12053
+ }
12054
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisUserContextSummaryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12055
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.17", type: PraxisUserContextSummaryComponent, isStandalone: true, selector: "praxis-user-context-summary", inputs: { instanceId: "instanceId", analyticsId: "analyticsId", ariaLabel: "ariaLabel", title: "title", subtitle: "subtitle", source: "source", context: "context", fields: "fields", actionId: "actionId", actionLabel: "actionLabel" }, outputs: { actionTriggered: "actionTriggered" }, host: { properties: { "attr.data-instance-id": "instanceId || null", "attr.data-analytics-id": "analyticsId || null", "attr.aria-label": "ariaLabel || null", "attr.role": "ariaLabel ? \"region\" : null" }, classAttribute: "praxis-user-context-summary" }, ngImport: i0, template: `
12056
+ <section class="pux-card">
12057
+ <header class="pux-head" *ngIf="title || subtitle">
12058
+ <h3 class="pux-title" *ngIf="title">{{ title }}</h3>
12059
+ <p class="pux-subtitle" *ngIf="subtitle">{{ subtitle }}</p>
12060
+ </header>
12061
+
12062
+ <dl class="pux-grid" *ngIf="resolvedFields.length; else emptyState">
12063
+ <div class="pux-item" *ngFor="let field of resolvedFields">
12064
+ <dt>{{ field.label }}</dt>
12065
+ <dd>{{ field.value }}</dd>
12066
+ </div>
12067
+ </dl>
12068
+
12069
+ <ng-template #emptyState>
12070
+ <p class="pux-empty">Nenhum contexto disponivel.</p>
12071
+ </ng-template>
12072
+
12073
+ <div class="pux-actions" *ngIf="actionLabel">
12074
+ <button type="button" class="pux-action" (click)="emitAction()">{{ actionLabel }}</button>
12075
+ </div>
12076
+ </section>
12077
+ `, isInline: true, styles: [":host{display:block}.pux-card{display:grid;gap:14px;padding:16px 18px;border-radius:18px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 78%,transparent);background:linear-gradient(180deg,#fffffffa,#f4f8fcfa)}.pux-head{display:grid;gap:4px}.pux-title{margin:0;color:var(--md-sys-color-on-surface);font-size:.98rem;font-weight:700}.pux-subtitle{margin:0;color:var(--md-sys-color-on-surface-variant);font-size:.84rem;line-height:1.5}.pux-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px;margin:0}.pux-item{display:grid;gap:4px;padding:12px 14px;border-radius:14px;background:#ffffffb8;border:1px solid rgba(66,93,135,.1)}.pux-item dt{margin:0;color:#5d7186;font-size:.73rem;font-weight:700;text-transform:uppercase;letter-spacing:.06em}.pux-item dd{margin:0;color:#17314f;font-size:.92rem;line-height:1.45}.pux-actions{display:flex;justify-content:flex-start}.pux-action{min-height:36px;padding:0 14px;border:1px solid rgba(33,88,201,.18);border-radius:999px;background:#2060d214;color:#1e55b8;font:inherit;font-size:.84rem;font-weight:700;cursor:pointer}.pux-empty{margin:0;color:var(--md-sys-color-on-surface-variant);font-size:.84rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12078
+ }
12079
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisUserContextSummaryComponent, decorators: [{
12080
+ type: Component,
12081
+ args: [{ selector: 'praxis-user-context-summary', standalone: true, imports: [CommonModule], host: {
12082
+ 'class': 'praxis-user-context-summary',
12083
+ '[attr.data-instance-id]': 'instanceId || null',
12084
+ '[attr.data-analytics-id]': 'analyticsId || null',
12085
+ '[attr.aria-label]': 'ariaLabel || null',
12086
+ '[attr.role]': 'ariaLabel ? "region" : null',
12087
+ }, template: `
12088
+ <section class="pux-card">
12089
+ <header class="pux-head" *ngIf="title || subtitle">
12090
+ <h3 class="pux-title" *ngIf="title">{{ title }}</h3>
12091
+ <p class="pux-subtitle" *ngIf="subtitle">{{ subtitle }}</p>
12092
+ </header>
12093
+
12094
+ <dl class="pux-grid" *ngIf="resolvedFields.length; else emptyState">
12095
+ <div class="pux-item" *ngFor="let field of resolvedFields">
12096
+ <dt>{{ field.label }}</dt>
12097
+ <dd>{{ field.value }}</dd>
12098
+ </div>
12099
+ </dl>
12100
+
12101
+ <ng-template #emptyState>
12102
+ <p class="pux-empty">Nenhum contexto disponivel.</p>
12103
+ </ng-template>
12104
+
12105
+ <div class="pux-actions" *ngIf="actionLabel">
12106
+ <button type="button" class="pux-action" (click)="emitAction()">{{ actionLabel }}</button>
12107
+ </div>
12108
+ </section>
12109
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.pux-card{display:grid;gap:14px;padding:16px 18px;border-radius:18px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 78%,transparent);background:linear-gradient(180deg,#fffffffa,#f4f8fcfa)}.pux-head{display:grid;gap:4px}.pux-title{margin:0;color:var(--md-sys-color-on-surface);font-size:.98rem;font-weight:700}.pux-subtitle{margin:0;color:var(--md-sys-color-on-surface-variant);font-size:.84rem;line-height:1.5}.pux-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px;margin:0}.pux-item{display:grid;gap:4px;padding:12px 14px;border-radius:14px;background:#ffffffb8;border:1px solid rgba(66,93,135,.1)}.pux-item dt{margin:0;color:#5d7186;font-size:.73rem;font-weight:700;text-transform:uppercase;letter-spacing:.06em}.pux-item dd{margin:0;color:#17314f;font-size:.92rem;line-height:1.45}.pux-actions{display:flex;justify-content:flex-start}.pux-action{min-height:36px;padding:0 14px;border:1px solid rgba(33,88,201,.18);border-radius:999px;background:#2060d214;color:#1e55b8;font:inherit;font-size:.84rem;font-weight:700;cursor:pointer}.pux-empty{margin:0;color:var(--md-sys-color-on-surface-variant);font-size:.84rem}\n"] }]
12110
+ }], propDecorators: { instanceId: [{
12111
+ type: Input
12112
+ }], analyticsId: [{
12113
+ type: Input
12114
+ }], ariaLabel: [{
12115
+ type: Input
12116
+ }], title: [{
12117
+ type: Input
12118
+ }], subtitle: [{
12119
+ type: Input
12120
+ }], source: [{
12121
+ type: Input
12122
+ }], context: [{
12123
+ type: Input
12124
+ }], fields: [{
12125
+ type: Input
12126
+ }], actionId: [{
12127
+ type: Input
12128
+ }], actionLabel: [{
12129
+ type: Input
12130
+ }], actionTriggered: [{
12131
+ type: Output
12132
+ }] } });
12133
+ function lookupPath(context, path) {
12134
+ if (!context || !path.trim())
12135
+ return undefined;
12136
+ return path.split('.').reduce((acc, key) => {
12137
+ if (acc && typeof acc === 'object') {
12138
+ return acc[key];
12139
+ }
12140
+ return undefined;
12141
+ }, context);
12142
+ }
12143
+
12144
+ const PRAXIS_USER_CONTEXT_SUMMARY_METADATA = {
12145
+ id: 'form:user-context-summary',
12146
+ selector: 'praxis-user-context-summary',
12147
+ component: PraxisUserContextSummaryComponent,
12148
+ friendlyName: 'User Context Summary',
12149
+ description: 'Resumo contextual do usuário/tenant próximo ao formulário, sem participar de validação ou formData.',
12150
+ icon: 'account_circle',
12151
+ inputs: [
12152
+ { name: 'instanceId', type: 'string', label: 'Instance ID', description: 'Identificador estável da instância editorial.' },
12153
+ { name: 'analyticsId', type: 'string', label: 'Analytics ID', description: 'Identificador opcional de telemetria agregada.' },
12154
+ { name: 'ariaLabel', type: 'string', label: 'Aria Label', description: 'Rótulo acessível opcional do resumo contextual.' },
12155
+ { name: 'title', type: 'string', label: 'Título', description: 'Título principal do resumo.' },
12156
+ { name: 'subtitle', type: 'string', label: 'Subtítulo', description: 'Texto auxiliar explicando o contexto exibido.' },
12157
+ { name: 'source', type: "'context' | 'static'", label: 'Fonte', description: 'Origem dos dados do resumo contextual.', default: 'context' },
12158
+ { name: 'context', type: 'Record<string, unknown> | null', label: 'Contexto', description: 'Objeto tipado usado para resolver valuePath dos campos.' },
12159
+ { name: 'fields', type: 'Array<{ label: string; valuePath?: string; value?: string; fallback?: string }>', label: 'Campos', description: 'Campos exibidos no resumo, com resolução por valuePath ou valor estático.' },
12160
+ { name: 'actionId', type: 'string', label: 'Action ID', description: 'Identificador canônico da ação opcional emitida pelo componente.', default: 'change-context' },
12161
+ { name: 'actionLabel', type: 'string', label: 'Action Label', description: 'Texto do CTA opcional para trocar conta/unidade/contexto.' },
12162
+ ],
12163
+ outputs: [
12164
+ { name: 'actionTriggered', type: '{ actionId: string }', label: 'Ação disparada', description: 'Output emitido quando o CTA opcional do resumo contextual é acionado.' },
12165
+ ],
12166
+ tags: ['widget', 'editorial', 'context', 'user', 'form', EDITORIAL_WIDGET_TAG],
12167
+ lib: '@praxisui/core',
12168
+ };
12169
+ function providePraxisUserContextSummaryMetadata() {
12170
+ return {
12171
+ provide: ENVIRONMENT_INITIALIZER,
12172
+ multi: true,
12173
+ useFactory: (registry) => () => {
12174
+ registry.register(PRAXIS_USER_CONTEXT_SUMMARY_METADATA);
12175
+ },
12176
+ deps: [ComponentMetadataRegistry],
12177
+ };
12178
+ }
12179
+
11325
12180
  /**
11326
12181
  * Carrega dinamicamente um componente "widget" (de página) a partir de um id registrado
11327
12182
  * no ComponentMetadataRegistry e aplica bindings declarados em JSON (WidgetDefinition).
@@ -14690,5 +15545,5 @@ function provideHookWhitelist(allowed) {
14690
15545
  * Generated bundle index. Do not edit.
14691
15546
  */
14692
15547
 
14693
- export { API_CONFIG_STORAGE_OPTIONS, API_URL, ASYNC_CONFIG_STORAGE, AllowedFileTypes, ApiConfigStorage, ApiEndpoint, BUILTIN_SHELL_PRESETS, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentKeyService, ComponentMetadataRegistry, ConnectionManagerService, ConsoleLoggerSink, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_TABLE_CONFIG, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DynamicFormService, DynamicGridPageComponent, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EmptyStateCardComponent, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG$1 as GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_CATALOG as GLOBAL_ACTION_SPEC_CATALOG, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_TOAST_SERVICE, GenericCrudService, GlobalActionService, GlobalConfigService, INLINE_FILTER_ALIAS_TOKENS, INLINE_FILTER_ALIAS_TOKEN_TO_BASE_CONTROL_TYPE, INLINE_FILTER_ALIAS_TOKEN_TO_CONTROL_TYPE, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_SET, INLINE_FILTER_CONTROL_TYPE_VALUES, IconPickerService, IconPosition, IconSize, LOGGER_LEVEL_BY_ENV, LOGGER_LEVEL_PRIORITY, LoadingOrchestrator, LocalConnectionStorage, LocalStorageAsyncAdapter, LocalStorageCacheAdapter, LocalStorageConfigService, LoggerService, LoggerThrottleTracker, LoggerWarnOnceTracker, MemoryCacheAdapter, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_TELEMETRY_TRANSPORT, PraxisCore, PraxisGlobalErrorHandler, PraxisIconDirective, PraxisIconPickerComponent, PraxisLoadingInterceptor, RULE_PROPERTY_SCHEMA, RemoteConfigStorage, ResourceQuickConnectComponent, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildHeaders, buildPageKey, buildSchemaId, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEssentialConfig, getFieldMetadataCapabilities, getGlobalActionCatalog, getGlobalActionUiSchema, getReferencedFieldMetadata, getTextTransformer, isCssTextTransform, isInlineFilterControlType, isRangeValidForFilter, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, maxFileSizeValidator, mergeFieldMetadata, mergeTableConfigs, migrateFormLayoutRule, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEnd, normalizeFieldConstraints, normalizeFormConfig, normalizeFormMetadata, normalizePath, normalizeStart, normalizeUnknownError, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisDynamicPageMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHttpLoading, providePraxisLoadingDefaults, providePraxisLogging, providePraxisToastGlobalActions, provideRemoteGlobalConfig, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, removeDiacritics, reportTelemetryHookFactory, requiredCheckedValidator, resolveBuiltinPresets, resolveControlTypeAlias, resolveHidden, resolveInlineFilterAliasToBaseControlType, resolveInlineFilterControlTypeAlias, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolveSpan, slugify, stripMasksHook, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, trim, uniqueAsyncValidator, urlValidator, withMessage, withPraxisHttpLoading };
15548
+ export { API_CONFIG_STORAGE_OPTIONS, API_URL, ASYNC_CONFIG_STORAGE, AllowedFileTypes, ApiConfigStorage, ApiEndpoint, BUILTIN_SHELL_PRESETS, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentKeyService, ComponentMetadataRegistry, ConnectionManagerService, ConsoleLoggerSink, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_TABLE_CONFIG, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DynamicFormService, DynamicGridPageComponent, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EDITORIAL_ALLOWED_CONTENT_FORMATS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EmptyStateCardComponent, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG$1 as GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_CATALOG as GLOBAL_ACTION_SPEC_CATALOG, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_TOAST_SERVICE, GenericCrudService, GlobalActionService, GlobalConfigService, INLINE_FILTER_ALIAS_TOKENS, INLINE_FILTER_ALIAS_TOKEN_TO_BASE_CONTROL_TYPE, INLINE_FILTER_ALIAS_TOKEN_TO_CONTROL_TYPE, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_SET, INLINE_FILTER_CONTROL_TYPE_VALUES, IconPickerService, IconPosition, IconSize, LOGGER_LEVEL_BY_ENV, LOGGER_LEVEL_PRIORITY, LoadingOrchestrator, LocalConnectionStorage, LocalStorageAsyncAdapter, LocalStorageCacheAdapter, LocalStorageConfigService, LoggerService, LoggerThrottleTracker, LoggerWarnOnceTracker, MemoryCacheAdapter, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_RICH_TEXT_BLOCK_METADATA, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisIconDirective, PraxisIconPickerComponent, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRichTextBlockComponent, PraxisUserContextSummaryComponent, RULE_PROPERTY_SCHEMA, RemoteConfigStorage, ResourceQuickConnectComponent, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildHeaders, buildPageKey, buildSchemaId, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEssentialConfig, getFieldMetadataCapabilities, getGlobalActionCatalog, getGlobalActionUiSchema, getReferencedFieldMetadata, getTextTransformer, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isEditorialComponentMeta, isInlineFilterControlType, isRangeValidForFilter, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, maxFileSizeValidator, mergeFieldMetadata, mergeTableConfigs, migrateFormLayoutRule, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldConstraints, normalizeFormConfig, normalizeFormMetadata, normalizePath, normalizeStart, normalizeUnknownError, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisDynamicPageMetadata, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpLoading, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, removeDiacritics, reportTelemetryHookFactory, requiredCheckedValidator, resolveBuiltinPresets, resolveControlTypeAlias, resolveHidden, resolveInlineFilterAliasToBaseControlType, resolveInlineFilterControlTypeAlias, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolveSpan, slugify, stripMasksHook, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, trim, uniqueAsyncValidator, urlValidator, withMessage, withPraxisHttpLoading };
14694
15549
  //# sourceMappingURL=praxisui-core.mjs.map