@qumra/fanar 0.0.12 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
1
  "use client";
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};
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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qumra/fanar",
3
- "version": "0.0.12",
3
+ "version": "0.0.13",
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,6 +15,7 @@
15
15
  "exports": {
16
16
  ".": {
17
17
  "types": "./dist/index.d.ts",
18
+ "react-native": "./dist/native/index.js",
18
19
  "import": "./dist/index.js"
19
20
  },
20
21
  "./lib": {
@@ -27,18 +28,22 @@
27
28
  },
28
29
  "./orb": {
29
30
  "types": "./dist/orb.d.ts",
31
+ "react-native": "./dist/native/orb.js",
30
32
  "import": "./dist/orb.js"
31
33
  },
32
34
  "./editor": {
33
35
  "types": "./dist/editor.d.ts",
36
+ "react-native": "./dist/native/editor.js",
34
37
  "import": "./dist/editor.js"
35
38
  },
36
39
  "./notifications": {
37
40
  "types": "./dist/notifications.d.ts",
41
+ "react-native": "./dist/native/notifications.js",
38
42
  "import": "./dist/notifications.js"
39
43
  },
40
44
  "./ai": {
41
45
  "types": "./dist/ai.d.ts",
46
+ "react-native": "./dist/native/ai.js",
42
47
  "import": "./dist/ai.js"
43
48
  },
44
49
  "./editor.css": "./dist/editor.css",
@@ -68,8 +73,8 @@
68
73
  "@testing-library/react": "^16.3.2",
69
74
  "@testing-library/user-event": "^14.6.6",
70
75
  "@types/node": "^26.2.0",
71
- "@types/react": "^19.2.18",
72
- "@types/react-dom": "^19.2.4",
76
+ "@types/react": "^19.1.0",
77
+ "@types/react-dom": "^19.1.0",
73
78
  "@types/three": "^0.185.0",
74
79
  "@vitejs/plugin-react": "^6.1.0",
75
80
  "@vitest/coverage-v8": "^4.1.11",
@@ -79,12 +84,17 @@
79
84
  "eslint-plugin-react-hooks": "^7.1.1",
80
85
  "globals": "^17.11.0",
81
86
  "happy-dom": "^20.11.6",
87
+ "lucide-react-native": "^0.563.0",
82
88
  "prettier": "^3.9.6",
83
- "react": "^19.2.8",
84
- "react-dom": "^19.2.8",
89
+ "react": "19.1.0",
90
+ "react-dom": "19.1.0",
91
+ "react-native": "0.80.0",
92
+ "react-native-safe-area-context": "^5.9.1",
93
+ "react-native-svg": "^15.15.5",
85
94
  "size-limit": "^13.0.3",
86
95
  "three": "^0.185.1",
87
96
  "tsup": "^8.5.1",
97
+ "twrnc": "^4.16.0",
88
98
  "typescript": "^5.7.3",
89
99
  "typescript-eslint": "^8.67.0",
90
100
  "vitest": "^4.1.11"
@@ -126,10 +136,14 @@
126
136
  "@react-three/fiber": ">=9.0.0",
127
137
  "@types/react": "^19.0.0",
128
138
  "@types/react-dom": "^19.0.0",
139
+ "lucide-react-native": ">=0.400.0",
129
140
  "react": "^19.0.0",
130
141
  "react-dom": "^19.0.0",
142
+ "react-native": ">=0.80.0",
143
+ "react-native-svg": ">=15.0.0",
131
144
  "tailwindcss": "^4.0.0",
132
- "three": ">=0.171.0"
145
+ "three": ">=0.171.0",
146
+ "twrnc": ">=4.0.0"
133
147
  },
