dolphin-client 1.1.1 → 1.1.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.
@@ -1,20 +1,20 @@
1
- var DolphinModule=(()=>{var U=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var Z=Object.getOwnPropertyNames;var tt=Object.prototype.hasOwnProperty;var et=(A,t)=>{for(var e in t)U(A,e,{get:t[e],enumerable:!0})},nt=(A,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Z(t))!tt.call(A,i)&&i!==e&&U(A,i,{get:()=>t[i],enumerable:!(s=G(t,i))||s.enumerable});return A};var st=A=>nt(U({},"__esModule",{value:!0}),A);var rt={};et(rt,{DolphinClient:()=>C});var N=class{client;constructor(t){return this.client=t,this._createProxy([])}_createProxy(t){let e=t.join("/"),s=r=>this.request("GET",e,null,r);s.get=(r,a)=>typeof r=="string"?this.request("GET",r,null,a):this.request("GET",e,null,r),s.post=(r,a,d)=>typeof r=="string"?this.request("POST",r,a,d):this.request("POST",e,r,a),s.put=(r,a,d)=>typeof r=="string"?this.request("PUT",r,a,d):this.request("PUT",e,r,a),s.patch=(r,a,d)=>typeof r=="string"?this.request("PATCH",r,a,d):this.request("PATCH",e,r,a),s.del=(r,a)=>typeof r=="string"?this.request("DELETE",r,null,a):this.request("DELETE",e,null,r),s.request=(r,a,d,E)=>{let S=a?e?`${e}/${a.startsWith("/")?a.slice(1):a}`:a:e;return this.request(r,S,d,E)},s.requestDirect=(r,a,d,E)=>this.requestDirect(r,a,d,E),s._findCSRFToken=()=>this._findCSRFToken(),s._resolveBaseUrl=r=>this._resolveBaseUrl(r),s._normalizeValidationErrors=r=>this._normalizeValidationErrors(r);let i=["get","post","put","patch","del","request","requestDirect","_findCSRFToken","_resolveBaseUrl","_normalizeValidationErrors"];return new Proxy(s,{get:(r,a)=>typeof a=="string"&&!i.includes(a)?this._createProxy([...t,a]):r[a]})}_findCSRFToken(){if(typeof document>"u")return null;let t=["csrf-token","_csrf","xsrf-token","csrf_token"];for(let r of t){let a=document.querySelector(`meta[name="${r}"], meta[content][name$="${r}"]`);if(a){let d=a.getAttribute("content");if(d)return d}}let e=["_csrfToken","_token","_csrf","csrf_token"];for(let r of e){let a=document.querySelector(`input[type="hidden"][name="${r}"]`);if(a&&a.value)return a.value}let s=["csrfToken","XSRF-TOKEN","_csrf","csrf_token"];for(let r of s){let a=document.cookie.match(new RegExp("(^|;\\s*)"+r+"=([^;]*)"));if(a)return decodeURIComponent(a[2])}let i=typeof window<"u"&&window.wpApiSettings?.nonce;return i||null}_resolveBaseUrl(t){if(t.startsWith("http://")||t.startsWith("https://"))return t;let e=this.client.httpUrl;if(typeof document<"u"){let i=document.querySelector("base[href]");if(i){let r=i.getAttribute("href")||"";if(r&&r!=="/"){let a=r.endsWith("/")?r.slice(0,-1):r;e=`${this.client.httpUrl}${a.startsWith("/")?a:"/"+a}`}}else{let r=document.querySelector('meta[name="base-path"]');if(r){let a=r.getAttribute("content")||"";if(a&&a!=="/"){let d=a.endsWith("/")?a.slice(0,-1):a;e=`${this.client.httpUrl}${d.startsWith("/")?d:"/"+d}`}}}}let s=t.startsWith("/")?t:"/"+t;return`${e}${s}`}_normalizeValidationErrors(t){let e={};if(!t||typeof t!="object")return e;let s=t.errors||t.validationErrors||t;if(Array.isArray(s)){for(let i of s)if(i&&typeof i=="object"){let r=i.path||i.param||i.field||i.property,a=i.msg||i.message||i.error;r&&a&&(e[r]=Array.isArray(a)?a[0]:a)}return e}if(typeof s=="object"&&s!==null)for(let i in s){let r=s[i];if(r)if(Array.isArray(r))r.length>0&&(e[i]=String(r[0]));else if(typeof r=="object"){let a=Object.keys(r);if(a.length>0){let d=a[0];e[i]=String(r[d])}}else e[i]=String(r)}return e}async request(t,e,s=null,i={}){if(this.client.offline){let r=this.client.offline.isOnline,a=`${t.toUpperCase()}:${e}`;if(t.toUpperCase()==="GET")if(r)try{let d=await this.requestDirect(t,e,s,i);return await this.client.offline.setCache(a,d),d}catch(d){let E=await this.client.offline.getCache(a);if(E!=null)return E;throw d}else{let d=await this.client.offline.getCache(a);if(d!=null)return d;throw{status:503,data:{error:"Offline, no cache available"}}}else return r?this.requestDirect(t,e,s,i):(await this.client.offline.queueMutation(t,e,s),this.client._dispatch("offline:queued",{method:t,path:e,body:s}),{success:!0,offline:!0,message:"Mutation queued offline"})}return this.requestDirect(t,e,s,i)}async requestDirect(t,e,s=null,i={}){let r=i._isRetry===!0,a=t.toUpperCase(),d=s,S={...!["GET","HEAD"].includes(a)?{"Content-Type":"application/json"}:{},...i.headers||{}};["PUT","PATCH","DELETE"].includes(a)&&(this.client.options.methodSpoofing||i.methodSpoofing)&&(S["X-HTTP-Method-Override"]=a,d instanceof FormData?d.append("_method",a):d&&typeof d=="object"?d={...d,_method:a}:d||(d={_method:a}),a="POST");let k=this._resolveBaseUrl(e);this.client.options.debug&&console.log("%c\u{1F680} [Dolphin API Request]:","color: #3b82f6; font-weight: bold;",t.toUpperCase(),e,d||"");let f=new AbortController,u=setTimeout(()=>f.abort(),this.client.options.timeout);if(this.client.accessToken&&(S.Authorization=`Bearer ${this.client.accessToken}`),["POST","PUT","PATCH","DELETE"].includes(t.toUpperCase())){let n=this._findCSRFToken();n&&(S["X-CSRF-Token"]=n,S["X-XSRF-TOKEN"]=n,S["X-CSRFToken"]=n,S["X-WP-Nonce"]=n,d&&typeof d=="object"&&!d._csrfToken&&!d._token&&!d._csrf&&(d={...d,_csrfToken:n,_token:n,_csrf:n}))}let l={...i};delete l._isRetry,delete l.methodSpoofing;try{let n=await fetch(k,{method:a,headers:S,signal:f.signal,...d?{body:JSON.stringify(d)}:{},...l});if(clearTimeout(u),n.status===401&&!r&&this.client.options.autoRefreshToken&&await this.client.auth._silentRefresh())return this.request(t,e,s,{...i,_isRetry:!0});let c=(n.headers.get("content-type")||"").includes("application/json")?await n.json():await n.text();if(!n.ok)throw{status:n.status,data:c};if(this.client.options.debug&&console.log("%c\u2705 [Dolphin API Success]:","color: #10b981; font-weight: bold;",t.toUpperCase(),e,c),c&&typeof c=="object"&&c.accessToken&&(this.client.setToken(c.accessToken),c.user&&(this.client.auth.user=c.user)),this.client.options.autoBroadcast&&["POST","PUT","PATCH","DELETE"].includes(t.toUpperCase())){let y=e.startsWith("/")?e.substring(1):e;this.client.publish(y,{method:t.toUpperCase(),payload:s,result:c})}return c}catch(n){if(clearTimeout(u),this.client.options.debug&&console.error("%c\u274C [Dolphin API Error]:","color: #ef4444; font-weight: bold;",t.toUpperCase(),e,n),n&&typeof n=="object"&&n.data){let o=this._normalizeValidationErrors(n.data);if(Object.keys(o).length>0)for(let c in o)this.client.publish(`errors/${c}`,o[c])}throw n.name==="AbortError"?{status:408,data:{error:"Request timed out"}}:n}}};var q=class{client;user;_refreshing;constructor(t){this.client=t,this.user=null,this._refreshing=!1}async login(t,e){let s=await this.client.api.post("/api/auth/login",{email:t,password:e});return s.accessToken&&(this.client.setToken(s.accessToken),this.user=s.user||null),s}async register(t){return this.client.api.post("/api/auth/register",t)}async me(){let t=await this.client.api.get("/api/auth/me");return t.success&&(this.user=t.data),t}async logout(){try{await this.client.api.post("/api/auth/logout")}catch{}this.client.setToken(null),this.user=null}async refresh(){return this._silentRefresh()}async _silentRefresh(){if(this._refreshing)return!1;this._refreshing=!0;try{let t=await this.client.api.post("/api/auth/refresh",null,{_isRetry:!0});return t.accessToken?(this.client.setToken(t.accessToken),!0):!1}catch{return this.client.setToken(null),!1}finally{this._refreshing=!1}}async verify2FA(t,e){let s={code:t,email:e||this.user?.email},i=await this.client.api.post("/api/auth/2fa/verify",s);return i.accessToken&&(this.client.setToken(i.accessToken),i.user&&(this.user=i.user)),i}async enable2FA(){return this.client.api.post("/api/auth/2fa/enable")}async disable2FA(t){return this.client.api.post("/api/auth/2fa/disable",{code:t})}async forgotPassword(t){return this.client.api.post("/api/auth/forgot-password",{email:t})}async resetPassword(t,e){return this.client.api.post("/api/auth/reset-password",{token:t,newPassword:e})}};var O=class{client;data;listeners;subscribed;_unsubscribers;constructor(t){return this.client=t,this.data=new Map,this.listeners=new Set,this.subscribed=new Set,this._unsubscribers=new Map,new Proxy(this,{get:(e,s)=>{if(s in e)return e[s];if(typeof s=="string")return this._getCollection(s)}})}_getCollection(t){if(!this.data.has(t)){let e={_rawItems:[],items:[],loading:!0,error:null,success:!1,_filter:null,_sort:null,where:s=>(e._filter=s,this._applyTransform(e),e),orderBy:(s,i="asc")=>(e._sort={key:s,direction:i},this._applyTransform(e),e),reset:()=>(e._filter=null,e._sort=null,this._applyTransform(e),e)};this.data.set(t,e),this._fetchAndSync(t)}return this.data.get(t)}async _fetchAndSync(t){let e=this.data.get(t);try{let s=await this.client.api.get(`/${t.toLowerCase()}`);if(e._rawItems=Array.isArray(s)?s:s.data||[],e.loading=!1,e.success=!0,e.error=null,this._applyTransform(e),!this.subscribed.has(t)){let i=()=>this.client.unsubscribe(`db:sync/${t.toLowerCase()}`,r),r=a=>{this._handleRemoteUpdate(t,a)};this.client.subscribe(`db:sync/${t.toLowerCase()}`,r),this._unsubscribers.set(t,i),this.subscribed.add(t)}}catch(s){e.loading=!1,e.success=!1,e.error=s.data?.error||s.message||"Fetch failed",this._notify()}}_applyTransform(t){let e=[...t._rawItems];if(t._filter&&(e=e.filter(t._filter)),t._sort){let{key:s,direction:i}=t._sort;e.sort((r,a)=>r[s]===a[s]?0:(r[s]>a[s]?1:-1)*(i==="asc"?1:-1))}t.items=e,this._notify()}_handleRemoteUpdate(t,e){let s=this.data.get(t);if(!s)return;let{type:i,data:r}=e,a=s._rawItems;i==="create"?a=[...a,r]:i==="update"?a=a.map(d=>d.id===r.id||d._id===r._id?{...d,...r}:d):i==="delete"&&(a=a.filter(d=>!(r.id!=null&&d.id===r.id||r._id!=null&&d._id===r._id))),s._rawItems=a,this._applyTransform(s)}subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}getSnapshot(t){return this.data.get(t)||{items:[],loading:!1,error:null,success:!1}}_notify(){this.listeners.forEach(t=>t())}destroy(){this._unsubscribers.forEach(t=>{try{t()}catch{}}),this._unsubscribers.clear(),this.subscribed.clear(),this.listeners.clear(),this.data.clear()}};var C=class{host;httpUrl;deviceId;options;socket;storage;accessToken;api;auth;store;handlers;signalHandlers;fileHandlers;_offlineQueue;reconnectAttempts;_reconnectTimer;_attachedListeners;constructor(t="",e="",s={}){!t&&typeof window<"u"&&(t=window.location.host);let i="http:";t.startsWith("https://")?i="https:":t.startsWith("http://")?i="http:":typeof window<"u"&&(i=window.location.protocol),this.host=(t||"localhost").replace(/\/$/,"").replace(/^https?:\/\//,""),this.httpUrl=`${i}//${this.host}`,this.deviceId=e||(typeof crypto<"u"&&typeof crypto.randomUUID=="function"?"web_"+crypto.randomUUID().replace(/-/g,"").slice(0,8):"web_"+Math.random().toString(36).slice(2,10)),this.options={timeout:15e3,chunkSize:65536,maxReconnect:5,autoRefreshToken:!0,debug:!1,methodSpoofing:!1,routerViewport:"main, #viewport, body",routerTransitions:!0,...s},this.socket=null,this.storage=typeof localStorage<"u"?localStorage:{getItem:()=>null,setItem:()=>{},removeItem:()=>{}},this.accessToken=this.storage.getItem("dolphin_token"),this.api=new N(this),this.auth=new q(this),this.store=new O(this),this.handlers=new Map,this.signalHandlers=new Set,this.fileHandlers=new Set,this._offlineQueue=[],this.reconnectAttempts=0,this._reconnectTimer=null,this._attachedListeners=[],typeof window<"u"&&typeof this._initDOMBinding=="function"&&this._initDOMBinding(),typeof this._initOffline=="function"&&this._initOffline(),typeof this._initA11y=="function"&&this._initA11y(),typeof this._initI18n=="function"&&this._initI18n(),typeof this._initDragDrop=="function"&&this._initDragDrop(),typeof this._initCollab=="function"&&this._initCollab()}setToken(t){this.accessToken=t,t?this.storage.setItem("dolphin_token",t):this.storage.removeItem("dolphin_token")}async connect(){return this.socket&&(this.socket.readyState===WebSocket.OPEN||this.socket.readyState===WebSocket.CONNECTING)?Promise.resolve():new Promise((t,e)=>{let i=`${this.httpUrl.startsWith("https")?"wss:":"ws:"}//${this.host}/realtime?deviceId=${this.deviceId}`;console.log(`[Dolphin] Connecting to ${i}...`),this.socket=new WebSocket(i),this.socket.onopen=()=>{console.log(`[Dolphin] Connected as "${this.deviceId}" \u{1F42C}`),this.reconnectAttempts=0,this._flushOfflineQueue(),t()},this.socket.onmessage=r=>this._handleMessage(r.data),this.socket.onclose=()=>{console.warn("[Dolphin] Connection closed"),this._maybeReconnect()},this.socket.onerror=r=>{console.error("[Dolphin] WebSocket error:",r),e(r)}})}disconnect(){this._reconnectTimer!==null&&(clearTimeout(this._reconnectTimer),this._reconnectTimer=null),this.socket&&(this.socket.onclose=null,this.socket.close(),this.socket=null),typeof this._collabCleanup=="function"&&this._collabCleanup(),this.cleanupDomListeners()}_handleMessage(t){try{let e=JSON.parse(t);this.options.debug&&console.log("%c\u{1F4E5} [Dolphin WS Incoming]:","color: #eab308; font-weight: bold;",e),e.type&&e.from&&(e.to===this.deviceId||e.to==="all")&&(e.msgId&&e.type!=="ACK"&&this._sendAck(e.from,e.msgId),this.signalHandlers.forEach(s=>s(e))),e.type==="FILE_AVAILABLE"&&this.fileHandlers.forEach(s=>s(e)),e.type==="FILE_CHUNK"&&(this.saveFileProgress(e.fileId,e.chunkIndex),this._dispatch("file:chunk",e),this._dispatch(`file:chunk/${e.fileId}`,e)),e.type==="FILE_UPLOAD_ACK"&&this._dispatch(`file:upload:ack/${e.fileId}`,e),e.type==="PULL_RESPONSE"&&(this._dispatch("pull:response",e.payload,e.topic),this._dispatch(`pull:response/${e.topic}`,e.payload,e.topic)),e.topic&&e.payload!==void 0&&this.handlers.forEach((s,i)=>{this._matchTopic(i,e.topic)&&s.forEach(r=>r(e.payload,e.topic))})}catch{this._dispatch("raw",t)}}_dispatch(t,e,s){let i=this.handlers.get(t);i&&i.forEach(r=>r(e,s||t))}_sendRaw(t){this.options.debug&&console.log("%c\u{1F4E4} [Dolphin WS Outgoing]:","color: #8b5cf6; font-weight: bold;",t);let e=typeof t=="string"?t:JSON.stringify(t);this.socket&&this.socket.readyState===WebSocket.OPEN?this.socket.send(e):this._offlineQueue.length<100&&this._offlineQueue.push(e)}_flushOfflineQueue(){for(;this._offlineQueue.length>0;){let t=this._offlineQueue.shift();this.socket&&this.socket.readyState===WebSocket.OPEN&&this.socket.send(t)}}_sendAck(t,e){this._sendRaw({type:"ACK",from:this.deviceId,to:t,data:{ackId:e},timestamp:Date.now()})}_matchTopic(t,e){if(t===e||t==="#")return!0;let s=t.split("/"),i=e.split("/");if(s.length!==i.length&&!t.includes("#"))return!1;for(let r=0;r<s.length;r++){if(s[r]==="#")return!0;if(s[r]!=="+"&&s[r]!==i[r])return!1}return s.length===i.length}_maybeReconnect(){if(this.reconnectAttempts<this.options.maxReconnect){this.reconnectAttempts++;let t=Math.pow(2,this.reconnectAttempts)*1e3;console.log(`[Dolphin] Reconnecting in ${t/1e3}s (attempt ${this.reconnectAttempts})...`),this._reconnectTimer=setTimeout(()=>{this._reconnectTimer=null,this.connect().catch(()=>{})},t)}else console.error("[Dolphin] Max reconnect attempts reached.")}subscribe(t,e){this.handlers.has(t)||(this.handlers.set(t,new Set),this._sendRaw({type:"sub",topic:t})),this.handlers.get(t).add(e)}unsubscribe(t,e){if(this.handlers.has(t)){let s=this.handlers.get(t);s.delete(e),s.size===0&&(this.handlers.delete(t),this._sendRaw({type:"unsub",topic:t}))}}publish(t,e){this._sendRaw({topic:t,payload:e})}pubPush(t,e){this._sendRaw({type:"pub",topic:t,payload:e})}subPull(t,e=10){this._sendRaw({type:"PULL_REQUEST",topic:t,count:e})}async pubFile(t,e,s="",i){let r;e instanceof Blob?r=await e.arrayBuffer():e instanceof ArrayBuffer?r=e:r=e.buffer||e;let a=new Uint8Array(r),d=this.options.chunkSize,E=Math.ceil(a.length/d);this._sendRaw({type:"FILE_UPLOAD_START",fileId:t,name:s,size:a.length,totalChunks:E,chunkSize:d});for(let S=0;S<E;S++){let k=a.slice(S*d,(S+1)*d),f=this._uint8ToBase64(k);this._sendRaw({type:"FILE_UPLOAD_CHUNK",fileId:t,chunkIndex:S,totalChunks:E,data:f}),i&&i(Math.round((S+1)/E*100)),S%10===0&&await new Promise(u=>setTimeout(u,0))}this._sendRaw({type:"FILE_UPLOAD_DONE",fileId:t})}_uint8ToBase64(t){let e="";for(let s=0;s<t.length;s++)e+=String.fromCharCode(t[s]);return typeof btoa<"u"?btoa(e):Buffer.from(e,"binary").toString("base64")}subFile(t,e=0){this._sendRaw({type:"FILE_REQUEST",fileId:t,startChunk:e})}resumeFile(t){let e=parseInt(this.storage.getItem(`dolphin_file_${t}`)||"-1");this.subFile(t,e+1)}saveFileProgress(t,e){this.storage.setItem(`dolphin_file_${t}`,e.toString())}onSignal(t){this.signalHandlers.add(t)}offSignal(t){this.signalHandlers.delete(t)}onFileAvailable(t){this.fileHandlers.add(t)}offFileAvailable(t){this.fileHandlers.delete(t)}addDomListener(t,e,s){t&&(t.addEventListener(e,s),this._attachedListeners=this._attachedListeners||[],this._attachedListeners.push({target:t,event:e,cb:s}))}cleanupDomListeners(){this._attachedListeners&&(this._attachedListeners.forEach(({target:t,event:e,cb:s})=>{try{t.removeEventListener(e,s)}catch{}}),this._attachedListeners=[])}};function B(A){let t=new Map;function e(f){return f.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function s(f){let u=f.getAttribute("data-rt-template");if(!u)return null;if(typeof document<"u"&&!u.includes("<"))try{let l=document.querySelector(u);if(l)return l.innerHTML}catch{}return u}function i(f,u){if(!f.includes("{#if")&&!f.includes("{#each")){let l=f;for(let n in u){let o=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");l=l.replace(new RegExp(`\\{\\{${o}\\}\\}`,"g"),u[n]!==void 0&&u[n]!==null?u[n]:"")}return l}try{let l=p=>p.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t"),n=`let out = "";
2
- `,o=0,c=/(\{\{([\s\S]*?)\}\}|\{#if\s+([\s\S]*?)\}|\{:else\s+if\s+([\s\S]*?)\}|\{:else\}|\{\/if\}|\{#each\s+([\s\S]*?)\s+as\s+([a-zA-Z_$][a-zA-Z0-9_$]*)(?:\s*,\s*([a-zA-Z_$][a-zA-Z0-9_$]*))?\}|\{\/each\}|\{([^{}]+?)\})/g,y=[],h;for(;(h=c.exec(f))!==null;){let p=f.slice(o,h.index);p&&(n+=`out += "${l(p)}";
3
- `);let b=h[0];if(b.startsWith("{{")){let T=h[2];n+=`out += (${T} !== undefined && ${T} !== null ? ${T} : "");
4
- `}else if(b.startsWith("{#if")){let T=h[3];n+=`if (${T}) {
5
- `}else if(b.startsWith("{:else if")){let T=h[4];n+=`} else if (${T}) {
6
- `}else if(b.startsWith("{:else}"))n+=`} else {
7
- `;else if(b.startsWith("{/if}"))n+=`}
8
- `;else if(b.startsWith("{#each")){let T=h[5],x=h[6],v=h[7];y.push({indexVar:v}),n+=`if (typeof ${T} !== "undefined" && ${T} !== null && Array.isArray(${T})) {
1
+ var DolphinModule=(()=>{var U=Object.defineProperty;var nt=Object.getOwnPropertyDescriptor;var it=Object.getOwnPropertyNames;var st=Object.prototype.hasOwnProperty;var rt=(w,t)=>{for(var e in t)U(w,e,{get:t[e],enumerable:!0})},ot=(w,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of it(t))!st.call(w,s)&&s!==e&&U(w,s,{get:()=>t[s],enumerable:!(i=nt(t,s))||i.enumerable});return w};var at=w=>ot(U({},"__esModule",{value:!0}),w);var lt={};rt(lt,{DolphinClient:()=>$});var N=class{client;constructor(t){return this.client=t,this._createProxy([])}_createProxy(t){let e=t.join("/"),i=r=>this.request("GET",e,null,r);i.get=(r,a)=>typeof r=="string"?this.request("GET",r,null,a):this.request("GET",e,null,r),i.post=(r,a,y)=>typeof r=="string"?this.request("POST",r,a,y):this.request("POST",e,r,a),i.put=(r,a,y)=>typeof r=="string"?this.request("PUT",r,a,y):this.request("PUT",e,r,a),i.patch=(r,a,y)=>typeof r=="string"?this.request("PATCH",r,a,y):this.request("PATCH",e,r,a),i.del=(r,a)=>typeof r=="string"?this.request("DELETE",r,null,a):this.request("DELETE",e,null,r),i.request=(r,a,y,T)=>{let E=a?e?`${e}/${a.startsWith("/")?a.slice(1):a}`:a:e;return this.request(r,E,y,T)},i.requestDirect=(r,a,y,T)=>this.requestDirect(r,a,y,T),i._findCSRFToken=()=>this._findCSRFToken(),i._resolveBaseUrl=r=>this._resolveBaseUrl(r),i._normalizeValidationErrors=r=>this._normalizeValidationErrors(r);let s=["get","post","put","patch","del","request","requestDirect","_findCSRFToken","_resolveBaseUrl","_normalizeValidationErrors"];return new Proxy(i,{get:(r,a)=>typeof a=="string"&&!s.includes(a)?this._createProxy([...t,a]):r[a]})}_findCSRFToken(){if(typeof document>"u")return null;let t=["csrf-token","_csrf","xsrf-token","csrf_token"];for(let r of t){let a=document.querySelector(`meta[name="${r}"], meta[content][name$="${r}"]`);if(a){let y=a.getAttribute("content");if(y)return y}}let e=["_csrfToken","_token","_csrf","csrf_token"];for(let r of e){let a=document.querySelector(`input[type="hidden"][name="${r}"]`);if(a&&a.value)return a.value}let i=["csrfToken","XSRF-TOKEN","_csrf","csrf_token"];for(let r of i){let a=document.cookie.match(new RegExp("(^|;\\s*)"+r+"=([^;]*)"));if(a)return decodeURIComponent(a[2])}let s=typeof window<"u"&&window.wpApiSettings?.nonce;return s||null}_resolveBaseUrl(t){if(t.startsWith("http://")||t.startsWith("https://"))return t;let e=this.client.httpUrl;if(typeof document<"u"){let s=document.querySelector("base[href]");if(s){let r=s.getAttribute("href")||"";if(r&&r!=="/"){let a=r.endsWith("/")?r.slice(0,-1):r;e=`${this.client.httpUrl}${a.startsWith("/")?a:"/"+a}`}}else{let r=document.querySelector('meta[name="base-path"]');if(r){let a=r.getAttribute("content")||"";if(a&&a!=="/"){let y=a.endsWith("/")?a.slice(0,-1):a;e=`${this.client.httpUrl}${y.startsWith("/")?y:"/"+y}`}}}}let i=t.startsWith("/")?t:"/"+t;return`${e}${i}`}_normalizeValidationErrors(t){let e={};if(!t||typeof t!="object")return e;let i=t.errors||t.validationErrors||t;if(Array.isArray(i)){for(let s of i)if(s&&typeof s=="object"){let r=s.path||s.param||s.field||s.property,a=s.msg||s.message||s.error;r&&a&&(e[r]=Array.isArray(a)?a[0]:a)}return e}if(typeof i=="object"&&i!==null)for(let s in i){let r=i[s];if(r)if(Array.isArray(r))r.length>0&&(e[s]=String(r[0]));else if(typeof r=="object"){let a=Object.keys(r);if(a.length>0){let y=a[0];e[s]=String(r[y])}}else e[s]=String(r)}return e}async request(t,e,i=null,s={}){if(this.client.offline){let r=this.client.offline.isOnline,a=`${t.toUpperCase()}:${e}`;if(t.toUpperCase()==="GET")if(r)try{let y=await this.requestDirect(t,e,i,s);return await this.client.offline.setCache(a,y),y}catch(y){let T=await this.client.offline.getCache(a);if(T!=null)return T;throw y}else{let y=await this.client.offline.getCache(a);if(y!=null)return y;throw{status:503,data:{error:"Offline, no cache available"}}}else return r?this.requestDirect(t,e,i,s):(await this.client.offline.queueMutation(t,e,i),this.client._dispatch("offline:queued",{method:t,path:e,body:i}),{success:!0,offline:!0,message:"Mutation queued offline"})}return this.requestDirect(t,e,i,s)}async requestDirect(t,e,i=null,s={}){let r=s._isRetry===!0,a=t.toUpperCase(),y=i,E={...!["GET","HEAD"].includes(a)?{"Content-Type":"application/json"}:{},...s.headers||{}};["PUT","PATCH","DELETE"].includes(a)&&(this.client.options.methodSpoofing||s.methodSpoofing)&&(E["X-HTTP-Method-Override"]=a,y instanceof FormData?y.append("_method",a):y&&typeof y=="object"?y={...y,_method:a}:y||(y={_method:a}),a="POST");let D=this._resolveBaseUrl(e);this.client.options.debug&&console.log("%c\u{1F680} [Dolphin API Request]:","color: #3b82f6; font-weight: bold;",t.toUpperCase(),e,y||"");let k=new AbortController,M=setTimeout(()=>k.abort(),this.client.options.timeout);if(this.client.accessToken&&(E.Authorization=`Bearer ${this.client.accessToken}`),["POST","PUT","PATCH","DELETE"].includes(t.toUpperCase())){let h=this._findCSRFToken();h&&(E["X-CSRF-Token"]=h,E["X-XSRF-TOKEN"]=h,E["X-CSRFToken"]=h,E["X-WP-Nonce"]=h,y&&typeof y=="object"&&!y._csrfToken&&!y._token&&!y._csrf&&(y={...y,_csrfToken:h,_token:h,_csrf:h}))}let x={...s};delete x._isRetry,delete x.methodSpoofing;try{let h=await fetch(D,{method:a,headers:E,signal:k.signal,...y?{body:JSON.stringify(y)}:{},...x});if(clearTimeout(M),h.status===401&&!r&&this.client.options.autoRefreshToken&&await this.client.auth._silentRefresh())return this.request(t,e,i,{...s,_isRetry:!0});let f=(h.headers.get("content-type")||"").includes("application/json")?await h.json():await h.text();if(!h.ok)throw{status:h.status,data:f};if(this.client.options.debug&&console.log("%c\u2705 [Dolphin API Success]:","color: #10b981; font-weight: bold;",t.toUpperCase(),e,f),f&&typeof f=="object"&&f.accessToken&&(this.client.setToken(f.accessToken),f.user&&(this.client.auth.user=f.user)),this.client.options.autoBroadcast&&["POST","PUT","PATCH","DELETE"].includes(t.toUpperCase())){let n=e.startsWith("/")?e.substring(1):e;this.client.publish(n,{method:t.toUpperCase(),payload:i,result:f})}return f}catch(h){if(clearTimeout(M),this.client.options.debug&&console.error("%c\u274C [Dolphin API Error]:","color: #ef4444; font-weight: bold;",t.toUpperCase(),e,h),h&&typeof h=="object"&&h.data){let d=this._normalizeValidationErrors(h.data);if(Object.keys(d).length>0)for(let f in d)this.client.publish(`errors/${f}`,d[f])}throw h.name==="AbortError"?{status:408,data:{error:"Request timed out"}}:h}}};var R=class{client;user;_refreshing;constructor(t){this.client=t,this.user=null,this._refreshing=!1}async login(t,e){let i=await this.client.api.post("/api/auth/login",{email:t,password:e});return i.accessToken&&(this.client.setToken(i.accessToken),this.user=i.user||null),i}async register(t){return this.client.api.post("/api/auth/register",t)}async me(){let t=await this.client.api.get("/api/auth/me");return t.success&&(this.user=t.data),t}async logout(){try{await this.client.api.post("/api/auth/logout")}catch{}this.client.setToken(null),this.user=null}async refresh(){return this._silentRefresh()}async _silentRefresh(){if(this._refreshing)return!1;this._refreshing=!0;try{let t=await this.client.api.post("/api/auth/refresh",null,{_isRetry:!0});return t.accessToken?(this.client.setToken(t.accessToken),!0):!1}catch{return this.client.setToken(null),!1}finally{this._refreshing=!1}}async verify2FA(t,e){let i={code:t,email:e||this.user?.email},s=await this.client.api.post("/api/auth/2fa/verify",i);return s.accessToken&&(this.client.setToken(s.accessToken),s.user&&(this.user=s.user)),s}async enable2FA(){return this.client.api.post("/api/auth/2fa/enable")}async disable2FA(t){return this.client.api.post("/api/auth/2fa/disable",{code:t})}async forgotPassword(t){return this.client.api.post("/api/auth/forgot-password",{email:t})}async resetPassword(t,e){return this.client.api.post("/api/auth/reset-password",{token:t,newPassword:e})}};var O=class{client;data;listeners;subscribed;_unsubscribers;constructor(t){return this.client=t,this.data=new Map,this.listeners=new Set,this.subscribed=new Set,this._unsubscribers=new Map,new Proxy(this,{get:(e,i)=>{if(i in e)return e[i];if(typeof i=="string")return this._getCollection(i)}})}_getCollection(t){if(!this.data.has(t)){let e={_rawItems:[],items:[],loading:!0,error:null,success:!1,_filter:null,_sort:null,where:i=>(e._filter=i,this._applyTransform(e),e),orderBy:(i,s="asc")=>(e._sort={key:i,direction:s},this._applyTransform(e),e),reset:()=>(e._filter=null,e._sort=null,this._applyTransform(e),e)};this.data.set(t,e),this._fetchAndSync(t)}return this.data.get(t)}async _fetchAndSync(t){let e=this.data.get(t);try{let i=await this.client.api.get(`/${t.toLowerCase()}`);if(e._rawItems=Array.isArray(i)?i:i.data||[],e.loading=!1,e.success=!0,e.error=null,this._applyTransform(e),!this.subscribed.has(t)){let s=()=>this.client.unsubscribe(`db:sync/${t.toLowerCase()}`,r),r=a=>{this._handleRemoteUpdate(t,a)};this.client.subscribe(`db:sync/${t.toLowerCase()}`,r),this._unsubscribers.set(t,s),this.subscribed.add(t)}}catch(i){e.loading=!1,e.success=!1,e.error=i.data?.error||i.message||"Fetch failed",this._notify()}}_applyTransform(t){let e=[...t._rawItems];if(t._filter&&(e=e.filter(t._filter)),t._sort){let{key:i,direction:s}=t._sort;e.sort((r,a)=>r[i]===a[i]?0:(r[i]>a[i]?1:-1)*(s==="asc"?1:-1))}t.items=e,this._notify()}_handleRemoteUpdate(t,e){let i=this.data.get(t);if(!i)return;let{type:s,data:r}=e,a=i._rawItems;s==="create"?a=[...a,r]:s==="update"?a=a.map(y=>y.id===r.id||y._id===r._id?{...y,...r}:y):s==="delete"&&(a=a.filter(y=>!(r.id!=null&&y.id===r.id||r._id!=null&&y._id===r._id))),i._rawItems=a,this._applyTransform(i)}subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}getSnapshot(t){return this.data.get(t)||{items:[],loading:!1,error:null,success:!1}}_notify(){this.listeners.forEach(t=>t())}destroy(){this._unsubscribers.forEach(t=>{try{t()}catch{}}),this._unsubscribers.clear(),this.subscribed.clear(),this.listeners.clear(),this.data.clear()}};var $=class{host;httpUrl;deviceId;options;socket;storage;accessToken;api;auth;store;handlers;signalHandlers;fileHandlers;_offlineQueue;reconnectAttempts;_reconnectTimer;_attachedListeners;constructor(t="",e="",i={}){!t&&typeof window<"u"&&(t=window.location.host);let s="http:";t.startsWith("https://")?s="https:":t.startsWith("http://")?s="http:":typeof window<"u"&&(s=window.location.protocol),this.host=(t||"localhost").replace(/\/$/,"").replace(/^https?:\/\//,""),this.httpUrl=`${s}//${this.host}`,this.deviceId=e||(typeof crypto<"u"&&typeof crypto.randomUUID=="function"?"web_"+crypto.randomUUID().replace(/-/g,"").slice(0,8):"web_"+Math.random().toString(36).slice(2,10)),this.options={timeout:15e3,chunkSize:65536,maxReconnect:5,autoRefreshToken:!0,debug:!1,methodSpoofing:!1,routerViewport:"main, #viewport, body",routerTransitions:!0,...i},this.socket=null,this.storage=typeof localStorage<"u"?localStorage:{getItem:()=>null,setItem:()=>{},removeItem:()=>{}},this.accessToken=this.storage.getItem("dolphin_token"),this.api=new N(this),this.auth=new R(this),this.store=new O(this),this.handlers=new Map,this.signalHandlers=new Set,this.fileHandlers=new Set,this._offlineQueue=[],this.reconnectAttempts=0,this._reconnectTimer=null,this._attachedListeners=[],typeof window<"u"&&typeof this._initDOMBinding=="function"&&this._initDOMBinding(),typeof this._initOffline=="function"&&this._initOffline(),typeof this._initA11y=="function"&&this._initA11y(),typeof this._initI18n=="function"&&this._initI18n(),typeof this._initDragDrop=="function"&&this._initDragDrop(),typeof this._initCollab=="function"&&this._initCollab()}setToken(t){this.accessToken=t,t?this.storage.setItem("dolphin_token",t):this.storage.removeItem("dolphin_token")}async connect(){return this.socket&&(this.socket.readyState===WebSocket.OPEN||this.socket.readyState===WebSocket.CONNECTING)?Promise.resolve():new Promise((t,e)=>{let s=`${this.httpUrl.startsWith("https")?"wss:":"ws:"}//${this.host}/realtime?deviceId=${this.deviceId}`;console.log(`[Dolphin] Connecting to ${s}...`),this.socket=new WebSocket(s),this.socket.onopen=()=>{console.log(`[Dolphin] Connected as "${this.deviceId}" \u{1F42C}`),this.reconnectAttempts=0,this._flushOfflineQueue(),t()},this.socket.onmessage=r=>this._handleMessage(r.data),this.socket.onclose=()=>{console.warn("[Dolphin] Connection closed"),this._maybeReconnect()},this.socket.onerror=r=>{console.error("[Dolphin] WebSocket error:",r),e(r)}})}disconnect(){this._reconnectTimer!==null&&(clearTimeout(this._reconnectTimer),this._reconnectTimer=null),this.socket&&(this.socket.onclose=null,this.socket.close(),this.socket=null),typeof this._collabCleanup=="function"&&this._collabCleanup(),this.cleanupDomListeners()}_handleMessage(t){try{let e=JSON.parse(t);this.options.debug&&console.log("%c\u{1F4E5} [Dolphin WS Incoming]:","color: #eab308; font-weight: bold;",e),e.type&&e.from&&(e.to===this.deviceId||e.to==="all")&&(e.msgId&&e.type!=="ACK"&&this._sendAck(e.from,e.msgId),this.signalHandlers.forEach(i=>i(e))),e.type==="FILE_AVAILABLE"&&this.fileHandlers.forEach(i=>i(e)),e.type==="FILE_CHUNK"&&(this.saveFileProgress(e.fileId,e.chunkIndex),this._dispatch("file:chunk",e),this._dispatch(`file:chunk/${e.fileId}`,e)),e.type==="FILE_UPLOAD_ACK"&&this._dispatch(`file:upload:ack/${e.fileId}`,e),e.type==="PULL_RESPONSE"&&(this._dispatch("pull:response",e.payload,e.topic),this._dispatch(`pull:response/${e.topic}`,e.payload,e.topic)),e.topic&&e.payload!==void 0&&this.handlers.forEach((i,s)=>{this._matchTopic(s,e.topic)&&i.forEach(r=>r(e.payload,e.topic))})}catch{this._dispatch("raw",t)}}_dispatch(t,e,i){let s=this.handlers.get(t);s&&s.forEach(r=>r(e,i||t))}_sendRaw(t){this.options.debug&&console.log("%c\u{1F4E4} [Dolphin WS Outgoing]:","color: #8b5cf6; font-weight: bold;",t);let e=typeof t=="string"?t:JSON.stringify(t);this.socket&&this.socket.readyState===WebSocket.OPEN?this.socket.send(e):this._offlineQueue.length<100&&this._offlineQueue.push(e)}_flushOfflineQueue(){for(;this._offlineQueue.length>0;){let t=this._offlineQueue.shift();this.socket&&this.socket.readyState===WebSocket.OPEN&&this.socket.send(t)}}_sendAck(t,e){this._sendRaw({type:"ACK",from:this.deviceId,to:t,data:{ackId:e},timestamp:Date.now()})}_matchTopic(t,e){if(t===e||t==="#")return!0;let i=t.split("/"),s=e.split("/");if(i.length!==s.length&&!t.includes("#"))return!1;for(let r=0;r<i.length;r++){if(i[r]==="#")return!0;if(i[r]!=="+"&&i[r]!==s[r])return!1}return i.length===s.length}_maybeReconnect(){if(this.reconnectAttempts<this.options.maxReconnect){this.reconnectAttempts++;let t=Math.pow(2,this.reconnectAttempts)*1e3;console.log(`[Dolphin] Reconnecting in ${t/1e3}s (attempt ${this.reconnectAttempts})...`),this._reconnectTimer=setTimeout(()=>{this._reconnectTimer=null,this.connect().catch(()=>{})},t)}else console.error("[Dolphin] Max reconnect attempts reached.")}subscribe(t,e){this.handlers.has(t)||(this.handlers.set(t,new Set),this._sendRaw({type:"sub",topic:t})),this.handlers.get(t).add(e)}unsubscribe(t,e){if(this.handlers.has(t)){let i=this.handlers.get(t);i.delete(e),i.size===0&&(this.handlers.delete(t),this._sendRaw({type:"unsub",topic:t}))}}publish(t,e){this._sendRaw({topic:t,payload:e})}pubPush(t,e){this._sendRaw({type:"pub",topic:t,payload:e})}subPull(t,e=10){this._sendRaw({type:"PULL_REQUEST",topic:t,count:e})}async pubFile(t,e,i="",s){let r;e instanceof Blob?r=await e.arrayBuffer():e instanceof ArrayBuffer?r=e:r=e.buffer||e;let a=new Uint8Array(r),y=this.options.chunkSize,T=Math.ceil(a.length/y);this._sendRaw({type:"FILE_UPLOAD_START",fileId:t,name:i,size:a.length,totalChunks:T,chunkSize:y});for(let E=0;E<T;E++){let D=a.slice(E*y,(E+1)*y),k=this._uint8ToBase64(D);this._sendRaw({type:"FILE_UPLOAD_CHUNK",fileId:t,chunkIndex:E,totalChunks:T,data:k}),s&&s(Math.round((E+1)/T*100)),E%10===0&&await new Promise(M=>setTimeout(M,0))}this._sendRaw({type:"FILE_UPLOAD_DONE",fileId:t})}_uint8ToBase64(t){let e="";for(let i=0;i<t.length;i++)e+=String.fromCharCode(t[i]);return typeof btoa<"u"?btoa(e):Buffer.from(e,"binary").toString("base64")}subFile(t,e=0){this._sendRaw({type:"FILE_REQUEST",fileId:t,startChunk:e})}resumeFile(t){let e=parseInt(this.storage.getItem(`dolphin_file_${t}`)||"-1");this.subFile(t,e+1)}saveFileProgress(t,e){this.storage.setItem(`dolphin_file_${t}`,e.toString())}onSignal(t){this.signalHandlers.add(t)}offSignal(t){this.signalHandlers.delete(t)}onFileAvailable(t){this.fileHandlers.add(t)}offFileAvailable(t){this.fileHandlers.delete(t)}addDomListener(t,e,i){t&&(t.addEventListener(e,i),this._attachedListeners=this._attachedListeners||[],this._attachedListeners.push({target:t,event:e,cb:i}))}cleanupDomListeners(){this._attachedListeners&&(this._attachedListeners.forEach(({target:t,event:e,cb:i})=>{try{t.removeEventListener(e,i)}catch{}}),this._attachedListeners=[])}};function B(w){let t=new Map;function e(h){return h.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function i(h,d){if(!(!d||typeof d!="object"))try{let f=new Proxy(d,{has(o,c){return!0},get(o,c){if(typeof c=="string"){if(c in o)return o[c];if(typeof globalThis<"u"&&c in globalThis)return globalThis[c];if(typeof window<"u"&&c in window)return window[c]}}});return new Function("ctx",`with(ctx) { return (${h}); }`)(f)}catch{return d[h]}}function s(h,d){let f=[],n="",o=!1,c=!1,p=!1,l=0;for(let g=0;g<h.length;g++){let u=h[g];u==="'"&&!c&&!p?o=!o:u==='"'&&!o&&!p?c=!c:u==="`"&&!o&&!c?p=!p:u==="("||u==="["||u==="{"?!o&&!c&&!p&&l++:(u===")"||u==="]"||u==="}")&&!o&&!c&&!p&&l--,u===d&&!o&&!c&&!p&&l===0?(f.push(n),n=""):n+=u}return f.push(n),f}function r(h){let d=!1,f=!1,n=!1,o=0;for(let c=0;c<h.length;c++){let p=h[c];if(p==="'"&&!f&&!n?d=!d:p==='"'&&!d&&!n?f=!f:p==="`"&&!d&&!f?n=!n:p==="("||p==="["||p==="{"?!d&&!f&&!n&&o++:(p===")"||p==="]"||p==="}")&&!d&&!f&&!n&&o--,p===":"&&!d&&!f&&!n&&o===0)return[h.slice(0,c),h.slice(c+1)]}return null}function a(h){let d=h.getAttribute("data-rt-template");if(!d)return null;if(typeof document<"u"&&!d.includes("<"))try{let f=document.querySelector(d);if(f)return f.innerHTML}catch{}return d}function y(h,d){if(!h.includes("{#if")&&!h.includes("{#each")){let f=h;for(let n in d){let o=n.replace(/[.*+?^$${}()|[\]\\]/g,"\\$&");f=f.replace(new RegExp("\\{\\{"+o+"\\}}","g"),d[n]!==void 0&&d[n]!==null?d[n]:"")}return f=f.replace(/\{\{([\s\S]*?)\}\}/g,(n,o)=>{let c=o.trim();if(!c)return"";if(/^[a-zA-Z_$][a-zA-Z0-9_$]*(?:\??\.[a-zA-Z_$][a-zA-Z0-9_$]*)+$/.test(c)){let p=c.split(/\??\./),l=d;for(let g of p){if(l==null){l=void 0;break}l=l[g]}return l??""}return n}),f}try{let f=m=>m.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t"),n=`let out = "";
2
+ `,o=0,c=/(\{\{([\s\S]*?)\}\}|\{#if\s+([\s\S]*?)\}|\{:else\s+if\s+([\s\S]*?)\}|\{:else\}|\{\/if\}|\{#each\s+([\s\S]*?)\s+as\s+([a-zA-Z_$][a-zA-Z0-9_$]*)(?:\s*,\s*([a-zA-Z_$][a-zA-Z0-9_$]*))?\}|\{\/each\}|\{([^{}]+?)\})/g,p=[],l;for(;(l=c.exec(h))!==null;){let m=h.slice(o,l.index);m&&(n+=`out += "${f(m)}";
3
+ `);let _=l[0];if(_.startsWith("{{")){let S=l[2];n+=`out += (${S} !== undefined && ${S} !== null ? ${S} : "");
4
+ `}else if(_.startsWith("{#if")){let S=l[3];n+=`if (${S}) {
5
+ `}else if(_.startsWith("{:else if")){let S=l[4];n+=`} else if (${S}) {
6
+ `}else if(_.startsWith("{:else}"))n+=`} else {
7
+ `;else if(_.startsWith("{/if}"))n+=`}
8
+ `;else if(_.startsWith("{#each")){let S=l[5],C=l[6],v=l[7];p.push({indexVar:v}),n+=`if (typeof ${S} !== "undefined" && ${S} !== null && Array.isArray(${S})) {
9
9
  `,v&&(n+=` let ${v} = 0;
10
- `),n+=` for (let ${x} of ${T}) {
11
- `}else if(b.startsWith("{/each}")){let T=y.pop();T&&T.indexVar&&(n+=` ${T.indexVar}++;
10
+ `),n+=` for (let ${C} of ${S}) {
11
+ `}else if(_.startsWith("{/each}")){let S=p.pop();S&&S.indexVar&&(n+=` ${S.indexVar}++;
12
12
  `),n+=` }
13
13
  }
14
- `}else if(b.startsWith("{")){let T=h[8];T&&(n+=`out += (${T} !== undefined && ${T} !== null ? ${T} : "");
15
- `)}o=c.lastIndex}let m=f.slice(o);m&&(n+=`out += "${l(m)}";
14
+ `}else if(_.startsWith("{")){let S=l[8];S&&(n+=`out += (${S} !== undefined && ${S} !== null ? ${S} : "");
15
+ `)}o=c.lastIndex}let g=h.slice(o);g&&(n+=`out += "${f(g)}";
16
16
  `),n+=`return out;
17
- `;let w=`
17
+ `;let u=`
18
18
  with (context) {
19
19
  try {
20
20
  ${n}
@@ -23,7 +23,7 @@ var DolphinModule=(()=>{var U=Object.defineProperty;var G=Object.getOwnPropertyD
23
23
  return '';
24
24
  }
25
25
  }
26
- `,_=u;return typeof Proxy<"u"&&u!==null&&typeof u=="object"&&(_=new Proxy(u,{has(p,b){return typeof b!="symbol"},get(p,b){if(b!==Symbol.unscopables){if(b in p)return p[b];if(typeof globalThis<"u"&&b in globalThis)return globalThis[b];if(typeof window<"u"&&b in window)return window[b]}}})),new Function("context",w)(_)}catch(l){console.error("[Dolphin Template Compiler Error]:",l);let n=f;for(let o in u){let c=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");n=n.replace(new RegExp(`\\{\\{${c}\\}\\}`,"g"),u[o]!==void 0&&u[o]!==null?u[o]:"")}return n}}function r(f){if(typeof document>"u")return f;try{let n=new DOMParser().parseFromString(f,"text/html").body,o=c=>{let y=c.tagName.toLowerCase();if(["script","iframe","object","embed","link","style","meta","applet","svg"].includes(y)){c.parentNode?.removeChild(c);return}let h=c.attributes;for(let m=h.length-1;m>=0;m--){let w=h[m].name.toLowerCase(),_=h[m].value.toLowerCase();(w.startsWith("on")||["src","href","data"].includes(w)&&(_.includes("javascript:")||_.includes("data:text/html")))&&c.removeAttribute(h[m].name)}Array.from(c.children).forEach(o)};return Array.from(n.children).forEach(o),n.innerHTML}catch{return f}}function a(f,u){if(f.nodeType!==u.nodeType){f.parentNode?.replaceChild(u.cloneNode(!0),f);return}if(f.nodeType===Node.TEXT_NODE){f.textContent!==u.textContent&&(f.textContent=u.textContent);return}if(f.nodeType===Node.ELEMENT_NODE){let l=f,n=u;if(l.tagName!==n.tagName){l.parentNode?.replaceChild(n.cloneNode(!0),l);return}let o=l.attributes,c=n.attributes;for(let g=o.length-1;g>=0;g--){let p=o[g].name;n.hasAttribute(p)||l.removeAttribute(p)}for(let g=0;g<c.length;g++){let p=c[g].name,b=c[g].value;l.getAttribute(p)!==b&&l.setAttribute(p,b)}l.tagName==="INPUT"||l.tagName==="TEXTAREA"?(l.value!==n.value&&(l.value=n.value),l.checked!==n.checked&&(l.checked=n.checked)):l.tagName==="SELECT"&&l.value!==n.value&&(l.value=n.value);let y=Array.from(l.childNodes),h=Array.from(n.childNodes),m=y.length,w=h.length,_=Math.max(m,w);for(let g=0;g<_;g++)g>=m?l.appendChild(h[g].cloneNode(!0)):g>=w?l.removeChild(y[g]):a(y[g],h[g])}}function d(f,u){if(typeof document>"u")return;let l=document.createElement(f.tagName);l.innerHTML=u;let n=Array.from(f.childNodes),o=Array.from(l.childNodes),c=n.length,y=o.length,h=Math.max(c,y);for(let m=0;m<h;m++)m>=c?f.appendChild(o[m].cloneNode(!0)):m>=y?f.removeChild(n[m]):a(n[m],o[m])}let E=new Map,S=!1;function k(f,u){E.set(f,u),S||(S=!0,(typeof requestAnimationFrame<"u"?requestAnimationFrame:n=>setTimeout(n,0))(()=>{E.forEach((n,o)=>{o.isConnected!==!1&&d(o,n)}),E.clear(),S=!1}))}A.setStoreState=function(f,u,l){this.uiStores=this.uiStores||new Map,this.uiStores.has(f)||this.uiStores.set(f,{});let n=this.uiStores.get(f);n[u]=l,this.options.debug&&console.log("%c\u{1F4BE} [Dolphin Store Update]:","color: #ec4899; font-weight: bold;",`${f}.${u}`,"=",l),typeof document<"u"&&document.querySelectorAll(`[data-store-read="${f}.${u}"]`).forEach(c=>{c.tagName==="INPUT"||c.tagName==="TEXTAREA"?c.type==="checkbox"?c.checked=!!l:c.value=l??"":c.textContent=l??""}),this.publish(`store/${f}`,n),typeof this._updateDOM=="function"&&this._updateDOM(`store/${f}`,n)},A.getStoreState=function(f,u){this.uiStores=this.uiStores||new Map;let l=this.uiStores.get(f);return l?l[u]:void 0},A._scanStoreBinds=function(){if(typeof document>"u")return;document.querySelectorAll("[data-store-write]").forEach(l=>{let n=l.getAttribute("data-store-write");if(n){let o=n.split(".");if(o.length===2){let c=o[0],y=o[1],h=l.type==="checkbox"?l.checked:l.value;this.uiStores=this.uiStores||new Map,this.uiStores.has(c)||this.uiStores.set(c,{});let m=this.uiStores.get(c);m[y]===void 0&&(m[y]=h)}}}),document.querySelectorAll("[data-store-read]").forEach(l=>{let n=l.getAttribute("data-store-read");if(n){let o=n.split(".");if(o.length===2){let c=o[0],y=o[1],h=this.getStoreState(c,y);h!=null&&(l.tagName==="INPUT"||l.tagName==="TEXTAREA"?l.type==="checkbox"?l.checked=!!h:l.value=h:l.textContent=h)}}})},A.getClosestContext=function(f,u){let l=f;for(;l;){if(l._rtContext){let n=l._rtContext;return u?n[u]:n}l=l.parentElement}return null},A._executeStoreAction=function(f,u){this.uiStores=this.uiStores||new Map;let l=new Proxy({},{has:(n,o)=>!0,get:(n,o)=>{if(typeof o=="string")return new Proxy({},{get:(c,y)=>{if(typeof y=="string")return this.getStoreState(o,y)},set:(c,y,h)=>typeof y=="string"?(this.setStoreState(o,y,h),!0):!1})}});try{new Function("ctx",`with(ctx) { ${f} }`)(l)}catch(n){console.error("%c[Dolphin Store Action Error]:","color: #ef4444; font-weight: bold;",n),u&&console.error("%cFailed Element:","color: #f97316; font-weight: bold;",u),console.error("%cFailed Expression:","color: #3b82f6; font-style: italic;",f)}},A._showAlert=function(f,u){if(typeof document>"u")return;let l=document.getElementById(f)||document.querySelector(`[id="${f}"]`);l&&(l.removeAttribute("hidden"),l.style.display="",u&&u>0&&setTimeout(()=>{l.setAttribute("hidden","")},u))},A._showToast=function(f,u="success"){if(typeof document>"u")return;let l={success:{bg:"rgba(16,185,129,0.15)",border:"#10b981",icon:"\u2705"},error:{bg:"rgba(239,68,68,0.15)",border:"#ef4444",icon:"\u274C"},info:{bg:"rgba(59,130,246,0.15)",border:"#3b82f6",icon:"\u2139\uFE0F"}},n=l[u]||l.success,o=document.createElement("div");o.setAttribute("data-dolphin-toast","");let y=document.querySelectorAll("[data-dolphin-toast]").length*72;o.style.cssText=["position:fixed",`bottom:${24+y}px`,"right:24px","z-index:2147483647",`background:${n.bg}`,`border:1px solid ${n.border}`,"color:#fff","padding:14px 20px","border-radius:14px","font-size:14px","font-weight:600","font-family:system-ui,sans-serif","box-shadow:0 8px 32px rgba(0,0,0,0.4)","display:flex","align-items:center","gap:10px","max-width:380px","word-break:break-word","transform:translateY(80px)","opacity:0","transition:transform 0.35s cubic-bezier(0.34,1.56,0.64,1),opacity 0.3s ease","pointer-events:auto","backdrop-filter:blur(12px)"].join(";"),o.innerHTML=`<span style="font-size:18px">${n.icon}</span><span>${f}</span>`,document.body.appendChild(o);let h=()=>{document.querySelectorAll("[data-dolphin-toast]").forEach((p,b)=>{p.style.bottom=`${24+b*72}px`})},m=typeof requestAnimationFrame<"u"?requestAnimationFrame:g=>setTimeout(g,0);m(()=>m(()=>{o.style.transform="translateY(0)",o.style.opacity="1"}));let w=()=>{clearTimeout(o._removeTimer),o.parentNode&&(o.parentNode.removeChild(o),h())},_=setTimeout(()=>{o.style.transform="translateY(80px)",o.style.opacity="0",o._removeTimer=setTimeout(w,400)},3500);o._hideTimer=_,o.addEventListener("click",()=>{clearTimeout(o._hideTimer),w()},{once:!0})},A._initDOMBinding=function(){if(this._domInitialized)return;this._domInitialized=!0;let f=["input","change","keyup","paste","blur"],u=new WeakMap;f.forEach(n=>{this.addDomListener(document,n,o=>{if(!o.target||!o.target.getAttribute)return;let c=o.target.getAttribute("data-store-write");if(c){let w=c.split(".");if(w.length===2){let _=w[0],g=w[1],p=o.target.type==="checkbox"?o.target.checked:o.target.value;this.setStoreState(_,g,p)}}let y=o.target.getAttribute("data-rt-validate"),h=o.target.name;if(y&&h&&typeof this.validateField=="function"){let w=o.target.closest("form"),_=w?Object.fromEntries(new FormData(w).entries()):{},g=this.validateField(o.target.value,y,_);g?(o.target.classList.add("invalid"),this.publish(`errors/${h}`,g)):(o.target.classList.remove("invalid"),this.publish(`errors/${h}`,""))}let m=o.target.getAttribute("data-rt-push");if(m){let w=o.target.getAttribute("data-rt-debounce"),_=w?parseInt(w,10):0,g=()=>{let p={name:o.target.name,value:o.target.value};this.pubPush(m,p)};if(_>0){u.has(o.target)&&clearTimeout(u.get(o.target));let p=setTimeout(g,_);u.set(o.target,p)}else g()}})}),this.addDomListener(document,"submit",async n=>{if(!n.target||!n.target.getAttribute)return;let o=n.target.getAttribute("data-rt-submit"),c=n.target.getAttribute("data-api-submit");if(o||c){n.target.querySelectorAll("[name]").forEach(p=>{let b=p.name;b&&(this.publish(`errors/${b}`,""),p.classList.remove("invalid"))});let h=n.target.querySelectorAll("[data-rt-validate]"),m=!0;if(h.length>0&&typeof this.validateField=="function"){let p=Object.fromEntries(new FormData(n.target).entries());h.forEach(b=>{let T=b.getAttribute("data-rt-validate"),x=b.name;if(T&&x){let v=this.validateField(b.value,T,p);v&&(m=!1,b.classList.add("invalid"),this.publish(`errors/${x}`,v))}})}if(!m){n.preventDefault(),n.stopPropagation();return}n.preventDefault();let w=this.getClosestContext(n.target)||{},_=new FormData(n.target),g=Object.fromEntries(_.entries());if(o){let p=o;for(let T in w){let x=e(T);p=p.replace(new RegExp(`\\{\\{${x}\\}\\}`,"g"),w[T]!==void 0&&w[T]!==null?w[T]:"")}this.publish(p,g);let b=n.target.getAttribute("data-rt-api-success");if(b){let T=document.getElementById(b);T&&this._showToast(T.textContent||T.innerText||"","success")}}else if(c){let p=c;for(let v in w){let D=e(v);p=p.replace(new RegExp(`\\{\\{${D}\\}\\}`,"g"),w[v]!==void 0&&w[v]!==null?w[v]:"")}let b=p.trim().split(" "),T=b.length>1?b[0].toUpperCase():"POST",x=b.length>1?b[1]:b[0];g._method&&(T=String(g._method).toUpperCase());try{let v=await this.api.request(T,x,g),D=n.target.getAttribute("data-api-result");D&&this._updateDOM(D,v);let L=n.target.getAttribute("data-api-toast");L&&this._showToast(L,"success");let M=n.target.getAttribute("data-rt-api-success");if(M){let I=parseInt(n.target.getAttribute("data-rt-alert-duration")||"0",10);this._showAlert(M,I);let P=n.target.getAttribute("data-rt-api-error");if(P){let R=document.getElementById(P);R&&R.setAttribute("hidden","")}}let $=n.target.getAttribute("data-api-redirect");$&&(window.location.href=$),n.target.hasAttribute("data-api-reload")&&window.location.reload()}catch(v){console.error("[Dolphin] API Submit Error:",v);let D=n.target.getAttribute("data-api-error-toast");D&&this._showToast(D,"error");let L=n.target.getAttribute("data-rt-api-error");if(L){let M=parseInt(n.target.getAttribute("data-rt-alert-duration")||"0",10);this._showAlert(L,M);let $=n.target.getAttribute("data-rt-api-success");if($){let I=document.getElementById($);I&&I.setAttribute("hidden","")}}}}}}),["click","change","input","keydown","keyup","dblclick","focus","blur","mouseenter","mouseleave"].forEach(n=>{this.addDomListener(document,n,async o=>{if(!o.target||!o.target.closest)return;let c=o.target.closest(`[data-rt-${n}]`),y=o.target.closest(`[data-api-${n}]`);if(c){n==="submit"&&o.preventDefault();let m=c.getAttribute(`data-rt-${n}`),w=c.getAttribute("data-rt-payload"),_=this.getClosestContext(c)||{},g={};if(w){let p=w;for(let b in _){let T=e(b);p=p.replace(new RegExp(`\\{\\{${T}\\}\\}`,"g"),_[b]!==void 0&&_[b]!==null?_[b]:"")}try{g=JSON.parse(p)}catch{g={}}}this.publish(m,g)}if(y){n==="submit"&&o.preventDefault();let m=y.getAttribute(`data-api-${n}`),w=y.getAttribute("data-api-payload"),_=this.getClosestContext(y)||{},g=m;for(let v in _){let D=e(v);g=g.replace(new RegExp(`\\{\\{${D}\\}\\}`,"g"),_[v]!==void 0&&_[v]!==null?_[v]:"")}let p=g.trim().split(" "),b=p.length>1?p[0].toUpperCase():"POST",T=p.length>1?p[1]:p[0],x=null;if(w){let v=w;for(let D in _){let L=e(D);v=v.replace(new RegExp(`\\{\\{${L}\\}\\}`,"g"),_[D]!==void 0&&_[D]!==null?_[D]:"")}try{x=JSON.parse(v)}catch{x=null}}try{let v=await this.api.request(b,T,x),D=y.getAttribute("data-api-result");D&&this._updateDOM(D,v);let L=y.getAttribute("data-api-toast");L&&this._showToast(L,"success");let M=y.getAttribute("data-rt-api-success");if(M){let I=parseInt(y.getAttribute("data-rt-alert-duration")||"0",10);this._showAlert(M,I);let P=y.getAttribute("data-rt-api-error");if(P){let R=document.getElementById(P);R&&R.setAttribute("hidden","")}}let $=y.getAttribute("data-api-redirect");$&&(window.location.href=$),y.hasAttribute("data-api-reload")&&window.location.reload()}catch(v){console.error(`[Dolphin] API ${n} Error:`,v);let D=y.getAttribute("data-api-error-toast");D&&this._showToast(D,"error");let L=y.getAttribute("data-rt-api-error");if(L){let M=parseInt(y.getAttribute("data-rt-alert-duration")||"0",10);this._showAlert(L,M);let $=y.getAttribute("data-rt-api-success");if($){let I=document.getElementById($);I&&I.setAttribute("hidden","")}}}}let h=o.target.closest(`[data-store-${n}]`);if(h){n==="submit"&&o.preventDefault();let m=h.getAttribute(`data-store-${n}`);m&&this._executeStoreAction(m,h)}})}),this.subscribe("#",(n,o)=>{this._updateDOM(o,n)}),this._scanAndFetchAPIBinds(),this._scanStoreBinds(),this._resolveImports(),this._initSPARouter()},A._scanAndFetchAPIBinds=async function(){if(typeof document>"u")return;let f=document.querySelectorAll("[data-api-get]");for(let u of Array.from(f)){let l=u.getAttribute("data-api-get");if(l&&!(typeof u.hasAttribute=="function"&&u.hasAttribute("data-api-initialized"))){typeof u.setAttribute=="function"&&u.setAttribute("data-api-initialized","true");try{let n=await this.api.get(l),o=u.getAttribute("data-api-store");if(o){let y=o.split(".");y.length===2&&this.setStoreState(y[0],y[1],n)}let c=u.getAttribute("data-rt-bind");if(c&&!o)this._updateDOM(c,n);else if(!o){let y=s(u);if(y&&typeof n=="object"&&n!==null){let h=this._applyDeclarativeDirectives(u,n);if(Array.isArray(h)){let m="";for(let w of h)m+=i(y,w);k(u,m)}else k(u,i(y,h))}else if(u.tagName==="INPUT"||u.tagName==="TEXTAREA")u.value=typeof n=="object"?n.value!==void 0?n.value:"":n;else{let h=typeof n=="object"?n.html||n.text||JSON.stringify(n):String(n);u.innerHTML=r(h)}}}catch(n){console.error("[Dolphin] API Get Error:",n)}}}},A._applyDeclarativeDirectives=function(f,u){let l=u;if(typeof u=="object"&&u!==null){let n=o=>{let c=[...o],y=f.getAttribute("data-rt-filter");if(y){let w=y.split("==");if(w.length===2){let _=w[0].trim(),g=w[1].trim(),p,b=g.split(".");b.length===2?p=this.getStoreState(b[0],b[1]):p=u[g]!==void 0?u[g]:this.getStoreState("app",g),p!=null&&p!==""&&(c=c.filter(T=>T[_]===p))}}let h=f.getAttribute("data-rt-search");if(h){let w=h.split("==");if(w.length===2){let _=w[0].trim(),g=w[1].trim(),p,b=g.split(".");if(b.length===2?p=this.getStoreState(b[0],b[1]):p=u[g]!==void 0?u[g]:this.getStoreState("app",g),p!=null&&p!==""){let T=String(p).toLowerCase();c=c.filter(x=>{let v=x[_];return v!=null&&String(v).toLowerCase().includes(T)})}}}let m=f.getAttribute("data-rt-sort");if(m){let w,_=m.split(".");if(_.length===2?w=this.getStoreState(_[0],_[1]):w=u[m]!==void 0?u[m]:this.getStoreState("app",m),w&&w!=="")if(w==="popular")c.sort((g,p)=>{let b=g.rating?.rate||g.rate||0;return(p.rating?.rate||p.rate||0)-b});else{let g="",p="asc";w.endsWith("-low")||w.endsWith("-asc")?(g=w.replace("-low","").replace("-asc",""),p="asc"):(w.endsWith("-high")||w.endsWith("-desc"))&&(g=w.replace("-high","").replace("-desc",""),p="desc"),g&&c.sort((b,T)=>{let x=($,I)=>I.split(".").reduce((P,R)=>P&&P[R],$),v=x(b,g),D=x(T,g);if(v===void 0&&(v=b[g]),D===void 0&&(D=T[g]),typeof v=="string"&&typeof D=="string")return p==="asc"?v.localeCompare(D):D.localeCompare(v);let L=Number(v),M=Number(D);return!isNaN(L)&&!isNaN(M)?p==="asc"?L-M:M-L:0})}}return c};if(Array.isArray(u))l=n(u);else{let o="";for(let c in u)if(Array.isArray(u[c])){o=c;break}if(o){let c=n(u[o]);l={...u,[o]:c}}}}return l},A._updateDOM=function(f,u){if(typeof document>"u")return;document.querySelectorAll(`[data-rt-bind="${f}"]`).forEach(n=>{let o=this._applyDeclarativeDirectives(n,u);if(n.getAttribute("data-rt-type")==="context"&&typeof o=="object"&&o!==null){n._rtContext=o;let y=h=>{if(h.hasAttribute("data-rt-text")){let m=h.getAttribute("data-rt-text");m&&o[m]!==void 0&&o[m]!==null&&(h.textContent=o[m])}if(h.hasAttribute("data-rt-html")){let m=h.getAttribute("data-rt-html");m&&o[m]!==void 0&&o[m]!==null&&(h.innerHTML=r(o[m]))}if(h.hasAttribute("data-rt-attr")){let m=h.getAttribute("data-rt-attr");m&&m.split(",").forEach(w=>{let _=w.split(":");if(_.length===2){let g=_[0].trim(),p=_[1].trim();g&&p&&o[p]!==void 0&&o[p]!==null&&h.setAttribute(g,o[p])}})}if(h.hasAttribute("data-rt-class")){let m=h.getAttribute("data-rt-class");m&&m.split(",").forEach(w=>{let _=w.split(":");if(_.length===2){let g=_[0].trim(),p=_[1].trim(),b=g.split(/\s+/).filter(Boolean);o[p]?b.forEach(T=>h.classList.add(T)):b.forEach(T=>h.classList.remove(T))}})}if(h.hasAttribute("data-rt-if")){let m=h.getAttribute("data-rt-if");m&&(o[m]?h.style.display="":h.style.display="none")}if(h.hasAttribute("data-rt-hide")){let m=h.getAttribute("data-rt-hide");m&&(o[m]?h.style.display="none":h.style.display="")}};y(n),n.querySelectorAll("[data-rt-text], [data-rt-html], [data-rt-attr], [data-rt-class], [data-rt-if], [data-rt-hide]").forEach(y);return}let c=s(n);if(c&&typeof o=="object"&&o!==null){if(Array.isArray(o)){let y="";for(let h of o)y+=i(c,h);k(n,y)}else k(n,i(c,o));return}if(n.tagName==="INPUT"||n.tagName==="TEXTAREA")n.value=typeof o=="object"?o.value!==void 0?o.value:"":o;else if(c)n.innerHTML=typeof o=="object"?o.html||o.text||JSON.stringify(o):String(o);else{let y=typeof o=="object"?o.html||o.text||JSON.stringify(o):String(o);n.innerHTML=r(y)}})},A._resolveImports=async function(f){if(typeof document>"u")return;let u=f||document.body||document;if(!u||typeof u.querySelectorAll!="function")return;let l=u.querySelectorAll("[data-import]");if(l.length===0)return;let n=async(c,y)=>{let h=c.getAttribute("data-import");if(!h)return;if(y.has(h)){console.warn(`[Dolphin Component Warning]: Circular import detected for "${h}". Skipping resolving.`),c.innerHTML=`<span style="color:red;font-weight:bold;">Circular import: ${h}</span>`;return}y.add(h);let m=t.get(h);m||(m=fetch(h).then(g=>{if(!g.ok)throw new Error(`HTTP ${g.status}`);return g.text()}),m.catch(()=>t.delete(h)),t.set(h,m));let w="";try{w=await m}catch(g){console.error(`[Dolphin Component Error]: Failed to fetch component "${h}":`,g),w=`<span style="color:red;font-weight:bold;">Failed to import ${h}</span>`}c.innerHTML=r(w),c.removeAttribute("data-import");let _=c.querySelectorAll("[data-import]");if(_.length>0){let g=Array.from(_).map(p=>n(p,new Set(y)));await Promise.all(g)}this._scanStoreBinds(),this._scanAndFetchAPIBinds()},o=Array.from(l).map(c=>n(c,new Set));await Promise.all(o)},A._initSPARouter=function(){if(typeof window>"u"||typeof document>"u"||this._routerInitialized)return;this._routerInitialized=!0;let f=null,u=()=>{let o=(this.options.routerViewport||"main, #viewport, body").split(",").map(c=>c.trim());for(let c of o){let y=document.querySelector(c);if(y)return y}return document.body},l=async(n,o=!0)=>{try{this.options.debug&&console.log(`%c\u{1F6E3}\uFE0F [Dolphin Router]: Navigating to ${n}...`,"color: #3b82f6; font-weight: bold;"),f&&f.abort(),f=new AbortController;let c=f.signal,y=u();this.options.routerTransitions&&y&&(y.classList.add("dolphin-fade-out"),await new Promise(b=>setTimeout(b,150)));let h=await fetch(n,{signal:c});if(!h.ok)throw new Error(`HTTP ${h.status}`);let m=await h.text();f=null;let _=new DOMParser().parseFromString(m,"text/html");_.title&&(document.title=_.title);let g=_.querySelector(this.options.routerViewport||"main, #viewport, body"),p=u();g&&p?(p.innerHTML=g.innerHTML,Array.from(g.attributes).forEach(b=>{p.setAttribute(b.name,b.value)})):p&&(p.innerHTML=_.body.innerHTML),o&&window.history.pushState({dolphinSpa:!0,url:n},"",n),this.options.routerTransitions&&p&&(p.classList.remove("dolphin-fade-out"),p.classList.add("dolphin-fade-in"),setTimeout(()=>p.classList.remove("dolphin-fade-in"),300)),await this._resolveImports(p),this._scanStoreBinds(),this._scanAndFetchAPIBinds()}catch(c){if(c&&c.name==="AbortError")return;console.error("[Dolphin Router Error]: Failed to route page:",c),window.location.href=n}};if(this.addDomListener(document,"click",n=>{let o=n.target.closest("a");if(!o||!o.hasAttribute("data-spa")&&o.getAttribute("data-spa")!=="true")return;let c=o.getAttribute("href");!c||c.startsWith("#")||c.startsWith("javascript:")||c.startsWith("mailto:")||c.startsWith("tel:")||new URL(c,window.location.href).origin!==window.location.origin||(n.preventDefault(),l(c))}),this.addDomListener(window,"popstate",n=>{n.state&&n.state.dolphinSpa?l(n.state.url,!1):n.state===null&&l(window.location.pathname,!1)}),this.options.routerTransitions){let n=document.createElement("style");n.innerHTML=`
26
+ `,A=d;return typeof Proxy<"u"&&d!==null&&typeof d=="object"&&(A=new Proxy(d,{has(m,_){return typeof _!="symbol"},get(m,_){if(_!==Symbol.unscopables){if(_ in m)return m[_];if(typeof globalThis<"u"&&_ in globalThis)return globalThis[_];if(typeof window<"u"&&_ in window)return window[_]}}})),new Function("context",u)(A)}catch(f){console.error("[Dolphin Template Compiler Error]:",f);let n=h;for(let o in d){let c=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");n=n.replace(new RegExp(`\\{\\{${c}\\}\\}`,"g"),d[o]!==void 0&&d[o]!==null?d[o]:"")}return n}}function T(h){if(typeof document>"u")return h;try{let d=new DOMParser,n=/<\s*(?:body|html)\b/i.test(h)?h:`<body>${h}</body>`,c=d.parseFromString(n,"text/html").body,p=l=>{let g=l.tagName.toLowerCase();if(["script","iframe","object","embed","link","style","meta","applet","svg"].includes(g)){l.parentNode?.removeChild(l);return}let u=l.attributes;for(let A=u.length-1;A>=0;A--){let b=u[A].name.toLowerCase(),m=u[A].value.toLowerCase();(b.startsWith("on")||["src","href","data"].includes(b)&&(m.includes("javascript:")||m.includes("data:text/html")))&&l.removeAttribute(u[A].name)}Array.from(l.children).forEach(p)};return Array.from(c.children).forEach(p),c.innerHTML}catch{return h}}function E(h,d){if(h.nodeType!==d.nodeType){h.parentNode?.replaceChild(d.cloneNode(!0),h);return}if(h.nodeType===Node.TEXT_NODE){h.textContent!==d.textContent&&(h.textContent=d.textContent);return}if(h.nodeType===Node.ELEMENT_NODE){let f=h,n=d;if(f.tagName!==n.tagName){f.parentNode?.replaceChild(n.cloneNode(!0),f);return}let o=f.attributes,c=n.attributes;for(let b=o.length-1;b>=0;b--){let m=o[b].name;n.hasAttribute(m)||f.removeAttribute(m)}for(let b=0;b<c.length;b++){let m=c[b].name,_=c[b].value;f.getAttribute(m)!==_&&f.setAttribute(m,_)}f.tagName==="INPUT"||f.tagName==="TEXTAREA"?(f.value!==n.value&&(f.value=n.value),f.checked!==n.checked&&(f.checked=n.checked)):f.tagName==="SELECT"&&f.value!==n.value&&(f.value=n.value);let p=Array.from(f.childNodes),l=Array.from(n.childNodes),g=p.length,u=l.length,A=Math.max(g,u);for(let b=0;b<A;b++)b>=g?f.appendChild(l[b].cloneNode(!0)):b>=u?f.removeChild(p[b]):E(p[b],l[b])}}function D(h,d){if(typeof document>"u")return;let f=document.createElement(h.tagName);f.innerHTML=d;let n=Array.from(h.childNodes),o=Array.from(f.childNodes),c=n.length,p=o.length,l=Math.max(c,p);for(let g=0;g<l;g++)g>=c?h.appendChild(o[g].cloneNode(!0)):g>=p?h.removeChild(n[g]):E(n[g],o[g])}let k=new Map,M=!1;function x(h,d){k.set(h,d),M||(M=!0,(typeof requestAnimationFrame<"u"?requestAnimationFrame:n=>setTimeout(n,0))(()=>{k.forEach((n,o)=>{o.isConnected!==!1&&D(o,n)}),k.clear(),M=!1}))}w.setStoreState=function(h,d,f,n){this.uiStores=this.uiStores||new Map,this.uiStores.has(h)||this.uiStores.set(h,{});let o=this.uiStores.get(h);o[d]=f,this.options.debug&&console.log("%c\u{1F4BE} [Dolphin Store Update]:","color: #ec4899; font-weight: bold;",`${h}.${d}`,"=",f),typeof document<"u"&&document.querySelectorAll(`[data-store-read="${h}.${d}"]`).forEach(p=>{p!==n&&(p.tagName==="INPUT"||p.tagName==="TEXTAREA"?p.type==="checkbox"?p.checked=!!f:p.value=f??"":p.textContent=f??"")}),this.publish(`store/${h}`,o),typeof this._updateDOM=="function"&&this._updateDOM(`store/${h}`,o)},w.getStoreState=function(h,d){this.uiStores=this.uiStores||new Map;let f=this.uiStores.get(h);return f?f[d]:void 0},w._scanStoreBinds=function(){if(typeof document>"u")return;document.querySelectorAll("dolphin-store").forEach(n=>{if(typeof n.getAttribute!="function")return;let o=n.getAttribute("name")||n.getAttribute("data-store");if(!o)return;let c=n.children&&n.children.length>0;if(c?typeof n.setAttribute=="function"&&(n.setAttribute("data-rt-bind",`store/${o}`),n.setAttribute("data-rt-type","context")):n.style&&(n.style.display="none"),!c){let l=n.textContent?n.textContent.trim():"";if(l&&l.startsWith("{"))try{let g=JSON.parse(l);g&&typeof g=="object"&&Object.keys(g).forEach(u=>{this.setStoreState(o,u,g[u])})}catch(g){console.error(`[Dolphin Store Init Error] Failed to parse JSON inside <dolphin-store name="${o}">:`,g)}}let p=n.getAttribute("template");if(n.attributes){let l=["name","data-store","style","data-rt-bind","data-rt-type","template"];Array.from(n.attributes).forEach(g=>{if(!l.includes(g.name)){let u=g.value;u==="true"?u=!0:u==="false"?u=!1:u==="null"?u=null:!isNaN(Number(u))&&u.trim()!==""&&(u=Number(u)),this.setStoreState(o,g.name,u)}})}if(p&&!c&&n.parentNode&&typeof document<"u"){let l=`_ds_${o}_${p.replace(/[^a-z0-9]/gi,"_")}`,g=document.querySelector(`[data-ds-wired="${l}"]`);if(g||(g=document.createElement("div"),g.setAttribute("data-rt-bind",`store/${o}`),g.setAttribute("data-rt-template",p),g.setAttribute("data-ds-wired",l),n.parentNode.insertBefore(g,n.nextSibling)),typeof this._updateDOM=="function"){this.uiStores=this.uiStores||new Map;let u=this.uiStores.get(o)||{};this._updateDOM(`store/${o}`,u)}}if(c&&typeof this._updateDOM=="function"){this.uiStores=this.uiStores||new Map;let l=this.uiStores.get(o)||{};this._updateDOM(`store/${o}`,l)}}),document.querySelectorAll("[data-store-write]").forEach(n=>{let o=n.getAttribute("data-store-write");if(o){let c=o.split(".");if(c.length===2){let p=c[0],l=c[1],g=n.type==="checkbox"?n.checked:n.value;this.uiStores=this.uiStores||new Map,this.uiStores.has(p)||this.uiStores.set(p,{});let u=this.uiStores.get(p);u[l]===void 0&&(u[l]=g)}}}),document.querySelectorAll("[data-store-read]").forEach(n=>{let o=n.getAttribute("data-store-read");if(o){let c=o.split(".");if(c.length===2){let p=c[0],l=c[1],g=this.getStoreState(p,l);g!=null&&(n.tagName==="INPUT"||n.tagName==="TEXTAREA"?n.type==="checkbox"?n.checked=!!g:n.value=g:n.textContent=g)}}})},w.getClosestContext=function(h,d){let f=h;for(;f;){if(f._rtContext){let n=f._rtContext;return d?n[d]:n}f=f.parentElement||f.parentNode}return null},w._executeStoreAction=function(h,d){this.uiStores=this.uiStores||new Map;let f=d&&typeof this.getClosestContext=="function"?this.getClosestContext(d):null,n=new Proxy({},{has:(o,c)=>!0,get:(o,c)=>{if(typeof c=="string")return c==="log"?p=>{if(p===void 0){let l={};this.uiStores.forEach((g,u)=>{l[u]={...g}}),console.log("%c\u{1F4CA} [Dolphin All UI Stores]:","color: #06b6d4; font-weight: bold;",l)}else if(p&&typeof p=="object"&&p.__isStoreProxy__){let l=p.__storeName__,g=this.uiStores.get(l);console.log(`%c\u{1F4CA} [Dolphin Store: ${l}]:`,"color: #06b6d4; font-weight: bold;",g?{...g}:{})}else console.log("%c\u{1F4CA} [Dolphin Log]:","color: #06b6d4; font-weight: bold;",p)}:f&&f[c]!==void 0?f[c]:typeof globalThis<"u"&&c in globalThis?globalThis[c]:typeof window<"u"&&c in window?window[c]:new Proxy({},{get:(p,l)=>{if(l==="__storeName__")return c;if(l==="__isStoreProxy__")return!0;if(typeof l=="string")return this.getStoreState(c,l)},set:(p,l,g)=>typeof l=="string"?(this.setStoreState(c,l,g),!0):!1})}});try{new Function("ctx",`with(ctx) { ${h} }`)(n)}catch(o){console.error("%c[Dolphin Store Action Error]:","color: #ef4444; font-weight: bold;",o),d&&console.error("%cFailed Element:","color: #f97316; font-weight: bold;",d),console.error("%cFailed Expression:","color: #3b82f6; font-style: italic;",h)}},w._initDOMBinding=function(){if(this._domInitialized)return;this._domInitialized=!0;let h=["input","change","keyup","paste","blur"],d=new WeakMap;h.forEach(n=>{this.addDomListener(document,n,o=>{if(!o.target||!o.target.getAttribute)return;let c=o.target.getAttribute("data-store-write");if(c){let u=c.split(".");if(u.length===2){let A=u[0],b=u[1],m=o.target.type==="checkbox"?o.target.checked:o.target.value;this.setStoreState(A,b,m,o.target)}}let p=o.target.getAttribute("data-rt-validate"),l=o.target.name;if(p&&l&&typeof this.validateField=="function"){let u=o.target.closest("form"),A=u?Object.fromEntries(new FormData(u).entries()):{},b=this.validateField(o.target.value,p,A);b?(o.target.classList.add("invalid"),this.publish(`errors/${l}`,b)):(o.target.classList.remove("invalid"),this.publish(`errors/${l}`,""))}let g=o.target.getAttribute("data-rt-push");if(g){let u=o.target.getAttribute("data-rt-debounce"),A=u?parseInt(u,10):0,b=()=>{let m={name:o.target.name,value:o.target.value};this.pubPush(g,m)};if(A>0){d.has(o.target)&&clearTimeout(d.get(o.target));let m=setTimeout(b,A);d.set(o.target,m)}else b()}})}),this.addDomListener(document,"submit",async n=>{if(!n.target||!n.target.getAttribute)return;let o=n.target.getAttribute("data-rt-submit"),c=n.target.getAttribute("data-api-submit");if(o||c){n.target.querySelectorAll("[name]").forEach(m=>{let _=m.name;_&&(this.publish(`errors/${_}`,""),m.classList.remove("invalid"))});let l=n.target.querySelectorAll("[data-rt-validate]"),g=!0;if(l.length>0&&typeof this.validateField=="function"){let m=Object.fromEntries(new FormData(n.target).entries());l.forEach(_=>{let S=_.getAttribute("data-rt-validate"),C=_.name;if(S&&C){let v=this.validateField(_.value,S,m);v&&(g=!1,_.classList.add("invalid"),this.publish(`errors/${C}`,v))}})}if(!g){n.preventDefault(),n.stopPropagation();return}n.preventDefault();let u=this.getClosestContext(n.target)||{},A=new FormData(n.target),b=Object.fromEntries(A.entries());if(o){let m=o;for(let _ in u){let S=e(_);m=m.replace(new RegExp(`\\{\\{${S}\\}\\}`,"g"),u[_]!==void 0&&u[_]!==null?u[_]:"")}this.publish(m,b)}else if(c){let m=c;for(let v in u){let L=e(v);m=m.replace(new RegExp(`\\{\\{${L}\\}\\}`,"g"),u[v]!==void 0&&u[v]!==null?u[v]:"")}let _=m.trim().split(" "),S=_.length>1?_[0].toUpperCase():"POST",C=_.length>1?_[1]:_[0];b._method&&(S=String(b._method).toUpperCase());try{let v=await this.api.request(S,C,b),L=n.target.getAttribute("data-api-result");L&&this._updateDOM(L,v);let P=n.target.getAttribute("data-api-redirect");P&&(window.location.href=P),n.target.hasAttribute("data-api-reload")&&window.location.reload()}catch(v){console.error("[Dolphin] API Submit Error:",v)}}}}),["click","change","submit","input","keydown","keyup","dblclick","focus","blur","mouseenter","mouseleave"].forEach(n=>{this.addDomListener(document,n,async o=>{if(!o.target||!o.target.closest)return;let c=o.target.closest(`[data-rt-${n}]`),p=o.target.closest(`[data-api-${n}]`);if(c){n==="submit"&&o.preventDefault();let g=c.getAttribute(`data-rt-${n}`),u=c.getAttribute("data-rt-payload"),A=this.getClosestContext(c)||{},b={};if(u){let m=u;for(let _ in A){let S=e(_);m=m.replace(new RegExp(`\\{\\{${S}\\}\\}`,"g"),A[_]!==void 0&&A[_]!==null?A[_]:"")}try{b=JSON.parse(m)}catch{b={}}}this.publish(g,b)}if(p){n==="submit"&&o.preventDefault();let g=p.getAttribute(`data-api-${n}`),u=p.getAttribute("data-api-payload"),A=this.getClosestContext(p)||{},b=g.trim().split(" "),m=b.length>1?b[0].toUpperCase():"POST",_=b.length>1?b[1]:b[0],S=null;if(u){let C=u;for(let v in A){let L=e(v);C=C.replace(new RegExp(`\\{\\{${L}\\}\\}`,"g"),A[v]!==void 0&&A[v]!==null?A[v]:"")}try{S=JSON.parse(C)}catch{S=null}}try{let C=await this.api.request(m,_,S),v=p.getAttribute("data-api-result");v&&this._updateDOM(v,C);let L=p.getAttribute("data-api-redirect");L&&(window.location.href=L),p.hasAttribute("data-api-reload")&&window.location.reload()}catch(C){console.error(`[Dolphin] API ${n} Error:`,C)}}let l=o.target.closest(`[data-store-${n}]`);if(l){n==="submit"&&o.preventDefault();let g=l.getAttribute(`data-store-${n}`);g&&this._executeStoreAction(g,l)}})}),this.subscribe("#",(n,o)=>{this._updateDOM(o,n)}),this._scanAndFetchAPIBinds(),this._scanStoreBinds(),this._resolveImports(),this._initSPARouter()},w._scanAndFetchAPIBinds=async function(){if(typeof document>"u")return;let h=document.querySelectorAll("[data-api-get]");for(let d of Array.from(h)){let f=d.getAttribute("data-api-get");if(f&&!(typeof d.hasAttribute=="function"&&d.hasAttribute("data-api-initialized"))){typeof d.setAttribute=="function"&&d.setAttribute("data-api-initialized","true");try{let n=await this.api.get(f),o=d.getAttribute("data-api-store");if(o){let p=o.split(".");p.length===2&&this.setStoreState(p[0],p[1],n)}let c=d.getAttribute("data-rt-bind");if(c&&!o)this._updateDOM(c,n);else if(!o){let p=a(d);if(p&&typeof n=="object"&&n!==null){let l=this._applyDeclarativeDirectives(d,n);if(Array.isArray(l)){let g="";for(let u of l)g+=y(p,u);x(d,g)}else x(d,y(p,l))}else if(d.tagName==="INPUT"||d.tagName==="TEXTAREA")d.value=typeof n=="object"?n.value!==void 0?n.value:"":n;else{let l=typeof n=="object"?n.html||n.text||JSON.stringify(n):String(n);d.innerHTML=T(l)}}}catch(n){console.error("[Dolphin] API Get Error:",n)}}}},w._applyDeclarativeDirectives=function(h,d){let f=d;if(typeof d=="object"&&d!==null){let n=o=>{let c=[...o],p=h.getAttribute("data-rt-filter");if(p){let u=p.split("==");if(u.length===2){let A=u[0].trim(),b=u[1].trim(),m,_=b.split(".");_.length===2?m=this.getStoreState(_[0],_[1]):m=d[b]!==void 0?d[b]:this.getStoreState("app",b),m!=null&&m!==""&&(c=c.filter(S=>S[A]===m))}}let l=h.getAttribute("data-rt-search");if(l){let u=l.split("==");if(u.length===2){let A=u[0].trim(),b=u[1].trim(),m,_=b.split(".");if(_.length===2?m=this.getStoreState(_[0],_[1]):m=d[b]!==void 0?d[b]:this.getStoreState("app",b),m!=null&&m!==""){let S=String(m).toLowerCase();c=c.filter(C=>{let v=C[A];return v!=null&&String(v).toLowerCase().includes(S)})}}}let g=h.getAttribute("data-rt-sort");if(g){let u,A=g.split(".");if(A.length===2?u=this.getStoreState(A[0],A[1]):u=d[g]!==void 0?d[g]:this.getStoreState("app",g),u&&u!=="")if(u==="popular")c.sort((b,m)=>{let _=b.rating?.rate||b.rate||0;return(m.rating?.rate||m.rate||0)-_});else{let b="",m="asc";u.endsWith("-low")||u.endsWith("-asc")?(b=u.replace("-low","").replace("-asc",""),m="asc"):(u.endsWith("-high")||u.endsWith("-desc"))&&(b=u.replace("-high","").replace("-desc",""),m="desc"),b&&c.sort((_,S)=>{let C=(Y,tt)=>tt.split(".").reduce((W,et)=>W&&W[et],Y),v=C(_,b),L=C(S,b);if(v===void 0&&(v=_[b]),L===void 0&&(L=S[b]),typeof v=="string"&&typeof L=="string")return m==="asc"?v.localeCompare(L):L.localeCompare(v);let P=Number(v),q=Number(L);return!isNaN(P)&&!isNaN(q)?m==="asc"?P-q:q-P:0})}}return c};if(Array.isArray(d))f=n(d);else{let o="";for(let c in d)if(Array.isArray(d[c])){o=c;break}if(o){let c=n(d[o]);f={...d,[o]:c}}}}return f},w._updateDOM=function(h,d){if(typeof document>"u")return;document.querySelectorAll(`[data-rt-bind="${h}"]`).forEach(n=>{let o=this._applyDeclarativeDirectives(n,d);if(n.getAttribute("data-rt-type")==="context"&&typeof o=="object"&&o!==null){n._rtContext=o;let p=l=>{if(l.hasAttribute("data-rt-text")){let g=l.getAttribute("data-rt-text");if(g){let u=i(g,o);u!=null&&(l.textContent=u)}}if(l.hasAttribute("data-rt-html")){let g=l.getAttribute("data-rt-html");if(g){let u=i(g,o);u!=null&&(l.innerHTML=T(u))}}if(l.hasAttribute("data-rt-attr")){let g=l.getAttribute("data-rt-attr");g&&s(g,",").forEach(u=>{let A=r(u);if(A){let b=A[0].trim(),m=A[1].trim();if(b&&m){let _=i(m,o);_!=null&&l.setAttribute(b,_)}}})}if(l.hasAttribute("data-rt-class")){let g=l.getAttribute("data-rt-class");g&&s(g,",").forEach(u=>{let A=r(u);if(A){let b=A[0].trim(),m=A[1].trim(),_=b.split(/\s+/).filter(Boolean);i(m,o)?_.forEach(S=>l.classList.add(S)):_.forEach(S=>l.classList.remove(S))}})}if(l.hasAttribute("data-rt-if")){let g=l.getAttribute("data-rt-if");g&&(i(g,o)?l.style.display="":l.style.display="none")}if(l.hasAttribute("data-rt-hide")){let g=l.getAttribute("data-rt-hide");g&&(i(g,o)?l.style.display="none":l.style.display="")}};p(n),n.querySelectorAll("[data-rt-text], [data-rt-html], [data-rt-attr], [data-rt-class], [data-rt-if], [data-rt-hide]").forEach(p);return}let c=a(n);if(c&&typeof o=="object"&&o!==null){if(Array.isArray(o)){let p="";for(let l of o)p+=y(c,l);x(n,p)}else x(n,y(c,o));return}if(n.tagName==="INPUT"||n.tagName==="TEXTAREA")n.value=typeof o=="object"?o.value!==void 0?o.value:"":o;else if(c)n.innerHTML=typeof o=="object"?o.html||o.text||JSON.stringify(o):String(o);else{let p=typeof o=="object"?o.html||o.text||JSON.stringify(o):String(o);n.innerHTML=T(p)}})},w._resolveImports=async function(h){if(typeof document>"u")return;let d=h||document.body||document;if(!d||typeof d.querySelectorAll!="function")return;let f=d.querySelectorAll("[data-import]");if(f.length===0)return;let n=async(c,p)=>{let l=c.getAttribute("data-import");if(!l)return;if(p.has(l)){console.warn(`[Dolphin Component Warning]: Circular import detected for "${l}". Skipping resolving.`),c.innerHTML=`<span style="color:red;font-weight:bold;">Circular import: ${l}</span>`;return}p.add(l);let g=l.indexOf("#"),u=g!==-1?l.substring(0,g):l,A=g!==-1?l.substring(g):null,b=t.get(u);b||(b=fetch(u).then(S=>{if(!S.ok)throw new Error(`HTTP ${S.status}`);return S.text()}),b.catch(()=>t.delete(u)),t.set(u,b));let m="";try{if(m=await b,A&&typeof DOMParser<"u"){let v=new DOMParser().parseFromString(m,"text/html").querySelector(A);v?m=v.outerHTML:(console.warn(`[Dolphin Component Warning]: Selector "${A}" not found in imported file "${u}".`),m=`<span style="color:orange;font-weight:bold;">Selector ${A} not found in ${u}</span>`)}}catch(S){console.error(`[Dolphin Component Error]: Failed to fetch component "${u}":`,S),m=`<span style="color:red;font-weight:bold;">Failed to import ${u}</span>`}c.innerHTML=T(m),c.removeAttribute("data-import");let _=c.querySelectorAll("[data-import]");if(_.length>0){let S=Array.from(_).map(C=>n(C,new Set(p)));await Promise.all(S)}this._scanStoreBinds(),this._scanAndFetchAPIBinds()},o=Array.from(f).map(c=>n(c,new Set));await Promise.all(o)},w._initSPARouter=function(){if(typeof window>"u"||typeof document>"u"||this._routerInitialized)return;this._routerInitialized=!0;let h=null,d=()=>{let o=(this.options.routerViewport||"main, #viewport, body").split(",").map(c=>c.trim());for(let c of o){let p=document.querySelector(c);if(p)return p}return document.body},f=async(n,o=!0)=>{try{this.options.debug&&console.log(`%c\u{1F6E3}\uFE0F [Dolphin Router]: Navigating to ${n}...`,"color: #3b82f6; font-weight: bold;"),h&&h.abort(),h=new AbortController;let c=h.signal,p=d();this.options.routerTransitions&&p&&(p.classList.add("dolphin-fade-out"),await new Promise(_=>setTimeout(_,150)));let l=await fetch(n,{signal:c});if(!l.ok)throw new Error(`HTTP ${l.status}`);let g=await l.text();h=null;let A=new DOMParser().parseFromString(g,"text/html");A.title&&(document.title=A.title);let b=A.querySelector(this.options.routerViewport||"main, #viewport, body"),m=d();b&&m?(m.innerHTML=b.innerHTML,Array.from(b.attributes).forEach(_=>{m.setAttribute(_.name,_.value)})):m&&(m.innerHTML=A.body.innerHTML),o&&window.history.pushState({dolphinSpa:!0,url:n},"",n),this.options.routerTransitions&&m&&(m.classList.remove("dolphin-fade-out"),m.classList.add("dolphin-fade-in"),setTimeout(()=>m.classList.remove("dolphin-fade-in"),300)),await this._resolveImports(m),this._scanStoreBinds(),this._scanAndFetchAPIBinds()}catch(c){if(c&&c.name==="AbortError")return;console.error("[Dolphin Router Error]: Failed to route page:",c),window.location.href=n}};if(this.addDomListener(document,"click",n=>{let o=n.target.closest("a");if(!o||!o.hasAttribute("data-spa")&&o.getAttribute("data-spa")!=="true")return;let c=o.getAttribute("href");!c||c.startsWith("#")||c.startsWith("javascript:")||c.startsWith("mailto:")||c.startsWith("tel:")||new URL(c,window.location.href).origin!==window.location.origin||(n.preventDefault(),f(c))}),this.addDomListener(window,"popstate",n=>{n.state&&n.state.dolphinSpa?f(n.state.url,!1):n.state===null&&f(window.location.pathname,!1)}),this.options.routerTransitions){let n=document.createElement("style");n.innerHTML=`
27
27
  .dolphin-fade-out {
28
28
  opacity: 0;
29
29
  transition: opacity 0.15s ease-in-out;
@@ -34,4 +34,4 @@ var DolphinModule=(()=>{var U=Object.defineProperty;var G=Object.getOwnPropertyD
34
34
  main, #viewport, body {
35
35
  transition: opacity 0.15s ease-in-out;
36
36
  }
37
- `,document.head.appendChild(n)}}}var H=class{client;db;isOnline;memoryCache=new Map;memoryMutations=[];constructor(t){this.client=t,this.isOnline=typeof window<"u"&&typeof navigator<"u"?navigator.onLine:!0,this.initDB(),this.setupNetworkListeners()}initDB(){if(!(typeof indexedDB>"u"))try{let t=indexedDB.open("dolphin_offline",1);t.onupgradeneeded=e=>{let s=e.target.result;s.objectStoreNames.contains("cache")||s.createObjectStore("cache"),s.objectStoreNames.contains("mutations")||s.createObjectStore("mutations",{keyPath:"id",autoIncrement:!0})},t.onsuccess=e=>{this.db=e.target.result,this.isOnline&&this.syncMutations()}}catch(t){console.warn("[Dolphin Offline] Failed to initialize IndexedDB:",t)}}setupNetworkListeners(){typeof window>"u"||(this.client.addDomListener(window,"online",()=>{this.isOnline=!0,this.client._dispatch("network:status",{online:!0}),this.syncMutations()}),this.client.addDomListener(window,"offline",()=>{this.isOnline=!1,this.client._dispatch("network:status",{online:!1})}))}async getCache(t){return this.db?new Promise(e=>{try{let r=this.db.transaction("cache","readonly").objectStore("cache").get(t);r.onsuccess=()=>e(r.result?r.result.data:null),r.onerror=()=>e(null)}catch{e(null)}}):this.memoryCache.get(t)}async setCache(t,e){if(!this.db){this.memoryCache.set(t,e);return}return new Promise(s=>{try{let i=this.db.transaction("cache","readwrite");i.objectStore("cache").put({data:e,timestamp:Date.now()},t),i.oncomplete=()=>s(),i.onerror=()=>{console.warn("[Dolphin Offline] setCache write failed for key:",t),s()}}catch{s()}})}async queueMutation(t,e,s){let i={method:t,path:e,payload:s,timestamp:Date.now()};if(!this.db){this.memoryMutations.push(i);return}return new Promise(r=>{try{let a=this.db.transaction("mutations","readwrite");a.objectStore("mutations").add(i),a.oncomplete=()=>r(),a.onerror=()=>{console.warn("[Dolphin Offline] queueMutation write failed:",t,e),this.memoryMutations.push(i),r()}}catch{r()}})}async getMutations(){return this.db?new Promise(t=>{try{let i=this.db.transaction("mutations","readonly").objectStore("mutations").getAll();i.onsuccess=()=>t(i.result||[]),i.onerror=()=>t([])}catch{t([])}}):[...this.memoryMutations]}async removeMutation(t){if(!this.db){this.memoryMutations=this.memoryMutations.filter(e=>e.id!==t);return}return new Promise(e=>{try{let s=this.db.transaction("mutations","readwrite");s.objectStore("mutations").delete(t),s.oncomplete=()=>e(),s.onerror=()=>{console.warn("[Dolphin Offline] removeMutation failed for id:",t),e()}}catch{e()}})}async syncMutations(){let t=await this.getMutations();if(t.length!==0){console.log(`[Dolphin Offline] Syncing ${t.length} queued mutations...`);for(let e of t)try{await this.client.api.requestDirect(e.method,e.path,e.payload),e.id!==void 0?await this.removeMutation(e.id):this.memoryMutations.shift()}catch(s){if(console.error(`[Dolphin Offline] Sync failed for mutation ${e.method} ${e.path}:`,s),s&&s.status&&s.status>=400&&s.status<500)console.warn("[Dolphin Offline] Discarding invalid mutation."),e.id!==void 0?await this.removeMutation(e.id):this.memoryMutations.shift();else break}}}};function W(A){A._initOffline=function(){this.offline=new H(this)}}function it(A,t,e){let s=t.split(",");for(let i of s){let r=i.trim().split(":"),a=r[0],d=r[1];if(a==="required"){if(!A||A.trim()==="")return"This field is required"}else if(a==="email"){if(A&&A.trim()!==""&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(A))return"Please enter a valid email address"}else if(a==="min"){let E=parseInt(d,10);if(!A||A.length<E)return`Must be at least ${E} characters`}else if(a==="match"&&e&&A!==e[d])return`Must match ${d}`}return null}function j(A){A.validateField=it}function z(A){A.animateElement=function(t,e,s=300){if(typeof t.animate!="function"){t.classList.add(e),setTimeout(()=>t.classList.remove(e),s);return}e==="fade-in"?t.animate([{opacity:0,transform:"translateY(10px)"},{opacity:1,transform:"translateY(0)"}],{duration:s,easing:"ease-out"}):e==="fade-out"&&t.animate([{opacity:1,transform:"translateY(0)"},{opacity:0,transform:"translateY(10px)"}],{duration:s,easing:"ease-in"})},A.staggerListItems=function(t,e,s=50){if(typeof document>"u")return;t.querySelectorAll(e).forEach((r,a)=>{r.style.animationDelay=`${a*s}ms`,r.classList.add("staggered-item")})}}function V(A){A._initA11y=function(){typeof document>"u"||(this.addDomListener(document,"keydown",t=>{if(t.key!=="Tab")return;document.querySelectorAll("[data-rt-a11y-focus-trap]").forEach(s=>{if(s.style.display==="none"||s.hasAttribute("aria-hidden")&&s.getAttribute("aria-hidden")==="true")return;let r=Array.from(s.querySelectorAll('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex="0"], [contenteditable]'));if(r.length===0)return;let a=r[0],d=r[r.length-1];t.shiftKey?document.activeElement===a&&(d.focus(),t.preventDefault()):document.activeElement===d&&(a.focus(),t.preventDefault())})}),this.addDomListener(document,"keydown",t=>{if(!["ArrowUp","ArrowDown","Enter"].includes(t.key))return;document.querySelectorAll("[data-rt-keynav]").forEach(s=>{let i=Array.from(s.children);if(i.length===0)return;let r=i.findIndex(a=>a.classList.contains("active")||document.activeElement===a);t.key==="ArrowDown"?(r=(r+1)%i.length,i[r].focus(),i.forEach((a,d)=>{d===r?a.classList.add("active"):a.classList.remove("active")}),t.preventDefault()):t.key==="ArrowUp"?(r=(r-1+i.length)%i.length,i[r].focus(),i.forEach((a,d)=>{d===r?a.classList.add("active"):a.classList.remove("active")}),t.preventDefault()):t.key==="Enter"&&r!==-1&&(i[r].click(),t.preventDefault())})}))},A.autoAriaModal=function(t,e){e?(t.setAttribute("role","dialog"),t.setAttribute("aria-modal","true"),t.setAttribute("aria-hidden","false"),t.focus()):t.setAttribute("aria-hidden","true")}}function K(A){A._initI18n=function(){if(this.i18n=this.i18n||{locale:"en",dicts:{}},typeof document>"u")return;if(document.querySelectorAll("[data-i18n-dict]").forEach(e=>{let s=e.getAttribute("data-i18n-dict");if(s)try{let i=JSON.parse(e.textContent||"{}");this.i18n.dicts[s]={...this.i18n.dicts[s]||{},...i}}catch(i){console.warn("[Dolphin i18n] Failed to parse dictionary for locale:",s,i)}}),!this.i18n.locale&&typeof navigator<"u"){let e=navigator.language.split("-")[0];this.i18n.dicts[e]&&(this.i18n.locale=e)}this.addDomListener(document,"click",e=>{let s=e.target.closest("[data-i18n-switch]");if(s){let i=s.getAttribute("data-i18n-switch");i&&this.setLocale(i)}}),this.translateDOM()},A.setLocale=function(t){this.i18n=this.i18n||{locale:"en",dicts:{}},this.i18n.locale=t,this.translateDOM(),this.publish("i18n/locale",t)},A.translateDOM=function(){if(typeof document>"u")return;this.i18n=this.i18n||{locale:"en",dicts:{}};let t=this.i18n.locale||"en",e=this.i18n.dicts[t]||{};document.querySelectorAll("[data-i18n-key]").forEach(i=>{let r=i.getAttribute("data-i18n-key");if(!r)return;let a=r.split(".").reduce((E,S)=>E?E[S]:null,e);a==null&&(a=r);let d=i.getAttribute("data-i18n-params");if(d)try{let E=JSON.parse(d),S=k=>k.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");for(let k in E){let f=S(k);a=a.replace(new RegExp(`\\{\\{${f}\\}\\}`,"g"),E[k])}}catch{}i.tagName==="INPUT"||i.tagName==="TEXTAREA"?i.placeholder=a:i.textContent=a})}}function X(A){A._initDragDrop=function(){typeof document>"u"||(this.addDomListener(document,"dragstart",t=>{let e=t.target.closest("[data-drag]");if(!e)return;let s=e.getAttribute("data-drag");s&&(t.dataTransfer.setData("text/plain",s),t.dataTransfer.effectAllowed="move",e.classList.add("dragging"))}),this.addDomListener(document,"dragend",t=>{let e=t.target.closest("[data-drag]");e&&e.classList.remove("dragging")}),this.addDomListener(document,"dragover",t=>{let e=t.target.closest("[data-drop]");e&&(t.preventDefault(),e.classList.add("drag-over"))}),this.addDomListener(document,"dragleave",t=>{let e=t.target.closest("[data-drop]");e&&e.classList.remove("drag-over")}),this.addDomListener(document,"drop",t=>{let e=t.target.closest("[data-drop]");if(!e)return;t.preventDefault(),e.classList.remove("drag-over");let s=e.getAttribute("data-drop"),i=t.dataTransfer.getData("text/plain");if(s&&i)try{let r=JSON.parse(i);this.publish(s,r)}catch{this.publish(s,{value:i})}}),this.addDomListener(document,"dragover",t=>{let e=t.target.closest("[data-sortable]");if(!e)return;t.preventDefault();let s=e.querySelector(".dragging");if(!s)return;let r=Array.from(e.querySelectorAll("[data-drag]:not(.dragging)")).find(a=>{let d=a.getBoundingClientRect();return t.clientY-d.top-d.height/2<0});r?e.insertBefore(s,r):e.appendChild(s)}),this.addDomListener(document,"drop",t=>{let e=t.target.closest("[data-sortable]");if(!e)return;let s=e.getAttribute("data-sortable");if(!s)return;let r=Array.from(e.querySelectorAll("[data-drag]")).map((a,d)=>{let E=a.getAttribute("data-drag");try{return{index:d,payload:JSON.parse(E||"{}")}}catch{return{index:d,payload:E}}});this.publish(s,r)}))}}function J(A){A._initCollab=function(){if(typeof document>"u")return;let t=new Map,e=new Map,s=5e3;this.addDomListener(document,"mousemove",i=>{document.querySelectorAll("[data-rt-cursor-share]").forEach(a=>{let d=a.getAttribute("data-rt-cursor-share");if(!d)return;let E=a.getBoundingClientRect(),S=(i.clientX-E.left)/E.width,k=(i.clientY-E.top)/E.height,f=Date.now();(!a._lastSent||f-a._lastSent>50)&&(a._lastSent=f,this.pubPush(`collab/${d}/cursor/${this.deviceId}`,{deviceId:this.deviceId,x:S,y:k}))})}),this.addDomListener(document,"input",i=>{let r=i.target.getAttribute("data-rt-typing");if(!r)return;let a=r,d=E=>{this.pubPush(`collab/${a}/typing/${this.deviceId}`,{deviceId:this.deviceId,typing:E})};i.target._isTyping||(i.target._isTyping=!0,d(!0)),i.target._typingTimer&&clearTimeout(i.target._typingTimer),i.target._typingTimer=setTimeout(()=>{i.target._isTyping=!1,i.target._typingTimer=null,d(!1)},2e3)}),this.addDomListener(document,"input",i=>{let r=i.target.getAttribute("data-rt-crdt");if(!r)return;let a=r,d=i.target.value,E=Date.now();this.publish(`collab/${a}/crdt`,{deviceId:this.deviceId,value:d,timestamp:E,cursorPos:i.target.selectionStart})}),this.subscribe("collab/+/cursor/+",(i,r)=>{let a=r.split("/"),d=a[1],E=a[3];if(E===this.deviceId)return;let S=document.querySelector(`[data-rt-cursor-share="${d}"]`);if(!S)return;let k=`${d}::${E}`,f=t.get(k);(!f||!document.contains(f))&&(f=document.createElement("div"),f.className=`rt-cursor rt-cursor-${E}`,f.style.position="absolute",f.style.width="10px",f.style.height="10px",f.style.borderRadius="50%",f.style.backgroundColor="#"+Math.floor(Math.random()*16777215).toString(16).padStart(6,"0"),f.style.pointerEvents="none",S.appendChild(f),t.set(k,f));let u=S.getBoundingClientRect();f.style.left=i.x*u.width+"px",f.style.top=i.y*u.height+"px",e.has(k)&&clearTimeout(e.get(k)),e.set(k,setTimeout(()=>{let l=t.get(k);l&&l.parentNode&&l.parentNode.removeChild(l),t.delete(k),e.delete(k)},s))}),this.subscribe("collab/+/crdt",(i,r)=>{if(i.deviceId===this.deviceId)return;let d=r.split("/")[1];document.querySelectorAll(`[data-rt-crdt="${d}"]`).forEach(S=>{if(!S._lastUpdate||i.timestamp>S._lastUpdate){S._lastUpdate=i.timestamp;let k=S.selectionStart;S.value=i.value,document.activeElement===S&&S.setSelectionRange(k,k)}})}),this._collabCleanup=()=>{e.forEach(i=>clearTimeout(i)),e.clear(),t.forEach(i=>{i&&i.parentNode&&i.parentNode.removeChild(i)}),t.clear()}}}function Q(A){A.registerServiceWorker=async function(t="/sw.js"){if(typeof navigator>"u"||!("serviceWorker"in navigator))return console.warn("[Dolphin PWA] Service Workers are not supported in this browser."),null;try{let e=await navigator.serviceWorker.register(t);return console.log("[Dolphin PWA] Service Worker registered successfully with scope:",e.scope),e}catch(e){return console.error("[Dolphin PWA] Service Worker registration failed:",e),null}},A.subscribePushNotifications=async function(t){if(typeof window>"u"||!("serviceWorker"in navigator)||!("PushManager"in window))return console.warn("[Dolphin PWA] Push notifications are not supported in this browser."),null;try{let e=await navigator.serviceWorker.ready,s=await e.pushManager.getSubscription();if(!s){let i="=".repeat((4-t.length%4)%4),r=(t+i).replace(/\-/g,"+").replace(/_/g,"/"),a=window.atob(r),d=new Uint8Array(a.length);for(let E=0;E<a.length;++E)d[E]=a.charCodeAt(E);s=await e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:d})}return console.log("[Dolphin PWA] Subscribed to push notifications:",s),s}catch(e){return console.error("[Dolphin PWA] Push notification subscription failed:",e),null}}}var F=class{static render(t){if(typeof document>"u")throw new Error("DolphinTestUtils.render requires a DOM document environment to execute.");let e=document.createElement("div");return e.innerHTML=t,document.body.appendChild(e),{container:e,find:s=>e.querySelector(s),fireEvent:(s,i)=>{let r=document.createEvent("Event");r.initEvent(i,!0,!0),s.dispatchEvent(r)}}}static mockWebSocket(){let t=[],e={readyState:1,send:s=>{t.push(s)},close:jest.fn(),onopen:jest.fn(),onmessage:jest.fn(),onclose:jest.fn(),onerror:jest.fn(),sentMessages:t};return global.WebSocket=class{static OPEN=1;readyState=e.readyState;send=e.send;close=e.close;set onopen(s){e.onopen=s}get onopen(){return e.onopen}set onmessage(s){e.onmessage=s}get onmessage(){return e.onmessage}set onclose(s){e.onclose=s}get getonclose(){return e.onclose}constructor(){setTimeout(()=>e.onopen&&e.onopen(),0)}},e}static simulateClick(t){let e={target:t,preventDefault:jest.fn(),stopPropagation:jest.fn()};(global.document._listeners?.click||[]).forEach(i=>i(e))}static simulateChange(t,e){t.value=e;let s={target:t,preventDefault:jest.fn(),stopPropagation:jest.fn()};(global.document._listeners?.change||[]).forEach(r=>r(s))}};function Y(A){A.testing=F}B(C.prototype);W(C.prototype);j(C.prototype);z(C.prototype);V(C.prototype);K(C.prototype);X(C.prototype);J(C.prototype);Q(C.prototype);Y(C.prototype);typeof window<"u"&&(window.DolphinClient=C,document.addEventListener("DOMContentLoaded",()=>{if(!window.dolphin){let A=document.querySelector('script[src*="dolphin-client"]'),t=A?A.getAttribute("data-debug")==="true":!1,e=new C(void 0,void 0,{debug:t});window.dolphin=e,t&&(console.log("%c\u{1F42C} [Dolphin Client] Auto-initialized local reactive engine!","color: #06b6d4; font-weight: bold; font-size: 14px;"),console.log('%c\u{1F449} Tip: You can access the client instance via "window.dolphin" in console.',"color: #94a3b8; font-style: italic;")),document.querySelector('[data-store-write="app.username"]')&&e.setStoreState("app","username","\u0928\u092E\u0938\u094D\u0924\u0947 \u0938\u093E\u0925\u0940!")}}));return st(rt);})();
37
+ `,document.head.appendChild(n)}}}var F=class{client;db;isOnline;memoryCache=new Map;memoryMutations=[];constructor(t){this.client=t,this.isOnline=typeof window<"u"&&typeof navigator<"u"?navigator.onLine:!0,this.initDB(),this.setupNetworkListeners()}initDB(){if(!(typeof indexedDB>"u"))try{let t=indexedDB.open("dolphin_offline",1);t.onupgradeneeded=e=>{let i=e.target.result;i.objectStoreNames.contains("cache")||i.createObjectStore("cache"),i.objectStoreNames.contains("mutations")||i.createObjectStore("mutations",{keyPath:"id",autoIncrement:!0})},t.onsuccess=e=>{this.db=e.target.result,this.isOnline&&this.syncMutations()}}catch(t){console.warn("[Dolphin Offline] Failed to initialize IndexedDB:",t)}}setupNetworkListeners(){typeof window>"u"||(this.client.addDomListener(window,"online",()=>{this.isOnline=!0,this.client._dispatch("network:status",{online:!0}),this.syncMutations()}),this.client.addDomListener(window,"offline",()=>{this.isOnline=!1,this.client._dispatch("network:status",{online:!1})}))}async getCache(t){return this.db?new Promise(e=>{try{let r=this.db.transaction("cache","readonly").objectStore("cache").get(t);r.onsuccess=()=>e(r.result?r.result.data:null),r.onerror=()=>e(null)}catch{e(null)}}):this.memoryCache.get(t)}async setCache(t,e){if(!this.db){this.memoryCache.set(t,e);return}return new Promise(i=>{try{let s=this.db.transaction("cache","readwrite");s.objectStore("cache").put({data:e,timestamp:Date.now()},t),s.oncomplete=()=>i(),s.onerror=()=>{console.warn("[Dolphin Offline] setCache write failed for key:",t),i()}}catch{i()}})}async queueMutation(t,e,i){let s={method:t,path:e,payload:i,timestamp:Date.now()};if(!this.db){this.memoryMutations.push(s);return}return new Promise(r=>{try{let a=this.db.transaction("mutations","readwrite");a.objectStore("mutations").add(s),a.oncomplete=()=>r(),a.onerror=()=>{console.warn("[Dolphin Offline] queueMutation write failed:",t,e),this.memoryMutations.push(s),r()}}catch{r()}})}async getMutations(){return this.db?new Promise(t=>{try{let s=this.db.transaction("mutations","readonly").objectStore("mutations").getAll();s.onsuccess=()=>t(s.result||[]),s.onerror=()=>t([])}catch{t([])}}):[...this.memoryMutations]}async removeMutation(t){if(!this.db){this.memoryMutations=this.memoryMutations.filter(e=>e.id!==t);return}return new Promise(e=>{try{let i=this.db.transaction("mutations","readwrite");i.objectStore("mutations").delete(t),i.oncomplete=()=>e(),i.onerror=()=>{console.warn("[Dolphin Offline] removeMutation failed for id:",t),e()}}catch{e()}})}async syncMutations(){let t=await this.getMutations();if(t.length!==0){console.log(`[Dolphin Offline] Syncing ${t.length} queued mutations...`);for(let e of t)try{await this.client.api.requestDirect(e.method,e.path,e.payload),e.id!==void 0?await this.removeMutation(e.id):this.memoryMutations.shift()}catch(i){if(console.error(`[Dolphin Offline] Sync failed for mutation ${e.method} ${e.path}:`,i),i&&i.status&&i.status>=400&&i.status<500)console.warn("[Dolphin Offline] Discarding invalid mutation."),e.id!==void 0?await this.removeMutation(e.id):this.memoryMutations.shift();else break}}}};function j(w){w._initOffline=function(){this.offline=new F(this)}}function ct(w,t,e){let i=t.split(",");for(let s of i){let r=s.trim().split(":"),a=r[0],y=r[1];if(a==="required"){if(!w||w.trim()==="")return"This field is required"}else if(a==="email"){if(w&&w.trim()!==""&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(w))return"Please enter a valid email address"}else if(a==="min"){let T=parseInt(y,10);if(!w||w.length<T)return`Must be at least ${T} characters`}else if(a==="match"&&e&&w!==e[y])return`Must match ${y}`}return null}function V(w){w.validateField=ct}function z(w){w.animateElement=function(t,e,i=300){if(typeof t.animate!="function"){t.classList.add(e),setTimeout(()=>t.classList.remove(e),i);return}e==="fade-in"?t.animate([{opacity:0,transform:"translateY(10px)"},{opacity:1,transform:"translateY(0)"}],{duration:i,easing:"ease-out"}):e==="fade-out"&&t.animate([{opacity:1,transform:"translateY(0)"},{opacity:0,transform:"translateY(10px)"}],{duration:i,easing:"ease-in"})},w.staggerListItems=function(t,e,i=50){if(typeof document>"u")return;t.querySelectorAll(e).forEach((r,a)=>{r.style.animationDelay=`${a*i}ms`,r.classList.add("staggered-item")})}}function K(w){w._initA11y=function(){typeof document>"u"||(this.addDomListener(document,"keydown",t=>{if(t.key!=="Tab")return;document.querySelectorAll("[data-rt-a11y-focus-trap]").forEach(i=>{if(i.style.display==="none"||i.hasAttribute("aria-hidden")&&i.getAttribute("aria-hidden")==="true")return;let r=Array.from(i.querySelectorAll('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex="0"], [contenteditable]'));if(r.length===0)return;let a=r[0],y=r[r.length-1];t.shiftKey?document.activeElement===a&&(y.focus(),t.preventDefault()):document.activeElement===y&&(a.focus(),t.preventDefault())})}),this.addDomListener(document,"keydown",t=>{if(!["ArrowUp","ArrowDown","Enter"].includes(t.key))return;document.querySelectorAll("[data-rt-keynav]").forEach(i=>{let s=Array.from(i.children);if(s.length===0)return;let r=s.findIndex(a=>a.classList.contains("active")||document.activeElement===a);t.key==="ArrowDown"?(r=(r+1)%s.length,s[r].focus(),s.forEach((a,y)=>{y===r?a.classList.add("active"):a.classList.remove("active")}),t.preventDefault()):t.key==="ArrowUp"?(r=(r-1+s.length)%s.length,s[r].focus(),s.forEach((a,y)=>{y===r?a.classList.add("active"):a.classList.remove("active")}),t.preventDefault()):t.key==="Enter"&&r!==-1&&(s[r].click(),t.preventDefault())})}))},w.autoAriaModal=function(t,e){e?(t.setAttribute("role","dialog"),t.setAttribute("aria-modal","true"),t.setAttribute("aria-hidden","false"),t.focus()):t.setAttribute("aria-hidden","true")}}function X(w){w._initI18n=function(){if(this.i18n=this.i18n||{locale:"en",dicts:{}},typeof document>"u")return;if(document.querySelectorAll("[data-i18n-dict]").forEach(e=>{let i=e.getAttribute("data-i18n-dict");if(i)try{let s=JSON.parse(e.textContent||"{}");this.i18n.dicts[i]={...this.i18n.dicts[i]||{},...s}}catch(s){console.warn("[Dolphin i18n] Failed to parse dictionary for locale:",i,s)}}),!this.i18n.locale&&typeof navigator<"u"){let e=navigator.language.split("-")[0];this.i18n.dicts[e]&&(this.i18n.locale=e)}this.addDomListener(document,"click",e=>{let i=e.target.closest("[data-i18n-switch]");if(i){let s=i.getAttribute("data-i18n-switch");s&&this.setLocale(s)}}),this.translateDOM()},w.setLocale=function(t){this.i18n=this.i18n||{locale:"en",dicts:{}},this.i18n.locale=t,this.translateDOM(),this.publish("i18n/locale",t)},w.translateDOM=function(){if(typeof document>"u")return;this.i18n=this.i18n||{locale:"en",dicts:{}};let t=this.i18n.locale||"en",e=this.i18n.dicts[t]||{};document.querySelectorAll("[data-i18n-key]").forEach(s=>{let r=s.getAttribute("data-i18n-key");if(!r)return;let a=r.split(".").reduce((T,E)=>T?T[E]:null,e);a==null&&(a=r);let y=s.getAttribute("data-i18n-params");if(y)try{let T=JSON.parse(y),E=D=>D.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");for(let D in T){let k=E(D);a=a.replace(new RegExp(`\\{\\{${k}\\}\\}`,"g"),T[D])}}catch{}s.tagName==="INPUT"||s.tagName==="TEXTAREA"?s.placeholder=a:s.textContent=a})}}function J(w){w._initDragDrop=function(){typeof document>"u"||(this.addDomListener(document,"dragstart",t=>{let e=t.target.closest("[data-drag]");if(!e)return;let i=e.getAttribute("data-drag");i&&(t.dataTransfer.setData("text/plain",i),t.dataTransfer.effectAllowed="move",e.classList.add("dragging"))}),this.addDomListener(document,"dragend",t=>{let e=t.target.closest("[data-drag]");e&&e.classList.remove("dragging")}),this.addDomListener(document,"dragover",t=>{let e=t.target.closest("[data-drop]");e&&(t.preventDefault(),e.classList.add("drag-over"))}),this.addDomListener(document,"dragleave",t=>{let e=t.target.closest("[data-drop]");e&&e.classList.remove("drag-over")}),this.addDomListener(document,"drop",t=>{let e=t.target.closest("[data-drop]");if(!e)return;t.preventDefault(),e.classList.remove("drag-over");let i=e.getAttribute("data-drop"),s=t.dataTransfer.getData("text/plain");if(i&&s)try{let r=JSON.parse(s);this.publish(i,r)}catch{this.publish(i,{value:s})}}),this.addDomListener(document,"dragover",t=>{let e=t.target.closest("[data-sortable]");if(!e)return;t.preventDefault();let i=e.querySelector(".dragging");if(!i)return;let r=Array.from(e.querySelectorAll("[data-drag]:not(.dragging)")).find(a=>{let y=a.getBoundingClientRect();return t.clientY-y.top-y.height/2<0});r?e.insertBefore(i,r):e.appendChild(i)}),this.addDomListener(document,"drop",t=>{let e=t.target.closest("[data-sortable]");if(!e)return;let i=e.getAttribute("data-sortable");if(!i)return;let r=Array.from(e.querySelectorAll("[data-drag]")).map((a,y)=>{let T=a.getAttribute("data-drag");try{return{index:y,payload:JSON.parse(T||"{}")}}catch{return{index:y,payload:T}}});this.publish(i,r)}))}}function Q(w){w._initCollab=function(){if(typeof document>"u")return;let t=new Map,e=new Map,i=5e3;this.addDomListener(document,"mousemove",s=>{document.querySelectorAll("[data-rt-cursor-share]").forEach(a=>{let y=a.getAttribute("data-rt-cursor-share");if(!y)return;let T=a.getBoundingClientRect(),E=(s.clientX-T.left)/T.width,D=(s.clientY-T.top)/T.height,k=Date.now();(!a._lastSent||k-a._lastSent>50)&&(a._lastSent=k,this.pubPush(`collab/${y}/cursor/${this.deviceId}`,{deviceId:this.deviceId,x:E,y:D}))})}),this.addDomListener(document,"input",s=>{let r=s.target.getAttribute("data-rt-typing");if(!r)return;let a=r,y=T=>{this.pubPush(`collab/${a}/typing/${this.deviceId}`,{deviceId:this.deviceId,typing:T})};s.target._isTyping||(s.target._isTyping=!0,y(!0)),s.target._typingTimer&&clearTimeout(s.target._typingTimer),s.target._typingTimer=setTimeout(()=>{s.target._isTyping=!1,s.target._typingTimer=null,y(!1)},2e3)}),this.addDomListener(document,"input",s=>{let r=s.target.getAttribute("data-rt-crdt");if(!r)return;let a=r,y=s.target.value,T=Date.now();this.publish(`collab/${a}/crdt`,{deviceId:this.deviceId,value:y,timestamp:T,cursorPos:s.target.selectionStart})}),this.subscribe("collab/+/cursor/+",(s,r)=>{let a=r.split("/"),y=a[1],T=a[3];if(T===this.deviceId)return;let E=document.querySelector(`[data-rt-cursor-share="${y}"]`);if(!E)return;let D=`${y}::${T}`,k=t.get(D);(!k||!document.contains(k))&&(k=document.createElement("div"),k.className=`rt-cursor rt-cursor-${T}`,k.style.position="absolute",k.style.width="10px",k.style.height="10px",k.style.borderRadius="50%",k.style.backgroundColor="#"+Math.floor(Math.random()*16777215).toString(16).padStart(6,"0"),k.style.pointerEvents="none",E.appendChild(k),t.set(D,k));let M=E.getBoundingClientRect();k.style.left=s.x*M.width+"px",k.style.top=s.y*M.height+"px",e.has(D)&&clearTimeout(e.get(D)),e.set(D,setTimeout(()=>{let x=t.get(D);x&&x.parentNode&&x.parentNode.removeChild(x),t.delete(D),e.delete(D)},i))}),this.subscribe("collab/+/crdt",(s,r)=>{if(s.deviceId===this.deviceId)return;let y=r.split("/")[1];document.querySelectorAll(`[data-rt-crdt="${y}"]`).forEach(E=>{if(!E._lastUpdate||s.timestamp>E._lastUpdate){E._lastUpdate=s.timestamp;let D=E.selectionStart;E.value=s.value,document.activeElement===E&&E.setSelectionRange(D,D)}})}),this._collabCleanup=()=>{e.forEach(s=>clearTimeout(s)),e.clear(),t.forEach(s=>{s&&s.parentNode&&s.parentNode.removeChild(s)}),t.clear()}}}function Z(w){w.registerServiceWorker=async function(t="/sw.js"){if(typeof navigator>"u"||!("serviceWorker"in navigator))return console.warn("[Dolphin PWA] Service Workers are not supported in this browser."),null;try{let e=await navigator.serviceWorker.register(t);return console.log("[Dolphin PWA] Service Worker registered successfully with scope:",e.scope),e}catch(e){return console.error("[Dolphin PWA] Service Worker registration failed:",e),null}},w.subscribePushNotifications=async function(t){if(typeof window>"u"||!("serviceWorker"in navigator)||!("PushManager"in window))return console.warn("[Dolphin PWA] Push notifications are not supported in this browser."),null;try{let e=await navigator.serviceWorker.ready,i=await e.pushManager.getSubscription();if(!i){let s="=".repeat((4-t.length%4)%4),r=(t+s).replace(/\-/g,"+").replace(/_/g,"/"),a=window.atob(r),y=new Uint8Array(a.length);for(let T=0;T<a.length;++T)y[T]=a.charCodeAt(T);i=await e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:y})}return console.log("[Dolphin PWA] Subscribed to push notifications:",i),i}catch(e){return console.error("[Dolphin PWA] Push notification subscription failed:",e),null}}}function I(){if(typeof jest<"u"&&typeof jest.fn=="function")return jest.fn();let w=(...t)=>(w.mock.calls.push(t),w._implementation?w._implementation(...t):w._returnValue);return w.mock={calls:[]},w._returnValue=void 0,w._implementation=null,w.mockReturnValue=t=>(w._returnValue=t,w),w.mockImplementation=t=>(w._implementation=t,w),w}var H=class{static render(t){if(typeof document>"u")throw new Error("DolphinTestUtils.render requires a DOM document environment to execute.");let e=document.createElement("div");return e.innerHTML=t,document.body.appendChild(e),{container:e,find:i=>e.querySelector(i),fireEvent:(i,s)=>{let r=document.createEvent("Event");r.initEvent(s,!0,!0),i.dispatchEvent(r)}}}static mockWebSocket(){let t=[],e={readyState:1,send:i=>{t.push(i)},close:I(),onopen:I(),onmessage:I(),onclose:I(),onerror:I(),sentMessages:t};return global.WebSocket=class{static OPEN=1;readyState=e.readyState;send=e.send;close=e.close;set onopen(i){e.onopen=i}get onopen(){return e.onopen}set onmessage(i){e.onmessage=i}get onmessage(){return e.onmessage}set onclose(i){e.onclose=i}get getonclose(){return e.onclose}constructor(){setTimeout(()=>e.onopen&&e.onopen(),0)}},e}static simulateClick(t){let e={target:t,preventDefault:I(),stopPropagation:I()};(global.document._listeners?.click||[]).forEach(s=>s(e))}static simulateChange(t,e){t.value=e;let i={target:t,preventDefault:I(),stopPropagation:I()};(global.document._listeners?.change||[]).forEach(r=>r(i))}};function G(w){w.testing=H}B($.prototype);j($.prototype);V($.prototype);z($.prototype);K($.prototype);X($.prototype);J($.prototype);Q($.prototype);Z($.prototype);G($.prototype);typeof window<"u"&&(window.DolphinClient=$,document.addEventListener("DOMContentLoaded",()=>{if(!window.dolphin){let w=document.querySelector('script[src*="dolphin-client"]'),t=w?w.getAttribute("data-debug")==="true":!1,e=new $(void 0,void 0,{debug:t});window.dolphin=e,t&&(console.log("%c\u{1F42C} [Dolphin Client] Auto-initialized local reactive engine!","color: #06b6d4; font-weight: bold; font-size: 14px;"),console.log('%c\u{1F449} Tip: You can access the client instance via "window.dolphin" in console.',"color: #94a3b8; font-style: italic;")),document.querySelector('[data-store-write="app.username"]')&&e.setStoreState("app","username","\u0928\u092E\u0938\u094D\u0924\u0947 \u0938\u093E\u0925\u0940!")}}));return at(lt);})();