{
  "name": "District Companion Lottie handoff",
  "version": "1.0.0",
  "schema": "bodymovin JSON",
  "canvas": {
    "width": 240,
    "height": 240
  },
  "frameRate": 60,
  "defaultTheme": "dark",
  "themes": {
    "dark": {
      "body": "#4f259d",
      "eye": "#c3acf6",
      "signal": "#b48bf6",
      "success": "#d7bcff",
      "unavailable": "#7e758e"
    },
    "light": {
      "body": "#4a1ea1",
      "eye": "#d7bcff",
      "signal": "#7d4bdc",
      "success": "#a97cea",
      "unavailable": "#7e758e"
    }
  },
  "nativeColorKeypaths": {
    "body": "**.Theme Body Fill.Color",
    "eye": "**.Theme Eye Fill.Color",
    "signalFill": "**.Theme Signal Fill.Color",
    "signalStroke": "**.Theme Signal Stroke.Color",
    "successFill": "**.Theme Success Fill.Color",
    "successStroke": "**.Theme Success Stroke.Color",
    "unavailableFill": "**.Theme Unavailable Fill.Color"
  },
  "contract": {
    "conversationStates": [
      "waking",
      "ready",
      "listening",
      "acknowledged",
      "thinking",
      "clarification",
      "awaiting-confirmation",
      "taking-action",
      "speaking",
      "completed"
    ],
    "activityVariants": [
      "thinking",
      "searching"
    ],
    "surfaceVariants": [
      "resting"
    ],
    "independentConditions": [
      "mic-off",
      "no-permission",
      "completion-residue"
    ]
  },
  "animations": [
    {
      "id": "resting",
      "stateId": "ready",
      "kind": "surface",
      "file": "lottie/district-companion-resting.lottie.json",
      "frameRate": 60,
      "frames": 288,
      "durationMs": 4800,
      "loop": true,
      "reducedMotionFrame": 0,
      "description": "Sleeping entry pose with closed eyes and a slow, quiet breath."
    },
    {
      "id": "waking",
      "stateId": "waking",
      "kind": "conversation",
      "file": "lottie/district-companion-waking.lottie.json",
      "frameRate": 60,
      "frames": 120,
      "durationMs": 2000,
      "loop": false,
      "reducedMotionFrame": 119,
      "description": "Finite wake-up: body unfolds and the attentive eyes open."
    },
    {
      "id": "ready",
      "stateId": "ready",
      "kind": "conversation",
      "file": "lottie/district-companion-ready.lottie.json",
      "frameRate": 60,
      "frames": 288,
      "durationMs": 4800,
      "loop": true,
      "reducedMotionFrame": 0,
      "description": "Quiet breath, projected gaze drift, and uneven periodic blink."
    },
    {
      "id": "listening",
      "stateId": "listening",
      "kind": "conversation",
      "file": "lottie/district-companion-listening.lottie.json",
      "frameRate": 60,
      "frames": 144,
      "durationMs": 2400,
      "loop": true,
      "reducedMotionFrame": 0,
      "description": "Restrained input pulse with two inward listening rings."
    },
    {
      "id": "acknowledged",
      "stateId": "acknowledged",
      "kind": "conversation",
      "file": "lottie/district-companion-acknowledged.lottie.json",
      "frameRate": 60,
      "frames": 120,
      "durationMs": 2000,
      "loop": false,
      "reducedMotionFrame": 42,
      "description": "Finite receipt: one wink and a short body perk."
    },
    {
      "id": "thinking",
      "stateId": "thinking",
      "kind": "activity-variant",
      "file": "lottie/district-companion-thinking.lottie.json",
      "frameRate": 60,
      "frames": 144,
      "durationMs": 2400,
      "loop": true,
      "reducedMotionFrame": 0,
      "description": "Understanding loop with eye scan and sequential thinking beats."
    },
    {
      "id": "searching",
      "stateId": "thinking",
      "kind": "activity-variant",
      "file": "lottie/district-companion-searching.lottie.json",
      "frameRate": 60,
      "frames": 192,
      "durationMs": 3200,
      "loop": true,
      "reducedMotionFrame": 0,
      "description": "Search variant with scanning eyes and an orbiting progress trace."
    },
    {
      "id": "clarification",
      "stateId": "clarification",
      "kind": "conversation",
      "file": "lottie/district-companion-clarification.lottie.json",
      "frameRate": 60,
      "frames": 144,
      "durationMs": 2400,
      "loop": true,
      "reducedMotionFrame": 0,
      "description": "Attentive hold with a restrained clarification signal."
    },
    {
      "id": "awaiting-confirmation",
      "stateId": "awaiting-confirmation",
      "kind": "conversation",
      "file": "lottie/district-companion-awaiting-confirmation.lottie.json",
      "frameRate": 60,
      "frames": 144,
      "durationMs": 2400,
      "loop": true,
      "reducedMotionFrame": 0,
      "description": "Steady, low-motion attention while consequential action confirmation is pending."
    },
    {
      "id": "taking-action",
      "stateId": "taking-action",
      "kind": "conversation",
      "file": "lottie/district-companion-taking-action.lottie.json",
      "frameRate": 60,
      "frames": 144,
      "durationMs": 2400,
      "loop": true,
      "reducedMotionFrame": 0,
      "description": "Directional app-action progress with flattened focused eyes."
    },
    {
      "id": "speaking",
      "stateId": "speaking",
      "kind": "conversation",
      "file": "lottie/district-companion-speaking.lottie.json",
      "frameRate": 60,
      "frames": 144,
      "durationMs": 2400,
      "loop": true,
      "reducedMotionFrame": 0,
      "description": "Output beat with expanding message rings and a flat light-purple halo."
    },
    {
      "id": "completed",
      "stateId": "completed",
      "kind": "conversation",
      "file": "lottie/district-companion-completed.lottie.json",
      "frameRate": 60,
      "frames": 120,
      "durationMs": 2000,
      "loop": false,
      "reducedMotionFrame": 52,
      "description": "Finite success lift with closed happy eyes and a light-purple completion ring."
    },
    {
      "id": "mic-off",
      "stateId": "ready",
      "kind": "condition",
      "file": "lottie/district-companion-mic-off.lottie.json",
      "frameRate": 60,
      "frames": 120,
      "durationMs": 2000,
      "loop": false,
      "reducedMotionFrame": 0,
      "description": "Standalone Mic off condition; audio output remains conceptually available."
    },
    {
      "id": "no-permission",
      "stateId": "ready",
      "kind": "condition",
      "file": "lottie/district-companion-no-permission.lottie.json",
      "frameRate": 60,
      "frames": 144,
      "durationMs": 2400,
      "loop": true,
      "reducedMotionFrame": 0,
      "description": "Standalone microphone-permission unavailable condition with an explicit lock."
    },
    {
      "id": "completion-residue",
      "stateId": "ready",
      "kind": "condition",
      "file": "lottie/district-companion-completion-residue.lottie.json",
      "frameRate": 60,
      "frames": 480,
      "durationMs": 8000,
      "loop": true,
      "reducedMotionFrame": 0,
      "description": "Subtle completion marker retained after returning to Ready."
    }
  ]
}
