@coveo/atomic 3.61.4 → 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 (36) hide show
  1. package/custom-elements.json +836 -812
  2. package/dist/cjs/components/common/atomic-generated-answer-content/atomic-generated-answer-content.cjs +23 -1
  3. package/dist/cjs/components/common/atomic-generated-answer-thread/atomic-generated-answer-thread.cjs +1 -1
  4. package/dist/cjs/components/common/atomic-generated-answer-thread-item/atomic-generated-answer-thread-item.cjs +3 -2
  5. package/dist/cjs/components/common/generated-answer/answer-announcement.cjs +73 -0
  6. package/dist/cjs/components/common/generated-answer/copy-button.cjs +2 -1
  7. package/dist/cjs/components/common/generated-answer/feedback-button.cjs +2 -1
  8. package/dist/cjs/components/common/generated-answer/generated-content/markdown-utils.cjs +1 -2
  9. package/dist/cjs/components/common/generated-answer/generated-content-container.cjs +6 -1
  10. package/dist/cjs/components/common/generated-answer/render-answer-content.cjs +5 -2
  11. package/dist/cjs/components/common/generated-answer/show-button.cjs +1 -0
  12. package/dist/cjs/components/insight/atomic-insight-generated-answer/atomic-insight-generated-answer.cjs +3 -1
  13. package/dist/cjs/components/search/atomic-generated-answer/atomic-generated-answer.cjs +8 -1
  14. package/dist/cjs/global/environment.cjs +1 -1
  15. package/dist/cjs/versions.cjs +1 -1
  16. package/dist/esm/components/common/atomic-generated-answer-content/atomic-generated-answer-content.js +23 -1
  17. package/dist/esm/components/common/atomic-generated-answer-thread/atomic-generated-answer-thread.js +1 -1
  18. package/dist/esm/components/common/atomic-generated-answer-thread-item/atomic-generated-answer-thread-item.js +3 -2
  19. package/dist/esm/components/common/generated-answer/answer-announcement.js +32 -0
  20. package/dist/esm/components/common/generated-answer/copy-button.js +2 -1
  21. package/dist/esm/components/common/generated-answer/feedback-button.js +2 -1
  22. package/dist/esm/components/common/generated-answer/generated-content/markdown-utils.js +1 -2
  23. package/dist/esm/components/common/generated-answer/generated-content-container.js +6 -1
  24. package/dist/esm/components/common/generated-answer/render-answer-content.js +5 -2
  25. package/dist/esm/components/common/generated-answer/show-button.js +1 -0
  26. package/dist/esm/components/insight/atomic-insight-generated-answer/atomic-insight-generated-answer.js +3 -1
  27. package/dist/esm/components/search/atomic-generated-answer/atomic-generated-answer.js +8 -1
  28. package/dist/esm/global/environment.js +1 -1
  29. package/dist/esm/versions.js +1 -1
  30. package/dist/types/components/common/atomic-generated-answer-content/atomic-generated-answer-content.d.ts +7 -0
  31. package/dist/types/components/common/generated-answer/answer-announcement.d.ts +22 -0
  32. package/dist/types/components/common/generated-answer/generated-content-container.d.ts +1 -0
  33. package/dist/types/components/common/generated-answer/show-button.d.ts +1 -0
  34. package/dist/types/components/insight/atomic-insight-generated-answer/atomic-insight-generated-answer.d.ts +1 -0
  35. package/dist/types/components/search/atomic-generated-answer/atomic-generated-answer.d.ts +2 -0
  36. package/package.json +9 -9
@@ -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 = '';
@@ -3,7 +3,7 @@ function getWindow() {
3
3
  }
4
4
  function getAtomicEnvironment(headlessVersion) {
5
5
  return {
6
- version: "3.61.4",
6
+ version: "3.61.5",
7
7
  headlessVersion
8
8
  };
9
9
  }
@@ -1,3 +1,3 @@
1
- const atomicVersion = "3.61.4";
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.4",
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,10 +55,10 @@
55
55
  "./custom-elements-manifest": "./custom-elements.json"
56
56
  },
57
57
  "dependencies": {
58
- "@coveo/atomic-legacy": "0.1.5",
58
+ "@coveo/atomic-legacy": "0.1.6",
59
59
  "@coveo/bueno": "1.1.9",
60
- "@coveo/headless": "3.57.0",
61
- "@coveo/relay-event-types": "20.6.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",
@@ -89,10 +89,10 @@
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.7.3",
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",
@@ -102,7 +102,7 @@
102
102
  "playwright": "1.62.1",
103
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",
@@ -114,12 +114,12 @@
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.57.0",
122
+ "@coveo/headless": "^3.57.1",
123
123
  "typescript": ">=5.0.0"
124
124
  },
125
125
  "peerDependenciesMeta": {