@coveo/atomic 3.49.0 → 3.51.0

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 (231) hide show
  1. package/custom-elements.json +2257 -369
  2. package/dist/atomic/_atomic.esm.js +1 -1
  3. package/dist/atomic/atomic.esm.js.map +1 -1
  4. package/dist/atomic/components/_index.d.ts +0 -10
  5. package/dist/atomic/components/_index.js +2 -8
  6. package/dist/atomic/components/atomic-insight-result-action.js +123 -6
  7. package/dist/atomic/components/atomic-insight-result-action.js.map +1 -1
  8. package/dist/atomic/components/atomic-insight-result-children-template.js +1 -2
  9. package/dist/atomic/components/atomic-insight-result-children-template.js.map +1 -1
  10. package/dist/atomic/components/atomic-insight-timeframe-facet.js +97 -7
  11. package/dist/atomic/components/atomic-insight-timeframe-facet.js.map +1 -1
  12. package/dist/atomic/components/atomic-stencil-facet-date-input.js +3 -3
  13. package/dist/atomic/components/components/commerce/atomic-commerce-search-box/atomic-commerce-search-box.js +4 -4
  14. package/dist/atomic/components/components/common/generated-answer/render-feedback-and-copy-buttons.js +4 -3
  15. package/dist/atomic/components/components/insight/atomic-insight-generated-answer/atomic-insight-generated-answer.js +444 -0
  16. package/dist/atomic/components/components/insight/atomic-insight-generated-answer/atomic-insight-generated-answer.tw.css.js +2 -0
  17. package/dist/atomic/components/components/insight/atomic-insight-result-attach-to-case-action/atomic-insight-result-attach-to-case-action.js +122 -0
  18. package/dist/atomic/components/components/insight/atomic-insight-result-children/atomic-insight-result-children.js +4 -4
  19. package/dist/atomic/components/components/insight/index.js +2 -0
  20. package/dist/atomic/components/components/insight/lazy-index.js +2 -0
  21. package/dist/atomic/components/components/ipx/atomic-ipx-button/atomic-ipx-button.js +1 -1
  22. package/dist/atomic/components/components/ipx/atomic-ipx-recs-list/atomic-ipx-recs-list.js +483 -0
  23. package/dist/atomic/components/components/ipx/atomic-ipx-refine-modal/atomic-ipx-refine-modal.js +202 -0
  24. package/dist/atomic/components/components/ipx/atomic-ipx-refine-toggle/atomic-ipx-refine-toggle.js +123 -0
  25. package/dist/atomic/components/components/ipx/index.js +3 -0
  26. package/dist/atomic/components/components/ipx/lazy-index.js +3 -0
  27. package/dist/atomic/components/components/recommendations/atomic-recs-result/atomic-recs-result.js +1 -0
  28. package/dist/atomic/components/components/search/atomic-generated-answer/atomic-generated-answer.js +7 -1
  29. package/dist/atomic/components/components/search/atomic-refine-modal/atomic-refine-modal.js +2 -1
  30. package/dist/atomic/components/components/search/atomic-search-box/atomic-search-box.js +4 -4
  31. package/dist/atomic/components/global/environment.js +1 -1
  32. package/dist/atomic/components/index.js.map +1 -1
  33. package/dist/atomic/components/props-utils.js +1402 -2
  34. package/dist/atomic/components/props-utils.js.map +1 -1
  35. package/dist/atomic/components/utils/custom-element-tags.js +7 -0
  36. package/dist/atomic/components/utils/tailwind.global.tw.css.js +4 -4
  37. package/dist/atomic/index.esm.js +1 -1
  38. package/dist/atomic/p-1df0744f.entry.js +9 -0
  39. package/dist/atomic/p-1df0744f.entry.js.map +1 -0
  40. package/dist/atomic/{p-4a32511f.js → p-2045a1b1.js} +2 -2
  41. package/dist/atomic/p-500bf5c4.entry.js +2 -0
  42. package/dist/atomic/{p-4117289b.entry.js.map → p-500bf5c4.entry.js.map} +1 -1
  43. package/dist/atomic/p-5226a938.js +3 -0
  44. package/dist/atomic/p-5226a938.js.map +1 -0
  45. package/dist/atomic/{p-b4cfedf1.js → p-720863c3.js} +2 -2
  46. package/dist/atomic/p-81336626.entry.js +2 -0
  47. package/dist/atomic/p-81336626.entry.js.map +1 -0
  48. package/dist/atomic/p-aad3b4ec.js +3 -0
  49. package/dist/atomic/p-aad3b4ec.js.map +1 -0
  50. package/dist/atomic/{p-0698ccf1.entry.js → p-b5af331b.entry.js} +2 -2
  51. package/dist/atomic/{p-677f9c40.js → p-b7209471.js} +2 -2
  52. package/dist/cjs/_index.cjs.js +2 -2
  53. package/dist/cjs/_loader.cjs.js +2 -2
  54. package/dist/cjs/atomic-insight-result-action.cjs.entry.js +22 -9
  55. package/dist/cjs/atomic-insight-result-action.cjs.entry.js.map +1 -1
  56. package/dist/cjs/atomic-insight-result-children-template.cjs.entry.js +6 -7
  57. package/dist/cjs/atomic-insight-result-children-template.cjs.entry.js.map +1 -1
  58. package/dist/cjs/atomic-insight-timeframe-facet.cjs.entry.js +106 -16
  59. package/dist/cjs/atomic-insight-timeframe-facet.cjs.entry.js.map +1 -1
  60. package/dist/cjs/atomic-stencil-facet-date-input.cjs.entry.js +5 -5
  61. package/dist/cjs/atomic.cjs.js +2 -2
  62. package/dist/cjs/{index-3532822e.js → index-122375df.js} +4 -58
  63. package/dist/cjs/index-122375df.js.map +1 -0
  64. package/dist/cjs/{initialization-utils-51a423fe.js → initialization-utils-c2821271.js} +2 -2
  65. package/dist/cjs/{initialization-utils-51a423fe.js.map → initialization-utils-c2821271.js.map} +1 -1
  66. package/dist/cjs/{utils-e845f262.js → props-utils-e4f29f1e.js} +54 -21
  67. package/dist/cjs/props-utils-e4f29f1e.js.map +1 -0
  68. package/dist/cjs/{stencil-button-f39da03e.js → stencil-button-bf22eea4.js} +2 -2
  69. package/dist/cjs/{stencil-button-f39da03e.js.map → stencil-button-bf22eea4.js.map} +1 -1
  70. package/dist/cjs/{stencil-result-template-decorators-1f099c15.js → stencil-result-template-decorators-96954751.js} +2 -2
  71. package/dist/cjs/{stencil-result-template-decorators-1f099c15.js.map → stencil-result-template-decorators-96954751.js.map} +1 -1
  72. package/dist/cjs/version.cjs.js +2 -2
  73. package/dist/esm/_index.js +3 -3
  74. package/dist/esm/_loader.js +3 -3
  75. package/dist/esm/atomic-insight-result-action.entry.js +20 -7
  76. package/dist/esm/atomic-insight-result-action.entry.js.map +1 -1
  77. package/dist/esm/atomic-insight-result-children-template.entry.js +2 -3
  78. package/dist/esm/atomic-insight-result-children-template.entry.js.map +1 -1
  79. package/dist/esm/atomic-insight-timeframe-facet.entry.js +100 -10
  80. package/dist/esm/atomic-insight-timeframe-facet.entry.js.map +1 -1
  81. package/dist/esm/atomic-stencil-facet-date-input.entry.js +5 -5
  82. package/dist/esm/atomic.js +3 -3
  83. package/dist/esm/{index-3eb0b28e.js → index-4d679e44.js} +5 -58
  84. package/dist/{cjs/index-3532822e.js.map → esm/index-4d679e44.js.map} +1 -1
  85. package/dist/esm/{initialization-utils-82d28c63.js → initialization-utils-9ff399ff.js} +2 -2
  86. package/dist/esm/{initialization-utils-82d28c63.js.map → initialization-utils-9ff399ff.js.map} +1 -1
  87. package/dist/esm/{utils-b5bab369.js → props-utils-76043c82.js} +54 -18
  88. package/dist/esm/props-utils-76043c82.js.map +1 -0
  89. package/dist/esm/{stencil-button-c25899df.js → stencil-button-28de709c.js} +2 -2
  90. package/dist/esm/{stencil-button-c25899df.js.map → stencil-button-28de709c.js.map} +1 -1
  91. package/dist/esm/{stencil-result-template-decorators-9cbe1e1c.js → stencil-result-template-decorators-4c2e5132.js} +2 -2
  92. package/dist/esm/{stencil-result-template-decorators-9cbe1e1c.js.map → stencil-result-template-decorators-4c2e5132.js.map} +1 -1
  93. package/dist/esm/version.js +2 -2
  94. package/dist/types/components/common/generated-answer/answerContent/answer-content.d.ts +49 -0
  95. package/dist/types/components/common/generated-answer/generated-answer-thread-item/generated-answer-thread-item.d.ts +49 -0
  96. package/dist/types/components/common/generated-answer/render-feedback-and-copy-buttons.d.ts +8 -2
  97. package/dist/types/components/common/item-list/table-layout.d.ts +1 -1
  98. package/dist/types/components/insight/atomic-insight-generated-answer/atomic-insight-generated-answer.d.ts +54 -35
  99. package/dist/types/components/insight/atomic-insight-generated-answer/atomic-insight-generated-answer.tw.css.d.ts +2 -0
  100. package/dist/types/components/insight/atomic-insight-result-attach-to-case-action/atomic-insight-result-attach-to-case-action.d.ts +25 -20
  101. package/dist/types/components/insight/index.d.ts +2 -0
  102. package/dist/types/components/ipx/atomic-ipx-button/atomic-ipx-button.d.ts +1 -1
  103. package/dist/types/components/ipx/atomic-ipx-recs-list/{atomic-recs-list/atomic-ipx-recs-list.d.ts → atomic-ipx-recs-list.d.ts} +43 -21
  104. package/dist/types/components/ipx/atomic-ipx-refine-modal/atomic-ipx-refine-modal.d.ts +62 -15
  105. package/dist/types/components/ipx/atomic-ipx-refine-toggle/atomic-ipx-refine-toggle.d.ts +26 -11
  106. package/dist/types/components/ipx/index.d.ts +3 -0
  107. package/dist/types/components/recommendations/atomic-recs-result/atomic-recs-result.d.ts +1 -0
  108. package/dist/types/components/search/atomic-refine-modal/atomic-refine-modal.d.ts +4 -3
  109. package/dist/types/components.d.ts +0 -249
  110. package/docs/atomic-docs.json +1 -26
  111. package/package.json +4 -4
  112. package/dist/atomic/components/arrow-top-rounded.js +0 -7
  113. package/dist/atomic/components/arrow-top-rounded.js.map +0 -1
  114. package/dist/atomic/components/atomic-insight-generated-answer.d.ts +0 -11
  115. package/dist/atomic/components/atomic-insight-generated-answer.js +0 -3264
  116. package/dist/atomic/components/atomic-insight-generated-answer.js.map +0 -1
  117. package/dist/atomic/components/atomic-insight-result-attach-to-case-action.d.ts +0 -11
  118. package/dist/atomic/components/atomic-insight-result-attach-to-case-action.js +0 -102
  119. package/dist/atomic/components/atomic-insight-result-attach-to-case-action.js.map +0 -1
  120. package/dist/atomic/components/atomic-ipx-recs-list.d.ts +0 -11
  121. package/dist/atomic/components/atomic-ipx-recs-list.js +0 -631
  122. package/dist/atomic/components/atomic-ipx-recs-list.js.map +0 -1
  123. package/dist/atomic/components/atomic-ipx-refine-modal.d.ts +0 -11
  124. package/dist/atomic/components/atomic-ipx-refine-modal.js +0 -8
  125. package/dist/atomic/components/atomic-ipx-refine-modal.js.map +0 -1
  126. package/dist/atomic/components/atomic-ipx-refine-modal2.js +0 -162
  127. package/dist/atomic/components/atomic-ipx-refine-modal2.js.map +0 -1
  128. package/dist/atomic/components/atomic-ipx-refine-toggle.d.ts +0 -11
  129. package/dist/atomic/components/atomic-ipx-refine-toggle.js +0 -121
  130. package/dist/atomic/components/atomic-ipx-refine-toggle.js.map +0 -1
  131. package/dist/atomic/components/attach.js +0 -115
  132. package/dist/atomic/components/attach.js.map +0 -1
  133. package/dist/atomic/components/components/common/layout/display-options.js +0 -28
  134. package/dist/atomic/components/popover-type.js +0 -12
  135. package/dist/atomic/components/popover-type.js.map +0 -1
  136. package/dist/atomic/components/stencil-heading.js +0 -169
  137. package/dist/atomic/components/stencil-heading.js.map +0 -1
  138. package/dist/atomic/components/stencil-iconButton.js +0 -16
  139. package/dist/atomic/components/stencil-iconButton.js.map +0 -1
  140. package/dist/atomic/components/store.js +0 -13
  141. package/dist/atomic/components/store.js.map +0 -1
  142. package/dist/atomic/components/utils.js +0 -1421
  143. package/dist/atomic/components/utils.js.map +0 -1
  144. package/dist/atomic/p-2c08a419.entry.js +0 -2
  145. package/dist/atomic/p-2c08a419.entry.js.map +0 -1
  146. package/dist/atomic/p-4117289b.entry.js +0 -2
  147. package/dist/atomic/p-52d14165.entry.js +0 -2
  148. package/dist/atomic/p-52d14165.entry.js.map +0 -1
  149. package/dist/atomic/p-578d761c.js +0 -2
  150. package/dist/atomic/p-578d761c.js.map +0 -1
  151. package/dist/atomic/p-64f83898.entry.js +0 -2
  152. package/dist/atomic/p-64f83898.entry.js.map +0 -1
  153. package/dist/atomic/p-70cc18a1.js +0 -2
  154. package/dist/atomic/p-70cc18a1.js.map +0 -1
  155. package/dist/atomic/p-9c5ec170.js +0 -2
  156. package/dist/atomic/p-9c5ec170.js.map +0 -1
  157. package/dist/atomic/p-9dfe5ab1.js +0 -2
  158. package/dist/atomic/p-9dfe5ab1.js.map +0 -1
  159. package/dist/atomic/p-a33748a9.js +0 -2
  160. package/dist/atomic/p-a33748a9.js.map +0 -1
  161. package/dist/atomic/p-b09433bb.js +0 -3
  162. package/dist/atomic/p-b09433bb.js.map +0 -1
  163. package/dist/atomic/p-c8452548.entry.js +0 -2
  164. package/dist/atomic/p-c8452548.entry.js.map +0 -1
  165. package/dist/atomic/p-c95ac794.entry.js +0 -2
  166. package/dist/atomic/p-c95ac794.entry.js.map +0 -1
  167. package/dist/atomic/p-d75a4630.js +0 -2
  168. package/dist/atomic/p-d75a4630.js.map +0 -1
  169. package/dist/atomic/p-d8230482.entry.js +0 -9
  170. package/dist/atomic/p-d8230482.entry.js.map +0 -1
  171. package/dist/atomic/p-e94ba0e1.entry.js +0 -2
  172. package/dist/atomic/p-e94ba0e1.entry.js.map +0 -1
  173. package/dist/atomic/p-ec1c5f46.js +0 -3
  174. package/dist/atomic/p-ec1c5f46.js.map +0 -1
  175. package/dist/atomic/p-f321aab0.js +0 -2
  176. package/dist/atomic/p-f321aab0.js.map +0 -1
  177. package/dist/cjs/arrow-top-rounded-885250ea.js +0 -10
  178. package/dist/cjs/arrow-top-rounded-885250ea.js.map +0 -1
  179. package/dist/cjs/atomic-insight-generated-answer.cjs.entry.js +0 -3238
  180. package/dist/cjs/atomic-insight-generated-answer.cjs.entry.js.map +0 -1
  181. package/dist/cjs/atomic-insight-result-attach-to-case-action.cjs.entry.js +0 -90
  182. package/dist/cjs/atomic-insight-result-attach-to-case-action.cjs.entry.js.map +0 -1
  183. package/dist/cjs/atomic-ipx-recs-list.cjs.entry.js +0 -600
  184. package/dist/cjs/atomic-ipx-recs-list.cjs.entry.js.map +0 -1
  185. package/dist/cjs/atomic-ipx-refine-modal.cjs.entry.js +0 -143
  186. package/dist/cjs/atomic-ipx-refine-modal.cjs.entry.js.map +0 -1
  187. package/dist/cjs/atomic-ipx-refine-toggle.cjs.entry.js +0 -99
  188. package/dist/cjs/atomic-ipx-refine-toggle.cjs.entry.js.map +0 -1
  189. package/dist/cjs/attach-19283bec.js +0 -10
  190. package/dist/cjs/attach-19283bec.js.map +0 -1
  191. package/dist/cjs/popover-type-22f285e1.js +0 -16
  192. package/dist/cjs/popover-type-22f285e1.js.map +0 -1
  193. package/dist/cjs/props-utils-bc5feb04.js +0 -59
  194. package/dist/cjs/props-utils-bc5feb04.js.map +0 -1
  195. package/dist/cjs/stencil-heading-ecec9ab3.js +0 -174
  196. package/dist/cjs/stencil-heading-ecec9ab3.js.map +0 -1
  197. package/dist/cjs/stencil-iconButton-f8b9fda0.js +0 -18
  198. package/dist/cjs/stencil-iconButton-f8b9fda0.js.map +0 -1
  199. package/dist/cjs/store-70fff5e6.js +0 -16
  200. package/dist/cjs/store-70fff5e6.js.map +0 -1
  201. package/dist/cjs/utils-e845f262.js.map +0 -1
  202. package/dist/esm/arrow-top-rounded-745b84a6.js +0 -7
  203. package/dist/esm/arrow-top-rounded-745b84a6.js.map +0 -1
  204. package/dist/esm/atomic-insight-generated-answer.entry.js +0 -3234
  205. package/dist/esm/atomic-insight-generated-answer.entry.js.map +0 -1
  206. package/dist/esm/atomic-insight-result-attach-to-case-action.entry.js +0 -86
  207. package/dist/esm/atomic-insight-result-attach-to-case-action.entry.js.map +0 -1
  208. package/dist/esm/atomic-ipx-recs-list.entry.js +0 -596
  209. package/dist/esm/atomic-ipx-recs-list.entry.js.map +0 -1
  210. package/dist/esm/atomic-ipx-refine-modal.entry.js +0 -139
  211. package/dist/esm/atomic-ipx-refine-modal.entry.js.map +0 -1
  212. package/dist/esm/atomic-ipx-refine-toggle.entry.js +0 -95
  213. package/dist/esm/atomic-ipx-refine-toggle.entry.js.map +0 -1
  214. package/dist/esm/attach-81bb8872.js +0 -8
  215. package/dist/esm/attach-81bb8872.js.map +0 -1
  216. package/dist/esm/index-3eb0b28e.js.map +0 -1
  217. package/dist/esm/popover-type-c85677ef.js +0 -12
  218. package/dist/esm/popover-type-c85677ef.js.map +0 -1
  219. package/dist/esm/props-utils-d343133b.js +0 -57
  220. package/dist/esm/props-utils-d343133b.js.map +0 -1
  221. package/dist/esm/stencil-heading-98a5f23f.js +0 -169
  222. package/dist/esm/stencil-heading-98a5f23f.js.map +0 -1
  223. package/dist/esm/stencil-iconButton-ed5804d3.js +0 -16
  224. package/dist/esm/stencil-iconButton-ed5804d3.js.map +0 -1
  225. package/dist/esm/store-50d170c8.js +0 -13
  226. package/dist/esm/store-50d170c8.js.map +0 -1
  227. package/dist/esm/utils-b5bab369.js.map +0 -1
  228. /package/dist/atomic/{p-4a32511f.js.map → p-2045a1b1.js.map} +0 -0
  229. /package/dist/atomic/{p-b4cfedf1.js.map → p-720863c3.js.map} +0 -0
  230. /package/dist/atomic/{p-0698ccf1.entry.js.map → p-b5af331b.entry.js.map} +0 -0
  231. /package/dist/atomic/{p-677f9c40.js.map → p-b7209471.js.map} +0 -0
