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

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 {
@@ -8054,7 +8077,7 @@ function isValidFormConfig(config) {
8054
8077
  * Cria configuração vazia para inicialização
8055
8078
  */
8056
8079
  function createEmptyFormConfig() {
8057
- return { sections: [] };
8080
+ return { sections: [], formBlocksBefore: [], formBlocksAfter: [] };
8058
8081
  }
8059
8082
  /**
8060
8083
  * Default hint texts for data and UI modes.
@@ -11236,6 +11259,330 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
11236
11259
  ],
11237
11260
  };
11238
11261
 
11262
+ const EDITORIAL_ALLOWED_CONTENT_FORMATS = ['plain', 'markdown'];
11263
+ const EDITORIAL_HTML_ENABLED = false;
11264
+ const EDITORIAL_MARKDOWN_IMAGES_ENABLED = false;
11265
+ const EDITORIAL_EXTERNAL_LINK_REL = 'noopener noreferrer';
11266
+ const DISALLOWED_HREF_PROTOCOL = /^(javascript|data|vbscript|file):/i;
11267
+ const ABSOLUTE_HTTP_PROTOCOL = /^https?:\/\//i;
11268
+ const RELATIVE_OR_SPECIAL_HREF = /^(\/|\.\/|\.\.\/|#|mailto:|tel:)/i;
11269
+ function isAllowedEditorialContentFormat(value) {
11270
+ return value === 'plain' || value === 'markdown';
11271
+ }
11272
+ function isAllowedEditorialHref(href) {
11273
+ if (typeof href !== 'string')
11274
+ return false;
11275
+ const trimmed = href.trim();
11276
+ if (!trimmed)
11277
+ return false;
11278
+ if (DISALLOWED_HREF_PROTOCOL.test(trimmed))
11279
+ return false;
11280
+ return ABSOLUTE_HTTP_PROTOCOL.test(trimmed) || RELATIVE_OR_SPECIAL_HREF.test(trimmed);
11281
+ }
11282
+ function normalizeEditorialLink(link) {
11283
+ const label = typeof link?.label === 'string' ? link.label.trim() : '';
11284
+ const href = typeof link?.href === 'string' ? link.href.trim() : '';
11285
+ if (!label || !isAllowedEditorialHref(href)) {
11286
+ return null;
11287
+ }
11288
+ const isExternalHttp = ABSOLUTE_HTTP_PROTOCOL.test(href);
11289
+ const external = isExternalHttp ? true : (link.external ?? false);
11290
+ const target = external ? '_blank' : (link.target ?? '_self');
11291
+ const rel = external ? mergeRel(link.rel, EDITORIAL_EXTERNAL_LINK_REL) : link.rel;
11292
+ return {
11293
+ ...link,
11294
+ label,
11295
+ href,
11296
+ external,
11297
+ target,
11298
+ rel,
11299
+ };
11300
+ }
11301
+ function mergeRel(current, required) {
11302
+ const parts = new Set((current || '').split(/\s+/).filter(Boolean));
11303
+ for (const token of required.split(/\s+/)) {
11304
+ parts.add(token);
11305
+ }
11306
+ return Array.from(parts).join(' ');
11307
+ }
11308
+
11309
+ class PraxisFooterLinksComponent {
11310
+ instanceId;
11311
+ analyticsId;
11312
+ ariaLabel;
11313
+ brandText;
11314
+ secondaryText;
11315
+ links = [];
11316
+ layout = 'inline';
11317
+ get normalizedLinks() {
11318
+ return (this.links || [])
11319
+ .map((link) => normalizeEditorialLink(link))
11320
+ .filter((link) => !!link);
11321
+ }
11322
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisFooterLinksComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11323
+ 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: `
11324
+ <footer class="pfl-shell" [class.pfl-stacked]="layout === 'stacked'">
11325
+ <div class="pfl-brand" *ngIf="brandText || secondaryText">
11326
+ <strong class="pfl-brand-text" *ngIf="brandText">{{ brandText }}</strong>
11327
+ <span class="pfl-secondary-text" *ngIf="secondaryText">{{ secondaryText }}</span>
11328
+ </div>
11329
+
11330
+ <nav class="pfl-nav" aria-label="Links institucionais">
11331
+ <a
11332
+ *ngFor="let link of normalizedLinks"
11333
+ class="pfl-link"
11334
+ [href]="link.href"
11335
+ [attr.target]="link.target || null"
11336
+ [attr.rel]="link.rel || null"
11337
+ >
11338
+ {{ link.label }}
11339
+ </a>
11340
+ </nav>
11341
+ </footer>
11342
+ `, 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 });
11343
+ }
11344
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisFooterLinksComponent, decorators: [{
11345
+ type: Component,
11346
+ args: [{ selector: 'praxis-footer-links', standalone: true, imports: [CommonModule], host: {
11347
+ 'class': 'praxis-footer-links',
11348
+ '[attr.data-instance-id]': 'instanceId || null',
11349
+ '[attr.data-analytics-id]': 'analyticsId || null',
11350
+ '[attr.aria-label]': 'ariaLabel || null',
11351
+ 'role': 'contentinfo',
11352
+ }, template: `
11353
+ <footer class="pfl-shell" [class.pfl-stacked]="layout === 'stacked'">
11354
+ <div class="pfl-brand" *ngIf="brandText || secondaryText">
11355
+ <strong class="pfl-brand-text" *ngIf="brandText">{{ brandText }}</strong>
11356
+ <span class="pfl-secondary-text" *ngIf="secondaryText">{{ secondaryText }}</span>
11357
+ </div>
11358
+
11359
+ <nav class="pfl-nav" aria-label="Links institucionais">
11360
+ <a
11361
+ *ngFor="let link of normalizedLinks"
11362
+ class="pfl-link"
11363
+ [href]="link.href"
11364
+ [attr.target]="link.target || null"
11365
+ [attr.rel]="link.rel || null"
11366
+ >
11367
+ {{ link.label }}
11368
+ </a>
11369
+ </nav>
11370
+ </footer>
11371
+ `, 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"] }]
11372
+ }], propDecorators: { instanceId: [{
11373
+ type: Input
11374
+ }], analyticsId: [{
11375
+ type: Input
11376
+ }], ariaLabel: [{
11377
+ type: Input
11378
+ }], brandText: [{
11379
+ type: Input
11380
+ }], secondaryText: [{
11381
+ type: Input
11382
+ }], links: [{
11383
+ type: Input
11384
+ }], layout: [{
11385
+ type: Input
11386
+ }] } });
11387
+
11388
+ const PRAXIS_FOOTER_LINKS_METADATA = {
11389
+ id: 'widget:footer-links',
11390
+ selector: 'praxis-footer-links',
11391
+ component: PraxisFooterLinksComponent,
11392
+ friendlyName: 'Footer Links',
11393
+ description: 'Rodapé institucional com marca opcional, texto secundário e links normalizados pela policy editorial.',
11394
+ icon: 'footer',
11395
+ inputs: [
11396
+ { name: 'instanceId', type: 'string', label: 'Instance ID', description: 'Identificador estável da instância editorial.' },
11397
+ { name: 'analyticsId', type: 'string', label: 'Analytics ID', description: 'Identificador opcional de telemetria agregada.' },
11398
+ { name: 'ariaLabel', type: 'string', label: 'Aria Label', description: 'Rótulo acessível opcional do rodapé institucional.' },
11399
+ { name: 'brandText', type: 'string', label: 'Marca', description: 'Texto principal opcional da marca ou instituição.' },
11400
+ { name: 'secondaryText', type: 'string', label: 'Texto secundário', description: 'Texto secundário opcional do rodapé.' },
11401
+ { name: 'links', type: 'EditorialLinkDefinition[]', label: 'Links', description: 'Lista ordenada de links institucionais.' },
11402
+ { name: 'layout', type: "'inline' | 'stacked'", label: 'Layout', description: 'Layout inicial do rodapé institucional.', default: 'inline' },
11403
+ ],
11404
+ outputs: [],
11405
+ tags: ['widget', 'editorial', 'footer', 'links', EDITORIAL_WIDGET_TAG],
11406
+ lib: '@praxisui/core',
11407
+ };
11408
+ function providePraxisFooterLinksMetadata() {
11409
+ return {
11410
+ provide: ENVIRONMENT_INITIALIZER,
11411
+ multi: true,
11412
+ useFactory: (registry) => () => {
11413
+ registry.register(PRAXIS_FOOTER_LINKS_METADATA);
11414
+ },
11415
+ deps: [ComponentMetadataRegistry],
11416
+ };
11417
+ }
11418
+
11419
+ class PraxisHeroBannerComponent {
11420
+ instanceId;
11421
+ analyticsId;
11422
+ ariaLabel;
11423
+ title;
11424
+ subtitle;
11425
+ description;
11426
+ imageUrl;
11427
+ imageAlt;
11428
+ badges = [];
11429
+ metaItems = [];
11430
+ variant = 'default';
11431
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisHeroBannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11432
+ 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: `
11433
+ <section class="phb-shell" [class.phb-event]="variant === 'event'" [class.phb-institutional]="variant === 'institutional'">
11434
+ <div class="phb-copy">
11435
+ <div class="phb-badges" *ngIf="badges?.length">
11436
+ <span
11437
+ class="phb-badge"
11438
+ *ngFor="let badge of badges"
11439
+ [class.phb-badge-highlight]="badge.tone === 'highlight'"
11440
+ [class.phb-badge-muted]="badge.tone === 'muted'"
11441
+ [class.phb-badge-warning]="badge.tone === 'warning'"
11442
+ >
11443
+ {{ badge.label }}
11444
+ </span>
11445
+ </div>
11446
+
11447
+ <div class="phb-text">
11448
+ <p class="phb-subtitle" *ngIf="subtitle">{{ subtitle }}</p>
11449
+ <h2 class="phb-title" *ngIf="title">{{ title }}</h2>
11450
+ <p class="phb-description" *ngIf="description">{{ description }}</p>
11451
+ </div>
11452
+
11453
+ <dl class="phb-meta" *ngIf="metaItems?.length">
11454
+ <div class="phb-meta-item" *ngFor="let item of metaItems">
11455
+ <dt>{{ item.label }}</dt>
11456
+ <dd>{{ item.value }}</dd>
11457
+ </div>
11458
+ </dl>
11459
+ </div>
11460
+
11461
+ <div class="phb-visual" *ngIf="imageUrl; else noImage">
11462
+ <img class="phb-image" [src]="imageUrl" [alt]="imageAlt || title || subtitle || 'Imagem do destaque'" />
11463
+ </div>
11464
+
11465
+ <ng-template #noImage>
11466
+ <div class="phb-visual phb-visual-fallback" aria-hidden="true">
11467
+ <div class="phb-orb phb-orb-a"></div>
11468
+ <div class="phb-orb phb-orb-b"></div>
11469
+ <div class="phb-grid"></div>
11470
+ </div>
11471
+ </ng-template>
11472
+ </section>
11473
+ `, 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 });
11474
+ }
11475
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisHeroBannerComponent, decorators: [{
11476
+ type: Component,
11477
+ args: [{ selector: 'praxis-hero-banner', standalone: true, imports: [CommonModule], host: {
11478
+ 'class': 'praxis-hero-banner',
11479
+ '[attr.data-instance-id]': 'instanceId || null',
11480
+ '[attr.data-analytics-id]': 'analyticsId || null',
11481
+ '[attr.aria-label]': 'ariaLabel || null',
11482
+ '[attr.role]': 'ariaLabel ? "region" : null',
11483
+ '[attr.data-variant]': 'variant',
11484
+ }, template: `
11485
+ <section class="phb-shell" [class.phb-event]="variant === 'event'" [class.phb-institutional]="variant === 'institutional'">
11486
+ <div class="phb-copy">
11487
+ <div class="phb-badges" *ngIf="badges?.length">
11488
+ <span
11489
+ class="phb-badge"
11490
+ *ngFor="let badge of badges"
11491
+ [class.phb-badge-highlight]="badge.tone === 'highlight'"
11492
+ [class.phb-badge-muted]="badge.tone === 'muted'"
11493
+ [class.phb-badge-warning]="badge.tone === 'warning'"
11494
+ >
11495
+ {{ badge.label }}
11496
+ </span>
11497
+ </div>
11498
+
11499
+ <div class="phb-text">
11500
+ <p class="phb-subtitle" *ngIf="subtitle">{{ subtitle }}</p>
11501
+ <h2 class="phb-title" *ngIf="title">{{ title }}</h2>
11502
+ <p class="phb-description" *ngIf="description">{{ description }}</p>
11503
+ </div>
11504
+
11505
+ <dl class="phb-meta" *ngIf="metaItems?.length">
11506
+ <div class="phb-meta-item" *ngFor="let item of metaItems">
11507
+ <dt>{{ item.label }}</dt>
11508
+ <dd>{{ item.value }}</dd>
11509
+ </div>
11510
+ </dl>
11511
+ </div>
11512
+
11513
+ <div class="phb-visual" *ngIf="imageUrl; else noImage">
11514
+ <img class="phb-image" [src]="imageUrl" [alt]="imageAlt || title || subtitle || 'Imagem do destaque'" />
11515
+ </div>
11516
+
11517
+ <ng-template #noImage>
11518
+ <div class="phb-visual phb-visual-fallback" aria-hidden="true">
11519
+ <div class="phb-orb phb-orb-a"></div>
11520
+ <div class="phb-orb phb-orb-b"></div>
11521
+ <div class="phb-grid"></div>
11522
+ </div>
11523
+ </ng-template>
11524
+ </section>
11525
+ `, 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"] }]
11526
+ }], propDecorators: { instanceId: [{
11527
+ type: Input
11528
+ }], analyticsId: [{
11529
+ type: Input
11530
+ }], ariaLabel: [{
11531
+ type: Input
11532
+ }], title: [{
11533
+ type: Input
11534
+ }], subtitle: [{
11535
+ type: Input
11536
+ }], description: [{
11537
+ type: Input
11538
+ }], imageUrl: [{
11539
+ type: Input
11540
+ }], imageAlt: [{
11541
+ type: Input
11542
+ }], badges: [{
11543
+ type: Input
11544
+ }], metaItems: [{
11545
+ type: Input
11546
+ }], variant: [{
11547
+ type: Input
11548
+ }] } });
11549
+
11550
+ const PRAXIS_HERO_BANNER_METADATA = {
11551
+ id: 'widget:hero-banner',
11552
+ selector: 'praxis-hero-banner',
11553
+ component: PraxisHeroBannerComponent,
11554
+ friendlyName: 'Hero Banner',
11555
+ description: 'Bloco editorial de abertura para experiências institucionais, com badges, metadados e visual responsivo.',
11556
+ icon: 'campaign',
11557
+ inputs: [
11558
+ { name: 'instanceId', type: 'string', label: 'Instance ID', description: 'Identificador estável da instância editorial.' },
11559
+ { name: 'analyticsId', type: 'string', label: 'Analytics ID', description: 'Identificador opcional de telemetria agregada.' },
11560
+ { name: 'ariaLabel', type: 'string', label: 'Aria Label', description: 'Rótulo acessível opcional do hero.' },
11561
+ { name: 'title', type: 'string', label: 'Título', description: 'Título principal do hero.' },
11562
+ { name: 'subtitle', type: 'string', label: 'Subtítulo', description: 'Kicker ou subtítulo acima do título.' },
11563
+ { name: 'description', type: 'string', label: 'Descrição', description: 'Descrição principal do destaque.' },
11564
+ { name: 'imageUrl', type: 'string', label: 'Imagem', description: 'URL opcional da imagem de apoio.' },
11565
+ { name: 'imageAlt', type: 'string', label: 'Alt da imagem', description: 'Texto alternativo da imagem, quando presente.' },
11566
+ { name: 'badges', type: 'Array<{ label: string; tone?: "default" | "highlight" | "muted" | "warning" }>', label: 'Badges', description: 'Badges curatoriais no topo do hero.' },
11567
+ { name: 'metaItems', type: 'Array<{ label: string; value: string }>', label: 'Metadados', description: 'Metadados como data, local ou tenant.' },
11568
+ { name: 'variant', type: "'default' | 'event' | 'institutional'", label: 'Variante', description: 'Variante visual inicial do hero banner.', default: 'default' },
11569
+ ],
11570
+ outputs: [],
11571
+ tags: ['widget', 'editorial', 'hero', 'banner', EDITORIAL_WIDGET_TAG],
11572
+ lib: '@praxisui/core',
11573
+ layoutHints: { recommendedCols: 8, recommendedRows: 3, minCols: 4, minRows: 2 },
11574
+ };
11575
+ function providePraxisHeroBannerMetadata() {
11576
+ return {
11577
+ provide: ENVIRONMENT_INITIALIZER,
11578
+ multi: true,
11579
+ useFactory: (registry) => () => {
11580
+ registry.register(PRAXIS_HERO_BANNER_METADATA);
11581
+ },
11582
+ deps: [ComponentMetadataRegistry],
11583
+ };
11584
+ }
11585
+
11239
11586
  /**
11240
11587
  * Binds a stored icon string to a mat-icon element supporting:
11241
11588
  * - Material Icons (classic ligatures): "mi:pending" or "pending"
@@ -11322,6 +11669,511 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
11322
11669
  args: ['praxisIcon']
11323
11670
  }] } });
11324
11671
 
11672
+ class PraxisRichTextBlockComponent {
11673
+ sanitizer = inject(DomSanitizer);
11674
+ instanceId;
11675
+ analyticsId;
11676
+ ariaLabel;
11677
+ title;
11678
+ subtitle;
11679
+ icon;
11680
+ variant = 'default';
11681
+ contentFormat = 'plain';
11682
+ content = '';
11683
+ get renderedContent() {
11684
+ const format = isAllowedEditorialContentFormat(this.contentFormat) ? this.contentFormat : 'plain';
11685
+ const html = format === 'markdown'
11686
+ ? renderEditorialMarkdown(this.content)
11687
+ : renderEditorialPlain(this.content);
11688
+ return this.sanitizer.sanitize(SecurityContext.HTML, html) ?? '';
11689
+ }
11690
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisRichTextBlockComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11691
+ 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: `
11692
+ <section class="prt-block" [class.prt-block-emphasis]="variant === 'emphasis'" [class.prt-block-subtle]="variant === 'subtle'">
11693
+ <header class="prt-head" *ngIf="icon || title || subtitle">
11694
+ <mat-icon class="prt-icon" *ngIf="icon" aria-hidden="true" [praxisIcon]="icon"></mat-icon>
11695
+ <div class="prt-title-wrap">
11696
+ <h3 class="prt-title" *ngIf="title">{{ title }}</h3>
11697
+ <p class="prt-subtitle" *ngIf="subtitle">{{ subtitle }}</p>
11698
+ </div>
11699
+ </header>
11700
+
11701
+ <div class="prt-content" [innerHTML]="renderedContent"></div>
11702
+ </section>
11703
+ `, 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 });
11704
+ }
11705
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisRichTextBlockComponent, decorators: [{
11706
+ type: Component,
11707
+ args: [{ selector: 'praxis-rich-text-block', standalone: true, imports: [CommonModule, MatIconModule, PraxisIconDirective], host: {
11708
+ 'class': 'praxis-rich-text-block',
11709
+ '[attr.data-instance-id]': 'instanceId || null',
11710
+ '[attr.data-analytics-id]': 'analyticsId || null',
11711
+ '[attr.data-variant]': 'variant',
11712
+ '[attr.aria-label]': 'ariaLabel || null',
11713
+ '[attr.role]': 'ariaLabel ? "region" : null',
11714
+ }, template: `
11715
+ <section class="prt-block" [class.prt-block-emphasis]="variant === 'emphasis'" [class.prt-block-subtle]="variant === 'subtle'">
11716
+ <header class="prt-head" *ngIf="icon || title || subtitle">
11717
+ <mat-icon class="prt-icon" *ngIf="icon" aria-hidden="true" [praxisIcon]="icon"></mat-icon>
11718
+ <div class="prt-title-wrap">
11719
+ <h3 class="prt-title" *ngIf="title">{{ title }}</h3>
11720
+ <p class="prt-subtitle" *ngIf="subtitle">{{ subtitle }}</p>
11721
+ </div>
11722
+ </header>
11723
+
11724
+ <div class="prt-content" [innerHTML]="renderedContent"></div>
11725
+ </section>
11726
+ `, 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"] }]
11727
+ }], propDecorators: { instanceId: [{
11728
+ type: Input
11729
+ }], analyticsId: [{
11730
+ type: Input
11731
+ }], ariaLabel: [{
11732
+ type: Input
11733
+ }], title: [{
11734
+ type: Input
11735
+ }], subtitle: [{
11736
+ type: Input
11737
+ }], icon: [{
11738
+ type: Input
11739
+ }], variant: [{
11740
+ type: Input
11741
+ }], contentFormat: [{
11742
+ type: Input
11743
+ }], content: [{
11744
+ type: Input
11745
+ }] } });
11746
+ function renderEditorialPlain(content) {
11747
+ const blocks = splitParagraphs(content).map((paragraph) => `<p>${escapeHtml(paragraph)}</p>`);
11748
+ return blocks.join('');
11749
+ }
11750
+ function renderEditorialMarkdown(content) {
11751
+ const withoutImages = EDITORIAL_MARKDOWN_IMAGES_ENABLED
11752
+ ? content
11753
+ : content.replace(/!\[([^\]]*)\]\(([^)]+)\)/g, '');
11754
+ const lines = withoutImages.replace(/\r\n/g, '\n').split('\n');
11755
+ const html = [];
11756
+ let listItems = [];
11757
+ const flushList = () => {
11758
+ if (!listItems.length)
11759
+ return;
11760
+ html.push(`<ul>${listItems.join('')}</ul>`);
11761
+ listItems = [];
11762
+ };
11763
+ for (const line of lines) {
11764
+ const trimmed = line.trim();
11765
+ if (!trimmed) {
11766
+ flushList();
11767
+ continue;
11768
+ }
11769
+ const listMatch = /^[-*]\s+(.+)$/.exec(trimmed);
11770
+ if (listMatch) {
11771
+ listItems.push(`<li>${renderInlineMarkdown(listMatch[1])}</li>`);
11772
+ continue;
11773
+ }
11774
+ flushList();
11775
+ html.push(`<p>${renderInlineMarkdown(trimmed)}</p>`);
11776
+ }
11777
+ flushList();
11778
+ return html.join('');
11779
+ }
11780
+ function renderInlineMarkdown(text) {
11781
+ const placeholders = new Map();
11782
+ let index = 0;
11783
+ const reserve = (html) => {
11784
+ const token = `__PRT_TOKEN_${index++}__`;
11785
+ placeholders.set(token, html);
11786
+ return token;
11787
+ };
11788
+ let escaped = escapeHtml(text);
11789
+ escaped = escaped.replace(/`([^`]+)`/g, (_match, code) => reserve(`<code>${escapeHtml(decodeHtml(code))}</code>`));
11790
+ escaped = escaped.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_match, label, href) => {
11791
+ const normalized = normalizeEditorialLink({
11792
+ label: decodeHtml(label),
11793
+ href: decodeHtml(href),
11794
+ });
11795
+ if (!normalized) {
11796
+ return escapeHtml(decodeHtml(label));
11797
+ }
11798
+ const target = normalized.target ? ` target="${escapeHtml(normalized.target)}"` : '';
11799
+ const rel = normalized.rel || EDITORIAL_EXTERNAL_LINK_REL;
11800
+ return reserve(`<a href="${escapeHtml(normalized.href)}"${target} rel="${escapeHtml(rel)}">${escapeHtml(normalized.label)}</a>`);
11801
+ });
11802
+ escaped = escaped.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>');
11803
+ escaped = escaped.replace(/\*([^*]+)\*/g, '<em>$1</em>');
11804
+ placeholders.forEach((value, token) => {
11805
+ escaped = escaped.replaceAll(token, value);
11806
+ });
11807
+ return escaped;
11808
+ }
11809
+ function splitParagraphs(content) {
11810
+ return content
11811
+ .replace(/\r\n/g, '\n')
11812
+ .split(/\n{2,}/)
11813
+ .map((part) => part.trim())
11814
+ .filter(Boolean);
11815
+ }
11816
+ function escapeHtml(value) {
11817
+ return value
11818
+ .replace(/&/g, '&amp;')
11819
+ .replace(/</g, '&lt;')
11820
+ .replace(/>/g, '&gt;')
11821
+ .replace(/"/g, '&quot;')
11822
+ .replace(/'/g, '&#39;');
11823
+ }
11824
+ function decodeHtml(value) {
11825
+ return value
11826
+ .replace(/&lt;/g, '<')
11827
+ .replace(/&gt;/g, '>')
11828
+ .replace(/&quot;/g, '"')
11829
+ .replace(/&#39;/g, '\'')
11830
+ .replace(/&amp;/g, '&');
11831
+ }
11832
+
11833
+ class PraxisLegalNoticeComponent {
11834
+ instanceId;
11835
+ analyticsId;
11836
+ ariaLabel;
11837
+ title;
11838
+ subtitle;
11839
+ contentFormat = 'plain';
11840
+ content = '';
11841
+ severity = 'info';
11842
+ links = [];
11843
+ get normalizedLinks() {
11844
+ return (this.links || [])
11845
+ .map((link) => normalizeEditorialLink(link))
11846
+ .filter((link) => !!link);
11847
+ }
11848
+ get resolvedIcon() {
11849
+ switch (this.severity) {
11850
+ case 'warning':
11851
+ return 'warning';
11852
+ case 'muted':
11853
+ return 'gavel';
11854
+ default:
11855
+ return 'policy';
11856
+ }
11857
+ }
11858
+ get resolvedVariant() {
11859
+ switch (this.severity) {
11860
+ case 'warning':
11861
+ return 'emphasis';
11862
+ case 'muted':
11863
+ return 'subtle';
11864
+ default:
11865
+ return 'default';
11866
+ }
11867
+ }
11868
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisLegalNoticeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11869
+ 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: `
11870
+ <section class="pln-shell" [class.pln-warning]="severity === 'warning'" [class.pln-muted]="severity === 'muted'">
11871
+ <praxis-rich-text-block
11872
+ [instanceId]="instanceId"
11873
+ [analyticsId]="analyticsId"
11874
+ [ariaLabel]="ariaLabel"
11875
+ [title]="title"
11876
+ [subtitle]="subtitle"
11877
+ [icon]="resolvedIcon"
11878
+ [variant]="resolvedVariant"
11879
+ [contentFormat]="contentFormat"
11880
+ [content]="content"
11881
+ ></praxis-rich-text-block>
11882
+
11883
+ <nav class="pln-links" *ngIf="normalizedLinks.length" aria-label="Links do aviso legal">
11884
+ <a
11885
+ *ngFor="let link of normalizedLinks"
11886
+ class="pln-link"
11887
+ [href]="link.href"
11888
+ [attr.target]="link.target || null"
11889
+ [attr.rel]="link.rel || null"
11890
+ >
11891
+ {{ link.label }}
11892
+ </a>
11893
+ </nav>
11894
+ </section>
11895
+ `, 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 });
11896
+ }
11897
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisLegalNoticeComponent, decorators: [{
11898
+ type: Component,
11899
+ args: [{ selector: 'praxis-legal-notice', standalone: true, imports: [CommonModule, PraxisRichTextBlockComponent], host: {
11900
+ 'class': 'praxis-legal-notice',
11901
+ '[attr.data-instance-id]': 'instanceId || null',
11902
+ '[attr.data-analytics-id]': 'analyticsId || null',
11903
+ '[attr.aria-label]': 'ariaLabel || title || "Aviso legal"',
11904
+ 'role': 'note',
11905
+ }, template: `
11906
+ <section class="pln-shell" [class.pln-warning]="severity === 'warning'" [class.pln-muted]="severity === 'muted'">
11907
+ <praxis-rich-text-block
11908
+ [instanceId]="instanceId"
11909
+ [analyticsId]="analyticsId"
11910
+ [ariaLabel]="ariaLabel"
11911
+ [title]="title"
11912
+ [subtitle]="subtitle"
11913
+ [icon]="resolvedIcon"
11914
+ [variant]="resolvedVariant"
11915
+ [contentFormat]="contentFormat"
11916
+ [content]="content"
11917
+ ></praxis-rich-text-block>
11918
+
11919
+ <nav class="pln-links" *ngIf="normalizedLinks.length" aria-label="Links do aviso legal">
11920
+ <a
11921
+ *ngFor="let link of normalizedLinks"
11922
+ class="pln-link"
11923
+ [href]="link.href"
11924
+ [attr.target]="link.target || null"
11925
+ [attr.rel]="link.rel || null"
11926
+ >
11927
+ {{ link.label }}
11928
+ </a>
11929
+ </nav>
11930
+ </section>
11931
+ `, 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"] }]
11932
+ }], propDecorators: { instanceId: [{
11933
+ type: Input
11934
+ }], analyticsId: [{
11935
+ type: Input
11936
+ }], ariaLabel: [{
11937
+ type: Input
11938
+ }], title: [{
11939
+ type: Input
11940
+ }], subtitle: [{
11941
+ type: Input
11942
+ }], contentFormat: [{
11943
+ type: Input
11944
+ }], content: [{
11945
+ type: Input
11946
+ }], severity: [{
11947
+ type: Input
11948
+ }], links: [{
11949
+ type: Input
11950
+ }] } });
11951
+
11952
+ const PRAXIS_LEGAL_NOTICE_METADATA = {
11953
+ id: 'widget:legal-notice',
11954
+ selector: 'praxis-legal-notice',
11955
+ component: PraxisLegalNoticeComponent,
11956
+ friendlyName: 'Legal Notice',
11957
+ description: 'Aviso editorial/jurídico informativo com conteúdo seguro e links normalizados pela policy editorial.',
11958
+ icon: 'policy',
11959
+ inputs: [
11960
+ { name: 'instanceId', type: 'string', label: 'Instance ID', description: 'Identificador estável da instância editorial.' },
11961
+ { name: 'analyticsId', type: 'string', label: 'Analytics ID', description: 'Identificador opcional de telemetria agregada.' },
11962
+ { name: 'ariaLabel', type: 'string', label: 'Aria Label', description: 'Rótulo acessível opcional do aviso legal.' },
11963
+ { name: 'title', type: 'string', label: 'Título', description: 'Título principal do aviso legal.' },
11964
+ { name: 'subtitle', type: 'string', label: 'Subtítulo', description: 'Subtítulo opcional do aviso.' },
11965
+ { name: 'contentFormat', type: "'plain' | 'markdown'", label: 'Formato do conteúdo', description: 'Formato editorial permitido para o corpo do aviso.', default: 'plain' },
11966
+ { name: 'content', type: 'string', label: 'Conteúdo', description: 'Corpo principal do aviso legal.' },
11967
+ { name: 'severity', type: "'info' | 'warning' | 'muted'", label: 'Severidade', description: 'Tom visual/semântico do aviso legal.', default: 'info' },
11968
+ { name: 'links', type: 'EditorialLinkDefinition[]', label: 'Links', description: 'Links complementares do aviso, sempre normalizados pela policy editorial.' },
11969
+ ],
11970
+ outputs: [],
11971
+ tags: ['widget', 'editorial', 'notice', 'legal', EDITORIAL_WIDGET_TAG],
11972
+ lib: '@praxisui/core',
11973
+ };
11974
+ function providePraxisLegalNoticeMetadata() {
11975
+ return {
11976
+ provide: ENVIRONMENT_INITIALIZER,
11977
+ multi: true,
11978
+ useFactory: (registry) => () => {
11979
+ registry.register(PRAXIS_LEGAL_NOTICE_METADATA);
11980
+ },
11981
+ deps: [ComponentMetadataRegistry],
11982
+ };
11983
+ }
11984
+
11985
+ const PRAXIS_RICH_TEXT_BLOCK_METADATA = {
11986
+ id: 'widget:rich-text-block',
11987
+ selector: 'praxis-rich-text-block',
11988
+ component: PraxisRichTextBlockComponent,
11989
+ friendlyName: 'Rich Text Block',
11990
+ description: 'Bloco editorial compartilhado para instruções, contexto institucional e conteúdo de apoio em plain text ou markdown seguro.',
11991
+ icon: 'article',
11992
+ inputs: [
11993
+ { name: 'instanceId', type: 'string', label: 'Instance ID', description: 'Identificador estável da instância editorial.' },
11994
+ { name: 'analyticsId', type: 'string', label: 'Analytics ID', description: 'Identificador opcional de telemetria agregada.' },
11995
+ { name: 'ariaLabel', type: 'string', label: 'Aria Label', description: 'Rótulo acessível opcional do bloco.' },
11996
+ { name: 'title', type: 'string', label: 'Título', description: 'Título principal do bloco.' },
11997
+ { name: 'subtitle', type: 'string', label: 'Subtítulo', description: 'Texto curto complementar abaixo do título.' },
11998
+ { name: 'icon', type: 'string', label: 'Ícone', description: 'Ícone Material Symbols exibido no cabeçalho do bloco.' },
11999
+ { name: 'variant', type: "'default' | 'emphasis' | 'subtle'", label: 'Variante', description: 'Variante visual do bloco editorial.', default: 'default' },
12000
+ { name: 'contentFormat', type: "'plain' | 'markdown'", label: 'Formato do conteúdo', description: 'Formato editorial permitido para renderização do conteúdo.', default: 'plain' },
12001
+ { name: 'content', type: 'string', label: 'Conteúdo', description: 'Corpo principal do bloco em plain text ou markdown seguro.' },
12002
+ ],
12003
+ outputs: [],
12004
+ tags: ['widget', 'editorial', 'content', EDITORIAL_WIDGET_TAG],
12005
+ lib: '@praxisui/core',
12006
+ };
12007
+ function providePraxisRichTextBlockMetadata() {
12008
+ return {
12009
+ provide: ENVIRONMENT_INITIALIZER,
12010
+ multi: true,
12011
+ useFactory: (registry) => () => {
12012
+ registry.register(PRAXIS_RICH_TEXT_BLOCK_METADATA);
12013
+ },
12014
+ deps: [ComponentMetadataRegistry],
12015
+ };
12016
+ }
12017
+
12018
+ class PraxisUserContextSummaryComponent {
12019
+ instanceId;
12020
+ analyticsId;
12021
+ ariaLabel;
12022
+ title;
12023
+ subtitle;
12024
+ source = 'context';
12025
+ context = null;
12026
+ fields = [];
12027
+ actionId = 'change-context';
12028
+ actionLabel;
12029
+ actionTriggered = new EventEmitter();
12030
+ get resolvedFields() {
12031
+ return (this.fields || []).map((field) => ({
12032
+ label: field.label,
12033
+ value: this.resolveFieldValue(field),
12034
+ }));
12035
+ }
12036
+ emitAction() {
12037
+ this.actionTriggered.emit({ actionId: this.actionId || 'change-context' });
12038
+ }
12039
+ resolveFieldValue(field) {
12040
+ if (typeof field.value === 'string' && field.value.trim()) {
12041
+ return field.value;
12042
+ }
12043
+ if (this.source === 'context' && field.valuePath) {
12044
+ const resolved = lookupPath(this.context, field.valuePath);
12045
+ if (resolved != null && String(resolved).trim() !== '') {
12046
+ return String(resolved);
12047
+ }
12048
+ }
12049
+ return field.fallback || '-';
12050
+ }
12051
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisUserContextSummaryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12052
+ 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: `
12053
+ <section class="pux-card">
12054
+ <header class="pux-head" *ngIf="title || subtitle">
12055
+ <h3 class="pux-title" *ngIf="title">{{ title }}</h3>
12056
+ <p class="pux-subtitle" *ngIf="subtitle">{{ subtitle }}</p>
12057
+ </header>
12058
+
12059
+ <dl class="pux-grid" *ngIf="resolvedFields.length; else emptyState">
12060
+ <div class="pux-item" *ngFor="let field of resolvedFields">
12061
+ <dt>{{ field.label }}</dt>
12062
+ <dd>{{ field.value }}</dd>
12063
+ </div>
12064
+ </dl>
12065
+
12066
+ <ng-template #emptyState>
12067
+ <p class="pux-empty">Nenhum contexto disponivel.</p>
12068
+ </ng-template>
12069
+
12070
+ <div class="pux-actions" *ngIf="actionLabel">
12071
+ <button type="button" class="pux-action" (click)="emitAction()">{{ actionLabel }}</button>
12072
+ </div>
12073
+ </section>
12074
+ `, 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 });
12075
+ }
12076
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisUserContextSummaryComponent, decorators: [{
12077
+ type: Component,
12078
+ args: [{ selector: 'praxis-user-context-summary', standalone: true, imports: [CommonModule], host: {
12079
+ 'class': 'praxis-user-context-summary',
12080
+ '[attr.data-instance-id]': 'instanceId || null',
12081
+ '[attr.data-analytics-id]': 'analyticsId || null',
12082
+ '[attr.aria-label]': 'ariaLabel || null',
12083
+ '[attr.role]': 'ariaLabel ? "region" : null',
12084
+ }, template: `
12085
+ <section class="pux-card">
12086
+ <header class="pux-head" *ngIf="title || subtitle">
12087
+ <h3 class="pux-title" *ngIf="title">{{ title }}</h3>
12088
+ <p class="pux-subtitle" *ngIf="subtitle">{{ subtitle }}</p>
12089
+ </header>
12090
+
12091
+ <dl class="pux-grid" *ngIf="resolvedFields.length; else emptyState">
12092
+ <div class="pux-item" *ngFor="let field of resolvedFields">
12093
+ <dt>{{ field.label }}</dt>
12094
+ <dd>{{ field.value }}</dd>
12095
+ </div>
12096
+ </dl>
12097
+
12098
+ <ng-template #emptyState>
12099
+ <p class="pux-empty">Nenhum contexto disponivel.</p>
12100
+ </ng-template>
12101
+
12102
+ <div class="pux-actions" *ngIf="actionLabel">
12103
+ <button type="button" class="pux-action" (click)="emitAction()">{{ actionLabel }}</button>
12104
+ </div>
12105
+ </section>
12106
+ `, 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"] }]
12107
+ }], propDecorators: { instanceId: [{
12108
+ type: Input
12109
+ }], analyticsId: [{
12110
+ type: Input
12111
+ }], ariaLabel: [{
12112
+ type: Input
12113
+ }], title: [{
12114
+ type: Input
12115
+ }], subtitle: [{
12116
+ type: Input
12117
+ }], source: [{
12118
+ type: Input
12119
+ }], context: [{
12120
+ type: Input
12121
+ }], fields: [{
12122
+ type: Input
12123
+ }], actionId: [{
12124
+ type: Input
12125
+ }], actionLabel: [{
12126
+ type: Input
12127
+ }], actionTriggered: [{
12128
+ type: Output
12129
+ }] } });
12130
+ function lookupPath(context, path) {
12131
+ if (!context || !path.trim())
12132
+ return undefined;
12133
+ return path.split('.').reduce((acc, key) => {
12134
+ if (acc && typeof acc === 'object') {
12135
+ return acc[key];
12136
+ }
12137
+ return undefined;
12138
+ }, context);
12139
+ }
12140
+
12141
+ const PRAXIS_USER_CONTEXT_SUMMARY_METADATA = {
12142
+ id: 'form:user-context-summary',
12143
+ selector: 'praxis-user-context-summary',
12144
+ component: PraxisUserContextSummaryComponent,
12145
+ friendlyName: 'User Context Summary',
12146
+ description: 'Resumo contextual do usuário/tenant próximo ao formulário, sem participar de validação ou formData.',
12147
+ icon: 'account_circle',
12148
+ inputs: [
12149
+ { name: 'instanceId', type: 'string', label: 'Instance ID', description: 'Identificador estável da instância editorial.' },
12150
+ { name: 'analyticsId', type: 'string', label: 'Analytics ID', description: 'Identificador opcional de telemetria agregada.' },
12151
+ { name: 'ariaLabel', type: 'string', label: 'Aria Label', description: 'Rótulo acessível opcional do resumo contextual.' },
12152
+ { name: 'title', type: 'string', label: 'Título', description: 'Título principal do resumo.' },
12153
+ { name: 'subtitle', type: 'string', label: 'Subtítulo', description: 'Texto auxiliar explicando o contexto exibido.' },
12154
+ { name: 'source', type: "'context' | 'static'", label: 'Fonte', description: 'Origem dos dados do resumo contextual.', default: 'context' },
12155
+ { name: 'context', type: 'Record<string, unknown> | null', label: 'Contexto', description: 'Objeto tipado usado para resolver valuePath dos campos.' },
12156
+ { 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.' },
12157
+ { name: 'actionId', type: 'string', label: 'Action ID', description: 'Identificador canônico da ação opcional emitida pelo componente.', default: 'change-context' },
12158
+ { name: 'actionLabel', type: 'string', label: 'Action Label', description: 'Texto do CTA opcional para trocar conta/unidade/contexto.' },
12159
+ ],
12160
+ outputs: [
12161
+ { name: 'actionTriggered', type: '{ actionId: string }', label: 'Ação disparada', description: 'Output emitido quando o CTA opcional do resumo contextual é acionado.' },
12162
+ ],
12163
+ tags: ['widget', 'editorial', 'context', 'user', 'form', EDITORIAL_WIDGET_TAG],
12164
+ lib: '@praxisui/core',
12165
+ };
12166
+ function providePraxisUserContextSummaryMetadata() {
12167
+ return {
12168
+ provide: ENVIRONMENT_INITIALIZER,
12169
+ multi: true,
12170
+ useFactory: (registry) => () => {
12171
+ registry.register(PRAXIS_USER_CONTEXT_SUMMARY_METADATA);
12172
+ },
12173
+ deps: [ComponentMetadataRegistry],
12174
+ };
12175
+ }
12176
+
11325
12177
  /**
11326
12178
  * Carrega dinamicamente um componente "widget" (de página) a partir de um id registrado
11327
12179
  * no ComponentMetadataRegistry e aplica bindings declarados em JSON (WidgetDefinition).
@@ -14690,5 +15542,5 @@ function provideHookWhitelist(allowed) {
14690
15542
  * Generated bundle index. Do not edit.
14691
15543
  */
14692
15544
 
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 };
15545
+ 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
15546
  //# sourceMappingURL=praxisui-core.mjs.map