{"version":3,"file":"AppIcon.CzTxIFaL.mjs","names":[],"sources":["https:/framerusercontent.com/modules/7movB5Dqao44loelyI8s/vgO2GfD3pqbntxEwj7wh/AppIcon.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{addPropertyControls,ControlType}from\"framer\";/**\n * App Icon\n *\n * Renders a project's app icon, and **nothing at all** when there isn't one.\n *\n * A Framer frame with an image fill still draws a box when the image is unset,\n * so the empty state has to be handled somewhere; returning null handles it\n * here, and the icon then occupies no space at all.\n *\n * Callers additionally wrap this in a frame whose `visible` is bound to the\n * image variable through the `isSet` transform. That wrapper is what collapses\n * the surrounding gap and padding, which this component cannot reach from the\n * inside — so the title sits flush when a project has no icon.\n *\n * @framerIntrinsicWidth 34\n * @framerIntrinsicHeight 34\n *\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n */export default function AppIcon(props){const{image,size=34,radius=9,ring=false,shadow=false,shadowColor=\"rgba(0, 0, 0, 0.18)\"}=props;const src=image?.src;if(!src)return null;const layers=[];// A hairline keeps light icons from dissolving into a light thumbnail; off\n// by default so it never adds a visible edge to icons that already have\n// their own shape.\nif(ring)layers.push(\"inset 0 0 0 1px rgba(0, 0, 0, 0.10)\");// Offset and blur scale with the icon, so a 24px icon on a card and a 64px\n// icon in a hero cast the same shadow proportionally.\nif(shadow){layers.push(\"0 \"+size*.08+\"px \"+size*.25+\"px \"+shadowColor);}return /*#__PURE__*/_jsx(\"img\",{src:src,srcSet:image?.srcSet,alt:image?.alt??\"\",width:size,height:size,style:{display:\"block\",width:size,height:size,borderRadius:radius,objectFit:\"cover\",boxShadow:layers.length>0?layers.join(\", \"):undefined}});}addPropertyControls(AppIcon,{image:{type:ControlType.ResponsiveImage,title:\"Icon\"},size:{type:ControlType.Number,title:\"Size\",defaultValue:34,min:12,max:128,step:1,unit:\"px\"},radius:{type:ControlType.Number,title:\"Radius\",defaultValue:9,min:0,max:64,step:1,unit:\"px\"},ring:{type:ControlType.Boolean,title:\"Hairline\",defaultValue:false},shadow:{type:ControlType.Boolean,title:\"Shadow\",defaultValue:false},shadowColor:{type:ControlType.Color,title:\"Shadow Color\",defaultValue:\"rgba(0, 0, 0, 0.18)\",hidden:props=>!props.shadow}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"AppIcon\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"auto\",\"framerIntrinsicWidth\":\"34\",\"framerContractVersion\":\"1\",\"framerIntrinsicHeight\":\"34\",\"framerSupportedLayoutWidth\":\"auto\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./AppIcon.map"],"mappings":"4JAmBG,SAAwB,EAAQ,EAAM,CAAC,GAAK,CAAC,QAAM,OAAK,GAAG,SAAO,EAAE,OAAK,GAAM,SAAO,GAAM,cAAY,uBAAuB,EAAY,EAAI,GAAO,IAAI,GAAG,CAAC,EAAI,OAAO,KAAK,IAAM,EAAO,CAAC,EAKvH,OAFrE,GAAK,EAAO,KAAK,qCAAqC,EAEtD,GAAQ,EAAO,KAAK,KAAK,EAAK,IAAI,MAAM,EAAK,IAAI,MAAM,CAAW,EAAuB,EAAK,MAAM,CAAK,MAAI,OAAO,GAAO,OAAO,IAAI,GAAO,KAAK,GAAG,MAAM,EAAK,OAAO,EAAK,MAAM,CAAC,QAAQ,QAAQ,MAAM,EAAK,OAAO,EAAK,aAAa,EAAO,UAAU,QAAQ,UAAU,EAAO,OAAO,EAAE,EAAO,KAAK,IAAI,EAAE,IAAA,EAAS,CAAC,CAAC,CAAE,iBAxBlR,IAAoD,EAwB+N,EAAoB,EAAQ,CAAC,MAAM,CAAC,KAAK,EAAY,gBAAgB,MAAM,MAAM,EAAE,KAAK,CAAC,KAAK,EAAY,OAAO,MAAM,OAAO,aAAa,GAAG,IAAI,GAAG,IAAI,IAAI,KAAK,EAAE,KAAK,IAAI,EAAE,OAAO,CAAC,KAAK,EAAY,OAAO,MAAM,SAAS,aAAa,EAAE,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,KAAK,IAAI,EAAE,KAAK,CAAC,KAAK,EAAY,QAAQ,MAAM,WAAW,aAAa,EAAK,EAAE,OAAO,CAAC,KAAK,EAAY,QAAQ,MAAM,SAAS,aAAa,EAAK,EAAE,YAAY,CAAC,KAAK,EAAY,MAAM,MAAM,eAAe,aAAa,sBAAsB,OAAO,GAAO,CAAC,EAAM,MAAM,CAAC,CAAC"}