/* solutions-data.jsx — 솔루션 마켓 24종 데이터. window.SOLUTIONS / window.SOLUTION_CATS 노출.
   각 항목: id, cat(대분류), title/tagline/overview/features(ko·en·ja 완전), priceFrom(원), durationDays,
   bg, thumb, tags, tech[](정확), demo(엔진명), mock(엔진 데이터). photo는 후처리에서 매핑. */

const SOLUTION_CATS = [
  { id: 'all', ko: '전체', en: 'All', ja: 'すべて' },
  { id: 'match', ko: '중개·매칭', en: 'Brokerage', ja: '仲介・マッチング' },
  { id: 'ai', ko: 'AI·교육', en: 'AI & Edu', ja: 'AI・教育' },
  { id: 'media', ko: '음성·영상', en: 'Voice & Video', ja: '音声・映像' },
  { id: 'infra', ko: '인프라·API', en: 'Infra & API', ja: 'インフラ・API' },
  { id: 'content', ko: '커뮤니티·콘텐츠', en: 'Community', ja: 'コミュニティ' },
  { id: 'commerce', ko: '커머스', en: 'Commerce', ja: 'コマース' },
];

function brokerListing(id, name, nameEn, sub, subEn, tags, match, factors, firstMsg, firstMsgEn) {
  return { id, name, nameEn, sub, subEn, tags, match, factors, photo: null, firstMsg, firstMsgEn };
}

