{
  "$schema_note": "Remly Glass tokens v0.1. Platform-neutral. Same values as tokens.css. Colours are hex or rgba strings; sizes are in points (pt = CSS px = dp); durations in ms. Each colour has light and dark. Generate SwiftUI and Compose from this file (see 08-native-mapping.md).",
  "version": "0.1.0",
  "color": {
    "ink": {
      "light": "#0d0f1a",
      "dark": "#f4f5fb"
    },
    "text2": {
      "light": "rgba(13,15,26,0.62)",
      "dark": "rgba(244,245,251,0.66)"
    },
    "text3": {
      "light": "rgba(13,15,26,0.45)",
      "dark": "rgba(244,245,251,0.45)"
    },
    "textOnAccent": {
      "light": "#ffffff",
      "dark": "#ffffff"
    },
    "accent": {
      "light": "#ff5a1f",
      "dark": "#ff5a1f"
    },
    "accentText": {
      "light": "#c2410c",
      "dark": "#ff8a5c"
    },
    "accentStrong": {
      "light": "#c2410c",
      "dark": "#c2410c"
    },
    "accentSheen": {
      "light": "#e2561a",
      "dark": "#e2561a"
    },
    "accentSoft": {
      "light": "rgba(255,90,31,0.16)",
      "dark": "rgba(255,106,43,0.22)"
    },
    "ok": {
      "light": "#15803d",
      "dark": "#34d399"
    },
    "okSoft": {
      "light": "rgba(22,163,74,0.14)",
      "dark": "rgba(52,211,153,0.16)"
    },
    "warn": {
      "light": "#b45309",
      "dark": "#fbbf24"
    },
    "warnSoft": {
      "light": "rgba(234,179,8,0.18)",
      "dark": "rgba(251,191,36,0.16)"
    },
    "danger": {
      "light": "#b91c1c",
      "dark": "#f87171"
    },
    "dangerSoft": {
      "light": "rgba(239,68,68,0.14)",
      "dark": "rgba(248,113,113,0.16)"
    },
    "info": {
      "light": "#1d4ed8",
      "dark": "#60a5fa"
    },
    "infoSoft": {
      "light": "rgba(59,130,246,0.14)",
      "dark": "rgba(96,165,250,0.16)"
    },
    "neutral": {
      "light": "rgba(13,15,26,0.62)",
      "dark": "rgba(244,245,251,0.66)"
    },
    "neutralSoft": {
      "light": "rgba(13,15,26,0.07)",
      "dark": "rgba(255,255,255,0.08)"
    },
    "line": {
      "light": "rgba(0,0,0,0.07)",
      "dark": "rgba(255,255,255,0.08)"
    },
    "lineStrong": {
      "light": "rgba(0,0,0,0.14)",
      "dark": "rgba(255,255,255,0.16)"
    },
    "scrim": {
      "light": "rgba(0,0,0,0.18)",
      "dark": "rgba(0,0,0,0.35)"
    },
    "surface": {
      "light": "rgba(255,255,255,0.94)",
      "dark": "rgba(22,24,36,0.94)"
    },
    "surfaceRaised": {
      "light": "#ffffff",
      "dark": "#1c1f2e"
    },
    "surfaceSunken": {
      "light": "rgba(13,15,26,0.05)",
      "dark": "rgba(255,255,255,0.06)"
    },
    "remyTint": {
      "light": "rgba(123,108,255,0.10)",
      "dark": "rgba(123,108,255,0.16)"
    },
    "remyEdge": {
      "light": "rgba(123,108,255,0.45)",
      "dark": "rgba(123,108,255,0.45)"
    },
    "remyGradientStops": [
      "#ff6a2b",
      "#ff5fa2",
      "#7b6cff",
      "#3fd0ff",
      "#ff6a2b"
    ]
  },
  "stage": {
    "_note": "Lead statuses from the API contract. 'urgent' is a flag, 'garbage' never shows on the board, 'closed' reads as 'Done'.",
    "new": {
      "label": "New",
      "dot": "#60a5fa",
      "text": {
        "light": "#1d4ed8",
        "dark": "#60a5fa"
      }
    },
    "contacted": {
      "label": "Contacted",
      "dot": "#22d3ee",
      "text": {
        "light": "#0e7490",
        "dark": "#22d3ee"
      }
    },
    "quoted": {
      "label": "Quoted",
      "dot": "#fbbf24",
      "text": {
        "light": "#b45309",
        "dark": "#fbbf24"
      }
    },
    "scheduled": {
      "label": "Booked",
      "dot": "#a78bfa",
      "text": {
        "light": "#6d28d9",
        "dark": "#a78bfa"
      }
    },
    "closed": {
      "label": "Done",
      "dot": "#34d399",
      "text": {
        "light": "#15803d",
        "dark": "#34d399"
      }
    },
    "collections": {
      "label": "To collect",
      "dot": "#f472b6",
      "text": {
        "light": "#be185d",
        "dark": "#f472b6"
      }
    },
    "lost": {
      "label": "Lost",
      "dot": "#94a3b8",
      "text": {
        "light": "#475569",
        "dark": "#94a3b8"
      }
    },
    "urgent": {
      "label": "Urgent",
      "dot": "#ef4444",
      "text": {
        "light": "#b91c1c",
        "dark": "#f87171"
      },
      "isFlag": true
    }
  },
  "appointmentStatus": {
    "pending": {
      "label": "Not confirmed",
      "tone": "warn",
      "calendar": "Remy ghost slot (dashed)"
    },
    "confirmed": {
      "label": "Confirmed",
      "tone": "ok"
    },
    "completed": {
      "label": "Done",
      "tone": "neutral"
    },
    "cancelled": {
      "label": "Called off",
      "tone": "danger"
    }
  },
  "callKind": {
    "voicemail": {
      "label": "Voicemail",
      "tone": "voicemail"
    },
    "missed_auto_texted": {
      "label": "Missed · texted them back",
      "tone": "danger"
    },
    "answered": {
      "label": "Answered",
      "tone": "ok"
    },
    "outgoing": {
      "label": "Outgoing",
      "tone": "neutral"
    }
  },
  "channel": {
    "_note": "Same colours as the shipping iOS/Android apps (gradient start -> end). Colour on a row means channel, nothing else.",
    "sms": {
      "label": "SMS",
      "color": "#007aff",
      "gradientEnd": "#0051d5"
    },
    "whatsapp": {
      "label": "WhatsApp",
      "color": "#25d366",
      "gradientEnd": "#128c7e"
    },
    "web": {
      "label": "Web chat",
      "color": "#6b7280",
      "gradientEnd": "#374151"
    },
    "voicemail": {
      "label": "Voicemail",
      "color": "#a855f7",
      "gradientEnd": "#6b21a8"
    },
    "email": {
      "label": "Email",
      "color": "#64748b",
      "gradientEnd": "#334155"
    }
  },
  "wallpaper": {
    "vivid": {
      "_use": "Today screen only (concept 6)",
      "light": {
        "w1": "#ff9a62",
        "w2": "#ff5fa2",
        "w3": "#7b6cff",
        "w4": "#3fd0ff",
        "w5": "#ffe27a"
      },
      "dark": {
        "w1": "#b23a12",
        "w2": "#8a1f5c",
        "w3": "#2a1f8f",
        "w4": "#065a7a",
        "w5": "#6b4a00"
      }
    },
    "calm": {
      "_use": "Every other screen (concept 10)",
      "light": {
        "base": "#eef1ff",
        "blobs": [
          "#ffc4a8",
          "#c9c2ff",
          "#a8e6ff"
        ],
        "blobOpacity": 1
      },
      "dark": {
        "base": "#0c0e1d",
        "blobs": [
          "#ffc4a8",
          "#c9c2ff",
          "#a8e6ff"
        ],
        "blobOpacity": 0.35
      }
    }
  },
  "material": {
    "glass": {
      "_use": "Chrome: scrolled nav bar, tab bar, floating buttons, segmented control, search field on wallpaper",
      "fill": {
        "light": "rgba(255,255,255,0.34)",
        "dark": "rgba(30,32,48,0.36)"
      },
      "fillStrong": {
        "light": "rgba(255,255,255,0.55)",
        "dark": "rgba(40,42,60,0.55)"
      },
      "blur": 22,
      "saturate": 1.9,
      "brightness": 1.06,
      "edge": {
        "light": "rgba(255,255,255,0.75)",
        "dark": "rgba(255,255,255,0.28)"
      },
      "edge2": {
        "light": "rgba(255,255,255,0.18)",
        "dark": "rgba(255,255,255,0.05)"
      },
      "highlight": {
        "light": "rgba(255,255,255,0.90)",
        "dark": "rgba(255,255,255,0.35)"
      },
      "shadow": {
        "light": {
          "y": 18,
          "blur": 40,
          "color": "rgba(40,20,90,0.18)"
        },
        "dark": {
          "y": 18,
          "blur": 40,
          "color": "rgba(0,0,0,0.45)"
        }
      },
      "reducedTransparencyFill": {
        "light": "#f4f5fa",
        "dark": "#1c1e2b"
      }
    },
    "sheet": {
      "_use": "Bottom sheets and popovers. Glass recipe with fillStrong",
      "fill": {
        "light": "rgba(255,255,255,0.55)",
        "dark": "rgba(40,42,60,0.55)"
      },
      "blur": 22,
      "radius": 38,
      "inset": 8,
      "reducedTransparencyFill": {
        "light": "#ffffff",
        "dark": "#262938"
      }
    },
    "frost": {
      "_use": "Short glanceable cards: stat tiles, Today hero, chart card",
      "fill": {
        "light": "rgba(255,255,255,0.72)",
        "dark": "rgba(28,28,32,0.66)"
      },
      "blur": 30,
      "saturate": 1.8,
      "border": {
        "light": "rgba(255,255,255,0.8)",
        "dark": "rgba(255,255,255,0.14)",
        "width": 0.5
      },
      "shadow": {
        "light": {
          "y": 10,
          "blur": 30,
          "color": "rgba(20,20,40,0.08)"
        },
        "dark": {
          "y": 10,
          "blur": 30,
          "color": "rgba(0,0,0,0.4)"
        }
      },
      "reducedTransparencyFill": {
        "light": "#ffffff",
        "dark": "#1c1e2b"
      }
    },
    "solid": {
      "_use": "Dense content: lists, threads, transcripts, forms, settings",
      "fill": {
        "light": "rgba(255,255,255,0.94)",
        "dark": "rgba(22,24,36,0.94)"
      },
      "blur": 30,
      "saturate": 1.4,
      "reducedTransparencyFill": {
        "light": "#ffffff",
        "dark": "#161824"
      }
    }
  },
  "type": {
    "_note": "Sizes in pt at the default text size. Native maps each to a Dynamic Type / Material text style so it scales.",
    "fontFamily": {
      "ios": "SF Pro (system)",
      "android": "Roboto (system) / Google Sans Flex if adopted later",
      "web": "-apple-system, BlinkMacSystemFont, 'SF Pro Text', Inter, Roboto, system-ui, sans-serif"
    },
    "display": {
      "size": 40,
      "lineHeight": 1.02,
      "weight": 800,
      "tracking": -1.4,
      "iosStyle": "largeTitle (custom size)",
      "material": "displaySmall"
    },
    "hero": {
      "size": 64,
      "lineHeight": 0.9,
      "weight": 800,
      "tracking": -3.0,
      "iosStyle": "custom, relativeTo largeTitle",
      "material": "displayLarge"
    },
    "largeTitle": {
      "size": 30,
      "lineHeight": 1.1,
      "weight": 800,
      "tracking": -0.8,
      "iosStyle": "largeTitle",
      "material": "headlineMedium"
    },
    "title": {
      "size": 22,
      "lineHeight": 1.2,
      "weight": 800,
      "tracking": -0.4,
      "iosStyle": "title2",
      "material": "headlineSmall"
    },
    "stat": {
      "size": 28,
      "lineHeight": 1.0,
      "weight": 800,
      "tracking": -1.0,
      "iosStyle": "title",
      "material": "headlineMedium",
      "numeric": "tabular"
    },
    "headline": {
      "size": 17,
      "lineHeight": 1.3,
      "weight": 700,
      "tracking": 0,
      "iosStyle": "headline",
      "material": "titleMedium"
    },
    "rowTitle": {
      "size": 16,
      "lineHeight": 1.3,
      "weight": 700,
      "tracking": 0,
      "iosStyle": "callout (bold)",
      "material": "titleSmall"
    },
    "body": {
      "size": 16,
      "lineHeight": 1.45,
      "weight": 450,
      "tracking": 0,
      "iosStyle": "body (16 via callout)",
      "material": "bodyLarge"
    },
    "subhead": {
      "size": 14,
      "lineHeight": 1.35,
      "weight": 550,
      "tracking": 0,
      "iosStyle": "subheadline",
      "material": "bodyMedium"
    },
    "footnote": {
      "size": 13,
      "lineHeight": 1.3,
      "weight": 600,
      "tracking": 0,
      "iosStyle": "footnote",
      "material": "labelLarge"
    },
    "caption": {
      "size": 12.5,
      "lineHeight": 1.3,
      "weight": 650,
      "tracking": 0,
      "iosStyle": "caption",
      "material": "labelMedium",
      "numeric": "tabular"
    },
    "label": {
      "size": 12,
      "lineHeight": 1.2,
      "weight": 750,
      "tracking": 0.5,
      "case": "upper",
      "iosStyle": "caption (bold)",
      "material": "labelMedium"
    },
    "section": {
      "size": 13,
      "lineHeight": 1.2,
      "weight": 750,
      "tracking": 0.7,
      "case": "upper",
      "iosStyle": "footnote (bold)",
      "material": "labelLarge"
    },
    "tab": {
      "size": 11,
      "lineHeight": 1.0,
      "weight": 700,
      "tracking": 0,
      "iosStyle": "caption2",
      "material": "labelSmall"
    },
    "tag": {
      "size": 12,
      "lineHeight": 1.0,
      "weight": 750,
      "tracking": 0,
      "iosStyle": "caption2 (bold)",
      "material": "labelSmall"
    }
  },
  "space": {
    "0": 2,
    "1": 4,
    "1h": 6,
    "2": 8,
    "2h": 10,
    "3": 12,
    "3h": 14,
    "4": 16,
    "5": 20,
    "6": 24,
    "7": 28,
    "8": 32,
    "10": 40,
    "gutter": 16,
    "tabbarClearance": 130,
    "tapMin": 44
  },
  "radius": {
    "xs": 9,
    "sm": 12,
    "md": 16,
    "lg": 20,
    "xl": 22,
    "2xl": 30,
    "sheet": 38,
    "pill": 999
  },
  "elevation": {
    "e0": "none",
    "e1": {
      "use": "frosted cards",
      "y": 10,
      "blur": 30,
      "color": {
        "light": "rgba(20,20,40,0.08)",
        "dark": "rgba(0,0,0,0.4)"
      }
    },
    "e2": {
      "use": "glass chrome",
      "y": 18,
      "blur": 40,
      "color": {
        "light": "rgba(40,20,90,0.18)",
        "dark": "rgba(0,0,0,0.45)"
      }
    },
    "e3": {
      "use": "floating tab bar",
      "layers": [
        {
          "y": 18,
          "blur": 40,
          "color": "rgba(40,20,90,0.18)"
        },
        {
          "y": 20,
          "blur": 40,
          "color": "rgba(0,0,0,0.12)"
        }
      ]
    },
    "drag": {
      "use": "dragged job card",
      "y": 26,
      "blur": 50,
      "color": "rgba(0,0,0,0.45)"
    },
    "accentGlow": {
      "use": "primary button",
      "y": 10,
      "blur": 24,
      "color": "rgba(255,90,31,0.35)"
    }
  },
  "motion": {
    "_note": "Names match remly-ios DesignSystem/Motion.swift. Web uses the cubic-bezier; native uses the spring. Under Reduce Motion every duration is 0.",
    "signature": {
      "web": {
        "ms": 420,
        "ease": "cubic-bezier(.2,.85,.25,1)"
      },
      "ios": {
        "spring": {
          "response": 0.253,
          "damping": 0.86
        }
      },
      "compose": {
        "dampingRatio": 0.86,
        "stiffness": 620
      },
      "use": "push navigation, row -> thread"
    },
    "send": {
      "web": {
        "ms": 300,
        "ease": "cubic-bezier(.3,1.5,.5,1)"
      },
      "ios": {
        "spring": {
          "response": 0.238,
          "damping": 0.62
        }
      },
      "compose": {
        "dampingRatio": 0.62,
        "stiffness": 700
      },
      "use": "sent bubble grows from composer"
    },
    "press": {
      "web": {
        "ms": 300,
        "ease": "cubic-bezier(.3,1.5,.5,1)",
        "scale": 0.97
      },
      "ios": {
        "spring": {
          "response": 0.209,
          "damping": 0.72
        }
      },
      "compose": {
        "dampingRatio": 0.72,
        "stiffness": 900
      },
      "use": "tap feedback, tab selection"
    },
    "lens": {
      "web": {
        "ms": 550,
        "ease": "cubic-bezier(.3,1.5,.45,1)"
      },
      "ios": {
        "spring": {
          "response": 0.35,
          "damping": 0.75
        }
      },
      "compose": {
        "dampingRatio": 0.75,
        "stiffness": 320
      },
      "use": "tab-bar lens, segmented knob"
    },
    "sheet": {
      "web": {
        "ms": 450,
        "ease": "cubic-bezier(.2,1.05,.3,1)"
      },
      "ios": {
        "spring": {
          "response": 0.42,
          "damping": 0.9
        }
      },
      "compose": {
        "dampingRatio": 0.9,
        "stiffness": 220
      },
      "use": "sheet in/out"
    },
    "rest": {
      "web": {
        "ms": 420,
        "ease": "cubic-bezier(.2,.85,.25,1)"
      },
      "ios": {
        "spring": {
          "response": 0.42,
          "damping": 1.0
        }
      },
      "compose": {
        "dampingRatio": 1.0,
        "stiffness": 220
      },
      "use": "anything structural"
    },
    "tint": {
      "web": {
        "ms": 180,
        "ease": "ease-out"
      },
      "ios": {
        "easeOut": 0.18
      },
      "compose": {
        "tween": 180
      },
      "use": "colour changes; never springs"
    },
    "rise": {
      "web": {
        "ms": 600,
        "ease": "cubic-bezier(.2,.9,.3,1)",
        "stagger": 50,
        "maxItems": 6
      },
      "ios": {
        "stagger": 0.016,
        "maxRows": 8
      },
      "use": "content arriving"
    },
    "fade": {
      "web": {
        "ms": 350,
        "ease": "ease"
      },
      "use": "tab switch"
    },
    "toast": {
      "web": {
        "ms": 300,
        "holdMs": 1900
      }
    },
    "remySpin": {
      "ms": 7000,
      "use": "Remy orb rotation; stops under Reduce Motion"
    },
    "autoSendCountdown": {
      "ms": 5000,
      "use": "Remy auto-send countdown. Behaviour, not decoration: never shorten"
    }
  },
  "haptics": {
    "_note": "Names match remly-ios DesignSystem/Haptics.swift. Android maps to HapticFeedbackConstants; web prototype uses navigator.vibrate(8) where available.",
    "selection": {
      "use": "tab change, segmented change, toggle",
      "android": "CLOCK_TICK / SEGMENT_TICK"
    },
    "light": {
      "use": "button press, sheet open, card pick-up",
      "android": "VIRTUAL_KEY"
    },
    "success": {
      "use": "message sent, job booked, suggestion approved",
      "android": "CONFIRM"
    },
    "warning": {
      "use": "send failed, consent refused, session expired",
      "android": "REJECT"
    }
  }
}