{"version":3,"file":"Voice_Library_Component.CBzbeUef.mjs","names":["useMemo","useState","useRef","useCallback","_Fragment"],"sources":["https:/framerusercontent.com/modules/xp4kbADyAeeqImB7uS7D/HvR09q6zEHNEEwfdoXfC/Voice_Library_Component.js"],"sourcesContent":["// @ts-nocheck\n// import { useState, useRef, useCallback, useEffect, useMemo, memo } from \"react\"\n// import { addPropertyControls, ControlType } from \"framer\"\n// /**\n//  * VoiceRow\n//  *\n//  * One voice as a single row, for stacking on /voice-library/:slug.\n//  * Nothing is fetched until someone presses play.\n//  *\n//  * variant \"divider\" (default) draws only a bottom hairline, so a Framer stack\n//  * of these reads as one table. Put the outer border and radius on the stack.\n//  * variant \"card\" keeps the standalone bordered look.\n//  *\n//  * Collapses to two lines under ~720px: play and identity stay on line one,\n//  * chips drop to line two, curl hides.\n//  *\n//  * @framerSupportedLayoutWidth any\n//  * @framerSupportedLayoutHeight auto\n//  * @framerIntrinsicWidth 900\n//  */\n// export default function VoiceRow(props) {\n//     const {\n//         voiceId = \"andrea\",\n//         voiceName = \"Andrea\",\n//         gender = \"female\",\n//         age = \"mature\",\n//         accent = \"American\",\n//         recommendedFor = \"English\",\n//         languageCode = \"en\",\n//         script = \"Every conversation your product has is a chance to sound human.\",\n//         proxyUrl = \"\",\n//         consoleUrl = \"https://app.smallest.ai/\",\n//         showCurl = false,\n//         showLangCode = false,\n//         hideChipsOnMobile = true,\n//         variant = \"divider\",\n//         ctaLabel = \"Use voice\",\n//         radius = 10,\n//     } = props\n//     const [state, setState] = useState(\"idle\") // idle | loading | playing | error\n//     const [copied, setCopied] = useState(false)\n//     const [tip, setTip] = useState(false)\n//     const [error, setError] = useState(\"\")\n//     const audioRef = useRef(null)\n//     const urlRef = useRef(null)\n//     const unlocked = useRef(false)\n//     useEffect(\n//         () => () => {\n//             if (urlRef.current) URL.revokeObjectURL(urlRef.current)\n//         },\n//         []\n//     )\n//     // iOS only allows play() on an element already touched by a gesture, and we\n//     // await a fetch before playing, so unlock synchronously on the first click.\n//     const unlock = useCallback(() => {\n//         if (unlocked.current || !audioRef.current) return\n//         audioRef.current.src = SILENCE\n//         const p = audioRef.current.play()\n//         if (p && p.catch) p.catch(() => {})\n//         unlocked.current = true\n//     }, [])\n//     const toggle = useCallback(async () => {\n//         const a = audioRef.current\n//         if (state === \"loading\") return\n//         if (state === \"playing\") {\n//             a.pause()\n//             setState(\"idle\")\n//             return\n//         }\n//         if (urlRef.current) {\n//             a.src = urlRef.current\n//             await a.play()\n//             setState(\"playing\")\n//             return\n//         }\n//         const endpoint = String(proxyUrl || \"\").trim()\n//         // A malformed endpoint otherwise surfaces as an unreadable browser error\n//         // like a failure to parse the URL, which in practice means something was\n//         // pasted into the Proxy URL control alongside the address itself.\n//         let valid = false\n//         try {\n//             const u = new URL(endpoint)\n//             valid = u.protocol === \"http:\" || u.protocol === \"https:\"\n//         } catch {\n//             valid = false\n//         }\n//         if (!valid) {\n//             setState(\"error\")\n//             setError(\n//                 endpoint\n//                     ? \"Proxy URL is not a valid address. Check that control for stray characters.\"\n//                     : \"No proxy URL set on this component.\"\n//             )\n//             return\n//         }\n//         unlock()\n//         setState(\"loading\")\n//         setError(\"\")\n//         try {\n//             const res = await fetch(endpoint, {\n//                 method: \"POST\",\n//                 headers: { \"Content-Type\": \"application/json\" },\n//                 body: JSON.stringify({\n//                     text: script,\n//                     voice_id: voiceId,\n//                     language: languageCode,\n//                     sample_rate: 24000,\n//                 }),\n//             })\n//             if (!res.ok) {\n//                 const j = await res.json().catch(() => ({}))\n//                 throw new Error(j.error || \"Could not generate audio.\")\n//             }\n//             const url = URL.createObjectURL(await res.blob())\n//             urlRef.current = url\n//             a.src = url\n//             await a.play()\n//             setState(\"playing\")\n//         } catch (e) {\n//             setState(\"error\")\n//             setError(String(e?.message || e).slice(0, 90))\n//         }\n//     }, [state, script, voiceId, languageCode, proxyUrl, unlock])\n//     const curl = useMemo(() => {\n//         const body = JSON.stringify({\n//             text: script,\n//             voice_id: voiceId,\n//             model: \"lightning_v3.1\",\n//             language: languageCode,\n//             sample_rate: 24000,\n//             output_format: \"mp3\",\n//         })\n//         return (\n//             `curl -X POST https://api.smallest.ai/waves/v1/tts \\\\\\n` +\n//             `  -H \"Authorization: Bearer $SMALLEST_API_KEY\" \\\\\\n` +\n//             `  -H \"Content-Type: application/json\" \\\\\\n` +\n//             `  -d '${body}' \\\\\\n` +\n//             `  --output ${voiceId}.mp3`\n//         )\n//     }, [script, voiceId, languageCode])\n//     const copyCurl = useCallback(() => {\n//         navigator.clipboard?.writeText(curl).then(() => {\n//             setCopied(true)\n//             setTimeout(() => setCopied(false), 1800)\n//         })\n//     }, [curl])\n//     const playing = state === \"playing\"\n//     // Attribute chips carry the same information the dot-separated line did, but\n//     // each value becomes its own object, which is easier to scan down a column\n//     // of rows than a sentence is. Flags are gone: they read as country rather\n//     // than accent, and Windows renders them as bare letter pairs anyway.\n//     const chips = [\n//         gender && cap(gender),\n//         age && cap(age),\n//         accent && cap(accent),\n//     ].filter(Boolean)\n//     return (\n//         <>\n//             <style>{CSS}</style>\n//             <div\n//                 className={[\n//                     \"vr\",\n//                     variant === \"card\" ? \"vr--card\" : \"vr--divider\",\n//                     hideChipsOnMobile ? \"vr--hidechips\" : \"vr--wrapchips\",\n//                     playing ? \"is-playing\" : \"\",\n//                 ]\n//                     .filter(Boolean)\n//                     .join(\" \")}\n//                 style={\n//                     variant === \"card\" ? { borderRadius: radius } : undefined\n//                 }\n//             >\n//                 <div className=\"vr-playwrap\">\n//                     <button\n//                         type=\"button\"\n//                         className=\"vr-play\"\n//                         onClick={toggle}\n//                         onMouseEnter={() => setTip(true)}\n//                         onMouseLeave={() => setTip(false)}\n//                         onFocus={() => setTip(true)}\n//                         onBlur={() => setTip(false)}\n//                         aria-label={\n//                             playing\n//                                 ? `Stop ${voiceName}`\n//                                 : `Preview ${voiceName}`\n//                         }\n//                     >\n//                         {state === \"loading\" ? (\n//                             <svg\n//                                 width=\"13\"\n//                                 height=\"13\"\n//                                 viewBox=\"0 0 24 24\"\n//                                 fill=\"none\"\n//                                 stroke=\"currentColor\"\n//                                 strokeWidth=\"2.4\"\n//                             >\n//                                 <circle cx=\"12\" cy=\"12\" r=\"9\" opacity=\"0.25\" />\n//                                 <path\n//                                     d=\"M21 12a9 9 0 0 0-9-9\"\n//                                     strokeLinecap=\"round\"\n//                                 >\n//                                     <animateTransform\n//                                         attributeName=\"transform\"\n//                                         type=\"rotate\"\n//                                         from=\"0 12 12\"\n//                                         to=\"360 12 12\"\n//                                         dur=\"0.8s\"\n//                                         repeatCount=\"indefinite\"\n//                                     />\n//                                 </path>\n//                             </svg>\n//                         ) : playing ? (\n//                             <svg\n//                                 width=\"11\"\n//                                 height=\"11\"\n//                                 viewBox=\"0 0 16 16\"\n//                                 fill=\"currentColor\"\n//                             >\n//                                 <rect\n//                                     x=\"3.6\"\n//                                     y=\"2.6\"\n//                                     width=\"3.3\"\n//                                     height=\"10.8\"\n//                                     rx=\"1\"\n//                                 />\n//                                 <rect\n//                                     x=\"9.1\"\n//                                     y=\"2.6\"\n//                                     width=\"3.3\"\n//                                     height=\"10.8\"\n//                                     rx=\"1\"\n//                                 />\n//                             </svg>\n//                         ) : (\n//                             <svg\n//                                 width=\"12\"\n//                                 height=\"12\"\n//                                 viewBox=\"0 0 16 16\"\n//                                 fill=\"currentColor\"\n//                             >\n//                                 <path d=\"M5 3.2c0-.6.7-1 1.2-.6l6.2 4.2c.5.3.5 1 0 1.3L6.2 12.4c-.5.4-1.2 0-1.2-.6z\" />\n//                             </svg>\n//                         )}\n//                     </button>\n//                     {tip && (\n//                         <span className=\"vr-tip\">\n//                             {playing ? \"Stop\" : \"Preview voice\"}\n//                         </span>\n//                     )}\n//                 </div>\n//                 {/* Name over id rather than side by side: the id is a qualifier,\n//                     and stacking lets the eye run down one column of names. */}\n//                 <div className=\"vr-id\">\n//                     <span className=\"vr-name\">{cap(voiceName)}</span>\n//                     <code className=\"vr-code\">{voiceId}</code>\n//                 </div>\n//                 <div className=\"vr-chips\">\n//                     {state === \"error\" ? (\n//                         <span className=\"vr-err\" role=\"alert\">\n//                             {error}\n//                         </span>\n//                     ) : (\n//                         <>\n//                             {chips.map((c) => (\n//                                 <span key={c} className=\"vr-chip\">\n//                                     {c}\n//                                 </span>\n//                             ))}\n//                             {showLangCode && languageCode && (\n//                                 <code className=\"vr-lang\">{languageCode}</code>\n//                             )}\n//                         </>\n//                     )}\n//                 </div>\n//                 <div className=\"vr-actions\">\n//                     {recommendedFor && (\n//                         <span className=\"vr-best\">\n//                             Best for {recommendedFor}\n//                         </span>\n//                     )}\n//                     {showCurl && (\n//                         <button\n//                             type=\"button\"\n//                             className=\"vr-curl\"\n//                             onClick={copyCurl}\n//                             title=\"Copy the curl request for this voice\"\n//                         >\n//                             <svg\n//                                 width=\"13\"\n//                                 height=\"13\"\n//                                 viewBox=\"0 0 16 16\"\n//                                 fill=\"none\"\n//                                 stroke=\"currentColor\"\n//                                 strokeWidth=\"1.3\"\n//                                 strokeLinecap=\"round\"\n//                                 strokeLinejoin=\"round\"\n//                             >\n//                                 <rect\n//                                     x=\"5.4\"\n//                                     y=\"5.4\"\n//                                     width=\"8.2\"\n//                                     height=\"8.2\"\n//                                     rx=\"1.6\"\n//                                 />\n//                                 <path d=\"M10.6 3.4a1.6 1.6 0 0 0-1.6-1H4a1.6 1.6 0 0 0-1.6 1.6v5a1.6 1.6 0 0 0 1 1.5\" />\n//                             </svg>\n//                             {copied ? \"copied\" : \"curl\"}\n//                         </button>\n//                     )}\n//                     <a\n//                         className=\"vr-use\"\n//                         href={`${consoleUrl}?q=${encodeURIComponent(voiceId)}`}\n//                         target=\"_blank\"\n//                         rel=\"noopener noreferrer\"\n//                     >\n//                         {ctaLabel}\n//                     </a>\n//                 </div>\n//                 <audio\n//                     ref={audioRef}\n//                     preload=\"none\"\n//                     onEnded={() => setState(\"idle\")}\n//                     style={{ display: \"none\" }}\n//                 />\n//             </div>\n//         </>\n//     )\n// }\n// /* ------------------------------------------------------------------ helpers */\n// const G = {\n//     50: \"#FAFAFA\",\n//     75: \"#F7F7F7\",\n//     100: \"#F0F0F0\",\n//     200: \"#E4E4E4\",\n//     300: \"#A8A8A8\",\n//     400: \"#767676\",\n//     500: \"#6B6B6B\",\n// }\n// const MINT_BG = \"#E6F4EC\"\n// const MINT_FG = \"#0F6B45\"\n// const MONO = \"ui-monospace, SFMono-Regular, Menlo, monospace\"\n// /**\n//  * A <style> block rather than inline styles, so the row can carry a media query\n//  * and real :hover / :focus-visible states. Framer inlines this per instance;\n//  * identical rules are harmless.\n//  */\n// const CSS = `\n// .vr {\n//   display: flex; align-items: center; gap: 14px;\n//   padding: 12px 16px; background: #fff;\n//   transition: background 160ms ease;\n// }\n// .vr--divider { border-top: 1px dotted ${G[200]}; }\n// .vr--card { border: 2px dotted ${G[200]}; }\n// .vr:hover { background: ${G[50]}; }\n// .vr.is-playing { background: ${G[75]}; }\n// .vr-playwrap { position: relative; flex: 0 0 auto; }\n// .vr-play {\n//   width: 32px; height: 32px; border-radius: 50%;\n//   display: grid; place-items: center; padding: 0; cursor: pointer;\n//   background: #fff; color: #111; border: 1px solid ${G[200]};\n//   transition: background 140ms ease, color 140ms ease, border-color 140ms ease;\n// }\n// .vr-play:hover { border-color: ${G[300]}; }\n// .vr.is-playing .vr-play { background: #111; color: #fff; border-color: #111; }\n// .vr-play:focus-visible, .vr-curl:focus-visible, .vr-use:focus-visible {\n//   outline: 2px solid #111; outline-offset: 2px;\n// }\n// .vr-tip {\n//   position: absolute; top: calc(100% + 6px); left: 0; z-index: 5;\n//   white-space: nowrap; background: #111; color: #fff;\n//   font-size: 11.5px; line-height: 1; padding: 6px 8px; border-radius: 5px;\n//   pointer-events: none;\n// }\n// /* Content width with a floor, not a reserved column, so the chips sit directly\n//    beside the name. The floor keeps short names from letting chips crowd the id. */\n// .vr-id {\n//   display: flex; flex-direction: column; gap: 1px;\n//   flex: 0 0 auto; min-width: 96px; max-width: 240px;\n// }\n// .vr-name {\n//   font-size: 15px; font-weight: 600; color: #111; line-height: 1.3;\n//   white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n// }\n// .vr-code {\n//   font-family: ${MONO}; font-size: 11.5px; color: ${G[300]}; line-height: 1.3;\n//   white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n// }\n// .vr-chips { display: flex; flex-wrap: nowrap; align-items: center; gap: 6px; flex: 0 1 auto; min-width: 0; overflow: hidden; }\n// .vr-chip {\n//   font-size: 12px; line-height: 1; padding: 6px 10px; border-radius: 6px;\n//   background: ${G[100]}; color: ${G[500]}; white-space: nowrap;\n// }\n// .vr-lang {\n//   font-family: ${MONO}; font-size: 10.5px; letter-spacing: 0.02em;\n//   padding: 3px 6px; border-radius: 4px; background: ${G[100]}; color: ${G[400]};\n// }\n// .vr-err { font-size: 12.5px; color: #C0392B; }\n// .vr-actions { display: flex; align-items: center; gap: 10px; flex: 0 0 auto; margin-left: auto; }\n// .vr-best {\n//   font-size: 12.5px; font-weight: 500; line-height: 1;\n//   padding: 7px 11px; border-radius: 6px;\n//   background: whitesmoke; color: grey; white-space: nowrap;\n// }\n// .vr-curl {\n//   display: inline-flex; align-items: center; gap: 6px;\n//   font-family: ${MONO}; font-size: 12px; color: ${G[500]};\n//   background: #fff; border: 1px dotted ${G[200]}; border-radius: 7px;\n//   padding: 6px 10px; cursor: pointer;\n//   transition: color 140ms ease, border-color 140ms ease;\n// }\n// .vr-curl:hover { color: #111; border-color: ${G[300]}; }\n// .vr-use {\n//   display: inline-flex; align-items: center;\n//   font-size: 13px; font-weight: 500; white-space: nowrap;\n//   color: #fff; background: #111; border-radius: 8px;\n//   padding: 8px 14px; text-decoration: none;\n//   transition: background 140ms ease;\n// }\n// .vr-use:hover { background: #2E2E2E; }\n// /* Below 720px the attribute chips are dropped rather than wrapped. Gender, age\n//    and accent are the least load-bearing values on a phone; language and the CTA\n//    are not. Keeping one line beats gaining a second one. Set Hide Chips On Mobile\n//    to off to wrap them instead. */\n// @media (max-width: 720px) {\n//   .vr { gap: 10px; padding: 12px 14px; }\n//   .vr-id { flex: 1 1 auto; max-width: none; }\n//   .vr-curl { display: none; }\n//   .vr-actions { gap: 8px; }\n//   .vr--hidechips .vr-chips { display: none; }\n//   .vr-best { display: none; }\n//   .vr--wrapchips { flex-wrap: wrap; row-gap: 10px; }\n//   .vr--wrapchips .vr-chips { flex-basis: 100%; order: 3; padding-left: 42px; }\n// }\n// /* Very narrow: shrink the controls rather than dropping the language, which is\n//    the one metadata value a phone visitor still needs. */\n// @media (max-width: 420px) {\n//   .vr { gap: 8px; padding: 11px 12px; }\n//   .vr-name { font-size: 14px; }\n//   .vr-best { font-size: 11.5px; padding: 6px 8px; }\n//   .vr-use { font-size: 12px; padding: 7px 11px; }\n// }\n// @media (prefers-reduced-motion: reduce) {\n//   .vr, .vr-play, .vr-curl, .vr-use { transition: none; }\n// }\n// `\n// const SILENCE =\n//     \"data:audio/mpeg;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjI5LjEwMAAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAAACAAABIADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD/////////////////////////////////AAAAAExhdmM1OC41NAAAAAAAAAAAAAAAACQAAAAAAAAAAAEg\"\n// const cap = (t) => (t ? t.charAt(0).toUpperCase() + t.slice(1) : \"\")\nimport{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";const ORB_GRADIENTS=[\"radial-gradient(circle at 72% 78%, #FFDC68 0 8%, transparent 43%), linear-gradient(135deg, #91BE95 0%, #527A61 56%, #635A49 100%)\",\"radial-gradient(circle at 30% 76%, #FFB86C 0 7%, transparent 42%), linear-gradient(135deg, #8EC5FC 0%, #7A80D8 58%, #4B456E 100%)\",\"radial-gradient(circle at 72% 28%, #FFD6E7 0 8%, transparent 40%), linear-gradient(135deg, #EFA8C8 0%, #A85F8F 54%, #5C365B 100%)\",\"radial-gradient(circle at 28% 24%, #FFF0A6 0 8%, transparent 41%), linear-gradient(135deg, #F4A261 0%, #D66D4C 55%, #6C3B3B 100%)\",\"radial-gradient(circle at 75% 70%, #A7F3D0 0 8%, transparent 42%), linear-gradient(135deg, #67E8F9 0%, #3B82F6 56%, #314A78 100%)\",\"radial-gradient(circle at 28% 72%, #E9D5FF 0 8%, transparent 42%), linear-gradient(135deg, #C4B5FD 0%, #8B5CF6 55%, #4C3575 100%)\",\"radial-gradient(circle at 70% 26%, #FDE68A 0 8%, transparent 40%), linear-gradient(135deg, #84CC16 0%, #4D7C0F 57%, #3F4D2D 100%)\",\"radial-gradient(circle at 26% 28%, #BAE6FD 0 8%, transparent 42%), linear-gradient(135deg, #22D3EE 0%, #0F766E 57%, #284D4C 100%)\",\"radial-gradient(circle at 72% 74%, #FBCFE8 0 8%, transparent 42%), linear-gradient(135deg, #FB7185 0%, #BE185D 56%, #5F3046 100%)\",\"radial-gradient(circle at 28% 74%, #FED7AA 0 8%, transparent 42%), linear-gradient(135deg, #F59E0B 0%, #B45309 56%, #5F4128 100%)\"];const orbGradient=(id,index=0)=>{const value=String(id||\"voice\");let hash=2166136261;for(let index=0;index<value.length;index+=1){hash^=value.charCodeAt(index);hash=Math.imul(hash,16777619);}const offset=(hash>>>0)%ORB_GRADIENTS.length;return ORB_GRADIENTS[(offset+index)%ORB_GRADIENTS.length];};const getDescription=voice=>{if(voice.description)return voice.description;return[voice.accent,cap(voice.gender),cap(voice.age)].filter(Boolean).join(\" \\xb7 \");};const FLAGPACK_ASSETS={BR:{src:\"https://framerusercontent.com/images/moNbAN97AbjQoVilRZcrbkNDIC8.svg\",alt:\"Brazil\"},FI:{src:\"https://framerusercontent.com/images/HwnmzEFh15BccHygw8TdU6jyg.svg\",alt:\"Finland\"},FR:{src:\"https://framerusercontent.com/images/fU0yCO57Rl6mc8ZlA7lraBOXpbs.svg\",alt:\"France\"},GR:{src:\"https://framerusercontent.com/images/MVJAU8MSlpWIMRWy4QTIDNO0qM.svg\",alt:\"Greece\"},IN:{src:\"https://framerusercontent.com/images/rVWDMGRfRLtb7boeM0kKeIURbE.svg\",alt:\"India\"},ID:{src:\"https://framerusercontent.com/images/LSLP5DF87Rv8LShyO56TfsO9g.svg\",alt:\"Indonesia\"},JP:{src:\"https://framerusercontent.com/images/qja1MwugaclvQrAXenFa7ohGIfY.svg\",alt:\"Japan\"},NL:{src:\"https://framerusercontent.com/images/yymJgrOUypCzPpIIM0PTYlrPlo.svg\",alt:\"Netherlands\"},RU:{src:\"https://framerusercontent.com/images/QTIktcAaG9CicsU6mULYv4wtqHM.svg\",alt:\"Russia\"},SE:{src:\"https://framerusercontent.com/images/hj6ClG5I5Tmsl2ZCM5nIkY.svg\",alt:\"Sweden\"},TR:{src:\"https://framerusercontent.com/images/egqMBv0VEPl6WpD3GSXTyVnomc.svg\",alt:\"Turkey\"},GB:{src:\"https://framerusercontent.com/images/lRZwD21Qc397yclL7pJG3qrf4U.svg\",alt:\"United Kingdom\"},US:{src:\"https://framerusercontent.com/images/0w1CAHvD5eJpcwl7bn8T2kMyeU.svg\",alt:\"United States\"}};const normalizeCountryCode=value=>{const code=String(value||\"\").trim().toUpperCase();if(code===\"GB-UKM\"||code===\"UK\")return\"GB\";return/^[A-Z]{2}$/.test(code)?code:\"\";};const getCountryCode=voice=>{const explicit=normalizeCountryCode(voice.countryCode||voice.flagCode);if(explicit&&FLAGPACK_ASSETS[explicit])return explicit;const code=String(voice.code||\"\").trim().toLowerCase();const accent=String(voice.accent||\"\").trim().toLowerCase();if([\"hi\",\"bn\",\"gu\",\"kn\",\"ml\",\"mr\",\"pa\",\"ta\",\"te\",\"ur\"].includes(code)||accent.includes(\"indian\"))return\"IN\";if(accent.includes(\"british\")||accent.includes(\"english\"))return\"GB\";if(accent.includes(\"australian\"))return\"AU\";if(accent.includes(\"brazilian\"))return\"BR\";if(accent.includes(\"american\"))return\"US\";if(accent.includes(\"finnish\"))return\"FI\";if(accent.includes(\"french\"))return\"FR\";if(accent.includes(\"greek\"))return\"GR\";if(accent.includes(\"indonesian\"))return\"ID\";if(accent.includes(\"japanese\"))return\"JP\";if(accent.includes(\"dutch\"))return\"NL\";if(accent.includes(\"russian\"))return\"RU\";if(accent.includes(\"swedish\"))return\"SE\";if(accent.includes(\"turkish\"))return\"TR\";const languageCountries={de:\"DE\",el:\"GR\",en:\"US\",es:\"ES\",fi:\"FI\",fr:\"FR\",id:\"ID\",it:\"IT\",ja:\"JP\",ko:\"KR\",nl:\"NL\",pl:\"PL\",pt:\"PT\",ru:\"RU\",sv:\"SE\",tr:\"TR\",zh:\"CN\"};return languageCountries[code]||\"\";};const VoiceFlag=/*#__PURE__*/memo(function VoiceFlag({voice,index}){const countryCode=getCountryCode(voice);const flag=FLAGPACK_ASSETS[countryCode];if(!flag){return /*#__PURE__*/_jsx(\"span\",{className:\"vr-flag-fallback\",role:\"img\",\"aria-label\":voice.language?voice.language+\" language\":\"Language\",children:/*#__PURE__*/_jsxs(\"svg\",{width:\"20\",height:\"15\",viewBox:\"0 0 20 15\",fill:\"none\",\"aria-hidden\":\"true\",children:[/*#__PURE__*/_jsx(\"rect\",{x:\".5\",y:\".5\",width:\"19\",height:\"14\",rx:\"2.5\",stroke:\"currentColor\"}),/*#__PURE__*/_jsx(\"path\",{d:\"M3.5 7.5h13M10 1c2 1.75 3 3.92 3 6.5S12 12.25 10 14M10 1C8 2.75 7 4.92 7 7.5S8 12.25 10 14\",stroke:\"currentColor\",strokeLinecap:\"round\"})]})});}return /*#__PURE__*/_jsx(\"img\",{className:\"vr-flag\",src:flag.src,width:\"20\",height:\"15\",alt:flag.alt+\" flag\",decoding:\"async\",loading:index<5?\"eager\":\"lazy\"});});// addPropertyControls(VoiceRow, {\n//     voiceId: {\n//         type: ControlType.String,\n//         title: \"Voice ID\",\n//         defaultValue: \"andrea\",\n//     },\n//     voiceName: {\n//         type: ControlType.String,\n//         title: \"Name\",\n//         defaultValue: \"Andrea\",\n//     },\n//     gender: {\n//         type: ControlType.String,\n//         title: \"Gender\",\n//         defaultValue: \"female\",\n//     },\n//     age: { type: ControlType.String, title: \"Age\", defaultValue: \"mature\" },\n//     accent: {\n//         type: ControlType.String,\n//         title: \"Accent\",\n//         defaultValue: \"American\",\n//     },\n//     recommendedFor: {\n//         type: ControlType.String,\n//         title: \"Best for\",\n//         defaultValue: \"English\",\n//     },\n//     languageCode: {\n//         type: ControlType.String,\n//         title: \"Language code\",\n//         defaultValue: \"en\",\n//     },\n//     script: {\n//         type: ControlType.String,\n//         title: \"Script\",\n//         displayTextArea: true,\n//         defaultValue: \"\",\n//     },\n//     proxyUrl: {\n//         type: ControlType.String,\n//         title: \"Proxy URL\",\n//         defaultValue: \"\",\n//     },\n//     consoleUrl: {\n//         type: ControlType.String,\n//         title: \"Console URL\",\n//         defaultValue: \"https://app.smallest.ai/\",\n//     },\n//     ctaLabel: {\n//         type: ControlType.String,\n//         title: \"CTA label\",\n//         defaultValue: \"Use voice\",\n//     },\n//     variant: {\n//         type: ControlType.Enum,\n//         title: \"Variant\",\n//         options: [\"divider\", \"card\"],\n//         optionTitles: [\"Divider row\", \"Standalone card\"],\n//         defaultValue: \"divider\",\n//         description:\n//             \"Divider suits a stack. Put the outer border on the stack.\",\n//     },\n//     showCurl: {\n//         type: ControlType.Boolean,\n//         title: \"Show curl\",\n//         defaultValue: true,\n//     },\n//     hideChipsOnMobile: {\n//         type: ControlType.Boolean,\n//         title: \"Hide chips on mobile\",\n//         defaultValue: true,\n//         description: \"Off wraps them to a second line instead.\",\n//     },\n//     showLangCode: {\n//         type: ControlType.Boolean,\n//         title: \"Show language code\",\n//         defaultValue: false,\n//         description: \"Redundant next to Best for. Off by default.\",\n//     },\n//     radius: {\n//         type: ControlType.Number,\n//         title: \"Radius\",\n//         defaultValue: 10,\n//         min: 0,\n//         max: 24,\n//         hidden: (p) => p.variant !== \"card\",\n//     },\n// })\nimport{useState,useRef,useCallback,useEffect,useMemo,memo}from\"react\";import{addPropertyControls,ControlType}from\"framer\";/**\n * VoiceRowList\n *\n * Your VoiceRow, rendered from a single Voices JSON field instead of one\n * instance per voice. Bind voicesJson to the page's \"Voices JSON\" field and\n * that is the only binding needed: each row reads its own id, language and\n * script from the array, so nothing can point at the wrong slot.\n *\n * The CSS block is your edited VoiceRow stylesheet, unchanged: dotted borders,\n * border-top dividers, the whitesmoke Best for chip, Best for hidden under\n * 720px. Markup and behaviour are unchanged too, except that one audio element\n * is shared across rows so starting a row stops whichever was playing.\n *\n * Voices JSON, an array of:\n *   { \"id\": \"finn\", \"name\": \"Finn\", \"gender\": \"male\", \"age\": \"young\",\n *     \"accent\": \"German\", \"language\": \"German\", \"code\": \"de\",\n *     \"countryCode\": \"DE\", \"script\": \"...\" }\n *\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight auto\n * @framerIntrinsicWidth 900\n */const VOICE_AVATAR=\"https://framerusercontent.com/images/rlg9MNyFQ2VS62luxd0WrzPDfrY.png\";const VERIFIED_ICON=\"https://framerusercontent.com/images/BiI1TreLlSmG2qkEmVMKELPges.png\";const COPY_ICON=\"https://framerusercontent.com/images/nlNW3D96718WkjLVAY23Bob0sM.png\";export default function VoiceRowList(props){const{voicesJson=DEFAULT_JSON,proxyUrl=\"\",consoleUrl=\"https://app.smallest.ai/\",showCurl=false,showLangCode=false,variant=\"divider\",ctaLabel=\"Use voice\",radius=12}=props;const voices=useMemo(()=>{try{const v=typeof voicesJson===\"string\"?JSON.parse(voicesJson):voicesJson;return Array.isArray(v)?v.filter(x=>x&&x.id):[];}catch{return null// signals a parse error rather than an empty list\n;}},[voicesJson]);const[activeId,setActiveId]=useState(null);const[loadingId,setLoadingId]=useState(null);const[errors,setErrors]=useState({});const[tipId,setTipId]=useState(null);const[copiedId,setCopiedId]=useState(null);const audioRef=useRef(null);const cache=useRef(new Map);const unlocked=useRef(false);useEffect(()=>()=>cache.current.forEach(u=>URL.revokeObjectURL(u)),[]);// iOS only allows play() on an element already touched by a gesture, and we\n// await a fetch before playing, so unlock synchronously on the first click.\nconst unlock=useCallback(()=>{if(unlocked.current||!audioRef.current)return;audioRef.current.src=SILENCE;const p=audioRef.current.play();if(p&&p.catch)p.catch(()=>{});unlocked.current=true;},[]);const toggle=useCallback(async v=>{const a=audioRef.current;if(loadingId)return;if(activeId===v.id){a.pause();setActiveId(null);return;}const hit=cache.current.get(v.id);if(hit){a.src=hit;await a.play();setActiveId(v.id);return;}const endpoint=String(proxyUrl||\"\").trim();// A malformed endpoint otherwise surfaces as an unreadable browser\n// error, which in practice means something was pasted into the Proxy\n// URL control alongside the address itself.\nlet valid=false;try{const u=new URL(endpoint);valid=u.protocol===\"http:\"||u.protocol===\"https:\";}catch{valid=false;}if(!valid){setErrors(e=>({...e,[v.id]:endpoint?\"Proxy URL is not a valid address. Check that control for stray characters.\":\"No proxy URL set on this component.\"}));return;}unlock();setLoadingId(v.id);setErrors(e=>({...e,[v.id]:\"\"}));try{const res=await fetch(endpoint,{method:\"POST\",headers:{\"Content-Type\":\"application/json\"},body:JSON.stringify({text:v.script||\"\",voice_id:v.id,language:v.code||\"en\",sample_rate:24e3})});if(!res.ok){const j=await res.json().catch(()=>({}));throw new Error(j.error||\"Could not generate audio.\");}const url=URL.createObjectURL(await res.blob());cache.current.set(v.id,url);a.src=url;await a.play();setActiveId(v.id);}catch(e){setErrors(er=>({...er,[v.id]:String(e?.message||e).slice(0,90)}));}finally{setLoadingId(null);}},[activeId,loadingId,proxyUrl,unlock]);const copyCurl=useCallback(v=>{const body=JSON.stringify({text:v.script||\"\",voice_id:v.id,model:MODEL,language:v.code||\"en\",sample_rate:24e3,output_format:\"mp3\"});const cmd=`curl -X POST https://api.smallest.ai/waves/v1/tts \\\\\n`+`  -H \"Authorization: Bearer $SMALLEST_API_KEY\" \\\\\n`+`  -H \"Content-Type: application/json\" \\\\\n`+`  -d '${body}' \\\\\n`+`  --output ${v.id}.mp3`;navigator.clipboard?.writeText(cmd).then(()=>{setCopiedId(v.id);setTimeout(()=>setCopiedId(null),1800);});},[]);if(voices===null){return /*#__PURE__*/_jsxs(\"div\",{className:\"vr-notice\",children:[/*#__PURE__*/_jsx(\"style\",{children:CSS}),\"Voices JSON could not be parsed. Check for a trailing comma or a smart quote.\"]});}if(!voices.length){return /*#__PURE__*/_jsxs(\"div\",{className:\"vr-notice\",children:[/*#__PURE__*/_jsx(\"style\",{children:CSS}),\"No voices yet. Add an array to the Voices JSON field.\"]});}return /*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(\"style\",{children:CSS}),/*#__PURE__*/_jsx(\"div\",{className:\"vr-list\",children:voices.map((v,index)=>{const playing=activeId===v.id;const loading=loadingId===v.id;const err=errors[v.id];const description=getDescription(v);return /*#__PURE__*/_jsxs(\"div\",{className:[\"vr\",variant===\"card\"?\"vr--card\":\"vr--divider\",playing?\"is-playing\":\"\"].filter(Boolean).join(\" \"),style:variant===\"card\"?{borderRadius:radius}:undefined,children:[/*#__PURE__*/_jsxs(\"div\",{className:\"vr-identity\",children:[/*#__PURE__*/_jsxs(\"button\",{type:\"button\",className:\"vr-avatar\",style:{background:orbGradient(v.id,index)},onClick:()=>toggle(v),\"aria-label\":playing?\"Stop \"+v.name:\"Preview \"+v.name,children:[/*#__PURE__*/_jsx(\"span\",{className:\"vr-orb-shade\",\"aria-hidden\":\"true\"}),loading?/*#__PURE__*/_jsx(\"span\",{className:\"vr-spinner\",\"aria-hidden\":\"true\"}):playing?/*#__PURE__*/_jsxs(\"span\",{className:\"vr-pause\",\"aria-hidden\":\"true\",children:[/*#__PURE__*/_jsx(\"i\",{}),/*#__PURE__*/_jsx(\"i\",{})]}):/*#__PURE__*/_jsx(\"span\",{className:\"vr-play-icon\",\"aria-hidden\":\"true\"})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"vr-copy\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"vr-name-line\",children:[/*#__PURE__*/_jsx(\"span\",{className:\"vr-name\",children:cap(v.name)}),v.verified!==false&&/*#__PURE__*/_jsx(\"img\",{className:\"vr-verified\",src:VERIFIED_ICON,alt:\"Verified\"})]}),/*#__PURE__*/_jsx(\"span\",{className:\"vr-description\",children:description}),err&&/*#__PURE__*/_jsx(\"span\",{className:\"vr-err\",role:\"alert\",children:err})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"vr-meta\",children:[v.gender&&/*#__PURE__*/_jsx(\"span\",{className:\"vr-gender\",\"aria-label\":cap(v.gender),children:String(v.gender).toLowerCase().startsWith(\"f\")?/*#__PURE__*/_jsxs(\"svg\",{width:\"20\",height:\"20\",viewBox:\"0 0 20 20\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\",\"aria-hidden\":\"true\",children:[/*#__PURE__*/_jsx(\"circle\",{cx:\"9.99967\",cy:\"7.08317\",r:\"4.79167\",stroke:\"#3B82F6\",strokeWidth:\"1.5\",strokeLinecap:\"round\",strokeLinejoin:\"round\"}),/*#__PURE__*/_jsx(\"path\",{d:\"M10 12.0835V17.7085\",stroke:\"#3B82F6\",strokeWidth:\"1.5\",strokeLinecap:\"round\",strokeLinejoin:\"round\"}),/*#__PURE__*/_jsx(\"path\",{d:\"M7.29199 15.2085L12.7087 15.2085\",stroke:\"#3B82F6\",strokeWidth:\"1.5\",strokeLinecap:\"round\",strokeLinejoin:\"round\"})]}):/*#__PURE__*/_jsxs(\"svg\",{width:\"20\",height:\"20\",viewBox:\"0 0 20 20\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\",\"aria-hidden\":\"true\",children:[/*#__PURE__*/_jsx(\"circle\",{cx:\"7.49967\",cy:\"12.5002\",r:\"4.79167\",stroke:\"#3B82F6\",strokeWidth:\"1.5\",strokeLinecap:\"round\",strokeLinejoin:\"round\"}),/*#__PURE__*/_jsx(\"path\",{d:\"M12.292 3.125H16.8753V7.70833\",stroke:\"#3B82F6\",strokeWidth:\"1.5\",strokeLinecap:\"round\",strokeLinejoin:\"round\"}),/*#__PURE__*/_jsx(\"path\",{d:\"M11.042 8.95833L16.2503 3.75\",stroke:\"#3B82F6\",strokeWidth:\"1.5\",strokeLinecap:\"round\",strokeLinejoin:\"round\"})]})}),/*#__PURE__*/_jsxs(\"span\",{className:\"vr-language\",children:[/*#__PURE__*/_jsx(VoiceFlag,{voice:v,index:index}),/*#__PURE__*/_jsx(\"span\",{children:v.language||v.code||\"Language\"}),showLangCode&&v.code&&/*#__PURE__*/_jsx(\"code\",{className:\"vr-lang-code\",children:v.code})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"vr-actions\",children:[showCurl&&/*#__PURE__*/_jsxs(\"button\",{type:\"button\",className:\"vr-curl\",onClick:()=>copyCurl(v),title:\"Copy the curl request for this voice\",children:[/*#__PURE__*/_jsx(\"img\",{src:COPY_ICON,alt:\"\"}),copiedId===v.id?\"copied\":\"curl\"]}),/*#__PURE__*/_jsx(\"a\",{className:\"vr-use\",href:\"https://app.smallest.ai/\",target:\"_blank\",rel:\"noopener noreferrer\",children:ctaLabel}),/*#__PURE__*/_jsx(\"button\",{type:\"button\",className:\"vr-listen\",onClick:()=>toggle(v),disabled:loading,\"aria-label\":loading?\"Loading \"+v.name:playing?\"Pause \"+v.name:\"Listen to \"+v.name,children:loading?\"Loading…\":playing?\"Pause\":\"Listen\"})]})]},v.id);})}),/*#__PURE__*/_jsx(\"audio\",{ref:audioRef,preload:\"none\",onEnded:()=>setActiveId(null),style:{display:\"none\"}})]});}/* ------------------------------------------------------------------ helpers */const G={50:\"#FAFAFA\",75:\"#F7F7F7\",100:\"#F0F0F0\",200:\"#E4E4E4\",300:\"#A8A8A8\",400:\"#767676\",500:\"#6B6B6B\"};const MONO=\"ui-monospace, SFMono-Regular, Menlo, monospace\";// Every voice in the catalog is Pro, so the curl snippet must name the Pro\n// model. Pairing a Pro voice with lightning_v3.1 returns hallucinated audio and\n// the API does not reject it.\nconst MODEL=\"lightning_v3.1_pro\";/**\n * Your edited VoiceRow stylesheet, carried over unchanged: dotted borders,\n * border-top dividers, the whitesmoke Best for chip, Best for hidden under\n * 720px. Only .vr-list and .vr-notice are added, for the wrapper and the\n * parse-error state.\n */const CSS=`\n.vr-list {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  gap: 4px;\n  overflow: visible;\n  font-family: \"Aeonik\", sans-serif;\n  color: #010101;\n}\n.vr-notice {\n  border: 1px solid #E5E5E5;\n  border-radius: 12px;\n  padding: 20px;\n  font-family: \"Aeonik\", sans-serif;\n  font-size: 14px;\n  line-height: 20px;\n  color: #737373;\n}\n.vr {\n  position: relative;\n  isolation: isolate;\n  display: flex;\n  align-items: center;\n  gap: 40px;\n  width: 100%;\n  min-width: 0;\n  padding: 12px 0;\n  box-sizing: border-box;\n  border-radius: 12px;\n  background: #FFFFFF;\n  transition: background 160ms ease;\n}\n.vr--divider { border: 0; background: transparent; }\n.vr--divider::before {\n  content: \"\";\n  position: absolute;\n  inset: 0 -16px;\n  z-index: -1;\n  border-radius: 20px;\n  background: #FAFAFA;\n  opacity: 0;\n  pointer-events: none;\n  transition: opacity 160ms ease;\n}\n.vr--card { border: 1px solid #E5E5E5; }\n@media (hover: hover) and (pointer: fine) {\n  .vr--divider:hover::before { opacity: 1; }\n  .vr--card:hover { background: #FAFAFA; border-radius: 20px; }\n}\n.vr--divider.is-playing { background: transparent; }\n.vr--card.is-playing { background: #FFFFFF; }\n\n.vr-identity {\n  display: flex;\n  align-items: center;\n  gap: 16px;\n  flex: 1 1 auto;\n  min-width: 0;\n}\n.vr-avatar {\n  position: relative;\n  flex: 0 0 40px;\n  width: 40px;\n  height: 40px;\n  padding: 0;\n  overflow: hidden;\n  border: 0;\n  border-radius: 50%;\n  cursor: pointer;\n  isolation: isolate;\n  box-shadow: inset 0 0 0 1px rgb(1 1 1 / 4%);\n}\n.vr-orb-shade {\n  position: absolute;\n  inset: 0;\n  z-index: 0;\n  border-radius: inherit;\n  background: radial-gradient(circle at 35% 24%, rgb(255 255 255 / 24%), transparent 42%);\n  transition: background 160ms ease;\n}\n.vr-avatar::after {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  z-index: 1;\n  border-radius: inherit;\n  background: rgb(1 1 1 / 0%);\n  transition: background 160ms ease;\n}\n@media (hover: hover) and (pointer: fine) {\n  .vr:hover .vr-avatar::after { background: rgb(1 1 1 / 24%); }\n}\n.vr.is-playing .vr-avatar::after { background: rgb(1 1 1 / 44%); }\n.vr-play-icon {\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  z-index: 2;\n  width: 0;\n  height: 0;\n  border-top: 7px solid transparent;\n  border-bottom: 7px solid transparent;\n  border-left: 10px solid #FFFFFF;\n  opacity: 0;\n  transform: translate(-38%, -50%) scale(.8);\n  transition: opacity 140ms ease, transform 140ms ease;\n}\n.vr-avatar:focus-visible .vr-play-icon {\n  opacity: 1;\n  transform: translate(-38%, -50%) scale(1);\n}\n@media (hover: hover) and (pointer: fine) {\n  .vr:hover .vr-play-icon {\n    opacity: 1;\n    transform: translate(-38%, -50%) scale(1);\n  }\n}\n.vr-pause {\n  position: absolute;\n  inset: 0;\n  z-index: 2;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: 5px;\n}\n.vr-pause i { display: block; width: 5px; height: 18px; border-radius: 3px; background: #FFFFFF; }\n.vr-spinner {\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  z-index: 2;\n  width: 16px;\n  height: 16px;\n  box-sizing: border-box;\n  border: 2px solid rgb(255 255 255 / 38%);\n  border-top-color: #FFFFFF;\n  border-radius: 50%;\n  transform: translate(-50%, -50%);\n  animation: vr-spin .72s linear infinite;\n}\n@keyframes vr-spin { to { transform: translate(-50%, -50%) rotate(360deg); } }\n.vr-copy { display: flex; flex-direction: column; min-width: 0; }\n.vr-name-line { display: flex; align-items: center; gap: 6px; min-height: 20px; }\n.vr-name {\n  min-width: 0;\n  overflow: hidden;\n  color: #010101;\n  font-size: 14px;\n  font-weight: 500;\n  line-height: 20px;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.vr-verified { display: block; width: 16px; height: 16px; flex: 0 0 16px; }\n.vr-description {\n  min-width: 0;\n  overflow: hidden;\n  color: #737373;\n  font-size: 14px;\n  font-weight: 400;\n  line-height: 20px;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.vr-err { color: #B42318; font-size: 12px; line-height: 16px; }\n\n.vr-meta {\n  display: flex;\n  align-items: center;\n  gap: 16px;\n  flex: 0 0 auto;\n  color: #737373;\n}\n.vr-gender {\n  width: 20px;\n  height: 20px;\n  color: #3B82F6;\n  display: grid;\n  place-items: center;\n}\n.vr-language { display: flex; align-items: center; gap: 12px; font-size: 14px; line-height: 20px; white-space: nowrap; }\n.vr-flag { display: block; flex: 0 0 auto; width: 20px; height: 15px; object-fit: contain; border-radius: 2px; }\n.vr-flag-fallback { display: inline-grid; place-items: center; flex: 0 0 auto; width: 20px; height: 15px; color: #737373; }\n.vr-lang-code { color: #A1A1A1; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; }\n\n.vr-actions { display: flex; align-items: center; gap: 8px; flex: 0 0 auto; }\n.vr-curl, .vr-use, .vr-listen {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  height: 48px;\n  box-sizing: border-box;\n  border-radius: 12px;\n  padding: 6px 16px;\n  font-family: \"Aeonik\", sans-serif;\n  font-size: 16px;\n  font-weight: 400;\n  line-height: 24px;\n  text-decoration: none;\n  white-space: nowrap;\n}\n.vr-curl { display: none !important; gap: 6px; border: 0; background: #F5F5F5; color: #010101; cursor: pointer; }\n.vr-curl img { width: 13px; height: 13px; }\n.vr-use { border: 0; background: #010101; color: #FFFFFF; }\n.vr-listen { display: none; min-width: 88px; border: 0; background: #F5F5F5; color: #010101; cursor: pointer; }\n.vr-listen:disabled { color: #737373; cursor: wait; }\n@media (hover: hover) and (pointer: fine) {\n  .vr-curl:hover { background: #E5E5E5; }\n  .vr-use:hover { background: #262626; }\n}\n.vr-avatar:focus-visible, .vr-curl:focus-visible, .vr-use:focus-visible, .vr-listen:focus-visible {\n  outline: 2px solid #3B82F6;\n  outline-offset: 2px;\n}\n\n@media (max-width: 809.98px) {\n  .vr { flex-wrap: wrap; gap: 12px 20px; padding: 12px 0; }\n  .vr-identity { flex-basis: calc(100% - 190px); }\n  .vr-meta { margin-left: auto; gap: 12px; }\n  .vr-actions { width: 100%; justify-content: flex-end; }\n  .vr-curl, .vr-use { height: 44px; font-size: 14px; line-height: 20px; }\n}\n@media (max-width: 560px) {\n  .vr-list { gap: 8px; }\n  .vr {\n    display: grid;\n    grid-template-columns: minmax(0, 1fr) auto;\n    grid-template-rows: auto auto;\n    align-items: center;\n    gap: 4px 12px;\n    padding: 12px 0;\n    border-radius: 0;\n  }\n  .vr--divider::before { display: none; }\n  .vr-identity { grid-column: 1; grid-row: 1; min-width: 0; }\n  .vr-copy { flex: 1 1 auto; min-width: 0; }\n  .vr-description { display: none; }\n  .vr-meta {\n    display: flex;\n    grid-column: 1;\n    grid-row: 2;\n    justify-self: start;\n    gap: 12px;\n    margin-left: 56px;\n  }\n  .vr-language { gap: 8px; font-size: 12px; line-height: 16px; }\n  .vr-gender { width: 16px; height: 16px; }\n  .vr-gender svg { width: 16px; height: 16px; }\n  .vr-flag, .vr-flag-fallback { width: 16px; height: 12px; }\n  .vr-curl, .vr-use { display: none; }\n  .vr-actions { grid-column: 2; grid-row: 1 / span 2; width: auto; margin-left: 0; }\n  .vr-listen { display: inline-flex; min-height: 48px; padding: 12px 20px; border-radius: 16px; }\n}\n@media (max-width: 359px) {\n  .vr { gap: 8px; }\n  .vr-listen { min-width: 76px; padding-left: 12px; padding-right: 12px; }\n}\n@media (prefers-reduced-motion: reduce) {\n  .vr, .vr--divider::before, .vr-orb-shade, .vr-avatar::after, .vr-play-icon, .vr-curl, .vr-use, .vr-listen { transition: none; }\n  .vr-spinner { animation: none; }\n}\n`;const SILENCE=\"data:audio/mpeg;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjI5LjEwMAAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAAACAAABIADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD/////////////////////////////////AAAAAExhdmM1OC41NAAAAAAAAAAAAAAAACQAAAAAAAAAAAEg\";const cap=t=>t?t.charAt(0).toUpperCase()+t.slice(1):\"\";const DEFAULT_JSON=JSON.stringify([{id:\"finn\",name:\"Finn\",gender:\"male\",age:\"young\",accent:\"German\",language:\"German\",code:\"de\",script:\"Hallo, danke f\\xfcr Ihre Nachricht. Wie kann ich Ihnen heute helfen?\"},{id:\"meher\",name:\"Meher\",gender:\"female\",age:\"young\",accent:\"Indian\",language:\"Hindi\",code:\"hi\",script:\"आपका order confirm हो गया है।\"}],null,1);addPropertyControls(VoiceRowList,{voicesJson:{type:ControlType.String,title:\"Voices JSON\",displayTextArea:true,defaultValue:DEFAULT_JSON,description:\"Bind to the page's Voices JSON field.\"},proxyUrl:{type:ControlType.String,title:\"Proxy URL\",defaultValue:\"\"},consoleUrl:{type:ControlType.String,title:\"Console URL\",defaultValue:\"https://app.smallest.ai/\",hidden:()=>true},ctaLabel:{type:ControlType.String,title:\"CTA label\",defaultValue:\"Use voice\"},variant:{type:ControlType.Enum,title:\"Variant\",options:[\"divider\",\"card\"],optionTitles:[\"Divider row\",\"Standalone card\"],defaultValue:\"divider\",description:\"Divider suits a stack. Put the outer border on the stack.\"},showCurl:{type:ControlType.Boolean,title:\"Show curl\",defaultValue:false,hidden:()=>true},showLangCode:{type:ControlType.Boolean,title:\"Show language code\",defaultValue:false,description:\"Redundant next to Best for. Off by default.\"},radius:{type:ControlType.Number,title:\"Radius\",defaultValue:12,min:0,max:24,hidden:p=>p.variant!==\"card\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"VoiceRowList\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Voice_Library_Component.map"],"mappings":"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"}