@coveo/atomic 3.33.0 → 3.33.1-pre.3b2f3850a0

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 (126) hide show
  1. package/dist/atomic/_atomic.esm.js +1 -1
  2. package/dist/atomic/atomic.esm.js.map +1 -1
  3. package/dist/atomic/components/analytics-config.js +1 -1
  4. package/dist/atomic/components/analytics-config.js.map +1 -1
  5. package/dist/atomic/components/atomic-citation.js +1 -547
  6. package/dist/atomic/components/atomic-citation.js.map +1 -1
  7. package/dist/{esm/atomic-citation.entry.js → atomic/components/atomic-citation2.js} +35 -13
  8. package/dist/atomic/components/atomic-citation2.js.map +1 -0
  9. package/dist/atomic/components/atomic-generated-answer-feedback-modal.js +1 -440
  10. package/dist/atomic/components/atomic-generated-answer-feedback-modal.js.map +1 -1
  11. package/dist/{esm/atomic-generated-answer-feedback-modal.entry.js → atomic/components/atomic-generated-answer-feedback-modal2.js} +55 -25
  12. package/dist/atomic/components/atomic-generated-answer-feedback-modal2.js.map +1 -0
  13. package/dist/atomic/components/atomic-generated-answer.js +88 -28
  14. package/dist/atomic/components/atomic-generated-answer.js.map +1 -1
  15. package/dist/atomic/components/atomic-insight-generated-answer.js +95 -34
  16. package/dist/atomic/components/atomic-insight-generated-answer.js.map +1 -1
  17. package/dist/atomic/components/atomic-ipx-result-link.js +1 -1
  18. package/dist/atomic/components/atomic-popover.js +1 -1
  19. package/dist/atomic/components/atomic-result-link.js +1 -1
  20. package/dist/atomic/components/attributes-slot.js +1 -1
  21. package/dist/atomic/components/createPopper.js +1 -1
  22. package/dist/atomic/components/generated-answer-common.js +146 -238
  23. package/dist/atomic/components/generated-answer-common.js.map +1 -1
  24. package/dist/atomic/components/global/environment.js +1 -1
  25. package/dist/atomic/components/popper-lite.js +1 -1
  26. package/dist/atomic/components/slot-utils.js +1 -1
  27. package/dist/atomic/components/tab-popover.js +1 -1
  28. package/dist/atomic/p-01531448.entry.js +2 -0
  29. package/dist/atomic/p-01531448.entry.js.map +1 -0
  30. package/dist/atomic/p-027b85e5.js +2 -0
  31. package/dist/atomic/{p-bed5a86b.js.map → p-027b85e5.js.map} +1 -1
  32. package/dist/atomic/{p-7b9026d7.js → p-07f25674.js} +2 -2
  33. package/dist/atomic/{p-75b863ea.entry.js → p-0ff341d5.entry.js} +2 -2
  34. package/dist/atomic/{p-eb026d69.entry.js → p-129799b2.entry.js} +2 -2
  35. package/dist/atomic/p-284f3c50.js +2 -0
  36. package/dist/atomic/p-284f3c50.js.map +1 -0
  37. package/dist/atomic/p-33201620.entry.js +2 -0
  38. package/dist/atomic/p-33201620.entry.js.map +1 -0
  39. package/dist/atomic/{p-8b6aaeed.entry.js → p-333be187.entry.js} +2 -2
  40. package/dist/atomic/{p-ba67a16b.js → p-3b58a34d.js} +2 -2
  41. package/dist/atomic/{p-ba67a16b.js.map → p-3b58a34d.js.map} +1 -1
  42. package/dist/atomic/{p-946fe85f.js → p-4aaffb59.js} +2 -2
  43. package/dist/atomic/{p-48c8a766.entry.js → p-5730dec7.entry.js} +2 -2
  44. package/dist/atomic/p-5d785d02.entry.js +2 -0
  45. package/dist/atomic/p-5d785d02.entry.js.map +1 -0
  46. package/dist/atomic/{p-9da1c516.entry.js → p-6481379f.entry.js} +2 -2
  47. package/dist/atomic/{p-bfdecd0f.entry.js → p-6f5d26cb.entry.js} +2 -2
  48. package/dist/atomic/{p-ca0a32dc.entry.js → p-dd93ae9a.entry.js} +2 -2
  49. package/dist/cjs/_loader.cjs.js +1 -1
  50. package/dist/cjs/{analytics-config-f34a68ee.js → analytics-config-de09a791.js} +2 -2
  51. package/dist/cjs/analytics-config-de09a791.js.map +1 -0
  52. package/dist/cjs/{atomic-generated-answer-feedback-modal.cjs.entry.js → atomic-citation_2.cjs.entry.js} +526 -1
  53. package/dist/cjs/atomic-citation_2.cjs.entry.js.map +1 -0
  54. package/dist/cjs/atomic-generated-answer.cjs.entry.js +62 -27
  55. package/dist/cjs/atomic-generated-answer.cjs.entry.js.map +1 -1
  56. package/dist/cjs/atomic-insight-generated-answer.cjs.entry.js +68 -32
  57. package/dist/cjs/atomic-insight-generated-answer.cjs.entry.js.map +1 -1
  58. package/dist/cjs/atomic-insight-interface.cjs.entry.js +1 -1
  59. package/dist/cjs/atomic-recs-interface.cjs.entry.js +1 -1
  60. package/dist/cjs/atomic-search-interface.cjs.entry.js +1 -1
  61. package/dist/cjs/atomic.cjs.js +1 -1
  62. package/dist/cjs/{generated-answer-common-4cd4b7c6.js → generated-answer-common-469ad0e8.js} +152 -237
  63. package/dist/cjs/generated-answer-common-469ad0e8.js.map +1 -0
  64. package/dist/cjs/index-757bc886.js +4 -8
  65. package/dist/cjs/version.cjs.js +2 -2
  66. package/dist/esm/_loader.js +1 -1
  67. package/dist/esm/{analytics-config-672b6eba.js → analytics-config-19fa5599.js} +2 -2
  68. package/dist/esm/analytics-config-19fa5599.js.map +1 -0
  69. package/dist/esm/atomic-citation_2.entry.js +938 -0
  70. package/dist/esm/atomic-citation_2.entry.js.map +1 -0
  71. package/dist/esm/atomic-generated-answer.entry.js +64 -29
  72. package/dist/esm/atomic-generated-answer.entry.js.map +1 -1
  73. package/dist/esm/atomic-insight-generated-answer.entry.js +71 -35
  74. package/dist/esm/atomic-insight-generated-answer.entry.js.map +1 -1
  75. package/dist/esm/atomic-insight-interface.entry.js +1 -1
  76. package/dist/esm/atomic-popover.entry.js +2 -2
  77. package/dist/esm/atomic-recs-interface.entry.js +1 -1
  78. package/dist/esm/atomic-search-box-query-suggestions_2.entry.js +1 -1
  79. package/dist/esm/atomic-search-box.entry.js +1 -1
  80. package/dist/esm/atomic-search-interface.entry.js +2 -2
  81. package/dist/esm/atomic-tab-bar_2.entry.js +2 -2
  82. package/dist/esm/atomic.js +1 -1
  83. package/dist/esm/{createPopper-a633eb88.js → createPopper-ed15cfea.js} +2 -2
  84. package/dist/esm/{createPopper-a633eb88.js.map → createPopper-ed15cfea.js.map} +1 -1
  85. package/dist/esm/{generated-answer-common-06146290.js → generated-answer-common-184a3c08.js} +147 -239
  86. package/dist/esm/generated-answer-common-184a3c08.js.map +1 -0
  87. package/dist/esm/index-3f35faca.js +4 -8
  88. package/dist/esm/{local-storage-utils-410269e6.js → local-storage-utils-a4bf8fba.js} +2 -2
  89. package/dist/esm/{local-storage-utils-410269e6.js.map → local-storage-utils-a4bf8fba.js.map} +1 -1
  90. package/dist/esm/{popper-lite-2035100c.js → popper-lite-4b6382b2.js} +2 -2
  91. package/dist/esm/{popper-lite-2035100c.js.map → popper-lite-4b6382b2.js.map} +1 -1
  92. package/dist/esm/version.js +2 -2
  93. package/dist/types/components/common/generated-answer/generated-answer-common.d.ts +30 -50
  94. package/dist/types/components/insight/atomic-insight-generated-answer/atomic-insight-generated-answer.d.ts +11 -3
  95. package/dist/types/components/search/atomic-generated-answer/atomic-generated-answer.d.ts +9 -1
  96. package/docs/atomic-docs.json +17 -3
  97. package/package.json +3 -3
  98. package/dist/atomic/p-0c076058.entry.js +0 -2
  99. package/dist/atomic/p-0c076058.entry.js.map +0 -1
  100. package/dist/atomic/p-421850f9.entry.js +0 -2
  101. package/dist/atomic/p-421850f9.entry.js.map +0 -1
  102. package/dist/atomic/p-579c5b46.entry.js +0 -2
  103. package/dist/atomic/p-579c5b46.entry.js.map +0 -1
  104. package/dist/atomic/p-5fca1435.js +0 -2
  105. package/dist/atomic/p-5fca1435.js.map +0 -1
  106. package/dist/atomic/p-bed5a86b.js +0 -2
  107. package/dist/atomic/p-e27e1e46.entry.js +0 -2
  108. package/dist/atomic/p-e27e1e46.entry.js.map +0 -1
  109. package/dist/cjs/analytics-config-f34a68ee.js.map +0 -1
  110. package/dist/cjs/atomic-citation.cjs.entry.js +0 -533
  111. package/dist/cjs/atomic-citation.cjs.entry.js.map +0 -1
  112. package/dist/cjs/atomic-generated-answer-feedback-modal.cjs.entry.js.map +0 -1
  113. package/dist/cjs/generated-answer-common-4cd4b7c6.js.map +0 -1
  114. package/dist/esm/analytics-config-672b6eba.js.map +0 -1
  115. package/dist/esm/atomic-citation.entry.js.map +0 -1
  116. package/dist/esm/atomic-generated-answer-feedback-modal.entry.js.map +0 -1
  117. package/dist/esm/generated-answer-common-06146290.js.map +0 -1
  118. /package/dist/atomic/{p-7b9026d7.js.map → p-07f25674.js.map} +0 -0
  119. /package/dist/atomic/{p-75b863ea.entry.js.map → p-0ff341d5.entry.js.map} +0 -0
  120. /package/dist/atomic/{p-eb026d69.entry.js.map → p-129799b2.entry.js.map} +0 -0
  121. /package/dist/atomic/{p-8b6aaeed.entry.js.map → p-333be187.entry.js.map} +0 -0
  122. /package/dist/atomic/{p-946fe85f.js.map → p-4aaffb59.js.map} +0 -0
  123. /package/dist/atomic/{p-48c8a766.entry.js.map → p-5730dec7.entry.js.map} +0 -0
  124. /package/dist/atomic/{p-9da1c516.entry.js.map → p-6481379f.entry.js.map} +0 -0
  125. /package/dist/atomic/{p-bfdecd0f.entry.js.map → p-6f5d26cb.entry.js.map} +0 -0
  126. /package/dist/atomic/{p-ca0a32dc.entry.js.map → p-dd93ae9a.entry.js.map} +0 -0
