cpns / apps /web /src /components /PageGuide.tsx
rogasper's picture
feat: integrate react-joyride for guided tours and add GettingStartedCard and PageGuide components for user onboarding. Enhance sidebar with a help tour button and update bank components to support new features. Implement bulk selection in SoalBrowser and improve question management with additional props for locking and selection states.
f4209d5
Raw
History Blame
2.4 kB
import { useState } from "react";
import { Card, CardContent } from "@labas/ui/components/card";
import { MaterialIcon } from "@/components/ui/MaterialIcon";
interface GuideItem {
icon: string;
title: string;
desc: string;
}
interface PageGuideProps {
items: GuideItem[];
title?: string;
}
export function PageGuide({ items, title = "Petunjuk" }: PageGuideProps) {
const [open, setOpen] = useState(false);
return (
<Card className="mb-8 bg-[var(--pure-white)] border-2 border-[var(--slushie-500)]/30 rounded-[var(--radius-xl)] overflow-hidden">
<button
onClick={() => setOpen(!open)}
className="w-full flex items-center justify-between p-4 md:p-5 cursor-pointer hover:bg-[var(--oat-light)] transition-colors"
>
<div className="flex items-center gap-3">
<div className="h-9 w-9 bg-[var(--slushie-500)]/20 rounded-[var(--radius-lg)] flex items-center justify-center shrink-0">
<MaterialIcon name="help" className="text-lg text-[var(--slushie-800)]" />
</div>
<div className="text-left">
<h3 className="font-headline font-bold text-[var(--clay-black)]">{title}</h3>
<p className="text-xs text-[var(--warm-charcoal)]">
{open ? "Tutup petunjuk" : `Klik untuk lihat ${items.length} panduan`}
</p>
</div>
</div>
<MaterialIcon
name={open ? "expand_less" : "expand_more"}
className="text-xl text-[var(--warm-charcoal)]"
/>
</button>
{open && (
<div className="px-4 md:px-5 pb-5 space-y-3 border-t border-[var(--oat-border)] pt-4">
{items.map((item, i) => (
<div key={i} className="flex items-start gap-3 p-3 rounded-[var(--radius-lg)] bg-[var(--oat-light)]">
<div className="h-8 w-8 bg-[var(--pure-white)] rounded-[var(--radius-md)] flex items-center justify-center shrink-0 shadow-sm">
<MaterialIcon name={item.icon} className="text-sm text-[var(--matcha-600)]" />
</div>
<div className="flex-1 min-w-0">
<p className="text-sm font-bold text-[var(--clay-black)]">{item.title}</p>
<p className="text-xs text-[var(--warm-charcoal)] mt-0.5 leading-relaxed">{item.desc}</p>
</div>
</div>
))}
</div>
)}
</Card>
);
}