@design.estate/dees-document 1.0.91

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 (78) hide show
  1. package/dist_bundle/bundle.js +865 -0
  2. package/dist_bundle/bundle.js.map +7 -0
  3. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  4. package/dist_ts/00_commitinfo_data.js +9 -0
  5. package/dist_ts/classes.pdfservice.d.ts +23 -0
  6. package/dist_ts/classes.pdfservice.js +39 -0
  7. package/dist_ts/helpers.d.ts +1 -0
  8. package/dist_ts/helpers.js +6 -0
  9. package/dist_ts/index.d.ts +2 -0
  10. package/dist_ts/index.js +3 -0
  11. package/dist_ts/paths.d.ts +4 -0
  12. package/dist_ts/paths.js +7 -0
  13. package/dist_ts/plugins.d.ts +9 -0
  14. package/dist_ts/plugins.js +13 -0
  15. package/dist_ts_web/00_commitinfo_data.d.ts +8 -0
  16. package/dist_ts_web/00_commitinfo_data.js +9 -0
  17. package/dist_ts_web/elements/contentinvoice.d.ts +34 -0
  18. package/dist_ts_web/elements/contentinvoice.js +335 -0
  19. package/dist_ts_web/elements/document.d.ts +20 -0
  20. package/dist_ts_web/elements/document.js +157 -0
  21. package/dist_ts_web/elements/index.d.ts +8 -0
  22. package/dist_ts_web/elements/index.js +9 -0
  23. package/dist_ts_web/elements/letterheader.d.ts +16 -0
  24. package/dist_ts_web/elements/letterheader.js +123 -0
  25. package/dist_ts_web/elements/page.d.ts +19 -0
  26. package/dist_ts_web/elements/page.js +144 -0
  27. package/dist_ts_web/elements/pagecontainer.d.ts +14 -0
  28. package/dist_ts_web/elements/pagecontainer.js +66 -0
  29. package/dist_ts_web/elements/pagecontent.d.ts +18 -0
  30. package/dist_ts_web/elements/pagecontent.js +144 -0
  31. package/dist_ts_web/elements/pagefooter.d.ts +16 -0
  32. package/dist_ts_web/elements/pagefooter.js +130 -0
  33. package/dist_ts_web/elements/pageheader.d.ts +16 -0
  34. package/dist_ts_web/elements/pageheader.js +95 -0
  35. package/dist_ts_web/elements/shared/demoletter.d.ts +2 -0
  36. package/dist_ts_web/elements/shared/demoletter.js +117 -0
  37. package/dist_ts_web/elements/shared/index.d.ts +5 -0
  38. package/dist_ts_web/elements/shared/index.js +6 -0
  39. package/dist_ts_web/index.d.ts +1 -0
  40. package/dist_ts_web/index.js +2 -0
  41. package/dist_ts_web/pages/index.d.ts +2 -0
  42. package/dist_ts_web/pages/index.js +3 -0
  43. package/dist_ts_web/pages/page1.d.ts +1 -0
  44. package/dist_ts_web/pages/page1.js +18 -0
  45. package/dist_ts_web/pages/page2.d.ts +1 -0
  46. package/dist_ts_web/pages/page2.js +5 -0
  47. package/dist_ts_web/plugins.d.ts +7 -0
  48. package/dist_ts_web/plugins.js +11 -0
  49. package/dist_watch/bundle.js +21871 -0
  50. package/dist_watch/bundle.js.map +7 -0
  51. package/dist_watch/index.html +28 -0
  52. package/license +19 -0
  53. package/npmextra.json +20 -0
  54. package/package.json +65 -0
  55. package/readme.md +7 -0
  56. package/ts/00_commitinfo_data.ts +8 -0
  57. package/ts/classes.pdfservice.ts +51 -0
  58. package/ts/helpers.ts +6 -0
  59. package/ts/index.ts +2 -0
  60. package/ts/paths.ts +9 -0
  61. package/ts/plugins.ts +26 -0
  62. package/ts_web/00_commitinfo_data.ts +8 -0
  63. package/ts_web/elements/contentinvoice.ts +385 -0
  64. package/ts_web/elements/document.ts +168 -0
  65. package/ts_web/elements/index.ts +8 -0
  66. package/ts_web/elements/letterheader.ts +125 -0
  67. package/ts_web/elements/page.ts +142 -0
  68. package/ts_web/elements/pagecontainer.ts +69 -0
  69. package/ts_web/elements/pagecontent.ts +147 -0
  70. package/ts_web/elements/pagefooter.ts +132 -0
  71. package/ts_web/elements/pageheader.ts +96 -0
  72. package/ts_web/elements/shared/demoletter.ts +121 -0
  73. package/ts_web/elements/shared/index.ts +6 -0
  74. package/ts_web/index.ts +1 -0
  75. package/ts_web/pages/index.ts +2 -0
  76. package/ts_web/pages/page1.ts +18 -0
  77. package/ts_web/pages/page2.ts +5 -0
  78. package/ts_web/plugins.ts +15 -0
