@gem-sdk/pages 2.0.0-dev.890 → 2.0.0-staging.118

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/dist/cjs/components/ErrorBoundary.js +41 -1
  2. package/dist/cjs/components/ErrorFallback.js +27 -1
  3. package/dist/cjs/components/FacebookPixel.js +34 -3
  4. package/dist/cjs/components/FooterForPostPurchase.js +35 -1
  5. package/dist/cjs/components/GoogleAnalytic.js +66 -5
  6. package/dist/cjs/components/TikTokPixel.js +20 -3
  7. package/dist/cjs/components/builder/Body.js +37 -0
  8. package/dist/cjs/components/builder/Footer.js +155 -0
  9. package/dist/cjs/components/builder/Header.js +188 -0
  10. package/dist/cjs/components/builder/PopupManager.js +64 -1
  11. package/dist/cjs/components/builder/SwitchView.js +185 -0
  12. package/dist/cjs/components/builder/Toolbar.js +701 -1
  13. package/dist/cjs/components/builder/Toolbox.js +485 -1
  14. package/dist/cjs/components/builder/const.js +56 -0
  15. package/dist/cjs/components/builder/toolbar/const.js +7 -0
  16. package/dist/cjs/components/builder/toolbar/utils/findDOMClosest.js +41 -0
  17. package/dist/cjs/components/builder/toolbar/utils/findOverflowParent.js +20 -0
  18. package/dist/cjs/components/builder/toolbar/utils/getChildrenByAttrSelector.js +18 -0
  19. package/dist/cjs/components/builder/toolbar/utils/getDOMElementParents.js +32 -0
  20. package/dist/cjs/components/builder/toolbar/utils/isOverParent.js +16 -0
  21. package/dist/cjs/components/builder/toolbar/utils/isOverToolbarPosition.js +12 -0
  22. package/dist/cjs/components/builder/toolbar/utils/isSection.js +8 -0
  23. package/dist/cjs/components/builder/toolbar/utils/notVisible.js +8 -0
  24. package/dist/cjs/components/builder/toolbar/utils/waitForElementToExist.js +27 -0
  25. package/dist/cjs/components/image-to-layout/AddSectionImageToLayout.js +151 -1
  26. package/dist/cjs/components/image-to-layout/DropElement.js +167 -1
  27. package/dist/cjs/components/image-to-layout/ImageToLayout.js +42 -1
  28. package/dist/cjs/index.js +80 -1
  29. package/dist/cjs/layouts/main.js +31 -1
  30. package/dist/cjs/libs/api/get-builder-props.js +46 -1
  31. package/dist/cjs/libs/api/get-collection-props.js +68 -1
  32. package/dist/cjs/libs/api/get-home-page-props-v2.js +145 -1
  33. package/dist/cjs/libs/api/get-home-page-props.js +151 -1
  34. package/dist/cjs/libs/api/get-post-purchase-props-preview.js +268 -1
  35. package/dist/cjs/libs/api/get-preview-props.js +18 -1
  36. package/dist/cjs/libs/api/get-product-props.js +73 -1
  37. package/dist/cjs/libs/api/get-static-page-props-preview.js +155 -1
  38. package/dist/cjs/libs/api/get-static-page-props-v2.js +164 -1
  39. package/dist/cjs/libs/api/get-static-page-props.js +148 -1
  40. package/dist/cjs/libs/custom-fonts.js +60 -6
  41. package/dist/cjs/libs/fetcher.js +100 -1
  42. package/dist/cjs/libs/get-layout.js +13 -1
  43. package/dist/cjs/libs/get-storefront-api.js +12 -1
  44. package/dist/cjs/libs/getStaticPaths.js +10 -1
  45. package/dist/cjs/libs/google-fonts.js +118 -1
  46. package/dist/cjs/libs/helpers/check-option-font.js +65 -0
  47. package/dist/cjs/libs/helpers/common.js +27 -1
  48. package/dist/cjs/libs/helpers/gen-css.js +135 -1
  49. package/dist/cjs/libs/helpers/gen-fonts.js +90 -1
  50. package/dist/cjs/libs/helpers/generate-manifres.js +5 -1
  51. package/dist/cjs/libs/helpers/get-fallback.js +34 -1
  52. package/dist/cjs/libs/helpers/normalize.js +111 -1
  53. package/dist/cjs/libs/helpers/parse-json.js +16 -1
  54. package/dist/cjs/libs/helpers/user-agent.js +7 -1
  55. package/dist/cjs/libs/hooks/use-tracking-view.js +43 -1
  56. package/dist/cjs/libs/hooks/usePagePreview.js +92 -1
  57. package/dist/cjs/libs/parse-html.js +34 -1
  58. package/dist/cjs/libs/shopify-cdn-with-google-fonts.js +1845 -1
  59. package/dist/cjs/pages/404.js +43 -1
  60. package/dist/cjs/pages/500.js +74 -1
  61. package/dist/cjs/pages/CollectionGlobalProvider.js +59 -1
  62. package/dist/cjs/pages/builder.js +115 -1
  63. package/dist/cjs/pages/collection-detail.js +64 -1
  64. package/dist/cjs/pages/preview.js +26 -1
  65. package/dist/cjs/pages/product-detail.js +69 -1
  66. package/dist/cjs/pages/static-v2.js +139 -1
  67. package/dist/cjs/pages/static.js +75 -1
  68. package/dist/cjs/store/libs-store.js +14 -0
  69. package/dist/esm/components/ErrorBoundary.js +39 -1
  70. package/dist/esm/components/ErrorFallback.js +25 -1
  71. package/dist/esm/components/FacebookPixel.js +32 -3
  72. package/dist/esm/components/FooterForPostPurchase.js +31 -1
  73. package/dist/esm/components/GoogleAnalytic.js +64 -5
  74. package/dist/esm/components/TikTokPixel.js +18 -3
  75. package/dist/esm/components/builder/Body.js +33 -0
  76. package/dist/esm/components/builder/Footer.js +151 -0
  77. package/dist/esm/components/builder/Header.js +184 -0
  78. package/dist/esm/components/builder/PopupManager.js +60 -1
  79. package/dist/esm/components/builder/SwitchView.js +181 -0
  80. package/dist/esm/components/builder/Toolbar.js +697 -1
  81. package/dist/esm/components/builder/Toolbox.js +481 -1
  82. package/dist/esm/components/builder/const.js +54 -0
  83. package/dist/esm/components/builder/toolbar/const.js +4 -0
  84. package/dist/esm/components/builder/toolbar/utils/findDOMClosest.js +39 -0
  85. package/dist/esm/components/builder/toolbar/utils/findOverflowParent.js +18 -0
  86. package/dist/esm/components/builder/toolbar/utils/getChildrenByAttrSelector.js +16 -0
  87. package/dist/esm/components/builder/toolbar/utils/getDOMElementParents.js +30 -0
  88. package/dist/esm/components/builder/toolbar/utils/isOverParent.js +14 -0
  89. package/dist/esm/components/builder/toolbar/utils/isOverToolbarPosition.js +10 -0
  90. package/dist/esm/components/builder/toolbar/utils/isSection.js +6 -0
  91. package/dist/esm/components/builder/toolbar/utils/notVisible.js +6 -0
  92. package/dist/esm/components/builder/toolbar/utils/waitForElementToExist.js +25 -0
  93. package/dist/esm/components/image-to-layout/AddSectionImageToLayout.js +147 -1
  94. package/dist/esm/components/image-to-layout/DropElement.js +165 -1
  95. package/dist/esm/components/image-to-layout/ImageToLayout.js +38 -1
  96. package/dist/esm/index.js +35 -1
  97. package/dist/esm/layouts/main.js +27 -1
  98. package/dist/esm/libs/api/get-builder-props.js +44 -1
  99. package/dist/esm/libs/api/get-collection-props.js +66 -1
  100. package/dist/esm/libs/api/get-home-page-props-v2.js +143 -1
  101. package/dist/esm/libs/api/get-home-page-props.js +149 -1
  102. package/dist/esm/libs/api/get-post-purchase-props-preview.js +260 -1
  103. package/dist/esm/libs/api/get-preview-props.js +16 -1
  104. package/dist/esm/libs/api/get-product-props.js +71 -1
  105. package/dist/esm/libs/api/get-static-page-props-preview.js +153 -1
  106. package/dist/esm/libs/api/get-static-page-props-v2.js +162 -1
  107. package/dist/esm/libs/api/get-static-page-props.js +146 -1
  108. package/dist/esm/libs/custom-fonts.js +55 -6
  109. package/dist/esm/libs/fetcher.js +96 -1
  110. package/dist/esm/libs/get-layout.js +11 -1
  111. package/dist/esm/libs/get-storefront-api.js +10 -1
  112. package/dist/esm/libs/getStaticPaths.js +8 -1
  113. package/dist/esm/libs/google-fonts.js +112 -1
  114. package/dist/esm/libs/helpers/check-option-font.js +63 -0
  115. package/dist/esm/libs/helpers/common.js +24 -1
  116. package/dist/esm/libs/helpers/gen-css.js +133 -1
  117. package/dist/esm/libs/helpers/gen-fonts.js +87 -1
  118. package/dist/esm/libs/helpers/generate-manifres.js +3 -1
  119. package/dist/esm/libs/helpers/get-fallback.js +32 -1
  120. package/dist/esm/libs/helpers/normalize.js +103 -1
  121. package/dist/esm/libs/helpers/parse-json.js +13 -1
  122. package/dist/esm/libs/helpers/user-agent.js +5 -1
  123. package/dist/esm/libs/hooks/use-tracking-view.js +41 -1
  124. package/dist/esm/libs/hooks/usePagePreview.js +90 -1
  125. package/dist/esm/libs/parse-html.js +32 -1
  126. package/dist/esm/libs/shopify-cdn-with-google-fonts.js +1843 -1
  127. package/dist/esm/pages/404.js +41 -1
  128. package/dist/esm/pages/500.js +72 -1
  129. package/dist/esm/pages/CollectionGlobalProvider.js +55 -1
  130. package/dist/esm/pages/builder.js +113 -1
  131. package/dist/esm/pages/collection-detail.js +60 -1
  132. package/dist/esm/pages/preview.js +24 -1
  133. package/dist/esm/pages/product-detail.js +65 -1
  134. package/dist/esm/pages/static-v2.js +137 -1
  135. package/dist/esm/pages/static.js +71 -1
  136. package/dist/esm/store/libs-store.js +12 -0
  137. package/dist/types/index.d.ts +50 -34
  138. package/package.json +8 -5
  139. package/dist/cjs/components/Footer.js +0 -1
  140. package/dist/cjs/components/Header.js +0 -1
  141. package/dist/cjs/components/builder/toolbar/Onboarding.js +0 -1
  142. package/dist/esm/components/Footer.js +0 -1
  143. package/dist/esm/components/Header.js +0 -1
  144. package/dist/esm/components/builder/toolbar/Onboarding.js +0 -1
