@qumra/fanar 0.0.13 → 0.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -115
- package/dist/ai.js +1 -1
- package/dist/chunk-ENHEJXVH.js +2 -0
- package/dist/chunk-EXX6U5BJ.js +2 -0
- package/dist/{chunk-NIEWNSOB.js → chunk-GMIBQMMR.js} +1 -1
- package/dist/chunk-VAMRF7HE.js +2 -0
- package/dist/chunk-ZE4S6DBP.js +2 -0
- package/dist/editor.js +1 -1
- package/dist/index.d.ts +174 -293
- package/dist/index.js +1 -1
- package/dist/notifications.js +1 -1
- package/package.json +6 -32
- package/dist/chunk-3EPEIAG2.js +0 -2
- package/dist/chunk-6DTSIOCB.js +0 -2
- package/dist/chunk-CTMW25W5.js +0 -2
- package/dist/chunk-K3TNXSD7.js +0 -2
- package/dist/native/ai.js +0 -1
- package/dist/native/chunk-LZHT3H7B.js +0 -1
- package/dist/native/chunk-RGKCDRSY.js +0 -2
- package/dist/native/editor.js +0 -1
- package/dist/native/index.js +0 -1
- package/dist/native/notifications.js +0 -1
- package/dist/native/orb.js +0 -1
package/dist/notifications.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import{Counter}from"./chunk-NIEWNSOB.js";import{Drawer,EmptyState,TONE_SOFT,cn,useUIText}from"./chunk-6DTSIOCB.js";var NOTIFICATION_SCHEMA_VERSION=1;var NOTIFICATION_PRIORITIES=["low","normal","critical"];var isObject=v=>typeof v==="object"&&v!==null&&!Array.isArray(v);var isNonEmptyString=v=>typeof v==="string"&&v.trim().length>0;function parseNotification(raw,options={}){const issues=[];const warnings=[];if(!isObject(raw))return{ok:false,issues:["\u0627\u0644\u0631\u0633\u0627\u0644\u0629 \u0645\u0634 \u0643\u0627\u0626\u0646"]};if(!isNonEmptyString(raw.id))issues.push("`id` \u0646\u0627\u0642\u0635 \u0623\u0648 \u0645\u0634 \u0646\u0635");if(!isNonEmptyString(raw.kind))issues.push("`kind` \u0646\u0627\u0642\u0635 \u0623\u0648 \u0645\u0634 \u0646\u0635");if(!isNonEmptyString(raw.title))issues.push("`title` \u0646\u0627\u0642\u0635 \u0623\u0648 \u0645\u0634 \u0646\u0635");let at=null;if(!isNonEmptyString(raw.at)){issues.push("`at` \u0646\u0627\u0642\u0635 \u0623\u0648 \u0645\u0634 \u0646\u0635")}else{const d=new Date(raw.at);if(Number.isNaN(d.getTime()))issues.push(`\`at\` \u0645\u0634 \u062A\u0627\u0631\u064A\u062E \u0645\u0642\u0631\u0648\u0621: ${raw.at}`);else at=d}const v=typeof raw.v==="number"&&Number.isFinite(raw.v)?raw.v:NOTIFICATION_SCHEMA_VERSION;if(v>NOTIFICATION_SCHEMA_VERSION){warnings.push(`\u0625\u0635\u062F\u0627\u0631 \u0623\u062D\u062F\u062B (${v}) \u2014 \u0627\u0644\u062D\u0642\u0648\u0644 \u0627\u0644\u0645\u0639\u0631\u0648\u0641\u0629 \u0627\u062A\u0642\u0631\u062A \u0648\u0627\u0644\u0628\u0627\u0642\u064A \u0627\u062A\u062C\u0627\u0647\u0644`)}let priority=(isNonEmptyString(raw.kind)?options.kinds?.get(raw.kind).priority:void 0)??"normal";if(raw.priority!==void 0){if(NOTIFICATION_PRIORITIES.includes(raw.priority)){priority=raw.priority}else if(raw.priority==="high"){warnings.push("`priority: high` \u0627\u062A\u0634\u0627\u0644\u062A \u2014 \u0627\u062A\u0642\u0631\u062A normal")}else{warnings.push(`\`priority\` \u0645\u0634 \u0645\u0639\u0631\u0648\u0641\u0629: ${String(raw.priority)} \u2014 \u0627\u062A\u062D\u0637\u0651\u062A normal`)}}let readAt=null;if(isNonEmptyString(raw.readAt)){const d=new Date(raw.readAt);if(Number.isNaN(d.getTime())){warnings.push(`\`readAt\` \u0645\u0634 \u062A\u0627\u0631\u064A\u062E \u0645\u0642\u0631\u0648\u0621: ${raw.readAt} \u2014 \u0627\u062A\u0642\u0631\u064A \u0645\u0642\u0631\u0648\u0621`);readAt=at??new Date}else{readAt=d}}else if(raw.read===true){warnings.push("`read` \u0645\u0647\u062C\u0648\u0631\u0629 \u2014 \u0627\u0633\u062A\u062E\u062F\u0645 `readAt`");readAt=at??new Date}let action;if(raw.action!==void 0){if(isObject(raw.action)&&isNonEmptyString(raw.action.label)&&isNonEmptyString(raw.action.href)){action={label:raw.action.label,href:raw.action.href}}else{warnings.push("`action` \u0646\u0627\u0642\u0635\u0647 `label` \u0623\u0648 `href` \u2014 \u0627\u062A\u0634\u0627\u0644")}}if(issues.length>0)return{ok:false,issues};return{ok:true,warnings,value:{v,id:raw.id,kind:raw.kind,at,title:raw.title,body:isNonEmptyString(raw.body)?raw.body:void 0,readAt,read:readAt!==null,priority,group:isNonEmptyString(raw.group)?raw.group:void 0,data:isObject(raw.data)?raw.data:{},action,sound:raw.sound==="none"?"none":void 0}}}function parseNotifications(raw,options={}){const rejected=[];const warnings=[];let list=raw;if(typeof raw==="string"){try{list=JSON.parse(raw)}catch{return{items:[],rejected:[{raw,issues:["\u0646\u0635 \u0645\u0634 JSON \u0635\u0627\u0644\u062D"]}],warnings}}}if(isObject(list)){const inner=list.items??list.notifications??list.data;if(Array.isArray(inner))list=inner}if(!Array.isArray(list)){return{items:[],rejected:[{raw,issues:["\u0627\u0644\u0645\u062A\u0648\u0642\u0651\u0639 \u0645\u0635\u0641\u0648\u0641\u0629 \u0631\u0633\u0627\u064A\u0644"]}],warnings}}const byId=new Map;for(const entry of list){const r=parseNotification(entry,options);if(!r.ok){rejected.push({raw:entry,issues:r.issues});continue}warnings.push(...r.warnings.map(w=>`${r.value.id}: ${w}`));byId.set(r.value.id,r.value)}const items=[...byId.values()].sort((a,b)=>b.at.getTime()-a.at.getTime());return{items,rejected,warnings}}function serializeNotification(n){return{v:n.v,id:n.id,kind:n.kind,at:n.at.toISOString(),title:n.title,...n.body!==void 0&&{body:n.body},readAt:n.readAt===null?null:n.readAt.toISOString(),priority:n.priority,...n.group!==void 0&&{group:n.group},...Object.keys(n.data).length>0&&{data:n.data},...n.action!==void 0&&{action:n.action},...n.sound!==void 0&&{sound:n.sound}}}import{AlertTriangle,Bell,CreditCard,Globe,MessageSquare,Megaphone,PackageX,RotateCcw,ShoppingBag,Star,Truck,Users,Wallet}from"lucide-react";var FALLBACK={label:"\u0625\u0634\u0639\u0627\u0631",icon:Bell,tone:"neutral",priority:"normal",sound:"notify"};function createKindRegistry(kinds,fallback){const base={...FALLBACK,...fallback};const map=new Map(kinds.map(k=>[k.kind,{...base,...strip(k),unknown:false}]));return{has:kind=>map.has(kind),get:kind=>map.get(kind)??{...base,kind,unknown:true},list:()=>[...map.values()]}}function strip(k){return Object.fromEntries(Object.entries(k).filter(([,v])=>v!==void 0))}var QUMRA_KINDS=[{kind:"payment.failed",label:"\u0641\u0634\u0644 \u062A\u062D\u0635\u064A\u0644",icon:CreditCard,tone:"red",priority:"critical",sound:"notify"},{kind:"stock.depleted",label:"\u0646\u0641\u0627\u062F \u0645\u062E\u0632\u0648\u0646",icon:PackageX,tone:"amber",priority:"critical",sound:"notify"},{kind:"order.stalled",label:"\u0637\u0644\u0628 \u0645\u062A\u0639\u062B\u0651\u0631",icon:Truck,tone:"amber",priority:"critical",sound:"notify"},{kind:"order.returned",label:"\u0645\u0631\u062A\u062C\u0639",icon:RotateCcw,tone:"amber",priority:"normal",sound:"notify"},{kind:"order.created",label:"\u0637\u0644\u0628 \u062C\u062F\u064A\u062F",icon:ShoppingBag,priority:"normal",sound:"notify",title:(n,t)=>t("notif.order.created",{id:n.data.orderId})},{kind:"payout.sent",label:"\u062A\u062D\u0648\u064A\u0644 \u0623\u0631\u0628\u0627\u062D",icon:Wallet,priority:"normal",sound:"notify",title:(n,t)=>t("notif.payout.sent",{amount:n.data.amount})},{kind:"review.created",label:"\u062A\u0642\u064A\u064A\u0645 \u062C\u062F\u064A\u062F",icon:Star,priority:"normal",sound:"notify"},{kind:"shipment.updated",label:"\u062A\u062D\u062F\u064A\u062B \u0634\u062D\u0646\u0629",icon:Truck,priority:"normal",sound:"notify"},{kind:"customer.message",label:"\u0631\u0633\u0627\u0644\u0629 \u0639\u0645\u064A\u0644",icon:MessageSquare,priority:"normal",sound:"notify"},{kind:"domain.issue",label:"\u0625\u0639\u062F\u0627\u062F \u0646\u0637\u0627\u0642",icon:Globe,priority:"normal",sound:"notify"},{kind:"app.updated",label:"\u062A\u062D\u062F\u064A\u062B \u062A\u0637\u0628\u064A\u0642",icon:Megaphone,priority:"low",sound:"none"},{kind:"community.digest",label:"\u0645\u0644\u062E\u0651\u0635 \u0627\u0644\u0645\u062C\u062A\u0645\u0639",icon:Users,priority:"low",sound:"none"}];var QUMRA_NOTIFICATIONS=createKindRegistry(QUMRA_KINDS);import{useCallback,useEffect,useRef,useState}from"react";var NOTIFY_CHIME="data:audio/mpeg;base64,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VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTQuMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZECP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUU0LjBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7kmRAj/AAAGkAAAAIAAANIAAAAQAAAaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FNC4wVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JkQI/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTQuMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZECP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==";var NOTIFICATION_SOUNDS=["notify"];var VOLUME=.6;var CRITICAL_BOOST=1.35;var GAP_MS=600;var MAX_QUEUED=4;var MUTE_KEY="qumra-notif-sound";function useNotificationSound({kinds}){const[ready,setReady]=useState(false);const[muted,setMutedState]=useState(()=>{if(typeof window==="undefined")return false;return window.localStorage?.getItem(MUTE_KEY)==="muted"});const nextSlot=useRef(0);const timers=useRef(new Set);const pools=useRef(new Map);const cursor=useRef(0);const pool=useCallback(url=>{let p=pools.current.get(url);if(!p){if(typeof Audio==="undefined")return null;p=Array.from({length:Math.min(MAX_QUEUED+1,6)},()=>{const el=new Audio(url);el.preload="auto";return el});pools.current.set(url,p)}return p},[]);useEffect(()=>{const t=timers.current;return()=>{t.forEach(clearTimeout);t.clear()}},[]);const unlock=useCallback(async()=>{const p=pool(NOTIFY_CHIME);if(!p)return false;const results=await Promise.all(p.map(async el=>{const was=el.muted;el.muted=true;try{await el.play();el.pause();el.currentTime=0;return true}catch{return false}finally{el.muted=was}}));const ok=results.every(Boolean);if(ok)setReady(true);return ok},[pool]);useEffect(()=>{if(ready||typeof window==="undefined")return;const on=()=>void unlock();window.addEventListener("pointerdown",on,{once:true});window.addEventListener("keydown",on,{once:true});return()=>{window.removeEventListener("pointerdown",on);window.removeEventListener("keydown",on)}},[ready,unlock]);const setMuted=useCallback(m=>{setMutedState(m);if(typeof window!=="undefined"){window.localStorage?.setItem(MUTE_KEY,m?"muted":"on")}},[]);const emit=useCallback((url,vol)=>{const p=pool(url);if(!p)return;const el=p.find(x=>x.paused||x.ended)??p[cursor.current++%p.length];el.volume=Math.min(1,Math.max(0,vol));el.currentTime=0;void el.play().catch(()=>{})},[pool]);const schedule=useCallback((url,vol)=>{const now=Date.now();const at=Math.max(now,nextSlot.current);if(at-now>MAX_QUEUED*GAP_MS)return;nextSlot.current=at+GAP_MS;if(at<=now){emit(url,vol);return}const id=setTimeout(()=>{timers.current.delete(id);emit(url,vol)},at-now);timers.current.add(id)},[emit]);const play=useCallback(n=>{if(muted)return;if(n.read)return;if(n.priority==="low")return;const k=kinds.get(n.kind);if((n.sound??k.sound)==="none")return;schedule(NOTIFY_CHIME,n.priority==="critical"?Math.min(1,VOLUME*CRITICAL_BOOST):VOLUME)},[kinds,muted,schedule]);const preview=useCallback(()=>{nextSlot.current=0;emit(NOTIFY_CHIME,VOLUME)},[emit]);return{ready,muted,setMuted,unlock,play,preview}}import{useCallback as useCallback2,useEffect as useEffect2,useMemo,useRef as useRef2,useState as useState2}from"react";var genId=(()=>{let n=0;return()=>`local_${++n}_${Math.round(performance.now())}`})();function mergeNotifications(prev,incoming,options={}){const{scope="add",removed}=options;const byId=new Map(prev.map(n=>[n.id,n]));for(const n of incoming){const old=byId.get(n.id);byId.set(n.id,old?{...n,...latestRead(old,n)}:n)}let out=[...byId.values()];if(scope==="sync"&&incoming.length>0){const seen=new Set(incoming.map(n=>n.id));const times=incoming.map(n=>n.at.getTime());const newest=Math.max(...times);const oldest=Math.min(...times);out=out.filter(n=>{const t=n.at.getTime();const inRange=t<=newest&&t>=oldest;return!inRange||seen.has(n.id)})}if(removed?.size){const now=Date.now();out=out.filter(n=>{const until=removed.get(n.id);return until===void 0||until<=now})}return out.sort(byNewest)}function latestRead(a,b){const t=n=>n.readAt?n.readAt.getTime():-1;const readAt=t(a)>=t(b)?a.readAt:b.readAt;return{readAt,read:readAt!==null}}var byNewest=(a,b)=>b.at.getTime()-a.at.getTime();var isBulkReadable=n=>!n.read&&n.priority!=="critical";function collapseByGroup(items){const out=[];for(const n of items){if(!n.group){out.push(n);continue}const i=out.findIndex(x=>x.group===n.group);if(i===-1)out.push(n);else out[i]=n}return out}var TOMBSTONE_MS=6e4;var MAX_ARRIVALS=3;var ARRIVAL_MS=5e3;var ARRIVAL_WITH_ACTION_MS=7e3;function useNotifications({kinds,initial,onReceive,onReject}={}){const[items,setItems]=useState2(()=>initial===void 0?[]:parseNotifications(initial,{kinds}).items);const[arrivals,setArrivals]=useState2([]);const[rejected,setRejected]=useState2([]);const timers=useRef2(new Map);const[removed,setRemoved]=useState2(()=>new Map);const removedRef=useRef2(removed);const kindsRef=useRef2(kinds);useEffect2(()=>{removedRef.current=removed},[removed]);useEffect2(()=>{kindsRef.current=kinds},[kinds]);const cb=useRef2({onReceive,onReject});useEffect2(()=>{cb.current={onReceive,onReject}});useEffect2(()=>{const t=timers.current;return()=>{t.forEach(clearTimeout);t.clear()}},[]);const clearArrival=useCallback2(id=>{const t=timers.current.get(id);if(t)clearTimeout(t);timers.current.delete(id);setArrivals(prev=>prev.filter(x=>x.id!==id))},[]);const clearAllArrivals=useCallback2(()=>{timers.current.forEach(clearTimeout);timers.current.clear();setArrivals([])},[]);const report=useCallback2(batch=>{setRejected(batch.rejected);if(batch.rejected.length>0)cb.current.onReject?.(batch.rejected);return batch},[]);const load=useCallback2((raw,scope)=>{const batch=parseNotifications(raw,{kinds:kindsRef.current});setItems(prev=>mergeNotifications(prev,batch.items,{scope,removed:removedRef.current}));return report(batch)},[report]);const hydrate=useCallback2(raw=>load(raw,"add"),[load]);const sync=useCallback2(raw=>load(raw,"sync"),[load]);const receive=useCallback2(raw=>{const batch=parseNotifications(raw,{kinds:kindsRef.current});if(batch.items.length===0)return report(batch);setItems(prev=>mergeNotifications(prev,batch.items,{removed:removedRef.current}));const fresh=batch.items.filter(n=>!n.read);if(fresh.length>0){setArrivals(prev=>collapseByGroup([...prev,...fresh]).slice(-MAX_ARRIVALS));for(const n of fresh){cb.current.onReceive?.(n);const life=n.action?ARRIVAL_WITH_ACTION_MS:ARRIVAL_MS;timers.current.set(n.id,setTimeout(()=>clearArrival(n.id),life))}}return report(batch)},[clearArrival,report]);const push=useCallback2(input=>{const json={v:NOTIFICATION_SCHEMA_VERSION,id:input.id??genId(),at:input.at??new Date().toISOString(),...input};const r=parseNotification(json,{kinds:kindsRef.current});if(!r.ok){cb.current.onReject?.([{raw:json,issues:r.issues}]);return null}receive([json]);return r.value.id},[receive]);const markRead=useCallback2(id=>{const readAt=new Date;setItems(prev=>prev.map(n=>n.id===id?{...n,readAt,read:true}:n))},[]);const markAllRead=useCallback2(()=>{const readAt=new Date;setItems(prev=>prev.map(n=>isBulkReadable(n)?{...n,readAt,read:true}:n))},[]);const dismiss=useCallback2(id=>{setRemoved(prev=>new Map(prev).set(id,Date.now()+TOMBSTONE_MS));setItems(prev=>prev.filter(n=>n.id!==id));clearArrival(id)},[clearArrival]);const markUnread=useCallback2(ids=>{const set=new Set(ids);setItems(prev=>prev.map(n=>set.has(n.id)?{...n,readAt:null,read:false}:n))},[]);const dropTombstone=useCallback2(id=>{setRemoved(prev=>{if(!prev.has(id))return prev;const next=new Map(prev);next.delete(id);return next})},[]);const restore=useCallback2(n=>{dropTombstone(n.id);setItems(prev=>mergeNotifications(prev,[n]))},[dropTombstone]);const confirmDismiss=dropTombstone;const unread=useMemo(()=>items.reduce((n,x)=>x.read?n:n+1,0),[items]);const needsAction=useMemo(()=>items.reduce((n,x)=>!x.read&&x.priority==="critical"?n+1:n,0),[items]);return{items,unread,needsAction,arrivals,rejected,hydrate,sync,receive,push,markRead,markAllRead,markUnread,restore,confirmDismiss,dismiss,clearArrival,clearAllArrivals}}import{useCallback as useCallback3,useEffect as useEffect3,useRef as useRef3}from"react";function optimistic(run,undo,onError){if(!run)return;const fail=e=>{undo();onError?.(e)};try{const r=run();if(r&&typeof r.then==="function"){void r.catch(fail)}}catch(e){fail(e)}}function useNotificationCenter({kinds,onReceive,onRead,onReadAll,onDismiss,onOpen,onSyncError,...rest}){const sound=useNotificationSound({kinds});const handleReceive=useCallback3(n=>{sound.play(n);onReceive?.(n)},[onReceive,sound]);const state=useNotifications({...rest,kinds,onReceive:handleReceive});const cb=useRef3({onRead,onReadAll,onDismiss,onOpen,onSyncError});useEffect3(()=>{cb.current={onRead,onReadAll,onDismiss,onOpen,onSyncError}});const markRead=useCallback3(id=>{const n=state.items.find(x=>x.id===id);if(!n||n.read)return;state.markRead(id);optimistic(cb.current.onRead&&(()=>cb.current.onRead({...n,read:true})),()=>state.markUnread([id]),e=>cb.current.onSyncError?.(e,{action:"read",items:[n]}))},[state]);const markAllRead=useCallback3(()=>{const unreadItems=state.items.filter(n=>!n.read);const ids=unreadItems.map(n=>n.id);if(ids.length===0)return;state.markAllRead();optimistic(cb.current.onReadAll&&(()=>cb.current.onReadAll(ids)),()=>state.markUnread(ids),e=>cb.current.onSyncError?.(e,{action:"readAll",items:unreadItems}))},[state]);const dismiss=useCallback3(id=>{const n=state.items.find(x=>x.id===id);if(!n)return;state.dismiss(id);optimistic(cb.current.onDismiss?async()=>{await cb.current.onDismiss(n);state.confirmDismiss(n.id)}:()=>state.confirmDismiss(n.id),()=>state.restore(n),e=>cb.current.onSyncError?.(e,{action:"dismiss",items:[n]}))},[state]);const open=useCallback3(n=>{markRead(n.id);cb.current.onOpen?.(n)},[markRead]);return{...state,markRead,markAllRead,dismiss,sound,kinds,bind:{provider:{kinds,onAction:open},surface:{items:state.items,unread:state.unread,needsAction:state.needsAction,sound,onMarkAllRead:markAllRead,onDismiss:dismiss,onOpen:open}}}}var DIVISIONS=[{limit:6e4,unit:"second",ms:1e3},{limit:36e5,unit:"minute",ms:6e4},{limit:864e5,unit:"hour",ms:36e5},{limit:6048e5,unit:"day",ms:864e5},{limit:26298e5,unit:"week",ms:6048e5},{limit:315576e5,unit:"month",ms:26298e5},{limit:Infinity,unit:"year",ms:315576e5}];function formatRelativeTime(at,locale="ar",now=new Date){const diff=at.getTime()-now.getTime();const abs=Math.abs(diff);const rtf=new Intl.RelativeTimeFormat(locale,{numeric:"auto"});if(abs<3e4)return rtf.format(0,"second");const d=DIVISIONS.find(x=>abs<x.limit)??DIVISIONS[DIVISIONS.length-1];return rtf.format(Math.round(diff/d.ms),d.unit)}function relativeTickMs(at,now=new Date){const abs=Math.abs(at.getTime()-now.getTime());if(abs<6e4)return 15e3;if(abs<36e5)return 6e4;if(abs<864e5)return 3e5;return 36e5}import{createContext,useContext,useEffect as useEffect4,useId,useMemo as useMemo2,useRef as useRef4,useState as useState3}from"react";import{Bell as Bell2,BellOff,CheckCheck,X}from"lucide-react";import{jsx,jsxs}from"react/jsx-runtime";var Ctx=createContext({kinds:QUMRA_NOTIFICATIONS,locale:"ar"});function NotificationProvider({kinds=QUMRA_NOTIFICATIONS,locale="ar",t,onAction,children}){const value=useMemo2(()=>({kinds,locale,t,onAction}),[kinds,locale,t,onAction]);return jsx(Ctx.Provider,{value,children})}var useNotificationContext=()=>useContext(Ctx);function useText(n){const{kinds,t}=useNotificationContext();const k=kinds.get(n.kind);return{kind:k,title:t&&k.title?k.title(n,t):n.title,body:t&&k.body?k.body(n,t):n.body}}function RelativeTime({at}){const{locale}=useNotificationContext();const[tick,setTick]=useState3(0);useEffect4(()=>{const id=setTimeout(()=>setTick(n=>n+1),tick===0?0:relativeTickMs(at));return()=>clearTimeout(id)});return jsx("time",{dateTime:at.toISOString(),title:at.toLocaleString(locale),className:"text-micro text-muted2",children:tick===0?at.toLocaleDateString(locale):formatRelativeTime(at,locale)})}function NotificationBell({unread,needsAction=0,onClick,expanded,label,unreadLabel=n=>`${n} \u063A\u064A\u0631 \u0645\u0642\u0631\u0648\u0621\u0629`,className}){const ui=useUIText();return jsxs("button",{type:"button",onClick,title:label??ui.notifications,"aria-label":unread>0?`${label??ui.notifications} \u2014 ${unreadLabel(unread)}${needsAction>0?`\u060C ${needsAction} \u0645\u062D\u062A\u0627\u062C\u064A\u0646 \u0625\u062C\u0631\u0627\u0621`:""}`:label,"aria-haspopup":"dialog","aria-expanded":expanded,className:cn("relative size-9 rounded-[10px] flex items-center justify-center cursor-pointer text-ink2","transition-colors duration-150 hover:bg-hover",expanded&&"bg-hover",className),children:[jsx(Bell2,{size:19,strokeWidth:2,"aria-hidden":"true"}),unread>0&&jsx("span",{"aria-hidden":"true",className:cn("absolute -top-0.5 -end-0.5 rounded-full ring-2 ring-surface",needsAction>0&&"outline outline-2 outline-offset-1 outline-danger/35"),children:jsx(Counter,{value:unread})})]})}function NotificationRow({item,onOpen,onDismiss,dismissLabel,unreadLabel}){const ui=useUIText();const{onAction}=useNotificationContext();const{kind:k,title,body}=useText(item);const Icon=k.icon;return jsxs("div",{className:cn("group/row flex items-start gap-3 px-4 py-3.5 border-b border-line last:border-0 transition-colors",!item.read&&"bg-bg"),children:[jsx("span",{"aria-hidden":"true",className:cn("size-8.5 rounded-sm flex items-center justify-center shrink-0 mt-0.5",TONE_SOFT[k.tone]),children:jsx(Icon,{size:16,strokeWidth:2})}),jsxs("span",{className:"flex-1 min-w-0 flex flex-col gap-1",children:[jsxs("span",{className:"flex items-center gap-2",children:[!item.read&&jsx("span",{"aria-label":unreadLabel??ui.unread,className:"size-1.5 rounded-full bg-brand shrink-0"}),jsx("span",{className:cn("text-ui",item.read?"font-bold text-ink2":"font-extrabold text-ink"),children:title??ui.notifications})]}),body&&jsx("span",{className:"text-caption leading-[1.7] text-muted [text-wrap:pretty]",children:body}),jsxs("span",{className:"flex items-center gap-2.5 flex-wrap",children:[jsx(RelativeTime,{at:item.at}),item.action&&jsx("button",{type:"button",onClick:()=>{onAction?.(item);onOpen?.(item)},className:"text-micro font-extrabold text-brand cursor-pointer hover:text-brand-hover transition-colors",children:item.action.label})]})]}),onDismiss&&jsx("button",{type:"button",onClick:()=>onDismiss(item.id),"aria-label":dismissLabel??ui.dismiss,className:cn("shrink-0 size-7 rounded-sm flex items-center justify-center text-muted2 cursor-pointer","opacity-0 group-hover/row:opacity-100 focus-visible:opacity-100","hover:bg-hover hover:text-ink transition-colors"),children:jsx(X,{size:14,"aria-hidden":"true"})})]})}function NotificationList({items,onOpen,onDismiss,emptyTitle,emptyDescription,className}){const ui=useUIText();if(items.length===0){return jsx(EmptyState,{icon:BellOff,title:emptyTitle??ui.noNotifications,description:emptyDescription??ui.noNotificationsDesc})}return jsx("div",{className:cn("flex flex-col",className),children:items.map(n=>jsx(NotificationRow,{item:n,onOpen,onDismiss},n.id))})}function NotificationPanel({items,title,unread=0,needsAction=0,onMarkAllRead,markAllLabel,onViewAll,viewAllLabel,sound,onOpen,onDismiss,emptyTitle,emptyDescription,className}){const ui=useUIText();return jsxs("div",{className:cn("w-[22rem] max-w-[calc(100vw-2rem)] bg-surface border border-line rounded-lg shadow-pop","overflow-clip flex flex-col animate-qfade",className),children:[jsxs("div",{className:"shrink-0 flex items-center justify-between gap-2.5 px-4 py-3.5 border-b border-line",children:[jsxs("span",{className:"flex items-center gap-2 min-w-0",children:[jsx("span",{className:"text-lead font-extrabold truncate",children:title??ui.notifications}),unread>0&&jsx(Counter,{value:unread})]}),jsxs("span",{className:"shrink-0 flex items-center gap-2.5",children:[sound&&jsx(SoundToggle,{...sound}),onMarkAllRead&&unread>0&&jsxs("button",{type:"button",onClick:onMarkAllRead,className:"inline-flex items-center gap-1.5 text-micro font-bold text-brand cursor-pointer hover:text-brand-hover transition-colors",children:[jsx(CheckCheck,{size:13,"aria-hidden":"true"}),markAllLabel??ui.markAllRead]})]})]}),needsAction>0&&jsxs("p",{className:"shrink-0 m-0 px-4 py-2.5 bg-amber-bg border-b border-amber-line text-caption leading-[1.6] text-amber-ink",children:[jsx("span",{"data-num":true,className:"font-extrabold",children:needsAction})," ","\u0645\u062D\u062A\u0627\u062C\u064A\u0646 \u0625\u062C\u0631\u0627\u0621 \u2014 \u0628\u064A\u0641\u0636\u0644\u0648\u0627 \u0644\u062D\u062F \u0645\u0627 \u062A\u062A\u0639\u0627\u0645\u0644 \u0645\u0639\u0627\u0647\u0645\u060C \u0648\xAB\u062A\u0639\u0644\u064A\u0645 \u0627\u0644\u0643\u0644\xBB \u0645\u0627\u0628\u064A\u0645\u0633\u062D\u0647\u0645\u0634."]}),jsx("div",{className:"flex-1 min-h-0 max-h-[21rem] overflow-y-auto overscroll-contain",children:jsx(NotificationList,{items,onOpen,onDismiss,emptyTitle:emptyTitle??ui.noNotifications,emptyDescription:emptyDescription??ui.noNotificationsDesc})}),onViewAll&&items.length>0&&jsx("button",{type:"button",onClick:onViewAll,className:"shrink-0 w-full p-3 border-t border-line text-ui font-bold text-brand cursor-pointer hover:bg-hover transition-colors",children:viewAllLabel??ui.viewAllNotifications})]})}function SoundToggle({muted,setMuted,ready,className}){const ui=useUIText();const blocked=!muted&&!ready;const label=muted?"\u0634\u063A\u0651\u0644 \u0635\u0648\u062A \u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062A":blocked?"\u0627\u0644\u0635\u0648\u062A \u0645\u0633\u062A\u0646\u064A \u0623\u0648\u0644 \u062A\u0641\u0627\u0639\u0644 \u0645\u0639 \u0627\u0644\u0635\u0641\u062D\u0629":"\u0627\u0643\u062A\u0645 \u0635\u0648\u062A \u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062A";return jsx("button",{type:"button",onClick:()=>setMuted(!muted),title:label??ui.notifications,"aria-label":label??ui.notifications,"aria-pressed":muted,className:cn("size-7 rounded-sm flex items-center justify-center cursor-pointer transition-colors",blocked?"text-amber-ink":"text-muted2 hover:text-ink hover:bg-hover",className),children:muted||blocked?jsx(BellOff,{size:14,"aria-hidden":"true"}):jsx(Bell2,{size:14,"aria-hidden":"true"})})}var MENU_ALIGN={start:"start-0",end:"end-0"};var MENU_SIDE={bottom:"top-full mt-2",top:"bottom-full mb-2"};function NotificationMenu({unread,bellLabel,align="end",side="bottom",className,onViewAll,onOpen,...panel}){const[open,setOpen]=useState3(false);const wrap=useRef4(null);const id=useId();useEffect4(()=>{if(!open)return;function onKey(e){if(e.key==="Escape")setOpen(false)}function onDown(e){if(!wrap.current?.contains(e.target))setOpen(false)}document.addEventListener("keydown",onKey);document.addEventListener("mousedown",onDown);return()=>{document.removeEventListener("keydown",onKey);document.removeEventListener("mousedown",onDown)}},[open]);return jsxs("div",{ref:wrap,className:cn("relative",className),children:[jsx(NotificationBell,{unread,needsAction:panel.needsAction,expanded:open,label:bellLabel,onClick:()=>setOpen(o=>!o)}),open&&jsx("div",{role:"dialog","aria-label":bellLabel??"\u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062A",id,className:cn("absolute z-50",MENU_ALIGN[align],MENU_SIDE[side]),children:jsx(NotificationPanel,{...panel,unread,onOpen:n=>{setOpen(false);onOpen?.(n)},onViewAll:onViewAll&&(()=>{setOpen(false);onViewAll()})})})]})}function NotificationDrawer({open,onClose,items,title,unread=0,needsAction=0,onMarkAllRead,markAllLabel,closeLabel,onOpen,onDismiss,emptyTitle,emptyDescription}){const ui=useUIText();return jsxs(Drawer,{open,onClose,closeLabel:closeLabel??ui.close,title:jsxs("span",{className:"flex items-center gap-2",children:[title??ui.notifications,unread>0&&jsx(Counter,{value:unread})]}),bodyClassName:"p-0",footer:onMarkAllRead&&unread>0?jsxs("button",{type:"button",onClick:onMarkAllRead,className:"inline-flex items-center gap-1.5 text-ui font-bold text-brand cursor-pointer hover:text-brand-hover transition-colors",children:[jsx(CheckCheck,{size:15,"aria-hidden":"true"}),markAllLabel??ui.markAllRead]}):void 0,children:[needsAction>0&&jsxs("p",{className:"m-0 px-4 py-2.5 bg-amber-bg border-b border-amber-line text-caption leading-[1.6] text-amber-ink",children:[jsx("span",{"data-num":true,className:"font-extrabold",children:needsAction})," ","\u0645\u062D\u062A\u0627\u062C\u064A\u0646 \u0625\u062C\u0631\u0627\u0621 \u2014 \u0628\u064A\u0641\u0636\u0644\u0648\u0627 \u0644\u062D\u062F \u0645\u0627 \u062A\u062A\u0639\u0627\u0645\u0644 \u0645\u0639\u0627\u0647\u0645\u060C \u0648\xAB\u062A\u0639\u0644\u064A\u0645 \u0627\u0644\u0643\u0644\xBB \u0645\u0627\u0628\u064A\u0645\u0633\u062D\u0647\u0645\u0634."]}),jsx(NotificationList,{items,onOpen:n=>{onClose();onOpen?.(n)},onDismiss,emptyTitle:emptyTitle??ui.noNotifications,emptyDescription:emptyDescription??ui.noNotificationsDesc})]})}var PLACEMENT={"top-start":"top-4 sm:start-5","top-end":"top-4 sm:end-5","bottom-start":"bottom-4 sm:start-5","bottom-end":"bottom-4 sm:end-5"};var PLACEMENT_ANIM={"top-start":"animate-qfade","top-end":"animate-qfade","bottom-start":"animate-tip","bottom-end":"animate-tip"};function NotificationToastHost({items,onClose,onOpen,placement="top-end",width="sm:w-[22rem]",closeLabel,regionLabel,className}){const ui=useUIText();if(items.length===0)return null;return jsx("div",{role:"region","aria-label":regionLabel??ui.newNotifications,"aria-live":"polite",className:cn("fixed z-[60] inset-x-4 sm:inset-x-auto flex flex-col gap-2 pointer-events-none",PLACEMENT[placement],width,className),children:items.map(n=>jsx(ToastCard,{n,placement,closeLabel:closeLabel??ui.close,onClose,onOpen},n.id))})}function ToastCard({n,placement,closeLabel,onClose,onOpen}){const ui=useUIText();const{onAction}=useNotificationContext();const{kind:k,title,body}=useText(n);const Icon=k.icon;return jsxs("div",{className:cn("pointer-events-auto flex items-start gap-3 p-3.5 rounded-card","bg-surface border border-line shadow-panel",PLACEMENT_ANIM[placement]),children:[jsx("span",{"aria-hidden":"true",className:cn("size-8.5 rounded-sm flex items-center justify-center shrink-0",TONE_SOFT[k.tone]),children:jsx(Icon,{size:16,strokeWidth:2})}),jsxs("span",{className:"flex-1 min-w-0 flex flex-col gap-1",children:[jsx("span",{className:"text-ui font-extrabold text-ink",children:title??ui.notifications}),body&&jsx("span",{className:"text-caption leading-[1.65] text-muted [text-wrap:pretty] line-clamp-2",children:body}),n.action&&jsx("button",{type:"button",onClick:()=>{onAction?.(n);onOpen?.(n);onClose(n.id)},className:"w-fit text-micro font-extrabold text-brand cursor-pointer hover:text-brand-hover transition-colors",children:n.action.label})]}),jsx("button",{type:"button",onClick:()=>onClose(n.id),"aria-label":closeLabel??ui.close,className:"shrink-0 size-7 rounded-sm flex items-center justify-center text-muted2 hover:bg-hover hover:text-ink cursor-pointer transition-colors",children:jsx(X,{size:14,"aria-hidden":"true"})})]})}export{NOTIFICATION_PRIORITIES,NOTIFICATION_SCHEMA_VERSION,NOTIFICATION_SOUNDS,NotificationBell,NotificationDrawer,NotificationList,NotificationMenu,NotificationPanel,NotificationProvider,NotificationRow,NotificationToastHost,QUMRA_KINDS,QUMRA_NOTIFICATIONS,SoundToggle,createKindRegistry,formatRelativeTime,isBulkReadable,optimistic,parseNotification,parseNotifications,relativeTickMs,serializeNotification,useNotificationCenter,useNotificationContext,useNotificationSound,useNotifications};
|
|
2
|
+
import{Counter}from"./chunk-GMIBQMMR.js";import{Drawer,EmptyState,TONE_SOFT,cn,useUIText}from"./chunk-ZE4S6DBP.js";var NOTIFICATION_SCHEMA_VERSION=1;var NOTIFICATION_PRIORITIES=["low","normal","critical"];var isObject=v=>typeof v==="object"&&v!==null&&!Array.isArray(v);var isNonEmptyString=v=>typeof v==="string"&&v.trim().length>0;function parseNotification(raw,options={}){const issues=[];const warnings=[];if(!isObject(raw))return{ok:false,issues:["\u0627\u0644\u0631\u0633\u0627\u0644\u0629 \u0645\u0634 \u0643\u0627\u0626\u0646"]};if(!isNonEmptyString(raw.id))issues.push("`id` \u0646\u0627\u0642\u0635 \u0623\u0648 \u0645\u0634 \u0646\u0635");if(!isNonEmptyString(raw.kind))issues.push("`kind` \u0646\u0627\u0642\u0635 \u0623\u0648 \u0645\u0634 \u0646\u0635");if(!isNonEmptyString(raw.title))issues.push("`title` \u0646\u0627\u0642\u0635 \u0623\u0648 \u0645\u0634 \u0646\u0635");let at=null;if(!isNonEmptyString(raw.at)){issues.push("`at` \u0646\u0627\u0642\u0635 \u0623\u0648 \u0645\u0634 \u0646\u0635")}else{const d=new Date(raw.at);if(Number.isNaN(d.getTime()))issues.push(`\`at\` \u0645\u0634 \u062A\u0627\u0631\u064A\u062E \u0645\u0642\u0631\u0648\u0621: ${raw.at}`);else at=d}const v=typeof raw.v==="number"&&Number.isFinite(raw.v)?raw.v:NOTIFICATION_SCHEMA_VERSION;if(v>NOTIFICATION_SCHEMA_VERSION){warnings.push(`\u0625\u0635\u062F\u0627\u0631 \u0623\u062D\u062F\u062B (${v}) \u2014 \u0627\u0644\u062D\u0642\u0648\u0644 \u0627\u0644\u0645\u0639\u0631\u0648\u0641\u0629 \u0627\u062A\u0642\u0631\u062A \u0648\u0627\u0644\u0628\u0627\u0642\u064A \u0627\u062A\u062C\u0627\u0647\u0644`)}let priority=(isNonEmptyString(raw.kind)?options.kinds?.get(raw.kind).priority:void 0)??"normal";if(raw.priority!==void 0){if(NOTIFICATION_PRIORITIES.includes(raw.priority)){priority=raw.priority}else if(raw.priority==="high"){warnings.push("`priority: high` \u0627\u062A\u0634\u0627\u0644\u062A \u2014 \u0627\u062A\u0642\u0631\u062A normal")}else{warnings.push(`\`priority\` \u0645\u0634 \u0645\u0639\u0631\u0648\u0641\u0629: ${String(raw.priority)} \u2014 \u0627\u062A\u062D\u0637\u0651\u062A normal`)}}let readAt=null;if(isNonEmptyString(raw.readAt)){const d=new Date(raw.readAt);if(Number.isNaN(d.getTime())){warnings.push(`\`readAt\` \u0645\u0634 \u062A\u0627\u0631\u064A\u062E \u0645\u0642\u0631\u0648\u0621: ${raw.readAt} \u2014 \u0627\u062A\u0642\u0631\u064A \u0645\u0642\u0631\u0648\u0621`);readAt=at??new Date}else{readAt=d}}else if(raw.read===true){warnings.push("`read` \u0645\u0647\u062C\u0648\u0631\u0629 \u2014 \u0627\u0633\u062A\u062E\u062F\u0645 `readAt`");readAt=at??new Date}let action;if(raw.action!==void 0){if(isObject(raw.action)&&isNonEmptyString(raw.action.label)&&isNonEmptyString(raw.action.href)){action={label:raw.action.label,href:raw.action.href}}else{warnings.push("`action` \u0646\u0627\u0642\u0635\u0647 `label` \u0623\u0648 `href` \u2014 \u0627\u062A\u0634\u0627\u0644")}}if(issues.length>0)return{ok:false,issues};return{ok:true,warnings,value:{v,id:raw.id,kind:raw.kind,at,title:raw.title,body:isNonEmptyString(raw.body)?raw.body:void 0,readAt,read:readAt!==null,priority,group:isNonEmptyString(raw.group)?raw.group:void 0,data:isObject(raw.data)?raw.data:{},action,sound:raw.sound==="none"?"none":void 0}}}function parseNotifications(raw,options={}){const rejected=[];const warnings=[];let list=raw;if(typeof raw==="string"){try{list=JSON.parse(raw)}catch{return{items:[],rejected:[{raw,issues:["\u0646\u0635 \u0645\u0634 JSON \u0635\u0627\u0644\u062D"]}],warnings}}}if(isObject(list)){const inner=list.items??list.notifications??list.data;if(Array.isArray(inner))list=inner}if(!Array.isArray(list)){return{items:[],rejected:[{raw,issues:["\u0627\u0644\u0645\u062A\u0648\u0642\u0651\u0639 \u0645\u0635\u0641\u0648\u0641\u0629 \u0631\u0633\u0627\u064A\u0644"]}],warnings}}const byId=new Map;for(const entry of list){const r=parseNotification(entry,options);if(!r.ok){rejected.push({raw:entry,issues:r.issues});continue}warnings.push(...r.warnings.map(w=>`${r.value.id}: ${w}`));byId.set(r.value.id,r.value)}const items=[...byId.values()].sort((a,b)=>b.at.getTime()-a.at.getTime());return{items,rejected,warnings}}function serializeNotification(n){return{v:n.v,id:n.id,kind:n.kind,at:n.at.toISOString(),title:n.title,...n.body!==void 0&&{body:n.body},readAt:n.readAt===null?null:n.readAt.toISOString(),priority:n.priority,...n.group!==void 0&&{group:n.group},...Object.keys(n.data).length>0&&{data:n.data},...n.action!==void 0&&{action:n.action},...n.sound!==void 0&&{sound:n.sound}}}import{AlertTriangle,Bell,CreditCard,Globe,MessageSquare,Megaphone,PackageX,RotateCcw,ShoppingBag,Star,Truck,Users,Wallet}from"lucide-react";var FALLBACK={label:"\u0625\u0634\u0639\u0627\u0631",icon:Bell,tone:"neutral",priority:"normal",sound:"notify"};function createKindRegistry(kinds,fallback){const base={...FALLBACK,...fallback};const map=new Map(kinds.map(k=>[k.kind,{...base,...strip(k),unknown:false}]));return{has:kind=>map.has(kind),get:kind=>map.get(kind)??{...base,kind,unknown:true},list:()=>[...map.values()]}}function strip(k){return Object.fromEntries(Object.entries(k).filter(([,v])=>v!==void 0))}var QUMRA_KINDS=[{kind:"payment.failed",label:"\u0641\u0634\u0644 \u062A\u062D\u0635\u064A\u0644",icon:CreditCard,tone:"red",priority:"critical",sound:"notify"},{kind:"stock.depleted",label:"\u0646\u0641\u0627\u062F \u0645\u062E\u0632\u0648\u0646",icon:PackageX,tone:"amber",priority:"critical",sound:"notify"},{kind:"order.stalled",label:"\u0637\u0644\u0628 \u0645\u062A\u0639\u062B\u0651\u0631",icon:Truck,tone:"amber",priority:"critical",sound:"notify"},{kind:"order.returned",label:"\u0645\u0631\u062A\u062C\u0639",icon:RotateCcw,tone:"amber",priority:"normal",sound:"notify"},{kind:"order.created",label:"\u0637\u0644\u0628 \u062C\u062F\u064A\u062F",icon:ShoppingBag,priority:"normal",sound:"notify",title:(n,t)=>t("notif.order.created",{id:n.data.orderId})},{kind:"payout.sent",label:"\u062A\u062D\u0648\u064A\u0644 \u0623\u0631\u0628\u0627\u062D",icon:Wallet,priority:"normal",sound:"notify",title:(n,t)=>t("notif.payout.sent",{amount:n.data.amount})},{kind:"review.created",label:"\u062A\u0642\u064A\u064A\u0645 \u062C\u062F\u064A\u062F",icon:Star,priority:"normal",sound:"notify"},{kind:"shipment.updated",label:"\u062A\u062D\u062F\u064A\u062B \u0634\u062D\u0646\u0629",icon:Truck,priority:"normal",sound:"notify"},{kind:"customer.message",label:"\u0631\u0633\u0627\u0644\u0629 \u0639\u0645\u064A\u0644",icon:MessageSquare,priority:"normal",sound:"notify"},{kind:"domain.issue",label:"\u0625\u0639\u062F\u0627\u062F \u0646\u0637\u0627\u0642",icon:Globe,priority:"normal",sound:"notify"},{kind:"app.updated",label:"\u062A\u062D\u062F\u064A\u062B \u062A\u0637\u0628\u064A\u0642",icon:Megaphone,priority:"low",sound:"none"},{kind:"community.digest",label:"\u0645\u0644\u062E\u0651\u0635 \u0627\u0644\u0645\u062C\u062A\u0645\u0639",icon:Users,priority:"low",sound:"none"}];var QUMRA_NOTIFICATIONS=createKindRegistry(QUMRA_KINDS);import{useCallback,useEffect,useRef,useState}from"react";var NOTIFY_CHIME="data:audio/mpeg;base64,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VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTQuMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZECP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUU0LjBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7kmRAj/AAAGkAAAAIAAANIAAAAQAAAaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FNC4wVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JkQI/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTQuMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZECP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==";var NOTIFICATION_SOUNDS=["notify"];var VOLUME=.6;var CRITICAL_BOOST=1.35;var GAP_MS=600;var MAX_QUEUED=4;var MUTE_KEY="qumra-notif-sound";function useNotificationSound({kinds}){const[ready,setReady]=useState(false);const[muted,setMutedState]=useState(()=>{if(typeof window==="undefined")return false;return window.localStorage?.getItem(MUTE_KEY)==="muted"});const nextSlot=useRef(0);const timers=useRef(new Set);const pools=useRef(new Map);const cursor=useRef(0);const pool=useCallback(url=>{let p=pools.current.get(url);if(!p){if(typeof Audio==="undefined")return null;p=Array.from({length:Math.min(MAX_QUEUED+1,6)},()=>{const el=new Audio(url);el.preload="auto";return el});pools.current.set(url,p)}return p},[]);useEffect(()=>{const t=timers.current;return()=>{t.forEach(clearTimeout);t.clear()}},[]);const unlock=useCallback(async()=>{const p=pool(NOTIFY_CHIME);if(!p)return false;const results=await Promise.all(p.map(async el=>{const was=el.muted;el.muted=true;try{await el.play();el.pause();el.currentTime=0;return true}catch{return false}finally{el.muted=was}}));const ok=results.every(Boolean);if(ok)setReady(true);return ok},[pool]);useEffect(()=>{if(ready||typeof window==="undefined")return;const on=()=>void unlock();window.addEventListener("pointerdown",on,{once:true});window.addEventListener("keydown",on,{once:true});return()=>{window.removeEventListener("pointerdown",on);window.removeEventListener("keydown",on)}},[ready,unlock]);const setMuted=useCallback(m=>{setMutedState(m);if(typeof window!=="undefined"){window.localStorage?.setItem(MUTE_KEY,m?"muted":"on")}},[]);const emit=useCallback((url,vol)=>{const p=pool(url);if(!p)return;const el=p.find(x=>x.paused||x.ended)??p[cursor.current++%p.length];el.volume=Math.min(1,Math.max(0,vol));el.currentTime=0;void el.play().catch(()=>{})},[pool]);const schedule=useCallback((url,vol)=>{const now=Date.now();const at=Math.max(now,nextSlot.current);if(at-now>MAX_QUEUED*GAP_MS)return;nextSlot.current=at+GAP_MS;if(at<=now){emit(url,vol);return}const id=setTimeout(()=>{timers.current.delete(id);emit(url,vol)},at-now);timers.current.add(id)},[emit]);const play=useCallback(n=>{if(muted)return;if(n.read)return;if(n.priority==="low")return;const k=kinds.get(n.kind);if((n.sound??k.sound)==="none")return;schedule(NOTIFY_CHIME,n.priority==="critical"?Math.min(1,VOLUME*CRITICAL_BOOST):VOLUME)},[kinds,muted,schedule]);const preview=useCallback(()=>{nextSlot.current=0;emit(NOTIFY_CHIME,VOLUME)},[emit]);return{ready,muted,setMuted,unlock,play,preview}}import{useCallback as useCallback2,useEffect as useEffect2,useMemo,useRef as useRef2,useState as useState2}from"react";var genId=(()=>{let n=0;return()=>`local_${++n}_${Math.round(performance.now())}`})();function mergeNotifications(prev,incoming,options={}){const{scope="add",removed}=options;const byId=new Map(prev.map(n=>[n.id,n]));for(const n of incoming){const old=byId.get(n.id);byId.set(n.id,old?{...n,...latestRead(old,n)}:n)}let out=[...byId.values()];if(scope==="sync"&&incoming.length>0){const seen=new Set(incoming.map(n=>n.id));const times=incoming.map(n=>n.at.getTime());const newest=Math.max(...times);const oldest=Math.min(...times);out=out.filter(n=>{const t=n.at.getTime();const inRange=t<=newest&&t>=oldest;return!inRange||seen.has(n.id)})}if(removed?.size){const now=Date.now();out=out.filter(n=>{const until=removed.get(n.id);return until===void 0||until<=now})}return out.sort(byNewest)}function latestRead(a,b){const t=n=>n.readAt?n.readAt.getTime():-1;const readAt=t(a)>=t(b)?a.readAt:b.readAt;return{readAt,read:readAt!==null}}var byNewest=(a,b)=>b.at.getTime()-a.at.getTime();var isBulkReadable=n=>!n.read&&n.priority!=="critical";function collapseByGroup(items){const out=[];for(const n of items){if(!n.group){out.push(n);continue}const i=out.findIndex(x=>x.group===n.group);if(i===-1)out.push(n);else out[i]=n}return out}var TOMBSTONE_MS=6e4;var MAX_ARRIVALS=3;var ARRIVAL_MS=5e3;var ARRIVAL_WITH_ACTION_MS=7e3;function useNotifications({kinds,initial,onReceive,onReject}={}){const[items,setItems]=useState2(()=>initial===void 0?[]:parseNotifications(initial,{kinds}).items);const[arrivals,setArrivals]=useState2([]);const[rejected,setRejected]=useState2([]);const timers=useRef2(new Map);const[removed,setRemoved]=useState2(()=>new Map);const removedRef=useRef2(removed);const kindsRef=useRef2(kinds);useEffect2(()=>{removedRef.current=removed},[removed]);useEffect2(()=>{kindsRef.current=kinds},[kinds]);const cb=useRef2({onReceive,onReject});useEffect2(()=>{cb.current={onReceive,onReject}});useEffect2(()=>{const t=timers.current;return()=>{t.forEach(clearTimeout);t.clear()}},[]);const clearArrival=useCallback2(id=>{const t=timers.current.get(id);if(t)clearTimeout(t);timers.current.delete(id);setArrivals(prev=>prev.filter(x=>x.id!==id))},[]);const clearAllArrivals=useCallback2(()=>{timers.current.forEach(clearTimeout);timers.current.clear();setArrivals([])},[]);const report=useCallback2(batch=>{setRejected(batch.rejected);if(batch.rejected.length>0)cb.current.onReject?.(batch.rejected);return batch},[]);const load=useCallback2((raw,scope)=>{const batch=parseNotifications(raw,{kinds:kindsRef.current});setItems(prev=>mergeNotifications(prev,batch.items,{scope,removed:removedRef.current}));return report(batch)},[report]);const hydrate=useCallback2(raw=>load(raw,"add"),[load]);const sync=useCallback2(raw=>load(raw,"sync"),[load]);const receive=useCallback2(raw=>{const batch=parseNotifications(raw,{kinds:kindsRef.current});if(batch.items.length===0)return report(batch);setItems(prev=>mergeNotifications(prev,batch.items,{removed:removedRef.current}));const fresh=batch.items.filter(n=>!n.read);if(fresh.length>0){setArrivals(prev=>collapseByGroup([...prev,...fresh]).slice(-MAX_ARRIVALS));for(const n of fresh){cb.current.onReceive?.(n);const life=n.action?ARRIVAL_WITH_ACTION_MS:ARRIVAL_MS;timers.current.set(n.id,setTimeout(()=>clearArrival(n.id),life))}}return report(batch)},[clearArrival,report]);const push=useCallback2(input=>{const json={v:NOTIFICATION_SCHEMA_VERSION,id:input.id??genId(),at:input.at??new Date().toISOString(),...input};const r=parseNotification(json,{kinds:kindsRef.current});if(!r.ok){cb.current.onReject?.([{raw:json,issues:r.issues}]);return null}receive([json]);return r.value.id},[receive]);const markRead=useCallback2(id=>{const readAt=new Date;setItems(prev=>prev.map(n=>n.id===id?{...n,readAt,read:true}:n))},[]);const markAllRead=useCallback2(()=>{const readAt=new Date;setItems(prev=>prev.map(n=>isBulkReadable(n)?{...n,readAt,read:true}:n))},[]);const dismiss=useCallback2(id=>{setRemoved(prev=>new Map(prev).set(id,Date.now()+TOMBSTONE_MS));setItems(prev=>prev.filter(n=>n.id!==id));clearArrival(id)},[clearArrival]);const markUnread=useCallback2(ids=>{const set=new Set(ids);setItems(prev=>prev.map(n=>set.has(n.id)?{...n,readAt:null,read:false}:n))},[]);const dropTombstone=useCallback2(id=>{setRemoved(prev=>{if(!prev.has(id))return prev;const next=new Map(prev);next.delete(id);return next})},[]);const restore=useCallback2(n=>{dropTombstone(n.id);setItems(prev=>mergeNotifications(prev,[n]))},[dropTombstone]);const confirmDismiss=dropTombstone;const unread=useMemo(()=>items.reduce((n,x)=>x.read?n:n+1,0),[items]);const needsAction=useMemo(()=>items.reduce((n,x)=>!x.read&&x.priority==="critical"?n+1:n,0),[items]);return{items,unread,needsAction,arrivals,rejected,hydrate,sync,receive,push,markRead,markAllRead,markUnread,restore,confirmDismiss,dismiss,clearArrival,clearAllArrivals}}import{useCallback as useCallback3,useEffect as useEffect3,useRef as useRef3}from"react";function optimistic(run,undo,onError){if(!run)return;const fail=e=>{undo();onError?.(e)};try{const r=run();if(r&&typeof r.then==="function"){void r.catch(fail)}}catch(e){fail(e)}}function useNotificationCenter({kinds,onReceive,onRead,onReadAll,onDismiss,onOpen,onSyncError,...rest}){const sound=useNotificationSound({kinds});const handleReceive=useCallback3(n=>{sound.play(n);onReceive?.(n)},[onReceive,sound]);const state=useNotifications({...rest,kinds,onReceive:handleReceive});const cb=useRef3({onRead,onReadAll,onDismiss,onOpen,onSyncError});useEffect3(()=>{cb.current={onRead,onReadAll,onDismiss,onOpen,onSyncError}});const markRead=useCallback3(id=>{const n=state.items.find(x=>x.id===id);if(!n||n.read)return;state.markRead(id);optimistic(cb.current.onRead&&(()=>cb.current.onRead({...n,read:true})),()=>state.markUnread([id]),e=>cb.current.onSyncError?.(e,{action:"read",items:[n]}))},[state]);const markAllRead=useCallback3(()=>{const unreadItems=state.items.filter(n=>!n.read);const ids=unreadItems.map(n=>n.id);if(ids.length===0)return;state.markAllRead();optimistic(cb.current.onReadAll&&(()=>cb.current.onReadAll(ids)),()=>state.markUnread(ids),e=>cb.current.onSyncError?.(e,{action:"readAll",items:unreadItems}))},[state]);const dismiss=useCallback3(id=>{const n=state.items.find(x=>x.id===id);if(!n)return;state.dismiss(id);optimistic(cb.current.onDismiss?async()=>{await cb.current.onDismiss(n);state.confirmDismiss(n.id)}:()=>state.confirmDismiss(n.id),()=>state.restore(n),e=>cb.current.onSyncError?.(e,{action:"dismiss",items:[n]}))},[state]);const open=useCallback3(n=>{markRead(n.id);cb.current.onOpen?.(n)},[markRead]);return{...state,markRead,markAllRead,dismiss,sound,kinds,bind:{provider:{kinds,onAction:open},surface:{items:state.items,unread:state.unread,needsAction:state.needsAction,sound,onMarkAllRead:markAllRead,onDismiss:dismiss,onOpen:open}}}}var DIVISIONS=[{limit:6e4,unit:"second",ms:1e3},{limit:36e5,unit:"minute",ms:6e4},{limit:864e5,unit:"hour",ms:36e5},{limit:6048e5,unit:"day",ms:864e5},{limit:26298e5,unit:"week",ms:6048e5},{limit:315576e5,unit:"month",ms:26298e5},{limit:Infinity,unit:"year",ms:315576e5}];function formatRelativeTime(at,locale="ar",now=new Date){const diff=at.getTime()-now.getTime();const abs=Math.abs(diff);const rtf=new Intl.RelativeTimeFormat(locale,{numeric:"auto"});if(abs<3e4)return rtf.format(0,"second");const d=DIVISIONS.find(x=>abs<x.limit)??DIVISIONS[DIVISIONS.length-1];return rtf.format(Math.round(diff/d.ms),d.unit)}function relativeTickMs(at,now=new Date){const abs=Math.abs(at.getTime()-now.getTime());if(abs<6e4)return 15e3;if(abs<36e5)return 6e4;if(abs<864e5)return 3e5;return 36e5}import{createContext,useContext,useEffect as useEffect4,useId,useMemo as useMemo2,useRef as useRef4,useState as useState3}from"react";import{Bell as Bell2,BellOff,CheckCheck,X}from"lucide-react";import{jsx,jsxs}from"react/jsx-runtime";var Ctx=createContext({kinds:QUMRA_NOTIFICATIONS,locale:"ar"});function NotificationProvider({kinds=QUMRA_NOTIFICATIONS,locale="ar",t,onAction,children}){const value=useMemo2(()=>({kinds,locale,t,onAction}),[kinds,locale,t,onAction]);return jsx(Ctx.Provider,{value,children})}var useNotificationContext=()=>useContext(Ctx);function useText(n){const{kinds,t}=useNotificationContext();const k=kinds.get(n.kind);return{kind:k,title:t&&k.title?k.title(n,t):n.title,body:t&&k.body?k.body(n,t):n.body}}function RelativeTime({at}){const{locale}=useNotificationContext();const[tick,setTick]=useState3(0);useEffect4(()=>{const id=setTimeout(()=>setTick(n=>n+1),tick===0?0:relativeTickMs(at));return()=>clearTimeout(id)});return jsx("time",{dateTime:at.toISOString(),title:at.toLocaleString(locale),className:"text-micro text-muted2",children:tick===0?at.toLocaleDateString(locale):formatRelativeTime(at,locale)})}function NotificationBell({unread,needsAction=0,onClick,expanded,label,unreadLabel=n=>`${n} \u063A\u064A\u0631 \u0645\u0642\u0631\u0648\u0621\u0629`,className}){const ui=useUIText();return jsxs("button",{type:"button",onClick,title:label??ui.notifications,"aria-label":unread>0?`${label??ui.notifications} \u2014 ${unreadLabel(unread)}${needsAction>0?`\u060C ${needsAction} \u0645\u062D\u062A\u0627\u062C\u064A\u0646 \u0625\u062C\u0631\u0627\u0621`:""}`:label,"aria-haspopup":"dialog","aria-expanded":expanded,className:cn("relative size-9 rounded-[10px] flex items-center justify-center cursor-pointer text-ink2","transition-colors duration-150 hover:bg-hover",expanded&&"bg-hover",className),children:[jsx(Bell2,{size:19,strokeWidth:2,"aria-hidden":"true"}),unread>0&&jsx("span",{"aria-hidden":"true",className:cn("absolute -top-0.5 -end-0.5 rounded-full ring-2 ring-surface",needsAction>0&&"outline outline-2 outline-offset-1 outline-danger/35"),children:jsx(Counter,{value:unread})})]})}function NotificationRow({item,onOpen,onDismiss,dismissLabel,unreadLabel}){const ui=useUIText();const{onAction}=useNotificationContext();const{kind:k,title,body}=useText(item);const Icon=k.icon;return jsxs("div",{className:cn("group/row flex items-start gap-3 px-4 py-3.5 border-b border-line last:border-0 transition-colors",!item.read&&"bg-bg"),children:[jsx("span",{"aria-hidden":"true",className:cn("size-8.5 rounded-sm flex items-center justify-center shrink-0 mt-0.5",TONE_SOFT[k.tone]),children:jsx(Icon,{size:16,strokeWidth:2})}),jsxs("span",{className:"flex-1 min-w-0 flex flex-col gap-1",children:[jsxs("span",{className:"flex items-center gap-2",children:[!item.read&&jsx("span",{"aria-label":unreadLabel??ui.unread,className:"size-1.5 rounded-full bg-brand shrink-0"}),jsx("span",{className:cn("text-ui",item.read?"font-bold text-ink2":"font-extrabold text-ink"),children:title??ui.notifications})]}),body&&jsx("span",{className:"text-caption leading-[1.7] text-muted [text-wrap:pretty]",children:body}),jsxs("span",{className:"flex items-center gap-2.5 flex-wrap",children:[jsx(RelativeTime,{at:item.at}),item.action&&jsx("button",{type:"button",onClick:()=>{onAction?.(item);onOpen?.(item)},className:"text-micro font-extrabold text-brand cursor-pointer hover:text-brand-hover transition-colors",children:item.action.label})]})]}),onDismiss&&jsx("button",{type:"button",onClick:()=>onDismiss(item.id),"aria-label":dismissLabel??ui.dismiss,className:cn("shrink-0 size-7 rounded-sm flex items-center justify-center text-muted2 cursor-pointer","opacity-0 group-hover/row:opacity-100 focus-visible:opacity-100","hover:bg-hover hover:text-ink transition-colors"),children:jsx(X,{size:14,"aria-hidden":"true"})})]})}function NotificationList({items,onOpen,onDismiss,emptyTitle,emptyDescription,className}){const ui=useUIText();if(items.length===0){return jsx(EmptyState,{icon:BellOff,title:emptyTitle??ui.noNotifications,description:emptyDescription??ui.noNotificationsDesc})}return jsx("div",{className:cn("flex flex-col",className),children:items.map(n=>jsx(NotificationRow,{item:n,onOpen,onDismiss},n.id))})}function NotificationPanel({items,title,unread=0,needsAction=0,onMarkAllRead,markAllLabel,onViewAll,viewAllLabel,sound,onOpen,onDismiss,emptyTitle,emptyDescription,className}){const ui=useUIText();return jsxs("div",{className:cn("w-[22rem] max-w-[calc(100vw-2rem)] bg-surface border border-line rounded-lg shadow-pop","overflow-clip flex flex-col animate-qfade",className),children:[jsxs("div",{className:"shrink-0 flex items-center justify-between gap-2.5 px-4 py-3.5 border-b border-line",children:[jsxs("span",{className:"flex items-center gap-2 min-w-0",children:[jsx("span",{className:"text-lead font-extrabold truncate",children:title??ui.notifications}),unread>0&&jsx(Counter,{value:unread})]}),jsxs("span",{className:"shrink-0 flex items-center gap-2.5",children:[sound&&jsx(SoundToggle,{...sound}),onMarkAllRead&&unread>0&&jsxs("button",{type:"button",onClick:onMarkAllRead,className:"inline-flex items-center gap-1.5 text-micro font-bold text-brand cursor-pointer hover:text-brand-hover transition-colors",children:[jsx(CheckCheck,{size:13,"aria-hidden":"true"}),markAllLabel??ui.markAllRead]})]})]}),needsAction>0&&jsxs("p",{className:"shrink-0 m-0 px-4 py-2.5 bg-amber-bg border-b border-amber-line text-caption leading-[1.6] text-amber-ink",children:[jsx("span",{"data-num":true,className:"font-extrabold",children:needsAction})," ","\u0645\u062D\u062A\u0627\u062C\u064A\u0646 \u0625\u062C\u0631\u0627\u0621 \u2014 \u0628\u064A\u0641\u0636\u0644\u0648\u0627 \u0644\u062D\u062F \u0645\u0627 \u062A\u062A\u0639\u0627\u0645\u0644 \u0645\u0639\u0627\u0647\u0645\u060C \u0648\xAB\u062A\u0639\u0644\u064A\u0645 \u0627\u0644\u0643\u0644\xBB \u0645\u0627\u0628\u064A\u0645\u0633\u062D\u0647\u0645\u0634."]}),jsx("div",{className:"flex-1 min-h-0 max-h-[21rem] overflow-y-auto overscroll-contain",children:jsx(NotificationList,{items,onOpen,onDismiss,emptyTitle:emptyTitle??ui.noNotifications,emptyDescription:emptyDescription??ui.noNotificationsDesc})}),onViewAll&&items.length>0&&jsx("button",{type:"button",onClick:onViewAll,className:"shrink-0 w-full p-3 border-t border-line text-ui font-bold text-brand cursor-pointer hover:bg-hover transition-colors",children:viewAllLabel??ui.viewAllNotifications})]})}function SoundToggle({muted,setMuted,ready,className}){const ui=useUIText();const blocked=!muted&&!ready;const label=muted?"\u0634\u063A\u0651\u0644 \u0635\u0648\u062A \u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062A":blocked?"\u0627\u0644\u0635\u0648\u062A \u0645\u0633\u062A\u0646\u064A \u0623\u0648\u0644 \u062A\u0641\u0627\u0639\u0644 \u0645\u0639 \u0627\u0644\u0635\u0641\u062D\u0629":"\u0627\u0643\u062A\u0645 \u0635\u0648\u062A \u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062A";return jsx("button",{type:"button",onClick:()=>setMuted(!muted),title:label??ui.notifications,"aria-label":label??ui.notifications,"aria-pressed":muted,className:cn("size-7 rounded-sm flex items-center justify-center cursor-pointer transition-colors",blocked?"text-amber-ink":"text-muted2 hover:text-ink hover:bg-hover",className),children:muted||blocked?jsx(BellOff,{size:14,"aria-hidden":"true"}):jsx(Bell2,{size:14,"aria-hidden":"true"})})}var MENU_ALIGN={start:"start-0",end:"end-0"};var MENU_SIDE={bottom:"top-full mt-2",top:"bottom-full mb-2"};function NotificationMenu({unread,bellLabel,align="end",side="bottom",className,onViewAll,onOpen,...panel}){const[open,setOpen]=useState3(false);const wrap=useRef4(null);const id=useId();useEffect4(()=>{if(!open)return;function onKey(e){if(e.key==="Escape")setOpen(false)}function onDown(e){if(!wrap.current?.contains(e.target))setOpen(false)}document.addEventListener("keydown",onKey);document.addEventListener("mousedown",onDown);return()=>{document.removeEventListener("keydown",onKey);document.removeEventListener("mousedown",onDown)}},[open]);return jsxs("div",{ref:wrap,className:cn("relative",className),children:[jsx(NotificationBell,{unread,needsAction:panel.needsAction,expanded:open,label:bellLabel,onClick:()=>setOpen(o=>!o)}),open&&jsx("div",{role:"dialog","aria-label":bellLabel??"\u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062A",id,className:cn("absolute z-50",MENU_ALIGN[align],MENU_SIDE[side]),children:jsx(NotificationPanel,{...panel,unread,onOpen:n=>{setOpen(false);onOpen?.(n)},onViewAll:onViewAll&&(()=>{setOpen(false);onViewAll()})})})]})}function NotificationDrawer({open,onClose,items,title,unread=0,needsAction=0,onMarkAllRead,markAllLabel,closeLabel,onOpen,onDismiss,emptyTitle,emptyDescription}){const ui=useUIText();return jsxs(Drawer,{open,onClose,closeLabel:closeLabel??ui.close,title:jsxs("span",{className:"flex items-center gap-2",children:[title??ui.notifications,unread>0&&jsx(Counter,{value:unread})]}),bodyClassName:"p-0",footer:onMarkAllRead&&unread>0?jsxs("button",{type:"button",onClick:onMarkAllRead,className:"inline-flex items-center gap-1.5 text-ui font-bold text-brand cursor-pointer hover:text-brand-hover transition-colors",children:[jsx(CheckCheck,{size:15,"aria-hidden":"true"}),markAllLabel??ui.markAllRead]}):void 0,children:[needsAction>0&&jsxs("p",{className:"m-0 px-4 py-2.5 bg-amber-bg border-b border-amber-line text-caption leading-[1.6] text-amber-ink",children:[jsx("span",{"data-num":true,className:"font-extrabold",children:needsAction})," ","\u0645\u062D\u062A\u0627\u062C\u064A\u0646 \u0625\u062C\u0631\u0627\u0621 \u2014 \u0628\u064A\u0641\u0636\u0644\u0648\u0627 \u0644\u062D\u062F \u0645\u0627 \u062A\u062A\u0639\u0627\u0645\u0644 \u0645\u0639\u0627\u0647\u0645\u060C \u0648\xAB\u062A\u0639\u0644\u064A\u0645 \u0627\u0644\u0643\u0644\xBB \u0645\u0627\u0628\u064A\u0645\u0633\u062D\u0647\u0645\u0634."]}),jsx(NotificationList,{items,onOpen:n=>{onClose();onOpen?.(n)},onDismiss,emptyTitle:emptyTitle??ui.noNotifications,emptyDescription:emptyDescription??ui.noNotificationsDesc})]})}var PLACEMENT={"top-start":"top-4 sm:start-5","top-end":"top-4 sm:end-5","bottom-start":"bottom-4 sm:start-5","bottom-end":"bottom-4 sm:end-5"};var PLACEMENT_ANIM={"top-start":"animate-qfade","top-end":"animate-qfade","bottom-start":"animate-tip","bottom-end":"animate-tip"};function NotificationToastHost({items,onClose,onOpen,placement="top-end",width="sm:w-[22rem]",closeLabel,regionLabel,className}){const ui=useUIText();if(items.length===0)return null;return jsx("div",{role:"region","aria-label":regionLabel??ui.newNotifications,"aria-live":"polite",className:cn("fixed z-[60] inset-x-4 sm:inset-x-auto flex flex-col gap-2 pointer-events-none",PLACEMENT[placement],width,className),children:items.map(n=>jsx(ToastCard,{n,placement,closeLabel:closeLabel??ui.close,onClose,onOpen},n.id))})}function ToastCard({n,placement,closeLabel,onClose,onOpen}){const ui=useUIText();const{onAction}=useNotificationContext();const{kind:k,title,body}=useText(n);const Icon=k.icon;return jsxs("div",{className:cn("pointer-events-auto flex items-start gap-3 p-3.5 rounded-card","bg-surface border border-line shadow-panel",PLACEMENT_ANIM[placement]),children:[jsx("span",{"aria-hidden":"true",className:cn("size-8.5 rounded-sm flex items-center justify-center shrink-0",TONE_SOFT[k.tone]),children:jsx(Icon,{size:16,strokeWidth:2})}),jsxs("span",{className:"flex-1 min-w-0 flex flex-col gap-1",children:[jsx("span",{className:"text-ui font-extrabold text-ink",children:title??ui.notifications}),body&&jsx("span",{className:"text-caption leading-[1.65] text-muted [text-wrap:pretty] line-clamp-2",children:body}),n.action&&jsx("button",{type:"button",onClick:()=>{onAction?.(n);onOpen?.(n);onClose(n.id)},className:"w-fit text-micro font-extrabold text-brand cursor-pointer hover:text-brand-hover transition-colors",children:n.action.label})]}),jsx("button",{type:"button",onClick:()=>onClose(n.id),"aria-label":closeLabel??ui.close,className:"shrink-0 size-7 rounded-sm flex items-center justify-center text-muted2 hover:bg-hover hover:text-ink cursor-pointer transition-colors",children:jsx(X,{size:14,"aria-hidden":"true"})})]})}export{NOTIFICATION_PRIORITIES,NOTIFICATION_SCHEMA_VERSION,NOTIFICATION_SOUNDS,NotificationBell,NotificationDrawer,NotificationList,NotificationMenu,NotificationPanel,NotificationProvider,NotificationRow,NotificationToastHost,QUMRA_KINDS,QUMRA_NOTIFICATIONS,SoundToggle,createKindRegistry,formatRelativeTime,isBulkReadable,optimistic,parseNotification,parseNotifications,relativeTickMs,serializeNotification,useNotificationCenter,useNotificationContext,useNotificationSound,useNotifications};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qumra/fanar",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.14",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Qumra's Arabic-first component library and design tokens. Tailwind 4, RSC-safe.",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
"exports": {
|
|
16
16
|
".": {
|
|
17
17
|
"types": "./dist/index.d.ts",
|
|
18
|
-
"react-native": "./dist/native/index.js",
|
|
19
18
|
"import": "./dist/index.js"
|
|
20
19
|
},
|
|
21
20
|
"./lib": {
|
|
@@ -28,22 +27,18 @@
|
|
|
28
27
|
},
|
|
29
28
|
"./orb": {
|
|
30
29
|
"types": "./dist/orb.d.ts",
|
|
31
|
-
"react-native": "./dist/native/orb.js",
|
|
32
30
|
"import": "./dist/orb.js"
|
|
33
31
|
},
|
|
34
32
|
"./editor": {
|
|
35
33
|
"types": "./dist/editor.d.ts",
|
|
36
|
-
"react-native": "./dist/native/editor.js",
|
|
37
34
|
"import": "./dist/editor.js"
|
|
38
35
|
},
|
|
39
36
|
"./notifications": {
|
|
40
37
|
"types": "./dist/notifications.d.ts",
|
|
41
|
-
"react-native": "./dist/native/notifications.js",
|
|
42
38
|
"import": "./dist/notifications.js"
|
|
43
39
|
},
|
|
44
40
|
"./ai": {
|
|
45
41
|
"types": "./dist/ai.d.ts",
|
|
46
|
-
"react-native": "./dist/native/ai.js",
|
|
47
42
|
"import": "./dist/ai.js"
|
|
48
43
|
},
|
|
49
44
|
"./editor.css": "./dist/editor.css",
|
|
@@ -73,8 +68,8 @@
|
|
|
73
68
|
"@testing-library/react": "^16.3.2",
|
|
74
69
|
"@testing-library/user-event": "^14.6.6",
|
|
75
70
|
"@types/node": "^26.2.0",
|
|
76
|
-
"@types/react": "^19.
|
|
77
|
-
"@types/react-dom": "^19.
|
|
71
|
+
"@types/react": "^19.2.18",
|
|
72
|
+
"@types/react-dom": "^19.2.4",
|
|
78
73
|
"@types/three": "^0.185.0",
|
|
79
74
|
"@vitejs/plugin-react": "^6.1.0",
|
|
80
75
|
"@vitest/coverage-v8": "^4.1.11",
|
|
@@ -84,17 +79,12 @@
|
|
|
84
79
|
"eslint-plugin-react-hooks": "^7.1.1",
|
|
85
80
|
"globals": "^17.11.0",
|
|
86
81
|
"happy-dom": "^20.11.6",
|
|
87
|
-
"lucide-react-native": "^0.563.0",
|
|
88
82
|
"prettier": "^3.9.6",
|
|
89
|
-
"react": "19.
|
|
90
|
-
"react-dom": "19.
|
|
91
|
-
"react-native": "0.80.0",
|
|
92
|
-
"react-native-safe-area-context": "^5.9.1",
|
|
93
|
-
"react-native-svg": "^15.15.5",
|
|
83
|
+
"react": "^19.2.8",
|
|
84
|
+
"react-dom": "^19.2.8",
|
|
94
85
|
"size-limit": "^13.0.3",
|
|
95
86
|
"three": "^0.185.1",
|
|
96
87
|
"tsup": "^8.5.1",
|
|
97
|
-
"twrnc": "^4.16.0",
|
|
98
88
|
"typescript": "^5.7.3",
|
|
99
89
|
"typescript-eslint": "^8.67.0",
|
|
100
90
|
"vitest": "^4.1.11"
|
|
@@ -136,14 +126,10 @@
|
|
|
136
126
|
"@react-three/fiber": ">=9.0.0",
|
|
137
127
|
"@types/react": "^19.0.0",
|
|
138
128
|
"@types/react-dom": "^19.0.0",
|
|
139
|
-
"lucide-react-native": ">=0.400.0",
|
|
140
129
|
"react": "^19.0.0",
|
|
141
130
|
"react-dom": "^19.0.0",
|
|
142
|
-
"react-native": ">=0.80.0",
|
|
143
|
-
"react-native-svg": ">=15.0.0",
|
|
144
131
|
"tailwindcss": "^4.0.0",
|
|
145
|
-
"three": ">=0.171.0"
|
|
146
|
-
"twrnc": ">=4.0.0"
|
|
132
|
+
"three": ">=0.171.0"
|
|
147
133
|
},
|
|
148
134
|
"peerDependenciesMeta": {
|
|
149
135
|
"@google/model-viewer": {
|
|
@@ -164,23 +150,11 @@
|
|
|
164
150
|
"@types/react-dom": {
|
|
165
151
|
"optional": true
|
|
166
152
|
},
|
|
167
|
-
"lucide-react-native": {
|
|
168
|
-
"optional": true
|
|
169
|
-
},
|
|
170
|
-
"react-native": {
|
|
171
|
-
"optional": true
|
|
172
|
-
},
|
|
173
|
-
"react-native-svg": {
|
|
174
|
-
"optional": true
|
|
175
|
-
},
|
|
176
153
|
"tailwindcss": {
|
|
177
154
|
"optional": true
|
|
178
155
|
},
|
|
179
156
|
"three": {
|
|
180
157
|
"optional": true
|
|
181
|
-
},
|
|
182
|
-
"twrnc": {
|
|
183
|
-
"optional": true
|
|
184
158
|
}
|
|
185
159
|
},
|
|
186
160
|
"engines": {
|
package/dist/chunk-3EPEIAG2.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import{cn,useUIText}from"./chunk-6DTSIOCB.js";import{cloneElement,isValidElement,useCallback,useEffect,useId,useRef,useState}from"react";import{createPortal}from"react-dom";import{AlertTriangle,CheckCircle2,Info,Loader2,X,XCircle}from"lucide-react";var TOAST_MS={plain:3800,withAction:6500};var TOAST_MAX=4;var TOAST_ACCENT={neutral:"text-muted2",brand:"text-brand-100",green:"text-mint",amber:"text-amber",red:"text-red-100"};var HOST_WEB="fixed z-[60] bottom-4 inset-x-4 sm:inset-x-auto sm:start-5 sm:w-[360px] flex flex-col gap-2 pointer-events-none";var TOAST_ROW="flex items-start gap-3 p-3.5 rounded-card bg-night shadow-toast";var TOAST_ROW_WEB="pointer-events-auto animate-[toast-in_.22s_cubic-bezier(.22,.61,.36,1)]";var TOAST_MARK="shrink-0 mt-0.5";var TOAST_BODY="flex-1 min-w-0 flex flex-col gap-0.5";var TOAST_TITLE="text-ui font-bold leading-snug text-white";var TOAST_DESC="text-caption leading-[1.6] text-white/65";var TOAST_ACTION="shrink-0 text-ui font-extrabold text-mint cursor-pointer";var TOAST_ACTION_WEB="hover:underline underline-offset-4";var TOAST_CLOSE="shrink-0 text-white/40 hover:text-white cursor-pointer transition-colors";var isLoudToast=tone=>tone==="red";var TIP="w-max max-w-[220px] px-2.5 py-1.5 rounded-xs bg-night text-white text-caption leading-[1.6] text-center shadow-tip";import{jsx,jsxs}from"react/jsx-runtime";function useToasts(){const[toasts,setToasts]=useState([]);const seq=useRef(0);const timers=useRef(new Map);const dismiss=useCallback(id=>{const t=timers.current.get(id);if(t)clearTimeout(t);timers.current.delete(id);setToasts(prev=>prev.filter(x=>x.id!==id))},[]);const push=useCallback(input=>{const id=++seq.current;const duration=input.duration??(input.actionLabel?TOAST_MS.withAction:TOAST_MS.plain);setToasts(prev=>[...prev.slice(-(TOAST_MAX-1)),{...input,id}]);if(duration>0&&!input.pending){timers.current.set(id,setTimeout(()=>dismiss(id),duration))}return id},[dismiss]);const update=useCallback((id,patch)=>{setToasts(prev=>prev.map(t=>t.id===id?{...t,...patch}:t))},[]);const clear=useCallback(()=>{timers.current.forEach(clearTimeout);timers.current.clear();setToasts([])},[]);return{toasts,push,dismiss,update,clear}}var TOAST_ICON={neutral:Info,brand:Info,green:CheckCircle2,amber:AlertTriangle,red:XCircle};function ToastHost({toasts,onDismiss,closeLabel}){const ui=useUIText();if(toasts.length===0)return null;return jsx("div",{role:"region","aria-label":ui.alerts,className:HOST_WEB,children:toasts.map(t=>{const Icon=TOAST_ICON[t.tone];return jsxs("div",{role:isLoudToast(t.tone)?"alert":"status",className:cn(TOAST_ROW,TOAST_ROW_WEB,"text-white"),children:[jsx("span",{"aria-hidden":"true",className:cn(TOAST_MARK,TOAST_ACCENT[t.tone]),children:t.pending?jsx(Loader2,{size:17,className:"animate-spin"}):jsx(Icon,{size:17})}),jsxs("span",{className:TOAST_BODY,children:[jsx("span",{className:TOAST_TITLE,children:t.title}),t.description&&jsx("span",{className:TOAST_DESC,children:t.description})]}),t.actionLabel&&jsx("button",{type:"button",onClick:()=>{t.onAction?.();onDismiss(t.id)},className:cn(TOAST_ACTION,TOAST_ACTION_WEB),children:t.actionLabel}),jsx("button",{type:"button",onClick:()=>onDismiss(t.id),"aria-label":closeLabel??ui.close,className:TOAST_CLOSE,children:jsx(X,{size:15,"aria-hidden":"true"})})]},t.id)})})}function Tooltip({content,children,side="top"}){const[open,setOpen]=useState(false);const anchor=useRef(null);const tip=useRef(null);const id=useId();const GAP=7;const EDGE=8;const place=useCallback(()=>{const el=tip.current;const host=anchor.current;if(!el||!host)return;const r=host.getBoundingClientRect();const w=el.offsetWidth;const h=el.offsetHeight;const vw=document.documentElement.clientWidth;const vh=document.documentElement.clientHeight;const left=Math.min(Math.max(r.left+r.width/2-w/2,EDGE),Math.max(EDGE,vw-EDGE-w));const above=side==="top"?r.top-GAP-h>=EDGE:r.bottom+GAP+h>vh-EDGE;const top=above?r.top-GAP-h:r.bottom+GAP;el.style.left=`${left}px`;el.style.top=`${Math.min(Math.max(top,EDGE),Math.max(EDGE,vh-EDGE-h))}px`;el.style.visibility="visible"},[side]);useEffect(()=>{if(!open)return;window.addEventListener("scroll",place,{capture:true,passive:true});window.addEventListener("resize",place,{passive:true});return()=>{window.removeEventListener("scroll",place,{capture:true});window.removeEventListener("resize",place)}},[open,place]);const mount=useCallback(el=>{tip.current=el;if(el)place()},[place]);const described=isValidElement(children)?cloneElement(children,{"aria-describedby":open?id:void 0}):children;return jsxs("span",{ref:anchor,className:"relative inline-flex",onMouseEnter:()=>setOpen(true),onMouseLeave:()=>setOpen(false),onFocus:()=>setOpen(true),onBlur:()=>setOpen(false),children:[described,open&&typeof document!=="undefined"&&createPortal(jsx("span",{id,role:"tooltip",ref:mount,style:{visibility:"hidden",left:0,top:0},className:cn("fixed z-[60]",TIP,"animate-[fade-in_.12s_ease-out] pointer-events-none"),children:content}),document.body)]})}export{useToasts,ToastHost,Tooltip};
|
package/dist/chunk-6DTSIOCB.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
var TEXT_SCALE=["micro","caption","ui","body","lead","base","h4","h3","h2","h1","display","hero","title","mega"];var RADIUS_SCALE=["mark","xs","sm","field","card","lg","section","full"];var SHADOW_SCALE=["raise","tip","panel","pop","modal","toast","sheet"];var CONTAINER_SCALE=["page","shell","note","lead"];var ANIMATE_SCALE=["qfade","qslide","tip","tip-up","drawer","drawer-rtl","savebar","skeleton"];var COLOR_SCALE=["surface","bg","line","hover","ink","ink2","muted","muted2","border","soft","soft2","brand-100","brand-900","brand-ink","brand","brand-hover","brand-deep","skeleton","tint","tint2","mint","amber-900","amber","amber-bg","amber-ink","amber-line","amber-hover","green","green-bg","green-bg2","green-line","green-solid","violet","violet-bg","violet-line","violet-solid","red-100","red","red-bg","red-line","danger","danger-hover","night","hero-body","hero-meta","hero-dim","hero-text","code-bg","code-plain","code-key","code-tag","code-attr","code-str","code-num","code-note","code-dim","code-line","code-chip"];var TOKENS={"--font-sans":'"Alexandria", system-ui, sans-serif',"--color-surface":"#ffffff","--color-bg":"#f7f9f9","--color-line":"#edf1f1","--color-hover":"#f2f6f6","--color-ink":"#020809","--color-ink2":"#3d4545","--color-muted":"#5f6a6a","--color-muted2":"#687373","--color-border":"#7f8c8c","--color-soft":"#eaf2f3","--color-soft2":"#dceded","--color-brand-100":"#a5c9cc","--color-brand-900":"#0a2528","--color-brand-ink":"#0f4a4e","--color-brand":"#207982","--color-brand-hover":"#1a646c","--color-brand-deep":"#0b3b3e","--color-skeleton":"#d6dcdc","--color-tint":"#f4faf8","--color-tint2":"#eff6f3","--color-mint":"#7dd3c0","--color-amber-900":"#3d2a05","--color-amber":"#f8ac33","--color-amber-bg":"#fef6e9","--color-amber-ink":"#85570f","--color-amber-line":"#fbd79a","--color-amber-hover":"#de9219","--color-green":"#1e7a45","--color-green-bg":"#f1faf4","--color-green-bg2":"#e9f6ee","--color-green-line":"#bfe6ce","--color-green-solid":"#1e7a45","--color-violet":"#4b3e8e","--color-violet-bg":"#edeaf6","--color-violet-line":"#ded8ef","--color-violet-solid":"#6d5eb8","--color-red-100":"#f3a79e","--color-red":"#8e2b20","--color-red-bg":"#fdecea","--color-red-line":"#f3c9c4","--color-danger":"#c94134","--color-danger-hover":"#a3362b","--color-night":"#0b0f12","--color-hero-body":"#bfd9d8","--color-hero-meta":"#8fb3b2","--color-hero-dim":"#5e7a79","--color-hero-text":"#d7e3e2","--color-code-bg":"#1f1f1f","--color-code-plain":"#d4d4d4","--color-code-key":"#569cd6","--color-code-tag":"#4ec9b0","--color-code-attr":"#9cdcfe","--color-code-str":"#ce9178","--color-code-num":"#b5cea8","--color-code-note":"#6a9955","--color-code-dim":"#858585","--color-code-line":"#303031","--color-code-chip":"#f4f7f7","--text-micro":"11px","--text-caption":"12px","--text-ui":"13px","--text-body":"14px","--text-lead":"15px","--text-base":"16px","--text-base--line-height":"initial","--text-h4":"17px","--text-h3":"20px","--text-h2":"24px","--text-h1":"30px","--text-display":"36px","--text-hero":"44px","--text-title":"40px","--text-mega":"54px","--container-page":"1600px","--container-shell":"1600px","--container-note":"340px","--container-lead":"520px","--radius-mark":"3px","--radius-xs":"5px","--radius-sm":"7px","--radius-field":"9px","--radius-card":"12px","--radius-lg":"14px","--radius-section":"18px","--radius-full":"999px","--shadow-raise":"0 1px 3px var(--shadow-color)","--shadow-tip":"0 6px 18px var(--shadow-color)","--shadow-panel":"0 10px 30px var(--shadow-color)","--shadow-pop":"0 18px 44px var(--shadow-color)","--shadow-modal":"0 24px 60px rgb(2 8 9 / 0.28)","--shadow-toast":"0 16px 40px rgb(2 8 9 / 0.26)","--shadow-sheet":"0 -14px 40px rgb(2 8 9 / 0.28), inset 0 1px 0 rgb(255 255 255 / 0.06)","--shadow-color":"rgb(2 8 9 / 0.14)","--animate-qfade":"qfade 0.16s ease-out","--animate-qslide":"qslidein 0.22s ease-out","--animate-tip":"tip-in 0.26s cubic-bezier(0.2, 0.8, 0.2, 1)","--animate-tip-up":"tip-up 0.3s cubic-bezier(0.2, 0.9, 0.2, 1)","--animate-drawer":"drawer-ltr 0.32s cubic-bezier(0.2, 0.9, 0.2, 1)","--animate-drawer-rtl":"drawer-rtl 0.32s cubic-bezier(0.2, 0.9, 0.2, 1)","--animate-savebar":"savebar-in 0.2s cubic-bezier(0.2, 0.8, 0.2, 1)","--animate-skeleton":"skeleton-pulse 1.6s ease-in-out infinite","--num-align":"right","--num-align-far":"left","--num-pad-right":"0.875rem","--num-pad-left":"3.5rem","--num-icon-pad-right":"2.5rem","--num-icon-pad-left":"0.875rem"};var DARK_TOKENS={"--color-surface":"#101718","--color-bg":"#0a0f10","--color-line":"#1e2829","--color-hover":"#1a2425","--color-ink":"#f2f6f6","--color-ink2":"#c7d1d1","--color-muted":"#93a0a0","--color-muted2":"#7a8787","--color-border":"#5e6b6c","--color-soft":"#12363a","--color-soft2":"#17454a","--color-brand-ink":"#7dd3c0","--color-skeleton":"#2c3232","--color-amber":"#f8ac33","--color-amber-bg":"#2b2009","--color-amber-ink":"#f5c77a","--color-amber-line":"#5c4415","--color-green":"#6ecf9a","--color-green-bg":"#0d2119","--color-green-bg2":"#102a22","--color-green-line":"#245140","--color-violet":"#b9aeea","--color-violet-bg":"#1e1a33","--color-violet-line":"#38305c","--color-red":"#f3a79e","--color-red-bg":"#2c1613","--color-red-line":"#5c2a24","--color-code-chip":"#17201f","--shadow-color":"rgb(0 0 0 / 0.55)"};import{extendTailwindMerge}from"tailwind-merge";var twMerge=extendTailwindMerge({extend:{classGroups:{"font-size":[{text:TEXT_SCALE}],rounded:[{rounded:RADIUS_SCALE}],shadow:[{shadow:SHADOW_SCALE}],"max-w":[{"max-w":CONTAINER_SCALE}],animate:[{animate:ANIMATE_SCALE}]}}});function cn(...parts){return twMerge(parts.filter(p=>typeof p==="string"&&p.length>0).join(" "))}var TONE_SOFT={neutral:"bg-hover text-muted",brand:"bg-soft text-brand-ink",amber:"bg-amber-bg text-amber-ink",green:"bg-green-bg2 text-green",red:"bg-red-bg text-red",violet:"bg-violet-bg text-violet"};var TONE_SOLID={neutral:"bg-ink2 text-surface",brand:"bg-brand text-white",amber:"bg-amber text-amber-900",green:"bg-green-solid text-white",red:"bg-danger text-white",violet:"bg-violet-solid text-white"};function toLatinDigits(s){return s.replace(/[٠-٩۰-۹٫٬]/g,c=>{const code=c.charCodeAt(0);if(code===1643)return".";if(code===1644)return"";const base=code>=1776?1776:1632;return String(code-base)})}var VARIANTS={primary:"bg-brand border-brand text-white hover:bg-brand-hover",soft:"bg-soft border-soft2 text-brand-ink hover:bg-soft2",outline:"bg-surface border-border text-ink2 hover:border-brand hover:text-brand-ink",ghost:"bg-transparent border-transparent text-ink2 hover:bg-hover",danger:"bg-danger border-danger text-white hover:bg-danger-hover",link:"bg-transparent border-transparent text-brand-ink hover:underline underline-offset-4 px-0!"};var SIZES={sm:"h-9 px-3.5 gap-1.5 text-ui rounded-sm",md:"h-11 px-4 gap-2 text-body rounded-field",lg:"h-12 px-5 gap-2 text-lead rounded-card",xl:"h-14 px-5.5 gap-4 text-h3 font-extrabold rounded-field"};function buttonClasses(variant="primary",size="md",extra){return cn("inline-flex items-center justify-center border font-bold whitespace-nowrap","cursor-pointer transition-colors duration-150 select-none","focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand",SIZES[size],VARIANTS[variant],extra)}import{createContext,useCallback,useContext,useSyncExternalStore}from"react";var langStore={subscribe(cb){if(typeof MutationObserver==="undefined")return()=>{};const o=new MutationObserver(cb);o.observe(document.documentElement,{attributes:true,attributeFilter:["lang"]});return()=>o.disconnect()},get:()=>typeof document==="undefined"?"ar-EG":document.documentElement.lang||"ar-EG"};function setLang(tag){if(typeof document==="undefined")return;document.documentElement.lang=tag??""}var LocaleCtx=createContext(null);function useMoneyLocale(){const fromProvider=useContext(LocaleCtx);const serverSnapshot=useCallback(()=>fromProvider??"ar-EG",[fromProvider]);return useSyncExternalStore(langStore.subscribe,langStore.get,serverSnapshot)}function useMoneyLang(){return useMoneyLocale().startsWith("en")}var AR=0;var EN=1;var TEXT={close:["\u0625\u063A\u0644\u0627\u0642","Close"],select:["\u0627\u062E\u062A\u0631\u2026","Select\u2026"],search:["\u0627\u0628\u062D\u062B\u2026","Search\u2026"],searchEverything:["\u0627\u0628\u062D\u062B \u0641\u064A \u0643\u0644 \u062D\u0627\u062C\u0629\u2026","Search everything\u2026"],noResults:["\u0645\u0627\u0641\u064A\u0634 \u0646\u062A\u0627\u064A\u062C","No results"],searchOrAdd:["\u0627\u0628\u062D\u062B \u0623\u0648 \u0623\u0636\u0641\u2026","Search or add\u2026"],now:["\u0627\u0644\u0622\u0646","Now"],videoPlayer:["\u0645\u0634\u063A\u0651\u0644 \u0627\u0644\u0641\u064A\u062F\u064A\u0648","Video player"],rating:["\u0627\u0644\u062A\u0642\u064A\u064A\u0645","Rating"],activeFilters:["\u0627\u0644\u0641\u0644\u0627\u062A\u0631 \u0627\u0644\u0645\u0637\u0628\u0651\u0642\u0629:","Active filters:"],clearAll:["\u0645\u0633\u062D \u0627\u0644\u0643\u0644","Clear all"],row:["\u0635\u0641\u0651","row"],dropImages:["\u0627\u0633\u062D\u0628 \u0627\u0644\u0635\u0648\u0631 \u0647\u0646\u0627","Drop images here"],chooseFromDevice:["\u0627\u062E\u062A\u0631 \u0645\u0646 \u0627\u0644\u062C\u0647\u0627\u0632","Choose from device"],previousPeriod:["\u0627\u0644\u0641\u062A\u0631\u0629 \u0627\u0644\u0633\u0627\u0628\u0642\u0629","Previous period"],less:["\u0623\u0642\u0644","Less"],more:["\u0623\u0643\u062B\u0631","More"],totalSales:["\u0625\u062C\u0645\u0627\u0644\u064A \u0627\u0644\u0645\u0628\u064A\u0639\u0627\u062A","Total sales"],netToYou:["\u0635\u0627\u0641\u064A \u0644\u0643","Net to you"],verifiedAccount:["\u062D\u0633\u0627\u0628 \u0645\u0648\u062B\u0651\u0642","Verified account"],grabHint:["\u0639\u0646\u0635\u0631 \u0642\u0627\u0628\u0644 \u0644\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u062A\u0631\u062A\u064A\u0628. \u0627\u0636\u063A\u0637 \u0645\u0633\u0627\u0641\u0629 \u0644\u0645\u0633\u0643\u0647 \u062B\u0645 \u0627\u0644\u0623\u0633\u0647\u0645 \u0644\u062A\u062D\u0631\u064A\u0643\u0647.","Reorderable item. Press space to grab it, then the arrows to move it."],notifications:["\u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062A","Notifications"],dismiss:["\u0625\u062E\u0641\u0627\u0621","Dismiss"],unread:["\u063A\u064A\u0631 \u0645\u0642\u0631\u0648\u0621","Unread"],noNotifications:["\u0645\u0641\u064A\u0634 \u0625\u0634\u0639\u0627\u0631\u0627\u062A","No notifications"],noNotificationsDesc:["\u0623\u0648\u0644 \u0645\u0627 \u064A\u062D\u0635\u0644 \u062D\u0627\u062C\u0629 \u062A\u0633\u062A\u0627\u0647\u0644\u060C \u0647\u062A\u0644\u0627\u0642\u064A\u0647\u0627 \u0647\u0646\u0627.","When something worth knowing happens, it lands here."],markAllRead:["\u062A\u0639\u0644\u064A\u0645 \u0627\u0644\u0643\u0644 \u0643\u0645\u0642\u0631\u0648\u0621","Mark all as read"],viewAllNotifications:["\u0639\u0631\u0636 \u0643\u0644 \u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062A","View all notifications"],newNotifications:["\u0625\u0634\u0639\u0627\u0631\u0627\u062A \u062C\u062F\u064A\u062F\u0629","New notifications"],reloadPreview:["\u0625\u0639\u0627\u062F\u0629 \u062A\u062D\u0645\u064A\u0644 \u0627\u0644\u0645\u0639\u0627\u064A\u0646\u0629","Reload preview"],previousMonth:["\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u0644\u064A \u0642\u0628\u0644\u0647","Previous month"],nextMonth:["\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u0644\u064A \u0628\u0639\u062F\u0647","Next month"],whatIsThisNumber:["\u0645\u0627 \u0645\u0639\u0646\u0649 \u0647\u0630\u0627 \u0627\u0644\u0631\u0642\u0645\u061F","What does this number mean?"],explainToMe:["\u0627\u0634\u0631\u062D \u0644\u064A","Explain this"],clearSearch:["\u0645\u0633\u062D \u0627\u0644\u0628\u062D\u062B","Clear search"],alerts:["\u0627\u0644\u062A\u0646\u0628\u064A\u0647\u0627\u062A","Alerts"],whatIsThisOption:["\u0645\u0627 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631\u061F","What is this option?"],shouldBeHere:["\u0627\u0644\u0645\u0641\u0631\u0648\u0636 \u062A\u0643\u0648\u0646 \u0647\u0646\u0627","Should be here"],closeExplainer:["\u0625\u063A\u0644\u0627\u0642 \u0627\u0644\u0634\u0631\u062D","Close explainer"],cancelRecording:["\u0625\u0644\u063A\u0627\u0621 \u0627\u0644\u062A\u0633\u062C\u064A\u0644","Cancel recording"],sendRecording:["\u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u062A\u0633\u062C\u064A\u0644","Send recording"],attachFile:["\u0625\u0631\u0641\u0627\u0642 \u0645\u0644\u0641","Attach file"],recordVoice:["\u062A\u0633\u062C\u064A\u0644 \u0635\u0648\u062A\u064A","Record a voice note"],playbackPosition:["\u0645\u0648\u0636\u0639 \u0627\u0644\u062A\u0634\u063A\u064A\u0644","Playback position"],volume:["\u0645\u0633\u062A\u0648\u0649 \u0627\u0644\u0635\u0648\u062A","Volume"],hideSuggestions:["\u0625\u062E\u0641\u0627\u0621 \u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D\u0627\u062A","Hide suggestions"],askShehab:["\u0627\u0633\u0623\u0644 \u0634\u0647\u0627\u0628\u2026","Ask Shehab\u2026"],shehabThinking:["\u0634\u0647\u0627\u0628 \u0628\u064A\u0641\u0643\u0651\u0631\u2026","Shehab is thinking\u2026"],undo:["\u062A\u0631\u0627\u062C\u0639","Undo"],from:["\u0645\u0646","from"],tryAnotherReply:["\u062C\u0631\u0651\u0628 \u0631\u062F \u062A\u0627\u0646\u064A","Try another reply"],helpfulReply:["\u0631\u062F \u0645\u0641\u064A\u062F","Helpful reply"],unhelpfulReply:["\u0631\u062F \u0645\u0634 \u0645\u0641\u064A\u062F","Unhelpful reply"],aiDisclaimer:["\u0634\u0647\u0627\u0628 \u0645\u0645\u0643\u0646 \u064A\u063A\u0644\u0637. \u0631\u0627\u062C\u0639 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0642\u0628\u0644 \u0645\u0627 \u062A\u062A\u0635\u0631\u0651\u0641 \u0639\u0644\u064A\u0647\u0627.","Shehab can get things wrong. Check the numbers before acting on them."],back10:["\u0631\u062C\u0648\u0639 \u0661\u0660 \u062B\u0648\u0627\u0646\u064A","Back 10 seconds"],forward10:["\u062A\u0642\u062F\u064A\u0645 \u0661\u0660 \u062B\u0648\u0627\u0646\u064A","Forward 10 seconds"],playbackSpeed:["\u0633\u0631\u0639\u0629 \u0627\u0644\u062A\u0634\u063A\u064A\u0644","Playback speed"],arabic:["\u0627\u0644\u0639\u0631\u0628\u064A\u0629","Arabic"],seeMore:["\u0634\u0648\u0641 \u0643\u0645\u0627\u0646","See more"],pictureInPicture:["\u0646\u0627\u0641\u0630\u0629 \u0639\u0627\u0626\u0645\u0629","Picture in picture"]};function useUIText(){return useMoneyLang()?BUNDLES[EN]:BUNDLES[AR]}function build(i){const out={};for(const key of Object.keys(TEXT))out[key]=TEXT[key][i];return out}var BUNDLES=[build(AR),build(EN)];import{useEffect,useId}from"react";import{AlertTriangle,CheckCircle2,Info,X,XCircle}from"lucide-react";var SHEET_LAYER_WEB="fixed inset-0 z-50 flex flex-col justify-end";var SCRIM="bg-black/50";var SCRIM_WEB="flex-1 backdrop-blur-[3px] cursor-default animate-[fade-in_0.2s_ease-out]";var SCRIM_FILL="flex-1";var SHEET="bg-surface rounded-t-section max-h-[82dvh] flex flex-col shadow-sheet";var SHEET_WEB="overflow-clip animate-[sheet-up_0.26s_cubic-bezier(.22,.61,.36,1)]";var SHEET_GRIP_ROW="shrink-0 pt-3 pb-1.5 flex justify-center";var SHEET_GRIP="h-1.5 w-11 rounded-full bg-border";var SHEET_HEAD="shrink-0 flex items-center justify-between gap-3 px-5 pb-3";var SHEET_TITLE="text-h4 font-black tracking-tight";var SHEET_HEAD_ACTIONS="flex items-center gap-3";var SHEET_CLOSE="size-9 rounded-full bg-bg flex items-center justify-center text-muted active:bg-hover active:scale-95 transition-transform cursor-pointer";var SHEET_BODY="flex-1 min-h-0 px-3 pb-4 flex flex-col";var MODAL_LAYER_WEB="fixed inset-0 z-50 flex items-center justify-center p-4";var MODAL_SCRIM="bg-black/45";var MODAL_SCRIM_WEB="absolute inset-0 backdrop-blur-[2px] cursor-default";var MODAL="relative w-full bg-surface rounded-lg border border-line flex flex-col max-h-[85dvh] shadow-modal";var MODAL_WIDTHS={sm:"max-w-md",md:"max-w-xl",lg:"max-w-3xl"};var MODAL_HEAD="shrink-0 flex items-start justify-between gap-4 p-5 border-b border-line";var MODAL_HEAD_TEXT="flex flex-col gap-1 min-w-0";var MODAL_TITLE="text-h4 font-extrabold text-ink m-0";var MODAL_DESC="text-ui text-muted m-0";var MODAL_BODY="flex-1 min-h-0 p-5";var MODAL_FOOT="shrink-0 flex items-center justify-end gap-2.5 p-5 border-t border-line";var CLOSE_BTN="shrink-0 size-8 rounded-sm flex items-center justify-center text-muted hover:bg-hover hover:text-ink transition-colors cursor-pointer";var DRAWER_LAYER_WEB="fixed inset-0 z-50 flex";var DRAWER="w-full sm:w-[420px] bg-surface border-s border-line flex flex-col";var DRAWER_HEAD="shrink-0 h-16 px-4 border-b border-line flex items-center justify-between gap-3";var DRAWER_HEAD_TEXT="flex flex-col gap-0.5 min-w-0";var DRAWER_TITLE="text-lead font-extrabold truncate";var DRAWER_DESC="text-caption text-muted truncate";var DRAWER_BODY="flex-1 min-h-0";var DRAWER_BODY_PAD="p-4";var DRAWER_FOOT="shrink-0 p-4 border-t border-line flex gap-2.5";var ALERT_BORDER={neutral:"border-line",brand:"border-soft2",amber:"border-amber-line",green:"border-green-line",red:"border-red-line",violet:"border-violet-line"};var ALERT="flex items-start gap-3 p-4 rounded-card border";var ALERT_BODY="flex flex-col gap-1.5 flex-1 min-w-0";var ALERT_TITLE="text-body font-extrabold";var ALERT_TEXT="text-ui leading-[1.7] opacity-90";var ALERT_ACTIONS="flex items-center gap-2 mt-1";var isUrgent=tone=>tone==="red"||tone==="amber";var TOAST="flex items-center gap-3 px-4 py-3.5 rounded-card bg-brand-900 shadow-toast";var TOAST_WEB="animate-[fade-in_0.18s_ease-out]";var TOAST_ICON="text-brand-100 shrink-0";var TOAST_TEXT="text-body font-bold text-white flex-1";var EMPTY="flex flex-col items-center justify-center gap-2.5 py-12 px-5 text-center";var EMPTY_ICON="size-12 rounded-card bg-hover flex items-center justify-center text-muted mb-1";var EMPTY_TITLE="text-lead font-extrabold text-ink";var EMPTY_DESC="text-ui leading-[1.75] text-muted max-w-note";var EMPTY_ACTION="mt-1";import{jsx,jsxs}from"react/jsx-runtime";function Sheet({open,title,onClose,action,children,closeLabel}){const ui=useUIText();useEffect(()=>{if(!open)return;function onKey(e){if(e.key==="Escape")onClose()}document.addEventListener("keydown",onKey);return()=>document.removeEventListener("keydown",onKey)},[open,onClose]);if(!open)return null;return jsxs("div",{className:SHEET_LAYER_WEB,role:"dialog","aria-modal":"true","aria-label":title,children:[jsx("button",{type:"button","aria-label":closeLabel??ui.close,onClick:onClose,className:cn(SCRIM,SCRIM_WEB)}),jsxs("div",{className:cn(SHEET,SHEET_WEB,"pb-[env(safe-area-inset-bottom)]"),children:[jsx("button",{type:"button",onClick:onClose,"aria-label":closeLabel??ui.close,className:cn(SHEET_GRIP_ROW,"cursor-grab active:cursor-grabbing"),children:jsx("span",{"aria-hidden":"true",className:SHEET_GRIP})}),jsxs("div",{className:SHEET_HEAD,children:[jsx("span",{className:SHEET_TITLE,children:title}),jsxs("span",{className:SHEET_HEAD_ACTIONS,children:[action,jsx("button",{type:"button",onClick:onClose,"aria-label":closeLabel??ui.close,className:SHEET_CLOSE,children:jsx(X,{size:17,strokeWidth:2.4,"aria-hidden":"true"})})]})]}),jsx("div",{className:cn(SHEET_BODY,"overflow-y-auto overscroll-contain"),children})]})]})}function Modal({open,title,description,onClose,footer,children,size="md",closeLabel}){const ui=useUIText();const titleId=useId();useEffect(()=>{if(!open)return;function onKey(e){if(e.key==="Escape")onClose()}document.addEventListener("keydown",onKey);return()=>document.removeEventListener("keydown",onKey)},[open,onClose]);if(!open)return null;return jsxs("div",{className:MODAL_LAYER_WEB,role:"dialog","aria-modal":"true","aria-labelledby":titleId,children:[jsx("button",{type:"button","aria-label":closeLabel??ui.close,onClick:onClose,className:cn(MODAL_SCRIM,MODAL_SCRIM_WEB)}),jsxs("div",{className:cn(MODAL,"animate-qfade",MODAL_WIDTHS[size]),children:[jsxs("header",{className:MODAL_HEAD,children:[jsxs("div",{className:MODAL_HEAD_TEXT,children:[jsx("h2",{id:titleId,className:MODAL_TITLE,children:title}),description&&jsx("p",{className:MODAL_DESC,children:description})]}),jsx("button",{type:"button",onClick:onClose,"aria-label":closeLabel??ui.close,className:CLOSE_BTN,children:jsx(X,{size:17,"aria-hidden":"true"})})]}),children&&jsx("div",{className:cn(MODAL_BODY,"overflow-y-auto"),children}),footer&&jsx("footer",{className:MODAL_FOOT,children:footer})]})]})}function Drawer({open,title,description,onClose,footer,children,bodyClassName,closeLabel}){const ui=useUIText();const titleId=useId();useEffect(()=>{if(!open)return;function onKey(e){if(e.key==="Escape")onClose()}document.addEventListener("keydown",onKey);return()=>document.removeEventListener("keydown",onKey)},[open,onClose]);if(!open)return null;return jsxs("div",{className:DRAWER_LAYER_WEB,role:"dialog","aria-modal":"true","aria-labelledby":titleId,children:[jsx("button",{type:"button","aria-label":closeLabel??ui.close,onClick:onClose,className:cn(SCRIM_FILL,MODAL_SCRIM,"backdrop-blur-[2px] cursor-default")}),jsxs("aside",{className:cn(DRAWER,"animate-qfade"),children:[jsxs("header",{className:DRAWER_HEAD,children:[jsxs("span",{className:DRAWER_HEAD_TEXT,children:[jsx("span",{id:titleId,className:DRAWER_TITLE,children:title}),description&&jsx("span",{className:DRAWER_DESC,children:description})]}),jsx("button",{type:"button",onClick:onClose,"aria-label":closeLabel??ui.close,className:CLOSE_BTN,children:jsx(X,{size:17,"aria-hidden":"true"})})]}),children&&jsx("div",{className:cn(DRAWER_BODY,"overflow-y-auto",bodyClassName??DRAWER_BODY_PAD),children}),footer&&jsx("footer",{className:DRAWER_FOOT,children:footer})]})]})}var ALERT_ICON={neutral:Info,brand:Info,amber:AlertTriangle,green:CheckCircle2,red:XCircle,violet:Info};function Alert({tone="brand",title,children,actions}){const Icon=ALERT_ICON[tone];return jsxs("div",{role:isUrgent(tone)?"alert":"status",className:cn(ALERT,TONE_SOFT[tone],ALERT_BORDER[tone]),children:[jsx(Icon,{size:18,strokeWidth:2,"aria-hidden":"true"}),jsxs("div",{className:ALERT_BODY,children:[title&&jsx("span",{className:ALERT_TITLE,children:title}),children&&jsx("span",{className:cn(ALERT_TEXT,"[text-wrap:pretty]"),children}),actions&&jsx("span",{className:ALERT_ACTIONS,children:actions})]})]})}function Toast({children,action,icon}){return jsxs("div",{role:"status","aria-live":"polite",className:cn(TOAST,TOAST_WEB),children:[icon??jsx(CheckCircle2,{size:17,className:TOAST_ICON,"aria-hidden":"true"}),jsx("span",{className:TOAST_TEXT,children}),action]})}function EmptyState({icon:Icon,title,description,action}){return jsxs("div",{className:EMPTY,children:[Icon&&jsx("span",{"aria-hidden":"true",className:EMPTY_ICON,children:jsx(Icon,{size:21})}),jsx("span",{className:EMPTY_TITLE,children:title}),description&&jsx("span",{className:cn(EMPTY_DESC,"[text-wrap:pretty]"),children:description}),action&&jsx("span",{className:EMPTY_ACTION,children:action})]})}export{TEXT_SCALE,RADIUS_SCALE,SHADOW_SCALE,CONTAINER_SCALE,ANIMATE_SCALE,COLOR_SCALE,TOKENS,DARK_TOKENS,cn,TONE_SOFT,TONE_SOLID,toLatinDigits,buttonClasses,setLang,LocaleCtx,useMoneyLocale,useMoneyLang,useUIText,Sheet,Modal,Drawer,Alert,Toast,EmptyState};
|