@ensembleapp/client-sdk 0.0.42 → 0.0.44
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/dist/index.d.ts +7 -1
- package/dist/index.js +84 -46
- package/dist/index.js.map +1 -1
- package/dist/widget/widget.global.js +46 -46
- package/dist/widget/widget.global.js.map +1 -1
- package/lib/chat/ChatWidget.css +8 -3
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -450,7 +450,9 @@ interface ChatWidgetStyles {
|
|
|
450
450
|
backgroundSecondary?: string;
|
|
451
451
|
backgroundTertiary?: string;
|
|
452
452
|
borderColor?: string;
|
|
453
|
-
|
|
453
|
+
subtleBorderColor?: string;
|
|
454
|
+
/** Controls only the outer ChatWidget border width. Internal dividers still use borderColor. */
|
|
455
|
+
borderWidth?: string | number;
|
|
454
456
|
headerTextColor?: string;
|
|
455
457
|
userBubbleTextColor?: string;
|
|
456
458
|
assistantBubbleBackground?: string;
|
|
@@ -463,6 +465,10 @@ interface ChatWidgetStyles {
|
|
|
463
465
|
textMuted?: string;
|
|
464
466
|
/** Disabled text color */
|
|
465
467
|
textDisabled?: string;
|
|
468
|
+
/** Markdown link color */
|
|
469
|
+
linkColor?: string;
|
|
470
|
+
/** Markdown link hover color */
|
|
471
|
+
linkHoverColor?: string;
|
|
466
472
|
fontFamily?: string;
|
|
467
473
|
borderRadius?: string;
|
|
468
474
|
inputBackground?: string;
|
package/dist/index.js
CHANGED
|
@@ -27,7 +27,7 @@ function styleInject(css, { insertAt } = {}) {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
// lib/chat/ChatWidget.css
|
|
30
|
-
styleInject(':root[data-chat-widget],\n[data-chat-widget] {\n --chat-primary: #3b82f6;\n --chat-primary-text: #ffffff;\n --chat-primary-hover: #2563eb;\n --chat-primary-subtle: rgba(59, 130, 246, 0.1);\n --chat-background: #ffffff;\n --chat-background-secondary: #f9fafb;\n --chat-background-tertiary: #f3f4f6;\n --chat-border: #e5e7eb;\n --chat-border-light: #f3f4f6;\n --chat-text: #111827;\n --chat-text-secondary: #4b5563;\n --chat-text-muted: #6b7280;\n --chat-text-disabled: #9ca3af;\n --chat-success: #22c55e;\n --chat-success-bg: rgba(34, 197, 94, 0.1);\n --chat-error: #ef4444;\n --chat-error-bg: rgba(239, 68, 68, 0.1);\n --chat-header-text: #ffffff;\n --chat-user-text: #ffffff;\n --chat-assistant-bg: transparent;\n --chat-assistant-text: var(--chat-text);\n --chat-input-bg: var(--chat-background);\n --chat-input-text: var(--chat-text);\n --chat-input-placeholder: var(--chat-text-muted);\n --chat-thought-border: var(--chat-border);\n --chat-font-family:\n "Inter",\n system-ui,\n -apple-system,\n BlinkMacSystemFont,\n sans-serif;\n --chat-radius: 0.75rem;\n --chat-font-size: 0.925rem;\n --chat-thought-font-size: 0.75rem;\n --chat-shadow: 0 20px 45px rgba(0, 0, 0, 0.12);\n --chat-shadow-sm: 0 4px 12px rgba(0, 0, 0, 0.1);\n --chat-overlay-bg: rgba(0, 0, 0, 0.3);\n}\n.chat-widget {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 24rem;\n background: var(--chat-background);\n border: 1px solid var(--chat-border);\n border-radius: 0;\n box-shadow: var(--chat-shadow);\n overflow: hidden;\n font-family: var(--chat-font-family);\n color: var(--chat-assistant-text);\n}\n.chat-widget--popup-content {\n border: 0;\n border-radius: inherit;\n box-shadow: none;\n min-height: 0;\n}\n.chat-widget__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 40px;\n padding: 0.75rem 1rem;\n background: var(--chat-primary);\n color: var(--chat-header-text);\n}\n.chat-widget__title {\n margin: 0;\n font-size: 0.875rem;\n font-weight: 600;\n}\n.chat-widget__messages {\n flex: 1;\n overflow-y: auto;\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n.chat-widget__message {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n.chat-widget__message-row {\n display: flex;\n}\n.chat-widget__message-row--user {\n justify-content: flex-end;\n}\n.chat-widget__message-row--assistant {\n justify-content: flex-start;\n}\n.chat-widget__bubble {\n max-width: 90%;\n padding: 0.5rem 0.25rem;\n border-radius: calc(var(--chat-radius) * 0.65);\n font-size: var(--chat-font-size);\n}\n.chat-widget__bubble--user {\n background: var(--chat-primary);\n color: var(--chat-user-text);\n border-bottom-right-radius: 0.35rem;\n}\n.chat-widget__bubble--assistant {\n width: 90%;\n background: var(--chat-assistant-bg);\n color: var(--chat-assistant-text);\n border-bottom-left-radius: 0.35rem;\n}\n.chat-widget__widget {\n width: 100%;\n}\n.chat-widget__markdown {\n white-space: normal;\n font-size: var(--chat-font-size);\n}\n.chat-widget__markdown h1 {\n font-size: calc(var(--chat-font-size) * 1.4);\n}\n.chat-widget__markdown h2 {\n font-size: calc(var(--chat-font-size) * 1.25);\n}\n.chat-widget__markdown h3 {\n font-size: calc(var(--chat-font-size) * 1.1);\n}\n.chat-widget__markdown h4 {\n font-size: calc(var(--chat-font-size) * 1.05);\n}\n.chat-widget__markdown h5 {\n font-size: calc(var(--chat-font-size) * 1);\n}\n.chat-widget__markdown h6 {\n font-size: calc(var(--chat-font-size) * 0.95);\n}\n.chat-widget__anchor-button {\n position: fixed;\n bottom: 20px;\n right: 20px;\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.65rem 0.85rem;\n background: var(--chat-primary);\n color: var(--chat-primary-text);\n border: none;\n border-radius: 999px;\n box-shadow: var(--chat-shadow);\n cursor: pointer;\n font-weight: 600;\n z-index: 99999;\n}\n.chat-widget__anchor-button:hover {\n background: var(--chat-primary-hover);\n}\n.chat-widget__anchor--left {\n right: auto;\n left: 20px;\n}\n.chat-widget__anchor-icon {\n width: 1.1rem;\n height: 1.1rem;\n}\n.chat-widget__popup {\n position: fixed;\n bottom: 80px;\n right: 20px;\n z-index: 99998;\n}\n.chat-widget__anchor--left.chat-widget__popup {\n right: auto;\n left: 20px;\n}\n.chat-widget__popup-inner {\n width: 384px;\n max-width: calc(100vw - 40px);\n height: 500px;\n max-height: calc(100vh - 140px);\n box-shadow: var(--chat-shadow);\n border-radius: 12px;\n overflow: hidden;\n}\n.chat-widget__markdown a {\n color: var(--chat-primary);\n text-decoration: underline;\n}\n.chat-widget__markdown a:hover {\n color: var(--chat-primary-hover);\n}\n.chat-widget__markdown table {\n width: 100%;\n border-collapse: collapse;\n margin: 0.5rem 0;\n}\n.chat-widget__markdown th,\n.chat-widget__markdown td {\n border: 1px solid var(--chat-border);\n padding: 0.5rem;\n text-align: left;\n vertical-align: top;\n}\n.chat-widget__markdown thead th {\n background: var(--chat-assistant-bg);\n color: var(--chat-assistant-text);\n font-weight: 600;\n}\n.chat-widget__thoughts {\n min-width: 0;\n --chat-font-size: var(--chat-thought-font-size);\n}\n.chat-widget__details {\n border: 0;\n}\n.chat-widget__thoughts-summary {\n list-style: none;\n display: flex;\n align-items: center;\n gap: 0.35rem;\n cursor: pointer;\n color: var(--chat-text-muted);\n font-size: 0.8125rem;\n}\n.chat-widget__thoughts-summary:hover {\n color: var(--chat-assistant-text);\n}\n.chat-widget__thoughts-icon-container {\n display: flex;\n border: 1px solid var(--chat-border);\n border-radius: 999px;\n align-items: center;\n justify-content: center;\n width: 1rem;\n height: 1rem;\n}\n.chat-widget__thoughts-icon {\n width: 0.75rem;\n height: 0.75rem;\n transition: transform 0.2s ease;\n}\n.chat-widget__details[open] .chat-widget__thoughts-icon {\n transform: rotate(90deg);\n}\n.chat-widget__thoughts-content {\n margin-top: 0.5rem;\n margin-left: 0.4rem;\n padding: 0.75rem;\n border-left: 2px solid var(--chat-thought-border);\n border-color: var(--chat-primary);\n max-width: 100%;\n overflow-x: auto;\n}\n.chat-widget__thoughts-text {\n margin: 0;\n line-height: 1.5;\n color: var(--chat-text-secondary);\n font-family:\n ui-monospace,\n SFMono-Regular,\n Menlo,\n Monaco,\n Consolas,\n "Liberation Mono",\n "Courier New",\n monospace;\n white-space: pre-wrap;\n word-break: break-word;\n overflow-wrap: anywhere;\n display: block;\n}\n.chat-widget__loading {\n display: flex;\n justify-content: flex-start;\n}\n.chat-widget__loading-bubble {\n background: var(--chat-assistant-bg);\n color: var(--chat-assistant-text);\n border-radius: calc(var(--chat-radius) * 0.65);\n border-bottom-left-radius: 0.35rem;\n padding: 0.5rem 0.75rem;\n}\n.chat-widget__loading-dots {\n display: flex;\n gap: 0.35rem;\n}\n.chat-widget__loading-dot {\n width: 0.5rem;\n height: 0.5rem;\n border-radius: 999px;\n background: var(--chat-text-disabled);\n animation: chat-widget-bounce 1s infinite ease-in-out;\n}\n.chat-widget__loading-dot[data-delay="1"] {\n animation-delay: 0.1s;\n}\n.chat-widget__loading-dot[data-delay="2"] {\n animation-delay: 0.2s;\n}\n@keyframes chat-widget-bounce {\n 0%, 80%, 100% {\n transform: scale(0.6);\n opacity: 0.4;\n }\n 40% {\n transform: scale(1);\n opacity: 1;\n }\n}\n.chat-widget__input {\n border-top: 1px solid var(--chat-border);\n padding: 0.25rem 0 0.75rem;\n background: var(--chat-input-bg);\n}\n.chat-widget__form {\n position: relative;\n}\n.chat-widget__textarea {\n width: 100%;\n border: 0;\n padding: 0.75rem 5.25rem 0.75rem 0.75rem;\n background: transparent;\n font-size: 0.925rem;\n resize: none;\n color: var(--chat-input-text);\n font-family: inherit;\n}\n.chat-widget__textarea::-moz-placeholder {\n color: var(--chat-input-placeholder);\n}\n.chat-widget__textarea::placeholder {\n color: var(--chat-input-placeholder);\n}\n.chat-widget__textarea:focus-visible {\n outline: none;\n}\n.chat-widget__textarea:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.chat-widget__toolbar {\n position: absolute;\n top: 0;\n right: 3.75rem;\n height: 100%;\n display: flex;\n align-items: center;\n padding: 0 0.5rem;\n border-right: 1px solid var(--chat-border);\n}\n.chat-widget__submit {\n position: absolute;\n top: 50%;\n right: 0.75rem;\n transform: translateY(-50%);\n background: transparent;\n border: 0;\n width: 2.5rem;\n height: 2.5rem;\n display: grid;\n place-items: center;\n color: var(--chat-primary);\n cursor: pointer;\n}\n.chat-widget__submit:disabled {\n color: var(--chat-text-disabled);\n cursor: not-allowed;\n}\n.chat-widget__submit:not(:disabled):hover {\n color: var(--chat-primary-hover);\n}\n.chat-widget__send-icon {\n width: 1.2rem;\n height: 1.2rem;\n}\n.chat-widget__mic-button {\n position: relative;\n border: none;\n background: transparent;\n width: 2.25rem;\n height: 2.25rem;\n display: grid;\n place-items: center;\n color: var(--chat-primary);\n cursor: pointer;\n border-radius: 999px;\n}\n.chat-widget__mic-button:disabled {\n color: var(--chat-text-disabled);\n cursor: not-allowed;\n}\n.chat-widget__mic-button--active {\n color: var(--chat-primary-hover);\n background: var(--chat-primary-subtle);\n}\n.chat-widget__mic-icon {\n width: 1rem;\n height: 1rem;\n}\n.chat-widget__mic-bar {\n position: absolute;\n bottom: 0.1rem;\n left: 50%;\n width: 16px;\n height: 2px;\n border-radius: 999px;\n background: var(--chat-border);\n overflow: hidden;\n display: block;\n transform: translateX(-50%);\n pointer-events: none;\n}\n.chat-widget__mic-bar-fill {\n display: block;\n width: 100%;\n height: 100%;\n background: currentColor;\n transform-origin: left;\n transition: transform 0.12s linear;\n}\n.chat-widget__voice {\n display: flex;\n margin-top: 0.25rem;\n}\n.chat-widget__voice-button {\n border: none;\n background: none;\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.1rem 0;\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--chat-primary);\n cursor: pointer;\n}\n.chat-widget__voice-button:disabled {\n color: var(--chat-text-disabled);\n cursor: not-allowed;\n}\n.chat-widget__voice-button--active {\n color: var(--chat-primary-hover);\n}\n.chat-widget__voice-icon {\n width: 0.95rem;\n height: 0.95rem;\n}\n.chat-widget__voice-icon--spin {\n animation: chat-widget-spin 1s linear infinite;\n}\n@keyframes chat-widget-spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n.chat-widget__collapsed {\n position: relative;\n margin-bottom: 0.25rem;\n}\n.chat-widget__collapsed-content {\n display: grid;\n grid-template-rows: 0fr;\n transition: grid-template-rows 300ms ease-out;\n}\n.chat-widget__collapsed-content--expanded {\n grid-template-rows: 1fr;\n}\n.chat-widget__collapsed-content-inner {\n overflow: hidden;\n}\n.chat-widget__collapsed-preview {\n position: relative;\n max-height: 1.5em;\n overflow: hidden;\n opacity: 0.6;\n pointer-events: none;\n transition: opacity 300ms ease-out, max-height 300ms ease-out;\n}\n.chat-widget__collapsed-preview--hidden {\n opacity: 0;\n max-height: 0;\n pointer-events: none;\n}\n.chat-widget__collapsed-gradient {\n position: absolute;\n top: 0;\n right: 0;\n width: 70%;\n height: 100%;\n background:\n linear-gradient(\n to right,\n transparent 0%,\n var(--chat-background) 90%);\n pointer-events: none;\n}\n.chat-widget__collapsed-toggle {\n display: inline-block;\n padding: 0;\n font-size: 0.75rem;\n font-weight: 500;\n color: var(--chat-primary);\n background: transparent;\n border: none;\n cursor: pointer;\n}\n.chat-widget__collapsed-toggle:hover {\n text-decoration: underline;\n}\n@keyframes chat-widget-slide-up {\n from {\n opacity: 1;\n transform: translateY(0);\n max-height: 200px;\n }\n to {\n opacity: 0.6;\n transform: translateY(-8px);\n max-height: 1.5em;\n }\n}\n.chat-widget__collapsed--animating .chat-widget__collapsed-preview {\n animation: chat-widget-slide-up 300ms ease-out forwards;\n}\n');
|
|
30
|
+
styleInject(':root[data-chat-widget],\n[data-chat-widget] {\n --chat-primary: #3b82f6;\n --chat-primary-text: #ffffff;\n --chat-primary-hover: #2563eb;\n --chat-primary-subtle: rgba(59, 130, 246, 0.1);\n --chat-background: #ffffff;\n --chat-background-secondary: #f9fafb;\n --chat-background-tertiary: #f3f4f6;\n --chat-border: #e5e7eb;\n --chat-border-light: #f3f4f6;\n --chat-widget-border-width: 1px;\n --chat-text: #111827;\n --chat-text-secondary: #4b5563;\n --chat-text-muted: #6b7280;\n --chat-text-disabled: #9ca3af;\n --chat-link: #2563eb;\n --chat-link-hover: #1d4ed8;\n --chat-success: #22c55e;\n --chat-success-bg: rgba(34, 197, 94, 0.1);\n --chat-error: #ef4444;\n --chat-error-bg: rgba(239, 68, 68, 0.1);\n --chat-header-text: #ffffff;\n --chat-user-text: #ffffff;\n --chat-assistant-bg: transparent;\n --chat-assistant-text: var(--chat-text);\n --chat-input-bg: var(--chat-background);\n --chat-input-text: var(--chat-text);\n --chat-input-placeholder: var(--chat-text-muted);\n --chat-thought-border: var(--chat-border);\n --chat-font-family:\n "Inter",\n system-ui,\n -apple-system,\n BlinkMacSystemFont,\n sans-serif;\n --chat-radius: 0.75rem;\n --chat-font-size: 0.925rem;\n --chat-thought-font-size: 0.75rem;\n --chat-shadow: 0 20px 45px rgba(0, 0, 0, 0.12);\n --chat-shadow-sm: 0 4px 12px rgba(0, 0, 0, 0.1);\n --chat-overlay-bg: rgba(0, 0, 0, 0.3);\n}\n.chat-widget {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 24rem;\n background: var(--chat-background);\n border: var(--chat-widget-border-width) solid var(--chat-border);\n border-radius: 0;\n box-shadow: var(--chat-shadow);\n overflow: hidden;\n font-family: var(--chat-font-family);\n color: var(--chat-assistant-text);\n}\n.chat-widget--popup-content {\n border: 0;\n border-radius: inherit;\n box-shadow: none;\n min-height: 0;\n}\n.chat-widget__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 40px;\n padding: 0.75rem 1rem;\n background: var(--chat-primary);\n color: var(--chat-header-text);\n}\n.chat-widget__title {\n margin: 0;\n font-size: 0.875rem;\n font-weight: 600;\n}\n.chat-widget__messages {\n flex: 1;\n overflow-y: auto;\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n.chat-widget__message {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n.chat-widget__message-row {\n display: flex;\n}\n.chat-widget__message-row--user {\n justify-content: flex-end;\n}\n.chat-widget__message-row--assistant {\n justify-content: flex-start;\n}\n.chat-widget__bubble {\n max-width: 90%;\n padding: 0.5rem 0.25rem;\n border-radius: calc(var(--chat-radius) * 0.65);\n font-size: var(--chat-font-size);\n}\n.chat-widget__bubble--user {\n background: var(--chat-primary);\n color: var(--chat-user-text);\n border-bottom-right-radius: 0.35rem;\n padding-left: 0.375rem;\n padding-right: 0.375rem;\n}\n.chat-widget__bubble--assistant {\n width: 90%;\n background: var(--chat-assistant-bg);\n color: var(--chat-assistant-text);\n border-bottom-left-radius: 0.35rem;\n}\n.chat-widget__widget {\n width: 100%;\n}\n.chat-widget__markdown {\n white-space: normal;\n font-size: var(--chat-font-size);\n}\n.chat-widget__markdown h1 {\n font-size: calc(var(--chat-font-size) * 1.4);\n}\n.chat-widget__markdown h2 {\n font-size: calc(var(--chat-font-size) * 1.25);\n}\n.chat-widget__markdown h3 {\n font-size: calc(var(--chat-font-size) * 1.1);\n}\n.chat-widget__markdown h4 {\n font-size: calc(var(--chat-font-size) * 1.05);\n}\n.chat-widget__markdown h5 {\n font-size: calc(var(--chat-font-size) * 1);\n}\n.chat-widget__markdown h6 {\n font-size: calc(var(--chat-font-size) * 0.95);\n}\n.chat-widget__anchor-button {\n position: fixed;\n bottom: 20px;\n right: 20px;\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.65rem 0.85rem;\n background: var(--chat-primary);\n color: var(--chat-primary-text);\n border: none;\n border-radius: 999px;\n box-shadow: var(--chat-shadow);\n cursor: pointer;\n font-weight: 600;\n z-index: 99999;\n}\n.chat-widget__anchor-button:hover {\n background: var(--chat-primary-hover);\n}\n.chat-widget__anchor--left {\n right: auto;\n left: 20px;\n}\n.chat-widget__anchor-icon {\n width: 1.1rem;\n height: 1.1rem;\n}\n.chat-widget__popup {\n position: fixed;\n bottom: 80px;\n right: 20px;\n z-index: 99998;\n}\n.chat-widget__anchor--left.chat-widget__popup {\n right: auto;\n left: 20px;\n}\n.chat-widget__popup-inner {\n width: 384px;\n max-width: calc(100vw - 40px);\n height: 500px;\n max-height: calc(100vh - 140px);\n box-shadow: var(--chat-shadow);\n border-radius: 12px;\n overflow: hidden;\n}\n.chat-widget__markdown a {\n color: var(--chat-link);\n text-decoration: underline;\n}\n.chat-widget__markdown a:hover {\n color: var(--chat-link-hover);\n}\n.chat-widget__markdown table {\n width: 100%;\n border-collapse: collapse;\n margin: 0.5rem 0;\n}\n.chat-widget__markdown th,\n.chat-widget__markdown td {\n border: 1px solid var(--chat-border);\n padding: 0.5rem;\n text-align: left;\n vertical-align: top;\n}\n.chat-widget__markdown thead th {\n background: var(--chat-assistant-bg);\n color: var(--chat-assistant-text);\n font-weight: 600;\n}\n.chat-widget__thoughts {\n min-width: 0;\n --chat-font-size: var(--chat-thought-font-size);\n}\n.chat-widget__details {\n border: 0;\n}\n.chat-widget__thoughts-summary {\n list-style: none;\n display: flex;\n align-items: center;\n gap: 0.35rem;\n cursor: pointer;\n color: var(--chat-text-muted);\n font-size: 0.8125rem;\n}\n.chat-widget__thoughts-summary:hover {\n color: var(--chat-assistant-text);\n}\n.chat-widget__thoughts-icon-container {\n display: flex;\n border: 1px solid var(--chat-border);\n border-radius: 999px;\n align-items: center;\n justify-content: center;\n width: 1rem;\n height: 1rem;\n}\n.chat-widget__thoughts-icon {\n width: 0.75rem;\n height: 0.75rem;\n transition: transform 0.2s ease;\n}\n.chat-widget__details[open] .chat-widget__thoughts-icon {\n transform: rotate(90deg);\n}\n.chat-widget__thoughts-content {\n margin-top: 0.5rem;\n margin-left: 0.4rem;\n padding: 0.75rem;\n border-left: 2px solid var(--chat-thought-border);\n border-color: var(--chat-primary);\n max-width: 100%;\n overflow-x: auto;\n}\n.chat-widget__thoughts-text {\n margin: 0;\n line-height: 1.5;\n color: var(--chat-text-secondary);\n font-family:\n ui-monospace,\n SFMono-Regular,\n Menlo,\n Monaco,\n Consolas,\n "Liberation Mono",\n "Courier New",\n monospace;\n white-space: pre-wrap;\n word-break: break-word;\n overflow-wrap: anywhere;\n display: block;\n}\n.chat-widget__loading {\n display: flex;\n justify-content: flex-start;\n}\n.chat-widget__loading-bubble {\n background: var(--chat-assistant-bg);\n color: var(--chat-assistant-text);\n border-radius: calc(var(--chat-radius) * 0.65);\n border-bottom-left-radius: 0.35rem;\n padding: 0.5rem 0.75rem;\n}\n.chat-widget__loading-dots {\n display: flex;\n gap: 0.35rem;\n}\n.chat-widget__loading-dot {\n width: 0.5rem;\n height: 0.5rem;\n border-radius: 999px;\n background: var(--chat-text-disabled);\n animation: chat-widget-bounce 1s infinite ease-in-out;\n}\n.chat-widget__loading-dot[data-delay="1"] {\n animation-delay: 0.1s;\n}\n.chat-widget__loading-dot[data-delay="2"] {\n animation-delay: 0.2s;\n}\n@keyframes chat-widget-bounce {\n 0%, 80%, 100% {\n transform: scale(0.6);\n opacity: 0.4;\n }\n 40% {\n transform: scale(1);\n opacity: 1;\n }\n}\n.chat-widget__input {\n border-top: 1px solid var(--chat-border);\n padding: 0.25rem 0 0.75rem;\n background: var(--chat-input-bg);\n}\n.chat-widget__form {\n position: relative;\n}\n.chat-widget__textarea {\n width: 100%;\n border: 0;\n padding: 0.75rem 5.25rem 0.75rem 0.75rem;\n background: transparent;\n font-size: 0.925rem;\n resize: none;\n color: var(--chat-input-text);\n font-family: inherit;\n}\n.chat-widget__textarea::-moz-placeholder {\n color: var(--chat-input-placeholder);\n}\n.chat-widget__textarea::placeholder {\n color: var(--chat-input-placeholder);\n}\n.chat-widget__textarea:focus-visible {\n outline: none;\n}\n.chat-widget__textarea:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.chat-widget__toolbar {\n position: absolute;\n top: 0;\n right: 3.75rem;\n height: 100%;\n display: flex;\n align-items: center;\n padding: 0 0.5rem;\n border-right: 1px solid var(--chat-border);\n}\n.chat-widget__submit {\n position: absolute;\n top: 50%;\n right: 0.75rem;\n transform: translateY(-50%);\n background: transparent;\n border: 0;\n width: 2.5rem;\n height: 2.5rem;\n display: grid;\n place-items: center;\n color: var(--chat-primary);\n cursor: pointer;\n}\n.chat-widget__submit:disabled {\n color: var(--chat-text-disabled);\n cursor: not-allowed;\n}\n.chat-widget__submit:not(:disabled):hover {\n color: var(--chat-primary-hover);\n}\n.chat-widget__send-icon {\n width: 1.2rem;\n height: 1.2rem;\n}\n.chat-widget__mic-button {\n position: relative;\n border: none;\n background: transparent;\n width: 2.25rem;\n height: 2.25rem;\n display: grid;\n place-items: center;\n color: var(--chat-primary);\n cursor: pointer;\n border-radius: 999px;\n}\n.chat-widget__mic-button:disabled {\n color: var(--chat-text-disabled);\n cursor: not-allowed;\n}\n.chat-widget__mic-button--active {\n color: var(--chat-primary-hover);\n background: var(--chat-primary-subtle);\n}\n.chat-widget__mic-icon {\n width: 1rem;\n height: 1rem;\n}\n.chat-widget__mic-bar {\n position: absolute;\n bottom: 0.1rem;\n left: 50%;\n width: 16px;\n height: 2px;\n border-radius: 999px;\n background: var(--chat-border);\n overflow: hidden;\n display: block;\n transform: translateX(-50%);\n pointer-events: none;\n}\n.chat-widget__mic-bar-fill {\n display: block;\n width: 100%;\n height: 100%;\n background: currentColor;\n transform-origin: left;\n transition: transform 0.12s linear;\n}\n.chat-widget__voice {\n display: flex;\n margin-top: 0.25rem;\n}\n.chat-widget__voice-button {\n border: none;\n background: none;\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.1rem 0;\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--chat-primary);\n cursor: pointer;\n}\n.chat-widget__voice-button:disabled {\n color: var(--chat-text-disabled);\n cursor: not-allowed;\n}\n.chat-widget__voice-button--active {\n color: var(--chat-primary-hover);\n}\n.chat-widget__voice-icon {\n width: 0.95rem;\n height: 0.95rem;\n}\n.chat-widget__voice-icon--spin {\n animation: chat-widget-spin 1s linear infinite;\n}\n@keyframes chat-widget-spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n.chat-widget__collapsed {\n position: relative;\n margin-bottom: 0.25rem;\n}\n.chat-widget__collapsed-content {\n display: grid;\n grid-template-rows: 0fr;\n transition: grid-template-rows 300ms ease-out;\n}\n.chat-widget__collapsed-content--expanded {\n grid-template-rows: 1fr;\n}\n.chat-widget__collapsed-content-inner {\n overflow: hidden;\n}\n.chat-widget__collapsed-preview {\n position: relative;\n max-height: 1.5em;\n overflow: hidden;\n opacity: 0.6;\n pointer-events: none;\n transition: opacity 300ms ease-out, max-height 300ms ease-out;\n}\n.chat-widget__collapsed-preview--hidden {\n opacity: 0;\n max-height: 0;\n pointer-events: none;\n}\n.chat-widget__collapsed-gradient {\n position: absolute;\n top: 0;\n right: 0;\n width: 70%;\n height: 100%;\n background:\n linear-gradient(\n to right,\n transparent 0%,\n var(--chat-background) 90%);\n pointer-events: none;\n}\n.chat-widget__collapsed-toggle {\n display: inline-block;\n padding: 0;\n font-size: 0.75rem;\n font-weight: 500;\n color: var(--chat-primary);\n background: transparent;\n border: none;\n cursor: pointer;\n}\n.chat-widget__collapsed-toggle:hover {\n text-decoration: underline;\n}\n@keyframes chat-widget-slide-up {\n from {\n opacity: 1;\n transform: translateY(0);\n max-height: 200px;\n }\n to {\n opacity: 0.6;\n transform: translateY(-8px);\n max-height: 1.5em;\n }\n}\n.chat-widget__collapsed--animating .chat-widget__collapsed-preview {\n animation: chat-widget-slide-up 300ms ease-out forwards;\n}\n');
|
|
31
31
|
|
|
32
32
|
// lib/chat/ChatWidget.tsx
|
|
33
33
|
import { Send, StopCircle } from "lucide-react";
|
|
@@ -26901,7 +26901,8 @@ var lightTheme = {
|
|
|
26901
26901
|
backgroundSecondary: "#f9fafb",
|
|
26902
26902
|
backgroundTertiary: "#f3f4f6",
|
|
26903
26903
|
borderColor: "#e5e7eb",
|
|
26904
|
-
|
|
26904
|
+
subtleBorderColor: "#f3f4f6",
|
|
26905
|
+
borderWidth: "1px",
|
|
26905
26906
|
headerTextColor: "#ffffff",
|
|
26906
26907
|
userBubbleTextColor: "#ffffff",
|
|
26907
26908
|
assistantBubbleBackground: "transparent",
|
|
@@ -26910,6 +26911,8 @@ var lightTheme = {
|
|
|
26910
26911
|
textSecondary: "#4b5563",
|
|
26911
26912
|
textMuted: "#6b7280",
|
|
26912
26913
|
textDisabled: "#9ca3af",
|
|
26914
|
+
linkColor: "#2563eb",
|
|
26915
|
+
linkHoverColor: "#1d4ed8",
|
|
26913
26916
|
fontFamily: `'Inter', system-ui, -apple-system, BlinkMacSystemFont, sans-serif`,
|
|
26914
26917
|
borderRadius: "0.75rem",
|
|
26915
26918
|
inputBackground: "#ffffff",
|
|
@@ -26921,27 +26924,30 @@ var darkTheme = {
|
|
|
26921
26924
|
theme: "dark",
|
|
26922
26925
|
primaryColor: "#3b82f6",
|
|
26923
26926
|
primaryTextColor: "#ffffff",
|
|
26924
|
-
backgroundColor: "#
|
|
26925
|
-
backgroundSecondary: "#
|
|
26926
|
-
backgroundTertiary: "#
|
|
26927
|
-
borderColor: "#
|
|
26928
|
-
|
|
26927
|
+
backgroundColor: "#111827",
|
|
26928
|
+
backgroundSecondary: "#1f2937",
|
|
26929
|
+
backgroundTertiary: "#374151",
|
|
26930
|
+
borderColor: "#374151",
|
|
26931
|
+
subtleBorderColor: "#1f2937",
|
|
26932
|
+
borderWidth: "1px",
|
|
26929
26933
|
headerTextColor: "#ffffff",
|
|
26930
26934
|
userBubbleTextColor: "#ffffff",
|
|
26931
26935
|
assistantBubbleBackground: "transparent",
|
|
26932
|
-
assistantBubbleTextColor: "#
|
|
26933
|
-
textColor: "#
|
|
26934
|
-
textSecondary: "#
|
|
26935
|
-
textMuted: "#
|
|
26936
|
-
textDisabled: "#
|
|
26936
|
+
assistantBubbleTextColor: "#fafafa",
|
|
26937
|
+
textColor: "#fafafa",
|
|
26938
|
+
textSecondary: "#d4d4d8",
|
|
26939
|
+
textMuted: "#a1a1aa",
|
|
26940
|
+
textDisabled: "#71717a",
|
|
26941
|
+
linkColor: "#93c5fd",
|
|
26942
|
+
linkHoverColor: "#bfdbfe",
|
|
26937
26943
|
fontFamily: `'Inter', system-ui, -apple-system, BlinkMacSystemFont, sans-serif`,
|
|
26938
26944
|
borderRadius: "0.75rem",
|
|
26939
|
-
inputBackground: "#
|
|
26940
|
-
inputTextColor: "#
|
|
26941
|
-
inputPlaceholderColor: "#
|
|
26942
|
-
thoughtsBorderColor: "#
|
|
26945
|
+
inputBackground: "#1f2937",
|
|
26946
|
+
inputTextColor: "#fafafa",
|
|
26947
|
+
inputPlaceholderColor: "#a1a1aa",
|
|
26948
|
+
thoughtsBorderColor: "#374151"
|
|
26943
26949
|
};
|
|
26944
|
-
function
|
|
26950
|
+
function detectChatWidgetDarkMode() {
|
|
26945
26951
|
if (typeof window === "undefined") return false;
|
|
26946
26952
|
const html2 = document.documentElement;
|
|
26947
26953
|
const body = document.body;
|
|
@@ -26955,6 +26961,15 @@ function detectDarkMode() {
|
|
|
26955
26961
|
if (colorScheme === "light") return false;
|
|
26956
26962
|
return window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
26957
26963
|
}
|
|
26964
|
+
function resolveChatWidgetTheme(styleProps, detectedDarkMode) {
|
|
26965
|
+
const themeMode = styleProps?.theme || "auto";
|
|
26966
|
+
const isDark = themeMode === "dark" || themeMode === "auto" && detectedDarkMode;
|
|
26967
|
+
const baseTheme = isDark ? darkTheme : lightTheme;
|
|
26968
|
+
const overrides = styleProps ? Object.fromEntries(
|
|
26969
|
+
Object.entries(styleProps).filter(([, v]) => v !== void 0)
|
|
26970
|
+
) : {};
|
|
26971
|
+
return { ...baseTheme, ...overrides };
|
|
26972
|
+
}
|
|
26958
26973
|
var mixWithBlack = (hex3, ratio = 0.15) => {
|
|
26959
26974
|
const normalized = hex3.replace("#", "");
|
|
26960
26975
|
if (!/^[0-9a-fA-F]{6}$/.test(normalized)) return hex3;
|
|
@@ -26987,14 +27002,14 @@ var ChatWidget = forwardRef(function ChatWidget2({
|
|
|
26987
27002
|
widgets,
|
|
26988
27003
|
feedback
|
|
26989
27004
|
}, ref) {
|
|
26990
|
-
const [detectedDarkMode, setDetectedDarkMode] = useState9(() =>
|
|
27005
|
+
const [detectedDarkMode, setDetectedDarkMode] = useState9(() => detectChatWidgetDarkMode());
|
|
26991
27006
|
useEffect6(() => {
|
|
26992
|
-
setDetectedDarkMode(
|
|
27007
|
+
setDetectedDarkMode(detectChatWidgetDarkMode());
|
|
26993
27008
|
const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
|
|
26994
|
-
const handleChange = () => setDetectedDarkMode(
|
|
27009
|
+
const handleChange = () => setDetectedDarkMode(detectChatWidgetDarkMode());
|
|
26995
27010
|
mediaQuery.addEventListener("change", handleChange);
|
|
26996
27011
|
const observer = new MutationObserver(() => {
|
|
26997
|
-
setDetectedDarkMode(
|
|
27012
|
+
setDetectedDarkMode(detectChatWidgetDarkMode());
|
|
26998
27013
|
});
|
|
26999
27014
|
observer.observe(document.documentElement, {
|
|
27000
27015
|
attributes: true,
|
|
@@ -27009,15 +27024,11 @@ var ChatWidget = forwardRef(function ChatWidget2({
|
|
|
27009
27024
|
observer.disconnect();
|
|
27010
27025
|
};
|
|
27011
27026
|
}, []);
|
|
27012
|
-
const theme = useMemo5(
|
|
27013
|
-
|
|
27014
|
-
|
|
27015
|
-
|
|
27016
|
-
|
|
27017
|
-
Object.entries(styleProps).filter(([, v]) => v !== void 0)
|
|
27018
|
-
) : {};
|
|
27019
|
-
return { ...baseTheme, ...overrides };
|
|
27020
|
-
}, [styleProps, detectedDarkMode]);
|
|
27027
|
+
const theme = useMemo5(
|
|
27028
|
+
() => resolveChatWidgetTheme(styleProps, detectedDarkMode),
|
|
27029
|
+
[styleProps, detectedDarkMode]
|
|
27030
|
+
);
|
|
27031
|
+
const widgetBorderWidth = typeof theme.borderWidth === "number" ? `${theme.borderWidth}px` : theme.borderWidth;
|
|
27021
27032
|
const themeVariables = useMemo5(
|
|
27022
27033
|
() => ({
|
|
27023
27034
|
"--chat-primary": theme.primaryColor,
|
|
@@ -27029,11 +27040,14 @@ var ChatWidget = forwardRef(function ChatWidget2({
|
|
|
27029
27040
|
"--chat-background-secondary": theme.backgroundSecondary,
|
|
27030
27041
|
"--chat-background-tertiary": theme.backgroundTertiary,
|
|
27031
27042
|
"--chat-border": theme.borderColor,
|
|
27032
|
-
"--chat-border-light": theme.
|
|
27043
|
+
"--chat-border-light": theme.subtleBorderColor,
|
|
27044
|
+
"--chat-widget-border-width": widgetBorderWidth,
|
|
27033
27045
|
"--chat-text": theme.textColor,
|
|
27034
27046
|
"--chat-text-secondary": theme.textSecondary,
|
|
27035
27047
|
"--chat-text-muted": theme.textMuted,
|
|
27036
27048
|
"--chat-text-disabled": theme.textDisabled,
|
|
27049
|
+
"--chat-link": theme.linkColor,
|
|
27050
|
+
"--chat-link-hover": theme.linkHoverColor,
|
|
27037
27051
|
"--chat-header-text": theme.headerTextColor,
|
|
27038
27052
|
"--chat-user-text": theme.userBubbleTextColor,
|
|
27039
27053
|
"--chat-assistant-bg": theme.assistantBubbleBackground,
|
|
@@ -27045,7 +27059,7 @@ var ChatWidget = forwardRef(function ChatWidget2({
|
|
|
27045
27059
|
"--chat-input-placeholder": theme.inputPlaceholderColor,
|
|
27046
27060
|
"--chat-thought-border": theme.thoughtsBorderColor
|
|
27047
27061
|
}),
|
|
27048
|
-
[theme]
|
|
27062
|
+
[theme, widgetBorderWidth]
|
|
27049
27063
|
);
|
|
27050
27064
|
const [input, setInput] = useState9("");
|
|
27051
27065
|
const [isMicActive, setIsMicActive] = useState9(false);
|
|
@@ -27413,7 +27427,29 @@ import { jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
|
27413
27427
|
function PopupChatWidget({ anchor, ...props }) {
|
|
27414
27428
|
const [isOpen, setIsOpen] = useState10(anchor?.initiallyOpen ?? false);
|
|
27415
27429
|
const [hasOpened, setHasOpened] = useState10(anchor?.initiallyOpen ?? false);
|
|
27430
|
+
const [detectedDarkMode, setDetectedDarkMode] = useState10(() => detectChatWidgetDarkMode());
|
|
27416
27431
|
const openResolved = props.openOverride ?? isOpen;
|
|
27432
|
+
useEffect7(() => {
|
|
27433
|
+
setDetectedDarkMode(detectChatWidgetDarkMode());
|
|
27434
|
+
const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
|
|
27435
|
+
const handleChange = () => setDetectedDarkMode(detectChatWidgetDarkMode());
|
|
27436
|
+
mediaQuery.addEventListener("change", handleChange);
|
|
27437
|
+
const observer = new MutationObserver(() => {
|
|
27438
|
+
setDetectedDarkMode(detectChatWidgetDarkMode());
|
|
27439
|
+
});
|
|
27440
|
+
observer.observe(document.documentElement, {
|
|
27441
|
+
attributes: true,
|
|
27442
|
+
attributeFilter: ["data-theme", "class"]
|
|
27443
|
+
});
|
|
27444
|
+
observer.observe(document.body, {
|
|
27445
|
+
attributes: true,
|
|
27446
|
+
attributeFilter: ["data-theme", "class"]
|
|
27447
|
+
});
|
|
27448
|
+
return () => {
|
|
27449
|
+
mediaQuery.removeEventListener("change", handleChange);
|
|
27450
|
+
observer.disconnect();
|
|
27451
|
+
};
|
|
27452
|
+
}, []);
|
|
27417
27453
|
useEffect7(() => {
|
|
27418
27454
|
if (props.openOverride === void 0) return;
|
|
27419
27455
|
setIsOpen(props.openOverride);
|
|
@@ -27433,13 +27469,11 @@ function PopupChatWidget({ anchor, ...props }) {
|
|
|
27433
27469
|
const anchorPositionClass = anchor?.position === "bottom-start" ? "chat-popup--start" : "chat-popup--end";
|
|
27434
27470
|
const closeConfig = anchor?.closeButton ?? props.closeButton;
|
|
27435
27471
|
const showClose = closeConfig?.show !== false;
|
|
27472
|
+
const theme = useMemo6(
|
|
27473
|
+
() => resolveChatWidgetTheme(props.styles, detectedDarkMode),
|
|
27474
|
+
[props.styles, detectedDarkMode]
|
|
27475
|
+
);
|
|
27436
27476
|
const themeStyle = useMemo6(() => {
|
|
27437
|
-
const primary = props.styles?.primaryColor ?? "#3b82f6";
|
|
27438
|
-
const primaryText = props.styles?.primaryTextColor ?? "#ffffff";
|
|
27439
|
-
const background = props.styles?.backgroundColor ?? "#ffffff";
|
|
27440
|
-
const border = props.styles?.borderColor ?? "#e5e7eb";
|
|
27441
|
-
const headerText = props.styles?.headerTextColor ?? "#ffffff";
|
|
27442
|
-
const radius = props.styles?.borderRadius ?? "0.75rem";
|
|
27443
27477
|
const mixWithBlack2 = (hex3, ratio = 0.15) => {
|
|
27444
27478
|
const normalized = hex3.replace("#", "");
|
|
27445
27479
|
if (!/^[0-9a-fA-F]{6}$/.test(normalized)) return hex3;
|
|
@@ -27450,15 +27484,19 @@ function PopupChatWidget({ anchor, ...props }) {
|
|
|
27450
27484
|
return `#${mix(r).toString(16).padStart(2, "0")}${mix(g).toString(16).padStart(2, "0")}${mix(b).toString(16).padStart(2, "0")}`;
|
|
27451
27485
|
};
|
|
27452
27486
|
return {
|
|
27453
|
-
"--chat-primary":
|
|
27454
|
-
"--chat-primary-hover": mixWithBlack2(
|
|
27455
|
-
"--chat-primary-text":
|
|
27456
|
-
"--chat-background":
|
|
27457
|
-
"--chat-border":
|
|
27458
|
-
"--chat-header-text":
|
|
27459
|
-
"--chat-radius":
|
|
27487
|
+
"--chat-primary": theme.primaryColor,
|
|
27488
|
+
"--chat-primary-hover": mixWithBlack2(theme.primaryColor, 0.2),
|
|
27489
|
+
"--chat-primary-text": theme.primaryTextColor,
|
|
27490
|
+
"--chat-background": theme.backgroundColor,
|
|
27491
|
+
"--chat-border": theme.borderColor,
|
|
27492
|
+
"--chat-header-text": theme.headerTextColor,
|
|
27493
|
+
"--chat-radius": theme.borderRadius,
|
|
27494
|
+
"--chat-text": theme.textColor,
|
|
27495
|
+
"--chat-text-muted": theme.textMuted,
|
|
27496
|
+
"--chat-link": theme.linkColor,
|
|
27497
|
+
"--chat-link-hover": theme.linkHoverColor
|
|
27460
27498
|
};
|
|
27461
|
-
}, [
|
|
27499
|
+
}, [theme]);
|
|
27462
27500
|
const popupStyle = useMemo6(() => {
|
|
27463
27501
|
const size = props.popupSize ?? {};
|
|
27464
27502
|
return {
|