snap-report-viewer 0.1.0

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.
Files changed (76) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/components/chart-renderer/chart-renderer.component.mjs +75 -0
  3. package/esm2022/lib/components/complex-table-renderer/complex-table-renderer.component.mjs +155 -0
  4. package/esm2022/lib/components/component-renderer/component-renderer.component.mjs +158 -0
  5. package/esm2022/lib/components/container-renderer/container-renderer.component.mjs +53 -0
  6. package/esm2022/lib/components/image-renderer/image-renderer.component.mjs +67 -0
  7. package/esm2022/lib/components/line-renderer/line-renderer.component.mjs +94 -0
  8. package/esm2022/lib/components/list-renderer/list-renderer.component.mjs +96 -0
  9. package/esm2022/lib/components/qrcode-renderer/qrcode-renderer.component.mjs +67 -0
  10. package/esm2022/lib/components/shape-renderer/shape-renderer.component.mjs +133 -0
  11. package/esm2022/lib/components/table-renderer/table-renderer.component.mjs +148 -0
  12. package/esm2022/lib/components/text-renderer/text-renderer.component.mjs +33 -0
  13. package/esm2022/lib/constants/page-sizes.mjs +3 -0
  14. package/esm2022/lib/constants/report-tokens.mjs +21 -0
  15. package/esm2022/lib/layout/report-band.component.mjs +33 -0
  16. package/esm2022/lib/layout/report-page.component.mjs +159 -0
  17. package/esm2022/lib/models/component.model.mjs +3 -0
  18. package/esm2022/lib/models/report-template.model.mjs +19 -0
  19. package/esm2022/lib/page-container/page-container.component.mjs +248 -0
  20. package/esm2022/lib/report-viewer.component.mjs +393 -0
  21. package/esm2022/lib/services/chart-options-builder.service.mjs +749 -0
  22. package/esm2022/lib/services/data-resolver.service.mjs +385 -0
  23. package/esm2022/lib/services/export.service.mjs +82 -0
  24. package/esm2022/lib/services/formatting.service.mjs +59 -0
  25. package/esm2022/lib/services/print.service.mjs +133 -0
  26. package/esm2022/lib/services/search.service.mjs +117 -0
  27. package/esm2022/lib/services/style-mapper.service.mjs +247 -0
  28. package/esm2022/lib/services/template-normalizer.service.mjs +213 -0
  29. package/esm2022/lib/services/template-validator.service.mjs +293 -0
  30. package/esm2022/lib/services/token-resolver.service.mjs +14 -0
  31. package/esm2022/lib/services/viewer-state.service.mjs +155 -0
  32. package/esm2022/lib/sidebar/sidebar-container.component.mjs +86 -0
  33. package/esm2022/lib/sidebar/thumbnail-sidebar.component.mjs +110 -0
  34. package/esm2022/lib/sidebar/toc-sidebar.component.mjs +155 -0
  35. package/esm2022/lib/toolbar/viewer-toolbar.component.mjs +486 -0
  36. package/esm2022/public-api.mjs +43 -0
  37. package/esm2022/snap-report-viewer.mjs +5 -0
  38. package/fesm2022/snap-report-viewer.mjs +5110 -0
  39. package/fesm2022/snap-report-viewer.mjs.map +1 -0
  40. package/index.d.ts +5 -0
  41. package/lib/components/chart-renderer/chart-renderer.component.d.ts +14 -0
  42. package/lib/components/complex-table-renderer/complex-table-renderer.component.d.ts +17 -0
  43. package/lib/components/component-renderer/component-renderer.component.d.ts +14 -0
  44. package/lib/components/container-renderer/container-renderer.component.d.ts +11 -0
  45. package/lib/components/image-renderer/image-renderer.component.d.ts +14 -0
  46. package/lib/components/line-renderer/line-renderer.component.d.ts +10 -0
  47. package/lib/components/list-renderer/list-renderer.component.d.ts +16 -0
  48. package/lib/components/qrcode-renderer/qrcode-renderer.component.d.ts +16 -0
  49. package/lib/components/shape-renderer/shape-renderer.component.d.ts +11 -0
  50. package/lib/components/table-renderer/table-renderer.component.d.ts +20 -0
  51. package/lib/components/text-renderer/text-renderer.component.d.ts +13 -0
  52. package/lib/constants/page-sizes.d.ts +2 -0
  53. package/lib/constants/report-tokens.d.ts +8 -0
  54. package/lib/layout/report-band.component.d.ts +10 -0
  55. package/lib/layout/report-page.component.d.ts +21 -0
  56. package/lib/models/component.model.d.ts +315 -0
  57. package/lib/models/report-template.model.d.ts +122 -0
  58. package/lib/page-container/page-container.component.d.ts +29 -0
  59. package/lib/report-viewer.component.d.ts +51 -0
  60. package/lib/services/chart-options-builder.service.d.ts +31 -0
  61. package/lib/services/data-resolver.service.d.ts +27 -0
  62. package/lib/services/export.service.d.ts +11 -0
  63. package/lib/services/formatting.service.d.ts +10 -0
  64. package/lib/services/print.service.d.ts +12 -0
  65. package/lib/services/search.service.d.ts +13 -0
  66. package/lib/services/style-mapper.service.d.ts +14 -0
  67. package/lib/services/template-normalizer.service.d.ts +24 -0
  68. package/lib/services/template-validator.service.d.ts +19 -0
  69. package/lib/services/token-resolver.service.d.ts +6 -0
  70. package/lib/services/viewer-state.service.d.ts +49 -0
  71. package/lib/sidebar/sidebar-container.component.d.ts +8 -0
  72. package/lib/sidebar/thumbnail-sidebar.component.d.ts +15 -0
  73. package/lib/sidebar/toc-sidebar.component.d.ts +17 -0
  74. package/lib/toolbar/viewer-toolbar.component.d.ts +17 -0
  75. package/package.json +43 -0
  76. package/public-api.d.ts +35 -0