@@ -1,6 +1,5 @@
1
1
  import { h } from './index-3f35faca.js';
2
- import { S as SafeStorage, a as StorageItems } from './local-storage-utils-410269e6.js';
3
- import { g as getNamedSlotFromHost } from './slot-utils-dcf4fc27.js';
2
+ import { S as StorageItems, a as SafeStorage } from './local-storage-utils-a4bf8fba.js';
4
3
  import { H as Heading } from './stencil-heading-2b28a9b9.js';
5
4
  import { B as Button } from './stencil-button-75e8b31b.js';
6
5
  import { D as DOMPurify } from './purify-c7ebd240.js';
@@ -2670,258 +2669,167 @@ const SourceCitations = (props, children) => props.isVisible ? (h("div", { class
2670
2669
  h("p", { part: "citations-label", class: "text-neutral-dark mb-2 shrink-0" }, props.label),
2671
2670
  h("ol", { class: "citations-container flex list-none flex-wrap items-center gap-2" }, children))) : null;
2672
2671
 
2673
- class GeneratedAnswerCommon {
2674
- constructor(props) {
2675
- this.props = props;
2676
- this.storage = new SafeStorage();
2677
- this._data = this.readStoredData();
2678
- }
2679
- insertFeedbackModal() {
2680
- this.modalRef = document.createElement('atomic-generated-answer-feedback-modal');
2681
- this.modalRef.generatedAnswer = this.props.getGeneratedAnswer();
2682
- this.props.host.insertAdjacentElement('beforebegin', this.modalRef);
2683
- }
2684
- readStoredData() {
2685
- const { withToggle } = this.props;
2686
- const storedData = this.storage.getParsedJSON(StorageItems.GENERATED_ANSWER_DATA, { isVisible: true });
2687
- // This check ensures that the answer is visible when the toggle is hidden and visible is set to false in the local storage.
2688
- return { isVisible: (withToggle && storedData.isVisible) || !withToggle };
2689
- }
2690
- writeStoredData(data) {
2691
- this.storage.setJSON(StorageItems.GENERATED_ANSWER_DATA, data);
2692
- }
2693
- get data() {
2694
- return this._data;
2695
- }
2696
- set data(newData) {
2697
- this._data = newData;
2672
+ const readGeneratedAnswerStoredData = (withToggle) => {
2673
+ const storage = new SafeStorage();
2674
+ const storedData = storage.getParsedJSON(StorageItems.GENERATED_ANSWER_DATA, { isVisible: true });
2675
+ // This check ensures that the answer is visible when the toggle is hidden and visible is set to false in the local storage.
2676
+ return { isVisible: (withToggle && storedData.isVisible) || !withToggle };
2677
+ };
2678
+ const writeGeneratedAnswerStoredData = (data) => {
2679
+ const storage = new SafeStorage();
2680
+ storage.setJSON(StorageItems.GENERATED_ANSWER_DATA, data);
2681
+ };
2682
+ const insertGeneratedAnswerFeedbackModal = (host, generatedAnswer) => {
2683
+ const modalRef = document.createElement('atomic-generated-answer-feedback-modal');
2684
+ if (generatedAnswer) {
2685
+ modalRef.generatedAnswer = generatedAnswer();
2698
2686
  }
2699
- getGeneratedAnswerStatus() {
2700
- const isHidden = !this.props.getGeneratedAnswerState()?.isVisible;
2701
- const isGenerating = !!this.props.getGeneratedAnswerState()?.isStreaming;
2702
- const hasAnswer = !!this.props.getGeneratedAnswerState()?.answer;
2703
- const hasError = !!this.props.getGeneratedAnswerState()?.error;
2704
- if (isHidden) {
2705
- return this.props.getBindings().i18n.t('generated-answer-hidden');
2706
- }
2707
- if (isGenerating) {
2708
- return this.props.getBindings().i18n.t('generating-answer');
2709
- }
2710
- if (hasError) {
2711
- return this.props.getBindings().i18n.t('answer-could-not-be-generated');
2712
- }
2713
- if (hasAnswer) {
2714
- return this.props.getBindings().i18n.t('answer-generated', {
2715
- answer: this.props.getGeneratedAnswerState()?.answer,
2716
- });
2717
- }
2687
+ host.insertAdjacentElement('beforebegin', modalRef);
2688
+ return modalRef;
2689
+ };
2690
+ const getGeneratedAnswerStatus = (generatedAnswerState, i18n) => {
2691
+ if (!generatedAnswerState || !i18n) {
2718
2692
  return '';
2719
2693
  }
2720
- get hasRetryableError() {
2721
- return (!this.props.getSearchStatusState()?.hasError &&
2722
- this.props.getGeneratedAnswerState()?.error?.isRetryable);
2694
+ const isHidden = !generatedAnswerState.isVisible;
2695
+ const isGenerating = !!generatedAnswerState.isStreaming;
2696
+ const hasAnswer = !!generatedAnswerState.answer;
2697
+ const hasError = !!generatedAnswerState.error;
2698
+ if (isHidden) {
2699
+ return i18n.t('generated-answer-hidden');
2723
2700
  }
2724
- get hasNoAnswerGenerated() {
2725
- const { answer, citations } = this.props.getGeneratedAnswerState() ?? {};
2726
- return (answer === undefined && !citations?.length && !this.hasRetryableError);
2701
+ if (isGenerating) {
2702
+ return i18n.t('generating-answer');
2727
2703
  }
2728
- get isAnswerVisible() {
2729
- return this.props.getGeneratedAnswerState()?.isVisible;
2704
+ if (hasError) {
2705
+ return i18n.t('answer-could-not-be-generated');
2730
2706
  }
2731
- get toggleTooltip() {
2732
- const key = this.isAnswerVisible
2733
- ? 'generated-answer-toggle-on'
2734
- : 'generated-answer-toggle-off';
2735
- return this.props.getBindings().i18n.t(key);
2736
- }
2737
- get hasClipboard() {
2738
- return !!navigator?.clipboard?.writeText;
2707
+ if (hasAnswer) {
2708
+ return i18n.t('answer-generated', {
2709
+ answer: generatedAnswerState.answer,
2710
+ });
2739
2711
  }
2740
- get copyToClipboardTooltip() {
2741
- if (this.props.getCopyError()) {
2742
- return this.props.getBindings().i18n.t('failed-to-copy-generated-answer');
2743
- }
2744
- return !this.props.getCopied()
2745
- ? this.props.getBindings().i18n.t('copy-generated-answer')
2746
- : this.props.getBindings().i18n.t('generated-answer-copied');
2712
+ return '';
2713
+ };
2714
+ const copyToClipboard = async (answer, setCopied, setCopyError, onLogCopyToClipboard, logger) => {
2715
+ try {
2716
+ await navigator.clipboard.writeText(answer);
2717
+ setCopied(true);
2718
+ onLogCopyToClipboard?.();
2747
2719
  }
2748
- get hasCustomNoAnswerMessage() {
2749
- const slot = getNamedSlotFromHost(this.props.host, 'no-answer-message');
2750
- return !!slot;
2720
+ catch (error) {
2721
+ setCopyError(true);
2722
+ logger?.error(`Failed to copy to clipboard: ${error}`);
2751
2723
  }
2752
- async copyToClipboard(answer) {
2753
- try {
2754
- await navigator.clipboard.writeText(answer);
2755
- this.props.setCopied(true);
2756
- this.props.getGeneratedAnswer()?.logCopyToClipboard();
2757
- }
2758
- catch (error) {
2759
- this.props.setCopyError(true);
2760
- this.props
2761
- .getBindings()
2762
- .engine.logger.error(`Failed to copy to clipboard: ${error}`);
2763
- }
2764
- setTimeout(() => {
2765
- this.props.setCopied(false);
2766
- this.props.setCopyError(false);
2767
- }, 2000);
2724
+ setTimeout(() => {
2725
+ setCopied(false);
2726
+ setCopyError(false);
2727
+ }, 2000);
2728
+ };
2729
+ const GeneratedAnswerWrapper = ({ contentClasses }, children) => {
2730
+ const classes = contentClasses ||
2731
+ 'mx-auto mt-0 mb-4 border border-neutral shadow-lg p-6 bg-background rounded-lg p-6 text-on-background';
2732
+ return (h("div", null,
2733
+ h("aside", { class: classes, part: "container" },
2734
+ h("article", null, children))));
2735
+ };
2736
+ const GeneratedAnswerHeader = ({ i18n, isAnswerVisible, withToggle, onToggle }) => {
2737
+ const toggleTooltip = isAnswerVisible
2738
+ ? i18n.t('generated-answer-toggle-on')
2739
+ : i18n.t('generated-answer-toggle-off');
2740
+ return (h("div", { class: "flex items-center" },
2741
+ h(Heading, { level: 0, part: "header-label", class: "text-primary bg-primary-background inline-block rounded-md px-2.5 py-2 font-medium" }, i18n.t('generated-answer-title')),
2742
+ h("div", { class: "ml-auto flex h-9 items-center" },
2743
+ h(Switch, { part: "toggle", checked: isAnswerVisible, onToggle: onToggle, ariaLabel: i18n.t('generated-answer-title'), title: toggleTooltip, withToggle: withToggle }))));
2744
+ };
2745
+ const GeneratedAnswerFeedbackAndCopyButtons = ({ copied, copyError, disliked, hasClipboard, i18n, isStreaming, liked, withToggle, onClickDislike, onClickLike, onCopyToClipboard, }) => {
2746
+ const containerClasses = [
2747
+ 'feedback-buttons',
2748
+ 'flex',
2749
+ 'h-9',
2750
+ 'absolute',
2751
+ 'top-6',
2752
+ 'shrink-0',
2753
+ 'gap-2',
2754
+ withToggle ? 'right-20' : 'right-6',
2755
+ ].join(' ');
2756
+ if (isStreaming) {
2757
+ return null;
2768
2758
  }
2769
- clickOnShowButton() {
2770
- if (this.props.getGeneratedAnswerState()?.expanded) {
2771
- this.props.getGeneratedAnswer()?.collapse();
2772
- }
2773
- else {
2774
- this.props.getGeneratedAnswer()?.expand();
2775
- }
2759
+ const copyToClipboardTooltip = copyError
2760
+ ? i18n.t('failed-to-copy-generated-answer')
2761
+ : !copied
2762
+ ? i18n.t('copy-generated-answer')
2763
+ : i18n.t('generated-answer-copied');
2764
+ return (h("div", { class: containerClasses },
2765
+ h(FeedbackButton, { title: i18n.t('this-answer-was-helpful'), variant: "like", active: !!liked, onClick: onClickLike }),
2766
+ h(FeedbackButton, { title: i18n.t('this-answer-was-not-helpful'), variant: "dislike", active: !!disliked, onClick: onClickDislike }),
2767
+ hasClipboard ? (h(CopyButton, { title: copyToClipboardTooltip, isCopied: copied, error: copyError, onClick: onCopyToClipboard })) : null));
2768
+ };
2769
+ const GeneratedAnswerCitations = ({ citations, disableCitationAnchoring, buildInteractiveCitation, onLogCitationHover, i18n, }) => {
2770
+ if (!citations?.length) {
2771
+ return [];
2776
2772
  }
2777
- getCitation(citation) {
2773
+ const getCitation = (citation) => {
2778
2774
  const { title } = citation;
2779
- const { i18n } = this.props.getBindings();
2780
2775
  return title.trim() !== ''
2781
2776
  ? citation
2782
- : { ...citation, title: i18n.t('no-title') };
2783
- }
2784
- renderCitations() {
2785
- const { getGeneratedAnswerState, buildInteractiveCitation, getGeneratedAnswer, disableCitationAnchoring, } = this.props;
2786
- const { citations } = getGeneratedAnswerState() ?? {};
2787
- const { logCitationHover } = getGeneratedAnswer() ?? {};
2788
- return citations?.map((citation, index) => {
2789
- const interactiveCitation = buildInteractiveCitation({
2790
- options: {
2791
- citation,
2792
- },
2793
- });
2794
- return (h("li", { key: citation.id, class: "max-w-full" },
2795
- h("atomic-citation", { citation: this.getCitation(citation), index: index, sendHoverEndEvent: (citationHoverTimeMs) => {
2796
- logCitationHover?.(citation.id, citationHoverTimeMs);
2797
- }, interactiveCitation: interactiveCitation, disableCitationAnchoring: disableCitationAnchoring, exportparts: "citation,citation-popover" })));
2798
- });
2799
- }
2800
- renderFeedbackAndCopyButtons() {
2801
- const { getGeneratedAnswerState, getBindings, getCopied, getCopyError } = this.props;
2802
- const { i18n } = getBindings();
2803
- const { liked, disliked, answer, isStreaming } = getGeneratedAnswerState() ?? {};
2804
- const containerClasses = [
2805
- 'feedback-buttons',
2806
- 'flex',
2807
- 'h-9',
2808
- 'absolute',
2809
- 'top-6',
2810
- 'shrink-0',
2811
- 'gap-2',
2812
- this.props.withToggle ? 'right-20' : 'right-6',
2813
- ].join(' ');
2814
- if (isStreaming) {
2815
- return null;
2816
- }
2817
- return (h("div", { class: containerClasses },
2818
- h(FeedbackButton, { title: i18n.t('this-answer-was-helpful'), variant: "like", active: !!liked, onClick: () => this.clickLike() }),
2819
- h(FeedbackButton, { title: i18n.t('this-answer-was-not-helpful'), variant: "dislike", active: !!disliked, onClick: () => this.clickDislike() }),
2820
- this.hasClipboard ? (h(CopyButton, { title: this.copyToClipboardTooltip, isCopied: getCopied(), error: getCopyError(), onClick: async () => {
2821
- if (answer) {
2822
- await this.copyToClipboard(answer);
2823
- }
2824
- } })) : null));
2825
- }
2826
- setIsAnswerHelpful(isAnswerHelpful) {
2827
- if (this.modalRef) {
2828
- this.modalRef.helpful = isAnswerHelpful;
2829
- }
2830
- }
2831
- openFeedbackModal() {
2832
- if (this.modalRef &&
2833
- !this.props.getGeneratedAnswerState()?.feedbackSubmitted) {
2834
- this.modalRef.isOpen = true;
2835
- }
2836
- }
2837
- clickDislike() {
2838
- this.setIsAnswerHelpful(false);
2839
- this.props.getGeneratedAnswer()?.dislike();
2840
- this.openFeedbackModal();
2841
- }
2842
- clickLike() {
2843
- this.setIsAnswerHelpful(true);
2844
- this.props.getGeneratedAnswer()?.like();
2845
- this.openFeedbackModal();
2846
- }
2847
- renderDisclaimer() {
2848
- const { getGeneratedAnswerState, getBindings } = this.props;
2849
- const { i18n } = getBindings();
2850
- const { isStreaming } = getGeneratedAnswerState() ?? {};
2851
- if (isStreaming) {
2852
- return null;
2853
- }
2854
- return (h("div", { class: "text-neutral-dark text-xs/[1rem]" },
2855
- h("slot", { name: "disclaimer", slot: "disclaimer" }, i18n.t('generated-answer-disclaimer'))));
2856
- }
2857
- renderShowButton() {
2858
- const { getGeneratedAnswerState, getBindings, collapsible } = this.props;
2859
- const { i18n } = getBindings();
2860
- const { expanded, isStreaming } = getGeneratedAnswerState() ?? {};
2861
- const canRender = collapsible && !isStreaming;
2862
- if (!canRender) {
2863
- return null;
2864
- }
2865
- return (h(ShowButton, { i18n: i18n, onClick: () => this.clickOnShowButton(), isCollapsed: !expanded }));
2777
+ : { ...citation, title: i18n?.t ? i18n.t('no-title') : 'No title' };
2778
+ };
2779
+ return citations.map((citation, index) => {
2780
+ const interactiveCitation = buildInteractiveCitation?.(citation);
2781
+ return (h("li", { key: citation.id, class: "max-w-full" },
2782
+ h("atomic-citation", { citation: getCitation(citation), index: index, sendHoverEndEvent: (citationHoverTimeMs) => {
2783
+ onLogCitationHover?.(citation.id, citationHoverTimeMs);
2784
+ }, interactiveCitation: interactiveCitation, disableCitationAnchoring: disableCitationAnchoring, exportparts: "citation,citation-popover" })));
2785
+ });
2786
+ };
2787
+ const GeneratedAnswerDisclaimer = ({ isStreaming, i18n }, children) => {
2788
+ if (isStreaming) {
2789
+ return null;
2866
2790
  }
2867
- renderGeneratingAnswerLabel() {
2868
- const { getGeneratedAnswerState, getBindings, collapsible } = this.props;
2869
- const { i18n } = getBindings();
2870
- const { isStreaming } = getGeneratedAnswerState() ?? {};
2871
- const canRender = collapsible && isStreaming;
2872
- if (!canRender) {
2873
- return null;
2874
- }
2875
- return (h("div", { part: "is-generating", class: "text-primary hidden text-base font-light" },
2791
+ return (h("div", { class: "text-neutral-dark text-xs/[1rem]" }, children || i18n.t('generated-answer-disclaimer')));
2792
+ };
2793
+ const GeneratedAnswerFooter = ({ collapsible, expanded, i18n, isStreaming, onShowButtonClick }, children) => {
2794
+ const showGeneratingLabel = collapsible && isStreaming;
2795
+ const showButton = collapsible && !isStreaming;
2796
+ return (h("div", { part: "generated-answer-footer", class: "mt-6 flex justify-end" },
2797
+ showGeneratingLabel && (h("div", { part: "is-generating", class: "text-primary hidden text-base font-light" },
2876
2798
  i18n.t('generating-answer'),
2877
- "..."));
2878
- }
2879
- renderContent() {
2880
- const { getGeneratedAnswerState, getBindings, getGeneratedAnswer } = this.props;
2881
- const { i18n } = getBindings();
2882
- const { isStreaming, answer, citations, answerContentFormat } = getGeneratedAnswerState() ?? {};
2883
- return (h("div", { part: "generated-content" },
2884
- h("div", { class: "flex items-center" },
2885
- h(Heading, { level: 0, part: "header-label", class: "text-primary bg-primary-background inline-block rounded-md px-2.5 py-2 font-medium" }, i18n.t('generated-answer-title')),
2886
- h("div", { class: "ml-auto flex h-9 items-center" },
2887
- h(Switch, { part: "toggle", checked: this.isAnswerVisible, onToggle: (checked) => {
2888
- checked
2889
- ? getGeneratedAnswer()?.show()
2890
- : getGeneratedAnswer()?.hide();
2891
- }, ariaLabel: i18n.t('generated-answer-title'), title: this.toggleTooltip, withToggle: this.props.withToggle }))),
2892
- this.hasRetryableError && this.isAnswerVisible ? (h(RetryPrompt, { onClick: () => getGeneratedAnswer()?.retry(), buttonLabel: i18n.t('retry'), message: i18n.t('retry-stream-message') })) : null,
2893
- !this.hasRetryableError && this.isAnswerVisible ? (h(GeneratedContentContainer, { answer: answer, answerContentFormat: answerContentFormat, isStreaming: !!isStreaming },
2894
- this.renderFeedbackAndCopyButtons(),
2895
- h(SourceCitations, { label: i18n.t('citations'), isVisible: !!citations?.length }, this.renderCitations()))) : null,
2896
- !this.hasRetryableError && this.isAnswerVisible && (h("div", { part: "generated-answer-footer", class: "mt-6 flex justify-end" },
2897
- this.renderGeneratingAnswerLabel(),
2898
- this.renderShowButton(),
2899
- this.renderDisclaimer()))));
2900
- }
2901
- renderCustomNoAnswerMessage() {
2902
- const { getBindings } = this.props;
2903
- const { i18n } = getBindings();
2904
- return (h("div", { part: "generated-content" },
2905
- h("div", { class: "flex items-center" },
2906
- h(Heading, { level: 0, part: "header-label", class: "text-primary bg-primary-background inline-block rounded-md px-2.5 py-2 font-medium" }, i18n.t('generated-answer-title'))),
2907
- h("div", { part: "generated-container", class: "mt-6 break-words" },
2908
- h("slot", { name: "no-answer-message" }))));
2909
- }
2910
- render() {
2911
- const { getGeneratedAnswerState } = this.props;
2912
- const { cannotAnswer } = getGeneratedAnswerState() ?? {};
2913
- const contentClasses = 'mx-auto mt-0 mb-4 border border-neutral shadow-lg p-6 bg-background rounded-lg p-6 text-on-background';
2914
- if (this.hasNoAnswerGenerated) {
2915
- return cannotAnswer && this.hasCustomNoAnswerMessage ? (h("div", null,
2916
- h("aside", { class: contentClasses, part: "container" },
2917
- h("article", null, this.renderCustomNoAnswerMessage())))) : null;
2918
- }
2919
- return (h("div", null,
2920
- h("aside", { class: contentClasses, part: "container" },
2921
- h("article", null, this.renderContent()))));
2922
- }
2923
- }
2799
+ "...")),
2800
+ showButton && onShowButtonClick && (h(ShowButton, { i18n: i18n, onClick: onShowButtonClick, isCollapsed: !expanded })),
2801
+ children));
2802
+ };
2803
+ const GeneratedAnswerRetryPrompt = ({ i18n, onRetry }) => {
2804
+ return (h(RetryPrompt, { onClick: onRetry, buttonLabel: i18n.t('retry'), message: i18n.t('retry-stream-message') }));
2805
+ };
2806
+ const GeneratedAnswerContent = ({ answer, answerContentFormat, citations, i18n, isStreaming, copied, copyError, generatedAnswerState, withToggle, onClickDislike, onClickLike, onCopyToClipboard, hasClipboard, disableCitationAnchoring, buildInteractiveCitationForCitation, generatedAnswer }) => {
2807
+ return (h(GeneratedContentContainer, { answer: answer, answerContentFormat: answerContentFormat, isStreaming: !!isStreaming },
2808
+ h(GeneratedAnswerFeedbackAndCopyButtons, { copied: copied, copyError: copyError, disliked: generatedAnswerState?.disliked, hasClipboard: hasClipboard, i18n: i18n, isStreaming: generatedAnswerState?.isStreaming, liked: generatedAnswerState?.liked, withToggle: withToggle, onClickDislike: onClickDislike, onClickLike: onClickLike, onCopyToClipboard: onCopyToClipboard }),
2809
+ h(SourceCitations, { label: i18n.t('citations'), isVisible: !!citations?.length },
2810
+ h(GeneratedAnswerCitations, { citations: generatedAnswerState.citations, disableCitationAnchoring: disableCitationAnchoring, buildInteractiveCitation: buildInteractiveCitationForCitation, onLogCitationHover: (citationId, citationHoverTimeMs) => {
2811
+ generatedAnswer?.logCitationHover?.(citationId, citationHoverTimeMs);
2812
+ }, i18n: i18n }))));
2813
+ };
2814
+ const GeneratedAnswerCommon = ({ onShowButtonClick, onClickDislike, onClickLike, onCopyToClipboard, collapsible, disableCitationAnchoring, copied, i18n, copyError, generatedAnswer, generatedAnswerState, withToggle, isAnswerVisible, hasRetryableError, hasClipboard, buildInteractiveCitationForCitation }) => {
2815
+ return h(GeneratedAnswerWrapper, null,
2816
+ h("div", { part: "generated-content" },
2817
+ h(GeneratedAnswerHeader, { i18n: i18n, isAnswerVisible: !!isAnswerVisible, withToggle: withToggle, onToggle: (checked) => {
2818
+ checked ? generatedAnswer?.show() : generatedAnswer?.hide();
2819
+ } }),
2820
+ hasRetryableError && isAnswerVisible ? (h(GeneratedAnswerRetryPrompt, { i18n: i18n, onRetry: () => generatedAnswer?.retry() })) : null,
2821
+ !hasRetryableError && isAnswerVisible ? (h(GeneratedAnswerContent, { answer: generatedAnswerState?.answer, answerContentFormat: generatedAnswerState?.answerContentFormat, citations: generatedAnswerState?.citations, i18n: i18n, isStreaming: generatedAnswerState?.isStreaming, copied: copied, copyError: copyError, generatedAnswerState: generatedAnswerState, withToggle: withToggle, onClickDislike: onClickDislike, onClickLike: onClickLike, onCopyToClipboard: onCopyToClipboard, hasClipboard: hasClipboard, disableCitationAnchoring: disableCitationAnchoring, buildInteractiveCitationForCitation: buildInteractiveCitationForCitation, generatedAnswer: generatedAnswer })) : null,
2822
+ !hasRetryableError && isAnswerVisible && (h(GeneratedAnswerFooter, { collapsible: collapsible, expanded: generatedAnswerState?.expanded, i18n: i18n, isStreaming: generatedAnswerState?.isStreaming, onShowButtonClick: onShowButtonClick },
2823
+ h(GeneratedAnswerDisclaimer, { isStreaming: generatedAnswerState?.isStreaming, i18n: i18n },
2824
+ h("slot", { name: "disclaimer", slot: "disclaimer" }, i18n.t('generated-answer-disclaimer')))))));
2825
+ };
2826
+ const GeneratedAnswerNoAnswerMessage = ({ i18n }, children) => {
2827
+ return (h("div", { part: "generated-content" },
2828
+ h("div", { class: "flex items-center" },
2829
+ h(Heading, { level: 0, part: "header-label", class: "text-primary bg-primary-background inline-block rounded-md px-2.5 py-2 font-medium" }, i18n.t('generated-answer-title'))),
2830
+ h("div", { part: "generated-container", class: "mt-6 break-words" }, children)));
2831
+ };
2924
2832
 
2925
- export { GeneratedAnswerCommon as G };
2833
+ export { GeneratedAnswerNoAnswerMessage as G, GeneratedAnswerWrapper as a, GeneratedAnswerCommon as b, copyToClipboard as c, getGeneratedAnswerStatus as g, insertGeneratedAnswerFeedbackModal as i, readGeneratedAnswerStoredData as r, writeGeneratedAnswerStoredData as w };
2926
2834
 
2927
- //# sourceMappingURL=generated-answer-common-06146290.js.map
2835
+ //# sourceMappingURL=generated-answer-common-184a3c08.js.map