@kitn.ai/ui
Version:
Framework-agnostic, Shadow-DOM web components for building AI chat interfaces — works in React, Vue, Angular, Svelte, or plain HTML. Authored in SolidJS.
2 lines (1 loc) • 1.23 kB
JavaScript
const o="kai-card";function c(t,e){t.dispatchEvent(new CustomEvent(o,{detail:e,bubbles:!0,composed:!0}))}const d=["http:","https:","mailto:"];function i(t){try{return d.includes(new URL(t,"http://_invalid_base").protocol)}catch{return!1}}function r(t){console.warn(`[kai-card] no policy handler for "${t}"`)}function p(t,e){const n=t??{};switch(e.kind){case"ready":break;case"submit":n.onSubmit?n.onSubmit(e.cardId,e.data):r("submit");break;case"action":n.onAction?n.onAction(e.cardId,e.action,e.payload):r("action");break;case"send-prompt":{const a=e.mode??"compose",s=n.maxSendPromptMode==="send"?a:"compose";n.onSendPrompt?n.onSendPrompt(e.text,{mode:s,context:e.context}):r("send-prompt");break}case"open":{if(!i(e.url)){n.onError?n.onError(e.cardId,`Blocked unsafe url: ${e.url}`):r("open(unsafe)");break}const a=e.target??"tab";n.onOpen?n.onOpen(e.url,a):typeof window<"u"&&window.open(e.url,"_blank","noopener,noreferrer");break}case"state":n.onState?n.onState(e.cardId,e.patch):r("state");break;case"dismiss":n.onDismiss?n.onDismiss(e.cardId):r("dismiss");break;case"reopen":n.onReopen?n.onReopen(e.cardId):r("reopen");break;case"error":n.onError?n.onError(e.cardId,e.message):r("error");break}}export{o as C,c as e,p as r};