d3ro-voice/apps/web/.next/server/app/login.html
yunchan8804 d0c33ca259 feat(V2-3): Web App MVP — Next.js 15 + @d3ro/api-client
packages/api-client (@d3ro/api-client) 신규:
- types.ts: 12개 테이블 Row/Insert/Update 타입 + Database 형식
- client.ts: createD3roSupabaseClient 팩토리 (placeholder fallback)
- auth.ts: signInWithOAuth/signOut/getSession/onAuthStateChange
- meetings.ts: 회의 + 메모 + 문서 + 전사 CRUD
- history.ts: 음성 입력 이력 CRUD
- usage.ts: 일일 쿼터 + 구독 조회
- 루트 barrel은 types만 re-export, 함수는 subpath import 전용

apps/web (@d3ro/web) 신규 — Next.js 15 App Router:
- transpilePackages: @d3ro/core, ui, i18n, api-client
- ThemeProvider (MUI + AppRouterCacheProvider)
- I18nProvider (localStorage 어댑터)
- AuthProvider (Supabase session Context)
- 라우트 9개:
  - / (auth 상태 기반 리다이렉트)
  - /login (Google/GitHub OAuth, 미설정 경고)
  - /auth/callback (code -> session 교환)
  - /dashboard (요약 카드 + 최근 회의)
  - /meetings (카드 그리드 리스트)
  - /meetings/[id] (transcripts/memos/documents)
  - /record (getUserMedia + MediaRecorder + stt-proxy)
- Sidebar, 인증 가드, 9바 웨이브폼, 레벨 미터

packages/ui 확장:
- MetalCard가 BoxProps 상속 (sx/onClick 등 전달)
- theme.ts에 typoSx(key) 헬퍼 추가 (d3roTypo -> MUI sx 변환)
- d3roPalette.tag.blue 추가 (M5 정리 포함)
- DS 컴포넌트 9개에 'use client' directive
- MetalDial 미사용 import 제거

packages/i18n 확장:
- ko.json에 7개 새 키 (nav.meetings/record/logout, login.*)

설계 결정:
- Database 제네릭 현재는 기본 타입 (V2-4에서 supabase gen types로 자동화)
- api-client barrel은 타입만 노출해서 컴파일 전파 차단
- DS 컴포넌트 client 경계 명시
- env 없어도 Next.js 빌드 성공 (placeholder URL/key)

검증:
- web typecheck OK
- desktop typecheck OK (회귀 없음)
- web next build OK (9 라우트 정적/동적 생성)
- desktop build OK (회귀 없음)
2026-04-09 02:52:31 +09:00

1 line
No EOL
31 KiB
HTML

