lynkow 3.0.1 → 3.0.2

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/index.d.mts CHANGED
@@ -1179,13 +1179,15 @@ interface CookieConfig {
1179
1179
  /** Respect Do Not Track browser setting */
1180
1180
  respectDnt?: boolean;
1181
1181
  /** Banner position */
1182
- position: 'bottom' | 'top' | 'bottom-left' | 'bottom-right';
1182
+ position: 'bottom' | 'top' | 'bottom-left' | 'bottom-right' | 'center';
1183
1183
  /** Banner layout style */
1184
- layout: 'banner' | 'floating';
1184
+ layout: 'banner' | 'floating' | 'modal';
1185
1185
  /** Theme */
1186
1186
  theme: 'light' | 'dark' | 'auto';
1187
1187
  /** Primary color for buttons (hex) */
1188
1188
  primaryColor?: string;
1189
+ /** Border radius in pixels for container and buttons */
1190
+ borderRadius?: number;
1189
1191
  /** Cookie categories */
1190
1192
  categories: CookieCategory[];
1191
1193
  /** Banner texts */
package/dist/index.d.ts CHANGED
@@ -1179,13 +1179,15 @@ interface CookieConfig {
1179
1179
  /** Respect Do Not Track browser setting */
1180
1180
  respectDnt?: boolean;
1181
1181
  /** Banner position */
1182
- position: 'bottom' | 'top' | 'bottom-left' | 'bottom-right';
1182
+ position: 'bottom' | 'top' | 'bottom-left' | 'bottom-right' | 'center';
1183
1183
  /** Banner layout style */
1184
- layout: 'banner' | 'floating';
1184
+ layout: 'banner' | 'floating' | 'modal';
1185
1185
  /** Theme */
1186
1186
  theme: 'light' | 'dark' | 'auto';
1187
1187
  /** Primary color for buttons (hex) */
1188
1188
  primaryColor?: string;
1189
+ /** Border radius in pixels for container and buttons */
1190
+ borderRadius?: number;
1189
1191
  /** Cookie categories */
1190
1192
  categories: CookieCategory[];
1191
1193
  /** Banner texts */
package/dist/index.js CHANGED
@@ -1,39 +1,50 @@
1
- 'use strict';var y=class o extends Error{name="LynkowError";code;status;details;cause;constructor(e,t,n,r,s){super(e),this.code=t,this.status=n,this.details=r,this.cause=s,Error.captureStackTrace&&Error.captureStackTrace(this,o);}static async fromResponse(e){let t=e.status,n=`HTTP ${t}`,r;try{let i=await e.json();i.errors&&Array.isArray(i.errors)?(r=i.errors,n=i.errors[0]?.message||n):i.error?n=i.error:i.message&&(n=i.message);}catch{n=e.statusText||n;}let s=o.statusToCode(t);return new o(n,s,t,r)}static fromNetworkError(e){return e.name==="AbortError"?new o("Request timed out","TIMEOUT",void 0,void 0,e):e.name==="TypeError"?new o("Network error - please check your connection","NETWORK_ERROR",void 0,void 0,e):new o(e.message||"Unknown error","UNKNOWN",void 0,void 0,e)}static statusToCode(e){switch(e){case 400:return "VALIDATION_ERROR";case 401:return "UNAUTHORIZED";case 403:return "FORBIDDEN";case 404:return "NOT_FOUND";case 429:return "RATE_LIMITED";default:return "UNKNOWN"}}toJSON(){return {name:this.name,message:this.message,code:this.code,status:this.status,details:this.details}}};function ce(o){return o instanceof y}function le(o){switch(o){case 400:return "BAD_REQUEST";case 401:return "UNAUTHORIZED";case 403:return "FORBIDDEN";case 404:return "NOT_FOUND";case 422:return "VALIDATION_ERROR";case 429:return "TOO_MANY_REQUESTS";case 503:return "SERVICE_UNAVAILABLE";default:return "INTERNAL_ERROR"}}async function H(o,e){let t;try{t=await fetch(o,e);}catch(p){throw new y("Network error: Unable to reach the server","NETWORK_ERROR",0,[{message:p instanceof Error?p.message:"Unknown error"}])}if(t.ok)return t.json();let n={};try{n=await t.json();}catch{}let r=le(t.status),s=n.error||n.message||`HTTP error: ${t.status}`,i=n.errors||[{message:s}];throw new y(s,r,t.status,i)}function V(o){let e=new URLSearchParams;for(let[t,n]of Object.entries(o))n!=null&&n!==""&&e.append(t,String(n));return e.toString()}var l={SHORT:300*1e3,MEDIUM:600*1e3},d=class{config;cache;constructor(e){this.config=e,this.cache=e.cache;}buildEndpointUrl(e,t){let n=`${this.config.baseUrl}/public/${this.config.siteId}${e}`;if(t&&Object.keys(t).length>0){let r=V(t);return `${n}?${r}`}return n}async get(e,t,n){let r=n?.locale||this.config.locale,s=r?{...t,locale:r}:t,i=this.buildEndpointUrl(e,s),p=this.mergeFetchOptions(n?.fetchOptions);return H(i,{method:"GET",...p})}async getWithCache(e,t,n,r,s=l.SHORT){return this.cache?this.cache.getOrSet(e,()=>this.get(t,n,r),s):this.get(t,n,r)}invalidateCache(e){this.cache?.invalidate(e);}async post(e,t,n){let r=this.buildEndpointUrl(e),s=this.mergeFetchOptions(n?.fetchOptions);return H(r,{method:"POST",...s,headers:{"Content-Type":"application/json",...s.headers},body:JSON.stringify(t)})}async getText(e,t){let n=this.buildEndpointUrl(e),r=this.mergeFetchOptions(t?.fetchOptions),s=await fetch(n,{method:"GET",...r});if(!s.ok)throw new Error(`HTTP error: ${s.status}`);return s.text()}mergeFetchOptions(e){return {...this.config.fetchOptions,...e,headers:{...this.config.fetchOptions.headers,...e?.headers}}}};var K="contents_",R=class extends d{async list(e,t){let n={};e?.page&&(n.page=e.page),e?.perPage&&(n.perPage=e.perPage),e?.category&&(n.category=e.category),e?.tag&&(n.tag=e.tag),e?.search&&(n.search=e.search),e?.sort&&(n.sort=e.sort),e?.order&&(n.order=e.order),e?.locale&&(n.locale=e.locale);let r=`${K}list_${JSON.stringify(e||{})}`;return this.getWithCache(r,"/contents",n,t,l.SHORT)}async getBySlug(e,t){let n=t?.locale||this.config.locale,r=`${K}slug_${e}_${n||"default"}`;return this.getWithCache(r,`/contents/slug/${encodeURIComponent(e)}`,void 0,t,l.SHORT)}clearCache(){this.invalidateCache(K);}};var _="categories_",E=class extends d{async list(e){let t=e?.locale||this.config.locale,n=`${_}list_${t||"default"}`;return this.getWithCache(n,"/categories",void 0,e,l.SHORT)}async tree(e){let t=e?.locale||this.config.locale,n=`${_}tree_${t||"default"}`;return this.getWithCache(n,"/categories/tree",void 0,e,l.SHORT)}async getBySlug(e,t){let n={};t?.page&&(n.page=t.page),t?.perPage&&(n.limit=t.perPage);let r=`${_}slug_${e}_${JSON.stringify(t||{})}`;return this.getWithCache(r,`/categories/${encodeURIComponent(e)}`,n,t,l.SHORT)}clearCache(){this.invalidateCache(_);}};var J="tags_",b=class extends d{async list(e){let t=e?.locale||this.config.locale,n=`${J}list_${t||"default"}`;return this.getWithCache(n,"/tags",void 0,e,l.SHORT)}clearCache(){this.invalidateCache(J);}};var k="pages_",x=class extends d{async list(e){let t=e?.locale||this.config.locale,n={};e?.tag&&(n.tag=e.tag);let r=`${k}list_${t||"default"}_${e?.tag||"all"}`;return this.getWithCache(r,"/pages",n,e,l.SHORT)}async getBySlug(e,t){let n=t?.locale||this.config.locale,r=`${k}slug_${e}_${n||"default"}`;return (await this.getWithCache(r,`/pages/${encodeURIComponent(e)}`,void 0,t,l.SHORT)).data}async getByPath(e,t){let n=t?.locale||this.config.locale,r=`${k}path_${e}_${n||"default"}`;return (await this.getWithCache(r,"/page-by-path",{path:e},t,l.SHORT)).data}async getJsonLd(e,t){let n=t?.locale||this.config.locale,r=`${k}jsonld_${e}_${n||"default"}`;return (await this.getWithCache(r,`/pages/${encodeURIComponent(e)}/json-ld`,void 0,t,l.SHORT)).data}clearCache(){this.invalidateCache(k);}};var q="globals_",L=class extends d{async siteConfig(e){let t=e?.locale||this.config.locale,n=`${q}siteconfig_${t||"default"}`;return this.getWithCache(n,"/site-config",void 0,e,l.MEDIUM)}async getBySlug(e,t){let n=t?.locale||this.config.locale,r=`${q}${e}_${n||"default"}`;return this.getWithCache(r,`/global/${encodeURIComponent(e)}`,void 0,t,l.MEDIUM)}async global(e,t){return this.getBySlug(e,t)}clearCache(){this.invalidateCache(q);}};function F(o){return {_hp:"",_ts:o}}var Q="forms_",T=class extends d{sessionStartTime;constructor(e){super(e),this.sessionStartTime=Date.now();}async getBySlug(e){let t=`${Q}${e}`;return (await this.getWithCache(t,`/forms/${encodeURIComponent(e)}`,void 0,void 0,l.MEDIUM)).data}async submit(e,t,n){let r=F(this.sessionStartTime),s={...t,...r};return n?.recaptchaToken&&(s._recaptcha_token=n.recaptchaToken),this.post(`/forms/${encodeURIComponent(e)}/submit`,s,n)}clearCache(){this.invalidateCache(Q);}};var S="reviews_",O=class extends d{sessionStartTime;constructor(e){super(e),this.sessionStartTime=Date.now();}async list(e,t){let n={};e?.page&&(n.page=e.page),e?.perPage&&(n.perPage=e.perPage),e?.minRating&&(n.minRating=e.minRating),e?.maxRating&&(n.maxRating=e.maxRating),e?.sort&&(n.sort=e.sort),e?.order&&(n.order=e.order);let r=`${S}list_${JSON.stringify(e||{})}`;return this.getWithCache(r,"/reviews",n,t,l.SHORT)}async getBySlug(e){let t=`${S}slug_${e}`;return (await this.getWithCache(t,`/reviews/${encodeURIComponent(e)}`,void 0,void 0,l.SHORT)).data}async settings(){let e=`${S}settings`;return this.getWithCache(e,"/reviews/settings",void 0,void 0,l.MEDIUM)}async submit(e,t){let n=F(this.sessionStartTime),r={...e,...n};t?.recaptchaToken&&(r._recaptcha_token=t.recaptchaToken);let s=await this.post("/reviews",r,t);return this.invalidateCache(S),s}clearCache(){this.invalidateCache(S);}};var Y="site_",P=class extends d{async getConfig(){let e=`${Y}config`;return (await this.getWithCache(e,"/site",void 0,void 0,l.MEDIUM)).data}clearCache(){this.invalidateCache(Y);}};var M="legal_",I=class extends d{async list(e){let t=e?.locale||this.config.locale,n=`${M}list_${t||"default"}`;return (await this.getWithCache(n,"/pages",{tag:"legal"},e,l.SHORT)).data}async getBySlug(e,t){let n=t?.locale||this.config.locale,r=`${M}slug_${e}_${n||"default"}`;return (await this.getWithCache(r,`/pages/${encodeURIComponent(e)}`,void 0,t,l.SHORT)).data}clearCache(){this.invalidateCache(M);}};var Z="cookies_",B=class extends d{async getConfig(){let e=`${Z}config`;return (await this.getWithCache(e,"/cookie-consent/config",void 0,void 0,l.MEDIUM)).data}async logConsent(e,t){return this.post("/cookie-consent/log",{preferences:e},t)}clearCache(){this.invalidateCache(Z);}};var A=class extends d{async sitemap(e){return this.getText("/sitemap.xml",e)}async robots(e){return this.getText("/robots.txt",e)}};var W="paths_",$=class extends d{async list(e){let t=e?.locale||this.config.locale,n=`${W}list_${t||"all"}`;return this.getWithCache(n,"/paths",void 0,e,l.SHORT)}async resolve(e,t){let n=t?.locale||this.config.locale,r=`${W}resolve_${e}_${n||"default"}`;return this.getWithCache(r,"/resolve",{path:e},t,l.SHORT)}async matchRedirect(e,t){try{return (await this.get("/redirects/match",{path:e},t)).data}catch(n){if(n instanceof y&&n.status===404)return null;throw n}}clearCache(){this.invalidateCache(W);}};var c=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",pe=!c;function de(o,e){return c?o():e}async function ge(o,e){return c?o():e}var z="lynkow-tracker",D=class{config;enabled=true;initialized=false;loading=false;loadPromise=null;constructor(e){this.config=e;}getTrackerUrl(){return `${this.config.baseUrl}/analytics/tracker.js`}loadTracker(){return !c||window.LynkowAnalytics?Promise.resolve():this.loadPromise?this.loadPromise:(this.loading=true,this.loadPromise=new Promise((e,t)=>{if(document.getElementById(z)){let r=setInterval(()=>{window.LynkowAnalytics&&(clearInterval(r),this.loading=false,e());},50);setTimeout(()=>{clearInterval(r),this.loading=false,t(new Error("Tracker script load timeout"));},1e4);return}let n=document.createElement("script");n.id=z,n.src=this.getTrackerUrl(),n.async=true,n.setAttribute("data-site-id",this.config.siteId),this.config.baseUrl&&n.setAttribute("data-api-url",this.config.baseUrl),n.onload=()=>{this.loading=false,setTimeout(()=>{window.LynkowAnalytics?e():t(new Error("Tracker script loaded but LynkowAnalytics not found"));},0);},n.onerror=()=>{this.loading=false,t(new Error("Failed to load tracker script"));},document.head.appendChild(n);}),this.loadPromise)}async init(){if(!(!c||this.initialized))try{await this.loadTracker(),window.LynkowAnalytics&&!this.initialized&&(this.initialized=!0);}catch(e){console.error("[Lynkow] Failed to initialize analytics:",e);}}async trackEvent(e){!c||!this.enabled||(await this.init(),window.LynkowAnalytics&&window.LynkowAnalytics.track(e));}async trackFunnelStep(e){!c||!this.enabled||(await this.init(),window.LynkowAnalytics&&window.LynkowAnalytics.trackFunnel(e.funnelId,e.stepNumber,e.stepName,e.funnelName));}async trackPageview(e){!c||!this.enabled||(await this.init(),window.LynkowAnalytics&&window.LynkowAnalytics.track({type:"pageview",path:e?.path||window.location.pathname,title:e?.title||document.title,referrer:e?.referrer||document.referrer}));}enable(){this.enabled=true;}disable(){this.enabled=false;}isEnabled(){return this.enabled}isInitialized(){return this.initialized&&!!window.LynkowAnalytics}getTracker(){if(c)return window.LynkowAnalytics}destroy(){if(!c)return;document.getElementById(z)?.remove(),this.initialized=false,this.loadPromise=null;}};var j="_lkw_consent",G={necessary:true,analytics:false,marketing:false,preferences:false},N=class{config;events;bannerElement=null;preferencesElement=null;configCache=null;constructor(e,t){this.config=e,this.events=t;}async getConfig(){if(this.configCache)return this.configCache;let e=`${this.config.baseUrl}/public/${this.config.siteId}/cookie-consent/config`,t=await fetch(e,{method:"GET",headers:{"Content-Type":"application/json"},...this.config.fetchOptions});if(!t.ok)throw new Error(`Failed to fetch consent config: ${t.status}`);let n=await t.json();return this.configCache=n.data,this.configCache}async logConsent(e){let t=`${this.config.baseUrl}/public/${this.config.siteId}/cookie-consent/log`;await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({preferences:e}),...this.config.fetchOptions}).catch(()=>{});}getStoredConsent(){if(!c)return null;try{let e=localStorage.getItem(j);if(e){let t=JSON.parse(e);return t.choices?t.choices:t}}catch{}return null}saveConsent(e){if(c){try{localStorage.setItem(j,JSON.stringify({choices:e}));}catch{}this.events.emit("consent-changed",e),document.dispatchEvent(new CustomEvent("lynkow:consent:update",{detail:e}));}}show(){c&&(this.bannerElement||this.getConfig().then(e=>{if(!e.enabled)return;let t=document.createElement("div");t.innerHTML=this.createBannerHTML(e),this.bannerElement=t.firstElementChild,document.body.appendChild(this.bannerElement),this.attachBannerEvents();}));}hide(){c&&(this.bannerElement?.remove(),this.bannerElement=null);}showPreferences(){c&&(this.preferencesElement||this.getConfig().then(e=>{let t=this.getCategories(),n=document.createElement("div");n.innerHTML=this.createPreferencesHTML(e,t),this.preferencesElement=n.firstElementChild,document.body.appendChild(this.preferencesElement),this.attachPreferencesEvents(e);}));}getCategories(){return c?this.getStoredConsent()||{...G}:{...G}}hasConsented(){return c?this.getStoredConsent()!==null:false}acceptAll(){if(!c)return;let e={necessary:true,analytics:true,marketing:true,preferences:true};this.saveConsent(e),this.logConsent(e),this.hide();}rejectAll(){if(!c)return;let e={necessary:true,analytics:false,marketing:false,preferences:false};this.saveConsent(e),this.logConsent(e),this.hide();}setCategories(e){if(!c)return;let n={...this.getCategories(),...e,necessary:true};this.saveConsent(n),this.logConsent(n);}reset(){if(c){try{localStorage.removeItem(j);}catch{}this.events.emit("consent-changed",{...G}),this.show();}}createBannerHTML(e){let t=e.position||"bottom",n=e.theme||"light",r=e.layout||"banner",s=e.primaryColor||"#0066cc",m=r==="floating"?{bottom:"bottom: 20px; left: 50%; transform: translateX(-50%); max-width: 500px; width: calc(100% - 40px); border-radius: 12px;",top:"top: 20px; left: 50%; transform: translateX(-50%); max-width: 500px; width: calc(100% - 40px); border-radius: 12px;","bottom-left":"bottom: 20px; left: 20px; max-width: 400px; border-radius: 12px;","bottom-right":"bottom: 20px; right: 20px; max-width: 400px; border-radius: 12px;"}:{bottom:"bottom: 0; left: 0; right: 0;",top:"top: 0; left: 0; right: 0;","bottom-left":"bottom: 0; left: 0; right: 0;","bottom-right":"bottom: 0; left: 0; right: 0;"},h=m[t]||m.bottom,g=n==="dark",a=g?"#1a1a1a":"#ffffff",f=g?"#ffffff":"#1a1a1a",u=e.texts||{title:"Nous utilisons des cookies",description:"Ce site utilise des cookies pour ameliorer votre experience.",acceptAll:"Accepter tout",rejectAll:"Refuser",customize:"Personnaliser"};return `
1
+ 'use strict';var C=class o extends Error{name="LynkowError";code;status;details;cause;constructor(e,t,n,r,i){super(e),this.code=t,this.status=n,this.details=r,this.cause=i,Error.captureStackTrace&&Error.captureStackTrace(this,o);}static async fromResponse(e){let t=e.status,n=`HTTP ${t}`,r;try{let s=await e.json();s.errors&&Array.isArray(s.errors)?(r=s.errors,n=s.errors[0]?.message||n):s.error?n=s.error:s.message&&(n=s.message);}catch{n=e.statusText||n;}let i=o.statusToCode(t);return new o(n,i,t,r)}static fromNetworkError(e){return e.name==="AbortError"?new o("Request timed out","TIMEOUT",void 0,void 0,e):e.name==="TypeError"?new o("Network error - please check your connection","NETWORK_ERROR",void 0,void 0,e):new o(e.message||"Unknown error","UNKNOWN",void 0,void 0,e)}static statusToCode(e){switch(e){case 400:return "VALIDATION_ERROR";case 401:return "UNAUTHORIZED";case 403:return "FORBIDDEN";case 404:return "NOT_FOUND";case 429:return "RATE_LIMITED";default:return "UNKNOWN"}}toJSON(){return {name:this.name,message:this.message,code:this.code,status:this.status,details:this.details}}};function le(o){return o instanceof C}function pe(o){switch(o){case 400:return "BAD_REQUEST";case 401:return "UNAUTHORIZED";case 403:return "FORBIDDEN";case 404:return "NOT_FOUND";case 422:return "VALIDATION_ERROR";case 429:return "TOO_MANY_REQUESTS";case 503:return "SERVICE_UNAVAILABLE";default:return "INTERNAL_ERROR"}}async function K(o,e){let t;try{t=await fetch(o,e);}catch(p){throw new C("Network error: Unable to reach the server","NETWORK_ERROR",0,[{message:p instanceof Error?p.message:"Unknown error"}])}if(t.ok)return t.json();let n={};try{n=await t.json();}catch{}let r=pe(t.status),i=n.error||n.message||`HTTP error: ${t.status}`,s=n.errors||[{message:i}];throw new C(i,r,t.status,s)}function J(o){let e=new URLSearchParams;for(let[t,n]of Object.entries(o))n!=null&&n!==""&&e.append(t,String(n));return e.toString()}var l={SHORT:300*1e3,MEDIUM:600*1e3},u=class{config;cache;constructor(e){this.config=e,this.cache=e.cache;}buildEndpointUrl(e,t){let n=`${this.config.baseUrl}/public/${this.config.siteId}${e}`;if(t&&Object.keys(t).length>0){let r=J(t);return `${n}?${r}`}return n}async get(e,t,n){let r=n?.locale||this.config.locale,i=r?{...t,locale:r}:t,s=this.buildEndpointUrl(e,i),p=this.mergeFetchOptions(n?.fetchOptions);return K(s,{method:"GET",...p})}async getWithCache(e,t,n,r,i=l.SHORT){return this.cache?this.cache.getOrSet(e,()=>this.get(t,n,r),i):this.get(t,n,r)}invalidateCache(e){this.cache?.invalidate(e);}async post(e,t,n){let r=this.buildEndpointUrl(e),i=this.mergeFetchOptions(n?.fetchOptions);return K(r,{method:"POST",...i,headers:{"Content-Type":"application/json",...i.headers},body:JSON.stringify(t)})}async getText(e,t){let n=this.buildEndpointUrl(e),r=this.mergeFetchOptions(t?.fetchOptions),i=await fetch(n,{method:"GET",...r});if(!i.ok)throw new Error(`HTTP error: ${i.status}`);return i.text()}mergeFetchOptions(e){return {...this.config.fetchOptions,...e,headers:{...this.config.fetchOptions.headers,...e?.headers}}}};var q="contents_",b=class extends u{async list(e,t){let n={};e?.page&&(n.page=e.page),e?.perPage&&(n.perPage=e.perPage),e?.category&&(n.category=e.category),e?.tag&&(n.tag=e.tag),e?.search&&(n.search=e.search),e?.sort&&(n.sort=e.sort),e?.order&&(n.order=e.order),e?.locale&&(n.locale=e.locale);let r=`${q}list_${JSON.stringify(e||{})}`;return this.getWithCache(r,"/contents",n,t,l.SHORT)}async getBySlug(e,t){let n=t?.locale||this.config.locale,r=`${q}slug_${e}_${n||"default"}`;return this.getWithCache(r,`/contents/slug/${encodeURIComponent(e)}`,void 0,t,l.SHORT)}clearCache(){this.invalidateCache(q);}};var F="categories_",x=class extends u{async list(e){let t=e?.locale||this.config.locale,n=`${F}list_${t||"default"}`;return this.getWithCache(n,"/categories",void 0,e,l.SHORT)}async tree(e){let t=e?.locale||this.config.locale,n=`${F}tree_${t||"default"}`;return this.getWithCache(n,"/categories/tree",void 0,e,l.SHORT)}async getBySlug(e,t){let n={};t?.page&&(n.page=t.page),t?.perPage&&(n.limit=t.perPage);let r=`${F}slug_${e}_${JSON.stringify(t||{})}`;return this.getWithCache(r,`/categories/${encodeURIComponent(e)}`,n,t,l.SHORT)}clearCache(){this.invalidateCache(F);}};var Q="tags_",E=class extends u{async list(e){let t=e?.locale||this.config.locale,n=`${Q}list_${t||"default"}`;return this.getWithCache(n,"/tags",void 0,e,l.SHORT)}clearCache(){this.invalidateCache(Q);}};var k="pages_",L=class extends u{async list(e){let t=e?.locale||this.config.locale,n={};e?.tag&&(n.tag=e.tag);let r=`${k}list_${t||"default"}_${e?.tag||"all"}`;return this.getWithCache(r,"/pages",n,e,l.SHORT)}async getBySlug(e,t){let n=t?.locale||this.config.locale,r=`${k}slug_${e}_${n||"default"}`;return (await this.getWithCache(r,`/pages/${encodeURIComponent(e)}`,void 0,t,l.SHORT)).data}async getByPath(e,t){let n=t?.locale||this.config.locale,r=`${k}path_${e}_${n||"default"}`;return (await this.getWithCache(r,"/page-by-path",{path:e},t,l.SHORT)).data}async getJsonLd(e,t){let n=t?.locale||this.config.locale,r=`${k}jsonld_${e}_${n||"default"}`;return (await this.getWithCache(r,`/pages/${encodeURIComponent(e)}/json-ld`,void 0,t,l.SHORT)).data}clearCache(){this.invalidateCache(k);}};var M="globals_",T=class extends u{async siteConfig(e){let t=e?.locale||this.config.locale,n=`${M}siteconfig_${t||"default"}`;return this.getWithCache(n,"/site-config",void 0,e,l.MEDIUM)}async getBySlug(e,t){let n=t?.locale||this.config.locale,r=`${M}${e}_${n||"default"}`;return this.getWithCache(r,`/global/${encodeURIComponent(e)}`,void 0,t,l.MEDIUM)}async global(e,t){return this.getBySlug(e,t)}clearCache(){this.invalidateCache(M);}};function D(o){return {_hp:"",_ts:o}}var Y="forms_",S=class extends u{sessionStartTime;constructor(e){super(e),this.sessionStartTime=Date.now();}async getBySlug(e){let t=`${Y}${e}`;return (await this.getWithCache(t,`/forms/${encodeURIComponent(e)}`,void 0,void 0,l.MEDIUM)).data}async submit(e,t,n){let r=D(this.sessionStartTime),i={...t,...r};return n?.recaptchaToken&&(i._recaptcha_token=n.recaptchaToken),this.post(`/forms/${encodeURIComponent(e)}/submit`,i,n)}clearCache(){this.invalidateCache(Y);}};var O="reviews_",P=class extends u{sessionStartTime;constructor(e){super(e),this.sessionStartTime=Date.now();}async list(e,t){let n={};e?.page&&(n.page=e.page),e?.perPage&&(n.perPage=e.perPage),e?.minRating&&(n.minRating=e.minRating),e?.maxRating&&(n.maxRating=e.maxRating),e?.sort&&(n.sort=e.sort),e?.order&&(n.order=e.order);let r=`${O}list_${JSON.stringify(e||{})}`;return this.getWithCache(r,"/reviews",n,t,l.SHORT)}async getBySlug(e){let t=`${O}slug_${e}`;return (await this.getWithCache(t,`/reviews/${encodeURIComponent(e)}`,void 0,void 0,l.SHORT)).data}async settings(){let e=`${O}settings`;return this.getWithCache(e,"/reviews/settings",void 0,void 0,l.MEDIUM)}async submit(e,t){let n=D(this.sessionStartTime),r={...e,...n};t?.recaptchaToken&&(r._recaptcha_token=t.recaptchaToken);let i=await this.post("/reviews",r,t);return this.invalidateCache(O),i}clearCache(){this.invalidateCache(O);}};var Z="site_",I=class extends u{async getConfig(){let e=`${Z}config`;return (await this.getWithCache(e,"/site",void 0,void 0,l.MEDIUM)).data}clearCache(){this.invalidateCache(Z);}};var W="legal_",$=class extends u{async list(e){let t=e?.locale||this.config.locale,n=`${W}list_${t||"default"}`;return (await this.getWithCache(n,"/pages",{tag:"legal"},e,l.SHORT)).data}async getBySlug(e,t){let n=t?.locale||this.config.locale,r=`${W}slug_${e}_${n||"default"}`;return (await this.getWithCache(r,`/pages/${encodeURIComponent(e)}`,void 0,t,l.SHORT)).data}clearCache(){this.invalidateCache(W);}};var ee="cookies_",B=class extends u{async getConfig(){let e=`${ee}config`;return (await this.getWithCache(e,"/cookie-consent/config",void 0,void 0,l.MEDIUM)).data}async logConsent(e,t){return this.post("/cookie-consent/log",{preferences:e},t)}clearCache(){this.invalidateCache(ee);}};var A=class extends u{async sitemap(e){return this.getText("/sitemap.xml",e)}async robots(e){return this.getText("/robots.txt",e)}};var z="paths_",_=class extends u{async list(e){let t=e?.locale||this.config.locale,n=`${z}list_${t||"all"}`;return this.getWithCache(n,"/paths",void 0,e,l.SHORT)}async resolve(e,t){let n=t?.locale||this.config.locale,r=`${z}resolve_${e}_${n||"default"}`;return this.getWithCache(r,"/resolve",{path:e},t,l.SHORT)}async matchRedirect(e,t){try{return (await this.get("/redirects/match",{path:e},t)).data}catch(n){if(n instanceof C&&n.status===404)return null;throw n}}clearCache(){this.invalidateCache(z);}};var c=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",de=!c;function ge(o,e){return c?o():e}async function ue(o,e){return c?o():e}var j="lynkow-tracker",N=class{config;enabled=true;initialized=false;loading=false;loadPromise=null;constructor(e){this.config=e;}getTrackerUrl(){return `${this.config.baseUrl}/analytics/tracker.js`}loadTracker(){return !c||window.LynkowAnalytics?Promise.resolve():this.loadPromise?this.loadPromise:(this.loading=true,this.loadPromise=new Promise((e,t)=>{if(document.getElementById(j)){let r=setInterval(()=>{window.LynkowAnalytics&&(clearInterval(r),this.loading=false,e());},50);setTimeout(()=>{clearInterval(r),this.loading=false,t(new Error("Tracker script load timeout"));},1e4);return}let n=document.createElement("script");n.id=j,n.src=this.getTrackerUrl(),n.async=true,n.setAttribute("data-site-id",this.config.siteId),this.config.baseUrl&&n.setAttribute("data-api-url",this.config.baseUrl),n.onload=()=>{this.loading=false,setTimeout(()=>{window.LynkowAnalytics?e():t(new Error("Tracker script loaded but LynkowAnalytics not found"));},0);},n.onerror=()=>{this.loading=false,t(new Error("Failed to load tracker script"));},document.head.appendChild(n);}),this.loadPromise)}async init(){if(!(!c||this.initialized))try{await this.loadTracker(),window.LynkowAnalytics&&!this.initialized&&(this.initialized=!0);}catch(e){console.error("[Lynkow] Failed to initialize analytics:",e);}}async trackEvent(e){!c||!this.enabled||(await this.init(),window.LynkowAnalytics&&window.LynkowAnalytics.track(e));}async trackFunnelStep(e){!c||!this.enabled||(await this.init(),window.LynkowAnalytics&&window.LynkowAnalytics.trackFunnel(e.funnelId,e.stepNumber,e.stepName,e.funnelName));}async trackPageview(e){!c||!this.enabled||(await this.init(),window.LynkowAnalytics&&window.LynkowAnalytics.track({type:"pageview",path:e?.path||window.location.pathname,title:e?.title||document.title,referrer:e?.referrer||document.referrer}));}enable(){this.enabled=true;}disable(){this.enabled=false;}isEnabled(){return this.enabled}isInitialized(){return this.initialized&&!!window.LynkowAnalytics}getTracker(){if(c)return window.LynkowAnalytics}destroy(){if(!c)return;document.getElementById(j)?.remove(),this.initialized=false,this.loadPromise=null;}};var G="_lkw_consent",X={necessary:true,analytics:false,marketing:false,preferences:false},U=class{config;events;bannerElement=null;preferencesElement=null;configCache=null;constructor(e,t){this.config=e,this.events=t;}async getConfig(){if(this.configCache)return this.configCache;let e=`${this.config.baseUrl}/public/${this.config.siteId}/cookie-consent/config`,t=await fetch(e,{method:"GET",headers:{"Content-Type":"application/json"},...this.config.fetchOptions});if(!t.ok)throw new Error(`Failed to fetch consent config: ${t.status}`);let n=await t.json();return this.configCache=n.data,this.configCache}async logConsent(e){let t=`${this.config.baseUrl}/public/${this.config.siteId}/cookie-consent/log`;await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({preferences:e}),...this.config.fetchOptions}).catch(()=>{});}getStoredConsent(){if(!c)return null;try{let e=localStorage.getItem(G);if(e){let t=JSON.parse(e);return t.choices?t.choices:t}}catch{}return null}saveConsent(e){if(c){try{localStorage.setItem(G,JSON.stringify({choices:e}));}catch{}this.events.emit("consent-changed",e),document.dispatchEvent(new CustomEvent("lynkow:consent:update",{detail:e}));}}show(){c&&(this.bannerElement||this.getConfig().then(e=>{if(!e.enabled)return;let t=document.createElement("div");t.innerHTML=this.createBannerHTML(e),this.bannerElement=t.firstElementChild,document.body.appendChild(this.bannerElement),this.attachBannerEvents();}));}hide(){c&&(this.bannerElement?.remove(),this.bannerElement=null);}showPreferences(){c&&(this.preferencesElement||this.getConfig().then(e=>{let t=this.getCategories(),n=document.createElement("div");n.innerHTML=this.createPreferencesHTML(e,t),this.preferencesElement=n.firstElementChild,document.body.appendChild(this.preferencesElement),this.attachPreferencesEvents(e);}));}getCategories(){return c?this.getStoredConsent()||{...X}:{...X}}hasConsented(){return c?this.getStoredConsent()!==null:false}acceptAll(){if(!c)return;let e={necessary:true,analytics:true,marketing:true,preferences:true};this.saveConsent(e),this.logConsent(e),this.hide();}rejectAll(){if(!c)return;let e={necessary:true,analytics:false,marketing:false,preferences:false};this.saveConsent(e),this.logConsent(e),this.hide();}setCategories(e){if(!c)return;let n={...this.getCategories(),...e,necessary:true};this.saveConsent(n),this.logConsent(n);}reset(){if(c){try{localStorage.removeItem(G);}catch{}this.events.emit("consent-changed",{...X}),this.show();}}createBannerHTML(e){let t=e.position||"bottom",n=e.theme||"light",r=e.layout||"banner",i=e.primaryColor||"#0066cc",s=e.borderRadius??8,p={bottom:"bottom: 0; left: 0; right: 0;",top:"top: 0; left: 0; right: 0;","bottom-left":"bottom: 0; left: 0; right: 0;","bottom-right":"bottom: 0; left: 0; right: 0;",center:"top: 50%; left: 50%; transform: translate(-50%, -50%); max-width: 500px; width: calc(100% - 40px);"},m={bottom:`bottom: 20px; left: 50%; transform: translateX(-50%); max-width: 500px; width: calc(100% - 40px); border-radius: ${s}px;`,top:`top: 20px; left: 50%; transform: translateX(-50%); max-width: 500px; width: calc(100% - 40px); border-radius: ${s}px;`,"bottom-left":`bottom: 20px; left: 20px; max-width: 400px; border-radius: ${s}px;`,"bottom-right":`bottom: 20px; right: 20px; max-width: 400px; border-radius: ${s}px;`,center:`top: 50%; left: 50%; transform: translate(-50%, -50%); max-width: 500px; width: calc(100% - 40px); border-radius: ${s}px;`},h={center:`top: 50%; left: 50%; transform: translate(-50%, -50%); max-width: 500px; width: calc(100% - 40px); border-radius: ${s}px;`,bottom:`top: 50%; left: 50%; transform: translate(-50%, -50%); max-width: 500px; width: calc(100% - 40px); border-radius: ${s}px;`,top:`top: 50%; left: 50%; transform: translate(-50%, -50%); max-width: 500px; width: calc(100% - 40px); border-radius: ${s}px;`,"bottom-left":`top: 50%; left: 50%; transform: translate(-50%, -50%); max-width: 500px; width: calc(100% - 40px); border-radius: ${s}px;`,"bottom-right":`top: 50%; left: 50%; transform: translate(-50%, -50%); max-width: 500px; width: calc(100% - 40px); border-radius: ${s}px;`},g;r==="floating"?g=m:r==="modal"?g=h:g=p;let a=g[t]||g.bottom||"",d=n==="dark",f=d?"#1a1a1a":"#ffffff",y=d?"#ffffff":"#1a1a1a",R=e.texts||{title:"Nous utilisons des cookies",description:"Ce site utilise des cookies pour ameliorer votre experience.",acceptAll:"Accepter tout",rejectAll:"Refuser",customize:"Personnaliser"};return `
2
+ ${r==="modal"?`
3
+ <div id="lynkow-consent-backdrop" style="
4
+ position: fixed;
5
+ top: 0;
6
+ left: 0;
7
+ right: 0;
8
+ bottom: 0;
9
+ background: rgba(0,0,0,0.5);
10
+ z-index: 99998;
11
+ "></div>
12
+ `:""}
2
13
  <div id="lynkow-consent-banner" style="
3
14
  position: fixed;
4
- ${h}
15
+ ${a}
5
16
  z-index: 99999;
6
17
  padding: 20px;
7
- background: ${a};
8
- color: ${f};
18
+ background: ${f};
19
+ color: ${y};
9
20
  box-shadow: 0 4px 20px rgba(0,0,0,0.15);
10
21
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
11
22
  font-size: 14px;
12
23
  ">
13
24
  <div style="max-width: 1200px; margin: 0 auto;">
14
- <h3 style="margin: 0 0 10px 0; font-size: 16px;">${u.title}</h3>
25
+ <h3 style="margin: 0 0 10px 0; font-size: 16px;">${R.title}</h3>
15
26
  <p style="margin: 0 0 15px 0; line-height: 1.5;">
16
- ${u.description}
27
+ ${R.description}
17
28
  </p>
18
29
  <div style="display: flex; gap: 10px; flex-wrap: wrap;">
19
30
  <button id="lynkow-consent-accept" style="
20
31
  padding: 10px 20px;
21
- background: ${s};
32
+ background: ${i};
22
33
  color: white;
23
34
  border: none;
24
- border-radius: 4px;
35
+ border-radius: ${s}px;
25
36
  cursor: pointer;
26
37
  font-size: 14px;
27
- ">${u.acceptAll}</button>
38
+ ">${R.acceptAll}</button>
28
39
  <button id="lynkow-consent-reject" style="
29
40
  padding: 10px 20px;
30
41
  background: transparent;
31
42
  color: inherit;
32
43
  border: 1px solid currentColor;
33
- border-radius: 4px;
44
+ border-radius: ${s}px;
34
45
  cursor: pointer;
35
46
  font-size: 14px;
36
- ">${u.rejectAll}</button>
47
+ ">${R.rejectAll}</button>
37
48
  <button id="lynkow-consent-preferences" style="
38
49
  padding: 10px 20px;
39
50
  background: transparent;
@@ -42,25 +53,25 @@
42
53
  cursor: pointer;
43
54
  font-size: 14px;
44
55
  text-decoration: underline;
45
- ">${u.customize}</button>
56
+ ">${R.customize}</button>
46
57
  </div>
47
58
  </div>
48
59
  </div>
49
- `}createPreferencesHTML(e,t){let n=e.theme||"light",r=e.primaryColor||"#0066cc",s=n==="dark",i=s?"#1a1a1a":"#ffffff",p=s?"#ffffff":"#1a1a1a",m=e.texts||{title:"Preferences de cookies",save:"Enregistrer"},g=(e.categories||[]).map(a=>`
50
- <label style="display: flex; align-items: flex-start; gap: 10px; margin: 15px 0; cursor: ${a.required?"not-allowed":"pointer"};">
60
+ `}createPreferencesHTML(e,t){let n=e.theme||"light",r=e.primaryColor||"#0066cc",i=e.borderRadius??8,s=n==="dark",p=s?"#1a1a1a":"#ffffff",m=s?"#ffffff":"#1a1a1a",h=e.texts||{title:"Preferences de cookies",save:"Enregistrer"},a=(e.categories||[]).map(d=>`
61
+ <label style="display: flex; align-items: flex-start; gap: 10px; margin: 15px 0; cursor: ${d.required?"not-allowed":"pointer"};">
51
62
  <input
52
63
  type="checkbox"
53
- name="${a.id}"
54
- ${t[a.id]?"checked":""}
55
- ${a.required?"disabled checked":""}
64
+ name="${d.id}"
65
+ ${t[d.id]?"checked":""}
66
+ ${d.required?"disabled checked":""}
56
67
  style="width: 18px; height: 18px; margin-top: 2px; accent-color: ${r};"
57
68
  />
58
69
  <div style="flex: 1;">
59
- <strong style="opacity: ${a.required?"0.6":"1"};">
60
- ${a.name}${a.required?" (requis)":""}
70
+ <strong style="opacity: ${d.required?"0.6":"1"};">
71
+ ${d.name}${d.required?" (requis)":""}
61
72
  </strong>
62
73
  <p style="margin: 5px 0 0 0; font-size: 13px; opacity: 0.8;">
63
- ${a.description}
74
+ ${d.description}
64
75
  </p>
65
76
  </div>
66
77
  </label>
@@ -79,19 +90,19 @@
79
90
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
80
91
  ">
81
92
  <div style="
82
- background: ${i};
83
- color: ${p};
93
+ background: ${p};
94
+ color: ${m};
84
95
  padding: 30px;
85
- border-radius: 12px;
96
+ border-radius: ${i}px;
86
97
  max-width: 500px;
87
98
  width: 90%;
88
99
  max-height: 80vh;
89
100
  overflow-y: auto;
90
101
  ">
91
- <h2 style="margin: 0 0 20px 0; font-size: 20px;">${m.title||"Preferences de cookies"}</h2>
102
+ <h2 style="margin: 0 0 20px 0; font-size: 20px;">${h.title||"Preferences de cookies"}</h2>
92
103
 
93
104
  <form id="lynkow-consent-form">
94
- ${g}
105
+ ${a}
95
106
 
96
107
  <div style="display: flex; gap: 10px; margin-top: 25px; padding-top: 20px; border-top: 1px solid rgba(128,128,128,0.3);">
97
108
  <button type="submit" style="
@@ -99,16 +110,16 @@
99
110
  background: ${r};
100
111
  color: white;
101
112
  border: none;
102
- border-radius: 4px;
113
+ border-radius: ${i}px;
103
114
  cursor: pointer;
104
115
  font-size: 14px;
105
- ">${m.save||"Enregistrer"}</button>
116
+ ">${h.save||"Enregistrer"}</button>
106
117
  <button type="button" id="lynkow-consent-close" style="
107
118
  padding: 10px 20px;
108
119
  background: transparent;
109
120
  color: inherit;
110
121
  border: 1px solid currentColor;
111
- border-radius: 4px;
122
+ border-radius: ${i}px;
112
123
  cursor: pointer;
113
124
  font-size: 14px;
114
125
  ">Annuler</button>
@@ -116,8 +127,8 @@
116
127
  </form>
117
128
  </div>
118
129
  </div>
119
- `}attachBannerEvents(){let e=document.getElementById("lynkow-consent-accept"),t=document.getElementById("lynkow-consent-reject"),n=document.getElementById("lynkow-consent-preferences");e?.addEventListener("click",()=>{this.acceptAll();}),t?.addEventListener("click",()=>{this.rejectAll();}),n?.addEventListener("click",()=>{this.showPreferences();});}attachPreferencesEvents(e){let t=document.getElementById("lynkow-consent-form"),n=document.getElementById("lynkow-consent-close"),r=document.getElementById("lynkow-consent-preferences-modal");t?.addEventListener("submit",s=>{s.preventDefault();let i=new FormData(t),p={necessary:true,analytics:i.has("analytics"),marketing:i.has("marketing"),preferences:i.has("preferences")};this.setCategories(p),this.hide(),this.preferencesElement?.remove(),this.preferencesElement=null;}),n?.addEventListener("click",()=>{this.preferencesElement?.remove(),this.preferencesElement=null;}),r?.addEventListener("click",s=>{s.target===r&&(this.preferencesElement?.remove(),this.preferencesElement=null);});}destroy(){this.hide(),this.preferencesElement?.remove(),this.preferencesElement=null;}};var v="lynkow-badge",X="lynkow-badge-styles",ue=`
120
- #${v} {
130
+ `}attachBannerEvents(){let e=document.getElementById("lynkow-consent-accept"),t=document.getElementById("lynkow-consent-reject"),n=document.getElementById("lynkow-consent-preferences");e?.addEventListener("click",()=>{this.acceptAll();}),t?.addEventListener("click",()=>{this.rejectAll();}),n?.addEventListener("click",()=>{this.showPreferences();});}attachPreferencesEvents(e){let t=document.getElementById("lynkow-consent-form"),n=document.getElementById("lynkow-consent-close"),r=document.getElementById("lynkow-consent-preferences-modal");t?.addEventListener("submit",i=>{i.preventDefault();let s=new FormData(t),p={necessary:true,analytics:s.has("analytics"),marketing:s.has("marketing"),preferences:s.has("preferences")};this.setCategories(p),this.hide(),this.preferencesElement?.remove(),this.preferencesElement=null;}),n?.addEventListener("click",()=>{this.preferencesElement?.remove(),this.preferencesElement=null;}),r?.addEventListener("click",i=>{i.target===r&&(this.preferencesElement?.remove(),this.preferencesElement=null);});}destroy(){this.hide(),this.preferencesElement?.remove(),this.preferencesElement=null;}};var w="lynkow-badge",V="lynkow-badge-styles",fe=`
131
+ #${w} {
121
132
  position: fixed;
122
133
  bottom: 16px;
123
134
  right: 16px;
@@ -134,13 +145,13 @@
134
145
  line-height: 1;
135
146
  }
136
147
 
137
- #${v}:hover {
148
+ #${w}:hover {
138
149
  opacity: 1;
139
150
  color: #fff;
140
151
  }