const SOLUTIONS = [
  /* ───── 중개·매칭 12종 (engine: brokerageMatch) ───── */
  {
    id: 'dating', cat: 'match', bg: 'pink', thumb: 'chat', demo: 'brokerageMatch',
    title: '소셜 데이팅·소개팅 매칭', titleEn: 'Social Dating & Match', titleJa: 'ソーシャルデーティング',
    tagline: '언어·거리 기반 일일 추천 매칭 엔진', taglineEn: 'Daily picks by language & distance', taglineJa: '言語・距離ベースの毎日おすすめマッチング',
    priceFrom: 4500000, durationDays: 40, tags: ['Matching', 'Chat', 'WebSocket'],
    tech: ['React Native', 'Expo', 'NestJS', 'PostgreSQL', 'Socket.IO', 'Redis'],
    overview: '본앱 모아이의 데이팅 매칭 알고리즘을 그대로 제품화했습니다. 매일 10장(양방향 언어매칭 3 + 거리기반 7)을 추천하고, 상호 호감 시 채팅방이 자동 생성됩니다. 위치는 프라이버시를 위해 2~8km 랜덤 오프셋이 적용됩니다.',
    overviewEn: 'Productized from the live Moai dating algorithm. 10 daily picks (3 two-way language matches + 7 distance-based); a chat room is auto-created on mutual like. Locations carry a 2-8km privacy offset.',
    overviewJa: '本アプリMoaiのマッチングアルゴリズムをそのまま製品化。毎日10件(双方向言語マッチ3＋距離ベース7)を推薦し、相互いいねでチャットルームが自動生成されます。位置情報はプライバシーのため2〜8kmのランダムオフセットを適用。',
    features: [
      { ko: '일일 추천 10장 (언어 3 + 거리 7)', en: '10 daily picks (3 language + 7 distance)', ja: '毎日10件(言語3＋距離7)' },
      { ko: '양방향 언어교환 매칭 (speak↔learn)', en: 'Two-way language exchange matching', ja: '双方向の言語交換マッチング' },
      { ko: 'Haversine 거리 계산 + 프라이버시 오프셋', en: 'Haversine distance + privacy offset', ja: 'Haversine距離計算＋プライバシーオフセット' },
      { ko: '매칭 성공 시 채팅방 자동 생성', en: 'Auto chat room on match', ja: 'マッチ成立でチャット自動生成' },
    ],
    mock: {
      ctaLabel: '좋아요 보내기', ctaLabelEn: 'Send like', successLabel: '매칭 성공!', successLabelEn: 'It is a match!',
      listings: [
        brokerListing('d1', '유나', 'Yuna', '26 · 서울 · 한국어→영어', '26 · Seoul · KO→EN', ['여행', '카페'], 94,
          [{ label: '언어교환 적합도', labelEn: 'Language fit', pct: 96 }, { label: '거리 근접도', labelEn: 'Proximity', pct: 88 }, { label: '공통 관심사', labelEn: 'Shared interests', pct: 80 }],
          '안녕하세요! 영어 공부 중인데 같이 연습해요', 'Hi! I am learning English, let us practice'),
        brokerListing('d2', '민지', 'Minji', '28 · 분당 · 한국어→일본어', '28 · Bundang · KO→JA', ['음악', '맛집'], 89,
          [{ label: '언어교환 적합도', labelEn: 'Language fit', pct: 92 }, { label: '거리 근접도', labelEn: 'Proximity', pct: 74 }, { label: '공통 관심사', labelEn: 'Shared interests', pct: 84 }],
          '일본어 교환 가능해요?', 'Up for a Japanese exchange?'),
        brokerListing('d3', '소희', 'Sohee', '24 · 강남 · 2.4km', '24 · Gangnam · 2.4km', ['전시', '러닝'], 82,
          [{ label: '거리 근접도', labelEn: 'Proximity', pct: 95 }, { label: '공통 관심사', labelEn: 'Shared interests', pct: 78 }, { label: '활동 시간대', labelEn: 'Active hours', pct: 72 }],
          '근처네요! 주말에 러닝 어때요?', 'You are nearby! Run this weekend?'),
        brokerListing('d4', '지훈', 'Jihoon', '29 · 마포 · 3.1km', '29 · Mapo · 3.1km', ['사진', '여행'], 77,
          [{ label: '거리 근접도', labelEn: 'Proximity', pct: 90 }, { label: '공통 관심사', labelEn: 'Shared interests', pct: 70 }, { label: '활동 시간대', labelEn: 'Active hours', pct: 68 }],
          '사진 찍는 거 좋아하세요?', 'Do you enjoy photography?'),
      ],
    },
  },
  {
    id: 'langex', cat: 'match', bg: 'cyan', thumb: 'dash', demo: 'brokerageMatch',
    title: '언어교환 파트너 매칭', titleEn: 'Language Exchange Match', titleJa: '言語交換マッチング',
    tagline: '모국어↔학습어 양방향 파트너 추천', taglineEn: 'Native↔target two-way partners', taglineJa: '母語↔学習言語の双方向パートナー推薦',
    priceFrom: 3800000, durationDays: 35, tags: ['Matching', 'Lingua', 'i18n'],
    tech: ['NestJS', 'GraphQL', 'MongoDB', 'Socket.IO', 'Redis'],
    overview: '데이팅 매칭의 언어 슬롯 로직을 학습 도메인에 적용했습니다. 30개 언어 단어 API(Lingua)와 연동해 학습 진도가 비슷한 파트너를 우선 추천합니다.',
    overviewEn: 'Applies the dating language-slot logic to learning. Integrates the 30-language word API (Lingua) to prioritize partners at a similar level.',
    overviewJa: 'マッチングの言語スロットロジックを学習領域に適用。30言語の単語API(Lingua)と連携し、学習レベルが近いパートナーを優先推薦します。',
    features: [
      { ko: '모국어↔학습어 양방향 매칭', en: 'Native↔target bidirectional match', ja: '母語↔学習言語の双方向マッチ' },
      { ko: '30개 언어 지원', en: '30 languages', ja: '30言語対応' },
      { ko: '레벨(CEFR) 유사도 가중치', en: 'CEFR-level similarity weighting', ja: 'CEFRレベル類似度の重み付け' },
    ],
    mock: {
      ctaLabel: '파트너 신청', ctaLabelEn: 'Request partner', successLabel: '파트너 연결됨', successLabelEn: 'Partner connected',
      listings: [
        brokerListing('l1', 'Akiko', 'Akiko', '일본어 원어민 · 한국어 A2', 'JA native · KO A2', ['B1', 'JLPT'], 93,
          [{ label: '언어 상호보완', labelEn: 'Language complement', pct: 97 }, { label: '레벨 유사도', labelEn: 'Level match', pct: 85 }, { label: '학습 시간대', labelEn: 'Study hours', pct: 80 }],
          'はじめまして！韓国語勉強中です', 'Nice to meet you! Learning Korean'),
        brokerListing('l2', 'Tom', 'Tom', '영어 원어민 · 한국어 B1', 'EN native · KO B1', ['TOPIK', 'A2'], 88,
          [{ label: '언어 상호보완', labelEn: 'Language complement', pct: 95 }, { label: '레벨 유사도', labelEn: 'Level match', pct: 78 }, { label: '학습 시간대', labelEn: 'Study hours', pct: 76 }],
          'Hi! Want to swap KO/EN practice?', 'Hi! Want to swap KO/EN practice?'),
        brokerListing('l3', 'Marie', 'Marie', '프랑스어 원어민 · 영어 C1', 'FR native · EN C1', ['DELF'], 81,
          [{ label: '언어 상호보완', labelEn: 'Language complement', pct: 88 }, { label: '레벨 유사도', labelEn: 'Level match', pct: 74 }, { label: '학습 시간대', labelEn: 'Study hours', pct: 70 }],
          'Bonjour! On échange?', 'Bonjour! Shall we exchange?'),
      ],
    },
  },
  {
    id: 'freelancer', cat: 'match', bg: 'lavender', thumb: 'dash', demo: 'brokerageMatch',
    title: '프리랜서·아웃소싱 중개', titleEn: 'Freelancer Brokerage', titleJa: 'フリーランス仲介',
    tagline: '기술·예산·평점 기반 전문가 매칭', taglineEn: 'Match experts by skill, budget, rating', taglineJa: 'スキル・予算・評価で専門家マッチング',
    priceFrom: 5200000, durationDays: 45, tags: ['Matching', 'Payment', 'Chat'],
    tech: ['NestJS', 'PostgreSQL', 'Socket.IO', 'TossPay', 'Redis'],
    overview: '매칭 엔진을 용역 도메인에 적용. 의뢰 요건(기술 스택·예산·기간)과 전문가 프로필을 매칭해 적합도 순으로 추천하고, 연결 시 상담 채팅이 시작됩니다.',
    overviewEn: 'Matching engine for services. Scores experts against the brief (skills, budget, timeline) and opens a chat on connect.',
    overviewJa: 'マッチングエンジンを受託領域に適用。依頼要件(技術・予算・期間)と専門家プロフィールをマッチし、適合度順に推薦。連携時に相談チャットが始まります。',
    features: [
      { ko: '기술 스택 적합도 스코어링', en: 'Skill-fit scoring', ja: '技術スタック適合度スコアリング' },
      { ko: '예산·기간 적합도', en: 'Budget & timeline fit', ja: '予算・期間の適合度' },
      { ko: '평점·완료율 가중치', en: 'Rating & completion weighting', ja: '評価・完了率の重み付け' },
    ],
    mock: {
      ctaLabel: '상담 요청', ctaLabelEn: 'Request', successLabel: '전문가 연결됨', successLabelEn: 'Expert connected',
      listings: [
        brokerListing('f1', '김개발', 'Dev Kim', 'RN·NestJS · ₩4,000만 · ★4.9', 'RN·NestJS · ★4.9', ['RN', 'NestJS'], 95,
          [{ label: '기술 적합도', labelEn: 'Skill fit', pct: 98 }, { label: '예산 적합도', labelEn: 'Budget fit', pct: 90 }, { label: '평점·완료율', labelEn: 'Rating', pct: 96 }],
          '포트폴리오 보내드릴게요', 'Sending my portfolio'),
        brokerListing('f2', '이디자인', 'Lee Design', 'UI/UX · ₩2,500만 · ★4.8', 'UI/UX · ★4.8', ['Figma', 'UX'], 87,
          [{ label: '기술 적합도', labelEn: 'Skill fit', pct: 90 }, { label: '예산 적합도', labelEn: 'Budget fit', pct: 85 }, { label: '평점·완료율', labelEn: 'Rating', pct: 92 }],
          '레퍼런스 공유드려요', 'Sharing references'),
        brokerListing('f3', '박풀스택', 'Park FS', 'Next·Spring · ₩5,500만 · ★4.7', 'Next·Spring · ★4.7', ['Next', 'Spring'], 80,
          [{ label: '기술 적합도', labelEn: 'Skill fit', pct: 84 }, { label: '예산 적합도', labelEn: 'Budget fit', pct: 72 }, { label: '평점·완료율', labelEn: 'Rating', pct: 88 }],
          '일정 조율 가능합니다', 'Timeline is flexible'),
      ],
    },
  },
  {
    id: 'jobs', cat: 'match', bg: 'yellow', thumb: 'dash', demo: 'brokerageMatch',
    title: '구인구직 매칭', titleEn: 'Job Matching', titleJa: '求人求職マッチング',
    tagline: '직무·역량 기반 후보-공고 매칭', taglineEn: 'Role & skill based job matching', taglineJa: '職務・スキルベースの求人マッチング',
    priceFrom: 4800000, durationDays: 42, tags: ['Matching', 'ATS', 'Chat'],
    tech: ['NestJS', 'PostgreSQL', 'TypeORM', 'Redis'],
    overview: '공고 요건과 후보 역량을 매칭해 양방향 추천. 지원-열람-제안 단계별 상태와 채팅 상담을 제공합니다.',
    overviewEn: 'Two-way matching of postings and candidate skills with stage tracking and chat.',
    overviewJa: '求人要件と候補者のスキルをマッチし双方向に推薦。応募〜閲覧〜オファーの段階管理とチャット相談を提供します。',
    features: [
      { ko: '직무·역량 매칭 스코어', en: 'Role & skill match score', ja: '職務・スキルのマッチスコア' },
      { ko: '경력·지역 가중치', en: 'Experience & location weighting', ja: '経歴・地域の重み付け' },
      { ko: '지원 단계 상태 추적', en: 'Application stage tracking', ja: '応募ステージの状態管理' },
    ],
    mock: {
      ctaLabel: '면접 제안', ctaLabelEn: 'Offer interview', successLabel: '면접 확정', successLabelEn: 'Interview set',
      listings: [
        brokerListing('j1', '백엔드 개발자', 'Backend Eng', '5년 · 서울 · NestJS', '5y · Seoul · NestJS', ['NestJS', 'AWS'], 92,
          [{ label: '직무 적합도', labelEn: 'Role fit', pct: 95 }, { label: '경력 적합도', labelEn: 'Experience', pct: 88 }, { label: '지역', labelEn: 'Location', pct: 90 }],
          '제안 감사합니다, 검토할게요', 'Thanks, I will review'),
        brokerListing('j2', '프론트 개발자', 'Frontend Eng', '3년 · 판교 · React', '3y · Pangyo · React', ['React', 'TS'], 85,
          [{ label: '직무 적합도', labelEn: 'Role fit', pct: 88 }, { label: '경력 적합도', labelEn: 'Experience', pct: 80 }, { label: '지역', labelEn: 'Location', pct: 86 }],
          '포지션 더 알고 싶어요', 'Tell me more about the role'),
      ],
    },
  },
  {
    id: 'tutormkt', cat: 'match', bg: 'cyan', thumb: 'dash', demo: 'brokerageMatch',
    title: '과외·튜터 마켓플레이스', titleEn: 'Tutor Marketplace', titleJa: '家庭教師マーケット',
    tagline: '과목·일정·화상 기반 튜터 매칭', taglineEn: 'Match tutors by subject & schedule', taglineJa: '科目・スケジュール・ビデオでチューターマッチング',
    priceFrom: 4600000, durationDays: 40, tags: ['Matching', 'WebRTC', 'Payment'],
    tech: ['NestJS', 'WebRTC', 'Socket.IO', 'PostgreSQL', 'TossPay'],
    overview: '과목·레벨·일정으로 튜터를 매칭하고 화상 수업(WebRTC)과 결제를 연동합니다.',
    overviewEn: 'Match tutors by subject, level and schedule with video lessons and payments.',
    overviewJa: '科目・レベル・スケジュールでチューターをマッチし、ビデオ授業(WebRTC)と決済を連携します。',
    features: [
      { ko: '과목·레벨 매칭', en: 'Subject & level matching', ja: '科目・レベルのマッチング' },
      { ko: '일정 가용성 매칭', en: 'Schedule availability', ja: 'スケジュール空き状況マッチ' },
      { ko: '화상 수업 + 결제 연동', en: 'Video lessons + payment', ja: 'ビデオ授業＋決済連携' },
    ],
    mock: {
      ctaLabel: '수업 예약', ctaLabelEn: 'Book lesson', successLabel: '수업 예약됨', successLabelEn: 'Lesson booked',
      listings: [
        brokerListing('t1', '수학 김쌤', 'Math Kim', '고등수학 · ★4.9 · 화·목 저녁', 'HS Math · ★4.9', ['수능', '내신'], 93,
          [{ label: '과목 적합도', labelEn: 'Subject fit', pct: 97 }, { label: '일정 가용성', labelEn: 'Schedule', pct: 88 }, { label: '평점', labelEn: 'Rating', pct: 94 }],
          '레벨 테스트부터 해볼까요?', 'Shall we start with a level test?'),
        brokerListing('t2', '영어 Anna', 'English Anna', '회화 · ★4.8 · 주말', 'Speaking · ★4.8', ['회화', 'OPIc'], 86,
          [{ label: '과목 적합도', labelEn: 'Subject fit', pct: 90 }, { label: '일정 가용성', labelEn: 'Schedule', pct: 82 }, { label: '평점', labelEn: 'Rating', pct: 90 }],
          'Free trial available!', 'Free trial available!'),
      ],
    },
  },
  {
    id: 'realestate', cat: 'match', bg: 'lavender', thumb: 'dash', demo: 'brokerageMatch',
    title: '부동산 중개 매칭', titleEn: 'Real Estate Brokerage', titleJa: '不動産仲介',
    tagline: '조건·지역 기반 매물-수요자 매칭', taglineEn: 'Match listings by area & terms', taglineJa: '条件・地域ベースの物件マッチング',
    priceFrom: 5500000, durationDays: 48, tags: ['Matching', 'Map', 'Chat'],
    tech: ['NestJS', 'PostgreSQL', 'PostGIS', 'Socket.IO'],
    overview: '예산·평형·지역 조건으로 매물을 매칭하고 지도·채팅 상담을 제공합니다.',
    overviewEn: 'Match listings by budget, size and area with map and chat.',
    overviewJa: '予算・広さ・地域の条件で物件をマッチし、地図・チャット相談を提供します。',
    features: [
      { ko: '조건 기반 매물 매칭', en: 'Condition-based listing match', ja: '条件ベースの物件マッチ' },
      { ko: '지역·거리 가중치', en: 'Area & distance weighting', ja: '地域・距離の重み付け' },
      { ko: '중개 상담 채팅', en: 'Brokerage chat', ja: '仲介相談チャット' },
    ],
    mock: {
      ctaLabel: '방문 예약', ctaLabelEn: 'Book viewing', successLabel: '방문 예약됨', successLabelEn: 'Viewing booked',
      listings: [
        brokerListing('r1', '역세권 오피스텔', 'Studio near subway', '1.5룸 · 보증 1000/65 · 강남', 'Gangnam', ['역세권', '신축'], 91,
          [{ label: '조건 적합도', labelEn: 'Condition fit', pct: 94 }, { label: '예산 적합도', labelEn: 'Budget fit', pct: 86 }, { label: '입지', labelEn: 'Location', pct: 92 }],
          '내일 오후 방문 가능합니다', 'Available tomorrow afternoon'),
        brokerListing('r2', '신축 투룸', 'New 2-room', '투룸 · 매매 3.2억 · 마포', 'Mapo', ['투룸', '주차'], 84,
          [{ label: '조건 적합도', labelEn: 'Condition fit', pct: 88 }, { label: '예산 적합도', labelEn: 'Budget fit', pct: 78 }, { label: '입지', labelEn: 'Location', pct: 84 }],
          '주차 2대 가능해요', 'Two parking spots'),
      ],
    },
  },
  {
    id: 'used', cat: 'match', bg: 'pink', thumb: 'delivery', demo: 'brokerageMatch',
    title: '중고거래 마켓플레이스', titleEn: 'Used Goods Market', titleJa: '中古取引マーケット',
    tagline: '동네 기반 중고 직거래 + 채팅', taglineEn: 'Local used trading with chat', taglineJa: '地域ベースの中古直接取引＋チャット',
    priceFrom: 4200000, durationDays: 38, tags: ['Marketplace', 'Chat', 'Geo'],
    tech: ['NestJS', 'PostgreSQL', 'Socket.IO', 'Redis'],
    overview: '동네(거리) 기반으로 중고 매물을 추천하고 채팅으로 직거래를 연결합니다.',
    overviewEn: 'Recommends used items by neighborhood distance and connects buyers via chat.',
    overviewJa: '地域(距離)ベースで中古商品を推薦し、チャットで直接取引をつなぎます。',
    features: [
      { ko: '동네 거리 기반 추천', en: 'Neighborhood distance recommend', ja: '近隣距離ベースの推薦' },
      { ko: '관심 카테고리 매칭', en: 'Interest category match', ja: '関心カテゴリのマッチ' },
      { ko: '직거래 채팅', en: 'Direct-deal chat', ja: '直接取引チャット' },
    ],
    mock: {
      ctaLabel: '채팅하기', ctaLabelEn: 'Chat', successLabel: '거래 채팅 시작', successLabelEn: 'Deal chat started',
      listings: [
        brokerListing('u1', '아이폰 14 Pro', 'iPhone 14 Pro', '85만원 · 1.2km · 상태 A', '850k · 1.2km', ['디지털'], 90,
          [{ label: '거리 근접도', labelEn: 'Proximity', pct: 96 }, { label: '관심 적합도', labelEn: 'Interest fit', pct: 88 }, { label: '가격 적정성', labelEn: 'Price fit', pct: 82 }],
          '직거래 가능하세요?', 'Up for a local deal?'),
        brokerListing('u2', '캠핑 의자 세트', 'Camping chairs', '3만원 · 0.6km', '30k · 0.6km', ['생활'], 83,
          [{ label: '거리 근접도', labelEn: 'Proximity', pct: 98 }, { label: '관심 적합도', labelEn: 'Interest fit', pct: 76 }, { label: '가격 적정성', labelEn: 'Price fit', pct: 80 }],
          '오늘 저녁 거래 어때요?', 'Trade this evening?'),
      ],
    },
  },
  {
    id: 'car', cat: 'match', bg: 'yellow', thumb: 'delivery', demo: 'brokerageMatch',
    title: '자동차 직거래 중개', titleEn: 'Used Car Brokerage', titleJa: '中古車仲介',
    tagline: '차종·예산·연식 기반 매물 매칭', taglineEn: 'Match cars by model, budget, year', taglineJa: '車種・予算・年式ベースのマッチング',
    priceFrom: 5000000, durationDays: 44, tags: ['Matching', 'Inspection', 'Chat'],
    tech: ['NestJS', 'PostgreSQL', 'TypeORM'],
    overview: '차종·예산·주행거리·연식으로 매물을 매칭하고 진단 정보와 채팅 상담을 제공합니다.',
    overviewEn: 'Match cars by model, budget, mileage and year with inspection info and chat.',
    overviewJa: '車種・予算・走行距離・年式で物件をマッチし、診断情報とチャット相談を提供します。',
    features: [
      { ko: '차종·예산 매칭', en: 'Model & budget match', ja: '車種・予算のマッチ' },
      { ko: '연식·주행거리 가중치', en: 'Year & mileage weighting', ja: '年式・走行距離の重み付け' },
      { ko: '진단·이력 표시', en: 'Inspection & history', ja: '診断・履歴の表示' },
    ],
    mock: {
      ctaLabel: '문의하기', ctaLabelEn: 'Inquire', successLabel: '상담 연결됨', successLabelEn: 'Connected',
      listings: [
        brokerListing('c1', '그랜저 IG', 'Grandeur IG', '2021 · 3.2만km · 2,450만', '2021 · 32k km', ['세단'], 89,
          [{ label: '조건 적합도', labelEn: 'Condition fit', pct: 92 }, { label: '예산 적합도', labelEn: 'Budget fit', pct: 84 }, { label: '연식·주행', labelEn: 'Year/Mileage', pct: 88 }],
          '무사고 차량입니다', 'Accident-free'),
        brokerListing('c2', '아반떼 CN7', 'Avante CN7', '2022 · 1.8만km · 1,780만', '2022 · 18k km', ['준중형'], 82,
          [{ label: '조건 적합도', labelEn: 'Condition fit', pct: 86 }, { label: '예산 적합도', labelEn: 'Budget fit', pct: 80 }, { label: '연식·주행', labelEn: 'Year/Mileage', pct: 90 }],
          '시승 가능합니다', 'Test drive available'),
      ],
    },
  },
  {
    id: 'pet', cat: 'match', bg: 'cyan', thumb: 'fit', demo: 'brokerageMatch',
    title: '반려동물 케어·입양 매칭', titleEn: 'Pet Care & Adoption', titleJa: 'ペットケア仲介',
    tagline: '돌봄·입양 수요-공급 매칭', taglineEn: 'Match care & adoption needs', taglineJa: 'お世話・里親の需給マッチング',
    priceFrom: 3600000, durationDays: 34, tags: ['Matching', 'Booking', 'Chat'],
    tech: ['NestJS', 'PostgreSQL', 'Socket.IO'],
    overview: '펫시터·입양 매물을 거리·조건으로 매칭하고 예약·채팅을 연결합니다.',
    overviewEn: 'Match pet sitters and adoptions by distance and conditions, with booking and chat.',
    overviewJa: 'ペットシッター・里親を距離と条件でマッチし、予約・チャットをつなぎます。',
    features: [
      { ko: '돌봄/입양 수요 매칭', en: 'Care/adoption matching', ja: 'お世話/里親の需要マッチ' },
      { ko: '거리·조건 가중치', en: 'Distance & condition weighting', ja: '距離・条件の重み付け' },
      { ko: '예약·후기', en: 'Booking & reviews', ja: '予約・レビュー' },
    ],
    mock: {
      ctaLabel: '예약하기', ctaLabelEn: 'Book', successLabel: '예약 완료', successLabelEn: 'Booked',
      listings: [
        brokerListing('p1', '펫시터 보리네', 'Sitter Bori', '소형견 · ★5.0 · 1.0km', 'Small dog · ★5.0', ['방문', '호텔링'], 92,
          [{ label: '거리 근접도', labelEn: 'Proximity', pct: 96 }, { label: '경험 적합도', labelEn: 'Experience', pct: 90 }, { label: '평점', labelEn: 'Rating', pct: 98 }],
          '강아지 종류가 어떻게 되나요?', 'What breed is your dog?'),
        brokerListing('p2', '입양 - 코숏 3개월', 'Adopt - kitten', '중성화 예정 · 2.3km', 'Neuter soon · 2.3km', ['입양'], 84,
          [{ label: '거리 근접도', labelEn: 'Proximity', pct: 88 }, { label: '조건 적합도', labelEn: 'Condition fit', pct: 82 }, { label: '신뢰도', labelEn: 'Trust', pct: 86 }],
          '책임비 안내드릴게요', 'I will share the adoption terms'),
      ],
    },
  },
  {
    id: 'homeservice', cat: 'match', bg: 'lavender', thumb: 'fit', demo: 'brokerageMatch',
    title: '홈서비스·용역 중개', titleEn: 'Home Service Brokerage', titleJa: '家事代行仲介',
    tagline: '청소·수리·이사 등 용역 매칭', taglineEn: 'Match cleaning, repair, moving pros', taglineJa: '清掃・修理・引越しなどの代行マッチング',
    priceFrom: 4000000, durationDays: 36, tags: ['Matching', 'Payment', 'Chat'],
    tech: ['NestJS', 'PostgreSQL', 'Socket.IO', 'TossPay'],
    overview: '서비스 종류·일정·지역으로 전문가를 매칭하고 결제·채팅을 연결합니다.',
    overviewEn: 'Match service pros by type, schedule and area with payment and chat.',
    overviewJa: 'サービス種類・スケジュール・地域で専門家をマッチし、決済・チャットをつなぎます。',
    features: [
      { ko: '서비스 종류·일정 매칭', en: 'Service type & schedule match', ja: 'サービス種類・日程のマッチ' },
      { ko: '지역·평점 가중치', en: 'Area & rating weighting', ja: '地域・評価の重み付け' },
      { ko: '예약·결제 연동', en: 'Booking & payment', ja: '予約・決済連携' },
    ],
    mock: {
      ctaLabel: '견적 요청', ctaLabelEn: 'Get quote', successLabel: '예약 확정', successLabelEn: 'Booked',
      listings: [
        brokerListing('h1', '청소 전문 박여사', 'Cleaning Pro', '입주청소 · ★4.9 · 당일', 'Move-in · ★4.9', ['청소'], 91,
          [{ label: '서비스 적합도', labelEn: 'Service fit', pct: 95 }, { label: '일정 가용성', labelEn: 'Schedule', pct: 88 }, { label: '평점', labelEn: 'Rating', pct: 94 }],
          '평수 알려주시면 견적 드려요', 'Share the size for a quote'),
        brokerListing('h2', '에어컨 수리 기사', 'AC Repair', '설치·수리 · ★4.8', 'Install·Repair', ['수리'], 83,
          [{ label: '서비스 적합도', labelEn: 'Service fit', pct: 88 }, { label: '일정 가용성', labelEn: 'Schedule', pct: 80 }, { label: '평점', labelEn: 'Rating', pct: 90 }],
          '증상이 어떻게 되나요?', 'What is the issue?'),
      ],
    },
  },
  {
    id: 'travelmate', cat: 'match', bg: 'yellow', thumb: 'fit', demo: 'brokerageMatch',
    title: '여행 동행·가이드 매칭', titleEn: 'Travel Mate & Guide', titleJa: '旅行同行マッチング',
    tagline: '일정·취향 기반 동행/가이드 매칭', taglineEn: 'Match travel mates by trip & taste', taglineJa: '日程・好みベースの同行/ガイドマッチング',
    priceFrom: 3900000, durationDays: 36, tags: ['Matching', 'Geo', 'Chat'],
    tech: ['NestJS', 'PostgreSQL', 'Socket.IO'],
    overview: '여행 일정·지역·취향으로 동행이나 현지 가이드를 매칭합니다.',
    overviewEn: 'Match travel companions or local guides by trip dates, region and taste.',
    overviewJa: '旅行日程・地域・好みで同行者や現地ガイドをマッチします。',
    features: [
      { ko: '일정·지역 매칭', en: 'Itinerary & region match', ja: '日程・地域のマッチ' },
      { ko: '취향·언어 가중치', en: 'Taste & language weighting', ja: '好み・言語の重み付け' },
      { ko: '동행 채팅', en: 'Companion chat', ja: '同行チャット' },
    ],
    mock: {
      ctaLabel: '동행 신청', ctaLabelEn: 'Join trip', successLabel: '동행 연결됨', successLabelEn: 'Mate connected',
      listings: [
        brokerListing('tm1', '오사카 3박 동행', 'Osaka 3N mate', '6/12~15 · 맛집·쇼핑', 'Food & shopping', ['오사카'], 90,
          [{ label: '일정 일치', labelEn: 'Date match', pct: 95 }, { label: '취향 적합도', labelEn: 'Taste fit', pct: 86 }, { label: '언어', labelEn: 'Language', pct: 84 }],
          '맛집 위주로 다녀요!', 'Let us focus on food!'),
        brokerListing('tm2', '제주 현지 가이드', 'Jeju guide', '드라이브·오름 · ★4.9', 'Drive·Oreum · ★4.9', ['제주'], 83,
          [{ label: '일정 일치', labelEn: 'Date match', pct: 86 }, { label: '취향 적합도', labelEn: 'Taste fit', pct: 82 }, { label: '평점', labelEn: 'Rating', pct: 92 }],
          '렌터카 코스 짜드려요', 'I can plan your route'),
      ],
    },
  },
  {
    id: 'office', cat: 'match', bg: 'cyan', thumb: 'dash', demo: 'brokerageMatch',
    title: '공유오피스·공간 예약 중개', titleEn: 'Shared Office Booking', titleJa: '空間予約仲介',
    tagline: '위치·규모·일정 기반 공간 매칭', taglineEn: 'Match spaces by location & size', taglineJa: '立地・規模・日程ベースの空間マッチング',
    priceFrom: 4400000, durationDays: 40, tags: ['Booking', 'Geo', 'Payment'],
    tech: ['NestJS', 'PostgreSQL', 'Bull', 'TossPay'],
    overview: '공유오피스·회의실·연습실을 위치·규모·일정으로 매칭하고 예약·결제를 처리합니다.',
    overviewEn: 'Match shared offices, meeting and practice rooms by location, size and schedule with booking and payment.',
    overviewJa: 'シェアオフィス・会議室・練習室を立地・規模・日程でマッチし、予約・決済を処理します。',
    features: [
      { ko: '위치·규모 매칭', en: 'Location & size match', ja: '立地・規模のマッチ' },
      { ko: '실시간 예약 가능 여부', en: 'Live availability', ja: 'リアルタイム空き状況' },
      { ko: '예약·결제 연동', en: 'Booking & payment', ja: '予約・決済連携' },
    ],
    mock: {
      ctaLabel: '예약하기', ctaLabelEn: 'Reserve', successLabel: '예약 완료', successLabelEn: 'Reserved',
      listings: [
        brokerListing('o1', '강남 4인 회의실', 'Gangnam 4p room', '시간당 1.5만 · 1.0km', '15k/hr · 1.0km', ['회의실'], 92,
          [{ label: '위치 적합도', labelEn: 'Location fit', pct: 96 }, { label: '규모 적합도', labelEn: 'Size fit', pct: 88 }, { label: '가격 적정성', labelEn: 'Price fit', pct: 84 }],
          '오늘 2시 예약 가능해요', '2pm today is open'),
        brokerListing('o2', '합정 1인 오피스', 'Hapjeong desk', '월 22만 · 2.1km', '220k/mo · 2.1km', ['데스크'], 84,
          [{ label: '위치 적합도', labelEn: 'Location fit', pct: 88 }, { label: '규모 적합도', labelEn: 'Size fit', pct: 82 }, { label: '가격 적정성', labelEn: 'Price fit', pct: 86 }],
          '투어 안내드릴게요', 'Let me show you around'),
      ],
    },
  },

  /* ───── AI·음성영상·인프라·콘텐츠 12종 ───── */
  {
    id: 'aitutor', cat: 'ai', bg: 'cyan', thumb: 'dash', demo: 'tutorQuiz',
    title: 'AI 다국어 학습 튜터', titleEn: 'AI Language Tutor', titleJa: 'AI多言語学習',
    tagline: '30개 언어 단어·교과서·13종 퀴즈', taglineEn: '30 langs, textbooks, 13 quiz types', taglineJa: '30言語の単語・教科書・13種クイズ',
    priceFrom: 3800000, durationDays: 35, tags: ['Lingua', 'GraphQL', 'Quiz'],
    tech: ['NestJS', 'GraphQL', 'MongoDB', 'Apollo'],
    overview: 'Lingua API(30개 언어, MongoDB 1342문서)와 교과서·13종 퀴즈를 결합한 학습 솔루션. 단일 conceptKey로 30개 언어가 즉시 매핑됩니다.',
    overviewEn: 'Learning solution combining the Lingua API (30 languages, 1342 docs) with textbooks and 13 quiz types. One conceptKey maps to 30 languages instantly.',
    overviewJa: 'Lingua API(30言語・MongoDB 1342文書)と教科書・13種クイズを組み合わせた学習ソリューション。単一conceptKeyで30言語が即座にマッピングされます。',
    features: [
      { ko: '13종 퀴즈 데이터 사전 생성', en: '13 prebuilt quiz types', ja: '13種クイズデータの事前生成' },
      { ko: 'CEFR A1~C2 레벨 필터', en: 'CEFR A1-C2 filtering', ja: 'CEFR A1〜C2レベルフィルタ' },
      { ko: '단일 conceptKey 30언어 매핑', en: 'One conceptKey, 30 languages', ja: '単一conceptKeyで30言語マッピング' },
    ],
    mock: {
      words: [
        { prompt: '다음 뜻에 맞는 단어는?', promptEn: 'Pick the word for this meaning', word: '사과 (apple)', roman: 'sa-gwa', options: ['apple', 'banana', 'orange', 'grape'], answer: 'apple' },
        { prompt: '빈칸에 알맞은 단어는?', promptEn: 'Fill in the blank', word: 'I eat an ___ every morning', roman: '', options: ['apple', 'desk', 'rain', 'song'], answer: 'apple' },
        { prompt: '발음이 유사한 단어 쌍은?', promptEn: 'Which is the confusable pair?', word: 'rice', roman: '', options: ['lice', 'desk', 'book', 'tree'], answer: 'lice' },
      ],
      apiSample: { conceptKey: 'apple', cefr: 'A1', langData: { ko: { word: '사과' }, en: { word: 'apple' }, ja: { word: 'りんご' } }, quizData: { type: 'meaning-word', distractors: ['banana', 'orange'] } },
    },
  },
  {
    id: 'rtc', cat: 'media', bg: 'lavender', thumb: 'chat', demo: 'rtcCall',
    title: '실시간 음성·영상 통화', titleEn: 'Realtime Voice & Video', titleJa: 'リアルタイム通話',
    tagline: 'WebRTC 시그널링 + ICE + CallKit', taglineEn: 'WebRTC signaling + ICE + CallKit', taglineJa: 'WebRTCシグナリング＋ICE＋CallKit',
    priceFrom: 4200000, durationDays: 38, tags: ['WebRTC', 'WebSocket', 'VoIP'],
    tech: ['NestJS', 'WebRTC', 'Socket.IO', 'STUN/TURN'],
    overview: '본앱 통화 게이트웨이(7종 시그널)를 제품화. initiate→accept→ICE 교환 흐름과 STUN/TURN 설정 조회를 제공합니다. (미디어 릴레이는 별도 TURN/SFU 필요)',
    overviewEn: 'Productized from the app call gateway (7 signals): initiate→accept→ICE flow plus STUN/TURN config. (Media relay needs a separate TURN/SFU.)',
    overviewJa: '本アプリの通話ゲートウェイ(7種シグナル)を製品化。initiate→accept→ICE交換フローとSTUN/TURN設定取得を提供。(メディアリレーは別途TURN/SFUが必要)',
    features: [
      { ko: '7종 시그널링 (offer/answer/ice)', en: '7 signaling events', ja: '7種シグナリング(offer/answer/ice)' },
      { ko: 'STUN/TURN ICE 설정 조회', en: 'STUN/TURN ICE config', ja: 'STUN/TURN ICE設定取得' },
      { ko: '음소거·카메라 토글', en: 'Mute & camera toggle', ja: 'ミュート・カメラ切替' },
    ],
    mock: {
      peer: 'Mina', event: 'call:initiate → accept → ice-candidate',
      iceSample: { iceServers: [{ urls: 'stun:stun.l.google.com:19302' }, { urls: 'turn:turn.moai.app:3478', username: 'moai', credential: '***' }] },
    },
  },
  {
    id: 'voiceai', cat: 'media', bg: 'pink', thumb: 'chat', demo: 'rtcCall',
    title: 'AI 실시간 음성회화', titleEn: 'AI Realtime Voice Chat', titleJa: 'AIリアルタイム会話',
    tagline: 'OpenAI Realtime 중계 음성 대화', taglineEn: 'OpenAI Realtime voice relay', taglineJa: 'OpenAI Realtime中継の音声対話',
    priceFrom: 5800000, durationDays: 48, tags: ['Realtime', 'WebRTC', 'AI'],
    tech: ['NestJS', 'WebRTC', 'OpenAI Realtime', 'Socket.IO'],
    overview: 'realtime-voice 게이트웨이로 AI와 실시간 음성 대화를 중계합니다. 음성 회화 튜터·AI 상담에 적합합니다. (OpenAI Realtime 유료 API 사용)',
    overviewEn: 'Relays realtime voice chat with AI via the realtime-voice gateway. Good for speaking tutors and AI agents. (Uses paid OpenAI Realtime API.)',
    overviewJa: 'realtime-voiceゲートウェイでAIとのリアルタイム音声対話を中継します。会話チューターやAI相談に最適。(OpenAI Realtime有料APIを使用)',
    features: [
      { ko: '실시간 음성 스트리밍 중계', en: 'Realtime voice streaming relay', ja: 'リアルタイム音声ストリーミング中継' },
      { ko: '저지연 시그널링', en: 'Low-latency signaling', ja: '低遅延シグナリング' },
      { ko: '회화 튜터/상담 적용', en: 'Speaking tutor / agent', ja: '会話チューター/相談に応用' },
    ],
    mock: {
      peer: 'AI Tutor', event: 'voice:session.start → audio.delta → response',
      iceSample: { model: 'gpt-realtime', transport: 'webrtc', voice: 'alloy', sampleRate: 24000 },
    },
  },
  {
    id: 'push', cat: 'infra', bg: 'cyan', thumb: 'delivery', demo: 'pushPreview',
    title: '다국어 푸시 알림 인프라', titleEn: 'Multilingual Push Infra', titleJa: '多言語プッシュ基盤',
    tagline: '30언어 자동 + 4-Layer + VoIP + DLQ', taglineEn: '30-lang auto + 4-layer + VoIP + DLQ', taglineJa: '30言語自動＋4層＋VoIP＋DLQ',
    priceFrom: 3200000, durationDays: 30, tags: ['FCM', 'APNs', 'VoIP'],
    tech: ['NestJS', 'Bull', 'Redis', 'FCM', 'APNs', 'PushKit'],
    overview: '4-Layer 권한 모델, 30개 언어 title-pool 자동 매핑, 분산 RateLimiter, DLQ, VoIP PushKit을 단일 SDK로 제공하는 글로벌 알림 인프라.',
    overviewEn: 'Global push infra: 4-layer permissions, 30-language title-pool auto mapping, distributed rate limiter, DLQ and VoIP PushKit in one SDK.',
    overviewJa: '4層権限モデル、30言語title-pool自動マッピング、分散RateLimiter、DLQ、VoIP PushKitを単一SDKで提供するグローバル通知基盤。',
    features: [
      { ko: '30개 언어 자동 매핑', en: '30-language auto mapping', ja: '30言語の自動マッピング' },
      { ko: '4-Layer 권한 모델', en: '4-layer permission model', ja: '4層の権限モデル' },
      { ko: 'DLQ + 분산 RateLimiter', en: 'DLQ + distributed rate limiter', ja: 'DLQ＋分散RateLimiter' },
    ],
    mock: {
      defaultTitle: '새 메시지가 도착했어요',
      previews: [
        { code: 'ko', label: '새 메시지가 도착했어요', body: '지금 확인해 보세요' },
        { code: 'en', label: 'You have a new message', body: 'Tap to view now' },
        { code: 'ja', label: '新しいメッセージが届きました', body: '今すぐ確認' },
        { code: 'es', label: 'Tienes un mensaje nuevo', body: 'Toca para ver' },
        { code: 'fr', label: 'Vous avez un nouveau message', body: 'Appuyez pour voir' },
        { code: 'vi', label: 'Bạn có tin nhắn mới', body: 'Nhấn để xem' },
      ],
    },
  },
  {
    id: 'admesh', cat: 'infra', bg: 'lavender', thumb: 'dash', demo: 'adAuction',
    title: '컨텍스트 광고 경매 플랫폼', titleEn: 'Contextual Ad Auction', titleJa: 'コンテキスト広告入札',
    tagline: 'ATT-free 영국식 경매 + CTR 집계', taglineEn: 'ATT-free English auction + CTR', taglineJa: 'ATT不要の英国式入札＋CTR集計',
    priceFrom: 3000000, durationDays: 30, tags: ['Ad', 'Auction', 'Privacy'],
    tech: ['NestJS', 'PostgreSQL', 'Redis', 'TypeORM'],
    overview: 'ATT/IDFA/GAID 미사용 컨텍스추얼 광고 플랫폼. 영국식 공개 경매(매월 20일 OPEN, 말일 낙찰), 슬롯 송출, CTR(클릭/View) 집계를 제공합니다.',
    overviewEn: 'ATT/IDFA/GAID-free contextual ad platform: English open auction, slot serving and CTR (clicks/views) analytics.',
    overviewJa: 'ATT/IDFA/GAID不使用のコンテキスト広告プラットフォーム。英国式公開入札(毎月20日OPEN、月末落札)、スロット配信、CTR(クリック/View)集計を提供します。',
    features: [
      { ko: 'ATT/IDFA/GAID 0 (프라이버시)', en: 'ATT/IDFA/GAID-free', ja: 'ATT/IDFA/GAID 0(プライバシー)' },
      { ko: '영국식 공개 경매', en: 'English open auction', ja: '英国式公開入札' },
      { ko: 'CTR 실시간 집계', en: 'Realtime CTR analytics', ja: 'CTRリアルタイム集計' },
    ],
    mock: { creative: { title: '여름 신상 30% 할인', sub: 'OO브랜드' }, budget: 50000, cpc: 100 },
  },
  {
    id: 'chat', cat: 'infra', bg: 'yellow', thumb: 'chat', demo: 'liveChat',
    title: '임베드 채팅·고객상담', titleEn: 'Embeddable Chat & CS', titleJa: '埋め込みチャット',
    tagline: 'WebSocket 실시간 채팅 + 상담 콘솔', taglineEn: 'WebSocket chat + agent console', taglineJa: 'WebSocketリアルタイムチャット＋相談コンソール',
    priceFrom: 3500000, durationDays: 32, tags: ['WebSocket', 'Chat', 'CS'],
    tech: ['NestJS', 'Socket.IO', 'PostgreSQL', 'Redis'],
    overview: 'direct/group/open 룸과 미읽음·상태 배정을 갖춘 실시간 채팅을 위젯/SDK로 임베드. 고객상담 콘솔과 외부 유저 서명 검증을 제공합니다.',
    overviewEn: 'Embed realtime chat (direct/group/open, unread, status routing) as a widget/SDK with an agent console and signed external users.',
    overviewJa: 'direct/group/openルームと未読・ステータス割当を備えたリアルタイムチャットをウィジェット/SDKで埋め込み。相談コンソールと外部ユーザー署名検証を提供します。',
    features: [
      { ko: '실시간 메시지 + 미읽음', en: 'Realtime messages + unread', ja: 'リアルタイムメッセージ＋未読' },
      { ko: '상담 상태 배정 (open/pending/closed)', en: 'Agent status routing', ja: '相談ステータス割当(open/pending/closed)' },
      { ko: '위젯/SDK 임베드', en: 'Widget/SDK embed', ja: 'ウィジェット/SDK埋め込み' },
    ],
    mock: { autoReply: { ko: '확인했습니다. 담당자가 곧 도와드릴게요!', en: 'Got it. An agent will help you shortly!' } },
  },
  {
    id: 'anon', cat: 'content', bg: 'pink', thumb: 'chat', demo: 'anonBoard',
    title: '익명 커뮤니티 플랫폼', titleEn: 'Anonymous Community', titleJa: '匿名コミュニティ',
    tagline: 'HMAC 게시글별 익명 + 투표·신고', taglineEn: 'Per-post HMAC alias + vote/report', taglineJa: 'HMAC投稿別匿名＋投票・通報',
    priceFrom: 3300000, durationDays: 30, tags: ['Community', 'HMAC', 'Moderation'],
    tech: ['NestJS', 'PostgreSQL', 'Redis', 'HMAC-SHA256'],
    overview: '게시글별 HMAC 익명 매핑으로 동일 글타래 내 일관 별명을 유지하면서 신원은 보호합니다. 투표·신고 5건 자동숨김 모더레이션 포함.',
    overviewEn: 'Per-post HMAC aliasing keeps a consistent nickname within a thread while protecting identity. Includes voting and auto-hide on 5 reports.',
    overviewJa: '投稿別HMAC匿名マッピングで同一スレッド内の一貫したニックネームを保ちつつ身元を保護。投票と通報5件で自動非表示のモデレーションを含みます。',
    features: [
      { ko: '게시글별 HMAC 익명', en: 'Per-post HMAC alias', ja: '投稿別HMAC匿名' },
      { ko: '투표·정렬·HOT', en: 'Vote, sort, HOT', ja: '投票・並べ替え・HOT' },
      { ko: '신고 5건 자동숨김', en: 'Auto-hide on 5 reports', ja: '通報5件で自動非表示' },
    ],
    mock: {
      aliases: ['익명의 다람쥐', '익명의 부엉이', '익명의 너구리'],
      posts: [
        { alias: '익명의 다람쥐', text: '오늘 점심 뭐 먹지 고민되네요', votes: 12 },
        { alias: '익명의 부엉이', text: '재택 vs 출근 어떤 게 좋아요?', votes: 7 },
      ],
    },
  },
  {
    id: 'oracle', cat: 'content', bg: 'lavender', thumb: 'fit', demo: 'oracleSbti',
    title: '운세·사주·SBTI 분석', titleEn: 'Fortune & SBTI Typing', titleJa: '占い・SBTI分析',
    tagline: 'SBTI 27타입 × 30언어 + 만세력', taglineEn: 'SBTI 27 types × 30 langs + saju', taglineJa: 'SBTI 27タイプ×30言語＋万歳暦',
    priceFrom: 3100000, durationDays: 30, tags: ['Fortune', 'SBTI', 'Static'],
    tech: ['NestJS', 'MongoDB'],
    overview: '만세력 OSS와 SBTI 동물형 정적 데이터셋(27타입 × 30언어 = 810매핑)으로 GPT 의존 없이 운세·성향 분석을 제공합니다.',
    overviewEn: 'Fortune and personality typing without GPT dependency, using a saju engine and the SBTI animal dataset (27 types × 30 languages = 810 mappings).',
    overviewJa: '万歳暦OSSとSBTI動物型の静的データセット(27タイプ×30言語=810マッピング)で、GPT非依存の占い・性向分析を提供します。',
    features: [
      { ko: 'SBTI 27타입 동물형 매핑', en: 'SBTI 27 animal types', ja: 'SBTI 27タイプ動物型マッピング' },
      { ko: '30개 언어 정적 데이터', en: '30-language static data', ja: '30言語の静的データ' },
      { ko: '만세력 사주 계산', en: 'Saju (manse) engine', ja: '万歳暦の四柱推命計算' },
    ],
    mock: {
      questions: [
        { q: '주말엔 주로?', qEn: 'On weekends you usually', a: '집에서 휴식', aEn: 'Rest at home', b: '밖에서 활동', bEn: 'Go out' },
        { q: '결정할 때는?', qEn: 'When deciding you', a: '신중하게', aEn: 'Think carefully', b: '직관적으로', bEn: 'Go with gut' },
      ],
      results: [
        { name: '신중한 거북이형', nameEn: 'Careful Turtle', desc: '깊이 생각하고 안정감을 주는 타입이에요.', descEn: 'A thoughtful, steady type who values stability.' },
        { name: '활발한 다람쥐형', nameEn: 'Lively Squirrel', desc: '에너지 넘치고 호기심 많은 타입이에요.', descEn: 'An energetic, curious type full of drive.' },
      ],
    },
  },
  {
    id: 'meeting', cat: 'ai', bg: 'yellow', thumb: 'dash', demo: 'meetingStt',
    title: 'AI 회의록·STT 요약', titleEn: 'AI Meeting Notes (STT)', titleJa: 'AI議事録・STT',
    tagline: 'Whisper STT + 화자분리 + 요약', taglineEn: 'Whisper STT + diarization + summary', taglineJa: 'Whisper STT＋話者分離＋要約',
    priceFrom: 4000000, durationDays: 34, tags: ['STT', 'Summary', 'AI'],
    tech: ['NestJS', 'Whisper', 'Bull', 'OpenAI'],
    overview: '회의 오디오를 Whisper로 전사하고, 텍스트 패턴 기반 화자 분리(A~D)와 요약·액션아이템을 자동 생성합니다.',
    overviewEn: 'Transcribes meeting audio with Whisper, then auto-generates speaker labels (A-D), a summary and action items.',
    overviewJa: '会議音声をWhisperで文字起こしし、テキストパターンベースの話者分離(A〜D)と要約・アクションアイテムを自動生成します。',
    features: [
      { ko: '음성 인식 (Whisper)', en: 'Speech-to-text (Whisper)', ja: '音声認識(Whisper)' },
      { ko: '화자 분리 + 요약', en: 'Diarization + summary', ja: '話者分離＋要約' },
      { ko: '액션 아이템 추출', en: 'Action item extraction', ja: 'アクションアイテム抽出' },
    ],
    mock: {
      summary: '신규 솔루션 마켓 1차 24종 라인업을 확정하고, 데모는 mock 기반으로 우선 구현하기로 했습니다.',
      summaryEn: 'Confirmed the first 24-solution lineup; demos will be built mock-first.',
      speakers: [
        { spk: 'A', text: '24종 전부 한 번에 가는 게 맞아요.', textEn: 'We should ship all 24 at once.' },
        { spk: 'B', text: '재사용 엔진으로 12개 버티컬 커버하죠.', textEn: 'Cover 12 verticals with one engine.' },
      ],
      actions: ['24종 데이터 작성', '데모 엔진 12종 구현', '히어로 이미지 생성'],
      actionsEn: ['Write 24 solution data', 'Build 12 demo engines', 'Generate hero images'],
    },
  },
  {
    id: 'gamify', cat: 'infra', bg: 'yellow', thumb: 'fit', demo: 'gamify',
    title: '게이미피케이션 엔진', titleEn: 'Gamification Engine', titleJa: 'ゲーミフィケーション',
    tagline: 'XP·레벨·미션·리그 임베드 SDK', taglineEn: 'XP, levels, missions, leagues SDK', taglineJa: 'XP・レベル・ミッション・リーグ埋め込みSDK',
    priceFrom: 3400000, durationDays: 32, tags: ['XP', 'Missions', 'League'],
    tech: ['NestJS', 'PostgreSQL', 'Redis'],
    overview: '레벨 1~99, XP 23종 소스, 데일리/위클리 미션, 6티어 리그, 스트릭·칭호를 임베드 SDK로 제공하는 참여 엔진. (외부 유료 API 불필요)',
    overviewEn: 'Engagement engine (levels 1-99, 23 XP sources, daily/weekly missions, 6-tier leagues, streaks, titles) as an embed SDK. No paid API.',
    overviewJa: 'レベル1〜99、XP 23種ソース、デイリー/ウィークリーミッション、6ティアリーグ、ストリーク・称号を埋め込みSDKで提供するエンゲージメントエンジン。(外部有料API不要)',
    features: [
      { ko: 'XP 23종 소스 + 일일 캡', en: '23 XP sources + daily cap', ja: 'XP 23種ソース＋日次キャップ' },
      { ko: '데일리/위클리 미션', en: 'Daily/weekly missions', ja: 'デイリー/ウィークリーミッション' },
      { ko: '6티어 리그 + 스트릭', en: '6-tier leagues + streaks', ja: '6ティアリーグ＋ストリーク' },
    ],
    mock: {
      missions: [
        { t: '오늘 단어 10개 학습', tEn: 'Learn 10 words today', xp: 100 },
        { t: '친구에게 메시지 보내기', tEn: 'Message a friend', xp: 50 },
        { t: '30분 운동 완료', tEn: 'Finish a 30-min workout', xp: 300 },
      ],
    },
  },
  {
    id: 'walk', cat: 'content', bg: 'cyan', thumb: 'fit', demo: 'walkTrack',
    title: '위치기반 운동·산책 트래킹', titleEn: 'GPS Walk & Fitness', titleJa: '位置情報ウォーキング',
    tagline: 'BG GPS + 실시간 통계 + Live Activity', taglineEn: 'BG GPS + live stats + Live Activity', taglineJa: 'BG GPS＋リアルタイム統計＋Live Activity',
    priceFrom: 3700000, durationDays: 34, tags: ['GPS', 'Tracking', 'Widget'],
    tech: ['React Native', 'Expo TaskManager', 'iOS Live Activity', 'Android Foreground Service'],
    overview: '백그라운드 GPS(5m/1s)로 경로·거리·칼로리·걸음을 실시간 추적하고, iOS Live Activity/위젯으로 잠금화면에 표시합니다.',
    overviewEn: 'Tracks route, distance, calories and steps in real time via background GPS, surfaced on the lock screen with iOS Live Activity/widgets.',
    overviewJa: 'バックグラウンドGPS(5m/1s)で経路・距離・カロリー・歩数をリアルタイム追跡し、iOS Live Activity/ウィジェットでロック画面に表示します。',
    features: [
      { ko: '백그라운드 GPS 트래킹', en: 'Background GPS tracking', ja: 'バックグラウンドGPS追跡' },
      { ko: '실시간 거리·칼로리·걸음', en: 'Live distance, calories, steps', ja: 'リアルタイム距離・カロリー・歩数' },
      { ko: 'Live Activity / 위젯', en: 'Live Activity / widget', ja: 'Live Activity / ウィジェット' },
    ],
    mock: {},
  },
  {
    id: 'commerce', cat: 'commerce', bg: 'pink', thumb: 'delivery', demo: 'commerce',
    title: '통합 커머스·쇼핑몰', titleEn: 'Commerce & Storefront', titleJa: '統合コマース',
    tagline: '상품·장바구니·결제·주문 풀스택', taglineEn: 'Products, cart, checkout, orders', taglineJa: '商品・カート・決済・注文のフルスタック',
    priceFrom: 5000000, durationDays: 45, tags: ['Commerce', 'Payment', 'Admin'],
    tech: ['Next.js', 'NestJS', 'PostgreSQL', 'TossPay', 'KG이니시스'],
    overview: 'shop-mall 기반 풀스택 커머스. 상품·카테고리·장바구니·결제(PG)·주문·관리자 대시보드를 제공합니다.',
    overviewEn: 'Full-stack commerce on shop-mall: products, categories, cart, PG checkout, orders and an admin dashboard.',
    overviewJa: 'shop-mallベースのフルスタックコマース。商品・カテゴリ・カート・決済(PG)・注文・管理ダッシュボードを提供します。',
    features: [
      { ko: '상품·카테고리·장바구니', en: 'Products, categories, cart', ja: '商品・カテゴリ・カート' },
      { ko: 'PG 결제·주문 관리', en: 'PG checkout & orders', ja: 'PG決済・注文管理' },
      { ko: '관리자 대시보드', en: 'Admin dashboard', ja: '管理ダッシュボード' },
    ],
    mock: {
      products: [
        { id: 's1', name: '핸드드립 원두 200g', nameEn: 'Coffee beans 200g', price: 18000, photo: null },
        { id: 's2', name: '리유저블 텀블러', nameEn: 'Reusable tumbler', price: 24000, photo: null },
        { id: 's3', name: '캔들 기프트세트', nameEn: 'Candle gift set', price: 32000, photo: null },
        { id: 's4', name: '에코백', nameEn: 'Eco bag', price: 12000, photo: null },
      ],
    },
  },
];

