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