CruciDrive’s design system is inspired by the ocean light and coastal atmosphere of Crucita. All tokens live inDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/DavidCevallos15/Crucidrive---APP/llms.txt
Use this file to discover all available pages before exploring further.
src/constants/theme.ts and implement a Glassmorphism visual language — translucent cards, backdrop blur, and subtle glass borders floating over interactive maps. The system is the single source of truth referenced by every component; never hard-code a hex value or pixel measurement that belongs to a token.
Color Palette
Brand colors derive from the natural palette of the Crucita coastline: teal from the Pacific, amber from the coastal sunset, and a deep navy for the night-mode canvas.| Token | Hex | Usage |
|---|---|---|
primary | #0D9488 | Brand teal — primary buttons, active states, focus rings |
primaryLight | #14B8A6 | Hover states, lighter accent variant of brand teal |
secondary | #F59E0B | CTAs, price badges, sunset-amber highlights |
secondaryLight | #FBBF24 | Secondary accent variant |
danger | #EF4444 | Panic button, validation errors, cancel actions |
dangerLight | #F87171 | Danger hover and activated-panic state |
success | #10B981 | Available status indicator, success toasts |
successLight | #34D399 | Success accent, online driver ring |
darkBg | #0B0F19 | App dark mode background canvas |
lightBg | #F8FAFC | Light mode background |
glassTextDark | #F1F5F9 | Primary text on dark glass surfaces |
glassTextLight | #0F172A | Primary text on light glass surfaces |
glassTextMutedDark | #94A3B8 | Secondary/muted text on dark glass |
glassTextMutedLight | #64748B | Secondary/muted text on light glass |
white | #FFFFFF | Pure white — icon fills, high-contrast text on solid buttons |
black | #000000 | Pure black — rarely used directly; prefer darkBg for backgrounds |
transparent | 'transparent' | Utility value for removing background fills on overlays |
Glassmorphic Tokens
These four values define the translucent material used by every glass component. They are split by color mode so components can switch cleanly between dark and light contexts without hard-coding RGBA values inline.| Token | Value | Usage |
|---|---|---|
glassBgDark | rgba(255, 255, 255, 0.07) | Dark-mode card background — white at 7% opacity creates the frosted-glass feel |
glassBgLight | rgba(15, 23, 42, 0.04) | Light-mode card background — navy at 4% opacity for a subtle tint |
glassBorderDark | rgba(255, 255, 255, 0.12) | Dark-mode glass border — mimics light reflecting off glass edges |
glassBorderLight | rgba(15, 23, 42, 0.08) | Light-mode glass border — a soft navy-tinted line |
Typography
Two typefaces are used throughout the app, loaded viaexpo-google-fonts:
Outfit is used exclusively for headings and button labels to give the UI a friendly, rounded personality. Inter is used everywhere else for its superior legibility at small sizes on OLED screens.
Spacing System
All spacing follows a 4 dp / 8 dp grid. Never use arbitrary pixel values — pick the closest token.Shapes
Border radii create the organic, coastal feel that distinguishes CruciDrive from utilitarian map apps:Effects
Shadows
Two shadow presets match the ambient light conditions of the dark and light themes:shadowLight uses a deep-indigo tint at low opacity to simulate the soft, diffused shadows found in material design for light interfaces. shadowDark uses near-black at higher opacity for more dramatic depth on the dark canvas.
blurIntensity: 20 is the default value passed to expo-blur’s BlurView component and represents a deliberately moderate blur — enough to create depth without obscuring the map beneath.
Animation Constants
All motion in CruciDrive is driven by these constants. Never hard-code durations or spring params in component files.spring configuration is shared by GlassButton and any component that uses withSpring from react-native-reanimated. It produces a natural, slightly bouncy settle that avoids the mechanical feel of linear easing.
panicHoldDuration of 2 000 ms is intentional — it prevents accidental SOS activations during normal ride usage while still being short enough to be effective in an emergency. rideAcceptTimeout of 15 000 ms matches the server-side TTL on pending ride requests in viajes.
Z-Index Scale
All positional layering must use these tokens. Never write a barezIndex number in a component stylesheet.
modal: 100 to toast: 1000 ensures that toast notifications are always legible regardless of how many modals are stacked.
Implementation Guidelines
Rules distilled fromDESIGN.md v1.0.0 that every contributor must follow:
- Use
BlurViewfromexpo-blurfor all blur effects — never CSSbackdrop-filter. On iOS and Android, CSS blur filters are not supported natively without the Expo SDK. - Never stack multiple glass layers. A glass modal on top of a glass card on top of a glass bar degrades GPU performance and makes the UI illegible. Each screen should have at most one active glass layer in the foreground.
- Maintain high text contrast. Use
COLORS.glassTextDark(#F1F5F9) on dark glass andCOLORS.glassTextLight(#0F172A) on light glass. Never usefont-lightweight on translucent backgrounds — it fails readability checks in direct sunlight. - Use
react-native-reanimatedfor all animations. The built-inAnimatedAPI from React Native core is not permitted. All shared values, animated styles, and gestures must go through Reanimated v3.
Standard Glassmorphic container pattern
GlassCard component instead of composing this pattern manually — it applies the same tokens plus the correct shadow and overflow clipping. Reserve raw BlurView usage for cases where you need blur without any border or shadow, such as full-screen overlays.