scb-wc-test 0.1.303 → 0.1.305

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.
@@ -1,4 +1,56 @@
1
- import{a as h,n as s,r as c,i as v,x as p,t as _}from"../../vendor/vendor.js";(function(){try{var e=typeof globalThis<"u"?globalThis:window;if(!e.__scb_ce_guard_installed__){e.__scb_ce_guard_installed__=!0;var t=customElements.define.bind(customElements);customElements.define=function(o,a,l){try{customElements.get(o)||t(o,a,l)}catch(d){var n=String(d||"");if(n.indexOf("already been used")===-1&&n.indexOf("NotSupportedError")===-1)throw d}}}}catch{}})();var u=Object.defineProperty,b=Object.getOwnPropertyDescriptor,i=(e,t,o,a)=>{for(var l=a>1?void 0:a?b(t,o):t,n=e.length-1,d;n>=0;n--)(d=e[n])&&(l=(a?d(t,o,l):d(l))||l);return a&&l&&u(t,o,l),l};let r=class extends v{constructor(){super(),this._internals=null,this.type="default",this.name="",this.label="",this.supportingText="",this.metaText="",this.buttonLabel="",this.replaceButtonLabel="",this.removeButtonLabel="",this.previewEyebrow="",this.emptyPreviewTitle="",this.emptyPreviewMeta="",this.accept="",this.showPreview=!0,this.disabled=!1,this.previewSrc="",this.defaultImageSrc="",this.previewAlt="",this.previewTitle="",this.previewMeta="",this._isDragOver=!1,this._selectedPreviewKind="empty",this._selectedPreviewSrc="",this._selectedPreviewAlt="",this._selectedPreviewTitle="",this._selectedPreviewMeta="",this._dragDepth=0,this._previewSource="external",this._objectUrl="",this._selectedFile=null,"attachInternals"in this&&(this._internals=this.attachInternals())}get _resolvedAccept(){return this.accept.trim()||(this.type==="image"?"image/*,.png,.jpg,.jpeg,.webp,.svg,.gif,.bmp,.avif":"")}get _hasExternalPreview(){return!!this._resolvedExternalPreviewSrc||!!this.previewTitle.trim()||!!this.previewMeta.trim()}get _resolvedExternalPreviewSrc(){return this.previewSrc.trim()||this.defaultImageSrc.trim()}get _resolvedPreviewKind(){return this._previewSource==="external"&&this._hasExternalPreview?this._resolvedExternalPreviewSrc?"image":"file":this._selectedPreviewKind}get _hasPreview(){return this._resolvedPreviewKind!=="empty"}get _resolvedLabel(){return this.label||(this.type==="image"?"Ladda upp bild":"Ladda upp fil")}get _resolvedSupportingText(){return this.supportingText||(this.type==="image"?"Dra och släpp en bild här, eller välj en bild från din dator.":"Dra och släpp en fil här, eller välj en fil från din dator.")}get _resolvedMetaText(){return this.metaText?this.metaText:this.type==="image"?"PNG, JPG, SVG, GIF, BMP, AVIF och WebP stöds.":"Alla filtyper stöds."}get _resolvedButtonLabel(){return this.buttonLabel||(this.type==="image"?"Välj bild":"Välj fil")}get _resolvedReplaceButtonLabel(){return this.replaceButtonLabel?this.replaceButtonLabel:this._resolvedPreviewKind==="image"?"Byt bild":"Byt fil"}get _resolvedRemoveButtonLabel(){return this.removeButtonLabel?this.removeButtonLabel:this._resolvedPreviewKind==="image"?"Ta bort bild":"Ta bort fil"}get _resolvedPreviewEyebrow(){return this.previewEyebrow?this.previewEyebrow:this._hasPreview?this._resolvedPreviewKind==="image"?"Uppladdad bild":"Uppladdad fil":"Förhandsvisning"}get _resolvedEmptyPreviewTitle(){return this.emptyPreviewTitle?this.emptyPreviewTitle:this.type==="image"?"Ingen bild uppladdad":"Ingen fil uppladdad"}get _resolvedEmptyPreviewMeta(){return this.emptyPreviewMeta?this.emptyPreviewMeta:this.type==="image"?"Förhandsvisningen visas här när du har laddat upp en bild.":"Förhandsvisningen visas här när du har laddat upp en fil."}get _resolvedPreviewSrc(){return this._previewSource==="external"&&this._hasExternalPreview?this._resolvedExternalPreviewSrc:this._selectedPreviewSrc}get _resolvedPreviewAlt(){return this._previewSource==="external"&&this._hasExternalPreview?this.previewAlt:this._selectedPreviewAlt}get _resolvedPreviewTitle(){return this._previewSource==="external"&&this._hasExternalPreview?this.previewTitle||(this._resolvedPreviewKind==="image"?"Uppladdad bild":"Uppladdad fil"):this._selectedPreviewTitle}get _resolvedPreviewMeta(){return this._previewSource==="external"&&this._hasExternalPreview?this.previewMeta:this._selectedPreviewMeta}disconnectedCallback(){this._revokeObjectUrl(),super.disconnectedCallback()}updated(e){e.has("type")&&this.type==="image"&&this._selectedPreviewKind==="file"&&this._clearSelectedFileState(),(e.has("disabled")||e.has("name"))&&this._syncFormValue()}connectedCallback(){super.connectedCallback(),this._syncFormValue()}formDisabledCallback(e){this.disabled=e}formResetCallback(){this.clearPreviewState()}_syncFormValue(){if(this._internals){if(this.disabled||!this.name.trim()||!this._selectedFile){this._internals.setFormValue(null);return}this._internals.setFormValue(this._selectedFile)}}openPicker(){if(this.disabled)return;const e=this.renderRoot.querySelector('[data-role="native-input"]');if(e){try{e.value=""}catch{}e.click()}}setPreviewState(e){this.previewSrc=e?.src??"",this.previewAlt=e?.alt??"",this.previewTitle=e?.title??"",this.previewMeta=e?.meta??"",this._previewSource="external"}clearPreviewState(){this.previewSrc="",this.previewAlt="",this.previewTitle="",this.previewMeta="",this._previewSource="external",this._clearSelectedFileState(),this._clearNativeInputValue()}_dispatch(e,t={},o=!1){const a=new CustomEvent(e,{detail:t,bubbles:!0,composed:!0,cancelable:o});return this.dispatchEvent(a),a}_handleFiles(e){const t=e&&e[0]?e[0]:null;!t||!this._isAcceptedFile(t)||(this._setSelectedFileState(t),this._dispatch("file-selected",{file:t}),this._dispatch("change",{file:t}))}_onZoneClick(e){this.disabled||e.composedPath().some(a=>a instanceof HTMLElement&&a.getAttribute("data-role")==="choose-button")||this.openPicker()}_onZoneKeydown(e){this.disabled||(e.key==="Enter"||e.key===" "||e.key==="Spacebar")&&(e.preventDefault(),this.openPicker())}_preventDefaultDrag(e){e.preventDefault(),e.stopPropagation()}_onDragEnter(e){this.disabled||(this._preventDefaultDrag(e),this._dragDepth+=1,this._isDragOver=!0)}_onDragOver(e){this.disabled||(this._preventDefaultDrag(e),this._isDragOver=!0)}_onDragLeave(e){this.disabled||(this._preventDefaultDrag(e),this._dragDepth=Math.max(0,this._dragDepth-1),this._dragDepth||(this._isDragOver=!1))}_onDrop(e){this.disabled||(this._preventDefaultDrag(e),this._dragDepth=0,this._isDragOver=!1,this._handleFiles(e.dataTransfer?.files??null))}_onNativeInputChange(e){const t=e.currentTarget;this._handleFiles(t?.files??null)}_onChooseButtonClick(e){e.preventDefault(),e.stopPropagation(),this.openPicker()}_onReplaceButtonClick(e){e.preventDefault(),e.stopPropagation(),this.openPicker()}_onRemoveButtonClick(e){e.preventDefault(),e.stopPropagation(),this._dispatch("clear-request",{},!0).defaultPrevented||this.clearPreviewState()}_isAcceptedFile(e){const t=this._resolvedAccept.trim();if(!t)return!0;const o=e.name.toLowerCase(),a=(e.type||"").toLowerCase(),l=t.split(",").map(n=>n.trim().toLowerCase()).filter(Boolean);return l.length?l.some(n=>n==="*/*"?!0:n.endsWith("/*")?a.startsWith(n.slice(0,-1)):n.startsWith(".")?o.endsWith(n):a===n):!0}_setSelectedFileState(e){const t=this._getPreviewKindForFile(e),o=this._getFileTypeLabel(e),a=this._formatFileSize(e.size);this._revokeObjectUrl(),this._selectedPreviewKind=t,this._selectedPreviewTitle=e.name||(t==="image"?"Uppladdad bild":"Uppladdad fil"),this._selectedPreviewMeta=[o,a].filter(Boolean).join(" • "),this._selectedPreviewAlt=t==="image"?e.name||"Uppladdad bild":"",this._selectedPreviewSrc="",t==="image"&&(this._objectUrl=URL.createObjectURL(e),this._selectedPreviewSrc=this._objectUrl),this._selectedFile=e,this._previewSource="internal",this._syncFormValue()}_clearSelectedFileState(){this._revokeObjectUrl(),this._selectedPreviewKind="empty",this._selectedPreviewSrc="",this._selectedPreviewAlt="",this._selectedPreviewTitle="",this._selectedPreviewMeta="",this._selectedFile=null,this._syncFormValue()}_clearNativeInputValue(){const e=this.renderRoot.querySelector('[data-role="native-input"]');if(e)try{e.value=""}catch{}}_revokeObjectUrl(){this._objectUrl&&(URL.revokeObjectURL(this._objectUrl),this._objectUrl="")}_getPreviewKindForFile(e){const t=(e.type||"").toLowerCase(),o=this._getFileExtension(e.name).toLowerCase();return t.startsWith("image/")||["png","jpg","jpeg","webp","svg","gif","bmp","avif"].includes(o)?"image":"file"}_getFileExtension(e){return/\.([^.]+)$/.exec(e||"")?.[1]??""}_getFileExtensionLabel(e){return(this._getFileExtension(e)||(this._resolvedPreviewKind==="image"?"IMG":"FIL")).slice(0,6).toUpperCase()}_getFileTypeLabel(e){if(e.type)return e.type;const t=this._getFileExtension(e.name);return t?t.toUpperCase():"Okänd filtyp"}_formatFileSize(e){return!Number.isFinite(e)||e<0?"":e<1024?`${e} B`:e<1024*1024?`${new Intl.NumberFormat("sv-SE",{maximumFractionDigits:1}).format(e/1024)} kB`:`${new Intl.NumberFormat("sv-SE",{maximumFractionDigits:1}).format(e/(1024*1024))} MB`}_renderPreviewMedia(){return this._resolvedPreviewKind==="image"&&this._resolvedPreviewSrc?p`<img class="scb-drop-zone__preview-image" src=${this._resolvedPreviewSrc} alt=${this._resolvedPreviewAlt} />`:this._hasPreview?p`
1
+ import{a as u,n as o,r as c,i as b,x as p,t as f}from"../../vendor/vendor.js";import"../scb-button/scb-button.js";import"../../vendor/vendor-material.js";(function(){try{var e=typeof globalThis<"u"?globalThis:window;if(!e.__scb_ce_guard_installed__){e.__scb_ce_guard_installed__=!0;var t=customElements.define.bind(customElements);customElements.define=function(r,i,l){try{customElements.get(r)||t(r,i,l)}catch(d){var n=String(d||"");if(n.indexOf("already been used")===-1&&n.indexOf("NotSupportedError")===-1)throw d}}}}catch{}})();var g=Object.defineProperty,w=Object.getOwnPropertyDescriptor,a=(e,t,r,i)=>{for(var l=i>1?void 0:i?w(t,r):t,n=e.length-1,d;n>=0;n--)(d=e[n])&&(l=(i?d(t,r,l):d(l))||l);return i&&l&&g(t,r,l),l};let s=class extends b{constructor(){super(),this._internals=null,this.type="default",this.name="",this.multiple=!1,this.label="",this.supportingText="",this.metaText="",this.buttonLabel="",this.replaceButtonLabel="",this.removeButtonLabel="",this.previewEyebrow="",this.emptyPreviewTitle="",this.emptyPreviewMeta="",this.accept="",this.showPreview=!0,this.disabled=!1,this.previewSrc="",this.defaultImageSrc="",this.previewAlt="",this.previewTitle="",this.previewMeta="",this._isDragOver=!1,this._selectedPreviewKind="empty",this._selectedPreviewSrc="",this._selectedPreviewAlt="",this._selectedPreviewTitle="",this._selectedPreviewMeta="",this._selectedPreviewItems=[],this._dragDepth=0,this._previewSource="external",this._form=null,this._formDataHandler=null,"attachInternals"in this&&(this._internals=this.attachInternals())}get _resolvedAccept(){return this.accept.trim()||(this.type==="image"?"image/*,.png,.jpg,.jpeg,.webp,.svg,.gif,.bmp,.avif":"")}get _hasExternalPreview(){return!!this._resolvedExternalPreviewSrc||!!this.previewTitle.trim()||!!this.previewMeta.trim()}get _resolvedExternalPreviewSrc(){return this.previewSrc.trim()||this.defaultImageSrc.trim()}get _resolvedPreviewKind(){return this._previewSource==="external"&&this._hasExternalPreview?this._resolvedExternalPreviewSrc?"image":"file":this._selectedPreviewKind}get _hasPreview(){return this._resolvedPreviewKind!=="empty"}get _resolvedLabel(){return this.label||(this.type==="image"?"Ladda upp bild":"Ladda upp fil")}get _resolvedSupportingText(){return this.multiple?this.supportingText||(this.type==="image"?"Dra och släpp en eller flera bilder här, eller välj bilder från din dator.":"Dra och släpp en eller flera filer här, eller välj filer från din dator."):this.supportingText||(this.type==="image"?"Dra och släpp en bild här, eller välj en bild från din dator.":"Dra och släpp en fil här, eller välj en fil från din dator.")}get _resolvedMetaText(){return this.metaText?this.metaText:this.type==="image"?"PNG, JPG, SVG, GIF, BMP, AVIF och WebP stöds.":"Alla filtyper stöds."}get _resolvedButtonLabel(){return this.buttonLabel||(this.type==="image"?"Välj bild":"Välj fil")}get _resolvedReplaceButtonLabel(){return this.replaceButtonLabel?this.replaceButtonLabel:this.multiple||this._resolvedPreviewKind==="multi"?"Lägg till fler filer":this._resolvedPreviewKind==="image"?"Byt bild":"Byt fil"}get _resolvedRemoveButtonLabel(){return this.removeButtonLabel?this.removeButtonLabel:this._resolvedPreviewKind==="multi"?"Ta bort filer":this._resolvedPreviewKind==="image"?"Ta bort bild":"Ta bort fil"}get _resolvedPreviewEyebrow(){return this.previewEyebrow?this.previewEyebrow:this._hasPreview?this._resolvedPreviewKind==="multi"?"Uppladdade filer":this._resolvedPreviewKind==="image"?"Uppladdad bild":"Uppladdad fil":"Förhandsvisning"}get _resolvedEmptyPreviewTitle(){return this.emptyPreviewTitle?this.emptyPreviewTitle:this.multiple?this.type==="image"?"Inga bilder uppladdade":"Inga filer uppladdade":this.type==="image"?"Ingen bild uppladdad":"Ingen fil uppladdad"}get _resolvedEmptyPreviewMeta(){return this.emptyPreviewMeta?this.emptyPreviewMeta:this.multiple?this.type==="image"?"Förhandsvisningen visas här när du har laddat upp bilder.":"Förhandsvisningen visas här när du har laddat upp filer.":this.type==="image"?"Förhandsvisningen visas här när du har laddat upp en bild.":"Förhandsvisningen visas här när du har laddat upp en fil."}get _resolvedPreviewSrc(){return this._previewSource==="external"&&this._hasExternalPreview?this._resolvedExternalPreviewSrc:this._selectedPreviewSrc}get _resolvedPreviewAlt(){return this._previewSource==="external"&&this._hasExternalPreview?this.previewAlt:this._selectedPreviewAlt}get _resolvedPreviewTitle(){return this._previewSource==="external"&&this._hasExternalPreview?this.previewTitle||(this._resolvedPreviewKind==="image"?"Uppladdad bild":"Uppladdad fil"):this._selectedPreviewTitle}get _resolvedPreviewMeta(){return this._previewSource==="external"&&this._hasExternalPreview?this.previewMeta:this._selectedPreviewMeta}disconnectedCallback(){this._form&&this._formDataHandler&&this._form.removeEventListener("formdata",this._formDataHandler),this._formDataHandler=null,this._form=null,this._revokeObjectUrl(),super.disconnectedCallback()}updated(e){e.has("type")&&this.type==="image"&&this._selectedPreviewKind==="file"&&this._clearSelectedFileState(),(e.has("disabled")||e.has("name")||e.has("multiple"))&&this._syncFormValue()}connectedCallback(){super.connectedCallback(),this._syncFormValue(),this._form=this.closest("form"),this._form&&(this._formDataHandler=e=>{const t=e.formData;t&&this._appendFileToFormData(t)},this._form.addEventListener("formdata",this._formDataHandler))}formDisabledCallback(e){this.disabled=e}formResetCallback(){this.clearPreviewState()}_syncFormValue(){if(!this._internals)return;const e=this.name.trim();if(this.disabled||!e||!this._selectedPreviewItems.length){this._internals.setFormValue(null);return}if(this.multiple){const t=new FormData;this._selectedPreviewItems.forEach(r=>{t.append(e,r.file,r.file.name)}),this._internals.setFormValue(t);return}this._internals.setFormValue(this._selectedPreviewItems[0].file)}_appendFileToFormData(e){const t=this.name.trim();if(this.disabled||!t||!this._selectedPreviewItems.length)return;e.getAll(t).some(i=>i instanceof File)||this._selectedPreviewItems.forEach(i=>{e.append(t,i.file,i.file.name)})}openPicker(){if(this.disabled)return;const e=this.renderRoot.querySelector('[data-role="native-input"]');if(e){try{e.value=""}catch{}e.click()}}setPreviewState(e){this.previewSrc=e?.src??"",this.previewAlt=e?.alt??"",this.previewTitle=e?.title??"",this.previewMeta=e?.meta??"",this._previewSource="external"}clearPreviewState(){this.previewSrc="",this.previewAlt="",this.previewTitle="",this.previewMeta="",this._previewSource="external",this._clearSelectedFileState(),this._clearNativeInputValue()}_dispatch(e,t={},r=!1){const i=new CustomEvent(e,{detail:t,bubbles:!0,composed:!0,cancelable:r});return this.dispatchEvent(i),i}_handleFiles(e){const t=Array.from(e??[]).filter(l=>this._isAcceptedFile(l));if(!t.length)return;const r=this.multiple?t:[t[0]];this._setSelectedFilesState(r,this.multiple);const i=this._selectedPreviewItems.map(l=>l.file);this._dispatch("file-selected",{file:i[0],files:i,addedFiles:r}),this._dispatch("change",{file:i[0],files:i,addedFiles:r})}_onZoneClick(e){this.disabled||e.composedPath().some(i=>i instanceof HTMLElement&&i.getAttribute("data-role")==="choose-button")||this.openPicker()}_onZoneKeydown(e){this.disabled||(e.key==="Enter"||e.key===" "||e.key==="Spacebar")&&(e.preventDefault(),this.openPicker())}_preventDefaultDrag(e){e.preventDefault(),e.stopPropagation()}_onDragEnter(e){this.disabled||(this._preventDefaultDrag(e),this._dragDepth+=1,this._isDragOver=!0)}_onDragOver(e){this.disabled||(this._preventDefaultDrag(e),this._isDragOver=!0)}_onDragLeave(e){this.disabled||(this._preventDefaultDrag(e),this._dragDepth=Math.max(0,this._dragDepth-1),this._dragDepth||(this._isDragOver=!1))}_onDrop(e){this.disabled||(this._preventDefaultDrag(e),this._dragDepth=0,this._isDragOver=!1,this._handleFiles(e.dataTransfer?.files??null))}_onNativeInputChange(e){const t=e.currentTarget;this._handleFiles(t?.files??null)}_onChooseButtonClick(e){e.preventDefault(),e.stopPropagation(),this.openPicker()}_onReplaceButtonClick(e){e.preventDefault(),e.stopPropagation(),this.openPicker()}_onRemoveButtonClick(e){e.preventDefault(),e.stopPropagation(),this._dispatch("clear-request",{},!0).defaultPrevented||this.clearPreviewState()}_onRemoveSelectedItemClick(e){if(e.preventDefault(),e.stopPropagation(),this.disabled)return;const r=e.currentTarget?.getAttribute("data-index")||"",i=Number.parseInt(r,10);Number.isInteger(i)&&this._removeSelectedItemAt(i)}_isAcceptedFile(e){const t=this._resolvedAccept.trim();if(!t)return!0;const r=e.name.toLowerCase(),i=(e.type||"").toLowerCase(),l=t.split(",").map(n=>n.trim().toLowerCase()).filter(Boolean);return l.length?l.some(n=>n==="*/*"?!0:n.endsWith("/*")?i.startsWith(n.slice(0,-1)):n.startsWith(".")?r.endsWith(n):i===n):!0}_setSelectedFilesState(e,t){const r=e.filter(Boolean);if(!r.length)return;const i=t?this._selectedPreviewItems:[],l=r.map(d=>{const h=this._getPreviewKindForFile(d),v=this._getFileTypeLabel(d),m=this._formatFileSize(d.size),_=h==="image"?URL.createObjectURL(d):"";return{file:d,kind:h,src:_,alt:h==="image"?d.name||"Uppladdad bild":"",title:d.name||(h==="image"?"Uppladdad bild":"Uppladdad fil"),meta:[v,m].filter(Boolean).join(" • ")}});t||this._revokeObjectUrl();const n=this.multiple?[...i,...l]:[l[0]];!this.multiple&&i.length&&this._revokeObjectUrlsForItems(i),this._applySelectedPreviewItems(n)}_clearSelectedFileState(){this._revokeObjectUrl(),this._applySelectedPreviewItems([])}_applySelectedPreviewItems(e){this._selectedPreviewItems=e;const t=e[0];if(!t){this._selectedPreviewKind="empty",this._selectedPreviewTitle="",this._selectedPreviewMeta="",this._selectedPreviewAlt="",this._selectedPreviewSrc="",this._previewSource="internal",this._syncFormValue();return}if(e.length>1){const r=e.reduce((i,l)=>i+(Number.isFinite(l.file.size)?l.file.size:0),0);this._selectedPreviewKind="multi",this._selectedPreviewTitle=`${e.length} filer valda`,this._selectedPreviewMeta=`Totalt ${this._formatFileSize(r)}`,this._selectedPreviewAlt="",this._selectedPreviewSrc=""}else this._selectedPreviewKind=t.kind,this._selectedPreviewTitle=t.title,this._selectedPreviewMeta=t.meta,this._selectedPreviewAlt=t.alt,this._selectedPreviewSrc=t.src;this._previewSource="internal",this._syncFormValue()}_removeSelectedItemAt(e){if(e<0||e>=this._selectedPreviewItems.length)return;const t=this._selectedPreviewItems[e];t.src&&URL.revokeObjectURL(t.src);const r=this._selectedPreviewItems.filter((i,l)=>l!==e);this._applySelectedPreviewItems(r),this._dispatch("file-removed",{file:t.file,files:r.map(i=>i.file),index:e}),this._dispatch("change",{file:r[0]?.file??null,files:r.map(i=>i.file),removedFile:t.file,removedIndex:e})}_renderSelectedImageCards(){return!this.multiple||this.type!=="image"||!this._selectedPreviewItems.some(t=>t.kind==="image"&&t.src)?null:p`
2
+ <div class="scb-drop-zone__selected-images" aria-label="Valda bilder">
3
+ ${this._selectedPreviewItems.map((t,r)=>t.kind!=="image"||!t.src?null:p`
4
+ <article class="scb-drop-zone__selected-image-card" aria-label=${`${t.title}, ${t.meta}`}>
5
+ <img class="scb-drop-zone__selected-image" src=${t.src} alt=${t.alt||t.title} />
6
+ <span class="scb-drop-zone__selected-image-title">${t.title}</span>
7
+ <span class="scb-drop-zone__selected-image-meta">${t.meta}</span>
8
+ <scb-button
9
+ class="scb-drop-zone__selected-image-action"
10
+ data-index=${String(r)}
11
+ variant="text"
12
+ size="small"
13
+ label="Ta bort"
14
+ aria-label=${`Ta bort ${t.title}`}
15
+ @click=${this._onRemoveSelectedItemClick}
16
+ ></scb-button>
17
+ </article>
18
+ `)}
19
+ </div>
20
+ `}_clearNativeInputValue(){const e=this.renderRoot.querySelector('[data-role="native-input"]');if(e)try{e.value=""}catch{}}_revokeObjectUrl(){this._revokeObjectUrlsForItems(this._selectedPreviewItems)}_revokeObjectUrlsForItems(e){e.forEach(t=>{t.src&&URL.revokeObjectURL(t.src)})}_getPreviewKindForFile(e){const t=(e.type||"").toLowerCase(),r=this._getFileExtension(e.name).toLowerCase();return t.startsWith("image/")||["png","jpg","jpeg","webp","svg","gif","bmp","avif"].includes(r)?"image":"file"}_getFileExtension(e){return/\.([^.]+)$/.exec(e||"")?.[1]??""}_getFileExtensionLabel(e){return(this._getFileExtension(e)||(this._resolvedPreviewKind==="image"?"IMG":"FIL")).slice(0,6).toUpperCase()}_getFileTypeLabel(e){if(e.type)return e.type;const t=this._getFileExtension(e.name);return t?t.toUpperCase():"Okänd filtyp"}_formatFileSize(e){return!Number.isFinite(e)||e<0?"":e<1024?`${e} B`:e<1024*1024?`${new Intl.NumberFormat("sv-SE",{maximumFractionDigits:1}).format(e/1024)} kB`:`${new Intl.NumberFormat("sv-SE",{maximumFractionDigits:1}).format(e/(1024*1024))} MB`}_renderPreviewMedia(){if(this._resolvedPreviewKind==="multi"){if(this.multiple&&this.type==="image")return p`
21
+ <div class="scb-drop-zone__preview-placeholder">
22
+ <div class="scb-drop-zone__preview-placeholder-inner">
23
+ <span class="scb-drop-zone__preview-placeholder-label">Bild</span>
24
+ <p class="scb-drop-zone__preview-file-label">Valda bilder visas under uppladdningsytan.</p>
25
+ </div>
26
+ </div>
27
+ `;const e=this._selectedPreviewItems;return p`
28
+ <ul class="scb-drop-zone__preview-list" aria-label="Valda filer">
29
+ ${e.map((t,r)=>p`
30
+ <li class="scb-drop-zone__preview-list-item" aria-label=${`${t.title}, ${t.meta}`}>
31
+ ${t.kind==="image"&&t.src?p`<img class="scb-drop-zone__preview-image scb-drop-zone__preview-image--thumb" src=${t.src} alt=${t.alt||t.title} />`:p`
32
+ <span class="scb-drop-zone__preview-list-extension" aria-hidden="true">
33
+ ${this._getFileExtensionLabel(t.title)}
34
+ </span>
35
+ <span class="scb-drop-zone__sr-only">Fil</span>
36
+ `}
37
+ <span class="scb-drop-zone__preview-list-content">
38
+ <span class="scb-drop-zone__preview-list-title">${t.title}</span>
39
+ <span class="scb-drop-zone__preview-list-meta">${t.meta}</span>
40
+ </span>
41
+ <scb-button
42
+ class="scb-drop-zone__preview-list-item-action"
43
+ data-index=${String(r)}
44
+ variant="text"
45
+ size="small"
46
+ label="Ta bort"
47
+ aria-label=${`Ta bort ${t.title}`}
48
+ @click=${this._onRemoveSelectedItemClick}
49
+ ></scb-button>
50
+ </li>
51
+ `)}
52
+ </ul>
53
+ `}return this._resolvedPreviewKind==="image"&&this._resolvedPreviewSrc?p`<img class="scb-drop-zone__preview-image" src=${this._resolvedPreviewSrc} alt=${this._resolvedPreviewAlt} />`:this._hasPreview?p`
2
54
  <div class="scb-drop-zone__preview-file-card">
3
55
  <div class="scb-drop-zone__preview-file-card-inner">
4
56
  <span class="scb-drop-zone__preview-file-extension">${this._getFileExtensionLabel(this._resolvedPreviewTitle)}</span>
@@ -20,7 +72,7 @@ import{a as h,n as s,r as c,i as v,x as p,t as _}from"../../vendor/vendor.js";(f
20
72
  <div class="scb-drop-zone__preview-body">
21
73
  <p class="scb-drop-zone__preview-eyebrow">${this._resolvedPreviewEyebrow}</p>
22
74
  <h3 class="scb-drop-zone__preview-title">${e}</h3>
23
- <p class="scb-drop-zone__preview-meta">${t}</p>
75
+ <p class="scb-drop-zone__preview-meta" aria-live="polite">${t}</p>
24
76
 
25
77
  ${this._hasPreview?p`
26
78
  <div class="scb-drop-zone__preview-actions">
@@ -45,50 +97,55 @@ import{a as h,n as s,r as c,i as v,x as p,t as _}from"../../vendor/vendor.js";(f
45
97
  `}render(){const e={"scb-drop-zone__surface":!0,"is-dragover":this._isDragOver};return p`
46
98
  <div class="scb-drop-zone">
47
99
  <div class="scb-drop-zone__layout ${this.showPreview?"scb-drop-zone__layout--with-preview":""}">
48
- <div
49
- class=${Object.keys(e).filter(t=>e[t]).join(" ")}
50
- data-role="zone"
51
- role="button"
52
- tabindex=${this.disabled?"-1":"0"}
53
- aria-label=${this._resolvedLabel}
54
- @click=${this._onZoneClick}
55
- @keydown=${this._onZoneKeydown}
56
- @dragenter=${this._onDragEnter}
57
- @dragover=${this._onDragOver}
58
- @dragleave=${this._onDragLeave}
59
- @drop=${this._onDrop}
60
- >
61
- <input
62
- class="scb-drop-zone__native-input"
63
- data-role="native-input"
64
- type="file"
65
- .name=${this.name}
66
- .accept=${this._resolvedAccept}
67
- ?disabled=${this.disabled}
68
- @change=${this._onNativeInputChange}
69
- />
70
-
71
- <div class="scb-drop-zone__inner">
72
- <h2 class="scb-drop-zone__title">${this._resolvedLabel}</h2>
73
- <p class="scb-drop-zone__lead">${this._resolvedSupportingText}</p>
74
- ${this._resolvedMetaText?p`<p class="scb-drop-zone__meta">${this._resolvedMetaText}</p>`:null}
75
-
76
- <div class="scb-drop-zone__actions">
77
- <scb-button
78
- data-role="choose-button"
79
- variant="filled"
80
- size="medium"
81
- label=${this._resolvedButtonLabel}
82
- @click=${this._onChooseButtonClick}
83
- ></scb-button>
100
+ <div class="scb-drop-zone__main">
101
+ <div
102
+ class=${Object.keys(e).filter(t=>e[t]).join(" ")}
103
+ data-role="zone"
104
+ role="button"
105
+ tabindex=${this.disabled?"-1":"0"}
106
+ aria-label=${this._resolvedLabel}
107
+ @click=${this._onZoneClick}
108
+ @keydown=${this._onZoneKeydown}
109
+ @dragenter=${this._onDragEnter}
110
+ @dragover=${this._onDragOver}
111
+ @dragleave=${this._onDragLeave}
112
+ @drop=${this._onDrop}
113
+ >
114
+ <input
115
+ class="scb-drop-zone__native-input"
116
+ data-role="native-input"
117
+ type="file"
118
+ .name=${this.name}
119
+ .accept=${this._resolvedAccept}
120
+ ?multiple=${this.multiple}
121
+ ?disabled=${this.disabled}
122
+ @change=${this._onNativeInputChange}
123
+ />
124
+
125
+ <div class="scb-drop-zone__inner">
126
+ <h2 class="scb-drop-zone__title">${this._resolvedLabel}</h2>
127
+ <p class="scb-drop-zone__lead">${this._resolvedSupportingText}</p>
128
+ ${this._resolvedMetaText?p`<p class="scb-drop-zone__meta">${this._resolvedMetaText}</p>`:null}
129
+
130
+ <div class="scb-drop-zone__actions">
131
+ <scb-button
132
+ data-role="choose-button"
133
+ variant="filled"
134
+ size="medium"
135
+ label=${this._resolvedButtonLabel}
136
+ @click=${this._onChooseButtonClick}
137
+ ></scb-button>
138
+ </div>
84
139
  </div>
85
140
  </div>
86
141
  </div>
87
142
 
88
143
  ${this._renderPreview()}
89
144
  </div>
145
+
146
+ ${this._renderSelectedImageCards()}
90
147
  </div>
91
- `}};r.formAssociated=!0;r.styles=h`
148
+ `}};s.formAssociated=!0;s.styles=u`
92
149
  :host {
93
150
  display: block;
94
151
  width: 100%;
@@ -112,11 +169,21 @@ import{a as h,n as s,r as c,i as v,x as p,t as _}from"../../vendor/vendor.js";(f
112
169
  grid-template-columns: minmax(0, 7fr) minmax(280px, 3fr);
113
170
  }
114
171
 
172
+ :host([multiple][type='default']) .scb-drop-zone__layout--with-preview {
173
+ grid-template-columns: minmax(0, 6fr) minmax(340px, 4fr);
174
+ }
175
+
115
176
  .scb-drop-zone__surface,
116
177
  .scb-drop-zone__preview {
117
178
  min-width: 0;
118
179
  }
119
180
 
181
+ .scb-drop-zone__main {
182
+ min-width: 0;
183
+ display: grid;
184
+ gap: var(--spacing-4, 12px);
185
+ }
186
+
120
187
  .scb-drop-zone__surface {
121
188
  box-sizing: border-box;
122
189
  width: 100%;
@@ -134,6 +201,11 @@ import{a as h,n as s,r as c,i as v,x as p,t as _}from"../../vendor/vendor.js";(f
134
201
  outline: none;
135
202
  }
136
203
 
204
+ :host([multiple][type='default']) .scb-drop-zone__surface {
205
+ min-height: var(--scb-drop-zone-multi-default-min-height, min(32vh, 280px));
206
+ padding: var(--spacing-6, 20px);
207
+ }
208
+
137
209
  .scb-drop-zone__surface:hover,
138
210
  .scb-drop-zone__surface:focus-visible,
139
211
  .scb-drop-zone__surface.is-dragover {
@@ -197,6 +269,10 @@ import{a as h,n as s,r as c,i as v,x as p,t as _}from"../../vendor/vendor.js";(f
197
269
  align-content: stretch;
198
270
  }
199
271
 
272
+ :host([multiple][type='default']) .scb-drop-zone__preview {
273
+ min-height: var(--scb-drop-zone-multi-default-preview-min-height, min(42vh, 420px));
274
+ }
275
+
200
276
  .scb-drop-zone__preview-media {
201
277
  width: 100%;
202
278
  height: 100%;
@@ -218,6 +294,16 @@ import{a as h,n as s,r as c,i as v,x as p,t as _}from"../../vendor/vendor.js";(f
218
294
  border-radius: var(--radius-m, 12px);
219
295
  }
220
296
 
297
+ .scb-drop-zone__preview-image--thumb {
298
+ width: 40px;
299
+ height: 40px;
300
+ max-width: 40px;
301
+ max-height: 40px;
302
+ border-radius: var(--radius-s, 8px);
303
+ object-fit: cover;
304
+ flex: 0 0 auto;
305
+ }
306
+
221
307
  .scb-drop-zone__preview-placeholder,
222
308
  .scb-drop-zone__preview-file-card {
223
309
  box-sizing: border-box;
@@ -282,6 +368,89 @@ import{a as h,n as s,r as c,i as v,x as p,t as _}from"../../vendor/vendor.js";(f
282
368
  line-height: 1.6;
283
369
  }
284
370
 
371
+ .scb-drop-zone__preview-list {
372
+ width: 100%;
373
+ max-height: 300px;
374
+ margin: 0;
375
+ padding: 0;
376
+ list-style: none;
377
+ display: grid;
378
+ gap: var(--spacing-2, 4px);
379
+ overflow: auto;
380
+ }
381
+
382
+ :host([multiple][type='default']) .scb-drop-zone__preview-list {
383
+ max-height: 260px;
384
+ }
385
+
386
+ .scb-drop-zone__preview-list-item {
387
+ display: flex;
388
+ align-items: center;
389
+ gap: var(--spacing-3, 8px);
390
+ min-width: 0;
391
+ padding: var(--spacing-3, 8px);
392
+ border-radius: var(--radius-s, 8px);
393
+ background: var(--md-sys-color-surface-container, #f5f5f5);
394
+ }
395
+
396
+ .scb-drop-zone__preview-list-extension {
397
+ display: inline-flex;
398
+ align-items: center;
399
+ justify-content: center;
400
+ flex: 0 0 auto;
401
+ border-radius: var(--radius-s, 8px);
402
+ color: var(--md-sys-color-on-primary-container, #001944);
403
+ font-size: var(--md-sys-typescale-label-medium-size, 12px);
404
+ line-height: var(--md-sys-typescale-label-medium-line-height, 16px);
405
+ font-weight: 700;
406
+ letter-spacing: 0.04em;
407
+ text-transform: uppercase;
408
+ }
409
+
410
+ .scb-drop-zone__preview-list-content {
411
+ display: flex;
412
+ flex-direction: column;
413
+ min-width: 0;
414
+ text-align: left;
415
+ flex: 1 1 auto;
416
+ }
417
+
418
+ .scb-drop-zone__preview-list-item-action {
419
+ flex: 0 0 auto;
420
+ margin-left: auto;
421
+ }
422
+
423
+ .scb-drop-zone__preview-list-title,
424
+ .scb-drop-zone__preview-list-meta {
425
+ white-space: nowrap;
426
+ overflow: hidden;
427
+ text-overflow: ellipsis;
428
+ }
429
+
430
+ .scb-drop-zone__preview-list-title {
431
+ font-size: var(--md-sys-typescale-body-medium-size, 16px);
432
+ line-height: var(--md-sys-typescale-body-medium-line-height, 24px);
433
+ color: var(--md-sys-color-on-surface, #111111);
434
+ }
435
+
436
+ .scb-drop-zone__preview-list-meta {
437
+ font-size: var(--md-sys-typescale-body-small-size, 14px);
438
+ line-height: var(--md-sys-typescale-body-small-line-height, 20px);
439
+ color: var(--md-sys-color-on-surface-variant, #444444);
440
+ }
441
+
442
+ .scb-drop-zone__sr-only {
443
+ position: absolute;
444
+ width: 1px;
445
+ height: 1px;
446
+ padding: 0;
447
+ margin: -1px;
448
+ overflow: hidden;
449
+ clip: rect(0, 0, 0, 0);
450
+ white-space: nowrap;
451
+ border: 0;
452
+ }
453
+
285
454
  .scb-drop-zone__preview-body {
286
455
  display: flex;
287
456
  flex-direction: column;
@@ -320,9 +489,58 @@ import{a as h,n as s,r as c,i as v,x as p,t as _}from"../../vendor/vendor.js";(f
320
489
  padding-top: var(--spacing-5, 16px);
321
490
  }
322
491
 
492
+ .scb-drop-zone__selected-images {
493
+ display: grid;
494
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
495
+ gap: var(--spacing-3, 8px);
496
+ margin-top: var(--spacing-4, 12px);
497
+ }
498
+
499
+ .scb-drop-zone__selected-image-card {
500
+ display: grid;
501
+ gap: var(--spacing-2, 4px);
502
+ border: 1px solid var(--md-sys-color-outline-variant, #cccccc);
503
+ border-radius: var(--radius-m, 12px);
504
+ background: var(--md-sys-color-surface-container-lowest, #ffffff);
505
+ padding: var(--spacing-3, 8px);
506
+ min-width: 0;
507
+ }
508
+
509
+ .scb-drop-zone__selected-image {
510
+ display: block;
511
+ width: 100%;
512
+ aspect-ratio: 4 / 3;
513
+ object-fit: cover;
514
+ border-radius: var(--radius-s, 8px);
515
+ background: var(--md-sys-color-surface-container, #f5f5f5);
516
+ }
517
+
518
+ .scb-drop-zone__selected-image-title,
519
+ .scb-drop-zone__selected-image-meta {
520
+ white-space: nowrap;
521
+ overflow: hidden;
522
+ text-overflow: ellipsis;
523
+ }
524
+
525
+ .scb-drop-zone__selected-image-title {
526
+ font-size: var(--md-sys-typescale-body-medium-size, 16px);
527
+ line-height: var(--md-sys-typescale-body-medium-line-height, 24px);
528
+ color: var(--md-sys-color-on-surface, #111111);
529
+ }
530
+
531
+ .scb-drop-zone__selected-image-meta {
532
+ font-size: var(--md-sys-typescale-body-small-size, 14px);
533
+ line-height: var(--md-sys-typescale-body-small-line-height, 20px);
534
+ color: var(--md-sys-color-on-surface-variant, #444444);
535
+ }
536
+
537
+ .scb-drop-zone__selected-image-action {
538
+ justify-self: end;
539
+ }
540
+
323
541
  @media (max-width: 900px) {
324
542
  .scb-drop-zone__layout--with-preview {
325
543
  grid-template-columns: 1fr;
326
544
  }
327
545
  }
328
- `;i([s({type:String,reflect:!0})],r.prototype,"type",2);i([s({type:String})],r.prototype,"name",2);i([s({type:String})],r.prototype,"label",2);i([s({type:String,attribute:"supporting-text"})],r.prototype,"supportingText",2);i([s({type:String,attribute:"meta-text"})],r.prototype,"metaText",2);i([s({type:String,attribute:"button-label"})],r.prototype,"buttonLabel",2);i([s({type:String,attribute:"replace-button-label"})],r.prototype,"replaceButtonLabel",2);i([s({type:String,attribute:"remove-button-label"})],r.prototype,"removeButtonLabel",2);i([s({type:String,attribute:"preview-eyebrow"})],r.prototype,"previewEyebrow",2);i([s({type:String,attribute:"empty-preview-title"})],r.prototype,"emptyPreviewTitle",2);i([s({type:String,attribute:"empty-preview-meta"})],r.prototype,"emptyPreviewMeta",2);i([s({type:String})],r.prototype,"accept",2);i([s({type:Boolean,attribute:"show-preview",reflect:!0})],r.prototype,"showPreview",2);i([s({type:Boolean,reflect:!0})],r.prototype,"disabled",2);i([s({type:String,attribute:!1})],r.prototype,"previewSrc",2);i([s({type:String,attribute:"default-image-src"})],r.prototype,"defaultImageSrc",2);i([s({type:String,attribute:!1})],r.prototype,"previewAlt",2);i([s({type:String,attribute:!1})],r.prototype,"previewTitle",2);i([s({type:String,attribute:!1})],r.prototype,"previewMeta",2);i([c()],r.prototype,"_isDragOver",2);i([c()],r.prototype,"_selectedPreviewKind",2);i([c()],r.prototype,"_selectedPreviewSrc",2);i([c()],r.prototype,"_selectedPreviewAlt",2);i([c()],r.prototype,"_selectedPreviewTitle",2);i([c()],r.prototype,"_selectedPreviewMeta",2);r=i([_("scb-drop-zone")],r);
546
+ `;a([o({type:String,reflect:!0})],s.prototype,"type",2);a([o({type:String})],s.prototype,"name",2);a([o({type:Boolean,reflect:!0})],s.prototype,"multiple",2);a([o({type:String})],s.prototype,"label",2);a([o({type:String,attribute:"supporting-text"})],s.prototype,"supportingText",2);a([o({type:String,attribute:"meta-text"})],s.prototype,"metaText",2);a([o({type:String,attribute:"button-label"})],s.prototype,"buttonLabel",2);a([o({type:String,attribute:"replace-button-label"})],s.prototype,"replaceButtonLabel",2);a([o({type:String,attribute:"remove-button-label"})],s.prototype,"removeButtonLabel",2);a([o({type:String,attribute:"preview-eyebrow"})],s.prototype,"previewEyebrow",2);a([o({type:String,attribute:"empty-preview-title"})],s.prototype,"emptyPreviewTitle",2);a([o({type:String,attribute:"empty-preview-meta"})],s.prototype,"emptyPreviewMeta",2);a([o({type:String})],s.prototype,"accept",2);a([o({type:Boolean,attribute:"show-preview",reflect:!0})],s.prototype,"showPreview",2);a([o({type:Boolean,reflect:!0})],s.prototype,"disabled",2);a([o({type:String,attribute:!1})],s.prototype,"previewSrc",2);a([o({type:String,attribute:"default-image-src"})],s.prototype,"defaultImageSrc",2);a([o({type:String,attribute:!1})],s.prototype,"previewAlt",2);a([o({type:String,attribute:!1})],s.prototype,"previewTitle",2);a([o({type:String,attribute:!1})],s.prototype,"previewMeta",2);a([c()],s.prototype,"_isDragOver",2);a([c()],s.prototype,"_selectedPreviewKind",2);a([c()],s.prototype,"_selectedPreviewSrc",2);a([c()],s.prototype,"_selectedPreviewAlt",2);a([c()],s.prototype,"_selectedPreviewTitle",2);a([c()],s.prototype,"_selectedPreviewMeta",2);a([c()],s.prototype,"_selectedPreviewItems",2);s=a([f("scb-drop-zone")],s);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scb-wc-test",
3
- "version": "0.1.303",
3
+ "version": "0.1.305",
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": "41FA71C13C42335E104A486D4C1E1C45CCEFB74C195CED1E57AC7706943D2670"
389
+ "buildHash": "B2BD4FEBF4D08D675DCB573060FB3990016B7BABC7AB289D25B13A4762AFFE9A"
390
390
  }
@@ -7,6 +7,8 @@ export declare class ScbDropZone extends LitElement {
7
7
  type: DropZoneType;
8
8
  /** Namn som används när komponenten skickas i formulär. */
9
9
  name: string;
10
+ /** Tillåter val av flera filer. */
11
+ multiple: boolean;
10
12
  /** Rubrik i drop-zonen. */
11
13
  label: string;
12
14
  /** Förklarande text i drop-zonen. */
@@ -47,10 +49,11 @@ export declare class ScbDropZone extends LitElement {
47
49
  private _selectedPreviewAlt;
48
50
  private _selectedPreviewTitle;
49
51
  private _selectedPreviewMeta;
52
+ private _selectedPreviewItems;
50
53
  private _dragDepth;
51
54
  private _previewSource;
52
- private _objectUrl;
53
- private _selectedFile;
55
+ private _form;
56
+ private _formDataHandler;
54
57
  constructor();
55
58
  static styles: import('lit').CSSResult;
56
59
  private get _resolvedAccept();
@@ -77,6 +80,7 @@ export declare class ScbDropZone extends LitElement {
77
80
  formDisabledCallback(disabled: boolean): void;
78
81
  formResetCallback(): void;
79
82
  private _syncFormValue;
83
+ private _appendFileToFormData;
80
84
  openPicker(): void;
81
85
  setPreviewState(state: {
82
86
  src?: string;
@@ -98,11 +102,16 @@ export declare class ScbDropZone extends LitElement {
98
102
  private _onChooseButtonClick;
99
103
  private _onReplaceButtonClick;
100
104
  private _onRemoveButtonClick;
105
+ private _onRemoveSelectedItemClick;
101
106
  private _isAcceptedFile;
102
- private _setSelectedFileState;
107
+ private _setSelectedFilesState;
103
108
  private _clearSelectedFileState;
109
+ private _applySelectedPreviewItems;
110
+ private _removeSelectedItemAt;
111
+ private _renderSelectedImageCards;
104
112
  private _clearNativeInputValue;
105
113
  private _revokeObjectUrl;
114
+ private _revokeObjectUrlsForItems;
106
115
  private _getPreviewKindForFile;
107
116
  private _getFileExtension;
108
117
  private _getFileExtensionLabel;