/* 메인 이미지 경로 자동 할당 (생성 이미지; 없으면 SolThumb가 픽셀목업으로 폴백) */
SOLUTIONS.forEach(s => { if (!s.mainImage) s.mainImage = `/images/solutions/${s.id}.jpg`; });

/* 데모 인물 사진 매핑 (사람 리스팅에만; 사물/공간 리스팅은 null 유지) */
const PEOPLE_PHOTO = {
  dating: { d1: 'p1', d2: 'p3', d3: 'p5', d4: 'p2' },
  langex: { l1: 'p7', l2: 'p4', l3: 'p9' },
  freelancer: { f1: 'p6', f2: 'p11', f3: 'p8' },
  tutormkt: { t1: 'p10', t2: 'p9' },
  pet: { p1: 'p11' },
  homeservice: { h1: 'p7', h2: 'p10' },
  travelmate: { tm1: 'p5', tm2: 'p12' },
};
SOLUTIONS.forEach(s => {
  const map = PEOPLE_PHOTO[s.id];
  if (map && s.mock && Array.isArray(s.mock.listings)) {
    s.mock.listings.forEach(it => { if (map[it.id]) it.photo = `/images/solutions/people/${map[it.id]}.jpg`; });
  }
});
const rtcSol = SOLUTIONS.find(s => s.id === 'rtc');
if (rtcSol && rtcSol.mock) rtcSol.mock.peerPhoto = '/images/solutions/people/p1.jpg';

