eletrotupi / tcc / frontend/constants/theme.ts master
5.2 KB Raw
/**
 * Below are the colors that are used in the app. The colors are defined in the light and dark mode.
 * There are many other ways to style your app. For example, [Nativewind](https://www.nativewind.dev/), [Tamagui](https://tamagui.dev/), [unistyles](https://reactnativeunistyles.vercel.app), etc.
 */

import { Platform } from "react-native";

// Primary Colors
const NEON_GREEN = "#13ec5b";
const PRIMARY_DARK = "#0f172a";

// Surface & Background
const BACKGROUND_LIGHT = "#f6f8f6";
const SURFACE_LIGHT = "#ffffff";
const BACKGROUND_DARK_GHOST = "#F8FAFC";

// Text Colors
const TEXT_PRIMARY = "#0f172a";
const TEXT_SECONDARY = "#64748b";
const TEXT_PLACEHOLDER = "#94A3B8";

// Borders & Accents
const BORDER_SUBTLE = "#f1f5f9";
const BORDER_SUBTLE_GRAY = "#E5E7EB";
const BORDER_SUBTLE_LIGHT_GRAY = "#CBD5E1";
const STATUS_ACTIVE_BG = "rgba(19, 236, 91, 0.1)";

// Semantic Color Pills and stuff
const PILL_BLUE = "#dbeafe";
const PILL_INDIGO = "#e0e7ff";
const PILL_PURPLE = "#f3e8ff";

const tintColorLight = "#12ED5C";
const tintColorSecondary = "#618A70";
const GRAY = "#475569";
const LIGHT_GRAY = "#64748B";
const LIGHT_SLATE_GRAY = "#94A3B8";

export const Colors = {
  light: {
    // Primary Actions & Focus
    text: TEXT_PRIMARY,
    textSecondary: TEXT_SECONDARY,
    background: BACKGROUND_LIGHT,
    surface: SURFACE_LIGHT,
    tint: NEON_GREEN,
    backgroundDarkGhost: BACKGROUND_DARK_GHOST,
    borderDashed: BORDER_SUBTLE_LIGHT_GRAY,
    smallAddButtonIcon: BORDER_SUBTLE_LIGHT_GRAY,

    // Interactive States
    icon: TEXT_SECONDARY,
    tabIconDefault: TEXT_SECONDARY,
    tabIconSelected: NEON_GREEN,

    // Form Inputs
    inputBackgroundColor: SURFACE_LIGHT,
    inputBackgroundDarkGhostColor: BACKGROUND_DARK_GHOST,
    inputBorderColor: BORDER_SUBTLE_GRAY,
    inputFocusBorderColor: NEON_GREEN,
    inputPlaceholderColor: TEXT_PLACEHOLDER,

    // Cards & Containers
    cardBackground: SURFACE_LIGHT,
    cardBorder: BORDER_SUBTLE,
    cardShadow: "rgba(0, 0, 0, 0.05)",

    // Active / Inactive States
    activeBackground: STATUS_ACTIVE_BG,
    inactiveOpacity: 0.7,
    moodIntensityLabel: "#94a3b8",

    // Semantic Accents (for categorization)
    accentBlue: PILL_BLUE,
    accentIndigo: PILL_INDIGO,
    accentPurple: PILL_PURPLE,
    accentDarkPurple: "#7F77DD",

    // Some grays
    gray: GRAY,
    lightGray: LIGHT_GRAY,
    lightSlateGray: LIGHT_SLATE_GRAY,
    black: PRIMARY_DARK,

    // Disabled / Secondary
    disabled: "#cbd5e1",
    divider: BORDER_SUBTLE,
    sliderTracking: "#E2E8F0",
    sliderLabels: "#94a3b8",
    warning: "orange",
    success: "#22c55e",
    danger: "#EF4444",
    textBlack: PRIMARY_DARK,
  },
};

export const Typography = {
  // Headlines
  headlineXg: {
    fontFamily: Platform.select({
      android: "Inter_900Black",
      default: "Inter",
    }),
    fontSize: 36,
    fontWeight: "900" as const,
    lineHeight: 40,
  },
  headlineLg: {
    fontFamily: Platform.select({
      android: "Inter_900Black",
      default: "Inter",
    }),
    fontSize: 20,
    fontWeight: "900" as const,
    lineHeight: 28,
    letterSpacing: -0.02,
  },
  headlineMd: {
    fontFamily: Platform.select({
      android: "Inter",
      default: "Inter",
    }),
    fontSize: 18,
    fontWeight: "700" as const,
    lineHeight: 24,
  },

  // Body
  bodyLg: {
    fontFamily: Platform.select({
      android: "Inter",
      default: "Inter",
    }),
    fontSize: 16,
    fontWeight: "700" as const,
    lineHeight: 20,
  },
  bodyMd: {
    fontFamily: Platform.select({
      android: "Inter",
      default: "Inter",
    }),
    fontSize: 14,
    fontWeight: "500" as const,
    lineHeight: 20,
  },

  // Labels
  labelSm: {
    fontFamily: Platform.select({
      android: "Inter",
      default: "Inter",
    }),
    fontSize: 12,
    fontWeight: "600" as const,
    lineHeight: 16,
    letterSpacing: 0.05,
  },

  // Used for the Slider labels
  labelXs: {
    fontFamily: Platform.select({
      android: "Inter",
      default: "Inter",
    }),
    fontSize: 10,
    lineHeight: 15,
    letterSpacing: 0.25,
  },

  cardHint: {
    fontFamily: Platform.select({
      android: "Inter",
      default: "Inter",
    }),
    fontSize: 11,
    lineHeight: 13.8,
    fontStyle: "italic",
  },
};

export const Spacing = {
  containerPadding: 16, // 1rem
  sectionGap: 32, // 2rem
  inlineGapSm: 8, // 0.5rem
  cardGap: 12, // 0.75rem
};

export const BorderRadius = {
  sm: 4, // 0.25rem
  default: 8, // 0.5rem
  md: 12, // 0.75rem
  lg: 16, // 1rem
  xl: 24, // 1.5rem
  full: 9999, // pill-shaped
};

export const Shadows = {
  sm: {
    shadowColor: "#000000",
    shadowOffset: { width: 0, height: 1 },
    shadowOpacity: 0.05,
    shadowRadius: 2,
    elevation: 2,
  },
  md: {
    shadowColor: "#000000",
    shadowOffset: { width: 0, height: 4 },
    shadowOpacity: 0.1,
    shadowRadius: 8,
    elevation: 4,
  },
  lg: {
    shadowColor: NEON_GREEN,
    shadowOffset: { width: 0, height: 8 },
    shadowOpacity: 0.15,
    shadowRadius: 16,
    elevation: 8,
  },
};

export const Fonts = Platform.select({
  default: {
    sans: "Inter",
    serif: "serif",
    rounded: "Inter",
    mono: "monospace",
  },
});

export const Theme = {
  colors: Colors,
  typography: Typography,
  spacing: Spacing,
  shadows: Shadows,
  borderRadius: BorderRadius,
};