@je-es/client 0.2.1 → 0.2.3
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/README.md +2 -2
- package/dist/main.cjs +10 -14
- package/dist/main.cjs.map +1 -1
- package/dist/main.d.cts +19 -15
- package/dist/main.d.ts +19 -15
- package/dist/main.js +10 -14
- package/dist/main.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,11 +8,11 @@
|
|
|
8
8
|
</div>
|
|
9
9
|
|
|
10
10
|
<div align="center">
|
|
11
|
-
<img src="https://img.shields.io/badge/v-0.2.
|
|
11
|
+
<img src="https://img.shields.io/badge/v-0.2.3-black"/>
|
|
12
12
|
<img src="https://img.shields.io/badge/🔥-@je--es-black"/>
|
|
13
13
|
<br>
|
|
14
14
|
<img src="https://github.com/je-es/client/actions/workflows/ci.yml/badge.svg" alt="CI" />
|
|
15
|
-
|
|
15
|
+
<img src="https://img.shields.io/badge/coverage-70%25-brightgreen" alt="Test Coverage" />
|
|
16
16
|
<img src="https://img.shields.io/github/issues/je-es/client?style=flat" alt="Github Repo Issues" />
|
|
17
17
|
<img src="https://img.shields.io/github/stars/je-es/client?style=social" alt="GitHub Repo stars" />
|
|
18
18
|
</div>
|
package/dist/main.cjs
CHANGED
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
<div class="context-provider" style="display: contents;">
|
|
5
5
|
${t}
|
|
6
6
|
</div>
|
|
7
|
-
`}};function bt(s,t){let e=s.subscribe(()=>{t.isMounted&&t.update();});return t.subscribe(()=>e),s.value}var te=class{constructor(t){this.contexts=new Map;for(let[e,n]of Object.entries(t))this.contexts.set(e,new G(n));}get(t){let e=this.contexts.get(t);if(!e)throw new Error(`Context key "${String(t)}" not found`);return e}set(t,e){let n=this.contexts.get(t);n&&(n.value=e);}subscribe(t,e){let n=this.contexts.get(t);if(!n)throw new Error(`Context key "${String(t)}" not found`);return n.subscribe(e)}reset(){for(let t of this.contexts.values())t.reset();}};function vt(s){return new te(s)}var L=null,A=0,ne=new WeakMap;function Me(s){L=s,A=0;}function Pe(){L=null,A=0;}function J(s){return ne.has(s)||ne.set(s,[]),ne.get(s)}function N(s){if(!L)throw new Error("useState must be called inside a component");let t=L,e=A++,n=J(t);n[e]===void 0&&(n[e]={value:typeof s=="function"?s():s});let r=i=>{let o=n[e],a=typeof i=="function"?i(o.value):i;o.value!==a&&(o.value=a,t.update());};return [n[e].value,r]}function
|
|
7
|
+
`}};function bt(s,t){let e=s.subscribe(()=>{t.isMounted&&t.update();});return t.subscribe(()=>e),s.value}var te=class{constructor(t){this.contexts=new Map;for(let[e,n]of Object.entries(t))this.contexts.set(e,new G(n));}get(t){let e=this.contexts.get(t);if(!e)throw new Error(`Context key "${String(t)}" not found`);return e}set(t,e){let n=this.contexts.get(t);n&&(n.value=e);}subscribe(t,e){let n=this.contexts.get(t);if(!n)throw new Error(`Context key "${String(t)}" not found`);return n.subscribe(e)}reset(){for(let t of this.contexts.values())t.reset();}};function vt(s){return new te(s)}var L=null,A=0,ne=new WeakMap;function Me(s){L=s,A=0;}function Pe(){L=null,A=0;}function J(s){return ne.has(s)||ne.set(s,[]),ne.get(s)}function N(s){if(!L)throw new Error("useState must be called inside a component");let t=L,e=A++,n=J(t);n[e]===void 0&&(n[e]={value:typeof s=="function"?s():s});let r=i=>{let o=n[e],a=typeof i=="function"?i(o.value):i;o.value!==a&&(o.value=a,t.update());};return [n[e].value,r]}function R(s,t){if(!L)throw new Error("useEffect must be called inside a component");let e=L,n=A++,r=J(e),i=r[n];if(!i||!t||!ye(i.deps,t)){if(i?.value&&typeof i.value=="function")try{i.value();}catch(a){console.error("Error in effect cleanup:",a);}Promise.resolve().then(()=>{try{let a=s();r[n]={value:a,deps:t?[...t]:void 0};}catch(a){console.error("Error in effect:",a);}});}}function Ie(s,t){if(!L)throw new Error("useMemo must be called inside a component");let e=A++,n=J(L),r=n[e];return (!r||!ye(r.deps,t))&&(n[e]={value:s(),deps:[...t]}),n[e].value}function re(s,t){return Ie(()=>s,t)}function se(s){if(!L)throw new Error("useRef must be called inside a component");let t=A++,e=J(L);return e[t]===void 0&&(e[t]={value:{current:s}}),e[t].value}function Tt(s,t){let[e,n]=N(t),r=re(i=>{n(o=>s(o,i));},[s]);return [e,r]}function _t(s,t){let[e,n]=N(()=>{try{let i=window.localStorage.getItem(s);return i?JSON.parse(i):t}catch(i){return console.error("Error loading from localStorage:",i),t}});return [e,i=>{n(o=>{let a=i instanceof Function?i(o):i;try{window.localStorage.setItem(s,JSON.stringify(a));}catch(l){console.error("Error saving to localStorage:",l);}return a});}]}function Ct(s,t){let[e,n]=N(s);return R(()=>{let r=setTimeout(()=>{n(s);},t);return ()=>{clearTimeout(r);}},[s,t]),e}function St(s){let t=se(void 0);return R(()=>{t.current=s;}),t.current}function Et(s=false){let[t,e]=N(s),n=re(()=>{e(r=>!r);},[]);return [t,n]}function xt(s,t){let e=se(s);R(()=>{e.current=s;},[s]),R(()=>{if(t===null)return;let n=setInterval(()=>e.current(),t);return ()=>clearInterval(n)},[t]);}function kt(s,t){let[e,n]=N(null),[r,i]=N(true),[o,a]=N(null),l=re(async()=>{i(true),a(null);try{let c=await fetch(s,t);if(!c.ok)throw new Error(`HTTP error! status: ${c.status}`);let u=await c.json();n(u);}catch(c){a(c);}finally{i(false);}},[s]);return R(()=>{l();},[l]),{data:e,loading:r,error:o,refetch:l}}function Lt(){let[s,t]=N({width:window.innerWidth,height:window.innerHeight});return R(()=>{let e=()=>{t({width:window.innerWidth,height:window.innerHeight});};return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[]),s}function Mt(s,t,e=window){let n=se(t);R(()=>{n.current=t;},[t]),R(()=>{if(!(e&&"addEventListener"in e))return;let i=o=>{n.current(o);};return e.addEventListener(s,i),()=>{e.removeEventListener(s,i);}},[s,e]);}function Pt(s,t){class e extends m{render(){Me(this);try{return s(this.props)}finally{Pe();}}}return t&&Object.defineProperty(e,"name",{value:t}),e}function ye(s,t){if(!s||s.length!==t.length)return false;for(let e=0;e<s.length;e++)if(s[e]!==t[e])return false;return true}var ie=class{constructor(){this.routes=[];this.currentRoute=null;this.mode="history";this.base="/";this.beforeEachHooks=[];this.afterEachHooks=[];this.currentComponent=null;this.routerOutlet=null;this.isNavigating=false;this.scrollBehavior="auto";this.notFoundHandler=null;this._internalPath=null;}init(t,e="history",n="/",r="auto"){this.routes=t,this.mode=e,this.base=n.endsWith("/")?n.slice(0,-1):n,this.scrollBehavior=r,this._initializeRouting(),this._handleRoute();}async push(t,e){this.isNavigating&&(this.isNavigating=false),this._internalPath=t,this.mode==="history"?window.history.pushState(e||{},"",this._buildFullPath(t)):window.location.hash=t,await this._handleRoute();}async replace(t,e){return this._internalPath=t,this.mode==="history"?window.history.replaceState(e||{},"",this._buildFullPath(t)):window.location.hash=t,this._handleRoute()}back(){window.history.back();}forward(){window.history.forward();}go(t){window.history.go(t);}beforeEach(t){this.beforeEachHooks.push(t);}afterEach(t){this.afterEachHooks.push(t);}onNotFound(t){this.notFoundHandler=t;}getCurrentRoute(){return this.currentRoute?{...this.currentRoute}:null}isActive(t,e=false){return this.currentRoute?e?this.currentRoute.path===t:this.currentRoute.path.startsWith(t):false}outlet(){return vdom.createElement("div",{"data-router-outlet":"true",style:"display: contents;"})}getRoute(t){return this.routes.find(e=>e.name===t)}async pushNamed(t,e){let n=this.getRoute(t);if(!n){console.error(`Route with name "${t}" not found`);return}let r=n.path;if(e)for(let[i,o]of Object.entries(e))r=r.replace(`:${i}`,o);return this.push(r)}resolve(t){let e=this._matchRoute(t);if(!e)return null;let{route:n,params:r}=e;return {path:t,params:r,query:this._parseQuery(t),meta:n.meta||{},hash:t.includes("#")?t.split("#")[1]:"",name:n.name}}_initializeRouting(){window.addEventListener("popstate",()=>{this._internalPath=null,this._handleRoute();}),this.mode==="hash"&&window.addEventListener("hashchange",()=>{this._internalPath=null,this._handleRoute();}),document.addEventListener("click",t=>{let e=t.target.closest("a[href]");if(e&&this._shouldInterceptLink(e)){t.preventDefault();let n=e.getAttribute("href");if(n){let r=this.mode==="hash"&&n.startsWith("#")?n.substring(1):n.replace(this.base,"");this.push(r);}}});}_shouldInterceptLink(t){return !!(t.getAttribute("href")&&t.hostname===window.location.hostname&&t.target!=="_blank"&&!t.hasAttribute("download")&&t.rel!=="external")}async _handleRoute(){if(!this.isNavigating){this.isNavigating=true;try{let t=this._getCurrentPath(),e=this._matchRoute(t);if(!e){this._handleNotFound(t);return}let{route:n,params:r}=e,i=this._buildRouteObject(t,r,n),o=this.currentRoute||this._buildEmptyRoute();if(!await this._runNavigationGuards(n,i,o))return;this.currentRoute=i,await this._renderComponent(n),this._handleScrollBehavior(i,o),n.meta?.title&&typeof n.meta.title=="string"&&(document.title=n.meta.title),this.afterEachHooks.forEach(l=>l(i,o));}catch(t){console.error("Router error:",t);}finally{this.isNavigating=false;}}}_handleNotFound(t){console.warn(`No route matched for path: ${t}`),this.currentRoute={path:t,params:{},query:this._parseQuery(),meta:{},hash:window.location.hash.substring(1)},this.notFoundHandler&&this.notFoundHandler();}_buildRouteObject(t,e,n){return {path:t,params:e,query:this._parseQuery(),meta:n.meta||{},hash:window.location.hash.substring(1),name:n.name}}_buildEmptyRoute(){return {path:"",params:{},query:{},meta:{},hash:""}}async _runNavigationGuards(t,e,n){if(t.beforeEnter&&!await this._runGuard(t.beforeEnter,e,n))return false;for(let r of this.beforeEachHooks)if(!await this._runGuard(r,e,n))return false;return true}_runGuard(t,e,n){return new Promise(r=>{t(e,n,i=>{i===false?r(false):typeof i=="string"?(this.push(i),r(false)):r(true);});})}async _renderComponent(t){if(!this.routerOutlet&&(this.routerOutlet=document.querySelector('[data-router-outlet="true"]'),!this.routerOutlet)){console.warn("Router outlet not found");return}this.currentComponent&&(this.currentComponent.unmount(),this.currentComponent=null),this.routerOutlet.innerHTML="";try{let e=await this._resolveComponent(t.component);if(!e||typeof e!="function")throw new Error("Component is null or not a constructor");let n=e;this.currentComponent=new n,this.currentComponent&&await this.currentComponent.mount(this.routerOutlet);}catch(e){throw this._renderError(t.path,e),e}}async _resolveComponent(t){if(typeof t=="function"){let n="prototype"in t&&t.prototype?t.prototype:null;if(n&&typeof n=="object"&&"constructor"in n&&n.constructor===t)return t;try{let i=await t();return i.HomePage||i.TodoPage||i.default||Object.values(i).find(a=>{if(typeof a!="function")return !1;let c=a.prototype;return c!==null&&typeof c=="object"&&c!==void 0&&"constructor"in c})||null}catch(i){return console.error("Failed to load lazy component:",i),null}}return null}_renderError(t,e){if(this.routerOutlet){let n=e instanceof Error?e.message:String(e);this.routerOutlet.innerHTML=`
|
|
8
8
|
<div style="padding: 2rem; background: #121212ff; border: 2px solid #303030ff;
|
|
9
9
|
border-radius: 8px; margin: 2rem;">
|
|
10
10
|
<h2 style="color: rgba(208, 31, 31, 1); margin-top: 0;">\u26A0\uFE0F Failed to Load Component</h2>
|
|
11
11
|
<p style="color: #a3a3a3ff;"><strong>Route:</strong> ${t}</p>
|
|
12
12
|
<p style="color: #a3a3a3ff;"><strong>Error:</strong> ${n}</p>
|
|
13
13
|
</div>
|
|
14
|
-
`;}}_handleScrollBehavior(t,e){if(t.hash){let n=document.getElementById(t.hash);if(n){n.scrollIntoView({behavior:this.scrollBehavior});return}}t.path!==e.path&&window.scrollTo({top:0,behavior:this.scrollBehavior});}_getCurrentPath(){if(this._internalPath!==null)return this._internalPath;if(this.mode==="hash")return window.location.hash.substring(1).split("?")[0]||"/";let t=window.location.pathname;return (!t||t==="blank"||t==="about:blank")&&(t="/"),this.base&&t.startsWith(this.base)&&(t=t.substring(this.base.length)),t||"/"}_buildFullPath(t){if(t.startsWith("http"))return t;let e=t.startsWith("/")?t:"/"+t;return this.base+e}_matchRoute(t){let e=t.split("?")[0].split("#")[0];for(let n of this.routes){let r=this._matchPath(n.path,e);if(r!==null)return {route:n,params:r}}return null}_matchPath(t,e){if(t==="*")return {};if(t===e)return {};let n=[],r=t.replace(/\*/g,".*").replace(/:([^/]+)/g,(a,l)=>(n.push(l),"([^/]+)")),i=new RegExp(`^${r}$`),o=e.match(i);return o?n.reduce((a,l,c)=>(a[l]=decodeURIComponent(o[c+1]),a),{}):null}_parseQuery(t){let e=t?t.includes("?")?t.split("?")[1].split("#")[0]:"":window.location.search.substring(1);return e?e.split("&").reduce((n,r)=>{let[i,o]=r.split("=").map(decodeURIComponent);return i&&(n[i]=o||""),n},{}):{}}},R=new ie;function we(s,t=false){t?R.replace(s):R.push(s),window.dispatchEvent(new CustomEvent("navigation",{detail:{path:s}}));}function Ot(){R.back();}function Rt(){window.history.forward();}function oe(){return window.location.pathname}function $t(s){return oe()===s}function Vt(s){return oe().startsWith(s)}function Ft(){let s=oe();we(s,true);}function Kt(s,t){let e=new URLSearchParams(t).toString();we(`${s}?${e}`);}function Oe(){return new URLSearchParams(window.location.search)}function At(s){return Oe().get(s)}var ae=class{constructor(t){this._subscribers=new Set;this._storage=null;this._middleware=[];this._isHydrating=false;if(this._persist=t.persist??false,this._storageKey=t.storageKey||`store_${Date.now()}`,this._persist&&typeof window<"u"&&(this._storage=t.storage==="sessionStorage"?sessionStorage:localStorage),this._persist&&this._storage){let e=this._loadFromStorage();this._state=e!==null?e:t.state;}else this._state=t.state;t.middleware&&(this._middleware=t.middleware);}get state(){return {...this._state}}set state(t){this.setState(t);}setState(t,e){let n={...this._state},r=typeof t=="function"?t(n):t;this._state={...n,...r};for(let i of this._middleware)try{i(this._state,e);}catch(o){console.error("Store middleware error:",o);}this._persist&&!this._isHydrating&&this._saveToStorage(),this._notify();}get(t){return this._state[t]}set(t,e,n){this.setState({[t]:e},n);}subscribe(t){return this._subscribers.add(t),t(this._state),()=>{this._subscribers.delete(t);}}subscribeToKey(t,e){let n=this._state[t],r=i=>{let o=i[t];n!==o&&(n=o,e(o));};return this.subscribe(r)}use(t){this._middleware.push(t);}clear(){if(this._state={},this._persist&&this._storage)try{this._storage.removeItem(this._storageKey);}catch(t){console.error("Failed to clear storage:",t);}this._notify();}reset(t){this._state={...t},this._persist&&this._saveToStorage(),this._notify();}hydrate(){if(!this._persist||!this._storage){console.warn("Cannot hydrate: persistence not enabled");return}this._isHydrating=true;let t=this._loadFromStorage();t!==null&&(this._state=t,this._notify()),this._isHydrating=false;}getSnapshot(){return {state:{...this._state},subscribers:this._subscribers.size,storageKey:this._storageKey}}batch(t){let e=this._notify.bind(this),n=false;this._notify=()=>{n=true;};try{t();}finally{this._notify=e,n&&this._notify();}}_notify(){let t={...this._state};for(let e of this._subscribers)try{e(t);}catch(n){console.error("Store subscriber error:",n);}}_loadFromStorage(){if(!this._storage)return null;try{let t=this._storage.getItem(this._storageKey);return t?JSON.parse(t):null}catch(t){return console.error("Failed to load from storage:",t),null}}_saveToStorage(){if(this._storage)try{this._storage.setItem(this._storageKey,JSON.stringify(this._state));}catch(t){console.error("Failed to save to storage:",t),t instanceof DOMException&&t.name==="QuotaExceededError"&&console.warn("Storage quota exceeded");}}destroy(){this._subscribers.clear(),this._middleware=[],this._state={};}};function Re(s){return new ae(s)}function Dt(s,t){let e=Re({state:{value:t(...s.map(n=>n.state))}});for(let n of s)n.subscribe(()=>{e.setState({value:t(...s.map(r=>r.state))});});return e}function Ut(s,t,e){return s.subscribe(r=>{let i=e(r);Object.assign(t,i),typeof t.update=="function"&&t.update();})}function qt(s){let t=s;return {async build(){if(!t.build){console.warn("No build configuration provided");return}console.log("\u{1F528} Building @je-es/client application...");try{await this._buildJS(),await this._buildStyles(),console.log("\u2705 Build completed successfully!");}catch(e){throw console.error("\u274C Build error:",e),e}},async _buildJS(){if(!t.build)return;let e=await Bun.build({entrypoints:[t.build.entry],outdir:t.build.output.substring(0,t.build.output.lastIndexOf("/")),target:"browser",minify:t.build.minify??false,sourcemap:t.build.sourcemap?"external":"none",splitting:t.build.optimization?.splitChunks??false,naming:{entry:t.build.output.substring(t.build.output.lastIndexOf("/")+1)},external:["sass","fs","path","url","util","stream","buffer","events","crypto","os","child_process"]});if(!e.success)throw console.error("\u274C JS Build failed:",e.logs),new Error("JS Build failed")},async _buildStyles(){let e=t.build?.styles?.input||"./app/gui/style",n=t.build?.styles?.output||"./static/client.css",r=await import('sass'),{writeFileSync:i,existsSync:o,mkdirSync:a}=await import('fs'),{join:l,dirname:c}=await import('path'),u=c(n),d=n.split("/").pop()||"client.css",y=l(e,"index.scss");if(!o(y)){console.log("\u26A0\uFE0F No index.scss found, skipping CSS build");return}try{o(u)||a(u,{recursive:!0});let K=r.compile(y,{style:t.build?.minify?"compressed":"expanded",sourceMap:!!t.build?.sourcemap,loadPaths:[e]}),me=l(u,d);i(me,K.css,"utf-8"),t.build?.sourcemap&&K.sourceMap&&i(`${me}.map`,JSON.stringify(K.sourceMap),"utf-8");}catch(K){throw console.error("\u274C CSS Build failed:",K),K}},async _collectScssFiles(e){let{readdirSync:n,statSync:r,existsSync:i}=await import('fs'),{join:o,extname:a}=await import('path'),l=[];if(!i(e))return l;let c=n(e);for(let u of c){let d=o(e,u),y=r(d);y.isDirectory()?l.push(...await this._collectScssFiles(d)):y.isFile()&&a(u)===".scss"&&!u.startsWith("_")&&l.push(d);}return l.sort()},async watch(){console.log("\u{1F440} Watching for changes..."),await this.build();let{watch:e}=await import('fs'),{dirname:n}=await import('path'),{existsSync:r}=await import('fs');if(t.build?.entry){let o=n(t.build.entry);e(o,{recursive:true},async(a,l)=>{if(l&&(l.endsWith(".ts")||l.endsWith(".tsx"))){console.log(`\u{1F504} ${l} changed, rebuilding JS...`);try{await this._buildJS(),console.log("\u2705 JS rebuild complete");}catch(c){console.error("\u274C JS rebuild failed:",c);}}});}let i="./app/style";r(i)&&e(i,{recursive:true},async(o,a)=>{if(a&&a.endsWith(".scss")){console.log(`\u{1F504} ${a} changed, rebuilding CSS...`);try{await this._buildStyles(),console.log("\u2705 CSS rebuild complete");}catch(l){console.error("\u274C CSS rebuild failed:",l);}}});},async init(){if(console.log("\u{1F680} [client] Initializing @je-es/client..."),t.api){let e={baseURL:t.api.baseURL,timeout:t.api.timeout,headers:t.api.headers};t.api.interceptors&&(e.interceptors={request:t.api.interceptors.request||null,response:t.api.interceptors.response||null,error:t.api.interceptors.error||null}),capi.configureApi(e);}t.router&&t.app?.routes&&(R.init(t.app.routes,t.router.mode,t.router.base),t.router.beforeEach&&R.beforeEach(t.router.beforeEach),t.router.afterEach&&R.afterEach(t.router.afterEach)),t.app?.root&&(document.querySelector(t.app.root)||console.error(`\u274C Root element "${t.app.root}" not found`)),t.devTools?.enabled&&this._enableDevTools();},_enableDevTools(){window.__JEES_DEV__={router:R,config:t,version:"0.0.1"};},getConfig(){return t}}}var z=class{constructor(t){this.translations={};this.currentLanguage="en";this.defaultLanguage="en";this.supportedLanguages=new Set(["en"]);this.cachePath="";this.readyListeners=[];t&&(this.defaultLanguage=t.defaultLanguage||"en",this.cachePath=t.staticPath||"static/i18n",this.currentLanguage=this.getStoredLanguage()||t.defaultLanguage||"en",t.supportedLanguages&&(this.supportedLanguages=new Set(t.supportedLanguages)));}loadLanguage(t,e){this.translations[t]||(this.translations[t]={}),this.translations[t]={...this.translations[t],...e},this.supportedLanguages.add(t);}loadTranslations(t){Object.entries(t).forEach(([e,n])=>{this.loadLanguage(e,n);});}setLanguage(t){this.supportedLanguages.has(t)?(this.currentLanguage=t,this.storeLanguage(t),this.dispatchLanguageChangeEvent()):this.supportedLanguages.has(this.defaultLanguage)&&(this.currentLanguage=this.defaultLanguage);}getLanguage(){return this.currentLanguage}getSupportedLanguages(){return Array.from(this.supportedLanguages)}t(t,e,n){let r=this.currentLanguage,i=this.getTranslation(t,n);return e&&Object.entries(e).forEach(([o,a])=>{let l=this.translations[r]?.[a]||this.translations[this.defaultLanguage]?.[a]||a;i=i.replace(new RegExp(`\\{${o}\\}`,"g"),l);}),i}getTranslation(t,e){let n=this.currentLanguage;return this.translations[n]?.[t]?this.translations[n]?.[t]||this.translations[this.defaultLanguage]?.[t]:(console.warn(`Translation key not found: ${t}`),e||t)}tLang(t,e,n){let r=this.currentLanguage;this.currentLanguage=e;let i=this.t(t,n);return this.currentLanguage=r,i}tHtml(t,e){let n=this.t(t,e);return this.parseHtmlString(n)}parseHtmlString(t){let e=t.replace(/\\n|\/n/g,"<br>"),n=[],r=/<([^/>]+)>([^<]*)<\/\1>|<([^/>]+)\s*\/?>|([^<]+)/g,i;for(;(i=r.exec(e))!==null;){let o=i[1],a=i[2],l=i[3],c=i[4];if(c)n.push(c);else if(o){let u=o.split(/\s+/)[0].toLowerCase();n.push(vdom.createElement(u,{},a));}else if(l){let u=l.trim().toLowerCase();n.push(vdom.createElement(u,{}));}}return n.length>0?n:[t]}getTranslations(){return this.translations[this.currentLanguage]||{}}hasKey(t){return !!(this.translations[this.currentLanguage]?.[t]||this.translations[this.defaultLanguage]?.[t])}createTranslator(t){let e=()=>t();return typeof window<"u"?(window.addEventListener("languagechange",e),()=>window.removeEventListener("languagechange",e)):()=>{}}async loadFromUrl(t){let e=Array.isArray(t)?t:[t],n={};for(let r of e)if(r.includes("*")){let i=r.replace("*.json",""),o=this.supportedLanguages;for(let a of o)try{let l=`${i}${a}.json`;typeof window<"u"&&!l.startsWith("http")&&(l=window.location.origin+(l.startsWith("/")?l:"/"+l));let c=await fetch(l);if(c.ok){let u=await c.json();n[a]=u;}}catch{}}else try{let i=r;typeof window<"u"&&!i.startsWith("http")&&(i=window.location.origin+(i.startsWith("/")?i:"/"+i));let o=await fetch(i);if(o.ok){let a=await o.json(),l=r.match(/([a-z]{2,3})\.json$/i),c=l?l[1].toLowerCase():"en";n[c]=a,this.supportedLanguages.add(c);}}catch{}Object.keys(n).length>0&&(this.loadTranslations(n),this.notifyReady());}onReady(t){Object.keys(this.translations).length>0?t():this.readyListeners.push(t);}notifyReady(){for(let t of this.readyListeners)t();this.readyListeners=[];}getStoredLanguage(){return typeof localStorage<"u"&&localStorage.getItem("app-language")||null}storeLanguage(t){typeof localStorage<"u"&&localStorage.setItem("app-language",t);}dispatchLanguageChangeEvent(){typeof window<"u"&&window.dispatchEvent(new CustomEvent("languagechange",{detail:{language:this.currentLanguage}}));}},B=null;function S(){return B||(B=new z),B}function h(s,t,e){return S().t(s,t,e)}function Jt(s,t,e){return S().tLang(s,t,e)}function le(s,t){return S().tHtml(s,t)}function Qt(s){S().setLanguage(s);}async function Yt(s,t){let e=S(),n=e.getTranslations();if(!(Object.keys(n).length>0)&&t){let i=t.endsWith("/")?t:t+"/";try{await e.loadFromUrl(i+`${s}.json`);}catch(o){console.warn(`Failed to lazy-load language: ${s}`,o);}}e.setLanguage(s);}function Zt(){return S().getLanguage()}function Xt(s,t){S().loadLanguage(s,t);}function en(s){S().loadTranslations(s);}function tn(){return S().getSupportedLanguages()}function nn(s){return S().hasKey(s)}function rn(){return S().getTranslations()}function sn(s){return S().createTranslator(s)}async function on(s){return S().loadFromUrl(s)}function an(s){B=new z(s);}async function ln(s){let t=new z(s);if(B=t,s.staticPath){let e=s.staticPath.endsWith("/")?s.staticPath:s.staticPath+"/",n=t.getLanguage(),r=e+`${n}.json`;await t.loadFromUrl(r);}}async function cn(s,t){let e=S(),n=t||"static/i18n",i=(n.endsWith("/")?n:n+"/")+s+".json";await e.loadFromUrl(i);}var j={toast:"bb_toast",container:"bb_toastContainer",icon:"bb_toastIcon",msg:"bb_toastMsg"},Y=class extends m{constructor(){super(...arguments);this.messages=[];this.nextId=0;}show(e,n="info",r=2e3,i){let o=this.nextId++;this.messages=[...this.messages,{id:o,message:e,type:n,translateKey:i}],setTimeout(()=>{this.messages=this.messages.filter(a=>a.id!==o);},r);}success(e,n,r){this.show(e,"success",n,r);}error(e,n,r){this.show(e,"error",n,r);}info(e,n,r){this.show(e,"info",n,r);}warning(e,n,r){this.show(e,"warning",n,r);}render(){return this.messages.length===0?vdom.html``:vdom.createElement("div",{className:j.container},...this.messages.map(e=>this.renderToast(e)))}renderToast(e){let n={success:"fas fa-check-circle",error:"fas fa-exclamation-circle",info:"fas fa-info-circle",warning:"fas fa-exclamation-triangle"},r=e.translateKey?h(e.translateKey):e.message;return vdom.createElement("div",{key:String(e.id),className:`${j.toast} ${j.toast}--${e.type}`,"data-translate":e.translateKey||void 0},vdom.createElement("i",{className:`${n[e.type]} ${j.icon}`}),vdom.createElement("span",{className:j.msg},r))}};p([g],Y.prototype,"messages");var $=null;function Fe(s){if($)return $;let t=s||document.createElement("div");return s||document.body.appendChild(t),$=new Y,$.mount(t),$}function q(){return $||($=Fe()),$}var fn={show:(s,t="info",e,n)=>{q().show(s,t,e,n);},success:(s,t,e)=>{q().success(s,t,e);},error:(s,t,e)=>{q().error(s,t,e);},info:(s,t,e)=>{q().info(s,t,e);},warning:(s,t,e)=>{q().warning(s,t,e);}};var T={loader:{container:"bb_loaderContainer",containerOverlay:"bb_loaderContainer--overlay",bg:"bb_loaderBg",loader:"bb_loader"},spinner:{container:"bb_loaderSpinnerContainer",icon:"bb_loaderSpinnerIcon",dot:"bb_loaderSpinnerDot",pulse:"bb_loaderSpinnerPulse",text:"bb_loaderSpinnerText"},progress:{container:"bb_loaderProgressContainer",bar:"bb_loaderProgressBar",text:"bb_loaderProgressText"}},I=class extends m{constructor(){super(...arguments);this.visible=false;this.message="";this.variant="spinner";this.size="medium";this.overlay=true;this.progress=0;this.showProgress=false;this.animationFrame=null;this.hideTimeout=null;this.handleKeyPress=e=>{e.key==="Escape"&&this.visible&&!this.overlay&&this.hide();};}async onMount(){this.setupKeyboardListener(),this.initializeAccessibility(),window.addEventListener("languagechange",()=>{this.message||this.update();});}onUnmount(){this.animationFrame&&cancelAnimationFrame(this.animationFrame),this.hideTimeout&&clearTimeout(this.hideTimeout),document.removeEventListener("keydown",this.handleKeyPress);}render(){let e=[T.loader.container,this.overlay?`${T.loader.containerOverlay}`:"",`${T.loader.container}--${this.size}`].filter(Boolean).join(" ");return vdom.createElement("div",{className:e,"data-status":this.visible?"visible":"hidden",role:"status","aria-live":"polite","aria-busy":"true"},vdom.createElement("div",{className:T.loader.bg}),vdom.createElement("div",{className:T.loader.loader},this.renderSpinner(),this.renderMessage(),this.showProgress?this.renderProgressBar():null))}renderSpinner(){let e=`${T.spinner.container} ${T.spinner.container}--${this.variant}`;switch(this.variant){case "dots":return vdom.createElement("div",{className:e},vdom.createElement("div",{className:T.spinner.dot}),vdom.createElement("div",{className:T.spinner.dot}),vdom.createElement("div",{className:T.spinner.dot}));case "pulse":return vdom.createElement("div",{className:e},vdom.createElement("div",{className:T.spinner.pulse}));case "spinner":default:return vdom.createElement("div",{className:e},vdom.createElement("div",{className:T.spinner.icon}))}}renderMessage(){let e=this.message||h("global.loading");return vdom.createElement("div",{className:T.spinner.text,"data-translate":this.message?void 0:"global.loading"},e)}renderProgressBar(){return vdom.createElement("div",{className:T.progress.container},vdom.createElement("div",{className:T.progress.bar,style:`width: ${this.progress}%`,"aria-valuenow":this.progress.toString(),"aria-valuemin":"0","aria-valuemax":"100"}),vdom.createElement("div",{className:T.progress.text},`${Math.round(this.progress)}%`))}show(e){typeof e=="string"?this.message=e:e&&(this.message=e.message||"",this.variant=e.variant||"spinner",this.size=e.size||"medium",this.overlay=e.overlay!==void 0?e.overlay:true),this.visible=true,this.progress=0,this.showProgress=false,this.applyBodyLock(),this.update();}hide(e=0){this.hideTimeout&&clearTimeout(this.hideTimeout),e>0?this.hideTimeout=window.setTimeout(()=>{this.performHide();},e):this.performHide();}setMessage(e){this.message=e,this.update();}setProgress(e){this.showProgress=true,this.progress=Math.max(0,Math.min(100,e)),this.update();}updateProgress(e){this.setProgress(this.progress+e);}performHide(){this.visible=false,this.message="",this.progress=0,this.showProgress=false,this.removeBodyLock(),this.update();}applyBodyLock(){this.overlay&&(document.body.style.overflow="hidden");}removeBodyLock(){document.body.style.overflow="";}setupKeyboardListener(){this.handleKeyPress=this.handleKeyPress.bind(this),document.addEventListener("keydown",this.handleKeyPress);}initializeAccessibility(){let e=this.element?.querySelector(`.${T.spinner.container}`);e&&e.setAttribute("aria-label",h("loading"));}isVisible(){return this.visible}getStatus(){return {visible:this.visible,message:this.message,progress:this.progress}}};p([g],I.prototype,"visible"),p([g],I.prototype,"message"),p([g],I.prototype,"variant"),p([g],I.prototype,"size"),p([g],I.prototype,"overlay"),p([g],I.prototype,"progress"),p([g],I.prototype,"showProgress");var V=class extends m{constructor(e){super(e);this.fields=[];this.formData={};this.isSubmitting=false;this.submitError="";this.submitSuccess=false;this.fields=this.props.fields.map(n=>({...n,error:void 0,touched:false}));for(let n of this.fields)this.formData[n.name]=n.value||"";}onMount(){}handleChange(e,n){this.formData[e]=n;let r=this.fields.find(i=>i.name===e);r&&this.props.autoValidate&&(r.error=this.validateField(r,n),r.touched=true),this.update();}handleBlur(e){let n=this.fields.find(r=>r.name===e);n&&(n.touched=true,n.error=this.validateField(n,this.formData[e]),this.update());}validateField(e,n){let r=e.validation;if(!r)return;if(r.required&&!n)return r.message||`${e.label||e.name} is required`;if(!n)return;let i=String(n);if(r.minLength&&i.length<r.minLength)return r.message||`Minimum ${r.minLength} characters required`;if(r.maxLength&&i.length>r.maxLength)return r.message||`Maximum ${r.maxLength} characters allowed`;if(r.min!==void 0&&Number(n)<r.min)return r.message||`Minimum value is ${r.min}`;if(r.max!==void 0&&Number(n)>r.max)return r.message||`Maximum value is ${r.max}`;if(r.pattern&&!r.pattern.test(i))return r.message||"Invalid format";if(r.email&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(i))return r.message||"Invalid email format";if(r.url&&!/^https?:\/\/.+/.test(i))return r.message||"Invalid URL format";if(r.custom){let o=r.custom(n);if(o!==true)return typeof o=="string"?o:void 0}}validateForm(){let e=true,n={};for(let r of this.fields){let i=this.validateField(r,this.formData[r.name]);r.error=i,r.touched=true,i&&(e=false,n[r.name]=i);}return this.update(),!e&&this.props.onValidationError&&this.props.onValidationError(n),e}async handleSubmit(e){if(e.preventDefault(),!this.validateForm()){let n=this.fields.find(r=>r.error);n&&document.querySelector(`[name="${n.name}"]`)?.focus();return}this.isSubmitting=true,this.submitError="",this.submitSuccess=false,this.update();try{if(this.props.onSubmit)await this.props.onSubmit(this.formData,e);else if(this.props.endpoint){let n=await capi.api({method:this.props.method||"POST",url:this.props.endpoint,data:this.formData});this.submitSuccess=!0,this.props.onSuccess&&this.props.onSuccess(n.data);}}catch(n){let r=n instanceof Error?n.message:h("global.loading");this.submitError=r,this.props.onError&&this.props.onError(n);}finally{this.isSubmitting=false,this.update();}}renderLabel(e){return !e.label&&!e.icon?"":e.icon?vdom.html`
|
|
14
|
+
`;}}_handleScrollBehavior(t,e){if(t.hash){let n=document.getElementById(t.hash);if(n){n.scrollIntoView({behavior:this.scrollBehavior});return}}t.path!==e.path&&window.scrollTo({top:0,behavior:this.scrollBehavior});}_getCurrentPath(){if(this._internalPath!==null)return this._internalPath;if(this.mode==="hash")return window.location.hash.substring(1).split("?")[0]||"/";let t=window.location.pathname;return (!t||t==="blank"||t==="about:blank")&&(t="/"),this.base&&t.startsWith(this.base)&&(t=t.substring(this.base.length)),t||"/"}_buildFullPath(t){if(t.startsWith("http"))return t;let e=t.startsWith("/")?t:"/"+t;return this.base+e}_matchRoute(t){let e=t.split("?")[0].split("#")[0];for(let n of this.routes){let r=this._matchPath(n.path,e);if(r!==null)return {route:n,params:r}}return null}_matchPath(t,e){if(t==="*")return {};if(t===e)return {};let n=[],r=t.replace(/\*/g,".*").replace(/:([^/]+)/g,(a,l)=>(n.push(l),"([^/]+)")),i=new RegExp(`^${r}$`),o=e.match(i);return o?n.reduce((a,l,c)=>(a[l]=decodeURIComponent(o[c+1]),a),{}):null}_parseQuery(t){let e=t?t.includes("?")?t.split("?")[1].split("#")[0]:"":window.location.search.substring(1);return e?e.split("&").reduce((n,r)=>{let[i,o]=r.split("=").map(decodeURIComponent);return i&&(n[i]=o||""),n},{}):{}}},O=new ie;function we(s,t=false){t?O.replace(s):O.push(s),window.dispatchEvent(new CustomEvent("navigation",{detail:{path:s}}));}function Rt(){O.back();}function Ot(){window.history.forward();}function oe(){return window.location.pathname}function $t(s){return oe()===s}function Vt(s){return oe().startsWith(s)}function Ft(){let s=oe();we(s,true);}function Kt(s,t){let e=new URLSearchParams(t).toString();we(`${s}?${e}`);}function Re(){return new URLSearchParams(window.location.search)}function At(s){return Re().get(s)}var ae=class{constructor(t){this._subscribers=new Set;this._storage=null;this._middleware=[];this._isHydrating=false;if(this._persist=t.persist??false,this._storageKey=t.storageKey||`store_${Date.now()}`,this._persist&&typeof window<"u"&&(this._storage=t.storage==="sessionStorage"?sessionStorage:localStorage),this._persist&&this._storage){let e=this._loadFromStorage();this._state=e!==null?e:t.state;}else this._state=t.state;t.middleware&&(this._middleware=t.middleware);}get state(){return {...this._state}}set state(t){this.setState(t);}setState(t,e){let n={...this._state},r=typeof t=="function"?t(n):t;this._state={...n,...r};for(let i of this._middleware)try{i(this._state,e);}catch(o){console.error("Store middleware error:",o);}this._persist&&!this._isHydrating&&this._saveToStorage(),this._notify();}get(t){return this._state[t]}set(t,e,n){let r={[t]:e};this.setState(r,n);}subscribe(t){return this._subscribers.add(t),t(this._state),()=>{this._subscribers.delete(t);}}subscribeToKey(t,e){let n=this._state[t],r=i=>{let o=i[t];n!==o&&(n=o,e(o));};return this.subscribe(r)}use(t){this._middleware.push(t);}clear(){if(this._state={},this._persist&&this._storage)try{this._storage.removeItem(this._storageKey);}catch(t){console.error("Failed to clear storage:",t);}this._notify();}reset(t){this._state={...t},this._persist&&this._saveToStorage(),this._notify();}hydrate(){if(!this._persist||!this._storage){console.warn("Cannot hydrate: persistence not enabled");return}this._isHydrating=true;let t=this._loadFromStorage();t!==null&&(this._state=t,this._notify()),this._isHydrating=false;}getSnapshot(){return {state:{...this._state},subscribers:this._subscribers.size,storageKey:this._storageKey}}batch(t){let e=this._notify.bind(this),n=false;this._notify=()=>{n=true;};try{t();}finally{this._notify=e,n&&this._notify();}}_notify(){let t={...this._state};for(let e of this._subscribers)try{e(t);}catch(n){console.error("Store subscriber error:",n);}}_loadFromStorage(){if(!this._storage)return null;try{let t=this._storage.getItem(this._storageKey);return t?JSON.parse(t):null}catch(t){return console.error("Failed to load from storage:",t),null}}_saveToStorage(){if(this._storage)try{this._storage.setItem(this._storageKey,JSON.stringify(this._state));}catch(t){console.error("Failed to save to storage:",t),t instanceof DOMException&&t.name==="QuotaExceededError"&&console.warn("Storage quota exceeded");}}destroy(){this._subscribers.clear(),this._middleware=[],this._state={};}};function Oe(s){return new ae(s)}function Dt(s,t){let e=Oe({state:{value:t(...s.map(n=>n.state))}});for(let n of s)n.subscribe(()=>{e.setState({value:t(...s.map(r=>r.state))});});return e}function Ut(s,t,e){return s.subscribe(r=>{let i=e(r);Object.assign(t,i),typeof t.update=="function"&&t.update();})}function qt(s){let t=s;return {async build(){if(!t.build){console.warn("No build configuration provided");return}console.log("\u{1F528} Building @je-es/client application...");try{await this._buildJS(),await this._buildStyles(),console.log("\u2705 Build completed successfully!");}catch(e){throw console.error("\u274C Build error:",e),e}},async _buildJS(){if(!t.build)return;let e=await Bun.build({entrypoints:[t.build.entry],outdir:t.build.output.substring(0,t.build.output.lastIndexOf("/")),target:"browser",minify:t.build.minify??false,sourcemap:t.build.sourcemap?"external":"none",splitting:t.build.optimization?.splitChunks??false,naming:{entry:t.build.output.substring(t.build.output.lastIndexOf("/")+1)},external:["sass","fs","path","url","util","stream","buffer","events","crypto","os","child_process"]});if(!e.success)throw console.error("\u274C JS Build failed:",e.logs),new Error("JS Build failed")},async _buildStyles(){let e=t.build?.styles?.input||"./app/gui/style",n=t.build?.styles?.output||"./static/client.css",r=await import('sass'),{writeFileSync:i,existsSync:o,mkdirSync:a}=await import('fs'),{join:l,dirname:c}=await import('path'),u=c(n),d=n.split("/").pop()||"client.css",y=l(e,"index.scss");if(!o(y)){console.log("\u26A0\uFE0F No index.scss found, skipping CSS build");return}try{o(u)||a(u,{recursive:!0});let K=r.compile(y,{style:t.build?.minify?"compressed":"expanded",sourceMap:!!t.build?.sourcemap,loadPaths:[e]}),me=l(u,d);i(me,K.css,"utf-8"),t.build?.sourcemap&&K.sourceMap&&i(`${me}.map`,JSON.stringify(K.sourceMap),"utf-8");}catch(K){throw console.error("\u274C CSS Build failed:",K),K}},async _collectScssFiles(e){let{readdirSync:n,statSync:r,existsSync:i}=await import('fs'),{join:o,extname:a}=await import('path'),l=[];if(!i(e))return l;let c=n(e);for(let u of c){let d=o(e,u),y=r(d);y.isDirectory()?l.push(...await this._collectScssFiles(d)):y.isFile()&&a(u)===".scss"&&!u.startsWith("_")&&l.push(d);}return l.sort()},async watch(){console.log("\u{1F440} Watching for changes..."),await this.build();let{watch:e}=await import('fs'),{dirname:n}=await import('path'),{existsSync:r}=await import('fs');if(t.build?.entry){let o=n(t.build.entry);e(o,{recursive:true},async(a,l)=>{if(l&&(l.endsWith(".ts")||l.endsWith(".tsx"))){console.log(`\u{1F504} ${l} changed, rebuilding JS...`);try{await this._buildJS(),console.log("\u2705 JS rebuild complete");}catch(c){console.error("\u274C JS rebuild failed:",c);}}});}let i="./app/style";r(i)&&e(i,{recursive:true},async(o,a)=>{if(a&&a.endsWith(".scss")){console.log(`\u{1F504} ${a} changed, rebuilding CSS...`);try{await this._buildStyles(),console.log("\u2705 CSS rebuild complete");}catch(l){console.error("\u274C CSS rebuild failed:",l);}}});},async init(){if(console.log("\u{1F680} [client] Initializing @je-es/client..."),t.api){let e={baseURL:t.api.baseURL,timeout:t.api.timeout,headers:t.api.headers};t.api.interceptors&&(e.interceptors={request:t.api.interceptors.request||null,response:t.api.interceptors.response||null,error:t.api.interceptors.error||null}),capi.configureApi(e);}t.router&&t.app?.routes&&(O.init(t.app.routes,t.router.mode,t.router.base),t.router.beforeEach&&O.beforeEach(t.router.beforeEach),t.router.afterEach&&O.afterEach(t.router.afterEach)),t.app?.root&&(document.querySelector(t.app.root)||console.error(`\u274C Root element "${t.app.root}" not found`)),t.devTools?.enabled&&this._enableDevTools();},_enableDevTools(){window.__JEES_DEV__={router:O,config:t,version:"0.0.1"};},getConfig(){return t}}}var z=class{constructor(t){this.translations={};this.currentLanguage="en";this.defaultLanguage="en";this.supportedLanguages=new Set(["en"]);this.cachePath="";this.readyListeners=[];t&&(this.defaultLanguage=t.defaultLanguage||"en",this.cachePath=t.staticPath||"static/i18n",this.currentLanguage=this.getStoredLanguage()||t.defaultLanguage||"en",t.supportedLanguages&&(this.supportedLanguages=new Set(t.supportedLanguages)));}loadLanguage(t,e){this.translations[t]||(this.translations[t]={}),this.translations[t]={...this.translations[t],...e},this.supportedLanguages.add(t);}loadTranslations(t){Object.entries(t).forEach(([e,n])=>{this.loadLanguage(e,n);});}setLanguage(t){this.supportedLanguages.has(t)?(this.currentLanguage=t,this.storeLanguage(t),this.dispatchLanguageChangeEvent()):this.supportedLanguages.has(this.defaultLanguage)&&(this.currentLanguage=this.defaultLanguage);}getLanguage(){return this.currentLanguage}getSupportedLanguages(){return Array.from(this.supportedLanguages)}t(t,e,n){let r=this.currentLanguage,i=this.getTranslation(t,n);return e&&Object.entries(e).forEach(([o,a])=>{let l=this.translations[r]?.[a]||this.translations[this.defaultLanguage]?.[a]||a;i=i.replace(new RegExp(`\\{${o}\\}`,"g"),l);}),i}getTranslation(t,e){let n=this.currentLanguage;return this.translations[n]?.[t]?this.translations[n]?.[t]||this.translations[this.defaultLanguage]?.[t]:(console.warn(`Translation key not found: ${t}`),e||t)}tLang(t,e,n){let r=this.currentLanguage;this.currentLanguage=e;let i=this.t(t,n);return this.currentLanguage=r,i}tHtml(t,e,n){let r=this.t(t,e,n);return this.parseHtmlString(r)}parseHtmlString(t){let e=t.replace(/\\n|\/n/g,"<br>"),n=[],r=/<([^/>]+)>([^<]*)<\/\1>|<([^/>]+)\s*\/?>|([^<]+)/g,i;for(;(i=r.exec(e))!==null;){let o=i[1],a=i[2],l=i[3],c=i[4];if(c)n.push(c);else if(o){let u=o.split(/\s+/)[0].toLowerCase();n.push(vdom.createElement(u,{},a));}else if(l){let u=l.trim().toLowerCase();n.push(vdom.createElement(u,{}));}}return n.length>0?n:[t]}getTranslations(){return this.translations[this.currentLanguage]||{}}hasKey(t){return !!(this.translations[this.currentLanguage]?.[t]||this.translations[this.defaultLanguage]?.[t])}createTranslator(t){let e=()=>t();return typeof window<"u"?(window.addEventListener("languagechange",e),()=>window.removeEventListener("languagechange",e)):()=>{}}async loadFromUrl(t){let e=Array.isArray(t)?t:[t],n={};for(let r of e)if(r.includes("*")){let i=r.replace("*.json",""),o=this.supportedLanguages;for(let a of o)try{let l=`${i}${a}.json`;typeof window<"u"&&!l.startsWith("http")&&(l=window.location.origin+(l.startsWith("/")?l:"/"+l));let c=await fetch(l);if(c.ok){let u=await c.json();n[a]=u;}}catch{}}else try{let i=r;typeof window<"u"&&!i.startsWith("http")&&(i=window.location.origin+(i.startsWith("/")?i:"/"+i));let o=await fetch(i);if(o.ok){let a=await o.json(),l=r.match(/([a-z]{2,3})\.json$/i),c=l?l[1].toLowerCase():"en";n[c]=a,this.supportedLanguages.add(c);}}catch{}Object.keys(n).length>0&&(this.loadTranslations(n),this.notifyReady());}onReady(t){Object.keys(this.translations).length>0?t():this.readyListeners.push(t);}notifyReady(){for(let t of this.readyListeners)t();this.readyListeners=[];}getStoredLanguage(){return typeof localStorage<"u"&&localStorage.getItem("app-language")||null}storeLanguage(t){typeof localStorage<"u"&&localStorage.setItem("app-language",t);}dispatchLanguageChangeEvent(){typeof window<"u"&&window.dispatchEvent(new CustomEvent("languagechange",{detail:{language:this.currentLanguage}}));}},B=null;function S(){return B||(B=new z),B}function h(s,t,e){return S().t(s,t,e)}function Jt(s,t,e){return S().tLang(s,t,e)}function le(s,t,e){return S().tHtml(s,t,e)}function Qt(s){S().setLanguage(s);}async function Yt(s,t){let e=S(),n=e.getTranslations();if(!(Object.keys(n).length>0)&&t){let i=t.endsWith("/")?t:t+"/";try{await e.loadFromUrl(i+`${s}.json`);}catch(o){console.warn(`Failed to lazy-load language: ${s}`,o);}}e.setLanguage(s);}function Zt(){return S().getLanguage()}function Xt(s,t){S().loadLanguage(s,t);}function en(s){S().loadTranslations(s);}function tn(){return S().getSupportedLanguages()}function nn(s){return S().hasKey(s)}function rn(){return S().getTranslations()}function sn(s){return S().createTranslator(s)}async function on(s){return S().loadFromUrl(s)}function an(s){B=new z(s);}async function ln(s){let t=new z(s);if(B=t,s.staticPath){let e=s.staticPath.endsWith("/")?s.staticPath:s.staticPath+"/",n=t.getLanguage(),r=e+`${n}.json`;await t.loadFromUrl(r);}}async function cn(s,t){let e=S(),n=t||"static/i18n",i=(n.endsWith("/")?n:n+"/")+s+".json";await e.loadFromUrl(i);}var j={toast:"bb_toast",container:"bb_toastContainer",icon:"bb_toastIcon",msg:"bb_toastMsg"},Y=class extends m{constructor(){super(...arguments);this.messages=[];this.nextId=0;}show(e,n="info",r=2e3,i){let o=this.nextId++;this.messages=[...this.messages,{id:o,message:e,type:n,translateKey:i}],setTimeout(()=>{this.messages=this.messages.filter(a=>a.id!==o);},r);}success(e,n,r){this.show(e,"success",n,r);}error(e,n,r){this.show(e,"error",n,r);}info(e,n,r){this.show(e,"info",n,r);}warning(e,n,r){this.show(e,"warning",n,r);}render(){return this.messages.length===0?vdom.html``:vdom.createElement("div",{className:j.container},...this.messages.map(e=>this.renderToast(e)))}renderToast(e){let n={success:"fas fa-check-circle",error:"fas fa-exclamation-circle",info:"fas fa-info-circle",warning:"fas fa-exclamation-triangle"},r=e.translateKey?h(e.translateKey):e.message;return vdom.createElement("div",{key:String(e.id),className:`${j.toast} ${j.toast}--${e.type}`,"data-translate":e.translateKey||void 0},vdom.createElement("i",{className:`${n[e.type]} ${j.icon}`}),vdom.createElement("span",{className:j.msg},r))}};p([g],Y.prototype,"messages");var $=null;function Fe(s){if($)return $;let t=s||document.createElement("div");return s||document.body.appendChild(t),$=new Y,$.mount(t),$}function q(){return $||($=Fe()),$}var fn={show:(s,t="info",e,n)=>{q().show(s,t,e,n);},success:(s,t,e)=>{q().success(s,t,e);},error:(s,t,e)=>{q().error(s,t,e);},info:(s,t,e)=>{q().info(s,t,e);},warning:(s,t,e)=>{q().warning(s,t,e);}};var T={loader:{container:"bb_loaderContainer",containerOverlay:"bb_loaderContainer--overlay",bg:"bb_loaderBg",loader:"bb_loader"},spinner:{container:"bb_loaderSpinnerContainer",icon:"bb_loaderSpinnerIcon",dot:"bb_loaderSpinnerDot",pulse:"bb_loaderSpinnerPulse",text:"bb_loaderSpinnerText"},progress:{container:"bb_loaderProgressContainer",bar:"bb_loaderProgressBar",text:"bb_loaderProgressText"}},I=class extends m{constructor(){super(...arguments);this.visible=false;this.message="";this.variant="spinner";this.size="medium";this.overlay=true;this.progress=0;this.showProgress=false;this.animationFrame=null;this.hideTimeout=null;this.handleKeyPress=e=>{e.key==="Escape"&&this.visible&&!this.overlay&&this.hide();};}async onMount(){this.setupKeyboardListener(),this.initializeAccessibility(),window.addEventListener("languagechange",()=>{this.message||this.update();});}onUnmount(){this.animationFrame&&cancelAnimationFrame(this.animationFrame),this.hideTimeout&&clearTimeout(this.hideTimeout),document.removeEventListener("keydown",this.handleKeyPress);}render(){let e=[T.loader.container,this.overlay?`${T.loader.containerOverlay}`:"",`${T.loader.container}--${this.size}`].filter(Boolean).join(" ");return vdom.createElement("div",{className:e,"data-status":this.visible?"visible":"hidden",role:"status","aria-live":"polite","aria-busy":"true"},vdom.createElement("div",{className:T.loader.bg}),vdom.createElement("div",{className:T.loader.loader},this.renderSpinner(),this.renderMessage(),this.showProgress?this.renderProgressBar():null))}renderSpinner(){let e=`${T.spinner.container} ${T.spinner.container}--${this.variant}`;switch(this.variant){case "dots":return vdom.createElement("div",{className:e},vdom.createElement("div",{className:T.spinner.dot}),vdom.createElement("div",{className:T.spinner.dot}),vdom.createElement("div",{className:T.spinner.dot}));case "pulse":return vdom.createElement("div",{className:e},vdom.createElement("div",{className:T.spinner.pulse}));case "spinner":default:return vdom.createElement("div",{className:e},vdom.createElement("div",{className:T.spinner.icon}))}}renderMessage(){let e=this.message||h("global.loading");return vdom.createElement("div",{className:T.spinner.text,"data-translate":this.message?void 0:"global.loading"},e)}renderProgressBar(){return vdom.createElement("div",{className:T.progress.container},vdom.createElement("div",{className:T.progress.bar,style:`width: ${this.progress}%`,"aria-valuenow":this.progress.toString(),"aria-valuemin":"0","aria-valuemax":"100"}),vdom.createElement("div",{className:T.progress.text},`${Math.round(this.progress)}%`))}show(e){typeof e=="string"?this.message=e:e&&(this.message=e.message||"",this.variant=e.variant||"spinner",this.size=e.size||"medium",this.overlay=e.overlay!==void 0?e.overlay:true),this.visible=true,this.progress=0,this.showProgress=false,this.applyBodyLock(),this.update();}hide(e=0){this.hideTimeout&&clearTimeout(this.hideTimeout),e>0?this.hideTimeout=window.setTimeout(()=>{this.performHide();},e):this.performHide();}setMessage(e){this.message=e,this.update();}setProgress(e){this.showProgress=true,this.progress=Math.max(0,Math.min(100,e)),this.update();}updateProgress(e){this.setProgress(this.progress+e);}performHide(){this.visible=false,this.message="",this.progress=0,this.showProgress=false,this.removeBodyLock(),this.update();}applyBodyLock(){this.overlay&&(document.body.style.overflow="hidden");}removeBodyLock(){document.body.style.overflow="";}setupKeyboardListener(){this.handleKeyPress=this.handleKeyPress.bind(this),document.addEventListener("keydown",this.handleKeyPress);}initializeAccessibility(){let e=this.element?.querySelector(`.${T.spinner.container}`);e&&e.setAttribute("aria-label",h("loading"));}isVisible(){return this.visible}getStatus(){return {visible:this.visible,message:this.message,progress:this.progress}}};p([g],I.prototype,"visible"),p([g],I.prototype,"message"),p([g],I.prototype,"variant"),p([g],I.prototype,"size"),p([g],I.prototype,"overlay"),p([g],I.prototype,"progress"),p([g],I.prototype,"showProgress");var V=class extends m{constructor(e){super(e);this.fields=[];this.formData={};this.isSubmitting=false;this.submitError="";this.submitSuccess=false;this.fields=this.props.fields.map(n=>({...n,error:void 0,touched:false}));for(let n of this.fields)this.formData[n.name]=n.value||"";}onMount(){}handleChange(e,n){this.formData[e]=n;let r=this.fields.find(i=>i.name===e);r&&this.props.autoValidate&&(r.error=this.validateField(r,n),r.touched=true),this.update();}handleBlur(e){let n=this.fields.find(r=>r.name===e);n&&(n.touched=true,n.error=this.validateField(n,this.formData[e]),this.update());}validateField(e,n){let r=e.validation;if(!r)return;if(r.required&&!n)return r.message||`${e.label||e.name} is required`;if(!n)return;let i=String(n);if(r.minLength&&i.length<r.minLength)return r.message||`Minimum ${r.minLength} characters required`;if(r.maxLength&&i.length>r.maxLength)return r.message||`Maximum ${r.maxLength} characters allowed`;if(r.min!==void 0&&Number(n)<r.min)return r.message||`Minimum value is ${r.min}`;if(r.max!==void 0&&Number(n)>r.max)return r.message||`Maximum value is ${r.max}`;if(r.pattern&&!r.pattern.test(i))return r.message||"Invalid format";if(r.email&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(i))return r.message||"Invalid email format";if(r.url&&!/^https?:\/\/.+/.test(i))return r.message||"Invalid URL format";if(r.custom){let o=r.custom(n);if(o!==true)return typeof o=="string"?o:void 0}}validateForm(){let e=true,n={};for(let r of this.fields){let i=this.validateField(r,this.formData[r.name]);r.error=i,r.touched=true,i&&(e=false,n[r.name]=i);}return this.update(),!e&&this.props.onValidationError&&this.props.onValidationError(n),e}async handleSubmit(e){if(e.preventDefault(),!this.validateForm()){let n=this.fields.find(r=>r.error);n&&document.querySelector(`[name="${n.name}"]`)?.focus();return}this.isSubmitting=true,this.submitError="",this.submitSuccess=false,this.update();try{if(this.props.onSubmit)await this.props.onSubmit(this.formData,e);else if(this.props.endpoint){let n=await capi.api({method:this.props.method||"POST",url:this.props.endpoint,data:this.formData});this.submitSuccess=!0,this.props.onSuccess&&this.props.onSuccess(n.data);}}catch(n){let r=n instanceof Error?n.message:h("global.loading");this.submitError=r,this.props.onError&&this.props.onError(n);}finally{this.isSubmitting=false,this.update();}}renderLabel(e){return !e.label&&!e.icon?"":e.icon?vdom.html`
|
|
15
15
|
<label for=${e.name}>
|
|
16
16
|
<i class="fa ${e.icon}"></i>
|
|
17
17
|
${e.label?vdom.html`<span>${e.label}</span>`:""}
|
|
@@ -23,47 +23,43 @@
|
|
|
23
23
|
id=${e.name}
|
|
24
24
|
name=${e.name}
|
|
25
25
|
placeholder=${e.placeholder||""}
|
|
26
|
-
value=${String(n)}
|
|
27
26
|
disabled=${String(e.disabled||this.isSubmitting)}
|
|
28
27
|
oninput=${i=>{let o=i.target;this.handleChange(e.name,o.value);}}
|
|
29
28
|
onblur=${()=>this.handleBlur(e.name)}
|
|
30
29
|
class="bb_formFieldTextarea"
|
|
31
|
-
|
|
30
|
+
>${String(n)}</textarea>
|
|
32
31
|
${e.error&&e.touched?vdom.html`
|
|
33
32
|
<span class="field-error">${e.error}</span>
|
|
34
33
|
`:""}
|
|
35
34
|
</div>
|
|
36
|
-
`;case "select":{let o=(e.options||[]).map(a=>vdom.html`
|
|
37
|
-
<option value=${String(a.value)}>${a.label}</option>
|
|
38
|
-
`);return vdom.html`
|
|
35
|
+
`;case "select":{let o=(e.options||[]).map(a=>{let l=String(a.value)===String(n);return vdom.html`<option value=${String(a.value)} selected=${l}>${a.label}</option>`});return vdom.html`
|
|
39
36
|
<div class="bb_formField ${e.className||""}">
|
|
40
37
|
${r}
|
|
41
38
|
<select
|
|
42
39
|
id=${e.name}
|
|
43
40
|
name=${e.name}
|
|
44
|
-
value=${String(n)}
|
|
45
41
|
disabled=${String(e.disabled||this.isSubmitting)}
|
|
46
42
|
onchange=${a=>{let l=a.target;this.handleChange(e.name,l.value);}}
|
|
47
43
|
onblur=${()=>this.handleBlur(e.name)}
|
|
48
44
|
class="bb_formFieldSelect"
|
|
49
45
|
>
|
|
50
|
-
<option value=""
|
|
46
|
+
<option value="" selected=${String(n)===""}>${h("global.please_select",{},"Select...")}</option>
|
|
51
47
|
${o}
|
|
52
48
|
</select>
|
|
53
49
|
${e.error&&e.touched?vdom.html`
|
|
54
50
|
<span class="field-error">${e.error}</span>
|
|
55
51
|
`:""}
|
|
56
52
|
</div>
|
|
57
|
-
`}case "checkbox":return vdom.html`
|
|
53
|
+
`}case "checkbox":{let i=!!n;return vdom.html`
|
|
58
54
|
<div class="bb_formField bb_formField-checkbox ${e.className||""}">
|
|
59
55
|
<label>
|
|
60
56
|
<input
|
|
61
57
|
type="checkbox"
|
|
62
58
|
id=${e.name}
|
|
63
59
|
name=${e.name}
|
|
64
|
-
checked=${
|
|
60
|
+
checked=${i}
|
|
65
61
|
disabled=${String(e.disabled||this.isSubmitting)}
|
|
66
|
-
onchange=${
|
|
62
|
+
onchange=${o=>{let a=o.target;this.handleChange(e.name,a.checked);}}
|
|
67
63
|
class="bb_formFieldCheckbox"
|
|
68
64
|
/>
|
|
69
65
|
${e.icon?vdom.html`<i class="fa ${e.icon}"></i>`:""}
|
|
@@ -73,7 +69,7 @@
|
|
|
73
69
|
<span class="field-error">${e.error}</span>
|
|
74
70
|
`:""}
|
|
75
71
|
</div>
|
|
76
|
-
|
|
72
|
+
`}default:return vdom.html`
|
|
77
73
|
<div class="bb_formField ${e.className||""}">
|
|
78
74
|
${r}
|
|
79
75
|
<input
|
|
@@ -114,5 +110,5 @@
|
|
|
114
110
|
${this.isSubmitting?e.loadingLabel||h("global.loading"):e.label||h("global.loading")}
|
|
115
111
|
</button>
|
|
116
112
|
</form>
|
|
117
|
-
`}styles(){return be``}};p([g],V.prototype,"fields"),p([g],V.prototype,"formData"),p([g],V.prototype,"isSubmitting"),p([g],V.prototype,"submitError"),p([g],V.prototype,"submitSuccess");function _e(s){return new V(s).render()}var w={container:"bb_popupContainer",overlay:"bb_popupOverlay",popup:{base:"bb_popup",close:"bb_popupClose"},header:{container:"bb_popupHeader",icon:"bb_popupHeaderIcon",content:"bb_popupHeaderContent",title:"bb_popupHeaderContentTitle",description:"bb_popupHeaderContentDesc"},body:{container:"bb_popupBody",message:"bb_popupBodyMsg",input:"bb_popupBodyInput",formContainer:"bb_popupBodyFormContainer"},footer:"bb_popupFooter",button:"bb_btn"},Z=class extends m{constructor(){super(...arguments);this.popups=[];this.nextId=0;}async onMount(){this.setupKeyboardListener(),window.addEventListener("languagechange",()=>{this.update();});}onUnmount(){this.handleEscapeKey&&document.removeEventListener("keydown",this.handleEscapeKey);}render(){return this.popups.length===0?vdom.createElement("div",{className:w.container}):vdom.createElement("div",{className:w.container},...this.popups.map(e=>this.renderPopup(e)))}renderPopup(e){let n=`bb_popup--${e.size||"medium"}`,r=e.variant?`bb_popup--${e.variant}`:"";return vdom.createElement("div",{key:String(e.id),className:w.overlay,"data-popup-id":e.id,onClick:i=>{i.target.classList.contains(w.overlay)&&e.closeOnOverlay!==false&&this.closePopup(e.id,false);}},vdom.createElement("div",{className:`${w.popup.base} ${n} ${r}`,role:"dialog","aria-modal":"true","aria-labelledby":`popup-title-${e.id}`},e.showCloseButton!==false?vdom.createElement("button",{className:w.popup.close,onClick:()=>this.closePopup(e.id,false),"aria-label":"Close"},vdom.createElement("i",{className:"fas fa-times"})):null,vdom.createElement("div",{className:w.header.container},e.icon?vdom.createElement("div",{className:w.header.icon},vdom.createElement("i",{className:e.icon})):null,vdom.createElement("div",{className:w.header.content},vdom.createElement("h2",{id:`popup-title-${e.id}`,className:w.header.title,"data-translate":e.titleTranslateKey},e.titleTranslateKey?h(e.titleTranslateKey):e.title),e.description?vdom.createElement("p",{className:w.header.description,"data-translate":e.descriptionTranslateKey},e.descriptionTranslateKey?le(e.descriptionTranslateKey):e.description):null)),vdom.createElement("div",{className:w.body.container},e.message?vdom.createElement("p",{className:w.body.message,"data-translate":e.messageTranslateKey},e.messageTranslateKey?le(e.messageTranslateKey):e.message):null,e.type==="prompt"?vdom.createElement("input",{type:"text",className:w.body.input,value:e.inputValue||"",placeholder:h("popup.prompt.placeholder"),"data-translate":"popup.prompt.placeholder",onInput:i=>{e.inputValue=i.target.value;}}):null,e.type==="form"&&e.formConfig?vdom.createElement("div",{className:w.body.formContainer},_e(e.formConfig)):null,e.customContent||null),e.buttons&&e.buttons.length>0&&e.type!=="form"?vdom.createElement("div",{className:w.footer},...e.buttons.map(i=>vdom.createElement("button",{className:`${w.button} ${i.variant||"secondary"}`,"data-translate":i.translateKey,disabled:i.loading||e.isSubmitting,onClick:async()=>{i.loading||e.isSubmitting||await i.onClick();}},i.icon?vdom.createElement("i",{className:i.icon}):null,i.loading||e.isSubmitting?vdom.createElement("i",{className:"fas fa-spinner fa-spin"}):null," ",i.translateKey?h(i.translateKey):i.label))):null))}show(e){return new Promise(n=>{let r=this.nextId++,i={...e,id:r,resolve:n,type:e.type||"custom",size:e.size||"medium",closeOnOverlay:e.closeOnOverlay!==false,closeOnEscape:e.closeOnEscape!==false,showCloseButton:e.showCloseButton!==false,isSubmitting:false};this.popups=[...this.popups,i],this.applyBodyLock(),this.update();})}showForm(e){return new Promise((n,r)=>{let i=this.nextId++,o={...e.formConfig,onSubmit:async l=>{let c=this.popups.find(u=>u.id===i);c&&(c.isSubmitting=true,this.update());try{e.formConfig.onSubmit&&await e.formConfig.onSubmit(l,void 0),this.closePopup(i,l),n(l);}catch(u){c&&(c.isSubmitting=false,this.update()),e.formConfig.onError&&e.formConfig.onError(u);}},submitButton:{...e.formConfig.submitButton,className:e.formConfig.submitButton?.className||`${w.button} primary wide`}},a={title:e.title,titleTranslateKey:e.titleTranslateKey,description:e.description,descriptionTranslateKey:e.descriptionTranslateKey,type:"form",variant:e.variant||"default",size:e.size||"medium",icon:e.icon,formConfig:o,closeOnOverlay:e.closeOnOverlay!==false,closeOnEscape:e.closeOnEscape!==false,showCloseButton:e.showCloseButton!==false,id:i,resolve:n,isSubmitting:false};this.popups=[...this.popups,a],this.applyBodyLock(),this.update();})}confirm(e){return new Promise(n=>{let r=this.nextId++,i={id:r,title:e.title,titleTranslateKey:e.titleTranslateKey,message:e.message,messageTranslateKey:e.messageTranslateKey,type:"confirm",variant:e.variant||"default",size:e.size||"small",icon:e.icon,resolve:n,onConfirm:e.onConfirm,onCancel:e.onCancel,buttons:[{label:e.cancelLabel||"Cancel",translateKey:e.cancelTranslateKey||"button.cancel",variant:"secondary",icon:"fas fa-times",onClick:async()=>{e.onCancel&&await e.onCancel(),this.closePopup(r,false);}},{label:e.confirmLabel||"Confirm",translateKey:e.confirmTranslateKey||"button.confirm",variant:e.variant==="danger"?"danger":"primary",icon:"fas fa-check",onClick:async()=>{e.onConfirm&&await e.onConfirm(),this.closePopup(r,true);}}]};this.popups=[...this.popups,i],this.applyBodyLock(),this.update();})}alert(e){return new Promise(n=>{let r=this.nextId++,i={id:r,title:e.title,titleTranslateKey:e.titleTranslateKey,message:e.message,messageTranslateKey:e.messageTranslateKey,type:"alert",variant:e.variant||"info",size:e.size||"small",icon:e.icon,resolve:n,onConfirm:e.onConfirm,buttons:[{label:e.okLabel||"OK",translateKey:e.okTranslateKey||"popup.ok",variant:"primary",icon:"fas fa-check",onClick:async()=>{e.onConfirm&&await e.onConfirm(),this.closePopup(r,true);}}]};this.popups=[...this.popups,i],this.applyBodyLock(),this.update();})}prompt(e){return new Promise(n=>{let r=this.nextId++,i={id:r,title:e.title,titleTranslateKey:e.titleTranslateKey,message:e.message,messageTranslateKey:e.messageTranslateKey,type:"prompt",variant:"default",icon:e.icon,inputValue:e.defaultValue||"",resolve:n,onConfirm:e.onConfirm,onCancel:e.onCancel,buttons:[{label:e.cancelLabel||"Cancel",translateKey:e.cancelTranslateKey||"popup.cancel",variant:"secondary",onClick:async()=>{e.onCancel&&await e.onCancel(),this.closePopup(r,null);}},{label:e.confirmLabel||"OK",translateKey:e.confirmTranslateKey||"popup.ok",variant:"primary",onClick:async()=>{let o=i.inputValue||"";e.onConfirm&&await e.onConfirm(o),this.closePopup(r,o);}}]};this.popups=[...this.popups,i],this.applyBodyLock();})}closePopup(e,n){let r=this.popups.find(i=>i.id===e);r?.resolve&&r.resolve(n),this.popups=this.popups.filter(i=>i.id!==e),this.popups.length===0&&this.removeBodyLock(),this.update();}closeAll(){this.popups.forEach(e=>{e.resolve&&e.resolve(false);}),this.popups=[],this.removeBodyLock(),this.update();}applyBodyLock(){document.body.style.overflow="hidden";}removeBodyLock(){document.body.style.overflow="";}setupKeyboardListener(){this.handleEscapeKey=e=>{if(e.key==="Escape"&&this.popups.length>0){let n=this.popups[this.popups.length-1];n.closeOnEscape!==false&&this.closePopup(n.id,false);}},document.addEventListener("keydown",this.handleEscapeKey);}};p([g],Z.prototype,"popups");var F=null;function Ae(s){if(F)return F;let t=s||document.createElement("div");return s||document.body.appendChild(t),F=new Z,F.mount(t),F}function M(){return F||(F=Ae()),F}var An={show:s=>M().show(s),confirm:s=>M().confirm(s),alert:s=>M().alert(s),prompt:s=>M().prompt(s),showForm:s=>M().showForm(s),closePopup:(s,t)=>M().closePopup(s,t),closeLastPopup:()=>M().closePopup(M().popups.length-1,false),closeFirstPopup:()=>M().closePopup(0,false),closeAll:()=>M().closeAll()};var P={container:"bb_tabbedview",header:"bb_tabbedviewHeader",tab:{base:"bb_tabbedviewTab",active:"bb_tabbedviewTab--active",disabled:"bb_tabbedviewTab--disabled",badge:"bb_tabbedviewBadge"},content:{container:"bb_tabbedviewContent",emptyState:"bb_tabbedviewEmptyState",error:"bb_tabbedviewError"}},x=class extends m{constructor(){super(...arguments);this.activeTabId="";this.tabs=[];this.position="top";this.style="default";this.className="";this.headerClassName="";this.contentClassName="";this.showTabCount=false;this.persistState=false;this.storageKey="tabbedview-active";this.currentTabComponent=null;}async onMount(){window.addEventListener("languagechange",()=>{this.update();});}onUnmount(){this.currentTabComponent&&typeof this.currentTabComponent.onUnmount=="function"&&this.currentTabComponent.onUnmount();}init(e){if(this.tabs=e.tabs,this.position=e.position||"top",this.style=e.style||"default",this.className=e.className||"",this.headerClassName=e.headerClassName||"",this.contentClassName=e.contentClassName||"",this.showTabCount=e.showTabCount||false,this.persistState=e.persistState||false,this.storageKey=e.storageKey||"tabbedview-active",this.onChange=e.onChange,this.persistState){let n=localStorage.getItem(this.storageKey);n&&this.tabs.find(r=>r.id===n)&&(this.activeTabId=n);}return this.activeTabId||(this.activeTabId=e.defaultTab||this.tabs[0]?.id||""),this.update(),this}async setActiveTab(e){let n=this.tabs.find(r=>r.id===e);!n||n.disabled||(this.currentTabComponent&&typeof this.currentTabComponent.onUnmount=="function"&&this.currentTabComponent.onUnmount(),this.currentTabComponent=null,this.activeTabId=e,this.persistState&&localStorage.setItem(this.storageKey,e),n.onActivate&&await n.onActivate(),this.onChange&&await this.onChange(e),this.update());}addTab(e){this.tabs=[...this.tabs,e],this.update();}removeTab(e){this.tabs=this.tabs.filter(n=>n.id!==e),this.activeTabId===e&&this.tabs.length>0&&(this.activeTabId=this.tabs[0].id),this.update();}updateTab(e,n){let r=this.tabs.find(i=>i.id===e);r&&(Object.assign(r,n),this.update());}getActiveTab(){return this.tabs.find(e=>e.id===this.activeTabId)}render(){let e=[P.container,`bb_tabbedview__--${this.position}`,`bb_tabbedview__--${this.style}`,this.className].filter(Boolean).join(" ");return vdom.createElement("div",{className:e},this.renderTabList(),this.renderTabContent())}renderTabList(){let e=[P.header,this.headerClassName].filter(Boolean).join(" ");return vdom.createElement("div",{className:e},...this.tabs.map(n=>this.renderTab(n)))}renderTab(e){let n=this.activeTabId===e.id,r=[P.tab.base,n?P.tab.active:"",e.disabled?P.tab.disabled:""].filter(Boolean).join(" "),i=e.translateKey?h(e.translateKey):e.label;return vdom.createElement("button",{key:e.id,className:r,onclick:()=>this.setActiveTab(e.id),disabled:e.disabled,"data-translate":e.translateKey,"aria-selected":n,role:"tab"},e.icon?vdom.createElement("i",{className:e.icon}):null,vdom.createElement("span",{},i),e.badge!==void 0&&e.badge!==null&&e.badge!==0?vdom.createElement("span",{className:P.tab.badge},typeof e.badge=="number"&&e.badge>99?"99+":String(e.badge)):null)}renderTabContent(){let e=[P.content.container,this.contentClassName].filter(Boolean).join(" "),n=this.getActiveTab();return n?vdom.createElement("div",{className:e,role:"tabpanel"},this.renderActiveTabContent(n)):vdom.createElement("div",{className:e},vdom.createElement("div",{className:P.content.emptyState},vdom.createElement("p",{},h("global.loading"))))}renderActiveTabContent(e){if(e.component)try{if(e.component instanceof m){this.currentTabComponent=e.component;let n=this.currentTabComponent.render(),r={...n.props,ref:o=>{o&&this.currentTabComponent&&this.currentTabComponent.setElement(o),typeof n.props.ref=="function"&&n.props.ref(o);}},i={...n,props:r};return typeof this.currentTabComponent.onMount=="function"&&setTimeout(()=>{this.currentTabComponent&&typeof this.currentTabComponent.onMount=="function"&&this.currentTabComponent.onMount();},0),i}if(typeof e.component=="function"){let n=e.component;return n.prototype&&typeof n.prototype.render=="function"?(this.currentTabComponent||(this.currentTabComponent=new n,this.currentTabComponent&&typeof this.currentTabComponent.onMount=="function"&&setTimeout(()=>{this.currentTabComponent&&typeof this.currentTabComponent.onMount=="function"&&this.currentTabComponent.onMount();},0)),this.currentTabComponent.render()):n()}}catch(n){return console.error("Error rendering tab component:",n),vdom.createElement("div",{className:P.content.error},h("global.loading"))}return e.content?e.content:vdom.createElement("div",{className:P.content.emptyState},vdom.createElement("p",{},h("global.loading")))}};p([g],x.prototype,"activeTabId"),p([g],x.prototype,"tabs"),p([g],x.prototype,"position"),p([g],x.prototype,"style"),p([g],x.prototype,"className"),p([g],x.prototype,"headerClassName"),p([g],x.prototype,"contentClassName"),p([g],x.prototype,"showTabCount"),p([g],x.prototype,"persistState"),p([g],x.prototype,"storageKey");function He(s){let t=new x;return t.init(s),t}async function Wn(s,t){let e=He(t);return await e.mount(s),e}var f={container:"bb_itemsLoaderContainer",list:"bb_itemsLoaderList",searchbar:"bb_itemsLoaderSearchbar",loading:"bb_itemsLoaderLoading",error:"bb_itemsLoaderError",trigger:"bb_itemsLoaderTrigger",end:"bb_itemsLoaderEnd",emptyState:"bb_tabbedviewEmptyState",button:"bb_btn",item:"bb_itemsLoader-item",formFieldInput:"bb_formFieldInput"},ue=class extends m{constructor(){super(...arguments);this.items=[];this.loadState={loading:false,error:null,hasMore:true,page:0,total:0};this.filters={};this.scrollContainer=null;this.loadMoreObserver=null;this.currentLoadMoreTrigger=null;this.loadMoreMutationObserver=null;this.visibilityObserver=null;this.viewedItems=new Set;this.dropdownIsOpen=false;this.itemsListContainer=null;this.searchInput=null;this.isUpdating=false;this.searchDebounceTimer=null;this.handleScroll=()=>{if(!this.scrollContainer||this.loadState.loading||!this.loadState.hasMore)return;let{scrollTop:e,scrollHeight:n,clientHeight:r}=this.scrollContainer;n-e-r<this.config.scrollThreshold&&this.loadMore();};this.handleItemClick=(e,n)=>{this.config.onItemClick?.(e,n);};}initialize(e){this.config={pageSize:10,loadMoreText:"Load More",loadingText:"Loading...",errorText:"Failed to load items",containerClassName:f.container,itemClassName:f.item,enableInfiniteScroll:true,scrollThreshold:200,enableSearch:false,searchPlaceholder:"Search...",searchFilterKey:"search",searchDebounceMs:300,enableVisibilityTracking:false,visibilityThreshold:.5,visibilityRootMargin:"0px",extractItems:n=>n.notifications||n.items||n.data||n.logs||[],extractTotal:n=>n.pagination?.total||n.total||n.count||0,...e},this.config.filters&&(this.filters={...this.config.filters}),this.config.initialItems&&(this.items=[...this.config.initialItems]);}async onMount(){this.items.length===0&&await this.loadMore(),this.config.enableInfiniteScroll&&this.setupInfiniteScroll(),this.config.scrollThreshold&&this.setupScrollListener(),this.config.enableVisibilityTracking&&this.setupVisibilityTracking();}onUnmount(){this.disconnectInfiniteScrollObserver(),this.disconnectVisibilityObserver(),this.loadMoreMutationObserver&&(this.loadMoreMutationObserver.disconnect(),this.loadMoreMutationObserver=null),this.scrollContainer&&(this.scrollContainer.removeEventListener("scroll",this.handleScroll),this.scrollContainer=null),this.searchDebounceTimer&&clearTimeout(this.searchDebounceTimer);}async loadMore(){if(!(this.loadState.loading||!this.loadState.hasMore))try{let e=this.scrollContainer||this.findScrollContainer(),n=e?.scrollTop||0,r=e?.scrollHeight||0;this.loadState={...this.loadState,loading:!0,error:null},this.updateLoadingState();let i=this.loadState.page+1,o=this.buildUrl(i),a=await fetch(o,{credentials:"include",headers:this.buildHeaders()});if(!a.ok)throw new Error(`HTTP ${a.status}: ${a.statusText}`);let l=await a.json(),c=this.config.extractItems(l),u=this.config.extractTotal(l);this.items=[...this.items,...c],this.loadState={loading:!1,error:null,hasMore:this.items.length<u,page:i,total:u},this.updateLoadingState(),this.appendNewItems(c),e&&n>0&&(e.scrollTop=n,requestAnimationFrame(()=>{let y=e.scrollHeight-r;Math.abs(y)>10&&(e.scrollTop=n);})),this.reconnectInfiniteScrollObserver(),this.config.onLoadMore?.(i,this.items);}catch(e){this.loadState={...this.loadState,loading:false,error:e instanceof Error?e.message:this.config.errorText},this.updateLoadingState(),this.updateFooter(),this.config.onError?.(e instanceof Error?e:new Error("Unknown error"));}}async reload(){this.items=[],this.loadState={loading:false,error:null,hasMore:true,page:0,total:0},await this.loadMore();}async applyFilters(e){if(!this.isUpdating){this.isUpdating=true,this.filters={...e},this.items=[],this.loadState={loading:true,error:null,hasMore:true,page:0,total:0},this.updateLoadingState();try{let n=this.buildUrl(1),r=await fetch(n,{credentials:"include",headers:this.buildHeaders()});if(!r.ok)throw new Error(`HTTP ${r.status}: ${r.statusText}`);let i=await r.json(),o=this.config.extractItems(i),a=this.config.extractTotal(i);this.items=[...o],this.loadState={loading:!1,error:null,hasMore:this.items.length<a,page:1,total:a},this.itemsListContainer&&(this.itemsListContainer.innerHTML=""),this.element&&this.element.querySelectorAll(`.${f.trigger}, .${f.end}, .${f.error}, .${f.loading}, .${f.emptyState}`).forEach(l=>l.remove()),this.items.length>0?(this.itemsListContainer||(this.itemsListContainer=this.element?.querySelector(`.${f.list}`)),this.itemsListContainer&&this.appendNewItems(this.items)):this.updateFooter(),this.itemsListContainer=this.element?.querySelector(`.${f.list}`),this.reconnectInfiniteScrollObserver(),this.config.onLoadMore?.(1,this.items),this.config.onFiltersChange?.(this.filters);}catch(n){this.loadState={...this.loadState,loading:false,error:n instanceof Error?n.message:this.config.errorText},this.updateLoadingState(),this.config.onError?.(n instanceof Error?n:new Error("Unknown error"));}finally{this.isUpdating=false;}}}async handleSearch(e){this.searchDebounceTimer&&clearTimeout(this.searchDebounceTimer),this.searchDebounceTimer=setTimeout(async()=>{let n={...this.filters};e.trim()?n[this.config.searchFilterKey]=e.trim():delete n[this.config.searchFilterKey],await this.applyFilters(n);},this.config.searchDebounceMs);}updateItems(e){this.items=[...e],this.itemsListContainer&&(this.itemsListContainer.innerHTML="",this.appendNewItems(e));}setupVisibilityTracking(){if(!this.config.enableVisibilityTracking)return;this.visibilityObserver&&this.visibilityObserver.disconnect();let e=this.findScrollContainer();this.visibilityObserver=new IntersectionObserver(n=>{n.forEach(r=>{if(r.isIntersecting&&this.dropdownIsOpen){let i=r.target,o=parseInt(i.getAttribute("data-item-index")||"-1");if(o>=0&&o<this.items.length){let a=this.items[o],l=this.config.getItemId?.(a),c=this.config.shouldTrackItem?.(a)??true;l&&!this.viewedItems.has(l)&&c&&this.viewedItems.add(l);}}});},{root:e,rootMargin:this.config.visibilityRootMargin,threshold:this.config.visibilityThreshold}),this.observeTrackableItems();}observeTrackableItems(){if(!this.visibilityObserver||!this.itemsListContainer)return;this.itemsListContainer.querySelectorAll("[data-item-index]").forEach(n=>{let r=parseInt(n.getAttribute("data-item-index")||"-1");if(r>=0&&r<this.items.length){let i=this.items[r];(this.config.shouldTrackItem?.(i)??true)&&this.visibilityObserver.observe(n);}});}trackAlreadyVisibleItems(){if(!this.itemsListContainer)return;let e=this.findScrollContainer();if(!e)return;let n=this.itemsListContainer.querySelectorAll("[data-item-index]"),r=e.getBoundingClientRect();n.forEach(i=>{let o=parseInt(i.getAttribute("data-item-index")||"-1");if(o<0||o>=this.items.length)return;let a=this.items[o],l=this.config.getItemId?.(a);if(!l||this.viewedItems.has(l)||!(this.config.shouldTrackItem?.(a)??true))return;let u=i.getBoundingClientRect();u.top<r.bottom&&u.bottom>r.top&&u.top>=r.top-100&&u.bottom<=r.bottom+100&&this.viewedItems.add(l);});}disconnectVisibilityObserver(){this.visibilityObserver&&(this.visibilityObserver.disconnect(),this.visibilityObserver=null);}handleDropdownOpen(){this.dropdownIsOpen=true,this.viewedItems.clear(),this.config.enableVisibilityTracking&&(this.trackAlreadyVisibleItems(),this.observeTrackableItems()),this.config.onDropdownOpen?.();}async handleDropdownClose(){if(this.dropdownIsOpen=false,this.viewedItems.size>0&&this.config.onItemsViewed){let e=this.items.filter(n=>{let r=this.config.getItemId?.(n);return r&&this.viewedItems.has(r)});await this.config.onItemsViewed(e);}this.viewedItems.clear(),this.config.onDropdownClose?.();}async performBatchAction(e,n){this.config.onBatchAction&&await this.config.onBatchAction(e,n);}appendNewItems(e){if(this.itemsListContainer||(this.itemsListContainer=this.element?.querySelector(`.${f.list}`)),!this.itemsListContainer)return;let n=document.createDocumentFragment(),r=this.items.length-e.length;e.forEach((i,o)=>{let a=r+o,l=this.config.renderItem(i,a);l.setAttribute("data-item-index",a.toString()),this.config.onItemClick?(l.className=`${l.className} ${this.config.itemClassName} clickable`,l.onclick=()=>this.handleItemClick(i,a)):l.className=`${l.className} ${this.config.itemClassName}`,n.appendChild(l);}),this.itemsListContainer.appendChild(n),this.updateFooter(),this.config.enableVisibilityTracking&&this.dropdownIsOpen&&setTimeout(()=>this.observeTrackableItems(),100);}updateLoadingState(){let e=this.element?.querySelector(`.${f.container}`);if(!e)return;let n=e.querySelector(`.${f.loading}`);if(this.loadState.loading){if(!n){let r=this.renderLoading();n=this.createElementFromVNode(r),e.appendChild(n);}}else n&&n.remove();}updateFooter(){let e=this.element;if(e){if(e.querySelectorAll(`.${f.trigger}, .${f.end}, .${f.emptyState}`).forEach(n=>{n.remove();}),this.items.length===0&&!this.loadState.loading&&this.config.emptyStateConfig){let n=this.renderEmptyState(),r=vdom.createDOMElement(n);e.appendChild(r);return}if(this.loadState.hasMore&&!this.loadState.loading&&this.items.length>0){let n=this.renderLoadMoreTrigger(),r=vdom.createDOMElement(n);e.appendChild(r);}if(!this.loadState.hasMore&&this.items.length>0){let n=this.renderEndMessage(),r=vdom.createDOMElement(n);e.appendChild(r);}}}setupInfiniteScroll(){this.loadMoreObserver&&this.loadMoreObserver.disconnect(),this.loadMoreObserver=new IntersectionObserver(e=>{let[n]=e;n.isIntersecting&&!this.loadState.loading&&this.loadState.hasMore&&this.loadMore();},{threshold:.1,rootMargin:"50px"}),this.reconnectInfiniteScrollObserver();}reconnectInfiniteScrollObserver(){if(!this.config.enableInfiniteScroll||!this.loadMoreObserver)return;this.currentLoadMoreTrigger&&(this.loadMoreObserver.unobserve(this.currentLoadMoreTrigger),this.currentLoadMoreTrigger=null);let e=()=>{let n=this.element?.querySelector('[data-load-more-trigger="true"]');return n?(this.loadMoreObserver.observe(n),this.currentLoadMoreTrigger=n,true):false};e()||(this.loadMoreMutationObserver&&this.loadMoreMutationObserver.disconnect(),this.loadMoreMutationObserver=new MutationObserver(()=>{e()&&this.loadMoreMutationObserver&&(this.loadMoreMutationObserver.disconnect(),this.loadMoreMutationObserver=null);}),this.element&&(this.loadMoreMutationObserver.observe(this.element,{childList:true,subtree:true}),setTimeout(()=>{this.loadMoreMutationObserver&&(this.loadMoreMutationObserver.disconnect(),this.loadMoreMutationObserver=null);},5e3)));}disconnectInfiniteScrollObserver(){this.loadMoreObserver&&this.currentLoadMoreTrigger&&(this.loadMoreObserver.unobserve(this.currentLoadMoreTrigger),this.currentLoadMoreTrigger=null);}setupScrollListener(){requestAnimationFrame(()=>{this.scrollContainer=this.findScrollContainer(),this.scrollContainer&&("scrollRestoration"in history&&(history.scrollRestoration="manual"),this.scrollContainer.addEventListener("scroll",this.handleScroll));});}findScrollContainer(){let e=[this.element?.closest(".bb_notificationsContent"),this.element?.closest(".bb_dropdownMenu"),this.element?.querySelector("[data-notifications-loader]"),this.element?.closest("[data-notifications-loader]"),this.element?.closest(".scrollbar-thin"),this.element?.parentElement,this.element];for(let n of e)if(n){let r=n;if(r.scrollHeight>r.clientHeight||r.classList.contains("scrollbar-thin"))return r}return null}buildUrl(e){if(typeof this.config.fetchUrl=="function")return this.config.fetchUrl(e,this.filters);let n=this.config.fetchUrl.includes("?")?"&":"?",r=new URLSearchParams({page:e.toString(),limit:this.config.pageSize.toString(),...this.filters});return `${this.config.fetchUrl}${n}${r}`}buildHeaders(){let e={"Content-Type":"application/json"},n=this.config.getAuthToken?.();return n&&(e.Authorization=`Bearer ${n}`),e}createElementFromVNode(e){if(typeof e.type!="string")throw new Error("Can only create elements from string types");let n=document.createElement(e.type);return e.props&&Object.entries(e.props).forEach(([r,i])=>{r==="className"?n.className=i:r==="style"?typeof i=="string"?n.setAttribute("style",i):typeof i=="object"&&i!==null&&Object.assign(n.style,i):r==="onclick"&&typeof i=="function"?n.addEventListener("click",i):r!=="children"&&r!=="ref"&&n.setAttribute(r,String(i));}),e.children&&e.children.forEach(r=>{r!=null&&(typeof r=="string"||typeof r=="number"?n.appendChild(document.createTextNode(String(r))):typeof r=="object"&&n.appendChild(this.createElementFromVNode(r)));}),n}render(){return vdom.createElement("div",{className:this.config.containerClassName},this.config.enableSearch?this.renderSearchBar():null,vdom.createElement("div",{className:f.list,ref:e=>{e&&(this.itemsListContainer=e);}}),this.loadState.error?this.renderError():null,this.loadState.loading?this.renderLoading():null,this.loadState.hasMore&&!this.loadState.loading&&this.items.length>0?this.renderLoadMoreTrigger():null,!this.loadState.hasMore&&this.items.length>0?this.renderEndMessage():null)}renderSearchBar(){return vdom.createElement("div",{className:f.searchbar},vdom.createElement("div",{className:"row gap-sm"},vdom.createElement("i",{className:"fas fa-search"}),vdom.createElement("input",{type:"text",className:f.formFieldInput,placeholder:this.config.searchPlaceholder,ref:e=>{e&&(this.searchInput=e,this.searchInput.addEventListener("input",n=>{let r=n.target.value;this.handleSearch(r);}));}})))}renderEmptyState(){let e=this.config.emptyStateConfig;return vdom.createElement("div",{className:f.emptyState},vdom.createElement("i",{className:`__icon ${e.icon}`}),vdom.createElement("h3",{className:"__title"},e.title),vdom.createElement("p",{className:"__desc"},e.description))}renderLoading(){return vdom.createElement("div",{className:f.loading},vdom.createElement("i",{className:"fas fa-spinner fa-spin"}),vdom.createElement("p",{},this.config.loadingText))}renderError(){return vdom.createElement("div",{className:f.error},vdom.createElement("i",{className:"fas fa-exclamation-triangle"}),vdom.createElement("p",{},this.loadState.error),vdom.createElement("button",{className:`${f.button} secondary`,onclick:()=>this.loadMore()},vdom.createElement("i",{className:"fas fa-redo"})," Retry"))}renderLoadMoreTrigger(){return vdom.createElement("div",{className:f.trigger,"data-load-more-trigger":"true",style:"height: 1px; visibility: hidden;"})}renderEndMessage(){return vdom.createElement("div",{className:f.end},vdom.createElement("i",{className:"fas fa-check-circle"}),h("All loaded",{count:String(this.loadState.total)}))}};function tr(s){let t=new ue;return t.initialize(s),t}var de=class s{constructor(){this.dropdowns=new Map;this.hierarchy=new Map;this.setupGlobalClickHandler();}static getInstance(){return s.instance||(s.instance=new s),s.instance}register(t){this.dropdowns.set(t.config.id,t),t.config.parentId&&this.hierarchy.set(t.config.id,t.config.parentId);}unregister(t){this.dropdowns.delete(t),this.hierarchy.delete(t);}open(t){let e=this.dropdowns.get(t);e&&(this.closeSiblings(t),e.setOpen(true));}close(t){let e=this.dropdowns.get(t);e&&(e.setOpen(false),this.closeChildren(t));}closeAll(){Array.from(this.dropdowns.values()).filter(e=>!e.config.parentId).forEach(e=>this.close(e.config.id));}destroy(){this.clickHandler&&typeof window<"u"&&document.removeEventListener("click",this.clickHandler,true),this.dropdowns.clear(),this.hierarchy.clear();}isAncestor(t,e){let n=e;for(;n;){if(n===t)return true;n=this.hierarchy.get(n);}return false}isDescendant(t,e){return this.isAncestor(e,t)}getAncestors(t){let e=new Set,n=t;for(;n;){let r=this.hierarchy.get(n);if(r)e.add(r),n=r;else break}return e}getDescendants(t){let e=new Set,n=r=>{Array.from(this.hierarchy.entries()).filter(([o,a])=>a===r).map(([o,a])=>o).forEach(o=>{e.add(o),n(o);});};return n(t),e}closeSiblings(t){let e=this.dropdowns.get(t);if(!e)return;let n=e.config.parentId;Array.from(this.dropdowns.values()).filter(i=>i.config.parentId===n&&i.config.id!==t).forEach(i=>this.close(i.config.id));}closeChildren(t){Array.from(this.dropdowns.values()).filter(n=>n.config.parentId===t).forEach(n=>this.close(n.config.id));}hasOpenDropdowns(){return Array.from(this.dropdowns.values()).some(t=>t.isOpen)}findDropdownForElement(t){let e=t;for(;e&&e!==document.body;){let n=e.getAttribute("data-dropdown-id");if(n)return n;e=e.parentElement;}return null}setupGlobalClickHandler(){typeof window>"u"||(this.clickHandler=t=>{let e=t.target;if(!this.hasOpenDropdowns())return;let n=this.findDropdownForElement(e);if(!n){this.closeAll();return}if(this.dropdowns.get(n)?.config.preventAutoClose||e.closest(".bb_dropdownTrigger"))return;if(e.closest(".bb_dropdownMenu")){let a=this.getAncestors(n),l=this.getDescendants(n);Array.from(this.dropdowns.values()).filter(u=>!u.config.parentId).forEach(u=>{let d=u.config.id;d===n||a.has(d)||l.has(d)||this.isDescendant(n,d)||this.close(d);});}},document.addEventListener("click",this.clickHandler,true));}},W=de.getInstance(),he=class extends m{constructor(e){super();this.isOpen=false;this.mounted=false;this.config={closeOnItemClick:true,preventAutoClose:false,...e};}onMount(){this.mounted=true,W.register(this);}onUnmount(){this.mounted=false,W.unregister(this.config.id);}setOpen(e){this.isOpen!==e&&(this.isOpen=e,e?this.config.onOpen?.():this.config.onClose?.(),this.updateDOM());}toggle(e){e.preventDefault(),e.stopPropagation(),this.isOpen?W.close(this.config.id):W.open(this.config.id);}handleItemClick(e,n){if(e.disabled){n.preventDefault(),n.stopPropagation();return}this.config.closeOnItemClick&&(n.preventDefault(),n.stopPropagation(),W.close(this.config.id)),e.onclick?.(n);}render(){let e=this.renderTrigger(),n=this.isOpen?this.renderMenu():null,r=["bb_dropdown",`bb_dropdown--${this.config.position||"left"}`,this.isOpen?"bb_dropdown--open":"",this.config.asIcon?"bb_dropdown--asIcon":"",this.config.className||""].filter(Boolean).join(" ");return vdom.createElement("div",{className:r,"data-dropdown-id":this.config.id},e,n)}updateDOM(){if(!this.mounted||!this.element)return;this.isOpen?this.element.classList.add("bb_dropdown--open"):this.element.classList.remove("bb_dropdown--open");let n=this.element.querySelector(".bb_dropdownTrigger")?.nextElementSibling;if(this.isOpen){if(!n||!n.classList.contains("bb_dropdownMenu")){let r=this.renderMenu(),i=this.createElementFromVNode(r);this.element.appendChild(i);}}else n&&n.classList.contains("bb_dropdownMenu")&&n.remove();}createElementFromVNode(e){if(typeof e.type=="string"){let n=document.createElement(e.type);return e.props&&Object.entries(e.props).forEach(([r,i])=>{r==="className"?n.className=i:r==="onclick"&&typeof i=="function"?n.addEventListener("click",i):r!=="children"&&r!=="key"&&n.setAttribute(r,String(i));}),e.children&&e.children.forEach(r=>{r!=null&&(typeof r=="string"||typeof r=="number"?n.appendChild(document.createTextNode(String(r))):typeof r=="object"&&n.appendChild(this.createElementFromVNode(r)));}),n}return document.createElement("div")}renderTrigger(){let e=this.config.trigger.element?.(),n=["bb_dropdownTrigger",this.config.trigger.className||""].filter(Boolean).join(" ");if(e)return vdom.createElement("button",{className:n,onclick:i=>this.toggle(i)},e);let r=["bb_dropdownArrow","fas","fa-chevron-down",this.isOpen?"bb_dropdownArrow--open":"",this.config.hideArrow?"hidden":""].filter(Boolean).join(" ");return vdom.createElement("button",{className:n,onclick:i=>this.toggle(i)},this.config.trigger.icon?vdom.createElement("i",{className:this.config.trigger.icon}):null,this.config.trigger.text?vdom.createElement("span",{},this.config.trigger.text):null,vdom.createElement("i",{className:r}))}renderMenu(){return vdom.createElement("div",{className:"bb_dropdownMenu",onclick:e=>{this.config.preventAutoClose&&e.stopPropagation();}},this.config.items.map((e,n)=>{if(e==="divider")return vdom.createElement("div",{className:"bb_dropdown__divider",key:`divider-${n}`});let r=["bb_dropdownItem",e.className||"",e.disabled?"bb_dropdownItem--disabled":"",e.selected?"bb_dropdownItem--selected":""].filter(Boolean).join(" "),i={key:e.id||`item-${n}`,className:r,onclick:o=>this.handleItemClick(e,o)};return e.disabled&&(i.disabled=true),vdom.createElement("button",i,e.icon?vdom.createElement("i",{className:e.icon}):null,vdom.createElement("span",{},e.label))}))}};function ar(s){return new he(s)}function De(s,t){let e=null;return (...n)=>{e!==null&&clearTimeout(e),e=setTimeout(()=>{e=null,s(...n);},t);}}function Ue(s,t){let e=0,n=null;return (...r)=>{let i=Date.now(),o=i-e;o>=t?(e=i,s(...r)):n||(n=setTimeout(()=>{e=Date.now(),n=null,s(...r);},t-o));}}function Be(...s){let t=[];for(let e of s)if(e){if(typeof e=="string")t.push(e);else if(typeof e=="object")for(let[n,r]of Object.entries(e))r&&t.push(n);}return t.join(" ")}function ze(s,t="YYYY-MM-DD"){let e=s instanceof Date?s:new Date(s);if(isNaN(e.getTime()))throw new Error("Invalid date provided to formatDate");let n=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),i=String(e.getDate()).padStart(2,"0"),o=String(e.getHours()).padStart(2,"0"),a=String(e.getMinutes()).padStart(2,"0"),l=String(e.getSeconds()).padStart(2,"0");return t.replace("YYYY",String(n)).replace("MM",r).replace("DD",i).replace("HH",o).replace("mm",a).replace("ss",l)}function H(s){if(s===null||typeof s!="object")return s;if(s instanceof Date)return new Date(s.getTime());if(Array.isArray(s))return s.map(t=>H(t));if(s instanceof RegExp)return new RegExp(s.source,s.flags);if(s instanceof Map){let t=new Map;return s.forEach((e,n)=>{t.set(H(n),H(e));}),t}if(s instanceof Set){let t=new Set;return s.forEach(e=>{t.add(H(e));}),t}if(Object.prototype.toString.call(s)==="[object Object]"){let t={};for(let e in s)Object.prototype.hasOwnProperty.call(s,e)&&(t[e]=H(s[e]));return t}return s}function ge(s,...t){if(!t.length)return s;let e=t.shift();if(!e)return s;if(X(s)&&X(e)){for(let n in e)if(Object.prototype.hasOwnProperty.call(e,n)){let r=e[n],i=s[n];r!==void 0&&(X(r)&&!Array.isArray(r)?((!i||!X(i))&&(s[n]={}),ge(s[n],r)):s[n]=r);}}return ge(s,...t)}function X(s){return s!==null&&typeof s=="object"&&!Array.isArray(s)}var pe=0;function je(s="id"){let t=Date.now().toString(36),e=Math.random().toString(36).substring(2,11);pe=(pe||0)+1;let n=pe.toString(36);return `${s}_${t}_${e}_${n}`}function qe(s){if(s<0)throw new Error("Sleep duration must be non-negative");return new Promise(t=>setTimeout(t,s))}function We(s){return s==null?true:typeof s=="string"?s.trim().length===0:Array.isArray(s)?s.length===0:s instanceof Map||s instanceof Set?s.size===0:typeof s=="object"?Object.keys(s).length===0:false}function Ge(s){return s?s.charAt(0).toUpperCase()+s.slice(1):""}function Je(s){return s?s.replace(/([a-z])([A-Z])/g,"$1-$2").replace(/[\s_]+/g,"-").toLowerCase():""}function Ce(s){return s?s.replace(/[-_\s]+(.)?/g,(t,e)=>e?e.toUpperCase():"").replace(/^[A-Z]/,t=>t.toLowerCase()):""}function Qe(s){if(!s)return "";let t=Ce(s);return t.charAt(0).toUpperCase()+t.slice(1)}function Ye(s,t,e="..."){return !s||s.length<=t?s:s.substring(0,t-e.length)+e}function Ze(s){let t={},e=s.replace(/^\?/,"");if(!e)return t;let n=e.split("&");for(let r of n){let[i,o]=r.split("=").map(decodeURIComponent);if(!i)continue;let a=o||"";if(i.endsWith("[]")){let l=i.slice(0,-2);t[l]||(t[l]=[]),t[l].push(a);}else t[i]=a;}return t}function Xe(s){let t=[];for(let[e,n]of Object.entries(s))if(n!=null)if(Array.isArray(n))for(let r of n)r!=null&&t.push(`${encodeURIComponent(e)}[]=${encodeURIComponent(String(r))}`);else t.push(`${encodeURIComponent(e)}=${encodeURIComponent(String(n))}`);return t.length>0?`?${t.join("&")}`:""}function et(s,t,e){return Math.min(Math.max(s,t),e)}function tt(){return typeof window<"u"&&typeof document<"u"}function nt(s,t){try{return JSON.parse(s)}catch{return t}}var cr={debounce:De,throttle:Ue,classNames:Be,formatDate:ze,deepClone:H,deepMerge:ge,uniqueId:je,sleep:qe,isEmpty:We,capitalize:Ge,kebabCase:Je,camelCase:Ce,pascalCase:Qe,truncate:Ye,parseQuery:Ze,stringifyQuery:Xe,clamp:et,isBrowser:tt,safeJsonParse:nt};var Se=class{constructor(t){this.observer=null;this.observedElements=new Map;this.observer=new IntersectionObserver(e=>{e.forEach(n=>{let r=this.observedElements.get(n.target)??false,i=n.isIntersecting;i&&!r?(this.observedElements.set(n.target,true),t.onEnter?.(n),t.once&&this.unobserve(n.target)):!i&&r&&(this.observedElements.set(n.target,false),t.onExit?.(n));});},{root:t.root||null,rootMargin:t.rootMargin||"0px",threshold:t.threshold??.1});}observe(t){this.observer&&(this.observer.observe(t),this.observedElements.set(t,false));}unobserve(t){this.observer&&(this.observer.unobserve(t),this.observedElements.delete(t));}disconnect(){this.observer&&(this.observer.disconnect(),this.observedElements.clear());}};function dr(s,t){let e=new IntersectionObserver(n=>{n.forEach(r=>{r.isIntersecting&&(t(r),e.unobserve(s));});},{threshold:.1});return e.observe(s),()=>e.disconnect()}function fe(s){let t=typeof s=="string"?new Date(s):s,n=new Date().getTime()-t.getTime(),r=Math.floor(n/1e3),i=Math.floor(r/60),o=Math.floor(i/60),a=Math.floor(o/24),l=Math.floor(a/7),c=Math.floor(a/30),u=Math.floor(a/365),d="";return r<0?d=h("time.just_now"):r<60?d=h("time.just_now"):i<2?d=h("time.minute_ago"):i<60?d=h("time.minutes_ago",{count:i.toString()}):o<2?d=h("time.hour_ago"):o<24?d=h("time.hours_ago",{count:o.toString()}):a<2?d=h("time.day_ago"):a<7?d=h("time.days_ago",{count:a.toString()}):l<2?d=h("time.week_ago"):l<4?d=h("time.weeks_ago",{count:l.toString()}):c<2?d=h("time.month_ago"):c<12?d=h("time.months_ago",{count:c.toString()}):u<2?d=h("time.year_ago"):d=h("time.years_ago",{count:u.toString()}),{formatted:d,originalDate:t.toISOString(),title:t.toLocaleString()}}function gr(s){let{formatted:t,title:e}=fe(s);return {text:t,title:e}}function fr(s){return fe(s).formatted}function mr(s){return fe(s).title}vdom.setConfig({devMode:false,sanitizeHTML:true});Object.defineProperty(exports,"createDOMElement",{enumerable:true,get:function(){return vdom.createDOMElement}});Object.defineProperty(exports,"createElement",{enumerable:true,get:function(){return vdom.createElement}});Object.defineProperty(exports,"html",{enumerable:true,get:function(){return vdom.html}});Object.defineProperty(exports,"patch",{enumerable:true,get:function(){return vdom.patch}});Object.defineProperty(exports,"api",{enumerable:true,get:function(){return capi.api}});Object.defineProperty(exports,"configureApi",{enumerable:true,get:function(){return capi.configureApi}});Object.defineProperty(exports,"getApiConfig",{enumerable:true,get:function(){return capi.getApiConfig}});Object.defineProperty(exports,"http",{enumerable:true,get:function(){return capi.http}});Object.defineProperty(exports,"resetApiConfig",{enumerable:true,get:function(){return capi.resetApiConfig}});exports.CombinedContext=te;exports.Component=m;exports.Context=G;exports.Dropdown=he;exports.I18nManager=z;exports.ItemsLoader=ue;exports.Loader=I;exports.Popup=Z;exports.Provider=ve;exports.Router=ie;exports.SmartForm=_e;exports.SmartFormComponent=V;exports.Store=ae;exports.StyleManager=D;exports.TabbedView=x;exports.Toast=Y;exports.VisibilityObserver=Se;exports.camelCase=Ce;exports.capitalize=Ge;exports.clamp=et;exports.classNames=Be;exports.clearHookContext=Pe;exports.client=qt;exports.computed=dt;exports.connect=Ut;exports.createCombinedContext=vt;exports.createComputedStore=Dt;exports.createContext=mt;exports.createDropdown=ar;exports.createFunctionalComponent=Pt;exports.createItemsLoader=tr;exports.createStore=Re;exports.createTabbedView=He;exports.createTranslator=sn;exports.css=be;exports.debounce=De;exports.deepClone=H;exports.deepMerge=ge;exports.formatDate=ze;exports.formatRelativeTime=fe;exports.formatTimeAgo=fr;exports.getCurrentLanguage=Zt;exports.getCurrentPath=oe;exports.getI18n=S;exports.getPopup=M;exports.getQueryParam=At;exports.getQueryParams=Oe;exports.getSupportedLanguages=tn;exports.getTimeDisplay=gr;exports.getTimeTitle=mr;exports.getToast=q;exports.getTranslations=rn;exports.goBack=Ot;exports.goForward=Rt;exports.hasKey=nn;exports.initPopup=Ae;exports.initToast=Fe;exports.initializeI18n=an;exports.isBrowser=tt;exports.isCurrentPath=$t;exports.isCurrentPathPrefix=Vt;exports.isEmpty=We;exports.kebabCase=Je;exports.loadFromUrl=on;exports.loadLanguage=Xt;exports.loadLanguageFile=cn;exports.loadTranslations=en;exports.mountTabbedView=Wn;exports.navigate=we;exports.navigateWithQuery=Kt;exports.observeVisibility=dr;exports.parseQuery=Ze;exports.pascalCase=Qe;exports.popup=An;exports.reloadRoute=Ft;exports.router=R;exports.safeJsonParse=nt;exports.scheduler=U;exports.setHookContext=Me;exports.setLanguage=Qt;exports.setLanguageAsync=Yt;exports.setupI18n=ln;exports.sleep=qe;exports.state=g;exports.stringifyQuery=Xe;exports.t=h;exports.tHtml=le;exports.tLang=Jt;exports.throttle=Ue;exports.toast=fn;exports.truncate=Ye;exports.uniqueId=je;exports.useCallback=re;exports.useContext=bt;exports.useDebounce=Ct;exports.useEffect=O;exports.useEventListener=Mt;exports.useFetch=kt;exports.useInterval=xt;exports.useLocalStorage=_t;exports.useMemo=Ie;exports.usePrevious=St;exports.useReducer=Tt;exports.useRef=se;exports.useState=N;exports.useToggle=Et;exports.useWindowSize=Lt;exports.utils=cr;exports.watch=ht;//# sourceMappingURL=main.cjs.map
|
|
113
|
+
`}styles(){return be``}};p([g],V.prototype,"fields"),p([g],V.prototype,"formData"),p([g],V.prototype,"isSubmitting"),p([g],V.prototype,"submitError"),p([g],V.prototype,"submitSuccess");function _e(s){return new V(s).render()}var w={container:"bb_popupContainer",overlay:"bb_popupOverlay",popup:{base:"bb_popup",close:"bb_popupClose"},header:{container:"bb_popupHeader",icon:"bb_popupHeaderIcon",content:"bb_popupHeaderContent",title:"bb_popupHeaderContentTitle",description:"bb_popupHeaderContentDesc"},body:{container:"bb_popupBody",message:"bb_popupBodyMsg",input:"bb_popupBodyInput",formContainer:"bb_popupBodyFormContainer"},footer:"bb_popupFooter",button:"bb_btn"},Z=class extends m{constructor(){super(...arguments);this.popups=[];this.nextId=0;}async onMount(){this.setupKeyboardListener(),window.addEventListener("languagechange",()=>{this.update();});}onUnmount(){this.handleEscapeKey&&document.removeEventListener("keydown",this.handleEscapeKey);}render(){return this.popups.length===0?vdom.createElement("div",{className:w.container}):vdom.createElement("div",{className:w.container},...this.popups.map(e=>this.renderPopup(e)))}renderPopup(e){let n=`bb_popup--${e.size||"medium"}`,r=e.variant?`bb_popup--${e.variant}`:"";return vdom.createElement("div",{key:String(e.id),className:w.overlay,"data-popup-id":e.id,onClick:i=>{i.target.classList.contains(w.overlay)&&e.closeOnOverlay!==false&&this.closePopup(e.id,false);}},vdom.createElement("div",{className:`${w.popup.base} ${n} ${r}`,role:"dialog","aria-modal":"true","aria-labelledby":`popup-title-${e.id}`},e.showCloseButton!==false?vdom.createElement("button",{className:w.popup.close,onClick:()=>this.closePopup(e.id,false),"aria-label":"Close"},vdom.createElement("i",{className:"fas fa-times"})):null,vdom.createElement("div",{className:w.header.container},e.icon?vdom.createElement("div",{className:w.header.icon},vdom.createElement("i",{className:e.icon})):null,vdom.createElement("div",{className:w.header.content},vdom.createElement("h2",{id:`popup-title-${e.id}`,className:w.header.title,"data-translate":e.titleTranslateKey},e.titleTranslateKey?h(e.titleTranslateKey):e.title),e.description?vdom.createElement("p",{className:w.header.description,"data-translate":e.descriptionTranslateKey},e.descriptionTranslateKey?le(e.descriptionTranslateKey):e.description):null)),vdom.createElement("div",{className:w.body.container},e.message?vdom.createElement("p",{className:w.body.message,"data-translate":e.messageTranslateKey},e.messageTranslateKey?le(e.messageTranslateKey):e.message):null,e.type==="prompt"?vdom.createElement("input",{type:"text",className:w.body.input,value:e.inputValue||"",placeholder:h("popup.prompt.placeholder"),"data-translate":"popup.prompt.placeholder",onInput:i=>{e.inputValue=i.target.value;}}):null,e.type==="form"&&e.formConfig?vdom.createElement("div",{className:w.body.formContainer},_e(e.formConfig)):null,e.customContent||null),e.buttons&&e.buttons.length>0&&e.type!=="form"?vdom.createElement("div",{className:w.footer},...e.buttons.map(i=>vdom.createElement("button",{className:`${w.button} ${i.variant||"secondary"}`,"data-translate":i.translateKey,disabled:i.loading||e.isSubmitting,onClick:async()=>{i.loading||e.isSubmitting||await i.onClick();}},i.icon?vdom.createElement("i",{className:i.icon}):null,i.loading||e.isSubmitting?vdom.createElement("i",{className:"fas fa-spinner fa-spin"}):null," ",i.translateKey?h(i.translateKey):i.label))):null))}show(e){return new Promise(n=>{let r=this.nextId++,i={...e,id:r,resolve:n,type:e.type||"custom",size:e.size||"medium",closeOnOverlay:e.closeOnOverlay!==false,closeOnEscape:e.closeOnEscape!==false,showCloseButton:e.showCloseButton!==false,isSubmitting:false};this.popups=[...this.popups,i],this.applyBodyLock(),this.update();})}showForm(e){return new Promise((n,r)=>{let i=this.nextId++,o={...e.formConfig,onSubmit:async l=>{let c=this.popups.find(u=>u.id===i);c&&(c.isSubmitting=true,this.update());try{e.formConfig.onSubmit&&await e.formConfig.onSubmit(l,new Event("submit")),this.closePopup(i,l),n(l);}catch(u){c&&(c.isSubmitting=false,this.update()),e.formConfig.onError&&e.formConfig.onError(u);}},submitButton:{...e.formConfig.submitButton,className:e.formConfig.submitButton?.className||`${w.button} primary wide`}},a={title:e.title,titleTranslateKey:e.titleTranslateKey,description:e.description,descriptionTranslateKey:e.descriptionTranslateKey,type:"form",variant:e.variant||"default",size:e.size||"medium",icon:e.icon,formConfig:o,closeOnOverlay:e.closeOnOverlay!==false,closeOnEscape:e.closeOnEscape!==false,showCloseButton:e.showCloseButton!==false,id:i,resolve:n,isSubmitting:false};this.popups=[...this.popups,a],this.applyBodyLock(),this.update();})}confirm(e){return new Promise(n=>{let r=this.nextId++,i={id:r,title:e.title,titleTranslateKey:e.titleTranslateKey,message:e.message,messageTranslateKey:e.messageTranslateKey,type:"confirm",variant:e.variant||"default",size:e.size||"small",icon:e.icon,resolve:n,onConfirm:e.onConfirm,onCancel:e.onCancel,buttons:[{label:e.cancelLabel||"Cancel",translateKey:e.cancelTranslateKey||"button.cancel",variant:"secondary",icon:"fas fa-times",onClick:async()=>{e.onCancel&&await e.onCancel(),this.closePopup(r,false);}},{label:e.confirmLabel||"Confirm",translateKey:e.confirmTranslateKey||"button.confirm",variant:e.variant==="danger"?"danger":"primary",icon:"fas fa-check",onClick:async()=>{e.onConfirm&&await e.onConfirm(),this.closePopup(r,true);}}]};this.popups=[...this.popups,i],this.applyBodyLock(),this.update();})}alert(e){return new Promise(n=>{let r=this.nextId++,i={id:r,title:e.title,titleTranslateKey:e.titleTranslateKey,message:e.message,messageTranslateKey:e.messageTranslateKey,type:"alert",variant:e.variant||"info",size:e.size||"small",icon:e.icon,resolve:n,onConfirm:e.onConfirm,buttons:[{label:e.okLabel||"OK",translateKey:e.okTranslateKey||"popup.ok",variant:"primary",icon:"fas fa-check",onClick:async()=>{e.onConfirm&&await e.onConfirm(),this.closePopup(r,true);}}]};this.popups=[...this.popups,i],this.applyBodyLock(),this.update();})}prompt(e){return new Promise(n=>{let r=this.nextId++,i={id:r,title:e.title,titleTranslateKey:e.titleTranslateKey,message:e.message,messageTranslateKey:e.messageTranslateKey,type:"prompt",variant:"default",icon:e.icon,inputValue:e.defaultValue||"",resolve:n,onConfirm:e.onConfirm,onCancel:e.onCancel,buttons:[{label:e.cancelLabel||"Cancel",translateKey:e.cancelTranslateKey||"popup.cancel",variant:"secondary",onClick:async()=>{e.onCancel&&await e.onCancel(),this.closePopup(r,null);}},{label:e.confirmLabel||"OK",translateKey:e.confirmTranslateKey||"popup.ok",variant:"primary",onClick:async()=>{let o=i.inputValue||"";e.onConfirm&&await e.onConfirm(o),this.closePopup(r,o);}}]};this.popups=[...this.popups,i],this.applyBodyLock();})}closePopup(e,n){let r=this.popups.find(i=>i.id===e);r?.resolve&&r.resolve(n),this.popups=this.popups.filter(i=>i.id!==e),this.popups.length===0&&this.removeBodyLock(),this.update();}closeAll(){this.popups.forEach(e=>{e.resolve&&e.resolve(false);}),this.popups=[],this.removeBodyLock(),this.update();}applyBodyLock(){document.body.style.overflow="hidden";}removeBodyLock(){document.body.style.overflow="";}setupKeyboardListener(){this.handleEscapeKey=e=>{if(e.key==="Escape"&&this.popups.length>0){let n=this.popups[this.popups.length-1];n.closeOnEscape!==false&&this.closePopup(n.id,false);}},document.addEventListener("keydown",this.handleEscapeKey);}};p([g],Z.prototype,"popups");var F=null;function Ae(s){if(F)return F;let t=s||document.createElement("div");return s||document.body.appendChild(t),F=new Z,F.mount(t),F}function M(){return F||(F=Ae()),F}var An={show:s=>M().show(s),confirm:s=>M().confirm(s),alert:s=>M().alert(s),prompt:s=>M().prompt(s),showForm:s=>M().showForm(s),closePopup:(s,t)=>M().closePopup(s,t),closeLastPopup:()=>M().closePopup(M().popups.length-1,false),closeFirstPopup:()=>M().closePopup(0,false),closeAll:()=>M().closeAll()};var P={container:"bb_tabbedview",header:"bb_tabbedviewHeader",tab:{base:"bb_tabbedviewTab",active:"bb_tabbedviewTab--active",disabled:"bb_tabbedviewTab--disabled",badge:"bb_tabbedviewBadge"},content:{container:"bb_tabbedviewContent",emptyState:"bb_tabbedviewEmptyState",error:"bb_tabbedviewError"}},x=class extends m{constructor(){super(...arguments);this.activeTabId="";this.tabs=[];this.position="top";this.style="default";this.className="";this.headerClassName="";this.contentClassName="";this.showTabCount=false;this.persistState=false;this.storageKey="tabbedview-active";this.currentTabComponent=null;}async onMount(){window.addEventListener("languagechange",()=>{this.update();});}onUnmount(){this.currentTabComponent&&typeof this.currentTabComponent.onUnmount=="function"&&this.currentTabComponent.onUnmount();}init(e){if(this.tabs=e.tabs,this.position=e.position||"top",this.style=e.style||"default",this.className=e.className||"",this.headerClassName=e.headerClassName||"",this.contentClassName=e.contentClassName||"",this.showTabCount=e.showTabCount||false,this.persistState=e.persistState||false,this.storageKey=e.storageKey||"tabbedview-active",this.onChange=e.onChange,this.persistState){let n=localStorage.getItem(this.storageKey);n&&this.tabs.find(r=>r.id===n)&&(this.activeTabId=n);}return this.activeTabId||(this.activeTabId=e.defaultTab||this.tabs[0]?.id||""),this.update(),this}async setActiveTab(e){let n=this.tabs.find(r=>r.id===e);!n||n.disabled||(this.currentTabComponent&&typeof this.currentTabComponent.onUnmount=="function"&&this.currentTabComponent.onUnmount(),this.currentTabComponent=null,this.activeTabId=e,this.persistState&&localStorage.setItem(this.storageKey,e),n.onActivate&&await n.onActivate(),this.onChange&&await this.onChange(e),this.update());}addTab(e){this.tabs=[...this.tabs,e],this.update();}removeTab(e){this.tabs=this.tabs.filter(n=>n.id!==e),this.activeTabId===e&&this.tabs.length>0&&(this.activeTabId=this.tabs[0].id),this.update();}updateTab(e,n){let r=this.tabs.find(i=>i.id===e);r&&(Object.assign(r,n),this.update());}getActiveTab(){return this.tabs.find(e=>e.id===this.activeTabId)}render(){let e=[P.container,`bb_tabbedview__--${this.position}`,`bb_tabbedview__--${this.style}`,this.className].filter(Boolean).join(" ");return vdom.createElement("div",{className:e},this.renderTabList(),this.renderTabContent())}renderTabList(){let e=[P.header,this.headerClassName].filter(Boolean).join(" ");return vdom.createElement("div",{className:e},...this.tabs.map(n=>this.renderTab(n)))}renderTab(e){let n=this.activeTabId===e.id,r=[P.tab.base,n?P.tab.active:"",e.disabled?P.tab.disabled:""].filter(Boolean).join(" "),i=e.translateKey?h(e.translateKey):e.label;return vdom.createElement("button",{key:e.id,className:r,onclick:()=>this.setActiveTab(e.id),disabled:e.disabled,"data-translate":e.translateKey,"aria-selected":n,role:"tab"},e.icon?vdom.createElement("i",{className:e.icon}):null,vdom.createElement("span",{},i),e.badge!==void 0&&e.badge!==null&&e.badge!==0?vdom.createElement("span",{className:P.tab.badge},typeof e.badge=="number"&&e.badge>99?"99+":String(e.badge)):null)}renderTabContent(){let e=[P.content.container,this.contentClassName].filter(Boolean).join(" "),n=this.getActiveTab();return n?vdom.createElement("div",{className:e,role:"tabpanel"},this.renderActiveTabContent(n)):vdom.createElement("div",{className:e},vdom.createElement("div",{className:P.content.emptyState},vdom.createElement("p",{},h("global.loading"))))}renderActiveTabContent(e){if(e.component)try{if(e.component instanceof m){this.currentTabComponent=e.component;let n=this.currentTabComponent.render(),r={...n.props,ref:o=>{o&&this.currentTabComponent&&this.currentTabComponent.setElement(o),typeof n.props.ref=="function"&&n.props.ref(o);}},i={...n,props:r};return typeof this.currentTabComponent.onMount=="function"&&setTimeout(()=>{this.currentTabComponent&&typeof this.currentTabComponent.onMount=="function"&&this.currentTabComponent.onMount();},0),i}if(typeof e.component=="function"){let n=e.component;return n.prototype&&typeof n.prototype.render=="function"?(this.currentTabComponent||(this.currentTabComponent=new n,this.currentTabComponent&&typeof this.currentTabComponent.onMount=="function"&&setTimeout(()=>{this.currentTabComponent&&typeof this.currentTabComponent.onMount=="function"&&this.currentTabComponent.onMount();},0)),this.currentTabComponent.render()):n()}}catch(n){return console.error("Error rendering tab component:",n),vdom.createElement("div",{className:P.content.error},h("global.loading"))}return e.content?e.content:vdom.createElement("div",{className:P.content.emptyState},vdom.createElement("p",{},h("global.loading")))}};p([g],x.prototype,"activeTabId"),p([g],x.prototype,"tabs"),p([g],x.prototype,"position"),p([g],x.prototype,"style"),p([g],x.prototype,"className"),p([g],x.prototype,"headerClassName"),p([g],x.prototype,"contentClassName"),p([g],x.prototype,"showTabCount"),p([g],x.prototype,"persistState"),p([g],x.prototype,"storageKey");function He(s){let t=new x;return t.init(s),t}async function Wn(s,t){let e=He(t);return await e.mount(s),e}var f={container:"bb_itemsLoaderContainer",list:"bb_itemsLoaderList",searchbar:"bb_itemsLoaderSearchbar",loading:"bb_itemsLoaderLoading",error:"bb_itemsLoaderError",trigger:"bb_itemsLoaderTrigger",end:"bb_itemsLoaderEnd",emptyState:"bb_tabbedviewEmptyState",button:"bb_btn",item:"bb_itemsLoader-item",formFieldInput:"bb_formFieldInput"},ue=class extends m{constructor(){super(...arguments);this.items=[];this.loadState={loading:false,error:null,hasMore:true,page:0,total:0};this.filters={};this.scrollContainer=null;this.loadMoreObserver=null;this.currentLoadMoreTrigger=null;this.loadMoreMutationObserver=null;this.visibilityObserver=null;this.viewedItems=new Set;this.dropdownIsOpen=false;this.itemsListContainer=null;this.searchInput=null;this.isUpdating=false;this.searchDebounceTimer=null;this.handleScroll=()=>{if(!this.scrollContainer||this.loadState.loading||!this.loadState.hasMore)return;let{scrollTop:e,scrollHeight:n,clientHeight:r}=this.scrollContainer;n-e-r<this.config.scrollThreshold&&this.loadMore();};this.handleItemClick=(e,n)=>{this.config.onItemClick?.(e,n);};}initialize(e){this.config={pageSize:10,loadMoreText:"Load More",loadingText:"Loading...",errorText:"Failed to load items",containerClassName:f.container,itemClassName:f.item,enableInfiniteScroll:true,scrollThreshold:200,enableSearch:false,searchPlaceholder:"Search...",searchFilterKey:"search",searchDebounceMs:300,enableVisibilityTracking:false,visibilityThreshold:.5,visibilityRootMargin:"0px",extractItems:n=>n.notifications||n.items||n.data||n.logs||[],extractTotal:n=>n.pagination?.total||n.total||n.count||0,...e},this.config.filters&&(this.filters={...this.config.filters}),this.config.initialItems&&(this.items=[...this.config.initialItems]);}async onMount(){this.items.length===0&&await this.loadMore(),this.config.enableInfiniteScroll&&this.setupInfiniteScroll(),this.config.scrollThreshold&&this.setupScrollListener(),this.config.enableVisibilityTracking&&this.setupVisibilityTracking();}onUnmount(){this.disconnectInfiniteScrollObserver(),this.disconnectVisibilityObserver(),this.loadMoreMutationObserver&&(this.loadMoreMutationObserver.disconnect(),this.loadMoreMutationObserver=null),this.scrollContainer&&(this.scrollContainer.removeEventListener("scroll",this.handleScroll),this.scrollContainer=null),this.searchDebounceTimer&&clearTimeout(this.searchDebounceTimer);}async loadMore(){if(!(this.loadState.loading||!this.loadState.hasMore))try{let e=this.scrollContainer||this.findScrollContainer(),n=e?.scrollTop||0,r=e?.scrollHeight||0;this.loadState={...this.loadState,loading:!0,error:null},this.updateLoadingState();let i=this.loadState.page+1,o=this.buildUrl(i),a=await fetch(o,{credentials:"include",headers:this.buildHeaders()});if(!a.ok)throw new Error(`HTTP ${a.status}: ${a.statusText}`);let l=await a.json(),c=this.config.extractItems(l),u=this.config.extractTotal(l);this.items=[...this.items,...c],this.loadState={loading:!1,error:null,hasMore:this.items.length<u,page:i,total:u},this.updateLoadingState(),this.appendNewItems(c),e&&n>0&&(e.scrollTop=n,requestAnimationFrame(()=>{let y=e.scrollHeight-r;Math.abs(y)>10&&(e.scrollTop=n);})),this.reconnectInfiniteScrollObserver(),this.config.onLoadMore?.(i,this.items);}catch(e){this.loadState={...this.loadState,loading:false,error:e instanceof Error?e.message:this.config.errorText},this.updateLoadingState(),this.updateFooter(),this.config.onError?.(e instanceof Error?e:new Error("Unknown error"));}}async reload(){this.items=[],this.loadState={loading:false,error:null,hasMore:true,page:0,total:0},await this.loadMore();}async applyFilters(e){if(!this.isUpdating){this.isUpdating=true,this.filters={...e},this.items=[],this.loadState={loading:true,error:null,hasMore:true,page:0,total:0},this.updateLoadingState();try{let n=this.buildUrl(1),r=await fetch(n,{credentials:"include",headers:this.buildHeaders()});if(!r.ok)throw new Error(`HTTP ${r.status}: ${r.statusText}`);let i=await r.json(),o=this.config.extractItems(i),a=this.config.extractTotal(i);this.items=[...o],this.loadState={loading:!1,error:null,hasMore:this.items.length<a,page:1,total:a},this.itemsListContainer&&(this.itemsListContainer.innerHTML=""),this.element&&this.element.querySelectorAll(`.${f.trigger}, .${f.end}, .${f.error}, .${f.loading}, .${f.emptyState}`).forEach(l=>l.remove()),this.items.length>0?(this.itemsListContainer||(this.itemsListContainer=this.element?.querySelector(`.${f.list}`)),this.itemsListContainer&&this.appendNewItems(this.items)):this.updateFooter(),this.itemsListContainer=this.element?.querySelector(`.${f.list}`),this.reconnectInfiniteScrollObserver(),this.config.onLoadMore?.(1,this.items),this.config.onFiltersChange?.(this.filters);}catch(n){this.loadState={...this.loadState,loading:false,error:n instanceof Error?n.message:this.config.errorText},this.updateLoadingState(),this.config.onError?.(n instanceof Error?n:new Error("Unknown error"));}finally{this.isUpdating=false;}}}async handleSearch(e){this.searchDebounceTimer&&clearTimeout(this.searchDebounceTimer),this.searchDebounceTimer=setTimeout(async()=>{let n={...this.filters};e.trim()?n[this.config.searchFilterKey]=e.trim():delete n[this.config.searchFilterKey],await this.applyFilters(n);},this.config.searchDebounceMs);}updateItems(e){this.items=[...e],this.itemsListContainer&&(this.itemsListContainer.innerHTML="",this.appendNewItems(e));}setupVisibilityTracking(){if(!this.config.enableVisibilityTracking)return;this.visibilityObserver&&this.visibilityObserver.disconnect();let e=this.findScrollContainer();this.visibilityObserver=new IntersectionObserver(n=>{n.forEach(r=>{if(r.isIntersecting&&this.dropdownIsOpen){let i=r.target,o=parseInt(i.getAttribute("data-item-index")||"-1");if(o>=0&&o<this.items.length){let a=this.items[o],l=this.config.getItemId?.(a),c=this.config.shouldTrackItem?.(a)??true;l&&!this.viewedItems.has(l)&&c&&this.viewedItems.add(l);}}});},{root:e,rootMargin:this.config.visibilityRootMargin,threshold:this.config.visibilityThreshold}),this.observeTrackableItems();}observeTrackableItems(){if(!this.visibilityObserver||!this.itemsListContainer)return;this.itemsListContainer.querySelectorAll("[data-item-index]").forEach(n=>{let r=parseInt(n.getAttribute("data-item-index")||"-1");if(r>=0&&r<this.items.length){let i=this.items[r];(this.config.shouldTrackItem?.(i)??true)&&this.visibilityObserver.observe(n);}});}trackAlreadyVisibleItems(){if(!this.itemsListContainer)return;let e=this.findScrollContainer();if(!e)return;let n=this.itemsListContainer.querySelectorAll("[data-item-index]"),r=e.getBoundingClientRect();n.forEach(i=>{let o=parseInt(i.getAttribute("data-item-index")||"-1");if(o<0||o>=this.items.length)return;let a=this.items[o],l=this.config.getItemId?.(a);if(!l||this.viewedItems.has(l)||!(this.config.shouldTrackItem?.(a)??true))return;let u=i.getBoundingClientRect();u.top<r.bottom&&u.bottom>r.top&&u.top>=r.top-100&&u.bottom<=r.bottom+100&&this.viewedItems.add(l);});}disconnectVisibilityObserver(){this.visibilityObserver&&(this.visibilityObserver.disconnect(),this.visibilityObserver=null);}handleDropdownOpen(){this.dropdownIsOpen=true,this.viewedItems.clear(),this.config.enableVisibilityTracking&&(this.trackAlreadyVisibleItems(),this.observeTrackableItems()),this.config.onDropdownOpen?.();}async handleDropdownClose(){if(this.dropdownIsOpen=false,this.viewedItems.size>0&&this.config.onItemsViewed){let e=this.items.filter(n=>{let r=this.config.getItemId?.(n);return r&&this.viewedItems.has(r)});await this.config.onItemsViewed(e);}this.viewedItems.clear(),this.config.onDropdownClose?.();}async performBatchAction(e,n){this.config.onBatchAction&&await this.config.onBatchAction(e,n);}appendNewItems(e){if(this.itemsListContainer||(this.itemsListContainer=this.element?.querySelector(`.${f.list}`)),!this.itemsListContainer)return;let n=document.createDocumentFragment(),r=this.items.length-e.length;e.forEach((i,o)=>{let a=r+o,l=this.config.renderItem(i,a);l.setAttribute("data-item-index",a.toString()),this.config.onItemClick?(l.className=`${l.className} ${this.config.itemClassName} clickable`,l.onclick=()=>this.handleItemClick(i,a)):l.className=`${l.className} ${this.config.itemClassName}`,n.appendChild(l);}),this.itemsListContainer.appendChild(n),this.updateFooter(),this.config.enableVisibilityTracking&&this.dropdownIsOpen&&setTimeout(()=>this.observeTrackableItems(),100);}updateLoadingState(){let e=this.element?.querySelector(`.${f.container}`);if(!e)return;let n=e.querySelector(`.${f.loading}`);if(this.loadState.loading){if(!n){let r=this.renderLoading();n=this.createElementFromVNode(r),e.appendChild(n);}}else n&&n.remove();}updateFooter(){let e=this.element;if(e){if(e.querySelectorAll(`.${f.trigger}, .${f.end}, .${f.emptyState}`).forEach(n=>{n.remove();}),this.items.length===0&&!this.loadState.loading&&this.config.emptyStateConfig){let n=this.renderEmptyState(),r=vdom.createDOMElement(n);e.appendChild(r);return}if(this.loadState.hasMore&&!this.loadState.loading&&this.items.length>0){let n=this.renderLoadMoreTrigger(),r=vdom.createDOMElement(n);e.appendChild(r);}if(!this.loadState.hasMore&&this.items.length>0){let n=this.renderEndMessage(),r=vdom.createDOMElement(n);e.appendChild(r);}}}setupInfiniteScroll(){this.loadMoreObserver&&this.loadMoreObserver.disconnect(),this.loadMoreObserver=new IntersectionObserver(e=>{let[n]=e;n.isIntersecting&&!this.loadState.loading&&this.loadState.hasMore&&this.loadMore();},{threshold:.1,rootMargin:"50px"}),this.reconnectInfiniteScrollObserver();}reconnectInfiniteScrollObserver(){if(!this.config.enableInfiniteScroll||!this.loadMoreObserver)return;this.currentLoadMoreTrigger&&(this.loadMoreObserver.unobserve(this.currentLoadMoreTrigger),this.currentLoadMoreTrigger=null);let e=()=>{let n=this.element?.querySelector('[data-load-more-trigger="true"]');return n?(this.loadMoreObserver.observe(n),this.currentLoadMoreTrigger=n,true):false};e()||(this.loadMoreMutationObserver&&this.loadMoreMutationObserver.disconnect(),this.loadMoreMutationObserver=new MutationObserver(()=>{e()&&this.loadMoreMutationObserver&&(this.loadMoreMutationObserver.disconnect(),this.loadMoreMutationObserver=null);}),this.element&&(this.loadMoreMutationObserver.observe(this.element,{childList:true,subtree:true}),setTimeout(()=>{this.loadMoreMutationObserver&&(this.loadMoreMutationObserver.disconnect(),this.loadMoreMutationObserver=null);},5e3)));}disconnectInfiniteScrollObserver(){this.loadMoreObserver&&this.currentLoadMoreTrigger&&(this.loadMoreObserver.unobserve(this.currentLoadMoreTrigger),this.currentLoadMoreTrigger=null);}setupScrollListener(){requestAnimationFrame(()=>{this.scrollContainer=this.findScrollContainer(),this.scrollContainer&&("scrollRestoration"in history&&(history.scrollRestoration="manual"),this.scrollContainer.addEventListener("scroll",this.handleScroll));});}findScrollContainer(){let e=[this.element?.closest(".bb_notificationsContent"),this.element?.closest(".bb_dropdownMenu"),this.element?.querySelector("[data-notifications-loader]"),this.element?.closest("[data-notifications-loader]"),this.element?.closest(".scrollbar-thin"),this.element?.parentElement,this.element];for(let n of e)if(n){let r=n;if(r.scrollHeight>r.clientHeight||r.classList.contains("scrollbar-thin"))return r}return null}buildUrl(e){if(typeof this.config.fetchUrl=="function")return this.config.fetchUrl(e,this.filters);let n=this.config.fetchUrl.includes("?")?"&":"?",r=new URLSearchParams({page:e.toString(),limit:this.config.pageSize.toString(),...this.filters});return `${this.config.fetchUrl}${n}${r}`}buildHeaders(){let e={"Content-Type":"application/json"},n=this.config.getAuthToken?.();return n&&(e.Authorization=`Bearer ${n}`),e}createElementFromVNode(e){if(typeof e.type!="string")throw new Error("Can only create elements from string types");let n=document.createElement(e.type);return e.props&&Object.entries(e.props).forEach(([r,i])=>{r==="className"?n.className=i:r==="style"?typeof i=="string"?n.setAttribute("style",i):typeof i=="object"&&i!==null&&Object.assign(n.style,i):r==="onclick"&&typeof i=="function"?n.addEventListener("click",i):r!=="children"&&r!=="ref"&&n.setAttribute(r,String(i));}),e.children&&e.children.forEach(r=>{r!=null&&(typeof r=="string"||typeof r=="number"?n.appendChild(document.createTextNode(String(r))):typeof r=="object"&&n.appendChild(this.createElementFromVNode(r)));}),n}render(){return vdom.createElement("div",{className:this.config.containerClassName},this.config.enableSearch?this.renderSearchBar():null,vdom.createElement("div",{className:f.list,ref:e=>{e&&(this.itemsListContainer=e);}}),this.loadState.error?this.renderError():null,this.loadState.loading?this.renderLoading():null,this.loadState.hasMore&&!this.loadState.loading&&this.items.length>0?this.renderLoadMoreTrigger():null,!this.loadState.hasMore&&this.items.length>0?this.renderEndMessage():null)}renderSearchBar(){return vdom.createElement("div",{className:f.searchbar},vdom.createElement("div",{className:"row gap-sm"},vdom.createElement("i",{className:"fas fa-search"}),vdom.createElement("input",{type:"text",className:f.formFieldInput,placeholder:this.config.searchPlaceholder,ref:e=>{e&&(this.searchInput=e,this.searchInput.addEventListener("input",n=>{let r=n.target.value;this.handleSearch(r);}));}})))}renderEmptyState(){let e=this.config.emptyStateConfig;return vdom.createElement("div",{className:f.emptyState},vdom.createElement("i",{className:`__icon ${e.icon}`}),vdom.createElement("h3",{className:"__title"},e.title),vdom.createElement("p",{className:"__desc"},e.description))}renderLoading(){return vdom.createElement("div",{className:f.loading},vdom.createElement("i",{className:"fas fa-spinner fa-spin"}),vdom.createElement("p",{},this.config.loadingText))}renderError(){return vdom.createElement("div",{className:f.error},vdom.createElement("i",{className:"fas fa-exclamation-triangle"}),vdom.createElement("p",{},this.loadState.error),vdom.createElement("button",{className:`${f.button} secondary`,onclick:()=>this.loadMore()},vdom.createElement("i",{className:"fas fa-redo"})," Retry"))}renderLoadMoreTrigger(){return vdom.createElement("div",{className:f.trigger,"data-load-more-trigger":"true",style:"height: 1px; visibility: hidden;"})}renderEndMessage(){return vdom.createElement("div",{className:f.end},vdom.createElement("i",{className:"fas fa-check-circle"}),h("All loaded",{count:String(this.loadState.total)}))}};function tr(s){let t=new ue;return t.initialize(s),t}var de=class s{constructor(){this.dropdowns=new Map;this.hierarchy=new Map;this.setupGlobalClickHandler();}static getInstance(){return s.instance||(s.instance=new s),s.instance}register(t){this.dropdowns.set(t.config.id,t),t.config.parentId&&this.hierarchy.set(t.config.id,t.config.parentId);}unregister(t){this.dropdowns.delete(t),this.hierarchy.delete(t);}open(t){let e=this.dropdowns.get(t);e&&(this.closeSiblings(t),e.setOpen(true));}close(t){let e=this.dropdowns.get(t);e&&(e.setOpen(false),this.closeChildren(t));}closeAll(){Array.from(this.dropdowns.values()).filter(e=>!e.config.parentId).forEach(e=>this.close(e.config.id));}destroy(){this.clickHandler&&typeof window<"u"&&document.removeEventListener("click",this.clickHandler,true),this.dropdowns.clear(),this.hierarchy.clear();}isAncestor(t,e){let n=e;for(;n;){if(n===t)return true;n=this.hierarchy.get(n);}return false}isDescendant(t,e){return this.isAncestor(e,t)}getAncestors(t){let e=new Set,n=t;for(;n;){let r=this.hierarchy.get(n);if(r)e.add(r),n=r;else break}return e}getDescendants(t){let e=new Set,n=r=>{Array.from(this.hierarchy.entries()).filter(([o,a])=>a===r).map(([o,a])=>o).forEach(o=>{e.add(o),n(o);});};return n(t),e}closeSiblings(t){let e=this.dropdowns.get(t);if(!e)return;let n=e.config.parentId;Array.from(this.dropdowns.values()).filter(i=>i.config.parentId===n&&i.config.id!==t).forEach(i=>this.close(i.config.id));}closeChildren(t){Array.from(this.dropdowns.values()).filter(n=>n.config.parentId===t).forEach(n=>this.close(n.config.id));}hasOpenDropdowns(){return Array.from(this.dropdowns.values()).some(t=>t.isOpen)}findDropdownForElement(t){let e=t;for(;e&&e!==document.body;){let n=e.getAttribute("data-dropdown-id");if(n)return n;e=e.parentElement;}return null}setupGlobalClickHandler(){typeof window>"u"||(this.clickHandler=t=>{let e=t.target;if(!this.hasOpenDropdowns())return;let n=this.findDropdownForElement(e);if(!n){this.closeAll();return}if(this.dropdowns.get(n)?.config.preventAutoClose||e.closest(".bb_dropdownTrigger"))return;if(e.closest(".bb_dropdownMenu")){let a=this.getAncestors(n),l=this.getDescendants(n);Array.from(this.dropdowns.values()).filter(u=>!u.config.parentId).forEach(u=>{let d=u.config.id;d===n||a.has(d)||l.has(d)||this.isDescendant(n,d)||this.close(d);});}},document.addEventListener("click",this.clickHandler,true));}},W=de.getInstance(),he=class extends m{constructor(e){super();this.isOpen=false;this.mounted=false;this.config={closeOnItemClick:true,preventAutoClose:false,...e};}onMount(){this.mounted=true,W.register(this);}onUnmount(){this.mounted=false,W.unregister(this.config.id);}setOpen(e){this.isOpen!==e&&(this.isOpen=e,e?this.config.onOpen?.():this.config.onClose?.(),this.updateDOM());}toggle(e){e.preventDefault(),e.stopPropagation(),this.isOpen?W.close(this.config.id):W.open(this.config.id);}handleItemClick(e,n){if(e.disabled){n.preventDefault(),n.stopPropagation();return}this.config.closeOnItemClick&&(n.preventDefault(),n.stopPropagation(),W.close(this.config.id)),e.onclick?.(n),this.config.onSelect?.(e);}render(){let e=this.renderTrigger(),n=this.isOpen?this.renderMenu():null,r=["bb_dropdown",`bb_dropdown--${this.config.position||"left"}`,this.isOpen?"bb_dropdown--open":"",this.config.asIcon?"bb_dropdown--asIcon":"",this.config.className||""].filter(Boolean).join(" ");return vdom.createElement("div",{className:r,"data-dropdown-id":this.config.id},e,n)}updateDOM(){if(!this.mounted||!this.element)return;this.isOpen?this.element.classList.add("bb_dropdown--open"):this.element.classList.remove("bb_dropdown--open");let n=this.element.querySelector(".bb_dropdownTrigger")?.nextElementSibling;if(this.isOpen){if(!n||!n.classList.contains("bb_dropdownMenu")){let r=this.renderMenu(),i=this.createElementFromVNode(r);this.element.appendChild(i);}}else n&&n.classList.contains("bb_dropdownMenu")&&n.remove();}createElementFromVNode(e){if(typeof e.type=="string"){let n=document.createElement(e.type);return e.props&&Object.entries(e.props).forEach(([r,i])=>{r==="className"?n.className=i:r==="onclick"&&typeof i=="function"?n.addEventListener("click",i):r!=="children"&&r!=="key"&&n.setAttribute(r,String(i));}),e.children&&e.children.forEach(r=>{r!=null&&(typeof r=="string"||typeof r=="number"?n.appendChild(document.createTextNode(String(r))):typeof r=="object"&&n.appendChild(this.createElementFromVNode(r)));}),n}return document.createElement("div")}renderTrigger(){let e=this.config.trigger.element?.(),n=["bb_dropdownTrigger",this.config.trigger.className||""].filter(Boolean).join(" ");if(e)return vdom.createElement("button",{className:n,onclick:i=>this.toggle(i)},e);let r=["bb_dropdownArrow","fas","fa-chevron-down",this.isOpen?"bb_dropdownArrow--open":"",this.config.hideArrow?"hidden":""].filter(Boolean).join(" ");return vdom.createElement("button",{className:n,onclick:i=>this.toggle(i)},this.config.trigger.icon?vdom.createElement("i",{className:this.config.trigger.icon}):null,this.config.trigger.text?vdom.createElement("span",{},this.config.trigger.text):null,vdom.createElement("i",{className:r}))}renderMenu(){return vdom.createElement("div",{className:"bb_dropdownMenu",onclick:e=>{this.config.preventAutoClose&&e.stopPropagation();}},this.config.items.map((e,n)=>{if(e==="divider")return vdom.createElement("div",{className:"bb_dropdown__divider",key:`divider-${n}`});let r=e.selected||this.config.defaultSelected&&e.id===this.config.defaultSelected,i=["bb_dropdownItem",e.className||"",e.disabled?"bb_dropdownItem--disabled":"",r?"bb_dropdownItem--selected":""].filter(Boolean).join(" "),o={key:e.id||`item-${n}`,className:i,onclick:a=>this.handleItemClick(e,a)};return e.disabled&&(o.disabled=true),vdom.createElement("button",o,e.icon?vdom.createElement("i",{className:e.icon}):null,vdom.createElement("span",{},e.label))}))}};function ar(s){return new he(s)}function De(s,t){let e=null;return (...n)=>{e!==null&&clearTimeout(e),e=setTimeout(()=>{e=null,s(...n);},t);}}function Ue(s,t){let e=0,n=null;return (...r)=>{let i=Date.now(),o=i-e;o>=t?(e=i,s(...r)):n||(n=setTimeout(()=>{e=Date.now(),n=null,s(...r);},t-o));}}function Be(...s){let t=[];for(let e of s)if(e){if(typeof e=="string")t.push(e);else if(typeof e=="object")for(let[n,r]of Object.entries(e))r&&t.push(n);}return t.join(" ")}function ze(s,t="YYYY-MM-DD"){let e=s instanceof Date?s:new Date(s);if(isNaN(e.getTime()))throw new Error("Invalid date provided to formatDate");let n=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),i=String(e.getDate()).padStart(2,"0"),o=String(e.getHours()).padStart(2,"0"),a=String(e.getMinutes()).padStart(2,"0"),l=String(e.getSeconds()).padStart(2,"0");return t.replace("YYYY",String(n)).replace("MM",r).replace("DD",i).replace("HH",o).replace("mm",a).replace("ss",l)}function H(s){if(s===null||typeof s!="object")return s;if(s instanceof Date)return new Date(s.getTime());if(Array.isArray(s))return s.map(t=>H(t));if(s instanceof RegExp)return new RegExp(s.source,s.flags);if(s instanceof Map){let t=new Map;return s.forEach((e,n)=>{t.set(H(n),H(e));}),t}if(s instanceof Set){let t=new Set;return s.forEach(e=>{t.add(H(e));}),t}if(Object.prototype.toString.call(s)==="[object Object]"){let t={};for(let e in s)Object.prototype.hasOwnProperty.call(s,e)&&(t[e]=H(s[e]));return t}return s}function ge(s,...t){if(!t.length)return s;let e=t.shift();if(!e)return s;if(X(s)&&X(e)){for(let n in e)if(Object.prototype.hasOwnProperty.call(e,n)){let r=e[n],i=s[n];r!==void 0&&(X(r)&&!Array.isArray(r)?((!i||!X(i))&&(s[n]={}),ge(s[n],r)):s[n]=r);}}return ge(s,...t)}function X(s){return s!==null&&typeof s=="object"&&!Array.isArray(s)}var pe=0;function je(s="id"){let t=Date.now().toString(36),e=Math.random().toString(36).substring(2,11);pe=(pe||0)+1;let n=pe.toString(36);return `${s}_${t}_${e}_${n}`}function qe(s){if(s<0)throw new Error("Sleep duration must be non-negative");return new Promise(t=>setTimeout(t,s))}function We(s){return s==null?true:typeof s=="string"?s.trim().length===0:Array.isArray(s)?s.length===0:s instanceof Map||s instanceof Set?s.size===0:typeof s=="object"?Object.keys(s).length===0:false}function Ge(s){return s?s.charAt(0).toUpperCase()+s.slice(1):""}function Je(s){return s?s.replace(/([a-z])([A-Z])/g,"$1-$2").replace(/[\s_]+/g,"-").toLowerCase():""}function Ce(s){return s?s.replace(/[-_\s]+(.)?/g,(t,e)=>e?e.toUpperCase():"").replace(/^[A-Z]/,t=>t.toLowerCase()):""}function Qe(s){if(!s)return "";let t=Ce(s);return t.charAt(0).toUpperCase()+t.slice(1)}function Ye(s,t,e="..."){return !s||s.length<=t?s:s.substring(0,t-e.length)+e}function Ze(s){let t={},e=s.replace(/^\?/,"");if(!e)return t;let n=e.split("&");for(let r of n){let[i,o]=r.split("=").map(decodeURIComponent);if(!i)continue;let a=o||"";if(i.endsWith("[]")){let l=i.slice(0,-2);t[l]||(t[l]=[]),t[l].push(a);}else t[i]=a;}return t}function Xe(s){let t=[];for(let[e,n]of Object.entries(s))if(n!=null)if(Array.isArray(n))for(let r of n)r!=null&&t.push(`${encodeURIComponent(e)}[]=${encodeURIComponent(String(r))}`);else t.push(`${encodeURIComponent(e)}=${encodeURIComponent(String(n))}`);return t.length>0?`?${t.join("&")}`:""}function et(s,t,e){return Math.min(Math.max(s,t),e)}function tt(){return typeof window<"u"&&typeof document<"u"}function nt(s,t){try{return JSON.parse(s)}catch{return t}}var cr={debounce:De,throttle:Ue,classNames:Be,formatDate:ze,deepClone:H,deepMerge:ge,uniqueId:je,sleep:qe,isEmpty:We,capitalize:Ge,kebabCase:Je,camelCase:Ce,pascalCase:Qe,truncate:Ye,parseQuery:Ze,stringifyQuery:Xe,clamp:et,isBrowser:tt,safeJsonParse:nt};var Se=class{constructor(t){this.observer=null;this.observedElements=new Map;this.observer=new IntersectionObserver(e=>{e.forEach(n=>{let r=this.observedElements.get(n.target)??false,i=n.isIntersecting;i&&!r?(this.observedElements.set(n.target,true),t.onEnter?.(n),t.once&&this.unobserve(n.target)):!i&&r&&(this.observedElements.set(n.target,false),t.onExit?.(n));});},{root:t.root||null,rootMargin:t.rootMargin||"0px",threshold:t.threshold??.1});}observe(t){this.observer&&(this.observer.observe(t),this.observedElements.set(t,false));}unobserve(t){this.observer&&(this.observer.unobserve(t),this.observedElements.delete(t));}disconnect(){this.observer&&(this.observer.disconnect(),this.observedElements.clear());}};function dr(s,t){let e=new IntersectionObserver(n=>{n.forEach(r=>{r.isIntersecting&&(t(r),e.unobserve(s));});},{threshold:.1});return e.observe(s),()=>e.disconnect()}function fe(s){let t=typeof s=="string"?new Date(s):s,n=new Date().getTime()-t.getTime(),r=Math.floor(n/1e3),i=Math.floor(r/60),o=Math.floor(i/60),a=Math.floor(o/24),l=Math.floor(a/7),c=Math.floor(a/30),u=Math.floor(a/365),d="";return r<0?d=h("time.just_now"):r<60?d=h("time.just_now"):i<2?d=h("time.minute_ago"):i<60?d=h("time.minutes_ago",{count:i.toString()}):o<2?d=h("time.hour_ago"):o<24?d=h("time.hours_ago",{count:o.toString()}):a<2?d=h("time.day_ago"):a<7?d=h("time.days_ago",{count:a.toString()}):l<2?d=h("time.week_ago"):l<4?d=h("time.weeks_ago",{count:l.toString()}):c<2?d=h("time.month_ago"):c<12?d=h("time.months_ago",{count:c.toString()}):u<2?d=h("time.year_ago"):d=h("time.years_ago",{count:u.toString()}),{formatted:d,originalDate:t.toISOString(),title:t.toLocaleString()}}function gr(s){let{formatted:t,title:e}=fe(s);return {text:t,title:e}}function fr(s){return fe(s).formatted}function mr(s){return fe(s).title}vdom.setConfig({devMode:false,sanitizeHTML:true});Object.defineProperty(exports,"createDOMElement",{enumerable:true,get:function(){return vdom.createDOMElement}});Object.defineProperty(exports,"createElement",{enumerable:true,get:function(){return vdom.createElement}});Object.defineProperty(exports,"html",{enumerable:true,get:function(){return vdom.html}});Object.defineProperty(exports,"patch",{enumerable:true,get:function(){return vdom.patch}});Object.defineProperty(exports,"api",{enumerable:true,get:function(){return capi.api}});Object.defineProperty(exports,"configureApi",{enumerable:true,get:function(){return capi.configureApi}});Object.defineProperty(exports,"getApiConfig",{enumerable:true,get:function(){return capi.getApiConfig}});Object.defineProperty(exports,"http",{enumerable:true,get:function(){return capi.http}});Object.defineProperty(exports,"resetApiConfig",{enumerable:true,get:function(){return capi.resetApiConfig}});exports.CombinedContext=te;exports.Component=m;exports.Context=G;exports.Dropdown=he;exports.I18nManager=z;exports.ItemsLoader=ue;exports.Loader=I;exports.Popup=Z;exports.Provider=ve;exports.Router=ie;exports.SmartForm=_e;exports.SmartFormComponent=V;exports.Store=ae;exports.StyleManager=D;exports.TabbedView=x;exports.Toast=Y;exports.VisibilityObserver=Se;exports.camelCase=Ce;exports.capitalize=Ge;exports.clamp=et;exports.classNames=Be;exports.clearHookContext=Pe;exports.client=qt;exports.computed=dt;exports.connect=Ut;exports.createCombinedContext=vt;exports.createComputedStore=Dt;exports.createContext=mt;exports.createDropdown=ar;exports.createFunctionalComponent=Pt;exports.createItemsLoader=tr;exports.createStore=Oe;exports.createTabbedView=He;exports.createTranslator=sn;exports.css=be;exports.debounce=De;exports.deepClone=H;exports.deepMerge=ge;exports.formatDate=ze;exports.formatRelativeTime=fe;exports.formatTimeAgo=fr;exports.getCurrentLanguage=Zt;exports.getCurrentPath=oe;exports.getI18n=S;exports.getPopup=M;exports.getQueryParam=At;exports.getQueryParams=Re;exports.getSupportedLanguages=tn;exports.getTimeDisplay=gr;exports.getTimeTitle=mr;exports.getToast=q;exports.getTranslations=rn;exports.goBack=Rt;exports.goForward=Ot;exports.hasKey=nn;exports.initPopup=Ae;exports.initToast=Fe;exports.initializeI18n=an;exports.isBrowser=tt;exports.isCurrentPath=$t;exports.isCurrentPathPrefix=Vt;exports.isEmpty=We;exports.kebabCase=Je;exports.loadFromUrl=on;exports.loadLanguage=Xt;exports.loadLanguageFile=cn;exports.loadTranslations=en;exports.mountTabbedView=Wn;exports.navigate=we;exports.navigateWithQuery=Kt;exports.observeVisibility=dr;exports.parseQuery=Ze;exports.pascalCase=Qe;exports.popup=An;exports.reloadRoute=Ft;exports.router=O;exports.safeJsonParse=nt;exports.scheduler=U;exports.setHookContext=Me;exports.setLanguage=Qt;exports.setLanguageAsync=Yt;exports.setupI18n=ln;exports.sleep=qe;exports.state=g;exports.stringifyQuery=Xe;exports.t=h;exports.tHtml=le;exports.tLang=Jt;exports.throttle=Ue;exports.toast=fn;exports.truncate=Ye;exports.uniqueId=je;exports.useCallback=re;exports.useContext=bt;exports.useDebounce=Ct;exports.useEffect=R;exports.useEventListener=Mt;exports.useFetch=kt;exports.useInterval=xt;exports.useLocalStorage=_t;exports.useMemo=Ie;exports.usePrevious=St;exports.useReducer=Tt;exports.useRef=se;exports.useState=N;exports.useToggle=Et;exports.useWindowSize=Lt;exports.utils=cr;exports.watch=ht;//# sourceMappingURL=main.cjs.map
|
|
118
114
|
//# sourceMappingURL=main.cjs.map
|