@coveo/atomic 3.60.1 → 3.60.2

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.
Files changed (41) hide show
  1. package/custom-elements.json +1975 -1896
  2. package/dist/cjs/components/common/atomic-aria-live/atomic-aria-live.cjs +35 -5
  3. package/dist/cjs/components/common/atomic-citation/atomic-citation.cjs +3 -1
  4. package/dist/cjs/components/common/atomic-generated-answer-thread/atomic-generated-answer-thread.cjs +20 -15
  5. package/dist/cjs/components/common/atomic-generated-answer-thread-item/atomic-generated-answer-thread-item.cjs +51 -45
  6. package/dist/cjs/components/common/generated-answer/generated-answer-controller.cjs +12 -2
  7. package/dist/cjs/components/common/generated-answer/generated-content/markdown-utils.cjs +80 -3
  8. package/dist/cjs/components/common/generated-answer/render-conversation-debug-header.cjs +1 -1
  9. package/dist/cjs/components/insight/atomic-insight-generated-answer/atomic-insight-generated-answer.cjs +9 -2
  10. package/dist/cjs/components/search/atomic-generated-answer/atomic-generated-answer.cjs +9 -2
  11. package/dist/cjs/global/environment.cjs +1 -1
  12. package/dist/cjs/utils/accessibility-utils.cjs +5 -2
  13. package/dist/cjs/utils/debounce-utils.cjs +15 -4
  14. package/dist/cjs/utils/tailwind.global.tw.css.cjs +1 -1
  15. package/dist/cjs/versions.cjs +1 -1
  16. package/dist/esm/components/commerce/atomic-commerce-search-box/atomic-commerce-search-box.js +1 -1
  17. package/dist/esm/components/common/atomic-aria-live/atomic-aria-live.js +35 -5
  18. package/dist/esm/components/common/atomic-citation/atomic-citation.js +3 -1
  19. package/dist/esm/components/common/atomic-generated-answer-thread/atomic-generated-answer-thread.js +20 -15
  20. package/dist/esm/components/common/atomic-generated-answer-thread-item/atomic-generated-answer-thread-item.js +52 -46
  21. package/dist/esm/components/common/generated-answer/generated-answer-controller.js +12 -2
  22. package/dist/esm/components/common/generated-answer/generated-content/markdown-utils.js +79 -5
  23. package/dist/esm/components/common/generated-answer/render-conversation-debug-header.js +1 -1
  24. package/dist/esm/components/insight/atomic-insight-generated-answer/atomic-insight-generated-answer.js +9 -2
  25. package/dist/esm/components/insight/atomic-insight-result-children/atomic-insight-result-children.js +1 -1
  26. package/dist/esm/components/search/atomic-generated-answer/atomic-generated-answer.js +9 -2
  27. package/dist/esm/components/search/atomic-search-box/atomic-search-box.js +1 -1
  28. package/dist/esm/global/environment.js +1 -1
  29. package/dist/esm/utils/accessibility-utils.js +5 -2
  30. package/dist/esm/utils/debounce-utils.js +15 -4
  31. package/dist/esm/utils/tailwind.global.tw.css.js +1 -1
  32. package/dist/esm/versions.js +1 -1
  33. package/dist/types/components/common/atomic-aria-live/atomic-aria-live.d.ts +5 -1
  34. package/dist/types/components/common/atomic-generated-answer-thread-item/atomic-generated-answer-thread-item.d.ts +3 -0
  35. package/dist/types/components/common/generated-answer/generated-answer-controller.d.ts +5 -0
  36. package/dist/types/components/common/generated-answer/generated-content/markdown-utils.d.ts +1 -0
  37. package/dist/types/components/insight/atomic-insight-generated-answer/atomic-insight-generated-answer.d.ts +1 -0
  38. package/dist/types/components/search/atomic-generated-answer/atomic-generated-answer.d.ts +1 -0
  39. package/dist/types/components/search/atomic-result-link/atomic-result-link.d.ts +1 -1
  40. package/dist/types/utils/accessibility-utils.d.ts +2 -1
  41. package/package.json +1 -1
