mirror of
http://88.130.71.182:3000/BlitTech/contexta_mb.git
synced 2026-06-12 23:23:22 +00:00
159 lines
5.7 KiB
TypeScript
159 lines
5.7 KiB
TypeScript
import { useColorScheme, Platform } from 'react-native';
|
|
import { useThemeStore } from '../stores/themeStore';
|
|
|
|
// ─── Brand colors ─────────────────────────────────────────────────────────────
|
|
export const COLORS = {
|
|
primary: '#6366f1',
|
|
primaryDark: '#4f46e5',
|
|
primaryLight: '#818cf8',
|
|
primaryUltraLight:'#eef2ff',
|
|
primaryMid: '#c7d2fe',
|
|
|
|
success: '#10b981',
|
|
successBg:'#d1fae5',
|
|
warning: '#f59e0b',
|
|
warningBg:'#fef3c7',
|
|
error: '#ef4444',
|
|
errorBg: '#fee2e2',
|
|
info: '#3b82f6',
|
|
infoBg: '#dbeafe',
|
|
purple: '#8b5cf6',
|
|
purpleBg: '#ede9fe',
|
|
|
|
white: '#ffffff',
|
|
black: '#000000',
|
|
|
|
light: {
|
|
bg: '#f8fafc',
|
|
bgSecondary: '#f1f5f9',
|
|
surface: '#ffffff',
|
|
surfaceHover: '#f8fafc',
|
|
border: '#e2e8f0',
|
|
borderLight: '#f1f5f9',
|
|
text: '#0f172a',
|
|
textSecondary:'#475569',
|
|
textMuted: '#94a3b8',
|
|
inputBg: '#ffffff',
|
|
tabBar: '#ffffff',
|
|
tabBarBorder: '#f1f5f9',
|
|
placeholder: '#94a3b8',
|
|
icon: '#64748b',
|
|
overlay: 'rgba(15,23,42,0.4)',
|
|
},
|
|
|
|
dark: {
|
|
bg: '#0a0f1e',
|
|
bgSecondary: '#0f172a',
|
|
surface: '#151f32',
|
|
surfaceHover: '#1e293b',
|
|
border: '#1e293b',
|
|
borderLight: '#162033',
|
|
text: '#f1f5f9',
|
|
textSecondary:'#94a3b8',
|
|
textMuted: '#475569',
|
|
inputBg: '#151f32',
|
|
tabBar: '#0a0f1e',
|
|
tabBarBorder: '#151f32',
|
|
placeholder: '#475569',
|
|
icon: '#64748b',
|
|
overlay: 'rgba(0,0,0,0.6)',
|
|
},
|
|
};
|
|
|
|
// ─── Spacing ──────────────────────────────────────────────────────────────────
|
|
export const SPACING = {
|
|
xs: 4,
|
|
sm: 8,
|
|
md: 12,
|
|
lg: 16,
|
|
xl: 20,
|
|
xxl: 24,
|
|
xxxl: 32,
|
|
huge: 48,
|
|
};
|
|
|
|
// ─── Border radius ────────────────────────────────────────────────────────────
|
|
export const RADIUS = {
|
|
xs: 4,
|
|
sm: 8,
|
|
md: 12,
|
|
lg: 16,
|
|
xl: 20,
|
|
xxl: 24,
|
|
full: 9999,
|
|
};
|
|
|
|
// ─── Typography ───────────────────────────────────────────────────────────────
|
|
export const FONT_SIZE = {
|
|
xs: 11,
|
|
sm: 13,
|
|
md: 15,
|
|
lg: 17,
|
|
xl: 20,
|
|
xxl: 24,
|
|
xxxl: 30,
|
|
huge: 38,
|
|
};
|
|
|
|
export const FONT = {
|
|
regular: '400' as const,
|
|
medium: '500' as const,
|
|
semibold: '600' as const,
|
|
bold: '700' as const,
|
|
extrabold:'800' as const,
|
|
};
|
|
|
|
// Pre-built text style objects (use with spread)
|
|
export const TEXT = {
|
|
h1: { fontSize: FONT_SIZE.xxxl, fontWeight: FONT.bold, lineHeight: 38 },
|
|
h2: { fontSize: FONT_SIZE.xxl, fontWeight: FONT.bold, lineHeight: 32 },
|
|
h3: { fontSize: FONT_SIZE.xl, fontWeight: FONT.semibold, lineHeight: 28 },
|
|
h4: { fontSize: FONT_SIZE.lg, fontWeight: FONT.semibold, lineHeight: 24 },
|
|
body: { fontSize: FONT_SIZE.md, fontWeight: FONT.regular, lineHeight: 22 },
|
|
bodyM: { fontSize: FONT_SIZE.md, fontWeight: FONT.medium, lineHeight: 22 },
|
|
small: { fontSize: FONT_SIZE.sm, fontWeight: FONT.regular, lineHeight: 18 },
|
|
smallM: { fontSize: FONT_SIZE.sm, fontWeight: FONT.medium, lineHeight: 18 },
|
|
caption: { fontSize: FONT_SIZE.xs, fontWeight: FONT.regular, lineHeight: 16 },
|
|
captionM:{ fontSize: FONT_SIZE.xs, fontWeight: FONT.medium, lineHeight: 16 },
|
|
overline:{ fontSize: FONT_SIZE.xs, fontWeight: FONT.bold, letterSpacing: 1, lineHeight: 16 },
|
|
} as const;
|
|
|
|
// ─── Shadows ──────────────────────────────────────────────────────────────────
|
|
export const SHADOWS = {
|
|
none: {},
|
|
xs: Platform.select({
|
|
ios: { shadowColor: '#000', shadowOffset: { width: 0, height: 1 }, shadowOpacity: 0.04, shadowRadius: 3 },
|
|
android: { elevation: 1 },
|
|
}) ?? {},
|
|
sm: Platform.select({
|
|
ios: { shadowColor: '#0f172a', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.06, shadowRadius: 8 },
|
|
android: { elevation: 2 },
|
|
}) ?? {},
|
|
md: Platform.select({
|
|
ios: { shadowColor: '#0f172a', shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.09, shadowRadius: 16 },
|
|
android: { elevation: 4 },
|
|
}) ?? {},
|
|
lg: Platform.select({
|
|
ios: { shadowColor: '#0f172a', shadowOffset: { width: 0, height: 8 }, shadowOpacity: 0.12, shadowRadius: 24 },
|
|
android: { elevation: 8 },
|
|
}) ?? {},
|
|
xl: Platform.select({
|
|
ios: { shadowColor: '#0f172a', shadowOffset: { width: 0, height: 16 }, shadowOpacity: 0.18, shadowRadius: 40 },
|
|
android: { elevation: 16 },
|
|
}) ?? {},
|
|
// Tinted primary shadow
|
|
primary: Platform.select({
|
|
ios: { shadowColor: '#6366f1', shadowOffset: { width: 0, height: 6 }, shadowOpacity: 0.3, shadowRadius: 16 },
|
|
android: { elevation: 6 },
|
|
}) ?? {},
|
|
};
|
|
|
|
// ─── Theme hook ───────────────────────────────────────────────────────────────
|
|
export function useTheme() {
|
|
const scheme = useColorScheme();
|
|
const mode = useThemeStore(s => s.mode);
|
|
const isDark = mode === 'system' ? scheme === 'dark' : mode === 'dark';
|
|
const theme = isDark ? COLORS.dark : COLORS.light;
|
|
return { isDark, colors: COLORS, theme, shadows: SHADOWS };
|
|
}
|