diff --git a/public/build/assets/BaseBottomSheet-BODCttr7.js b/public/build/assets/BaseBottomSheet-BODCttr7.js deleted file mode 100644 index 5517fcd..0000000 --- a/public/build/assets/BaseBottomSheet-BODCttr7.js +++ /dev/null @@ -1 +0,0 @@ -import{C as e,H as t,M as n,P as r,R as i,_ as a,d as o,f as s,k as c,p as l,r as u,s as d,t as f,u as p,v as m,w as h,z as g}from"./_plugin-vue_export-helper-DVo1OUMD.js";import{c as _,d as v,f as y}from"./index-C0Yc8pEe.js";var b=u(`devices`,()=>{let e=t([]),n=t(!1),r=t(null);async function i(){n.value=!0,r.value=null;try{let t=await fetch(`/api/devices`);if(!t.ok)throw Error(`Failed to load devices`);e.value=await t.json()}catch(e){r.value=e instanceof Error?e.message:`Unknown error`}finally{n.value=!1}}async function a(t,n){let r=await fetch(`/api/devices/${t}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n)});if(!r.ok)throw Error(`Failed to update device`);let i=await r.json(),a=e.value.findIndex(e=>e.id===t);return a!==-1&&(e.value[a]=i),i}async function o(t,n){let r=await fetch(`/api/devices/${t}/lock`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({imageId:n})});if(!r.ok)throw Error(`Failed to lock image`);let i=await r.json(),a=e.value.findIndex(e=>e.id===t);return a!==-1&&(e.value[a]=i),i}async function s(t){let n=await fetch(`/api/devices/${t}/lock`,{method:`DELETE`});if(!n.ok)throw Error(`Failed to unlock`);let r=await n.json(),i=e.value.findIndex(e=>e.id===t);return i!==-1&&(e.value[i]=r),r}return{devices:e,loading:n,error:r,fetchDevices:i,updateDevice:a,lockImage:o,unlockImage:s}}),x=u(`upload`,()=>{let e=t(null),n=t(null),r=t(null),i=t(null),a=t(null),o=t([]),s=t(null),c=t([]),l=t(null);function u(t,r){g(),e.value=t,n.value=URL.createObjectURL(t),s.value=r??null,c.value=r?[r]:[]}async function d(t,r){g();let i=await(await fetch(t.originalUrl)).blob();e.value=new File([i],t.originalFilename,{type:i.type}),n.value=URL.createObjectURL(i),l.value=t.id,a.value=t.cropParams??null,o.value=t.stickerState?[...t.stickerState]:[],c.value=t.approvedDeviceIds,s.value=r??null}function f(e,t){i.value&&URL.revokeObjectURL(i.value),r.value=e,i.value=URL.createObjectURL(e),a.value=t}function p(e){o.value=[...o.value,e]}function m(e,t){o.value=o.value.map(n=>n.id===e?{...n,...t}:n)}function h(e){o.value=o.value.filter(t=>t.id!==e)}function g(){n.value&&URL.revokeObjectURL(n.value),i.value&&URL.revokeObjectURL(i.value),e.value=null,n.value=null,r.value=null,i.value=null,a.value=null,o.value=[],s.value=null,c.value=[],l.value=null}return{originalFile:e,originalUrl:n,croppedBlob:r,croppedUrl:i,cropParams:a,stickers:o,contextDeviceId:s,selectedDeviceIds:c,editingImageId:l,init:u,initEdit:d,setCrop:f,addSticker:p,updateSticker:m,removeSticker:h,cleanup:g}}),S={key:0,class:`btn__spinner`,"aria-hidden":`true`},C=f(m({__name:`BaseButton`,props:{variant:{default:`primary`},tag:{default:`button`},type:{default:`button`},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1}},setup(t){return(i,a)=>(c(),o(r(t.tag),e({type:t.tag===`button`?t.type:void 0,disabled:t.disabled||t.loading,class:[`btn`,`btn--${t.variant}`,{"btn--loading":t.loading}]},i.$attrs),{default:g(()=>[t.loading?(c(),l(`span`,S)):s(``,!0),n(i.$slots,`default`,{},void 0,!0)]),_:3},16,[`type`,`disabled`,`class`]))}}),[[`__scopeId`,`data-v-7d3f1e61`]]),w=[`aria-label`],T=f(m({__name:`BaseBottomSheet`,props:{modelValue:{type:Boolean},label:{}},emits:[`update:modelValue`],setup(e,{emit:r}){let u=e,f=r,m=t(null),b=null;function x(){f(`update:modelValue`,!1)}return i(()=>u.modelValue,async e=>{e?(b=document.activeElement,await h(),m.value?.focus()):(b?.focus(),b=null)}),(t,r)=>(c(),o(d,{to:`body`},[a(_,{name:`sheet`},{default:g(()=>[e.modelValue?(c(),l(`div`,{key:0,class:`sheet-overlay`,role:`dialog`,"aria-label":e.label,"aria-modal":`true`,onClick:y(x,[`self`]),onKeydown:v(x,[`esc`])},[p(`div`,{ref_key:`sheetRef`,ref:m,class:`sheet`,tabindex:`-1`},[r[0]||=p(`div`,{class:`sheet__handle`,"aria-hidden":`true`},null,-1),n(t.$slots,`default`,{},void 0,!0)],512)],40,w)):s(``,!0)]),_:3})]))}}),[[`__scopeId`,`data-v-81ce2dd1`]]);export{b as i,C as n,x as r,T as t}; \ No newline at end of file diff --git a/public/build/assets/BaseBottomSheet-cgSeW-RK.js b/public/build/assets/BaseBottomSheet-cgSeW-RK.js new file mode 100644 index 0000000..f359735 --- /dev/null +++ b/public/build/assets/BaseBottomSheet-cgSeW-RK.js @@ -0,0 +1 @@ +import{C as e,H as t,M as n,P as r,R as i,_ as a,d as o,f as s,k as c,p as l,r as u,s as d,t as f,u as p,v as m,w as h,z as g}from"./_plugin-vue_export-helper-DVo1OUMD.js";import{c as _,d as v,f as y}from"./index-CmXd-se5.js";var b=u(`devices`,()=>{let e=t([]),n=t(!1),r=t(null);async function i(){n.value=!0,r.value=null;try{let t=await fetch(`/api/devices`);if(!t.ok)throw Error(`Failed to load devices`);e.value=await t.json()}catch(e){r.value=e instanceof Error?e.message:`Unknown error`}finally{n.value=!1}}async function a(t,n){let r=await fetch(`/api/devices/${t}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n)});if(!r.ok)throw Error(`Failed to update device`);let i=await r.json(),a=e.value.findIndex(e=>e.id===t);return a!==-1&&(e.value[a]=i),i}async function o(t,n){let r=await fetch(`/api/devices/${t}/lock`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({imageId:n})});if(!r.ok)throw Error(`Failed to lock image`);let i=await r.json(),a=e.value.findIndex(e=>e.id===t);return a!==-1&&(e.value[a]=i),i}async function s(t){let n=await fetch(`/api/devices/${t}/lock`,{method:`DELETE`});if(!n.ok)throw Error(`Failed to unlock`);let r=await n.json(),i=e.value.findIndex(e=>e.id===t);return i!==-1&&(e.value[i]=r),r}return{devices:e,loading:n,error:r,fetchDevices:i,updateDevice:a,lockImage:o,unlockImage:s}}),x=u(`upload`,()=>{let e=t(null),n=t(null),r=t(null),i=t(null),a=t(null),o=t(null),s=t([]),c=t(null),l=t([]),u=t(null);function d(t,r){_(),e.value=t,n.value=URL.createObjectURL(t),c.value=r??null,l.value=r?[r]:[]}async function f(t,r){_();let i=await(await fetch(t.originalUrl)).blob();e.value=new File([i],t.originalFilename,{type:i.type}),n.value=URL.createObjectURL(i),u.value=t.id,a.value=t.cropParams??null,o.value=t.cropOrientation??null,s.value=t.stickerState?[...t.stickerState]:[],l.value=t.approvedDeviceIds,c.value=r??null}function p(e,t,n){i.value&&URL.revokeObjectURL(i.value),r.value=e,i.value=URL.createObjectURL(e),a.value=t,o.value=n}function m(e){s.value=[...s.value,e]}function h(e,t){s.value=s.value.map(n=>n.id===e?{...n,...t}:n)}function g(e){s.value=s.value.filter(t=>t.id!==e)}function _(){n.value&&URL.revokeObjectURL(n.value),i.value&&URL.revokeObjectURL(i.value),e.value=null,n.value=null,r.value=null,i.value=null,a.value=null,o.value=null,s.value=[],c.value=null,l.value=[],u.value=null}return{originalFile:e,originalUrl:n,croppedBlob:r,croppedUrl:i,cropParams:a,cropOrientation:o,stickers:s,contextDeviceId:c,selectedDeviceIds:l,editingImageId:u,init:d,initEdit:f,setCrop:p,addSticker:m,updateSticker:h,removeSticker:g,cleanup:_}}),S={key:0,class:`btn__spinner`,"aria-hidden":`true`},C=f(m({__name:`BaseButton`,props:{variant:{default:`primary`},tag:{default:`button`},type:{default:`button`},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1}},setup(t){return(i,a)=>(c(),o(r(t.tag),e({type:t.tag===`button`?t.type:void 0,disabled:t.disabled||t.loading,class:[`btn`,`btn--${t.variant}`,{"btn--loading":t.loading}]},i.$attrs),{default:g(()=>[t.loading?(c(),l(`span`,S)):s(``,!0),n(i.$slots,`default`,{},void 0,!0)]),_:3},16,[`type`,`disabled`,`class`]))}}),[[`__scopeId`,`data-v-7d3f1e61`]]),w=[`aria-label`],T=f(m({__name:`BaseBottomSheet`,props:{modelValue:{type:Boolean},label:{}},emits:[`update:modelValue`],setup(e,{emit:r}){let u=e,f=r,m=t(null),b=null;function x(){f(`update:modelValue`,!1)}return i(()=>u.modelValue,async e=>{e?(b=document.activeElement,await h(),m.value?.focus()):(b?.focus(),b=null)}),(t,r)=>(c(),o(d,{to:`body`},[a(_,{name:`sheet`},{default:g(()=>[e.modelValue?(c(),l(`div`,{key:0,class:`sheet-overlay`,role:`dialog`,"aria-label":e.label,"aria-modal":`true`,onClick:y(x,[`self`]),onKeydown:v(x,[`esc`])},[p(`div`,{ref_key:`sheetRef`,ref:m,class:`sheet`,tabindex:`-1`},[r[0]||=p(`div`,{class:`sheet__handle`,"aria-hidden":`true`},null,-1),n(t.$slots,`default`,{},void 0,!0)],512)],40,w)):s(``,!0)]),_:3})]))}}),[[`__scopeId`,`data-v-81ce2dd1`]]);export{b as i,C as n,x as r,T as t}; \ No newline at end of file diff --git a/public/build/assets/DevicePicker-Dz05cPit.js b/public/build/assets/DevicePicker-DreFDlLU.js similarity index 96% rename from public/build/assets/DevicePicker-Dz05cPit.js rename to public/build/assets/DevicePicker-DreFDlLU.js index 330d1f1..fc38aff 100644 --- a/public/build/assets/DevicePicker-Dz05cPit.js +++ b/public/build/assets/DevicePicker-DreFDlLU.js @@ -1 +1 @@ -import{_ as e,d as t,g as n,j as r,k as i,l as a,o,p as s,pt as c,t as l,u,v as d,z as f}from"./_plugin-vue_export-helper-DVo1OUMD.js";import{n as p,t as m}from"./BaseBottomSheet-BODCttr7.js";var h={class:`device-picker__list`},g=[`checked`,`onChange`],_={class:`device-picker__name`},v={class:`device-picker__orientation`},y=l(d({__name:`DevicePicker`,props:{modelValue:{type:Boolean},devices:{},selected:{},uploading:{type:Boolean}},emits:[`update:modelValue`,`update:selected`,`confirm`],setup(l,{emit:d}){let y=l,b=d;function x(e){y.selected.includes(e)?b(`update:selected`,y.selected.filter(t=>t!==e)):b(`update:selected`,[...y.selected,e])}let S=a(()=>{let e=y.selected.length;return e===0?`Add to frame`:`Add to ${e} frame${e>1?`s`:``}`});return(a,d)=>(i(),t(m,{"model-value":l.modelValue,label:`Choose frames`,"onUpdate:modelValue":d[1]||=e=>a.$emit(`update:modelValue`,e)},{default:f(()=>[d[2]||=u(`h2`,{class:`device-picker__title`},`Add to frames`,-1),d[3]||=u(`p`,{class:`device-picker__sub`},`Choose which frames will show this photo.`,-1),u(`div`,h,[(i(!0),s(o,null,r(l.devices,e=>(i(),s(`label`,{key:e.id,class:`device-picker__row`},[u(`input`,{type:`checkbox`,class:`device-picker__check`,checked:l.selected.includes(e.id),onChange:t=>x(e.id)},null,40,g),u(`span`,_,c(e.name),1),u(`span`,v,c(e.orientation),1)]))),128))]),e(p,{variant:`primary`,class:`device-picker__confirm`,disabled:l.selected.length===0||l.uploading,onClick:d[0]||=e=>a.$emit(`confirm`)},{default:f(()=>[n(c(l.uploading?`Uploading…`:S.value),1)]),_:1},8,[`disabled`])]),_:1},8,[`model-value`]))}}),[[`__scopeId`,`data-v-a6466fa5`]]);export{y as t}; \ No newline at end of file +import{_ as e,d as t,g as n,j as r,k as i,l as a,o,p as s,pt as c,t as l,u,v as d,z as f}from"./_plugin-vue_export-helper-DVo1OUMD.js";import{n as p,t as m}from"./BaseBottomSheet-cgSeW-RK.js";var h={class:`device-picker__list`},g=[`checked`,`onChange`],_={class:`device-picker__name`},v={class:`device-picker__orientation`},y=l(d({__name:`DevicePicker`,props:{modelValue:{type:Boolean},devices:{},selected:{},uploading:{type:Boolean}},emits:[`update:modelValue`,`update:selected`,`confirm`],setup(l,{emit:d}){let y=l,b=d;function x(e){y.selected.includes(e)?b(`update:selected`,y.selected.filter(t=>t!==e)):b(`update:selected`,[...y.selected,e])}let S=a(()=>{let e=y.selected.length;return e===0?`Add to frame`:`Add to ${e} frame${e>1?`s`:``}`});return(a,d)=>(i(),t(m,{"model-value":l.modelValue,label:`Choose frames`,"onUpdate:modelValue":d[1]||=e=>a.$emit(`update:modelValue`,e)},{default:f(()=>[d[2]||=u(`h2`,{class:`device-picker__title`},`Add to frames`,-1),d[3]||=u(`p`,{class:`device-picker__sub`},`Choose which frames will show this photo.`,-1),u(`div`,h,[(i(!0),s(o,null,r(l.devices,e=>(i(),s(`label`,{key:e.id,class:`device-picker__row`},[u(`input`,{type:`checkbox`,class:`device-picker__check`,checked:l.selected.includes(e.id),onChange:t=>x(e.id)},null,40,g),u(`span`,_,c(e.name),1),u(`span`,v,c(e.orientation),1)]))),128))]),e(p,{variant:`primary`,class:`device-picker__confirm`,disabled:l.selected.length===0||l.uploading,onClick:d[0]||=e=>a.$emit(`confirm`)},{default:f(()=>[n(c(l.uploading?`Uploading…`:S.value),1)]),_:1},8,[`disabled`])]),_:1},8,[`model-value`]))}}),[[`__scopeId`,`data-v-a6466fa5`]]);export{y as t}; \ No newline at end of file diff --git a/public/build/assets/HomeView-Ub9_hNNK.js b/public/build/assets/HomeView-Bfoik_wA.js similarity index 98% rename from public/build/assets/HomeView-Ub9_hNNK.js rename to public/build/assets/HomeView-Bfoik_wA.js index afb3c09..a13a594 100644 --- a/public/build/assets/HomeView-Ub9_hNNK.js +++ b/public/build/assets/HomeView-Bfoik_wA.js @@ -1 +1 @@ -import{B as e,C as t,E as n,H as r,K as i,_ as a,d as o,dt as s,f as c,ft as l,g as u,h as d,j as f,k as p,l as m,o as h,p as g,pt as _,t as v,u as y,v as b,z as x}from"./_plugin-vue_export-helper-DVo1OUMD.js";import{l as S,s as C}from"./index-C0Yc8pEe.js";import{i as w,n as T,r as E,t as D}from"./BaseBottomSheet-BODCttr7.js";var O={key:0,class:`frame-card__status-badge`,"aria-live":`polite`},k=[`src`,`alt`],A={key:1,class:`frame-card__empty-preview`,"aria-hidden":`true`},j={class:`frame-card__body`},M={class:`frame-card__name`},N={key:0,class:`frame-card__count`},P={key:0},F={key:1,"aria-hidden":`true`},I=v(b({__name:`FrameCard`,props:{deviceId:{},name:{},size:{},status:{},orientation:{},thumbnailUrl:{},photoCount:{}},emits:[`add-photo`,`edit`],setup(e){let t=e,n=m(()=>t.size===`large`?{aspectRatio:t.orientation===`portrait`?`3/5`:`5/3`}:{});return(t,r)=>(p(),g(`div`,{class:s([`frame-card`,`frame-card--${e.size}`,e.status!==`ok`&&`frame-card--${e.status}`])},[e.status===`ok`?c(``,!0):(p(),g(`div`,O,[r[2]||=y(`span`,{class:`frame-card__status-dot`,"aria-hidden":`true`},null,-1),u(` `+_(e.status===`offline`?`Offline`:`Sync issue`),1)])),e.size===`large`?(p(),g(`button`,{key:1,class:`frame-card__settings-btn`,type:`button`,"aria-label":`Frame settings`,onClick:r[0]||=n=>t.$emit(`edit`,e.deviceId)},[...r[3]||=[y(`svg`,{width:`18`,height:`18`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.5`,"aria-hidden":`true`},[y(`circle`,{cx:`12`,cy:`12`,r:`3`}),y(`path`,{d:`M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z`})],-1)]])):c(``,!0),y(`div`,{class:`frame-card__preview`,style:l(n.value)},[e.thumbnailUrl?(p(),g(`img`,{key:0,src:e.thumbnailUrl,alt:`Current photo on ${e.name}`,class:`frame-card__img`},null,8,k)):(p(),g(`div`,A,[...r[4]||=[y(`svg`,{width:`32`,height:`32`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.5`},[y(`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`}),y(`circle`,{cx:`8.5`,cy:`8.5`,r:`1.5`}),y(`polyline`,{points:`21,15 16,10 5,21`})],-1)]]))],4),y(`div`,j,[y(`p`,M,_(e.name),1),e.size===`compact`?(p(),g(`p`,N,_(e.photoCount)+` `+_(e.photoCount===1?`photo`:`photos`),1)):c(``,!0),a(T,{variant:e.size===`large`?`primary`:`icon-pill`,"aria-label":(e.size,`Add photo to ${e.name}`),class:`frame-card__add-btn`,onClick:r[1]||=n=>t.$emit(`add-photo`,e.deviceId)},{default:x(()=>[e.size===`large`?(p(),g(`span`,P,`+ Add Photo`)):(p(),g(`span`,F,`+`))]),_:1},8,[`variant`,`aria-label`])])],2))}}),[[`__scopeId`,`data-v-6b5d66c8`]]),L=[`id`,`value`,`type`],R=[`for`],z=[`id`],B=v(b({__name:`BaseInput`,props:{modelValue:{default:``},label:{},type:{default:`text`},error:{},id:{}},emits:[`update:modelValue`,`blur`],setup(e,{emit:n}){let r=e,i=n,a=m(()=>r.id??`input-${Math.random().toString(36).slice(2)}`);return(n,r)=>(p(),g(`div`,{class:s([`input-wrap`,{"input-wrap--error":!!e.error,"input-wrap--filled":!!e.modelValue}])},[y(`input`,t({id:a.value},n.$attrs,{value:e.modelValue,type:e.type,class:`input-wrap__field`,placeholder:` `,onInput:r[0]||=e=>i(`update:modelValue`,e.target.value),onBlur:r[1]||=e=>i(`blur`,e)}),null,16,L),y(`label`,{for:a.value,class:`input-wrap__label`},_(e.label),9,R),e.error?(p(),g(`p`,{key:0,id:`${a.value}-error`,class:`input-wrap__error`,role:`alert`},_(e.error),9,z)):c(``,!0)],2))}}),[[`__scopeId`,`data-v-28da7c7d`]]),V={class:`orientation-picker`,role:`radiogroup`,"aria-label":`Display orientation`},H=[`aria-checked`,`aria-label`,`onClick`],U=[`viewBox`],W=[`stroke`,`fill`],G=[`fill`],K={class:`orientation-opt__label`},q={class:`orientation-opt__sub`},J=v(b({__name:`OrientationPicker`,props:{modelValue:{}},emits:[`update:modelValue`],setup(e){let n=[{value:`landscape`,label:`Landscape`,sub:`Ribbon at bottom`,viewBox:`0 0 48 48`,rect:{x:4,y:12,width:40,height:24},ribbon:{x:20,y:36,width:8,height:5}},{value:`portrait`,label:`Portrait`,sub:`Ribbon on left`,viewBox:`0 0 48 48`,rect:{x:12,y:4,width:24,height:40},ribbon:{x:7,y:20,width:5,height:8}}];return(r,i)=>(p(),g(`div`,V,[(p(),g(h,null,f(n,n=>y(`button`,{key:n.value,type:`button`,role:`radio`,"aria-checked":e.modelValue===n.value,"aria-label":n.label,class:s([`orientation-opt`,{"orientation-opt--active":e.modelValue===n.value}]),onClick:e=>r.$emit(`update:modelValue`,n.value)},[(p(),g(`svg`,{class:`orientation-opt__diagram`,viewBox:n.viewBox,fill:`none`,"aria-hidden":`true`},[y(`rect`,t({ref_for:!0},n.rect,{rx:`2`,stroke:e.modelValue===n.value?`var(--color-primary)`:`currentColor`,"stroke-width":`1.5`,fill:e.modelValue===n.value?`color-mix(in srgb, var(--color-primary) 12%, transparent)`:`var(--color-surface-2)`}),null,16,W),y(`rect`,t({ref_for:!0},n.ribbon,{fill:e.modelValue===n.value?`var(--color-primary)`:`var(--color-text-muted)`,rx:`1`}),null,16,G)],8,U)),y(`span`,K,_(n.label),1),y(`span`,q,_(n.sub),1)],10,H)),64))]))}}),[[`__scopeId`,`data-v-679dae08`]]),Y={class:`home-view`},X={key:0,class:`home-view__loading`,"aria-live":`polite`},Z={key:1,class:`home-view__empty`},Q={key:2,class:`home-view__single`},$={key:3,class:`home-view__list`},ee={class:`home-view__sheet-field`},te={class:`home-view__sheet-field`},ne={class:`home-view__sheet-field`},re={class:`home-view__interval-grid`},ie=[`onClick`],ae=[`label`],oe=[`value`],se=v(b({__name:`HomeView`,setup(t){function c(e){return e.lastSeenAt&&Date.now()-new Date(e.lastSeenAt).getTime()<=Math.max(e.rotationIntervalMinutes*2*6e4,30*6e4)?`ok`:`offline`}function l(e){let t=e.lockedImageId??e.currentImageId;return t?`/api/devices/${e.id}/preview?v=${t}`:void 0}let m=C(),v=w(),b=E();n(()=>{v.fetchDevices()});function O(e){let t=document.createElement(`input`);t.type=`file`,t.accept=`image/jpeg,image/png,image/webp,image/gif`,t.onchange=()=>{let n=t.files?.[0];n&&(b.init(n,e),m.push(`/upload`))},t.click()}let k=[{hour:0,label:`12 AM`},{hour:2,label:`2 AM`},{hour:4,label:`4 AM`},{hour:6,label:`6 AM`},{hour:8,label:`8 AM`},{hour:10,label:`10 AM`},{hour:12,label:`12 PM`},{hour:18,label:`6 PM`},{hour:20,label:`8 PM`},{hour:22,label:`10 PM`}],A=[{label:`Americas`,zones:[{value:`America/New_York`,label:`Eastern — New York, Toronto`},{value:`America/Chicago`,label:`Central — Chicago, Mexico City`},{value:`America/Denver`,label:`Mountain — Denver, Calgary`},{value:`America/Phoenix`,label:`Mountain (no DST) — Phoenix`},{value:`America/Los_Angeles`,label:`Pacific — Los Angeles, Vancouver`},{value:`America/Anchorage`,label:`Alaska — Anchorage`},{value:`Pacific/Honolulu`,label:`Hawaii — Honolulu`},{value:`America/Sao_Paulo`,label:`Brasília — São Paulo`},{value:`America/Argentina/Buenos_Aires`,label:`Argentina — Buenos Aires`},{value:`America/Bogota`,label:`Colombia — Bogotá`}]},{label:`Europe`,zones:[{value:`Europe/London`,label:`GMT/BST — London, Dublin`},{value:`Europe/Lisbon`,label:`WET/WEST — Lisbon`},{value:`Europe/Paris`,label:`CET/CEST — Paris, Brussels, Amsterdam`},{value:`Europe/Berlin`,label:`CET/CEST — Berlin, Vienna, Zurich`},{value:`Europe/Stockholm`,label:`CET/CEST — Stockholm, Oslo, Copenhagen`},{value:`Europe/Helsinki`,label:`EET/EEST — Helsinki, Tallinn, Riga`},{value:`Europe/Warsaw`,label:`CET/CEST — Warsaw, Prague, Budapest`},{value:`Europe/Rome`,label:`CET/CEST — Rome, Madrid`},{value:`Europe/Athens`,label:`EET/EEST — Athens, Bucharest`},{value:`Europe/Istanbul`,label:`TRT — Istanbul`},{value:`Europe/Moscow`,label:`MSK — Moscow`}]},{label:`Asia & Pacific`,zones:[{value:`Asia/Dubai`,label:`GST — Dubai, Abu Dhabi`},{value:`Asia/Karachi`,label:`PKT — Karachi, Islamabad`},{value:`Asia/Kolkata`,label:`IST — India`},{value:`Asia/Dhaka`,label:`BST — Dhaka, Bangladesh`},{value:`Asia/Bangkok`,label:`ICT — Bangkok, Jakarta, Hanoi`},{value:`Asia/Singapore`,label:`SGT — Singapore, Kuala Lumpur`},{value:`Asia/Shanghai`,label:`CST — Beijing, Shanghai, Taipei`},{value:`Asia/Seoul`,label:`KST — Seoul`},{value:`Asia/Tokyo`,label:`JST — Tokyo`},{value:`Australia/Sydney`,label:`AEDT/AEST — Sydney, Melbourne`},{value:`Australia/Brisbane`,label:`AEST (no DST) — Brisbane`},{value:`Australia/Perth`,label:`AWST — Perth`},{value:`Pacific/Auckland`,label:`NZDT/NZST — Auckland`}]},{label:`Africa & Middle East`,zones:[{value:`Africa/Cairo`,label:`EET — Cairo`},{value:`Africa/Nairobi`,label:`EAT — Nairobi, East Africa`},{value:`Africa/Johannesburg`,label:`SAST — Johannesburg`},{value:`Africa/Lagos`,label:`WAT — Lagos, West Africa`}]},{label:`UTC`,zones:[{value:`UTC`,label:`UTC — Coordinated Universal Time`}]}],j=r(!1),M=r(!1),N=r(null),P=r(``),F=r(`landscape`),L=r(4),R=r(`UTC`);function z(e){let t=v.devices.find(t=>t.id===e);t&&(N.value=t,P.value=t.name,F.value=t.orientation,L.value=t.wakeHour??4,R.value=t.timezone??`UTC`,j.value=!0)}async function V(){if(N.value){M.value=!0;try{await v.updateDevice(N.value.id,{name:P.value.trim()||N.value.name,orientation:F.value,wakeHour:L.value,timezone:R.value}),j.value=!1}finally{M.value=!1}}}return(t,n)=>(p(),g(h,null,[y(`main`,Y,[i(v).loading?(p(),g(`div`,X,` Loading… `)):i(v).devices.length===0?(p(),g(`div`,Z,[...n[4]||=[d(`
Set up your first frame
Power on your pictureFrame device and scan the QR code it displays to get started.
Set up your first frame
Power on your pictureFrame device and scan the QR code it displays to get started.
No photos yet
Tap "+ Add Photo" on the home screen to get started.
`,3)]])):(d(),m(`div`,ce,[(d(!0),m(p,null,u(K.value,e=>(d(),m(`div`,{key:e.id,class:`library__item`},[_(`div`,le,[_(`img`,{src:e.thumbnailUrl,alt:e.originalFilename,class:`library__img`,loading:`lazy`},null,8,H),_(`div`,U,[_(`button`,{class:`library__action-btn`,type:`button`,"aria-label":`Edit ${e.originalFilename}`,disabled:Y.value===e.id,onClick:t=>X(e)},[Y.value===e.id?(d(),m(`svg`,de,[...t[7]||=[_(`circle`,{cx:`12`,cy:`12`,r:`10`},null,-1),_(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`12`},null,-1),_(`line`,{x1:`12`,y1:`16`,x2:`12.01`,y2:`16`},null,-1)]])):(d(),m(`svg`,ue,[...t[6]||=[_(`path`,{d:`M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7`},null,-1),_(`path`,{d:`M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z`},null,-1)]]))],8,W),_(`button`,{class:`library__action-btn`,type:`button`,"aria-label":`Share ${e.originalFilename}`,onClick:t=>Ne(e.id)},[...t[8]||=[l(``,1)]],8,fe),_(`button`,{class:`library__action-btn library__action-btn--danger`,type:`button`,"aria-label":`Delete photo`,onClick:t=>Ie(e.id)},[...t[9]||=[l(``,1)]],8,pe)])]),r(x).devices.length>0?(d(),m(`div`,me,[(d(!0),m(p,null,u(r(x).devices,t=>(d(),m(`button`,{key:t.id,class:o([`library__approval-chip`,{"library__approval-chip--on":e.approvedDeviceIds.includes(t.id)}]),type:`button`,"aria-label":`${e.approvedDeviceIds.includes(t.id)?`Remove from`:`Add to`} ${t.name}`,onClick:n=>Fe(e.id,t.id,!e.approvedDeviceIds.includes(t.id))},h(t.name),11,he))),128))])):s(``,!0),r(x).devices.length>0?(d(),m(`div`,ge,[(d(!0),m(p,null,u(r(x).devices.filter(t=>e.approvedDeviceIds.includes(t.id)),n=>(d(),m(`button`,{key:n.id,class:o([`library__lock-chip`,{"library__lock-chip--on":n.lockedImageId===e.id}]),type:`button`,"aria-label":`${n.lockedImageId===e.id?`Unlock from`:`Lock to`} ${n.name}`,onClick:t=>Pe(e.id,n)},[(d(),m(`svg`,ve,[t[10]||=_(`rect`,{x:`3`,y:`11`,width:`18`,height:`11`,rx:`2`,ry:`2`},null,-1),n.lockedImageId===e.id?(d(),m(`path`,ye)):(d(),m(`path`,be))])),c(` `+h(n.name),1)],10,_e))),128))])):s(``,!0)]))),128))]))],64)),J.value===null?s(``,!0):(d(),a(ne,{key:3,modelValue:q.value,"onUpdate:modelValue":t[2]||=e=>q.value=e,"image-id":J.value},null,8,[`modelValue`,`image-id`])),i(k,{modelValue:Z.value,"onUpdate:modelValue":t[4]||=e=>Z.value=e,label:`Delete photo`},{default:y(()=>[t[13]||=_(`h2`,{class:`library__sheet-title`},`Delete this photo?`,-1),t[14]||=_(`p`,{class:`library__sheet-sub`},`It will be removed from all frames.`,-1),_(`div`,Me,[i(O,{variant:`secondary`,onClick:t[3]||=e=>Z.value=!1},{default:y(()=>[...t[12]||=[c(`Cancel`,-1)]]),_:1}),i(O,{variant:`destructive`,disabled:$.value,onClick:Le},{default:y(()=>[c(h($.value?`Deleting…`:`Delete`),1)]),_:1},8,[`disabled`])])]),_:1},8,[`modelValue`])]))}}),[[`__scopeId`,`data-v-695e06b8`]]);export{G as default}; \ No newline at end of file +import{B as e,E as t,H as n,K as r,_ as i,d as a,dt as o,f as s,g as c,h as l,j as u,k as d,l as f,o as p,p as m,pt as h,t as g,u as _,v,z as y}from"./_plugin-vue_export-helper-DVo1OUMD.js";import{a as b,d as x,f as S,i as C,o as w,s as T,u as E}from"./index-CmXd-se5.js";import{i as D,n as O,r as ee,t as k}from"./BaseBottomSheet-cgSeW-RK.js";import{t as A}from"./DevicePicker-DreFDlLU.js";var j={class:`approve-card`},M=[`src`,`alt`],N={class:`approve-card__body`},P={class:`approve-card__from`},F={class:`approve-card__date`},I={key:0,class:`approve-card__status`},L={class:`approve-card__actions`},te=g(v({__name:`ApproveCard`,props:{item:{}},emits:[`updated`],setup(e,{emit:t}){let l=e,u=t,g=b(),v=D(),x=n(!1),S=n(!1),C=n([]),w=f(()=>new Date(l.item.sharedAt).toLocaleDateString(void 0,{month:`short`,day:`numeric`,year:`numeric`}));async function T(){x.value=!1,S.value=!0;try{u(`updated`,await g.approveShared(l.item.id,C.value))}finally{S.value=!1,C.value=[]}}async function E(){S.value=!0;try{u(`updated`,await g.declineShared(l.item.id))}finally{S.value=!1}}return(t,n)=>(d(),m(p,null,[_(`div`,j,[_(`img`,{src:e.item.thumbnailUrl,alt:`Photo from ${e.item.sharedBy}`,class:`approve-card__thumb`,loading:`lazy`},null,8,M),_(`div`,N,[_(`p`,P,[n[3]||=c(`From `,-1),_(`strong`,null,h(e.item.sharedBy),1)]),_(`p`,F,h(w.value),1),e.item.status===`pending`?s(``,!0):(d(),m(`div`,I,[_(`span`,{class:o([`approve-card__badge`,`approve-card__badge--${e.item.status}`])},h(e.item.status),3)])),_(`div`,L,[e.item.status===`pending`||e.item.status===`declined`?(d(),a(O,{key:0,variant:`primary`,size:`sm`,disabled:S.value,onClick:n[0]||=e=>x.value=!0},{default:y(()=>[c(h(e.item.status===`declined`?`Add anyway`:`Add to frame`),1)]),_:1},8,[`disabled`])):s(``,!0),e.item.status===`pending`||e.item.status===`approved`?(d(),a(O,{key:1,variant:`ghost`,size:`sm`,disabled:S.value,onClick:E},{default:y(()=>[c(h(e.item.status===`approved`?`Remove`:`Decline`),1)]),_:1},8,[`disabled`])):s(``,!0)])])]),i(A,{modelValue:x.value,"onUpdate:modelValue":n[1]||=e=>x.value=e,devices:r(v).devices,selected:C.value,uploading:S.value,"confirm-label":`Add to frames`,"onUpdate:selected":n[2]||=e=>C.value=e,onConfirm:T},null,8,[`modelValue`,`devices`,`selected`,`uploading`])],64))}}),[[`__scopeId`,`data-v-6d3dd8b4`]]),R={class:`share-sheet__field`},z=[`onKeydown`],B={key:0,class:`share-sheet__error`},V={key:1,class:`share-sheet__success`},ne=g(v({__name:`ShareSheet`,props:{modelValue:{type:Boolean},imageId:{}},emits:[`update:modelValue`],setup(t,{emit:r}){let o=t,l=b(),u=n(``),f=n(!1),p=n(``),g=n(``);async function v(){if(p.value=``,g.value=``,u.value.trim()){f.value=!0;try{await l.shareImage(o.imageId,u.value.trim()),g.value=`Invite sent to ${u.value.trim()}`,u.value=``}catch(e){p.value=e instanceof Error?e.message:`Failed to send`}finally{f.value=!1}}}return(n,r)=>(d(),a(k,{"model-value":t.modelValue,label:`Share photo`,"onUpdate:modelValue":r[1]||=e=>n.$emit(`update:modelValue`,e)},{default:y(()=>[r[2]||=_(`h2`,{class:`share-sheet__title`},`Share with someone`,-1),r[3]||=_(`p`,{class:`share-sheet__sub`},`They'll get an email and can add it to their frame.`,-1),_(`div`,R,[e(_(`input`,{"onUpdate:modelValue":r[0]||=e=>u.value=e,type:`email`,class:`share-sheet__input`,placeholder:`their@email.com`,autocomplete:`email`,onKeydown:x(S(v,[`prevent`]),[`enter`])},null,40,z),[[E,u.value]])]),p.value?(d(),m(`p`,B,h(p.value),1)):s(``,!0),g.value?(d(),m(`p`,V,h(g.value),1)):s(``,!0),i(O,{variant:`primary`,class:`share-sheet__btn`,disabled:f.value||!u.value.trim(),onClick:v},{default:y(()=>[c(h(f.value?`Sending…`:`Send invite`),1)]),_:1},8,[`disabled`])]),_:1},8,[`model-value`]))}}),[[`__scopeId`,`data-v-24296e7b`]]),re={class:`library`},ie={class:`library__tabs`,role:`tablist`},ae=[`aria-selected`,`onClick`],oe={key:0,class:`library__loading`},se={key:0,class:`library__empty`},ce={key:1,class:`library__grid`},le={class:`library__thumb`},H=[`src`,`alt`],U={class:`library__thumb-actions`},W=[`aria-label`,`disabled`,`onClick`],ue={key:0,width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"aria-hidden":`true`},de={key:1,width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"aria-hidden":`true`},fe=[`aria-label`,`onClick`],pe=[`onClick`],me={key:0,class:`library__approvals`},he=[`aria-label`,`onClick`],ge={key:1,class:`library__locks`},_e=[`aria-label`,`onClick`],ve={width:`10`,height:`10`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"aria-hidden":`true`},ye={key:0,d:`M7 11V7a5 5 0 0 1 10 0v4`},be={key:1,d:`M7 11V7a5 5 0 0 1 9.9-1`},xe={class:`library__subtabs`,role:`tablist`},Se=[`aria-selected`,`onClick`],Ce={key:0,class:`library__loading`},we={key:1,class:`library__shared-empty`},Te={class:`library__empty-title`},Ee={class:`library__empty-sub`},De={key:2,class:`library__shared-list`},Oe={key:3,class:`library__pagination`},ke=[`disabled`],Ae={class:`library__page-info`},je=[`disabled`],Me={class:`library__sheet-actions`},G=g(v({__name:`LibraryView`,setup(e){let g=T(),v=b(),x=D(),S=ee(),E=C(),A=w(),j=[{id:`all`,label:`All`},{id:`mine`,label:`Mine`},{id:`shared`,label:`Shared`}],M=n(A.query.tab??`all`),N=[{id:`pending`,label:`Pending`},{id:`approved`,label:`Approved`},{id:`declined`,label:`Declined`}],P=n(`pending`),F=n([]),I=n(!1),L=n(1),R=n(1);async function z(e,t=1){I.value=!0;try{let n=await v.fetchSharedImages(e,t);F.value=n.items,L.value=n.page,R.value=n.totalPages}finally{I.value=!1}}function B(e){P.value=e,z(e,1)}function V(e){z(P.value,e)}function G(e){let t=F.value.findIndex(t=>t.id===e.id);t!==-1&&(F.value[t]=e)}t(()=>{v.fetchImages(),x.fetchDevices(),v.fetchPendingCount(),M.value===`shared`&&z(P.value)});let K=f(()=>v.images),q=n(!1),J=n(null);function Ne(e){J.value=e,q.value=!0}let Y=n(null);async function X(e){if(!Y.value){Y.value=e.id;try{await S.initEdit(e),g.push(`/upload`)}catch{E.show(`Could not load photo for editing`,`error`)}finally{Y.value=null}}}async function Pe(e,t){try{t.lockedImageId===e?await x.unlockImage(t.id):await x.lockImage(t.id,e)}catch{E.show(`Failed to update lock`,`error`)}}async function Fe(e,t,n){try{await v.setApproval(e,t,n)}catch{E.show(`Failed to update frame approval`,`error`)}}let Z=n(!1),Q=n(null),$=n(!1);function Ie(e){Q.value=e,Z.value=!0}async function Le(){if(Q.value){$.value=!0;try{await v.deleteImage(Q.value),Z.value=!1,E.show(`Photo deleted`,`success`)}catch{E.show(`Delete failed`,`error`)}finally{$.value=!1}}}return(e,t)=>(d(),m(`main`,re,[_(`div`,ie,[(d(),m(p,null,u(j,e=>_(`button`,{key:e.id,type:`button`,role:`tab`,"aria-selected":M.value===e.id,class:o([`library__tab`,{"library__tab--active":M.value===e.id}]),onClick:t=>M.value=e.id},h(e.label),11,ae)),64))]),r(v).loading?(d(),m(`div`,oe,`Loading…`)):M.value===`shared`?(d(),m(p,{key:2},[_(`div`,xe,[(d(),m(p,null,u(N,e=>_(`button`,{key:e.id,type:`button`,role:`tab`,"aria-selected":P.value===e.id,class:o([`library__subtab`,{"library__subtab--active":P.value===e.id}]),onClick:t=>B(e.id)},h(e.label),11,Se)),64))]),I.value?(d(),m(`div`,Ce,`Loading…`)):F.value.length===0?(d(),m(`div`,we,[t[11]||=l(``,1),_(`p`,Te,h(P.value===`pending`?`No pending photos`:P.value===`approved`?`No approved photos`:`No declined photos`),1),_(`p`,Ee,h(P.value===`pending`?`Photos shared with you will appear here.`:`Photos you've added to a frame will appear here.`),1)])):(d(),m(`div`,De,[(d(!0),m(p,null,u(F.value,e=>(d(),a(te,{key:e.id,item:e,onUpdated:G},null,8,[`item`]))),128))])),R.value>1?(d(),m(`div`,Oe,[_(`button`,{class:`library__page-btn`,disabled:L.value<=1,onClick:t[0]||=e=>V(L.value-1)},`← Prev`,8,ke),_(`span`,Ae,h(L.value)+` / `+h(R.value),1),_(`button`,{class:`library__page-btn`,disabled:L.value>=R.value,onClick:t[1]||=e=>V(L.value+1)},`Next →`,8,je)])):s(``,!0)],64)):(d(),m(p,{key:1},[K.value.length===0?(d(),m(`div`,se,[...t[5]||=[l(`No photos yet
Tap "+ Add Photo" on the home screen to get started.
`,3)]])):(d(),m(`div`,ce,[(d(!0),m(p,null,u(K.value,e=>(d(),m(`div`,{key:e.id,class:`library__item`},[_(`div`,le,[_(`img`,{src:e.thumbnailUrl,alt:e.originalFilename,class:`library__img`,loading:`lazy`},null,8,H),_(`div`,U,[_(`button`,{class:`library__action-btn`,type:`button`,"aria-label":`Edit ${e.originalFilename}`,disabled:Y.value===e.id,onClick:t=>X(e)},[Y.value===e.id?(d(),m(`svg`,de,[...t[7]||=[_(`circle`,{cx:`12`,cy:`12`,r:`10`},null,-1),_(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`12`},null,-1),_(`line`,{x1:`12`,y1:`16`,x2:`12.01`,y2:`16`},null,-1)]])):(d(),m(`svg`,ue,[...t[6]||=[_(`path`,{d:`M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7`},null,-1),_(`path`,{d:`M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z`},null,-1)]]))],8,W),_(`button`,{class:`library__action-btn`,type:`button`,"aria-label":`Share ${e.originalFilename}`,onClick:t=>Ne(e.id)},[...t[8]||=[l(``,1)]],8,fe),_(`button`,{class:`library__action-btn library__action-btn--danger`,type:`button`,"aria-label":`Delete photo`,onClick:t=>Ie(e.id)},[...t[9]||=[l(``,1)]],8,pe)])]),r(x).devices.length>0?(d(),m(`div`,me,[(d(!0),m(p,null,u(r(x).devices,t=>(d(),m(`button`,{key:t.id,class:o([`library__approval-chip`,{"library__approval-chip--on":e.approvedDeviceIds.includes(t.id)}]),type:`button`,"aria-label":`${e.approvedDeviceIds.includes(t.id)?`Remove from`:`Add to`} ${t.name}`,onClick:n=>Fe(e.id,t.id,!e.approvedDeviceIds.includes(t.id))},h(t.name),11,he))),128))])):s(``,!0),r(x).devices.length>0?(d(),m(`div`,ge,[(d(!0),m(p,null,u(r(x).devices.filter(t=>e.approvedDeviceIds.includes(t.id)),n=>(d(),m(`button`,{key:n.id,class:o([`library__lock-chip`,{"library__lock-chip--on":n.lockedImageId===e.id}]),type:`button`,"aria-label":`${n.lockedImageId===e.id?`Unlock from`:`Lock to`} ${n.name}`,onClick:t=>Pe(e.id,n)},[(d(),m(`svg`,ve,[t[10]||=_(`rect`,{x:`3`,y:`11`,width:`18`,height:`11`,rx:`2`,ry:`2`},null,-1),n.lockedImageId===e.id?(d(),m(`path`,ye)):(d(),m(`path`,be))])),c(` `+h(n.name),1)],10,_e))),128))])):s(``,!0)]))),128))]))],64)),J.value===null?s(``,!0):(d(),a(ne,{key:3,modelValue:q.value,"onUpdate:modelValue":t[2]||=e=>q.value=e,"image-id":J.value},null,8,[`modelValue`,`image-id`])),i(k,{modelValue:Z.value,"onUpdate:modelValue":t[4]||=e=>Z.value=e,label:`Delete photo`},{default:y(()=>[t[13]||=_(`h2`,{class:`library__sheet-title`},`Delete this photo?`,-1),t[14]||=_(`p`,{class:`library__sheet-sub`},`It will be removed from all frames.`,-1),_(`div`,Me,[i(O,{variant:`secondary`,onClick:t[3]||=e=>Z.value=!1},{default:y(()=>[...t[12]||=[c(`Cancel`,-1)]]),_:1}),i(O,{variant:`destructive`,disabled:$.value,onClick:Le},{default:y(()=>[c(h($.value?`Deleting…`:`Delete`),1)]),_:1},8,[`disabled`])])]),_:1},8,[`modelValue`])]))}}),[[`__scopeId`,`data-v-695e06b8`]]);export{G as default}; \ No newline at end of file diff --git a/public/build/assets/SettingsView-Dbe21KxS.js b/public/build/assets/SettingsView-B067l1Rb.js similarity index 92% rename from public/build/assets/SettingsView-Dbe21KxS.js rename to public/build/assets/SettingsView-B067l1Rb.js index 728b661..e3e2beb 100644 --- a/public/build/assets/SettingsView-Dbe21KxS.js +++ b/public/build/assets/SettingsView-B067l1Rb.js @@ -1 +1 @@ -import{K as e,dt as t,f as n,ft as r,j as i,k as a,l as o,o as s,p as c,pt as l,t as u,u as d,v as f}from"./_plugin-vue_export-helper-DVo1OUMD.js";import{n as p,r as m,t as h}from"./index-C0Yc8pEe.js";var g={class:`settings`},_={class:`settings__section`},v={class:`theme-grid`,role:`radiogroup`,"aria-label":`Choose theme`},y=[`aria-checked`,`aria-label`,`onClick`],b={class:`theme-swatch__label`},x={key:0,class:`theme-swatch__check`,"aria-hidden":`true`},S={class:`settings__section`},C={class:`settings__row`},w={class:`settings__row-value`},T=u(f({__name:`SettingsView`,setup(u){let f=m(),{saveTheme:T}=p(),E=o(()=>f.user?.theme??`warm-craft`);function D(e){T(e)}return(o,u)=>(a(),c(`main`,g,[u[5]||=d(`h1`,{class:`settings__title`},`Settings`,-1),d(`section`,_,[u[1]||=d(`h2`,{class:`settings__section-title`},`Theme`,-1),d(`div`,v,[(a(!0),c(s,null,i(e(h),e=>(a(),c(`button`,{key:e.id,type:`button`,role:`radio`,"aria-checked":E.value===e.id,"aria-label":e.label,class:t([`theme-swatch`,{"theme-swatch--active":E.value===e.id}]),style:r({"--swatch-bg":e.bg,"--swatch-primary":e.primary,"--swatch-text":e.text}),onClick:t=>D(e.id)},[u[0]||=d(`span`,{class:`theme-swatch__preview`,"aria-hidden":`true`},[d(`span`,{class:`theme-swatch__bar`}),d(`span`,{class:`theme-swatch__dot`})],-1),d(`span`,b,l(e.label),1),E.value===e.id?(a(),c(`span`,x,`✓`)):n(``,!0)],14,y))),128))])]),d(`section`,S,[u[3]||=d(`h2`,{class:`settings__section-title`},`Account`,-1),d(`div`,C,[u[2]||=d(`span`,{class:`settings__row-label`},`Signed in as`,-1),d(`span`,w,l(e(f).user?.email),1)]),u[4]||=d(`a`,{href:`/logout`,class:`settings__logout`},`Sign out`,-1)])]))}}),[[`__scopeId`,`data-v-1446e085`]]);export{T as default}; \ No newline at end of file +import{K as e,dt as t,f as n,ft as r,j as i,k as a,l as o,o as s,p as c,pt as l,t as u,u as d,v as f}from"./_plugin-vue_export-helper-DVo1OUMD.js";import{n as p,r as m,t as h}from"./index-CmXd-se5.js";var g={class:`settings`},_={class:`settings__section`},v={class:`theme-grid`,role:`radiogroup`,"aria-label":`Choose theme`},y=[`aria-checked`,`aria-label`,`onClick`],b={class:`theme-swatch__label`},x={key:0,class:`theme-swatch__check`,"aria-hidden":`true`},S={class:`settings__section`},C={class:`settings__row`},w={class:`settings__row-value`},T=u(f({__name:`SettingsView`,setup(u){let f=m(),{saveTheme:T}=p(),E=o(()=>f.user?.theme??`warm-craft`);function D(e){T(e)}return(o,u)=>(a(),c(`main`,g,[u[5]||=d(`h1`,{class:`settings__title`},`Settings`,-1),d(`section`,_,[u[1]||=d(`h2`,{class:`settings__section-title`},`Theme`,-1),d(`div`,v,[(a(!0),c(s,null,i(e(h),e=>(a(),c(`button`,{key:e.id,type:`button`,role:`radio`,"aria-checked":E.value===e.id,"aria-label":e.label,class:t([`theme-swatch`,{"theme-swatch--active":E.value===e.id}]),style:r({"--swatch-bg":e.bg,"--swatch-primary":e.primary,"--swatch-text":e.text}),onClick:t=>D(e.id)},[u[0]||=d(`span`,{class:`theme-swatch__preview`,"aria-hidden":`true`},[d(`span`,{class:`theme-swatch__bar`}),d(`span`,{class:`theme-swatch__dot`})],-1),d(`span`,b,l(e.label),1),E.value===e.id?(a(),c(`span`,x,`✓`)):n(``,!0)],14,y))),128))])]),d(`section`,S,[u[3]||=d(`h2`,{class:`settings__section-title`},`Account`,-1),d(`div`,C,[u[2]||=d(`span`,{class:`settings__row-label`},`Signed in as`,-1),d(`span`,w,l(e(f).user?.email),1)]),u[4]||=d(`a`,{href:`/logout`,class:`settings__logout`},`Sign out`,-1)])]))}}),[[`__scopeId`,`data-v-1446e085`]]);export{T as default}; \ No newline at end of file diff --git a/public/build/assets/UploadView-BMrcHXkZ.css b/public/build/assets/UploadView-BMrcHXkZ.css new file mode 100644 index 0000000..5d37a13 --- /dev/null +++ b/public/build/assets/UploadView-BMrcHXkZ.css @@ -0,0 +1 @@ +.crop-editor[data-v-85d7731b]{touch-action:none;background:#000;flex-direction:column;flex:1;min-height:0;display:flex;position:relative}.crop-editor__canvas[data-v-85d7731b]{touch-action:none;cursor:grab;flex:1;min-height:0;display:block}.crop-editor__canvas[data-v-85d7731b]:active{cursor:grabbing}.crop-editor__top[data-v-85d7731b]{pointer-events:none;flex-direction:column;align-items:center;gap:8px;display:flex;position:absolute;top:12px;left:12px;right:12px}.crop-editor__label[data-v-85d7731b]{color:#fff;font-size:var(--text-xs);letter-spacing:.04em;background:#0009;border-radius:999px;padding:4px 12px;font-weight:700}.crop-editor__orient[data-v-85d7731b]{pointer-events:auto;background:#0009;border-radius:999px;gap:4px;padding:4px;display:flex}.crop-editor__orient-btn[data-v-85d7731b]{color:#ffffffa6;cursor:pointer;width:36px;height:32px;transition:background var(--duration-fast), color var(--duration-fast);background:0 0;border:none;border-radius:999px;justify-content:center;align-items:center;display:flex}.crop-editor__orient-btn--active[data-v-85d7731b]{color:#000;background:#fff}.crop-editor__mismatch[data-v-85d7731b]{pointer-events:auto;background:var(--color-warning,#f59e0b);color:#fff;font-size:var(--text-xs);border-radius:999px;align-items:center;gap:6px;max-width:100%;padding:6px 12px;font-weight:600;line-height:1.3;display:flex}.crop-editor__mismatch svg[data-v-85d7731b]{flex-shrink:0}.crop-editor__actions[data-v-85d7731b]{padding:var(--space-4);justify-content:center;display:flex;position:absolute;bottom:0;left:0;right:0}.crop-editor__use-btn[data-v-85d7731b]{width:100%;max-width:320px}.sticker-tray__cats[data-v-7eada75b]{gap:var(--space-2);padding-bottom:var(--space-3);scrollbar-width:none;display:flex;overflow-x:auto}.sticker-tray__cats[data-v-7eada75b]::-webkit-scrollbar{display:none}.sticker-tray__cat[data-v-7eada75b]{border:1.5px solid var(--color-border);font-size:var(--text-sm);white-space:nowrap;cursor:pointer;color:var(--color-text-muted);transition:all var(--duration-fast);background:0 0;border-radius:999px;padding:6px 14px;font-weight:600}.sticker-tray__cat--active[data-v-7eada75b]{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-primary-fg)}.sticker-tray__grid[data-v-7eada75b]{gap:var(--space-2);grid-template-columns:repeat(5,1fr);display:grid}.sticker-tray__item[data-v-7eada75b]{padding:var(--space-2) var(--space-1);border-radius:var(--radius-sm);cursor:pointer;transition:background var(--duration-fast);background:0 0;border:none;flex-direction:column;align-items:center;gap:4px;display:flex}.sticker-tray__item[data-v-7eada75b]:active{background:var(--color-surface-2)}.sticker-tray__emoji[data-v-7eada75b]{font-family:Apple Color Emoji,Segoe UI Emoji,Noto Color Emoji,sans-serif;font-size:36px;line-height:1}.sticker-tray__label[data-v-7eada75b]{color:var(--color-text-muted);text-align:center;font-size:10px;font-weight:600;line-height:1.2}.sticker-canvas[data-v-fb52db70]{background:#111;flex-direction:column;flex:1;align-items:center;min-height:0;display:flex;position:relative;overflow:hidden}.sticker-canvas[data-v-fb52db70] .konvajs-content{flex-shrink:0}.sticker-canvas__delete[data-v-fb52db70]{top:var(--space-3);right:var(--space-3);cursor:pointer;color:#fff;z-index:10;background:#c81e1ed9;border:none;border-radius:50%;justify-content:center;align-items:center;width:36px;height:36px;display:flex;position:absolute}.sticker-canvas__bar[data-v-fb52db70]{align-items:center;gap:var(--space-3);height:72px;padding:0 var(--space-4);background:var(--color-surface);border-top:1px solid var(--color-border);display:flex;position:absolute;bottom:0;left:0;right:0}.sticker-canvas__add-btn[data-v-fb52db70]{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);border:1.5px solid var(--color-border);color:var(--color-text);font-size:var(--text-sm);cursor:pointer;white-space:nowrap;background:0 0;font-weight:600;display:flex}.sticker-canvas__next-btn[data-v-fb52db70]{min-width:96px;margin-left:auto}.upload-view[data-v-7bbd1577]{z-index:100;background:var(--color-bg);flex-direction:column;display:flex;position:fixed;inset:0}.upload-view__header[data-v-7bbd1577]{height:56px;padding:0 var(--space-4);background:var(--color-surface);border-bottom:1px solid var(--color-border);flex-shrink:0;align-items:center;display:flex;position:relative}.upload-view__back[data-v-7bbd1577]{cursor:pointer;width:40px;height:40px;color:var(--color-text);background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;margin-left:-8px;display:flex}.upload-view__step-label[data-v-7bbd1577]{font-size:var(--text-base);color:var(--color-text);font-weight:700;position:absolute;left:50%;transform:translate(-50%)}.upload-view__skip[data-v-7bbd1577]{font-size:var(--text-sm);color:var(--color-text-muted);cursor:pointer;padding:var(--space-2) 0;background:0 0;border:none;margin-left:auto;font-weight:600}.upload-view__stage[data-v-7bbd1577]{flex:1;min-height:0}.upload-view__done[data-v-7bbd1577]{justify-content:center;align-items:center;gap:var(--space-4);padding:var(--space-6) var(--space-5);text-align:center;flex-direction:column;flex:1;display:flex}.upload-view__done-icon[data-v-7bbd1577]{font-family:Apple Color Emoji,Segoe UI Emoji,Noto Color Emoji,sans-serif;font-size:64px;line-height:1}.upload-view__done-title[data-v-7bbd1577]{font-size:var(--text-xl);font-weight:700}.upload-view__done-sub[data-v-7bbd1577]{font-size:var(--text-sm);color:var(--color-text-muted);max-width:260px;line-height:1.5}.upload-view__done-btn[data-v-7bbd1577]{width:100%;max-width:320px} diff --git a/public/build/assets/UploadView-CJEQVpkq.css b/public/build/assets/UploadView-CJEQVpkq.css deleted file mode 100644 index e6e27f2..0000000 --- a/public/build/assets/UploadView-CJEQVpkq.css +++ /dev/null @@ -1 +0,0 @@ -.crop-editor[data-v-ec2eb68c]{touch-action:none;background:#000;flex-direction:column;flex:1;min-height:0;display:flex;position:relative}.crop-editor__canvas[data-v-ec2eb68c]{touch-action:none;cursor:grab;flex:1;min-height:0;display:block}.crop-editor__canvas[data-v-ec2eb68c]:active{cursor:grabbing}.crop-editor__label[data-v-ec2eb68c]{color:#fff;font-size:var(--text-xs);letter-spacing:.04em;pointer-events:none;background:#0009;border-radius:999px;padding:4px 12px;font-weight:700;position:absolute;top:16px;left:50%;transform:translate(-50%)}.crop-editor__actions[data-v-ec2eb68c]{padding:var(--space-4);justify-content:center;display:flex;position:absolute;bottom:0;left:0;right:0}.crop-editor__use-btn[data-v-ec2eb68c]{width:100%;max-width:320px}.sticker-tray__cats[data-v-7eada75b]{gap:var(--space-2);padding-bottom:var(--space-3);scrollbar-width:none;display:flex;overflow-x:auto}.sticker-tray__cats[data-v-7eada75b]::-webkit-scrollbar{display:none}.sticker-tray__cat[data-v-7eada75b]{border:1.5px solid var(--color-border);font-size:var(--text-sm);white-space:nowrap;cursor:pointer;color:var(--color-text-muted);transition:all var(--duration-fast);background:0 0;border-radius:999px;padding:6px 14px;font-weight:600}.sticker-tray__cat--active[data-v-7eada75b]{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-primary-fg)}.sticker-tray__grid[data-v-7eada75b]{gap:var(--space-2);grid-template-columns:repeat(5,1fr);display:grid}.sticker-tray__item[data-v-7eada75b]{padding:var(--space-2) var(--space-1);border-radius:var(--radius-sm);cursor:pointer;transition:background var(--duration-fast);background:0 0;border:none;flex-direction:column;align-items:center;gap:4px;display:flex}.sticker-tray__item[data-v-7eada75b]:active{background:var(--color-surface-2)}.sticker-tray__emoji[data-v-7eada75b]{font-family:Apple Color Emoji,Segoe UI Emoji,Noto Color Emoji,sans-serif;font-size:36px;line-height:1}.sticker-tray__label[data-v-7eada75b]{color:var(--color-text-muted);text-align:center;font-size:10px;font-weight:600;line-height:1.2}.sticker-canvas[data-v-fb52db70]{background:#111;flex-direction:column;flex:1;align-items:center;min-height:0;display:flex;position:relative;overflow:hidden}.sticker-canvas[data-v-fb52db70] .konvajs-content{flex-shrink:0}.sticker-canvas__delete[data-v-fb52db70]{top:var(--space-3);right:var(--space-3);cursor:pointer;color:#fff;z-index:10;background:#c81e1ed9;border:none;border-radius:50%;justify-content:center;align-items:center;width:36px;height:36px;display:flex;position:absolute}.sticker-canvas__bar[data-v-fb52db70]{align-items:center;gap:var(--space-3);height:72px;padding:0 var(--space-4);background:var(--color-surface);border-top:1px solid var(--color-border);display:flex;position:absolute;bottom:0;left:0;right:0}.sticker-canvas__add-btn[data-v-fb52db70]{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);border:1.5px solid var(--color-border);color:var(--color-text);font-size:var(--text-sm);cursor:pointer;white-space:nowrap;background:0 0;font-weight:600;display:flex}.sticker-canvas__next-btn[data-v-fb52db70]{min-width:96px;margin-left:auto}.upload-view[data-v-fca2e263]{z-index:100;background:var(--color-bg);flex-direction:column;display:flex;position:fixed;inset:0}.upload-view__header[data-v-fca2e263]{height:56px;padding:0 var(--space-4);background:var(--color-surface);border-bottom:1px solid var(--color-border);flex-shrink:0;align-items:center;display:flex;position:relative}.upload-view__back[data-v-fca2e263]{cursor:pointer;width:40px;height:40px;color:var(--color-text);background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;margin-left:-8px;display:flex}.upload-view__step-label[data-v-fca2e263]{font-size:var(--text-base);color:var(--color-text);font-weight:700;position:absolute;left:50%;transform:translate(-50%)}.upload-view__skip[data-v-fca2e263]{font-size:var(--text-sm);color:var(--color-text-muted);cursor:pointer;padding:var(--space-2) 0;background:0 0;border:none;margin-left:auto;font-weight:600}.upload-view__stage[data-v-fca2e263]{flex:1;min-height:0}.upload-view__done[data-v-fca2e263]{justify-content:center;align-items:center;gap:var(--space-4);padding:var(--space-6) var(--space-5);text-align:center;flex-direction:column;flex:1;display:flex}.upload-view__done-icon[data-v-fca2e263]{font-family:Apple Color Emoji,Segoe UI Emoji,Noto Color Emoji,sans-serif;font-size:64px;line-height:1}.upload-view__done-title[data-v-fca2e263]{font-size:var(--text-xl);font-weight:700}.upload-view__done-sub[data-v-fca2e263]{font-size:var(--text-sm);color:var(--color-text-muted);max-width:260px;line-height:1.5}.upload-view__done-btn[data-v-fca2e263]{width:100%;max-width:320px} diff --git a/public/build/assets/UploadView-D4bnhltO.js b/public/build/assets/UploadView-D4bnhltO.js new file mode 100644 index 0000000..a9fa6f2 --- /dev/null +++ b/public/build/assets/UploadView-D4bnhltO.js @@ -0,0 +1 @@ +import{E as e,H as t,K as n,N as r,R as i,T as a,_ as o,d as s,dt as c,f as l,g as u,j as d,k as f,l as p,o as m,p as h,pt as g,t as _,u as v,v as y,w as b,z as x}from"./_plugin-vue_export-helper-DVo1OUMD.js";import{a as S,i as C,s as w}from"./index-CmXd-se5.js";import{i as T,n as E,r as D,t as O}from"./BaseBottomSheet-cgSeW-RK.js";import{t as k}from"./DevicePicker-DreFDlLU.js";var A={class:`crop-editor__top`},j={key:0,class:`crop-editor__label`},M={class:`crop-editor__orient`,role:`radiogroup`,"aria-label":`Crop orientation`},N=[`aria-checked`,`aria-label`,`onClick`],P={width:`20`,height:`20`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"aria-hidden":`true`},ee={key:0,x:`2`,y:`6`,width:`20`,height:`12`,rx:`1.5`},te={key:1,x:`6`,y:`2`,width:`12`,height:`20`,rx:`1.5`},ne={key:1,class:`crop-editor__mismatch`,role:`status`},F={class:`crop-editor__actions`},I=_(y({__name:`CropEditor`,props:{src:{},orientation:{},deviceName:{},initialParams:{},initialOrientation:{}},emits:[`crop`],setup(n,{emit:r}){let s=n,_=r,y=[{value:`landscape`,label:`Landscape crop`},{value:`portrait`,label:`Portrait crop`}],b=t(s.initialOrientation??s.orientation),S=p(()=>b.value===`landscape`?{w:1600,h:960}:{w:960,h:1600}),C=p(()=>S.value.w/S.value.h),w=p(()=>b.value!==s.orientation),T=t(),D=t(),O=null,k=null,I=0,L=t(0),R=t(0),z=t(1),B={x:0,y:0,w:0,h:0},V=1;function re(e){b.value!==e&&(b.value=e,L.value=0,R.value=0,z.value=1,H())}function H(){let e=D.value,t=T.value;if(!e||!t)return;let n=t.getBoundingClientRect(),r=n.height-80,i=n.width;e.width=i,e.height=r,O=e.getContext(`2d`);let a=i-48,o=r-48,s,c;a/o>C.value?(c=o,s=c*C.value):(s=a,c=s/C.value),B={x:(i-s)/2,y:(r-c)/2,w:s,h:c},k&&U()}function U(){k&&(V=Math.max(B.w/k.naturalWidth,B.h/k.naturalHeight),s.initialParams?W(s.initialParams):(z.value=1,L.value=0,R.value=0,K()))}function W(e){if(!k)return;let t=B.w/e.natW;z.value=t/V,L.value=t*(k.naturalWidth/2-e.natX-e.natW/2),R.value=t*(k.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(!k)return[e,t];let n=V*z.value,r=k.naturalWidth*n,i=k.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(!O||!k||!D.value)return;let{width:e,height:t}=D.value,n=V*z.value,r=k.naturalWidth*n,i=k.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;O.clearRect(0,0,e,t),O.drawImage(k,s,c,r,i),O.save(),O.fillStyle=`rgba(0,0,0,0.55)`,O.fillRect(0,0,e,t),O.globalCompositeOperation=`destination-out`,O.fillRect(B.x,B.y,B.w,B.h),O.restore(),O.strokeStyle=`#fff`,O.lineWidth=2,O.strokeRect(B.x,B.y,B.w,B.h),O.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])=>{O.beginPath(),O.moveTo(e+n,t+r),O.lineTo(e,t),O.lineTo(e+i,t+a),O.stroke()})}let q=new Map,J=0;function Y(e){if(D.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(!k)return;let e=V*z.value,t=B.x+B.w/2+L.value,n=B.y+B.h/2+R.value,r=t-k.naturalWidth*e/2,i=n-k.naturalHeight*e/2,a=(B.x-r)/e,o=(B.y-i)/e,s=B.w/e,c=B.h/e,{w:l,h:u}=S.value,d=new OffscreenCanvas(l,u);d.getContext(`2d`).drawImage(k,a,o,s,c,0,0,l,u),_(`crop`,{blob:await d.convertToBlob({type:`image/jpeg`,quality:.92}),params:{natX:a,natY:o,natW:s,natH:c},orientation:b.value})}let $=new ResizeObserver(H);return e(()=>{T.value&&$.observe(T.value),H(),k=new Image,k.onload=()=>{H(),U()},k.src=s.src}),i(()=>s.src,e=>{k&&(k.onload=()=>U(),k.src=e)}),a(()=>{$.disconnect(),cancelAnimationFrame(I)}),(e,t)=>(f(),h(`div`,{class:`crop-editor`,ref_key:`containerRef`,ref:T},[v(`canvas`,{ref_key:`canvasRef`,ref:D,class:`crop-editor__canvas`,onPointerdown:Y,onPointermove:X,onPointerup:Z,onPointercancel:Z},null,544),v(`div`,A,[n.deviceName?(f(),h(`div`,j,g(n.deviceName),1)):l(``,!0),v(`div`,M,[(f(),h(m,null,d(y,e=>v(`button`,{key:e.value,type:`button`,role:`radio`,"aria-checked":b.value===e.value,"aria-label":e.label,class:c([`crop-editor__orient-btn`,{"crop-editor__orient-btn--active":b.value===e.value}]),onClick:t=>re(e.value)},[(f(),h(`svg`,P,[e.value===`landscape`?(f(),h(`rect`,ee)):(f(),h(`rect`,te))]))],10,N)),64))]),w.value?(f(),h(`div`,ne,[t[0]||=v(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"aria-hidden":`true`},[v(`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`}),v(`line`,{x1:`12`,y1:`9`,x2:`12`,y2:`13`}),v(`line`,{x1:`12`,y1:`17`,x2:`12.01`,y2:`17`})],-1),v(`span`,null,`Frame is set to `+g(n.orientation)+`. Switch the frame in Settings to display this crop.`,1)])):l(``,!0)]),v(`div`,F,[o(E,{variant:`primary`,class:`crop-editor__use-btn`,onClick:ie},{default:x(()=>[...t[1]||=[u(` 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=_(y({__name:`StickerTray`,props:{modelValue:{type:Boolean}},emits:[`update:modelValue`,`pick`],setup(e){let r=t(`seasonal`),i=p(()=>R.filter(e=>e.category===r.value));return(t,a)=>(f(),s(O,{"model-value":e.modelValue,label:`Add sticker`,"onUpdate:modelValue":a[0]||=e=>t.$emit(`update:modelValue`,e)},{default:x(()=>[v(`div`,z,[v(`div`,B,[(f(!0),h(m,null,d(n(L),e=>(f(),h(`button`,{key:e.id,type:`button`,role:`tab`,class:c([`sticker-tray__cat`,{"sticker-tray__cat--active":r.value===e.id}]),onClick:t=>r.value=e.id},g(e.label),11,V))),128))]),v(`div`,re,[(f(!0),h(m,null,d(i.value,e=>(f(),h(`button`,{key:e.id,type:`button`,class:`sticker-tray__item`,"aria-label":e.label,onClick:n=>t.$emit(`pick`,e.id)},[v(`span`,U,g(e.emoji),1),v(`span`,W,g(e.label),1)],8,H))),128))])])]),_:1},8,[`model-value`]))}}),[[`__scopeId`,`data-v-7eada75b`]]),K={class:`sticker-canvas__bar`},q=52,J=_(y({__name:`StickerCanvas`,props:{croppedUrl:{},orientation:{},stickers:{}},emits:[`add-sticker`,`update-sticker`,`remove-sticker`,`done`],setup(n,{emit:c}){let g=n,_=c,y=t(),S=t(),C=t(),w=t(),T=t(!1),D=t(null),O=t(375),k=t(225),A=g.orientation===`landscape`?1600/960:960/1600;function j(){if(!y.value)return;let{width:e,height:t}=y.value.getBoundingClientRect(),n=t-72;e/n>A?(k.value=n,O.value=n*A):(O.value=e,k.value=e/A),P()}let M=new ResizeObserver(j);e(()=>{y.value&&M.observe(y.value),j(),Q()}),a(()=>{M.disconnect(),ie()});let N=t(null);function P(){let e=new Image;e.onload=()=>{N.value=e},e.src=g.croppedUrl}i(()=>g.croppedUrl,()=>P(),{immediate:!0});let ee=p(()=>({width:O.value,height:k.value})),te=p(()=>({image:N.value,x:0,y:0,width:O.value,height:k.value})),ne={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 F(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(e,t){t.cancelBubble=!0,D.value=e,b(()=>{let t=(w.value?.getNode())?.findOne(`#${e}`),n=C.value?.getNode();t&&n&&n.nodes([t])})}function z(e){e.target===e.target.getStage()&&(D.value=null,C.value?.getNode()?.nodes([]))}function B(){D.value&&(_(`remove-sticker`,D.value),D.value=null,C.value?.getNode()?.nodes([]))}function V(e,t){_(`update-sticker`,e,{x:t.target.x(),y:t.target.y()})}function re(e,t){_(`update-sticker`,e,{x:t.target.x(),y:t.target.y(),scale:t.target.scaleX(),rotation:t.target.rotation()})}function H(e){let t={id:`${e}-${Date.now()}`,type:e,x:O.value/2,y:k.value/2,scale:1,rotation:0};_(`add-sticker`,t),T.value=!1,b(()=>L(t.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||!D.value||(U=J(e.touches),W=g.stickers.find(e=>e.id===D.value)?.scale??1)}function X(e){if(e.touches.length!==2||!D.value||U===0)return;e.preventDefault();let t=Math.max(.2,Math.min(6,W*(J(e.touches)/U)));_(`update-sticker`,D.value,{scale:t})}function Z(){U=0,W=1}function Q(){let e=y.value;e&&(e.addEventListener(`touchstart`,Y,{passive:!0}),e.addEventListener(`touchmove`,X,{passive:!1}),e.addEventListener(`touchend`,Z,{passive:!0}))}function ie(){let e=y.value;e&&(e.removeEventListener(`touchstart`,Y),e.removeEventListener(`touchmove`,X),e.removeEventListener(`touchend`,Z))}async function $(){D.value=null,C.value?.getNode()?.nodes([]),await b();let e=S.value?.getNode();if(!e)return;let t=(g.orientation===`landscape`?1600:960)/O.value,n=await e.toBlob({pixelRatio:t,mimeType:`image/jpeg`,quality:.92});n&&_(`done`,n)}return(e,t)=>{let i=r(`v-image`),a=r(`v-layer`),c=r(`v-text`),p=r(`v-transformer`),g=r(`v-stage`);return f(),h(`div`,{class:`sticker-canvas`,ref_key:`containerRef`,ref:y},[o(g,{ref_key:`stageRef`,ref:S,config:ee.value,onClick:z,onTap:z},{default:x(()=>[o(a,null,{default:x(()=>[o(i,{config:te.value},null,8,[`config`])]),_:1}),o(a,{ref_key:`stickerLayerRef`,ref:w},{default:x(()=>[(f(!0),h(m,null,d(n.stickers,e=>(f(),s(c,{key:e.id,config:F(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)),o(p,{ref_key:`transformerRef`,ref:C,config:ne},null,512)]),_:1},512)]),_:1},8,[`config`]),D.value?(f(),h(`button`,{key:0,class:`sticker-canvas__delete`,type:`button`,"aria-label":`Remove sticker`,onClick:B},[...t[2]||=[v(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"aria-hidden":`true`},[v(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),v(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})],-1)]])):l(``,!0),v(`div`,K,[v(`button`,{class:`sticker-canvas__add-btn`,type:`button`,onClick:t[0]||=e=>T.value=!0},[...t[3]||=[v(`svg`,{width:`20`,height:`20`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"aria-hidden":`true`},[v(`circle`,{cx:`12`,cy:`12`,r:`10`}),v(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`16`}),v(`line`,{x1:`8`,y1:`12`,x2:`16`,y2:`12`})],-1),u(` Add sticker `,-1)]]),o(E,{variant:`primary`,class:`sticker-canvas__next-btn`,onClick:$},{default:x(()=>[...t[4]||=[u(`Next`,-1)]]),_:1})]),o(G,{modelValue:T.value,"onUpdate:modelValue":t[1]||=e=>T.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=_(y({__name:`UploadView`,setup(r){let i=w(),a=D(),c=T(),d=S(),m=C(),_=t(`crop`),y=t(!1),b=t(!1),O=null,A=p(()=>a.editingImageId!==null);e(async()=>{if(await c.fetchDevices(),!a.originalFile){i.replace(`/`);return}_.value=`crop`});let j=p(()=>a.contextDeviceId?c.devices.find(e=>e.id===a.contextDeviceId):c.devices[0]),M=p(()=>j.value?.orientation??`landscape`),N=p(()=>j.value?.name),P=p(()=>_.value===`crop`?A.value?`Edit crop`:`Crop photo`:_.value===`stickers`?`Add stickers`:A.value?`Updated`:`Added`);function ee({blob:e,params:t,orientation:n}){a.setCrop(e,t,n),_.value=`stickers`}function te(){a.croppedBlob&&(O=a.croppedBlob,A.value?L():b.value=!0)}function ne(e){O=e,A.value?L():b.value=!0}function F(){if(_.value===`crop`){a.cleanup(),i.replace(`/library`);return}_.value===`stickers`&&(_.value=`crop`)}async function L(){if(O){y.value=!0;try{let e=new File([O],`photo.jpg`,{type:`image/jpeg`});if(A.value){await d.reprocessImage(a.editingImageId,e,{cropParams:a.cropParams??void 0,stickerState:a.stickers,cropOrientation:a.cropOrientation??void 0}),b.value=!1,_.value=`done`;return}let t=await d.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=>d.setApproval(t.id,e,!0))),b.value=!1,_.value=`done`}catch(e){m.show(e instanceof Error?e.message:`Upload failed`,`error`)}finally{y.value=!1}}}function R(){a.cleanup(),i.replace(`/library`)}return(e,t)=>(f(),h(`div`,Y,[v(`header`,X,[_.value===`done`?l(``,!0):(f(),h(`button`,{key:0,class:`upload-view__back`,type:`button`,"aria-label":_.value===`crop`?`Cancel`:`Back`,onClick:F},[_.value===`crop`?(f(),h(`svg`,Q,[...t[2]||=[v(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`},null,-1),v(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`},null,-1)]])):(f(),h(`svg`,ie,[...t[3]||=[v(`polyline`,{points:`15 18 9 12 15 6`},null,-1)]]))],8,Z)),v(`span`,$,g(P.value),1),_.value===`stickers`?(f(),h(`button`,{key:1,class:`upload-view__skip`,type:`button`,onClick:te},`Skip`)):l(``,!0)]),_.value===`crop`&&n(a).originalUrl?(f(),s(I,{key:0,src:n(a).originalUrl,orientation:M.value,"device-name":N.value,"initial-params":n(a).cropParams,"initial-orientation":n(a).cropOrientation,class:`upload-view__stage`,onCrop:ee},null,8,[`src`,`orientation`,`device-name`,`initial-params`,`initial-orientation`])):_.value===`stickers`&&n(a).croppedUrl?(f(),s(J,{key:1,"cropped-url":n(a).croppedUrl,orientation:M.value,stickers:n(a).stickers,class:`upload-view__stage`,onAddSticker:n(a).addSticker,onUpdateSticker:n(a).updateSticker,onRemoveSticker:n(a).removeSticker,onDone:ne},null,8,[`cropped-url`,`orientation`,`stickers`,`onAddSticker`,`onUpdateSticker`,`onRemoveSticker`])):_.value===`done`?(f(),h(`div`,ae,[t[5]||=v(`div`,{class:`upload-view__done-icon`,"aria-hidden":`true`},`🎉`,-1),v(`p`,oe,g(A.value?`Photo updated!`:`Photo added!`),1),t[6]||=v(`p`,{class:`upload-view__done-sub`},`It'll appear on your frame at the next update.`,-1),o(E,{variant:`primary`,class:`upload-view__done-btn`,onClick:R},{default:x(()=>[...t[4]||=[u(`Done`,-1)]]),_:1})])):l(``,!0),A.value?l(``,!0):(f(),s(k,{key:3,modelValue:b.value,"onUpdate:modelValue":t[0]||=e=>b.value=e,devices:n(c).devices,selected:n(a).selectedDeviceIds,uploading:y.value,"onUpdate:selected":t[1]||=e=>n(a).selectedDeviceIds=e,onConfirm:L},null,8,[`modelValue`,`devices`,`selected`,`uploading`]))]))}}),[[`__scopeId`,`data-v-7bbd1577`]]);export{se as default}; \ No newline at end of file diff --git a/public/build/assets/UploadView-Uqz760jq.js b/public/build/assets/UploadView-Uqz760jq.js deleted file mode 100644 index ac3fb14..0000000 --- a/public/build/assets/UploadView-Uqz760jq.js +++ /dev/null @@ -1 +0,0 @@ -import{E as e,H as t,K as n,N as r,R as i,T as a,_ as o,d as s,dt as c,f as l,g as u,j as d,k as f,l as p,o as m,p as h,pt as g,t as _,u as v,v as y,w as b,z as x}from"./_plugin-vue_export-helper-DVo1OUMD.js";import{a as S,i as C,s as w}from"./index-C0Yc8pEe.js";import{i as T,n as E,r as D,t as O}from"./BaseBottomSheet-BODCttr7.js";import{t as k}from"./DevicePicker-Dz05cPit.js";var A={key:0,class:`crop-editor__label`},j={class:`crop-editor__actions`},M=_(y({__name:`CropEditor`,props:{src:{},orientation:{},deviceName:{},initialParams:{}},emits:[`crop`],setup(n,{emit:r}){let s=n,c=r,d=s.orientation===`landscape`?1600:960,p=s.orientation===`landscape`?960:1600,m=d/p,_=t(),y=t(),b=null,S=null,C=0,w=t(0),T=t(0),D=t(1),O={x:0,y:0,w:0,h:0},k=1;function M(){let e=y.value,t=_.value;if(!e||!t)return;let n=t.getBoundingClientRect(),r=n.height-80,i=n.width;e.width=i,e.height=r,b=e.getContext(`2d`);let a=i-48,o=r-48,s,c;a/o>m?(c=o,s=c*m):(s=a,c=s/m),O={x:(i-s)/2,y:(r-c)/2,w:s,h:c},S&&N()}function N(){S&&(k=Math.max(O.w/S.naturalWidth,O.h/S.naturalHeight),s.initialParams?P(s.initialParams):(D.value=1,w.value=0,T.value=0,I()))}function P(e){if(!S)return;let t=O.w/e.natW;D.value=t/k,w.value=t*(S.naturalWidth/2-e.natX-e.natW/2),T.value=t*(S.naturalHeight/2-e.natY-e.natH/2);let[n,r]=F(w.value,T.value);w.value=n,T.value=r,I()}function F(e,t){if(!S)return[e,t];let n=k*D.value,r=S.naturalWidth*n,i=S.naturalHeight*n,a=(r-O.w)/2,o=(i-O.h)/2;return[Math.max(-a,Math.min(a,e)),Math.max(-o,Math.min(o,t))]}function I(){if(!b||!S||!y.value)return;let{width:e,height:t}=y.value,n=k*D.value,r=S.naturalWidth*n,i=S.naturalHeight*n,a=O.x+O.w/2+w.value,o=O.y+O.h/2+T.value,s=a-r/2,c=o-i/2;b.clearRect(0,0,e,t),b.drawImage(S,s,c,r,i),b.save(),b.fillStyle=`rgba(0,0,0,0.55)`,b.fillRect(0,0,e,t),b.globalCompositeOperation=`destination-out`,b.fillRect(O.x,O.y,O.w,O.h),b.restore(),b.strokeStyle=`#fff`,b.lineWidth=2,b.strokeRect(O.x,O.y,O.w,O.h),b.lineWidth=3,[[O.x,O.y,20,0,0,20],[O.x+O.w,O.y,-20,0,0,20],[O.x,O.y+O.h,20,0,0,-20],[O.x+O.w,O.y+O.h,-20,0,0,-20]].forEach(([e,t,n,r,i,a])=>{b.beginPath(),b.moveTo(e+n,t+r),b.lineTo(e,t),b.lineTo(e+i,t+a),b.stroke()})}let L=new Map,R=0;function z(e){if(y.value?.setPointerCapture(e.pointerId),L.set(e.pointerId,{x:e.clientX,y:e.clientY}),L.size===2){let e=[...L.values()];R=Math.hypot(e[1].x-e[0].x,e[1].y-e[0].y)}}function B(e){if(!L.has(e.pointerId))return;let t=L.get(e.pointerId);if(L.set(e.pointerId,{x:e.clientX,y:e.clientY}),L.size===1){let n=e.clientX-t.x,r=e.clientY-t.y,[i,a]=F(w.value+n,T.value+r);w.value=i,T.value=a,H();return}if(L.size===2){let e=[...L.values()],t=Math.hypot(e[1].x-e[0].x,e[1].y-e[0].y);if(R>0){let e=t/R;D.value=Math.max(1,D.value*e);let[n,r]=F(w.value,T.value);w.value=n,T.value=r,H()}R=t}}function V(e){L.delete(e.pointerId),R=0}function H(){cancelAnimationFrame(C),C=requestAnimationFrame(I)}async function U(){if(!S)return;let e=k*D.value,t=O.x+O.w/2+w.value,n=O.y+O.h/2+T.value,r=t-S.naturalWidth*e/2,i=n-S.naturalHeight*e/2,a=(O.x-r)/e,o=(O.y-i)/e,s=O.w/e,l=O.h/e,u=new OffscreenCanvas(d,p);u.getContext(`2d`).drawImage(S,a,o,s,l,0,0,d,p),c(`crop`,{blob:await u.convertToBlob({type:`image/jpeg`,quality:.92}),params:{natX:a,natY:o,natW:s,natH:l}})}let W=new ResizeObserver(M);return e(()=>{_.value&&W.observe(_.value),M(),S=new Image,S.onload=()=>{M(),N()},S.src=s.src}),i(()=>s.src,e=>{S&&(S.onload=()=>N(),S.src=e)}),a(()=>{W.disconnect(),cancelAnimationFrame(C)}),(e,t)=>(f(),h(`div`,{class:`crop-editor`,ref_key:`containerRef`,ref:_},[v(`canvas`,{ref_key:`canvasRef`,ref:y,class:`crop-editor__canvas`,onPointerdown:z,onPointermove:B,onPointerup:V,onPointercancel:V},null,544),n.deviceName?(f(),h(`div`,A,g(n.deviceName),1)):l(``,!0),v(`div`,j,[o(E,{variant:`primary`,class:`crop-editor__use-btn`,onClick:U},{default:x(()=>[...t[0]||=[u(` Use this crop `,-1)]]),_:1})])],512))}}),[[`__scopeId`,`data-v-ec2eb68c`]]),N=[{id:`seasonal`,label:`Seasonal`},{id:`holidays`,label:`Holidays`},{id:`fun`,label:`Fun`},{id:`family`,label:`Family`},{id:`nature`,label:`Nature`}],P=[{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:`🌙`}],F={class:`sticker-tray`},I={class:`sticker-tray__cats`,role:`tablist`},L=[`onClick`],R={class:`sticker-tray__grid`,role:`tabpanel`},z=[`aria-label`,`onClick`],B={class:`sticker-tray__emoji`,"aria-hidden":`true`},V={class:`sticker-tray__label`},H=_(y({__name:`StickerTray`,props:{modelValue:{type:Boolean}},emits:[`update:modelValue`,`pick`],setup(e){let r=t(`seasonal`),i=p(()=>P.filter(e=>e.category===r.value));return(t,a)=>(f(),s(O,{"model-value":e.modelValue,label:`Add sticker`,"onUpdate:modelValue":a[0]||=e=>t.$emit(`update:modelValue`,e)},{default:x(()=>[v(`div`,F,[v(`div`,I,[(f(!0),h(m,null,d(n(N),e=>(f(),h(`button`,{key:e.id,type:`button`,role:`tab`,class:c([`sticker-tray__cat`,{"sticker-tray__cat--active":r.value===e.id}]),onClick:t=>r.value=e.id},g(e.label),11,L))),128))]),v(`div`,R,[(f(!0),h(m,null,d(i.value,e=>(f(),h(`button`,{key:e.id,type:`button`,class:`sticker-tray__item`,"aria-label":e.label,onClick:n=>t.$emit(`pick`,e.id)},[v(`span`,B,g(e.emoji),1),v(`span`,V,g(e.label),1)],8,z))),128))])])]),_:1},8,[`model-value`]))}}),[[`__scopeId`,`data-v-7eada75b`]]),U={class:`sticker-canvas__bar`},W=52,G=_(y({__name:`StickerCanvas`,props:{croppedUrl:{},orientation:{},stickers:{}},emits:[`add-sticker`,`update-sticker`,`remove-sticker`,`done`],setup(n,{emit:c}){let g=n,_=c,y=t(),S=t(),C=t(),w=t(),T=t(!1),D=t(null),O=t(375),k=t(225),A=g.orientation===`landscape`?1600/960:960/1600;function j(){if(!y.value)return;let{width:e,height:t}=y.value.getBoundingClientRect(),n=t-72;e/n>A?(k.value=n,O.value=n*A):(O.value=e,k.value=e/A),F()}let M=new ResizeObserver(j);e(()=>{y.value&&M.observe(y.value),j(),ne()}),a(()=>{M.disconnect(),re()});let N=t(null);function F(){let e=new Image;e.onload=()=>{N.value=e},e.src=g.croppedUrl}i(()=>g.croppedUrl,()=>F(),{immediate:!0});let I=p(()=>({width:O.value,height:k.value})),L=p(()=>({image:N.value,x:0,y:0,width:O.value,height:k.value})),R={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 z(e){return{id:e.id,text:B(e.type),fontSize:W,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:W/2,offsetY:W/2}}function B(e){return P.find(t=>t.id===e)?.emoji??`⭐`}function V(e,t){t.cancelBubble=!0,D.value=e,b(()=>{let t=(w.value?.getNode())?.findOne(`#${e}`),n=C.value?.getNode();t&&n&&n.nodes([t])})}function G(e){e.target===e.target.getStage()&&(D.value=null,C.value?.getNode()?.nodes([]))}function K(){D.value&&(_(`remove-sticker`,D.value),D.value=null,C.value?.getNode()?.nodes([]))}function q(e,t){_(`update-sticker`,e,{x:t.target.x(),y:t.target.y()})}function J(e,t){_(`update-sticker`,e,{x:t.target.x(),y:t.target.y(),scale:t.target.scaleX(),rotation:t.target.rotation()})}function ee(e){let t={id:`${e}-${Date.now()}`,type:e,x:O.value/2,y:k.value/2,scale:1,rotation:0};_(`add-sticker`,t),T.value=!1,b(()=>V(t.id,{cancelBubble:!1}))}let Y=0,X=1;function Z(e){let t=e[0].clientX-e[1].clientX,n=e[0].clientY-e[1].clientY;return Math.hypot(t,n)}function Q(e){e.touches.length!==2||!D.value||(Y=Z(e.touches),X=g.stickers.find(e=>e.id===D.value)?.scale??1)}function $(e){if(e.touches.length!==2||!D.value||Y===0)return;e.preventDefault();let t=Math.max(.2,Math.min(6,X*(Z(e.touches)/Y)));_(`update-sticker`,D.value,{scale:t})}function te(){Y=0,X=1}function ne(){let e=y.value;e&&(e.addEventListener(`touchstart`,Q,{passive:!0}),e.addEventListener(`touchmove`,$,{passive:!1}),e.addEventListener(`touchend`,te,{passive:!0}))}function re(){let e=y.value;e&&(e.removeEventListener(`touchstart`,Q),e.removeEventListener(`touchmove`,$),e.removeEventListener(`touchend`,te))}async function ie(){D.value=null,C.value?.getNode()?.nodes([]),await b();let e=S.value?.getNode();if(!e)return;let t=(g.orientation===`landscape`?1600:960)/O.value,n=await e.toBlob({pixelRatio:t,mimeType:`image/jpeg`,quality:.92});n&&_(`done`,n)}return(e,t)=>{let i=r(`v-image`),a=r(`v-layer`),c=r(`v-text`),p=r(`v-transformer`),g=r(`v-stage`);return f(),h(`div`,{class:`sticker-canvas`,ref_key:`containerRef`,ref:y},[o(g,{ref_key:`stageRef`,ref:S,config:I.value,onClick:G,onTap:G},{default:x(()=>[o(a,null,{default:x(()=>[o(i,{config:L.value},null,8,[`config`])]),_:1}),o(a,{ref_key:`stickerLayerRef`,ref:w},{default:x(()=>[(f(!0),h(m,null,d(n.stickers,e=>(f(),s(c,{key:e.id,config:z(e),onClick:t=>V(e.id,t),onTap:t=>V(e.id,t),onDragend:t=>q(e.id,t),onTransformend:t=>J(e.id,t)},null,8,[`config`,`onClick`,`onTap`,`onDragend`,`onTransformend`]))),128)),o(p,{ref_key:`transformerRef`,ref:C,config:R},null,512)]),_:1},512)]),_:1},8,[`config`]),D.value?(f(),h(`button`,{key:0,class:`sticker-canvas__delete`,type:`button`,"aria-label":`Remove sticker`,onClick:K},[...t[2]||=[v(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"aria-hidden":`true`},[v(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),v(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})],-1)]])):l(``,!0),v(`div`,U,[v(`button`,{class:`sticker-canvas__add-btn`,type:`button`,onClick:t[0]||=e=>T.value=!0},[...t[3]||=[v(`svg`,{width:`20`,height:`20`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"aria-hidden":`true`},[v(`circle`,{cx:`12`,cy:`12`,r:`10`}),v(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`16`}),v(`line`,{x1:`8`,y1:`12`,x2:`16`,y2:`12`})],-1),u(` Add sticker `,-1)]]),o(E,{variant:`primary`,class:`sticker-canvas__next-btn`,onClick:ie},{default:x(()=>[...t[4]||=[u(`Next`,-1)]]),_:1})]),o(H,{modelValue:T.value,"onUpdate:modelValue":t[1]||=e=>T.value=e,onPick:ee},null,8,[`modelValue`])],512)}}}),[[`__scopeId`,`data-v-fb52db70`]]),K={class:`upload-view`},q={class:`upload-view__header`},J=[`aria-label`],ee={key:0,width:`20`,height:`20`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"aria-hidden":`true`},Y={key:1,width:`20`,height:`20`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"aria-hidden":`true`},X={class:`upload-view__step-label`},Z={key:2,class:`upload-view__done`},Q={class:`upload-view__done-title`},$=_(y({__name:`UploadView`,setup(r){let i=w(),a=D(),c=T(),d=S(),m=C(),_=t(`crop`),y=t(!1),b=t(!1),O=null,A=p(()=>a.editingImageId!==null);e(async()=>{if(await c.fetchDevices(),!a.originalFile){i.replace(`/`);return}_.value=`crop`});let j=p(()=>a.contextDeviceId?c.devices.find(e=>e.id===a.contextDeviceId):c.devices[0]),N=p(()=>j.value?.orientation??`landscape`),P=p(()=>j.value?.name),F=p(()=>_.value===`crop`?A.value?`Edit crop`:`Crop photo`:_.value===`stickers`?`Add stickers`:A.value?`Updated`:`Added`);function I({blob:e,params:t}){a.setCrop(e,t),_.value=`stickers`}function L(){a.croppedBlob&&(O=a.croppedBlob,A.value?B():b.value=!0)}function R(e){O=e,A.value?B():b.value=!0}function z(){if(_.value===`crop`){a.cleanup(),i.replace(`/library`);return}_.value===`stickers`&&(_.value=`crop`)}async function B(){if(O){y.value=!0;try{let e=new File([O],`photo.jpg`,{type:`image/jpeg`});if(A.value){await d.reprocessImage(a.editingImageId,e,{cropParams:a.cropParams??void 0,stickerState:a.stickers}),b.value=!1,_.value=`done`;return}let t=await d.uploadImage(e,{original:a.originalFile??void 0,cropParams:a.cropParams??void 0,stickerState:a.stickers});await Promise.all(a.selectedDeviceIds.map(e=>d.setApproval(t.id,e,!0))),b.value=!1,_.value=`done`}catch(e){m.show(e instanceof Error?e.message:`Upload failed`,`error`)}finally{y.value=!1}}}function V(){a.cleanup(),i.replace(`/library`)}return(e,t)=>(f(),h(`div`,K,[v(`header`,q,[_.value===`done`?l(``,!0):(f(),h(`button`,{key:0,class:`upload-view__back`,type:`button`,"aria-label":_.value===`crop`?`Cancel`:`Back`,onClick:z},[_.value===`crop`?(f(),h(`svg`,ee,[...t[2]||=[v(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`},null,-1),v(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`},null,-1)]])):(f(),h(`svg`,Y,[...t[3]||=[v(`polyline`,{points:`15 18 9 12 15 6`},null,-1)]]))],8,J)),v(`span`,X,g(F.value),1),_.value===`stickers`?(f(),h(`button`,{key:1,class:`upload-view__skip`,type:`button`,onClick:L},`Skip`)):l(``,!0)]),_.value===`crop`&&n(a).originalUrl?(f(),s(M,{key:0,src:n(a).originalUrl,orientation:N.value,"device-name":P.value,"initial-params":n(a).cropParams,class:`upload-view__stage`,onCrop:I},null,8,[`src`,`orientation`,`device-name`,`initial-params`])):_.value===`stickers`&&n(a).croppedUrl?(f(),s(G,{key:1,"cropped-url":n(a).croppedUrl,orientation:N.value,stickers:n(a).stickers,class:`upload-view__stage`,onAddSticker:n(a).addSticker,onUpdateSticker:n(a).updateSticker,onRemoveSticker:n(a).removeSticker,onDone:R},null,8,[`cropped-url`,`orientation`,`stickers`,`onAddSticker`,`onUpdateSticker`,`onRemoveSticker`])):_.value===`done`?(f(),h(`div`,Z,[t[5]||=v(`div`,{class:`upload-view__done-icon`,"aria-hidden":`true`},`🎉`,-1),v(`p`,Q,g(A.value?`Photo updated!`:`Photo added!`),1),t[6]||=v(`p`,{class:`upload-view__done-sub`},`It'll appear on your frame at the next update.`,-1),o(E,{variant:`primary`,class:`upload-view__done-btn`,onClick:V},{default:x(()=>[...t[4]||=[u(`Done`,-1)]]),_:1})])):l(``,!0),A.value?l(``,!0):(f(),s(k,{key:3,modelValue:b.value,"onUpdate:modelValue":t[0]||=e=>b.value=e,devices:n(c).devices,selected:n(a).selectedDeviceIds,uploading:y.value,"onUpdate:selected":t[1]||=e=>n(a).selectedDeviceIds=e,onConfirm:B},null,8,[`modelValue`,`devices`,`selected`,`uploading`]))]))}}),[[`__scopeId`,`data-v-fca2e263`]]);export{$ as default}; \ No newline at end of file diff --git a/public/build/assets/index-C0Yc8pEe.js b/public/build/assets/index-CmXd-se5.js similarity index 95% rename from public/build/assets/index-C0Yc8pEe.js rename to public/build/assets/index-CmXd-se5.js index 354ce95..0bb87c2 100644 --- a/public/build/assets/index-C0Yc8pEe.js +++ b/public/build/assets/index-CmXd-se5.js @@ -1,4 +1,4 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/HomeView-Ub9_hNNK.js","assets/_plugin-vue_export-helper-DVo1OUMD.js","assets/BaseBottomSheet-BODCttr7.js","assets/BaseBottomSheet-MPNarQ8K.css","assets/HomeView-B0-v2mFc.css","assets/LibraryView-Cwch0dhw.js","assets/DevicePicker-Dz05cPit.js","assets/DevicePicker-B4xrdE2f.css","assets/LibraryView-25yn4n9v.css","assets/UploadView-Uqz760jq.js","assets/UploadView-CJEQVpkq.css","assets/SettingsView-Dbe21KxS.js","assets/SettingsView-CWIIisVW.css"])))=>i.map(i=>d[i]); +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/HomeView-Bfoik_wA.js","assets/_plugin-vue_export-helper-DVo1OUMD.js","assets/BaseBottomSheet-cgSeW-RK.js","assets/BaseBottomSheet-MPNarQ8K.css","assets/HomeView-B0-v2mFc.css","assets/LibraryView-Cb_nRiKt.js","assets/DevicePicker-DreFDlLU.js","assets/DevicePicker-B4xrdE2f.css","assets/LibraryView-25yn4n9v.css","assets/UploadView-D4bnhltO.js","assets/UploadView-BMrcHXkZ.css","assets/SettingsView-B067l1Rb.js","assets/SettingsView-CWIIisVW.css"])))=>i.map(i=>d[i]); import{$ as e,A as t,D as n,E as r,F as i,G as a,H as o,I as s,J as c,K as l,L as u,N as d,O as f,Q as p,R as m,S as h,T as g,U as _,V as v,W as y,X as b,Y as x,Z as S,_ as C,a as w,at as ee,b as T,c as te,ct as E,d as ne,dt as re,et as D,f as O,g as ie,i as k,it as A,j,k as ae,l as M,lt as oe,m as se,mt as ce,n as le,nt as ue,o as de,ot as N,p as fe,pt as pe,q as me,r as he,rt as ge,st as _e,t as ve,tt as ye,u as be,ut as xe,v as Se,w as Ce,x as we,y as Te,z as Ee}from"./_plugin-vue_export-helper-DVo1OUMD.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var De=void 0,Oe=typeof window<`u`&&window.trustedTypes;if(Oe)try{De=Oe.createPolicy(`vue`,{createHTML:e=>e})}catch{}var ke=De?e=>De.createHTML(e):e=>e,Ae=`http://www.w3.org/2000/svg`,je=`http://www.w3.org/1998/Math/MathML`,Me=typeof document<`u`?document:null,Ne=Me&&Me.createElement(`template`),Pe={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{let i=t===`svg`?Me.createElementNS(Ae,e):t===`mathml`?Me.createElementNS(je,e):n?Me.createElement(e,{is:n}):Me.createElement(e);return e===`select`&&r&&r.multiple!=null&&i.setAttribute(`multiple`,r.multiple),i},createText:e=>Me.createTextNode(e),createComment:e=>Me.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Me.querySelector(e),setScopeId(e,t){e.setAttribute(t,``)},insertStaticContent(e,t,n,r,i,a){let o=n?n.previousSibling:t.lastChild;if(i&&(i===a||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),!(i===a||!(i=i.nextSibling)););else{Ne.innerHTML=ke(r===`svg`?``:r===`mathml`?``:e);let i=Ne.content;if(r===`svg`||r===`mathml`){let e=i.firstChild;for(;e.firstChild;)i.appendChild(e.firstChild);i.removeChild(e)}t.insertBefore(i,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Fe=`transition`,Ie=`animation`,Le=Symbol(`_vtc`),Re={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},ze=x({},w,Re),Be=(e=>(e.displayName=`Transition`,e.props=ze,e))((e,{slots:t})=>we(k,Ue(e),t)),Ve=(t,n=[])=>{e(t)?t.forEach(e=>e(...n)):t&&t(...n)},He=t=>t?e(t)?t.some(e=>e.length>1):t.length>1:!1;function Ue(e){let t={};for(let n in e)n in Re||(t[n]=e[n]);if(e.css===!1)return t;let{name:n=`v`,type:r,duration:i,enterFromClass:a=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:s=`${n}-enter-to`,appearFromClass:c=a,appearActiveClass:l=o,appearToClass:u=s,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:f=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,m=We(i),h=m&&m[0],g=m&&m[1],{onBeforeEnter:_,onEnter:v,onEnterCancelled:y,onLeave:b,onLeaveCancelled:S,onBeforeAppear:C=_,onAppear:w=v,onAppearCancelled:ee=y}=t,T=(e,t,n,r)=>{e._enterCancelled=r,qe(e,t?u:s),qe(e,t?l:o),n&&n()},te=(e,t)=>{e._isLeaving=!1,qe(e,d),qe(e,p),qe(e,f),t&&t()},E=e=>(t,n)=>{let i=e?w:v,o=()=>T(t,e,n);Ve(i,[t,o]),Je(()=>{qe(t,e?c:a),Ke(t,e?u:s),He(i)||Xe(t,r,h,o)})};return x(t,{onBeforeEnter(e){Ve(_,[e]),Ke(e,a),Ke(e,o)},onBeforeAppear(e){Ve(C,[e]),Ke(e,c),Ke(e,l)},onEnter:E(!1),onAppear:E(!0),onLeave(e,t){e._isLeaving=!0;let n=()=>te(e,t);Ke(e,d),e._enterCancelled?(Ke(e,f),et(e)):(et(e),Ke(e,f)),Je(()=>{e._isLeaving&&(qe(e,d),Ke(e,p),He(b)||Xe(e,r,g,n))}),Ve(b,[e,n])},onEnterCancelled(e){T(e,!1,void 0,!0),Ve(y,[e])},onAppearCancelled(e){T(e,!0,void 0,!0),Ve(ee,[e])},onLeaveCancelled(e){te(e),Ve(S,[e])}})}function We(e){if(e==null)return null;if(ue(e))return[Ge(e.enter),Ge(e.leave)];{let t=Ge(e);return[t,t]}}function Ge(e){return ce(e)}function Ke(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.add(t)),(e[Le]||(e[Le]=new Set)).add(t)}function qe(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.remove(t));let n=e[Le];n&&(n.delete(t),n.size||(e[Le]=void 0))}function Je(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}var Ye=0;function Xe(e,t,n,r){let i=e._endId=++Ye,a=()=>{i===e._endId&&r()};if(n!=null)return setTimeout(a,n);let{type:o,timeout:s,propCount:c}=Ze(e,t);if(!o)return r();let l=o+`end`,u=0,d=()=>{e.removeEventListener(l,f),a()},f=t=>{t.target===e&&++u>=c&&d()};setTimeout(()=>{u=r)continue;let i=(n*t+e)*4;a+=o[i+0],s+=o[i+1],c+=o[i+2],l+=o[i+3],m+=1}a/=m,s/=m,c/=m,l/=m;for(let e=u;e =r)continue;let i=(n*t+e)*4;o[i+0]=a,o[i+1]=s,o[i+2]=c,o[i+3]=l}}};z.addGetterSetter(B,`pixelSize`,8,R(),z.afterSetFilter);var fs=function(e){let t=Math.round(this.levels()*254)+1,n=e.data,r=n.length,i=255/t;for(let e=0;e =r)continue;let i=(n*t+e)*4;a+=o[i+0],s+=o[i+1],c+=o[i+2],l+=o[i+3],m+=1}a/=m,s/=m,c/=m,l/=m;for(let e=u;e =r)continue;let i=(n*t+e)*4;o[i+0]=a,o[i+1]=s,o[i+2]=c,o[i+3]=l}}};z.addGetterSetter(B,`pixelSize`,8,R(),z.afterSetFilter);var fs=function(e){let t=Math.round(this.levels()*254)+1,n=e.data,r=n.length,i=255/t;for(let e=0;e