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

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.
@@ -567,6 +567,18 @@ class SchemaNormalizerService {
567
567
  if (ui.group !== undefined) {
568
568
  field.group = ui.group;
569
569
  }
570
+ if (ui.selectionMode !== undefined) {
571
+ field.selectionMode = String(ui.selectionMode);
572
+ }
573
+ if (ui.variant !== undefined) {
574
+ field.variant = String(ui.variant);
575
+ }
576
+ if (ui.density !== undefined) {
577
+ field.density = String(ui.density);
578
+ }
579
+ if (ui.layout !== undefined) {
580
+ field.layout = String(ui.layout);
581
+ }
570
582
  // -------------------------------------------------------------------
571
583
  // Behaviour and validation
572
584
  // -------------------------------------------------------------------
@@ -1375,6 +1387,10 @@ class GlobalConfigService {
1375
1387
  void this.ensureConfigLoaded({ silent: true });
1376
1388
  return (this.configCache ?? this.changes$.value)?.dialog;
1377
1389
  }
1390
+ getI18n() {
1391
+ void this.ensureConfigLoaded({ silent: true });
1392
+ return (this.configCache ?? this.changes$.value)?.i18n;
1393
+ }
1378
1394
  /** Set current tenant (affects storage key). Pass undefined to clear. */
1379
1395
  setTenant(tenantId) {
1380
1396
  const next = tenantId ? String(tenantId).trim() || undefined : undefined;
@@ -7200,6 +7216,26 @@ function providePraxisGlobalConfigBootstrap(options) {
7200
7216
  ];
7201
7217
  }
7202
7218
 
7219
+ const PRAXIS_I18N_CONFIG = new InjectionToken('PRAXIS_I18N_CONFIG', {
7220
+ factory: () => ({}),
7221
+ });
7222
+ const PRAXIS_I18N_TRANSLATOR = new InjectionToken('PRAXIS_I18N_TRANSLATOR');
7223
+
7224
+ function providePraxisI18nConfig(config) {
7225
+ return {
7226
+ provide: PRAXIS_I18N_CONFIG,
7227
+ useValue: config,
7228
+ multi: true,
7229
+ };
7230
+ }
7231
+ const providePraxisI18n = providePraxisI18nConfig;
7232
+ function providePraxisI18nTranslator(translator) {
7233
+ return {
7234
+ provide: PRAXIS_I18N_TRANSLATOR,
7235
+ useValue: translator,
7236
+ };
7237
+ }
7238
+
7203
7239
  function providePraxisGlobalActions(opts = {
7204
7240
  dialog: true,
7205
7241
  toast: true,
@@ -7728,6 +7764,208 @@ const STEPPER_CONFIG_EDITOR = new InjectionToken('STEPPER_CONFIG_EDITOR');
7728
7764
  const DYNAMIC_PAGE_SHELL_EDITOR = new InjectionToken('DYNAMIC_PAGE_SHELL_EDITOR');
7729
7765
  const DYNAMIC_PAGE_CONFIG_EDITOR = new InjectionToken('DYNAMIC_PAGE_CONFIG_EDITOR');
7730
7766
 
7767
+ function interpolatePraxisTranslation(template, params) {
7768
+ if (!template || !params)
7769
+ return template;
7770
+ return template.replace(/\{\{\s*([.\w-]+)\s*\}\}/g, (_match, key) => {
7771
+ const value = params[key];
7772
+ return value == null ? '' : String(value);
7773
+ });
7774
+ }
7775
+ function mergePraxisI18nConfigs(...configs) {
7776
+ const merged = {
7777
+ dictionaries: {},
7778
+ namespaces: {},
7779
+ };
7780
+ for (const cfg of configs) {
7781
+ if (!cfg)
7782
+ continue;
7783
+ if (cfg.locale)
7784
+ merged.locale = cfg.locale;
7785
+ if (cfg.fallbackLocale)
7786
+ merged.fallbackLocale = cfg.fallbackLocale;
7787
+ if (cfg.dictionaries) {
7788
+ for (const [locale, dict] of Object.entries(cfg.dictionaries)) {
7789
+ merged.dictionaries[locale] = {
7790
+ ...(merged.dictionaries?.[locale] ?? {}),
7791
+ ...dict,
7792
+ };
7793
+ }
7794
+ }
7795
+ if (cfg.namespaces) {
7796
+ for (const [namespace, localeMap] of Object.entries(cfg.namespaces)) {
7797
+ const current = merged.namespaces[namespace] ?? {};
7798
+ const next = { ...current };
7799
+ for (const [locale, dict] of Object.entries(localeMap ?? {})) {
7800
+ next[locale] = {
7801
+ ...(current[locale] ?? {}),
7802
+ ...dict,
7803
+ };
7804
+ }
7805
+ merged.namespaces[namespace] = next;
7806
+ }
7807
+ }
7808
+ }
7809
+ return merged;
7810
+ }
7811
+
7812
+ class PraxisI18nService {
7813
+ configs;
7814
+ translator;
7815
+ globalConfig = inject(GlobalConfigService, { optional: true });
7816
+ bootstrapOptions = inject(PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, {
7817
+ optional: true,
7818
+ });
7819
+ constructor(configs, translator) {
7820
+ this.configs = configs;
7821
+ this.translator = translator;
7822
+ }
7823
+ getLocale() {
7824
+ const cfg = this.getConfig();
7825
+ const configLocale = cfg.locale?.trim();
7826
+ if (configLocale)
7827
+ return configLocale;
7828
+ const authLocale = this.bootstrapOptions?.auth?.locale?.()?.trim();
7829
+ if (authLocale)
7830
+ return authLocale;
7831
+ return 'pt-BR';
7832
+ }
7833
+ getFallbackLocale() {
7834
+ const fallback = this.getConfig().fallbackLocale?.trim();
7835
+ return fallback || 'pt-BR';
7836
+ }
7837
+ t(key, params, fallback, namespace) {
7838
+ const message = this.translateExternally(key, params, fallback)
7839
+ ?? this.lookup(key, this.getLocale(), namespace)
7840
+ ?? this.lookup(key, this.getFallbackLocale(), namespace)
7841
+ ?? fallback
7842
+ ?? key;
7843
+ return interpolatePraxisTranslation(message, params);
7844
+ }
7845
+ resolve(message, fallback, namespace) {
7846
+ if (typeof message === 'string')
7847
+ return message;
7848
+ if (!message)
7849
+ return fallback ?? '';
7850
+ const descriptor = message;
7851
+ if (descriptor.key) {
7852
+ return this.t(descriptor.key, descriptor.params, descriptor.text ?? fallback, namespace);
7853
+ }
7854
+ if (descriptor.text) {
7855
+ return interpolatePraxisTranslation(descriptor.text, descriptor.params);
7856
+ }
7857
+ return fallback ?? '';
7858
+ }
7859
+ formatDate(value, options) {
7860
+ const date = value instanceof Date ? value : new Date(value);
7861
+ if (Number.isNaN(date.getTime())) {
7862
+ return this.stringifyInvalidValue(value);
7863
+ }
7864
+ try {
7865
+ return new Intl.DateTimeFormat(this.getLocale(), options).format(date);
7866
+ }
7867
+ catch {
7868
+ try {
7869
+ return new Intl.DateTimeFormat(this.getFallbackLocale(), options).format(date);
7870
+ }
7871
+ catch {
7872
+ return date.toISOString();
7873
+ }
7874
+ }
7875
+ }
7876
+ formatNumber(value, options) {
7877
+ if (!Number.isFinite(value)) {
7878
+ return this.stringifyInvalidValue(value);
7879
+ }
7880
+ try {
7881
+ return new Intl.NumberFormat(this.getLocale(), options).format(value);
7882
+ }
7883
+ catch {
7884
+ try {
7885
+ return new Intl.NumberFormat(this.getFallbackLocale(), options).format(value);
7886
+ }
7887
+ catch {
7888
+ return String(value);
7889
+ }
7890
+ }
7891
+ }
7892
+ formatCurrency(value, currency, options) {
7893
+ if (!Number.isFinite(value)) {
7894
+ return this.stringifyInvalidValue(value);
7895
+ }
7896
+ const normalizedCurrency = currency?.trim().toUpperCase();
7897
+ const currencyOptions = {
7898
+ style: 'currency',
7899
+ currency: normalizedCurrency,
7900
+ ...options,
7901
+ };
7902
+ if (!/^[A-Z]{3}$/.test(normalizedCurrency)) {
7903
+ return this.formatNumber(value, options);
7904
+ }
7905
+ try {
7906
+ return new Intl.NumberFormat(this.getLocale(), currencyOptions).format(value);
7907
+ }
7908
+ catch {
7909
+ try {
7910
+ return new Intl.NumberFormat(this.getFallbackLocale(), currencyOptions).format(value);
7911
+ }
7912
+ catch {
7913
+ return this.formatNumber(value, options);
7914
+ }
7915
+ }
7916
+ }
7917
+ getConfig() {
7918
+ const globalI18n = this.globalConfig?.getI18n?.();
7919
+ const cfgs = Array.isArray(this.configs)
7920
+ ? this.configs
7921
+ : this.configs
7922
+ ? [this.configs]
7923
+ : [];
7924
+ return mergePraxisI18nConfigs(globalI18n, ...cfgs);
7925
+ }
7926
+ lookup(key, locale, namespace) {
7927
+ const cfg = this.getConfig();
7928
+ const namespaced = namespace
7929
+ ? cfg.namespaces?.[namespace]?.[locale]?.[key]
7930
+ : undefined;
7931
+ if (namespaced)
7932
+ return namespaced;
7933
+ return cfg.dictionaries?.[locale]?.[key];
7934
+ }
7935
+ translateExternally(key, params, fallback) {
7936
+ if (!this.translator)
7937
+ return undefined;
7938
+ try {
7939
+ return this.translator.translate(key, params, fallback);
7940
+ }
7941
+ catch {
7942
+ return fallback;
7943
+ }
7944
+ }
7945
+ stringifyInvalidValue(value) {
7946
+ if (value === null || value === undefined) {
7947
+ return '';
7948
+ }
7949
+ return String(value);
7950
+ }
7951
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisI18nService, deps: [{ token: PRAXIS_I18N_CONFIG, optional: true }, { token: PRAXIS_I18N_TRANSLATOR, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
7952
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisI18nService, providedIn: 'root' });
7953
+ }
7954
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisI18nService, decorators: [{
7955
+ type: Injectable,
7956
+ args: [{ providedIn: 'root' }]
7957
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
7958
+ type: Optional
7959
+ }, {
7960
+ type: Inject,
7961
+ args: [PRAXIS_I18N_CONFIG]
7962
+ }] }, { type: undefined, decorators: [{
7963
+ type: Optional
7964
+ }, {
7965
+ type: Inject,
7966
+ args: [PRAXIS_I18N_TRANSLATOR]
7967
+ }] }] });
7968
+
7731
7969
  /**
7732
7970
  * Enum que define os tipos de dados (`TYPE`) disponíveis para configuração dos campos de formulário.
7733
7971
  */
@@ -8067,6 +8305,7 @@ function createDefaultFormConfig() {
8067
8305
  ],
8068
8306
  formBlocksBefore: [],
8069
8307
  formBlocksBeforeActions: [],
8308
+ formBlocksBeforeActionsPlacement: 'afterSections',
8070
8309
  formBlocksAfter: [],
8071
8310
  // Default mode hints (didactic tooltips)
8072
8311
  hints: getDefaultFormHints(),
