@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.
- package/README.md +115 -8
- package/dist/ai.js +1 -1
- package/dist/chunk-3EPEIAG2.js +2 -0
- package/dist/chunk-6DTSIOCB.js +2 -0
- package/dist/chunk-CTMW25W5.js +2 -0
- package/dist/chunk-K3TNXSD7.js +2 -0
- package/dist/{chunk-GMIBQMMR.js → chunk-NIEWNSOB.js} +1 -1
- package/dist/editor.js +1 -1
- package/dist/index.d.ts +291 -139
- package/dist/index.js +1 -1
- package/dist/native/ai.js +1 -0
- package/dist/native/chunk-LZHT3H7B.js +1 -0
- package/dist/native/chunk-RGKCDRSY.js +2 -0
- package/dist/native/editor.js +1 -0
- package/dist/native/index.js +1 -0
- package/dist/native/notifications.js +1 -0
- package/dist/native/orb.js +1 -0
- package/dist/notifications.js +1 -1
- package/package.json +32 -6
- package/dist/chunk-77ZZDWR4.js +0 -2
- package/dist/chunk-ENHEJXVH.js +0 -2
- package/dist/chunk-VAMRF7HE.js +0 -2
- package/dist/chunk-ZE4S6DBP.js +0 -2
package/dist/notifications.js
CHANGED
|
@@ -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.
|
|
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.
|
|
72
|
-
"@types/react-dom": "^19.
|
|
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": "
|
|
84
|
-
"react-dom": "
|
|
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": {
|
package/dist/chunk-77ZZDWR4.js
DELETED
|
@@ -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};
|
package/dist/chunk-ENHEJXVH.js
DELETED
|
@@ -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};
|
package/dist/chunk-VAMRF7HE.js
DELETED
|
@@ -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};
|