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 (회귀 없음)
1 line
No EOL
14 KiB
JavaScript
1 line
No EOL
14 KiB
JavaScript
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[910],{215:(e,t,n)=>{n.d(t,{PhosphorText:()=>s});var o=n(4568),r=n(7226),i=n(3791);let a="0 0 8px ".concat(i.sM.accent.amberGlow),l={hero:{fontSize:i.nH.hero.size,color:i.sM.accent.amber,glow:a,fontWeight:i.nH.hero.weight,letterSpacing:i.nH.hero.spacing,lineHeight:i.nH.hero.line},title:{fontSize:i.nH.title.size,color:i.sM.accent.amber,glow:"0 0 6px rgba(242, 91, 41, 0.4)",fontWeight:i.nH.title.weight,letterSpacing:i.nH.title.spacing,lineHeight:i.nH.title.line},value:{fontSize:i.nH.value.size,color:i.sM.accent.amber,glow:"0 0 4px rgba(242, 91, 41, 0.3)",fontWeight:i.nH.value.weight,letterSpacing:i.nH.value.spacing,lineHeight:i.nH.value.line},heading:{fontSize:i.nH.heading.size,color:i.sM.text.primary,glow:"none",fontWeight:i.nH.heading.weight,letterSpacing:i.nH.heading.spacing,lineHeight:i.nH.heading.line},body:{fontSize:i.nH.body.size,color:i.sM.text.secondary,glow:"none",fontWeight:i.nH.body.weight,letterSpacing:i.nH.body.spacing,lineHeight:i.nH.body.line},compact:{fontSize:i.nH.compact.size,color:i.sM.text.primary,glow:"none",fontWeight:i.nH.compact.weight,letterSpacing:i.nH.compact.spacing,lineHeight:i.nH.compact.line},small:{fontSize:i.nH.small.size,color:i.sM.text.inactive,glow:"none",fontWeight:i.nH.small.weight,letterSpacing:i.nH.small.spacing,lineHeight:i.nH.small.line},meta:{fontSize:i.nH.meta.size,color:i.sM.text.inactive,glow:"none",fontWeight:i.nH.meta.weight,letterSpacing:i.nH.meta.spacing,lineHeight:i.nH.meta.line,textTransform:"uppercase"},label:{fontSize:i.nH.label.size,color:i.sM.text.dimLabel,glow:"none",fontWeight:i.nH.label.weight,letterSpacing:i.nH.label.spacing,lineHeight:i.nH.label.line,textTransform:"uppercase"},dim:{fontSize:i.nH.label.size,color:i.sM.text.inactive,glow:"none",fontWeight:i.nH.body.weight,letterSpacing:i.nH.label.spacing,lineHeight:i.nH.label.line},engrave:{fontSize:i.nH.engrave.size,color:i.sM.text.engraving,glow:"none",fontWeight:i.nH.engrave.weight,letterSpacing:i.nH.engrave.spacing,lineHeight:i.nH.engrave.line,textTransform:"uppercase"},micro:{fontSize:i.nH.micro.size,color:i.sM.text.dimLabel,glow:"none",fontWeight:i.nH.micro.weight,letterSpacing:i.nH.micro.spacing,lineHeight:i.nH.micro.line,textTransform:"uppercase"},nano:{fontSize:i.nH.nano.size,color:i.sM.text.inactive,glow:"none",fontWeight:i.nH.nano.weight,letterSpacing:i.nH.nano.spacing,lineHeight:i.nH.nano.line,textTransform:"uppercase"}};function s(e){var t;let{variant:n="value",sx:a,...s}=e,c=l[n];return(0,o.jsx)(r.A,{...s,sx:{fontFamily:i.nt,fontSize:c.fontSize,fontWeight:c.fontWeight,color:c.color,textShadow:"none"!==c.glow?c.glow:"none",letterSpacing:c.letterSpacing,lineHeight:c.lineHeight,fontVariantNumeric:"tabular-nums",textTransform:null!=(t=c.textTransform)?t:"none",...a}})}},984:(e,t,n)=>{n.d(t,{ButtonGroup:()=>a});var o=n(4568),r=n(1284),i=n(3791);function a(e){let{children:t,horizontal:n=!1}=e;return(0,o.jsx)(r.default,{sx:{bgcolor:i.sM.bg.inset,p:"6px",borderRadius:i.fz.inner,boxShadow:i.HG.inset,display:"flex",flexDirection:n?"row":"column",gap:"6px"},children:t})}},1459:(e,t,n)=>{n.d(t,{ScreenPanel:()=>l});var o=n(4568),r=n(1284),i=n(1774),a=n(3791);function l(e){let{children:t,height:n}=e,l="light"===(0,i.default)().palette.mode;return(0,o.jsxs)(r.default,{sx:{position:"relative",bgcolor:a.sM.bg.crtBezel,borderRadius:"12px",boxShadow:a.HG.insetDeep,overflow:"hidden",height:n},children:[(0,o.jsx)(r.default,{sx:{position:"absolute",inset:"2px",borderRadius:"10px",bgcolor:a.sM.bg.crtGlass,boxShadow:a.HG.screenGlow,"&::after":{content:'""',position:"absolute",top:0,left:0,right:0,bottom:"50%",background:l?"linear-gradient(180deg, rgba(255,255,255,0.40) 0%, rgba(255,255,255,0) 100%)":"linear-gradient(180deg, rgba(255,255,255,0.03) 0%, rgba(255,255,255,0) 100%)",pointerEvents:"none",zIndex:10}}}),(0,o.jsx)(r.default,{sx:{position:"relative",zIndex:2,p:2,height:"100%",display:"flex",flexDirection:"column"},children:t})]})}},2517:(e,t,n)=>{n.d(t,{MetalDial:()=>l});var o=n(4568),r=n(1284),i=n(3791),a=n(215);function l(e){let{value:t=0,label:n,size:l=120,ledColor:s=i.sM.accent.amber}=e,c=l-12;return(0,o.jsxs)(r.default,{sx:{display:"flex",flexDirection:"column",alignItems:"center",gap:1.5},children:[(0,o.jsxs)(r.default,{sx:{width:l,height:l,borderRadius:"50%",bgcolor:i.sM.bg.crtBezel,boxShadow:"\n inset 0 3px 8px rgba(0,0,0,0.8),\n inset 0 -1px 2px rgba(255,255,255,0.08),\n 0 1px 1px rgba(255,255,255,0.05)\n ",position:"relative",p:"6px"},children:[(0,o.jsx)(r.default,{sx:{width:c,height:c,borderRadius:"50%",position:"absolute",top:6,left:6,background:"\n repeating-radial-gradient(\n circle at 50% 50%,\n ".concat(i.sM.text.disabled," 0px,\n ").concat(i.sM.text.disabled," 1px,\n ").concat(i.sM.text.label," 1.5px,\n ").concat(i.sM.text.label," 2.5px\n )\n "),transform:"rotate(".concat(270*t-135,"deg)"),transition:"transform 0.2s ease-out"},children:(0,o.jsx)(r.default,{sx:{position:"absolute",top:10,left:"50%",transform:"translateX(-50%)",width:8,height:8,borderRadius:"50%",bgcolor:i.sM.bg.crtBezel,boxShadow:"inset 0 2px 4px rgba(0,0,0,0.8)",display:"flex",alignItems:"center",justifyContent:"center","&::after":{content:'""',width:4,height:4,borderRadius:"50%",bgcolor:s}}})}),(0,o.jsx)(r.default,{sx:{position:"absolute",inset:"6px",borderRadius:"50%",pointerEvents:"none",background:"\n linear-gradient(135deg, rgba(255,255,255,0.9) 0%, rgba(255,255,255,0) 40%, rgba(0,0,0,0.6) 100%),\n conic-gradient(from 180deg at 50% 50%,\n rgba(255,255,255,0) 0deg,\n rgba(255,255,255,0.4) 45deg,\n rgba(255,255,255,0) 90deg,\n rgba(255,255,255,0.2) 180deg,\n rgba(255,255,255,0) 270deg,\n rgba(255,255,255,0.4) 315deg,\n rgba(255,255,255,0) 360deg\n )\n ",mixBlendMode:"overlay",boxShadow:"\n -4px -4px 8px rgba(255,255,255,0.3),\n 12px 16px 20px rgba(0,0,0,0.7),\n inset 0 2px 3px rgba(255,255,255,0.8)\n "}})]}),n&&(0,o.jsx)(a.PhosphorText,{variant:"label",sx:{color:i.sM.text.inactive},children:n})]})}},4070:(e,t,n)=>{n.d(t,{CrtDisplay:()=>g});var o=n(4568),r=n(7620),i=n(1284),a=n(1774),l=n(3791);function s(e,t,n){let o=e.createShader(t);return o?(e.shaderSource(o,n),e.compileShader(o),e.getShaderParameter(o,e.COMPILE_STATUS))?o:(e.deleteShader(o),null):null}let c=new Float32Array([-1,-1,1,-1,-1,1,1,1]);function g(e){let{amplitude:t=.1,frequency:n=8,glitchTrigger:g=0,audioLevel:d=0,children:u,height:f=280}=e,p="light"===(0,a.default)().palette.mode,h=(0,r.useRef)(null),b=(0,r.useRef)(null),x=(0,r.useRef)(0),m=(0,r.useRef)(Date.now()),v=(0,r.useRef)(0),w=(0,r.useRef)(t),H=(0,r.useRef)(n),S=(0,r.useRef)(d),M=(0,r.useRef)(t),z=(0,r.useRef)(n);(0,r.useEffect)(()=>{w.current=t,H.current=n},[t,n]),(0,r.useEffect)(()=>{S.current=d},[d]),(0,r.useEffect)(()=>{g>0&&(v.current=1)},[g]);let y=(0,r.useCallback)(()=>{let e=b.current;if(!e)return;let{gl:t,uTime:n,uGlitch:o,uAmp:r,uFreq:i}=e,a=w.current+.35*S.current;M.current+=(a-M.current)*.15,z.current+=(H.current-z.current)*.1,v.current*=.85,t.uniform1f(n,(Date.now()-m.current)/1e3),t.uniform1f(o,v.current),t.uniform1f(r,M.current),t.uniform1f(i,z.current),t.drawArrays(t.TRIANGLE_STRIP,0,4),x.current=requestAnimationFrame(y)},[]);return(0,r.useEffect)(()=>{let e=h.current;if(!e)return;let t=e.getContext("webgl",{alpha:!0});if(!t)return;e.width=2*e.clientWidth,e.height=2*e.clientHeight,t.viewport(0,0,e.width,e.height);let n=function(e,t,n){let o=s(e,e.VERTEX_SHADER,t),r=s(e,e.FRAGMENT_SHADER,n);if(!o||!r)return null;let i=e.createProgram();return i?(e.attachShader(i,o),e.attachShader(i,r),e.linkProgram(i),i):null}(t,"\n attribute vec2 position;\n varying vec2 vUv;\n void main() {\n gl_Position = vec4(position, 0.0, 1.0);\n vUv = position * 0.5 + 0.5;\n }\n","\n precision highp float;\n varying vec2 vUv;\n uniform float u_time;\n uniform float u_glitch;\n uniform float u_amp;\n uniform float u_freq;\n\n float random(vec2 st) { return fract(sin(dot(st.xy, vec2(12.9898,78.233))) * 43758.5453123); }\n\n void main() {\n vec2 uv = vUv;\n\n // Glitch displacement\n if (u_glitch > 0.0) {\n float gOffset = (random(vec2(uv.y * 5.0, u_time)) - 0.5) * u_glitch * 0.1;\n uv.x += gOffset;\n }\n\n // Base phosphor background\n vec3 color = vec3(0.02, 0.015, 0.01);\n\n // Background Grid\n float gridX = step(0.98, fract(uv.x * 15.0));\n float gridY = step(0.98, fract(uv.y * 10.0));\n color += vec3(0.1, 0.04, 0.02) * max(gridX, gridY) * (1.0 - u_glitch);\n\n // Oscilloscope Waveform\n float t = u_time * 0.5 + u_glitch * random(uv) * 0.1;\n float waveY = sin((uv.x * u_freq) + t) * u_amp;\n float waveDist = abs((uv.y - 0.5) - waveY);\n float lineThick = 0.005 + (u_glitch * 0.02);\n float waveGlow = smoothstep(lineThick * 4.0, 0.0, waveDist);\n float waveCore = smoothstep(lineThick, 0.0, waveDist);\n\n // Amber wave (#f25b29)\n vec3 waveColor = vec3(0.95, 0.35, 0.16);\n color += waveColor * waveCore;\n color += waveColor * 0.4 * waveGlow;\n\n // Scanlines\n float scanline = sin(uv.y * 800.0 - u_time * 10.0) * 0.04;\n color -= scanline;\n\n // Noise\n float noise = random(uv + u_time) * 0.08;\n color += noise;\n\n // Vignette\n float dist = distance(vUv, vec2(0.5));\n float vig = smoothstep(0.8, 0.4, dist);\n color *= vig;\n\n // Edge darkening\n color *= smoothstep(0.0, 0.02, vUv.x) * smoothstep(1.0, 0.98, vUv.x);\n color *= smoothstep(0.0, 0.05, vUv.y) * smoothstep(1.0, 0.95, vUv.y);\n\n gl_FragColor = vec4(color, 1.0);\n }\n");if(!n)return;t.useProgram(n);let o=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,o),t.bufferData(t.ARRAY_BUFFER,c,t.STATIC_DRAW);let r=t.getAttribLocation(n,"position");return t.enableVertexAttribArray(r),t.vertexAttribPointer(r,2,t.FLOAT,!1,0,0),b.current={gl:t,uTime:t.getUniformLocation(n,"u_time"),uGlitch:t.getUniformLocation(n,"u_glitch"),uAmp:t.getUniformLocation(n,"u_amp"),uFreq:t.getUniformLocation(n,"u_freq")},m.current=Date.now(),x.current=requestAnimationFrame(y),()=>{cancelAnimationFrame(x.current)}},[y]),(0,o.jsxs)(i.default,{sx:{position:"relative",height:f,bgcolor:l.sM.bg.crtBezel,borderRadius:"8px",boxShadow:l.HG.insetDeep,overflow:"hidden"},children:[(0,o.jsxs)(i.default,{sx:{position:"absolute",inset:"2px",borderRadius:"6px",bgcolor:l.sM.bg.crtGlass,overflow:"hidden",boxShadow:l.HG.screenGlow},children:[(0,o.jsx)("canvas",{ref:h,style:{position:"absolute",inset:0,width:"100%",height:"100%",...p&&{filter:"invert(0.88) hue-rotate(180deg)",opacity:.9}}}),(0,o.jsx)(i.default,{sx:{position:"absolute",top:0,left:0,right:0,bottom:"50%",background:p?"linear-gradient(180deg, rgba(255,255,255,0.30) 0%, rgba(255,255,255,0) 100%)":"linear-gradient(180deg, rgba(255,255,255,0.03) 0%, rgba(255,255,255,0) 100%)",pointerEvents:"none",zIndex:10}})]}),(0,o.jsx)(i.default,{sx:{position:"absolute",inset:"16px",zIndex:2,display:"flex",flexDirection:"column",justifyContent:"space-between",color:l.sM.accent.amber,textShadow:"0 0 6px rgba(242, 91, 41, 0.4)",pointerEvents:"none",fontFamily:l.nt},children:u})]})}},5281:(e,t,n)=>{n.d(t,{Led:()=>l});var o=n(4568),r=n(1284),i=n(3791);let a={amber:{bg:i.sM.accent.amber,glow:i.sM.accent.amberGlow},green:{bg:i.sM.tag.green,glow:i.sM.tag.greenGlow},red:{bg:i.sM.tag.red,glow:i.sM.tag.redGlow},orange:{bg:i.sM.tag.orange,glow:i.sM.tag.orangeGlow},off:{bg:i.sM.led.off,glow:"transparent"}};function l(e){let{color:t="off",pulse:n=!1,size:i=8}=e,l=a[t],s="off"!==t;return(0,o.jsx)(r.default,{sx:{width:i,height:i,borderRadius:"50%",bgcolor:l.bg,flexShrink:0,boxShadow:s?"inset 0 1px 2px rgba(255,255,255,0.5), 0 0 10px ".concat(l.glow):"inset 0 1px 3px rgba(0,0,0,0.9), 0 1px 0 rgba(255,255,255,0.05)",transition:"all 0.1s",...n&&s?{animation:"led-pulse 1.5s ease-in-out infinite","@keyframes led-pulse":{"0%, 100%":{opacity:1},"50%":{opacity:.5}}}:{}}})}},6652:(e,t,n)=>{n.d(t,{PhysicalButton:()=>a});var o=n(4568),r=n(2622),i=n(3791);function a(e){let{selected:t=!1,sx:n,...a}=e;return(0,o.jsx)(r.A,{...a,sx:{height:44,bgcolor:t?i.sM.bg.crtBezel:i.sM.bg.chassis,border:"none",borderRadius:i.fz.small,color:t?i.sM.accent.amber:i.sM.text.inactive,fontFamily:i.nt,fontSize:i.nH.small.size,fontWeight:i.nH.small.weight,cursor:"pointer",boxShadow:t?i.HG.buttonPressed:i.HG.buttonRaised,transform:t?"translateY(1px)":"none",transition:"all 0.05s linear","&:active":{transform:"translateY(2px)",boxShadow:i.HG.buttonActive},"&:hover":{bgcolor:t?i.sM.bg.crtBezel:i.sM.bg.cardHover},textTransform:"uppercase",letterSpacing:i.nH.label.spacing,minWidth:0,...n}})}},9006:(e,t,n)=>{n.d(t,{InstrumentPanel:()=>s});var o=n(4568),r=n(1284),i=n(7226),a=n(1774),l=n(3791);function s(e){let{children:t,engravingLeft:n="D3RO-VOICE SYS.",engravingRight:i="MOD-01 / TERMINAL",engravingBottom:a="LOCAL AI VOICE ASSISTANT"}=e;return(0,o.jsxs)(r.default,{sx:{position:"relative",bgcolor:l.sM.bg.chassis,borderRadius:l.fz.outer,p:3,boxShadow:l.HG.chassis,"&::before":{content:'""',position:"absolute",inset:0,borderRadius:l.fz.outer,backgroundImage:"url(\"data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E\")",opacity:.04,mixBlendMode:"overlay",pointerEvents:"none",zIndex:1}},children:[(0,o.jsx)(c,{sx:{top:12,left:24},children:n}),(0,o.jsx)(c,{sx:{top:12,right:24},children:i}),(0,o.jsx)(c,{sx:{bottom:12,left:"50%",transform:"translateX(-50%)"},children:a}),(0,o.jsx)(r.default,{sx:{position:"relative",zIndex:5},children:t})]})}function c(e){let{children:t,sx:n}=e,r="light"===(0,a.default)().palette.mode;return(0,o.jsx)(i.A,{sx:{position:"absolute",fontSize:l.nH.engrave.size,letterSpacing:l.nH.engrave.spacing,color:l.sM.text.engraving,textShadow:r?"0 -1px 0 rgba(0,0,0,0.1)":"0 1px 0 rgba(255,255,255,0.08)",fontWeight:700,fontFamily:l.nt,zIndex:2,userSelect:"none",...n},children:t})}},9502:(e,t,n)=>{n.d(t,{MetalCard:()=>a});var o=n(4568),r=n(1284),i=n(3791);function a(e){let{children:t,inset:n=!1,sx:a,...l}=e;return(0,o.jsx)(r.default,{...l,sx:{bgcolor:n?i.sM.bg.inset:i.sM.bg.card,borderRadius:n?i.fz.inner:i.fz.card,borderTop:n?"none":"1px solid ".concat(i.sM.border.subtle),boxShadow:n?i.HG.inset:i.HG.card,p:n?"6px":3,overflow:"hidden",transition:"background-color 0.2s ease","&:hover":n?{}:{bgcolor:i.sM.bg.cardHover},...a},children:t})}}}]); |