lynkow 3.0.0 → 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
@@ -1172,16 +1172,34 @@ interface CookieTexts {
1172
1172
  interface CookieConfig {
1173
1173
  /** Banner enabled */
1174
1174
  enabled: boolean;
1175
+ /** Consent mode: opt-in (explicit consent) or opt-out (implied consent) */
1176
+ consentMode?: 'opt-in' | 'opt-out';
1177
+ /** Show banner on first visit */
1178
+ showOnFirstVisit?: boolean;
1179
+ /** Respect Do Not Track browser setting */
1180
+ respectDnt?: boolean;
1175
1181
  /** Banner position */
1176
- position: 'bottom' | 'top' | 'bottom-left' | 'bottom-right';
1177
- /** Banner style */
1178
- layout: 'bar' | 'box' | 'popup';
1182
+ position: 'bottom' | 'top' | 'bottom-left' | 'bottom-right' | 'center';
1183
+ /** Banner layout style */
1184
+ layout: 'banner' | 'floating' | 'modal';
1179
1185
  /** Theme */
1180
1186
  theme: 'light' | 'dark' | 'auto';
1187
+ /** Primary color for buttons (hex) */
1188
+ primaryColor?: string;
1189
+ /** Border radius in pixels for container and buttons */
1190
+ borderRadius?: number;
1181
1191
  /** Cookie categories */
1182
1192
  categories: CookieCategory[];
1183
1193
  /** Banner texts */
1184
1194
  texts: CookieTexts;
1195
+ /** Privacy policy URL */
1196
+ privacyPolicyUrl?: string | null;
1197
+ /** Cookie policy URL */
1198
+ cookiePolicyUrl?: string | null;
1199
+ /** Consent expiry in days */
1200
+ consentExpiryDays?: number;
1201
+ /** Third party scripts configuration */
1202
+ thirdPartyScripts?: unknown[];
1185
1203
  }
1186
1204
  /**
1187
1205
  * Consent preferences
package/dist/index.d.ts CHANGED
@@ -1172,16 +1172,34 @@ interface CookieTexts {
1172
1172
  interface CookieConfig {
1173
1173
  /** Banner enabled */
1174
1174
  enabled: boolean;
1175
+ /** Consent mode: opt-in (explicit consent) or opt-out (implied consent) */
1176
+ consentMode?: 'opt-in' | 'opt-out';
1177
+ /** Show banner on first visit */
1178
+ showOnFirstVisit?: boolean;
1179
+ /** Respect Do Not Track browser setting */
1180
+ respectDnt?: boolean;
1175
1181
  /** Banner position */
1176
- position: 'bottom' | 'top' | 'bottom-left' | 'bottom-right';
1177
- /** Banner style */
1178
- layout: 'bar' | 'box' | 'popup';
1182
+ position: 'bottom' | 'top' | 'bottom-left' | 'bottom-right' | 'center';
1183
+ /** Banner layout style */
1184
+ layout: 'banner' | 'floating' | 'modal';
1179
1185
  /** Theme */
1180
1186
  theme: 'light' | 'dark' | 'auto';
1187
+ /** Primary color for buttons (hex) */
1188
+ primaryColor?: string;
1189
+ /** Border radius in pixels for container and buttons */
1190
+ borderRadius?: number;
1181
1191
  /** Cookie categories */
1182
1192
  categories: CookieCategory[];
1183
1193
  /** Banner texts */
1184
1194
  texts: CookieTexts;
1195
+ /** Privacy policy URL */
1196
+ privacyPolicyUrl?: string | null;
1197
+ /** Cookie policy URL */
1198
+ cookiePolicyUrl?: string | null;
1199
+ /** Consent expiry in days */
1200
+ consentExpiryDays?: number;
1201
+ /** Third party scripts configuration */
1202
+ thirdPartyScripts?: unknown[];
1185
1203
  }
