00121aaec9
CI / test (push) Has been cancelled
The captive-portal Step-2 QR opens pictureframe.edholm.me in Safari, which is the perfect moment to also offer "pin this to your home screen" so the recipient gets one-tap access without typing the URL again. Two pieces: * Service worker at /sw.js (document root, scope "/"). Minimal — install/activate calls skipWaiting + clients.claim, fetch is passthrough. Real offline caching is intentionally out of scope; we only need the SW to exist so Chrome's PWA-install heuristic fires. * Settings → Install app section, hidden when display-mode standalone. Android Chrome path: native beforeinstallprompt button. iOS Safari (and any other non-prompt browser): button opens a modal with step-by-step Share → Add to Home Screen instructions. usePwaInstall composable handles the singleton lifecycle — beforeinstallprompt fires once per page load and may fire before the user navigates to Settings, so we register on module import and stash the event for later. Tests cover: install button rendered when not standalone, modal opens on click without a native prompt, modal close button works. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 line
16 KiB
JavaScript
1 line
16 KiB
JavaScript
import{D as e,G as t,H as n,I as r,J as i,K as a,M as o,O as s,P as c,R as l,S as u,_ as d,b as f,g as p,h as m,k as ee,p as h,t as g,v as _,x as v,y,z as b}from"./_plugin-vue_export-helper-eepT72yB.js";import{a as x,i as S,s as C}from"./index-BO5caB_f.js";import{i as w,n as te,r as T,t as E}from"./BaseBottomSheet-BMI-Oljh.js";import{t as D}from"./DevicePicker-C6ucVR6N.js";var O={class:`crop-editor__top`},k={key:0,class:`crop-editor__label`},A={class:`crop-editor__orient`,role:`radiogroup`,"aria-label":`Crop orientation`},j=[`aria-checked`,`aria-label`,`onClick`],M={width:`20`,height:`20`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"aria-hidden":`true`},N={key:0,x:`2`,y:`6`,width:`20`,height:`12`,rx:`1.5`},P={key:1,x:`6`,y:`2`,width:`12`,height:`20`,rx:`1.5`},F={key:1,class:`crop-editor__mismatch`,role:`status`},ne={class:`crop-editor__actions`},I=g(u({__name:`CropEditor`,props:{src:{},orientation:{},deviceName:{},initialParams:{},initialOrientation:{}},emits:[`crop`],setup(e,{emit:t}){let r=e,u=t,d=[{value:`landscape`,label:`Landscape crop`},{value:`portrait`,label:`Portrait crop`}],g=n(r.initialOrientation??r.orientation),x=m(()=>g.value===`landscape`?{w:1600,h:960}:{w:960,h:1600}),S=m(()=>x.value.w/x.value.h),C=m(()=>g.value!==r.orientation),w=n(),T=n(),E=null,D=null,I=0,L=n(0),R=n(0),z=n(1),B={x:0,y:0,w:0,h:0},V=1;function re(e){g.value!==e&&(g.value=e,L.value=0,R.value=0,z.value=1,H())}function H(){let e=T.value,t=w.value;if(!e||!t)return;let n=t.getBoundingClientRect(),r=n.height-80,i=n.width;e.width=i,e.height=r,E=e.getContext(`2d`);let a=i-48,o=r-48,s,c;a/o>S.value?(c=o,s=c*S.value):(s=a,c=s/S.value),B={x:(i-s)/2,y:(r-c)/2,w:s,h:c},D&&U()}function U(){D&&(V=Math.max(B.w/D.naturalWidth,B.h/D.naturalHeight),r.initialParams?W(r.initialParams):(z.value=1,L.value=0,R.value=0,K()))}function W(e){if(!D)return;let t=B.w/e.natW;z.value=t/V,L.value=t*(D.naturalWidth/2-e.natX-e.natW/2),R.value=t*(D.naturalHeight/2-e.natY-e.natH/2);let[n,r]=G(L.value,R.value);L.value=n,R.value=r,K()}function G(e,t){if(!D)return[e,t];let n=V*z.value,r=D.naturalWidth*n,i=D.naturalHeight*n,a=(r-B.w)/2,o=(i-B.h)/2;return[Math.max(-a,Math.min(a,e)),Math.max(-o,Math.min(o,t))]}function K(){if(!E||!D||!T.value)return;let{width:e,height:t}=T.value,n=V*z.value,r=D.naturalWidth*n,i=D.naturalHeight*n,a=B.x+B.w/2+L.value,o=B.y+B.h/2+R.value,s=a-r/2,c=o-i/2;E.clearRect(0,0,e,t),E.drawImage(D,s,c,r,i),E.save(),E.fillStyle=`rgba(0,0,0,0.55)`,E.fillRect(0,0,e,t),E.globalCompositeOperation=`destination-out`,E.fillRect(B.x,B.y,B.w,B.h),E.restore(),E.strokeStyle=`#fff`,E.lineWidth=2,E.strokeRect(B.x,B.y,B.w,B.h),E.lineWidth=3,[[B.x,B.y,20,0,0,20],[B.x+B.w,B.y,-20,0,0,20],[B.x,B.y+B.h,20,0,0,-20],[B.x+B.w,B.y+B.h,-20,0,0,-20]].forEach(([e,t,n,r,i,a])=>{E.beginPath(),E.moveTo(e+n,t+r),E.lineTo(e,t),E.lineTo(e+i,t+a),E.stroke()})}let q=new Map,J=0;function Y(e){if(T.value?.setPointerCapture(e.pointerId),q.set(e.pointerId,{x:e.clientX,y:e.clientY}),q.size===2){let e=[...q.values()];J=Math.hypot(e[1].x-e[0].x,e[1].y-e[0].y)}}function X(e){if(!q.has(e.pointerId))return;let t=q.get(e.pointerId);if(q.set(e.pointerId,{x:e.clientX,y:e.clientY}),q.size===1){let n=e.clientX-t.x,r=e.clientY-t.y,[i,a]=G(L.value+n,R.value+r);L.value=i,R.value=a,Q();return}if(q.size===2){let e=[...q.values()],t=Math.hypot(e[1].x-e[0].x,e[1].y-e[0].y);if(J>0){let e=t/J;z.value=Math.max(1,z.value*e);let[n,r]=G(L.value,R.value);L.value=n,R.value=r,Q()}J=t}}function Z(e){q.delete(e.pointerId),J=0}function Q(){cancelAnimationFrame(I),I=requestAnimationFrame(K)}async function ie(){if(!D)return;let e=V*z.value,t=B.x+B.w/2+L.value,n=B.y+B.h/2+R.value,r=t-D.naturalWidth*e/2,i=n-D.naturalHeight*e/2,a=(B.x-r)/e,o=(B.y-i)/e,s=B.w/e,c=B.h/e,{w:l,h:d}=x.value,f=new OffscreenCanvas(l,d);f.getContext(`2d`).drawImage(D,a,o,s,c,0,0,l,d),u(`crop`,{blob:await f.convertToBlob({type:`image/jpeg`,quality:.92}),params:{natX:a,natY:o,natW:s,natH:c},orientation:g.value})}let $=new ResizeObserver(H);return ee(()=>{w.value&&$.observe(w.value),H(),D=new Image,D.onload=()=>{H(),U()},D.src=r.src}),l(()=>r.src,e=>{D&&(D.onload=()=>U(),D.src=e)}),s(()=>{$.disconnect(),cancelAnimationFrame(I)}),(t,n)=>(o(),y(`div`,{class:`crop-editor`,ref_key:`containerRef`,ref:w},[p(`canvas`,{ref_key:`canvasRef`,ref:T,class:`crop-editor__canvas`,onPointerdown:Y,onPointermove:X,onPointerup:Z,onPointercancel:Z},null,544),p(`div`,O,[e.deviceName?(o(),y(`div`,k,i(e.deviceName),1)):_(``,!0),p(`div`,A,[(o(),y(h,null,c(d,e=>p(`button`,{key:e.value,type:`button`,role:`radio`,"aria-checked":g.value===e.value,"aria-label":e.label,class:a([`crop-editor__orient-btn`,{"crop-editor__orient-btn--active":g.value===e.value}]),onClick:t=>re(e.value)},[(o(),y(`svg`,M,[e.value===`landscape`?(o(),y(`rect`,N)):(o(),y(`rect`,P))]))],10,j)),64))]),C.value?(o(),y(`div`,F,[n[0]||=p(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"aria-hidden":`true`},[p(`path`,{d:`M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z`}),p(`line`,{x1:`12`,y1:`9`,x2:`12`,y2:`13`}),p(`line`,{x1:`12`,y1:`17`,x2:`12.01`,y2:`17`})],-1),p(`span`,null,`Frame is set to `+i(e.orientation)+`. Switch the frame in Settings to display this crop.`,1)])):_(``,!0)]),p(`div`,ne,[v(te,{variant:`primary`,class:`crop-editor__use-btn`,onClick:ie},{default:b(()=>[...n[1]||=[f(` Use this crop `,-1)]]),_:1})])],512))}}),[[`__scopeId`,`data-v-85d7731b`]]),L=[{id:`seasonal`,label:`Seasonal`},{id:`holidays`,label:`Holidays`},{id:`fun`,label:`Fun`},{id:`family`,label:`Family`},{id:`nature`,label:`Nature`}],R=[{id:`sea-snow`,category:`seasonal`,label:`Snowflake`,emoji:`❄️`},{id:`sea-sun`,category:`seasonal`,label:`Sun`,emoji:`☀️`},{id:`sea-leaves`,category:`seasonal`,label:`Autumn`,emoji:`🍂`},{id:`sea-blossom`,category:`seasonal`,label:`Blossom`,emoji:`🌸`},{id:`sea-snowman`,category:`seasonal`,label:`Snowman`,emoji:`⛄`},{id:`hol-tree`,category:`holidays`,label:`Tree`,emoji:`🎄`},{id:`hol-gift`,category:`holidays`,label:`Gift`,emoji:`🎁`},{id:`hol-heart`,category:`holidays`,label:`Heart`,emoji:`❤️`},{id:`hol-party`,category:`holidays`,label:`Party`,emoji:`🎉`},{id:`hol-cake`,category:`holidays`,label:`Cake`,emoji:`🎂`},{id:`fun-star`,category:`fun`,label:`Star`,emoji:`⭐`},{id:`fun-rainbow`,category:`fun`,label:`Rainbow`,emoji:`🌈`},{id:`fun-balloon`,category:`fun`,label:`Balloon`,emoji:`🎈`},{id:`fun-sparkle`,category:`fun`,label:`Sparkles`,emoji:`✨`},{id:`fun-fire`,category:`fun`,label:`Fire`,emoji:`🔥`},{id:`fam-house`,category:`family`,label:`Home`,emoji:`🏠`},{id:`fam-paw`,category:`family`,label:`Paw`,emoji:`🐾`},{id:`fam-camera`,category:`family`,label:`Camera`,emoji:`📷`},{id:`fam-plane`,category:`family`,label:`Airplane`,emoji:`✈️`},{id:`fam-music`,category:`family`,label:`Music`,emoji:`🎵`},{id:`nat-tree`,category:`nature`,label:`Tree`,emoji:`🌲`},{id:`nat-flower`,category:`nature`,label:`Flower`,emoji:`🌺`},{id:`nat-bee`,category:`nature`,label:`Bee`,emoji:`🐝`},{id:`nat-fly`,category:`nature`,label:`Butterfly`,emoji:`🦋`},{id:`nat-moon`,category:`nature`,label:`Moon`,emoji:`🌙`}],z={class:`sticker-tray`},B={class:`sticker-tray__cats`,role:`tablist`},V=[`onClick`],re={class:`sticker-tray__grid`,role:`tabpanel`},H=[`aria-label`,`onClick`],U={class:`sticker-tray__emoji`,"aria-hidden":`true`},W={class:`sticker-tray__label`},G=g(u({__name:`StickerTray`,props:{modelValue:{type:Boolean}},emits:[`update:modelValue`,`pick`],setup(e){let r=n(`seasonal`),s=m(()=>R.filter(e=>e.category===r.value));return(n,l)=>(o(),d(E,{"model-value":e.modelValue,label:`Add sticker`,"onUpdate:modelValue":l[0]||=e=>n.$emit(`update:modelValue`,e)},{default:b(()=>[p(`div`,z,[p(`div`,B,[(o(!0),y(h,null,c(t(L),e=>(o(),y(`button`,{key:e.id,type:`button`,role:`tab`,class:a([`sticker-tray__cat`,{"sticker-tray__cat--active":r.value===e.id}]),onClick:t=>r.value=e.id},i(e.label),11,V))),128))]),p(`div`,re,[(o(!0),y(h,null,c(s.value,e=>(o(),y(`button`,{key:e.id,type:`button`,class:`sticker-tray__item`,"aria-label":e.label,onClick:t=>n.$emit(`pick`,e.id)},[p(`span`,U,i(e.emoji),1),p(`span`,W,i(e.label),1)],8,H))),128))])])]),_:1},8,[`model-value`]))}}),[[`__scopeId`,`data-v-7eada75b`]]),K={class:`sticker-canvas__bar`},q=52,J=g(u({__name:`StickerCanvas`,props:{croppedUrl:{},orientation:{},stickers:{}},emits:[`add-sticker`,`update-sticker`,`remove-sticker`,`done`],setup(t,{emit:i}){let a=t,u=i,g=n(),x=n(),S=n(),C=n(),w=n(!1),T=n(null),E=n(375),D=n(225),O=a.orientation===`landscape`?1600/960:960/1600;function k(){if(!g.value)return;let{width:e,height:t}=g.value.getBoundingClientRect(),n=t-72;e/n>O?(D.value=n,E.value=n*O):(E.value=e,D.value=e/O),M()}let A=new ResizeObserver(k);ee(()=>{g.value&&A.observe(g.value),k(),Q()}),s(()=>{A.disconnect(),ie()});let j=n(null);function M(){let e=new Image;e.onload=()=>{j.value=e},e.src=a.croppedUrl}l(()=>a.croppedUrl,()=>M(),{immediate:!0});let N=m(()=>({width:E.value,height:D.value})),P=m(()=>({image:j.value,x:0,y:0,width:E.value,height:D.value})),F={enabledAnchors:[`top-left`,`top-right`,`bottom-left`,`bottom-right`],rotateEnabled:!0,borderStroke:`rgba(255,255,255,0.8)`,anchorFill:`#fff`,anchorSize:18,keepRatio:!0,boundBoxFunc:(e,t)=>t};function ne(e){return{id:e.id,text:I(e.type),fontSize:q,fontFamily:`"Apple Color Emoji","Segoe UI Emoji","Noto Color Emoji",sans-serif`,x:e.x,y:e.y,scaleX:e.scale,scaleY:e.scale,rotation:e.rotation,draggable:!0,offsetX:q/2,offsetY:q/2}}function I(e){return R.find(t=>t.id===e)?.emoji??`⭐`}function L(t,n){n.cancelBubble=!0,T.value=t,e(()=>{let e=(C.value?.getNode())?.findOne(`#${t}`),n=S.value?.getNode();e&&n&&n.nodes([e])})}function z(e){e.target===e.target.getStage()&&(T.value=null,S.value?.getNode()?.nodes([]))}function B(){T.value&&(u(`remove-sticker`,T.value),T.value=null,S.value?.getNode()?.nodes([]))}function V(e,t){u(`update-sticker`,e,{x:t.target.x(),y:t.target.y()})}function re(e,t){u(`update-sticker`,e,{x:t.target.x(),y:t.target.y(),scale:t.target.scaleX(),rotation:t.target.rotation()})}function H(t){let n={id:`${t}-${Date.now()}`,type:t,x:E.value/2,y:D.value/2,scale:1,rotation:0};u(`add-sticker`,n),w.value=!1,e(()=>L(n.id,{cancelBubble:!1}))}let U=0,W=1;function J(e){let t=e[0].clientX-e[1].clientX,n=e[0].clientY-e[1].clientY;return Math.hypot(t,n)}function Y(e){e.touches.length!==2||!T.value||(U=J(e.touches),W=a.stickers.find(e=>e.id===T.value)?.scale??1)}function X(e){if(e.touches.length!==2||!T.value||U===0)return;e.preventDefault();let t=Math.max(.2,Math.min(6,W*(J(e.touches)/U)));u(`update-sticker`,T.value,{scale:t})}function Z(){U=0,W=1}function Q(){let e=g.value;e&&(e.addEventListener(`touchstart`,Y,{passive:!0}),e.addEventListener(`touchmove`,X,{passive:!1}),e.addEventListener(`touchend`,Z,{passive:!0}))}function ie(){let e=g.value;e&&(e.removeEventListener(`touchstart`,Y),e.removeEventListener(`touchmove`,X),e.removeEventListener(`touchend`,Z))}async function $(){T.value=null,S.value?.getNode()?.nodes([]),await e();let t=x.value?.getNode();if(!t)return;let n=(a.orientation===`landscape`?1600:960)/E.value,r=await t.toBlob({pixelRatio:n,mimeType:`image/jpeg`,quality:.92});r&&u(`done`,r)}return(e,n)=>{let i=r(`v-image`),a=r(`v-layer`),s=r(`v-text`),l=r(`v-transformer`),u=r(`v-stage`);return o(),y(`div`,{class:`sticker-canvas`,ref_key:`containerRef`,ref:g},[v(u,{ref_key:`stageRef`,ref:x,config:N.value,onClick:z,onTap:z},{default:b(()=>[v(a,null,{default:b(()=>[v(i,{config:P.value},null,8,[`config`])]),_:1}),v(a,{ref_key:`stickerLayerRef`,ref:C},{default:b(()=>[(o(!0),y(h,null,c(t.stickers,e=>(o(),d(s,{key:e.id,config:ne(e),onClick:t=>L(e.id,t),onTap:t=>L(e.id,t),onDragend:t=>V(e.id,t),onTransformend:t=>re(e.id,t)},null,8,[`config`,`onClick`,`onTap`,`onDragend`,`onTransformend`]))),128)),v(l,{ref_key:`transformerRef`,ref:S,config:F},null,512)]),_:1},512)]),_:1},8,[`config`]),T.value?(o(),y(`button`,{key:0,class:`sticker-canvas__delete`,type:`button`,"aria-label":`Remove sticker`,onClick:B},[...n[2]||=[p(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"aria-hidden":`true`},[p(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),p(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})],-1)]])):_(``,!0),p(`div`,K,[p(`button`,{class:`sticker-canvas__add-btn`,type:`button`,onClick:n[0]||=e=>w.value=!0},[...n[3]||=[p(`svg`,{width:`20`,height:`20`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"aria-hidden":`true`},[p(`circle`,{cx:`12`,cy:`12`,r:`10`}),p(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`16`}),p(`line`,{x1:`8`,y1:`12`,x2:`16`,y2:`12`})],-1),f(` Add sticker `,-1)]]),v(te,{variant:`primary`,class:`sticker-canvas__next-btn`,onClick:$},{default:b(()=>[...n[4]||=[f(`Next`,-1)]]),_:1})]),v(G,{modelValue:w.value,"onUpdate:modelValue":n[1]||=e=>w.value=e,onPick:H},null,8,[`modelValue`])],512)}}}),[[`__scopeId`,`data-v-fb52db70`]]),Y={class:`upload-view`},X={class:`upload-view__header`},Z=[`aria-label`],Q={key:0,width:`20`,height:`20`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"aria-hidden":`true`},ie={key:1,width:`20`,height:`20`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"aria-hidden":`true`},$={class:`upload-view__step-label`},ae={key:2,class:`upload-view__done`},oe={class:`upload-view__done-title`},se=g(u({__name:`UploadView`,setup(e){let r=C(),a=T(),s=w(),c=x(),l=S(),u=n(`crop`),h=n(!1),g=n(!1),E=null,O=m(()=>a.editingImageId!==null);ee(async()=>{if(await s.fetchDevices(),!a.originalFile){r.replace(`/`);return}u.value=`crop`});let k=m(()=>a.contextDeviceId?s.devices.find(e=>e.id===a.contextDeviceId):s.devices[0]),A=m(()=>k.value?.orientation??`landscape`),j=m(()=>a.cropOrientation??A.value),M=m(()=>k.value?.name),N=m(()=>u.value===`crop`?O.value?`Edit crop`:`Crop photo`:u.value===`stickers`?`Add stickers`:O.value?`Updated`:`Added`);function P({blob:e,params:t,orientation:n}){a.setCrop(e,t,n),u.value=`stickers`}function F(){a.croppedBlob&&(E=a.croppedBlob,O.value?R():g.value=!0)}function ne(e){E=e,O.value?R():g.value=!0}function L(){if(u.value===`crop`){a.cleanup(),r.replace(`/library`);return}u.value===`stickers`&&(u.value=`crop`)}async function R(){if(E){h.value=!0;try{let e=new File([E],`photo.jpg`,{type:`image/jpeg`});if(O.value){await c.reprocessImage(a.editingImageId,e,{cropParams:a.cropParams??void 0,stickerState:a.stickers,cropOrientation:a.cropOrientation??void 0}),g.value=!1,u.value=`done`;return}let t=await c.uploadImage(e,{original:a.originalFile??void 0,cropParams:a.cropParams??void 0,stickerState:a.stickers,cropOrientation:a.cropOrientation??void 0});await Promise.all(a.selectedDeviceIds.map(e=>c.setApproval(t.id,e,!0))),g.value=!1,u.value=`done`}catch(e){l.show(e instanceof Error?e.message:`Upload failed`,`error`)}finally{h.value=!1}}}function z(){a.cleanup(),r.replace(`/library`)}return(e,n)=>(o(),y(`div`,Y,[p(`header`,X,[u.value===`done`?_(``,!0):(o(),y(`button`,{key:0,class:`upload-view__back`,type:`button`,"aria-label":u.value===`crop`?`Cancel`:`Back`,onClick:L},[u.value===`crop`?(o(),y(`svg`,Q,[...n[2]||=[p(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`},null,-1),p(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`},null,-1)]])):(o(),y(`svg`,ie,[...n[3]||=[p(`polyline`,{points:`15 18 9 12 15 6`},null,-1)]]))],8,Z)),p(`span`,$,i(N.value),1),u.value===`stickers`?(o(),y(`button`,{key:1,class:`upload-view__skip`,type:`button`,onClick:F},`Skip`)):_(``,!0)]),u.value===`crop`&&t(a).originalUrl?(o(),d(I,{key:0,src:t(a).originalUrl,orientation:A.value,"device-name":M.value,"initial-params":t(a).cropParams,"initial-orientation":t(a).cropOrientation,class:`upload-view__stage`,onCrop:P},null,8,[`src`,`orientation`,`device-name`,`initial-params`,`initial-orientation`])):u.value===`stickers`&&t(a).croppedUrl?(o(),d(J,{key:1,"cropped-url":t(a).croppedUrl,orientation:j.value,stickers:t(a).stickers,class:`upload-view__stage`,onAddSticker:t(a).addSticker,onUpdateSticker:t(a).updateSticker,onRemoveSticker:t(a).removeSticker,onDone:ne},null,8,[`cropped-url`,`orientation`,`stickers`,`onAddSticker`,`onUpdateSticker`,`onRemoveSticker`])):u.value===`done`?(o(),y(`div`,ae,[n[5]||=p(`div`,{class:`upload-view__done-icon`,"aria-hidden":`true`},`🎉`,-1),p(`p`,oe,i(O.value?`Photo updated!`:`Photo added!`),1),n[6]||=p(`p`,{class:`upload-view__done-sub`},`It'll appear on your frame at the next update.`,-1),v(te,{variant:`primary`,class:`upload-view__done-btn`,onClick:z},{default:b(()=>[...n[4]||=[f(`Done`,-1)]]),_:1})])):_(``,!0),O.value?_(``,!0):(o(),d(D,{key:3,modelValue:g.value,"onUpdate:modelValue":n[0]||=e=>g.value=e,devices:t(s).devices,selected:t(a).selectedDeviceIds,uploading:h.value,"onUpdate:selected":n[1]||=e=>t(a).selectedDeviceIds=e,onConfirm:R},null,8,[`modelValue`,`devices`,`selected`,`uploading`]))]))}}),[[`__scopeId`,`data-v-af5b9c38`]]);export{se as default}; |