@helpai/elements 0.20.0 → 0.21.1

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/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as Asset, B as BlocksConfig, C as ConnectionConfig, a as ConnectionConfigPartial, L as Link, S as ServerConfig, b as SiteConfig, c as StartConversationResponse, W as WidgetConfig, d as WidgetConfigPartial, e as WidgetSettings, f as WidgetSettingsPartial } from './deployment-BvNoqfIC.js';
1
+ export { A as Asset, B as BlocksConfig, C as ConnectionConfig, a as ConnectionConfigPartial, L as Link, S as ServerConfig, b as SiteConfig, c as StartConversationResponse, W as WidgetConfig, d as WidgetConfigPartial, e as WidgetSettings, f as WidgetSettingsPartial } from './deployment-B8UxV4b5.js';
2
2
  import 'zod';
3
3
 
4
4
  /**
@@ -331,20 +331,6 @@ type ThemePreference = "auto" | "light" | "dark";
331
331
  * whole.
332
332
  */
333
333
  type ResponseMode = "streaming" | "buffered";
334
- /**
335
- * How welcome messages (pushed by the server via `connect`) render.
336
- *
337
- * - `'typewriter'` (default) — each message types in character by character.
338
- * - `'instant'` — messages appear whole the moment they arrive.
339
- */
340
- type WelcomeAnimation = "typewriter" | "instant";
341
- /** Welcome-message rendering options. */
342
- interface WelcomeOptions {
343
- /** Render style for welcome messages. Default: `'typewriter'`. */
344
- animation?: WelcomeAnimation;
345
- /** Typewriter speed in characters per second. Default: `60`. */
346
- speed?: number;
347
- }
348
334
  /**
349
335
  * Identifiers for every header action the widget can render.
350
336
  *
@@ -1054,7 +1040,6 @@ interface ChatWidgetOptions {
1054
1040
  launcher?: LauncherOptions;
1055
1041
  header?: HeaderOptions;
1056
1042
  composer?: ComposerOptions;
1057
- welcome?: WelcomeOptions;
1058
1043
  feedback?: FeedbackOptions;
1059
1044
  i18n?: I18nOptions;
1060
1045
  footer?: FooterOptions;
@@ -1107,7 +1092,6 @@ interface ResolvedOptions {
1107
1092
  * when the resolved URL is empty).
1108
1093
  */
1109
1094
  popOutUrl: string;
1110
- welcome: Required<WelcomeOptions>;
1111
1095
  features: Required<Omit<FeatureFlags, "tools">> & {
1112
1096
  tools?: Array<string | ToolRef>;
1113
1097
  };
