import React from 'react'; import { Link } from 'react-router-dom'; import { ArrowRight, Lock, Search, ShieldCheck } from 'lucide-react'; import { cn } from '@/lib/utils'; import { isUnlocked } from '@/lib/provingGround'; import { DIFF_TONE, TYPE_ICON, TYPE_LABEL, typeOf } from './challengeMeta'; /** * Every other challenge, as a directory. * * Rows on hairlines rather than a wall of cards: these are secondary to the * featured skill above, and a grid of bordered tiles would compete with it. The * controls sit on the heading line so the section needs no toolbar surface of * its own, and the row still carries everything a card did — skill, title, * description, difficulty, proof type, duration, XP, reward, state and reason. */ export function ChallengeDirectory({ courses, results, search, onSearch, difficulty, onDifficulty, difficulties, loading, filtered, onClear, completedIds, profile, }) { return (

Other challenges

Practical challenges that turn a claim into verified evidence.

{difficulties.map((d) => { const active = d.v === difficulty; return ( ); })}

{results.length} of {courses.length} challenges{filtered ? ' · filtered' : ''}

{filtered && ( )}
{loading ? (
{[...Array(3)].map((_, i) => (
))}
) : results.length === 0 ? (

No challenges match your filters.

) : ( )}
); }