PageSourceSearch

https://prod.norvana.ai/assets/js/WalkingAchievementsPage-dDp16N9F.js

js norvana.ai collected 2026-10-05 12:20:19 UTC 18,785 bytes, 1 lines download raw bytes

1import{j as e,r as t}from"./vendor-misc-CuCckiCD.js";import{u as a}from"./vendor-i18n-Bkyo6ORW.js";import{e as s}from"./pages-admin-ynIrHECU.js";import{m as n}from"./achievementIcons-TMKERJg5.js";import{b as r}from"./vendor-router-Ckp9znBc.js";import"./vendor-maps-9QkiQj1G.js";import"./vendor-utils-BooB9_pa.js";import"./vendor-icons-C4g_FzsY.js";import"./vendor-state-BjhFgheZ.js";import"./vendor-recharts-CGcrHYaK.js";const l={common:"bg-gray-50 border-gray-300",uncommon:"bg-green-50 border-green-400",rare:"bg-blue-50 border-blue-400",epic:"bg-purple-50 border-purple-400",legendary:"bg-yellow-50 border-yellow-400"},i={common:"shadow-md",uncommon:"shadow-md shadow-green-200",rare:"shadow-md shadow-blue-200",epic:"shadow-lg shadow-purple-300",legendary:"shadow-xl shadow-yellow-300"},o=({achievement:t,onClick:s,size:n="md"})=>{const{t:r}=a(),o={sm:{wrapper:"p-2",icon:"text-2xl",name:"text-xs",points:"text-xs"},md:{wrapper:"p-4",icon:"text-4xl",name:"text-sm",points:"text-xs"},lg:{wrapper:"p-5",icon:"text-5xl",name:"text-base",points:"text-sm"}}[n],c=l[t.rarity]??l.common,d=t.earned?i[t.rarity]??"":"",m=t.earned_at?new Date(t.earned_at).toLocaleDateString():null;return e.jsxs("button",{onClick:()=>s?.(t),"aria-label":t.earned?r("walking.achievements.badgeEarned","{{name}} — earned {{date}}",{name:t.name,date:m??""}):r("walking.achievements.badgeLocked","{{name}} — locked",{name:t.name}),className:["relative rounded-xl border-2 transition-all text-left focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-blue-500",c,o.wrapper,t.earned?`${d} hover:scale-105 cursor-pointer`:"opacity-50 grayscale cursor-pointer hover:opacity-60"].join(" "),children:[e.jsx("div",{className:`${o.icon} mb-2 text-center`,"aria-hidden":"true",children:t.icon}),"sm"!==n&&e.jsxs(e.Fragment,{children:[e.jsx("h4",{className:`font-semibold text-gray-900 leading-tight ${o.name}`,children:t.name}),e.jsxs("p",{className:`text-gray-500 mt-0.5 ${o.points}`,children:["+",t.points," ",r("walking.achievements.pts","pts")]})]}),t.earned&&e.jsx("div",{"aria-hidden":"true",className:"absolute -top-1.5 -right-1.5 w-5 h-5 bg-green-500 rounded-full flex items-center justify-center",children:e.jsx("svg",{className:"w-3 h-3 text-white",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:3,d:"M5 13l4 4L19 7"})})}),!t.earned&&e.jsx("div",{"aria-hidden":"true",className:"absolute inset-0 flex items-center justify-center bg-gray-900/10 rounded-xl",children:e.jsx("svg",{className:"w-6 h-6 text-gray-500",fill:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{d:"M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z"})})}),"lg"===n&&t.earned&&m&&e.jsx("p",{className:"text-xs text-gray-400 mt-1",children:r("walking.achievements.earnedOn","Earned {{date}}",{date:m})})]})},c=["#FFD700","#FF6B6B","#4ECDC4","#45B7D1","#96CEB4","#F7DC6F","#BB8FCE"],d=({achievement:s,celebration:n,onDismiss:r})=>{const{t:l}=a(),i=t.useRef(null);t.useEffect(()=>{i.current?.focus()},[]),t.useEffect(()=>{const e=e=>{"Escape"===e.key&&r()};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[r]);const o=null!=s||"achievement"===n?.type,d=s??("achievement"===n?.type?n.achievement:null),m="goal"===n?.type?n:null,x=d?d.name:m?l("walking.celebration.goalTitle","🎯 Daily Goal Reached!"):"",g=d?d.description:m?l("walking.celebration.goalSubtitle","{{steps}} steps — goal of {{goal}} met!",{steps:m.steps.toLocaleString(),goal:m.goal.toLocaleString()}):"",h=d?d.icon:"🎯";return e.jsxs("div",{className:"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/60",role:"dialog","aria-modal":"true","aria-labelledby":"celebration-title",onClick:r,children:[e.jsxs("div",{className:"relative bg-gradient-to-br from-yellow-50 to-orange-50 rounded-2xl shadow-2xl max-w-sm w-full overflow-hidden",style:{animation:"bounceIn 0.5s ease-out"},onClick:e=>e.stopPropagation(),children:[e.jsx("div",{className:"absolute inset-0 overflow-hidden pointer-events-none motion-reduce:hidden","aria-hidden":"true",children:Array.from({length:24}).map((t,a)=>e.jsx("div",{className:"absolute rounded-sm",style:{width:4+a%4*2+"px",height:4+a%3*2+"px",left:4.17*a%100+"%",backgroundColor:c[a%c.length],animation:`confettiFall ${2+a%3}s ease-in ${.08*a%2}s infinite`}},a))}),e.jsxs("div",{className:"p-8 text-center relative",children:[o&&e.jsx("p",{className:"text-sm font-semibold text-orange-500 uppercase tracking-widest mb-2",children:l("walking.celebration.newAchievement","Achievement Unlocked!")}),e.jsx("span",{className:"text-7xl block mb-4 motion-reduce:text-6xl","aria-hidden":"true",children:h}),e.jsx("h2",{id:"celebration-title",className:"text-2xl font-bold text-gray-900 mb-2 leading-tight",children:x}),e.jsx("p",{className:"text-gray-600 text-sm mb-4",children:g}),d&&e.jsxs("p",{className:"text-xl font-bold text-yellow-600",children:["+",d.points," ",l("walking.achievements.pts","pts")]})]}),e.jsx("div",{className:"px-6 pb-6",children:e.jsx("button",{ref:i,onClick:r,className:"w-full py-4 bg-gradient-to-r from-yellow-500 to-orange-500 text-white rounded-xl font-bold text-lg hover:from-yellow-600 hover:to-orange-600 transition-all shadow-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-yellow-400 focus-visible:ring-offset-2",children:l("walking.celebration.awesome","Awesome!")})})]}),e.jsx("style",{children:"\n        @keyframes bounceIn {\n          0% { transform: scale(0.5); opacity: 0; }\n          60% { transform: scale(1.08); }\n          100% { transform: scale(1); opacity: 1; }\n        }\n        @keyframes confettiFall {\n          0% { transform: translateY(-120px) rotate(0deg); opacity: 1; }\n          100% { transform: translateY(100vh) rotate(720deg); opacity: 0; }\n        }\n      "})]})},m={streak:"🔥",milestone:"🏆",distance:"📍",speed:"⚡",social:"👥",special:"✨"}
1,x=({showLocked:r=!0,compact:l=!1,celebrateAchievement:i,onCelebrationDismiss:c})=>{const{t:x}=a(),[g,h]=t.useState([]),[u,p]=t.useState(!0),[f,b]=t.useState(null),[v,y]=t.useState(null);t.useEffect(()=>{j()},[r]);const j=async()=>{try{const e=function(){const e=s(),t={"Content-Type":"application/json"};return e&&(t.Authorization=`Bearer ${e}`),t}(),[t,a]=await Promise.allSettled([fetch("/api/fitness/achievements",{headers:e}),fetch("/api/fitness/achievements/catalog",{headers:e})]),l="fulfilled"===t.status?await t.value.json():{},i="fulfilled"===a.status?await a.value.json():{},o=l.achievements||[],c=(i.achievements||[]).map(e=>{const t=o.find(t=>t.achievement_type===e.achievement_type);return{id:e.achievement_type,name:e.title,description:e.description,icon:n(e.icon),earned:!!t,earned_at:t?.earned_at,category:e.category||"general",rarity:"common",points:10}});if(0===c.length&&o.length>0){const e=o.map(e=>({id:e.achievement_type,name:e.title,description:e.description,icon:n(e.icon),earned:!0,earned_at:e.earned_at,category:e.category||"general",rarity:"common",points:10}));h(e)}else h(r?c:c.filter(e=>e.earned))}catch{h([])}finally{p(!1)}},w=Array.from(new Set(g.map(e=>e.category))),k=f?g.filter(e=>e.category===f):g,N=g.filter(e=>e.earned).length;return u?e.jsxs("div",{className:"animate-pulse space-y-4","aria-busy":"true","aria-label":x("common.loading","Loading"),children:[e.jsx("div",{className:"h-6 bg-gray-200 rounded w-1/3"}),e.jsx("div",{className:"grid gap-3 "+(l?"grid-cols-4":"grid-cols-3 sm:grid-cols-4 md:grid-cols-5"),children:Array.from({length:l?8:10}).map((t,a)=>e.jsx("div",{className:"h-20 bg-gray-200 rounded-xl"},a))})]}):e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"flex items-center justify-between",children:e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-nv-content-primary "+(l?"text-base":"text-lg"),children:x("walking.achievements.title","Achievements")}),e.jsx("p",{className:"text-sm text-nv-content-muted",children:x("walking.achievements.earnedCount","{{earned}} of {{total}} earned",{earned:N,total:g.length})})]})}),!l&&w.length>1&&e.jsxs("div",{className:"flex flex-wrap gap-2",role:"group","aria-label":x("walking.achievements.filterByCategory","Filter by category"),children:[e.jsx("button",{onClick:()=>b(null),className:"px-3 py-1 rounded-full text-sm font-medium transition-colors "+(null===f?"bg-blue-600 text-white":"bg-gray-100 text-gray-600 hover:bg-gray-200"),children:x("common.all","All")}),w.map(t=>{const a=g.filter(e=>e.category===t&&e.earned).length,s=g.filter(e=>e.category===t).length;return e.jsxs("button",{onClick:()=>b(t===f?null:t),className:"px-3 py-1 rounded-full text-sm font-medium transition-colors "+(f===t?"bg-blue-600 text-white":"bg-gray-100 text-gray-600 hover:bg-gray-200"),children:[m[t]??"⭐"," ",a,"/",s]},t)})]}),e.jsx("div",{className:"grid gap-3 "+(l?"grid-cols-4":"grid-cols-3 sm:grid-cols-4 md:grid-cols-5"),role:"list","aria-label":x("walking.achievements.badgeList","Achievement badges"),children:k.map(t=>e.jsx("div",{role:"listitem",children:e.jsx(o,{achievement:t,onClick:y,size:l?"sm":"md"})},t.id))}),v&&e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50",role:"dialog","aria-modal":"true","aria-label":v.name,onClick:()=>y(null),children:e.jsxs("div",{className:"bg-nv-surface-card rounded-2xl shadow-2xl max-w-sm w-full overflow-hidden",onClick:e=>e.stopPropagation(),children:[e.jsxs("div",{className:"p-6 text-center "+(v.earned?"bg-gradient-to-b from-blue-50 to-white":"bg-gray-50"),children:[e.jsx("span",{className:"text-6xl","aria-hidden":"true",children:v.icon}),e.jsx("h3",{className:"text-xl font-bold text-gray-900 mt-3",children:v.name}),e.jsx("p",{className:"text-sm text-gray-500 mt-1 uppercase tracking-wide",children:v.rarity})]}),e.jsxs("div",{className:"p-6",children:[e.jsx("p",{className:"text-gray-600 text-center text-sm",children:v.description}),e.jsxs("div",{className:"mt-4 flex justify-center gap-6",children:[e.jsxs("div",{className:"text-center",children:[e.jsxs("p",{className:"text-2xl font-bold text-blue-600",children:["+",v.points]}),e.jsx("p",{className:"text-xs text-gray-500",children:x("walking.achievements.pts","pts")}
1)]}),e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg","aria-hidden":"true",children:m[v.category]??"⭐"}),e.jsx("p",{className:"text-xs text-gray-500",children:v.category})]})]}),v.earned&&v.earned_at&&e.jsx("p",{className:"text-center text-xs text-gray-400 mt-3",children:x("walking.achievements.earnedOn","Earned {{date}}",{date:new Date(v.earned_at).toLocaleDateString()})})]}),e.jsx("div",{className:"px-6 pb-6",children:e.jsx("button",{onClick:()=>y(null),className:"w-full py-3 bg-gray-100 text-gray-700 rounded-xl font-medium hover:bg-gray-200 transition-colors",children:x("common.close","Close")})})]})}),i&&e.jsx(d,{achievement:i,onDismiss:()=>c?.()})]})},g=({data:s,compact:n=!1})=>{const{t:r}=a(),[l,i]=t.useState(s??null),[o,c]=t.useState(!s),[d,m]=t.useState(!1);if(t.useEffect(()=>{s?i(s):fetch("/api/fitness/streaks/").then(e=>e.json()).then(e=>i(e)).catch(()=>{}).finally(()=>c(!1))},[s]),t.useEffect(()=>{const e=setTimeout(()=>m(!0),100);return()=>clearTimeout(e)},[]),o)return e.jsx("div",{className:"animate-pulse",children:e.jsx("div",{className:`h-${n?"8":"12"} bg-gray-200 rounded-xl w-32`})});if(!l)return null;const{current_streak:x,next_badge_at:g}=l,h=g>0?Math.min(x/g,1):1,u=Math.round(100*h),p=x>=3;return n?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-2xl "+(d&&p?"animate-[flame_1.5s_ease-in-out_infinite]":""),"aria-hidden":"true",children:"🔥"}),e.jsx("span",{className:"font-bold text-gray-900 text-base",children:r("walking.streak.dayCount","{{count}} day streak",{count:x})}),e.jsx("style",{children:"\n          @keyframes flame {\n            0%, 100% { transform: scale(1) rotate(-3deg); }\n            50% { transform: scale(1.15) rotate(3deg); }\n          }\n        "})]}):e.jsxs("div",{className:"bg-nv-surface-card rounded-2xl p-5 space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-4xl leading-none "+(d&&p?"animate-[flame_1.5s_ease-in-out_infinite]":""),"aria-hidden":"true",children:"🔥"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-3xl font-bold text-gray-900 leading-none","aria-label":r("walking.streak.dayCount","{{count}} day streak",{count:x}),children:x}),e.jsx("p",{className:"text-sm text-gray-500",children:r("walking.streak.dayStreak","day streak")})]})]}),g>0&&e.jsxs("div",{children:[e.jsxs("div",{className:"flex justify-between text-xs text-gray-500 mb-1.5",children:[e.jsx("span",{children:r("walking.streak.nextBadge","Next badge")}),e.jsxs("span",{children:[x,"/",g]})]}),e.jsx("div",{className:"w-full h-3 bg-gray-100 rounded-full overflow-hidden",role:"progressbar","aria-valuenow":x,"aria-valuemin":0,"aria-valuemax":g,"aria-label":r("walking.streak.progressLabel","Streak progress: {{current}} of {{target}} days",{current:x,target:g}),children:e.jsx("div",{className:"h-full rounded-full bg-gradient-to-r from-orange-400 to-red-500 transition-all duration-700 ease-out",style:{width:`${u}%`}})})]}),l.longest_streak>0&&e.jsx("p",{className:"text-xs text-gray-400",children:r("walking.streak.longest","Personal best: {{count}} days",{count:l.longest_streak})}),e.jsx("style",{children:"\n        @keyframes flame {\n          0%, 100% { transform: scale(1) rotate(-3deg); }\n          50% { transform: scale(1.15) rotate(3deg); }\n        }\n      "})]})},h=({data:s})=>{const{t:n}=a(),[r,l]=t.useState(s??null),[i,o]=t.useState(!s);if(t.useEffect(()=>{s?l(s):fetch("/api/fitness/challenges/current").then(e=>e.json()).then(e=>l(e.challenge??null)).catch(()=>{}).finally(()=>o(!1))},[s]),i)return e.jsxs("div",{className:"animate-pulse bg-nv-surface-card rounded-2xl p-5 space-y-3",children:[e.jsx("div",{className:"h-5 bg-gray-200 rounded w-1/2"}),e.jsx("div",{className:"h-4 bg-gray-200 rounded w-3/4"}),e.jsx("div",{className:"h-3 bg-gray-200 rounded-full"}),e.jsx("div",{className:"h-4 bg-gray-200 rounded w-1/3"})]});if(!r)return null;const c=r.target_steps>0?Math.min(r.current_steps/r.target_steps,1):0,d=Math.round(100*c),m=r.completed||c>=1,x=e=>e>=1e3?`${(e/1e3).toFixed(e%1e3==0?0:1)}K`:e.toString();return e.jsxs("div",{className:"rounded-2xl p-5 space-y-3 border "+(m?"bg-green-50 border-green-200":"bg-nv-surface-card border-nv-surface-divider"),role:"region","aria-label":n("walking.challenge.regionLabel","Weekly challenge"),children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-xs font-semibold text-blue-600 uppercase tracking-wide",children:n("walking.challenge.thisWeek","This Week's Challenge")}),e.jsx("h3",{className:"font-bold text-gray-900 mt-0.5",children:r.title})]}),m&&e.jsx("span",{className:"shrink-0 w-7 h-7 bg-green-500 rounded-full flex items-center justify-center","aria-label":n("walking.challenge.completed","Completed"),children:e.jsx("svg",{className:"w-4 h-4 text-white",f
1ill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:3,d:"M5 13l4 4L19 7"})})})]}),e.jsx("p",{className:"text-sm text-gray-600",children:r.description}),e.jsxs("div",{children:[e.jsx("div",{className:"w-full h-4 bg-gray-100 rounded-full overflow-hidden",role:"progressbar","aria-valuenow":r.current_steps,"aria-valuemin":0,"aria-valuemax":r.target_steps,"aria-label":n("walking.challenge.progressLabel","{{current}} of {{target}} steps",{current:r.current_steps.toLocaleString(),target:r.target_steps.toLocaleString()}),children:e.jsx("div",{className:"h-full rounded-full transition-all duration-700 ease-out "+(m?"bg-green-500":"bg-gradient-to-r from-blue-500 to-indigo-600"),style:{width:`${d}%`}})}),e.jsxs("div",{className:"flex justify-between mt-1",children:[e.jsx("span",{className:"text-xs text-gray-500",children:x(r.current_steps)}),e.jsx("span",{className:"text-xs text-gray-500",children:x(r.target_steps)})]})]}),e.jsxs("div",{className:"flex items-center justify-between text-sm",children:[m?e.jsx("span",{className:"text-green-600 font-medium",children:n("walking.challenge.completedMessage","Challenge complete! 🎉")}):e.jsx("span",{className:"text-gray-500",children:n("walking.challenge.daysRemaining","{{count}} day remaining",{count:r.days_remaining,defaultValue_plural:"{{count}} days remaining"})}),e.jsxs("span",{className:"text-yellow-600 font-semibold",children:["+",r.reward_points," ",n("walking.achievements.pts","pts")]})]})]})},u=()=>{const{t:s}=a(),n=r(),[l,i]=t.useState(!0);return e.jsxs("div",{className:"min-h-screen bg-[var(--theme-bg-base)] pb-24",children:[e.jsxs("div",{className:"bg-nv-surface-card border-b border-nv-surface-divider px-4 py-4 flex items-center gap-3 sticky top-0 z-10",children:[e.jsx("button",{onClick:()=>n(-1),"aria-label":s("common.back","Back"),className:"p-2 -ml-2 rounded-full hover:bg-gray-100 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500",children:e.jsx("svg",{className:"w-5 h-5 text-gray-700",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M15 19l-7-7 7-7"})})}),e.jsx("h1",{className:"text-lg font-bold text-nv-content-primary flex-1",children:s("walking.achievements.pageTitle","Walking Achievements")})]}),e.jsxs("div",{className:"max-w-lg mx-auto px-4 pt-6 space-y-6",children:[e.jsx(g,{}),e.jsx(h,{}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsx("h2",{className:"text-base font-semibold text-nv-content-primary",children:s("walking.achievements.gallery","Badge Gallery")}),e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("span",{className:"text-sm text-gray-500",children:s("walking.achievements.showLocked","Show locked")}),e.jsxs("button",{role:"switch","aria-checked":l,onClick:()=>i(e=>!e),className:"relative inline-flex h-5 w-9 items-center rounded-full transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 "+(l?"bg-blue-600":"bg-gray-300"),children:[e.jsx("span",{className:"sr-only",children:s("walking.achievements.showLocked","Show locked")}),e.jsx("span",{className:"inline-block h-3.5 w-3.5 rounded-full bg-white shadow transition-transform "+(l?"translate-x-4":"translate-x-0.5")})]})]})]}),e.jsx(x,{showLocked:l})]})]})]})};export{u as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.