{"version":3,"file":"SoundeeWaveform.CSnGV9ru.mjs","names":["React.useState","React.useMemo","_Fragment","Popover","React.useRef","React.useCallback","React.useMemo","React.useCallback","React.useSyncExternalStore","React.useState","React.useRef","React.useCallback"],"sources":["https:/framerusercontent.com/modules/jUfrK8MfKpQBn73ZLkel/t02PRp37vpA8YjRTDYZZ/RowMenu.js","https:/framerusercontent.com/modules/qPgD7bnZ8wqAonggSMlQ/qn9zmWDQhqCdxyz6v0cX/useSeekGesture.js","https:/framerusercontent.com/modules/xCcUCztOE3T5z5I5xW15/OmwvQ1Xzh1uxHOSoRb1U/useSeekUi.js","https:/framerusercontent.com/modules/HVrMNWKoZuYC0usz10zo/HtTQ18YxOR0S2FsWahL4/use_theme.js","https:/framerusercontent.com/modules/1u8PIfOqQL2tiomtmdkF/NkQIOVtn5C4IjKg3ZtgN/WaveformRenderer.js","https:/framerusercontent.com/modules/iWOo1RzPdyc5HALCc7pK/1QBEHQwiXykScjduBgEf/api.js","https:/framerusercontent.com/modules/ucOncfIOoCB7bcXfAfGl/Lg4zY1upzVkL2o9qGdGJ/SoundeeWaveform.js"],"sourcesContent":["// soundee-core rebuild r14 (2026-09-18) — cache bust, 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 r10 (2026-08-25) — radix comes from\n// lib/vendor/radix.tsx now instead of a bare `@radix-ui/...` name. A built\n// module pins the exact build of everything it imports, so every file in that\n// chain needs a content change of its own or it keeps loading the copy that\n// still carried the bare specifier. Pushed deepest-first, because a file\n// rebuilt before its dependencies pins the old ones again.\nimport{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import*as React from\"react\";// Same specifier as SoundeePopover on purpose: two spellings of the same\n// package resolve to two module instances.\nimport{AnimatePresence,motion}from\"framer-motion\";import{Popover}from\"https://framerusercontent.com/modules/iEdaCTPcjIZ4juIbTj9T/7Wd0LTBGTN2i6lAe4Veh/radix.js\";import{SoundeeIcon}from\"https://framerusercontent.com/modules/jztQr8fR84sBOB7CCVtd/trr3UrorLCOOyEOVhQmb/icons.js\";import{SoundeeDialog}from\"https://framerusercontent.com/modules/O60C240xSqPv1FtQHfho/b7n5E3JqZkPRnWfzfUgL/SoundeeDialog.js\";import SoundeeChipList from\"https://framerusercontent.com/modules/PC57mgvaDV9A9sP8uwDw/PTfCnKrb1Id3zHIs1a79/SoundeeChipList.js\";import{HoverButton,tint}from\"https://framerusercontent.com/modules/zp2tRJqH3ga0tv6J2W6H/s0YuByx9Fwo8PgJYM7sn/hover_button.js\";import{menuItemHover,menuItemStyle}from\"https://framerusercontent.com/modules/BN0w3b2Q9pvHMH4QxWME/QOjnDvubFO3lOejZV8za/SoundeeMenu.js\";import{resolveEntityActions}from\"https://framerusercontent.com/modules/y33CnMbsLsRpKYyVdkip/ovJVzRba4ULeCAGmCMSq/entity_actions.js\";import{useCmsLinkTemplate,followCmsLink,useResolvedCmsHref}from\"https://framerusercontent.com/modules/W9fjsr5lFdL2bnlC2Asr/kcV7c8GVsKn0YK9iXBRH/cms_link_slot.js\";import{resolveEntityUrlTemplates}from\"https://framerusercontent.com/modules/3k8Y3cHpFSqmVB6KTjnO/4pnR3qwdQXwXRlbiSoxC/entity_url.js\";import{useSoundeeConfig}from\"https://framerusercontent.com/modules/MnaOjDKPmXIgElrPjVea/j93inx32wsgSBRR1iqSG/config.js\";import{openSoundeeOverlay}from\"https://framerusercontent.com/modules/JWE25h6PrJ9N8RSe2d8l/rwQ7b5YTPb3c7KuBqZJd/open_overlay.js\";import{hasSoundeeModals,useModalTheme}from\"https://framerusercontent.com/modules/0GpgGzS00VxJis3gSiB4/xQvXV8rHdeXnAzSd0ksq/registry.js\";import{ROW_METRICS}from\"https://framerusercontent.com/modules/8841CNm8EKjvZRVrjFfe/IYq9trq37cXscGsUnnZL/tokens.js\";// The row already has its own Add To Cart and Like affordances; repeating them\n// in the menu would give two controls for the same thing.\nconst MENU_ACTION_TYPES=[\"viewDetails\",\"share\",\"download\"];export function RowMenu({track,tokens,subtitleTypes,titleGap,liked,onToggleLike,isCanvas,isMobile,trigger}){const[open,setOpen]=React.useState(false);const cfg=useSoundeeConfig();const modalTheme=useModalTheme();// Every floating panel on the page is styled from one place. This menu is\n// a popover on desktop and a sheet on mobile, and the sheet was already\n// drawing itself from SoundeeModals through SoundeeDialog — so the popover\n// taking its surface from the track row meant the same menu looked like the\n// row on one breakpoint and like the modals on the other.\n//\n// The row's own tokens remain the fallback: nothing here should stop\n// working on a page where no SoundeeModals was placed.\nconst modals=hasSoundeeModals();const menu=React.useMemo(()=>({surface:modals?modalTheme.surface:tokens.menuSurface,border:modals?modalTheme.border:tokens.border,radius:modals?modalTheme.radius:tokens.radius,accent:modals?modalTheme.accent:tokens.accent,textPrimary:modals?modalTheme.textPrimary:tokens.textPrimary,textSecondary:modals?modalTheme.textSecondary:tokens.textSecondary,fontTitle:modals?modalTheme.fontTitle:tokens.fontTitle,fontBody:modals?modalTheme.fontBody:tokens.fontMeta}),[modals,modalTheme,tokens]);const templates=React.useMemo(()=>resolveEntityUrlTemplates(null,cfg.urlTemplates),[cfg.urlTemplates]);// Reuses the shared action resolver rather than restating the rules here —\n// it already knows Demo Download only applies when `canDemoDownload`, and\n// which actions make sense per entity type.\nconst cmsHref=useResolvedCmsHref(track.entityId);const hasCmsLinks=!!useCmsLinkTemplate();const actions=React.useMemo(()=>{return resolveEntityActions({entity:track,entityId:track.entityId,templates,detailsHref:cmsHref,isLiked:liked,origin:typeof window===\"undefined\"?undefined:window.location.origin}).filter(action=>MENU_ACTION_TYPES.includes(action.type))// Share needs somewhere to point. When this store links to CMS\n// pages, an item that has none has nothing to share, and offering\n// it is a dead end — a sync covers a subset of a catalogue, and a\n// track added an hour ago is in none of it.\n//\n// Only when a link component is actually placed: without one\n// nothing resolves an address here, and hiding on that basis would\n// take Share off every site that does not use it. Both values come\n// from hooks, so the menu re-renders when an address lands rather\n// than answering from whatever was known at first paint.\n.filter(action=>action.type!==\"share\"||!hasCmsLinks||!!cmsHref)// View Details needs a page that exists, and the only thing that\n// knows one does is the link component that found it. The url\n// templates behind this action have defaults — `/tracks/{slug}` and\n// the rest — so without this it offers a confident link to a page\n// nobody built, for every item a sync has not reached.\n//\n// Unconditional, unlike Share: a store with no link component has\n// no detail pages to point at, and a guessed address is worse than\n// no menu row.\n.filter(action=>action.type!==\"viewDetails\"||!!cmsHref);},[track,templates,liked,hasCmsLinks,cmsHref]);function runAction(action){if(isCanvas)return;if(action.href){// Through Framer's router when the link component has an anchor\n// standing by, which is a route change rather than a reload of the\n// whole site. The address is the fallback, not the first choice.\nif(!followCmsLink(track.entityId)){window.location.href=action.href;}}else if(action.modalName){openSoundeeOverlay({name:action.modalName,withEntity:true,entityId:track.entityId});}if(action.closeOnAction!==false)setOpen(false);}// Shared with the account menu, which draws the same rows. This is where\n// both copies used to be, until there were two.\nconst itemStyle=menuItemStyle(menu,isMobile);const itemHover=menuItemHover(menu);const panelStyle={border:`1px solid ${menu.border}`,// Opaque, not the translucent row surface: a menu floating over content\n// needs to be readable, and the row token is deliberately near-clear.\nbackground:menu.surface,overflow:\"hidden\"};const panel=/*#__PURE__*/_jsxs(_Fragment,{children:[isMobile&&/*#__PURE__*/_jsxs(\"div\",{style:{display:\"flex\",alignItems:\"center\",gap:14,padding:\"6px 18px 18px\",borderBottom:`1px solid ${menu.border}`},children:[/*#__PURE__*/_jsx(\"div\",{style:{width:52,height:52,flexShrink:0,borderRadius:Math.min(menu.radius,10),overflow:\"hidden\",background:track.artworkColor||menu.border},children:track.artworkUrlSmall&&/*#__PURE__*/_jsx(\"img\",{src:track.artworkUrlSmall,alt:\"\",loading:\"lazy\",style:{width:\"100%\",height:\"100%\",objectFit:\"cover\",display:\"block\"}})}),/*#__PURE__*/_jsxs(\"div\",{style:{flex:1,minWidth:0,display:\"flex\",flexDirection:\"column\",gap:titleGap},children:[/*#__PURE__*/_jsx(\"div\",{style:{color:menu.textPrimary,overflow:\"hidden\",textOverflow:\"ellipsis\",whiteSpace:\"nowrap\",...menu.fontTitle},children:track.title}),subtitleTypes.length>0&&/*#__PURE__*/_jsx(SoundeeChipList,{entityID:track.entityId,chipTypes:subtitleTypes,// Same configuration as the row's subtitle,\n// so the same track doesn't read differently\n// in the menu than in the list.\nitemLimit:\"auto\",maxChips:8,showRemaining:false,truncate:true,gap:4,textStyle:{font:menu.fontBody,color:menu.textSecondary,separator:\",\"}})]}),/*#__PURE__*/_jsx(HoverButton,{onClick:onToggleLike,\"aria-label\":liked?\"Unlike\":\"Like\",\"aria-pressed\":liked,hoverStyle:{background:tint(menu.accent,12),color:menu.accent},style:{display:\"inline-flex\",alignItems:\"center\",justifyContent:\"center\",width:36,height:36,flexShrink:0,border:\"none\",background:\"transparent\",borderRadius:999,color:liked?menu.accent:menu.textSecondary,cursor:\"pointer\"},children:/*#__PURE__*/_jsx(SoundeeIcon,{name:\"heart\",size:20,filled:liked})})]}),/*#__PURE__*/_jsx(\"div\",{style:{padding:isMobile?\"6px 0 10px\":\"6px\",display:\"flex\",flexDirection:\"column\",// A hairline, so two rows never merge while one is\n// held down.\ngap:1},children:actions.map(action=>/*#__PURE__*/_jsx(HoverButton,{onClick:()=>runAction(action),disabled:action.disabled,hoverStyle:itemHover,style:{...itemStyle,opacity:action.disabled?.4:1,cursor:action.disabled?\"not-allowed\":\"pointer\"},children:action.type===\"download\"?\"Demo Download\":action.label},action.type))})]});// Same `Row Layout` the row itself uses, rather than a media query: one\n// source of truth, set per Framer breakpoint, and no server render that\n// guesses the wrong variant and corrects after hydration.\nif(isMobile){// Reuses the shared dialog rather than a second sheet implementation:\n// exit animation, focus trap and scroll lock then behave identically to\n// the license picker, and there is one place to fix them.\nreturn /*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(\"span\",{onClick:()=>!isCanvas&&setOpen(true),children:trigger}),/*#__PURE__*/_jsx(SoundeeDialog,{open:open,onOpenChange:setOpen,theme:modalTheme,sheet:true,label:track.title,children:panel})]});}return /*#__PURE__*/_jsxs(Popover.Root,{open:open,onOpenChange:isCanvas?undefined:setOpen,children:[/*#__PURE__*/_jsx(Popover.Trigger,{asChild:true,children:trigger}),/*#__PURE__*/_jsx(AnimatePresence,{children:open&&/*#__PURE__*/_jsx(Popover.Portal,{forceMount:true,children:/*#__PURE__*/_jsx(Popover.Content,{asChild:true,forceMount:true,align:\"end\",sideOffset:8,collisionPadding:12,onOpenAutoFocus:event=>event.preventDefault(),children:/*#__PURE__*/_jsx(motion.div,{initial:{opacity:0,y:-4},animate:{opacity:1,y:0},exit:{opacity:0,y:-4},transition:modalTheme.transition,style:{...panelStyle,zIndex:9999,// Hugs its labels. They are identical on\n// every track now that the header is gone,\n// so there is nothing left to resize\n// between one row and the next.\nwidth:\"max-content\",minWidth:ROW_METRICS.menuMinWidth,borderRadius:menu.radius,boxShadow:\"0 18px 48px rgba(0,0,0,0.45)\"},children:panel})})})})]});}\nexport const __FramerMetadata__ = {\"exports\":{\"RowMenu\":{\"type\":\"reactComponent\",\"name\":\"RowMenu\",\"slots\":[],\"annotations\":{\"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\nimport*as React from\"react\";import{seekTo}from\"https://framerusercontent.com/modules/hbBOc6MLN4T1PPsVYazn/WeepVp6C1ldGcXBvdxj6/engine.js\";export function useSeekGesture({elementRef,enabled,threshold=0,onTap,onSeekEnd}){const seekingRef=React.useRef(false);const pendingRef=React.useRef(null);const onTapRef=React.useRef(onTap);const onSeekEndRef=React.useRef(onSeekEnd);onTapRef.current=onTap;onSeekEndRef.current=onSeekEnd;const getRatio=React.useCallback(clientX=>{const el=elementRef.current;if(!el)return 0;const rect=el.getBoundingClientRect();return rect.width>0?Math.max(0,Math.min(1,(clientX-rect.left)/rect.width)):0;},[elementRef]);const releaseCapture=React.useCallback(e=>{if(e.currentTarget.hasPointerCapture(e.pointerId)){e.currentTarget.releasePointerCapture(e.pointerId);}},[]);const onPointerDown=React.useCallback(e=>{if(!enabled)return;e.stopPropagation();e.currentTarget.setPointerCapture(e.pointerId);if(threshold>0&&e.pointerType===\"touch\"){pendingRef.current={startX:e.clientX,startY:e.clientY};}else{seekingRef.current=true;}},[enabled,threshold]);const onPointerMove=React.useCallback(e=>{if(pendingRef.current){const dx=e.clientX-pendingRef.current.startX;const dy=e.clientY-pendingRef.current.startY;if(Math.abs(dx)>=threshold){pendingRef.current=null;seekingRef.current=true;}else if(Math.abs(dy)>=threshold){pendingRef.current=null;releaseCapture(e);}return;}if(seekingRef.current){e.stopPropagation();}},[threshold,releaseCapture]);const onPointerUp=React.useCallback(e=>{if(pendingRef.current){pendingRef.current=null;seekTo(getRatio(e.clientX));releaseCapture(e);onTapRef.current?.();onSeekEndRef.current?.();return;}if(seekingRef.current){seekingRef.current=false;seekTo(getRatio(e.clientX));releaseCapture(e);onSeekEndRef.current?.();}},[getRatio,releaseCapture]);const onPointerCancel=React.useCallback(e=>{if(pendingRef.current){pendingRef.current=null;releaseCapture(e);return;}if(seekingRef.current){seekingRef.current=false;releaseCapture(e);}},[releaseCapture]);const touchAction=threshold>0?\"pan-y\":\"none\";return{onPointerDown,onPointerMove,onPointerUp,onPointerCancel,touchAction};}\nexport const __FramerMetadata__ = {\"exports\":{\"useSeekGesture\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./useSeekGesture.map","// soundee-core rebuild r14 (2026-09-18) — cache bust, see docs/migration/framer-core/07-framer-sync-log.md\nimport{ControlType}from\"framer\";import{formatTime}from\"https://framerusercontent.com/modules/XqjS6RmB7bMfpSFcXWq7/Oim1PnSjexxaxkFS6DgJ/format.js\";export const DEFAULT_SEEK_TOOLTIP={mode:\"Intent Time\",placement:\"Above\",// Opaque. It sits directly over the waveform it reads from, and at 85%\n// the bars show through the digits — the one thing the tooltip exists to\n// make legible.\nbackground:\"#1c1c1c\",text:\"rgba(255,255,255,1)\",radius:6,padding:6,offset:8,fontSize:12};export function clampProgress(value){return Math.max(0,Math.min(1,value));}export function clampTooltipPercent(progress,containerWidth,tooltipWidth){if(containerWidth<=0||tooltipWidth<=0)return progress*100;const halfTooltipRatio=tooltipWidth/2/containerWidth;const clamped=Math.max(halfTooltipRatio,Math.min(1-halfTooltipRatio,progress));return clamped*100;}export function getTooltipProgress(mode,currentProgress,intentProgress){return mode===\"Current Time\"?currentProgress:intentProgress;}export function syncSeekTooltip({element,progress,duration,containerWidth}){if(!element)return;element.textContent=formatTime(progress*duration);element.style.left=`${clampTooltipPercent(progress,containerWidth,element.offsetWidth)}%`;}export const seekTooltipControls={type:ControlType.Object,title:\"Tooltip\",controls:{mode:{type:ControlType.Enum,title:\"Mode\",options:[\"Intent Time\",\"Current Time\"],optionTitles:[\"Intent Time\",\"Current Time\"],defaultValue:DEFAULT_SEEK_TOOLTIP.mode,description:\"Shows hovered seek time or current playback time.\"},placement:{type:ControlType.Enum,title:\"Placement\",options:[\"Above\",\"Below\"],optionTitles:[\"Above\",\"Below\"],defaultValue:DEFAULT_SEEK_TOOLTIP.placement,displaySegmentedControl:true,description:\"Which side of the waveform the tooltip sits on. Below suits a waveform at the top of its row, where above would collide with whatever is over it.\"},background:{type:ControlType.Color,title:\"Background\",defaultValue:DEFAULT_SEEK_TOOLTIP.background,description:\"Tooltip background. Keep it opaque — it sits over the waveform it is reading from.\"},text:{type:ControlType.Color,title:\"Text\",defaultValue:DEFAULT_SEEK_TOOLTIP.text,description:\"Tooltip text color.\"},radius:{type:ControlType.Number,title:\"Radius\",min:0,max:24,step:1,defaultValue:DEFAULT_SEEK_TOOLTIP.radius,displayStepper:true,description:\"Tooltip corner radius.\"},padding:{type:ControlType.Number,title:\"Padding\",min:0,max:32,step:1,defaultValue:DEFAULT_SEEK_TOOLTIP.padding,displayStepper:true,description:\"Tooltip padding.\"},offset:{type:ControlType.Number,title:\"Offset\",min:0,max:48,step:1,defaultValue:DEFAULT_SEEK_TOOLTIP.offset,displayStepper:true,description:\"Distance from the seek control.\"},fontSize:{type:ControlType.Number,title:\"Font Size\",min:8,max:32,step:1,defaultValue:DEFAULT_SEEK_TOOLTIP.fontSize,displayStepper:true,description:\"Tooltip text size.\"}},defaultValue:DEFAULT_SEEK_TOOLTIP};\nexport const __FramerMetadata__ = {\"exports\":{\"TooltipMode\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"DEFAULT_SEEK_TOOLTIP\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"clampTooltipPercent\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"TooltipVisibility\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"clampProgress\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"SeekTooltipOptions\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"TooltipPlacement\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"seekTooltipControls\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"syncSeekTooltip\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getTooltipProgress\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./useSeekUi.map","// soundee-core rebuild r14 (2026-09-18) — cache bust, see docs/migration/framer-core/07-framer-sync-log.md\nimport*as React from\"react\";// ─── Theme detection ──────────────────────────────────────────────────────────\n//\n// Framer exposes no direct theme API to code components, so we mirror the\n// signals Framer theme toggles use. This module is the single source of truth\n// for \"is the site currently in dark mode?\" and is shared by every component\n// that needs to react to theme changes (e.g. SoundeeThemeSlot, SoundeeWaveform).\n//\n// It intentionally reads the DOM/storage signals directly instead of the\n// Soundee theme store, so it also reacts to theme changes made by other\n// toggles (including the Soundee theme toggle, which writes the same signals).\nconst THEME_ATTR=\"toggle-theme\";// Soundee's single source of truth. Can be \"system\" | \"light\" | \"dark\".\nconst THEME_MODE_KEY=\"soundeeThemeMode\";// Read-only migration fallbacks from older/3rd-party toggles. Only consulted\n// when `soundeeThemeMode` is absent (i.e. a returning visitor who hasn't used\n// the Soundee toggle yet); these only ever hold \"light\" | \"dark\".\nconst LEGACY_STORAGE_KEYS=[\"theme\",\"currentToggleState\"];const THEME_CHANGE_EVENT=\"themeChange\";/**\n * Reads Soundee's persisted theme mode. This is the authoritative choice the\n * Soundee theme store writes. In `system` mode we deliberately do NOT pin a\n * resolved value here, so detection falls through to the OS media query.\n */function readSoundeeMode(){if(typeof window===\"undefined\")return null;try{const value=window.localStorage.getItem(THEME_MODE_KEY);if(value===\"system\"||value===\"dark\"||value===\"light\"){return value;}}catch{return null;}return null;}/**\n * Reads a resolved theme from legacy keys written by older Framer toggles.\n * Migration fallback only: used when no `soundeeThemeMode` exists yet, so a\n * returning visitor keeps their previous choice until the Soundee store writes.\n */function readLegacyStoredTheme(){if(typeof window===\"undefined\")return null;try{for(const key of LEGACY_STORAGE_KEYS){const value=window.localStorage.getItem(key);if(value===\"dark\"||value===\"light\")return value;}}catch{return null;}return null;}/**\n * Reads the explicit theme attribute some Framer toggles write\n * (`<body toggle-theme=\"dark|light\">`, also checked on `<html>`).\n */function readAttrTheme(){if(typeof document===\"undefined\")return null;const targets=[document.body,document.documentElement];for(const target of targets){const value=target?.getAttribute(THEME_ATTR);if(value===\"dark\"||value===\"light\")return value;}return null;}function systemPrefersDark(){return typeof window!==\"undefined\"&&window.matchMedia?window.matchMedia(\"(prefers-color-scheme: dark)\").matches:false;}// Framer statically pre-renders pages, so the first (hydration) render must\n// match the server HTML or React throws a hydration mismatch (#425) and the\n// content flickers / lands on the wrong theme. The server can't know the\n// visitor's theme, so `getServerSnapshot` is a fixed light value and we read\n// the real theme only after hydration via `useSyncExternalStore`.\nconst getServerSnapshot=()=>false;/**\n * Subscribes to every signal that can change the theme at runtime. The set is\n * gated by `useLiveSignals` (false on the canvas, where toggle state is stale).\n */function makeSubscribe(useLiveSignals){return onChange=>{const cleanups=[];if(typeof window!==\"undefined\"&&window.matchMedia){const mql=window.matchMedia(\"(prefers-color-scheme: dark)\");mql.addEventListener(\"change\",onChange);cleanups.push(()=>mql.removeEventListener(\"change\",onChange));}if(useLiveSignals&&typeof window!==\"undefined\"){// Same-tab toggle fires a custom `themeChange` event; other tabs\n// surface their localStorage write through the `storage` event.\nwindow.addEventListener(THEME_CHANGE_EVENT,onChange);window.addEventListener(\"storage\",onChange);cleanups.push(()=>{window.removeEventListener(THEME_CHANGE_EVENT,onChange);window.removeEventListener(\"storage\",onChange);});}if(useLiveSignals&&typeof MutationObserver!==\"undefined\"&&typeof document!==\"undefined\"){const observer=new MutationObserver(onChange);const options={attributes:true,attributeFilter:[THEME_ATTR]};if(document.body)observer.observe(document.body,options);if(document.documentElement)observer.observe(document.documentElement,options);cleanups.push(()=>observer.disconnect());}return()=>cleanups.forEach(fn=>fn());};}/**\n * Resolves the active dark/light theme. Framer exposes no direct theme API to\n * code components, so we mirror the signals Soundee's theme store writes,\n * prioritising the authoritative `soundeeThemeMode`:\n *   1. `soundeeThemeMode` mode semantics — `system` follows the OS media query;\n *      `light` / `dark` is the user's explicit choice. This wins over legacy\n *      signals so a stale `theme` / `currentToggleState` from an old toggle can\n *      never override `system` (which previously pinned the site to light).\n *   2. only when no `soundeeThemeMode` exists yet (returning visitor): legacy\n *      stored keys, then a `toggle-theme` attribute, for migration.\n *   3. the `prefers-color-scheme` media query as the final fallback.\n *\n * Read through `useSyncExternalStore` so the hydration render uses the stable\n * server snapshot (light) and the real theme is applied right after, avoiding\n * the server/client hydration mismatch (React #425) that caused flickering.\n *\n * On the canvas pass `useLiveSignals = false`: the editor keeps stale toggle\n * state, so we ignore it and let `prefers-color-scheme` drive the result.\n */export function useIsDarkTheme(useLiveSignals){const subscribe=React.useMemo(()=>makeSubscribe(useLiveSignals),[useLiveSignals]);const getSnapshot=React.useCallback(()=>{if(useLiveSignals){const mode=readSoundeeMode();if(mode===\"dark\")return true;if(mode===\"light\")return false;// mode === \"system\" -> fall through to the OS media query below,\n// ignoring legacy keys/attribute so they can't override the OS.\nif(mode===null){const legacy=readLegacyStoredTheme();if(legacy)return legacy===\"dark\";const attr=readAttrTheme();if(attr)return attr===\"dark\";}}return systemPrefersDark();},[useLiveSignals]);return React.useSyncExternalStore(subscribe,getSnapshot,getServerSnapshot);}\nexport const __FramerMetadata__ = {\"exports\":{\"useIsDarkTheme\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./use_theme.map","// soundee-core rebuild r14 (2026-09-18) — cache bust, see docs/migration/framer-core/07-framer-sync-log.md\n// ─── Types ───────────────────────────────────────────────────────────────────\nfunction _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}// ─── Constants ───────────────────────────────────────────────────────────────\nconst SLIDE_UP_MS=560;const SLIDE_DOWN_MS=300;const MORPH_MS=400;// ─── Easing ──────────────────────────────────────────────────────────────────\nfunction easeOutCubic(t){return 1-(1-t)**3;}function easeInCubic(t){return t**3;}function easeOutElastic(t){if(t===0||t===1)return t;const c4=2*Math.PI/3;return Math.pow(2,-10*t)*Math.sin((t*10-.75)*c4)+1;}const EASING_FN={cubic:easeOutCubic,bounce:easeOutElastic};// ─── CSS color resolver ──────────────────────────────────────────────────────\nlet colorProbe=null;// Resolves a CSS color (incl. Framer theme variables like `var(--token-…)`) to\n// a concrete value the canvas can paint.\n//\n// Framer theme tokens resolve relative to the DOM theme *scope*: light/dark is\n// applied to a specific element/subtree, not necessarily to `document.body`. So\n// a probe parked on `document.body` resolves tokens against the page default\n// (typically light), which made the waveform render light colors even when the\n// component itself sat inside a dark-themed subtree on the canvas.\n//\n// We therefore resolve inside `context` (the component's own container) so the\n// token is read in the exact same theme scope as the visible component, and\n// only fall back to `document.body` when no context is available.\nfunction resolveColor(color,context){if(typeof document===\"undefined\")return color;if(!color||!color.includes(\"var(\")&&!color.includes(\"token\"))return color;if(!colorProbe){colorProbe=document.createElement(\"div\");colorProbe.style.display=\"none\";}const host=context??document.body;if(host&&colorProbe.parentNode!==host){host.appendChild(colorProbe);}colorProbe.style.color=color;const resolved=getComputedStyle(colorProbe).color;return resolved||color;}// ─── Canvas drawing ──────────────────────────────────────────────────────────\nfunction interpolateData(data,targetLength){if(data.length===0||targetLength<=0)return Array(targetLength).fill(0);let max=1;for(let i=0;i<data.length;i++){if(data[i]>max)max=data[i];}if(data.length===targetLength){return data.map(v=>Math.max(0,v)/max);}const result=new Array(targetLength);const factor=(data.length-1)/(targetLength-1||1);for(let i=0;i<targetLength;i++){const idx=i*factor;const lo=idx|0;const hi=Math.min(lo+1,data.length-1);const weight=idx-lo;result[i]=Math.max(0,data[lo]*(1-weight)+data[hi]*weight)/max;}return result;}function drawRoundedRect(ctx,x,y,w,h,r,roundTop=true,roundBottom=true){if(r<=0||!roundTop&&!roundBottom){ctx.fillRect(x,y,w,h);return;}const rt=roundTop?r:0;const rb=roundBottom?r:0;ctx.beginPath();ctx.moveTo(x+rt,y);ctx.lineTo(x+w-rt,y);if(rt){ctx.quadraticCurveTo(x+w,y,x+w,y+rt);}ctx.lineTo(x+w,y+h-rb);if(rb){ctx.quadraticCurveTo(x+w,y+h,x+w-rb,y+h);}ctx.lineTo(x+rb,y+h);if(rb){ctx.quadraticCurveTo(x,y+h,x,y+h-rb);}ctx.lineTo(x,y+rt);if(rt){ctx.quadraticCurveTo(x,y,x+rt,y);}ctx.closePath();ctx.fill();}function drawBars(ctx,data,width,height,barWidth,barGap,barRadius,fillStyle,dpr,mirror,introScale,minBarHeightPx){const numBars=Math.max(1,Math.floor(width/(barWidth+barGap)));const interpolated=interpolateData(data,numBars);const minBarH=mirror?dpr:Math.max(1,minBarHeightPx*dpr);const MIRROR_SCALE=.95;const centerY=height/2;ctx.fillStyle=fillStyle;for(let i=0;i<interpolated.length;i++){const amp=interpolated[i]*introScale;const x=i*(barWidth+barGap)*dpr;const w=barWidth*dpr;if(mirror){const topH=Math.max(amp*centerY*MIRROR_SCALE,minBarH);const botH=Math.max(amp*centerY*MIRROR_SCALE,minBarH);const r=Math.min(barRadius*dpr,w/2);drawRoundedRect(ctx,x,centerY-topH,w,topH,Math.min(r,topH/2),true,false);drawRoundedRect(ctx,x,centerY,w,botH,Math.min(r,botH/2),false,true);}else{const bh=Math.max(amp*height,minBarH);const y=height-bh;const r=Math.min(barRadius*dpr,w/2,bh/2);drawRoundedRect(ctx,x,y,w,bh,r);}}}function drawClassic(ctx,data,width,height,fillStyle,dpr,mirror,introScale,minBarHeightPx){const numPoints=Math.max(2,Math.floor(width*dpr));const interpolated=interpolateData(data,numPoints);const minH=dpr;ctx.fillStyle=fillStyle;ctx.beginPath();if(mirror){const MIRROR_SCALE=.95;const centerY=height/2;ctx.moveTo(0,centerY);for(let i=0;i<numPoints;i++){const x=i/(numPoints-1)*width*dpr;const topH=Math.max(interpolated[i]*introScale*centerY*MIRROR_SCALE,minH);ctx.lineTo(x,centerY-topH);}for(let i=numPoints-1;i>=0;i--){const x=i/(numPoints-1)*width*dpr;const botH=Math.max(interpolated[i]*introScale*centerY*MIRROR_SCALE,minH);ctx.lineTo(x,centerY+botH);}}else{ctx.moveTo(0,height);for(let i=0;i<numPoints;i++){const x=i/(numPoints-1)*width*dpr;const bh=Math.max(interpolated[i]*introScale*height*.95,minH);ctx.lineTo(x,height-bh);}ctx.lineTo(width*dpr,height);}ctx.closePath();ctx.fill();}function renderCanvas(canvas,data,containerWidth,containerHeight,mode,mirror,barWidth,barGap,barRadius,fillStyle,introScale,minBarHeightPx){const dpr=typeof window!==\"undefined\"?window.devicePixelRatio||1:1;canvas.width=containerWidth*dpr;canvas.height=containerHeight*dpr;canvas.style.width=`${containerWidth}px`;canvas.style.height=`${containerHeight}px`;const ctx=canvas.getContext(\"2d\");if(!ctx)return;ctx.clearRect(0,0,canvas.width,canvas.height);if(mode===\"bars\"){drawBars(ctx,data,containerWidth,canvas.height,barWidth,barGap,barRadius,fillStyle,dpr,mirror,introScale,minBarHeightPx);}else{drawClassic(ctx,data,containerWidth,canvas.height,fillStyle,dpr,mirror,introScale,minBarHeightPx);}}// ─── WaveformRenderer ────────────────────────────────────────────────────────\nexport class WaveformRenderer{// ─── Public API ──────────────────────────────────────────────────────\nsetOptions(opts){if(opts.mode!==undefined)this.mode=opts.mode;if(opts.mirror!==undefined)this.mirror=opts.mirror;if(opts.barWidth!==undefined)this.barWidth=opts.barWidth;if(opts.barGap!==undefined)this.barGap=opts.barGap;if(opts.barRadius!==undefined)this.barRadius=opts.barRadius;if(opts.minBarHeight!==undefined)this.minBarHeight=opts.minBarHeight;if(opts.gutterColor!==undefined)this.gutterColor=opts.gutterColor;if(opts.progressColor!==undefined)this.progressColor=opts.progressColor;if(opts.intentColor!==undefined)this.intentColor=opts.intentColor;if(opts.easing!==undefined)this.easeFn=EASING_FN[opts.easing];this.draw();}setData(data,showImmediately=false){this.data=data;if(showImmediately){this.amplitude=1;this.state=\"idle\";}this.draw();}slideDown(){// Already flat\nif(this.state===\"flat\"&&this.amplitude<=0){return Promise.resolve();}// Already sliding down — return existing promise\nif(this.state===\"slidingDown\"&&this.slideDownPromise){return this.slideDownPromise;}// Interrupt slideUp or morph if active\nif(this.state===\"slidingUp\")this.finishSlideUp(false);if(this.state===\"morphing\"){this.data=this.getDrawData();this.finishMorph(false);}cancelAnimationFrame(this.rafId);this.slideDownPromise=new Promise(resolve=>{this.slideDownResolve=resolve;});this.state=\"slidingDown\";const startVal=this.amplitude;const duration=SLIDE_DOWN_MS*startVal;if(startVal<=.01){this.amplitude=0;this.state=\"flat\";this.draw();this.resolveSlideDown();return this.slideDownPromise;}const startTime=performance.now();const tick=now=>{const t=Math.min(1,(now-startTime)/Math.max(1,duration));this.amplitude=startVal*(1-easeInCubic(t));this.draw();if(t<1){this.rafId=requestAnimationFrame(tick);}else{this.amplitude=0;this.state=\"flat\";this.draw();this.resolveSlideDown();}};this.rafId=requestAnimationFrame(tick);return this.slideDownPromise;}slideUp(){// Already at full amplitude\nif(this.state===\"idle\"&&this.amplitude>=1){return Promise.resolve();}// Already sliding up — return existing promise\nif(this.state===\"slidingUp\"){return new Promise(resolve=>{const prev=this.slideUpResolve;this.slideUpResolve=()=>{prev?.();resolve();};});}// Don't interrupt slideDown — shouldn't happen with proper orchestration\nif(this.state===\"slidingDown\"){return Promise.resolve();}cancelAnimationFrame(this.rafId);return new Promise(resolve=>{this.slideUpResolve=resolve;this.state=\"slidingUp\";const startTime=performance.now();const tick=now=>{const t=Math.min(1,(now-startTime)/SLIDE_UP_MS);this.amplitude=this.easeFn(t);this.draw();if(t<1){this.rafId=requestAnimationFrame(tick);}else{this.amplitude=1;this.state=\"idle\";this.draw();this.finishSlideUp(true);}};this.rafId=requestAnimationFrame(tick);});}morphTo(data){// Snapshot current visual state before interrupting so there's no jump\nconst currentData=this.state===\"morphing\"?this.getDrawData():this.data;if(this.state===\"slidingUp\")this.finishSlideUp(false);if(this.state===\"morphing\")this.finishMorph(false);cancelAnimationFrame(this.rafId);// Pre-interpolate both to the same bar count so the blend is\n// consistent with the final draw — avoids jump at completion.\nconst numBars=this.getDrawTargetLength();this.morphFromData=interpolateData(currentData,numBars);this.morphToData=interpolateData(data,numBars);this.morphProgress=0;this.amplitude=1;this.state=\"morphing\";return new Promise(resolve=>{this.morphResolve=resolve;const startTime=performance.now();const tick=now=>{const t=Math.min(1,(now-startTime)/MORPH_MS);this.morphProgress=this.easeFn(t);this.draw();if(t<1){this.rafId=requestAnimationFrame(tick);}else{this.data=data;this.morphProgress=0;this.state=\"idle\";this.draw();this.finishMorph(true);}};this.rafId=requestAnimationFrame(tick);});}redraw(){this.draw();}destroy(){cancelAnimationFrame(this.rafId);cancelAnimationFrame(this.resizeRafId);this.resizeObserver?.disconnect();this.resizeObserver=null;}// ─── Internal ────────────────────────────────────────────────────────\ngetDrawTargetLength(){const w=this.container.offsetWidth;if(this.mode===\"bars\"){return Math.max(1,Math.floor(w/(this.barWidth+this.barGap)));}const dpr=typeof window!==\"undefined\"?window.devicePixelRatio||1:1;return Math.max(2,Math.floor(w*dpr));}getDrawData(){if(this.state!==\"morphing\"||this.morphProgress<=0){return this.data;}const from=this.morphFromData;const to=this.morphToData;const len=Math.max(from.length,to.length);const p=this.morphProgress;const blended=new Array(len);for(let i=0;i<len;i++){const a=i<from.length?from[i]:0;const b=i<to.length?to[i]:0;const raw=a*(1-p)+b*p;// Growing bars may overshoot (bounce); shrinking bars clamp at target\nblended[i]=b>=a?Math.max(raw,0):Math.max(raw,b);}return blended;}draw(){const w=this.container.offsetWidth;const h=this.container.offsetHeight;if(w===0||h===0)return;const data=this.getDrawData();const gColor=resolveColor(this.gutterColor,this.container);const pColor=resolveColor(this.progressColor,this.container);const iColor=resolveColor(this.intentColor,this.container);renderCanvas(this.gutterCanvas,data,w,h,this.mode,this.mirror,this.barWidth,this.barGap,this.barRadius,gColor,this.amplitude,this.minBarHeight);renderCanvas(this.progressCanvas,data,w,h,this.mode,this.mirror,this.barWidth,this.barGap,this.barRadius,pColor,this.amplitude,this.minBarHeight);if(this.intentCanvas){renderCanvas(this.intentCanvas,data,w,h,this.mode,this.mirror,this.barWidth,this.barGap,this.barRadius,iColor,this.amplitude,this.minBarHeight);}}resolveSlideDown(){this.slideDownResolve?.();this.slideDownResolve=null;this.slideDownPromise=null;}finishSlideUp(completed){if(completed){this.slideUpResolve?.();}this.slideUpResolve=null;}finishMorph(completed){if(completed){this.morphResolve?.();}this.morphResolve=null;this.morphFromData=[];this.morphToData=[];this.morphProgress=0;}constructor(options){_define_property(this,\"gutterCanvas\",void 0);_define_property(this,\"progressCanvas\",void 0);_define_property(this,\"intentCanvas\",void 0);_define_property(this,\"container\",void 0);_define_property(this,\"mode\",void 0);_define_property(this,\"mirror\",void 0);_define_property(this,\"barWidth\",void 0);_define_property(this,\"barGap\",void 0);_define_property(this,\"barRadius\",void 0);_define_property(this,\"minBarHeight\",void 0);_define_property(this,\"gutterColor\",void 0);_define_property(this,\"progressColor\",void 0);_define_property(this,\"intentColor\",void 0);_define_property(this,\"easeFn\",void 0);_define_property(this,\"data\",[]);_define_property(this,\"amplitude\",0);_define_property(this,\"state\",\"flat\");_define_property(this,\"rafId\",0);_define_property(this,\"resizeObserver\",null);_define_property(this,\"resizeRafId\",0);_define_property(this,\"slideDownResolve\",null);_define_property(this,\"slideDownPromise\",null);_define_property(this,\"slideUpResolve\",null);_define_property(this,\"morphResolve\",null);_define_property(this,\"morphFromData\",[]);_define_property(this,\"morphToData\",[]);_define_property(this,\"morphProgress\",0);this.gutterCanvas=options.gutterCanvas;this.progressCanvas=options.progressCanvas;this.intentCanvas=options.intentCanvas??null;this.container=options.container;this.mode=options.mode;this.mirror=options.mirror;this.barWidth=options.barWidth;this.barGap=options.barGap;this.barRadius=options.barRadius;this.minBarHeight=options.minBarHeight;this.gutterColor=options.gutterColor;this.progressColor=options.progressColor;this.intentColor=options.intentColor??options.progressColor;this.easeFn=EASING_FN[options.easing??\"cubic\"];this.resizeObserver=new ResizeObserver(()=>{cancelAnimationFrame(this.resizeRafId);this.resizeRafId=requestAnimationFrame(()=>this.draw());});this.resizeObserver.observe(this.container);this.draw();}}\nexport const __FramerMetadata__ = {\"exports\":{\"EasingType\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"DisplayMode\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"WaveformRendererOptions\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"WaveformRenderer\":{\"type\":\"class\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./WaveformRenderer.map","// soundee-core rebuild r14 (2026-09-18) — cache bust, see docs/migration/framer-core/07-framer-sync-log.md\nconst waveformCache=new Map;const inflight=new Map;export function fetchWaveform(baseUrl,trackId){const cached=waveformCache.get(trackId);if(cached)return Promise.resolve(cached);const existing=inflight.get(trackId);if(existing)return existing;const promise=fetch(`${baseUrl}/tracks/${trackId}/waveform.json?v=100`).then(res=>{if(!res.ok)throw new Error(`Waveform fetch failed: ${res.status}`);return res.json();}).then(json=>{const data=json.wavdata??[];waveformCache.set(trackId,data);inflight.delete(trackId);return data;}).catch(err=>{inflight.delete(trackId);throw err;});inflight.set(trackId,promise);return promise;}export const MOCK_WAVEFORM=Array.from({length:200},(_,i)=>{const t=i/199;const pseudo=(i*1327+7919)%100/100;return Math.abs(Math.sin(t*Math.PI*6))*80+pseudo*20;});\nexport const __FramerMetadata__ = {\"exports\":{\"MOCK_WAVEFORM\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"fetchWaveform\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./api.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 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 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 r2 (2026-08-07 12:25) — 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{addPropertyControls,ControlType,RenderTarget}from\"framer\";import{resumeTrack,usePlayerSelector}from\"https://framerusercontent.com/modules/hbBOc6MLN4T1PPsVYazn/WeepVp6C1ldGcXBvdxj6/engine.js\";import{playEntity,usePlaylistContext}from\"https://framerusercontent.com/modules/xHhQmu9KUyaDJlvQ1REJ/bWd9qzndMaNhQDLTwfIv/playlist.js\";import{useEntitySelector}from\"https://framerusercontent.com/modules/Fa9rFJN2rq85gl2rXBgV/AVjJVDZFaBnNLsPAn8ph/entities.js\";import{useSoundeeConfig}from\"https://framerusercontent.com/modules/MnaOjDKPmXIgElrPjVea/j93inx32wsgSBRR1iqSG/config.js\";import{useSeekGesture}from\"https://framerusercontent.com/modules/qPgD7bnZ8wqAonggSMlQ/qn9zmWDQhqCdxyz6v0cX/useSeekGesture.js\";import{useIsDarkTheme}from\"https://framerusercontent.com/modules/HVrMNWKoZuYC0usz10zo/HtTQ18YxOR0S2FsWahL4/use_theme.js\";import{DEFAULT_SEEK_TOOLTIP,clampProgress,getTooltipProgress,seekTooltipControls,syncSeekTooltip}from\"https://framerusercontent.com/modules/xCcUCztOE3T5z5I5xW15/OmwvQ1Xzh1uxHOSoRb1U/useSeekUi.js\";import{WaveformRenderer}from\"https://framerusercontent.com/modules/1u8PIfOqQL2tiomtmdkF/NkQIOVtn5C4IjKg3ZtgN/WaveformRenderer.js\";import{fetchWaveform,MOCK_WAVEFORM}from\"https://framerusercontent.com/modules/iWOo1RzPdyc5HALCc7pK/1QBEHQwiXykScjduBgEf/api.js\";import{resolveFramerEntityID}from\"https://framerusercontent.com/modules/KBFG7rL6zUCLBgAUcXJM/dMW3anX1IrVEjpQUC5bZ/entity_id.js\";import{useCmsEntity}from\"https://framerusercontent.com/modules/bSwuSZWKZxxYjhiJtHdN/x5HoXgvpLj1GbRR9S1NU/cms_entity.js\";const SLIDE_SETTLE_FAST_MS=500;const SLIDE_SETTLE_NORMAL_MS=50;const MORPH_SETTLE_FAST_MS=200;const MORPH_SETTLE_NORMAL_MS=30;const FAST_SKIP_THRESHOLD_MS=600;// ─── Component ───────────────────────────────────────────────────────────────\n/**\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n * @framerDisableUnlink\n */export default function SoundeeWaveform({entityID,entityId,rawJson,waveform={mode:\"bars\",mirror:false,minBarHeight:2},bars={width:3,gap:1,radius:1},transition=\"slide\",colors={gutter:\"rgba(255,255,255,0.2)\",progress:\"rgba(255,255,255,1)\"},hoverEnabled=true,hover={progress:\"#e0bd8c\",intent:\"rgba(200,160,106,0.35)\",showIntent:true},tooltipVisible=\"Hover\",tooltip=DEFAULT_SEEK_TOOLTIP,playhead={show:false,width:2,color:\"rgba(255,255,255,0.9)\",overshoot:0},style}){const[isHovered,setIsHovered]=React.useState(false);const[isDragging,setIsDragging]=React.useState(false);const draggingRef=React.useRef(false);const intentProgressRef=React.useRef(null);const mode=waveform.mode;const mirror=waveform.mirror;const minBarHeight=waveform.minBarHeight;const barWidth=bars.width;const barGap=bars.gap;const barRadius=bars.radius;const transitionMode=transition;const easing=\"cubic\";const isCanvas=RenderTarget.current()===RenderTarget.canvas;// Colors bound to Framer theme variables resolve to a concrete value only\n// when the canvas is (re)painted. A theme toggle changes no React state, so\n// we track the active theme and use it to force a repaint below.\nconst isDark=useIsDarkTheme(!isCanvas);const cfg=useSoundeeConfig();const playerEntityId=usePlayerSelector(s=>s.entityId);const playerProgress=usePlayerSelector(s=>s.progress);const playerDuration=usePlayerSelector(s=>s.duration);const playerIsPlaying=usePlayerSelector(s=>s.isPlaying);const playlistId=usePlaylistContext();const containerRef=React.useRef(null);const gutterRef=React.useRef(null);const intentCanvasRef=React.useRef(null);const progressRef=React.useRef(null);const tooltipRef=React.useRef(null);const playheadRef=React.useRef(null);const rendererRef=React.useRef(null);const opRef=React.useRef(0);const prevTrackRef=React.useRef(null);const lastChangeRef=React.useRef(0);// A CMS detail page has the whole row, so it can say which track this is\n// without an id to bind — and seeding happens during render, so the lookup\n// below already finds it on the first pass.\nconst cms=useCmsEntity(rawJson);const boundEntityID=cms?.entity.entityId??resolveFramerEntityID(entityID,entityId);const isIndividual=boundEntityID!=null&&boundEntityID>0;const activeEntityId=boundEntityID&&boundEntityID>0?boundEntityID:playerEntityId;const trackEntity=useEntitySelector(s=>activeEntityId?s.tracks[activeEntityId]:undefined);// The waveform is fetched by trackId, not entity id. The store answers for\n// anything already loaded; the CMS row covers a page that opens cold.\nconst cmsTrackId=cms?.kind===\"track\"&&cms.entity.trackId>0?cms.entity.trackId:null;const activeTrackId=trackEntity?.trackId&&trackEntity.trackId>0?trackEntity.trackId:cmsTrackId;const isActiveTrack=activeEntityId!=null&&activeEntityId===playerEntityId;const duration=isActiveTrack?playerDuration||0:0;const displayProgress=isActiveTrack?playerProgress??0:0;const previewProgress=isDragging&&intentProgressRef.current!==null?intentProgressRef.current:displayProgress;const progressColor=hoverEnabled&&isHovered?hover.progress:colors.progress;const showIntent=duration>0&&hoverEnabled&&hover.showIntent&&isHovered&&!isDragging;// The line marks where a click would land, so it belongs to the pointer and\n// not to the track: it appears with the cursor and leaves with it. A\n// permanent line at the play position would be a second progress indicator\n// next to the played bars, which already say the same thing.\nconst showSeekLine=playhead.show&&duration>0&&(isHovered||isDragging);const showTooltip=duration>0&&tooltipVisible!==\"Off\"&&(tooltipVisible===\"Hover\"?isHovered||isDragging:isDragging);// ─── Create / destroy renderer ──────────────────────────────────────\nReact.useEffect(()=>{const container=containerRef.current;const gutter=gutterRef.current;const intent=intentCanvasRef.current;const progress=progressRef.current;if(!container||!gutter||!intent||!progress)return;const renderer=new WaveformRenderer({gutterCanvas:gutter,progressCanvas:progress,intentCanvas:intent,container,mode,mirror,barWidth,barGap,barRadius,minBarHeight,gutterColor:colors.gutter,progressColor,intentColor:hover.intent,easing});if(isCanvas){renderer.setData(MOCK_WAVEFORM,true);}rendererRef.current=renderer;return()=>{renderer.destroy();rendererRef.current=null;};// Only on mount/unmount — options are synced separately\n// eslint-disable-next-line react-hooks/exhaustive-deps\n},[]);// ─── Sync visual options ────────────────────────────────────────────\nReact.useEffect(()=>{rendererRef.current?.setOptions({mode,mirror,barWidth,barGap,barRadius,minBarHeight,gutterColor:colors.gutter,progressColor,intentColor:hover.intent,easing});// `isDark` is included so a theme toggle re-runs setOptions → draw(), which\n// re-resolves any theme-variable colors to the new theme's value.\n},[mode,mirror,barWidth,barGap,barRadius,minBarHeight,colors.gutter,progressColor,hover.intent,easing,isDark]);// ─── Track change orchestrator ──────────────────────────────────────\nReact.useEffect(()=>{if(isCanvas||!activeTrackId)return;const renderer=rendererRef.current;if(!renderer)return;const isFirst=prevTrackRef.current===null;prevTrackRef.current=activeTrackId;const now=Date.now();const isFastSkip=!isFirst&&now-lastChangeRef.current<FAST_SKIP_THRESHOLD_MS;lastChangeRef.current=now;const op=++opRef.current;(async()=>{const dataPromise=fetchWaveform(cfg.baseUrl,activeTrackId);if(!isFirst&&transitionMode===\"slide\"){await renderer.slideDown();}const data=await dataPromise;if(op!==opRef.current)return;if(data.length===0){renderer.setData([]);return;}if(!isFirst){const fast=transitionMode===\"morph\"?MORPH_SETTLE_FAST_MS:SLIDE_SETTLE_FAST_MS;const normal=transitionMode===\"morph\"?MORPH_SETTLE_NORMAL_MS:SLIDE_SETTLE_NORMAL_MS;await new Promise(r=>setTimeout(r,isFastSkip?fast:normal));if(op!==opRef.current)return;}if(transitionMode===\"morph\"&&!isFirst){renderer.morphTo(data);}else{renderer.setData(data);renderer.slideUp();}})();},[activeTrackId,isCanvas,cfg.baseUrl,transitionMode]);// ─── Animate progress snap-to-zero ──────────────────────────────────\nconst prevProgressRef=React.useRef(displayProgress);React.useLayoutEffect(()=>{const el=progressRef.current;const prev=prevProgressRef.current;prevProgressRef.current=displayProgress;if(!el||prev<=.05||displayProgress>.01)return;el.style.transition=\"clip-path 300ms ease-out\";const remove=()=>{el.style.transition=\"\";};el.addEventListener(\"transitionend\",remove,{once:true});setTimeout(remove,450);});// ─── Seek gesture ───────────────────────────────────────────────────\nconst seekGesture=useSeekGesture({elementRef:containerRef,enabled:isActiveTrack&&duration>0,threshold:8,onSeekEnd:()=>{// Only individual waveforms (explicit entityID) may resume on seek.\n// The main player-bar waveform is a pure scrubber: seeking while\n// paused moves the position but never starts playback.\nif(isIndividual&&!playerIsPlaying)resumeTrack();}});const syncProgressPreview=React.useCallback(progress=>{const clamped=clampProgress(progress);if(progressRef.current){progressRef.current.style.clipPath=`inset(0 ${(1-clamped)*100}% 0 0)`;}},[]);const syncIntentOverlay=React.useCallback(()=>{const intentProgress=intentProgressRef.current;if(intentProgress===null||!intentCanvasRef.current)return;const intentStart=Math.min(displayProgress,intentProgress);const intentWidth=Math.abs(intentProgress-displayProgress);intentCanvasRef.current.style.clipPath=`inset(0 ${(1-intentStart-intentWidth)*100}% 0 ${intentStart*100}%)`;},[displayProgress]);const syncPointerUi=React.useCallback(event=>{if(duration<=0)return;const rect=event.currentTarget.getBoundingClientRect();if(rect.width<=0)return;const intentProgress=clampProgress((event.clientX-rect.left)/rect.width);intentProgressRef.current=intentProgress;// Set imperatively, like the clip paths around it: this runs on\n// every pointer move, and going through React state would put the\n// line a frame behind the cursor it is supposed to be under.\nif(playheadRef.current){playheadRef.current.style.left=`${intentProgress*100}%`;}if(draggingRef.current){syncProgressPreview(intentProgress);}syncIntentOverlay();if(tooltipRef.current){syncSeekTooltip({element:tooltipRef.current,progress:getTooltipProgress(tooltip.mode,displayProgress,intentProgress),duration,containerWidth:rect.width});}},[displayProgress,duration,syncIntentOverlay,syncProgressPreview,tooltip.mode]);React.useLayoutEffect(()=>{if(draggingRef.current)return;syncProgressPreview(displayProgress);},[displayProgress,syncProgressPreview]);React.useLayoutEffect(()=>{if(!showIntent)return;syncIntentOverlay();},[showIntent,syncIntentOverlay]);React.useLayoutEffect(()=>{if(!showTooltip||!tooltipRef.current||duration<=0)return;syncSeekTooltip({element:tooltipRef.current,progress:tooltip.mode===\"Current Time\"?displayProgress:intentProgressRef.current??displayProgress,duration,containerWidth:containerRef.current?.offsetWidth??0});},[displayProgress,duration,showTooltip,tooltip.mode]);React.useLayoutEffect(()=>{if(showIntent||!intentCanvasRef.current)return;intentCanvasRef.current.style.clipPath=\"inset(0 100% 0 0)\";},[showIntent]);const clearPointerUi=React.useCallback(()=>{intentProgressRef.current=null;if(intentCanvasRef.current){intentCanvasRef.current.style.clipPath=\"inset(0 100% 0 0)\";}},[]);// ─── Render ─────────────────────────────────────────────────────────\nconst clipRight=`${(1-previewProgress)*100}%`;return /*#__PURE__*/_jsxs(\"div\",{ref:containerRef,onClick:e=>{e.stopPropagation();// The seek gesture is disabled when the track is not the\n// active one, so the only thing a click can do is start\n// playback. When the track is active, the seek gesture\n// already handled the interaction on pointer up.\nif(!isActiveTrack&&activeEntityId){playEntity(activeEntityId,playlistId);}},onPointerDown:event=>{draggingRef.current=true;setIsDragging(true);setIsHovered(true);syncPointerUi(event);seekGesture.onPointerDown(event);},onPointerMove:event=>{syncPointerUi(event);seekGesture.onPointerMove(event);},onPointerUp:event=>{draggingRef.current=false;setIsDragging(false);if(event.pointerType!==\"mouse\"){setIsHovered(false);clearPointerUi();}seekGesture.onPointerUp(event);},onPointerCancel:event=>{draggingRef.current=false;setIsDragging(false);setIsHovered(false);syncProgressPreview(displayProgress);clearPointerUi();seekGesture.onPointerCancel(event);},onPointerEnter:event=>{setIsHovered(true);syncPointerUi(event);},onPointerLeave:()=>{setIsHovered(false);clearPointerUi();},style:{position:\"relative\",width:\"100%\",height:\"100%\",touchAction:seekGesture.touchAction,cursor:activeEntityId?\"pointer\":\"default\",userSelect:\"none\",WebkitTapHighlightColor:\"transparent\",...style},children:[/*#__PURE__*/_jsx(\"canvas\",{ref:gutterRef,style:{position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",overflow:\"hidden\",pointerEvents:\"none\"}}),/*#__PURE__*/_jsx(\"canvas\",{ref:intentCanvasRef,style:{position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",overflow:\"hidden\",pointerEvents:\"none\",clipPath:\"inset(0 100% 0 0)\"}}),/*#__PURE__*/_jsx(\"canvas\",{ref:progressRef,style:{position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",overflow:\"hidden\",pointerEvents:\"none\",clipPath:`inset(0 ${clipRight} 0 0)`}}),showSeekLine&&// A line, no handle. The dot on top is a grab affordance, and\n// this is not something you grab — the whole waveform is the\n// seek target, so a handle would suggest a smaller one.\n/*#__PURE__*/_jsx(\"div\",{ref:playheadRef,\"aria-hidden\":true,style:{position:\"absolute\",// Over the bars, under the readout.\nzIndex:2,top:-playhead.overshoot,bottom:-playhead.overshoot,left:`${(intentProgressRef.current??previewProgress)*100}%`,width:playhead.width,marginLeft:-playhead.width/2,borderRadius:playhead.width,background:playhead.color,pointerEvents:\"none\"}}),showTooltip&&/*#__PURE__*/_jsx(\"div\",{ref:tooltipRef,style:{position:\"absolute\",// Above whatever shares the row with it. Two positioned\n// elements at `auto` are ordered by their place in the\n// DOM, and anything under the waveform — a tag list, a\n// length — comes after it, so a readout placed Below\n// ended up behind the very text it overlaps.\nzIndex:3,left:0,...tooltip.placement===\"Below\"?{top:`calc(100% + ${tooltip.offset}px)`}:{bottom:`calc(100% + ${tooltip.offset}px)`},transform:\"translateX(-50%)\",padding:tooltip.padding,borderRadius:tooltip.radius,background:tooltip.background,color:tooltip.text,fontSize:tooltip.fontSize,lineHeight:1,whiteSpace:\"nowrap\",pointerEvents:\"none\",userSelect:\"none\"}})]});}SoundeeWaveform.displayName=\"Soundee Waveform\";addPropertyControls(SoundeeWaveform,{rawJson:{type:ControlType.String,title:\"CMS JSON\",displayTextArea:true,description:\"Bind the Raw JSON field on a CMS detail page. It seeds the entity itself, so the waveform draws on a page that opens cold.\"},entityID:{type:ControlType.Number,title:\"Entity ID\",defaultValue:0,step:1,displayStepper:true,// Not exposed. A detail page binds CMS JSON; rows, cards and\n// overlays pass the id in code. The key and type stay, so an\n// instance that still holds a value keeps it.\nhidden:()=>true},entityId:{type:ControlType.Number,title:\"Entity ID\",defaultValue:0,hidden:()=>true},transition:{type:ControlType.Enum,title:\"Transition\",options:[\"slide\",\"morph\"],optionTitles:[\"Slide\",\"Morph\"],defaultValue:\"slide\",description:\"How the waveform changes when a new track loads.\"},waveform:{type:ControlType.Object,title:\"Waveform\",controls:{mode:{type:ControlType.Enum,title:\"Mode\",options:[\"bars\",\"classic\"],optionTitles:[\"Bars\",\"Classic\"],defaultValue:\"bars\",description:\"Visual waveform style.\"},mirror:{type:ControlType.Boolean,title:\"Mirror\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\",description:\"Mirrors the waveform vertically around the center.\"},minBarHeight:{type:ControlType.Number,title:\"Min Height\",min:1,max:12,step:.5,defaultValue:2,displayStepper:true,description:\"Thickness of the flat placeholder before waveform data loads.\"}},defaultValue:{mode:\"bars\",mirror:false,minBarHeight:2}},bars:{type:ControlType.Object,title:\"Bars\",hidden:props=>props.waveform?.mode!==\"bars\",description:\"Bar style settings for Bars mode.\",controls:{width:{type:ControlType.Number,title:\"Width\",min:1,max:12,step:1,defaultValue:3,displayStepper:true,description:\"Width of each waveform bar.\"},gap:{type:ControlType.Number,title:\"Gap\",min:0,max:8,step:1,defaultValue:1,displayStepper:true,description:\"Space between waveform bars.\"},radius:{type:ControlType.Number,title:\"Radius\",min:0,max:8,step:.5,defaultValue:1,displayStepper:true,description:\"Corner radius of waveform bars.\"}},defaultValue:{width:3,gap:1,radius:1}},colors:{type:ControlType.Object,title:\"Colors\",controls:{gutter:{type:ControlType.Color,title:\"Gutter\",defaultValue:\"rgba(255,255,255,0.2)\",description:\"Unplayed waveform color.\"},progress:{type:ControlType.Color,title:\"Progress\",defaultValue:\"rgba(255,255,255,1)\",description:\"Played waveform color when not hovering.\"}},defaultValue:{gutter:\"rgba(255,255,255,0.2)\",progress:\"rgba(255,255,255,1)\"}},hoverEnabled:{type:ControlType.Boolean,title:\"Hover\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\",description:\"Enables hover highlight and pointer intent UI.\"},hover:{type:ControlType.Object,title:\"Hover\",hidden:props=>props.hoverEnabled===false,controls:{progress:{type:ControlType.Color,title:\"Progress\",defaultValue:\"#e0bd8c\",description:\"Played waveform color while hovering.\"},showIntent:{type:ControlType.Boolean,title:\"Intent\",defaultValue:true,enabledTitle:\"Show\",disabledTitle:\"Hide\",description:\"Shows a ghost waveform at the hovered seek position.\"},intent:{type:ControlType.Color,title:\"Intent Color\",defaultValue:\"rgba(200,160,106,0.35)\",description:\"Ghost waveform color between current and hovered position.\"}},defaultValue:{progress:\"#e0bd8c\",intent:\"rgba(200,160,106,0.35)\",showIntent:true}},tooltipVisible:{type:ControlType.Enum,title:\"Tooltip\",options:[\"Off\",\"Hover\",\"Drag\"],optionTitles:[\"Off\",\"Hover\",\"Drag\"],defaultValue:\"Hover\",description:\"Controls when the time tooltip is visible.\"},tooltip:{...seekTooltipControls,hidden:props=>props.tooltipVisible===\"Off\"},playhead:{type:ControlType.Object,title:\"Seek Line\",controls:{show:{type:ControlType.Boolean,title:\"Line\",defaultValue:false,enabledTitle:\"Show\",disabledTitle:\"Hide\",description:\"A vertical line under the pointer, marking where a click would seek to. Appears with the cursor and leaves with it.\"},width:{type:ControlType.Number,title:\"Width\",min:1,max:8,step:1,defaultValue:2,displayStepper:true,hidden:props=>!props.show},color:{type:ControlType.Color,title:\"Color\",defaultValue:\"rgba(255,255,255,0.9)\",hidden:props=>!props.show},overshoot:{type:ControlType.Number,title:\"Overshoot\",min:0,max:24,step:1,defaultValue:0,displayStepper:true,description:\"How far the line reaches past the waveform.\",hidden:props=>!props.show}},defaultValue:{show:false,width:2,color:\"rgba(255,255,255,0.9)\",overshoot:0}}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"SoundeeWaveform\",\"slots\":[],\"annotations\":{\"framerDisableUnlink\":\"\",\"framerSupportedLayoutWidth\":\"any\",\"framerSupportedLayoutHeight\":\"any\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],"mappings":"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"}