@zantopia/zephyr-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget-BjgCJR9K.js","sources":["../src/core/logos.ts","../src/core/personas.ts","../src/core/animations.ts","../src/core/styles.ts","../src/core/ws-client.ts","../src/core/widget.ts"],"sourcesContent":["/**\n * 🦊 Zephyr Logo — Built-in logo asset\n *\n * Uses the official Zephyr fox image.\n * Custom logos can be provided via config (URL or object).\n */\n\nexport type ZephyrLogoPreset = \"zephyr-default\";\n\n/** Base64-encoded PNG of the official Zephyr logo (128x128) */\nconst ZEPHYR_LOGO_B64 = \"data:image/png;base64,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\";\n\nexport { ZEPHYR_LOGO_B64 };\n\nexport interface ResolvedLogo {\n /** Image source for the trigger button */\n trigger: string;\n /** Image source for the chat header */\n header: string;\n /** True if the source is a URL/data-URI (use <img>), false if inline SVG */\n isImage: true;\n /** Alt text */\n alt: string;\n}\n\n// For backward compat with config types\nexport type ZephyrLogo =\n | ZephyrLogoPreset\n | string // custom URL\n | { trigger?: string; header?: string }; // custom object\n\n/**\n * Resolve a logo config value into concrete image sources.\n * For now, all presets resolve to the same official image.\n * Custom URLs or objects are passed through.\n */\nexport function resolveLogo(\n logo: ZephyrLogo | undefined,\n _accentColor?: string,\n): ResolvedLogo {\n // No logo or built-in preset → official image\n if (!logo || logo === \"zephyr-default\") {\n return {\n trigger: ZEPHYR_LOGO_B64,\n header: ZEPHYR_LOGO_B64,\n isImage: true,\n alt: \"Zephyr\",\n };\n }\n\n // Custom URL string\n if (typeof logo === \"string\") {\n return {\n trigger: logo,\n header: logo,\n isImage: true,\n alt: \"Zephyr\",\n };\n }\n\n // Custom object { trigger, header }\n return {\n trigger: logo.trigger || ZEPHYR_LOGO_B64,\n header: logo.header || ZEPHYR_LOGO_B64,\n isImage: true,\n alt: \"Zephyr\",\n };\n}\n","/**\n * 🎭 Zephyr Persona System\n *\n * Personas define the animated avatar inside the chat panel.\n * Built-in presets are SVG-based; custom personas can use Lottie, GIF, or images.\n */\n\nimport type { ZephyrPersona, ZephyrPersonaPreset, ZephyrCustomPersona } from \"./config\";\nimport { ZEPHYR_LOGO_B64 } from \"./logos\";\n\n// ─── Built-in persona definitions ────────────────────────────\n\nconst BUILT_IN_PERSONAS: Record<ZephyrPersonaPreset, ZephyrCustomPersona> = {\n friendly: {\n name: \"Zephyr Friendly\",\n avatar: \"\", // Will be resolved to SVG at runtime\n avatarType: \"svg\",\n },\n professional: {\n name: \"Zephyr Pro\",\n avatar: \"\",\n avatarType: \"svg\",\n },\n playful: {\n name: \"Zephyr Playful\",\n avatar: \"\",\n avatarType: \"svg\",\n },\n futuristic: {\n name: \"Zephyr Futuristic\",\n avatar: \"\",\n avatarType: \"svg\",\n },\n};\n\n// ─── Persona SVG builder (accent-aware) ──────────────────────\n\n/** Expression states for animated personas */\nexport type ZephyrExpression =\n | \"neutral\"\n | \"happy\"\n | \"surprised\"\n | \"thinking\"\n | \"helping\"\n | \"speaking\"\n | \"wink\";\n\nexport interface PersonaExpressionData {\n eyeRx: number;\n eyeRy: number;\n mouth: string;\n eyeArc?: boolean;\n dots?: boolean;\n winkLeft?: boolean;\n}\n\nexport const EXPRESSIONS: Record<ZephyrExpression, PersonaExpressionData> = {\n neutral: { eyeRx: 3, eyeRy: 3.5, mouth: \"M28,42 Q32,44 36,42\" },\n happy: { eyeRx: 0, eyeRy: 0, mouth: \"M26,42 Q32,48 38,42\", eyeArc: true },\n surprised: { eyeRx: 4, eyeRy: 5, mouth: \"M28,43 Q32,47 36,43\" },\n thinking: { eyeRx: 3, eyeRy: 2.5, mouth: \"M28,42 L36,42\", dots: true },\n helping: { eyeRx: 3, eyeRy: 3.5, mouth: \"M26,42 Q32,46 38,42\" },\n speaking: { eyeRx: 3, eyeRy: 3.5, mouth: \"M28,41 Q32,46 36,41\" },\n wink: { eyeRx: 3, eyeRy: 3.5, mouth: \"M26,42 Q32,47 38,42\", winkLeft: true },\n};\n\n/** Generate persona SVG for a given preset + accent + expression */\nexport function generatePersonaSVG(\n preset: ZephyrPersonaPreset,\n accent: string,\n expression: ZephyrExpression = \"neutral\"\n): string {\n const LOGO = ZEPHYR_LOGO_B64;\n\n const svgMap: Record<ZephyrPersonaPreset, (c: string) => string> = {\n friendly: (c) => `\n <svg viewBox=\"0 0 80 80\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"40\" cy=\"40\" r=\"38\" fill=\"${c}\" opacity=\"0.12\"/>\n <circle cx=\"40\" cy=\"40\" r=\"35\" fill=\"none\" stroke=\"${c}\" stroke-width=\"2\" opacity=\"0.5\"/>\n <image href=\"${LOGO}\" x=\"8\" y=\"8\" width=\"64\" height=\"64\"/>\n </svg>`,\n\n professional: (c) => `\n <svg viewBox=\"0 0 80 80\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"8\" y=\"8\" width=\"64\" height=\"64\" rx=\"18\" fill=\"${c}\" opacity=\"0.08\"/>\n <rect x=\"8\" y=\"8\" width=\"64\" height=\"64\" rx=\"18\" fill=\"none\" stroke=\"${c}\" stroke-width=\"1.5\" opacity=\"0.3\"/>\n <image href=\"${LOGO}\" x=\"10\" y=\"10\" width=\"60\" height=\"60\"/>\n </svg>`,\n\n playful: (c) => `\n <svg viewBox=\"0 0 80 80\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"40\" cy=\"40\" r=\"38\" fill=\"${c}\" opacity=\"0.1\"/>\n <circle cx=\"40\" cy=\"40\" r=\"34\" fill=\"${c}\" opacity=\"0.06\"/>\n <circle cx=\"40\" cy=\"40\" r=\"30\" fill=\"${c}\" opacity=\"0.03\"/>\n <circle cx=\"40\" cy=\"40\" r=\"33\" fill=\"none\" stroke=\"${c}\" stroke-width=\"1\" opacity=\"0.3\"/>\n <image href=\"${LOGO}\" x=\"10\" y=\"10\" width=\"60\" height=\"60\" opacity=\"0.92\"/>\n </svg>`,\n\n futuristic: (c) => `\n <svg viewBox=\"0 0 80 80\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"5\" y=\"5\" width=\"70\" height=\"70\" rx=\"16\" fill=\"none\" stroke=\"${c}\" stroke-width=\"1.5\" opacity=\"0.6\"/>\n <rect x=\"10\" y=\"10\" width=\"60\" height=\"60\" rx=\"12\" fill=\"${c}\" opacity=\"0.06\"/>\n <circle cx=\"40\" cy=\"7\" r=\"3\" fill=\"${c}\" opacity=\"0.8\"/>\n <circle cx=\"40\" cy=\"73\" r=\"2.5\" fill=\"${c}\" opacity=\"0.4\"/>\n <circle cx=\"7\" cy=\"40\" r=\"2.5\" fill=\"${c}\" opacity=\"0.4\"/>\n <circle cx=\"73\" cy=\"40\" r=\"2.5\" fill=\"${c}\" opacity=\"0.4\"/>\n <image href=\"${LOGO}\" x=\"14\" y=\"14\" width=\"52\" height=\"52\"/>\n </svg>`,\n };\n\n return (svgMap[preset] || svgMap.friendly)(accent);\n}\n\n// ─── Persona resolution ──────────────────────────────────────\n\nexport interface ResolvedPersona {\n name: string;\n /** SVG string, or URL to Lottie/GIF/image */\n avatar: string;\n /** How to render: inline SVG, or as img/lottie */\n renderType: \"svg-inline\" | \"image\" | \"lottie\";\n}\n\nexport function resolvePersona(\n persona: ZephyrPersona | undefined,\n accent: string\n): ResolvedPersona {\n // Built-in preset name\n if (typeof persona === \"string\") {\n const preset = persona as ZephyrPersonaPreset;\n if (preset in BUILT_IN_PERSONAS) {\n return {\n name: BUILT_IN_PERSONAS[preset].name,\n avatar: generatePersonaSVG(preset, accent),\n renderType: \"svg-inline\",\n };\n }\n // Treat as URL\n return { name: \"Custom\", avatar: persona, renderType: \"image\" };\n }\n\n // Custom persona object\n if (persona && typeof persona === \"object\") {\n const custom = persona as ZephyrCustomPersona;\n const type = custom.avatarType === \"lottie\" ? \"lottie\" :\n custom.avatarType === \"svg\" ? \"svg-inline\" : \"image\";\n return {\n name: custom.name,\n avatar: custom.avatar,\n renderType: type,\n };\n }\n\n // Default\n return {\n name: \"Zephyr Friendly\",\n avatar: generatePersonaSVG(\"friendly\", accent),\n renderType: \"svg-inline\",\n };\n}\n","/**\n * 🎬 Zephyr Animation System\n *\n * Open/close animations for the panel and trigger button effects.\n * All animations are pure CSS keyframes — no JS dependencies.\n */\n\nimport type { ZephyrOpenAnimation, ZephyrTriggerAnimation } from \"./config\";\n\n// ─── Panel open/close animations ─────────────────────────────\n\nexport interface AnimationKeyframes {\n open: string;\n close: string;\n}\n\nconst slideUp: AnimationKeyframes = {\n open: `\n @keyframes zephyr-slide-up-in {\n from { opacity: 0; transform: translateY(20px) scale(0.95); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n }`,\n close: `\n @keyframes zephyr-slide-up-out {\n from { opacity: 1; transform: translateY(0) scale(1); }\n to { opacity: 0; transform: translateY(20px) scale(0.95); }\n }`,\n};\n\nconst slideDown: AnimationKeyframes = {\n open: `\n @keyframes zephyr-slide-down-in {\n from { opacity: 0; transform: translateY(-20px) scale(0.95); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n }`,\n close: `\n @keyframes zephyr-slide-down-out {\n from { opacity: 1; transform: translateY(0) scale(1); }\n to { opacity: 0; transform: translateY(-20px) scale(0.95); }\n }`,\n};\n\nconst slideLeft: AnimationKeyframes = {\n open: `\n @keyframes zephyr-slide-left-in {\n from { opacity: 0; transform: translateX(20px) scale(0.95); }\n to { opacity: 1; transform: translateX(0) scale(1); }\n }`,\n close: `\n @keyframes zephyr-slide-left-out {\n from { opacity: 1; transform: translateX(0) scale(1); }\n to { opacity: 0; transform: translateX(20px) scale(0.95); }\n }`,\n};\n\nconst slideRight: AnimationKeyframes = {\n open: `\n @keyframes zephyr-slide-right-in {\n from { opacity: 0; transform: translateX(-20px) scale(0.95); }\n to { opacity: 1; transform: translateX(0) scale(1); }\n }`,\n close: `\n @keyframes zephyr-slide-right-out {\n from { opacity: 1; transform: translateX(0) scale(1); }\n to { opacity: 0; transform: translateX(-20px) scale(0.95); }\n }`,\n};\n\nconst fade: AnimationKeyframes = {\n open: `\n @keyframes zephyr-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }`,\n close: `\n @keyframes zephyr-fade-out {\n from { opacity: 1; }\n to { opacity: 0; }\n }`,\n};\n\nconst scale: AnimationKeyframes = {\n open: `\n @keyframes zephyr-scale-in {\n from { opacity: 0; transform: scale(0.6); }\n to { opacity: 1; transform: scale(1); }\n }`,\n close: `\n @keyframes zephyr-scale-out {\n from { opacity: 1; transform: scale(1); }\n to { opacity: 0; transform: scale(0.6); }\n }`,\n};\n\nconst bounce: AnimationKeyframes = {\n open: `\n @keyframes zephyr-bounce-in {\n 0% { opacity: 0; transform: scale(0.3); }\n 50% { opacity: 1; transform: scale(1.08); }\n 70% { transform: scale(0.95); }\n 100% { transform: scale(1); }\n }`,\n close: `\n @keyframes zephyr-bounce-out {\n 0% { opacity: 1; transform: scale(1); }\n 30% { transform: scale(1.05); }\n 100% { opacity: 0; transform: scale(0.3); }\n }`,\n};\n\nconst none: AnimationKeyframes = { open: \"\", close: \"\" };\n\nexport const OPEN_ANIMATIONS: Record<ZephyrOpenAnimation, AnimationKeyframes> =\n {\n \"slide-up\": slideUp,\n \"slide-down\": slideDown,\n \"slide-left\": slideLeft,\n \"slide-right\": slideRight,\n fade,\n scale,\n bounce,\n none,\n };\n\n// ─── Trigger button animations ───────────────────────────────\n\nexport const TRIGGER_ANIMATIONS: Record<ZephyrTriggerAnimation, string> = {\n float: `\n @keyframes zephyr-float {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-6px); }\n }`,\n pulse: `\n @keyframes zephyr-pulse {\n 0%, 100% { box-shadow: 0 0 0 0 var(--zephyr-accent); }\n 50% { box-shadow: 0 0 0 10px transparent; }\n }`,\n bounce: `\n @keyframes zephyr-trigger-bounce {\n 0%, 20%, 50%, 80%, 100% { transform: translateY(0); }\n 40% { transform: translateY(-8px); }\n 60% { transform: translateY(-4px); }\n }`,\n glow: `\n @keyframes zephyr-glow {\n 0%, 100% { box-shadow: 0 0 8px 0 var(--zephyr-accent); }\n 50% { box-shadow: 0 0 20px 4px var(--zephyr-accent); }\n }`,\n none: \"\",\n};\n\n// ─── Helpers ─────────────────────────────────────────────────\n\n/** Get CSS keyframes for a given open animation preset */\nexport function getOpenAnimationCSS(preset: ZephyrOpenAnimation): string {\n const anim = OPEN_ANIMATIONS[preset] || OPEN_ANIMATIONS[\"slide-up\"];\n return `${anim.open}\\n${anim.close}`;\n}\n\n/** Get animation name for panel open */\nexport function getOpenAnimationName(preset: ZephyrOpenAnimation): string {\n if (preset === \"none\") return \"none\";\n return `zephyr-${preset}-in`;\n}\n\n/** Get animation name for panel close */\nexport function getCloseAnimationName(preset: ZephyrOpenAnimation): string {\n if (preset === \"none\") return \"none\";\n return `zephyr-${preset}-out`;\n}\n\n/** Get CSS keyframes for a given trigger animation preset */\nexport function getTriggerAnimationCSS(\n preset: ZephyrTriggerAnimation\n): string {\n return TRIGGER_ANIMATIONS[preset] || \"\";\n}\n\n/** Get animation name for trigger */\nexport function getTriggerAnimationName(\n preset: ZephyrTriggerAnimation\n): string {\n if (preset === \"none\") return \"none\";\n const map: Record<string, string> = {\n float: \"zephyr-float\",\n pulse: \"zephyr-pulse\",\n bounce: \"zephyr-trigger-bounce\",\n glow: \"zephyr-glow\",\n };\n return map[preset] || \"none\";\n}\n","/**\n * 🎨 Zephyr CSS Styles\n *\n * All styles use CSS custom properties (--zephyr-*) set by the theme system.\n * No external CSS dependencies.\n */\n\n/** Core widget styles — injected once per page */\nexport const ZEPHYR_STYLES = `\n/* ─── Root ──────────────────────────────────────────────────── */\n.zephyr-root {\n --zephyr-accent: #ff6b35;\n --zephyr-bg: #0f0f1a;\n --zephyr-surface: #1a1a2e;\n --zephyr-text: #e8e8f0;\n --zephyr-muted: #6b6b80;\n --zephyr-border: #2a2a40;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Inter, system-ui, sans-serif;\n font-size: 14px;\n line-height: 1.5;\n box-sizing: border-box;\n color: var(--zephyr-text);\n}\n.zephyr-root *, .zephyr-root *::before, .zephyr-root *::after {\n box-sizing: inherit;\n}\n\n/* ─── Trigger button ────────────────────────────────────────── */\n.zephyr-trigger {\n position: fixed;\n width: 56px;\n height: 56px;\n border-radius: 50%;\n border: 2px solid var(--zephyr-accent);\n background: var(--zephyr-surface);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.25);\n transition: transform 0.25s ease, box-shadow 0.25s ease;\n outline: none;\n}\n.zephyr-trigger:hover {\n transform: scale(1.08);\n box-shadow: 0 6px 28px rgba(0, 0, 0, 0.35);\n}\n.zephyr-trigger:focus-visible {\n outline: 2px solid var(--zephyr-accent);\n outline-offset: 3px;\n}\n.zephyr-trigger.zephyr-sm { width: 44px; height: 44px; }\n.zephyr-trigger.zephyr-lg { width: 68px; height: 68px; }\n.zephyr-trigger.zephyr-open { animation: none !important; }\n\n.zephyr-trigger-avatar {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.zephyr-trigger-avatar svg { width: 100%; height: 100%; }\n.zephyr-trigger-avatar img { width: 100%; height: 100%; object-fit: contain; border-radius: 50%; }\n\n/* ─── Positions ─────────────────────────────────────────────── */\n.zephyr-pos-br .zephyr-trigger { bottom: 24px; right: 24px; }\n.zephyr-pos-bl .zephyr-trigger { bottom: 24px; left: 24px; }\n.zephyr-pos-tr .zephyr-trigger { top: 24px; right: 24px; }\n.zephyr-pos-tl .zephyr-trigger { top: 24px; left: 24px; }\n\n.zephyr-pos-br .zephyr-panel { bottom: 92px; right: 24px; }\n.zephyr-pos-bl .zephyr-panel { bottom: 92px; left: 24px; }\n.zephyr-pos-tr .zephyr-panel { top: 92px; right: 24px; }\n.zephyr-pos-tl .zephyr-panel { top: 92px; left: 24px; }\n\n/* ─── Badge ─────────────────────────────────────────────────── */\n.zephyr-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n background: #ff4757;\n color: #fff;\n font-size: 10px;\n font-weight: 700;\n min-width: 18px;\n height: 18px;\n border-radius: 9px;\n display: none;\n align-items: center;\n justify-content: center;\n padding: 0 4px;\n}\n.zephyr-badge.zephyr-has-count { display: flex; }\n\n/* ─── Backdrop ──────────────────────────────────────────────── */\n.zephyr-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.3s ease;\n}\n.zephyr-backdrop.zephyr-visible {\n opacity: 1;\n pointer-events: auto;\n}\n\n/* ─── Panel ─────────────────────────────────────────────────── */\n.zephyr-panel {\n position: fixed;\n width: var(--zephyr-panel-width, 380px);\n height: var(--zephyr-panel-height, 520px);\n max-height: calc(100vh - 140px);\n max-width: calc(100vw - 48px);\n background: var(--zephyr-bg);\n border: 1px solid var(--zephyr-border);\n border-radius: var(--zephyr-panel-radius, 16px);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n box-shadow: 0 8px 40px rgba(0, 0, 0, 0.35);\n opacity: 0;\n pointer-events: none;\n transform-origin: bottom right;\n}\n.zephyr-panel.zephyr-visible {\n opacity: 1;\n pointer-events: auto;\n}\n\n/* ─── Header ────────────────────────────────────────────────── */\n.zephyr-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n background: var(--zephyr-surface);\n border-bottom: 1px solid var(--zephyr-border);\n min-height: 56px;\n}\n.zephyr-header-avatar {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n overflow: hidden;\n flex-shrink: 0;\n}\n.zephyr-header-avatar svg { width: 100%; height: 100%; }\n.zephyr-header-avatar img { width: 100%; height: 100%; object-fit: contain; }\n.zephyr-header-info { flex: 1; min-width: 0; }\n.zephyr-header-title {\n font-size: 0.95rem;\n font-weight: 700;\n color: var(--zephyr-text);\n}\n.zephyr-header-sub {\n font-size: 0.75rem;\n color: var(--zephyr-muted);\n}\n.zephyr-close {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: var(--zephyr-muted);\n cursor: pointer;\n border-radius: 8px;\n font-size: 1.2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.2s, color 0.2s;\n}\n.zephyr-close:hover {\n background: var(--zephyr-border);\n color: var(--zephyr-text);\n}\n\n/* ─── Messages ──────────────────────────────────────────────── */\n.zephyr-messages {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n scroll-behavior: smooth;\n}\n.zephyr-messages::-webkit-scrollbar { width: 4px; }\n.zephyr-messages::-webkit-scrollbar-track { background: transparent; }\n.zephyr-messages::-webkit-scrollbar-thumb { background: var(--zephyr-border); border-radius: 2px; }\n\n.zephyr-msg {\n max-width: 85%;\n padding: 10px 14px;\n border-radius: 12px;\n font-size: 0.88rem;\n line-height: 1.55;\n word-break: break-word;\n}\n.zephyr-msg a { color: var(--zephyr-accent); text-decoration: underline; }\n.zephyr-msg code {\n background: rgba(255, 255, 255, 0.08);\n padding: 1px 5px;\n border-radius: 4px;\n font-size: 0.82rem;\n font-family: 'Fira Code', 'Cascadia Code', monospace;\n}\n.zephyr-msg pre {\n background: rgba(0, 0, 0, 0.3);\n padding: 10px;\n border-radius: 8px;\n overflow-x: auto;\n margin: 6px 0;\n}\n.zephyr-msg pre code { background: none; padding: 0; }\n\n.zephyr-msg.zephyr-user {\n align-self: flex-end;\n background: var(--zephyr-user-bubble);\n color: var(--zephyr-user-text);\n border-bottom-right-radius: 4px;\n}\n.zephyr-msg.zephyr-bot {\n align-self: flex-start;\n background: var(--zephyr-bot-bubble, var(--zephyr-surface));\n color: var(--zephyr-bot-text, var(--zephyr-text));\n border-bottom-left-radius: 4px;\n}\n.zephyr-msg.zephyr-system {\n align-self: center;\n background: transparent;\n color: var(--zephyr-muted);\n font-size: 0.8rem;\n font-style: italic;\n}\n\n/* ─── Typing indicator ──────────────────────────────────────── */\n.zephyr-typing {\n display: flex;\n gap: 4px;\n padding: 10px 14px;\n align-self: flex-start;\n}\n.zephyr-typing span {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: var(--zephyr-muted);\n animation: zephyr-typing-dot 1.4s infinite ease-in-out;\n}\n.zephyr-typing span:nth-child(2) { animation-delay: 0.2s; }\n.zephyr-typing span:nth-child(3) { animation-delay: 0.4s; }\n@keyframes zephyr-typing-dot {\n 0%, 80%, 100% { transform: scale(0.6); opacity: 0.4; }\n 40% { transform: scale(1); opacity: 1; }\n}\n\n/* ─── Suggestions ───────────────────────────────────────────── */\n.zephyr-suggestions {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n padding: 0 16px 8px;\n}\n.zephyr-suggestion {\n background: var(--zephyr-surface);\n border: 1px solid var(--zephyr-border);\n color: var(--zephyr-accent);\n padding: 5px 12px;\n border-radius: 16px;\n font-size: 0.78rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n line-height: 1.3;\n}\n.zephyr-suggestion:hover {\n background: var(--zephyr-accent);\n color: #fff;\n border-color: var(--zephyr-accent);\n}\n\n/* ─── Input ─────────────────────────────────────────────────── */\n.zephyr-input-wrap {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n padding: 12px 16px;\n border-top: 1px solid var(--zephyr-border);\n background: var(--zephyr-surface);\n}\n.zephyr-input {\n flex: 1;\n background: var(--zephyr-bg);\n border: 1px solid var(--zephyr-border);\n color: var(--zephyr-text);\n padding: 8px 12px;\n border-radius: 10px;\n font-size: 0.88rem;\n font-family: inherit;\n resize: none;\n max-height: 80px;\n outline: none;\n transition: border-color 0.2s;\n}\n.zephyr-input::placeholder { color: var(--zephyr-muted); }\n.zephyr-input:focus { border-color: var(--zephyr-accent); }\n\n.zephyr-send {\n width: 36px;\n height: 36px;\n border: none;\n border-radius: 10px;\n background: var(--zephyr-accent);\n color: #fff;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1rem;\n flex-shrink: 0;\n transition: background 0.2s, transform 0.15s;\n}\n.zephyr-send:hover { filter: brightness(1.1); transform: scale(1.05); }\n.zephyr-send:active { transform: scale(0.95); }\n\n/* ─── Responsive ────────────────────────────────────────────── */\n@media (max-width: 480px) {\n .zephyr-panel {\n width: calc(100vw - 16px) !important;\n height: calc(100vh - 80px) !important;\n max-height: none;\n bottom: 8px !important;\n right: 8px !important;\n left: 8px !important;\n border-radius: 12px !important;\n }\n}\n`;\n\nlet injected = false;\n\n/** Inject the core styles into the document head (idempotent) */\nexport function injectStyles(\n extraCSS?: string,\n animationCSS?: string\n): void {\n if (typeof document === \"undefined\") return;\n if (injected) return;\n\n const style = document.createElement(\"style\");\n style.id = \"zephyr-styles\";\n style.textContent = ZEPHYR_STYLES + (animationCSS || \"\") + (extraCSS || \"\");\n document.head.appendChild(style);\n injected = true;\n}\n\n/** Update or append extra CSS (for runtime changes) */\nexport function updateExtraCSS(css: string): void {\n if (typeof document === \"undefined\") return;\n\n let el = document.getElementById(\"zephyr-extra-styles\") as HTMLStyleElement;\n if (!el) {\n el = document.createElement(\"style\");\n el.id = \"zephyr-extra-styles\";\n document.head.appendChild(el);\n }\n el.textContent = css;\n}\n","/**\n * 🔌 Zephyr WebSocket Client\n *\n * Handles connection to the Zephyr backend with auto-reconnect,\n * session management, and typed events.\n */\n\nexport interface ZephyrWSMessage {\n type: \"welcome\" | \"status\" | \"response\" | \"error\";\n session_id?: string;\n message?: string;\n expression?: string;\n suggestions?: string[];\n mode?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface ZephyrWSOptions {\n server: string;\n apiKey?: string;\n sessionId?: string;\n onMessage: (msg: ZephyrWSMessage) => void;\n onError?: (err: Event | Error) => void;\n onConnect?: () => void;\n onDisconnect?: () => void;\n reconnectDelay?: number;\n maxReconnectAttempts?: number;\n}\n\nexport class ZephyrWSClient {\n private ws: WebSocket | null = null;\n private options: Required<ZephyrWSOptions>;\n private sessionId: string = \"\";\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private destroyed = false;\n\n constructor(options: ZephyrWSOptions) {\n this.options = {\n reconnectDelay: 3000,\n maxReconnectAttempts: 10,\n onError: () => {},\n onConnect: () => {},\n onDisconnect: () => {},\n apiKey: \"\",\n sessionId: \"\",\n ...options,\n };\n if (options.sessionId) this.sessionId = options.sessionId;\n }\n\n /** Connect to the WebSocket server */\n connect(): void {\n if (this.destroyed) return;\n if (!this.options.server) {\n console.warn(\"[Zephyr] No server URL configured.\");\n return;\n }\n\n const base = this.options.server.replace(/\\/$/, \"\");\n const protocol = base.startsWith(\"https\") ? \"wss:\" : \"ws:\";\n const host = base.replace(/^https?:\\/\\//, \"\");\n const params = new URLSearchParams();\n if (this.sessionId) params.set(\"session_id\", this.sessionId);\n if (this.options.apiKey) params.set(\"api_key\", this.options.apiKey);\n\n const url = `${protocol}//${host}/ws/chat?${params.toString()}`;\n\n try {\n this.ws = new WebSocket(url);\n } catch (err) {\n this.options.onError(err as Error);\n this.scheduleReconnect();\n return;\n }\n\n this.ws.onopen = () => {\n this.reconnectAttempts = 0;\n this.options.onConnect();\n };\n\n this.ws.onmessage = (event) => {\n try {\n const data: ZephyrWSMessage = JSON.parse(event.data);\n if (data.session_id) this.sessionId = data.session_id;\n this.options.onMessage(data);\n } catch {\n // Ignore non-JSON messages\n }\n };\n\n this.ws.onclose = () => {\n this.options.onDisconnect();\n this.scheduleReconnect();\n };\n\n this.ws.onerror = (e) => {\n this.options.onError(e);\n };\n }\n\n /** Send a chat message */\n send(message: string, metadata?: Record<string, unknown>): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\n this.ws.send(\n JSON.stringify({\n message,\n session_id: this.sessionId,\n ...metadata,\n })\n );\n }\n\n /** Get current session ID */\n getSessionId(): string {\n return this.sessionId;\n }\n\n /** Check if connected */\n isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n /** Disconnect and cleanup */\n destroy(): void {\n this.destroyed = true;\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n if (this.ws) {\n this.ws.onclose = null;\n this.ws.onerror = null;\n this.ws.close();\n this.ws = null;\n }\n }\n\n private scheduleReconnect(): void {\n if (this.destroyed) return;\n if (this.reconnectAttempts >= this.options.maxReconnectAttempts) return;\n this.reconnectAttempts++;\n this.reconnectTimer = setTimeout(\n () => this.connect(),\n this.options.reconnectDelay\n );\n }\n}\n","/**\n * 🦊 Zephyr Widget — Core engine\n *\n * Framework-agnostic widget that can be used standalone or wrapped\n * by React/Vue components. Handles DOM rendering, WebSocket, animations.\n */\n\nimport type { ZephyrConfig, ZephyrLogo, ZephyrPersona, ZephyrOpenAnimation, ZephyrTriggerAnimation } from \"./config\";\nimport { resolveConfig, ZEPHYR_DEFAULTS } from \"./config\";\nimport { resolveTheme, themeToCSSVars } from \"./themes\";\nimport { resolveLogo, type ResolvedLogo } from \"./logos\";\nimport { resolvePersona, type ResolvedPersona } from \"./personas\";\nimport {\n getOpenAnimationCSS,\n getOpenAnimationName,\n getCloseAnimationName,\n getTriggerAnimationCSS,\n getTriggerAnimationName,\n} from \"./animations\";\nimport { injectStyles, updateExtraCSS } from \"./styles\";\nimport { ZephyrWSClient, type ZephyrWSMessage } from \"./ws-client\";\n\n// ─── Types ───────────────────────────────────────────────────\n\nexport interface ZephyrMessage {\n role: \"user\" | \"bot\" | \"system\";\n text: string;\n expression?: string;\n timestamp: number;\n}\n\nexport interface ZephyrWidgetEvents {\n onReady?: () => void;\n onMessage?: (msg: ZephyrMessage) => void;\n onError?: (err: { message: string }) => void;\n onToggle?: (open: boolean) => void;\n}\n\n// ─── Widget ──────────────────────────────────────────────────\n\nexport class ZephyrWidget {\n private config: ReturnType<typeof resolveConfig>;\n private events: ZephyrWidgetEvents;\n private el: HTMLElement | null = null;\n private wsClient: ZephyrWSClient | null = null;\n private isOpen = false;\n private messages: ZephyrMessage[] = [];\n private logo: ResolvedLogo;\n private persona: ResolvedPersona;\n private mounted = false;\n\n constructor(userConfig: ZephyrConfig, events: ZephyrWidgetEvents = {}) {\n this.config = resolveConfig(userConfig);\n this.events = events;\n this.logo = resolveLogo(this.config.logo, this.config.accentColor);\n this.persona = resolvePersona(this.config.persona, this.config.accentColor);\n }\n\n // ─── Lifecycle ────────────────────────────────────────────\n\n /** Mount the widget to the DOM */\n mount(container?: HTMLElement | string | null): void {\n if (this.mounted) return;\n\n // Inject CSS\n const animCSS = [\n getOpenAnimationCSS(this.config.openAnimation),\n getTriggerAnimationCSS(this.config.triggerAnimation),\n ].join(\"\\n\");\n injectStyles(this.config.customCSS, animCSS);\n\n // Create root element\n this.el = document.createElement(\"div\");\n this.el.className = `zephyr-root ${this.positionClass()}`;\n this.el.setAttribute(\"data-zephyr\", \"\");\n this.applyThemeVars();\n this.applyPanelVars();\n\n // Render HTML\n this.el.innerHTML = this.renderHTML();\n\n // Mount to target\n const target = typeof container === \"string\"\n ? document.querySelector(container)\n : container || document.body;\n target?.appendChild(this.el);\n\n // Bind events\n this.bindEvents();\n\n // Connect WebSocket\n this.connectWS();\n\n // Start open?\n if (this.config.startOpen) {\n requestAnimationFrame(() => this.open());\n }\n\n this.mounted = true;\n this.events.onReady?.();\n }\n\n /** Destroy the widget and clean up */\n destroy(): void {\n this.wsClient?.destroy();\n this.el?.remove();\n this.el = null;\n this.mounted = false;\n }\n\n // ─── Public API ───────────────────────────────────────────\n\n open(): void {\n this.setOpenState(true);\n }\n\n close(): void {\n this.setOpenState(false);\n }\n\n toggle(): void {\n this.setOpenState(!this.isOpen);\n }\n\n /** Send a message programmatically */\n send(text: string): void {\n if (!text.trim()) return;\n this.addMessage(\"user\", text);\n this.wsClient?.send(text);\n }\n\n /** Change theme at runtime */\n setTheme(theme: ZephyrConfig[\"theme\"]): void {\n this.config = { ...this.config, theme: theme || \"dark\" };\n this.applyThemeVars();\n }\n\n /** Change logo at runtime */\n setLogo(logo: ZephyrLogo): void {\n this.config = { ...this.config, logo };\n this.logo = resolveLogo(logo, this.config.accentColor);\n this.updateAvatars();\n }\n\n /** Change persona at runtime */\n setPersona(persona: ZephyrPersona): void {\n this.config = { ...this.config, persona };\n this.persona = resolvePersona(persona, this.config.accentColor);\n this.updateChatAvatar();\n }\n\n /** Change accent color at runtime */\n setAccentColor(color: string): void {\n this.config = { ...this.config, accentColor: color };\n this.logo = resolveLogo(this.config.logo, color);\n this.persona = resolvePersona(this.config.persona, color);\n this.el?.style.setProperty(\"--zephyr-accent\", color);\n this.updateAvatars();\n this.updateChatAvatar();\n }\n\n /** Change open animation */\n setOpenAnimation(anim: ZephyrOpenAnimation): void {\n this.config = { ...this.config, openAnimation: anim };\n const css = getOpenAnimationCSS(anim);\n updateExtraCSS(css);\n }\n\n /** Change trigger animation */\n setTriggerAnimation(anim: ZephyrTriggerAnimation): void {\n this.config = { ...this.config, triggerAnimation: anim };\n const trigger = this.el?.querySelector(\".zephyr-trigger\") as HTMLElement;\n if (trigger) {\n const name = getTriggerAnimationName(anim);\n trigger.style.animation = name === \"none\" ? \"none\" : `${name} 3s ease-in-out infinite`;\n }\n }\n\n /** Get message history */\n getMessages(): ZephyrMessage[] {\n return [...this.messages];\n }\n\n /** Check if panel is open */\n getIsOpen(): boolean {\n return this.isOpen;\n }\n\n // ─── Private: Rendering ───────────────────────────────────\n\n private renderHTML(): string {\n const sizeClass = `zephyr-${this.config.panel.size || \"md\"}`;\n const triggerAnimName = getTriggerAnimationName(this.config.triggerAnimation);\n const triggerAnimCSS = triggerAnimName === \"none\"\n ? \"\"\n : `animation: ${triggerAnimName} 3s ease-in-out infinite;`;\n\n const ph = this.config.placeholder ||\n (this.config.language === \"fr\" ? \"Posez une question...\" : \"Ask a question...\");\n\n const triggerContent = `<img src=\"${this.escapeAttr(this.logo.trigger)}\" alt=\"${this.escapeAttr(this.logo.alt)}\" />`;\n const headerContent = `<img src=\"${this.escapeAttr(this.logo.header)}\" alt=\"${this.escapeAttr(this.logo.alt)}\" />`;\n\n const backdrop = this.config.panel.backdrop\n ? `<div class=\"zephyr-backdrop\"></div>`\n : \"\";\n\n return `\n ${backdrop}\n <button class=\"zephyr-trigger ${sizeClass}\" style=\"${triggerAnimCSS}\" aria-label=\"Zephyr Assistant\">\n <div class=\"zephyr-trigger-avatar\">${triggerContent}</div>\n ${this.config.showBadge ? '<div class=\"zephyr-badge\"></div>' : \"\"}\n </button>\n <div class=\"zephyr-panel\">\n <div class=\"zephyr-header\">\n <div class=\"zephyr-header-avatar\">${headerContent}</div>\n <div class=\"zephyr-header-info\">\n <div class=\"zephyr-header-title\">Zephyr</div>\n <div class=\"zephyr-header-sub\">${\n this.config.language === \"fr\" ? \"Assistant Navigation\" : \"Navigation Assistant\"\n }</div>\n </div>\n <button class=\"zephyr-close\" aria-label=\"${this.config.language === \"fr\" ? \"Fermer\" : \"Close\"}\">✕</button>\n </div>\n <div class=\"zephyr-messages\"></div>\n <div class=\"zephyr-suggestions\"></div>\n <div class=\"zephyr-input-wrap\">\n <textarea class=\"zephyr-input\" rows=\"1\" placeholder=\"${this.escapeAttr(ph)}\"></textarea>\n <button class=\"zephyr-send\" aria-label=\"${this.config.language === \"fr\" ? \"Envoyer\" : \"Send\"}\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\"/>\n </svg>\n </button>\n </div>\n </div>\n `;\n }\n\n private bindEvents(): void {\n if (!this.el) return;\n const trigger = this.el.querySelector(\".zephyr-trigger\")!;\n const close = this.el.querySelector(\".zephyr-close\")!;\n const input = this.el.querySelector(\".zephyr-input\") as HTMLTextAreaElement;\n const send = this.el.querySelector(\".zephyr-send\")!;\n const backdrop = this.el.querySelector(\".zephyr-backdrop\");\n\n trigger.addEventListener(\"click\", () => this.toggle());\n close.addEventListener(\"click\", () => this.close());\n backdrop?.addEventListener(\"click\", () => this.close());\n\n send.addEventListener(\"click\", () => {\n this.send(input.value);\n input.value = \"\";\n input.style.height = \"auto\";\n });\n\n input.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n this.send(input.value);\n input.value = \"\";\n input.style.height = \"auto\";\n }\n });\n\n input.addEventListener(\"input\", () => {\n input.style.height = \"auto\";\n input.style.height = Math.min(input.scrollHeight, 80) + \"px\";\n });\n }\n\n // ─── Private: State ───────────────────────────────────────\n\n private setOpenState(open: boolean): void {\n if (this.isOpen === open) return;\n this.isOpen = open;\n\n const panel = this.el?.querySelector(\".zephyr-panel\") as HTMLElement;\n const trigger = this.el?.querySelector(\".zephyr-trigger\") as HTMLElement;\n const backdrop = this.el?.querySelector(\".zephyr-backdrop\") as HTMLElement;\n\n if (!panel) return;\n\n if (open) {\n panel.classList.add(\"zephyr-visible\");\n const animName = getOpenAnimationName(this.config.openAnimation);\n if (animName !== \"none\") {\n panel.style.animation = `${animName} 0.3s ease-out forwards`;\n }\n trigger?.classList.add(\"zephyr-open\");\n backdrop?.classList.add(\"zephyr-visible\");\n setTimeout(() => {\n (this.el?.querySelector(\".zephyr-input\") as HTMLTextAreaElement)?.focus();\n }, 200);\n } else {\n const animName = getCloseAnimationName(this.config.openAnimation);\n if (animName !== \"none\") {\n panel.style.animation = `${animName} 0.2s ease-in forwards`;\n panel.addEventListener(\"animationend\", () => {\n panel.classList.remove(\"zephyr-visible\");\n panel.style.animation = \"\";\n }, { once: true });\n } else {\n panel.classList.remove(\"zephyr-visible\");\n }\n trigger?.classList.remove(\"zephyr-open\");\n backdrop?.classList.remove(\"zephyr-visible\");\n }\n\n this.events.onToggle?.(open);\n }\n\n // ─── Private: Messages ────────────────────────────────────\n\n private addMessage(role: ZephyrMessage[\"role\"], text: string, expression?: string): void {\n const msg: ZephyrMessage = { role, text, expression, timestamp: Date.now() };\n this.messages.push(msg);\n\n const container = this.el?.querySelector(\".zephyr-messages\");\n if (!container) return;\n\n const div = document.createElement(\"div\");\n div.className = `zephyr-msg zephyr-${role}`;\n div.innerHTML = this.renderMarkdown(text);\n container.appendChild(div);\n container.scrollTop = container.scrollHeight;\n\n this.events.onMessage?.(msg);\n }\n\n private showTyping(): void {\n const container = this.el?.querySelector(\".zephyr-messages\");\n if (!container || container.querySelector(\".zephyr-typing\")) return;\n const typing = document.createElement(\"div\");\n typing.className = \"zephyr-typing\";\n typing.innerHTML = \"<span></span><span></span><span></span>\";\n container.appendChild(typing);\n container.scrollTop = container.scrollHeight;\n }\n\n private hideTyping(): void {\n this.el?.querySelector(\".zephyr-typing\")?.remove();\n }\n\n private showSuggestions(items: string[]): void {\n const container = this.el?.querySelector(\".zephyr-suggestions\");\n if (!container) return;\n container.innerHTML = items\n .map((s) => `<button class=\"zephyr-suggestion\">${this.escapeHTML(s)}</button>`)\n .join(\"\");\n container.querySelectorAll(\".zephyr-suggestion\").forEach((btn) => {\n btn.addEventListener(\"click\", () => {\n this.send(btn.textContent || \"\");\n container.innerHTML = \"\";\n });\n });\n }\n\n // ─── Private: Theme & Avatars ─────────────────────────────\n\n private applyThemeVars(): void {\n if (!this.el) return;\n const resolved = resolveTheme(this.config.theme);\n const vars = themeToCSSVars(resolved, this.config.accentColor);\n for (const [key, val] of Object.entries(vars)) {\n this.el.style.setProperty(key, val);\n }\n }\n\n private applyPanelVars(): void {\n if (!this.el) return;\n const p = this.config.panel;\n this.el.style.setProperty(\"--zephyr-panel-width\", `${p.width}px`);\n this.el.style.setProperty(\"--zephyr-panel-height\", `${p.height}px`);\n this.el.style.setProperty(\"--zephyr-panel-radius\", `${p.borderRadius}px`);\n this.el.style.setProperty(\"z-index\", String(p.zIndex));\n }\n\n private positionClass(): string {\n const map: Record<string, string> = {\n \"bottom-right\": \"zephyr-pos-br\",\n \"bottom-left\": \"zephyr-pos-bl\",\n \"top-right\": \"zephyr-pos-tr\",\n \"top-left\": \"zephyr-pos-tl\",\n };\n return map[this.config.panel.position] || \"zephyr-pos-br\";\n }\n\n private updateAvatars(): void {\n if (!this.el) return;\n const content = `<img src=\"${this.escapeAttr(this.logo.trigger)}\" alt=\"${this.escapeAttr(this.logo.alt)}\" />`;\n const headerContent = `<img src=\"${this.escapeAttr(this.logo.header)}\" alt=\"${this.escapeAttr(this.logo.alt)}\" />`;\n\n const triggerAv = this.el.querySelector(\".zephyr-trigger-avatar\");\n const headerAv = this.el.querySelector(\".zephyr-header-avatar\");\n if (triggerAv) triggerAv.innerHTML = content;\n if (headerAv) headerAv.innerHTML = headerContent;\n }\n\n private updateChatAvatar(): void {\n // Persona affects the header avatar in the chat\n const headerAv = this.el?.querySelector(\".zephyr-header-avatar\");\n if (!headerAv) return;\n if (this.persona.renderType === \"svg-inline\") {\n headerAv.innerHTML = this.persona.avatar;\n } else {\n headerAv.innerHTML = `<img src=\"${this.escapeAttr(this.persona.avatar)}\" alt=\"${this.escapeAttr(this.persona.name)}\" />`;\n }\n }\n\n // ─── Private: WebSocket ───────────────────────────────────\n\n private connectWS(): void {\n this.wsClient = new ZephyrWSClient({\n server: this.config.server,\n apiKey: this.config.apiKey,\n onMessage: (msg) => this.handleWSMessage(msg),\n onError: (err) => {\n this.events.onError?.({ message: err instanceof Error ? err.message : \"WebSocket error\" });\n },\n });\n this.wsClient.connect();\n }\n\n private handleWSMessage(msg: ZephyrWSMessage): void {\n switch (msg.type) {\n case \"welcome\":\n this.addMessage(\"bot\", this.config.greeting || msg.message || \"Bonjour !\", msg.expression);\n break;\n case \"status\":\n this.showTyping();\n break;\n case \"response\":\n this.hideTyping();\n this.addMessage(\"bot\", msg.message || \"\", msg.expression);\n if (msg.suggestions?.length) this.showSuggestions(msg.suggestions);\n break;\n case \"error\":\n this.hideTyping();\n this.addMessage(\"system\", msg.message || \"Erreur\", \"surprised\");\n this.events.onError?.({ message: msg.message || \"Error\" });\n break;\n }\n }\n\n // ─── Private: Utilities ───────────────────────────────────\n\n private renderMarkdown(text: string): string {\n if (!text) return \"\";\n let html = this.escapeHTML(text);\n html = html.replace(/```(\\w*)\\n([\\s\\S]*?)```/g, \"<pre><code>$2</code></pre>\");\n html = html.replace(/`([^`]+)`/g, \"<code>$1</code>\");\n html = html.replace(/\\*\\*(.+?)\\*\\*/g, \"<strong>$1</strong>\");\n html = html.replace(/\\*(.+?)\\*/g, \"<em>$1</em>\");\n html = html.replace(/^[-•] (.+)$/gm, \"<li>$1</li>\");\n html = html.replace(/(<li>.*<\\/li>\\n?)+/g, \"<ul>$&</ul>\");\n html = html.replace(/\\n/g, \"<br>\");\n return html;\n }\n\n private escapeHTML(text: string): string {\n const div = document.createElement(\"div\");\n div.textContent = text;\n return div.innerHTML;\n }\n\n private escapeAttr(text: string): string {\n return text.replace(/\"/g, \"&quot;\").replace(/'/g, \"&#39;\");\n }\n}\n"],"names":["ZEPHYR_LOGO_B64","resolveLogo","logo","_accentColor","BUILT_IN_PERSONAS","EXPRESSIONS","generatePersonaSVG","preset","accent","expression","LOGO","svgMap","c","resolvePersona","persona","custom","type","slideUp","slideDown","slideLeft","slideRight","fade","scale","bounce","none","OPEN_ANIMATIONS","TRIGGER_ANIMATIONS","getOpenAnimationCSS","anim","getOpenAnimationName","getCloseAnimationName","getTriggerAnimationCSS","getTriggerAnimationName","ZEPHYR_STYLES","injected","injectStyles","extraCSS","animationCSS","style","updateExtraCSS","css","el","ZephyrWSClient","options","base","protocol","host","params","url","err","event","data","e","message","metadata","_a","ZephyrWidget","userConfig","events","resolveConfig","container","animCSS","target","_b","text","theme","color","trigger","name","sizeClass","triggerAnimName","triggerAnimCSS","ph","triggerContent","headerContent","close","input","send","backdrop","open","panel","_c","animName","_e","_d","role","msg","div","typing","items","btn","resolved","resolveTheme","vars","themeToCSSVars","key","val","p","content","triggerAv","headerAv","html"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,86 @@
1
+ {
2
+ "name": "@zantopia/zephyr-ui",
3
+ "version": "0.1.0",
4
+ "description": "Zephyr — Embeddable AI assistant widget. Import <Zephyr /> into any React/Vue/JS project.",
5
+ "type": "module",
6
+ "main": "dist/zephyr.umd.cjs",
7
+ "module": "dist/zephyr.es.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/zephyr.es.js",
12
+ "require": "./dist/zephyr.umd.cjs",
13
+ "types": "./dist/index.d.ts"
14
+ },
15
+ "./react": {
16
+ "import": "./dist/react/index.js",
17
+ "types": "./dist/react/index.d.ts"
18
+ },
19
+ "./vue": {
20
+ "import": "./dist/vue/index.js",
21
+ "types": "./dist/vue/index.d.ts"
22
+ },
23
+ "./config": {
24
+ "import": "./dist/core/config.js",
25
+ "types": "./dist/core/config.d.ts"
26
+ },
27
+ "./themes": {
28
+ "import": "./dist/core/themes.js",
29
+ "types": "./dist/core/themes.d.ts"
30
+ },
31
+ "./styles.css": "./dist/zephyr.css"
32
+ },
33
+ "files": [
34
+ "dist/",
35
+ "README.md"
36
+ ],
37
+ "scripts": {
38
+ "build": "vite build && vue-tsc --emitDeclarationOnly",
39
+ "dev": "vite build --watch",
40
+ "typecheck": "vue-tsc --noEmit",
41
+ "lint": "eslint src/",
42
+ "test": "vitest"
43
+ },
44
+ "peerDependencies": {
45
+ "react": ">=17.0.0",
46
+ "react-dom": ">=17.0.0",
47
+ "vue": ">=3.3.0"
48
+ },
49
+ "peerDependenciesMeta": {
50
+ "react": {
51
+ "optional": true
52
+ },
53
+ "react-dom": {
54
+ "optional": true
55
+ },
56
+ "vue": {
57
+ "optional": true
58
+ }
59
+ },
60
+ "devDependencies": {
61
+ "@types/react": "^19.2.14",
62
+ "@types/react-dom": "^19.2.3",
63
+ "@vitejs/plugin-react": "^4.3.0",
64
+ "@vitejs/plugin-vue": "^5.1.0",
65
+ "typescript": "^5.4.0",
66
+ "vite": "^5.4.0",
67
+ "vite-plugin-dts": "^3.9.0",
68
+ "vitest": "^2.0.0",
69
+ "vue-tsc": "^2.0.0"
70
+ },
71
+ "keywords": [
72
+ "zephyr",
73
+ "ai",
74
+ "widget",
75
+ "chat",
76
+ "assistant",
77
+ "navigation",
78
+ "react",
79
+ "vue"
80
+ ],
81
+ "license": "MIT",
82
+ "repository": {
83
+ "type": "git",
84
+ "url": "https://github.com/your-org/zephyr"
85
+ }
86
+ }