@praxisui/dialog 10.0.0-rc.40 → 10.0.0-rc.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-10-26T18:09:20.136Z",
3
+ "generatedAt": "2026-11-01T13:59:56.156Z",
4
4
  "packageName": "@praxisui/dialog",
5
- "packageVersion": "10.0.0-rc.40",
5
+ "packageVersion": "10.0.0-rc.42",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 1,
@@ -1579,6 +1579,7 @@ class PraxisQuickViewOverlayComponent {
1579
1579
  resolution = signal(null, ...(ngDevMode ? [{ debugName: "resolution" }] : /* istanbul ignore next */ []));
1580
1580
  bodyRenderer = signal(null, ...(ngDevMode ? [{ debugName: "bodyRenderer" }] : /* istanbul ignore next */ []));
1581
1581
  narrowModalMode = signal(false, ...(ngDevMode ? [{ debugName: "narrowModalMode" }] : /* istanbul ignore next */ []));
1582
+ failedAvatarUrl = signal(null, ...(ngDevMode ? [{ debugName: "failedAvatarUrl" }] : /* istanbul ignore next */ []));
1582
1583
  pointerEnter = new EventEmitter();
1583
1584
  pointerLeave = new EventEmitter();
1584
1585
  openDetail = new EventEmitter();
@@ -1593,7 +1594,7 @@ class PraxisQuickViewOverlayComponent {
1593
1594
  if (!identity) {
1594
1595
  return null;
1595
1596
  }
1596
- if (!this.shouldUseCustomBodyRenderer() && this.summaryItems().length > 0) {
1597
+ if (this.shouldUseCustomBodyRenderer() || this.summaryItems().length > 0) {
1597
1598
  return {
1598
1599
  ...identity,
1599
1600
  metadata: [],
@@ -1601,8 +1602,52 @@ class PraxisQuickViewOverlayComponent {
1601
1602
  }
1602
1603
  return identity;
1603
1604
  }, ...(ngDevMode ? [{ debugName: "headerIdentity" }] : /* istanbul ignore next */ []));
1605
+ contextLabel = computed(() => {
1606
+ const res = this.resolution();
1607
+ const surfaceTitle = String(res?.surface?.title ?? '').trim();
1608
+ if (!surfaceTitle) {
1609
+ return null;
1610
+ }
1611
+ const mainTitle = String(res?.title ?? '').trim();
1612
+ return surfaceTitle.toLowerCase() === mainTitle.toLowerCase()
1613
+ ? null
1614
+ : surfaceTitle;
1615
+ }, ...(ngDevMode ? [{ debugName: "contextLabel" }] : /* istanbul ignore next */ []));
1616
+ hasContextEyebrow = computed(() => {
1617
+ const res = this.resolution();
1618
+ return Boolean((res?.icon && res.icon.trim().length > 0) || this.contextLabel());
1619
+ }, ...(ngDevMode ? [{ debugName: "hasContextEyebrow" }] : /* istanbul ignore next */ []));
1620
+ safeAvatarUrl = computed(() => {
1621
+ const res = this.resolution();
1622
+ const rawCandidate = res?.avatarUrl ??
1623
+ (typeof res?.identity?.avatar?.value === 'string'
1624
+ ? res.identity.avatar.value
1625
+ : null);
1626
+ if (typeof rawCandidate !== 'string') {
1627
+ return null;
1628
+ }
1629
+ const candidate = rawCandidate.trim();
1630
+ if (!candidate || this.failedAvatarUrl() === candidate) {
1631
+ return null;
1632
+ }
1633
+ if (candidate.startsWith('https://') ||
1634
+ candidate.startsWith('http://') ||
1635
+ (candidate.startsWith('/') && !candidate.startsWith('//'))) {
1636
+ return candidate;
1637
+ }
1638
+ return null;
1639
+ }, ...(ngDevMode ? [{ debugName: "safeAvatarUrl" }] : /* istanbul ignore next */ []));
1640
+ onAvatarError(failedUrl) {
1641
+ this.failedAvatarUrl.set(failedUrl);
1642
+ }
1604
1643
  closeAriaLabel = computed(() => this.translate('quickView.closeAriaLabel', 'Fechar visualização rápida'), ...(ngDevMode ? [{ debugName: "closeAriaLabel" }] : /* istanbul ignore next */ []));
1605
1644
  copyButtonLabel = computed(() => this.translate('quickView.copyAction', 'Copiar'), ...(ngDevMode ? [{ debugName: "copyButtonLabel" }] : /* istanbul ignore next */ []));
1645
+ emptyStateLabel = computed(() => this.translate('quickView.emptyAttributes', 'Nenhum atributo resumido está disponível para este registro.'), ...(ngDevMode ? [{ debugName: "emptyStateLabel" }] : /* istanbul ignore next */ []));
1646
+ unavailableStateLabel = computed(() => this.translate('quickView.unavailableContext', 'Este resumo não está disponível para o seu contexto atual.'), ...(ngDevMode ? [{ debugName: "unavailableStateLabel" }] : /* istanbul ignore next */ []));
1647
+ errorStateLabel = computed(() => this.translate('quickView.loadError', 'Não foi possível carregar o resumo deste registro.'), ...(ngDevMode ? [{ debugName: "errorStateLabel" }] : /* istanbul ignore next */ []));
1648
+ defaultCtaLabel = computed(() => this.translate('quickView.openDetail', 'Abrir detalhe'), ...(ngDevMode ? [{ debugName: "defaultCtaLabel" }] : /* istanbul ignore next */ []));
1649
+ maskedBadgeLabel = computed(() => this.translate('quickView.maskedBadge', 'LGPD'), ...(ngDevMode ? [{ debugName: "maskedBadgeLabel" }] : /* istanbul ignore next */ []));
1650
+ maskedFieldReasonLabel = computed(() => this.translate('quickView.maskedFieldReason', 'Dado protegido por política de governança / LGPD'), ...(ngDevMode ? [{ debugName: "maskedFieldReasonLabel" }] : /* istanbul ignore next */ []));
1606
1651
  accessibleLabel = computed(() => {
1607
1652
  const res = this.resolution();
1608
1653
  const identityTitle = String(res?.identity?.title?.value ?? res?.identity?.displayLabel ?? '').trim();
@@ -1658,7 +1703,7 @@ class PraxisQuickViewOverlayComponent {
1658
1703
  return presenter === 'badge' || presenter === 'chip';
1659
1704
  }
1660
1705
  onCopyItem(item) {
1661
- if (!item.formattedValue) {
1706
+ if (!item.formattedValue || item.masked) {
1662
1707
  return;
1663
1708
  }
1664
1709
  this.copyValue.emit({
@@ -1682,7 +1727,33 @@ class PraxisQuickViewOverlayComponent {
1682
1727
  (mouseleave)="pointerLeave.emit()"
1683
1728
  >
1684
1729
  <header class="pdx-quick-view__header">
1730
+ @if (safeAvatarUrl(); as avatarSrc) {
1731
+ <div class="pdx-quick-view__avatar-wrap" data-testid="quick-view-avatar">
1732
+ <img
1733
+ class="pdx-quick-view__avatar-img"
1734
+ [src]="avatarSrc"
1735
+ alt=""
1736
+ loading="lazy"
1737
+ (error)="onAvatarError(avatarSrc)"
1738
+ />
1739
+ </div>
1740
+ }
1685
1741
  <div class="pdx-quick-view__heading">
1742
+ @if (hasContextEyebrow()) {
1743
+ <div class="pdx-quick-view__context" data-testid="quick-view-context">
1744
+ @if (resolution()?.icon; as iconName) {
1745
+ <span class="pdx-quick-view__context-icon-badge" aria-hidden="true">
1746
+ <mat-icon
1747
+ class="pdx-quick-view__context-icon"
1748
+ [praxisIcon]="iconName"
1749
+ ></mat-icon>
1750
+ </span>
1751
+ }
1752
+ @if (contextLabel(); as label) {
1753
+ <span class="pdx-quick-view__context-label">{{ label }}</span>
1754
+ }
1755
+ </div>
1756
+ }
1686
1757
  @if (headerIdentity(); as identity) {
1687
1758
  <praxis-resource-identity
1688
1759
  [identity]="identity"
@@ -1735,11 +1806,34 @@ class PraxisQuickViewOverlayComponent {
1735
1806
  <span
1736
1807
  class="pdx-quick-view__summary-value"
1737
1808
  [class.pdx-quick-view__summary-value--badge]="isBadgeOrChip(item)"
1738
- [attr.title]="item.formattedValue || null"
1809
+ [class.pdx-quick-view__summary-value--masked]="item.masked"
1810
+ [attr.title]="(item.masked ? (item.maskReason || maskedFieldReasonLabel()) : item.formattedValue) || null"
1739
1811
  >
1740
1812
  {{ item.formattedValue }}
1741
1813
  </span>
1742
- @if (item.copyable && item.formattedValue) {
1814
+ @if (item.masked) {
1815
+ <span
1816
+ class="pdx-quick-view__masked-badge"
1817
+ data-testid="quick-view-masked-indicator"
1818
+ role="note"
1819
+ [attr.title]="item.maskReason || maskedFieldReasonLabel()"
1820
+ [attr.aria-label]="item.maskReason || maskedFieldReasonLabel()"
1821
+ >
1822
+ <svg
1823
+ class="pdx-quick-view__masked-icon"
1824
+ viewBox="0 0 16 16"
1825
+ fill="none"
1826
+ stroke="currentColor"
1827
+ stroke-width="1.5"
1828
+ aria-hidden="true"
1829
+ >
1830
+ <rect x="3.5" y="7" width="9" height="6.5" rx="1.5" />
1831
+ <path d="M5.5 7V5a2.5 2.5 0 0 1 5 0v2" />
1832
+ </svg>
1833
+ <span>{{ maskedBadgeLabel() }}</span>
1834
+ </span>
1835
+ }
1836
+ @if (item.copyable && !item.masked && item.formattedValue) {
1743
1837
  <button
1744
1838
  type="button"
1745
1839
  class="pdx-quick-view__copy-btn"
@@ -1758,17 +1852,17 @@ class PraxisQuickViewOverlayComponent {
1758
1852
  }
1759
1853
  @case ('empty') {
1760
1854
  <p class="pdx-quick-view__feedback pdx-quick-view__feedback--empty" data-testid="quick-view-empty">
1761
- {{ resolution()?.failureReason || 'Nenhum atributo resumido está disponível para este registro.' }}
1855
+ {{ resolution()?.failureReason || emptyStateLabel() }}
1762
1856
  </p>
1763
1857
  }
1764
1858
  @case ('unavailable') {
1765
1859
  <p class="pdx-quick-view__feedback pdx-quick-view__feedback--unavailable" data-testid="quick-view-unavailable">
1766
- {{ resolution()?.failureReason || 'Este resumo não está disponível para o seu contexto atual.' }}
1860
+ {{ resolution()?.failureReason || unavailableStateLabel() }}
1767
1861
  </p>
1768
1862
  }
1769
1863
  @case ('error') {
1770
1864
  <p class="pdx-quick-view__feedback pdx-quick-view__feedback--error" data-testid="quick-view-error">
1771
- {{ resolution()?.failureReason || 'Não foi possível carregar o resumo deste registro.' }}
1865
+ {{ resolution()?.failureReason || errorStateLabel() }}
1772
1866
  </p>
1773
1867
  }
1774
1868
  }
@@ -1783,16 +1877,21 @@ class PraxisQuickViewOverlayComponent {
1783
1877
  data-testid="quick-view-open-detail"
1784
1878
  (click)="openDetail.emit()"
1785
1879
  >
1786
- {{ resolution()?.ctaLabel || 'Abrir detalhe' }}
1880
+ {{ resolution()?.ctaLabel || defaultCtaLabel() }}
1787
1881
  </button>
1788
1882
  </footer>
1789
1883
  }
1790
1884
  </section>
1791
- `, isInline: true, styles: [":host{display:block;max-width:min(25rem,calc(100vw - 1.5rem));min-width:min(19rem,calc(100vw - 1.5rem));box-sizing:border-box}.pdx-quick-view{box-sizing:border-box;display:grid;grid-template-columns:minmax(0,1fr);gap:.625rem;padding:.875rem 1rem;border-radius:var(--pdx-quick-view-radius, .75rem);background:var( --pdx-quick-view-bg, var(--md-sys-color-surface-container-high, var(--mat-sys-surface-container-high)) );color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface));border:1px solid color-mix(in srgb,var(--md-sys-color-outline, var(--mat-sys-outline)) 36%,var(--md-sys-color-outline-variant, var(--mat-sys-outline-variant)));box-shadow:var( --pdx-quick-view-shadow, 0 18px 38px -6px color-mix(in srgb, var(--md-sys-color-shadow, #000000) 32%, transparent), 0 6px 16px -4px color-mix(in srgb, var(--md-sys-color-shadow, #000000) 18%, transparent) );outline:none;overflow:hidden}.pdx-quick-view--narrow{width:calc(100vw - 1.5rem);max-width:28rem;border-radius:var(--pdx-quick-view-narrow-radius, 1rem);padding:.75rem 1rem 1rem}.pdx-quick-view--narrow:before{content:\"\";display:block;width:2.25rem;height:.25rem;margin:0 auto .25rem;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant)) 32%,transparent)}.pdx-quick-view__header{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem;min-width:0;padding-bottom:.5rem;border-bottom:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, var(--mat-sys-outline-variant)) 55%,transparent)}.pdx-quick-view__heading{min-width:0;flex:1 1 auto}.pdx-quick-view__title{margin:0;font-size:.9375rem;font-weight:600;line-height:1.35;color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface));overflow-wrap:anywhere}.pdx-quick-view__subtitle{margin:.25rem 0 0;font-size:.75rem;line-height:1.35;color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant))}.pdx-quick-view__close{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;border:none;border-radius:.375rem;background:transparent;color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant));font-size:1.125rem;line-height:1;cursor:pointer;transition:background-color .14s ease,color .14s ease}.pdx-quick-view__close:hover{background:color-mix(in srgb,var(--md-sys-color-on-surface, var(--mat-sys-on-surface)) 8%,transparent);color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface))}.pdx-quick-view__close:focus-visible{outline:2px solid var(--md-sys-color-primary, var(--mat-sys-primary));outline-offset:2px;background:color-mix(in srgb,var(--md-sys-color-on-surface, var(--mat-sys-on-surface)) 8%,transparent);color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface))}.pdx-quick-view__body{min-width:0}.pdx-quick-view__summary-list{margin:0;display:grid;grid-template-columns:minmax(0,1fr);gap:.4375rem;min-width:0}.pdx-quick-view__summary-item{display:flex;align-items:center;justify-content:space-between;gap:.625rem;min-width:0;font-size:.8125rem;line-height:1.35}.pdx-quick-view__summary-label{color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant));font-weight:500;flex:0 0 auto;max-width:42%;overflow-wrap:anywhere}.pdx-quick-view__summary-value-wrap{margin:0;flex:1 1 auto;display:inline-flex;align-items:center;justify-content:flex-end;gap:.375rem;min-width:0;text-align:right}.pdx-quick-view__summary-value{min-width:0;color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface));font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pdx-quick-view__summary-value--badge{padding:.125rem .5rem;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary, var(--mat-sys-primary)) 14%,transparent);color:var(--md-sys-color-primary, var(--mat-sys-primary));font-size:.75rem;font-weight:600}.pdx-quick-view__copy-btn{flex:0 0 auto;white-space:nowrap;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, var(--mat-sys-outline-variant)) 70%,transparent);background:color-mix(in srgb,var(--md-sys-color-surface-container, var(--mat-sys-surface-container)) 65%,transparent);color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant));border-radius:.25rem;padding:.0625rem .375rem;font-size:.6875rem;font-weight:500;opacity:.78;cursor:pointer;transition:opacity .14s ease,background-color .14s ease,color .14s ease,border-color .14s ease}.pdx-quick-view__summary-item:hover .pdx-quick-view__copy-btn,.pdx-quick-view__copy-btn:focus-visible{opacity:1}.pdx-quick-view__copy-btn:hover{background:color-mix(in srgb,var(--md-sys-color-primary, var(--mat-sys-primary)) 10%,transparent);color:var(--md-sys-color-primary, var(--mat-sys-primary));border-color:color-mix(in srgb,var(--md-sys-color-primary, var(--mat-sys-primary)) 40%,transparent)}.pdx-quick-view__copy-btn:focus-visible{outline:2px solid var(--md-sys-color-primary, var(--mat-sys-primary));outline-offset:2px}.pdx-quick-view__feedback{margin:0;font-size:.8125rem;line-height:1.4;color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant))}.pdx-quick-view__feedback--error{color:var(--md-sys-color-error, var(--mat-sys-error))}.pdx-quick-view__skeleton{display:grid;gap:.4375rem;padding:.125rem 0}.pdx-quick-view__skeleton-line{height:.75rem;border-radius:.25rem;background:color-mix(in srgb,var(--md-sys-color-on-surface, var(--mat-sys-on-surface)) 12%,transparent);width:75%}.pdx-quick-view__skeleton-line--wide{width:92%}.pdx-quick-view__skeleton-line--short{width:52%}.pdx-quick-view__footer{display:flex;justify-content:flex-end;padding-top:.5rem;border-top:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, var(--mat-sys-outline-variant)) 65%,transparent)}.pdx-quick-view__cta{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;padding:.375rem .8125rem;border-radius:.375rem;border:none;background:var(--md-sys-color-primary, var(--mat-sys-primary));color:var(--md-sys-color-on-primary, var(--mat-sys-on-primary));font-size:.8125rem;font-weight:600;cursor:pointer;transition:filter .14s ease,box-shadow .14s ease}.pdx-quick-view__cta:hover{filter:brightness(1.06)}.pdx-quick-view__cta:focus-visible{outline:2px solid var(--md-sys-color-primary, var(--mat-sys-primary));outline-offset:2px}.pdx-quick-view--narrow .pdx-quick-view__cta{width:100%;padding:.5rem .875rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: PraxisResourceIdentityComponent, selector: "praxis-resource-identity", inputs: ["identity", "emptyTitle", "density", "showMetadataLabels", "showKey", "showKeyLabel", "ariaLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1885
+ `, isInline: true, styles: [":host{display:block;max-width:min(26rem,calc(100vw - 1.5rem));min-width:min(20rem,calc(100vw - 1.5rem));box-sizing:border-box}.pdx-quick-view{box-sizing:border-box;display:grid;grid-template-columns:minmax(0,1fr);gap:.625rem;padding:.875rem 1rem;border-radius:var(--pdx-quick-view-radius, .75rem);background:var( --pdx-quick-view-bg, var(--md-sys-color-surface-container-high, var(--mat-sys-surface-container-high)) );color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface));border:1px solid color-mix(in srgb,var(--md-sys-color-outline, var(--mat-sys-outline)) 36%,var(--md-sys-color-outline-variant, var(--mat-sys-outline-variant)));box-shadow:var( --pdx-quick-view-shadow, 0 18px 38px -6px color-mix(in srgb, var(--md-sys-color-shadow, #000000) 32%, transparent), 0 6px 16px -4px color-mix(in srgb, var(--md-sys-color-shadow, #000000) 18%, transparent) );outline:none;overflow:hidden}.pdx-quick-view--narrow{width:calc(100vw - 1.5rem);max-width:28rem;border-radius:var(--pdx-quick-view-narrow-radius, 1rem);padding:.75rem 1rem 1rem}.pdx-quick-view--narrow:before{content:\"\";display:block;width:2.25rem;height:.25rem;margin:0 auto .25rem;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant)) 32%,transparent)}.pdx-quick-view__header{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem;min-width:0;padding-bottom:.5rem;border-bottom:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, var(--mat-sys-outline-variant)) 55%,transparent)}.pdx-quick-view__avatar-wrap{flex:0 0 auto;width:2.5rem;height:2.5rem;border-radius:999px;overflow:hidden;background:color-mix(in srgb,var(--md-sys-color-primary, var(--mat-sys-primary)) 12%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, var(--mat-sys-outline-variant)) 60%,transparent);display:inline-flex;align-items:center;justify-content:center}.pdx-quick-view__avatar-img{width:100%;height:100%;object-fit:cover;display:block}.pdx-quick-view__heading{min-width:0;flex:1 1 auto;display:grid;gap:.25rem}.pdx-quick-view__context{display:inline-flex;align-items:center;gap:.375rem;min-width:0;margin-bottom:.0625rem}.pdx-quick-view__context-icon-badge{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;border-radius:.3125rem;background:color-mix(in srgb,var(--md-sys-color-primary, var(--mat-sys-primary)) 14%,transparent);color:var(--md-sys-color-primary, var(--mat-sys-primary))}.pdx-quick-view__context-icon{width:.875rem;height:.875rem;font-size:.875rem;line-height:1}.pdx-quick-view__context-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.6875rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--md-sys-color-primary, var(--mat-sys-primary))}.pdx-quick-view__title{margin:0;font-size:.9375rem;font-weight:600;line-height:1.35;color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface));overflow-wrap:anywhere}.pdx-quick-view__subtitle{margin:.25rem 0 0;font-size:.75rem;line-height:1.35;color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant))}.pdx-quick-view__close{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;border:none;border-radius:.375rem;background:transparent;color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant));font-size:1.125rem;line-height:1;cursor:pointer;transition:background-color .14s ease,color .14s ease}.pdx-quick-view__close:hover{background:color-mix(in srgb,var(--md-sys-color-on-surface, var(--mat-sys-on-surface)) 8%,transparent);color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface))}.pdx-quick-view__close:focus-visible{outline:2px solid var(--md-sys-color-primary, var(--mat-sys-primary));outline-offset:2px;background:color-mix(in srgb,var(--md-sys-color-on-surface, var(--mat-sys-on-surface)) 8%,transparent);color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface))}.pdx-quick-view__body{min-width:0}.pdx-quick-view__summary-list{margin:0;display:grid;grid-template-columns:minmax(0,1fr);gap:.4375rem;min-width:0}.pdx-quick-view__summary-item{display:flex;align-items:center;justify-content:space-between;gap:.625rem;min-width:0;font-size:.8125rem;line-height:1.35}.pdx-quick-view__summary-label{color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant));font-weight:500;flex:0 0 auto;max-width:42%;overflow-wrap:anywhere}.pdx-quick-view__summary-value-wrap{margin:0;flex:1 1 auto;display:inline-flex;align-items:center;justify-content:flex-end;gap:.375rem;min-width:0;text-align:right}.pdx-quick-view__summary-value{min-width:0;color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface));font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pdx-quick-view__summary-value--badge{padding:.125rem .5rem;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary, var(--mat-sys-primary)) 14%,transparent);color:var(--md-sys-color-primary, var(--mat-sys-primary));font-size:.75rem;font-weight:600}.pdx-quick-view__summary-value--masked{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;letter-spacing:.04em;color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant))}.pdx-quick-view__masked-badge{display:inline-flex;align-items:center;gap:.25rem;flex:0 0 auto;padding:.0625rem .375rem;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-tertiary, var(--mat-sys-tertiary, #d97706)) 42%,transparent);background:color-mix(in srgb,var(--md-sys-color-tertiary, var(--mat-sys-tertiary, #d97706)) 12%,transparent);color:var(--md-sys-color-tertiary, var(--mat-sys-tertiary, #d97706));font-size:.6875rem;font-weight:600;line-height:1.2}.pdx-quick-view__masked-icon{width:.75rem;height:.75rem;flex:0 0 auto}.pdx-quick-view__copy-btn{flex:0 0 auto;white-space:nowrap;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, var(--mat-sys-outline-variant)) 70%,transparent);background:color-mix(in srgb,var(--md-sys-color-surface-container, var(--mat-sys-surface-container)) 65%,transparent);color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant));border-radius:.25rem;padding:.0625rem .375rem;font-size:.6875rem;font-weight:500;opacity:.78;cursor:pointer;transition:opacity .14s ease,background-color .14s ease,color .14s ease,border-color .14s ease}.pdx-quick-view__summary-item:hover .pdx-quick-view__copy-btn,.pdx-quick-view__copy-btn:focus-visible{opacity:1}.pdx-quick-view__copy-btn:hover{background:color-mix(in srgb,var(--md-sys-color-primary, var(--mat-sys-primary)) 10%,transparent);color:var(--md-sys-color-primary, var(--mat-sys-primary));border-color:color-mix(in srgb,var(--md-sys-color-primary, var(--mat-sys-primary)) 40%,transparent)}.pdx-quick-view__copy-btn:focus-visible{outline:2px solid var(--md-sys-color-primary, var(--mat-sys-primary));outline-offset:2px}.pdx-quick-view__feedback{margin:0;font-size:.8125rem;line-height:1.4;color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant))}.pdx-quick-view__feedback--error{color:var(--md-sys-color-error, var(--mat-sys-error))}.pdx-quick-view__skeleton{display:grid;gap:.4375rem;padding:.125rem 0}.pdx-quick-view__skeleton-line{height:.75rem;border-radius:.25rem;background:color-mix(in srgb,var(--md-sys-color-on-surface, var(--mat-sys-on-surface)) 12%,transparent);width:75%}.pdx-quick-view__skeleton-line--wide{width:92%}.pdx-quick-view__skeleton-line--short{width:52%}.pdx-quick-view__footer{display:flex;justify-content:flex-end;padding-top:.5rem;border-top:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, var(--mat-sys-outline-variant)) 65%,transparent)}.pdx-quick-view__cta{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;padding:.375rem .8125rem;border-radius:.375rem;border:none;background:var(--md-sys-color-primary, var(--mat-sys-primary));color:var(--md-sys-color-on-primary, var(--mat-sys-on-primary));font-size:.8125rem;font-weight:600;cursor:pointer;transition:filter .14s ease,box-shadow .14s ease}.pdx-quick-view__cta:hover{filter:brightness(1.06)}.pdx-quick-view__cta:focus-visible{outline:2px solid var(--md-sys-color-primary, var(--mat-sys-primary));outline-offset:2px}.pdx-quick-view--narrow .pdx-quick-view__cta{width:100%;padding:.5rem .875rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: PraxisResourceIdentityComponent, selector: "praxis-resource-identity", inputs: ["identity", "emptyTitle", "density", "showMetadataLabels", "showKey", "showKeyLabel", "ariaLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1792
1886
  }
1793
1887
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisQuickViewOverlayComponent, decorators: [{
1794
1888
  type: Component,
1795
- args: [{ selector: 'praxis-quick-view-overlay', standalone: true, imports: [CommonModule, PraxisResourceIdentityComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
1889
+ args: [{ selector: 'praxis-quick-view-overlay', standalone: true, imports: [
1890
+ CommonModule,
1891
+ MatIconModule,
1892
+ PraxisIconDirective,
1893
+ PraxisResourceIdentityComponent,
1894
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: `
1796
1895
  <section
1797
1896
  #dialogSurface
1798
1897
  class="pdx-quick-view"
@@ -1807,7 +1906,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1807
1906
  (mouseleave)="pointerLeave.emit()"
1808
1907
  >
1809
1908
  <header class="pdx-quick-view__header">
1909
+ @if (safeAvatarUrl(); as avatarSrc) {
1910
+ <div class="pdx-quick-view__avatar-wrap" data-testid="quick-view-avatar">
1911
+ <img
1912
+ class="pdx-quick-view__avatar-img"
1913
+ [src]="avatarSrc"
1914
+ alt=""
1915
+ loading="lazy"
1916
+ (error)="onAvatarError(avatarSrc)"
1917
+ />
1918
+ </div>
1919
+ }
1810
1920
  <div class="pdx-quick-view__heading">
1921
+ @if (hasContextEyebrow()) {
1922
+ <div class="pdx-quick-view__context" data-testid="quick-view-context">
1923
+ @if (resolution()?.icon; as iconName) {
1924
+ <span class="pdx-quick-view__context-icon-badge" aria-hidden="true">
1925
+ <mat-icon
1926
+ class="pdx-quick-view__context-icon"
1927
+ [praxisIcon]="iconName"
1928
+ ></mat-icon>
1929
+ </span>
1930
+ }
1931
+ @if (contextLabel(); as label) {
1932
+ <span class="pdx-quick-view__context-label">{{ label }}</span>
1933
+ }
1934
+ </div>
1935
+ }
1811
1936
  @if (headerIdentity(); as identity) {
1812
1937
  <praxis-resource-identity
1813
1938
  [identity]="identity"
@@ -1860,11 +1985,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1860
1985
  <span
1861
1986
  class="pdx-quick-view__summary-value"
1862
1987
  [class.pdx-quick-view__summary-value--badge]="isBadgeOrChip(item)"
1863
- [attr.title]="item.formattedValue || null"
1988
+ [class.pdx-quick-view__summary-value--masked]="item.masked"
1989
+ [attr.title]="(item.masked ? (item.maskReason || maskedFieldReasonLabel()) : item.formattedValue) || null"
1864
1990
  >
1865
1991
  {{ item.formattedValue }}
1866
1992
  </span>
1867
- @if (item.copyable && item.formattedValue) {
1993
+ @if (item.masked) {
1994
+ <span
1995
+ class="pdx-quick-view__masked-badge"
1996
+ data-testid="quick-view-masked-indicator"
1997
+ role="note"
1998
+ [attr.title]="item.maskReason || maskedFieldReasonLabel()"
1999
+ [attr.aria-label]="item.maskReason || maskedFieldReasonLabel()"
2000
+ >
2001
+ <svg
2002
+ class="pdx-quick-view__masked-icon"
2003
+ viewBox="0 0 16 16"
2004
+ fill="none"
2005
+ stroke="currentColor"
2006
+ stroke-width="1.5"
2007
+ aria-hidden="true"
2008
+ >
2009
+ <rect x="3.5" y="7" width="9" height="6.5" rx="1.5" />
2010
+ <path d="M5.5 7V5a2.5 2.5 0 0 1 5 0v2" />
2011
+ </svg>
2012
+ <span>{{ maskedBadgeLabel() }}</span>
2013
+ </span>
2014
+ }
2015
+ @if (item.copyable && !item.masked && item.formattedValue) {
1868
2016
  <button
1869
2017
  type="button"
1870
2018
  class="pdx-quick-view__copy-btn"
@@ -1883,17 +2031,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1883
2031
  }
1884
2032
  @case ('empty') {
1885
2033
  <p class="pdx-quick-view__feedback pdx-quick-view__feedback--empty" data-testid="quick-view-empty">
1886
- {{ resolution()?.failureReason || 'Nenhum atributo resumido está disponível para este registro.' }}
2034
+ {{ resolution()?.failureReason || emptyStateLabel() }}
1887
2035
  </p>
1888
2036
  }
1889
2037
  @case ('unavailable') {
1890
2038
  <p class="pdx-quick-view__feedback pdx-quick-view__feedback--unavailable" data-testid="quick-view-unavailable">
1891
- {{ resolution()?.failureReason || 'Este resumo não está disponível para o seu contexto atual.' }}
2039
+ {{ resolution()?.failureReason || unavailableStateLabel() }}
1892
2040
  </p>
1893
2041
  }
1894
2042
  @case ('error') {
1895
2043
  <p class="pdx-quick-view__feedback pdx-quick-view__feedback--error" data-testid="quick-view-error">
1896
- {{ resolution()?.failureReason || 'Não foi possível carregar o resumo deste registro.' }}
2044
+ {{ resolution()?.failureReason || errorStateLabel() }}
1897
2045
  </p>
1898
2046
  }
1899
2047
  }
@@ -1908,12 +2056,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1908
2056
  data-testid="quick-view-open-detail"
1909
2057
  (click)="openDetail.emit()"
1910
2058
  >
1911
- {{ resolution()?.ctaLabel || 'Abrir detalhe' }}
2059
+ {{ resolution()?.ctaLabel || defaultCtaLabel() }}
1912
2060
  </button>
1913
2061
  </footer>
1914
2062
  }
1915
2063
  </section>
1916
- `, styles: [":host{display:block;max-width:min(25rem,calc(100vw - 1.5rem));min-width:min(19rem,calc(100vw - 1.5rem));box-sizing:border-box}.pdx-quick-view{box-sizing:border-box;display:grid;grid-template-columns:minmax(0,1fr);gap:.625rem;padding:.875rem 1rem;border-radius:var(--pdx-quick-view-radius, .75rem);background:var( --pdx-quick-view-bg, var(--md-sys-color-surface-container-high, var(--mat-sys-surface-container-high)) );color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface));border:1px solid color-mix(in srgb,var(--md-sys-color-outline, var(--mat-sys-outline)) 36%,var(--md-sys-color-outline-variant, var(--mat-sys-outline-variant)));box-shadow:var( --pdx-quick-view-shadow, 0 18px 38px -6px color-mix(in srgb, var(--md-sys-color-shadow, #000000) 32%, transparent), 0 6px 16px -4px color-mix(in srgb, var(--md-sys-color-shadow, #000000) 18%, transparent) );outline:none;overflow:hidden}.pdx-quick-view--narrow{width:calc(100vw - 1.5rem);max-width:28rem;border-radius:var(--pdx-quick-view-narrow-radius, 1rem);padding:.75rem 1rem 1rem}.pdx-quick-view--narrow:before{content:\"\";display:block;width:2.25rem;height:.25rem;margin:0 auto .25rem;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant)) 32%,transparent)}.pdx-quick-view__header{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem;min-width:0;padding-bottom:.5rem;border-bottom:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, var(--mat-sys-outline-variant)) 55%,transparent)}.pdx-quick-view__heading{min-width:0;flex:1 1 auto}.pdx-quick-view__title{margin:0;font-size:.9375rem;font-weight:600;line-height:1.35;color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface));overflow-wrap:anywhere}.pdx-quick-view__subtitle{margin:.25rem 0 0;font-size:.75rem;line-height:1.35;color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant))}.pdx-quick-view__close{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;border:none;border-radius:.375rem;background:transparent;color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant));font-size:1.125rem;line-height:1;cursor:pointer;transition:background-color .14s ease,color .14s ease}.pdx-quick-view__close:hover{background:color-mix(in srgb,var(--md-sys-color-on-surface, var(--mat-sys-on-surface)) 8%,transparent);color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface))}.pdx-quick-view__close:focus-visible{outline:2px solid var(--md-sys-color-primary, var(--mat-sys-primary));outline-offset:2px;background:color-mix(in srgb,var(--md-sys-color-on-surface, var(--mat-sys-on-surface)) 8%,transparent);color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface))}.pdx-quick-view__body{min-width:0}.pdx-quick-view__summary-list{margin:0;display:grid;grid-template-columns:minmax(0,1fr);gap:.4375rem;min-width:0}.pdx-quick-view__summary-item{display:flex;align-items:center;justify-content:space-between;gap:.625rem;min-width:0;font-size:.8125rem;line-height:1.35}.pdx-quick-view__summary-label{color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant));font-weight:500;flex:0 0 auto;max-width:42%;overflow-wrap:anywhere}.pdx-quick-view__summary-value-wrap{margin:0;flex:1 1 auto;display:inline-flex;align-items:center;justify-content:flex-end;gap:.375rem;min-width:0;text-align:right}.pdx-quick-view__summary-value{min-width:0;color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface));font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pdx-quick-view__summary-value--badge{padding:.125rem .5rem;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary, var(--mat-sys-primary)) 14%,transparent);color:var(--md-sys-color-primary, var(--mat-sys-primary));font-size:.75rem;font-weight:600}.pdx-quick-view__copy-btn{flex:0 0 auto;white-space:nowrap;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, var(--mat-sys-outline-variant)) 70%,transparent);background:color-mix(in srgb,var(--md-sys-color-surface-container, var(--mat-sys-surface-container)) 65%,transparent);color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant));border-radius:.25rem;padding:.0625rem .375rem;font-size:.6875rem;font-weight:500;opacity:.78;cursor:pointer;transition:opacity .14s ease,background-color .14s ease,color .14s ease,border-color .14s ease}.pdx-quick-view__summary-item:hover .pdx-quick-view__copy-btn,.pdx-quick-view__copy-btn:focus-visible{opacity:1}.pdx-quick-view__copy-btn:hover{background:color-mix(in srgb,var(--md-sys-color-primary, var(--mat-sys-primary)) 10%,transparent);color:var(--md-sys-color-primary, var(--mat-sys-primary));border-color:color-mix(in srgb,var(--md-sys-color-primary, var(--mat-sys-primary)) 40%,transparent)}.pdx-quick-view__copy-btn:focus-visible{outline:2px solid var(--md-sys-color-primary, var(--mat-sys-primary));outline-offset:2px}.pdx-quick-view__feedback{margin:0;font-size:.8125rem;line-height:1.4;color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant))}.pdx-quick-view__feedback--error{color:var(--md-sys-color-error, var(--mat-sys-error))}.pdx-quick-view__skeleton{display:grid;gap:.4375rem;padding:.125rem 0}.pdx-quick-view__skeleton-line{height:.75rem;border-radius:.25rem;background:color-mix(in srgb,var(--md-sys-color-on-surface, var(--mat-sys-on-surface)) 12%,transparent);width:75%}.pdx-quick-view__skeleton-line--wide{width:92%}.pdx-quick-view__skeleton-line--short{width:52%}.pdx-quick-view__footer{display:flex;justify-content:flex-end;padding-top:.5rem;border-top:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, var(--mat-sys-outline-variant)) 65%,transparent)}.pdx-quick-view__cta{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;padding:.375rem .8125rem;border-radius:.375rem;border:none;background:var(--md-sys-color-primary, var(--mat-sys-primary));color:var(--md-sys-color-on-primary, var(--mat-sys-on-primary));font-size:.8125rem;font-weight:600;cursor:pointer;transition:filter .14s ease,box-shadow .14s ease}.pdx-quick-view__cta:hover{filter:brightness(1.06)}.pdx-quick-view__cta:focus-visible{outline:2px solid var(--md-sys-color-primary, var(--mat-sys-primary));outline-offset:2px}.pdx-quick-view--narrow .pdx-quick-view__cta{width:100%;padding:.5rem .875rem}\n"] }]
2064
+ `, styles: [":host{display:block;max-width:min(26rem,calc(100vw - 1.5rem));min-width:min(20rem,calc(100vw - 1.5rem));box-sizing:border-box}.pdx-quick-view{box-sizing:border-box;display:grid;grid-template-columns:minmax(0,1fr);gap:.625rem;padding:.875rem 1rem;border-radius:var(--pdx-quick-view-radius, .75rem);background:var( --pdx-quick-view-bg, var(--md-sys-color-surface-container-high, var(--mat-sys-surface-container-high)) );color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface));border:1px solid color-mix(in srgb,var(--md-sys-color-outline, var(--mat-sys-outline)) 36%,var(--md-sys-color-outline-variant, var(--mat-sys-outline-variant)));box-shadow:var( --pdx-quick-view-shadow, 0 18px 38px -6px color-mix(in srgb, var(--md-sys-color-shadow, #000000) 32%, transparent), 0 6px 16px -4px color-mix(in srgb, var(--md-sys-color-shadow, #000000) 18%, transparent) );outline:none;overflow:hidden}.pdx-quick-view--narrow{width:calc(100vw - 1.5rem);max-width:28rem;border-radius:var(--pdx-quick-view-narrow-radius, 1rem);padding:.75rem 1rem 1rem}.pdx-quick-view--narrow:before{content:\"\";display:block;width:2.25rem;height:.25rem;margin:0 auto .25rem;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant)) 32%,transparent)}.pdx-quick-view__header{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem;min-width:0;padding-bottom:.5rem;border-bottom:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, var(--mat-sys-outline-variant)) 55%,transparent)}.pdx-quick-view__avatar-wrap{flex:0 0 auto;width:2.5rem;height:2.5rem;border-radius:999px;overflow:hidden;background:color-mix(in srgb,var(--md-sys-color-primary, var(--mat-sys-primary)) 12%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, var(--mat-sys-outline-variant)) 60%,transparent);display:inline-flex;align-items:center;justify-content:center}.pdx-quick-view__avatar-img{width:100%;height:100%;object-fit:cover;display:block}.pdx-quick-view__heading{min-width:0;flex:1 1 auto;display:grid;gap:.25rem}.pdx-quick-view__context{display:inline-flex;align-items:center;gap:.375rem;min-width:0;margin-bottom:.0625rem}.pdx-quick-view__context-icon-badge{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;border-radius:.3125rem;background:color-mix(in srgb,var(--md-sys-color-primary, var(--mat-sys-primary)) 14%,transparent);color:var(--md-sys-color-primary, var(--mat-sys-primary))}.pdx-quick-view__context-icon{width:.875rem;height:.875rem;font-size:.875rem;line-height:1}.pdx-quick-view__context-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.6875rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--md-sys-color-primary, var(--mat-sys-primary))}.pdx-quick-view__title{margin:0;font-size:.9375rem;font-weight:600;line-height:1.35;color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface));overflow-wrap:anywhere}.pdx-quick-view__subtitle{margin:.25rem 0 0;font-size:.75rem;line-height:1.35;color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant))}.pdx-quick-view__close{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;border:none;border-radius:.375rem;background:transparent;color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant));font-size:1.125rem;line-height:1;cursor:pointer;transition:background-color .14s ease,color .14s ease}.pdx-quick-view__close:hover{background:color-mix(in srgb,var(--md-sys-color-on-surface, var(--mat-sys-on-surface)) 8%,transparent);color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface))}.pdx-quick-view__close:focus-visible{outline:2px solid var(--md-sys-color-primary, var(--mat-sys-primary));outline-offset:2px;background:color-mix(in srgb,var(--md-sys-color-on-surface, var(--mat-sys-on-surface)) 8%,transparent);color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface))}.pdx-quick-view__body{min-width:0}.pdx-quick-view__summary-list{margin:0;display:grid;grid-template-columns:minmax(0,1fr);gap:.4375rem;min-width:0}.pdx-quick-view__summary-item{display:flex;align-items:center;justify-content:space-between;gap:.625rem;min-width:0;font-size:.8125rem;line-height:1.35}.pdx-quick-view__summary-label{color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant));font-weight:500;flex:0 0 auto;max-width:42%;overflow-wrap:anywhere}.pdx-quick-view__summary-value-wrap{margin:0;flex:1 1 auto;display:inline-flex;align-items:center;justify-content:flex-end;gap:.375rem;min-width:0;text-align:right}.pdx-quick-view__summary-value{min-width:0;color:var(--md-sys-color-on-surface, var(--mat-sys-on-surface));font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pdx-quick-view__summary-value--badge{padding:.125rem .5rem;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary, var(--mat-sys-primary)) 14%,transparent);color:var(--md-sys-color-primary, var(--mat-sys-primary));font-size:.75rem;font-weight:600}.pdx-quick-view__summary-value--masked{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;letter-spacing:.04em;color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant))}.pdx-quick-view__masked-badge{display:inline-flex;align-items:center;gap:.25rem;flex:0 0 auto;padding:.0625rem .375rem;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-tertiary, var(--mat-sys-tertiary, #d97706)) 42%,transparent);background:color-mix(in srgb,var(--md-sys-color-tertiary, var(--mat-sys-tertiary, #d97706)) 12%,transparent);color:var(--md-sys-color-tertiary, var(--mat-sys-tertiary, #d97706));font-size:.6875rem;font-weight:600;line-height:1.2}.pdx-quick-view__masked-icon{width:.75rem;height:.75rem;flex:0 0 auto}.pdx-quick-view__copy-btn{flex:0 0 auto;white-space:nowrap;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, var(--mat-sys-outline-variant)) 70%,transparent);background:color-mix(in srgb,var(--md-sys-color-surface-container, var(--mat-sys-surface-container)) 65%,transparent);color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant));border-radius:.25rem;padding:.0625rem .375rem;font-size:.6875rem;font-weight:500;opacity:.78;cursor:pointer;transition:opacity .14s ease,background-color .14s ease,color .14s ease,border-color .14s ease}.pdx-quick-view__summary-item:hover .pdx-quick-view__copy-btn,.pdx-quick-view__copy-btn:focus-visible{opacity:1}.pdx-quick-view__copy-btn:hover{background:color-mix(in srgb,var(--md-sys-color-primary, var(--mat-sys-primary)) 10%,transparent);color:var(--md-sys-color-primary, var(--mat-sys-primary));border-color:color-mix(in srgb,var(--md-sys-color-primary, var(--mat-sys-primary)) 40%,transparent)}.pdx-quick-view__copy-btn:focus-visible{outline:2px solid var(--md-sys-color-primary, var(--mat-sys-primary));outline-offset:2px}.pdx-quick-view__feedback{margin:0;font-size:.8125rem;line-height:1.4;color:var(--md-sys-color-on-surface-variant, var(--mat-sys-on-surface-variant))}.pdx-quick-view__feedback--error{color:var(--md-sys-color-error, var(--mat-sys-error))}.pdx-quick-view__skeleton{display:grid;gap:.4375rem;padding:.125rem 0}.pdx-quick-view__skeleton-line{height:.75rem;border-radius:.25rem;background:color-mix(in srgb,var(--md-sys-color-on-surface, var(--mat-sys-on-surface)) 12%,transparent);width:75%}.pdx-quick-view__skeleton-line--wide{width:92%}.pdx-quick-view__skeleton-line--short{width:52%}.pdx-quick-view__footer{display:flex;justify-content:flex-end;padding-top:.5rem;border-top:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, var(--mat-sys-outline-variant)) 65%,transparent)}.pdx-quick-view__cta{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;padding:.375rem .8125rem;border-radius:.375rem;border:none;background:var(--md-sys-color-primary, var(--mat-sys-primary));color:var(--md-sys-color-on-primary, var(--mat-sys-on-primary));font-size:.8125rem;font-weight:600;cursor:pointer;transition:filter .14s ease,box-shadow .14s ease}.pdx-quick-view__cta:hover{filter:brightness(1.06)}.pdx-quick-view__cta:focus-visible{outline:2px solid var(--md-sys-color-primary, var(--mat-sys-primary));outline-offset:2px}.pdx-quick-view--narrow .pdx-quick-view__cta{width:100%;padding:.5rem .875rem}\n"] }]
1917
2065
  }], propDecorators: { pointerEnter: [{
1918
2066
  type: Output
1919
2067
  }], pointerLeave: [{
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@praxisui/dialog",
3
- "version": "10.0.0-rc.40",
3
+ "version": "10.0.0-rc.42",
4
4
  "description": "Dialog helpers and components for Praxis UI with Angular Material integration.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
7
7
  "@angular/core": "^21.0.0",
8
8
  "@angular/cdk": "^21.0.0",
9
9
  "@angular/forms": "^21.0.0",
10
- "@praxisui/core": "^10.0.0-rc.40",
10
+ "@praxisui/core": "^10.0.0-rc.42",
11
11
  "@angular/material": "^21.0.0",
12
12
  "@angular/platform-browser": "^21.0.0",
13
13
  "rxjs": "~7.8.0"
@@ -1,4 +1,4 @@
1
- import * as i0 from '@angular/core';
1
+ import * as _angular_core from '@angular/core';
2
2
  import { Injector, ViewContainerRef, InjectionToken, TemplateRef, ComponentRef, OnInit, AfterViewInit, OnChanges, OnDestroy, EventEmitter, ElementRef, SimpleChanges, Type, Provider } from '@angular/core';
3
3
  import { OverlayRef } from '@angular/cdk/overlay';
4
4
  import { Observable, Subject } from 'rxjs';
@@ -192,22 +192,22 @@ declare class PraxisDialogRef<T = any, R = any> {
192
192
  declare class PraxisDialogTitleDirective {
193
193
  templateRef: TemplateRef<any>;
194
194
  constructor(templateRef: TemplateRef<any>);
195
- static ɵfac: i0.ɵɵFactoryDeclaration<PraxisDialogTitleDirective, never>;
196
- static ɵdir: i0.ɵɵDirectiveDeclaration<PraxisDialogTitleDirective, "ng-template[praxisDialogTitle]", never, {}, {}, never, never, true, never>;
195
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PraxisDialogTitleDirective, never>;
196
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<PraxisDialogTitleDirective, "ng-template[praxisDialogTitle]", never, {}, {}, never, never, true, never>;
197
197
  }
198
198
 
199
199
  declare class PraxisDialogActionsDirective {
200
200
  templateRef: TemplateRef<any>;
201
201
  constructor(templateRef: TemplateRef<any>);
202
- static ɵfac: i0.ɵɵFactoryDeclaration<PraxisDialogActionsDirective, never>;
203
- static ɵdir: i0.ɵɵDirectiveDeclaration<PraxisDialogActionsDirective, "ng-template[praxisDialogActions]", never, {}, {}, never, never, true, never>;
202
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PraxisDialogActionsDirective, never>;
203
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<PraxisDialogActionsDirective, "ng-template[praxisDialogActions]", never, {}, {}, never, never, true, never>;
204
204
  }
205
205
 
206
206
  declare class PraxisDialogContentDirective {
207
207
  templateRef: TemplateRef<any>;
208
208
  constructor(templateRef: TemplateRef<any>);
209
- static ɵfac: i0.ɵɵFactoryDeclaration<PraxisDialogContentDirective, never>;
210
- static ɵdir: i0.ɵɵDirectiveDeclaration<PraxisDialogContentDirective, "ng-template[praxisDialogContent]", never, {}, {}, never, never, true, never>;
209
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PraxisDialogContentDirective, never>;
210
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<PraxisDialogContentDirective, "ng-template[praxisDialogContent]", never, {}, {}, never, never, true, never>;
211
211
  }
212
212
 
213
213
  declare class PraxisDialogComponent implements OnInit, AfterViewInit, OnChanges, OnDestroy {
@@ -288,8 +288,8 @@ declare class PraxisDialogComponent implements OnInit, AfterViewInit, OnChanges,
288
288
  beginOpenAnimation(): Promise<void>;
289
289
  beginCloseAnimation(): Promise<void>;
290
290
  private focusPrimaryAction;
291
- static ɵfac: i0.ɵɵFactoryDeclaration<PraxisDialogComponent, never>;
292
- static ɵcmp: i0.ɵɵComponentDeclaration<PraxisDialogComponent, "praxis-dialog", never, { "title": { "alias": "title"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; "actionsLayout": { "alias": "actionsLayout"; "required": false; }; "animation": { "alias": "animation"; "required": false; }; "open": { "alias": "open"; "required": false; }; "width": { "alias": "width"; "required": false; }; "height": { "alias": "height"; "required": false; }; "minWidth": { "alias": "minWidth"; "required": false; }; "maxWidth": { "alias": "maxWidth"; "required": false; }; "minHeight": { "alias": "minHeight"; "required": false; }; "maxHeight": { "alias": "maxHeight"; "required": false; }; "themeColor": { "alias": "themeColor"; "required": false; }; "disableClose": { "alias": "disableClose"; "required": false; }; "hasBackdrop": { "alias": "hasBackdrop"; "required": false; }; "closeOnBackdropClick": { "alias": "closeOnBackdropClick"; "required": false; }; "overlayMode": { "alias": "overlayMode"; "required": false; }; "zIndex": { "alias": "zIndex"; "required": false; }; "panelClass": { "alias": "panelClass"; "required": false; }; "backdropClass": { "alias": "backdropClass"; "required": false; }; "position": { "alias": "position"; "required": false; }; "autoFocusedElement": { "alias": "autoFocusedElement"; "required": false; }; "autoFocus": { "alias": "autoFocus"; "required": false; }; "restoreFocus": { "alias": "restoreFocus"; "required": false; }; "id": { "alias": "id"; "required": false; }; "ariaRole": { "alias": "ariaRole"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; }; "styles": { "alias": "styles"; "required": false; }; "titleIcon": { "alias": "titleIcon"; "required": false; }; }, { "action": "action"; "close": "close"; "opened": "opened"; "afterClosed": "afterClosed"; }, ["titleTpl", "actionsTpl", "contentTpl"], never, true, never>;
291
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PraxisDialogComponent, never>;
292
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PraxisDialogComponent, "praxis-dialog", never, { "title": { "alias": "title"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; "actionsLayout": { "alias": "actionsLayout"; "required": false; }; "animation": { "alias": "animation"; "required": false; }; "open": { "alias": "open"; "required": false; }; "width": { "alias": "width"; "required": false; }; "height": { "alias": "height"; "required": false; }; "minWidth": { "alias": "minWidth"; "required": false; }; "maxWidth": { "alias": "maxWidth"; "required": false; }; "minHeight": { "alias": "minHeight"; "required": false; }; "maxHeight": { "alias": "maxHeight"; "required": false; }; "themeColor": { "alias": "themeColor"; "required": false; }; "disableClose": { "alias": "disableClose"; "required": false; }; "hasBackdrop": { "alias": "hasBackdrop"; "required": false; }; "closeOnBackdropClick": { "alias": "closeOnBackdropClick"; "required": false; }; "overlayMode": { "alias": "overlayMode"; "required": false; }; "zIndex": { "alias": "zIndex"; "required": false; }; "panelClass": { "alias": "panelClass"; "required": false; }; "backdropClass": { "alias": "backdropClass"; "required": false; }; "position": { "alias": "position"; "required": false; }; "autoFocusedElement": { "alias": "autoFocusedElement"; "required": false; }; "autoFocus": { "alias": "autoFocus"; "required": false; }; "restoreFocus": { "alias": "restoreFocus"; "required": false; }; "id": { "alias": "id"; "required": false; }; "ariaRole": { "alias": "ariaRole"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; }; "styles": { "alias": "styles"; "required": false; }; "titleIcon": { "alias": "titleIcon"; "required": false; }; }, { "action": "action"; "close": "close"; "opened": "opened"; "afterClosed": "afterClosed"; }, ["titleTpl", "actionsTpl", "contentTpl"], never, true, never>;
293
293
  }
294
294
  declare const PraxisDialogDirectives: readonly [];
295
295
 
@@ -319,8 +319,8 @@ declare class PraxisDialog {
319
319
  private mergePresets;
320
320
  closeAll(): void;
321
321
  getDialogById(id: string): PraxisDialogRef<any> | undefined;
322
- static ɵfac: i0.ɵɵFactoryDeclaration<PraxisDialog, never>;
323
- static ɵprov: i0.ɵɵInjectableDeclaration<PraxisDialog>;
322
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PraxisDialog, never>;
323
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<PraxisDialog>;
324
324
  }
325
325
  declare class SimpleDialogContentComponent {
326
326
  message?: string;
@@ -330,8 +330,8 @@ declare class SimpleDialogContentComponent {
330
330
  submit?: () => void;
331
331
  private readonly dialogData;
332
332
  constructor();
333
- static ɵfac: i0.ɵɵFactoryDeclaration<SimpleDialogContentComponent, never>;
334
- static ɵcmp: i0.ɵɵComponentDeclaration<SimpleDialogContentComponent, "praxis-simple-dialog-content", never, {}, {}, never, never, true, never>;
333
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SimpleDialogContentComponent, never>;
334
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SimpleDialogContentComponent, "praxis-simple-dialog-content", never, {}, {}, never, never, true, never>;
335
335
  }
336
336
 
337
337
  /**
@@ -346,9 +346,10 @@ declare function providePraxisSurfaceGlobalActions(): Provider;
346
346
 
347
347
  declare class PraxisQuickViewOverlayComponent {
348
348
  private readonly i18n;
349
- readonly resolution: i0.WritableSignal<ResourceQuickViewResolution | null>;
350
- readonly bodyRenderer: i0.WritableSignal<PraxisQuickViewBodyRenderer | null>;
351
- readonly narrowModalMode: i0.WritableSignal<boolean>;
349
+ readonly resolution: _angular_core.WritableSignal<ResourceQuickViewResolution | null>;
350
+ readonly bodyRenderer: _angular_core.WritableSignal<PraxisQuickViewBodyRenderer | null>;
351
+ readonly narrowModalMode: _angular_core.WritableSignal<boolean>;
352
+ private readonly failedAvatarUrl;
352
353
  readonly pointerEnter: EventEmitter<void>;
353
354
  readonly pointerLeave: EventEmitter<void>;
354
355
  readonly openDetail: EventEmitter<void>;
@@ -360,19 +361,29 @@ declare class PraxisQuickViewOverlayComponent {
360
361
  private readonly dialogSurface?;
361
362
  private readonly ctaButton?;
362
363
  private readonly closeButton?;
363
- protected readonly summaryItems: i0.Signal<readonly ResourceQuickViewSummaryItem[]>;
364
- protected readonly headerIdentity: i0.Signal<_praxisui_core.MaterializedResourceIdentity | null>;
365
- protected readonly closeAriaLabel: i0.Signal<string>;
366
- protected readonly copyButtonLabel: i0.Signal<string>;
367
- protected readonly accessibleLabel: i0.Signal<string>;
364
+ protected readonly summaryItems: _angular_core.Signal<readonly ResourceQuickViewSummaryItem[]>;
365
+ protected readonly headerIdentity: _angular_core.Signal<_praxisui_core.MaterializedResourceIdentity | null>;
366
+ protected readonly contextLabel: _angular_core.Signal<string | null>;
367
+ protected readonly hasContextEyebrow: _angular_core.Signal<boolean>;
368
+ protected readonly safeAvatarUrl: _angular_core.Signal<string | null>;
369
+ protected onAvatarError(failedUrl: string): void;
370
+ protected readonly closeAriaLabel: _angular_core.Signal<string>;
371
+ protected readonly copyButtonLabel: _angular_core.Signal<string>;
372
+ protected readonly emptyStateLabel: _angular_core.Signal<string>;
373
+ protected readonly unavailableStateLabel: _angular_core.Signal<string>;
374
+ protected readonly errorStateLabel: _angular_core.Signal<string>;
375
+ protected readonly defaultCtaLabel: _angular_core.Signal<string>;
376
+ protected readonly maskedBadgeLabel: _angular_core.Signal<string>;
377
+ protected readonly maskedFieldReasonLabel: _angular_core.Signal<string>;
378
+ protected readonly accessibleLabel: _angular_core.Signal<string>;
368
379
  private translate;
369
- protected readonly shouldUseCustomBodyRenderer: i0.Signal<boolean>;
370
- protected readonly customBodyInputs: i0.Signal<Record<string, unknown>>;
380
+ protected readonly shouldUseCustomBodyRenderer: _angular_core.Signal<boolean>;
381
+ protected readonly customBodyInputs: _angular_core.Signal<Record<string, unknown>>;
371
382
  focusInteractiveEntry(): void;
372
383
  protected isBadgeOrChip(item: ResourceQuickViewSummaryItem): boolean;
373
384
  protected onCopyItem(item: ResourceQuickViewSummaryItem): void;
374
- static ɵfac: i0.ɵɵFactoryDeclaration<PraxisQuickViewOverlayComponent, never>;
375
- static ɵcmp: i0.ɵɵComponentDeclaration<PraxisQuickViewOverlayComponent, "praxis-quick-view-overlay", never, {}, { "pointerEnter": "pointerEnter"; "pointerLeave": "pointerLeave"; "openDetail": "openDetail"; "copyValue": "copyValue"; "dismiss": "dismiss"; }, never, never, true, never>;
385
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PraxisQuickViewOverlayComponent, never>;
386
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PraxisQuickViewOverlayComponent, "praxis-quick-view-overlay", never, {}, { "pointerEnter": "pointerEnter"; "pointerLeave": "pointerLeave"; "openDetail": "openDetail"; "copyValue": "copyValue"; "dismiss": "dismiss"; }, never, never, true, never>;
376
387
  }
377
388
 
378
389
  /**
@@ -398,23 +409,23 @@ declare class QuickViewDialogPresenterService implements PraxisQuickViewPresente
398
409
  private shouldUseNarrowModalFallback;
399
410
  private buildOverlayConfig;
400
411
  private resolveConnectedOrigin;
401
- static ɵfac: i0.ɵɵFactoryDeclaration<QuickViewDialogPresenterService, never>;
402
- static ɵprov: i0.ɵɵInjectableDeclaration<QuickViewDialogPresenterService>;
412
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<QuickViewDialogPresenterService, never>;
413
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<QuickViewDialogPresenterService>;
403
414
  }
404
415
  declare function providePraxisQuickViewDialogPresenter(): Provider;
405
416
 
406
417
  declare class LongContentDialogExampleComponent {
407
418
  readonly items: string[];
408
- static ɵfac: i0.ɵɵFactoryDeclaration<LongContentDialogExampleComponent, never>;
409
- static ɵcmp: i0.ɵɵComponentDeclaration<LongContentDialogExampleComponent, "praxis-long-content-dialog-example", never, {}, {}, never, never, true, never>;
419
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LongContentDialogExampleComponent, never>;
420
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LongContentDialogExampleComponent, "praxis-long-content-dialog-example", never, {}, {}, never, never, true, never>;
410
421
  }
411
422
 
412
423
  declare const PRAXIS_DIALOG_EXAMPLE_LONG_CONTENT = "praxis.long-content-example";
413
424
  declare function providePraxisDialogExamples(): {
414
- provide: i0.InjectionToken<readonly (() => void)[]>;
425
+ provide: _angular_core.InjectionToken<readonly (() => void)[]>;
415
426
  multi: boolean;
416
427
  useFactory: (registry: Record<string, any>) => () => void;
417
- deps: i0.InjectionToken<Record<string, _praxisui_dialog.ComponentType<any>>>[];
428
+ deps: _angular_core.InjectionToken<Record<string, _praxisui_dialog.ComponentType<any>>>[];
418
429
  };
419
430
 
420
431
  declare const PRAXIS_DIALOG_COMPONENT_METADATA: ComponentDocMeta;