/ lib / constants.ts
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  };