@klever-one/web-sdk
Version:
Web SDK for integrating real-time room management and streaming functionality into web applications
237 lines (212 loc) • 23.5 kB
JavaScript
"use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react"),S=require("../core/klever-one-core-v0.1.0-beta.14.cjs.js"),e=require("react/jsx-runtime"),X=`
/* Klever One SDK Styles - Scoped to prevent external interference */
/* All styles are scoped within .klever-one-sdk container */
/* This prevents SDK styles from affecting the parent application */
/* Layout utilities */
.klever-one-sdk.kos-relative, .klever-one-sdk .kos-relative { position: relative; }
.klever-one-sdk.kos-absolute, .klever-one-sdk .kos-absolute { position: absolute; }
.klever-one-sdk.kos-flex, .klever-one-sdk .kos-flex { display: flex; }
.klever-one-sdk.kos-inline-flex, .klever-one-sdk .kos-inline-flex { display: inline-flex; }
.klever-one-sdk.kos-flex-1, .klever-one-sdk .kos-flex-1 { flex: 1 1 0%; }
.klever-one-sdk.kos-flex-col, .klever-one-sdk .kos-flex-col { flex-direction: column; }
.klever-one-sdk.kos-flex-shrink-0, .klever-one-sdk .kos-flex-shrink-0 { flex-shrink: 0; }
.klever-one-sdk.kos-items-center, .klever-one-sdk .kos-items-center { align-items: center; }
.klever-one-sdk.kos-items-start, .klever-one-sdk .kos-items-start { align-items: flex-start; }
.klever-one-sdk.kos-items-end, .klever-one-sdk .kos-items-end { align-items: flex-end; }
.klever-one-sdk.kos-items-stretch, .klever-one-sdk .kos-items-stretch { align-items: stretch; }
.klever-one-sdk.kos-justify-start, .klever-one-sdk .kos-justify-start { justify-content: flex-start; }
.klever-one-sdk.kos-justify-end, .klever-one-sdk .kos-justify-end { justify-content: flex-end; }
.klever-one-sdk.kos-justify-center, .klever-one-sdk .kos-justify-center { justify-content: center; }
.klever-one-sdk.kos-justify-between, .klever-one-sdk .kos-justify-between { justify-content: space-between; }
.klever-one-sdk.kos-gap-2, .klever-one-sdk .kos-gap-2 { gap: 0.5rem; }
.klever-one-sdk.kos-gap-4, .klever-one-sdk .kos-gap-4 { gap: 1rem; }
/* Sizing */
.klever-one-sdk.kos-w-full, .klever-one-sdk .kos-w-full { width: 100%; }
.klever-one-sdk.kos-h-full, .klever-one-sdk .kos-h-full { height: 100%; }
.klever-one-sdk.kos-w-auto, .klever-one-sdk .kos-w-auto { width: auto; }
.klever-one-sdk.kos-h-auto, .klever-one-sdk .kos-h-auto { height: auto; }
.klever-one-sdk.kos-min-w-0, .klever-one-sdk .kos-min-w-0 { min-width: 0; }
.klever-one-sdk.kos-min-h-0, .klever-one-sdk .kos-min-h-0 { min-height: 0; }
.klever-one-sdk.kos-w-4, .klever-one-sdk .kos-w-4 { width: 1rem; }
.klever-one-sdk.kos-h-4, .klever-one-sdk .kos-h-4 { height: 1rem; }
.klever-one-sdk.kos-w-11, .klever-one-sdk .kos-w-11 { width: 2.75rem; }
.klever-one-sdk.kos-h-11, .klever-one-sdk .kos-h-11 { height: 2.75rem; }
.klever-one-sdk.kos-w-80, .klever-one-sdk .kos-w-80 { width: 20rem; }
.klever-one-sdk.kos-w-96, .klever-one-sdk .kos-w-96 { width: 24rem; }
.klever-one-sdk.kos-h-96, .klever-one-sdk .kos-h-96 { height: 24rem; }
.klever-one-sdk.kos-max-w-xs, .klever-one-sdk .kos-max-w-xs { max-width: 20rem; }
.klever-one-sdk.kos-max-w-md, .klever-one-sdk .kos-max-w-md { max-width: 28rem; }
.klever-one-sdk.kos-max-w-4xl, .klever-one-sdk .kos-max-w-4xl { max-width: 56rem; }
/* Spacing */
.klever-one-sdk.kos-p-3, .klever-one-sdk .kos-p-3 { padding: 0.75rem; }
.klever-one-sdk.kos-p-4, .klever-one-sdk .kos-p-4 { padding: 1rem; }
.klever-one-sdk.kos-px-3, .klever-one-sdk .kos-px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }
.klever-one-sdk.kos-px-4, .klever-one-sdk .kos-px-4 { padding-left: 1rem; padding-right: 1rem; }
.klever-one-sdk.kos-py-1, .klever-one-sdk .kos-py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; }
.klever-one-sdk.kos-py-2, .klever-one-sdk .kos-py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; }
.klever-one-sdk.kos-pr-2, .klever-one-sdk .kos-pr-2 { padding-right: 0.5rem; }
.klever-one-sdk.kos-mx-auto, .klever-one-sdk .kos-mx-auto { margin-left: auto; margin-right: auto; }
.klever-one-sdk.kos-space-y-4, .klever-one-sdk .kos-space-y-4 > * + * { margin-top: 1rem; }
/* Positioning */
.klever-one-sdk.kos-top-0, .klever-one-sdk .kos-top-0 { top: 0; }
.klever-one-sdk.kos-left-0, .klever-one-sdk .kos-left-0 { left: 0; }
.klever-one-sdk.kos-z-0, .klever-one-sdk .kos-z-0 { z-index: 0; }
.klever-one-sdk.kos-z-10, .klever-one-sdk .kos-z-10 { z-index: 10; }
.klever-one-sdk.kos-z-20, .klever-one-sdk .kos-z-20 { z-index: 20; }
/* Colors & Backgrounds */
.klever-one-sdk.kos-bg-black, .klever-one-sdk .kos-bg-black { background-color: #000; }
.klever-one-sdk.kos-bg-gray-100, .klever-one-sdk .kos-bg-gray-100 { background-color: #f3f4f6; }
.klever-one-sdk.kos-bg-gray-700, .klever-one-sdk .kos-bg-gray-700 { background-color: #374151; }
.klever-one-sdk.kos-bg-blue-500, .klever-one-sdk .kos-bg-blue-500 { background-color: #3b82f6; }
.klever-one-sdk.kos-bg-blue-600, .klever-one-sdk .kos-bg-blue-600 { background-color: #2563eb; }
.klever-one-sdk.kos-bg-green-500, .klever-one-sdk .kos-bg-green-500 { background-color: #10b981; }
.klever-one-sdk.kos-bg-yellow-500, .klever-one-sdk .kos-bg-yellow-500 { background-color: #f59e0b; }
.klever-one-sdk.kos-bg-red-500, .klever-one-sdk .kos-bg-red-500 { background-color: #ef4444; }
.klever-one-sdk.kos-bg-opacity-50, .klever-one-sdk .kos-bg-opacity-50 { background-color: rgba(0, 0, 0, 0.5); }
/* Text */
.klever-one-sdk.kos-text-white, .klever-one-sdk .kos-text-white { color: #fff; }
.klever-one-sdk.kos-text-xs, .klever-one-sdk .kos-text-xs { font-size: 0.75rem; line-height: 1rem; }
.klever-one-sdk.kos-text-sm, .klever-one-sdk .kos-text-sm { font-size: 0.875rem; line-height: 1.25rem; }
.klever-one-sdk.kos-text-blue-400, .klever-one-sdk .kos-text-blue-400 { color: #60a5fa; }
.klever-one-sdk.kos-text-green-400, .klever-one-sdk .kos-text-green-400 { color: #4ade80; }
.klever-one-sdk.kos-text-yellow-400, .klever-one-sdk .kos-text-yellow-400 { color: #fbbf24; }
.klever-one-sdk.kos-text-red-400, .klever-one-sdk .kos-text-red-400 { color: #f87171; }
/* Borders & Radius */
.klever-one-sdk.kos-rounded-lg, .klever-one-sdk .kos-rounded-lg { border-radius: 0.5rem; }
.klever-one-sdk.kos-rounded-2xl, .klever-one-sdk .kos-rounded-2xl { border-radius: 1rem; }
.klever-one-sdk.kos-rounded-full, .klever-one-sdk .kos-rounded-full { border-radius: 9999px; }
.klever-one-sdk.kos-rounded-bl-none, .klever-one-sdk .kos-rounded-bl-none { border-bottom-left-radius: 0; }
.klever-one-sdk.kos-rounded-br-none, .klever-one-sdk .kos-rounded-br-none { border-bottom-right-radius: 0; }
/* Overflow & Scroll */
.klever-one-sdk.kos-overflow-y-auto, .klever-one-sdk .kos-overflow-y-auto { overflow-y: auto; }
.klever-one-sdk.kos-overflow-y-hidden, .klever-one-sdk .kos-overflow-y-hidden { overflow-y: hidden; }
.klever-one-sdk.kos-scroll-smooth, .klever-one-sdk .kos-scroll-smooth { scroll-behavior: smooth; }
.klever-one-sdk.kos-resize-none, .klever-one-sdk .kos-resize-none { resize: none; }
/* Text wrapping utilities */
.klever-one-sdk.kos-break-words, .klever-one-sdk .kos-break-words {
overflow-wrap: break-word;
word-wrap: break-word;
word-break: break-word;
}
.klever-one-sdk.kos-whitespace-pre-wrap, .klever-one-sdk .kos-whitespace-pre-wrap {
white-space: pre-wrap;
}
.klever-one-sdk.kos-whitespace-normal, .klever-one-sdk .kos-whitespace-normal {
white-space: normal;
}
.klever-one-sdk.kos-hyphens-auto, .klever-one-sdk .kos-hyphens-auto {
hyphens: auto;
-webkit-hyphens: auto;
-ms-hyphens: auto;
}
/* Outline */
.klever-one-sdk.kos-outline-none, .klever-one-sdk .kos-outline-none { outline: none; }
.klever-one-sdk.kos-outline-none, .klever-one-sdk .kos-outline-none:focus { outline: none; }
/* Transitions */
.klever-one-sdk.kos-transition-colors, .klever-one-sdk .kos-transition-colors {
transition-property: color, background-color, border-color;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
.klever-one-sdk.kos-transition-all, .klever-one-sdk .kos-transition-all {
transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
/* Cursor */
.klever-one-sdk.kos-cursor-pointer, .klever-one-sdk .kos-cursor-pointer { cursor: pointer; }
.klever-one-sdk.kos-cursor-not-allowed, .klever-one-sdk .kos-cursor-not-allowed { cursor: not-allowed !important; }
/* Opacity */
.klever-one-sdk.kos-opacity-50, .klever-one-sdk .kos-opacity-50 { opacity: 0.5; }
/* Animations - scoped with unique prefix */
@keyframes klever-one-sdk-pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
.klever-one-sdk.kos-animate-pulse, .klever-one-sdk .kos-animate-pulse { animation: klever-one-sdk-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; }
/* Hover states */
@media (hover: hover) {
.klever-one-sdk.kos-hover-bg-blue-600, .klever-one-sdk .kos-hover-bg-blue-600:hover { background-color: #2563eb; }
.klever-one-sdk.kos-hover-bg-green-600, .klever-one-sdk .kos-hover-bg-green-600:hover { background-color: #059669; }
.klever-one-sdk.kos-hover-bg-red-600, .klever-one-sdk .kos-hover-bg-red-600:hover { background-color: #dc2626; }
.klever-one-sdk.kos-hover-bg-gray-600, .klever-one-sdk .kos-hover-bg-gray-600:hover { background-color: #4b5563; }
}
/* Input & Textarea base styles */
.klever-one-sdk textarea {
box-sizing: border-box;
line-height: 1.5;
font-family: inherit;
}
/* Disabled states */
.klever-one-sdk input:disabled,
.klever-one-sdk textarea:disabled,
.klever-one-sdk button:disabled {
opacity: 0.5;
cursor: not-allowed;
}
/* Keep disabled button colors unchanged on hover */
.klever-one-sdk button.kos-bg-blue-500:disabled:hover,
.klever-one-sdk .kos-bg-blue-500:disabled:hover {
background-color: #3b82f6 !important;
}
.klever-one-sdk button.kos-bg-green-500:disabled:hover,
.klever-one-sdk .kos-bg-green-500:disabled:hover {
background-color: #10b981 !important;
}
.klever-one-sdk button.kos-bg-red-500:disabled:hover,
.klever-one-sdk .kos-bg-red-500:disabled:hover {
background-color: #ef4444 !important;
}
.klever-one-sdk button.kos-bg-gray-700:disabled:hover,
.klever-one-sdk .kos-bg-gray-700:disabled:hover {
background-color: #374151 !important;
}
/* Focus states */
.klever-one-sdk input:focus,
.klever-one-sdk textarea:focus,
.klever-one-sdk button:focus {
outline: 2px solid #3b82f6;
outline-offset: 2px;
}
/* Placeholder */
.klever-one-sdk input::placeholder,
.klever-one-sdk textarea::placeholder {
color: #9ca3af;
opacity: 1;
}
/* Pointer events - scoped */
.klever-one-sdk .pointer-events-none { pointer-events: none; }
.klever-one-sdk .pointer-events-auto { pointer-events: auto; }
/* React resizable - scoped */
.klever-one-sdk.react-resizable, .klever-one-sdk .react-resizable {
position: relative;
}
.klever-one-sdk.react-resizable, .klever-one-sdk .react-resizable .react-resizable-handle {
position: absolute;
width: 20px;
height: 20px;
bottom: 0;
right: 0;
cursor: se-resize;
background: rgba(0, 0, 0, 0.2);
}
/* Animations - scoped with unique prefix */
@keyframes klever-one-sdk-spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
/* Pixel Streaming specific - scoped to SDK container to prevent global conflicts */
.klever-one-sdk #connectOverlay,
.klever-one-sdk #disconnectOverlay,
.klever-one-sdk #infoOverlay,
.klever-one-sdk #afkOverlay {
display: none !important;
}
.klever-one-sdk #streamingVideo {
object-fit: cover !important;
}
`;let j=!1;function C(){if(j||typeof document>"u")return;const n=document.createElement("style");n.id="klever-one-sdk-styles",n.textContent=X,document.head&&(document.head.appendChild(n),j=!0)}typeof document<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",C):C()),!0;let x=0;function M(n){const{apiKey:l,container:i,callbacks:a,conversation:d,...v}=n,s=r.useRef(a);s.current=a;const o=r.useRef(null),[h,c]=r.useState({connection:"disconnected",recording:"idle",isStreaming:!1,isStreamingReady:!1,isConversationReady:!1,lastUpdated:new Date}),[u,p]=r.useState({reconnectAttempts:0,messagesSent:0,messagesReceived:0,recordingSessions:0,errorCount:0}),[E,y]=r.useState({messages:[],isStreaming:!1,isCompleted:!1}),[T,m]=r.useState([]);r.useEffect(()=>{try{const t=new S.KleverOneClient({apiKey:l,container:i,conversation:d,...v,callbacks:{...s.current,onConnectionStatusChange:k=>{c(g=>({...g,connection:k})),s.current?.onConnectionStatusChange?.(k)},onRecordingStatusChange:k=>{c(g=>({...g,recording:k})),s.current?.onRecordingStatusChange?.(k)},onStreamingStatusChange:k=>{c(g=>({...g,isStreaming:k})),s.current?.onStreamingStatusChange?.(k)},onMessageReceived:k=>{m(g=>{const w=g.findIndex(b=>b.id===k.id);if(w>=0){const b=[...g];return b[w]=k,b}else return[...g,k]}),s.current?.onMessageReceived?.(k)},onReady:()=>{c(k=>({...k,isStreamingReady:!0,isConversationReady:!0})),s.current?.onReady?.()},onDisconnect:()=>{c({connection:"disconnected",recording:"idle",isStreaming:!1,isStreamingReady:!1,isConversationReady:!1,lastUpdated:new Date}),m([]),s.current?.onDisconnect?.()},onError:k=>{p(g=>({...g,errorCount:g.errorCount+1,lastErrorTime:new Date})),s.current?.onError?.(k)},onRoomInfoUpdated:k=>{s.current?.onRoomInfoUpdated?.(k)},onLog:k=>{s.current?.onLog?.(k)},onRoomSessionTimeout:k=>{s.current?.onRoomSessionTimeout?.(k)}}});o.current=t,x++,c(t.getState()),p(t.getMetrics()),y(t.getConversationState()),m(t.getMessages())}catch{}return()=>{x--,x===0&&o.current&&o.current.getState().connection!=="disconnected"&&o.current.disconnect()}},[l,i]),r.useEffect(()=>{if(!o.current)return;const k=setInterval(()=>{o.current&&o.current.getState().connection!=="disconnected"&&(c(o.current.getState()),p(o.current.getMetrics()),y(o.current.getConversationState()),m(o.current.getMessages()))},1e3);return()=>clearInterval(k)},[]);const K=r.useCallback(async()=>{if(o.current)return o.current.connect();throw new Error("KleverOneClient not initialized")},[]),D=r.useCallback(()=>{o.current&&o.current.disconnect()},[]),A=r.useCallback(async()=>{if(o.current)return o.current.reconnect();throw new Error("KleverOneClient not initialized")},[]),P=r.useCallback(async t=>{if(o.current)return o.current.sendText(t);throw new Error("KleverOneClient not initialized")},[]),U=r.useCallback(async()=>{if(o.current)return o.current.startRecording();throw new Error("KleverOneClient not initialized")},[]),$=r.useCallback(async()=>{if(o.current)return o.current.stopRecording();throw new Error("KleverOneClient not initialized")},[]),B=r.useCallback(()=>o.current?o.current.isReady():!1,[]),L=r.useCallback(()=>o.current?o.current.isRecording():!1,[]),H=r.useCallback((t,k)=>{o.current&&o.current.resize(t,k)},[]),q=r.useCallback(t=>{o.current&&o.current.sendAvatarNum(t)},[]),W=r.useCallback(t=>{o.current&&o.current.sendAvatarAppearanceChange(t)},[]),F=r.useCallback(t=>{o.current&&o.current.sendPlaceBackgroundChange(t)},[]),V=r.useCallback(t=>{o.current&&o.current.sendVoiceSetting(t)},[]),G=r.useCallback(t=>{o.current&&o.current.sendMessage(t)},[]),J=r.useCallback(async t=>{if(o.current)return o.current.sendDataInChunks(t);throw new Error("KleverOneClient not initialized")},[]),Q=r.useCallback((t=>{o.current&&(Array.isArray(t),o.current.speak(t))}),[]);return{client:o.current,state:h,metrics:u,conversationState:E,messages:T,connect:K,disconnect:D,reconnect:A,sendText:P,speak:Q,startRecording:U,stopRecording:$,isReady:B,isRecording:L,resize:H,sendAvatarNum:q,sendAvatarAppearanceChange:W,sendPlaceBackgroundChange:F,sendVoiceSetting:V,sendMessage:G,sendDataInChunks:J}}const f=({size:n=24,color:l="currentColor",stroke:i=2,className:a="",style:d,children:v,name:s})=>e.jsx("svg",{width:n,height:n,viewBox:"0 0 24 24",fill:"none",stroke:l,strokeWidth:i,strokeLinecap:"round",strokeLinejoin:"round",className:a,style:d,role:"img","aria-label":s,children:v}),Y=n=>e.jsxs(f,{name:"Send",...n,children:[e.jsx("path",{d:"M10 14l11 -11"}),e.jsx("path",{d:"M21 3l-6.5 18a.55 .55 0 0 1 -1 0l-3.5 -7l-7 -3.5a.55 .55 0 0 1 0 -1l18 -6.5"})]}),Z=n=>e.jsxs(f,{name:"Microphone",...n,children:[e.jsx("path",{d:"M9 2m0 3a3 3 0 0 1 3 -3h0a3 3 0 0 1 3 3v5a3 3 0 0 1 -3 3h0a3 3 0 0 1 -3 -3z"}),e.jsx("path",{d:"M5 10a7 7 0 0 0 14 0"}),e.jsx("path",{d:"M8 21l8 0"}),e.jsx("path",{d:"M12 17l0 4"})]}),_=n=>e.jsx(f,{name:"PlayerStop",...n,children:e.jsx("path",{d:"M5 5m0 2a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2z"})}),ee=n=>e.jsxs(f,{name:"PhoneCall",...n,children:[e.jsx("path",{d:"M5 4h4l2 5l-2.5 1.5a11 11 0 0 0 5 5l1.5 -2.5l5 2v4a2 2 0 0 1 -2 2a16 16 0 0 1 -15 -15a2 2 0 0 1 2 -2"}),e.jsx("path",{d:"M15 7a2 2 0 0 1 2 2"}),e.jsx("path",{d:"M15 3a6 6 0 0 1 6 6"})]}),oe=n=>e.jsxs(f,{name:"PhoneOff",...n,children:[e.jsx("path",{d:"M3 21l18 -18"}),e.jsx("path",{d:"M5.831 14.161a15.946 15.946 0 0 1 -2.831 -8.161a2 2 0 0 1 2 -2h4l2 5l-2.5 1.5c.108 .22 .223 .435 .345 .645m1.751 2.277c.843 .84 1.822 1.544 2.904 2.078l1.5 -2.5l5 2v4a2 2 0 0 1 -2 2a15.963 15.963 0 0 1 -10.344 -4.657"})]}),se=n=>e.jsxs(f,{name:"Wifi",...n,children:[e.jsx("path",{d:"M12 18l.01 0"}),e.jsx("path",{d:"M9.172 15.172a4 4 0 0 1 5.656 0"}),e.jsx("path",{d:"M6.343 12.343a8 8 0 0 1 11.314 0"}),e.jsx("path",{d:"M3.515 9.515c4.686 -4.687 12.284 -4.687 17 0"})]}),ne=n=>e.jsxs(f,{name:"WifiOff",...n,children:[e.jsx("path",{d:"M12 18l.01 0"}),e.jsx("path",{d:"M9.172 15.172a4 4 0 0 1 5.656 0"}),e.jsx("path",{d:"M6.343 12.343a7.963 7.963 0 0 1 3.864 -2.14m4.163 .155a7.965 7.965 0 0 1 3.287 2"}),e.jsx("path",{d:"M3.515 9.515a12 12 0 0 1 3.544 -2.455m3.101 -.92a12 12 0 0 1 10.325 3.374"}),e.jsx("path",{d:"M3 3l18 18"})]}),R=({state:n})=>{const l=n.connection==="connected",i=n.connection==="connecting",a=l?"kos-text-green-400":i?"kos-text-yellow-400":"kos-text-red-400",d=l?"연결됨":i?"연결 중...":"연결 안됨",v=l||i?se:ne;return e.jsxs("div",{className:`klever-one-sdk kos-flex kos-items-center kos-gap-2 kos-px-3 kos-py-1 kos-bg-black kos-bg-opacity-50 kos-rounded-full kos-text-white kos-text-xs ${a}`,children:[e.jsx(v,{className:`kos-w-4 kos-h-4 ${i?"kos-animate-pulse":""}`}),e.jsx("span",{children:d}),n.isStreaming&&e.jsx("span",{className:"kos-text-sm kos-text-blue-400",children:"응답 생성 중..."})]})},z=({state:n,connect:l,disconnect:i})=>{const a=n.connection==="connected",d=n.connection==="connecting",v=()=>{a||d?i():l()};return e.jsx("button",{onClick:v,disabled:d,className:`klever-one-sdk kos-w-11 kos-h-11 kos-inline-flex kos-items-center kos-justify-center kos-rounded-full kos-transition-colors ${a?"kos-bg-red-500 kos-hover-bg-red-600 kos-text-white kos-cursor-pointer":d?"kos-bg-yellow-500 kos-text-white kos-animate-pulse kos-cursor-not-allowed":"kos-bg-green-500 kos-hover-bg-green-600 kos-text-white kos-cursor-pointer"}`,children:a||d?e.jsx(oe,{size:20}):e.jsx(ee,{size:20})})},I=({state:n,isReady:l,sendText:i,startRecording:a,stopRecording:d})=>{const v=r.useRef(null),[s,o]=r.useState("");r.useEffect(()=>{const u=v.current;if(u){u.style.height="44px";const p=Math.min(Math.max(u.scrollHeight,44),120);u.style.height=`${p}px`}},[s]);const h=async u=>{if(u.preventDefault(),!(!s.trim()||n.isStreaming))try{await i(s),o("")}catch{}},c=async()=>{try{n.recording==="recording"?await d():await a()}catch{}};return e.jsxs("form",{onSubmit:h,className:"klever-one-sdk kos-w-full kos-flex kos-items-stretch kos-gap-4",children:[e.jsx("textarea",{ref:v,className:"kos-flex-1 kos-min-w-0 kos-bg-gray-700 kos-text-white kos-p-3 kos-rounded-lg kos-resize-none kos-outline-none kos-overflow-y-hidden kos-transition-all",placeholder:"메시지를 입력하세요...",value:s,onChange:u=>o(u.target.value),disabled:n.isStreaming,rows:1,style:{minHeight:"44px",maxHeight:"120px"},onKeyDown:u=>{u.key==="Enter"&&!u.shiftKey&&(u.preventDefault(),h(u))}}),e.jsxs("div",{className:"kos-flex kos-items-center kos-gap-2 kos-flex-shrink-0",children:[e.jsx("button",{type:"button",onClick:c,disabled:n.isStreaming||!l(),className:`kos-w-11 kos-h-11 kos-inline-flex kos-items-center kos-justify-center kos-rounded-full kos-transition-colors ${n.recording==="recording"?"kos-bg-red-500 kos-text-white kos-animate-pulse kos-cursor-pointer":"kos-bg-gray-700 kos-hover-bg-gray-600 kos-text-white kos-cursor-pointer"}`,children:n.recording==="recording"?e.jsx(_,{size:20}):e.jsx(Z,{size:20})}),e.jsx("button",{type:"submit",disabled:!s.trim()||n.isStreaming||!l(),className:"kos-w-11 kos-h-11 kos-inline-flex kos-items-center kos-justify-center kos-bg-blue-500 kos-text-white kos-rounded-full kos-cursor-pointer kos-hover-bg-blue-600 kos-transition-colors",children:e.jsx(Y,{size:20})})]})]})},O=({messages:n})=>{const l=r.useRef(null),[i,a]=r.useState(!1),d=r.useMemo(()=>{const s=new Map;return n.forEach(o=>{o.id?s.set(o.id,o):s.set(Symbol("unique-msg"),o)}),Array.from(s.values())},[n]);r.useEffect(()=>{l.current&&!i&&(l.current.scrollTop=l.current.scrollHeight)},[d,i]);const v=()=>{if(l.current){const{scrollTop:s,scrollHeight:o,clientHeight:h}=l.current,c=o-s-h<10;a(!c)}};return e.jsx("div",{ref:l,onScroll:v,className:"klever-one-sdk kos-flex-1 kos-overflow-y-auto kos-space-y-4 kos-pr-2 kos-scroll-smooth",children:d.map((s,o)=>e.jsx("div",{className:`kos-flex kos-items-end kos-gap-2 ${s.role==="user"?"kos-justify-end":"kos-justify-start"}`,children:e.jsx("div",{className:`kos-px-4 kos-py-2 kos-rounded-2xl kos-max-w-xs kos-break-words kos-whitespace-pre-wrap ${s.role==="user"?"kos-bg-blue-600 kos-text-white kos-rounded-br-none":"kos-bg-gray-700 kos-text-white kos-rounded-bl-none"}`,children:e.jsx("span",{className:"kos-text-sm kos-break-words",children:s.fullContent||s.content})})},s.id||`msg-${o}`))})},N=({apiKey:n,width:l=800,className:i=""})=>{const a=r.useRef(null),d=r.useMemo(()=>typeof document<"u"?document.createElement("div"):{},[]),v=r.useMemo(()=>({onReady:()=>console.log("디지털 휴먼 준비 완료!"),onMessageReceived:c=>console.log("받은 메시지:",c),onError:c=>alert(c?.message||"오류가 발생했습니다.")}),[]),s=M({apiKey:n,container:a.current||d,callbacks:v});r.useEffect(()=>()=>{if(s.client)try{s.disconnect()}catch{}},[s.client]);const o=async()=>{if(a.current&&s.client)try{await s.connect()}catch{}},h=()=>{s.client&&s.disconnect()};return e.jsxs("div",{className:`klever-one-sdk kos-flex kos-gap-4 ${i}`,children:[e.jsxs("div",{className:"kos-flex kos-flex-col kos-gap-4",style:{width:`${l}px`},children:[e.jsxs("div",{className:"kos-relative kos-bg-black kos-rounded-lg",style:{height:"400px"},children:[e.jsx("div",{ref:a,className:"kos-w-full kos-h-full kos-rounded-lg"}),e.jsxs("div",{className:"kos-absolute kos-top-0 kos-left-0 kos-w-full kos-h-full kos-p-4 kos-flex kos-justify-between kos-items-start pointer-events-none",children:[e.jsx(R,{state:s.state}),e.jsx("div",{className:"pointer-events-auto",children:e.jsx(z,{state:s.state,connect:o,disconnect:h})})]})]}),e.jsx(I,{state:s.state,isReady:s.isReady,sendText:s.sendText,startRecording:s.startRecording,stopRecording:s.stopRecording})]}),e.jsx("div",{className:"kos-flex kos-flex-col kos-bg-gray-100 kos-rounded-lg kos-p-4",style:{minWidth:"384px"},children:e.jsx(O,{messages:s.messages})})]})},re=({apiKey:n})=>{const[l,i]=r.useState(!1);return e.jsx("div",{className:"klever-one-sdk kos-p-4",children:e.jsx(N,{apiKey:n,width:800,isFullscreen:l,onToggleFullscreen:()=>i(!l),className:"kos-max-w-4xl kos-mx-auto"})})};exports.KleverOneClient=S.KleverOneClient;exports.ConnectionStatusIndicator=R;exports.ConnectionToggleButton=z;exports.MessageInput=I;exports.MessageList=O;exports.UnifiedConversation=N;exports.UnifiedConversationExample=re;exports.useKleverOneClient=M;