@@ -8080,7 +8319,13 @@ function isValidFormConfig(config) {
8080
8319
  * Cria configuração vazia para inicialização
8081
8320
  */
8082
8321
  function createEmptyFormConfig() {
8083
- return { sections: [], formBlocksBefore: [], formBlocksBeforeActions: [], formBlocksAfter: [] };
8322
+ return {
8323
+ sections: [],
8324
+ formBlocksBefore: [],
8325
+ formBlocksBeforeActions: [],
8326
+ formBlocksBeforeActionsPlacement: 'afterSections',
8327
+ formBlocksAfter: [],
8328
+ };
8084
8329
  }
8085
8330
  /**
8086
8331
  * Default hint texts for data and UI modes.
@@ -8268,6 +8513,577 @@ function convertFormLayoutToConfig(formLayout) {
8268
8513
  return ensureIds({ sections });
8269
8514
  }
8270
8515
 
8516
+ /**
8517
+ * Materializes a concrete FormConfig from a reusable editorial template.
8518
+ *
8519
+ * Merge rules:
8520
+ * - template defaults provide the base structure
8521
+ * - explicit overrides always win
8522
+ * - collections are replaced, not concatenated, unless omitted in overrides
8523
+ * - template provenance is recorded under config.metadata.template
8524
+ */
8525
+ function buildFormConfigFromEditorialTemplate(template, options = {}) {
8526
+ const overrides = options.overrides ?? {};
8527
+ const base = {
8528
+ sections: template.layout?.sections ?? [],
8529
+ formBlocksBefore: template.layout?.formBlocksBefore ?? [],
8530
+ formBlocksBeforeActions: template.layout?.formBlocksBeforeActions ?? [],
8531
+ formBlocksBeforeActionsPlacement: template.layout?.formBlocksBeforeActionsPlacement ?? 'afterSections',
8532
+ formBlocksAfter: template.layout?.formBlocksAfter ?? [],
8533
+ editorialContext: template.defaults?.editorialContext,
8534
+ fieldMetadata: template.defaults?.fieldMetadata ?? [],
8535
+ actions: template.layout?.actions,
8536
+ behavior: template.defaults?.behavior,
8537
+ api: template.defaults?.api,
8538
+ messages: template.defaults?.messages,
8539
+ formRules: template.defaults?.formRules,
8540
+ hooks: template.defaults?.hooks,
8541
+ hints: template.defaults?.hints,
8542
+ metadata: {
8543
+ ...(options.metadata ?? {}),
8544
+ template: {
8545
+ templateId: template.templateId,
8546
+ version: template.version,
8547
+ title: template.metadata.title,
8548
+ category: template.metadata.category,
8549
+ source: template.metadata.source,
8550
+ appliedAt: new Date(),
8551
+ mode: hasMeaningfulOverrides(overrides) ? 'template+override' : 'template',
8552
+ },
8553
+ },
8554
+ };
8555
+ const merged = {
8556
+ ...base,
8557
+ ...overrides,
8558
+ metadata: {
8559
+ ...(base.metadata ?? {}),
8560
+ ...(options.metadata ?? {}),
8561
+ ...(overrides.metadata ?? {}),
8562
+ template: mergeTemplateReference(base.metadata?.template, options.metadata?.template, overrides.metadata?.template),
8563
+ },
8564
+ };
8565
+ return ensureIds(normalizeFormConfig(merged));
8566
+ }
8567
+ function hasMeaningfulOverrides(overrides) {
8568
+ const keys = Object.keys(overrides).filter((key) => key !== 'metadata');
8569
+ return keys.length > 0;
8570
+ }
8571
+ function mergeTemplateReference(base, metadataPatch, overridePatch) {
8572
+ return {
8573
+ templateId: overridePatch?.templateId
8574
+ ?? metadataPatch?.templateId
8575
+ ?? base.templateId,
8576
+ version: overridePatch?.version
8577
+ ?? metadataPatch?.version
8578
+ ?? base.version,
8579
+ title: overridePatch?.title
8580
+ ?? metadataPatch?.title
8581
+ ?? base.title,
8582
+ category: overridePatch?.category
8583
+ ?? metadataPatch?.category
8584
+ ?? base.category,
8585
+ source: overridePatch?.source
8586
+ ?? metadataPatch?.source
8587
+ ?? base.source,
8588
+ appliedAt: overridePatch?.appliedAt
8589
+ ?? metadataPatch?.appliedAt
8590
+ ?? base.appliedAt,
8591
+ mode: overridePatch?.mode
8592
+ ?? metadataPatch?.mode
8593
+ ?? base.mode,
8594
+ };
8595
+ }
8596
+
8597
+ const EVENT_REGISTRATION_EDITORIAL_TEMPLATE = {
8598
+ templateId: 'event-registration',
8599
+ version: '1.0.0',
8600
+ metadata: {
8601
+ title: 'Event Registration',
8602
+ description: 'Template editorial para inscrições institucionais, eventos, workshops e programas com contexto pré-submit.',
8603
+ category: 'registration',
8604
+ tags: ['event', 'registration', 'editorial', 'consent'],
8605
+ source: 'catalog',
8606
+ owner: 'praxis-core',
8607
+ },
8608
+ shell: {
8609
+ shellVariant: 'card',
8610
+ maxWidth: '820px',
8611
+ pageSpacing: '24px',
8612
+ },
8613
+ compliancePresets: [
8614
+ { id: 'privacy-consent', label: 'Privacy Consent' },
8615
+ { id: 'media-consent', label: 'Media Consent' },
8616
+ ],
8617
+ contextSchema: [
8618
+ { key: 'accountContext.user.name', type: 'string', required: true },
8619
+ { key: 'accountContext.user.email', type: 'string', required: true },
8620
+ { key: 'eventContext.title', type: 'string', required: true },
8621
+ { key: 'eventContext.location', type: 'string' },
8622
+ { key: 'eventContext.dateLabel', type: 'string' },
8623
+ ],
8624
+ layout: {
8625
+ formBlocksBefore: [
8626
+ {
8627
+ id: 'widget:hero-banner',
8628
+ inputs: {
8629
+ instanceId: 'template:event-registration:hero',
8630
+ title: 'Inscrição em evento',
8631
+ titleAccent: 'institucional',
8632
+ subtitle: 'Template editorial',
8633
+ description: 'Estrutura base para inscrições em encontros, workshops, roadshows e experiências de marca.',
8634
+ variant: 'event',
8635
+ appearance: 'flat',
8636
+ },
8637
+ },
8638
+ {
8639
+ id: 'widget:rich-text-block',
8640
+ inputs: {
8641
+ instanceId: 'template:event-registration:intro',
8642
+ title: 'Como preencher',
8643
+ subtitle: 'Orientação inicial',
8644
+ icon: 'info',
8645
+ variant: 'default',
8646
+ appearance: 'plain',
8647
+ contentFormat: 'markdown',
8648
+ content: 'Use dados atualizados, revise os consentimentos e confirme sua disponibilidade antes do envio.',
8649
+ },
8650
+ },
8651
+ ],
8652
+ sections: [
8653
+ {
8654
+ id: 'registration',
8655
+ appearance: 'step',
8656
+ stepLabel: '1',
8657
+ title: 'Inscrição',
8658
+ description: 'Dados principais do participante e critérios de participação.',
8659
+ rows: [
8660
+ { id: 'row-name', columns: [{ id: 'col-name', fields: ['fullName'] }] },
8661
+ { id: 'row-email', columns: [{ id: 'col-email', fields: ['email'] }] },
8662
+ { id: 'row-attendance', columns: [{ id: 'col-attendance', fields: ['attendanceMode'] }] },
8663
+ { id: 'row-company', columns: [{ id: 'col-company', fields: ['organizationName'] }] },
8664
+ { id: 'row-role', columns: [{ id: 'col-role', fields: ['jobTitle'] }] },
8665
+ { id: 'row-source', columns: [{ id: 'col-source', fields: ['discoverySource'] }] },
8666
+ { id: 'row-photo-consent', columns: [{ id: 'col-photo-consent', fields: ['photoConsent'] }] },
8667
+ { id: 'row-privacy-consent', columns: [{ id: 'col-privacy-consent', fields: ['privacyConsent'] }] },
8668
+ ],
8669
+ },
8670
+ ],
8671
+ formBlocksBeforeActions: [
8672
+ {
8673
+ id: 'form:user-context-summary',
8674
+ inputs: {
8675
+ instanceId: 'template:event-registration:user-context',
8676
+ title: 'Conta usada no preenchimento',
8677
+ subtitle: 'Resumo contextual antes do envio.',
8678
+ appearance: 'plain',
8679
+ source: 'context',
8680
+ context: '${accountContext}',
8681
+ fields: [
8682
+ { label: 'Nome', valuePath: 'user.name', fallback: '-' },
8683
+ { label: 'E-mail', valuePath: 'user.email', fallback: '-' },
8684
+ ],
8685
+ actionId: 'switch-user',
8686
+ actionLabel: 'Trocar conta',
8687
+ },
8688
+ },
8689
+ {
8690
+ id: 'widget:legal-notice',
8691
+ inputs: {
8692
+ instanceId: 'template:event-registration:privacy',
8693
+ title: 'Privacidade e uso de dados',
8694
+ severity: 'muted',
8695
+ appearance: 'plain',
8696
+ contentFormat: 'markdown',
8697
+ content: 'Ao enviar a inscrição, o participante reconhece o tratamento dos dados para credenciamento, comunicações e operação do evento.',
8698
+ },
8699
+ },
8700
+ ],
8701
+ formBlocksBeforeActionsPlacement: 'insideLastSection',
8702
+ formBlocksAfter: [
8703
+ {
8704
+ id: 'widget:footer-links',
8705
+ inputs: {
8706
+ instanceId: 'template:event-registration:footer',
8707
+ brandText: 'Praxis UI',
8708
+ secondaryText: 'Template editorial reutilizável para experiências de inscrição.',
8709
+ layout: 'inline',
8710
+ appearance: 'plain',
8711
+ links: [
8712
+ { label: 'Privacidade', href: '/privacidade' },
8713
+ { label: 'Termos', href: '/termos' },
8714
+ ],
8715
+ },
8716
+ },
8717
+ ],
8718
+ actions: {
8719
+ placement: 'afterSections',
8720
+ position: 'right',
8721
+ orientation: 'horizontal',
8722
+ spacing: 'normal',
8723
+ submit: {
8724
+ visible: true,
8725
+ label: 'Enviar inscrição',
8726
+ type: 'submit',
8727
+ color: 'primary',
8728
+ variant: 'raised',
8729
+ },
8730
+ cancel: {
8731
+ visible: false,
8732
+ label: 'Cancelar',
8733
+ type: 'button',
8734
+ color: 'basic',
8735
+ },
8736
+ reset: {
8737
+ visible: false,
8738
+ label: 'Reset',
8739
+ type: 'reset',
8740
+ color: 'basic',
8741
+ },
8742
+ },
8743
+ },
8744
+ defaults: {
8745
+ fieldMetadata: [
8746
+ { name: 'fullName', label: 'Nome completo*', controlType: 'input', required: true },
8747
+ { name: 'email', label: 'E-mail*', controlType: 'email', required: true, readonly: true },
8748
+ {
8749
+ name: 'attendanceMode',
8750
+ label: 'Como pretende participar?*',
8751
+ controlType: 'radio',
8752
+ required: true,
8753
+ selectionMode: 'single',
8754
+ options: [
8755
+ { text: 'Presencial', value: 'PRESENTIAL' },
8756
+ { text: 'Online', value: 'ONLINE' },
8757
+ ],
8758
+ },
8759
+ { name: 'organizationName', label: 'Empresa ou instituição*', controlType: 'input', required: true },
8760
+ { name: 'jobTitle', label: 'Cargo', controlType: 'input' },
8761
+ {
8762
+ name: 'discoverySource',
8763
+ label: 'Como conheceu o evento?*',
8764
+ controlType: 'select',
8765
+ required: true,
8766
+ options: [
8767
+ { text: 'Site institucional', value: 'WEBSITE' },
8768
+ { text: 'LinkedIn', value: 'LINKEDIN' },
8769
+ { text: 'Indicação', value: 'REFERRAL' },
8770
+ { text: 'Outro', value: 'OTHER' },
8771
+ ],
8772
+ },
8773
+ {
8774
+ name: 'photoConsent',
8775
+ label: 'Autorizo uso de imagem no contexto do evento.',
8776
+ controlType: 'checkbox',
8777
+ selectionMode: 'boolean',
8778
+ variant: 'consent',
8779
+ density: 'comfortable',
8780
+ required: true,
8781
+ requiredChecked: true,
8782
+ },
8783
+ {
8784
+ name: 'privacyConsent',
8785
+ label: 'Aceito a política de privacidade e o tratamento dos dados informados.',
8786
+ controlType: 'checkbox',
8787
+ selectionMode: 'boolean',
8788
+ variant: 'consent',
8789
+ density: 'comfortable',
8790
+ required: true,
8791
+ requiredChecked: true,
8792
+ },
8793
+ ],
8794
+ },
8795
+ };
8796
+ const EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE = {
8797
+ templateId: 'employee-onboarding',
8798
+ version: '1.0.0',
8799
+ metadata: {
8800
+ title: 'Employee Onboarding',
8801
+ description: 'Template editorial para admissão, pré-boarding e coleta inicial de dados de colaboradores.',
8802
+ category: 'onboarding',
8803
+ tags: ['employee', 'onboarding', 'hr', 'documents'],
8804
+ source: 'catalog',
8805
+ owner: 'praxis-core',
8806
+ },
8807
+ shell: {
8808
+ shellVariant: 'wizard',
8809
+ maxWidth: '920px',
8810
+ pageSpacing: '24px',
8811
+ },
8812
+ compliancePresets: [
8813
+ { id: 'privacy-consent', label: 'Privacy Consent' },
8814
+ { id: 'employment-documents', label: 'Employment Documents' },
8815
+ ],
8816
+ contextSchema: [
8817
+ { key: 'company.name', type: 'string', required: true },
8818
+ { key: 'company.hrEmail', type: 'string' },
8819
+ { key: 'position.title', type: 'string' },
8820
+ { key: 'manager.name', type: 'string' },
8821
+ ],
8822
+ layout: {
8823
+ formBlocksBefore: [
8824
+ {
8825
+ id: 'widget:hero-banner',
8826
+ inputs: {
8827
+ instanceId: 'template:employee-onboarding:hero',
8828
+ title: 'Boas-vindas ao processo de',
8829
+ titleAccent: 'onboarding',
8830
+ subtitle: 'Template corporativo',
8831
+ description: 'Base para admissão, conferência cadastral, preferências de trabalho e aceite de políticas internas.',
8832
+ variant: 'institutional',
8833
+ appearance: 'card',
8834
+ },
8835
+ },
8836
+ {
8837
+ id: 'widget:rich-text-block',
8838
+ inputs: {
8839
+ instanceId: 'template:employee-onboarding:summary',
8840
+ title: 'O que será coletado',
8841
+ subtitle: 'Resumo do fluxo',
8842
+ icon: 'badge',
8843
+ variant: 'subtle',
8844
+ appearance: 'plain',
8845
+ contentFormat: 'markdown',
8846
+ content: '- dados pessoais e de contato\n- preferências operacionais iniciais\n- anexos e termos obrigatórios',
8847
+ },
8848
+ },
8849
+ ],
8850
+ sections: [
8851
+ {
8852
+ id: 'identity',
8853
+ appearance: 'step',
8854
+ stepLabel: '1',
8855
+ title: 'Identificação',
8856
+ description: 'Dados essenciais para cadastro inicial do colaborador.',
8857
+ rows: [
8858
+ {
8859
+ id: 'row-identity',
8860
+ columns: [
8861
+ { id: 'col-full-name', fields: ['fullName'] },
8862
+ { id: 'col-corporate-email', fields: ['corporateEmail'] },
8863
+ ],
8864
+ },
8865
+ {
8866
+ id: 'row-personal',
8867
+ columns: [
8868
+ { id: 'col-phone', fields: ['phoneNumber'] },
8869
+ { id: 'col-work-model', fields: ['workModel'] },
8870
+ ],
8871
+ },
8872
+ ],
8873
+ },
8874
+ {
8875
+ id: 'operations',
8876
+ appearance: 'step',
8877
+ stepLabel: '2',
8878
+ title: 'Operação inicial',
8879
+ description: 'Dados para preparação do ambiente e comunicação inicial.',
8880
+ rows: [
8881
+ { id: 'row-equipment', columns: [{ id: 'col-equipment', fields: ['needsEquipment'] }] },
8882
+ { id: 'row-address', columns: [{ id: 'col-address', fields: ['shippingAddress'] }] },
8883
+ { id: 'row-notes', columns: [{ id: 'col-notes', fields: ['accessibilityNotes'] }] },
8884
+ { id: 'row-privacy', columns: [{ id: 'col-privacy', fields: ['privacyConsent'] }] },
8885
+ ],
8886
+ },
8887
+ ],
8888
+ formBlocksBeforeActions: [
8889
+ {
8890
+ id: 'widget:legal-notice',
8891
+ inputs: {
8892
+ instanceId: 'template:employee-onboarding:notice',
8893
+ title: 'Uso interno',
8894
+ severity: 'info',
8895
+ appearance: 'plain',
8896
+ content: 'As informações deste fluxo são usadas exclusivamente para cadastro interno, provisionamento e comunicação de onboarding.',
8897
+ },
8898
+ },
8899
+ ],
8900
+ formBlocksBeforeActionsPlacement: 'afterSections',
8901
+ actions: {
8902
+ placement: 'afterSections',
8903
+ position: 'right',
8904
+ submit: {
8905
+ visible: true,
8906
+ label: 'Concluir onboarding',
8907
+ type: 'submit',
8908
+ color: 'primary',
8909
+ variant: 'raised',
8910
+ },
8911
+ cancel: { visible: false, label: 'Cancelar', type: 'button', color: 'basic' },
8912
+ reset: { visible: false, label: 'Reset', type: 'reset', color: 'basic' },
8913
+ },
8914
+ },
8915
+ defaults: {
8916
+ fieldMetadata: [
8917
+ { name: 'fullName', label: 'Nome completo*', controlType: 'input', required: true },
8918
+ { name: 'corporateEmail', label: 'E-mail corporativo*', controlType: 'email', required: true },
8919
+ { name: 'phoneNumber', label: 'Telefone', controlType: 'input' },
8920
+ {
8921
+ name: 'workModel',
8922
+ label: 'Modelo de trabalho*',
8923
+ controlType: 'radio',
8924
+ required: true,
8925
+ options: [
8926
+ { text: 'Presencial', value: 'ONSITE' },
8927
+ { text: 'Híbrido', value: 'HYBRID' },
8928
+ { text: 'Remoto', value: 'REMOTE' },
8929
+ ],
8930
+ },
8931
+ {
8932
+ name: 'needsEquipment',
8933
+ label: 'Necessita envio de equipamento?',
8934
+ controlType: 'radio',
8935
+ required: true,
8936
+ options: [
8937
+ { text: 'Sim', value: 'YES' },
8938
+ { text: 'Não', value: 'NO' },
8939
+ ],
8940
+ },
8941
+ { name: 'shippingAddress', label: 'Endereço para envio', controlType: 'textarea' },
8942
+ { name: 'accessibilityNotes', label: 'Observações de acessibilidade ou preferências', controlType: 'textarea' },
8943
+ {
8944
+ name: 'privacyConsent',
8945
+ label: 'Confirmo ciência sobre o tratamento dos meus dados no processo de onboarding.',
8946
+ controlType: 'checkbox',
8947
+ selectionMode: 'boolean',
8948
+ variant: 'consent',
8949
+ density: 'comfortable',
8950
+ required: true,
8951
+ requiredChecked: true,
8952
+ },
8953
+ ],
8954
+ },
8955
+ };
8956
+ const PRIVACY_CONSENT_EDITORIAL_TEMPLATE = {
8957
+ templateId: 'privacy-consent',
8958
+ version: '1.0.0',
8959
+ metadata: {
8960
+ title: 'Privacy Consent',
8961
+ description: 'Template focado em aceite explícito, base legal, preferências de comunicação e registro de consentimento.',
8962
+ category: 'consent',
8963
+ tags: ['privacy', 'consent', 'compliance', 'legal'],
8964
+ source: 'catalog',
8965
+ owner: 'praxis-core',
8966
+ },
8967
+ shell: {
8968
+ shellVariant: 'plain',
8969
+ maxWidth: '760px',
8970
+ pageSpacing: '20px',
8971
+ },
8972
+ compliancePresets: [{ id: 'privacy-consent', label: 'Privacy Consent' }],
8973
+ contextSchema: [
8974
+ { key: 'policy.title', type: 'string', required: true },
8975
+ { key: 'policy.version', type: 'string' },
8976
+ { key: 'policy.updatedAt', type: 'date' },
8977
+ ],
8978
+ layout: {
8979
+ formBlocksBefore: [
8980
+ {
8981
+ id: 'widget:legal-notice',
8982
+ inputs: {
8983
+ instanceId: 'template:privacy-consent:lead',
8984
+ title: 'Consentimento e tratamento de dados',
8985
+ severity: 'info',
8986
+ appearance: 'card',
8987
+ contentFormat: 'markdown',
8988
+ content: 'Use este template quando o objetivo principal do fluxo for registrar ciência, aceite e preferências relacionadas a privacidade.',
8989
+ },
8990
+ },
8991
+ ],
8992
+ sections: [
8993
+ {
8994
+ id: 'consent',
8995
+ appearance: 'card',
8996
+ title: 'Preferências e consentimentos',
8997
+ description: 'Aceites explícitos e canais opcionais de comunicação.',
8998
+ rows: [
8999
+ { id: 'row-primary', columns: [{ id: 'col-primary', fields: ['privacyConsent'] }] },
9000
+ { id: 'row-marketing', columns: [{ id: 'col-marketing', fields: ['marketingConsent'] }] },
9001
+ { id: 'row-channels', columns: [{ id: 'col-channels', fields: ['preferredChannel'] }] },
9002
+ { id: 'row-observation', columns: [{ id: 'col-observation', fields: ['consentNotes'] }] },
9003
+ ],
9004
+ },
9005
+ ],
9006
+ formBlocksAfter: [
9007
+ {
9008
+ id: 'widget:footer-links',
9009
+ inputs: {
9010
+ instanceId: 'template:privacy-consent:footer',
9011
+ brandText: 'Praxis UI',
9012
+ secondaryText: 'Template para fluxos regulatórios e comprovação de consentimento.',
9013
+ layout: 'inline',
9014
+ appearance: 'divider',
9015
+ links: [
9016
+ { label: 'Política de Privacidade', href: '/privacidade' },
9017
+ { label: 'Canal LGPD', href: '/lgpd' },
9018
+ ],
9019
+ },
9020
+ },
9021
+ ],
9022
+ actions: {
9023
+ placement: 'afterSections',
9024
+ position: 'right',
9025
+ submit: {
9026
+ visible: true,
9027
+ label: 'Registrar consentimento',
9028
+ type: 'submit',
9029
+ color: 'primary',
9030
+ variant: 'raised',
9031
+ },
9032
+ cancel: { visible: false, label: 'Cancelar', type: 'button', color: 'basic' },
9033
+ reset: { visible: false, label: 'Reset', type: 'reset', color: 'basic' },
9034
+ },
9035
+ },
9036
+ defaults: {
9037
+ fieldMetadata: [
9038
+ {
9039
+ name: 'privacyConsent',
9040
+ label: 'Li e aceito a política de privacidade aplicável.',
9041
+ controlType: 'checkbox',
9042
+ selectionMode: 'boolean',
9043
+ variant: 'consent',
9044
+ density: 'comfortable',
9045
+ required: true,
9046
+ requiredChecked: true,
9047
+ },
9048
+ {
9049
+ name: 'marketingConsent',
9050
+ label: 'Aceito receber comunicações institucionais e materiais relacionados.',
9051
+ controlType: 'checkbox',
9052
+ selectionMode: 'boolean',
9053
+ variant: 'consent',
9054
+ density: 'comfortable',
9055
+ },
9056
+ {
9057
+ name: 'preferredChannel',
9058
+ label: 'Canal preferencial de comunicação',
9059
+ controlType: 'select',
9060
+ options: [
9061
+ { text: 'E-mail', value: 'EMAIL' },
9062
+ { text: 'Telefone', value: 'PHONE' },
9063
+ { text: 'WhatsApp', value: 'WHATSAPP' },
9064
+ ],
9065
+ },
9066
+ {
9067
+ name: 'consentNotes',
9068
+ label: 'Observações adicionais',
9069
+ controlType: 'textarea',
9070
+ },
9071
+ ],
9072
+ },
9073
+ };
9074
+ const EDITORIAL_FORM_TEMPLATE_CATALOG = [
9075
+ EVENT_REGISTRATION_EDITORIAL_TEMPLATE,
9076
+ EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE,
9077
+ PRIVACY_CONSENT_EDITORIAL_TEMPLATE,
9078
+ ];
9079
+ function getEditorialFormTemplateCatalog() {
9080
+ return EDITORIAL_FORM_TEMPLATE_CATALOG.map((template) => structuredClone(template));
9081
+ }
9082
+ function getEditorialFormTemplateById(templateId) {
9083
+ const match = EDITORIAL_FORM_TEMPLATE_CATALOG.find((template) => template.templateId === templateId);
9084
+ return match ? structuredClone(match) : undefined;
9085
+ }
9086
+
8271
9087
  const RULE_PROPERTY_SCHEMA = {
8272
9088
  field: [
8273
9089
  { name: 'visible', type: 'boolean', label: 'Visível' },
@@ -8375,7 +9191,17 @@ const RULE_PROPERTY_SCHEMA = {
8375
9191
  { value: 'bodySmall', label: 'Body pequeno' },
8376
9192
  ],
8377
9193
  },
8378
- { name: 'appearance', type: 'string', label: 'Aparência' },
9194
+ {
9195
+ name: 'appearance',
9196
+ type: 'enum',
9197
+ label: 'Aparência',
9198
+ enumValues: [
9199
+ { value: 'card', label: 'Card' },
9200
+ { value: 'plain', label: 'Plain' },
9201
+ { value: 'step', label: 'Step' },
9202
+ ],
9203
+ },
9204
+ { name: 'stepLabel', type: 'string', label: 'Rótulo do passo' },
8379
9205
  ],
8380
9206
  action: [
8381
9207
  { name: 'visible', type: 'boolean', label: 'Visível' },
@@ -8449,6 +9275,497 @@ const RULE_PROPERTY_SCHEMA = {
8449
9275
  ],
8450
9276
  };
8451
9277
 
9278
+ const EDITORIAL_THEME_PRESETS = [
9279
+ {
9280
+ themeId: 'institutional-card',
9281
+ label: 'Institutional Card',
9282
+ description: 'Tema editorial compacto para fluxos institucionais com hero e superfície centralizada.',
9283
+ shellVariant: 'card',
9284
+ maxWidth: '820px',
9285
+ pageSpacing: '24px',
9286
+ surfaceVariant: 'institutional',
9287
+ },
9288
+ {
9289
+ themeId: 'corporate-wizard',
9290
+ label: 'Corporate Wizard',
9291
+ description: 'Tema editorial para jornadas longas de onboarding e preparação operacional.',
9292
+ shellVariant: 'wizard',
9293
+ maxWidth: '920px',
9294
+ pageSpacing: '24px',
9295
+ surfaceVariant: 'corporate',
9296
+ },
9297
+ {
9298
+ themeId: 'compliance-plain',
9299
+ label: 'Compliance Plain',
9300
+ description: 'Tema enxuto para consentimento, aceite explícito e comprovação regulatória.',
9301
+ shellVariant: 'plain',
9302
+ maxWidth: '760px',
9303
+ pageSpacing: '20px',
9304
+ surfaceVariant: 'compliance',
9305
+ },
9306
+ ];
9307
+ const EDITORIAL_COMPLIANCE_PRESETS = [
9308
+ {
9309
+ presetId: 'privacy-consent',
9310
+ label: 'Privacy Consent',
9311
+ description: 'Preset canônico para aceite de política, base legal e evidências mínimas de consentimento.',
9312
+ problemTypes: ['event-registration', 'employee-onboarding', 'privacy-consent'],
9313
+ requiredContextKeys: ['policy.title'],
9314
+ requiredEvidenceKeys: ['privacyConsentAcceptedAt'],
9315
+ requiredAcceptances: ['privacyConsent'],
9316
+ blocks: [
9317
+ {
9318
+ blockId: 'compliance:privacy-explainer',
9319
+ kind: 'legalNotice',
9320
+ title: 'Privacidade e tratamento de dados',
9321
+ contentFormat: 'markdown',
9322
+ content: 'Este fluxo requer consentimento explícito e registro de base legal aplicável ao tratamento dos dados informados.',
9323
+ tone: 'institutional',
9324
+ surface: 'plain',
9325
+ },
9326
+ ],
9327
+ },
9328
+ {
9329
+ presetId: 'media-consent',
9330
+ label: 'Media Consent',
9331
+ description: 'Preset para experiências que exigem autorização de imagem, gravação ou divulgação pública.',
9332
+ problemTypes: ['event-registration'],
9333
+ requiredAcceptances: ['photoConsent'],
9334
+ },
9335
+ {
9336
+ presetId: 'employment-documents',
9337
+ label: 'Employment Documents',
9338
+ description: 'Preset para onboarding com documentos, aceite de políticas internas e preparação operacional.',
9339
+ problemTypes: ['employee-onboarding'],
9340
+ requiredAcceptances: ['privacyConsent'],
9341
+ },
9342
+ ];
9343
+ const EDITORIAL_SOLUTION_PRESETS = [
9344
+ {
9345
+ presetId: 'preset:event-registration:institutional',
9346
+ label: 'Event Registration Institutional',
9347
+ description: 'Fluxo editorial de inscrição em evento com contexto de conta, elegibilidade e consentimentos.',
9348
+ problemType: 'event-registration',
9349
+ themePresetId: 'institutional-card',
9350
+ compliancePresetIds: ['privacy-consent', 'media-consent'],
9351
+ dataBlockOrder: ['registration-form'],
9352
+ tags: ['event', 'registration', 'institutional'],
9353
+ },
9354
+ {
9355
+ presetId: 'preset:employee-onboarding:default',
9356
+ label: 'Employee Onboarding Default',
9357
+ description: 'Fluxo editorial de onboarding com narrativa de jornada, contexto corporativo e aceite interno.',
9358
+ problemType: 'employee-onboarding',
9359
+ themePresetId: 'corporate-wizard',
9360
+ compliancePresetIds: ['privacy-consent', 'employment-documents'],
9361
+ dataBlockOrder: ['identity-form', 'operations-form'],
9362
+ tags: ['hr', 'onboarding', 'corporate'],
9363
+ },
9364
+ {
9365
+ presetId: 'preset:privacy-consent:default',
9366
+ label: 'Privacy Consent Default',
9367
+ description: 'Fluxo editorial enxuto para consentimento, preferências de canal e observações adicionais.',
9368
+ problemType: 'privacy-consent',
9369
+ themePresetId: 'compliance-plain',
9370
+ compliancePresetIds: ['privacy-consent'],
9371
+ dataBlockOrder: ['consent-form'],
9372
+ tags: ['privacy', 'consent', 'compliance'],
9373
+ },
9374
+ ];
9375
+ const EVENT_REGISTRATION_EDITORIAL_SOLUTION = {
9376
+ solutionId: 'event-registration',
9377
+ version: '1.0.0',
9378
+ problemType: 'event-registration',
9379
+ title: 'Event Registration',
9380
+ description: 'Solução editorial para inscrições em eventos institucionais, workshops e experiências de marca com consentimentos e revisão contextual.',
9381
+ contextContract: [
9382
+ { key: 'accountContext.user.name', type: 'string', required: true },
9383
+ { key: 'accountContext.user.email', type: 'string', required: true },
9384
+ { key: 'eventContext.title', type: 'string', required: true },
9385
+ { key: 'eventContext.location', type: 'string' },
9386
+ { key: 'eventContext.dateLabel', type: 'string' },
9387
+ { key: 'policy.title', type: 'string' },
9388
+ ],
9389
+ journeys: [
9390
+ {
9391
+ journeyId: 'event-registration-journey',
9392
+ label: 'Inscrição institucional',
9393
+ description: 'Jornada editorial do convite até a confirmação final da inscrição.',
9394
+ steps: [
9395
+ {
9396
+ stepId: 'welcome',
9397
+ label: 'Abertura',
9398
+ blocks: [
9399
+ {
9400
+ blockId: 'event:hero',
9401
+ kind: 'hero',
9402
+ title: 'Inscrição em evento',
9403
+ titleAccent: 'institucional',
9404
+ subtitle: 'Template editorial',
9405
+ description: 'Estrutura base para inscrições em encontros, workshops, roadshows e experiências de marca.',
9406
+ tone: 'institutional',
9407
+ surface: 'plain',
9408
+ badges: [{ label: 'Vagas limitadas', tone: 'warning' }],
9409
+ },
9410
+ {
9411
+ blockId: 'event:intro',
9412
+ kind: 'richText',
9413
+ title: 'Como preencher',
9414
+ subtitle: 'Orientação inicial',
9415
+ contentFormat: 'markdown',
9416
+ content: 'Use dados atualizados, revise os consentimentos e confirme sua disponibilidade antes do envio.',
9417
+ tone: 'default',
9418
+ surface: 'plain',
9419
+ },
9420
+ ],
9421
+ },
9422
+ {
9423
+ stepId: 'registration',
9424
+ label: 'Dados do participante',
9425
+ blocks: [
9426
+ {
9427
+ blockId: 'event:user-context',
9428
+ kind: 'contextSummary',
9429
+ title: 'Conta usada no preenchimento',
9430
+ subtitle: 'Resumo contextual antes do envio.',
9431
+ contextPath: 'accountContext',
9432
+ fields: [
9433
+ { key: 'name', label: 'Nome', valuePath: 'user.name', fallback: '-' },
9434
+ { key: 'email', label: 'E-mail', valuePath: 'user.email', fallback: '-' },
9435
+ ],
9436
+ actionId: 'switch-user',
9437
+ actionLabel: 'Trocar conta',
9438
+ surface: 'plain',
9439
+ },
9440
+ {
9441
+ blockId: 'registration-form',
9442
+ kind: 'dataCollection',
9443
+ title: 'Inscrição',
9444
+ description: 'Dados principais do participante e critérios de participação.',
9445
+ formBlockId: 'registration-form',
9446
+ },
9447
+ ],
9448
+ },
9449
+ {
9450
+ stepId: 'review',
9451
+ label: 'Revisão e envio',
9452
+ blocks: [
9453
+ {
9454
+ blockId: 'event:privacy-notice',
9455
+ kind: 'legalNotice',
9456
+ title: 'Privacidade e uso de dados',
9457
+ contentFormat: 'markdown',
9458
+ content: 'Ao enviar a inscrição, o participante reconhece o tratamento dos dados para credenciamento, comunicações e operação do evento.',
9459
+ tone: 'muted',
9460
+ surface: 'plain',
9461
+ },
9462
+ {
9463
+ blockId: 'event:review-summary',
9464
+ kind: 'reviewSummary',
9465
+ title: 'Antes de enviar',
9466
+ description: 'Revise os principais dados e confirme os consentimentos obrigatórios.',
9467
+ fields: [
9468
+ { key: 'fullName', label: 'Nome completo', valuePath: 'formData.fullName', fallback: '-' },
9469
+ { key: 'email', label: 'E-mail', valuePath: 'formData.email', fallback: '-' },
9470
+ { key: 'attendance', label: 'Participação', valuePath: 'formData.attendanceMode', fallback: '-' },
9471
+ ],
9472
+ checklist: [
9473
+ 'Os dados cadastrais estão corretos.',
9474
+ 'Os consentimentos obrigatórios foram confirmados.',
9475
+ 'A disponibilidade para participação foi revisada.',
9476
+ ],
9477
+ surface: 'card',
9478
+ },
9479
+ {
9480
+ blockId: 'event:footer',
9481
+ kind: 'footerLinks',
9482
+ widget: {
9483
+ id: 'widget:footer-links',
9484
+ inputs: {
9485
+ instanceId: 'solution:event-registration:footer',
9486
+ brandText: 'Praxis UI',
9487
+ secondaryText: 'Solução editorial reutilizável para experiências de inscrição.',
9488
+ layout: 'inline',
9489
+ appearance: 'plain',
9490
+ links: [
9491
+ { label: 'Privacidade', href: '/privacidade' },
9492
+ { label: 'Termos', href: '/termos' },
9493
+ ],
9494
+ },
9495
+ },
9496
+ },
9497
+ ],
9498
+ },
9499
+ ],
9500
+ },
9501
+ ],
9502
+ themePresets: EDITORIAL_THEME_PRESETS.filter((preset) => preset.themeId === 'institutional-card'),
9503
+ compliancePresets: EDITORIAL_COMPLIANCE_PRESETS.filter((preset) => ['privacy-consent', 'media-consent'].includes(preset.presetId)),
9504
+ tags: ['event', 'registration', 'editorial', 'consent'],
9505
+ owner: 'praxis-core',
9506
+ };
9507
+ const EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION = {
9508
+ solutionId: 'employee-onboarding',
9509
+ version: '1.0.0',
9510
+ problemType: 'employee-onboarding',
9511
+ title: 'Employee Onboarding',
9512
+ description: 'Solução editorial para admissão, pré-boarding e coleta inicial de dados de colaboradores com narrativa corporativa.',
9513
+ contextContract: [
9514
+ { key: 'company.name', type: 'string', required: true },
9515
+ { key: 'company.hrEmail', type: 'string' },
9516
+ { key: 'position.title', type: 'string' },
9517
+ { key: 'manager.name', type: 'string' },
9518
+ { key: 'policy.title', type: 'string' },
9519
+ ],
9520
+ journeys: [
9521
+ {
9522
+ journeyId: 'employee-onboarding-journey',
9523
+ label: 'Onboarding corporativo',
9524
+ description: 'Jornada editorial da chegada do colaborador até a preparação operacional inicial.',
9525
+ steps: [
9526
+ {
9527
+ stepId: 'welcome',
9528
+ label: 'Boas-vindas',
9529
+ blocks: [
9530
+ {
9531
+ blockId: 'onboarding:hero',
9532
+ kind: 'hero',
9533
+ title: 'Boas-vindas ao processo de',
9534
+ titleAccent: 'onboarding',
9535
+ subtitle: 'Template corporativo',
9536
+ description: 'Base para admissão, conferência cadastral, preferências de trabalho e aceite de políticas internas.',
9537
+ surface: 'card',
9538
+ tone: 'institutional',
9539
+ },
9540
+ {
9541
+ blockId: 'onboarding:summary',
9542
+ kind: 'richText',
9543
+ title: 'O que será coletado',
9544
+ subtitle: 'Resumo do fluxo',
9545
+ contentFormat: 'markdown',
9546
+ content: '- dados pessoais e de contato\n- preferências operacionais iniciais\n- anexos e termos obrigatórios',
9547
+ tone: 'muted',
9548
+ surface: 'plain',
9549
+ },
9550
+ {
9551
+ blockId: 'onboarding:timeline',
9552
+ kind: 'timelineSteps',
9553
+ title: 'Como funciona a jornada',
9554
+ steps: [
9555
+ { id: 'identity', label: 'Identificação', description: 'Cadastro inicial e dados pessoais.' },
9556
+ { id: 'operations', label: 'Preparação operacional', description: 'Equipamentos, endereço e preferências.' },
9557
+ { id: 'confirmation', label: 'Confirmação', description: 'Revisão final e aceite interno.' },
9558
+ ],
9559
+ surface: 'card',
9560
+ },
9561
+ ],
9562
+ },
9563
+ {
9564
+ stepId: 'identity',
9565
+ label: 'Identificação',
9566
+ blocks: [
9567
+ {
9568
+ blockId: 'identity-form',
9569
+ kind: 'dataCollection',
9570
+ title: 'Dados essenciais',
9571
+ description: 'Informações essenciais para cadastro inicial do colaborador.',
9572
+ formBlockId: 'identity-form',
9573
+ },
9574
+ ],
9575
+ },
9576
+ {
9577
+ stepId: 'operations',
9578
+ label: 'Operação inicial',
9579
+ blocks: [
9580
+ {
9581
+ blockId: 'operations:notice',
9582
+ kind: 'legalNotice',
9583
+ title: 'Uso interno',
9584
+ content: 'As informações deste fluxo são usadas exclusivamente para cadastro interno, provisionamento e comunicação de onboarding.',
9585
+ tone: 'default',
9586
+ surface: 'plain',
9587
+ },
9588
+ {
9589
+ blockId: 'operations-form',
9590
+ kind: 'dataCollection',
9591
+ title: 'Preparação operacional',
9592
+ description: 'Dados para preparação do ambiente e comunicação inicial.',
9593
+ formBlockId: 'operations-form',
9594
+ },
9595
+ ],
9596
+ },
9597
+ {
9598
+ stepId: 'confirmation',
9599
+ label: 'Confirmação',
9600
+ blocks: [
9601
+ {
9602
+ blockId: 'onboarding:review-summary',
9603
+ kind: 'reviewSummary',
9604
+ title: 'Checklist final do onboarding',
9605
+ fields: [
9606
+ { key: 'fullName', label: 'Nome completo', valuePath: 'formData.fullName', fallback: '-' },
9607
+ { key: 'corporateEmail', label: 'E-mail corporativo', valuePath: 'formData.corporateEmail', fallback: '-' },
9608
+ { key: 'workModel', label: 'Modelo de trabalho', valuePath: 'formData.workModel', fallback: '-' },
9609
+ ],
9610
+ checklist: [
9611
+ 'Os dados pessoais foram revisados.',
9612
+ 'As necessidades operacionais foram registradas.',
9613
+ 'O aceite de privacidade foi confirmado.',
9614
+ ],
9615
+ surface: 'card',
9616
+ },
9617
+ ],
9618
+ },
9619
+ ],
9620
+ },
9621
+ ],
9622
+ themePresets: EDITORIAL_THEME_PRESETS.filter((preset) => preset.themeId === 'corporate-wizard'),
9623
+ compliancePresets: EDITORIAL_COMPLIANCE_PRESETS.filter((preset) => ['privacy-consent', 'employment-documents'].includes(preset.presetId)),
9624
+ tags: ['employee', 'onboarding', 'hr', 'documents'],
9625
+ owner: 'praxis-core',
9626
+ };
9627
+ const PRIVACY_CONSENT_EDITORIAL_SOLUTION = {
9628
+ solutionId: 'privacy-consent',
9629
+ version: '1.0.0',
9630
+ problemType: 'privacy-consent',
9631
+ title: 'Privacy Consent',
9632
+ description: 'Solução editorial focada em aceite explícito, base legal, preferências de comunicação e registro de consentimento.',
9633
+ contextContract: [
9634
+ { key: 'policy.title', type: 'string', required: true },
9635
+ { key: 'policy.version', type: 'string' },
9636
+ { key: 'policy.updatedAt', type: 'date' },
9637
+ ],
9638
+ journeys: [
9639
+ {
9640
+ journeyId: 'privacy-consent-journey',
9641
+ label: 'Consentimento regulatório',
9642
+ description: 'Jornada editorial curta para registrar ciência, consentimento e preferências de canal.',
9643
+ steps: [
9644
+ {
9645
+ stepId: 'policy-context',
9646
+ label: 'Contexto',
9647
+ blocks: [
9648
+ {
9649
+ blockId: 'privacy:lead',
9650
+ kind: 'legalNotice',
9651
+ title: 'Consentimento e tratamento de dados',
9652
+ contentFormat: 'markdown',
9653
+ content: 'Use esta solução quando o objetivo principal do fluxo for registrar ciência, aceite e preferências relacionadas a privacidade.',
9654
+ tone: 'default',
9655
+ surface: 'card',
9656
+ },
9657
+ {
9658
+ blockId: 'privacy:policy-list',
9659
+ kind: 'policyList',
9660
+ title: 'Documentos e políticas relacionados',
9661
+ items: [
9662
+ {
9663
+ id: 'privacy-policy',
9664
+ title: 'Política de Privacidade',
9665
+ summary: 'Documento principal que define base legal, finalidades e direitos do titular.',
9666
+ required: true,
9667
+ href: '/privacidade',
9668
+ evidenceKey: 'privacyConsentAcceptedAt',
9669
+ },
9670
+ {
9671
+ id: 'lgpd-channel',
9672
+ title: 'Canal LGPD',
9673
+ summary: 'Canal de atendimento para solicitações e exercício de direitos.',
9674
+ required: false,
9675
+ href: '/lgpd',
9676
+ },
9677
+ ],
9678
+ actionId: 'open-policy-center',
9679
+ actionLabel: 'Abrir central de políticas',
9680
+ surface: 'card',
9681
+ },
9682
+ ],
9683
+ },
9684
+ {
9685
+ stepId: 'consent',
9686
+ label: 'Preferências',
9687
+ blocks: [
9688
+ {
9689
+ blockId: 'consent-form',
9690
+ kind: 'dataCollection',
9691
+ title: 'Preferências e consentimentos',
9692
+ description: 'Aceites explícitos e canais opcionais de comunicação.',
9693
+ formBlockId: 'consent-form',
9694
+ },
9695
+ ],
9696
+ },
9697
+ {
9698
+ stepId: 'confirmation',
9699
+ label: 'Confirmação',
9700
+ blocks: [
9701
+ {
9702
+ blockId: 'privacy:review-summary',
9703
+ kind: 'reviewSummary',
9704
+ title: 'Resumo do consentimento',
9705
+ fields: [
9706
+ { key: 'privacyConsent', label: 'Consentimento principal', valuePath: 'formData.privacyConsent', fallback: '-' },
9707
+ { key: 'preferredChannel', label: 'Canal preferencial', valuePath: 'formData.preferredChannel', fallback: '-' },
9708
+ ],
9709
+ checklist: [
9710
+ 'A política aplicável foi revisada.',
9711
+ 'O consentimento principal foi registrado.',
9712
+ 'As preferências de comunicação foram definidas.',
9713
+ ],
9714
+ surface: 'card',
9715
+ },
9716
+ {
9717
+ blockId: 'privacy:footer',
9718
+ kind: 'footerLinks',
9719
+ widget: {
9720
+ id: 'widget:footer-links',
9721
+ inputs: {
9722
+ instanceId: 'solution:privacy-consent:footer',
9723
+ brandText: 'Praxis UI',
9724
+ secondaryText: 'Solução para fluxos regulatórios e comprovação de consentimento.',
9725
+ layout: 'inline',
9726
+ appearance: 'divider',
9727
+ links: [
9728
+ { label: 'Política de Privacidade', href: '/privacidade' },
9729
+ { label: 'Canal LGPD', href: '/lgpd' },
9730
+ ],
9731
+ },
9732
+ },
9733
+ },
9734
+ ],
9735
+ },
9736
+ ],
9737
+ },
9738
+ ],
9739
+ themePresets: EDITORIAL_THEME_PRESETS.filter((preset) => preset.themeId === 'compliance-plain'),
9740
+ compliancePresets: EDITORIAL_COMPLIANCE_PRESETS.filter((preset) => preset.presetId === 'privacy-consent'),
9741
+ tags: ['privacy', 'consent', 'compliance', 'legal'],
9742
+ owner: 'praxis-core',
9743
+ };
9744
+ const EDITORIAL_SOLUTION_CATALOG = [
9745
+ EVENT_REGISTRATION_EDITORIAL_SOLUTION,
9746
+ EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION,
9747
+ PRIVACY_CONSENT_EDITORIAL_SOLUTION,
9748
+ ];
9749
+ function getEditorialSolutionCatalog() {
9750
+ return EDITORIAL_SOLUTION_CATALOG.map((solution) => structuredClone(solution));
9751
+ }
9752
+ function getEditorialSolutionById(solutionId) {
9753
+ const match = EDITORIAL_SOLUTION_CATALOG.find((solution) => solution.solutionId === solutionId);
9754
+ return match ? structuredClone(match) : undefined;
9755
+ }
9756
+ function getEditorialThemePresetById(themeId) {
9757
+ const match = EDITORIAL_THEME_PRESETS.find((preset) => preset.themeId === themeId);
9758
+ return match ? structuredClone(match) : undefined;
9759
+ }
9760
+ function getEditorialCompliancePresetById(presetId) {
9761
+ const match = EDITORIAL_COMPLIANCE_PRESETS.find((preset) => preset.presetId === presetId);
9762
+ return match ? structuredClone(match) : undefined;
9763
+ }
9764
+ function getEditorialSolutionPresetById(presetId) {
9765
+ const match = EDITORIAL_SOLUTION_PRESETS.find((preset) => preset.presetId === presetId);
9766
+ return match ? structuredClone(match) : undefined;
9767
+ }
9768
+
8452
9769
  /** Utility: generate a random id using crypto.randomUUID or fallback. */
8453
9770
  function generateId() {
8454
9771
  const g = globalThis.crypto?.randomUUID?.();
@@ -8782,6 +10099,10 @@ function mapFieldDefinitionToMetadata(field) {
8782
10099
  'selectAll',
8783
10100
  'maxSelections',
8784
10101
  'emptyOptionText',
10102
+ 'selectionMode',
10103
+ 'variant',
10104
+ 'density',
10105
+ 'layout',
8785
10106
  ];
8786
10107
  for (const prop of simpleProps) {
8787
10108
  const value = field[prop];
@@ -8861,8 +10182,10 @@ function mapFieldDefinitionToMetadata(field) {
8861
10182
  metadata.options = mapped;
8862
10183
  metadata.selectOptions = mapped;
8863
10184
  }
8864
- // Single boolean checkboxes without explicit options should behave as toggles
10185
+ // Legacy fallback: schema-derived checkbox without explicit selectionMode or options
10186
+ // still maps to toggle. New contract keeps checkbox when selectionMode is explicit.
8865
10187
  if (metadata.controlType === FieldControlType.CHECKBOX &&
10188
+ metadata.selectionMode === undefined &&
8866
10189
  !field.options?.length &&
8867
10190
  !field.checkboxOptions?.length) {
8868
10191
  metadata.controlType = FieldControlType.TOGGLE;
@@ -10031,6 +11354,36 @@ const FIELD_METADATA_CAPABILITIES = {
10031
11354
  description: 'Descrição detalhada (usada em documentação ou helps extensos).',
10032
11355
  intentExamples: ['descrição completa do campo', 'texto explicativo longo', 'documentação do input'],
10033
11356
  },
11357
+ {
11358
+ path: 'selectionMode',
11359
+ category: 'behavior',
11360
+ valueKind: 'enum',
11361
+ allowedValues: ['boolean', 'single', 'multiple'],
11362
+ description: 'Semântica de seleção explícita para controles de escolha.',
11363
+ intentExamples: ['checkbox booleano', 'radio de escolha única', 'grupo múltiplo'],
11364
+ },
11365
+ {
11366
+ path: 'variant',
11367
+ category: 'appearance',
11368
+ valueKind: 'string',
11369
+ description: 'Variante visual/semântica do controle.',
11370
+ intentExamples: ['variante consent', 'modo compact', 'apresentação em tiles'],
11371
+ },
11372
+ {
11373
+ path: 'density',
11374
+ category: 'appearance',
11375
+ valueKind: 'enum',
11376
+ allowedValues: ['compact', 'comfortable', 'spacious'],
11377
+ description: 'Densidade visual do shell do controle.',
11378
+ intentExamples: ['deixar mais compacto', 'usar densidade confortável', 'mais espaçado'],
11379
+ },
11380
+ {
11381
+ path: 'links',
11382
+ category: 'identity',
11383
+ valueKind: 'array',
11384
+ description: 'Links ricos associados ao campo, úteis em consentimentos e conteúdo legal.',
11385
+ intentExamples: ['adicionar link da política', 'incluir termos de uso', 'anexar link institucional'],
11386
+ },
10034
11387
  {
10035
11388
  path: 'group',
10036
11389
  category: 'identity',
@@ -11317,14 +12670,20 @@ class PraxisFooterLinksComponent {
11317
12670
  secondaryText;
11318
12671
  links = [];
11319
12672
  layout = 'inline';
12673
+ appearance = 'divider';
11320
12674
  get normalizedLinks() {
11321
12675
  return (this.links || [])
11322
12676
  .map((link) => normalizeEditorialLink(link))
11323
12677
  .filter((link) => !!link);
11324
12678
  }
11325
12679
  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'">
12680
+ 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", appearance: "appearance" }, 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: `
12681
+ <footer
12682
+ class="pfl-shell"
12683
+ [class.pfl-stacked]="layout === 'stacked'"
12684
+ [class.pfl-plain]="appearance === 'plain'"
12685
+ [class.pfl-surface]="appearance === 'surface'"
12686
+ >
11328
12687
  <div class="pfl-brand" *ngIf="brandText || secondaryText">
11329
12688
  <strong class="pfl-brand-text" *ngIf="brandText">{{ brandText }}</strong>
11330
12689
  <span class="pfl-secondary-text" *ngIf="secondaryText">{{ secondaryText }}</span>
@@ -11342,7 +12701,7 @@ class PraxisFooterLinksComponent {
11342
12701
  </a>
11343
12702
  </nav>
11344
12703
  </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 });
12704
+ `, isInline: true, styles: [":host{display:block;--pfl-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 78%, transparent);--pfl-brand-color: var(--md-sys-color-on-surface);--pfl-secondary-color: var(--md-sys-color-on-surface-variant);--pfl-link-color: var(--md-sys-color-primary);--pfl-surface-bg: color-mix(in srgb, var(--md-sys-color-surface-container-low) 92%, transparent)}:host-context(.mdc-theme-dark),:host-context(.theme-dark){--pfl-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 90%, transparent);--pfl-link-color: color-mix(in srgb, var(--md-sys-color-primary) 86%, white);--pfl-surface-bg: color-mix(in srgb, var(--md-sys-color-surface-container-low) 96%, transparent)}.pfl-shell{display:flex;align-items:center;justify-content:space-between;gap:16px 24px;padding:16px 4px 4px;border-top:1px solid var(--pfl-border)}.pfl-stacked{flex-direction:column;align-items:flex-start}.pfl-plain{padding-top:6px;border-top:0}.pfl-surface{padding:16px 18px;border-top:0;border-radius:18px;background:var(--pfl-surface-bg)}.pfl-brand{display:grid;gap:4px}.pfl-brand-text{color:var(--pfl-brand-color);font-size:.92rem;font-weight:700}.pfl-secondary-text{color:var(--pfl-secondary-color);font-size:.8rem;line-height:1.5}.pfl-nav{display:flex;flex-wrap:wrap;gap:10px 16px}.pfl-link{color:var(--pfl-link-color);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
12705
  }
11347
12706
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisFooterLinksComponent, decorators: [{
11348
12707
  type: Component,
@@ -11353,7 +12712,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
11353
12712
  '[attr.aria-label]': 'ariaLabel || null',
11354
12713
  'role': 'contentinfo',
11355
12714
  }, template: `
11356
- <footer class="pfl-shell" [class.pfl-stacked]="layout === 'stacked'">
12715
+ <footer
12716
+ class="pfl-shell"
12717
+ [class.pfl-stacked]="layout === 'stacked'"
12718
+ [class.pfl-plain]="appearance === 'plain'"
12719
+ [class.pfl-surface]="appearance === 'surface'"
12720
+ >
11357
12721
  <div class="pfl-brand" *ngIf="brandText || secondaryText">
11358
12722
  <strong class="pfl-brand-text" *ngIf="brandText">{{ brandText }}</strong>
11359
12723
  <span class="pfl-secondary-text" *ngIf="secondaryText">{{ secondaryText }}</span>
@@ -11371,7 +12735,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
11371
12735
  </a>
11372
12736
  </nav>
11373
12737
  </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"] }]
12738
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;--pfl-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 78%, transparent);--pfl-brand-color: var(--md-sys-color-on-surface);--pfl-secondary-color: var(--md-sys-color-on-surface-variant);--pfl-link-color: var(--md-sys-color-primary);--pfl-surface-bg: color-mix(in srgb, var(--md-sys-color-surface-container-low) 92%, transparent)}:host-context(.mdc-theme-dark),:host-context(.theme-dark){--pfl-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 90%, transparent);--pfl-link-color: color-mix(in srgb, var(--md-sys-color-primary) 86%, white);--pfl-surface-bg: color-mix(in srgb, var(--md-sys-color-surface-container-low) 96%, transparent)}.pfl-shell{display:flex;align-items:center;justify-content:space-between;gap:16px 24px;padding:16px 4px 4px;border-top:1px solid var(--pfl-border)}.pfl-stacked{flex-direction:column;align-items:flex-start}.pfl-plain{padding-top:6px;border-top:0}.pfl-surface{padding:16px 18px;border-top:0;border-radius:18px;background:var(--pfl-surface-bg)}.pfl-brand{display:grid;gap:4px}.pfl-brand-text{color:var(--pfl-brand-color);font-size:.92rem;font-weight:700}.pfl-secondary-text{color:var(--pfl-secondary-color);font-size:.8rem;line-height:1.5}.pfl-nav{display:flex;flex-wrap:wrap;gap:10px 16px}.pfl-link{color:var(--pfl-link-color);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
12739
  }], propDecorators: { instanceId: [{
11376
12740
  type: Input
11377
12741
  }], analyticsId: [{
@@ -11386,6 +12750,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
11386
12750
  type: Input
11387
12751
  }], layout: [{
11388
12752
  type: Input
12753
+ }], appearance: [{
12754
+ type: Input
11389
12755
  }] } });
