@hortonstudio/main 1.9.36 → 1.9.37
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.
- package/dist/main.js +1 -1
- package/dist/main.js.br +0 -0
- package/dist/main.js.gz +0 -0
- package/dist/main.js.map +1 -1
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/hs-normalize-BMC5VqR2.js","assets/hs-utils-yfTiNs6b.js","assets/hs-default-DRpeX5IH.js","assets/hs-animations-DCqAqeLy.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{c as e}from"./assets/hs-utils-yfTiNs6b.js";const t={},s=function(e,s,o){let
|
|
2
|
+
import{c as e}from"./assets/hs-utils-yfTiNs6b.js";const t={},s=function(e,s,o){let n=Promise.resolve();if(s&&s.length>0){let e=function(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:"fulfilled",value:e}),e=>({status:"rejected",reason:e}))))};document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),a=o?.nonce||o?.getAttribute("nonce");n=e(s.map(e=>{if((e=function(e){return"https://cdn.jsdelivr.net/npm/@hortonstudio/main@1.9.36/dist/"+e}(e))in t)return;t[e]=!0;const s=e.endsWith(".css"),o=s?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${e}"]${o}`))return;const n=document.createElement("link");return n.rel=s?"stylesheet":"modulepreload",s||(n.as="script"),n.crossOrigin="",n.href=e,a&&n.setAttribute("nonce",a),document.head.appendChild(n),s?new Promise((t,s)=>{n.addEventListener("load",t),n.addEventListener("error",()=>s(new Error(`Unable to preload CSS for ${e}`)))}):void 0}))}function a(e){const t=new Event("vite:preloadError",{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return n.then(t=>{for(const e of t||[])"rejected"===e.status&&a(e.reason);return e().catch(a)})};document.documentElement.classList.add("hs-main");const o=e._global.apiName;(async()=>{if(window[o]&&!Array.isArray(window[o])&&window[o].loaded)return;const e=Array.isArray(window[o])?window[o]:[],t={normalize:()=>s(()=>import("./assets/hs-normalize-BMC5VqR2.js"),__vite__mapDeps([0,1])),default:()=>s(()=>import("./assets/hs-default-DRpeX5IH.js"),__vite__mapDeps([2,1])),animations:()=>s(()=>import("./assets/hs-animations-DCqAqeLy.js"),__vite__mapDeps([3,1]))};let n=[...document.querySelectorAll(`script[type="module"][src="${import.meta.url}"]`)];0===n.length&&(n=[...document.querySelectorAll('script[type="module"][src*="@hortonstudio/main"]')].filter(e=>{const t=e.src,s=import.meta.url,o=t.match(/@hortonstudio\/main(@[\d.]+)?/)?.[0],n=s.match(/@hortonstudio\/main(@[\d.]+)?/)?.[0];return o&&n&&o.split("@")[0]===n.split("@")[0]}));const a={isSPA:n.some(e=>"true"===e.getAttribute("data-hs-spa"))},r={normalize:{modules:["normalize"],parallel:!1},default:{modules:["default","animations"],parallel:!0}},i=async e=>{const s=window[o];if(s.process.has(e))return s.modules[e]?.loading;s.process.add(e);const n=s.modules[e]||{};let a;s.modules[e]=n,n.loading=new Promise((e,t)=>{n.resolve=e,n.reject=t});try{const{init:o}=await t[e](),r=await o()||{};a=r.destroy;const i=r.result;return n.destroy=()=>{a?.(),s.process.delete(e)},n.restart=()=>{n.destroy?.(),s.load(e)},n.resolve?.(i),delete n.resolve,delete n.reject,i}catch(r){throw a?.(),n.reject?.(r),s.process.delete(e),r}},l=async e=>{const t=r[e];if(t.parallel){const e=t.modules.map(e=>i(e));await Promise.allSettled(e)}else for(const s of t.modules)await i(s)},d=async()=>{await Promise.allSettled([t.normalize(),t.default(),t.animations()]),await l("normalize"),await l("default"),(()=>{const e=new CustomEvent("hsmain:dom-ready");window.dispatchEvent(e)})();const{initScrollAnimations:e}=await s(async()=>{const{initScrollAnimations:e}=await import("./assets/hs-utils-yfTiNs6b.js").then(e=>e.t);return{initScrollAnimations:e}},[]);e().catch(e=>{console.error("[hsmain] Scroll animations failed to initialize:",e)})},c=[];window[o]={scripts:n,settings:a,modules:{},process:new Set,load:i,loaded:!1,push(...e){for(const[t,s]of e)"function"==typeof s?this.modules[t]?.loading?.then(s):this.load(t)},destroy(){for(const e in this.modules)this.modules[e]?.destroy?.()},async reinitialize(){this.loaded=!1,this.destroy(),this.modules={},this.process=new Set,await this.scanForEmbedModules(),await d(),this.loaded=!0},async scanForEmbedModules(){document.querySelectorAll(".w-embed").forEach(e=>{e.querySelectorAll("script[data-hs-module]").forEach(e=>{const s=e.getAttribute("data-hs-module-type"),o=e.getAttribute("data-hs-module");if(s&&o){const e=`data-hs-${s}-${o}`;t[e]&&this.load(e)}})})},afterReady(e){"function"==typeof e&&(this.loaded?e():c.push(e))},status(e){return e?{loaded:!!this.modules[e],loading:this.process.has(e)}:{loaded:Object.keys(this.modules),loading:[...this.process],phases:r}}};(async()=>{window[o].push(...e),await d(),window[o].loaded=!0,c.forEach(e=>{try{e()}catch{}}),c.length=0})().catch(()=>{})})();export{s as _};
|
|
3
3
|
//# sourceMappingURL=main.js.map
|
package/dist/main.js.br
CHANGED
|
Binary file
|
package/dist/main.js.gz
CHANGED
|
Binary file
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":["API_NAME","config","_global","apiName","async","window","Array","isArray","loaded","document","documentElement","classList","add","classes","initialized","queuedModules","moduleMap","normalize","__vitePreload","import","__VITE_PRELOAD__","default","animations","scripts","querySelectorAll","url","length","filter","script","scriptSrc","src","currentSrc","scriptPackage","match","currentPackage","split","settings","isSPA","some","getAttribute","PHASES","modules","parallel","loadModule","moduleName","instance","process","has","loading","moduleData","destroy","Promise","resolve","reject","init","resultData","initResult","result","delete","restart","load","error","executePhase","phaseName","phase","initPromises","map","name","allSettled","initializeInPhases","event","CustomEvent","dispatchEvent","triggerDomReady","initScrollAnimations","then","n","t","catch","console","readyCallbacks","Set","push","items","callback","this","reinitialize","scanForEmbedModules","forEach","embed","moduleType","moduleKey","afterReady","status","Object","keys","phases","finalize","initializeHsMain"],"ignoreList":[],"sources":["../index.ts"],"sourcesContent":["/**\n * Main Entry Point\n *\n * 2-phase initialization system: Normalize → Default + Animations.\n * Handles module loading, lifecycle management, and SPA coordination.\n */\nimport config from '@config';\n\nconst API_NAME = config._global.apiName;\n\nconst initializeHsMain = async (): Promise<void> => {\n if (window[API_NAME] && !Array.isArray(window[API_NAME]) && window[API_NAME].loaded) {\n return;\n }\n\n // Add initialized class to HTML element immediately\n document.documentElement.classList.add(config._global.classes.initialized);\n\n const queuedModules = Array.isArray(window[API_NAME]) ? window[API_NAME] : [];\n\n const moduleMap = {\n normalize: () => import('./src/modules/normalize/normalize.ts'),\n default: () => import('./src/modules/default/default.ts'),\n animations: () => import('./src/animations/animations.ts'),\n };\n\n let scripts = [...document.querySelectorAll(`script[type=\"module\"][src=\"${import.meta.url}\"]`)];\n\n if (scripts.length === 0) {\n scripts = [\n ...document.querySelectorAll('script[type=\"module\"][src*=\"@hortonstudio/main\"]'),\n ].filter((script) => {\n const scriptSrc = (script as HTMLScriptElement).src;\n const currentSrc = import.meta.url;\n const scriptPackage = scriptSrc.match(/@hortonstudio\\/main(@[\\d.]+)?/)?.[0];\n const currentPackage = currentSrc.match(/@hortonstudio\\/main(@[\\d.]+)?/)?.[0];\n return (\n scriptPackage &&\n currentPackage &&\n scriptPackage.split('@')[0] === currentPackage.split('@')[0]\n );\n });\n }\n\n // Read settings from script tag attributes\n const settings = {\n isSPA: scripts.some((script) => script.getAttribute('data-hs-spa') === 'true'),\n };\n\n // Define 2-phase initialization system\n const PHASES = {\n normalize: {\n modules: ['normalize'],\n parallel: false, // Sequential execution critical for DOM fixes\n },\n default: {\n modules: ['default', 'animations'],\n parallel: true, // Run default and animations in parallel\n },\n };\n\n const loadModule = async (moduleName: string): Promise<unknown> => {\n const instance = window[API_NAME];\n if (instance.process.has(moduleName)) {\n return instance.modules[moduleName]?.loading;\n }\n\n instance.process.add(moduleName);\n\n const moduleData = instance.modules[moduleName] || {};\n instance.modules[moduleName] = moduleData;\n\n moduleData.loading = new Promise((resolve, reject) => {\n moduleData.resolve = resolve;\n moduleData.reject = reject;\n });\n\n let destroy: (() => void) | undefined;\n try {\n const { init } = await moduleMap[moduleName]();\n const result = await init();\n const resultData = result || {};\n destroy = resultData.destroy as (() => void) | undefined;\n const initResult = resultData.result;\n\n moduleData.destroy = () => {\n destroy?.();\n instance.process.delete(moduleName);\n };\n moduleData.restart = () => {\n moduleData.destroy?.();\n instance.load(moduleName);\n };\n\n moduleData.resolve?.(initResult);\n delete moduleData.resolve;\n delete moduleData.reject;\n\n return initResult;\n } catch (error) {\n destroy?.();\n moduleData.reject?.(error);\n instance.process.delete(moduleName);\n throw error;\n }\n };\n\n // Helper to execute a phase (modules already downloaded)\n const executePhase = async (phaseName: string): Promise<void> => {\n const phase = PHASES[phaseName];\n\n // Execute based on parallel setting\n if (phase.parallel) {\n const initPromises = phase.modules.map((name: string) => loadModule(name));\n await Promise.allSettled(initPromises);\n } else {\n // Sequential execution\n for (const name of phase.modules) {\n await loadModule(name);\n }\n }\n };\n\n // Trigger DOM ready event\n const triggerDomReady = () => {\n const event = new CustomEvent('hsmain:dom-ready');\n window.dispatchEvent(event);\n };\n\n // Initialize all modules in 2 phases\n const initializeInPhases = async (): Promise<void> => {\n // Step 1: Download ALL modules in parallel (before any init)\n await Promise.allSettled([\n moduleMap['normalize'](),\n moduleMap['default'](),\n moduleMap['animations'](),\n ]);\n\n // Step 2: Init in phases\n // Phase 1: Normalize (critical DOM fixes)\n await executePhase('normalize');\n\n // Phase 2: Default + Animations (parallel)\n await executePhase('default');\n\n // Trigger DOM ready immediately after phase 2\n triggerDomReady();\n\n // Phase 3: Initialize scroll animations (independent, non-blocking)\n // Waits for IX3 indefinitely, triggers scroll when ready\n const { initScrollAnimations } = await import('./src/utils/gsap.ts');\n initScrollAnimations().catch((error) => {\n console.error('[hsmain] Scroll animations failed to initialize:', error);\n });\n };\n\n const readyCallbacks: (() => void)[] = [];\n\n window[API_NAME] = {\n scripts,\n settings,\n modules: {},\n process: new Set(),\n load: loadModule,\n loaded: false,\n push(...items: [string, ((result: unknown) => void)?][]) {\n for (const [moduleName, callback] of items) {\n if (typeof callback === 'function') {\n this.modules[moduleName]?.loading?.then(callback);\n } else {\n this.load(moduleName);\n }\n }\n },\n destroy() {\n for (const moduleName in this.modules) {\n this.modules[moduleName]?.destroy?.();\n }\n },\n async reinitialize() {\n // Complete teardown\n this.loaded = false;\n this.destroy();\n this.modules = {};\n this.process = new Set();\n\n // Re-scan for modules including in w-embeds\n await this.scanForEmbedModules();\n\n // Use same phased initialization flow\n await initializeInPhases();\n\n this.loaded = true;\n },\n async scanForEmbedModules() {\n const embeds = document.querySelectorAll('.w-embed');\n embeds.forEach((embed) => {\n const scripts = embed.querySelectorAll('script[data-hs-module]');\n scripts.forEach((script) => {\n // Extract module info from data attributes\n const moduleType = script.getAttribute('data-hs-module-type');\n const moduleName = script.getAttribute('data-hs-module');\n\n if (moduleType && moduleName) {\n const moduleKey = `data-hs-${moduleType}-${moduleName}`;\n if (moduleMap[moduleKey]) {\n this.load(moduleKey);\n }\n }\n });\n });\n },\n afterReady(callback: () => void) {\n if (typeof callback === 'function') {\n if (this.loaded) {\n callback();\n } else {\n readyCallbacks.push(callback);\n }\n }\n },\n status(moduleName?: string) {\n if (moduleName) {\n return {\n loaded: !!this.modules[moduleName],\n loading: this.process.has(moduleName),\n };\n }\n return {\n loaded: Object.keys(this.modules),\n loading: [...this.process],\n phases: PHASES,\n };\n },\n };\n\n const finalize = async (): Promise<void> => {\n window[API_NAME].push(...queuedModules);\n\n // Run phased initialization\n await initializeInPhases();\n\n window[API_NAME].loaded = true;\n readyCallbacks.forEach((callback) => {\n try {\n callback();\n } catch {\n // Silent error handling\n }\n });\n readyCallbacks.length = 0; // Clear array after execution\n };\n\n finalize().catch(() => {});\n};\n\ninitializeHsMain();\n"],"file":"main.js"}
|
|
1
|
+
{"version":3,"mappings":"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","names":["document","documentElement","classList","add","API_NAME","config","_global","apiName","async","window","Array","isArray","loaded","queuedModules","moduleMap","normalize","__vitePreload","import","__VITE_PRELOAD__","default","animations","scripts","querySelectorAll","url","length","filter","script","scriptSrc","src","currentSrc","scriptPackage","match","currentPackage","split","settings","isSPA","some","getAttribute","PHASES","modules","parallel","loadModule","moduleName","instance","process","has","loading","moduleData","destroy","Promise","resolve","reject","init","resultData","initResult","result","delete","restart","load","error","executePhase","phaseName","phase","initPromises","map","name","allSettled","initializeInPhases","event","CustomEvent","dispatchEvent","triggerDomReady","initScrollAnimations","then","n","t","catch","console","readyCallbacks","Set","push","items","callback","this","reinitialize","scanForEmbedModules","forEach","embed","moduleType","moduleKey","afterReady","status","Object","keys","phases","finalize","initializeHsMain"],"ignoreList":[],"sources":["../index.ts"],"sourcesContent":["/**\n * Main Entry Point\n *\n * 2-phase initialization system: Normalize → Default + Animations.\n * Handles module loading, lifecycle management, and SPA coordination.\n */\n\n// Add initialized class to HTML element immediately (hardcoded for max speed)\ndocument.documentElement.classList.add('hs-main');\n\nimport config from '@config';\n\nconst API_NAME = config._global.apiName;\n\nconst initializeHsMain = async (): Promise<void> => {\n if (window[API_NAME] && !Array.isArray(window[API_NAME]) && window[API_NAME].loaded) {\n return;\n }\n\n const queuedModules = Array.isArray(window[API_NAME]) ? window[API_NAME] : [];\n\n const moduleMap = {\n normalize: () => import('./src/modules/normalize/normalize.ts'),\n default: () => import('./src/modules/default/default.ts'),\n animations: () => import('./src/animations/animations.ts'),\n };\n\n let scripts = [...document.querySelectorAll(`script[type=\"module\"][src=\"${import.meta.url}\"]`)];\n\n if (scripts.length === 0) {\n scripts = [\n ...document.querySelectorAll('script[type=\"module\"][src*=\"@hortonstudio/main\"]'),\n ].filter((script) => {\n const scriptSrc = (script as HTMLScriptElement).src;\n const currentSrc = import.meta.url;\n const scriptPackage = scriptSrc.match(/@hortonstudio\\/main(@[\\d.]+)?/)?.[0];\n const currentPackage = currentSrc.match(/@hortonstudio\\/main(@[\\d.]+)?/)?.[0];\n return (\n scriptPackage &&\n currentPackage &&\n scriptPackage.split('@')[0] === currentPackage.split('@')[0]\n );\n });\n }\n\n // Read settings from script tag attributes\n const settings = {\n isSPA: scripts.some((script) => script.getAttribute('data-hs-spa') === 'true'),\n };\n\n // Define 2-phase initialization system\n const PHASES = {\n normalize: {\n modules: ['normalize'],\n parallel: false, // Sequential execution critical for DOM fixes\n },\n default: {\n modules: ['default', 'animations'],\n parallel: true, // Run default and animations in parallel\n },\n };\n\n const loadModule = async (moduleName: string): Promise<unknown> => {\n const instance = window[API_NAME];\n if (instance.process.has(moduleName)) {\n return instance.modules[moduleName]?.loading;\n }\n\n instance.process.add(moduleName);\n\n const moduleData = instance.modules[moduleName] || {};\n instance.modules[moduleName] = moduleData;\n\n moduleData.loading = new Promise((resolve, reject) => {\n moduleData.resolve = resolve;\n moduleData.reject = reject;\n });\n\n let destroy: (() => void) | undefined;\n try {\n const { init } = await moduleMap[moduleName]();\n const result = await init();\n const resultData = result || {};\n destroy = resultData.destroy as (() => void) | undefined;\n const initResult = resultData.result;\n\n moduleData.destroy = () => {\n destroy?.();\n instance.process.delete(moduleName);\n };\n moduleData.restart = () => {\n moduleData.destroy?.();\n instance.load(moduleName);\n };\n\n moduleData.resolve?.(initResult);\n delete moduleData.resolve;\n delete moduleData.reject;\n\n return initResult;\n } catch (error) {\n destroy?.();\n moduleData.reject?.(error);\n instance.process.delete(moduleName);\n throw error;\n }\n };\n\n // Helper to execute a phase (modules already downloaded)\n const executePhase = async (phaseName: string): Promise<void> => {\n const phase = PHASES[phaseName];\n\n // Execute based on parallel setting\n if (phase.parallel) {\n const initPromises = phase.modules.map((name: string) => loadModule(name));\n await Promise.allSettled(initPromises);\n } else {\n // Sequential execution\n for (const name of phase.modules) {\n await loadModule(name);\n }\n }\n };\n\n // Trigger DOM ready event\n const triggerDomReady = () => {\n const event = new CustomEvent('hsmain:dom-ready');\n window.dispatchEvent(event);\n };\n\n // Initialize all modules in 2 phases\n const initializeInPhases = async (): Promise<void> => {\n // Step 1: Download ALL modules in parallel (before any init)\n await Promise.allSettled([\n moduleMap['normalize'](),\n moduleMap['default'](),\n moduleMap['animations'](),\n ]);\n\n // Step 2: Init in phases\n // Phase 1: Normalize (critical DOM fixes)\n await executePhase('normalize');\n\n // Phase 2: Default + Animations (parallel)\n await executePhase('default');\n\n // Trigger DOM ready immediately after phase 2\n triggerDomReady();\n\n // Phase 3: Initialize scroll animations (independent, non-blocking)\n // Waits for IX3 indefinitely, triggers scroll when ready\n const { initScrollAnimations } = await import('./src/utils/gsap.ts');\n initScrollAnimations().catch((error) => {\n console.error('[hsmain] Scroll animations failed to initialize:', error);\n });\n };\n\n const readyCallbacks: (() => void)[] = [];\n\n window[API_NAME] = {\n scripts,\n settings,\n modules: {},\n process: new Set(),\n load: loadModule,\n loaded: false,\n push(...items: [string, ((result: unknown) => void)?][]) {\n for (const [moduleName, callback] of items) {\n if (typeof callback === 'function') {\n this.modules[moduleName]?.loading?.then(callback);\n } else {\n this.load(moduleName);\n }\n }\n },\n destroy() {\n for (const moduleName in this.modules) {\n this.modules[moduleName]?.destroy?.();\n }\n },\n async reinitialize() {\n // Complete teardown\n this.loaded = false;\n this.destroy();\n this.modules = {};\n this.process = new Set();\n\n // Re-scan for modules including in w-embeds\n await this.scanForEmbedModules();\n\n // Use same phased initialization flow\n await initializeInPhases();\n\n this.loaded = true;\n },\n async scanForEmbedModules() {\n const embeds = document.querySelectorAll('.w-embed');\n embeds.forEach((embed) => {\n const scripts = embed.querySelectorAll('script[data-hs-module]');\n scripts.forEach((script) => {\n // Extract module info from data attributes\n const moduleType = script.getAttribute('data-hs-module-type');\n const moduleName = script.getAttribute('data-hs-module');\n\n if (moduleType && moduleName) {\n const moduleKey = `data-hs-${moduleType}-${moduleName}`;\n if (moduleMap[moduleKey]) {\n this.load(moduleKey);\n }\n }\n });\n });\n },\n afterReady(callback: () => void) {\n if (typeof callback === 'function') {\n if (this.loaded) {\n callback();\n } else {\n readyCallbacks.push(callback);\n }\n }\n },\n status(moduleName?: string) {\n if (moduleName) {\n return {\n loaded: !!this.modules[moduleName],\n loading: this.process.has(moduleName),\n };\n }\n return {\n loaded: Object.keys(this.modules),\n loading: [...this.process],\n phases: PHASES,\n };\n },\n };\n\n const finalize = async (): Promise<void> => {\n window[API_NAME].push(...queuedModules);\n\n // Run phased initialization\n await initializeInPhases();\n\n window[API_NAME].loaded = true;\n readyCallbacks.forEach((callback) => {\n try {\n callback();\n } catch {\n // Silent error handling\n }\n });\n readyCallbacks.length = 0; // Clear array after execution\n };\n\n finalize().catch(() => {});\n};\n\ninitializeHsMain();\n"],"file":"main.js"}
|