artalk 2.7.0 → 2.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/README.md +1 -1
  2. package/dist/Artalk.css +1 -1
  3. package/dist/Artalk.es.js +209 -188
  4. package/dist/Artalk.es.js.map +1 -0
  5. package/dist/Artalk.iife.js +2 -1
  6. package/dist/Artalk.iife.js.map +1 -0
  7. package/dist/Artalk.js +2 -1
  8. package/dist/Artalk.js.map +1 -0
  9. package/dist/ArtalkLite.css +1 -1
  10. package/dist/ArtalkLite.es.js +209 -188
  11. package/dist/ArtalkLite.es.js.map +1 -0
  12. package/dist/ArtalkLite.iife.js +2 -1
  13. package/dist/ArtalkLite.iife.js.map +1 -0
  14. package/dist/ArtalkLite.js +2 -1
  15. package/dist/ArtalkLite.js.map +1 -0
  16. package/dist/i18n/jp.js +1 -1
  17. package/dist/i18n/zh-TW.js +1 -1
  18. package/dist/src/api/_base.d.ts +7 -0
  19. package/dist/src/api/_options.d.ts +5 -0
  20. package/dist/src/artalk.d.ts +0 -2
  21. package/dist/src/components/checker/index.d.ts +2 -0
  22. package/dist/src/i18n/en.d.ts +4 -0
  23. package/dist/src/i18n/external.d.ts +4 -0
  24. package/dist/src/i18n/index.d.ts +12 -0
  25. package/dist/src/i18n/jp.d.ts +4 -0
  26. package/dist/src/i18n/zh-TW.d.ts +4 -0
  27. package/dist/src/lib/user.d.ts +8 -6
  28. package/dist/src/main.d.ts +3 -0
  29. package/dist/src/plugins/editor/_kit.d.ts +7 -1
  30. package/dist/src/service.d.ts +2 -8
  31. package/dist/types/event.d.ts +1 -1
  32. package/package.json +43 -17
  33. package/dist/src/components/dark-mode.d.ts +0 -2
  34. package/src/api/_base.ts +0 -18
  35. package/src/api/_options.ts +0 -25
  36. package/src/api/_request.ts +0 -104
  37. package/src/api/admin.ts +0 -18
  38. package/src/api/captcha.ts +0 -24
  39. package/src/api/comment.ts +0 -84
  40. package/src/api/index.ts +0 -29
  41. package/src/api/page.ts +0 -83
  42. package/src/api/site.ts +0 -51
  43. package/src/api/system.ts +0 -49
  44. package/src/api/upload.ts +0 -28
  45. package/src/api/user.ts +0 -132
  46. package/src/artalk.ts +0 -119
  47. package/src/comment/actions.ts +0 -83
  48. package/src/comment/comment.html +0 -18
  49. package/src/comment/comment.ts +0 -192
  50. package/src/comment/height-limit.ts +0 -100
  51. package/src/comment/index.ts +0 -3
  52. package/src/comment/render.ts +0 -150
  53. package/src/comment/renders/actions.ts +0 -114
  54. package/src/comment/renders/avatar.ts +0 -22
  55. package/src/comment/renders/content.ts +0 -39
  56. package/src/comment/renders/header.ts +0 -84
  57. package/src/comment/renders/index.ts +0 -19
  58. package/src/comment/renders/pending.ts +0 -12
  59. package/src/comment/renders/reply-at.ts +0 -16
  60. package/src/comment/renders/reply-to.ts +0 -24
  61. package/src/components/action-btn.ts +0 -170
  62. package/src/components/checker/admin.ts +0 -37
  63. package/src/components/checker/captcha-renders.ts +0 -69
  64. package/src/components/checker/captcha.ts +0 -26
  65. package/src/components/checker/index.ts +0 -192
  66. package/src/components/dark-mode.ts +0 -30
  67. package/src/components/dialog.ts +0 -62
  68. package/src/components/error-dialog.ts +0 -35
  69. package/src/components/pagination.ts +0 -153
  70. package/src/components/read-more-btn.ts +0 -92
  71. package/src/config.ts +0 -119
  72. package/src/context.ts +0 -146
  73. package/src/data.ts +0 -110
  74. package/src/defaults.ts +0 -61
  75. package/src/editor/editor.html +0 -18
  76. package/src/editor/editor.ts +0 -114
  77. package/src/editor/state.ts +0 -52
  78. package/src/editor/ui.ts +0 -36
  79. package/src/i18n/en.ts +0 -81
  80. package/src/i18n/external.ts +0 -10
  81. package/src/i18n/index.ts +0 -67
  82. package/src/i18n/jp.ts +0 -83
  83. package/src/i18n/zh-CN.ts +0 -85
  84. package/src/i18n/zh-TW.ts +0 -83
  85. package/src/layer/index.ts +0 -4
  86. package/src/layer/layer-manager.ts +0 -32
  87. package/src/layer/layer.ts +0 -39
  88. package/src/layer/scrollbar-helper.ts +0 -24
  89. package/src/layer/sidebar-layer.html +0 -8
  90. package/src/layer/sidebar-layer.ts +0 -155
  91. package/src/layer/wrap.ts +0 -77
  92. package/src/lib/component.ts +0 -12
  93. package/src/lib/detect.ts +0 -222
  94. package/src/lib/event-manager.ts +0 -47
  95. package/src/lib/highlight.ts +0 -5
  96. package/src/lib/marked-renderer.ts +0 -32
  97. package/src/lib/marked.ts +0 -72
  98. package/src/lib/sanitizer.ts +0 -57
  99. package/src/lib/ui.ts +0 -193
  100. package/src/lib/user.ts +0 -55
  101. package/src/lib/utils.ts +0 -236
  102. package/src/list/comment.ts +0 -20
  103. package/src/list/layout.ts +0 -120
  104. package/src/list/list.html +0 -20
  105. package/src/list/list.ts +0 -79
  106. package/src/list/nest.ts +0 -66
  107. package/src/list/page.ts +0 -97
  108. package/src/list/paginator/index.ts +0 -25
  109. package/src/list/paginator/read-more.ts +0 -67
  110. package/src/list/paginator/up-down.ts +0 -51
  111. package/src/main.ts +0 -5
  112. package/src/plugins/admin-only-elem.ts +0 -40
  113. package/src/plugins/conf-remoter.ts +0 -54
  114. package/src/plugins/dark-mode.ts +0 -12
  115. package/src/plugins/editor/_kit.ts +0 -57
  116. package/src/plugins/editor/_plug.ts +0 -60
  117. package/src/plugins/editor/_sample.ts +0 -8
  118. package/src/plugins/editor/closable.ts +0 -44
  119. package/src/plugins/editor/emoticons.scss +0 -72
  120. package/src/plugins/editor/emoticons.ts +0 -293
  121. package/src/plugins/editor/header-event.ts +0 -35
  122. package/src/plugins/editor/header-link.ts +0 -31
  123. package/src/plugins/editor/header-user.ts +0 -98
  124. package/src/plugins/editor/index.ts +0 -40
  125. package/src/plugins/editor/local-storage.ts +0 -36
  126. package/src/plugins/editor/mover.ts +0 -29
  127. package/src/plugins/editor/preview.scss +0 -7
  128. package/src/plugins/editor/preview.ts +0 -41
  129. package/src/plugins/editor/state-edit.ts +0 -116
  130. package/src/plugins/editor/state-reply.ts +0 -91
  131. package/src/plugins/editor/submit-add.ts +0 -33
  132. package/src/plugins/editor/submit-btn.ts +0 -25
  133. package/src/plugins/editor/submit.ts +0 -73
  134. package/src/plugins/editor/textarea.ts +0 -55
  135. package/src/plugins/editor/upload.ts +0 -145
  136. package/src/plugins/editor-kit.ts +0 -161
  137. package/src/plugins/index.ts +0 -16
  138. package/src/plugins/list/copyright.ts +0 -16
  139. package/src/plugins/list/count.ts +0 -31
  140. package/src/plugins/list/dropdown.ts +0 -95
  141. package/src/plugins/list/error-dialog.ts +0 -22
  142. package/src/plugins/list/fetch.ts +0 -64
  143. package/src/plugins/list/goto-first.ts +0 -23
  144. package/src/plugins/list/goto.ts +0 -72
  145. package/src/plugins/list/index.ts +0 -25
  146. package/src/plugins/list/loading.ts +0 -17
  147. package/src/plugins/list/no-comment.ts +0 -25
  148. package/src/plugins/list/reach-bottom.ts +0 -46
  149. package/src/plugins/list/sidebar-btn.ts +0 -39
  150. package/src/plugins/list/time-ticking.ts +0 -22
  151. package/src/plugins/list/unread-badge.ts +0 -26
  152. package/src/plugins/list/unread.ts +0 -38
  153. package/src/plugins/list/with-editor.ts +0 -59
  154. package/src/plugins/markdown.ts +0 -10
  155. package/src/plugins/stat.ts +0 -79
  156. package/src/plugins/version-check.ts +0 -37
  157. package/src/service.ts +0 -91
  158. package/src/style/_color.scss +0 -41
  159. package/src/style/_extend.scss +0 -20
  160. package/src/style/_variables.scss +0 -3
  161. package/src/style/comment.scss +0 -360
  162. package/src/style/editor.scss +0 -194
  163. package/src/style/list.scss +0 -212
  164. package/src/style/main.scss +0 -486
  165. package/src/style/pagination.scss +0 -58
  166. package/src/style/sidebar-layer.scss +0 -92
  167. package/types/config.ts +0 -153
  168. package/types/context.ts +0 -84
  169. package/types/data.ts +0 -271
  170. package/types/editor.ts +0 -95
  171. package/types/event.ts +0 -40
  172. package/types/global.d.ts +0 -1
  173. package/types/index.ts +0 -7
  174. package/types/plugin.ts +0 -3
  175. package/types/sidebar.ts +0 -3
