ng-prime-tools 1.1.22 → 1.1.23

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.
@@ -12582,13 +12582,17 @@ class PTReleaseNotesPageComponent {
12582
12582
  */
12583
12583
  this.totalAllRecords = 0;
12584
12584
  /**
12585
- * Current zero-based page.
12585
+ * Current zero-based server page.
12586
12586
  */
12587
12587
  this.page = 0;
12588
12588
  /**
12589
12589
  * Current server page size.
12590
12590
  */
12591
12591
  this.rows = 10;
12592
+ /**
12593
+ * Available server page sizes.
12594
+ */
12595
+ this.rowsPerPageOptions = [5, 10, 20, 50];
12592
12596
  this.config = {};
12593
12597
  this.queryChange = new EventEmitter();
12594
12598
  this.searchText = '';
@@ -12600,6 +12604,7 @@ class PTReleaseNotesPageComponent {
12600
12604
  .pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$))
12601
12605
  .subscribe(() => {
12602
12606
  this.page = 0;
12607
+ this.collapseAllDetails();
12603
12608
  this.emitQueryChange();
12604
12609
  });
12605
12610
  }
@@ -12711,7 +12716,14 @@ class PTReleaseNotesPageComponent {
12711
12716
  return 'pi pi-sparkles';
12712
12717
  }
12713
12718
  getRowsPerPageOptions() {
12714
- return [5, 10, 20, 50];
12719
+ const values = (this.rowsPerPageOptions ?? [])
12720
+ .filter((value) => Number.isFinite(value) && value > 0)
12721
+ .map((value) => Math.floor(value));
12722
+ const uniqueValues = Array.from(new Set(values));
12723
+ if (this.rows > 0 && !uniqueValues.includes(this.rows)) {
12724
+ uniqueValues.push(this.rows);
12725
+ }
12726
+ return uniqueValues.sort((a, b) => a - b);
12715
12727
  }
12716
12728
  showCurrentPageReport() {
12717
12729
  return true;
@@ -12733,6 +12745,7 @@ class PTReleaseNotesPageComponent {
12733
12745
  }
12734
12746
  this.selectedFilter = filter;
12735
12747
  this.page = 0;
12748
+ this.collapseAllDetails();
12736
12749
  this.emitQueryChange();
12737
12750
  }
12738
12751
  isFilterSelected(filter) {
@@ -12748,13 +12761,37 @@ class PTReleaseNotesPageComponent {
12748
12761
  }
12749
12762
  this.searchText = '';
12750
12763
  this.page = 0;
12764
+ this.collapseAllDetails();
12751
12765
  this.emitQueryChange();
12752
12766
  }
12767
+ /**
12768
+ * PrimeNG server-side pagination.
12769
+ *
12770
+ * Important:
12771
+ * - changing only the page -> use event.page
12772
+ * - changing rows per page -> reset to page 0
12773
+ *
12774
+ * Resetting on size change avoids keeping an offset
12775
+ * calculated from the previous page size.
12776
+ */
12753
12777
  onPageChange(event) {
12754
- const nextRows = event.rows ?? this.rows;
12755
- const nextFirst = event.first ?? 0;
12756
- this.rows = nextRows > 0 ? nextRows : this.rows;
12757
- this.page = this.rows > 0 ? Math.floor(nextFirst / this.rows) : 0;
12778
+ const previousRows = Math.max(1, this.rows);
12779
+ const nextRows = event.rows !== undefined && event.rows !== null && event.rows > 0
12780
+ ? event.rows
12781
+ : previousRows;
12782
+ const rowsChanged = nextRows !== previousRows;
12783
+ this.rows = nextRows;
12784
+ if (rowsChanged) {
12785
+ this.page = 0;
12786
+ }
12787
+ else if (event.page !== undefined && event.page !== null) {
12788
+ this.page = Math.max(0, event.page);
12789
+ }
12790
+ else {
12791
+ const nextFirst = event.first ?? 0;
12792
+ this.page = Math.max(0, Math.floor(nextFirst / this.rows));
12793
+ }
12794
+ this.collapseAllDetails();
12758
12795
  this.emitQueryChange();
12759
12796
  }
