@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 CHANGED
@@ -450,7 +450,9 @@ interface ChatWidgetStyles {
450
450
  backgroundSecondary?: string;
451
451
  backgroundTertiary?: string;
452
452
  borderColor?: string;
453
- borderColorLight?: string;
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
- borderColorLight: "#f3f4f6",
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: "#1f2937",
26925
- backgroundSecondary: "#374151",
26926
- backgroundTertiary: "#4b5563",
26927
- borderColor: "#4b5563",
26928
- borderColorLight: "#374151",
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: "#f9fafb",
26933
- textColor: "#f9fafb",
26934
- textSecondary: "#d1d5db",
26935
- textMuted: "#9ca3af",
26936
- textDisabled: "#6b7280",
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: "#374151",
26940
- inputTextColor: "#f9fafb",
26941
- inputPlaceholderColor: "#9ca3af",
26942
- thoughtsBorderColor: "#4b5563"
26945
+ inputBackground: "#1f2937",
26946
+ inputTextColor: "#fafafa",
26947
+ inputPlaceholderColor: "#a1a1aa",
26948
+ thoughtsBorderColor: "#374151"
26943
26949
  };
26944
- function detectDarkMode() {
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(() => detectDarkMode());
27005
+ const [detectedDarkMode, setDetectedDarkMode] = useState9(() => detectChatWidgetDarkMode());
26991
27006
  useEffect6(() => {
26992
- setDetectedDarkMode(detectDarkMode());
27007
+ setDetectedDarkMode(detectChatWidgetDarkMode());
26993
27008
  const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
26994
- const handleChange = () => setDetectedDarkMode(detectDarkMode());
27009
+ const handleChange = () => setDetectedDarkMode(detectChatWidgetDarkMode());
26995
27010
  mediaQuery.addEventListener("change", handleChange);
26996
27011
  const observer = new MutationObserver(() => {
26997
- setDetectedDarkMode(detectDarkMode());
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
- const themeMode = styleProps?.theme || "auto";
27014
- const isDark = themeMode === "dark" || themeMode === "auto" && detectedDarkMode;
27015
- const baseTheme = isDark ? darkTheme : lightTheme;
27016
- const overrides = styleProps ? Object.fromEntries(
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.borderColorLight,
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": primary,
27454
- "--chat-primary-hover": mixWithBlack2(primary, 0.2),
27455
- "--chat-primary-text": primaryText,
27456
- "--chat-background": background,
27457
- "--chat-border": border,
27458
- "--chat-header-text": headerText,
27459
- "--chat-radius": 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
- }, [props.styles]);
27499
+ }, [theme]);
27462
27500
  const popupStyle = useMemo6(() => {
27463
27501
  const size = props.popupSize ?? {};
27464
27502
  return {