{"version":3,"file":"BWxS5DK5.mjs","sources":["../../../../../../src/lib/components/ProfileImage.svelte"],"sourcesContent":["<script lang=\"ts\">\n  import { env } from '$env/dynamic/public'\n  import { page } from '$app/stores'\n  import type { Portrait } from '$lib/queries/profile'\n\n  export let portrait: Portrait | undefined = undefined\n  export let uploadPhoto: string | undefined = undefined\n  export let fullname: string\n  export let userId: number | undefined = undefined\n  export let size: 'large' | 'small' = 'large'\n  export let shape: 'brand' | 'circle' = 'brand'\n  export let positioning: 'absolute' | 'relative' = 'absolute'\n  export let className = ''\n\n  const SIZES = {\n    large: {\n      width: 'clamp(72px, 14vw, 178px)',\n      height: 'clamp(77px, 16vw, 189px)',\n      resolution: 600\n    },\n    small: {\n      width: 'clamp(90px, 10vw, 140px)',\n      height: 'clamp(96px, 11vw, 148px)',\n      resolution: 400\n    }\n  } as const\n\n  $: config = SIZES[size]\n  $: filename = portrait?.filename ?? uploadPhoto\n\n  $: imageUrl = filename ? buildImageUrl(filename, config.resolution) : ''\n  $: containerStyle = `width: ${config.width}; height: ${config.height};`\n\n  $: cropStyle = portrait?.crop?.detected\n    ? `left: ${-portrait.crop.left - (portrait.crop.width * 0.09)}%; top: ${-portrait.crop.top - (portrait.crop.width * 0.06)}%; width: ${portrait.crop.width * 1.2}%;`\n    : ''\n\n  function buildImageUrl (filename: string, imageSize: number): string {\n    const basename = encodeURIComponent(filename.split('/').pop() ?? '')\n    const path = `/files/photo/${userId ? `${userId}/` : ''}${basename}`\n\n    if (!env.PUBLIC_IMAGE_HANDLER_URL) {\n      return `${env.PUBLIC_API_BASE}${path}`\n    }\n\n    const baseUrl = env.PUBLIC_IMAGE_HANDLER_URL.startsWith('//')\n      ? `https:${env.PUBLIC_IMAGE_HANDLER_URL}`\n      : env.PUBLIC_IMAGE_HANDLER_URL\n\n    return `${baseUrl}/imagehandler/scaler/${env.PUBLIC_API_BASE.replace(/^https?:\\/\\//, '')}${path}?mode=fit&width=${imageSize}&height=${imageSize}&quality=80`\n  }\n</script>\n\n<div\n  class=\"profile-image {className}\"\n  class:profile-image--circle={shape === 'circle'}\n  class:profile-image--brand={shape === 'brand'}\n  class:profile-image--absolute={positioning === 'absolute'}\n  class:profile-image--relative={positioning === 'relative'}\n  style={containerStyle}\n>\n  <img\n    src={imageUrl}\n    alt=\"Portrait of {fullname}\"\n    class:cropped={portrait?.crop?.detected}\n    class:fallback={!portrait?.crop?.detected}\n    style={cropStyle}\n  />\n</div>\n<style>\n  .profile-image {\n    overflow: hidden;\n    border: 1px solid #00000042;\n  }\n\n  .profile-image--absolute {\n    position: absolute;\n    top: 0;\n    right: var(--space-4xs-3xl);\n  }\n\n  .profile-image--relative {\n    position: relative;\n  }\n\n  .profile-image--brand {\n    border-radius: 0 0 100px 100px;\n  }\n\n  .profile-image--circle {\n    border-radius: 50%;\n  }\n\n  .profile-image img.cropped {\n    position: absolute;\n    transform: none;\n    max-width: none;\n  }\n\n  .profile-image img.fallback {\n    position: absolute;\n    inset: 0;\n    width: 100%;\n    height: 100%;\n    object-fit: cover;\n    object-position: center;\n  }\n\n  .profile-image__placeholder {\n    position: absolute;\n    inset: 0;\n    background-color: rgb(229 231 235);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  }\n</style>\n"],"names":["ctx","attr","img","img_src_value","_b","_a","_d","_c","toggle_class","div","insert_hydration","target","anchor","append_hydration","portrait","$$props","uploadPhoto","fullname","userId","size","shape","positioning","className","SIZES","buildImageUrl","filename","imageSize","basename","path","env","$$invalidate","config","imageUrl","containerStyle","cropStyle"],"mappings":"gaA8DSA,EAAQ,CAAA,CAAA,GAAAC,EAAAC,EAAA,MAAAC,CAAA,6BACKH,EAAQ,CAAA,CAAA,cAGnBA,EAAS,CAAA,CAAA,+CAFDI,GAAAC,EAAAL,EAAQ,CAAA,IAAR,YAAAK,EAAU,OAAV,YAAAD,EAAgB,QAAQ,oBACtBE,GAAAC,EAAAP,EAAQ,CAAA,IAAR,YAAAO,EAAU,OAAV,MAAAD,EAAgB,SAAQ,iCAXrBN,EAAS,CAAA,EAAA,iBAAA,cAKxBA,EAAc,CAAA,CAAA,EAJQQ,EAAAC,EAAA,wBAAAT,OAAU,QAAQ,EACnBQ,EAAAC,EAAA,uBAAAT,OAAU,OAAO,EACdQ,EAAAC,EAAA,0BAAAT,OAAgB,UAAU,EAC1BQ,EAAAC,EAAA,0BAAAT,OAAgB,UAAU,UAL3DU,EAeKC,EAAAF,EAAAG,CAAA,EAPHC,EAMCJ,EAAAP,CAAA,0CALMF,EAAQ,CAAA,CAAA,2CACKA,EAAQ,CAAA,mCAGnBA,EAAS,CAAA,CAAA,sBAFDI,GAAAC,EAAAL,EAAQ,CAAA,IAAR,YAAAK,EAAU,OAAV,YAAAD,EAAgB,QAAQ,yBACtBE,GAAAC,EAAAP,EAAQ,CAAA,IAAR,YAAAO,EAAU,OAAV,MAAAD,EAAgB,SAAQ,gCAXrBN,EAAS,CAAA,EAAA,qDAKxBA,EAAc,CAAA,CAAA,QAJQQ,EAAAC,EAAA,wBAAAT,OAAU,QAAQ,QACnBQ,EAAAC,EAAA,uBAAAT,OAAU,OAAO,QACdQ,EAAAC,EAAA,0BAAAT,OAAgB,UAAU,QAC1BQ,EAAAC,EAAA,0BAAAT,OAAgB,UAAU,2DArD9C,SAAAc,EAAA,MAAiC,EAAAC,GACjC,YAAAC,EAAA,MAAkC,EAAAD,EAClC,CAAA,SAAAE,CAAA,EAAAF,GACA,OAAAG,EAAA,MAA6B,EAAAH,GAC7B,KAAAI,EAA0B,OAAA,EAAAJ,GAC1B,MAAAK,EAA4B,OAAA,EAAAL,GAC5B,YAAAM,EAAuC,UAAA,EAAAN,GACvC,UAAAO,EAAY,EAAA,EAAAP,EAEjB,MAAAQ,EAAA,CACJ,MAAA,CACE,MAAO,2BACP,OAAQ,2BACR,WAAY,KAEd,MAAA,CACE,MAAO,2BACP,OAAQ,2BACR,WAAY,MAcP,SAAAC,EAAeC,EAAkBC,EAAA,CAClC,MAAAC,EAAW,mBAAmBF,EAAS,MAAM,GAAG,EAAE,OAAS,EAAE,EAC7DG,EAAA,gBAAuBV,EAAA,GAAYA,CAAM,IAAM,EAAE,GAAGS,CAAQ,UAE7DE,EAAI,4BAIOA,EAAI,yBAAyB,WAAW,IAAI,EAC/C,SAAAA,EAAI,wBAAwB,GACrCA,EAAI,wBAES,wBAAwBA,EAAI,gBAAgB,QAAQ,eAAgB,EAAE,CAAA,GAAID,CAAI,mBAAmBF,CAAS,WAAWA,CAAS,iBAPnIG,EAAI,eAAe,GAAGD,CAAI,4UAfxCE,EAAA,GAAGC,EAASR,EAAMJ,CAAI,CAAA,kBACtBW,EAAA,GAAGL,GAAWX,GAAA,YAAAA,EAAU,WAAYE,CAAA,mBAEpCc,EAAA,EAAGE,EAAWP,EAAWD,EAAcC,EAAUM,EAAO,UAAU,EAAI,EAAA,mBACtED,EAAA,EAAGG,EAAA,UAA2BF,EAAO,KAAK,aAAaA,EAAO,MAAM,GAAA,gBAEpED,EAAA,EAAGI,GAAY7B,EAAAS,GAAA,YAAAA,EAAU,OAAV,MAAAT,EAAgB,SACjB,SAAA,CAAAS,EAAS,KAAK,KAAQA,EAAS,KAAK,MAAQ,GAAK,YAAYA,EAAS,KAAK,IAAOA,EAAS,KAAK,MAAQ,GAAK,aAAaA,EAAS,KAAK,MAAQ,GAAG,KAC7J,EAAA"}