@@ -54,9 +54,10 @@ class AtomicAriaLive extends (0, light_dom_cjs_namespaceObject.LightDomMixin)(ex
54
54
  disconnectedCallback() {
55
55
  super.disconnectedCallback();
56
56
  this.messagesQueue.clear();
57
+ this.queuedMessageIds.clear();
57
58
  document.removeEventListener('atomic/accessibility/findAriaLive', this.onFindAriaLive);
58
59
  }
59
- updateMessage(region, message, assertive) {
60
+ updateMessage(region, message, assertive, preserveQueuedMessages = false) {
60
61
  const updateRegion = ()=>{
61
62
  this.regions = {
62
63
  ...this.regions,
@@ -66,11 +67,18 @@ class AtomicAriaLive extends (0, light_dom_cjs_namespaceObject.LightDomMixin)(ex
66
67
  }
67
68
  };
68
69
  };
69
- if (message) this.messagesQueue.enqueue(updateRegion, region);
70
- else {
71
- this.messagesQueue.cancelActionIfQueued(region);
70
+ if (!message) {
71
+ this.clearQueuedMessages(region);
72
72
  updateRegion();
73
+ return;
73
74
  }
75
+ if (!preserveQueuedMessages) {
76
+ this.clearQueuedMessages(region);
77
+ this.messagesQueue.enqueue(updateRegion, region);
78
+ return;
79
+ }
80
+ if (this.regions[region]?.message === message && this.regions[region]?.assertive === assertive) return;
81
+ this.queueMessage(region, message, updateRegion);
74
82
  }
75
83
  registerRegion(region, assertive) {
76
84
  if (region in this.regions) return;
@@ -82,6 +90,28 @@ class AtomicAriaLive extends (0, light_dom_cjs_namespaceObject.LightDomMixin)(ex
82
90
  }
83
91
  };
84
92
  }
93
+ clearQueuedMessages(region) {
94
+ for (const messageId of this.queuedMessageIds.get(region) ?? [])this.messagesQueue.cancelActionIfQueued(messageId);
95
+ this.queuedMessageIds.delete(region);
96
+ }
97
+ getMessageQueueId(region, message) {
98
+ return JSON.stringify([
99
+ region,
100
+ message
101
+ ]);
102
+ }
103
+ queueMessage(region, message, updateRegion) {
104
+ const messageId = this.getMessageQueueId(region, message);
105
+ const queuedMessageIds = this.queuedMessageIds.get(region) ?? new Set();
106
+ if (queuedMessageIds.has(messageId)) return;
107
+ queuedMessageIds.add(messageId);
108
+ this.queuedMessageIds.set(region, queuedMessageIds);
109
+ this.messagesQueue.enqueue(()=>{
110
+ queuedMessageIds.delete(messageId);
111
+ if (0 === queuedMessageIds.size) this.queuedMessageIds.delete(region);
112
+ updateRegion();
113
+ }, messageId);
114
+ }
85
115
  render() {
86
116
  const hostStyles = {
87
117
  position: 'absolute',
@@ -107,7 +137,7 @@ class AtomicAriaLive extends (0, light_dom_cjs_namespaceObject.LightDomMixin)(ex
107
137
  constructor(...args){
108
138
  super(...args), this.regions = {}, this.messagesQueue = (0, debounce_utils_cjs_namespaceObject.buildDebouncedQueue)({
109
139
  delay: 500
110
- }), this.onFindAriaLive = (event)=>{
140
+ }), this.queuedMessageIds = new Map(), this.onFindAriaLive = (event)=>{
111
141
  const customEvent = event;
112
142
  customEvent.detail.element = this;
113
143
  };
@@ -46,6 +46,7 @@ var class_map_js_namespaceObject = require("lit/directives/class-map.js");
46
46
  var ref_js_namespaceObject = require("lit/directives/ref.js");
47
47
  var watch_cjs_namespaceObject = require("../../../decorators/watch.cjs");
48
48
  var with_tailwind_styles_cjs_namespaceObject = require("../../../decorators/with-tailwind-styles.cjs");
49
+ var markdown_utils_cjs_namespaceObject = require("../generated-answer/generated-content/markdown-utils.cjs");
49
50
  var external_heading_cjs_namespaceObject = require("../heading.cjs");
50
51
  var item_link_cjs_namespaceObject = require("../item-link/item-link.cjs");
51
52
  var external_atomic_citation_tw_css_cjs_namespaceObject = require("./atomic-citation.tw.css.cjs");
@@ -148,7 +149,8 @@ class AtomicCitation extends external_lit_namespaceObject.LitElement {
148
149
  clearTimeout(this.closePopoverTimeout);
149
150
  }
150
151
  getTruncatedText() {
151
- return this.citation.text && `${this.citation.text?.trim().slice(0, 200)}${this.citation.text.length > 200 ? '...' : ''}`;
152
+ const plainText = (0, markdown_utils_cjs_namespaceObject.markdownToPlainText)(this.citation.text ?? '');
153
+ return plainText ? `${plainText.slice(0, 200)}${plainText.length > 200 ? '...' : ''}` : void 0;
152
154
  }
153
155
  anchorUrl(uri, text, filetype, pageNumber) {
154
156
  if (this.disableCitationAnchoring) return uri;
@@ -122,12 +122,13 @@ class AtomicGeneratedAnswerThread extends external_lit_namespaceObject.LitElemen
122
122
  const showPreviousButtonClasses = `
123
123
  text-on-background text-base min-w-0 inline-flex text-left mr-auto
124
124
  px-2 py-1.5 font-normal bg-transparent border-0 appearance-none
125
- transition-colors hover:bg-neutral-light rounded-md cursor-pointer
125
+ transition-colors hover:bg-neutral hover:text-primary rounded-md cursor-pointer
126
126
  focus-visible:outline-none focus-visible:ring-2
127
127
  focus-visible:ring-primary focus-visible:ring-offset-2
128
128
  `;
129
129
  const timelineDotClasses = `
130
- h-2 w-2 rounded-full bg-neutral-dim
130
+ h-2 w-2 rounded-full bg-neutral-dim transition-colors
131
+ hover:bg-neutral-dark group-has-[button:hover]/title:bg-neutral-dark
131
132
  `;
132
133
  const timelineConnectorClasses = `
133
134
  relative h-full w-px bg-neutral
@@ -137,23 +138,27 @@ class AtomicGeneratedAnswerThread extends external_lit_namespaceObject.LitElemen
137
138
  after:h-[8px] after:w-px after:bg-neutral after:content-['']
138
139
  `;
139
140
  return (0, external_lit_namespaceObject.html)`
140
- <li class="grid min-w-0">
141
- <div class="flex min-w-0 items-center gap-3">
142
- <div class="flex w-[10px] shrink-0 items-center justify-center">
141
+ <li class="group/title grid min-w-0 grid-cols-[10px_1fr] gap-x-3">
142
+ <div class="row-span-2 flex flex-col items-center">
143
+ <div
144
+ class="flex justify-center items-center text-base h-[1lh] my-1.5"
145
+ >
143
146
  <span class=${timelineDotClasses}></span>
144
147
  </div>
145
- <div class="flex min-w-0 flex-col">
146
- <button
147
- type="button"
148
- class=${showPreviousButtonClasses}
149
- @click=${this.handleShowAllClick}
150
- >
151
- ${label}
152
- </button>
148
+ <div
149
+ class="flex grow w-full justify-center items-center py-2 -my-2 min-h-3"
150
+ >
151
+ <span class=${timelineConnectorClasses}> </span>
153
152
  </div>
154
153
  </div>
155
- <div class="flex h-3 w-[10px] shrink-0 justify-center">
156
- <span class=${timelineConnectorClasses}> </span>
154
+ <div class="flex min-w-0 flex-col">
155
+ <button
156
+ type="button"
157
+ class=${showPreviousButtonClasses}
158
+ @click=${this.handleShowAllClick}
159
+ >
160
+ ${label}
161
+ </button>
157
162
  </div>
158
163
  </li>
159
164
  `;
@@ -69,11 +69,14 @@ class AtomicGeneratedAnswerThreadItem extends external_lit_namespaceObject.LitEl
69
69
  const titleButtonClasses = (0, class_map_js_namespaceObject.classMap)({
70
70
  ...titleBaseClasses,
71
71
  ...titleWeightClasses,
72
- 'bg-transparent': true,
72
+ 'bg-transparent': !this.isDotHovered,
73
+ 'bg-neutral': this.isDotHovered,
74
+ 'text-primary': this.isDotHovered,
73
75
  'border-0': true,
74
76
  'appearance-none': true,
75
77
  'transition-colors': true,
76
- 'hover:bg-neutral-light': true,
78
+ 'hover:bg-neutral': true,
79
+ 'hover:text-primary': true,
77
80
  'rounded-md': true,
78
81
  'cursor-pointer': true,
79
82
  'focus-visible:outline-none': true,
@@ -93,87 +96,87 @@ class AtomicGeneratedAnswerThreadItem extends external_lit_namespaceObject.LitEl
93
96
  'bg-neutral-dark': this.isExpanded,
94
97
  'bg-neutral-dim': !this.isExpanded,
95
98
  'cursor-pointer': isTimelineDotInteractive,
96
- 'group-hover:bg-neutral-dark': !this.isExpanded && isTimelineDotInteractive
99
+ 'hover:bg-neutral-dark': !this.isExpanded && isTimelineDotInteractive,
100
+ 'group-has-[button:hover]/title:bg-neutral-dark': !this.isExpanded && isTimelineDotInteractive
97
101
  });
98
102
  const timelineDotToggleClasses = (0, class_map_js_namespaceObject.classMap)({
99
103
  flex: true,
100
- 'w-[10px]': true,
101
- 'shrink-0': true,
102
104
  'justify-center': true,
103
- 'items-center': true
105
+ 'items-center': true,
106
+ 'text-base': true,
107
+ 'h-[1lh] my-1.5': true
104
108
  });
105
109
  const timelineLineToggleClasses = (0, class_map_js_namespaceObject.classMap)({
106
110
  flex: true,
107
- 'w-[10px]': true,
108
- 'shrink-0': true,
111
+ grow: true,
112
+ 'w-full': true,
109
113
  'justify-center': true,
110
114
  'items-center': true,
111
115
  group: isTimelineLineInteractive,
112
116
  'cursor-pointer': isTimelineLineInteractive,
113
117
  'py-2': true,
114
- '-my-2': true
115
- });
116
- const timelineBodyRowClasses = (0, class_map_js_namespaceObject.classMap)({
117
- flex: true,
118
- 'min-w-0': true,
119
- 'gap-3': true,
118
+ '-my-2': true,
120
119
  'min-h-3': !this.isExpanded
121
120
  });
122
121
  const timelineConnectorClasses = "relative h-full w-px bg-neutral transition-colors duration-150 group-hover:bg-neutral-dark before:absolute before:left-0 before:top-[-8px] before:h-[8px] before:w-px before:bg-neutral before:transition-colors before:duration-150 group-hover:before:bg-neutral-dark before:content-[''] after:absolute after:bottom-[-8px] after:left-0 after:h-[8px] after:w-px after:bg-neutral after:transition-colors after:duration-150 group-hover:after:bg-neutral-dark after:content-['']";
123
122
  return (0, external_lit_namespaceObject.html)`
124
- <div class="grid min-w-0">
125
- <div class="flex min-w-0 items-center gap-3">
123
+ <div class="group/title grid min-w-0 grid-cols-[10px_1fr] gap-x-3">
124
+ <div class="row-span-2 flex flex-col items-center">
126
125
  <div class=${timelineDotToggleClasses}>
127
126
  ${(0, when_js_namespaceObject.when)(this.showTimelineDot, ()=>(0, external_lit_namespaceObject.html)`
128
127
  <span
129
128
  class=${timelineDotClasses}
130
129
  @click=${isTimelineDotInteractive ? this.toggle : null}
130
+ @mouseenter=${isTimelineDotInteractive ? this.handleDotMouseEnter : null}
131
+ @mouseleave=${isTimelineDotInteractive ? this.handleDotMouseLeave : null}
131
132
  ></span>
132
133
  `)}
133
134
  </div>
134
- <div class="flex min-w-0 flex-col">
135
- ${(0, when_js_namespaceObject.when)(!this.disableCollapse, ()=>(0, external_lit_namespaceObject.html)`<button
136
- type="button"
137
- aria-expanded=${this.isExpanded}
138
- aria-controls=${this.contentId}
139
- class=${titleButtonClasses}
140
- @click=${this.toggle}
141
- >
142
- <span part="thread-item-title" style=${clampedTitleStyles}
143
- >${this.title}</span
144
- >
145
- </button>`, ()=>(0, external_lit_namespaceObject.html)`<span
146
- class=${titleTextClasses}
147
- part="thread-item-title"
148
- style=${clampedTitleStyles}
149
- >${this.title}</span
150
- >`)}
151
- </div>
152
- </div>
153
- <div class=${timelineBodyRowClasses}>
154
135
  <div
155
136
  class=${timelineLineToggleClasses}
156
137
  @click=${isTimelineLineInteractive ? this.toggle : null}
157
138
  >
158
139
  ${(0, when_js_namespaceObject.when)(this.hideLine, ()=>(0, external_lit_namespaceObject.html)``, ()=>(0, external_lit_namespaceObject.html)`<span class=${timelineConnectorClasses}> </span>`)}
159
140
  </div>
160
- <div id=${this.contentId} class="min-w-0 pl-2 py-1.5">
161
- <div
162
- class="mb-2"
163
- ?hidden=${!this.isExpanded}
164
- aria-hidden=${this.isExpanded ? 'false' : 'true'}
165
- >
166
- <slot></slot>
167
- </div>
141
+ </div>
142
+ <div class="flex min-w-0 flex-col">
143
+ ${(0, when_js_namespaceObject.when)(!this.disableCollapse, ()=>(0, external_lit_namespaceObject.html)`<button
144
+ type="button"
145
+ aria-expanded=${this.isExpanded}
146
+ aria-controls=${this.contentId}
147
+ class=${titleButtonClasses}
148
+ @click=${this.toggle}
149
+ >
150
+ <span part="thread-item-title" style=${clampedTitleStyles}
151
+ >${this.title}</span
152
+ >
153
+ </button>`, ()=>(0, external_lit_namespaceObject.html)`<span
154
+ class=${titleTextClasses}
155
+ part="thread-item-title"
156
+ style=${clampedTitleStyles}
157
+ >${this.title}</span
158
+ >`)}
159
+ </div>
160
+ <div id=${this.contentId} class="min-w-0 pl-2 py-1.5">
161
+ <div
162
+ class="mb-2"
163
+ ?hidden=${!this.isExpanded}
164
+ aria-hidden=${this.isExpanded ? 'false' : 'true'}
165
+ >
166
+ <slot></slot>
168
167
  </div>
169
168
  </div>
170
169
  </div>
171
170
  `;
172
171
  }
173
172
  constructor(...args){
174
- super(...args), this.contentId = `atomic-generated-answer-thread-item-content-${crypto.randomUUID()}`, this.title = '', this.disableCollapse = false, this.hideLine = false, this.isExpanded = false, this.showTimelineDot = true, this.toggle = ()=>{
173
+ super(...args), this.contentId = `atomic-generated-answer-thread-item-content-${crypto.randomUUID()}`, this.title = '', this.disableCollapse = false, this.hideLine = false, this.isExpanded = false, this.showTimelineDot = true, this.isDotHovered = false, this.toggle = ()=>{
175
174
  if (this.disableCollapse) return;
176
175
  this.isExpanded = !this.isExpanded;
176
+ }, this.handleDotMouseEnter = ()=>{
177
+ this.isDotHovered = true;
178
+ }, this.handleDotMouseLeave = ()=>{
179
+ this.isDotHovered = false;
177
180
  };
178
181
  }
179
182
  }
@@ -206,6 +209,9 @@ _ts_decorate([
206
209
  attribute: 'show-timeline-dot'
207
210
  })
208
211
  ], AtomicGeneratedAnswerThreadItem.prototype, "showTimelineDot", void 0);
212
+ _ts_decorate([
213
+ (0, decorators_js_namespaceObject.state)()
214
+ ], AtomicGeneratedAnswerThreadItem.prototype, "isDotHovered", void 0);
209
215
  AtomicGeneratedAnswerThreadItem = _ts_decorate([
210
216
  (0, decorators_js_namespaceObject.customElement)('atomic-generated-answer-thread-item'),
211
217
  with_tailwind_styles_cjs_namespaceObject.withTailwindStyles
@@ -32,6 +32,7 @@ __webpack_require__.d(__webpack_exports__, {
32
32
  });
33
33
  var local_storage_utils_cjs_namespaceObject = require("../../../utils/local-storage-utils.cjs");
34
34
  require("../atomic-generated-answer-feedback-modal/atomic-generated-answer-feedback-modal.cjs");
35
+ var markdown_utils_cjs_namespaceObject = require("./generated-content/markdown-utils.cjs");
35
36
  class GeneratedAnswerController {
36
37
  hostConnected() {}
37
38
  get data() {
@@ -66,14 +67,23 @@ class GeneratedAnswerController {
66
67
  const isGenerating = !!state.isStreaming;
67
68
  const hasNonEmptyAnswer = !!state.answer?.trim();
68
69
  const hasError = !!state.error?.message;
70
+ const cannotAnswer = !!state.cannotAnswer;
69
71
  if (isHidden) return bindings.i18n.t('generated-answer-hidden');
70
72
  if (isGenerating) return bindings.i18n.t('generating-answer');
71
- if (hasError) return bindings.i18n.t('answer-could-not-be-generated');
73
+ if (hasError || cannotAnswer) return bindings.i18n.t('answer-could-not-be-generated');
72
74
  if (hasNonEmptyAnswer) return bindings.i18n.t('answer-generated', {
73
- answer: state.answer
75
+ answer: (0, markdown_utils_cjs_namespaceObject.markdownToPlainText)(state.answer)
74
76
  });
75
77
  return '';
76
78
  }
79
+ isStatusAssertive() {
80
+ const state = this.options.getGeneratedAnswerState();
81
+ if (!state) return false;
82
+ const isHidden = !state.isVisible;
83
+ const isGenerating = !!state.isStreaming;
84
+ const hasError = !!state.error?.message;
85
+ return !isHidden && !isGenerating && hasError;
86
+ }
77
87
  get hasRetryableError() {
78
88
  const searchState = this.options.getSearchStatusState();
79
89
  const answerState = this.options.getGeneratedAnswerState();
@@ -28,9 +28,11 @@ var __webpack_require__ = {};
28
28
  var __webpack_exports__ = {};
29
29
  __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
+ markdownToPlainText: ()=>markdownToPlainText,
31
32
  transformMarkdownToHtml: ()=>transformMarkdownToHtml
32
33
  });
33
34
  var external_marked_namespaceObject = require("marked");
35
+ var utils_cjs_namespaceObject = require("../../../../utils/utils.cjs");
34
36
  const toInlinePlainText = (textWithHtml)=>{
35
37
  const withoutHtmlTags = textWithHtml.replace(/<[^>]*>/g, ' ');
36
38
  const withCollapsedWhitespaces = withoutHtmlTags.replace(/\s{2,}/g, ' ');
@@ -51,6 +53,7 @@ const completeUnclosedElement = (text)=>{
51
53
  }
52
54
  return text;
53
55
  };
56
+ const decodeHtmlEntities = (text)=>(0, utils_cjs_namespaceObject.parseHTML)(text).body.textContent ?? '';
54
57
  const escapeHtml = (text)=>text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
55
58
  const customRenderer = {
56
59
  blockquote (quote) {
@@ -108,11 +111,85 @@ const customRenderer = {
108
111
  return completeUnclosedElement(text);
109
112
  }
110
113
  };
111
- const transformMarkdownToHtml = (text)=>external_marked_namespaceObject.marked.use({
112
- renderer: customRenderer
113
- }).parse(text);
114
+ class PlainTextRenderer extends external_marked_namespaceObject.Renderer {
115
+ blockquote(quote) {
116
+ return ` ${quote} `;
117
+ }
118
+ br() {
119
+ return ' ';
120
+ }
121
+ checkbox() {
122
+ return '';
123
+ }
124
+ code(code) {
125
+ return ` ${code} `;
126
+ }
127
+ codespan(text) {
128
+ return text;
129
+ }
130
+ del(text) {
131
+ return text;
132
+ }
133
+ em(text) {
134
+ return text;
135
+ }
136
+ heading(text) {
137
+ return ` ${text} `;
138
+ }
139
+ hr() {
140
+ return ' ';
141
+ }
142
+ html(text) {
143
+ return toInlinePlainText(text);
144
+ }
145
+ image(_href, _title, text) {
146
+ return text;
147
+ }
148
+ link(_href, _title, text) {
149
+ return text;
150
+ }
151
+ list(body) {
152
+ return ` ${body} `;
153
+ }
154
+ listitem(text) {
155
+ return ` ${text} `;
156
+ }
157
+ paragraph(text) {
158
+ return ` ${text} `;
159
+ }
160
+ strong(text) {
161
+ return text;
162
+ }
163
+ table(header, body) {
164
+ return ` ${header} ${body} `;
165
+ }
166
+ tablecell(content) {
167
+ return `${content} `;
168
+ }
169
+ tablerow(content) {
170
+ return ` ${content} `;
171
+ }
172
+ text(text) {
173
+ return text.replace(unclosedElement, '$2');
174
+ }
175
+ }
176
+ const markdownParser = new external_marked_namespaceObject.Marked();
177
+ const plainTextMarkdownParser = new external_marked_namespaceObject.Marked();
178
+ const htmlRenderer = Object.assign(new external_marked_namespaceObject.Renderer(), customRenderer);
179
+ const plainTextRenderer = new PlainTextRenderer();
180
+ const transformMarkdownToHtml = (text)=>markdownParser.parse(text, {
181
+ renderer: htmlRenderer
182
+ });
183
+ const markdownToPlainText = (text)=>{
184
+ const plain = plainTextMarkdownParser.parse(text, {
185
+ renderer: plainTextRenderer
186
+ });
187
+ return decodeHtmlEntities(plain).replace(/\s+/g, ' ').trim();
188
+ };
189
+ exports.markdownToPlainText = __webpack_exports__.markdownToPlainText;
114
190
  exports.transformMarkdownToHtml = __webpack_exports__.transformMarkdownToHtml;
115
191
  for(var __rspack_i in __webpack_exports__)if (-1 === [
192
+ "markdownToPlainText",
116
193
  "transformMarkdownToHtml"
117
194
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
118
195
  Object.defineProperty(exports, '__esModule', {
@@ -53,7 +53,7 @@ const renderConversationDebugHeader = ({ props })=>{
53
53
  ${i18n.t('generated-answer-debug-mode-on')}
54
54
  <div class="bg-success h-2 w-2 rounded-full shrink-0"></div>
55
55
 
56
- <div class="flex items-center text-neutral-dark shrink-0">
56
+ <div class="flex items-center text-neutral-dark break-all">
57
57
  ${i18n.t('generated-answer-conversation-id', {
58
58
  conversationId
59
59
  })}
@@ -318,7 +318,7 @@ class AtomicInsightGeneratedAnswer extends external_lit_namespaceObject.LitEleme
318
318
  constructor(){
319
319
  super(), this.DEFAULT_COLLAPSED_HEIGHT = 16, this.MAX_COLLAPSED_HEIGHT = 32, this.MIN_COLLAPSED_HEIGHT = 9, this.REQUIRED_FIELDS_TO_INCLUDE_IN_CITATIONS = [
320
320
  'filetype'
321
- ], this.withToggle = false, this.collapsible = false, this.maxCollapsedHeight = this.DEFAULT_COLLAPSED_HEIGHT, this.disableCitationAnchoring = false, this.copied = false, this.copyError = false, this.ariaMessage = new accessibility_utils_cjs_namespaceObject.AriaLiveRegionController(this, 'generated-answer'), this.onGeneratedAnswerStateUpdate = ()=>{
321
+ ], this.withToggle = false, this.collapsible = false, this.maxCollapsedHeight = this.DEFAULT_COLLAPSED_HEIGHT, this.disableCitationAnchoring = false, this.copied = false, this.copyError = false, this.ariaMessage = new accessibility_utils_cjs_namespaceObject.AriaLiveRegionController(this, 'generated-answer', false, true), this.ariaErrorMessage = new accessibility_utils_cjs_namespaceObject.AriaLiveRegionController(this, 'generated-answer-error', true), this.onGeneratedAnswerStateUpdate = ()=>{
322
322
  if (this.generatedAnswerState.isVisible !== this.controller.data.isVisible) {
323
323
  this.controller.data = {
324
324
  ...this.controller.data,
@@ -326,7 +326,14 @@ class AtomicInsightGeneratedAnswer extends external_lit_namespaceObject.LitEleme
326
326
  };
327
327
  this.controller.writeStoredData(this.controller.data);
328
328
  }
329
- this.ariaMessage.message = this.controller.getGeneratedAnswerStatus();
329
+ const status = this.controller.getGeneratedAnswerStatus();
330
+ if (this.controller.isStatusAssertive()) {
331
+ this.ariaMessage.message = '';
332
+ this.ariaErrorMessage.message = status;
333
+ } else {
334
+ this.ariaErrorMessage.message = '';
335
+ this.ariaMessage.message = status;
336
+ }
330
337
  };
331
338
  new validate_props_controller_cjs_namespaceObject.ValidatePropsController(this, ()=>({
332
339
  maxCollapsedHeight: this.maxCollapsedHeight
@@ -421,7 +421,7 @@ class AtomicGeneratedAnswer extends external_lit_namespaceObject.LitElement {
421
421
  constructor(){
422
422
  super(), this.DEFAULT_COLLAPSED_HEIGHT = 16, this.MAX_COLLAPSED_HEIGHT = 32, this.MIN_COLLAPSED_HEIGHT = 9, this.REQUIRED_FIELDS_TO_INCLUDE_IN_CITATIONS = [
423
423
  'filetype'
424
- ], this.withToggle = false, this.collapsible = false, this.maxCollapsedHeight = this.DEFAULT_COLLAPSED_HEIGHT, this.disableCitationAnchoring = false, this.tabsIncluded = [], this.tabsExcluded = [], this.copied = false, this.copyError = false, this.ariaMessage = new accessibility_utils_cjs_namespaceObject.AriaLiveRegionController(this, 'generated-answer'), this.onGeneratedAnswerStateUpdate = ()=>{
424
+ ], this.withToggle = false, this.collapsible = false, this.maxCollapsedHeight = this.DEFAULT_COLLAPSED_HEIGHT, this.disableCitationAnchoring = false, this.tabsIncluded = [], this.tabsExcluded = [], this.copied = false, this.copyError = false, this.ariaMessage = new accessibility_utils_cjs_namespaceObject.AriaLiveRegionController(this, 'generated-answer', false, true), this.ariaErrorMessage = new accessibility_utils_cjs_namespaceObject.AriaLiveRegionController(this, 'generated-answer-error', true), this.onGeneratedAnswerStateUpdate = ()=>{
425
425
  if (this.generatedAnswerState.isVisible !== this.controller.data.isVisible) {
426
426
  this.controller.data = {
427
427
  ...this.controller.data,
@@ -429,7 +429,14 @@ class AtomicGeneratedAnswer extends external_lit_namespaceObject.LitElement {
429
429
  };
430
430
  this.controller.writeStoredData(this.controller.data);
431
431
  }
432
- this.ariaMessage.message = this.controller.getGeneratedAnswerStatus();
432
+ const status = this.controller.getGeneratedAnswerStatus();
433
+ if (this.controller.isStatusAssertive()) {
434
+ this.ariaMessage.message = '';
435
+ this.ariaErrorMessage.message = status;
436
+ } else {
437
+ this.ariaErrorMessage.message = '';
438
+ this.ariaMessage.message = status;
439
+ }
433
440
  };
434
441
  new validate_props_controller_cjs_namespaceObject.ValidatePropsController(this, ()=>({
435
442
  maxCollapsedHeight: this.maxCollapsedHeight
@@ -32,7 +32,7 @@ function getWindow() {
32
32
  }
33
33
  function getAtomicEnvironment(headlessVersion) {
34
34
  return {
35
- version: "3.60.1",
35
+ version: "3.60.2",
36
36
  headlessVersion
37
37
  };
38
38
  }
@@ -42,7 +42,9 @@ class AriaLiveRegionController {
42
42
  return element;
43
43
  }
44
44
  dispatchMessage(message) {
45
- this.getAriaLiveElement()?.updateMessage(this.regionName, message, this.assertive);
45
+ const ariaLiveElement = this.getAriaLiveElement();
46
+ if (this.preserveQueuedMessages) return void ariaLiveElement?.updateMessage(this.regionName, message, this.assertive, true);
47
+ ariaLiveElement?.updateMessage(this.regionName, message, this.assertive);
46
48
  }
47
49
  set message(msg) {
48
50
  this.dispatchMessage(msg);
@@ -50,10 +52,11 @@ class AriaLiveRegionController {
50
52
  hostUpdate() {
51
53
  this.getAriaLiveElement()?.registerRegion(this.regionName, this.assertive);
52
54
  }
53
- constructor(host, regionName, assertive = false){
55
+ constructor(host, regionName, assertive = false, preserveQueuedMessages = false){
54
56
  this.host = host;
55
57
  this.regionName = regionName;
56
58
  this.assertive = assertive;
59
+ this.preserveQueuedMessages = preserveQueuedMessages;
57
60
  this.host.addController(this);
58
61
  }
59
62
  }
@@ -30,10 +30,13 @@ __webpack_require__.r(__webpack_exports__);
30
30
  function buildDebouncedQueue(options) {
31
31
  let actions = [];
32
32
  let intervalId = null;
33
+ let lastExecutedAt = null;
33
34
  function dequeueAction() {
34
35
  const action = actions.shift();
35
- if (action) action.execute();
36
- else {
36
+ if (action) {
37
+ lastExecutedAt = Date.now();
38
+ action.execute();
39
+ } else {
37
40
  clearInterval(intervalId);
38
41
  intervalId = null;
39
42
  }
@@ -48,10 +51,18 @@ function buildDebouncedQueue(options) {
48
51
  id: uniqueId,
49
52
  execute
50
53
  });
51
- if (null === intervalId) {
52
- dequeueAction();
54
+ if (null !== intervalId) return;
55
+ const elapsedSinceLastExecution = null === lastExecutedAt ? null : Date.now() - lastExecutedAt;
56
+ if (null === elapsedSinceLastExecution || elapsedSinceLastExecution >= options.delay) {
53
57
  intervalId = setInterval(dequeueAction, options.delay);
58
+ dequeueAction();
59
+ return;
54
60
  }
61
+ const remainingDelay = options.delay - elapsedSinceLastExecution;
62
+ intervalId = setTimeout(()=>{
63
+ intervalId = setInterval(dequeueAction, options.delay);
64
+ dequeueAction();
65
+ }, remainingDelay);
55
66
  },
56
67
  clear () {
57
68
  actions = [];