PageSourceSearch

https://transformlab.ai/assets/Project1TextAdventure-BOJuYghx.js

js transformlab.ai collected 2026-10-05 13:28:18 UTC 23,757 bytes, 21 lines download raw bytes

1import{r as h,j as e}from"./radix-CDu5Es6J.js";import{B as p,g as i,C as u,e as C,f as T,d as x,c as m}from"./admin-Ck-EjqfI.js";import{T as ae,f as oe,g as k,h as y}from"./day1-CaC5GY6J.js";import{A as S,a as R}from"./day3-DzQSNh6M.js";import{d as se}from"./day1-modules-CGxgl8D4.js";import{Q as re}from"./QuickConceptCard-CshOhR_U.js";import{B as ne}from"./BuildStepTracker-Cd0jGSm3.js";import{V as ie}from"./VerificationChecklist-DA2djH7p.js";import{u as le,G as ce}from"./useGameState-DjQRY-p1.js";import{_ as de,V as me,Z as A,B as he,I as b,b6 as pe,aO as ue,a1 as xe,d8 as D,cP as ge,a8 as fe,a2 as P}from"./icons-DeioJRsM.js";import"./tanstack-BafG60Gz.js";import"./supabase-Bb38dPVh.js";import"./day2-D2rfOpb3.js";import"./day1-presentations-CbeCh8DI.js";import"./day1-sessions-CoONypFJ.js";const ke={dungeon:{primary:"#1a1a2e",secondary:"#16213e",accent:"#e94560",background:"linear-gradient(180deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%)"},forest:{primary:"#2d5016",secondary:"#1a3a0a",accent:"#8bc34a",background:"linear-gradient(180deg, #87ceeb 0%, #2d5016 30%, #1a3a0a 100%)"},space:{primary:"#0d0d2b",secondary:"#1a1a4e",accent:"#00d4ff",background:"linear-gradient(180deg, #000011 0%, #0d0d2b 50%, #1a1a4e 100%)"},haunted:{primary:"#1a0a1a",secondary:"#2d1a2d",accent:"#9b59b6",background:"linear-gradient(180deg, #0d0d0d 0%, #1a0a1a 50%, #2d1a2d 100%)"}},ye=[{id:"concept1",title:"What is a Game World?",emoji:"🌍",explanation:"A game world is made up of connected rooms or areas. Each room has a description, items you can find, doors to other rooms, and sometimes characters you can talk to!",analogy:"Think of your house - it has rooms connected by doors. A game world is like that, but you can make it a spooky dungeon, a magical forest, or even a space station!",example:`Entrance → Main Hall → Treasure Room
2     ↓
3Guard Room`},{id:"concept2",title:"Items and Inventory",emoji:"🎒",explanation:"Items are things the player can pick up and use. A key might open a locked door. A torch might light up a dark room. Your inventory is like a backpack that holds all your collected items.",analogy:"It's like playing Minecraft - you pick up resources and use them to solve problems. A wooden pickaxe breaks stone, a key opens a chest!",example:`🔑 Golden Key → Opens the Treasury door
4🔦 Torch → Lights up dark areas`},{id:"concept3",title:"Puzzles and Progression",emoji:"🧩",explanation:"Puzzles are problems the player needs to solve to progress. The most common puzzle is: find Item A to unlock Door B. This creates a sense of achievement when solved!",analogy:"Like in Zelda - you find a key in one room, then backtrack to open a locked door you saw earlier. That 'aha!' moment is what makes games fun!",example:`Problem: Door is locked! 🚪🔒
5Solution: Find the key in another room
6Result: Door opens! → New area unlocked!`},{id:"concept4",title:"NPCs (Characters)",emoji:"👤",explanation:"NPCs are Non-Player Characters - people or creatures in your game that the player can talk to. They give hints, tell stories, or even give you items!",analogy:"Like villagers in Minecraft or characters in Roblox games. They make the world feel alive and help guide the player.",example:'Guard: "Halt! You need the Golden Key to enter the treasury. The old keeper in the guard room might help you."'},{id:"concept5",title:"Win Conditions",emoji:"🏆",explanation:"Every game needs a goal! The win condition tells the player what they're trying to achieve. It could be reaching a special room, collecting a treasure, or talking to the right person.",analogy:"Like beating a level in a game - there's always something you're working toward. Without a goal, it's just walking around!",example:`🎯 Goal: Reach the Treasure Room
7🎉 Win: Player enters the room → VICTORY!`}],g=[{id:1,title:"Choose Your Theme",instruction:"Every great game starts with a theme! Look at the theme cards above and click to select one. Each theme has different colors, decorations, and items.",codeExample:`🏰 Dungeon - Dark and mysterious
8🌲 Forest - Bright and magical
9🚀 Space - Stars and planets
10👻 Haunted - Spooky and creepy`,verification:"You see the game preview change to your chosen theme.",xpReward:10,hint:"Try clicking different themes to see how the game looks in each one!"},{id:2,title:"Name Your Adventure",instruction:"Give your game a cool name! Type it in the text box. This will show up in the game header when you play.",codeExample:`"The Lost Temple"
11"Space Station Alpha"
12"Escape from the Haunted Manor"`,verification:"Your game name appears in the live preview.",xpReward:5,hint:"Be creative! A good name makes people want to play your game."},{id:3,title:"Explore the Starting Room",instruction:"In the live preview, use WASD or arrow keys to move your character around. Click on items to pick them up!",codeExample:`W = Move Up
13A = Move Left
14S = Move Down
15D = Move Right`,verification:"You can move your character around the room.",xpReward:10,hint:"The character turns to face the direction you move!"},{id:4,title:"Find an Item",instruction:"Look for glowing items in the room. Click on them to add them to your inventory at the bottom of the screen.",codeExample:`Items glow when you hover over them.
16Click to pick up → item moves to inventory!`,verification:"You have at least one item in your inventory.",xpReward:10,hint:"Items you can pick up have a glowing effect. Watch for the sparkles!"},{id:5,title:"Go Through a Door",instruction:"Click on a door to travel to another room. Each room has different items and characters to discover.",codeExample:`Doors show where they lead:
17🚪 "Main Hall" → click to go there!`,verification:"You successfully moved to a different room.",xpReward:10,hint:"The room name at the top changes when you enter a new room."},{id:6,title:"Talk to a Character",instruction:"Find an NPC (Non-Player Character) and click on them to start a conversation. They might give you hints or items!",codeExample:`Characters have colored circles.
18Click them → dialog box appears!`,verification:"You had a conversation with an NPC.",xpReward:10,hint:"NPCs often give important hints about how to win the game."},{id:7,title:"Win the Game!",instruction:"Use what you learned from NPCs to solve the puzzle. Find the key, unlock the door, and reach the treasure room!",codeExample:`1. Find the key 🔑
192. Go to the locked door 🚪
203. Click the door → it opens!
214. Enter the treasure room → YOU WIN! 🎉`,verification:'You see the "WIN!" celebration.',xpReward:20,hint:"If a door is locked, look for a key in other rooms. The NPC might tell you where!"}],be=[{id:"verify1",text:"I can move my character with WASD or arrow keys",hint:"Click on the game preview first to make sure it has focus, then try the keys"},{id:"verify2",text:"I picked up at least one item",hint:"Look for glowing items in rooms - click on them to pick them up!"},{id:"verify3",text:"I traveled through at least one door to another room",hint:"Doors are at the edges of rooms - click on them to go through"},{id:"verify4",text:"I talked to an NPC and saw the dialog box",hint:"NPCs are colored circles - click on them to start a conversation"},{id:"verify5",text:"I won the game by reaching the treasure room!",hint:"You need to find the key first - check all rooms and talk to NPCs for hints"}],G=[{id:"challenge1",title:"Speed Runner",description:"Win the game in under 20 moves! Check your move count in the top right corner. Reset and try again if you need to.",difficulty:"medium",xpBonus:25},{id:"challenge2",title:"Theme Explorer",description:"Play and win the game in ALL 4 themes: Dungeon, Forest, Space, and Haunted. Each theme has the same puzzle but different visuals!",difficulty:"easy",xpBonus:20},{id:"challenge3",title:"Full Screen Champion",description:'Click "Play Full Screen" and win the game in the immersive full-screen mode. Show it to a friend or family member!',difficulty:"easy",xpBonus:15}],v={dungeon:{name:"Dungeon",emoji:"🏰",description:"Dark corridors, torches, and hidden treasures"},forest:{name:"Forest",emoji:"🌲",description:"Magical woods with flowers and sunshine"},space:{name:"Space",emoji:"🚀",description:"Explore alien planets and nebulas"},haunted:{name:"Haunted",emoji:"👻",description:"Spooky mansion with ghosts and bats"}};function ve(s,j){const w={dungeon:[{id:"torch",name:"Torch",icon:"🔦",description:"Lights up dark areas"}
21,{id:"golden-key",name:"Golden Key",icon:"🔑",description:"Opens locked doors"}],forest:[{id:"magic-flower",name:"Magic Flower",icon:"🌸",description:"Grants special powers"},{id:"forest-key",name:"Forest Key",icon:"🗝️",description:"Opens the ancient gate"}],space:[{id:"laser-gun",name:"Laser Gun",icon:"🔫",description:"For space defense"},{id:"access-card",name:"Access Card",icon:"💳",description:"Opens secured doors"}],haunted:[{id:"candle",name:"Candle",icon:"🕯️",description:"Reveals hidden things"},{id:"skeleton-key",name:"Skeleton Key",icon:"💀",description:"Opens ghostly doors"}]},I={dungeon:{id:"guard",name:"Guard",color:"#3498db",greeting:"Halt! You need the Golden Key to enter the treasury."},forest:{id:"fairy",name:"Forest Fairy",color:"#e91e63",greeting:"Welcome, traveler! The magic flower awaits in the garden."},space:{id:"robot",name:"Helper Bot",color:"#9e9e9e",greeting:"Beep boop! I can help you find the control room."},haunted:{id:"ghost",name:"Friendly Ghost",color:"#b8b8ff",greeting:"Wooo... I mean, hello! Don't be scared, I'll help you."}},r=w[s],l=I[s];return{id:`${s}-adventure-${Date.now()}`,title:j||`My ${v[s].name} Adventure`,theme:s,startRoomId:"entrance",winCondition:{type:"reach_room",targetId:"treasure"},playerCharacter:{name:"Hero",color:"#e74c3c",position:{x:50,y:70},direction:"up"},rooms:[{id:"entrance",name:"Entrance",description:"You stand at the entrance. A door leads north.",theme:s,items:[{id:r[0].id,name:r[0].name,icon:r[0].icon,description:r[0].description,position:{x:25,y:50},canPickUp:!0}],doors:[{id:"door-to-hall",position:"north",targetRoomId:"hall",isLocked:!1,label:"Main Hall"}],npcs:[]},{id:"hall",name:"Main Hall",description:"A large hall with passages in multiple directions.",theme:s,items:[],doors:[{id:"door-back",position:"south",targetRoomId:"entrance",isLocked:!1,label:"Back"},{id:"door-to-treasure",position:"north",targetRoomId:"treasure",isLocked:!0,requiredItemId:r[1].id,label:"Treasure Room"},{id:"door-to-helper",position:"east",targetRoomId:"helper-room",isLocked:!1,label:"Side Room"}],npcs:[{id:l.id,name:l.name,color:l.color,position:{x:70,y:50},currentDialogIndex:0,dialog:[{id:"d1",text:l.greeting,responses:[{text:"Thanks for the tip!"}]}]}]},{id:"helper-room",name:"Side Room",description:"A small room with something useful inside.",theme:s,items:[{id:r[1].id,name:r[1].name,icon:r[1].icon,description:r[1].description,position:{x:50,y:40},canPickUp:!0,usableOn:["door-to-treasure"]}],doors:[{id:"door-back-hall",position:"west",targetRoomId:"hall",isLocked:!1,label:"Hall"}],npcs:[]},{id:"treasure",name:"Treasure Room",description:"You found the treasure room! Congratulations, you won!",theme:s,items:[{id:"treasure",name:"Treasure",icon:"💎",description:"The legendary treasure!",position:{x:50,y:40},canPickUp:!1}],doors:[{id:"door-exit",position:"south",targetRoomId:"hall",isLocked:!1,label:"Exit"}],npcs:[]}]}}const je={currentPhase:"concept",completedSteps:[],conceptsRead:!1,verificationsComplete:!1,challengesCompleted:[],startedAt:null,timeSpentSeconds:0,selectedTheme:"dungeon",gameTitle:"",gameCreated:!1};function Oe({onComplete:s,onBack:j,studentId:w,initialProgress:I}){const{getInitialState:r,saveState:l}=se(`claudecode_project1_${w}`,je),[a,n]=h.useState(()=>{const t=r();return{...t,startedAt:t.startedAt||new Date().toISOString()}});h.useEffect(()=>{const t=setInterval(()=>{n(o=>({...o,timeSpentSeconds:o.timeSpentSeconds+1}))},1e3);return()=>clearInterval(t)},[]),h.useEffect(()=>{l(a)},[a,l]);const L=t=>{n(o=>({...o,currentPhase:t}))},M=t=>{n(o=>({...o,completedSteps:[...new Set([...o.completedSteps,t])]}))},B=()=>{n(t=>({...t,conceptsRead:!0}))},O=()=>{n(t=>({...t,verificationsComplete:!0}))},Y=t=>{n(o=>({...o,challengesCompleted:[...new Set([...o.challengesCompleted,t])]}))},F=t=>{n(o=>({...o,selectedTheme:t}))},W=t=>{n(o=>({...o,gameTitle:t}))},z=()=>{n(t=>({...t,gameCreated:!0}))},E=h.useMemo(()=>ve(a.selectedTheme,a.gameTitle),[a.selectedTheme,a.gameTitle]),{gameState:_,activeDialog:H,move:U,pickUpItem:$,useItem:V,goThroughDoor:K,talkToNPC:J,respondToDialog:X,closeDialog:Z,resetGame:q}=le(E),Q=()=>{const t=`project1-${a.selectedTheme}-${Date.now()}`;localStorage.setItem(`claudecode_game_${t}`,JSON.stringify(E)),window.open(`/claude-code-training/game-preview?game=${t}`,"_blank"),z()},N=h.useCallback(()=>{let t=0;return a.conceptsRead&&(t+=10),t+=a.completedSteps.length*5,a.verificationsComplete&&(t+=25),a.challengesCompleted.forEach(o=>{const c=G.find(d=>d.id===o);c&&(t+=c.xpBonus)}),t},[a]),f=a.conceptsRead&&a.completedSteps.length>=g.length&&a.verificationsComplete,ee=()=>{if(!f)return;const t=N()+100;s({projectId:"project1",completedAt:new Date().toISOString(),timeSpentMinutes:Math.round(a.timeSpentSeconds/60),xpEarned:t,challengesCompleted:a.challengesCompleted,metadata:{completedSteps:a.completedSteps,conceptsRead:a.conceptsRead,verificationsComplete:a.verificationsComplete}})},te=t=>{const o=Math.floor(t/60),c=t%60;return`${o}:${c.toString().padStart(2,"0")}`};return e.jsxs("div",{className:"min-h-screen bg-background dark:bg-slate-950",children:[e.jsx("header",{className:"sticky top-0 z-10 border-b border-border dark:border-slate-800 bg-background/95 dark:bg-slate-950/95 backdrop-blur",children:e.jsx("div",{className:"max-w-5xl mx-auto px-4 py-3",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs(p,{variant:"ghost",size:"sm",onClick:j,children:[e.jsx(de,{className:"w-4 h-4 mr-1"}),"Back"]}),e.jsx("div",{className:"h-6 w-px bg-border dark:bg-slate-700"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-2xl",children:"🎮"}),e.jsxs("div",{children:[e.jsx("h1",{className:"font-bold dark:text-white",children:"Project 1: 2D Adventure Game"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Build a visual game with rooms, items, and puzzles"})]})]})]}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("div",{className:"flex items-center gap-1 text-sm text-muted-foreground",children:[e.jsx(me,{className:"w-4 h-4"}),e.jsx("span",{children:te(a.timeSpentSeconds)})]}),e.jsxs(i,{className:"gap-1 bg-amber-500",children:[e.jsx(A,{className:"w-3 h-3"}),N()," XP"]})]})]})})}),e.jsxs("main",{className:"max-w-5xl mx-auto px-4 py-6",children:[e.jsxs(ae,{value:a.currentPhase,onValueChange:t=>L(t),className:"space-y-6",children:[e.jsxs(oe,{className:"grid grid-cols-4 w-full max-w-2xl mx-auto",children:[e.jsxs(k,{value:"concept",className:"gap-2",children:[e.jsx(he,{className:"w-4 h-4"}),e.jsx("span",{className:"hidden sm:inline",children:"Concepts"}),a.conceptsRead&&e.jsx(b,{className:"w-3 h-3 text-green-500"})]}),e.jsxs(k,{value:"build",className:"gap-2",children:[e.jsx(pe,{className:"w-4 h-4"}),e.jsx("span",{className:"hidden sm:inline",children:"Build"}),a.completedSteps.length===g.length&&e.jsx(b,{className:"w-3 h-3 text-green-500"})]}),e.jsxs(k,{value:"test",className:"gap-2",children:[e.jsx(ue,{className:"w-4 h-4"}),e.jsx("span",{className:"hidden sm:inline",children:"Test"}),a.verificationsComplete&&e.jsx(b,{className:"w-3 h-3 text-green-500"})]}),e.jsxs(k,{value:"levelup",className:"gap-2",children:[e.jsx(xe,{className:"w-4 h-4"}),e.jsx("span",{className:"hidden sm:inline",children:"Level Up"}),a.challengesCompleted.length>0&&e.jsx(i,{variant:"secondary",className:"ml-1 text-xs h-5",children:a.challengesCompleted.length})]})]}),e.jsx(y,{value:"concept",className:"space-y-4",children:e.jsx(re,{concepts:ye,onAllRead:B})}),e.jsxs(y,{value:"build",className:"space-y-6",children:[e.jsxs(u,{className:"border-2 border-purple-500/30 bg-gradient-to-br from-purple-50/50 to-pink-50/50 dark:from-purple-950/30 dark:to-pink-950/30",children:[e.jsx(C,{children:e.jsxs(T,{className:"flex items-center gap-2 dark:text-white",children:[e.jsx(D,{className:"w-5 h-5 text-purple-500"}),"Build Your Visual Adventure Game"]})}),e.jsxs(x,{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"text-sm font-medium mb-3 dark:text-white",children:"1. Choose Your Theme"}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-3",children:Object.keys(v).map(t=>{const o=v[t],c=ke[t],d=a.selectedTheme===t;return e.jsxs("button",{onClick:()=>
21F(t),className:m("p-4 rounded-xl border-2 transition-all text-left","hover:scale-105 hover:shadow-lg",d?"border-purple-500 ring-2 ring-purple-500/50 shadow-lg":"border-slate-200 dark:border-slate-700 hover:border-purple-300"),style:{background:d?c.background:void 0},children:[e.jsx("div",{className:"text-3xl mb-2",children:o.emoji}),e.jsx("div",{className:m("font-bold text-sm",d?"text-white":"dark:text-white"),children:o.name}),e.jsx("div",{className:m("text-xs mt-1",d?"text-white/80":"text-muted-foreground"),children:o.description})]},t)})})]}),e.jsxs("div",{children:[e.jsx("h4",{className:"text-sm font-medium mb-2 dark:text-white",children:"2. Name Your Adventure"}),e.jsx("input",{type:"text",value:a.gameTitle,onChange:t=>W(t.target.value),placeholder:`My ${v[a.selectedTheme].name} Adventure`,className:m("w-full max-w-md px-4 py-2 rounded-lg","border border-slate-200 dark:border-slate-700","bg-white dark:bg-slate-800","text-slate-900 dark:text-white","placeholder:text-slate-400","focus:outline-none focus:ring-2 focus:ring-purple-500")})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-3",children:[e.jsx("h4",{className:"text-sm font-medium dark:text-white",children:"3. Live Preview"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(p,{size:"sm",variant:"outline",onClick:q,className:"gap-1",children:"Reset"}),e.jsxs(p,{size:"sm",onClick:Q,className:"gap-2 bg-purple-600 hover:bg-purple-700",children:[e.jsx(ge,{className:"w-4 h-4"}),"Play Full Screen"]})]})]}),e.jsx("div",{className:"rounded-xl overflow-hidden border-2 border-slate-200 dark:border-slate-700 shadow-xl",children:e.jsx(ce,{gameState:_,onMove:U,onPickUpItem:$,onUseItem:V,onGoThroughDoor:K,onTalkToNPC:J,onDialogResponse:X,onCloseDialog:Z,activeDialog:H,className:"w-full"})}),e.jsxs("p",{className:"text-xs text-muted-foreground mt-2 text-center",children:["Use ",e.jsx("kbd",{className:"px-1 py-0.5 bg-slate-200 dark:bg-slate-700 rounded text-xs",children:"W"}),e.jsx("kbd",{className:"px-1 py-0.5 bg-slate-200 dark:bg-slate-700 rounded text-xs ml-1",children:"A"}),e.jsx("kbd",{className:"px-1 py-0.5 bg-slate-200 dark:bg-slate-700 rounded text-xs ml-1",children:"S"}),e.jsx("kbd",{className:"px-1 py-0.5 bg-slate-200 dark:bg-slate-700 rounded text-xs ml-1",children:"D"})," ","to move • Click doors, items, and characters to interact"]})]}),e.jsxs(S,{className:"border-green-500/50 bg-green-50/50 dark:bg-green-950/30",children:[e.jsx(fe,{className:"w-4 h-4 text-green-500"}),e.jsxs(R,{children:[e.jsx("strong",{className:"text-green-700 dark:text-green-300",children:"How to Win:"}),e.jsx("span",{className:"text-green-600 dark:text-green-400 ml-1",children:"Explore the rooms, find the key, unlock the treasure room!"})]})]})]})]}),e.jsxs(u,{children:[e.jsxs(C,{children:[e.jsx(T,{className:"text-lg dark:text-white",children:"🎯 Complete These Steps to Win!"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Learn how to play and beat the game. Check off each step as you complete it."})]}),e.jsx(x,{children:e.jsx(ne,{steps:g,completedSteps:a.completedSteps,onStepComplete:M})})]})]}),e.jsxs(y,{value:"test",className:"space-y-4",children:[e.jsx(ie,{items:be,onAllComplete:O}),e.jsxs(S,{className:"border-blue-500/50 bg-blue-50/50 dark:bg-blue-950/30",children:[e.jsx(D,{className:"w-4 h-4 text-blue-500"}),e.jsxs(R,{children:[e.jsx("strong",{className:"text-blue-700 dark:text-blue-300",children:"Pro Tips:"}),e.jsxs("ul",{className:"text-blue-600 dark:text-blue-400 ml-4 mt-1 list-disc text-sm",children:[e.jsx("li",{children:"Talk to NPCs - they give the best hints!"}),e.jsx("li",{children:"Check every room for hidden items"}),e.jsx("li",{children:"Some doors need keys to unlock"}),e.jsx("li",{children:"Reset the game anytime with the Reset button"})]})]})]})]}),e.jsx(y,{value:"levelup",className:"space-y-4",children:e.jsxs(u,{children:[e.jsx(C,{children:e.jsxs(T,{className:"flex items-center gap-2 dark:text-white",children:[e.jsx(P,{className:"w-5 h-5 text-amber-500"}),"Optional Challenges"]})}),e.jsxs(x,{className:"space-y-4",children:[e.jsx("p",{className:"text-sm text-muted-foreground",children:"These challenges are optional but earn you bonus XP! Complete them to level up faster."}),G.map(t=>{const o=a.challengesCompleted.includes(t.id);return e.jsx(u,{className:m("transition-all",o&&"border-green-500/50 bg-green-50/30 dark:bg-green-950/20"),children:e.jsx(x,{className:"py-4",children:e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx("h4",{className:"font-medium dark:text-white",children:t.title}),e.jsx(i,{variant:"outline",className:m("text-xs",t.difficulty==="easy"&&"border-green-500 text-green-600",t.difficulty==="medium"&&"border-amber-500 text-amber-600",t.difficulty==="hard"&&"border-red-500 text-red-600"),children:t.difficulty}),e.jsxs(i,{variant:"secondary",className:"text-xs gap-1",children:[e.jsx(A,{className:"w-3 h-3"}),"+",t.xpBonus," XP"]})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:t.description})]}),o?e.jsxs(i,{className:"bg-green-500 gap-1",children:[e.jsx(b,{className:"w-3 h-3"}),"Done"]}):e.jsx(p,{size:"sm",variant:"outline",onClick:()=>Y(t.id),children:"Mark Complete"})]})})},t.id)}),e.jsxs(S,{className:"border-purple-500/50 bg-purple-50/50 dark:bg-purple-950/30",children:[e.jsx(P,{className:"w-4 h-4 text-purple-500"}),e.jsxs(R,{children:[e.jsx("strong",{className:"text-purple-700 dark:text-purple-300",children:"Mini-Challenge: Create a 3-Room Dungeon Game"}
21),e.jsx("p",{className:"text-sm mt-1 text-purple-600 dark:text-purple-400",children:"Using your /adventure skill, create a dungeon with: an entrance room with a locked door, a room with a hidden key, and a treasure room behind the locked door!"})]})]})]})]})})]}),e.jsx(u,{className:"mt-6",children:e.jsx(x,{className:"py-6",children:e.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-bold text-lg dark:text-white",children:"Ready to Complete?"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:f?"You've completed all required sections! Finish the project to earn your badge.":"Complete all concepts, build steps, and verifications to finish."}),!f&&e.jsxs("div",{className:"flex items-center gap-2 mt-2 text-xs text-muted-foreground",children:[!a.conceptsRead&&e.jsx(i,{variant:"outline",children:"Concepts"}),a.completedSteps.length<g.length&&e.jsxs(i,{variant:"outline",children:["Build (",a.completedSteps.length,"/",g.length,")"]}),!a.verificationsComplete&&e.jsx(i,{variant:"outline",children:"Verifications"})]})]}),e.jsxs(p,{size:"lg",onClick:ee,disabled:!f,className:"gap-2",children:[e.jsx(P,{className:"w-5 h-5"}),"Complete Project (+",N()+100," XP)"]})]})})})]})]})}export{Oe 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.