Roadmap to becoming a developer in 2022
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

81 lines
2.0 KiB

import { BookOpenCheckIcon, SignpostIcon, type LucideIcon } from 'lucide-react';
import { cn } from '../../lib/classname';
import type { AICourseViewMode } from './AICourseContent';
type AIRoadmapViewSwitchProps = {
viewMode: AICourseViewMode;
setViewMode: (mode: AICourseViewMode) => void;
isLoading: boolean;
variant?: 'icon' | 'text';
};
export function AIRoadmapViewSwitch(props: AIRoadmapViewSwitchProps) {
const { viewMode, setViewMode, isLoading, variant = 'icon' } = props;
return (
<div
className={cn(
'grid shrink-0 grid-cols-2 gap-0.5 rounded-md border border-gray-300 bg-white p-0.5 shadow-sm',
)}
>
<SwitchButton
onClick={() => setViewMode('outline')}
isActive={viewMode === 'outline'}
disabled={isLoading}
variant={variant}
icon={BookOpenCheckIcon}
label="Outline"
/>
<SwitchButton
onClick={() => setViewMode('roadmap')}
isActive={viewMode === 'roadmap'}
disabled={isLoading}
variant={variant}
icon={SignpostIcon}
label="Roadmap"
/>
</div>
);
}
type SwitchButtonProps = {
onClick: () => void;
isActive: boolean;
disabled: boolean;
variant?: 'icon' | 'text';
icon: LucideIcon;
label: string;
};
export function SwitchButton(props: SwitchButtonProps) {
const {
onClick,
isActive,
disabled,
variant = 'icon',
icon: Icon,
label,
} = props;
return (
<button
className={cn(
'flex items-center justify-center gap-1.5 rounded text-sm hover:bg-gray-100 disabled:cursor-not-allowed',
isActive && 'bg-gray-100 text-gray-800',
variant === 'text' ? 'px-2 py-1.5' : 'p-[5px]',
)}
onClick={onClick}
disabled={disabled}
>
<Icon
className={cn(
'size-4',
variant === 'icon' && 'h-3 w-3',
isActive && 'text-gray-800',
)}
/>
{variant === 'text' && label}
</button>
);
}