{"version":3,"file":"RevealProjectCard.CMfVM_0Q.mjs","names":["React.useState","React.useRef","React.useCallback","p","_Fragment"],"sources":["https:/framerusercontent.com/modules/D8rGoSGc5vaiCbiq4GSt/e1YGsGS3rdq6Db6xGzjl/RevealProjectCard.js"],"sourcesContent":["// // File: RevealProjectCard.tsx\n// import * as React from \"react\"\n// import { motion, AnimatePresence } from \"framer-motion\"\n// import { addPropertyControls, ControlType } from \"framer\"\n// type Props = {\n//     fontFamily: string\n//     // Card (thumbnail)\n//     useFitContentHeight: boolean\n//     cornerRadius: number\n//     imageRadius: number\n//     cardBg: string\n//     showShadow: boolean\n//     shadow: string\n//     cardPadding: number\n//     image: string\n//     imageFullBleed: boolean\n//     fullBleedGap: number\n//     imageWidthPercent: number\n//     imageAspect: string\n//     objectFit: \"cover\" | \"contain\"\n//     focalX: number\n//     focalY: number\n//     title: string\n//     badge: string\n//     shortText: string\n//     ctaLabel: string\n//     ctaCloseLabel: string\n//     textPrimary: string\n//     textSecondary: string\n//     badgeColor: string\n//     ctaBg: string\n//     ctaText: string\n//     ctaPaddingY: number\n//     ctaPaddingX: number\n//     // NEW — Website link\n//     websiteUrl: string\n//     websiteLabel: string\n//     websiteColor: string\n//     // Overlay panel\n//     longText: string\n//     sameBackground: boolean\n//     backdropColor: string\n//     panelBg: string\n//     panelText: string\n//     panelRadius: number\n//     syncPadding: boolean\n//     panelPadding: number\n//     panelInset: number\n//     scrollTextGap: number\n//     panelShadow: boolean\n//     panelShadowCss: string\n//     // Motion\n//     transitionType: \"spring\" | \"tween\"\n//     duration: number\n//     stiffness: number\n//     damping: number\n//     closeOnBackdrop: boolean\n// }\n// export default function RevealProjectCard(p: Props) {\n//     const [open, setOpen] = React.useState(false)\n//     const [contentHeight, setContentHeight] = React.useState<number>(0)\n//     const contentRef = React.useRef<HTMLDivElement>(null)\n//     const cardRef = React.useRef<HTMLDivElement>(null)\n//     const panelDialogRef = React.useRef<HTMLDivElement>(null)\n//     const panelCloseBtnRef = React.useRef<HTMLButtonElement>(null)\n//     const panelScrollRef = React.useRef<HTMLDivElement>(null)\n//     /** Fixed px height for the scroll row (measured from layout — same as after scroll settles). */\n//     const [panelScrollSlotPx, setPanelScrollSlotPx] = React.useState<\n//         number | null\n//     >(null)\n//     const panelBodyGap = 20\n//     React.useEffect(() => {\n//         const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && setOpen(false)\n//         document.addEventListener(\"keydown\", onKey)\n//         return () => document.removeEventListener(\"keydown\", onKey)\n//     }, [])\n//     // Measure content height and sync with other cards in the same grid\n//     React.useEffect(() => {\n//         if (!contentRef.current || !p.useFitContentHeight || !cardRef.current)\n//             return\n//         const measureAndSync = () => {\n//             const card = cardRef.current\n//             const content = contentRef.current\n//             if (!card || !content) return\n//             // Find parent grid (look for common grid patterns)\n//             let parent = card.parentElement\n//             let gridParent: HTMLElement | null = null\n//             // Look for parent with display: grid\n//             while (parent && parent !== document.body) {\n//                 const style = window.getComputedStyle(parent)\n//                 if (\n//                     style.display === \"grid\" ||\n//                     style.display === \"inline-grid\"\n//                 ) {\n//                     gridParent = parent\n//                     // Mark it for future reference\n//                     if (\n//                         gridParent &&\n//                         !gridParent.hasAttribute(\"data-rpc-grid\")\n//                     ) {\n//                         gridParent.setAttribute(\"data-rpc-grid\", \"true\")\n//                     }\n//                     break\n//                 }\n//                 parent = parent.parentElement\n//             }\n//             if (!gridParent) {\n//                 // If no grid parent found, just measure this card\n//                 const height = content.offsetHeight\n//                 if (height > 0) setContentHeight(height)\n//                 return\n//             }\n//             // Find all content sections in the same grid\n//             const allContentSections =\n//                 gridParent.querySelectorAll(\"[data-rpc-content]\")\n//             let maxHeight = 0\n//             allContentSections.forEach((section) => {\n//                 const h = (section as HTMLElement).offsetHeight\n//                 if (h > maxHeight) maxHeight = h\n//             })\n//             if (maxHeight > 0 && gridParent) {\n//                 setContentHeight(maxHeight)\n//                 // Apply to all sections\n//                 allContentSections.forEach((section) => {\n//                     ;(section as HTMLElement).style.minHeight = `${maxHeight}px`\n//                 })\n//             }\n//         }\n//         // Measure after a delay to ensure DOM is ready\n//         const timeoutId = setTimeout(measureAndSync, 100)\n//         const resizeObserver = new ResizeObserver(measureAndSync)\n//         if (contentRef.current) {\n//             resizeObserver.observe(contentRef.current)\n//         }\n//         return () => {\n//             clearTimeout(timeoutId)\n//             resizeObserver.disconnect()\n//         }\n//     }, [\n//         p.useFitContentHeight,\n//         p.title,\n//         p.websiteUrl,\n//         p.badge,\n//         p.shortText,\n//         p.cardPadding,\n//         p.imageFullBleed,\n//         p.fullBleedGap,\n//     ])\n//     const measurePanelScrollSlotHeight = React.useCallback(() => {\n//         const panel = panelDialogRef.current\n//         const btn = panelCloseBtnRef.current\n//         if (!open || !panel || !btn) return\n//         const ps = getComputedStyle(panel)\n//         const pt = parseFloat(ps.paddingTop) || 0\n//         const pb = parseFloat(ps.paddingBottom) || 0\n//         const rowGapRaw = ps.rowGap\n//         const gap =\n//             rowGapRaw && rowGapRaw !== \"normal\"\n//                 ? parseFloat(rowGapRaw) || panelBodyGap\n//                 : panelBodyGap\n//         const inner = panel.clientHeight - pt - pb\n//         const btnH = btn.offsetHeight\n//         if (btnH < 1) return\n//         const h = Math.max(0, Math.round(inner - gap - btnH))\n//         setPanelScrollSlotPx(h)\n//     }, [open, panelBodyGap])\n//     React.useLayoutEffect(() => {\n//         if (!open) {\n//             setPanelScrollSlotPx(null)\n//             return\n//         }\n//         measurePanelScrollSlotHeight()\n//         const panel = panelDialogRef.current\n//         if (!panel) return\n//         const ro = new ResizeObserver(() => measurePanelScrollSlotHeight())\n//         ro.observe(panel)\n//         const t1 = window.setTimeout(measurePanelScrollSlotHeight, 0)\n//         const t2 = window.setTimeout(measurePanelScrollSlotHeight, 80)\n//         const t3 = window.setTimeout(measurePanelScrollSlotHeight, 320)\n//         return () => {\n//             ro.disconnect()\n//             clearTimeout(t1)\n//             clearTimeout(t2)\n//             clearTimeout(t3)\n//         }\n//     }, [\n//         open,\n//         measurePanelScrollSlotHeight,\n//         p.syncPadding,\n//         p.cardPadding,\n//         p.panelPadding,\n//         p.ctaPaddingY,\n//         p.ctaPaddingX,\n//         p.longText,\n//         p.panelInset,\n//         p.panelRadius,\n//     ])\n//     const transition =\n//         p.transitionType === \"spring\"\n//             ? ({\n//                   type: \"spring\",\n//                   stiffness: p.stiffness,\n//                   damping: p.damping,\n//               } as const)\n//             : ({ type: \"tween\", duration: p.duration } as const)\n//     // Minimal scrollbar with green color for better visibility\n//     const scrollClass = \"rpc-scroll\"\n//     // Green color: #52FFAB = rgb(82, 255, 171)\n//     const scrollbarColor = \"rgba(82, 255, 171, 0.7)\"\n//     const scrollbarColorHover = \"rgba(82, 255, 171, 0.9)\"\n//     const scrollbarCSS = `\n//     .${scrollClass}{scrollbar-width:thin;scrollbar-color:${scrollbarColor} transparent;}\n//     .${scrollClass}::-webkit-scrollbar{width:8px}\n//     .${scrollClass}::-webkit-scrollbar-track{background:transparent}\n//     .${scrollClass}::-webkit-scrollbar-thumb{background:${scrollbarColor};border-radius:8px}\n//     .${scrollClass}::-webkit-scrollbar-thumb:hover{background:${scrollbarColorHover}}\n//     .${scrollClass}::-webkit-scrollbar-thumb:active{background:${scrollbarColorHover}}\n//     .${scrollClass}::-webkit-scrollbar-button{display:none}\n//   `\n//     const effectiveBackdrop = p.sameBackground ? p.panelBg : p.backdropColor\n//     const effectivePanelPadding = p.syncPadding ? p.cardPadding : p.panelPadding\n//     const fullBleedRadius = `${p.cornerRadius}px ${p.cornerRadius}px ${p.imageRadius}px ${p.imageRadius}px`\n//     // ---- helpers for truncation ----\n//     const oneLineEllipsis: React.CSSProperties = {\n//         overflow: \"hidden\",\n//         textOverflow: \"ellipsis\",\n//         whiteSpace: \"nowrap\",\n//         minWidth: 0,\n//         maxWidth: \"100%\",\n//         display: \"block\",\n//     }\n//     const lineClamp = (lines: number): React.CSSProperties => ({\n//         display: \"-webkit-box\",\n//         WebkitLineClamp: lines as any,\n//         WebkitBoxOrient: \"vertical\" as any,\n//         overflow: \"hidden\",\n//         minWidth: 0,\n//         wordBreak: \"break-word\",\n//     })\n//     return (\n//         <div\n//             ref={cardRef}\n//             data-rpc-card\n//             style={{\n//                 width: \"100%\",\n//                 height: p.useFitContentHeight ? \"auto\" : \"100%\",\n//                 position: \"relative\",\n//                 borderRadius: p.cornerRadius,\n//                 fontFamily:\n//                     p.fontFamily ||\n//                     \"General Sans, Inter, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif\",\n//             }}\n//         >\n//             <style>{scrollbarCSS}</style>\n//             {/* ---- Thumbnail ---- */}\n//             <motion.div\n//                 layout\n//                 transition={transition}\n//                 style={{\n//                     height: p.useFitContentHeight ? \"auto\" : \"100%\",\n//                     display: \"flex\",\n//                     flexDirection: \"column\",\n//                     background: p.cardBg,\n//                     borderRadius: p.cornerRadius,\n//                     boxShadow: p.showShadow ? p.shadow : \"none\",\n//                     overflow: \"hidden\",\n//                     padding: 0,\n//                 }}\n//             >\n//                 {/* Full-bleed image */}\n//                 {p.imageFullBleed && (\n//                     <div\n//                         style={{\n//                             width: \"100%\",\n//                             aspectRatio: p.imageAspect,\n//                             overflow: \"hidden\",\n//                             borderRadius: fullBleedRadius,\n//                             background: \"#111\",\n//                         }}\n//                     >\n//                         <img\n//                             src={p.image}\n//                             alt={p.title}\n//                             loading=\"lazy\"\n//                             decoding=\"async\"\n//                             style={{\n//                                 width: \"100%\",\n//                                 height: \"100%\",\n//                                 display: \"block\",\n//                                 objectFit: p.objectFit,\n//                                 objectPosition: `${p.focalX}% ${p.focalY}%`,\n//                             }}\n//                         />\n//                     </div>\n//                 )}\n//                 {/* Body (padded) */}\n//                 <div\n//                     ref={contentRef}\n//                     data-rpc-content\n//                     style={{\n//                         padding: p.cardPadding,\n//                         display: \"grid\",\n//                         gap: 16,\n//                         marginTop: p.imageFullBleed ? p.fullBleedGap : 0,\n//                         minWidth: 0, // important so ellipsis works inside grid\n//                         ...(p.useFitContentHeight && contentHeight > 0\n//                             ? { minHeight: `${contentHeight}px` }\n//                             : {}),\n//                     }}\n//                 >\n//                     {/* Non-full-bleed image */}\n//                     {!p.imageFullBleed && (\n//                         <div\n//                             style={{\n//                                 width: `${p.imageWidthPercent}%`,\n//                                 alignSelf: \"center\",\n//                                 aspectRatio: p.imageAspect,\n//                                 overflow: \"hidden\",\n//                                 borderRadius: p.imageRadius,\n//                                 background: \"#111\",\n//                             }}\n//                         >\n//                             <img\n//                                 src={p.image}\n//                                 alt={p.title}\n//                                 loading=\"lazy\"\n//                                 decoding=\"async\"\n//                                 style={{\n//                                     width: \"100%\",\n//                                     height: \"100%\",\n//                                     display: \"block\",\n//                                     objectFit: p.objectFit,\n//                                     objectPosition: `${p.focalX}% ${p.focalY}%`,\n//                                     borderRadius: p.imageRadius,\n//                                 }}\n//                             />\n//                         </div>\n//                     )}\n//                     {/* Text + Website + CTA */}\n//                     <h3\n//                         style={{\n//                             margin: 0,\n//                             color: p.textPrimary,\n//                             fontSize: 23,\n//                             lineHeight: \"1.6em\",\n//                             fontWeight: 600,\n//                             ...lineClamp(2), // clamp title\n//                         }}\n//                         title={p.title}\n//                     >\n//                         {p.title}\n//                     </h3>\n//                     {/* Clickable website link (single-line ellipsis) */}\n//                     {!!p.websiteUrl && (\n//                         <a\n//                             href={p.websiteUrl}\n//                             target=\"_blank\"\n//                             rel=\"noopener noreferrer\"\n//                             style={{\n//                                 color: p.websiteColor || \"#52FFAB\",\n//                                 fontSize: 15,\n//                                 fontWeight: 700,\n//                                 textDecoration: \"none\",\n//                                 textTransform: \"uppercase\",\n//                                 letterSpacing: \"0.02em\",\n//                                 lineHeight: \"1.6em\",\n//                                 ...oneLineEllipsis,\n//                             }}\n//                             title={p.websiteLabel || p.websiteUrl}\n//                         >\n//                             {p.websiteLabel || p.websiteUrl}\n//                         </a>\n//                     )}\n//                     {!!p.badge && (\n//                         <div\n//                             style={{\n//                                 color: p.badgeColor,\n//                                 fontSize: 12,\n//                                 fontWeight: 600,\n//                                 textTransform: \"uppercase\",\n//                                 letterSpacing: \"0.04em\",\n//                                 minWidth: 0,\n//                                 ...oneLineEllipsis,\n//                             }}\n//                             title={p.badge}\n//                         >\n//                             {p.badge}\n//                         </div>\n//                     )}\n//                     {!!p.shortText && (\n//                         <p\n//                             style={{\n//                                 margin: 0,\n//                                 color: p.textSecondary,\n//                                 fontSize: 17,\n//                                 lineHeight: \"1.7em\",\n//                                 fontWeight: 500,\n//                                 ...lineClamp(3), // clamp short description\n//                             }}\n//                             title={p.shortText}\n//                         >\n//                             {p.shortText}\n//                         </p>\n//                     )}\n//                     <button\n//                         onClick={() => setOpen(true)}\n//                         style={{\n//                             border: \"none\",\n//                             cursor: \"pointer\",\n//                             background: p.ctaBg,\n//                             color: p.ctaText,\n//                             borderRadius: 7,\n//                             fontWeight: 600,\n//                             padding: `${p.ctaPaddingY}px ${p.ctaPaddingX}px`,\n//                             fontSize: 16,\n//                             lineHeight: 1.2,\n//                             fontFamily: \"inherit\",\n//                             width: \"100%\",\n//                             maxWidth: 200,\n//                             alignSelf: \"start\",\n//                         }}\n//                     >\n//                         {p.ctaLabel || \"À propos de Paul\"}\n//                     </button>\n//                 </div>\n//             </motion.div>\n//             {/* ---- Overlay + Panel ---- */}\n//             <AnimatePresence>\n//                 {open && (\n//                     <>\n//                         <motion.div\n//                             initial={{ opacity: 0 }}\n//                             animate={{ opacity: 1 }}\n//                             exit={{ opacity: 0 }}\n//                             transition={transition}\n//                             onClick={() => p.closeOnBackdrop && setOpen(false)}\n//                             style={{\n//                                 position: \"absolute\",\n//                                 inset: 0,\n//                                 background: effectiveBackdrop,\n//                                 borderRadius: p.cornerRadius,\n//                             }}\n//                         />\n//                         <motion.div\n//                             ref={panelDialogRef}\n//                             role=\"dialog\"\n//                             aria-modal=\"true\"\n//                             initial={{ y: 24, opacity: 0, scale: 0.985 }}\n//                             animate={{ y: 0, opacity: 1, scale: 1 }}\n//                             exit={{ y: 24, opacity: 0, scale: 0.985 }}\n//                             transition={transition}\n//                             onAnimationComplete={() =>\n//                                 measurePanelScrollSlotHeight()\n//                             }\n//                             style={{\n//                                 position: \"absolute\",\n//                                 inset: p.panelInset,\n//                                 background: p.panelBg,\n//                                 color: p.panelText,\n//                                 borderRadius: p.panelRadius,\n//                                 boxShadow: p.panelShadow\n//                                     ? p.panelShadowCss\n//                                     : \"none\",\n//                                 overflow: \"hidden\",\n//                                 fontFamily: \"inherit\",\n//                                 display: \"grid\",\n//                                 gridTemplateRows:\n//                                     panelScrollSlotPx != null\n//                                         ? `${panelScrollSlotPx}px auto`\n//                                         : \"minmax(0, 1fr) auto\",\n//                                 gridTemplateColumns: \"1fr\",\n//                                 minHeight: 0,\n//                                 height: \"100%\",\n//                                 padding: effectivePanelPadding,\n//                                 gap: panelBodyGap,\n//                             }}\n//                         >\n//                             <div\n//                                 style={{\n//                                     minHeight: 0,\n//                                     minWidth: 0,\n//                                     overflow: \"hidden\",\n//                                     position: \"relative\",\n//                                 }}\n//                             >\n//                                 <div\n//                                     ref={panelScrollRef}\n//                                     className={scrollClass}\n//                                     style={{\n//                                         position: \"absolute\",\n//                                         inset: 0,\n//                                         overflow: \"auto\",\n//                                         paddingRight: p.scrollTextGap,\n//                                         boxSizing: \"border-box\",\n//                                     }}\n//                                 >\n//                                     <p\n//                                         style={{\n//                                             margin: 0,\n//                                             fontSize: 17,\n//                                             lineHeight: \"1.7em\",\n//                                             whiteSpace: \"pre-wrap\",\n//                                             fontWeight: 400,\n//                                         }}\n//                                     >\n//                                         {p.longText}\n//                                     </p>\n//                                 </div>\n//                             </div>\n//                             <button\n//                                 ref={panelCloseBtnRef}\n//                                 onClick={() => setOpen(false)}\n//                                 style={{\n//                                     border: \"none\",\n//                                     cursor: \"pointer\",\n//                                     background: p.ctaBg,\n//                                     color: p.ctaText,\n//                                     borderRadius: 7,\n//                                     fontWeight: 600,\n//                                     padding: `${p.ctaPaddingY}px ${p.ctaPaddingX}px`,\n//                                     fontSize: 16,\n//                                     lineHeight: 1.2,\n//                                     fontFamily: \"inherit\",\n//                                     width: \"100%\",\n//                                     maxWidth: 200,\n//                                     alignSelf: \"start\",\n//                                     flexShrink: 0,\n//                                 }}\n//                             >\n//                                 {p.ctaCloseLabel || \"Voir moins\"}\n//                             </button>\n//                         </motion.div>\n//                     </>\n//                 )}\n//             </AnimatePresence>\n//         </div>\n//     )\n// }\n// /* -------- Controls -------- */\n// addPropertyControls(RevealProjectCard, {\n//     fontFamily: {\n//         type: ControlType.String,\n//         title: \"Font\",\n//         defaultValue: \"General Sans\",\n//     },\n//     useFitContentHeight: {\n//         type: ControlType.Boolean,\n//         title: \"Fit Content\",\n//         defaultValue: true,\n//     },\n//     cornerRadius: {\n//         type: ControlType.Number,\n//         title: \"Card Radius\",\n//         defaultValue: 20,\n//         min: 0,\n//         max: 64,\n//     },\n//     imageRadius: {\n//         type: ControlType.Number,\n//         title: \"Image Radius\",\n//         defaultValue: 10,\n//         min: 0,\n//         max: 64,\n//     },\n//     cardBg: {\n//         type: ControlType.Color,\n//         title: \"Card BG\",\n//         defaultValue: \"#101010\",\n//     },\n//     showShadow: {\n//         type: ControlType.Boolean,\n//         title: \"Card Shadow\",\n//         defaultValue: true,\n//     },\n//     shadow: {\n//         type: ControlType.String,\n//         title: \"Card Shadow CSS\",\n//         defaultValue: \"0 22px 48px rgba(0,0,0,0.35)\",\n//     },\n//     cardPadding: {\n//         type: ControlType.Number,\n//         title: \"Card Padding\",\n//         defaultValue: 22,\n//         min: 0,\n//         max: 64,\n//     },\n//     image: { type: ControlType.Image, title: \"Image\" },\n//     imageFullBleed: {\n//         type: ControlType.Boolean,\n//         title: \"Image Full-width\",\n//         defaultValue: false,\n//     },\n//     fullBleedGap: {\n//         type: ControlType.Number,\n//         title: \"Full-bleed Gap\",\n//         defaultValue: 0,\n//         min: 0,\n//         max: 48,\n//     },\n//     imageWidthPercent: {\n//         type: ControlType.Number,\n//         title: \"Image %\",\n//         defaultValue: 100,\n//         min: 40,\n//         max: 100,\n//     },\n//     imageAspect: {\n//         type: ControlType.String,\n//         title: \"Image Aspect\",\n//         defaultValue: \"16 / 10\",\n//     },\n//     objectFit: {\n//         type: ControlType.Enum,\n//         title: \"Image Fit\",\n//         options: [\"cover\", \"contain\"],\n//         defaultValue: \"cover\",\n//     },\n//     focalX: {\n//         type: ControlType.Number,\n//         title: \"Focal X\",\n//         defaultValue: 50,\n//         min: 0,\n//         max: 100,\n//     },\n//     focalY: {\n//         type: ControlType.Number,\n//         title: \"Focal Y\",\n//         defaultValue: 50,\n//         min: 0,\n//         max: 100,\n//     },\n//     title: {\n//         type: ControlType.String,\n//         title: \"Title\",\n//         defaultValue: \"Paul Marchand\",\n//     },\n//     badge: {\n//         type: ControlType.String,\n//         title: \"Badge\",\n//         defaultValue: \"Fondateur\",\n//     },\n//     shortText: {\n//         type: ControlType.String,\n//         title: \"Short\",\n//         defaultValue:\n//             \"Fondateur de Studio Webshift, Paul aide les entreprises à se démarquer en ligne grâce au web et au marketing digital.\",\n//     },\n//     ctaLabel: {\n//         type: ControlType.String,\n//         title: \"CTA Open\",\n//         defaultValue: \"À propos de Paul\",\n//     },\n//     ctaCloseLabel: {\n//         type: ControlType.String,\n//         title: \"CTA Close\",\n//         defaultValue: \"Voir moins\",\n//     },\n//     textPrimary: {\n//         type: ControlType.Color,\n//         title: \"Title Color\",\n//         defaultValue: \"#FFFFFF\",\n//     },\n//     textSecondary: {\n//         type: ControlType.Color,\n//         title: \"Text Color\",\n//         defaultValue: \"#F1F1F1\",\n//     },\n//     badgeColor: {\n//         type: ControlType.Color,\n//         title: \"Badge Color\",\n//         defaultValue: \"#52FFAB\",\n//     },\n//     ctaBg: {\n//         type: ControlType.Color,\n//         title: \"CTA BG\",\n//         defaultValue: \"#52FFAB\",\n//     },\n//     ctaText: {\n//         type: ControlType.Color,\n//         title: \"CTA Text\",\n//         defaultValue: \"#000000\",\n//     },\n//     ctaPaddingY: {\n//         type: ControlType.Number,\n//         title: \"CTA Pad Y\",\n//         defaultValue: 14,\n//         min: 4,\n//         max: 40,\n//     },\n//     ctaPaddingX: {\n//         type: ControlType.Number,\n//         title: \"CTA Pad X\",\n//         defaultValue: 24,\n//         min: 8,\n//         max: 64,\n//     },\n//     // NEW — Website link controls\n//     websiteUrl: {\n//         type: ControlType.String,\n//         title: \"Website URL\",\n//         defaultValue: \"https://www.studiowebshift.com\",\n//     },\n//     websiteLabel: {\n//         type: ControlType.String,\n//         title: \"Website Label\",\n//         defaultValue: \"www.studiowebshift.com\",\n//     },\n//     websiteColor: {\n//         type: ControlType.Color,\n//         title: \"Website Color\",\n//         defaultValue: \"#52FFAB\",\n//     },\n//     longText: {\n//         type: ControlType.String,\n//         title: \"Long\",\n//         displayTextArea: true,\n//         defaultValue: \"Texte long…\",\n//     },\n//     sameBackground: {\n//         type: ControlType.Boolean,\n//         title: \"Single BG Color\",\n//         defaultValue: true,\n//     },\n//     backdropColor: {\n//         type: ControlType.Color,\n//         title: \"Backdrop\",\n//         defaultValue: \"#0F0F0F\",\n//     },\n//     panelBg: {\n//         type: ControlType.Color,\n//         title: \"Panel BG\",\n//         defaultValue: \"#0F0F0F\",\n//     },\n//     panelText: {\n//         type: ControlType.Color,\n//         title: \"Panel Text\",\n//         defaultValue: \"#EDEDED\",\n//     },\n//     panelRadius: {\n//         type: ControlType.Number,\n//         title: \"Panel Radius\",\n//         defaultValue: 20,\n//         min: 0,\n//         max: 64,\n//     },\n//     syncPadding: {\n//         type: ControlType.Boolean,\n//         title: \"Sync Padding\",\n//         defaultValue: true,\n//     },\n//     panelPadding: {\n//         type: ControlType.Number,\n//         title: \"Panel Padding\",\n//         defaultValue: 28,\n//         min: 0,\n//         max: 64,\n//         hidden: (props: Props) => props.syncPadding,\n//     },\n//     panelInset: {\n//         type: ControlType.Number,\n//         title: \"Panel Inset\",\n//         defaultValue: 0,\n//         min: 0,\n//         max: 24,\n//     },\n//     scrollTextGap: {\n//         type: ControlType.Number,\n//         title: \"Text↔Scroll Gap\",\n//         defaultValue: 8,\n//         min: 0,\n//         max: 24,\n//     },\n//     panelShadow: {\n//         type: ControlType.Boolean,\n//         title: \"Panel Shadow\",\n//         defaultValue: false,\n//     },\n//     panelShadowCss: {\n//         type: ControlType.String,\n//         title: \"Panel Shadow CSS\",\n//         defaultValue: \"0 18px 40px rgba(0,0,0,.38)\",\n//     },\n//     transitionType: {\n//         type: ControlType.SegmentedEnum,\n//         title: \"Transition\",\n//         options: [\"spring\", \"tween\"],\n//         optionTitles: [\"Spring\", \"Tween\"],\n//         defaultValue: \"spring\",\n//     },\n//     duration: {\n//         type: ControlType.Number,\n//         title: \"Duration\",\n//         defaultValue: 0.28,\n//         hidden: (p) => p.transitionType !== \"tween\",\n//     },\n//     stiffness: {\n//         type: ControlType.Number,\n//         title: \"Stiffness\",\n//         defaultValue: 340,\n//         hidden: (p) => p.transitionType !== \"spring\",\n//     },\n//     damping: {\n//         type: ControlType.Number,\n//         title: \"Damping\",\n//         defaultValue: 32,\n//         hidden: (p) => p.transitionType !== \"spring\",\n//     },\n//     closeOnBackdrop: {\n//         type: ControlType.Boolean,\n//         title: \"Backdrop Closes\",\n//         defaultValue: true,\n//     },\n// })\n// File: RevealProjectCard.tsx\nimport{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import*as React from\"react\";import{motion,AnimatePresence}from\"framer-motion\";import{addPropertyControls,ControlType}from\"framer\";export default function RevealProjectCard(p){const[open,setOpen]=React.useState(false);const[contentHeight,setContentHeight]=React.useState(0);const contentRef=React.useRef(null);const cardRef=React.useRef(null);const panelDialogRef=React.useRef(null);const panelCloseBtnRef=React.useRef(null);const panelScrollRef=React.useRef(null);/** Fixed px height for the scroll row (measured from layout — same as after scroll settles). */const[panelScrollSlotPx,setPanelScrollSlotPx]=React.useState(null);/** Custom always-visible scrollbar (native bars hide on mobile). */const[panelScrollIndicator,setPanelScrollIndicator]=React.useState({active:false,thumbH:0,thumbTop:0});const panelBodyGap=20;const syncPanelScrollIndicator=React.useCallback(()=>{const el=panelScrollRef.current;if(!el)return;const{scrollTop,scrollHeight,clientHeight}=el;if(scrollHeight<=clientHeight+1){setPanelScrollIndicator(prev=>prev.active?{active:false,thumbH:0,thumbTop:0}:prev);return;}const track=scrollHeight-clientHeight;const thumbH=Math.max(28,Math.round(clientHeight/scrollHeight*clientHeight));const maxTop=Math.max(0,clientHeight-thumbH);const thumbTop=track>0?Math.round(scrollTop/track*maxTop):0;setPanelScrollIndicator(prev=>{if(prev.active&&prev.thumbH===thumbH&&prev.thumbTop===thumbTop){return prev;}return{active:true,thumbH,thumbTop};});},[]);React.useEffect(()=>{const onKey=e=>e.key===\"Escape\"&&setOpen(false);document.addEventListener(\"keydown\",onKey);return()=>document.removeEventListener(\"keydown\",onKey);},[]);// Measure content height and sync with other cards in the same grid\nReact.useEffect(()=>{if(!contentRef.current||!p.useFitContentHeight||!cardRef.current)return;const measureAndSync=()=>{const card=cardRef.current;const content=contentRef.current;if(!card||!content)return;// Find parent grid (look for common grid patterns)\nlet parent=card.parentElement;let gridParent=null;// Look for parent with display: grid\nwhile(parent&&parent!==document.body){const style=window.getComputedStyle(parent);if(style.display===\"grid\"||style.display===\"inline-grid\"){gridParent=parent;// Mark it for future reference\nif(gridParent&&!gridParent.hasAttribute(\"data-rpc-grid\")){gridParent.setAttribute(\"data-rpc-grid\",\"true\");}break;}parent=parent.parentElement;}if(!gridParent){// If no grid parent found, just measure this card\nconst height=content.offsetHeight;if(height>0)setContentHeight(height);return;}// Find all content sections in the same grid\nconst allContentSections=gridParent.querySelectorAll(\"[data-rpc-content]\");let maxHeight=0;allContentSections.forEach(section=>{const h=section.offsetHeight;if(h>maxHeight)maxHeight=h;});if(maxHeight>0&&gridParent){setContentHeight(maxHeight);// Apply to all sections\nallContentSections.forEach(section=>{section.style.minHeight=`${maxHeight}px`;});}};// Measure after a delay to ensure DOM is ready\nconst timeoutId=setTimeout(measureAndSync,100);const resizeObserver=new ResizeObserver(measureAndSync);if(contentRef.current){resizeObserver.observe(contentRef.current);}return()=>{clearTimeout(timeoutId);resizeObserver.disconnect();};},[p.useFitContentHeight,p.title,p.websiteUrl,p.badge,p.shortText,p.cardPadding,p.imageFullBleed,p.fullBleedGap]);const measurePanelScrollSlotHeight=React.useCallback(()=>{const panel=panelDialogRef.current;const btn=panelCloseBtnRef.current;if(!open||!panel||!btn)return;const ps=getComputedStyle(panel);const pt=parseFloat(ps.paddingTop)||0;const pb=parseFloat(ps.paddingBottom)||0;const rowGapRaw=ps.rowGap;const gap=rowGapRaw&&rowGapRaw!==\"normal\"?parseFloat(rowGapRaw)||panelBodyGap:panelBodyGap;const inner=panel.clientHeight-pt-pb;const btnH=btn.offsetHeight;if(btnH<1)return;const h=Math.max(0,Math.round(inner-gap-btnH));setPanelScrollSlotPx(h);requestAnimationFrame(()=>syncPanelScrollIndicator());},[open,panelBodyGap,syncPanelScrollIndicator]);React.useLayoutEffect(()=>{if(!open){setPanelScrollSlotPx(null);setPanelScrollIndicator({active:false,thumbH:0,thumbTop:0});return;}measurePanelScrollSlotHeight();const panel=panelDialogRef.current;if(!panel)return;const ro=new ResizeObserver(()=>measurePanelScrollSlotHeight());ro.observe(panel);const t1=window.setTimeout(measurePanelScrollSlotHeight,0);const t2=window.setTimeout(measurePanelScrollSlotHeight,80);const t3=window.setTimeout(measurePanelScrollSlotHeight,320);return()=>{ro.disconnect();clearTimeout(t1);clearTimeout(t2);clearTimeout(t3);};},[open,measurePanelScrollSlotHeight,p.syncPadding,p.cardPadding,p.panelPadding,p.ctaPaddingY,p.ctaPaddingX,p.longText,p.panelInset,p.panelRadius]);React.useEffect(()=>{if(!open)return;const el=panelScrollRef.current;if(!el)return;const ro=new ResizeObserver(()=>syncPanelScrollIndicator());ro.observe(el);syncPanelScrollIndicator();return()=>ro.disconnect();},[open,p.longText,syncPanelScrollIndicator]);const transition=p.transitionType===\"spring\"?{type:\"spring\",stiffness:p.stiffness,damping:p.damping}:{type:\"tween\",duration:p.duration};// Minimal scrollbar with green color for better visibility\nconst scrollClass=\"rpc-scroll\";// Green color: #52FFAB = rgb(82, 255, 171)\nconst scrollbarColor=\"rgba(82, 255, 171, 0.7)\";const scrollbarColorHover=\"rgba(82, 255, 171, 0.9)\";const panelScrollClass=`${scrollClass} rpc-scroll-panel`;const scrollbarCSS=`\n    .${scrollClass}{scrollbar-width:thin;scrollbar-color:${scrollbarColor} transparent;}\n    .${scrollClass}::-webkit-scrollbar{width:8px}\n    .${scrollClass}::-webkit-scrollbar-track{background:transparent}\n    .${scrollClass}::-webkit-scrollbar-thumb{background:${scrollbarColor};border-radius:8px}\n    .${scrollClass}::-webkit-scrollbar-thumb:hover{background:${scrollbarColorHover}}\n    .${scrollClass}::-webkit-scrollbar-thumb:active{background:${scrollbarColorHover}}\n    .${scrollClass}::-webkit-scrollbar-button{display:none}\n    .${scrollClass}.rpc-scroll-panel{\n      scrollbar-width:none;\n      -ms-overflow-style:none;\n      scrollbar-gutter:stable;\n    }\n    .${scrollClass}.rpc-scroll-panel::-webkit-scrollbar{\n      width:0!important;\n      height:0!important;\n      background:transparent;\n    }\n  `;const effectiveBackdrop=p.sameBackground?p.panelBg:p.backdropColor;const effectivePanelPadding=p.syncPadding?p.cardPadding:p.panelPadding;/** Match text↔scrollbar gap to panel horizontal padding; rail sits in outer strip. */const panelScrollRailOuterW=Math.max(6,p.scrollTextGap);const panelScrollTextPaddingRight=effectivePanelPadding+panelScrollRailOuterW;const fullBleedRadius=`${p.cornerRadius}px ${p.cornerRadius}px ${p.imageRadius}px ${p.imageRadius}px`;// ---- helpers for truncation ----\nconst oneLineEllipsis={overflow:\"hidden\",textOverflow:\"ellipsis\",whiteSpace:\"nowrap\",minWidth:0,maxWidth:\"100%\",display:\"block\"};const lineClamp=lines=>({display:\"-webkit-box\",WebkitLineClamp:lines,WebkitBoxOrient:\"vertical\",overflow:\"hidden\",minWidth:0,wordBreak:\"break-word\"});return /*#__PURE__*/_jsxs(\"div\",{ref:cardRef,\"data-rpc-card\":true,style:{width:\"100%\",height:p.useFitContentHeight?\"auto\":\"100%\",position:\"relative\",borderRadius:p.cornerRadius,fontFamily:p.fontFamily||\"General Sans, Inter, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif\"},children:[/*#__PURE__*/_jsx(\"style\",{children:scrollbarCSS}),/*#__PURE__*/_jsxs(motion.div,{layout:true,transition:transition,style:{height:p.useFitContentHeight?\"auto\":\"100%\",display:\"flex\",flexDirection:\"column\",background:p.cardBg,borderRadius:p.cornerRadius,boxShadow:p.showShadow?p.shadow:\"none\",overflow:\"hidden\",padding:0},children:[p.imageFullBleed&&/*#__PURE__*/_jsx(\"div\",{style:{width:\"100%\",aspectRatio:p.imageAspect,overflow:\"hidden\",borderRadius:fullBleedRadius,background:\"#111\"},children:/*#__PURE__*/_jsx(\"img\",{src:p.image,alt:p.title,loading:\"lazy\",decoding:\"async\",style:{width:\"100%\",height:\"100%\",display:\"block\",objectFit:p.objectFit,objectPosition:`${p.focalX}% ${p.focalY}%`}})}),/*#__PURE__*/_jsxs(\"div\",{ref:contentRef,\"data-rpc-content\":true,style:{padding:p.cardPadding,display:\"grid\",gap:16,marginTop:p.imageFullBleed?p.fullBleedGap:0,minWidth:0,...p.useFitContentHeight&&contentHeight>0?{minHeight:`${contentHeight}px`}:{}},children:[!p.imageFullBleed&&/*#__PURE__*/_jsx(\"div\",{style:{width:`${p.imageWidthPercent}%`,alignSelf:\"center\",aspectRatio:p.imageAspect,overflow:\"hidden\",borderRadius:p.imageRadius,background:\"#111\"},children:/*#__PURE__*/_jsx(\"img\",{src:p.image,alt:p.title,loading:\"lazy\",decoding:\"async\",style:{width:\"100%\",height:\"100%\",display:\"block\",objectFit:p.objectFit,objectPosition:`${p.focalX}% ${p.focalY}%`,borderRadius:p.imageRadius}})}),/*#__PURE__*/_jsx(\"h3\",{style:{margin:0,color:p.textPrimary,fontSize:23,lineHeight:\"1.6em\",fontWeight:600,...lineClamp(2)},title:p.title,children:p.title}),!!p.websiteUrl&&/*#__PURE__*/_jsx(\"a\",{href:p.websiteUrl,target:\"_blank\",rel:\"noopener noreferrer\",style:{color:p.websiteColor||\"#52FFAB\",fontSize:15,fontWeight:700,textDecoration:\"none\",textTransform:\"uppercase\",letterSpacing:\"0.02em\",lineHeight:\"1.6em\",...oneLineEllipsis},title:p.websiteLabel||p.websiteUrl,children:p.websiteLabel||p.websiteUrl}),!!p.badge&&/*#__PURE__*/_jsx(\"div\",{style:{color:p.badgeColor,fontSize:12,fontWeight:600,textTransform:\"uppercase\",letterSpacing:\"0.04em\",minWidth:0,...oneLineEllipsis},title:p.badge,children:p.badge}),!!p.shortText&&/*#__PURE__*/_jsx(\"p\",{style:{margin:0,color:p.textSecondary,fontSize:17,lineHeight:\"1.7em\",fontWeight:500,...lineClamp(3)},title:p.shortText,children:p.shortText}),/*#__PURE__*/_jsx(\"button\",{onClick:()=>setOpen(true),style:{border:\"none\",cursor:\"pointer\",background:p.ctaBg,color:p.ctaText,borderRadius:7,fontWeight:600,padding:`${p.ctaPaddingY}px ${p.ctaPaddingX}px`,fontSize:16,lineHeight:1.2,fontFamily:\"inherit\",width:\"100%\",maxWidth:200,alignSelf:\"start\"},children:p.ctaLabel||\"\\xc0 propos de Paul\"})]})]}),/*#__PURE__*/_jsx(AnimatePresence,{children:open&&/*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(motion.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:transition,onClick:()=>p.closeOnBackdrop&&setOpen(false),style:{position:\"absolute\",inset:0,background:effectiveBackdrop,borderRadius:p.cornerRadius}}),/*#__PURE__*/_jsxs(motion.div,{ref:panelDialogRef,role:\"dialog\",\"aria-modal\":\"true\",initial:{y:24,opacity:0,scale:.985},animate:{y:0,opacity:1,scale:1},exit:{y:24,opacity:0,scale:.985},transition:transition,onAnimationComplete:()=>measurePanelScrollSlotHeight(),style:{position:\"absolute\",inset:p.panelInset,background:p.panelBg,color:p.panelText,borderRadius:p.panelRadius,boxShadow:p.panelShadow?p.panelShadowCss:\"none\",overflow:\"hidden\",fontFamily:\"inherit\",display:\"grid\",gridTemplateRows:panelScrollSlotPx!=null?`${panelScrollSlotPx}px auto`:\"minmax(0, 1fr) auto\",gridTemplateColumns:\"1fr\",minHeight:0,height:\"100%\",padding:effectivePanelPadding,gap:panelBodyGap},children:[/*#__PURE__*/_jsxs(\"div\",{style:{minHeight:0,minWidth:0,overflow:\"hidden\",position:\"relative\"},children:[/*#__PURE__*/_jsx(\"div\",{ref:panelScrollRef,className:panelScrollClass,onScroll:syncPanelScrollIndicator,style:{position:\"absolute\",inset:0,overflowX:\"hidden\",overflowY:\"scroll\",WebkitOverflowScrolling:\"touch\",paddingRight:panelScrollTextPaddingRight,boxSizing:\"border-box\"},children:/*#__PURE__*/_jsx(\"p\",{style:{margin:0,fontSize:17,lineHeight:\"1.7em\",whiteSpace:\"pre-wrap\",fontWeight:400},children:p.longText})}),panelScrollIndicator.active&&/*#__PURE__*/_jsx(\"div\",{\"aria-hidden\":true,style:{position:\"absolute\",top:0,right:0,bottom:0,width:panelScrollRailOuterW,pointerEvents:\"none\",zIndex:2,display:\"flex\",justifyContent:\"center\"},children:/*#__PURE__*/_jsx(\"div\",{style:{position:\"relative\",width:5,height:\"100%\",maxHeight:\"100%\",borderRadius:5,background:\"rgba(82, 255, 171, 0.16)\"},children:/*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",left:0,right:0,height:panelScrollIndicator.thumbH,top:panelScrollIndicator.thumbTop,borderRadius:5,background:scrollbarColor,boxShadow:\"0 0 10px rgba(82, 255, 171, 0.35)\"}})})})]}),/*#__PURE__*/_jsx(\"button\",{ref:panelCloseBtnRef,onClick:()=>setOpen(false),style:{border:\"none\",cursor:\"pointer\",background:p.ctaBg,color:p.ctaText,borderRadius:7,fontWeight:600,padding:`${p.ctaPaddingY}px ${p.ctaPaddingX}px`,fontSize:16,lineHeight:1.2,fontFamily:\"inherit\",width:\"100%\",maxWidth:200,alignSelf:\"start\",flexShrink:0},children:p.ctaCloseLabel||\"Voir moins\"})]})]})})]});}/* -------- Controls -------- */addPropertyControls(RevealProjectCard,{fontFamily:{type:ControlType.String,title:\"Font\",defaultValue:\"General Sans\"},useFitContentHeight:{type:ControlType.Boolean,title:\"Fit Content\",defaultValue:true},cornerRadius:{type:ControlType.Number,title:\"Card Radius\",defaultValue:20,min:0,max:64},imageRadius:{type:ControlType.Number,title:\"Image Radius\",defaultValue:10,min:0,max:64},cardBg:{type:ControlType.Color,title:\"Card BG\",defaultValue:\"#101010\"},showShadow:{type:ControlType.Boolean,title:\"Card Shadow\",defaultValue:true},shadow:{type:ControlType.String,title:\"Card Shadow CSS\",defaultValue:\"0 22px 48px rgba(0,0,0,0.35)\"},cardPadding:{type:ControlType.Number,title:\"Card Padding\",defaultValue:22,min:0,max:64},image:{type:ControlType.Image,title:\"Image\"},imageFullBleed:{type:ControlType.Boolean,title:\"Image Full-width\",defaultValue:false},fullBleedGap:{type:ControlType.Number,title:\"Full-bleed Gap\",defaultValue:0,min:0,max:48},imageWidthPercent:{type:ControlType.Number,title:\"Image %\",defaultValue:100,min:40,max:100},imageAspect:{type:ControlType.String,title:\"Image Aspect\",defaultValue:\"16 / 10\"},objectFit:{type:ControlType.Enum,title:\"Image Fit\",options:[\"cover\",\"contain\"],defaultValue:\"cover\"},focalX:{type:ControlType.Number,title:\"Focal X\",defaultValue:50,min:0,max:100},focalY:{type:ControlType.Number,title:\"Focal Y\",defaultValue:50,min:0,max:100},title:{type:ControlType.String,title:\"Title\",defaultValue:\"Paul Marchand\"},badge:{type:ControlType.String,title:\"Badge\",defaultValue:\"Fondateur\"},shortText:{type:ControlType.String,title:\"Short\",defaultValue:\"Fondateur de Studio Webshift, Paul aide les entreprises \\xe0 se d\\xe9marquer en ligne gr\\xe2ce au web et au marketing digital.\"},ctaLabel:{type:ControlType.String,title:\"CTA Open\",defaultValue:\"\\xc0 propos de Paul\"},ctaCloseLabel:{type:ControlType.String,title:\"CTA Close\",defaultValue:\"Voir moins\"},textPrimary:{type:ControlType.Color,title:\"Title Color\",defaultValue:\"#FFFFFF\"},textSecondary:{type:ControlType.Color,title:\"Text Color\",defaultValue:\"#F1F1F1\"},badgeColor:{type:ControlType.Color,title:\"Badge Color\",defaultValue:\"#52FFAB\"},ctaBg:{type:ControlType.Color,title:\"CTA BG\",defaultValue:\"#52FFAB\"},ctaText:{type:ControlType.Color,title:\"CTA Text\",defaultValue:\"#000000\"},ctaPaddingY:{type:ControlType.Number,title:\"CTA Pad Y\",defaultValue:14,min:4,max:40},ctaPaddingX:{type:ControlType.Number,title:\"CTA Pad X\",defaultValue:24,min:8,max:64},// NEW — Website link controls\nwebsiteUrl:{type:ControlType.String,title:\"Website URL\",defaultValue:\"https://www.studiowebshift.com\"},websiteLabel:{type:ControlType.String,title:\"Website Label\",defaultValue:\"www.studiowebshift.com\"},websiteColor:{type:ControlType.Color,title:\"Website Color\",defaultValue:\"#52FFAB\"},longText:{type:ControlType.String,title:\"Long\",displayTextArea:true,defaultValue:\"Texte long…\"},sameBackground:{type:ControlType.Boolean,title:\"Single BG Color\",defaultValue:true},backdropColor:{type:ControlType.Color,title:\"Backdrop\",defaultValue:\"#0F0F0F\"},panelBg:{type:ControlType.Color,title:\"Panel BG\",defaultValue:\"#0F0F0F\"},panelText:{type:ControlType.Color,title:\"Panel Text\",defaultValue:\"#EDEDED\"},panelRadius:{type:ControlType.Number,title:\"Panel Radius\",defaultValue:20,min:0,max:64},syncPadding:{type:ControlType.Boolean,title:\"Sync Padding\",defaultValue:true},panelPadding:{type:ControlType.Number,title:\"Panel Padding\",defaultValue:28,min:0,max:64,hidden:props=>props.syncPadding},panelInset:{type:ControlType.Number,title:\"Panel Inset\",defaultValue:0,min:0,max:24},scrollTextGap:{type:ControlType.Number,title:\"Scroll Rail Width\",defaultValue:8,min:6,max:24},panelShadow:{type:ControlType.Boolean,title:\"Panel Shadow\",defaultValue:false},panelShadowCss:{type:ControlType.String,title:\"Panel Shadow CSS\",defaultValue:\"0 18px 40px rgba(0,0,0,.38)\"},transitionType:{type:ControlType.SegmentedEnum,title:\"Transition\",options:[\"spring\",\"tween\"],optionTitles:[\"Spring\",\"Tween\"],defaultValue:\"spring\"},duration:{type:ControlType.Number,title:\"Duration\",defaultValue:.28,hidden:p=>p.transitionType!==\"tween\"},stiffness:{type:ControlType.Number,title:\"Stiffness\",defaultValue:340,hidden:p=>p.transitionType!==\"spring\"},damping:{type:ControlType.Number,title:\"Damping\",defaultValue:32,hidden:p=>p.transitionType!==\"spring\"},closeOnBackdrop:{type:ControlType.Boolean,title:\"Backdrop Closes\",defaultValue:true}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"RevealProjectCard\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./RevealProjectCard.map"],"mappings":"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"}