{"version":3,"file":"CustomEventTracker.CWJrZi6p.mjs","names":["useRef"],"sources":["https:/framerusercontent.com/modules/NuQIQvCFtFLtIfC3oSAs/9SH0OEZVDQZOiJgJZbL2/CustomEventTracker.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useRef}from\"react\";import{addPropertyControls,ControlType,useTracking}from\"framer\";// スクロール閾値（固定、画面枚数）\nconst SCREEN_THRESHOLDS=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30];// 滞在時間閾値（固定、秒単位）\nconst TIME_THRESHOLDS=[10,30,60];// sessionStorageのキープレフィックス\nconst STORAGE_PREFIX=\"custom-event-tracker\";/**\n * CustomEventTracker\n *\n * スクロール距離と滞在時間を自動トラッキングする透明コンポーネント\n * - スクロール: 1〜30 画面分の閲覧で自動発火\n * - 滞在時間: 10秒, 30秒, 60秒 で自動発火\n * - 各イベントはセッション内で1回のみトラッキング\n * - Framer Analytics / Funnels / A/Bテストで利用可能\n */export function CustomEventTracker(props){const{enableScrollTracking=true,enableTimeTracking=true,debugMode=false}=props;const track=useTracking();const timeTrackingStarted=useRef(false);const trackedEvents=useRef(new Set);const maxScrollY=useRef(0);// デバッグログ出力\nconst debugLog=(message,data)=>{if(debugMode){console.log(`[CustomEventTracker] ${message}`,data||\"\");}};// トラッキング実行（重複チェック付き）\nconst executeTracking=(trackingId,label)=>{const storageKey=`${STORAGE_PREFIX}-${trackingId}`;// メモリキャッシュチェック - 即座に判定（0.001ms）\nif(trackedEvents.current.has(trackingId)){return;}// sessionStorageチェック - 永続化確認（0.01ms）\nif(sessionStorage.getItem(storageKey)){trackedEvents.current.add(trackingId);return;}// トラッキング実行\ntrack(trackingId);trackedEvents.current.add(trackingId)// メモリキャッシュに即座に追加\n;sessionStorage.setItem(storageKey,\"true\");debugLog(`✅ トラッキング発火: ${trackingId} (${label})`);};// スクロールトラッキング\nuseEffect(()=>{if(!enableScrollTracking){debugLog(\"スクロールトラッキング: 無効\");return;}debugLog(\"スクロールトラッキング: 開始\");const handleScroll=()=>{const currentScrollY=window.scrollY;// 最大到達スクロール位置を更新（下にスクロールした場合のみ）\nif(currentScrollY>maxScrollY.current){maxScrollY.current=currentScrollY;}const viewportHeight=window.innerHeight;// 最大到達位置で画面枚数を計算（上にスクロールして戻っても影響なし）\nconst screensProceded=maxScrollY.current/viewportHeight;// 各閾値をチェック\nSCREEN_THRESHOLDS.forEach(screens=>{// 20%（0.2画面分）のマージンを追加して誤判定を防止\nconst thresholdWithMargin=screens+.2;if(screensProceded>=thresholdWithMargin){const trackingId=`proceeded-${screens}screen`;executeTracking(trackingId,`${screens}画面分閲覧を完了`);}});};// 初回実行（ページロード時に既にスクロールしている場合）\nhandleScroll();// スクロールイベント監視\nwindow.addEventListener(\"scroll\",handleScroll,{passive:true});return()=>{window.removeEventListener(\"scroll\",handleScroll);debugLog(\"スクロールトラッキング: 停止\");};},[enableScrollTracking,debugMode]);// 滞在時間トラッキング\nuseEffect(()=>{if(!enableTimeTracking){debugLog(\"滞在時間トラッキング: 無効\");return;}// 重複起動防止\nif(timeTrackingStarted.current){return;}timeTrackingStarted.current=true;debugLog(\"滞在時間トラッキング: 開始\");const timers=[];// 各時間閾値に対してタイマーをセット\nTIME_THRESHOLDS.forEach(seconds=>{const timer=setTimeout(()=>{const trackingId=`time-${seconds}s`;executeTracking(trackingId,`滞在時間 ${seconds}秒 経過`);},seconds*1e3);timers.push(timer);});return()=>{// クリーンアップ: 全タイマーをクリア\ntimers.forEach(timer=>clearTimeout(timer));debugLog(\"滞在時間トラッキング: 停止\");};},[enableTimeTracking,debugMode]);// 完全に透明なコンポーネント\n// Framer GUIで配置可能にするため、透明な<div>を返す\nreturn /*#__PURE__*/_jsx(\"div\",{style:{width:\"100%\",height:\"100%\",pointerEvents:\"none\",opacity:0}});}// Property Controls（日本語）\naddPropertyControls(CustomEventTracker,{enableScrollTracking:{title:\"スクロールトラッキング有効化\",type:ControlType.Boolean,defaultValue:true,description:\"1〜30 画面分の閲覧でトラッキング\"},enableTimeTracking:{title:\"滞在時間トラッキング有効化\",type:ControlType.Boolean,defaultValue:true,description:\"10秒, 30秒, 60秒 でトラッキング\"},debugMode:{title:\"デバッグモード\",type:ControlType.Boolean,defaultValue:false,description:\"コンソールログを表示\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"CustomEventTracker\":{\"type\":\"reactComponent\",\"name\":\"CustomEventTracker\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./CustomEventTracker.map"],"mappings":"wMAWG,SAAgB,EAAmB,EAAM,CAAC,GAAK,CAAC,uBAAqB,GAAK,qBAAmB,GAAK,YAAU,IAAO,EAAY,EAAM,EAAY,EAAQ,EAAoBA,EAAO,EAAK,EAAQ,EAAcA,EAAO,IAAI,GAAG,EAAQ,EAAWA,EAAO,CAAC,EACrP,GAAU,EAAQ,IAAO,CAAI,GAAW,QAAQ,IAAI,wBAAwB,IAAU,GAAM,EAAE,CAAG,EACjG,GAAiB,EAAW,IAAQ,CAAC,IAAM,EAAW,GAAG,EAAe,GAAG,IAC9E,MAAc,QAAQ,IAAI,CAAU,EACvC,IAAG,eAAe,QAAQ,CAAU,EAAE,CAAC,EAAc,QAAQ,IAAI,CAAU,EAAE,MAAO,CACpF,EAAM,CAAU,EAAE,EAAc,QAAQ,IAAI,CAAU,EACrD,eAAe,QAAQ,EAAW,MAAM,EAAE,EAAS,eAAe,EAAW,IAAI,EAAM,EAAE,CAFN,CAEQ,EAa5F,OAZA,MAAc,CAAC,GAAG,CAAC,EAAqB,CAAC,EAAS,iBAAiB,EAAE,MAAO,CAAC,EAAS,iBAAiB,EAAE,IAAM,MAAiB,CAAC,IAAM,EAAe,EAAO,QAC1J,EAAe,EAAW,UAAS,EAAW,QAAQ,GAAgB,IAAM,EAAe,EAAO,YAC/F,EAAgB,EAAW,QAAQ,EACzC,EAAkB,QAAQ,GAAS,CACnC,IAAM,EAAoB,EAAQ,GAAG,GAAG,GAAiB,EAAoB,CAAC,IAAM,EAAW,aAAa,EAAQ,QAAQ,EAAgB,EAAW,GAAG,EAAQ,SAAS,CAAE,CAAC,CAAC,CAAE,EAEnH,OAD9D,EAAa,EACb,EAAO,iBAAiB,SAAS,EAAa,CAAC,QAAQ,EAAI,CAAC,MAAY,CAAC,EAAO,oBAAoB,SAAS,CAAY,EAAE,EAAS,iBAAiB,CAAE,CAAE,EAAE,CAAC,EAAqB,CAAS,CAAC,EAC3L,MAAc,CAAC,GAAG,CAAC,EAAmB,CAAC,EAAS,gBAAgB,EAAE,MAAO,CACzE,GAAG,EAAoB,QAAS,OAAQ,EAAoB,QAAQ,GAAK,EAAS,gBAAgB,EAAE,IAAM,EAAO,CAAC,EACuE,OAAzL,EAAgB,QAAQ,GAAS,CAAC,IAAM,EAAM,eAAe,CAAC,IAAM,EAAW,QAAQ,EAAQ,GAAG,EAAgB,EAAW,QAAQ,EAAQ,KAAK,CAAE,EAAE,EAAQ,GAAG,EAAE,EAAO,KAAK,CAAK,CAAE,CAAC,MAAY,CACnM,EAAO,QAAQ,GAAO,aAAa,CAAK,CAAC,EAAE,EAAS,gBAAgB,CAAE,CAAE,EAAE,CAAC,EAAmB,CAAS,CAAC,EAEpF,EAAK,MAAM,CAAC,MAAM,CAAC,MAAM,OAAO,OAAO,OAAO,cAAc,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAE,2BA9B1D,IAAoC,IAAgE,EACxI,EAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EACnG,EAAgB,CAAC,GAAG,GAAG,EAAE,EACzB,EAAe,uBA4BrB,EAAoB,EAAmB,CAAC,qBAAqB,CAAC,MAAM,iBAAiB,KAAK,EAAY,QAAQ,aAAa,GAAK,YAAY,oBAAoB,EAAE,mBAAmB,CAAC,MAAM,gBAAgB,KAAK,EAAY,QAAQ,aAAa,GAAK,YAAY,uBAAuB,EAAE,UAAU,CAAC,MAAM,UAAU,KAAK,EAAY,QAAQ,aAAa,GAAM,YAAY,YAAY,CAAC,CAAC"}