@coveo/atomic 3.61.3 → 3.61.5

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 (88) hide show
  1. package/custom-elements.json +1246 -1222
  2. package/dist/assets/ai.svg +1 -1
  3. package/dist/assets/ai_model_generative.svg +1 -0
  4. package/dist/assets/attachment.svg +1 -1
  5. package/dist/assets/audio.svg +1 -1
  6. package/dist/assets/box_notes.svg +1 -1
  7. package/dist/assets/css.svg +1 -1
  8. package/dist/assets/csv.svg +1 -1
  9. package/dist/assets/eps.svg +1 -1
  10. package/dist/assets/excel.svg +1 -1
  11. package/dist/assets/exe.svg +1 -1
  12. package/dist/assets/flash.svg +1 -1
  13. package/dist/assets/gdoc.svg +1 -1
  14. package/dist/assets/gdocs.svg +1 -1
  15. package/dist/assets/gform.svg +1 -1
  16. package/dist/assets/gpres.svg +1 -1
  17. package/dist/assets/gsheet.svg +1 -1
  18. package/dist/assets/html.svg +1 -1
  19. package/dist/assets/image.svg +1 -1
  20. package/dist/assets/in_queue_experience.svg +1 -0
  21. package/dist/assets/initiate_external_transfer.svg +1 -0
  22. package/dist/assets/keynote.svg +1 -1
  23. package/dist/assets/mp4.svg +1 -1
  24. package/dist/assets/outbound_call.svg +1 -0
  25. package/dist/assets/overlay.svg +1 -1
  26. package/dist/assets/pack.svg +1 -1
  27. package/dist/assets/pages.svg +1 -1
  28. package/dist/assets/pdf.svg +1 -1
  29. package/dist/assets/ppt.svg +1 -1
  30. package/dist/assets/psd.svg +1 -1
  31. package/dist/assets/quip_doc.svg +1 -1
  32. package/dist/assets/quip_slide.svg +1 -1
  33. package/dist/assets/rfp_record.svg +1 -0
  34. package/dist/assets/rtf.svg +1 -1
  35. package/dist/assets/slack_canvas.svg +1 -1
  36. package/dist/assets/slack_list_item.svg +1 -1
  37. package/dist/assets/slack_lists.svg +1 -1
  38. package/dist/assets/slide.svg +1 -1
  39. package/dist/assets/stypi.svg +1 -1
  40. package/dist/assets/suggested_for_you.svg +1 -0
  41. package/dist/assets/txt.svg +1 -1
  42. package/dist/assets/unknown.svg +1 -1
  43. package/dist/assets/vcf.svg +1 -0
  44. package/dist/assets/visio.svg +1 -1
  45. package/dist/assets/voicemail_drop.svg +1 -0
  46. package/dist/assets/webex.svg +1 -1
  47. package/dist/assets/word.svg +1 -1
  48. package/dist/assets/xml.svg +1 -1
  49. package/dist/assets/zip.svg +1 -1
  50. package/dist/cjs/autoloader/index.cjs +24 -6
  51. package/dist/cjs/components/common/atomic-generated-answer-content/atomic-generated-answer-content.cjs +23 -1
  52. package/dist/cjs/components/common/atomic-generated-answer-thread/atomic-generated-answer-thread.cjs +1 -1
  53. package/dist/cjs/components/common/atomic-generated-answer-thread-item/atomic-generated-answer-thread-item.cjs +3 -2
  54. package/dist/cjs/components/common/generated-answer/answer-announcement.cjs +73 -0
  55. package/dist/cjs/components/common/generated-answer/copy-button.cjs +2 -1
  56. package/dist/cjs/components/common/generated-answer/feedback-button.cjs +2 -1
  57. package/dist/cjs/components/common/generated-answer/generated-content/markdown-utils.cjs +1 -2
  58. package/dist/cjs/components/common/generated-answer/generated-content-container.cjs +6 -1
  59. package/dist/cjs/components/common/generated-answer/render-answer-content.cjs +5 -2
  60. package/dist/cjs/components/common/generated-answer/show-button.cjs +1 -0
  61. package/dist/cjs/components/insight/atomic-insight-generated-answer/atomic-insight-generated-answer.cjs +3 -1
  62. package/dist/cjs/components/search/atomic-generated-answer/atomic-generated-answer.cjs +8 -1
  63. package/dist/cjs/components/search/atomic-sort-dropdown/atomic-sort-dropdown.cjs +1 -0
  64. package/dist/cjs/global/environment.cjs +1 -1
  65. package/dist/cjs/versions.cjs +1 -1
  66. package/dist/esm/autoloader/index.js +24 -6
  67. package/dist/esm/components/common/atomic-generated-answer-content/atomic-generated-answer-content.js +23 -1
  68. package/dist/esm/components/common/atomic-generated-answer-thread/atomic-generated-answer-thread.js +1 -1
  69. package/dist/esm/components/common/atomic-generated-answer-thread-item/atomic-generated-answer-thread-item.js +3 -2
  70. package/dist/esm/components/common/generated-answer/answer-announcement.js +32 -0
  71. package/dist/esm/components/common/generated-answer/copy-button.js +2 -1
  72. package/dist/esm/components/common/generated-answer/feedback-button.js +2 -1
  73. package/dist/esm/components/common/generated-answer/generated-content/markdown-utils.js +1 -2
  74. package/dist/esm/components/common/generated-answer/generated-content-container.js +6 -1
  75. package/dist/esm/components/common/generated-answer/render-answer-content.js +5 -2
  76. package/dist/esm/components/common/generated-answer/show-button.js +1 -0
  77. package/dist/esm/components/insight/atomic-insight-generated-answer/atomic-insight-generated-answer.js +3 -1
  78. package/dist/esm/components/search/atomic-generated-answer/atomic-generated-answer.js +8 -1
  79. package/dist/esm/components/search/atomic-sort-dropdown/atomic-sort-dropdown.js +1 -0
  80. package/dist/esm/global/environment.js +1 -1
  81. package/dist/esm/versions.js +1 -1
  82. package/dist/types/components/common/atomic-generated-answer-content/atomic-generated-answer-content.d.ts +7 -0
  83. package/dist/types/components/common/generated-answer/answer-announcement.d.ts +22 -0
  84. package/dist/types/components/common/generated-answer/generated-content-container.d.ts +1 -0
  85. package/dist/types/components/common/generated-answer/show-button.d.ts +1 -0
  86. package/dist/types/components/insight/atomic-insight-generated-answer/atomic-insight-generated-answer.d.ts +1 -0
  87. package/dist/types/components/search/atomic-generated-answer/atomic-generated-answer.d.ts +2 -0
  88. package/package.json +20 -20