@@ -1,3264 +0,0 @@
1
- import { h, proxyCustomElement, HTMLElement } from '@stencil/core/internal/client';
2
- import { buildInteractiveCitation, buildGeneratedAnswer, buildSearchStatus } from '@coveo/headless/insight';
3
- import { I as InitializeBindings, B as BindStateToController } from './initialization-utils.js';
4
- import { H as Heading, A as AriaLiveRegion } from './stencil-heading.js';
5
- import { B as Button } from './stencil-button.js';
6
- import { D as DOMPurify } from './utils.js';
7
- import { c as commonjsGlobal } from './_commonjsHelpers.js';
8
- import { A as ArrowBottomIcon, a as ArrowTopIcon } from './arrow-top-rounded.js';
9
-
10
- function debounce(execute, wait) {
11
- let timer;
12
- return (...args) => {
13
- clearTimeout(timer);
14
- return new Promise((resolve) => {
15
- timer = setTimeout(() => resolve(execute(...args)), wait);
16
- });
17
- };
18
- }
19
-
20
- var StorageItems;
21
- (function (StorageItems) {
22
- StorageItems["RECENT_QUERIES"] = "coveo-recent-queries";
23
- StorageItems["STANDALONE_SEARCH_BOX_DATA"] = "coveo-standalone-search-box-data";
24
- StorageItems["GENERATED_ANSWER_DATA"] = "coveo-generated-answer-data";
25
- })(StorageItems || (StorageItems = {}));
26
- class SafeStorage {
27
- clear() {
28
- return this.tryAccessLocalStorageOrWarn(() => localStorage.clear(), () => { });
29
- }
30
- getItem(key) {
31
- return this.tryAccessLocalStorageOrWarn(() => localStorage.getItem(key), () => null);
32
- }
33
- getParsedJSON(key, fallback) {
34
- const item = this.getItem(key);
35
- if (!item) {
36
- return fallback;
37
- }
38
- return this.tryJSONOrWarn(key, () => JSON.parse(item), () => fallback);
39
- }
40
- key(index) {
41
- return this.tryAccessLocalStorageOrWarn(() => localStorage.key(index), () => null);
42
- }
43
- get length() {
44
- return this.tryOrElse(() => localStorage.length, () => 0);
45
- }
46
- removeItem(key) {
47
- return this.tryAccessLocalStorageOrWarn(() => localStorage.removeItem(key), () => { });
48
- }
49
- setItem(key, value) {
50
- return this.tryAccessLocalStorageOrWarn(() => localStorage.setItem(key, value), () => { });
51
- }
52
- setJSON(key, obj) {
53
- const stringified = this.tryJSONOrWarn(key, () => JSON.stringify(obj), () => JSON.stringify({}));
54
- return this.setItem(key, stringified);
55
- }
56
- tryAccessLocalStorageOrWarn(tryTo, orElse) {
57
- return this.tryOrElse(tryTo, () => {
58
- console.warn('Error while trying to read or modify local storage. This can be caused by browser specific settings.');
59
- return orElse();
60
- });
61
- }
62
- tryJSONOrWarn(key, tryTo, orElse) {
63
- return this.tryOrElse(tryTo, () => {
64
- console.warn(`Error while trying to do JSON manipulation with local storage entry. ${key}`);
65
- return orElse();
66
- });
67
- }
68
- tryOrElse(tryTo, orElse) {
69
- try {
70
- return tryTo();
71
- }
72
- catch (e) {
73
- console.warn(e);
74
- return orElse();
75
- }
76
- }
77
- }
78
-
79
- function hasLightDOMSlotContent(element) {
80
- return ('slotContent' in element &&
81
- typeof element.slotContent === 'object');
82
- }
83
- function getNamedSlotContent(host, slotName) {
84
- if (hasLightDOMSlotContent(host)) {
85
- const targetLightDomSlotContent = host.slotContent[slotName];
86
- return (targetLightDomSlotContent?.filter((node) => node instanceof Element) || []);
87
- }
88
- const children = Array.from(host.children);
89
- return children.filter((child) => child.getAttribute('slot') === slotName);
90
- }
91
-
92
- const CopyIcon = `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
93
- <rect x="1.5" y="1.50024" width="9" height="10" rx="1.5" stroke="currentColor"/>
94
- <path d="M3.5 8.50024H8.5" stroke="currentColor" stroke-linecap="round"/>
95
- <path d="M3.5 4.50024L8.5 4.50024" stroke="currentColor" stroke-linecap="round"/>
96
- <path d="M3.5 6.50024L8.5 6.50024" stroke="currentColor" stroke-linecap="round"/>
97
- <path d="M4.5 14.5002L11.5 14.5002C12.6046 14.5002 13.5 13.6048 13.5 12.5002L13.5 5.50024" stroke="currentColor" stroke-linecap="round"/>
98
- </svg>
99
- `;
100
-
101
- /**
102
- * @deprecated should only be used for Stencil components.
103
- */
104
- const CopyButton = (props) => {
105
- return (h(Button, { title: props.title, part: "copy-button", style: 'text-transparent', class: `rounded-md p-2 ${props.isCopied ? 'copied' : ''} ${props.error ? 'error' : ''}`, onClick: props.onClick },
106
- h("div", { class: "icon-container text-neutral-dark" },
107
- h("atomic-icon", { class: "w-5", icon: CopyIcon }))));
108
- };
109
-
110
- /**
111
- * @deprecated should only be used for Stencil components.
112
- */
113
- const Switch = (props) => {
114
- const attributes = {
115
- onClick: () => props.onToggle?.(!props.checked),
116
- 'arial-label': props.ariaLabel,
117
- 'aria-checked': String(!!props.checked),
118
- part: props.part,
119
- tabIndex: props.tabIndex,
120
- title: props.title,
121
- };
122
- const containerClasses = [
123
- 'w-12',
124
- 'h-6',
125
- 'p-1',
126
- 'rounded-full',
127
- props.checked ? 'bg-primary' : 'bg-neutral',
128
- ].join(' ');
129
- const handleClasses = [
130
- 'w-4',
131
- 'h-4',
132
- 'rounded-full',
133
- 'bg-white',
134
- props.checked ? 'ml-6' : '',
135
- ].join(' ');
136
- const buttonClasses = [
137
- 'rounded-full',
138
- 'btn-outline-neutral',
139
- props.withToggle ? 'flex' : 'hidden',
140
- ].join(' ');
141
- return (h("button", { role: "switch", ...attributes, class: buttonClasses },
142
- h("div", { class: containerClasses },
143
- h("div", { class: handleClasses }))));
144
- };
145
-
146
- const Thumbs = `<svg
147
- width="14"
148
- height="14"
149
- viewBox="0 0 14 14"
150
- fill="none"
151
- version="1.1"
152
- xmlns="http://www.w3.org/2000/svg"
153
- xmlns:svg="http://www.w3.org/2000/svg">
154
- <path
155
- class="line"
156
- d="m 11.00003,8.49978 h 0.5 c 0.55229,0 1,0.44771 1,1 v 0 c 0,0.55228 -0.44771,1 -1,1 L 10,10.49996 h 1 c 0.55228,0 0.99999,0.44771 1,1 v 0 c 0,0.55228 -0.44772,1 -1,1 H 9.5 l -3.52786,-6e-5 c -0.31049,0 -0.61672,-0.07229 -0.89443,-0.21115 L 3.5,11.4999 m 0,-6.5 c 0,-0.2761 -0.2239,-0.5 -0.5,-0.5 H 1 c -0.2761,0 -0.5,0.2239 -0.5,0.5 v 7 c 0,0.27614 0.2239,0.5 0.5,0.5 h 2 c 0.2761,0 0.5,-0.22386 0.5,-0.5 v -0.5 -6.5 h 0.9415 c 0.3471,10e-6 0.6694,-0.18 0.85145,-0.4755 L 6.48493,2.5895 C 6.49482,2.5735 6.50005,2.555 6.50005,2.5361 L 6.50004,1.477 C 6.50004,0.9374 6.93748,0.5 7.47709,0.5 v 0 c 0.32669,0 0.63296,0.165 0.81417,0.4368 v 0 C 8.7432,1.6147 8.91025,2.4487 8.75047,3.2476 L 8.5000098,4.498621 12.5,4.497321 c 0,0 1,-0.07687 1,0.9999998 0,0.983123 -1,1 -1,1 l -2.460584,0.00258 h 2 c 0.55228,0 1,0.44772 1,1 v 0 c 0,0.55228 -0.44772,1 -1,1 h -2"
157
- stroke="currentColor"
158
- stroke-linecap="round"
159
- stroke-linejoin="round"
160
- id="path1" />
161
- </svg>
162
- `;
163
-
164
- /**
165
- * @deprecated should only be used for Stencil components.
166
- */
167
- const FeedbackButton = (props) => {
168
- return (h(Button, { title: props.title, style: "text-transparent", part: "feedback-button", class: `feedback-button rounded-md p-2 ${props.variant} ${props.active ? 'active' : ''}`, onClick: props.onClick, ariaPressed: `${props.active}` },
169
- h("atomic-icon", { class: "w-5", icon: Thumbs })));
170
- };
171
-
172
- var marked_umd = {exports: {}};
173
-
174
- /**
175
- * marked v12.0.2 - a markdown parser
176
- * Copyright (c) 2011-2024, Christopher Jeffrey. (MIT Licensed)
177
- * https://github.com/markedjs/marked
178
- */
179
-
180
- (function (module, exports) {
181
- /**
182
- * DO NOT EDIT THIS FILE
183
- * The code in this file is generated from files in ./src/
184
- */
185
-
186
- (function (global, factory) {
187
- factory(exports) ;
188
- })(commonjsGlobal, (function (exports) {
189
- /**
190
- * Gets the original marked default options.
191
- */
192
- function _getDefaults() {
193
- return {
194
- async: false,
195
- breaks: false,
196
- extensions: null,
197
- gfm: true,
198
- hooks: null,
199
- pedantic: false,
200
- renderer: null,
201
- silent: false,
202
- tokenizer: null,
203
- walkTokens: null
204
- };
205
- }
206
- exports.defaults = _getDefaults();
207
- function changeDefaults(newDefaults) {
208
- exports.defaults = newDefaults;
209
- }
210
-
211
- /**
212
- * Helpers
213
- */
214
- const escapeTest = /[&<>"']/;
215
- const escapeReplace = new RegExp(escapeTest.source, 'g');
216
- const escapeTestNoEncode = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/;
217
- const escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g');
218
- const escapeReplacements = {
219
- '&': '&amp;',
220
- '<': '&lt;',
221
- '>': '&gt;',
222
- '"': '&quot;',
223
- "'": '&#39;'
224
- };
225
- const getEscapeReplacement = (ch) => escapeReplacements[ch];
226
- function escape$1(html, encode) {
227
- if (encode) {
228
- if (escapeTest.test(html)) {
229
- return html.replace(escapeReplace, getEscapeReplacement);
230
- }
231
- }
232
- else {
233
- if (escapeTestNoEncode.test(html)) {
234
- return html.replace(escapeReplaceNoEncode, getEscapeReplacement);
235
- }
236
- }
237
- return html;
238
- }
239
- const unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;
240
- function unescape(html) {
241
- // explicitly match decimal, hex, and named HTML entities
242
- return html.replace(unescapeTest, (_, n) => {
243
- n = n.toLowerCase();
244
- if (n === 'colon')
245
- return ':';
246
- if (n.charAt(0) === '#') {
247
- return n.charAt(1) === 'x'
248
- ? String.fromCharCode(parseInt(n.substring(2), 16))
249
- : String.fromCharCode(+n.substring(1));
250
- }
251
- return '';
252
- });
253
- }
254
- const caret = /(^|[^\[])\^/g;
255
- function edit(regex, opt) {
256
- let source = typeof regex === 'string' ? regex : regex.source;
257
- opt = opt || '';
258
- const obj = {
259
- replace: (name, val) => {
260
- let valSource = typeof val === 'string' ? val : val.source;
261
- valSource = valSource.replace(caret, '$1');
262
- source = source.replace(name, valSource);
263
- return obj;
264
- },
265
- getRegex: () => {
266
- return new RegExp(source, opt);
267
- }
268
- };
269
- return obj;
270
- }
271
- function cleanUrl(href) {
272
- try {
273
- href = encodeURI(href).replace(/%25/g, '%');
274
- }
275
- catch (e) {
276
- return null;
277
- }
278
- return href;
279
- }
280
- const noopTest = { exec: () => null };
281
- function splitCells(tableRow, count) {
282
- // ensure that every cell-delimiting pipe has a space
283
- // before it to distinguish it from an escaped pipe
284
- const row = tableRow.replace(/\|/g, (match, offset, str) => {
285
- let escaped = false;
286
- let curr = offset;
287
- while (--curr >= 0 && str[curr] === '\\')
288
- escaped = !escaped;
289
- if (escaped) {
290
- // odd number of slashes means | is escaped
291
- // so we leave it alone
292
- return '|';
293
- }
294
- else {
295
- // add space before unescaped |
296
- return ' |';
297
- }
298
- }), cells = row.split(/ \|/);
299
- let i = 0;
300
- // First/last cell in a row cannot be empty if it has no leading/trailing pipe
301
- if (!cells[0].trim()) {
302
- cells.shift();
303
- }
304
- if (cells.length > 0 && !cells[cells.length - 1].trim()) {
305
- cells.pop();
306
- }
307
- if (count) {
308
- if (cells.length > count) {
309
- cells.splice(count);
310
- }
311
- else {
312
- while (cells.length < count)
313
- cells.push('');
314
- }
315
- }
316
- for (; i < cells.length; i++) {
317
- // leading or trailing whitespace is ignored per the gfm spec
318
- cells[i] = cells[i].trim().replace(/\\\|/g, '|');
319
- }
320
- return cells;
321
- }
322
- /**
323
- * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
324
- * /c*$/ is vulnerable to REDOS.
325
- *
326
- * @param str
327
- * @param c
328
- * @param invert Remove suffix of non-c chars instead. Default falsey.
329
- */
330
- function rtrim(str, c, invert) {
331
- const l = str.length;
332
- if (l === 0) {
333
- return '';
334
- }
335
- // Length of suffix matching the invert condition.
336
- let suffLen = 0;
337
- // Step left until we fail to match the invert condition.
338
- while (suffLen < l) {
339
- const currChar = str.charAt(l - suffLen - 1);
340
- if (currChar === c && !invert) {
341
- suffLen++;
342
- }
343
- else if (currChar !== c && invert) {
344
- suffLen++;
345
- }
346
- else {
347
- break;
348
- }
349
- }
350
- return str.slice(0, l - suffLen);
351
- }
352
- function findClosingBracket(str, b) {
353
- if (str.indexOf(b[1]) === -1) {
354
- return -1;
355
- }
356
- let level = 0;
357
- for (let i = 0; i < str.length; i++) {
358
- if (str[i] === '\\') {
359
- i++;
360
- }
361
- else if (str[i] === b[0]) {
362
- level++;
363
- }
364
- else if (str[i] === b[1]) {
365
- level--;
366
- if (level < 0) {
367
- return i;
368
- }
369
- }
370
- }
371
- return -1;
372
- }
373
-
374
- function outputLink(cap, link, raw, lexer) {
375
- const href = link.href;
376
- const title = link.title ? escape$1(link.title) : null;
377
- const text = cap[1].replace(/\\([\[\]])/g, '$1');
378
- if (cap[0].charAt(0) !== '!') {
379
- lexer.state.inLink = true;
380
- const token = {
381
- type: 'link',
382
- raw,
383
- href,
384
- title,
385
- text,
386
- tokens: lexer.inlineTokens(text)
387
- };
388
- lexer.state.inLink = false;
389
- return token;
390
- }
391
- return {
392
- type: 'image',
393
- raw,
394
- href,
395
- title,
396
- text: escape$1(text)
397
- };
398
- }
399
- function indentCodeCompensation(raw, text) {
400
- const matchIndentToCode = raw.match(/^(\s+)(?:```)/);
401
- if (matchIndentToCode === null) {
402
- return text;
403
- }
404
- const indentToCode = matchIndentToCode[1];
405
- return text
406
- .split('\n')
407
- .map(node => {
408
- const matchIndentInNode = node.match(/^\s+/);
409
- if (matchIndentInNode === null) {
410
- return node;
411
- }
412
- const [indentInNode] = matchIndentInNode;
413
- if (indentInNode.length >= indentToCode.length) {
414
- return node.slice(indentToCode.length);
415
- }
416
- return node;
417
- })
418
- .join('\n');
419
- }
420
- /**
421
- * Tokenizer
422
- */
423
- class _Tokenizer {
424
- options;
425
- rules; // set by the lexer
426
- lexer; // set by the lexer
427
- constructor(options) {
428
- this.options = options || exports.defaults;
429
- }
430
- space(src) {
431
- const cap = this.rules.block.newline.exec(src);
432
- if (cap && cap[0].length > 0) {
433
- return {
434
- type: 'space',
435
- raw: cap[0]
436
- };
437
- }
438
- }
439
- code(src) {
440
- const cap = this.rules.block.code.exec(src);
441
- if (cap) {
442
- const text = cap[0].replace(/^ {1,4}/gm, '');
443
- return {
444
- type: 'code',
445
- raw: cap[0],
446
- codeBlockStyle: 'indented',
447
- text: !this.options.pedantic
448
- ? rtrim(text, '\n')
449
- : text
450
- };
451
- }
452
- }
453
- fences(src) {
454
- const cap = this.rules.block.fences.exec(src);
455
- if (cap) {
456
- const raw = cap[0];
457
- const text = indentCodeCompensation(raw, cap[3] || '');
458
- return {
459
- type: 'code',
460
- raw,
461
- lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, '$1') : cap[2],
462
- text
463
- };
464
- }
465
- }
466
- heading(src) {
467
- const cap = this.rules.block.heading.exec(src);
468
- if (cap) {
469
- let text = cap[2].trim();
470
- // remove trailing #s
471
- if (/#$/.test(text)) {
472
- const trimmed = rtrim(text, '#');
473
- if (this.options.pedantic) {
474
- text = trimmed.trim();
475
- }
476
- else if (!trimmed || / $/.test(trimmed)) {
477
- // CommonMark requires space before trailing #s
478
- text = trimmed.trim();
479
- }
480
- }
481
- return {
482
- type: 'heading',
483
- raw: cap[0],
484
- depth: cap[1].length,
485
- text,
486
- tokens: this.lexer.inline(text)
487
- };
488
- }
489
- }
490
- hr(src) {
491
- const cap = this.rules.block.hr.exec(src);
492
- if (cap) {
493
- return {
494
- type: 'hr',
495
- raw: cap[0]
496
- };
497
- }
498
- }
499
- blockquote(src) {
500
- const cap = this.rules.block.blockquote.exec(src);
501
- if (cap) {
502
- // precede setext continuation with 4 spaces so it isn't a setext
503
- let text = cap[0].replace(/\n {0,3}((?:=+|-+) *)(?=\n|$)/g, '\n $1');
504
- text = rtrim(text.replace(/^ *>[ \t]?/gm, ''), '\n');
505
- const top = this.lexer.state.top;
506
- this.lexer.state.top = true;
507
- const tokens = this.lexer.blockTokens(text);
508
- this.lexer.state.top = top;
509
- return {
510
- type: 'blockquote',
511
- raw: cap[0],
512
- tokens,
513
- text
514
- };
515
- }
516
- }
517
- list(src) {
518
- let cap = this.rules.block.list.exec(src);
519
- if (cap) {
520
- let bull = cap[1].trim();
521
- const isordered = bull.length > 1;
522
- const list = {
523
- type: 'list',
524
- raw: '',
525
- ordered: isordered,
526
- start: isordered ? +bull.slice(0, -1) : '',
527
- loose: false,
528
- items: []
529
- };
530
- bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`;
531
- if (this.options.pedantic) {
532
- bull = isordered ? bull : '[*+-]';
533
- }
534
- // Get next list item
535
- const itemRegex = new RegExp(`^( {0,3}${bull})((?:[\t ][^\\n]*)?(?:\\n|$))`);
536
- let raw = '';
537
- let itemContents = '';
538
- let endsWithBlankLine = false;
539
- // Check if current bullet point can start a new List Item
540
- while (src) {
541
- let endEarly = false;
542
- if (!(cap = itemRegex.exec(src))) {
543
- break;
544
- }
545
- if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)
546
- break;
547
- }
548
- raw = cap[0];
549
- src = src.substring(raw.length);
550
- let line = cap[2].split('\n', 1)[0].replace(/^\t+/, (t) => ' '.repeat(3 * t.length));
551
- let nextLine = src.split('\n', 1)[0];
552
- let indent = 0;
553
- if (this.options.pedantic) {
554
- indent = 2;
555
- itemContents = line.trimStart();
556
- }
557
- else {
558
- indent = cap[2].search(/[^ ]/); // Find first non-space char
559
- indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent
560
- itemContents = line.slice(indent);
561
- indent += cap[1].length;
562
- }
563
- let blankLine = false;
564
- if (!line && /^ *$/.test(nextLine)) { // Items begin with at most one blank line
565
- raw += nextLine + '\n';
566
- src = src.substring(nextLine.length + 1);
567
- endEarly = true;
568
- }
569
- if (!endEarly) {
570
- const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`);
571
- const hrRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`);
572
- const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\`\`\`|~~~)`);
573
- const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`);
574
- // Check if following lines should be included in List Item
575
- while (src) {
576
- const rawLine = src.split('\n', 1)[0];
577
- nextLine = rawLine;
578
- // Re-align to follow commonmark nesting rules
579
- if (this.options.pedantic) {
580
- nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, ' ');
581
- }
582
- // End list item if found code fences
583
- if (fencesBeginRegex.test(nextLine)) {
584
- break;
585
- }
586
- // End list item if found start of new heading
587
- if (headingBeginRegex.test(nextLine)) {
588
- break;
589
- }
590
- // End list item if found start of new bullet
591
- if (nextBulletRegex.test(nextLine)) {
592
- break;
593
- }
594
- // Horizontal rule found
595
- if (hrRegex.test(src)) {
596
- break;
597
- }
598
- if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) { // Dedent if possible
599
- itemContents += '\n' + nextLine.slice(indent);
600
- }
601
- else {
602
- // not enough indentation
603
- if (blankLine) {
604
- break;
605
- }
606
- // paragraph continuation unless last line was a different block level element
607
- if (line.search(/[^ ]/) >= 4) { // indented code block
608
- break;
609
- }
610
- if (fencesBeginRegex.test(line)) {
611
- break;
612
- }
613
- if (headingBeginRegex.test(line)) {
614
- break;
615
- }
616
- if (hrRegex.test(line)) {
617
- break;
618
- }
619
- itemContents += '\n' + nextLine;
620
- }
621
- if (!blankLine && !nextLine.trim()) { // Check if current line is blank
622
- blankLine = true;
623
- }
624
- raw += rawLine + '\n';
625
- src = src.substring(rawLine.length + 1);
626
- line = nextLine.slice(indent);
627
- }
628
- }
629
- if (!list.loose) {
630
- // If the previous item ended with a blank line, the list is loose
631
- if (endsWithBlankLine) {
632
- list.loose = true;
633
- }
634
- else if (/\n *\n *$/.test(raw)) {
635
- endsWithBlankLine = true;
636
- }
637
- }
638
- let istask = null;
639
- let ischecked;
640
- // Check for task list items
641
- if (this.options.gfm) {
642
- istask = /^\[[ xX]\] /.exec(itemContents);
643
- if (istask) {
644
- ischecked = istask[0] !== '[ ] ';
645
- itemContents = itemContents.replace(/^\[[ xX]\] +/, '');
646
- }
647
- }
648
- list.items.push({
649
- type: 'list_item',
650
- raw,
651
- task: !!istask,
652
- checked: ischecked,
653
- loose: false,
654
- text: itemContents,
655
- tokens: []
656
- });
657
- list.raw += raw;
658
- }
659
- // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic
660
- list.items[list.items.length - 1].raw = raw.trimEnd();
661
- (list.items[list.items.length - 1]).text = itemContents.trimEnd();
662
- list.raw = list.raw.trimEnd();
663
- // Item child tokens handled here at end because we needed to have the final item to trim it first
664
- for (let i = 0; i < list.items.length; i++) {
665
- this.lexer.state.top = false;
666
- list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);
667
- if (!list.loose) {
668
- // Check if list should be loose
669
- const spacers = list.items[i].tokens.filter(t => t.type === 'space');
670
- const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => /\n.*\n/.test(t.raw));
671
- list.loose = hasMultipleLineBreaks;
672
- }
673
- }
674
- // Set all items to loose if list is loose
675
- if (list.loose) {
676
- for (let i = 0; i < list.items.length; i++) {
677
- list.items[i].loose = true;
678
- }
679
- }
680
- return list;
681
- }
682
- }
683
- html(src) {
684
- const cap = this.rules.block.html.exec(src);
685
- if (cap) {
686
- const token = {
687
- type: 'html',
688
- block: true,
689
- raw: cap[0],
690
- pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',
691
- text: cap[0]
692
- };
693
- return token;
694
- }
695
- }
696
- def(src) {
697
- const cap = this.rules.block.def.exec(src);
698
- if (cap) {
699
- const tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
700
- const href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline.anyPunctuation, '$1') : '';
701
- const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, '$1') : cap[3];
702
- return {
703
- type: 'def',
704
- tag,
705
- raw: cap[0],
706
- href,
707
- title
708
- };
709
- }
710
- }
711
- table(src) {
712
- const cap = this.rules.block.table.exec(src);
713
- if (!cap) {
714
- return;
715
- }
716
- if (!/[:|]/.test(cap[2])) {
717
- // delimiter row must have a pipe (|) or colon (:) otherwise it is a setext heading
718
- return;
719
- }
720
- const headers = splitCells(cap[1]);
721
- const aligns = cap[2].replace(/^\||\| *$/g, '').split('|');
722
- const rows = cap[3] && cap[3].trim() ? cap[3].replace(/\n[ \t]*$/, '').split('\n') : [];
723
- const item = {
724
- type: 'table',
725
- raw: cap[0],
726
- header: [],
727
- align: [],
728
- rows: []
729
- };
730
- if (headers.length !== aligns.length) {
731
- // header and align columns must be equal, rows can be different.
732
- return;
733
- }
734
- for (const align of aligns) {
735
- if (/^ *-+: *$/.test(align)) {
736
- item.align.push('right');
737
- }
738
- else if (/^ *:-+: *$/.test(align)) {
739
- item.align.push('center');
740
- }
741
- else if (/^ *:-+ *$/.test(align)) {
742
- item.align.push('left');
743
- }
744
- else {
745
- item.align.push(null);
746
- }
747
- }
748
- for (const header of headers) {
749
- item.header.push({
750
- text: header,
751
- tokens: this.lexer.inline(header)
752
- });
753
- }
754
- for (const row of rows) {
755
- item.rows.push(splitCells(row, item.header.length).map(cell => {
756
- return {
757
- text: cell,
758
- tokens: this.lexer.inline(cell)
759
- };
760
- }));
761
- }
762
- return item;
763
- }
764
- lheading(src) {
765
- const cap = this.rules.block.lheading.exec(src);
766
- if (cap) {
767
- return {
768
- type: 'heading',
769
- raw: cap[0],
770
- depth: cap[2].charAt(0) === '=' ? 1 : 2,
771
- text: cap[1],
772
- tokens: this.lexer.inline(cap[1])
773
- };
774
- }
775
- }
776
- paragraph(src) {
777
- const cap = this.rules.block.paragraph.exec(src);
778
- if (cap) {
779
- const text = cap[1].charAt(cap[1].length - 1) === '\n'
780
- ? cap[1].slice(0, -1)
781
- : cap[1];
782
- return {
783
- type: 'paragraph',
784
- raw: cap[0],
785
- text,
786
- tokens: this.lexer.inline(text)
787
- };
788
- }
789
- }
790
- text(src) {
791
- const cap = this.rules.block.text.exec(src);
792
- if (cap) {
793
- return {
794
- type: 'text',
795
- raw: cap[0],
796
- text: cap[0],
797
- tokens: this.lexer.inline(cap[0])
798
- };
799
- }
800
- }
801
- escape(src) {
802
- const cap = this.rules.inline.escape.exec(src);
803
- if (cap) {
804
- return {
805
- type: 'escape',
806
- raw: cap[0],
807
- text: escape$1(cap[1])
808
- };
809
- }
810
- }
811
- tag(src) {
812
- const cap = this.rules.inline.tag.exec(src);
813
- if (cap) {
814
- if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {
815
- this.lexer.state.inLink = true;
816
- }
817
- else if (this.lexer.state.inLink && /^<\/a>/i.test(cap[0])) {
818
- this.lexer.state.inLink = false;
819
- }
820
- if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
821
- this.lexer.state.inRawBlock = true;
822
- }
823
- else if (this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
824
- this.lexer.state.inRawBlock = false;
825
- }
826
- return {
827
- type: 'html',
828
- raw: cap[0],
829
- inLink: this.lexer.state.inLink,
830
- inRawBlock: this.lexer.state.inRawBlock,
831
- block: false,
832
- text: cap[0]
833
- };
834
- }
835
- }
836
- link(src) {
837
- const cap = this.rules.inline.link.exec(src);
838
- if (cap) {
839
- const trimmedUrl = cap[2].trim();
840
- if (!this.options.pedantic && /^</.test(trimmedUrl)) {
841
- // commonmark requires matching angle brackets
842
- if (!(/>$/.test(trimmedUrl))) {
843
- return;
844
- }
845
- // ending angle bracket cannot be escaped
846
- const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\');
847
- if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {
848
- return;
849
- }
850
- }
851
- else {
852
- // find closing parenthesis
853
- const lastParenIndex = findClosingBracket(cap[2], '()');
854
- if (lastParenIndex > -1) {
855
- const start = cap[0].indexOf('!') === 0 ? 5 : 4;
856
- const linkLen = start + cap[1].length + lastParenIndex;
857
- cap[2] = cap[2].substring(0, lastParenIndex);
858
- cap[0] = cap[0].substring(0, linkLen).trim();
859
- cap[3] = '';
860
- }
861
- }
862
- let href = cap[2];
863
- let title = '';
864
- if (this.options.pedantic) {
865
- // split pedantic href and title
866
- const link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
867
- if (link) {
868
- href = link[1];
869
- title = link[3];
870
- }
871
- }
872
- else {
873
- title = cap[3] ? cap[3].slice(1, -1) : '';
874
- }
875
- href = href.trim();
876
- if (/^</.test(href)) {
877
- if (this.options.pedantic && !(/>$/.test(trimmedUrl))) {
878
- // pedantic allows starting angle bracket without ending angle bracket
879
- href = href.slice(1);
880
- }
881
- else {
882
- href = href.slice(1, -1);
883
- }
884
- }
885
- return outputLink(cap, {
886
- href: href ? href.replace(this.rules.inline.anyPunctuation, '$1') : href,
887
- title: title ? title.replace(this.rules.inline.anyPunctuation, '$1') : title
888
- }, cap[0], this.lexer);
889
- }
890
- }
891
- reflink(src, links) {
892
- let cap;
893
- if ((cap = this.rules.inline.reflink.exec(src))
894
- || (cap = this.rules.inline.nolink.exec(src))) {
895
- const linkString = (cap[2] || cap[1]).replace(/\s+/g, ' ');
896
- const link = links[linkString.toLowerCase()];
897
- if (!link) {
898
- const text = cap[0].charAt(0);
899
- return {
900
- type: 'text',
901
- raw: text,
902
- text
903
- };
904
- }
905
- return outputLink(cap, link, cap[0], this.lexer);
906
- }
907
- }
908
- emStrong(src, maskedSrc, prevChar = '') {
909
- let match = this.rules.inline.emStrongLDelim.exec(src);
910
- if (!match)
911
- return;
912
- // _ can't be between two alphanumerics. \p{L}\p{N} includes non-english alphabet/numbers as well
913
- if (match[3] && prevChar.match(/[\p{L}\p{N}]/u))
914
- return;
915
- const nextChar = match[1] || match[2] || '';
916
- if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {
917
- // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below)
918
- const lLength = [...match[0]].length - 1;
919
- let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;
920
- const endReg = match[0][0] === '*' ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;
921
- endReg.lastIndex = 0;
922
- // Clip maskedSrc to same section of string as src (move to lexer?)
923
- maskedSrc = maskedSrc.slice(-1 * src.length + lLength);
924
- while ((match = endReg.exec(maskedSrc)) != null) {
925
- rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];
926
- if (!rDelim)
927
- continue; // skip single * in __abc*abc__
928
- rLength = [...rDelim].length;
929
- if (match[3] || match[4]) { // found another Left Delim
930
- delimTotal += rLength;
931
- continue;
932
- }
933
- else if (match[5] || match[6]) { // either Left or Right Delim
934
- if (lLength % 3 && !((lLength + rLength) % 3)) {
935
- midDelimTotal += rLength;
936
- continue; // CommonMark Emphasis Rules 9-10
937
- }
938
- }
939
- delimTotal -= rLength;
940
- if (delimTotal > 0)
941
- continue; // Haven't found enough closing delimiters
942
- // Remove extra characters. *a*** -> *a*
943
- rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);
944
- // char length can be >1 for unicode characters;
945
- const lastCharLength = [...match[0]][0].length;
946
- const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);
947
- // Create `em` if smallest delimiter has odd char count. *a***
948
- if (Math.min(lLength, rLength) % 2) {
949
- const text = raw.slice(1, -1);
950
- return {
951
- type: 'em',
952
- raw,
953
- text,
954
- tokens: this.lexer.inlineTokens(text)
955
- };
956
- }
957
- // Create 'strong' if smallest delimiter has even char count. **a***
958
- const text = raw.slice(2, -2);
959
- return {
960
- type: 'strong',
961
- raw,
962
- text,
963
- tokens: this.lexer.inlineTokens(text)
964
- };
965
- }
966
- }
967
- }
968
- codespan(src) {
969
- const cap = this.rules.inline.code.exec(src);
970
- if (cap) {
971
- let text = cap[2].replace(/\n/g, ' ');
972
- const hasNonSpaceChars = /[^ ]/.test(text);
973
- const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);
974
- if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {
975
- text = text.substring(1, text.length - 1);
976
- }
977
- text = escape$1(text, true);
978
- return {
979
- type: 'codespan',
980
- raw: cap[0],
981
- text
982
- };
983
- }
984
- }
985
- br(src) {
986
- const cap = this.rules.inline.br.exec(src);
987
- if (cap) {
988
- return {
989
- type: 'br',
990
- raw: cap[0]
991
- };
992
- }
993
- }
994
- del(src) {
995
- const cap = this.rules.inline.del.exec(src);
996
- if (cap) {
997
- return {
998
- type: 'del',
999
- raw: cap[0],
1000
- text: cap[2],
1001
- tokens: this.lexer.inlineTokens(cap[2])
1002
- };
1003
- }
1004
- }
1005
- autolink(src) {
1006
- const cap = this.rules.inline.autolink.exec(src);
1007
- if (cap) {
1008
- let text, href;
1009
- if (cap[2] === '@') {
1010
- text = escape$1(cap[1]);
1011
- href = 'mailto:' + text;
1012
- }
1013
- else {
1014
- text = escape$1(cap[1]);
1015
- href = text;
1016
- }
1017
- return {
1018
- type: 'link',
1019
- raw: cap[0],
1020
- text,
1021
- href,
1022
- tokens: [
1023
- {
1024
- type: 'text',
1025
- raw: text,
1026
- text
1027
- }
1028
- ]
1029
- };
1030
- }
1031
- }
1032
- url(src) {
1033
- let cap;
1034
- if (cap = this.rules.inline.url.exec(src)) {
1035
- let text, href;
1036
- if (cap[2] === '@') {
1037
- text = escape$1(cap[0]);
1038
- href = 'mailto:' + text;
1039
- }
1040
- else {
1041
- // do extended autolink path validation
1042
- let prevCapZero;
1043
- do {
1044
- prevCapZero = cap[0];
1045
- cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? '';
1046
- } while (prevCapZero !== cap[0]);
1047
- text = escape$1(cap[0]);
1048
- if (cap[1] === 'www.') {
1049
- href = 'http://' + cap[0];
1050
- }
1051
- else {
1052
- href = cap[0];
1053
- }
1054
- }
1055
- return {
1056
- type: 'link',
1057
- raw: cap[0],
1058
- text,
1059
- href,
1060
- tokens: [
1061
- {
1062
- type: 'text',
1063
- raw: text,
1064
- text
1065
- }
1066
- ]
1067
- };
1068
- }
1069
- }
1070
- inlineText(src) {
1071
- const cap = this.rules.inline.text.exec(src);
1072
- if (cap) {
1073
- let text;
1074
- if (this.lexer.state.inRawBlock) {
1075
- text = cap[0];
1076
- }
1077
- else {
1078
- text = escape$1(cap[0]);
1079
- }
1080
- return {
1081
- type: 'text',
1082
- raw: cap[0],
1083
- text
1084
- };
1085
- }
1086
- }
1087
- }
1088
-
1089
- /**
1090
- * Block-Level Grammar
1091
- */
1092
- const newline = /^(?: *(?:\n|$))+/;
1093
- const blockCode = /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/;
1094
- const fences = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/;
1095
- const hr = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/;
1096
- const heading = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/;
1097
- const bullet = /(?:[*+-]|\d{1,9}[.)])/;
1098
- const lheading = edit(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html))+?)\n {0,3}(=+|-+) *(?:\n+|$)/)
1099
- .replace(/bull/g, bullet) // lists can interrupt
1100
- .replace(/blockCode/g, / {4}/) // indented code blocks can interrupt
1101
- .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt
1102
- .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt
1103
- .replace(/heading/g, / {0,3}#{1,6}/) // ATX heading can interrupt
1104
- .replace(/html/g, / {0,3}<[^\n>]+>\n/) // block html can interrupt
1105
- .getRegex();
1106
- const _paragraph = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/;
1107
- const blockText = /^[^\n]+/;
1108
- const _blockLabel = /(?!\s*\])(?:\\.|[^\[\]\\])+/;
1109
- const def = edit(/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/)
1110
- .replace('label', _blockLabel)
1111
- .replace('title', /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/)
1112
- .getRegex();
1113
- const list = edit(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/)
1114
- .replace(/bull/g, bullet)
1115
- .getRegex();
1116
- const _tag = 'address|article|aside|base|basefont|blockquote|body|caption'
1117
- + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
1118
- + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
1119
- + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
1120
- + '|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title'
1121
- + '|tr|track|ul';
1122
- const _comment = /<!--(?:-?>|[\s\S]*?(?:-->|$))/;
1123
- const html = edit('^ {0,3}(?:' // optional indentation
1124
- + '<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
1125
- + '|comment[^\\n]*(\\n+|$)' // (2)
1126
- + '|<\\?[\\s\\S]*?(?:\\?>\\n*|$)' // (3)
1127
- + '|<![A-Z][\\s\\S]*?(?:>\\n*|$)' // (4)
1128
- + '|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)' // (5)
1129
- + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (6)
1130
- + '|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) open tag
1131
- + '|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) closing tag
1132
- + ')', 'i')
1133
- .replace('comment', _comment)
1134
- .replace('tag', _tag)
1135
- .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
1136
- .getRegex();
1137
- const paragraph = edit(_paragraph)
1138
- .replace('hr', hr)
1139
- .replace('heading', ' {0,3}#{1,6}(?:\\s|$)')
1140
- .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs
1141
- .replace('|table', '')
1142
- .replace('blockquote', ' {0,3}>')
1143
- .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n')
1144
- .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
1145
- .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)')
1146
- .replace('tag', _tag) // pars can be interrupted by type (6) html blocks
1147
- .getRegex();
1148
- const blockquote = edit(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/)
1149
- .replace('paragraph', paragraph)
1150
- .getRegex();
1151
- /**
1152
- * Normal Block Grammar
1153
- */
1154
- const blockNormal = {
1155
- blockquote,
1156
- code: blockCode,
1157
- def,
1158
- fences,
1159
- heading,
1160
- hr,
1161
- html,
1162
- lheading,
1163
- list,
1164
- newline,
1165
- paragraph,
1166
- table: noopTest,
1167
- text: blockText
1168
- };
1169
- /**
1170
- * GFM Block Grammar
1171
- */
1172
- const gfmTable = edit('^ *([^\\n ].*)\\n' // Header
1173
- + ' {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)' // Align
1174
- + '(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)') // Cells
1175
- .replace('hr', hr)
1176
- .replace('heading', ' {0,3}#{1,6}(?:\\s|$)')
1177
- .replace('blockquote', ' {0,3}>')
1178
- .replace('code', ' {4}[^\\n]')
1179
- .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n')
1180
- .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
1181
- .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)')
1182
- .replace('tag', _tag) // tables can be interrupted by type (6) html blocks
1183
- .getRegex();
1184
- const blockGfm = {
1185
- ...blockNormal,
1186
- table: gfmTable,
1187
- paragraph: edit(_paragraph)
1188
- .replace('hr', hr)
1189
- .replace('heading', ' {0,3}#{1,6}(?:\\s|$)')
1190
- .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs
1191
- .replace('table', gfmTable) // interrupt paragraphs with table
1192
- .replace('blockquote', ' {0,3}>')
1193
- .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n')
1194
- .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
1195
- .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)')
1196
- .replace('tag', _tag) // pars can be interrupted by type (6) html blocks
1197
- .getRegex()
1198
- };
1199
- /**
1200
- * Pedantic grammar (original John Gruber's loose markdown specification)
1201
- */
1202
- const blockPedantic = {
1203
- ...blockNormal,
1204
- html: edit('^ *(?:comment *(?:\\n|\\s*$)'
1205
- + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
1206
- + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
1207
- .replace('comment', _comment)
1208
- .replace(/tag/g, '(?!(?:'
1209
- + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
1210
- + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
1211
- + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
1212
- .getRegex(),
1213
- def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
1214
- heading: /^(#{1,6})(.*)(?:\n+|$)/,
1215
- fences: noopTest, // fences not supported
1216
- lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
1217
- paragraph: edit(_paragraph)
1218
- .replace('hr', hr)
1219
- .replace('heading', ' *#{1,6} *[^\n]')
1220
- .replace('lheading', lheading)
1221
- .replace('|table', '')
1222
- .replace('blockquote', ' {0,3}>')
1223
- .replace('|fences', '')
1224
- .replace('|list', '')
1225
- .replace('|html', '')
1226
- .replace('|tag', '')
1227
- .getRegex()
1228
- };
1229
- /**
1230
- * Inline-Level Grammar
1231
- */
1232
- const escape = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/;
1233
- const inlineCode = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/;
1234
- const br = /^( {2,}|\\)\n(?!\s*$)/;
1235
- const inlineText = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/;
1236
- // list of unicode punctuation marks, plus any missing characters from CommonMark spec
1237
- const _punctuation = '\\p{P}\\p{S}';
1238
- const punctuation = edit(/^((?![*_])[\spunctuation])/, 'u')
1239
- .replace(/punctuation/g, _punctuation).getRegex();
1240
- // sequences em should skip over [title](link), `code`, <html>
1241
- const blockSkip = /\[[^[\]]*?\]\([^\(\)]*?\)|`[^`]*?`|<[^<>]*?>/g;
1242
- const emStrongLDelim = edit(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/, 'u')
1243
- .replace(/punct/g, _punctuation)
1244
- .getRegex();
1245
- const emStrongRDelimAst = edit('^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)' // Skip orphan inside strong
1246
- + '|[^*]+(?=[^*])' // Consume to delim
1247
- + '|(?!\\*)[punct](\\*+)(?=[\\s]|$)' // (1) #*** can only be a Right Delimiter
1248
- + '|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)' // (2) a***#, a*** can only be a Right Delimiter
1249
- + '|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])' // (3) #***a, ***a can only be Left Delimiter
1250
- + '|[\\s](\\*+)(?!\\*)(?=[punct])' // (4) ***# can only be Left Delimiter
1251
- + '|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])' // (5) #***# can be either Left or Right Delimiter
1252
- + '|[^punct\\s](\\*+)(?=[^punct\\s])', 'gu') // (6) a***a can be either Left or Right Delimiter
1253
- .replace(/punct/g, _punctuation)
1254
- .getRegex();
1255
- // (6) Not allowed for _
1256
- const emStrongRDelimUnd = edit('^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)' // Skip orphan inside strong
1257
- + '|[^_]+(?=[^_])' // Consume to delim
1258
- + '|(?!_)[punct](_+)(?=[\\s]|$)' // (1) #___ can only be a Right Delimiter
1259
- + '|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)' // (2) a___#, a___ can only be a Right Delimiter
1260
- + '|(?!_)[punct\\s](_+)(?=[^punct\\s])' // (3) #___a, ___a can only be Left Delimiter
1261
- + '|[\\s](_+)(?!_)(?=[punct])' // (4) ___# can only be Left Delimiter
1262
- + '|(?!_)[punct](_+)(?!_)(?=[punct])', 'gu') // (5) #___# can be either Left or Right Delimiter
1263
- .replace(/punct/g, _punctuation)
1264
- .getRegex();
1265
- const anyPunctuation = edit(/\\([punct])/, 'gu')
1266
- .replace(/punct/g, _punctuation)
1267
- .getRegex();
1268
- const autolink = edit(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/)
1269
- .replace('scheme', /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/)
1270
- .replace('email', /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/)
1271
- .getRegex();
1272
- const _inlineComment = edit(_comment).replace('(?:-->|$)', '-->').getRegex();
1273
- const tag = edit('^comment'
1274
- + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
1275
- + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
1276
- + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
1277
- + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
1278
- + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>') // CDATA section
1279
- .replace('comment', _inlineComment)
1280
- .replace('attribute', /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/)
1281
- .getRegex();
1282
- const _inlineLabel = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
1283
- const link = edit(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/)
1284
- .replace('label', _inlineLabel)
1285
- .replace('href', /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/)
1286
- .replace('title', /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/)
1287
- .getRegex();
1288
- const reflink = edit(/^!?\[(label)\]\[(ref)\]/)
1289
- .replace('label', _inlineLabel)
1290
- .replace('ref', _blockLabel)
1291
- .getRegex();
1292
- const nolink = edit(/^!?\[(ref)\](?:\[\])?/)
1293
- .replace('ref', _blockLabel)
1294
- .getRegex();
1295
- const reflinkSearch = edit('reflink|nolink(?!\\()', 'g')
1296
- .replace('reflink', reflink)
1297
- .replace('nolink', nolink)
1298
- .getRegex();
1299
- /**
1300
- * Normal Inline Grammar
1301
- */
1302
- const inlineNormal = {
1303
- _backpedal: noopTest, // only used for GFM url
1304
- anyPunctuation,
1305
- autolink,
1306
- blockSkip,
1307
- br,
1308
- code: inlineCode,
1309
- del: noopTest,
1310
- emStrongLDelim,
1311
- emStrongRDelimAst,
1312
- emStrongRDelimUnd,
1313
- escape,
1314
- link,
1315
- nolink,
1316
- punctuation,
1317
- reflink,
1318
- reflinkSearch,
1319
- tag,
1320
- text: inlineText,
1321
- url: noopTest
1322
- };
1323
- /**
1324
- * Pedantic Inline Grammar
1325
- */
1326
- const inlinePedantic = {
1327
- ...inlineNormal,
1328
- link: edit(/^!?\[(label)\]\((.*?)\)/)
1329
- .replace('label', _inlineLabel)
1330
- .getRegex(),
1331
- reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
1332
- .replace('label', _inlineLabel)
1333
- .getRegex()
1334
- };
1335
- /**
1336
- * GFM Inline Grammar
1337
- */
1338
- const inlineGfm = {
1339
- ...inlineNormal,
1340
- escape: edit(escape).replace('])', '~|])').getRegex(),
1341
- url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, 'i')
1342
- .replace('email', /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/)
1343
- .getRegex(),
1344
- _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,
1345
- del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,
1346
- text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/
1347
- };
1348
- /**
1349
- * GFM + Line Breaks Inline Grammar
1350
- */
1351
- const inlineBreaks = {
1352
- ...inlineGfm,
1353
- br: edit(br).replace('{2,}', '*').getRegex(),
1354
- text: edit(inlineGfm.text)
1355
- .replace('\\b_', '\\b_| {2,}\\n')
1356
- .replace(/\{2,\}/g, '*')
1357
- .getRegex()
1358
- };
1359
- /**
1360
- * exports
1361
- */
1362
- const block = {
1363
- normal: blockNormal,
1364
- gfm: blockGfm,
1365
- pedantic: blockPedantic
1366
- };
1367
- const inline = {
1368
- normal: inlineNormal,
1369
- gfm: inlineGfm,
1370
- breaks: inlineBreaks,
1371
- pedantic: inlinePedantic
1372
- };
1373
-
1374
- /**
1375
- * Block Lexer
1376
- */
1377
- class _Lexer {
1378
- tokens;
1379
- options;
1380
- state;
1381
- tokenizer;
1382
- inlineQueue;
1383
- constructor(options) {
1384
- // TokenList cannot be created in one go
1385
- this.tokens = [];
1386
- this.tokens.links = Object.create(null);
1387
- this.options = options || exports.defaults;
1388
- this.options.tokenizer = this.options.tokenizer || new _Tokenizer();
1389
- this.tokenizer = this.options.tokenizer;
1390
- this.tokenizer.options = this.options;
1391
- this.tokenizer.lexer = this;
1392
- this.inlineQueue = [];
1393
- this.state = {
1394
- inLink: false,
1395
- inRawBlock: false,
1396
- top: true
1397
- };
1398
- const rules = {
1399
- block: block.normal,
1400
- inline: inline.normal
1401
- };
1402
- if (this.options.pedantic) {
1403
- rules.block = block.pedantic;
1404
- rules.inline = inline.pedantic;
1405
- }
1406
- else if (this.options.gfm) {
1407
- rules.block = block.gfm;
1408
- if (this.options.breaks) {
1409
- rules.inline = inline.breaks;
1410
- }
1411
- else {
1412
- rules.inline = inline.gfm;
1413
- }
1414
- }
1415
- this.tokenizer.rules = rules;
1416
- }
1417
- /**
1418
- * Expose Rules
1419
- */
1420
- static get rules() {
1421
- return {
1422
- block,
1423
- inline
1424
- };
1425
- }
1426
- /**
1427
- * Static Lex Method
1428
- */
1429
- static lex(src, options) {
1430
- const lexer = new _Lexer(options);
1431
- return lexer.lex(src);
1432
- }
1433
- /**
1434
- * Static Lex Inline Method
1435
- */
1436
- static lexInline(src, options) {
1437
- const lexer = new _Lexer(options);
1438
- return lexer.inlineTokens(src);
1439
- }
1440
- /**
1441
- * Preprocessing
1442
- */
1443
- lex(src) {
1444
- src = src
1445
- .replace(/\r\n|\r/g, '\n');
1446
- this.blockTokens(src, this.tokens);
1447
- for (let i = 0; i < this.inlineQueue.length; i++) {
1448
- const next = this.inlineQueue[i];
1449
- this.inlineTokens(next.src, next.tokens);
1450
- }
1451
- this.inlineQueue = [];
1452
- return this.tokens;
1453
- }
1454
- blockTokens(src, tokens = []) {
1455
- if (this.options.pedantic) {
1456
- src = src.replace(/\t/g, ' ').replace(/^ +$/gm, '');
1457
- }
1458
- else {
1459
- src = src.replace(/^( *)(\t+)/gm, (_, leading, tabs) => {
1460
- return leading + ' '.repeat(tabs.length);
1461
- });
1462
- }
1463
- let token;
1464
- let lastToken;
1465
- let cutSrc;
1466
- let lastParagraphClipped;
1467
- while (src) {
1468
- if (this.options.extensions
1469
- && this.options.extensions.block
1470
- && this.options.extensions.block.some((extTokenizer) => {
1471
- if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
1472
- src = src.substring(token.raw.length);
1473
- tokens.push(token);
1474
- return true;
1475
- }
1476
- return false;
1477
- })) {
1478
- continue;
1479
- }
1480
- // newline
1481
- if (token = this.tokenizer.space(src)) {
1482
- src = src.substring(token.raw.length);
1483
- if (token.raw.length === 1 && tokens.length > 0) {
1484
- // if there's a single \n as a spacer, it's terminating the last line,
1485
- // so move it there so that we don't get unnecessary paragraph tags
1486
- tokens[tokens.length - 1].raw += '\n';
1487
- }
1488
- else {
1489
- tokens.push(token);
1490
- }
1491
- continue;
1492
- }
1493
- // code
1494
- if (token = this.tokenizer.code(src)) {
1495
- src = src.substring(token.raw.length);
1496
- lastToken = tokens[tokens.length - 1];
1497
- // An indented code block cannot interrupt a paragraph.
1498
- if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {
1499
- lastToken.raw += '\n' + token.raw;
1500
- lastToken.text += '\n' + token.text;
1501
- this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
1502
- }
1503
- else {
1504
- tokens.push(token);
1505
- }
1506
- continue;
1507
- }
1508
- // fences
1509
- if (token = this.tokenizer.fences(src)) {
1510
- src = src.substring(token.raw.length);
1511
- tokens.push(token);
1512
- continue;
1513
- }
1514
- // heading
1515
- if (token = this.tokenizer.heading(src)) {
1516
- src = src.substring(token.raw.length);
1517
- tokens.push(token);
1518
- continue;
1519
- }
1520
- // hr
1521
- if (token = this.tokenizer.hr(src)) {
1522
- src = src.substring(token.raw.length);
1523
- tokens.push(token);
1524
- continue;
1525
- }
1526
- // blockquote
1527
- if (token = this.tokenizer.blockquote(src)) {
1528
- src = src.substring(token.raw.length);
1529
- tokens.push(token);
1530
- continue;
1531
- }
1532
- // list
1533
- if (token = this.tokenizer.list(src)) {
1534
- src = src.substring(token.raw.length);
1535
- tokens.push(token);
1536
- continue;
1537
- }
1538
- // html
1539
- if (token = this.tokenizer.html(src)) {
1540
- src = src.substring(token.raw.length);
1541
- tokens.push(token);
1542
- continue;
1543
- }
1544
- // def
1545
- if (token = this.tokenizer.def(src)) {
1546
- src = src.substring(token.raw.length);
1547
- lastToken = tokens[tokens.length - 1];
1548
- if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {
1549
- lastToken.raw += '\n' + token.raw;
1550
- lastToken.text += '\n' + token.raw;
1551
- this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
1552
- }
1553
- else if (!this.tokens.links[token.tag]) {
1554
- this.tokens.links[token.tag] = {
1555
- href: token.href,
1556
- title: token.title
1557
- };
1558
- }
1559
- continue;
1560
- }
1561
- // table (gfm)
1562
- if (token = this.tokenizer.table(src)) {
1563
- src = src.substring(token.raw.length);
1564
- tokens.push(token);
1565
- continue;
1566
- }
1567
- // lheading
1568
- if (token = this.tokenizer.lheading(src)) {
1569
- src = src.substring(token.raw.length);
1570
- tokens.push(token);
1571
- continue;
1572
- }
1573
- // top-level paragraph
1574
- // prevent paragraph consuming extensions by clipping 'src' to extension start
1575
- cutSrc = src;
1576
- if (this.options.extensions && this.options.extensions.startBlock) {
1577
- let startIndex = Infinity;
1578
- const tempSrc = src.slice(1);
1579
- let tempStart;
1580
- this.options.extensions.startBlock.forEach((getStartIndex) => {
1581
- tempStart = getStartIndex.call({ lexer: this }, tempSrc);
1582
- if (typeof tempStart === 'number' && tempStart >= 0) {
1583
- startIndex = Math.min(startIndex, tempStart);
1584
- }
1585
- });
1586
- if (startIndex < Infinity && startIndex >= 0) {
1587
- cutSrc = src.substring(0, startIndex + 1);
1588
- }
1589
- }
1590
- if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {
1591
- lastToken = tokens[tokens.length - 1];
1592
- if (lastParagraphClipped && lastToken.type === 'paragraph') {
1593
- lastToken.raw += '\n' + token.raw;
1594
- lastToken.text += '\n' + token.text;
1595
- this.inlineQueue.pop();
1596
- this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
1597
- }
1598
- else {
1599
- tokens.push(token);
1600
- }
1601
- lastParagraphClipped = (cutSrc.length !== src.length);
1602
- src = src.substring(token.raw.length);
1603
- continue;
1604
- }
1605
- // text
1606
- if (token = this.tokenizer.text(src)) {
1607
- src = src.substring(token.raw.length);
1608
- lastToken = tokens[tokens.length - 1];
1609
- if (lastToken && lastToken.type === 'text') {
1610
- lastToken.raw += '\n' + token.raw;
1611
- lastToken.text += '\n' + token.text;
1612
- this.inlineQueue.pop();
1613
- this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
1614
- }
1615
- else {
1616
- tokens.push(token);
1617
- }
1618
- continue;
1619
- }
1620
- if (src) {
1621
- const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);
1622
- if (this.options.silent) {
1623
- console.error(errMsg);
1624
- break;
1625
- }
1626
- else {
1627
- throw new Error(errMsg);
1628
- }
1629
- }
1630
- }
1631
- this.state.top = true;
1632
- return tokens;
1633
- }
1634
- inline(src, tokens = []) {
1635
- this.inlineQueue.push({ src, tokens });
1636
- return tokens;
1637
- }
1638
- /**
1639
- * Lexing/Compiling
1640
- */
1641
- inlineTokens(src, tokens = []) {
1642
- let token, lastToken, cutSrc;
1643
- // String with links masked to avoid interference with em and strong
1644
- let maskedSrc = src;
1645
- let match;
1646
- let keepPrevChar, prevChar;
1647
- // Mask out reflinks
1648
- if (this.tokens.links) {
1649
- const links = Object.keys(this.tokens.links);
1650
- if (links.length > 0) {
1651
- while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {
1652
- if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {
1653
- maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);
1654
- }
1655
- }
1656
- }
1657
- }
1658
- // Mask out other blocks
1659
- while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {
1660
- maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
1661
- }
1662
- // Mask out escaped characters
1663
- while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {
1664
- maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);
1665
- }
1666
- while (src) {
1667
- if (!keepPrevChar) {
1668
- prevChar = '';
1669
- }
1670
- keepPrevChar = false;
1671
- // extensions
1672
- if (this.options.extensions
1673
- && this.options.extensions.inline
1674
- && this.options.extensions.inline.some((extTokenizer) => {
1675
- if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
1676
- src = src.substring(token.raw.length);
1677
- tokens.push(token);
1678
- return true;
1679
- }
1680
- return false;
1681
- })) {
1682
- continue;
1683
- }
1684
- // escape
1685
- if (token = this.tokenizer.escape(src)) {
1686
- src = src.substring(token.raw.length);
1687
- tokens.push(token);
1688
- continue;
1689
- }
1690
- // tag
1691
- if (token = this.tokenizer.tag(src)) {
1692
- src = src.substring(token.raw.length);
1693
- lastToken = tokens[tokens.length - 1];
1694
- if (lastToken && token.type === 'text' && lastToken.type === 'text') {
1695
- lastToken.raw += token.raw;
1696
- lastToken.text += token.text;
1697
- }
1698
- else {
1699
- tokens.push(token);
1700
- }
1701
- continue;
1702
- }
1703
- // link
1704
- if (token = this.tokenizer.link(src)) {
1705
- src = src.substring(token.raw.length);
1706
- tokens.push(token);
1707
- continue;
1708
- }
1709
- // reflink, nolink
1710
- if (token = this.tokenizer.reflink(src, this.tokens.links)) {
1711
- src = src.substring(token.raw.length);
1712
- lastToken = tokens[tokens.length - 1];
1713
- if (lastToken && token.type === 'text' && lastToken.type === 'text') {
1714
- lastToken.raw += token.raw;
1715
- lastToken.text += token.text;
1716
- }
1717
- else {
1718
- tokens.push(token);
1719
- }
1720
- continue;
1721
- }
1722
- // em & strong
1723
- if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {
1724
- src = src.substring(token.raw.length);
1725
- tokens.push(token);
1726
- continue;
1727
- }
1728
- // code
1729
- if (token = this.tokenizer.codespan(src)) {
1730
- src = src.substring(token.raw.length);
1731
- tokens.push(token);
1732
- continue;
1733
- }
1734
- // br
1735
- if (token = this.tokenizer.br(src)) {
1736
- src = src.substring(token.raw.length);
1737
- tokens.push(token);
1738
- continue;
1739
- }
1740
- // del (gfm)
1741
- if (token = this.tokenizer.del(src)) {
1742
- src = src.substring(token.raw.length);
1743
- tokens.push(token);
1744
- continue;
1745
- }
1746
- // autolink
1747
- if (token = this.tokenizer.autolink(src)) {
1748
- src = src.substring(token.raw.length);
1749
- tokens.push(token);
1750
- continue;
1751
- }
1752
- // url (gfm)
1753
- if (!this.state.inLink && (token = this.tokenizer.url(src))) {
1754
- src = src.substring(token.raw.length);
1755
- tokens.push(token);
1756
- continue;
1757
- }
1758
- // text
1759
- // prevent inlineText consuming extensions by clipping 'src' to extension start
1760
- cutSrc = src;
1761
- if (this.options.extensions && this.options.extensions.startInline) {
1762
- let startIndex = Infinity;
1763
- const tempSrc = src.slice(1);
1764
- let tempStart;
1765
- this.options.extensions.startInline.forEach((getStartIndex) => {
1766
- tempStart = getStartIndex.call({ lexer: this }, tempSrc);
1767
- if (typeof tempStart === 'number' && tempStart >= 0) {
1768
- startIndex = Math.min(startIndex, tempStart);
1769
- }
1770
- });
1771
- if (startIndex < Infinity && startIndex >= 0) {
1772
- cutSrc = src.substring(0, startIndex + 1);
1773
- }
1774
- }
1775
- if (token = this.tokenizer.inlineText(cutSrc)) {
1776
- src = src.substring(token.raw.length);
1777
- if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started
1778
- prevChar = token.raw.slice(-1);
1779
- }
1780
- keepPrevChar = true;
1781
- lastToken = tokens[tokens.length - 1];
1782
- if (lastToken && lastToken.type === 'text') {
1783
- lastToken.raw += token.raw;
1784
- lastToken.text += token.text;
1785
- }
1786
- else {
1787
- tokens.push(token);
1788
- }
1789
- continue;
1790
- }
1791
- if (src) {
1792
- const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);
1793
- if (this.options.silent) {
1794
- console.error(errMsg);
1795
- break;
1796
- }
1797
- else {
1798
- throw new Error(errMsg);
1799
- }
1800
- }
1801
- }
1802
- return tokens;
1803
- }
1804
- }
1805
-
1806
- /**
1807
- * Renderer
1808
- */
1809
- class _Renderer {
1810
- options;
1811
- constructor(options) {
1812
- this.options = options || exports.defaults;
1813
- }
1814
- code(code, infostring, escaped) {
1815
- const lang = (infostring || '').match(/^\S*/)?.[0];
1816
- code = code.replace(/\n$/, '') + '\n';
1817
- if (!lang) {
1818
- return '<pre><code>'
1819
- + (escaped ? code : escape$1(code, true))
1820
- + '</code></pre>\n';
1821
- }
1822
- return '<pre><code class="language-'
1823
- + escape$1(lang)
1824
- + '">'
1825
- + (escaped ? code : escape$1(code, true))
1826
- + '</code></pre>\n';
1827
- }
1828
- blockquote(quote) {
1829
- return `<blockquote>\n${quote}</blockquote>\n`;
1830
- }
1831
- html(html, block) {
1832
- return html;
1833
- }
1834
- heading(text, level, raw) {
1835
- // ignore IDs
1836
- return `<h${level}>${text}</h${level}>\n`;
1837
- }
1838
- hr() {
1839
- return '<hr>\n';
1840
- }
1841
- list(body, ordered, start) {
1842
- const type = ordered ? 'ol' : 'ul';
1843
- const startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
1844
- return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
1845
- }
1846
- listitem(text, task, checked) {
1847
- return `<li>${text}</li>\n`;
1848
- }
1849
- checkbox(checked) {
1850
- return '<input '
1851
- + (checked ? 'checked="" ' : '')
1852
- + 'disabled="" type="checkbox">';
1853
- }
1854
- paragraph(text) {
1855
- return `<p>${text}</p>\n`;
1856
- }
1857
- table(header, body) {
1858
- if (body)
1859
- body = `<tbody>${body}</tbody>`;
1860
- return '<table>\n'
1861
- + '<thead>\n'
1862
- + header
1863
- + '</thead>\n'
1864
- + body
1865
- + '</table>\n';
1866
- }
1867
- tablerow(content) {
1868
- return `<tr>\n${content}</tr>\n`;
1869
- }
1870
- tablecell(content, flags) {
1871
- const type = flags.header ? 'th' : 'td';
1872
- const tag = flags.align
1873
- ? `<${type} align="${flags.align}">`
1874
- : `<${type}>`;
1875
- return tag + content + `</${type}>\n`;
1876
- }
1877
- /**
1878
- * span level renderer
1879
- */
1880
- strong(text) {
1881
- return `<strong>${text}</strong>`;
1882
- }
1883
- em(text) {
1884
- return `<em>${text}</em>`;
1885
- }
1886
- codespan(text) {
1887
- return `<code>${text}</code>`;
1888
- }
1889
- br() {
1890
- return '<br>';
1891
- }
1892
- del(text) {
1893
- return `<del>${text}</del>`;
1894
- }
1895
- link(href, title, text) {
1896
- const cleanHref = cleanUrl(href);
1897
- if (cleanHref === null) {
1898
- return text;
1899
- }
1900
- href = cleanHref;
1901
- let out = '<a href="' + href + '"';
1902
- if (title) {
1903
- out += ' title="' + title + '"';
1904
- }
1905
- out += '>' + text + '</a>';
1906
- return out;
1907
- }
1908
- image(href, title, text) {
1909
- const cleanHref = cleanUrl(href);
1910
- if (cleanHref === null) {
1911
- return text;
1912
- }
1913
- href = cleanHref;
1914
- let out = `<img src="${href}" alt="${text}"`;
1915
- if (title) {
1916
- out += ` title="${title}"`;
1917
- }
1918
- out += '>';
1919
- return out;
1920
- }
1921
- text(text) {
1922
- return text;
1923
- }
1924
- }
1925
-
1926
- /**
1927
- * TextRenderer
1928
- * returns only the textual part of the token
1929
- */
1930
- class _TextRenderer {
1931
- // no need for block level renderers
1932
- strong(text) {
1933
- return text;
1934
- }
1935
- em(text) {
1936
- return text;
1937
- }
1938
- codespan(text) {
1939
- return text;
1940
- }
1941
- del(text) {
1942
- return text;
1943
- }
1944
- html(text) {
1945
- return text;
1946
- }
1947
- text(text) {
1948
- return text;
1949
- }
1950
- link(href, title, text) {
1951
- return '' + text;
1952
- }
1953
- image(href, title, text) {
1954
- return '' + text;
1955
- }
1956
- br() {
1957
- return '';
1958
- }
1959
- }
1960
-
1961
- /**
1962
- * Parsing & Compiling
1963
- */
1964
- class _Parser {
1965
- options;
1966
- renderer;
1967
- textRenderer;
1968
- constructor(options) {
1969
- this.options = options || exports.defaults;
1970
- this.options.renderer = this.options.renderer || new _Renderer();
1971
- this.renderer = this.options.renderer;
1972
- this.renderer.options = this.options;
1973
- this.textRenderer = new _TextRenderer();
1974
- }
1975
- /**
1976
- * Static Parse Method
1977
- */
1978
- static parse(tokens, options) {
1979
- const parser = new _Parser(options);
1980
- return parser.parse(tokens);
1981
- }
1982
- /**
1983
- * Static Parse Inline Method
1984
- */
1985
- static parseInline(tokens, options) {
1986
- const parser = new _Parser(options);
1987
- return parser.parseInline(tokens);
1988
- }
1989
- /**
1990
- * Parse Loop
1991
- */
1992
- parse(tokens, top = true) {
1993
- let out = '';
1994
- for (let i = 0; i < tokens.length; i++) {
1995
- const token = tokens[i];
1996
- // Run any renderer extensions
1997
- if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
1998
- const genericToken = token;
1999
- const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);
2000
- if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(genericToken.type)) {
2001
- out += ret || '';
2002
- continue;
2003
- }
2004
- }
2005
- switch (token.type) {
2006
- case 'space': {
2007
- continue;
2008
- }
2009
- case 'hr': {
2010
- out += this.renderer.hr();
2011
- continue;
2012
- }
2013
- case 'heading': {
2014
- const headingToken = token;
2015
- out += this.renderer.heading(this.parseInline(headingToken.tokens), headingToken.depth, unescape(this.parseInline(headingToken.tokens, this.textRenderer)));
2016
- continue;
2017
- }
2018
- case 'code': {
2019
- const codeToken = token;
2020
- out += this.renderer.code(codeToken.text, codeToken.lang, !!codeToken.escaped);
2021
- continue;
2022
- }
2023
- case 'table': {
2024
- const tableToken = token;
2025
- let header = '';
2026
- // header
2027
- let cell = '';
2028
- for (let j = 0; j < tableToken.header.length; j++) {
2029
- cell += this.renderer.tablecell(this.parseInline(tableToken.header[j].tokens), { header: true, align: tableToken.align[j] });
2030
- }
2031
- header += this.renderer.tablerow(cell);
2032
- let body = '';
2033
- for (let j = 0; j < tableToken.rows.length; j++) {
2034
- const row = tableToken.rows[j];
2035
- cell = '';
2036
- for (let k = 0; k < row.length; k++) {
2037
- cell += this.renderer.tablecell(this.parseInline(row[k].tokens), { header: false, align: tableToken.align[k] });
2038
- }
2039
- body += this.renderer.tablerow(cell);
2040
- }
2041
- out += this.renderer.table(header, body);
2042
- continue;
2043
- }
2044
- case 'blockquote': {
2045
- const blockquoteToken = token;
2046
- const body = this.parse(blockquoteToken.tokens);
2047
- out += this.renderer.blockquote(body);
2048
- continue;
2049
- }
2050
- case 'list': {
2051
- const listToken = token;
2052
- const ordered = listToken.ordered;
2053
- const start = listToken.start;
2054
- const loose = listToken.loose;
2055
- let body = '';
2056
- for (let j = 0; j < listToken.items.length; j++) {
2057
- const item = listToken.items[j];
2058
- const checked = item.checked;
2059
- const task = item.task;
2060
- let itemBody = '';
2061
- if (item.task) {
2062
- const checkbox = this.renderer.checkbox(!!checked);
2063
- if (loose) {
2064
- if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') {
2065
- item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;
2066
- if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {
2067
- item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;
2068
- }
2069
- }
2070
- else {
2071
- item.tokens.unshift({
2072
- type: 'text',
2073
- text: checkbox + ' '
2074
- });
2075
- }
2076
- }
2077
- else {
2078
- itemBody += checkbox + ' ';
2079
- }
2080
- }
2081
- itemBody += this.parse(item.tokens, loose);
2082
- body += this.renderer.listitem(itemBody, task, !!checked);
2083
- }
2084
- out += this.renderer.list(body, ordered, start);
2085
- continue;
2086
- }
2087
- case 'html': {
2088
- const htmlToken = token;
2089
- out += this.renderer.html(htmlToken.text, htmlToken.block);
2090
- continue;
2091
- }
2092
- case 'paragraph': {
2093
- const paragraphToken = token;
2094
- out += this.renderer.paragraph(this.parseInline(paragraphToken.tokens));
2095
- continue;
2096
- }
2097
- case 'text': {
2098
- let textToken = token;
2099
- let body = textToken.tokens ? this.parseInline(textToken.tokens) : textToken.text;
2100
- while (i + 1 < tokens.length && tokens[i + 1].type === 'text') {
2101
- textToken = tokens[++i];
2102
- body += '\n' + (textToken.tokens ? this.parseInline(textToken.tokens) : textToken.text);
2103
- }
2104
- out += top ? this.renderer.paragraph(body) : body;
2105
- continue;
2106
- }
2107
- default: {
2108
- const errMsg = 'Token with "' + token.type + '" type was not found.';
2109
- if (this.options.silent) {
2110
- console.error(errMsg);
2111
- return '';
2112
- }
2113
- else {
2114
- throw new Error(errMsg);
2115
- }
2116
- }
2117
- }
2118
- }
2119
- return out;
2120
- }
2121
- /**
2122
- * Parse Inline Tokens
2123
- */
2124
- parseInline(tokens, renderer) {
2125
- renderer = renderer || this.renderer;
2126
- let out = '';
2127
- for (let i = 0; i < tokens.length; i++) {
2128
- const token = tokens[i];
2129
- // Run any renderer extensions
2130
- if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
2131
- const ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);
2132
- if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {
2133
- out += ret || '';
2134
- continue;
2135
- }
2136
- }
2137
- switch (token.type) {
2138
- case 'escape': {
2139
- const escapeToken = token;
2140
- out += renderer.text(escapeToken.text);
2141
- break;
2142
- }
2143
- case 'html': {
2144
- const tagToken = token;
2145
- out += renderer.html(tagToken.text);
2146
- break;
2147
- }
2148
- case 'link': {
2149
- const linkToken = token;
2150
- out += renderer.link(linkToken.href, linkToken.title, this.parseInline(linkToken.tokens, renderer));
2151
- break;
2152
- }
2153
- case 'image': {
2154
- const imageToken = token;
2155
- out += renderer.image(imageToken.href, imageToken.title, imageToken.text);
2156
- break;
2157
- }
2158
- case 'strong': {
2159
- const strongToken = token;
2160
- out += renderer.strong(this.parseInline(strongToken.tokens, renderer));
2161
- break;
2162
- }
2163
- case 'em': {
2164
- const emToken = token;
2165
- out += renderer.em(this.parseInline(emToken.tokens, renderer));
2166
- break;
2167
- }
2168
- case 'codespan': {
2169
- const codespanToken = token;
2170
- out += renderer.codespan(codespanToken.text);
2171
- break;
2172
- }
2173
- case 'br': {
2174
- out += renderer.br();
2175
- break;
2176
- }
2177
- case 'del': {
2178
- const delToken = token;
2179
- out += renderer.del(this.parseInline(delToken.tokens, renderer));
2180
- break;
2181
- }
2182
- case 'text': {
2183
- const textToken = token;
2184
- out += renderer.text(textToken.text);
2185
- break;
2186
- }
2187
- default: {
2188
- const errMsg = 'Token with "' + token.type + '" type was not found.';
2189
- if (this.options.silent) {
2190
- console.error(errMsg);
2191
- return '';
2192
- }
2193
- else {
2194
- throw new Error(errMsg);
2195
- }
2196
- }
2197
- }
2198
- }
2199
- return out;
2200
- }
2201
- }
2202
-
2203
- class _Hooks {
2204
- options;
2205
- constructor(options) {
2206
- this.options = options || exports.defaults;
2207
- }
2208
- static passThroughHooks = new Set([
2209
- 'preprocess',
2210
- 'postprocess',
2211
- 'processAllTokens'
2212
- ]);
2213
- /**
2214
- * Process markdown before marked
2215
- */
2216
- preprocess(markdown) {
2217
- return markdown;
2218
- }
2219
- /**
2220
- * Process HTML after marked is finished
2221
- */
2222
- postprocess(html) {
2223
- return html;
2224
- }
2225
- /**
2226
- * Process all tokens before walk tokens
2227
- */
2228
- processAllTokens(tokens) {
2229
- return tokens;
2230
- }
2231
- }
2232
-
2233
- class Marked {
2234
- defaults = _getDefaults();
2235
- options = this.setOptions;
2236
- parse = this.#parseMarkdown(_Lexer.lex, _Parser.parse);
2237
- parseInline = this.#parseMarkdown(_Lexer.lexInline, _Parser.parseInline);
2238
- Parser = _Parser;
2239
- Renderer = _Renderer;
2240
- TextRenderer = _TextRenderer;
2241
- Lexer = _Lexer;
2242
- Tokenizer = _Tokenizer;
2243
- Hooks = _Hooks;
2244
- constructor(...args) {
2245
- this.use(...args);
2246
- }
2247
- /**
2248
- * Run callback for every token
2249
- */
2250
- walkTokens(tokens, callback) {
2251
- let values = [];
2252
- for (const token of tokens) {
2253
- values = values.concat(callback.call(this, token));
2254
- switch (token.type) {
2255
- case 'table': {
2256
- const tableToken = token;
2257
- for (const cell of tableToken.header) {
2258
- values = values.concat(this.walkTokens(cell.tokens, callback));
2259
- }
2260
- for (const row of tableToken.rows) {
2261
- for (const cell of row) {
2262
- values = values.concat(this.walkTokens(cell.tokens, callback));
2263
- }
2264
- }
2265
- break;
2266
- }
2267
- case 'list': {
2268
- const listToken = token;
2269
- values = values.concat(this.walkTokens(listToken.items, callback));
2270
- break;
2271
- }
2272
- default: {
2273
- const genericToken = token;
2274
- if (this.defaults.extensions?.childTokens?.[genericToken.type]) {
2275
- this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {
2276
- const tokens = genericToken[childTokens].flat(Infinity);
2277
- values = values.concat(this.walkTokens(tokens, callback));
2278
- });
2279
- }
2280
- else if (genericToken.tokens) {
2281
- values = values.concat(this.walkTokens(genericToken.tokens, callback));
2282
- }
2283
- }
2284
- }
2285
- }
2286
- return values;
2287
- }
2288
- use(...args) {
2289
- const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} };
2290
- args.forEach((pack) => {
2291
- // copy options to new object
2292
- const opts = { ...pack };
2293
- // set async to true if it was set to true before
2294
- opts.async = this.defaults.async || opts.async || false;
2295
- // ==-- Parse "addon" extensions --== //
2296
- if (pack.extensions) {
2297
- pack.extensions.forEach((ext) => {
2298
- if (!ext.name) {
2299
- throw new Error('extension name required');
2300
- }
2301
- if ('renderer' in ext) { // Renderer extensions
2302
- const prevRenderer = extensions.renderers[ext.name];
2303
- if (prevRenderer) {
2304
- // Replace extension with func to run new extension but fall back if false
2305
- extensions.renderers[ext.name] = function (...args) {
2306
- let ret = ext.renderer.apply(this, args);
2307
- if (ret === false) {
2308
- ret = prevRenderer.apply(this, args);
2309
- }
2310
- return ret;
2311
- };
2312
- }
2313
- else {
2314
- extensions.renderers[ext.name] = ext.renderer;
2315
- }
2316
- }
2317
- if ('tokenizer' in ext) { // Tokenizer Extensions
2318
- if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {
2319
- throw new Error("extension level must be 'block' or 'inline'");
2320
- }
2321
- const extLevel = extensions[ext.level];
2322
- if (extLevel) {
2323
- extLevel.unshift(ext.tokenizer);
2324
- }
2325
- else {
2326
- extensions[ext.level] = [ext.tokenizer];
2327
- }
2328
- if (ext.start) { // Function to check for start of token
2329
- if (ext.level === 'block') {
2330
- if (extensions.startBlock) {
2331
- extensions.startBlock.push(ext.start);
2332
- }
2333
- else {
2334
- extensions.startBlock = [ext.start];
2335
- }
2336
- }
2337
- else if (ext.level === 'inline') {
2338
- if (extensions.startInline) {
2339
- extensions.startInline.push(ext.start);
2340
- }
2341
- else {
2342
- extensions.startInline = [ext.start];
2343
- }
2344
- }
2345
- }
2346
- }
2347
- if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens
2348
- extensions.childTokens[ext.name] = ext.childTokens;
2349
- }
2350
- });
2351
- opts.extensions = extensions;
2352
- }
2353
- // ==-- Parse "overwrite" extensions --== //
2354
- if (pack.renderer) {
2355
- const renderer = this.defaults.renderer || new _Renderer(this.defaults);
2356
- for (const prop in pack.renderer) {
2357
- if (!(prop in renderer)) {
2358
- throw new Error(`renderer '${prop}' does not exist`);
2359
- }
2360
- if (prop === 'options') {
2361
- // ignore options property
2362
- continue;
2363
- }
2364
- const rendererProp = prop;
2365
- const rendererFunc = pack.renderer[rendererProp];
2366
- const prevRenderer = renderer[rendererProp];
2367
- // Replace renderer with func to run extension, but fall back if false
2368
- renderer[rendererProp] = (...args) => {
2369
- let ret = rendererFunc.apply(renderer, args);
2370
- if (ret === false) {
2371
- ret = prevRenderer.apply(renderer, args);
2372
- }
2373
- return ret || '';
2374
- };
2375
- }
2376
- opts.renderer = renderer;
2377
- }
2378
- if (pack.tokenizer) {
2379
- const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults);
2380
- for (const prop in pack.tokenizer) {
2381
- if (!(prop in tokenizer)) {
2382
- throw new Error(`tokenizer '${prop}' does not exist`);
2383
- }
2384
- if (['options', 'rules', 'lexer'].includes(prop)) {
2385
- // ignore options, rules, and lexer properties
2386
- continue;
2387
- }
2388
- const tokenizerProp = prop;
2389
- const tokenizerFunc = pack.tokenizer[tokenizerProp];
2390
- const prevTokenizer = tokenizer[tokenizerProp];
2391
- // Replace tokenizer with func to run extension, but fall back if false
2392
- // @ts-expect-error cannot type tokenizer function dynamically
2393
- tokenizer[tokenizerProp] = (...args) => {
2394
- let ret = tokenizerFunc.apply(tokenizer, args);
2395
- if (ret === false) {
2396
- ret = prevTokenizer.apply(tokenizer, args);
2397
- }
2398
- return ret;
2399
- };
2400
- }
2401
- opts.tokenizer = tokenizer;
2402
- }
2403
- // ==-- Parse Hooks extensions --== //
2404
- if (pack.hooks) {
2405
- const hooks = this.defaults.hooks || new _Hooks();
2406
- for (const prop in pack.hooks) {
2407
- if (!(prop in hooks)) {
2408
- throw new Error(`hook '${prop}' does not exist`);
2409
- }
2410
- if (prop === 'options') {
2411
- // ignore options property
2412
- continue;
2413
- }
2414
- const hooksProp = prop;
2415
- const hooksFunc = pack.hooks[hooksProp];
2416
- const prevHook = hooks[hooksProp];
2417
- if (_Hooks.passThroughHooks.has(prop)) {
2418
- // @ts-expect-error cannot type hook function dynamically
2419
- hooks[hooksProp] = (arg) => {
2420
- if (this.defaults.async) {
2421
- return Promise.resolve(hooksFunc.call(hooks, arg)).then(ret => {
2422
- return prevHook.call(hooks, ret);
2423
- });
2424
- }
2425
- const ret = hooksFunc.call(hooks, arg);
2426
- return prevHook.call(hooks, ret);
2427
- };
2428
- }
2429
- else {
2430
- // @ts-expect-error cannot type hook function dynamically
2431
- hooks[hooksProp] = (...args) => {
2432
- let ret = hooksFunc.apply(hooks, args);
2433
- if (ret === false) {
2434
- ret = prevHook.apply(hooks, args);
2435
- }
2436
- return ret;
2437
- };
2438
- }
2439
- }
2440
- opts.hooks = hooks;
2441
- }
2442
- // ==-- Parse WalkTokens extensions --== //
2443
- if (pack.walkTokens) {
2444
- const walkTokens = this.defaults.walkTokens;
2445
- const packWalktokens = pack.walkTokens;
2446
- opts.walkTokens = function (token) {
2447
- let values = [];
2448
- values.push(packWalktokens.call(this, token));
2449
- if (walkTokens) {
2450
- values = values.concat(walkTokens.call(this, token));
2451
- }
2452
- return values;
2453
- };
2454
- }
2455
- this.defaults = { ...this.defaults, ...opts };
2456
- });
2457
- return this;
2458
- }
2459
- setOptions(opt) {
2460
- this.defaults = { ...this.defaults, ...opt };
2461
- return this;
2462
- }
2463
- lexer(src, options) {
2464
- return _Lexer.lex(src, options ?? this.defaults);
2465
- }
2466
- parser(tokens, options) {
2467
- return _Parser.parse(tokens, options ?? this.defaults);
2468
- }
2469
- #parseMarkdown(lexer, parser) {
2470
- return (src, options) => {
2471
- const origOpt = { ...options };
2472
- const opt = { ...this.defaults, ...origOpt };
2473
- // Show warning if an extension set async to true but the parse was called with async: false
2474
- if (this.defaults.async === true && origOpt.async === false) {
2475
- if (!opt.silent) {
2476
- console.warn('marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored.');
2477
- }
2478
- opt.async = true;
2479
- }
2480
- const throwError = this.#onError(!!opt.silent, !!opt.async);
2481
- // throw error in case of non string input
2482
- if (typeof src === 'undefined' || src === null) {
2483
- return throwError(new Error('marked(): input parameter is undefined or null'));
2484
- }
2485
- if (typeof src !== 'string') {
2486
- return throwError(new Error('marked(): input parameter is of type '
2487
- + Object.prototype.toString.call(src) + ', string expected'));
2488
- }
2489
- if (opt.hooks) {
2490
- opt.hooks.options = opt;
2491
- }
2492
- if (opt.async) {
2493
- return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src)
2494
- .then(src => lexer(src, opt))
2495
- .then(tokens => opt.hooks ? opt.hooks.processAllTokens(tokens) : tokens)
2496
- .then(tokens => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens)
2497
- .then(tokens => parser(tokens, opt))
2498
- .then(html => opt.hooks ? opt.hooks.postprocess(html) : html)
2499
- .catch(throwError);
2500
- }
2501
- try {
2502
- if (opt.hooks) {
2503
- src = opt.hooks.preprocess(src);
2504
- }
2505
- let tokens = lexer(src, opt);
2506
- if (opt.hooks) {
2507
- tokens = opt.hooks.processAllTokens(tokens);
2508
- }
2509
- if (opt.walkTokens) {
2510
- this.walkTokens(tokens, opt.walkTokens);
2511
- }
2512
- let html = parser(tokens, opt);
2513
- if (opt.hooks) {
2514
- html = opt.hooks.postprocess(html);
2515
- }
2516
- return html;
2517
- }
2518
- catch (e) {
2519
- return throwError(e);
2520
- }
2521
- };
2522
- }
2523
- #onError(silent, async) {
2524
- return (e) => {
2525
- e.message += '\nPlease report this to https://github.com/markedjs/marked.';
2526
- if (silent) {
2527
- const msg = '<p>An error occurred:</p><pre>'
2528
- + escape$1(e.message + '', true)
2529
- + '</pre>';
2530
- if (async) {
2531
- return Promise.resolve(msg);
2532
- }
2533
- return msg;
2534
- }
2535
- if (async) {
2536
- return Promise.reject(e);
2537
- }
2538
- throw e;
2539
- };
2540
- }
2541
- }
2542
-
2543
- const markedInstance = new Marked();
2544
- function marked(src, opt) {
2545
- return markedInstance.parse(src, opt);
2546
- }
2547
- /**
2548
- * Sets the default options.
2549
- *
2550
- * @param options Hash of options
2551
- */
2552
- marked.options =
2553
- marked.setOptions = function (options) {
2554
- markedInstance.setOptions(options);
2555
- marked.defaults = markedInstance.defaults;
2556
- changeDefaults(marked.defaults);
2557
- return marked;
2558
- };
2559
- /**
2560
- * Gets the original marked default options.
2561
- */
2562
- marked.getDefaults = _getDefaults;
2563
- marked.defaults = exports.defaults;
2564
- /**
2565
- * Use Extension
2566
- */
2567
- marked.use = function (...args) {
2568
- markedInstance.use(...args);
2569
- marked.defaults = markedInstance.defaults;
2570
- changeDefaults(marked.defaults);
2571
- return marked;
2572
- };
2573
- /**
2574
- * Run callback for every token
2575
- */
2576
- marked.walkTokens = function (tokens, callback) {
2577
- return markedInstance.walkTokens(tokens, callback);
2578
- };
2579
- /**
2580
- * Compiles markdown to HTML without enclosing `p` tag.
2581
- *
2582
- * @param src String of markdown source to be compiled
2583
- * @param options Hash of options
2584
- * @return String of compiled HTML
2585
- */
2586
- marked.parseInline = markedInstance.parseInline;
2587
- /**
2588
- * Expose
2589
- */
2590
- marked.Parser = _Parser;
2591
- marked.parser = _Parser.parse;
2592
- marked.Renderer = _Renderer;
2593
- marked.TextRenderer = _TextRenderer;
2594
- marked.Lexer = _Lexer;
2595
- marked.lexer = _Lexer.lex;
2596
- marked.Tokenizer = _Tokenizer;
2597
- marked.Hooks = _Hooks;
2598
- marked.parse = marked;
2599
- const options = marked.options;
2600
- const setOptions = marked.setOptions;
2601
- const use = marked.use;
2602
- const walkTokens = marked.walkTokens;
2603
- const parseInline = marked.parseInline;
2604
- const parse = marked;
2605
- const parser = _Parser.parse;
2606
- const lexer = _Lexer.lex;
2607
-
2608
- exports.Hooks = _Hooks;
2609
- exports.Lexer = _Lexer;
2610
- exports.Marked = Marked;
2611
- exports.Parser = _Parser;
2612
- exports.Renderer = _Renderer;
2613
- exports.TextRenderer = _TextRenderer;
2614
- exports.Tokenizer = _Tokenizer;
2615
- exports.getDefaults = _getDefaults;
2616
- exports.lexer = lexer;
2617
- exports.marked = marked;
2618
- exports.options = options;
2619
- exports.parse = parse;
2620
- exports.parseInline = parseInline;
2621
- exports.parser = parser;
2622
- exports.setOptions = setOptions;
2623
- exports.use = use;
2624
- exports.walkTokens = walkTokens;
2625
-
2626
- }));
2627
-
2628
- }(marked_umd, marked_umd.exports));
2629
-
2630
- const toInlinePlainText = (textWithHtml) => {
2631
- const withoutHtmlTags = textWithHtml.replace(/<[^>]*>/g, ' ');
2632
- const withCollapsedWhitespaces = withoutHtmlTags.replace(/\s{2,}/g, ' ');
2633
- return withCollapsedWhitespaces.trim();
2634
- };
2635
- const unclosedElement = /(\*{1,3}|`)($|\w[\w\s]*$)/;
2636
- const completeUnclosedElement = (text) => {
2637
- const match = unclosedElement.exec(text);
2638
- if (match) {
2639
- const symbol = match[1];
2640
- const replacements = {
2641
- '***': '<strong part="answer-strong"><em part="answer-emphasis">$2</em></strong>',
2642
- '**': '<strong part="answer-strong">$2</strong>',
2643
- '*': '<em part="answer-emphasis">$2</em>',
2644
- '`': '<code part="answer-inline-code">$2</code>',
2645
- };
2646
- return text.replace(unclosedElement, replacements[symbol]);
2647
- }
2648
- return text;
2649
- };
2650
- const escapeHtml = (text) => {
2651
- return text
2652
- .replace(/&/g, '&amp;')
2653
- .replace(/</g, '&lt;')
2654
- .replace(/>/g, '&gt;')
2655
- .replace(/"/g, '&quot;')
2656
- .replace(/'/g, '&#39;');
2657
- };
2658
- const customRenderer = {
2659
- blockquote(quote) {
2660
- return `<blockquote part="answer-quote-block">${quote}</blockquote>`;
2661
- },
2662
- code(code) {
2663
- return `<pre part="answer-code-block"><code>${escapeHtml(code)}</code></pre>`;
2664
- },
2665
- codespan(text) {
2666
- return `<code part="answer-inline-code">${text}</code>`;
2667
- },
2668
- em(text) {
2669
- return `<em part="answer-emphasis">${text}</em>`;
2670
- },
2671
- heading(text, level) {
2672
- const plainText = toInlinePlainText(text);
2673
- return `<div part="answer-heading-${level}" aria-label="${plainText}">${text}</div>`;
2674
- },
2675
- html(text) {
2676
- return escapeHtml(text);
2677
- },
2678
- list(body, ordered, start) {
2679
- const type = ordered ? 'ol' : 'ul';
2680
- const part = ordered ? 'answer-ordered-list' : 'answer-unordered-list';
2681
- const tag = ordered && start !== 1
2682
- ? `<${type} part="${part}" start="${start}">`
2683
- : `<${type} part="${part}">`;
2684
- return `${tag}${body}</${type}>`;
2685
- },
2686
- /**
2687
- * Custom Marked renderer to remove wrapping `<p>` element around list item content.
2688
- * @param text The element text content.
2689
- * @returns The list item element to render.
2690
- */
2691
- listitem(text) {
2692
- const unwrappedText = text
2693
- .replace(/^<p[^>]*>/, '')
2694
- .replace(/<\/p>\n?$/, '');
2695
- const withClosedElement = completeUnclosedElement(unwrappedText);
2696
- return `<li part="answer-list-item">${withClosedElement}</li>`;
2697
- },
2698
- paragraph(text) {
2699
- return `<p part="answer-paragraph">${text}</p>`;
2700
- },
2701
- strong(text) {
2702
- return `<strong part="answer-strong">${text}</strong>`;
2703
- },
2704
- /**
2705
- * Custom Marked renderer to wrap `<table>` element in a scrolling container.
2706
- * @param header The table header content.
2707
- * @param body The table body content.
2708
- * @returns The element to render.
2709
- */
2710
- table(header, body) {
2711
- return `<div part="answer-table-container" class="scrollable-table"><table part="answer-table"><thead>${header}</thead><tbody>${body}</tbody></table></div>`;
2712
- },
2713
- tablecell(content, flags) {
2714
- const type = flags.header ? 'th' : 'td';
2715
- const part = flags.header ? 'answer-table-header' : 'answer-table-content';
2716
- const tag = flags.align
2717
- ? `<${type} part="${part}" align="${flags.align}">`
2718
- : `<${type} part="${part}">`;
2719
- return `${tag}${content}</${type}>`;
2720
- },
2721
- /**
2722
- * Custom Marked renderer to complete unclosed inline elements such as bold, italic, and code.
2723
- * @param text The text content.
2724
- * @returns The corrected text content.
2725
- */
2726
- text(text) {
2727
- return completeUnclosedElement(text);
2728
- },
2729
- };
2730
- const transformMarkdownToHtml = (text) => {
2731
- return marked_umd.exports.marked.use({ renderer: customRenderer }).parse(text);
2732
- };
2733
-
2734
- /**
2735
- * @deprecated should only be used for Stencil components.
2736
- */
2737
- const GeneratedMarkdownContent = (props) => {
2738
- const answerAsHtml = DOMPurify.sanitize(transformMarkdownToHtml(props.answer ?? ''), { ADD_ATTR: ['part'] });
2739
- return (h("div", { part: "generated-text", class: `text-on-background mb-0 ${props.isStreaming ? 'cursor' : ''}`, innerHTML: answerAsHtml }));
2740
- };
2741
-
2742
- /**
2743
- * @deprecated should only be used for Stencil components.
2744
- */
2745
- const GeneratedTextContent = (props) => {
2746
- return (h("p", { part: "generated-text", class: `text-on-background mb-0 whitespace-pre-wrap ${props.isStreaming ? 'cursor' : ''}` }, props.answer));
2747
- };
2748
-
2749
- /**
2750
- * @deprecated should only be used for Stencil components.
2751
- */
2752
- const GeneratedContentContainer = (props, children) => {
2753
- return (h("div", { part: "generated-container", class: "mt-6" },
2754
- props.answerContentFormat === 'text/markdown' ? (h(GeneratedMarkdownContent, { answer: props.answer, isStreaming: props.isStreaming })) : (h(GeneratedTextContent, { answer: props.answer, isStreaming: props.isStreaming })),
2755
- h("div", { class: "footer mt-6" }, children)));
2756
- };
2757
-
2758
- /**
2759
- * @deprecated should only be used for Stencil components.
2760
- */
2761
- const ShowButton = (props) => (h(Button, { style: "text-primary", part: "answer-show-button", class: "hidden items-center hover:bg-transparent", onClick: () => props.onClick() },
2762
- h("div", { class: "text-base font-light" }, props.isCollapsed
2763
- ? props.i18n.t('show-more')
2764
- : props.i18n.t('show-less')),
2765
- h("atomic-icon", { part: "answer-show-icon", class: "ml-2 w-3.5", icon: props.isCollapsed ? ArrowBottomIcon : ArrowTopIcon })));
2766
-
2767
- /**
2768
- * @deprecated should only be used for Stencil components.
2769
- */
2770
- const RetryPrompt = (props) => (h("div", { part: "retry-container", class: "mt-4" },
2771
- h("div", { class: "text-neutral-dark mx-auto text-center" }, props.message),
2772
- h(Button, { class: "mx-auto mt-4 block px-4 py-2", style: "outline-primary", onClick: props.onClick }, props.buttonLabel)));
2773
-
2774
- /**
2775
- * @deprecated should only be used for Stencil components.
2776
- */
2777
- const SourceCitations = (props, children) => props.isVisible ? (h("div", { class: "source-citations" },
2778
- h("p", { part: "citations-label", class: "text-neutral-dark mb-2 shrink-0" }, props.label),
2779
- h("ol", { class: "citations-container flex list-none flex-wrap items-center gap-2" }, children))) : null;
2780
-
2781
- /**
2782
- * @deprecated use the LitElement version instead: `GeneratedAnswerController`. This class is only meant to be used in legacy Stencil-based components.
2783
- */
2784
- class GeneratedAnswerCommon {
2785
- constructor(props) {
2786
- this.props = props;
2787
- this.storage = new SafeStorage();
2788
- this._data = this.readStoredData();
2789
- }
2790
- insertFeedbackModal() {
2791
- this.modalRef = document.createElement('atomic-generated-answer-feedback-modal');
2792
- this.modalRef.generatedAnswer = this.props.getGeneratedAnswer();
2793
- this.props.host.insertAdjacentElement('beforebegin', this.modalRef);
2794
- }
2795
- readStoredData() {
2796
- const { withToggle } = this.props;
2797
- const storedData = this.storage.getParsedJSON(StorageItems.GENERATED_ANSWER_DATA, { isVisible: true });
2798
- // This check ensures that the answer is visible when the toggle is hidden and visible is set to false in the local storage.
2799
- return { isVisible: (withToggle && storedData.isVisible) || !withToggle };
2800
- }
2801
- writeStoredData(data) {
2802
- this.storage.setJSON(StorageItems.GENERATED_ANSWER_DATA, data);
2803
- }
2804
- get data() {
2805
- return this._data;
2806
- }
2807
- set data(newData) {
2808
- this._data = newData;
2809
- }
2810
- getGeneratedAnswerStatus() {
2811
- const isHidden = !this.props.getGeneratedAnswerState()?.isVisible;
2812
- const isGenerating = !!this.props.getGeneratedAnswerState()?.isStreaming;
2813
- const hasAnswer = !!this.props.getGeneratedAnswerState()?.answer;
2814
- const hasError = !!this.props.getGeneratedAnswerState()?.error;
2815
- if (isHidden) {
2816
- return this.props.getBindings().i18n.t('generated-answer-hidden');
2817
- }
2818
- if (isGenerating) {
2819
- return this.props.getBindings().i18n.t('generating-answer');
2820
- }
2821
- if (hasError) {
2822
- return this.props.getBindings().i18n.t('answer-could-not-be-generated');
2823
- }
2824
- if (hasAnswer) {
2825
- return this.props.getBindings().i18n.t('answer-generated', {
2826
- answer: this.props.getGeneratedAnswerState()?.answer,
2827
- });
2828
- }
2829
- return '';
2830
- }
2831
- get hasRetryableError() {
2832
- return (!this.props.getSearchStatusState()?.hasError &&
2833
- this.props.getGeneratedAnswerState()?.error?.isRetryable);
2834
- }
2835
- get hasNoAnswerGenerated() {
2836
- const { answer, citations } = this.props.getGeneratedAnswerState() ?? {};
2837
- return (answer === undefined && !citations?.length && !this.hasRetryableError);
2838
- }
2839
- get isAnswerVisible() {
2840
- return this.props.getGeneratedAnswerState()?.isVisible;
2841
- }
2842
- get toggleTooltip() {
2843
- const key = this.isAnswerVisible
2844
- ? 'generated-answer-toggle-on'
2845
- : 'generated-answer-toggle-off';
2846
- return this.props.getBindings().i18n.t(key);
2847
- }
2848
- get hasClipboard() {
2849
- return !!navigator?.clipboard?.writeText;
2850
- }
2851
- get copyToClipboardTooltip() {
2852
- if (this.props.getCopyError()) {
2853
- return this.props.getBindings().i18n.t('failed-to-copy-generated-answer');
2854
- }
2855
- return !this.props.getCopied()
2856
- ? this.props.getBindings().i18n.t('copy-generated-answer')
2857
- : this.props.getBindings().i18n.t('generated-answer-copied');
2858
- }
2859
- get hasCustomNoAnswerMessage() {
2860
- return getNamedSlotContent(this.props.host, 'no-answer-message').length > 0;
2861
- }
2862
- async copyToClipboard(answer) {
2863
- try {
2864
- await navigator.clipboard.writeText(answer);
2865
- this.props.setCopied(true);
2866
- this.props.getGeneratedAnswer()?.logCopyToClipboard();
2867
- }
2868
- catch (error) {
2869
- this.props.setCopyError(true);
2870
- this.props
2871
- .getBindings()
2872
- .engine.logger.error(`Failed to copy to clipboard: ${error}`);
2873
- }
2874
- setTimeout(() => {
2875
- this.props.setCopied(false);
2876
- this.props.setCopyError(false);
2877
- }, 2000);
2878
- }
2879
- clickOnShowButton() {
2880
- if (this.props.getGeneratedAnswerState()?.expanded) {
2881
- this.props.getGeneratedAnswer()?.collapse();
2882
- }
2883
- else {
2884
- this.props.getGeneratedAnswer()?.expand();
2885
- }
2886
- }
2887
- getCitation(citation) {
2888
- const { title } = citation;
2889
- const { i18n } = this.props.getBindings();
2890
- const normalizedTitle = (title ?? '').trim();
2891
- return normalizedTitle !== ''
2892
- ? citation
2893
- : { ...citation, title: i18n.t('no-title') };
2894
- }
2895
- renderCitations() {
2896
- const { getGeneratedAnswerState, buildInteractiveCitation, getGeneratedAnswer, disableCitationAnchoring, } = this.props;
2897
- const { citations } = getGeneratedAnswerState() ?? {};
2898
- const { logCitationHover } = getGeneratedAnswer() ?? {};
2899
- return citations?.map((citation, index) => {
2900
- const interactiveCitation = buildInteractiveCitation({
2901
- options: {
2902
- citation,
2903
- },
2904
- });
2905
- return (h("li", { key: citation.id, class: "max-w-full" },
2906
- h("atomic-citation", { citation: this.getCitation(citation), index: index, sendHoverEndEvent: (citationHoverTimeMs) => {
2907
- logCitationHover?.(citation.id, citationHoverTimeMs);
2908
- }, interactiveCitation: interactiveCitation, disableCitationAnchoring: disableCitationAnchoring, exportparts: "citation,citation-popover" })));
2909
- });
2910
- }
2911
- renderFeedbackAndCopyButtons() {
2912
- const { getGeneratedAnswerState, getBindings, getCopied, getCopyError } = this.props;
2913
- const { i18n } = getBindings();
2914
- const { liked, disliked, answer, isStreaming } = getGeneratedAnswerState() ?? {};
2915
- const containerClasses = [
2916
- 'feedback-buttons',
2917
- 'flex',
2918
- 'h-9',
2919
- 'absolute',
2920
- 'top-6',
2921
- 'shrink-0',
2922
- 'gap-2',
2923
- this.props.withToggle ? 'right-20' : 'right-6',
2924
- ].join(' ');
2925
- if (isStreaming) {
2926
- return null;
2927
- }
2928
- return (h("div", { class: containerClasses },
2929
- h(FeedbackButton, { title: i18n.t('this-answer-was-helpful'), variant: "like", active: !!liked, onClick: () => this.clickLike() }),
2930
- h(FeedbackButton, { title: i18n.t('this-answer-was-not-helpful'), variant: "dislike", active: !!disliked, onClick: () => this.clickDislike() }),
2931
- this.hasClipboard ? (h(CopyButton, { title: this.copyToClipboardTooltip, isCopied: getCopied(), error: getCopyError(), onClick: async () => {
2932
- if (answer) {
2933
- await this.copyToClipboard(answer);
2934
- }
2935
- } })) : null));
2936
- }
2937
- setIsAnswerHelpful(isAnswerHelpful) {
2938
- if (this.modalRef) {
2939
- this.modalRef.helpful = isAnswerHelpful;
2940
- }
2941
- }
2942
- openFeedbackModal() {
2943
- if (this.modalRef &&
2944
- !this.props.getGeneratedAnswerState()?.feedbackSubmitted) {
2945
- this.modalRef.isOpen = true;
2946
- }
2947
- }
2948
- clickDislike() {
2949
- this.setIsAnswerHelpful(false);
2950
- this.props.getGeneratedAnswer()?.dislike();
2951
- this.openFeedbackModal();
2952
- }
2953
- clickLike() {
2954
- this.setIsAnswerHelpful(true);
2955
- this.props.getGeneratedAnswer()?.like();
2956
- this.openFeedbackModal();
2957
- }
2958
- renderDisclaimer() {
2959
- const { getGeneratedAnswerState, getBindings } = this.props;
2960
- const { i18n } = getBindings();
2961
- const { isStreaming } = getGeneratedAnswerState() ?? {};
2962
- if (isStreaming) {
2963
- return null;
2964
- }
2965
- return (h("div", { class: "text-neutral-dark text-xs/[1rem]" },
2966
- h("slot", { name: "disclaimer", slot: "disclaimer" }, i18n.t('generated-answer-disclaimer'))));
2967
- }
2968
- renderShowButton() {
2969
- const { getGeneratedAnswerState, getBindings, collapsible } = this.props;
2970
- const { i18n } = getBindings();
2971
- const { expanded, isStreaming } = getGeneratedAnswerState() ?? {};
2972
- const canRender = collapsible && !isStreaming;
2973
- if (!canRender) {
2974
- return null;
2975
- }
2976
- return (h(ShowButton, { i18n: i18n, onClick: () => this.clickOnShowButton(), isCollapsed: !expanded }));
2977
- }
2978
- renderGeneratingAnswerLabel() {
2979
- const { getGeneratedAnswerState, getBindings, collapsible } = this.props;
2980
- const { i18n } = getBindings();
2981
- const { isStreaming } = getGeneratedAnswerState() ?? {};
2982
- const canRender = collapsible && isStreaming;
2983
- if (!canRender) {
2984
- return null;
2985
- }
2986
- return (h("div", { part: "is-generating", class: "text-primary hidden text-base font-light" },
2987
- i18n.t('generating-answer'),
2988
- "..."));
2989
- }
2990
- renderContent() {
2991
- const { getGeneratedAnswerState, getBindings, getGeneratedAnswer } = this.props;
2992
- const { i18n } = getBindings();
2993
- const { isStreaming, answer, citations, answerContentFormat } = getGeneratedAnswerState() ?? {};
2994
- return (h("div", { part: "generated-content" },
2995
- h("div", { class: "flex items-center" },
2996
- 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')),
2997
- h("div", { class: "ml-auto flex h-9 items-center" },
2998
- h(Switch, { part: "toggle", checked: this.isAnswerVisible, onToggle: (checked) => {
2999
- checked
3000
- ? getGeneratedAnswer()?.show()
3001
- : getGeneratedAnswer()?.hide();
3002
- }, ariaLabel: i18n.t('generated-answer-title'), title: this.toggleTooltip, withToggle: this.props.withToggle }))),
3003
- this.hasRetryableError && this.isAnswerVisible ? (h(RetryPrompt, { onClick: () => getGeneratedAnswer()?.retry(), buttonLabel: i18n.t('retry'), message: i18n.t('retry-stream-message') })) : null,
3004
- !this.hasRetryableError && this.isAnswerVisible ? (h(GeneratedContentContainer, { answer: answer, answerContentFormat: answerContentFormat, isStreaming: !!isStreaming },
3005
- this.renderFeedbackAndCopyButtons(),
3006
- h(SourceCitations, { label: i18n.t('citations'), isVisible: !!citations?.length }, this.renderCitations()))) : null,
3007
- !this.hasRetryableError && this.isAnswerVisible && (h("div", { part: "generated-answer-footer", class: "mt-6 flex justify-end" },
3008
- this.renderGeneratingAnswerLabel(),
3009
- this.renderShowButton(),
3010
- this.renderDisclaimer()))));
3011
- }
3012
- renderCustomNoAnswerMessage() {
3013
- const { getBindings } = this.props;
3014
- const { i18n } = getBindings();
3015
- return (h("div", { part: "generated-content" },
3016
- h("div", { class: "flex items-center" },
3017
- 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'))),
3018
- h("div", { part: "generated-container", class: "mt-6 break-words" },
3019
- h("slot", { name: "no-answer-message" }))));
3020
- }
3021
- render() {
3022
- const { getGeneratedAnswerState } = this.props;
3023
- const { cannotAnswer } = getGeneratedAnswerState() ?? {};
3024
- const contentClasses = 'mx-auto mt-0 mb-4 border border-neutral shadow-lg p-6 bg-background rounded-lg p-6 text-on-background';
3025
- if (this.hasNoAnswerGenerated) {
3026
- return cannotAnswer && this.hasCustomNoAnswerMessage ? (h("div", null,
3027
- h("aside", { class: contentClasses, part: "container", "aria-label": this.props.getBindings().i18n.t('generated-answer-title') },
3028
- h("article", null, this.renderCustomNoAnswerMessage())))) : null;
3029
- }
3030
- return (h("div", null,
3031
- h("aside", { class: contentClasses, part: "container", "aria-label": this.props.getBindings().i18n.t('generated-answer-title') },
3032
- h("article", null, this.renderContent()))));
3033
- }
3034
- }
3035
-
3036
- const atomicInsightGeneratedAnswerCss = "/*! tailwindcss v4.1.13 | MIT License | https://tailwindcss.com */\n@layer properties;\n@layer properties {\n *, :before, :after, ::backdrop {\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-translate-z: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-scale-z: 1;\n --tw-rotate-x: initial;\n --tw-rotate-y: initial;\n --tw-rotate-z: initial;\n --tw-skew-x: initial;\n --tw-skew-y: initial;\n --tw-space-x-reverse: 0;\n --tw-divide-y-reverse: 0;\n --tw-border-style: solid;\n --tw-gradient-position: initial;\n --tw-gradient-from: #0000;\n --tw-gradient-via: #0000;\n --tw-gradient-to: #0000;\n --tw-gradient-stops: initial;\n --tw-gradient-via-stops: initial;\n --tw-gradient-from-position: 0%;\n --tw-gradient-via-position: 50%;\n --tw-gradient-to-position: 100%;\n --tw-leading: initial;\n --tw-font-weight: initial;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-color: initial;\n --tw-shadow-alpha: 100%;\n --tw-inset-shadow: 0 0 #0000;\n --tw-inset-shadow-color: initial;\n --tw-inset-shadow-alpha: 100%;\n --tw-ring-color: initial;\n --tw-ring-shadow: 0 0 #0000;\n --tw-inset-ring-color: initial;\n --tw-inset-ring-shadow: 0 0 #0000;\n --tw-ring-inset: initial;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-outline-style: solid;\n --tw-blur: initial;\n --tw-brightness: initial;\n --tw-contrast: initial;\n --tw-grayscale: initial;\n --tw-hue-rotate: initial;\n --tw-invert: initial;\n --tw-opacity: initial;\n --tw-saturate: initial;\n --tw-sepia: initial;\n --tw-drop-shadow: initial;\n --tw-drop-shadow-color: initial;\n --tw-drop-shadow-alpha: 100%;\n --tw-drop-shadow-size: initial;\n --tw-duration: initial;\n --tw-ease: initial;\n --tw-content: \"\";\n }\n}\n@layer theme, base, components, utilities;\n@layer theme;\n@layer base {\n *, ::after, ::before, ::backdrop, ::file-selector-button {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0 solid;\n }\n html, :host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n tab-size: 4;\n font-family: var(--default-font-family, var(--atomic-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"));\n font-feature-settings: var(--default-font-feature-settings, normal);\n font-variation-settings: var(--default-font-variation-settings, normal);\n -webkit-tap-highlight-color: transparent;\n }\n hr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n }\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n h1, h2, h3, h4, h5, h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n b, strong {\n font-weight: bolder;\n }\n code, kbd, samp, pre {\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\",\n \"Courier New\", monospace);\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\n font-size: 1em;\n }\n small {\n font-size: 80%;\n }\n sub, sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n sub {\n bottom: -0.25em;\n }\n sup {\n top: -0.5em;\n }\n table {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n }\n :-moz-focusring {\n outline: auto;\n }\n progress {\n vertical-align: baseline;\n }\n summary {\n display: list-item;\n }\n ol, ul, menu {\n list-style: none;\n }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n vertical-align: middle;\n }\n img, video {\n max-width: 100%;\n height: auto;\n }\n button, input, select, optgroup, textarea, ::file-selector-button {\n font: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n letter-spacing: inherit;\n color: inherit;\n border-radius: 0;\n background-color: transparent;\n opacity: 1;\n }\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n ::placeholder {\n opacity: 1;\n }\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\n ::placeholder {\n color: currentcolor;\n }\n @supports (color: color-mix(in lab, red, red)) {\n ::placeholder {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n }\n textarea {\n resize: vertical;\n }\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n ::-webkit-date-and-time-value {\n min-height: 1lh;\n text-align: inherit;\n }\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n ::-webkit-calendar-picker-indicator {\n line-height: 1;\n }\n :-moz-ui-invalid {\n box-shadow: none;\n }\n button, input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]), ::file-selector-button {\n appearance: button;\n }\n ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {\n height: auto;\n }\n [hidden]:where(:not([hidden=\"until-found\"])) {\n display: none !important;\n }\n}\n@layer utilities {\n .\\@container {\n container-type: inline-size;\n }\n .pointer-events-auto {\n pointer-events: auto;\n }\n .pointer-events-none {\n pointer-events: none;\n }\n .collapse {\n visibility: collapse;\n }\n .invisible {\n visibility: hidden;\n }\n .visible {\n visibility: visible;\n }\n .mobile-footer-xs-layout {\n margin-top: calc(0.25rem * 4);\n }\n .mobile-footer-xs-layout .feedback-buttons {\n position: relative;\n top: calc(0.25rem * 0);\n right: calc(0.25rem * 0);\n }\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border-width: 0;\n }\n .absolute {\n position: absolute;\n }\n .fixed {\n position: fixed;\n }\n .relative {\n position: relative;\n }\n .static {\n position: static;\n }\n .sticky {\n position: sticky;\n }\n .inset-0 {\n inset: calc(0.25rem * 0);\n }\n .-top-2 {\n top: calc(0.25rem * -2);\n }\n .-top-4 {\n top: calc(0.25rem * -4);\n }\n .top-0 {\n top: calc(0.25rem * 0);\n }\n .top-1 {\n top: calc(0.25rem * 1);\n }\n .top-1\\/2 {\n top: calc(1/2 * 100%);\n }\n .top-6 {\n top: calc(0.25rem * 6);\n }\n .top-\\[4px\\] {\n top: 4px;\n }\n .top-full {\n top: 100%;\n }\n .top-px {\n top: 1px;\n }\n .-right-2 {\n right: calc(0.25rem * -2);\n }\n .right-0 {\n right: calc(0.25rem * 0);\n }\n .right-1 {\n right: calc(0.25rem * 1);\n }\n .right-2 {\n right: calc(0.25rem * 2);\n }\n .right-6 {\n right: calc(0.25rem * 6);\n }\n .right-12 {\n right: calc(0.25rem * 12);\n }\n .right-20 {\n right: calc(0.25rem * 20);\n }\n .right-px {\n right: 1px;\n }\n .bottom-0 {\n bottom: calc(0.25rem * 0);\n }\n .bottom-1 {\n bottom: calc(0.25rem * 1);\n }\n .bottom-2 {\n bottom: calc(0.25rem * 2);\n }\n .bottom-px {\n bottom: 1px;\n }\n .left-0 {\n left: calc(0.25rem * 0);\n }\n .left-1 {\n left: calc(0.25rem * 1);\n }\n .left-2 {\n left: calc(0.25rem * 2);\n }\n .left-\\[15px\\] {\n left: 15px;\n }\n .isolate {\n isolation: isolate;\n }\n .z-0 {\n z-index: 0;\n }\n .z-1 {\n z-index: 1;\n }\n .z-10 {\n z-index: 10;\n }\n .z-9998 {\n z-index: 9998;\n }\n .z-9999 {\n z-index: 9999;\n }\n .order-last {\n order: 9999;\n }\n .col-span-2 {\n grid-column: span 2 / span 2;\n }\n .container {\n width: 100%;\n }\n @media (width >= 1024px) {\n .container {\n max-width: 1024px;\n }\n }\n @media (width >= 40rem) {\n .container {\n max-width: 40rem;\n }\n }\n @media (width >= 48rem) {\n .container {\n max-width: 48rem;\n }\n }\n @media (width >= 64rem) {\n .container {\n max-width: 64rem;\n }\n }\n @media (width >= 80rem) {\n .container {\n max-width: 80rem;\n }\n }\n @media (width >= 96rem) {\n .container {\n max-width: 96rem;\n }\n }\n .container\\! {\n width: 100% !important;\n }\n @media (width >= 1024px) {\n .container\\! {\n max-width: 1024px !important;\n }\n }\n @media (width >= 40rem) {\n .container\\! {\n max-width: 40rem !important;\n }\n }\n @media (width >= 48rem) {\n .container\\! {\n max-width: 48rem !important;\n }\n }\n @media (width >= 64rem) {\n .container\\! {\n max-width: 64rem !important;\n }\n }\n @media (width >= 80rem) {\n .container\\! {\n max-width: 80rem !important;\n }\n }\n @media (width >= 96rem) {\n .container\\! {\n max-width: 96rem !important;\n }\n }\n .m-0 {\n margin: calc(0.25rem * 0);\n }\n .m-2 {\n margin: calc(0.25rem * 2);\n }\n .mx-0 {\n margin-inline: calc(0.25rem * 0);\n }\n .mx-0\\.5 {\n margin-inline: calc(0.25rem * 0.5);\n }\n .mx-1 {\n margin-inline: calc(0.25rem * 1);\n }\n .mx-6 {\n margin-inline: calc(0.25rem * 6);\n }\n .mx-16 {\n margin-inline: calc(0.25rem * 16);\n }\n .mx-auto {\n margin-inline: auto;\n }\n .my-2 {\n margin-block: calc(0.25rem * 2);\n }\n .my-3 {\n margin-block: calc(0.25rem * 3);\n }\n .my-4 {\n margin-block: calc(0.25rem * 4);\n }\n .my-6 {\n margin-block: calc(0.25rem * 6);\n }\n .my-auto {\n margin-block: auto;\n }\n .mt-0 {\n margin-top: calc(0.25rem * 0);\n }\n .mt-1 {\n margin-top: calc(0.25rem * 1);\n }\n .mt-1\\.5 {\n margin-top: calc(0.25rem * 1.5);\n }\n .mt-2 {\n margin-top: calc(0.25rem * 2);\n }\n .mt-2\\.5 {\n margin-top: calc(0.25rem * 2.5);\n }\n .mt-3 {\n margin-top: calc(0.25rem * 3);\n }\n .mt-4 {\n margin-top: calc(0.25rem * 4);\n }\n .mt-6 {\n margin-top: calc(0.25rem * 6);\n }\n .mt-7 {\n margin-top: calc(0.25rem * 7);\n }\n .mt-8 {\n margin-top: calc(0.25rem * 8);\n }\n .mt-10 {\n margin-top: calc(0.25rem * 10);\n }\n .mt-px {\n margin-top: 1px;\n }\n .mobile-footer-layout {\n flex-direction: column;\n gap: calc(0.25rem * 4);\n }\n .mobile-footer-layout .source-citations {\n margin-right: calc(0.25rem * 0);\n }\n .mr-0 {\n margin-right: calc(0.25rem * 0);\n }\n .mr-0\\.5 {\n margin-right: calc(0.25rem * 0.5);\n }\n .mr-1 {\n margin-right: calc(0.25rem * 1);\n }\n .mr-1\\.5 {\n margin-right: calc(0.25rem * 1.5);\n }\n .mr-2 {\n margin-right: calc(0.25rem * 2);\n }\n .mr-3 {\n margin-right: calc(0.25rem * 3);\n }\n .mr-6 {\n margin-right: calc(0.25rem * 6);\n }\n .mb-0 {\n margin-bottom: calc(0.25rem * 0);\n }\n .mb-1 {\n margin-bottom: calc(0.25rem * 1);\n }\n .mb-2 {\n margin-bottom: calc(0.25rem * 2);\n }\n .mb-3 {\n margin-bottom: calc(0.25rem * 3);\n }\n .mb-4 {\n margin-bottom: calc(0.25rem * 4);\n }\n .mb-6 {\n margin-bottom: calc(0.25rem * 6);\n }\n .ml-0\\.5 {\n margin-left: calc(0.25rem * 0.5);\n }\n .ml-1 {\n margin-left: calc(0.25rem * 1);\n }\n .ml-2 {\n margin-left: calc(0.25rem * 2);\n }\n .ml-4 {\n margin-left: calc(0.25rem * 4);\n }\n .ml-6 {\n margin-left: calc(0.25rem * 6);\n }\n .ml-auto {\n margin-left: auto;\n }\n .box-border {\n box-sizing: border-box;\n }\n .box-content {\n box-sizing: content-box;\n }\n .line-clamp-1 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n }\n .line-clamp-2 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n }\n .line-clamp-3 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 3;\n }\n .line-clamp-4 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 4;\n }\n .line-clamp-none {\n overflow: visible;\n display: block;\n -webkit-box-orient: horizontal;\n -webkit-line-clamp: unset;\n }\n .block {\n display: block;\n }\n .contents {\n display: contents;\n }\n .flex {\n display: flex;\n }\n .grid {\n display: grid;\n }\n .hidden {\n display: none;\n }\n .inline {\n display: inline;\n }\n .inline-block {\n display: inline-block;\n }\n .inline-flex {\n display: inline-flex;\n }\n .table {\n display: table;\n }\n .table-column {\n display: table-column;\n }\n .aspect-square-\\[auto\\] {\n aspect-ratio: 1 / 1;\n height: auto;\n }\n @supports not (aspect-ratio: 1 / 1) {\n .aspect-square-\\[auto\\] {\n height: auto;\n }\n }\n .aspect-square-\\[auto\\] {\n aspect-ratio: 1 / 1;\n height: auto;\n }\n @supports not (aspect-ratio: 1 / 1) {\n .aspect-square-\\[auto\\] {\n height: auto;\n }\n }\n .aspect-square-\\[auto\\] {\n aspect-ratio: 1 / 1;\n height: auto;\n }\n @supports not (aspect-ratio: 1 / 1) {\n .aspect-square-\\[auto\\] {\n height: auto;\n }\n }\n .aspect-square-\\[auto\\] {\n aspect-ratio: 1 / 1;\n height: auto;\n }\n @supports not (aspect-ratio: 1 / 1) {\n .aspect-square-\\[auto\\] {\n height: auto;\n }\n }\n .aspect-square {\n aspect-ratio: 1 / 1;\n }\n .size-\\[27px\\] {\n width: 27px;\n height: 27px;\n }\n .h-1 {\n height: calc(0.25rem * 1);\n }\n .h-2 {\n height: calc(0.25rem * 2);\n }\n .h-2\\.5 {\n height: calc(0.25rem * 2.5);\n }\n .h-3 {\n height: calc(0.25rem * 3);\n }\n .h-4 {\n height: calc(0.25rem * 4);\n }\n .h-5 {\n height: calc(0.25rem * 5);\n }\n .h-5\\/6 {\n height: calc(5/6 * 100%);\n }\n .h-6 {\n height: calc(0.25rem * 6);\n }\n .h-7 {\n height: calc(0.25rem * 7);\n }\n .h-8 {\n height: calc(0.25rem * 8);\n }\n .h-9 {\n height: calc(0.25rem * 9);\n }\n .h-10 {\n height: calc(0.25rem * 10);\n }\n .h-12 {\n height: calc(0.25rem * 12);\n }\n .h-\\[2\\.6rem\\] {\n height: 2.6rem;\n }\n .h-\\[9px\\] {\n height: 9px;\n }\n .h-auto {\n height: auto;\n }\n .h-full {\n height: 100%;\n }\n .max-h-96 {\n max-height: calc(0.25rem * 96);\n }\n .min-h-10 {\n min-height: calc(0.25rem * 10);\n }\n .min-lines-2 {\n min-height: calc(var(--line-height) * 2);\n }\n .min-lines-2 {\n min-height: calc(var(--line-height) * 2);\n }\n .min-lines-2 {\n min-height: calc(var(--line-height) * 2);\n }\n .min-lines-2 {\n min-height: calc(var(--line-height) * 2);\n }\n .min-lines-3 {\n min-height: calc(var(--line-height) * 3);\n }\n .min-lines-3 {\n min-height: calc(var(--line-height) * 3);\n }\n .min-lines-3 {\n min-height: calc(var(--line-height) * 3);\n }\n .min-lines-3 {\n min-height: calc(var(--line-height) * 3);\n }\n .w-0\\.5 {\n width: calc(0.25rem * 0.5);\n }\n .w-1 {\n width: calc(0.25rem * 1);\n }\n .w-1\\/2 {\n width: calc(1/2 * 100%);\n }\n .w-2 {\n width: calc(0.25rem * 2);\n }\n .w-2\\.5 {\n width: calc(0.25rem * 2.5);\n }\n .w-3 {\n width: calc(0.25rem * 3);\n }\n .w-3\\.5 {\n width: calc(0.25rem * 3.5);\n }\n .w-3\\/5 {\n width: calc(3/5 * 100%);\n }\n .w-4 {\n width: calc(0.25rem * 4);\n }\n .w-5 {\n width: calc(0.25rem * 5);\n }\n .w-5\\/6 {\n width: calc(5/6 * 100%);\n }\n .w-6 {\n width: calc(0.25rem * 6);\n }\n .w-7 {\n width: calc(0.25rem * 7);\n }\n .w-8 {\n width: calc(0.25rem * 8);\n }\n .w-9 {\n width: calc(0.25rem * 9);\n }\n .w-10 {\n width: calc(0.25rem * 10);\n }\n .w-12 {\n width: calc(0.25rem * 12);\n }\n .w-20 {\n width: calc(0.25rem * 20);\n }\n .w-26 {\n width: calc(0.25rem * 26);\n }\n .w-28 {\n width: calc(0.25rem * 28);\n }\n .w-32 {\n width: calc(0.25rem * 32);\n }\n .w-36 {\n width: calc(0.25rem * 36);\n }\n .w-48 {\n width: calc(0.25rem * 48);\n }\n .w-60 {\n width: calc(0.25rem * 60);\n }\n .w-64 {\n width: calc(0.25rem * 64);\n }\n .w-72 {\n width: calc(0.25rem * 72);\n }\n .w-100 {\n width: calc(0.25rem * 100);\n }\n .w-\\[2\\.6rem\\] {\n width: 2.6rem;\n }\n .w-auto {\n width: auto;\n }\n .w-fit {\n width: fit-content;\n }\n .w-full {\n width: 100%;\n }\n .w-max {\n width: max-content;\n }\n .max-w-4\\/5 {\n max-width: calc(4/5 * 100%);\n }\n .max-w-60 {\n max-width: calc(0.25rem * 60);\n }\n .max-w-\\[30ch\\] {\n max-width: 30ch;\n }\n .max-w-full {\n max-width: 100%;\n }\n .max-w-lg {\n max-width: 32rem;\n }\n .max-w-max {\n max-width: max-content;\n }\n .min-w-0 {\n min-width: calc(0.25rem * 0);\n }\n .min-w-10 {\n min-width: calc(0.25rem * 10);\n }\n .min-w-20 {\n min-width: calc(0.25rem * 20);\n }\n .min-w-24 {\n min-width: calc(0.25rem * 24);\n }\n .min-w-full {\n min-width: 100%;\n }\n .flex-1 {\n flex: 1;\n }\n .flex-none {\n flex: none;\n }\n .flex-shrink {\n flex-shrink: 1;\n }\n .flex-shrink-0 {\n flex-shrink: 0;\n }\n .shrink-0 {\n flex-shrink: 0;\n }\n .flex-grow {\n flex-grow: 1;\n }\n .grow {\n flex-grow: 1;\n }\n .basis-1\\/2 {\n flex-basis: calc(1/2 * 100%);\n }\n .basis-8 {\n flex-basis: calc(0.25rem * 8);\n }\n .border-collapse {\n border-collapse: collapse;\n }\n .-translate-x-1\\/2 {\n --tw-translate-x: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-x-1\\/2 {\n --tw-translate-x: calc(1/2 * 100%);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-y-1\\/2 {\n --tw-translate-y: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .scale-75 {\n --tw-scale-x: 75%;\n --tw-scale-y: 75%;\n --tw-scale-z: 75%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n .scale-100 {\n --tw-scale-x: 100%;\n --tw-scale-y: 100%;\n --tw-scale-z: 100%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n .rotate-180 {\n rotate: 180deg;\n }\n .transform {\n transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);\n }\n .animate-pulse {\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n }\n .animate-spin {\n animation: spin 1s linear infinite;\n }\n .cursor-\\[inherit\\] {\n cursor: inherit;\n }\n .cursor-pointer {\n cursor: pointer;\n }\n .resize {\n resize: both;\n }\n .resize-none {\n resize: none;\n }\n .list-outside {\n list-style-position: outside;\n }\n .list-decimal {\n list-style-type: decimal;\n }\n .list-disc {\n list-style-type: disc;\n }\n .list-none {\n list-style-type: none;\n }\n .appearance-none {\n appearance: none;\n }\n .grid-cols-\\[min-content_1fr\\] {\n grid-template-columns: min-content 1fr;\n }\n .grid-cols-\\[min-content_auto\\] {\n grid-template-columns: min-content auto;\n }\n .mobile-generated-answer-footer-layout {\n flex-direction: column;\n gap: calc(0.25rem * 1);\n }\n .flex-col {\n flex-direction: column;\n }\n .flex-row {\n flex-direction: row;\n }\n .flex-nowrap {\n flex-wrap: nowrap;\n }\n .flex-wrap {\n flex-wrap: wrap;\n }\n .place-items-center {\n place-items: center;\n }\n .content-center {\n align-content: center;\n }\n .items-baseline {\n align-items: baseline;\n }\n .items-center {\n align-items: center;\n }\n .items-start {\n align-items: flex-start;\n }\n .items-stretch {\n align-items: stretch;\n }\n .justify-between {\n justify-content: space-between;\n }\n .justify-center {\n justify-content: center;\n }\n .justify-end {\n justify-content: flex-end;\n }\n .gap-0\\.5 {\n gap: calc(0.25rem * 0.5);\n }\n .gap-1 {\n gap: calc(0.25rem * 1);\n }\n .gap-2 {\n gap: calc(0.25rem * 2);\n }\n .gap-3 {\n gap: calc(0.25rem * 3);\n }\n .gap-4 {\n gap: calc(0.25rem * 4);\n }\n .gap-8 {\n gap: calc(0.25rem * 8);\n }\n :where(.space-y-1 > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(0.25rem * 1) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(0.25rem * 1) * calc(1 - var(--tw-space-y-reverse)));\n }\n .gap-x-1\\.5 {\n column-gap: calc(0.25rem * 1.5);\n }\n .gap-x-2 {\n column-gap: calc(0.25rem * 2);\n }\n .gap-x-4 {\n column-gap: calc(0.25rem * 4);\n }\n :where(.space-x-1\\.5 > :not(:last-child)) {\n --tw-space-x-reverse: 0;\n margin-inline-start: calc(calc(0.25rem * 1.5) * var(--tw-space-x-reverse));\n margin-inline-end: calc(calc(0.25rem * 1.5) * calc(1 - var(--tw-space-x-reverse)));\n }\n .gap-y-0\\.5 {\n row-gap: calc(0.25rem * 0.5);\n }\n :where(.divide-y > :not(:last-child)) {\n --tw-divide-y-reverse: 0;\n border-bottom-style: var(--tw-border-style);\n border-top-style: var(--tw-border-style);\n border-top-width: calc(1px * var(--tw-divide-y-reverse));\n border-bottom-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));\n }\n :where(.divide-neutral > :not(:last-child)) {\n border-color: var(--atomic-neutral);\n }\n .self-center {\n align-self: center;\n }\n .self-start {\n align-self: flex-start;\n }\n .truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .overflow-auto {\n overflow: auto;\n }\n .overflow-hidden {\n overflow: hidden;\n }\n .overflow-x-auto {\n overflow-x: auto;\n }\n .overflow-x-scroll {\n overflow-x: scroll;\n }\n .overflow-y-auto {\n overflow-y: auto;\n }\n .scroll-smooth {\n scroll-behavior: smooth;\n }\n .rounded {\n border-radius: var(--atomic-border-radius);\n }\n .rounded-3xl {\n border-radius: 1.5rem;\n }\n .rounded-full {\n border-radius: calc(infinity * 1px);\n }\n .rounded-lg {\n border-radius: var(--atomic-border-radius-lg);\n }\n .rounded-md {\n border-radius: var(--atomic-border-radius-md);\n }\n .rounded-none {\n border-radius: 0;\n }\n .rounded-sm {\n border-radius: var(--atomic-border-radius);\n }\n .rounded-xl {\n border-radius: var(--atomic-border-radius-xl);\n }\n .rounded-tl-none {\n border-top-left-radius: 0;\n }\n .rounded-r-none {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .border {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .border-0 {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n .border-t {\n border-top-style: var(--tw-border-style);\n border-top-width: 1px;\n }\n .border-r {\n border-right-style: var(--tw-border-style);\n border-right-width: 1px;\n }\n .border-b {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 1px;\n }\n .border-b-1 {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 1px;\n }\n .border-l {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n .border-solid {\n --tw-border-style: solid;\n border-style: solid;\n }\n .border-gray-200 {\n border-color: oklch(0.928 0.006 264.531);\n }\n .border-neutral {\n border-color: var(--atomic-neutral);\n }\n .border-neutral-dark {\n border-color: var(--atomic-neutral-dark);\n }\n .border-neutral-dim {\n border-color: var(--atomic-neutral-dim);\n }\n .border-primary {\n border-color: var(--atomic-primary);\n }\n .border-primary-light {\n border-color: var(--atomic-primary-light);\n }\n .border-t-neutral {\n border-top-color: var(--atomic-neutral);\n }\n .border-b-neutral {\n border-bottom-color: var(--atomic-neutral);\n }\n .border-b-neutral-dim {\n border-bottom-color: var(--atomic-neutral-dim);\n }\n .border-l-neutral {\n border-left-color: var(--atomic-neutral);\n }\n .border-l-neutral-dim {\n border-left-color: var(--atomic-neutral-dim);\n }\n .bg-\\[\\#F1F2FF\\] {\n background-color: #F1F2FF;\n }\n .bg-\\[rgba\\(40\\,40\\,40\\,0\\.8\\)\\] {\n background-color: rgba(40,40,40,0.8);\n }\n .bg-background {\n background-color: var(--atomic-background);\n }\n .bg-error {\n background-color: var(--atomic-error);\n }\n .bg-gray-50 {\n background-color: oklch(0.985 0.002 247.839);\n }\n .bg-neutral {\n background-color: var(--atomic-neutral);\n }\n .bg-neutral-light {\n background-color: var(--atomic-neutral-light);\n }\n .bg-primary {\n background-color: var(--atomic-primary);\n }\n .bg-primary-background {\n background-color: var(--atomic-primary-background);\n }\n .bg-transparent {\n background-color: transparent;\n }\n .bg-white {\n background-color: #fff;\n }\n .bg-linear-to-l {\n --tw-gradient-position: to left;\n }\n @supports (background-image: linear-gradient(in lab, red, red)) {\n .bg-linear-to-l {\n --tw-gradient-position: to left in oklab;\n }\n }\n .bg-linear-to-l {\n background-image: linear-gradient(var(--tw-gradient-stops));\n }\n .bg-linear-to-r {\n --tw-gradient-position: to right;\n }\n @supports (background-image: linear-gradient(in lab, red, red)) {\n .bg-linear-to-r {\n --tw-gradient-position: to right in oklab;\n }\n }\n .bg-linear-to-r {\n background-image: linear-gradient(var(--tw-gradient-stops));\n }\n .from-background\\/60 {\n --tw-gradient-from: color-mix(in srgb, #ffffff 60%, transparent);\n }\n @supports (color: color-mix(in lab, red, red)) {\n .from-background\\/60 {\n --tw-gradient-from: color-mix(in oklab, var(--atomic-background) 60%, transparent);\n }\n }\n .from-background\\/60 {\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .from-more-results-progress-bar-color-from {\n --tw-gradient-from: var(\n --atomic-more-results-progress-bar-color-from,\n var(--atomic-primary-dark)\n );\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-more-results-progress-bar-color-to {\n --tw-gradient-to: var(\n --atomic-more-results-progress-bar-color-to,\n var(--atomic-primary-light)\n );\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .fill-current {\n fill: currentcolor;\n }\n .stroke-\\[1\\.25\\] {\n stroke-width: 1.25;\n }\n .object-contain {\n object-fit: contain;\n }\n .p-0 {\n padding: calc(0.25rem * 0);\n }\n .p-1 {\n padding: calc(0.25rem * 1);\n }\n .p-2 {\n padding: calc(0.25rem * 2);\n }\n .p-2\\.5 {\n padding: calc(0.25rem * 2.5);\n }\n .p-3 {\n padding: calc(0.25rem * 3);\n }\n .p-3\\.5 {\n padding: calc(0.25rem * 3.5);\n }\n .p-4 {\n padding: calc(0.25rem * 4);\n }\n .p-6 {\n padding: calc(0.25rem * 6);\n }\n .p-7 {\n padding: calc(0.25rem * 7);\n }\n .p-8 {\n padding: calc(0.25rem * 8);\n }\n .px-1 {\n padding-inline: calc(0.25rem * 1);\n }\n .px-2 {\n padding-inline: calc(0.25rem * 2);\n }\n .px-2\\.5 {\n padding-inline: calc(0.25rem * 2.5);\n }\n .px-3 {\n padding-inline: calc(0.25rem * 3);\n }\n .px-4 {\n padding-inline: calc(0.25rem * 4);\n }\n .px-6 {\n padding-inline: calc(0.25rem * 6);\n }\n .px-7 {\n padding-inline: calc(0.25rem * 7);\n }\n .px-9 {\n padding-inline: calc(0.25rem * 9);\n }\n .py-0\\.5 {\n padding-block: calc(0.25rem * 0.5);\n }\n .py-1 {\n padding-block: calc(0.25rem * 1);\n }\n .py-1\\.5 {\n padding-block: calc(0.25rem * 1.5);\n }\n .py-2 {\n padding-block: calc(0.25rem * 2);\n }\n .py-2\\.5 {\n padding-block: calc(0.25rem * 2.5);\n }\n .py-3 {\n padding-block: calc(0.25rem * 3);\n }\n .py-3\\.5 {\n padding-block: calc(0.25rem * 3.5);\n }\n .py-4 {\n padding-block: calc(0.25rem * 4);\n }\n .py-4\\.5 {\n padding-block: calc(0.25rem * 4.5);\n }\n .py-5 {\n padding-block: calc(0.25rem * 5);\n }\n .py-6 {\n padding-block: calc(0.25rem * 6);\n }\n .pt-0\\.5 {\n padding-top: calc(0.25rem * 0.5);\n }\n .pt-6 {\n padding-top: calc(0.25rem * 6);\n }\n .pt-8 {\n padding-top: calc(0.25rem * 8);\n }\n .pr-2 {\n padding-right: calc(0.25rem * 2);\n }\n .pr-4 {\n padding-right: calc(0.25rem * 4);\n }\n .pr-6 {\n padding-right: calc(0.25rem * 6);\n }\n .pr-8 {\n padding-right: calc(0.25rem * 8);\n }\n .pr-24 {\n padding-right: calc(0.25rem * 24);\n }\n .pb-1 {\n padding-bottom: calc(0.25rem * 1);\n }\n .pb-3 {\n padding-bottom: calc(0.25rem * 3);\n }\n .pb-4 {\n padding-bottom: calc(0.25rem * 4);\n }\n .pb-5 {\n padding-bottom: calc(0.25rem * 5);\n }\n .pb-6 {\n padding-bottom: calc(0.25rem * 6);\n }\n .pl-0 {\n padding-left: calc(0.25rem * 0);\n }\n .pl-1 {\n padding-left: calc(0.25rem * 1);\n }\n .pl-3 {\n padding-left: calc(0.25rem * 3);\n }\n .pl-7 {\n padding-left: calc(0.25rem * 7);\n }\n .pl-9 {\n padding-left: calc(0.25rem * 9);\n }\n .pl-10 {\n padding-left: calc(0.25rem * 10);\n }\n .text-center {\n text-align: center;\n }\n .text-left {\n text-align: left;\n }\n .align-baseline {\n vertical-align: baseline;\n }\n .align-bottom {\n vertical-align: bottom;\n }\n .align-middle {\n vertical-align: middle;\n }\n .font-sans {\n font-family: var(--atomic-font-family);\n }\n .set-font-size-sm {\n --font-size: var(--atomic-text-sm);\n font-size: var(--font-size);\n --line-height: calc(var(--font-size) * var(--atomic-line-height-ratio));\n line-height: var(--line-height);\n }\n .set-font-size-sm {\n --font-size: var(--atomic-text-sm);\n font-size: var(--font-size);\n --line-height: calc(var(--font-size) * var(--atomic-line-height-ratio));\n line-height: var(--line-height);\n }\n .set-font-size-sm {\n --font-size: var(--atomic-text-sm);\n font-size: var(--font-size);\n --line-height: calc(var(--font-size) * var(--atomic-line-height-ratio));\n line-height: var(--line-height);\n }\n .set-font-size-sm {\n --font-size: var(--atomic-text-sm);\n font-size: var(--font-size);\n --line-height: calc(var(--font-size) * var(--atomic-line-height-ratio));\n line-height: var(--line-height);\n }\n .set-font-size-sm {\n --font-size: var(--atomic-text-sm);\n font-size: var(--font-size);\n --line-height: calc(var(--font-size) * var(--atomic-line-height-ratio));\n line-height: var(--line-height);\n }\n .text-2xl {\n font-size: var(--atomic-text-2xl);\n line-height: var(--tw-leading, calc(2 / 1.5));\n }\n .text-base {\n font-size: var(--atomic-text-base);\n line-height: var(--tw-leading, calc(1.5 / 1));\n }\n .text-lg {\n font-size: var(--atomic-text-lg);\n line-height: var(--tw-leading, calc(1.75 / 1.125));\n }\n .text-sm {\n font-size: var(--atomic-text-sm);\n line-height: var(--tw-leading, calc(1.25 / 0.875));\n }\n .text-xl {\n font-size: var(--atomic-text-xl);\n line-height: var(--tw-leading, calc(1.75 / 1.25));\n }\n .text-xs {\n font-size: 0.75rem;\n line-height: var(--tw-leading, calc(1 / 0.75));\n }\n .text-xs\\/\\[1rem\\] {\n font-size: 0.75rem;\n line-height: 1rem;\n }\n .leading-4 {\n --tw-leading: calc(0.25rem * 4);\n line-height: calc(0.25rem * 4);\n }\n .leading-5 {\n --tw-leading: calc(0.25rem * 5);\n line-height: calc(0.25rem * 5);\n }\n .leading-6 {\n --tw-leading: calc(0.25rem * 6);\n line-height: calc(0.25rem * 6);\n }\n .leading-8 {\n --tw-leading: calc(0.25rem * 8);\n line-height: calc(0.25rem * 8);\n }\n .leading-10 {\n --tw-leading: calc(0.25rem * 10);\n line-height: calc(0.25rem * 10);\n }\n .leading-\\[1\\.5\\] {\n --tw-leading: 1.5;\n line-height: 1.5;\n }\n .leading-\\[calc\\(1\\/\\.75\\)\\] {\n --tw-leading: calc(1 / .75);\n line-height: calc(1 / .75);\n }\n .leading-\\[var\\(--line-height\\)\\] {\n --tw-leading: var(--line-height);\n line-height: var(--line-height);\n }\n .leading-none {\n --tw-leading: 1;\n line-height: 1;\n }\n .font-bold {\n --tw-font-weight: var(--atomic-font-bold);\n font-weight: var(--atomic-font-bold);\n }\n .font-light {\n --tw-font-weight: 300;\n font-weight: 300;\n }\n .font-medium {\n --tw-font-weight: 500;\n font-weight: 500;\n }\n .font-normal {\n --tw-font-weight: var(--atomic-font-normal);\n font-weight: var(--atomic-font-normal);\n }\n .font-semibold {\n --tw-font-weight: 600;\n font-weight: 600;\n }\n .break-words {\n overflow-wrap: break-word;\n }\n .break-all {\n word-break: break-all;\n }\n .break-keep {\n word-break: keep-all;\n }\n .text-ellipsis {\n text-overflow: ellipsis;\n }\n .whitespace-normal {\n white-space: normal;\n }\n .whitespace-nowrap {\n white-space: nowrap;\n }\n .whitespace-pre-wrap {\n white-space: pre-wrap;\n }\n .text-\\[\\#54698D\\] {\n color: #54698D;\n }\n .text-\\[inherit\\] {\n color: inherit;\n }\n .text-black {\n color: #000;\n }\n .text-error {\n color: var(--atomic-error);\n }\n .text-gray-500 {\n color: oklch(0.551 0.027 264.364);\n }\n .text-gray-600 {\n color: oklch(0.446 0.03 256.802);\n }\n .text-gray-700 {\n color: oklch(0.373 0.034 259.733);\n }\n .text-gray-900 {\n color: oklch(0.21 0.034 264.665);\n }\n .text-green-600 {\n color: oklch(0.627 0.194 149.214);\n }\n .text-inline-code {\n color: var(--atomic-inline-code);\n }\n .text-neutral {\n color: var(--atomic-neutral);\n }\n .text-neutral-dark {\n color: var(--atomic-neutral-dark);\n }\n .text-on-background {\n color: var(--atomic-on-background);\n }\n .text-on-primary {\n color: var(--atomic-on-primary);\n }\n .text-primary {\n color: var(--atomic-primary);\n }\n .text-primary-light {\n color: var(--atomic-primary-light);\n }\n .text-rating-icon-active {\n color: var(--atomic-rating-icon-active-color, #f6ce3c);\n }\n .text-rating-icon-inactive {\n color: var(\n --atomic-rating-icon-inactive-color,\n var(--atomic-neutral)\n );\n }\n .text-red-600 {\n color: oklch(0.577 0.245 27.325);\n }\n .text-success {\n color: var(--atomic-success);\n }\n .text-transparent {\n color: transparent;\n }\n .capitalize {\n text-transform: capitalize;\n }\n .lowercase {\n text-transform: lowercase;\n }\n .italic {\n font-style: italic;\n }\n .line-through {\n text-decoration-line: line-through;\n }\n .placeholder-neutral-dark::placeholder {\n color: var(--atomic-neutral-dark);\n }\n .opacity-0 {\n opacity: 0%;\n }\n .opacity-50 {\n opacity: 50%;\n }\n .opacity-60 {\n opacity: 60%;\n }\n .opacity-80 {\n opacity: 80%;\n }\n .shadow {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-inner-primary {\n --tw-shadow: inset 0 0 0 1px var(--tw-shadow-color, var(--atomic-primary));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-lg {\n --tw-shadow: 0px 2px 8px var(--tw-shadow-color, rgba(229, 232, 232, 0.75));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-t-lg {\n --tw-shadow: 0px -2px 8px var(--tw-shadow-color, rgba(229, 232, 232, 0.75));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring-3 {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring-primary {\n --tw-ring-color: var(--atomic-primary);\n }\n .ring-ring-primary {\n --tw-ring-color: var(--atomic-ring-primary);\n }\n .outline {\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\n }\n .outline-error {\n outline-color: var(--atomic-error);\n }\n .outline-neutral {\n outline-color: var(--atomic-neutral);\n }\n .outline-primary {\n outline-color: var(--atomic-primary);\n }\n .blur {\n --tw-blur: blur(8px);\n filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n }\n .grayscale {\n --tw-grayscale: grayscale(100%);\n filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n }\n .invert {\n --tw-invert: invert(100%);\n filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n }\n .filter {\n filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n }\n .transition {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(0.4, 0, 0.2, 1)));\n transition-duration: var(--tw-duration, var(--default-transition-duration, 150ms));\n }\n .transition-\\[visibility\\] {\n transition-property: visibility;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(0.4, 0, 0.2, 1)));\n transition-duration: var(--tw-duration, var(--default-transition-duration, 150ms));\n }\n .transition-all {\n transition-property: all;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(0.4, 0, 0.2, 1)));\n transition-duration: var(--tw-duration, var(--default-transition-duration, 150ms));\n }\n .transition-colors {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(0.4, 0, 0.2, 1)));\n transition-duration: var(--tw-duration, var(--default-transition-duration, 150ms));\n }\n .transition-opacity {\n transition-property: opacity;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(0.4, 0, 0.2, 1)));\n transition-duration: var(--tw-duration, var(--default-transition-duration, 150ms));\n }\n .duration-200 {\n --tw-duration: 200ms;\n transition-duration: 200ms;\n }\n .duration-300 {\n --tw-duration: 300ms;\n transition-duration: 300ms;\n }\n .duration-500 {\n --tw-duration: 500ms;\n transition-duration: 500ms;\n }\n .ease-in-out {\n --tw-ease: cubic-bezier(0.4, 0, 0.2, 1);\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n .\\[grid-area\\:modal\\] {\n grid-area: modal;\n }\n .\\[scrollbar-gutter\\:stable_both-edges\\] {\n scrollbar-gutter: stable both-edges;\n }\n @media (hover: hover) {\n .group-hover\\:visible:is(:where(.group):hover *) {\n visibility: visible;\n }\n }\n @media (hover: hover) {\n .group-hover\\:text-error:is(:where(.group):hover *) {\n color: var(--atomic-error);\n }\n }\n @media (hover: hover) {\n .group-hover\\:text-primary:is(:where(.group):hover *) {\n color: var(--atomic-primary);\n }\n }\n @media (hover: hover) {\n .group-hover\\:text-primary-light:is(:where(.group):hover *) {\n color: var(--atomic-primary-light);\n }\n }\n .group-focus\\:text-primary:is(:where(.group):focus *) {\n color: var(--atomic-primary);\n }\n .group-focus\\:text-primary-light:is(:where(.group):focus *) {\n color: var(--atomic-primary-light);\n }\n .group-focus-visible\\:text-error:is(:where(.group):focus-visible *) {\n color: var(--atomic-error);\n }\n .group-focus-visible\\:text-primary:is(:where(.group):focus-visible *) {\n color: var(--atomic-primary);\n }\n .peer-focus-within\\:border-primary-light:is(:where(.peer):focus-within ~ *) {\n border-color: var(--atomic-primary-light);\n }\n .peer-focus-within\\:text-primary-light:is(:where(.peer):focus-within ~ *) {\n color: var(--atomic-primary-light);\n }\n @media (hover: hover) {\n .peer-hover\\:border-primary-light:is(:where(.peer):hover ~ *) {\n border-color: var(--atomic-primary-light);\n }\n }\n @media (hover: hover) {\n .peer-hover\\:text-error:is(:where(.peer):hover ~ *) {\n color: var(--atomic-error);\n }\n }\n @media (hover: hover) {\n .peer-hover\\:text-primary-light:is(:where(.peer):hover ~ *) {\n color: var(--atomic-primary-light);\n }\n }\n .before\\:inline::before {\n content: var(--tw-content);\n display: inline;\n }\n .before\\:content-\\[\\'\\,\\\\00a0\\'\\]::before {\n --tw-content: ',\\00a0';\n content: var(--tw-content);\n }\n .after\\:absolute::after {\n content: var(--tw-content);\n position: absolute;\n }\n .after\\:-bottom-0\\.5::after {\n content: var(--tw-content);\n bottom: calc(0.25rem * -0.5);\n }\n .after\\:block::after {\n content: var(--tw-content);\n display: block;\n }\n .after\\:h-1::after {\n content: var(--tw-content);\n height: calc(0.25rem * 1);\n }\n .after\\:w-full::after {\n content: var(--tw-content);\n width: 100%;\n }\n .after\\:rounded::after {\n content: var(--tw-content);\n border-radius: var(--atomic-border-radius);\n }\n .after\\:bg-primary::after {\n content: var(--tw-content);\n background-color: var(--atomic-primary);\n }\n .focus-within\\:border-disabled:focus-within {\n border-color: var(--atomic-disabled);\n }\n .focus-within\\:border-primary:focus-within {\n border-color: var(--atomic-primary);\n }\n .focus-within\\:ring-3:focus-within {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .focus-within\\:ring-neutral:focus-within {\n --tw-ring-color: var(--atomic-neutral);\n }\n .focus-within\\:ring-ring-primary:focus-within {\n --tw-ring-color: var(--atomic-ring-primary);\n }\n @media (hover: hover) {\n .hover\\:border:hover {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n }\n @media (hover: hover) {\n .hover\\:border-error:hover {\n border-color: var(--atomic-error);\n }\n }\n @media (hover: hover) {\n .hover\\:border-primary-light:hover {\n border-color: var(--atomic-primary-light);\n }\n }\n @media (hover: hover) {\n .hover\\:bg-error:hover {\n background-color: var(--atomic-error);\n }\n }\n @media (hover: hover) {\n .hover\\:bg-neutral-light:hover {\n background-color: var(--atomic-neutral-light);\n }\n }\n @media (hover: hover) {\n .hover\\:bg-primary-light:hover {\n background-color: var(--atomic-primary-light);\n }\n }\n @media (hover: hover) {\n .hover\\:bg-transparent:hover {\n background-color: transparent;\n }\n }\n @media (hover: hover) {\n .hover\\:fill-white:hover {\n fill: #fff;\n }\n }\n @media (hover: hover) {\n .hover\\:text-error:hover {\n color: var(--atomic-error);\n }\n }\n @media (hover: hover) {\n .hover\\:text-primary:hover {\n color: var(--atomic-primary);\n }\n }\n @media (hover: hover) {\n .hover\\:text-primary-light:hover {\n color: var(--atomic-primary-light);\n }\n }\n @media (hover: hover) {\n .hover\\:text-success:hover {\n color: var(--atomic-success);\n }\n }\n @media (hover: hover) {\n .hover\\:underline:hover {\n text-decoration-line: underline;\n }\n }\n @media (hover: hover) {\n .hover\\:opacity-100:hover {\n opacity: 100%;\n }\n }\n @media (hover: hover) {\n .hover\\:shadow-sm:hover {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus\\:border-primary:focus {\n border-color: var(--atomic-primary);\n }\n .focus\\:opacity-100:focus {\n opacity: 100%;\n }\n .focus\\:ring-1:focus {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .focus\\:ring-primary:focus {\n --tw-ring-color: var(--atomic-primary);\n }\n .focus\\:outline-hidden:focus {\n --tw-outline-style: none;\n outline-style: none;\n }\n @media (forced-colors: active) {\n .focus\\:outline-hidden:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n .focus\\:outline-none:focus {\n --tw-outline-style: none;\n outline-style: none;\n }\n .focus-visible\\:border:focus-visible {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .focus-visible\\:border-error:focus-visible {\n border-color: var(--atomic-error);\n }\n .focus-visible\\:border-primary:focus-visible {\n border-color: var(--atomic-primary);\n }\n .focus-visible\\:border-primary-light:focus-visible {\n border-color: var(--atomic-primary-light);\n }\n .focus-visible\\:bg-error:focus-visible {\n background-color: var(--atomic-error);\n }\n .focus-visible\\:bg-neutral-light:focus-visible {\n background-color: var(--atomic-neutral-light);\n }\n .focus-visible\\:bg-primary-light:focus-visible {\n background-color: var(--atomic-primary-light);\n }\n .focus-visible\\:text-primary-light:focus-visible {\n color: var(--atomic-primary-light);\n }\n .focus-visible\\:underline:focus-visible {\n text-decoration-line: underline;\n }\n .focus-visible\\:ring-2:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .focus-visible\\:outline-none:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .disabled\\:cursor-not-allowed:disabled {\n cursor: not-allowed;\n }\n .disabled\\:bg-neutral-light:disabled {\n background-color: var(--atomic-neutral-light);\n }\n .disabled\\:bg-primary\\/60:disabled {\n background-color: color-mix(in srgb, #126ce0 60%, transparent);\n }\n @supports (color: color-mix(in lab, red, red)) {\n .disabled\\:bg-primary\\/60:disabled {\n background-color: color-mix(in oklab, var(--atomic-primary) 60%, transparent);\n }\n }\n .disabled\\:text-neutral-dark:disabled {\n color: var(--atomic-neutral-dark);\n }\n .disabled\\:opacity-100:disabled {\n opacity: 100%;\n }\n @media (width >= 1024px) {\n .desktop\\:mt-2 {\n margin-top: calc(0.25rem * 2);\n }\n }\n @media (width >= 40rem) {\n .sm\\:px-6 {\n padding-inline: calc(0.25rem * 6);\n }\n }\n .\\[part\\=\\\"breadcrumb-button\\\"\\]\\:visible:is(part=\"breadcrumb-button\") {\n visibility: visible;\n }\n}\n@layer theme, base, components, utilities;\n@layer components {\n .input-primary {\n border-radius: var(--atomic-border-radius);\n border-style: var(--tw-border-style);\n border-width: 1px;\n border-color: var(--atomic-neutral);\n background-color: var(--atomic-background);\n }\n @media (hover: hover) {\n .input-primary:hover {\n border-color: var(--atomic-primary-light);\n }\n }\n .input-primary:focus-visible {\n border-color: var(--atomic-primary);\n }\n .input-primary:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .input-primary:focus-visible {\n --tw-ring-color: var(--atomic-ring-primary);\n }\n .input-primary:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-radio {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n }\n .btn-radio::before {\n --tw-content: attr(value);\n content: var(--tw-content);\n }\n .btn-primary {\n border-radius: var(--atomic-border-radius);\n background-color: var(--atomic-primary);\n color: var(--atomic-on-primary);\n }\n @media (hover: hover) {\n .btn-primary:hover {\n background-color: var(--atomic-primary-light);\n }\n }\n .btn-primary:focus-visible {\n background-color: var(--atomic-primary-light);\n }\n .btn-primary:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .btn-primary:focus-visible {\n --tw-ring-color: var(--atomic-ring-primary);\n }\n .btn-primary:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-primary:disabled {\n cursor: not-allowed;\n }\n .btn-primary:disabled {\n background-color: var(--atomic-disabled);\n }\n .btn-outline-primary {\n border-radius: var(--atomic-border-radius);\n border-style: var(--tw-border-style);\n border-width: 1px;\n border-color: var(--atomic-neutral);\n background-color: var(--atomic-background);\n color: var(--atomic-primary);\n }\n @media (hover: hover) {\n .btn-outline-primary:hover {\n border-color: var(--atomic-primary-light);\n }\n }\n @media (hover: hover) {\n .btn-outline-primary:hover {\n color: var(--atomic-primary-light);\n }\n }\n .btn-outline-primary:focus-visible {\n border-color: var(--atomic-primary);\n }\n .btn-outline-primary:focus-visible {\n color: var(--atomic-primary);\n }\n .btn-outline-primary:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .btn-outline-primary:focus-visible {\n --tw-ring-color: var(--atomic-ring-primary);\n }\n .btn-outline-primary:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-outline-primary:disabled {\n cursor: not-allowed;\n }\n .btn-outline-primary:disabled {\n border-color: var(--atomic-neutral);\n }\n .btn-outline-primary:disabled {\n color: var(--atomic-neutral);\n }\n .btn-text-primary {\n border-radius: var(--atomic-border-radius);\n background-color: var(--atomic-background);\n color: var(--atomic-primary);\n }\n @media (hover: hover) {\n .btn-text-primary:hover {\n background-color: var(--atomic-neutral-light);\n }\n }\n .btn-text-primary:focus-visible {\n background-color: var(--atomic-neutral-light);\n }\n .btn-text-primary:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-outline-neutral {\n border-radius: var(--atomic-border-radius);\n border-style: var(--tw-border-style);\n border-width: 1px;\n border-color: var(--atomic-neutral);\n background-color: var(--atomic-background);\n color: var(--atomic-on-background);\n }\n @media (hover: hover) {\n .btn-outline-neutral:hover {\n border-color: var(--atomic-primary);\n }\n }\n @media (hover: hover) {\n .btn-outline-neutral:hover {\n color: var(--atomic-primary);\n }\n }\n .btn-outline-neutral:focus-visible {\n border-color: var(--atomic-primary);\n }\n .btn-outline-neutral:focus-visible {\n color: var(--atomic-primary);\n }\n .btn-outline-neutral:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .btn-outline-neutral:focus-visible {\n --tw-ring-color: var(--atomic-ring-primary);\n }\n .btn-outline-neutral:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-outline-neutral:disabled {\n cursor: not-allowed;\n }\n .btn-outline-neutral:disabled {\n border-color: var(--atomic-neutral);\n }\n .btn-outline-neutral:disabled {\n color: var(--atomic-on-background);\n }\n .btn-outline-neutral:disabled {\n opacity: 50%;\n }\n .btn-outline-bg-neutral {\n border-radius: var(--atomic-border-radius);\n border-style: var(--tw-border-style);\n border-width: 1px;\n border-color: var(--atomic-neutral);\n background-color: var(--atomic-background);\n color: var(--atomic-on-background);\n }\n @media (hover: hover) {\n .btn-outline-bg-neutral:hover {\n border-color: var(--atomic-primary);\n }\n }\n @media (hover: hover) {\n .btn-outline-bg-neutral:hover {\n background-color: var(--atomic-neutral-light);\n }\n }\n @media (hover: hover) {\n .btn-outline-bg-neutral:hover {\n color: var(--atomic-primary);\n }\n }\n .btn-outline-bg-neutral:focus-visible {\n border-color: var(--atomic-primary);\n }\n .btn-outline-bg-neutral:focus-visible {\n background-color: var(--atomic-neutral-light);\n }\n .btn-outline-bg-neutral:focus-visible {\n color: var(--atomic-primary);\n }\n .btn-outline-bg-neutral:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .btn-outline-bg-neutral:focus-visible {\n --tw-ring-color: var(--atomic-ring-primary);\n }\n .btn-outline-bg-neutral:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-outline-bg-neutral:disabled {\n cursor: not-allowed;\n }\n .btn-outline-bg-neutral:disabled {\n border-color: var(--atomic-neutral);\n }\n .btn-outline-bg-neutral:disabled {\n color: var(--atomic-on-background);\n }\n .btn-outline-bg-neutral:disabled {\n opacity: 50%;\n }\n .btn-outline-bg-error {\n border-radius: var(--atomic-border-radius);\n border-style: var(--tw-border-style);\n border-width: 1px;\n border-color: var(--atomic-neutral);\n background-color: var(--atomic-background);\n color: var(--atomic-on-background);\n }\n @media (hover: hover) {\n .btn-outline-bg-error:hover {\n border-color: var(--atomic-primary);\n }\n }\n @media (hover: hover) {\n .btn-outline-bg-error:hover {\n background-color: var(--atomic-neutral-light);\n }\n }\n @media (hover: hover) {\n .btn-outline-bg-error:hover {\n color: var(--atomic-primary);\n }\n }\n .btn-outline-bg-error:focus-visible {\n border-color: var(--atomic-primary);\n }\n .btn-outline-bg-error:focus-visible {\n background-color: var(--atomic-neutral-light);\n }\n .btn-outline-bg-error:focus-visible {\n color: var(--atomic-primary);\n }\n .btn-outline-bg-error:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .btn-outline-bg-error:focus-visible {\n --tw-ring-color: var(--atomic-ring-primary);\n }\n .btn-outline-bg-error:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-outline-bg-error:disabled {\n cursor: not-allowed;\n }\n .btn-outline-bg-error:disabled {\n border-color: var(--atomic-neutral);\n }\n .btn-outline-bg-error:disabled {\n color: var(--atomic-on-background);\n }\n .btn-outline-bg-error:disabled {\n opacity: 50%;\n }\n .btn-outline-error {\n border-radius: var(--atomic-border-radius);\n border-style: var(--tw-border-style);\n border-width: 1px;\n border-color: var(--atomic-neutral);\n background-color: var(--atomic-background);\n color: var(--atomic-on-background);\n }\n @media (hover: hover) {\n .btn-outline-error:hover {\n border-color: var(--atomic-error);\n }\n }\n @media (hover: hover) {\n .btn-outline-error:hover {\n color: var(--atomic-error);\n }\n }\n .btn-outline-error:focus-visible {\n border-color: var(--atomic-error);\n }\n .btn-outline-error:focus-visible {\n color: var(--atomic-error);\n }\n .btn-outline-error:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .btn-outline-error:focus-visible {\n --tw-ring-color: var(--atomic-ring-primary);\n }\n .btn-outline-error:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-outline-error:disabled {\n cursor: not-allowed;\n }\n .btn-outline-error:disabled {\n border-color: var(--atomic-neutral);\n }\n .btn-outline-error:disabled {\n color: var(--atomic-on-background);\n }\n .btn-outline-error:disabled {\n opacity: 50%;\n }\n .btn-text-neutral {\n border-radius: var(--atomic-border-radius);\n background-color: var(--atomic-background);\n color: var(--atomic-on-background);\n }\n @media (hover: hover) {\n .btn-text-neutral:hover {\n background-color: var(--atomic-neutral-light);\n }\n }\n @media (hover: hover) {\n .btn-text-neutral:hover {\n color: var(--atomic-primary);\n }\n }\n .btn-text-neutral:focus-visible {\n background-color: var(--atomic-neutral-light);\n }\n .btn-text-neutral:focus-visible {\n color: var(--atomic-primary);\n }\n .btn-text-neutral:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-text-transparent {\n color: var(--atomic-on-background);\n }\n @media (hover: hover) {\n .btn-text-transparent:hover {\n color: var(--atomic-primary-light);\n }\n }\n .btn-text-transparent:focus-visible {\n color: var(--atomic-primary-light);\n }\n .btn-square-neutral {\n border-style: var(--tw-border-style);\n border-width: 1px;\n border-color: var(--atomic-neutral);\n background-color: var(--atomic-background);\n color: var(--atomic-on-background);\n }\n @media (hover: hover) {\n .btn-square-neutral:hover {\n background-color: var(--atomic-neutral-light);\n }\n }\n .btn-square-neutral:focus-visible {\n background-color: var(--atomic-neutral-light);\n }\n .btn-square-neutral:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-page {\n display: grid;\n height: calc(0.25rem * 10);\n width: calc(0.25rem * 10);\n place-items: center;\n border-style: var(--tw-border-style);\n border-width: 0px;\n font-size: var(--atomic-text-lg);\n line-height: var(--tw-leading, calc(1.75 / 1.125));\n }\n @media (hover: hover) {\n .btn-page:hover {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n }\n .btn-page:focus-visible {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .btn-page.selected {\n border-style: var(--tw-border-style);\n border-width: 2px;\n border-color: var(--atomic-primary);\n --tw-font-weight: var(--atomic-font-bold);\n font-weight: var(--atomic-font-bold);\n }\n}\n@layer base {\n :host {\n display: block;\n }\n :host, button, input, select {\n font-family: var(--atomic-font-family);\n font-size: var(--atomic-text-base);\n line-height: var(--tw-leading, calc(1.5 / 1));\n --tw-font-weight: var(--atomic-font-normal);\n font-weight: var(--atomic-font-normal);\n }\n button {\n cursor: pointer;\n }\n :host(.atomic-hidden) {\n display: none;\n }\n .ripple {\n position: absolute;\n pointer-events: none;\n transform: scale(0);\n border-radius: 50%;\n animation: ripple var(--animation-duration) linear;\n }\n .ripple-relative {\n position: relative;\n }\n .ripple-parent {\n overflow: hidden;\n }\n @keyframes ripple {\n to {\n transform: scale(4);\n opacity: 0;\n }\n }\n}\n[part='generated-text'] {\n --font-size: var(--atomic-text-lg);\n font-size: var(--font-size);\n --line-height: calc(var(--font-size) * var(--atomic-line-height-ratio));\n line-height: var(--line-height);\n}\n[part='generated-text'].cursor::after {\n content: '';\n width: 8px;\n height: 1em;\n margin-left: 0.1em;\n background-color: var(--atomic-neutral-dark);\n display: inline-block;\n animation: cursor-blink 1.5s steps(2) infinite;\n vertical-align: text-bottom;\n}\n[part='generated-text'] [part='answer-heading-1'] {\n font-size: var(--atomic-text-2xl);\n line-height: var(--tw-leading, calc(2 / 1.5));\n}\n[part='generated-text'] [part='answer-heading-2'] {\n font-size: var(--atomic-text-xl);\n line-height: var(--tw-leading, calc(1.75 / 1.25));\n}\n[part='generated-text'] [part='answer-heading-3'], [part='generated-text'] [part='answer-heading-4'], [part='generated-text'] [part='answer-heading-5'], [part='generated-text'] [part='answer-heading-6'] {\n font-size: var(--atomic-text-lg);\n line-height: var(--tw-leading, calc(1.75 / 1.125));\n}\n[part='generated-text'] [part='answer-heading-1'], [part='generated-text'] [part='answer-heading-2'], [part='generated-text'] [part='answer-heading-3'], [part='generated-text'] [part='answer-heading-4'], [part='generated-text'] [part='answer-heading-5'], [part='generated-text'] [part='answer-heading-6'] {\n margin-top: calc(0.25rem * 4);\n margin-bottom: calc(0.25rem * 2);\n --tw-font-weight: var(--atomic-font-bold);\n font-weight: var(--atomic-font-bold);\n}\n[part='generated-text'] [part='answer-paragraph'] {\n margin-bottom: calc(0.25rem * 6);\n}\n[part='generated-text'] [part='answer-list-item'], [part='generated-text'] [part='answer-paragraph'], [part='generated-text'] [part='answer-quote-block'], [part='generated-text'] [part='answer-table-header'], [part='generated-text'] [part='answer-table-content'] {\n --tw-leading: calc(0.25rem * 6);\n line-height: calc(0.25rem * 6);\n}\n[part='generated-text'] [part='answer-strong'] {\n --tw-font-weight: var(--atomic-font-bold);\n font-weight: var(--atomic-font-bold);\n}\n[part='generated-text'] [part='answer-ordered-list'] {\n margin-bottom: calc(0.25rem * 2);\n list-style-type: decimal;\n padding-inline-start: calc(0.25rem * 8);\n}\n[part='generated-text'] [part='answer-unordered-list'] {\n margin-bottom: calc(0.25rem * 2);\n list-style-type: disc;\n padding-inline-start: calc(0.25rem * 8);\n}\n[part='generated-text'] [part='answer-inline-code'] {\n border-radius: var(--atomic-border-radius);\n border-style: var(--tw-border-style);\n border-width: 1px;\n --tw-border-style: solid;\n border-style: solid;\n border-color: var(--atomic-neutral);\n background-color: var(--atomic-neutral-light);\n padding-inline: calc(0.25rem * 1);\n padding-block: calc(0.25rem * 0.5);\n font-size: var(--atomic-text-sm);\n line-height: var(--tw-leading, calc(1.25 / 0.875));\n color: var(--atomic-inline-code);\n}\n[part='generated-text'] [part='answer-code-block'] {\n margin-block: calc(0.25rem * 4);\n max-height: calc(0.25rem * 96);\n overflow: auto;\n border-radius: var(--atomic-border-radius-md);\n border-style: var(--tw-border-style);\n border-width: 1px;\n --tw-border-style: solid;\n border-style: solid;\n border-color: var(--atomic-neutral);\n background-color: var(--atomic-neutral-light);\n padding: calc(0.25rem * 2);\n font-size: var(--atomic-text-sm);\n line-height: var(--tw-leading, calc(1.25 / 0.875));\n color: var(--atomic-on-background);\n scrollbar-color: var(--atomic-neutral);\n}\n[part='generated-text'] [part='answer-quote-block'] {\n margin-inline: calc(0.25rem * 16);\n font-style: italic;\n}\n[part='generated-text'] [part='answer-table-container'] {\n margin-bottom: calc(0.25rem * 6);\n display: inline-block;\n max-height: calc(0.25rem * 96);\n max-width: 100%;\n overflow: auto;\n border-radius: var(--atomic-border-radius-md);\n border-style: var(--tw-border-style);\n border-width: 1px;\n --tw-border-style: solid;\n border-style: solid;\n border-color: var(--atomic-neutral-dim);\n}\n[part='generated-text'] [part='answer-table-container'] [part='answer-table-header'] {\n position: sticky;\n top: calc(0.25rem * 0);\n}\n[part='generated-text'] [part='answer-table'] {\n font-size: var(--atomic-text-base);\n line-height: var(--tw-leading, calc(1.5 / 1));\n}\n[part='generated-text'] [part='answer-table'] thead [part='answer-table-header'] {\n border-bottom-color: var(--atomic-neutral-dim);\n border-left-color: var(--atomic-neutral-dim);\n background-color: var(--atomic-neutral);\n padding: calc(0.25rem * 4);\n text-align: left;\n --tw-font-weight: var(--atomic-font-bold);\n font-weight: var(--atomic-font-bold);\n}\n[part='generated-text'] [part='answer-table'] thead [part='answer-table-header']:first-of-type {\n border-left: none;\n}\n[part='generated-text'] [part='answer-table'] tbody tr:nth-child(even) {\n background-color: var(--atomic-neutral-light);\n}\n[part='generated-text'] [part='answer-table'] tbody tr [part='answer-table-content'] {\n border-style: var(--tw-border-style);\n border-width: 1px;\n border-bottom-color: var(--atomic-neutral-dim);\n border-left-color: var(--atomic-neutral-dim);\n padding: calc(0.25rem * 4);\n}\n[part='generated-text'] [part='answer-table'] tbody tr [part='answer-table-content']:first-of-type {\n border-left: none;\n}\n[part='generated-text'] [part='answer-table'] tbody tr:last-of-type [part='answer-table-content'] {\n border-bottom: unset;\n}\n@layer properties {\n *, :before, :after, ::backdrop {\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-translate-z: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-scale-z: 1;\n --tw-rotate-x: initial;\n --tw-rotate-y: initial;\n --tw-rotate-z: initial;\n --tw-skew-x: initial;\n --tw-skew-y: initial;\n --tw-space-x-reverse: 0;\n --tw-divide-y-reverse: 0;\n --tw-border-style: solid;\n --tw-gradient-position: initial;\n --tw-gradient-from: #0000;\n --tw-gradient-via: #0000;\n --tw-gradient-to: #0000;\n --tw-gradient-stops: initial;\n --tw-gradient-via-stops: initial;\n --tw-gradient-from-position: 0%;\n --tw-gradient-via-position: 50%;\n --tw-gradient-to-position: 100%;\n --tw-leading: initial;\n --tw-font-weight: initial;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-color: initial;\n --tw-shadow-alpha: 100%;\n --tw-inset-shadow: 0 0 #0000;\n --tw-inset-shadow-color: initial;\n --tw-inset-shadow-alpha: 100%;\n --tw-ring-color: initial;\n --tw-ring-shadow: 0 0 #0000;\n --tw-inset-ring-color: initial;\n --tw-inset-ring-shadow: 0 0 #0000;\n --tw-ring-inset: initial;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-outline-style: solid;\n --tw-blur: initial;\n --tw-brightness: initial;\n --tw-contrast: initial;\n --tw-grayscale: initial;\n --tw-hue-rotate: initial;\n --tw-invert: initial;\n --tw-opacity: initial;\n --tw-saturate: initial;\n --tw-sepia: initial;\n --tw-drop-shadow: initial;\n --tw-drop-shadow-color: initial;\n --tw-drop-shadow-alpha: 100%;\n --tw-drop-shadow-size: initial;\n --tw-duration: initial;\n --tw-ease: initial;\n --tw-content: \"\";\n }\n}\n@layer theme, base, components, utilities;\n@layer theme;\n@layer base {\n *, ::after, ::before, ::backdrop, ::file-selector-button {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0 solid;\n }\n html, :host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n tab-size: 4;\n font-family: var(--default-font-family, var(--atomic-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"));\n font-feature-settings: var(--default-font-feature-settings, normal);\n font-variation-settings: var(--default-font-variation-settings, normal);\n -webkit-tap-highlight-color: transparent;\n }\n hr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n }\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n h1, h2, h3, h4, h5, h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n b, strong {\n font-weight: bolder;\n }\n code, kbd, samp, pre {\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\",\n \"Courier New\", monospace);\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\n font-size: 1em;\n }\n small {\n font-size: 80%;\n }\n sub, sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n sub {\n bottom: -0.25em;\n }\n sup {\n top: -0.5em;\n }\n table {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n }\n :-moz-focusring {\n outline: auto;\n }\n progress {\n vertical-align: baseline;\n }\n summary {\n display: list-item;\n }\n ol, ul, menu {\n list-style: none;\n }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n vertical-align: middle;\n }\n img, video {\n max-width: 100%;\n height: auto;\n }\n button, input, select, optgroup, textarea, ::file-selector-button {\n font: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n letter-spacing: inherit;\n color: inherit;\n border-radius: 0;\n background-color: transparent;\n opacity: 1;\n }\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n ::placeholder {\n opacity: 1;\n }\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\n ::placeholder {\n color: currentcolor;\n }\n @supports (color: color-mix(in lab, red, red)) {\n ::placeholder {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n }\n textarea {\n resize: vertical;\n }\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n ::-webkit-date-and-time-value {\n min-height: 1lh;\n text-align: inherit;\n }\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n ::-webkit-calendar-picker-indicator {\n line-height: 1;\n }\n :-moz-ui-invalid {\n box-shadow: none;\n }\n button, input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]), ::file-selector-button {\n appearance: button;\n }\n ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {\n height: auto;\n }\n [hidden]:where(:not([hidden=\"until-found\"])) {\n display: none !important;\n }\n}\n@layer utilities;\n@layer theme, base, components, utilities;\n@layer components {\n .input-primary {\n border-radius: var(--atomic-border-radius);\n border-style: var(--tw-border-style);\n border-width: 1px;\n border-color: var(--atomic-neutral);\n background-color: var(--atomic-background);\n }\n @media (hover: hover) {\n .input-primary:hover {\n border-color: var(--atomic-primary-light);\n }\n }\n .input-primary:focus-visible {\n border-color: var(--atomic-primary);\n }\n .input-primary:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .input-primary:focus-visible {\n --tw-ring-color: var(--atomic-ring-primary);\n }\n .input-primary:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-radio {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n }\n .btn-radio::before {\n --tw-content: attr(value);\n content: var(--tw-content);\n }\n .btn-primary {\n border-radius: var(--atomic-border-radius);\n background-color: var(--atomic-primary);\n color: var(--atomic-on-primary);\n }\n @media (hover: hover) {\n .btn-primary:hover {\n background-color: var(--atomic-primary-light);\n }\n }\n .btn-primary:focus-visible {\n background-color: var(--atomic-primary-light);\n }\n .btn-primary:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .btn-primary:focus-visible {\n --tw-ring-color: var(--atomic-ring-primary);\n }\n .btn-primary:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-primary:disabled {\n cursor: not-allowed;\n }\n .btn-primary:disabled {\n background-color: var(--atomic-disabled);\n }\n .btn-outline-primary {\n border-radius: var(--atomic-border-radius);\n border-style: var(--tw-border-style);\n border-width: 1px;\n border-color: var(--atomic-neutral);\n background-color: var(--atomic-background);\n color: var(--atomic-primary);\n }\n @media (hover: hover) {\n .btn-outline-primary:hover {\n border-color: var(--atomic-primary-light);\n }\n }\n @media (hover: hover) {\n .btn-outline-primary:hover {\n color: var(--atomic-primary-light);\n }\n }\n .btn-outline-primary:focus-visible {\n border-color: var(--atomic-primary);\n }\n .btn-outline-primary:focus-visible {\n color: var(--atomic-primary);\n }\n .btn-outline-primary:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .btn-outline-primary:focus-visible {\n --tw-ring-color: var(--atomic-ring-primary);\n }\n .btn-outline-primary:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-outline-primary:disabled {\n cursor: not-allowed;\n }\n .btn-outline-primary:disabled {\n border-color: var(--atomic-neutral);\n }\n .btn-outline-primary:disabled {\n color: var(--atomic-neutral);\n }\n .btn-text-primary {\n border-radius: var(--atomic-border-radius);\n background-color: var(--atomic-background);\n color: var(--atomic-primary);\n }\n @media (hover: hover) {\n .btn-text-primary:hover {\n background-color: var(--atomic-neutral-light);\n }\n }\n .btn-text-primary:focus-visible {\n background-color: var(--atomic-neutral-light);\n }\n .btn-text-primary:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-outline-neutral {\n border-radius: var(--atomic-border-radius);\n border-style: var(--tw-border-style);\n border-width: 1px;\n border-color: var(--atomic-neutral);\n background-color: var(--atomic-background);\n color: var(--atomic-on-background);\n }\n @media (hover: hover) {\n .btn-outline-neutral:hover {\n border-color: var(--atomic-primary);\n }\n }\n @media (hover: hover) {\n .btn-outline-neutral:hover {\n color: var(--atomic-primary);\n }\n }\n .btn-outline-neutral:focus-visible {\n border-color: var(--atomic-primary);\n }\n .btn-outline-neutral:focus-visible {\n color: var(--atomic-primary);\n }\n .btn-outline-neutral:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .btn-outline-neutral:focus-visible {\n --tw-ring-color: var(--atomic-ring-primary);\n }\n .btn-outline-neutral:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-outline-neutral:disabled {\n cursor: not-allowed;\n }\n .btn-outline-neutral:disabled {\n border-color: var(--atomic-neutral);\n }\n .btn-outline-neutral:disabled {\n color: var(--atomic-on-background);\n }\n .btn-outline-neutral:disabled {\n opacity: 50%;\n }\n .btn-outline-bg-neutral {\n border-radius: var(--atomic-border-radius);\n border-style: var(--tw-border-style);\n border-width: 1px;\n border-color: var(--atomic-neutral);\n background-color: var(--atomic-background);\n color: var(--atomic-on-background);\n }\n @media (hover: hover) {\n .btn-outline-bg-neutral:hover {\n border-color: var(--atomic-primary);\n }\n }\n @media (hover: hover) {\n .btn-outline-bg-neutral:hover {\n background-color: var(--atomic-neutral-light);\n }\n }\n @media (hover: hover) {\n .btn-outline-bg-neutral:hover {\n color: var(--atomic-primary);\n }\n }\n .btn-outline-bg-neutral:focus-visible {\n border-color: var(--atomic-primary);\n }\n .btn-outline-bg-neutral:focus-visible {\n background-color: var(--atomic-neutral-light);\n }\n .btn-outline-bg-neutral:focus-visible {\n color: var(--atomic-primary);\n }\n .btn-outline-bg-neutral:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .btn-outline-bg-neutral:focus-visible {\n --tw-ring-color: var(--atomic-ring-primary);\n }\n .btn-outline-bg-neutral:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-outline-bg-neutral:disabled {\n cursor: not-allowed;\n }\n .btn-outline-bg-neutral:disabled {\n border-color: var(--atomic-neutral);\n }\n .btn-outline-bg-neutral:disabled {\n color: var(--atomic-on-background);\n }\n .btn-outline-bg-neutral:disabled {\n opacity: 50%;\n }\n .btn-outline-bg-error {\n border-radius: var(--atomic-border-radius);\n border-style: var(--tw-border-style);\n border-width: 1px;\n border-color: var(--atomic-neutral);\n background-color: var(--atomic-background);\n color: var(--atomic-on-background);\n }\n @media (hover: hover) {\n .btn-outline-bg-error:hover {\n border-color: var(--atomic-primary);\n }\n }\n @media (hover: hover) {\n .btn-outline-bg-error:hover {\n background-color: var(--atomic-neutral-light);\n }\n }\n @media (hover: hover) {\n .btn-outline-bg-error:hover {\n color: var(--atomic-primary);\n }\n }\n .btn-outline-bg-error:focus-visible {\n border-color: var(--atomic-primary);\n }\n .btn-outline-bg-error:focus-visible {\n background-color: var(--atomic-neutral-light);\n }\n .btn-outline-bg-error:focus-visible {\n color: var(--atomic-primary);\n }\n .btn-outline-bg-error:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .btn-outline-bg-error:focus-visible {\n --tw-ring-color: var(--atomic-ring-primary);\n }\n .btn-outline-bg-error:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-outline-bg-error:disabled {\n cursor: not-allowed;\n }\n .btn-outline-bg-error:disabled {\n border-color: var(--atomic-neutral);\n }\n .btn-outline-bg-error:disabled {\n color: var(--atomic-on-background);\n }\n .btn-outline-bg-error:disabled {\n opacity: 50%;\n }\n .btn-outline-error {\n border-radius: var(--atomic-border-radius);\n border-style: var(--tw-border-style);\n border-width: 1px;\n border-color: var(--atomic-neutral);\n background-color: var(--atomic-background);\n color: var(--atomic-on-background);\n }\n @media (hover: hover) {\n .btn-outline-error:hover {\n border-color: var(--atomic-error);\n }\n }\n @media (hover: hover) {\n .btn-outline-error:hover {\n color: var(--atomic-error);\n }\n }\n .btn-outline-error:focus-visible {\n border-color: var(--atomic-error);\n }\n .btn-outline-error:focus-visible {\n color: var(--atomic-error);\n }\n .btn-outline-error:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .btn-outline-error:focus-visible {\n --tw-ring-color: var(--atomic-ring-primary);\n }\n .btn-outline-error:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-outline-error:disabled {\n cursor: not-allowed;\n }\n .btn-outline-error:disabled {\n border-color: var(--atomic-neutral);\n }\n .btn-outline-error:disabled {\n color: var(--atomic-on-background);\n }\n .btn-outline-error:disabled {\n opacity: 50%;\n }\n .btn-text-neutral {\n border-radius: var(--atomic-border-radius);\n background-color: var(--atomic-background);\n color: var(--atomic-on-background);\n }\n @media (hover: hover) {\n .btn-text-neutral:hover {\n background-color: var(--atomic-neutral-light);\n }\n }\n @media (hover: hover) {\n .btn-text-neutral:hover {\n color: var(--atomic-primary);\n }\n }\n .btn-text-neutral:focus-visible {\n background-color: var(--atomic-neutral-light);\n }\n .btn-text-neutral:focus-visible {\n color: var(--atomic-primary);\n }\n .btn-text-neutral:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-text-transparent {\n color: var(--atomic-on-background);\n }\n @media (hover: hover) {\n .btn-text-transparent:hover {\n color: var(--atomic-primary-light);\n }\n }\n .btn-text-transparent:focus-visible {\n color: var(--atomic-primary-light);\n }\n .btn-square-neutral {\n border-style: var(--tw-border-style);\n border-width: 1px;\n border-color: var(--atomic-neutral);\n background-color: var(--atomic-background);\n color: var(--atomic-on-background);\n }\n @media (hover: hover) {\n .btn-square-neutral:hover {\n background-color: var(--atomic-neutral-light);\n }\n }\n .btn-square-neutral:focus-visible {\n background-color: var(--atomic-neutral-light);\n }\n .btn-square-neutral:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n }\n .btn-page {\n display: grid;\n height: calc(0.25rem * 10);\n width: calc(0.25rem * 10);\n place-items: center;\n border-style: var(--tw-border-style);\n border-width: 0px;\n font-size: var(--atomic-text-lg);\n line-height: var(--tw-leading, calc(1.75 / 1.125));\n }\n @media (hover: hover) {\n .btn-page:hover {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n }\n .btn-page:focus-visible {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .btn-page.selected {\n border-style: var(--tw-border-style);\n border-width: 2px;\n border-color: var(--atomic-primary);\n --tw-font-weight: var(--atomic-font-bold);\n font-weight: var(--atomic-font-bold);\n }\n}\n@layer base {\n :host {\n display: block;\n }\n :host, button, input, select {\n font-family: var(--atomic-font-family);\n font-size: var(--atomic-text-base);\n line-height: var(--tw-leading, calc(1.5 / 1));\n --tw-font-weight: var(--atomic-font-normal);\n font-weight: var(--atomic-font-normal);\n }\n button {\n cursor: pointer;\n }\n :host(.atomic-hidden) {\n display: none;\n }\n .ripple {\n position: absolute;\n pointer-events: none;\n transform: scale(0);\n border-radius: 50%;\n animation: ripple var(--animation-duration) linear;\n }\n .ripple-relative {\n position: relative;\n }\n .ripple-parent {\n overflow: hidden;\n }\n @keyframes ripple {\n to {\n transform: scale(4);\n opacity: 0;\n }\n }\n}\n.feedback-buttons [part='feedback-button'] {\n width: 2.2rem;\n height: 2.2rem;\n color: var(--atomic-neutral-dark);\n}\n.feedback-buttons [part='feedback-button'].dislike {\n rotate: 180deg;\n}\n.feedback-buttons [part='feedback-button']:hover.like, .feedback-buttons [part='feedback-button'].active.like {\n color: var(--atomic-success);\n}\n.feedback-buttons [part='feedback-button']:hover.dislike, .feedback-buttons [part='feedback-button'].active.dislike {\n color: var(--atomic-error);\n}\n[part='copy-button'] .icon-container atomic-icon:hover {\n color: var(--atomic-primary);\n}\n[part='copy-button'].copied .icon-container atomic-icon {\n color: var(--atomic-success);\n}\n[part='copy-button'].error .icon-container atomic-icon {\n color: var(--atomic-error);\n}\n@keyframes cursor-blink {\n 0% {\n opacity: 0;\n }\n}\n[part='container'] {\n container-type: inline-size;\n contain: layout;\n}\n.footer {\n display: flex;\n}\n.footer .source-citations {\n margin-right: calc(0.25rem * 2);\n}\n@container (max-width: 37.5rem) {\n .footer {\n flex-direction: column;\n gap: calc(0.25rem * 4);\n }\n .footer .source-citations {\n margin-right: calc(0.25rem * 0);\n }\n}\n@media not all and (width >= 1024px) {\n .footer {\n flex-direction: column;\n gap: calc(0.25rem * 4);\n }\n .footer .source-citations {\n margin-right: calc(0.25rem * 0);\n }\n}\n@container (max-width: 25rem) {\n .footer {\n margin-top: calc(0.25rem * 4);\n }\n .footer .feedback-buttons {\n position: relative;\n top: calc(0.25rem * 0);\n right: calc(0.25rem * 0);\n }\n}\n@container (max-width: 37.5rem) {\n [part='generated-answer-footer'] {\n flex-direction: column;\n gap: calc(0.25rem * 1);\n }\n}\n@media not all and (width >= 1024px) {\n [part='generated-answer-footer'] {\n flex-direction: column;\n gap: calc(0.25rem * 1);\n }\n}\n[part='generated-container'].answer-collapsed {\n position: relative;\n overflow: hidden;\n --tw-content: '';\n content: var(--tw-content);\n max-height: var(--atomic-crga-collapsed-height, 16rem);\n}\n[part='generated-container'].answer-collapsed .feedback-buttons {\n display: none;\n}\n[part='generated-container'].answer-collapsed:before {\n position: absolute;\n top: calc(0.25rem * 0);\n left: calc(0.25rem * 0);\n height: 100%;\n width: 100%;\n --tw-content: '';\n content: var(--tw-content);\n background: linear-gradient( transparent calc(var(--atomic-crga-collapsed-height, 16rem) * 0.7), var(--atomic-background) );\n}\n.is-collapsible {\n justify-content: space-between;\n}\n.is-collapsible [part='answer-show-button'] {\n display: flex;\n}\n.generating-label-visible [part='is-generating'] {\n display: flex;\n}\n@property --tw-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-scale-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-scale-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-scale-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-rotate-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-z {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-space-y-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-space-x-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-divide-y-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-border-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-gradient-position {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-gradient-from {\n syntax: \"<color>\";\n inherits: false;\n initial-value: #0000;\n}\n@property --tw-gradient-via {\n syntax: \"<color>\";\n inherits: false;\n initial-value: #0000;\n}\n@property --tw-gradient-to {\n syntax: \"<color>\";\n inherits: false;\n initial-value: #0000;\n}\n@property --tw-gradient-stops {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-gradient-via-stops {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-gradient-from-position {\n syntax: \"<length-percentage>\";\n inherits: false;\n initial-value: 0%;\n}\n@property --tw-gradient-via-position {\n syntax: \"<length-percentage>\";\n inherits: false;\n initial-value: 50%;\n}\n@property --tw-gradient-to-position {\n syntax: \"<length-percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-leading {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-font-weight {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-inset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-ring-inset {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-offset-width {\n syntax: \"<length>\";\n inherits: false;\n initial-value: 0px;\n}\n@property --tw-ring-offset-color {\n syntax: \"*\";\n inherits: false;\n initial-value: #fff;\n}\n@property --tw-ring-offset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-outline-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-blur {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-brightness {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-contrast {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-grayscale {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-hue-rotate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-invert {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-opacity {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-saturate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-sepia {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-drop-shadow {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-drop-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-drop-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-drop-shadow-size {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-duration {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ease {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-content {\n syntax: \"*\";\n initial-value: \"\";\n inherits: false;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n}\n@layer properties {\n @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\n *, ::before, ::after, ::backdrop {\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-translate-z: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-scale-z: 1;\n --tw-rotate-x: initial;\n --tw-rotate-y: initial;\n --tw-rotate-z: initial;\n --tw-skew-x: initial;\n --tw-skew-y: initial;\n --tw-space-y-reverse: 0;\n --tw-space-x-reverse: 0;\n --tw-divide-y-reverse: 0;\n --tw-border-style: solid;\n --tw-gradient-position: initial;\n --tw-gradient-from: #0000;\n --tw-gradient-via: #0000;\n --tw-gradient-to: #0000;\n --tw-gradient-stops: initial;\n --tw-gradient-via-stops: initial;\n --tw-gradient-from-position: 0%;\n --tw-gradient-via-position: 50%;\n --tw-gradient-to-position: 100%;\n --tw-leading: initial;\n --tw-font-weight: initial;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-color: initial;\n --tw-shadow-alpha: 100%;\n --tw-inset-shadow: 0 0 #0000;\n --tw-inset-shadow-color: initial;\n --tw-inset-shadow-alpha: 100%;\n --tw-ring-color: initial;\n --tw-ring-shadow: 0 0 #0000;\n --tw-inset-ring-color: initial;\n --tw-inset-ring-shadow: 0 0 #0000;\n --tw-ring-inset: initial;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-outline-style: solid;\n --tw-blur: initial;\n --tw-brightness: initial;\n --tw-contrast: initial;\n --tw-grayscale: initial;\n --tw-hue-rotate: initial;\n --tw-invert: initial;\n --tw-opacity: initial;\n --tw-saturate: initial;\n --tw-sepia: initial;\n --tw-drop-shadow: initial;\n --tw-drop-shadow-color: initial;\n --tw-drop-shadow-alpha: 100%;\n --tw-drop-shadow-size: initial;\n --tw-duration: initial;\n --tw-ease: initial;\n --tw-content: \"\";\n }\n }\n}\n";
3037
- const AtomicInsightGeneratedAnswerStyle0 = atomicInsightGeneratedAnswerCss;
3038
-
3039
- var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
3040
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3041
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
3042
- r = Reflect.decorate(decorators, target, key, desc);
3043
- else
3044
- for (var i = decorators.length - 1; i >= 0; i--)
3045
- if (d = decorators[i])
3046
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
3047
- return c > 3 && r && Object.defineProperty(target, key, r), r;
3048
- };
3049
- const AtomicInsightGeneratedAnswer$1 = /*@__PURE__*/ proxyCustomElement(class AtomicInsightGeneratedAnswer extends HTMLElement {
3050
- constructor() {
3051
- super();
3052
- this.__registerHost();
3053
- this.__attachShadow();
3054
- this.DEFAULT_COLLAPSED_HEIGHT = 16;
3055
- this.MAX_COLLAPSED_HEIGHT = 32;
3056
- this.MIN_COLLAPSED_HEIGHT = 9;
3057
- this.REQUIRED_FIELDS_TO_INCLUDE_IN_CITATIONS = ['filetype'];
3058
- this.copied = false;
3059
- this.copyError = false;
3060
- /**
3061
- * The maximum height (in rem units) of the answer when collapsed.
3062
- *
3063
- */
3064
- this.maxCollapsedHeight = this.DEFAULT_COLLAPSED_HEIGHT;
3065
- // @ts-expect-error: This function is used by BindStateToController.
3066
- this.onGeneratedAnswerStateUpdate = () => {
3067
- if (this.generatedAnswerState.isVisible !==
3068
- this.generatedAnswerCommon?.data?.isVisible) {
3069
- this.generatedAnswerCommon.data = {
3070
- ...this.generatedAnswerCommon.data,
3071
- isVisible: this.generatedAnswerState.isVisible,
3072
- };
3073
- this.generatedAnswerCommon.writeStoredData(this.generatedAnswerCommon.data);
3074
- }
3075
- this.setAriaMessage(this.generatedAnswerCommon.getGeneratedAnswerStatus());
3076
- };
3077
- this.setCopied = (isCopied) => {
3078
- this.copied = isCopied;
3079
- };
3080
- this.setCopyError = (copyError) => {
3081
- this.copyError = copyError;
3082
- };
3083
- this.setAriaMessage = (message) => {
3084
- this.ariaMessage = message;
3085
- };
3086
- this.generatedAnswerState = undefined;
3087
- this.searchStatusState = undefined;
3088
- this.error = undefined;
3089
- this.copied = false;
3090
- this.copyError = false;
3091
- this.withToggle = undefined;
3092
- this.collapsible = undefined;
3093
- this.maxCollapsedHeight = this.DEFAULT_COLLAPSED_HEIGHT;
3094
- this.answerConfigurationId = undefined;
3095
- this.fieldsToIncludeInCitations = undefined;
3096
- this.disableCitationAnchoring = undefined;
3097
- }
3098
- initialize() {
3099
- this.generatedAnswerCommon = new GeneratedAnswerCommon({
3100
- host: this.host,
3101
- withToggle: this.withToggle,
3102
- collapsible: this.collapsible,
3103
- disableCitationAnchoring: this.disableCitationAnchoring,
3104
- getGeneratedAnswer: () => this.generatedAnswer,
3105
- getGeneratedAnswerState: () => this.generatedAnswerState,
3106
- getSearchStatusState: () => this.searchStatusState,
3107
- getBindings: () => this.bindings,
3108
- getCopied: () => this.copied,
3109
- setCopied: this.setCopied,
3110
- getCopyError: () => this.copyError,
3111
- setCopyError: this.setCopyError,
3112
- setAriaMessage: this.setAriaMessage,
3113
- buildInteractiveCitation: (props) => buildInteractiveCitation(this.bindings.engine, props),
3114
- });
3115
- this.generatedAnswer = buildGeneratedAnswer(this.bindings.engine, {
3116
- initialState: {
3117
- isVisible: this.generatedAnswerCommon.data.isVisible,
3118
- responseFormat: {
3119
- contentFormat: ['text/markdown', 'text/plain'],
3120
- },
3121
- },
3122
- ...(this.answerConfigurationId && {
3123
- answerConfigurationId: this.answerConfigurationId,
3124
- }),
3125
- fieldsToIncludeInCitations: this.getCitationFields(),
3126
- });
3127
- this.searchStatus = buildSearchStatus(this.bindings.engine);
3128
- this.generatedAnswerCommon.insertFeedbackModal();
3129
- if (window.ResizeObserver && this.collapsible) {
3130
- const debouncedAdaptAnswerHeight = debounce(() => this.adaptAnswerHeight(), 100);
3131
- this.resizeObserver = new ResizeObserver(debouncedAdaptAnswerHeight);
3132
- this.resizeObserver.observe(this.host);
3133
- }
3134
- }
3135
- updateAnswerCollapsed(newState, oldState) {
3136
- const newExpanded = newState.expanded;
3137
- const oldExpanded = oldState ? oldState.expanded : undefined;
3138
- if (newExpanded !== oldExpanded) {
3139
- const container = this.getAnswerContainer();
3140
- if (!container) {
3141
- return;
3142
- }
3143
- this.toggleClass(container, 'answer-collapsed', !newExpanded);
3144
- }
3145
- }
3146
- disconnectedCallback() {
3147
- this.resizeObserver?.disconnect();
3148
- }
3149
- toggleClass(element, className, condition) {
3150
- element.classList.toggle(className, condition);
3151
- }
3152
- adaptAnswerHeight() {
3153
- const answerHeight = this.host?.shadowRoot
3154
- ?.querySelector('[part="generated-text"]')
3155
- ?.getBoundingClientRect().height;
3156
- if (answerHeight) {
3157
- const rootFontSize = parseFloat(getComputedStyle(document.documentElement).fontSize);
3158
- this.fullAnswerHeight = answerHeight / rootFontSize;
3159
- this.updateAnswerHeight();
3160
- }
3161
- }
3162
- getAnswerContainer() {
3163
- return this.host?.shadowRoot?.querySelector('[part="generated-container"]');
3164
- }
3165
- getAnswerFooter() {
3166
- return this.host?.shadowRoot?.querySelector('[part="generated-answer-footer"]');
3167
- }
3168
- getCitationFields() {
3169
- return (this.fieldsToIncludeInCitations ?? '')
3170
- .split(',')
3171
- .map((field) => field.trim())
3172
- .filter((field) => field.length > 0)
3173
- .concat(this.REQUIRED_FIELDS_TO_INCLUDE_IN_CITATIONS);
3174
- }
3175
- validateMaxCollapsedHeight() {
3176
- const isValid = this.maxCollapsedHeight >= this.MIN_COLLAPSED_HEIGHT &&
3177
- this.maxCollapsedHeight <= this.MAX_COLLAPSED_HEIGHT;
3178
- if (!isValid) {
3179
- console.warn(`max-collapsed-height (${this.maxCollapsedHeight}rem) is out of the valid range (${this.MIN_COLLAPSED_HEIGHT}rem - ${this.MAX_COLLAPSED_HEIGHT}rem). Falling back to default value (${this.DEFAULT_COLLAPSED_HEIGHT}rem).`);
3180
- }
3181
- return isValid ? this.maxCollapsedHeight : this.DEFAULT_COLLAPSED_HEIGHT;
3182
- }
3183
- setCSSVariable(variableName, value) {
3184
- const container = this.getAnswerContainer();
3185
- if (container) {
3186
- container.style.setProperty(variableName, value);
3187
- }
3188
- }
3189
- updateAnswerHeight() {
3190
- const container = this.getAnswerContainer();
3191
- const footer = this.getAnswerFooter();
3192
- const maxHeight = this.validateMaxCollapsedHeight();
3193
- if (!container || !footer) {
3194
- return;
3195
- }
3196
- if (this.fullAnswerHeight > maxHeight) {
3197
- this.setCSSVariable('--atomic-crga-collapsed-height', `${maxHeight}rem`);
3198
- this.toggleClass(container, 'answer-collapsed', !this.generatedAnswerState.expanded);
3199
- this.toggleClass(footer, 'is-collapsible', true);
3200
- this.toggleClass(footer, 'generating-label-visible', this.generatedAnswerState.isStreaming);
3201
- }
3202
- else {
3203
- this.toggleClass(container, 'answer-collapsed', false);
3204
- this.toggleClass(footer, 'is-collapsible', false);
3205
- this.toggleClass(footer, 'generating-label-visible', false);
3206
- }
3207
- }
3208
- render() {
3209
- return this.generatedAnswerCommon.render();
3210
- }
3211
- get host() { return this; }
3212
- static get watchers() { return {
3213
- "generatedAnswerState": ["updateAnswerCollapsed"]
3214
- }; }
3215
- static get style() { return AtomicInsightGeneratedAnswerStyle0; }
3216
- }, [1, "atomic-insight-generated-answer", {
3217
- "withToggle": [4, "with-toggle"],
3218
- "collapsible": [4],
3219
- "maxCollapsedHeight": [2, "max-collapsed-height"],
3220
- "answerConfigurationId": [1, "answer-configuration-id"],
3221
- "fieldsToIncludeInCitations": [1, "fields-to-include-in-citations"],
3222
- "disableCitationAnchoring": [4, "disable-citation-anchoring"],
3223
- "generatedAnswerState": [32],
3224
- "searchStatusState": [32],
3225
- "error": [32],
3226
- "copied": [32],
3227
- "copyError": [32]
3228
- }, undefined, {
3229
- "generatedAnswerState": ["updateAnswerCollapsed"]
3230
- }]);
3231
- __decorate([
3232
- InitializeBindings()
3233
- ], AtomicInsightGeneratedAnswer$1.prototype, "bindings", void 0);
3234
- __decorate([
3235
- BindStateToController('generatedAnswer', {
3236
- onUpdateCallbackMethod: 'onGeneratedAnswerStateUpdate',
3237
- })
3238
- ], AtomicInsightGeneratedAnswer$1.prototype, "generatedAnswerState", void 0);
3239
- __decorate([
3240
- BindStateToController('searchStatus')
3241
- ], AtomicInsightGeneratedAnswer$1.prototype, "searchStatusState", void 0);
3242
- __decorate([
3243
- AriaLiveRegion('generated-answer')
3244
- ], AtomicInsightGeneratedAnswer$1.prototype, "ariaMessage", void 0);
3245
- function defineCustomElement$1() {
3246
- if (typeof customElements === "undefined") {
3247
- return;
3248
- }
3249
- const components = ["atomic-insight-generated-answer"];
3250
- components.forEach(tagName => { switch (tagName) {
3251
- case "atomic-insight-generated-answer":
3252
- if (!customElements.get(tagName)) {
3253
- customElements.define(tagName, AtomicInsightGeneratedAnswer$1);
3254
- }
3255
- break;
3256
- } });
3257
- }
3258
-
3259
- const AtomicInsightGeneratedAnswer = AtomicInsightGeneratedAnswer$1;
3260
- const defineCustomElement = defineCustomElement$1;
3261
-
3262
- export { AtomicInsightGeneratedAnswer, defineCustomElement };
3263
-
3264
- //# sourceMappingURL=atomic-insight-generated-answer.js.map