@@ -0,0 +1,155 @@
1
+ import { Injectable, signal, computed } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class ViewerStateService {
4
+ constructor() {
5
+ // Pagination
6
+ this.currentPage = signal(1);
7
+ this.totalPages = signal(1);
8
+ // Zoom
9
+ this.zoom = signal(100);
10
+ this.fitMode = signal('none');
11
+ // View modes
12
+ this.viewMode = signal('single');
13
+ this.isFullScreen = signal(false);
14
+ // Sidebars
15
+ this.tocSidebarOpen = signal(false);
16
+ this.thumbnailSidebarOpen = signal(false);
17
+ // Search
18
+ this.searchQuery = signal('');
19
+ this.searchMatches = signal([]);
20
+ this.currentMatchIndex = signal(-1);
21
+ this.searchOpen = signal(false);
22
+ // Theme
23
+ this.ribbonTheme = signal('light');
24
+ // Computed
25
+ this.pageDisplay = computed(() => `${this.currentPage()} of ${this.totalPages()}`);
26
+ this.zoomDisplay = computed(() => `${this.zoom()}%`);
27
+ this.matchDisplay = computed(() => {
28
+ const matches = this.searchMatches();
29
+ const idx = this.currentMatchIndex();
30
+ if (matches.length === 0)
31
+ return 'No matches';
32
+ return `${idx + 1} of ${matches.length}`;
33
+ });
34
+ this.isFirstPage = computed(() => this.currentPage() <= 1);
35
+ this.isLastPage = computed(() => this.currentPage() >= this.totalPages());
36
+ this.hasSidebarOpen = computed(() => this.tocSidebarOpen() || this.thumbnailSidebarOpen());
37
+ this.isDarkTheme = computed(() => this.ribbonTheme() === 'dark');
38
+ }
39
+ // Navigation
40
+ goToPage(page) {
41
+ const clamped = Math.max(1, Math.min(page, this.totalPages()));
42
+ this.currentPage.set(clamped);
43
+ }
44
+ nextPage() {
45
+ if (!this.isLastPage()) {
46
+ this.currentPage.update(p => p + 1);
47
+ }
48
+ }
49
+ previousPage() {
50
+ if (!this.isFirstPage()) {
51
+ this.currentPage.update(p => p - 1);
52
+ }
53
+ }
54
+ firstPage() {
55
+ this.currentPage.set(1);
56
+ }
57
+ lastPage() {
58
+ this.currentPage.set(this.totalPages());
59
+ }
60
+ // Zoom
61
+ setZoom(level) {
62
+ this.zoom.set(Math.max(10, Math.min(400, level)));
63
+ this.fitMode.set('none');
64
+ }
65
+ zoomIn() {
66
+ const levels = [25, 50, 75, 100, 125, 150, 200, 300, 400];
67
+ const current = this.zoom();
68
+ const next = levels.find(l => l > current) || 400;
69
+ this.setZoom(next);
70
+ }
71
+ zoomOut() {
72
+ const levels = [25, 50, 75, 100, 125, 150, 200, 300, 400];
73
+ const current = this.zoom();
74
+ const prev = [...levels].reverse().find(l => l < current) || 25;
75
+ this.setZoom(prev);
76
+ }
77
+ fitToWidth() {
78
+ this.fitMode.set('width');
79
+ }
80
+ fitToPage() {
81
+ this.fitMode.set('page');
82
+ }
83
+ // View modes
84
+ toggleViewMode() {
85
+ this.viewMode.update(m => m === 'single' ? 'continuous' : 'single');
86
+ }
87
+ setViewMode(mode) {
88
+ this.viewMode.set(mode);
89
+ }
90
+ toggleFullScreen() {
91
+ this.isFullScreen.update(v => !v);
92
+ }
93
+ // Sidebars
94
+ toggleTocSidebar() {
95
+ const opening = !this.tocSidebarOpen();
96
+ this.tocSidebarOpen.set(opening);
97
+ if (opening) {
98
+ this.thumbnailSidebarOpen.set(false);
99
+ }
100
+ }
101
+ toggleThumbnailSidebar() {
102
+ const opening = !this.thumbnailSidebarOpen();
103
+ this.thumbnailSidebarOpen.set(opening);
104
+ if (opening) {
105
+ this.tocSidebarOpen.set(false);
106
+ }
107
+ }
108
+ closeSidebars() {
109
+ this.tocSidebarOpen.set(false);
110
+ this.thumbnailSidebarOpen.set(false);
111
+ }
112
+ // Search
113
+ setSearchQuery(query) {
114
+ this.searchQuery.set(query);
115
+ this.currentMatchIndex.set(query ? 0 : -1);
116
+ }
117
+ nextMatch() {
118
+ const total = this.searchMatches().length;
119
+ if (total > 0) {
120
+ this.currentMatchIndex.update(i => (i + 1) % total);
121
+ }
122
+ }
123
+ previousMatch() {
124
+ const total = this.searchMatches().length;
125
+ if (total > 0) {
126
+ this.currentMatchIndex.update(i => (i - 1 + total) % total);
127
+ }
128
+ }
129
+ clearSearch() {
130
+ this.searchQuery.set('');
131
+ this.searchMatches.set([]);
132
+ this.currentMatchIndex.set(-1);
133
+ this.searchOpen.set(false);
134
+ }
135
+ toggleSearch() {
136
+ const opening = !this.searchOpen();
137
+ this.searchOpen.set(opening);
138
+ if (!opening) {
139
+ this.clearSearch();
140
+ }
141
+ }
142
+ // Theme
143
+ toggleTheme() {
144
+ this.ribbonTheme.update(t => t === 'light' ? 'dark' : 'light');
145
+ }
146
+ setTheme(theme) {
147
+ this.ribbonTheme.set(theme);
148
+ }
149
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ViewerStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
150
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ViewerStateService }); }
151
+ }
152
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ViewerStateService, decorators: [{
153
+ type: Injectable
154
+ }] });
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLXN0YXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXBvcnQtdmlld2VyL3NyYy9saWIvc2VydmljZXMvdmlld2VyLXN0YXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUk3RCxNQUFNLE9BQU8sa0JBQWtCO0lBRC9CO1FBRUUsYUFBYTtRQUNKLGdCQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLGVBQVUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFaEMsT0FBTztRQUNFLFNBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsWUFBTyxHQUFHLE1BQU0sQ0FBNEIsTUFBTSxDQUFDLENBQUM7UUFFN0QsYUFBYTtRQUNKLGFBQVEsR0FBRyxNQUFNLENBQTBCLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELGlCQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRDLFdBQVc7UUFDRixtQkFBYyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQix5QkFBb0IsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFOUMsU0FBUztRQUNBLGdCQUFXLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLGtCQUFhLEdBQUcsTUFBTSxDQUFnQixFQUFFLENBQUMsQ0FBQztRQUMxQyxzQkFBaUIsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixlQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBDLFFBQVE7UUFDQyxnQkFBVyxHQUFHLE1BQU0sQ0FBbUIsT0FBTyxDQUFDLENBQUM7UUFFekQsV0FBVztRQUNGLGdCQUFX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O0lBQ1IsV0FBVztRQUNULElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQXVCO1FBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7K0dBM0tVLGtCQUFrQjttSEFBbEIsa0JBQWtCOzs0RkFBbEIsa0JBQWtCO2tCQUQ5QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgc2lnbmFsLCBjb21wdXRlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTZWFyY2hNYXRjaCB9IGZyb20gJy4uL21vZGVscy9yZXBvcnQtdGVtcGxhdGUubW9kZWwnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgVmlld2VyU3RhdGVTZXJ2aWNlIHtcclxuICAvLyBQYWdpbmF0aW9uXHJcbiAgcmVhZG9ubHkgY3VycmVudFBhZ2UgPSBzaWduYWwoMSk7XHJcbiAgcmVhZG9ubHkgdG90YWxQYWdlcyA9IHNpZ25hbCgxKTtcclxuXHJcbiAgLy8gWm9vbVxyXG4gIHJlYWRvbmx5IHpvb20gPSBzaWduYWwoMTAwKTtcclxuICByZWFkb25seSBmaXRNb2RlID0gc2lnbmFsPCdub25lJyB8ICd3aWR0aCcgfCAncGFnZSc+KCdub25lJyk7XHJcblxyXG4gIC8vIFZpZXcgbW9kZXNcclxuICByZWFkb25seSB2aWV3TW9kZSA9IHNpZ25hbDwnc2luZ2xlJyB8ICdjb250aW51b3VzJz4oJ3NpbmdsZScpO1xyXG4gIHJlYWRvbmx5IGlzRnVsbFNjcmVlbiA9IHNpZ25hbChmYWxzZSk7XHJcblxyXG4gIC8vIFNpZGViYXJzXHJcbiAgcmVhZG9ubHkgdG9jU2lkZWJhck9wZW4gPSBzaWduYWwoZmFsc2UpO1xyXG4gIHJlYWRvbmx5IHRodW1ibmFpbFNpZGViYXJPcGVuID0gc2lnbmFsKGZhbHNlKTtcclxuXHJcbiAgLy8gU2VhcmNoXHJcbiAgcmVhZG9ubHkgc2VhcmNoUXVlcnkgPSBzaWduYWwoJycpO1xyXG4gIHJlYWRvbmx5IHNlYXJjaE1hdGNoZXMgPSBzaWduYWw8U2VhcmNoTWF0Y2hbXT4oW10pO1xyXG4gIHJlYWRvbmx5IGN1cnJlbnRNYXRjaEluZGV4ID0gc2lnbmFsKC0xKTtcclxuICByZWFkb25seSBzZWFyY2hPcGVuID0gc2lnbmFsKGZhbHNlKTtcclxuXHJcbiAgLy8gVGhlbWVcclxuICByZWFkb25seSByaWJib25UaGVtZSA9IHNpZ25hbDwnbGlnaHQnIHwgJ2RhcmsnPignbGlnaHQnKTtcclxuXHJcbiAgLy8gQ29tcHV0ZWRcclxuICByZWFkb25seSBwYWdlRGlzcGxheSA9IGNvbXB1dGVkKCgpID0+IGAke3RoaXMuY3VycmVudFBhZ2UoKX0gb2YgJHt0aGlzLnRvdGFsUGFnZXMoKX1gKTtcclxuICByZWFkb25seSB6b29tRGlzcGxheSA9IGNvbXB1dGVkKCgpID0+IGAke3RoaXMuem9vbSgpfSVgKTtcclxuICByZWFkb25seSBtYXRjaERpc3BsYXkgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBtYXRjaGVzID0gdGhpcy5zZWFyY2hNYXRjaGVzKCk7XHJcbiAgICBjb25zdCBpZHggPSB0aGlzLmN1cnJlbnRNYXRjaEluZGV4KCk7XHJcbiAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHJldHVybiAnTm8gbWF0Y2hlcyc7XHJcbiAgICByZXR1cm4gYCR7aWR4ICsgMX0gb2YgJHttYXRjaGVzLmxlbmd0aH1gO1xyXG4gIH0pO1xyXG4gIHJlYWRvbmx5IGlzRmlyc3RQYWdlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jdXJyZW50UGFnZSgpIDw9IDEpO1xyXG4gIHJlYWRvbmx5IGlzTGFzdFBhZ2UgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmN1cnJlbnRQYWdlKCkgPj0gdGhpcy50b3RhbFBhZ2VzKCkpO1xyXG4gIHJlYWRvbmx5IGhhc1NpZGViYXJPcGVuID0gY29tcHV0ZWQoKCkgPT4gdGhpcy50b2NTaWRlYmFyT3BlbigpIHx8IHRoaXMudGh1bWJuYWlsU2lkZWJhck9wZW4oKSk7XHJcbiAgcmVhZG9ubHkgaXNEYXJrVGhlbWUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnJpYmJvblRoZW1lKCkgPT09ICdkYXJrJyk7XHJcblxyXG4gIC8vIE5hdmlnYXRpb25cclxuICBnb1RvUGFnZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihwYWdlLCB0aGlzLnRvdGFsUGFnZXMoKSkpO1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZS5zZXQoY2xhbXBlZCk7XHJcbiAgfVxyXG5cclxuICBuZXh0UGFnZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0xhc3RQYWdlKCkpIHtcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZS51cGRhdGUocCA9PiBwICsgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcmV2aW91c1BhZ2UoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNGaXJzdFBhZ2UoKSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLnVwZGF0ZShwID0+IHAgLSAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZpcnN0UGFnZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudFBhZ2Uuc2V0KDEpO1xyXG4gIH1cclxuXHJcbiAgbGFzdFBhZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlLnNldCh0aGlzLnRvdGFsUGFnZXMoKSk7XHJcbiAgfVxyXG5cclxuICAvLyBab29tXHJcbiAgc2V0Wm9vbShsZXZlbDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnpvb20uc2V0KE1hdGgubWF4KDEwLCBNYXRoLm1pbig0MDAsIGxldmVsKSkpO1xyXG4gICAgdGhpcy5maXRNb2RlLnNldCgnbm9uZScpO1xyXG4gIH1cclxuXHJcbiAgem9vbUluKCk6IHZvaWQge1xyXG4gICAgY29uc3QgbGV2ZWxzID0gWzI1LCA1MCwgNzUsIDEwMCwgMTI1LCAxNTAsIDIwMCwgMzAwLCA0MDBdO1xyXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuem9vbSgpO1xyXG4gICAgY29uc3QgbmV4dCA9IGxldmVscy5maW5kKGwgPT4gbCA+IGN1cnJlbnQpIHx8IDQwMDtcclxuICAgIHRoaXMuc2V0Wm9vbShuZXh0KTtcclxuICB9XHJcblxyXG4gIHpvb21PdXQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBsZXZlbHMgPSBbMjUsIDUwLCA3NSwgMTAwLCAxMjUsIDE1MCwgMjAwLCAzMDAsIDQwMF07XHJcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy56b29tKCk7XHJcbiAgICBjb25zdCBwcmV2ID0gWy4uLmxldmVsc10ucmV2ZXJzZSgpLmZpbmQobCA9PiBsIDwgY3VycmVudCkgfHwgMjU7XHJcbiAgICB0aGlzLnNldFpvb20ocHJldik7XHJcbiAgfVxyXG5cclxuICBmaXRUb1dpZHRoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5maXRNb2RlLnNldCgnd2lkdGgnKTtcclxuICB9XHJcblxyXG4gIGZpdFRvUGFnZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZml0TW9kZS5zZXQoJ3BhZ2UnKTtcclxuICB9XHJcblxyXG4gIC8vIFZpZXcgbW9kZXNcclxuICB0b2dnbGVWaWV3TW9kZSgpOiB2b2lkIHtcclxuICAgIHRoaXMudmlld01vZGUudXBkYXRlKG0gPT4gbSA9PT0gJ3NpbmdsZScgPyAnY29udGludW91cycgOiAnc2luZ2xlJyk7XHJcbiAgfVxyXG5cclxuICBzZXRWaWV3TW9kZShtb2RlOiAnc2luZ2xlJyB8ICdjb250aW51b3VzJyk6IHZvaWQge1xyXG4gICAgdGhpcy52aWV3TW9kZS5zZXQobW9kZSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVGdWxsU2NyZWVuKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0Z1bGxTY3JlZW4udXBkYXRlKHYgPT4gIXYpO1xyXG4gIH1cclxuXHJcbiAgLy8gU2lkZWJhcnNcclxuICB0b2dnbGVUb2NTaWRlYmFyKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgb3BlbmluZyA9ICF0aGlzLnRvY1NpZGViYXJPcGVuKCk7XHJcbiAgICB0aGlzLnRvY1NpZGViYXJPcGVuLnNldChvcGVuaW5nKTtcclxuICAgIGlmIChvcGVuaW5nKSB7XHJcbiAgICAgIHRoaXMudGh1bWJuYWlsU2lkZWJhck9wZW4uc2V0KGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZVRodW1ibmFpbFNpZGViYXIoKTogdm9pZCB7XHJcbiAgICBjb25zdCBvcGVuaW5nID0gIXRoaXMudGh1bWJuYWlsU2lkZWJhck9wZW4oKTtcclxuICAgIHRoaXMudGh1bWJuYWlsU2lkZWJhck9wZW4uc2V0KG9wZW5pbmcpO1xyXG4gICAgaWYgKG9wZW5pbmcpIHtcclxuICAgICAgdGhpcy50b2NTaWRlYmFyT3Blbi5zZXQoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xvc2VTaWRlYmFycygpOiB2b2lkIHtcclxuICAgIHRoaXMudG9jU2lkZWJhck9wZW4uc2V0KGZhbHNlKTtcclxuICAgIHRoaXMudGh1bWJuYWlsU2lkZWJhck9wZW4uc2V0KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vIFNlYXJjaFxyXG4gIHNldFNlYXJjaFF1ZXJ5KHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VhcmNoUXVlcnkuc2V0KHF1ZXJ5KTtcclxuICAgIHRoaXMuY3VycmVudE1hdGNoSW5kZXguc2V0KHF1ZXJ5ID8gMCA6IC0xKTtcclxuICB9XHJcblxyXG4gIG5leHRNYXRjaCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5zZWFyY2hNYXRjaGVzKCkubGVuZ3RoO1xyXG4gICAgaWYgKHRvdGFsID4gMCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRNYXRjaEluZGV4LnVwZGF0ZShpID0+IChpICsgMSkgJSB0b3RhbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcmV2aW91c01hdGNoKCk6IHZvaWQge1xyXG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnNlYXJjaE1hdGNoZXMoKS5sZW5ndGg7XHJcbiAgICBpZiAodG90YWwgPiAwKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudE1hdGNoSW5kZXgudXBkYXRlKGkgPT4gKGkgLSAxICsgdG90YWwpICUgdG90YWwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xlYXJTZWFyY2goKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlYXJjaFF1ZXJ5LnNldCgnJyk7XHJcbiAgICB0aGlzLnNlYXJjaE1hdGNoZXMuc2V0KFtdKTtcclxuICAgIHRoaXMuY3VycmVudE1hdGNoSW5kZXguc2V0KC0xKTtcclxuICAgIHRoaXMuc2VhcmNoT3Blbi5zZXQoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgb3BlbmluZyA9ICF0aGlzLnNlYXJjaE9wZW4oKTtcclxuICAgIHRoaXMuc2VhcmNoT3Blbi5zZXQob3BlbmluZyk7XHJcbiAgICBpZiAoIW9wZW5pbmcpIHtcclxuICAgICAgdGhpcy5jbGVhclNlYXJjaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gVGhlbWVcclxuICB0b2dnbGVUaGVtZSgpOiB2b2lkIHtcclxuICAgIHRoaXMucmliYm9uVGhlbWUudXBkYXRlKHQgPT4gdCA9PT0gJ2xpZ2h0JyA/ICdkYXJrJyA6ICdsaWdodCcpO1xyXG4gIH1cclxuXHJcbiAgc2V0VGhlbWUodGhlbWU6ICdsaWdodCcgfCAnZGFyaycpOiB2b2lkIHtcclxuICAgIHRoaXMucmliYm9uVGhlbWUuc2V0KHRoZW1lKTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,86 @@
1
+ import { Component, ChangeDetectionStrategy, Input, output } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { MatIconModule } from '@angular/material/icon';
4
+ import { MatButtonModule } from '@angular/material/button';
5
+ import { animate, state, style, transition, trigger } from '@angular/animations';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/material/icon";
8
+ import * as i2 from "@angular/material/button";
9
+ export class SidebarContainerComponent {
10
+ constructor() {
11
+ this.isOpen = false;
12
+ this.title = '';
13
+ this.closed = output();
14
+ }
15
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SidebarContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
16
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SidebarContainerComponent, isStandalone: true, selector: "rv-sidebar-container", inputs: { isOpen: "isOpen", title: "title" }, outputs: { closed: "closed" }, ngImport: i0, template: `
17
+ <div class="rv-sidebar-wrapper"
18
+ [class.rv-sidebar-hidden]="!isOpen"
19
+ [@sidebarSlide]="isOpen ? 'open' : 'closed'">
20
+ <div class="rv-sidebar-panel">
21
+ <div class="rv-sidebar-header">
22
+ <span class="rv-sidebar-title">{{ title }}</span>
23
+ <button mat-icon-button class="rv-sidebar-close" (click)="closed.emit()">
24
+ <mat-icon>close</mat-icon>
25
+ </button>
26
+ </div>
27
+ <div class="rv-sidebar-body">
28
+ <ng-content></ng-content>
29
+ </div>
30
+ </div>
31
+ </div>
32
+ `, isInline: true, styles: [":host{display:block;position:absolute;left:0;top:0;bottom:0;z-index:50;pointer-events:none}.rv-sidebar-wrapper{width:240px;height:100%;pointer-events:auto}.rv-sidebar-hidden{pointer-events:none}.rv-sidebar-panel{width:100%;height:100%;display:flex;flex-direction:column;background:var(--rv-sidebar-bg, #ffffff);border-right:1px solid var(--rv-sidebar-border, #e0e0e0);box-shadow:2px 0 8px #0000001a}:host-context(.rv-theme-dark) .rv-sidebar-panel{--rv-sidebar-bg: #1e1e2d;--rv-sidebar-border: #3a3a4a;box-shadow:2px 0 12px #0000004d}.rv-sidebar-header{display:flex;align-items:center;justify-content:space-between;height:40px;min-height:40px;padding:0 8px 0 16px;border-bottom:1px solid var(--rv-sidebar-border, #e0e0e0);background:var(--rv-sidebar-bg, #ffffff)}:host-context(.rv-theme-dark) .rv-sidebar-header{background:#252538}.rv-sidebar-title{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--rv-sidebar-text, #555555)}:host-context(.rv-theme-dark) .rv-sidebar-title{color:#b0b0c0}.rv-sidebar-close{width:28px!important;height:28px!important}.rv-sidebar-close .mat-icon{font-size:18px;width:18px;height:18px;color:var(--rv-sidebar-text, #555555)}:host-context(.rv-theme-dark) .rv-sidebar-close .mat-icon{color:#b0b0c0}.rv-sidebar-body{flex:1;overflow-y:auto;overflow-x:hidden}.rv-sidebar-body::-webkit-scrollbar{width:6px}.rv-sidebar-body::-webkit-scrollbar-track{background:transparent}.rv-sidebar-body::-webkit-scrollbar-thumb{background:#ccc;border-radius:3px}:host-context(.rv-theme-dark) .rv-sidebar-body::-webkit-scrollbar-thumb{background:#444}.rv-sidebar-body::-webkit-scrollbar-thumb:hover{background:#aaa}:host-context(.rv-theme-dark) .rv-sidebar-body::-webkit-scrollbar-thumb:hover{background:#555}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }], animations: [
33
+ trigger('sidebarSlide', [
34
+ state('open', style({
35
+ transform: 'translateX(0)',
36
+ opacity: 1,
37
+ })),
38
+ state('closed', style({
39
+ transform: 'translateX(-100%)',
40
+ opacity: 0,
41
+ })),
42
+ transition('open <=> closed', [
43
+ animate('200ms ease-in-out')
44
+ ]),
45
+ ]),
46
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
47
+ }
48
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SidebarContainerComponent, decorators: [{
49
+ type: Component,
50
+ args: [{ selector: 'rv-sidebar-container', standalone: true, imports: [CommonModule, MatIconModule, MatButtonModule], changeDetection: ChangeDetectionStrategy.OnPush, animations: [
51
+ trigger('sidebarSlide', [
52
+ state('open', style({
53
+ transform: 'translateX(0)',
54
+ opacity: 1,
55
+ })),
56
+ state('closed', style({
57
+ transform: 'translateX(-100%)',
58
+ opacity: 0,
59
+ })),
60
+ transition('open <=> closed', [
61
+ animate('200ms ease-in-out')
62
+ ]),
63
+ ]),
64
+ ], template: `
65
+ <div class="rv-sidebar-wrapper"
66
+ [class.rv-sidebar-hidden]="!isOpen"
67
+ [@sidebarSlide]="isOpen ? 'open' : 'closed'">
68
+ <div class="rv-sidebar-panel">
69
+ <div class="rv-sidebar-header">
70
+ <span class="rv-sidebar-title">{{ title }}</span>
71
+ <button mat-icon-button class="rv-sidebar-close" (click)="closed.emit()">
72
+ <mat-icon>close</mat-icon>
73
+ </button>
74
+ </div>
75
+ <div class="rv-sidebar-body">
76
+ <ng-content></ng-content>
77
+ </div>
78
+ </div>
79
+ </div>
80
+ `, styles: [":host{display:block;position:absolute;left:0;top:0;bottom:0;z-index:50;pointer-events:none}.rv-sidebar-wrapper{width:240px;height:100%;pointer-events:auto}.rv-sidebar-hidden{pointer-events:none}.rv-sidebar-panel{width:100%;height:100%;display:flex;flex-direction:column;background:var(--rv-sidebar-bg, #ffffff);border-right:1px solid var(--rv-sidebar-border, #e0e0e0);box-shadow:2px 0 8px #0000001a}:host-context(.rv-theme-dark) .rv-sidebar-panel{--rv-sidebar-bg: #1e1e2d;--rv-sidebar-border: #3a3a4a;box-shadow:2px 0 12px #0000004d}.rv-sidebar-header{display:flex;align-items:center;justify-content:space-between;height:40px;min-height:40px;padding:0 8px 0 16px;border-bottom:1px solid var(--rv-sidebar-border, #e0e0e0);background:var(--rv-sidebar-bg, #ffffff)}:host-context(.rv-theme-dark) .rv-sidebar-header{background:#252538}.rv-sidebar-title{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--rv-sidebar-text, #555555)}:host-context(.rv-theme-dark) .rv-sidebar-title{color:#b0b0c0}.rv-sidebar-close{width:28px!important;height:28px!important}.rv-sidebar-close .mat-icon{font-size:18px;width:18px;height:18px;color:var(--rv-sidebar-text, #555555)}:host-context(.rv-theme-dark) .rv-sidebar-close .mat-icon{color:#b0b0c0}.rv-sidebar-body{flex:1;overflow-y:auto;overflow-x:hidden}.rv-sidebar-body::-webkit-scrollbar{width:6px}.rv-sidebar-body::-webkit-scrollbar-track{background:transparent}.rv-sidebar-body::-webkit-scrollbar-thumb{background:#ccc;border-radius:3px}:host-context(.rv-theme-dark) .rv-sidebar-body::-webkit-scrollbar-thumb{background:#444}.rv-sidebar-body::-webkit-scrollbar-thumb:hover{background:#aaa}:host-context(.rv-theme-dark) .rv-sidebar-body::-webkit-scrollbar-thumb:hover{background:#555}\n"] }]
81
+ }], propDecorators: { isOpen: [{
82
+ type: Input
83
+ }], title: [{
84
+ type: Input
85
+ }] } });
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWJhci1jb250YWluZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwb3J0LXZpZXdlci9zcmMvbGliL3NpZGViYXIvc2lkZWJhci1jb250YWluZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFDbEQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7OztBQXdKakYsTUFBTSxPQUFPLHlCQUF5QjtJQXRKdEM7UUF1SlcsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFcEIsV0FBTSxHQUFHLE1BQU0sRUFBUSxDQUFDO0tBQ3pCOytHQUxZLHlCQUF5QjttR0FBekIseUJBQXlCLDZKQWxJMUI7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQlQsbXlEQWpDUyxZQUFZLDhCQUFFLGFBQWEsbUxBQUUsZUFBZSw4SEFFMUM7WUFDVixPQUFPLENBQUMsY0FBYyxFQUFFO2dCQUN0QixLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQztvQkFDbEIsU0FBUyxFQUFFLGVBQWU7b0JBQzFCLE9BQU8sRUFBRSxDQUFDO2lCQUNYLENBQUMsQ0FBQztnQkFDSCxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQztvQkFDcEIsU0FBUyxFQUFFLG1CQUFtQjtvQkFDOUIsT0FBTyxFQUFFLENBQUM7aUJBQ1gsQ0FBQyxDQUFDO2dCQUNILFVBQVUsQ0FBQyxpQkFBaUIsRUFBRTtvQkFDNUIsT0FBTyxDQUFDLG1CQUFtQixDQUFDO2lCQUM3QixDQUFDO2FBQ0gsQ0FBQztTQUNIOzs0RkFtSVUseUJBQXlCO2tCQXRKckMsU0FBUzsrQkFDRSxzQkFBc0IsY0FDcEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxlQUFlLENBQUMsbUJBQ3RDLHVCQUF1QixDQUFDLE1BQU0sY0FDbkM7d0JBQ1YsT0FBTyxDQUFDLGNBQWMsRUFBRTs0QkFDdEIsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7Z0NBQ2xCLFNBQVMsRUFBRSxlQUFlO2dDQUMxQixPQUFPLEVBQUUsQ0FBQzs2QkFDWCxDQUFDLENBQUM7NEJBQ0gsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUM7Z0NBQ3BCLFNBQVMsRUFBRSxtQkFBbUI7Z0NBQzlCLE9BQU8sRUFBRSxDQUFDOzZCQUNYLENBQUMsQ0FBQzs0QkFDSCxVQUFVLENBQUMsaUJBQWlCLEVBQUU7Z0NBQzVCLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQzs2QkFDN0IsQ0FBQzt5QkFDSCxDQUFDO3FCQUNILFlBQ1M7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQlQ7OEJBbUhRLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBJbnB1dCwgb3V0cHV0LCBzaWduYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdydi1zaWRlYmFyLWNvbnRhaW5lcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdEljb25Nb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBhbmltYXRpb25zOiBbXG4gICAgdHJpZ2dlcignc2lkZWJhclNsaWRlJywgW1xuICAgICAgc3RhdGUoJ29wZW4nLCBzdHlsZSh7XG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMCknLFxuICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgfSkpLFxuICAgICAgc3RhdGUoJ2Nsb3NlZCcsIHN0eWxlKHtcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtMTAwJSknLFxuICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgfSkpLFxuICAgICAgdHJhbnNpdGlvbignb3BlbiA8PT4gY2xvc2VkJywgW1xuICAgICAgICBhbmltYXRlKCcyMDBtcyBlYXNlLWluLW91dCcpXG4gICAgICBdKSxcbiAgICBdKSxcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicnYtc2lkZWJhci13cmFwcGVyXCJcbiAgICAgICAgIFtjbGFzcy5ydi1zaWRlYmFyLWhpZGRlbl09XCIhaXNPcGVuXCJcbiAgICAgICAgIFtAc2lkZWJhclNsaWRlXT1cImlzT3BlbiA/ICdvcGVuJyA6ICdjbG9zZWQnXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicnYtc2lkZWJhci1wYW5lbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicnYtc2lkZWJhci1oZWFkZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInJ2LXNpZGViYXItdGl0bGVcIj57eyB0aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBjbGFzcz1cInJ2LXNpZGViYXItY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VkLmVtaXQoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJydi1zaWRlYmFyLWJvZHlcIj5cbiAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGxlZnQ6IDA7XG4gICAgICB0b3A6IDA7XG4gICAgICBib3R0b206IDA7XG4gICAgICB6LWluZGV4OiA1MDtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIH1cblxuICAgIC5ydi1zaWRlYmFyLXdyYXBwZXIge1xuICAgICAgd2lkdGg6IDI0MHB4O1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgfVxuXG4gICAgLnJ2LXNpZGViYXItaGlkZGVuIHtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIH1cblxuICAgIC5ydi1zaWRlYmFyLXBhbmVsIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ydi1zaWRlYmFyLWJnLCAjZmZmZmZmKTtcbiAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLXJ2LXNpZGViYXItYm9yZGVyLCAjZTBlMGUwKTtcbiAgICAgIGJveC1zaGFkb3c6IDJweCAwIDhweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gICAgfVxuXG4gICAgOmhvc3QtY29udGV4dCgucnYtdGhlbWUtZGFyaykgLnJ2LXNpZGViYXItcGFuZWwge1xuICAgICAgLS1ydi1zaWRlYmFyLWJnOiAjMWUxZTJkO1xuICAgICAgLS1ydi1zaWRlYmFyLWJvcmRlcjogIzNhM2E0YTtcbiAgICAgIGJveC1zaGFkb3c6IDJweCAwIDEycHggcmdiYSgwLCAwLCAwLCAwLjMpO1xuICAgIH1cblxuICAgIC5ydi1zaWRlYmFyLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIGhlaWdodDogNDBweDtcbiAgICAgIG1pbi1oZWlnaHQ6IDQwcHg7XG4gICAgICBwYWRkaW5nOiAwIDhweCAwIDE2cHg7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tcnYtc2lkZWJhci1ib3JkZXIsICNlMGUwZTApO1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnYtc2lkZWJhci1iZywgI2ZmZmZmZik7XG4gICAgfVxuXG4gICAgOmhvc3QtY29udGV4dCgucnYtdGhlbWUtZGFyaykgLnJ2LXNpZGViYXItaGVhZGVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICMyNTI1Mzg7XG4gICAgfVxuXG4gICAgLnJ2LXNpZGViYXItdGl0bGUge1xuICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7XG4gICAgICBjb2xvcjogdmFyKC0tcnYtc2lkZWJhci10ZXh0LCAjNTU1NTU1KTtcbiAgICB9XG5cbiAgICA6aG9zdC1jb250ZXh0KC5ydi10aGVtZS1kYXJrKSAucnYtc2lkZWJhci10aXRsZSB7XG4gICAgICBjb2xvcjogI2IwYjBjMDtcbiAgICB9XG5cbiAgICAucnYtc2lkZWJhci1jbG9zZSB7XG4gICAgICB3aWR0aDogMjhweCAhaW1wb3J0YW50O1xuICAgICAgaGVpZ2h0OiAyOHB4ICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgLnJ2LXNpZGViYXItY2xvc2UgLm1hdC1pY29uIHtcbiAgICAgIGZvbnQtc2l6ZTogMThweDtcbiAgICAgIHdpZHRoOiAxOHB4O1xuICAgICAgaGVpZ2h0OiAxOHB4O1xuICAgICAgY29sb3I6IHZhcigtLXJ2LXNpZGViYXItdGV4dCwgIzU1NTU1NSk7XG4gICAgfVxuXG4gICAgOmhvc3QtY29udGV4dCgucnYtdGhlbWUtZGFyaykgLnJ2LXNpZGViYXItY2xvc2UgLm1hdC1pY29uIHtcbiAgICAgIGNvbG9yOiAjYjBiMGMwO1xuICAgIH1cblxuICAgIC5ydi1zaWRlYmFyLWJvZHkge1xuICAgICAgZmxleDogMTtcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgfVxuXG4gICAgLyogU2Nyb2xsYmFyIHN0eWxpbmcgKi9cbiAgICAucnYtc2lkZWJhci1ib2R5Ojotd2Via2l0LXNjcm9sbGJhciB7XG4gICAgICB3aWR0aDogNnB4O1xuICAgIH1cblxuICAgIC5ydi1zaWRlYmFyLWJvZHk6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgIH1cblxuICAgIC5ydi1zaWRlYmFyLWJvZHk6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcbiAgICAgIGJhY2tncm91bmQ6ICNjY2M7XG4gICAgICBib3JkZXItcmFkaXVzOiAzcHg7XG4gICAgfVxuXG4gICAgOmhvc3QtY29udGV4dCgucnYtdGhlbWUtZGFyaykgLnJ2LXNpZGViYXItYm9keTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xuICAgICAgYmFja2dyb3VuZDogIzQ0NDtcbiAgICB9XG5cbiAgICAucnYtc2lkZWJhci1ib2R5Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjYWFhO1xuICAgIH1cblxuICAgIDpob3N0LWNvbnRleHQoLnJ2LXRoZW1lLWRhcmspIC5ydi1zaWRlYmFyLWJvZHk6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICM1NTU7XG4gICAgfVxuICBgXVxufSlcbmV4cG9ydCBjbGFzcyBTaWRlYmFyQ29udGFpbmVyQ29tcG9uZW50IHtcbiAgQElucHV0KCkgaXNPcGVuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRpdGxlID0gJyc7XG5cbiAgY2xvc2VkID0gb3V0cHV0PHZvaWQ+KCk7XG59XG4iXX0=
@@ -0,0 +1,110 @@
1
+ import { Component, ChangeDetectionStrategy, Input, inject, output } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { ViewerStateService } from '../services/viewer-state.service';
4
+ import { SidebarContainerComponent } from './sidebar-container.component';
5
+ import { ReportPageComponent } from '../layout/report-page.component';
6
+ import * as i0 from "@angular/core";
7
+ export class ThumbnailSidebarComponent {
8
+ constructor() {
9
+ this.pages = [];
10
+ this.pageWidth = 210;
11
+ this.pageHeight = 297;
12
+ this.globalStyles = { fontFamily: 'Arial', fontSize: '11px', color: '#000', backgroundColor: '#fff' };
13
+ this.data = null;
14
+ this.pageSelected = output();
15
+ this.state = inject(ViewerStateService);
16
+ }
17
+ onPageClick(page) {
18
+ this.state.goToPage(page);
19
+ this.pageSelected.emit(page);
20
+ }
21
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ThumbnailSidebarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
22
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ThumbnailSidebarComponent, isStandalone: true, selector: "rv-thumbnail-sidebar", inputs: { pages: "pages", pageWidth: "pageWidth", pageHeight: "pageHeight", globalStyles: "globalStyles", data: "data" }, outputs: { pageSelected: "pageSelected" }, ngImport: i0, template: `
23
+ <rv-sidebar-container
24
+ [isOpen]="state.thumbnailSidebarOpen()"
25
+ title="Pages"
26
+ (closed)="state.toggleThumbnailSidebar()">
27
+
28
+ <div class="rv-thumbnail-list">
29
+ @for (page of pages; track page.index) {
30
+ <div class="rv-thumbnail-item"
31
+ [class.rv-thumb-active]="page.index === state.currentPage() - 1"
32
+ (click)="onPageClick(page.index + 1)">
33
+ <div class="rv-thumbnail-preview">
34
+ <div class="rv-thumbnail-scale">
35
+ <rv-report-page
36
+ [pageWidth]="pageWidth"
37
+ [pageHeight]="pageHeight"
38
+ [headerSection]="page.header"
39
+ [footerSection]="page.footer"
40
+ [bodyComponents]="page.components"
41
+ [globalStyles]="globalStyles"
42
+ [data]="data"
43
+ [pageNumber]="page.index + 1"
44
+ [totalPages]="pages.length">
45
+ </rv-report-page>
46
+ </div>
47
+ </div>
48
+ <span class="rv-thumb-label">{{ page.index + 1 }}</span>
49
+ </div>
50
+ }
51
+
52
+ @if (!pages || pages.length === 0) {
53
+ <div class="rv-thumb-empty">No pages</div>
54
+ }
55
+ </div>
56
+
57
+ </rv-sidebar-container>
58
+ `, isInline: true, styles: [".rv-thumbnail-list{padding:12px 8px;display:flex;flex-direction:column;align-items:center;gap:12px}.rv-thumbnail-item{cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:4px;padding:6px;border-radius:6px;border:2px solid transparent;transition:all .15s ease}.rv-thumbnail-item:hover:not(.rv-thumb-active){background:#00000008;border-color:#00000014}:host-context(.rv-theme-dark) .rv-thumbnail-item:hover:not(.rv-thumb-active){background:#ffffff0a;border-color:#ffffff14}.rv-thumb-active{border-color:#1976d2;background:#1976d20f}:host-context(.rv-theme-dark) .rv-thumb-active{border-color:#64b5f6;background:#64b5f61a}.rv-thumbnail-preview{width:140px;height:198px;overflow:hidden;border-radius:3px;box-shadow:0 1px 4px #00000026;background:#fff}.rv-thumbnail-scale{transform:scale(.167);transform-origin:top left;width:600%;height:600%;pointer-events:none}.rv-thumb-label{font-size:11px;font-weight:500;color:#666}:host-context(.rv-theme-dark) .rv-thumb-label{color:#a0a0b0}.rv-thumb-active .rv-thumb-label{color:#1976d2;font-weight:600}:host-context(.rv-theme-dark) .rv-thumb-active .rv-thumb-label{color:#64b5f6}.rv-thumb-empty{padding:24px;color:#999;font-size:12px;text-align:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: SidebarContainerComponent, selector: "rv-sidebar-container", inputs: ["isOpen", "title"], outputs: ["closed"] }, { kind: "component", type: ReportPageComponent, selector: "rv-report-page", inputs: ["pageWidth", "pageHeight", "headerSection", "footerSection", "bodyComponents", "globalStyles", "data", "pageNumber", "totalPages", "reportTitle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
59
+ }
60
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ThumbnailSidebarComponent, decorators: [{
61
+ type: Component,
62
+ args: [{ selector: 'rv-thumbnail-sidebar', standalone: true, imports: [CommonModule, SidebarContainerComponent, ReportPageComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
63
+ <rv-sidebar-container
64
+ [isOpen]="state.thumbnailSidebarOpen()"
65
+ title="Pages"
66
+ (closed)="state.toggleThumbnailSidebar()">
67
+
68
+ <div class="rv-thumbnail-list">
69
+ @for (page of pages; track page.index) {
70
+ <div class="rv-thumbnail-item"
71
+ [class.rv-thumb-active]="page.index === state.currentPage() - 1"
72
+ (click)="onPageClick(page.index + 1)">
73
+ <div class="rv-thumbnail-preview">
74
+ <div class="rv-thumbnail-scale">
75
+ <rv-report-page
76
+ [pageWidth]="pageWidth"
77
+ [pageHeight]="pageHeight"
78
+ [headerSection]="page.header"
79
+ [footerSection]="page.footer"
80
+ [bodyComponents]="page.components"
81
+ [globalStyles]="globalStyles"
82
+ [data]="data"
83
+ [pageNumber]="page.index + 1"
84
+ [totalPages]="pages.length">
85
+ </rv-report-page>
86
+ </div>
87
+ </div>
88
+ <span class="rv-thumb-label">{{ page.index + 1 }}</span>
89
+ </div>
90
+ }
91
+
92
+ @if (!pages || pages.length === 0) {
93
+ <div class="rv-thumb-empty">No pages</div>
94
+ }
95
+ </div>
96
+
97
+ </rv-sidebar-container>
98
+ `, styles: [".rv-thumbnail-list{padding:12px 8px;display:flex;flex-direction:column;align-items:center;gap:12px}.rv-thumbnail-item{cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:4px;padding:6px;border-radius:6px;border:2px solid transparent;transition:all .15s ease}.rv-thumbnail-item:hover:not(.rv-thumb-active){background:#00000008;border-color:#00000014}:host-context(.rv-theme-dark) .rv-thumbnail-item:hover:not(.rv-thumb-active){background:#ffffff0a;border-color:#ffffff14}.rv-thumb-active{border-color:#1976d2;background:#1976d20f}:host-context(.rv-theme-dark) .rv-thumb-active{border-color:#64b5f6;background:#64b5f61a}.rv-thumbnail-preview{width:140px;height:198px;overflow:hidden;border-radius:3px;box-shadow:0 1px 4px #00000026;background:#fff}.rv-thumbnail-scale{transform:scale(.167);transform-origin:top left;width:600%;height:600%;pointer-events:none}.rv-thumb-label{font-size:11px;font-weight:500;color:#666}:host-context(.rv-theme-dark) .rv-thumb-label{color:#a0a0b0}.rv-thumb-active .rv-thumb-label{color:#1976d2;font-weight:600}:host-context(.rv-theme-dark) .rv-thumb-active .rv-thumb-label{color:#64b5f6}.rv-thumb-empty{padding:24px;color:#999;font-size:12px;text-align:center}\n"] }]
99
+ }], propDecorators: { pages: [{
100
+ type: Input
101
+ }], pageWidth: [{
102
+ type: Input
103
+ }], pageHeight: [{
104
+ type: Input
105
+ }], globalStyles: [{
106
+ type: Input
107
+ }], data: [{
108
+ type: Input
109
+ }] } });
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGh1bWJuYWlsLXNpZGViYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwb3J0LXZpZXdlci9zcmMvbGliL3NpZGViYXIvdGh1bWJuYWlsLXNpZGViYXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQzFELE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7QUFpSXRFLE1BQU0sT0FBTyx5QkFBeUI7SUEvSHRDO1FBZ0lXLFVBQUssR0FBZSxFQUFFLENBQUM7UUFDdkIsY0FBUyxHQUFHLEdBQUcsQ0FBQztRQUNoQixlQUFVLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLGlCQUFZLEdBQWlCLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQy9HLFNBQUksR0FBUSxJQUFJLENBQUM7UUFFMUIsaUJBQVksR0FBRyxNQUFNLEVBQVUsQ0FBQztRQUVoQyxVQUFLLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7S0FNcEM7SUFKQyxXQUFXLENBQUMsSUFBWTtRQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDOytHQWRVLHlCQUF5QjttR0FBekIseUJBQXlCLHFQQTFIMUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DVCxvd0NBdENTLFlBQVksK0JBQUUseUJBQXlCLG1IQUFFLG1CQUFtQjs7NEZBNEgzRCx5QkFBeUI7a0JBL0hyQyxTQUFTOytCQUNFLHNCQUFzQixjQUNwQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUseUJBQXlCLEVBQUUsbUJBQW1CLENBQUMsbUJBQ3RELHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DVDs4QkF1RlEsS0FBSztzQkFBYixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIElucHV0LCBpbmplY3QsIG91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBQYWdlRGF0YSwgR2xvYmFsU3R5bGVzIH0gZnJvbSAnLi4vbW9kZWxzL3JlcG9ydC10ZW1wbGF0ZS5tb2RlbCc7XG5pbXBvcnQgeyBWaWV3ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy92aWV3ZXItc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBTaWRlYmFyQ29udGFpbmVyQ29tcG9uZW50IH0gZnJvbSAnLi9zaWRlYmFyLWNvbnRhaW5lci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVwb3J0UGFnZUNvbXBvbmVudCB9IGZyb20gJy4uL2xheW91dC9yZXBvcnQtcGFnZS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdydi10aHVtYm5haWwtc2lkZWJhcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFNpZGViYXJDb250YWluZXJDb21wb25lbnQsIFJlcG9ydFBhZ2VDb21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8cnYtc2lkZWJhci1jb250YWluZXJcbiAgICAgIFtpc09wZW5dPVwic3RhdGUudGh1bWJuYWlsU2lkZWJhck9wZW4oKVwiXG4gICAgICB0aXRsZT1cIlBhZ2VzXCJcbiAgICAgIChjbG9zZWQpPVwic3RhdGUudG9nZ2xlVGh1bWJuYWlsU2lkZWJhcigpXCI+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJydi10aHVtYm5haWwtbGlzdFwiPlxuICAgICAgICBAZm9yIChwYWdlIG9mIHBhZ2VzOyB0cmFjayBwYWdlLmluZGV4KSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJ2LXRodW1ibmFpbC1pdGVtXCJcbiAgICAgICAgICAgICAgIFtjbGFzcy5ydi10aHVtYi1hY3RpdmVdPVwicGFnZS5pbmRleCA9PT0gc3RhdGUuY3VycmVudFBhZ2UoKSAtIDFcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUGFnZUNsaWNrKHBhZ2UuaW5kZXggKyAxKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJ2LXRodW1ibmFpbC1wcmV2aWV3XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi10aHVtYm5haWwtc2NhbGVcIj5cbiAgICAgICAgICAgICAgICA8cnYtcmVwb3J0LXBhZ2VcbiAgICAgICAgICAgICAgICAgIFtwYWdlV2lkdGhdPVwicGFnZVdpZHRoXCJcbiAgICAgICAgICAgICAgICAgIFtwYWdlSGVpZ2h0XT1cInBhZ2VIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgW2hlYWRlclNlY3Rpb25dPVwicGFnZS5oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgW2Zvb3RlclNlY3Rpb25dPVwicGFnZS5mb290ZXJcIlxuICAgICAgICAgICAgICAgICAgW2JvZHlDb21wb25lbnRzXT1cInBhZ2UuY29tcG9uZW50c1wiXG4gICAgICAgICAgICAgICAgICBbZ2xvYmFsU3R5bGVzXT1cImdsb2JhbFN0eWxlc1wiXG4gICAgICAgICAgICAgICAgICBbZGF0YV09XCJkYXRhXCJcbiAgICAgICAgICAgICAgICAgIFtwYWdlTnVtYmVyXT1cInBhZ2UuaW5kZXggKyAxXCJcbiAgICAgICAgICAgICAgICAgIFt0b3RhbFBhZ2VzXT1cInBhZ2VzLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDwvcnYtcmVwb3J0LXBhZ2U+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJ2LXRodW1iLWxhYmVsXCI+e3sgcGFnZS5pbmRleCArIDEgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKCFwYWdlcyB8fCBwYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnYtdGh1bWItZW1wdHlcIj5ObyBwYWdlczwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgIDwvcnYtc2lkZWJhci1jb250YWluZXI+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICAucnYtdGh1bWJuYWlsLWxpc3Qge1xuICAgICAgcGFkZGluZzogMTJweCA4cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDEycHg7XG4gICAgfVxuXG4gICAgLnJ2LXRodW1ibmFpbC1pdGVtIHtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNHB4O1xuICAgICAgcGFkZGluZzogNnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgYm9yZGVyOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTtcbiAgICB9XG5cbiAgICAucnYtdGh1bWJuYWlsLWl0ZW06aG92ZXI6bm90KC5ydi10aHVtYi1hY3RpdmUpIHtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wMyk7XG4gICAgICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wOCk7XG4gICAgfVxuXG4gICAgOmhvc3QtY29udGV4dCgucnYtdGhlbWUtZGFyaykgLnJ2LXRodW1ibmFpbC1pdGVtOmhvdmVyOm5vdCgucnYtdGh1bWItYWN0aXZlKSB7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpO1xuICAgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpO1xuICAgIH1cblxuICAgIC5ydi10aHVtYi1hY3RpdmUge1xuICAgICAgYm9yZGVyLWNvbG9yOiAjMTk3NmQyO1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgyNSwgMTE4LCAyMTAsIDAuMDYpO1xuICAgIH1cblxuICAgIDpob3N0LWNvbnRleHQoLnJ2LXRoZW1lLWRhcmspIC5ydi10aHVtYi1hY3RpdmUge1xuICAgICAgYm9yZGVyLWNvbG9yOiAjNjRiNWY2O1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgxMDAsIDE4MSwgMjQ2LCAwLjEpO1xuICAgIH1cblxuICAgIC5ydi10aHVtYm5haWwtcHJldmlldyB7XG4gICAgICB3aWR0aDogMTQwcHg7XG4gICAgICBoZWlnaHQ6IDE5OHB4OyAvKiBBNCByYXRpbyAoMjEwLzI5NyAqIDE0MCkgKi9cbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBib3JkZXItcmFkaXVzOiAzcHg7XG4gICAgICBib3gtc2hhZG93OiAwIDFweCA0cHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcbiAgICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgIH1cblxuICAgIC5ydi10aHVtYm5haWwtc2NhbGUge1xuICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjE2Nyk7IC8qIDE0MHB4IC8gMjEwbW0gKiB+MC4yNSByb3VnaCBzY2FsZSAqL1xuICAgICAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIGxlZnQ7XG4gICAgICB3aWR0aDogNjAwJTtcbiAgICAgIGhlaWdodDogNjAwJTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIH1cblxuICAgIC5ydi10aHVtYi1sYWJlbCB7XG4gICAgICBmb250LXNpemU6IDExcHg7XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgY29sb3I6ICM2NjY7XG4gICAgfVxuXG4gICAgOmhvc3QtY29udGV4dCgucnYtdGhlbWUtZGFyaykgLnJ2LXRodW1iLWxhYmVsIHtcbiAgICAgIGNvbG9yOiAjYTBhMGIwO1xuICAgIH1cblxuICAgIC5ydi10aHVtYi1hY3RpdmUgLnJ2LXRodW1iLWxhYmVsIHtcbiAgICAgIGNvbG9yOiAjMTk3NmQyO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICB9XG5cbiAgICA6aG9zdC1jb250ZXh0KC5ydi10aGVtZS1kYXJrKSAucnYtdGh1bWItYWN0aXZlIC5ydi10aHVtYi1sYWJlbCB7XG4gICAgICBjb2xvcjogIzY0YjVmNjtcbiAgICB9XG5cbiAgICAucnYtdGh1bWItZW1wdHkge1xuICAgICAgcGFkZGluZzogMjRweDtcbiAgICAgIGNvbG9yOiAjOTk5O1xuICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIH1cbiAgYF1cbn0pXG5leHBvcnQgY2xhc3MgVGh1bWJuYWlsU2lkZWJhckNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHBhZ2VzOiBQYWdlRGF0YVtdID0gW107XG4gIEBJbnB1dCgpIHBhZ2VXaWR0aCA9IDIxMDtcbiAgQElucHV0KCkgcGFnZUhlaWdodCA9IDI5NztcbiAgQElucHV0KCkgZ2xvYmFsU3R5bGVzOiBHbG9iYWxTdHlsZXMgPSB7IGZvbnRGYW1pbHk6ICdBcmlhbCcsIGZvbnRTaXplOiAnMTFweCcsIGNvbG9yOiAnIzAwMCcsIGJhY2tncm91bmRDb2xvcjogJyNmZmYnIH07XG4gIEBJbnB1dCgpIGRhdGE6IGFueSA9IG51bGw7XG5cbiAgcGFnZVNlbGVjdGVkID0gb3V0cHV0PG51bWJlcj4oKTtcblxuICBzdGF0ZSA9IGluamVjdChWaWV3ZXJTdGF0ZVNlcnZpY2UpO1xuXG4gIG9uUGFnZUNsaWNrKHBhZ2U6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUuZ29Ub1BhZ2UocGFnZSk7XG4gICAgdGhpcy5wYWdlU2VsZWN0ZWQuZW1pdChwYWdlKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,155 @@
1
+ import { Component, ChangeDetectionStrategy, Input, inject, output } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { MatIconModule } from '@angular/material/icon';
4
+ import { ViewerStateService } from '../services/viewer-state.service';
5
+ import { SidebarContainerComponent } from './sidebar-container.component';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/material/icon";
8
+ export class TocSidebarComponent {
9
+ constructor() {
10
+ this.pages = [];
11
+ this.pageSelected = output();
12
+ this.state = inject(ViewerStateService);
13
+ this.tocItems = [];
14
+ }
15
+ ngOnChanges(changes) {
16
+ if (changes['pages']) {
17
+ this.buildToc();
18
+ }
19
+ }
20
+ onItemClick(item) {
21
+ this.state.goToPage(item.pageIndex + 1);
22
+ this.pageSelected.emit(item.pageIndex + 1);
23
+ }
24
+ buildToc() {
25
+ this.tocItems = [];
26
+ if (!this.pages || this.pages.length === 0)
27
+ return;
28
+ for (const page of this.pages) {
29
+ const components = [
30
+ ...(page.header?.components || []),
31
+ ...page.components,
32
+ ...(page.footer?.components || []),
33
+ ];
34
+ for (const comp of components) {
35
+ const tocItem = this.componentToTocItem(comp, page.index);
36
+ if (tocItem) {
37
+ this.tocItems.push(tocItem);
38
+ }
39
+ }
40
+ }
41
+ }
42
+ componentToTocItem(comp, pageIndex) {
43
+ // Only create TOC items for text/field components with certain characteristics
44
+ if (comp.type !== 'text' && comp.type !== 'field')
45
+ return null;
46
+ const content = comp.content || '';
47
+ if (!content.trim())
48
+ return null;
49
+ // Detect headings by font size or bold style
50
+ const fontSize = this.parseFontSize(comp.style?.fontSize);
51
+ const isBold = comp.style?.fontWeight === 'bold' || comp.style?.fontWeight === '700';
52
+ const isLarge = fontSize >= 16;
53
+ const isMedium = fontSize >= 13;
54
+ // Only include text that looks like a heading
55
+ if (!isLarge && !isBold)
56
+ return null;
57
+ let level = 2;
58
+ let icon = 'text_fields';
59
+ if (isLarge && isBold) {
60
+ level = 0;
61
+ icon = 'title';
62
+ }
63
+ else if (isLarge) {
64
+ level = 1;
65
+ icon = 'text_fields';
66
+ }
67
+ else if (isBold) {
68
+ level = 2;
69
+ icon = 'short_text';
70
+ }
71
+ // Clean content - remove HTML tags and template tokens
72
+ const label = content
73
+ .replace(/<[^>]*>/g, '')
74
+ .replace(/\{\{[^}]*\}\}/g, '')
75
+ .trim();
76
+ if (!label || label.length < 2)
77
+ return null;
78
+ return {
79
+ id: comp.id,
80
+ label: label.substring(0, 60) + (label.length > 60 ? '...' : ''),
81
+ pageIndex,
82
+ level,
83
+ icon,
84
+ };
85
+ }
86
+ parseFontSize(fontSize) {
87
+ if (!fontSize)
88
+ return 11;
89
+ const match = fontSize.match(/(\d+(?:\.\d+)?)/);
90
+ return match ? parseFloat(match[1]) : 11;
91
+ }
92
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TocSidebarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
93
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: TocSidebarComponent, isStandalone: true, selector: "rv-toc-sidebar", inputs: { pages: "pages" }, outputs: { pageSelected: "pageSelected" }, usesOnChanges: true, ngImport: i0, template: `
94
+ <rv-sidebar-container
95
+ [isOpen]="state.tocSidebarOpen()"
96
+ title="Document Map"
97
+ (closed)="state.toggleTocSidebar()">
98
+
99
+ <div class="rv-toc-tree">
100
+ @for (item of tocItems; track item.id) {
101
+ <div class="rv-toc-item"
102
+ [class.rv-toc-active]="item.pageIndex === state.currentPage() - 1"
103
+ [style.padding-left.px]="12 + item.level * 16"
104
+ (click)="onItemClick(item)">
105
+ <mat-icon class="rv-toc-icon">{{ item.icon }}</mat-icon>
106
+ <span class="rv-toc-label">{{ item.label }}</span>
107
+ <span class="rv-toc-page">{{ item.pageIndex + 1 }}</span>
108
+ </div>
109
+ }
110
+
111
+ @if (tocItems.length === 0) {
112
+ <div class="rv-toc-empty">
113
+ <mat-icon>toc</mat-icon>
114
+ <p>No document structure found</p>
115
+ </div>
116
+ }
117
+ </div>
118
+
119
+ </rv-sidebar-container>
120
+ `, isInline: true, styles: [".rv-toc-tree{padding:8px 0}.rv-toc-item{display:flex;align-items:center;gap:8px;padding:8px 12px;cursor:pointer;font-size:12px;transition:background .12s ease;border-left:3px solid transparent}.rv-toc-item:hover{background:#0000000a}:host-context(.rv-theme-dark) .rv-toc-item:hover{background:#ffffff0a}.rv-toc-active{background:#1976d20f!important;border-left-color:#1976d2}:host-context(.rv-theme-dark) .rv-toc-active{background:#64b5f61a!important;border-left-color:#64b5f6}.rv-toc-icon{font-size:16px!important;width:16px!important;height:16px!important;color:#888;flex-shrink:0}:host-context(.rv-theme-dark) .rv-toc-icon{color:#889}.rv-toc-active .rv-toc-icon{color:#1976d2}:host-context(.rv-theme-dark) .rv-toc-active .rv-toc-icon{color:#64b5f6}.rv-toc-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333}:host-context(.rv-theme-dark) .rv-toc-label{color:#d0d0d8}.rv-toc-active .rv-toc-label{color:#1976d2;font-weight:600}:host-context(.rv-theme-dark) .rv-toc-active .rv-toc-label{color:#64b5f6}.rv-toc-page{font-size:10px;color:#999;flex-shrink:0;min-width:18px;text-align:right}:host-context(.rv-theme-dark) .rv-toc-page{color:#777}.rv-toc-empty{display:flex;flex-direction:column;align-items:center;padding:32px 16px;color:#999;gap:8px}.rv-toc-empty .mat-icon{font-size:32px;width:32px;height:32px;opacity:.4}.rv-toc-empty p{margin:0;font-size:12px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: SidebarContainerComponent, selector: "rv-sidebar-container", inputs: ["isOpen", "title"], outputs: ["closed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
121
+ }
122
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TocSidebarComponent, decorators: [{
123
+ type: Component,
124
+ args: [{ selector: 'rv-toc-sidebar', standalone: true, imports: [CommonModule, MatIconModule, SidebarContainerComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
125
+ <rv-sidebar-container
126
+ [isOpen]="state.tocSidebarOpen()"
127
+ title="Document Map"
128
+ (closed)="state.toggleTocSidebar()">
129
+
130
+ <div class="rv-toc-tree">
131
+ @for (item of tocItems; track item.id) {
132
+ <div class="rv-toc-item"
133
+ [class.rv-toc-active]="item.pageIndex === state.currentPage() - 1"
134
+ [style.padding-left.px]="12 + item.level * 16"
135
+ (click)="onItemClick(item)">
136
+ <mat-icon class="rv-toc-icon">{{ item.icon }}</mat-icon>
137
+ <span class="rv-toc-label">{{ item.label }}</span>
138
+ <span class="rv-toc-page">{{ item.pageIndex + 1 }}</span>
139
+ </div>
140
+ }
141
+
142
+ @if (tocItems.length === 0) {
143
+ <div class="rv-toc-empty">
144
+ <mat-icon>toc</mat-icon>
145
+ <p>No document structure found</p>
146
+ </div>
147
+ }
148
+ </div>
149
+
150
+ </rv-sidebar-container>
151
+ `, styles: [".rv-toc-tree{padding:8px 0}.rv-toc-item{display:flex;align-items:center;gap:8px;padding:8px 12px;cursor:pointer;font-size:12px;transition:background .12s ease;border-left:3px solid transparent}.rv-toc-item:hover{background:#0000000a}:host-context(.rv-theme-dark) .rv-toc-item:hover{background:#ffffff0a}.rv-toc-active{background:#1976d20f!important;border-left-color:#1976d2}:host-context(.rv-theme-dark) .rv-toc-active{background:#64b5f61a!important;border-left-color:#64b5f6}.rv-toc-icon{font-size:16px!important;width:16px!important;height:16px!important;color:#888;flex-shrink:0}:host-context(.rv-theme-dark) .rv-toc-icon{color:#889}.rv-toc-active .rv-toc-icon{color:#1976d2}:host-context(.rv-theme-dark) .rv-toc-active .rv-toc-icon{color:#64b5f6}.rv-toc-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333}:host-context(.rv-theme-dark) .rv-toc-label{color:#d0d0d8}.rv-toc-active .rv-toc-label{color:#1976d2;font-weight:600}:host-context(.rv-theme-dark) .rv-toc-active .rv-toc-label{color:#64b5f6}.rv-toc-page{font-size:10px;color:#999;flex-shrink:0;min-width:18px;text-align:right}:host-context(.rv-theme-dark) .rv-toc-page{color:#777}.rv-toc-empty{display:flex;flex-direction:column;align-items:center;padding:32px 16px;color:#999;gap:8px}.rv-toc-empty .mat-icon{font-size:32px;width:32px;height:32px;opacity:.4}.rv-toc-empty p{margin:0;font-size:12px}\n"] }]
152
+ }], propDecorators: { pages: [{
153
+ type: Input
154
+ }] } });
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9jLXNpZGViYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwb3J0LXZpZXdlci9zcmMvbGliL3NpZGViYXIvdG9jLXNpZGViYXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQzFELE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sK0JBQStCLENBQUM7OztBQWdKMUUsTUFBTSxPQUFPLG1CQUFtQjtJQTlJaEM7UUErSVcsVUFBSyxHQUFlLEVBQUUsQ0FBQztRQUVoQyxpQkFBWSxHQUFHLE1BQU0sRUFBVSxDQUFDO1FBRWhDLFVBQUssR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUVuQyxhQUFRLEdBQWMsRUFBRSxDQUFDO0tBc0YxQjtJQXBGQyxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsSUFBYTtRQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVPLFFB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Q0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEUsU0FBUztZQUNULEtBQUs7WUFDTCxJQUFJO1NBQ0wsQ0FBQztJQUNKLENBQUM7SUFFTyxhQUFhLENBQUMsUUFBNEI7UUFDaEQsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN6QixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEQsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzNDLENBQUM7K0dBNUZVLG1CQUFtQjttR0FBbkIsbUJBQW1CLHNLQXpJcEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCVCx1N0NBN0JTLFlBQVksOEJBQUUsYUFBYSxvTEFBRSx5QkFBeUI7OzRGQTJJckQsbUJBQW1CO2tCQTlJL0IsU0FBUzsrQkFDRSxnQkFBZ0IsY0FDZCxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLHlCQUF5QixDQUFDLG1CQUNoRCx1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQlQ7OEJBK0dRLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIElucHV0LCBpbmplY3QsIG91dHB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IENvbXBvbmVudE1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL2NvbXBvbmVudC5tb2RlbCc7XG5pbXBvcnQgeyBQYWdlRGF0YSwgVG9jSXRlbSB9IGZyb20gJy4uL21vZGVscy9yZXBvcnQtdGVtcGxhdGUubW9kZWwnO1xuaW1wb3J0IHsgVmlld2VyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdmlld2VyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2lkZWJhckNvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4vc2lkZWJhci1jb250YWluZXIuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnYtdG9jLXNpZGViYXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBTaWRlYmFyQ29udGFpbmVyQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHJ2LXNpZGViYXItY29udGFpbmVyXG4gICAgICBbaXNPcGVuXT1cInN0YXRlLnRvY1NpZGViYXJPcGVuKClcIlxuICAgICAgdGl0bGU9XCJEb2N1bWVudCBNYXBcIlxuICAgICAgKGNsb3NlZCk9XCJzdGF0ZS50b2dnbGVUb2NTaWRlYmFyKClcIj5cblxuICAgICAgPGRpdiBjbGFzcz1cInJ2LXRvYy10cmVlXCI+XG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgdG9jSXRlbXM7IHRyYWNrIGl0ZW0uaWQpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnYtdG9jLWl0ZW1cIlxuICAgICAgICAgICAgICAgW2NsYXNzLnJ2LXRvYy1hY3RpdmVdPVwiaXRlbS5wYWdlSW5kZXggPT09IHN0YXRlLmN1cnJlbnRQYWdlKCkgLSAxXCJcbiAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nLWxlZnQucHhdPVwiMTIgKyBpdGVtLmxldmVsICogMTZcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uSXRlbUNsaWNrKGl0ZW0pXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJydi10b2MtaWNvblwiPnt7IGl0ZW0uaWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJ2LXRvYy1sYWJlbFwiPnt7IGl0ZW0ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJ2LXRvYy1wYWdlXCI+e3sgaXRlbS5wYWdlSW5kZXggKyAxIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmICh0b2NJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnYtdG9jLWVtcHR5XCI+XG4gICAgICAgICAgICA8bWF0LWljb24+dG9jPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxwPk5vIGRvY3VtZW50IHN0cnVjdHVyZSBmb3VuZDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICA8L3J2LXNpZGViYXItY29udGFpbmVyPlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLnJ2LXRvYy10cmVlIHtcbiAgICAgIHBhZGRpbmc6IDhweCAwO1xuICAgIH1cblxuICAgIC5ydi10b2MtaXRlbSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogOHB4O1xuICAgICAgcGFkZGluZzogOHB4IDEycHg7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTJzIGVhc2U7XG4gICAgICBib3JkZXItbGVmdDogM3B4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIH1cblxuICAgIC5ydi10b2MtaXRlbTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDQpO1xuICAgIH1cblxuICAgIDpob3N0LWNvbnRleHQoLnJ2LXRoZW1lLWRhcmspIC5ydi10b2MtaXRlbTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpO1xuICAgIH1cblxuICAgIC5ydi10b2MtYWN0aXZlIHtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjUsIDExOCwgMjEwLCAwLjA2KSAhaW1wb3J0YW50O1xuICAgICAgYm9yZGVyLWxlZnQtY29sb3I6ICMxOTc2ZDI7XG4gICAgfVxuXG4gICAgOmhvc3QtY29udGV4dCgucnYtdGhlbWUtZGFyaykgLnJ2LXRvYy1hY3RpdmUge1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgxMDAsIDE4MSwgMjQ2LCAwLjEpICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItbGVmdC1jb2xvcjogIzY0YjVmNjtcbiAgICB9XG5cbiAgICAucnYtdG9jLWljb24ge1xuICAgICAgZm9udC1zaXplOiAxNnB4ICFpbXBvcnRhbnQ7XG4gICAgICB3aWR0aDogMTZweCAhaW1wb3J0YW50O1xuICAgICAgaGVpZ2h0OiAxNnB4ICFpbXBvcnRhbnQ7XG4gICAgICBjb2xvcjogIzg4ODtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cblxuICAgIDpob3N0LWNvbnRleHQoLnJ2LXRoZW1lLWRhcmspIC5ydi10b2MtaWNvbiB7XG4gICAgICBjb2xvcjogIzg4ODg5OTtcbiAgICB9XG5cbiAgICAucnYtdG9jLWFjdGl2ZSAucnYtdG9jLWljb24ge1xuICAgICAgY29sb3I6ICMxOTc2ZDI7XG4gICAgfVxuXG4gICAgOmhvc3QtY29udGV4dCgucnYtdGhlbWUtZGFyaykgLnJ2LXRvYy1hY3RpdmUgLnJ2LXRvYy1pY29uIHtcbiAgICAgIGNvbG9yOiAjNjRiNWY2O1xuICAgIH1cblxuICAgIC5ydi10b2MtbGFiZWwge1xuICAgICAgZmxleDogMTtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBjb2xvcjogIzMzMztcbiAgICB9XG5cbiAgICA6aG9zdC1jb250ZXh0KC5ydi10aGVtZS1kYXJrKSAucnYtdG9jLWxhYmVsIHtcbiAgICAgIGNvbG9yOiAjZDBkMGQ4O1xuICAgIH1cblxuICAgIC5ydi10b2MtYWN0aXZlIC5ydi10b2MtbGFiZWwge1xuICAgICAgY29sb3I6ICMxOTc2ZDI7XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgIH1cblxuICAgIDpob3N0LWNvbnRleHQoLnJ2LXRoZW1lLWRhcmspIC5ydi10b2MtYWN0aXZlIC5ydi10b2MtbGFiZWwge1xuICAgICAgY29sb3I6ICM2NGI1ZjY7XG4gICAgfVxuXG4gICAgLnJ2LXRvYy1wYWdlIHtcbiAgICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICAgIGNvbG9yOiAjOTk5O1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICBtaW4td2lkdGg6IDE4cHg7XG4gICAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICB9XG5cbiAgICA6aG9zdC1jb250ZXh0KC5ydi10aGVtZS1kYXJrKSAucnYtdG9jLXBhZ2Uge1xuICAgICAgY29sb3I6ICM3Nzc7XG4gICAgfVxuXG4gICAgLnJ2LXRvYy1lbXB0eSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiAzMnB4IDE2cHg7XG4gICAgICBjb2xvcjogIzk5OTtcbiAgICAgIGdhcDogOHB4O1xuICAgIH1cblxuICAgIC5ydi10b2MtZW1wdHkgLm1hdC1pY29uIHtcbiAgICAgIGZvbnQtc2l6ZTogMzJweDtcbiAgICAgIHdpZHRoOiAzMnB4O1xuICAgICAgaGVpZ2h0OiAzMnB4O1xuICAgICAgb3BhY2l0eTogMC40O1xuICAgIH1cblxuICAgIC5ydi10b2MtZW1wdHkgcCB7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBmb250LXNpemU6IDEycHg7XG4gICAgfVxuICBgXVxufSlcbmV4cG9ydCBjbGFzcyBUb2NTaWRlYmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgcGFnZXM6IFBhZ2VEYXRhW10gPSBbXTtcblxuICBwYWdlU2VsZWN0ZWQgPSBvdXRwdXQ8bnVtYmVyPigpO1xuXG4gIHN0YXRlID0gaW5qZWN0KFZpZXdlclN0YXRlU2VydmljZSk7XG5cbiAgdG9jSXRlbXM6IFRvY0l0ZW1bXSA9IFtdO1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sncGFnZXMnXSkge1xuICAgICAgdGhpcy5idWlsZFRvYygpO1xuICAgIH1cbiAgfVxuXG4gIG9uSXRlbUNsaWNrKGl0ZW06IFRvY0l0ZW0pOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlLmdvVG9QYWdlKGl0ZW0ucGFnZUluZGV4ICsgMSk7XG4gICAgdGhpcy5wYWdlU2VsZWN0ZWQuZW1pdChpdGVtLnBhZ2VJbmRleCArIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRvYygpOiB2b2lkIHtcbiAgICB0aGlzLnRvY0l0ZW1zID0gW107XG5cbiAgICBpZiAoIXRoaXMucGFnZXMgfHwgdGhpcy5wYWdlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgcGFnZSBvZiB0aGlzLnBhZ2VzKSB7XG4gICAgICBjb25zdCBjb21wb25lbnRzID0gW1xuICAgICAgICAuLi4ocGFnZS5oZWFkZXI/LmNvbXBvbmVudHMgfHwgW10pLFxuICAgICAgICAuLi5wYWdlLmNvbXBvbmVudHMsXG4gICAgICAgIC4uLihwYWdlLmZvb3Rlcj8uY29tcG9uZW50cyB8fCBbXSksXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGNvbnN0IGNvbXAgb2YgY29tcG9uZW50cykge1xuICAgICAgICBjb25zdCB0b2NJdGVtID0gdGhpcy5jb21wb25lbnRUb1RvY0l0ZW0oY29tcCwgcGFnZS5pbmRleCk7XG4gICAgICAgIGlmICh0b2NJdGVtKSB7XG4gICAgICAgICAgdGhpcy50b2NJdGVtcy5wdXNoKHRvY0l0ZW0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb21wb25lbnRUb1RvY0l0ZW0oY29tcDogQ29tcG9uZW50TW9kZWwsIHBhZ2VJbmRleDogbnVtYmVyKTogVG9jSXRlbSB8IG51bGwge1xuICAgIC8vIE9ubHkgY3JlYXRlIFRPQyBpdGVtcyBmb3IgdGV4dC9maWVsZCBjb21wb25lbnRzIHdpdGggY2VydGFpbiBjaGFyYWN0ZXJpc3RpY3NcbiAgICBpZiAoY29tcC50eXBlICE9PSAndGV4dCcgJiYgY29tcC50eXBlICE9PSAnZmllbGQnKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBjb21wLmNvbnRlbnQgfHwgJyc7XG4gICAgaWYgKCFjb250ZW50LnRyaW0oKSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBEZXRlY3QgaGVhZGluZ3MgYnkgZm9udCBzaXplIG9yIGJvbGQgc3R5bGVcbiAgICBjb25zdCBmb250U2l6ZSA9IHRoaXMucGFyc2VGb250U2l6ZShjb21wLnN0eWxlPy5mb250U2l6ZSk7XG4gICAgY29uc3QgaXNCb2xkID0gY29tcC5zdHlsZT8uZm9udFdlaWdodCA9PT0gJ2JvbGQnIHx8IGNvbXAuc3R5bGU/LmZvbnRXZWlnaHQgPT09ICc3MDAnO1xuICAgIGNvbnN0IGlzTGFyZ2UgPSBmb250U2l6ZSA+PSAxNjtcbiAgICBjb25zdCBpc01lZGl1bSA9IGZvbnRTaXplID49IDEzO1xuXG4gICAgLy8gT25seSBpbmNsdWRlIHRleHQgdGhhdCBsb29rcyBsaWtlIGEgaGVhZGluZ1xuICAgIGlmICghaXNMYXJnZSAmJiAhaXNCb2xkKSByZXR1cm4gbnVsbDtcblxuICAgIGxldCBsZXZlbCA9IDI7XG4gICAgbGV0IGljb24gPSAndGV4dF9maWVsZHMnO1xuXG4gICAgaWYgKGlzTGFyZ2UgJiYgaXNCb2xkKSB7XG4gICAgICBsZXZlbCA9IDA7XG4gICAgICBpY29uID0gJ3RpdGxlJztcbiAgICB9IGVsc2UgaWYgKGlzTGFyZ2UpIHtcbiAgICAgIGxldmVsID0gMTtcbiAgICAgIGljb24gPSAndGV4dF9maWVsZHMnO1xuICAgIH0gZWxzZSBpZiAoaXNCb2xkKSB7XG4gICAgICBsZXZlbCA9IDI7XG4gICAgICBpY29uID0gJ3Nob3J0X3RleHQnO1xuICAgIH1cblxuICAgIC8vIENsZWFuIGNvbnRlbnQgLSByZW1vdmUgSFRNTCB0YWdzIGFuZCB0ZW1wbGF0ZSB0b2tlbnNcbiAgICBjb25zdCBsYWJlbCA9IGNvbnRlbnRcbiAgICAgIC5yZXBsYWNlKC88W14+XSo+L2csICcnKVxuICAgICAgLnJlcGxhY2UoL1xce1xce1tefV0qXFx9XFx9L2csICcnKVxuICAgICAgLnRyaW0oKTtcblxuICAgIGlmICghbGFiZWwgfHwgbGFiZWwubGVuZ3RoIDwgMikgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGNvbXAuaWQsXG4gICAgICBsYWJlbDogbGFiZWwuc3Vic3RyaW5nKDAsIDYwKSArIChsYWJlbC5sZW5ndGggPiA2MCA/ICcuLi4nIDogJycpLFxuICAgICAgcGFnZUluZGV4LFxuICAgICAgbGV2ZWwsXG4gICAgICBpY29uLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHBhcnNlRm9udFNpemUoZm9udFNpemU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gICAgaWYgKCFmb250U2l6ZSkgcmV0dXJuIDExO1xuICAgIGNvbnN0IG1hdGNoID0gZm9udFNpemUubWF0Y2goLyhcXGQrKD86XFwuXFxkKyk/KS8pO1xuICAgIHJldHVybiBtYXRjaCA/IHBhcnNlRmxvYXQobWF0Y2hbMV0pIDogMTE7XG4gIH1cbn1cbiJdfQ==