141
152
 
142
153
  @media (max-width: 480px) {
143
- #${v} {
154
+ #${w} {
144
155
  bottom: 10px;
145
156
  right: 10px;
146
157
  font-size: 10px;
@@ -149,15 +160,15 @@
149
160
  }
150
161
 
151
162
  @media (prefers-color-scheme: light) {
152
- #${v} {
163
+ #${w} {
153
164
  background: #f5f5f5;
154
165
  color: #666;
155
166
  }
156
167
 
157
- #${v}:hover {
168
+ #${w}:hover {
158
169
  color: #1a1a1a;
159
170
  }
160
171
  }
161
- `,U=class{badgeElement=null;injectStyles(){if(document.getElementById(X))return;let e=document.createElement("style");e.id=X,e.textContent=ue,document.head.appendChild(e);}inject(){if(!c||document.getElementById(v))return;this.injectStyles();let e=document.createElement("a");e.id=v,e.href="https://lynkow.com?ref=badge",e.target="_blank",e.rel="noopener noreferrer",e.textContent="Powered by Lynkow",e.setAttribute("aria-label","Powered by Lynkow - Visit lynkow.com"),document.body.appendChild(e),this.badgeElement=e;}remove(){c&&(this.badgeElement?.remove(),this.badgeElement=null,document.getElementById(X)?.remove());}isVisible(){return c?document.getElementById(v)!==null:false}destroy(){this.remove();}};var fe=300*1e3,me="lynkow_cache_",w=new Map;function ee(o={}){let e=o.defaultTtl??fe,t=o.prefix??me;function n(g){return `${t}${g}`}function r(g){return Date.now()>g.expiresAt}function s(g){let a=n(g);if(c)try{let u=localStorage.getItem(a);if(!u)return null;let C=JSON.parse(u);return r(C)?(localStorage.removeItem(a),null):C.value}catch{return null}let f=w.get(a);return f?r(f)?(w.delete(a),null):f.value:null}function i(g,a,f=e){let u=n(g),C={value:a,expiresAt:Date.now()+f};if(c){try{localStorage.setItem(u,JSON.stringify(C));}catch{}return}w.set(u,C);}function p(g){let a=n(g);if(c){try{localStorage.removeItem(a);}catch{}return}w.delete(a);}function m(g){if(c){try{let a=[];for(let f=0;f<localStorage.length;f++){let u=localStorage.key(f);u&&u.startsWith(t)&&(!g||u.includes(g))&&a.push(u);}a.forEach(f=>localStorage.removeItem(f));}catch{}return}if(g)for(let a of w.keys())a.startsWith(t)&&a.includes(g)&&w.delete(a);else for(let a of w.keys())a.startsWith(t)&&w.delete(a);}async function h(g,a,f=e){let u=s(g);if(u!==null)return u;let C=await a();return i(g,C,f),C}return {get:s,set:i,remove:p,invalidate:m,getOrSet:h}}function te(o){let e=o.prefix||"[Lynkow]";return {debug(...t){o.debug&&console.debug(e,...t);},info(...t){console.info(e,...t);},warn(...t){console.warn(e,...t);},error(...t){console.error(e,...t);},log(t,...n){switch(t){case "debug":this.debug(...n);break;case "info":this.info(...n);break;case "warn":this.warn(...n);break;case "error":this.error(...n);break}}}}function ne(){let o=new Map;function e(i,p){return o.has(i)||o.set(i,new Set),o.get(i).add(p),()=>t(i,p)}function t(i,p){let m=o.get(i);m&&m.delete(p);}function n(i,p){let m=o.get(i);if(m)for(let h of m)try{h(p);}catch(g){console.error(`[Lynkow] Error in event listener for "${i}":`,g);}}function r(i,p){let m=(h=>{t(i,m),p(h);});return e(i,m)}function s(i){i?o.delete(i):o.clear();}return {on:e,off:t,emit:n,once:r,removeAllListeners:s}}var oe="lynkow_locale";function re(o,e){if(!c)return e;let t=he();if(t&&o.includes(t))return t;let n=ye(o);if(n)return n;let r=document.documentElement.lang;if(r){let s=r.split("-")[0]?.toLowerCase();if(s&&o.includes(s))return s}return e}function he(){if(!c)return null;try{return localStorage.getItem(oe)}catch{return null}}function se(o){if(c)try{localStorage.setItem(oe,o);}catch{}}function ye(o){if(!c)return null;let t=window.location.pathname.split("/").filter(Boolean);if(t.length>0){let n=t[0]?.toLowerCase();if(n&&o.includes(n))return n}return null}function ie(o,e){return e.includes(o)}var ae="https://api.lynkow.com";function Ce(o){if(!o.siteId)throw new Error("Lynkow SDK: siteId is required");let e=ee(),t=te({debug:o.debug??false}),n=ne(),r=(o.baseUrl||ae).replace(/\/$/,""),s={siteId:o.siteId,baseUrl:r,locale:o.locale,fetchOptions:o.fetchOptions||{},cache:e},i={locale:o.locale||"fr",availableLocales:["fr"],siteConfig:null,initialized:false},p={contents:new R(s),categories:new E(s),tags:new b(s),pages:new x(s),blocks:new L(s),forms:new T(s),reviews:new O(s),site:new P(s),legal:new I(s),cookies:new B(s),seo:new A(s),paths:new $(s),analytics:new D(s),consent:new N(s,n),branding:new U};function m(a){s.locale=a;}async function h(){if(!i.initialized)try{let a=await p.site.getConfig();i.siteConfig=a;let f=a.defaultLocale||"fr";if(i.availableLocales=a.enabledLocales||[f],c&&!o.locale){let u=re(i.availableLocales,f);i.locale=u,m(u);}i.initialized=!0,t.debug("Client initialized",{locale:i.locale,availableLocales:i.availableLocales}),c&&(p.analytics.init(),p.consent.hasConsented()||p.consent.show(),a.showBranding&&p.branding.inject()),n.emit("ready",void 0);}catch(a){t.error("Failed to initialize client",a),n.emit("error",a);}}return c&&setTimeout(()=>h(),0),{...p,globals:p.blocks,config:Object.freeze({siteId:o.siteId,baseUrl:r,debug:o.debug??false}),get locale(){return i.locale},get availableLocales(){return [...i.availableLocales]},setLocale(a){if(!ie(a,i.availableLocales)){t.warn(`Locale "${a}" is not available. Available: ${i.availableLocales.join(", ")}`);return}a!==i.locale&&(i.locale=a,m(a),c&&se(a),e.invalidate(),n.emit("locale-changed",a),t.debug("Locale changed to",a));},clearCache(){e.invalidate(),t.debug("Cache cleared");},destroy(){p.analytics.destroy(),p.consent.destroy(),p.branding.destroy(),e.invalidate(),n.removeAllListeners(),t.debug("Client destroyed");},on(a,f){return n.on(a,f)}}}function ve(o){if(!o.siteId)throw new Error("Lynkow SDK: siteId is required");let e={siteId:o.siteId,baseUrl:(o.baseUrl||ae).replace(/\/$/,""),locale:o.locale,fetchOptions:o.fetchOptions||{}};return {contents:new R(e),categories:new E(e),tags:new b(e),pages:new x(e),blocks:new L(e),forms:new T(e),reviews:new O(e),site:new P(e),legal:new I(e),cookies:new B(e),seo:new A(e),paths:new $(e)}}function we(o){return o.type==="content"}function Re(o){return o.type==="category"}
162
- exports.LynkowError=y;exports.browserOnly=de;exports.browserOnlyAsync=ge;exports.createClient=Ce;exports.createLynkowClient=ve;exports.isBrowser=c;exports.isCategoryResolve=Re;exports.isContentResolve=we;exports.isLynkowError=ce;exports.isServer=pe;//# sourceMappingURL=index.js.map
172
+ `,H=class{badgeElement=null;injectStyles(){if(document.getElementById(V))return;let e=document.createElement("style");e.id=V,e.textContent=fe,document.head.appendChild(e);}inject(){if(!c||document.getElementById(w))return;this.injectStyles();let e=document.createElement("a");e.id=w,e.href="https://lynkow.com?ref=badge",e.target="_blank",e.rel="noopener noreferrer",e.textContent="Powered by Lynkow",e.setAttribute("aria-label","Powered by Lynkow - Visit lynkow.com"),document.body.appendChild(e),this.badgeElement=e;}remove(){c&&(this.badgeElement?.remove(),this.badgeElement=null,document.getElementById(V)?.remove());}isVisible(){return c?document.getElementById(w)!==null:false}destroy(){this.remove();}};var me=300*1e3,he="lynkow_cache_",v=new Map;function te(o={}){let e=o.defaultTtl??me,t=o.prefix??he;function n(g){return `${t}${g}`}function r(g){return Date.now()>g.expiresAt}function i(g){let a=n(g);if(c)try{let f=localStorage.getItem(a);if(!f)return null;let y=JSON.parse(f);return r(y)?(localStorage.removeItem(a),null):y.value}catch{return null}let d=v.get(a);return d?r(d)?(v.delete(a),null):d.value:null}function s(g,a,d=e){let f=n(g),y={value:a,expiresAt:Date.now()+d};if(c){try{localStorage.setItem(f,JSON.stringify(y));}catch{}return}v.set(f,y);}function p(g){let a=n(g);if(c){try{localStorage.removeItem(a);}catch{}return}v.delete(a);}function m(g){if(c){try{let a=[];for(let d=0;d<localStorage.length;d++){let f=localStorage.key(d);f&&f.startsWith(t)&&(!g||f.includes(g))&&a.push(f);}a.forEach(d=>localStorage.removeItem(d));}catch{}return}if(g)for(let a of v.keys())a.startsWith(t)&&a.includes(g)&&v.delete(a);else for(let a of v.keys())a.startsWith(t)&&v.delete(a);}async function h(g,a,d=e){let f=i(g);if(f!==null)return f;let y=await a();return s(g,y,d),y}return {get:i,set:s,remove:p,invalidate:m,getOrSet:h}}function ne(o){let e=o.prefix||"[Lynkow]";return {debug(...t){o.debug&&console.debug(e,...t);},info(...t){console.info(e,...t);},warn(...t){console.warn(e,...t);},error(...t){console.error(e,...t);},log(t,...n){switch(t){case "debug":this.debug(...n);break;case "info":this.info(...n);break;case "warn":this.warn(...n);break;case "error":this.error(...n);break}}}}function oe(){let o=new Map;function e(s,p){return o.has(s)||o.set(s,new Set),o.get(s).add(p),()=>t(s,p)}function t(s,p){let m=o.get(s);m&&m.delete(p);}function n(s,p){let m=o.get(s);if(m)for(let h of m)try{h(p);}catch(g){console.error(`[Lynkow] Error in event listener for "${s}":`,g);}}function r(s,p){let m=(h=>{t(s,m),p(h);});return e(s,m)}function i(s){s?o.delete(s):o.clear();}return {on:e,off:t,emit:n,once:r,removeAllListeners:i}}var re="lynkow_locale";function se(o,e){if(!c)return e;let t=ye();if(t&&o.includes(t))return t;let n=Ce(o);if(n)return n;let r=document.documentElement.lang;if(r){let i=r.split("-")[0]?.toLowerCase();if(i&&o.includes(i))return i}return e}function ye(){if(!c)return null;try{return localStorage.getItem(re)}catch{return null}}function ie(o){if(c)try{localStorage.setItem(re,o);}catch{}}function Ce(o){if(!c)return null;let t=window.location.pathname.split("/").filter(Boolean);if(t.length>0){let n=t[0]?.toLowerCase();if(n&&o.includes(n))return n}return null}function ae(o,e){return e.includes(o)}var ce="https://api.lynkow.com";function we(o){if(!o.siteId)throw new Error("Lynkow SDK: siteId is required");let e=te(),t=ne({debug:o.debug??false}),n=oe(),r=(o.baseUrl||ce).replace(/\/$/,""),i={siteId:o.siteId,baseUrl:r,locale:o.locale,fetchOptions:o.fetchOptions||{},cache:e},s={locale:o.locale||"fr",availableLocales:["fr"],siteConfig:null,initialized:false},p={contents:new b(i),categories:new x(i),tags:new E(i),pages:new L(i),blocks:new T(i),forms:new S(i),reviews:new P(i),site:new I(i),legal:new $(i),cookies:new B(i),seo:new A(i),paths:new _(i),analytics:new N(i),consent:new U(i,n),branding:new H};function m(a){i.locale=a;}async function h(){if(!s.initialized)try{let a=await p.site.getConfig();s.siteConfig=a;let d=a.defaultLocale||"fr";if(s.availableLocales=a.enabledLocales||[d],c&&!o.locale){let f=se(s.availableLocales,d);s.locale=f,m(f);}s.initialized=!0,t.debug("Client initialized",{locale:s.locale,availableLocales:s.availableLocales}),c&&(p.analytics.init(),p.consent.hasConsented()||p.consent.show(),a.showBranding&&p.branding.inject()),n.emit("ready",void 0);}catch(a){t.error("Failed to initialize client",a),n.emit("error",a);}}return c&&setTimeout(()=>h(),0),{...p,globals:p.blocks,config:Object.freeze({siteId:o.siteId,baseUrl:r,debug:o.debug??false}),get locale(){return s.locale},get availableLocales(){return [...s.availableLocales]},setLocale(a){if(!ae(a,s.availableLocales)){t.warn(`Locale "${a}" is not available. Available: ${s.availableLocales.join(", ")}`);return}a!==s.locale&&(s.locale=a,m(a),c&&ie(a),e.invalidate(),n.emit("locale-changed",a),t.debug("Locale changed to",a));},clearCache(){e.invalidate(),t.debug("Cache cleared");},destroy(){p.analytics.destroy(),p.consent.destroy(),p.branding.destroy(),e.invalidate(),n.removeAllListeners(),t.debug("Client destroyed");},on(a,d){return n.on(a,d)}}}function ve(o){if(!o.siteId)throw new Error("Lynkow SDK: siteId is required");let e={siteId:o.siteId,baseUrl:(o.baseUrl||ce).replace(/\/$/,""),locale:o.locale,fetchOptions:o.fetchOptions||{}};return {contents:new b(e),categories:new x(e),tags:new E(e),pages:new L(e),blocks:new T(e),forms:new S(e),reviews:new P(e),site:new I(e),legal:new $(e),cookies:new B(e),seo:new A(e),paths:new _(e)}}function Re(o){return o.type==="content"}function be(o){return o.type==="category"}
173
+ exports.LynkowError=C;exports.browserOnly=ge;exports.browserOnlyAsync=ue;exports.createClient=we;exports.createLynkowClient=ve;exports.isBrowser=c;exports.isCategoryResolve=be;exports.isContentResolve=Re;exports.isLynkowError=le;exports.isServer=de;//# sourceMappingURL=index.js.map
163
174
  //# sourceMappingURL=index.js.map