<!DOCTYPE html><!--borqQ3kbNhV8uztMrJ99R--><html lang="ko"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-c1c45c0a5396db8e.js"/><script src="/_next/static/chunks/87c73c54-0375ba195de27293.js" async=""></script><script src="/_next/static/chunks/18-7dd75803fe09fb37.js" async=""></script><script src="/_next/static/chunks/main-app-ae5439f81e9d53a9.js" async=""></script><script src="/_next/static/chunks/75504863-5f9267cdf03b69d1.js" async=""></script><script src="/_next/static/chunks/77-b2ed327d60687a9b.js" async=""></script><script src="/_next/static/chunks/988-13d51ea3bc47cedf.js" async=""></script><script src="/_next/static/chunks/746-2c44f63089954251.js" async=""></script><script src="/_next/static/chunks/791-5c69f2a174236cc3.js" async=""></script><script src="/_next/static/chunks/184-0c1f7df145ad88ab.js" async=""></script><script src="/_next/static/chunks/app/layout-ef9c055d247766dc.js" async=""></script><script src="/_next/static/chunks/189-0a3a586f59a6cdc9.js" async=""></script><script src="/_next/static/chunks/140-ef9b40e6cd15133a.js" async=""></script><script src="/_next/static/chunks/374-35719d8a245d6483.js" async=""></script><script src="/_next/static/chunks/910-c4d77d369189ddc4.js" async=""></script><script src="/_next/static/chunks/app/login/page-6472292893f1e497.js" async=""></script><title>D3RO Voice</title><meta name="description" content="로컬+클라우드 하이브리드 AI 음성 어시스턴트"/><link rel="icon" href="/favicon.ico"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script><style data-emotion="d3ro-mui-global 1tndo9n-#7c7c82">@layer mui{html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;box-sizing:border-box;-webkit-text-size-adjust:100%;}*,*::before,*::after{box-sizing:inherit;}strong,b{font-weight:700;}body{margin:0;color:#ffffff;font-size:14px;line-height:1.5;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:400;background-color:#19191b;}@media print{body{background-color:#fff;}}body::backdrop{background-color:#19191b;}:root{--d3-bg-app:#19191b;--d3-bg-card:#242427;--d3-bg-cardHover:#2a2a2d;--d3-bg-elevated:#2e2e32;--d3-bg-input:#1e1e21;--d3-bg-sidebar:#1e1f21;--d3-bg-inset:#1b1c1e;--d3-bg-chassis:#242528;--d3-bg-crtBezel:#1a1a1c;--d3-bg-crtGlass:#050605;--d3-text-primary:#ffffff;--d3-text-secondary:#8e8e93;--d3-text-label:#7c7c82;--d3-text-disabled:#4a4a4e;--d3-text-engraving:#1a1a1c;--d3-text-inactive:#77797c;--d3-text-dimLabel:#5c2615;--d3-text-muted:#3a3b3f;--d3-text-hover:#aaaaaa;--d3-border-subtle:rgba(255,255,255,0.04);--d3-border-default:rgba(255,255,255,0.08);--d3-border-strong:rgba(255,255,255,0.12);--d3-shadow-card:0 8px 30px rgba(0,0,0,0.3);--d3-shadow-buttonBase:0 2px 0 rgba(0,0,0,0.4),inset 0 1px 0 rgba(255,255,255,0.06);--d3-shadow-chassis:0 60px 100px -20px rgba(0,0,0,0.8),0 12px 0 #111111,0 13px 4px rgba(0,0,0,0.5),inset 0 1px 1px rgba(255,255,255,0.15),inset 0 -1px 2px rgba(0,0,0,0.4);--d3-shadow-inset:inset 0 2px 6px rgba(0,0,0,0.6),0 1px 1px rgba(255,255,255,0.05);--d3-shadow-insetDeep:inset 0 4px 12px rgba(0,0,0,0.9),inset 0 0 0 1px #000,0 1px 1px rgba(255,255,255,0.1);--d3-shadow-buttonRaised:0 3px 6px rgba(0,0,0,0.4),inset 0 1px 1px rgba(255,255,255,0.1),inset 0 -1px 2px rgba(0,0,0,0.2);--d3-shadow-buttonPressed:inset 0 2px 6px rgba(0,0,0,0.8),inset 0 0 0 1px #000;--d3-shadow-screenGlow:inset 0 0 20px rgba(0,0,0,0.8);--d3-shadow-tooltip:0 8px 24px rgba(0,0,0,0.4);--d3-accent-main:#f25b29;--d3-accent-dim:rgba(242,91,41,0.15);--d3-accent-glow:rgba(242,91,41,0.6);--d3-accent-light:#ff7a4d;--d3-accent-dark:#c44a22;--d3-accent-crtPhosphor:#f25b29;--d3-accent-crtPhosphorDim:#c44a22;}body{background-color:#19191b;color:#ffffff;}}</style><style data-emotion="d3ro-mui 1ibo9ha 11hcd5b 1orv6po xi606m 1ecupz5 18jjxk5 a3d82y 1gf1fd2 131is6g 1l6e05h 127h8j3 1ov46kg 1rjflif 1ozsg79 j2as55 q7mezt 1u319dn 136u1tw clslin">@layer mui{.d3ro-mui-1ibo9ha{min-height:100vh;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;background-color:var(--d3-bg-app);padding:32px;}}@layer mui{.d3ro-mui-11hcd5b{background-color:var(--d3-bg-card);border-radius:22px;border-top:1px solid var(--d3-border-subtle);box-shadow:var(--d3-shadow-card);padding:32px;overflow:hidden;-webkit-transition:background-color 0.2s ease;transition:background-color 0.2s ease;max-width:420px;width:100%;}.d3ro-mui-11hcd5b:hover{background-color:var(--d3-bg-cardHover);}}@layer mui{.d3ro-mui-1orv6po{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}.d3ro-mui-1orv6po>:not(style):not(style){margin:0;}.d3ro-mui-1orv6po>:not(style)~:not(style){margin-top:24px;}}@layer mui{.d3ro-mui-xi606m{text-align:center;}}@layer mui{.d3ro-mui-1ecupz5{margin:0;font-size:14px;line-height:1.5;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:400;color:var(--d3-accent-main);font-family:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;font-size:28px;font-weight:300;text-shadow:0 0 6px rgba(242, 91, 41, 0.4);letter-spacing:-1px;line-height:1.2;font-variant-numeric:tabular-nums;text-transform:none;}}@layer mui{.d3ro-mui-18jjxk5{margin-top:8px;font-size:10px;font-weight:700;letter-spacing:2px;line-height:1.2;color:var(--d3-text-secondary);}}@layer mui{.d3ro-mui-a3d82y{font-size:12px;line-height:1.4;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:400;background-color:transparent;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:6px 16px;color:rgb(251, 223, 176);border:1px solid rgb(247, 177, 59);}.d3ro-mui-a3d82y .MuiAlert-icon{color:#f59e0b;}}@layer mui{.d3ro-mui-1gf1fd2{background-color:#242427;color:#ffffff;-webkit-transition:box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;border-radius:22px;box-shadow:var(--Paper-shadow);background-image:var(--Paper-overlay);font-size:12px;line-height:1.4;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:400;background-color:transparent;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:6px 16px;color:rgb(251, 223, 176);border:1px solid rgb(247, 177, 59);}.d3ro-mui-1gf1fd2 .MuiAlert-icon{color:#f59e0b;}}@layer mui{.d3ro-mui-131is6g{margin-right:12px;padding:7px 0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-size:22px;opacity:0.9;}}@layer mui{.d3ro-mui-1l6e05h{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:1em;height:1em;display:inline-block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;fill:currentColor;font-size:inherit;}}@layer mui{.d3ro-mui-127h8j3{padding:8px 0;min-width:0;overflow:auto;}}@layer mui{.d3ro-mui-1ov46kg{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}.d3ro-mui-1ov46kg>:not(style):not(style){margin:0;}.d3ro-mui-1ov46kg>:not(style)~:not(style){margin-top:16px;}}@layer mui{.d3ro-mui-1rjflif{text-transform:none;font-weight:600;font-size:14px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:22px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;color:var(--variant-containedColor);background-color:var(--variant-containedBg);box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12);--variant-textColor:#f25b29;--variant-outlinedColor:#f25b29;--variant-outlinedBorder:rgba(242, 91, 41, 0.5);--variant-containedColor:#fff;--variant-containedBg:#f25b29;padding:8px 22px;font-size:0.9375rem;box-shadow:none;width:100%;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:600;border-radius:10px;padding:10px 20px;-webkit-transition:-webkit-transform 0.05s linear,box-shadow 0.05s linear;transition:transform 0.05s linear,box-shadow 0.05s linear;box-shadow:0 2px 0 rgba(0,0,0,0.4),inset 0 1px 0 rgba(255,255,255,0.06);color:#fff;}.d3ro-mui-1rjflif:hover{-webkit-text-decoration:none;text-decoration:none;}.d3ro-mui-1rjflif.Mui-disabled{color:rgba(255, 255, 255, 0.3);}.d3ro-mui-1rjflif:hover{box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12);}@media (hover: none){.d3ro-mui-1rjflif:hover{box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12);}}.d3ro-mui-1rjflif:active{box-shadow:0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12);}.d3ro-mui-1rjflif.Mui-focusVisible{box-shadow:0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12);}.d3ro-mui-1rjflif.Mui-disabled{color:rgba(255, 255, 255, 0.3);box-shadow:none;background-color:rgba(255, 255, 255, 0.12);}@media (hover: hover){.d3ro-mui-1rjflif:hover{--variant-containedBg:#c44a22;--variant-textBg:rgba(242, 91, 41, 0.08);--variant-outlinedBorder:#f25b29;--variant-outlinedBg:rgba(242, 91, 41, 0.08);}}.d3ro-mui-1rjflif:hover{box-shadow:none;}.d3ro-mui-1rjflif.Mui-focusVisible{box-shadow:none;}.d3ro-mui-1rjflif:active{box-shadow:none;}.d3ro-mui-1rjflif.Mui-disabled{box-shadow:none;}.d3ro-mui-1rjflif.MuiButton-loading{color:transparent;}.d3ro-mui-1rjflif:active{-webkit-transform:translateY(2px);-moz-transform:translateY(2px);-ms-transform:translateY(2px);transform:translateY(2px);box-shadow:var(--d3-shadow-buttonPressed);}.d3ro-mui-1rjflif:hover{background-color:#c44a22;}}@layer mui{.d3ro-mui-1ozsg79{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;text-transform:none;font-weight:600;font-size:14px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:22px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;color:var(--variant-containedColor);background-color:var(--variant-containedBg);box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12);--variant-textColor:#f25b29;--variant-outlinedColor:#f25b29;--variant-outlinedBorder:rgba(242, 91, 41, 0.5);--variant-containedColor:#fff;--variant-containedBg:#f25b29;padding:8px 22px;font-size:0.9375rem;box-shadow:none;width:100%;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:600;border-radius:10px;padding:10px 20px;-webkit-transition:-webkit-transform 0.05s linear,box-shadow 0.05s linear;transition:transform 0.05s linear,box-shadow 0.05s linear;box-shadow:0 2px 0 rgba(0,0,0,0.4),inset 0 1px 0 rgba(255,255,255,0.06);color:#fff;}.d3ro-mui-1ozsg79::-moz-focus-inner{border-style:none;}.d3ro-mui-1ozsg79.Mui-disabled{pointer-events:none;cursor:default;}@media print{.d3ro-mui-1ozsg79{-webkit-print-color-adjust:exact;color-adjust:exact;}}.d3ro-mui-1ozsg79:hover{-webkit-text-decoration:none;text-decoration:none;}.d3ro-mui-1ozsg79.Mui-disabled{color:rgba(255, 255, 255, 0.3);}.d3ro-mui-1ozsg79:hover{box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12);}@media (hover: none){.d3ro-mui-1ozsg79:hover{box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12);}}.d3ro-mui-1ozsg79:active{box-shadow:0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12);}.d3ro-mui-1ozsg79.Mui-focusVisible{box-shadow:0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12);}.d3ro-mui-1ozsg79.Mui-disabled{color:rgba(255, 255, 255, 0.3);box-shadow:none;background-color:rgba(255, 255, 255, 0.12);}@media (hover: hover){.d3ro-mui-1ozsg79:hover{--variant-containedBg:#c44a22;--variant-textBg:rgba(242, 91, 41, 0.08);--variant-outlinedBorder:#f25b29;--variant-outlinedBg:rgba(242, 91, 41, 0.08);}}.d3ro-mui-1ozsg79:hover{box-shadow:none;}.d3ro-mui-1ozsg79.Mui-focusVisible{box-shadow:none;}.d3ro-mui-1ozsg79:active{box-shadow:none;}.d3ro-mui-1ozsg79.Mui-disabled{box-shadow:none;}.d3ro-mui-1ozsg79.MuiButton-loading{color:transparent;}.d3ro-mui-1ozsg79:active{-webkit-transform:translateY(2px);-moz-transform:translateY(2px);-ms-transform:translateY(2px);transform:translateY(2px);box-shadow:var(--d3-shadow-buttonPressed);}.d3ro-mui-1ozsg79:hover{background-color:#c44a22;}}@layer mui{.d3ro-mui-j2as55{display:inherit;margin-right:8px;margin-left:-4px;}.d3ro-mui-j2as55>*:nth-of-type(1){font-size:22px;}}@layer mui{.d3ro-mui-q7mezt{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:1em;height:1em;display:inline-block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;fill:currentColor;font-size:1.5rem;}}@layer mui{.d3ro-mui-1u319dn{text-transform:none;font-weight:600;font-size:14px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:22px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;padding:5px 15px;border:1px solid currentColor;border-color:var(--variant-outlinedBorder, currentColor);background-color:var(--variant-outlinedBg);color:var(--variant-outlinedColor);--variant-textColor:#f25b29;--variant-outlinedColor:#f25b29;--variant-outlinedBorder:rgba(242, 91, 41, 0.5);--variant-containedColor:#fff;--variant-containedBg:#f25b29;padding:7px 21px;font-size:0.9375rem;box-shadow:none;width:100%;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:600;border-radius:10px;padding:10px 20px;-webkit-transition:-webkit-transform 0.05s linear,box-shadow 0.05s linear;transition:transform 0.05s linear,box-shadow 0.05s linear;box-shadow:0 2px 0 rgba(0,0,0,0.4),inset 0 1px 0 rgba(255,255,255,0.06);border-color:rgba(255,255,255,0.12);color:#ffffff;}.d3ro-mui-1u319dn:hover{-webkit-text-decoration:none;text-decoration:none;}.d3ro-mui-1u319dn.Mui-disabled{color:rgba(255, 255, 255, 0.3);}.d3ro-mui-1u319dn.Mui-disabled{border:1px solid rgba(255, 255, 255, 0.12);}@media (hover: hover){.d3ro-mui-1u319dn:hover{--variant-containedBg:#c44a22;--variant-textBg:rgba(242, 91, 41, 0.08);--variant-outlinedBorder:#f25b29;--variant-outlinedBg:rgba(242, 91, 41, 0.08);}}.d3ro-mui-1u319dn:hover{box-shadow:none;}.d3ro-mui-1u319dn.Mui-focusVisible{box-shadow:none;}.d3ro-mui-1u319dn:active{box-shadow:none;}.d3ro-mui-1u319dn.Mui-disabled{box-shadow:none;}.d3ro-mui-1u319dn.MuiButton-loading{color:transparent;}.d3ro-mui-1u319dn:active{-webkit-transform:translateY(2px);-moz-transform:translateY(2px);-ms-transform:translateY(2px);transform:translateY(2px);box-shadow:var(--d3-shadow-buttonPressed);}.d3ro-mui-1u319dn:hover{border-color:#f25b29;color:#f25b29;}}@layer mui{.d3ro-mui-136u1tw{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;text-transform:none;font-weight:600;font-size:14px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:22px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;padding:5px 15px;border:1px solid currentColor;border-color:var(--variant-outlinedBorder, currentColor);background-color:var(--variant-outlinedBg);color:var(--variant-outlinedColor);--variant-textColor:#f25b29;--variant-outlinedColor:#f25b29;--variant-outlinedBorder:rgba(242, 91, 41, 0.5);--variant-containedColor:#fff;--variant-containedBg:#f25b29;padding:7px 21px;font-size:0.9375rem;box-shadow:none;width:100%;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:600;border-radius:10px;padding:10px 20px;-webkit-transition:-webkit-transform 0.05s linear,box-shadow 0.05s linear;transition:transform 0.05s linear,box-shadow 0.05s linear;box-shadow:0 2px 0 rgba(0,0,0,0.4),inset 0 1px 0 rgba(255,255,255,0.06);border-color:rgba(255,255,255,0.12);color:#ffffff;}.d3ro-mui-136u1tw::-moz-focus-inner{border-style:none;}.d3ro-mui-136u1tw.Mui-disabled{pointer-events:none;cursor:default;}@media print{.d3ro-mui-136u1tw{-webkit-print-color-adjust:exact;color-adjust:exact;}}.d3ro-mui-136u1tw:hover{-webkit-text-decoration:none;text-decoration:none;}.d3ro-mui-136u1tw.Mui-disabled{color:rgba(255, 255, 255, 0.3);}.d3ro-mui-136u1tw.Mui-disabled{border:1px solid rgba(255, 255, 255, 0.12);}@media (hover: hover){.d3ro-mui-136u1tw:hover{--variant-containedBg:#c44a22;--variant-textBg:rgba(242, 91, 41, 0.08);--variant-outlinedBorder:#f25b29;--variant-outlinedBg:rgba(242, 91, 41, 0.08);}}.d3ro-mui-136u1tw:hover{box-shadow:none;}.d3ro-mui-136u1tw.Mui-focusVisible{box-shadow:none;}.d3ro-mui-136u1tw:active{box-shadow:none;}.d3ro-mui-136u1tw.Mui-disabled{box-shadow:none;}.d3ro-mui-136u1tw.MuiButton-loading{color:transparent;}.d3ro-mui-136u1tw:active{-webkit-transform:translateY(2px);-moz-transform:translateY(2px);-ms-transform:translateY(2px);transform:translateY(2px);box-shadow:var(--d3-shadow-buttonPressed);}.d3ro-mui-136u1tw:hover{border-color:#f25b29;color:#f25b29;}}@layer mui{.d3ro-mui-clslin{text-align:center;color:var(--d3-text-label);font-size:12px;}}</style></head><body><div hidden=""><!--$--><!--/$--></div><div class="MuiBox-root d3ro-mui-1ibo9ha"><div class="MuiBox-root d3ro-mui-11hcd5b"><div class="MuiStack-root d3ro-mui-1orv6po"><div class="MuiBox-root d3ro-mui-xi606m"><p class="MuiTypography-root MuiTypography-body1 d3ro-mui-1ecupz5">D3RO VOICE</p><div class="MuiBox-root d3ro-mui-18jjxk5">AI 음성 어시스턴트</div></div><div class="MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation0 MuiAlert-root MuiAlert-colorWarning MuiAlert-outlinedWarning MuiAlert-outlined d3ro-mui-1gf1fd2" role="alert" style="--Paper-shadow:none;--Paper-overlay:linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, 0))"><div class="MuiAlert-icon d3ro-mui-131is6g"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeInherit d3ro-mui-1l6e05h" focusable="false" aria-hidden="true" viewBox="0 0 24 24"><path d="M12 5.99L19.53 19H4.47L12 5.99M12 2L1 21h22L12 2zm1 14h-2v2h2v-2zm0-6h-2v4h2v-4z"></path></svg></div><div class="MuiAlert-message d3ro-mui-127h8j3">Supabase 환경변수가 설정되지 않았습니다. 로그인은 env 설정 후 가능합니다.</div></div><div class="MuiStack-root d3ro-mui-1ov46kg"><button class="MuiButtonBase-root MuiButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeLarge MuiButton-containedSizeLarge MuiButton-colorPrimary MuiButton-disableElevation MuiButton-fullWidth Mui-disabled MuiButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeLarge MuiButton-containedSizeLarge MuiButton-colorPrimary MuiButton-disableElevation MuiButton-fullWidth d3ro-mui-1ozsg79" tabindex="-1" type="button" disabled=""><span class="MuiButton-icon MuiButton-startIcon MuiButton-iconSizeLarge d3ro-mui-j2as55"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium d3ro-mui-q7mezt" focusable="false" aria-hidden="true" viewBox="0 0 24 24"><path d="M12.545,10.239v3.821h5.445c-0.712,2.315-2.647,3.972-5.445,3.972c-3.332,0-6.033-2.701-6.033-6.032s2.701-6.032,6.033-6.032c1.498,0,2.866,0.549,3.921,1.453l2.814-2.814C17.503,2.988,15.139,2,12.545,2C7.021,2,2.543,6.477,2.543,12s4.478,10,10.002,10c8.396,0,10.249-7.85,9.426-11.748L12.545,10.239z"></path></svg></span>Google로 계속하기</button><button class="MuiButtonBase-root MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeLarge MuiButton-outlinedSizeLarge MuiButton-colorPrimary MuiButton-disableElevation MuiButton-fullWidth Mui-disabled MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeLarge MuiButton-outlinedSizeLarge MuiButton-colorPrimary MuiButton-disableElevation MuiButton-fullWidth d3ro-mui-136u1tw" tabindex="-1" type="button" disabled=""><span class="MuiButton-icon MuiButton-startIcon MuiButton-iconSizeLarge d3ro-mui-j2as55"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium d3ro-mui-q7mezt" focusable="false" aria-hidden="true" viewBox="0 0 24 24"><path d="M12 1.27a11 11 0 00-3.48 21.46c.55.09.73-.28.73-.55v-1.84c-3.03.64-3.67-1.46-3.67-1.46-.55-1.29-1.28-1.65-1.28-1.65-.92-.65.1-.65.1-.65 1.1 0 1.73 1.1 1.73 1.1.92 1.65 2.57 1.2 3.21.92a2 2 0 01.64-1.47c-2.47-.27-5.04-1.19-5.04-5.5 0-1.1.46-2.1 1.2-2.84a3.76 3.76 0 010-2.93s.91-.28 3.11 1.1c1.8-.49 3.7-.49 5.5 0 2.1-1.38 3.02-1.1 3.02-1.1a3.76 3.76 0 010 2.93c.83.74 1.2 1.74 1.2 2.94 0 4.21-2.57 5.13-5.04 5.4.45.37.82.92.82 2.02v3.03c0 .27.1.64.73.55A11 11 0 0012 1.27"></path></svg></span>GitHub로 계속하기</button></div><div class="MuiBox-root d3ro-mui-clslin">계속 진행하면 이용약관 및 개인정보 처리방침에 동의합니다.</div></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-c1c45c0a5396db8e.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[7455,[\"385\",\"static/chunks/75504863-5f9267cdf03b69d1.js\",\"77\",\"static/chunks/77-b2ed327d60687a9b.js\",\"988\",\"static/chunks/988-13d51ea3bc47cedf.js\",\"746\",\"static/chunks/746-2c44f63089954251.js\",\"791\",\"static/chunks/791-5c69f2a174236cc3.js\",\"184\",\"static/chunks/184-0c1f7df145ad88ab.js\",\"177\",\"static/chunks/app/layout-ef9c055d247766dc.js\"],\"ThemeProvider\"]\n3:I[1732,[\"385\",\"static/chunks/75504863-5f9267cdf03b69d1.js\",\"77\",\"static/chunks/77-b2ed327d60687a9b.js\",\"988\",\"static/chunks/988-13d51ea3bc47cedf.js\",\"746\",\"static/chunks/746-2c44f63089954251.js\",\"791\",\"static/chunks/791-5c69f2a174236cc3.js\",\"184\",\"static/chunks/184-0c1f7df145ad88ab.js\",\"177\",\"static/chunks/app/layout-ef9c055d247766dc.js\"],\"I18nProvider\"]\n4:I[1598,[\"385\",\"static/chunks/75504863-5f9267cdf03b69d1.js\",\"77\",\"static/chunks/77-b2ed327d60687a9b.js\",\"988\",\"static/chunks/988-13d51ea3bc47cedf.js\",\"746\",\"static/chunks/746-2c44f63089954251.js\",\"791\",\"static/chunks/791-5c69f2a174236cc3.js\",\"184\",\"static/chunks/184-0c1f7df145ad88ab.js\",\"177\",\"static/chunks/app/layout-ef9c055d247766dc.js\"],\"AuthProvider\"]\n5:I[5341,[],\"\"]\n6:I[25,[],\"\"]\n7:I[1012,[],\"ClientPageRoot\"]\n8:I[1009,[\"385\",\"static/chunks/75504863-5f9267cdf03b69d1.js\",\"77\",\"static/chunks/77-b2ed327d60687a9b.js\",\"988\",\"static/chunks/988-13d51ea3bc47cedf.js\",\"189\",\"static/chunks/189-0a3a586f59a6cdc9.js\",\"140\",\"static/chunks/140-ef9b40e6cd15133a.js\",\"374\",\"static/chunks/374-35719d8a245d6483.js\",\"791\",\"static/chunks/791-5c69f2a174236cc3.js\",\"184\",\"static/chunks/184-0c1f7df145ad88ab.js\",\"910\",\"static/chunks/910-c4d77d369189ddc4.js\",\"520\",\"static/chunks/app/login/page-6472292893f1e497.js\"],\"default\"]\nb:I[5104,[],\"OutletBoundary\"]\nd:I[7158,[],\"AsyncMetadataOutlet\"]\nf:I[5104,[],\"ViewportBoundary\"]\n11:I[5104,[],\"MetadataBoundary\"]\n12:\"$Sreact.suspense\"\n14:I[4431,[],\"\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"borqQ3kbNhV8uztMrJ99R\",\"p\":\"\",\"c\":[\"\",\"login\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"login\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"html\",null,{\"lang\":\"ko\",\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]}]}]]}],{\"children\":[\"login\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L7\",null,{\"Component\":\"$8\",\"searchParams\":{},\"params\":{},\"promises\":[\"$@9\",\"$@a\"]}],null,[\"$\",\"$Lb\",null,{\"children\":[\"$Lc\",[\"$\",\"$Ld\",null,{\"promise\":\"$@e\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Lf\",null,{\"children\":\"$L10\"}],null],[\"$\",\"$L11\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$12\",null,{\"fallback\":null,\"children\":\"$L13\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$14\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:{}\na:\"$0:f:0:1:2:children:2:children:1:props:children:0:props:params\"\n"])</script><script>self.__next_f.push([1,"10:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\nc:null\n"])</script><script>self.__next_f.push([1,"15:I[6505,[],\"IconMark\"]\ne:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"D3RO Voice\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"로컬+클라우드 하이브리드 AI 음성 어시스턴트\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\"}],[\"$\",\"$L15\",\"3\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"13:\"$e:metadata\"\n"])</script></body></html>