{"version":3,"file":"SermonArchive.CXa3tpv4.mjs","names":["React.useState","React.useRef","React.useCallback"],"sources":["https:/framerusercontent.com/modules/tKcq4sFeonxJ4FnfNjMi/uAHYIGn2FfOSLGQpnfta/SermonArchive.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import*as React from\"react\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";/**\n * Browsable sermon archive: a scroll-snap carousel of message cards with\n * prev / next controls and click-to-load YouTube playback.\n *\n * SOURCE — the short version: CHANNEL FIRST, PLAYLIST AS BACKFILL, and the\n * playlist must point at a CURRENT series or it drags dead messages in.\n *\n * 2026-08-21: the uploads feed was preferred until it was measured. It\n * returned only 10 entries, and River Oaks posts roughly six Shorts for every\n * sermon, so after filtering exactly ONE full-length sermon was left in the\n * window. Pinning a SERIES PLAYLIST fixed it, because a series playlist holds\n * sermons and nothing else.\n *\n * 2026-10-13: re-measured, and the client asked to stop re-pointing a playlist\n * every series (\"I just want the previous three to always be in the queue\").\n * Chain inverted so the channel leads and the playlist only tops up.\n *\n * 2026-10-13 (same day, after a client screenshot): the top-up was pulling a\n * month-old message into \"Recent\". Cause: Series Playlist still pointed at\n * PLFYnCyWhU7rw, \"Seven Deadly Sins\", a series that ended 2026-09-13. The\n * backfill was doing its job against dead data. Re-pointed at the live series.\n *\n * WHY THE PLAYLIST CANNOT BE DROPPED. YouTube's RSS caps at 15 entries and\n * includes Shorts. Measured 2026-10-13: 12 of 15 entries were Shorts, leaving\n * THREE sermons. Rendering three while also skipping one (see HERO DEDUPE)\n * needs four. The channel cannot supply that on its own at this Shorts\n * cadence, so the playlist is load bearing, not a nicety.\n *\n * THE DURABLE FIX, when someone has a minute: have the church add every sermon\n * to ONE standing \"Sermons\" playlist as well as its series playlist. Point\n * Series Playlist at that instead and this component stops needing attention\n * forever — 15 sermons, no Shorts, no per-series chore. Until that exists,\n * Series Playlist has to be moved at the start of each new series.\n *\n * HERO DEDUPE. The page puts the newest sermon in the large SermonPlayer at\n * the top and this archive underneath, so without a skip the same message\n * appears twice on one screen.\n *\n * Two controls, deliberately not equal:\n *   - skipLatest (default on) assumes the hero shows the newest. Zero upkeep.\n *   - excludeUrl removes one specific video by id, for when the hero is pinned\n *     by hand to something that is not the newest.\n * excludeUrl wins when set, so the two can never double-apply and skip two.\n *\n * The skip is accounted for BEFORE the feed request — `need` is cap + skip, or\n * the feed returns exactly cap, loses one to the skip, and the row renders a\n * card short. It is also applied before the newestFirst reversal, or it would\n * drop the oldest item rather than the newest.\n *\n * On phones the carousel becomes a vertical list of compact rows: the\n * thumbnail sits beside the title at about a third of the width rather than\n * running full-bleed. A sideways scroll strip hides most of the archive\n * behind a gesture people miss, but a column of full-width 16:9 images\n * pushes everything else off the screen. The row keeps the 16:9 ratio\n * intact, so nothing is re-cropped, and all three messages are readable\n * without scrolling past a wall of artwork.\n *\n * Why bespoke: every marketplace video carousel stores its videos in an\n * Array control, which the MCP cannot write and which the client would\n * have to edit through a nested panel. Here each slot is plain scalar\n * props (title / series / YouTube link), so the archive stays a\n * one-field-per-week update in the Framer properties panel.\n *\n * Thumbnails come straight from YouTube, so there is no API key and no\n * image upload. Nothing is embedded until the visitor clicks, so the\n * iframes cost nothing on load.\n *\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight auto\n * @framerIntrinsicWidth 1100\n */function parseYouTubeId(input){if(!input)return\"\";const raw=input.trim();// Bare id. The {11} capture below also stops cleanly before any\n// ?si= / &t= query YouTube's share button appends.\nif(/^[\\w-]{11}$/.test(raw))return raw;const patterns=[/[?&]v=([\\w-]{11})/,/youtu\\.be\\/([\\w-]{11})/,/youtube\\.com\\/embed\\/([\\w-]{11})/,/youtube\\.com\\/live\\/([\\w-]{11})/,/youtube\\.com\\/shorts\\/([\\w-]{11})/];for(const p of patterns){const m=raw.match(p);if(m)return m[1];}return\"\";}// Accepts a bare playlist id or any youtube.com/playlist?list=... URL, so\n// whoever updates this can paste straight from the address bar.\nfunction parsePlaylistId(input){if(!input)return\"\";const raw=input.trim();const m=raw.match(/[?&]list=([\\w-]+)/);if(m)return m[1];return/^[\\w-]{10,}$/.test(raw)?raw:\"\";}const RO_CHANNEL_ID=\"UCXECb8jryEe4zbBZapyZJOA\";// \"Unlearning Religion: The Sermon On The Mount\" — the series running as of\n// 2026-10-13, and the same playlist the hero SermonPlayer uses. Move this when\n// a new series starts, or better, replace it with a standing Sermons playlist.\nconst RO_SERIES_PLAYLIST=\"PLExZLLpYbdZc\";// The homepage asked for three (2026-09-30 call). Instances snapshot the\n// number prop at insert time, so the 6 that shipped instances carry is read as\n// \"never set by hand\" and resolved to the current default. A client-picked\n// value other than 6 always wins.\nconst DEFAULT_MAX_ITEMS=3;const LEGACY_MAX_ITEMS=6;// Instances also snapshot the playlist, so the retired Seven Deadly Sins id is\n// rewritten at render rather than only corrected in the default above — the\n// same self-healing pattern the header and bubble use for moved paths.\nconst RETIRED_PLAYLISTS={PLFYnCyWhU7rw:RO_SERIES_PLAYLIST};// A Short is usually a /shorts/ link, but the channel also posts vertical\n// clips as ordinary videos with hashtag-stuffed titles (\"... #preaching\n// #sundayservice #sevendeadlysins\"). Real sermon titles never carry hashtags,\n// so two or more is a safe second signal.\nfunction isClip(item){if((item.link||\"\").includes(\"/shorts/\"))return true;return((item.title||\"\").match(/#\\w/g)||[]).length>=2;}// Channel first, playlist as backfill. No API key: YouTube's RSS through\n// rss2json (which sends CORS headers YouTube's own feed does not). Cached in\n// localStorage; every failure path returns null so the manual slots keep\n// working. rss2json's free tier does rate-limit, which is a second reason the\n// manual slots below must stay populated.\nfunction useSermonFeed(channelId,playlistId,enabled,need){const[items,setItems]=React.useState(null);React.useEffect(()=>{if(!enabled||typeof window===\"undefined\")return;if(!channelId&&!playlistId)return;let alive=true;// Key carries the shape of the request, so a source change invalidates\n// anything cached under the old behaviour.\nconst KEY=`ro-yt-feed3:${channelId}:${playlistId}:${need}`;const TTL=30*60*1e3;try{const cached=JSON.parse(window.localStorage.getItem(KEY)||\"null\");if(cached&&Date.now()-cached.t<TTL&&Array.isArray(cached.items)){setItems(cached.items);return;}}catch(e){}const feedFor=(kind,id)=>`https://www.youtube.com/feeds/videos.xml?${kind===\"playlist\"?\"playlist_id\":\"channel_id\"}=${id}`;const load=url=>fetch(`https://api.rss2json.com/v1/api.json?rss_url=${encodeURIComponent(url)}`).then(r=>r.ok?r.json():null).then(d=>{if(!d||d.status!==\"ok\"||!Array.isArray(d.items))return null;const sermons=d.items.filter(it=>it.link&&!isClip(it)).map(it=>({title:it.title||\"\",id:parseYouTubeId(it.link)||\"\",date:it.pubDate||\"\"})).filter(it=>it.id);return sermons.length?sermons:null;}).catch(()=>null);const chain=(channelId?load(feedFor(\"channel\",channelId)):Promise.resolve(null)).then(fromChannel=>{const got=fromChannel||[];// Enough real sermons in the uploads window, or nowhere to top up\n// from: take what we have.\nif(got.length>=need||!playlistId)return got.length?got:null;return load(feedFor(\"playlist\",playlistId)).then(fromPlaylist=>{if(!fromPlaylist)return got.length?got:null;const seen=new Set(got.map(s=>s.id));const merged=got.concat(fromPlaylist.filter(s=>!seen.has(s.id)));// Merged list is channel-newest-first then playlist order, so\n// re-sort by date — a backfilled item must not jump the queue.\nmerged.sort((a,b)=>new Date(b.date).getTime()-new Date(a.date).getTime());return merged.length?merged:null;});});chain.then(sermons=>{if(!alive||!sermons)return;setItems(sermons);try{window.localStorage.setItem(KEY,JSON.stringify({t:Date.now(),items:sermons}));}catch(e){}});return()=>{alive=false;};},[enabled,channelId,playlistId,need]);return items;}function formatSermonDate(pubDate){if(!pubDate)return\"\";const d=new Date(pubDate.includes(\"T\")?pubDate:pubDate.replace(\" \",\"T\")+\"Z\");if(isNaN(d.getTime()))return\"\";return d.toLocaleDateString(\"en-US\",{month:\"short\",day:\"numeric\",year:\"numeric\"});}export default function SermonArchive(props){const{title1,series1,url1,title2,series2,url2,title3,series3,url3,title4,series4,url4,title5,series5,url5,title6,series6,url6,autoFill,channelId,playlistId,skipLatest=true,excludeUrl=\"\",newestFirst=true,maxItems,accent,dark,radius,style}=props;const isCanvas=RenderTarget.current()===RenderTarget.canvas;const trackRef=React.useRef(null);const mediaRefs=React.useRef([]);const[playing,setPlaying]=React.useState(null);const[atStart,setAtStart]=React.useState(true);const[atEnd,setAtEnd]=React.useState(true);// Arrows must be driven by measured overflow, not item count: three\n// 340px cards do not overflow a 1100px container, and an enabled\n// arrow that does nothing reads as a broken site. Once the track\n// stacks vertically on phones this measures false and the arrows go.\nconst[overflows,setOverflows]=React.useState(false);const raw=[{title:title1,series:series1,url:url1},{title:title2,series:series2,url:url2},{title:title3,series:series3,url:url3},{title:title4,series:series4,url:url4},{title:title5,series:series5,url:url5},{title:title6,series:series6,url:url6}];const manualItems=raw.map(it=>({...it,id:parseYouTubeId(it.url)})).filter(it=>Boolean(it.title)&&Boolean(it.id));const storedMax=Number(maxItems);const cap=Math.max(1,Math.min(12,!storedMax||storedMax===LEGACY_MAX_ITEMS?DEFAULT_MAX_ITEMS:storedMax));// An explicit exclusion beats the positional skip, so the two can never\n// both fire and drop two messages.\nconst excludeId=parseYouTubeId(excludeUrl||\"\");const skipCount=excludeId?0:skipLatest?1:0;const storedPlaylist=parsePlaylistId(playlistId||\"\");const resolvedPlaylist=RETIRED_PLAYLISTS[storedPlaylist]||storedPlaylist||RO_SERIES_PLAYLIST;// Ask for the discarded item too, or the row renders a card short.\nconst feed=useSermonFeed(channelId||RO_CHANNEL_ID,resolvedPlaylist,!!autoFill&&!isCanvas,cap+skipCount);// Dedupe against the hero while the list is still newest-first. Doing this\n// after the newestFirst reversal would drop the OLDEST message instead.\nlet source=feed&&feed.length?feed.slice():[];if(excludeId){source=source.filter(f=>f.id!==excludeId);}else if(skipCount>0&&source.length>skipCount){// Guarded: a feed too thin to skip from degrades to showing the\n// duplicate, which beats rendering an empty row.\nsource=source.slice(skipCount);}const ordered=newestFirst?source:[...source].reverse();const feedItems=ordered.map(f=>({title:f.title,series:formatSermonDate(f.date),url:\"\",id:f.id}));const feedIds=new Set(feedItems.map(f=>f.id));const items=(feedItems.length?feedItems.concat(manualItems.filter(m=>!feedIds.has(m.id)&&m.id!==excludeId)):manualItems.filter(m=>m.id!==excludeId)).slice(0,cap);// A slot with a title but an unusable link would otherwise vanish\n// silently. Surface that on the Framer canvas only, so whoever is\n// editing sees it and visitors never do.\nconst broken=isCanvas?raw.filter(it=>Boolean(it.title)&&Boolean(it.url)&&!parseYouTubeId(it.url)):[];const textColor=dark?\"#ffffff\":\"#000000\";const subColor=dark?\"rgba(255,255,255,0.66)\":\"rgba(0,0,0,0.6)\";const cardBg=dark?\"rgba(255,255,255,0.06)\":\"rgba(0,0,0,0.03)\";const btnBorder=dark?\"rgba(255,255,255,0.28)\":\"rgba(0,0,0,0.18)\";// #4d9ee9 on the near-white card is only ~2.7:1, which fails WCAG AA\n// for 12px text. The series label carries real information, so it\n// takes a readable colour and the blue stays on the play affordance.\nconst seriesColor=dark?\"rgba(255,255,255,0.78)\":\"#333333\";const measure=React.useCallback(()=>{const el=trackRef.current;if(!el)return;const canScroll=el.scrollWidth>el.clientWidth+1;setOverflows(canScroll);setAtStart(el.scrollLeft<=4);setAtEnd(!canScroll||el.scrollLeft+el.clientWidth>=el.scrollWidth-4);},[]);React.useEffect(()=>{if(isCanvas)return;const el=trackRef.current;if(!el)return;measure();el.addEventListener(\"scroll\",measure,{passive:true});// A ResizeObserver catches Framer breakpoint and container\n// changes that never fire a window resize.\nlet ro=null;if(typeof ResizeObserver!==\"undefined\"){ro=new ResizeObserver(measure);ro.observe(el);}else if(typeof window!==\"undefined\"){window.addEventListener(\"resize\",measure);}return()=>{el.removeEventListener(\"scroll\",measure);if(ro)ro.disconnect();else if(typeof window!==\"undefined\")window.removeEventListener(\"resize\",measure);};},[isCanvas,measure,items.length]);const scrollBy=dir=>{const el=trackRef.current;if(!el)return;const card=el.querySelector(\"[data-sermon-card]\");const step=card?card.offsetWidth+18:340;const reduce=typeof window!==\"undefined\"&&window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;el.scrollBy({left:dir*step,behavior:reduce?\"auto\":\"smooth\"});};// The play button unmounts when the iframe replaces it, which would\n// drop focus to <body> and teleport a keyboard user to the top of\n// the page. Move focus onto the media wrapper instead.\nconst play=i=>{setPlaying(i);window.requestAnimationFrame(()=>{const el=mediaRefs.current[i];if(el)el.focus();});};if(items.length===0){return /*#__PURE__*/_jsx(\"div\",{style:{width:\"100%\",padding:24,color:subColor,font:\"400 15px/1.4 Archivo, sans-serif\",...style},children:\"Add a sermon title and YouTube link to populate the archive.\"});}const arrowStyle=inactive=>({width:48,height:48,borderRadius:\"50%\",border:`1px solid ${btnBorder}`,background:\"transparent\",color:textColor,cursor:inactive?\"default\":\"pointer\",opacity:inactive?.45:1,transition:\"opacity 0.2s ease\",fontSize:18,lineHeight:1});return /*#__PURE__*/_jsxs(\"div\",{style:{width:\"100%\",...style},children:[/*#__PURE__*/_jsx(\"style\",{children:`\n                .ro-arch-track { scrollbar-width: none; -ms-overflow-style: none; }\n                .ro-arch-track::-webkit-scrollbar { display: none; }\n                /* .ro-arch-card IS the button and the img is its child.\n                   Do not qualify with .ro-arch-thumb, which is the parent. */\n                .ro-arch-card:hover img,\n                .ro-arch-card:focus-visible img { transform: scale(1.05); }\n                .ro-arch-card:hover .ro-arch-play,\n                .ro-arch-card:focus-visible .ro-arch-play { transform: scale(1.08); }\n                @media (prefers-reduced-motion: reduce) {\n                    .ro-arch-card img,\n                    .ro-arch-card .ro-arch-play { transition: none; }\n                    .ro-arch-card:hover img,\n                    .ro-arch-card:focus-visible img,\n                    .ro-arch-card:hover .ro-arch-play,\n                    .ro-arch-card:focus-visible .ro-arch-play { transform: none; }\n                }\n                /* Phones: stack the archive instead of hiding it behind a\n                   sideways swipe, and lay each message out as a compact row\n                   so the artwork stops dominating the screen. The thumbnail\n                   keeps its 16:9 box, so the frame is never re-cropped. */\n                @media (max-width: 809px) {\n                    .ro-arch-track {\n                        flex-direction: column !important;\n                        overflow-x: visible !important;\n                        justify-content: flex-start !important;\n                        gap: 12px !important;\n                    }\n                    .ro-arch-item {\n                        width: 100% !important;\n                        flex-direction: row !important;\n                        align-items: stretch !important;\n                    }\n                    .ro-arch-thumb {\n                        flex: 0 0 40% !important;\n                        width: 40% !important;\n                        align-self: flex-start !important;\n                    }\n                    .ro-arch-meta {\n                        flex: 1 1 auto !important;\n                        display: flex !important;\n                        flex-direction: column !important;\n                        justify-content: center !important;\n                        padding: 12px 14px !important;\n                        min-width: 0 !important;\n                    }\n                    .ro-arch-meta h3 { font-size: 15.5px !important; }\n                    .ro-arch-meta p  { font-size: 11.5px !important; }\n                    /* Once a message is playing it needs the full width\n                       back, or the video is a thumbnail-sized sliver. */\n                    .ro-arch-item.is-playing { flex-direction: column !important; }\n                    .ro-arch-item.is-playing .ro-arch-thumb {\n                        flex: 0 0 auto !important;\n                        width: 100% !important;\n                    }\n                    .ro-arch-nav { display: none !important; }\n                }\n            `}),/*#__PURE__*/_jsx(\"div\",{ref:trackRef,className:\"ro-arch-track\",tabIndex:0,role:\"group\",\"aria-label\":\"Sermon archive\",style:{display:\"flex\",gap:18,// Without overflow the cards centre as a deliberate row\n// instead of hanging left with dead space beside them.\njustifyContent:overflows?\"flex-start\":\"center\",flexWrap:\"nowrap\",overflowX:\"auto\",// proximity, not mandatory: mandatory fights the\n// browser scrolling a focused card into view.\nscrollSnapType:\"x proximity\",paddingBottom:6},children:items.map((it,i)=>/*#__PURE__*/_jsxs(\"div\",{\"data-sermon-card\":true,className:`ro-arch-item${playing===i?\" is-playing\":\"\"}`,style:{flex:\"0 0 auto\",width:\"min(340px, 82vw)\",scrollSnapAlign:\"start\",background:cardBg,borderRadius:radius,overflow:\"hidden\",display:\"flex\",flexDirection:\"column\"},children:[/*#__PURE__*/_jsx(\"div\",{className:\"ro-arch-thumb\",ref:el=>{mediaRefs.current[i]=el;},tabIndex:-1,style:{position:\"relative\",width:\"100%\",aspectRatio:\"16 / 9\",overflow:\"hidden\",background:\"#000\",outline:\"none\"},children:playing===i?/*#__PURE__*/_jsx(\"iframe\",{src:`https://www.youtube-nocookie.com/embed/${it.id}?autoplay=1&playsinline=1&rel=0`,title:`${it.title} video player`,allow:\"autoplay; encrypted-media; picture-in-picture; fullscreen\",allowFullScreen:true,style:{position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",border:\"none\"}}):/*#__PURE__*/_jsxs(\"button\",{type:\"button\",className:\"ro-arch-card\",onClick:()=>play(i),\"aria-label\":`Play sermon: ${it.title}`,style:{position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",padding:0,border:\"none\",background:\"none\",cursor:\"pointer\"},children:[/*#__PURE__*/_jsx(\"img\",{src:`https://i.ytimg.com/vi/${it.id}/maxresdefault.jpg`,onError:e=>{const img=e.currentTarget;if(!img.dataset.fallback){img.dataset.fallback=\"1\";img.src=`https://i.ytimg.com/vi/${it.id}/mqdefault.jpg`;}},alt:\"\",loading:\"lazy\",decoding:\"async\",width:1280,height:720,style:{position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",objectFit:\"cover\",transition:\"transform 0.5s cubic-bezier(0.22,1,0.36,1)\"}}),/*#__PURE__*/_jsx(\"span\",{className:\"ro-arch-play\",\"aria-hidden\":true,style:{position:\"absolute\",top:\"50%\",left:\"50%\",width:56,height:56,marginTop:-28,marginLeft:-28,borderRadius:\"50%\",background:accent,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",transition:\"transform 0.3s ease\",boxShadow:\"0 6px 20px rgba(0,0,0,0.35)\"},children:/*#__PURE__*/_jsx(\"svg\",{width:\"18\",height:\"20\",viewBox:\"0 0 18 20\",fill:\"none\",children:/*#__PURE__*/_jsx(\"path\",{d:\"M17 10L0.5 19.5V0.5L17 10Z\",fill:\"white\"})})})]})}),/*#__PURE__*/_jsxs(\"div\",{className:\"ro-arch-meta\",style:{padding:\"16px 18px 20px 18px\"},children:[it.series?/*#__PURE__*/_jsx(\"p\",{style:{margin:\"0 0 6px 0\",font:\"600 13px/1.2 Montserrat, sans-serif\",letterSpacing:\"0.08em\",textTransform:\"uppercase\",color:seriesColor},children:it.series}):null,/*#__PURE__*/_jsx(\"h3\",{style:{margin:0,font:\"700 18px/1.25 Montserrat, sans-serif\",letterSpacing:\"-0.01em\",color:textColor},children:it.title})]})]},it.id||i))}),overflows?/*#__PURE__*/_jsxs(\"div\",{className:\"ro-arch-nav\",style:{display:\"flex\",gap:12,marginTop:18},children:[/*#__PURE__*/_jsx(\"button\",{type:\"button\",onClick:()=>{if(!atStart)scrollBy(-1);},\"aria-label\":\"Previous sermons\",// aria-disabled, not disabled: a disabled button is\n// pulled from the tab order mid-interaction, which\n// drops focus to <body>.\n\"aria-disabled\":atStart,style:arrowStyle(atStart),children:\"‹\"}),/*#__PURE__*/_jsx(\"button\",{type:\"button\",onClick:()=>{if(!atEnd)scrollBy(1);},\"aria-label\":\"More sermons\",\"aria-disabled\":atEnd,style:arrowStyle(atEnd),children:\"›\"})]}):null,broken.length>0?/*#__PURE__*/_jsxs(\"p\",{style:{marginTop:14,color:\"#CC6800\",font:\"600 13px/1.4 Archivo, sans-serif\"},children:[broken.length,\" sermon link\",broken.length>1?\"s\":\"\",\" could not be read and will not show on the site. Check the YouTube URL.\"]}):null]});}addPropertyControls(SermonArchive,{autoFill:{type:ControlType.Boolean,title:\"Auto-Fill\",defaultValue:true,description:\"Fill the archive from YouTube; the slots below are the fallback\"},channelId:{type:ControlType.String,title:\"Channel ID\",defaultValue:RO_CHANNEL_ID,description:\"Main source. Newest full-length messages across every series — nothing to update when a series changes.\"},playlistId:{type:ControlType.String,title:\"Series Playlist\",defaultValue:RO_SERIES_PLAYLIST,description:\"Backfill, and load bearing — the uploads feed is mostly Shorts. MUST point at the CURRENT series or old messages appear as recent. Paste the playlist URL or id.\"},skipLatest:{type:ControlType.Boolean,title:\"Skip Newest\",defaultValue:true,description:\"The newest message already plays in the big player above. Leave on so it isn't shown twice.\"},excludeUrl:{type:ControlType.String,title:\"Exclude Video\",defaultValue:\"\",description:\"Only if the player above is pinned to something other than the newest. Paste that YouTube URL; overrides Skip Newest.\"},newestFirst:{type:ControlType.Boolean,title:\"Newest First\",defaultValue:true,description:\"Turn off to show oldest first\"},maxItems:{type:ControlType.Number,title:\"Max Items\",defaultValue:DEFAULT_MAX_ITEMS,min:1,max:12,step:1,description:\"How many sermons to show\"},title1:{type:ControlType.String,title:\"1 Title\",defaultValue:\"\"},series1:{type:ControlType.String,title:\"1 Series\",defaultValue:\"\"},url1:{type:ControlType.String,title:\"1 YouTube\",defaultValue:\"\"},title2:{type:ControlType.String,title:\"2 Title\",defaultValue:\"\"},series2:{type:ControlType.String,title:\"2 Series\",defaultValue:\"\"},url2:{type:ControlType.String,title:\"2 YouTube\",defaultValue:\"\"},title3:{type:ControlType.String,title:\"3 Title\",defaultValue:\"\"},series3:{type:ControlType.String,title:\"3 Series\",defaultValue:\"\"},url3:{type:ControlType.String,title:\"3 YouTube\",defaultValue:\"\"},title4:{type:ControlType.String,title:\"4 Title\",defaultValue:\"\"},series4:{type:ControlType.String,title:\"4 Series\",defaultValue:\"\"},url4:{type:ControlType.String,title:\"4 YouTube\",defaultValue:\"\"},title5:{type:ControlType.String,title:\"5 Title\",defaultValue:\"\"},series5:{type:ControlType.String,title:\"5 Series\",defaultValue:\"\"},url5:{type:ControlType.String,title:\"5 YouTube\",defaultValue:\"\"},title6:{type:ControlType.String,title:\"6 Title\",defaultValue:\"\"},series6:{type:ControlType.String,title:\"6 Series\",defaultValue:\"\"},url6:{type:ControlType.String,title:\"6 YouTube\",defaultValue:\"\"},accent:{type:ControlType.Color,title:\"Accent\",defaultValue:\"#4d9ee9\"},dark:{type:ControlType.Boolean,title:\"Dark\",defaultValue:false},radius:{type:ControlType.Number,title:\"Radius\",defaultValue:18,min:0,max:40}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"SermonArchive\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./SermonArchive.map"],"mappings":"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"}