1186
1204
  /**
1187
1205
  * Consent preferences
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 X(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},g=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=X(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 g{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 g{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 g{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 g{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 g{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 g{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 g{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 g{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 g{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 g{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 g{async sitemap(e){return this.getText("/sitemap.xml",e)}async robots(e){return this.getText("/robots.txt",e)}};var W="paths_",$=class extends g{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 a=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",pe=!a;function de(o,e){return a?o():e}async function ge(o,e){return a?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 !a||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(!(!a||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){!a||!this.enabled||(await this.init(),window.LynkowAnalytics&&window.LynkowAnalytics.track(e));}async trackFunnelStep(e){!a||!this.enabled||(await this.init(),window.LynkowAnalytics&&window.LynkowAnalytics.trackFunnel(e.funnelId,e.stepNumber,e.stepName,e.funnelName));}async trackPageview(e){!a||!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(a)return window.LynkowAnalytics}destroy(){if(!a)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(!a)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(a){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(){a&&(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(){a&&(this.bannerElement?.remove(),this.bannerElement=null);}showPreferences(){a&&(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 a?this.getStoredConsent()||{...G}:{...G}}hasConsented(){return a?this.getStoredConsent()!==null:false}acceptAll(){if(!a)return;let e={necessary:true,analytics:true,marketing:true,preferences:true};this.saveConsent(e),this.logConsent(e),this.hide();}rejectAll(){if(!a)return;let e={necessary:true,analytics:false,marketing:false,preferences:false};this.saveConsent(e),this.logConsent(e),this.hide();}setCategories(e){if(!a)return;let n={...this.getCategories(),...e,necessary:true};this.saveConsent(n),this.logConsent(n);}reset(){if(a){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={bottom:"bottom: 0; left: 0; right: 0;",top:"top: 0; left: 0; right: 0;","bottom-left":"bottom: 20px; left: 20px; max-width: 400px;","bottom-right":"bottom: 20px; right: 20px; max-width: 400px;"},s=n==="dark",i=s?"#1a1a1a":"#ffffff",p=s?"#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
- ${r[t]}
15
+ ${a}
5
16
  z-index: 99999;
6
17
  padding: 20px;
7
- background: ${i};
8
- color: ${p};
9
- box-shadow: 0 -2px 10px rgba(0,0,0,0.1);
18
+ background: ${f};
19
+ color: ${y};
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: #0066cc;
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,18 +53,18 @@
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 r=(e.theme||"light")==="dark",s=r?"#1a1a1a":"#ffffff",i=r?"#ffffff":"#1a1a1a",p=e.texts||{title:"Preferences de cookies",save:"Enregistrer"},h=(e.categories||[]).map(d=>`
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=>`
50
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
64
  name="${d.id}"
54
65
  ${t[d.id]?"checked":""}
55
66
  ${d.required?"disabled checked":""}
56
- style="width: 18px; height: 18px; margin-top: 2px;"
67
+ style="width: 18px; height: 18px; margin-top: 2px; accent-color: ${r};"
57
68
  />
58
69
  <div style="flex: 1;">
59
70
  <strong style="opacity: ${d.required?"0.6":"1"};">
@@ -79,36 +90,36 @@
79
90
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
80
91
  ">
81
92
  <div style="
82
- background: ${s};
83
- color: ${i};
93
+ background: ${p};
94
+ color: ${m};
84
95
  padding: 30px;
85
- border-radius: 8px;
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;">${p.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
- ${h}
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="
98
109
  padding: 10px 20px;
99
- background: #0066cc;
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
- ">${p.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",V="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(V))return;let e=document.createElement("style");e.id=V,e.textContent=ue,document.head.appendChild(e);}inject(){if(!a||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(){a&&(this.badgeElement?.remove(),this.badgeElement=null,document.getElementById(V)?.remove());}isVisible(){return a?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(d){return `${t}${d}`}function r(d){return Date.now()>d.expiresAt}function s(d){let c=n(d);if(a)try{let m=localStorage.getItem(c);if(!m)return null;let C=JSON.parse(m);return r(C)?(localStorage.removeItem(c),null):C.value}catch{return null}let f=w.get(c);return f?r(f)?(w.delete(c),null):f.value:null}function i(d,c,f=e){let m=n(d),C={value:c,expiresAt:Date.now()+f};if(a){try{localStorage.setItem(m,JSON.stringify(C));}catch{}return}w.set(m,C);}function p(d){let c=n(d);if(a){try{localStorage.removeItem(c);}catch{}return}w.delete(c);}function u(d){if(a){try{let c=[];for(let f=0;f<localStorage.length;f++){let m=localStorage.key(f);m&&m.startsWith(t)&&(!d||m.includes(d))&&c.push(m);}c.forEach(f=>localStorage.removeItem(f));}catch{}return}if(d)for(let c of w.keys())c.startsWith(t)&&c.includes(d)&&w.delete(c);else for(let c of w.keys())c.startsWith(t)&&w.delete(c);}async function h(d,c,f=e){let m=s(d);if(m!==null)return m;let C=await c();return i(d,C,f),C}return {get:s,set:i,remove:p,invalidate:u,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 u=o.get(i);u&&u.delete(p);}function n(i,p){let u=o.get(i);if(u)for(let h of u)try{h(p);}catch(d){console.error(`[Lynkow] Error in event listener for "${i}":`,d);}}function r(i,p){let u=(h=>{t(i,u),p(h);});return e(i,u)}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(!a)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(!a)return null;try{return localStorage.getItem(oe)}catch{return null}}function se(o){if(a)try{localStorage.setItem(oe,o);}catch{}}function ye(o){if(!a)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 u(c){s.locale=c;}async function h(){if(!i.initialized)try{let c=await p.site.getConfig();i.siteConfig=c;let f=c.defaultLocale||"fr";if(i.availableLocales=c.enabledLocales||[f],a&&!o.locale){let m=re(i.availableLocales,f);i.locale=m,u(m);}i.initialized=!0,t.debug("Client initialized",{locale:i.locale,availableLocales:i.availableLocales}),a&&(p.analytics.init(),p.consent.hasConsented()||p.consent.show(),c.showBranding&&p.branding.inject()),n.emit("ready",void 0);}catch(c){t.error("Failed to initialize client",c),n.emit("error",c);}}return a&&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(c){if(!ie(c,i.availableLocales)){t.warn(`Locale "${c}" is not available. Available: ${i.availableLocales.join(", ")}`);return}c!==i.locale&&(i.locale=c,u(c),a&&se(c),e.invalidate(),n.emit("locale-changed",c),t.debug("Locale changed to",c));},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(c,f){return n.on(c,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=a;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