11390
12756
 
11391
12757
  const PRAXIS_FOOTER_LINKS_METADATA = {
@@ -11403,6 +12769,7 @@ const PRAXIS_FOOTER_LINKS_METADATA = {
11403
12769
  { name: 'secondaryText', type: 'string', label: 'Texto secundário', description: 'Texto secundário opcional do rodapé.' },
11404
12770
  { name: 'links', type: 'EditorialLinkDefinition[]', label: 'Links', description: 'Lista ordenada de links institucionais.' },
11405
12771
  { name: 'layout', type: "'inline' | 'stacked'", label: 'Layout', description: 'Layout inicial do rodapé institucional.', default: 'inline' },
12772
+ { name: 'appearance', type: "'divider' | 'plain' | 'surface'", label: 'Aparência', description: 'Controla se o rodapé usa divisor simples, modo embutido ou superfície destacada.', default: 'divider' },
11406
12773
  ],
11407
12774
  outputs: [],
11408
12775
  tags: ['widget', 'editorial', 'footer', 'links', EDITORIAL_WIDGET_TAG],
@@ -11431,10 +12798,20 @@ class PraxisHeroBannerComponent {
11431
12798
  badges = [];
11432
12799
  metaItems = [];
11433
12800
  variant = 'default';
12801
+ appearance = 'card';
12802
+ brandText;
12803
+ titleAccent;
11434
12804
  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'">
12805
+ 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", appearance: "appearance", brandText: "brandText", titleAccent: "titleAccent" }, 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: `
12806
+ <section
12807
+ class="phb-shell"
12808
+ [class.phb-event]="variant === 'event'"
12809
+ [class.phb-institutional]="variant === 'institutional'"
12810
+ [class.phb-flat]="appearance === 'flat'"
12811
+ >
11437
12812
  <div class="phb-copy">
12813
+ <p class="phb-brand" *ngIf="brandText">{{ brandText }}</p>
12814
+
11438
12815
  <div class="phb-badges" *ngIf="badges?.length">
11439
12816
  <span
11440
12817
  class="phb-badge"
@@ -11449,7 +12826,10 @@ class PraxisHeroBannerComponent {
11449
12826
 
11450
12827
  <div class="phb-text">
11451
12828
  <p class="phb-subtitle" *ngIf="subtitle">{{ subtitle }}</p>
11452
- <h2 class="phb-title" *ngIf="title">{{ title }}</h2>
12829
+ <h2 class="phb-title" *ngIf="title || titleAccent">
12830
+ <span *ngIf="title">{{ title }}</span>
12831
+ <span class="phb-title-accent" *ngIf="titleAccent">{{ titleAccent }}</span>
12832
+ </h2>
11453
12833
  <p class="phb-description" *ngIf="description">{{ description }}</p>
11454
12834
  </div>
11455
12835
 
@@ -11473,7 +12853,7 @@ class PraxisHeroBannerComponent {
11473
12853
  </div>
11474
12854
  </ng-template>
11475
12855
  </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 });
12856
+ `, isInline: true, styles: [":host{display:block;--phb-shell-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 60%, transparent);--phb-shell-shadow: 0 24px 60px color-mix(in srgb, var(--md-sys-color-shadow, #000) 10%, transparent);--phb-shell-bg: radial-gradient(circle at top right, color-mix(in srgb, var(--md-sys-color-primary) 14%, transparent), transparent 38%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 92%, var(--md-sys-color-primary-container) 8%) 0%, color-mix(in srgb, var(--md-sys-color-surface-container-low) 88%, var(--md-sys-color-primary-container) 12%) 54%, color-mix(in srgb, var(--md-sys-color-surface) 96%, var(--md-sys-color-surface-container) 4%) 100% );--phb-event-bg: radial-gradient(circle at top right, rgba(255, 184, 77, .24), transparent 34%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary-container) 16%, var(--md-sys-color-surface-container-lowest) 84%) 0%, color-mix(in srgb, var(--md-sys-color-primary-container) 24%, var(--md-sys-color-surface-container-low) 76%) 45%, color-mix(in srgb, var(--md-sys-color-surface) 92%, var(--md-sys-color-primary-container) 8%) 100% );--phb-institutional-bg: radial-gradient(circle at top right, rgba(17, 94, 89, .2), transparent 34%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-secondary-container) 18%, var(--md-sys-color-surface-container-lowest) 82%) 0%, color-mix(in srgb, var(--md-sys-color-secondary-container) 24%, var(--md-sys-color-surface-container-low) 76%) 48%, color-mix(in srgb, var(--md-sys-color-surface) 94%, var(--md-sys-color-secondary-container) 6%) 100% );--phb-brand-color: color-mix(in srgb, var(--md-sys-color-primary) 68%, var(--md-sys-color-on-surface) 32%);--phb-subtitle-color: color-mix(in srgb, var(--md-sys-color-primary) 52%, var(--md-sys-color-on-surface) 48%);--phb-title-color: var(--md-sys-color-on-surface);--phb-description-color: var(--md-sys-color-on-surface-variant);--phb-badge-bg: color-mix(in srgb, var(--md-sys-color-surface-container-high) 78%, transparent);--phb-badge-color: var(--md-sys-color-on-surface);--phb-badge-highlight-bg: color-mix(in srgb, var(--md-sys-color-primary-container) 78%, transparent);--phb-badge-highlight-color: var(--md-sys-color-on-primary-container);--phb-badge-muted-bg: color-mix(in srgb, var(--md-sys-color-surface-container-highest) 82%, transparent);--phb-badge-muted-color: var(--md-sys-color-on-surface-variant);--phb-badge-warning-bg: color-mix(in srgb, var(--md-sys-color-error-container) 74%, transparent);--phb-badge-warning-color: var(--md-sys-color-on-error-container);--phb-meta-bg: color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 72%, transparent);--phb-meta-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 48%, transparent);--phb-meta-label-color: var(--md-sys-color-on-surface-variant);--phb-meta-value-color: var(--md-sys-color-on-surface);--phb-visual-bg: linear-gradient( 160deg, color-mix(in srgb, var(--md-sys-color-surface-container-high) 90%, var(--md-sys-color-primary) 10%), color-mix(in srgb, var(--md-sys-color-surface-container-low) 88%, var(--md-sys-color-primary-container) 12%) );--phb-visual-fallback: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface-bright, var(--md-sys-color-surface-container-high)) 24%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 8%, transparent) ), linear-gradient( 145deg, color-mix(in srgb, var(--md-sys-color-primary) 18%, var(--md-sys-color-surface-container-high) 82%), color-mix(in srgb, var(--md-sys-color-primary-container) 18%, var(--md-sys-color-surface-container-low) 82%) );--phb-orb-a-bg: color-mix(in srgb, var(--md-sys-color-surface-bright, var(--md-sys-color-surface-container-high)) 68%, transparent);--phb-orb-b-bg: color-mix(in srgb, var(--md-sys-color-primary) 22%, transparent);--phb-grid-line: color-mix(in srgb, var(--md-sys-color-on-surface) 12%, transparent)}:host-context(.mdc-theme-dark),:host-context(.theme-dark){--phb-shell-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 84%, transparent);--phb-shell-shadow: 0 22px 54px rgba(0, 0, 0, .28);--phb-shell-bg: radial-gradient(circle at top right, color-mix(in srgb, var(--md-sys-color-primary) 16%, transparent), transparent 40%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 90%, var(--md-sys-color-primary-container) 10%) 0%, color-mix(in srgb, var(--md-sys-color-surface-container-low) 84%, var(--md-sys-color-primary-container) 16%) 54%, color-mix(in srgb, var(--md-sys-color-surface) 92%, var(--md-sys-color-primary-container) 8%) 100% );--phb-event-bg: radial-gradient(circle at top right, rgba(255, 184, 77, .18), transparent 36%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary-container) 16%, var(--md-sys-color-surface-container-lowest) 84%) 0%, color-mix(in srgb, var(--md-sys-color-primary-container) 22%, var(--md-sys-color-surface-container-low) 78%) 45%, color-mix(in srgb, var(--md-sys-color-surface-container) 90%, var(--md-sys-color-primary-container) 10%) 100% );--phb-institutional-bg: radial-gradient(circle at top right, rgba(17, 94, 89, .16), transparent 36%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-secondary-container) 16%, var(--md-sys-color-surface-container-lowest) 84%) 0%, color-mix(in srgb, var(--md-sys-color-secondary-container) 20%, var(--md-sys-color-surface-container-low) 80%) 48%, color-mix(in srgb, var(--md-sys-color-surface-container) 92%, var(--md-sys-color-secondary-container) 8%) 100% );--phb-meta-bg: color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 70%, transparent);--phb-meta-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 60%, transparent);--phb-visual-bg: linear-gradient( 160deg, color-mix(in srgb, var(--md-sys-color-surface-container-high) 88%, var(--md-sys-color-primary) 12%), color-mix(in srgb, var(--md-sys-color-surface-container) 82%, var(--md-sys-color-primary-container) 18%) );--phb-visual-fallback: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface-container-high) 22%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 8%, transparent) ), linear-gradient( 145deg, color-mix(in srgb, var(--md-sys-color-primary) 22%, var(--md-sys-color-surface-container-high) 78%), color-mix(in srgb, var(--md-sys-color-primary-container) 24%, var(--md-sys-color-surface-container-low) 76%) );--phb-orb-a-bg: color-mix(in srgb, var(--md-sys-color-surface-container-highest) 34%, transparent);--phb-orb-b-bg: color-mix(in srgb, var(--md-sys-color-primary) 26%, transparent);--phb-grid-line: color-mix(in srgb, var(--md-sys-color-on-surface) 10%, transparent)}.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:var(--phb-shell-bg);border:1px solid var(--phb-shell-border);box-shadow:var(--phb-shell-shadow)}.phb-event{background:var(--phb-event-bg)}.phb-institutional{background:var(--phb-institutional-bg)}.phb-copy{display:grid;gap:18px;min-width:0}.phb-brand{margin:0;color:var(--phb-brand-color);font-size:.88rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.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:var(--phb-badge-bg);color:var(--phb-badge-color);font-size:.76rem;font-weight:700;letter-spacing:.02em}.phb-badge-highlight{background:var(--phb-badge-highlight-bg);color:var(--phb-badge-highlight-color)}.phb-badge-muted{background:var(--phb-badge-muted-bg);color:var(--phb-badge-muted-color)}.phb-badge-warning{background:var(--phb-badge-warning-bg);color:var(--phb-badge-warning-color)}.phb-text{display:grid;gap:8px}.phb-subtitle{margin:0;color:var(--phb-subtitle-color);font-size:.9rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.phb-title{margin:0;color:var(--phb-title-color);font-size:clamp(1.6rem,2.2vw,2.5rem);line-height:1.08;letter-spacing:-.03em}.phb-title-accent{display:inline;margin-left:.18em;background:linear-gradient(90deg,#4285f4,#6ea8ff 28%,#a142f4 62%,#ea4335);-webkit-background-clip:text;background-clip:text;color:transparent}.phb-description{margin:0;max-width:56ch;color:var(--phb-description-color);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:var(--phb-meta-bg);border:1px solid var(--phb-meta-border);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.phb-meta-item dt{margin:0;color:var(--phb-meta-label-color);font-size:.73rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.phb-meta-item dd{margin:0;color:var(--phb-meta-value-color);font-size:.92rem;line-height:1.45}.phb-visual{position:relative;min-height:220px;border-radius:22px;overflow:hidden;background:var(--phb-visual-bg)}.phb-image{display:block;width:100%;height:100%;object-fit:cover}.phb-visual-fallback{background:var(--phb-visual-fallback)}.phb-flat{padding:0 0 18px;border:0;border-radius:0;box-shadow:none;background:transparent;grid-template-columns:minmax(0,1.15fr) minmax(220px,.85fr);gap:18px}.phb-flat .phb-brand{color:var(--md-sys-color-primary)}.phb-flat .phb-badges{order:3}.phb-flat .phb-meta{grid-template-columns:1fr;gap:6px}.phb-flat .phb-meta-item{padding:0;border:0;border-radius:0;background:transparent;-webkit-backdrop-filter:none;backdrop-filter:none}.phb-flat .phb-meta-item dt,.phb-flat .phb-meta-item dd{display:inline}.phb-flat .phb-meta-item dt{margin-right:6px}.phb-flat .phb-visual{min-height:190px;border-radius:26px}.phb-orb{position:absolute;border-radius:999px;filter:blur(2px)}.phb-orb-a{inset:24px auto auto 20px;width:86px;height:86px;background:var(--phb-orb-a-bg)}.phb-orb-b{inset:auto 16px 18px auto;width:132px;height:132px;background:var(--phb-orb-b-bg)}.phb-grid{position:absolute;inset:0;background-image:linear-gradient(var(--phb-grid-line) 1px,transparent 1px),linear-gradient(90deg,var(--phb-grid-line) 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
12857
  }
11478
12858
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisHeroBannerComponent, decorators: [{
11479
12859
  type: Component,
@@ -11485,8 +12865,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
11485
12865
  '[attr.role]': 'ariaLabel ? "region" : null',
11486
12866
  '[attr.data-variant]': 'variant',
11487
12867
  }, template: `
11488
- <section class="phb-shell" [class.phb-event]="variant === 'event'" [class.phb-institutional]="variant === 'institutional'">
12868
+ <section
12869
+ class="phb-shell"
12870
+ [class.phb-event]="variant === 'event'"
12871
+ [class.phb-institutional]="variant === 'institutional'"
12872
+ [class.phb-flat]="appearance === 'flat'"
12873
+ >
11489
12874
  <div class="phb-copy">
12875
+ <p class="phb-brand" *ngIf="brandText">{{ brandText }}</p>
12876
+
11490
12877
  <div class="phb-badges" *ngIf="badges?.length">
11491
12878
  <span
11492
12879
  class="phb-badge"
@@ -11501,7 +12888,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
11501
12888
 
11502
12889
  <div class="phb-text">
11503
12890
  <p class="phb-subtitle" *ngIf="subtitle">{{ subtitle }}</p>
11504
- <h2 class="phb-title" *ngIf="title">{{ title }}</h2>
12891
+ <h2 class="phb-title" *ngIf="title || titleAccent">
12892
+ <span *ngIf="title">{{ title }}</span>
12893
+ <span class="phb-title-accent" *ngIf="titleAccent">{{ titleAccent }}</span>
12894
+ </h2>
11505
12895
  <p class="phb-description" *ngIf="description">{{ description }}</p>
11506
12896
  </div>
11507
12897
 
@@ -11525,7 +12915,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
11525
12915
  </div>
11526
12916
  </ng-template>
11527
12917
  </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"] }]
12918
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;--phb-shell-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 60%, transparent);--phb-shell-shadow: 0 24px 60px color-mix(in srgb, var(--md-sys-color-shadow, #000) 10%, transparent);--phb-shell-bg: radial-gradient(circle at top right, color-mix(in srgb, var(--md-sys-color-primary) 14%, transparent), transparent 38%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 92%, var(--md-sys-color-primary-container) 8%) 0%, color-mix(in srgb, var(--md-sys-color-surface-container-low) 88%, var(--md-sys-color-primary-container) 12%) 54%, color-mix(in srgb, var(--md-sys-color-surface) 96%, var(--md-sys-color-surface-container) 4%) 100% );--phb-event-bg: radial-gradient(circle at top right, rgba(255, 184, 77, .24), transparent 34%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary-container) 16%, var(--md-sys-color-surface-container-lowest) 84%) 0%, color-mix(in srgb, var(--md-sys-color-primary-container) 24%, var(--md-sys-color-surface-container-low) 76%) 45%, color-mix(in srgb, var(--md-sys-color-surface) 92%, var(--md-sys-color-primary-container) 8%) 100% );--phb-institutional-bg: radial-gradient(circle at top right, rgba(17, 94, 89, .2), transparent 34%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-secondary-container) 18%, var(--md-sys-color-surface-container-lowest) 82%) 0%, color-mix(in srgb, var(--md-sys-color-secondary-container) 24%, var(--md-sys-color-surface-container-low) 76%) 48%, color-mix(in srgb, var(--md-sys-color-surface) 94%, var(--md-sys-color-secondary-container) 6%) 100% );--phb-brand-color: color-mix(in srgb, var(--md-sys-color-primary) 68%, var(--md-sys-color-on-surface) 32%);--phb-subtitle-color: color-mix(in srgb, var(--md-sys-color-primary) 52%, var(--md-sys-color-on-surface) 48%);--phb-title-color: var(--md-sys-color-on-surface);--phb-description-color: var(--md-sys-color-on-surface-variant);--phb-badge-bg: color-mix(in srgb, var(--md-sys-color-surface-container-high) 78%, transparent);--phb-badge-color: var(--md-sys-color-on-surface);--phb-badge-highlight-bg: color-mix(in srgb, var(--md-sys-color-primary-container) 78%, transparent);--phb-badge-highlight-color: var(--md-sys-color-on-primary-container);--phb-badge-muted-bg: color-mix(in srgb, var(--md-sys-color-surface-container-highest) 82%, transparent);--phb-badge-muted-color: var(--md-sys-color-on-surface-variant);--phb-badge-warning-bg: color-mix(in srgb, var(--md-sys-color-error-container) 74%, transparent);--phb-badge-warning-color: var(--md-sys-color-on-error-container);--phb-meta-bg: color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 72%, transparent);--phb-meta-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 48%, transparent);--phb-meta-label-color: var(--md-sys-color-on-surface-variant);--phb-meta-value-color: var(--md-sys-color-on-surface);--phb-visual-bg: linear-gradient( 160deg, color-mix(in srgb, var(--md-sys-color-surface-container-high) 90%, var(--md-sys-color-primary) 10%), color-mix(in srgb, var(--md-sys-color-surface-container-low) 88%, var(--md-sys-color-primary-container) 12%) );--phb-visual-fallback: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface-bright, var(--md-sys-color-surface-container-high)) 24%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 8%, transparent) ), linear-gradient( 145deg, color-mix(in srgb, var(--md-sys-color-primary) 18%, var(--md-sys-color-surface-container-high) 82%), color-mix(in srgb, var(--md-sys-color-primary-container) 18%, var(--md-sys-color-surface-container-low) 82%) );--phb-orb-a-bg: color-mix(in srgb, var(--md-sys-color-surface-bright, var(--md-sys-color-surface-container-high)) 68%, transparent);--phb-orb-b-bg: color-mix(in srgb, var(--md-sys-color-primary) 22%, transparent);--phb-grid-line: color-mix(in srgb, var(--md-sys-color-on-surface) 12%, transparent)}:host-context(.mdc-theme-dark),:host-context(.theme-dark){--phb-shell-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 84%, transparent);--phb-shell-shadow: 0 22px 54px rgba(0, 0, 0, .28);--phb-shell-bg: radial-gradient(circle at top right, color-mix(in srgb, var(--md-sys-color-primary) 16%, transparent), transparent 40%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 90%, var(--md-sys-color-primary-container) 10%) 0%, color-mix(in srgb, var(--md-sys-color-surface-container-low) 84%, var(--md-sys-color-primary-container) 16%) 54%, color-mix(in srgb, var(--md-sys-color-surface) 92%, var(--md-sys-color-primary-container) 8%) 100% );--phb-event-bg: radial-gradient(circle at top right, rgba(255, 184, 77, .18), transparent 36%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary-container) 16%, var(--md-sys-color-surface-container-lowest) 84%) 0%, color-mix(in srgb, var(--md-sys-color-primary-container) 22%, var(--md-sys-color-surface-container-low) 78%) 45%, color-mix(in srgb, var(--md-sys-color-surface-container) 90%, var(--md-sys-color-primary-container) 10%) 100% );--phb-institutional-bg: radial-gradient(circle at top right, rgba(17, 94, 89, .16), transparent 36%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-secondary-container) 16%, var(--md-sys-color-surface-container-lowest) 84%) 0%, color-mix(in srgb, var(--md-sys-color-secondary-container) 20%, var(--md-sys-color-surface-container-low) 80%) 48%, color-mix(in srgb, var(--md-sys-color-surface-container) 92%, var(--md-sys-color-secondary-container) 8%) 100% );--phb-meta-bg: color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 70%, transparent);--phb-meta-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 60%, transparent);--phb-visual-bg: linear-gradient( 160deg, color-mix(in srgb, var(--md-sys-color-surface-container-high) 88%, var(--md-sys-color-primary) 12%), color-mix(in srgb, var(--md-sys-color-surface-container) 82%, var(--md-sys-color-primary-container) 18%) );--phb-visual-fallback: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface-container-high) 22%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 8%, transparent) ), linear-gradient( 145deg, color-mix(in srgb, var(--md-sys-color-primary) 22%, var(--md-sys-color-surface-container-high) 78%), color-mix(in srgb, var(--md-sys-color-primary-container) 24%, var(--md-sys-color-surface-container-low) 76%) );--phb-orb-a-bg: color-mix(in srgb, var(--md-sys-color-surface-container-highest) 34%, transparent);--phb-orb-b-bg: color-mix(in srgb, var(--md-sys-color-primary) 26%, transparent);--phb-grid-line: color-mix(in srgb, var(--md-sys-color-on-surface) 10%, transparent)}.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:var(--phb-shell-bg);border:1px solid var(--phb-shell-border);box-shadow:var(--phb-shell-shadow)}.phb-event{background:var(--phb-event-bg)}.phb-institutional{background:var(--phb-institutional-bg)}.phb-copy{display:grid;gap:18px;min-width:0}.phb-brand{margin:0;color:var(--phb-brand-color);font-size:.88rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.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:var(--phb-badge-bg);color:var(--phb-badge-color);font-size:.76rem;font-weight:700;letter-spacing:.02em}.phb-badge-highlight{background:var(--phb-badge-highlight-bg);color:var(--phb-badge-highlight-color)}.phb-badge-muted{background:var(--phb-badge-muted-bg);color:var(--phb-badge-muted-color)}.phb-badge-warning{background:var(--phb-badge-warning-bg);color:var(--phb-badge-warning-color)}.phb-text{display:grid;gap:8px}.phb-subtitle{margin:0;color:var(--phb-subtitle-color);font-size:.9rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.phb-title{margin:0;color:var(--phb-title-color);font-size:clamp(1.6rem,2.2vw,2.5rem);line-height:1.08;letter-spacing:-.03em}.phb-title-accent{display:inline;margin-left:.18em;background:linear-gradient(90deg,#4285f4,#6ea8ff 28%,#a142f4 62%,#ea4335);-webkit-background-clip:text;background-clip:text;color:transparent}.phb-description{margin:0;max-width:56ch;color:var(--phb-description-color);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:var(--phb-meta-bg);border:1px solid var(--phb-meta-border);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.phb-meta-item dt{margin:0;color:var(--phb-meta-label-color);font-size:.73rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.phb-meta-item dd{margin:0;color:var(--phb-meta-value-color);font-size:.92rem;line-height:1.45}.phb-visual{position:relative;min-height:220px;border-radius:22px;overflow:hidden;background:var(--phb-visual-bg)}.phb-image{display:block;width:100%;height:100%;object-fit:cover}.phb-visual-fallback{background:var(--phb-visual-fallback)}.phb-flat{padding:0 0 18px;border:0;border-radius:0;box-shadow:none;background:transparent;grid-template-columns:minmax(0,1.15fr) minmax(220px,.85fr);gap:18px}.phb-flat .phb-brand{color:var(--md-sys-color-primary)}.phb-flat .phb-badges{order:3}.phb-flat .phb-meta{grid-template-columns:1fr;gap:6px}.phb-flat .phb-meta-item{padding:0;border:0;border-radius:0;background:transparent;-webkit-backdrop-filter:none;backdrop-filter:none}.phb-flat .phb-meta-item dt,.phb-flat .phb-meta-item dd{display:inline}.phb-flat .phb-meta-item dt{margin-right:6px}.phb-flat .phb-visual{min-height:190px;border-radius:26px}.phb-orb{position:absolute;border-radius:999px;filter:blur(2px)}.phb-orb-a{inset:24px auto auto 20px;width:86px;height:86px;background:var(--phb-orb-a-bg)}.phb-orb-b{inset:auto 16px 18px auto;width:132px;height:132px;background:var(--phb-orb-b-bg)}.phb-grid{position:absolute;inset:0;background-image:linear-gradient(var(--phb-grid-line) 1px,transparent 1px),linear-gradient(90deg,var(--phb-grid-line) 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
12919
  }], propDecorators: { instanceId: [{
11530
12920
  type: Input
11531
12921
  }], analyticsId: [{
@@ -11548,6 +12938,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
11548
12938
  type: Input
11549
12939
  }], variant: [{
11550
12940
  type: Input
12941
+ }], appearance: [{
12942
+ type: Input
12943
+ }], brandText: [{
12944
+ type: Input
12945
+ }], titleAccent: [{
12946
+ type: Input
11551
12947
  }] } });
