@waline/client 3.8.0 → 3.9.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.
- package/dist/comment.js +1 -1
- package/dist/comment.js.map +1 -1
- package/dist/component.d.ts +9 -13
- package/dist/component.js +12 -12
- package/dist/component.js.map +1 -1
- package/dist/pageview.js +1 -1
- package/dist/pageview.js.map +1 -1
- package/dist/slim.d.ts +8 -5
- package/dist/slim.js +12 -12
- package/dist/slim.js.map +1 -1
- package/dist/waline-meta.css +1 -1
- package/dist/waline-meta.css.map +1 -1
- package/dist/waline.css +1 -1
- package/dist/waline.css.map +1 -1
- package/dist/waline.d.ts +8 -5
- package/dist/waline.js +67 -68
- package/dist/waline.js.map +1 -1
- package/dist/waline.umd.js +69 -70
- package/dist/waline.umd.js.map +1 -1
- package/package.json +35 -35
package/dist/component.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.js","sources":["../src/components/Icons.ts","../src/composables/inputs.ts","../src/composables/like.ts","../src/composables/reaction.ts","../src/composables/recaptchaV3.ts","../src/composables/turnstile.ts","../src/composables/userInfo.ts","../src/config/default.ts","../src/config/highlighter.ts","../src/config/i18n/generate.ts","../src/config/i18n/de.ts","../src/config/i18n/en.ts","../src/config/i18n/es.ts","../src/config/i18n/fr.ts","../src/config/i18n/it.ts","../src/config/i18n/jp.ts","../src/config/i18n/pt-BR.ts","../src/config/i18n/ru.ts","../src/config/i18n/vi-VN.ts","../src/config/i18n/zh-CN.ts","../src/config/i18n/zh-TW.ts","../src/config/i18n/index.ts","../src/config/sortKey.ts","../src/config/index.ts","../src/components/ArticleReaction.vue","../src/components/ImageWall.vue","../src/utils/path.ts","../src/utils/config.ts","../src/utils/type.ts","../src/utils/darkmode.ts","../src/utils/date.ts","../src/utils/email.ts","../src/utils/emoji.ts","../src/utils/image.ts","../src/utils/markedMathExtension.ts","../src/utils/markdown.ts","../src/utils/wordCount.ts","../src/utils/userAgent.ts","../src/components/CommentBox.vue","../src/components/CommentCard.vue","../src/version.ts","../src/components/WalineComment.vue"],"sourcesContent":["import type { FunctionalComponent } from 'vue';\nimport { h } from 'vue';\n\nexport const CloseIcon: FunctionalComponent<{ size: number }> = ({ size }) =>\n h(\n 'svg',\n {\n class: 'wl-close-icon',\n viewBox: '0 0 1024 1024',\n width: size,\n height: size,\n },\n [\n h('path', {\n d: 'M697.173 85.333h-369.92c-144.64 0-241.92 101.547-241.92 252.587v348.587c0 150.613 97.28 252.16 241.92 252.16h369.92c144.64 0 241.494-101.547 241.494-252.16V337.92c0-151.04-96.854-252.587-241.494-252.587z',\n fill: 'currentColor',\n }),\n h('path', {\n d: 'm640.683 587.52-75.947-75.861 75.904-75.862a37.29 37.29 0 0 0 0-52.778 37.205 37.205 0 0 0-52.779 0l-75.946 75.818-75.862-75.946a37.419 37.419 0 0 0-52.821 0 37.419 37.419 0 0 0 0 52.821l75.947 75.947-75.776 75.733a37.29 37.29 0 1 0 52.778 52.821l75.776-75.776 75.947 75.947a37.376 37.376 0 0 0 52.779-52.821z',\n fill: '#888',\n }),\n ],\n );\n\nexport const DeleteIcon: FunctionalComponent = () =>\n h(\n 'svg',\n { viewBox: '0 0 1024 1024', width: '24', height: '24' },\n h('path', {\n d: 'm341.013 394.667 27.755 393.45h271.83l27.733-393.45h64.106l-28.01 397.952a64 64 0 0 1-63.83 59.498H368.768a64 64 0 0 1-63.83-59.52l-28.053-397.93h64.128zm139.307 19.818v298.667h-64V414.485h64zm117.013 0v298.667h-64V414.485h64zM181.333 288h640v64h-640v-64zm453.483-106.667v64h-256v-64h256z',\n fill: 'red',\n }),\n );\n\nexport const EmojiIcon: FunctionalComponent = () =>\n h(\n 'svg',\n { viewBox: '0 0 1024 1024', width: '24', height: '24' },\n h('path', {\n d: 'M563.2 463.3 677 540c1.7 1.2 3.7 1.8 5.8 1.8.7 0 1.4-.1 2-.2 2.7-.5 5.1-2.1 6.6-4.4l25.3-37.8c1.5-2.3 2.1-5.1 1.6-7.8s-2.1-5.1-4.4-6.6l-73.6-49.1 73.6-49.1c2.3-1.5 3.9-3.9 4.4-6.6.5-2.7 0-5.5-1.6-7.8l-25.3-37.8a10.1 10.1 0 0 0-6.6-4.4c-.7-.1-1.3-.2-2-.2-2.1 0-4.1.6-5.8 1.8l-113.8 76.6c-9.2 6.2-14.7 16.4-14.7 27.5.1 11 5.5 21.3 14.7 27.4zM387 348.8h-45.5c-5.7 0-10.4 4.7-10.4 10.4v153.3c0 5.7 4.7 10.4 10.4 10.4H387c5.7 0 10.4-4.7 10.4-10.4V359.2c0-5.7-4.7-10.4-10.4-10.4zm333.8 241.3-41-20a10.3 10.3 0 0 0-8.1-.5c-2.6.9-4.8 2.9-5.9 5.4-30.1 64.9-93.1 109.1-164.4 115.2-5.7.5-9.9 5.5-9.5 11.2l3.9 45.5c.5 5.3 5 9.5 10.3 9.5h.9c94.8-8 178.5-66.5 218.6-152.7 2.4-5 .3-11.2-4.8-13.6zm186-186.1c-11.9-42-30.5-81.4-55.2-117.1-24.1-34.9-53.5-65.6-87.5-91.2-33.9-25.6-71.5-45.5-111.6-59.2-41.2-14-84.1-21.1-127.8-21.1h-1.2c-75.4 0-148.8 21.4-212.5 61.7-63.7 40.3-114.3 97.6-146.5 165.8-32.2 68.1-44.3 143.6-35.1 218.4 9.3 74.8 39.4 145 87.3 203.3.1.2.3.3.4.5l36.2 38.4c1.1 1.2 2.5 2.1 3.9 2.6 73.3 66.7 168.2 103.5 267.5 103.5 73.3 0 145.2-20.3 207.7-58.7 37.3-22.9 70.3-51.5 98.1-85 27.1-32.7 48.7-69.5 64.2-109.1 15.5-39.7 24.4-81.3 26.6-123.8 2.4-43.6-2.5-87-14.5-129zm-60.5 181.1c-8.3 37-22.8 72-43 104-19.7 31.1-44.3 58.6-73.1 81.7-28.8 23.1-61 41-95.7 53.4-35.6 12.7-72.9 19.1-110.9 19.1-82.6 0-161.7-30.6-222.8-86.2l-34.1-35.8c-23.9-29.3-42.4-62.2-55.1-97.7-12.4-34.7-18.8-71-19.2-107.9-.4-36.9 5.4-73.3 17.1-108.2 12-35.8 30-69.2 53.4-99.1 31.7-40.4 71.1-72 117.2-94.1 44.5-21.3 94-32.6 143.4-32.6 49.3 0 97 10.8 141.8 32 34.3 16.3 65.3 38.1 92 64.8 26.1 26 47.5 56 63.6 89.2 16.2 33.2 26.6 68.5 31 105.1 4.6 37.5 2.7 75.3-5.6 112.3z',\n fill: 'currentColor',\n }),\n );\n\nexport const ImageIcon: FunctionalComponent = () =>\n h('svg', { viewBox: '0 0 1024 1024', width: '24', height: '24' }, [\n h('path', {\n d: 'M784 112H240c-88 0-160 72-160 160v480c0 88 72 160 160 160h544c88 0 160-72 160-160V272c0-88-72-160-160-160zm96 640c0 52.8-43.2 96-96 96H240c-52.8 0-96-43.2-96-96V272c0-52.8 43.2-96 96-96h544c52.8 0 96 43.2 96 96v480z',\n fill: 'currentColor',\n }),\n h('path', {\n d: 'M352 480c52.8 0 96-43.2 96-96s-43.2-96-96-96-96 43.2-96 96 43.2 96 96 96zm0-128c17.6 0 32 14.4 32 32s-14.4 32-32 32-32-14.4-32-32 14.4-32 32-32zm462.4 379.2-3.2-3.2-177.6-177.6c-25.6-25.6-65.6-25.6-91.2 0l-80 80-36.8-36.8c-25.6-25.6-65.6-25.6-91.2 0L200 728c-4.8 6.4-8 14.4-8 24 0 17.6 14.4 32 32 32 9.6 0 16-3.2 22.4-9.6L380.8 640l134.4 134.4c6.4 6.4 14.4 9.6 24 9.6 17.6 0 32-14.4 32-32 0-9.6-4.8-17.6-9.6-24l-52.8-52.8 80-80L769.6 776c6.4 4.8 12.8 8 20.8 8 17.6 0 32-14.4 32-32 0-8-3.2-16-8-20.8z',\n fill: 'currentColor',\n }),\n ]);\n\nexport const LikeIcon: FunctionalComponent<{ active: boolean }> = ({\n active = false,\n}: {\n active?: boolean;\n}) =>\n h('svg', { viewBox: '0 0 1024 1024', width: '24', height: '24' }, [\n h('path', {\n d: `M850.654 323.804c-11.042-25.625-26.862-48.532-46.885-68.225-20.022-19.61-43.258-34.936-69.213-45.73-26.78-11.124-55.124-16.727-84.375-16.727-40.622 0-80.256 11.123-114.698 32.135A214.79 214.79 0 0 0 512 241.819a214.79 214.79 0 0 0-23.483-16.562c-34.442-21.012-74.076-32.135-114.698-32.135-29.25 0-57.595 5.603-84.375 16.727-25.872 10.711-49.19 26.12-69.213 45.73-20.105 19.693-35.843 42.6-46.885 68.225-11.453 26.615-17.303 54.877-17.303 83.963 0 27.439 5.603 56.03 16.727 85.117 9.31 24.307 22.659 49.52 39.715 74.981 27.027 40.293 64.188 82.316 110.33 124.915 76.465 70.615 152.189 119.394 155.402 121.371l19.528 12.525c8.652 5.52 19.776 5.52 28.427 0l19.529-12.525c3.213-2.06 78.854-50.756 155.401-121.371 46.143-42.6 83.304-84.622 110.33-124.915 17.057-25.46 30.487-50.674 39.716-74.981 11.124-29.087 16.727-57.678 16.727-85.117.082-29.086-5.768-57.348-17.221-83.963z${\n active\n ? ''\n : 'M512 761.5S218.665 573.55 218.665 407.767c0-83.963 69.461-152.023 155.154-152.023 60.233 0 112.473 33.618 138.181 82.727 25.708-49.109 77.948-82.727 138.18-82.727 85.694 0 155.155 68.06 155.155 152.023C805.335 573.551 512 761.5 512 761.5z'\n }`,\n fill: active ? 'red' : 'currentColor',\n }),\n ]);\n\nexport const PreviewIcon: FunctionalComponent = () =>\n h('svg', { viewBox: '0 0 1024 1024', width: '24', height: '24' }, [\n h('path', {\n d: 'M710.816 654.301c70.323-96.639 61.084-230.578-23.705-314.843-46.098-46.098-107.183-71.109-172.28-71.109-65.008 0-126.092 25.444-172.28 71.109-45.227 46.098-70.756 107.183-70.756 172.106 0 64.923 25.444 126.007 71.194 172.106 46.099 46.098 107.184 71.109 172.28 71.109 51.414 0 100.648-16.212 142.824-47.404l126.53 126.006c7.058 7.06 16.297 10.979 26.406 10.979 10.105 0 19.343-3.919 26.402-10.979 14.467-14.467 14.467-38.172 0-52.723L710.816 654.301zm-315.107-23.265c-65.88-65.88-65.88-172.54 0-238.42 32.069-32.07 74.245-49.149 119.471-49.149 45.227 0 87.407 17.603 119.472 49.149 65.88 65.879 65.88 172.539 0 238.42-63.612 63.178-175.242 63.178-238.943 0zm0 0',\n fill: 'currentColor',\n }),\n h('path', {\n d: 'M703.319 121.603H321.03c-109.8 0-199.469 89.146-199.469 199.38v382.034c0 109.796 89.236 199.38 199.469 199.38h207.397c20.653 0 37.384-16.645 37.384-37.299 0-20.649-16.731-37.296-37.384-37.296H321.03c-68.582 0-124.352-55.77-124.352-124.267V321.421c0-68.496 55.77-124.267 124.352-124.267h382.289c68.582 0 124.352 55.771 124.352 124.267V524.72c0 20.654 16.736 37.299 37.385 37.299 20.654 0 37.384-16.645 37.384-37.299V320.549c-.085-109.8-89.321-198.946-199.121-198.946zm0 0',\n fill: 'currentColor',\n }),\n ]);\n\nexport const MarkdownIcon: FunctionalComponent = () =>\n h(\n 'svg',\n { width: '16', height: '16', ariaHidden: 'true' },\n h('path', {\n d: 'M14.85 3H1.15C.52 3 0 3.52 0 4.15v7.69C0 12.48.52 13 1.15 13h13.69c.64 0 1.15-.52 1.15-1.15v-7.7C16 3.52 15.48 3 14.85 3zM9 11H7V8L5.5 9.92 4 8v3H2V5h2l1.5 2L7 5h2v6zm2.99.5L9.5 8H11V5h2v3h1.5l-2.51 3.5z',\n fill: 'currentColor',\n }),\n );\n\nexport const ReplyIcon: FunctionalComponent = () =>\n h(\n 'svg',\n { viewBox: '0 0 1024 1024', width: '24', height: '24' },\n h('path', {\n d: 'M810.667 213.333a64 64 0 0 1 64 64V704a64 64 0 0 1-64 64H478.336l-146.645 96.107a21.333 21.333 0 0 1-33.024-17.856V768h-85.334a64 64 0 0 1-64-64V277.333a64 64 0 0 1 64-64h597.334zm0 64H213.333V704h149.334v63.296L459.243 704h351.424V277.333zm-271.36 213.334v64h-176.64v-64h176.64zm122.026-128v64H362.667v-64h298.666z',\n fill: 'currentColor',\n }),\n );\n\nexport const EditIcon: FunctionalComponent = () =>\n h(\n 'svg',\n { viewBox: '0 0 1024 1024', width: '24', height: '24' },\n h('path', {\n d: 'M813.039 318.772L480.53 651.278H360.718V531.463L693.227 198.961C697.904 194.284 704.027 192 710.157 192C716.302 192 722.436 194.284 727.114 198.961L813.039 284.88C817.72 289.561 820 295.684 820 301.825C820 307.95 817.72 314.093 813.039 318.772ZM710.172 261.888L420.624 551.431V591.376H460.561L750.109 301.825L710.172 261.888ZM490.517 291.845H240.906V771.09H720.156V521.479C720.156 504.947 733.559 491.529 750.109 491.529C766.653 491.529 780.063 504.947 780.063 521.479V791.059C780.063 813.118 762.18 831 740.125 831H220.937C198.882 831 181 813.118 181 791.059V271.872C181 249.817 198.882 231.935 220.937 231.935H490.517C507.06 231.935 520.47 245.352 520.47 261.888C520.47 278.424 507.06 291.845 490.517 291.845Z',\n fill: 'currentColor',\n }),\n );\n\nexport const VerifiedIcon: FunctionalComponent = () =>\n h(\n 'svg',\n {\n class: 'verified-icon',\n viewBox: '0 0 1024 1024',\n width: '14',\n height: '14',\n },\n h('path', {\n d: 'm894.4 461.56-54.4-63.2c-10.4-12-18.8-34.4-18.8-50.4v-68c0-42.4-34.8-77.2-77.2-77.2h-68c-15.6 0-38.4-8.4-50.4-18.8l-63.2-54.4c-27.6-23.6-72.8-23.6-100.8 0l-62.8 54.8c-12 10-34.8 18.4-50.4 18.4h-69.2c-42.4 0-77.2 34.8-77.2 77.2v68.4c0 15.6-8.4 38-18.4 50l-54 63.6c-23.2 27.6-23.2 72.4 0 100l54 63.6c10 12 18.4 34.4 18.4 50v68.4c0 42.4 34.8 77.2 77.2 77.2h69.2c15.6 0 38.4 8.4 50.4 18.8l63.2 54.4c27.6 23.6 72.8 23.6 100.8 0l63.2-54.4c12-10.4 34.4-18.8 50.4-18.8h68c42.4 0 77.2-34.8 77.2-77.2v-68c0-15.6 8.4-38.4 18.8-50.4l54.4-63.2c23.2-27.6 23.2-73.2-.4-100.8zm-216-25.2-193.2 193.2a30 30 0 0 1-42.4 0l-96.8-96.8a30.16 30.16 0 0 1 0-42.4c11.6-11.6 30.8-11.6 42.4 0l75.6 75.6 172-172c11.6-11.6 30.8-11.6 42.4 0 11.6 11.6 11.6 30.8 0 42.4z',\n fill: '#27ae60',\n }),\n );\n\nexport const AdministratorIcon: FunctionalComponent = () =>\n h(\n 'svg',\n {\n class: 'administrator-icon',\n viewBox: '0 0 1024 1024',\n width: '14',\n height: '14',\n },\n [\n h('path', {\n d: 'M461.6 129.56C489.6 105.96 534.8 105.96 562.4 129.56L625.6 183.96C637.6 194.36 660.4 202.76 676 202.76H744C786.4 202.76 821.2 237.56 821.2 279.96V347.96C821.2 363.96 829.6 386.36 840 398.36L894.4 461.56C918 489.16 918 534.76 894.8 562.36L840.4 625.56C830 637.56 821.6 660.36 821.6 675.96V743.96C821.6 786.36 786.8 821.16 744.4 821.16H676.4C660.4 821.16 638 829.56 626 839.96L562.8 894.36C534.8 917.96 489.6 917.96 462 894.36L398.8 839.96C386.8 829.56 364 821.16 348.4 821.16H279.2C236.8 821.16 202 786.36 202 743.96V675.56C201.999 659.96 193.6 637.56 183.6 625.56L129.6 561.96C106.4 534.36 106.4 489.56 129.6 461.96L183.6 398.36C193.6 386.359 202 363.959 202 348.36V279.96C202 237.56 236.8 202.76 279.2 202.76H348.4C364 202.76 386.8 194.36 398.8 184.36L461.6 129.56ZM549.567 331.896C530.047 303.082 486.645 306.12 471.433 337.412L442.175 396.526C435.587 409.848 422.856 419.097 408.146 421.226L342.706 430.726C340.776 431 338.884 431.397 336.993 431.946C303.482 441.361 292.756 483.493 317.671 507.812L364.975 553.96C375.623 564.321 380.507 579.299 377.991 593.954L366.917 659.102C366.595 661.03 366.355 662.967 366.279 664.923C364.906 699.688 401.683 722.937 432.514 706.738L491.05 675.966C504.217 669.068 519.954 669.069 533.121 675.966L591.675 706.738C593.406 707.645 595.174 708.432 597.028 709.104C629.666 721.205 663.139 693.382 657.273 659.102L646.069 593.954C643.42 579.176 648.24 564.083 659.001 553.6L706.315 507.461C707.687 506.118 708.994 504.66 710.215 503.127C731.779 475.809 715.737 435.41 681.281 430.365L615.839 420.874C601.13 418.745 588.4 409.486 581.821 396.174L552.562 337.052C551.644 335.284 550.674 333.551 549.567 331.896Z',\n fill: '#f59831',\n }),\n ],\n );\n\nexport const LoadingIcon: FunctionalComponent<{ size?: number }> = ({\n size = 100,\n}) =>\n h(\n 'svg',\n {\n width: size,\n height: size,\n viewBox: '0 0 100 100',\n preserveAspectRatio: 'xMidYMid',\n },\n h(\n 'circle',\n {\n cx: 50,\n cy: 50,\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: '4',\n r: '40',\n 'stroke-dasharray': '85 30',\n },\n h('animateTransform', {\n attributeName: 'transform',\n type: 'rotate',\n repeatCount: 'indefinite',\n dur: '1s',\n values: '0 50 50;360 50 50',\n keyTimes: '0;1',\n }),\n ),\n );\n\nexport const GifIcon: FunctionalComponent = () =>\n h(\n 'svg',\n {\n width: 24,\n height: 24,\n fill: 'currentcolor',\n viewBox: '0 0 24 24',\n },\n [\n h('path', {\n style: 'transform: translateY(0.5px)',\n d: 'M18.968 10.5H15.968V11.484H17.984V12.984H15.968V15H14.468V9H18.968V10.5V10.5ZM8.984 9C9.26533 9 9.49967 9.09367 9.687 9.281C9.87433 9.46833 9.968 9.70267 9.968 9.984V10.5H6.499V13.5H8.468V12H9.968V14.016C9.968 14.2973 9.87433 14.5317 9.687 14.719C9.49967 14.9063 9.26533 15 8.984 15H5.984C5.70267 15 5.46833 14.9063 5.281 14.719C5.09367 14.5317 5 14.2973 5 14.016V9.985C5 9.70367 5.09367 9.46933 5.281 9.282C5.46833 9.09467 5.70267 9.001 5.984 9.001H8.984V9ZM11.468 9H12.968V15H11.468V9V9Z',\n }),\n h('path', {\n d: 'M18.5 3H5.75C3.6875 3 2 4.6875 2 6.75V18C2 20.0625 3.6875 21.75 5.75 21.75H18.5C20.5625 21.75 22.25 20.0625 22.25 18V6.75C22.25 4.6875 20.5625 3 18.5 3ZM20.75 18C20.75 19.2375 19.7375 20.25 18.5 20.25H5.75C4.5125 20.25 3.5 19.2375 3.5 18V6.75C3.5 5.5125 4.5125 4.5 5.75 4.5H18.5C19.7375 4.5 20.75 5.5125 20.75 6.75V18Z',\n }),\n ],\n );\n","import type { RemovableRef } from '@vueuse/core';\nimport { useStorage } from '@vueuse/core';\n\nexport interface UserMeta {\n nick: string;\n mail: string;\n link: string;\n}\n\nexport const useUserMeta = (): RemovableRef<UserMeta> =>\n useStorage<UserMeta>('WALINE_USER_META', {\n nick: '',\n mail: '',\n link: '',\n });\n\nexport const useEditor = (): RemovableRef<string> =>\n useStorage<string>('WALINE_COMMENT_BOX_EDITOR', '');\n","import { useStorage } from '@vueuse/core';\nimport type { Ref } from 'vue';\n\nconst LIKE_KEY = 'WALINE_LIKE';\n\nexport type LikeID = number | string;\n\nexport type LikeRef = Ref<LikeID[]>;\n\nconst likeStorage = useStorage<LikeID[]>(LIKE_KEY, []);\n\nexport const useLikeStorage = (): LikeRef => likeStorage;\n","import { useStorage } from '@vueuse/core';\nimport type { Ref } from 'vue';\n\nconst REACTION_KEY = 'WALINE_REACTION';\n\nexport type WalineReactionStore = Record<\n /* VOTE_IDENTIFIER */ string,\n number | undefined\n>;\n\nexport type VoteRef = Ref<WalineReactionStore>;\n\nconst reactionStorage = useStorage<WalineReactionStore>(REACTION_KEY, {});\n\nexport const useReactionStorage = (): VoteRef => reactionStorage;\n","import type { ReCaptchaInstance } from 'recaptcha-v3';\nimport { load } from 'recaptcha-v3';\n\nconst recaptchaStore: Record<string, Promise<ReCaptchaInstance>> = {};\n\ninterface ReCaptcha {\n execute: (action: string) => Promise<string>;\n}\n\nexport const useReCaptcha = (key: string): ReCaptcha => {\n const init = (recaptchaStore[key] ??= load(key, {\n useRecaptchaNet: true,\n autoHideBadge: true,\n }));\n\n return {\n execute: (action: string) =>\n init.then((instance) => instance.execute(action)),\n };\n};\n","import { useScriptTag } from '@vueuse/core';\n\ninterface TurnstileOptions {\n sitekey: string;\n action?: string;\n size?: 'normal' | 'compact';\n callback?: (token: string) => void;\n}\ninterface TurnstileInstance {\n ready: (fn: () => void) => void;\n excute: (className: string, options?: TurnstileOptions) => void;\n render: (className: string, options?: TurnstileOptions) => void;\n}\n\ndeclare global {\n interface Window {\n turnstile?: TurnstileInstance;\n }\n}\n\ninterface Turnstile {\n execute: (action: string) => Promise<string>;\n}\n\nexport const useTurnstile = (key: string): Turnstile => {\n const execute = async (action: string): Promise<string> => {\n const { load } = useScriptTag(\n 'https://challenges.cloudflare.com/turnstile/v0/api.js',\n undefined,\n { async: false },\n );\n\n await load();\n\n const turnstile = window.turnstile;\n\n return new Promise((resolve) => {\n turnstile?.ready(() => {\n turnstile.render('.wl-captcha-container', {\n sitekey: key,\n action,\n size: 'compact',\n callback: resolve,\n });\n });\n });\n };\n\n return { execute };\n};\n","import { useStorage } from '@vueuse/core';\nimport type { UserInfo } from '@waline/api';\nimport type { Ref } from 'vue';\n\nexport const USER_KEY = 'WALINE_USER';\n\nexport type UserInfoRef = Ref<UserInfo | Record<string, never>>;\n\nconst userInfoStorage = useStorage<UserInfo | Record<string, never>>(\n USER_KEY,\n {},\n);\n\nexport const useUserInfo = (): UserInfoRef => userInfoStorage;\n","import type { IGif } from '@giphy/js-types';\n\nimport type {\n WalineEmojiPresets,\n WalineMeta,\n WalineSearchOptions,\n WalineSearchResult,\n} from '../typings/index.js';\n\nconst AVAILABLE_META: WalineMeta[] = ['nick', 'mail', 'link'];\n\nexport const getMeta = (meta: WalineMeta[]): WalineMeta[] =>\n meta.filter((item) => AVAILABLE_META.includes(item));\n\nexport const DEFAULT_EMOJI: WalineEmojiPresets[] = [\n '//unpkg.com/@waline/emojis@1.1.0/weibo',\n];\n\nexport const DEFAULT_REACTION = [\n '//unpkg.com/@waline/emojis/tieba/tieba_agree.png',\n '//unpkg.com/@waline/emojis/tieba/tieba_look_down.png',\n '//unpkg.com/@waline/emojis/tieba/tieba_sunglasses.png',\n '//unpkg.com/@waline/emojis/tieba/tieba_pick_nose.png',\n '//unpkg.com/@waline/emojis/tieba/tieba_awkward.png',\n '//unpkg.com/@waline/emojis/tieba/tieba_sleep.png',\n];\n\nexport const defaultUploadImage = (file: File): Promise<string> =>\n new Promise((resolve, reject) => {\n if (file.size > 128 * 1000)\n return reject(new Error('File too large! File size limit 128KB'));\n\n const reader = new FileReader();\n\n reader.readAsDataURL(file);\n reader.onload = (): void => resolve(reader.result as string);\n reader.onerror = reject;\n });\n\nexport const defaultTeXRenderer = (blockMode: boolean): string =>\n blockMode\n ? '<p class=\"wl-tex\">TeX is not available in preview</p>'\n : '<span class=\"wl-tex\">TeX is not available in preview</span>';\n\nexport const getDefaultSearchOptions = (lang: string): WalineSearchOptions => {\n interface GifResult {\n data: IGif[];\n meta: {\n msg: string;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n response_id: string;\n status: number;\n };\n pagination: {\n count: number;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n total_count: number;\n offset: number;\n };\n }\n\n const fetchGiphy = async (\n url: string,\n params: Record<string, string> = {},\n ): Promise<WalineSearchResult> =>\n fetch(\n `https://api.giphy.com/v1/gifs/${url}?${new URLSearchParams({\n lang,\n limit: '20',\n rating: 'g',\n // eslint-disable-next-line @typescript-eslint/naming-convention\n api_key: '6CIMLkNMMOhRcXPoMCPkFy4Ybk2XUiMp',\n ...params,\n }).toString()}`,\n )\n .then((resp) => resp.json() as Promise<GifResult>)\n .then(({ data }) =>\n data.map((gif) => ({\n title: gif.title,\n src: gif.images.downsized_medium.url,\n })),\n );\n\n return {\n search: (word: string): Promise<WalineSearchResult> =>\n fetchGiphy('search', { q: word, offset: '0' }),\n default: (): Promise<WalineSearchResult> => fetchGiphy('trending', {}),\n more: (word: string, offset = 0): Promise<WalineSearchResult> =>\n fetchGiphy('search', { q: word, offset: offset.toString() }),\n };\n};\n","/**\n * The MIT License (MIT)\n *\n * Copyright (c) egoist <0x142857@gmail.com> (https://egoistian.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\nconst WORD_REGEXP =\n /[\\u4E00-\\u9FFF\\u3400-\\u4dbf\\uf900-\\ufaff\\u3040-\\u309f\\uac00-\\ud7af\\u0400-\\u04FF]+|\\w+/;\nconst LEFT_ANGLE_REGEXP = /</;\nconst LINE_COMMENT_REGEXP = /(?:^|\\s)\\/\\/(.+?)$/gm;\nconst BLOCK_COMMENT_REGEXP = /\\/\\*([\\S\\s]*?)\\*\\//gm;\nconst REGEXP = new RegExp(\n `(${WORD_REGEXP.source}|${LEFT_ANGLE_REGEXP.source})|((?:${LINE_COMMENT_REGEXP.source})|(?:${BLOCK_COMMENT_REGEXP.source}))`,\n 'gmi',\n);\n\nconst COLORS = [\n '23AC69',\n '91C132',\n 'F19726',\n 'E8552D',\n '1AAB8E',\n 'E1147F',\n '2980C1',\n '1BA1E6',\n '9FA0A0',\n 'F19726',\n 'E30B20',\n 'E30B20',\n 'A3338B',\n];\nconst cache: Record<string, string> = {};\n\nexport const defaultHighlighter = (input: string): string => {\n let index = 0;\n\n return input.replace(REGEXP, (_match, word: string, comment: string) => {\n if (comment) return `<span style=\"color: slategray\">${comment}</span>`;\n if (word === '<') return '<';\n\n let color: string;\n\n if (cache[word]) color = cache[word];\n else {\n color = COLORS[index];\n cache[word] = color;\n }\n\n const out = `<span style=\"color: #${color}\">${word}</span>`;\n\n index = ++index % COLORS.length;\n\n return out;\n });\n};\n","import type { WalineLocale } from '../../typings/index.js';\n\nconst localeKeys = [\n 'nick',\n 'nickError',\n 'mail',\n 'mailError',\n 'link',\n 'optional',\n 'placeholder',\n 'sofa',\n 'submit',\n 'like',\n 'cancelLike',\n 'reply',\n 'cancelReply',\n 'comment',\n 'refresh',\n 'more',\n 'preview',\n 'emoji',\n 'uploadImage',\n 'seconds',\n 'minutes',\n 'hours',\n 'days',\n 'now',\n 'uploading',\n 'login',\n 'logout',\n 'admin',\n 'sticky',\n 'word',\n 'wordHint',\n 'anonymous',\n 'level0',\n 'level1',\n 'level2',\n 'level3',\n 'level4',\n 'level5',\n 'gif',\n 'gifSearchPlaceholder',\n 'profile',\n 'approved',\n 'waiting',\n 'spam',\n 'unsticky',\n 'oldest',\n 'latest',\n 'hottest',\n 'reactionTitle',\n];\n\nexport const generateLocale = (locale: string[]): WalineLocale =>\n Object.fromEntries(\n locale.map((item, index) => [localeKeys[index], item]),\n ) as unknown as WalineLocale;\n","/* de.ts */\n\nimport { generateLocale } from './generate.js';\n\nexport default generateLocale([\n 'Benutzername',\n 'Der Benutzername darf nicht weniger als 3 Bytes umfassen.',\n 'E-Mail',\n 'Bitte bestätigen Sie Ihre E-Mail-Adresse.',\n 'Webseite',\n 'Optional',\n 'Kommentieren Sie hier...',\n 'Noch keine Kommentare.',\n 'Senden',\n 'Gefällt mir',\n 'Gefällt mir nicht mehr',\n 'Antworten',\n 'Antwort abbrechen',\n 'Kommentare',\n 'Aktualisieren',\n 'Mehr laden...',\n 'Vorschau',\n 'Emoji',\n 'Ein Bild hochladen',\n 'Vor einigen Sekunden',\n 'Vor einigen Minuten',\n 'Vor einigen Stunden',\n 'Vor einigen Tagen',\n 'Gerade eben',\n 'Hochladen läuft',\n 'Anmelden',\n 'Abmelden',\n 'Admin',\n 'Angeheftet',\n 'Wörter',\n 'Bitte geben Sie Kommentare zwischen $0 und $1 Wörtern ein! Aktuelle Anzahl der Wörter: $2',\n 'Anonym',\n 'Zwerge',\n 'Hobbits',\n 'Ents',\n 'Magier',\n 'Elfen',\n 'Maïar',\n 'GIF',\n 'Nach einem GIF suchen',\n 'Profil',\n 'Genehmigt',\n 'Ausstehend',\n 'Spam',\n 'Lösen',\n 'Älteste',\n 'Neueste',\n 'Am beliebtesten',\n 'Was denken Sie?',\n]);\n","import { generateLocale } from './generate.js';\n\nexport default generateLocale([\n 'NickName',\n 'NickName cannot be less than 3 bytes.',\n 'E-Mail',\n 'Please confirm your email address.',\n 'Website',\n 'Optional',\n 'Comment here...',\n 'No comment yet.',\n 'Submit',\n 'Like',\n 'Cancel like',\n 'Reply',\n 'Cancel reply',\n 'Comments',\n 'Refresh',\n 'Load More...',\n 'Preview',\n 'Emoji',\n 'Upload Image',\n 'seconds ago',\n 'minutes ago',\n 'hours ago',\n 'days ago',\n 'just now',\n 'Uploading',\n 'Login',\n 'logout',\n 'Admin',\n 'Sticky',\n 'Words',\n 'Please input comments between $0 and $1 words!\\n Current word number: $2',\n 'Anonymous',\n 'Dwarves',\n 'Hobbits',\n 'Ents',\n 'Wizards',\n 'Elves',\n 'Maiar',\n 'GIF',\n 'Search GIF',\n 'Profile',\n 'Approved',\n 'Waiting',\n 'Spam',\n 'Unsticky',\n 'Oldest',\n 'Latest',\n 'Hottest',\n 'What do you think?',\n]);\n","import { generateLocale } from './generate.js';\n\nexport default generateLocale([\n 'Nombre de usuario',\n 'El nombre de usuario no puede tener menos de 3 bytes.',\n 'Correo electrónico',\n 'Por favor confirma tu dirección de correo electrónico.',\n 'Sitio web',\n 'Opcional',\n 'Comenta aquí...',\n 'Sin comentarios todavía.',\n 'Enviar',\n 'Like',\n 'Anular like',\n 'Responder',\n 'Anular respuesta',\n 'Comentarios',\n 'Recargar',\n 'Cargar Más...',\n 'Previsualizar',\n 'Emoji',\n 'Subir Imagen',\n 'segundos atrás',\n 'minutos atrás',\n 'horas atrás',\n 'días atrás',\n 'justo ahora',\n 'Subiendo',\n 'Iniciar sesión',\n 'cerrar sesión',\n 'Admin',\n 'Fijado',\n 'Palabras',\n 'Por favor escriba entre $0 y $1 palabras!\\n El número actual de palabras: $2',\n 'Anónimo',\n 'Enanos',\n 'Hobbits',\n 'Ents',\n 'Magos',\n 'Elfos',\n 'Maiar',\n 'GIF',\n 'Buscar GIF',\n 'Perfil',\n 'Aprobado',\n 'Esperando',\n 'Spam',\n 'Desfijar',\n 'Más antiguos',\n 'Más recientes',\n 'Más vistos',\n '¿Qué piensas?',\n]);\n","/* fr.ts */\n\nimport { generateLocale } from './generate.js';\n\nexport default generateLocale([\n 'Pseudo',\n 'Le pseudo ne peut pas faire moins de 3 octets.',\n 'E-mail',\n 'Veuillez confirmer votre adresse e-mail.',\n 'Site Web',\n 'Optionnel',\n 'Commentez ici...',\n \"Aucun commentaire pour l'instant.\",\n 'Envoyer',\n \"J'aime\",\n \"Annuler le j'aime\",\n 'Répondre',\n 'Annuler la réponse',\n 'Commentaires',\n 'Actualiser',\n 'Charger plus...',\n 'Aperçu',\n 'Emoji',\n 'Télécharger une image',\n 'Il y a quelques secondes',\n 'Il y a quelques minutes',\n 'Il y a quelques heures',\n 'Il y a quelques jours',\n \"À l'instant\",\n 'Téléchargement en cours',\n 'Connexion',\n 'Déconnexion',\n 'Admin',\n 'Épinglé',\n 'Mots',\n 'Veuillez saisir des commentaires entre $0 et $1 mots !\\n Nombre actuel de mots : $2',\n 'Anonyme',\n 'Nains',\n 'Hobbits',\n 'Ents',\n 'Mages',\n 'Elfes',\n 'Maïar',\n 'GIF',\n 'Rechercher un GIF',\n 'Profil',\n 'Approuvé',\n 'En attente',\n 'Indésirable',\n 'Détacher',\n 'Le plus ancien',\n 'Dernier',\n 'Le plus populaire',\n \"Qu'en pensez-vous ?\",\n]);\n","/* it.ts */\n/* Localization for Italian ~ Localizzazione italiana 🍕*/\n\nimport { generateLocale } from './generate.js';\n\nexport default generateLocale([\n 'Nickname',\n 'Il nickname non può avere meno di 3 caratteri.',\n 'E-mail',\n 'Per favore conferma il tuo indirizzo e-mail.',\n 'Sito web',\n 'Facoltativo',\n 'Scrivi un commento...',\n 'Ancora nessun commento.',\n 'Invia',\n 'Mi piace',\n 'Annulla mi piace',\n 'Rispondi',\n 'Annulla risposta',\n 'Commenti',\n 'Aggiorna',\n 'Carica altri...',\n 'Anteprima',\n 'Emoji',\n 'Carica immagine',\n 'secondi fa',\n 'minuti fa',\n 'ore fa',\n 'giorni fa',\n 'adesso',\n 'Caricamento in corso...',\n 'Accedi',\n 'Esci',\n 'Admin',\n 'In evidenza',\n 'Parole',\n 'Inserisci un commento tra $0 e $1 parole!\\n Numero attuale di parole: $2',\n 'Anonimo',\n 'Nano',\n 'Hobbit',\n 'Ent',\n 'Mago',\n 'Elfo',\n 'Maiar',\n 'GIF',\n 'Cerca GIF',\n 'Profilo',\n 'Approvato',\n 'In attesa',\n 'Spam',\n 'Rimuovi evidenza',\n 'Più vecchi',\n 'Più recenti',\n 'Più popolari',\n 'Cosa ne pensi?',\n]);\n","import { generateLocale } from './generate.js';\n\nexport default generateLocale([\n 'ニックネーム',\n '3バイト以上のニックネームをご入力ください.',\n 'メールアドレス',\n 'メールアドレスをご確認ください.',\n 'サイト',\n 'オプション',\n 'ここにコメント',\n 'コメントしましょう~',\n '提出する',\n 'Like',\n 'Cancel like',\n '返信する',\n 'キャンセル',\n 'コメント',\n '更新',\n 'さらに読み込む',\n 'プレビュー',\n '絵文字',\n '画像をアップロード',\n '秒前',\n '分前',\n '時間前',\n '日前',\n 'たっだ今',\n 'アップロード',\n 'ログインする',\n 'ログアウト',\n '管理者',\n 'トップに置く',\n 'ワード',\n 'コメントは $0 から $1 ワードの間でなければなりません!\\n 現在の単語番号: $2',\n '匿名',\n 'うえにん',\n 'なかにん',\n 'しもおし',\n '特にしもおし',\n 'かげ',\n 'なぬし',\n 'GIF',\n '探す GIF',\n '個人情報',\n '承認済み',\n '待っている',\n 'スパム',\n 'べたつかない',\n '逆順',\n '正順',\n '人気順',\n 'どう思いますか?',\n]);\n","import { generateLocale } from './generate.js';\n\nexport default generateLocale([\n 'Apelido',\n 'Apelido não pode ser menor que 3 bytes.',\n 'E-Mail',\n 'Por favor, confirme seu endereço de e-mail.',\n 'Website',\n 'Opcional',\n 'Comente aqui...',\n 'Nenhum comentário, ainda.',\n 'Enviar',\n 'Like',\n 'Cancel like',\n 'Responder',\n 'Cancelar resposta',\n 'Comentários',\n 'Refrescar',\n 'Carregar Mais...',\n 'Visualizar',\n 'Emoji',\n 'Enviar Imagem',\n 'segundos atrás',\n 'minutos atrás',\n 'horas atrás',\n 'dias atrás',\n 'agora mesmo',\n 'Enviando',\n 'Entrar',\n 'Sair',\n 'Admin',\n 'Sticky',\n 'Palavras',\n 'Favor enviar comentário com $0 a $1 palavras!\\n Número de palavras atuais: $2',\n 'Anônimo',\n 'Dwarves',\n 'Hobbits',\n 'Ents',\n 'Wizards',\n 'Elves',\n 'Maiar',\n 'GIF',\n 'Pesquisar GIF',\n 'informação pessoal',\n 'Aprovado',\n 'Espera',\n 'Spam',\n 'Unsticky',\n 'Mais velho',\n 'Mais recentes',\n 'Mais quente',\n 'O que você acha?',\n]);\n","import { generateLocale } from './generate.js';\n\nexport default generateLocale([\n 'Псевдоним',\n 'Никнейм не может быть меньше 3 байт.',\n 'Эл. адрес',\n 'Пожалуйста, подтвердите адрес вашей электронной почты.',\n 'Веб-сайт',\n 'Необязательный',\n 'Комментарий здесь...',\n 'Пока нет комментариев.',\n 'Отправить',\n 'Like',\n 'Cancel like',\n 'Отвечать',\n 'Отменить ответ',\n 'Комментарии',\n 'Обновить',\n 'Загрузи больше...',\n 'Превью',\n 'эмодзи',\n 'Загрузить изображение',\n 'секунд назад',\n 'несколько минут назад',\n 'несколько часов назад',\n 'дней назад',\n 'прямо сейчас',\n 'Загрузка',\n 'Авторизоваться',\n 'Выход из системы',\n 'Админ',\n 'Липкий',\n 'Слова',\n 'Пожалуйста, введите комментарии от $0 до $1 слов!\\nНомер текущего слова: $2',\n 'Анонимный',\n 'Dwarves',\n 'Hobbits',\n 'Ents',\n 'Wizards',\n 'Elves',\n 'Maiar',\n 'GIF',\n 'Поиск GIF',\n 'Персональные данные',\n 'Одобренный',\n 'Ожидающий',\n 'Спам',\n 'Нелипкий',\n 'самый старый',\n 'последний',\n 'самый горячий',\n 'Что вы думаете?',\n]);\n","import { generateLocale } from './generate.js';\n\nexport default generateLocale([\n 'Tên',\n 'Tên không được nhỏ hơn 3 ký tự.',\n 'E-Mail',\n 'Vui lòng xác nhập địa chỉ email của bạn.',\n 'Website',\n 'Tùy chọn',\n 'Hãy bình luận có văn hoá!',\n 'Chưa có bình luận',\n 'Gửi',\n 'Thích',\n 'Bỏ thích',\n 'Trả lời',\n 'Hủy bỏ',\n 'bình luận',\n 'Làm mới',\n 'Tải thêm...',\n 'Xem trước',\n 'Emoji',\n 'Tải lên hình ảnh',\n 'giây trước',\n 'phút trước',\n 'giờ trước',\n 'ngày trước',\n 'Vừa xong',\n 'Đang tải lên',\n 'Đăng nhập',\n 'đăng xuất',\n 'Quản trị viên',\n 'Dính',\n 'từ',\n 'Bình luận phải có độ dài giữa $0 và $1 từ!\\n Số từ hiện tại: $2',\n 'Vô danh',\n 'Người lùn',\n 'Người tí hon',\n 'Thần rừng',\n 'Pháp sư',\n 'Tiên tộc',\n 'Maiar',\n 'Ảnh GIF',\n 'Tìm kiếm ảnh GIF',\n 'thông tin cá nhân',\n 'Đã được phê duyệt',\n 'Đang chờ đợi',\n 'Thư rác',\n 'Không dính',\n 'lâu đời nhất',\n 'muộn nhất',\n 'nóng nhất',\n 'What do you think?',\n]);\n","import { generateLocale } from './generate.js';\n\nexport default generateLocale([\n '昵称',\n '昵称不能少于3个字符',\n '邮箱',\n '请填写正确的邮件地址',\n '网址',\n '可选',\n '欢迎评论',\n '来发评论吧~',\n '提交',\n '喜欢',\n '取消喜欢',\n '回复',\n '取消回复',\n '评论',\n '刷新',\n '加载更多...',\n '预览',\n '表情',\n '上传图片',\n '秒前',\n '分钟前',\n '小时前',\n '天前',\n '刚刚',\n '正在上传',\n '登录',\n '退出',\n '博主',\n '置顶',\n '字',\n '评论字数应在 $0 到 $1 字之间!\\n当前字数:$2',\n '匿名',\n '潜水',\n '冒泡',\n '吐槽',\n '活跃',\n '话痨',\n '传说',\n '表情包',\n '搜索表情包',\n '个人资料',\n '通过',\n '待审核',\n '垃圾',\n '取消置顶',\n '按倒序',\n '按正序',\n '按热度',\n '你认为这篇文章怎么样?',\n]);\n","import { generateLocale } from './generate.js';\n\nexport default generateLocale([\n '暱稱',\n '暱稱不能少於3個字元',\n '郵箱',\n '請填寫正確的郵件地址',\n '網址',\n '可選',\n '歡迎留言',\n '來發留言吧~',\n '送出',\n '喜歡',\n '取消喜歡',\n '回覆',\n '取消回覆',\n '留言',\n '重整',\n '載入更多...',\n '預覽',\n '表情',\n '上傳圖片',\n '秒前',\n '分鐘前',\n '小時前',\n '天前',\n '剛剛',\n '正在上傳',\n '登入',\n '登出',\n '管理者',\n '置頂',\n '字',\n '留言字數應在 $0 到 $1 字之間!\\n目前字數:$2',\n '匿名',\n '潛水',\n '冒泡',\n '吐槽',\n '活躍',\n '多話',\n '傳說',\n '表情包',\n '搜尋表情包',\n '個人資料',\n '通過',\n '待審核',\n '垃圾',\n '取消置頂',\n '最早',\n '最新',\n '熱門',\n '你認為這篇文章怎麼樣?',\n]);\n","import de from './de.js';\nimport en from './en.js';\nimport es from './es.js';\nimport fr from './fr.js';\nimport it from './it.js';\nimport jp from './jp.js';\nimport ptBR from './pt-BR.js';\nimport ru from './ru.js';\nimport viVN from './vi-VN.js';\nimport zhCN from './zh-CN.js';\nimport zhTW from './zh-TW.js';\nimport type { WalineLocale } from '../../typings/index.js';\n\nexport type Locales = Record<string, WalineLocale>;\n\nexport const DEFAULT_LANG = 'en-US';\n\nexport const DEFAULT_LOCALES: Locales = {\n zh: zhCN,\n 'zh-cn': zhCN,\n 'zh-tw': zhTW,\n en,\n 'en-us': en,\n fr,\n 'fr-fr': fr,\n it,\n 'it-it': it,\n jp,\n 'jp-jp': jp,\n 'pt-br': ptBR,\n ru,\n 'ru-ru': ru,\n vi: viVN,\n 'vi-vn': viVN,\n de,\n es,\n 'es-mx': es,\n};\n\nexport const getLocale = (lang: string): WalineLocale =>\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n DEFAULT_LOCALES[lang.toLowerCase()] ||\n DEFAULT_LOCALES[DEFAULT_LANG.toLowerCase()];\n\nexport const getLang = (lang: string): string =>\n Object.keys(DEFAULT_LOCALES).includes(lang.toLowerCase())\n ? lang\n : DEFAULT_LANG;\n","import type { WalineCommentSorting } from '../typings/index.js';\n\nexport type SortKey = 'insertedAt_desc' | 'insertedAt_asc' | 'like_desc';\n\nexport const sortKeyMap: Record<WalineCommentSorting, SortKey> = {\n latest: 'insertedAt_desc',\n oldest: 'insertedAt_asc',\n hottest: 'like_desc',\n};\n\nexport const sortingMethods = Object.keys(sortKeyMap) as WalineCommentSorting[];\n","import type { ComputedRef, InjectionKey } from 'vue';\n\nimport type { WalineConfig } from '../utils/config.js';\n\nexport const configKey: InjectionKey<ComputedRef<WalineConfig>> =\n Symbol('waline-config');\n\nexport * from './default.js';\nexport * from './highlighter.js';\nexport * from './i18n/index.js';\nexport * from './sortKey.js';\n","<script setup lang=\"ts\">\nimport { getArticleCounter, updateArticleCounter } from '@waline/api';\nimport { computed, inject, onMounted, onUnmounted, ref } from 'vue';\n\nimport { LoadingIcon } from './Icons.js';\nimport { useReactionStorage } from '../composables/index.js';\nimport type { WalineReactionLocale } from '../typings/index.js';\nimport { configKey } from '../config/index.js';\nimport { watchImmediate } from '@vueuse/core';\n\ninterface ReactionItem {\n icon: string;\n desc: string;\n active?: boolean;\n}\n\nconst reactionStorage = useReactionStorage();\n// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\nconst config = inject(configKey)!;\n\nconst votingIndex = ref(-1);\nconst voteNumbers = ref<number[]>([]);\n\nconst locale = computed(() => config.value.locale);\nconst reaction = computed(() => {\n const { reaction } = config.value;\n\n return reaction?.length ? reaction : null;\n});\n\nconst reactionsInfo = computed<ReactionItem[] | null>(() => {\n const { path } = config.value;\n\n return (\n reaction.value?.map((icon, index) => ({\n icon,\n desc: locale.value[`reaction${index}` as keyof WalineReactionLocale],\n active: reactionStorage.value[path] === index,\n })) ?? null\n );\n});\n\nlet abort: (() => void) | undefined;\n\nconst fetchReaction = async (): Promise<void> => {\n const { serverURL, lang, path } = config.value;\n\n if (!reaction.value) return;\n\n const controller = new AbortController();\n\n abort = controller.abort.bind(controller);\n\n const [reactionData] = (await getArticleCounter({\n serverURL,\n lang,\n paths: [path],\n type: reaction.value.map((_, index) => `reaction${index}`),\n signal: controller.signal,\n })) as Record<string, number>[];\n\n voteNumbers.value = reaction.value.map(\n (_, index) => reactionData[`reaction${index}`],\n );\n};\n\nconst vote = async (index: number): Promise<void> => {\n // we should ensure that only one vote request is sent at a time\n if (votingIndex.value !== -1) return;\n\n const { serverURL, lang, path } = config.value;\n const currentVoteItemIndex = reactionStorage.value[path];\n\n // mark voting status\n votingIndex.value = index;\n\n // if user already vote current article, decrease the voted item number\n if (currentVoteItemIndex !== undefined) {\n await updateArticleCounter({\n serverURL,\n lang,\n path,\n type: `reaction${currentVoteItemIndex}`,\n action: 'desc',\n });\n\n voteNumbers.value[currentVoteItemIndex] = Math.max(\n voteNumbers.value[currentVoteItemIndex] - 1,\n 0,\n );\n }\n\n // increase voting number if current reaction item is not been voted\n if (currentVoteItemIndex !== index) {\n await updateArticleCounter({\n serverURL,\n lang,\n path,\n type: `reaction${index}`,\n });\n voteNumbers.value[index] = (voteNumbers.value[index] || 0) + 1;\n }\n\n // update vote info in local storage\n if (currentVoteItemIndex === index) delete reactionStorage.value[path];\n else reactionStorage.value[path] = index;\n\n // voting is completed\n votingIndex.value = -1;\n};\n\nonMounted(() => {\n watchImmediate(\n () => [config.value.serverURL, config.value.path],\n () => fetchReaction(),\n );\n});\n\nonUnmounted(() => {\n abort?.();\n});\n</script>\n\n<template>\n <div v-if=\"reactionsInfo\" class=\"wl-reaction\">\n <div class=\"wl-reaction-title\" v-text=\"locale.reactionTitle\" />\n\n <ul class=\"wl-reaction-list\">\n <li\n v-for=\"({ active, icon, desc }, index) in reactionsInfo\"\n :key=\"index\"\n class=\"wl-reaction-item\"\n :class=\"{ active }\"\n @click=\"vote(index)\"\n >\n <div class=\"wl-reaction-img\">\n <img :src=\"icon\" :alt=\"desc\" />\n\n <LoadingIcon\n v-if=\"votingIndex === index\"\n class=\"wl-reaction-loading\"\n />\n\n <div\n v-else\n class=\"wl-reaction-votes\"\n v-text=\"voteNumbers[index] || 0\"\n />\n </div>\n\n <div class=\"wl-reaction-text\" v-text=\"desc\" />\n </li>\n </ul>\n </div>\n</template>\n","<!-- forked from https://github.com/DerYeger/vue-masonry-wall/blob/master/src/masonry-wall.vue -->\n\n<!--\n MIT License\n\n Copyright (c) 2021 Fuxing Loh, Jan Müller\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE. \n-->\n\n<script setup lang=\"ts\">\nimport {\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n useTemplateRef,\n watch,\n} from 'vue';\n\nimport { LoadingIcon } from './Icons.js';\nimport type { WalineSearchResult } from '../typings/index.js';\n\ntype Column = number[];\n\nconst props = withDefaults(\n defineProps<{\n /**\n * Image Items\n */\n items?: WalineSearchResult;\n /**\n * width in pixels of each column\n */\n columnWidth?: number;\n /**\n * gap in pixels between columns\n */\n gap?: number;\n }>(),\n {\n items: () => [] as WalineSearchResult,\n columnWidth: 300,\n gap: 0,\n },\n);\n\ndefineEmits<(event: 'insert', content: string) => void>();\n\nlet resizeObserver: ResizeObserver | null = null;\nconst wall = useTemplateRef<HTMLDivElement>('wall');\nconst state = ref<Record<string, boolean>>({});\nconst columns = ref<Column[]>([]);\n\nconst getColumnCount = (): number => {\n const count = Math.floor(\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n (wall.value!.getBoundingClientRect().width + props.gap) /\n (props.columnWidth + props.gap),\n );\n\n return count > 0 ? count : 1;\n};\n\nconst createColumns = (count: number): Column[] =>\n new Array(count).fill(null).map(() => []);\n\nconst fillColumns = async (itemIndex: number): Promise<void> => {\n if (itemIndex >= props.items.length) return;\n\n await nextTick();\n\n // @ts-expect-error: Type is Element not HTMLElement\n const columnDivs = Array.from<HTMLElement>(wall.value?.children ?? []);\n\n const target = columnDivs.reduce((prev, curr) =>\n curr.getBoundingClientRect().height < prev.getBoundingClientRect().height\n ? curr\n : prev,\n );\n\n columns.value[Number(target.dataset.index)].push(itemIndex);\n\n await fillColumns(itemIndex + 1);\n};\n\nconst redraw = async (force = false): Promise<void> => {\n if (columns.value.length === getColumnCount() && !force) return;\n\n columns.value = createColumns(getColumnCount());\n\n const scrollY = window.scrollY;\n\n await fillColumns(0);\n\n window.scrollTo({ top: scrollY });\n};\n\nconst imageLoad = (e: Event): void => {\n state.value[(e.target as HTMLImageElement).src] = true;\n};\n\nonMounted(() => {\n void redraw(true);\n\n resizeObserver = new ResizeObserver(() => {\n void redraw();\n });\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n resizeObserver.observe(wall.value!);\n\n watch(\n () => [props.items],\n () => {\n state.value = {};\n void redraw(true);\n },\n );\n watch(\n () => [props.columnWidth, props.gap],\n () => {\n void redraw();\n },\n );\n});\n\nonBeforeUnmount(() => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n resizeObserver!.unobserve(wall.value!);\n});\n</script>\n\n<template>\n <div ref=\"wall\" class=\"wl-gallery\" :style=\"{ gap: `${gap}px` }\">\n <div\n v-for=\"(column, columnIndex) in columns\"\n :key=\"columnIndex\"\n class=\"wl-gallery-column\"\n :data-index=\"columnIndex\"\n :style=\"{ gap: `${gap}px` }\"\n >\n <template v-for=\"itemIndex in column\" :key=\"itemIndex\">\n <!-- eslint-disable vue/no-static-inline-styles -->\n <LoadingIcon\n v-if=\"!state[items[itemIndex].src]\"\n :size=\"36\"\n style=\"margin: 20px auto\"\n />\n <!-- eslint-enable vue/no-static-inline-styles -->\n\n <img\n class=\"wl-gallery-item\"\n :src=\"items[itemIndex].src\"\n :title=\"items[itemIndex].title\"\n loading=\"lazy\"\n @load=\"imageLoad\"\n @click=\"$emit('insert', ``)\"\n />\n </template>\n </div>\n </div>\n</template>\n","export const decodePath = (path: string): string => {\n try {\n path = decodeURI(path);\n } catch {\n // ignore error\n }\n\n return path;\n};\n\nexport const removeEndingSplash = (content = ''): string =>\n content.replace(/\\/$/u, '');\n\nexport const isLinkHttp = (link: string): boolean =>\n /^(https?:)?\\/\\//.test(link);\n","import { decodePath, isLinkHttp, removeEndingSplash } from './path.js';\nimport {\n DEFAULT_EMOJI,\n DEFAULT_REACTION,\n defaultHighlighter,\n defaultTeXRenderer,\n defaultUploadImage,\n getDefaultSearchOptions,\n getLang,\n getLocale,\n getMeta,\n} from '../config/index.js';\nimport type {\n WalineEmojiInfo,\n WalineEmojiMaps,\n WalineEmojiPresets,\n WalineHighlighter,\n WalineImageUploader,\n WalineLocale,\n WalineProps,\n WalineSearchOptions,\n WalineTeXRenderer,\n} from '../typings/index.js';\n\nexport interface WalineEmojiConfig {\n tabs: Pick<WalineEmojiInfo, 'name' | 'icon' | 'items'>[];\n map: WalineEmojiMaps;\n}\n\nexport interface WalineConfig\n extends Required<\n Omit<\n WalineProps,\n | 'emoji'\n | 'imageUploader'\n | 'highlighter'\n | 'texRenderer'\n | 'wordLimit'\n | 'reaction'\n | 'search'\n >\n > {\n locale: WalineLocale;\n wordLimit: [number, number] | false;\n emoji: (WalineEmojiInfo | WalineEmojiPresets)[] | null;\n highlighter: WalineHighlighter | null;\n imageUploader: WalineImageUploader | null;\n texRenderer: WalineTeXRenderer | null;\n search: WalineSearchOptions | null;\n reaction: string[] | null;\n}\n\nexport const getServerURL = (serverURL: string): string => {\n const result = removeEndingSplash(serverURL);\n\n return isLinkHttp(result) ? result : `https://${result}`;\n};\n\nconst getWordLimit = (\n wordLimit: WalineProps['wordLimit'],\n): [number, number] | false =>\n Array.isArray(wordLimit) ? wordLimit : wordLimit ? [0, wordLimit] : false;\n\nconst fallback = <T = unknown>(\n value: T | boolean | undefined,\n fallback: T,\n): T | null =>\n value == undefined || value === true\n ? fallback\n : value === false\n ? null\n : value;\n\nexport const getConfig = ({\n serverURL,\n\n path = location.pathname,\n lang = typeof navigator === 'undefined' ? 'en-US' : navigator.language,\n locale,\n meta = ['nick', 'mail', 'link'],\n requiredMeta = [],\n dark = false,\n pageSize = 10,\n wordLimit,\n noCopyright = false,\n login = 'enable',\n recaptchaV3Key = '',\n turnstileKey = '',\n commentSorting = 'latest',\n emoji = DEFAULT_EMOJI,\n imageUploader,\n highlighter,\n texRenderer,\n search,\n reaction,\n ...more\n}: WalineProps): WalineConfig => ({\n serverURL: getServerURL(serverURL),\n path: decodePath(path),\n lang: getLang(lang),\n locale: {\n ...getLocale(getLang(lang)),\n ...(typeof locale === 'object' ? locale : {}),\n } as WalineLocale,\n wordLimit: getWordLimit(wordLimit),\n meta: getMeta(meta),\n requiredMeta: getMeta(requiredMeta),\n dark,\n pageSize,\n commentSorting,\n login,\n noCopyright,\n recaptchaV3Key,\n turnstileKey,\n ...more,\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n reaction: reaction === true ? DEFAULT_REACTION : reaction || null,\n imageUploader: fallback(imageUploader, defaultUploadImage),\n highlighter: fallback(highlighter, defaultHighlighter),\n texRenderer: fallback(texRenderer, defaultTeXRenderer),\n emoji: fallback(emoji, DEFAULT_EMOJI),\n search: fallback(search, getDefaultSearchOptions(lang)),\n});\n","export const isString = (val: unknown): val is string =>\n typeof val === 'string';\n","import { isString } from './type.js';\n\nconst DARK_VARIABLES = `{--waline-white:#000;--waline-light-grey:#666;--waline-dark-grey:#999;--waline-color:#888;--waline-bg-color:#1e1e1e;--waline-bg-color-light:#272727;--waline-bg-color-hover: #444;--waline-border-color:#333;--waline-disable-bg-color:#444;--waline-disable-color:#272727;--waline-bq-color:#272727;--waline-info-bg-color:#272727;--waline-info-color:#666}`;\n\nexport const getDarkStyle = (selector?: string | boolean): string =>\n isString(selector)\n ? selector === 'auto'\n ? `@media(prefers-color-scheme:dark){body${DARK_VARIABLES}}`\n : `${selector}${DARK_VARIABLES}`\n : selector === true\n ? `:root${DARK_VARIABLES}`\n : '';\n","import { isString } from './type.js';\nimport type { WalineDateLocale } from '../typings/index.js';\n\nconst padWithZeros = (vNumber: number, width: number): string => {\n let numAsString = vNumber.toString();\n\n while (numAsString.length < width) {\n numAsString = '0' + numAsString;\n }\n\n return numAsString;\n};\n\nexport const dateFormat = (date: Date): string => {\n const vDay = padWithZeros(date.getDate(), 2);\n const vMonth = padWithZeros(date.getMonth() + 1, 2);\n const vYear = padWithZeros(date.getFullYear(), 2);\n\n return `${vYear}-${vMonth}-${vDay}`;\n};\n\nexport const getTimeAgo = (\n date: Date | string,\n now: Date,\n locale: WalineDateLocale,\n): string => {\n if (!date) return '';\n\n const time = isString(date)\n ? new Date(date.includes(' ') ? date.replace(/-/g, '/') : date)\n : date;\n\n const timePassed = now.getTime() - time.getTime();\n\n const days = Math.floor(timePassed / (24 * 3600 * 1000));\n\n if (days === 0) {\n // 计算相差小时数\n\n // 计算天数后剩余的毫秒数\n const leave1 = timePassed % (24 * 3600 * 1000);\n const hours = Math.floor(leave1 / (3600 * 1000));\n\n if (hours === 0) {\n //计算相差分钟数\n\n // 计算小时数后剩余的毫秒数\n const leave2 = leave1 % (3600 * 1000);\n const minutes = Math.floor(leave2 / (60 * 1000));\n\n // 计算相差秒数\n if (minutes === 0) {\n // 计算分钟数后剩余的毫秒数\n const leave3 = leave2 % (60 * 1000);\n const seconds = Math.round(leave3 / 1000);\n\n return `${seconds} ${locale.seconds}`;\n }\n\n return `${minutes} ${locale.minutes}`;\n }\n\n return `${hours} ${locale.hours}`;\n }\n\n if (days < 0) return locale.now;\n\n if (days < 8) return `${days} ${locale.days}`;\n\n return dateFormat(time);\n};\n","/**\n * @ref https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address\n */\nconst EMAIL_REG_EXP =\n /^[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])?)*$/;\n\nexport const isValidEmail = (email: string): boolean =>\n EMAIL_REG_EXP.test(email);\n","import { useStorage } from '@vueuse/core';\n\nimport type { WalineEmojiConfig } from './config.js';\nimport { removeEndingSplash } from './path.js';\nimport { isString } from './type.js';\nimport type { WalineEmojiInfo } from '../typings/index.js';\n\nconst EMOJI_STORE_KEY = 'WALINE_EMOJI';\n\nconst emojiStore = useStorage<Record<string, WalineEmojiInfo | undefined>>(\n EMOJI_STORE_KEY,\n {},\n);\n\nconst checkVersionAnnotation = (url: string): boolean =>\n /@[0-9]+\\.[0-9]+\\.[0-9]+/.test(url);\n\nconst fetchEmoji = (link: string): Promise<WalineEmojiInfo> => {\n const containsVersion = checkVersionAnnotation(link);\n\n // if the link contains version annotation, check if it's in the cache store\n if (containsVersion) {\n const info = emojiStore.value[link];\n\n if (info) return Promise.resolve(info);\n }\n\n return fetch(`${link}/info.json`)\n .then((resp) => resp.json() as Promise<Omit<WalineEmojiInfo, 'folder'>>)\n .then((emojiInfo) => {\n const info = {\n folder: link,\n ...emojiInfo,\n };\n\n // cache the emoji info if the link contains version annotation\n if (containsVersion) emojiStore.value[link] = info;\n\n return info;\n });\n};\n\nconst getLink = (name: string, folder = '', prefix = '', type = ''): string =>\n `${folder ? `${folder}/` : ''}${prefix}${name}${type ? `.${type}` : ''}`;\n\nexport const getEmojisInfo = (\n emojis: (string | WalineEmojiInfo)[] | null,\n): Promise<WalineEmojiConfig> =>\n Promise.all(\n emojis\n ? emojis.map((emoji) =>\n isString(emoji)\n ? fetchEmoji(removeEndingSplash(emoji))\n : Promise.resolve(emoji),\n )\n : [],\n ).then((emojiInfos) => {\n const emojisConfig: WalineEmojiConfig = {\n tabs: [],\n map: {},\n };\n\n emojiInfos.forEach((emojiInfo) => {\n const { name, folder, icon, prefix = '', type, items } = emojiInfo;\n\n emojisConfig.tabs.push({\n name,\n icon: getLink(icon, folder, prefix, type),\n items: items.map((item) => {\n const key = `${prefix}${item}`;\n\n emojisConfig.map[key] = getLink(item, folder, prefix, type);\n\n return key;\n }),\n });\n });\n\n return emojisConfig;\n });\n","const isImage = (item: DataTransferItem): boolean =>\n item.type.includes('image');\n\nexport const getImageFromDataTransfer = (\n items: DataTransferItemList,\n): File | null => {\n const image = Array.from(items).find(isImage);\n\n return image ? image.getAsFile() : null;\n};\n","import type { TokenizerExtension } from 'marked';\n\nimport type { WalineTeXRenderer } from '../typings/index.js';\n\nconst inlineMathStart = /\\$.*?\\$/;\nconst inlineMathReg = /^\\$(.*?)\\$/;\nconst blockMathReg = /^(?:\\s{0,3})\\$\\$((?:[^\\n]|\\n[^\\n])+?)\\n{0,1}\\$\\$/;\n\nexport const markedTeXExtensions = (\n texRenderer: WalineTeXRenderer,\n): TokenizerExtension[] => {\n const blockMathExtension: TokenizerExtension = {\n name: 'blockMath',\n level: 'block',\n tokenizer(src: string) {\n const cap = blockMathReg.exec(src);\n\n if (cap !== null) {\n return {\n type: 'html',\n raw: cap[0],\n text: texRenderer(true, cap[1]),\n };\n }\n\n return undefined;\n },\n };\n\n const inlineMathExtension: TokenizerExtension = {\n name: 'inlineMath',\n level: 'inline',\n start(src: string) {\n const idx = src.search(inlineMathStart);\n\n return idx !== -1 ? idx : src.length;\n },\n tokenizer(src: string) {\n const cap = inlineMathReg.exec(src);\n\n if (cap !== null) {\n return {\n type: 'html',\n raw: cap[0],\n text: texRenderer(false, cap[1]),\n };\n }\n\n return undefined;\n },\n };\n\n return [blockMathExtension, inlineMathExtension];\n};\n","import { Marked } from 'marked';\nimport { markedHighlight } from 'marked-highlight';\n\nimport { markedTeXExtensions } from './markedMathExtension.js';\nimport type {\n WalineEmojiMaps,\n WalineHighlighter,\n WalineTeXRenderer,\n} from '../typings/index.js';\n\nexport const parseEmoji = (text = '', emojiMap: WalineEmojiMaps = {}): string =>\n text.replace(/:(.+?):/g, (placeholder, key: string) =>\n emojiMap[key]\n ? `<img class=\"wl-emoji\" src=\"${emojiMap[key]}\" alt=\"${key}\">`\n : placeholder,\n );\n\nexport interface ParseMarkdownOptions {\n emojiMap: WalineEmojiMaps;\n highlighter: WalineHighlighter | null;\n texRenderer: WalineTeXRenderer | null;\n}\n\nexport const parseMarkdown = (\n content: string,\n { emojiMap, highlighter, texRenderer }: ParseMarkdownOptions,\n): string => {\n const marked = new Marked();\n\n marked.setOptions({ breaks: true });\n\n if (highlighter) marked.use(markedHighlight({ highlight: highlighter }));\n\n if (texRenderer) {\n const extensions = markedTeXExtensions(texRenderer);\n\n marked.use({ extensions });\n }\n\n return marked.parse(parseEmoji(content, emojiMap)) as string;\n};\n","/**\n * The wordCount module should be lightweight as it's packed into client.\n *\n * So We just make a simple implement here\n *\n * Forked from https://github.com/vuepress-theme-hope/vuepress-theme-hope/blob/main/packages/reading-time2/src/node/readingTime.ts\n */\n\n/**\n * Extract Latin words from content\n */\nexport const getWords = (content: string): RegExpMatchArray | null =>\n // \\u00C0-\\u024F are Latin Supplement letters, maybe used in language like french\n // \\u0400-\\u04FF are Cyrillic letters, used in russian\n content.match(/[\\w\\d\\s,.\\u00C0-\\u024F\\u0400-\\u04FF]+/giu);\n\n/**\n * Extract Chinese Characters from content\n */\nexport const getChinese = (content: string): RegExpMatchArray | null =>\n content.match(/[\\u4E00-\\u9FD5]/gu);\n\n/**\n * Get word number of given string\n */\nexport const getWordNumber = (content: string): number =>\n (getWords(content)?.reduce<number>(\n (accumulator, word) =>\n accumulator +\n (['', ',', '.'].includes(word.trim())\n ? 0\n : word.trim().split(/\\s+/u).length),\n 0,\n ) ?? 0) + (getChinese(content)?.length ?? 0);\n","// NOTE: These types are forked from \"user-agent-data-types\" package\n\n// WICG Spec: https://wicg.github.io/ua-client-hints\n\ndeclare global {\n interface Navigator {\n readonly userAgentData?: NavigatorUAData;\n }\n}\n\n// https://wicg.github.io/ua-client-hints/#dictdef-navigatoruabrandversion\ninterface NavigatorUABrandVersion {\n readonly brand: string;\n readonly version: string;\n}\n\n// https://wicg.github.io/ua-client-hints/#dictdef-uadatavalues\ninterface UADataValues {\n readonly brands?: NavigatorUABrandVersion[];\n readonly mobile?: boolean;\n readonly platform?: string;\n readonly architecture?: string;\n readonly bitness?: string;\n readonly formFactor?: string[];\n readonly model?: string;\n readonly platformVersion?: string;\n /** @deprecated in favour of fullVersionList */\n readonly uaFullVersion?: string;\n readonly fullVersionList?: NavigatorUABrandVersion[];\n readonly wow64?: boolean;\n}\n\n// https://wicg.github.io/ua-client-hints/#dictdef-ualowentropyjson\ninterface UALowEntropyJSON {\n readonly brands: NavigatorUABrandVersion[];\n readonly mobile: boolean;\n readonly platform: string;\n}\n\n// https://wicg.github.io/ua-client-hints/#navigatoruadata\ninterface NavigatorUAData extends UALowEntropyJSON {\n getHighEntropyValues(hints: string[]): Promise<UADataValues>;\n toJSON(): UALowEntropyJSON;\n}\n\nexport const userAgent = async (): Promise<string> => {\n const { userAgentData } = navigator;\n let ua = navigator.userAgent;\n\n // https://learn.microsoft.com/en-us/microsoft-edge/web-platform/how-to-detect-win11\n if (userAgentData?.platform !== 'Windows') {\n return ua;\n }\n\n const { platformVersion } = await userAgentData.getHighEntropyValues([\n 'platformVersion',\n ]);\n\n if (!platformVersion) {\n return ua;\n }\n\n const isWindows11Later = parseInt(platformVersion.split('.')[0]) >= 13;\n\n if (isWindows11Later) {\n ua = ua.replace('Windows NT 10.0', 'Windows NT 11.0');\n }\n\n return ua;\n};\n","<script setup lang=\"ts\">\nimport { useDebounceFn, useEventListener, watchImmediate } from '@vueuse/core';\nimport type { WalineComment, WalineCommentData, UserInfo } from '@waline/api';\nimport { addComment, login, updateComment } from '@waline/api';\nimport autosize from 'autosize';\nimport type { DeepReadonly } from 'vue';\nimport {\n computed,\n inject,\n nextTick,\n onMounted,\n reactive,\n ref,\n useTemplateRef,\n watch,\n} from 'vue';\n\nimport {\n CloseIcon,\n EmojiIcon,\n GifIcon,\n ImageIcon,\n LoadingIcon,\n MarkdownIcon,\n PreviewIcon,\n} from './Icons.js';\nimport ImageWall from './ImageWall.vue';\nimport {\n useEditor,\n useReCaptcha,\n useTurnstile,\n useUserInfo,\n useUserMeta,\n} from '../composables/index.js';\nimport type { WalineSearchResult } from '../typings/index.js';\nimport type { WalineEmojiConfig } from '../utils/index.js';\nimport {\n getEmojisInfo,\n getImageFromDataTransfer,\n getWordNumber,\n isValidEmail,\n parseEmoji,\n parseMarkdown,\n userAgent,\n} from '../utils/index.js';\nimport { configKey } from '../config/index.js';\n\nconst props = defineProps<{\n /**\n * Current comment to be edited\n */\n edit?: WalineComment | null;\n /**\n * Root comment id\n */\n rootId?: number;\n /**\n * Comment id to be replied\n */\n replyId?: number;\n /**\n * User name to be replied\n */\n replyUser?: string;\n}>();\n\nconst emit = defineEmits<{\n (event: 'log' | 'cancelEdit' | 'cancelReply'): void;\n (event: 'submit', comment: WalineComment): void;\n}>();\n\n// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\nconst config = inject(configKey)!;\n\nconst editor = useEditor();\nconst userMeta = useUserMeta();\nconst userInfo = useUserInfo();\n\nconst inputRefs = ref<Record<string, HTMLInputElement>>({});\nconst textAreaRef = useTemplateRef<HTMLTextAreaElement>('textarea');\nconst imageUploaderRef = useTemplateRef<HTMLInputElement>('image-uploader');\nconst emojiButtonRef = useTemplateRef<HTMLDivElement>('emoji-button');\nconst emojiPopupRef = useTemplateRef<HTMLDivElement>('emoji-popup');\nconst gifButtonRef = useTemplateRef<HTMLDivElement>('gif-button');\nconst gifPopupRef = useTemplateRef<HTMLDivElement>('gif-popup');\nconst gifSearchRef = useTemplateRef<HTMLInputElement>('gif-search');\n\nconst emoji = ref<DeepReadonly<WalineEmojiConfig>>({ tabs: [], map: {} });\nconst emojiTabIndex = ref(0);\nconst showEmoji = ref(false);\nconst showGif = ref(false);\nconst showPreview = ref(false);\nconst previewText = ref('');\nconst wordNumber = ref(0);\n\nconst searchResults = reactive({\n loading: true,\n list: [] as WalineSearchResult,\n});\n\nconst wordLimit = ref(0);\nconst isWordNumberLegal = ref(false);\n\nconst content = ref('');\n\nconst isSubmitting = ref(false);\n\nconst isImageListEnd = ref(false);\n\nconst locale = computed(() => config.value.locale);\n\nconst isLogin = computed(() => Boolean(userInfo.value.token));\n\nconst canUploadImage = computed(() => config.value.imageUploader !== null);\n\nconst insert = (content: string): void => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const textArea = textAreaRef.value!;\n const startPosition = textArea.selectionStart;\n const endPosition = textArea.selectionEnd || 0;\n const scrollTop = textArea.scrollTop;\n\n editor.value =\n textArea.value.substring(0, startPosition) +\n content +\n textArea.value.substring(endPosition, textArea.value.length);\n textArea.focus();\n textArea.selectionStart = startPosition + content.length;\n textArea.selectionEnd = startPosition + content.length;\n textArea.scrollTop = scrollTop;\n};\n\nconst onEditorKeyDown = ({ key, ctrlKey, metaKey }: KeyboardEvent): void => {\n // avoid submitting same comment multiple times\n if (isSubmitting.value) return;\n\n // submit comment when pressing cmd|ctrl + enter\n if ((ctrlKey || metaKey) && key === 'Enter') void submitComment();\n};\n\nconst uploadImage = async (file: File): Promise<void> => {\n const uploadText = `![${config.value.locale.uploading} ${file.name}]()`;\n\n insert(uploadText);\n isSubmitting.value = true;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const url = await config.value.imageUploader!(file);\n\n editor.value = editor.value.replace(\n uploadText,\n `\\r\\n`,\n );\n } catch (err) {\n alert((err as Error).message);\n editor.value = editor.value.replace(uploadText, '');\n } finally {\n isSubmitting.value = false;\n }\n};\n\nconst onEditorDrop = (event: DragEvent): void => {\n if (event.dataTransfer?.items) {\n const file = getImageFromDataTransfer(event.dataTransfer.items);\n\n if (file && canUploadImage.value) {\n void uploadImage(file);\n event.preventDefault();\n }\n }\n};\n\nconst onEditorPaste = (event: ClipboardEvent): void => {\n if (event.clipboardData) {\n const file = getImageFromDataTransfer(event.clipboardData.items);\n\n if (file && canUploadImage.value) void uploadImage(file);\n }\n};\n\nconst onImageChange = (): void => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const inputElement = imageUploaderRef.value!;\n\n if (inputElement.files && canUploadImage.value)\n void uploadImage(inputElement.files[0]).then(() => {\n // clear input so a same image can be uploaded later\n inputElement.value = '';\n });\n};\n\nconst submitComment = async (): Promise<void> => {\n const {\n serverURL,\n lang,\n login,\n wordLimit,\n requiredMeta,\n recaptchaV3Key,\n turnstileKey,\n } = config.value;\n\n const comment: WalineCommentData = {\n comment: content.value,\n nick: userMeta.value.nick,\n mail: userMeta.value.mail,\n link: userMeta.value.link,\n url: config.value.path,\n ua: await userAgent(),\n };\n\n if (!props.edit) {\n // https://github.com/walinejs/waline/issues/2163\n if (userInfo.value.token) {\n // login user\n comment.nick = userInfo.value.display_name;\n comment.mail = userInfo.value.email;\n comment.link = userInfo.value.url;\n } else {\n if (login === 'force') return;\n\n // check nick\n if (requiredMeta.includes('nick') && !comment.nick) {\n inputRefs.value.nick.focus();\n\n alert(locale.value.nickError);\n\n return;\n }\n\n // check mail\n if (\n (requiredMeta.includes('mail') && !comment.mail) ||\n (comment.mail && !isValidEmail(comment.mail))\n ) {\n inputRefs.value.mail.focus();\n\n alert(locale.value.mailError);\n\n return;\n }\n\n comment.nick ||= locale.value.anonymous;\n }\n }\n\n // check comment\n if (!comment.comment) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n textAreaRef.value!.focus();\n\n return;\n }\n\n if (!isWordNumberLegal.value) {\n alert(\n locale.value.wordHint\n .replace('$0', (wordLimit as [number, number])[0].toString())\n .replace('$1', (wordLimit as [number, number])[1].toString())\n .replace('$2', wordNumber.value.toString()),\n );\n\n return;\n }\n\n comment.comment = parseEmoji(comment.comment, emoji.value.map);\n\n if (props.replyId && props.rootId) {\n comment.pid = props.replyId;\n comment.rid = props.rootId;\n comment.at = props.replyUser;\n }\n\n isSubmitting.value = true;\n\n try {\n if (recaptchaV3Key)\n comment.recaptchaV3 =\n await useReCaptcha(recaptchaV3Key).execute('social');\n\n if (turnstileKey)\n comment.turnstile = await useTurnstile(turnstileKey).execute('social');\n\n const options = {\n serverURL,\n lang,\n token: userInfo.value.token,\n comment,\n };\n\n const response = await (props.edit\n ? updateComment({\n objectId: props.edit.objectId,\n ...options,\n })\n : addComment(options));\n\n isSubmitting.value = false;\n\n if (response.errmsg) {\n alert(response.errmsg);\n\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n emit('submit', response.data!);\n\n editor.value = '';\n\n previewText.value = '';\n\n // ensure changes are applied to dom to avoid https://github.com/walinejs/waline/issues/2371\n await nextTick();\n\n if (props.replyId) emit('cancelReply');\n if (props.edit?.objectId) emit('cancelEdit');\n } catch (err: unknown) {\n isSubmitting.value = false;\n\n alert((err as TypeError).message);\n }\n};\n\nconst onLogin = (event: Event): void => {\n event.preventDefault();\n const { lang, serverURL } = config.value;\n\n void login({\n serverURL,\n lang,\n }).then((data) => {\n userInfo.value = data;\n (data.remember ? localStorage : sessionStorage).setItem(\n 'WALINE_USER',\n JSON.stringify(data),\n );\n emit('log');\n });\n};\n\nconst onLogout = (): void => {\n userInfo.value = {};\n localStorage.setItem('WALINE_USER', 'null');\n sessionStorage.setItem('WALINE_USER', 'null');\n emit('log');\n};\n\nconst onProfile = (event: Event): void => {\n event.preventDefault();\n\n const { lang, serverURL } = config.value;\n\n const width = 800;\n const height = 800;\n const left = (window.innerWidth - width) / 2;\n const top = (window.innerHeight - height) / 2;\n const query = new URLSearchParams({\n lng: lang,\n token: userInfo.value.token,\n });\n const handler = window.open(\n `${serverURL}/ui/profile?${query.toString()}`,\n '_blank',\n `width=${width},height=${height},left=${left},top=${top},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`,\n );\n\n handler?.postMessage({ type: 'TOKEN', data: userInfo.value.token }, '*');\n};\n\nconst popupHandler = (event: MouseEvent): void => {\n if (\n !emojiButtonRef.value?.contains(event.target as Node) &&\n !emojiPopupRef.value?.contains(event.target as Node)\n )\n showEmoji.value = false;\n\n if (\n !gifButtonRef.value?.contains(event.target as Node) &&\n !gifPopupRef.value?.contains(event.target as Node)\n )\n showGif.value = false;\n};\n\nconst onImageWallScroll = async (event: Event): Promise<void> => {\n const { scrollTop, clientHeight, scrollHeight } =\n event.target as HTMLDivElement;\n const percent = (clientHeight + scrollTop) / scrollHeight;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const searchOptions = config.value.search!;\n const keyword = gifSearchRef.value?.value ?? '';\n\n if (percent < 0.9 || searchResults.loading || isImageListEnd.value) return;\n\n searchResults.loading = true;\n\n const searchResult =\n searchOptions.more && searchResults.list.length\n ? await searchOptions.more(keyword, searchResults.list.length)\n : await searchOptions.search(keyword);\n\n if (searchResult.length)\n searchResults.list = [\n ...searchResults.list,\n ...(searchOptions.more && searchResults.list.length\n ? await searchOptions.more(keyword, searchResults.list.length)\n : await searchOptions.search(keyword)),\n ];\n else isImageListEnd.value = true;\n\n searchResults.loading = false;\n\n setTimeout(() => {\n (event.target as HTMLDivElement).scrollTop = scrollTop;\n }, 50);\n};\n\nconst onGifSearch = useDebounceFn((event: Event) => {\n searchResults.list = [];\n isImageListEnd.value = false;\n void onImageWallScroll(event);\n}, 300);\n\nuseEventListener('click', popupHandler);\nuseEventListener(\n 'message',\n ({ data }: { data: { type: 'profile'; data: UserInfo } }) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (data?.type !== 'profile') return;\n\n userInfo.value = { ...userInfo.value, ...data.data };\n\n [localStorage, sessionStorage]\n .filter((store) => store.getItem('WALINE_USER'))\n .forEach((store) => {\n store.setItem('WALINE_USER', JSON.stringify(userInfo));\n });\n },\n);\n\n// start tracking comment word number\nwatchImmediate([config, wordNumber], ([config, wordNumber]) => {\n const { wordLimit: limit } = config;\n\n if (limit) {\n if (wordNumber < limit[0] && limit[0] !== 0) {\n wordLimit.value = limit[0];\n isWordNumberLegal.value = false;\n } else if (wordNumber > limit[1]) {\n wordLimit.value = limit[1];\n isWordNumberLegal.value = false;\n } else {\n wordLimit.value = limit[1];\n isWordNumberLegal.value = true;\n }\n } else {\n wordLimit.value = 0;\n isWordNumberLegal.value = true;\n }\n});\n\n// watch gif\nwatch(showGif, async (showGif) => {\n if (!showGif) return;\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const searchOptions = config.value.search!;\n\n // clear input\n if (gifSearchRef.value) gifSearchRef.value.value = '';\n\n // set loading state\n searchResults.loading = true;\n\n // display default results\n searchResults.list = await (searchOptions.default?.() ??\n searchOptions.search(''));\n\n // clear loading state\n searchResults.loading = false;\n});\n\nonMounted(() => {\n if (props.edit?.objectId) {\n editor.value = props.edit.orig;\n }\n\n // watch editor\n watchImmediate(\n () => editor.value,\n (value) => {\n const { highlighter, texRenderer } = config.value;\n\n content.value = value;\n previewText.value = parseMarkdown(value, {\n emojiMap: emoji.value.map,\n highlighter,\n texRenderer,\n });\n wordNumber.value = getWordNumber(value);\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (value) autosize(textAreaRef.value!);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, import-x/no-named-as-default-member\n else autosize.destroy(textAreaRef.value!);\n },\n );\n\n // watch emoji value change\n watchImmediate(\n () => config.value.emoji,\n async (emojiConfig) => {\n emoji.value = await getEmojisInfo(emojiConfig);\n },\n );\n});\n</script>\n\n<template>\n <div :key=\"userInfo.token\" class=\"wl-comment\">\n <div\n v-if=\"config.login !== 'disable' && isLogin && !edit?.objectId\"\n class=\"wl-login-info\"\n >\n <div class=\"wl-avatar\">\n <button\n type=\"submit\"\n class=\"wl-logout-btn\"\n :title=\"locale.logout\"\n @click=\"onLogout\"\n >\n <CloseIcon :size=\"14\" />\n </button>\n\n <a\n href=\"#\"\n class=\"wl-login-nick\"\n aria-label=\"Profile\"\n :title=\"locale.profile\"\n @click=\"onProfile\"\n >\n <img :src=\"userInfo.avatar\" alt=\"avatar\" />\n </a>\n </div>\n\n <a\n href=\"#\"\n class=\"wl-login-nick\"\n aria-label=\"Profile\"\n :title=\"locale.profile\"\n @click=\"onProfile\"\n v-text=\"userInfo.display_name\"\n />\n </div>\n\n <div class=\"wl-panel\">\n <div\n v-if=\"config.login !== 'force' && config.meta.length && !isLogin\"\n class=\"wl-header\"\n :class=\"`item${config.meta.length}`\"\n >\n <div v-for=\"kind in config.meta\" :key=\"kind\" class=\"wl-header-item\">\n <label\n :for=\"`wl-${kind}`\"\n v-text=\"\n locale[kind] +\n (config.requiredMeta.includes(kind) || !config.requiredMeta.length\n ? ''\n : `(${locale.optional})`)\n \"\n />\n\n <input\n :id=\"`wl-${kind}`\"\n :ref=\"\n (element) => {\n if (element) inputRefs[kind] = element as HTMLInputElement;\n }\n \"\n v-model=\"userMeta[kind]\"\n class=\"wl-input\"\n :class=\"`wl-${kind}`\"\n :name=\"kind\"\n :type=\"kind === 'mail' ? 'email' : 'text'\"\n />\n </div>\n </div>\n\n <textarea\n id=\"wl-edit\"\n ref=\"textarea\"\n v-model=\"editor\"\n class=\"wl-editor\"\n :placeholder=\"replyUser ? `@${replyUser}` : locale.placeholder\"\n @keydown=\"onEditorKeyDown\"\n @drop=\"onEditorDrop\"\n @paste=\"onEditorPaste\"\n />\n\n <div v-show=\"showPreview\" class=\"wl-preview\">\n <hr />\n\n <h4>{{ locale.preview }}:</h4>\n <!-- eslint-disable-next-line vue/no-v-html -->\n <div class=\"wl-content\" v-html=\"previewText\" />\n </div>\n\n <div class=\"wl-footer\">\n <div class=\"wl-actions\">\n <a\n href=\"https://guides.github.com/features/mastering-markdown/\"\n title=\"Markdown Guide\"\n aria-label=\"Markdown is supported\"\n class=\"wl-action\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <MarkdownIcon />\n </a>\n\n <button\n v-show=\"emoji.tabs.length\"\n ref=\"emoji-button\"\n type=\"button\"\n class=\"wl-action\"\n :class=\"{ active: showEmoji }\"\n :title=\"locale.emoji\"\n @click=\"showEmoji = !showEmoji\"\n >\n <EmojiIcon />\n </button>\n\n <button\n v-if=\"config.search\"\n ref=\"gif-button\"\n type=\"button\"\n class=\"wl-action\"\n :class=\"{ active: showGif }\"\n :title=\"locale.gif\"\n @click=\"showGif = !showGif\"\n >\n <GifIcon />\n </button>\n\n <input\n id=\"wl-image-upload\"\n ref=\"image-uploader\"\n class=\"upload\"\n aria-hidden=\"true\"\n type=\"file\"\n accept=\".png,.jpg,.jpeg,.webp,.bmp,.gif\"\n @change=\"onImageChange\"\n />\n\n <label\n v-if=\"canUploadImage\"\n for=\"wl-image-upload\"\n class=\"wl-action\"\n :title=\"locale.uploadImage\"\n :aria-label=\"locale.uploadImage\"\n >\n <ImageIcon />\n </label>\n\n <button\n type=\"button\"\n class=\"wl-action\"\n :class=\"{ active: showPreview }\"\n :title=\"locale.preview\"\n @click=\"showPreview = !showPreview\"\n >\n <PreviewIcon />\n </button>\n </div>\n\n <div class=\"wl-info\">\n <div class=\"wl-captcha-container\" />\n\n <div class=\"wl-text-number\">\n {{ wordNumber }}\n\n <span v-if=\"config.wordLimit\">\n / \n <span\n :class=\"{ illegal: !isWordNumberLegal }\"\n v-text=\"wordLimit\"\n />\n </span>\n\n {{ locale.word }}\n </div>\n\n <button\n v-if=\"config.login !== 'disable' && !isLogin\"\n type=\"button\"\n class=\"wl-btn\"\n @click=\"onLogin\"\n v-text=\"locale.login\"\n />\n\n <button\n v-if=\"config.login !== 'force' || isLogin\"\n type=\"submit\"\n class=\"primary wl-btn\"\n title=\"Cmd|Ctrl + Enter\"\n :disabled=\"isSubmitting\"\n @click=\"submitComment\"\n >\n <LoadingIcon v-if=\"isSubmitting\" :size=\"16\" />\n\n <template v-else>\n {{ locale.submit }}\n </template>\n </button>\n </div>\n\n <div ref=\"gif-popup\" class=\"wl-gif-popup\" :class=\"{ display: showGif }\">\n <input\n ref=\"gif-search\"\n type=\"text\"\n :placeholder=\"locale.gifSearchPlaceholder\"\n @input=\"onGifSearch\"\n />\n\n <ImageWall\n v-if=\"searchResults.list.length\"\n :items=\"searchResults.list\"\n :column-width=\"200\"\n :gap=\"6\"\n @insert=\"insert($event)\"\n @scroll=\"onImageWallScroll\"\n />\n\n <div v-if=\"searchResults.loading\" class=\"wl-loading\">\n <LoadingIcon :size=\"30\" />\n </div>\n </div>\n\n <div\n ref=\"emoji-popup\"\n class=\"wl-emoji-popup\"\n :class=\"{ display: showEmoji }\"\n >\n <template\n v-for=\"(emojiItem, index) in emoji.tabs\"\n :key=\"emojiItem.name\"\n >\n <div v-if=\"index === emojiTabIndex\" class=\"wl-tab-wrapper\">\n <button\n v-for=\"key in emojiItem.items\"\n :key=\"key\"\n type=\"button\"\n :title=\"key\"\n @click=\"insert(`:${key}:`)\"\n >\n <img\n v-if=\"showEmoji\"\n class=\"wl-emoji\"\n :src=\"emoji.map[key]\"\n :alt=\"key\"\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n />\n </button>\n </div>\n </template>\n\n <div v-if=\"emoji.tabs.length > 1\" class=\"wl-tabs\">\n <button\n v-for=\"(emojiItem, index) in emoji.tabs\"\n :key=\"emojiItem.name\"\n type=\"button\"\n class=\"wl-tab\"\n :class=\"{ active: emojiTabIndex === index }\"\n @click=\"emojiTabIndex = index\"\n >\n <img\n class=\"wl-emoji\"\n :src=\"emojiItem.icon\"\n :alt=\"emojiItem.name\"\n :title=\"emojiItem.name\"\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n />\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <button\n v-if=\"replyId || edit?.objectId\"\n type=\"button\"\n class=\"wl-close\"\n :title=\"locale.cancelReply\"\n @click=\"replyId ? emit('cancelReply') : emit('cancelEdit')\"\n >\n <CloseIcon :size=\"24\" />\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useNow } from '@vueuse/core';\nimport type { WalineComment, WalineCommentStatus } from '@waline/api';\nimport { computed, inject } from 'vue';\n\nimport CommentBox from './CommentBox.vue';\nimport {\n AdministratorIcon,\n DeleteIcon,\n EditIcon,\n LikeIcon,\n ReplyIcon,\n VerifiedIcon,\n} from './Icons.js';\nimport { useLikeStorage, useUserInfo } from '../composables/index.js';\nimport { getTimeAgo, isLinkHttp } from '../utils/index.js';\nimport { configKey } from '../config/index.js';\n\nconst props = defineProps<{\n /**\n * Comment data\n */\n comment: WalineComment;\n /**\n * Current comment to be edited\n */\n edit?: WalineComment | null;\n /**\n * Root comment id\n */\n rootId: number;\n /**\n * Current comment to be replied\n */\n reply?: WalineComment | null;\n}>();\n\nconst emit = defineEmits<{\n (event: 'log'): void;\n (\n event: 'submit' | 'delete' | 'like' | 'sticky',\n comment: WalineComment,\n ): void;\n (event: 'edit' | 'reply', comment: WalineComment | null): void;\n (\n event: 'status',\n statusInfo: { status: WalineCommentStatus; comment: WalineComment },\n ): void;\n}>();\n\nconst commentStatus: WalineCommentStatus[] = ['approved', 'waiting', 'spam'];\n\n// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\nconst config = inject(configKey)!;\nconst likes = useLikeStorage();\nconst now = useNow();\nconst userInfo = useUserInfo();\n\nconst locale = computed(() => config.value.locale);\n\nconst link = computed(() => {\n const { link } = props.comment;\n\n return link ? (isLinkHttp(link) ? link : `https://${link}`) : '';\n});\n\nconst like = computed(() => likes.value.includes(props.comment.objectId));\n\nconst time = computed(() =>\n getTimeAgo(new Date(props.comment.time), now.value, locale.value),\n);\n\nconst isAdmin = computed(() => userInfo.value.type === 'administrator');\n\nconst isOwner = computed(\n () =>\n props.comment.user_id && userInfo.value.objectId === props.comment.user_id,\n);\n\nconst isReplyingCurrent = computed(\n () => props.comment.objectId === props.reply?.objectId,\n);\n\nconst isEditingCurrent = computed(\n () => props.comment.objectId === props.edit?.objectId,\n);\n</script>\n\n<template>\n <div :id=\"comment.objectId.toString()\" class=\"wl-card-item\">\n <div class=\"wl-user\" aria-hidden=\"true\">\n <img\n v-if=\"comment.avatar\"\n class=\"wl-user-avatar\"\n :src=\"comment.avatar\"\n alt=\"\"\n />\n\n <VerifiedIcon v-if=\"comment.type === 'guest'\" />\n\n <AdministratorIcon v-if=\"comment.type === 'administrator'\" />\n </div>\n\n <div class=\"wl-card\">\n <div class=\"wl-head\">\n <a\n v-if=\"link\"\n class=\"wl-nick\"\n :href=\"link\"\n target=\"_blank\"\n rel=\"nofollow noopener noreferrer\"\n >{{ comment.nick }}</a\n >\n\n <span v-else class=\"wl-nick\">{{ comment.nick }}</span>\n\n <span v-if=\"comment.label\" class=\"wl-badge\" v-text=\"comment.label\" />\n\n <span\n v-if=\"comment['sticky']\"\n class=\"wl-badge\"\n v-text=\"locale.sticky\"\n />\n\n <span\n v-if=\"typeof comment.level === 'number'\"\n :class=\"`wl-badge level${comment.level}`\"\n v-text=\"locale[`level${comment.level}`] || `Level ${comment.level}`\"\n />\n\n <span class=\"wl-time\" v-text=\"time\" />\n\n <div class=\"wl-comment-actions\">\n <template v-if=\"isAdmin || isOwner\">\n <button\n type=\"button\"\n class=\"wl-edit\"\n @click=\"emit('edit', comment)\"\n >\n <EditIcon />\n </button>\n\n <button\n type=\"button\"\n class=\"wl-delete\"\n @click=\"emit('delete', comment)\"\n >\n <DeleteIcon />\n </button>\n </template>\n\n <button\n type=\"button\"\n class=\"wl-like\"\n :title=\"like ? locale.cancelLike : locale.like\"\n @click=\"emit('like', comment)\"\n >\n <LikeIcon :active=\"like\" />\n {{ 'like' in comment ? comment.like : '' }}\n </button>\n\n <button\n type=\"button\"\n class=\"wl-reply\"\n :class=\"{ active: isReplyingCurrent }\"\n :title=\"isReplyingCurrent ? locale.cancelReply : locale.reply\"\n @click=\"emit('reply', isReplyingCurrent ? null : comment)\"\n >\n <ReplyIcon />\n </button>\n </div>\n </div>\n\n <div class=\"wl-meta\" aria-hidden=\"true\">\n <template v-for=\"item in ['addr', 'browser', 'os']\">\n <span\n v-if=\"comment[item]\"\n :key=\"item\"\n :class=\"`wl-${item}`\"\n :data-value=\"comment[item]\"\n v-text=\"comment[item]\"\n />\n </template>\n </div>\n <!-- eslint-disable vue/no-v-html -->\n <div v-if=\"!isEditingCurrent\" class=\"wl-content\">\n <p v-if=\"'reply_user' in comment && comment.reply_user\">\n <a :href=\"'#' + comment.pid\">@{{ comment.reply_user.nick }}</a>\n\n <span>: </span>\n </p>\n\n <div v-html=\"comment.comment\" />\n </div>\n <!-- eslint-enable vue/no-v-html -->\n\n <div v-if=\"isAdmin && !isEditingCurrent\" class=\"wl-admin-actions\">\n <span class=\"wl-comment-status\">\n <button\n v-for=\"status in commentStatus\"\n :key=\"status\"\n type=\"submit\"\n :class=\"`wl-btn wl-${status}`\"\n :disabled=\"comment.status === status\"\n @click=\"emit('status', { status, comment })\"\n v-text=\"locale[status]\"\n />\n </span>\n\n <button\n v-if=\"isAdmin && !('rid' in comment)\"\n type=\"submit\"\n class=\"wl-btn wl-sticky\"\n @click=\"emit('sticky', comment)\"\n >\n {{ comment.sticky ? locale.unsticky : locale.sticky }}\n </button>\n </div>\n\n <div\n v-if=\"isReplyingCurrent || isEditingCurrent\"\n :class=\"{\n 'wl-reply-wrapper': isReplyingCurrent,\n 'wl-edit-wrapper': isEditingCurrent,\n }\"\n >\n <CommentBox\n :edit=\"edit\"\n :reply-id=\"reply?.objectId\"\n :reply-user=\"comment.nick\"\n :root-id=\"rootId\"\n @log=\"emit('log')\"\n @cancel-reply=\"emit('reply', null)\"\n @cancel-edit=\"emit('edit', null)\"\n @submit=\"emit('submit', $event)\"\n />\n </div>\n\n <div v-if=\"'children' in comment\" class=\"wl-quote\">\n <CommentCard\n v-for=\"child in comment.children\"\n :key=\"child.objectId\"\n :comment=\"child\"\n :reply=\"reply\"\n :edit=\"edit\"\n :root-id=\"rootId\"\n @log=\"emit('log')\"\n @delete=\"emit('delete', $event)\"\n @edit=\"emit('edit', $event)\"\n @like=\"emit('like', $event)\"\n @reply=\"emit('reply', $event)\"\n @status=\"emit('status', $event)\"\n @sticky=\"emit('sticky', $event)\"\n @submit=\"emit('submit', $event)\"\n />\n </div>\n </div>\n </div>\n</template>\n","declare const VERSION: string;\n\nexport const version = VERSION;\n","<script setup lang=\"ts\">\n/* eslint-disable vue/no-unused-properties */\n\nimport { useStyleTag, watchImmediate } from '@vueuse/core';\nimport type {\n WalineComment,\n WalineCommentStatus,\n WalineRootComment,\n} from '@waline/api';\nimport { deleteComment, getComment, updateComment } from '@waline/api';\nimport { computed, onMounted, onUnmounted, provide, ref } from 'vue';\n\nimport ArticleReaction from './ArticleReaction.vue';\nimport CommentBox from './CommentBox.vue';\nimport CommentCard from './CommentCard.vue';\nimport { LoadingIcon } from './Icons.js';\nimport { useLikeStorage, useUserInfo } from '../composables/index.js';\nimport type { WalineCommentSorting, WalineProps } from '../typings/index.js';\nimport { getConfig, getDarkStyle } from '../utils/index.js';\nimport { version } from '../version.js';\nimport { configKey, sortingMethods, sortKeyMap } from '../config/index.js';\n\nconst props = defineProps<WalineProps>();\n\nconst userInfo = useUserInfo();\nconst likeStorage = useLikeStorage();\n\nconst status = ref<'loading' | 'success' | 'error'>('loading');\n\nconst count = ref(0);\nconst page = ref(1);\nconst totalPages = ref(0);\n\nconst config = computed(() => getConfig(props as WalineProps));\n\n// eslint-disable-next-line vue/no-ref-object-reactivity-loss\nconst commentSortingRef = ref(config.value.commentSorting);\n\nconst data = ref<WalineRootComment[]>([]);\nconst reply = ref<WalineComment | null>(null);\nconst edit = ref<WalineComment | null>(null);\n\nconst darkmodeStyle = computed(() => getDarkStyle(config.value.dark));\n\nconst i18n = computed(() => config.value.locale);\n\nuseStyleTag(darkmodeStyle, { id: 'waline-darkmode' });\n\nlet abort: (() => void) | null = null;\n\nconst getCommentData = (pageNumber: number): void => {\n const { serverURL, path, pageSize } = config.value;\n const controller = new AbortController();\n\n status.value = 'loading';\n\n abort?.();\n\n getComment({\n serverURL,\n lang: config.value.lang,\n path,\n pageSize,\n sortBy: sortKeyMap[commentSortingRef.value],\n page: pageNumber,\n signal: controller.signal,\n token: userInfo.value.token,\n })\n .then((resp) => {\n status.value = 'success';\n count.value = resp.count;\n data.value.push(...resp.data);\n page.value = pageNumber;\n totalPages.value = resp.totalPages;\n })\n .catch((err: unknown) => {\n if ((err as Error).name !== 'AbortError') {\n // eslint-disable-next-line no-console\n console.error((err as Error).message);\n status.value = 'error';\n }\n });\n\n abort = controller.abort.bind(controller);\n};\n\nconst loadMore = (): void => {\n getCommentData(page.value + 1);\n};\n\nconst refreshComments = (): void => {\n count.value = 0;\n data.value = [];\n getCommentData(1);\n};\n\nconst onSortByChange = (item: WalineCommentSorting): void => {\n if (commentSortingRef.value !== item) {\n commentSortingRef.value = item;\n refreshComments();\n }\n};\n\nconst onReply = (comment: WalineComment | null): void => {\n reply.value = comment;\n};\n\nconst onEdit = (comment: WalineComment | null): void => {\n edit.value = comment;\n};\n\nconst onSubmit = (comment: WalineComment): void => {\n if (edit.value) {\n edit.value.comment = comment.comment;\n edit.value.orig = comment.orig;\n } else if ('rid' in comment) {\n const repliedComment = data.value.find(\n ({ objectId }) => objectId === comment.rid,\n );\n\n if (!repliedComment) return;\n\n if (!Array.isArray(repliedComment.children)) repliedComment.children = [];\n\n repliedComment.children.push(comment);\n } else {\n data.value.unshift(comment);\n count.value += 1;\n }\n};\n\nconst onStatusChange = async ({\n comment,\n status,\n}: {\n comment: WalineComment;\n status: WalineCommentStatus;\n}): Promise<void> => {\n if (comment.status === status) return;\n\n const { serverURL, lang } = config.value;\n\n await updateComment({\n serverURL,\n lang,\n token: userInfo.value.token,\n objectId: comment.objectId,\n comment: { status },\n });\n\n comment.status = status;\n};\n\nconst onSticky = async (comment: WalineComment): Promise<void> => {\n if ('rid' in comment) return;\n\n const { serverURL, lang } = config.value;\n\n await updateComment({\n serverURL,\n lang,\n token: userInfo.value.token,\n objectId: comment.objectId,\n comment: { sticky: comment.sticky ? 0 : 1 },\n });\n\n comment.sticky = !comment.sticky;\n};\n\nconst onDelete = async ({ objectId }: WalineComment): Promise<void> => {\n if (!confirm('Are you sure you want to delete this comment?')) return;\n\n const { serverURL, lang } = config.value;\n\n await deleteComment({\n serverURL,\n lang,\n token: userInfo.value.token,\n objectId,\n });\n\n // delete comment from data\n data.value.some((item, index) => {\n if (item.objectId === objectId) {\n data.value = data.value.filter((_item, i) => i !== index);\n\n return true;\n }\n\n return item.children.some((child, childIndex) => {\n if (child.objectId === objectId) {\n data.value[index].children = item.children.filter(\n (_item, i) => i !== childIndex,\n );\n\n return true;\n }\n\n return false;\n });\n });\n};\n\nconst onLike = async (comment: WalineComment): Promise<void> => {\n const { serverURL, lang } = config.value;\n const { objectId } = comment;\n const hasLiked = likeStorage.value.includes(objectId);\n\n await updateComment({\n serverURL,\n lang,\n objectId,\n token: userInfo.value.token,\n comment: { like: !hasLiked },\n });\n\n if (hasLiked)\n likeStorage.value = likeStorage.value.filter((id) => id !== objectId);\n else {\n likeStorage.value = [...likeStorage.value, objectId];\n\n if (likeStorage.value.length > 50)\n likeStorage.value = likeStorage.value.slice(-50);\n }\n\n comment.like = Math.max(0, (comment.like || 0) + (hasLiked ? -1 : 1));\n};\n\nprovide(configKey, config);\n\nonMounted(() => {\n watchImmediate(\n () => [props.serverURL, props.path],\n () => {\n refreshComments();\n },\n );\n});\nonUnmounted(() => {\n abort?.();\n});\n\n/* eslint-enable vue/no-unused-properties */\n</script>\n\n<template>\n <div data-waline>\n <ArticleReaction />\n\n <CommentBox\n v-if=\"!reply && !edit\"\n @log=\"refreshComments\"\n @submit=\"onSubmit\"\n />\n\n <div class=\"wl-meta-head\">\n <div class=\"wl-count\">\n <span v-if=\"count\" class=\"wl-num\" v-text=\"count\" />\n {{ i18n.comment }}\n </div>\n\n <ul class=\"wl-sort\">\n <li\n v-for=\"item in sortingMethods\"\n :key=\"item\"\n :class=\"[item === commentSortingRef ? 'active' : '']\"\n @click=\"onSortByChange(item)\"\n >\n {{ i18n[item] }}\n </li>\n </ul>\n </div>\n\n <div class=\"wl-cards\">\n <CommentCard\n v-for=\"comment in data\"\n :key=\"comment.objectId\"\n :root-id=\"comment.objectId\"\n :comment=\"comment\"\n :reply=\"reply\"\n :edit=\"edit\"\n @log=\"refreshComments\"\n @reply=\"onReply\"\n @edit=\"onEdit\"\n @submit=\"onSubmit\"\n @status=\"onStatusChange\"\n @delete=\"onDelete\"\n @sticky=\"onSticky\"\n @like=\"onLike\"\n />\n </div>\n\n <div v-if=\"status === 'error'\" class=\"wl-operation\">\n <button\n type=\"button\"\n class=\"wl-btn\"\n @click=\"refreshComments\"\n v-text=\"i18n.refresh\"\n />\n </div>\n\n <div v-else-if=\"status === 'loading'\" class=\"wl-loading\">\n <LoadingIcon :size=\"30\" />\n </div>\n\n <div v-else-if=\"!data.length\" class=\"wl-empty\" v-text=\"i18n.sofa\" />\n\n <!-- Load more button -->\n <div v-else-if=\"page < totalPages\" class=\"wl-operation\">\n <button\n type=\"button\"\n class=\"wl-btn\"\n @click=\"loadMore\"\n v-text=\"i18n.more\"\n />\n </div>\n\n <!-- Copyright Information -->\n <div v-if=\"!config.noCopyright\" class=\"wl-power\">\n Powered by\n <a\n href=\"https://github.com/walinejs/waline\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Waline\n </a>\n v{{ version }}\n </div>\n </div>\n</template>\n"],"names":["CloseIcon","size","h","DeleteIcon","EmojiIcon","ImageIcon","LikeIcon","active","PreviewIcon","MarkdownIcon","ReplyIcon","EditIcon","VerifiedIcon","AdministratorIcon","LoadingIcon","GifIcon","useUserMeta","useStorage","useEditor","LIKE_KEY","likeStorage","useLikeStorage","REACTION_KEY","reactionStorage","useReactionStorage","recaptchaStore","useReCaptcha","key","init","load","action","instance","useTurnstile","useScriptTag","turnstile","resolve","USER_KEY","userInfoStorage","useUserInfo","AVAILABLE_META","getMeta","meta","item","DEFAULT_EMOJI","DEFAULT_REACTION","defaultUploadImage","file","reject","reader","defaultTeXRenderer","blockMode","getDefaultSearchOptions","lang","fetchGiphy","url","params","resp","data","gif","word","offset","WORD_REGEXP","LEFT_ANGLE_REGEXP","LINE_COMMENT_REGEXP","BLOCK_COMMENT_REGEXP","REGEXP","COLORS","cache","defaultHighlighter","input","index","_match","comment","color","out","localeKeys","generateLocale","locale","f","r$1","t$1","e$1","i$2","m","L","p$1","s","n","c$1","DEFAULT_LANG","DEFAULT_LOCALES","zhCN","zhTW","en","fr","it","jp","ptBR","ru","viVN","de","es","getLocale","getLang","sortKeyMap","sortingMethods","configKey","config","inject","votingIndex","ref","voteNumbers","computed","reaction","reactionsInfo","path","_a","icon","abort","fetchReaction","serverURL","controller","reactionData","getArticleCounter","_","vote","currentVoteItemIndex","updateArticleCounter","onMounted","watchImmediate","onUnmounted","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_toDisplayString","_hoisted_3","_Fragment","_renderList","desc","_normalizeClass","$event","_hoisted_5","_createBlock","_unref","props","__props","resizeObserver","wall","useTemplateRef","state","columns","getColumnCount","count","createColumns","fillColumns","itemIndex","nextTick","target","prev","curr","redraw","force","scrollY","imageLoad","e","watch","onBeforeUnmount","column","columnIndex","$emit","decodePath","removeEndingSplash","content","isLinkHttp","link","getServerURL","result","getWordLimit","wordLimit","fallback","value","getConfig","requiredMeta","dark","pageSize","noCopyright","login","recaptchaV3Key","turnstileKey","commentSorting","emoji","imageUploader","highlighter","texRenderer","search","more","isString","val","DARK_VARIABLES","getDarkStyle","selector","padWithZeros","vNumber","width","numAsString","dateFormat","date","vDay","vMonth","getTimeAgo","now","time","timePassed","days","leave1","hours","leave2","minutes","leave3","EMAIL_REG_EXP","isValidEmail","email","EMOJI_STORE_KEY","emojiStore","checkVersionAnnotation","fetchEmoji","containsVersion","info","emojiInfo","getLink","name","folder","prefix","type","getEmojisInfo","emojis","emojiInfos","emojisConfig","items","isImage","getImageFromDataTransfer","image","inlineMathStart","inlineMathReg","blockMathReg","markedTeXExtensions","src","cap","idx","parseEmoji","text","emojiMap","placeholder","parseMarkdown","marked","Marked","markedHighlight","extensions","getWords","getChinese","getWordNumber","_b","accumulator","userAgent","userAgentData","ua","platformVersion","emit","__emit","editor","userMeta","userInfo","inputRefs","textAreaRef","imageUploaderRef","emojiButtonRef","emojiPopupRef","gifButtonRef","gifPopupRef","gifSearchRef","emojiTabIndex","showEmoji","showGif","showPreview","previewText","wordNumber","searchResults","reactive","isWordNumberLegal","isSubmitting","isImageListEnd","isLogin","canUploadImage","insert","textArea","startPosition","endPosition","scrollTop","onEditorKeyDown","ctrlKey","metaKey","submitComment","uploadImage","uploadText","err","onEditorDrop","event","onEditorPaste","onImageChange","inputElement","options","response","updateComment","addComment","onLogin","onLogout","onProfile","height","left","top","query","handler","popupHandler","_c","_d","onImageWallScroll","clientHeight","scrollHeight","percent","searchOptions","keyword","onGifSearch","useDebounceFn","useEventListener","store","limit","autosize","emojiConfig","_hoisted_2","_createVNode","_hoisted_7","kind","element","_vModelDynamic","_withDirectives","_hoisted_11","_hoisted_13","_hoisted_14","_hoisted_15","_cache","_hoisted_20","_hoisted_21","_createTextVNode","_hoisted_22","args","ImageWall","_hoisted_27","emojiItem","_hoisted_28","_hoisted_31","commentStatus","likes","useNow","like","isAdmin","isOwner","isReplyingCurrent","isEditingCurrent","_hoisted_4","_hoisted_6","_hoisted_12","_hoisted_17","_hoisted_18","_hoisted_19","status","CommentBox","_hoisted_24","child","_component_CommentCard","version","page","totalPages","commentSortingRef","reply","edit","darkmodeStyle","i18n","useStyleTag","getCommentData","pageNumber","getComment","loadMore","refreshComments","onSortByChange","onReply","onEdit","onSubmit","repliedComment","objectId","onStatusChange","onSticky","onDelete","deleteComment","_item","i","childIndex","onLike","hasLiked","id","provide","ArticleReaction","CommentCard","_hoisted_8","_hoisted_10"],"mappings":"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,CAAK,EAAG5B,CAAI,CAAC,CACvD,ECrDF,IAAAoC,GAAeF,EAAe,CAC5B,eACA,4DACA,SACA,4CACA,WACA,WACA,2BACA,yBACA,SACA,cACA,yBACA,YACA,oBACA,aACA,gBACA,gBACA,WACA,QACA,qBACA,uBACA,sBACA,sBACA,oBACA,cACA,kBACA,WACA,WACA,QACA,aACA,SACA,4FACA,SACA,SACA,UACA,OACA,SACA,QACA,QACA,MACA,wBACA,SACA,YACA,aACA,OACA,QACA,UACA,UACA,kBACA,iBACF,CAAC,ECpDDG,GAAeH,EAAe,CAC5B,WACA,wCACA,SACA,qCACA,UACA,WACA,kBACA,kBACA,SACA,OACA,cACA,QACA,eACA,WACA,UACA,eACA,UACA,QACA,eACA,cACA,cACA,YACA,WACA,WACA,YACA,QACA,SACA,QACA,SACA,QACA;AAAA,0BACA,YACA,UACA,UACA,OACA,UACA,QACA,QACA,MACA,aACA,UACA,WACA,UACA,OACA,WACA,SACA,SACA,UACA,oBACF,CAAC,EClDDI,GAAeJ,EAAe,CAC5B,oBACA,wDACA,qBACA,yDACA,YACA,WACA,kBACA,2BACA,SACA,OACA,cACA,YACA,mBACA,cACA,WACA,gBACA,gBACA,QACA,eACA,iBACA,gBACA,cACA,aACA,cACA,WACA,iBACA,gBACA,QACA,SACA,WACA;AAAA,mCACA,UACA,SACA,UACA,OACA,QACA,QACA,QACA,MACA,aACA,SACA,WACA,YACA,OACA,WACA,eACA,gBACA,aACA,eACF,CAAC,EChDDK,GAAeL,EAAe,CAC5B,SACA,iDACA,SACA,2CACA,WACA,YACA,mBACA,oCACA,UACA,SACA,oBACA,WACA,qBACA,eACA,aACA,kBACA,SACA,QACA,wBACA,2BACA,0BACA,yBACA,wBACA,cACA,0BACA,YACA,cACA,QACA,UACA,OACA;AAAA,6BACA,UACA,QACA,UACA,OACA,QACA,QACA,QACA,MACA,oBACA,SACA,WACA,aACA,cACA,WACA,iBACA,UACA,oBACA,qBACF,CAAC,ECjDDM,GAAeN,EAAe,CAC5B,WACA,iDACA,SACA,+CACA,WACA,cACA,wBACA,0BACA,QACA,WACA,mBACA,WACA,mBACA,WACA,WACA,kBACA,YACA,QACA,kBACA,aACA,YACA,SACA,YACA,SACA,0BACA,SACA,OACA,QACA,cACA,SACA;AAAA,+BACA,UACA,OACA,SACA,MACA,OACA,OACA,QACA,MACA,YACA,UACA,YACA,YACA,OACA,mBACA,aACA,cACA,eACA,gBACF,CAAC,ECrDDO,GAAeP,EAAe,CAC5B,SACA,yBACA,UACA,mBACA,MACA,QACA,UACA,aACA,OACA,OACA,cACA,OACA,QACA,OACA,KACA,UACA,QACA,MACA,YACA,KACA,KACA,MACA,KACA,OACA,SACA,SACA,QACA,MACA,SACA,MACA;AAAA,cACA,KACA,OACA,OACA,OACA,SACA,KACA,MACA,MACA,SACA,OACA,OACA,QACA,MACA,SACA,KACA,KACA,MACA,UACF,CAAC,EClDDQ,GAAeR,EAAe,CAC5B,UACA,0CACA,SACA,8CACA,UACA,WACA,kBACA,4BACA,SACA,OACA,cACA,YACA,oBACA,cACA,YACA,mBACA,aACA,QACA,gBACA,iBACA,gBACA,cACA,aACA,cACA,WACA,SACA,OACA,QACA,SACA,WACA;AAAA,gCACA,UACA,UACA,UACA,OACA,UACA,QACA,QACA,MACA,gBACA,qBACA,WACA,SACA,OACA,WACA,aACA,gBACA,cACA,kBACF,CAAC,EClDDS,GAAeT,EAAe,CAC5B,YACA,uCACA,YACA,yDACA,WACA,iBACA,uBACA,yBACA,YACA,OACA,cACA,WACA,iBACA,cACA,WACA,oBACA,SACA,SACA,wBACA,eACA,wBACA,wBACA,aACA,eACA,WACA,iBACA,mBACA,QACA,SACA,QACA;AAAA,0BACA,YACA,UACA,UACA,OACA,UACA,QACA,QACA,MACA,YACA,sBACA,aACA,YACA,OACA,WACA,eACA,YACA,gBACA,iBACF,CAAC,EClDDU,GAAeV,EAAe,CAC5B,MACA,kCACA,SACA,2CACA,UACA,WACA,4BACA,oBACA,MACA,QACA,WACA,UACA,SACA,YACA,UACA,cACA,YACA,QACA,mBACA,aACA,aACA,YACA,aACA,WACA,eACA,YACA,YACA,gBACA,OACA,KACA;AAAA,qBACA,UACA,YACA,eACA,YACA,UACA,WACA,QACA,UACA,mBACA,oBACA,oBACA,eACA,UACA,aACA,eACA,YACA,YACA,oBACF,CAAC,EClDDW,GAAeX,EAAe,CAC5B,KACA,aACA,KACA,aACA,KACA,KACA,OACA,SACA,KACA,KACA,OACA,KACA,OACA,KACA,KACA,UACA,KACA,KACA,OACA,KACA,MACA,MACA,KACA,KACA,OACA,KACA,KACA,KACA,KACA,IACA;AAAA,SACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,QACA,OACA,KACA,MACA,KACA,OACA,MACA,MACA,MACA,aACF,CAAC,EClDDY,GAAeZ,EAAe,CAC5B,KACA,aACA,KACA,aACA,KACA,KACA,OACA,SACA,KACA,KACA,OACA,KACA,OACA,KACA,KACA,UACA,KACA,KACA,OACA,KACA,MACA,MACA,KACA,KACA,OACA,KACA,KACA,MACA,KACA,IACA;AAAA,SACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,QACA,OACA,KACA,MACA,KACA,OACA,KACA,KACA,KACA,aACF,CAAC,ECrCM,MAAMa,GAAe,QAEfC,GAA2B,CACtC,GAAIC,GACJ,QAASA,GACT,QAASC,GACT,GAAAC,GACA,QAASA,GACT,GAAAC,GACA,QAASA,GACT,GAAAC,GACA,QAASA,GACT,GAAAC,GACA,QAASA,GACT,QAASC,GACT,GAAAC,GACA,QAASA,GACT,GAAIC,GACJ,QAASA,GACT,GAAAC,GACA,GAAAC,GACA,QAASA,EACX,EAEaC,GAAalD,GAExBsC,GAAgBtC,EAAK,YAAA,CAAa,GAClCsC,GAAgBD,GAAa,YAAA,CAAa,EAE/Bc,GAAWnD,GACtB,OAAO,KAAKsC,EAAe,EAAE,SAAStC,EAAK,YAAA,CAAa,EACpDA,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"}
|
|
1
|
+
{"version":3,"file":"component.js","sources":["../src/components/Icons.ts","../src/composables/inputs.ts","../src/composables/like.ts","../src/composables/reaction.ts","../src/composables/recaptchaV3.ts","../src/composables/turnstile.ts","../src/composables/userInfo.ts","../src/config/default.ts","../src/config/highlighter.ts","../src/config/i18n/generate.ts","../src/config/i18n/de.ts","../src/config/i18n/en.ts","../src/config/i18n/es.ts","../src/config/i18n/fr.ts","../src/config/i18n/it.ts","../src/config/i18n/jp.ts","../src/config/i18n/pt-BR.ts","../src/config/i18n/ru.ts","../src/config/i18n/vi-VN.ts","../src/config/i18n/zh-CN.ts","../src/config/i18n/zh-TW.ts","../src/config/i18n/index.ts","../src/config/sortKey.ts","../src/config/index.ts","../src/components/ArticleReaction.vue","../src/components/ImageWall.vue","../src/utils/path.ts","../src/utils/config.ts","../src/utils/type.ts","../src/utils/darkmode.ts","../src/utils/date.ts","../src/utils/email.ts","../src/utils/emoji.ts","../src/utils/image.ts","../src/utils/markedMathExtension.ts","../src/utils/markdown.ts","../src/utils/wordCount.ts","../src/utils/userAgent.ts","../src/components/CommentBox.vue","../src/components/CommentCard.vue","../src/version.ts","../src/components/WalineComment.vue"],"sourcesContent":["// oxlint-disable id-length\nimport type { FunctionalComponent } from 'vue';\nimport { h } from 'vue';\n\nexport const CloseIcon: FunctionalComponent<{ size: number }> = ({ size }) =>\n h(\n 'svg',\n {\n class: 'wl-close-icon',\n viewBox: '0 0 1024 1024',\n width: size,\n height: size,\n },\n [\n h('path', {\n d: 'M697.173 85.333h-369.92c-144.64 0-241.92 101.547-241.92 252.587v348.587c0 150.613 97.28 252.16 241.92 252.16h369.92c144.64 0 241.494-101.547 241.494-252.16V337.92c0-151.04-96.854-252.587-241.494-252.587z',\n fill: 'currentColor',\n }),\n h('path', {\n d: 'm640.683 587.52-75.947-75.861 75.904-75.862a37.29 37.29 0 0 0 0-52.778 37.205 37.205 0 0 0-52.779 0l-75.946 75.818-75.862-75.946a37.419 37.419 0 0 0-52.821 0 37.419 37.419 0 0 0 0 52.821l75.947 75.947-75.776 75.733a37.29 37.29 0 1 0 52.778 52.821l75.776-75.776 75.947 75.947a37.376 37.376 0 0 0 52.779-52.821z',\n fill: '#888',\n }),\n ],\n );\n\nexport const DeleteIcon: FunctionalComponent = () =>\n h(\n 'svg',\n { viewBox: '0 0 1024 1024', width: '24', height: '24' },\n h('path', {\n d: 'm341.013 394.667 27.755 393.45h271.83l27.733-393.45h64.106l-28.01 397.952a64 64 0 0 1-63.83 59.498H368.768a64 64 0 0 1-63.83-59.52l-28.053-397.93h64.128zm139.307 19.818v298.667h-64V414.485h64zm117.013 0v298.667h-64V414.485h64zM181.333 288h640v64h-640v-64zm453.483-106.667v64h-256v-64h256z',\n fill: 'red',\n }),\n );\n\nexport const EmojiIcon: FunctionalComponent = () =>\n h(\n 'svg',\n { viewBox: '0 0 1024 1024', width: '24', height: '24' },\n h('path', {\n d: 'M563.2 463.3 677 540c1.7 1.2 3.7 1.8 5.8 1.8.7 0 1.4-.1 2-.2 2.7-.5 5.1-2.1 6.6-4.4l25.3-37.8c1.5-2.3 2.1-5.1 1.6-7.8s-2.1-5.1-4.4-6.6l-73.6-49.1 73.6-49.1c2.3-1.5 3.9-3.9 4.4-6.6.5-2.7 0-5.5-1.6-7.8l-25.3-37.8a10.1 10.1 0 0 0-6.6-4.4c-.7-.1-1.3-.2-2-.2-2.1 0-4.1.6-5.8 1.8l-113.8 76.6c-9.2 6.2-14.7 16.4-14.7 27.5.1 11 5.5 21.3 14.7 27.4zM387 348.8h-45.5c-5.7 0-10.4 4.7-10.4 10.4v153.3c0 5.7 4.7 10.4 10.4 10.4H387c5.7 0 10.4-4.7 10.4-10.4V359.2c0-5.7-4.7-10.4-10.4-10.4zm333.8 241.3-41-20a10.3 10.3 0 0 0-8.1-.5c-2.6.9-4.8 2.9-5.9 5.4-30.1 64.9-93.1 109.1-164.4 115.2-5.7.5-9.9 5.5-9.5 11.2l3.9 45.5c.5 5.3 5 9.5 10.3 9.5h.9c94.8-8 178.5-66.5 218.6-152.7 2.4-5 .3-11.2-4.8-13.6zm186-186.1c-11.9-42-30.5-81.4-55.2-117.1-24.1-34.9-53.5-65.6-87.5-91.2-33.9-25.6-71.5-45.5-111.6-59.2-41.2-14-84.1-21.1-127.8-21.1h-1.2c-75.4 0-148.8 21.4-212.5 61.7-63.7 40.3-114.3 97.6-146.5 165.8-32.2 68.1-44.3 143.6-35.1 218.4 9.3 74.8 39.4 145 87.3 203.3.1.2.3.3.4.5l36.2 38.4c1.1 1.2 2.5 2.1 3.9 2.6 73.3 66.7 168.2 103.5 267.5 103.5 73.3 0 145.2-20.3 207.7-58.7 37.3-22.9 70.3-51.5 98.1-85 27.1-32.7 48.7-69.5 64.2-109.1 15.5-39.7 24.4-81.3 26.6-123.8 2.4-43.6-2.5-87-14.5-129zm-60.5 181.1c-8.3 37-22.8 72-43 104-19.7 31.1-44.3 58.6-73.1 81.7-28.8 23.1-61 41-95.7 53.4-35.6 12.7-72.9 19.1-110.9 19.1-82.6 0-161.7-30.6-222.8-86.2l-34.1-35.8c-23.9-29.3-42.4-62.2-55.1-97.7-12.4-34.7-18.8-71-19.2-107.9-.4-36.9 5.4-73.3 17.1-108.2 12-35.8 30-69.2 53.4-99.1 31.7-40.4 71.1-72 117.2-94.1 44.5-21.3 94-32.6 143.4-32.6 49.3 0 97 10.8 141.8 32 34.3 16.3 65.3 38.1 92 64.8 26.1 26 47.5 56 63.6 89.2 16.2 33.2 26.6 68.5 31 105.1 4.6 37.5 2.7 75.3-5.6 112.3z',\n fill: 'currentColor',\n }),\n );\n\nexport const ImageIcon: FunctionalComponent = () =>\n h('svg', { viewBox: '0 0 1024 1024', width: '24', height: '24' }, [\n h('path', {\n d: 'M784 112H240c-88 0-160 72-160 160v480c0 88 72 160 160 160h544c88 0 160-72 160-160V272c0-88-72-160-160-160zm96 640c0 52.8-43.2 96-96 96H240c-52.8 0-96-43.2-96-96V272c0-52.8 43.2-96 96-96h544c52.8 0 96 43.2 96 96v480z',\n fill: 'currentColor',\n }),\n h('path', {\n d: 'M352 480c52.8 0 96-43.2 96-96s-43.2-96-96-96-96 43.2-96 96 43.2 96 96 96zm0-128c17.6 0 32 14.4 32 32s-14.4 32-32 32-32-14.4-32-32 14.4-32 32-32zm462.4 379.2-3.2-3.2-177.6-177.6c-25.6-25.6-65.6-25.6-91.2 0l-80 80-36.8-36.8c-25.6-25.6-65.6-25.6-91.2 0L200 728c-4.8 6.4-8 14.4-8 24 0 17.6 14.4 32 32 32 9.6 0 16-3.2 22.4-9.6L380.8 640l134.4 134.4c6.4 6.4 14.4 9.6 24 9.6 17.6 0 32-14.4 32-32 0-9.6-4.8-17.6-9.6-24l-52.8-52.8 80-80L769.6 776c6.4 4.8 12.8 8 20.8 8 17.6 0 32-14.4 32-32 0-8-3.2-16-8-20.8z',\n fill: 'currentColor',\n }),\n ]);\n\nexport const LikeIcon: FunctionalComponent<{ active: boolean }> = ({\n active = false,\n}: {\n active?: boolean;\n}) =>\n h('svg', { viewBox: '0 0 1024 1024', width: '24', height: '24' }, [\n h('path', {\n d: `M850.654 323.804c-11.042-25.625-26.862-48.532-46.885-68.225-20.022-19.61-43.258-34.936-69.213-45.73-26.78-11.124-55.124-16.727-84.375-16.727-40.622 0-80.256 11.123-114.698 32.135A214.79 214.79 0 0 0 512 241.819a214.79 214.79 0 0 0-23.483-16.562c-34.442-21.012-74.076-32.135-114.698-32.135-29.25 0-57.595 5.603-84.375 16.727-25.872 10.711-49.19 26.12-69.213 45.73-20.105 19.693-35.843 42.6-46.885 68.225-11.453 26.615-17.303 54.877-17.303 83.963 0 27.439 5.603 56.03 16.727 85.117 9.31 24.307 22.659 49.52 39.715 74.981 27.027 40.293 64.188 82.316 110.33 124.915 76.465 70.615 152.189 119.394 155.402 121.371l19.528 12.525c8.652 5.52 19.776 5.52 28.427 0l19.529-12.525c3.213-2.06 78.854-50.756 155.401-121.371 46.143-42.6 83.304-84.622 110.33-124.915 17.057-25.46 30.487-50.674 39.716-74.981 11.124-29.087 16.727-57.678 16.727-85.117.082-29.086-5.768-57.348-17.221-83.963z${\n active\n ? ''\n : 'M512 761.5S218.665 573.55 218.665 407.767c0-83.963 69.461-152.023 155.154-152.023 60.233 0 112.473 33.618 138.181 82.727 25.708-49.109 77.948-82.727 138.18-82.727 85.694 0 155.155 68.06 155.155 152.023C805.335 573.551 512 761.5 512 761.5z'\n }`,\n fill: active ? 'red' : 'currentColor',\n }),\n ]);\n\nexport const PreviewIcon: FunctionalComponent = () =>\n h('svg', { viewBox: '0 0 1024 1024', width: '24', height: '24' }, [\n h('path', {\n d: 'M710.816 654.301c70.323-96.639 61.084-230.578-23.705-314.843-46.098-46.098-107.183-71.109-172.28-71.109-65.008 0-126.092 25.444-172.28 71.109-45.227 46.098-70.756 107.183-70.756 172.106 0 64.923 25.444 126.007 71.194 172.106 46.099 46.098 107.184 71.109 172.28 71.109 51.414 0 100.648-16.212 142.824-47.404l126.53 126.006c7.058 7.06 16.297 10.979 26.406 10.979 10.105 0 19.343-3.919 26.402-10.979 14.467-14.467 14.467-38.172 0-52.723L710.816 654.301zm-315.107-23.265c-65.88-65.88-65.88-172.54 0-238.42 32.069-32.07 74.245-49.149 119.471-49.149 45.227 0 87.407 17.603 119.472 49.149 65.88 65.879 65.88 172.539 0 238.42-63.612 63.178-175.242 63.178-238.943 0zm0 0',\n fill: 'currentColor',\n }),\n h('path', {\n d: 'M703.319 121.603H321.03c-109.8 0-199.469 89.146-199.469 199.38v382.034c0 109.796 89.236 199.38 199.469 199.38h207.397c20.653 0 37.384-16.645 37.384-37.299 0-20.649-16.731-37.296-37.384-37.296H321.03c-68.582 0-124.352-55.77-124.352-124.267V321.421c0-68.496 55.77-124.267 124.352-124.267h382.289c68.582 0 124.352 55.771 124.352 124.267V524.72c0 20.654 16.736 37.299 37.385 37.299 20.654 0 37.384-16.645 37.384-37.299V320.549c-.085-109.8-89.321-198.946-199.121-198.946zm0 0',\n fill: 'currentColor',\n }),\n ]);\n\nexport const MarkdownIcon: FunctionalComponent = () =>\n h(\n 'svg',\n { width: '16', height: '16', ariaHidden: 'true' },\n h('path', {\n d: 'M14.85 3H1.15C.52 3 0 3.52 0 4.15v7.69C0 12.48.52 13 1.15 13h13.69c.64 0 1.15-.52 1.15-1.15v-7.7C16 3.52 15.48 3 14.85 3zM9 11H7V8L5.5 9.92 4 8v3H2V5h2l1.5 2L7 5h2v6zm2.99.5L9.5 8H11V5h2v3h1.5l-2.51 3.5z',\n fill: 'currentColor',\n }),\n );\n\nexport const ReplyIcon: FunctionalComponent = () =>\n h(\n 'svg',\n { viewBox: '0 0 1024 1024', width: '24', height: '24' },\n h('path', {\n d: 'M810.667 213.333a64 64 0 0 1 64 64V704a64 64 0 0 1-64 64H478.336l-146.645 96.107a21.333 21.333 0 0 1-33.024-17.856V768h-85.334a64 64 0 0 1-64-64V277.333a64 64 0 0 1 64-64h597.334zm0 64H213.333V704h149.334v63.296L459.243 704h351.424V277.333zm-271.36 213.334v64h-176.64v-64h176.64zm122.026-128v64H362.667v-64h298.666z',\n fill: 'currentColor',\n }),\n );\n\nexport const EditIcon: FunctionalComponent = () =>\n h(\n 'svg',\n { viewBox: '0 0 1024 1024', width: '24', height: '24' },\n h('path', {\n d: 'M813.039 318.772L480.53 651.278H360.718V531.463L693.227 198.961C697.904 194.284 704.027 192 710.157 192C716.302 192 722.436 194.284 727.114 198.961L813.039 284.88C817.72 289.561 820 295.684 820 301.825C820 307.95 817.72 314.093 813.039 318.772ZM710.172 261.888L420.624 551.431V591.376H460.561L750.109 301.825L710.172 261.888ZM490.517 291.845H240.906V771.09H720.156V521.479C720.156 504.947 733.559 491.529 750.109 491.529C766.653 491.529 780.063 504.947 780.063 521.479V791.059C780.063 813.118 762.18 831 740.125 831H220.937C198.882 831 181 813.118 181 791.059V271.872C181 249.817 198.882 231.935 220.937 231.935H490.517C507.06 231.935 520.47 245.352 520.47 261.888C520.47 278.424 507.06 291.845 490.517 291.845Z',\n fill: 'currentColor',\n }),\n );\n\nexport const VerifiedIcon: FunctionalComponent = () =>\n h(\n 'svg',\n {\n class: 'verified-icon',\n viewBox: '0 0 1024 1024',\n width: '14',\n height: '14',\n },\n h('path', {\n d: 'm894.4 461.56-54.4-63.2c-10.4-12-18.8-34.4-18.8-50.4v-68c0-42.4-34.8-77.2-77.2-77.2h-68c-15.6 0-38.4-8.4-50.4-18.8l-63.2-54.4c-27.6-23.6-72.8-23.6-100.8 0l-62.8 54.8c-12 10-34.8 18.4-50.4 18.4h-69.2c-42.4 0-77.2 34.8-77.2 77.2v68.4c0 15.6-8.4 38-18.4 50l-54 63.6c-23.2 27.6-23.2 72.4 0 100l54 63.6c10 12 18.4 34.4 18.4 50v68.4c0 42.4 34.8 77.2 77.2 77.2h69.2c15.6 0 38.4 8.4 50.4 18.8l63.2 54.4c27.6 23.6 72.8 23.6 100.8 0l63.2-54.4c12-10.4 34.4-18.8 50.4-18.8h68c42.4 0 77.2-34.8 77.2-77.2v-68c0-15.6 8.4-38.4 18.8-50.4l54.4-63.2c23.2-27.6 23.2-73.2-.4-100.8zm-216-25.2-193.2 193.2a30 30 0 0 1-42.4 0l-96.8-96.8a30.16 30.16 0 0 1 0-42.4c11.6-11.6 30.8-11.6 42.4 0l75.6 75.6 172-172c11.6-11.6 30.8-11.6 42.4 0 11.6 11.6 11.6 30.8 0 42.4z',\n fill: '#27ae60',\n }),\n );\n\nexport const AdministratorIcon: FunctionalComponent = () =>\n h(\n 'svg',\n {\n class: 'administrator-icon',\n viewBox: '0 0 1024 1024',\n width: '14',\n height: '14',\n },\n [\n h('path', {\n d: 'M461.6 129.56C489.6 105.96 534.8 105.96 562.4 129.56L625.6 183.96C637.6 194.36 660.4 202.76 676 202.76H744C786.4 202.76 821.2 237.56 821.2 279.96V347.96C821.2 363.96 829.6 386.36 840 398.36L894.4 461.56C918 489.16 918 534.76 894.8 562.36L840.4 625.56C830 637.56 821.6 660.36 821.6 675.96V743.96C821.6 786.36 786.8 821.16 744.4 821.16H676.4C660.4 821.16 638 829.56 626 839.96L562.8 894.36C534.8 917.96 489.6 917.96 462 894.36L398.8 839.96C386.8 829.56 364 821.16 348.4 821.16H279.2C236.8 821.16 202 786.36 202 743.96V675.56C201.999 659.96 193.6 637.56 183.6 625.56L129.6 561.96C106.4 534.36 106.4 489.56 129.6 461.96L183.6 398.36C193.6 386.359 202 363.959 202 348.36V279.96C202 237.56 236.8 202.76 279.2 202.76H348.4C364 202.76 386.8 194.36 398.8 184.36L461.6 129.56ZM549.567 331.896C530.047 303.082 486.645 306.12 471.433 337.412L442.175 396.526C435.587 409.848 422.856 419.097 408.146 421.226L342.706 430.726C340.776 431 338.884 431.397 336.993 431.946C303.482 441.361 292.756 483.493 317.671 507.812L364.975 553.96C375.623 564.321 380.507 579.299 377.991 593.954L366.917 659.102C366.595 661.03 366.355 662.967 366.279 664.923C364.906 699.688 401.683 722.937 432.514 706.738L491.05 675.966C504.217 669.068 519.954 669.069 533.121 675.966L591.675 706.738C593.406 707.645 595.174 708.432 597.028 709.104C629.666 721.205 663.139 693.382 657.273 659.102L646.069 593.954C643.42 579.176 648.24 564.083 659.001 553.6L706.315 507.461C707.687 506.118 708.994 504.66 710.215 503.127C731.779 475.809 715.737 435.41 681.281 430.365L615.839 420.874C601.13 418.745 588.4 409.486 581.821 396.174L552.562 337.052C551.644 335.284 550.674 333.551 549.567 331.896Z',\n fill: '#f59831',\n }),\n ],\n );\n\nexport const LoadingIcon: FunctionalComponent<{ size?: number }> = ({ size = 100 }) =>\n h(\n 'svg',\n {\n width: size,\n height: size,\n viewBox: '0 0 100 100',\n preserveAspectRatio: 'xMidYMid',\n },\n h(\n 'circle',\n {\n cx: 50,\n cy: 50,\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: '4',\n r: '40',\n 'stroke-dasharray': '85 30',\n },\n h('animateTransform', {\n attributeName: 'transform',\n type: 'rotate',\n repeatCount: 'indefinite',\n dur: '1s',\n values: '0 50 50;360 50 50',\n keyTimes: '0;1',\n }),\n ),\n );\n\nexport const GifIcon: FunctionalComponent = () =>\n h(\n 'svg',\n {\n width: 24,\n height: 24,\n fill: 'currentcolor',\n viewBox: '0 0 24 24',\n },\n [\n h('path', {\n style: 'transform: translateY(0.5px)',\n d: 'M18.968 10.5H15.968V11.484H17.984V12.984H15.968V15H14.468V9H18.968V10.5V10.5ZM8.984 9C9.26533 9 9.49967 9.09367 9.687 9.281C9.87433 9.46833 9.968 9.70267 9.968 9.984V10.5H6.499V13.5H8.468V12H9.968V14.016C9.968 14.2973 9.87433 14.5317 9.687 14.719C9.49967 14.9063 9.26533 15 8.984 15H5.984C5.70267 15 5.46833 14.9063 5.281 14.719C5.09367 14.5317 5 14.2973 5 14.016V9.985C5 9.70367 5.09367 9.46933 5.281 9.282C5.46833 9.09467 5.70267 9.001 5.984 9.001H8.984V9ZM11.468 9H12.968V15H11.468V9V9Z',\n }),\n h('path', {\n d: 'M18.5 3H5.75C3.6875 3 2 4.6875 2 6.75V18C2 20.0625 3.6875 21.75 5.75 21.75H18.5C20.5625 21.75 22.25 20.0625 22.25 18V6.75C22.25 4.6875 20.5625 3 18.5 3ZM20.75 18C20.75 19.2375 19.7375 20.25 18.5 20.25H5.75C4.5125 20.25 3.5 19.2375 3.5 18V6.75C3.5 5.5125 4.5125 4.5 5.75 4.5H18.5C19.7375 4.5 20.75 5.5125 20.75 6.75V18Z',\n }),\n ],\n );\n","import type { RemovableRef } from '@vueuse/core';\nimport { useStorage } from '@vueuse/core';\n\nexport interface UserMeta {\n nick: string;\n mail: string;\n link: string;\n}\n\nexport const useUserMeta = (): RemovableRef<UserMeta> =>\n useStorage<UserMeta>('WALINE_USER_META', {\n nick: '',\n mail: '',\n link: '',\n });\n\nexport const useEditor = (): RemovableRef<string> =>\n useStorage<string>('WALINE_COMMENT_BOX_EDITOR', '');\n","import { useStorage } from '@vueuse/core';\nimport type { Ref } from 'vue';\n\nconst LIKE_KEY = 'WALINE_LIKE';\n\nexport type LikeID = number | string;\n\nexport type LikeRef = Ref<LikeID[]>;\n\nconst likeStorage = useStorage<LikeID[]>(LIKE_KEY, []);\n\nexport const useLikeStorage = (): LikeRef => likeStorage;\n","import { useStorage } from '@vueuse/core';\nimport type { Ref } from 'vue';\n\nconst REACTION_KEY = 'WALINE_REACTION';\n\nexport type WalineReactionStore = Record</* VOTE_IDENTIFIER */ string, number | undefined>;\n\nexport type VoteRef = Ref<WalineReactionStore>;\n\nconst reactionStorage = useStorage<WalineReactionStore>(REACTION_KEY, {});\n\nexport const useReactionStorage = (): VoteRef => reactionStorage;\n","import type { ReCaptchaInstance } from 'recaptcha-v3';\nimport { load } from 'recaptcha-v3';\n\nconst recaptchaStore: Record<string, Promise<ReCaptchaInstance>> = {};\n\ninterface ReCaptcha {\n execute: (action: string) => Promise<string>;\n}\n\nexport const useReCaptcha = (key: string): ReCaptcha => {\n const init = (recaptchaStore[key] ??= load(key, {\n useRecaptchaNet: true,\n autoHideBadge: true,\n }));\n\n return {\n execute: (action: string) => init.then((instance) => instance.execute(action)),\n };\n};\n","import { useScriptTag } from '@vueuse/core';\n\ninterface TurnstileOptions {\n sitekey: string;\n action?: string;\n size?: 'normal' | 'compact';\n callback?: (token: string) => void;\n}\ninterface TurnstileInstance {\n ready: (fn: () => void) => void;\n excute: (className: string, options?: TurnstileOptions) => void;\n render: (className: string, options?: TurnstileOptions) => void;\n}\n\ndeclare global {\n interface Window {\n turnstile?: TurnstileInstance;\n }\n}\n\ninterface Turnstile {\n execute: (action: string) => Promise<string>;\n}\n\nexport const useTurnstile = (key: string): Turnstile => {\n const execute = async (action: string): Promise<string> => {\n const { load } = useScriptTag(\n 'https://challenges.cloudflare.com/turnstile/v0/api.js',\n // oxlint-disable-next-line no-undefined\n undefined,\n { async: false },\n );\n\n await load();\n\n const { turnstile } = window;\n\n return new Promise((resolve) => {\n turnstile?.ready(() => {\n turnstile.render('.wl-captcha-container', {\n sitekey: key,\n action,\n size: 'compact',\n callback: resolve,\n });\n });\n });\n };\n\n return { execute };\n};\n","import { useStorage } from '@vueuse/core';\nimport type { UserInfo } from '@waline/api';\nimport type { Ref } from 'vue';\n\nexport const USER_KEY = 'WALINE_USER';\n\nexport type UserInfoRef = Ref<UserInfo | Record<string, never>>;\n\nconst userInfoStorage = useStorage<UserInfo | Record<string, never>>(USER_KEY, {});\n\nexport const useUserInfo = (): UserInfoRef => userInfoStorage;\n","import type { IGif } from '@giphy/js-types';\n\nimport type {\n WalineEmojiPresets,\n WalineMeta,\n WalineSearchOptions,\n WalineSearchResult,\n} from '../typings/index.js';\n\nconst AVAILABLE_META = new Set<WalineMeta>(['nick', 'mail', 'link']);\n\nexport const getMeta = (meta: WalineMeta[]): WalineMeta[] =>\n meta.filter((item) => AVAILABLE_META.has(item));\n\nexport const DEFAULT_EMOJI: WalineEmojiPresets[] = ['//unpkg.com/@waline/emojis@1.1.0/weibo'];\n\nexport const DEFAULT_REACTION = [\n '//unpkg.com/@waline/emojis/tieba/tieba_agree.png',\n '//unpkg.com/@waline/emojis/tieba/tieba_look_down.png',\n '//unpkg.com/@waline/emojis/tieba/tieba_sunglasses.png',\n '//unpkg.com/@waline/emojis/tieba/tieba_pick_nose.png',\n '//unpkg.com/@waline/emojis/tieba/tieba_awkward.png',\n '//unpkg.com/@waline/emojis/tieba/tieba_sleep.png',\n];\n\nexport const defaultUploadImage = (file: File): Promise<string> =>\n new Promise((resolve, reject) => {\n if (file.size > 128 * 1000) {\n reject(new Error('File too large! File size limit 128KB'));\n\n return;\n }\n\n const reader = new FileReader();\n\n reader.readAsDataURL(file);\n\n reader.addEventListener('load', () => {\n resolve(reader.result as string);\n });\n reader.addEventListener('error', reject);\n });\n\nexport const defaultTeXRenderer = (blockMode: boolean): string =>\n blockMode\n ? '<p class=\"wl-tex\">TeX is not available in preview</p>'\n : '<span class=\"wl-tex\">TeX is not available in preview</span>';\n\nexport const getDefaultSearchOptions = (lang: string): WalineSearchOptions => {\n interface GifResult {\n data: IGif[];\n meta: {\n msg: string;\n response_id: string;\n status: number;\n };\n pagination: {\n count: number;\n total_count: number;\n offset: number;\n };\n }\n\n const fetchGiphy = (\n url: string,\n params: Record<string, string> = {},\n ): Promise<WalineSearchResult> =>\n fetch(\n `https://api.giphy.com/v1/gifs/${url}?${new URLSearchParams({\n lang,\n limit: '20',\n rating: 'g',\n api_key: '6CIMLkNMMOhRcXPoMCPkFy4Ybk2XUiMp',\n ...params,\n }).toString()}`,\n )\n .then((resp) => resp.json() as Promise<GifResult>)\n .then(({ data }) =>\n data.map((gif) => ({\n title: gif.title,\n src: gif.images.downsized_medium.url,\n })),\n );\n\n return {\n search: (word: string): Promise<WalineSearchResult> =>\n // oxlint-disable-next-line id-length\n fetchGiphy('search', { q: word, offset: '0' }),\n default: (): Promise<WalineSearchResult> => fetchGiphy('trending', {}),\n more: (word: string, offset = 0): Promise<WalineSearchResult> =>\n // oxlint-disable-next-line id-length\n fetchGiphy('search', { q: word, offset: offset.toString() }),\n };\n};\n","// oxlint-disable jsdoc/check-tag-names FIXME:\n/**\n * The MIT License (MIT)\n *\n * Copyright (c) egoist <0x142857@gmail.com> (https://egoistian.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\nconst WORD_REGEXP =\n /[\\u4E00-\\u9FFF\\u3400-\\u4DBF\\uF900-\\uFAFF\\u3040-\\u309F\\uAC00-\\uD7AF\\u0400-\\u04FF]+|\\w+/;\nconst LEFT_ANGLE_REGEXP = /</;\nconst LINE_COMMENT_REGEXP = /(?:^|\\s)\\/\\/(.+?)$/gm;\nconst BLOCK_COMMENT_REGEXP = /\\/\\*([\\S\\s]*?)\\*\\//gm;\nconst REGEXP = new RegExp(\n `(${WORD_REGEXP.source}|${LEFT_ANGLE_REGEXP.source})|((?:${LINE_COMMENT_REGEXP.source})|(?:${BLOCK_COMMENT_REGEXP.source}))`,\n 'gmi',\n);\n\nconst COLORS = [\n '23AC69',\n '91C132',\n 'F19726',\n 'E8552D',\n '1AAB8E',\n 'E1147F',\n '2980C1',\n '1BA1E6',\n '9FA0A0',\n 'F19726',\n 'E30B20',\n 'E30B20',\n 'A3338B',\n];\nconst cache: Record<string, string> = {};\n\nexport const defaultHighlighter = (input: string): string => {\n let index = 0;\n\n return input.replace(REGEXP, (_match, word: string, comment: string) => {\n if (comment) return `<span style=\"color: slategray\">${comment}</span>`;\n if (word === '<') return '<';\n\n let color: string;\n\n if (cache[word]) color = cache[word];\n else {\n color = COLORS[index];\n cache[word] = color;\n }\n\n const out = `<span style=\"color: #${color}\">${word}</span>`;\n\n index = ++index % COLORS.length;\n\n return out;\n });\n};\n","import type { WalineLocale } from '../../typings/index.js';\n\nconst localeKeys = [\n 'nick',\n 'nickError',\n 'mail',\n 'mailError',\n 'link',\n 'optional',\n 'placeholder',\n 'sofa',\n 'submit',\n 'like',\n 'cancelLike',\n 'reply',\n 'cancelReply',\n 'comment',\n 'refresh',\n 'more',\n 'preview',\n 'emoji',\n 'uploadImage',\n 'seconds',\n 'minutes',\n 'hours',\n 'days',\n 'now',\n 'uploading',\n 'login',\n 'logout',\n 'admin',\n 'sticky',\n 'word',\n 'wordHint',\n 'anonymous',\n 'level0',\n 'level1',\n 'level2',\n 'level3',\n 'level4',\n 'level5',\n 'gif',\n 'gifSearchPlaceholder',\n 'profile',\n 'approved',\n 'waiting',\n 'spam',\n 'unsticky',\n 'oldest',\n 'latest',\n 'hottest',\n 'reactionTitle',\n 'commentUnderReview',\n];\n\nexport const generateLocale = (locale: string[]): WalineLocale =>\n Object.fromEntries(\n locale.map((item, index) => [localeKeys[index], item]),\n ) as unknown as WalineLocale;\n","/* de.ts */\n\nimport { generateLocale } from './generate.js';\n\nexport default generateLocale([\n 'Benutzername',\n 'Der Benutzername darf nicht weniger als 3 Bytes umfassen.',\n 'E-Mail',\n 'Bitte bestätigen Sie Ihre E-Mail-Adresse.',\n 'Webseite',\n 'Optional',\n 'Kommentieren Sie hier...',\n 'Noch keine Kommentare.',\n 'Senden',\n 'Gefällt mir',\n 'Gefällt mir nicht mehr',\n 'Antworten',\n 'Antwort abbrechen',\n 'Kommentare',\n 'Aktualisieren',\n 'Mehr laden...',\n 'Vorschau',\n 'Emoji',\n 'Ein Bild hochladen',\n 'Vor einigen Sekunden',\n 'Vor einigen Minuten',\n 'Vor einigen Stunden',\n 'Vor einigen Tagen',\n 'Gerade eben',\n 'Hochladen läuft',\n 'Anmelden',\n 'Abmelden',\n 'Admin',\n 'Angeheftet',\n 'Wörter',\n 'Bitte geben Sie Kommentare zwischen $0 und $1 Wörtern ein! Aktuelle Anzahl der Wörter: $2',\n 'Anonym',\n 'Zwerge',\n 'Hobbits',\n 'Ents',\n 'Magier',\n 'Elfen',\n 'Maïar',\n 'GIF',\n 'Nach einem GIF suchen',\n 'Profil',\n 'Genehmigt',\n 'Ausstehend',\n 'Spam',\n 'Lösen',\n 'Älteste',\n 'Neueste',\n 'Am beliebtesten',\n 'Was denken Sie?',\n 'Ihr Kommentar wird überprüft und ist derzeit nur für Sie sichtbar. Nach der Genehmigung wird er öffentlich angezeigt.',\n]);\n","import { generateLocale } from './generate.js';\n\nexport default generateLocale([\n 'NickName',\n 'NickName cannot be less than 3 bytes.',\n 'E-Mail',\n 'Please confirm your email address.',\n 'Website',\n 'Optional',\n 'Comment here...',\n 'No comment yet.',\n 'Submit',\n 'Like',\n 'Cancel like',\n 'Reply',\n 'Cancel reply',\n 'Comments',\n 'Refresh',\n 'Load More...',\n 'Preview',\n 'Emoji',\n 'Upload Image',\n 'seconds ago',\n 'minutes ago',\n 'hours ago',\n 'days ago',\n 'just now',\n 'Uploading',\n 'Login',\n 'logout',\n 'Admin',\n 'Sticky',\n 'Words',\n 'Please input comments between $0 and $1 words!\\n Current word number: $2',\n 'Anonymous',\n 'Dwarves',\n 'Hobbits',\n 'Ents',\n 'Wizards',\n 'Elves',\n 'Maiar',\n 'GIF',\n 'Search GIF',\n 'Profile',\n 'Approved',\n 'Waiting',\n 'Spam',\n 'Unsticky',\n 'Oldest',\n 'Latest',\n 'Hottest',\n 'What do you think?',\n 'Your comment is under review and is currently only visible to you. It will be publicly visible after approval.',\n]);\n","import { generateLocale } from './generate.js';\n\nexport default generateLocale([\n 'Nombre de usuario',\n 'El nombre de usuario no puede tener menos de 3 bytes.',\n 'Correo electrónico',\n 'Por favor confirma tu dirección de correo electrónico.',\n 'Sitio web',\n 'Opcional',\n 'Comenta aquí...',\n 'Sin comentarios todavía.',\n 'Enviar',\n 'Like',\n 'Anular like',\n 'Responder',\n 'Anular respuesta',\n 'Comentarios',\n 'Recargar',\n 'Cargar Más...',\n 'Previsualizar',\n 'Emoji',\n 'Subir Imagen',\n 'segundos atrás',\n 'minutos atrás',\n 'horas atrás',\n 'días atrás',\n 'justo ahora',\n 'Subiendo',\n 'Iniciar sesión',\n 'cerrar sesión',\n 'Admin',\n 'Fijado',\n 'Palabras',\n 'Por favor escriba entre $0 y $1 palabras!\\n El número actual de palabras: $2',\n 'Anónimo',\n 'Enanos',\n 'Hobbits',\n 'Ents',\n 'Magos',\n 'Elfos',\n 'Maiar',\n 'GIF',\n 'Buscar GIF',\n 'Perfil',\n 'Aprobado',\n 'Esperando',\n 'Spam',\n 'Desfijar',\n 'Más antiguos',\n 'Más recientes',\n 'Más vistos',\n '¿Qué piensas?',\n 'Tu comentario está en revisión y actualmente solo es visible para ti. Será visible públicamente después de la aprobación.',\n]);\n","/* fr.ts */\n\nimport { generateLocale } from './generate.js';\n\nexport default generateLocale([\n 'Pseudo',\n 'Le pseudo ne peut pas faire moins de 3 octets.',\n 'E-mail',\n 'Veuillez confirmer votre adresse e-mail.',\n 'Site Web',\n 'Optionnel',\n 'Commentez ici...',\n \"Aucun commentaire pour l'instant.\",\n 'Envoyer',\n \"J'aime\",\n \"Annuler le j'aime\",\n 'Répondre',\n 'Annuler la réponse',\n 'Commentaires',\n 'Actualiser',\n 'Charger plus...',\n 'Aperçu',\n 'Emoji',\n 'Télécharger une image',\n 'Il y a quelques secondes',\n 'Il y a quelques minutes',\n 'Il y a quelques heures',\n 'Il y a quelques jours',\n \"À l'instant\",\n 'Téléchargement en cours',\n 'Connexion',\n 'Déconnexion',\n 'Admin',\n 'Épinglé',\n 'Mots',\n 'Veuillez saisir des commentaires entre $0 et $1 mots !\\n Nombre actuel de mots : $2',\n 'Anonyme',\n 'Nains',\n 'Hobbits',\n 'Ents',\n 'Mages',\n 'Elfes',\n 'Maïar',\n 'GIF',\n 'Rechercher un GIF',\n 'Profil',\n 'Approuvé',\n 'En attente',\n 'Indésirable',\n 'Détacher',\n 'Le plus ancien',\n 'Dernier',\n 'Le plus populaire',\n \"Qu'en pensez-vous ?\",\n \"Votre commentaire est en cours de révision et n'est actuellement visible que par vous. Il sera visible publiquement après approbation.\",\n]);\n","/* it.ts */\n/* Localization for Italian ~ Localizzazione italiana 🍕*/\n\nimport { generateLocale } from './generate.js';\n\nexport default generateLocale([\n 'Nickname',\n 'Il nickname non può avere meno di 3 caratteri.',\n 'E-mail',\n 'Per favore conferma il tuo indirizzo e-mail.',\n 'Sito web',\n 'Facoltativo',\n 'Scrivi un commento...',\n 'Ancora nessun commento.',\n 'Invia',\n 'Mi piace',\n 'Annulla mi piace',\n 'Rispondi',\n 'Annulla risposta',\n 'Commenti',\n 'Aggiorna',\n 'Carica altri...',\n 'Anteprima',\n 'Emoji',\n 'Carica immagine',\n 'secondi fa',\n 'minuti fa',\n 'ore fa',\n 'giorni fa',\n 'adesso',\n 'Caricamento in corso...',\n 'Accedi',\n 'Esci',\n 'Admin',\n 'In evidenza',\n 'Parole',\n 'Inserisci un commento tra $0 e $1 parole!\\n Numero attuale di parole: $2',\n 'Anonimo',\n 'Nano',\n 'Hobbit',\n 'Ent',\n 'Mago',\n 'Elfo',\n 'Maiar',\n 'GIF',\n 'Cerca GIF',\n 'Profilo',\n 'Approvato',\n 'In attesa',\n 'Spam',\n 'Rimuovi evidenza',\n 'Più vecchi',\n 'Più recenti',\n 'Più popolari',\n 'Cosa ne pensi?',\n \"Il tuo commento è in fase di revisione ed è attualmente visibile solo a te. Sarà visibile pubblicamente dopo l'approvazione.\",\n]);\n","import { generateLocale } from './generate.js';\n\nexport default generateLocale([\n 'ニックネーム',\n '3バイト以上のニックネームをご入力ください.',\n 'メールアドレス',\n 'メールアドレスをご確認ください.',\n 'サイト',\n 'オプション',\n 'ここにコメント',\n 'コメントしましょう~',\n '提出する',\n 'Like',\n 'Cancel like',\n '返信する',\n 'キャンセル',\n 'コメント',\n '更新',\n 'さらに読み込む',\n 'プレビュー',\n '絵文字',\n '画像をアップロード',\n '秒前',\n '分前',\n '時間前',\n '日前',\n 'たっだ今',\n 'アップロード',\n 'ログインする',\n 'ログアウト',\n '管理者',\n 'トップに置く',\n 'ワード',\n 'コメントは $0 から $1 ワードの間でなければなりません!\\n 現在の単語番号: $2',\n '匿名',\n 'うえにん',\n 'なかにん',\n 'しもおし',\n '特にしもおし',\n 'かげ',\n 'なぬし',\n 'GIF',\n '探す GIF',\n '個人情報',\n '承認済み',\n '待っている',\n 'スパム',\n 'べたつかない',\n '逆順',\n '正順',\n '人気順',\n 'どう思いますか?',\n 'あなたのコメントは審査中で、現在はあなただけに表示されています。承認後に公開されます。',\n]);\n","import { generateLocale } from './generate.js';\n\nexport default generateLocale([\n 'Apelido',\n 'Apelido não pode ser menor que 3 bytes.',\n 'E-Mail',\n 'Por favor, confirme seu endereço de e-mail.',\n 'Website',\n 'Opcional',\n 'Comente aqui...',\n 'Nenhum comentário, ainda.',\n 'Enviar',\n 'Like',\n 'Cancel like',\n 'Responder',\n 'Cancelar resposta',\n 'Comentários',\n 'Refrescar',\n 'Carregar Mais...',\n 'Visualizar',\n 'Emoji',\n 'Enviar Imagem',\n 'segundos atrás',\n 'minutos atrás',\n 'horas atrás',\n 'dias atrás',\n 'agora mesmo',\n 'Enviando',\n 'Entrar',\n 'Sair',\n 'Admin',\n 'Sticky',\n 'Palavras',\n 'Favor enviar comentário com $0 a $1 palavras!\\n Número de palavras atuais: $2',\n 'Anônimo',\n 'Dwarves',\n 'Hobbits',\n 'Ents',\n 'Wizards',\n 'Elves',\n 'Maiar',\n 'GIF',\n 'Pesquisar GIF',\n 'informação pessoal',\n 'Aprovado',\n 'Espera',\n 'Spam',\n 'Unsticky',\n 'Mais velho',\n 'Mais recentes',\n 'Mais quente',\n 'O que você acha?',\n 'Seu comentário está em revisão e atualmente está visível apenas para você. Ele será visível publicamente após a aprovação.',\n]);\n","import { generateLocale } from './generate.js';\n\nexport default generateLocale([\n 'Псевдоним',\n 'Никнейм не может быть меньше 3 байт.',\n 'Эл. адрес',\n 'Пожалуйста, подтвердите адрес вашей электронной почты.',\n 'Веб-сайт',\n 'Необязательный',\n 'Комментарий здесь...',\n 'Пока нет комментариев.',\n 'Отправить',\n 'Like',\n 'Cancel like',\n 'Отвечать',\n 'Отменить ответ',\n 'Комментарии',\n 'Обновить',\n 'Загрузи больше...',\n 'Превью',\n 'эмодзи',\n 'Загрузить изображение',\n 'секунд назад',\n 'несколько минут назад',\n 'несколько часов назад',\n 'дней назад',\n 'прямо сейчас',\n 'Загрузка',\n 'Авторизоваться',\n 'Выход из системы',\n 'Админ',\n 'Липкий',\n 'Слова',\n 'Пожалуйста, введите комментарии от $0 до $1 слов!\\nНомер текущего слова: $2',\n 'Анонимный',\n 'Dwarves',\n 'Hobbits',\n 'Ents',\n 'Wizards',\n 'Elves',\n 'Maiar',\n 'GIF',\n 'Поиск GIF',\n 'Персональные данные',\n 'Одобренный',\n 'Ожидающий',\n 'Спам',\n 'Нелипкий',\n 'самый старый',\n 'последний',\n 'самый горячий',\n 'Что вы думаете?',\n 'Ваш комментарий находится на рассмотрении и в настоящее время виден только вам. После одобрения он станет общедоступным.',\n]);\n","import { generateLocale } from './generate.js';\n\nexport default generateLocale([\n 'Tên',\n 'Tên không được nhỏ hơn 3 ký tự.',\n 'E-Mail',\n 'Vui lòng xác nhập địa chỉ email của bạn.',\n 'Website',\n 'Tùy chọn',\n 'Hãy bình luận có văn hoá!',\n 'Chưa có bình luận',\n 'Gửi',\n 'Thích',\n 'Bỏ thích',\n 'Trả lời',\n 'Hủy bỏ',\n 'bình luận',\n 'Làm mới',\n 'Tải thêm...',\n 'Xem trước',\n 'Emoji',\n 'Tải lên hình ảnh',\n 'giây trước',\n 'phút trước',\n 'giờ trước',\n 'ngày trước',\n 'Vừa xong',\n 'Đang tải lên',\n 'Đăng nhập',\n 'đăng xuất',\n 'Quản trị viên',\n 'Dính',\n 'từ',\n 'Bình luận phải có độ dài giữa $0 và $1 từ!\\n Số từ hiện tại: $2',\n 'Vô danh',\n 'Người lùn',\n 'Người tí hon',\n 'Thần rừng',\n 'Pháp sư',\n 'Tiên tộc',\n 'Maiar',\n 'Ảnh GIF',\n 'Tìm kiếm ảnh GIF',\n 'thông tin cá nhân',\n 'Đã được phê duyệt',\n 'Đang chờ đợi',\n 'Thư rác',\n 'Không dính',\n 'lâu đời nhất',\n 'muộn nhất',\n 'nóng nhất',\n 'What do you think?',\n 'Bình luận của bạn đang được xem xét và hiện chỉ hiển thị với bạn. Nó sẽ được công khai sau khi được phê duyệt.',\n]);\n","import { generateLocale } from './generate.js';\n\nexport default generateLocale([\n '昵称',\n '昵称不能少于3个字符',\n '邮箱',\n '请填写正确的邮件地址',\n '网址',\n '可选',\n '欢迎评论',\n '来发评论吧~',\n '提交',\n '喜欢',\n '取消喜欢',\n '回复',\n '取消回复',\n '评论',\n '刷新',\n '加载更多...',\n '预览',\n '表情',\n '上传图片',\n '秒前',\n '分钟前',\n '小时前',\n '天前',\n '刚刚',\n '正在上传',\n '登录',\n '退出',\n '博主',\n '置顶',\n '字',\n '评论字数应在 $0 到 $1 字之间!\\n当前字数:$2',\n '匿名',\n '潜水',\n '冒泡',\n '吐槽',\n '活跃',\n '话痨',\n '传说',\n '表情包',\n '搜索表情包',\n '个人资料',\n '通过',\n '待审核',\n '垃圾',\n '取消置顶',\n '按倒序',\n '按正序',\n '按热度',\n '你认为这篇文章怎么样?',\n '评论正在审核中,当前仅自己可见,审核通过后公开可见。',\n]);\n","import { generateLocale } from './generate.js';\n\nexport default generateLocale([\n '暱稱',\n '暱稱不能少於3個字元',\n '郵箱',\n '請填寫正確的郵件地址',\n '網址',\n '可選',\n '歡迎留言',\n '來發留言吧~',\n '送出',\n '喜歡',\n '取消喜歡',\n '回覆',\n '取消回覆',\n '留言',\n '重整',\n '載入更多...',\n '預覽',\n '表情',\n '上傳圖片',\n '秒前',\n '分鐘前',\n '小時前',\n '天前',\n '剛剛',\n '正在上傳',\n '登入',\n '登出',\n '管理者',\n '置頂',\n '字',\n '留言字數應在 $0 到 $1 字之間!\\n目前字數:$2',\n '匿名',\n '潛水',\n '冒泡',\n '吐槽',\n '活躍',\n '多話',\n '傳說',\n '表情包',\n '搜尋表情包',\n '個人資料',\n '通過',\n '待審核',\n '垃圾',\n '取消置頂',\n '最早',\n '最新',\n '熱門',\n '你認為這篇文章怎麼樣?',\n '您的評論正在審核中,目前僅您可見。審核通過後將公開顯示。',\n]);\n","import de from './de.js';\nimport en from './en.js';\nimport es from './es.js';\nimport fr from './fr.js';\nimport it from './it.js';\nimport jp from './jp.js';\nimport ptBR from './pt-BR.js';\nimport ru from './ru.js';\nimport viVN from './vi-VN.js';\nimport zhCN from './zh-CN.js';\nimport zhTW from './zh-TW.js';\nimport type { WalineLocale } from '../../typings/index.js';\n\nexport type Locales = Record<string, WalineLocale>;\n\nexport const DEFAULT_LANG = 'en-US';\n\nexport const DEFAULT_LOCALES: Locales = {\n zh: zhCN,\n 'zh-cn': zhCN,\n 'zh-tw': zhTW,\n en,\n 'en-us': en,\n fr,\n 'fr-fr': fr,\n it,\n 'it-it': it,\n jp,\n 'jp-jp': jp,\n 'pt-br': ptBR,\n ru,\n 'ru-ru': ru,\n vi: viVN,\n 'vi-vn': viVN,\n de,\n es,\n 'es-mx': es,\n};\n\nexport const getLocale = (lang: string): WalineLocale =>\n DEFAULT_LOCALES[lang.toLowerCase()] ?? DEFAULT_LOCALES[DEFAULT_LANG.toLowerCase()];\n\nexport const getLang = (lang: string): string =>\n Object.keys(DEFAULT_LOCALES).includes(lang.toLowerCase()) ? lang : DEFAULT_LANG;\n","import type { WalineCommentSorting } from '../typings/index.js';\n\nexport type SortKey = 'insertedAt_desc' | 'insertedAt_asc' | 'like_desc';\n\nexport const sortKeyMap: Record<WalineCommentSorting, SortKey> = {\n latest: 'insertedAt_desc',\n oldest: 'insertedAt_asc',\n hottest: 'like_desc',\n};\n\nexport const sortingMethods = Object.keys(sortKeyMap) as WalineCommentSorting[];\n","import type { ComputedRef, InjectionKey } from 'vue';\n\nimport type { WalineConfig } from '../utils/config.js';\n\nexport const configKey: InjectionKey<ComputedRef<WalineConfig>> = Symbol('waline-config');\n\nexport * from './default.js';\nexport * from './highlighter.js';\nexport * from './i18n/index.js';\nexport * from './sortKey.js';\n","<script setup lang=\"ts\">\nimport { getArticleCounter, updateArticleCounter } from '@waline/api';\nimport { computed, inject, onMounted, onUnmounted, ref } from 'vue';\n\nimport { LoadingIcon } from './Icons.js';\nimport { useReactionStorage } from '../composables/index.js';\nimport type { WalineReactionLocale } from '../typings/index.js';\nimport { configKey } from '../config/index.js';\nimport { watchImmediate } from '@vueuse/core';\n\ninterface ReactionItem {\n icon: string;\n desc: string;\n active?: boolean;\n}\n\nconst reactionStorage = useReactionStorage();\n// oxlint-disable-next-line typescript/no-non-null-assertion\nconst config = inject(configKey)!;\n\nconst votingIndex = ref(-1);\nconst voteNumbers = ref<number[]>([]);\n\nconst locale = computed(() => config.value.locale);\nconst reaction = computed(() => {\n const { reaction } = config.value;\n\n return reaction?.length ? reaction : null;\n});\n\nconst reactionsInfo = computed<ReactionItem[] | null>(() => {\n const { path } = config.value;\n\n return (\n reaction.value?.map((icon, index) => ({\n icon,\n desc: locale.value[`reaction${index}` as keyof WalineReactionLocale],\n active: reactionStorage.value[path] === index,\n })) ?? null\n );\n});\n\nlet abort: (() => void) | undefined;\n\nconst fetchReaction = async (): Promise<void> => {\n const { serverURL, lang, path } = config.value;\n\n if (!reaction.value) return;\n\n const controller = new AbortController();\n\n abort = controller.abort.bind(controller);\n\n const [reactionData] = (await getArticleCounter({\n serverURL,\n lang,\n paths: [path],\n type: reaction.value.map((_, index) => `reaction${index}`),\n signal: controller.signal,\n })) as Record<string, number>[];\n\n voteNumbers.value = reaction.value.map((_, index) => reactionData[`reaction${index}`]);\n};\n\nconst vote = async (index: number): Promise<void> => {\n // we should ensure that only one vote request is sent at a time\n if (votingIndex.value !== -1) return;\n\n const { serverURL, lang, path } = config.value;\n const currentVoteItemIndex = reactionStorage.value[path];\n\n // mark voting status\n votingIndex.value = index;\n\n // if user already vote current article, decrease the voted item number\n if (currentVoteItemIndex != null) {\n await updateArticleCounter({\n serverURL,\n lang,\n path,\n type: `reaction${currentVoteItemIndex}`,\n action: 'desc',\n });\n\n voteNumbers.value[currentVoteItemIndex] = Math.max(\n voteNumbers.value[currentVoteItemIndex] - 1,\n 0,\n );\n }\n\n // increase voting number if current reaction item is not been voted\n if (currentVoteItemIndex !== index) {\n await updateArticleCounter({\n serverURL,\n lang,\n path,\n type: `reaction${index}`,\n });\n voteNumbers.value[index] = (voteNumbers.value[index] || 0) + 1;\n }\n\n // update vote info in local storage\n // oxlint-disable-next-line typescript/no-dynamic-delete\n if (currentVoteItemIndex === index) delete reactionStorage.value[path];\n else reactionStorage.value[path] = index;\n\n // voting is completed\n votingIndex.value = -1;\n};\n\nonMounted(() => {\n watchImmediate(\n () => [config.value.serverURL, config.value.path],\n () => fetchReaction(),\n );\n});\n\nonUnmounted(() => {\n abort?.();\n});\n</script>\n\n<template>\n <div v-if=\"reactionsInfo\" class=\"wl-reaction\">\n <div class=\"wl-reaction-title\" v-text=\"locale.reactionTitle\" />\n\n <ul class=\"wl-reaction-list\">\n <li\n v-for=\"({ active, icon, desc }, index) in reactionsInfo\"\n :key=\"index\"\n class=\"wl-reaction-item\"\n :class=\"{ active }\"\n @click=\"vote(index)\"\n >\n <div class=\"wl-reaction-img\">\n <img :src=\"icon\" :alt=\"desc\" />\n\n <LoadingIcon v-if=\"votingIndex === index\" class=\"wl-reaction-loading\" />\n\n <div v-else class=\"wl-reaction-votes\" v-text=\"voteNumbers[index] || 0\" />\n </div>\n\n <div class=\"wl-reaction-text\" v-text=\"desc\" />\n </li>\n </ul>\n </div>\n</template>\n","<!-- forked from https://github.com/DerYeger/vue-masonry-wall/blob/master/src/masonry-wall.vue -->\n\n<!--\n MIT License\n\n Copyright (c) 2021 Fuxing Loh, Jan Müller\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE. \n-->\n\n<script setup lang=\"ts\">\nimport { nextTick, onBeforeUnmount, onMounted, ref, useTemplateRef, watch } from 'vue';\n\nimport { LoadingIcon } from './Icons.js';\nimport type { WalineSearchResult } from '../typings/index.js';\n\ntype Column = number[];\n\nconst {\n items = [],\n columnWidth = 300,\n gap = 0,\n} = defineProps<{\n /**\n * Image Items\n */\n items?: WalineSearchResult;\n /**\n * width in pixels of each column\n */\n columnWidth?: number;\n /**\n * gap in pixels between columns\n */\n gap?: number;\n}>();\n\ndefineEmits<(event: 'insert', content: string) => void>();\n\nlet resizeObserver: ResizeObserver | null = null;\nconst wall = useTemplateRef<HTMLDivElement>('wall');\nconst state = ref<Record<string, boolean>>({});\nconst columns = ref<Column[]>([]);\n\nconst getColumnCount = (): number => {\n const count = Math.floor(\n // oxlint-disable-next-line typescript/no-non-null-assertion\n (wall.value!.getBoundingClientRect().width + gap) / (columnWidth + gap),\n );\n\n return count > 0 ? count : 1;\n};\n\nconst createColumns = (count: number): Column[] => Array.from({ length: count }, () => []);\n\nconst fillColumns = async (itemIndex: number): Promise<void> => {\n if (itemIndex >= items.length) return;\n\n await nextTick();\n\n // @ts-expect-error: Type is Element not HTMLElement\n const columnDivs = [...(wall.value?.children ?? [])];\n\n const target = columnDivs.reduce((prev, curr) =>\n curr.getBoundingClientRect().height < prev.getBoundingClientRect().height ? curr : prev,\n );\n\n columns.value[Number(target.dataset.index)].push(itemIndex);\n\n await fillColumns(itemIndex + 1);\n};\n\nconst redraw = async (force = false): Promise<void> => {\n if (columns.value.length === getColumnCount() && !force) return;\n\n columns.value = createColumns(getColumnCount());\n\n const { scrollY } = window;\n\n await fillColumns(0);\n\n window.scrollTo({ top: scrollY });\n};\n\nconst imageLoad = (event: Event): void => {\n state.value[(event.target as HTMLImageElement).src] = true;\n};\n\nonMounted(() => {\n void redraw(true);\n\n resizeObserver = new ResizeObserver(() => {\n void redraw();\n });\n // oxlint-disable-next-line typescript/no-non-null-assertion\n resizeObserver.observe(wall.value!);\n\n watch(\n () => [items],\n () => {\n state.value = {};\n void redraw(true);\n },\n );\n watch(\n () => [columnWidth, gap],\n () => {\n void redraw();\n },\n );\n});\n\nonBeforeUnmount(() => {\n // oxlint-disable-next-line typescript/no-non-null-assertion\n resizeObserver!.unobserve(wall.value!);\n});\n</script>\n\n<template>\n <div ref=\"wall\" class=\"wl-gallery\" :style=\"{ gap: `${gap}px` }\">\n <div\n v-for=\"(column, columnIndex) in columns\"\n :key=\"columnIndex\"\n class=\"wl-gallery-column\"\n :data-index=\"columnIndex\"\n :style=\"{ gap: `${gap}px` }\"\n >\n <template v-for=\"itemIndex in column\" :key=\"itemIndex\">\n <!-- eslint-disable vue/no-static-inline-styles -->\n <LoadingIcon v-if=\"!state[items[itemIndex].src]\" :size=\"36\" style=\"margin: 20px auto\" />\n <!-- eslint-enable vue/no-static-inline-styles -->\n\n <img\n class=\"wl-gallery-item\"\n :src=\"items[itemIndex].src\"\n :title=\"items[itemIndex].title\"\n loading=\"lazy\"\n @load=\"imageLoad\"\n @click=\"$emit('insert', ``)\"\n />\n </template>\n </div>\n </div>\n</template>\n","export const decodePath = (path: string): string => {\n try {\n return decodeURI(path);\n } catch {\n return path;\n }\n};\n\nexport const removeEndingSplash = (content = ''): string => content.replace(/\\/$/u, '');\n\nexport const isLinkHttp = (link: string): boolean => /^(https?:)?\\/\\//.test(link);\n","import { decodePath, isLinkHttp, removeEndingSplash } from './path.js';\nimport {\n DEFAULT_EMOJI,\n DEFAULT_REACTION,\n defaultHighlighter,\n defaultTeXRenderer,\n defaultUploadImage,\n getDefaultSearchOptions,\n getLang,\n getLocale,\n getMeta,\n} from '../config/index.js';\nimport type {\n WalineEmojiInfo,\n WalineEmojiMaps,\n WalineEmojiPresets,\n WalineHighlighter,\n WalineImageUploader,\n WalineLocale,\n WalineProps,\n WalineSearchOptions,\n WalineTeXRenderer,\n} from '../typings/index.js';\n\nexport interface WalineEmojiConfig {\n tabs: Pick<WalineEmojiInfo, 'name' | 'icon' | 'items'>[];\n map: WalineEmojiMaps;\n}\n\nexport interface WalineConfig extends Required<\n Omit<\n WalineProps,\n 'emoji' | 'imageUploader' | 'highlighter' | 'texRenderer' | 'wordLimit' | 'reaction' | 'search'\n >\n> {\n locale: WalineLocale;\n wordLimit: [number, number] | false;\n emoji: (WalineEmojiInfo | WalineEmojiPresets)[] | null;\n highlighter: WalineHighlighter | null;\n imageUploader: WalineImageUploader | null;\n texRenderer: WalineTeXRenderer | null;\n search: WalineSearchOptions | null;\n reaction: string[] | null;\n}\n\nexport const getServerURL = (serverURL: string): string => {\n const result = removeEndingSplash(serverURL);\n\n return isLinkHttp(result) ? result : `https://${result}`;\n};\n\nconst getWordLimit = (wordLimit: WalineProps['wordLimit']): [number, number] | false =>\n Array.isArray(wordLimit) ? wordLimit : typeof wordLimit === 'number' ? [0, wordLimit] : false;\n\nconst fallback = <T = unknown>(value: T | boolean | undefined, fallback: T): T | null =>\n value == null || value === true ? fallback : value === false ? null : value;\n\nexport const getConfig = ({\n serverURL,\n path = location.pathname,\n lang = typeof navigator === 'undefined' ? 'en-US' : navigator.language,\n locale,\n meta = ['nick', 'mail', 'link'],\n requiredMeta = [],\n dark = false,\n pageSize = 10,\n wordLimit,\n noCopyright = false,\n login = 'enable',\n recaptchaV3Key = '',\n turnstileKey = '',\n commentSorting = 'latest',\n emoji = DEFAULT_EMOJI,\n imageUploader,\n highlighter,\n texRenderer,\n search,\n reaction,\n ...more\n}: WalineProps): WalineConfig => ({\n serverURL: getServerURL(serverURL),\n path: decodePath(path),\n lang: getLang(lang),\n locale: {\n ...getLocale(getLang(lang)),\n ...(typeof locale === 'object' ? locale : {}),\n } as WalineLocale,\n wordLimit: getWordLimit(wordLimit),\n meta: getMeta(meta),\n requiredMeta: getMeta(requiredMeta),\n dark,\n pageSize,\n commentSorting,\n login,\n noCopyright,\n recaptchaV3Key,\n turnstileKey,\n ...more,\n // oxlint-disable-next-line typescript/strict-boolean-expressions, typescript/prefer-nullish-coalescing\n reaction: reaction === true ? DEFAULT_REACTION : reaction || null,\n imageUploader: fallback(imageUploader, defaultUploadImage),\n highlighter: fallback(highlighter, defaultHighlighter),\n texRenderer: fallback(texRenderer, defaultTeXRenderer),\n emoji: fallback(emoji, DEFAULT_EMOJI),\n search: fallback(search, getDefaultSearchOptions(lang)),\n});\n","export const isString = (val: unknown): val is string => typeof val === 'string';\n","import { isString } from './type.js';\n\nconst DARK_VARIABLES = `{--waline-white:#000;--waline-light-grey:#666;--waline-dark-grey:#999;--waline-color:#888;--waline-bg-color:#1e1e1e;--waline-bg-color-light:#272727;--waline-bg-color-hover: #444;--waline-border-color:#333;--waline-disable-bg-color:#444;--waline-disable-color:#272727;--waline-bq-color:#272727;--waline-info-bg-color:#272727;--waline-info-color:#666}`;\n\nexport const getDarkStyle = (selector?: string | boolean): string =>\n isString(selector)\n ? selector === 'auto'\n ? `@media(prefers-color-scheme:dark){body${DARK_VARIABLES}}`\n : `${selector}${DARK_VARIABLES}`\n : selector === true\n ? `:root${DARK_VARIABLES}`\n : '';\n","import { isString } from './type.js';\nimport type { WalineDateLocale } from '../typings/index.js';\n\nconst padWithZeros = (vNumber: number, width: number): string => {\n let numAsString = vNumber.toString();\n\n while (numAsString.length < width) {\n numAsString = `0${numAsString}`;\n }\n\n return numAsString;\n};\n\nexport const dateFormat = (date: Date): string => {\n const vDay = padWithZeros(date.getDate(), 2);\n const vMonth = padWithZeros(date.getMonth() + 1, 2);\n const vYear = padWithZeros(date.getFullYear(), 2);\n\n return `${vYear}-${vMonth}-${vDay}`;\n};\n\nexport const getTimeAgo = (date: Date | string, now: Date, locale: WalineDateLocale): string => {\n // oxlint-disable-next-line typescript/strict-boolean-expressions\n if (!date) return '';\n\n const time = isString(date)\n ? new Date(date.includes(' ') ? date.replaceAll('-', '/') : date)\n : date;\n\n const timePassed = now.getTime() - time.getTime();\n\n const days = Math.floor(timePassed / (24 * 3600 * 1000));\n\n if (days === 0) {\n // 计算相差小时数\n\n // 计算天数后剩余的毫秒数\n const leave1 = timePassed % (24 * 3600 * 1000);\n const hours = Math.floor(leave1 / (3600 * 1000));\n\n if (hours === 0) {\n //计算相差分钟数\n\n // 计算小时数后剩余的毫秒数\n const leave2 = leave1 % (3600 * 1000);\n const minutes = Math.floor(leave2 / (60 * 1000));\n\n // 计算相差秒数\n if (minutes === 0) {\n // 计算分钟数后剩余的毫秒数\n const leave3 = leave2 % (60 * 1000);\n const seconds = Math.round(leave3 / 1000);\n\n return `${seconds} ${locale.seconds}`;\n }\n\n return `${minutes} ${locale.minutes}`;\n }\n\n return `${hours} ${locale.hours}`;\n }\n\n if (days < 0) return locale.now;\n\n if (days < 8) return `${days} ${locale.days}`;\n\n return dateFormat(time);\n};\n","/**\n * @see https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address\n */\nconst EMAIL_REG_EXP =\n /^[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])?)*$/;\n\nexport const isValidEmail = (email: string): boolean => EMAIL_REG_EXP.test(email);\n","import { useStorage } from '@vueuse/core';\n\nimport type { WalineEmojiConfig } from './config.js';\nimport { removeEndingSplash } from './path.js';\nimport { isString } from './type.js';\nimport type { WalineEmojiInfo } from '../typings/index.js';\n\nconst EMOJI_STORE_KEY = 'WALINE_EMOJI';\n\nconst emojiStore = useStorage<Record<string, WalineEmojiInfo | undefined>>(EMOJI_STORE_KEY, {});\n\nconst checkVersionAnnotation = (url: string): boolean => /@[0-9]+\\.[0-9]+\\.[0-9]+/.test(url);\n\nconst fetchEmoji = (link: string): Promise<WalineEmojiInfo> => {\n const containsVersion = checkVersionAnnotation(link);\n\n // if the link contains version annotation, check if it's in the cache store\n if (containsVersion) {\n const info = emojiStore.value[link];\n\n if (info) return Promise.resolve(info);\n }\n\n return fetch(`${link}/info.json`)\n .then((resp) => resp.json() as Promise<Omit<WalineEmojiInfo, 'folder'>>)\n .then((emojiInfo) => {\n const info = {\n folder: link,\n ...emojiInfo,\n };\n\n // cache the emoji info if the link contains version annotation\n if (containsVersion) emojiStore.value[link] = info;\n\n return info;\n });\n};\n\nconst getLink = (name: string, folder = '', prefix = '', type = ''): string =>\n `${folder ? `${folder}/` : ''}${prefix}${name}${type ? `.${type}` : ''}`;\n\nexport const getEmojisInfo = (\n emojis: (string | WalineEmojiInfo)[] | null,\n): Promise<WalineEmojiConfig> =>\n Promise.all(\n emojis\n ? emojis.map((emoji) =>\n isString(emoji) ? fetchEmoji(removeEndingSplash(emoji)) : Promise.resolve(emoji),\n )\n : [],\n ).then((emojiInfos) => {\n const emojisConfig: WalineEmojiConfig = {\n tabs: [],\n map: {},\n };\n\n emojiInfos.forEach((emojiInfo) => {\n const { name, folder, icon, prefix = '', type, items } = emojiInfo;\n\n emojisConfig.tabs.push({\n name,\n icon: getLink(icon, folder, prefix, type),\n items: items.map((item) => {\n const key = `${prefix}${item}`;\n\n emojisConfig.map[key] = getLink(item, folder, prefix, type);\n\n return key;\n }),\n });\n });\n\n return emojisConfig;\n });\n","export const getImageFromDataTransfer = (items: DataTransferItemList): File | null => {\n const image = [...items].find((item) => item.type.includes('image'));\n\n return image ? image.getAsFile() : null;\n};\n","import type { TokenizerExtension } from 'marked';\n\nimport type { WalineTeXRenderer } from '../typings/index.js';\n\nconst inlineMathStart = /\\$.*?\\$/;\nconst inlineMathReg = /^\\$(.*?)\\$/;\nconst blockMathReg = /^(?:\\s{0,3})\\$\\$((?:[^\\n]|\\n[^\\n])+?)\\n{0,1}\\$\\$/;\n\nexport const markedTeXExtensions = (texRenderer: WalineTeXRenderer): TokenizerExtension[] => {\n const blockMathExtension: TokenizerExtension = {\n name: 'blockMath',\n level: 'block',\n tokenizer(src: string) {\n const cap = blockMathReg.exec(src);\n\n if (cap != null) {\n return {\n type: 'html',\n raw: cap[0],\n text: texRenderer(true, cap[1]),\n };\n }\n },\n };\n\n const inlineMathExtension: TokenizerExtension = {\n name: 'inlineMath',\n level: 'inline',\n start(src: string) {\n const index = src.search(inlineMathStart);\n\n return index === -1 ? src.length : index;\n },\n tokenizer(src: string) {\n const cap = inlineMathReg.exec(src);\n\n if (cap != null) {\n return {\n type: 'html',\n raw: cap[0],\n text: texRenderer(false, cap[1]),\n };\n }\n },\n };\n\n return [blockMathExtension, inlineMathExtension];\n};\n","import { Marked } from 'marked';\nimport { markedHighlight } from 'marked-highlight';\n\nimport { markedTeXExtensions } from './markedMathExtension.js';\nimport type { WalineEmojiMaps, WalineHighlighter, WalineTeXRenderer } from '../typings/index.js';\n\nexport const parseEmoji = (text = '', emojiMap: WalineEmojiMaps = {}): string =>\n text.replaceAll(/:(.+?):/g, (placeholder, key: string) =>\n emojiMap[key] ? `<img class=\"wl-emoji\" src=\"${emojiMap[key]}\" alt=\"${key}\">` : placeholder,\n );\n\nexport interface ParseMarkdownOptions {\n emojiMap: WalineEmojiMaps;\n highlighter: WalineHighlighter | null;\n texRenderer: WalineTeXRenderer | null;\n}\n\nexport const parseMarkdown = (\n content: string,\n { emojiMap, highlighter, texRenderer }: ParseMarkdownOptions,\n): string => {\n const marked = new Marked();\n\n marked.setOptions({ breaks: true });\n\n if (highlighter) marked.use(markedHighlight({ highlight: highlighter }));\n\n if (texRenderer) {\n const extensions = markedTeXExtensions(texRenderer);\n\n marked.use({ extensions });\n }\n\n return marked.parse(parseEmoji(content, emojiMap)) as string;\n};\n","/**\n * The wordCount module should be lightweight as it's packed into client.\n *\n * So We just make a simple implement here\n *\n * Forked from https://github.com/vuepress-theme-hope/vuepress-theme-hope/blob/main/packages/reading-time2/src/node/readingTime.ts\n */\n\n/**\n * Extract Latin words from content\n *\n * @param content - input string\n * @returns matched words\n */\nexport const getWords = (content: string): RegExpMatchArray | null =>\n // \\u00C0-\\u024F are Latin Supplement letters, maybe used in language like french\n // \\u0400-\\u04FF are Cyrillic letters, used in russian\n content.match(/[\\w\\d\\s,.\\u00C0-\\u024F\\u0400-\\u04FF]+/giu);\n\n/**\n * Extract Chinese Characters from content\n *\n * @param content - input string\n * @returns matched Chinese characters\n */\nexport const getChinese = (content: string): RegExpMatchArray | null =>\n content.match(/[\\u4E00-\\u9FD5]/gu);\n\n/**\n * Get word number of given string\n *\n * @param content - input string\n * @returns word number\n */\nexport const getWordNumber = (content: string): number =>\n (getWords(content)?.reduce<number>(\n (accumulator, word) =>\n accumulator + (['', ',', '.'].includes(word.trim()) ? 0 : word.trim().split(/\\s+/u).length),\n 0,\n ) ?? 0) + (getChinese(content)?.length ?? 0);\n","// NOTE: These types are forked from \"user-agent-data-types\" package\n\n// WICG Spec: https://wicg.github.io/ua-client-hints\n\ndeclare global {\n interface Navigator {\n readonly userAgentData?: NavigatorUAData;\n }\n}\n\n// https://wicg.github.io/ua-client-hints/#dictdef-navigatoruabrandversion\ninterface NavigatorUABrandVersion {\n readonly brand: string;\n readonly version: string;\n}\n\n// https://wicg.github.io/ua-client-hints/#dictdef-uadatavalues\ninterface UADataValues {\n readonly brands?: NavigatorUABrandVersion[];\n readonly mobile?: boolean;\n readonly platform?: string;\n readonly architecture?: string;\n readonly bitness?: string;\n readonly formFactor?: string[];\n readonly model?: string;\n readonly platformVersion?: string;\n /** @deprecated in favour of fullVersionList */\n readonly uaFullVersion?: string;\n readonly fullVersionList?: NavigatorUABrandVersion[];\n readonly wow64?: boolean;\n}\n\n// https://wicg.github.io/ua-client-hints/#dictdef-ualowentropyjson\ninterface UALowEntropyJSON {\n readonly brands: NavigatorUABrandVersion[];\n readonly mobile: boolean;\n readonly platform: string;\n}\n\n// https://wicg.github.io/ua-client-hints/#navigatoruadata\ninterface NavigatorUAData extends UALowEntropyJSON {\n getHighEntropyValues(hints: string[]): Promise<UADataValues>;\n toJSON(): UALowEntropyJSON;\n}\n\nexport const userAgent = async (): Promise<string> => {\n const { userAgentData } = navigator;\n let ua = navigator.userAgent;\n\n // https://learn.microsoft.com/en-us/microsoft-edge/web-platform/how-to-detect-win11\n if (userAgentData?.platform !== 'Windows') {\n return ua;\n }\n\n const { platformVersion } = await userAgentData.getHighEntropyValues(['platformVersion']);\n\n if (!platformVersion) {\n return ua;\n }\n\n const isWindows11Later = Number.parseInt(platformVersion.split('.')[0], 10) >= 13;\n\n if (isWindows11Later) {\n ua = ua.replace('Windows NT 10.0', 'Windows NT 11.0');\n }\n\n return ua;\n};\n","<script setup lang=\"ts\">\n// oxlint-disable import/max-dependencies\nimport { useDebounceFn, useEventListener, watchImmediate } from '@vueuse/core';\nimport type { WalineComment, WalineCommentData, UserInfo } from '@waline/api';\nimport { addComment, login, updateComment } from '@waline/api';\nimport autosize from 'autosize';\nimport type { DeepReadonly, CSSProperties } from 'vue';\nimport { computed, inject, nextTick, onMounted, reactive, ref, useTemplateRef, watch } from 'vue';\n\nimport {\n CloseIcon,\n EmojiIcon,\n GifIcon,\n ImageIcon,\n LoadingIcon,\n MarkdownIcon,\n PreviewIcon,\n} from './Icons.js';\nimport ImageWall from './ImageWall.vue';\nimport {\n useEditor,\n useReCaptcha,\n useTurnstile,\n useUserInfo,\n useUserMeta,\n} from '../composables/index.js';\nimport type { WalineSearchResult } from '../typings/index.js';\nimport type { WalineEmojiConfig } from '../utils/index.js';\nimport {\n getEmojisInfo,\n getImageFromDataTransfer,\n getWordNumber,\n isValidEmail,\n parseEmoji,\n parseMarkdown,\n userAgent,\n} from '../utils/index.js';\nimport { configKey } from '../config/index.js';\n\nconst props = defineProps<{\n /**\n * Current comment to be edited\n */\n edit?: WalineComment | null;\n /**\n * Root comment id\n */\n rootId?: number;\n /**\n * Comment id to be replied\n */\n replyId?: number;\n /**\n * User name to be replied\n */\n replyUser?: string;\n}>();\n\nconst emit = defineEmits<{\n (event: 'log' | 'cancelEdit' | 'cancelReply'): void;\n (event: 'submit', comment: WalineComment): void;\n}>();\n\n// oxlint-disable-next-line typescript/no-non-null-assertion\nconst config = inject(configKey)!;\n\nconst editor = useEditor();\nconst userMeta = useUserMeta();\nconst userInfo = useUserInfo();\n\nconst inputRefs = ref<Record<string, HTMLInputElement>>({});\nconst textAreaRef = useTemplateRef<HTMLTextAreaElement>('textarea');\nconst imageUploaderRef = useTemplateRef<HTMLInputElement>('image-uploader');\nconst emojiButtonRef = useTemplateRef<HTMLDivElement>('emoji-button');\nconst emojiPopupRef = useTemplateRef<HTMLDivElement>('emoji-popup');\nconst gifButtonRef = useTemplateRef<HTMLDivElement>('gif-button');\nconst gifPopupRef = useTemplateRef<HTMLDivElement>('gif-popup');\nconst gifSearchRef = useTemplateRef<HTMLInputElement>('gif-search');\n\nconst emoji = ref<DeepReadonly<WalineEmojiConfig>>({ tabs: [], map: {} });\nconst emojiTabIndex = ref(0);\nconst showEmoji = ref(false);\nconst previewEmoji = ref('');\nconst previewStyle = ref<CSSProperties>({});\nlet leaveTimer: ReturnType<typeof setTimeout>;\n\nconst onEmojiHover = (event: MouseEvent, key: string): void => {\n clearTimeout(leaveTimer);\n previewEmoji.value = key;\n\n const target = event.currentTarget as HTMLElement | null;\n const popup = emojiPopupRef.value;\n\n if (target && popup) {\n const targetRect = target.getBoundingClientRect();\n const popupRect = popup.getBoundingClientRect();\n\n previewStyle.value = {\n left: `${targetRect.left - popupRect.left + targetRect.width / 2}px`,\n top: `${targetRect.top - popupRect.top}px`,\n transform: 'translate(-50%, -100%)',\n };\n }\n};\n\nconst onEmojiLeave = (): void => {\n leaveTimer = setTimeout(() => {\n previewEmoji.value = '';\n }, 50);\n};\n\nconst showGif = ref(false);\nconst showPreview = ref(false);\nconst previewText = ref('');\nconst wordNumber = ref(0);\n\nconst searchResults = reactive({\n loading: true,\n list: [] as WalineSearchResult,\n});\n\nconst wordLimit = ref(0);\nconst isWordNumberLegal = ref(false);\n\nconst content = ref('');\n\nconst isSubmitting = ref(false);\n\nconst isImageListEnd = ref(false);\n\nconst locale = computed(() => config.value.locale);\n\nconst isLogin = computed(() => Boolean(userInfo.value.token));\n\nconst canUploadImage = computed(() => config.value.imageUploader != null);\n\nconst insert = (content: string): void => {\n // oxlint-disable-next-line typescript/no-non-null-assertion\n const textArea = textAreaRef.value!;\n const startPosition = textArea.selectionStart;\n const endPosition = textArea.selectionEnd || 0;\n const { scrollTop } = textArea;\n\n editor.value =\n textArea.value.slice(0, startPosition) + content + textArea.value.slice(endPosition);\n textArea.focus();\n textArea.selectionStart = startPosition + content.length;\n textArea.selectionEnd = startPosition + content.length;\n textArea.scrollTop = scrollTop;\n};\n\nconst onEditorKeyDown = ({ key, ctrlKey, metaKey }: KeyboardEvent): void => {\n // avoid submitting same comment multiple times\n if (isSubmitting.value) return;\n\n // submit comment when pressing cmd|ctrl + enter\n if ((ctrlKey || metaKey) && key === 'Enter') void submitComment();\n};\n\nconst uploadImage = async (file: File): Promise<void> => {\n const uploadText = `![${config.value.locale.uploading} ${file.name}]()`;\n\n insert(uploadText);\n isSubmitting.value = true;\n\n try {\n // oxlint-disable-next-line typescript/no-non-null-assertion\n const url = await config.value.imageUploader!(file);\n\n editor.value = editor.value.replace(uploadText, `\\r\\n`);\n } catch (err) {\n alert((err as Error).message);\n editor.value = editor.value.replace(uploadText, '');\n } finally {\n isSubmitting.value = false;\n }\n};\n\nconst onEditorDrop = (event: DragEvent): void => {\n if (event.dataTransfer?.items) {\n const file = getImageFromDataTransfer(event.dataTransfer.items);\n\n if (file && canUploadImage.value) {\n void uploadImage(file);\n event.preventDefault();\n }\n }\n};\n\nconst onEditorPaste = (event: ClipboardEvent): void => {\n if (event.clipboardData) {\n const file = getImageFromDataTransfer(event.clipboardData.items);\n\n if (file && canUploadImage.value) void uploadImage(file);\n }\n};\n\nconst onImageChange = (): void => {\n // oxlint-disable-next-line typescript/no-non-null-assertion\n const inputElement = imageUploaderRef.value!;\n\n if (inputElement.files && canUploadImage.value)\n void uploadImage(inputElement.files[0]).then(() => {\n // clear input so a same image can be uploaded later\n inputElement.value = '';\n });\n};\n\n// oxlint-disable-next-line complexity, max-statements\nconst submitComment = async (): Promise<void> => {\n const { serverURL, lang, login, wordLimit, requiredMeta, recaptchaV3Key, turnstileKey } =\n config.value;\n\n const comment: WalineCommentData = {\n comment: content.value,\n nick: userMeta.value.nick,\n mail: userMeta.value.mail,\n link: userMeta.value.link,\n url: config.value.path,\n ua: await userAgent(),\n };\n\n if (!props.edit) {\n // https://github.com/walinejs/waline/issues/2163\n if (userInfo.value.token) {\n // login user\n comment.nick = userInfo.value.display_name;\n comment.mail = userInfo.value.email;\n comment.link = userInfo.value.url;\n } else {\n if (login === 'force') return;\n\n // check nick\n if (requiredMeta.includes('nick') && !comment.nick) {\n inputRefs.value.nick.focus();\n\n alert(locale.value.nickError);\n\n return;\n }\n\n // check mail\n if (\n (requiredMeta.includes('mail') && !comment.mail) ||\n (comment.mail && !isValidEmail(comment.mail))\n ) {\n inputRefs.value.mail.focus();\n\n alert(locale.value.mailError);\n\n return;\n }\n\n comment.nick ||= locale.value.anonymous;\n }\n }\n\n // check comment\n if (!comment.comment) {\n // oxlint-disable-next-line typescript/no-non-null-assertion\n textAreaRef.value!.focus();\n\n return;\n }\n\n if (!isWordNumberLegal.value) {\n alert(\n locale.value.wordHint\n .replace('$0', (wordLimit as [number, number])[0].toString())\n .replace('$1', (wordLimit as [number, number])[1].toString())\n .replace('$2', wordNumber.value.toString()),\n );\n\n return;\n }\n\n comment.comment = parseEmoji(comment.comment, emoji.value.map);\n\n if (props.replyId && props.rootId) {\n comment.pid = props.replyId;\n comment.rid = props.rootId;\n comment.at = props.replyUser;\n }\n\n isSubmitting.value = true;\n\n try {\n if (recaptchaV3Key) comment.recaptchaV3 = await useReCaptcha(recaptchaV3Key).execute('social');\n\n if (turnstileKey) comment.turnstile = await useTurnstile(turnstileKey).execute('social');\n\n const options = {\n serverURL,\n lang,\n token: userInfo.value.token,\n comment,\n };\n\n const response = await (props.edit\n ? updateComment({\n objectId: props.edit.objectId,\n ...options,\n })\n : addComment(options));\n\n isSubmitting.value = false;\n\n if (response.errmsg) {\n alert(response.errmsg);\n\n return;\n }\n\n // oxlint-disable-next-line typescript/no-non-null-assertion\n emit('submit', response.data!);\n\n editor.value = '';\n\n previewText.value = '';\n\n // ensure changes are applied to dom to avoid https://github.com/walinejs/waline/issues/2371\n await nextTick();\n\n if (props.replyId) emit('cancelReply');\n if (props.edit?.objectId) emit('cancelEdit');\n } catch (err: unknown) {\n isSubmitting.value = false;\n\n alert((err as TypeError).message);\n }\n};\n\nconst onLogin = (event: Event): void => {\n event.preventDefault();\n const { lang, serverURL } = config.value;\n\n void login({\n serverURL,\n lang,\n }).then((data) => {\n userInfo.value = data;\n (data.remember ? localStorage : sessionStorage).setItem('WALINE_USER', JSON.stringify(data));\n emit('log');\n });\n};\n\nconst onLogout = (): void => {\n userInfo.value = {};\n localStorage.setItem('WALINE_USER', 'null');\n sessionStorage.setItem('WALINE_USER', 'null');\n emit('log');\n};\n\nconst onProfile = (event: Event): void => {\n event.preventDefault();\n\n const { lang, serverURL } = config.value;\n\n const width = 800;\n const height = 800;\n const left = (window.innerWidth - width) / 2;\n const top = (window.innerHeight - height) / 2;\n const query = new URLSearchParams({\n lng: lang,\n token: userInfo.value.token,\n });\n const handler = window.open(\n `${serverURL}/ui/profile?${query.toString()}`,\n '_blank',\n `width=${width},height=${height},left=${left},top=${top},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`,\n );\n\n handler?.postMessage({ type: 'TOKEN', data: userInfo.value.token }, '*');\n};\n\nconst popupHandler = (event: MouseEvent): void => {\n if (\n !emojiButtonRef.value?.contains(event.target as Node) &&\n !emojiPopupRef.value?.contains(event.target as Node)\n )\n showEmoji.value = false;\n\n if (\n !gifButtonRef.value?.contains(event.target as Node) &&\n !gifPopupRef.value?.contains(event.target as Node)\n )\n showGif.value = false;\n};\n\nconst onImageWallScroll = async (event: Event): Promise<void> => {\n const { scrollTop, clientHeight, scrollHeight } = event.target as HTMLDivElement;\n const percent = (clientHeight + scrollTop) / scrollHeight;\n // oxlint-disable-next-line typescript/no-non-null-assertion\n const searchOptions = config.value.search!;\n const keyword = gifSearchRef.value?.value ?? '';\n\n if (percent < 0.9 || searchResults.loading || isImageListEnd.value) return;\n\n searchResults.loading = true;\n\n const searchResult =\n searchOptions.more && searchResults.list.length > 0\n ? await searchOptions.more(keyword, searchResults.list.length)\n : await searchOptions.search(keyword);\n\n if (searchResult.length > 0)\n searchResults.list = [\n ...searchResults.list,\n ...(searchOptions.more && searchResults.list.length > 0\n ? await searchOptions.more(keyword, searchResults.list.length)\n : await searchOptions.search(keyword)),\n ];\n else isImageListEnd.value = true;\n\n searchResults.loading = false;\n\n setTimeout(() => {\n (event.target as HTMLDivElement).scrollTop = scrollTop;\n }, 50);\n};\n\nconst onGifSearch = useDebounceFn((event: Event) => {\n searchResults.list = [];\n isImageListEnd.value = false;\n void onImageWallScroll(event);\n}, 300);\n\nuseEventListener('click', popupHandler);\nuseEventListener('message', ({ data }: { data: { type: 'profile'; data: UserInfo } }) => {\n if (data?.type !== 'profile') return;\n\n userInfo.value = { ...userInfo.value, ...data.data };\n\n [localStorage, sessionStorage]\n .filter((store) => store.getItem('WALINE_USER'))\n .forEach((store) => {\n store.setItem('WALINE_USER', JSON.stringify(userInfo));\n });\n});\n\n// start tracking comment word number\nwatchImmediate([config, wordNumber], ([config, wordNumber]) => {\n const { wordLimit: limit } = config;\n\n if (limit) {\n if (wordNumber < limit[0] && limit[0] !== 0) {\n [wordLimit.value] = limit;\n isWordNumberLegal.value = false;\n } else if (wordNumber > limit[1]) {\n [, wordLimit.value] = limit;\n isWordNumberLegal.value = false;\n } else {\n [, wordLimit.value] = limit;\n isWordNumberLegal.value = true;\n }\n } else {\n wordLimit.value = 0;\n isWordNumberLegal.value = true;\n }\n});\n\n// watch gif\nwatch(showGif, async (showGif) => {\n if (!showGif) return;\n\n // oxlint-disable-next-line typescript/no-non-null-assertion\n const searchOptions = config.value.search!;\n\n // clear input\n if (gifSearchRef.value) gifSearchRef.value.value = '';\n\n // set loading state\n searchResults.loading = true;\n\n // display default results\n searchResults.list = await (searchOptions.default?.() ?? searchOptions.search(''));\n\n // clear loading state\n searchResults.loading = false;\n});\n\nonMounted(() => {\n if (props.edit?.objectId) {\n editor.value = props.edit.orig;\n }\n\n // watch editor\n watchImmediate(\n () => editor.value,\n (value) => {\n const { highlighter, texRenderer } = config.value;\n\n content.value = value;\n previewText.value = parseMarkdown(value, {\n emojiMap: emoji.value.map,\n highlighter,\n texRenderer,\n });\n wordNumber.value = getWordNumber(value);\n\n // oxlint-disable-next-line typescript/no-non-null-assertion\n if (value) autosize(textAreaRef.value!);\n // oxlint-disable-next-line typescript/no-non-null-assertion\n else autosize.destroy(textAreaRef.value!);\n },\n );\n\n // watch emoji value change\n watchImmediate(\n () => config.value.emoji,\n async (emojiConfig) => {\n emoji.value = await getEmojisInfo(emojiConfig);\n },\n );\n});\n</script>\n\n<template>\n <div :key=\"userInfo.token\" class=\"wl-comment\">\n <div v-if=\"config.login !== 'disable' && isLogin && !edit?.objectId\" class=\"wl-login-info\">\n <div class=\"wl-avatar\">\n <button type=\"submit\" class=\"wl-logout-btn\" :title=\"locale.logout\" @click=\"onLogout\">\n <CloseIcon :size=\"14\" />\n </button>\n\n <a\n href=\"#\"\n class=\"wl-login-nick\"\n aria-label=\"Profile\"\n :title=\"locale.profile\"\n @click=\"onProfile\"\n >\n <img :src=\"userInfo.avatar\" alt=\"avatar\" />\n </a>\n </div>\n\n <a\n href=\"#\"\n class=\"wl-login-nick\"\n aria-label=\"Profile\"\n :title=\"locale.profile\"\n @click=\"onProfile\"\n v-text=\"userInfo.display_name\"\n />\n </div>\n\n <div class=\"wl-panel\">\n <div\n v-if=\"config.login !== 'force' && config.meta.length && !isLogin\"\n class=\"wl-header\"\n :class=\"`item${config.meta.length}`\"\n >\n <div v-for=\"kind in config.meta\" :key=\"kind\" class=\"wl-header-item\">\n <label\n :for=\"`wl-${kind}`\"\n v-text=\"\n locale[kind] +\n (config.requiredMeta.includes(kind) || !config.requiredMeta.length\n ? ''\n : `(${locale.optional})`)\n \"\n />\n\n <input\n :id=\"`wl-${kind}`\"\n :ref=\"\n (element) => {\n if (element) inputRefs[kind] = element as HTMLInputElement;\n }\n \"\n v-model=\"userMeta[kind]\"\n class=\"wl-input\"\n :class=\"`wl-${kind}`\"\n :name=\"kind\"\n :type=\"kind === 'mail' ? 'email' : 'text'\"\n />\n </div>\n </div>\n\n <textarea\n id=\"wl-edit\"\n ref=\"textarea\"\n v-model=\"editor\"\n class=\"wl-editor\"\n :placeholder=\"replyUser ? `@${replyUser}` : locale.placeholder\"\n @keydown=\"onEditorKeyDown\"\n @drop=\"onEditorDrop\"\n @paste=\"onEditorPaste\"\n />\n\n <div v-show=\"showPreview\" class=\"wl-preview\">\n <hr />\n\n <h4>{{ locale.preview }}:</h4>\n <!-- eslint-disable-next-line vue/no-v-html -->\n <div class=\"wl-content\" v-html=\"previewText\" />\n </div>\n\n <div class=\"wl-footer\">\n <div class=\"wl-actions\">\n <a\n href=\"https://guides.github.com/features/mastering-markdown/\"\n title=\"Markdown Guide\"\n aria-label=\"Markdown is supported\"\n class=\"wl-action\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <MarkdownIcon />\n </a>\n\n <button\n v-show=\"emoji.tabs.length\"\n ref=\"emoji-button\"\n type=\"button\"\n class=\"wl-action\"\n :class=\"{ active: showEmoji }\"\n :title=\"locale.emoji\"\n @click=\"showEmoji = !showEmoji\"\n >\n <EmojiIcon />\n </button>\n\n <button\n v-if=\"config.search\"\n ref=\"gif-button\"\n type=\"button\"\n class=\"wl-action\"\n :class=\"{ active: showGif }\"\n :title=\"locale.gif\"\n @click=\"showGif = !showGif\"\n >\n <GifIcon />\n </button>\n\n <input\n id=\"wl-image-upload\"\n ref=\"image-uploader\"\n class=\"upload\"\n aria-hidden=\"true\"\n type=\"file\"\n accept=\".png,.jpg,.jpeg,.webp,.bmp,.gif\"\n @change=\"onImageChange\"\n />\n\n <label\n v-if=\"canUploadImage\"\n for=\"wl-image-upload\"\n class=\"wl-action\"\n :title=\"locale.uploadImage\"\n :aria-label=\"locale.uploadImage\"\n >\n <ImageIcon />\n </label>\n\n <button\n type=\"button\"\n class=\"wl-action\"\n :class=\"{ active: showPreview }\"\n :title=\"locale.preview\"\n @click=\"showPreview = !showPreview\"\n >\n <PreviewIcon />\n </button>\n </div>\n\n <div class=\"wl-info\">\n <div class=\"wl-captcha-container\" />\n\n <div class=\"wl-text-number\">\n {{ wordNumber }}\n\n <span v-if=\"config.wordLimit\">\n / \n <span :class=\"{ illegal: !isWordNumberLegal }\" v-text=\"wordLimit\" />\n </span>\n\n {{ locale.word }}\n </div>\n\n <button\n v-if=\"config.login !== 'disable' && !isLogin\"\n type=\"button\"\n class=\"wl-btn\"\n @click=\"onLogin\"\n v-text=\"locale.login\"\n />\n\n <button\n v-if=\"config.login !== 'force' || isLogin\"\n type=\"submit\"\n class=\"primary wl-btn\"\n title=\"Cmd|Ctrl + Enter\"\n :disabled=\"isSubmitting\"\n @click=\"submitComment\"\n >\n <LoadingIcon v-if=\"isSubmitting\" :size=\"16\" />\n\n <template v-else>\n {{ locale.submit }}\n </template>\n </button>\n </div>\n\n <div ref=\"gif-popup\" class=\"wl-gif-popup\" :class=\"{ display: showGif }\">\n <input\n ref=\"gif-search\"\n type=\"text\"\n :placeholder=\"locale.gifSearchPlaceholder\"\n @input=\"onGifSearch\"\n />\n\n <ImageWall\n v-if=\"searchResults.list.length\"\n :items=\"searchResults.list\"\n :column-width=\"200\"\n :gap=\"6\"\n @insert=\"insert($event)\"\n @scroll=\"onImageWallScroll\"\n />\n\n <div v-if=\"searchResults.loading\" class=\"wl-loading\">\n <LoadingIcon :size=\"30\" />\n </div>\n </div>\n\n <div ref=\"emoji-popup\" class=\"wl-emoji-popup\" :class=\"{ display: showEmoji }\">\n <template v-for=\"(emojiItem, index) in emoji.tabs\" :key=\"emojiItem.name\">\n <div v-if=\"index === emojiTabIndex\" class=\"wl-tab-wrapper\" @scroll=\"onEmojiLeave\">\n <button\n v-for=\"key in emojiItem.items\"\n :key=\"key\"\n type=\"button\"\n :title=\"key\"\n @click=\"insert(`:${key}:`)\"\n @mouseenter=\"onEmojiHover($event, key)\"\n @mouseleave=\"onEmojiLeave\"\n >\n <img\n v-if=\"showEmoji\"\n class=\"wl-emoji\"\n :src=\"emoji.map[key]\"\n :alt=\"key\"\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n />\n </button>\n </div>\n </template>\n\n <div>\n <img\n v-if=\"previewEmoji\"\n class=\"wl-emoji-preview\"\n :src=\"emoji.map[previewEmoji]\"\n alt=\"preview\"\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n :style=\"previewStyle\"\n />\n </div>\n\n <div v-if=\"emoji.tabs.length > 1\" class=\"wl-tabs\">\n <button\n v-for=\"(emojiItem, index) in emoji.tabs\"\n :key=\"emojiItem.name\"\n type=\"button\"\n class=\"wl-tab\"\n :class=\"{ active: emojiTabIndex === index }\"\n @click=\"emojiTabIndex = index\"\n >\n <img\n class=\"wl-emoji\"\n :src=\"emojiItem.icon\"\n :alt=\"emojiItem.name\"\n :title=\"emojiItem.name\"\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n />\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <button\n v-if=\"replyId || edit?.objectId\"\n type=\"button\"\n class=\"wl-close\"\n :title=\"locale.cancelReply\"\n @click=\"replyId ? emit('cancelReply') : emit('cancelEdit')\"\n >\n <CloseIcon :size=\"24\" />\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useNow } from '@vueuse/core';\nimport type { WalineComment, WalineCommentStatus } from '@waline/api';\nimport { computed, inject } from 'vue';\n\nimport CommentBox from './CommentBox.vue';\nimport {\n AdministratorIcon,\n DeleteIcon,\n EditIcon,\n LikeIcon,\n ReplyIcon,\n VerifiedIcon,\n} from './Icons.js';\nimport { useLikeStorage, useUserInfo } from '../composables/index.js';\nimport { getTimeAgo, isLinkHttp } from '../utils/index.js';\nimport { configKey } from '../config/index.js';\n\nconst { comment, edit, rootId, reply } = defineProps<{\n /**\n * Comment data\n */\n comment: WalineComment;\n /**\n * Current comment to be edited\n */\n edit?: WalineComment | null;\n /**\n * Root comment id\n */\n rootId: number;\n /**\n * Current comment to be replied\n */\n reply?: WalineComment | null;\n}>();\n\nconst emit = defineEmits<{\n (event: 'log'): void;\n (event: 'submit' | 'delete' | 'like' | 'sticky', comment: WalineComment): void;\n (event: 'edit' | 'reply', comment: WalineComment | null): void;\n (event: 'status', statusInfo: { status: WalineCommentStatus; comment: WalineComment }): void;\n}>();\n\nconst commentStatus: WalineCommentStatus[] = ['approved', 'waiting', 'spam'];\n\n// oxlint-disable-next-line typescript/no-non-null-assertion\nconst config = inject(configKey)!;\nconst likes = useLikeStorage();\nconst now = useNow();\nconst userInfo = useUserInfo();\n\nconst locale = computed(() => config.value.locale);\n\nconst link = computed(() => {\n const { link } = comment;\n\n return link ? (isLinkHttp(link) ? link : `https://${link}`) : '';\n});\n\nconst like = computed(() => likes.value.includes(comment.objectId));\n\nconst time = computed(() => getTimeAgo(new Date(comment.time), now.value, locale.value));\n\nconst isAdmin = computed(() => userInfo.value.type === 'administrator');\n\nconst isOwner = computed(() => comment.user_id && userInfo.value.objectId === comment.user_id);\n\nconst isReplyingCurrent = computed(() => comment.objectId === reply?.objectId);\n\nconst isEditingCurrent = computed(() => comment.objectId === edit?.objectId);\n</script>\n\n<template>\n <div :id=\"comment.objectId.toString()\" class=\"wl-card-item\">\n <div class=\"wl-user\" aria-hidden=\"true\">\n <img v-if=\"comment.avatar\" class=\"wl-user-avatar\" :src=\"comment.avatar\" alt=\"\" />\n\n <VerifiedIcon v-if=\"comment.type === 'guest'\" />\n\n <AdministratorIcon v-if=\"comment.type === 'administrator'\" />\n </div>\n\n <div class=\"wl-card\">\n <div class=\"wl-head\">\n <a\n v-if=\"link\"\n class=\"wl-nick\"\n :href=\"link\"\n target=\"_blank\"\n rel=\"nofollow noopener noreferrer\"\n >{{ comment.nick }}</a\n >\n\n <span v-else class=\"wl-nick\">{{ comment.nick }}</span>\n\n <span v-if=\"comment.label\" class=\"wl-badge\" v-text=\"comment.label\" />\n\n <span v-if=\"comment['sticky']\" class=\"wl-badge\" v-text=\"locale.sticky\" />\n\n <span\n v-if=\"typeof comment.level === 'number'\"\n :class=\"`wl-badge level${comment.level}`\"\n v-text=\"locale[`level${comment.level}`] || `Level ${comment.level}`\"\n />\n\n <span class=\"wl-time\" v-text=\"time\" />\n\n <div class=\"wl-comment-actions\">\n <template v-if=\"isAdmin || isOwner\">\n <button type=\"button\" class=\"wl-edit\" @click=\"emit('edit', comment)\">\n <EditIcon />\n </button>\n\n <button type=\"button\" class=\"wl-delete\" @click=\"emit('delete', comment)\">\n <DeleteIcon />\n </button>\n </template>\n\n <button\n type=\"button\"\n class=\"wl-like\"\n :title=\"like ? locale.cancelLike : locale.like\"\n @click=\"emit('like', comment)\"\n >\n <LikeIcon :active=\"like\" />\n {{ 'like' in comment ? comment.like : '' }}\n </button>\n\n <button\n type=\"button\"\n class=\"wl-reply\"\n :class=\"{ active: isReplyingCurrent }\"\n :title=\"isReplyingCurrent ? locale.cancelReply : locale.reply\"\n @click=\"emit('reply', isReplyingCurrent ? null : comment)\"\n >\n <ReplyIcon />\n </button>\n </div>\n </div>\n\n <div class=\"wl-meta\" aria-hidden=\"true\">\n <template v-for=\"item in ['addr', 'browser', 'os']\">\n <span\n v-if=\"comment[item]\"\n :key=\"item\"\n :class=\"`wl-${item}`\"\n :data-value=\"comment[item]\"\n v-text=\"comment[item]\"\n />\n </template>\n </div>\n\n <div class=\"wl-warning\" aria-hidden=\"true\" v-if=\"comment.status === 'waiting' && !isAdmin\">\n {{ locale.commentUnderReview }}\n </div>\n\n <!-- eslint-disable vue/no-v-html -->\n <div v-if=\"!isEditingCurrent\" class=\"wl-content\">\n <p v-if=\"'reply_user' in comment && comment.reply_user\">\n <a :href=\"'#' + comment.pid\">@{{ comment.reply_user.nick }}</a>\n\n <span>: </span>\n </p>\n\n <div v-html=\"comment.comment\" />\n </div>\n <!-- eslint-enable vue/no-v-html -->\n\n <div v-if=\"isAdmin && !isEditingCurrent\" class=\"wl-admin-actions\">\n <span class=\"wl-comment-status\">\n <button\n v-for=\"status in commentStatus\"\n :key=\"status\"\n type=\"submit\"\n :class=\"`wl-btn wl-${status}`\"\n :disabled=\"comment.status === status\"\n @click=\"emit('status', { status, comment })\"\n v-text=\"locale[status]\"\n />\n </span>\n\n <button\n v-if=\"isAdmin && !('rid' in comment)\"\n type=\"submit\"\n class=\"wl-btn wl-sticky\"\n @click=\"emit('sticky', comment)\"\n >\n {{ comment.sticky ? locale.unsticky : locale.sticky }}\n </button>\n </div>\n\n <div\n v-if=\"isReplyingCurrent || isEditingCurrent\"\n :class=\"{\n 'wl-reply-wrapper': isReplyingCurrent,\n 'wl-edit-wrapper': isEditingCurrent,\n }\"\n >\n <CommentBox\n :edit=\"edit\"\n :reply-id=\"reply?.objectId\"\n :reply-user=\"comment.nick\"\n :root-id=\"rootId\"\n @log=\"emit('log')\"\n @cancel-reply=\"emit('reply', null)\"\n @cancel-edit=\"emit('edit', null)\"\n @submit=\"emit('submit', $event)\"\n />\n </div>\n\n <div v-if=\"'children' in comment\" class=\"wl-quote\">\n <CommentCard\n v-for=\"child in comment.children\"\n :key=\"child.objectId\"\n :comment=\"child\"\n :reply=\"reply\"\n :edit=\"edit\"\n :root-id=\"rootId\"\n @log=\"emit('log')\"\n @delete=\"emit('delete', $event)\"\n @edit=\"emit('edit', $event)\"\n @like=\"emit('like', $event)\"\n @reply=\"emit('reply', $event)\"\n @status=\"emit('status', $event)\"\n @sticky=\"emit('sticky', $event)\"\n @submit=\"emit('submit', $event)\"\n />\n </div>\n </div>\n </div>\n</template>\n","declare const VERSION: string;\n\nexport const version = VERSION;\n","<script setup lang=\"ts\">\n// oxlint-disable import/max-dependencies\n\nimport { useStyleTag, watchImmediate } from '@vueuse/core';\nimport type { WalineComment, WalineCommentStatus, WalineRootComment } from '@waline/api';\nimport { deleteComment, getComment, updateComment } from '@waline/api';\nimport { computed, onMounted, onUnmounted, provide, ref } from 'vue';\n\nimport ArticleReaction from './ArticleReaction.vue';\nimport CommentBox from './CommentBox.vue';\nimport CommentCard from './CommentCard.vue';\nimport { LoadingIcon } from './Icons.js';\nimport { useLikeStorage, useUserInfo } from '../composables/index.js';\nimport type { WalineCommentSorting, WalineProps } from '../typings/index.js';\nimport { getConfig, getDarkStyle } from '../utils/index.js';\nimport { version } from '../version.js';\nimport { configKey, sortingMethods, sortKeyMap } from '../config/index.js';\n\n// oxlint-disable-next-line vue/define-props-destructuring\nconst props = defineProps<WalineProps>();\n\nconst userInfo = useUserInfo();\nconst likeStorage = useLikeStorage();\n\nconst status = ref<'loading' | 'success' | 'error'>('loading');\n\nconst count = ref(0);\nconst page = ref(1);\nconst totalPages = ref(0);\n\nconst config = computed(() => getConfig(props as WalineProps));\n\nconst commentSortingRef = ref(config.value.commentSorting);\n\nconst data = ref<WalineRootComment[]>([]);\nconst reply = ref<WalineComment | null>(null);\nconst edit = ref<WalineComment | null>(null);\n\nconst darkmodeStyle = computed(() => getDarkStyle(config.value.dark));\n\nconst i18n = computed(() => config.value.locale);\n\nuseStyleTag(darkmodeStyle, { id: 'waline-darkmode' });\n\nlet abort: (() => void) | null = null;\n\nconst getCommentData = (pageNumber: number): void => {\n const { serverURL, path, pageSize } = config.value;\n const controller = new AbortController();\n\n status.value = 'loading';\n\n abort?.();\n\n getComment({\n serverURL,\n lang: config.value.lang,\n path,\n pageSize,\n sortBy: sortKeyMap[commentSortingRef.value],\n page: pageNumber,\n signal: controller.signal,\n token: userInfo.value.token,\n })\n .then((resp) => {\n status.value = 'success';\n count.value = resp.count;\n data.value.push(...resp.data);\n page.value = pageNumber;\n totalPages.value = resp.totalPages;\n })\n // oxlint-disable-next-line promise/prefer-await-to-callbacks\n .catch((err: unknown) => {\n if ((err as Error).name !== 'AbortError') {\n // oxlint-disable-next-line no-console\n console.error((err as Error).message);\n status.value = 'error';\n }\n });\n\n abort = controller.abort.bind(controller);\n};\n\nconst loadMore = (): void => {\n getCommentData(page.value + 1);\n};\n\nconst refreshComments = (): void => {\n count.value = 0;\n data.value = [];\n getCommentData(1);\n};\n\nconst onSortByChange = (item: WalineCommentSorting): void => {\n if (commentSortingRef.value !== item) {\n commentSortingRef.value = item;\n refreshComments();\n }\n};\n\nconst onReply = (comment: WalineComment | null): void => {\n reply.value = comment;\n};\n\nconst onEdit = (comment: WalineComment | null): void => {\n edit.value = comment;\n};\n\nconst onSubmit = (comment: WalineComment): void => {\n if (edit.value) {\n edit.value.comment = comment.comment;\n edit.value.orig = comment.orig;\n } else if ('rid' in comment) {\n const repliedComment = data.value.find(({ objectId }) => objectId === comment.rid);\n\n if (!repliedComment) return;\n\n if (!Array.isArray(repliedComment.children)) repliedComment.children = [];\n\n repliedComment.children.push(comment);\n } else {\n data.value.unshift(comment);\n count.value += 1;\n }\n};\n\nconst onStatusChange = async ({\n comment,\n status,\n}: {\n comment: WalineComment;\n status: WalineCommentStatus;\n}): Promise<void> => {\n if (comment.status === status) return;\n\n const { serverURL, lang } = config.value;\n\n await updateComment({\n serverURL,\n lang,\n token: userInfo.value.token,\n objectId: comment.objectId,\n comment: { status },\n });\n\n comment.status = status;\n};\n\nconst onSticky = async (comment: WalineComment): Promise<void> => {\n if ('rid' in comment) return;\n\n const { serverURL, lang } = config.value;\n\n await updateComment({\n serverURL,\n lang,\n token: userInfo.value.token,\n objectId: comment.objectId,\n comment: { sticky: comment.sticky ? 0 : 1 },\n });\n\n comment.sticky = !comment.sticky;\n};\n\nconst onDelete = async ({ objectId }: WalineComment): Promise<void> => {\n if (!confirm('Are you sure you want to delete this comment?')) return;\n\n const { serverURL, lang } = config.value;\n\n await deleteComment({\n serverURL,\n lang,\n token: userInfo.value.token,\n objectId,\n });\n\n // delete comment from data\n data.value.some((item, index) => {\n if (item.objectId === objectId) {\n data.value = data.value.filter((_item, i) => i !== index);\n\n return true;\n }\n\n return item.children.some((child, childIndex) => {\n if (child.objectId === objectId) {\n data.value[index].children = item.children.filter((_item, i) => i !== childIndex);\n\n return true;\n }\n\n return false;\n });\n });\n};\n\nconst onLike = async (comment: WalineComment): Promise<void> => {\n const { serverURL, lang } = config.value;\n const { objectId } = comment;\n const hasLiked = likeStorage.value.includes(objectId);\n\n await updateComment({\n serverURL,\n lang,\n objectId,\n token: userInfo.value.token,\n comment: { like: !hasLiked },\n });\n\n if (hasLiked) likeStorage.value = likeStorage.value.filter((id) => id !== objectId);\n else {\n likeStorage.value = [...likeStorage.value, objectId];\n\n if (likeStorage.value.length > 50) likeStorage.value = likeStorage.value.slice(-50);\n }\n\n comment.like = Math.max(0, (comment.like || 0) + (hasLiked ? -1 : 1));\n};\n\nprovide(configKey, config);\n\nonMounted(() => {\n watchImmediate(\n () => [props.serverURL, props.path],\n () => {\n refreshComments();\n },\n );\n});\nonUnmounted(() => {\n abort?.();\n});\n</script>\n\n<template>\n <div data-waline>\n <ArticleReaction />\n\n <CommentBox v-if=\"!reply && !edit\" @log=\"refreshComments\" @submit=\"onSubmit\" />\n\n <div class=\"wl-meta-head\">\n <div class=\"wl-count\">\n <span v-if=\"count\" class=\"wl-num\" v-text=\"count\" />\n {{ i18n.comment }}\n </div>\n\n <ul class=\"wl-sort\">\n <li\n v-for=\"item in sortingMethods\"\n :key=\"item\"\n :class=\"[item === commentSortingRef ? 'active' : '']\"\n @click=\"onSortByChange(item)\"\n >\n {{ i18n[item] }}\n </li>\n </ul>\n </div>\n\n <div class=\"wl-cards\">\n <CommentCard\n v-for=\"comment in data\"\n :key=\"comment.objectId\"\n :root-id=\"comment.objectId\"\n :comment=\"comment\"\n :reply=\"reply\"\n :edit=\"edit\"\n @log=\"refreshComments\"\n @reply=\"onReply\"\n @edit=\"onEdit\"\n @submit=\"onSubmit\"\n @status=\"onStatusChange\"\n @delete=\"onDelete\"\n @sticky=\"onSticky\"\n @like=\"onLike\"\n />\n </div>\n\n <div v-if=\"status === 'error'\" class=\"wl-operation\">\n <button type=\"button\" class=\"wl-btn\" @click=\"refreshComments\" v-text=\"i18n.refresh\" />\n </div>\n\n <div v-else-if=\"status === 'loading'\" class=\"wl-loading\">\n <LoadingIcon :size=\"30\" />\n </div>\n\n <div v-else-if=\"!data.length\" class=\"wl-empty\" v-text=\"i18n.sofa\" />\n\n <!-- Load more button -->\n <div v-else-if=\"page < totalPages\" class=\"wl-operation\">\n <button type=\"button\" class=\"wl-btn\" @click=\"loadMore\" v-text=\"i18n.more\" />\n </div>\n\n <!-- Copyright Information -->\n <div v-if=\"!config.noCopyright\" class=\"wl-power\">\n Powered by\n <a href=\"https://github.com/walinejs/waline\" target=\"_blank\" rel=\"noopener noreferrer\">\n Waline\n </a>\n v{{ version }}\n </div>\n </div>\n</template>\n"],"names":["CloseIcon","size","h","DeleteIcon","EmojiIcon","ImageIcon","LikeIcon","active","PreviewIcon","MarkdownIcon","ReplyIcon","EditIcon","VerifiedIcon","AdministratorIcon","LoadingIcon","GifIcon","useUserMeta","useStorage","useEditor","LIKE_KEY","likeStorage","useLikeStorage","REACTION_KEY","reactionStorage","useReactionStorage","recaptchaStore","useReCaptcha","key","init","load","action","instance","useTurnstile","useScriptTag","turnstile","resolve","USER_KEY","userInfoStorage","useUserInfo","AVAILABLE_META","getMeta","meta","item","DEFAULT_EMOJI","DEFAULT_REACTION","defaultUploadImage","file","reject","reader","defaultTeXRenderer","blockMode","getDefaultSearchOptions","lang","fetchGiphy","url","params","resp","data","gif","word","offset","WORD_REGEXP","LEFT_ANGLE_REGEXP","LINE_COMMENT_REGEXP","BLOCK_COMMENT_REGEXP","REGEXP","COLORS","cache","defaultHighlighter","input","index","_match","comment","color","out","localeKeys","generateLocale","locale","f","r$1","t","e$1","i$2","m","L","p$1","s","n","c$1","DEFAULT_LANG","DEFAULT_LOCALES","zhCN","zhTW","en","fr","it","jp","ptBR","ru","viVN","de","es","getLocale","getLang","sortKeyMap","sortingMethods","configKey","config","inject","votingIndex","ref","voteNumbers","computed","reaction","reactionsInfo","path","_a","icon","abort","fetchReaction","serverURL","controller","reactionData","getArticleCounter","_","vote","currentVoteItemIndex","updateArticleCounter","onMounted","watchImmediate","onUnmounted","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_toDisplayString","_hoisted_3","_Fragment","_renderList","desc","_normalizeClass","$event","_hoisted_5","_createBlock","_unref","resizeObserver","wall","useTemplateRef","state","columns","getColumnCount","count","__props","createColumns","fillColumns","itemIndex","nextTick","target","prev","curr","redraw","force","scrollY","imageLoad","event","watch","onBeforeUnmount","column","columnIndex","$emit","decodePath","removeEndingSplash","content","isLinkHttp","link","getServerURL","result","getWordLimit","wordLimit","fallback","value","getConfig","requiredMeta","dark","pageSize","noCopyright","login","recaptchaV3Key","turnstileKey","commentSorting","emoji","imageUploader","highlighter","texRenderer","search","more","isString","val","DARK_VARIABLES","getDarkStyle","selector","padWithZeros","vNumber","width","numAsString","dateFormat","date","vDay","vMonth","getTimeAgo","now","time","timePassed","days","leave1","hours","leave2","minutes","leave3","EMAIL_REG_EXP","isValidEmail","email","EMOJI_STORE_KEY","emojiStore","checkVersionAnnotation","fetchEmoji","containsVersion","info","emojiInfo","getLink","name","folder","prefix","type","getEmojisInfo","emojis","emojiInfos","emojisConfig","items","getImageFromDataTransfer","image","inlineMathStart","inlineMathReg","blockMathReg","markedTeXExtensions","src","cap","parseEmoji","text","emojiMap","placeholder","parseMarkdown","marked","Marked","markedHighlight","extensions","getWords","getChinese","getWordNumber","_b","accumulator","userAgent","userAgentData","ua","platformVersion","props","emit","__emit","editor","userMeta","userInfo","inputRefs","textAreaRef","imageUploaderRef","emojiButtonRef","emojiPopupRef","gifButtonRef","gifPopupRef","gifSearchRef","emojiTabIndex","showEmoji","previewEmoji","previewStyle","leaveTimer","onEmojiHover","popup","targetRect","popupRect","onEmojiLeave","showGif","showPreview","previewText","wordNumber","searchResults","reactive","isWordNumberLegal","isSubmitting","isImageListEnd","isLogin","canUploadImage","insert","textArea","startPosition","endPosition","scrollTop","onEditorKeyDown","ctrlKey","metaKey","submitComment","uploadImage","uploadText","err","onEditorDrop","onEditorPaste","onImageChange","inputElement","options","response","updateComment","addComment","onLogin","onLogout","onProfile","height","left","top","query","handler","popupHandler","_c","_d","onImageWallScroll","clientHeight","scrollHeight","percent","searchOptions","keyword","onGifSearch","useDebounceFn","useEventListener","store","limit","autosize","emojiConfig","_hoisted_2","_createVNode","_hoisted_7","kind","element","_vModelDynamic","_withDirectives","_hoisted_11","_hoisted_13","_hoisted_14","_hoisted_15","_cache","_hoisted_20","_hoisted_21","_createTextVNode","_hoisted_22","args","ImageWall","_hoisted_27","emojiItem","_hoisted_31","commentStatus","likes","useNow","like","isAdmin","isOwner","isReplyingCurrent","isEditingCurrent","_hoisted_4","_hoisted_6","_hoisted_12","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_23","status","CommentBox","_hoisted_25","child","_component_CommentCard","version","page","totalPages","commentSortingRef","reply","edit","darkmodeStyle","i18n","useStyleTag","getCommentData","pageNumber","getComment","loadMore","refreshComments","onSortByChange","onReply","onEdit","onSubmit","repliedComment","objectId","onStatusChange","onSticky","onDelete","deleteComment","_item","i","childIndex","onLike","hasLiked","id","provide","ArticleReaction","CommentCard","_hoisted_8","_hoisted_10"],"mappings":"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BACF,EAEaC,EAAkBC,GAC7B,OAAO,YACLA,EAAO,IAAI,CAACnC,EAAM4B,IAAU,CAACK,GAAWL,CAAK,EAAG5B,CAAI,CAAC,CACvD,ECtDF,IAAAoC,GAAeF,EAAe,CAC5B,eACA,4DACA,SACA,4CACA,WACA,WACA,2BACA,yBACA,SACA,cACA,yBACA,YACA,oBACA,aACA,gBACA,gBACA,WACA,QACA,qBACA,uBACA,sBACA,sBACA,oBACA,cACA,kBACA,WACA,WACA,QACA,aACA,SACA,4FACA,SACA,SACA,UACA,OACA,SACA,QACA,QACA,MACA,wBACA,SACA,YACA,aACA,OACA,QACA,UACA,UACA,kBACA,kBACA,uHACF,CAAC,ECrDDG,GAAeH,EAAe,CAC5B,WACA,wCACA,SACA,qCACA,UACA,WACA,kBACA,kBACA,SACA,OACA,cACA,QACA,eACA,WACA,UACA,eACA,UACA,QACA,eACA,cACA,cACA,YACA,WACA,WACA,YACA,QACA,SACA,QACA,SACA,QACA;AAAA,0BACA,YACA,UACA,UACA,OACA,UACA,QACA,QACA,MACA,aACA,UACA,WACA,UACA,OACA,WACA,SACA,SACA,UACA,qBACA,gHACF,CAAC,ECnDDI,GAAeJ,EAAe,CAC5B,oBACA,wDACA,qBACA,yDACA,YACA,WACA,kBACA,2BACA,SACA,OACA,cACA,YACA,mBACA,cACA,WACA,gBACA,gBACA,QACA,eACA,iBACA,gBACA,cACA,aACA,cACA,WACA,iBACA,gBACA,QACA,SACA,WACA;AAAA,mCACA,UACA,SACA,UACA,OACA,QACA,QACA,QACA,MACA,aACA,SACA,WACA,YACA,OACA,WACA,eACA,gBACA,aACA,gBACA,2HACF,CAAC,ECjDDK,GAAeL,EAAe,CAC5B,SACA,iDACA,SACA,2CACA,WACA,YACA,mBACA,oCACA,UACA,SACA,oBACA,WACA,qBACA,eACA,aACA,kBACA,SACA,QACA,wBACA,2BACA,0BACA,yBACA,wBACA,cACA,0BACA,YACA,cACA,QACA,UACA,OACA;AAAA,6BACA,UACA,QACA,UACA,OACA,QACA,QACA,QACA,MACA,oBACA,SACA,WACA,aACA,cACA,WACA,iBACA,UACA,oBACA,sBACA,wIACF,CAAC,EClDDM,GAAeN,EAAe,CAC5B,WACA,iDACA,SACA,+CACA,WACA,cACA,wBACA,0BACA,QACA,WACA,mBACA,WACA,mBACA,WACA,WACA,kBACA,YACA,QACA,kBACA,aACA,YACA,SACA,YACA,SACA,0BACA,SACA,OACA,QACA,cACA,SACA;AAAA,+BACA,UACA,OACA,SACA,MACA,OACA,OACA,QACA,MACA,YACA,UACA,YACA,YACA,OACA,mBACA,aACA,cACA,eACA,iBACA,8HACF,CAAC,ECtDDO,GAAeP,EAAe,CAC5B,SACA,yBACA,UACA,mBACA,MACA,QACA,UACA,aACA,OACA,OACA,cACA,OACA,QACA,OACA,KACA,UACA,QACA,MACA,YACA,KACA,KACA,MACA,KACA,OACA,SACA,SACA,QACA,MACA,SACA,MACA;AAAA,cACA,KACA,OACA,OACA,OACA,SACA,KACA,MACA,MACA,SACA,OACA,OACA,QACA,MACA,SACA,KACA,KACA,MACA,WACA,6CACF,CAAC,ECnDDQ,GAAeR,EAAe,CAC5B,UACA,0CACA,SACA,8CACA,UACA,WACA,kBACA,4BACA,SACA,OACA,cACA,YACA,oBACA,cACA,YACA,mBACA,aACA,QACA,gBACA,iBACA,gBACA,cACA,aACA,cACA,WACA,SACA,OACA,QACA,SACA,WACA;AAAA,gCACA,UACA,UACA,UACA,OACA,UACA,QACA,QACA,MACA,gBACA,qBACA,WACA,SACA,OACA,WACA,aACA,gBACA,cACA,mBACA,4HACF,CAAC,ECnDDS,GAAeT,EAAe,CAC5B,YACA,uCACA,YACA,yDACA,WACA,iBACA,uBACA,yBACA,YACA,OACA,cACA,WACA,iBACA,cACA,WACA,oBACA,SACA,SACA,wBACA,eACA,wBACA,wBACA,aACA,eACA,WACA,iBACA,mBACA,QACA,SACA,QACA;AAAA,0BACA,YACA,UACA,UACA,OACA,UACA,QACA,QACA,MACA,YACA,sBACA,aACA,YACA,OACA,WACA,eACA,YACA,gBACA,kBACA,0HACF,CAAC,ECnDDU,GAAeV,EAAe,CAC5B,MACA,kCACA,SACA,2CACA,UACA,WACA,4BACA,oBACA,MACA,QACA,WACA,UACA,SACA,YACA,UACA,cACA,YACA,QACA,mBACA,aACA,aACA,YACA,aACA,WACA,eACA,YACA,YACA,gBACA,OACA,KACA;AAAA,qBACA,UACA,YACA,eACA,YACA,UACA,WACA,QACA,UACA,mBACA,oBACA,oBACA,eACA,UACA,aACA,eACA,YACA,YACA,qBACA,gHACF,CAAC,ECnDDW,GAAeX,EAAe,CAC5B,KACA,aACA,KACA,aACA,KACA,KACA,OACA,SACA,KACA,KACA,OACA,KACA,OACA,KACA,KACA,UACA,KACA,KACA,OACA,KACA,MACA,MACA,KACA,KACA,OACA,KACA,KACA,KACA,KACA,IACA;AAAA,SACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,QACA,OACA,KACA,MACA,KACA,OACA,MACA,MACA,MACA,cACA,4BACF,CAAC,ECnDDY,GAAeZ,EAAe,CAC5B,KACA,aACA,KACA,aACA,KACA,KACA,OACA,SACA,KACA,KACA,OACA,KACA,OACA,KACA,KACA,UACA,KACA,KACA,OACA,KACA,MACA,MACA,KACA,KACA,OACA,KACA,KACA,MACA,KACA,IACA;AAAA,SACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,QACA,OACA,KACA,MACA,KACA,OACA,KACA,KACA,KACA,cACA,8BACF,CAAC,ECtCM,MAAMa,GAAe,QAEfC,GAA2B,CACtC,GAAIC,GACJ,QAASA,GACT,QAASC,GACT,GAAAC,GACA,QAASA,GACT,GAAAC,GACA,QAASA,GACT,GAAAC,GACA,QAASA,GACT,GAAAC,GACA,QAASA,GACT,QAASC,GACT,GAAAC,GACA,QAASA,GACT,GAAIC,GACJ,QAASA,GACT,GAAAC,GACA,GAAAC,GACA,QAASA,EACX,EAE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"}
|