12760
12797
  getReleaseClasses(release) {
@@ -12771,13 +12808,14 @@ class PTReleaseNotesPageComponent {
12771
12808
  return classes.join(' ');
12772
12809
  }
12773
12810
  getNewCount(release) {
12774
- return release.newCount ?? 0;
12811
+ return release.newCount ?? this.getDetailsByType(release, 'NEW').length;
12775
12812
  }
12776
12813
  getImprovementCount(release) {
12777
- return release.improvementCount ?? 0;
12814
+ return (release.improvementCount ??
12815
+ this.getDetailsByType(release, 'IMPROVEMENT').length);
12778
12816
  }
12779
12817
  getBugFixCount(release) {
12780
- return release.bugFixCount ?? 0;
12818
+ return (release.bugFixCount ?? this.getDetailsByType(release, 'BUG_FIX').length);
12781
12819
  }
12782
12820
  getTotalChangesCount(release) {
12783
12821
  return (this.getNewCount(release) +
@@ -12797,11 +12835,17 @@ class PTReleaseNotesPageComponent {
12797
12835
  return this.getBugFixCount(release) > 0;
12798
12836
  }
12799
12837
  hasDetails(release) {
12800
- return (release.details ?? []).length > 0;
12838
+ return this.getDetails(release).length > 0;
12801
12839
  }
12802
12840
  getDetails(release) {
12803
12841
  return release.details ?? [];
12804
12842
  }
12843
+ getDetailsByType(release, type) {
12844
+ return this.getDetails(release).filter((detail) => detail.type === type);
12845
+ }
12846
+ hasDetailsByType(release, type) {
12847
+ return this.getDetailsByType(release, type).length > 0;
12848
+ }
12805
12849
  isDetailsExpanded(release) {
12806
12850
  return this.expandedReleaseIds.has(String(release.id));
12807
12851
  }
@@ -12816,6 +12860,43 @@ class PTReleaseNotesPageComponent {
12816
12860
  }
12817
12861
  this.expandedReleaseIds.add(releaseId);
12818
12862
  }
12863
+ hasExpandableReleases() {
12864
+ return this.getDisplayedReleases().some((release) => !release.disabled && this.hasDetails(release));
12865
+ }
12866
+ areAllDetailsExpanded() {
12867
+ const expandableReleases = this.getDisplayedReleases().filter((release) => !release.disabled && this.hasDetails(release));
12868
+ if (expandableReleases.length === 0) {
12869
+ return false;
12870
+ }
12871
+ return expandableReleases.every((release) => this.expandedReleaseIds.has(String(release.id)));
12872
+ }
12873
+ toggleAllDetails() {
12874
+ if (!this.hasExpandableReleases()) {
12875
+ return;
12876
+ }
12877
+ if (this.areAllDetailsExpanded()) {
12878
+ this.collapseAllDetails();
12879
+ return;
12880
+ }
12881
+ this.expandAllDetails();
12882
+ }
12883
+ expandAllDetails() {
12884
+ this.getDisplayedReleases().forEach((release) => {
12885
+ if (release.disabled || !this.hasDetails(release)) {
12886
+ return;
12887
+ }
12888
+ this.expandedReleaseIds.add(String(release.id));
12889
+ });
12890
+ }
12891
+ collapseAllDetails() {
12892
+ this.expandedReleaseIds.clear();
12893
+ }
12894
+ getToggleAllDetailsText() {
12895
+ if (this.areAllDetailsExpanded()) {
12896
+ return this.language === 'FR' ? 'Tout réduire' : 'Collapse all';
12897
+ }
12898
+ return this.language === 'FR' ? 'Tout développer' : 'Expand all';
12899
+ }
12819
12900
  getDetailsButtonText(release) {
12820
12901
  return this.isDetailsExpanded(release)
12821
12902
  ? this.resolvedConfig.hideDetailsText
@@ -12837,29 +12918,41 @@ class PTReleaseNotesPageComponent {
12837
12918
  }
12838
12919
  }
12839
12920
  getDetailTypeLabel(detail) {
12840
- switch (detail.type) {
12921
+ return this.getDetailTypeSectionLabel(detail.type);
12922
+ }
12923
+ getDetailTypeSectionLabel(type) {
12924
+ switch (type) {
12841
12925
  case 'NEW':
12842
12926
  return this.resolvedConfig.newLabel;
12843
12927
  case 'IMPROVEMENT':
12844
12928
  return this.resolvedConfig.improvementLabel;
12845
12929
  case 'BUG_FIX':
12846
12930
  return this.resolvedConfig.bugFixLabel;
12847
- default:
12848
- return '';
12849
12931
  }
12850
12932
  }
12851
- getDetailClass(detail) {
12852
- switch (detail.type) {
12933
+ getDetailTypeSectionIcon(type) {
12934
+ switch (type) {
12935
+ case 'NEW':
12936
+ return 'pi pi-plus-circle';
12937
+ case 'IMPROVEMENT':
12938
+ return 'pi pi-arrow-up-right';
12939
+ case 'BUG_FIX':
12940
+ return 'pi pi-wrench';
12941
+ }
12942
+ }
12943
+ getDetailTypeSectionClass(type) {
12944
+ switch (type) {
12853
12945
  case 'NEW':
12854
12946
  return 'new';
12855
12947
  case 'IMPROVEMENT':
12856
12948
  return 'improvement';
12857
12949
  case 'BUG_FIX':
12858
12950
  return 'bug-fix';
12859
- default:
12860
- return '';
12861
12951
  }
12862
12952
  }
12953
+ getDetailClass(detail) {
12954
+ return this.getDetailTypeSectionClass(detail.type);
12955
+ }
12863
12956
  onDetailClick(detail, event) {
12864
12957
  event.stopPropagation();
12865
12958
  if (detail.disabled || !detail.link?.trim()) {
@@ -12877,11 +12970,11 @@ class PTReleaseNotesPageComponent {
12877
12970
  });
12878
12971
  }
12879
12972
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PTReleaseNotesPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12880
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PTReleaseNotesPageComponent, isStandalone: false, selector: "pt-release-notes-page", inputs: { releases: "releases", loading: "loading", totalRecords: "totalRecords", totalAllRecords: "totalAllRecords", totalUnreadRecords: "totalUnreadRecords", totalReadRecords: "totalReadRecords", page: "page", rows: "rows", config: "config" }, outputs: { queryChange: "queryChange" }, ngImport: i0, template: "@if (resolvedConfig.visible) {\n <div class=\"pt-release-notes-page\">\n <div class=\"pt-release-notes-page-header\">\n <div class=\"pt-release-notes-page-heading\">\n <div class=\"pt-release-notes-page-title-row\">\n <div class=\"pt-release-notes-page-title-icon\">\n <i [class]=\"resolvedConfig.icon\"></i>\n </div>\n\n <div>\n <h2 class=\"pt-release-notes-page-title\">\n {{ getTitle() }}\n </h2>\n\n <div class=\"pt-release-notes-page-subtitle\">\n {{ getSubtitle() }}\n </div>\n </div>\n </div>\n\n @if (showCounters()) {\n <div class=\"pt-release-notes-page-counters\">\n <span class=\"pt-release-notes-page-counter\">\n {{ getTotalCount() }}\n version(s)\n </span>\n\n @if (getUnreadCount() > 0) {\n <span class=\"pt-release-notes-page-counter unread\">\n {{ getUnreadCount() }}\n non lue(s)\n </span>\n }\n\n @if (getReadCount() > 0) {\n <span class=\"pt-release-notes-page-counter read\">\n {{ getReadCount() }}\n lue(s)\n </span>\n }\n </div>\n }\n </div>\n </div>\n\n <div class=\"pt-release-notes-page-toolbar\">\n <div class=\"pt-release-notes-page-filters\">\n <button\n type=\"button\"\n class=\"pt-release-notes-page-filter\"\n [class.selected]=\"isFilterSelected('ALL')\"\n (click)=\"selectFilter('ALL')\"\n >\n {{ getAllLabel() }}\n\n <span class=\"pt-release-notes-page-filter-count\">\n {{ getTotalCount() }}\n </span>\n </button>\n\n <button\n type=\"button\"\n class=\"pt-release-notes-page-filter\"\n [class.selected]=\"isFilterSelected('UNREAD')\"\n (click)=\"selectFilter('UNREAD')\"\n >\n {{ getUnreadLabel() }}\n\n <span class=\"pt-release-notes-page-filter-count\">\n {{ getUnreadCount() }}\n </span>\n </button>\n\n <button\n type=\"button\"\n class=\"pt-release-notes-page-filter\"\n [class.selected]=\"isFilterSelected('READ')\"\n (click)=\"selectFilter('READ')\"\n >\n {{ getReadLabel() }}\n\n <span class=\"pt-release-notes-page-filter-count\">\n {{ getReadCount() }}\n </span>\n </button>\n </div>\n\n <div class=\"pt-release-notes-page-search\">\n <i class=\"pi pi-search\"></i>\n\n <input\n type=\"text\"\n [value]=\"searchText\"\n [placeholder]=\"getSearchPlaceholder()\"\n (input)=\"onSearch($any($event.target).value)\"\n />\n\n @if (hasSearch()) {\n <button\n type=\"button\"\n class=\"pt-release-notes-page-search-clear\"\n aria-label=\"Effacer la recherche\"\n (click)=\"clearSearch()\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n }\n </div>\n </div>\n\n @if (hasReleases()) {\n <div class=\"pt-release-notes-page-list\">\n @for (release of getDisplayedReleases(); track release.id) {\n <div [class]=\"getReleaseClasses(release)\">\n <div class=\"pt-release-notes-page-item-top\">\n <div class=\"pt-release-notes-page-item-icon-wrapper\">\n <div class=\"pt-release-notes-page-item-icon\">\n <i class=\"pi pi-sparkles\"></i>\n </div>\n </div>\n\n <div class=\"pt-release-notes-page-item-content\">\n <div class=\"pt-release-notes-page-version-row\">\n <span class=\"pt-release-notes-page-version\">\n v{{ release.version }}\n </span>\n\n <span class=\"pt-release-notes-page-item-title\">\n {{ release.title }}\n </span>\n </div>\n\n @if (release.summary) {\n <div class=\"pt-release-notes-page-summary\">\n {{ release.summary }}\n </div>\n }\n\n @if (release.date) {\n <div class=\"pt-release-notes-page-metadata\">\n <span>\n <i class=\"pi pi-calendar\"></i>\n\n {{ release.date | date: \"dd/MM/yyyy\" }}\n </span>\n </div>\n }\n\n @if (hasCounters(release)) {\n <div class=\"pt-release-notes-page-stats\">\n @if (hasNewItems(release)) {\n <span class=\"pt-release-notes-page-stat new\">\n <i class=\"pi pi-plus-circle\"></i>\n\n <strong>\n {{ getNewCount(release) }}\n </strong>\n\n {{ resolvedConfig.newLabel }}\n </span>\n }\n\n @if (hasImprovements(release)) {\n <span class=\"pt-release-notes-page-stat improvement\">\n <i class=\"pi pi-arrow-up-right\"></i>\n\n <strong>\n {{ getImprovementCount(release) }}\n </strong>\n\n {{ resolvedConfig.improvementLabel }}\n </span>\n }\n\n @if (hasBugFixes(release)) {\n <span class=\"pt-release-notes-page-stat bug-fix\">\n <i class=\"pi pi-wrench\"></i>\n\n <strong>\n {{ getBugFixCount(release) }}\n </strong>\n\n {{ resolvedConfig.bugFixLabel }}\n </span>\n }\n </div>\n }\n </div>\n\n @if (release.read !== true) {\n <span class=\"pt-release-notes-page-unread-indicator\"></span>\n }\n </div>\n\n @if (hasDetails(release) && isDetailsExpanded(release)) {\n <div class=\"pt-release-notes-page-details\">\n @for (detail of getDetails(release); track detail.id) {\n <button\n type=\"button\"\n class=\"pt-release-notes-page-detail\"\n [class.disabled]=\"detail.disabled\"\n [ngClass]=\"[\n getDetailClass(detail),\n detail.styleClass || '',\n ]\"\n [disabled]=\"detail.disabled\"\n (click)=\"onDetailClick(detail, $event)\"\n >\n <div class=\"pt-release-notes-page-detail-icon\">\n <i [ngClass]=\"getDetailIcon(detail)\"></i>\n </div>\n\n <div class=\"pt-release-notes-page-detail-content\">\n <div class=\"pt-release-notes-page-detail-type\">\n {{ getDetailTypeLabel(detail) }}\n </div>\n\n <div class=\"pt-release-notes-page-detail-title\">\n {{ detail.title }}\n </div>\n\n @if (detail.description) {\n <div class=\"pt-release-notes-page-detail-description\">\n {{ detail.description }}\n </div>\n }\n </div>\n\n @if (detail.link) {\n <i\n class=\"pi pi-arrow-right pt-release-notes-page-detail-link\"\n ></i>\n }\n </button>\n }\n </div>\n }\n\n @if (hasDetails(release)) {\n <div class=\"pt-release-notes-page-details-action\">\n <button\n type=\"button\"\n class=\"pt-release-notes-page-details-button\"\n [disabled]=\"release.disabled\"\n (click)=\"toggleDetails(release)\"\n >\n <span>\n {{ getDetailsButtonText(release) }}\n </span>\n\n <i\n class=\"pi\"\n [ngClass]=\"\n isDetailsExpanded(release)\n ? 'pi-chevron-up'\n : 'pi-chevron-down'\n \"\n ></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n } @else if (!loading) {\n <div class=\"pt-release-notes-page-empty\">\n <div class=\"pt-release-notes-page-empty-icon\">\n <i [class]=\"getEmptyIcon()\"></i>\n </div>\n\n <div class=\"pt-release-notes-page-empty-text\">\n @if (hasSearch()) {\n {{ getNoSearchResultText() }}\n } @else {\n {{ getEmptyText() }}\n }\n </div>\n </div>\n }\n\n @if (loading) {\n <div class=\"pt-release-notes-page-loading\">\n <i class=\"pi pi-spin pi-spinner\"></i>\n\n <span>\n {{ resolvedConfig.loadingText }}\n </span>\n </div>\n }\n\n @if (showPagination()) {\n <div class=\"pt-release-notes-page-pagination\">\n <p-paginator\n [first]=\"getFirst()\"\n [rows]=\"rows\"\n [totalRecords]=\"totalRecords\"\n [rowsPerPageOptions]=\"getRowsPerPageOptions()\"\n [showCurrentPageReport]=\"showCurrentPageReport()\"\n [currentPageReportTemplate]=\"getCurrentPageReportTemplate()\"\n (onPageChange)=\"onPageChange($event)\"\n ></p-paginator>\n </div>\n }\n </div>\n}\n", styles: [":host{display:block;width:100%}.pt-release-notes-page{position:relative;width:100%;background:var(--pt-release-notes-page-bg, #ffffff);border:1px solid var(--pt-release-notes-page-border, #e5e7eb);border-radius:14px;overflow:visible}.pt-release-notes-page-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;padding:1.25rem 1.5rem;border-bottom:1px solid var(--pt-release-notes-page-border, #e5e7eb)}.pt-release-notes-page-heading{display:flex;flex-direction:column;gap:.85rem}.pt-release-notes-page-title-row{display:flex;align-items:center;gap:.8rem}.pt-release-notes-page-title-icon{display:flex;align-items:center;justify-content:center;width:42px;height:42px;border-radius:50%;background:var(--pt-release-notes-page-title-icon-bg, #f3f0f8);color:var(--pt-release-notes-page-title-icon-color, #3f2564);font-size:1.15rem}.pt-release-notes-page-title{margin:0;color:var(--pt-release-notes-page-title-color, #1f2937);font-size:1.25rem;font-weight:700}.pt-release-notes-page-subtitle{margin-top:.2rem;color:var(--pt-release-notes-page-subtitle-color, #6b7280);font-size:.875rem}.pt-release-notes-page-counters{display:flex;align-items:center;flex-wrap:wrap;gap:.5rem}.pt-release-notes-page-counter{display:inline-flex;align-items:center;padding:.3rem .65rem;border-radius:999px;background:var(--pt-release-notes-page-counter-bg, #f3f4f6);color:var(--pt-release-notes-page-counter-color, #4b5563);font-size:.78rem;font-weight:600}.pt-release-notes-page-counter.unread{background:var(--pt-release-notes-page-unread-counter-bg, #f3f0f8);color:var(--pt-release-notes-page-unread-counter-color, #3f2564)}.pt-release-notes-page-counter.read{background:var(--pt-release-notes-page-read-counter-bg, #ecfdf5);color:var(--pt-release-notes-page-read-counter-color, #15803d)}.pt-release-notes-page-toolbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:1rem 1.5rem;border-bottom:1px solid var(--pt-release-notes-page-border, #e5e7eb)}.pt-release-notes-page-filters{display:flex;align-items:center;gap:.4rem}.pt-release-notes-page-filter{display:flex;align-items:center;gap:.45rem;padding:.5rem .85rem;border:1px solid var(--pt-release-notes-page-filter-border, #e5e7eb);border-radius:8px;background:var(--pt-release-notes-page-filter-bg, #ffffff);color:var(--pt-release-notes-page-filter-color, #4b5563);font-size:.82rem;font-weight:600;cursor:pointer}.pt-release-notes-page-filter:hover{background:#f9fafb}.pt-release-notes-page-filter.selected{border-color:var(--pt-release-notes-page-primary, #3f2564);background:var(--pt-release-notes-page-selected-bg, #f3f0f8);color:var(--pt-release-notes-page-primary, #3f2564)}.pt-release-notes-page-filter-count{min-width:20px;padding:.1rem .35rem;border-radius:999px;background:#0000000d;text-align:center;font-size:.72rem}.pt-release-notes-page-search{position:relative;display:flex;align-items:center;width:min(360px,100%)}.pt-release-notes-page-search>.pi-search{position:absolute;left:.85rem;color:#9ca3af}.pt-release-notes-page-search input{width:100%;padding:.65rem 2.5rem .65rem 2.4rem;border:1px solid #d1d5db;border-radius:8px;outline:none;font-size:.85rem}.pt-release-notes-page-search input:focus{border-color:var(--pt-release-notes-page-primary, #3f2564);box-shadow:0 0 0 2px #3f256414}.pt-release-notes-page-search-clear{position:absolute;right:.6rem;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:0;background:transparent;color:#6b7280;cursor:pointer}.pt-release-notes-page-list{width:100%}.pt-release-notes-page-item{position:relative;padding:1.1rem 1.5rem;border-bottom:1px solid var(--pt-release-notes-page-border, #e5e7eb);background:var(--pt-release-notes-page-item-bg, #ffffff);transition:background .15s ease}.pt-release-notes-page-item:last-child{border-bottom:0}.pt-release-notes-page-item:hover{background:var(--pt-release-notes-page-item-hover-bg, #f9fafb)}.pt-release-notes-page-item.unread{background:var(--pt-release-notes-page-unread-bg, #faf8fd)}.pt-release-notes-page-item.unread:hover{background:var(--pt-release-notes-page-unread-hover-bg, #f6f2fa)}.pt-release-notes-page-item.disabled{opacity:.55}.pt-release-notes-page-item-top{position:relative;display:flex;align-items:flex-start;gap:1rem}.pt-release-notes-page-item-icon-wrapper{flex:0 0 auto}.pt-release-notes-page-item-icon{display:flex;align-items:center;justify-content:center;width:42px;height:42px;border-radius:50%;background:var(--pt-release-notes-page-item-icon-bg, #f3f0f8);color:var(--pt-release-notes-page-primary, #3f2564);font-size:1rem}.pt-release-notes-page-item-content{flex:1 1 auto;min-width:0}.pt-release-notes-page-version-row{display:flex;align-items:center;flex-wrap:wrap;gap:.65rem}.pt-release-notes-page-version{display:inline-flex;align-items:center;padding:.25rem .55rem;border-radius:6px;background:var(--pt-release-notes-page-selected-bg, #f3f0f8);color:var(--pt-release-notes-page-primary, #3f2564);font-size:.78rem;font-weight:800}.pt-release-notes-page-item-title{color:var(--pt-release-notes-page-text-color, #1f2937);font-size:.9rem;font-weight:700}.pt-release-notes-page-item.unread .pt-release-notes-page-item-title{font-weight:700}.pt-release-notes-page-summary{margin-top:.45rem;color:var(--pt-release-notes-page-metadata-color, #6b7280);font-size:.85rem;line-height:1.5}.pt-release-notes-page-metadata{display:flex;align-items:center;flex-wrap:wrap;gap:1rem;margin-top:.5rem;color:var(--pt-release-notes-page-metadata-color, #6b7280);font-size:.78rem}.pt-release-notes-page-metadata span{display:inline-flex;align-items:center;gap:.35rem}.pt-release-notes-page-stats{display:flex;align-items:center;flex-wrap:wrap;gap:.45rem;margin-top:.8rem}.pt-release-notes-page-stat{display:inline-flex;align-items:center;gap:.35rem;padding:.3rem .6rem;border-radius:999px;font-size:.72rem;font-weight:600}.pt-release-notes-page-stat.new{background:#dcfce7;color:#15803d}.pt-release-notes-page-stat.improvement{background:#dbeafe;color:#1d4ed8}.pt-release-notes-page-stat.bug-fix{background:#fee2e2;color:#b91c1c}.pt-release-notes-page-unread-indicator{position:absolute;top:50%;right:-1rem;width:7px;height:7px;border-radius:50%;background:var(--pt-release-notes-page-unread-indicator, #3f2564);transform:translateY(-50%)}.pt-release-notes-page-details{display:flex;flex-direction:column;gap:.35rem;margin-top:1rem;margin-left:58px;padding-top:1rem;border-top:1px solid var(--pt-release-notes-page-border, #e5e7eb)}.pt-release-notes-page-detail{display:flex;align-items:flex-start;gap:.75rem;width:100%;padding:.7rem;border:0;border-radius:8px;background:transparent;color:inherit;text-align:left;cursor:pointer}.pt-release-notes-page-detail:hover:not(:disabled){background:#f9fafb}.pt-release-notes-page-detail.disabled{opacity:.55;cursor:default}.pt-release-notes-page-detail-icon{flex:0 0 auto;display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px}.pt-release-notes-page-detail.new .pt-release-notes-page-detail-icon{background:#dcfce7;color:#15803d}.pt-release-notes-page-detail.improvement .pt-release-notes-page-detail-icon{background:#dbeafe;color:#1d4ed8}.pt-release-notes-page-detail.bug-fix .pt-release-notes-page-detail-icon{background:#fee2e2;color:#b91c1c}.pt-release-notes-page-detail-content{flex:1;min-width:0}.pt-release-notes-page-detail-type{margin-bottom:.2rem;font-size:.68rem;font-weight:700;text-transform:uppercase}.pt-release-notes-page-detail.new .pt-release-notes-page-detail-type{color:#15803d}.pt-release-notes-page-detail.improvement .pt-release-notes-page-detail-type{color:#1d4ed8}.pt-release-notes-page-detail.bug-fix .pt-release-notes-page-detail-type{color:#b91c1c}.pt-release-notes-page-detail-title{color:#1f2937;font-size:.84rem;font-weight:700}.pt-release-notes-page-detail-description{margin-top:.25rem;color:#6b7280;font-size:.78rem;line-height:1.5}.pt-release-notes-page-detail-link{flex:0 0 auto;align-self:center;color:#6b7280;font-size:.72rem}.pt-release-notes-page-details-action{display:flex;justify-content:center;margin-top:.8rem;margin-left:58px}.pt-release-notes-page-details-button{display:inline-flex;align-items:center;justify-content:center;gap:.45rem;padding:.45rem .75rem;border:0;border-radius:7px;background:transparent;color:var(--pt-release-notes-page-primary, #3f2564);font-size:.78rem;font-weight:700;cursor:pointer}.pt-release-notes-page-details-button:hover:not(:disabled){background:var(--pt-release-notes-page-selected-bg, #f3f0f8)}.pt-release-notes-page-details-button:disabled{opacity:.5;cursor:default}.pt-release-notes-page-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:280px;padding:3rem;color:#6b7280;text-align:center}.pt-release-notes-page-empty-icon{display:flex;align-items:center;justify-content:center;width:64px;height:64px;margin-bottom:1rem;border-radius:50%;background:#f3f4f6;color:#9ca3af;font-size:1.6rem}.pt-release-notes-page-empty-text{max-width:450px;font-size:.9rem}.pt-release-notes-page-loading{display:flex;align-items:center;justify-content:center;gap:.5rem;min-height:100px;color:#6b7280;font-size:.85rem}.pt-release-notes-page-pagination{display:flex;align-items:center;justify-content:center;width:100%;padding:.75rem 1rem;box-sizing:border-box;border-top:1px solid var(--pt-release-notes-page-border, #e5e7eb);background:var(--pt-release-notes-page-pagination-bg, #ffffff)}.pt-release-notes-page-pagination ::ng-deep .p-paginator{width:100%;border:0;background:transparent}@media(max-width:768px){.pt-release-notes-page-header,.pt-release-notes-page-toolbar{flex-direction:column;align-items:stretch}.pt-release-notes-page-filters{overflow-x:auto}.pt-release-notes-page-search{width:100%}.pt-release-notes-page-item{padding:1rem 1.1rem}.pt-release-notes-page-details,.pt-release-notes-page-details-action{margin-left:0}.pt-release-notes-page-unread-indicator{right:0}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2$6.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "styleClass", "alwaysShow", "dropdownAppendTo", "templateLeft", "templateRight", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "jumpToPageItemTemplate", "showPageLinks", "locale", "dropdownItemTemplate", "first", "appendTo"], outputs: ["onPageChange"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12973
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PTReleaseNotesPageComponent, isStandalone: false, selector: "pt-release-notes-page", inputs: { releases: "releases", loading: "loading", totalRecords: "totalRecords", totalAllRecords: "totalAllRecords", totalUnreadRecords: "totalUnreadRecords", totalReadRecords: "totalReadRecords", page: "page", rows: "rows", rowsPerPageOptions: "rowsPerPageOptions", config: "config" }, outputs: { queryChange: "queryChange" }, ngImport: i0, template: "@if (resolvedConfig.visible) {\n <div class=\"pt-release-notes-page\">\n <div class=\"pt-release-notes-page-header\">\n <div class=\"pt-release-notes-page-heading\">\n <div class=\"pt-release-notes-page-title-row\">\n <div class=\"pt-release-notes-page-title-icon\">\n <i [class]=\"resolvedConfig.icon\"></i>\n </div>\n\n <div>\n <h2 class=\"pt-release-notes-page-title\">\n {{ getTitle() }}\n </h2>\n\n <div class=\"pt-release-notes-page-subtitle\">\n {{ getSubtitle() }}\n </div>\n </div>\n </div>\n\n @if (showCounters()) {\n <div class=\"pt-release-notes-page-counters\">\n <span class=\"pt-release-notes-page-counter\">\n {{ getTotalCount() }}\n version(s)\n </span>\n\n @if (getUnreadCount() > 0) {\n <span class=\"pt-release-notes-page-counter unread\">\n {{ getUnreadCount() }}\n non lue(s)\n </span>\n }\n\n @if (getReadCount() > 0) {\n <span class=\"pt-release-notes-page-counter read\">\n {{ getReadCount() }}\n lue(s)\n </span>\n }\n </div>\n }\n </div>\n </div>\n\n <div class=\"pt-release-notes-page-toolbar\">\n <div class=\"pt-release-notes-page-toolbar-left\">\n <div class=\"pt-release-notes-page-filters\">\n <button\n type=\"button\"\n class=\"pt-release-notes-page-filter\"\n [class.selected]=\"isFilterSelected('ALL')\"\n (click)=\"selectFilter('ALL')\"\n >\n {{ getAllLabel() }}\n\n <span class=\"pt-release-notes-page-filter-count\">\n {{ getTotalCount() }}\n </span>\n </button>\n\n <button\n type=\"button\"\n class=\"pt-release-notes-page-filter\"\n [class.selected]=\"isFilterSelected('UNREAD')\"\n (click)=\"selectFilter('UNREAD')\"\n >\n {{ getUnreadLabel() }}\n\n <span class=\"pt-release-notes-page-filter-count\">\n {{ getUnreadCount() }}\n </span>\n </button>\n\n <button\n type=\"button\"\n class=\"pt-release-notes-page-filter\"\n [class.selected]=\"isFilterSelected('READ')\"\n (click)=\"selectFilter('READ')\"\n >\n {{ getReadLabel() }}\n\n <span class=\"pt-release-notes-page-filter-count\">\n {{ getReadCount() }}\n </span>\n </button>\n </div>\n\n @if (hasExpandableReleases()) {\n <button\n type=\"button\"\n class=\"pt-release-notes-page-expand-all\"\n [class.expanded]=\"areAllDetailsExpanded()\"\n (click)=\"toggleAllDetails()\"\n >\n <i\n class=\"pi\"\n [ngClass]=\"\n areAllDetailsExpanded()\n ? 'pi-angle-double-up'\n : 'pi-angle-double-down'\n \"\n ></i>\n\n <span>\n {{ getToggleAllDetailsText() }}\n </span>\n </button>\n }\n </div>\n\n <div class=\"pt-release-notes-page-search\">\n <i class=\"pi pi-search\"></i>\n\n <input\n type=\"text\"\n [value]=\"searchText\"\n [placeholder]=\"getSearchPlaceholder()\"\n (input)=\"onSearch($any($event.target).value)\"\n />\n\n @if (hasSearch()) {\n <button\n type=\"button\"\n class=\"pt-release-notes-page-search-clear\"\n aria-label=\"Effacer la recherche\"\n (click)=\"clearSearch()\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n }\n </div>\n </div>\n\n @if (hasReleases()) {\n <div class=\"pt-release-notes-page-list\">\n @for (release of getDisplayedReleases(); track release.id) {\n <div [class]=\"getReleaseClasses(release)\">\n <div class=\"pt-release-notes-page-item-top\">\n <div class=\"pt-release-notes-page-item-icon-wrapper\">\n <div class=\"pt-release-notes-page-item-icon\">\n <i class=\"pi pi-sparkles\"></i>\n </div>\n </div>\n\n <div class=\"pt-release-notes-page-item-content\">\n <div class=\"pt-release-notes-page-version-row\">\n <span class=\"pt-release-notes-page-version\">\n v{{ release.version }}\n </span>\n\n <span class=\"pt-release-notes-page-item-title\">\n {{ release.title }}\n </span>\n </div>\n\n @if (release.summary) {\n <div class=\"pt-release-notes-page-summary\">\n {{ release.summary }}\n </div>\n }\n\n @if (release.date) {\n <div class=\"pt-release-notes-page-metadata\">\n <span>\n <i class=\"pi pi-calendar\"></i>\n\n {{ release.date | date: \"dd/MM/yyyy\" }}\n </span>\n </div>\n }\n\n @if (hasCounters(release)) {\n <div class=\"pt-release-notes-page-stats\">\n @if (hasNewItems(release)) {\n <span class=\"pt-release-notes-page-stat new\">\n <i class=\"pi pi-plus-circle\"></i>\n\n <strong>\n {{ getNewCount(release) }}\n </strong>\n\n {{ resolvedConfig.newLabel }}\n </span>\n }\n\n @if (hasImprovements(release)) {\n <span class=\"pt-release-notes-page-stat improvement\">\n <i class=\"pi pi-arrow-up-right\"></i>\n\n <strong>\n {{ getImprovementCount(release) }}\n </strong>\n\n {{ resolvedConfig.improvementLabel }}\n </span>\n }\n\n @if (hasBugFixes(release)) {\n <span class=\"pt-release-notes-page-stat bug-fix\">\n <i class=\"pi pi-wrench\"></i>\n\n <strong>\n {{ getBugFixCount(release) }}\n </strong>\n\n {{ resolvedConfig.bugFixLabel }}\n </span>\n }\n </div>\n }\n </div>\n\n @if (release.read !== true) {\n <span class=\"pt-release-notes-page-unread-indicator\"></span>\n }\n </div>\n\n @if (hasDetails(release) && isDetailsExpanded(release)) {\n <div class=\"pt-release-notes-page-details\">\n @if (hasDetailsByType(release, \"NEW\")) {\n <section class=\"pt-release-notes-page-detail-section new\">\n <div class=\"pt-release-notes-page-detail-section-header\">\n <div class=\"pt-release-notes-page-detail-section-title\">\n <span class=\"pt-release-notes-page-detail-section-icon\">\n <i class=\"pi pi-plus-circle\"></i>\n </span>\n\n <span>\n {{ resolvedConfig.newLabel }}\n </span>\n </div>\n\n <span class=\"pt-release-notes-page-detail-section-count\">\n {{ getDetailsByType(release, \"NEW\").length }}\n </span>\n </div>\n\n <div class=\"pt-release-notes-page-detail-section-content\">\n @for (\n detail of getDetailsByType(release, \"NEW\");\n track detail.id\n ) {\n <button\n type=\"button\"\n class=\"pt-release-notes-page-detail new\"\n [class.disabled]=\"detail.disabled\"\n [ngClass]=\"detail.styleClass || ''\"\n [disabled]=\"detail.disabled\"\n (click)=\"onDetailClick(detail, $event)\"\n >\n <div class=\"pt-release-notes-page-detail-icon\">\n <i [ngClass]=\"getDetailIcon(detail)\"></i>\n </div>\n\n <div class=\"pt-release-notes-page-detail-content\">\n <div class=\"pt-release-notes-page-detail-title\">\n {{ detail.title }}\n </div>\n\n @if (detail.description) {\n <div\n class=\"pt-release-notes-page-detail-description\"\n >\n {{ detail.description }}\n </div>\n }\n </div>\n\n @if (detail.link) {\n <i\n class=\"pi pi-arrow-right pt-release-notes-page-detail-link\"\n ></i>\n }\n </button>\n }\n </div>\n </section>\n }\n\n @if (hasDetailsByType(release, \"IMPROVEMENT\")) {\n <section\n class=\"pt-release-notes-page-detail-section improvement\"\n >\n <div class=\"pt-release-notes-page-detail-section-header\">\n <div class=\"pt-release-notes-page-detail-section-title\">\n <span class=\"pt-release-notes-page-detail-section-icon\">\n <i class=\"pi pi-arrow-up-right\"></i>\n </span>\n\n <span>\n {{ resolvedConfig.improvementLabel }}\n </span>\n </div>\n\n <span class=\"pt-release-notes-page-detail-section-count\">\n {{ getDetailsByType(release, \"IMPROVEMENT\").length }}\n </span>\n </div>\n\n <div class=\"pt-release-notes-page-detail-section-content\">\n @for (\n detail of getDetailsByType(release, \"IMPROVEMENT\");\n track detail.id\n ) {\n <button\n type=\"button\"\n class=\"pt-release-notes-page-detail improvement\"\n [class.disabled]=\"detail.disabled\"\n [ngClass]=\"detail.styleClass || ''\"\n [disabled]=\"detail.disabled\"\n (click)=\"onDetailClick(detail, $event)\"\n >\n <div class=\"pt-release-notes-page-detail-icon\">\n <i [ngClass]=\"getDetailIcon(detail)\"></i>\n </div>\n\n <div class=\"pt-release-notes-page-detail-content\">\n <div class=\"pt-release-notes-page-detail-title\">\n {{ detail.title }}\n </div>\n\n @if (detail.description) {\n <div\n class=\"pt-release-notes-page-detail-description\"\n >\n {{ detail.description }}\n </div>\n }\n </div>\n\n @if (detail.link) {\n <i\n class=\"pi pi-arrow-right pt-release-notes-page-detail-link\"\n ></i>\n }\n </button>\n }\n </div>\n </section>\n }\n\n @if (hasDetailsByType(release, \"BUG_FIX\")) {\n <section class=\"pt-release-notes-page-detail-section bug-fix\">\n <div class=\"pt-release-notes-page-detail-section-header\">\n <div class=\"pt-release-notes-page-detail-section-title\">\n <span class=\"pt-release-notes-page-detail-section-icon\">\n <i class=\"pi pi-wrench\"></i>\n </span>\n\n <span>\n {{ resolvedConfig.bugFixLabel }}\n </span>\n </div>\n\n <span class=\"pt-release-notes-page-detail-section-count\">\n {{ getDetailsByType(release, \"BUG_FIX\").length }}\n </span>\n </div>\n\n <div class=\"pt-release-notes-page-detail-section-content\">\n @for (\n detail of getDetailsByType(release, \"BUG_FIX\");\n track detail.id\n ) {\n <button\n type=\"button\"\n class=\"pt-release-notes-page-detail bug-fix\"\n [class.disabled]=\"detail.disabled\"\n [ngClass]=\"detail.styleClass || ''\"\n [disabled]=\"detail.disabled\"\n (click)=\"onDetailClick(detail, $event)\"\n >\n <div class=\"pt-release-notes-page-detail-icon\">\n <i [ngClass]=\"getDetailIcon(detail)\"></i>\n </div>\n\n <div class=\"pt-release-notes-page-detail-content\">\n <div class=\"pt-release-notes-page-detail-title\">\n {{ detail.title }}\n </div>\n\n @if (detail.description) {\n <div\n class=\"pt-release-notes-page-detail-description\"\n >\n {{ detail.description }}\n </div>\n }\n </div>\n\n @if (detail.link) {\n <i\n class=\"pi pi-arrow-right pt-release-notes-page-detail-link\"\n ></i>\n }\n </button>\n }\n </div>\n </section>\n }\n </div>\n }\n\n @if (hasDetails(release)) {\n <div class=\"pt-release-notes-page-details-action\">\n <button\n type=\"button\"\n class=\"pt-release-notes-page-details-button\"\n [disabled]=\"release.disabled\"\n (click)=\"toggleDetails(release)\"\n >\n <span>\n {{ getDetailsButtonText(release) }}\n </span>\n\n <i\n class=\"pi\"\n [ngClass]=\"\n isDetailsExpanded(release)\n ? 'pi-chevron-up'\n : 'pi-chevron-down'\n \"\n ></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n } @else if (!loading) {\n <div class=\"pt-release-notes-page-empty\">\n <div class=\"pt-release-notes-page-empty-icon\">\n <i [class]=\"getEmptyIcon()\"></i>\n </div>\n\n <div class=\"pt-release-notes-page-empty-text\">\n @if (hasSearch()) {\n {{ getNoSearchResultText() }}\n } @else {\n {{ getEmptyText() }}\n }\n </div>\n </div>\n }\n\n @if (loading) {\n <div class=\"pt-release-notes-page-loading\">\n <i class=\"pi pi-spin pi-spinner\"></i>\n\n <span>\n {{ resolvedConfig.loadingText }}\n </span>\n </div>\n }\n\n @if (showPagination()) {\n <div class=\"pt-release-notes-page-pagination\">\n <p-paginator\n [first]=\"getFirst()\"\n [rows]=\"rows\"\n [totalRecords]=\"totalRecords\"\n [rowsPerPageOptions]=\"getRowsPerPageOptions()\"\n [showCurrentPageReport]=\"showCurrentPageReport()\"\n [currentPageReportTemplate]=\"getCurrentPageReportTemplate()\"\n (onPageChange)=\"onPageChange($event)\"\n ></p-paginator>\n </div>\n }\n </div>\n}\n", styles: [":host{display:block;width:100%}.pt-release-notes-page{position:relative;width:100%;background:var(--pt-release-notes-page-bg, #ffffff);border:1px solid var(--pt-release-notes-page-border, #e5e7eb);border-radius:14px;overflow:visible}.pt-release-notes-page-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;padding:1.25rem 1.5rem;border-bottom:1px solid var(--pt-release-notes-page-border, #e5e7eb)}.pt-release-notes-page-heading{display:flex;flex-direction:column;gap:.85rem}.pt-release-notes-page-title-row{display:flex;align-items:center;gap:.8rem}.pt-release-notes-page-title-icon{display:flex;align-items:center;justify-content:center;width:42px;height:42px;border-radius:50%;background:var(--pt-release-notes-page-title-icon-bg, #f3f0f8);color:var(--pt-release-notes-page-title-icon-color, #3f2564);font-size:1.15rem}.pt-release-notes-page-title{margin:0;color:var(--pt-release-notes-page-title-color, #1f2937);font-size:1.25rem;font-weight:700}.pt-release-notes-page-subtitle{margin-top:.2rem;color:var(--pt-release-notes-page-subtitle-color, #6b7280);font-size:.875rem}.pt-release-notes-page-counters{display:flex;align-items:center;flex-wrap:wrap;gap:.5rem}.pt-release-notes-page-counter{display:inline-flex;align-items:center;padding:.3rem .65rem;border-radius:999px;background:var(--pt-release-notes-page-counter-bg, #f3f4f6);color:var(--pt-release-notes-page-counter-color, #4b5563);font-size:.78rem;font-weight:600}.pt-release-notes-page-counter.unread{background:var(--pt-release-notes-page-unread-counter-bg, #f3f0f8);color:var(--pt-release-notes-page-unread-counter-color, #3f2564)}.pt-release-notes-page-counter.read{background:var(--pt-release-notes-page-read-counter-bg, #ecfdf5);color:var(--pt-release-notes-page-read-counter-color, #15803d)}.pt-release-notes-page-toolbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:1rem 1.5rem;border-bottom:1px solid var(--pt-release-notes-page-border, #e5e7eb)}.pt-release-notes-page-toolbar-left{display:flex;align-items:center;flex-wrap:wrap;gap:.75rem;min-width:0}.pt-release-notes-page-filters{display:flex;align-items:center;gap:.4rem}.pt-release-notes-page-filter{display:flex;align-items:center;gap:.45rem;padding:.5rem .85rem;border:1px solid var(--pt-release-notes-page-filter-border, #e5e7eb);border-radius:8px;background:var(--pt-release-notes-page-filter-bg, #ffffff);color:var(--pt-release-notes-page-filter-color, #4b5563);font-size:.82rem;font-weight:600;cursor:pointer}.pt-release-notes-page-filter:hover{background:#f9fafb}.pt-release-notes-page-filter.selected{border-color:var(--pt-release-notes-page-primary, #3f2564);background:var(--pt-release-notes-page-selected-bg, #f3f0f8);color:var(--pt-release-notes-page-primary, #3f2564)}.pt-release-notes-page-filter-count{min-width:20px;padding:.1rem .35rem;border-radius:999px;background:#0000000d;text-align:center;font-size:.72rem}.pt-release-notes-page-expand-all{display:inline-flex;align-items:center;justify-content:center;gap:.45rem;min-height:34px;padding:.45rem .75rem;border:1px solid var(--pt-release-notes-page-filter-border, #e5e7eb);border-radius:8px;background:#fff;color:var(--pt-release-notes-page-primary, #3f2564);font-size:.78rem;font-weight:700;cursor:pointer;transition:background .15s ease,border-color .15s ease}.pt-release-notes-page-expand-all:hover,.pt-release-notes-page-expand-all.expanded{border-color:var(--pt-release-notes-page-primary, #3f2564);background:var(--pt-release-notes-page-selected-bg, #f3f0f8)}.pt-release-notes-page-search{position:relative;display:flex;align-items:center;width:min(360px,100%)}.pt-release-notes-page-search>.pi-search{position:absolute;left:.85rem;color:#9ca3af}.pt-release-notes-page-search input{width:100%;padding:.65rem 2.5rem .65rem 2.4rem;border:1px solid #d1d5db;border-radius:8px;outline:none;font-size:.85rem}.pt-release-notes-page-search input:focus{border-color:var(--pt-release-notes-page-primary, #3f2564);box-shadow:0 0 0 2px #3f256414}.pt-release-notes-page-search-clear{position:absolute;right:.6rem;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:0;background:transparent;color:#6b7280;cursor:pointer}.pt-release-notes-page-list{width:100%}.pt-release-notes-page-item{position:relative;padding:1.1rem 1.5rem;border-bottom:1px solid var(--pt-release-notes-page-border, #e5e7eb);background:var(--pt-release-notes-page-item-bg, #ffffff);transition:background .15s ease}.pt-release-notes-page-item:last-child{border-bottom:0}.pt-release-notes-page-item:hover{background:var(--pt-release-notes-page-item-hover-bg, #f9fafb)}.pt-release-notes-page-item.unread{background:var(--pt-release-notes-page-unread-bg, #faf8fd)}.pt-release-notes-page-item.unread:hover{background:var(--pt-release-notes-page-unread-hover-bg, #f6f2fa)}.pt-release-notes-page-item.disabled{opacity:.55}.pt-release-notes-page-item-top{position:relative;display:flex;align-items:flex-start;gap:1rem}.pt-release-notes-page-item-icon-wrapper{flex:0 0 auto}.pt-release-notes-page-item-icon{display:flex;align-items:center;justify-content:center;width:42px;height:42px;border-radius:50%;background:var(--pt-release-notes-page-item-icon-bg, #f3f0f8);color:var(--pt-release-notes-page-primary, #3f2564);font-size:1rem}.pt-release-notes-page-item-content{flex:1 1 auto;min-width:0}.pt-release-notes-page-version-row{display:flex;align-items:center;flex-wrap:wrap;gap:.65rem}.pt-release-notes-page-version{display:inline-flex;align-items:center;padding:.25rem .55rem;border-radius:6px;background:var(--pt-release-notes-page-selected-bg, #f3f0f8);color:var(--pt-release-notes-page-primary, #3f2564);font-size:.78rem;font-weight:800}.pt-release-notes-page-item-title{color:var(--pt-release-notes-page-text-color, #1f2937);font-size:.9rem;font-weight:700}.pt-release-notes-page-summary{margin-top:.45rem;color:var(--pt-release-notes-page-metadata-color, #6b7280);font-size:.85rem;line-height:1.5}.pt-release-notes-page-metadata{display:flex;align-items:center;flex-wrap:wrap;gap:1rem;margin-top:.5rem;color:var(--pt-release-notes-page-metadata-color, #6b7280);font-size:.78rem}.pt-release-notes-page-metadata span{display:inline-flex;align-items:center;gap:.35rem}.pt-release-notes-page-stats{display:flex;align-items:center;flex-wrap:wrap;gap:.45rem;margin-top:.8rem}.pt-release-notes-page-stat{display:inline-flex;align-items:center;gap:.35rem;padding:.3rem .6rem;border-radius:999px;font-size:.72rem;font-weight:600}.pt-release-notes-page-stat.new{background:#dcfce7;color:#15803d}.pt-release-notes-page-stat.improvement{background:#dbeafe;color:#1d4ed8}.pt-release-notes-page-stat.bug-fix{background:#fee2e2;color:#b91c1c}.pt-release-notes-page-unread-indicator{position:absolute;top:50%;right:-1rem;width:7px;height:7px;border-radius:50%;background:var(--pt-release-notes-page-unread-indicator, #3f2564);transform:translateY(-50%)}.pt-release-notes-page-details{display:flex;flex-direction:column;gap:1rem;margin-top:1rem;margin-left:58px;padding-top:1rem;border-top:1px solid var(--pt-release-notes-page-border, #e5e7eb)}.pt-release-notes-page-detail-section{overflow:hidden;border:1px solid #e5e7eb;border-radius:10px;background:#fff}.pt-release-notes-page-detail-section-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.65rem .85rem;border-bottom:1px solid #e5e7eb}.pt-release-notes-page-detail-section-title{display:flex;align-items:center;gap:.55rem;font-size:.78rem;font-weight:800;text-transform:uppercase;letter-spacing:.015em}.pt-release-notes-page-detail-section-icon{display:inline-flex;align-items:center;justify-content:center;width:27px;height:27px;border-radius:7px}.pt-release-notes-page-detail-section-count{display:inline-flex;align-items:center;justify-content:center;min-width:24px;height:24px;padding:0 .4rem;border-radius:999px;font-size:.7rem;font-weight:800}.pt-release-notes-page-detail-section.new .pt-release-notes-page-detail-section-header{background:#f0fdf4}.pt-release-notes-page-detail-section.new .pt-release-notes-page-detail-section-title{color:#15803d}.pt-release-notes-page-detail-section.new .pt-release-notes-page-detail-section-icon,.pt-release-notes-page-detail-section.new .pt-release-notes-page-detail-section-count{background:#dcfce7;color:#15803d}.pt-release-notes-page-detail-section.improvement .pt-release-notes-page-detail-section-header{background:#eff6ff}.pt-release-notes-page-detail-section.improvement .pt-release-notes-page-detail-section-title{color:#1d4ed8}.pt-release-notes-page-detail-section.improvement .pt-release-notes-page-detail-section-icon,.pt-release-notes-page-detail-section.improvement .pt-release-notes-page-detail-section-count{background:#dbeafe;color:#1d4ed8}.pt-release-notes-page-detail-section.bug-fix .pt-release-notes-page-detail-section-header{background:#fef2f2}.pt-release-notes-page-detail-section.bug-fix .pt-release-notes-page-detail-section-title{color:#b91c1c}.pt-release-notes-page-detail-section.bug-fix .pt-release-notes-page-detail-section-icon,.pt-release-notes-page-detail-section.bug-fix .pt-release-notes-page-detail-section-count{background:#fee2e2;color:#b91c1c}.pt-release-notes-page-detail-section-content{display:flex;flex-direction:column;padding:.35rem}.pt-release-notes-page-detail{display:flex;align-items:flex-start;gap:.75rem;width:100%;padding:.7rem;border:0;border-radius:8px;background:transparent;color:inherit;text-align:left;cursor:pointer}.pt-release-notes-page-detail:hover:not(:disabled){background:#f9fafb}.pt-release-notes-page-detail.disabled{opacity:.55;cursor:default}.pt-release-notes-page-detail-icon{flex:0 0 auto;display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px}.pt-release-notes-page-detail.new .pt-release-notes-page-detail-icon{background:#dcfce7;color:#15803d}.pt-release-notes-page-detail.improvement .pt-release-notes-page-detail-icon{background:#dbeafe;color:#1d4ed8}.pt-release-notes-page-detail.bug-fix .pt-release-notes-page-detail-icon{background:#fee2e2;color:#b91c1c}.pt-release-notes-page-detail-content{flex:1;min-width:0}.pt-release-notes-page-detail-title{color:#1f2937;font-size:.84rem;font-weight:700}.pt-release-notes-page-detail-description{margin-top:.25rem;color:#6b7280;font-size:.78rem;line-height:1.5}.pt-release-notes-page-detail-link{flex:0 0 auto;align-self:center;color:#6b7280;font-size:.72rem}.pt-release-notes-page-details-action{display:flex;justify-content:center;margin-top:.8rem;margin-left:58px}.pt-release-notes-page-details-button{display:inline-flex;align-items:center;justify-content:center;gap:.45rem;padding:.45rem .75rem;border:0;border-radius:7px;background:transparent;color:var(--pt-release-notes-page-primary, #3f2564);font-size:.78rem;font-weight:700;cursor:pointer}.pt-release-notes-page-details-button:hover:not(:disabled){background:var(--pt-release-notes-page-selected-bg, #f3f0f8)}.pt-release-notes-page-details-button:disabled{opacity:.5;cursor:default}.pt-release-notes-page-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:280px;padding:3rem;color:#6b7280;text-align:center}.pt-release-notes-page-empty-icon{display:flex;align-items:center;justify-content:center;width:64px;height:64px;margin-bottom:1rem;border-radius:50%;background:#f3f4f6;color:#9ca3af;font-size:1.6rem}.pt-release-notes-page-empty-text{max-width:450px;font-size:.9rem}.pt-release-notes-page-loading{display:flex;align-items:center;justify-content:center;gap:.5rem;min-height:100px;color:#6b7280;font-size:.85rem}.pt-release-notes-page-pagination{display:flex;align-items:center;justify-content:center;width:100%;padding:.75rem 1rem;box-sizing:border-box;border-top:1px solid var(--pt-release-notes-page-border, #e5e7eb);background:var(--pt-release-notes-page-pagination-bg, #ffffff)}.pt-release-notes-page-pagination ::ng-deep .p-paginator{width:100%;border:0;background:transparent}@media(max-width:768px){.pt-release-notes-page-header,.pt-release-notes-page-toolbar,.pt-release-notes-page-toolbar-left{flex-direction:column;align-items:stretch}.pt-release-notes-page-filters{overflow-x:auto}.pt-release-notes-page-expand-all{align-self:flex-start}.pt-release-notes-page-search{width:100%}.pt-release-notes-page-item{padding:1rem 1.1rem}.pt-release-notes-page-details,.pt-release-notes-page-details-action{margin-left:0}.pt-release-notes-page-unread-indicator{right:0}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2$6.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "styleClass", "alwaysShow", "dropdownAppendTo", "templateLeft", "templateRight", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "jumpToPageItemTemplate", "showPageLinks", "locale", "dropdownItemTemplate", "first", "appendTo"], outputs: ["onPageChange"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12881
12974
  }
12882
12975
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PTReleaseNotesPageComponent, decorators: [{
12883
12976
  type: Component,
12884
- args: [{ selector: 'pt-release-notes-page', standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (resolvedConfig.visible) {\n <div class=\"pt-release-notes-page\">\n <div class=\"pt-release-notes-page-header\">\n <div class=\"pt-release-notes-page-heading\">\n <div class=\"pt-release-notes-page-title-row\">\n <div class=\"pt-release-notes-page-title-icon\">\n <i [class]=\"resolvedConfig.icon\"></i>\n </div>\n\n <div>\n <h2 class=\"pt-release-notes-page-title\">\n {{ getTitle() }}\n </h2>\n\n <div class=\"pt-release-notes-page-subtitle\">\n {{ getSubtitle() }}\n </div>\n </div>\n </div>\n\n @if (showCounters()) {\n <div class=\"pt-release-notes-page-counters\">\n <span class=\"pt-release-notes-page-counter\">\n {{ getTotalCount() }}\n version(s)\n </span>\n\n @if (getUnreadCount() > 0) {\n <span class=\"pt-release-notes-page-counter unread\">\n {{ getUnreadCount() }}\n non lue(s)\n </span>\n }\n\n @if (getReadCount() > 0) {\n <span class=\"pt-release-notes-page-counter read\">\n {{ getReadCount() }}\n lue(s)\n </span>\n }\n </div>\n }\n </div>\n </div>\n\n <div class=\"pt-release-notes-page-toolbar\">\n <div class=\"pt-release-notes-page-filters\">\n <button\n type=\"button\"\n class=\"pt-release-notes-page-filter\"\n [class.selected]=\"isFilterSelected('ALL')\"\n (click)=\"selectFilter('ALL')\"\n >\n {{ getAllLabel() }}\n\n <span class=\"pt-release-notes-page-filter-count\">\n {{ getTotalCount() }}\n </span>\n </button>\n\n <button\n type=\"button\"\n class=\"pt-release-notes-page-filter\"\n [class.selected]=\"isFilterSelected('UNREAD')\"\n (click)=\"selectFilter('UNREAD')\"\n >\n {{ getUnreadLabel() }}\n\n <span class=\"pt-release-notes-page-filter-count\">\n {{ getUnreadCount() }}\n </span>\n </button>\n\n <button\n type=\"button\"\n class=\"pt-release-notes-page-filter\"\n [class.selected]=\"isFilterSelected('READ')\"\n (click)=\"selectFilter('READ')\"\n >\n {{ getReadLabel() }}\n\n <span class=\"pt-release-notes-page-filter-count\">\n {{ getReadCount() }}\n </span>\n </button>\n </div>\n\n <div class=\"pt-release-notes-page-search\">\n <i class=\"pi pi-search\"></i>\n\n <input\n type=\"text\"\n [value]=\"searchText\"\n [placeholder]=\"getSearchPlaceholder()\"\n (input)=\"onSearch($any($event.target).value)\"\n />\n\n @if (hasSearch()) {\n <button\n type=\"button\"\n class=\"pt-release-notes-page-search-clear\"\n aria-label=\"Effacer la recherche\"\n (click)=\"clearSearch()\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n }\n </div>\n </div>\n\n @if (hasReleases()) {\n <div class=\"pt-release-notes-page-list\">\n @for (release of getDisplayedReleases(); track release.id) {\n <div [class]=\"getReleaseClasses(release)\">\n <div class=\"pt-release-notes-page-item-top\">\n <div class=\"pt-release-notes-page-item-icon-wrapper\">\n <div class=\"pt-release-notes-page-item-icon\">\n <i class=\"pi pi-sparkles\"></i>\n </div>\n </div>\n\n <div class=\"pt-release-notes-page-item-content\">\n <div class=\"pt-release-notes-page-version-row\">\n <span class=\"pt-release-notes-page-version\">\n v{{ release.version }}\n </span>\n\n <span class=\"pt-release-notes-page-item-title\">\n {{ release.title }}\n </span>\n </div>\n\n @if (release.summary) {\n <div class=\"pt-release-notes-page-summary\">\n {{ release.summary }}\n </div>\n }\n\n @if (release.date) {\n <div class=\"pt-release-notes-page-metadata\">\n <span>\n <i class=\"pi pi-calendar\"></i>\n\n {{ release.date | date: \"dd/MM/yyyy\" }}\n </span>\n </div>\n }\n\n @if (hasCounters(release)) {\n <div class=\"pt-release-notes-page-stats\">\n @if (hasNewItems(release)) {\n <span class=\"pt-release-notes-page-stat new\">\n <i class=\"pi pi-plus-circle\"></i>\n\n <strong>\n {{ getNewCount(release) }}\n </strong>\n\n {{ resolvedConfig.newLabel }}\n </span>\n }\n\n @if (hasImprovements(release)) {\n <span class=\"pt-release-notes-page-stat improvement\">\n <i class=\"pi pi-arrow-up-right\"></i>\n\n <strong>\n {{ getImprovementCount(release) }}\n </strong>\n\n {{ resolvedConfig.improvementLabel }}\n </span>\n }\n\n @if (hasBugFixes(release)) {\n <span class=\"pt-release-notes-page-stat bug-fix\">\n <i class=\"pi pi-wrench\"></i>\n\n <strong>\n {{ getBugFixCount(release) }}\n </strong>\n\n {{ resolvedConfig.bugFixLabel }}\n </span>\n }\n </div>\n }\n </div>\n\n @if (release.read !== true) {\n <span class=\"pt-release-notes-page-unread-indicator\"></span>\n }\n </div>\n\n @if (hasDetails(release) && isDetailsExpanded(release)) {\n <div class=\"pt-release-notes-page-details\">\n @for (detail of getDetails(release); track detail.id) {\n <button\n type=\"button\"\n class=\"pt-release-notes-page-detail\"\n [class.disabled]=\"detail.disabled\"\n [ngClass]=\"[\n getDetailClass(detail),\n detail.styleClass || '',\n ]\"\n [disabled]=\"detail.disabled\"\n (click)=\"onDetailClick(detail, $event)\"\n >\n <div class=\"pt-release-notes-page-detail-icon\">\n <i [ngClass]=\"getDetailIcon(detail)\"></i>\n </div>\n\n <div class=\"pt-release-notes-page-detail-content\">\n <div class=\"pt-release-notes-page-detail-type\">\n {{ getDetailTypeLabel(detail) }}\n </div>\n\n <div class=\"pt-release-notes-page-detail-title\">\n {{ detail.title }}\n </div>\n\n @if (detail.description) {\n <div class=\"pt-release-notes-page-detail-description\">\n {{ detail.description }}\n </div>\n }\n </div>\n\n @if (detail.link) {\n <i\n class=\"pi pi-arrow-right pt-release-notes-page-detail-link\"\n ></i>\n }\n </button>\n }\n </div>\n }\n\n @if (hasDetails(release)) {\n <div class=\"pt-release-notes-page-details-action\">\n <button\n type=\"button\"\n class=\"pt-release-notes-page-details-button\"\n [disabled]=\"release.disabled\"\n (click)=\"toggleDetails(release)\"\n >\n <span>\n {{ getDetailsButtonText(release) }}\n </span>\n\n <i\n class=\"pi\"\n [ngClass]=\"\n isDetailsExpanded(release)\n ? 'pi-chevron-up'\n : 'pi-chevron-down'\n \"\n ></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n } @else if (!loading) {\n <div class=\"pt-release-notes-page-empty\">\n <div class=\"pt-release-notes-page-empty-icon\">\n <i [class]=\"getEmptyIcon()\"></i>\n </div>\n\n <div class=\"pt-release-notes-page-empty-text\">\n @if (hasSearch()) {\n {{ getNoSearchResultText() }}\n } @else {\n {{ getEmptyText() }}\n }\n </div>\n </div>\n }\n\n @if (loading) {\n <div class=\"pt-release-notes-page-loading\">\n <i class=\"pi pi-spin pi-spinner\"></i>\n\n <span>\n {{ resolvedConfig.loadingText }}\n </span>\n </div>\n }\n\n @if (showPagination()) {\n <div class=\"pt-release-notes-page-pagination\">\n <p-paginator\n [first]=\"getFirst()\"\n [rows]=\"rows\"\n [totalRecords]=\"totalRecords\"\n [rowsPerPageOptions]=\"getRowsPerPageOptions()\"\n [showCurrentPageReport]=\"showCurrentPageReport()\"\n [currentPageReportTemplate]=\"getCurrentPageReportTemplate()\"\n (onPageChange)=\"onPageChange($event)\"\n ></p-paginator>\n </div>\n }\n </div>\n}\n", styles: [":host{display:block;width:100%}.pt-release-notes-page{position:relative;width:100%;background:var(--pt-release-notes-page-bg, #ffffff);border:1px solid var(--pt-release-notes-page-border, #e5e7eb);border-radius:14px;overflow:visible}.pt-release-notes-page-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;padding:1.25rem 1.5rem;border-bottom:1px solid var(--pt-release-notes-page-border, #e5e7eb)}.pt-release-notes-page-heading{display:flex;flex-direction:column;gap:.85rem}.pt-release-notes-page-title-row{display:flex;align-items:center;gap:.8rem}.pt-release-notes-page-title-icon{display:flex;align-items:center;justify-content:center;width:42px;height:42px;border-radius:50%;background:var(--pt-release-notes-page-title-icon-bg, #f3f0f8);color:var(--pt-release-notes-page-title-icon-color, #3f2564);font-size:1.15rem}.pt-release-notes-page-title{margin:0;color:var(--pt-release-notes-page-title-color, #1f2937);font-size:1.25rem;font-weight:700}.pt-release-notes-page-subtitle{margin-top:.2rem;color:var(--pt-release-notes-page-subtitle-color, #6b7280);font-size:.875rem}.pt-release-notes-page-counters{display:flex;align-items:center;flex-wrap:wrap;gap:.5rem}.pt-release-notes-page-counter{display:inline-flex;align-items:center;padding:.3rem .65rem;border-radius:999px;background:var(--pt-release-notes-page-counter-bg, #f3f4f6);color:var(--pt-release-notes-page-counter-color, #4b5563);font-size:.78rem;font-weight:600}.pt-release-notes-page-counter.unread{background:var(--pt-release-notes-page-unread-counter-bg, #f3f0f8);color:var(--pt-release-notes-page-unread-counter-color, #3f2564)}.pt-release-notes-page-counter.read{background:var(--pt-release-notes-page-read-counter-bg, #ecfdf5);color:var(--pt-release-notes-page-read-counter-color, #15803d)}.pt-release-notes-page-toolbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:1rem 1.5rem;border-bottom:1px solid var(--pt-release-notes-page-border, #e5e7eb)}.pt-release-notes-page-filters{display:flex;align-items:center;gap:.4rem}.pt-release-notes-page-filter{display:flex;align-items:center;gap:.45rem;padding:.5rem .85rem;border:1px solid var(--pt-release-notes-page-filter-border, #e5e7eb);border-radius:8px;background:var(--pt-release-notes-page-filter-bg, #ffffff);color:var(--pt-release-notes-page-filter-color, #4b5563);font-size:.82rem;font-weight:600;cursor:pointer}.pt-release-notes-page-filter:hover{background:#f9fafb}.pt-release-notes-page-filter.selected{border-color:var(--pt-release-notes-page-primary, #3f2564);background:var(--pt-release-notes-page-selected-bg, #f3f0f8);color:var(--pt-release-notes-page-primary, #3f2564)}.pt-release-notes-page-filter-count{min-width:20px;padding:.1rem .35rem;border-radius:999px;background:#0000000d;text-align:center;font-size:.72rem}.pt-release-notes-page-search{position:relative;display:flex;align-items:center;width:min(360px,100%)}.pt-release-notes-page-search>.pi-search{position:absolute;left:.85rem;color:#9ca3af}.pt-release-notes-page-search input{width:100%;padding:.65rem 2.5rem .65rem 2.4rem;border:1px solid #d1d5db;border-radius:8px;outline:none;font-size:.85rem}.pt-release-notes-page-search input:focus{border-color:var(--pt-release-notes-page-primary, #3f2564);box-shadow:0 0 0 2px #3f256414}.pt-release-notes-page-search-clear{position:absolute;right:.6rem;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:0;background:transparent;color:#6b7280;cursor:pointer}.pt-release-notes-page-list{width:100%}.pt-release-notes-page-item{position:relative;padding:1.1rem 1.5rem;border-bottom:1px solid var(--pt-release-notes-page-border, #e5e7eb);background:var(--pt-release-notes-page-item-bg, #ffffff);transition:background .15s ease}.pt-release-notes-page-item:last-child{border-bottom:0}.pt-release-notes-page-item:hover{background:var(--pt-release-notes-page-item-hover-bg, #f9fafb)}.pt-release-notes-page-item.unread{background:var(--pt-release-notes-page-unread-bg, #faf8fd)}.pt-release-notes-page-item.unread:hover{background:var(--pt-release-notes-page-unread-hover-bg, #f6f2fa)}.pt-release-notes-page-item.disabled{opacity:.55}.pt-release-notes-page-item-top{position:relative;display:flex;align-items:flex-start;gap:1rem}.pt-release-notes-page-item-icon-wrapper{flex:0 0 auto}.pt-release-notes-page-item-icon{display:flex;align-items:center;justify-content:center;width:42px;height:42px;border-radius:50%;background:var(--pt-release-notes-page-item-icon-bg, #f3f0f8);color:var(--pt-release-notes-page-primary, #3f2564);font-size:1rem}.pt-release-notes-page-item-content{flex:1 1 auto;min-width:0}.pt-release-notes-page-version-row{display:flex;align-items:center;flex-wrap:wrap;gap:.65rem}.pt-release-notes-page-version{display:inline-flex;align-items:center;padding:.25rem .55rem;border-radius:6px;background:var(--pt-release-notes-page-selected-bg, #f3f0f8);color:var(--pt-release-notes-page-primary, #3f2564);font-size:.78rem;font-weight:800}.pt-release-notes-page-item-title{color:var(--pt-release-notes-page-text-color, #1f2937);font-size:.9rem;font-weight:700}.pt-release-notes-page-item.unread .pt-release-notes-page-item-title{font-weight:700}.pt-release-notes-page-summary{margin-top:.45rem;color:var(--pt-release-notes-page-metadata-color, #6b7280);font-size:.85rem;line-height:1.5}.pt-release-notes-page-metadata{display:flex;align-items:center;flex-wrap:wrap;gap:1rem;margin-top:.5rem;color:var(--pt-release-notes-page-metadata-color, #6b7280);font-size:.78rem}.pt-release-notes-page-metadata span{display:inline-flex;align-items:center;gap:.35rem}.pt-release-notes-page-stats{display:flex;align-items:center;flex-wrap:wrap;gap:.45rem;margin-top:.8rem}.pt-release-notes-page-stat{display:inline-flex;align-items:center;gap:.35rem;padding:.3rem .6rem;border-radius:999px;font-size:.72rem;font-weight:600}.pt-release-notes-page-stat.new{background:#dcfce7;color:#15803d}.pt-release-notes-page-stat.improvement{background:#dbeafe;color:#1d4ed8}.pt-release-notes-page-stat.bug-fix{background:#fee2e2;color:#b91c1c}.pt-release-notes-page-unread-indicator{position:absolute;top:50%;right:-1rem;width:7px;height:7px;border-radius:50%;background:var(--pt-release-notes-page-unread-indicator, #3f2564);transform:translateY(-50%)}.pt-release-notes-page-details{display:flex;flex-direction:column;gap:.35rem;margin-top:1rem;margin-left:58px;padding-top:1rem;border-top:1px solid var(--pt-release-notes-page-border, #e5e7eb)}.pt-release-notes-page-detail{display:flex;align-items:flex-start;gap:.75rem;width:100%;padding:.7rem;border:0;border-radius:8px;background:transparent;color:inherit;text-align:left;cursor:pointer}.pt-release-notes-page-detail:hover:not(:disabled){background:#f9fafb}.pt-release-notes-page-detail.disabled{opacity:.55;cursor:default}.pt-release-notes-page-detail-icon{flex:0 0 auto;display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px}.pt-release-notes-page-detail.new .pt-release-notes-page-detail-icon{background:#dcfce7;color:#15803d}.pt-release-notes-page-detail.improvement .pt-release-notes-page-detail-icon{background:#dbeafe;color:#1d4ed8}.pt-release-notes-page-detail.bug-fix .pt-release-notes-page-detail-icon{background:#fee2e2;color:#b91c1c}.pt-release-notes-page-detail-content{flex:1;min-width:0}.pt-release-notes-page-detail-type{margin-bottom:.2rem;font-size:.68rem;font-weight:700;text-transform:uppercase}.pt-release-notes-page-detail.new .pt-release-notes-page-detail-type{color:#15803d}.pt-release-notes-page-detail.improvement .pt-release-notes-page-detail-type{color:#1d4ed8}.pt-release-notes-page-detail.bug-fix .pt-release-notes-page-detail-type{color:#b91c1c}.pt-release-notes-page-detail-title{color:#1f2937;font-size:.84rem;font-weight:700}.pt-release-notes-page-detail-description{margin-top:.25rem;color:#6b7280;font-size:.78rem;line-height:1.5}.pt-release-notes-page-detail-link{flex:0 0 auto;align-self:center;color:#6b7280;font-size:.72rem}.pt-release-notes-page-details-action{display:flex;justify-content:center;margin-top:.8rem;margin-left:58px}.pt-release-notes-page-details-button{display:inline-flex;align-items:center;justify-content:center;gap:.45rem;padding:.45rem .75rem;border:0;border-radius:7px;background:transparent;color:var(--pt-release-notes-page-primary, #3f2564);font-size:.78rem;font-weight:700;cursor:pointer}.pt-release-notes-page-details-button:hover:not(:disabled){background:var(--pt-release-notes-page-selected-bg, #f3f0f8)}.pt-release-notes-page-details-button:disabled{opacity:.5;cursor:default}.pt-release-notes-page-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:280px;padding:3rem;color:#6b7280;text-align:center}.pt-release-notes-page-empty-icon{display:flex;align-items:center;justify-content:center;width:64px;height:64px;margin-bottom:1rem;border-radius:50%;background:#f3f4f6;color:#9ca3af;font-size:1.6rem}.pt-release-notes-page-empty-text{max-width:450px;font-size:.9rem}.pt-release-notes-page-loading{display:flex;align-items:center;justify-content:center;gap:.5rem;min-height:100px;color:#6b7280;font-size:.85rem}.pt-release-notes-page-pagination{display:flex;align-items:center;justify-content:center;width:100%;padding:.75rem 1rem;box-sizing:border-box;border-top:1px solid var(--pt-release-notes-page-border, #e5e7eb);background:var(--pt-release-notes-page-pagination-bg, #ffffff)}.pt-release-notes-page-pagination ::ng-deep .p-paginator{width:100%;border:0;background:transparent}@media(max-width:768px){.pt-release-notes-page-header,.pt-release-notes-page-toolbar{flex-direction:column;align-items:stretch}.pt-release-notes-page-filters{overflow-x:auto}.pt-release-notes-page-search{width:100%}.pt-release-notes-page-item{padding:1rem 1.1rem}.pt-release-notes-page-details,.pt-release-notes-page-details-action{margin-left:0}.pt-release-notes-page-unread-indicator{right:0}}\n"] }]
12977
+ args: [{ selector: 'pt-release-notes-page', standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (resolvedConfig.visible) {\n <div class=\"pt-release-notes-page\">\n <div class=\"pt-release-notes-page-header\">\n <div class=\"pt-release-notes-page-heading\">\n <div class=\"pt-release-notes-page-title-row\">\n <div class=\"pt-release-notes-page-title-icon\">\n <i [class]=\"resolvedConfig.icon\"></i>\n </div>\n\n <div>\n <h2 class=\"pt-release-notes-page-title\">\n {{ getTitle() }}\n </h2>\n\n <div class=\"pt-release-notes-page-subtitle\">\n {{ getSubtitle() }}\n </div>\n </div>\n </div>\n\n @if (showCounters()) {\n <div class=\"pt-release-notes-page-counters\">\n <span class=\"pt-release-notes-page-counter\">\n {{ getTotalCount() }}\n version(s)\n </span>\n\n @if (getUnreadCount() > 0) {\n <span class=\"pt-release-notes-page-counter unread\">\n {{ getUnreadCount() }}\n non lue(s)\n </span>\n }\n\n @if (getReadCount() > 0) {\n <span class=\"pt-release-notes-page-counter read\">\n {{ getReadCount() }}\n lue(s)\n </span>\n }\n </div>\n }\n </div>\n </div>\n\n <div class=\"pt-release-notes-page-toolbar\">\n <div class=\"pt-release-notes-page-toolbar-left\">\n <div class=\"pt-release-notes-page-filters\">\n <button\n type=\"button\"\n class=\"pt-release-notes-page-filter\"\n [class.selected]=\"isFilterSelected('ALL')\"\n (click)=\"selectFilter('ALL')\"\n >\n {{ getAllLabel() }}\n\n <span class=\"pt-release-notes-page-filter-count\">\n {{ getTotalCount() }}\n </span>\n </button>\n\n <button\n type=\"button\"\n class=\"pt-release-notes-page-filter\"\n [class.selected]=\"isFilterSelected('UNREAD')\"\n (click)=\"selectFilter('UNREAD')\"\n >\n {{ getUnreadLabel() }}\n\n <span class=\"pt-release-notes-page-filter-count\">\n {{ getUnreadCount() }}\n </span>\n </button>\n\n <button\n type=\"button\"\n class=\"pt-release-notes-page-filter\"\n [class.selected]=\"isFilterSelected('READ')\"\n (click)=\"selectFilter('READ')\"\n >\n {{ getReadLabel() }}\n\n <span class=\"pt-release-notes-page-filter-count\">\n {{ getReadCount() }}\n </span>\n </button>\n </div>\n\n @if (hasExpandableReleases()) {\n <button\n type=\"button\"\n class=\"pt-release-notes-page-expand-all\"\n [class.expanded]=\"areAllDetailsExpanded()\"\n (click)=\"toggleAllDetails()\"\n >\n <i\n class=\"pi\"\n [ngClass]=\"\n areAllDetailsExpanded()\n ? 'pi-angle-double-up'\n : 'pi-angle-double-down'\n \"\n ></i>\n\n <span>\n {{ getToggleAllDetailsText() }}\n </span>\n </button>\n }\n </div>\n\n <div class=\"pt-release-notes-page-search\">\n <i class=\"pi pi-search\"></i>\n\n <input\n type=\"text\"\n [value]=\"searchText\"\n [placeholder]=\"getSearchPlaceholder()\"\n (input)=\"onSearch($any($event.target).value)\"\n />\n\n @if (hasSearch()) {\n <button\n type=\"button\"\n class=\"pt-release-notes-page-search-clear\"\n aria-label=\"Effacer la recherche\"\n (click)=\"clearSearch()\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n }\n </div>\n </div>\n\n @if (hasReleases()) {\n <div class=\"pt-release-notes-page-list\">\n @for (release of getDisplayedReleases(); track release.id) {\n <div [class]=\"getReleaseClasses(release)\">\n <div class=\"pt-release-notes-page-item-top\">\n <div class=\"pt-release-notes-page-item-icon-wrapper\">\n <div class=\"pt-release-notes-page-item-icon\">\n <i class=\"pi pi-sparkles\"></i>\n </div>\n </div>\n\n <div class=\"pt-release-notes-page-item-content\">\n <div class=\"pt-release-notes-page-version-row\">\n <span class=\"pt-release-notes-page-version\">\n v{{ release.version }}\n </span>\n\n <span class=\"pt-release-notes-page-item-title\">\n {{ release.title }}\n </span>\n </div>\n\n @if (release.summary) {\n <div class=\"pt-release-notes-page-summary\">\n {{ release.summary }}\n </div>\n }\n\n @if (release.date) {\n <div class=\"pt-release-notes-page-metadata\">\n <span>\n <i class=\"pi pi-calendar\"></i>\n\n {{ release.date | date: \"dd/MM/yyyy\" }}\n </span>\n </div>\n }\n\n @if (hasCounters(release)) {\n <div class=\"pt-release-notes-page-stats\">\n @if (hasNewItems(release)) {\n <span class=\"pt-release-notes-page-stat new\">\n <i class=\"pi pi-plus-circle\"></i>\n\n <strong>\n {{ getNewCount(release) }}\n </strong>\n\n {{ resolvedConfig.newLabel }}\n </span>\n }\n\n @if (hasImprovements(release)) {\n <span class=\"pt-release-notes-page-stat improvement\">\n <i class=\"pi pi-arrow-up-right\"></i>\n\n <strong>\n {{ getImprovementCount(release) }}\n </strong>\n\n {{ resolvedConfig.improvementLabel }}\n </span>\n }\n\n @if (hasBugFixes(release)) {\n <span class=\"pt-release-notes-page-stat bug-fix\">\n <i class=\"pi pi-wrench\"></i>\n\n <strong>\n {{ getBugFixCount(release) }}\n </strong>\n\n {{ resolvedConfig.bugFixLabel }}\n </span>\n }\n </div>\n }\n </div>\n\n @if (release.read !== true) {\n <span class=\"pt-release-notes-page-unread-indicator\"></span>\n }\n </div>\n\n @if (hasDetails(release) && isDetailsExpanded(release)) {\n <div class=\"pt-release-notes-page-details\">\n @if (hasDetailsByType(release, \"NEW\")) {\n <section class=\"pt-release-notes-page-detail-section new\">\n <div class=\"pt-release-notes-page-detail-section-header\">\n <div class=\"pt-release-notes-page-detail-section-title\">\n <span class=\"pt-release-notes-page-detail-section-icon\">\n <i class=\"pi pi-plus-circle\"></i>\n </span>\n\n <span>\n {{ resolvedConfig.newLabel }}\n </span>\n </div>\n\n <span class=\"pt-release-notes-page-detail-section-count\">\n {{ getDetailsByType(release, \"NEW\").length }}\n </span>\n </div>\n\n <div class=\"pt-release-notes-page-detail-section-content\">\n @for (\n detail of getDetailsByType(release, \"NEW\");\n track detail.id\n ) {\n <button\n type=\"button\"\n class=\"pt-release-notes-page-detail new\"\n [class.disabled]=\"detail.disabled\"\n [ngClass]=\"detail.styleClass || ''\"\n [disabled]=\"detail.disabled\"\n (click)=\"onDetailClick(detail, $event)\"\n >\n <div class=\"pt-release-notes-page-detail-icon\">\n <i [ngClass]=\"getDetailIcon(detail)\"></i>\n </div>\n\n <div class=\"pt-release-notes-page-detail-content\">\n <div class=\"pt-release-notes-page-detail-title\">\n {{ detail.title }}\n </div>\n\n @if (detail.description) {\n <div\n class=\"pt-release-notes-page-detail-description\"\n >\n {{ detail.description }}\n </div>\n }\n </div>\n\n @if (detail.link) {\n <i\n class=\"pi pi-arrow-right pt-release-notes-page-detail-link\"\n ></i>\n }\n </button>\n }\n </div>\n </section>\n }\n\n @if (hasDetailsByType(release, \"IMPROVEMENT\")) {\n <section\n class=\"pt-release-notes-page-detail-section improvement\"\n >\n <div class=\"pt-release-notes-page-detail-section-header\">\n <div class=\"pt-release-notes-page-detail-section-title\">\n <span class=\"pt-release-notes-page-detail-section-icon\">\n <i class=\"pi pi-arrow-up-right\"></i>\n </span>\n\n <span>\n {{ resolvedConfig.improvementLabel }}\n </span>\n </div>\n\n <span class=\"pt-release-notes-page-detail-section-count\">\n {{ getDetailsByType(release, \"IMPROVEMENT\").length }}\n </span>\n </div>\n\n <div class=\"pt-release-notes-page-detail-section-content\">\n @for (\n detail of getDetailsByType(release, \"IMPROVEMENT\");\n track detail.id\n ) {\n <button\n type=\"button\"\n class=\"pt-release-notes-page-detail improvement\"\n [class.disabled]=\"detail.disabled\"\n [ngClass]=\"detail.styleClass || ''\"\n [disabled]=\"detail.disabled\"\n (click)=\"onDetailClick(detail, $event)\"\n >\n <div class=\"pt-release-notes-page-detail-icon\">\n <i [ngClass]=\"getDetailIcon(detail)\"></i>\n </div>\n\n <div class=\"pt-release-notes-page-detail-content\">\n <div class=\"pt-release-notes-page-detail-title\">\n {{ detail.title }}\n </div>\n\n @if (detail.description) {\n <div\n class=\"pt-release-notes-page-detail-description\"\n >\n {{ detail.description }}\n </div>\n }\n </div>\n\n @if (detail.link) {\n <i\n class=\"pi pi-arrow-right pt-release-notes-page-detail-link\"\n ></i>\n }\n </button>\n }\n </div>\n </section>\n }\n\n @if (hasDetailsByType(release, \"BUG_FIX\")) {\n <section class=\"pt-release-notes-page-detail-section bug-fix\">\n <div class=\"pt-release-notes-page-detail-section-header\">\n <div class=\"pt-release-notes-page-detail-section-title\">\n <span class=\"pt-release-notes-page-detail-section-icon\">\n <i class=\"pi pi-wrench\"></i>\n </span>\n\n <span>\n {{ resolvedConfig.bugFixLabel }}\n </span>\n </div>\n\n <span class=\"pt-release-notes-page-detail-section-count\">\n {{ getDetailsByType(release, \"BUG_FIX\").length }}\n </span>\n </div>\n\n <div class=\"pt-release-notes-page-detail-section-content\">\n @for (\n detail of getDetailsByType(release, \"BUG_FIX\");\n track detail.id\n ) {\n <button\n type=\"button\"\n class=\"pt-release-notes-page-detail bug-fix\"\n [class.disabled]=\"detail.disabled\"\n [ngClass]=\"detail.styleClass || ''\"\n [disabled]=\"detail.disabled\"\n (click)=\"onDetailClick(detail, $event)\"\n >\n <div class=\"pt-release-notes-page-detail-icon\">\n <i [ngClass]=\"getDetailIcon(detail)\"></i>\n </div>\n\n <div class=\"pt-release-notes-page-detail-content\">\n <div class=\"pt-release-notes-page-detail-title\">\n {{ detail.title }}\n </div>\n\n @if (detail.description) {\n <div\n class=\"pt-release-notes-page-detail-description\"\n >\n {{ detail.description }}\n </div>\n }\n </div>\n\n @if (detail.link) {\n <i\n class=\"pi pi-arrow-right pt-release-notes-page-detail-link\"\n ></i>\n }\n </button>\n }\n </div>\n </section>\n }\n </div>\n }\n\n @if (hasDetails(release)) {\n <div class=\"pt-release-notes-page-details-action\">\n <button\n type=\"button\"\n class=\"pt-release-notes-page-details-button\"\n [disabled]=\"release.disabled\"\n (click)=\"toggleDetails(release)\"\n >\n <span>\n {{ getDetailsButtonText(release) }}\n </span>\n\n <i\n class=\"pi\"\n [ngClass]=\"\n isDetailsExpanded(release)\n ? 'pi-chevron-up'\n : 'pi-chevron-down'\n \"\n ></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n } @else if (!loading) {\n <div class=\"pt-release-notes-page-empty\">\n <div class=\"pt-release-notes-page-empty-icon\">\n <i [class]=\"getEmptyIcon()\"></i>\n </div>\n\n <div class=\"pt-release-notes-page-empty-text\">\n @if (hasSearch()) {\n {{ getNoSearchResultText() }}\n } @else {\n {{ getEmptyText() }}\n }\n </div>\n </div>\n }\n\n @if (loading) {\n <div class=\"pt-release-notes-page-loading\">\n <i class=\"pi pi-spin pi-spinner\"></i>\n\n <span>\n {{ resolvedConfig.loadingText }}\n </span>\n </div>\n }\n\n @if (showPagination()) {\n <div class=\"pt-release-notes-page-pagination\">\n <p-paginator\n [first]=\"getFirst()\"\n [rows]=\"rows\"\n [totalRecords]=\"totalRecords\"\n [rowsPerPageOptions]=\"getRowsPerPageOptions()\"\n [showCurrentPageReport]=\"showCurrentPageReport()\"\n [currentPageReportTemplate]=\"getCurrentPageReportTemplate()\"\n (onPageChange)=\"onPageChange($event)\"\n ></p-paginator>\n </div>\n }\n </div>\n}\n", styles: [":host{display:block;width:100%}.pt-release-notes-page{position:relative;width:100%;background:var(--pt-release-notes-page-bg, #ffffff);border:1px solid var(--pt-release-notes-page-border, #e5e7eb);border-radius:14px;overflow:visible}.pt-release-notes-page-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;padding:1.25rem 1.5rem;border-bottom:1px solid var(--pt-release-notes-page-border, #e5e7eb)}.pt-release-notes-page-heading{display:flex;flex-direction:column;gap:.85rem}.pt-release-notes-page-title-row{display:flex;align-items:center;gap:.8rem}.pt-release-notes-page-title-icon{display:flex;align-items:center;justify-content:center;width:42px;height:42px;border-radius:50%;background:var(--pt-release-notes-page-title-icon-bg, #f3f0f8);color:var(--pt-release-notes-page-title-icon-color, #3f2564);font-size:1.15rem}.pt-release-notes-page-title{margin:0;color:var(--pt-release-notes-page-title-color, #1f2937);font-size:1.25rem;font-weight:700}.pt-release-notes-page-subtitle{margin-top:.2rem;color:var(--pt-release-notes-page-subtitle-color, #6b7280);font-size:.875rem}.pt-release-notes-page-counters{display:flex;align-items:center;flex-wrap:wrap;gap:.5rem}.pt-release-notes-page-counter{display:inline-flex;align-items:center;padding:.3rem .65rem;border-radius:999px;background:var(--pt-release-notes-page-counter-bg, #f3f4f6);color:var(--pt-release-notes-page-counter-color, #4b5563);font-size:.78rem;font-weight:600}.pt-release-notes-page-counter.unread{background:var(--pt-release-notes-page-unread-counter-bg, #f3f0f8);color:var(--pt-release-notes-page-unread-counter-color, #3f2564)}.pt-release-notes-page-counter.read{background:var(--pt-release-notes-page-read-counter-bg, #ecfdf5);color:var(--pt-release-notes-page-read-counter-color, #15803d)}.pt-release-notes-page-toolbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:1rem 1.5rem;border-bottom:1px solid var(--pt-release-notes-page-border, #e5e7eb)}.pt-release-notes-page-toolbar-left{display:flex;align-items:center;flex-wrap:wrap;gap:.75rem;min-width:0}.pt-release-notes-page-filters{display:flex;align-items:center;gap:.4rem}.pt-release-notes-page-filter{display:flex;align-items:center;gap:.45rem;padding:.5rem .85rem;border:1px solid var(--pt-release-notes-page-filter-border, #e5e7eb);border-radius:8px;background:var(--pt-release-notes-page-filter-bg, #ffffff);color:var(--pt-release-notes-page-filter-color, #4b5563);font-size:.82rem;font-weight:600;cursor:pointer}.pt-release-notes-page-filter:hover{background:#f9fafb}.pt-release-notes-page-filter.selected{border-color:var(--pt-release-notes-page-primary, #3f2564);background:var(--pt-release-notes-page-selected-bg, #f3f0f8);color:var(--pt-release-notes-page-primary, #3f2564)}.pt-release-notes-page-filter-count{min-width:20px;padding:.1rem .35rem;border-radius:999px;background:#0000000d;text-align:center;font-size:.72rem}.pt-release-notes-page-expand-all{display:inline-flex;align-items:center;justify-content:center;gap:.45rem;min-height:34px;padding:.45rem .75rem;border:1px solid var(--pt-release-notes-page-filter-border, #e5e7eb);border-radius:8px;background:#fff;color:var(--pt-release-notes-page-primary, #3f2564);font-size:.78rem;font-weight:700;cursor:pointer;transition:background .15s ease,border-color .15s ease}.pt-release-notes-page-expand-all:hover,.pt-release-notes-page-expand-all.expanded{border-color:var(--pt-release-notes-page-primary, #3f2564);background:var(--pt-release-notes-page-selected-bg, #f3f0f8)}.pt-release-notes-page-search{position:relative;display:flex;align-items:center;width:min(360px,100%)}.pt-release-notes-page-search>.pi-search{position:absolute;left:.85rem;color:#9ca3af}.pt-release-notes-page-search input{width:100%;padding:.65rem 2.5rem .65rem 2.4rem;border:1px solid #d1d5db;border-radius:8px;outline:none;font-size:.85rem}.pt-release-notes-page-search input:focus{border-color:var(--pt-release-notes-page-primary, #3f2564);box-shadow:0 0 0 2px #3f256414}.pt-release-notes-page-search-clear{position:absolute;right:.6rem;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:0;background:transparent;color:#6b7280;cursor:pointer}.pt-release-notes-page-list{width:100%}.pt-release-notes-page-item{position:relative;padding:1.1rem 1.5rem;border-bottom:1px solid var(--pt-release-notes-page-border, #e5e7eb);background:var(--pt-release-notes-page-item-bg, #ffffff);transition:background .15s ease}.pt-release-notes-page-item:last-child{border-bottom:0}.pt-release-notes-page-item:hover{background:var(--pt-release-notes-page-item-hover-bg, #f9fafb)}.pt-release-notes-page-item.unread{background:var(--pt-release-notes-page-unread-bg, #faf8fd)}.pt-release-notes-page-item.unread:hover{background:var(--pt-release-notes-page-unread-hover-bg, #f6f2fa)}.pt-release-notes-page-item.disabled{opacity:.55}.pt-release-notes-page-item-top{position:relative;display:flex;align-items:flex-start;gap:1rem}.pt-release-notes-page-item-icon-wrapper{flex:0 0 auto}.pt-release-notes-page-item-icon{display:flex;align-items:center;justify-content:center;width:42px;height:42px;border-radius:50%;background:var(--pt-release-notes-page-item-icon-bg, #f3f0f8);color:var(--pt-release-notes-page-primary, #3f2564);font-size:1rem}.pt-release-notes-page-item-content{flex:1 1 auto;min-width:0}.pt-release-notes-page-version-row{display:flex;align-items:center;flex-wrap:wrap;gap:.65rem}.pt-release-notes-page-version{display:inline-flex;align-items:center;padding:.25rem .55rem;border-radius:6px;background:var(--pt-release-notes-page-selected-bg, #f3f0f8);color:var(--pt-release-notes-page-primary, #3f2564);font-size:.78rem;font-weight:800}.pt-release-notes-page-item-title{color:var(--pt-release-notes-page-text-color, #1f2937);font-size:.9rem;font-weight:700}.pt-release-notes-page-summary{margin-top:.45rem;color:var(--pt-release-notes-page-metadata-color, #6b7280);font-size:.85rem;line-height:1.5}.pt-release-notes-page-metadata{display:flex;align-items:center;flex-wrap:wrap;gap:1rem;margin-top:.5rem;color:var(--pt-release-notes-page-metadata-color, #6b7280);font-size:.78rem}.pt-release-notes-page-metadata span{display:inline-flex;align-items:center;gap:.35rem}.pt-release-notes-page-stats{display:flex;align-items:center;flex-wrap:wrap;gap:.45rem;margin-top:.8rem}.pt-release-notes-page-stat{display:inline-flex;align-items:center;gap:.35rem;padding:.3rem .6rem;border-radius:999px;font-size:.72rem;font-weight:600}.pt-release-notes-page-stat.new{background:#dcfce7;color:#15803d}.pt-release-notes-page-stat.improvement{background:#dbeafe;color:#1d4ed8}.pt-release-notes-page-stat.bug-fix{background:#fee2e2;color:#b91c1c}.pt-release-notes-page-unread-indicator{position:absolute;top:50%;right:-1rem;width:7px;height:7px;border-radius:50%;background:var(--pt-release-notes-page-unread-indicator, #3f2564);transform:translateY(-50%)}.pt-release-notes-page-details{display:flex;flex-direction:column;gap:1rem;margin-top:1rem;margin-left:58px;padding-top:1rem;border-top:1px solid var(--pt-release-notes-page-border, #e5e7eb)}.pt-release-notes-page-detail-section{overflow:hidden;border:1px solid #e5e7eb;border-radius:10px;background:#fff}.pt-release-notes-page-detail-section-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.65rem .85rem;border-bottom:1px solid #e5e7eb}.pt-release-notes-page-detail-section-title{display:flex;align-items:center;gap:.55rem;font-size:.78rem;font-weight:800;text-transform:uppercase;letter-spacing:.015em}.pt-release-notes-page-detail-section-icon{display:inline-flex;align-items:center;justify-content:center;width:27px;height:27px;border-radius:7px}.pt-release-notes-page-detail-section-count{display:inline-flex;align-items:center;justify-content:center;min-width:24px;height:24px;padding:0 .4rem;border-radius:999px;font-size:.7rem;font-weight:800}.pt-release-notes-page-detail-section.new .pt-release-notes-page-detail-section-header{background:#f0fdf4}.pt-release-notes-page-detail-section.new .pt-release-notes-page-detail-section-title{color:#15803d}.pt-release-notes-page-detail-section.new .pt-release-notes-page-detail-section-icon,.pt-release-notes-page-detail-section.new .pt-release-notes-page-detail-section-count{background:#dcfce7;color:#15803d}.pt-release-notes-page-detail-section.improvement .pt-release-notes-page-detail-section-header{background:#eff6ff}.pt-release-notes-page-detail-section.improvement .pt-release-notes-page-detail-section-title{color:#1d4ed8}.pt-release-notes-page-detail-section.improvement .pt-release-notes-page-detail-section-icon,.pt-release-notes-page-detail-section.improvement .pt-release-notes-page-detail-section-count{background:#dbeafe;color:#1d4ed8}.pt-release-notes-page-detail-section.bug-fix .pt-release-notes-page-detail-section-header{background:#fef2f2}.pt-release-notes-page-detail-section.bug-fix .pt-release-notes-page-detail-section-title{color:#b91c1c}.pt-release-notes-page-detail-section.bug-fix .pt-release-notes-page-detail-section-icon,.pt-release-notes-page-detail-section.bug-fix .pt-release-notes-page-detail-section-count{background:#fee2e2;color:#b91c1c}.pt-release-notes-page-detail-section-content{display:flex;flex-direction:column;padding:.35rem}.pt-release-notes-page-detail{display:flex;align-items:flex-start;gap:.75rem;width:100%;padding:.7rem;border:0;border-radius:8px;background:transparent;color:inherit;text-align:left;cursor:pointer}.pt-release-notes-page-detail:hover:not(:disabled){background:#f9fafb}.pt-release-notes-page-detail.disabled{opacity:.55;cursor:default}.pt-release-notes-page-detail-icon{flex:0 0 auto;display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px}.pt-release-notes-page-detail.new .pt-release-notes-page-detail-icon{background:#dcfce7;color:#15803d}.pt-release-notes-page-detail.improvement .pt-release-notes-page-detail-icon{background:#dbeafe;color:#1d4ed8}.pt-release-notes-page-detail.bug-fix .pt-release-notes-page-detail-icon{background:#fee2e2;color:#b91c1c}.pt-release-notes-page-detail-content{flex:1;min-width:0}.pt-release-notes-page-detail-title{color:#1f2937;font-size:.84rem;font-weight:700}.pt-release-notes-page-detail-description{margin-top:.25rem;color:#6b7280;font-size:.78rem;line-height:1.5}.pt-release-notes-page-detail-link{flex:0 0 auto;align-self:center;color:#6b7280;font-size:.72rem}.pt-release-notes-page-details-action{display:flex;justify-content:center;margin-top:.8rem;margin-left:58px}.pt-release-notes-page-details-button{display:inline-flex;align-items:center;justify-content:center;gap:.45rem;padding:.45rem .75rem;border:0;border-radius:7px;background:transparent;color:var(--pt-release-notes-page-primary, #3f2564);font-size:.78rem;font-weight:700;cursor:pointer}.pt-release-notes-page-details-button:hover:not(:disabled){background:var(--pt-release-notes-page-selected-bg, #f3f0f8)}.pt-release-notes-page-details-button:disabled{opacity:.5;cursor:default}.pt-release-notes-page-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:280px;padding:3rem;color:#6b7280;text-align:center}.pt-release-notes-page-empty-icon{display:flex;align-items:center;justify-content:center;width:64px;height:64px;margin-bottom:1rem;border-radius:50%;background:#f3f4f6;color:#9ca3af;font-size:1.6rem}.pt-release-notes-page-empty-text{max-width:450px;font-size:.9rem}.pt-release-notes-page-loading{display:flex;align-items:center;justify-content:center;gap:.5rem;min-height:100px;color:#6b7280;font-size:.85rem}.pt-release-notes-page-pagination{display:flex;align-items:center;justify-content:center;width:100%;padding:.75rem 1rem;box-sizing:border-box;border-top:1px solid var(--pt-release-notes-page-border, #e5e7eb);background:var(--pt-release-notes-page-pagination-bg, #ffffff)}.pt-release-notes-page-pagination ::ng-deep .p-paginator{width:100%;border:0;background:transparent}@media(max-width:768px){.pt-release-notes-page-header,.pt-release-notes-page-toolbar,.pt-release-notes-page-toolbar-left{flex-direction:column;align-items:stretch}.pt-release-notes-page-filters{overflow-x:auto}.pt-release-notes-page-expand-all{align-self:flex-start}.pt-release-notes-page-search{width:100%}.pt-release-notes-page-item{padding:1rem 1.1rem}.pt-release-notes-page-details,.pt-release-notes-page-details-action{margin-left:0}.pt-release-notes-page-unread-indicator{right:0}}\n"] }]
12885
12978
  }], ctorParameters: () => [], propDecorators: { releases: [{
12886
12979
  type: Input
12887
12980
  }], loading: [{
@@ -12898,6 +12991,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
12898
12991
  type: Input
12899
12992
  }], rows: [{
12900
12993
  type: Input
12994
+ }], rowsPerPageOptions: [{
12995
+ type: Input
12901
12996
  }], config: [{
12902
12997
  type: Input
12903
12998
  }], queryChange: [{