@teipublisher/pb-components 2.26.1-next.3 → 3.0.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 (154) hide show
  1. package/.github/workflows/main.yml +3 -3
  2. package/.github/workflows/node.js.yml +3 -3
  3. package/.github/workflows/release.js.yml +4 -4
  4. package/.releaserc.json +2 -2
  5. package/CHANGELOG.md +262 -11
  6. package/Dockerfile +78 -70
  7. package/css/components.css +5 -5
  8. package/css/leaflet/images/layers.png +0 -0
  9. package/dist/demo/components.css +46 -1
  10. package/dist/demo/pb-browse-docs2.html +1 -1
  11. package/dist/demo/pb-dialog.html +3 -5
  12. package/dist/demo/pb-drawer2.html +1 -1
  13. package/dist/demo/pb-facsimile.html +2 -2
  14. package/dist/demo/pb-grid.html +19 -6
  15. package/dist/demo/pb-leaflet-map.html +1 -1
  16. package/dist/demo/pb-login.html +0 -2
  17. package/dist/demo/pb-message.html +1 -2
  18. package/dist/demo/pb-progress.html +2 -2
  19. package/dist/demo/pb-repeat.html +1 -3
  20. package/dist/demo/pb-search.html +7 -4
  21. package/dist/demo/pb-search3.html +1 -1
  22. package/dist/demo/pb-search4.html +2 -2
  23. package/dist/demo/pb-view3.html +1 -1
  24. package/dist/{iron-form-3b8dcaa7.js → iron-form-dfb3e3b1.js} +95 -95
  25. package/dist/paper-checkbox-645e1077.js +200 -0
  26. package/dist/{paper-icon-button-b1d31571.js → paper-icon-button-984162bd.js} +1 -1
  27. package/dist/{paper-checkbox-515a5284.js → paper-inky-focus-behavior-fa16796b.js} +58 -247
  28. package/dist/{paper-listbox-a3b7175c.js → paper-listbox-5f5d1cec.js} +152 -162
  29. package/dist/pb-code-editor.js +25 -20
  30. package/dist/pb-component-docs.js +68 -64
  31. package/dist/pb-components-bundle.js +1983 -2293
  32. package/dist/pb-edit-app.js +167 -107
  33. package/dist/pb-elements.json +176 -120
  34. package/dist/{pb-i18n-0611135a.js → pb-i18n-4cc00bfe.js} +1 -1
  35. package/dist/pb-leaflet-map.js +23 -23
  36. package/dist/pb-mei.js +56 -41
  37. package/dist/{pb-mixin-b1caa22e.js → pb-mixin-886ece32.js} +1 -1
  38. package/dist/pb-odd-editor.js +1023 -782
  39. package/dist/pb-tify.js +2 -2
  40. package/dist/vaadin-element-mixin-beb74ffd.js +545 -0
  41. package/gh-pages.js +5 -3
  42. package/i18n/common/en.json +6 -0
  43. package/i18n/common/pl.json +2 -2
  44. package/lib/openseadragon.min.js +6 -6
  45. package/package.json +3 -3
  46. package/pb-elements.json +176 -120
  47. package/src/assets/components.css +5 -5
  48. package/src/authority/airtable.js +20 -21
  49. package/src/authority/anton.js +129 -129
  50. package/src/authority/custom.js +23 -21
  51. package/src/authority/geonames.js +38 -32
  52. package/src/authority/gnd.js +50 -42
  53. package/src/authority/kbga.js +137 -134
  54. package/src/authority/metagrid.js +44 -46
  55. package/src/authority/reconciliation.js +66 -67
  56. package/src/authority/registry.js +4 -4
  57. package/src/docs/pb-component-docs.js +2 -2
  58. package/src/docs/pb-component-view.js +5 -5
  59. package/src/docs/pb-components-list.js +2 -2
  60. package/src/docs/pb-demo-snippet.js +2 -2
  61. package/src/dts-client.js +299 -297
  62. package/src/dts-select-endpoint.js +90 -82
  63. package/src/parse-date-service.js +184 -135
  64. package/src/pb-ajax.js +158 -171
  65. package/src/pb-authority-lookup.js +191 -156
  66. package/src/pb-autocomplete.js +292 -280
  67. package/src/pb-blacklab-highlight.js +264 -259
  68. package/src/pb-blacklab-results.js +236 -221
  69. package/src/pb-browse-docs.js +540 -475
  70. package/src/pb-browse.js +68 -65
  71. package/src/pb-clipboard.js +79 -76
  72. package/src/pb-code-editor.js +110 -102
  73. package/src/pb-code-highlight.js +209 -204
  74. package/src/pb-codepen.js +79 -72
  75. package/src/pb-collapse.js +211 -151
  76. package/src/pb-combo-box.js +190 -190
  77. package/src/pb-components-bundle.js +1 -1
  78. package/src/pb-components.js +1 -0
  79. package/src/pb-custom-form.js +173 -153
  80. package/src/pb-dialog.js +98 -62
  81. package/src/pb-document.js +89 -90
  82. package/src/pb-download.js +212 -196
  83. package/src/pb-drawer.js +145 -148
  84. package/src/pb-edit-app.js +301 -229
  85. package/src/pb-edit-xml.js +100 -97
  86. package/src/pb-events.js +114 -107
  87. package/src/pb-facs-link.js +104 -102
  88. package/src/pb-facsimile.js +474 -410
  89. package/src/pb-formula.js +151 -153
  90. package/src/pb-geolocation.js +129 -131
  91. package/src/pb-grid-action.js +53 -56
  92. package/src/pb-grid.js +231 -228
  93. package/src/pb-highlight.js +140 -140
  94. package/src/pb-hotkeys.js +40 -42
  95. package/src/pb-i18n.js +101 -104
  96. package/src/pb-image-strip.js +84 -78
  97. package/src/pb-lang.js +142 -57
  98. package/src/pb-leaflet-map.js +488 -485
  99. package/src/pb-link.js +126 -124
  100. package/src/pb-load.js +431 -429
  101. package/src/pb-login.js +299 -244
  102. package/src/pb-manage-odds.js +352 -336
  103. package/src/pb-map-icon.js +89 -89
  104. package/src/pb-map-layer.js +85 -85
  105. package/src/pb-markdown.js +90 -99
  106. package/src/pb-media-query.js +74 -72
  107. package/src/pb-mei.js +306 -295
  108. package/src/pb-message.js +139 -97
  109. package/src/pb-mixin.js +269 -264
  110. package/src/pb-navigation.js +80 -95
  111. package/src/pb-observable.js +38 -38
  112. package/src/pb-odd-editor.js +1054 -958
  113. package/src/pb-odd-elementspec-editor.js +349 -298
  114. package/src/pb-odd-model-editor.js +1075 -909
  115. package/src/pb-odd-parameter-editor.js +200 -178
  116. package/src/pb-odd-rendition-editor.js +136 -124
  117. package/src/pb-page.js +431 -422
  118. package/src/pb-paginate.js +228 -179
  119. package/src/pb-panel.js +198 -182
  120. package/src/pb-popover-themes.js +15 -8
  121. package/src/pb-popover.js +296 -287
  122. package/src/pb-print-preview.js +127 -127
  123. package/src/pb-progress.js +51 -51
  124. package/src/pb-repeat.js +105 -104
  125. package/src/pb-restricted.js +84 -77
  126. package/src/pb-search.js +256 -228
  127. package/src/pb-select-feature.js +127 -120
  128. package/src/pb-select-odd.js +132 -124
  129. package/src/pb-select-template.js +89 -78
  130. package/src/pb-select.js +251 -227
  131. package/src/pb-split-list.js +179 -174
  132. package/src/pb-svg.js +80 -79
  133. package/src/pb-table-column.js +54 -54
  134. package/src/pb-table-grid.js +221 -203
  135. package/src/pb-tabs.js +61 -63
  136. package/src/pb-tify.js +154 -154
  137. package/src/pb-timeline.js +382 -249
  138. package/src/pb-toggle-feature.js +195 -187
  139. package/src/pb-upload.js +184 -174
  140. package/src/pb-version.js +30 -30
  141. package/src/pb-view-annotate.js +135 -98
  142. package/src/pb-view.js +1282 -1270
  143. package/src/pb-zoom.js +127 -45
  144. package/src/polymer-hack.js +1 -1
  145. package/src/search-result-service.js +256 -223
  146. package/src/seed-element.js +13 -20
  147. package/src/settings.js +4 -4
  148. package/src/theming.js +98 -91
  149. package/src/urls.js +289 -289
  150. package/src/utils.js +53 -51
  151. package/css/pb-styles.css +0 -51
  152. package/dist/vaadin-element-mixin-fe4a4883.js +0 -527
  153. package/src/assets/pb-styles.css +0 -51
  154. package/src/pb-light-dom.js +0 -41
