{
  "name": "TDS tokens",
  "docs": "https://developers.moring.co/tds",
  "note": "Colour tokens differ per service. space, radius, font, type, shadow and motion are the same in every service.",
  "sources": {
    "mordy": {
      "commit": "60df633"
    },
    "morit": {
      "commit": "e50d1ee"
    }
  },
  "colorGroups": [
    {
      "id": "surface",
      "title": "배경과 면"
    },
    {
      "id": "line",
      "title": "선"
    },
    {
      "id": "text",
      "title": "글자"
    },
    {
      "id": "brand",
      "title": "주색"
    },
    {
      "id": "segment",
      "title": "탭과 구분 컨트롤"
    },
    {
      "id": "status",
      "title": "상태"
    },
    {
      "id": "overlay",
      "title": "덮개와 고정색"
    }
  ],
  "colorTokens": {
    "bg": {
      "group": "surface",
      "label": "화면 배경",
      "usage": "화면 맨 뒤 배경이다. Screen 컴포넌트의 기본 배경이다."
    },
    "canvas": {
      "group": "surface",
      "label": "회색 바탕",
      "usage": "흰 패널(Panel) 아래에 까는 옅은 회색 바탕이다. 시험 계획과 리포트 화면이 쓴다."
    },
    "surface": {
      "group": "surface",
      "label": "흰 면",
      "usage": "패널, 시트, 대화상자, 탭 바, 선택 전 보기 칸의 배경이다."
    },
    "well": {
      "group": "surface",
      "label": "홈",
      "usage": "패널 안에서 행을 감싸는 옅은 홈이다. WellRow 배경과 시트 닫기 버튼 배경이다."
    },
    "card": {
      "group": "surface",
      "label": "카드",
      "usage": "주색을 옅게 깐 카드 배경이다. Card의 기본 색이고 메뉴 목록 배경이다."
    },
    "cardStrong": {
      "group": "surface",
      "label": "진한 카드",
      "usage": "card보다 한 단계 진한 틴트다. 온보딩에서 선택된 타일과 다크 모드 토스트의 배경이다."
    },
    "selected": {
      "group": "surface",
      "label": "선택됨",
      "usage": "선택된 항목의 배경이다. ChoiceCard, WellRow, FilterPill이 선택되면 이 색을 깐다."
    },
    "field": {
      "group": "surface",
      "label": "입력 칸",
      "usage": "Field의 기본 배경이다. 포커스를 받으면 surface로 바뀐다."
    },
    "muted": {
      "group": "surface",
      "label": "보조 면",
      "usage": "누르지 않는 보조 면이다. 표 머리글, 작은 태그, 이전·다음 둥근 버튼, 모임 커버 자리의 배경이다."
    },
    "pressed": {
      "group": "surface",
      "label": "누름",
      "usage": "행을 누르는 동안의 배경이다. SettingsRow와 메뉴 행이 쓴다."
    },
    "photo": {
      "group": "surface",
      "label": "사진 자리",
      "usage": "사진을 불러오기 전이나 사진이 없을 때 깔리는 색이다. Avatar, SourceCrop, ImageBlock이 쓴다."
    },
    "skeleton": {
      "group": "surface",
      "label": "로딩 막대",
      "usage": "Skeleton의 막대 색이다."
    },
    "track": {
      "group": "surface",
      "label": "빈 막대",
      "usage": "진행 막대, 슬라이더 레일, 차트 막대의 비어 있는 부분이다."
    },
    "line": {
      "group": "line",
      "label": "기본 선",
      "usage": "구분선과 기본 테두리다. 두께는 1px(또는 헤어라인)이다."
    },
    "lineStrong": {
      "group": "line",
      "label": "진한 선",
      "usage": "선택 전 체크 원, 라디오 테두리, 시트 손잡이처럼 눈에 띄어야 하는 선이다."
    },
    "cardBorder": {
      "group": "line",
      "label": "카드 테두리",
      "usage": "ChoiceCard 테두리이고, 다크 모드에서는 Panel 테두리다."
    },
    "selectedLine": {
      "group": "line",
      "label": "선택 테두리",
      "usage": "선택된 항목의 옅은 테두리로 정의되어 있다. 앱 코드에서는 아직 읽지 않는다.",
      "unusedInApps": true
    },
    "text": {
      "group": "text",
      "label": "본문",
      "usage": "제목과 본문 글자다. 흰 면 위에서 가장 진한 글자다."
    },
    "textSecondary": {
      "group": "text",
      "label": "보조 글자",
      "usage": "날짜, 설명, 개수처럼 본문 아래에 놓는 보조 글자다."
    },
    "textTertiary": {
      "group": "text",
      "label": "약한 글자",
      "usage": "입력 칸 안내 문구와 쓸 수 없는 상태의 글자다. 읽어야 하는 내용에는 쓰지 않는다."
    },
    "tabInactive": {
      "group": "text",
      "label": "선택 안 된 탭",
      "usage": "하단 탭 바에서 선택되지 않은 아이콘과 이름이다."
    },
    "slate": {
      "group": "text",
      "label": "슬레이트",
      "usage": "선택되지 않은 달력 날짜 숫자, 노트 카드의 종류 이름, 선택되지 않은 알림 선택지의 글자다."
    },
    "navy": {
      "group": "text",
      "label": "네이비",
      "usage": "워드마크 글자와 PillTabs의 선택된 칸 색이다. 다크 모드의 PillTabs는 navy 대신 primary를 쓴다."
    },
    "textSecondaryInk": {
      "group": "text",
      "label": "보조 글자(웹)",
      "usage": "웹에서 작은 보조 글자를 쓸 때 쓴다. textSecondary를 흰 면에서 4.5:1이 되도록 진하게 만든 값이다.",
      "webExtension": true
    },
    "primary": {
      "group": "brand",
      "label": "주색",
      "usage": "주 행동, 링크, 선택 표시, 진행 막대의 색이다. 앱 코드에서 가장 많이 쓰이는 색이다."
    },
    "primaryStrong": {
      "group": "brand",
      "label": "진한 주색",
      "usage": "색이 채워진 둥근 표식에 쓴다. 오늘 날짜 원과 중앙 버튼 그림자가 이 색이다."
    },
    "primarySoft": {
      "group": "brand",
      "label": "옅은 주색",
      "usage": "선택 타일, D-Day 칩, 부드러운 버튼, 안내(Notice) 배경이다."
    },
    "primaryLine": {
      "group": "brand",
      "label": "주색 테두리",
      "usage": "SecondaryButton의 테두리와 켜진 FilterPill의 테두리다."
    },
    "gradientFrom": {
      "group": "brand",
      "label": "그라데이션 시작",
      "usage": "주 버튼, 중앙 버튼, 진행 막대, 아바타 바탕의 그라데이션 시작 색(왼쪽 또는 위)이다."
    },
    "gradientTo": {
      "group": "brand",
      "label": "그라데이션 끝",
      "usage": "그라데이션의 끝 색(오른쪽 또는 아래)이다."
    },
    "onPrimary": {
      "group": "brand",
      "label": "primary 위 글자(웹)",
      "usage": "primary로 채운 면 위에 놓는 글자와 아이콘 색이다. 앱 코드에서는 white를 쓴다.",
      "webExtension": true
    },
    "onPrimaryStrong": {
      "group": "brand",
      "label": "primaryStrong·그라데이션 위 글자(웹)",
      "usage": "primaryStrong 또는 gradient로 채운 면 위에 놓는 글자와 아이콘 색이다. 앱 코드에서는 white를 쓴다.",
      "webExtension": true
    },
    "primaryInk": {
      "group": "brand",
      "label": "주색 글자(웹)",
      "usage": "웹에서 작은 글자를 주색으로 쓸 때 쓴다. primary를 흰 면에서 4.5:1이 되도록 진하게 만든 값이다.",
      "webExtension": true
    },
    "segment": {
      "group": "segment",
      "label": "구분 컨트롤 선택",
      "usage": "촬영 검토 화면에서 선택된 필터 칩의 배경이다."
    },
    "segmentTrack": {
      "group": "segment",
      "label": "구분 컨트롤 바탕",
      "usage": "중립 대화상자 버튼, 시간 선택 띠, AiMark 칩의 배경이다."
    },
    "tabTrack": {
      "group": "segment",
      "label": "탭 바탕",
      "usage": "PillTabs의 바탕 띠다."
    },
    "success": {
      "group": "status",
      "label": "성공",
      "usage": "정답, 완료, 성공 토스트의 아이콘 색이다."
    },
    "successSoft": {
      "group": "status",
      "label": "성공 면",
      "usage": "정답 보기와 FeedbackCard(correct)의 배경이다."
    },
    "successText": {
      "group": "status",
      "label": "성공 글자",
      "usage": "successSoft 위에 놓는 글자 색이다."
    },
    "mint": {
      "group": "status",
      "label": "민트",
      "usage": "학습 목표선, 학습 완료 표시, 차트의 세 번째 선 색, 올라간 수치의 배경이다."
    },
    "mintText": {
      "group": "status",
      "label": "민트 글자",
      "usage": "이번 주 달성 목표 수치와 올라간 수치의 글자와 아이콘이다."
    },
    "amber": {
      "group": "status",
      "label": "주의",
      "usage": "복습 추천 버튼(AmberButton)과 경고 표시 색이다."
    },
    "amberSoft": {
      "group": "status",
      "label": "주의 면",
      "usage": "Notice(warn)와 복습 추천 카드의 배경이다."
    },
    "amberText": {
      "group": "status",
      "label": "주의 글자",
      "usage": "amberSoft 위에 놓는 글자 색이다."
    },
    "orange": {
      "group": "status",
      "label": "주황",
      "usage": "연속 학습일을 나타내는 불꽃 아이콘의 색이다."
    },
    "danger": {
      "group": "status",
      "label": "오류",
      "usage": "오류 글자, 오답 표시, 삭제 버튼, D-Day 임박 점의 색이다."
    },
    "dangerSoft": {
      "group": "status",
      "label": "오류 면",
      "usage": "Notice(error), 오답 보기, 삭제 행 아이콘 타일의 배경이다."
    },
    "dangerLine": {
      "group": "status",
      "label": "오류 테두리",
      "usage": "오류 면 위의 옅은 테두리다. 문제 번호 격자와 단원 카드에 쓴다."
    },
    "onDanger": {
      "group": "status",
      "label": "오류 위 글자(웹)",
      "usage": "danger 위에 놓는 글자 색이다. 앱 코드에서는 white를 쓴다.",
      "webExtension": true
    },
    "scrim": {
      "group": "overlay",
      "label": "어둠막",
      "usage": "대화상자와 시트 뒤를 어둡게 덮는 반투명 색이다."
    },
    "veil": {
      "group": "overlay",
      "label": "베일",
      "usage": "촬영 검토 화면에서 사진 위를 흐리게 덮는 반투명 흰색이다."
    },
    "white": {
      "group": "overlay",
      "label": "흰색",
      "usage": "색이 채워진 면 위의 글자와 아이콘이다. 모든 모드와 서비스에서 #FFFFFF다."
    },
    "black": {
      "group": "overlay",
      "label": "검정",
      "usage": "정의되어 있지만 앱 코드에서는 아직 쓰지 않는다.",
      "unusedInApps": true
    }
  },
  "services": {
    "mordy": {
      "name": "Mordy",
      "summary": "사진으로 찍은 학습 자료를 문제로 바꿔 복습하게 해 주는 앱",
      "source": {
        "repo": "Mordy",
        "file": "apps/mobile/src/ui/tokens.ts",
        "commit": "60df633",
        "format": "React Native 토큰(tokens.ts)"
      },
      "colors": {
        "light": {
          "bg": "#FCFCFD",
          "canvas": "#F4F6FA",
          "surface": "#FFFFFF",
          "well": "#F6F8FB",
          "card": "#F3F7FE",
          "cardStrong": "#EAF2FD",
          "selected": "#F4F8FF",
          "field": "#F4F7FB",
          "muted": "#F2F5F9",
          "pressed": "#F5F8FC",
          "photo": "#F1F3F7",
          "skeleton": "#EAF0F8",
          "track": "#E6ECF5",
          "line": "#E8EDF5",
          "lineStrong": "#D9E1EC",
          "cardBorder": "#EDF1F6",
          "selectedLine": "#DCE8FB",
          "text": "#141B2D",
          "textSecondary": "#737B8F",
          "textTertiary": "#9AA3B5",
          "tabInactive": "#6F7486",
          "slate": "#4B5A74",
          "navy": "#0B1F56",
          "textSecondaryInk": "#6A7184",
          "primary": "#1F7BFF",
          "primaryStrong": "#0C70FC",
          "primarySoft": "#E8F1FD",
          "primaryLine": "#9CC3FF",
          "gradientFrom": "#3A93FF",
          "gradientTo": "#0A70FF",
          "onPrimary": "#FFFFFF",
          "onPrimaryStrong": "#FFFFFF",
          "primaryInk": "#1A69D9",
          "segment": "#4B5A74",
          "segmentTrack": "#F1F4F8",
          "tabTrack": "#E9EDF3",
          "success": "#0E9057",
          "successSoft": "#ECF8F2",
          "successText": "#1F724D",
          "mint": "#2DC48D",
          "mintText": "#17A673",
          "amber": "#F8A434",
          "amberSoft": "#FCF6E9",
          "amberText": "#8A5A12",
          "orange": "#F59A3C",
          "danger": "#E5213A",
          "dangerSoft": "#FFEFF2",
          "dangerLine": "#F6C3CB",
          "onDanger": "#FFFFFF",
          "scrim": "rgba(12, 18, 34, 0.45)",
          "veil": "rgba(255, 255, 255, 0.55)",
          "white": "#FFFFFF",
          "black": "#000000"
        },
        "dark": {
          "bg": "#0B0F17",
          "canvas": "#0B0F17",
          "surface": "#141A25",
          "well": "#1A2130",
          "card": "#18202E",
          "cardStrong": "#1D2839",
          "selected": "#15233C",
          "field": "#1A2130",
          "muted": "#1A2130",
          "pressed": "#1B2230",
          "photo": "#10151F",
          "skeleton": "#1C2433",
          "track": "#253043",
          "line": "#232C3C",
          "lineStrong": "#2F394C",
          "cardBorder": "#212A3A",
          "selectedLine": "#284B82",
          "text": "#ECF0F7",
          "textSecondary": "#9AA4B8",
          "textTertiary": "#667085",
          "tabInactive": "#7C8699",
          "slate": "#AAB5C8",
          "navy": "#DCE7FF",
          "textSecondaryInk": "#9AA4B8",
          "primary": "#3D8BFF",
          "primaryStrong": "#2F80FF",
          "primarySoft": "#172A4A",
          "primaryLine": "#35609E",
          "gradientFrom": "#3A93FF",
          "gradientTo": "#0A70FF",
          "onPrimary": "#FFFFFF",
          "onPrimaryStrong": "#FFFFFF",
          "primaryInk": "#4590FF",
          "segment": "#3A4A66",
          "segmentTrack": "#1A2130",
          "tabTrack": "#1A2130",
          "success": "#2FBF7E",
          "successSoft": "#11281E",
          "successText": "#7EDDB0",
          "mint": "#33C891",
          "mintText": "#4FD6A2",
          "amber": "#F8A434",
          "amberSoft": "#2A2215",
          "amberText": "#F5C576",
          "orange": "#F59A3C",
          "danger": "#FF5A6E",
          "dangerSoft": "#321820",
          "dangerLine": "#6A2A36",
          "onDanger": "#FFFFFF",
          "scrim": "rgba(0, 0, 0, 0.62)",
          "veil": "rgba(11, 15, 23, 0.55)",
          "white": "#FFFFFF",
          "black": "#000000"
        }
      },
      "colorOrigin": {
        "light": {
          "bg": {
            "kind": "tokens",
            "note": "color.bg"
          },
          "canvas": {
            "kind": "tokens",
            "note": "color.canvas"
          },
          "surface": {
            "kind": "tokens",
            "note": "color.surface"
          },
          "well": {
            "kind": "tokens",
            "note": "color.well"
          },
          "card": {
            "kind": "tokens",
            "note": "color.card"
          },
          "cardStrong": {
            "kind": "tokens",
            "note": "color.cardStrong"
          },
          "selected": {
            "kind": "tokens",
            "note": "color.selected"
          },
          "field": {
            "kind": "tokens",
            "note": "color.field"
          },
          "muted": {
            "kind": "tokens",
            "note": "color.muted"
          },
          "pressed": {
            "kind": "tokens",
            "note": "color.pressed"
          },
          "photo": {
            "kind": "tokens",
            "note": "color.photo"
          },
          "skeleton": {
            "kind": "tokens",
            "note": "color.skeleton"
          },
          "track": {
            "kind": "tokens",
            "note": "color.track"
          },
          "line": {
            "kind": "tokens",
            "note": "color.line"
          },
          "lineStrong": {
            "kind": "tokens",
            "note": "color.lineStrong"
          },
          "cardBorder": {
            "kind": "tokens",
            "note": "color.cardBorder"
          },
          "selectedLine": {
            "kind": "tokens",
            "note": "color.selectedLine"
          },
          "text": {
            "kind": "tokens",
            "note": "color.text"
          },
          "textSecondary": {
            "kind": "tokens",
            "note": "color.textSecondary"
          },
          "textTertiary": {
            "kind": "tokens",
            "note": "color.textTertiary"
          },
          "tabInactive": {
            "kind": "tokens",
            "note": "color.tabInactive"
          },
          "slate": {
            "kind": "tokens",
            "note": "color.slate"
          },
          "navy": {
            "kind": "tokens",
            "note": "color.navy"
          },
          "textSecondaryInk": {
            "kind": "web",
            "note": "textSecondary를 surface·bg·canvas·well·card 위에서 4.5:1이 되도록 조정한 값"
          },
          "primary": {
            "kind": "tokens",
            "note": "color.primary"
          },
          "primaryStrong": {
            "kind": "tokens",
            "note": "color.primaryStrong"
          },
          "primarySoft": {
            "kind": "tokens",
            "note": "color.primarySoft"
          },
          "primaryLine": {
            "kind": "tokens",
            "note": "color.primaryLine"
          },
          "gradientFrom": {
            "kind": "tokens",
            "note": "color.gradient"
          },
          "gradientTo": {
            "kind": "tokens",
            "note": "color.gradient"
          },
          "onPrimary": {
            "kind": "web",
            "note": "앱 코드는 white를 쓴다"
          },
          "onPrimaryStrong": {
            "kind": "web",
            "note": "앱 코드는 white를 쓴다"
          },
          "primaryInk": {
            "kind": "web",
            "note": "primary를 surface·primarySoft·canvas·card·selected 위에서 4.5:1이 되도록 조정한 값"
          },
          "segment": {
            "kind": "tokens",
            "note": "color.segment"
          },
          "segmentTrack": {
            "kind": "tokens",
            "note": "color.segmentTrack"
          },
          "tabTrack": {
            "kind": "tokens",
            "note": "color.tabTrack"
          },
          "success": {
            "kind": "tokens",
            "note": "color.success"
          },
          "successSoft": {
            "kind": "tokens",
            "note": "color.successSoft"
          },
          "successText": {
            "kind": "tokens",
            "note": "color.successText"
          },
          "mint": {
            "kind": "tokens",
            "note": "color.mint"
          },
          "mintText": {
            "kind": "tokens",
            "note": "color.mintText"
          },
          "amber": {
            "kind": "tokens",
            "note": "color.amber"
          },
          "amberSoft": {
            "kind": "tokens",
            "note": "color.amberSoft"
          },
          "amberText": {
            "kind": "tokens",
            "note": "color.amberText"
          },
          "orange": {
            "kind": "tokens",
            "note": "color.orange"
          },
          "danger": {
            "kind": "tokens",
            "note": "color.danger"
          },
          "dangerSoft": {
            "kind": "tokens",
            "note": "color.dangerSoft"
          },
          "dangerLine": {
            "kind": "tokens",
            "note": "color.dangerLine"
          },
          "onDanger": {
            "kind": "web",
            "note": "앱 코드는 white를 쓴다"
          },
          "scrim": {
            "kind": "tokens",
            "note": "color.scrim"
          },
          "veil": {
            "kind": "tokens",
            "note": "color.veil"
          },
          "white": {
            "kind": "tokens",
            "note": "color.white"
          },
          "black": {
            "kind": "tokens",
            "note": "color.black"
          }
        },
        "dark": {
          "bg": {
            "kind": "tokens",
            "note": "color.bg"
          },
          "canvas": {
            "kind": "tokens",
            "note": "color.canvas"
          },
          "surface": {
            "kind": "tokens",
            "note": "color.surface"
          },
          "well": {
            "kind": "tokens",
            "note": "color.well"
          },
          "card": {
            "kind": "tokens",
            "note": "color.card"
          },
          "cardStrong": {
            "kind": "tokens",
            "note": "color.cardStrong"
          },
          "selected": {
            "kind": "tokens",
            "note": "color.selected"
          },
          "field": {
            "kind": "tokens",
            "note": "color.field"
          },
          "muted": {
            "kind": "tokens",
            "note": "color.muted"
          },
          "pressed": {
            "kind": "tokens",
            "note": "color.pressed"
          },
          "photo": {
            "kind": "tokens",
            "note": "color.photo"
          },
          "skeleton": {
            "kind": "tokens",
            "note": "color.skeleton"
          },
          "track": {
            "kind": "tokens",
            "note": "color.track"
          },
          "line": {
            "kind": "tokens",
            "note": "color.line"
          },
          "lineStrong": {
            "kind": "tokens",
            "note": "color.lineStrong"
          },
          "cardBorder": {
            "kind": "tokens",
            "note": "color.cardBorder"
          },
          "selectedLine": {
            "kind": "tokens",
            "note": "color.selectedLine"
          },
          "text": {
            "kind": "tokens",
            "note": "color.text"
          },
          "textSecondary": {
            "kind": "tokens",
            "note": "color.textSecondary"
          },
          "textTertiary": {
            "kind": "tokens",
            "note": "color.textTertiary"
          },
          "tabInactive": {
            "kind": "tokens",
            "note": "color.tabInactive"
          },
          "slate": {
            "kind": "tokens",
            "note": "color.slate"
          },
          "navy": {
            "kind": "tokens",
            "note": "color.navy"
          },
          "textSecondaryInk": {
            "kind": "web",
            "note": "textSecondary를 surface·bg·canvas·well·card 위에서 4.5:1이 되도록 조정한 값"
          },
          "primary": {
            "kind": "tokens",
            "note": "color.primary"
          },
          "primaryStrong": {
            "kind": "tokens",
            "note": "color.primaryStrong"
          },
          "primarySoft": {
            "kind": "tokens",
            "note": "color.primarySoft"
          },
          "primaryLine": {
            "kind": "tokens",
            "note": "color.primaryLine"
          },
          "gradientFrom": {
            "kind": "tokens",
            "note": "color.gradient"
          },
          "gradientTo": {
            "kind": "tokens",
            "note": "color.gradient"
          },
          "onPrimary": {
            "kind": "web",
            "note": "앱 코드는 white를 쓴다"
          },
          "onPrimaryStrong": {
            "kind": "web",
            "note": "앱 코드는 white를 쓴다"
          },
          "primaryInk": {
            "kind": "web",
            "note": "primary를 surface·primarySoft·canvas·card·selected 위에서 4.5:1이 되도록 조정한 값"
          },
          "segment": {
            "kind": "tokens",
            "note": "color.segment"
          },
          "segmentTrack": {
            "kind": "tokens",
            "note": "color.segmentTrack"
          },
          "tabTrack": {
            "kind": "tokens",
            "note": "color.tabTrack"
          },
          "success": {
            "kind": "tokens",
            "note": "color.success"
          },
          "successSoft": {
            "kind": "tokens",
            "note": "color.successSoft"
          },
          "successText": {
            "kind": "tokens",
            "note": "color.successText"
          },
          "mint": {
            "kind": "tokens",
            "note": "color.mint"
          },
          "mintText": {
            "kind": "tokens",
            "note": "color.mintText"
          },
          "amber": {
            "kind": "tokens",
            "note": "color.amber"
          },
          "amberSoft": {
            "kind": "tokens",
            "note": "color.amberSoft"
          },
          "amberText": {
            "kind": "tokens",
            "note": "color.amberText"
          },
          "orange": {
            "kind": "tokens",
            "note": "color.orange"
          },
          "danger": {
            "kind": "tokens",
            "note": "color.danger"
          },
          "dangerSoft": {
            "kind": "tokens",
            "note": "color.dangerSoft"
          },
          "dangerLine": {
            "kind": "tokens",
            "note": "color.dangerLine"
          },
          "onDanger": {
            "kind": "web",
            "note": "앱 코드는 white를 쓴다"
          },
          "scrim": {
            "kind": "tokens",
            "note": "color.scrim"
          },
          "veil": {
            "kind": "tokens",
            "note": "color.veil"
          },
          "white": {
            "kind": "tokens",
            "note": "color.white"
          },
          "black": {
            "kind": "tokens",
            "note": "color.black"
          }
        }
      }
    },
    "morit": {
      "name": "Morit",
      "summary": "메모, 파일, AI, 플러그인을 한곳에 모으는 개인 작업 앱",
      "source": {
        "repo": "Moring_Morit",
        "file": "lib/core/morit_theme.dart",
        "commit": "e50d1ee",
        "format": "Flutter Material 3 ColorScheme"
      },
      "colors": {
        "light": {
          "bg": "#F7F8FA",
          "canvas": "#F7F8FA",
          "surface": "#FBFDFC",
          "well": "#F2F4F6",
          "card": "#F3FBF8",
          "cardStrong": "#EAF8F4",
          "selected": "#F3FBF8",
          "field": "#F2F4F6",
          "muted": "#F0F3F2",
          "pressed": "#F0F3F2",
          "photo": "#F2F4F6",
          "skeleton": "#E8EAED",
          "track": "#E8EAED",
          "line": "#EEF1F0",
          "lineStrong": "#D8E1DE",
          "cardBorder": "#E2E9E7",
          "selectedLine": "#D5EBE6",
          "text": "#17211F",
          "textSecondary": "#65717D",
          "textTertiary": "#8B95A1",
          "tabInactive": "#65717D",
          "slate": "#4E5A57",
          "navy": "#173D34",
          "textSecondaryInk": "#65717D",
          "primary": "#00856A",
          "primaryStrong": "#00856A",
          "primarySoft": "#EAF8F4",
          "primaryLine": "#88D6BA",
          "gradientFrom": "#00856A",
          "gradientTo": "#00856A",
          "onPrimary": "#FFFFFF",
          "onPrimaryStrong": "#FFFFFF",
          "primaryInk": "#007E65",
          "segment": "#4E5A57",
          "segmentTrack": "#F2F4F6",
          "tabTrack": "#E8EAED",
          "success": "#00856A",
          "successSoft": "#EAF8F4",
          "successText": "#173D34",
          "mint": "#00A884",
          "mintText": "#00856A",
          "amber": "#E3A008",
          "amberSoft": "#FFF8D6",
          "amberText": "#6D5429",
          "orange": "#E3A008",
          "danger": "#C43C42",
          "dangerSoft": "#FFF1F1",
          "dangerLine": "#ECC4C6",
          "onDanger": "#FFFFFF",
          "scrim": "rgba(12, 18, 34, 0.45)",
          "veil": "rgba(255, 255, 255, 0.55)",
          "white": "#FFFFFF",
          "black": "#000000"
        },
        "dark": {
          "bg": "#1C2327",
          "canvas": "#1C2327",
          "surface": "#242C30",
          "well": "#2C353A",
          "card": "#283837",
          "cardStrong": "#2C433D",
          "selected": "#2A3D3A",
          "field": "#2C353A",
          "muted": "#2C353A",
          "pressed": "#343F44",
          "photo": "#191F23",
          "skeleton": "#343F44",
          "track": "#3D494F",
          "line": "#3A464A",
          "lineStrong": "#5E6D6D",
          "cardBorder": "#3A464A",
          "selectedLine": "#42625C",
          "text": "#DCE3E4",
          "textSecondary": "#ACBABD",
          "textTertiary": "#82948F",
          "tabInactive": "#ACBABD",
          "slate": "#A5BEC4",
          "navy": "#BAE7D6",
          "textSecondaryInk": "#ACBABD",
          "primary": "#79C7AF",
          "primaryStrong": "#326C59",
          "primarySoft": "#2F4D43",
          "primaryLine": "#286B55",
          "gradientFrom": "#326C59",
          "gradientTo": "#326C59",
          "onPrimary": "#132F25",
          "onPrimaryStrong": "#EDF4EF",
          "primaryInk": "#79C7AF",
          "segment": "#30434C",
          "segmentTrack": "#2C353A",
          "tabTrack": "#2C353A",
          "success": "#79C7AF",
          "successSoft": "#2F4D43",
          "successText": "#BAE7D6",
          "mint": "#79C7AF",
          "mintText": "#79C7AF",
          "amber": "#D5BD8E",
          "amberSoft": "#4B4231",
          "amberText": "#E9D5AC",
          "orange": "#D5BD8E",
          "danger": "#EBA6A4",
          "dangerSoft": "#513638",
          "dangerLine": "#645153",
          "onDanger": "#441C1C",
          "scrim": "rgba(0, 0, 0, 0.62)",
          "veil": "rgba(11, 15, 23, 0.55)",
          "white": "#FFFFFF",
          "black": "#000000"
        }
      },
      "colorOrigin": {
        "light": {
          "bg": {
            "kind": "role",
            "note": "colorScheme.surface"
          },
          "canvas": {
            "kind": "role",
            "note": "colorScheme.surface"
          },
          "surface": {
            "kind": "role",
            "note": "colorScheme.surfaceContainerLow (cardTheme.color)"
          },
          "well": {
            "kind": "role",
            "note": "colorScheme.surfaceContainer"
          },
          "card": {
            "kind": "derived",
            "note": "primaryContainer 50% + surfaceContainerLow 50%"
          },
          "cardStrong": {
            "kind": "role",
            "note": "colorScheme.primaryContainer"
          },
          "selected": {
            "kind": "derived",
            "note": "primaryContainer 50% + surfaceContainerLow 50%"
          },
          "field": {
            "kind": "role",
            "note": "inputDecorationTheme.fillColor"
          },
          "muted": {
            "kind": "role",
            "note": "colorScheme.surfaceContainerHigh"
          },
          "pressed": {
            "kind": "role",
            "note": "colorScheme.surfaceContainerHigh"
          },
          "photo": {
            "kind": "role",
            "note": "colorScheme.surfaceContainer"
          },
          "skeleton": {
            "kind": "role",
            "note": "colorScheme.surfaceContainerHighest"
          },
          "track": {
            "kind": "role",
            "note": "colorScheme.surfaceContainerHighest"
          },
          "line": {
            "kind": "role",
            "note": "dividerTheme.color"
          },
          "lineStrong": {
            "kind": "role",
            "note": "outlinedButtonTheme 테두리색"
          },
          "cardBorder": {
            "kind": "literal",
            "note": "_lightCardBorder"
          },
          "selectedLine": {
            "kind": "derived",
            "note": "primary 15% + surfaceContainerLow 85%"
          },
          "text": {
            "kind": "role",
            "note": "colorScheme.onSurface"
          },
          "textSecondary": {
            "kind": "role",
            "note": "colorScheme.onSurfaceVariant"
          },
          "textTertiary": {
            "kind": "role",
            "note": "colorScheme.outline"
          },
          "tabInactive": {
            "kind": "role",
            "note": "colorScheme.onSurfaceVariant"
          },
          "slate": {
            "kind": "role",
            "note": "listTileTheme.iconColor"
          },
          "navy": {
            "kind": "role",
            "note": "colorScheme.onPrimaryContainer"
          },
          "textSecondaryInk": {
            "kind": "web",
            "note": "textSecondary를 surface·bg·canvas·well·card 위에서 4.5:1이 되도록 조정한 값"
          },
          "primary": {
            "kind": "role",
            "note": "colorScheme.primary"
          },
          "primaryStrong": {
            "kind": "role",
            "note": "filledButtonTheme 배경색"
          },
          "primarySoft": {
            "kind": "role",
            "note": "colorScheme.primaryContainer"
          },
          "primaryLine": {
            "kind": "role",
            "note": "colorScheme.inversePrimary"
          },
          "gradientFrom": {
            "kind": "role",
            "note": "filledButtonTheme 배경색 (Morit 버튼은 단색이라 시작과 끝이 같다)"
          },
          "gradientTo": {
            "kind": "role",
            "note": "filledButtonTheme 배경색 (Morit 버튼은 단색이라 시작과 끝이 같다)"
          },
          "onPrimary": {
            "kind": "role",
            "note": "colorScheme.onPrimary"
          },
          "onPrimaryStrong": {
            "kind": "role",
            "note": "filledButtonTheme 글자색"
          },
          "primaryInk": {
            "kind": "web",
            "note": "primary를 surface·primarySoft·canvas·card·selected 위에서 4.5:1이 되도록 조정한 값"
          },
          "segment": {
            "kind": "role",
            "note": "listTileTheme.iconColor"
          },
          "segmentTrack": {
            "kind": "role",
            "note": "colorScheme.surfaceContainer"
          },
          "tabTrack": {
            "kind": "role",
            "note": "colorScheme.surfaceContainerHighest"
          },
          "success": {
            "kind": "role",
            "note": "colorScheme.primary"
          },
          "successSoft": {
            "kind": "role",
            "note": "colorScheme.primaryContainer"
          },
          "successText": {
            "kind": "role",
            "note": "colorScheme.onPrimaryContainer"
          },
          "mint": {
            "kind": "literal",
            "note": "seed"
          },
          "mintText": {
            "kind": "role",
            "note": "colorScheme.primary"
          },
          "amber": {
            "kind": "role",
            "note": "colorScheme.tertiary"
          },
          "amberSoft": {
            "kind": "role",
            "note": "colorScheme.tertiaryContainer"
          },
          "amberText": {
            "kind": "role",
            "note": "colorScheme.onTertiaryContainer"
          },
          "orange": {
            "kind": "role",
            "note": "colorScheme.tertiary"
          },
          "danger": {
            "kind": "role",
            "note": "colorScheme.error"
          },
          "dangerSoft": {
            "kind": "role",
            "note": "colorScheme.errorContainer"
          },
          "dangerLine": {
            "kind": "derived",
            "note": "error 30% + surfaceContainerLowest 70%"
          },
          "onDanger": {
            "kind": "role",
            "note": "colorScheme.onError"
          },
          "scrim": {
            "kind": "shared",
            "note": "Morit 코드에 정한 값이 없어 Mordy와 같은 값을 쓴다"
          },
          "veil": {
            "kind": "shared",
            "note": "Morit 코드에 정한 값이 없어 Mordy와 같은 값을 쓴다"
          },
          "white": {
            "kind": "shared",
            "note": "Morit 코드에 정한 값이 없어 Mordy와 같은 값을 쓴다"
          },
          "black": {
            "kind": "shared",
            "note": "Morit 코드에 정한 값이 없어 Mordy와 같은 값을 쓴다"
          }
        },
        "dark": {
          "bg": {
            "kind": "role",
            "note": "colorScheme.surface"
          },
          "canvas": {
            "kind": "role",
            "note": "colorScheme.surface"
          },
          "surface": {
            "kind": "role",
            "note": "colorScheme.surfaceContainerLow (cardTheme.color)"
          },
          "well": {
            "kind": "role",
            "note": "colorScheme.surfaceContainer"
          },
          "card": {
            "kind": "derived",
            "note": "primaryContainer 35% + surfaceContainerLow 65%"
          },
          "cardStrong": {
            "kind": "derived",
            "note": "primaryContainer 70% + surfaceContainerLow 30%"
          },
          "selected": {
            "kind": "derived",
            "note": "primaryContainer 50% + surfaceContainerLow 50%"
          },
          "field": {
            "kind": "role",
            "note": "inputDecorationTheme.fillColor"
          },
          "muted": {
            "kind": "role",
            "note": "colorScheme.surfaceContainer"
          },
          "pressed": {
            "kind": "role",
            "note": "colorScheme.surfaceContainerHigh"
          },
          "photo": {
            "kind": "role",
            "note": "colorScheme.surfaceContainerLowest"
          },
          "skeleton": {
            "kind": "role",
            "note": "colorScheme.surfaceContainerHigh"
          },
          "track": {
            "kind": "role",
            "note": "colorScheme.surfaceContainerHighest"
          },
          "line": {
            "kind": "role",
            "note": "dividerTheme.color"
          },
          "lineStrong": {
            "kind": "derived",
            "note": "outline 50% + outlineVariant 50%"
          },
          "cardBorder": {
            "kind": "role",
            "note": "colorScheme.outlineVariant"
          },
          "selectedLine": {
            "kind": "derived",
            "note": "primary 35% + surfaceContainerLow 65%"
          },
          "text": {
            "kind": "role",
            "note": "colorScheme.onSurface"
          },
          "textSecondary": {
            "kind": "role",
            "note": "colorScheme.onSurfaceVariant"
          },
          "textTertiary": {
            "kind": "role",
            "note": "colorScheme.outline"
          },
          "tabInactive": {
            "kind": "role",
            "note": "colorScheme.onSurfaceVariant"
          },
          "slate": {
            "kind": "role",
            "note": "colorScheme.secondary"
          },
          "navy": {
            "kind": "role",
            "note": "colorScheme.onPrimaryContainer"
          },
          "textSecondaryInk": {
            "kind": "web",
            "note": "textSecondary를 surface·bg·canvas·well·card 위에서 4.5:1이 되도록 조정한 값"
          },
          "primary": {
            "kind": "role",
            "note": "colorScheme.primary"
          },
          "primaryStrong": {
            "kind": "role",
            "note": "filledButtonTheme 배경색"
          },
          "primarySoft": {
            "kind": "role",
            "note": "colorScheme.primaryContainer"
          },
          "primaryLine": {
            "kind": "role",
            "note": "colorScheme.inversePrimary"
          },
          "gradientFrom": {
            "kind": "role",
            "note": "filledButtonTheme 배경색 (Morit 버튼은 단색이라 시작과 끝이 같다)"
          },
          "gradientTo": {
            "kind": "role",
            "note": "filledButtonTheme 배경색 (Morit 버튼은 단색이라 시작과 끝이 같다)"
          },
          "onPrimary": {
            "kind": "role",
            "note": "colorScheme.onPrimary"
          },
          "onPrimaryStrong": {
            "kind": "role",
            "note": "filledButtonTheme 글자색"
          },
          "primaryInk": {
            "kind": "web",
            "note": "primary를 surface·primarySoft·canvas·card·selected 위에서 4.5:1이 되도록 조정한 값"
          },
          "segment": {
            "kind": "role",
            "note": "colorScheme.secondaryContainer"
          },
          "segmentTrack": {
            "kind": "role",
            "note": "colorScheme.surfaceContainer"
          },
          "tabTrack": {
            "kind": "role",
            "note": "colorScheme.surfaceContainer"
          },
          "success": {
            "kind": "role",
            "note": "colorScheme.primary"
          },
          "successSoft": {
            "kind": "role",
            "note": "colorScheme.primaryContainer"
          },
          "successText": {
            "kind": "role",
            "note": "colorScheme.onPrimaryContainer"
          },
          "mint": {
            "kind": "role",
            "note": "colorScheme.primary"
          },
          "mintText": {
            "kind": "role",
            "note": "colorScheme.primary"
          },
          "amber": {
            "kind": "role",
            "note": "colorScheme.tertiary"
          },
          "amberSoft": {
            "kind": "role",
            "note": "colorScheme.tertiaryContainer"
          },
          "amberText": {
            "kind": "role",
            "note": "colorScheme.onTertiaryContainer"
          },
          "orange": {
            "kind": "role",
            "note": "colorScheme.tertiary"
          },
          "danger": {
            "kind": "role",
            "note": "colorScheme.error"
          },
          "dangerSoft": {
            "kind": "role",
            "note": "colorScheme.errorContainer"
          },
          "dangerLine": {
            "kind": "derived",
            "note": "error 35% + surface 65%"
          },
          "onDanger": {
            "kind": "role",
            "note": "colorScheme.onError"
          },
          "scrim": {
            "kind": "shared",
            "note": "Morit 코드에 정한 값이 없어 Mordy와 같은 값을 쓴다"
          },
          "veil": {
            "kind": "shared",
            "note": "Morit 코드에 정한 값이 없어 Mordy와 같은 값을 쓴다"
          },
          "white": {
            "kind": "shared",
            "note": "Morit 코드에 정한 값이 없어 Mordy와 같은 값을 쓴다"
          },
          "black": {
            "kind": "shared",
            "note": "Morit 코드에 정한 값이 없어 Mordy와 같은 값을 쓴다"
          }
        }
      }
    }
  },
  "subjectPalette": {
    "keys": [
      "blue",
      "green",
      "orange",
      "red",
      "purple",
      "teal",
      "yellow",
      "gray"
    ],
    "light": {
      "blue": {
        "glyph": "#3B82F6",
        "soft": "#E9F3FD",
        "fill": [
          "#7DB4FF",
          "#4C8DFB"
        ],
        "bar": "#5B9BFF"
      },
      "green": {
        "glyph": "#18A865",
        "soft": "#E6F7EE",
        "fill": [
          "#6FD7A0",
          "#3DBE7C"
        ],
        "bar": "#7CD0A4"
      },
      "orange": {
        "glyph": "#F08A24",
        "soft": "#FFF3E6",
        "fill": [
          "#FFC07A",
          "#F59A3C"
        ],
        "bar": "#FCC470"
      },
      "red": {
        "glyph": "#F25C5C",
        "soft": "#FFECEF",
        "fill": [
          "#FF8F8F",
          "#F25C5C"
        ],
        "bar": "#FC8C64"
      },
      "purple": {
        "glyph": "#7B61FF",
        "soft": "#F0EBFF",
        "fill": [
          "#B3A2FF",
          "#8B72FF"
        ],
        "bar": "#A897FF"
      },
      "teal": {
        "glyph": "#14A89A",
        "soft": "#E0F8F0",
        "fill": [
          "#6ADBC6",
          "#1FB58A"
        ],
        "bar": "#6ACFB8"
      },
      "yellow": {
        "glyph": "#E0A100",
        "soft": "#FFF7DD",
        "fill": [
          "#FFD96B",
          "#F1B81C"
        ],
        "bar": "#F6D36B"
      },
      "gray": {
        "glyph": "#6B7A99",
        "soft": "#F1F4F8",
        "fill": [
          "#AAB4C7",
          "#8391AA"
        ],
        "bar": "#AAB4C7"
      }
    },
    "dark": {
      "blue": {
        "glyph": "#5B9BFF",
        "soft": "rgba(91, 155, 255, 0.16)",
        "fill": [
          "#7DB4FF",
          "#4C8DFB"
        ],
        "bar": "#5B9BFF"
      },
      "green": {
        "glyph": "#35C483",
        "soft": "rgba(53, 196, 131, 0.16)",
        "fill": [
          "#6FD7A0",
          "#3DBE7C"
        ],
        "bar": "#7CD0A4"
      },
      "orange": {
        "glyph": "#FFA24A",
        "soft": "rgba(255, 162, 74, 0.16)",
        "fill": [
          "#FFC07A",
          "#F59A3C"
        ],
        "bar": "#FCC470"
      },
      "red": {
        "glyph": "#FF7676",
        "soft": "rgba(255, 118, 118, 0.16)",
        "fill": [
          "#FF8F8F",
          "#F25C5C"
        ],
        "bar": "#FC8C64"
      },
      "purple": {
        "glyph": "#9C86FF",
        "soft": "rgba(156, 134, 255, 0.16)",
        "fill": [
          "#B3A2FF",
          "#8B72FF"
        ],
        "bar": "#A897FF"
      },
      "teal": {
        "glyph": "#2EC7B5",
        "soft": "rgba(46, 199, 181, 0.16)",
        "fill": [
          "#6ADBC6",
          "#1FB58A"
        ],
        "bar": "#6ACFB8"
      },
      "yellow": {
        "glyph": "#F2BE2E",
        "soft": "rgba(242, 190, 46, 0.16)",
        "fill": [
          "#FFD96B",
          "#F1B81C"
        ],
        "bar": "#F6D36B"
      },
      "gray": {
        "glyph": "#98A5BD",
        "soft": "rgba(152, 165, 189, 0.16)",
        "fill": [
          "#AAB4C7",
          "#8391AA"
        ],
        "bar": "#AAB4C7"
      }
    },
    "defaults": {
      "math": {
        "color": "blue",
        "name": "수학"
      },
      "english": {
        "color": "green",
        "name": "영어"
      },
      "korean": {
        "color": "gray",
        "name": "국어"
      },
      "history": {
        "color": "red",
        "name": "한국사"
      },
      "science": {
        "color": "teal",
        "name": "과학"
      },
      "social": {
        "color": "orange",
        "name": "사회"
      },
      "other": {
        "color": "gray",
        "name": "기타"
      }
    },
    "note": "과목 색은 데이터를 구분하는 색이라 모든 서비스에서 같다."
  },
  "space": {
    "xxs": 2,
    "xs": 4,
    "sm": 8,
    "md": 12,
    "lg": 16,
    "gutter": 20,
    "xl": 24,
    "xxl": 32,
    "xxxl": 40
  },
  "radius": {
    "sm": 8,
    "md": 12,
    "tile": 14,
    "lg": 16,
    "card": 20,
    "sheet": 24,
    "pill": 999
  },
  "font": {
    "regular": "Pretendard-Regular",
    "medium": "Pretendard-Medium",
    "semibold": "Pretendard-SemiBold",
    "bold": "Pretendard-Bold",
    "extrabold": "Pretendard-ExtraBold",
    "serif": "NotoSerifKR-Regular / NotoSerifKR-Bold (시험지 서체)"
  },
  "type": {
    "display": {
      "fontSize": 26,
      "lineHeight": 34,
      "fontFamily": "Pretendard-ExtraBold",
      "letterSpacing": -0.4
    },
    "title": {
      "fontSize": 21,
      "lineHeight": 29,
      "fontFamily": "Pretendard-Bold",
      "letterSpacing": -0.3
    },
    "headline": {
      "fontSize": 17,
      "lineHeight": 24,
      "fontFamily": "Pretendard-Bold",
      "letterSpacing": -0.2
    },
    "bodyStrong": {
      "fontSize": 15,
      "lineHeight": 22,
      "fontFamily": "Pretendard-SemiBold",
      "letterSpacing": -0.1
    },
    "body": {
      "fontSize": 15,
      "lineHeight": 22,
      "fontFamily": "Pretendard-Medium",
      "letterSpacing": -0.1
    },
    "small": {
      "fontSize": 13,
      "lineHeight": 19,
      "fontFamily": "Pretendard-Medium",
      "letterSpacing": -0.1
    },
    "smallStrong": {
      "fontSize": 13,
      "lineHeight": 19,
      "fontFamily": "Pretendard-SemiBold",
      "letterSpacing": -0.1
    },
    "caption": {
      "fontSize": 11.5,
      "lineHeight": 16,
      "fontFamily": "Pretendard-Medium",
      "letterSpacing": 0
    },
    "button": {
      "fontSize": 15,
      "lineHeight": 20,
      "fontFamily": "Pretendard-Bold",
      "letterSpacing": -0.1
    },
    "metric": {
      "fontSize": 24,
      "lineHeight": 30,
      "fontFamily": "Pretendard-ExtraBold",
      "letterSpacing": -0.4
    },
    "question": {
      "fontSize": 18,
      "lineHeight": 27,
      "fontFamily": "Pretendard-Bold",
      "letterSpacing": -0.2
    }
  },
  "shadow": {
    "spec": {
      "opacity": [
        0,
        0.06,
        0.1,
        0.16
      ],
      "blur": [
        0,
        14,
        18,
        22
      ],
      "elevation": [
        0,
        2,
        4,
        8
      ],
      "tintLight": "#1B2A4E",
      "tintDark": "#000000",
      "darkOpacityFactor": 2,
      "offsetBase": 2,
      "offsetAdd": 2
    },
    "css": {
      "light": {
        "1": "0 4px 14px rgba(27, 42, 78, 0.06)",
        "2": "0 6px 18px rgba(27, 42, 78, 0.1)",
        "3": "0 8px 22px rgba(27, 42, 78, 0.16)"
      },
      "dark": {
        "1": "0 4px 14px rgba(0, 0, 0, 0.12)",
        "2": "0 6px 18px rgba(0, 0, 0, 0.2)",
        "3": "0 8px 22px rgba(0, 0, 0, 0.32)"
      }
    }
  },
  "hitSlop": {
    "top": 10,
    "bottom": 10,
    "left": 10,
    "right": 10
  },
  "motion": {
    "easing": {
      "out": {
        "app": "Easing.out(Easing.cubic)",
        "css": "cubic-bezier(0.33, 1, 0.68, 1)",
        "use": "나타날 때. 처음에 빠르고 끝에서 부드럽게 멈춘다."
      },
      "in": {
        "app": "Easing.in(Easing.quad)",
        "css": "cubic-bezier(0.11, 0, 0.5, 0)",
        "use": "사라질 때. 천천히 시작해 빠르게 사라진다."
      }
    },
    "durations": [
      {
        "name": "시트 열림",
        "duration": "240ms",
        "easing": "out",
        "where": "`Sheet`. 어둠막은 투명해졌다 나타나고 시트는 아래에서 올라온다."
      },
      {
        "name": "시트 닫힘",
        "duration": "180ms",
        "easing": "in",
        "where": "`Sheet`"
      },
      {
        "name": "메뉴 시트 열림",
        "duration": "220ms",
        "easing": "out",
        "where": "`dialog.menu`"
      },
      {
        "name": "중앙 대화상자 열림",
        "duration": "180ms",
        "easing": "out",
        "where": "`dialog.alert`, `dialog.confirm`, `dialog.choose`. 0.96배에서 1배로 커지며 나타난다."
      },
      {
        "name": "대화상자·메뉴 닫힘",
        "duration": "130ms",
        "easing": "in",
        "where": "`dialog` 전체"
      },
      {
        "name": "끌어내리다 놓음",
        "duration": "160ms",
        "easing": "기본",
        "where": "`Sheet`와 메뉴 시트. 닫힐 만큼 끌지 않았을 때 제자리로 돌아온다."
      },
      {
        "name": "토스트 나타남",
        "duration": "스프링(damping 18)",
        "easing": "스프링",
        "where": "`toast`. 아래에서 위로 떠오른다."
      },
      {
        "name": "토스트 사라짐",
        "duration": "160ms",
        "easing": "기본",
        "where": "`toast`"
      },
      {
        "name": "토스트 표시 시간",
        "duration": "2400ms (되돌리기 버튼이 있으면 6000ms)",
        "easing": "—",
        "where": "`toast`"
      },
      {
        "name": "로딩 막대 깜빡임",
        "duration": "700ms씩 반복",
        "easing": "기본",
        "where": "`Skeleton`. 투명도 0.5와 1 사이를 오간다."
      },
      {
        "name": "링 차트 채움",
        "duration": "900ms (150ms 지연)",
        "easing": "out",
        "where": "`AnimatedRing`"
      },
      {
        "name": "숫자 올라감",
        "duration": "900ms (150ms 지연)",
        "easing": "out",
        "where": "`useCountUp`"
      },
      {
        "name": "문제 진행 칸 채움",
        "duration": "380ms",
        "easing": "out",
        "where": "`SegmentedProgress`"
      },
      {
        "name": "밀어서 삭제: 화면 밖으로",
        "duration": "200ms",
        "easing": "기본",
        "where": "`SwipeRow`. 110 이상 밀고 놓았을 때."
      },
      {
        "name": "밀어서 삭제: 제자리로",
        "duration": "스프링(damping 18)",
        "easing": "스프링",
        "where": "`SwipeRow`"
      },
      {
        "name": "이미지 확대 되돌리기",
        "duration": "180~220ms",
        "easing": "기본",
        "where": "`ZoomableImage`. 더블탭 확대 220ms, 되돌리기 180~200ms."
      },
      {
        "name": "화면 모드 바뀜: 덮기",
        "duration": "90ms",
        "easing": "기본",
        "where": "`ThemeFade`. 새 배경색으로 화면을 덮는다."
      },
      {
        "name": "화면 모드 바뀜: 걷기",
        "duration": "300ms (60ms 지연)",
        "easing": "기본",
        "where": "`ThemeFade`. 새 모드가 그려진 뒤 덮개를 걷는다."
      }
    ],
    "press": [
      {
        "component": "PrimaryButton",
        "effect": "0.985배"
      },
      {
        "component": "CircleButton",
        "effect": "0.96배"
      },
      {
        "component": "탭 바 가운데 버튼",
        "effect": "0.95배"
      },
      {
        "component": "SecondaryButton, SmallButton, WellRow, FilterPill",
        "effect": "투명도 0.8"
      },
      {
        "component": "AmberButton, Card",
        "effect": "투명도 0.85"
      },
      {
        "component": "OptionRow, ChoiceCard",
        "effect": "투명도 0.9"
      },
      {
        "component": "TextButton, IconButton",
        "effect": "투명도 0.6"
      },
      {
        "component": "SettingsRow, 메뉴 행",
        "effect": "배경이 `pressed` 색으로 바뀜"
      }
    ],
    "haptics": [
      {
        "name": "haptic.select",
        "feel": "가벼운 선택 진동",
        "where": "탭, 칩, 슬라이더 같은 선택이 바뀔 때"
      },
      {
        "name": "haptic.tap",
        "feel": "가벼운 눌림",
        "where": "PrimaryButton, 대화상자 버튼을 누를 때"
      },
      {
        "name": "haptic.firm",
        "feel": "중간 세기 눌림",
        "where": "길게 눌러 열기·끌기를 시작할 때"
      },
      {
        "name": "haptic.success",
        "feel": "성공 알림 진동",
        "where": "정답을 맞혔을 때, 길게 눌러 확정했을 때"
      },
      {
        "name": "haptic.warning",
        "feel": "경고 알림 진동",
        "where": "문제를 틀렸을 때"
      },
      {
        "name": "haptic.error",
        "feel": "오류 알림 진동",
        "where": "확인 문제를 틀렸을 때, 신고 전송이 실패했을 때"
      }
    ]
  }
}
