constants.ts
1 import { createElement, type ComponentType, type SVGProps } from 'react'; 2 import { Blocks, Sparkles, RefreshCw, Bug, TestTube2, Settings, FileText } from 'lucide-react'; 3 import type { SlideType } from '@/lib/types'; 4 5 export const CODE_THEMES = [ 6 { id: 'aurora-x', label: 'Aurora X' }, 7 { id: 'github-dark', label: 'GitHub Dark' }, 8 { id: 'github-dark-dimmed', label: 'GitHub Dimmed' }, 9 { id: 'one-dark-pro', label: 'One Dark Pro' }, 10 { id: 'dracula', label: 'Dracula' }, 11 { id: 'nord', label: 'Nord' }, 12 { id: 'vitesse-dark', label: 'Vitesse Dark' }, 13 { id: 'tokyo-night', label: 'Tokyo Night' }, 14 { id: 'catppuccin-mocha', label: 'Catppuccin Mocha' }, 15 { id: 'poimandres', label: 'Poimandres' }, 16 ] as const; 17 18 export type CodeTheme = (typeof CODE_THEMES)[number]['id']; 19 20 export const CODE_FONTS = [ 21 { id: 'jetbrains-mono', label: 'JetBrains Mono', family: "'JetBrains Mono'" }, 22 { id: 'fira-code', label: 'Fira Code', family: "'Fira Code'" }, 23 { id: 'monaspace-neon', label: 'Monaspace Neon', family: "'Monaspace Neon'" }, 24 { id: 'iosevka', label: 'Iosevka', family: "'Iosevka'" }, 25 { id: 'hack', label: 'Hack', family: "'Hack'" }, 26 ] as const; 27 28 export type CodeFont = (typeof CODE_FONTS)[number]['id']; 29 30 // GitHub mark — Simple Icons (MIT), avoids deprecated lucide Github icon 31 export function GitHubIcon(props: SVGProps<SVGSVGElement>) { 32 return createElement( 33 'svg', 34 { viewBox: '0 0 24 24', fill: 'currentColor', ...props }, 35 createElement('path', { 36 d: 'M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12', 37 }) 38 ); 39 } 40 41 export const slideTypeConfig: Record< 42 SlideType, 43 { label: string; className: string; icon: ComponentType<{ className?: string }> } 44 > = { 45 foundation: { label: 'Foundation', className: 'bg-purple-900 text-purple-200 border-purple-700', icon: Blocks }, 46 feature: { label: 'Feature', className: 'bg-blue-900 text-blue-200 border-blue-700', icon: Sparkles }, 47 refactor: { label: 'Refactor', className: 'bg-orange-900 text-orange-200 border-orange-700', icon: RefreshCw }, 48 bugfix: { label: 'Bug Fix', className: 'bg-red-900 text-red-200 border-red-700', icon: Bug }, 49 test: { label: 'Test', className: 'bg-green-900 text-green-200 border-green-700', icon: TestTube2 }, 50 config: { label: 'Config', className: 'bg-zinc-700 text-zinc-200 border-zinc-600', icon: Settings }, 51 docs: { label: 'Docs', className: 'bg-zinc-700 text-zinc-200 border-zinc-600', icon: FileText }, 52 }; 53 54 export const riskConfig = { 55 low: { 56 label: 'Low Risk', 57 badgeClassName: 'bg-zinc-800 text-zinc-300 border-zinc-600', 58 variant: 'secondary' as const, 59 }, 60 medium: { 61 label: 'Medium Risk', 62 badgeClassName: 'bg-teal-950 text-teal-300 border-teal-700', 63 variant: 'default' as const, 64 }, 65 high: { 66 label: 'High Risk', 67 badgeClassName: 'bg-red-950 text-red-300 border-red-700', 68 variant: 'destructive' as const, 69 }, 70 };