@@ -5,8 +5,8 @@ import { pbMixin, waitOnce } from './pb-mixin.js';
5
5
  * This component queries the blacklab API of TEI-Publisher for a list of text matches
6
6
  * in a given document. The query is given as a CQL querystring (see pattern property).
7
7
  *
8
- * **Note**: There's no demo for this component yet as it would need a blacklab instance.
9
- *
8
+ * **Note**: There's no demo for this component yet as it would need a blacklab instance.
9
+ *
10
10
  * The component displays 2 navigation buttons to jump to previous / next match and
11
11
  * a display of the current index and total number of matches.
12
12
  *
@@ -30,298 +30,303 @@ import { pbMixin, waitOnce } from './pb-mixin.js';
30
30
  *
31
31
  */
32
32
  export class PbBlacklabHighlight extends pbMixin(LitElement) {
33
- static get properties() {
34
- return {
35
- ...super.properties,
36
- /**
37
- * one-based index of the current highlight
38
- */
39
- current: {
40
- type: Number
41
- },
42
- /**
43
- * the id of the view for which highlights shall be displayed
44
- */
45
- view: {
46
- type: String
47
- },
48
- /**
49
- * CQL search pattern send to the Blacklab API
50
- */
51
- pattern: {
52
- type: String
53
- },
54
- /**
55
- * optional match parameter on the URL. If present page will display appropriate hit
56
- */
57
- match: {
58
- type: String
59
- },
60
- /**
61
- * the document id
62
- */
63
- docid: {
64
- type: String
65
- },
66
- /**
67
- * holds the results of querying the 'api/blacklab/doc' endpoint
68
- */
69
- hits: {
70
- type: Array
71
- },
72
- /**
73
- * contains full response after successful loading
74
- */
75
- kwicData: {
76
- type: Object
77
- },
78
- /**
79
- * optional: may hold id of match element to be highlighted
80
- */
81
- matchParam: {
82
- type: String
83
- },
84
- /**
85
- * the pageId to display
86
- */
87
- pageId: {
88
- type: String
89
- },
90
- /**
91
- * how many hits shall be loaded. Defaults to 100. This value is passed to the blacklab API
92
- */
93
- perDocument: {
94
- type: Number,
95
- attribute: 'per-document'
96
- }
97
- };
98
- }
99
-
100
- connectedCallback() {
101
- super.connectedCallback();
102
- this.current = 1;
103
- this.perDocument = 100;
104
- this.hits = [];
105
- this.kwicData = {};
106
-
107
- /*
108
- * waiting for the page to be ready before storing a reference to the shadowDOM of the view element this
109
- * component is attached to via the 'view' attribute.
110
- */
111
- waitOnce('pb-page-ready', () => {
112
- this.viewElement = document.getElementById(this.view);
113
- if (!this.viewElement) {
114
- console.error(`${this}: view element with id ${this.view} does not exist`);
115
- return;
116
- }
117
- this.shadow = this.viewElement.shadowRoot;
118
- });
33
+ static get properties() {
34
+ return {
35
+ ...super.properties,
36
+ /**
37
+ * one-based index of the current highlight
38
+ */
39
+ current: {
40
+ type: Number,
41
+ },
42
+ /**
43
+ * the id of the view for which highlights shall be displayed
44
+ */
45
+ view: {
46
+ type: String,
47
+ },
48
+ /**
49
+ * CQL search pattern send to the Blacklab API
50
+ */
51
+ pattern: {
52
+ type: String,
53
+ },
54
+ /**
55
+ * optional match parameter on the URL. If present page will display appropriate hit
56
+ */
57
+ match: {
58
+ type: String,
59
+ },
60
+ /**
61
+ * the document id
62
+ */
63
+ docid: {
64
+ type: String,
65
+ },
66
+ /**
67
+ * holds the results of querying the 'api/blacklab/doc' endpoint
68
+ */
69
+ hits: {
70
+ type: Array,
71
+ },
72
+ /**
73
+ * contains full response after successful loading
74
+ */
75
+ kwicData: {
76
+ type: Object,
77
+ },
78
+ /**
79
+ * optional: may hold id of match element to be highlighted
80
+ */
81
+ matchParam: {
82
+ type: String,
83
+ },
84
+ /**
85
+ * the pageId to display
86
+ */
87
+ pageId: {
88
+ type: String,
89
+ },
90
+ /**
91
+ * how many hits shall be loaded. Defaults to 100. This value is passed to the blacklab API
92
+ */
93
+ perDocument: {
94
+ type: Number,
95
+ attribute: 'per-document',
96
+ },
97
+ };
98
+ }
119
99
 
120
- this.subscribeTo('pb-update', () => {
121
- this._loadDocResults();
122
- });
123
- this.subscribeTo('pb-refresh', (ev) => {
124
- this.dynMatch = ev.detail.match;
125
- });
126
- }
127
-
128
- render() {
129
- return html`
130
- ${this.hits.length !== 0
131
- ? html`
132
- <section class="kwic-display">
133
- <paper-icon-button icon="icons:arrow-back" @click="${this._handlePrev}" ?disabled="${this.current === 1}"></paper-icon-button>
134
- <span class="current">${this.current}</span> / <span class="counter">${this.count}</span>
135
- <paper-icon-button icon="icons:arrow-forward" @click="${this._handleNext}" ?disabled="${this.current === this.hits.length}"></paper-icon-button>
136
- </section>` : ''
137
- }
138
- `;
139
- }
100
+ connectedCallback() {
101
+ super.connectedCallback();
102
+ this.current = 1;
103
+ this.perDocument = 100;
104
+ this.hits = [];
105
+ this.kwicData = {};
140
106
 
141
- /**
142
- * loads matches from blacklab API, marks matches with CSS classes and displays the current match.
143
- *
144
- * The URL query params are used to set params for blacklab API
145
- *
146
- * @returns {Promise<void>}
147
- * @private
107
+ /*
108
+ * waiting for the page to be ready before storing a reference to the shadowDOM of the view element this
109
+ * component is attached to via the 'view' attribute.
148
110
  */
149
- async _loadDocResults() {
150
- // console.log('endpoint for loading kwic matches', this.getEndpoint());
151
- if (!this.getEndpoint()) return;
111
+ waitOnce('pb-page-ready', () => {
112
+ this.viewElement = document.getElementById(this.view);
113
+ if (!this.viewElement) {
114
+ console.error(`${this}: view element with id ${this.view} does not exist`);
115
+ return;
116
+ }
117
+ this.shadow = this.viewElement.shadowRoot;
118
+ });
152
119
 
153
- const params = new URLSearchParams(window.location.search);
154
- this.pattern = params.get('pattern');
120
+ this.subscribeTo('pb-update', () => {
121
+ this._loadDocResults();
122
+ });
123
+ this.subscribeTo('pb-refresh', ev => {
124
+ this.dynMatch = ev.detail.match;
125
+ });
126
+ }
155
127
 
156
- /*
157
- * a dynMatch exists when the reloading was triggered by an nav action (prev/next)
158
- * the match param will be passed by the respective nav handler
159
- */
160
- if(this.dynMatch){
161
- this.matchParam = this.dynMatch;
162
- }else{
163
- this.matchParam = params.get('match');
164
- }
165
- this.pageId = params.get('id');
166
- this.docId = params.get('doc');
128
+ render() {
129
+ return html`
130
+ ${this.hits.length !== 0
131
+ ? html` <section class="kwic-display">
132
+ <paper-icon-button
133
+ icon="icons:arrow-back"
134
+ @click="${this._handlePrev}"
135
+ ?disabled="${this.current === 1}"
136
+ ></paper-icon-button>
137
+ <span class="current">${this.current}</span> /
138
+ <span class="counter">${this.count}</span>
139
+ <paper-icon-button
140
+ icon="icons:arrow-forward"
141
+ @click="${this._handleNext}"
142
+ ?disabled="${this.current === this.hits.length}"
143
+ ></paper-icon-button>
144
+ </section>`
145
+ : ''}
146
+ `;
147
+ }
167
148
 
168
- const url = `${this.getEndpoint()}/api/blacklab/doc?pattern=${this.pattern}&doc=${this.docId}&per-document=${this.perDocument}&format=json`;
169
- await fetch(url, {
170
- method: 'GET',
171
- mode: 'cors',
172
- credentials: 'same-origin'
173
- })
174
- .then((response) => response.json())
175
- .then((data) => {
176
- this.kwicData = data;
177
- })
178
- .then(() => {
179
- this._markAllMatches();
180
- this._showMatch(this.matchParam);
181
- })
182
- .catch((error) => {
183
- console.error('Error retrieving remote content: ', error);
184
- });
185
- }
149
+ /**
150
+ * loads matches from blacklab API, marks matches with CSS classes and displays the current match.
151
+ *
152
+ * The URL query params are used to set params for blacklab API
153
+ *
154
+ * @returns {Promise<void>}
155
+ * @private
156
+ */
157
+ async _loadDocResults() {
158
+ // console.log('endpoint for loading kwic matches', this.getEndpoint());
159
+ if (!this.getEndpoint()) return;
186
160
 
187
- _markAllMatches() {
188
- const docs = this.kwicData.documents;
189
- this.count = this.kwicData.hits;
190
- this.hits = docs[Object.keys(docs)[0]].hits; // 'jump over' docPid
191
- if (Array.isArray(this.hits)) {
192
- this.hits.forEach((hit) => {
193
- const startId = hit.match.words[0];
194
- const endId = hit.match.words[1];
195
- this._addMarkerClasses(startId, endId);
196
- });
197
- }else{
198
- // ### it's just a single hit and we get object instead of array
199
- const startId = this.hits.match.words[0];
200
- const endId = this.hits.match.words[1];
201
- this._addMarkerClasses(startId, endId);
202
- // this._scrollTo(startId, endId);
203
- }
204
- this.requestUpdate();
161
+ const params = new URLSearchParams(window.location.search);
162
+ this.pattern = params.get('pattern');
163
+
164
+ /*
165
+ * a dynMatch exists when the reloading was triggered by an nav action (prev/next)
166
+ * the match param will be passed by the respective nav handler
167
+ */
168
+ if (this.dynMatch) {
169
+ this.matchParam = this.dynMatch;
170
+ } else {
171
+ this.matchParam = params.get('match');
205
172
  }
173
+ this.pageId = params.get('id');
174
+ this.docId = params.get('doc');
206
175
 
176
+ const url = `${this.getEndpoint()}/api/blacklab/doc?pattern=${this.pattern}&doc=${
177
+ this.docId
178
+ }&per-document=${this.perDocument}&format=json`;
179
+ await fetch(url, {
180
+ method: 'GET',
181
+ mode: 'cors',
182
+ credentials: 'same-origin',
183
+ })
184
+ .then(response => response.json())
185
+ .then(data => {
186
+ this.kwicData = data;
187
+ })
188
+ .then(() => {
189
+ this._markAllMatches();
190
+ this._showMatch(this.matchParam);
191
+ })
192
+ .catch(error => {
193
+ console.error('Error retrieving remote content: ', error);
194
+ });
195
+ }
207
196
 
208
- _showMatch(matchId){
209
- const matchObj = this._getMatchObject(matchId);
210
- this._navigateToMatch(matchObj);
197
+ _markAllMatches() {
198
+ const docs = this.kwicData.documents;
199
+ this.count = this.kwicData.hits;
200
+ this.hits = docs[Object.keys(docs)[0]].hits; // 'jump over' docPid
201
+ if (Array.isArray(this.hits)) {
202
+ this.hits.forEach(hit => {
203
+ const startId = hit.match.words[0];
204
+ const endId = hit.match.words[1];
205
+ this._addMarkerClasses(startId, endId);
206
+ });
207
+ } else {
208
+ // ### it's just a single hit and we get object instead of array
209
+ const startId = this.hits.match.words[0];
210
+ const endId = this.hits.match.words[1];
211
+ this._addMarkerClasses(startId, endId);
212
+ // this._scrollTo(startId, endId);
211
213
  }
214
+ this.requestUpdate();
215
+ }
212
216
 
213
- /**
214
- * If a match id is given it will be looked up in the loaded data and returned.
215
- *
216
- * If no match is given the first match in the response will be used.
217
- *
218
- * @param match
219
- * @returns {[]|*}
220
- * @private
221
- */
222
- _getMatchObject(match){
223
- // ### if there's no match param passed in from url return the appropriate object representing current match
224
- if(!match){
225
- if(Array.isArray(this.hits)){
226
- // return this.hits[0];
227
- return this.hits[this.current - 1];
228
- }
229
- return this.hits;
230
- }
217
+ _showMatch(matchId) {
218
+ const matchObj = this._getMatchObject(matchId);
219
+ this._navigateToMatch(matchObj);
220
+ }
231
221
 
232
- if(Array.isArray(this.hits)){
233
- const targetHit = this.hits.find(hit => hit.match.words[0] === match);
234
- this.current = this.hits.findIndex(hit => hit === targetHit) + 1 ;
235
- return targetHit;
236
- }
237
- this.current=1;
238
- return this.hits;
222
+ /**
223
+ * If a match id is given it will be looked up in the loaded data and returned.
224
+ *
225
+ * If no match is given the first match in the response will be used.
226
+ *
227
+ * @param match
228
+ * @returns {[]|*}
229
+ * @private
230
+ */
231
+ _getMatchObject(match) {
232
+ // ### if there's no match param passed in from url return the appropriate object representing current match
233
+ if (!match) {
234
+ if (Array.isArray(this.hits)) {
235
+ // return this.hits[0];
236
+ return this.hits[this.current - 1];
237
+ }
238
+ return this.hits;
239
239
  }
240
240
 
241
- _navigateToMatch(matchObj){
242
- const matchPage = matchObj.page[0];
243
- const matchId = matchObj.match.words[0];
244
- const newUrl = `${this._endpoint}/${this.docId}.xml?doc=${this.docId}&pattern=${this.pattern}&match=${matchObj.match.words[0]}&id=${matchPage}`;
245
- if(this.pageId !== matchPage){
246
- this.emitTo('pb-refresh', {id: matchPage, match:matchId});
247
- }else{
248
- this._highlight(matchObj);
249
- window.history.replaceState({},'',newUrl);
250
- }
241
+ if (Array.isArray(this.hits)) {
242
+ const targetHit = this.hits.find(hit => hit.match.words[0] === match);
243
+ this.current = this.hits.findIndex(hit => hit === targetHit) + 1;
244
+ return targetHit;
251
245
  }
246
+ this.current = 1;
247
+ return this.hits;
248
+ }
252
249
 
253
- _highlight(matchObj){
254
- this._resetCurrentMarker();
255
-
256
- const startid = matchObj.match.words[0];
257
- const endid = matchObj.match.words[1];
258
- const startElem = this.shadow.querySelector(`#${startid}`);
259
- if (startElem) {
260
- startElem.parentNode.classList.add('kwic-current');
261
- }
262
- const endElem = this.shadow.querySelector(`#${endid}`);
263
- if (endElem) {
264
- endElem.parentNode.classList.add('kwic-current');
265
- }
266
- startElem.scrollIntoView({block: "center", inline: "nearest"});
267
-
250
+ _navigateToMatch(matchObj) {
251
+ const matchPage = matchObj.page[0];
252
+ const matchId = matchObj.match.words[0];
253
+ const newUrl = `${this._endpoint}/${this.docId}.xml?doc=${this.docId}&pattern=${this.pattern}&match=${matchObj.match.words[0]}&id=${matchPage}`;
254
+ if (this.pageId !== matchPage) {
255
+ this.emitTo('pb-refresh', { id: matchPage, match: matchId });
256
+ } else {
257
+ this._highlight(matchObj);
258
+ window.history.replaceState({}, '', newUrl);
268
259
  }
260
+ }
269
261
 
262
+ _highlight(matchObj) {
263
+ this._resetCurrentMarker();
270
264
 
271
- _resetCurrentMarker() {
272
- const old = this.shadow.querySelectorAll('.kwic-current');
273
- Array.from(old).forEach(elem => {
274
- elem.classList.remove('kwic-current');
275
- });
265
+ const startid = matchObj.match.words[0];
266
+ const endid = matchObj.match.words[1];
267
+ const startElem = this.shadow.querySelector(`#${startid}`);
268
+ if (startElem) {
269
+ startElem.parentNode.classList.add('kwic-current');
276
270
  }
277
-
278
- _addMarkerClasses(startId, endId) {
279
- const start = this.shadow.querySelector(`#${startId}`);
280
- if (!start) {
281
- return;
282
- }
283
- start.parentNode.classList.add('kwic-start');
284
-
285
- const end = this.shadow.getElementById(endId);
286
- if (end) {
287
- end.parentNode.classList.add('kwic-end');
288
- }else{
289
- start.classList.add('kwic-end');
290
- }
271
+ const endElem = this.shadow.querySelector(`#${endid}`);
272
+ if (endElem) {
273
+ endElem.parentNode.classList.add('kwic-current');
291
274
  }
275
+ startElem.scrollIntoView({ block: 'center', inline: 'nearest' });
276
+ }
277
+
278
+ _resetCurrentMarker() {
279
+ const old = this.shadow.querySelectorAll('.kwic-current');
280
+ Array.from(old).forEach(elem => {
281
+ elem.classList.remove('kwic-current');
282
+ });
283
+ }
292
284
 
293
- _handlePrev() {
294
- this.current -= 1;
295
- const prevMatchObj = this.hits[this.current - 1];
296
- this._navigateToMatch(prevMatchObj);
285
+ _addMarkerClasses(startId, endId) {
286
+ const start = this.shadow.querySelector(`#${startId}`);
287
+ if (!start) {
288
+ return;
297
289
  }
290
+ start.parentNode.classList.add('kwic-start');
298
291
 
299
- _handleNext() {
300
- const nextMatchObj = this.hits[this.current];
301
- this._navigateToMatch(nextMatchObj);
302
- this.current += 1;
292
+ const end = this.shadow.getElementById(endId);
293
+ if (end) {
294
+ end.parentNode.classList.add('kwic-end');
295
+ } else {
296
+ start.classList.add('kwic-end');
303
297
  }
298
+ }
304
299
 
300
+ _handlePrev() {
301
+ this.current -= 1;
302
+ const prevMatchObj = this.hits[this.current - 1];
303
+ this._navigateToMatch(prevMatchObj);
304
+ }
305
305
 
306
- static get styles() {
307
- return css`
308
- :host {
309
- display: block;
310
- }
311
- .counter, .current{
312
- padding:0 0.5rem;
313
- }
306
+ _handleNext() {
307
+ const nextMatchObj = this.hits[this.current];
308
+ this._navigateToMatch(nextMatchObj);
309
+ this.current += 1;
310
+ }
314
311
 
315
- `;
316
- }
312
+ static get styles() {
313
+ return css`
314
+ :host {
315
+ display: block;
316
+ }
317
+ .counter,
318
+ .current {
319
+ padding: 0 0.5rem;
320
+ }
321
+ `;
322
+ }
317
323
 
318
- /*
324
+ /*
319
325
  _handleClear(ev) {
320
326
  ev.preventDefault();
321
327
  localStorage.removeItem('pb-kwic-doc-matches');
322
328
  }
323
329
  */
324
-
325
330
  }
326
331
 
327
332
  customElements.define('pb-blacklab-highlight', PbBlacklabHighlight);