{
  "version": "1.0.0-proposal.1",
  "updatedAt": "2026-09-28",
  "status": "design-proposal-not-runtime-approved",
  "source": {
    "figmaFileKey": "XG8Cm5nLScPoNc9NAXX1DD",
    "nodeId": "1:36807",
    "musicNodeId": "1:36928",
    "swiftGrid": "DittoPrototype/Model/GridEngine.swift",
    "swiftRenderer": "DittoPrototype/Views/WidgetContent.swift"
  },
  "delivery": {
    "figma": "blocked-pretendard-font",
    "nativeApp": "unchanged",
    "web": "responsive-specimen-not-production-renderer"
  },
  "grid": {
    "columns": 8,
    "rows": 16,
    "margin": 16,
    "gap": 8,
    "minViewport": 320,
    "maxViewport": 620,
    "maxSpan": [
      6,
      8
    ],
    "testViewports": [
      320,
      375,
      390,
      402,
      430,
      620
    ]
  },
  "typography": {
    "fontFamily": "Pretendard",
    "titleSize": 14,
    "titleLineHeight": 18,
    "artistSize": 11,
    "artistLineHeight": 14,
    "metadataGap": 4,
    "scales": [
      1,
      1.35,
      1.7
    ]
  },
  "music": {
    "default": [
      4,
      2
    ],
    "padding": 12,
    "compactPadding": 8,
    "compactThreshold": 120,
    "gap": 8,
    "minArtwork": 44,
    "maxRowArtwork": 112,
    "maxColumnArtwork": 240,
    "minTextWidth": 72,
    "railRatio": 2,
    "wideRatio": 1.15,
    "squareRatioLow": 0.87,
    "squareRatioHigh": 1.15
  },
  "attribution": {
    "minColumns": 3,
    "minRows": 3,
    "footerHeight": 44,
    "largeFooterHeight": 48,
    "minContentHeight": 96,
    "required": [
      "sourceAvatar",
      "dittoLogo",
      "viewerNicknameWithAttribution"
    ],
    "mustNotHideForFit": true,
    "minFrameWidth": 128
  },
  "states": [
    "ready",
    "empty",
    "loading",
    "error",
    "restricted",
    "editing"
  ],
  "profiles": {
    "badge": {
      "label": "작은 정보",
      "layouts": 2,
      "sizes": [
        [
          2,
          2
        ],
        [
          4,
          2
        ]
      ],
      "priority": "상태·숫자 → 짧은 설명. 상세 행동은 위젯 탭으로 이동."
    },
    "expressive": {
      "label": "감정·GIF",
      "layouts": 2,
      "sizes": [
        [
          2,
          2
        ],
        [
          3,
          3
        ],
        [
          4,
          4
        ]
      ],
      "priority": "이모지·움직임 중심. 작은 크기에서는 부가 문구를 상세로 이동."
    },
    "note": {
      "label": "텍스트·기록",
      "layouts": 3,
      "sizes": [
        [
          4,
          2
        ],
        [
          4,
          3
        ],
        [
          4,
          4
        ],
        [
          3,
          4
        ],
        [
          6,
          2
        ],
        [
          6,
          4
        ],
        [
          6,
          8
        ]
      ],
      "priority": "본문 우선. 크기로 글꼴을 축소하지 않고 줄 수를 변경. 넘치면 말줄임 후 상세 제공."
    },
    "media": {
      "label": "사진·영상",
      "layouts": 5,
      "sizes": [
        [
          3,
          3
        ],
        [
          4,
          3
        ],
        [
          4,
          4
        ],
        [
          3,
          4
        ],
        [
          6,
          2
        ],
        [
          2,
          6
        ],
        [
          4,
          6
        ],
        [
          6,
          4
        ],
        [
          6,
          6
        ],
        [
          6,
          8
        ]
      ],
      "priority": "사진 초점 유지 → 제목 → 제공자. 가로·세로 크롭은 사용자 미리보기 후 확정."
    },
    "music": {
      "label": "음악",
      "layouts": 4,
      "sizes": [
        [
          4,
          2
        ],
        [
          3,
          3
        ],
        [
          4,
          3
        ],
        [
          3,
          4
        ],
        [
          4,
          4
        ],
        [
          6,
          2
        ],
        [
          2,
          6
        ],
        [
          6,
          4
        ],
        [
          4,
          6
        ],
        [
          6,
          6
        ],
        [
          6,
          8
        ]
      ],
      "priority": "곡명 → 앨범·LP → 아티스트. 가로/정사각/세로/좁은 세로 4개 배치, LP·커버는 별도 표현 속성."
    },
    "album": {
      "label": "사진 앨범",
      "layouts": 3,
      "sizes": [
        [
          4,
          3
        ],
        [
          3,
          4
        ],
        [
          4,
          4
        ],
        [
          4,
          6
        ],
        [
          6,
          4
        ],
        [
          6,
          8
        ]
      ],
      "priority": "대표 사진 → 앨범명 → 새 사진 여부. 촬영·초대·승인은 상세에서 수행."
    },
    "list": {
      "label": "목록",
      "layouts": 3,
      "sizes": [
        [
          3,
          4
        ],
        [
          4,
          3
        ],
        [
          4,
          4
        ],
        [
          4,
          6
        ],
        [
          6,
          4
        ],
        [
          6,
          8
        ]
      ],
      "priority": "제목 → 실제로 들어가는 행만 표시 → 더보기. 내부 스크롤은 상세 화면에서만."
    },
    "ask": {
      "label": "질문·참여",
      "layouts": 3,
      "sizes": [
        [
          3,
          4
        ],
        [
          4,
          4
        ],
        [
          4,
          6
        ],
        [
          6,
          4
        ]
      ],
      "priority": "질문/대표 내용 → 참여 진입. 작은 카드 전체가 진입 버튼, 입력은 상세에서."
    },
    "social": {
      "label": "소셜 링크",
      "layouts": 3,
      "sizes": [
        [
          2,
          2
        ],
        [
          4,
          2
        ],
        [
          4,
          4
        ],
        [
          6,
          2
        ]
      ],
      "priority": "서비스 아이콘 → 계정명. 연결 행동은 44pt 이상 터치 영역 확보."
    },
    "voice": {
      "label": "음성",
      "layouts": 2,
      "sizes": [
        [
          2,
          2
        ],
        [
          4,
          2
        ],
        [
          6,
          2
        ]
      ],
      "priority": "음성 여부 → 길이 → 파형. 작은 크기는 상세에서 재생 조작."
    },
    "sealed": {
      "label": "접힌 콘텐츠",
      "layouts": 2,
      "sizes": [
        [
          3,
          3
        ],
        [
          4,
          4
        ]
      ],
      "priority": "공개 여부·열기 안내만 표시. 비공개 본문·미디어는 렌더하지 않음."
    },
    "ditto": {
      "label": "Ditto 전용 액션",
      "layouts": 1,
      "sizes": [
        [
          2,
          2
        ]
      ],
      "priority": "채택된 1:1 로고·그라디언트·젤리 모션 유지. 가로 확장은 미디자인."
    }
  },
  "widgets": [
    {
      "id": "status",
      "name": "상태",
      "profile": "badge",
      "defaultSize": [
        2,
        2
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "text",
      "name": "텍스트",
      "profile": "note",
      "defaultSize": [
        4,
        2
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "image",
      "name": "이미지",
      "profile": "media",
      "defaultSize": [
        4,
        4
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "music",
      "name": "음악",
      "profile": "music",
      "defaultSize": [
        4,
        2
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "video",
      "name": "영상",
      "profile": "media",
      "defaultSize": [
        4,
        3
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "social",
      "name": "소셜",
      "profile": "social",
      "defaultSize": [
        2,
        2
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "gif",
      "name": "GIF",
      "profile": "expressive",
      "defaultSize": [
        2,
        2
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "polaroid",
      "name": "폴라로이드",
      "profile": "album",
      "defaultSize": [
        4,
        4
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "proposal"
    },
    {
      "id": "block",
      "name": "블록",
      "profile": "note",
      "defaultSize": [
        4,
        3
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "ditto",
      "name": "Ditto 액션",
      "profile": "ditto",
      "defaultSize": [
        2,
        2
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "proposal"
    },
    {
      "id": "mood",
      "name": "오늘의 기분",
      "profile": "note",
      "defaultSize": [
        4,
        2
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "guestbook",
      "name": "방명록",
      "profile": "list",
      "defaultSize": [
        4,
        3
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "diary",
      "name": "한줄일기",
      "profile": "note",
      "defaultSize": [
        4,
        2
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "dday",
      "name": "D-day",
      "profile": "badge",
      "defaultSize": [
        2,
        2
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "nowplaying",
      "name": "지금 듣는 노래",
      "profile": "music",
      "defaultSize": [
        4,
        2
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "place",
      "name": "장소",
      "profile": "badge",
      "defaultSize": [
        2,
        2
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "weather",
      "name": "날씨",
      "profile": "badge",
      "defaultSize": [
        2,
        2
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "steps",
      "name": "걸음",
      "profile": "badge",
      "defaultSize": [
        2,
        2
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "ask",
      "name": "ASK",
      "profile": "ask",
      "defaultSize": [
        3,
        4
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "qna",
      "name": "문답",
      "profile": "ask",
      "defaultSize": [
        3,
        4
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "ghost",
      "name": "Ghost",
      "profile": "sealed",
      "defaultSize": [
        3,
        3
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "paparazzi",
      "name": "파파라치",
      "profile": "album",
      "defaultSize": [
        4,
        4
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "voice",
      "name": "음성",
      "profile": "voice",
      "defaultSize": [
        2,
        2
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "bucket",
      "name": "버킷리스트",
      "profile": "list",
      "defaultSize": [
        3,
        4
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "todo",
      "name": "할 일",
      "profile": "list",
      "defaultSize": [
        3,
        4
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "collection",
      "name": "취향 컬렉션",
      "profile": "album",
      "defaultSize": [
        4,
        4
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "playlist",
      "name": "플레이리스트",
      "profile": "list",
      "defaultSize": [
        3,
        4
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "sticker",
      "name": "스티커보드",
      "profile": "album",
      "defaultSize": [
        4,
        4
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "poke",
      "name": "콕 찌르기",
      "profile": "badge",
      "defaultSize": [
        2,
        2
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "secret",
      "name": "비밀 게시글",
      "profile": "sealed",
      "defaultSize": [
        3,
        3
      ],
      "status": "existing-needs-responsive-adapter",
      "defaultSource": "AppState.sizeMap"
    },
    {
      "id": "vintageCamera",
      "name": "빈티지 카메라",
      "profile": "album",
      "defaultSize": [
        4,
        4
      ],
      "status": "planned",
      "defaultSource": "proposal"
    },
    {
      "id": "together",
      "name": "같이 있었어",
      "profile": "album",
      "defaultSize": [
        4,
        4
      ],
      "status": "planned",
      "defaultSource": "proposal"
    }
  ]
}