@@ -1185,7 +1169,6 @@ interface ServerConfig {
1185
1169
  launcher?: LauncherOptions;
1186
1170
  header?: HeaderOptions;
1187
1171
  composer?: ComposerOptions;
1188
- welcome?: WelcomeOptions;
1189
1172
  feedback?: FeedbackOptions;
1190
1173
  i18n?: I18nOptions;
1191
1174
  footer?: FooterOptions;
package/index.mjs CHANGED
@@ -462,7 +462,6 @@ var DEFAULT_ATTACHMENTS = {
462
462
  maxCount: 10,
463
463
  accept: "*/*"
464
464
  };
465
- var DEFAULT_WELCOME = { animation: "instant", speed: 60 };
466
465
  var DEFAULT_FEATURES = {
467
466
  files: true,
468
467
  voice: "local",
@@ -532,7 +531,6 @@ function resolveOptions(rawOpts) {
532
531
  showReasoning: behavior.showReasoning ?? false,
533
532
  showToolCalls: behavior.showToolCalls ?? false,
534
533
  popOutUrl: behavior.popOutUrl ?? BRAND.standaloneUrl,
535
- welcome: { ...DEFAULT_WELCOME, ...opts.welcome },
536
534
  features: {
537
535
  files: opts.features?.files ?? DEFAULT_FEATURES.files,
538
536
  voice: opts.features?.voice ?? DEFAULT_FEATURES.voice,
@@ -734,7 +732,6 @@ var SECTION_KEYS = [
734
732
  "launcher",
735
733
  "header",
736
734
  "composer",
737
- "welcome",
738
735
  "feedback",
739
736
  "i18n",
740
737
  "footer",
@@ -925,7 +922,7 @@ function bindHostCommands(host, handlers) {
925
922
  }
926
923
 
927
924
  // src/styles/tokens.css
928
- var tokens_default = ':host{--__P__-accent-user: __BRAND_ACCENT__;--__P__-accent: var(--__P__-accent-user);--__P__-accent-text: __BRAND_ACCENT_TEXT__;--__P__-radius: __BRAND_RADIUS__;--__P__-radius-sm: 8px;--__P__-radius-md: 10px;--__P__-radius-lg: 16px;--__P__-font: __BRAND_FONT__;--__P__-font-display: var(--__P__-font);--__P__-font-mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace;--__P__-bg: oklch(1 0 0);--__P__-bg-elevated: oklch(.9789 .0029 278.3);--__P__-surface: var(--__P__-bg-elevated);--__P__-muted: var(--__P__-fg-muted);--__P__-hover: oklch(.1686 .011 278.3 / .06);--__P__-fg: oklch(.1686 .011 278.3);--__P__-fg-muted: oklch(.4932 .0301 278.3);--__P__-border: oklch(.9312 .0084 278.3);--__P__-border-strong: oklch(.8757 .0131 278.3);--__P__-bubble-user: var(--__P__-accent);--__P__-bubble-user-text: var(--__P__-accent-text);--__P__-bubble-assistant: oklch(.9638 .0058 278.3);--__P__-bubble-assistant-text: var(--__P__-fg);--__P__-on-accent: var(--__P__-accent-text);--__P__-success: oklch(.6456 .1654 151.53);--__P__-warning: oklch(.7135 .1494 74.05);--__P__-danger: oklch(.5966 .1818 24.51);--__P__-danger-text: oklch(.5054 .1905 27.52);--__P__-danger-bg: oklch(.5966 .1818 24.51 / .1);--__P__-neutral: oklch(.7137 .0192 278.3);--__P__-focus: var(--__P__-accent);--__P__-shadow-panel: 0 8px 24px -8px rgba(13, 15, 20, .18), 0 24px 64px -24px rgba(13, 15, 20, .24);--__P__-shadow-card: 0 1px 2px rgba(13, 15, 20, .06), 0 4px 12px -6px rgba(13, 15, 20, .12);--__P__-backdrop: oklch(.1686 .011 278.3 / .55);--__P__-shadow-fab: 0 6px 16px -4px color-mix(in oklch, var(--__P__-accent) 45%, transparent), 0 12px 32px -12px rgba(13, 15, 20, .25);--__P__-z-fab: 2147483600;--__P__-z-panel: 2147483601;--__P__-panel-w: 380px;--__P__-panel-h: 600px;--__P__-fab-size: 56px;--__P__-space-1: 4px;--__P__-space-2: 8px;--__P__-space-3: 12px;--__P__-space-4: 16px;--__P__-space-5: 20px;--__P__-space-6: 24px;--__P__-space-8: 32px;--__P__-text-scale: 1;--__P__-text-xs: calc(12px * var(--__P__-text-scale));--__P__-text-sm: calc(13px * var(--__P__-text-scale));--__P__-text-base: calc(15px * var(--__P__-text-scale));--__P__-text-md: calc(16px * var(--__P__-text-scale));--__P__-text-lg: calc(18px * var(--__P__-text-scale));--__P__-text-xl: calc(22px * var(--__P__-text-scale));--__P__-text-2xl: calc(30px * var(--__P__-text-scale))}:host([data-text-size="small"]){--__P__-text-scale: .9}:host([data-text-size="large"]){--__P__-text-scale: 1.15}:host{--__P__-ease: cubic-bezier(.2, .7, .2, 1);--__P__-ease-out: cubic-bezier(.2, .7, .2, 1);--__P__-ease-in: cubic-bezier(.4, 0, 1, 1);--__P__-ease-in-out: cubic-bezier(.65, 0, .35, 1);--__P__-dur-quick: .12s;--__P__-dur-base: .22s;--__P__-dur-slow: .32s;font-family:var(--__P__-font);color:var(--__P__-fg);color-scheme:light;--__P__-color-scheme: light}:host([data-theme="dark"]){--__P__-bg: oklch(.1783 .0128 278.3);--__P__-bg-elevated: oklch(.2232 .0182 278.3);--__P__-fg: oklch(.9368 .01 278.3);--__P__-fg-muted: oklch(.7048 .0296 278.3);--__P__-border: oklch(.2752 .0266 278.3);--__P__-border-strong: oklch(.335 .0291 278.3);--__P__-hover: oklch(.9368 .01 278.3 / .08);--__P__-bubble-assistant: oklch(.2474 .0311 278.3);--__P__-bubble-assistant-text: var(--__P__-fg);--__P__-danger-text: oklch(.8077 .1035 19.57);--__P__-danger-bg: oklch(.5966 .1818 24.51 / .18);--__P__-shadow-panel: 0 8px 24px -8px rgba(0, 0, 0, .6), 0 24px 64px -24px rgba(0, 0, 0, .7);--__P__-shadow-card: 0 1px 2px rgba(0, 0, 0, .4), 0 4px 12px -6px rgba(0, 0, 0, .5);--__P__-backdrop: rgba(0, 0, 0, .65);color-scheme:dark;--__P__-color-scheme: dark}@media(prefers-color-scheme:dark){:host([data-theme="auto"]){--__P__-bg: oklch(.1783 .0128 278.3);--__P__-bg-elevated: oklch(.2232 .0182 278.3);--__P__-fg: oklch(.9368 .01 278.3);--__P__-fg-muted: oklch(.7048 .0296 278.3);--__P__-border: oklch(.2752 .0266 278.3);--__P__-border-strong: oklch(.335 .0291 278.3);--__P__-hover: oklch(.9368 .01 278.3 / .08);--__P__-bubble-assistant: oklch(.2474 .0311 278.3);--__P__-bubble-assistant-text: var(--__P__-fg);--__P__-shadow-panel: 0 8px 24px -8px rgba(0, 0, 0, .6), 0 24px 64px -24px rgba(0, 0, 0, .7);color-scheme:dark;--__P__-color-scheme: dark}}@supports (color: oklch(from red l c h)){:host{--__P__-accent: oklch(from var(--__P__-accent-user) clamp(.3, l, .62) c h);--__P__-accent-text: oklch(from var(--__P__-accent) clamp(0, (l / .623 - 1) * -infinity, 1) 0 h)}:host([data-theme="dark"]){--__P__-accent: oklch(from var(--__P__-accent-user) clamp(.65, l, .85) c h)}@media(prefers-color-scheme:dark){:host([data-theme="auto"]){--__P__-accent: oklch(from var(--__P__-accent-user) clamp(.65, l, .85) c h)}}}@media(prefers-reduced-motion:reduce){:host{--__P__-dur-quick: 1ms;--__P__-dur-base: 1ms;--__P__-dur-slow: 1ms}}\n';
925
+ var tokens_default = ':host{--__P__-accent-user: __BRAND_ACCENT__;--__P__-accent: var(--__P__-accent-user);--__P__-accent-text-user: __BRAND_ACCENT_TEXT__;--__P__-accent-text: var(--__P__-accent-text-user);--__P__-radius: __BRAND_RADIUS__;--__P__-radius-sm: 8px;--__P__-radius-md: 10px;--__P__-radius-lg: 16px;--__P__-font: __BRAND_FONT__;--__P__-font-display: var(--__P__-font);--__P__-font-mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace;--__P__-bg: oklch(1 0 0);--__P__-bg-elevated: oklch(.9789 .0029 278.3);--__P__-surface: var(--__P__-bg-elevated);--__P__-muted: var(--__P__-fg-muted);--__P__-hover: oklch(.1686 .011 278.3 / .06);--__P__-fg: oklch(.1686 .011 278.3);--__P__-fg-muted: oklch(.4932 .0301 278.3);--__P__-border: oklch(.9312 .0084 278.3);--__P__-border-strong: oklch(.8757 .0131 278.3);--__P__-bubble-user: var(--__P__-accent);--__P__-bubble-user-text: var(--__P__-accent-text);--__P__-bubble-assistant: oklch(.9638 .0058 278.3);--__P__-bubble-assistant-text: var(--__P__-fg);--__P__-on-accent: var(--__P__-accent-text);--__P__-success: oklch(.6456 .1654 151.53);--__P__-warning: oklch(.7135 .1494 74.05);--__P__-danger: oklch(.5966 .1818 24.51);--__P__-danger-text: oklch(.5054 .1905 27.52);--__P__-danger-bg: oklch(.5966 .1818 24.51 / .1);--__P__-neutral: oklch(.7137 .0192 278.3);--__P__-focus: var(--__P__-accent);--__P__-shadow-panel: 0 8px 24px -8px rgba(13, 15, 20, .18), 0 24px 64px -24px rgba(13, 15, 20, .24);--__P__-shadow-card: 0 1px 2px rgba(13, 15, 20, .06), 0 4px 12px -6px rgba(13, 15, 20, .12);--__P__-backdrop: oklch(.1686 .011 278.3 / .55);--__P__-shadow-fab: 0 6px 16px -4px color-mix(in oklch, var(--__P__-accent) 45%, transparent), 0 12px 32px -12px rgba(13, 15, 20, .25);--__P__-z-fab: 2147483600;--__P__-z-panel: 2147483601;--__P__-panel-w: 380px;--__P__-panel-h: 600px;--__P__-fab-size: 56px;--__P__-space-1: 4px;--__P__-space-2: 8px;--__P__-space-3: 12px;--__P__-space-4: 16px;--__P__-space-5: 20px;--__P__-space-6: 24px;--__P__-space-8: 32px;--__P__-text-scale: 1;--__P__-text-xs: calc(12px * var(--__P__-text-scale));--__P__-text-sm: calc(13px * var(--__P__-text-scale));--__P__-text-base: calc(15px * var(--__P__-text-scale));--__P__-text-md: calc(16px * var(--__P__-text-scale));--__P__-text-lg: calc(18px * var(--__P__-text-scale));--__P__-text-xl: calc(22px * var(--__P__-text-scale));--__P__-text-2xl: calc(30px * var(--__P__-text-scale))}:host([data-text-size="small"]){--__P__-text-scale: .9}:host([data-text-size="large"]){--__P__-text-scale: 1.15}:host{--__P__-ease: cubic-bezier(.2, .7, .2, 1);--__P__-ease-out: cubic-bezier(.2, .7, .2, 1);--__P__-ease-in: cubic-bezier(.4, 0, 1, 1);--__P__-ease-in-out: cubic-bezier(.65, 0, .35, 1);--__P__-dur-quick: .12s;--__P__-dur-base: .22s;--__P__-dur-slow: .32s;font-family:var(--__P__-font);color:var(--__P__-fg);color-scheme:light;--__P__-color-scheme: light}:host([data-theme="dark"]){--__P__-bg: oklch(.1783 .0128 278.3);--__P__-bg-elevated: oklch(.2232 .0182 278.3);--__P__-fg: oklch(.9368 .01 278.3);--__P__-fg-muted: oklch(.7048 .0296 278.3);--__P__-border: oklch(.2752 .0266 278.3);--__P__-border-strong: oklch(.335 .0291 278.3);--__P__-hover: oklch(.9368 .01 278.3 / .08);--__P__-bubble-assistant: oklch(.2474 .0311 278.3);--__P__-bubble-assistant-text: var(--__P__-fg);--__P__-danger-text: oklch(.8077 .1035 19.57);--__P__-danger-bg: oklch(.5966 .1818 24.51 / .18);--__P__-shadow-panel: 0 8px 24px -8px rgba(0, 0, 0, .6), 0 24px 64px -24px rgba(0, 0, 0, .7);--__P__-shadow-card: 0 1px 2px rgba(0, 0, 0, .4), 0 4px 12px -6px rgba(0, 0, 0, .5);--__P__-backdrop: rgba(0, 0, 0, .65);color-scheme:dark;--__P__-color-scheme: dark}@media(prefers-color-scheme:dark){:host([data-theme="auto"]){--__P__-bg: oklch(.1783 .0128 278.3);--__P__-bg-elevated: oklch(.2232 .0182 278.3);--__P__-fg: oklch(.9368 .01 278.3);--__P__-fg-muted: oklch(.7048 .0296 278.3);--__P__-border: oklch(.2752 .0266 278.3);--__P__-border-strong: oklch(.335 .0291 278.3);--__P__-hover: oklch(.9368 .01 278.3 / .08);--__P__-bubble-assistant: oklch(.2474 .0311 278.3);--__P__-bubble-assistant-text: var(--__P__-fg);--__P__-shadow-panel: 0 8px 24px -8px rgba(0, 0, 0, .6), 0 24px 64px -24px rgba(0, 0, 0, .7);color-scheme:dark;--__P__-color-scheme: dark}}@supports (color: oklch(from red l c h)){:host{--__P__-accent: oklch(from var(--__P__-accent-user) clamp(.3, l, .62) c h);--__P__-accent-text: oklch(from var(--__P__-accent) clamp(0, (l / .623 - 1) * -infinity, 1) 0 h)}:host([data-theme="dark"]){--__P__-accent: oklch(from var(--__P__-accent-user) clamp(.65, l, .85) c h)}@media(prefers-color-scheme:dark){:host([data-theme="auto"]){--__P__-accent: oklch(from var(--__P__-accent-user) clamp(.65, l, .85) c h)}}}@media(prefers-reduced-motion:reduce){:host{--__P__-dur-quick: 1ms;--__P__-dur-base: 1ms;--__P__-dur-slow: 1ms}}\n';
929
926
 
930
927
  // src/styles/reset.css
931
928
  var reset_default = '*,*:before,*:after{box-sizing:border-box;margin:0;padding:0;border:0}button{font:inherit;color:inherit;background:none;cursor:pointer;-webkit-appearance:none;appearance:none;line-height:1}button:focus-visible,[tabindex]:focus-visible,textarea:focus-visible,input:focus-visible{outline:2px solid var(--__P__-accent);outline-offset:2px}textarea,input{font:inherit;color:inherit;background:none;border:0;outline:0;resize:none}a{color:var(--__P__-accent);text-decoration:underline;text-underline-offset:2px}img,svg{display:block;max-width:100%}ul,ol{list-style:none}.__P__-app{display:block;width:100%;height:100%;font-family:var(--__P__-font);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:"cv11","ss01","ss03"}.__P__-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n';
@@ -1021,7 +1018,7 @@ function attachAdoptedSheet(shadow, doc) {
1021
1018
  function applyThemeOverrides(host, overrides) {
1022
1019
  const p33 = BRAND.cssPrefix;
1023
1020
  if (overrides.accent) host.style.setProperty(`--${p33}-accent-user`, overrides.accent);
1024
- if (overrides.accentText) host.style.setProperty(`--${p33}-accent-text`, overrides.accentText);
1021
+ if (overrides.accentText) host.style.setProperty(`--${p33}-accent-text-user`, overrides.accentText);
1025
1022
  if (overrides.radius) host.style.setProperty(`--${p33}-radius`, overrides.radius);
1026
1023
  if (overrides.fontFamily) host.style.setProperty(`--${p33}-font`, overrides.fontFamily);
1027
1024
  }
@@ -1860,15 +1857,6 @@ function makeAssistantMessage() {
1860
1857
  partsSig: signal([])
1861
1858
  };
1862
1859
  }
1863
- function makeTypewriterMessage(m) {
1864
- return {
1865
- id: m.id,
1866
- role: m.role,
1867
- createdAt: Date.now(),
1868
- status: "streaming",
1869
- partsSig: signal([{ kind: "text", id: `${m.id}-t0`, textSig: signal(""), doneSig: signal(false) }])
1870
- };
1871
- }
1872
1860
  function makeInstantWelcomeMessage(m) {
1873
1861
  return toReactive({
1874
1862
  id: m.id,
@@ -4762,6 +4750,7 @@ function LoadingSpinner({ label }) {
4762
4750
  import { jsx as jsx17, jsxs as jsxs14 } from "preact/jsx-runtime";
4763
4751
  var p15 = BRAND.cssPrefix;
4764
4752
  var STICK_THRESHOLD = 120;
4753
+ var INTERACTION_GRACE_MS = 350;
4765
4754
  var DIVIDER_IDLE_MS = 1200;
4766
4755
  function MessageList({
4767
4756
  messagesSig,
@@ -4782,6 +4771,8 @@ function MessageList({
4782
4771
  const hasHydratedRef = useRef5(false);
4783
4772
  const detachedRef = useRef5(false);
4784
4773
  const interactingRef = useRef5(false);
4774
+ const interactionEndedAtRef = useRef5(0);
4775
+ const inInteractionGrace = () => interactingRef.current || performance.now() - interactionEndedAtRef.current < INTERACTION_GRACE_MS;
4785
4776
  const autoPinAtRef = useRef5(0);
4786
4777
  const pinBottom = (el) => {
4787
4778
  autoPinAtRef.current = performance.now();
@@ -4822,7 +4813,7 @@ function MessageList({
4822
4813
  pinBottom(el);
4823
4814
  return;
4824
4815
  }
4825
- if (detachedRef.current || interactingRef.current) return;
4816
+ if (detachedRef.current || inInteractionGrace()) return;
4826
4817
  const distanceFromBottom = el.scrollHeight - el.scrollTop - el.clientHeight;
4827
4818
  if (distanceFromBottom < STICK_THRESHOLD) pinBottom(el);
4828
4819
  }, [messages.value.length]);
@@ -4832,7 +4823,7 @@ function MessageList({
4832
4823
  const last = messages.value.at(-1);
4833
4824
  if (!last) return;
4834
4825
  const pinIfNear = () => {
4835
- if (detachedRef.current || interactingRef.current) return;
4826
+ if (detachedRef.current || inInteractionGrace()) return;
4836
4827
  const distance = el.scrollHeight - el.scrollTop - el.clientHeight;
4837
4828
  if (distance < STICK_THRESHOLD * 2) pinBottom(el);
4838
4829
  };
@@ -4882,6 +4873,7 @@ function MessageList({
4882
4873
  };
4883
4874
  const endInteraction = () => {
4884
4875
  interactingRef.current = false;
4876
+ interactionEndedAtRef.current = performance.now();
4885
4877
  };
4886
4878
  const onPointerDown = () => {
4887
4879
  interactingRef.current = true;
@@ -6254,55 +6246,6 @@ function ModulesEmpty({ strings, onClose }) {
6254
6246
  );
6255
6247
  }
6256
6248
 
6257
- // src/ui/welcome-animator.ts
6258
- async function animateWelcomeSequence(reactives, payloads, charsPerSecond, abort) {
6259
- for (let i = 0; i < reactives.length; i++) {
6260
- if (abort.aborted) return;
6261
- const msg = reactives[i];
6262
- const payload = payloads[i];
6263
- if (!msg || !payload) continue;
6264
- await animateTypewriter(msg, payload.text, charsPerSecond, abort);
6265
- }
6266
- }
6267
- function animateTypewriter(msg, text, charsPerSecond, abort) {
6268
- return new Promise((resolve) => {
6269
- const part = msg.partsSig.value[0];
6270
- if (!part || part.kind !== "text") {
6271
- resolve();
6272
- return;
6273
- }
6274
- const finish = () => {
6275
- part.textSig.value = text;
6276
- part.doneSig.value = true;
6277
- msg.status = "complete";
6278
- msg.partsSig.value = [...msg.partsSig.value];
6279
- resolve();
6280
- };
6281
- if (typeof requestAnimationFrame === "undefined") {
6282
- finish();
6283
- return;
6284
- }
6285
- const totalMs = text.length / Math.max(1, charsPerSecond) * 1e3;
6286
- const start = performance.now();
6287
- const tick = (now) => {
6288
- if (abort.aborted) return finish();
6289
- const progress = totalMs === 0 ? 1 : Math.min(1, (now - start) / totalMs);
6290
- part.textSig.value = text.slice(0, Math.floor(progress * text.length));
6291
- if (progress >= 1) return finish();
6292
- rafId = requestAnimationFrame(tick);
6293
- };
6294
- let rafId = requestAnimationFrame(tick);
6295
- abort.addEventListener(
6296
- "abort",
6297
- () => {
6298
- cancelAnimationFrame(rafId);
6299
- finish();
6300
- },
6301
- { once: true }
6302
- );
6303
- });
6304
- }
6305
-
6306
6249
  // src/ui/use-launcher-callout.ts
6307
6250
  import { useCallback as useCallback5, useEffect as useEffect16, useState as useState12 } from "preact/hooks";
6308
6251
  function useLauncherCallout({ callout, persistence }) {
@@ -6381,7 +6324,6 @@ function App({ options, hostElement, bus }) {
6381
6324
  const [agent, setAgent] = useState13(null);
6382
6325
  const [suggestions, setSuggestions] = useState13([]);
6383
6326
  const [activeCancel, setActiveCancel] = useState13(null);
6384
- const welcomeAbortRef = useRef9(null);
6385
6327
  const [parsedSite, setParsedSite] = useState13(void 0);
6386
6328
  const [parsedBlocks, setParsedBlocks] = useState13(void 0);
6387
6329
  const [sidebarCollapsed, setSidebarCollapsed] = useState13(() => persistence.loadSidebarCollapsed() ?? false);
@@ -6465,19 +6407,9 @@ function App({ options, hostElement, bus }) {
6465
6407
  const playWelcome = useCallback6(
6466
6408
  (welcomeMessages) => {
6467
6409
  if (!welcomeMessages || welcomeMessages.length === 0) return;
6468
- const { animation, speed } = options.welcome;
6469
- if (animation === "instant") {
6470
- messagesSig.value = welcomeMessages.map(makeInstantWelcomeMessage);
6471
- return;
6472
- }
6473
- welcomeAbortRef.current?.abort();
6474
- const ctrl = new AbortController();
6475
- welcomeAbortRef.current = ctrl;
6476
- const reactives = welcomeMessages.map(makeTypewriterMessage);
6477
- messagesSig.value = reactives;
6478
- void animateWelcomeSequence(reactives, welcomeMessages, speed, ctrl.signal);
6410
+ messagesSig.value = welcomeMessages.map(makeInstantWelcomeMessage);
6479
6411
  },
6480
- [messagesSig, options.welcome]
6412
+ [messagesSig]
6481
6413
  );
6482
6414
  const connectGenRef = useRef9(0);
6483
6415
  const runStartConversation = useCallback6(
@@ -6916,7 +6848,6 @@ function App({ options, hostElement, bus }) {
6916
6848
  log16.info("clear \u2192 new conversation", { wasStreaming: streaming });
6917
6849
  bus.emit("clear", void 0);
6918
6850
  if (streaming) activeCancel?.();
6919
- welcomeAbortRef.current?.abort();
6920
6851
  messagesSig.value = [];
6921
6852
  conversationIdSig.value = void 0;
6922
6853
  persistence.clearConversation();
package/package.json CHANGED
@@ -80,5 +80,5 @@
80
80
  ],
81
81
  "type": "module",
82
82
  "types": "./index.d.ts",
83
- "version": "0.20.0"
83
+ "version": "0.21.1"
84
84
  }
package/schema.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as Asset, B as BlocksConfig, C as ConnectionConfig, a as ConnectionConfigPartial, E as Endpoints, L as Link, P as PAGE_AREA_SUGGESTIONS, g as PageContext, S as ServerConfig, b as SiteConfig, c as StartConversationResponse, U as UserContext, W as WidgetConfig, d as WidgetConfigPartial, e as WidgetSettings, f as WidgetSettingsPartial, h as assetSchema, i as blocksConfigSchema, j as connectionConfigPartialSchema, k as connectionConfigSchema, l as cssColorSchema, m as cssLengthSchema, n as endpointsSchema, o as linkSchema, p as localeSchema, q as pageContextSchema, s as serverConfigSchema, r as siteConfigSchema, t as startConversationResponseSchema, u as userContextSchema, v as uuid7Schema, w as widgetConfigPartialSchema, x as widgetConfigSchema, y as widgetSettingsPartialSchema, z as widgetSettingsSchema } from './deployment-BvNoqfIC.js';
1
+ export { A as Asset, B as BlocksConfig, C as ConnectionConfig, a as ConnectionConfigPartial, E as Endpoints, L as Link, P as PAGE_AREA_SUGGESTIONS, g as PageContext, S as ServerConfig, b as SiteConfig, c as StartConversationResponse, U as UserContext, W as WidgetConfig, d as WidgetConfigPartial, e as WidgetSettings, f as WidgetSettingsPartial, h as assetSchema, i as blocksConfigSchema, j as connectionConfigPartialSchema, k as connectionConfigSchema, l as cssColorSchema, m as cssLengthSchema, n as endpointsSchema, o as linkSchema, p as localeSchema, q as pageContextSchema, s as serverConfigSchema, r as siteConfigSchema, t as startConversationResponseSchema, u as userContextSchema, v as uuid7Schema, w as widgetConfigPartialSchema, x as widgetConfigSchema, y as widgetSettingsPartialSchema, z as widgetSettingsSchema } from './deployment-B8UxV4b5.js';
2
2
  import { z } from 'zod';
3
3
 
4
4
  /**
@@ -504,27 +504,6 @@ declare const composerOptionsSchema: z.ZodObject<{
504
504
  }, z.core.$loose>;
505
505
  type ComposerOptions = z.infer<typeof composerOptionsSchema>;
506
506
 
507
- /**
508
- * Welcome section — how the agent's greeting messages render when
509
- * the chat opens. Content (the actual message text + suggestions)
510
- * comes from the server's start-conversation response; this schema only
511
- * governs the visual presentation (animation style + speed).
512
- */
513
-
514
- declare const welcomeAnimationSchema: z.ZodEnum<{
515
- typewriter: "typewriter";
516
- instant: "instant";
517
- }>;
518
- type WelcomeAnimation = z.infer<typeof welcomeAnimationSchema>;
519
- declare const welcomeOptionsSchema: z.ZodObject<{
520
- animation: z.ZodDefault<z.ZodEnum<{
521
- typewriter: "typewriter";
522
- instant: "instant";
523
- }>>;
524
- speed: z.ZodDefault<z.ZodNumber>;
525
- }, z.core.$loose>;
526
- type WelcomeOptions = z.infer<typeof welcomeOptionsSchema>;
527
-
528
507
  /**
529
508
  * Footer section schemas — the area below the composer.
530
509
  *
@@ -902,4 +881,4 @@ declare const ALL_MODES: readonly Mode[];
902
881
  */
903
882
  declare function emitJsonSchema(): unknown;
904
883
 
905
- export { ALL_MODES, type ActionName, type AttachmentLimits, type Behavior, type CalloutPosition, type CalloutShape, type ComposerOptions, type FeatureFlags, type FeedbackEvent, type FeedbackOptions, type FieldOption, type FieldType, type FieldValidation, type FooterOptions, type FormCondition, type FormDef, type FormField, type Forms, type HapticsOptions, type HeaderActions, type HeaderOptions, type I18nOptions, type LauncherCallout, type LauncherOptions, type LauncherSize, type LauncherVariant, type Mode, type ModuleLayout, type ModuleOptions, type ModulesOptions, type Position, type PoweredBy, type Presentation, type ResizeOptions, type ResponseMode, type SendButtonOptions, type SizeOptions, type SoundOptions, type StringsOverride, type ThemeOverrides, type ThemePreference, type VoiceMode, type WelcomeAnimation, type WelcomeOptions, actionNameSchema, attachmentLimitsSchema, behaviorSchema, calloutPositionSchema, calloutShapeSchema, composerOptionsSchema, emitJsonSchema, featureFlagsSchema, feedbackEventSchema, feedbackSchema, fieldOptionSchema, fieldTypeSchema, fieldValidationSchema, footerSchema, formConditionSchema, formDefSchema, formFieldSchema, formTriggerSchema, formsSchema, hapticsOptionsSchema, headerActionsSchema, headerSchema, i18nSchema, initialSizeSchema, launcherCalloutSchema, launcherOptionsSchema, launcherSizeSchema, launcherVariantSchema, modeSchema, moduleLayoutSchema, moduleSchema, modulesSchema, positionSchema, poweredBySchema, presentationSchema, resizeOptionsSchema, responseModeSchema, sendButtonIconSchema, sendButtonOptionsSchema, sendButtonShapeSchema, sendButtonVariantSchema, sizeOptionsSchema, soundOptionsSchema, stringsOverrideSchema, themeFieldSchema, themeOverridesSchema, themePreferenceSchema, toolRefSchema, voiceModeSchema, welcomeAnimationSchema, welcomeOptionsSchema, widgetSettingsSchemaForMode };
884
+ export { ALL_MODES, type ActionName, type AttachmentLimits, type Behavior, type CalloutPosition, type CalloutShape, type ComposerOptions, type FeatureFlags, type FeedbackEvent, type FeedbackOptions, type FieldOption, type FieldType, type FieldValidation, type FooterOptions, type FormCondition, type FormDef, type FormField, type Forms, type HapticsOptions, type HeaderActions, type HeaderOptions, type I18nOptions, type LauncherCallout, type LauncherOptions, type LauncherSize, type LauncherVariant, type Mode, type ModuleLayout, type ModuleOptions, type ModulesOptions, type Position, type PoweredBy, type Presentation, type ResizeOptions, type ResponseMode, type SendButtonOptions, type SizeOptions, type SoundOptions, type StringsOverride, type ThemeOverrides, type ThemePreference, type VoiceMode, actionNameSchema, attachmentLimitsSchema, behaviorSchema, calloutPositionSchema, calloutShapeSchema, composerOptionsSchema, emitJsonSchema, featureFlagsSchema, feedbackEventSchema, feedbackSchema, fieldOptionSchema, fieldTypeSchema, fieldValidationSchema, footerSchema, formConditionSchema, formDefSchema, formFieldSchema, formTriggerSchema, formsSchema, hapticsOptionsSchema, headerActionsSchema, headerSchema, i18nSchema, initialSizeSchema, launcherCalloutSchema, launcherOptionsSchema, launcherSizeSchema, launcherVariantSchema, modeSchema, moduleLayoutSchema, moduleSchema, modulesSchema, positionSchema, poweredBySchema, presentationSchema, resizeOptionsSchema, responseModeSchema, sendButtonIconSchema, sendButtonOptionsSchema, sendButtonShapeSchema, sendButtonVariantSchema, sizeOptionsSchema, soundOptionsSchema, stringsOverrideSchema, themeFieldSchema, themeOverridesSchema, themePreferenceSchema, toolRefSchema, voiceModeSchema, widgetSettingsSchemaForMode };
package/schema.json CHANGED
@@ -907,42 +907,6 @@
907
907
  }
908
908
  ]
909
909
  },
910
- "welcome": {
911
- "type": "object",
912
- "properties": {
913
- "animation": {
914
- "default": "instant",
915
- "description": "How welcome messages render — `typewriter` types each message in character-by-character; `instant` shows them whole.",
916
- "type": "string",
917
- "enum": [
918
- "typewriter",
919
- "instant"
920
- ]
921
- },
922
- "speed": {
923
- "default": 60,
924
- "description": "Typewriter speed in characters per second. Only meaningful when `animation = typewriter`.",
925
- "type": "integer",
926
- "minimum": 1,
927
- "maximum": 2000
928
- }
929
- },
930
- "required": [
931
- "animation",
932
- "speed"
933
- ],
934
- "additionalProperties": {},
935
- "description": "How welcome messages render — instant by default; opt into a typewriter effect with adjustable cps speed.",
936
- "examples": [
937
- {
938
- "animation": "instant"
939
- },
940
- {
941
- "animation": "typewriter",
942
- "speed": 60
943
- }
944
- ]
945
- },
946
910
  "feedback": {
947
911
  "type": "object",
948
912
  "properties": {
@@ -2661,42 +2625,6 @@
2661
2625
  }
2662
2626
  ]
2663
2627
  },
2664
- "welcome": {
2665
- "type": "object",
2666
- "properties": {
2667
- "animation": {
2668
- "default": "instant",
2669
- "description": "How welcome messages render — `typewriter` types each message in character-by-character; `instant` shows them whole.",
2670
- "type": "string",
2671
- "enum": [
2672
- "typewriter",
2673
- "instant"
2674
- ]
2675
- },
2676
- "speed": {
2677
- "default": 60,
2678
- "description": "Typewriter speed in characters per second. Only meaningful when `animation = typewriter`.",
2679
- "type": "integer",
2680
- "minimum": 1,
2681
- "maximum": 2000
2682
- }
2683
- },
2684
- "required": [
2685
- "animation",
2686
- "speed"
2687
- ],
2688
- "additionalProperties": {},
2689
- "description": "How welcome messages render — instant by default; opt into a typewriter effect with adjustable cps speed.",
2690
- "examples": [
2691
- {
2692
- "animation": "instant"
2693
- },
2694
- {
2695
- "animation": "typewriter",
2696
- "speed": 60
2697
- }
2698
- ]
2699
- },
2700
2628
  "feedback": {
2701
2629
  "type": "object",
2702
2630
  "properties": {