scb-wc-test 0.1.284 → 0.1.285
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.
- package/mvc/components/scb-viz/scb-viz.js +111 -34
- package/package.json +2 -2
- package/scb-viz/scb-viz.d.ts +1 -4
- package/scb-viz/scb-viz.js +382 -253
- package/scb-wc-test.bundle.js +523 -446
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as
|
|
1
|
+
import{a as st,n as m,r as B,i as at,x as d,k as O,l as nt,t as rt}from"../../vendor/vendor.js";import"../scb-chip/scb-chip.js";import"../scb-segmented-button/scb-segmented-button.js";import"../scb-segmented-button/scb-segmented-item.js";import"../scb-accordion/scb-accordion.js";import"../scb-divider/scb-divider.js";import"../scb-horizontal-scroller/scb-horizontal-scroller.js";import"../scb-icon-button/scb-icon-button.js";import"../../vendor/preload-helper.js";import"../../vendor/vendor-material.js";import"../scb-accordion/scb-accordion-item.js";import"../scb-button/scb-button.js";(function(){try{var t=typeof globalThis<"u"?globalThis:window;if(!t.__scb_ce_guard_installed__){t.__scb_ce_guard_installed__=!0;var e=customElements.define.bind(customElements);customElements.define=function(i,r,s){try{customElements.get(i)||e(i,r,s)}catch(o){var c=String(o||"");if(c.indexOf("already been used")===-1&&c.indexOf("NotSupportedError")===-1)throw o}}}}catch{}})();var ot=Object.defineProperty,lt=Object.getOwnPropertyDescriptor,j=t=>{throw TypeError(t)},v=(t,e,i,r)=>{for(var s=r>1?void 0:r?lt(e,i):e,c=t.length-1,o;c>=0;c--)(o=t[c])&&(s=(r?o(e,i,s):o(s))||s);return r&&s&&ot(e,i,s),s},ct=(t,e,i)=>e.has(t)||j("Cannot "+i),ht=(t,e,i)=>e.has(t)?j("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,i),n=(t,e,i)=>(ct(t,e,"access private method"),i),a,L,H,P,S,R,q,W,C,k,u,N,G,U,J,K,X,Q,Y,V,Z,A,E,tt,et,I,F,T,x,D;const it=`<svg version="1.1" id="Lager_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
2
2
|
viewBox="0 0 727.3 87.3" style="enable-background:new 0 0 727.3 87.3;" xml:space="preserve" fill="currentColor">
|
|
3
3
|
<style type="text/css">
|
|
4
4
|
.st0{clip-path:url(#SVGID_00000118375311472882578510000008414848687067442345_);}
|
|
@@ -113,9 +113,9 @@ import{a as Z,n as b,r as tt,i as et,x as h,k as B,l as it,t as st}from"../../ve
|
|
|
113
113
|
<path d="M688.2,24.4h5.8v6h-5.8V24.4z M688.2,36.6h5.8v30.1h-5.8V36.6z"/>
|
|
114
114
|
<path d="M701.8,24.4h5.8v26.3h0.1l11.2-14.1h7l-10,11.7l11.4,18.3H720l-7.7-14l-4.6,5.4v8.7h-5.8V24.4H701.8z"/>
|
|
115
115
|
</svg>
|
|
116
|
-
`;let
|
|
116
|
+
`;let p=class extends at{constructor(){super(...arguments),ht(this,a),this.variant="Standard",this.selectedChip="Diagram",this.title="",this.subtitle="",this.description="",this.comment="",this.source="",this.footnote="",this.lang="sv",this.imageHref="",this.officialStatistics=!1,this.disableToggle=!1,this.contentMaxWidth="",this.containerMaxWidth="",this.contentHeight="",this.toggleHeightMode="auto",this._actionsMenuOpen=!1,this._diagramReflowFrame=0,this.spacing=void 0,this.spacingTop=void 0,this.spacingBottom=void 0,this.spacingLeft=void 0,this.spacingRight=void 0,this._onDocumentPointerDown=t=>{if(!this._actionsMenuOpen)return;const e=t.composedPath(),i=this.shadowRoot?.querySelector(".actions-menu");i&&e.includes(i)||this._closeActionsMenu()},this._onDocumentKeyDown=t=>{this._actionsMenuOpen&&t.key==="Escape"&&(t.preventDefault(),this._closeActionsMenu(),this._focusMenuButton())},this._onPrintClick=async()=>{this._closeActionsMenu(),await n(this,a,K).call(this)},this._onDownloadPngClick=async()=>{this._canExportRaster()&&(this._closeActionsMenu(),await n(this,a,k).call(this,"png"))},this._onDownloadJpgClick=async()=>{this._canExportRaster()&&(this._closeActionsMenu(),await n(this,a,k).call(this,"jpeg"))},this._onDownloadCsvClick=()=>{this._canExportCsv()&&(this._closeActionsMenu(),n(this,a,X).call(this))}}get descriptionLabel(){return this.lang==="en"?"Description of the chart":"Beskrivning av diagrammet"}get moreAboutStatsLabel(){return this.lang==="en"?"More about the statistics":"Mer om statistiken"}get commentLabel(){return this.lang==="en"?"Comments":"Kommentar"}get sourceLabel(){return this.lang==="en"?"Source":"Källa"}get footnoteLabel(){return this.lang==="en"?"Footnotes":"Fotnot"}get officialStatisticsLabel(){return this.lang==="en"?"Official statistics of Sweden":"Sveriges officiella statistik"}get officialStatisticsTitle(){return this.lang==="en"?"Part of Official statistics of Sweden":"Tillhör Sveriges officiella statistik"}get officialStatisticsAlt(){return this.lang==="en"?"Read more about Official statistics of Sweden":"Läs mer om Sveriges officiella statistik"}get actionsMenuLabel(){return this.lang==="en"?"Open menu":"Öppna meny"}get printLabel(){return this.lang==="en"?"Print":"Skriv ut"}get downloadPngLabel(){return this.lang==="en"?"Download PNG":"Ladda ner PNG"}get downloadJpgLabel(){return this.lang==="en"?"Download JPG":"Ladda ner JPG"}get downloadCsvLabel(){return this.lang==="en"?"Download CSV":"Ladda ner CSV"}_getImageAltText(){return[this.title,this.subtitle,this.description].map(e=>typeof e=="string"?e.trim():"").filter(Boolean).join(". ")||(this.lang==="en"?"Image figure":"Bildfigur")}connectedCallback(){super.connectedCallback(),document.addEventListener("pointerdown",this._onDocumentPointerDown,!0),document.addEventListener("keydown",this._onDocumentKeyDown)}firstUpdated(t){this._readTableDataFromSlot(),n(this,a,T).call(this),n(this,a,D).call(this),n(this,a,C).call(this),this._syncChipClass(),n(this,a,L).call(this),n(this,a,S).call(this)}updated(t){super.updated(t),(t.has("selectedChip")||t.has("variant"))&&(this._syncChipClass(),this._closeActionsMenu()),t.has("selectedChip")&&this._dispatchSelectedChipChanged(),(t.has("spacing")||t.has("spacingTop")||t.has("spacingBottom")||t.has("spacingLeft")||t.has("spacingRight"))&&n(this,a,T).call(this),t.has("containerMaxWidth")&&n(this,a,D).call(this),t.has("variant")&&n(this,a,L).call(this),(t.has("contentMaxWidth")||t.has("contentHeight")||t.has("toggleHeightMode")||t.has("variant"))&&n(this,a,C).call(this),(t.has("selectedChip")||t.has("variant")||t.has("contentMaxWidth")||t.has("contentHeight")||t.has("toggleHeightMode"))&&n(this,a,S).call(this)}disconnectedCallback(){super.disconnectedCallback(),document.removeEventListener("pointerdown",this._onDocumentPointerDown,!0),document.removeEventListener("keydown",this._onDocumentKeyDown),n(this,a,H).call(this),n(this,a,P).call(this)}_onTableSlotChange(t){const e=t.target;e&&(this._readTableDataFromSlot(e),this.requestUpdate())}_onDiagramSlotChange(){n(this,a,C).call(this),n(this,a,S).call(this),this.requestUpdate()}_normalizeRenderableCell(t){return t&&typeof t=="object"&&"html"in t&&"text"in t?{html:typeof t.html=="string"?t.html:"",text:typeof t.text=="string"?t.text:""}:{html:"",text:t==null?"":String(t)}}_readTableDataFromSlot(t){const e=t||this.shadowRoot?.querySelector('slot[name="table"]');if(!e)return;const i=e.assignedElements({flatten:!0}),r=[];i.forEach(g=>{if(g.tagName==="TABLE"){r.push(g);return}g.querySelectorAll("table").forEach(f=>r.push(f))});const s=r[0];if(!s){this._slottedTableData=void 0;return}const c=[],o=[],l=[],h=g=>g?(g.textContent??"").replace(/\s+/g," ").trim():"",b=g=>g?{html:(g.innerHTML??"").trim(),text:h(g)}:{html:"",text:""},y=s.querySelector("thead tr");y&&Array.from(y.querySelectorAll("th, td")).forEach(f=>c.push(b(f)));const z=Array.from(s.querySelectorAll("tbody tr")),w=z.length>0?z:Array.from(s.querySelectorAll("tr")).filter(g=>g.closest("thead")===null);if(w.forEach(g=>{const f=Array.from(g.querySelectorAll("th, td"));if(f.length===0)return;const _=f[0].tagName==="TH"&&g.closest("thead")===null&&g.closest("tfoot")===null;l.push(_);const $=[];f.forEach(M=>$.push(b(M))),o.push($)}),!y&&o.length>0){const g=o[0],f=w[0],_=Array.from(f?.querySelectorAll("th, td")??[]);_.length>0&&_.every(M=>M.tagName==="TH")&&f?.closest("tbody")===null&&(c.splice(0,c.length,...g),o.shift(),l.shift())}this._slottedTableData={headers:c.length>0?c:void 0,rows:o,rowHeaderRows:l.length>0?l:void 0}}_inferTableAlignments(t){const e=Math.max(t.headers?.length??0,...t.rows.map(s=>s.length)),i=s=>{if(s==null)return!1;if(typeof s=="number")return!0;const c=String(s).replace(/[\u00A0\u202F\s]+/g,"").trim();return c?/^-?\d+(?:[.,]\d+)?$/.test(c):!1},r=[];for(let s=0;s<e;s+=1){if(s===0){r.push("left");continue}const c=t.rows.map(l=>this._normalizeRenderableCell(l[s]).text).filter(l=>l!==""&&l!==null&&l!==void 0),o=c.length>0&&c.every(i);r.push(o?"right":"left")}return r}_getResolvedContentMaxWidth(){return this.contentMaxWidth?.trim()||""}_getResolvedDiagramHeight(){return this.contentHeight?.trim()||""}_getResolvedToggleHeightMode(){return this.toggleHeightMode==="auto"?"auto":"stable"}_getResolvedStandardContentHeight(){return this._getResolvedDiagramHeight()||"420px"}_getResolvedTableData(){return this.tableData??this._slottedTableData}_getDiagramAssignedElements(){const t=this.shadowRoot?.querySelector('slot[name="diagram"]');return t?t.assignedElements({flatten:!0}):[]}_findExportableVisualElement(t){for(const e of t){if(e instanceof SVGSVGElement||e instanceof HTMLCanvasElement||e instanceof HTMLImageElement)return e;const i=e.querySelector("svg, canvas, img");if(i instanceof SVGSVGElement||i instanceof HTMLCanvasElement||i instanceof HTMLImageElement)return i}return null}_getExportableVisualElement(){if(this.variant==="Table")return null;if(this.variant==="Image"){const t=this.shadowRoot?.querySelector(".image-content img");return t instanceof HTMLImageElement?t:null}return this._findExportableVisualElement(this._getDiagramAssignedElements())}_canExportRaster(){return this._getExportableVisualElement()!==null}_canExportCsv(){return!!this._getResolvedTableData()?.rows?.length}_getExportBaseFileName(){const t=this.lang==="en"?"visualization":"visualisering";return(this.title||t).normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||t}_buildExportFileName(t){const e=t==="csv"?this.lang==="en"?"-table":"-tabell":"";return`${this._getExportBaseFileName()}${e}.${t}`}_renderActions(){const t=this._canExportRaster(),e=this._canExportCsv(),i=this.variant==="Standard"||this.variant==="Image",r=this.variant==="Standard"||this.variant==="Table";return d`
|
|
117
117
|
<div class="actions-row">
|
|
118
|
-
${this.variant==="Standard"&&!this.disableToggle?
|
|
118
|
+
${this.variant==="Standard"&&!this.disableToggle?d`
|
|
119
119
|
<div class="flipp-wrapper">
|
|
120
120
|
<scb-segmented-button
|
|
121
121
|
.value=${this.selectedChip||""}
|
|
@@ -133,7 +133,7 @@ import{a as Z,n as b,r as tt,i as et,x as h,k as B,l as it,t as st}from"../../ve
|
|
|
133
133
|
></scb-segmented-item>
|
|
134
134
|
</scb-segmented-button>
|
|
135
135
|
</div>
|
|
136
|
-
`:
|
|
136
|
+
`:d`<div></div>`}
|
|
137
137
|
<div class="actions-menu">
|
|
138
138
|
<scb-icon-button
|
|
139
139
|
icon="more_vert"
|
|
@@ -164,7 +164,7 @@ import{a as Z,n as b,r as tt,i as et,x as h,k as B,l as it,t as st}from"../../ve
|
|
|
164
164
|
<span class="actions-menu-item-label">${this.printLabel}</span>
|
|
165
165
|
</button>
|
|
166
166
|
</li>
|
|
167
|
-
${i?
|
|
167
|
+
${i?d`
|
|
168
168
|
<li>
|
|
169
169
|
<button
|
|
170
170
|
type="button"
|
|
@@ -190,7 +190,7 @@ import{a as Z,n as b,r as tt,i as et,x as h,k as B,l as it,t as st}from"../../ve
|
|
|
190
190
|
</button>
|
|
191
191
|
</li>
|
|
192
192
|
`:""}
|
|
193
|
-
${
|
|
193
|
+
${r?d`
|
|
194
194
|
<li>
|
|
195
195
|
<button
|
|
196
196
|
type="button"
|
|
@@ -208,45 +208,45 @@ import{a as Z,n as b,r as tt,i as et,x as h,k as B,l as it,t as st}from"../../ve
|
|
|
208
208
|
</div>
|
|
209
209
|
</div>
|
|
210
210
|
</div>
|
|
211
|
-
`}_renderTable(){const t=this.tableData??this._slottedTableData;if(!t||!t.rows||t.rows.length===0)return null;const e=this._inferTableAlignments(t),i=Math.max(t.headers?.length??0,...t.rows.map(
|
|
211
|
+
`}_renderTable(){const t=this.tableData??this._slottedTableData;if(!t||!t.rows||t.rows.length===0)return null;const e=this._inferTableAlignments(t),i=Math.max(t.headers?.length??0,...t.rows.map(l=>l.length)),r=(t.headers??[]).map(l=>this._normalizeRenderableCell(l)),s=t.rows.map(l=>{const h=l.map(b=>this._normalizeRenderableCell(b));for(;h.length<i;)h.push({html:"",text:""});return h}),c=t.rowHeaderRows??[],o=[this.title,this.subtitle].map(l=>typeof l=="string"?l.trim():"").filter(Boolean).join(". ");return d`
|
|
212
212
|
<table class="scb-viz-table" part="table">
|
|
213
|
-
${
|
|
214
|
-
${
|
|
213
|
+
${o?d`<caption class="visually-hidden">${o}</caption>`:""}
|
|
214
|
+
${r.length>0?d`
|
|
215
215
|
<thead>
|
|
216
216
|
<tr>
|
|
217
|
-
${
|
|
217
|
+
${r.map((l,h)=>{const b=e[h]==="right"?"align-right":"align-left";return d`<th scope="col" class=${b}>${l.html?O(l.html):l.text}</th>`})}
|
|
218
218
|
</tr>
|
|
219
219
|
</thead>
|
|
220
220
|
`:""}
|
|
221
221
|
<tbody>
|
|
222
|
-
${s.map((
|
|
222
|
+
${s.map((l,h)=>{const b=c[h]===!0;return d`
|
|
223
223
|
<tr>
|
|
224
|
-
${
|
|
224
|
+
${l.map((y,z)=>{const w=e[z]==="right"?"align-right":"align-left",g=y.html?O(y.html):y.text;return z===0&&b?d`<th scope="row" class=${w}>${g}</th>`:d`<td class=${w}>${g}</td>`})}
|
|
225
225
|
</tr>
|
|
226
226
|
`})}
|
|
227
227
|
</tbody>
|
|
228
228
|
</table>
|
|
229
|
-
`}_hasMoreAboutStats(){return!!(this.comment||this.source||this.footnote||this.officialStatistics)}_renderMoreAboutStatsContent(){return
|
|
229
|
+
`}_hasMoreAboutStats(){return!!(this.comment||this.source||this.footnote||this.officialStatistics)}_renderMoreAboutStatsContent(){return d`
|
|
230
230
|
<div class="more-about-stats-content">
|
|
231
|
-
${this.comment?
|
|
231
|
+
${this.comment?d`
|
|
232
232
|
<div class="section">
|
|
233
233
|
<div class="secondary-label" role="heading" aria-level="3">${this.commentLabel}</div>
|
|
234
234
|
<div class="body-text">${this.comment}</div>
|
|
235
235
|
</div>
|
|
236
236
|
`:""}
|
|
237
|
-
${this.source?
|
|
237
|
+
${this.source?d`
|
|
238
238
|
<div class="section">
|
|
239
239
|
<div class="secondary-label" role="heading" aria-level="3">${this.sourceLabel}</div>
|
|
240
240
|
<div class="body-text">${this.source}</div>
|
|
241
241
|
</div>
|
|
242
242
|
`:""}
|
|
243
|
-
${this.footnote?
|
|
243
|
+
${this.footnote?d`
|
|
244
244
|
<div class="section">
|
|
245
245
|
<div class="secondary-label" role="heading" aria-level="3">${this.footnoteLabel}</div>
|
|
246
246
|
<div class="body-text">${this.footnote}</div>
|
|
247
247
|
</div>
|
|
248
248
|
`:""}
|
|
249
|
-
${this.officialStatistics?
|
|
249
|
+
${this.officialStatistics?d`
|
|
250
250
|
<a
|
|
251
251
|
class="sos-logotype-link"
|
|
252
252
|
href="https://www.scb.se/sos"
|
|
@@ -256,12 +256,12 @@ import{a as Z,n as b,r as tt,i as et,x as h,k as B,l as it,t as st}from"../../ve
|
|
|
256
256
|
aria-label="${this.officialStatisticsAlt}"
|
|
257
257
|
>
|
|
258
258
|
<span class="sos-logotype-small" aria-hidden="true">
|
|
259
|
-
${it
|
|
259
|
+
${nt(it)}
|
|
260
260
|
</span>
|
|
261
261
|
</a>
|
|
262
262
|
`:""}
|
|
263
263
|
</div>
|
|
264
|
-
`}_renderMoreAboutStatsScreen(){return this._hasMoreAboutStats()?
|
|
264
|
+
`}_renderMoreAboutStatsScreen(){return this._hasMoreAboutStats()?d`
|
|
265
265
|
<div class="footer-statistics-screen">
|
|
266
266
|
<scb-divider></scb-divider>
|
|
267
267
|
<scb-accordion>
|
|
@@ -270,16 +270,16 @@ import{a as Z,n as b,r as tt,i as et,x as h,k as B,l as it,t as st}from"../../ve
|
|
|
270
270
|
</scb-accordion-item>
|
|
271
271
|
</scb-accordion>
|
|
272
272
|
</div>
|
|
273
|
-
`:""}_renderMoreAboutStatsPrint(){return this._hasMoreAboutStats()?
|
|
273
|
+
`:""}_renderMoreAboutStatsPrint(){return this._hasMoreAboutStats()?d`
|
|
274
274
|
<div class="footer-statistics-print print-more-about-stats">
|
|
275
275
|
<div class="secondary-label print-more-about-stats-heading" role="heading" aria-level="3">
|
|
276
276
|
${this.moreAboutStatsLabel}
|
|
277
277
|
</div>
|
|
278
278
|
${this._renderMoreAboutStatsContent()}
|
|
279
279
|
</div>
|
|
280
|
-
`:""}_renderFooter(){return
|
|
280
|
+
`:""}_renderFooter(){return d`
|
|
281
281
|
<div class="footer">
|
|
282
|
-
${this.description?
|
|
282
|
+
${this.description?d`
|
|
283
283
|
<div class="description section">
|
|
284
284
|
<div class="secondary-label" role="heading" aria-level="3">${this.descriptionLabel}</div>
|
|
285
285
|
<div class="body-text">${this.description}</div>
|
|
@@ -288,11 +288,11 @@ import{a as Z,n as b,r as tt,i as et,x as h,k as B,l as it,t as st}from"../../ve
|
|
|
288
288
|
${this._renderMoreAboutStatsScreen()}
|
|
289
289
|
${this._renderMoreAboutStatsPrint()}
|
|
290
290
|
</div>
|
|
291
|
-
`}render(){switch(this.variant){case"Table":return
|
|
291
|
+
`}render(){switch(this.variant){case"Table":return d`
|
|
292
292
|
<div part="container" class="viz-container">
|
|
293
293
|
<div class="header">
|
|
294
|
-
${this.title?
|
|
295
|
-
${this.subtitle?
|
|
294
|
+
${this.title?d` <div class="label" role="heading" aria-level="2">${this.title}</div> `:""}
|
|
295
|
+
${this.subtitle?d` <div class="sub-label">${this.subtitle}</div> `:""}
|
|
296
296
|
</div>
|
|
297
297
|
${this._renderActions()}
|
|
298
298
|
<div class="content">
|
|
@@ -313,11 +313,11 @@ import{a as Z,n as b,r as tt,i as et,x as h,k as B,l as it,t as st}from"../../ve
|
|
|
313
313
|
></slot>
|
|
314
314
|
<slot></slot>
|
|
315
315
|
</div>
|
|
316
|
-
`;case"Image":return
|
|
316
|
+
`;case"Image":return d`
|
|
317
317
|
<div part="container" class="viz-container">
|
|
318
318
|
<div class="header">
|
|
319
|
-
${this.title?
|
|
320
|
-
${this.subtitle?
|
|
319
|
+
${this.title?d` <div class="label" role="heading" aria-level="2">${this.title}</div> `:""}
|
|
320
|
+
${this.subtitle?d` <div class="sub-label">${this.subtitle}</div> `:""}
|
|
321
321
|
</div>
|
|
322
322
|
${this._renderActions()}
|
|
323
323
|
<div
|
|
@@ -334,11 +334,11 @@ import{a as Z,n as b,r as tt,i as et,x as h,k as B,l as it,t as st}from"../../ve
|
|
|
334
334
|
></slot>
|
|
335
335
|
<slot></slot>
|
|
336
336
|
</div>
|
|
337
|
-
`;default:return
|
|
337
|
+
`;default:return d`
|
|
338
338
|
<div part="container" class="viz-container">
|
|
339
339
|
<div class="header">
|
|
340
|
-
${this.title?
|
|
341
|
-
${this.subtitle?
|
|
340
|
+
${this.title?d` <div class="label" role="heading" aria-level="2">${this.title}</div> `:""}
|
|
341
|
+
${this.subtitle?d` <div class="sub-label">${this.subtitle}</div> `:""}
|
|
342
342
|
</div>
|
|
343
343
|
${this._renderActions()}
|
|
344
344
|
<div class="content">
|
|
@@ -386,8 +386,85 @@ import{a as Z,n as b,r as tt,i as et,x as h,k as B,l as it,t as st}from"../../ve
|
|
|
386
386
|
></slot>
|
|
387
387
|
<slot></slot>
|
|
388
388
|
</div>
|
|
389
|
-
`}}_syncChipClass(){const t=this.variant==="Standard";this.classList.toggle("chip-diagram",t&&this.selectedChip==="Diagram"),this.classList.toggle("chip-table",t&&this.selectedChip==="Table")}_dispatchSelectedChipChanged(){const t={selectedChip:this.selectedChip};this.dispatchEvent(new CustomEvent("selected-chip-changed",{detail:t,bubbles:!0,composed:!0})),this.dispatchEvent(new CustomEvent("selectedchipchanged",{detail:t,bubbles:!0,composed:!0}))}_onSegmentedChange(t){const e=t.detail?.value;this.selectedChip===e?this.selectedChip=null:this.selectedChip=e}_toggleActionsMenu(t){t.stopPropagation(),this._actionsMenuOpen=!this._actionsMenuOpen,this._actionsMenuOpen&&requestAnimationFrame(()=>{this._focusFirstMenuItem()})}_closeActionsMenu(){this._actionsMenuOpen=!1}_focusMenuButton(){this.shadowRoot?.querySelector(".actions-menu scb-icon-button")?.focus()}_focusFirstMenuItem(){this.shadowRoot?.querySelector(".actions-menu-item")?.focus()}};a=new WeakSet
|
|
390
|
-
|
|
389
|
+
`}}_syncChipClass(){const t=this.variant==="Standard";this.classList.toggle("chip-diagram",t&&this.selectedChip==="Diagram"),this.classList.toggle("chip-table",t&&this.selectedChip==="Table")}_dispatchSelectedChipChanged(){const t={selectedChip:this.selectedChip};this.dispatchEvent(new CustomEvent("selected-chip-changed",{detail:t,bubbles:!0,composed:!0})),this.dispatchEvent(new CustomEvent("selectedchipchanged",{detail:t,bubbles:!0,composed:!0}))}_onSegmentedChange(t){const e=t.detail?.value;this.selectedChip===e?this.selectedChip=null:this.selectedChip=e}_toggleActionsMenu(t){t.stopPropagation(),this._actionsMenuOpen=!this._actionsMenuOpen,this._actionsMenuOpen&&requestAnimationFrame(()=>{this._focusFirstMenuItem()})}_closeActionsMenu(){this._actionsMenuOpen=!1}_focusMenuButton(){this.shadowRoot?.querySelector(".actions-menu scb-icon-button")?.focus()}_focusFirstMenuItem(){this.shadowRoot?.querySelector(".actions-menu-item")?.focus()}_getCurrentPrintableView(){return this.variant==="Table"?"table":this.variant==="Image"?"image":this.selectedChip==="Table"?"table":"diagram"}};a=new WeakSet;L=function(){if(n(this,a,H).call(this),typeof ResizeObserver>"u")return;const t=this.shadowRoot?.querySelector(".diagram-content");t&&(this._diagramResizeObserver=new ResizeObserver(()=>{n(this,a,S).call(this)}),this._diagramResizeObserver.observe(this),this._diagramResizeObserver.observe(t))};H=function(){this._diagramResizeObserver?.disconnect(),this._diagramResizeObserver=void 0};P=function(){this._diagramReflowFrame&&(cancelAnimationFrame(this._diagramReflowFrame),this._diagramReflowFrame=0)};S=function(){this.variant!=="Standard"||this.selectedChip!=="Diagram"||(n(this,a,P).call(this),this._diagramReflowFrame=requestAnimationFrame(()=>{this._diagramReflowFrame=requestAnimationFrame(()=>{this._diagramReflowFrame=0,n(this,a,W).call(this)})}))};R=function(t){const e=t?.getAttribute("data-highcharts-chart");if(!e)return;const i=Number.parseInt(e,10);return Number.isNaN(i)?void 0:i};q=function(t){for(const e of t){const i=n(this,a,R).call(this,e);if(i!==void 0)return i;const r=e.querySelector("[data-highcharts-chart]"),s=n(this,a,R).call(this,r);if(s!==void 0)return s}};W=function(){if(this.variant!=="Standard"||this.selectedChip!=="Diagram")return;const t=this.shadowRoot?.querySelector('slot[name="diagram"]');if(!t)return;const e=t.assignedElements({flatten:!0});if(e.length===0)return;const i=n(this,a,q).call(this,e);if(i===void 0)return;const s=window.Highcharts?.charts?.[i];s&&(s.setSize?.(null,null,!1),s.reflow?.())};C=function(){const t=this.variant==="Standard"?this._getResolvedDiagramHeight():"",e=this.variant==="Standard"&&this._getResolvedToggleHeightMode()==="stable"?this._getResolvedStandardContentHeight():"";this.variant==="Standard"?this.style.setProperty("--scb-viz-diagram-min-height",t||"420px"):this.style.removeProperty("--scb-viz-diagram-min-height"),t?(this.style.setProperty("--scb-viz-diagram-height",t),this.style.setProperty("--scb-viz-diagram-overflow","hidden")):(this.style.removeProperty("--scb-viz-diagram-height"),this.style.removeProperty("--scb-viz-diagram-overflow")),e?this.style.setProperty("--scb-viz-standard-content-height",e):this.style.removeProperty("--scb-viz-standard-content-height")};k=async function(t){const e=this._getExportableVisualElement();if(!e)return;const i=await n(this,a,Q).call(this,e,t);i&&n(this,a,F).call(this,i,this._buildExportFileName(t==="jpeg"?"jpg":"png"))};u=function(t){return String(t??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")};N=function(t){const e=this._inferTableAlignments(t),i=Math.max(t.headers?.length??0,...t.rows.map(h=>h.length)),r=(t.headers??[]).map(h=>this._normalizeRenderableCell(h)),s=t.rows.map(h=>{const b=h.map(y=>this._normalizeRenderableCell(y));for(;b.length<i;)b.push({html:"",text:""});return b}),c=t.rowHeaderRows??[],o=r.length?`<thead><tr>${r.map((h,b)=>`<th scope="col" class="${e[b]==="right"?"align-right":"align-left"}">${h.html||n(this,a,u).call(this,h.text)}</th>`).join("")}</tr></thead>`:"",l=`<tbody>${s.map((h,b)=>{const y=c[b]===!0;return`<tr>${h.map((w,g)=>{const f=e[g]==="right"?"align-right":"align-left",_=w.html||n(this,a,u).call(this,w.text);return g===0&&y?`<th scope="row" class="${f}">${_}</th>`:`<td class="${f}">${_}</td>`}).join("")}</tr>`}).join("")}</tbody>`;return`<table class="scb-viz-print-table">${o}${l}</table>`};G=function(){const t=[];if(this.description&&t.push(`
|
|
390
|
+
<section class="print-section">
|
|
391
|
+
<h2>${n(this,a,u).call(this,this.descriptionLabel)}</h2>
|
|
392
|
+
<div>${n(this,a,u).call(this,this.description)}</div>
|
|
393
|
+
</section>
|
|
394
|
+
`),this._hasMoreAboutStats()){const e=[];this.comment&&e.push(`
|
|
395
|
+
<section class="print-section print-meta-section">
|
|
396
|
+
<h3>${n(this,a,u).call(this,this.commentLabel)}</h3>
|
|
397
|
+
<div>${n(this,a,u).call(this,this.comment)}</div>
|
|
398
|
+
</section>
|
|
399
|
+
`),this.source&&e.push(`
|
|
400
|
+
<section class="print-section print-meta-section">
|
|
401
|
+
<h3>${n(this,a,u).call(this,this.sourceLabel)}</h3>
|
|
402
|
+
<div>${n(this,a,u).call(this,this.source)}</div>
|
|
403
|
+
</section>
|
|
404
|
+
`),this.footnote&&e.push(`
|
|
405
|
+
<section class="print-section print-meta-section">
|
|
406
|
+
<h3>${n(this,a,u).call(this,this.footnoteLabel)}</h3>
|
|
407
|
+
<div>${n(this,a,u).call(this,this.footnote)}</div>
|
|
408
|
+
</section>
|
|
409
|
+
`),this.officialStatistics&&e.push(`
|
|
410
|
+
<div class="print-sos">${it}</div>
|
|
411
|
+
`),t.push(`
|
|
412
|
+
<section class="print-section print-more-about-stats">
|
|
413
|
+
<h2>${n(this,a,u).call(this,this.moreAboutStatsLabel)}</h2>
|
|
414
|
+
${e.join("")}
|
|
415
|
+
</section>
|
|
416
|
+
`)}return t.join("")};U=function(t){return`<!doctype html>
|
|
417
|
+
<html lang="${n(this,a,u).call(this,this.lang||"sv")}">
|
|
418
|
+
<head>
|
|
419
|
+
<meta charset="utf-8">
|
|
420
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
421
|
+
<title>${n(this,a,u).call(this,this.title||(this.lang==="en"?"Visualization":"Visualisering"))}</title>
|
|
422
|
+
<style>
|
|
423
|
+
:root { color-scheme: light; }
|
|
424
|
+
@page { margin: 16mm; }
|
|
425
|
+
* { box-sizing: border-box; }
|
|
426
|
+
html, body { margin: 0; padding: 0; background: #fff; }
|
|
427
|
+
body {
|
|
428
|
+
font-family: var(--brand-font, Inter, 'Segoe UI', Arial, sans-serif);
|
|
429
|
+
color: var(--md-sys-color-on-surface, #1f1f1f);
|
|
430
|
+
-webkit-print-color-adjust: exact;
|
|
431
|
+
print-color-adjust: exact;
|
|
432
|
+
}
|
|
433
|
+
.viz-print { width: 100%; }
|
|
434
|
+
.viz-header { max-width: 600px; margin-bottom: 24px; }
|
|
435
|
+
.viz-title { font-size: 1.75rem; font-weight: 600; line-height: 1.25; margin: 0; }
|
|
436
|
+
.viz-subtitle { font-size: 1rem; font-weight: 400; line-height: 1.5; margin: 0; }
|
|
437
|
+
.viz-content { width: 100%; }
|
|
438
|
+
.viz-chart-image, .viz-image { display: block; max-width: 100%; height: auto; }
|
|
439
|
+
.print-section { max-width: 600px; margin-top: 16px; }
|
|
440
|
+
.print-section h2, .print-section h3 { margin: 0 0 8px 0; font-size: 1rem; font-weight: 600; line-height: 1.5; }
|
|
441
|
+
.print-section h3 { margin-bottom: 4px; }
|
|
442
|
+
.print-more-about-stats { margin-top: 16px; }
|
|
443
|
+
.print-meta-section { margin-top: 0; margin-bottom: 16px; }
|
|
444
|
+
.print-sos { display: inline-flex; margin-top: 8px; color: inherit; }
|
|
445
|
+
.print-sos svg { height: 24px; width: auto; display: block; }
|
|
446
|
+
.scb-viz-print-table { border-collapse: collapse; width: max-content; max-width: 100%; font-size: 1rem; line-height: 1.5; }
|
|
447
|
+
.scb-viz-print-table th, .scb-viz-print-table td { border: 1px solid #c5c7d0; padding: 8px 12px; text-align: start; }
|
|
448
|
+
.scb-viz-print-table thead th { font-weight: 700; }
|
|
449
|
+
.scb-viz-print-table tbody th { font-weight: 400; }
|
|
450
|
+
.scb-viz-print-table tbody tr:nth-child(odd) { background: #f5f5f5; }
|
|
451
|
+
.scb-viz-print-table tbody tr:nth-child(even) { background: #fff; }
|
|
452
|
+
.scb-viz-print-table .align-right { text-align: right; white-space: nowrap; }
|
|
453
|
+
.scb-viz-print-table .align-left { text-align: left; }
|
|
454
|
+
</style>
|
|
455
|
+
</head>
|
|
456
|
+
<body>
|
|
457
|
+
<article class="viz-print">
|
|
458
|
+
<header class="viz-header">
|
|
459
|
+
${this.title?`<h1 class="viz-title">${n(this,a,u).call(this,this.title)}</h1>`:""}
|
|
460
|
+
${this.subtitle?`<div class="viz-subtitle">${n(this,a,u).call(this,this.subtitle)}</div>`:""}
|
|
461
|
+
</header>
|
|
462
|
+
<div class="viz-content">${t}</div>
|
|
463
|
+
${n(this,a,G).call(this)}
|
|
464
|
+
</article>
|
|
465
|
+
</body>
|
|
466
|
+
</html>`};J=async function(t){const e=document.createElement("iframe");e.setAttribute("aria-hidden","true"),e.style.position="fixed",e.style.right="0",e.style.bottom="0",e.style.width="0",e.style.height="0",e.style.border="0",e.style.visibility="hidden",document.body.appendChild(e);const i=()=>{e.remove()},r=e.contentDocument,s=e.contentWindow;if(!r||!s){i();return}r.open(),r.write(t),r.close();const c=Array.from(r.images||[]);await Promise.all(c.map(l=>l.complete?Promise.resolve():new Promise(h=>{l.addEventListener("load",()=>h(null),{once:!0}),l.addEventListener("error",()=>h(null),{once:!0})})));const o=()=>{s.removeEventListener("afterprint",o),i()};s.addEventListener("afterprint",o,{once:!0}),setTimeout(()=>{s.focus(),s.print(),setTimeout(i,1e3)},50)};K=async function(){const t=this._getCurrentPrintableView();let e="";if(t==="table"){const i=this._getResolvedTableData();if(!i?.rows?.length)return;e=n(this,a,N).call(this,i)}else if(t==="image"){const i=this.shadowRoot?.querySelector(".image-content img"),r=i?.currentSrc||i?.src||this.imageHref;if(!r)return;e=`<img class="viz-image" src="${n(this,a,u).call(this,r)}" alt="${n(this,a,u).call(this,this._getImageAltText())}">`}else{const i=this._getExportableVisualElement();if(!i)return;const r=await n(this,a,Y).call(this,i,"png");if(!r)return;e=`<img class="viz-chart-image" src="${r}" alt="${n(this,a,u).call(this,this._getImageAltText())}">`}await n(this,a,J).call(this,n(this,a,U).call(this,e))};X=function(){const t=this._getResolvedTableData();if(!t?.rows?.length)return;const e=this.lang==="en"?",":";",i=[];t.headers?.length&&i.push(t.headers.map(o=>this._normalizeRenderableCell(o).text)),t.rows.forEach(o=>{i.push(o.map(l=>this._normalizeRenderableCell(l).text))});const r=o=>`"${String(o??"").replace(/\r?\n/g," ").replace(/"/g,'""')}"`,s=`\uFEFF${i.map(o=>o.map(r).join(e)).join(`\r
|
|
467
|
+
`)}`,c=new Blob([s],{type:"text/csv;charset=utf-8;"});n(this,a,F).call(this,c,this._buildExportFileName("csv"))};Q=async function(t,e){const i=await n(this,a,V).call(this,t);return i?n(this,a,et).call(this,i,e==="jpeg"?"image/jpeg":"image/png",e==="jpeg"?.92:void 0):null};Y=async function(t,e){const i=await n(this,a,V).call(this,t);return i?i.toDataURL(e==="jpeg"?"image/jpeg":"image/png",e==="jpeg"?.92:void 0):null};V=async function(t){if(t instanceof HTMLCanvasElement){const o=t.width||Math.round(t.getBoundingClientRect().width),l=t.height||Math.round(t.getBoundingClientRect().height);if(!o||!l)return null;const h=document.createElement("canvas");h.width=o,h.height=l;const b=h.getContext("2d");return b?(b.fillStyle=n(this,a,I).call(this),b.fillRect(0,0,o,l),b.drawImage(t,0,0,o,l),h):null}if(t instanceof HTMLImageElement){const o=t.naturalWidth||t.width,l=t.naturalHeight||t.height;return!o||!l?null:n(this,a,E).call(this,t.currentSrc||t.src,o,l)}const{width:e,height:i,serialized:r}=n(this,a,Z).call(this,t);if(!e||!i||!r)return null;const s=new Blob([r],{type:"image/svg+xml;charset=utf-8"}),c=URL.createObjectURL(s);try{return await n(this,a,E).call(this,c,e,i)}finally{URL.revokeObjectURL(c)}};Z=function(t){const e=t.cloneNode(!0),i=t.getBoundingClientRect(),r=t.viewBox?.baseVal,s=Math.round(r?.width||i.width||Number(t.getAttribute("width"))||0),c=Math.round(r?.height||i.height||Number(t.getAttribute("height"))||0);return e.setAttribute("xmlns","http://www.w3.org/2000/svg"),e.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink"),!e.getAttribute("width")&&s&&e.setAttribute("width",String(s)),!e.getAttribute("height")&&c&&e.setAttribute("height",String(c)),!e.getAttribute("viewBox")&&s&&c&&e.setAttribute("viewBox",`0 0 ${s} ${c}`),n(this,a,A).call(this,t,e),e.querySelectorAll(".highcharts-tooltip, .highcharts-contextmenu, .highcharts-a11y-proxy-container, .highcharts-a11y-dummy-point").forEach(o=>o.remove()),{width:s,height:c,serialized:new XMLSerializer().serializeToString(e)}};A=function(t,e){const i=getComputedStyle(t);let r="";for(let o=0;o<i.length;o+=1){const l=i[o],h=i.getPropertyValue(l);h&&(r+=`${l}:${h};`)}r&&e.setAttribute("style",r);const s=Array.from(t.children),c=Array.from(e.children);for(let o=0;o<s.length;o+=1){const l=s[o],h=c[o];l&&h&&n(this,a,A).call(this,l,h)}};E=async function(t,e,i){const r=Math.max(1,Math.min(2,window.devicePixelRatio||1)),s=Math.max(1,Math.round(e)),c=Math.max(1,Math.round(i)),o=document.createElement("canvas");o.width=Math.max(1,Math.round(s*r)),o.height=Math.max(1,Math.round(c*r));const l=o.getContext("2d");if(!l)return null;const h=await n(this,a,tt).call(this,t);return h?(l.scale(r,r),l.fillStyle=n(this,a,I).call(this),l.fillRect(0,0,s,c),l.drawImage(h,0,0,s,c),o):null};tt=function(t){return new Promise(e=>{const i=new Image;i.crossOrigin="anonymous",i.onload=()=>e(i),i.onerror=()=>e(null),i.src=t})};et=function(t,e,i){return new Promise(r=>{t.toBlob(s=>r(s),e,i)})};I=function(){const t=this.shadowRoot?.querySelector(".viz-container"),e=getComputedStyle(t??this).backgroundColor;return e&&e!=="rgba(0, 0, 0, 0)"?e:"#ffffff"};F=function(t,e){const i=URL.createObjectURL(t),r=document.createElement("a");r.href=i,r.download=e,document.body.appendChild(r),r.click(),r.remove(),setTimeout(()=>URL.revokeObjectURL(i),0)};T=function(){const t=n(this,a,x).call(this,this.spacing),e=n(this,a,x).call(this,this.spacingTop)??t,i=n(this,a,x).call(this,this.spacingBottom)??t,r=n(this,a,x).call(this,this.spacingLeft),s=n(this,a,x).call(this,this.spacingRight);e?this.style.setProperty("--scb-viz-spacing-block-start",e):this.style.removeProperty("--scb-viz-spacing-block-start"),i?this.style.setProperty("--scb-viz-spacing-block-end",i):this.style.removeProperty("--scb-viz-spacing-block-end"),r?this.style.setProperty("--scb-viz-spacing-inline-start",r):this.style.removeProperty("--scb-viz-spacing-inline-start"),s?this.style.setProperty("--scb-viz-spacing-inline-end",s):this.style.removeProperty("--scb-viz-spacing-inline-end")};x=function(t){if(!t)return;const e=String(t).trim();if(e)return/^\d+$/.test(e)?`var(--spacing-${Math.max(0,Math.min(14,parseInt(e,10)))})`:e};D=function(){const t=this.containerMaxWidth?.trim();t?this.style.setProperty("--scb-viz-container-max-width",t):this.style.removeProperty("--scb-viz-container-max-width")};p.styles=st`
|
|
391
468
|
:host {
|
|
392
469
|
display: block;
|
|
393
470
|
box-sizing: border-box;
|
|
@@ -1012,4 +1089,4 @@ import{a as Z,n as b,r as tt,i as et,x as h,k as B,l as it,t as st}from"../../ve
|
|
|
1012
1089
|
width: calc(100% / var(--scb-viz-print-scale, 1));
|
|
1013
1090
|
}
|
|
1014
1091
|
}
|
|
1015
|
-
`;
|
|
1092
|
+
`;v([m({type:String,reflect:!0})],p.prototype,"variant",2);v([m({type:String,reflect:!0,attribute:"selected-chip"})],p.prototype,"selectedChip",2);v([m({type:String,reflect:!0})],p.prototype,"title",2);v([m({type:String,reflect:!0})],p.prototype,"subtitle",2);v([m({type:String,reflect:!0})],p.prototype,"description",2);v([m({type:String,reflect:!0})],p.prototype,"comment",2);v([m({type:String,reflect:!0})],p.prototype,"source",2);v([m({type:String,reflect:!0})],p.prototype,"footnote",2);v([m({type:String,reflect:!0,attribute:"lang"})],p.prototype,"lang",2);v([m({type:String,reflect:!0,attribute:"image-href"})],p.prototype,"imageHref",2);v([m({type:Boolean,reflect:!0,attribute:"official-statistics"})],p.prototype,"officialStatistics",2);v([m({type:Boolean,reflect:!0,attribute:"disable-toggle"})],p.prototype,"disableToggle",2);v([m({type:String,attribute:"content-max-width"})],p.prototype,"contentMaxWidth",2);v([m({type:String,attribute:"container-max-width"})],p.prototype,"containerMaxWidth",2);v([m({type:String,attribute:"content-height"})],p.prototype,"contentHeight",2);v([m({type:String,reflect:!0,attribute:"toggle-height-mode"})],p.prototype,"toggleHeightMode",2);v([m({attribute:!1})],p.prototype,"tableData",2);v([B()],p.prototype,"_slottedTableData",2);v([B()],p.prototype,"_actionsMenuOpen",2);v([m({type:String,reflect:!0})],p.prototype,"spacing",2);v([m({type:String,attribute:"spacing-top",reflect:!0})],p.prototype,"spacingTop",2);v([m({type:String,attribute:"spacing-bottom",reflect:!0})],p.prototype,"spacingBottom",2);v([m({type:String,attribute:"spacing-left",reflect:!0})],p.prototype,"spacingLeft",2);v([m({type:String,attribute:"spacing-right",reflect:!0})],p.prototype,"spacingRight",2);p=v([rt("scb-viz")],p);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "scb-wc-test",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.285",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"module": "index.js",
|
|
@@ -386,5 +386,5 @@
|
|
|
386
386
|
},
|
|
387
387
|
"./mvc/*": "./mvc/*"
|
|
388
388
|
},
|
|
389
|
-
"buildHash": "
|
|
389
|
+
"buildHash": "5AF705EB0618D65A26AF4CA756BCAAD4B723EAEDF00C99446AE365FF288948F4"
|
|
390
390
|
}
|
package/scb-viz/scb-viz.d.ts
CHANGED
|
@@ -12,7 +12,6 @@ export interface ScbVizTableData {
|
|
|
12
12
|
}
|
|
13
13
|
export declare class ScbViz extends LitElement {
|
|
14
14
|
#private;
|
|
15
|
-
private static _printInstanceCounter;
|
|
16
15
|
variant: 'Standard' | 'Table' | 'Image';
|
|
17
16
|
selectedChip: 'Diagram' | 'Table' | null;
|
|
18
17
|
title: string;
|
|
@@ -31,12 +30,9 @@ export declare class ScbViz extends LitElement {
|
|
|
31
30
|
toggleHeightMode: 'auto' | 'stable';
|
|
32
31
|
tableData: ScbVizTableData | undefined;
|
|
33
32
|
private _slottedTableData;
|
|
34
|
-
private _tableSlotSyncFrame;
|
|
35
33
|
private _actionsMenuOpen;
|
|
36
34
|
private _diagramResizeObserver?;
|
|
37
35
|
private _diagramReflowFrame;
|
|
38
|
-
private _printCleanup;
|
|
39
|
-
private _printInstanceId;
|
|
40
36
|
/** Vertikalt avstånd ovanför/under komponenten. 0–14 mappar till spacing-tokens, annars CSS-värde. */
|
|
41
37
|
spacing: undefined;
|
|
42
38
|
/** Överkantens avstånd. Om satt går före spacing. 0–14 mappar till spacing-tokens, annars CSS-värde. */
|
|
@@ -104,4 +100,5 @@ export declare class ScbViz extends LitElement {
|
|
|
104
100
|
private _onDownloadPngClick;
|
|
105
101
|
private _onDownloadJpgClick;
|
|
106
102
|
private _onDownloadCsvClick;
|
|
103
|
+
private _getCurrentPrintableView;
|
|
107
104
|
}
|