@@ -1 +1,701 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var jsxRuntime=require("react/jsx-runtime"),react=require("react"),Onboarding=require("./toolbar/Onboarding.js");const TOOLBAR_HOVER_HEIGHT=24,TOOLBAR_ACTIVE_HEIGHT=32,getDOMElementParents=(t,e,r)=>{let o=[];for(;t;)if(t=t.parentElement??void 0){if("BODY"===t.tagName||"ROOT"===t.getAttribute("data-uid"))break;if(e){if(t.matches(e)&&(o.push(t),r&&o.length==r))return o;continue}if(o.push(t),r&&o.length==r)break}return o},getChildrenByAttrSelector=(t,e)=>{let r=t.children.length;if(r)for(let o=0;o<r;o++){let r=t.children[o];if(r){let t=r.getAttribute(e);if(t)return r}}},isOverParent=({current:t,parent:e,index:r,revert:o})=>{for(let a=0;a<r;a++){let r=t.top-23*a>=e.top&&t.top-23*a<=e.top+e.height||t.top-23*a>=e.top+e.height&&t.top-23*a<=e.top;if(o&&(r=t.bottom+23*a>=e.bottom&&t.bottom+23*a<=e.bottom-e.height||t.bottom+23*a>=e.bottom-e.height&&t.bottom+23*a<=e.bottom),r)return!0}return!1},waitForElementToExist=(t,e=200)=>new Promise(r=>{let o=setInterval(()=>{let e=document.querySelector(t);e&&(clearInterval(o),clearTimeout(a),r(e))},50),a=setTimeout(()=>{clearInterval(o),clearTimeout(a),r(null)},e)}),notVisible=t=>{let e=getComputedStyle(t).overflow;return"visible"!==e},isSection=t=>{let e=t.getAttribute("data-component-tag");return"Section"===e},isLayoutElement=t=>{let e=t.getAttribute("data-component-tag");return"Row"===e||"Product"===e},isPopup=t=>{let e=t.getAttribute("data-component-tag");return"Dialog"===e},isSticky=t=>{let e=t.getAttribute("data-component-tag");return"Sticky"===e},isOverToolbarPosition=(t,e)=>{let r=t.getBoundingClientRect(),o=e.getBoundingClientRect();return r.top-o.top<33},findOverflowParent=(t,e)=>{let r=e||t;if(t&&!isSection(t))return notVisible(t)&&isOverToolbarPosition(e,t)?t:t.parentElement?findOverflowParent(t.parentElement,r):void 0},COMPONENTS_TAG_NOT_LOAD_IMAGES=["PostPurchaseProductImages"],Toolbar=()=>{let t=react.useRef(null),e=react.useRef(!1),r=react.useRef(),o=react.useRef(!1),a=react.useRef(!1),[i,n]=react.useState(!1),[l,d]=react.useState(0),[u,c]=react.useState("bottom"),s=react.useRef(null),b=({state:t,$toolbar:e,$component:r})=>{let o=findOverflowParent(r,e),a=e.getBoundingClientRect(),i=r.getBoundingClientRect(),n=window.innerWidth;o?i?.height<=60?e.setAttribute(`data-toolbar-${t}-revert`,"true"):e.setAttribute(`data-toolbar-${t}-inside`,"true"):a.top<33&&(i?.height<=60?e.setAttribute(`data-toolbar-${t}-revert`,"true"):e.setAttribute(`data-toolbar-${t}-inside`,"true")),i.left+a.width>n&&e.setAttribute(`data-toolbar-${t}-overflow`,"true");let l=r?.closest('[aria-label="Dialog body"]');if(l){let r=l.getBoundingClientRect(),o=r.left+r.width-20;i.left+a.width>o&&e.setAttribute(`data-toolbar-${t}-overflow`,"true")}},m=react.useCallback(({$component:t,componentUid:e,focus:r,isPreventSection:o,isParent:a})=>{if(!t&&!e)return;if(!t){let r=document.querySelector(`[data-uid="${e}"]`);if(!r)return;t=r}if(!e){let r=t.getAttribute("data-uid");if(!r)return;e=r}let i=getChildrenByAttrSelector(t,"data-toolbar"),n=getChildrenByAttrSelector(t,"data-outline"),l=getChildrenByAttrSelector(t,"data-toolbar-add-top"),d=getChildrenByAttrSelector(t,"data-toolbar-add-bottom"),u=getChildrenByAttrSelector(t,"data-column"),c=getChildrenByAttrSelector(t,"data-theme-section-status");o&&c&&c.setAttribute("data-theme-section-status-active","true"),i&&(i.removeAttribute("style"),a||i.setAttribute("data-toolbar-hover","true"),r&&i.setAttribute("data-toolbar-hover-focus","true"),b({$toolbar:i,$component:t,state:"hover"})),n&&(n.setAttribute("data-outline-hover","true"),a&&n.setAttribute("data-outline-parent-hover","true"),o&&n.setAttribute("data-outline-overlay-theme-section","true"),r&&n.setAttribute("data-outline-hover-focus","true")),l&&!a&&l.setAttribute("data-toolbar-add-hover","true"),d&&!a&&d.setAttribute("data-toolbar-add-hover","true"),u&&u.setAttribute("data-column-visible","true")},[]),v=react.useCallback(({$component:t,componentUid:e})=>{if(!t){let r=document.querySelector(`[data-uid="${e}"]`);if(!r)return;t=r}let r=getDOMElementParents(t,'[data-uid][data-component-type="component"]:not([data-component-no-setting])',1);if(r.length){for(let t of r)t&&m({$component:t,isParent:!0});f({$component:t,$parents:r})}},[m]),f=({$component:t,$parents:e})=>{if(!t||!e?.length)return;let r=getChildrenByAttrSelector(t,"data-toolbar-hover-focus");if(r){let t=r.getBoundingClientRect(),o=!!r.getAttribute("data-toolbar-hover-revert"),a=!!r.getAttribute("data-toolbar-hover-inside"),i=1;for(let r of e)if(r){let e=r.getAttribute("data-component-tag");if("Section"===e)continue;let n=getChildrenByAttrSelector(r,"data-toolbar-hover");if(n){let e=n.getAttribute("data-toolbar-active");if(e)continue;let r=n.getBoundingClientRect(),l=o||a;if(isOverParent({current:t,parent:r,index:i,revert:l})){let e=getComputedStyle(n),o=t.top-r.top,a=t.left-r.left,d=parseFloat(e.top)+o-23*i;l&&(d=parseFloat(e.top)-o+23*i);let u=parseFloat(e.left)+a;n.setAttribute("style",`top: ${d}px;left: ${u}px;`),i++}}}}},g=react.useCallback(()=>{let t=["data-outline-overlay","data-outline-overlay-theme-section","data-theme-section-status-active"],e=document.querySelectorAll(t.map(t=>`[${t}]`).join(","));e&&t.forEach(t=>{e.forEach(e=>e.removeAttribute(t))})},[]),p=react.useCallback(()=>{let t=["data-toolbar-hover-focus","data-toolbar-hover","data-outline-hover-focus","data-toolbar-hover-revert","data-toolbar-hover-inside","data-outline-hover","data-toolbar-add-hover","data-column-visible","data-outline-parent-hover","data-toolbar-hover-overflow"],e=document.querySelectorAll(t.map(t=>`[${t}]`).join(","));e&&t.forEach(t=>{e.forEach(e=>e.removeAttribute(t))}),g()},[g]),h=react.useCallback(()=>{if(s.current&&clearTimeout(s.current),l>0){let t=new CustomEvent("editor:toolbar:close-onboarding",{bubbles:!0,detail:{close:"close Onboarding"}});window.dispatchEvent(t),n(!1)}},[l]),A=react.useCallback(()=>{t.current=null;let e=["data-toolbar-active","data-outline-active","data-toolbar-add-active","data-toolbar-active-revert","data-toolbar-active-inside","data-spacing-margin-bottom-active","data-toolbar-force-hover","data-outline-force-hover","data-column-force-visible","data-toolbar-active-overflow"],o=document.querySelectorAll(e.map(t=>`[${t}]`).join(","));o&&e.forEach(t=>{o.forEach(e=>e.removeAttribute(t))}),B(!1),r.current&&r.current(),h()},[h]),y=(e,o)=>{let a=e=>{let r=e.detail;r?.componentUid==t.current?.componentUid&&o()};window.removeEventListener("editor:component:render",a),window.addEventListener("editor:component:render",a);let i=e.getAttribute("data-component-tag");if(i&&!COMPONENTS_TAG_NOT_LOAD_IMAGES.includes(i)){let t=e.querySelectorAll("img");t?.length&&t.forEach(t=>{t.addEventListener("load",()=>{o()})})}r.current=()=>{window.removeEventListener("editor:component:render",a)}},w=react.useCallback(({$component:t})=>{if(!t)return;let e=getComputedStyle(t),r=getChildrenByAttrSelector(t,"data-spacing"),o=r?.querySelector("[data-spacing-margin-bottom]")||null;if(o){let r=o.querySelector("[data-spacing-margin-bottom-bg]")||null,a=o.querySelector("[data-spacing-margin-bottom-drag]")||null;if(r&&a){let i=e.marginBottom;if(0>parseFloat(i)&&(i="0"),r.style.height=i,a.style.top=i,o.setAttribute("data-spacing-margin-bottom-active","true"),isLayoutElement(t))r.style.left="0";else{let t=e.paddingLeft,o=`-${t}`,i=`translate(${o}, -100%)`;r.style.left=o,a.style.transform=i}}}},[]),E=()=>{let t=document.querySelector("[data-toolbar-active]"),e=document.querySelector("[data-toolbar-onboarding]");t&&e&&(e?.removeAttribute("data-onboarding-active"),setTimeout(()=>{let r=t.getBoundingClientRect(),o=r.top||0,a=e?.getBoundingClientRect(),i=a?.height||0,n=parent.document.querySelector(".iframe"),l=n?.contentWindow,u=l?.scrollY||0,s=n?.clientHeight||0;if(o+i>s){let t=r.top+u-i-8;e?.setAttribute("style",`top: ${t}px;left: ${r.left}px;`),c("top"),l&&t<r.top+u&&setTimeout(()=>{let e=t-20;l.scrollTo({top:e,behavior:"smooth"})},200)}else{let t=r.top+u+r.height+8;e?.setAttribute("style",`top: ${t}px;left: ${r.left}px;`),c("bottom")}d(t=>t+1),e?.setAttribute("data-onboarding-active","true")},100))},S=react.useCallback(({$component:t})=>{if(!t||isSection(t)||isPopup(t)||isSticky(t))return;let e=document.querySelector("[data-toolbar-onboarding]");0==l?E():(h(),e?.removeAttribute("data-onboarding-active"))},[l,h]),C=({componentUid:t,productId:e,marqueeKey:r})=>r?`[marquee-item-key="${r}"] [data-uid="${t}"]`:`${e?`[data-product-id="${e}"][data-uid="${t}"], [data-product-id="${e}"] [data-uid="${t}"]`:`[data-uid="${t}"]`}`,$=react.useCallback(async({componentUid:e,productId:r,timeAwait:o=600,forceReActive:a,marqueeKey:i})=>{if(!e)return;let n=C({componentUid:e,productId:r,marqueeKey:i}),l=await waitForElementToExist(n,o);if(!l||!a&&e==t.current?.componentUid&&r==t.current?.productId&&i==t.current?.marqueeKey)return;(a||e===t.current?.componentUid)&&r===t.current?.productId&&i===t.current?.marqueeKey||A();let d=getChildrenByAttrSelector(l,"data-toolbar"),u=getChildrenByAttrSelector(l,"data-outline"),c=getChildrenByAttrSelector(l,"data-toolbar-add-top"),m=getChildrenByAttrSelector(l,"data-toolbar-add-bottom"),v=getChildrenByAttrSelector(l,"data-column");d&&(t.current={componentUid:e,productId:r,marqueeKey:i},d.removeAttribute("style"),d.setAttribute("data-toolbar-active","true"),b({$toolbar:d,$component:l,state:"active"})),u&&u.setAttribute("data-outline-active","true"),c&&c.setAttribute("data-toolbar-add-active","true"),m&&m.setAttribute("data-toolbar-add-active","true"),v&&v.setAttribute("data-column-force-visible","true");let f=!!l.closest('[data-component-tag="Marquee"]');if(r||f){let t=document.querySelectorAll(`[data-uid="${e}"]`);t?.length&&t.forEach(t=>{let e=getChildrenByAttrSelector(t,"data-outline");e&&e.setAttribute("data-outline-active","true")})}w({$component:l}),s.current&&clearTimeout(s.current),s.current=setTimeout(()=>{S({$component:l})},5e3),p(),y(l,()=>{$({componentUid:e,productId:r,timeAwait:2e3,forceReActive:!0})})},[A,p,w,S]),B=async e=>{if(e){if(t.current?.componentUid){let r=t.current?.componentUid,o=t.current?.productId,a=await waitForElementToExist(`${o?`[data-product-id="${o}"] `:""}[data-uid="${r}"]`,500);if(console.log(" $component",a),a){let t=getChildrenByAttrSelector(a,"data-toolbar"),r=getChildrenByAttrSelector(a,"data-outline"),o=getChildrenByAttrSelector(a,"data-spacing");t&&e&&t.setAttribute("data-toolbar-editor-inline-focus","true"),r&&e&&r.setAttribute("data-outline-editor-inline-focus","true"),o&&e&&o.setAttribute("data-spacing-hidden","true")}}}else{let t=document.querySelectorAll("[data-outline-editor-inline-focus],[data-toolbar-editor-inline-focus],[data-spacing-hidden]");t.length&&t.forEach(t=>{t&&(t.removeAttribute("data-toolbar-editor-inline-focus"),t.removeAttribute("data-outline-editor-inline-focus"),t.removeAttribute("data-spacing-hidden"))})}},L=react.useCallback(e=>{let r=e.closest("[data-theme-section]"),o=r?.getAttribute("data-uid"),a=r&&o===t.current?.componentUid;if(!a)return;let i=getChildrenByAttrSelector(r,"data-theme-section-status");i&&i.setAttribute("data-theme-section-status-active","true")},[]),O=async({value:e})=>{if(!e)return;let r=await waitForElementToExist(`${t.current?.productId?`[data-product-id="${t.current?.productId}"] `:""}[data-uid="${t.current?.componentUid}"]`,500);if(r){let e=r?.querySelectorAll("[data-toolbar-parent]");if(e.length){let r=t=>{let e=t.getAttribute("data-parent-uid");if(!e)return;let r=document.querySelectorAll(`[data-uid="${e}"]`);r.length&&r.forEach(t=>{let e=getChildrenByAttrSelector(t,"data-outline");e&&(e.setAttribute("data-outline-force-hover","true"),e.setAttribute("data-outline-force-overlay","true"))})},o=t=>{let e=t.getAttribute("data-parent-uid");if(!e)return;let r=document.querySelectorAll(`[data-uid="${e}"]`);r.length&&r.forEach(t=>{let e=getChildrenByAttrSelector(t,"data-outline");e&&(e.removeAttribute("data-outline-force-hover"),e.removeAttribute("data-outline-force-overlay"))})},a=async e=>{let r=e.getAttribute("data-parent-uid");if(!r)return;let a=async()=>{let t=await waitForElementToExist(`[data-uid="${r}"]`,500),e=t?.closest("[data-product-id]"),o=e?.getAttribute("data-product-id")||"";return!!o},i="";await a()&&(i=t.current?.productId||"");let n=new CustomEvent("editor:toolbar:force-active-component",{bubbles:!0,detail:{componentUid:r,productId:i}});o(e),window.dispatchEvent(n)};e.forEach(t=>{t.addEventListener("mouseover",()=>r(t)),t.addEventListener("mouseout",()=>o(t)),t.addEventListener("click",()=>a(t))})}}},T=react.useCallback(r=>{if(e.current||o.current||a.current)return;let i=r.target;if(!i||"function"!=typeof i.closest){g();return}let n=i.closest("[data-toolbar-hover]");if(n)return;let l=i.closest("[data-toolbar-wrap]"),d=l?.getAttribute("data-uid");if(!l||!d||"ROOT"==d){p();return}let u=getChildrenByAttrSelector(l,"data-toolbar"),c=getChildrenByAttrSelector(l,"data-outline");if(c&&c.removeAttribute("data-outline-overlay"),!d||"ROOT"==d||u?.getAttribute("data-toolbar-hover-focus"))return;if(u?.getAttribute("data-toolbar-hover-focus")||p(),L(i),d==t.current?.componentUid){if(t.current.productId){let e=l.closest("[data-product-id]");if(e){let r=e.getAttribute("data-product-id");if(r==t.current.productId)return}}let e=i.closest("[data-theme-section]")||i.closest("[data-shopify-section]");if(!e)return;m({$component:e,focus:!0,isPreventSection:!0})}let s=i.closest("[data-theme-section]")||i.closest("[data-shopify-section]");s?m({$component:s,focus:!0,isPreventSection:!0}):(m({$component:l,componentUid:d,focus:!0}),v({$component:l,componentUid:d}))},[L,p,m,v,g,t]),q=react.useCallback(t=>{if(e.current)return;let r=t.detail;r?.componentUid?$({componentUid:r.componentUid,productId:r.productId,marqueeKey:r.marqueeKey}):A()},[$,A,e]),k=react.useCallback(()=>{p()},[p]),R=react.useCallback(t=>{let r=t.detail;r.value&&(p(),A()),e.current=r.value},[p,A]),P=react.useCallback(t=>{let e=t.detail;e.value?B(!0):B(!1)},[]),I=react.useCallback(t=>{if(e.current)return;let r=t.detail;O({value:r?.value||!1})},[]),x=react.useCallback(t=>{let e=t.detail;e?.value?(p(),o.current=!0):o.current=!1},[p]),U=react.useCallback(t=>{let e=t.detail;e?.value?(p(),a.current=!0):a.current=!1},[p]),_=(t,e)=>{if(!t)return;let r=document.querySelectorAll(`[data-uid="${t}"]`);r.length&&r.forEach(t=>{let r=getChildrenByAttrSelector(t,"data-outline");r&&("in"===e?(r.setAttribute("data-outline-force-hover","true"),r.setAttribute("data-outline-force-overlay","true")):(r.removeAttribute("data-outline-force-hover"),r.removeAttribute("data-outline-force-overlay")))})},j=react.useCallback(t=>{if(e.current)return;let r=t.detail;r?.componentUid&&_(r?.componentUid,r?.type)},[e]),F=react.useCallback(t=>{let e=t.detail;e?.isNewUser&&n(!0)},[]),M=react.useCallback(()=>{i&&E()},[i]);return react.useEffect(()=>(document.addEventListener("mousemove",T),window.addEventListener("editor:active-component",q),window.addEventListener("editor:focus-outside-preview",k),window.addEventListener("editor:is-dragging",R),window.addEventListener("editor:is-editing-text-editor",P),window.addEventListener("editor:toolbar:show-parents",I),window.addEventListener("editor:toolbar:resize-spacing",x),window.addEventListener("editor:toolbar:resize-column",U),window.addEventListener("editor:hover-component",j),window.addEventListener("editor:toolbar-onboarding",F),window.addEventListener("resize",M),()=>{document.removeEventListener("mousemove",T),window.removeEventListener("editor:active-component",q),window.removeEventListener("editor:is-dragging",k),window.removeEventListener("editor:is-dragging",R),window.removeEventListener("editor:is-editing-text-editor",P),window.removeEventListener("editor:toolbar:show-parents",I),window.removeEventListener("editor:toolbar:resize-spacing",x),window.removeEventListener("editor:toolbar:resize-column",U),window.removeEventListener("editor:hover-component",j),window.removeEventListener("editor:toolbar-onboarding",F),window.removeEventListener("resize",M)}),[T,q,k,R,P,I,x,U,j,F,M]),i&&jsxRuntime.jsx(Onboarding.default,{enable:!0,position:u,onCloseOnboarding:h})};var Toolbar$1=react.memo(Toolbar);exports.default=Toolbar$1;
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+ var react = require('react');
8
+ var getDOMElementParents = require('./toolbar/utils/getDOMElementParents.js');
9
+ var _const = require('./toolbar/const.js');
10
+ var getChildrenByAttrSelector = require('./toolbar/utils/getChildrenByAttrSelector.js');
11
+ var findOverflowParent = require('./toolbar/utils/findOverflowParent.js');
12
+ var waitForElementToExist = require('./toolbar/utils/waitForElementToExist.js');
13
+ var isOverParent = require('./toolbar/utils/isOverParent.js');
14
+ var findDOMClosest = require('./toolbar/utils/findDOMClosest.js');
15
+
16
+ const Toolbar = ()=>{
17
+ const currentComponentActive = react.useRef(null);
18
+ const isDragging = react.useRef(false);
19
+ const stopWatchReRenderComponent = react.useRef();
20
+ const isResizeSpacing = react.useRef(false);
21
+ const cacheHoverComponents = react.useRef([]);
22
+ const cacheHoverThemeSectionComponents = react.useRef([]);
23
+ const cacheActiveComponents = react.useRef([]);
24
+ /* Functions */ const changePositionToolbar = ({ state, $toolbar, $component })=>{
25
+ const $parentOverflow = findOverflowParent.findOverflowParent($component, $toolbar);
26
+ const rect = $toolbar.getBoundingClientRect();
27
+ const rectComponent = $component.getBoundingClientRect();
28
+ const windowWidth = window.innerWidth;
29
+ if ($parentOverflow) {
30
+ if (rectComponent?.height <= 60) {
31
+ $toolbar.setAttribute(`data-toolbar-${state}-revert`, 'true');
32
+ } else {
33
+ $toolbar.setAttribute(`data-toolbar-${state}-inside`, 'true');
34
+ }
35
+ // fix toolbar overflow right side
36
+ if (rectComponent.left + rect.width > windowWidth) {
37
+ $toolbar.setAttribute(`data-toolbar-${state}-overflow`, 'true');
38
+ }
39
+ } else {
40
+ if (rect.top < _const.TOOLBAR_ACTIVE_HEIGHT + 1) {
41
+ if (rectComponent?.height <= 60) {
42
+ $toolbar.setAttribute(`data-toolbar-${state}-revert`, 'true');
43
+ } else {
44
+ $toolbar.setAttribute(`data-toolbar-${state}-inside`, 'true');
45
+ }
46
+ }
47
+ // fix toolbar overflow right side
48
+ if (rectComponent.left + rect.width > windowWidth) {
49
+ $toolbar.setAttribute(`data-toolbar-${state}-overflow`, 'true');
50
+ }
51
+ }
52
+ // fix Popup overflow right position
53
+ const popupEl = $component?.closest('[aria-label="Dialog body"]');
54
+ if (popupEl) {
55
+ const rectPopupEl = popupEl.getBoundingClientRect();
56
+ const popupElRightPosition = rectPopupEl.left + rectPopupEl.width - 20;
57
+ if (rectComponent.left + rect.width > popupElRightPosition) {
58
+ $toolbar.setAttribute(`data-toolbar-${state}-overflow`, 'true');
59
+ }
60
+ }
61
+ };
62
+ const setHoverComponent = react.useCallback(({ $component, componentUid, focus, isPreventSection, isParent })=>{
63
+ if (!$component && !componentUid) return;
64
+ if (!$component) {
65
+ const $c = document.body.querySelector('#storefront')?.querySelector(`[data-uid="${componentUid}"]`);
66
+ if (!$c) return;
67
+ $component = $c;
68
+ }
69
+ if (!componentUid) {
70
+ const cUid = $component.getAttribute('data-uid');
71
+ if (!cUid) return;
72
+ componentUid = cUid;
73
+ }
74
+ cacheHoverComponents.current.push($component);
75
+ const $toolbar = getChildrenByAttrSelector.getChildrenByAttrSelector($component, 'data-toolbar');
76
+ const $outline = getChildrenByAttrSelector.getChildrenByAttrSelector($component, 'data-outline');
77
+ const $btnAddTop = getChildrenByAttrSelector.getChildrenByAttrSelector($component, 'data-toolbar-add-top');
78
+ const $btnAddBottom = getChildrenByAttrSelector.getChildrenByAttrSelector($component, 'data-toolbar-add-bottom');
79
+ const $themeSectionStatus = getChildrenByAttrSelector.getChildrenByAttrSelector($component, 'data-theme-section-status');
80
+ if (isPreventSection && $themeSectionStatus) {
81
+ $themeSectionStatus.setAttribute('data-theme-section-status-active', 'true');
82
+ }
83
+ if ($toolbar) {
84
+ $toolbar.removeAttribute('style');
85
+ if (!isParent) {
86
+ $toolbar.setAttribute('data-toolbar-hover', 'true');
87
+ }
88
+ if (focus) {
89
+ $toolbar.setAttribute('data-toolbar-hover-focus', 'true');
90
+ }
91
+ changePositionToolbar({
92
+ $toolbar,
93
+ $component,
94
+ state: 'hover'
95
+ });
96
+ }
97
+ if ($outline) {
98
+ $outline.setAttribute('data-outline-hover', 'true');
99
+ if (isParent) {
100
+ $outline.setAttribute('data-outline-parent-hover', 'true');
101
+ }
102
+ if (isPreventSection) {
103
+ cacheHoverThemeSectionComponents.current.push($component);
104
+ $outline.setAttribute('data-outline-overlay-theme-section', 'true');
105
+ }
106
+ if (focus) {
107
+ $outline.setAttribute('data-outline-hover-focus', 'true');
108
+ }
109
+ }
110
+ if ($btnAddTop) {
111
+ if (!isParent) {
112
+ $btnAddTop.setAttribute('data-toolbar-add-hover', 'true');
113
+ }
114
+ }
115
+ if ($btnAddBottom) {
116
+ if (!isParent) {
117
+ $btnAddBottom.setAttribute('data-toolbar-add-hover', 'true');
118
+ }
119
+ }
120
+ }, []);
121
+ const setHoverComponentParents = react.useCallback(({ $component, componentUid })=>{
122
+ if (!$component) {
123
+ const $c = document.body.querySelector('#storefront')?.querySelector(`[data-uid="${componentUid}"]`);
124
+ if (!$c) return;
125
+ $component = $c;
126
+ }
127
+ const $parents = getDOMElementParents.getDOMElementParents($component, '[data-uid][data-component-type="component"]:not([data-component-no-setting])', 1);
128
+ if ($parents.length) {
129
+ for (const $parent of $parents){
130
+ if ($parent) {
131
+ setHoverComponent({
132
+ $component: $parent,
133
+ isParent: true
134
+ });
135
+ }
136
+ }
137
+ changePositionToolbarParents({
138
+ $component,
139
+ $parents
140
+ });
141
+ }
142
+ }, [
143
+ setHoverComponent
144
+ ]);
145
+ const changePositionToolbarParents = ({ $component, $parents })=>{
146
+ if (!$component) return;
147
+ if (!$parents?.length) return;
148
+ const $currentToolbar = getChildrenByAttrSelector.getChildrenByAttrSelector($component, 'data-toolbar-hover-focus');
149
+ if ($currentToolbar) {
150
+ const currentRect = $currentToolbar.getBoundingClientRect();
151
+ const isRevert = $currentToolbar.getAttribute('data-toolbar-hover-revert') ? true : false;
152
+ const isInside = $currentToolbar.getAttribute('data-toolbar-hover-inside') ? true : false;
153
+ let index = 1;
154
+ for (const $parent of $parents){
155
+ if ($parent) {
156
+ const tag = $parent.getAttribute('data-component-tag');
157
+ if (tag === 'Section') continue;
158
+ const $toolbar = getChildrenByAttrSelector.getChildrenByAttrSelector($parent, 'data-toolbar-hover');
159
+ if ($toolbar) {
160
+ // Ignore with toolbar active
161
+ const isActive = $toolbar.getAttribute('data-toolbar-active');
162
+ if (isActive) continue;
163
+ // Start calc
164
+ const parentRect = $toolbar.getBoundingClientRect();
165
+ const checkRevert = isRevert || isInside;
166
+ if (isOverParent.isOverParent({
167
+ current: currentRect,
168
+ parent: parentRect,
169
+ index,
170
+ revert: checkRevert
171
+ })) {
172
+ const parentStyle = getComputedStyle($toolbar);
173
+ // parentStyle.top
174
+ const diffTop = currentRect.top - parentRect.top;
175
+ const diffLeft = currentRect.left - parentRect.left;
176
+ let newTop = parseFloat(parentStyle.top) + diffTop - (_const.TOOLBAR_HOVER_HEIGHT - 1) * index; // -1 border bottom
177
+ if (checkRevert) {
178
+ newTop = parseFloat(parentStyle.top) - diffTop + (_const.TOOLBAR_HOVER_HEIGHT - 1) * index; // -1 border bottom
179
+ }
180
+ const newLeft = parseFloat(parentStyle.left) + diffLeft;
181
+ $toolbar.setAttribute('style', `top: ${newTop}px;left: ${newLeft}px;`);
182
+ index++;
183
+ }
184
+ }
185
+ }
186
+ }
187
+ }
188
+ };
189
+ const removeHoverThemeSectionComponent = react.useCallback(()=>{
190
+ const clearAttrs = [
191
+ 'data-outline-overlay-theme-section',
192
+ 'data-theme-section-status-active'
193
+ ];
194
+ const $hoverThemeSectionComponents = cacheHoverThemeSectionComponents.current;
195
+ if ($hoverThemeSectionComponents.length) {
196
+ for (const $hoverThemeSectionComponent of $hoverThemeSectionComponents){
197
+ const $elms = $hoverThemeSectionComponent.querySelectorAll(clearAttrs.map((attr)=>`[${attr}]`).join(','));
198
+ if ($elms) {
199
+ clearAttrs.forEach((attr)=>{
200
+ $elms.forEach(($el)=>$el.removeAttribute(attr));
201
+ });
202
+ }
203
+ }
204
+ }
205
+ cacheHoverThemeSectionComponents.current = []; // clear
206
+ }, []);
207
+ const removeHoverComponent = react.useCallback(()=>{
208
+ const clearAttrs = [
209
+ 'data-toolbar-hover-focus',
210
+ 'data-toolbar-hover',
211
+ 'data-outline-hover-focus',
212
+ 'data-toolbar-hover-revert',
213
+ 'data-toolbar-hover-inside',
214
+ 'data-outline-hover',
215
+ 'data-toolbar-add-hover',
216
+ 'data-outline-parent-hover',
217
+ 'data-toolbar-hover-overflow'
218
+ ];
219
+ const $hoverComponents = cacheHoverComponents.current;
220
+ if ($hoverComponents.length) {
221
+ for (const $hoverComponent of $hoverComponents){
222
+ const $elms = $hoverComponent.querySelectorAll(clearAttrs.map((attr)=>`[${attr}]`).join(','));
223
+ if ($elms) {
224
+ clearAttrs.forEach((attr)=>{
225
+ $elms.forEach(($el)=>$el.removeAttribute(attr));
226
+ });
227
+ }
228
+ }
229
+ }
230
+ removeHoverThemeSectionComponent();
231
+ cacheHoverComponents.current = []; // clear
232
+ }, [
233
+ removeHoverThemeSectionComponent
234
+ ]);
235
+ const removeActiveComponent = react.useCallback(()=>{
236
+ currentComponentActive.current = null;
237
+ const clearAttrs = [
238
+ 'data-toolbar-active',
239
+ 'data-outline-active',
240
+ 'data-toolbar-add-active',
241
+ 'data-toolbar-active-revert',
242
+ 'data-toolbar-active-inside',
243
+ 'data-spacing-margin-bottom-active',
244
+ 'data-toolbar-force-hover',
245
+ 'data-outline-force-hover',
246
+ 'data-toolbar-active-overflow'
247
+ ];
248
+ const $activeComponents = cacheActiveComponents.current;
249
+ if ($activeComponents.length) {
250
+ for (const $activeComponent of $activeComponents){
251
+ const $elms = $activeComponent.querySelectorAll(clearAttrs.map((attr)=>`[${attr}]`).join(','));
252
+ if ($elms) {
253
+ clearAttrs.forEach((attr)=>{
254
+ $elms.forEach(($el)=>$el.removeAttribute(attr));
255
+ });
256
+ }
257
+ }
258
+ }
259
+ cacheActiveComponents.current = []; // clear
260
+ setFocusTextEditor(false);
261
+ if (stopWatchReRenderComponent.current) stopWatchReRenderComponent.current();
262
+ }, []);
263
+ const setActiveComponentSpacing = react.useCallback(({ $component })=>{
264
+ if (!$component) return;
265
+ const style = getComputedStyle($component);
266
+ const $spacing = getChildrenByAttrSelector.getChildrenByAttrSelector($component, 'data-spacing');
267
+ const $marginBottom = ($spacing?.querySelector('[data-spacing-margin-bottom]')) || null;
268
+ if ($marginBottom) {
269
+ const $bg = $marginBottom.querySelector('[data-spacing-margin-bottom-bg]') || null;
270
+ const $drag = $marginBottom.querySelector('[data-spacing-margin-bottom-drag]') || null;
271
+ if ($bg && $drag) {
272
+ const value = style.marginBottom;
273
+ $bg.style.height = value;
274
+ $drag.style.top = value;
275
+ $marginBottom.setAttribute('data-spacing-margin-bottom-active', 'true');
276
+ }
277
+ }
278
+ }, []);
279
+ const getSelectorComponent = ({ componentUid, productId, articleId, marqueeKey })=>{
280
+ if (articleId) {
281
+ return `${articleId ? `[data-article-id="${articleId}"][data-uid="${componentUid}"], [data-article-id="${articleId}"] [data-uid="${componentUid}"]` : `[data-uid="${componentUid}"]`}`;
282
+ }
283
+ if (marqueeKey) {
284
+ return `[marquee-item-key="${marqueeKey}"] [data-uid="${componentUid}"]`;
285
+ }
286
+ return `${productId ? `[data-product-id="${productId}"][data-uid="${componentUid}"], [data-product-id="${productId}"] [data-uid="${componentUid}"]` : `[data-uid="${componentUid}"]`}`;
287
+ };
288
+ const setActiveComponent = react.useCallback(async ({ componentUid, productId, timeAwait = 600, articleId, forceReActive, marqueeKey })=>{
289
+ if (!componentUid) return;
290
+ const selector = getSelectorComponent({
291
+ componentUid,
292
+ productId,
293
+ articleId,
294
+ marqueeKey
295
+ });
296
+ const $component = await waitForElementToExist.waitForElementToExist(selector, timeAwait);
297
+ if (!$component) return;
298
+ if (!forceReActive && componentUid == currentComponentActive.current?.componentUid && productId == currentComponentActive.current?.productId && articleId == currentComponentActive.current?.articleId && marqueeKey == currentComponentActive.current?.marqueeKey) return;
299
+ if (componentUid !== currentComponentActive.current?.componentUid || productId !== currentComponentActive.current?.productId || articleId !== currentComponentActive.current?.articleId || forceReActive) removeActiveComponent();
300
+ if (!forceReActive && componentUid !== currentComponentActive.current?.componentUid || productId !== currentComponentActive.current?.productId || marqueeKey !== currentComponentActive.current?.marqueeKey) {
301
+ removeActiveComponent();
302
+ }
303
+ cacheActiveComponents.current.push($component);
304
+ const $toolbar = getChildrenByAttrSelector.getChildrenByAttrSelector($component, 'data-toolbar');
305
+ const $outline = getChildrenByAttrSelector.getChildrenByAttrSelector($component, 'data-outline');
306
+ const $btnAddTop = getChildrenByAttrSelector.getChildrenByAttrSelector($component, 'data-toolbar-add-top');
307
+ const $btnAddBottom = getChildrenByAttrSelector.getChildrenByAttrSelector($component, 'data-toolbar-add-bottom');
308
+ if ($toolbar) {
309
+ currentComponentActive.current = {
310
+ componentUid,
311
+ productId,
312
+ articleId,
313
+ marqueeKey
314
+ };
315
+ $toolbar.removeAttribute('style');
316
+ $toolbar.setAttribute('data-toolbar-active', 'true');
317
+ changePositionToolbar({
318
+ $toolbar,
319
+ $component,
320
+ state: 'active'
321
+ });
322
+ }
323
+ if ($outline) {
324
+ $outline.setAttribute('data-outline-active', 'true');
325
+ }
326
+ if ($btnAddTop) {
327
+ $btnAddTop.setAttribute('data-toolbar-add-active', 'true');
328
+ }
329
+ if ($btnAddBottom) {
330
+ $btnAddBottom.setAttribute('data-toolbar-add-active', 'true');
331
+ }
332
+ const { $isChildOfMarquee, $section } = findDOMClosest.findDOMClosest($component, {
333
+ $isChildOfMarquee: '[data-component-tag="Marquee"]',
334
+ $section: '[data-component-tag="Section"]'
335
+ });
336
+ // Active same element in product list
337
+ if ($section && (productId || articleId || $isChildOfMarquee)) {
338
+ const $relatedElements = $section.querySelectorAll(`[data-uid="${componentUid}"]`);
339
+ if ($relatedElements?.length) {
340
+ $relatedElements.forEach(($relatedElement)=>{
341
+ cacheActiveComponents.current.push($relatedElement);
342
+ const $outline = getChildrenByAttrSelector.getChildrenByAttrSelector($relatedElement, 'data-outline');
343
+ if ($outline) {
344
+ $outline.setAttribute('data-outline-active', 'true');
345
+ }
346
+ });
347
+ }
348
+ }
349
+ setActiveComponentSpacing({
350
+ $component
351
+ });
352
+ removeHoverComponent();
353
+ }, [
354
+ removeActiveComponent,
355
+ removeHoverComponent,
356
+ setActiveComponentSpacing
357
+ ]);
358
+ const setFocusTextEditor = async (value)=>{
359
+ if (!value) {
360
+ const $components = document.body.querySelector('#storefront')?.querySelectorAll('[data-outline-editor-inline-focus],[data-toolbar-editor-inline-focus],[data-spacing-hidden]');
361
+ if ($components?.length) {
362
+ $components.forEach(($component)=>{
363
+ if ($component) {
364
+ $component.removeAttribute('data-toolbar-editor-inline-focus');
365
+ $component.removeAttribute('data-outline-editor-inline-focus');
366
+ $component.removeAttribute('data-spacing-hidden');
367
+ }
368
+ });
369
+ }
370
+ } else {
371
+ if (currentComponentActive.current?.componentUid) {
372
+ const selector = getSelectorComponent({
373
+ ...currentComponentActive.current
374
+ });
375
+ const $component = await waitForElementToExist.waitForElementToExist(selector, 500);
376
+ if ($component) {
377
+ const $toolbar = getChildrenByAttrSelector.getChildrenByAttrSelector($component, 'data-toolbar');
378
+ const $outline = getChildrenByAttrSelector.getChildrenByAttrSelector($component, 'data-outline');
379
+ const $spacing = getChildrenByAttrSelector.getChildrenByAttrSelector($component, 'data-spacing');
380
+ if ($toolbar) {
381
+ if (value) {
382
+ $toolbar.setAttribute('data-toolbar-editor-inline-focus', 'true');
383
+ }
384
+ }
385
+ if ($outline) {
386
+ if (value) {
387
+ $outline.setAttribute('data-outline-editor-inline-focus', 'true');
388
+ }
389
+ }
390
+ if ($spacing) {
391
+ if (value) {
392
+ $spacing.setAttribute('data-spacing-hidden', 'true');
393
+ }
394
+ }
395
+ }
396
+ }
397
+ }
398
+ };
399
+ const hoverActiveThemeSection = react.useCallback(($target)=>{
400
+ const $themeSection = $target.closest('[data-theme-section]');
401
+ const $themeSectionUid = $themeSection?.getAttribute('data-uid');
402
+ const isActiveThemeSection = $themeSection && $themeSectionUid === currentComponentActive.current?.componentUid;
403
+ if (!isActiveThemeSection) return;
404
+ cacheHoverThemeSectionComponents.current.push($themeSection);
405
+ const $themeSectionStatus = getChildrenByAttrSelector.getChildrenByAttrSelector($themeSection, 'data-theme-section-status');
406
+ if ($themeSectionStatus) {
407
+ $themeSectionStatus.setAttribute('data-theme-section-status-active', 'true');
408
+ }
409
+ }, []);
410
+ const setShowParents = async ({ value })=>{
411
+ if (!value || !currentComponentActive.current) {
412
+ return;
413
+ }
414
+ const selector = getSelectorComponent({
415
+ ...currentComponentActive.current
416
+ });
417
+ const $component = await waitForElementToExist.waitForElementToExist(selector, 500);
418
+ if ($component) {
419
+ const $parents = $component?.querySelectorAll('[data-toolbar-parent]');
420
+ if ($parents.length) {
421
+ const onHover = ($parent)=>{
422
+ const uid = $parent.getAttribute('data-parent-uid');
423
+ if (!uid) return;
424
+ const $parentComponents = document.body.querySelector('#storefront')?.querySelectorAll(`[data-uid="${uid}"]`);
425
+ if ($parentComponents?.length) {
426
+ $parentComponents.forEach(($parentComponent)=>{
427
+ const $outline = getChildrenByAttrSelector.getChildrenByAttrSelector($parentComponent, 'data-outline');
428
+ if ($outline) {
429
+ $outline.setAttribute('data-outline-force-hover', 'true');
430
+ $outline.setAttribute('data-outline-force-overlay', 'true');
431
+ }
432
+ });
433
+ }
434
+ };
435
+ const outHover = ($parent)=>{
436
+ const uid = $parent.getAttribute('data-parent-uid');
437
+ if (!uid) return;
438
+ const $parentComponents = document.body.querySelector('#storefront')?.querySelectorAll(`[data-uid="${uid}"]`);
439
+ if ($parentComponents?.length) {
440
+ $parentComponents.forEach(($parentComponent)=>{
441
+ const $outline = getChildrenByAttrSelector.getChildrenByAttrSelector($parentComponent, 'data-outline');
442
+ if ($outline) {
443
+ $outline.removeAttribute('data-outline-force-hover');
444
+ $outline.removeAttribute('data-outline-force-overlay');
445
+ }
446
+ });
447
+ }
448
+ };
449
+ const onClick = async ($parent)=>{
450
+ const uid = $parent.getAttribute('data-parent-uid');
451
+ if (!uid) return;
452
+ const isElementInsideProduct = async ()=>{
453
+ const $component = await waitForElementToExist.waitForElementToExist(`[data-uid="${uid}"]`, 500);
454
+ const $product = $component?.closest('[data-product-id]');
455
+ return !!($product?.getAttribute('data-product-id') || '');
456
+ };
457
+ const isElementInsideArticle = async ()=>{
458
+ const $component = await waitForElementToExist.waitForElementToExist(`[data-uid="${uid}"]`, 500);
459
+ const $article = $component?.closest('[data-article-id]');
460
+ return !!($article?.getAttribute('data-article-id') || '');
461
+ };
462
+ let productId = '';
463
+ let articleId = '';
464
+ if (await isElementInsideProduct()) {
465
+ productId = currentComponentActive.current?.productId || '';
466
+ }
467
+ if (await isElementInsideArticle()) {
468
+ articleId = currentComponentActive.current?.articleId || '';
469
+ }
470
+ const event = new CustomEvent('editor:toolbar:force-active-component', {
471
+ bubbles: true,
472
+ detail: {
473
+ componentUid: uid,
474
+ productId,
475
+ articleId,
476
+ elementTag: $parent.getAttribute('data-component-tag') || ''
477
+ }
478
+ });
479
+ outHover($parent);
480
+ window.dispatchEvent(event);
481
+ };
482
+ $parents.forEach(($parent)=>{
483
+ $parent.addEventListener('mouseover', ()=>onHover($parent));
484
+ $parent.addEventListener('mouseout', ()=>outHover($parent));
485
+ $parent.addEventListener('click', ()=>onClick($parent));
486
+ });
487
+ }
488
+ }
489
+ };
490
+ /* Event listener */ const onMouseMove = react.useCallback((e)=>{
491
+ if (isDragging.current) return;
492
+ if (isResizeSpacing.current) return;
493
+ const $target = e.target;
494
+ // check target
495
+ if (!$target || typeof $target.closest !== 'function') {
496
+ removeHoverThemeSectionComponent();
497
+ removeHoverComponent();
498
+ return;
499
+ }
500
+ const { $toolbarHover, $component, $themeSection, $shopifySection } = findDOMClosest.findDOMClosest($target, {
501
+ $toolbarHover: '[data-toolbar-hover]',
502
+ $component: '[data-toolbar-wrap]',
503
+ $themeSection: '[data-theme-section]',
504
+ $shopifySection: '[data-shopify-section]'
505
+ });
506
+ if ($toolbarHover) {
507
+ // Disable feature overlay when hover to toolbar parents
508
+ return;
509
+ }
510
+ // Hover to other component
511
+ const componentUid = $component?.getAttribute('data-uid');
512
+ if (!$component || !componentUid || componentUid == 'ROOT') {
513
+ removeHoverComponent();
514
+ return;
515
+ }
516
+ const $toolbar = getChildrenByAttrSelector.getChildrenByAttrSelector($component, 'data-toolbar');
517
+ if (!componentUid) return;
518
+ if (componentUid == 'ROOT') return;
519
+ if ($toolbar?.getAttribute('data-toolbar-hover-focus')) return;
520
+ if (!$toolbar?.getAttribute('data-toolbar-hover-focus')) removeHoverComponent();
521
+ hoverActiveThemeSection($target);
522
+ const $preventSection = $themeSection || $shopifySection;
523
+ // Disable event when hover active component
524
+ if (componentUid == currentComponentActive.current?.componentUid) {
525
+ if (currentComponentActive.current.productId) {
526
+ const $product = $component.closest(`[data-product-id]`);
527
+ if ($product) {
528
+ const productId = $product.getAttribute('data-product-id');
529
+ if (productId == currentComponentActive.current.productId) {
530
+ removeHoverComponent();
531
+ return;
532
+ }
533
+ }
534
+ }
535
+ if ($preventSection) {
536
+ setHoverComponent({
537
+ $component: $preventSection,
538
+ focus: true,
539
+ isPreventSection: true
540
+ });
541
+ } else {
542
+ return;
543
+ }
544
+ }
545
+ if ($preventSection) {
546
+ setHoverComponent({
547
+ $component: $preventSection,
548
+ focus: true,
549
+ isPreventSection: true
550
+ });
551
+ } else {
552
+ setHoverComponent({
553
+ $component,
554
+ componentUid,
555
+ focus: true
556
+ });
557
+ setHoverComponentParents({
558
+ $component,
559
+ componentUid
560
+ });
561
+ }
562
+ }, [
563
+ hoverActiveThemeSection,
564
+ removeHoverComponent,
565
+ setHoverComponent,
566
+ setHoverComponentParents,
567
+ removeHoverThemeSectionComponent,
568
+ currentComponentActive
569
+ ]);
570
+ const onActiveComponent = react.useCallback((e)=>{
571
+ if (isDragging.current) return;
572
+ const detail = e.detail;
573
+ if (detail?.componentUid) {
574
+ setActiveComponent({
575
+ componentUid: detail.componentUid,
576
+ productId: detail.productId,
577
+ articleId: detail.articleId,
578
+ marqueeKey: detail.marqueeKey
579
+ });
580
+ } else {
581
+ removeActiveComponent();
582
+ }
583
+ }, [
584
+ setActiveComponent,
585
+ removeActiveComponent,
586
+ isDragging
587
+ ]);
588
+ const onFocusOutsidePreview = react.useCallback(()=>{
589
+ removeHoverComponent();
590
+ }, [
591
+ removeHoverComponent
592
+ ]);
593
+ const onIsDragging = react.useCallback((e)=>{
594
+ const detail = e.detail;
595
+ if (detail.value) {
596
+ removeHoverComponent();
597
+ removeActiveComponent();
598
+ }
599
+ isDragging.current = detail.value;
600
+ }, [
601
+ removeHoverComponent,
602
+ removeActiveComponent
603
+ ]);
604
+ const onIsEditingTextEditor = react.useCallback((e)=>{
605
+ const detail = e.detail;
606
+ if (detail.value) {
607
+ setFocusTextEditor(true);
608
+ } else {
609
+ setFocusTextEditor(false);
610
+ }
611
+ }, []);
612
+ const onShowParents = react.useCallback((e)=>{
613
+ if (isDragging.current) return;
614
+ const detail = e.detail;
615
+ setShowParents({
616
+ value: detail?.value || false
617
+ });
618
+ }, []);
619
+ const onResizeSpacing = react.useCallback((e)=>{
620
+ const detail = e.detail;
621
+ if (detail?.value) {
622
+ removeHoverComponent();
623
+ isResizeSpacing.current = true;
624
+ } else {
625
+ isResizeSpacing.current = false;
626
+ }
627
+ }, [
628
+ removeHoverComponent
629
+ ]);
630
+ const setHoverParentComponent = (uid, type)=>{
631
+ if (!uid) return;
632
+ const $parentComponents = document.body.querySelector('#storefront')?.querySelectorAll(`[data-uid="${uid}"]`);
633
+ if ($parentComponents?.length) {
634
+ $parentComponents.forEach(($parentComponent)=>{
635
+ const $outline = getChildrenByAttrSelector.getChildrenByAttrSelector($parentComponent, 'data-outline');
636
+ if ($outline) {
637
+ if (type === 'in') {
638
+ $outline.setAttribute('data-outline-force-hover', 'true');
639
+ $outline.setAttribute('data-outline-force-overlay', 'true');
640
+ } else {
641
+ $outline.removeAttribute('data-outline-force-hover');
642
+ $outline.removeAttribute('data-outline-force-overlay');
643
+ }
644
+ }
645
+ });
646
+ }
647
+ };
648
+ const onHoverComponent = react.useCallback((e)=>{
649
+ if (isDragging.current) return;
650
+ const detail = e.detail;
651
+ if (detail?.componentUid) {
652
+ setHoverParentComponent(detail?.componentUid, detail?.type);
653
+ }
654
+ }, [
655
+ isDragging
656
+ ]);
657
+ const onComponentReRender = (e)=>{
658
+ const detail = e.detail;
659
+ if (currentComponentActive.current?.componentUid && detail?.componentUid == currentComponentActive.current?.componentUid) {
660
+ setActiveComponent({
661
+ ...currentComponentActive.current
662
+ });
663
+ }
664
+ };
665
+ /* Register event */ react.useEffect(()=>{
666
+ document.addEventListener('mousemove', onMouseMove);
667
+ window.addEventListener('editor:active-component', onActiveComponent);
668
+ window.addEventListener('editor:focus-outside-preview', onFocusOutsidePreview);
669
+ window.addEventListener('editor:is-dragging', onIsDragging);
670
+ window.addEventListener('editor:is-editing-text-editor', onIsEditingTextEditor);
671
+ window.addEventListener('editor:toolbar:show-parents', onShowParents);
672
+ window.addEventListener('editor:toolbar:resize-spacing', onResizeSpacing);
673
+ window.addEventListener('editor:hover-component', onHoverComponent);
674
+ window.addEventListener('editor:component:render', onComponentReRender);
675
+ return ()=>{
676
+ document.removeEventListener('mousemove', onMouseMove);
677
+ window.removeEventListener('editor:active-component', onActiveComponent);
678
+ window.removeEventListener('editor:is-dragging', onFocusOutsidePreview);
679
+ window.removeEventListener('editor:is-dragging', onIsDragging);
680
+ window.removeEventListener('editor:is-editing-text-editor', onIsEditingTextEditor);
681
+ window.removeEventListener('editor:toolbar:show-parents', onShowParents);
682
+ window.removeEventListener('editor:toolbar:resize-spacing', onResizeSpacing);
683
+ window.removeEventListener('editor:hover-component', onHoverComponent);
684
+ window.removeEventListener('editor:component:render', onComponentReRender);
685
+ };
686
+ }, [
687
+ onMouseMove,
688
+ onActiveComponent,
689
+ onFocusOutsidePreview,
690
+ onIsDragging,
691
+ onIsEditingTextEditor,
692
+ onShowParents,
693
+ onResizeSpacing,
694
+ onHoverComponent,
695
+ onComponentReRender
696
+ ]);
697
+ return /*#__PURE__*/ jsxRuntime.jsx(jsxRuntime.Fragment, {});
698
+ };
699
+ var Toolbar$1 = /*#__PURE__*/ react.memo(Toolbar);
700
+
701
+ exports.default = Toolbar$1;