11552
12948
 
11553
12949
  const PRAXIS_HERO_BANNER_METADATA = {
@@ -11561,7 +12957,9 @@ const PRAXIS_HERO_BANNER_METADATA = {
11561
12957
  { name: 'instanceId', type: 'string', label: 'Instance ID', description: 'Identificador estável da instância editorial.' },
11562
12958
  { name: 'analyticsId', type: 'string', label: 'Analytics ID', description: 'Identificador opcional de telemetria agregada.' },
11563
12959
  { name: 'ariaLabel', type: 'string', label: 'Aria Label', description: 'Rótulo acessível opcional do hero.' },
12960
+ { name: 'brandText', type: 'string', label: 'Brand', description: 'Marca ou rótulo institucional exibido antes do conteúdo principal.' },
11564
12961
  { name: 'title', type: 'string', label: 'Título', description: 'Título principal do hero.' },
12962
+ { name: 'titleAccent', type: 'string', label: 'Destaque do título', description: 'Trecho opcional do título com tratamento visual destacado.' },
11565
12963
  { name: 'subtitle', type: 'string', label: 'Subtítulo', description: 'Kicker ou subtítulo acima do título.' },
11566
12964
  { name: 'description', type: 'string', label: 'Descrição', description: 'Descrição principal do destaque.' },
11567
12965
  { name: 'imageUrl', type: 'string', label: 'Imagem', description: 'URL opcional da imagem de apoio.' },
@@ -11569,6 +12967,7 @@ const PRAXIS_HERO_BANNER_METADATA = {
11569
12967
  { name: 'badges', type: 'Array<{ label: string; tone?: "default" | "highlight" | "muted" | "warning" }>', label: 'Badges', description: 'Badges curatoriais no topo do hero.' },
11570
12968
  { name: 'metaItems', type: 'Array<{ label: string; value: string }>', label: 'Metadados', description: 'Metadados como data, local ou tenant.' },
11571
12969
  { name: 'variant', type: "'default' | 'event' | 'institutional'", label: 'Variante', description: 'Variante visual inicial do hero banner.', default: 'default' },
12970
+ { name: 'appearance', type: "'card' | 'flat'", label: 'Aparência', description: 'Controla se o hero usa cartão completo ou composição mais plana e leve.', default: 'card' },
11572
12971
  ],
11573
12972
  outputs: [],
11574
12973
  tags: ['widget', 'editorial', 'hero', 'banner', EDITORIAL_WIDGET_TAG],
@@ -11681,6 +13080,7 @@ class PraxisRichTextBlockComponent {
11681
13080
  subtitle;
11682
13081
  icon;
11683
13082
  variant = 'default';
13083
+ appearance = 'card';
11684
13084
  contentFormat = 'plain';
11685
13085
  content = '';
11686
13086
  get renderedContent() {
@@ -11691,8 +13091,13 @@ class PraxisRichTextBlockComponent {
11691
13091
  return this.sanitizer.sanitize(SecurityContext.HTML, html) ?? '';
11692
13092
  }
11693
13093
  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'">
13094
+ 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", appearance: "appearance", 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: `
13095
+ <section
13096
+ class="prt-block"
13097
+ [class.prt-block-emphasis]="variant === 'emphasis'"
13098
+ [class.prt-block-subtle]="variant === 'subtle'"
13099
+ [class.prt-block-plain]="appearance === 'plain'"
13100
+ >
11696
13101
  <header class="prt-head" *ngIf="icon || title || subtitle">
11697
13102
  <mat-icon class="prt-icon" *ngIf="icon" aria-hidden="true" [praxisIcon]="icon"></mat-icon>
11698
13103
  <div class="prt-title-wrap">
@@ -11703,7 +13108,7 @@ class PraxisRichTextBlockComponent {
11703
13108
 
11704
13109
  <div class="prt-content" [innerHTML]="renderedContent"></div>
11705
13110
  </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 });
13111
+ `, isInline: true, styles: [":host{display:block;--prt-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 72%, transparent);--prt-bg: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface) 96%, var(--md-sys-color-surface-container-lowest) 4%), color-mix(in srgb, var(--md-sys-color-surface-container-low) 92%, var(--md-sys-color-surface) 8%) );--prt-emphasis-border: color-mix(in srgb, var(--md-sys-color-primary) 32%, var(--md-sys-color-outline-variant));--prt-emphasis-bg: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-primary-container) 36%, var(--md-sys-color-surface) 64%), color-mix(in srgb, var(--md-sys-color-surface) 96%, var(--md-sys-color-primary-container) 4%) );--prt-subtle-bg: color-mix(in srgb, var(--md-sys-color-surface-container-low) 82%, transparent);--prt-icon-bg: color-mix(in srgb, var(--md-sys-color-primary-container) 64%, transparent);--prt-code-bg: color-mix(in srgb, var(--md-sys-color-surface-container-highest) 82%, transparent)}:host-context(.mdc-theme-dark),:host-context(.theme-dark){--prt-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 84%, transparent);--prt-bg: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface-container-low) 92%, var(--md-sys-color-surface) 8%), color-mix(in srgb, var(--md-sys-color-surface-container) 90%, var(--md-sys-color-surface-container-high) 10%) );--prt-emphasis-border: color-mix(in srgb, var(--md-sys-color-primary) 42%, var(--md-sys-color-outline-variant));--prt-emphasis-bg: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-primary-container) 28%, var(--md-sys-color-surface-container-low) 72%), color-mix(in srgb, var(--md-sys-color-surface-container) 92%, var(--md-sys-color-primary-container) 8%) );--prt-subtle-bg: color-mix(in srgb, var(--md-sys-color-surface-container-low) 88%, transparent);--prt-icon-bg: color-mix(in srgb, var(--md-sys-color-primary-container) 42%, transparent);--prt-code-bg: color-mix(in srgb, var(--md-sys-color-surface-container-high) 88%, transparent)}.prt-block{display:grid;gap:12px;padding:16px 18px;border-radius:16px;border:1px solid var(--prt-border);background:var(--prt-bg);color:var(--md-sys-color-on-surface)}.prt-block-emphasis{border-color:var(--prt-emphasis-border);background:var(--prt-emphasis-bg)}.prt-block-subtle{background:var(--prt-subtle-bg);border-style:dashed}.prt-block-plain{padding:0;border:0;border-radius:0;background:transparent}.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:var(--prt-icon-bg);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:var(--prt-code-bg)}.prt-block-plain .prt-icon{width:32px;height:32px;border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-high) 80%,transparent)}.prt-block-plain .prt-content{font-size:.92rem}\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
13112
  }
11708
13113
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisRichTextBlockComponent, decorators: [{
11709
13114
  type: Component,
@@ -11715,7 +13120,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
11715
13120
  '[attr.aria-label]': 'ariaLabel || null',
11716
13121
  '[attr.role]': 'ariaLabel ? "region" : null',
11717
13122
  }, template: `
11718
- <section class="prt-block" [class.prt-block-emphasis]="variant === 'emphasis'" [class.prt-block-subtle]="variant === 'subtle'">
13123
+ <section
13124
+ class="prt-block"
13125
+ [class.prt-block-emphasis]="variant === 'emphasis'"
13126
+ [class.prt-block-subtle]="variant === 'subtle'"
13127
+ [class.prt-block-plain]="appearance === 'plain'"
13128
+ >
11719
13129
  <header class="prt-head" *ngIf="icon || title || subtitle">
11720
13130
  <mat-icon class="prt-icon" *ngIf="icon" aria-hidden="true" [praxisIcon]="icon"></mat-icon>
11721
13131
  <div class="prt-title-wrap">
@@ -11726,7 +13136,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
11726
13136
 
11727
13137
  <div class="prt-content" [innerHTML]="renderedContent"></div>
11728
13138
  </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"] }]
13139
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;--prt-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 72%, transparent);--prt-bg: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface) 96%, var(--md-sys-color-surface-container-lowest) 4%), color-mix(in srgb, var(--md-sys-color-surface-container-low) 92%, var(--md-sys-color-surface) 8%) );--prt-emphasis-border: color-mix(in srgb, var(--md-sys-color-primary) 32%, var(--md-sys-color-outline-variant));--prt-emphasis-bg: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-primary-container) 36%, var(--md-sys-color-surface) 64%), color-mix(in srgb, var(--md-sys-color-surface) 96%, var(--md-sys-color-primary-container) 4%) );--prt-subtle-bg: color-mix(in srgb, var(--md-sys-color-surface-container-low) 82%, transparent);--prt-icon-bg: color-mix(in srgb, var(--md-sys-color-primary-container) 64%, transparent);--prt-code-bg: color-mix(in srgb, var(--md-sys-color-surface-container-highest) 82%, transparent)}:host-context(.mdc-theme-dark),:host-context(.theme-dark){--prt-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 84%, transparent);--prt-bg: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface-container-low) 92%, var(--md-sys-color-surface) 8%), color-mix(in srgb, var(--md-sys-color-surface-container) 90%, var(--md-sys-color-surface-container-high) 10%) );--prt-emphasis-border: color-mix(in srgb, var(--md-sys-color-primary) 42%, var(--md-sys-color-outline-variant));--prt-emphasis-bg: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-primary-container) 28%, var(--md-sys-color-surface-container-low) 72%), color-mix(in srgb, var(--md-sys-color-surface-container) 92%, var(--md-sys-color-primary-container) 8%) );--prt-subtle-bg: color-mix(in srgb, var(--md-sys-color-surface-container-low) 88%, transparent);--prt-icon-bg: color-mix(in srgb, var(--md-sys-color-primary-container) 42%, transparent);--prt-code-bg: color-mix(in srgb, var(--md-sys-color-surface-container-high) 88%, transparent)}.prt-block{display:grid;gap:12px;padding:16px 18px;border-radius:16px;border:1px solid var(--prt-border);background:var(--prt-bg);color:var(--md-sys-color-on-surface)}.prt-block-emphasis{border-color:var(--prt-emphasis-border);background:var(--prt-emphasis-bg)}.prt-block-subtle{background:var(--prt-subtle-bg);border-style:dashed}.prt-block-plain{padding:0;border:0;border-radius:0;background:transparent}.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:var(--prt-icon-bg);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:var(--prt-code-bg)}.prt-block-plain .prt-icon{width:32px;height:32px;border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-high) 80%,transparent)}.prt-block-plain .prt-content{font-size:.92rem}\n"] }]
11730
13140
  }], propDecorators: { instanceId: [{
11731
13141
  type: Input
11732
13142
  }], analyticsId: [{
@@ -11741,6 +13151,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
11741
13151
  type: Input
11742
13152
  }], variant: [{
11743
13153
  type: Input
13154
+ }], appearance: [{
13155
+ type: Input
11744
13156
  }], contentFormat: [{
11745
13157
  type: Input
11746
13158
  }], content: [{
@@ -11842,6 +13254,7 @@ class PraxisLegalNoticeComponent {
11842
13254
  contentFormat = 'plain';
11843
13255
  content = '';
11844
13256
  severity = 'info';
13257
+ appearance = 'card';
11845
13258
  links = [];
11846
13259
  get normalizedLinks() {
11847
13260
  return (this.links || [])
@@ -11869,8 +13282,13 @@ class PraxisLegalNoticeComponent {
11869
13282
  }
11870
13283
  }
11871
13284
  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'">
13285
+ 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", appearance: "appearance", 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: `
13286
+ <section
13287
+ class="pln-shell"
13288
+ [class.pln-warning]="severity === 'warning'"
13289
+ [class.pln-muted]="severity === 'muted'"
13290
+ [class.pln-plain]="appearance === 'plain'"
13291
+ >
11874
13292
  <praxis-rich-text-block
11875
13293
  [instanceId]="instanceId"
11876
13294
  [analyticsId]="analyticsId"
@@ -11879,6 +13297,7 @@ class PraxisLegalNoticeComponent {
11879
13297
  [subtitle]="subtitle"
11880
13298
  [icon]="resolvedIcon"
11881
13299
  [variant]="resolvedVariant"
13300
+ [appearance]="appearance === 'plain' ? 'plain' : 'card'"
11882
13301
  [contentFormat]="contentFormat"
11883
13302
  [content]="content"
11884
13303
  ></praxis-rich-text-block>
@@ -11895,7 +13314,7 @@ class PraxisLegalNoticeComponent {
11895
13314
  </a>
11896
13315
  </nav>
11897
13316
  </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 });
13317
+ `, 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{border-left-color:color-mix(in srgb,var(--md-sys-color-outline) 58%,transparent)}.pln-plain .praxis-rich-text-block .prt-block,.pln-plain .prt-block{border-left:0}.pln-links{display:flex;flex-wrap:wrap;gap:8px 12px;padding-left:18px}.pln-plain .pln-links{padding-left:0;padding-top:2px}.pln-link{color:var(--md-sys-color-primary);font-size:.84rem;line-height:1.4;text-decoration:underline;text-underline-offset:2px}:host-context(.mdc-theme-dark) .pln-link,:host-context(.theme-dark) .pln-link{color:color-mix(in srgb,var(--md-sys-color-primary) 86%,white)}\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", "appearance", "contentFormat", "content"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11899
13318
  }
11900
13319
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisLegalNoticeComponent, decorators: [{
11901
13320
  type: Component,
@@ -11906,7 +13325,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
11906
13325
  '[attr.aria-label]': 'ariaLabel || title || "Aviso legal"',
11907
13326
  'role': 'note',
11908
13327
  }, template: `
11909
- <section class="pln-shell" [class.pln-warning]="severity === 'warning'" [class.pln-muted]="severity === 'muted'">
13328
+ <section
13329
+ class="pln-shell"
13330
+ [class.pln-warning]="severity === 'warning'"
13331
+ [class.pln-muted]="severity === 'muted'"
13332
+ [class.pln-plain]="appearance === 'plain'"
13333
+ >
11910
13334
  <praxis-rich-text-block
11911
13335
  [instanceId]="instanceId"
11912
13336
  [analyticsId]="analyticsId"
@@ -11915,6 +13339,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
11915
13339
  [subtitle]="subtitle"
11916
13340
  [icon]="resolvedIcon"
11917
13341
  [variant]="resolvedVariant"
13342
+ [appearance]="appearance === 'plain' ? 'plain' : 'card'"
11918
13343
  [contentFormat]="contentFormat"
11919
13344
  [content]="content"
11920
13345
  ></praxis-rich-text-block>
@@ -11931,7 +13356,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
11931
13356
  </a>
11932
13357
  </nav>
11933
13358
  </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"] }]
13359
+ `, 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{border-left-color:color-mix(in srgb,var(--md-sys-color-outline) 58%,transparent)}.pln-plain .praxis-rich-text-block .prt-block,.pln-plain .prt-block{border-left:0}.pln-links{display:flex;flex-wrap:wrap;gap:8px 12px;padding-left:18px}.pln-plain .pln-links{padding-left:0;padding-top:2px}.pln-link{color:var(--md-sys-color-primary);font-size:.84rem;line-height:1.4;text-decoration:underline;text-underline-offset:2px}:host-context(.mdc-theme-dark) .pln-link,:host-context(.theme-dark) .pln-link{color:color-mix(in srgb,var(--md-sys-color-primary) 86%,white)}\n"] }]
11935
13360
  }], propDecorators: { instanceId: [{
11936
13361
  type: Input
11937
13362
  }], analyticsId: [{
@@ -11948,6 +13373,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
11948
13373
  type: Input
11949
13374
  }], severity: [{
11950
13375
  type: Input
13376
+ }], appearance: [{
13377
+ type: Input
11951
13378
  }], links: [{
11952
13379
  type: Input
11953
13380
  }] } });
@@ -11968,6 +13395,7 @@ const PRAXIS_LEGAL_NOTICE_METADATA = {
11968
13395
  { name: 'contentFormat', type: "'plain' | 'markdown'", label: 'Formato do conteúdo', description: 'Formato editorial permitido para o corpo do aviso.', default: 'plain' },
11969
13396
  { name: 'content', type: 'string', label: 'Conteúdo', description: 'Corpo principal do aviso legal.' },
11970
13397
  { name: 'severity', type: "'info' | 'warning' | 'muted'", label: 'Severidade', description: 'Tom visual/semântico do aviso legal.', default: 'info' },
13398
+ { name: 'appearance', type: "'card' | 'plain'", label: 'Aparência', description: 'Permite renderizar o aviso como card completo ou bloco embutido sem moldura.', default: 'card' },
11971
13399
  { name: 'links', type: 'EditorialLinkDefinition[]', label: 'Links', description: 'Links complementares do aviso, sempre normalizados pela policy editorial.' },
11972
13400
  ],
11973
13401
  outputs: [],
@@ -12000,6 +13428,7 @@ const PRAXIS_RICH_TEXT_BLOCK_METADATA = {
12000
13428
  { name: 'subtitle', type: 'string', label: 'Subtítulo', description: 'Texto curto complementar abaixo do título.' },
12001
13429
  { name: 'icon', type: 'string', label: 'Ícone', description: 'Ícone Material Symbols exibido no cabeçalho do bloco.' },
12002
13430
  { name: 'variant', type: "'default' | 'emphasis' | 'subtle'", label: 'Variante', description: 'Variante visual do bloco editorial.', default: 'default' },
13431
+ { name: 'appearance', type: "'card' | 'plain'", label: 'Aparência', description: 'Permite usar o bloco como cartão completo ou conteúdo embutido sem moldura.', default: 'card' },
12003
13432
  { name: 'contentFormat', type: "'plain' | 'markdown'", label: 'Formato do conteúdo', description: 'Formato editorial permitido para renderização do conteúdo.', default: 'plain' },
12004
13433
  { name: 'content', type: 'string', label: 'Conteúdo', description: 'Corpo principal do bloco em plain text ou markdown seguro.' },
12005
13434
  ],
@@ -12024,6 +13453,7 @@ class PraxisUserContextSummaryComponent {
12024
13453
  ariaLabel;
12025
13454
  title;
12026
13455
  subtitle;
13456
+ appearance = 'card';
12027
13457
  source = 'context';
12028
13458
  context = null;
12029
13459
  fields = [];
@@ -12052,8 +13482,8 @@ class PraxisUserContextSummaryComponent {
12052
13482
  return field.fallback || '-';
12053
13483
  }
12054
13484
  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">
13485
+ 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", appearance: "appearance", 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: `
13486
+ <section class="pux-card" [class.pux-plain]="appearance === 'plain'">
12057
13487
  <header class="pux-head" *ngIf="title || subtitle">
12058
13488
  <h3 class="pux-title" *ngIf="title">{{ title }}</h3>
12059
13489
  <p class="pux-subtitle" *ngIf="subtitle">{{ subtitle }}</p>
@@ -12074,7 +13504,7 @@ class PraxisUserContextSummaryComponent {
12074
13504
  <button type="button" class="pux-action" (click)="emitAction()">{{ actionLabel }}</button>
12075
13505
  </div>
12076
13506
  </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 });
13507
+ `, 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}.pux-plain{gap:10px;padding:8px 0 4px;border:0;border-radius:0;background:transparent}.pux-plain .pux-grid{grid-template-columns:1fr;gap:6px}.pux-plain .pux-item{padding:12px 14px;border-radius:14px;background:#ffffff8f;border:1px solid rgba(66,93,135,.08)}.pux-plain .pux-actions{margin-top: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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12078
13508
  }
12079
13509
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisUserContextSummaryComponent, decorators: [{
12080
13510
  type: Component,
@@ -12085,7 +13515,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
12085
13515
  '[attr.aria-label]': 'ariaLabel || null',
12086
13516
  '[attr.role]': 'ariaLabel ? "region" : null',
12087
13517
  }, template: `
12088
- <section class="pux-card">
13518
+ <section class="pux-card" [class.pux-plain]="appearance === 'plain'">
12089
13519
  <header class="pux-head" *ngIf="title || subtitle">
12090
13520
  <h3 class="pux-title" *ngIf="title">{{ title }}</h3>
12091
13521
  <p class="pux-subtitle" *ngIf="subtitle">{{ subtitle }}</p>
@@ -12106,7 +13536,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
12106
13536
  <button type="button" class="pux-action" (click)="emitAction()">{{ actionLabel }}</button>
12107
13537
  </div>
12108
13538
  </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"] }]
13539
+ `, 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}.pux-plain{gap:10px;padding:8px 0 4px;border:0;border-radius:0;background:transparent}.pux-plain .pux-grid{grid-template-columns:1fr;gap:6px}.pux-plain .pux-item{padding:12px 14px;border-radius:14px;background:#ffffff8f;border:1px solid rgba(66,93,135,.08)}.pux-plain .pux-actions{margin-top:2px}\n"] }]
12110
13540
  }], propDecorators: { instanceId: [{
12111
13541
  type: Input
12112
13542
  }], analyticsId: [{
@@ -12117,6 +13547,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
12117
13547
  type: Input
12118
13548
  }], subtitle: [{
12119
13549
  type: Input
13550
+ }], appearance: [{
13551
+ type: Input
12120
13552
  }], source: [{
12121
13553
  type: Input
12122
13554
  }], context: [{
@@ -12154,6 +13586,7 @@ const PRAXIS_USER_CONTEXT_SUMMARY_METADATA = {
12154
13586
  { name: 'ariaLabel', type: 'string', label: 'Aria Label', description: 'Rótulo acessível opcional do resumo contextual.' },
12155
13587
  { name: 'title', type: 'string', label: 'Título', description: 'Título principal do resumo.' },
12156
13588
  { name: 'subtitle', type: 'string', label: 'Subtítulo', description: 'Texto auxiliar explicando o contexto exibido.' },
13589
+ { name: 'appearance', type: "'card' | 'plain'", label: 'Aparência', description: 'Define se o resumo contextual renderiza como card completo ou bloco mais leve.', default: 'card' },
12157
13590
  { name: 'source', type: "'context' | 'static'", label: 'Fonte', description: 'Origem dos dados do resumo contextual.', default: 'context' },
12158
13591
  { name: 'context', type: 'Record<string, unknown> | null', label: 'Contexto', description: 'Objeto tipado usado para resolver valuePath dos campos.' },
12159
13592
  { 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.' },
@@ -15545,5 +16978,5 @@ function provideHookWhitelist(allowed) {
15545
16978
  * Generated bundle index. Do not edit.
15546
16979
  */
15547
16980
 
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 };
16981
+ 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_COMPLIANCE_PRESETS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_FORM_TEMPLATE_CATALOG, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_SOLUTION_CATALOG, EDITORIAL_SOLUTION_PRESETS, EDITORIAL_THEME_PRESETS, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE, EVENT_REGISTRATION_EDITORIAL_SOLUTION, EVENT_REGISTRATION_EDITORIAL_TEMPLATE, 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_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, 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, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisI18nService, 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, buildFormConfigFromEditorialTemplate, 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, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getGlobalActionCatalog, getGlobalActionUiSchema, getReferencedFieldMetadata, getTextTransformer, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isEditorialComponentMeta, isInlineFilterControlType, isRangeValidForFilter, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, 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, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, 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 };
15549
16982
  //# sourceMappingURL=praxisui-core.mjs.map