@@ -0,0 +1,168 @@
1
+ import {
2
+ DeesElement,
3
+ property,
4
+ html,
5
+ customElement,
6
+ type TemplateResult,
7
+ css,
8
+ state,
9
+ cssManager,
10
+ unsafeCSS,
11
+ domtools,
12
+ } from '@design.estate/dees-element';
13
+
14
+ import * as plugins from '../plugins.js';
15
+
16
+
17
+ import { DePage } from './page.js';
18
+ import { DeContentInvoice } from './contentinvoice.js';
19
+
20
+ import * as shared from './shared/index.js';
21
+
22
+ declare global {
23
+ interface HTMLElementTagNameMap {
24
+ 'dedocument-dedocument': DeDocument;
25
+ }
26
+ }
27
+
28
+ @customElement('dedocument-dedocument')
29
+ export class DeDocument extends DeesElement {
30
+ public static demo = () => html`
31
+ <dedocument-dedocument .format="${'a4'}" .letterData=${shared.demoLetter}></dedocument-dedocument>
32
+ `;
33
+
34
+ @property({
35
+ type: String,
36
+ })
37
+ public format: 'a4' = 'a4';
38
+
39
+ @property({
40
+ type: Number,
41
+ })
42
+ public viewWidth: number = shared.a4Width;
43
+
44
+ @property({
45
+ type: Boolean,
46
+ })
47
+ printMode = false;
48
+
49
+ @property({
50
+ type: Object,
51
+ reflect: true,
52
+ converter: (valueArg) => {
53
+ if (typeof valueArg === 'string') {
54
+ return plugins.smartjson.parseBase64(valueArg)
55
+ } else {
56
+ return valueArg;
57
+ }
58
+ },
59
+
60
+ })
61
+ public letterData: plugins.tsclass.business.ILetter;
62
+
63
+ @property({
64
+ type: String,
65
+ })
66
+ public letterDataUrl: string;
67
+
68
+ constructor() {
69
+ super();
70
+ domtools.DomTools.setupDomTools();
71
+ }
72
+
73
+ public static styles = [
74
+ domtools.elementBasic.staticStyles,
75
+ css`
76
+ :host {
77
+ display: block;
78
+ color: #333;
79
+ padding: 0px;
80
+ position: relative;
81
+ }
82
+
83
+ .betweenPagesSpacer {
84
+ height: 20px;
85
+ }
86
+ `,
87
+ ];
88
+
89
+ public render(): TemplateResult {
90
+ return html`
91
+ <style>
92
+ :host {
93
+ transform-origin: top left;
94
+ transform: ${this.viewWidth
95
+ ? unsafeCSS(
96
+ `scale(${this.viewWidth / shared.a4Width}, ${this.viewWidth / shared.a4Width})`
97
+ )
98
+ : unsafeCSS('')};
99
+ }
100
+ </style>
101
+ <div class="scaleport"></div>
102
+ `;
103
+ }
104
+
105
+ public async firstUpdated(_changedProperties: Map<string | number | symbol, unknown>) {
106
+ if (this.letterDataUrl) {
107
+ const response = await fetch(this.letterDataUrl);
108
+ this.letterData = await response.json();
109
+ }
110
+ this.renderDocument();
111
+ }
112
+
113
+ public async renderDocument() {
114
+ const domtools = await this.domtoolsPromise;
115
+ const scaleport = this.shadowRoot.querySelector('.scaleport');
116
+ let pages: DePage[] = [];
117
+ let pageCounter = 0;
118
+ let complete = false;
119
+ const content: DeContentInvoice = document.createElement(
120
+ 'dedocument-contentinvoice'
121
+ ) as DeContentInvoice;
122
+ content.letterData = this.letterData;
123
+ document.body.appendChild(content);
124
+ await domtools.convenience.smartdelay.delayFor(0);
125
+ let overallContentOffset: number = 0;
126
+ let currentContentOffset: number;
127
+ let trimmed: number;
128
+ while (!complete) {
129
+ pageCounter++;
130
+ const currentContent = content.cloneNode(true) as DeContentInvoice;
131
+ const newPage = new DePage();
132
+ newPage.printMode = this.printMode;
133
+ newPage.letterData = this.letterData;
134
+ pages.push(newPage);
135
+ newPage.pageNumber = pageCounter;
136
+ newPage.append(currentContent);
137
+ newPage.pageTotalNumber = pageCounter;
138
+ scaleport.append(newPage);
139
+ // betweenPagesSpacer
140
+ if (!this.printMode) {
141
+ const betweenPagesSpacerDiv = document.createElement('div');
142
+ betweenPagesSpacerDiv.classList.add('betweenPagesSpacer');
143
+ scaleport.append(betweenPagesSpacerDiv);
144
+ }
145
+ await currentContent.elementDomReady;
146
+ await currentContent.trimStartToOffset(overallContentOffset);
147
+ let newPageOverflows = await newPage.checkOverflow();
148
+ trimmed = 0;
149
+ while (newPageOverflows) {
150
+ await currentContent.trimEndByOne();
151
+ trimmed++;
152
+ newPageOverflows = await newPage.checkOverflow();
153
+ }
154
+ currentContentOffset = await currentContent.getContentLength();
155
+ overallContentOffset = overallContentOffset + currentContentOffset;
156
+ if (trimmed === 0) {
157
+ complete = true;
158
+ }
159
+ // complete = true;
160
+ console.log(currentContentOffset);
161
+ }
162
+ document.body.removeChild(content);
163
+
164
+ for (const page of pages) {
165
+ page.pageTotalNumber = pageCounter;
166
+ }
167
+ }
168
+ }
@@ -0,0 +1,8 @@
1
+ export * from './contentinvoice.js';
2
+ export * from './document.js';
3
+ export * from './letterheader.js';
4
+ export * from './page.js';
5
+ export * from './pagecontainer.js';
6
+ export * from './pagecontent.js';
7
+ export * from './pagefooter.js';
8
+ export * from './pageheader.js';
@@ -0,0 +1,125 @@
1
+ import {
2
+ DeesElement,
3
+ property,
4
+ html,
5
+ customElement,
6
+ type TemplateResult,
7
+ css,
8
+ cssManager,
9
+ unsafeCSS,
10
+ } from '@design.estate/dees-element';
11
+ import * as domtools from '@design.estate/dees-domtools';
12
+
13
+ import * as shared from './shared/index.js';
14
+ import * as tsclass from '@tsclass/tsclass';
15
+
16
+ declare global {
17
+ interface HTMLElementTagNameMap {
18
+ 'dedocument-letterheader': DeLetterHeader;
19
+ }
20
+ }
21
+
22
+ @customElement('dedocument-letterheader')
23
+ export class DeLetterHeader extends DeesElement {
24
+ public static demo = () => html`
25
+ <dedocument-letterheader .format="${'a4'}" .letterData=${shared.demoLetter}></dedocument-letterheader>
26
+ `;
27
+
28
+ @property({
29
+ type: Object,
30
+ reflect: true
31
+ })
32
+ public letterData: tsclass.business.ILetter;
33
+
34
+ @property({
35
+ type: Number,
36
+ reflect: true,
37
+ })
38
+ public pageNumber: number = 1;
39
+
40
+ @property({
41
+ type: Number,
42
+ reflect: true,
43
+ })
44
+ public pageTotalNumber: number = 1;
45
+
46
+ constructor() {
47
+ super();
48
+ domtools.DomTools.setupDomTools();
49
+ }
50
+
51
+ public static styles = [
52
+ domtools.elementBasic.staticStyles,
53
+ css`
54
+ :host {
55
+ color: #333;
56
+ }
57
+
58
+ .recepientInfo {
59
+ position: absolute;
60
+ display: block;
61
+ overflow: hidden;
62
+ top: 200px;
63
+ right: ${unsafeCSS(shared.rightMargin + 'px')};
64
+ width: 200px;
65
+ text-align: right;
66
+ }
67
+ .recepientInfo .label {
68
+ margin-top: 10px;
69
+ margin-bottom: 3px;
70
+ font-size: 10px;
71
+ font-weight: bold;
72
+ }
73
+
74
+ .date {
75
+ position: absolute;
76
+ top: 180px;
77
+ right: ${unsafeCSS(shared.rightMargin + 'px')};
78
+ text-align: right;
79
+ }
80
+
81
+ .address {
82
+ position: absolute;
83
+ top: 180px;
84
+ left: ${unsafeCSS(shared.leftMargin + 'px')};
85
+ }
86
+
87
+ .address .from {
88
+ font-size: 10px;
89
+ }
90
+
91
+ .address .to {
92
+ margin-top: 10px;
93
+ }
94
+ `,
95
+ ];
96
+
97
+ public render(): TemplateResult {
98
+ return html`
99
+ <div class="date">
100
+ ${new Date(this.letterData.date).getDate()}. ${new Date(this.letterData.date).toLocaleString('default', { month: 'long' })}
101
+ ${new Date(this.letterData.date).getFullYear()}
102
+ </div>
103
+ <div class="address">
104
+ <div class="from">
105
+ ${this.letterData.from.name}, ${this.letterData.from.address.streetName}
106
+ ${this.letterData.from.address.houseNumber}, ${this.letterData.from.address.postalCode}
107
+ ${this.letterData.from.address.city}, ${this.letterData.from.address.country}
108
+ </div>
109
+ <div class="to">
110
+ ${this.letterData.to.name}<br />
111
+ ${this.letterData.to.address.streetName} ${this.letterData.to.address.houseNumber}<br />
112
+ ${this.letterData.to.address.postalCode} ${this.letterData.to.address.city}<br />
113
+ ${this.letterData.from.address.country}
114
+ </div>
115
+ </div>
116
+ <div class="recepientInfo">
117
+ <div class="label">your customer id:</div>
118
+ ${this.letterData.to.customerNumber || 'not registered'}
119
+
120
+ <div class="label">your vat id on file:</div>
121
+ ${this.letterData.to.vatId || 'not provided'}
122
+ </div>
123
+ `;
124
+ }
125
+ }
@@ -0,0 +1,142 @@
1
+ import * as tsclass from '@tsclass/tsclass';
2
+ import {
3
+ DeesElement,
4
+ property,
5
+ html,
6
+ customElement,
7
+ type TemplateResult,
8
+ css,
9
+ cssManager,
10
+ unsafeCSS,
11
+ } from '@design.estate/dees-element';
12
+ import * as domtools from '@design.estate/dees-domtools';
13
+
14
+ import * as shared from './shared/index.js';
15
+
16
+ declare global {
17
+ interface HTMLElementTagNameMap {
18
+ 'dedocument-page': DePage;
19
+ }
20
+ }
21
+
22
+ @customElement('dedocument-page')
23
+ export class DePage extends DeesElement {
24
+ public static demo = () => html` <dedocument-page .format="${'a4'}"></dedocument-page> `;
25
+
26
+ @property({
27
+ type: String,
28
+ })
29
+ public format: 'a4' = 'a4';
30
+
31
+ @property({
32
+ type: Number,
33
+ })
34
+ public pageNumber: number = 1;
35
+
36
+ @property({
37
+ type: Number,
38
+ })
39
+ public pageTotalNumber: number = 1;
40
+
41
+ @property({
42
+ type: Object,
43
+ })
44
+ public letterData: tsclass.business.ILetter = shared.demoLetter;
45
+
46
+ @property({
47
+ type: Boolean,
48
+ reflect: true,
49
+ })
50
+ printMode = false;
51
+
52
+ constructor() {
53
+ super();
54
+ domtools.DomTools.setupDomTools();
55
+ }
56
+
57
+ public static styles = [
58
+ domtools.elementBasic.staticStyles,
59
+ css`
60
+ :host {
61
+ }
62
+ .versionOverlay {
63
+ pointer-events: none;
64
+ position: absolute;
65
+ top: 0px;
66
+ left: 0px;
67
+ right: 0px;
68
+ bottom: 0px;
69
+ font-family: monospace;
70
+ font-size: 16px;
71
+
72
+ z-index: 1000;
73
+ display: flex;
74
+ justify-content: center;
75
+ align-items: center;
76
+ }
77
+
78
+ .topInfo {
79
+ position: absolute;
80
+ top: 60px;
81
+ left: 40px;
82
+ color: red;
83
+ transform: rotate(-5deg);
84
+ }
85
+
86
+ .bigDraftText {
87
+ transform: rotate(-45deg);
88
+ font-size: 200px;
89
+ opacity: 0.05;
90
+ }
91
+ `,
92
+ ];
93
+
94
+ public render(): TemplateResult {
95
+ return html`
96
+ <dedocument-pagecontainer .printMode=${this.printMode}>
97
+ <dedocument-pageheader
98
+ .letterData=${this.letterData}
99
+ .pageNumber="${this.pageNumber}"
100
+ .pageTotalNumber="${this.pageTotalNumber}"
101
+ ></dedocument-pageheader>
102
+ ${this.pageNumber === 1
103
+ ? html`
104
+ <dedocument-letterheader
105
+ .pageNumber="${this.pageNumber}"
106
+ .letterData=${this.letterData}
107
+ .pageTotalNumber="${this.pageTotalNumber}"
108
+ ></dedocument-letterheader>
109
+ `
110
+ : html``}
111
+ <dedocument-pagecontent
112
+ .pageNumber="${this.pageNumber}"
113
+ .pageTotalNumber="${this.pageTotalNumber}"
114
+ .letterData=${this.letterData}
115
+ ><slot></slot
116
+ ></dedocument-pagecontent>
117
+ <dedocument-pagefooter
118
+ .letterData=${this.letterData}
119
+ .pageNumber="${this.pageNumber}"
120
+ .pageTotalNumber="${this.pageTotalNumber}"
121
+ ></dedocument-pagefooter>
122
+ <div class="versionOverlay">
123
+ ${this.letterData.versionInfo.type === 'draft'
124
+ ? html`
125
+ <div class="topInfo">
126
+ Please note: THIS IS A DRAFT ONLY. NO RIGHTS CAN BE DERIVED FROM THIS.<br>
127
+ -> Revision/Document version: ${this.letterData.versionInfo.version}
128
+ </div>
129
+ <div class="bigDraftText">DRAFT</div>
130
+ `
131
+ : html``}
132
+ </div>
133
+ </dedocument-pagecontainer>
134
+ `;
135
+ }
136
+
137
+ public async checkOverflow() {
138
+ await this.elementDomReady;
139
+ const pageContent = this.shadowRoot.querySelector('dedocument-pagecontent');
140
+ return pageContent.checkOverflow();
141
+ }
142
+ }
@@ -0,0 +1,69 @@
1
+ import {
2
+ DeesElement,
3
+ property,
4
+ html,
5
+ customElement,
6
+ type TemplateResult,
7
+ css,
8
+ cssManager,
9
+ unsafeCSS,
10
+ } from '@design.estate/dees-element';
11
+ import * as domtools from '@design.estate/dees-domtools';
12
+
13
+ import * as shared from './shared/index.js';
14
+
15
+ declare global {
16
+ interface HTMLElementTagNameMap {
17
+ 'dedocument-pagecontainer': DePageContainer;
18
+ }
19
+ }
20
+
21
+ @customElement('dedocument-pagecontainer')
22
+ export class DePageContainer extends DeesElement {
23
+ public static demo = () => html`
24
+ <dedocument-pagecontainer .format="${'a4'}"></dedocument-pagecontainer>
25
+ `;
26
+
27
+ @property({
28
+ type: String,
29
+ })
30
+ public format: 'a4' = 'a4';
31
+
32
+ @property({
33
+ type: Boolean,
34
+ })
35
+ public printMode = false;
36
+
37
+ constructor() {
38
+ super();
39
+ domtools.DomTools.setupDomTools();
40
+ }
41
+
42
+ public static styles = [
43
+ domtools.elementBasic.staticStyles,
44
+ css`
45
+ :host {
46
+ display: block;
47
+ background: white;
48
+ color: #333;
49
+ padding: 0px;
50
+ width: ${unsafeCSS(shared.a4Width + 'px')};
51
+ height: ${unsafeCSS(shared.a4Height + 'px')};
52
+ position: relative;
53
+ border-radius: 3px;
54
+ overflow: hidden;
55
+ }
56
+ `,
57
+ ];
58
+
59
+ public render(): TemplateResult {
60
+ return html`
61
+ <style>
62
+ :host {
63
+ box-shadow: ${this.printMode ? `none` : `0px 0px 10px rgba(0,0,0,0.3)`};
64
+ }
65
+ </style>
66
+ <slot></slot>
67
+ `;
68
+ }
69
+ }
@@ -0,0 +1,147 @@
1
+ import {
2
+ DeesElement,
3
+ property,
4
+ html,
5
+ customElement,
6
+ type TemplateResult,
7
+ css,
8
+ cssManager,
9
+ unsafeCSS,
10
+ } from '@design.estate/dees-element';
11
+ import * as domtools from '@design.estate/dees-domtools';
12
+
13
+ import * as shared from './shared/index.js';
14
+ import * as tsclass from '@tsclass/tsclass';
15
+
16
+ declare global {
17
+ interface HTMLElementTagNameMap {
18
+ 'dedocument-pagecontent': DePageContent;
19
+ }
20
+ }
21
+
22
+ @customElement('dedocument-pagecontent')
23
+ export class DePageContent extends DeesElement {
24
+ public static demo = () => html`
25
+ <dedocument-pagecontent .format="${'a4'}"></dedocument-pagecontent>
26
+ `;
27
+
28
+ @property({
29
+ type: Number,
30
+ })
31
+ public letterData: tsclass.business.ILetter;
32
+
33
+ @property({
34
+ type: Number,
35
+ })
36
+ public pageNumber: number = 1;
37
+
38
+ @property({
39
+ type: Number,
40
+ })
41
+ public pageTotalNumber: number = 1;
42
+
43
+ constructor() {
44
+ super();
45
+ domtools.DomTools.setupDomTools();
46
+ }
47
+
48
+ public static styles = [
49
+ domtools.elementBasic.staticStyles,
50
+ css`
51
+ :host {
52
+ color: #333;
53
+ }
54
+
55
+ .content {
56
+ position: absolute;
57
+
58
+ left: ${unsafeCSS(shared.leftMargin + 'px')};
59
+ right: ${unsafeCSS(shared.rightMargin + 'px')};
60
+ bottom: 170px;
61
+ overflow: visible;
62
+ }
63
+
64
+ .content .subject {
65
+ font-size: 18px;
66
+ font-weight: bold;
67
+ margin-bottom: 20px;
68
+ }
69
+
70
+ .content .text {
71
+ text-align: left;
72
+ }
73
+
74
+ .subjectRepeated {
75
+ position: relative;
76
+ text-align: center;
77
+ background: #eeeeee;
78
+ color: #999;
79
+ border-radius: 50px;
80
+ padding: 5px 10px;
81
+ margin: auto;
82
+ margin-bottom: 10px;
83
+ font-size: 10px;
84
+ }
85
+
86
+ .continuesOnNextPage {
87
+ display: inline-block;
88
+ background: #eeeeee;
89
+ color: #999;
90
+ border-radius: 50px;
91
+ padding: 5px 10px;
92
+ margin-top: 8px;
93
+ font-size: 10px;
94
+ }
95
+
96
+ .finalPage {
97
+ display: inline-block;
98
+ background: #29b000;
99
+ color: #fff;
100
+ border-radius: 50px;
101
+ padding: 5px 10px;
102
+ margin-top: 8px;
103
+ font-size: 10px;
104
+ }
105
+ `,
106
+ ];
107
+
108
+ public render(): TemplateResult {
109
+ return html`
110
+ <style>
111
+ .content {
112
+ top: ${this.pageNumber === 1 ? unsafeCSS('450px') : unsafeCSS('200px')};
113
+ }
114
+ </style>
115
+ <div class="content">
116
+ ${this.pageNumber === 1
117
+ ? html`<div class="subject">${this.letterData.subject}</div>`
118
+ : html`
119
+ <div class="subjectRepeated">
120
+ ${this.letterData.subject} (Page ${this.pageNumber})
121
+ </div>
122
+ `}
123
+ <slot></slot>
124
+ ${this.pageTotalNumber !== this.pageNumber
125
+ ? html`<div class="continuesOnNextPage">Continues on page ${this.pageNumber + 1}</div>`
126
+ : html`<div class="finalPage">This is the final page of this document.</div>`}
127
+ </div>
128
+ `;
129
+ }
130
+
131
+ public firstUpdated(_changedProperties: Map<string | number | symbol, unknown>): void {
132
+ super.firstUpdated(_changedProperties);
133
+ this.checkOverflow();
134
+ }
135
+
136
+ public async checkOverflow() {
137
+ await this.elementDomReady;
138
+ const contentContainer = this.shadowRoot.querySelector('.content');
139
+ if (contentContainer.scrollHeight > contentContainer.clientHeight) {
140
+ console.log('overflows');
141
+ return true;
142
+ } else {
143
+ console.log('does not overflow!');
144
+ return false;
145
+ }
146
+ }
147
+ }