134
148
  "peerDependenciesMeta": {
135
149
  "@google/model-viewer": {
@@ -150,11 +164,23 @@
150
164
  "@types/react-dom": {
151
165
  "optional": true
152
166
  },
167
+ "lucide-react-native": {
168
+ "optional": true
169
+ },
170
+ "react-native": {
171
+ "optional": true
172
+ },
173
+ "react-native-svg": {
174
+ "optional": true
175
+ },
153
176
  "tailwindcss": {
154
177
  "optional": true
155
178
  },
156
179
  "three": {
157
180
  "optional": true
181
+ },
182
+ "twrnc": {
183
+ "optional": true
158
184
  }
159
185
  },
160
186
  "engines": {
@@ -1,2 +0,0 @@
1
- "use client";
2
- import{Coach,useCoachOptional}from"./chunk-GMIBQMMR.js";import{LocaleCtx,cn,useMoneyLocale,useUIText}from"./chunk-ZE4S6DBP.js";import{createContext,useContext}from"react";import{Fragment,jsx,jsxs}from"react/jsx-runtime";function Glyph({children,label,w=24}){return jsx("svg",{viewBox:`0 0 ${w} 24`,width:`${w/24}em`,height:"1em",fill:"none",stroke:"currentColor",strokeWidth:2.1,strokeLinecap:"round",strokeLinejoin:"round",role:"img","aria-label":label,className:"inline-block shrink-0 translate-y-[0.1em]",children})}var Dollar=jsxs(Glyph,{label:"\u062F\u0648\u0644\u0627\u0631",children:[jsx("path",{d:"M12 2.5v19"}),jsx("path",{d:"M16.5 7c0-1.9-2-3.2-4.5-3.2S7.5 5.1 7.5 7s2 2.8 4.5 3.4 4.5 1.5 4.5 3.4-2 3.2-4.5 3.2S7.5 15.7 7.5 13.8"})]});var Euro=jsxs(Glyph,{label:"\u064A\u0648\u0631\u0648",children:[jsx("path",{d:"M17.5 6.4A7 7 0 1 0 17.5 17.6"}),jsx("path",{d:"M3.5 10h10"}),jsx("path",{d:"M3.5 14h10"})]});var Pound=jsxs(Glyph,{label:"\u062C\u0646\u064A\u0647",children:[jsx("path",{d:"M16 6.2A3.7 3.7 0 0 0 9 7.8v6.4a5 5 0 0 1-2 4h11"}),jsx("path",{d:"M6 12h7"})]});var EgyptianPound=jsxs(Glyph,{label:"\u062C\u0646\u064A\u0647 \u0645\u0635\u0631\u064A",w:31,children:[jsx("path",{d:"M10.5 6H3.5v12h7"}),jsx("path",{d:"M3.5 12h5.5"}),jsx("path",{d:"M26.5 6.2A3.7 3.7 0 0 0 19.5 7.8v6.4a5 5 0 0 1-2 4h11"}),jsx("path",{d:"M16.5 12h7"})]});var Riyal=jsx("svg",{viewBox:"0 0 24 24",width:"1em",height:"1em",fill:"currentColor",role:"img","aria-label":"\u0631\u064A\u0627\u0644 \u0633\u0639\u0648\u062F\u064A",className:"inline-block shrink-0 translate-y-[0.08em]",children:jsx("path",{d:"M13.89 3.36L13.89 18.83L21.99 17.11C22.37 16.22 22.62 15.31 22.75 14.36L16.43 15.69L16.43 1.24C15.38 1.82 14.53 2.53 13.89 3.36M2.46 16.08L21.99 11.97C22.37 11.04 22.62 10.12 22.75 9.19L3.19 13.33C2.77 14.24 2.52 15.15 2.46 16.08M13.89 24.0L21.99 22.28C22.37 21.37 22.62 20.45 22.75 19.53L14.58 21.25C14.4 21.65 14.25 22.09 14.13 22.55C14.01 23.01 13.93 23.5 13.89 24.0M1.25 22.22L8.42 20.64C8.98 20.52 9.45 20.21 9.81 19.71L11.14 17.77C11.2 17.67 11.25 17.56 11.29 17.44C11.33 17.32 11.35 17.2 11.35 17.08L11.35 0.0C10.38 0.56 9.54 1.27 8.81 2.12L8.81 18.02L1.98 19.47C1.54 20.47 1.29 21.39 1.25 22.22"})});var CURRENCY={SAR:{short:"\u0631.\u0633",word:"\u0631\u064A\u0627\u0644",best:"sign",code:"SAR",sign:Riyal,name:"\u0631\u064A\u0627\u0644 \u0633\u0639\u0648\u062F\u064A",en:"Saudi riyals",decimals:2},AED:{short:"\u062F.\u0625",word:"\u062F\u0631\u0647\u0645",best:"word",code:"AED",sign:null,name:"\u062F\u0631\u0647\u0645 \u0625\u0645\u0627\u0631\u0627\u062A\u064A",en:"UAE dirhams",decimals:2},QAR:{short:"\u0631.\u0642",word:"\u0631\u064A\u0627\u0644",best:"word",code:"QAR",sign:null,name:"\u0631\u064A\u0627\u0644 \u0642\u0637\u0631\u064A",en:"Qatari riyals",decimals:2},KWD:{short:"\u062F.\u0643",word:"\u062F\u064A\u0646\u0627\u0631",best:"word",code:"KWD",sign:null,name:"\u062F\u064A\u0646\u0627\u0631 \u0643\u0648\u064A\u062A\u064A",en:"Kuwaiti dinars",decimals:3},BHD:{short:"\u062F.\u0628",word:"\u062F\u064A\u0646\u0627\u0631",best:"word",code:"BHD",sign:null,name:"\u062F\u064A\u0646\u0627\u0631 \u0628\u062D\u0631\u064A\u0646\u064A",en:"Bahraini dinars",decimals:3},OMR:{short:"\u0631.\u0639",word:"\u0631\u064A\u0627\u0644",best:"word",code:"OMR",sign:null,name:"\u0631\u064A\u0627\u0644 \u0639\u0645\u0627\u0646\u064A",en:"Omani riyals",decimals:3},EGP:{short:"\u062C.\u0645",word:"\u062C\u0646\u064A\u0647",best:"word",code:"EGP",sign:EgyptianPound,name:"\u062C\u0646\u064A\u0647 \u0645\u0635\u0631\u064A",en:"Egyptian pounds",decimals:2},JOD:{short:"\u062F.\u0623",word:"\u062F\u064A\u0646\u0627\u0631",best:"word",code:"JOD",sign:null,name:"\u062F\u064A\u0646\u0627\u0631 \u0623\u0631\u062F\u0646\u064A",en:"Jordanian dinars",decimals:3},IQD:{short:"\u062F.\u0639",word:"\u062F\u064A\u0646\u0627\u0631",best:"word",code:"IQD",sign:null,name:"\u062F\u064A\u0646\u0627\u0631 \u0639\u0631\u0627\u0642\u064A",en:"Iraqi dinars",decimals:3},LBP:{short:"\u0644.\u0644",word:"\u0644\u064A\u0631\u0629",best:"word",code:"LBP",sign:null,name:"\u0644\u064A\u0631\u0629 \u0644\u0628\u0646\u0627\u0646\u064A\u0629",en:"Lebanese pounds",decimals:2},SYP:{short:"\u0644.\u0633",word:"\u0644\u064A\u0631\u0629",best:"word",code:"SYP",sign:null,name:"\u0644\u064A\u0631\u0629 \u0633\u0648\u0631\u064A\u0629",en:"Syrian pounds",decimals:2},YER:{short:"\u0631.\u064A",word:"\u0631\u064A\u0627\u0644",best:"word",code:"YER",sign:null,name:"\u0631\u064A\u0627\u0644 \u064A\u0645\u0646\u064A",en:"Yemeni rials",decimals:2},SDG:{short:"\u062C.\u0633",word:"\u062C\u0646\u064A\u0647",best:"word",code:"SDG",sign:null,name:"\u062C\u0646\u064A\u0647 \u0633\u0648\u062F\u0627\u0646\u064A",en:"Sudanese pounds",decimals:2},MAD:{short:"\u062F.\u0645",word:"\u062F\u0631\u0647\u0645",best:"word",code:"MAD",sign:null,name:"\u062F\u0631\u0647\u0645 \u0645\u063A\u0631\u0628\u064A",en:"Moroccan dirhams",decimals:2},DZD:{short:"\u062F.\u062C",word:"\u062F\u064A\u0646\u0627\u0631",best:"word",code:"DZD",sign:null,name:"\u062F\u064A\u0646\u0627\u0631 \u062C\u0632\u0627\u0626\u0631\u064A",en:"Algerian dinars",decimals:2},TND:{short:"\u062F.\u062A",word:"\u062F\u064A\u0646\u0627\u0631",best:"word",code:"TND",sign:null,name:"\u062F\u064A\u0646\u0627\u0631 \u062A\u0648\u0646\u0633\u064A",en:"Tunisian dinars",decimals:3},LYD:{short:"\u062F.\u0644",word:"\u062F\u064A\u0646\u0627\u0631",best:"word",code:"LYD",sign:null,name:"\u062F\u064A\u0646\u0627\u0631 \u0644\u064A\u0628\u064A",en:"Libyan dinars",decimals:3},MRU:{short:"\u0623.\u0645",word:"\u0623\u0648\u0642\u064A\u0629",best:"word",code:"MRU",sign:null,name:"\u0623\u0648\u0642\u064A\u0629 \u0645\u0648\u0631\u064A\u062A\u0627\u0646\u064A\u0629",en:"Mauritanian ouguiya",decimals:2},SOS:{short:"\u0634.\u0635",word:"\u0634\u0644\u0646",best:"word",code:"SOS",sign:null,name:"\u0634\u0644\u0646 \u0635\u0648\u0645\u0627\u0644\u064A",en:"Somali shillings",decimals:0},DJF:{short:"\u0641.\u062C",word:"\u0641\u0631\u0646\u0643",best:"word",code:"DJF",sign:null,name:"\u0641\u0631\u0646\u0643 \u062C\u064A\u0628\u0648\u062A\u064A",en:"Djiboutian francs",decimals:0},KMF:{short:"\u0641.\u0642",word:"\u0641\u0631\u0646\u0643",best:"word",code:"KMF",sign:null,name:"\u0641\u0631\u0646\u0643 \u0642\u0645\u0631\u064A",en:"Comorian francs",decimals:0},USD:{short:"$",word:"\u062F\u0648\u0644\u0627\u0631",best:"sign",code:"USD",sign:Dollar,name:"\u062F\u0648\u0644\u0627\u0631 \u0623\u0645\u0631\u064A\u0643\u064A",en:"US dollars",decimals:2},EUR:{short:"\u20AC",word:"\u064A\u0648\u0631\u0648",best:"sign",code:"EUR",sign:Euro,name:"\u064A\u0648\u0631\u0648",en:"euros",decimals:2},GBP:{short:"\xA3",word:"\u0625\u0633\u062A\u0631\u0644\u064A\u0646\u064A",best:"sign",code:"GBP",sign:Pound,name:"\u062C\u0646\u064A\u0647 \u0625\u0633\u062A\u0631\u0644\u064A\u0646\u064A",en:"pounds sterling",decimals:2}};function isCurrency(c){return!!c&&c in CURRENCY}var CurrencyCtx=createContext(null);function MoneyProvider({currency,locale,children}){return jsx(CurrencyCtx.Provider,{value:currency,children:jsx(LocaleCtx.Provider,{value:locale??null,children})})}function useCurrency(){return useContext(CurrencyCtx)??"EGP"}function resolve(style,c,locale){if(style!=="best")return style;if(locale.startsWith("ar"))return c.best;return c.sign?"sign":"code"}var UNIT={short:"text-[0.82em]",word:"text-[0.86em] font-normal tracking-wide",code:"text-[0.78em] font-bold tracking-wide",sign:"text-[0.9em]"};var SIZE={inherit:"",sm:"text-caption",md:"text-ui",lg:"text-body font-extrabold",xl:"text-h2 font-black"};var TONE={inherit:"",muted:"text-muted",ink:"text-ink",green:"text-green",red:"text-red"};function Money({value,currency,size="md",tone="inherit",signed,compact,trimZeros,was,symbol,hideSymbol,className}){const locale=useMoneyLocale();const isEn=locale.startsWith("en");const store=useCurrency();const c=CURRENCY[currency??store];const decimals=c.decimals;const style=resolve(symbol??"best",c,locale);const unit=style==="code"?c.code:style==="word"?c.word:style==="sign"?c.sign??c.short:c.short;return jsxs("span",{className:cn("inline-flex items-baseline gap-1 whitespace-nowrap",SIZE[size],TONE[tone],className),children:[jsx("span",{"data-num":true,children:format(value,decimals,locale,{signed,compact,trimZeros})}),!hideSymbol&&jsxs(Fragment,{children:[jsx("span",{"aria-hidden":"true",className:cn("opacity-65",UNIT[style]),children:unit}),jsx("span",{className:"sr-only",children:locale.startsWith("ar")?c.name:isEn?c.en:c.code})]}),was!==void 0&&was!==value&&jsx("span",{className:"text-[0.82em] text-muted2 line-through decoration-1",children:jsx("span",{"data-num":true,children:format(was,decimals,locale,{compact,trimZeros})})})]})}function format(v,decimals,locale,{signed,compact,trimZeros}){const whole=trimZeros&&Number.isInteger(v);const nf=new Intl.NumberFormat(locale,compact?{notation:"compact",minimumFractionDigits:0,maximumFractionDigits:1}:{minimumFractionDigits:whole?0:decimals,maximumFractionDigits:whole?0:decimals});const sign=v<0?"\u2212":signed&&v>0?"+":"";return sign+nf.format(Math.abs(v))}function currencySymbol(c="EGP",style="best",locale="ar"){const cur=CURRENCY[c];const s=resolve(style,cur,locale);if(s==="code")return cur.code;if(s==="word")return cur.word;if(s==="sign")return cur.sign??cur.short;return cur.short}var currencyName=(c="EGP")=>CURRENCY[c].name;function useCurrencySymbol(c,style){const locale=useMoneyLocale();const store=useCurrency();return currencySymbol(c??store,style??"best",locale)}import{useState}from"react";import{ChevronLeft,ChevronRight}from"lucide-react";import{jsx as jsx2,jsxs as jsxs2}from"react/jsx-runtime";function DataTable({columns,rows,rowKey,grid,minWidth,onRowClick,mobileCard,empty,footer,pageSize,unit,className}){const ui=useUIText();const gridClass=`grid-cols-[${grid}]`;const[page,setPage]=useState(0);const pages=pageSize?Math.max(1,Math.ceil(rows.length/pageSize)):1;const safePage=Math.min(page,Math.max(0,pages-1));const shown=pageSize?rows.slice(safePage*pageSize,safePage*pageSize+pageSize):rows;if(rows.length===0&&empty){return jsx2("div",{className:cn("bg-surface border border-line rounded-card",className),children:empty})}return jsxs2("div",{role:"table",className:cn("bg-surface border border-line rounded-card overflow-clip",className),children:[mobileCard&&jsx2("ul",{className:"md:hidden flex flex-col m-0 p-0 list-none",children:shown.map(row=>jsx2("li",{className:"border-b border-line last:border-0",children:onRowClick?jsx2("button",{type:"button",onClick:()=>onRowClick(row),className:"w-full text-start px-4 py-3 cursor-pointer transition-colors active:bg-hover focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-brand",children:mobileCard(row)}):jsx2("div",{className:"px-4 py-3",children:mobileCard(row)})},rowKey(row)))}),jsx2("div",{className:cn("overflow-x-auto",mobileCard&&"max-md:hidden"),children:jsxs2("div",{style:{minWidth},children:[jsx2("div",{role:"row",className:cn("grid gap-3 items-center px-4 py-3 bg-bg border-b border-line",gridClass),style:{gridTemplateColumns:grid.replace(/_/g," ")},children:columns.map(c=>jsx2("span",{role:"columnheader",className:cn("text-caption font-bold text-muted",c.end&&"text-end"),children:c.header},c.key))}),shown.map(row=>jsx2("div",{role:"row",tabIndex:onRowClick?0:void 0,onKeyDown:onRowClick?e=>{if(e.key==="Enter"||e.key===" "){e.preventDefault();onRowClick(row)}}:void 0,onClick:onRowClick?()=>onRowClick(row):void 0,className:cn("grid gap-3 items-center px-4 py-3 border-b border-line last:border-0 transition-colors",onRowClick&&"cursor-pointer hover:bg-hover focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-brand",!onRowClick&&"hover:bg-hover"),style:{gridTemplateColumns:grid.replace(/_/g," ")},children:columns.map(c=>jsx2("span",{role:"cell",className:cn("min-w-0",c.end&&"flex justify-end"),children:c.cell(row)},c.key))},rowKey(row)))]})}),(footer||pageSize)&&jsxs2("div",{className:"flex items-center justify-between gap-3 px-4 py-3 bg-bg flex-wrap",children:[footer,pageSize&&jsx2(Pager,{page:safePage,pages,from:page*pageSize+1,to:Math.min(rows.length,(page+1)*pageSize),total:rows.length,unit:unit??ui.row,onPage:setPage})]})]})}function Pager({page,pages,from,to,total,unit,onPage}){const ar=new Intl.NumberFormat("ar-EG");const first=page===0;const last=page>=pages-1;const btn=dir=>{const off=dir===-1?first:last;return jsx2("button",{type:"button",disabled:off,"aria-label":dir===-1?"\u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u0633\u0627\u0628\u0642\u0629":"\u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u062A\u0627\u0644\u064A\u0629",onClick:()=>onPage(page+dir),className:cn("size-8 rounded-sm flex items-center justify-center transition-colors",off?"text-muted2/40 cursor-not-allowed":"text-ink2 hover:bg-hover cursor-pointer"),children:dir===-1?jsx2(ChevronRight,{size:16,className:"rtl:rotate-0 ltr:rotate-180","aria-hidden":"true"}):jsx2(ChevronLeft,{size:16,className:"rtl:rotate-0 ltr:rotate-180","aria-hidden":"true"})})};return jsxs2("div",{className:"flex items-center gap-2 ms-auto",children:[jsxs2("span",{className:"text-caption text-muted",children:[jsxs2("span",{"data-num":true,className:"font-bold text-ink2",children:[ar.format(from),"\u2013",ar.format(to)]})," ","\u0645\u0646"," ",jsx2("span",{"data-num":true,className:"font-bold text-ink2",children:ar.format(total)})," ",unit]}),jsx2("span",{"aria-live":"polite",className:"sr-only",children:`\u0639\u0631\u0636 ${from} \u0625\u0644\u0649 ${to} \u0645\u0646 ${total}`}),btn(-1),btn(1)]})}import{useEffect,useId,useMemo,useRef,useState as useState2}from"react";import{scaleLinear}from"@visx/scale";import{AreaClosed,LinePath}from"@visx/shape";import{curveMonotoneX}from"@visx/curve";import{TooltipWithBounds}from"@visx/tooltip";import{Fragment as Fragment2,jsx as jsx3,jsxs as jsxs3}from"react/jsx-runtime";var clamp=(v,lo=0,hi=100)=>Math.min(hi,Math.max(lo,v));function BarChart({labels,series,height=180,formatValue=String,className}){const peak=Math.max(1,...series.flatMap(s=>s.values));const plot=height-26;return jsxs3("div",{className:cn("flex flex-col gap-2.5",className),children:[series.length>1&&jsx3("div",{className:"flex items-center gap-4 text-micro text-muted",children:series.map(s=>jsxs3("span",{className:"flex items-center gap-1.5",children:[jsx3("span",{"aria-hidden":"true",className:cn("size-2.5 rounded-mark",s.muted?"bg-brand-100":"bg-brand")}),s.label]},s.label))}),jsx3("div",{className:"flex items-end gap-1.5",style:{height},role:"img","aria-label":labels.join("\u060C "),children:labels.map((label,i)=>jsxs3("div",{className:"flex-1 flex flex-col items-center justify-end gap-1.5 h-full min-w-0",children:[jsx3("span",{className:"w-full flex items-end justify-center gap-[3px]",style:{height:plot},children:series.map(s=>jsx3("span",{title:`${label} \xB7 ${s.label}: ${formatValue(s.values[i]??0)}`,className:cn("rounded-t-mark transition-[height] duration-300",series.length>1?"w-1/2":"w-3/5",s.muted?"bg-brand-100":"bg-brand"),style:{height:Math.max(2,Math.round((s.values[i]??0)/peak*plot))}},s.label))}),jsx3("span",{className:"text-micro text-muted2 truncate max-w-full",children:label})]},label))})]})}function TrendChart({labels,values,compare,pointLabels,mode="area",height=200,formatValue=String,compareLabel,className}){const ui=useUIText();const gid=useId().replace(/:/g,"");const plot=useRef(null);const[w,setW]=useState2(0);const[at,setAt]=useState2(null);const H=height-24;const PAD_T=6;useEffect(()=>{const el=plot.current;if(!el)return;const measure=()=>setW(el.clientWidth);measure();const ro=new ResizeObserver(measure);ro.observe(el);return()=>ro.disconnect()},[]);const max=Math.max(1,...values,...compare??[]);const n=values.length;const nameAt=i=>pointLabels?.[i]??(labels.length===n?labels[i]:void 0);const slot=n>0?w/n:w;const bw=slot*.62;const inset=mode==="bars"?slot/2:0;const x=useMemo(()=>scaleLinear({domain:[0,Math.max(1,n-1)],range:[inset,w-inset]}),[n,w,inset]);const y=useMemo(()=>scaleLinear({domain:[0,max],range:[H,PAD_T]}),[max,H]);function pick(clientX){const el=plot.current;if(!el||!w)return;const rect=el.getBoundingClientRect();const i=Math.round(x.invert(clientX-rect.left));setAt(Math.min(n-1,Math.max(0,i)))}function onKey(e){const step=e.key==="ArrowRight"?1:e.key==="ArrowLeft"?-1:0;if(step){e.preventDefault();setAt(p=>Math.min(n-1,Math.max(0,(p??0)+step)))}else if(e.key==="Home"){e.preventDefault();setAt(0)}else if(e.key==="End"){e.preventDefault();setAt(n-1)}else if(e.key==="Escape"){setAt(null)}}return jsxs3("div",{className:cn("flex flex-col gap-2",className),children:[jsxs3("div",{ref:plot,dir:"ltr",className:"relative outline-none focus-visible:ring-2 focus-visible:ring-brand/40 rounded-xs",style:{height:H},tabIndex:0,role:"img","aria-label":`${labels[0]} \u2014 ${labels[labels.length-1]}`,onKeyDown:onKey,onPointerMove:e=>pick(e.clientX),onPointerLeave:()=>setAt(null),onBlur:()=>setAt(null),children:[[1,.5,0].map(f=>jsx3("span",{"aria-hidden":"true",className:"absolute inset-x-0 border-t border-line flex items-start",style:{top:y(max*f)},children:jsx3("span",{"data-num":true,dir:"auto",className:"text-micro text-muted2 -mt-2 bg-surface pe-1",children:formatValue(Math.round(max*f))})},f)),jsxs3("svg",{width:w,height:H,className:"absolute inset-0","aria-hidden":"true",children:[jsx3("defs",{children:jsxs3("linearGradient",{id:`g${gid}`,x1:"0",y1:"0",x2:"0",y2:"1",children:[jsx3("stop",{offset:"0%",stopColor:"currentColor",stopOpacity:"0.16"}),jsx3("stop",{offset:"100%",stopColor:"currentColor",stopOpacity:"0"})]})}),mode==="area"?jsxs3(Fragment2,{children:[jsx3(AreaClosed,{data:values,x:(_,i)=>x(i),y:v=>y(v),yScale:y,curve:curveMonotoneX,className:"text-brand",fill:`url(#g${gid})`,stroke:"none"}),jsx3(LinePath,{data:values,x:(_,i)=>x(i),y:v=>y(v),curve:curveMonotoneX,fill:"none",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",className:"stroke-brand"})]}):values.map((v,i)=>jsx3("rect",{x:x(i)-bw/2,y:y(v),width:bw,height:Math.max(2,H-y(v)),rx:3,className:at===i?"fill-brand":"fill-brand-100"},i)),compare&&jsx3(LinePath,{data:compare,x:(_,i)=>x(i),y:v=>y(v),curve:curveMonotoneX,fill:"none",strokeWidth:1.5,strokeDasharray:"3 3",strokeLinecap:"round",className:"stroke-brand-100"}),at!==null&&jsxs3(Fragment2,{children:[jsx3("line",{x1:x(at),y1:0,x2:x(at),y2:H,strokeWidth:1,strokeDasharray:"4 4",className:"stroke-brand opacity-45"}),mode==="area"&&jsx3("circle",{cx:x(at),cy:y(values[at]),r:5,strokeWidth:3,className:"fill-surface stroke-brand"})]})]}),at!==null&&w>0&&jsxs3(TooltipWithBounds,{unstyled:true,applyPositionStyle:true,left:x(at),top:y(values[at]),dir:"rtl",className:"pointer-events-none rounded-sm border border-line bg-surface px-2.5 py-1.5 shadow-tip flex flex-col gap-0.5",children:[nameAt(at)&&jsx3("span",{className:"text-micro text-muted2",children:nameAt(at)}),jsx3("span",{"data-num":true,className:"text-caption font-extrabold text-ink",children:formatValue(values[at])}),compare?.[at]!==void 0&&jsxs3("span",{"data-num":true,className:"text-micro text-muted2",children:[compareLabel??ui.previousPeriod,": ",formatValue(compare[at])]})]})]}),jsx3("span",{className:"sr-only","aria-live":"polite",children:at!==null?[nameAt(at),formatValue(values[at])].filter(Boolean).join(": "):""}),jsx3("ul",{className:"sr-only",children:values.map((v,i)=>jsx3("li",{children:[nameAt(i),formatValue(v)].filter(Boolean).join(": ")},i))}),jsx3("div",{dir:"ltr",className:"flex items-center justify-between text-micro text-muted2",children:labels.map(l=>jsx3("span",{children:l},l))})]})}function FunnelChart({stages,formatValue=String,className}){const top=Math.max(1,stages[0]?.value??1);const drops=stages.map((s,i)=>{if(i===0)return null;const prev=stages[i-1].value;return prev>0?(prev-s.value)/prev*100:0});const worst=drops.reduce((acc,d,i)=>d!==null&&d>acc.d?{i,d}:acc,{i:-1,d:-1});return jsxs3("div",{className:cn("flex flex-col",className),children:[stages.map((s,i)=>{const share=clamp(s.value/top*100);const drop=drops[i];const isWorst=i===worst.i;return jsxs3("div",{className:"flex flex-col",children:[drop!==null&&jsxs3("span",{className:cn("flex items-center gap-1.5 ps-1 py-1 text-micro",isWorst?"font-extrabold text-amber-ink":"text-muted2"),children:[jsx3("span",{"aria-hidden":"true",className:cn("w-px h-3",isWorst?"bg-amber":"bg-line")}),jsxs3("span",{"data-num":true,children:["\u2212",drop.toFixed(0),"%"]}),isWorst&&jsx3("span",{children:"\xB7 \u0623\u0643\u0628\u0631 \u062A\u0633\u0631\u0651\u0628"})]}),jsxs3("div",{className:"flex items-center gap-3",children:[jsx3("span",{className:"w-32 sm:w-40 shrink-0 text-ui text-ink2 truncate",children:s.label}),jsx3("span",{className:"flex-1 h-8 rounded-xs bg-hover overflow-clip",children:jsx3("span",{className:cn("block h-full rounded-xs transition-[width] duration-500",isWorst?"bg-amber":"bg-brand"),style:{width:`${share}%`}})}),jsx3("span",{"data-num":true,className:"w-20 shrink-0 text-ui font-extrabold text-ink text-end",children:formatValue(s.value)})]})]},s.key)}),worst.i>0&&stages[worst.i].advice&&jsx3("span",{className:"mt-3 flex items-start gap-2 p-3 rounded-field bg-amber-bg text-caption leading-[1.7] text-amber-ink",children:stages[worst.i].advice})]})}function Heatmap({rows,cols,values,formatCell=v=>String(v),lowLabel,highLabel,className}){const ui=useUIText();const peak=Math.max(1,...values.flat());const step=v=>v===0?0:Math.min(3,Math.ceil(v/peak*3));const TINT=["bg-hover","bg-brand/25","bg-brand/55","bg-brand"];const grid={gridTemplateColumns:`56px repeat(${cols.length}, minmax(0,1fr))`};return jsxs3("div",{className:cn("flex flex-col gap-1",className),children:[jsxs3("span",{className:"grid gap-1",style:grid,children:[jsx3("span",{}),cols.map(c=>jsx3("span",{"data-num":true,className:"text-micro text-muted2 text-center",children:c},c))]}),rows.map((r,ri)=>jsxs3("span",{className:"grid gap-1 items-center",style:grid,children:[jsx3("span",{className:"text-micro text-muted truncate",children:r}),cols.map((c,ci)=>{const v=values[ri]?.[ci]??0;return jsx3("span",{title:formatCell(v,r,c),className:cn("h-6 rounded-mark transition-colors",TINT[step(v)])},c)})]},r)),jsxs3("span",{className:"flex items-center gap-2 pt-1 text-micro text-muted2",children:[lowLabel??ui.less,jsx3("span",{className:"flex gap-1",children:TINT.map(c=>jsx3("span",{className:cn("size-3 rounded-mark",c)},c))}),highLabel??ui.more]})]})}var SHARE_FILL={brand:"bg-brand",amber:"bg-amber",red:"bg-danger",muted:"bg-border"};function ShareList({items,total,layout="stacked",showPercent=true,labelWidth="6rem",formatValue=String,className}){const sum=total??items.reduce((s,i)=>s+i.value,0);const inline=layout==="inline";return jsx3("div",{className:cn("flex flex-col",inline?"gap-1.5":"gap-3",className),children:items.map(it=>{const pct=sum>0?it.value/sum*100:0;const bar=jsx3("span",{className:cn("rounded-full bg-hover overflow-clip",inline?"flex-1 h-1.5 min-w-0":"block h-1.5"),children:jsx3("span",{className:cn("block h-full rounded-full transition-[width] duration-500",SHARE_FILL[it.tone??"brand"]),style:{width:`${clamp(pct)}%`}})});if(inline){return jsxs3("span",{className:"flex items-center gap-2.5",children:[jsx3("span",{style:{width:labelWidth},className:"shrink-0 text-micro text-muted truncate",children:it.label}),bar,jsx3("span",{"data-num":true,style:{width:labelWidth},className:"shrink-0 text-caption text-muted2 text-end truncate",children:it.trailing??formatValue(it.value)})]},it.key)}return jsxs3("span",{className:"flex flex-col gap-1.5",children:[jsxs3("span",{className:"flex items-center justify-between gap-3",children:[jsxs3("span",{className:"flex flex-col min-w-0",children:[jsx3("span",{className:"text-ui font-bold text-ink truncate",children:it.label}),it.meta&&jsx3("span",{className:"text-micro text-muted truncate",children:it.meta})]}),jsxs3("span",{className:"flex items-center gap-3 shrink-0",children:[it.trailing,jsx3("span",{"data-num":true,className:"text-ui font-extrabold text-ink min-w-[64px] text-end",children:formatValue(it.value)}),showPercent&&jsxs3("span",{"data-num":true,className:"text-micro text-muted2 w-9 text-end",children:[pct.toFixed(0),"%"]})]})]}),bar]},it.key)})})}import{Check,Info,Lock}from"lucide-react";import{jsx as jsx4,jsxs as jsxs4}from"react/jsx-runtime";function ChoiceCards({name,value,onChange,options,columns=1,hideMark,multiple,disabled:allDisabled,className}){const ui=useUIText();const coach=useCoachOptional();const cols={1:"",2:"sm:grid-cols-2",3:"sm:grid-cols-3"}[columns];const picked=Array.isArray(value)?new Set(value):null;return jsx4("div",{role:multiple?"group":"radiogroup",className:cn("grid gap-2.5",cols,className),children:options.map(o=>{const on=picked?picked.has(o.value):o.value===value;const off=o.disabled||allDisabled;const card=jsxs4("label",{className:cn("relative flex items-start gap-3 p-3.5 rounded-card border transition-colors",off?"border-line bg-bg cursor-not-allowed opacity-70":"cursor-pointer hover:border-brand",on&&!off?"border-brand bg-soft":"border-border bg-surface"),children:[jsx4("input",{type:multiple?"checkbox":"radio",name,value:o.value,checked:on,disabled:off,onChange:()=>onChange(o.value),className:"sr-only peer"}),!hideMark&&jsx4("span",{"aria-hidden":"true",className:cn("mt-0.5 size-[19px] border-[1.5px] flex items-center justify-center shrink-0 transition-colors",multiple?"rounded-mark":"rounded-full","peer-focus-visible:outline-2 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-brand",on&&!off?"border-brand bg-brand":"border-border bg-surface"),children:on&&!off&&jsx4(Check,{size:12,strokeWidth:3,className:"text-white"})}),o.icon&&jsx4("span",{"aria-hidden":"true",className:cn("size-9 rounded-field flex items-center justify-center shrink-0 transition-colors",on&&!off?"bg-brand text-white":"bg-hover text-muted"),children:jsx4(o.icon,{size:17,strokeWidth:2})}),jsxs4("span",{className:"flex-1 min-w-0 flex flex-col gap-0.5",children:[jsx4("span",{className:"text-body font-extrabold text-ink",children:o.label}),o.meta&&jsx4("span",{className:"text-caption leading-[1.6] text-muted",children:o.meta}),off&&o.lockReason&&jsxs4("span",{className:"inline-flex items-center gap-1 mt-1 text-caption font-bold text-amber-ink",children:[jsx4(Lock,{size:11,"aria-hidden":"true"}),o.lockReason]})]}),o.price&&jsx4("span",{"data-num":true,className:"text-ui font-extrabold text-ink shrink-0",children:o.price}),o.coachId&&coach&&jsx4("button",{type:"button",onClick:e=>{e.preventDefault();e.stopPropagation();coach.replay(o.coachId)},"aria-label":typeof o.label==="string"?`\u0645\u0627 \u0645\u0639\u0646\u0649 \xAB${o.label}\xBB\u061F`:"\u0645\u0627 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631\u061F",title:ui.whatIsThisOption,className:cn("self-start ms-auto -me-1 -mt-1 size-7 rounded-full shrink-0 flex items-center justify-center","text-brand cursor-pointer transition-colors","hover:bg-soft hover:text-brand-hover","focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand"),children:jsx4(Info,{size:15,strokeWidth:2,"aria-hidden":"true"})})]});return o.coachId&&coach?jsx4(Coach,{id:o.coachId,children:card},o.value):jsx4("span",{className:"contents",children:card},o.value)})})}function Sparkline({values,width=72,height=24,tone="brand",fluid,className}){if(values.length<2)return null;const max=Math.max(...values);const min=Math.min(...values);const span=max-min||1;const step=width/(values.length-1);const points=values.map((v,i)=>{const x=i*step;const y=height-(v-min)/span*(height-3)-1.5;return[x,y]});const line=points.map(([x,y],i)=>`${i===0?"M":"L"}${x.toFixed(1)},${y.toFixed(1)}`).join(" ");const area=`${line} L${width},${height} L0,${height} Z`;const stroke={brand:"stroke-brand",green:"stroke-green",red:"stroke-danger",muted:"stroke-muted2"}[tone];const fill={brand:"fill-brand/10",green:"fill-green/10",red:"fill-danger/10",muted:"fill-muted2/10"}[tone];return jsxs4("svg",{width:fluid?void 0:width,height:fluid?void 0:height,viewBox:`0 0 ${width} ${height}`,preserveAspectRatio:fluid?"none":void 0,"aria-hidden":"true",style:{direction:"ltr"},className:cn(fluid?"w-full block":"shrink-0","overflow-visible",className),children:[jsx4("path",{d:area,className:cn("stroke-none",fill)}),jsx4("path",{d:line,fill:"none",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",vectorEffect:"non-scaling-stroke",className:stroke})]})}export{isCurrency,MoneyProvider,useCurrency,Money,currencySymbol,currencyName,useCurrencySymbol,DataTable,BarChart,TrendChart,FunnelChart,Heatmap,ShareList,ChoiceCards,Sparkline};
@@ -1,2 +0,0 @@
1
- "use client";
2
- import{cn,useUIText}from"./chunk-ZE4S6DBP.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";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?6500:3800);setToasts(prev=>[...prev.slice(-3),{...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};var TOAST_ACCENT={neutral:"text-muted2",brand:"text-brand-100",green:"text-mint",amber:"text-amber",red:"text-red-100"};function ToastHost({toasts,onDismiss,closeLabel}){const ui=useUIText();if(toasts.length===0)return null;return jsx("div",{role:"region","aria-label":ui.alerts,className:"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",children:toasts.map(t=>{const Icon=TOAST_ICON[t.tone];return jsxs("div",{role:t.tone==="red"?"alert":"status",className:"pointer-events-auto flex items-start gap-3 p-3.5 rounded-card bg-night text-white shadow-toast animate-[toast-in_.22s_cubic-bezier(.22,.61,.36,1)]",children:[jsx("span",{"aria-hidden":"true",className:cn("shrink-0 mt-0.5",TOAST_ACCENT[t.tone]),children:t.pending?jsx(Loader2,{size:17,className:"animate-spin"}):jsx(Icon,{size:17})}),jsxs("span",{className:"flex-1 min-w-0 flex flex-col gap-0.5",children:[jsx("span",{className:"text-ui font-bold leading-snug",children:t.title}),t.description&&jsx("span",{className:"text-caption leading-[1.6] text-white/65",children:t.description})]}),t.actionLabel&&jsx("button",{type:"button",onClick:()=>{t.onAction?.();onDismiss(t.id)},className:"shrink-0 text-ui font-extrabold text-mint cursor-pointer hover:underline underline-offset-4",children:t.actionLabel}),jsx("button",{type:"button",onClick:()=>onDismiss(t.id),"aria-label":closeLabel??ui.close,className:"shrink-0 text-white/40 hover:text-white cursor-pointer transition-colors",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] 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","animate-[fade-in_.12s_ease-out] pointer-events-none"),children:content}),document.body)]})}export{useToasts,ToastHost,Tooltip};
@@ -1,2 +0,0 @@
1
- "use client";
2
- import{buttonClasses,cn,toLatinDigits}from"./chunk-ZE4S6DBP.js";import{forwardRef}from"react";import{Loader2}from"lucide-react";import{jsx,jsxs}from"react/jsx-runtime";var ICON_ONLY={sm:"w-9 px-0!",md:"w-10 px-0!",lg:"w-12 px-0!",xl:"w-14 px-0!"};var SPINNER={sm:14,md:15,lg:17,xl:20};var Button=forwardRef(function Button2({variant="primary",size="md",icon,iconEnd,iconOnly,loading,block,disabled,className,children,type="button",...rest},ref){return jsxs("button",{ref,type,disabled:disabled||loading,"aria-busy":loading||void 0,className:buttonClasses(variant,size,cn("disabled:opacity-50 disabled:cursor-not-allowed",iconOnly&&ICON_ONLY[size],block&&"w-full",className)),...rest,children:[loading?jsx(Loader2,{size:SPINNER[size],className:"animate-spin shrink-0","aria-hidden":"true"}):icon&&jsx("span",{className:"flex shrink-0",children:icon}),!iconOnly&&children,!loading&&iconEnd&&jsx("span",{className:"flex shrink-0",children:iconEnd})]})});import{forwardRef as forwardRef2,useId}from"react";import{AlertCircle,Check,ChevronDown,Minus,Search}from"lucide-react";import{jsx as jsx2,jsxs as jsxs2}from"react/jsx-runtime";function FieldShell({id,label,labelAside,labelSize,hint,error,required,hideLabel,className,children}){const labelEl=label&&jsxs2("label",{htmlFor:id,className:cn(labelSize??"text-ui","font-bold text-ink2",hideLabel&&"sr-only"),children:[label,required&&jsx2("span",{className:"text-danger ms-1","aria-hidden":"true",children:"*"})]});return jsxs2("div",{className:cn("flex flex-col gap-1.5",className),children:[labelAside?jsxs2("div",{className:"flex items-center justify-between gap-3 flex-wrap",children:[labelEl,labelAside]}):labelEl,children,error?jsxs2("span",{id:`${id}-error`,role:"alert",className:"flex items-center gap-1.5 text-caption text-red",children:[jsx2(AlertCircle,{size:12,className:"shrink-0","aria-hidden":"true"}),error]}):hint?jsx2("span",{id:`${id}-hint`,className:"text-caption text-muted",children:hint}):null]})}var SIZES={sm:"h-9 text-ui",md:"h-11 text-body",lg:"h-14 text-base border-[1.5px]!"};var base=invalid=>cn("w-full bg-surface text-ink rounded-field border transition-colors outline-none","placeholder:text-muted2","focus:border-brand","disabled:bg-bg disabled:text-muted disabled:cursor-not-allowed",invalid?"border-danger":"border-border hover:border-brand");var Input=forwardRef2(function Input2({label,labelAside,hint,error,size="md",hideLabel,icon,suffix,action,numeric,required,className,wrapperClassName,id:idProp,onChange,type,inputMode,...rest},ref){const auto=useId();const id=idProp??auto;const invalid=Boolean(error);const lg=size==="lg";return jsx2(FieldShell,{id,label,labelAside,labelSize:lg?"text-body":void 0,hint,error,required,hideLabel,className:wrapperClassName,children:jsxs2("div",{className:"relative flex items-center",children:[icon&&jsx2("span",{className:cn("absolute flex text-muted pointer-events-none",lg?"start-4.5":"start-3.5"),"aria-hidden":"true",children:icon}),jsx2("input",{ref,id,required,type:numeric?"text":type,inputMode:numeric?inputMode??"decimal":inputMode,"aria-invalid":invalid||void 0,"aria-describedby":error?`${id}-error`:hint?`${id}-hint`:void 0,"data-num":numeric||void 0,"data-suffix":numeric&&suffix?"":void 0,"data-icon":numeric&&icon?"":void 0,onChange:numeric?e=>{const fixed=toLatinDigits(e.target.value);if(fixed!==e.target.value)e.target.value=fixed;onChange?.(e)}:onChange,className:cn(base(invalid),SIZES[size],lg?"px-4.5":"px-3.5",icon&&(lg?"ps-12":"ps-10"),suffix&&"pe-14",action&&(lg?"pe-14":"pe-11"),className),...rest}),suffix&&jsx2("span",{className:cn("absolute text-ui text-muted pointer-events-none",lg?"end-4.5":"end-3.5"),children:suffix}),action&&jsx2("span",{className:cn("absolute flex",lg?"end-4":"end-3"),children:action})]})})});var SearchInput=forwardRef2(function SearchInput2(props,ref){return jsx2(Input,{ref,icon:jsx2(Search,{size:16}),hideLabel:true,...props})});var Textarea=forwardRef2(function Textarea2({label,hint,error,required,hideLabel,rows=3,className,wrapperClassName,id:idProp,...rest},ref){const auto=useId();const id=idProp??auto;return jsx2(FieldShell,{id,label,hint,error,required,hideLabel,className:wrapperClassName,children:jsx2("textarea",{ref,id,rows,required,"aria-invalid":Boolean(error)||void 0,className:cn(base(Boolean(error)),"text-body px-3.5 py-3 resize-y min-h-20",className),...rest})})});var Select=forwardRef2(function Select2({label,hint,error,size="md",hideLabel,options,required,className,wrapperClassName,id:idProp,...rest},ref){const auto=useId();const id=idProp??auto;return jsx2(FieldShell,{id,label,hint,error,required,hideLabel,className:wrapperClassName,children:jsxs2("div",{className:"relative flex items-center",children:[jsx2("select",{ref,id,required,className:cn(base(Boolean(error)),SIZES[size],"appearance-none ps-3.5 pe-9 cursor-pointer font-medium",className),...rest,children:options.map(o=>jsx2("option",{value:o.value,children:o.label},o.value))}),jsx2(ChevronDown,{size:15,"aria-hidden":"true",className:"absolute end-3.5 text-muted2 pointer-events-none"})]})})});var CONTROL="peer appearance-none size-[19px] shrink-0 bg-surface border-[1.5px] border-border cursor-pointer transition-colors checked:bg-brand checked:border-brand hover:border-brand focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand disabled:bg-bg disabled:cursor-not-allowed";var Checkbox=forwardRef2(function Checkbox2({label,description,indeterminate,className,id:idProp,...rest},ref){const auto=useId();const id=idProp??auto;return jsxs2("span",{className:"flex items-start gap-2.5",children:[jsxs2("span",{className:"relative inline-flex items-center justify-center mt-px",children:[jsx2("input",{ref:el=>{if(el)el.indeterminate=Boolean(indeterminate);if(typeof ref==="function")ref(el);else if(ref)ref.current=el},id,type:"checkbox",className:cn(CONTROL,"rounded-xs",indeterminate&&"bg-brand border-brand",className),...rest}),indeterminate?jsx2(Minus,{size:12,strokeWidth:3,"aria-hidden":"true",className:"absolute text-white pointer-events-none"}):jsx2(Check,{size:12,strokeWidth:3,"aria-hidden":"true",className:"absolute text-white opacity-0 peer-checked:opacity-100 pointer-events-none transition-opacity"})]}),(label||description)&&jsxs2("label",{htmlFor:id,className:"flex flex-col gap-0.5 cursor-pointer select-none",children:[label&&jsx2("span",{className:"text-body text-ink",children:label}),description&&jsx2("span",{className:"text-caption text-muted",children:description})]})]})});var Radio=forwardRef2(function Radio2({label,description,className,id:idProp,...rest},ref){const auto=useId();const id=idProp??auto;return jsxs2("span",{className:"flex items-start gap-2.5",children:[jsxs2("span",{className:"relative inline-flex items-center justify-center mt-px",children:[jsx2("input",{ref,id,type:"radio",className:cn(CONTROL,"rounded-full",className),...rest}),jsx2("span",{"aria-hidden":"true",className:"absolute size-1.5 rounded-full bg-white opacity-0 peer-checked:opacity-100 pointer-events-none transition-opacity"})]}),(label||description)&&jsxs2("label",{htmlFor:id,className:"flex flex-col gap-0.5 cursor-pointer select-none",children:[label&&jsx2("span",{className:"text-body text-ink",children:label}),description&&jsx2("span",{className:"text-caption text-muted",children:description})]})]})});function RadioGroup({label,children,inline}){return jsxs2("fieldset",{className:"flex flex-col gap-2.5 border-0 p-0 m-0",children:[jsx2("legend",{className:"text-ui font-bold text-ink2 p-0 mb-1",children:label}),jsx2("div",{className:cn("flex gap-3",inline?"flex-row flex-wrap gap-5":"flex-col"),children})]})}function Switch({checked,onCheckedChange,label,description,disabled,id:idProp}){const auto=useId();const id=idProp??auto;const control=jsx2("button",{id,type:"button",role:"switch","aria-checked":checked,"aria-labelledby":label?`${id}-label`:void 0,disabled,onClick:()=>onCheckedChange(!checked),className:cn("relative shrink-0 w-11 h-6 rounded-full cursor-pointer transition-colors duration-200","focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand","disabled:opacity-50 disabled:cursor-not-allowed",checked?"bg-brand":"bg-border"),children:jsx2("span",{"aria-hidden":"true",className:cn("absolute top-1/2 -translate-y-1/2 size-5 rounded-full bg-white shadow-sm transition-all duration-200",checked?"start-[calc(100%-1.375rem)]":"start-0.5")})});if(!label)return control;return jsxs2("span",{className:"flex items-start gap-3",children:[control,jsxs2("span",{className:"flex flex-col gap-0.5",children:[jsx2("span",{id:`${id}-label`,className:"text-body text-ink",children:label}),description&&jsx2("span",{className:"text-caption text-muted",children:description})]})]})}export{Button,Input,SearchInput,Textarea,Select,Checkbox,Radio,RadioGroup,Switch};