@qumra/fanar 0.0.7 → 0.0.8
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/dist/ai.js +1 -1
- package/dist/chunk-77ZZDWR4.js +2 -0
- package/dist/chunk-ENHEJXVH.js +2 -0
- package/dist/chunk-GMIBQMMR.js +2 -0
- package/dist/{chunk-L3NDN5GB.js → chunk-VAMRF7HE.js} +1 -1
- package/dist/{chunk-DDRJTIIP.js → chunk-ZE4S6DBP.js} +1 -1
- package/dist/editor.css +1 -1
- package/dist/editor.js +1 -1
- package/dist/index.d.ts +38 -0
- package/dist/index.js +1 -1
- package/dist/notifications.js +1 -1
- package/dist/tokens.css +2 -1
- package/package.json +2 -1
- package/dist/chunk-APE2XWSN.js +0 -2
- package/dist/chunk-JJCKT5OO.js +0 -2
- package/dist/chunk-QJPINFN2.js +0 -2
package/dist/notifications.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import{Counter}from"./chunk-JJCKT5OO.js";import{Drawer,EmptyState,TONE_SOFT,cn,useUIText}from"./chunk-DDRJTIIP.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-hidden flex flex-col animate-qfade",className),children:[jsxs("div",{className:"shrink-0 flex items-center justify-between gap-2.5 px-4 py-3.5 border-b border-line",children:[jsxs("span",{className:"flex items-center gap-2 min-w-0",children:[jsx("span",{className:"text-lead font-extrabold truncate",children:title??ui.notifications}),unread>0&&jsx(Counter,{value:unread})]}),jsxs("span",{className:"shrink-0 flex items-center gap-2.5",children:[sound&&jsx(SoundToggle,{...sound}),onMarkAllRead&&unread>0&&jsxs("button",{type:"button",onClick:onMarkAllRead,className:"inline-flex items-center gap-1.5 text-micro font-bold text-brand cursor-pointer hover:text-brand-hover transition-colors",children:[jsx(CheckCheck,{size:13,"aria-hidden":"true"}),markAllLabel??ui.markAllRead]})]})]}),needsAction>0&&jsxs("p",{className:"shrink-0 m-0 px-4 py-2.5 bg-amber-bg border-b border-amber-line text-caption leading-[1.6] text-amber-ink",children:[jsx("span",{"data-num":true,className:"font-extrabold",children:needsAction})," ","\u0645\u062D\u062A\u0627\u062C\u064A\u0646 \u0625\u062C\u0631\u0627\u0621 \u2014 \u0628\u064A\u0641\u0636\u0644\u0648\u0627 \u0644\u062D\u062F \u0645\u0627 \u062A\u062A\u0639\u0627\u0645\u0644 \u0645\u0639\u0627\u0647\u0645\u060C \u0648\xAB\u062A\u0639\u0644\u064A\u0645 \u0627\u0644\u0643\u0644\xBB \u0645\u0627\u0628\u064A\u0645\u0633\u062D\u0647\u0645\u0634."]}),jsx("div",{className:"flex-1 min-h-0 max-h-[21rem] overflow-y-auto overscroll-contain",children:jsx(NotificationList,{items,onOpen,onDismiss,emptyTitle:emptyTitle??ui.noNotifications,emptyDescription:emptyDescription??ui.noNotificationsDesc})}),onViewAll&&items.length>0&&jsx("button",{type:"button",onClick:onViewAll,className:"shrink-0 w-full p-3 border-t border-line text-ui font-bold text-brand cursor-pointer hover:bg-hover transition-colors",children:viewAllLabel??ui.viewAllNotifications})]})}function SoundToggle({muted,setMuted,ready,className}){const ui=useUIText();const blocked=!muted&&!ready;const label=muted?"\u0634\u063A\u0651\u0644 \u0635\u0648\u062A \u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062A":blocked?"\u0627\u0644\u0635\u0648\u062A \u0645\u0633\u062A\u0646\u064A \u0623\u0648\u0644 \u062A\u0641\u0627\u0639\u0644 \u0645\u0639 \u0627\u0644\u0635\u0641\u062D\u0629":"\u0627\u0643\u062A\u0645 \u0635\u0648\u062A \u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062A";return jsx("button",{type:"button",onClick:()=>setMuted(!muted),title:label??ui.notifications,"aria-label":label??ui.notifications,"aria-pressed":muted,className:cn("size-7 rounded-sm flex items-center justify-center cursor-pointer transition-colors",blocked?"text-amber-ink":"text-muted2 hover:text-ink hover:bg-hover",className),children:muted||blocked?jsx(BellOff,{size:14,"aria-hidden":"true"}):jsx(Bell2,{size:14,"aria-hidden":"true"})})}var MENU_ALIGN={start:"start-0",end:"end-0"};var MENU_SIDE={bottom:"top-full mt-2",top:"bottom-full mb-2"};function NotificationMenu({unread,bellLabel,align="end",side="bottom",className,onViewAll,onOpen,...panel}){const[open,setOpen]=useState3(false);const wrap=useRef4(null);const id=useId();useEffect4(()=>{if(!open)return;function onKey(e){if(e.key==="Escape")setOpen(false)}function onDown(e){if(!wrap.current?.contains(e.target))setOpen(false)}document.addEventListener("keydown",onKey);document.addEventListener("mousedown",onDown);return()=>{document.removeEventListener("keydown",onKey);document.removeEventListener("mousedown",onDown)}},[open]);return jsxs("div",{ref:wrap,className:cn("relative",className),children:[jsx(NotificationBell,{unread,needsAction:panel.needsAction,expanded:open,label:bellLabel,onClick:()=>setOpen(o=>!o)}),open&&jsx("div",{role:"dialog","aria-label":bellLabel??"\u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062A",id,className:cn("absolute z-50",MENU_ALIGN[align],MENU_SIDE[side]),children:jsx(NotificationPanel,{...panel,unread,onOpen:n=>{setOpen(false);onOpen?.(n)},onViewAll:onViewAll&&(()=>{setOpen(false);onViewAll()})})})]})}function NotificationDrawer({open,onClose,items,title,unread=0,needsAction=0,onMarkAllRead,markAllLabel,closeLabel,onOpen,onDismiss,emptyTitle,emptyDescription}){const ui=useUIText();return jsxs(Drawer,{open,onClose,closeLabel:closeLabel??ui.close,title:jsxs("span",{className:"flex items-center gap-2",children:[title??ui.notifications,unread>0&&jsx(Counter,{value:unread})]}),bodyClassName:"p-0",footer:onMarkAllRead&&unread>0?jsxs("button",{type:"button",onClick:onMarkAllRead,className:"inline-flex items-center gap-1.5 text-ui font-bold text-brand cursor-pointer hover:text-brand-hover transition-colors",children:[jsx(CheckCheck,{size:15,"aria-hidden":"true"}),markAllLabel??ui.markAllRead]}):void 0,children:[needsAction>0&&jsxs("p",{className:"m-0 px-4 py-2.5 bg-amber-bg border-b border-amber-line text-caption leading-[1.6] text-amber-ink",children:[jsx("span",{"data-num":true,className:"font-extrabold",children:needsAction})," ","\u0645\u062D\u062A\u0627\u062C\u064A\u0646 \u0625\u062C\u0631\u0627\u0621 \u2014 \u0628\u064A\u0641\u0636\u0644\u0648\u0627 \u0644\u062D\u062F \u0645\u0627 \u062A\u062A\u0639\u0627\u0645\u0644 \u0645\u0639\u0627\u0647\u0645\u060C \u0648\xAB\u062A\u0639\u0644\u064A\u0645 \u0627\u0644\u0643\u0644\xBB \u0645\u0627\u0628\u064A\u0645\u0633\u062D\u0647\u0645\u0634."]}),jsx(NotificationList,{items,onOpen:n=>{onClose();onOpen?.(n)},onDismiss,emptyTitle:emptyTitle??ui.noNotifications,emptyDescription:emptyDescription??ui.noNotificationsDesc})]})}var PLACEMENT={"top-start":"top-4 sm:start-5","top-end":"top-4 sm:end-5","bottom-start":"bottom-4 sm:start-5","bottom-end":"bottom-4 sm:end-5"};var PLACEMENT_ANIM={"top-start":"animate-qfade","top-end":"animate-qfade","bottom-start":"animate-tip","bottom-end":"animate-tip"};function NotificationToastHost({items,onClose,onOpen,placement="top-end",width="sm:w-[22rem]",closeLabel,regionLabel,className}){const ui=useUIText();if(items.length===0)return null;return jsx("div",{role:"region","aria-label":regionLabel??ui.newNotifications,"aria-live":"polite",className:cn("fixed z-[60] inset-x-4 sm:inset-x-auto flex flex-col gap-2 pointer-events-none",PLACEMENT[placement],width,className),children:items.map(n=>jsx(ToastCard,{n,placement,closeLabel:closeLabel??ui.close,onClose,onOpen},n.id))})}function ToastCard({n,placement,closeLabel,onClose,onOpen}){const ui=useUIText();const{onAction}=useNotificationContext();const{kind:k,title,body}=useText(n);const Icon=k.icon;return jsxs("div",{className:cn("pointer-events-auto flex items-start gap-3 p-3.5 rounded-card","bg-surface border border-line shadow-panel",PLACEMENT_ANIM[placement]),children:[jsx("span",{"aria-hidden":"true",className:cn("size-8.5 rounded-sm flex items-center justify-center shrink-0",TONE_SOFT[k.tone]),children:jsx(Icon,{size:16,strokeWidth:2})}),jsxs("span",{className:"flex-1 min-w-0 flex flex-col gap-1",children:[jsx("span",{className:"text-ui font-extrabold text-ink",children:title??ui.notifications}),body&&jsx("span",{className:"text-caption leading-[1.65] text-muted [text-wrap:pretty] line-clamp-2",children:body}),n.action&&jsx("button",{type:"button",onClick:()=>{onAction?.(n);onOpen?.(n);onClose(n.id)},className:"w-fit text-micro font-extrabold text-brand cursor-pointer hover:text-brand-hover transition-colors",children:n.action.label})]}),jsx("button",{type:"button",onClick:()=>onClose(n.id),"aria-label":closeLabel??ui.close,className:"shrink-0 size-7 rounded-sm flex items-center justify-center text-muted2 hover:bg-hover hover:text-ink cursor-pointer transition-colors",children:jsx(X,{size:14,"aria-hidden":"true"})})]})}export{NOTIFICATION_PRIORITIES,NOTIFICATION_SCHEMA_VERSION,NOTIFICATION_SOUNDS,NotificationBell,NotificationDrawer,NotificationList,NotificationMenu,NotificationPanel,NotificationProvider,NotificationRow,NotificationToastHost,QUMRA_KINDS,QUMRA_NOTIFICATIONS,SoundToggle,createKindRegistry,formatRelativeTime,isBulkReadable,optimistic,parseNotification,parseNotifications,relativeTickMs,serializeNotification,useNotificationCenter,useNotificationContext,useNotificationSound,useNotifications};
|
|
2
|
+
import{Counter}from"./chunk-GMIBQMMR.js";import{Drawer,EmptyState,TONE_SOFT,cn,useUIText}from"./chunk-ZE4S6DBP.js";var NOTIFICATION_SCHEMA_VERSION=1;var NOTIFICATION_PRIORITIES=["low","normal","critical"];var isObject=v=>typeof v==="object"&&v!==null&&!Array.isArray(v);var isNonEmptyString=v=>typeof v==="string"&&v.trim().length>0;function parseNotification(raw,options={}){const issues=[];const warnings=[];if(!isObject(raw))return{ok:false,issues:["\u0627\u0644\u0631\u0633\u0627\u0644\u0629 \u0645\u0634 \u0643\u0627\u0626\u0646"]};if(!isNonEmptyString(raw.id))issues.push("`id` \u0646\u0627\u0642\u0635 \u0623\u0648 \u0645\u0634 \u0646\u0635");if(!isNonEmptyString(raw.kind))issues.push("`kind` \u0646\u0627\u0642\u0635 \u0623\u0648 \u0645\u0634 \u0646\u0635");if(!isNonEmptyString(raw.title))issues.push("`title` \u0646\u0627\u0642\u0635 \u0623\u0648 \u0645\u0634 \u0646\u0635");let at=null;if(!isNonEmptyString(raw.at)){issues.push("`at` \u0646\u0627\u0642\u0635 \u0623\u0648 \u0645\u0634 \u0646\u0635")}else{const d=new Date(raw.at);if(Number.isNaN(d.getTime()))issues.push(`\`at\` \u0645\u0634 \u062A\u0627\u0631\u064A\u062E \u0645\u0642\u0631\u0648\u0621: ${raw.at}`);else at=d}const v=typeof raw.v==="number"&&Number.isFinite(raw.v)?raw.v:NOTIFICATION_SCHEMA_VERSION;if(v>NOTIFICATION_SCHEMA_VERSION){warnings.push(`\u0625\u0635\u062F\u0627\u0631 \u0623\u062D\u062F\u062B (${v}) \u2014 \u0627\u0644\u062D\u0642\u0648\u0644 \u0627\u0644\u0645\u0639\u0631\u0648\u0641\u0629 \u0627\u062A\u0642\u0631\u062A \u0648\u0627\u0644\u0628\u0627\u0642\u064A \u0627\u062A\u062C\u0627\u0647\u0644`)}let priority=(isNonEmptyString(raw.kind)?options.kinds?.get(raw.kind).priority:void 0)??"normal";if(raw.priority!==void 0){if(NOTIFICATION_PRIORITIES.includes(raw.priority)){priority=raw.priority}else if(raw.priority==="high"){warnings.push("`priority: high` \u0627\u062A\u0634\u0627\u0644\u062A \u2014 \u0627\u062A\u0642\u0631\u062A normal")}else{warnings.push(`\`priority\` \u0645\u0634 \u0645\u0639\u0631\u0648\u0641\u0629: ${String(raw.priority)} \u2014 \u0627\u062A\u062D\u0637\u0651\u062A normal`)}}let readAt=null;if(isNonEmptyString(raw.readAt)){const d=new Date(raw.readAt);if(Number.isNaN(d.getTime())){warnings.push(`\`readAt\` \u0645\u0634 \u062A\u0627\u0631\u064A\u062E \u0645\u0642\u0631\u0648\u0621: ${raw.readAt} \u2014 \u0627\u062A\u0642\u0631\u064A \u0645\u0642\u0631\u0648\u0621`);readAt=at??new Date}else{readAt=d}}else if(raw.read===true){warnings.push("`read` \u0645\u0647\u062C\u0648\u0631\u0629 \u2014 \u0627\u0633\u062A\u062E\u062F\u0645 `readAt`");readAt=at??new Date}let action;if(raw.action!==void 0){if(isObject(raw.action)&&isNonEmptyString(raw.action.label)&&isNonEmptyString(raw.action.href)){action={label:raw.action.label,href:raw.action.href}}else{warnings.push("`action` \u0646\u0627\u0642\u0635\u0647 `label` \u0623\u0648 `href` \u2014 \u0627\u062A\u0634\u0627\u0644")}}if(issues.length>0)return{ok:false,issues};return{ok:true,warnings,value:{v,id:raw.id,kind:raw.kind,at,title:raw.title,body:isNonEmptyString(raw.body)?raw.body:void 0,readAt,read:readAt!==null,priority,group:isNonEmptyString(raw.group)?raw.group:void 0,data:isObject(raw.data)?raw.data:{},action,sound:raw.sound==="none"?"none":void 0}}}function parseNotifications(raw,options={}){const rejected=[];const warnings=[];let list=raw;if(typeof raw==="string"){try{list=JSON.parse(raw)}catch{return{items:[],rejected:[{raw,issues:["\u0646\u0635 \u0645\u0634 JSON \u0635\u0627\u0644\u062D"]}],warnings}}}if(isObject(list)){const inner=list.items??list.notifications??list.data;if(Array.isArray(inner))list=inner}if(!Array.isArray(list)){return{items:[],rejected:[{raw,issues:["\u0627\u0644\u0645\u062A\u0648\u0642\u0651\u0639 \u0645\u0635\u0641\u0648\u0641\u0629 \u0631\u0633\u0627\u064A\u0644"]}],warnings}}const byId=new Map;for(const entry of list){const r=parseNotification(entry,options);if(!r.ok){rejected.push({raw:entry,issues:r.issues});continue}warnings.push(...r.warnings.map(w=>`${r.value.id}: ${w}`));byId.set(r.value.id,r.value)}const items=[...byId.values()].sort((a,b)=>b.at.getTime()-a.at.getTime());return{items,rejected,warnings}}function serializeNotification(n){return{v:n.v,id:n.id,kind:n.kind,at:n.at.toISOString(),title:n.title,...n.body!==void 0&&{body:n.body},readAt:n.readAt===null?null:n.readAt.toISOString(),priority:n.priority,...n.group!==void 0&&{group:n.group},...Object.keys(n.data).length>0&&{data:n.data},...n.action!==void 0&&{action:n.action},...n.sound!==void 0&&{sound:n.sound}}}import{AlertTriangle,Bell,CreditCard,Globe,MessageSquare,Megaphone,PackageX,RotateCcw,ShoppingBag,Star,Truck,Users,Wallet}from"lucide-react";var FALLBACK={label:"\u0625\u0634\u0639\u0627\u0631",icon:Bell,tone:"neutral",priority:"normal",sound:"notify"};function createKindRegistry(kinds,fallback){const base={...FALLBACK,...fallback};const map=new Map(kinds.map(k=>[k.kind,{...base,...strip(k),unknown:false}]));return{has:kind=>map.has(kind),get:kind=>map.get(kind)??{...base,kind,unknown:true},list:()=>[...map.values()]}}function strip(k){return Object.fromEntries(Object.entries(k).filter(([,v])=>v!==void 0))}var QUMRA_KINDS=[{kind:"payment.failed",label:"\u0641\u0634\u0644 \u062A\u062D\u0635\u064A\u0644",icon:CreditCard,tone:"red",priority:"critical",sound:"notify"},{kind:"stock.depleted",label:"\u0646\u0641\u0627\u062F \u0645\u062E\u0632\u0648\u0646",icon:PackageX,tone:"amber",priority:"critical",sound:"notify"},{kind:"order.stalled",label:"\u0637\u0644\u0628 \u0645\u062A\u0639\u062B\u0651\u0631",icon:Truck,tone:"amber",priority:"critical",sound:"notify"},{kind:"order.returned",label:"\u0645\u0631\u062A\u062C\u0639",icon:RotateCcw,tone:"amber",priority:"normal",sound:"notify"},{kind:"order.created",label:"\u0637\u0644\u0628 \u062C\u062F\u064A\u062F",icon:ShoppingBag,priority:"normal",sound:"notify",title:(n,t)=>t("notif.order.created",{id:n.data.orderId})},{kind:"payout.sent",label:"\u062A\u062D\u0648\u064A\u0644 \u0623\u0631\u0628\u0627\u062D",icon:Wallet,priority:"normal",sound:"notify",title:(n,t)=>t("notif.payout.sent",{amount:n.data.amount})},{kind:"review.created",label:"\u062A\u0642\u064A\u064A\u0645 \u062C\u062F\u064A\u062F",icon:Star,priority:"normal",sound:"notify"},{kind:"shipment.updated",label:"\u062A\u062D\u062F\u064A\u062B \u0634\u062D\u0646\u0629",icon:Truck,priority:"normal",sound:"notify"},{kind:"customer.message",label:"\u0631\u0633\u0627\u0644\u0629 \u0639\u0645\u064A\u0644",icon:MessageSquare,priority:"normal",sound:"notify"},{kind:"domain.issue",label:"\u0625\u0639\u062F\u0627\u062F \u0646\u0637\u0627\u0642",icon:Globe,priority:"normal",sound:"notify"},{kind:"app.updated",label:"\u062A\u062D\u062F\u064A\u062B \u062A\u0637\u0628\u064A\u0642",icon:Megaphone,priority:"low",sound:"none"},{kind:"community.digest",label:"\u0645\u0644\u062E\u0651\u0635 \u0627\u0644\u0645\u062C\u062A\u0645\u0639",icon:Users,priority:"low",sound:"none"}];var QUMRA_NOTIFICATIONS=createKindRegistry(QUMRA_KINDS);import{useCallback,useEffect,useRef,useState}from"react";var NOTIFY_CHIME="data:audio/mpeg;base64,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VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTQuMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZECP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUU0LjBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7kmRAj/AAAGkAAAAIAAANIAAAAQAAAaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FNC4wVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JkQI/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTQuMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZECP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==";var NOTIFICATION_SOUNDS=["notify"];var VOLUME=.6;var CRITICAL_BOOST=1.35;var GAP_MS=600;var MAX_QUEUED=4;var MUTE_KEY="qumra-notif-sound";function useNotificationSound({kinds}){const[ready,setReady]=useState(false);const[muted,setMutedState]=useState(()=>{if(typeof window==="undefined")return false;return window.localStorage?.getItem(MUTE_KEY)==="muted"});const nextSlot=useRef(0);const timers=useRef(new Set);const pools=useRef(new Map);const cursor=useRef(0);const pool=useCallback(url=>{let p=pools.current.get(url);if(!p){if(typeof Audio==="undefined")return null;p=Array.from({length:Math.min(MAX_QUEUED+1,6)},()=>{const el=new Audio(url);el.preload="auto";return el});pools.current.set(url,p)}return p},[]);useEffect(()=>{const t=timers.current;return()=>{t.forEach(clearTimeout);t.clear()}},[]);const unlock=useCallback(async()=>{const p=pool(NOTIFY_CHIME);if(!p)return false;const results=await Promise.all(p.map(async el=>{const was=el.muted;el.muted=true;try{await el.play();el.pause();el.currentTime=0;return true}catch{return false}finally{el.muted=was}}));const ok=results.every(Boolean);if(ok)setReady(true);return ok},[pool]);useEffect(()=>{if(ready||typeof window==="undefined")return;const on=()=>void unlock();window.addEventListener("pointerdown",on,{once:true});window.addEventListener("keydown",on,{once:true});return()=>{window.removeEventListener("pointerdown",on);window.removeEventListener("keydown",on)}},[ready,unlock]);const setMuted=useCallback(m=>{setMutedState(m);if(typeof window!=="undefined"){window.localStorage?.setItem(MUTE_KEY,m?"muted":"on")}},[]);const emit=useCallback((url,vol)=>{const p=pool(url);if(!p)return;const el=p.find(x=>x.paused||x.ended)??p[cursor.current++%p.length];el.volume=Math.min(1,Math.max(0,vol));el.currentTime=0;void el.play().catch(()=>{})},[pool]);const schedule=useCallback((url,vol)=>{const now=Date.now();const at=Math.max(now,nextSlot.current);if(at-now>MAX_QUEUED*GAP_MS)return;nextSlot.current=at+GAP_MS;if(at<=now){emit(url,vol);return}const id=setTimeout(()=>{timers.current.delete(id);emit(url,vol)},at-now);timers.current.add(id)},[emit]);const play=useCallback(n=>{if(muted)return;if(n.read)return;if(n.priority==="low")return;const k=kinds.get(n.kind);if((n.sound??k.sound)==="none")return;schedule(NOTIFY_CHIME,n.priority==="critical"?Math.min(1,VOLUME*CRITICAL_BOOST):VOLUME)},[kinds,muted,schedule]);const preview=useCallback(()=>{nextSlot.current=0;emit(NOTIFY_CHIME,VOLUME)},[emit]);return{ready,muted,setMuted,unlock,play,preview}}import{useCallback as useCallback2,useEffect as useEffect2,useMemo,useRef as useRef2,useState as useState2}from"react";var genId=(()=>{let n=0;return()=>`local_${++n}_${Math.round(performance.now())}`})();function mergeNotifications(prev,incoming,options={}){const{scope="add",removed}=options;const byId=new Map(prev.map(n=>[n.id,n]));for(const n of incoming){const old=byId.get(n.id);byId.set(n.id,old?{...n,...latestRead(old,n)}:n)}let out=[...byId.values()];if(scope==="sync"&&incoming.length>0){const seen=new Set(incoming.map(n=>n.id));const times=incoming.map(n=>n.at.getTime());const newest=Math.max(...times);const oldest=Math.min(...times);out=out.filter(n=>{const t=n.at.getTime();const inRange=t<=newest&&t>=oldest;return!inRange||seen.has(n.id)})}if(removed?.size){const now=Date.now();out=out.filter(n=>{const until=removed.get(n.id);return until===void 0||until<=now})}return out.sort(byNewest)}function latestRead(a,b){const t=n=>n.readAt?n.readAt.getTime():-1;const readAt=t(a)>=t(b)?a.readAt:b.readAt;return{readAt,read:readAt!==null}}var byNewest=(a,b)=>b.at.getTime()-a.at.getTime();var isBulkReadable=n=>!n.read&&n.priority!=="critical";function collapseByGroup(items){const out=[];for(const n of items){if(!n.group){out.push(n);continue}const i=out.findIndex(x=>x.group===n.group);if(i===-1)out.push(n);else out[i]=n}return out}var TOMBSTONE_MS=6e4;var MAX_ARRIVALS=3;var ARRIVAL_MS=5e3;var ARRIVAL_WITH_ACTION_MS=7e3;function useNotifications({kinds,initial,onReceive,onReject}={}){const[items,setItems]=useState2(()=>initial===void 0?[]:parseNotifications(initial,{kinds}).items);const[arrivals,setArrivals]=useState2([]);const[rejected,setRejected]=useState2([]);const timers=useRef2(new Map);const[removed,setRemoved]=useState2(()=>new Map);const removedRef=useRef2(removed);const kindsRef=useRef2(kinds);useEffect2(()=>{removedRef.current=removed},[removed]);useEffect2(()=>{kindsRef.current=kinds},[kinds]);const cb=useRef2({onReceive,onReject});useEffect2(()=>{cb.current={onReceive,onReject}});useEffect2(()=>{const t=timers.current;return()=>{t.forEach(clearTimeout);t.clear()}},[]);const clearArrival=useCallback2(id=>{const t=timers.current.get(id);if(t)clearTimeout(t);timers.current.delete(id);setArrivals(prev=>prev.filter(x=>x.id!==id))},[]);const clearAllArrivals=useCallback2(()=>{timers.current.forEach(clearTimeout);timers.current.clear();setArrivals([])},[]);const report=useCallback2(batch=>{setRejected(batch.rejected);if(batch.rejected.length>0)cb.current.onReject?.(batch.rejected);return batch},[]);const load=useCallback2((raw,scope)=>{const batch=parseNotifications(raw,{kinds:kindsRef.current});setItems(prev=>mergeNotifications(prev,batch.items,{scope,removed:removedRef.current}));return report(batch)},[report]);const hydrate=useCallback2(raw=>load(raw,"add"),[load]);const sync=useCallback2(raw=>load(raw,"sync"),[load]);const receive=useCallback2(raw=>{const batch=parseNotifications(raw,{kinds:kindsRef.current});if(batch.items.length===0)return report(batch);setItems(prev=>mergeNotifications(prev,batch.items,{removed:removedRef.current}));const fresh=batch.items.filter(n=>!n.read);if(fresh.length>0){setArrivals(prev=>collapseByGroup([...prev,...fresh]).slice(-MAX_ARRIVALS));for(const n of fresh){cb.current.onReceive?.(n);const life=n.action?ARRIVAL_WITH_ACTION_MS:ARRIVAL_MS;timers.current.set(n.id,setTimeout(()=>clearArrival(n.id),life))}}return report(batch)},[clearArrival,report]);const push=useCallback2(input=>{const json={v:NOTIFICATION_SCHEMA_VERSION,id:input.id??genId(),at:input.at??new Date().toISOString(),...input};const r=parseNotification(json,{kinds:kindsRef.current});if(!r.ok){cb.current.onReject?.([{raw:json,issues:r.issues}]);return null}receive([json]);return r.value.id},[receive]);const markRead=useCallback2(id=>{const readAt=new Date;setItems(prev=>prev.map(n=>n.id===id?{...n,readAt,read:true}:n))},[]);const markAllRead=useCallback2(()=>{const readAt=new Date;setItems(prev=>prev.map(n=>isBulkReadable(n)?{...n,readAt,read:true}:n))},[]);const dismiss=useCallback2(id=>{setRemoved(prev=>new Map(prev).set(id,Date.now()+TOMBSTONE_MS));setItems(prev=>prev.filter(n=>n.id!==id));clearArrival(id)},[clearArrival]);const markUnread=useCallback2(ids=>{const set=new Set(ids);setItems(prev=>prev.map(n=>set.has(n.id)?{...n,readAt:null,read:false}:n))},[]);const dropTombstone=useCallback2(id=>{setRemoved(prev=>{if(!prev.has(id))return prev;const next=new Map(prev);next.delete(id);return next})},[]);const restore=useCallback2(n=>{dropTombstone(n.id);setItems(prev=>mergeNotifications(prev,[n]))},[dropTombstone]);const confirmDismiss=dropTombstone;const unread=useMemo(()=>items.reduce((n,x)=>x.read?n:n+1,0),[items]);const needsAction=useMemo(()=>items.reduce((n,x)=>!x.read&&x.priority==="critical"?n+1:n,0),[items]);return{items,unread,needsAction,arrivals,rejected,hydrate,sync,receive,push,markRead,markAllRead,markUnread,restore,confirmDismiss,dismiss,clearArrival,clearAllArrivals}}import{useCallback as useCallback3,useEffect as useEffect3,useRef as useRef3}from"react";function optimistic(run,undo,onError){if(!run)return;const fail=e=>{undo();onError?.(e)};try{const r=run();if(r&&typeof r.then==="function"){void r.catch(fail)}}catch(e){fail(e)}}function useNotificationCenter({kinds,onReceive,onRead,onReadAll,onDismiss,onOpen,onSyncError,...rest}){const sound=useNotificationSound({kinds});const handleReceive=useCallback3(n=>{sound.play(n);onReceive?.(n)},[onReceive,sound]);const state=useNotifications({...rest,kinds,onReceive:handleReceive});const cb=useRef3({onRead,onReadAll,onDismiss,onOpen,onSyncError});useEffect3(()=>{cb.current={onRead,onReadAll,onDismiss,onOpen,onSyncError}});const markRead=useCallback3(id=>{const n=state.items.find(x=>x.id===id);if(!n||n.read)return;state.markRead(id);optimistic(cb.current.onRead&&(()=>cb.current.onRead({...n,read:true})),()=>state.markUnread([id]),e=>cb.current.onSyncError?.(e,{action:"read",items:[n]}))},[state]);const markAllRead=useCallback3(()=>{const unreadItems=state.items.filter(n=>!n.read);const ids=unreadItems.map(n=>n.id);if(ids.length===0)return;state.markAllRead();optimistic(cb.current.onReadAll&&(()=>cb.current.onReadAll(ids)),()=>state.markUnread(ids),e=>cb.current.onSyncError?.(e,{action:"readAll",items:unreadItems}))},[state]);const dismiss=useCallback3(id=>{const n=state.items.find(x=>x.id===id);if(!n)return;state.dismiss(id);optimistic(cb.current.onDismiss?async()=>{await cb.current.onDismiss(n);state.confirmDismiss(n.id)}:()=>state.confirmDismiss(n.id),()=>state.restore(n),e=>cb.current.onSyncError?.(e,{action:"dismiss",items:[n]}))},[state]);const open=useCallback3(n=>{markRead(n.id);cb.current.onOpen?.(n)},[markRead]);return{...state,markRead,markAllRead,dismiss,sound,kinds,bind:{provider:{kinds,onAction:open},surface:{items:state.items,unread:state.unread,needsAction:state.needsAction,sound,onMarkAllRead:markAllRead,onDismiss:dismiss,onOpen:open}}}}var DIVISIONS=[{limit:6e4,unit:"second",ms:1e3},{limit:36e5,unit:"minute",ms:6e4},{limit:864e5,unit:"hour",ms:36e5},{limit:6048e5,unit:"day",ms:864e5},{limit:26298e5,unit:"week",ms:6048e5},{limit:315576e5,unit:"month",ms:26298e5},{limit:Infinity,unit:"year",ms:315576e5}];function formatRelativeTime(at,locale="ar",now=new Date){const diff=at.getTime()-now.getTime();const abs=Math.abs(diff);const rtf=new Intl.RelativeTimeFormat(locale,{numeric:"auto"});if(abs<3e4)return rtf.format(0,"second");const d=DIVISIONS.find(x=>abs<x.limit)??DIVISIONS[DIVISIONS.length-1];return rtf.format(Math.round(diff/d.ms),d.unit)}function relativeTickMs(at,now=new Date){const abs=Math.abs(at.getTime()-now.getTime());if(abs<6e4)return 15e3;if(abs<36e5)return 6e4;if(abs<864e5)return 3e5;return 36e5}import{createContext,useContext,useEffect as useEffect4,useId,useMemo as useMemo2,useRef as useRef4,useState as useState3}from"react";import{Bell as Bell2,BellOff,CheckCheck,X}from"lucide-react";import{jsx,jsxs}from"react/jsx-runtime";var Ctx=createContext({kinds:QUMRA_NOTIFICATIONS,locale:"ar"});function NotificationProvider({kinds=QUMRA_NOTIFICATIONS,locale="ar",t,onAction,children}){const value=useMemo2(()=>({kinds,locale,t,onAction}),[kinds,locale,t,onAction]);return jsx(Ctx.Provider,{value,children})}var useNotificationContext=()=>useContext(Ctx);function useText(n){const{kinds,t}=useNotificationContext();const k=kinds.get(n.kind);return{kind:k,title:t&&k.title?k.title(n,t):n.title,body:t&&k.body?k.body(n,t):n.body}}function RelativeTime({at}){const{locale}=useNotificationContext();const[tick,setTick]=useState3(0);useEffect4(()=>{const id=setTimeout(()=>setTick(n=>n+1),tick===0?0:relativeTickMs(at));return()=>clearTimeout(id)});return jsx("time",{dateTime:at.toISOString(),title:at.toLocaleString(locale),className:"text-micro text-muted2",children:tick===0?at.toLocaleDateString(locale):formatRelativeTime(at,locale)})}function NotificationBell({unread,needsAction=0,onClick,expanded,label,unreadLabel=n=>`${n} \u063A\u064A\u0631 \u0645\u0642\u0631\u0648\u0621\u0629`,className}){const ui=useUIText();return jsxs("button",{type:"button",onClick,title:label??ui.notifications,"aria-label":unread>0?`${label??ui.notifications} \u2014 ${unreadLabel(unread)}${needsAction>0?`\u060C ${needsAction} \u0645\u062D\u062A\u0627\u062C\u064A\u0646 \u0625\u062C\u0631\u0627\u0621`:""}`:label,"aria-haspopup":"dialog","aria-expanded":expanded,className:cn("relative size-9 rounded-[10px] flex items-center justify-center cursor-pointer text-ink2","transition-colors duration-150 hover:bg-hover",expanded&&"bg-hover",className),children:[jsx(Bell2,{size:19,strokeWidth:2,"aria-hidden":"true"}),unread>0&&jsx("span",{"aria-hidden":"true",className:cn("absolute -top-0.5 -end-0.5 rounded-full ring-2 ring-surface",needsAction>0&&"outline outline-2 outline-offset-1 outline-danger/35"),children:jsx(Counter,{value:unread})})]})}function NotificationRow({item,onOpen,onDismiss,dismissLabel,unreadLabel}){const ui=useUIText();const{onAction}=useNotificationContext();const{kind:k,title,body}=useText(item);const Icon=k.icon;return jsxs("div",{className:cn("group/row flex items-start gap-3 px-4 py-3.5 border-b border-line last:border-0 transition-colors",!item.read&&"bg-bg"),children:[jsx("span",{"aria-hidden":"true",className:cn("size-8.5 rounded-sm flex items-center justify-center shrink-0 mt-0.5",TONE_SOFT[k.tone]),children:jsx(Icon,{size:16,strokeWidth:2})}),jsxs("span",{className:"flex-1 min-w-0 flex flex-col gap-1",children:[jsxs("span",{className:"flex items-center gap-2",children:[!item.read&&jsx("span",{"aria-label":unreadLabel??ui.unread,className:"size-1.5 rounded-full bg-brand shrink-0"}),jsx("span",{className:cn("text-ui",item.read?"font-bold text-ink2":"font-extrabold text-ink"),children:title??ui.notifications})]}),body&&jsx("span",{className:"text-caption leading-[1.7] text-muted [text-wrap:pretty]",children:body}),jsxs("span",{className:"flex items-center gap-2.5 flex-wrap",children:[jsx(RelativeTime,{at:item.at}),item.action&&jsx("button",{type:"button",onClick:()=>{onAction?.(item);onOpen?.(item)},className:"text-micro font-extrabold text-brand cursor-pointer hover:text-brand-hover transition-colors",children:item.action.label})]})]}),onDismiss&&jsx("button",{type:"button",onClick:()=>onDismiss(item.id),"aria-label":dismissLabel??ui.dismiss,className:cn("shrink-0 size-7 rounded-sm flex items-center justify-center text-muted2 cursor-pointer","opacity-0 group-hover/row:opacity-100 focus-visible:opacity-100","hover:bg-hover hover:text-ink transition-colors"),children:jsx(X,{size:14,"aria-hidden":"true"})})]})}function NotificationList({items,onOpen,onDismiss,emptyTitle,emptyDescription,className}){const ui=useUIText();if(items.length===0){return jsx(EmptyState,{icon:BellOff,title:emptyTitle??ui.noNotifications,description:emptyDescription??ui.noNotificationsDesc})}return jsx("div",{className:cn("flex flex-col",className),children:items.map(n=>jsx(NotificationRow,{item:n,onOpen,onDismiss},n.id))})}function NotificationPanel({items,title,unread=0,needsAction=0,onMarkAllRead,markAllLabel,onViewAll,viewAllLabel,sound,onOpen,onDismiss,emptyTitle,emptyDescription,className}){const ui=useUIText();return jsxs("div",{className:cn("w-[22rem] max-w-[calc(100vw-2rem)] bg-surface border border-line rounded-lg shadow-pop","overflow-clip flex flex-col animate-qfade",className),children:[jsxs("div",{className:"shrink-0 flex items-center justify-between gap-2.5 px-4 py-3.5 border-b border-line",children:[jsxs("span",{className:"flex items-center gap-2 min-w-0",children:[jsx("span",{className:"text-lead font-extrabold truncate",children:title??ui.notifications}),unread>0&&jsx(Counter,{value:unread})]}),jsxs("span",{className:"shrink-0 flex items-center gap-2.5",children:[sound&&jsx(SoundToggle,{...sound}),onMarkAllRead&&unread>0&&jsxs("button",{type:"button",onClick:onMarkAllRead,className:"inline-flex items-center gap-1.5 text-micro font-bold text-brand cursor-pointer hover:text-brand-hover transition-colors",children:[jsx(CheckCheck,{size:13,"aria-hidden":"true"}),markAllLabel??ui.markAllRead]})]})]}),needsAction>0&&jsxs("p",{className:"shrink-0 m-0 px-4 py-2.5 bg-amber-bg border-b border-amber-line text-caption leading-[1.6] text-amber-ink",children:[jsx("span",{"data-num":true,className:"font-extrabold",children:needsAction})," ","\u0645\u062D\u062A\u0627\u062C\u064A\u0646 \u0625\u062C\u0631\u0627\u0621 \u2014 \u0628\u064A\u0641\u0636\u0644\u0648\u0627 \u0644\u062D\u062F \u0645\u0627 \u062A\u062A\u0639\u0627\u0645\u0644 \u0645\u0639\u0627\u0647\u0645\u060C \u0648\xAB\u062A\u0639\u0644\u064A\u0645 \u0627\u0644\u0643\u0644\xBB \u0645\u0627\u0628\u064A\u0645\u0633\u062D\u0647\u0645\u0634."]}),jsx("div",{className:"flex-1 min-h-0 max-h-[21rem] overflow-y-auto overscroll-contain",children:jsx(NotificationList,{items,onOpen,onDismiss,emptyTitle:emptyTitle??ui.noNotifications,emptyDescription:emptyDescription??ui.noNotificationsDesc})}),onViewAll&&items.length>0&&jsx("button",{type:"button",onClick:onViewAll,className:"shrink-0 w-full p-3 border-t border-line text-ui font-bold text-brand cursor-pointer hover:bg-hover transition-colors",children:viewAllLabel??ui.viewAllNotifications})]})}function SoundToggle({muted,setMuted,ready,className}){const ui=useUIText();const blocked=!muted&&!ready;const label=muted?"\u0634\u063A\u0651\u0644 \u0635\u0648\u062A \u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062A":blocked?"\u0627\u0644\u0635\u0648\u062A \u0645\u0633\u062A\u0646\u064A \u0623\u0648\u0644 \u062A\u0641\u0627\u0639\u0644 \u0645\u0639 \u0627\u0644\u0635\u0641\u062D\u0629":"\u0627\u0643\u062A\u0645 \u0635\u0648\u062A \u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062A";return jsx("button",{type:"button",onClick:()=>setMuted(!muted),title:label??ui.notifications,"aria-label":label??ui.notifications,"aria-pressed":muted,className:cn("size-7 rounded-sm flex items-center justify-center cursor-pointer transition-colors",blocked?"text-amber-ink":"text-muted2 hover:text-ink hover:bg-hover",className),children:muted||blocked?jsx(BellOff,{size:14,"aria-hidden":"true"}):jsx(Bell2,{size:14,"aria-hidden":"true"})})}var MENU_ALIGN={start:"start-0",end:"end-0"};var MENU_SIDE={bottom:"top-full mt-2",top:"bottom-full mb-2"};function NotificationMenu({unread,bellLabel,align="end",side="bottom",className,onViewAll,onOpen,...panel}){const[open,setOpen]=useState3(false);const wrap=useRef4(null);const id=useId();useEffect4(()=>{if(!open)return;function onKey(e){if(e.key==="Escape")setOpen(false)}function onDown(e){if(!wrap.current?.contains(e.target))setOpen(false)}document.addEventListener("keydown",onKey);document.addEventListener("mousedown",onDown);return()=>{document.removeEventListener("keydown",onKey);document.removeEventListener("mousedown",onDown)}},[open]);return jsxs("div",{ref:wrap,className:cn("relative",className),children:[jsx(NotificationBell,{unread,needsAction:panel.needsAction,expanded:open,label:bellLabel,onClick:()=>setOpen(o=>!o)}),open&&jsx("div",{role:"dialog","aria-label":bellLabel??"\u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062A",id,className:cn("absolute z-50",MENU_ALIGN[align],MENU_SIDE[side]),children:jsx(NotificationPanel,{...panel,unread,onOpen:n=>{setOpen(false);onOpen?.(n)},onViewAll:onViewAll&&(()=>{setOpen(false);onViewAll()})})})]})}function NotificationDrawer({open,onClose,items,title,unread=0,needsAction=0,onMarkAllRead,markAllLabel,closeLabel,onOpen,onDismiss,emptyTitle,emptyDescription}){const ui=useUIText();return jsxs(Drawer,{open,onClose,closeLabel:closeLabel??ui.close,title:jsxs("span",{className:"flex items-center gap-2",children:[title??ui.notifications,unread>0&&jsx(Counter,{value:unread})]}),bodyClassName:"p-0",footer:onMarkAllRead&&unread>0?jsxs("button",{type:"button",onClick:onMarkAllRead,className:"inline-flex items-center gap-1.5 text-ui font-bold text-brand cursor-pointer hover:text-brand-hover transition-colors",children:[jsx(CheckCheck,{size:15,"aria-hidden":"true"}),markAllLabel??ui.markAllRead]}):void 0,children:[needsAction>0&&jsxs("p",{className:"m-0 px-4 py-2.5 bg-amber-bg border-b border-amber-line text-caption leading-[1.6] text-amber-ink",children:[jsx("span",{"data-num":true,className:"font-extrabold",children:needsAction})," ","\u0645\u062D\u062A\u0627\u062C\u064A\u0646 \u0625\u062C\u0631\u0627\u0621 \u2014 \u0628\u064A\u0641\u0636\u0644\u0648\u0627 \u0644\u062D\u062F \u0645\u0627 \u062A\u062A\u0639\u0627\u0645\u0644 \u0645\u0639\u0627\u0647\u0645\u060C \u0648\xAB\u062A\u0639\u0644\u064A\u0645 \u0627\u0644\u0643\u0644\xBB \u0645\u0627\u0628\u064A\u0645\u0633\u062D\u0647\u0645\u0634."]}),jsx(NotificationList,{items,onOpen:n=>{onClose();onOpen?.(n)},onDismiss,emptyTitle:emptyTitle??ui.noNotifications,emptyDescription:emptyDescription??ui.noNotificationsDesc})]})}var PLACEMENT={"top-start":"top-4 sm:start-5","top-end":"top-4 sm:end-5","bottom-start":"bottom-4 sm:start-5","bottom-end":"bottom-4 sm:end-5"};var PLACEMENT_ANIM={"top-start":"animate-qfade","top-end":"animate-qfade","bottom-start":"animate-tip","bottom-end":"animate-tip"};function NotificationToastHost({items,onClose,onOpen,placement="top-end",width="sm:w-[22rem]",closeLabel,regionLabel,className}){const ui=useUIText();if(items.length===0)return null;return jsx("div",{role:"region","aria-label":regionLabel??ui.newNotifications,"aria-live":"polite",className:cn("fixed z-[60] inset-x-4 sm:inset-x-auto flex flex-col gap-2 pointer-events-none",PLACEMENT[placement],width,className),children:items.map(n=>jsx(ToastCard,{n,placement,closeLabel:closeLabel??ui.close,onClose,onOpen},n.id))})}function ToastCard({n,placement,closeLabel,onClose,onOpen}){const ui=useUIText();const{onAction}=useNotificationContext();const{kind:k,title,body}=useText(n);const Icon=k.icon;return jsxs("div",{className:cn("pointer-events-auto flex items-start gap-3 p-3.5 rounded-card","bg-surface border border-line shadow-panel",PLACEMENT_ANIM[placement]),children:[jsx("span",{"aria-hidden":"true",className:cn("size-8.5 rounded-sm flex items-center justify-center shrink-0",TONE_SOFT[k.tone]),children:jsx(Icon,{size:16,strokeWidth:2})}),jsxs("span",{className:"flex-1 min-w-0 flex flex-col gap-1",children:[jsx("span",{className:"text-ui font-extrabold text-ink",children:title??ui.notifications}),body&&jsx("span",{className:"text-caption leading-[1.65] text-muted [text-wrap:pretty] line-clamp-2",children:body}),n.action&&jsx("button",{type:"button",onClick:()=>{onAction?.(n);onOpen?.(n);onClose(n.id)},className:"w-fit text-micro font-extrabold text-brand cursor-pointer hover:text-brand-hover transition-colors",children:n.action.label})]}),jsx("button",{type:"button",onClick:()=>onClose(n.id),"aria-label":closeLabel??ui.close,className:"shrink-0 size-7 rounded-sm flex items-center justify-center text-muted2 hover:bg-hover hover:text-ink cursor-pointer transition-colors",children:jsx(X,{size:14,"aria-hidden":"true"})})]})}export{NOTIFICATION_PRIORITIES,NOTIFICATION_SCHEMA_VERSION,NOTIFICATION_SOUNDS,NotificationBell,NotificationDrawer,NotificationList,NotificationMenu,NotificationPanel,NotificationProvider,NotificationRow,NotificationToastHost,QUMRA_KINDS,QUMRA_NOTIFICATIONS,SoundToggle,createKindRegistry,formatRelativeTime,isBulkReadable,optimistic,parseNotification,parseNotifications,relativeTickMs,serializeNotification,useNotificationCenter,useNotificationContext,useNotificationSound,useNotifications};
|
package/dist/tokens.css
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qumra/fanar",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Qumra's Arabic-first component library and design tokens. Tailwind 4, RSC-safe.",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -170,6 +170,7 @@
|
|
|
170
170
|
"check-engines": "node scripts/check-engines.mjs",
|
|
171
171
|
"check-tokens": "node scripts/check.mjs",
|
|
172
172
|
"check-contrast": "node scripts/check-contrast.mjs",
|
|
173
|
+
"check-overflow": "node scripts/check-overflow.mjs",
|
|
173
174
|
"test": "vitest run",
|
|
174
175
|
"check-publish": "node scripts/check-publish.mjs",
|
|
175
176
|
"test:watch": "vitest",
|
package/dist/chunk-APE2XWSN.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import{cn,useUIText}from"./chunk-DDRJTIIP.js";import{useCallback,useRef,useState}from"react";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);return jsxs("span",{className:"relative inline-flex",onMouseEnter:()=>setOpen(true),onMouseLeave:()=>setOpen(false),onFocus:()=>setOpen(true),onBlur:()=>setOpen(false),children:[children,open&&jsx("span",{role:"tooltip",className:cn("absolute z-40 start-1/2 -translate-x-1/2 rtl:translate-x-1/2 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",side==="top"?"bottom-[calc(100%+7px)]":"top-[calc(100%+7px)]"),children:content})]})}export{useToasts,ToastHost,Tooltip};
|
package/dist/chunk-JJCKT5OO.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import{TONE_SOFT,TONE_SOLID,cn,useUIText}from"./chunk-DDRJTIIP.js";import{useCallback,useEffect,useRef,useState}from"react";var INITIAL={playing:false,time:0,duration:0,buffered:0,volume:1,muted:false,rate:1,waiting:false,ended:false};function useMedia(){const ref=useRef(null);const[state,setState]=useState(INITIAL);useEffect(()=>{const el=ref.current;if(!el)return;const patch=p=>setState(s=>({...s,...p}));const onTime=()=>{let end=0;const b=el.buffered;for(let i=0;i<b.length;i++){if(b.start(i)<=el.currentTime&&el.currentTime<=b.end(i))end=b.end(i)}patch({time:el.currentTime,buffered:end})};const onMeta=()=>patch({duration:Number.isFinite(el.duration)?el.duration:0,ended:false});const onPlay=()=>patch({playing:true,ended:false});const onPause=()=>patch({playing:false});const onEnded=()=>patch({playing:false,ended:true});const onWaiting=()=>patch({waiting:true});const onPlaying=()=>patch({waiting:false,playing:true});const onVolume=()=>patch({volume:el.volume,muted:el.muted});const onRate=()=>patch({rate:el.playbackRate});el.addEventListener("timeupdate",onTime);el.addEventListener("progress",onTime);el.addEventListener("loadedmetadata",onMeta);el.addEventListener("durationchange",onMeta);el.addEventListener("play",onPlay);el.addEventListener("pause",onPause);el.addEventListener("ended",onEnded);el.addEventListener("waiting",onWaiting);el.addEventListener("playing",onPlaying);el.addEventListener("volumechange",onVolume);el.addEventListener("ratechange",onRate);if(el.readyState>=1)onMeta();return()=>{el.removeEventListener("timeupdate",onTime);el.removeEventListener("progress",onTime);el.removeEventListener("loadedmetadata",onMeta);el.removeEventListener("durationchange",onMeta);el.removeEventListener("play",onPlay);el.removeEventListener("pause",onPause);el.removeEventListener("ended",onEnded);el.removeEventListener("waiting",onWaiting);el.removeEventListener("playing",onPlaying);el.removeEventListener("volumechange",onVolume);el.removeEventListener("ratechange",onRate)}},[]);useEffect(()=>{if(!state.playing)return;let raf=0;const tick=()=>{const el=ref.current;if(el)setState(s=>s.time===el.currentTime?s:{...s,time:el.currentTime});raf=requestAnimationFrame(tick)};raf=requestAnimationFrame(tick);return()=>cancelAnimationFrame(raf)},[state.playing]);const toggle=useCallback(()=>{const el=ref.current;if(!el)return;if(el.paused)void el.play();else el.pause()},[]);const seek=useCallback(to=>{const el=ref.current;if(!el)return;el.currentTime=Math.max(0,Math.min(to,el.duration||0))},[]);const skip=useCallback(by=>{const el=ref.current;if(el)seek(el.currentTime+by)},[seek]);const setVolume=useCallback(v=>{const el=ref.current;if(!el)return;el.volume=Math.max(0,Math.min(1,v));if(el.volume>0)el.muted=false},[]);const toggleMute=useCallback(()=>{const el=ref.current;if(el)el.muted=!el.muted},[]);const setRate=useCallback(r=>{const el=ref.current;if(el)el.playbackRate=r},[]);return{ref,state,toggle,seek,skip,setVolume,toggleMute,setRate}}function formatTime(seconds){if(!Number.isFinite(seconds)||seconds<0)return"0:00";const total=Math.floor(seconds);const s=total%60;const m=Math.floor(total/60)%60;const h=Math.floor(total/3600);const pad=n=>String(n).padStart(2,"0");return h>0?`${h}:${pad(m)}:${pad(s)}`:`${m}:${pad(s)}`}var RATES=[.5,.75,1,1.25,1.5,2];import{useCallback as useCallback2,useRef as useRef2,useState as useState2}from"react";import{jsx,jsxs}from"react/jsx-runtime";function Scrubber({time,duration,buffered,onSeek,chapters,label,size="md"}){const ui=useUIText();const bar=useRef2(null);const[hover,setHover]=useState2(null);const pct=duration>0?time/duration*100:0;const buf=duration>0?(buffered??0)/duration*100:0;const atPointer=useCallback2(clientX=>{const box=bar.current?.getBoundingClientRect();if(!box||duration<=0)return null;const ratio=Math.max(0,Math.min(1,(clientX-box.left)/box.width));return ratio*duration},[duration]);const h=size==="sm"?"h-1":"h-1.5";return jsxs("div",{dir:"ltr",className:"relative group/scrub w-full py-2 select-none",children:[hover!==null&&jsx("span",{"data-num":true,style:{insetInlineStart:`${hover/duration*100}%`},className:"absolute bottom-full mb-1 -translate-x-1/2 px-1.5 py-0.5 rounded-xs bg-night text-white text-micro font-bold pointer-events-none whitespace-nowrap",children:formatTime(hover)}),jsxs("div",{ref:bar,onMouseMove:e=>setHover(atPointer(e.clientX)),onMouseLeave:()=>setHover(null),className:cn("relative w-full rounded-full bg-white/25 overflow-visible",h),children:[jsx("span",{"aria-hidden":"true",style:{width:`${buf}%`},className:cn("absolute inset-y-0 start-0 rounded-full bg-white/30",h)}),jsx("span",{"aria-hidden":"true",style:{width:`${pct}%`},className:cn("absolute inset-y-0 start-0 rounded-full bg-brand",h)}),chapters?.map(c=>duration>0&&c.at>0&&c.at<duration?jsx("span",{title:c.title,"aria-hidden":"true",style:{insetInlineStart:`${c.at/duration*100}%`},className:"absolute inset-y-0 w-0.5 -translate-x-1/2 bg-night/50"},`${c.at}-${c.title}`):null),jsx("span",{"aria-hidden":"true",style:{insetInlineStart:`${pct}%`},className:"absolute top-1/2 -translate-y-1/2 -translate-x-1/2 size-3 rounded-full bg-white shadow-raise scale-0 transition-transform group-hover/scrub:scale-100 group-focus-within/scrub:scale-100"}),jsx("input",{type:"range",min:0,max:duration||0,step:.1,value:time,"aria-label":label??ui.playbackPosition,"aria-valuetext":`${formatTime(time)} \u0645\u0646 ${formatTime(duration)}`,onChange:e=>onSeek(Number(e.target.value)),className:"absolute inset-0 w-full h-full opacity-0 cursor-pointer"})]})]})}import{useCallback as useCallback3,useEffect as useEffect2,useRef as useRef3,useState as useState3}from"react";import{Gauge,Loader2,Maximize,Minimize,Pause,PictureInPicture2,Play,RotateCcw,RotateCw,Volume2,VolumeX,X}from"lucide-react";import{jsx as jsx2,jsxs as jsxs2}from"react/jsx-runtime";function CtrlButton({onClick,label,children,active}){return jsx2("button",{type:"button",onClick,"aria-label":label,title:label,className:cn("size-9 rounded-sm inline-flex items-center justify-center shrink-0 cursor-pointer transition-colors","focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white",active?"bg-white/20 text-white":"text-white/80 hover:bg-white/15 hover:text-white"),children})}function SuggestionCard({item,wide}){return jsxs2("button",{type:"button",onClick:item.onSelect,className:cn("group/sug flex flex-col gap-1.5 text-start cursor-pointer shrink-0","focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white rounded-sm",wide?"w-full":"w-40"),children:[jsxs2("span",{className:"relative block w-full aspect-video rounded-sm overflow-hidden bg-white/10 border border-white/15 transition-colors group-hover/sug:border-brand-100",children:[item.poster&&jsx2("img",{src:item.poster,alt:"",loading:"lazy",className:"w-full h-full object-cover"}),typeof item.duration==="number"&&jsx2("span",{"data-num":true,className:"absolute bottom-1 end-1 px-1 py-px rounded-xs bg-black/75 text-white text-micro font-bold",children:formatTime(item.duration)})]}),jsx2("span",{className:"text-caption font-bold text-white/90 leading-snug line-clamp-2 group-hover/sug:text-white",children:item.title})]})}function VideoPlayer({src,poster,title,chapters,captions,suggestions,suggestAt=10,autoPlay,loop,className}){const ui=useUIText();const{ref,state,toggle,seek,skip,setVolume,toggleMute,setRate}=useMedia();const shell=useRef3(null);const[full,setFull]=useState3(false);const[rateOpen,setRateOpen]=useState3(false);const[idle,setIdle]=useState3(false);const[dismissed,setDismissed]=useState3(false);const idleTimer=useRef3(void 0);const wake=useCallback3(()=>{setIdle(false);clearTimeout(idleTimer.current);idleTimer.current=setTimeout(()=>setIdle(true),2500)},[]);useEffect2(()=>{if(!state.playing)clearTimeout(idleTimer.current)},[state.playing]);useEffect2(()=>()=>clearTimeout(idleTimer.current),[]);useEffect2(()=>{const onFs=()=>setFull(document.fullscreenElement===shell.current);document.addEventListener("fullscreenchange",onFs);return()=>document.removeEventListener("fullscreenchange",onFs)},[]);async function toggleFull(){if(document.fullscreenElement)await document.exitFullscreen();else await shell.current?.requestFullscreen()}async function togglePip(){const el=ref.current;if(!el)return;if(document.pictureInPictureElement)await document.exitPictureInPicture();else await el.requestPictureInPicture()}const onKey=e=>{const keys=[" ","k","ArrowRight","ArrowLeft","ArrowUp","ArrowDown","m","f","j","l"];if(!keys.includes(e.key))return;e.preventDefault();wake();const el=ref.current;if(!el)return;switch(e.key){case" ":case"k":toggle();break;case"ArrowRight":case"l":skip(e.key==="l"?10:5);break;case"ArrowLeft":case"j":skip(e.key==="j"?-10:-5);break;case"ArrowUp":setVolume(el.volume+.1);break;case"ArrowDown":setVolume(el.volume-.1);break;case"m":toggleMute();break;case"f":void toggleFull();break}};const showChrome=!state.playing||!idle||state.ended;const has=Boolean(suggestions?.length);const remaining=state.duration-state.time;const nearEnd=state.duration>0&&remaining<=suggestAt&&!state.ended;const showStrip=has&&nearEnd&&!dismissed;const showEndScreen=has&&state.ended;return jsxs2("div",{ref:shell,role:"group","aria-label":title??ui.videoPlayer,tabIndex:0,onKeyDown:onKey,onMouseMove:wake,onMouseLeave:()=>state.playing&&setIdle(true),className:cn("relative bg-night rounded-card overflow-hidden group/player","focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand",full?"w-screen h-screen rounded-none":"w-full aspect-video",className),children:[jsx2("video",{ref,src,poster,autoPlay,loop,playsInline:true,onClick:toggle,className:"w-full h-full object-contain cursor-pointer bg-night",children:captions&&jsx2("track",{kind:"captions",src:captions,srcLang:"ar",label:ui.arabic,default:true})}),state.waiting&&jsx2("span",{className:"absolute inset-0 flex items-center justify-center pointer-events-none",children:jsx2(Loader2,{size:40,className:"animate-spin text-white/90","aria-hidden":"true"})}),(!state.playing||state.ended)&&!state.waiting&&!showEndScreen&&jsx2("button",{type:"button",onClick:toggle,"aria-label":state.ended?"\u0634\u063A\u0651\u0644 \u0645\u0646 \u0627\u0644\u0623\u0648\u0644":"\u062A\u0634\u063A\u064A\u0644",className:"absolute inset-0 flex items-center justify-center cursor-pointer group/big",children:jsx2("span",{className:"size-16 rounded-full bg-brand text-white flex items-center justify-center shadow-pop transition-transform group-hover/big:scale-110",children:state.ended?jsx2(RotateCcw,{size:26,"aria-hidden":"true"}):jsx2(Play,{size:28,className:"ml-1 icon-fixed",fill:"currentColor","aria-hidden":"true"})})}),title&&jsx2("div",{className:cn("absolute inset-x-0 top-0 p-4 bg-gradient-to-b from-black/70 to-transparent transition-opacity duration-200 pointer-events-none",showChrome?"opacity-100":"opacity-0"),children:jsx2("span",{className:"text-body font-extrabold text-white [text-wrap:balance]",children:title})}),showStrip&&jsx2("div",{className:"absolute inset-x-0 bottom-20 px-3 animate-[fade-in_.2s_ease-out]",children:jsxs2("div",{className:"flex items-end gap-3 p-3 rounded-card bg-black/70 backdrop-blur-sm border border-white/10",children:[jsxs2("div",{className:"flex flex-col gap-2 min-w-0 flex-1",children:[jsxs2("span",{className:"flex items-center gap-2 text-caption font-extrabold text-white/90",children:["\u0634\u0648\u0641 \u0643\u0645\u0627\u0646",jsxs2("span",{"data-num":true,className:"text-micro font-bold text-brand-100",children:["\u0627\u0644\u0645\u0642\u0637\u0639 \u0628\u064A\u062E\u0644\u0635 \u062E\u0644\u0627\u0644 ",Math.max(0,Math.ceil(remaining))," \u062B"]})]}),jsx2("div",{className:"flex gap-2.5 overflow-x-auto pb-1",children:suggestions?.slice(0,4).map(s=>jsx2(SuggestionCard,{item:s},s.id))})]}),jsx2("button",{type:"button",onClick:()=>setDismissed(true),"aria-label":ui.hideSuggestions,className:"size-8 rounded-sm shrink-0 flex items-center justify-center text-white/60 hover:bg-white/15 hover:text-white cursor-pointer transition-colors",children:jsx2(X,{size:16,"aria-hidden":"true"})})]})}),showEndScreen&&jsxs2("div",{className:"absolute inset-0 bg-night/92 backdrop-blur-sm flex flex-col gap-4 p-5 overflow-y-auto animate-[fade-in_.22s_ease-out]",children:[jsxs2("div",{className:"flex items-center justify-between gap-3 shrink-0",children:[jsx2("span",{className:"text-body font-extrabold text-white",children:ui.seeMore}),jsxs2("button",{type:"button",onClick:toggle,className:"inline-flex items-center gap-2 h-9 px-3.5 rounded-sm bg-white/10 text-white text-ui font-bold cursor-pointer transition-colors hover:bg-white/20",children:[jsx2(RotateCcw,{size:15,"aria-hidden":"true"}),"\u0634\u063A\u0651\u0644 \u0645\u0646 \u0627\u0644\u0623\u0648\u0644"]})]}),jsx2("div",{className:"grid gap-3 [grid-template-columns:repeat(auto-fill,minmax(150px,1fr))]",children:suggestions?.map(s=>jsx2(SuggestionCard,{item:s,wide:true},s.id))})]}),jsxs2("div",{className:cn("absolute inset-x-0 bottom-0 px-3 pb-2 pt-8 bg-gradient-to-t from-black/80 to-transparent transition-opacity duration-200",showChrome?"opacity-100":"opacity-0 pointer-events-none"),children:[jsx2(Scrubber,{time:state.time,duration:state.duration,buffered:state.buffered,onSeek:seek,chapters}),jsxs2("div",{className:"flex items-center gap-1 flex-wrap",children:[jsx2(CtrlButton,{onClick:toggle,label:state.playing?"\u0625\u064A\u0642\u0627\u0641 \u0645\u0624\u0642\u062A":"\u062A\u0634\u063A\u064A\u0644",children:state.playing?jsx2(Pause,{size:18,fill:"currentColor"}):jsx2(Play,{size:18,fill:"currentColor"})}),jsx2(CtrlButton,{onClick:()=>skip(-10),label:ui.back10,children:jsx2(RotateCcw,{size:17})}),jsx2(CtrlButton,{onClick:()=>skip(10),label:ui.forward10,children:jsx2(RotateCw,{size:17})}),jsxs2("span",{className:"flex items-center group/vol",children:[jsx2(CtrlButton,{onClick:toggleMute,label:state.muted?"\u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u0635\u0648\u062A":"\u0643\u062A\u0645",children:state.muted||state.volume===0?jsx2(VolumeX,{size:18}):jsx2(Volume2,{size:18})}),jsx2("span",{className:"h-9 flex items-center overflow-hidden w-0 group-hover/vol:w-20 focus-within:w-20 transition-[width] duration-200",children:jsx2("input",{type:"range",min:0,max:1,step:.05,value:state.muted?0:state.volume,onChange:e=>setVolume(Number(e.target.value)),"aria-label":ui.volume,dir:"ltr",className:"w-20 accent-brand cursor-pointer"})})]}),jsxs2("span",{"data-num":true,className:"px-2 text-caption font-bold text-white/90 whitespace-nowrap",children:[formatTime(state.time)," / ",formatTime(state.duration)]}),jsx2("span",{className:"flex-1"}),jsxs2("span",{className:"relative flex",children:[jsx2(CtrlButton,{onClick:()=>setRateOpen(v=>!v),label:ui.playbackSpeed,active:rateOpen,children:jsxs2("span",{className:"flex items-center gap-1",children:[jsx2(Gauge,{size:17}),state.rate!==1&&jsxs2("span",{"data-num":true,className:"text-micro font-extrabold",children:[state.rate,"\xD7"]})]})}),rateOpen&&jsx2("div",{className:"absolute bottom-full end-0 mb-2 py-1 rounded-card bg-night border border-white/15 shadow-pop min-w-20",children:RATES.map(r=>jsx2("button",{type:"button",onClick:()=>{setRate(r);setRateOpen(false)},className:cn("w-full px-3 py-1.5 text-ui text-center cursor-pointer transition-colors",r===state.rate?"text-brand-100 font-extrabold":"text-white/80 hover:bg-white/10"),children:jsxs2("span",{"data-num":true,children:[r,"\xD7"]})},r))})]}),"pictureInPictureEnabled"in document&&jsx2(CtrlButton,{onClick:()=>void togglePip(),label:ui.pictureInPicture,children:jsx2(PictureInPicture2,{size:17})}),jsx2(CtrlButton,{onClick:()=>void toggleFull(),label:full?"\u062E\u0631\u0648\u062C \u0645\u0646 \u0645\u0644\u0621 \u0627\u0644\u0634\u0627\u0634\u0629":"\u0645\u0644\u0621 \u0627\u0644\u0634\u0627\u0634\u0629",children:full?jsx2(Minimize,{size:17}):jsx2(Maximize,{size:17})})]})]})]})}import{memo,useEffect as useEffect3,useImperativeHandle,useMemo,useRef as useRef4,useState as useState4}from"react";import{Gauge as Gauge2,Loader2 as Loader22,Pause as Pause2,Play as Play2,RotateCcw as RotateCcw2,RotateCw as RotateCw2,Volume2 as Volume22,VolumeX as VolumeX2}from"lucide-react";import{jsx as jsx3,jsxs as jsxs3}from"react/jsx-runtime";var PEAKS_CACHE=new Map;var ANALYSIS_BUCKETS=512;var BAR=3;var GAP=2;async function analyse(src,buckets){const cached=PEAKS_CACHE.get(src);if(cached!==void 0)return cached;try{const res=await fetch(src);const raw=await res.arrayBuffer();const Ctx2=window.AudioContext??window.webkitAudioContext;if(!Ctx2)throw new Error("\u0645\u0627\u0641\u064A\u0634 Web Audio");const ctx=new Ctx2;const buffer=await ctx.decodeAudioData(raw);const data=buffer.getChannelData(0);const per=Math.floor(data.length/buckets);const peaks=[];for(let i=0;i<buckets;i++){let max=0;for(let j=0;j<per;j++){const v=Math.abs(data[i*per+j]??0);if(v>max)max=v}peaks.push(max)}void ctx.close();const top=Math.max(...peaks,.01);const normalised=peaks.map(p=>p/top);PEAKS_CACHE.set(src,normalised);return normalised}catch{PEAKS_CACHE.set(src,null);return null}}var BarRow=memo(function BarRow2({peaks,color}){return jsx3("div",{"aria-hidden":"true",className:"absolute inset-0 flex items-center justify-between",style:{gap:GAP},children:peaks.map((p,i)=>jsx3("span",{style:{height:`${Math.max(8,p*100)}%`,width:BAR},className:cn("shrink-0 rounded-full",color)},i))})});function Waveform({peaks,time,duration,onSeek,bars,height=48}){const ui=useUIText();const box=useRef4(null);const[count,setCount]=useState4(bars??0);const[width,setWidth]=useState4(0);useEffect3(()=>{const el=box.current;if(!el)return;const measure=()=>{setWidth(el.clientWidth);if(!bars)setCount(Math.max(8,Math.floor(el.clientWidth/(BAR+GAP))))};measure();const ro=new ResizeObserver(measure);ro.observe(el);return()=>ro.disconnect()},[bars]);const shown=useMemo(()=>{if(count<=0)return[];const per=peaks.length/count;return Array.from({length:count},(_,i)=>{let max=0;for(let j=Math.floor(i*per);j<Math.floor((i+1)*per);j++){if(peaks[j]>max)max=peaks[j]}return max})},[peaks,count]);const played=duration>0?Math.min(1,time/duration):0;const grey=useMemo(()=>jsx3(BarRow,{peaks:shown,color:"bg-border/50"}),[shown]);const teal=useMemo(()=>jsx3(BarRow,{peaks:shown,color:"bg-brand"}),[shown]);return jsxs3("div",{dir:"ltr",className:"relative w-full",style:{height},children:[jsx3("div",{ref:box,className:"absolute inset-0",children:grey}),jsx3("div",{"aria-hidden":"true",className:"absolute inset-y-0 start-0 overflow-hidden pointer-events-none",style:{width:`${played*100}%`},children:jsx3("div",{className:"relative h-full",style:{width:width||"100%"},children:teal})}),jsx3("input",{type:"range",min:0,max:duration||0,step:.1,value:time,"aria-label":ui.playbackPosition,"aria-valuetext":`${formatTime(time)} \u0645\u0646 ${formatTime(duration)}`,onChange:e=>onSeek(Number(e.target.value)),className:"absolute inset-0 w-full h-full opacity-0 cursor-pointer"})]})}function Btn({onClick,label,children,small}){return jsx3("button",{type:"button",onClick,"aria-label":label,title:label,className:cn("rounded-sm inline-flex items-center justify-center shrink-0 cursor-pointer transition-colors","text-muted hover:bg-hover hover:text-ink","focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand",small?"size-8":"size-9"),children})}function AudioPlayer({src,title,meta,cover,variant="card",bars,onLevel,mediaRef,className}){const ui=useUIText();const{ref,state,toggle,seek,skip,setVolume,toggleMute,setRate}=useMedia();const[peaks,setPeaks]=useState4(null);const[analysing,setAnalysing]=useState4(false);const[rateOpen,setRateOpen]=useState4(false);const alive=useRef4(true);useEffect3(()=>{alive.current=true;return()=>{alive.current=false}},[]);useEffect3(()=>{if(variant==="row")return;let live=true;void Promise.resolve().then(()=>live&&setAnalysing(true));void analyse(src,ANALYSIS_BUCKETS).then(p=>{live=false;if(!alive.current)return;setPeaks(p);setAnalysing(false)})},[src,variant]);useImperativeHandle(mediaRef,()=>ref.current,[ref]);useEffect3(()=>{if(!onLevel)return;if(!peaks||state.duration<=0||!state.playing){onLevel(0);return}const i=Math.min(peaks.length-1,Math.floor(state.time/state.duration*peaks.length));onLevel(peaks[i]??0)},[onLevel,peaks,state.time,state.duration,state.playing]);const PlayBtn=jsx3("button",{type:"button",onClick:toggle,"aria-label":state.playing?"\u0625\u064A\u0642\u0627\u0641 \u0645\u0624\u0642\u062A":"\u062A\u0634\u063A\u064A\u0644",className:cn("rounded-full bg-brand text-white flex items-center justify-center shrink-0 cursor-pointer transition-colors hover:bg-brand-hover","focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand",variant==="row"?"size-9":"size-11"),children:state.playing?jsx3(Pause2,{size:variant==="row"?16:18,fill:"currentColor","aria-hidden":"true"}):jsx3(Play2,{size:variant==="row"?16:18,className:"ml-0.5 icon-fixed",fill:"currentColor","aria-hidden":"true"})});const audio=jsx3("audio",{ref,src,preload:"metadata"});if(variant==="row"){return jsxs3("div",{className:cn("flex items-center gap-3 p-2.5 rounded-card border border-line bg-surface",className),children:[audio,PlayBtn,jsxs3("span",{className:"flex flex-col gap-1 flex-1 min-w-0",children:[title&&jsx3("span",{className:"text-ui font-bold text-ink truncate",children:title}),jsxs3("span",{dir:"ltr",className:"relative h-1 rounded-full bg-hover overflow-hidden",children:[jsx3("span",{"aria-hidden":"true",style:{width:`${state.duration?state.time/state.duration*100:0}%`},className:"absolute inset-y-0 start-0 bg-brand rounded-full"}),jsx3("input",{type:"range",min:0,max:state.duration||0,step:.1,value:state.time,"aria-label":ui.playbackPosition,onChange:e=>seek(Number(e.target.value)),className:"absolute inset-0 w-full opacity-0 cursor-pointer"})]})]}),jsxs3("span",{"data-num":true,className:"text-micro text-muted2 shrink-0",children:[formatTime(state.time)," / ",formatTime(state.duration)]})]})}return jsxs3("div",{className:cn("flex flex-col gap-3.5 p-4 rounded-card border border-line bg-surface",className),children:[audio,(title||cover)&&jsxs3("div",{className:"flex items-center gap-3",children:[cover&&jsx3("img",{src:cover,alt:"",className:"size-12 rounded-sm object-cover border border-line shrink-0"}),jsxs3("span",{className:"flex flex-col gap-0.5 min-w-0",children:[title&&jsx3("span",{className:"text-body font-extrabold text-ink truncate",children:title}),meta&&jsx3("span",{className:"text-caption text-muted truncate",children:meta})]})]}),jsx3("div",{className:"min-h-12 flex items-center",children:analysing?jsxs3("span",{className:"w-full flex items-center justify-center gap-2 text-caption text-muted2",children:[jsx3(Loader22,{size:14,className:"animate-spin","aria-hidden":"true"}),"\u0628\u064A\u062D\u0644\u0651\u0644 \u0627\u0644\u0645\u0648\u062C\u0629\u2026"]}):peaks?jsx3(Waveform,{peaks,time:state.time,duration:state.duration,onSeek:seek,bars}):jsxs3("span",{dir:"ltr",className:"relative w-full h-1.5 rounded-full bg-hover",children:[jsx3("span",{"aria-hidden":"true",style:{width:`${state.duration?state.time/state.duration*100:0}%`},className:"absolute inset-y-0 start-0 bg-brand rounded-full"}),jsx3("input",{type:"range",min:0,max:state.duration||0,step:.1,value:state.time,"aria-label":ui.playbackPosition,onChange:e=>seek(Number(e.target.value)),className:"absolute inset-0 w-full opacity-0 cursor-pointer"})]})}),jsxs3("div",{className:"flex items-center gap-1 flex-wrap",children:[PlayBtn,jsx3(Btn,{onClick:()=>skip(-10),label:ui.back10,children:jsx3(RotateCcw2,{size:16})}),jsx3(Btn,{onClick:()=>skip(10),label:ui.forward10,children:jsx3(RotateCw2,{size:16})}),jsxs3("span",{className:"flex items-center group/vol",children:[jsx3(Btn,{onClick:toggleMute,label:state.muted?"\u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u0635\u0648\u062A":"\u0643\u062A\u0645",children:state.muted||state.volume===0?jsx3(VolumeX2,{size:16}):jsx3(Volume22,{size:16})}),jsx3("span",{className:"h-9 flex items-center overflow-hidden w-0 group-hover/vol:w-16 focus-within:w-16 transition-[width] duration-200",children:jsx3("input",{type:"range",min:0,max:1,step:.05,value:state.muted?0:state.volume,onChange:e=>setVolume(Number(e.target.value)),"aria-label":ui.volume,dir:"ltr",className:"w-16 accent-brand cursor-pointer"})})]}),jsxs3("span",{"data-num":true,className:"px-2 text-caption font-bold text-ink2 whitespace-nowrap",children:[formatTime(state.time)," / ",formatTime(state.duration)]}),jsx3("span",{className:"flex-1"}),jsxs3("span",{className:"relative flex",children:[jsx3(Btn,{onClick:()=>setRateOpen(v=>!v),label:ui.playbackSpeed,children:jsxs3("span",{className:"flex items-center gap-1",children:[jsx3(Gauge2,{size:16}),state.rate!==1&&jsxs3("span",{"data-num":true,className:"text-micro font-extrabold text-brand-ink",children:[state.rate,"\xD7"]})]})}),rateOpen&&jsx3("div",{className:"absolute bottom-full end-0 mb-2 py-1 rounded-card bg-surface border border-line shadow-panel min-w-20 z-20",children:RATES.map(r=>jsx3("button",{type:"button",onClick:()=>{setRate(r);setRateOpen(false)},className:cn("w-full px-3 py-1.5 text-ui text-center cursor-pointer transition-colors",r===state.rate?"bg-soft text-brand-ink font-extrabold":"text-ink2 hover:bg-hover"),children:jsxs3("span",{"data-num":true,children:[r,"\xD7"]})},r))})]})]})]})}import{useEffect as useEffect4,useRef as useRef5,useState as useState5}from"react";var SOURCES=new WeakMap;function useAudioLevel(ref,{bands=5,enabled=true}={}){const level=useRef5(0);const bandsRef=useRef5(Array.from({length:bands},()=>0));const[ready,setReady]=useState5(false);const[failed,setFailed]=useState5(false);useEffect4(()=>{const el=ref.current;if(!el||!enabled)return;let raf=0;let analyser=null;let dead=false;function connect(){if(dead||analyser)return;const media=ref.current;if(!media)return;try{let entry=SOURCES.get(media);if(!entry){const Ctx2=window.AudioContext??window.webkitAudioContext;if(!Ctx2)throw new Error("\u0645\u0627\u0641\u064A\u0634 Web Audio");const ctx=new Ctx2;const source=ctx.createMediaElementSource(media);source.connect(ctx.destination);entry={ctx,source};SOURCES.set(media,entry)}void entry.ctx.resume();analyser=entry.ctx.createAnalyser();analyser.fftSize=1024;analyser.smoothingTimeConstant=.75;entry.source.connect(analyser);setReady(true);loop()}catch{setFailed(true)}}const spectrum=new Uint8Array(512);const wave=new Uint8Array(1024);let peak=.02;function loop(){if(dead||!analyser)return;analyser.getByteFrequencyData(spectrum);analyser.getByteTimeDomainData(wave);let sum=0;for(let i=0;i<wave.length;i++){const v=(wave[i]-128)/128;sum+=v*v}const rms=Math.sqrt(sum/wave.length);peak=Math.max(rms,peak*.995);level.current=Math.min(1,rms/Math.max(peak,.015));const out=[];for(let b=0;b<bands;b++){const from=Math.floor(spectrum.length**(b/bands))-1;const to=Math.floor(spectrum.length**((b+1)/bands));let peak2=0;for(let i=Math.max(0,from);i<to;i++){if(spectrum[i]>peak2)peak2=spectrum[i]}out.push(peak2/255)}bandsRef.current=out;raf=requestAnimationFrame(loop)}el.addEventListener("play",connect);if(!el.paused)connect();return()=>{dead=true;cancelAnimationFrame(raf);el.removeEventListener("play",connect);analyser?.disconnect()}},[ref,bands,enabled]);return{level,bands:bandsRef,ready,failed}}import{createContext,useCallback as useCallback4,useContext,useEffect as useEffect7,useMemo as useMemo2,useRef as useRef8,useState as useState8}from"react";import{useEffect as useEffect5,useLayoutEffect,useRef as useRef6,useState as useState6}from"react";import{X as X2}from"lucide-react";import{jsx as jsx4,jsxs as jsxs4}from"react/jsx-runtime";var GAP2=10;var EDGE=12;var WIDTH=264;function CoachHintSurface({item,onClose}){const ui=useUIText();const anchors=useCoachAnchors();const box=useRef6(null);const[pos,setPos]=useState6(null);const anchorId=item.where?.anchor;const gone=anchorId!==void 0&&!anchors.get(anchorId);useLayoutEffect(()=>{if(!anchorId)return;const el=anchors.get(anchorId);if(!el)return;function place(){const target=anchors.get(anchorId);const self=box.current;if(!target||!self)return;const a=target.getBoundingClientRect();const h=self.offsetHeight;const below=a.bottom+GAP2;const above=window.innerHeight-a.top+GAP2;const flip=below+h>window.innerHeight-EDGE&&above>below;const left=Math.min(window.innerWidth-WIDTH-EDGE,Math.max(EDGE,a.left+a.width/2-WIDTH/2));setPos({top:flip?a.top-h-GAP2:a.bottom+GAP2,left,above:flip})}place();window.addEventListener("scroll",place,true);window.addEventListener("resize",place);return()=>{window.removeEventListener("scroll",place,true);window.removeEventListener("resize",place)}},[anchorId,anchors]);useEffect5(()=>{if(!anchorId)return;const el=anchors.get(anchorId);if(!el)return;const prev=el.style.boxShadow;el.style.boxShadow="0 0 0 3px var(--color-soft), 0 0 0 4px var(--color-brand)";el.style.borderRadius=el.style.borderRadius||"var(--radius-field)";return()=>{el.style.boxShadow=prev}},[anchorId,anchors]);useEffect5(()=>{if(gone)onClose()},[gone,onClose]);useEffect5(()=>{const onKey=e=>{if(e.key==="Escape")onClose()};document.addEventListener("keydown",onKey);return()=>document.removeEventListener("keydown",onKey)},[onClose]);if(gone)return null;return jsxs4("div",{ref:box,role:"status",style:{width:WIDTH,top:pos?.top??-9999,left:pos?.left??-9999},className:cn("fixed z-[80] rounded-card border border-line bg-surface shadow-pop p-3 flex flex-col gap-1.5","animate-qfade",pos?"opacity-100":"opacity-0"),children:[jsxs4("div",{className:"flex items-start gap-2",children:[jsxs4("span",{className:"flex-1 min-w-0 flex flex-col gap-1",children:[item.title&&jsx4("span",{className:"text-ui font-extrabold text-ink",children:item.title}),jsx4("span",{className:"text-caption leading-[1.75] text-ink2 [text-wrap:pretty]",children:item.text})]}),jsx4("button",{type:"button","aria-label":ui.close,onClick:onClose,className:"size-6 -me-1 -mt-0.5 rounded-xs flex items-center justify-center text-muted hover:text-ink hover:bg-hover cursor-pointer transition-colors shrink-0",children:jsx4(X2,{size:13,"aria-hidden":"true"})})]}),jsx4("span",{"aria-hidden":"true",className:cn("absolute start-1/2 -ms-1.5 size-3 rotate-45 bg-surface border-line",pos?.above?"-bottom-1.5 border-e border-b":"-top-1.5 border-s border-t")})]})}import{useEffect as useEffect6,useRef as useRef7,useState as useState7}from"react";import{X as X3}from"lucide-react";import{Fragment,jsx as jsx5,jsxs as jsxs5}from"react/jsx-runtime";function CoachAudioSurface({item,onClose,orb,region}){const ui=useUIText();const box={top:0,bottom:0,insetInlineStart:0,insetInlineEnd:0,...region};const anchors=useCoachAnchors();const[time,setTime]=useState7(0);const wrap=useRef7(null);const level=useRef7(0);const active=item.lines.findIndex(l=>time>=l.start&&time<l.end);const line=active>=0?item.lines[active]:item.lines[0];useEffect6(()=>{const onKey=e=>{if(e.key==="Escape")onClose()};document.addEventListener("keydown",onKey);return()=>document.removeEventListener("keydown",onKey)},[onClose]);useEffect6(()=>{const el=wrap.current?.querySelector("audio");if(!el)return;const onTime=()=>setTime(el.currentTime);el.addEventListener("timeupdate",onTime);return()=>el.removeEventListener("timeupdate",onTime)},[]);useEffect6(()=>{const id=item.where?.anchor;if(!id)return;const el=anchors.get(id);if(!el)return;const prev=el.style.boxShadow;el.style.boxShadow="0 0 0 3px var(--color-soft), 0 0 0 4px var(--color-brand)";return()=>{el.style.boxShadow=prev}},[item,anchors]);useEffect6(()=>{if(!orb)return;let raf=0;let alive=true;let peaks=null;void(async()=>{try{const Ctx2=window.AudioContext??window.webkitAudioContext;if(!Ctx2)return;const raw=await(await fetch(item.src)).arrayBuffer();const ctx=new Ctx2;const buffer=await ctx.decodeAudioData(raw);void ctx.close();if(!alive)return;const data=buffer.getChannelData(0);const BUCKETS=600;const per=Math.floor(data.length/BUCKETS);const out=new Float32Array(BUCKETS);for(let i=0;i<BUCKETS;i++){let sum=0;for(let j=0;j<per;j++){const v=data[i*per+j];sum+=v*v}out[i]=Math.min(1,Math.sqrt(sum/per)*3.2)}peaks=out}catch{}})();const el=wrap.current?.querySelector("audio");const loop=()=>{if(peaks&&el&&el.duration>0){const i=Math.floor(el.currentTime/el.duration*peaks.length);level.current=peaks[Math.min(i,peaks.length-1)]??0}raf=requestAnimationFrame(loop)};loop();return()=>{alive=false;cancelAnimationFrame(raf)}},[item.src,orb]);return jsxs5(Fragment,{children:[jsx5("button",{type:"button","aria-label":ui.closeExplainer,onClick:onClose,style:box,className:"fixed z-[78] bg-night/25 backdrop-blur-[1.5px] cursor-pointer animate-qfade"}),jsxs5("div",{ref:wrap,style:box,className:"fixed z-[79] flex flex-col pointer-events-none",children:[orb&&jsx5("div",{"aria-hidden":"true",className:"flex-1 min-h-0 flex items-center justify-center animate-qfade",children:orb(level)}),jsx5("div",{className:"shrink-0 pointer-events-auto animate-tip-up",role:"region","aria-label":item.headline,children:jsx5("div",{className:"bg-surface border-t border-line shadow-sheet",children:jsxs5("div",{className:"mx-auto max-w-shell px-[22px] py-3 flex flex-col gap-2.5",children:[jsxs5("div",{className:"flex items-center gap-2.5",children:[jsx5("span",{"aria-live":"polite",className:"flex-1 min-w-0 text-ui font-bold leading-[1.7] text-ink [text-wrap:pretty]",children:line?.text}),jsx5("button",{type:"button","aria-label":ui.close,onClick:onClose,className:"size-8 rounded-sm flex items-center justify-center text-muted hover:text-ink hover:bg-hover cursor-pointer transition-colors shrink-0",children:jsx5(X3,{size:15,"aria-hidden":"true"})})]}),jsx5(AudioPlayer,{src:item.src,title:item.headline,meta:item.meta})]})})})]})]})}import{jsx as jsx6,jsxs as jsxs6}from"react/jsx-runtime";var Ctx=createContext(null);var AnchorCtx=createContext(null);function useCoachAnchors(){const ctx=useContext(AnchorCtx);if(!ctx)throw new Error("<Coach> \u0644\u0627\u0632\u0645 \u064A\u0643\u0648\u0646 \u062C\u0648\u0651\u0647 <CoachProvider>");return ctx}function readSeen(key){try{return JSON.parse(localStorage.getItem(key)??"[]")}catch{return[]}}function CoachProvider({items,path,orb,region,storageKey="qumra-coach-seen",disabled,children}){const[seenIds,setSeenIds]=useState8(()=>readSeen(storageKey));const[openId,setOpenId]=useState8(null);const[openPath,setOpenPath]=useState8(path);const shownId=openPath===path?openId:null;const anchors=useRef8(new Map);const anchorApi=useMemo2(()=>({set:(id,el)=>{if(el)anchors.current.set(id,el);else anchors.current.delete(id)},get:id=>anchors.current.get(id)??null}),[]);const markSeen=useCallback4(id=>{setSeenIds(prev=>{if(prev.includes(id))return prev;const next=[...prev,id];try{localStorage.setItem(storageKey,JSON.stringify(next))}catch{}return next})},[storageKey]);const close=useCallback4(()=>{setOpenId(id=>{if(id)markSeen(id);return null})},[markSeen]);useEffect7(()=>{if(disabled)return;const candidate=items.find(it=>(it.when??"enter")!=="manual"&&(it.where?.path===void 0||it.where.path===path)&&!seenIds.includes(it.id));if(!candidate)return;const when=candidate.when??"enter";const delay=when.startsWith("idle:")?Number(when.slice(5,-1))*1e3:0;const timer=setTimeout(()=>{setOpenId(candidate.id);setOpenPath(path)},delay);return()=>clearTimeout(timer)},[items,path,disabled]);const api=useMemo2(()=>({show:id=>{if(disabled||seenIds.includes(id))return;setOpenId(id);setOpenPath(path)},replay:id=>{setOpenId(id);setOpenPath(path)},close,current:items.find(it=>it.id===shownId)??null,seen:id=>seenIds.includes(id),reset:()=>{setSeenIds([]);try{localStorage.removeItem(storageKey)}catch{}}}),[items,shownId,path,seenIds,close,disabled,storageKey]);const current=api.current;return jsx6(AnchorCtx.Provider,{value:anchorApi,children:jsxs6(Ctx.Provider,{value:api,children:[children,current?.kind==="hint"&&jsx6(CoachHintSurface,{item:current,onClose:close}),current?.kind==="audio"&&jsx6(CoachAudioSurface,{item:current,onClose:close,orb,region})]})})}function useCoach(){const ctx=useContext(Ctx);if(!ctx)throw new Error("useCoach \u0644\u0627\u0632\u0645 \u064A\u062A\u0646\u0627\u062F\u0649 \u062C\u0648\u0651\u0647 <CoachProvider>");return ctx}function useCoachOptional(){return useContext(Ctx)}import{cloneElement,isValidElement,useEffect as useEffect8,useRef as useRef9}from"react";import{jsx as jsx7}from"react/jsx-runtime";function Coach({id,asChild,children}){const anchors=useCoachAnchors();const own=useRef9(null);useEffect8(()=>{if(asChild)return;const el=own.current?.firstElementChild??own.current;anchors.set(id,el);return()=>anchors.set(id,null)},[id,anchors,asChild]);if(asChild&&isValidElement(children)){return cloneElement(children,{ref:el=>anchors.set(id,el)})}return jsx7("span",{ref:own,className:"contents",children})}var coachSeconds=item=>item.lines[item.lines.length-1]?.end??0;import{Info}from"lucide-react";import{jsx as jsx8,jsxs as jsxs7}from"react/jsx-runtime";function Badge({children,tone="neutral",variant="soft",size="md",dot,icon,className}){return jsxs7("span",{className:cn("inline-flex items-center gap-1.5 rounded-full font-bold whitespace-nowrap",size==="sm"?"text-micro px-2 py-0.5":"text-caption px-2.5 py-1",variant==="solid"?TONE_SOLID[tone]:TONE_SOFT[tone],className),children:[dot&&jsx8("span",{"aria-hidden":"true",className:"size-1.5 rounded-full bg-current shrink-0"}),icon,children]})}function Counter({value,max=99}){if(value<=0)return null;return jsx8("span",{"data-num":true,dir:"ltr",className:"inline-flex items-center justify-center min-w-[18px] h-[18px] px-1.5 rounded-full bg-danger text-white text-micro font-extrabold leading-none",children:value>max?`${max}+`:value})}var AVATAR_SIZES={xs:"size-7 text-micro",sm:"size-9 text-ui",md:"size-11 text-body",lg:"size-14 text-h4"};function initials(name){return name.trim().split(/\s+/).slice(0,2).map(w=>w[0]).join("")}function Avatar({name,src,size="md",square,className}){const shape=square?"rounded-field":"rounded-full";if(src){return jsx8("img",{src,alt:name,loading:"lazy",className:cn("object-cover border border-line shrink-0",shape,AVATAR_SIZES[size],className)})}return jsx8("span",{role:"img","aria-label":name,className:cn("flex items-center justify-center font-extrabold bg-soft text-brand-ink shrink-0",shape,AVATAR_SIZES[size],className),children:initials(name)})}function StatCard({icon:Icon,tone="brand",label,value,hint,coachId,className}){const ui=useUIText();const coach=useCoachOptional();const explained=Boolean(coachId&&coach);const body=jsxs7("div",{className:cn("relative bg-surface border border-line rounded-card p-4 flex flex-col gap-2",className),children:[jsxs7("span",{className:"flex items-center gap-2.5",children:[Icon&&jsx8("span",{"aria-hidden":"true",className:cn("size-[30px] rounded-sm flex items-center justify-center shrink-0",TONE_SOFT[tone]),children:jsx8(Icon,{size:15,strokeWidth:2})}),jsx8("span",{className:"text-ui text-muted",children:label}),explained&&jsx8("button",{type:"button",onClick:()=>coach.replay(coachId),"aria-label":typeof label==="string"?`\u0645\u0627 \u0645\u0639\u0646\u0649 \xAB${label}\xBB\u061F`:"\u0645\u0627 \u0645\u0639\u0646\u0649 \u0647\u0630\u0627 \u0627\u0644\u0631\u0642\u0645\u061F",title:ui.whatIsThisNumber,className:cn("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:jsx8(Info,{size:15,strokeWidth:2,"aria-hidden":"true"})})]}),jsx8("span",{"data-num":true,className:"text-h3 font-extrabold leading-none whitespace-nowrap",children:value}),hint&&jsx8("span",{className:"text-micro text-muted2",children:hint})]});return explained?jsx8(Coach,{id:coachId,children:body}):body}function Card({children,padded=true,className}){return jsx8("div",{className:cn("bg-surface border border-line rounded-card",padded?"p-5":"overflow-hidden",className),children})}function CardHeader({title,description,action,coachId}){const ui=useUIText();const coach=useCoachOptional();const explained=Boolean(coachId&&coach);const head=jsxs7("div",{className:"flex items-start justify-between gap-4",children:[jsxs7("div",{className:"flex flex-col gap-1 min-w-0",children:[jsx8("h3",{className:"text-lead font-extrabold text-ink m-0",children:title}),description&&jsx8("p",{className:"text-ui text-muted m-0",children:description})]}),(action||explained)&&jsxs7("div",{className:"shrink-0 flex items-center gap-1.5",children:[action,explained&&jsx8("button",{type:"button",onClick:()=>coach.replay(coachId),"aria-label":typeof title==="string"?`\u0645\u0627 \u0645\u0639\u0646\u0649 \xAB${title}\xBB\u061F`:"\u0645\u0627 \u0647\u0630\u0627 \u0627\u0644\u0642\u0633\u0645\u061F",title:ui.explainToMe,className:cn("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:jsx8(Info,{size:15,strokeWidth:2,"aria-hidden":"true"})})]})]});return explained?jsx8(Coach,{id:coachId,children:head}):head}function PageHeader({title,hint,actions}){return jsxs7("div",{className:"flex items-start justify-between gap-3.5 flex-wrap",children:[jsxs7("div",{className:"flex flex-col gap-1 min-w-0",children:[jsx8("h1",{className:"text-h3 font-black text-ink m-0 [text-wrap:balance]",children:title}),hint&&jsx8("p",{className:"text-ui text-muted m-0 [text-wrap:pretty]",children:hint})]}),actions&&jsx8("div",{className:"flex items-center gap-2.5 shrink-0 flex-wrap",children:actions})]})}function Progress({value,max=100,label,tone="brand",className}){const safe=Math.min(max,Math.max(0,value));const pct=safe/max*100;const fill={neutral:"bg-muted2",brand:"bg-brand",amber:"bg-amber",green:"bg-green-solid",red:"bg-danger",violet:"bg-violet-solid"};return jsxs7("div",{className:cn("flex flex-col gap-1.5",className),children:[label&&jsxs7("span",{className:"flex items-center justify-between gap-3 text-caption",children:[jsx8("span",{className:"text-ink2",children:label}),jsxs7("span",{"data-num":true,className:"text-muted font-bold",children:[Math.round(pct),"%"]})]}),jsx8("span",{role:"progressbar","aria-valuenow":safe,"aria-valuemin":0,"aria-valuemax":max,className:"h-1.5 rounded-full bg-hover overflow-hidden block",children:jsx8("span",{className:cn("block h-full rounded-full transition-[width] duration-500",fill[tone]),style:{width:`${pct}%`}})})]})}function Skeleton({variant="text",width,className}){return jsx8("span",{"aria-hidden":"true",style:{width},className:cn("block bg-skeleton animate-skeleton",variant==="text"&&"h-3.5 rounded-xs w-full",variant==="block"&&"h-20 rounded-field w-full",variant==="circle"&&"size-10 rounded-full",className)})}export{useMedia,formatTime,Scrubber,VideoPlayer,AudioPlayer,useAudioLevel,CoachProvider,useCoach,useCoachOptional,Coach,coachSeconds,Badge,Counter,Avatar,StatCard,Card,CardHeader,PageHeader,Progress,Skeleton};
|
package/dist/chunk-QJPINFN2.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import{Coach,useCoachOptional}from"./chunk-JJCKT5OO.js";import{LocaleCtx,cn,useMoneyLocale,useUIText}from"./chunk-DDRJTIIP.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-hidden",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-hidden",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-hidden",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};
|