d3ro-voice/apps/web/.next/static/chunks/605-e18ed1b0e53fb1cf.js
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
12 KiB
JavaScript

"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[605],{850:(e,t,n)=>{n.d(t,{default:()=>o});var r=n(8530),i=n(1580);function o(e){let{props:t,name:n,defaultTheme:o,themeId:a}=e,l=(0,i.default)(o);return a&&(l=l[a]||l),(0,r.A)({theme:l,name:n,props:t})}},1238:(e,t,n)=>{n.d(t,{default:()=>r});let r=(0,n(4590).default)()},1374:(e,t,n)=>{n.r(t),n.d(t,{default:()=>c,unstable_createUseMediaQuery:()=>u});var r,i=n(7620),o=n(3904),a=n(8530),l=n(6310);let s={...r||(r=n.t(i,2))}.useSyncExternalStore;function u(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{themeId:t}=e;return function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=(0,l.default)();r&&t&&(r=r[t]||r);let u="undefined"!=typeof window&&void 0!==window.matchMedia,{defaultMatches:c=!1,matchMedia:d=u?window.matchMedia:null,ssrMatchMedia:p=null,noSsr:f=!1}=(0,a.A)({name:"MuiUseMediaQuery",props:n,theme:r}),m="function"==typeof e?e(r):e;return(m=m.replace(/^@media( ?)/m,"")).includes("print")&&console.warn("MUI: You have provided a `print` query to the `useMediaQuery` hook.\nUsing the print media query to modify print styles can lead to unexpected results.\nConsider using the `displayPrint` field in the `sx` prop instead.\nMore information about `displayPrint` on our docs: https://mui.com/system/display/#display-in-print."),(void 0!==s?function(e,t,n,r,o){let a=i.useCallback(()=>t,[t]),l=i.useMemo(()=>{if(o&&n)return()=>n(e).matches;if(null!==r){let{matches:t}=r(e);return()=>t}return a},[a,e,r,o,n]),[u,c]=i.useMemo(()=>{if(null===n)return[a,()=>()=>{}];let t=n(e);return[()=>t.matches,e=>(t.addEventListener("change",e),()=>{t.removeEventListener("change",e)})]},[a,n,e]);return s(c,u,l)}:function(e,t,n,r,a){let[l,s]=i.useState(()=>a&&n?n(e).matches:r?r(e).matches:t);return(0,o.A)(()=>{if(!n)return;let t=n(e),r=()=>{s(t.matches)};return r(),t.addEventListener("change",r),()=>{t.removeEventListener("change",r)}},[e,n]),l})(m,c,d,p,f)}}let c=u()},2406:(e,t,n)=>{n.r(t),n.d(t,{default:()=>r});let r=(0,n(3292).default)()},3292:(e,t,n)=>{n.d(t,{default:()=>y});var r=n(7620),i=n(2902),o=n(2028),a=n(3664),l=n(7138),s=n(4294),u=n(850),c=n(9166),d=n(7537),p=n(2874),f=n(2237),m=n(4568);let g=(0,d.A)(),h=(0,s.A)("div",{name:"MuiStack",slot:"Root"});function b(e){return(0,u.default)({props:e,name:"MuiStack",defaultTheme:g})}let v=e=>{let{ownerState:t,theme:n}=e,r={display:"flex",flexDirection:"column",...(0,p.NI)({theme:n},(0,p.kW)({values:t.direction,breakpoints:n.breakpoints.values}),e=>({flexDirection:e}))};if(t.spacing){let e=(0,f.LX)(n),i=Object.keys(n.breakpoints.values).reduce((e,n)=>(("object"==typeof t.spacing&&null!=t.spacing[n]||"object"==typeof t.direction&&null!=t.direction[n])&&(e[n]=!0),e),{}),a=(0,p.kW)({values:t.direction,base:i}),l=(0,p.kW)({values:t.spacing,base:i});"object"==typeof a&&Object.keys(a).forEach((e,t,n)=>{if(!a[e]){let r=t>0?a[n[t-1]]:"column";a[e]=r}}),r=(0,o.A)(r,(0,p.NI)({theme:n},l,(n,r)=>t.useFlexGap?{gap:(0,f._W)(e,n)}:{"& > :not(style):not(style)":{margin:0},"& > :not(style) ~ :not(style)":{["margin".concat({row:"Left","row-reverse":"Right",column:"Top","column-reverse":"Bottom"}[r?a[r]:t.direction])]:(0,f._W)(e,n)}}))}return(0,p.iZ)(n.breakpoints,r)};function y(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{createStyledComponent:t=h,useThemeProps:n=b,componentName:o="MuiStack"}=e,s=t(v);return r.forwardRef(function(e,t){let u=n(e),{component:d="div",direction:p="column",spacing:f=0,divider:g,children:h,className:b,useFlexGap:v=!1,...y}=(0,c.A)(u),k=(0,l.A)({root:["root"]},e=>(0,a.Ay)(o,e),{});return(0,m.jsx)(s,{as:d,ownerState:{direction:p,spacing:f,useFlexGap:v},ref:t,className:(0,i.A)(k.root,b),...y,children:g?function(e,t){let n=r.Children.toArray(e).filter(Boolean);return n.reduce((e,i,o)=>(e.push(i),o<n.length-1&&e.push(r.cloneElement(t,{key:"separator-".concat(o)})),e),[])}(h,g):h})})}},4294:(e,t,n)=>{n.d(t,{A:()=>r});let r=(0,n(8318).Ay)()},4590:(e,t,n)=>{n.d(t,{default:()=>g});var r=n(7620),i=n(2902),o=n(3664),a=n(7138),l=n(6774),s=n(850),u=n(4294),c=n(7537),d=n(4568);let p=(0,c.A)(),f=(0,u.A)("div",{name:"MuiContainer",slot:"Root",overridesResolver:(e,t)=>{let{ownerState:n}=e;return[t.root,t["maxWidth".concat((0,l.A)(String(n.maxWidth)))],n.fixed&&t.fixed,n.disableGutters&&t.disableGutters]}}),m=e=>(0,s.default)({props:e,name:"MuiContainer",defaultTheme:p});function g(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{createStyledComponent:t=f,useThemeProps:n=m,componentName:s="MuiContainer"}=e,u=t(e=>{let{theme:t,ownerState:n}=e;return{width:"100%",marginLeft:"auto",boxSizing:"border-box",marginRight:"auto",...!n.disableGutters&&{paddingLeft:t.spacing(2),paddingRight:t.spacing(2),[t.breakpoints.up("sm")]:{paddingLeft:t.spacing(3),paddingRight:t.spacing(3)}}}},e=>{let{theme:t,ownerState:n}=e;return n.fixed&&Object.keys(t.breakpoints.values).reduce((e,n)=>{let r=t.breakpoints.values[n];return 0!==r&&(e[t.breakpoints.up(n)]={maxWidth:"".concat(r).concat(t.breakpoints.unit)}),e},{})},e=>{let{theme:t,ownerState:n}=e;return{..."xs"===n.maxWidth&&{[t.breakpoints.up("xs")]:{maxWidth:Math.max(t.breakpoints.values.xs,444)}},...n.maxWidth&&"xs"!==n.maxWidth&&{[t.breakpoints.up(n.maxWidth)]:{maxWidth:"".concat(t.breakpoints.values[n.maxWidth]).concat(t.breakpoints.unit)}}}});return r.forwardRef(function(e,t){let r=n(e),{className:c,component:p="div",disableGutters:f=!1,fixed:m=!1,maxWidth:g="lg",classes:h,...b}=r,v={...r,component:p,disableGutters:f,fixed:m,maxWidth:g},y=((e,t)=>{let{classes:n,fixed:r,disableGutters:i,maxWidth:s}=e,u={root:["root",s&&"maxWidth".concat((0,l.A)(String(s))),r&&"fixed",i&&"disableGutters"]};return(0,a.A)(u,e=>(0,o.Ay)(t,e),n)})(v,s);return(0,d.jsx)(u,{as:p,ownerState:v,className:(0,i.A)(y.root,c),ref:t,...b})})}},5608:(e,t,n)=>{n.d(t,{default:()=>a});var r=n(8934),i=n(3174);let o=(0,n(8020).A)("MuiBox",["root"]),a=(0,i.default)({defaultClassName:o.root,generateClassName:r.A.generate})},7301:(e,t,n)=>{n.d(t,{default:()=>o});var r=n(5130),i=n(4406);function o(e){let{defaultProps:t={},mixins:n={},overrides:o={},palette:a={},props:l={},styleOverrides:s={},...u}=e,c={...u,components:{}};Object.keys(t).forEach(e=>{let n=c.components[e]||{};n.defaultProps=t[e],c.components[e]=n}),Object.keys(l).forEach(e=>{let t=c.components[e]||{};t.defaultProps=l[e],c.components[e]=t}),Object.keys(s).forEach(e=>{let t=c.components[e]||{};t.styleOverrides=s[e],c.components[e]=t}),Object.keys(o).forEach(e=>{let t=c.components[e]||{};t.styleOverrides=o[e],c.components[e]=t}),c.spacing=(0,r.A)(e.spacing);let d=(0,i.A)(e.breakpoints||{}),p=c.spacing;c.mixins={gutters:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{paddingLeft:p(2),paddingRight:p(2),...e,[d.up("sm")]:{paddingLeft:p(3),paddingRight:p(3),...e[d.up("sm")]}}},...n};let{type:f,mode:m,...g}=a,h=m||f||"light";return c.palette={text:{hint:"dark"===h?"rgba(255, 255, 255, 0.5)":"rgba(0, 0, 0, 0.38)"},mode:h,type:h,...g},c}},8356:(e,t,n)=>{n.r(t),n.d(t,{default:()=>r});let r=(0,n(9969).default)()},8448:(e,t,n)=>{n.d(t,{default:()=>a});var r=n(850),i=n(6168),o=n(4549);function a(e){let{props:t,name:n}=e;return(0,r.default)({props:t,name:n,defaultTheme:i.A,themeId:o.A})}},8530:(e,t,n)=>{n.d(t,{A:()=>i});var r=n(3450);function i(e){let{theme:t,name:n,props:i}=e;return t&&t.components&&t.components[n]&&t.components[n].defaultProps?(0,r.A)(t.components[n].defaultProps,i):i}},9969:(e,t,n)=>{n.d(t,{default:()=>E});var r=n(7620),i=n(2902),o=n(7488),a=n(3664),l=n(7138),s=n(4294),u=n(850),c=n(1580),d=n(9166),p=n(7537);let f=(e,t,n)=>{let r=e.keys[0];if(Array.isArray(t))t.forEach((t,r)=>{n((t,n)=>{r<=e.keys.length-1&&(0===r?Object.assign(t,n):t[e.up(e.keys[r])]=n)},t)});else if(t&&"object"==typeof t){let i,o;(Object.keys(t).length>e.keys.length?e.keys:(i=e.keys,o=Object.keys(t),i.filter(e=>o.includes(e)))).forEach(i=>{if(e.keys.includes(i)){let o=t[i];void 0!==o&&n((t,n)=>{r===i?Object.assign(t,n):t[e.up(i)]=n},o)}})}else("number"==typeof t||"string"==typeof t)&&n((e,t)=>{Object.assign(e,t)},t)};function m(e){return`--Grid-${e}Spacing`}function g(e){return`--Grid-parent-${e}Spacing`}let h="--Grid-columns",b="--Grid-parent-columns",v=({theme:e,ownerState:t})=>{let n={};return f(e.breakpoints,t.size,(e,t)=>{let r={};"grow"===t&&(r={flexBasis:0,flexGrow:1,maxWidth:"100%"}),"auto"===t&&(r={flexBasis:"auto",flexGrow:0,flexShrink:0,maxWidth:"none",width:"auto"}),"number"==typeof t&&(r={flexGrow:0,flexBasis:"auto",width:`calc(100% * ${t} / var(${b}) - (var(${b}) - ${t}) * (var(${g("column")}) / var(${b})))`}),e(n,r)}),n},y=({theme:e,ownerState:t})=>{let n={};return f(e.breakpoints,t.offset,(e,t)=>{let r={};"auto"===t&&(r={marginLeft:"auto"}),"number"==typeof t&&(r={marginLeft:0===t?"0px":`calc(100% * ${t} / var(${b}) + var(${g("column")}) * ${t} / var(${b}))`}),e(n,r)}),n},k=({theme:e,ownerState:t})=>{if(!t.container)return{};let n={[h]:12};return f(e.breakpoints,t.columns,(e,t)=>{let r=t??12;e(n,{[h]:r,"> *":{[b]:r}})}),n},x=({theme:e,ownerState:t})=>{if(!t.container)return{};let n={};return f(e.breakpoints,t.rowSpacing,(t,r)=>{let i="string"==typeof r?r:e.spacing?.(r);t(n,{[m("row")]:i,"> *":{[g("row")]:i}})}),n},A=({theme:e,ownerState:t})=>{if(!t.container)return{};let n={};return f(e.breakpoints,t.columnSpacing,(t,r)=>{let i="string"==typeof r?r:e.spacing?.(r);t(n,{[m("column")]:i,"> *":{[g("column")]:i}})}),n},w=({theme:e,ownerState:t})=>{if(!t.container)return{};let n={};return f(e.breakpoints,t.direction,(e,t)=>{e(n,{flexDirection:t})}),n},S=({ownerState:e})=>({minWidth:0,boxSizing:"border-box",...e.container&&{display:"flex",flexWrap:"wrap",...e.wrap&&"wrap"!==e.wrap&&{flexWrap:e.wrap},gap:`var(${m("row")}) var(${m("column")})`}});var j=n(4568);let M=(0,p.A)(),W=(0,s.A)("div",{name:"MuiGrid",slot:"Root"});function $(e){return(0,u.default)({props:e,name:"MuiGrid",defaultTheme:M})}function E(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{createStyledComponent:t=W,useThemeProps:n=$,useTheme:s=c.default,componentName:u="MuiGrid"}=e;function p(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:()=>!0,r={};return null===e||(Array.isArray(e)?e.forEach((e,i)=>{null!==e&&n(e)&&t.keys[i]&&(r[t.keys[i]]=e)}):"object"==typeof e?Object.keys(e).forEach(t=>{let i=e[t];null!=i&&n(i)&&(r[t]=i)}):r[t.keys[0]]=e),r}let f=t(k,A,x,v,w,S,y),m=r.forwardRef(function(e,t){let c=s(),m=n(e),g=(0,d.A)(m);var h,b,v,y,k,x,A=c.breakpoints;let w=[];void 0!==g.item&&(delete g.item,w.push("item")),void 0!==g.zeroMinWidth&&(delete g.zeroMinWidth,w.push("zeroMinWidth")),A.keys.forEach(e=>{void 0!==g[e]&&(w.push(e),delete g[e])});let{className:S,children:M,columns:W=12,container:$=!1,component:E="div",direction:O="row",wrap:G="wrap",size:N={},offset:L={},spacing:R=0,rowSpacing:C=R,columnSpacing:_=R,unstable_level:z=0,...B}=g,P=p(N,c.breakpoints,e=>!1!==e),I=p(L,c.breakpoints),U=null!=(h=e.columns)?h:z?void 0:W,D=null!=(b=e.spacing)?b:z?void 0:R,Q=null!=(y=null!=(v=e.rowSpacing)?v:e.spacing)?y:z?void 0:C,q=null!=(x=null!=(k=e.columnSpacing)?k:e.spacing)?x:z?void 0:_,T={...g,level:z,columns:U,container:$,direction:O,wrap:G,spacing:D,rowSpacing:Q,columnSpacing:q,size:P,offset:I},F=((e,t)=>{let{container:n,direction:r,spacing:i,wrap:o,size:s}=e,c={root:["root",n&&"container","wrap"!==o&&"wrap-xs-".concat(String(o)),...void 0===r?[]:"object"==typeof r?Object.entries(r).map(([e,t])=>`direction-${e}-${t}`):[`direction-xs-${String(r)}`],...(e=>{let t=[];return Object.entries(e).forEach(([e,n])=>{!1!==n&&void 0!==n&&t.push(`grid-${e}-${String(n)}`)}),t})(s),...n?((e,t="xs")=>{function n(e){return void 0!==e&&("string"==typeof e&&!Number.isNaN(Number(e))||"number"==typeof e&&e>0)}if(n(e))return[`spacing-${t}-${String(e)}`];if("object"==typeof e&&!Array.isArray(e)){let t=[];return Object.entries(e).forEach(([e,r])=>{n(r)&&t.push(`spacing-${e}-${String(r)}`)}),t}return[]})(i,t.breakpoints.keys[0]):[]]};return(0,l.A)(c,e=>(0,a.Ay)(u,e),{})})(T,c);return(0,j.jsx)(f,{ref:t,as:E,ownerState:T,className:(0,i.A)(F.root,S),...B,children:r.Children.map(M,e=>{if(r.isValidElement(e)&&(0,o.A)(e,["Grid"])&&$&&e.props.container){var t,n;return r.cloneElement(e,{unstable_level:null!=(n=null==(t=e.props)?void 0:t.unstable_level)?n:z+1})}return e})})});return m.muiName="Grid",m}}}]);