/** * skiddie design tokens: the single source of truth. * * `tailwind-preset.js` turns these into `sk-*` Tailwind classes (CSS variables, so light/dark * switch automatically). Components read this file directly only for values needed in JS, * e.g. inside Reanimated worklets. Edit values here, then restart Metro so Tailwind rebuilds. */export const tokens = { colors: { light: { background: '#FFFFFF', surface: '#F4F4F5', active: '#0A0A0A', inactive: '#A1A1AA', indicator: '#0A0A0A', badge: '#EF4444', badgeText: '#FFFFFF', border: '#E4E4E7', // Pill Tabs: the sliding pill inside the surface track, and the trackless version's pill on the background. pill: '#FFFFFF', pillPlain: '#F4F4F5', // Divider Tab Bar: the active icon's color. accent: '#A0692C', // Slide Drawer: the layer that dims the screen behind an open drawer (at `opacity.scrim`). scrim: '#000000', }, dark: { background: '#0A0A0A', surface: '#18181B', active: '#FAFAFA', inactive: '#71717A', indicator: '#FAFAFA', badge: '#EF4444', badgeText: '#FFFFFF', border: '#27272A', pill: '#3F3F46', pillPlain: '#27272A', accent: '#C8955A', scrim: '#000000', }, }, radius: { bar: 28, card: 12, item: 20, indicator: 999 }, spacing: { barPaddingH: 12, barPaddingV: 8, itemPaddingV: 16, itemGap: 4, floatingInset: 16, // Default gap between a floating bottom bar and the bottom safe area, so it clears the home indicator. floatingOffset: 23, badgeOffsetX: 8, badgeOffsetY: 4, badgePaddingH: 4, // Gap between a highlight tile and its tab's edges. tileInset: 4, // Pill Tabs: horizontal padding inside each pill. pillPaddingH: 16, // Slide Drawer: padding inside the panel, space between its sections, a menu row's vertical padding and the // gap between its icon and label, and the gap under the profile name. drawerPadding: 24, drawerSection: 24, drawerItemV: 14, drawerItemGap: 16, drawerNameGap: 6, }, // Sizes in px. Use these, not Tailwind's rem classes (py-4, h-1…): NativeWind makes 1rem 14px on native and 16px // on web, so rem classes would differ from the StyleSheet versions (ADR 0026). size: { indicatorThickness: 4, // Longest an underline gets, so it stays short when a bar has few, wide tabs. underlineMax: 48, badge: 16, badgeDot: 8, // The cutout bar's notch: opening width at the top edge, depth, and the dot inside it. notchWidth: 44, notchDepth: 10, notchDot: 6, // Divider Tab Bar: height and width of the lines between tabs. dividerHeight: 24, dividerWidth: 1, // Slide Drawer: panel width (never more than `drawerMaxShare` of the screen), profile picture, footer button. drawerWidth: 320, drawerMaxShare: 0.85, drawerAvatar: 88, drawerButton: 52, }, typography: { label: { fontSize: 11, lineHeight: 14, letterSpacing: 0.2 }, badge: { fontSize: 10 }, // Top tab labels (Pill Tabs). tab: { fontSize: 15, lineHeight: 20, letterSpacing: -0.2 }, // Slide Drawer: the profile name and detail line, and the menu rows. drawerName: { fontSize: 28, lineHeight: 34, letterSpacing: -0.4 }, drawerDetail: { fontSize: 15, lineHeight: 20, letterSpacing: 0 }, drawerItem: { fontSize: 16, lineHeight: 22, letterSpacing: -0.1 }, }, // Slide Drawer: how dark the scrim gets when the drawer is fully open. opacity: { scrim: 0.5 }, motion: { spring: { damping: 18, stiffness: 220, mass: 1 }, durationMs: 220 }, hitSlop: 8, minTouchTarget: 44,} as const;export type SkiddieTokens = typeof tokens;export type SkiddieColorName = keyof SkiddieTokens['colors']['light'];