@teipublisher/pb-components 2.26.0-next-3.12 → 2.26.0-next-3.13

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 (132) 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 +3 -3
  4. package/CHANGELOG.md +30 -0
  5. package/Dockerfile +78 -70
  6. package/css/components.css +5 -5
  7. package/dist/demo/pb-drawer2.html +1 -1
  8. package/dist/demo/pb-leaflet-map.html +1 -1
  9. package/dist/demo/pb-progress.html +2 -2
  10. package/dist/demo/pb-repeat.html +1 -3
  11. package/dist/demo/pb-view3.html +1 -1
  12. package/dist/{paper-icon-button-0fb125c4.js → paper-icon-button-72125e67.js} +1 -1
  13. package/dist/pb-code-editor.js +25 -20
  14. package/dist/pb-component-docs.js +58 -54
  15. package/dist/pb-components-bundle.js +1937 -1782
  16. package/dist/pb-edit-app.js +167 -107
  17. package/dist/pb-elements.json +45 -45
  18. package/dist/{pb-i18n-0611135a.js → pb-i18n-4cc00bfe.js} +1 -1
  19. package/dist/pb-leaflet-map.js +23 -23
  20. package/dist/pb-mei.js +56 -41
  21. package/dist/{pb-mixin-b1caa22e.js → pb-mixin-886ece32.js} +1 -1
  22. package/dist/pb-odd-editor.js +923 -756
  23. package/dist/pb-tify.js +2 -2
  24. package/dist/{vaadin-element-mixin-49ab4037.js → vaadin-element-mixin-84fb7d82.js} +178 -163
  25. package/gh-pages.js +5 -3
  26. package/i18n/common/pl.json +2 -2
  27. package/lib/openseadragon.min.js +1 -1
  28. package/package.json +2 -2
  29. package/pb-elements.json +45 -45
  30. package/src/assets/components.css +5 -5
  31. package/src/authority/airtable.js +20 -21
  32. package/src/authority/anton.js +129 -129
  33. package/src/authority/custom.js +23 -21
  34. package/src/authority/geonames.js +38 -32
  35. package/src/authority/gnd.js +47 -42
  36. package/src/authority/kbga.js +137 -134
  37. package/src/authority/metagrid.js +44 -46
  38. package/src/authority/reconciliation.js +66 -67
  39. package/src/authority/registry.js +4 -4
  40. package/src/docs/pb-component-docs.js +2 -2
  41. package/src/docs/pb-component-view.js +5 -5
  42. package/src/docs/pb-components-list.js +2 -2
  43. package/src/docs/pb-demo-snippet.js +2 -2
  44. package/src/dts-client.js +299 -297
  45. package/src/dts-select-endpoint.js +90 -82
  46. package/src/parse-date-service.js +184 -135
  47. package/src/pb-ajax.js +150 -146
  48. package/src/pb-authority-lookup.js +183 -146
  49. package/src/pb-autocomplete.js +292 -280
  50. package/src/pb-blacklab-highlight.js +264 -259
  51. package/src/pb-blacklab-results.js +236 -221
  52. package/src/pb-browse-docs.js +540 -475
  53. package/src/pb-browse.js +68 -65
  54. package/src/pb-clipboard.js +79 -76
  55. package/src/pb-code-editor.js +110 -102
  56. package/src/pb-code-highlight.js +209 -204
  57. package/src/pb-codepen.js +79 -72
  58. package/src/pb-collapse.js +212 -207
  59. package/src/pb-combo-box.js +190 -190
  60. package/src/pb-components-bundle.js +1 -1
  61. package/src/pb-custom-form.js +151 -149
  62. package/src/pb-dialog.js +94 -85
  63. package/src/pb-document.js +89 -90
  64. package/src/pb-download.js +210 -198
  65. package/src/pb-drawer.js +145 -148
  66. package/src/pb-edit-app.js +301 -229
  67. package/src/pb-edit-xml.js +98 -96
  68. package/src/pb-events.js +114 -107
  69. package/src/pb-facs-link.js +104 -102
  70. package/src/pb-facsimile.js +411 -413
  71. package/src/pb-formula.js +151 -153
  72. package/src/pb-geolocation.js +129 -131
  73. package/src/pb-grid-action.js +53 -56
  74. package/src/pb-grid.js +231 -228
  75. package/src/pb-highlight.js +140 -140
  76. package/src/pb-hotkeys.js +40 -42
  77. package/src/pb-i18n.js +101 -104
  78. package/src/pb-image-strip.js +84 -78
  79. package/src/pb-lang.js +132 -128
  80. package/src/pb-leaflet-map.js +488 -485
  81. package/src/pb-link.js +126 -124
  82. package/src/pb-load.js +431 -426
  83. package/src/pb-login.js +291 -248
  84. package/src/pb-manage-odds.js +364 -318
  85. package/src/pb-map-icon.js +89 -89
  86. package/src/pb-map-layer.js +85 -85
  87. package/src/pb-markdown.js +90 -99
  88. package/src/pb-media-query.js +74 -72
  89. package/src/pb-mei.js +306 -295
  90. package/src/pb-message.js +144 -144
  91. package/src/pb-mixin.js +269 -264
  92. package/src/pb-navigation.js +80 -82
  93. package/src/pb-observable.js +38 -38
  94. package/src/pb-odd-editor.js +1053 -955
  95. package/src/pb-odd-elementspec-editor.js +348 -297
  96. package/src/pb-odd-model-editor.js +1061 -901
  97. package/src/pb-odd-parameter-editor.js +200 -178
  98. package/src/pb-odd-rendition-editor.js +136 -124
  99. package/src/pb-page.js +431 -421
  100. package/src/pb-paginate.js +202 -190
  101. package/src/pb-panel.js +191 -179
  102. package/src/pb-popover-themes.js +7 -5
  103. package/src/pb-popover.js +296 -287
  104. package/src/pb-print-preview.js +127 -127
  105. package/src/pb-progress.js +51 -51
  106. package/src/pb-repeat.js +105 -104
  107. package/src/pb-restricted.js +84 -77
  108. package/src/pb-search.js +252 -241
  109. package/src/pb-select-feature.js +127 -120
  110. package/src/pb-select-odd.js +132 -124
  111. package/src/pb-select-template.js +89 -78
  112. package/src/pb-select.js +251 -227
  113. package/src/pb-split-list.js +179 -174
  114. package/src/pb-svg.js +80 -79
  115. package/src/pb-table-column.js +54 -54
  116. package/src/pb-table-grid.js +221 -203
  117. package/src/pb-tabs.js +61 -63
  118. package/src/pb-tify.js +154 -154
  119. package/src/pb-timeline.js +271 -229
  120. package/src/pb-toggle-feature.js +182 -175
  121. package/src/pb-upload.js +184 -174
  122. package/src/pb-version.js +30 -30
  123. package/src/pb-view-annotate.js +132 -98
  124. package/src/pb-view.js +1289 -1270
  125. package/src/pb-zoom.js +75 -59
  126. package/src/polymer-hack.js +1 -1
  127. package/src/search-result-service.js +256 -223
  128. package/src/seed-element.js +13 -20
  129. package/src/settings.js +4 -4
  130. package/src/theming.js +96 -96
  131. package/src/urls.js +289 -289
  132. package/src/utils.js +53 -51