@@ -42,7 +42,6 @@ var __async = (__this, __arguments, generator) => {
42
42
  });
43
43
  };
44
44
  import { marked as marked$1 } from "marked";
45
- const main = "";
46
45
  function createElement(htmlStr = "") {
47
46
  const div = document.createElement("div");
48
47
  div.innerHTML = htmlStr.trim();
@@ -552,13 +551,13 @@ function getDefaultExportFromCjs(x) {
552
551
  }
553
552
  var Request = NativeRequest;
554
553
  if (Request && !Request.prototype.hasOwnProperty("signal") || __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
555
- Request = function Request2(input, init) {
554
+ Request = function Request2(input, init2) {
556
555
  var signal;
557
- if (init && init.signal) {
558
- signal = init.signal;
559
- delete init.signal;
556
+ if (init2 && init2.signal) {
557
+ signal = init2.signal;
558
+ delete init2.signal;
560
559
  }
561
- var request = new NativeRequest(input, init);
560
+ var request = new NativeRequest(input, init2);
562
561
  if (signal) {
563
562
  Object.defineProperty(request, "signal", {
564
563
  writable: false,
@@ -572,8 +571,8 @@ function getDefaultExportFromCjs(x) {
572
571
  Request.prototype = NativeRequest.prototype;
573
572
  }
574
573
  var realFetch = fetch2;
575
- var abortableFetch = function abortableFetch2(input, init) {
576
- var signal = Request && Request.prototype.isPrototypeOf(input) ? input.signal : init ? init.signal : void 0;
574
+ var abortableFetch = function abortableFetch2(input, init2) {
575
+ var signal = Request && Request.prototype.isPrototypeOf(input) ? input.signal : init2 ? init2.signal : void 0;
577
576
  if (signal) {
578
577
  var abortError;
579
578
  try {
@@ -592,12 +591,12 @@ function getDefaultExportFromCjs(x) {
592
591
  once: true
593
592
  });
594
593
  });
595
- if (init && init.signal) {
596
- delete init.signal;
594
+ if (init2 && init2.signal) {
595
+ delete init2.signal;
597
596
  }
598
- return Promise.race([cancellation, realFetch(input, init)]);
597
+ return Promise.race([cancellation, realFetch(input, init2)]);
599
598
  }
600
- return realFetch(input, init);
599
+ return realFetch(input, init2);
601
600
  };
602
601
  return {
603
602
  fetch: abortableFetch,
@@ -629,48 +628,6 @@ function getDefaultExportFromCjs(x) {
629
628
  });
630
629
  })(typeof self !== "undefined" ? self : commonjsGlobal);
631
630
  });
632
- const LOCAL_USER_KEY = "ArtalkUser";
633
- class User {
634
- constructor() {
635
- __publicField(this, "data");
636
- __publicField(this, "onUserChanged", null);
637
- const localUser = JSON.parse(window.localStorage.getItem(LOCAL_USER_KEY) || "{}");
638
- this.data = {
639
- nick: localUser.nick || "",
640
- email: localUser.email || "",
641
- link: localUser.link || "",
642
- token: localUser.token || "",
643
- isAdmin: localUser.isAdmin || false
644
- };
645
- }
646
- /** 保存用户到 localStorage 中 */
647
- update(obj = {}) {
648
- Object.entries(obj).forEach(([key, value]) => {
649
- this.data[key] = value;
650
- });
651
- window.localStorage.setItem(LOCAL_USER_KEY, JSON.stringify(this.data));
652
- this.onUserChanged && this.onUserChanged(this.data);
653
- }
654
- setOnUserChanged(fn) {
655
- this.onUserChanged = fn;
656
- }
657
- /**
658
- * Logout
659
- *
660
- * @description Logout will clear login status, but not clear user data (nick, email, link)
661
- */
662
- logout() {
663
- this.update({
664
- token: "",
665
- isAdmin: false
666
- });
667
- }
668
- /** 是否已填写基本用户信息 */
669
- checkHasBasicUserInfo() {
670
- return !!this.data.nick && !!this.data.email;
671
- }
672
- }
673
- const UserInstance = new User();
674
631
  const en = {
675
632
  /* Editor */
676
633
  placeholder: "Leave a comment",
@@ -744,7 +701,11 @@ const en = {
744
701
  deleting: "Deleting",
745
702
  deleteFail: "Delete Failed",
746
703
  reqGot: "Request got",
747
- reqAborted: "Request timed out or terminated unexpectedly"
704
+ reqAborted: "Request timed out or terminated unexpectedly",
705
+ updateMsg: "Please update Artalk {name} to get the full experience",
706
+ currentVersion: "Current Version",
707
+ ignore: "Ignore",
708
+ open: "Open"
748
709
  };
749
710
  const zhCN = {
750
711
  /* Editor */
@@ -819,7 +780,11 @@ const zhCN = {
819
780
  deleting: "删除中",
820
781
  deleteFail: "删除失败",
821
782
  reqGot: "请求响应",
822
- reqAborted: "请求超时或意外终止"
783
+ reqAborted: "请求超时或意外终止",
784
+ updateMsg: "请更新 Artalk {name} 以获得完整体验",
785
+ currentVersion: "当前版本",
786
+ ignore: "忽略",
787
+ open: "打开"
823
788
  };
824
789
  const GLOBAL_LOCALES_KEY = "ArtalkI18n";
825
790
  const internal = {
@@ -853,15 +818,15 @@ function t(key, args = {}) {
853
818
  str = str.replace(/\{\s*(\w+?)\s*\}/g, (_, token) => args[token] || "");
854
819
  return str;
855
820
  }
856
- function Fetch$1(opts, input, init, timeout) {
821
+ function Fetch$1(opts, input, init2, timeout) {
857
822
  return __async(this, null, function* () {
858
823
  var _a, _b;
859
- if (UserInstance.data.token) {
860
- const headers = new Headers(init.headers);
861
- headers.set("Authorization", `Bearer ${UserInstance.data.token}`);
862
- init.headers = headers;
824
+ if (opts.apiToken) {
825
+ const headers = new Headers(init2.headers);
826
+ headers.set("Authorization", `Bearer ${opts.apiToken}`);
827
+ init2.headers = headers;
863
828
  }
864
- const resp = yield timeoutFetch(input, timeout || opts.timeout || 15e3, init);
829
+ const resp = yield timeoutFetch(input, timeout || opts.timeout || 15e3, init2);
865
830
  const respHttpCode = resp.status;
866
831
  const noAccessCodes = [401, 400];
867
832
  const isNoAccess = noAccessCodes.includes(respHttpCode);
@@ -869,7 +834,7 @@ function Fetch$1(opts, input, init, timeout) {
869
834
  throw new Error(`${t("reqGot")} ${respHttpCode}`);
870
835
  let json = yield resp.json();
871
836
  const recall = (resolve, reject) => {
872
- Fetch$1(opts, input, init).then((d) => {
837
+ Fetch$1(opts, input, init2).then((d) => {
873
838
  resolve(d);
874
839
  }).catch((e) => {
875
840
  reject(e);
@@ -906,12 +871,12 @@ function Fetch$1(opts, input, init, timeout) {
906
871
  }
907
872
  function POST(opts, url, data) {
908
873
  return __async(this, null, function* () {
909
- const init = {
874
+ const init2 = {
910
875
  method: "POST"
911
876
  };
912
877
  data = __spreadValues({ site_name: opts.siteName || "" }, data || {});
913
- init.body = ToFormData(data);
914
- const json = yield Fetch$1(opts, url, init);
878
+ init2.body = ToFormData(data);
879
+ const json = yield Fetch$1(opts, url, init2);
915
880
  return json.data || {};
916
881
  });
917
882
  }
@@ -945,11 +910,25 @@ class ApiBase {
945
910
  return POST(this.options, this.options.baseURL + path, data);
946
911
  });
947
912
  }
948
- Fetch(path, init, timeout) {
913
+ Fetch(path, init2, timeout) {
949
914
  return __async(this, null, function* () {
950
- return Fetch$1(this.options, this.options.baseURL + path, init, timeout);
915
+ return Fetch$1(this.options, this.options.baseURL + path, init2, timeout);
951
916
  });
952
917
  }
918
+ /**
919
+ * Carry user info to request params
920
+ *
921
+ * @param params Request params
922
+ * @returns Request params with user info
923
+ */
924
+ withUserInfo(params) {
925
+ const user = this.options.userInfo;
926
+ if (user == null ? void 0 : user.name)
927
+ params.name = user.name;
928
+ if (user == null ? void 0 : user.email)
929
+ params.email = user.email;
930
+ return params;
931
+ }
953
932
  }
954
933
  class CommentApi extends ApiBase {
955
934
  /** 评论 · 获取 */
@@ -962,10 +941,7 @@ class CommentApi extends ApiBase {
962
941
  };
963
942
  if (flatMode)
964
943
  params.flat_mode = flatMode;
965
- if (UserInstance.checkHasBasicUserInfo()) {
966
- params.name = UserInstance.data.nick;
967
- params.email = UserInstance.data.email;
968
- }
944
+ this.withUserInfo(params);
969
945
  if (paramsEditor)
970
946
  paramsEditor(params);
971
947
  return this.POST("/get", params);
@@ -1014,10 +990,7 @@ class CommentApi extends ApiBase {
1014
990
  target_id: targetID,
1015
991
  type
1016
992
  };
1017
- if (UserInstance.checkHasBasicUserInfo()) {
1018
- params.name = UserInstance.data.nick;
1019
- params.email = UserInstance.data.email;
1020
- }
993
+ this.withUserInfo(params);
1021
994
  const data = yield this.POST("/vote", params);
1022
995
  return data;
1023
996
  });
@@ -1186,10 +1159,7 @@ class UserApi extends ApiBase {
1186
1159
  /** 用户 · 登录状态 */
1187
1160
  loginStatus() {
1188
1161
  return __async(this, null, function* () {
1189
- const data = yield this.POST("/login-status", {
1190
- name: UserInstance.data.nick,
1191
- email: UserInstance.data.email
1192
- });
1162
+ const data = yield this.POST("/login-status", this.withUserInfo({}));
1193
1163
  return data || { is_login: false, is_admin: false };
1194
1164
  });
1195
1165
  }
@@ -1209,8 +1179,7 @@ class UserApi extends ApiBase {
1209
1179
  delete params.comment_id;
1210
1180
  delete params.notify_key;
1211
1181
  params.read_all = true;
1212
- params.name = UserInstance.data.nick;
1213
- params.email = UserInstance.data.email;
1182
+ this.withUserInfo(params);
1214
1183
  }
1215
1184
  return this.POST(`/mark-read`, params);
1216
1185
  }
@@ -1347,17 +1316,16 @@ class UploadApi extends ApiBase {
1347
1316
  imgUpload(file) {
1348
1317
  return __async(this, null, function* () {
1349
1318
  const params = {
1350
- name: UserInstance.data.nick,
1351
- email: UserInstance.data.email,
1352
1319
  page_key: this.options.pageKey
1353
1320
  };
1321
+ this.withUserInfo(params);
1354
1322
  const form = ToFormData(params);
1355
1323
  form.set("file", file);
1356
- const init = {
1324
+ const init2 = {
1357
1325
  method: "POST",
1358
1326
  body: form
1359
1327
  };
1360
- const json = yield this.Fetch("/img-upload", init);
1328
+ const json = yield this.Fetch("/img-upload", init2);
1361
1329
  return json.data || {};
1362
1330
  });
1363
1331
  }
@@ -2210,6 +2178,11 @@ function convertApiOptions(conf, ctx) {
2210
2178
  pageKey: conf.pageKey || "",
2211
2179
  pageTitle: conf.pageTitle || "",
2212
2180
  timeout: conf.reqTimeout,
2181
+ apiToken: ctx == null ? void 0 : ctx.get("user").getData().token,
2182
+ userInfo: (ctx == null ? void 0 : ctx.get("user").checkHasBasicUserInfo()) ? {
2183
+ name: ctx == null ? void 0 : ctx.get("user").getData().nick,
2184
+ email: ctx == null ? void 0 : ctx.get("user").getData().email
2185
+ } : void 0,
2213
2186
  onNeedCheckAdmin(payload) {
2214
2187
  ctx == null ? void 0 : ctx.checkAdmin({
2215
2188
  onSuccess: () => {
@@ -2273,7 +2246,7 @@ class Context {
2273
2246
  this.data.fetchComments({ offset: 0 });
2274
2247
  }
2275
2248
  listGotoFirst() {
2276
- this.trigger("list-goto-first");
2249
+ this.events.trigger("list-goto-first");
2277
2250
  }
2278
2251
  /* 编辑器 */
2279
2252
  editorShowLoading() {
@@ -2318,11 +2291,11 @@ class Context {
2318
2291
  }
2319
2292
  setDarkMode(darkMode) {
2320
2293
  this.conf.darkMode = darkMode;
2321
- this.trigger("dark-mode-changed", darkMode);
2294
+ this.events.trigger("dark-mode-changed", darkMode);
2322
2295
  }
2323
2296
  updateConf(nConf) {
2324
2297
  this.conf = mergeDeep(this.conf, handelCustomConf(nConf));
2325
- this.trigger("conf-loaded", this.conf);
2298
+ this.events.trigger("conf-loaded", this.conf);
2326
2299
  }
2327
2300
  getMarked() {
2328
2301
  return getInstance();
@@ -2529,7 +2502,7 @@ function imgBody(checker) {
2529
2502
  }
2530
2503
  function iframeBody(checker) {
2531
2504
  const $iframeWrap = createElement(`<div class="atk-checker-iframe-wrap"></div>`);
2532
- const $iframe = createElement(`<iframe class="atk-fade-in"></iframe>`);
2505
+ const $iframe = createElement(`<iframe class="atk-fade-in" referrerpolicy="strict-origin-when-cross-origin"></iframe>`);
2533
2506
  $iframe.style.display = "none";
2534
2507
  showLoading($iframeWrap, { transparentBg: true });
2535
2508
  $iframe.src = `${checker.getOpts().getIframeURLBase() || ""}/api/captcha/get?t=${+/* @__PURE__ */ new Date()}`;
@@ -2593,8 +2566,8 @@ const AdminChecker = {
2593
2566
  inputType: "password",
2594
2567
  request(checker, inputVal) {
2595
2568
  const data = {
2596
- name: UserInstance.data.nick,
2597
- email: UserInstance.data.email,
2569
+ name: checker.getUser().getData().nick,
2570
+ email: checker.getUser().getData().email,
2598
2571
  password: inputVal
2599
2572
  };
2600
2573
  return (() => __async(this, null, function* () {
@@ -2606,7 +2579,7 @@ const AdminChecker = {
2606
2579
  return createElement(`<span>${t("adminCheck")}</span>`);
2607
2580
  },
2608
2581
  onSuccess(checker, userToken, inputVal, formEl) {
2609
- UserInstance.update({
2582
+ checker.getUser().update({
2610
2583
  isAdmin: true,
2611
2584
  token: userToken
2612
2585
  });
@@ -2639,6 +2612,7 @@ class CheckerLauncher {
2639
2612
  },
2640
2613
  get: (key) => checkerStore[key],
2641
2614
  getOpts: () => this.opts,
2615
+ getUser: () => this.opts.getCtx().get("user"),
2642
2616
  getApi: () => this.opts.getApi(),
2643
2617
  hideInteractInput: () => {
2644
2618
  hideInteractInput = true;
@@ -3030,7 +3004,7 @@ class SidebarLayer extends Component {
3030
3004
  });
3031
3005
  }
3032
3006
  createIframe(view) {
3033
- const $iframe = createElement("<iframe></iframe>");
3007
+ const $iframe = createElement('<iframe referrerpolicy="strict-origin-when-cross-origin"></iframe>');
3034
3008
  const baseURL = getURLBasedOnApi({
3035
3009
  base: this.ctx.conf.server,
3036
3010
  path: "/sidebar/"
@@ -3038,7 +3012,7 @@ class SidebarLayer extends Component {
3038
3012
  const query = {
3039
3013
  pageKey: this.conf.pageKey,
3040
3014
  site: this.conf.site || "",
3041
- user: JSON.stringify(UserInstance.data),
3015
+ user: JSON.stringify(this.ctx.get("user").getData()),
3042
3016
  time: +/* @__PURE__ */ new Date()
3043
3017
  };
3044
3018
  if (view)
@@ -3115,7 +3089,7 @@ class ListLayout {
3115
3089
  constructor(options) {
3116
3090
  this.options = options;
3117
3091
  }
3118
- // TODO refactor `if syntax` to strategy pattern
3092
+ // TODO: refactor `if syntax` to strategy pattern
3119
3093
  import(comments) {
3120
3094
  if (this.options.flatMode) {
3121
3095
  comments.forEach((commentData) => {
@@ -3191,9 +3165,9 @@ class ListLayout {
3191
3165
  scrollIntoView(comment.getEl());
3192
3166
  }
3193
3167
  }
3194
- const win = window || {};
3195
- const nav = navigator || {};
3196
3168
  function Detect(userAgent) {
3169
+ const win = window || {};
3170
+ const nav = navigator || {};
3197
3171
  const u = String(userAgent || nav.userAgent);
3198
3172
  const dest = {
3199
3173
  os: "",
@@ -4542,20 +4516,6 @@ const initListPaginatorFunc = (ctx) => {
4542
4516
  var _a;
4543
4517
  (_a = paginator == null ? void 0 : paginator.showErr) == null ? void 0 : _a.call(paginator, t("loadFail"));
4544
4518
  });
4545
- const autoSwitchPageForFindComment = (commentID) => {
4546
- const comment = ctx.getData().findComment(commentID);
4547
- if (!!comment || !(paginator == null ? void 0 : paginator.getHasMore()))
4548
- return;
4549
- ctx.on("list-loaded", () => {
4550
- autoSwitchPageForFindComment(commentID);
4551
- }, { once: true });
4552
- setTimeout(() => {
4553
- paginator == null ? void 0 : paginator.next();
4554
- }, 80);
4555
- };
4556
- ctx.on("list-goto", (commentID) => {
4557
- autoSwitchPageForFindComment(commentID);
4558
- });
4559
4519
  ctx.on("list-fetch", (params) => {
4560
4520
  paginator == null ? void 0 : paginator.setLoading(true);
4561
4521
  });
@@ -4753,6 +4713,47 @@ class LayerManager {
4753
4713
  return layer;
4754
4714
  }
4755
4715
  }
4716
+ const LOCAL_USER_KEY = "ArtalkUser";
4717
+ class User {
4718
+ constructor(opts) {
4719
+ __publicField(this, "data");
4720
+ this.opts = opts;
4721
+ const localUser = JSON.parse(window.localStorage.getItem(LOCAL_USER_KEY) || "{}");
4722
+ this.data = {
4723
+ nick: localUser.nick || "",
4724
+ email: localUser.email || "",
4725
+ link: localUser.link || "",
4726
+ token: localUser.token || "",
4727
+ isAdmin: localUser.isAdmin || false
4728
+ };
4729
+ }
4730
+ getData() {
4731
+ return this.data;
4732
+ }
4733
+ /** 保存用户到 localStorage 中 */
4734
+ update(obj = {}) {
4735
+ Object.entries(obj).forEach(([key, value]) => {
4736
+ this.data[key] = value;
4737
+ });
4738
+ window.localStorage.setItem(LOCAL_USER_KEY, JSON.stringify(this.data));
4739
+ this.opts.onUserChanged && this.opts.onUserChanged(this.data);
4740
+ }
4741
+ /**
4742
+ * Logout
4743
+ *
4744
+ * @description Logout will clear login status, but not clear user data (nick, email, link)
4745
+ */
4746
+ logout() {
4747
+ this.update({
4748
+ token: "",
4749
+ isAdmin: false
4750
+ });
4751
+ }
4752
+ /** 是否已填写基本用户信息 */
4753
+ checkHasBasicUserInfo() {
4754
+ return !!this.data.nick && !!this.data.email;
4755
+ }
4756
+ }
4756
4757
  const services = {
4757
4758
  // I18n
4758
4759
  i18n(ctx) {
@@ -4763,10 +4764,12 @@ const services = {
4763
4764
  },
4764
4765
  // User Store
4765
4766
  user(ctx) {
4766
- UserInstance.setOnUserChanged((user) => {
4767
- ctx == null ? void 0 : ctx.trigger("user-changed", user);
4767
+ const user = new User({
4768
+ onUserChanged: (data) => {
4769
+ ctx.trigger("user-changed", data);
4770
+ }
4768
4771
  });
4769
- return UserInstance;
4772
+ return user;
4770
4773
  },
4771
4774
  // 弹出层
4772
4775
  layerManager(ctx) {
@@ -4816,11 +4819,8 @@ function showErrorDialog(opts) {
4816
4819
  errEl.appendChild($retryBtn);
4817
4820
  }
4818
4821
  if (opts.onOpenSidebar) {
4819
- const $openSidebar = createElement('<span atk-only-admin-show> | <span style="cursor:pointer;">打开控制台</span></span>');
4822
+ const $openSidebar = createElement(`<span atk-only-admin-show> | <span style="cursor:pointer;">${t("open") + t("ctrlCenter")}</span></span>`);
4820
4823
  errEl.appendChild($openSidebar);
4821
- if (!UserInstance.data.isAdmin) {
4822
- $openSidebar.classList.add("atk-hide");
4823
- }
4824
4824
  $openSidebar.onclick = () => opts.onOpenSidebar && opts.onOpenSidebar();
4825
4825
  }
4826
4826
  setError(opts.$err, errEl);
@@ -4856,9 +4856,10 @@ function loadConf(ctx) {
4856
4856
  errMsg: err.msg || String(err),
4857
4857
  errData: err.data,
4858
4858
  retryFn: () => loadConf(ctx),
4859
- onOpenSidebar: () => ctx.showSidebar({
4859
+ onOpenSidebar: ctx.get("user").getData().isAdmin ? () => ctx.showSidebar({
4860
4860
  view: sidebarOpenView
4861
- })
4861
+ }) : void 0
4862
+ // only show open sidebar button when user is admin
4862
4863
  });
4863
4864
  throw err;
4864
4865
  }).then(() => {
@@ -4963,7 +4964,7 @@ class SubmitAddPreset {
4963
4964
  });
4964
4965
  }
4965
4966
  getSubmitAddParams() {
4966
- const { nick, email, link } = UserInstance.data;
4967
+ const { nick, email, link } = this.kit.useUser().getData();
4967
4968
  const conf = this.kit.useConf();
4968
4969
  return {
4969
4970
  content: this.kit.useEditor().getContentFinal(),
@@ -5161,7 +5162,7 @@ class StateEdit extends EditorPlug {
5161
5162
  ui.$editCancelBtn = void 0;
5162
5163
  }
5163
5164
  this.comment = void 0;
5164
- const { nick, email, link } = UserInstance.data;
5165
+ const { nick, email, link } = this.kit.useUser().getData();
5165
5166
  ui.$nick.value = nick;
5166
5167
  ui.$email.value = email;
5167
5168
  ui.$link.value = link;
@@ -5200,7 +5201,7 @@ class Closable extends EditorPlug {
5200
5201
  close() {
5201
5202
  if (!this.kit.useUI().$textareaWrap.querySelector(".atk-comment-closed"))
5202
5203
  this.kit.useUI().$textareaWrap.prepend(createElement(`<div class="atk-comment-closed">${t("onlyAdminCanReply")}</div>`));
5203
- if (!UserInstance.data.isAdmin) {
5204
+ if (!this.kit.useUser().getData().isAdmin) {
5204
5205
  this.kit.useUI().$textarea.style.display = "none";
5205
5206
  this.kit.useEvents().trigger("panel-close");
5206
5207
  this.kit.useUI().$bottom.style.display = "none";
@@ -5245,14 +5246,14 @@ class HeaderUser extends EditorPlug {
5245
5246
  const onInput = ({ $input, field }) => {
5246
5247
  if (this.kit.useEditor().getState() === "edit")
5247
5248
  return;
5248
- UserInstance.update({ [field]: $input.value.trim() });
5249
+ this.kit.useUser().update({ [field]: $input.value.trim() });
5249
5250
  if (field === "nick" || field === "email")
5250
5251
  this.fetchUserInfo();
5251
5252
  };
5252
5253
  this.kit.useMounted(() => {
5253
5254
  Object.entries(this.kit.useEditor().getHeaderInputEls()).forEach(([key, $input]) => {
5254
5255
  $input.placeholder = `${t(key)}`;
5255
- $input.value = UserInstance.data[key] || "";
5256
+ $input.value = this.kit.useUser().getData()[key] || "";
5256
5257
  });
5257
5258
  this.kit.useEvents().on("header-input", onInput);
5258
5259
  });
@@ -5264,7 +5265,7 @@ class HeaderUser extends EditorPlug {
5264
5265
  * Fetch user info from server
5265
5266
  */
5266
5267
  fetchUserInfo() {
5267
- UserInstance.logout();
5268
+ this.kit.useUser().logout();
5268
5269
  if (this.query.timer)
5269
5270
  window.clearTimeout(this.query.timer);
5270
5271
  if (this.query.abortFn)
@@ -5272,8 +5273,8 @@ class HeaderUser extends EditorPlug {
5272
5273
  this.query.timer = window.setTimeout(() => {
5273
5274
  this.query.timer = null;
5274
5275
  const { req, abort } = this.kit.useApi().user.userGet(
5275
- UserInstance.data.nick,
5276
- UserInstance.data.email
5276
+ this.kit.useUser().getData().nick,
5277
+ this.kit.useUser().getData().email
5277
5278
  );
5278
5279
  this.query.abortFn = abort;
5279
5280
  req.then((data) => this.onUserInfoFetched(data)).catch((err) => {
@@ -5290,9 +5291,9 @@ class HeaderUser extends EditorPlug {
5290
5291
  onUserInfoFetched(data) {
5291
5292
  var _a;
5292
5293
  if (!data.is_login)
5293
- UserInstance.logout();
5294
+ this.kit.useUser().logout();
5294
5295
  this.kit.useGlobalCtx().getData().updateUnreads(data.unread);
5295
- if (UserInstance.checkHasBasicUserInfo() && !data.is_login && ((_a = data.user) == null ? void 0 : _a.is_admin)) {
5296
+ if (this.kit.useUser().checkHasBasicUserInfo() && !data.is_login && ((_a = data.user) == null ? void 0 : _a.is_admin)) {
5296
5297
  this.kit.useGlobalCtx().checkAdmin({
5297
5298
  onSuccess: () => {
5298
5299
  }
@@ -5300,7 +5301,7 @@ class HeaderUser extends EditorPlug {
5300
5301
  }
5301
5302
  if (data.user && data.user.link) {
5302
5303
  this.kit.useUI().$link.value = data.user.link;
5303
- UserInstance.update({ link: data.user.link });
5304
+ this.kit.useUser().update({ link: data.user.link });
5304
5305
  }
5305
5306
  }
5306
5307
  }
@@ -5322,11 +5323,10 @@ class HeaderLink extends EditorPlug {
5322
5323
  const link = this.kit.useUI().$link.value.trim();
5323
5324
  if (!!link && !/^(http|https):\/\//.test(link)) {
5324
5325
  this.kit.useUI().$link.value = `https://${link}`;
5325
- UserInstance.update({ link: this.kit.useUI().$link.value });
5326
+ this.kit.useUser().update({ link: this.kit.useUI().$link.value });
5326
5327
  }
5327
5328
  }
5328
5329
  }
5329
- const emoticons = "";
5330
5330
  class Emoticons extends EditorPlug {
5331
5331
  constructor(kit) {
5332
5332
  super(kit);
@@ -5442,7 +5442,8 @@ class Emoticons extends EditorPlug {
5442
5442
  return json;
5443
5443
  } catch (err) {
5444
5444
  hideLoading(this.$panel);
5445
- setError(this.$panel, `表情加载失败 ${String(err)}`);
5445
+ console.error("[Emoticons] Load Failed:", err);
5446
+ setError(this.$panel, `${t("emoticon")}${t("loadFail")} ${String(err)}`);
5446
5447
  return [];
5447
5448
  }
5448
5449
  });
@@ -5651,7 +5652,7 @@ class Upload extends EditorPlug {
5651
5652
  const fileExt = /[^.]+$/.exec(file.name);
5652
5653
  if (!fileExt || !AllowImgExts.includes(fileExt[0]))
5653
5654
  return;
5654
- if (!UserInstance.checkHasBasicUserInfo()) {
5655
+ if (!this.kit.useUser().checkHasBasicUserInfo()) {
5655
5656
  this.kit.useEditor().showNotify(t("uploadLoginMsg"), "w");
5656
5657
  return;
5657
5658
  }
@@ -5686,7 +5687,6 @@ class Upload extends EditorPlug {
5686
5687
  });
5687
5688
  }
5688
5689
  }
5689
- const preview = "";
5690
5690
  class Preview extends EditorPlug {
5691
5691
  constructor(kit) {
5692
5692
  super(kit);
@@ -5749,7 +5749,11 @@ class PlugKit {
5749
5749
  useEditor() {
5750
5750
  return this.plugs.editor;
5751
5751
  }
5752
- /** Use the context of global */
5752
+ /**
5753
+ * Use the context of global
5754
+ *
5755
+ * @deprecated The calls to this function should be reduced as much as possible
5756
+ */
5753
5757
  useGlobalCtx() {
5754
5758
  return this.plugs.editor.ctx;
5755
5759
  }
@@ -5761,6 +5765,10 @@ class PlugKit {
5761
5765
  useApi() {
5762
5766
  return this.plugs.editor.ctx.getApi();
5763
5767
  }
5768
+ /** Use the user manager */
5769
+ useUser() {
5770
+ return this.plugs.editor.ctx.get("user");
5771
+ }
5764
5772
  /** Use the ui of editor */
5765
5773
  useUI() {
5766
5774
  return this.plugs.editor.getUI();
@@ -5978,7 +5986,7 @@ const SidebarBtn = (ctx) => {
5978
5986
  const syncByUser = () => {
5979
5987
  if (!$openSidebarBtn)
5980
5988
  return;
5981
- const user = ctx.get("user").data;
5989
+ const user = ctx.get("user").getData();
5982
5990
  if (!!user.nick && !!user.email) {
5983
5991
  $openSidebarBtn.classList.remove("atk-hide");
5984
5992
  const $btnText = $openSidebarBtn.querySelector(".atk-text");
@@ -6077,7 +6085,7 @@ function extractCommentID() {
6077
6085
  }
6078
6086
  return commentId || null;
6079
6087
  }
6080
- const version = "2.7.0";
6088
+ const version = "2.7.2";
6081
6089
  const Copyright = (ctx) => {
6082
6090
  ctx.on("conf-loaded", () => {
6083
6091
  const list = ctx.get("list");
@@ -6351,12 +6359,15 @@ function initCountWidget(opt) {
6351
6359
  if (opt.countEl && document.querySelector(opt.countEl)) {
6352
6360
  refreshStatCount(opt, { query: "page_comment", numEl: opt.countEl });
6353
6361
  }
6354
- const curtPagePvNum = opt.pvAdd ? yield opt.getApi().page.pv() : NaN;
6362
+ const initialData = opt.pvAdd ? {
6363
+ [opt.pageKey]: yield opt.getApi().page.pv()
6364
+ // pv+1 and get pv count
6365
+ } : void 0;
6355
6366
  if (opt.pvEl && document.querySelector(opt.pvEl)) {
6356
6367
  refreshStatCount(opt, {
6357
6368
  query: "page_pv",
6358
6369
  numEl: opt.pvEl,
6359
- data: { [opt.pageKey]: curtPagePvNum }
6370
+ data: initialData
6360
6371
  });
6361
6372
  }
6362
6373
  });
@@ -6364,10 +6375,10 @@ function initCountWidget(opt) {
6364
6375
  function refreshStatCount(opt, args) {
6365
6376
  return __async(this, null, function* () {
6366
6377
  let data = args.data || {};
6367
- let pageKeys = Array.from(document.querySelectorAll(args.numEl)).map((e) => e.getAttribute("data-page-key") || opt.pageKey).filter((e) => Number.isNaN(data[e]));
6368
- pageKeys = [...new Set(pageKeys)];
6369
- if (pageKeys.length > 0) {
6370
- const res = yield opt.getApi().page.stat(args.query, pageKeys);
6378
+ let queryPageKeys = Array.from(document.querySelectorAll(args.numEl)).map((e) => e.getAttribute("data-page-key") || opt.pageKey).filter((k) => typeof data[k] !== "number");
6379
+ queryPageKeys = [...new Set(queryPageKeys)];
6380
+ if (queryPageKeys.length > 0) {
6381
+ const res = yield opt.getApi().page.stat(args.query, queryPageKeys);
6371
6382
  data = __spreadValues(__spreadValues({}, data), res);
6372
6383
  }
6373
6384
  applyCountData(args.numEl, data, data[opt.pageKey]);
@@ -6394,9 +6405,9 @@ function versionCheck(list, feVer, beVer) {
6394
6405
  if (sameVer)
6395
6406
  return;
6396
6407
  const errEl = createElement(
6397
- `<div>请更新 Artalk ${comp < 0 ? t("frontend") : t("backend")}以获得完整体验 (<a href="https://artalk.js.org/" target="_blank">帮助文档</a>)<br/><br/><span style="color: var(--at-color-meta);">当前版本:${t("frontend")} ${feVer} / ${t("backend")} ${beVer}</span><br/><br/></div>`
6408
+ `<div>${t("updateMsg", { name: comp < 0 ? t("frontend") : t("backend") })}<br/><br/><span style="color: var(--at-color-meta);">${t("currentVersion")}: ${t("frontend")} ${feVer} / ${t("backend")} ${beVer}</span><br/><br/></div>`
6398
6409
  );
6399
- const ignoreBtn = createElement('<span style="cursor:pointer">忽略</span>');
6410
+ const ignoreBtn = createElement(`<span style="cursor:pointer">${t("ignore")}</span>`);
6400
6411
  ignoreBtn.onclick = () => {
6401
6412
  setError(list.$el.parentElement, null);
6402
6413
  IgnoreVersionCheck = true;
@@ -6407,7 +6418,7 @@ function versionCheck(list, feVer, beVer) {
6407
6418
  }
6408
6419
  const AdminOnlyElem = (ctx) => {
6409
6420
  const scanApply = () => {
6410
- applyAdminOnlyEls(ctx.get("user").data.isAdmin, getAdminOnlyEls({
6421
+ applyAdminOnlyEls(ctx.get("user").getData().isAdmin, getAdminOnlyEls({
6411
6422
  $root: ctx.$root
6412
6423
  }));
6413
6424
  };
@@ -6434,38 +6445,44 @@ function applyAdminOnlyEls(isAdmin, els) {
6434
6445
  $item.classList.add("atk-hide");
6435
6446
  });
6436
6447
  }
6437
- const darkModeMedia = window.matchMedia("(prefers-color-scheme: dark)");
6438
- let darkModeAutoFunc;
6439
- function applyDarkMode($els, darkMode) {
6440
- const apply = (d) => {
6441
- $els.forEach(($el) => updateClassName($el, d));
6442
- };
6443
- if (darkMode === "auto") {
6444
- if (!darkModeAutoFunc) {
6445
- darkModeAutoFunc = (evt) => apply(evt.matches);
6446
- darkModeMedia.addEventListener("change", darkModeAutoFunc);
6447
- }
6448
- apply(darkModeMedia.matches);
6449
- } else {
6450
- if (darkModeAutoFunc)
6451
- darkModeMedia.removeEventListener("change", darkModeAutoFunc);
6452
- apply(darkMode);
6453
- }
6454
- }
6455
- const DarkModeClassName = "atk-dark-mode";
6456
- function updateClassName($el, darkMode) {
6457
- if (darkMode)
6458
- $el.classList.add(DarkModeClassName);
6459
- else
6460
- $el.classList.remove(DarkModeClassName);
6448
+ let darkModeMedia;
6449
+ function updateClassnames($els, darkMode) {
6450
+ const DarkModeClassName = "atk-dark-mode";
6451
+ $els.forEach(($el) => {
6452
+ if (darkMode)
6453
+ $el.classList.add(DarkModeClassName);
6454
+ else
6455
+ $el.classList.remove(DarkModeClassName);
6456
+ });
6461
6457
  }
6462
6458
  const DarkMode = (ctx) => {
6463
- const sync = () => {
6464
- applyDarkMode([ctx.$root, ctx.get("layerManager").getEl()], ctx.conf.darkMode);
6459
+ let darkModeAutoHandler;
6460
+ const sync = (darkMode) => {
6461
+ const $els = [ctx.$root, ctx.get("layerManager").getEl()];
6462
+ if (!darkModeMedia) {
6463
+ darkModeMedia = window.matchMedia("(prefers-color-scheme: dark)");
6464
+ }
6465
+ if (darkMode === "auto") {
6466
+ if (!darkModeAutoHandler) {
6467
+ darkModeAutoHandler = (evt) => updateClassnames($els, evt.matches);
6468
+ darkModeMedia.addEventListener("change", darkModeAutoHandler);
6469
+ }
6470
+ updateClassnames($els, darkModeMedia.matches);
6471
+ } else {
6472
+ if (darkModeAutoHandler) {
6473
+ darkModeMedia.removeEventListener("change", darkModeAutoHandler);
6474
+ darkModeAutoHandler = void 0;
6475
+ }
6476
+ updateClassnames($els, darkMode);
6477
+ }
6465
6478
  };
6466
- ctx.on("inited", () => sync());
6467
- ctx.on("conf-loaded", () => sync());
6468
- ctx.on("dark-mode-changed", () => sync());
6479
+ ctx.on("inited", () => sync(ctx.conf.darkMode));
6480
+ ctx.on("conf-loaded", (conf) => sync(conf.darkMode));
6481
+ ctx.on("dark-mode-changed", (darkMode) => sync(darkMode));
6482
+ ctx.on("destroy", () => {
6483
+ darkModeAutoHandler && (darkModeMedia == null ? void 0 : darkModeMedia.removeEventListener("change", darkModeAutoHandler));
6484
+ darkModeAutoHandler = void 0;
6485
+ });
6469
6486
  };
6470
6487
  const DefaultPlugins = [
6471
6488
  ConfRemoter,
@@ -6478,7 +6495,7 @@ const DefaultPlugins = [
6478
6495
  DarkMode
6479
6496
  ];
6480
6497
  const GlobalPlugins = [...DefaultPlugins];
6481
- const _Artalk = class _Artalk {
6498
+ class Artalk {
6482
6499
  constructor(conf) {
6483
6500
  __publicField(this, "conf");
6484
6501
  __publicField(this, "ctx");
@@ -6530,9 +6547,12 @@ const _Artalk = class _Artalk {
6530
6547
  setDarkMode(darkMode) {
6531
6548
  this.ctx.setDarkMode(darkMode);
6532
6549
  }
6550
+ // ===========================
6551
+ // Static Members
6552
+ // ===========================
6533
6553
  /** Init Artalk */
6534
6554
  static init(conf) {
6535
- return new _Artalk(conf);
6555
+ return new Artalk(conf);
6536
6556
  }
6537
6557
  /** Use plugin, the plugin will be used when Artalk.init */
6538
6558
  static use(plugin) {
@@ -6551,17 +6571,18 @@ const _Artalk = class _Artalk {
6551
6571
  pvAdd: false
6552
6572
  });
6553
6573
  }
6554
- };
6555
- // ===========================
6556
- // Static Members
6557
- // ===========================
6558
- /** Default Configs */
6559
- __publicField(_Artalk, "defaults", defaults);
6560
- let Artalk = _Artalk;
6574
+ }
6561
6575
  const index = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
6562
6576
  __proto__: null
6563
6577
  }, Symbol.toStringTag, { value: "Module" }));
6578
+ const init = Artalk.init;
6579
+ const use = Artalk.use;
6580
+ const loadCountWidget = Artalk.loadCountWidget;
6564
6581
  export {
6565
6582
  index as ArtalkType,
6566
- Artalk as default
6583
+ Artalk as default,
6584
+ init,
6585
+ loadCountWidget,
6586
+ use
6567
6587
  };
6588
+ //# sourceMappingURL=ArtalkLite.es.js.map