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