package/src/pb-formula.js CHANGED
@@ -1,118 +1,116 @@
1
1
  import { LitElement, html, css } from 'lit-element';
2
- import "@lrnwebcomponents/es-global-bridge";
3
- import { translate } from "./pb-i18n.js";
2
+ import '@lrnwebcomponents/es-global-bridge';
3
+ import { translate } from './pb-i18n.js';
4
4
 
5
5
  /** Import external script dynamically */
6
6
  function _import(name, location) {
7
- window.ESGlobalBridge.requestAvailability();
8
- return new Promise(resolve => {
9
- window.ESGlobalBridge.instance.load(name, location);
10
- window.addEventListener(
11
- `es-bridge-${name}-loaded`,
12
- () => resolve(),
13
- { once: true }
14
- );
15
- });
7
+ window.ESGlobalBridge.requestAvailability();
8
+ return new Promise(resolve => {
9
+ window.ESGlobalBridge.instance.load(name, location);
10
+ window.addEventListener(`es-bridge-${name}-loaded`, () => resolve(), { once: true });
11
+ });
16
12
  }
17
13
 
18
14
  /**
19
15
  * Update the stylesheet required by MathJax.
20
16
  * Needs to be done after typesetting has completed.
21
- *
22
- * @param {Element} context
23
- * @param {Element} styles
17
+ *
18
+ * @param {Element} context
19
+ * @param {Element} styles
24
20
  */
