@teipublisher/pb-components 2.25.5 → 2.25.7

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 (130) 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 +15 -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-facsimile.html +2 -2
  9. package/dist/demo/pb-leaflet-map.html +1 -1
  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 +1827 -1520
  16. package/dist/pb-edit-app.js +167 -107
  17. package/dist/pb-elements.json +54 -54
  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 +925 -758
  23. package/dist/pb-tify.js +2 -2
  24. package/dist/{vaadin-element-mixin-859a0132.js → vaadin-element-mixin-ad07ba25.js} +88 -61
  25. package/gh-pages.js +5 -3
  26. package/lib/openseadragon.min.js +6 -6
  27. package/package.json +3 -2
  28. package/pb-elements.json +54 -54
  29. package/src/assets/components.css +5 -5
  30. package/src/authority/airtable.js +20 -21
  31. package/src/authority/anton.js +129 -129
  32. package/src/authority/custom.js +23 -21
  33. package/src/authority/geonames.js +38 -32
  34. package/src/authority/gnd.js +47 -42
  35. package/src/authority/kbga.js +137 -134
  36. package/src/authority/metagrid.js +44 -46
  37. package/src/authority/reconciliation.js +66 -67
  38. package/src/authority/registry.js +4 -4
  39. package/src/docs/pb-component-docs.js +2 -2
  40. package/src/docs/pb-component-view.js +5 -5
  41. package/src/docs/pb-components-list.js +2 -2
  42. package/src/docs/pb-demo-snippet.js +2 -2
  43. package/src/dts-client.js +299 -297
  44. package/src/dts-select-endpoint.js +90 -82
  45. package/src/parse-date-service.js +184 -135
  46. package/src/pb-ajax.js +171 -167
  47. package/src/pb-authority-lookup.js +96 -81
  48. package/src/pb-autocomplete.js +292 -280
  49. package/src/pb-blacklab-highlight.js +264 -259
  50. package/src/pb-blacklab-results.js +236 -221
  51. package/src/pb-browse-docs.js +540 -475
  52. package/src/pb-browse.js +68 -65
  53. package/src/pb-clipboard.js +79 -76
  54. package/src/pb-code-editor.js +110 -102
  55. package/src/pb-code-highlight.js +209 -204
  56. package/src/pb-codepen.js +79 -72
  57. package/src/pb-collapse.js +149 -146
  58. package/src/pb-combo-box.js +190 -190
  59. package/src/pb-components-bundle.js +1 -1
  60. package/src/pb-custom-form.js +150 -149
  61. package/src/pb-document.js +89 -90
  62. package/src/pb-download.js +208 -195
  63. package/src/pb-drawer.js +145 -148
  64. package/src/pb-edit-app.js +301 -229
  65. package/src/pb-edit-xml.js +99 -96
  66. package/src/pb-events.js +114 -107
  67. package/src/pb-facs-link.js +104 -102
  68. package/src/pb-facsimile.js +444 -410
  69. package/src/pb-formula.js +151 -153
  70. package/src/pb-geolocation.js +129 -131
  71. package/src/pb-grid-action.js +53 -56
  72. package/src/pb-grid.js +231 -228
  73. package/src/pb-highlight.js +140 -140
  74. package/src/pb-hotkeys.js +40 -42
  75. package/src/pb-i18n.js +101 -104
  76. package/src/pb-image-strip.js +84 -78
  77. package/src/pb-lang.js +83 -70
  78. package/src/pb-leaflet-map.js +488 -485
  79. package/src/pb-link.js +126 -124
  80. package/src/pb-load.js +431 -426
  81. package/src/pb-login.js +275 -254
  82. package/src/pb-manage-odds.js +364 -318
  83. package/src/pb-map-icon.js +89 -89
  84. package/src/pb-map-layer.js +85 -85
  85. package/src/pb-markdown.js +90 -99
  86. package/src/pb-media-query.js +74 -72
  87. package/src/pb-mei.js +306 -295
  88. package/src/pb-message.js +143 -130
  89. package/src/pb-mixin.js +269 -264
  90. package/src/pb-navigation.js +80 -82
  91. package/src/pb-observable.js +38 -38
  92. package/src/pb-odd-editor.js +1056 -958
  93. package/src/pb-odd-elementspec-editor.js +348 -297
  94. package/src/pb-odd-model-editor.js +1058 -898
  95. package/src/pb-odd-parameter-editor.js +200 -178
  96. package/src/pb-odd-rendition-editor.js +136 -124
  97. package/src/pb-page.js +432 -422
  98. package/src/pb-paginate.js +202 -190
  99. package/src/pb-panel.js +191 -179
  100. package/src/pb-popover-themes.js +7 -5
  101. package/src/pb-popover.js +296 -287
  102. package/src/pb-print-preview.js +127 -127
  103. package/src/pb-progress.js +49 -49
  104. package/src/pb-repeat.js +105 -104
  105. package/src/pb-restricted.js +84 -77
  106. package/src/pb-search.js +238 -221
  107. package/src/pb-select-feature.js +127 -120
  108. package/src/pb-select-odd.js +132 -124
  109. package/src/pb-select-template.js +89 -78
  110. package/src/pb-select.js +251 -227
  111. package/src/pb-split-list.js +179 -174
  112. package/src/pb-svg.js +80 -79
  113. package/src/pb-table-column.js +54 -54
  114. package/src/pb-table-grid.js +221 -203
  115. package/src/pb-tabs.js +61 -63
  116. package/src/pb-tify.js +154 -154
  117. package/src/pb-timeline.js +271 -229
  118. package/src/pb-toggle-feature.js +198 -185
  119. package/src/pb-upload.js +184 -174
  120. package/src/pb-version.js +30 -30
  121. package/src/pb-view-annotate.js +132 -98
  122. package/src/pb-view.js +1282 -1263
  123. package/src/pb-zoom.js +40 -40
  124. package/src/polymer-hack.js +1 -1
  125. package/src/search-result-service.js +256 -223
  126. package/src/seed-element.js +13 -20
  127. package/src/settings.js +4 -4
  128. package/src/theming.js +91 -91
  129. package/src/urls.js +289 -289
  130. 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);