{"version":3,"file":"LpTracking.C0FdoXff.mjs","names":["useSyncExternalStore"],"sources":["https:/framerusercontent.com/modules/ALnvfZaKYKQeuh9ahzvy/RZ1ztHh8IVn1mQk7XJmA/AdjustLinkSwitcher.js","https:/framerusercontent.com/modules/cmS6f4ZnWf0JS211XbmA/wJrKf0r23wPrVEHdfBYS/LpTracking.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{forwardRef,useEffect}from\"react\";// アフィリエイト source ごとの遷移先URL。\n// 新しい source を追加する場合はこのマップに 1 行追加するだけでよい。\nconst SOURCE_URL_MAP={choruko:\"https://bloomo.go.link/fVgd7\"};// 置換対象とする「元のリンク先」の前方一致パターン。\n// bloomo.go.link のディープリンクのみを置換対象とする。\nconst TARGET_URL_PREFIX=\"https://bloomo.go.link/\";// ボタン単位ではなく、適用したコンポーネント配下のすべての <a href> を再帰的に\n// 書き換えるバージョン。ページのルートコンポーネント（Headerやラッパー等）に\n// 1か所だけ適用すれば、ページ内のすべての bloomo.go.link リンクが置換される。\n//\n// Framerは再レンダリングで href を元に戻すことがあるため、MutationObserverで\n// 追従させている。\n//\n// 使用方法:\n// 1. ページ内で常にマウントされているルートコンポーネントに適用\n// 2. ページ全体の <a href=\"https://bloomo.go.link/...\"> が source に応じて差し替わる\nexport function withSwitchLinkBySourceRecursively(Component){return /*#__PURE__*/forwardRef((props,ref)=>{useEffect(()=>{if(typeof window===\"undefined\")return;const source=new URLSearchParams(window.location.search).get(\"source\");if(!source||!(source in SOURCE_URL_MAP))return;const newUrl=SOURCE_URL_MAP[source];const rewrite=()=>{document.querySelectorAll(\"a[href]\").forEach(a=>{const href=a.getAttribute(\"href\");if(href&&href.startsWith(TARGET_URL_PREFIX)&&href!==newUrl){a.setAttribute(\"href\",newUrl);}});};rewrite();const observer=new MutationObserver(rewrite);observer.observe(document.body,{childList:true,subtree:true,attributes:true,attributeFilter:[\"href\"]});return()=>observer.disconnect();},[]);return /*#__PURE__*/_jsx(Component,{ref:ref,...props});});}\nexport const __FramerMetadata__ = {\"exports\":{\"withSwitchLinkBySourceRecursively\":{\"type\":\"reactHoc\",\"name\":\"withSwitchLinkBySourceRecursively\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./AdjustLinkSwitcher.map","import{jsx as _jsx}from\"react/jsx-runtime\";import{forwardRef,useEffect,useSyncExternalStore}from\"react\";import{withSwitchLinkBySourceRecursively}from\"https://framerusercontent.com/modules/ALnvfZaKYKQeuh9ahzvy/RZ1ztHh8IVn1mQk7XJmA/AdjustLinkSwitcher.js\";// Framer公式のcreateStore（framer.com/m/framer/store.js）は使わない。\n// あちらはリスナー登録がuseEffect内で行われ、購読時に最新値へ再同期しないため、\n// 「子コンポーネントのeffect（with*PageTracking）が親（withLpTypeQueryParamRecursively）の\n// 購読開始より先にsetStoreする」というマウント順（React effectは子→親）で更新を取りこぼし、\n// 直前ページのlp_typeが残り続けるバグがあった。\n// useSyncExternalStoreは購読開始時にスナップショットを再チェックするため、この問題が起きない。\nfunction createLpTypeSyncStore(initialState){let state=initialState;const listeners=new Set;const setState=newState=>{state=newState;listeners.forEach(listener=>listener());};const subscribe=listener=>{listeners.add(listener);return()=>{listeners.delete(listener);};};const getSnapshot=()=>state;return function useStore(){const store=useSyncExternalStore(subscribe,getSnapshot,getSnapshot);return[store,setState];};}// lp_typeのグローバルストア。以下の2用途で共用する。\n// - 登録時の獲得チャネル情報（UserRegistration.tsxのregisterButtonがクリック時に参照）\n// - aura向けリンクに付与するlp_typeクエリパラメータ（withLpTypeQueryParamRecursivelyが参照）\n//\n// 各ページのラッパーがマウント時に上書きするほか、with*LpType系のクリックOverrideでも\n// 更新される（ホームのセクションボタン → /register遷移のフロー用）。\n// generalページ（トップページ等）を経由するとgeneralに戻る仕様。\nexport const useLpTypeStore=createLpTypeSyncStore({lpType:\"general\"});// useStoreで lp_type を保存するCode Override\n//\n// 使用箇所:\n// - ホームページの個別セクションのユーザー登録ボタン\n//\n// Framerでの使用方法:\n// 1. リンクボタンにこのCode Overrideを適用\n// 2. クリック時にstoreにlp_typeが保存され、SPAルーティングで遷移が行われる\nexport function withUsStockEtfLpType(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const[,setStore]=useLpTypeStore();const handleClick=e=>{props?.onClick?.(e);setStore({lpType:\"us_stock_etf\"});};return /*#__PURE__*/_jsx(Component,{ref:ref,...props,onClick:handleClick});});}export function withCoreLpType(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const[,setStore]=useLpTypeStore();const handleClick=e=>{props?.onClick?.(e);setStore({lpType:\"core\"});};return /*#__PURE__*/_jsx(Component,{ref:ref,...props,onClick:handleClick});});}export function withIncomeLpType(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const[,setStore]=useLpTypeStore();const handleClick=e=>{props?.onClick?.(e);setStore({lpType:\"income\"});};return /*#__PURE__*/_jsx(Component,{ref:ref,...props,onClick:handleClick});});}export function withChinosentakuLpType(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const[,setStore]=useLpTypeStore();const handleClick=e=>{props?.onClick?.(e);setStore({lpType:\"chinosentaku\"});};return /*#__PURE__*/_jsx(Component,{ref:ref,...props,onClick:handleClick});});}// ページ読み込み時にlp_typeをstoreに保存するCode Override\n//\n// Framerでの使用方法:\n// 1. 下で定義するWrapper経由で適用する\n// 2. ページ読み込み時に自動でstoreに保存される\nfunction withPageTracking(Component,lpType){return /*#__PURE__*/forwardRef((props,ref)=>{const[,setStore]=useLpTypeStore();useEffect(()=>{setStore({lpType});},[]);return /*#__PURE__*/_jsx(Component,{ref:ref,...props});});}export function withUsStockEtfPageTracking(Component){return withPageTracking(Component,\"us_stock_etf\");}export function withCorePageTracking(Component){return withPageTracking(Component,\"core\");}export function withIncomePageTracking(Component){return withPageTracking(Component,\"income\");}export function withChinosentakuPageTracking(Component){return withPageTracking(Component,\"chinosentaku\");}// LPページ以外（トップページ等）用のページトラッキング。\n// ストアをgeneralに戻す。ストアはSPA遷移をまたいで生き残るため、\n// これを行わないと直前に見ていたLPのlp_typeが残り続ける。\n//\n// 注意: 登録フォームのあるページ（/register等）には適用しないこと。\n// LPやクリックOverrideで記録した獲得チャネル情報がマウント時にgeneralで\n// 上書きされてしまう。\nexport function withGeneralPageTracking(Component){return withPageTracking(Component,\"general\");}// lp_type クエリパラメータを付与する対象とするリンク先（aura / Web版Bloomo）の\n// 前方一致パターン。\nconst AURA_URL_PREFIXES=[\"https://sec.bloomo.co.jp\",\"https://stg-sec.bloomo.co.jp\"];// 適用したコンポーネント配下のすべての aura（Web版Bloomo）向け <a href> に、\n// storeに保存されている lp_type をクエリパラメータとして再帰的に付与する。\n// aura側は登録時にこの lp_type を獲得チャネル情報\n// （acquisition_channel_kind=lp / acquisition_channel_detail={ lp_type }）として登録する。\n//\n// Framerは再レンダリングで href を元に戻すことがあるため、MutationObserverで\n// 追従させている。\n//\n// 同じ要素には1つのCode Overrideしか適用できないため、単体では使わず\n// 下で定義するラッパー経由で適用する。\nfunction withLpTypeQueryParamRecursively(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const[store]=useLpTypeStore();useEffect(()=>{if(typeof window===\"undefined\")return;const lpType=store.lpType;if(!lpType)return;const rewrite=()=>{document.querySelectorAll(\"a[href]\").forEach(a=>{const href=a.getAttribute(\"href\");if(!href)return;if(!AURA_URL_PREFIXES.some(prefix=>href.startsWith(prefix))){return;}// Framer編集者が誤ってパース不能なURLを設定していても、\n// 例外で他のリンクの書き換えまで巻き込んで止めない\nlet url;try{url=new URL(href);}catch{return;}// すでに同じ値が付与されていれば何もしない\n// （MutationObserverが自身の書き換えで再発火した際のループ防止も兼ねる）\nif(url.searchParams.get(\"lp_type\")===lpType)return;url.searchParams.set(\"lp_type\",lpType);a.setAttribute(\"href\",url.toString());});};rewrite();const observer=new MutationObserver(rewrite);observer.observe(document.body,{childList:true,subtree:true,attributes:true,attributeFilter:[\"href\"]});return()=>observer.disconnect();},[store.lpType]);return /*#__PURE__*/_jsx(Component,{ref:ref,...props});});}// 各LPページのルートコンポーネント用のラッパー。\n// ページ単位のlp_type記録 (with*PageTracking) と、\n// アフィリエイトsourceに応じたリンク差し替え (withSwitchLinkBySourceRecursively) と、\n// aura向けリンクへのlp_typeクエリパラメータ付与 (withLpTypeQueryParamRecursively) を\n// まとめて適用する。\n//\n// Framerでの使用方法:\n// 1. 各LPページの常時マウントされるルートコンポーネント（Headerやラッパー等）に\n//    対応するラッパーを1つだけ適用する\n// 2. ページ読み込み時にlp_typeがstoreへ保存され、配下のすべての\n//    bloomo.go.linkリンクがsourceに応じて差し替わり、\n//    aura向けリンクに ?lp_type=<値> が付与される\nexport function withUsStockEtfLpWrapper(Component){return withSwitchLinkBySourceRecursively(withLpTypeQueryParamRecursively(withUsStockEtfPageTracking(Component)));}export function withCoreLpWrapper(Component){return withSwitchLinkBySourceRecursively(withLpTypeQueryParamRecursively(withCorePageTracking(Component)));}export function withIncomeLpWrapper(Component){return withSwitchLinkBySourceRecursively(withLpTypeQueryParamRecursively(withIncomePageTracking(Component)));}export function withChinosentakuLpWrapper(Component){return withSwitchLinkBySourceRecursively(withLpTypeQueryParamRecursively(withChinosentakuPageTracking(Component)));}// LPページ以外（トップページ等）用のラッパー。\n// lp_typeをgeneralにリセットし、リンク差し替えとlp_type付与を適用する。\n// ストアは獲得チャネル情報と共用のため、登録フォームのあるページ\n// （/register等）には適用しないこと（withGeneralPageTrackingの注意書き参照）。\nexport function withGeneralLpWrapper(Component){return withSwitchLinkBySourceRecursively(withLpTypeQueryParamRecursively(withGeneralPageTracking(Component)));}\nexport const __FramerMetadata__ = {\"exports\":{\"useLpTypeStore\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withIncomeLpType\":{\"type\":\"reactHoc\",\"name\":\"withIncomeLpType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withGeneralPageTracking\":{\"type\":\"reactHoc\",\"name\":\"withGeneralPageTracking\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withIncomePageTracking\":{\"type\":\"reactHoc\",\"name\":\"withIncomePageTracking\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withCoreLpType\":{\"type\":\"reactHoc\",\"name\":\"withCoreLpType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withChinosentakuLpType\":{\"type\":\"reactHoc\",\"name\":\"withChinosentakuLpType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withCorePageTracking\":{\"type\":\"reactHoc\",\"name\":\"withCorePageTracking\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withUsStockEtfLpWrapper\":{\"type\":\"reactHoc\",\"name\":\"withUsStockEtfLpWrapper\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withGeneralLpWrapper\":{\"type\":\"reactHoc\",\"name\":\"withGeneralLpWrapper\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withChinosentakuPageTracking\":{\"type\":\"reactHoc\",\"name\":\"withChinosentakuPageTracking\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withUsStockEtfPageTracking\":{\"type\":\"reactHoc\",\"name\":\"withUsStockEtfPageTracking\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withChinosentakuLpWrapper\":{\"type\":\"reactHoc\",\"name\":\"withChinosentakuLpWrapper\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withUsStockEtfLpType\":{\"type\":\"reactHoc\",\"name\":\"withUsStockEtfLpType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withIncomeLpWrapper\":{\"type\":\"reactHoc\",\"name\":\"withIncomeLpWrapper\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withCoreLpWrapper\":{\"type\":\"reactHoc\",\"name\":\"withCoreLpWrapper\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./LpTracking.map"],"mappings":"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"}