@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.
- package/README.md +267 -0
- package/dist/Zephyr-BupwOffR.js +118 -0
- package/dist/Zephyr-BupwOffR.js.map +1 -0
- package/dist/core/animations.d.ts +18 -0
- package/dist/core/config.d.ts +154 -0
- package/dist/core/config.js +41 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/logos.d.ts +30 -0
- package/dist/core/personas.d.ts +23 -0
- package/dist/core/styles.d.ts +12 -0
- package/dist/core/themes.d.ts +8 -0
- package/dist/core/themes.js +49 -0
- package/dist/core/themes.js.map +1 -0
- package/dist/core/widget.d.ts +70 -0
- package/dist/core/ws-client.d.ts +46 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/react/Zephyr.d.ts +116 -0
- package/dist/react/index.d.ts +2 -0
- package/dist/react/index.js +7 -0
- package/dist/react/index.js.map +1 -0
- package/dist/vanilla/init.d.ts +12 -0
- package/dist/vue/Zephyr.vue.d.ts +307 -0
- package/dist/vue/index.d.ts +1 -0
- package/dist/vue/index.js +119 -0
- package/dist/vue/index.js.map +1 -0
- package/dist/widget-BjgCJR9K.js +926 -0
- package/dist/widget-BjgCJR9K.js.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🦊 Zephyr Logo — Built-in logo asset
|
|
3
|
+
*
|
|
4
|
+
* Uses the official Zephyr fox image.
|
|
5
|
+
* Custom logos can be provided via config (URL or object).
|
|
6
|
+
*/
|
|
7
|
+
export type ZephyrLogoPreset = "zephyr-default";
|
|
8
|
+
/** Base64-encoded PNG of the official Zephyr logo (128x128) */
|
|
9
|
+
declare const ZEPHYR_LOGO_B64 = "data:image/png;base64,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";
|
|
10
|
+
export { ZEPHYR_LOGO_B64 };
|
|
11
|
+
export interface ResolvedLogo {
|
|
12
|
+
/** Image source for the trigger button */
|
|
13
|
+
trigger: string;
|
|
14
|
+
/** Image source for the chat header */
|
|
15
|
+
header: string;
|
|
16
|
+
/** True if the source is a URL/data-URI (use <img>), false if inline SVG */
|
|
17
|
+
isImage: true;
|
|
18
|
+
/** Alt text */
|
|
19
|
+
alt: string;
|
|
20
|
+
}
|
|
21
|
+
export type ZephyrLogo = ZephyrLogoPreset | string | {
|
|
22
|
+
trigger?: string;
|
|
23
|
+
header?: string;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Resolve a logo config value into concrete image sources.
|
|
27
|
+
* For now, all presets resolve to the same official image.
|
|
28
|
+
* Custom URLs or objects are passed through.
|
|
29
|
+
*/
|
|
30
|
+
export declare function resolveLogo(logo: ZephyrLogo | undefined, _accentColor?: string): ResolvedLogo;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ZephyrPersona, ZephyrPersonaPreset } from './config';
|
|
2
|
+
|
|
3
|
+
/** Expression states for animated personas */
|
|
4
|
+
export type ZephyrExpression = "neutral" | "happy" | "surprised" | "thinking" | "helping" | "speaking" | "wink";
|
|
5
|
+
export interface PersonaExpressionData {
|
|
6
|
+
eyeRx: number;
|
|
7
|
+
eyeRy: number;
|
|
8
|
+
mouth: string;
|
|
9
|
+
eyeArc?: boolean;
|
|
10
|
+
dots?: boolean;
|
|
11
|
+
winkLeft?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare const EXPRESSIONS: Record<ZephyrExpression, PersonaExpressionData>;
|
|
14
|
+
/** Generate persona SVG for a given preset + accent + expression */
|
|
15
|
+
export declare function generatePersonaSVG(preset: ZephyrPersonaPreset, accent: string, expression?: ZephyrExpression): string;
|
|
16
|
+
export interface ResolvedPersona {
|
|
17
|
+
name: string;
|
|
18
|
+
/** SVG string, or URL to Lottie/GIF/image */
|
|
19
|
+
avatar: string;
|
|
20
|
+
/** How to render: inline SVG, or as img/lottie */
|
|
21
|
+
renderType: "svg-inline" | "image" | "lottie";
|
|
22
|
+
}
|
|
23
|
+
export declare function resolvePersona(persona: ZephyrPersona | undefined, accent: string): ResolvedPersona;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🎨 Zephyr CSS Styles
|
|
3
|
+
*
|
|
4
|
+
* All styles use CSS custom properties (--zephyr-*) set by the theme system.
|
|
5
|
+
* No external CSS dependencies.
|
|
6
|
+
*/
|
|
7
|
+
/** Core widget styles — injected once per page */
|
|
8
|
+
export declare const ZEPHYR_STYLES = "\n/* \u2500\u2500\u2500 Root \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500\u2500 Trigger button \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500\u2500 Positions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500\u2500 Badge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500\u2500 Backdrop \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500\u2500 Panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500\u2500 Header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500\u2500 Messages \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500\u2500 Typing indicator \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500\u2500 Suggestions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500\u2500 Input \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500\u2500 Responsive \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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";
|
|
9
|
+
/** Inject the core styles into the document head (idempotent) */
|
|
10
|
+
export declare function injectStyles(extraCSS?: string, animationCSS?: string): void;
|
|
11
|
+
/** Update or append extra CSS (for runtime changes) */
|
|
12
|
+
export declare function updateExtraCSS(css: string): void;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ZephyrTheme, ZephyrCustomTheme } from './config';
|
|
2
|
+
|
|
3
|
+
export declare const THEME_DARK: ZephyrCustomTheme;
|
|
4
|
+
export declare const THEME_LIGHT: ZephyrCustomTheme;
|
|
5
|
+
export declare const BUILT_IN_THEMES: Record<string, ZephyrCustomTheme>;
|
|
6
|
+
export declare function resolveTheme(theme: ZephyrTheme): ZephyrCustomTheme;
|
|
7
|
+
/** Convert theme to CSS custom properties */
|
|
8
|
+
export declare function themeToCSSVars(theme: ZephyrCustomTheme, accentColor: string): Record<string, string>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const f = {
|
|
2
|
+
background: "#0f0f1a",
|
|
3
|
+
surface: "#1a1a2e",
|
|
4
|
+
text: "#e8e8f0",
|
|
5
|
+
muted: "#6b6b80",
|
|
6
|
+
border: "#2a2a40",
|
|
7
|
+
userBubble: "var(--zephyr-accent, #ff6b35)",
|
|
8
|
+
userText: "#ffffff",
|
|
9
|
+
botBubble: "#1e1e35",
|
|
10
|
+
botText: "#e8e8f0"
|
|
11
|
+
}, t = {
|
|
12
|
+
background: "#f5f5fa",
|
|
13
|
+
surface: "#ffffff",
|
|
14
|
+
text: "#1a1a2e",
|
|
15
|
+
muted: "#8888a0",
|
|
16
|
+
border: "#e0e0ee",
|
|
17
|
+
userBubble: "var(--zephyr-accent, #ff6b35)",
|
|
18
|
+
userText: "#ffffff",
|
|
19
|
+
botBubble: "#f0f0f8",
|
|
20
|
+
botText: "#1a1a2e"
|
|
21
|
+
}, b = {
|
|
22
|
+
dark: f,
|
|
23
|
+
light: t
|
|
24
|
+
};
|
|
25
|
+
function u(e) {
|
|
26
|
+
return typeof e == "object" ? e : e === "auto" ? typeof window < "u" && window.matchMedia("(prefers-color-scheme: dark)").matches ? f : t : b[e] || f;
|
|
27
|
+
}
|
|
28
|
+
function a(e, r) {
|
|
29
|
+
return {
|
|
30
|
+
"--zephyr-accent": r,
|
|
31
|
+
"--zephyr-bg": e.background,
|
|
32
|
+
"--zephyr-surface": e.surface,
|
|
33
|
+
"--zephyr-text": e.text,
|
|
34
|
+
"--zephyr-muted": e.muted,
|
|
35
|
+
"--zephyr-border": e.border,
|
|
36
|
+
"--zephyr-user-bubble": e.userBubble || r,
|
|
37
|
+
"--zephyr-user-text": e.userText || "#ffffff",
|
|
38
|
+
"--zephyr-bot-bubble": e.botBubble || e.surface,
|
|
39
|
+
"--zephyr-bot-text": e.botText || e.text
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export {
|
|
43
|
+
b as BUILT_IN_THEMES,
|
|
44
|
+
f as THEME_DARK,
|
|
45
|
+
t as THEME_LIGHT,
|
|
46
|
+
u as resolveTheme,
|
|
47
|
+
a as themeToCSSVars
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=themes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"themes.js","sources":["../../src/core/themes.ts"],"sourcesContent":["/**\n * 🎨 Zephyr Theme System\n *\n * Built-in dark/light themes + custom theme support.\n * Themes map to CSS custom properties injected on the widget root.\n */\n\nimport type { ZephyrTheme, ZephyrCustomTheme } from \"./config\";\n\n// ─── Built-in themes ─────────────────────────────────────────\n\nexport const THEME_DARK: ZephyrCustomTheme = {\n background: \"#0f0f1a\",\n surface: \"#1a1a2e\",\n text: \"#e8e8f0\",\n muted: \"#6b6b80\",\n border: \"#2a2a40\",\n userBubble: \"var(--zephyr-accent, #ff6b35)\",\n userText: \"#ffffff\",\n botBubble: \"#1e1e35\",\n botText: \"#e8e8f0\",\n};\n\nexport const THEME_LIGHT: ZephyrCustomTheme = {\n background: \"#f5f5fa\",\n surface: \"#ffffff\",\n text: \"#1a1a2e\",\n muted: \"#8888a0\",\n border: \"#e0e0ee\",\n userBubble: \"var(--zephyr-accent, #ff6b35)\",\n userText: \"#ffffff\",\n botBubble: \"#f0f0f8\",\n botText: \"#1a1a2e\",\n};\n\nexport const BUILT_IN_THEMES: Record<string, ZephyrCustomTheme> = {\n dark: THEME_DARK,\n light: THEME_LIGHT,\n};\n\n// ─── Theme resolution ────────────────────────────────────────\n\nexport function resolveTheme(theme: ZephyrTheme): ZephyrCustomTheme {\n if (typeof theme === \"object\") return theme;\n if (theme === \"auto\") {\n const prefersDark =\n typeof window !== \"undefined\" &&\n window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n return prefersDark ? THEME_DARK : THEME_LIGHT;\n }\n return BUILT_IN_THEMES[theme] || THEME_DARK;\n}\n\n/** Convert theme to CSS custom properties */\nexport function themeToCSSVars(\n theme: ZephyrCustomTheme,\n accentColor: string\n): Record<string, string> {\n return {\n \"--zephyr-accent\": accentColor,\n \"--zephyr-bg\": theme.background,\n \"--zephyr-surface\": theme.surface,\n \"--zephyr-text\": theme.text,\n \"--zephyr-muted\": theme.muted,\n \"--zephyr-border\": theme.border,\n \"--zephyr-user-bubble\": theme.userBubble || accentColor,\n \"--zephyr-user-text\": theme.userText || \"#ffffff\",\n \"--zephyr-bot-bubble\": theme.botBubble || theme.surface,\n \"--zephyr-bot-text\": theme.botText || theme.text,\n };\n}\n"],"names":["THEME_DARK","THEME_LIGHT","BUILT_IN_THEMES","resolveTheme","theme","themeToCSSVars","accentColor"],"mappings":"AAWO,MAAMA,IAAgC;AAAA,EAC3C,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,SAAS;AACX,GAEaC,IAAiC;AAAA,EAC5C,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,SAAS;AACX,GAEaC,IAAqD;AAAA,EAChE,MAAMF;AAAA,EACN,OAAOC;AACT;AAIO,SAASE,EAAaC,GAAuC;AAClE,SAAI,OAAOA,KAAU,WAAiBA,IAClCA,MAAU,SAEV,OAAO,SAAW,OAClB,OAAO,WAAW,8BAA8B,EAAE,UAC/BJ,IAAaC,IAE7BC,EAAgBE,CAAK,KAAKJ;AACnC;AAGO,SAASK,EACdD,GACAE,GACwB;AACxB,SAAO;AAAA,IACL,mBAAmBA;AAAA,IACnB,eAAeF,EAAM;AAAA,IACrB,oBAAoBA,EAAM;AAAA,IAC1B,iBAAiBA,EAAM;AAAA,IACvB,kBAAkBA,EAAM;AAAA,IACxB,mBAAmBA,EAAM;AAAA,IACzB,wBAAwBA,EAAM,cAAcE;AAAA,IAC5C,sBAAsBF,EAAM,YAAY;AAAA,IACxC,uBAAuBA,EAAM,aAAaA,EAAM;AAAA,IAChD,qBAAqBA,EAAM,WAAWA,EAAM;AAAA,EAAA;AAEhD;"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { ZephyrConfig, ZephyrLogo, ZephyrPersona, ZephyrOpenAnimation, ZephyrTriggerAnimation } from './config';
|
|
2
|
+
|
|
3
|
+
export interface ZephyrMessage {
|
|
4
|
+
role: "user" | "bot" | "system";
|
|
5
|
+
text: string;
|
|
6
|
+
expression?: string;
|
|
7
|
+
timestamp: number;
|
|
8
|
+
}
|
|
9
|
+
export interface ZephyrWidgetEvents {
|
|
10
|
+
onReady?: () => void;
|
|
11
|
+
onMessage?: (msg: ZephyrMessage) => void;
|
|
12
|
+
onError?: (err: {
|
|
13
|
+
message: string;
|
|
14
|
+
}) => void;
|
|
15
|
+
onToggle?: (open: boolean) => void;
|
|
16
|
+
}
|
|
17
|
+
export declare class ZephyrWidget {
|
|
18
|
+
private config;
|
|
19
|
+
private events;
|
|
20
|
+
private el;
|
|
21
|
+
private wsClient;
|
|
22
|
+
private isOpen;
|
|
23
|
+
private messages;
|
|
24
|
+
private logo;
|
|
25
|
+
private persona;
|
|
26
|
+
private mounted;
|
|
27
|
+
constructor(userConfig: ZephyrConfig, events?: ZephyrWidgetEvents);
|
|
28
|
+
/** Mount the widget to the DOM */
|
|
29
|
+
mount(container?: HTMLElement | string | null): void;
|
|
30
|
+
/** Destroy the widget and clean up */
|
|
31
|
+
destroy(): void;
|
|
32
|
+
open(): void;
|
|
33
|
+
close(): void;
|
|
34
|
+
toggle(): void;
|
|
35
|
+
/** Send a message programmatically */
|
|
36
|
+
send(text: string): void;
|
|
37
|
+
/** Change theme at runtime */
|
|
38
|
+
setTheme(theme: ZephyrConfig["theme"]): void;
|
|
39
|
+
/** Change logo at runtime */
|
|
40
|
+
setLogo(logo: ZephyrLogo): void;
|
|
41
|
+
/** Change persona at runtime */
|
|
42
|
+
setPersona(persona: ZephyrPersona): void;
|
|
43
|
+
/** Change accent color at runtime */
|
|
44
|
+
setAccentColor(color: string): void;
|
|
45
|
+
/** Change open animation */
|
|
46
|
+
setOpenAnimation(anim: ZephyrOpenAnimation): void;
|
|
47
|
+
/** Change trigger animation */
|
|
48
|
+
setTriggerAnimation(anim: ZephyrTriggerAnimation): void;
|
|
49
|
+
/** Get message history */
|
|
50
|
+
getMessages(): ZephyrMessage[];
|
|
51
|
+
/** Check if panel is open */
|
|
52
|
+
getIsOpen(): boolean;
|
|
53
|
+
private renderHTML;
|
|
54
|
+
private bindEvents;
|
|
55
|
+
private setOpenState;
|
|
56
|
+
private addMessage;
|
|
57
|
+
private showTyping;
|
|
58
|
+
private hideTyping;
|
|
59
|
+
private showSuggestions;
|
|
60
|
+
private applyThemeVars;
|
|
61
|
+
private applyPanelVars;
|
|
62
|
+
private positionClass;
|
|
63
|
+
private updateAvatars;
|
|
64
|
+
private updateChatAvatar;
|
|
65
|
+
private connectWS;
|
|
66
|
+
private handleWSMessage;
|
|
67
|
+
private renderMarkdown;
|
|
68
|
+
private escapeHTML;
|
|
69
|
+
private escapeAttr;
|
|
70
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🔌 Zephyr WebSocket Client
|
|
3
|
+
*
|
|
4
|
+
* Handles connection to the Zephyr backend with auto-reconnect,
|
|
5
|
+
* session management, and typed events.
|
|
6
|
+
*/
|
|
7
|
+
export interface ZephyrWSMessage {
|
|
8
|
+
type: "welcome" | "status" | "response" | "error";
|
|
9
|
+
session_id?: string;
|
|
10
|
+
message?: string;
|
|
11
|
+
expression?: string;
|
|
12
|
+
suggestions?: string[];
|
|
13
|
+
mode?: string;
|
|
14
|
+
data?: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
export interface ZephyrWSOptions {
|
|
17
|
+
server: string;
|
|
18
|
+
apiKey?: string;
|
|
19
|
+
sessionId?: string;
|
|
20
|
+
onMessage: (msg: ZephyrWSMessage) => void;
|
|
21
|
+
onError?: (err: Event | Error) => void;
|
|
22
|
+
onConnect?: () => void;
|
|
23
|
+
onDisconnect?: () => void;
|
|
24
|
+
reconnectDelay?: number;
|
|
25
|
+
maxReconnectAttempts?: number;
|
|
26
|
+
}
|
|
27
|
+
export declare class ZephyrWSClient {
|
|
28
|
+
private ws;
|
|
29
|
+
private options;
|
|
30
|
+
private sessionId;
|
|
31
|
+
private reconnectAttempts;
|
|
32
|
+
private reconnectTimer;
|
|
33
|
+
private destroyed;
|
|
34
|
+
constructor(options: ZephyrWSOptions);
|
|
35
|
+
/** Connect to the WebSocket server */
|
|
36
|
+
connect(): void;
|
|
37
|
+
/** Send a chat message */
|
|
38
|
+
send(message: string, metadata?: Record<string, unknown>): void;
|
|
39
|
+
/** Get current session ID */
|
|
40
|
+
getSessionId(): string;
|
|
41
|
+
/** Check if connected */
|
|
42
|
+
isConnected(): boolean;
|
|
43
|
+
/** Disconnect and cleanup */
|
|
44
|
+
destroy(): void;
|
|
45
|
+
private scheduleReconnect;
|
|
46
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🦊 @zephyr/ui — Main entry point
|
|
3
|
+
*
|
|
4
|
+
* Exports:
|
|
5
|
+
* - defineZephyrConfig — config helper
|
|
6
|
+
* - ZephyrWidget — core widget class
|
|
7
|
+
* - Zephyr (React) — <Zephyr /> React component
|
|
8
|
+
* - Zephyr (Vue) — <Zephyr /> Vue component (via '@zephyr/ui/vue')
|
|
9
|
+
* - init() — vanilla JS initializer
|
|
10
|
+
*
|
|
11
|
+
* Subpath exports:
|
|
12
|
+
* '@zephyr/ui' — React component + core
|
|
13
|
+
* '@zephyr/ui/react' — React component + Provider + hook
|
|
14
|
+
* '@zephyr/ui/vue' — Vue component
|
|
15
|
+
* '@zephyr/ui/config' — Config types + defineZephyrConfig
|
|
16
|
+
* '@zephyr/ui/themes' — Theme utilities
|
|
17
|
+
*/
|
|
18
|
+
export { defineZephyrConfig, resolveConfig, ZEPHYR_DEFAULTS } from './core/config';
|
|
19
|
+
export type { ZephyrConfig, ZephyrLogo, ZephyrLogoPreset, ZephyrCustomLogo, ZephyrPersona, ZephyrPersonaPreset, ZephyrCustomPersona, ZephyrTheme, ZephyrThemePreset, ZephyrCustomTheme, ZephyrOpenAnimation, ZephyrTriggerAnimation, ZephyrPosition, ZephyrSize, ZephyrPanelConfig, ZephyrFeature, } from './core/config';
|
|
20
|
+
export { ZephyrWidget } from './core/widget';
|
|
21
|
+
export type { ZephyrMessage, ZephyrWidgetEvents } from './core/widget';
|
|
22
|
+
export { resolveTheme, themeToCSSVars, THEME_DARK, THEME_LIGHT } from './core/themes';
|
|
23
|
+
export { getOpenAnimationCSS, getOpenAnimationName, getTriggerAnimationCSS, getTriggerAnimationName, } from './core/animations';
|
|
24
|
+
export { resolveLogo } from './core/logos';
|
|
25
|
+
export { resolvePersona, generatePersonaSVG, EXPRESSIONS } from './core/personas';
|
|
26
|
+
export type { ZephyrExpression, ResolvedPersona } from './core/personas';
|
|
27
|
+
export { init, getInstance, destroy } from './vanilla/init';
|
|
28
|
+
export { Zephyr, ZephyrProvider, useZephyr } from './react/Zephyr';
|
|
29
|
+
export type { ZephyrProps } from './react/Zephyr';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { ZEPHYR_DEFAULTS as S, defineZephyrConfig as E, resolveConfig as d } from "./core/config.js";
|
|
2
|
+
import { Z as i } from "./widget-BjgCJR9K.js";
|
|
3
|
+
import { E as T, g as Z, a as h, b as A, c as C, d as c, r as v, e as x } from "./widget-BjgCJR9K.js";
|
|
4
|
+
import { THEME_DARK as H, THEME_LIGHT as R, resolveTheme as I, themeToCSSVars as L } from "./core/themes.js";
|
|
5
|
+
import { Z as N, a as O, u as _ } from "./Zephyr-BupwOffR.js";
|
|
6
|
+
let e = null;
|
|
7
|
+
function m(o) {
|
|
8
|
+
e && e.destroy();
|
|
9
|
+
const { onReady: r, onMessage: n, onError: t, onToggle: a, ...s } = o;
|
|
10
|
+
return e = new i(s, {
|
|
11
|
+
onReady: r,
|
|
12
|
+
onMessage: n,
|
|
13
|
+
onError: t,
|
|
14
|
+
onToggle: a
|
|
15
|
+
}), e.mount(o.container || null), e;
|
|
16
|
+
}
|
|
17
|
+
function p() {
|
|
18
|
+
return e;
|
|
19
|
+
}
|
|
20
|
+
function f() {
|
|
21
|
+
e == null || e.destroy(), e = null;
|
|
22
|
+
}
|
|
23
|
+
export {
|
|
24
|
+
T as EXPRESSIONS,
|
|
25
|
+
H as THEME_DARK,
|
|
26
|
+
R as THEME_LIGHT,
|
|
27
|
+
S as ZEPHYR_DEFAULTS,
|
|
28
|
+
N as Zephyr,
|
|
29
|
+
O as ZephyrProvider,
|
|
30
|
+
i as ZephyrWidget,
|
|
31
|
+
E as defineZephyrConfig,
|
|
32
|
+
f as destroy,
|
|
33
|
+
Z as generatePersonaSVG,
|
|
34
|
+
p as getInstance,
|
|
35
|
+
h as getOpenAnimationCSS,
|
|
36
|
+
A as getOpenAnimationName,
|
|
37
|
+
C as getTriggerAnimationCSS,
|
|
38
|
+
c as getTriggerAnimationName,
|
|
39
|
+
m as init,
|
|
40
|
+
d as resolveConfig,
|
|
41
|
+
v as resolveLogo,
|
|
42
|
+
x as resolvePersona,
|
|
43
|
+
I as resolveTheme,
|
|
44
|
+
L as themeToCSSVars,
|
|
45
|
+
_ as useZephyr
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/vanilla/init.ts"],"sourcesContent":["/**\n * 🦊 Zephyr — Vanilla JS API\n *\n * Usage:\n * <script src=\"https://cdn.example.com/zephyr.umd.js\"></script>\n * <script>\n * Zephyr.init({\n * server: 'http://localhost:8000',\n * persona: 'friendly',\n * theme: 'dark',\n * });\n * </script>\n */\n\nimport type { ZephyrConfig } from \"../core/config\";\nimport { ZephyrWidget, type ZephyrWidgetEvents } from \"../core/widget\";\n\nlet instance: ZephyrWidget | null = null;\n\n/**\n * Initialize the Zephyr widget (vanilla JS).\n * Call once. Returns the widget instance for imperative control.\n */\nexport function init(\n config: ZephyrConfig & ZephyrWidgetEvents\n): ZephyrWidget {\n if (instance) {\n instance.destroy();\n }\n\n const { onReady, onMessage, onError, onToggle, ...widgetConfig } = config;\n\n instance = new ZephyrWidget(widgetConfig, {\n onReady,\n onMessage,\n onError,\n onToggle,\n });\n\n instance.mount(config.container || null);\n return instance;\n}\n\n/** Get the current widget instance */\nexport function getInstance(): ZephyrWidget | null {\n return instance;\n}\n\n/** Destroy the widget */\nexport function destroy(): void {\n instance?.destroy();\n instance = null;\n}\n"],"names":["instance","init","config","onReady","onMessage","onError","onToggle","widgetConfig","ZephyrWidget","getInstance","destroy"],"mappings":";;;;;AAiBA,IAAIA,IAAgC;AAM7B,SAASC,EACdC,GACc;AACd,EAAIF,KACFA,EAAS,QAAA;AAGX,QAAM,EAAE,SAAAG,GAAS,WAAAC,GAAW,SAAAC,GAAS,UAAAC,GAAU,GAAGC,MAAiBL;AAEnE,SAAAF,IAAW,IAAIQ,EAAaD,GAAc;AAAA,IACxC,SAAAJ;AAAA,IACA,WAAAC;AAAA,IACA,SAAAC;AAAA,IACA,UAAAC;AAAA,EAAA,CACD,GAEDN,EAAS,MAAME,EAAO,aAAa,IAAI,GAChCF;AACT;AAGO,SAASS,IAAmC;AACjD,SAAOT;AACT;AAGO,SAASU,IAAgB;AAC9B,EAAAV,KAAA,QAAAA,EAAU,WACVA,IAAW;AACb;"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { ZephyrConfig, ZephyrTheme, ZephyrLogo, ZephyrPersona, ZephyrOpenAnimation, ZephyrTriggerAnimation, ZephyrPosition, ZephyrSize, ZephyrFeature } from '../core/config';
|
|
3
|
+
import { ZephyrMessage } from '../core/widget';
|
|
4
|
+
|
|
5
|
+
export interface ZephyrProps {
|
|
6
|
+
/** Full config object (from defineZephyrConfig) */
|
|
7
|
+
config?: ZephyrConfig;
|
|
8
|
+
/** Zephyr server URL */
|
|
9
|
+
server?: string;
|
|
10
|
+
/** API key */
|
|
11
|
+
apiKey?: string;
|
|
12
|
+
/** Logo preset or custom */
|
|
13
|
+
logo?: ZephyrLogo;
|
|
14
|
+
/** Persona preset or custom */
|
|
15
|
+
persona?: ZephyrPersona;
|
|
16
|
+
/** Theme */
|
|
17
|
+
theme?: ZephyrTheme;
|
|
18
|
+
/** Accent color */
|
|
19
|
+
accentColor?: string;
|
|
20
|
+
/** Opening animation */
|
|
21
|
+
openAnimation?: ZephyrOpenAnimation;
|
|
22
|
+
/** Trigger button animation */
|
|
23
|
+
triggerAnimation?: ZephyrTriggerAnimation;
|
|
24
|
+
/** Position */
|
|
25
|
+
position?: ZephyrPosition;
|
|
26
|
+
/** Size */
|
|
27
|
+
size?: ZephyrSize;
|
|
28
|
+
/** Language */
|
|
29
|
+
language?: string;
|
|
30
|
+
/** Greeting message */
|
|
31
|
+
greeting?: string;
|
|
32
|
+
/** Input placeholder */
|
|
33
|
+
placeholder?: string;
|
|
34
|
+
/** Enabled features */
|
|
35
|
+
features?: ZephyrFeature[];
|
|
36
|
+
/** Start open */
|
|
37
|
+
startOpen?: boolean;
|
|
38
|
+
/** Show badge */
|
|
39
|
+
showBadge?: boolean;
|
|
40
|
+
/** Custom CSS */
|
|
41
|
+
customCSS?: string;
|
|
42
|
+
/** Mount container selector */
|
|
43
|
+
container?: string | null;
|
|
44
|
+
/** Panel width */
|
|
45
|
+
panelWidth?: number;
|
|
46
|
+
/** Panel height */
|
|
47
|
+
panelHeight?: number;
|
|
48
|
+
/** Panel border radius */
|
|
49
|
+
panelBorderRadius?: number;
|
|
50
|
+
/** Show backdrop */
|
|
51
|
+
backdrop?: boolean;
|
|
52
|
+
/** z-index */
|
|
53
|
+
zIndex?: number;
|
|
54
|
+
onReady?: () => void;
|
|
55
|
+
onMessage?: (msg: ZephyrMessage) => void;
|
|
56
|
+
onError?: (err: {
|
|
57
|
+
message: string;
|
|
58
|
+
}) => void;
|
|
59
|
+
onToggle?: (open: boolean) => void;
|
|
60
|
+
}
|
|
61
|
+
export interface ZephyrProviderProps {
|
|
62
|
+
config: ZephyrConfig;
|
|
63
|
+
children: ReactNode;
|
|
64
|
+
}
|
|
65
|
+
export declare function ZephyrProvider({ config, children }: ZephyrProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
66
|
+
export interface UseZephyrReturn {
|
|
67
|
+
/** Send a message */
|
|
68
|
+
send: (text: string) => void;
|
|
69
|
+
/** Open the panel */
|
|
70
|
+
open: () => void;
|
|
71
|
+
/** Close the panel */
|
|
72
|
+
close: () => void;
|
|
73
|
+
/** Toggle the panel */
|
|
74
|
+
toggle: () => void;
|
|
75
|
+
/** Change theme */
|
|
76
|
+
setTheme: (theme: ZephyrTheme) => void;
|
|
77
|
+
/** Change logo */
|
|
78
|
+
setLogo: (logo: ZephyrLogo) => void;
|
|
79
|
+
/** Change persona */
|
|
80
|
+
setPersona: (persona: ZephyrPersona) => void;
|
|
81
|
+
/** Change accent color */
|
|
82
|
+
setAccentColor: (color: string) => void;
|
|
83
|
+
/** Get all messages */
|
|
84
|
+
getMessages: () => ZephyrMessage[];
|
|
85
|
+
/** Is the panel open? */
|
|
86
|
+
isOpen: () => boolean;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Imperative access to the Zephyr widget instance.
|
|
90
|
+
* Must be used in a component that renders <Zephyr />.
|
|
91
|
+
*/
|
|
92
|
+
export declare function useZephyr(): UseZephyrReturn;
|
|
93
|
+
/**
|
|
94
|
+
* <Zephyr /> — Renders the Zephyr chat widget.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```tsx
|
|
98
|
+
* import { Zephyr } from '@zephyr/ui/react';
|
|
99
|
+
*
|
|
100
|
+
* function App() {
|
|
101
|
+
* return (
|
|
102
|
+
* <div>
|
|
103
|
+
* <h1>My App</h1>
|
|
104
|
+
* <Zephyr
|
|
105
|
+
* server="http://localhost:8000"
|
|
106
|
+
* persona="friendly"
|
|
107
|
+
* theme="dark"
|
|
108
|
+
* accentColor="#ff6b35"
|
|
109
|
+
* openAnimation="bounce"
|
|
110
|
+
* />
|
|
111
|
+
* </div>
|
|
112
|
+
* );
|
|
113
|
+
* }
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
export declare function Zephyr(props: ZephyrProps): null;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ZephyrConfig } from '../core/config';
|
|
2
|
+
import { ZephyrWidget, ZephyrWidgetEvents } from '../core/widget';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Initialize the Zephyr widget (vanilla JS).
|
|
6
|
+
* Call once. Returns the widget instance for imperative control.
|
|
7
|
+
*/
|
|
8
|
+
export declare function init(config: ZephyrConfig & ZephyrWidgetEvents): ZephyrWidget;
|
|
9
|
+
/** Get the current widget instance */
|
|
10
|
+
export declare function getInstance(): ZephyrWidget | null;
|
|
11
|
+
/** Destroy the widget */
|
|
12
|
+
export declare function destroy(): void;
|