@@ -1,8 +1,13 @@
1
1
  import { html } from "lit";
2
+ import { ifDefined } from "lit/directives/if-defined.js";
2
3
  import { renderGeneratedMarkdownContent } from "./generated-content/generated-markdown-content.js";
3
4
  import { renderGeneratedTextContent } from "./generated-content/generated-text-content.js";
4
5
  const renderGeneratedContentContainer = ({ props })=>(children)=>html`
5
- <div part="generated-container">
6
+ <div
7
+ part="generated-container"
8
+ id=${ifDefined(props.id)}
9
+ aria-busy=${props.isStreaming ? 'true' : 'false'}
10
+ >
6
11
  ${'text/markdown' === props.answerContentFormat ? renderGeneratedMarkdownContent({
7
12
  props: {
8
13
  answer: props.answer,
@@ -6,6 +6,7 @@ import { renderShowButton } from "./show-button.js";
6
6
  import { renderSourceCitations } from "./source-citations.js";
7
7
  import { renderGeneratingAnswerLabel } from "./render-generating-answer-label.js";
8
8
  import "../atomic-icon/atomic-icon.js";
9
+ const GENERATED_CONTENT_ID = 'generated-answer-content';
9
10
  const renderAnswerContent = ({ props })=>{
10
11
  const { i18n, generatedAnswer, collapsible, renderFeedbackAndCopyButtonsSlot, renderCitationsSlot, onRetry, onClickShowButton } = props;
11
12
  const { answer, isStreaming, citations, answerContentFormat, expanded, error } = generatedAnswer;
@@ -23,7 +24,8 @@ const renderAnswerContent = ({ props })=>{
23
24
  props: {
24
25
  answer,
25
26
  answerContentFormat,
26
- isStreaming: !!isStreaming
27
+ isStreaming: !!isStreaming,
28
+ id: collapsible ? GENERATED_CONTENT_ID : void 0
27
29
  }
28
30
  })(html`