25
21
  function _updateStyles(context, styles) {
26
- let root = context.getRootNode();
27
- if (root.nodeType === Node.DOCUMENT_NODE) {
28
- root = root.head;
29
- } else {
30
- // fonts need to be declared outside shadow root, so extract
31
- // all font-faces and put them into a style in the header
32
- const elem = document.querySelector(`style#${styles.id}`);
33
- if (elem) {
34
- elem.parentNode.removeChild(elem);
35
- }
36
- const fonts = styles.innerHTML.match(/@font-face[^{]+{.*?}/gs);
37
- if (fonts) {
38
- const style = document.createElement('style');
39
- style.id = styles.id;
40
- style.appendChild(document.createTextNode(fonts.join('\n')));
41
- document.head.appendChild(style);
42
- }
22
+ let root = context.getRootNode();
23
+ if (root.nodeType === Node.DOCUMENT_NODE) {
24
+ root = root.head;
25
+ } else {
26
+ // fonts need to be declared outside shadow root, so extract
27
+ // all font-faces and put them into a style in the header
28
+ const elem = document.querySelector(`style#${styles.id}`);
29
+ if (elem) {
30
+ elem.parentNode.removeChild(elem);
43
31
  }
44
- const oldStyles = root.querySelector(`#${styles.id}`);
45
- if (oldStyles) {
46
- oldStyles.parentNode.removeChild(oldStyles);
32
+ const fonts = styles.innerHTML.match(/@font-face[^{]+{.*?}/gs);
33
+ if (fonts) {
34
+ const style = document.createElement('style');
35
+ style.id = styles.id;
36
+ style.appendChild(document.createTextNode(fonts.join('\n')));
37
+ document.head.appendChild(style);
47
38
  }
48
- root.appendChild(styles);
39
+ }
40
+ const oldStyles = root.querySelector(`#${styles.id}`);
41
+ if (oldStyles) {
42
+ oldStyles.parentNode.removeChild(oldStyles);
43
+ }
44
+ root.appendChild(styles);
49
45
  }
50
46
 
51
47
  /**
52
48
  * Iterate through the given `pb-formula` elements and typeset the math.
53
49
  */
54
50
  function _initMath(context, formulas) {
55
- formulas.forEach((formula) => {
56
- if (formula.hasChildNodes()) {
57
- const display = formula.hasAttribute('display') || false;
58
- const mathml = formula.querySelector('math');
59
- const options = window.MathJax.getMetricsFor(formula.parentNode, display);
60
- options.display = display;
61
- let chtml;
62
- let source;
63
- if (mathml) {
64
- source = mathml.outerHTML;
65
- chtml = window.MathJax.mathml2chtml(source, options);
66
- } else {
67
- window.MathJax.texReset();
68
- source = formula.innerHTML.replaceAll(/&\w+;/g, function (m) {
69
- return {
70
- '&': '&',
71
- '&lt;' : '<'
72
- }[m];
73
- });
74
- chtml = window.MathJax.tex2chtml(source, options);
75
- }
76
- formula.innerHTML = '';
77
- formula.appendChild(chtml);
78
- formula.setAttribute('loaded', 'loaded');
79
- formula.setAttribute('source', source);
80
- }
81
- });
82
- _updateStyles(context, window.MathJax.chtmlStylesheet());
51
+ formulas.forEach(formula => {
52
+ if (formula.hasChildNodes()) {
53
+ const display = formula.hasAttribute('display') || false;
54
+ const mathml = formula.querySelector('math');
55
+ const options = window.MathJax.getMetricsFor(formula.parentNode, display);
56
+ options.display = display;
57
+ let chtml;
58
+ let source;
59
+ if (mathml) {
60
+ source = mathml.outerHTML;
61
+ chtml = window.MathJax.mathml2chtml(source, options);
62
+ } else {
63
+ window.MathJax.texReset();
64
+ source = formula.innerHTML.replaceAll(
65
+ /&\w+;/g,
66
+ m =>
67
+ ({
68
+ '&amp;': '&',
69
+ '&lt;': '<',
70
+ }[m]),
71
+ );
72
+ chtml = window.MathJax.tex2chtml(source, options);
73
+ }
74
+ formula.innerHTML = '';
75
+ formula.appendChild(chtml);
76
+ formula.setAttribute('loaded', 'loaded');
77
+ formula.setAttribute('source', source);
78
+ }
79
+ });
80
+ _updateStyles(context, window.MathJax.chtmlStylesheet());
83
81
  }
84
82
 
85
83
  /**
86
84
  * Search the passed in element for `pb-formula` elements and
87
85
  * render them via MathJax.
88
- *
86
+ *
89
87
  * Formulas need to be processed sequentially or the output will
90
88
  * be screwed up. Therefore we cannot call MathJax asynchronously
91
89
  * but need to do it from this central controller.
92
- *
90
+ *
93
91
  * @param {Element} elem the root element to process
94
92
  */
95
93
  export function typesetMath(elem) {
96
- const formulas = elem.querySelectorAll('pb-formula');
97
- console.log(`<pb-formula> Found ${formulas.length} elements to typeset ...`);
98
- if (formulas.length > 0) {
99
- if (window.MathJax) {
100
- _initMath(elem, formulas);
101
- return;
102
- }
103
- const showMenu = elem.querySelector('pb-formula[menu]');
104
- window.MathJax = {
105
- startup: {
106
- typeset: false, // Perform initial typeset?
107
- pageReady: () => _initMath(elem, formulas) // Called when MathJax and page are ready
108
- },
109
- options: {
110
- enableMenu: showMenu !== null
111
- }
112
- };
113
-
114
- _import('MathJax', 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js');
94
+ const formulas = elem.querySelectorAll('pb-formula');
95
+ console.log(`<pb-formula> Found ${formulas.length} elements to typeset ...`);
96
+ if (formulas.length > 0) {
97
+ if (window.MathJax) {
98
+ _initMath(elem, formulas);
99
+ return;
115
100
  }
101
+ const showMenu = elem.querySelector('pb-formula[menu]');
102
+ window.MathJax = {
103
+ startup: {
104
+ typeset: false, // Perform initial typeset?
105
+ pageReady: () => _initMath(elem, formulas), // Called when MathJax and page are ready
106
+ },
107
+ options: {
108
+ enableMenu: showMenu !== null,
109
+ },
110
+ };
111
+
112
+ _import('MathJax', 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js');
113
+ }
116
114
  }
117
115
 
118
116
  /**
@@ -121,84 +119,84 @@ export function typesetMath(elem) {
121
119
  * pass it the root context which should be searched for `pb-notation` elements. The function will
122
120
  * then do the actual typesetting. The reason for this is that formulas need to be typeset synchronously, i.e. one
123
121
  * after the other.
124
- *
122
+ *
125
123
  * The component detects automatically if the formula to typeset is in TeX notation or MathML.
126
- *
124
+ *
127
125
  * @slot - should contain math in TeX notation or MathML
128
126
  */
129
127
  export class PbFormula extends LitElement {
130
- static get properties() {
131
- return {
132
- /**
133
- * TeX notation only: render the formula in display mode, i.e. as block level element.
134
- */
135
- display: {
136
- type: Boolean
137
- },
138
- /**
139
- * Option: if set, enable the MathJax context menu. This affects **all** formulas
140
- * in the context (the page or pb-view), not just the current component!
141
- */
142
- menu: {
143
- type: Boolean
144
- },
145
- /**
146
- * Will be set once the element has been typeset.
147
- */
148
- loaded: {
149
- type: Boolean
150
- },
151
- /**
152
- * Will contain the source notation once the element has been typeset.
153
- */
154
- source: {
155
- type: String
156
- },
157
- ...super.properties
158
- };
159
- }
128
+ static get properties() {
129
+ return {
130
+ /**
131
+ * TeX notation only: render the formula in display mode, i.e. as block level element.
132
+ */
133
+ display: {
134
+ type: Boolean,
135
+ },
136
+ /**
137
+ * Option: if set, enable the MathJax context menu. This affects **all** formulas
138
+ * in the context (the page or pb-view), not just the current component!
139
+ */
140
+ menu: {
141
+ type: Boolean,
142
+ },
143
+ /**
144
+ * Will be set once the element has been typeset.
145
+ */
146
+ loaded: {
147
+ type: Boolean,
148
+ },
149
+ /**
150
+ * Will contain the source notation once the element has been typeset.
151
+ */
152
+ source: {
153
+ type: String,
154
+ },
155
+ ...super.properties,
156
+ };
157
+ }
160
158
 
161
- constructor() {
162
- super();
163
- this.display = false;
164
- }
159
+ constructor() {
160
+ super();
161
+ this.display = false;
162
+ }
165
163
 
166
- attributeChangedCallback(name, oldVal, newVal) {
167
- super.attributeChangedCallback(name, oldVal, newVal);
168
- switch(name) {
169
- case 'loaded':
170
- this.loaded = true;
171
- break;
172
- case 'source':
173
- this.source = newVal;
174
- break;
175
- default:
176
- break;
177
- }
164
+ attributeChangedCallback(name, oldVal, newVal) {
165
+ super.attributeChangedCallback(name, oldVal, newVal);
166
+ switch (name) {
167
+ case 'loaded':
168
+ this.loaded = true;
169
+ break;
170
+ case 'source':
171
+ this.source = newVal;
172
+ break;
173
+ default:
174
+ break;
178
175
  }
176
+ }
179
177
 
180
- render() {
181
- if (!this.hasChildNodes()) {
182
- return null;
183
- }
184
- if (!this.loaded) {
185
- return html`<span class="loading">${translate('dialogs.loading')}</span>`;
186
- }
187
- return html`<div id="content" class="${this.display ? 'block' : ''}"><slot></slot></div>`;
178
+ render() {
179
+ if (!this.hasChildNodes()) {
180
+ return null;
188
181
  }
189
-
190
- static get styles() {
191
- return css`
192
- :host {
193
- display: inline-block;
194
- }
195
- .block {
196
- display: block;
197
- }
198
- .loading {
199
- color: #808080;
200
- }
201
- `;
182
+ if (!this.loaded) {
183
+ return html`<span class="loading">${translate('dialogs.loading')}</span>`;
202
184
  }
185
+ return html`<div id="content" class="${this.display ? 'block' : ''}"><slot></slot></div>`;
186
+ }
187
+
188
+ static get styles() {
189
+ return css`
190
+ :host {
191
+ display: inline-block;
192
+ }
193
+ .block {
194
+ display: block;
195
+ }
196
+ .loading {
197
+ color: #808080;
198
+ }
199
+ `;
200
+ }
203
201
  }
204
202
  customElements.define('pb-formula', PbFormula);
@@ -1,13 +1,12 @@
1
1
  import { html, css } from 'lit-element';
2
- import { PbHighlight } from "./pb-highlight.js";
3
-
2
+ import { PbHighlight } from './pb-highlight.js';
4
3
 
5
4
  /**
6
5
  * Represents a geo location. Extends `pb-highlight`, but sends an additional `pb-geolocation` event
7
6
  * on mouseover.
8
- *
7
+ *
9
8
  * For `pb-leaflet-map` to show markers for `pb-geolocation` elements, make sure that map subscribes to the channel
10
- * into which `pb-geolocation`s emit and that map is loaded before the emitting component, e.g. `pb-view`, by specifying
9
+ * into which `pb-geolocation`s emit and that map is loaded before the emitting component, e.g. `pb-view`, by specifying
11
10
  * `wait-for` property.
12
11
  *
13
12
  * @slot - default unnamed slot for content. May also contain an option `<template>` element for content to be shown in a popup
@@ -15,145 +14,144 @@ import { PbHighlight } from "./pb-highlight.js";
15
14
  * @cssprop --pb-highlight-color - Background color to highlight an element
16
15
  */
17
16
  export class PbGeolocation extends PbHighlight {
18
- static get properties() {
19
- return {
20
- ...super.properties,
21
- longitude: {
22
- type: Number
23
- },
24
- latitude: {
25
- type: Number
26
- },
27
- /**
28
- * Optional label for the place, e.g. to display a marker
29
- */
30
- label: {
31
- type: String
32
- },
33
- /**
34
- * Name of the event which triggers a pb-geolocation event, e.g. 'click'.
35
- * Default is 'mouseover'.
36
- */
37
- event: {
38
- type: String
39
- },
40
- /**
41
- * Zoom level to use for the map if it centers on the location.
42
- */
43
- zoom: {
44
- type: Number
45
- },
46
- /**
47
- * If set, add location to a map automatically upon load by
48
- * emitting an event. If not set, locations are only added when
49
- * the configured event is triggered.
50
- */
51
- auto: {
52
- type: Boolean
53
- }
54
- };
55
- }
17
+ static get properties() {
18
+ return {
19
+ ...super.properties,
20
+ longitude: {
21
+ type: Number,
22
+ },
23
+ latitude: {
24
+ type: Number,
25
+ },
26
+ /**
27
+ * Optional label for the place, e.g. to display a marker
28
+ */
29
+ label: {
30
+ type: String,
31
+ },
32
+ /**
33
+ * Name of the event which triggers a pb-geolocation event, e.g. 'click'.
34
+ * Default is 'mouseover'.
35
+ */
36
+ event: {
37
+ type: String,
38
+ },
39
+ /**
40
+ * Zoom level to use for the map if it centers on the location.
41
+ */
42
+ zoom: {
43
+ type: Number,
44
+ },
45
+ /**
46
+ * If set, add location to a map automatically upon load by
47
+ * emitting an event. If not set, locations are only added when
48
+ * the configured event is triggered.
49
+ */
50
+ auto: {
51
+ type: Boolean,
52
+ },
53
+ };
54
+ }
56
55
 
57
- constructor() {
58
- super();
59
- this.event = 'mouseover';
60
- this.auto = false;
61
- this.zoom = null;
62
- }
56
+ constructor() {
57
+ super();
58
+ this.event = 'mouseover';
59
+ this.auto = false;
60
+ this.zoom = null;
61
+ }
63
62
 
64
- connectedCallback() {
65
- super.connectedCallback();
63
+ connectedCallback() {
64
+ super.connectedCallback();
66
65
 
67
- if (this.event) {
68
- this.addEventListener(this.event, () =>
69
- this.emitTo('pb-geolocation', {
70
- coordinates: {
71
- latitude: this.latitude,
72
- longitude: this.longitude
73
- },
74
- label: this.label,
75
- zoom: this.zoom,
76
- popup: this.popup,
77
- element: this,
78
- event: this.event
79
- })
80
- );
81
- }
82
- if (this.auto) {
83
- this.waitForChannel(() => {
84
- this.emitTo('pb-geolocation', {
85
- coordinates: {
86
- latitude: this.latitude,
87
- longitude: this.longitude
88
- },
89
- label: this.label,
90
- popup: this.popup,
91
- fitBounds: true,
92
- element: this
93
- });
94
- });
95
- }
66
+ if (this.event) {
67
+ this.addEventListener(this.event, () =>
68
+ this.emitTo('pb-geolocation', {
69
+ coordinates: {
70
+ latitude: this.latitude,
71
+ longitude: this.longitude,
72
+ },
73
+ label: this.label,
74
+ zoom: this.zoom,
75
+ popup: this.popup,
76
+ element: this,
77
+ event: this.event,
78
+ }),
79
+ );
96
80
  }
97
-
98
- render() {
99
- return html`<span id="content"><slot></slot></span>`;
81
+ if (this.auto) {
82
+ this.waitForChannel(() => {
83
+ this.emitTo('pb-geolocation', {
84
+ coordinates: {
85
+ latitude: this.latitude,
86
+ longitude: this.longitude,
87
+ },
88
+ label: this.label,
89
+ popup: this.popup,
90
+ fitBounds: true,
91
+ element: this,
92
+ });
93
+ });
100
94
  }
95
+ }
101
96
 
102
- get popup() {
103
- const template = this.querySelector('template');
104
- if (template) {
105
- const wrapper = document.createElement('div');
106
- wrapper.appendChild(template.content.cloneNode(true));
107
- return wrapper;
108
- }
109
- return null;
110
- }
97
+ render() {
98
+ return html`<span id="content"><slot></slot></span>`;
99
+ }
111
100
 
112
- static get styles() {
113
- return css`
114
- :host {
115
- display: inline;
116
- cursor: pointer;
117
- }
101
+ get popup() {
102
+ const template = this.querySelector('template');
103
+ if (template) {
104
+ const wrapper = document.createElement('div');
105
+ wrapper.appendChild(template.content.cloneNode(true));
106
+ return wrapper;
107
+ }
108
+ return null;
109
+ }
118
110
 
119
- [name="popup"] {
120
- display: none;
121
- }
111
+ static get styles() {
112
+ return css`
113
+ :host {
114
+ display: inline;
115
+ cursor: pointer;
116
+ }
122
117
 
123
- @keyframes keyFrameBackgroundColorIn {
124
- 0% {
125
- background-color: inherit;
126
- }
127
- 100% {
128
- background-color: var(--pb-highlight-color, #F9E976);
129
- }
130
- }
118
+ [name='popup'] {
119
+ display: none;
120
+ }
131
121
 
132
- #content {
133
- display: inline;
134
- }
122
+ @keyframes keyFrameBackgroundColorIn {
123
+ 0% {
124
+ background-color: inherit;
125
+ }
126
+ 100% {
127
+ background-color: var(--pb-highlight-color, #f9e976);
128
+ }
129
+ }
135
130
 
136
- .highlight-on {
137
- background-color: var(--pb-highlight-color, #F9E976);
138
- animation-name: keyFrameBackgroundColorIn;
139
- animation-duration: 500ms;
140
- animation-iteration-count: 1;
141
- animation-timing-function: ease-in;
131
+ #content {
132
+ display: inline;
133
+ }
142
134
 
143
- }
135
+ .highlight-on {
136
+ background-color: var(--pb-highlight-color, #f9e976);
137
+ animation-name: keyFrameBackgroundColorIn;
138
+ animation-duration: 500ms;
139
+ animation-iteration-count: 1;
140
+ animation-timing-function: ease-in;
141
+ }
144
142
 
145
- .highlight-off {
146
- background-color: inherit;
147
- }
148
- `;
149
- }
143
+ .highlight-off {
144
+ background-color: inherit;
145
+ }
146
+ `;
147
+ }
150
148
 
151
- /**
152
- * Fired on mouseover
153
- *
154
- * @event pb-geolocation
155
- * @param {Object} coordinates an object with two properties: latitude and longitude
156
- * @param {String} label an optional label for the place
157
- */
149
+ /**
150
+ * Fired on mouseover
151
+ *
152
+ * @event pb-geolocation
153
+ * @param {Object} coordinates an object with two properties: latitude and longitude
154
+ * @param {String} label an optional label for the place
155
+ */
158
156
  }
159
- customElements.define('pb-geolocation', PbGeolocation);
157
+ customElements.define('pb-geolocation', PbGeolocation);