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
package/dist/Artalk.es.js CHANGED
@@ -55,7 +55,6 @@ var __async = (__this, __arguments, generator) => {
55
55
  });
56
56
  };
57
57
  var _parseMarkdown, parseMarkdown_fn, _onError, onError_fn;
58
- const main = "";
59
58
  function createElement(htmlStr = "") {
60
59
  const div = document.createElement("div");
61
60
  div.innerHTML = htmlStr.trim();
@@ -565,13 +564,13 @@ function getDefaultExportFromCjs(x) {
565
564
  }
566
565
  var Request = NativeRequest;
567
566
  if (Request && !Request.prototype.hasOwnProperty("signal") || __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
568
- Request = function Request2(input, init) {
567
+ Request = function Request2(input, init2) {
569
568
  var signal;
570
- if (init && init.signal) {
571
- signal = init.signal;
572
- delete init.signal;
569
+ if (init2 && init2.signal) {
570
+ signal = init2.signal;
571
+ delete init2.signal;
573
572
  }
574
- var request = new NativeRequest(input, init);
573
+ var request = new NativeRequest(input, init2);
575
574
  if (signal) {
576
575
  Object.defineProperty(request, "signal", {
577
576
  writable: false,
@@ -585,8 +584,8 @@ function getDefaultExportFromCjs(x) {
585
584
  Request.prototype = NativeRequest.prototype;
586
585
  }
587
586
  var realFetch = fetch2;
588
- var abortableFetch = function abortableFetch2(input, init) {
589
- var signal = Request && Request.prototype.isPrototypeOf(input) ? input.signal : init ? init.signal : void 0;
587
+ var abortableFetch = function abortableFetch2(input, init2) {
588
+ var signal = Request && Request.prototype.isPrototypeOf(input) ? input.signal : init2 ? init2.signal : void 0;
590
589
  if (signal) {
591
590
  var abortError;
592
591
  try {
@@ -605,12 +604,12 @@ function getDefaultExportFromCjs(x) {
605
604
  once: true
606
605
  });
607
606
  });
608
- if (init && init.signal) {
609
- delete init.signal;
607
+ if (init2 && init2.signal) {
608
+ delete init2.signal;
610
609
  }
611
- return Promise.race([cancellation, realFetch(input, init)]);
610
+ return Promise.race([cancellation, realFetch(input, init2)]);
612
611
  }
613
- return realFetch(input, init);
612
+ return realFetch(input, init2);
614
613
  };
615
614
  return {
616
615
  fetch: abortableFetch,
@@ -642,48 +641,6 @@ function getDefaultExportFromCjs(x) {
642
641
  });
643
642
  })(typeof self !== "undefined" ? self : commonjsGlobal);
644
643
  });
645
- const LOCAL_USER_KEY = "ArtalkUser";
646
- class User {
647
- constructor() {
648
- __publicField(this, "data");
649
- __publicField(this, "onUserChanged", null);
650
- const localUser = JSON.parse(window.localStorage.getItem(LOCAL_USER_KEY) || "{}");
651
- this.data = {
652
- nick: localUser.nick || "",
653
- email: localUser.email || "",
654
- link: localUser.link || "",
655
- token: localUser.token || "",
656
- isAdmin: localUser.isAdmin || false
657
- };
658
- }
659
- /** 保存用户到 localStorage 中 */
660
- update(obj = {}) {
661
- Object.entries(obj).forEach(([key, value]) => {
662
- this.data[key] = value;
663
- });
664
- window.localStorage.setItem(LOCAL_USER_KEY, JSON.stringify(this.data));
665
- this.onUserChanged && this.onUserChanged(this.data);
666
- }
667
- setOnUserChanged(fn) {
668
- this.onUserChanged = fn;
669
- }
670
- /**
671
- * Logout
672
- *
673
- * @description Logout will clear login status, but not clear user data (nick, email, link)
674
- */
675
- logout() {
676
- this.update({
677
- token: "",
678
- isAdmin: false
679
- });
680
- }
681
- /** 是否已填写基本用户信息 */
682
- checkHasBasicUserInfo() {
683
- return !!this.data.nick && !!this.data.email;
684
- }
685
- }
686
- const UserInstance = new User();
687
644
  const en = {
688
645
  /* Editor */
689
646
  placeholder: "Leave a comment",
@@ -757,7 +714,11 @@ const en = {
757
714
  deleting: "Deleting",
758
715
  deleteFail: "Delete Failed",
759
716
  reqGot: "Request got",
760
- reqAborted: "Request timed out or terminated unexpectedly"
717
+ reqAborted: "Request timed out or terminated unexpectedly",
718
+ updateMsg: "Please update Artalk {name} to get the full experience",
719
+ currentVersion: "Current Version",
720
+ ignore: "Ignore",
721
+ open: "Open"
761
722
  };
762
723
  const zhCN = {
763
724
  /* Editor */
@@ -832,7 +793,11 @@ const zhCN = {
832
793
  deleting: "删除中",
833
794
  deleteFail: "删除失败",
834
795
  reqGot: "请求响应",
835
- reqAborted: "请求超时或意外终止"
796
+ reqAborted: "请求超时或意外终止",
797
+ updateMsg: "请更新 Artalk {name} 以获得完整体验",
798
+ currentVersion: "当前版本",
799
+ ignore: "忽略",
800
+ open: "打开"
836
801
  };
837
802
  const GLOBAL_LOCALES_KEY = "ArtalkI18n";
838
803
  const internal = {
@@ -866,15 +831,15 @@ function t(key, args = {}) {
866
831
  str = str.replace(/\{\s*(\w+?)\s*\}/g, (_, token) => args[token] || "");
867
832
  return str;
868
833
  }
869
- function Fetch$1(opts, input, init, timeout) {
834
+ function Fetch$1(opts, input, init2, timeout) {
870
835
  return __async(this, null, function* () {
871
836
  var _a, _b;
872
- if (UserInstance.data.token) {
873
- const headers = new Headers(init.headers);
874
- headers.set("Authorization", `Bearer ${UserInstance.data.token}`);
875
- init.headers = headers;
837
+ if (opts.apiToken) {
838
+ const headers = new Headers(init2.headers);
839
+ headers.set("Authorization", `Bearer ${opts.apiToken}`);
840
+ init2.headers = headers;
876
841
  }
877
- const resp = yield timeoutFetch(input, timeout || opts.timeout || 15e3, init);
842
+ const resp = yield timeoutFetch(input, timeout || opts.timeout || 15e3, init2);
878
843
  const respHttpCode = resp.status;
879
844
  const noAccessCodes = [401, 400];
880
845
  const isNoAccess = noAccessCodes.includes(respHttpCode);
@@ -882,7 +847,7 @@ function Fetch$1(opts, input, init, timeout) {
882
847
  throw new Error(`${t("reqGot")} ${respHttpCode}`);
883
848
  let json = yield resp.json();
884
849
  const recall = (resolve, reject) => {
885
- Fetch$1(opts, input, init).then((d) => {
850
+ Fetch$1(opts, input, init2).then((d) => {
886
851
  resolve(d);
887
852
  }).catch((e) => {
888
853
  reject(e);
@@ -919,12 +884,12 @@ function Fetch$1(opts, input, init, timeout) {
919
884
  }
920
885
  function POST(opts, url, data) {
921
886
  return __async(this, null, function* () {
922
- const init = {
887
+ const init2 = {
923
888
  method: "POST"
924
889
  };
925
890
  data = __spreadValues({ site_name: opts.siteName || "" }, data || {});
926
- init.body = ToFormData(data);
927
- const json = yield Fetch$1(opts, url, init);
891
+ init2.body = ToFormData(data);
892
+ const json = yield Fetch$1(opts, url, init2);
928
893
  return json.data || {};
929
894
  });
930
895
  }
@@ -958,11 +923,25 @@ class ApiBase {
958
923
  return POST(this.options, this.options.baseURL + path, data);
959
924
  });
960
925
  }
961
- Fetch(path, init, timeout) {
926
+ Fetch(path, init2, timeout) {
962
927
  return __async(this, null, function* () {
963
- return Fetch$1(this.options, this.options.baseURL + path, init, timeout);
928
+ return Fetch$1(this.options, this.options.baseURL + path, init2, timeout);
964
929
  });
965
930
  }
931
+ /**
932
+ * Carry user info to request params
933
+ *
934
+ * @param params Request params
935
+ * @returns Request params with user info
936
+ */
937
+ withUserInfo(params) {
938
+ const user = this.options.userInfo;
939
+ if (user == null ? void 0 : user.name)
940
+ params.name = user.name;
941
+ if (user == null ? void 0 : user.email)
942
+ params.email = user.email;
943
+ return params;
944
+ }
966
945
  }
967
946
  class CommentApi extends ApiBase {
968
947
  /** 评论 · 获取 */
@@ -975,10 +954,7 @@ class CommentApi extends ApiBase {
975
954
  };
976
955
  if (flatMode)
977
956
  params.flat_mode = flatMode;
978
- if (UserInstance.checkHasBasicUserInfo()) {
979
- params.name = UserInstance.data.nick;
980
- params.email = UserInstance.data.email;
981
- }
957
+ this.withUserInfo(params);
982
958
  if (paramsEditor)
983
959
  paramsEditor(params);
984
960
  return this.POST("/get", params);
@@ -1027,10 +1003,7 @@ class CommentApi extends ApiBase {
1027
1003
  target_id: targetID,
1028
1004
  type
1029
1005
  };
1030
- if (UserInstance.checkHasBasicUserInfo()) {
1031
- params.name = UserInstance.data.nick;
1032
- params.email = UserInstance.data.email;
1033
- }
1006
+ this.withUserInfo(params);
1034
1007
  const data = yield this.POST("/vote", params);
1035
1008
  return data;
1036
1009
  });
@@ -1199,10 +1172,7 @@ class UserApi extends ApiBase {
1199
1172
  /** 用户 · 登录状态 */
1200
1173
  loginStatus() {
1201
1174
  return __async(this, null, function* () {
1202
- const data = yield this.POST("/login-status", {
1203
- name: UserInstance.data.nick,
1204
- email: UserInstance.data.email
1205
- });
1175
+ const data = yield this.POST("/login-status", this.withUserInfo({}));
1206
1176
  return data || { is_login: false, is_admin: false };
1207
1177
  });
1208
1178
  }
@@ -1222,8 +1192,7 @@ class UserApi extends ApiBase {
1222
1192
  delete params.comment_id;
1223
1193
  delete params.notify_key;
1224
1194
  params.read_all = true;
1225
- params.name = UserInstance.data.nick;
1226
- params.email = UserInstance.data.email;
1195
+ this.withUserInfo(params);
1227
1196
  }
1228
1197
  return this.POST(`/mark-read`, params);
1229
1198
  }
@@ -1360,17 +1329,16 @@ class UploadApi extends ApiBase {
1360
1329
  imgUpload(file) {
1361
1330
  return __async(this, null, function* () {
1362
1331
  const params = {
1363
- name: UserInstance.data.nick,
1364
- email: UserInstance.data.email,
1365
1332
  page_key: this.options.pageKey
1366
1333
  };
1334
+ this.withUserInfo(params);
1367
1335
  const form = ToFormData(params);
1368
1336
  form.set("file", file);
1369
- const init = {
1337
+ const init2 = {
1370
1338
  method: "POST",
1371
1339
  body: form
1372
1340
  };
1373
- const json = yield this.Fetch("/img-upload", init);
1341
+ const json = yield this.Fetch("/img-upload", init2);
1374
1342
  return json.data || {};
1375
1343
  });
1376
1344
  }
@@ -4425,6 +4393,11 @@ function convertApiOptions(conf, ctx) {
4425
4393
  pageKey: conf.pageKey || "",
4426
4394
  pageTitle: conf.pageTitle || "",
4427
4395
  timeout: conf.reqTimeout,
4396
+ apiToken: ctx == null ? void 0 : ctx.get("user").getData().token,
4397
+ userInfo: (ctx == null ? void 0 : ctx.get("user").checkHasBasicUserInfo()) ? {
4398
+ name: ctx == null ? void 0 : ctx.get("user").getData().nick,
4399
+ email: ctx == null ? void 0 : ctx.get("user").getData().email
4400
+ } : void 0,
4428
4401
  onNeedCheckAdmin(payload) {
4429
4402
  ctx == null ? void 0 : ctx.checkAdmin({
4430
4403
  onSuccess: () => {
@@ -4488,7 +4461,7 @@ class Context {
4488
4461
  this.data.fetchComments({ offset: 0 });
4489
4462
  }
4490
4463
  listGotoFirst() {
4491
- this.trigger("list-goto-first");
4464
+ this.events.trigger("list-goto-first");
4492
4465
  }
4493
4466
  /* 编辑器 */
4494
4467
  editorShowLoading() {
@@ -4533,11 +4506,11 @@ class Context {
4533
4506
  }
4534
4507
  setDarkMode(darkMode) {
4535
4508
  this.conf.darkMode = darkMode;
4536
- this.trigger("dark-mode-changed", darkMode);
4509
+ this.events.trigger("dark-mode-changed", darkMode);
4537
4510
  }
4538
4511
  updateConf(nConf) {
4539
4512
  this.conf = mergeDeep(this.conf, handelCustomConf(nConf));
4540
- this.trigger("conf-loaded", this.conf);
4513
+ this.events.trigger("conf-loaded", this.conf);
4541
4514
  }
4542
4515
  getMarked() {
4543
4516
  return getInstance();
@@ -4744,7 +4717,7 @@ function imgBody(checker) {
4744
4717
  }
4745
4718
  function iframeBody(checker) {
4746
4719
  const $iframeWrap = createElement(`<div class="atk-checker-iframe-wrap"></div>`);
4747
- const $iframe = createElement(`<iframe class="atk-fade-in"></iframe>`);
4720
+ const $iframe = createElement(`<iframe class="atk-fade-in" referrerpolicy="strict-origin-when-cross-origin"></iframe>`);
4748
4721
  $iframe.style.display = "none";
4749
4722
  showLoading($iframeWrap, { transparentBg: true });
4750
4723
  $iframe.src = `${checker.getOpts().getIframeURLBase() || ""}/api/captcha/get?t=${+/* @__PURE__ */ new Date()}`;
@@ -4808,8 +4781,8 @@ const AdminChecker = {
4808
4781
  inputType: "password",
4809
4782
  request(checker, inputVal) {
4810
4783
  const data = {
4811
- name: UserInstance.data.nick,
4812
- email: UserInstance.data.email,
4784
+ name: checker.getUser().getData().nick,
4785
+ email: checker.getUser().getData().email,
4813
4786
  password: inputVal
4814
4787
  };
4815
4788
  return (() => __async(this, null, function* () {
@@ -4821,7 +4794,7 @@ const AdminChecker = {
4821
4794
  return createElement(`<span>${t("adminCheck")}</span>`);
4822
4795
  },
4823
4796
  onSuccess(checker, userToken, inputVal, formEl) {
4824
- UserInstance.update({
4797
+ checker.getUser().update({
4825
4798
  isAdmin: true,
4826
4799
  token: userToken
4827
4800
  });
@@ -4854,6 +4827,7 @@ class CheckerLauncher {
4854
4827
  },
4855
4828
  get: (key) => checkerStore[key],
4856
4829
  getOpts: () => this.opts,
4830
+ getUser: () => this.opts.getCtx().get("user"),
4857
4831
  getApi: () => this.opts.getApi(),
4858
4832
  hideInteractInput: () => {
4859
4833
  hideInteractInput = true;
@@ -5245,7 +5219,7 @@ class SidebarLayer extends Component {
5245
5219
  });
5246
5220
  }
5247
5221
  createIframe(view) {
5248
- const $iframe = createElement("<iframe></iframe>");
5222
+ const $iframe = createElement('<iframe referrerpolicy="strict-origin-when-cross-origin"></iframe>');
5249
5223
  const baseURL = getURLBasedOnApi({
5250
5224
  base: this.ctx.conf.server,
5251
5225
  path: "/sidebar/"
@@ -5253,7 +5227,7 @@ class SidebarLayer extends Component {
5253
5227
  const query = {
5254
5228
  pageKey: this.conf.pageKey,
5255
5229
  site: this.conf.site || "",
5256
- user: JSON.stringify(UserInstance.data),
5230
+ user: JSON.stringify(this.ctx.get("user").getData()),
5257
5231
  time: +/* @__PURE__ */ new Date()
5258
5232
  };
5259
5233
  if (view)
@@ -5330,7 +5304,7 @@ class ListLayout {
5330
5304
  constructor(options) {
5331
5305
  this.options = options;
5332
5306
  }
5333
- // TODO refactor `if syntax` to strategy pattern
5307
+ // TODO: refactor `if syntax` to strategy pattern
5334
5308
  import(comments) {
5335
5309
  if (this.options.flatMode) {
5336
5310
  comments.forEach((commentData) => {
@@ -5406,9 +5380,9 @@ class ListLayout {
5406
5380
  scrollIntoView(comment.getEl());
5407
5381
  }
5408
5382
  }
5409
- const win = window || {};
5410
- const nav = navigator || {};
5411
5383
  function Detect(userAgent) {
5384
+ const win = window || {};
5385
+ const nav = navigator || {};
5412
5386
  const u = String(userAgent || nav.userAgent);
5413
5387
  const dest = {
5414
5388
  os: "",
@@ -6757,20 +6731,6 @@ const initListPaginatorFunc = (ctx) => {
6757
6731
  var _a;
6758
6732
  (_a = paginator == null ? void 0 : paginator.showErr) == null ? void 0 : _a.call(paginator, t("loadFail"));
6759
6733
  });
6760
- const autoSwitchPageForFindComment = (commentID) => {
6761
- const comment = ctx.getData().findComment(commentID);
6762
- if (!!comment || !(paginator == null ? void 0 : paginator.getHasMore()))
6763
- return;
6764
- ctx.on("list-loaded", () => {
6765
- autoSwitchPageForFindComment(commentID);
6766
- }, { once: true });
6767
- setTimeout(() => {
6768
- paginator == null ? void 0 : paginator.next();
6769
- }, 80);
6770
- };
6771
- ctx.on("list-goto", (commentID) => {
6772
- autoSwitchPageForFindComment(commentID);
6773
- });
6774
6734
  ctx.on("list-fetch", (params) => {
6775
6735
  paginator == null ? void 0 : paginator.setLoading(true);
6776
6736
  });
@@ -6968,6 +6928,47 @@ class LayerManager {
6968
6928
  return layer;
6969
6929
  }
6970
6930
  }
6931
+ const LOCAL_USER_KEY = "ArtalkUser";
6932
+ class User {
6933
+ constructor(opts) {
6934
+ __publicField(this, "data");
6935
+ this.opts = opts;
6936
+ const localUser = JSON.parse(window.localStorage.getItem(LOCAL_USER_KEY) || "{}");
6937
+ this.data = {
6938
+ nick: localUser.nick || "",
6939
+ email: localUser.email || "",
6940
+ link: localUser.link || "",
6941
+ token: localUser.token || "",
6942
+ isAdmin: localUser.isAdmin || false
6943
+ };
6944
+ }
6945
+ getData() {
6946
+ return this.data;
6947
+ }
6948
+ /** 保存用户到 localStorage 中 */
6949
+ update(obj = {}) {
6950
+ Object.entries(obj).forEach(([key, value]) => {
6951
+ this.data[key] = value;
6952
+ });
6953
+ window.localStorage.setItem(LOCAL_USER_KEY, JSON.stringify(this.data));
6954
+ this.opts.onUserChanged && this.opts.onUserChanged(this.data);
6955
+ }
6956
+ /**
6957
+ * Logout
6958
+ *
6959
+ * @description Logout will clear login status, but not clear user data (nick, email, link)
6960
+ */
6961
+ logout() {
6962
+ this.update({
6963
+ token: "",
6964
+ isAdmin: false
6965
+ });
6966
+ }
6967
+ /** 是否已填写基本用户信息 */
6968
+ checkHasBasicUserInfo() {
6969
+ return !!this.data.nick && !!this.data.email;
6970
+ }
6971
+ }
6971
6972
  const services = {
6972
6973
  // I18n
6973
6974
  i18n(ctx) {
@@ -6978,10 +6979,12 @@ const services = {
6978
6979
  },
6979
6980
  // User Store
6980
6981
  user(ctx) {
6981
- UserInstance.setOnUserChanged((user) => {
6982
- ctx == null ? void 0 : ctx.trigger("user-changed", user);
6982
+ const user = new User({
6983
+ onUserChanged: (data) => {
6984
+ ctx.trigger("user-changed", data);
6985
+ }
6983
6986
  });
6984
- return UserInstance;
6987
+ return user;
6985
6988
  },
6986
6989
  // 弹出层
6987
6990
  layerManager(ctx) {
@@ -7031,11 +7034,8 @@ function showErrorDialog(opts) {
7031
7034
  errEl.appendChild($retryBtn);
7032
7035
  }
7033
7036
  if (opts.onOpenSidebar) {
7034
- const $openSidebar = createElement('<span atk-only-admin-show> | <span style="cursor:pointer;">打开控制台</span></span>');
7037
+ const $openSidebar = createElement(`<span atk-only-admin-show> | <span style="cursor:pointer;">${t("open") + t("ctrlCenter")}</span></span>`);
7035
7038
  errEl.appendChild($openSidebar);
7036
- if (!UserInstance.data.isAdmin) {
7037
- $openSidebar.classList.add("atk-hide");
7038
- }
7039
7039
  $openSidebar.onclick = () => opts.onOpenSidebar && opts.onOpenSidebar();
7040
7040
  }
7041
7041
  setError(opts.$err, errEl);
@@ -7071,9 +7071,10 @@ function loadConf(ctx) {
7071
7071
  errMsg: err.msg || String(err),
7072
7072
  errData: err.data,
7073
7073
  retryFn: () => loadConf(ctx),
7074
- onOpenSidebar: () => ctx.showSidebar({
7074
+ onOpenSidebar: ctx.get("user").getData().isAdmin ? () => ctx.showSidebar({
7075
7075
  view: sidebarOpenView
7076
- })
7076
+ }) : void 0
7077
+ // only show open sidebar button when user is admin
7077
7078
  });
7078
7079
  throw err;
7079
7080
  }).then(() => {
@@ -7178,7 +7179,7 @@ class SubmitAddPreset {
7178
7179
  });
7179
7180
  }
7180
7181
  getSubmitAddParams() {
7181
- const { nick, email, link } = UserInstance.data;
7182
+ const { nick, email, link } = this.kit.useUser().getData();
7182
7183
  const conf = this.kit.useConf();
7183
7184
  return {
7184
7185
  content: this.kit.useEditor().getContentFinal(),
@@ -7376,7 +7377,7 @@ class StateEdit extends EditorPlug {
7376
7377
  ui.$editCancelBtn = void 0;
7377
7378
  }
7378
7379
  this.comment = void 0;
7379
- const { nick, email, link } = UserInstance.data;
7380
+ const { nick, email, link } = this.kit.useUser().getData();
7380
7381
  ui.$nick.value = nick;
7381
7382
  ui.$email.value = email;
7382
7383
  ui.$link.value = link;
@@ -7415,7 +7416,7 @@ class Closable extends EditorPlug {
7415
7416
  close() {
7416
7417
  if (!this.kit.useUI().$textareaWrap.querySelector(".atk-comment-closed"))
7417
7418
  this.kit.useUI().$textareaWrap.prepend(createElement(`<div class="atk-comment-closed">${t("onlyAdminCanReply")}</div>`));
7418
- if (!UserInstance.data.isAdmin) {
7419
+ if (!this.kit.useUser().getData().isAdmin) {
7419
7420
  this.kit.useUI().$textarea.style.display = "none";
7420
7421
  this.kit.useEvents().trigger("panel-close");
7421
7422
  this.kit.useUI().$bottom.style.display = "none";
@@ -7460,14 +7461,14 @@ class HeaderUser extends EditorPlug {
7460
7461
  const onInput = ({ $input, field }) => {
7461
7462
  if (this.kit.useEditor().getState() === "edit")
7462
7463
  return;
7463
- UserInstance.update({ [field]: $input.value.trim() });
7464
+ this.kit.useUser().update({ [field]: $input.value.trim() });
7464
7465
  if (field === "nick" || field === "email")
7465
7466
  this.fetchUserInfo();
7466
7467
  };
7467
7468
  this.kit.useMounted(() => {
7468
7469
  Object.entries(this.kit.useEditor().getHeaderInputEls()).forEach(([key, $input]) => {
7469
7470
  $input.placeholder = `${t(key)}`;
7470
- $input.value = UserInstance.data[key] || "";
7471
+ $input.value = this.kit.useUser().getData()[key] || "";
7471
7472
  });
7472
7473
  this.kit.useEvents().on("header-input", onInput);
7473
7474
  });
@@ -7479,7 +7480,7 @@ class HeaderUser extends EditorPlug {
7479
7480
  * Fetch user info from server
7480
7481
  */
7481
7482
  fetchUserInfo() {
7482
- UserInstance.logout();
7483
+ this.kit.useUser().logout();
7483
7484
  if (this.query.timer)
7484
7485
  window.clearTimeout(this.query.timer);
7485
7486
  if (this.query.abortFn)
@@ -7487,8 +7488,8 @@ class HeaderUser extends EditorPlug {
7487
7488
  this.query.timer = window.setTimeout(() => {
7488
7489
  this.query.timer = null;
7489
7490
  const { req, abort } = this.kit.useApi().user.userGet(
7490
- UserInstance.data.nick,
7491
- UserInstance.data.email
7491
+ this.kit.useUser().getData().nick,
7492
+ this.kit.useUser().getData().email
7492
7493
  );
7493
7494
  this.query.abortFn = abort;
7494
7495
  req.then((data) => this.onUserInfoFetched(data)).catch((err) => {
@@ -7505,9 +7506,9 @@ class HeaderUser extends EditorPlug {
7505
7506
  onUserInfoFetched(data) {
7506
7507
  var _a;
7507
7508
  if (!data.is_login)
7508
- UserInstance.logout();
7509
+ this.kit.useUser().logout();
7509
7510
  this.kit.useGlobalCtx().getData().updateUnreads(data.unread);
7510
- if (UserInstance.checkHasBasicUserInfo() && !data.is_login && ((_a = data.user) == null ? void 0 : _a.is_admin)) {
7511
+ if (this.kit.useUser().checkHasBasicUserInfo() && !data.is_login && ((_a = data.user) == null ? void 0 : _a.is_admin)) {
7511
7512
  this.kit.useGlobalCtx().checkAdmin({
7512
7513
  onSuccess: () => {
7513
7514
  }
@@ -7515,7 +7516,7 @@ class HeaderUser extends EditorPlug {
7515
7516
  }
7516
7517
  if (data.user && data.user.link) {
7517
7518
  this.kit.useUI().$link.value = data.user.link;
7518
- UserInstance.update({ link: data.user.link });
7519
+ this.kit.useUser().update({ link: data.user.link });
7519
7520
  }
7520
7521
  }
7521
7522
  }
@@ -7537,11 +7538,10 @@ class HeaderLink extends EditorPlug {
7537
7538
  const link = this.kit.useUI().$link.value.trim();
7538
7539
  if (!!link && !/^(http|https):\/\//.test(link)) {
7539
7540
  this.kit.useUI().$link.value = `https://${link}`;
7540
- UserInstance.update({ link: this.kit.useUI().$link.value });
7541
+ this.kit.useUser().update({ link: this.kit.useUI().$link.value });
7541
7542
  }
7542
7543
  }
7543
7544
  }
7544
- const emoticons = "";
7545
7545
  class Emoticons extends EditorPlug {
7546
7546
  constructor(kit) {
7547
7547
  super(kit);
@@ -7657,7 +7657,8 @@ class Emoticons extends EditorPlug {
7657
7657
  return json;
7658
7658
  } catch (err) {
7659
7659
  hideLoading(this.$panel);
7660
- setError(this.$panel, `表情加载失败 ${String(err)}`);
7660
+ console.error("[Emoticons] Load Failed:", err);
7661
+ setError(this.$panel, `${t("emoticon")}${t("loadFail")} ${String(err)}`);
7661
7662
  return [];
7662
7663
  }
7663
7664
  });
@@ -7866,7 +7867,7 @@ class Upload extends EditorPlug {
7866
7867
  const fileExt = /[^.]+$/.exec(file.name);
7867
7868
  if (!fileExt || !AllowImgExts.includes(fileExt[0]))
7868
7869
  return;
7869
- if (!UserInstance.checkHasBasicUserInfo()) {
7870
+ if (!this.kit.useUser().checkHasBasicUserInfo()) {
7870
7871
  this.kit.useEditor().showNotify(t("uploadLoginMsg"), "w");
7871
7872
  return;
7872
7873
  }
@@ -7901,7 +7902,6 @@ class Upload extends EditorPlug {
7901
7902
  });
7902
7903
  }
7903
7904
  }
7904
- const preview = "";
7905
7905
  class Preview extends EditorPlug {
7906
7906
  constructor(kit) {
7907
7907
  super(kit);
@@ -7964,7 +7964,11 @@ class PlugKit {
7964
7964
  useEditor() {
7965
7965
  return this.plugs.editor;
7966
7966
  }
7967
- /** Use the context of global */
7967
+ /**
7968
+ * Use the context of global
7969
+ *
7970
+ * @deprecated The calls to this function should be reduced as much as possible
7971
+ */
7968
7972
  useGlobalCtx() {
7969
7973
  return this.plugs.editor.ctx;
7970
7974
  }
@@ -7976,6 +7980,10 @@ class PlugKit {
7976
7980
  useApi() {
7977
7981
  return this.plugs.editor.ctx.getApi();
7978
7982
  }
7983
+ /** Use the user manager */
7984
+ useUser() {
7985
+ return this.plugs.editor.ctx.get("user");
7986
+ }
7979
7987
  /** Use the ui of editor */
7980
7988
  useUI() {
7981
7989
  return this.plugs.editor.getUI();
@@ -8193,7 +8201,7 @@ const SidebarBtn = (ctx) => {
8193
8201
  const syncByUser = () => {
8194
8202
  if (!$openSidebarBtn)
8195
8203
  return;
8196
- const user = ctx.get("user").data;
8204
+ const user = ctx.get("user").getData();
8197
8205
  if (!!user.nick && !!user.email) {
8198
8206
  $openSidebarBtn.classList.remove("atk-hide");
8199
8207
  const $btnText = $openSidebarBtn.querySelector(".atk-text");
@@ -8292,7 +8300,7 @@ function extractCommentID() {
8292
8300
  }
8293
8301
  return commentId || null;
8294
8302
  }
8295
- const version = "2.7.0";
8303
+ const version = "2.7.2";
8296
8304
  const Copyright = (ctx) => {
8297
8305
  ctx.on("conf-loaded", () => {
8298
8306
  const list = ctx.get("list");
@@ -8566,12 +8574,15 @@ function initCountWidget(opt) {
8566
8574
  if (opt.countEl && document.querySelector(opt.countEl)) {
8567
8575
  refreshStatCount(opt, { query: "page_comment", numEl: opt.countEl });
8568
8576
  }
8569
- const curtPagePvNum = opt.pvAdd ? yield opt.getApi().page.pv() : NaN;
8577
+ const initialData = opt.pvAdd ? {
8578
+ [opt.pageKey]: yield opt.getApi().page.pv()
8579
+ // pv+1 and get pv count
8580
+ } : void 0;
8570
8581
  if (opt.pvEl && document.querySelector(opt.pvEl)) {
8571
8582
  refreshStatCount(opt, {
8572
8583
  query: "page_pv",
8573
8584
  numEl: opt.pvEl,
8574
- data: { [opt.pageKey]: curtPagePvNum }
8585
+ data: initialData
8575
8586
  });
8576
8587
  }
8577
8588
  });
@@ -8579,10 +8590,10 @@ function initCountWidget(opt) {
8579
8590
  function refreshStatCount(opt, args) {
8580
8591
  return __async(this, null, function* () {
8581
8592
  let data = args.data || {};
8582
- let pageKeys = Array.from(document.querySelectorAll(args.numEl)).map((e) => e.getAttribute("data-page-key") || opt.pageKey).filter((e) => Number.isNaN(data[e]));
8583
- pageKeys = [...new Set(pageKeys)];
8584
- if (pageKeys.length > 0) {
8585
- const res = yield opt.getApi().page.stat(args.query, pageKeys);
8593
+ let queryPageKeys = Array.from(document.querySelectorAll(args.numEl)).map((e) => e.getAttribute("data-page-key") || opt.pageKey).filter((k) => typeof data[k] !== "number");
8594
+ queryPageKeys = [...new Set(queryPageKeys)];
8595
+ if (queryPageKeys.length > 0) {
8596
+ const res = yield opt.getApi().page.stat(args.query, queryPageKeys);
8586
8597
  data = __spreadValues(__spreadValues({}, data), res);
8587
8598
  }
8588
8599
  applyCountData(args.numEl, data, data[opt.pageKey]);
@@ -8609,9 +8620,9 @@ function versionCheck(list, feVer, beVer) {
8609
8620
  if (sameVer)
8610
8621
  return;
8611
8622
  const errEl = createElement(
8612
- `<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>`
8623
+ `<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>`
8613
8624
  );
8614
- const ignoreBtn = createElement('<span style="cursor:pointer">忽略</span>');
8625
+ const ignoreBtn = createElement(`<span style="cursor:pointer">${t("ignore")}</span>`);
8615
8626
  ignoreBtn.onclick = () => {
8616
8627
  setError(list.$el.parentElement, null);
8617
8628
  IgnoreVersionCheck = true;
@@ -8622,7 +8633,7 @@ function versionCheck(list, feVer, beVer) {
8622
8633
  }
8623
8634
  const AdminOnlyElem = (ctx) => {
8624
8635
  const scanApply = () => {
8625
- applyAdminOnlyEls(ctx.get("user").data.isAdmin, getAdminOnlyEls({
8636
+ applyAdminOnlyEls(ctx.get("user").getData().isAdmin, getAdminOnlyEls({
8626
8637
  $root: ctx.$root
8627
8638
  }));
8628
8639
  };
@@ -8649,38 +8660,44 @@ function applyAdminOnlyEls(isAdmin, els) {
8649
8660
  $item.classList.add("atk-hide");
8650
8661
  });
8651
8662
  }
8652
- const darkModeMedia = window.matchMedia("(prefers-color-scheme: dark)");
8653
- let darkModeAutoFunc;
8654
- function applyDarkMode($els, darkMode) {
8655
- const apply = (d) => {
8656
- $els.forEach(($el) => updateClassName($el, d));
8657
- };
8658
- if (darkMode === "auto") {
8659
- if (!darkModeAutoFunc) {
8660
- darkModeAutoFunc = (evt) => apply(evt.matches);
8661
- darkModeMedia.addEventListener("change", darkModeAutoFunc);
8662
- }
8663
- apply(darkModeMedia.matches);
8664
- } else {
8665
- if (darkModeAutoFunc)
8666
- darkModeMedia.removeEventListener("change", darkModeAutoFunc);
8667
- apply(darkMode);
8668
- }
8669
- }
8670
- const DarkModeClassName = "atk-dark-mode";
8671
- function updateClassName($el, darkMode) {
8672
- if (darkMode)
8673
- $el.classList.add(DarkModeClassName);
8674
- else
8675
- $el.classList.remove(DarkModeClassName);
8663
+ let darkModeMedia;
8664
+ function updateClassnames($els, darkMode) {
8665
+ const DarkModeClassName = "atk-dark-mode";
8666
+ $els.forEach(($el) => {
8667
+ if (darkMode)
8668
+ $el.classList.add(DarkModeClassName);
8669
+ else
8670
+ $el.classList.remove(DarkModeClassName);
8671
+ });
8676
8672
  }
8677
8673
  const DarkMode = (ctx) => {
8678
- const sync = () => {
8679
- applyDarkMode([ctx.$root, ctx.get("layerManager").getEl()], ctx.conf.darkMode);
8674
+ let darkModeAutoHandler;
8675
+ const sync = (darkMode) => {
8676
+ const $els = [ctx.$root, ctx.get("layerManager").getEl()];
8677
+ if (!darkModeMedia) {
8678
+ darkModeMedia = window.matchMedia("(prefers-color-scheme: dark)");
8679
+ }
8680
+ if (darkMode === "auto") {
8681
+ if (!darkModeAutoHandler) {
8682
+ darkModeAutoHandler = (evt) => updateClassnames($els, evt.matches);
8683
+ darkModeMedia.addEventListener("change", darkModeAutoHandler);
8684
+ }
8685
+ updateClassnames($els, darkModeMedia.matches);
8686
+ } else {
8687
+ if (darkModeAutoHandler) {
8688
+ darkModeMedia.removeEventListener("change", darkModeAutoHandler);
8689
+ darkModeAutoHandler = void 0;
8690
+ }
8691
+ updateClassnames($els, darkMode);
8692
+ }
8680
8693
  };
8681
- ctx.on("inited", () => sync());
8682
- ctx.on("conf-loaded", () => sync());
8683
- ctx.on("dark-mode-changed", () => sync());
8694
+ ctx.on("inited", () => sync(ctx.conf.darkMode));
8695
+ ctx.on("conf-loaded", (conf) => sync(conf.darkMode));
8696
+ ctx.on("dark-mode-changed", (darkMode) => sync(darkMode));
8697
+ ctx.on("destroy", () => {
8698
+ darkModeAutoHandler && (darkModeMedia == null ? void 0 : darkModeMedia.removeEventListener("change", darkModeAutoHandler));
8699
+ darkModeAutoHandler = void 0;
8700
+ });
8684
8701
  };
8685
8702
  const DefaultPlugins = [
8686
8703
  ConfRemoter,
@@ -8693,7 +8710,7 @@ const DefaultPlugins = [
8693
8710
  DarkMode
8694
8711
  ];
8695
8712
  const GlobalPlugins = [...DefaultPlugins];
8696
- const _Artalk = class _Artalk {
8713
+ class Artalk {
8697
8714
  constructor(conf) {
8698
8715
  __publicField(this, "conf");
8699
8716
  __publicField(this, "ctx");
@@ -8745,9 +8762,12 @@ const _Artalk = class _Artalk {
8745
8762
  setDarkMode(darkMode) {
8746
8763
  this.ctx.setDarkMode(darkMode);
8747
8764
  }
8765
+ // ===========================
8766
+ // Static Members
8767
+ // ===========================
8748
8768
  /** Init Artalk */
8749
8769
  static init(conf) {
8750
- return new _Artalk(conf);
8770
+ return new Artalk(conf);
8751
8771
  }
8752
8772
  /** Use plugin, the plugin will be used when Artalk.init */
8753
8773
  static use(plugin) {
@@ -8766,17 +8786,18 @@ const _Artalk = class _Artalk {
8766
8786
  pvAdd: false
8767
8787
  });
8768
8788
  }
8769
- };
8770
- // ===========================
8771
- // Static Members
8772
- // ===========================
8773
- /** Default Configs */
8774
- __publicField(_Artalk, "defaults", defaults);
8775
- let Artalk = _Artalk;
8789
+ }
8776
8790
  const index = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
8777
8791
  __proto__: null
8778
8792
  }, Symbol.toStringTag, { value: "Module" }));
8793
+ const init = Artalk.init;
8794
+ const use = Artalk.use;
8795
+ const loadCountWidget = Artalk.loadCountWidget;
8779
8796
  export {
8780
8797
  index as ArtalkType,
8781
- Artalk as default
8798
+ Artalk as default,
8799
+ init,
8800
+ loadCountWidget,
8801
+ use
8782
8802
  };
8803
+ //# sourceMappingURL=Artalk.es.js.map