29
31
  ${renderSourceCitations({
@@ -51,7 +53,8 @@ const renderAnswerContent = ({ props })=>{
51
53
  props: {
52
54
  i18n,
53
55
  onClick: onClickShowButton,
54
- isCollapsed: !expanded
56
+ isCollapsed: !expanded,
57
+ controlsId: GENERATED_CONTENT_ID
55
58
  }
56
59
  }) : nothing}
57
60
  </div>
@@ -10,6 +10,7 @@ const renderShowButton = ({ props })=>html`${renderButton({
10
10
  part: 'answer-show-button',
11
11
  class: 'hidden items-center hover:bg-transparent',
12
12
  ariaExpanded: props.isCollapsed ? 'false' : 'true',
13
+ ariaControls: props.controlsId,
13
14
  onClick: props.onClick
14
15
  }
15
16
  })(html`
@@ -135,11 +135,13 @@ class AtomicInsightGeneratedAnswer extends LitElement {
135
135
  async copyToClipboard(answer) {
136
136
  await this.controller.copyToClipboard(answer, ()=>{
137
137
  this.copied = true;
138
+ this.ariaCopyMessage.message = this.bindings.i18n.t('generated-answer-copied');
138
139
  setTimeout(()=>{
139
140
  this.copied = false;
140
141
  }, 2000);
141
142
  }, ()=>{
142
143
  this.copyError = true;
144
+ this.ariaCopyMessage.message = this.bindings.i18n.t('failed-to-copy-generated-answer');
143
145
  setTimeout(()=>{
144
146
  this.copyError = false;
145
147
  }, 2000);
@@ -276,7 +278,7 @@ class AtomicInsightGeneratedAnswer extends LitElement {
276
278
  constructor(){
277
279
  super(), this.DEFAULT_COLLAPSED_HEIGHT = 16, this.MAX_COLLAPSED_HEIGHT = 32, this.MIN_COLLAPSED_HEIGHT = 9, this.REQUIRED_FIELDS_TO_INCLUDE_IN_CITATIONS = [
278
280
  'filetype'
279
- ], this.withToggle = false, this.collapsible = false, this.maxCollapsedHeight = this.DEFAULT_COLLAPSED_HEIGHT, this.disableCitationAnchoring = false, this.copied = false, this.copyError = false, this.ariaMessage = new AriaLiveRegionController(this, 'generated-answer', false, true), this.ariaErrorMessage = new AriaLiveRegionController(this, 'generated-answer-error', true), this.onGeneratedAnswerStateUpdate = ()=>{
281
+ ], this.withToggle = false, this.collapsible = false, this.maxCollapsedHeight = this.DEFAULT_COLLAPSED_HEIGHT, this.disableCitationAnchoring = false, this.copied = false, this.copyError = false, this.ariaMessage = new AriaLiveRegionController(this, 'generated-answer', false, true), this.ariaErrorMessage = new AriaLiveRegionController(this, 'generated-answer-error', true), this.ariaCopyMessage = new AriaLiveRegionController(this, 'generated-answer-copy', true), this.onGeneratedAnswerStateUpdate = ()=>{
280
282
  if (this.generatedAnswerState.isVisible !== this.controller.data.isVisible) {
281
283
  this.controller.data = {
282
284
  ...this.controller.data,
@@ -132,6 +132,7 @@ class AtomicGeneratedAnswer extends LitElement {
132
132
  'generated-answer-content-background': this.areFollowUpsEnabled,
133
133
  'agent-scrollable': this.areFollowUpsEnabled
134
134
  })}
135
+ tabindex=${this.areFollowUpsEnabled ? '0' : nothing}
135
136
  >
136
137
  <article>${this.renderAnswerContent()}</article>
137
138
  </div>
@@ -156,6 +157,9 @@ class AtomicGeneratedAnswer extends LitElement {
156
157
  </div>
157
158
  `;
158
159
  }
160
+ get shouldAnnounceAnswerStatus() {
161
+ return !this.areFollowUpsEnabled;
162
+ }
159
163
  get hasNoAnswerGenerated() {
160
164
  return this.controller.hasNoAnswerGenerated;
161
165
  }
@@ -180,11 +184,13 @@ class AtomicGeneratedAnswer extends LitElement {
180
184
  async copyToClipboard(answer) {
181
185
  await this.controller.copyToClipboard(answer, ()=>{
182
186
  this.copied = true;
187
+ this.ariaCopyMessage.message = this.bindings.i18n.t('generated-answer-copied');
183
188
  setTimeout(()=>{
184
189
  this.copied = false;
185
190
  }, 2000);
186
191
  }, ()=>{
187
192
  this.copyError = true;
193
+ this.ariaCopyMessage.message = this.bindings.i18n.t('failed-to-copy-generated-answer');
188
194
  setTimeout(()=>{
189
195
  this.copyError = false;
190
196
  }, 2000);
@@ -379,7 +385,7 @@ class AtomicGeneratedAnswer extends LitElement {
379
385
  constructor(){
380
386
  super(), this.DEFAULT_COLLAPSED_HEIGHT = 16, this.MAX_COLLAPSED_HEIGHT = 32, this.MIN_COLLAPSED_HEIGHT = 9, this.REQUIRED_FIELDS_TO_INCLUDE_IN_CITATIONS = [
381
387
  'filetype'
382
- ], 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 AriaLiveRegionController(this, 'generated-answer', false, true), this.ariaErrorMessage = new AriaLiveRegionController(this, 'generated-answer-error', true), this.onGeneratedAnswerStateUpdate = ()=>{
388
+ ], 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 AriaLiveRegionController(this, 'generated-answer', false, true), this.ariaErrorMessage = new AriaLiveRegionController(this, 'generated-answer-error', true), this.ariaCopyMessage = new AriaLiveRegionController(this, 'generated-answer-copy', true), this.onGeneratedAnswerStateUpdate = ()=>{
383
389
  if (this.generatedAnswerState.isVisible !== this.controller.data.isVisible) {
384
390
  this.controller.data = {
385
391
  ...this.controller.data,
@@ -387,6 +393,7 @@ class AtomicGeneratedAnswer extends LitElement {
387
393
  };
388
394
  this.controller.writeStoredData(this.controller.data);
389
395
  }
396
+ if (!this.shouldAnnounceAnswerStatus) return;
390
397
  const status = this.controller.getGeneratedAnswerStatus();
391
398
  if (this.controller.isStatusAssertive()) {
392
399
  this.ariaMessage.message = '';
@@ -112,6 +112,7 @@ class AtomicSortDropdown extends LitElement {
112
112
  })))}`);
113
113
  }
114
114
  render() {
115
+ if (!this.options.length) return html`<slot></slot>`;
115
116
  const { hasError, hasResults, firstSearchExecuted, isLoading } = this.searchStatusState;
116
117
  return html`
117
118
  ${sortGuard({
@@ -3,7 +3,7 @@ function getWindow() {
3
3
  }
4
4
  function getAtomicEnvironment(headlessVersion) {
5
5
  return {
6
- version: "3.61.3",
6
+ version: "3.61.5",
7
7
  headlessVersion
8
8
  };
9
9
  }
@@ -1,3 +1,3 @@
1
- const atomicVersion = "3.61.3";
1
+ const atomicVersion = "3.61.5";
2
2
  export { version as headlessVersion } from "@coveo/headless/package.json";
3
3
  export { atomicVersion };
@@ -40,8 +40,15 @@ export declare class AtomicGeneratedAnswerContent extends LitElement {
40
40
  onCopyToClipboard: (answerId: string) => void;
41
41
  private copyState;
42
42
  private resetCopyTimeout?;
43
+ private ariaMessage;
44
+ private ariaErrorMessage;
45
+ private ariaCopyMessage;
46
+ private lastAnnouncedMessage?;
47
+ private hasObservedAnswer;
43
48
  disconnectedCallback(): void;
44
49
  render(): TemplateResult;
50
+ protected updated(): void;
51
+ private announceAnswerStatus;
45
52
  private renderFeedbackAndCopyButtons;
46
53
  private copyToClipboard;
47
54
  private scheduleCopyReset;
@@ -0,0 +1,22 @@
1
+ import type { GeneratedAnswerBase } from '@coveo/headless';
2
+ import type { i18n } from 'i18next';
3
+ export interface AnswerAnnouncement {
4
+ message: string;
5
+ assertive: boolean;
6
+ }
7
+ type AnnounceableAnswer = Pick<GeneratedAnswerBase, 'answer' | 'cannotAnswer' | 'error' | 'isLoading' | 'isStreaming'>;
8
+ /**
9
+ * Computes the screen reader announcement describing the state of a single generated answer.
10
+ *
11
+ * The conversational rendering path holds one of these per conversation turn, so each answer
12
+ * reports its own state instead of relying on the top-level answer state.
13
+ */
14
+ export declare const getAnswerAnnouncement: (answer: AnnounceableAnswer | undefined, i18n: i18n) => AnswerAnnouncement;
15
+ /**
16
+ * Whether an answer has finished generating successfully.
17
+ *
18
+ * Used to stay silent when an already-completed answer is rendered for the first time, such as
19
+ * when earlier conversation turns are revealed.
20
+ */
21
+ export declare const isSettledAnswer: (answer: AnnounceableAnswer | undefined) => boolean;
22
+ export {};
@@ -3,5 +3,6 @@ export interface GeneratedContentContainerProps {
3
3
  answer?: string;
4
4
  answerContentFormat?: string;
5
5
  isStreaming: boolean;
6
+ id?: string;
6
7
  }
7
8
  export declare const renderGeneratedContentContainer: FunctionalComponentWithChildren<GeneratedContentContainerProps>;
@@ -4,6 +4,7 @@ import type { FunctionalComponent } from '../../../utils/functional-component-ut
4
4
  export interface ShowButtonProps {
5
5
  i18n: i18n;
6
6
  isCollapsed: boolean;
7
+ controlsId?: string;
7
8
  onClick: () => void;
8
9
  }
9
10
  export declare const renderShowButton: FunctionalComponent<ShowButtonProps>;
@@ -90,6 +90,7 @@ export declare class AtomicInsightGeneratedAnswer extends LitElement implements
90
90
  private copyError;
91
91
  private ariaMessage;
92
92
  private ariaErrorMessage;
93
+ private ariaCopyMessage;
93
94
  constructor();
94
95
  initialize(): void;
95
96
  disconnectedCallback(): void;
@@ -136,12 +136,14 @@ export declare class AtomicGeneratedAnswer extends LitElement implements Initial
136
136
  private copyError;
137
137
  private ariaMessage;
138
138
  private ariaErrorMessage;
139
+ private ariaCopyMessage;
139
140
  constructor();
140
141
  initialize(): void;
141
142
  disconnectedCallback(): void;
142
143
  protected willUpdate(changedProperties: PropertyValueMap<this>): void;
143
144
  render(): import("lit-html").TemplateResult<1> | typeof nothing;
144
145
  onGeneratedAnswerStateUpdate: () => void;
146
+ private get shouldAnnounceAnswerStatus();
145
147
  private get hasNoAnswerGenerated();
146
148
  private get isAnswerVisible();
147
149
  private get toggleTooltip();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coveo/atomic",
3
- "version": "3.61.3",
3
+ "version": "3.61.5",
4
4
  "description": "A web-component library for building modern UIs interfacing with the Coveo platform",
5
5
  "homepage": "https://docs.coveo.com/en/atomic/latest/",
6
6
  "license": "Apache-2.0",
@@ -55,21 +55,21 @@
55
55
  "./custom-elements-manifest": "./custom-elements.json"
56
56
  },
57
57
  "dependencies": {
58
- "@coveo/atomic-legacy": "0.1.4",
58
+ "@coveo/atomic-legacy": "0.1.6",
59
59
  "@coveo/bueno": "1.1.9",
60
- "@coveo/headless": "3.56.0",
61
- "@coveo/relay-event-types": "20.5.1",
60
+ "@coveo/headless": "3.57.1",
61
+ "@coveo/relay-event-types": "20.7.1",
62
62
  "@lit/context": "1.1.6",
63
63
  "@open-wc/lit-helpers": "0.7.0",
64
64
  "@popperjs/core": "2.11.8",
65
- "@salesforce-ux/design-system": "2.30.7",
65
+ "@salesforce-ux/design-system": "2.264.1",
66
66
  "@stencil/core": "4.20.0",
67
67
  "cssnano": "8.0.10",
68
68
  "dayjs": "1.11.23",
69
- "dompurify": "3.4.14",
69
+ "dompurify": "3.4.15",
70
70
  "escape-html": "1.0.3",
71
- "i18next": "26.4.0",
72
- "i18next-http-backend": "4.0.1",
71
+ "i18next": "26.4.2",
72
+ "i18next-http-backend": "4.0.2",
73
73
  "lit": "3.3.3",
74
74
  "marked": "12.0.2"
75
75
  },
@@ -80,19 +80,19 @@
80
80
  "@playwright/test": "1.62.1",
81
81
  "@rollup/plugin-replace": "6.0.3",
82
82
  "@rslib/core": "0.23.2",
83
- "@storybook/addon-a11y": "10.5.8",
84
- "@storybook/addon-docs": "10.5.8",
83
+ "@storybook/addon-a11y": "10.6.0",
84
+ "@storybook/addon-docs": "10.6.0",
85
85
  "@storybook/addon-mcp": "0.7.0",
86
- "@storybook/addon-vitest": "10.5.8",
86
+ "@storybook/addon-vitest": "10.6.0",
87
87
  "@storybook/icons": "2.1.0",
88
- "@storybook/web-components-vite": "10.5.8",
88
+ "@storybook/web-components-vite": "10.6.0",
89
89
  "@tailwindcss/postcss": "4.3.3",
90
90
  "@tailwindcss/vite": "4.3.3",
91
91
  "@types/escape-html": "1.0.4",
92
- "@types/node": "24.13.3",
92
+ "@types/node": "24.13.6",
93
93
  "@vitest/browser-playwright": "4.1.11",
94
94
  "@wc-toolkit/storybook-helpers": "10.5.1",
95
- "chromatic": "18.5.0",
95
+ "chromatic": "18.9.4",
96
96
  "handlebars": "4.7.9",
97
97
  "lit-html": "3.3.3",
98
98
  "local-web-server": "5.4.0",
@@ -100,26 +100,26 @@
100
100
  "msw-storybook-addon": "2.0.7",
101
101
  "natural-orderby": "5.0.0",
102
102
  "playwright": "1.62.1",
103
- "postcss": "8.5.26",
103
+ "postcss": "8.5.28",
104
104
  "postcss-load-config": "6.0.1",
105
- "prettier": "3.9.6",
105
+ "prettier": "3.9.8",
106
106
  "publint": "0.3.24",
107
107
  "puppeteer": "25.9.0",
108
108
  "react": "19.2.8",
109
109
  "remark-gfm": "4.0.1",
110
110
  "shadow-dom-testing-library": "1.14.1",
111
- "storybook": "10.5.8",
112
- "storybook-addon-pseudo-states": "10.5.8",
111
+ "storybook": "10.6.0",
112
+ "storybook-addon-pseudo-states": "10.6.0",
113
113
  "tailwindcss": "4.3.3",
114
114
  "ts-dedent": "2.3.0",
115
115
  "ts-lit-plugin": "2.0.2",
116
116
  "typescript": "6.0.3",
117
- "vite": "8.2.2",
117
+ "vite": "8.3.0",
118
118
  "vitest": "4.1.11"
119
119
  },
120
120
  "peerDependencies": {
121
121
  "@coveo/bueno": "^1.1.9",
122
- "@coveo/headless": "^3.56.0",
122
+ "@coveo/headless": "^3.57.1",
123
123
  "typescript": ">=5.0.0"
124
124
  },
125
125
  "peerDependenciesMeta": {