dolphin-client 1.1.1 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/settings.json +5 -0
- package/dist/dolphin-client.js +181 -171
- package/dist/dolphin-client.min.js +19 -19
- package/dist/index.cjs +181 -171
- package/dist/index.js +181 -171
- package/package.json +1 -1
|
@@ -1,29 +1,29 @@
|
|
|
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,
|
|
3
|
-
`);let
|
|
4
|
-
`}else if(
|
|
5
|
-
`}else if(
|
|
6
|
-
`}else if(
|
|
7
|
-
`;else if(
|
|
8
|
-
`;else if(
|
|
9
|
-
`,v&&(
|
|
10
|
-
`),
|
|
11
|
-
`}else if(
|
|
12
|
-
`),
|
|
1
|
+
var DolphinModule=(()=>{var q=Object.defineProperty;var et=Object.getOwnPropertyDescriptor;var nt=Object.getOwnPropertyNames;var st=Object.prototype.hasOwnProperty;var it=(_,t)=>{for(var e in t)q(_,e,{get:t[e],enumerable:!0})},rt=(_,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of nt(t))!st.call(_,i)&&i!==e&&q(_,i,{get:()=>t[i],enumerable:!(n=et(t,i))||n.enumerable});return _};var ot=_=>rt(q({},"__esModule",{value:!0}),_);var ct={};it(ct,{DolphinClient:()=>x});var I=class{client;constructor(t){return this.client=t,this._createProxy([])}_createProxy(t){let e=t.join("/"),n=r=>this.request("GET",e,null,r);n.get=(r,a)=>typeof r=="string"?this.request("GET",r,null,a):this.request("GET",e,null,r),n.post=(r,a,h)=>typeof r=="string"?this.request("POST",r,a,h):this.request("POST",e,r,a),n.put=(r,a,h)=>typeof r=="string"?this.request("PUT",r,a,h):this.request("PUT",e,r,a),n.patch=(r,a,h)=>typeof r=="string"?this.request("PATCH",r,a,h):this.request("PATCH",e,r,a),n.del=(r,a)=>typeof r=="string"?this.request("DELETE",r,null,a):this.request("DELETE",e,null,r),n.request=(r,a,h,T)=>{let E=a?e?`${e}/${a.startsWith("/")?a.slice(1):a}`:a:e;return this.request(r,E,h,T)},n.requestDirect=(r,a,h,T)=>this.requestDirect(r,a,h,T),n._findCSRFToken=()=>this._findCSRFToken(),n._resolveBaseUrl=r=>this._resolveBaseUrl(r),n._normalizeValidationErrors=r=>this._normalizeValidationErrors(r);let i=["get","post","put","patch","del","request","requestDirect","_findCSRFToken","_resolveBaseUrl","_normalizeValidationErrors"];return new Proxy(n,{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 h=a.getAttribute("content");if(h)return h}}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 n=["csrfToken","XSRF-TOKEN","_csrf","csrf_token"];for(let r of n){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 h=a.endsWith("/")?a.slice(0,-1):a;e=`${this.client.httpUrl}${h.startsWith("/")?h:"/"+h}`}}}}let n=t.startsWith("/")?t:"/"+t;return`${e}${n}`}_normalizeValidationErrors(t){let e={};if(!t||typeof t!="object")return e;let n=t.errors||t.validationErrors||t;if(Array.isArray(n)){for(let i of n)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 n=="object"&&n!==null)for(let i in n){let r=n[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 h=a[0];e[i]=String(r[h])}}else e[i]=String(r)}return e}async request(t,e,n=null,i={}){if(this.client.offline){let r=this.client.offline.isOnline,a=`${t.toUpperCase()}:${e}`;if(t.toUpperCase()==="GET")if(r)try{let h=await this.requestDirect(t,e,n,i);return await this.client.offline.setCache(a,h),h}catch(h){let T=await this.client.offline.getCache(a);if(T!=null)return T;throw h}else{let h=await this.client.offline.getCache(a);if(h!=null)return h;throw{status:503,data:{error:"Offline, no cache available"}}}else return r?this.requestDirect(t,e,n,i):(await this.client.offline.queueMutation(t,e,n),this.client._dispatch("offline:queued",{method:t,path:e,body:n}),{success:!0,offline:!0,message:"Mutation queued offline"})}return this.requestDirect(t,e,n,i)}async requestDirect(t,e,n=null,i={}){let r=i._isRetry===!0,a=t.toUpperCase(),h=n,E={...!["GET","HEAD"].includes(a)?{"Content-Type":"application/json"}:{},...i.headers||{}};["PUT","PATCH","DELETE"].includes(a)&&(this.client.options.methodSpoofing||i.methodSpoofing)&&(E["X-HTTP-Method-Override"]=a,h instanceof FormData?h.append("_method",a):h&&typeof h=="object"?h={...h,_method:a}:h||(h={_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,h||"");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 d=this._findCSRFToken();d&&(E["X-CSRF-Token"]=d,E["X-XSRF-TOKEN"]=d,E["X-CSRFToken"]=d,E["X-WP-Nonce"]=d,h&&typeof h=="object"&&!h._csrfToken&&!h._token&&!h._csrf&&(h={...h,_csrfToken:d,_token:d,_csrf:d}))}let $={...i};delete $._isRetry,delete $.methodSpoofing;try{let d=await fetch(D,{method:a,headers:E,signal:k.signal,...h?{body:JSON.stringify(h)}:{},...$});if(clearTimeout(M),d.status===401&&!r&&this.client.options.autoRefreshToken&&await this.client.auth._silentRefresh())return this.request(t,e,n,{...i,_isRetry:!0});let l=(d.headers.get("content-type")||"").includes("application/json")?await d.json():await d.text();if(!d.ok)throw{status:d.status,data:l};if(this.client.options.debug&&console.log("%c\u2705 [Dolphin API Success]:","color: #10b981; font-weight: bold;",t.toUpperCase(),e,l),l&&typeof l=="object"&&l.accessToken&&(this.client.setToken(l.accessToken),l.user&&(this.client.auth.user=l.user)),this.client.options.autoBroadcast&&["POST","PUT","PATCH","DELETE"].includes(t.toUpperCase())){let s=e.startsWith("/")?e.substring(1):e;this.client.publish(s,{method:t.toUpperCase(),payload:n,result:l})}return l}catch(d){if(clearTimeout(M),this.client.options.debug&&console.error("%c\u274C [Dolphin API Error]:","color: #ef4444; font-weight: bold;",t.toUpperCase(),e,d),d&&typeof d=="object"&&d.data){let f=this._normalizeValidationErrors(d.data);if(Object.keys(f).length>0)for(let l in f)this.client.publish(`errors/${l}`,f[l])}throw d.name==="AbortError"?{status:408,data:{error:"Request timed out"}}:d}}};var R=class{client;user;_refreshing;constructor(t){this.client=t,this.user=null,this._refreshing=!1}async login(t,e){let n=await this.client.api.post("/api/auth/login",{email:t,password:e});return n.accessToken&&(this.client.setToken(n.accessToken),this.user=n.user||null),n}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 n={code:t,email:e||this.user?.email},i=await this.client.api.post("/api/auth/2fa/verify",n);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 N=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,n)=>{if(n in e)return e[n];if(typeof n=="string")return this._getCollection(n)}})}_getCollection(t){if(!this.data.has(t)){let e={_rawItems:[],items:[],loading:!0,error:null,success:!1,_filter:null,_sort:null,where:n=>(e._filter=n,this._applyTransform(e),e),orderBy:(n,i="asc")=>(e._sort={key:n,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 n=await this.client.api.get(`/${t.toLowerCase()}`);if(e._rawItems=Array.isArray(n)?n:n.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(n){e.loading=!1,e.success=!1,e.error=n.data?.error||n.message||"Fetch failed",this._notify()}}_applyTransform(t){let e=[...t._rawItems];if(t._filter&&(e=e.filter(t._filter)),t._sort){let{key:n,direction:i}=t._sort;e.sort((r,a)=>r[n]===a[n]?0:(r[n]>a[n]?1:-1)*(i==="asc"?1:-1))}t.items=e,this._notify()}_handleRemoteUpdate(t,e){let n=this.data.get(t);if(!n)return;let{type:i,data:r}=e,a=n._rawItems;i==="create"?a=[...a,r]:i==="update"?a=a.map(h=>h.id===r.id||h._id===r._id?{...h,...r}:h):i==="delete"&&(a=a.filter(h=>!(r.id!=null&&h.id===r.id||r._id!=null&&h._id===r._id))),n._rawItems=a,this._applyTransform(n)}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 x=class{host;httpUrl;deviceId;options;socket;storage;accessToken;api;auth;store;handlers;signalHandlers;fileHandlers;_offlineQueue;reconnectAttempts;_reconnectTimer;_attachedListeners;constructor(t="",e="",n={}){!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,...n},this.socket=null,this.storage=typeof localStorage<"u"?localStorage:{getItem:()=>null,setItem:()=>{},removeItem:()=>{}},this.accessToken=this.storage.getItem("dolphin_token"),this.api=new I(this),this.auth=new R(this),this.store=new N(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(n=>n(e))),e.type==="FILE_AVAILABLE"&&this.fileHandlers.forEach(n=>n(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((n,i)=>{this._matchTopic(i,e.topic)&&n.forEach(r=>r(e.payload,e.topic))})}catch{this._dispatch("raw",t)}}_dispatch(t,e,n){let i=this.handlers.get(t);i&&i.forEach(r=>r(e,n||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 n=t.split("/"),i=e.split("/");if(n.length!==i.length&&!t.includes("#"))return!1;for(let r=0;r<n.length;r++){if(n[r]==="#")return!0;if(n[r]!=="+"&&n[r]!==i[r])return!1}return n.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 n=this.handlers.get(t);n.delete(e),n.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,n="",i){let r;e instanceof Blob?r=await e.arrayBuffer():e instanceof ArrayBuffer?r=e:r=e.buffer||e;let a=new Uint8Array(r),h=this.options.chunkSize,T=Math.ceil(a.length/h);this._sendRaw({type:"FILE_UPLOAD_START",fileId:t,name:n,size:a.length,totalChunks:T,chunkSize:h});for(let E=0;E<T;E++){let D=a.slice(E*h,(E+1)*h),k=this._uint8ToBase64(D);this._sendRaw({type:"FILE_UPLOAD_CHUNK",fileId:t,chunkIndex:E,totalChunks:T,data:k}),i&&i(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 n=0;n<t.length;n++)e+=String.fromCharCode(t[n]);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,n){t&&(t.addEventListener(e,n),this._attachedListeners=this._attachedListeners||[],this._attachedListeners.push({target:t,event:e,cb:n}))}cleanupDomListeners(){this._attachedListeners&&(this._attachedListeners.forEach(({target:t,event:e,cb:n})=>{try{t.removeEventListener(e,n)}catch{}}),this._attachedListeners=[])}};function W(_){let t=new Map;function e(d){return d.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function n(d,f){if(!(!f||typeof f!="object"))try{let l=new Proxy(f,{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 (${d}); }`)(l)}catch{return f[d]}}function i(d,f){let l=[],s="",o=!1,c=!1,p=!1,u=0;for(let b=0;b<d.length;b++){let g=d[b];g==="'"&&!c&&!p?o=!o:g==='"'&&!o&&!p?c=!c:g==="`"&&!o&&!c?p=!p:g==="("||g==="["||g==="{"?!o&&!c&&!p&&u++:(g===")"||g==="]"||g==="}")&&!o&&!c&&!p&&u--,g===f&&!o&&!c&&!p&&u===0?(l.push(s),s=""):s+=g}return l.push(s),l}function r(d){let f=!1,l=!1,s=!1,o=0;for(let c=0;c<d.length;c++){let p=d[c];if(p==="'"&&!l&&!s?f=!f:p==='"'&&!f&&!s?l=!l:p==="`"&&!f&&!l?s=!s:p==="("||p==="["||p==="{"?!f&&!l&&!s&&o++:(p===")"||p==="]"||p==="}")&&!f&&!l&&!s&&o--,p===":"&&!f&&!l&&!s&&o===0)return[d.slice(0,c),d.slice(c+1)]}return null}function a(d){let f=d.getAttribute("data-rt-template");if(!f)return null;if(typeof document<"u"&&!f.includes("<"))try{let l=document.querySelector(f);if(l)return l.innerHTML}catch{}return f}function h(d,f){if(!d.includes("{#if")&&!d.includes("{#each")){let l=d;for(let s in f){let o=s.replace(/[.*+?^$${}()|[\]\\]/g,"\\$&");l=l.replace(new RegExp("\\{\\{"+o+"\\}}","g"),f[s]!==void 0&&f[s]!==null?f[s]:"")}return l=l.replace(/\{\{([\s\S]*?)\}\}/g,(s,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(/\??\./),u=f;for(let b of p){if(u==null){u=void 0;break}u=u[b]}return u??""}return s}),l}try{let l=y=>y.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t"),s=`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=[],u;for(;(u=c.exec(d))!==null;){let y=d.slice(o,u.index);y&&(s+=`out += "${l(y)}";
|
|
3
|
+
`);let w=u[0];if(w.startsWith("{{")){let S=u[2];s+=`out += (${S} !== undefined && ${S} !== null ? ${S} : "");
|
|
4
|
+
`}else if(w.startsWith("{#if")){let S=u[3];s+=`if (${S}) {
|
|
5
|
+
`}else if(w.startsWith("{:else if")){let S=u[4];s+=`} else if (${S}) {
|
|
6
|
+
`}else if(w.startsWith("{:else}"))s+=`} else {
|
|
7
|
+
`;else if(w.startsWith("{/if}"))s+=`}
|
|
8
|
+
`;else if(w.startsWith("{#each")){let S=u[5],C=u[6],v=u[7];p.push({indexVar:v}),s+=`if (typeof ${S} !== "undefined" && ${S} !== null && Array.isArray(${S})) {
|
|
9
|
+
`,v&&(s+=` let ${v} = 0;
|
|
10
|
+
`),s+=` for (let ${C} of ${S}) {
|
|
11
|
+
`}else if(w.startsWith("{/each}")){let S=p.pop();S&&S.indexVar&&(s+=` ${S.indexVar}++;
|
|
12
|
+
`),s+=` }
|
|
13
13
|
}
|
|
14
|
-
`}else if(
|
|
15
|
-
`)}o=c.lastIndex}let
|
|
16
|
-
`),
|
|
17
|
-
`;let
|
|
14
|
+
`}else if(w.startsWith("{")){let S=u[8];S&&(s+=`out += (${S} !== undefined && ${S} !== null ? ${S} : "");
|
|
15
|
+
`)}o=c.lastIndex}let b=d.slice(o);b&&(s+=`out += "${l(b)}";
|
|
16
|
+
`),s+=`return out;
|
|
17
|
+
`;let g=`
|
|
18
18
|
with (context) {
|
|
19
19
|
try {
|
|
20
|
-
${
|
|
20
|
+
${s}
|
|
21
21
|
} catch (innerErr) {
|
|
22
22
|
console.warn('[Dolphin Template Eval Warning]:', innerErr);
|
|
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=f;return typeof Proxy<"u"&&f!==null&&typeof f=="object"&&(A=new Proxy(f,{has(y,w){return typeof w!="symbol"},get(y,w){if(w!==Symbol.unscopables){if(w in y)return y[w];if(typeof globalThis<"u"&&w in globalThis)return globalThis[w];if(typeof window<"u"&&w in window)return window[w]}}})),new Function("context",g)(A)}catch(l){console.error("[Dolphin Template Compiler Error]:",l);let s=d;for(let o in f){let c=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");s=s.replace(new RegExp(`\\{\\{${c}\\}\\}`,"g"),f[o]!==void 0&&f[o]!==null?f[o]:"")}return s}}function T(d){if(typeof document>"u")return d;try{let f=new DOMParser,s=/<\s*(?:body|html)\b/i.test(d)?d:`<body>${d}</body>`,c=f.parseFromString(s,"text/html").body,p=u=>{let b=u.tagName.toLowerCase();if(["script","iframe","object","embed","link","style","meta","applet","svg"].includes(b)){u.parentNode?.removeChild(u);return}let g=u.attributes;for(let A=g.length-1;A>=0;A--){let m=g[A].name.toLowerCase(),y=g[A].value.toLowerCase();(m.startsWith("on")||["src","href","data"].includes(m)&&(y.includes("javascript:")||y.includes("data:text/html")))&&u.removeAttribute(g[A].name)}Array.from(u.children).forEach(p)};return Array.from(c.children).forEach(p),c.innerHTML}catch{return d}}function E(d,f){if(d.nodeType!==f.nodeType){d.parentNode?.replaceChild(f.cloneNode(!0),d);return}if(d.nodeType===Node.TEXT_NODE){d.textContent!==f.textContent&&(d.textContent=f.textContent);return}if(d.nodeType===Node.ELEMENT_NODE){let l=d,s=f;if(l.tagName!==s.tagName){l.parentNode?.replaceChild(s.cloneNode(!0),l);return}let o=l.attributes,c=s.attributes;for(let m=o.length-1;m>=0;m--){let y=o[m].name;s.hasAttribute(y)||l.removeAttribute(y)}for(let m=0;m<c.length;m++){let y=c[m].name,w=c[m].value;l.getAttribute(y)!==w&&l.setAttribute(y,w)}l.tagName==="INPUT"||l.tagName==="TEXTAREA"?(l.value!==s.value&&(l.value=s.value),l.checked!==s.checked&&(l.checked=s.checked)):l.tagName==="SELECT"&&l.value!==s.value&&(l.value=s.value);let p=Array.from(l.childNodes),u=Array.from(s.childNodes),b=p.length,g=u.length,A=Math.max(b,g);for(let m=0;m<A;m++)m>=b?l.appendChild(u[m].cloneNode(!0)):m>=g?l.removeChild(p[m]):E(p[m],u[m])}}function D(d,f){if(typeof document>"u")return;let l=document.createElement(d.tagName);l.innerHTML=f;let s=Array.from(d.childNodes),o=Array.from(l.childNodes),c=s.length,p=o.length,u=Math.max(c,p);for(let b=0;b<u;b++)b>=c?d.appendChild(o[b].cloneNode(!0)):b>=p?d.removeChild(s[b]):E(s[b],o[b])}let k=new Map,M=!1;function $(d,f){k.set(d,f),M||(M=!0,(typeof requestAnimationFrame<"u"?requestAnimationFrame:s=>setTimeout(s,0))(()=>{k.forEach((s,o)=>{o.isConnected!==!1&&D(o,s)}),k.clear(),M=!1}))}_.setStoreState=function(d,f,l,s){this.uiStores=this.uiStores||new Map,this.uiStores.has(d)||this.uiStores.set(d,{});let o=this.uiStores.get(d);o[f]=l,this.options.debug&&console.log("%c\u{1F4BE} [Dolphin Store Update]:","color: #ec4899; font-weight: bold;",`${d}.${f}`,"=",l),typeof document<"u"&&document.querySelectorAll(`[data-store-read="${d}.${f}"]`).forEach(p=>{p!==s&&(p.tagName==="INPUT"||p.tagName==="TEXTAREA"?p.type==="checkbox"?p.checked=!!l:p.value=l??"":p.textContent=l??"")}),this.publish(`store/${d}`,o),typeof this._updateDOM=="function"&&this._updateDOM(`store/${d}`,o)},_.getStoreState=function(d,f){this.uiStores=this.uiStores||new Map;let l=this.uiStores.get(d);return l?l[f]:void 0},_._scanStoreBinds=function(){if(typeof document>"u")return;document.querySelectorAll("[data-store-write]").forEach(l=>{let s=l.getAttribute("data-store-write");if(s){let o=s.split(".");if(o.length===2){let c=o[0],p=o[1],u=l.type==="checkbox"?l.checked:l.value;this.uiStores=this.uiStores||new Map,this.uiStores.has(c)||this.uiStores.set(c,{});let b=this.uiStores.get(c);b[p]===void 0&&(b[p]=u)}}}),document.querySelectorAll("[data-store-read]").forEach(l=>{let s=l.getAttribute("data-store-read");if(s){let o=s.split(".");if(o.length===2){let c=o[0],p=o[1],u=this.getStoreState(c,p);u!=null&&(l.tagName==="INPUT"||l.tagName==="TEXTAREA"?l.type==="checkbox"?l.checked=!!u:l.value=u:l.textContent=u)}}})},_.getClosestContext=function(d,f){let l=d;for(;l;){if(l._rtContext){let s=l._rtContext;return f?s[f]:s}l=l.parentElement||l.parentNode}return null},_._executeStoreAction=function(d,f){this.uiStores=this.uiStores||new Map;let l=f&&typeof this.getClosestContext=="function"?this.getClosestContext(f):null,s=new Proxy({},{has:(o,c)=>!0,get:(o,c)=>{if(typeof c=="string")return c==="log"?p=>{if(p===void 0){let u={};this.uiStores.forEach((b,g)=>{u[g]={...b}}),console.log("%c\u{1F4CA} [Dolphin All UI Stores]:","color: #06b6d4; font-weight: bold;",u)}else if(p&&typeof p=="object"&&p.__isStoreProxy__){let u=p.__storeName__,b=this.uiStores.get(u);console.log(`%c\u{1F4CA} [Dolphin Store: ${u}]:`,"color: #06b6d4; font-weight: bold;",b?{...b}:{})}else console.log("%c\u{1F4CA} [Dolphin Log]:","color: #06b6d4; font-weight: bold;",p)}:l&&l[c]!==void 0?l[c]:typeof globalThis<"u"&&c in globalThis?globalThis[c]:typeof window<"u"&&c in window?window[c]:new Proxy({},{get:(p,u)=>{if(u==="__storeName__")return c;if(u==="__isStoreProxy__")return!0;if(typeof u=="string")return this.getStoreState(c,u)},set:(p,u,b)=>typeof u=="string"?(this.setStoreState(c,u,b),!0):!1})}});try{new Function("ctx",`with(ctx) { ${d} }`)(s)}catch(o){console.error("%c[Dolphin Store Action Error]:","color: #ef4444; font-weight: bold;",o),f&&console.error("%cFailed Element:","color: #f97316; font-weight: bold;",f),console.error("%cFailed Expression:","color: #3b82f6; font-style: italic;",d)}},_._initDOMBinding=function(){if(this._domInitialized)return;this._domInitialized=!0;let d=["input","change","keyup","paste","blur"],f=new WeakMap;d.forEach(s=>{this.addDomListener(document,s,o=>{if(!o.target||!o.target.getAttribute)return;let c=o.target.getAttribute("data-store-write");if(c){let g=c.split(".");if(g.length===2){let A=g[0],m=g[1],y=o.target.type==="checkbox"?o.target.checked:o.target.value;this.setStoreState(A,m,y,o.target)}}let p=o.target.getAttribute("data-rt-validate"),u=o.target.name;if(p&&u&&typeof this.validateField=="function"){let g=o.target.closest("form"),A=g?Object.fromEntries(new FormData(g).entries()):{},m=this.validateField(o.target.value,p,A);m?(o.target.classList.add("invalid"),this.publish(`errors/${u}`,m)):(o.target.classList.remove("invalid"),this.publish(`errors/${u}`,""))}let b=o.target.getAttribute("data-rt-push");if(b){let g=o.target.getAttribute("data-rt-debounce"),A=g?parseInt(g,10):0,m=()=>{let y={name:o.target.name,value:o.target.value};this.pubPush(b,y)};if(A>0){f.has(o.target)&&clearTimeout(f.get(o.target));let y=setTimeout(m,A);f.set(o.target,y)}else m()}})}),this.addDomListener(document,"submit",async s=>{if(!s.target||!s.target.getAttribute)return;let o=s.target.getAttribute("data-rt-submit"),c=s.target.getAttribute("data-api-submit");if(o||c){s.target.querySelectorAll("[name]").forEach(y=>{let w=y.name;w&&(this.publish(`errors/${w}`,""),y.classList.remove("invalid"))});let u=s.target.querySelectorAll("[data-rt-validate]"),b=!0;if(u.length>0&&typeof this.validateField=="function"){let y=Object.fromEntries(new FormData(s.target).entries());u.forEach(w=>{let S=w.getAttribute("data-rt-validate"),C=w.name;if(S&&C){let v=this.validateField(w.value,S,y);v&&(b=!1,w.classList.add("invalid"),this.publish(`errors/${C}`,v))}})}if(!b){s.preventDefault(),s.stopPropagation();return}s.preventDefault();let g=this.getClosestContext(s.target)||{},A=new FormData(s.target),m=Object.fromEntries(A.entries());if(o){let y=o;for(let w in g){let S=e(w);y=y.replace(new RegExp(`\\{\\{${S}\\}\\}`,"g"),g[w]!==void 0&&g[w]!==null?g[w]:"")}this.publish(y,m)}else if(c){let y=c;for(let v in g){let L=e(v);y=y.replace(new RegExp(`\\{\\{${L}\\}\\}`,"g"),g[v]!==void 0&&g[v]!==null?g[v]:"")}let w=y.trim().split(" "),S=w.length>1?w[0].toUpperCase():"POST",C=w.length>1?w[1]:w[0];m._method&&(S=String(m._method).toUpperCase());try{let v=await this.api.request(S,C,m),L=s.target.getAttribute("data-api-result");L&&this._updateDOM(L,v);let P=s.target.getAttribute("data-api-redirect");P&&(window.location.href=P),s.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(s=>{this.addDomListener(document,s,async o=>{if(!o.target||!o.target.closest)return;let c=o.target.closest(`[data-rt-${s}]`),p=o.target.closest(`[data-api-${s}]`);if(c){s==="submit"&&o.preventDefault();let b=c.getAttribute(`data-rt-${s}`),g=c.getAttribute("data-rt-payload"),A=this.getClosestContext(c)||{},m={};if(g){let y=g;for(let w in A){let S=e(w);y=y.replace(new RegExp(`\\{\\{${S}\\}\\}`,"g"),A[w]!==void 0&&A[w]!==null?A[w]:"")}try{m=JSON.parse(y)}catch{m={}}}this.publish(b,m)}if(p){s==="submit"&&o.preventDefault();let b=p.getAttribute(`data-api-${s}`),g=p.getAttribute("data-api-payload"),A=this.getClosestContext(p)||{},m=b.trim().split(" "),y=m.length>1?m[0].toUpperCase():"POST",w=m.length>1?m[1]:m[0],S=null;if(g){let C=g;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(y,w,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 ${s} Error:`,C)}}let u=o.target.closest(`[data-store-${s}]`);if(u){s==="submit"&&o.preventDefault();let b=u.getAttribute(`data-store-${s}`);b&&this._executeStoreAction(b,u)}})}),this.subscribe("#",(s,o)=>{this._updateDOM(o,s)}),this._scanAndFetchAPIBinds(),this._scanStoreBinds(),this._resolveImports(),this._initSPARouter()},_._scanAndFetchAPIBinds=async function(){if(typeof document>"u")return;let d=document.querySelectorAll("[data-api-get]");for(let f of Array.from(d)){let l=f.getAttribute("data-api-get");if(l&&!(typeof f.hasAttribute=="function"&&f.hasAttribute("data-api-initialized"))){typeof f.setAttribute=="function"&&f.setAttribute("data-api-initialized","true");try{let s=await this.api.get(l),o=f.getAttribute("data-api-store");if(o){let p=o.split(".");p.length===2&&this.setStoreState(p[0],p[1],s)}let c=f.getAttribute("data-rt-bind");if(c&&!o)this._updateDOM(c,s);else if(!o){let p=a(f);if(p&&typeof s=="object"&&s!==null){let u=this._applyDeclarativeDirectives(f,s);if(Array.isArray(u)){let b="";for(let g of u)b+=h(p,g);$(f,b)}else $(f,h(p,u))}else if(f.tagName==="INPUT"||f.tagName==="TEXTAREA")f.value=typeof s=="object"?s.value!==void 0?s.value:"":s;else{let u=typeof s=="object"?s.html||s.text||JSON.stringify(s):String(s);f.innerHTML=T(u)}}}catch(s){console.error("[Dolphin] API Get Error:",s)}}}},_._applyDeclarativeDirectives=function(d,f){let l=f;if(typeof f=="object"&&f!==null){let s=o=>{let c=[...o],p=d.getAttribute("data-rt-filter");if(p){let g=p.split("==");if(g.length===2){let A=g[0].trim(),m=g[1].trim(),y,w=m.split(".");w.length===2?y=this.getStoreState(w[0],w[1]):y=f[m]!==void 0?f[m]:this.getStoreState("app",m),y!=null&&y!==""&&(c=c.filter(S=>S[A]===y))}}let u=d.getAttribute("data-rt-search");if(u){let g=u.split("==");if(g.length===2){let A=g[0].trim(),m=g[1].trim(),y,w=m.split(".");if(w.length===2?y=this.getStoreState(w[0],w[1]):y=f[m]!==void 0?f[m]:this.getStoreState("app",m),y!=null&&y!==""){let S=String(y).toLowerCase();c=c.filter(C=>{let v=C[A];return v!=null&&String(v).toLowerCase().includes(S)})}}}let b=d.getAttribute("data-rt-sort");if(b){let g,A=b.split(".");if(A.length===2?g=this.getStoreState(A[0],A[1]):g=f[b]!==void 0?f[b]:this.getStoreState("app",b),g&&g!=="")if(g==="popular")c.sort((m,y)=>{let w=m.rating?.rate||m.rate||0;return(y.rating?.rate||y.rate||0)-w});else{let m="",y="asc";g.endsWith("-low")||g.endsWith("-asc")?(m=g.replace("-low","").replace("-asc",""),y="asc"):(g.endsWith("-high")||g.endsWith("-desc"))&&(m=g.replace("-high","").replace("-desc",""),y="desc"),m&&c.sort((w,S)=>{let C=(G,Y)=>Y.split(".").reduce((F,tt)=>F&&F[tt],G),v=C(w,m),L=C(S,m);if(v===void 0&&(v=w[m]),L===void 0&&(L=S[m]),typeof v=="string"&&typeof L=="string")return y==="asc"?v.localeCompare(L):L.localeCompare(v);let P=Number(v),O=Number(L);return!isNaN(P)&&!isNaN(O)?y==="asc"?P-O:O-P:0})}}return c};if(Array.isArray(f))l=s(f);else{let o="";for(let c in f)if(Array.isArray(f[c])){o=c;break}if(o){let c=s(f[o]);l={...f,[o]:c}}}}return l},_._updateDOM=function(d,f){if(typeof document>"u")return;document.querySelectorAll(`[data-rt-bind="${d}"]`).forEach(s=>{let o=this._applyDeclarativeDirectives(s,f);if(s.getAttribute("data-rt-type")==="context"&&typeof o=="object"&&o!==null){s._rtContext=o;let p=u=>{if(u.hasAttribute("data-rt-text")){let b=u.getAttribute("data-rt-text");if(b){let g=n(b,o);g!=null&&(u.textContent=g)}}if(u.hasAttribute("data-rt-html")){let b=u.getAttribute("data-rt-html");if(b){let g=n(b,o);g!=null&&(u.innerHTML=T(g))}}if(u.hasAttribute("data-rt-attr")){let b=u.getAttribute("data-rt-attr");b&&i(b,",").forEach(g=>{let A=r(g);if(A){let m=A[0].trim(),y=A[1].trim();if(m&&y){let w=n(y,o);w!=null&&u.setAttribute(m,w)}}})}if(u.hasAttribute("data-rt-class")){let b=u.getAttribute("data-rt-class");b&&i(b,",").forEach(g=>{let A=r(g);if(A){let m=A[0].trim(),y=A[1].trim(),w=m.split(/\s+/).filter(Boolean);n(y,o)?w.forEach(S=>u.classList.add(S)):w.forEach(S=>u.classList.remove(S))}})}if(u.hasAttribute("data-rt-if")){let b=u.getAttribute("data-rt-if");b&&(n(b,o)?u.style.display="":u.style.display="none")}if(u.hasAttribute("data-rt-hide")){let b=u.getAttribute("data-rt-hide");b&&(n(b,o)?u.style.display="none":u.style.display="")}};p(s),s.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(s);if(c&&typeof o=="object"&&o!==null){if(Array.isArray(o)){let p="";for(let u of o)p+=h(c,u);$(s,p)}else $(s,h(c,o));return}if(s.tagName==="INPUT"||s.tagName==="TEXTAREA")s.value=typeof o=="object"?o.value!==void 0?o.value:"":o;else if(c)s.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);s.innerHTML=T(p)}})},_._resolveImports=async function(d){if(typeof document>"u")return;let f=d||document.body||document;if(!f||typeof f.querySelectorAll!="function")return;let l=f.querySelectorAll("[data-import]");if(l.length===0)return;let s=async(c,p)=>{let u=c.getAttribute("data-import");if(!u)return;if(p.has(u)){console.warn(`[Dolphin Component Warning]: Circular import detected for "${u}". Skipping resolving.`),c.innerHTML=`<span style="color:red;font-weight:bold;">Circular import: ${u}</span>`;return}p.add(u);let b=u.indexOf("#"),g=b!==-1?u.substring(0,b):u,A=b!==-1?u.substring(b):null,m=t.get(g);m||(m=fetch(g).then(S=>{if(!S.ok)throw new Error(`HTTP ${S.status}`);return S.text()}),m.catch(()=>t.delete(g)),t.set(g,m));let y="";try{if(y=await m,A&&typeof DOMParser<"u"){let v=new DOMParser().parseFromString(y,"text/html").querySelector(A);v?y=v.outerHTML:(console.warn(`[Dolphin Component Warning]: Selector "${A}" not found in imported file "${g}".`),y=`<span style="color:orange;font-weight:bold;">Selector ${A} not found in ${g}</span>`)}}catch(S){console.error(`[Dolphin Component Error]: Failed to fetch component "${g}":`,S),y=`<span style="color:red;font-weight:bold;">Failed to import ${g}</span>`}c.innerHTML=T(y),c.removeAttribute("data-import");let w=c.querySelectorAll("[data-import]");if(w.length>0){let S=Array.from(w).map(C=>s(C,new Set(p)));await Promise.all(S)}this._scanStoreBinds(),this._scanAndFetchAPIBinds()},o=Array.from(l).map(c=>s(c,new Set));await Promise.all(o)},_._initSPARouter=function(){if(typeof window>"u"||typeof document>"u"||this._routerInitialized)return;this._routerInitialized=!0;let d=null,f=()=>{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},l=async(s,o=!0)=>{try{this.options.debug&&console.log(`%c\u{1F6E3}\uFE0F [Dolphin Router]: Navigating to ${s}...`,"color: #3b82f6; font-weight: bold;"),d&&d.abort(),d=new AbortController;let c=d.signal,p=f();this.options.routerTransitions&&p&&(p.classList.add("dolphin-fade-out"),await new Promise(w=>setTimeout(w,150)));let u=await fetch(s,{signal:c});if(!u.ok)throw new Error(`HTTP ${u.status}`);let b=await u.text();d=null;let A=new DOMParser().parseFromString(b,"text/html");A.title&&(document.title=A.title);let m=A.querySelector(this.options.routerViewport||"main, #viewport, body"),y=f();m&&y?(y.innerHTML=m.innerHTML,Array.from(m.attributes).forEach(w=>{y.setAttribute(w.name,w.value)})):y&&(y.innerHTML=A.body.innerHTML),o&&window.history.pushState({dolphinSpa:!0,url:s},"",s),this.options.routerTransitions&&y&&(y.classList.remove("dolphin-fade-out"),y.classList.add("dolphin-fade-in"),setTimeout(()=>y.classList.remove("dolphin-fade-in"),300)),await this._resolveImports(y),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=s}};if(this.addDomListener(document,"click",s=>{let o=s.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||(s.preventDefault(),l(c))}),this.addDomListener(window,"popstate",s=>{s.state&&s.state.dolphinSpa?l(s.state.url,!1):s.state===null&&l(window.location.pathname,!1)}),this.options.routerTransitions){let s=document.createElement("style");s.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(s)}}}var U=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 n=e.target.result;n.objectStoreNames.contains("cache")||n.createObjectStore("cache"),n.objectStoreNames.contains("mutations")||n.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(n=>{try{let i=this.db.transaction("cache","readwrite");i.objectStore("cache").put({data:e,timestamp:Date.now()},t),i.oncomplete=()=>n(),i.onerror=()=>{console.warn("[Dolphin Offline] setCache write failed for key:",t),n()}}catch{n()}})}async queueMutation(t,e,n){let i={method:t,path:e,payload:n,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 n=this.db.transaction("mutations","readwrite");n.objectStore("mutations").delete(t),n.oncomplete=()=>e(),n.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(n){if(console.error(`[Dolphin Offline] Sync failed for mutation ${e.method} ${e.path}:`,n),n&&n.status&&n.status>=400&&n.status<500)console.warn("[Dolphin Offline] Discarding invalid mutation."),e.id!==void 0?await this.removeMutation(e.id):this.memoryMutations.shift();else break}}}};function B(_){_._initOffline=function(){this.offline=new U(this)}}function at(_,t,e){let n=t.split(",");for(let i of n){let r=i.trim().split(":"),a=r[0],h=r[1];if(a==="required"){if(!_||_.trim()==="")return"This field is required"}else if(a==="email"){if(_&&_.trim()!==""&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(_))return"Please enter a valid email address"}else if(a==="min"){let T=parseInt(h,10);if(!_||_.length<T)return`Must be at least ${T} characters`}else if(a==="match"&&e&&_!==e[h])return`Must match ${h}`}return null}function j(_){_.validateField=at}function z(_){_.animateElement=function(t,e,n=300){if(typeof t.animate!="function"){t.classList.add(e),setTimeout(()=>t.classList.remove(e),n);return}e==="fade-in"?t.animate([{opacity:0,transform:"translateY(10px)"},{opacity:1,transform:"translateY(0)"}],{duration:n,easing:"ease-out"}):e==="fade-out"&&t.animate([{opacity:1,transform:"translateY(0)"},{opacity:0,transform:"translateY(10px)"}],{duration:n,easing:"ease-in"})},_.staggerListItems=function(t,e,n=50){if(typeof document>"u")return;t.querySelectorAll(e).forEach((r,a)=>{r.style.animationDelay=`${a*n}ms`,r.classList.add("staggered-item")})}}function V(_){_._initA11y=function(){typeof document>"u"||(this.addDomListener(document,"keydown",t=>{if(t.key!=="Tab")return;document.querySelectorAll("[data-rt-a11y-focus-trap]").forEach(n=>{if(n.style.display==="none"||n.hasAttribute("aria-hidden")&&n.getAttribute("aria-hidden")==="true")return;let r=Array.from(n.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],h=r[r.length-1];t.shiftKey?document.activeElement===a&&(h.focus(),t.preventDefault()):document.activeElement===h&&(a.focus(),t.preventDefault())})}),this.addDomListener(document,"keydown",t=>{if(!["ArrowUp","ArrowDown","Enter"].includes(t.key))return;document.querySelectorAll("[data-rt-keynav]").forEach(n=>{let i=Array.from(n.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,h)=>{h===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,h)=>{h===r?a.classList.add("active"):a.classList.remove("active")}),t.preventDefault()):t.key==="Enter"&&r!==-1&&(i[r].click(),t.preventDefault())})}))},_.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(_){_._initI18n=function(){if(this.i18n=this.i18n||{locale:"en",dicts:{}},typeof document>"u")return;if(document.querySelectorAll("[data-i18n-dict]").forEach(e=>{let n=e.getAttribute("data-i18n-dict");if(n)try{let i=JSON.parse(e.textContent||"{}");this.i18n.dicts[n]={...this.i18n.dicts[n]||{},...i}}catch(i){console.warn("[Dolphin i18n] Failed to parse dictionary for locale:",n,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 n=e.target.closest("[data-i18n-switch]");if(n){let i=n.getAttribute("data-i18n-switch");i&&this.setLocale(i)}}),this.translateDOM()},_.setLocale=function(t){this.i18n=this.i18n||{locale:"en",dicts:{}},this.i18n.locale=t,this.translateDOM(),this.publish("i18n/locale",t)},_.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((T,E)=>T?T[E]:null,e);a==null&&(a=r);let h=i.getAttribute("data-i18n-params");if(h)try{let T=JSON.parse(h),E=D=>D.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");for(let D in T){let k=E(D);a=a.replace(new RegExp(`\\{\\{${k}\\}\\}`,"g"),T[D])}}catch{}i.tagName==="INPUT"||i.tagName==="TEXTAREA"?i.placeholder=a:i.textContent=a})}}function X(_){_._initDragDrop=function(){typeof document>"u"||(this.addDomListener(document,"dragstart",t=>{let e=t.target.closest("[data-drag]");if(!e)return;let n=e.getAttribute("data-drag");n&&(t.dataTransfer.setData("text/plain",n),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 n=e.getAttribute("data-drop"),i=t.dataTransfer.getData("text/plain");if(n&&i)try{let r=JSON.parse(i);this.publish(n,r)}catch{this.publish(n,{value:i})}}),this.addDomListener(document,"dragover",t=>{let e=t.target.closest("[data-sortable]");if(!e)return;t.preventDefault();let n=e.querySelector(".dragging");if(!n)return;let r=Array.from(e.querySelectorAll("[data-drag]:not(.dragging)")).find(a=>{let h=a.getBoundingClientRect();return t.clientY-h.top-h.height/2<0});r?e.insertBefore(n,r):e.appendChild(n)}),this.addDomListener(document,"drop",t=>{let e=t.target.closest("[data-sortable]");if(!e)return;let n=e.getAttribute("data-sortable");if(!n)return;let r=Array.from(e.querySelectorAll("[data-drag]")).map((a,h)=>{let T=a.getAttribute("data-drag");try{return{index:h,payload:JSON.parse(T||"{}")}}catch{return{index:h,payload:T}}});this.publish(n,r)}))}}function Q(_){_._initCollab=function(){if(typeof document>"u")return;let t=new Map,e=new Map,n=5e3;this.addDomListener(document,"mousemove",i=>{document.querySelectorAll("[data-rt-cursor-share]").forEach(a=>{let h=a.getAttribute("data-rt-cursor-share");if(!h)return;let T=a.getBoundingClientRect(),E=(i.clientX-T.left)/T.width,D=(i.clientY-T.top)/T.height,k=Date.now();(!a._lastSent||k-a._lastSent>50)&&(a._lastSent=k,this.pubPush(`collab/${h}/cursor/${this.deviceId}`,{deviceId:this.deviceId,x:E,y:D}))})}),this.addDomListener(document,"input",i=>{let r=i.target.getAttribute("data-rt-typing");if(!r)return;let a=r,h=T=>{this.pubPush(`collab/${a}/typing/${this.deviceId}`,{deviceId:this.deviceId,typing:T})};i.target._isTyping||(i.target._isTyping=!0,h(!0)),i.target._typingTimer&&clearTimeout(i.target._typingTimer),i.target._typingTimer=setTimeout(()=>{i.target._isTyping=!1,i.target._typingTimer=null,h(!1)},2e3)}),this.addDomListener(document,"input",i=>{let r=i.target.getAttribute("data-rt-crdt");if(!r)return;let a=r,h=i.target.value,T=Date.now();this.publish(`collab/${a}/crdt`,{deviceId:this.deviceId,value:h,timestamp:T,cursorPos:i.target.selectionStart})}),this.subscribe("collab/+/cursor/+",(i,r)=>{let a=r.split("/"),h=a[1],T=a[3];if(T===this.deviceId)return;let E=document.querySelector(`[data-rt-cursor-share="${h}"]`);if(!E)return;let D=`${h}::${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=i.x*M.width+"px",k.style.top=i.y*M.height+"px",e.has(D)&&clearTimeout(e.get(D)),e.set(D,setTimeout(()=>{let $=t.get(D);$&&$.parentNode&&$.parentNode.removeChild($),t.delete(D),e.delete(D)},n))}),this.subscribe("collab/+/crdt",(i,r)=>{if(i.deviceId===this.deviceId)return;let h=r.split("/")[1];document.querySelectorAll(`[data-rt-crdt="${h}"]`).forEach(E=>{if(!E._lastUpdate||i.timestamp>E._lastUpdate){E._lastUpdate=i.timestamp;let D=E.selectionStart;E.value=i.value,document.activeElement===E&&E.setSelectionRange(D,D)}})}),this._collabCleanup=()=>{e.forEach(i=>clearTimeout(i)),e.clear(),t.forEach(i=>{i&&i.parentNode&&i.parentNode.removeChild(i)}),t.clear()}}}function J(_){_.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}},_.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,n=await e.pushManager.getSubscription();if(!n){let i="=".repeat((4-t.length%4)%4),r=(t+i).replace(/\-/g,"+").replace(/_/g,"/"),a=window.atob(r),h=new Uint8Array(a.length);for(let T=0;T<a.length;++T)h[T]=a.charCodeAt(T);n=await e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:h})}return console.log("[Dolphin PWA] Subscribed to push notifications:",n),n}catch(e){return console.error("[Dolphin PWA] Push notification subscription failed:",e),null}}}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:n=>e.querySelector(n),fireEvent:(n,i)=>{let r=document.createEvent("Event");r.initEvent(i,!0,!0),n.dispatchEvent(r)}}}static mockWebSocket(){let t=[],e={readyState:1,send:n=>{t.push(n)},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(n){e.onopen=n}get onopen(){return e.onopen}set onmessage(n){e.onmessage=n}get onmessage(){return e.onmessage}set onclose(n){e.onclose=n}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 n={target:t,preventDefault:jest.fn(),stopPropagation:jest.fn()};(global.document._listeners?.change||[]).forEach(r=>r(n))}};function Z(_){_.testing=H}W(x.prototype);B(x.prototype);j(x.prototype);z(x.prototype);V(x.prototype);K(x.prototype);X(x.prototype);Q(x.prototype);J(x.prototype);Z(x.prototype);typeof window<"u"&&(window.DolphinClient=x,document.addEventListener("DOMContentLoaded",()=>{if(!window.dolphin){let _=document.querySelector('script[src*="dolphin-client"]'),t=_?_.getAttribute("data-debug")==="true":!1,e=new x(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 ot(ct);})();
|