{"version":3,"file":"SoundeeTracksCarousel.Ck4JrSAM.mjs","names":["QueryClientProvider","React.useId","React.useRef","React.useState","React.useMemo","useInfiniteQuery","React.useCallback","React.useMemo","React.useCallback","React.Fragment","_Fragment"],"sources":["https:/framerusercontent.com/modules/bs66RNZmDeSAF9w44OdZ/PyzQ8vf7r7QnaBnxYbAQ/track.js","https:/framerusercontent.com/modules/bSn575zvL2DdLusO1e7F/dAzNRyvvyLRHLqdmEL6U/SoundeeCatalogCarousel.js","https:/framerusercontent.com/modules/rLWiV75oKK8MH8YJN1Gy/62bBt1bCczvLPrFjXzTa/SoundeeTracksCarousel.js"],"sourcesContent":["// soundee-core rebuild r14 (2026-09-18) — cache bust, see docs/migration/framer-core/07-framer-sync-log.md\nimport{canAddToCart,canDemoDownload}from\"https://framerusercontent.com/modules/SS5orfCMcKgfbITH48SC/eC2z6QlmsUuqPjh2EMil/entity_capabilities.js\";import{buildCmsSlugForRuntime,getSoundeeUrlSlug}from\"https://framerusercontent.com/modules/vmO3Qj1A95tLsyCVxfqD/TNnfZ9iOZ8jvIcZzxOSS/cms_slugs.js\";/**\n * Maps a `TrackEntity` to designer-facing slot props for Framer-built row\n * components. Keys use camelCase to match how Framer normalizes variable\n * display names (e.g. a variable named \"Artwork Small\" reads as\n * `props.artworkSmall`).\n */export function getTrackSlotProps(track){const urlSlug=getSoundeeUrlSlug(\"track\",track.urlSlug);return{trackID:track.trackId,entityID:track.entityId,title:track.title,description:track.description,artworkSmall:track.artworkUrlSmall,artworkMedium:track.artworkUrlMedium,artworkLarge:track.artworkUrlLarge,artworkColor:track.artworkColor,duration:track.durationFormatted,urlSlug,cmsSlug:buildCmsSlugForRuntime(\"track\",urlSlug),genre:track.genre,bpm:track.bpm,musicalKey:track.keyString,status:track.status,price:track.price,forSale:track.forSale,canDemoDownload:canDemoDownload(track),canAddToCart:canAddToCart(track),minLicensePrice:track.minLicensePrice};}\nexport const __FramerMetadata__ = {\"exports\":{\"getTrackSlotProps\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./track.map","// soundee-core rebuild r17 (2026-09-18) — engine state moved to globalThis, so a second engine build shares the player, see docs/migration/framer-core/07-framer-sync-log.md\n// soundee-core rebuild r13 (2026-08-27) — the runtime stopped repeating itself:\n// one tracking PUT per page instead of one per remounted bundle, one exit\n// beacon per exit instead of two, and one store-config fetch instead of one\n// per bundle. This file reads none of that, but a built module pins the build\n// of everything it imports, so without a content change of its own it keeps\n// loading the copy that still floods.\n// soundee-core rebuild r12 (2026-08-27) — session tracking now sends is_framer\n// so the backend can tell a Framer storefront apart from the pagebuilder. This\n// file never reads the flag, but a built module pins the build of everything it\n// imports, so without a content change of its own it keeps loading the copy\n// that still sent nothing.\n// soundee-core rebuild r9 (2026-08-25) — the r8 build baked in\n// `!missing/../../lib/vendor/react_query.tsx`: the vendor modules were pushed\n// after their importers, and an importer does not rebuild when only an\n// imported file changes. This line is the content change that forces it.\n// soundee-core republish r3 (2026-08-18 23:05) — forces a fresh module version\n// so every Starter instance is offered an update and all bundles\n// land on the same runtime.\n// instance is offered an update and all bundles land on the same runtime.\nimport{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import*as React from\"react\";import{RenderTarget}from\"framer\";import{useInfiniteQuery,QueryClientProvider}from\"https://framerusercontent.com/modules/A2wyUwJYRLojGcmm5zwu/a25JgpA7VH4glxK8yrBL/react_query.js\";import{useSoundeeConfig}from\"https://framerusercontent.com/modules/MnaOjDKPmXIgElrPjVea/S0Kmw9574uaRNxylK8em/config.js\";import{firstLoad,NEVER_COLLECT}from\"https://framerusercontent.com/modules/LvDJerpfGbaGUWAOTjYS/Rv56jYPAnRFoK0hFbquK/query_client.js\";import{useEntitySelector}from\"https://framerusercontent.com/modules/Fa9rFJN2rq85gl2rXBgV/AVjJVDZFaBnNLsPAn8ph/entities.js\";import{PlaylistContext,registerPlaylist}from\"https://framerusercontent.com/modules/xHhQmu9KUyaDJlvQ1REJ/bWd9qzndMaNhQDLTwfIv/playlist.js\";import{normalizeSlot}from\"https://framerusercontent.com/modules/h8NiJEJpWFHyeRETbmyt/8yFZXOUwH5F5bkx7bL6Q/slot.js\";import{buildListQueryKey,queryKeyToString}from\"https://framerusercontent.com/modules/JcGkFxuDjRfBADgMmXWq/pvonKNExnbKIMYF0pgOe/query_key.js\";import{claimEntryRefresh,queryClient}from\"https://framerusercontent.com/modules/LvDJerpfGbaGUWAOTjYS/Rv56jYPAnRFoK0hFbquK/query_client.js\";import{getElementScroll,isRestoring,saveElementScroll}from\"https://framerusercontent.com/modules/r0CAv0YpHCMOiaBy9POg/VepPLPXaPoYGah8pYdP2/history_cache.js\";import{dedupeEntityIds,takeUnseenPageItems}from\"https://framerusercontent.com/modules/FwdQf9t7jXrQK2VaZWlS/X6tT6pbwVK4ubbFN4aMb/catalog_ids.js\";import{EmptyState}from\"https://framerusercontent.com/modules/tC1behCumjtvssYcM3eK/XIJA7gEqIZqG6iAuzdnW/EmptyState.js\";import{SellerGate}from\"https://framerusercontent.com/modules/H46XGEKpmTPtqYBWZeIg/SR177hzVGhqiKaEJmqrm/SellerGate.js\";import{ScrollNudge}from\"https://framerusercontent.com/modules/d2xosHykSlwJdDclWBho/5G618v3tkvFoWyo6lmym/ScrollNudge.js\";import{getLikeActivity}from\"https://framerusercontent.com/modules/FCo7CeK86NShihctg8Ql/5vsld33GwD57YYnnUFr3/likes.js\";// ─── Scrollbar hide ──────────────────────────────────────────────────────────\nconst hideScrollbarCSS=`\n.sndee-carousel-scroll::-webkit-scrollbar { display: none; }\n@keyframes sndee-pulse { 0%, 100% { opacity: 0.6 } 50% { opacity: 1 } }\n.sndee-skeleton { animation: sndee-pulse 1s ease-in-out infinite; }\n`;/**\n * Parse a URL-style query string (`genre=hip-hop&sort=trending`) into a list\n * of `FilterParam`s. Leading `?` is optional. Empty / invalid input yields\n * an empty array. Intended for the wrapper components so users can promote\n * a *string* prop to a component variable in Framer (Framer can't promote\n * Array-of-Object props).\n */export function parseFilterQuery(q){if(!q)return[];const trimmed=q.trim().replace(/^\\?/,\"\");if(!trimmed)return[];try{const params=new URLSearchParams(trimmed);const out=[];params.forEach((value,key)=>{if(key&&value)out.push({key,value});});return out;}catch{return[];}}/**\n * Upper bound on how long the start-position pin may hold after a data swap.\n * The pin normally releases as soon as layout settles; this only covers the\n * case where it never does.\n */const SCROLL_PIN_MAX_MS=600;/**\n * How long a touch scroll has to be still before it is nudged onto a card.\n * Long enough to sit past the last inertial scroll event, short enough that\n * the correction reads as part of the same gesture.\n */const TOUCH_SETTLE_MS=120;function clamp(value,min,max){return Math.min(max,Math.max(min,value));}function getScrollMetrics(el,totalPages){const maxScroll=Math.max(0,el.scrollWidth-el.clientWidth);const lastPage=Math.max(0,totalPages-1);const scrollLeft=clamp(el.scrollLeft,0,maxScroll);const atStart=scrollLeft<=4;const atEnd=scrollLeft>=maxScroll-4;// Floor (not round) so a small post-layout drift or snap nudge near the\n// start is not misread as page 2. Hard-pin page 0 while at the start edge.\nconst page=atStart||maxScroll===0||lastPage===0?0:clamp(Math.floor(scrollLeft/maxScroll*lastPage+1e-6),0,lastPage);return{maxScroll,page,lastPage,atStart,atEnd};}function getPageScrollLeft(el,page,totalPages){const maxScroll=Math.max(0,el.scrollWidth-el.clientWidth);const lastPage=Math.max(0,totalPages-1);if(maxScroll===0||lastPage===0)return 0;return clamp(clamp(page,0,lastPage)/lastPage*maxScroll,0,maxScroll);}/**\n * Where each card's own snap position is: its left edge against the mask\n * edge (`scroll-padding-inline` is the mask width), and the last card flush\n * at the end, the way its `scroll-snap-align: end` puts it.\n *\n * Measured, not derived from the basis: the arrows used to land on a\n * proportional fraction of the scroll range (`getPageScrollLeft`), which is\n * between two cards as often as on one, and then relied on CSS snap to tidy\n * up — which on touch, where snap is only `proximity`, it did not.\n */function getCardOffsets(el,maskWidth){const cards=Array.from(el.querySelectorAll(\":scope > [data-carousel-card]\"));const origin=el.getBoundingClientRect().left-el.scrollLeft;return cards.map(card=>Math.round(card.getBoundingClientRect().left-origin-maskWidth));}function getCardSnapLefts(el,maskWidth){const maxScroll=Math.max(0,el.scrollWidth-el.clientWidth);const offsets=getCardOffsets(el,maskWidth);return offsets.map((left,index)=>index===offsets.length-1?maxScroll:clamp(left,0,maxScroll));}function nearestCardLeft(lefts,scrollLeft){let nearest=null;for(const left of lefts){if(nearest===null||Math.abs(left-scrollLeft)<Math.abs(nearest-scrollLeft)){nearest=left;}}return nearest;}// ─── Component ───────────────────────────────────────────────────────────────\n/**\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n * @framerDisableUnlink\n */export default function SoundeeCatalogCarousel(props){return /*#__PURE__*/_jsx(QueryClientProvider,{client:queryClient,children:/*#__PURE__*/_jsx(SellerGate,{style:props.style,children:/*#__PURE__*/_jsx(CarouselInner,{...props})})});}SoundeeCatalogCarousel.displayName=\"Soundee Catalog Carousel\";function CarouselInner({filterEntityType=\"tracks\",entityPath,limit,emptyTitle=\"Nothing here yet\",emptyText=\"This shelf has no items to show right now.\",gap,itemsPerView=3,peek=40,maskWidth=60,initialFilters=[],prevArrow,nextArrow,showArrows=true,arrowSkin,arrowAlignMode=\"item\",itemAspectRatio=1,carouselId=\"\",style,fetchFn,upsertFn,getEntityIds,selectEntities,filterItemIds,refreshOnEntry=false,refreshVersion=0,renderItem,renderSkeleton,previewItems=[],previewState=\"Data\"}){const cfg=useSoundeeConfig();// Carousel is intentionally isolated from the global filter store:\n// it reads `initialFilters` purely locally (as a list of `{ key, value }`\n// pairs), so multiple carousels with different filter sets can coexist on\n// one page without clashing, and a page-level list / filter UI is\n// unaffected.\nconst entityMap=useEntitySelector(selectEntities);const instanceId=React.useId();const scrollRef=React.useRef(null);const[scrollState,setScrollState]=React.useState({left:false,right:true});const[activePage,setActivePage]=React.useState(0);// Scroll-snap is disabled while we pin to the first page so the browser\n// cannot re-snap to page 2 after layout/ResizeObserver settle.\nconst[scrollSnapActive,setScrollSnapActive]=React.useState(false);const scrollPinRef=React.useRef(false);const scrollPinStableRef=React.useRef(0);const scrollPinTimerRef=React.useRef(null);// Framer canvas re-renders this component constantly (zoom, pan, prop\n// edits) and also renders multiple instances at once. Disable every\n// continuous/expensive side-effect there: mask compositing, scroll\n// observers, ResizeObserver, IntersectionObserver. Designer still sees a\n// static preview with data.\nconst isCanvas=RenderTarget.current()===RenderTarget.canvas;// Once, not reactively: a device does not change its pointer mid-visit.\nconst coarsePointer=React.useMemo(()=>typeof window!==\"undefined\"&&window.matchMedia(\"(pointer: coarse)\").matches,[]);const userId=cfg.userId;const filterParams=React.useMemo(()=>{const result={};for(const p of initialFilters??[]){if(!p||!p.key)continue;const v=p.value;if(v==null||v===\"\")continue;result[p.key]=String(v);}return result;},[initialFilters]);// A favorites view is the one list whose contents can change without any\n// filter changing, so its cache entry carries when the likes last settled.\n// Read once here and again whenever the filters move — never while the list\n// sits on screen, or every heart would restart the list under the visitor.\n// Re-entering, switching filters and pressing Clear therefore all ask the\n// server again; staying put does not.\nconst likedView=filterParams.list_type===\"liked\";const[likeActivity,setLikeActivity]=React.useState(getLikeActivity);const likeActivityScope=React.useMemo(()=>JSON.stringify(filterParams),[filterParams]);React.useEffect(()=>{// Same value on mount, so React bails and nothing refetches.\nsetLikeActivity(getLikeActivity());},[likeActivityScope]);const queryKey=React.useMemo(()=>{return buildListQueryKey({baseUrl:cfg.baseUrl,storeId:cfg.storeId,path:`/users/${userId}${entityPath}`,params:{limit,...filterParams},// Key only, never sent: the server has no idea what this is, and it\n// would be a filter it does not know if it arrived as one.\nextra:likedView?[likeActivity]:[]});},[cfg.baseUrl,cfg.storeId,userId,limit,filterParams,entityPath,likedView,likeActivity]);// See `refreshOnEntry`. Evaluated on entry and when the query identity\n// changes, never on a plain re-render — the version is read through a ref\n// so liking an item cannot trigger a refetch. `claimEntryRefresh` returns\n// false when nothing changed since this query's data was loaded, keeping\n// the cache and the restored scroll position at zero cost.\nconst queryKeyForEntry=React.useMemo(()=>queryKeyToString(queryKey),[queryKey]);const refreshVersionRef=React.useRef(refreshVersion);refreshVersionRef.current=refreshVersion;React.useEffect(()=>{if(isCanvas||!refreshOnEntry)return;if(!claimEntryRefresh(queryKeyForEntry,refreshVersionRef.current)){return;}queryClient.removeQueries({queryKey});},[isCanvas,refreshOnEntry,queryKeyForEntry]);const{data,fetchNextPage,hasNextPage,isFetchingNextPage,isPending:isPendingV5,isLoading:isLoadingV4}=useInfiniteQuery({queryKey,// `pageParam` is optional because v4 ignores `initialPageParam` and\n// starts the first page at `undefined`.\nqueryFn:({pageParam})=>fetchFn({baseUrl:cfg.baseUrl,storeId:cfg.storeId,userId:cfg.userId},String(userId),pageParam??1,limit,filterParams),initialPageParam:1,getNextPageParam:lastPage=>lastPage.nextPage??undefined,enabled:!isCanvas&&!!userId&&cfg._ready,...NEVER_COLLECT,refetchOnMount:false,refetchOnWindowFocus:false,refetchOnReconnect:false});// One flag for both majors — see `firstLoad`. Everything below reads this,\n// never the raw fields.\nconst isPending=firstLoad({isPending:isPendingV5,isLoading:isLoadingV4});const queryKeyString=React.useMemo(()=>queryKeyToString(queryKey),[queryKey]);// Only pages the entity store hasn't seen yet — see `takeUnseenPageItems`.\n// Tracked by page identity rather than per-instance count, so a re-mount on\n// navigation never re-writes cached pages into the store.\n// A layout effect so the store catches up before the paint: a passive\n// effect let the data-arrived-but-store-empty render paint first, which\n// showed the skeletons for one extra frame after loading finished.\nReact.useLayoutEffect(()=>{if(!data)return;const newItems=takeUnseenPageItems(data.pages);if(newItems.length)upsertFn(newItems);},[data,queryKeyString]);const playlistId=queryKeyString;// Stable key used to persist/restore this carousel's horizontal scroll\n// against the current history entry. `carouselId` disambiguates multiple\n// carousels that share the same query (filters); otherwise the query key\n// is unique enough per placement.\nconst scrollSectionKey=React.useMemo(()=>`carousel:${carouselId||queryKeyString}`,[carouselId,queryKeyString]);// See `filterItemIds`: membership changes the client already knows (e.g. an\n// unliked item in a Favorites carousel) are applied here rather than by\n// refetching, which would re-request every loaded page.\nconst itemIds=React.useMemo(()=>{// See `dedupeEntityIds`: a set that grows between two page requests\n// hands the same entity back on the next page.\nconst ids=data?dedupeEntityIds(getEntityIds(data)):[];return filterItemIds?filterItemIds(ids):ids;},[data,filterItemIds]);// The playlist registers the full list of ids so audio playback can\n// continue across pages. The carousel itself only renders up to `limit`\n// items (prevents the view from growing when the playlist fetches more\n// pages into the shared query cache).\nconst visibleItemIds=React.useMemo(()=>{// Always capped. A carousel is a shelf, not a feed: it shows what it\n// was given and the page it lives on decides how much that is.\nreturn itemIds.slice(0,limit);},[itemIds,limit]);const fetchPageFn=React.useCallback(pageParam=>fetchFn({baseUrl:cfg.baseUrl,storeId:cfg.storeId,userId:cfg.userId},String(userId),pageParam,limit,filterParams),[fetchFn,cfg.baseUrl,cfg.storeId,userId,limit,filterParams]);React.useEffect(()=>{if(!data||itemIds.length===0)return;registerPlaylist(playlistId,itemIds,queryKey,fetchPageFn,hasNextPage??false,upsertFn);},[data,itemIds,queryKey,fetchPageFn,hasNextPage,playlistId,upsertFn]);const canvasItems=React.useMemo(()=>{if(!isCanvas||!previewItems.length)return[];const previewLimit=Math.max(itemsPerView,Math.min(limit,previewItems.length));return previewItems.slice(0,previewLimit);},[isCanvas,itemsPerView,limit,previewItems]);const items=React.useMemo(()=>{if(isCanvas&&canvasItems.length)return canvasItems;return visibleItemIds.map(id=>entityMap[id]).filter(Boolean);},[isCanvas,canvasItems,visibleItemIds,entityMap]);const totalPages=Math.max(1,Math.ceil(items.length/itemsPerView));const scrollResetRef=React.useRef({queryKey:\"\",hadItems:false});const releaseScrollPin=React.useCallback(()=>{scrollPinRef.current=false;scrollPinStableRef.current=0;if(scrollPinTimerRef.current){window.clearTimeout(scrollPinTimerRef.current);scrollPinTimerRef.current=null;}setScrollSnapActive(true);},[]);// The pin only exists to defeat a stale offset the browser may restore\n// across the skeleton → data swap; it must never fight the visitor. Any\n// deliberate input releases it at once. Without this, a touchpad — which\n// emits a continuous stream of scroll events rather than discrete wheel\n// clicks — kept resetting the stability counter in `compute()`, so the pin\n// never reached its three settled frames and scrolling felt stuck.\nReact.useEffect(()=>{if(isCanvas)return;const el=scrollRef.current;if(!el)return;const release=()=>releaseScrollPin();const opts={passive:true};el.addEventListener(\"wheel\",release,opts);el.addEventListener(\"touchstart\",release,opts);el.addEventListener(\"pointerdown\",release,opts);return()=>{el.removeEventListener(\"wheel\",release);el.removeEventListener(\"touchstart\",release);el.removeEventListener(\"pointerdown\",release);};},[isCanvas,releaseScrollPin]);React.useEffect(()=>{return()=>{if(scrollPinTimerRef.current){window.clearTimeout(scrollPinTimerRef.current);}};},[]);React.useLayoutEffect(()=>{if(isCanvas)return;const el=scrollRef.current;const hasItems=items.length>0;const queryChanged=scrollResetRef.current.queryKey!==queryKeyString;const shouldReset=hasItems&&(queryChanged||!scrollResetRef.current.hadItems);scrollResetRef.current={queryKey:queryKeyString,hadItems:hasItems};if(!el||!hasItems)return;// On history back/forward, restore the saved horizontal offset for this\n// carousel instead of snapping to the start. `activePage` follows via\n// the scroll listener (programmatic scrollLeft fires a scroll event).\nif(isRestoring()){releaseScrollPin();const saved=getElementScroll(scrollSectionKey);if(saved>0){el.scrollLeft=saved;return;}}if(shouldReset){// After skeleton/data swaps, browsers can preserve or snap a stale\n// horizontal offset. Pin page 1 until layout has settled.\nscrollPinRef.current=true;scrollPinStableRef.current=0;setScrollSnapActive(false);el.scrollLeft=0;setActivePage(0);// Safety valve: release even if layout never produces three settled\n// frames, so the pin can't outlive the swap it was meant to cover.\nif(scrollPinTimerRef.current){window.clearTimeout(scrollPinTimerRef.current);}scrollPinTimerRef.current=window.setTimeout(releaseScrollPin,SCROLL_PIN_MAX_MS);return;}// Re-assert the pinned start position across child layout changes\n// (images, fonts) until the pin is released by the scroll tracker.\nif(scrollPinRef.current){el.scrollLeft=0;}},[isCanvas,items.length,queryKeyString,scrollSectionKey,totalPages,releaseScrollPin]);// ─── Scroll tracking ─────────────────────────────────────────────────\nconst totalPagesRef=React.useRef(1);React.useEffect(()=>{if(isCanvas)return;const el=scrollRef.current;if(!el)return;let rafId=0;let scheduled=false;const compute=()=>{scheduled=false;if(!el)return;if(scrollPinRef.current&&!isRestoring()){if(el.scrollLeft>4){el.scrollLeft=0;scrollPinStableRef.current=0;}else{const maxScroll=Math.max(0,el.scrollWidth-el.clientWidth);if(maxScroll<=0){releaseScrollPin();}else{scrollPinStableRef.current+=1;if(scrollPinStableRef.current>=3){releaseScrollPin();}}}}const metrics=getScrollMetrics(el,totalPagesRef.current);const page=scrollPinRef.current&&!isRestoring()?0:metrics.page;const left=!metrics.atStart;const right=!metrics.atEnd;setScrollState(prev=>prev.left===left&&prev.right===right?prev:{left,right});setActivePage(prev=>prev===page?prev:page);// Persist the offset against the current history entry so it can be\n// restored on back/forward navigation. Skip while a restore is in\n// flight so an early 0 (before data paints) can't clobber the saved\n// value the restore is about to read. Also skip while pinned so a\n// transient snap drift is not saved as the carousel position.\nif(!isRestoring()&&!scrollPinRef.current){saveElementScroll(scrollSectionKey,el.scrollLeft);}};const schedule=()=>{if(scheduled)return;scheduled=true;rafId=requestAnimationFrame(compute);};el.addEventListener(\"scroll\",schedule,{passive:true});compute();const ro=new ResizeObserver(schedule);ro.observe(el);return()=>{el.removeEventListener(\"scroll\",schedule);ro.disconnect();if(rafId)cancelAnimationFrame(rafId);};},[items.length,isCanvas,totalPages,scrollSectionKey,releaseScrollPin]);// ─── Arrow navigation ────────────────────────────────────────────────\n// A page per press — the full visible width, `itemsPerView` cards — but\n// landing on a card edge. The proportional page positions this replaced\n// (`getPageScrollLeft`) fell between two cards as often as on one, which\n// on touch (proximity snap) simply stayed there: the half-card stop.\n// Tolerance of a couple of pixels so a card sitting a hair off its edge\n// still counts as the one at the edge.\nconst scrollByItems=React.useCallback(dir=>{releaseScrollPin();const el=scrollRef.current;if(!el)return;const lefts=getCardSnapLefts(el,maskWidth);if(!lefts.length)return;const current=el.scrollLeft;// Which card stands at the left edge — from the raw offsets, not the\n// snap positions: at the end of the strip several cards share the\n// clamped maxScroll position and would misidentify the page.\nconst offsets=getCardOffsets(el,maskWidth);let index=offsets.findIndex(left=>left>=current-2);if(index===-1)index=offsets.length-1;const target=clamp(index+dir*itemsPerView,0,lefts.length-1);el.scrollTo({left:lefts[target],behavior:\"smooth\"});},[releaseScrollPin,maskWidth,itemsPerView]);// Touch scrolls with `proximity` snap — `mandatory` made the browser\n// negotiate every gesture that started on the scroller and froze the page\n// for a beat (see the scroller's style). Proximity leaves a fast flick\n// wherever it stops, so once the scroll has settled the nearest card is\n// pulled into place from here. Never while a finger is still down: that\n// would fight the gesture the browser just declined to claim.\nReact.useEffect(()=>{if(isCanvas||!coarsePointer)return;const el=scrollRef.current;if(!el)return;let touching=false;let timer=0;const settle=()=>{if(touching||scrollPinRef.current||isRestoring())return;const lefts=getCardSnapLefts(el,maskWidth);const target=nearestCardLeft(lefts,el.scrollLeft);if(target===null||Math.abs(target-el.scrollLeft)<1)return;el.scrollTo({left:target,behavior:\"smooth\"});};const arm=()=>{window.clearTimeout(timer);timer=window.setTimeout(settle,TOUCH_SETTLE_MS);};const onTouchStart=()=>{touching=true;window.clearTimeout(timer);};const onTouchEnd=()=>{touching=false;// Arm even if no further scroll event follows: a short drag that\n// ends without momentum produces none, and that is exactly the\n// gesture that used to be left parked mid-card.\narm();};// `scrollend` is the exact signal — it fires once momentum has died,\n// where the timer below is only a guess at it. Both are wired: the\n// event where the browser has it, the timer everywhere else (Safari\n// is the one that matters here and is the one still missing it).\nconst onScrollEnd=()=>{window.clearTimeout(timer);settle();};const hasScrollEnd=\"onscrollend\"in window;const opts={passive:true};el.addEventListener(\"scroll\",arm,opts);if(hasScrollEnd)el.addEventListener(\"scrollend\",onScrollEnd,opts);el.addEventListener(\"touchstart\",onTouchStart,opts);el.addEventListener(\"touchend\",onTouchEnd,opts);el.addEventListener(\"touchcancel\",onTouchEnd,opts);return()=>{window.clearTimeout(timer);el.removeEventListener(\"scroll\",arm);if(hasScrollEnd)el.removeEventListener(\"scrollend\",onScrollEnd);el.removeEventListener(\"touchstart\",onTouchStart);el.removeEventListener(\"touchend\",onTouchEnd);el.removeEventListener(\"touchcancel\",onTouchEnd);};},[isCanvas,coarsePointer,maskWidth]);// ─── Autoplay ────────────────────────────────────────────────────────\nconst[hovered,setHovered]=React.useState(false);const[inView,setInView]=React.useState(true);// ─── Mask gradient ───────────────────────────────────────────────────\n// Single gradient with 4 stops so we don't need `mask-composite`, which\n// forces expensive GPU compositing of the entire scroll container on\n// every nearby repaint (e.g. a playing progress bar on the page).\nconst maskImage=React.useMemo(()=>{if(maskWidth<=0)return\"none\";return`linear-gradient(to right, transparent 0, black ${maskWidth}px, black calc(100% - ${maskWidth}px), transparent 100%)`;},[maskWidth]);// ─── Dots ────────────────────────────────────────────────────────────\ntotalPagesRef.current=totalPages;// A dot is a page of cards: the first card of that page against the\n// edge, the last page flush at the end. Aligned to a card, like the\n// arrows — the proportional position is still what decides which dot is\n// lit, so the two stay in step on the way there.\nconst scrollToPage=React.useCallback(page=>{releaseScrollPin();const el=scrollRef.current;if(!el)return;const lastPage=Math.max(0,totalPagesRef.current-1);const lefts=getCardSnapLefts(el,maskWidth);const first=clamp(page,0,lastPage)*itemsPerView;const target=page>=lastPage||first>=lefts.length?getPageScrollLeft(el,lastPage,totalPagesRef.current):lefts[first];el.scrollTo({left:target,behavior:\"smooth\"});},[releaseScrollPin,maskWidth,itemsPerView]);// ─── Custom buttons (standalone, id-wired) ───────────────────────────\n// ─── Prev/Next arrow slots ───────────────────────────────────────────\nconst prevSlot=normalizeSlot(prevArrow);const nextSlot=normalizeSlot(nextArrow);// Nothing connected: draw the arrow. Same button the filter bar nudges its\n// scrollers with, so a carousel and a tag row do not end up with two\n// slightly different chevrons.\nconst arrow=side=>arrowSkin?/*#__PURE__*/_jsx(ScrollNudge,{side:side,visible:side===\"start\"?scrollState.left:scrollState.right,onClick:()=>scrollByItems(side===\"start\"?-1:1),skin:arrowSkin,label:side===\"start\"?\"Previous\":\"Next\",size:40}):null;// ─── Skeleton ────────────────────────────────────────────────────────\n// Basis so that `itemsPerView` items fit exactly inside\n// [maskWidth, clientWidth - maskWidth - peek]. We subtract both mask\n// widths (left + right) so the items never bleed into the mask zone when\n// snapped to the start or end.\nconst itemBasis=`calc((100% - ${2*maskWidth+peek}px - ${gap*(itemsPerView-1)}px) / ${itemsPerView})`;// Side spacers reserve room for the mask on both sides. They are\n// symmetric; the last item uses `scroll-snap-align: end` so it snaps\n// flush against the right mask edge (no leftover peek gap at the end).\nconst edgeSpacer=Math.max(0,maskWidth-gap);// ─── Arrow vertical alignment ────────────────────────────────────────\n// In \"item\" mode arrows sit at 50% of the full carousel row (the whole\n// card height). In \"aspect\" mode the arrow is wrapped in an invisible\n// box that spans one item's width and has the given aspect ratio; the\n// arrow itself is flex-centered inside that box. We can't use a plain\n// `top: calc(...)` here because `100%` in `itemBasis` would resolve\n// against the container's height instead of its width.\n// A connected design brings its own box; the built-in arrow positions itself\n// and so needs one with a real height to sit in the middle of. The aspect\n// wrapper is that box, and it is also where the arrow belongs — level with\n// the artwork rather than with the whole card, title and price included.\nconst builtInArrows=!!arrowSkin&&!/*#__PURE__*/React.isValidElement(prevSlot)&&!/*#__PURE__*/React.isValidElement(nextSlot);const isAspectAlign=arrowAlignMode===\"aspect\"||builtInArrows;const safeAspect=itemAspectRatio>0?itemAspectRatio:1;if(isCanvas&&previewState===\"Loading\"||isPending&&items.length===0){return /*#__PURE__*/_jsxs(\"div\",{style:{...style,position:\"relative\",width:\"100%\",overflow:\"hidden\",overflowAnchor:\"none\",maskImage,WebkitMaskImage:maskImage},children:[/*#__PURE__*/_jsx(\"style\",{children:hideScrollbarCSS}),/*#__PURE__*/_jsxs(\"div\",{className:\"sndee-skeleton\",style:{display:\"flex\",gap,width:\"100%\",boxSizing:\"border-box\"},children:[/*#__PURE__*/_jsx(\"div\",{style:{flex:`0 0 ${edgeSpacer}px`,minWidth:edgeSpacer}}),Array.from({length:Math.max(1,limit||itemsPerView)}).map((_,i)=>/*#__PURE__*/_jsx(\"div\",{style:{flex:`0 0 ${itemBasis}`,minWidth:0},children:renderSkeleton(i,instanceId)},i))]})]});}if(isCanvas&&previewState===\"Empty\"||items.length===0){// The same empty state the list draws, rather than nothing at all: a\n// carousel that quietly disappears reads as a page that failed to\n// load. No Reset here — a carousel is usually one shelf among several\n// and rarely the thing the filters are aimed at.\nreturn /*#__PURE__*/_jsx(\"div\",{style:{...style,width:\"100%\"},children:/*#__PURE__*/_jsx(EmptyState,{title:emptyTitle,text:emptyText})});}// ─── Render ──────────────────────────────────────────────────────────\nreturn /*#__PURE__*/_jsxs(\"div\",{style:{...style,position:\"relative\",width:\"100%\",overflowAnchor:\"none\"},onMouseEnter:()=>setHovered(true),onMouseLeave:()=>setHovered(false),children:[/*#__PURE__*/_jsx(\"style\",{children:hideScrollbarCSS}),showArrows&&(prevSlot??arrowSkin)&&/*#__PURE__*/_jsx(\"div\",{style:isAspectAlign?{position:\"absolute\",left:0,top:0,width:itemBasis,aspectRatio:String(safeAspect),display:\"flex\",alignItems:\"center\",justifyContent:\"flex-start\",pointerEvents:\"none\",zIndex:2}:{position:\"absolute\",left:0,top:\"50%\",transform:\"translateY(-50%)\",zIndex:2},children:/*#__PURE__*/React.isValidElement(prevSlot)?/*#__PURE__*/_jsx(\"div\",{onClick:()=>scrollByItems(-1),style:{cursor:\"pointer\",opacity:scrollState.left?1:0,pointerEvents:scrollState.left?\"auto\":\"none\",transition:\"opacity 200ms ease\"},children:prevSlot}):arrow(\"start\")}),showArrows&&(nextSlot??arrowSkin)&&/*#__PURE__*/_jsx(\"div\",{style:isAspectAlign?{position:\"absolute\",right:0,top:0,width:itemBasis,aspectRatio:String(safeAspect),display:\"flex\",alignItems:\"center\",justifyContent:\"flex-end\",pointerEvents:\"none\",zIndex:2}:{position:\"absolute\",right:0,top:\"50%\",transform:\"translateY(-50%)\",zIndex:2},children:/*#__PURE__*/React.isValidElement(nextSlot)?/*#__PURE__*/_jsx(\"div\",{onClick:()=>scrollByItems(1),style:{cursor:\"pointer\",opacity:scrollState.right?1:0,pointerEvents:scrollState.right?\"auto\":\"none\",transition:\"opacity 200ms ease\"},children:nextSlot}):arrow(\"end\")}),/*#__PURE__*/_jsxs(\"div\",{ref:scrollRef,className:\"sndee-carousel-scroll\",style:{display:\"flex\",flexDirection:\"row\",flexWrap:\"nowrap\",width:\"100%\",boxSizing:\"border-box\",gap,scrollPaddingInline:maskWidth,overflowX:isCanvas?\"hidden\":\"auto\",overflowY:\"hidden\",// Mandatory snap only where a precise pointer scrolls it.\n// On touch, `x mandatory` makes the browser negotiate every\n// gesture that *starts* on the scroller — and on a phone at\n// one card per view this carousel is half the screen, so\n// that was most vertical page swipes. The negotiation reads\n// as the page freezing for a beat, only on touch, and only\n// when there are enough cards to overflow — which is\n// exactly the shape of the bug: tracks shelves froze while\n// a four-item kits shelf, with nothing to scroll, never\n// did. Proximity keeps cards settling on clean edges\n// without claiming the gesture.\nscrollSnapType:isCanvas||!scrollSnapActive?\"none\":coarsePointer?\"x proximity\":\"x mandatory\",// The carousel keeps its own edges: without this a\n// horizontal overscroll at either end chains to the page,\n// and on iOS that is the back-swipe — a browse of the shelf\n// that ends in a navigation nobody asked for.\noverscrollBehaviorX:\"contain\",// `scroll-behavior: smooth` as CSS can feedback-loop with\n// scroll-snap on some browsers. We apply smooth scrolling\n// only on explicit programmatic scrolls via scrollBy/To.\nscrollbarWidth:\"none\",WebkitOverflowScrolling:\"touch\",contain:\"paint\",overflowAnchor:\"none\",maskImage,WebkitMaskImage:maskImage},children:[/*#__PURE__*/_jsx(\"div\",{\"aria-hidden\":true,style:{flex:`0 0 ${edgeSpacer}px`,minWidth:edgeSpacer}}),items.map((item,index)=>/*#__PURE__*/_jsx(\"div\",{\"data-carousel-card\":\"\",style:{flex:`0 0 ${itemBasis}`,scrollSnapAlign:index===items.length-1?\"end\":\"start\",minWidth:0},children:/*#__PURE__*/_jsx(PlaylistContext.Provider,{value:playlistId,children:renderItem(item,index,playlistId,instanceId)})},item.entityId)),/*#__PURE__*/_jsx(\"div\",{\"aria-hidden\":true,style:{flex:`0 0 ${edgeSpacer}px`,minWidth:edgeSpacer}})]})]});}\nexport const __FramerMetadata__ = {\"exports\":{\"FilterParam\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"CarouselProps\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"parseFilterQuery\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"reactComponent\",\"name\":\"SoundeeCatalogCarousel\",\"slots\":[\"prevArrow\",\"nextArrow\"],\"annotations\":{\"framerDisableUnlink\":\"\",\"framerSupportedLayoutWidth\":\"any\",\"framerSupportedLayoutHeight\":\"any\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}","// soundee-core rebuild r17 (2026-09-18) — engine state moved to globalThis, so a second engine build shares the player, see docs/migration/framer-core/07-framer-sync-log.md\n// soundee-core rebuild r13 (2026-08-27) — the runtime stopped repeating itself:\n// one tracking PUT per page instead of one per remounted bundle, one exit\n// beacon per exit instead of two, and one store-config fetch instead of one\n// per bundle. This file reads none of that, but a built module pins the build\n// of everything it imports, so without a content change of its own it keeps\n// loading the copy that still floods.\n// soundee-core rebuild r12 (2026-08-27) — session tracking now sends is_framer\n// so the backend can tell a Framer storefront apart from the pagebuilder. This\n// file never reads the flag, but a built module pins the build of everything it\n// imports, so without a content change of its own it keeps loading the copy\n// that still sent nothing.\n// soundee-core rebuild r9 (2026-08-25) — the r8 build baked in\n// `!missing/../../lib/vendor/react_query.tsx`: the vendor modules were pushed\n// after their importers, and an importer does not rebuild when only an\n// imported file changes. This line is the content change that forces it.\n// soundee-core republish r8 (2026-08-25, eigen hosting) — rebuild because\n// react-query and react-virtuoso now come from framer.soundee.com instead of\n// a bare npm name Framer resolved to v4. See lib/vendor/react_query.tsx.\n// soundee-core republish r7 (2026-08-25, v4 hardening) — rebuild for the\n// dual-major cache option (gcTime/cacheTime) and the NaN-proof page counter\n// in api/{tracks,kits,services}.tsx. On v4 `undefined + 1` made nextPage NaN,\n// which is not nullish, so the list would ask for page=NaN forever.\n// soundee-core republish r6 (2026-08-25, react-query v4) — rebuild for the\n// v4/v5 compatibility fix in lib/query_client.tsx. Framer resolves the bare\n// @tanstack/react-query to v4, where `isPending` does not exist: reading it\n// gave undefined, so the catalogue drew \"No results\" over a list it had\n// never finished asking for.\n// soundee-core republish r5 (2026-08-25, engine fix) — rebuild for the\n// corrected dynamic import in lib/audio/engine.tsx (../store -> ../../store).\n// That path resolved nowhere, which is the code error that blocked Update in\n// the Starter. Importers do not rebuild when only an imported file changes.\n// soundee-core republish (2026-08-25) — rebuild so this component picks up the\n// shared playlist runtime (store/playlist.tsx moved onto globalThis). Without a\n// rebuild it keeps its own inlined copy and playback state stays split.\n// soundee-core republish r3 (2026-08-18 23:05) — forces a fresh module version\n// so every Starter instance is offered an update and all bundles\n// land on the same runtime.\n// instance is offered an update and all bundles land on the same runtime.\nimport{jsx as _jsx,Fragment as _Fragment}from\"react/jsx-runtime\";import*as React from\"react\";import{applyBrand,playBrand,rowBrand,useBrandOverrides}from\"https://framerusercontent.com/modules/yD9Ys9s3cEToBITrvdLi/73etEDTq7Xf4D5LzHkb0/brand.js\";import{addPropertyControls,ControlType}from\"framer\";import{fetchTracks}from\"https://framerusercontent.com/modules/QPiVLQ8pWtFwIWe9M71m/hbdnbW4sKeMG2B4atCYP/tracks.js\";import{fetchKits}from\"https://framerusercontent.com/modules/u01nLA2TxhrBVsJbMdIY/7clHsW8v6Gr4eEz4Wl9k/kits.js\";import{fetchServices}from\"https://framerusercontent.com/modules/uYhc7dcU9wJhrw3dQo2q/96Gbzly6TItrSvfOAXEu/services.js\";import{usePlayerSelector}from\"https://framerusercontent.com/modules/hbBOc6MLN4T1PPsVYazn/WeepVp6C1ldGcXBvdxj6/engine.js\";import{upsertKits,upsertServices,upsertTracks}from\"https://framerusercontent.com/modules/Fa9rFJN2rq85gl2rXBgV/AVjJVDZFaBnNLsPAn8ph/entities.js\";import{isLiked,useLikeStore}from\"https://framerusercontent.com/modules/FCo7CeK86NShihctg8Ql/5vsld33GwD57YYnnUFr3/likes.js\";import{normalizeSlot,cloneSlotWithUniqueLayout}from\"https://framerusercontent.com/modules/h8NiJEJpWFHyeRETbmyt/8yFZXOUwH5F5bkx7bL6Q/slot.js\";import{getTrackSlotProps}from\"https://framerusercontent.com/modules/bs66RNZmDeSAF9w44OdZ/PyzQ8vf7r7QnaBnxYbAQ/track.js\";import{DEMO_TRACK_ENTITY}from\"https://framerusercontent.com/modules/y33CnMbsLsRpKYyVdkip/ovJVzRba4ULeCAGmCMSq/entity_actions.js\";import{BuiltInProductCard,BuiltInProductCardSkeleton,COVER_GLASS}from\"https://framerusercontent.com/modules/uq7DruyCvJdeAn2MHpta/3WYlmWBJ6D4W2Jez4sXd/BuiltInProductCard.js\";/**\n * The arrows' own glass, lighter than the controls on a cover.\n *\n * Those always sit on artwork; an arrow spends half its time over the page\n * beside the first and last card, where a veil made for a busy image is close\n * to nothing at all. The icon colour is the producer's — Card Style's Text —\n * so this is only what it sits on.\n */const ARROW_VEIL=\"rgba(255,255,255,0.28)\";/**\n * Hover lifts the veil rather than darkening it, the same way the cover's\n * own play and like do. Further than theirs, because it starts further: the\n * arrow is already at the cover controls' hover level standing still, so\n * matching that number would be no response at all.\n */const ARROW_VEIL_HOVER=\"rgba(255,255,255,0.42)\";import{DEFAULT_CHIP_TOKENS,DEFAULT_PLAY_TOKENS,DEFAULT_ROW_TOKENS,chipTokenControls,playTokenControls,rowTokenControls}from\"https://framerusercontent.com/modules/8841CNm8EKjvZRVrjFfe/IYq9trq37cXscGsUnnZL/tokens.js\";import SoundeeCatalogCarousel,{parseFilterQuery}from\"https://framerusercontent.com/modules/bSn575zvL2DdLusO1e7F/dAzNRyvvyLRHLqdmEL6U/SoundeeCatalogCarousel.js\";import{buildSourceParams,useExcludeTrackId}from\"https://framerusercontent.com/modules/vU9ONunXtgjMhgntbHBm/xMctimlGPN1F1VrKhWj7/catalog_source.js\";// Playlist is intentionally omitted here: the tracks carousel browses,\n// favorites, and history only. Saved-playlist lists live in the standalone\n// Soundee Tracks List.\n// See CATALOG_SOURCE_OPTIONS: History is no longer offered.\nconst SOURCE_OPTIONS=[\"Tracks\",\"Favorites\"];/**\n * The six things that differ between a carousel of tracks, kits and services.\n *\n * They were three components with one shape; keeping the difference in a table\n * is what stops the fourth improvement from landing in only one of them —\n * which is exactly how the list gained `isActive` and the carousel did not.\n */const KINDS={Tracks:{entityPath:\"/tracks\",filterEntityType:\"tracks\",// Only tracks play, and only tracks carry BPM and key to chip out.\nplayable:true,fetchFn:fetchTracks,upsertFn:upsertTracks,select:entities=>entities.tracks},Kits:{entityPath:\"/kits\",filterEntityType:\"kits\",playable:false,fetchFn:fetchKits,upsertFn:upsertKits,select:entities=>entities.kits},Services:{entityPath:\"/services\",filterEntityType:\"services\",playable:false,fetchFn:fetchServices,upsertFn:upsertServices,select:entities=>entities.services}};const selectEntityId=s=>s.entityId;const selectIsPlaying=s=>s.isPlaying;// Stable references for the built-in card's props: the card is memoised, so a\n// value that is rebuilt every render (a fresh `[]`, a spread copy of the\n// entity) would quietly undo that for every kit and service on the shelf.\nconst EMPTY_META=[];// A kit or service goes to the card with a composed `subtitle`; cached by the\n// entity object's identity so the same entity yields the same card props until\n// the store actually replaces it.\nconst subtitledEntityCache=new WeakMap;function withSubtitle(entity){const cached=subtitledEntityCache.get(entity);if(cached)return cached;const value={...entity,subtitle:[entity.kitType??entity.serviceType,entity.artistName].filter(Boolean).join(\" \\xb7 \")};subtitledEntityCache.set(entity,value);return value;}const PREVIEW_TRACKS=Array.from({length:12},(_,index)=>({...DEMO_TRACK_ENTITY,entityId:9100+index,trackId:9100+index,title:[\"Midnight Bounce\",\"Golden Hour\",\"Cold Streets\",\"Sunday Drive\",\"Late Night Keys\",\"Ocean View\",\"No Signal\",\"Blue Smoke\",\"After Party\",\"Neon Soul\",\"Lost Files\",\"Velvet Drums\"][index],duration:120+index*7,durationFormatted:`${2+Math.floor(index/6)}:${String(8+index*7%52).padStart(2,\"0\")}`,genre:index%2===0?\"Hip Hop\":\"R&B\",bpm:72+index*4,keyString:index%2===0?\"C Minor\":\"F# Minor\",price:29.99+index,minLicensePrice:29.99+index,urlSlug:`demo-carousel-track-${index+1}`}));const TrackCardWrapper=/*#__PURE__*/React.memo(function TrackCardWrapper({track,index,template,instanceId}){const activeEntityId=usePlayerSelector(selectEntityId);const playing=usePlayerSelector(selectIsPlaying);const isActive=track.entityId===activeEntityId;const isPlaying=isActive&&playing;// No `onClick` is injected here. Designers compose play behaviour by\n// dropping a `SoundeePlayButton` (or any interaction component) inside the\n// Track Item — it picks up the playlist via `PlaylistContext` from the\n// carousel.\nconst rowProps={style:{width:\"100%\",boxSizing:\"border-box\"},variant:isActive?isPlaying?\"Playing\":\"Active\":\"Paused\",// Same state as the variant, but bindable per layer. Kept identical to\n// the tracks list so a row template works in both.\nisActive,isPlaying,index,...getTrackSlotProps(track)};if(template&&/*#__PURE__*/React.isValidElement(template)){return /*#__PURE__*/_jsx(_Fragment,{children:cloneSlotWithUniqueLayout(template,rowProps,`${instanceId}-${track.entityId}`)});}return null;});const DEFAULT_CARD={showPlay:true,showPrice:true,showLike:true,showCoverBorder:false};const DEFAULT_ARROWS={alignMode:\"item\",aspectRatio:1};/**\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight auto\n * @framerDisableUnlink\n */export default function SoundeeTracksCarousel({entityKind=\"Tracks\",cardStyle=DEFAULT_ROW_TOKENS,playTokens=DEFAULT_PLAY_TOKENS,chipTokens=DEFAULT_CHIP_TOKENS,metaTypes=[\"artists\"],card,trackItem,previewState=\"Data\",limit=20,gap=16,itemsPerView=3,peek=0,maskWidth=60,source=\"Tracks\",filters=\"\",excludeId=0,showArrows=true,arrows,style}){// Brand before anything else: what the producer set in SoundeeModals is\n// this component's default, and a value set here on the instance still\n// wins. Untouched SoundeeModals means untouched behaviour.\nconst brand=useBrandOverrides();cardStyle=applyBrand(DEFAULT_ROW_TOKENS,rowBrand(brand),cardStyle);playTokens=applyBrand(DEFAULT_PLAY_TOKENS,playBrand(brand),playTokens);// Merged field by field: Framer stores an object control as whatever the\n// producer touched, so a group can arrive with two of its four keys.\nconst cardOpts={...DEFAULT_CARD,...card};const arrowOpts={...DEFAULT_ARROWS,...arrows};const kind=KINDS[entityKind]??KINDS.Tracks;const template=normalizeSlot(trackItem);// Nothing connected means the built-in card, the same switch the tracks\n// list makes for its row.\nconst builtIn=!/*#__PURE__*/React.isValidElement(template);const excludeTrackId=useExcludeTrackId(excludeId);const resolvedFilters=React.useMemo(()=>{const base=parseFilterQuery(filters);const sourceParams=buildSourceParams(source,{excludeTrackId});const sourceFilters=Object.entries(sourceParams).map(([key,value])=>({key,value:String(value)}));return[...base,...sourceFilters];},[filters,source,excludeTrackId]);const selectEntitiesFn=React.useCallback(entities=>kind.select(entities),[kind]);const getEntityIdsFn=React.useCallback(data=>data.pages.flatMap(p=>p.items.map(t=>t.entityId)),[]);// Favorites membership is the like state, so unliking must drop the item.\n// Filter locally instead of refetching (see SoundeeCatalogCarousel).\n// `version` drives the local filter (a row must go the instant the heart\n// empties); `serverVersion` drives the refresh, which has to wait for the\n// write or it re-reads the membership from before the click.\nconst{version:likeVersion,serverVersion:likeServerVersion}=useLikeStore();const isFavorites=source===\"Favorites\";const filterItemIdsFn=React.useCallback(ids=>isFavorites?ids.filter(id=>isLiked(id)):ids,[isFavorites,likeVersion]);const renderSkeletonFn=React.useCallback((i,instanceId)=>{if(builtIn){return /*#__PURE__*/_jsx(BuiltInProductCardSkeleton,{index:i,tokens:cardStyle,showPrice:cardOpts.showPrice},`skeleton-${i}`);}if(!template||!/*#__PURE__*/React.isValidElement(template))return null;return /*#__PURE__*/_jsx(React.Fragment,{children:cloneSlotWithUniqueLayout(template,{variant:\"Skeleton\",style:{width:\"100%\"}},`${instanceId}-skeleton-${i}`)},`skeleton-${i}`);},[template,builtIn,cardStyle,cardOpts.showPrice]);const renderItemFn=React.useCallback((track,index,_playlistId,instanceId)=>builtIn?/*#__PURE__*/_jsx(BuiltInProductCard,{entity:kind.playable?track:withSubtitle(track),tokens:cardStyle,playTokens:playTokens,// Track metadata only: a kit has no BPM to chip, and asking\n    // for chips it cannot fill leaves a gap under every title.\n    metaTypes:kind.playable?metaTypes:EMPTY_META,playable:kind.playable,// Not `cardOpts.showPlay`: the control is gone and the\n    // answer is always yes — see the hidden control.\n    showPlay:true,showPrice:cardOpts.showPrice,showCoverBorder:cardOpts.showCoverBorder,showLike:true,// No fallback path any more: a title links where the CMS\n    // link component found a page, and stays plain text where\n    // it did not. A guessed /beats/… is a confident link to a\n    // page nobody built.\n    detailsUrl:\"\"},track.entityId):/*#__PURE__*/_jsx(TrackCardWrapper,{track:track,index:index+1,template:template,instanceId:instanceId},track.entityId),[template,builtIn,cardStyle,playTokens,metaTypes,cardOpts.showPlay,cardOpts.showPrice,cardOpts.showCoverBorder,cardOpts.showLike]);return /*#__PURE__*/_jsx(SoundeeCatalogCarousel,{filterEntityType:kind.filterEntityType,entityPath:kind.entityPath,limit:limit,gap:gap,itemsPerView:itemsPerView,peek:peek,maskWidth:maskWidth,initialFilters:resolvedFilters,previewState:previewState,showArrows:showArrows,arrowAlignMode:arrowOpts.alignMode,// Only when the built-in card is drawing: a connected design gets\n// the arrows it was given, or none, exactly as before.\narrowSkin:builtIn?{// The same glass the cover's own play and like sit\n// on: these arrows overlap those covers, so a second\n// treatment would read as a different set of\n// controls. No edge, for the same reason — an outline\n// over artwork is a line the artwork did not ask for.\nfill:ARROW_VEIL,fillHover:ARROW_VEIL_HOVER,border:\"transparent\",radius:cardStyle.buttonRadius,color:cardStyle.textPrimary,// The same glass the cover's own controls sit on.\nbackdrop:COVER_GLASS}:undefined,// The built-in card's artwork is square, so that is what the arrows\n// line up on — level with the cover, not with the title under it.\nitemAspectRatio:builtIn?1:arrowOpts.aspectRatio,style:style,fetchFn:kind.fetchFn,upsertFn:kind.upsertFn,getEntityIds:getEntityIdsFn,selectEntities:selectEntitiesFn,filterItemIds:filterItemIdsFn,refreshOnEntry:isFavorites,refreshVersion:likeServerVersion,renderSkeleton:renderSkeletonFn,renderItem:renderItemFn,previewItems:PREVIEW_TRACKS});}// \"Carousel\", not \"Tracks Carousel\": the Type control switches it between\n// tracks, kits and services, and a name that claims one of the three made\n// people go looking for the other two. The file and export keep their names —\n// renaming those would re-identify the module and orphan every instance.\nSoundeeTracksCarousel.displayName=\"Soundee Carousel\";// Typed rather than inferred: a bare literal widens the enums to `string`,\n// which Framer's checker rejects when the component is registered.\nconst carouselDefaults={entityKind:\"Tracks\",source:\"Tracks\",filters:\"\",excludeId:0,cardStyle:DEFAULT_ROW_TOKENS,playTokens:DEFAULT_PLAY_TOKENS,chipTokens:DEFAULT_CHIP_TOKENS,metaTypes:[\"artists\"],card:DEFAULT_CARD,arrows:DEFAULT_ARROWS};SoundeeTracksCarousel.defaultProps=carouselDefaults;/** A connected design replaces the built-in card, so its settings go quiet. */function hasItem(props){const slot=props.trackItem;return Array.isArray(slot)?slot.length>0:!!slot;}addPropertyControls(SoundeeTracksCarousel,{entityKind:{type:ControlType.Enum,title:\"Type\",options:[\"Tracks\",\"Kits\",\"Services\"],optionTitles:[\"Tracks\",\"Kits\",\"Services\"],defaultValue:\"Tracks\",displaySegmentedControl:true,description:\"Which catalogue this browses. Source, inside Content, is a \"+\"different question: it picks between everything, favorites and \"+\"history within this type.\"},// ── What it loads ─────────────────────────────────────────────────────\n// Flat, not grouped: these are the three a producer binds — to a component\n// variable, or to the CMS field of the page the shelf sits on — and Framer\n// cannot reach a field inside an object control to bind it.\nsource:{type:ControlType.Enum,title:\"Source\",options:SOURCE_OPTIONS,optionTitles:SOURCE_OPTIONS,defaultValue:\"Tracks\",description:\"Tracks browses the catalogue with the filters below. Favorites \"+\"and History both need a signed-in visitor and show nothing to \"+\"anyone else. Unlike a list, a carousel never follows the filter \"+\"bar — it is a fixed shelf, so what it holds is decided here.\"},filters:{type:ControlType.String,title:\"Filters\",placeholder:\"genre=hip-hop&sort=trending\",defaultValue:\"\",hidden:props=>props.source!==\"Tracks\",description:\"A query string, written the way it appears in an address: \"+\"genre=hip-hop&sort=trending. This is what makes one shelf \"+\"Trending and the next one R&B. Bind it to drive a shelf from the \"+\"page it sits on.\"},excludeId:{type:ControlType.Number,title:\"Exclude\",defaultValue:0,min:0,step:1,displayStepper:false,description:\"An entity id to leave out — bind it to the current page's track \"+\"so a More Beats shelf does not offer the one being viewed. \"+\"0 leaves everything in.\"},trackItem:{// Hidden until something is connected: the built-in card is what this\n// component is for now, and a slot nobody fills is a panel entry that\n// only invites a rebuild. Instances already using one keep theirs, and\n// can still take it out.\nhidden:props=>!props.trackItem,type:ControlType.Slot,title:\"Item\",maxCount:1,description:\"Optional. Left empty, a finished card is drawn and styled by the \"+\"settings below.\"},card:{type:ControlType.Object,title:\"Card\",icon:\"object\",buttonTitle:\"Contents\",defaultValue:DEFAULT_CARD,hidden:hasItem,description:\"What the card carries besides the artwork and the title.\",controls:{showPlay:{type:ControlType.Boolean,title:\"Play\",defaultValue:DEFAULT_CARD.showPlay,enabledTitle:\"Show\",disabledTitle:\"Hide\",description:\"On the cover, fading in on hover — and always on the one \"+\"playing. With it off the cover itself still starts the \"+\"track.\",// Always on: a shelf card without a play button is a poster,\n// and the heart is how a visitor keeps something. Hidden\n// rather than deleted so a stored `false` is not lost — the\n// card ignores it either way.\nhidden:()=>true},showPrice:{type:ControlType.Boolean,title:\"Price\",defaultValue:DEFAULT_CARD.showPrice,enabledTitle:\"Show\",disabledTitle:\"Hide\",description:\"The buy button under the title. Off leaves the shelf \"+\"browsable but with no way to reach the licenses.\"},showLike:{type:ControlType.Boolean,title:\"Like\",defaultValue:DEFAULT_CARD.showLike,enabledTitle:\"Show\",disabledTitle:\"Hide\",description:\"The heart, in the cover's bottom-left. A signed-out \"+\"visitor is sent to the overlay named auth instead of \"+\"liking.\",// Always on: a shelf card without a play button is a poster,\n// and the heart is how a visitor keeps something. Hidden\n// rather than deleted so a stored `false` is not lost — the\n// card ignores it either way.\nhidden:()=>true},showCoverBorder:{type:ControlType.Boolean,title:\"Cover Border\",defaultValue:DEFAULT_CARD.showCoverBorder,enabledTitle:\"Show\",disabledTitle:\"Hide\",description:\"A hairline around the artwork. Off by default: an outline \"+\"over a cover is a line the artwork did not ask for, and \"+\"on a dark one it reads as a halo — but it tidies up a row \"+\"of pale covers.\"}}},metaTypes:{type:ControlType.Array,title:\"Meta\",control:{type:ControlType.Enum,options:[\"artists\",\"displayName\",\"genre\",\"moods\",\"tags\",\"bpm\",\"key\"],optionTitles:[\"Artists\",\"Display Name\",\"Genre\",\"Moods\",\"Tags\",\"BPM\",\"Key\"],defaultValue:\"artists\"},defaultValue:[\"artists\"],maxCount:4,hidden:hasItem,description:\"The line under the title, in the order you list them. A field an \"+\"item does not have is left out rather than shown empty. Empty \"+\"leaves the title on its own.\"},// ── How many, how wide ────────────────────────────────────────────────\n// Flat, not grouped: these four and Show Arrows below are what a producer\n// sets per breakpoint — five across on a desktop, one with a peek on a\n// phone — and a Framer override replaces a whole object rather than a\n// single field inside one.\nitemsPerView:{type:ControlType.Number,title:\"Items to Show\",defaultValue:3,min:1,max:8,step:1,displayStepper:true,description:\"How many cards fill the width. Set it per breakpoint — five on a \"+\"desktop and one on a phone is the usual shape.\"},gap:{type:ControlType.Number,title:\"Gap\",defaultValue:16,min:0,max:40,step:1,unit:\"px\",description:\"Space between cards. It is taken out of their width, so raising \"+\"it makes each card narrower rather than widening the carousel.\"},peek:{type:ControlType.Number,title:\"Peek\",defaultValue:0,min:0,max:200,step:1,unit:\"px\",description:\"How much of the next card shows past the edge. A little is what \"+\"tells a visitor there is more to swipe — worth setting on a phone \"+\"even when it is 0 everywhere else.\"},maskWidth:{type:ControlType.Number,title:\"Mask Width\",defaultValue:60,min:0,max:200,step:1,unit:\"px\",description:\"A fade at both edges, so cards leave softly instead of being cut \"+\"off. 0 turns it off, which is what you want against a hard edge \"+\"like a card or a section border.\"},// ── Arrows ────────────────────────────────────────────────────────────\nshowArrows:{type:ControlType.Boolean,title:\"Arrows\",defaultValue:true,enabledTitle:\"Show\",disabledTitle:\"Hide\",description:\"The built-in arrows, which fade in at the edge there is more \"+\"past. Set per breakpoint: they earn their place on a desktop and \"+\"are usually off on a phone, where swiping is the gesture.\"},arrows:{type:ControlType.Object,title:\"Arrow Align\",icon:\"interaction\",buttonTitle:\"Align\",defaultValue:DEFAULT_ARROWS,hidden:props=>!props.showArrows,description:\"Where the arrows sit vertically. Only worth opening when the card \"+\"is your own design — the built-in card lines them up with the \"+\"cover on its own.\",controls:{alignMode:{type:ControlType.Enum,title:\"Align To\",options:[\"item\",\"aspect\"],optionTitles:[\"Item\",\"Artwork\"],defaultValue:DEFAULT_ARROWS.alignMode,displaySegmentedControl:true,description:\"Item centres them on the whole card, which drifts low \"+\"when there is a title under the cover. Artwork centres \"+\"them on the image instead.\"},aspectRatio:{type:ControlType.Number,title:\"Artwork Ratio\",defaultValue:DEFAULT_ARROWS.aspectRatio,min:.1,max:4,step:.01,hidden:props=>props.alignMode!==\"aspect\",description:\"The shape of your artwork, as width divided by height. \"+\"1 is square, 1.78 is 16/9. It is how the arrows work out \"+\"where the image ends.\"}}},// ── The card ──────────────────────────────────────────────────────────\ncardStyle:{...rowTokenControls,title:\"Card Style\",hidden:hasItem},playTokens:{...playTokenControls,hidden:props=>hasItem(props)||props.card?.showPlay===false},chipTokens:{...chipTokenControls,// The card writes its meta as a line of text under the title, not as\n// chips, so nothing here reaches anything. Hidden rather than removed:\n// a control that vanishes takes an instance's stored value with it.\nhidden:()=>true},previewState:{type:ControlType.Enum,title:\"Preview\",options:[\"Data\",\"Empty\",\"Loading\"],optionTitles:[\"Data\",\"Empty\",\"Loading\"],defaultValue:\"Data\",displaySegmentedControl:true,description:\"Canvas only, so you can lay out the empty and loading states \"+\"without waiting for them. The published site ignores it.\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"SoundeeTracksCarousel\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"auto\",\"framerDisableUnlink\":\"\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"any\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],"mappings":"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"}