/* 사물·공간·차량·입양·상품 리스팅 데모 이미지 매핑 (생성 이미지; /images/solutions/demo/<id>.jpg) */
const ITEM_PHOTO_IDS = new Set(['r1', 'r2', 'u1', 'u2', 'c1', 'c2', 'p2', 'o1', 'o2', 'j1', 'j2', 's1', 's2', 's3', 's4']);
SOLUTIONS.forEach(s => {
  if (!s.mock) return;
  [s.mock.listings, s.mock.products].forEach(arr => {
    if (Array.isArray(arr)) arr.forEach(it => { if (ITEM_PHOTO_IDS.has(it.id) && !it.photo) it.photo = `/images/solutions/demo/${it.id}.jpg`; });
  });
});

/* 가격(priceFrom) 단일 소스 — Wishket 중개 플랫폼 스토어 레퍼런스가 대비 15~20% 할인 (2026-05-29 확정) */
const PRICE_FROM = {
  dating: 9900000,      // ref 소셜 데이팅/소개팅 12,000,000 (-17.5%)
  langex: 8200000,      // ref 학습 클래스 매칭 10,000,000 (-18%)
  freelancer: 9900000,  // ref 아웃소싱/프리랜서 12,000,000 (-17.5%)
  jobs: 8200000,        // ref 종합 구인구직 10,000,000 (-18%)
  tutormkt: 8300000,    // ref 학습 클래스 매칭 10,000,000 (-17%)
  realestate: 12300000, // ref 위치기반 매물형 15,000,000 (-18%)
  used: 12300000,       // ref 위치기반 중고거래 15,000,000 (-18%)
  car: 12500000,        // ref 중고 화물차 직거래 15,000,000 (-16.7%)
  pet: 5800000,         // ref 반려동물 펫택시·케어 예약 7,000,000 (-17.1%)
  homeservice: 12300000,// ref 위치기반 전문가 중개 15,000,000 (-18%)
  travelmate: 9900000,  // ref 소셜 매칭(데이팅 동급) 12,000,000 (-17.5%)
  office: 8200000,      // ref 공유 공간 임대 중개 10,000,000 (-18%)
  aitutor: 8200000,     // ref 학습 클래스 매칭 10,000,000 (-18%)
  rtc: 12300000,        // ref 매칭/플랫폼 평균 15,000,000 (-18%)
  voiceai: 16400000,    // ref 콘텐츠/체험단 상위 20,000,000 (-18%)
  push: 8200000,        // ref 인프라(구인구직 동급) 10,000,000 (-18%)
  admesh: 16400000,     // ref SNS 인플루언서 체험단 중개 20,000,000 (-18%)
  chat: 9900000,        // ref 매칭/플랫폼 12,000,000 (-17.5%)
  anon: 9900000,        // ref 콘텐츠 매칭 동급 12,000,000 (-17.5%)
  oracle: 8200000,      // ref 콘텐츠(경량) 10,000,000 (-18%)
  meeting: 12300000,    // ref AI 도구/플랫폼 15,000,000 (-18%)
  gamify: 8200000,      // ref 인프라 SDK 10,000,000 (-18%)
  walk: 12300000,       // ref 피트니스 운동친구 매칭 15,000,000 (-18%)
  commerce: 16400000,   // ref 커머스(상위) 20,000,000 (-18%)
};
SOLUTIONS.forEach(s => { if (PRICE_FROM[s.id]) s.priceFrom = PRICE_FROM[s.id]; });

Object.assign(window, { SOLUTIONS, SOLUTION_CATS });
