elykia 1.0.18 → 1.0.20

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.
@@ -3,38 +3,29 @@ const elykia = {
3
3
  setWelcome_info: async () => {
4
4
  if (!document.getElementById("welcome-info")) return;
5
5
 
6
- let ipLoacation = saveToLocal.get('welcome-info');
7
-
8
6
  try {
9
- if (!ipLoacation) {
10
- return new Promise((resolve, reject) => {
11
- var script = document.createElement('script');
12
- var url = `https://apis.map.qq.com/ws/location/v1/ip?key=TNLBZ-FS2LQ-4X257-4ACX6-OP673-62BFJ&output=jsonp`;
13
- script.src = url;
7
+ return new Promise((resolve, reject) => {
8
+ var script = document.createElement('script');
9
+ var url = `https://apis.map.qq.com/ws/location/v1/ip?key=TNLBZ-FS2LQ-4X257-4ACX6-OP673-62BFJ&output=jsonp&callback=QQmap`;
10
+ script.src = url;
14
11
 
15
- window.QQmap = (data) => {
16
- if (data.status === 0) {
17
- // console.info(data);
18
- ipLoacation = data;
19
- saveToLocal.set('welcome-info', ipLoacation, 0.5);
20
- elykia.showWelcome(ipLoacation);
21
- resolve();
22
- } else {
23
- reject(new Error('Failed to fetch location data'));
24
- }
25
- document.body.removeChild(script);
26
- delete window.QQmap;
27
- };
28
- document.body.appendChild(script);
29
- });
30
- } else {
31
- await Promise.resolve(); // 确保在同步代码路径上也能保持异步风格
32
- elykia.showWelcome(ipLoacation);
33
- }
12
+ window.QQmap = (data) => {
13
+ if (data.status === 0) {
14
+ elykia.showWelcome(data);
15
+ resolve();
16
+ } else {
17
+ reject(new Error('Failed to fetch location data'));
18
+ }
19
+ document.body.removeChild(script);
20
+ delete window.QQmap;
21
+ };
22
+ document.body.appendChild(script);
23
+ });
34
24
  } catch (err) {
35
25
  console.error("Error fetching data:", err);
36
26
  }
37
27
  },
28
+
38
29
  //根据经纬度计算两点距离(点1经度,点1纬度,点2经度,点2纬度)
39
30
  getDistance: (e1, n1, e2, n2) => {
40
31
  const R = 6371
@@ -50,13 +41,20 @@ const elykia = {
50
41
  let r = asin(c / 2) * 2 * R
51
42
  return Math.round(r);
52
43
  },
44
+
53
45
  //根据国家、省份、城市信息自定义欢迎语
54
46
  showWelcome: (ipStore) => {
55
47
  const WelcomeInfo = document.getElementById("welcome-info"),
56
48
  IP = ipStore.result.ip || "未知";
57
- let dist = elykia.getDistance(113.625000, 34.747201, ipStore.result.location.lng, ipStore.result.location.lat),
49
+ let dist = elykia.getDistance(
50
+ 113.625000,
51
+ 34.747201,
52
+ ipStore.result.location.lng,
53
+ ipStore.result.location.lat
54
+ ),
58
55
  address,
59
56
  welcome_info;
57
+
60
58
  //根据国家、省份、城市信息自定义欢迎语
61
59
  //海外地区不支持省份及城市信息
62
60
  switch (ipStore.result.ad_info.nation) {
@@ -85,7 +83,13 @@ const elykia = {
85
83
  welcome_info = "拾起一片枫叶赠予你";
86
84
  break;
87
85
  case "中国":
88
- address = ipStore.result.ad_info.province + " " + ipStore.result.ad_info.city+ " " + ipStore.result.ad_info.district;
86
+ address =
87
+ ipStore.result.ad_info.province +
88
+ " " +
89
+ ipStore.result.ad_info.city +
90
+ " " +
91
+ ipStore.result.ad_info.district;
92
+
89
93
  switch (ipStore.result.ad_info.province) {
90
94
  case "北京市":
91
95
  address = "北京市";
@@ -97,16 +101,19 @@ const elykia = {
97
101
  break;
98
102
  case "重庆市":
99
103
  address = "重庆市";
100
- welcome_info = "高德地图:已到达重庆,下面交给百度地图导航"
104
+ welcome_info =
105
+ "高德地图:已到达重庆,下面交给百度地图导航";
101
106
  break;
102
107
  case "河北省":
103
- welcome_info = "山势巍巍成壁垒,天下雄关。铁马金戈由此向,无限江山";
108
+ welcome_info =
109
+ "山势巍巍成壁垒,天下雄关。铁马金戈由此向,无限江山";
104
110
  break;
105
111
  case "山西省":
106
112
  welcome_info = "展开坐具长三尺,已占山河五百余";
107
113
  break;
108
114
  case "内蒙古自治区":
109
- welcome_info = "天苍苍,野茫茫,风吹草低见牛羊";
115
+ welcome_info =
116
+ "天苍苍,野茫茫,风吹草低见牛羊";
110
117
  break;
111
118
  case "辽宁省":
112
119
  welcome_info = "我想吃烤鸡架";
@@ -119,28 +126,33 @@ const elykia = {
119
126
  break;
120
127
  case "上海市":
121
128
  address = "上海市";
122
- welcome_info = "众所周知,中国只有两个城市";
129
+ welcome_info =
130
+ "众所周知,中国只有两个城市";
123
131
  break;
124
132
  case "江苏省":
125
133
  switch (ipStore.result.ad_info.city) {
126
134
  case "南京市":
127
- welcome_info = "欢迎来自安徽省南京市的小伙伴";
135
+ welcome_info =
136
+ "欢迎来自安徽省南京市的小伙伴";
128
137
  break;
129
138
  case "苏州市":
130
139
  welcome_info = "上有天堂,下有苏杭";
131
140
  break;
132
141
  default:
133
- welcome_info = "散装是必须要散装的";
142
+ welcome_info =
143
+ "散装是必须要散装的";
134
144
  break;
135
145
  }
136
146
  break;
137
147
  case "浙江省":
138
148
  switch (ipStore.result.ad_info.city) {
139
149
  case "杭州市":
140
- welcome_info = "东风渐绿西湖柳,雁已还人未南归";
150
+ welcome_info =
151
+ "东风渐绿西湖柳,雁已还人未南归";
141
152
  break;
142
153
  default:
143
- welcome_info = "望海楼明照曙霞,护江堤白蹋晴沙";
154
+ welcome_info =
155
+ "望海楼明照曙霞,护江堤白蹋晴沙";
144
156
  break;
145
157
  }
146
158
  break;
@@ -151,15 +163,18 @@ const elykia = {
151
163
  welcome_info = "井邑白云间,岩城远带山";
152
164
  break;
153
165
  case "江西省":
154
- welcome_info = "落霞与孤鹜齐飞,秋水共长天一色";
166
+ welcome_info =
167
+ "落霞与孤鹜齐飞,秋水共长天一色";
155
168
  break;
156
169
  case "山东省":
157
- welcome_info = "遥望齐州九点烟,一泓海水杯中泻";
170
+ welcome_info =
171
+ "遥望齐州九点烟,一泓海水杯中泻";
158
172
  break;
159
173
  case "湖北省":
160
174
  switch (ipStore.result.ad_info.city) {
161
175
  case "黄冈市":
162
- welcome_info = "红安将军县!辈出将才!";
176
+ welcome_info =
177
+ "红安将军县!辈出将才!";
163
178
  break;
164
179
  default:
165
180
  welcome_info = "来碗热干面~";
@@ -172,16 +187,19 @@ const elykia = {
172
187
  case "广东省":
173
188
  switch (ipStore.result.ad_info.city) {
174
189
  case "广州市":
175
- welcome_info = "看小蛮腰,喝早茶了嘛~";
190
+ welcome_info =
191
+ "看小蛮腰,喝早茶了嘛~";
176
192
  break;
177
193
  case "深圳市":
178
- welcome_info = "今天你逛商场了嘛~";
194
+ welcome_info =
195
+ "今天你逛商场了嘛~";
179
196
  break;
180
197
  case "阳江市":
181
198
  welcome_info = "阳春合水!";
182
199
  break;
183
200
  default:
184
- welcome_info = "老板来两斤福建人";
201
+ welcome_info =
202
+ "老板来两斤福建人";
185
203
  break;
186
204
  }
187
205
  break;
@@ -189,7 +207,8 @@ const elykia = {
189
207
  welcome_info = "桂林山水甲天下";
190
208
  break;
191
209
  case "海南省":
192
- welcome_info = "朝观日出逐白浪,夕看云起收霞光";
210
+ welcome_info =
211
+ "朝观日出逐白浪,夕看云起收霞光";
193
212
  break;
194
213
  case "四川省":
195
214
  welcome_info = "康康川妹子";
@@ -197,122 +216,189 @@ const elykia = {
197
216
  case "贵州省":
198
217
  switch (ipStore.result.ad_info.city) {
199
218
  case "六盘水市":
200
- welcome_info = "凉都六盘水,您好";
219
+ welcome_info =
220
+ "凉都六盘水,您好";
201
221
  break;
202
222
  case "贵阳市":
203
- welcome_info = "爽爽贵阳,您好";
223
+ welcome_info =
224
+ "爽爽贵阳,您好";
204
225
  break;
205
226
  case "遵义市":
206
- welcome_info = "遵义红城,您好";
227
+ welcome_info =
228
+ "遵义红城,您好";
207
229
  break;
208
230
  case "安顺市":
209
- welcome_info = "安顺福地,您好";
231
+ welcome_info =
232
+ "安顺福地,您好";
210
233
  break;
211
234
  case "毕节市":
212
- welcome_info = "毕节山水,您好";
235
+ welcome_info =
236
+ "毕节山水,您好";
213
237
  break;
214
238
  case "铜仁市":
215
- welcome_info = "铜仁梵净,您好";
239
+ welcome_info =
240
+ "铜仁梵净,您好";
216
241
  break;
217
242
  case "黔西南布依族苗族自治州":
218
- welcome_info = "黔西南风情,您好";
243
+ welcome_info =
244
+ "黔西南风情,您好";
219
245
  break;
220
246
  case "黔东南苗族侗族自治州":
221
- welcome_info = "黔东南歌舞,您好";
247
+ welcome_info =
248
+ "黔东南歌舞,您好";
222
249
  break;
223
250
  case "黔南布依族苗族自治州":
224
- welcome_info = "黔南美景,您好";
251
+ welcome_info =
252
+ "黔南美景,您好";
225
253
  break;
226
254
  default:
227
- welcome_info = "茅台,学生,再塞200";
255
+ welcome_info =
256
+ "茅台,学生,再塞200";
228
257
  break;
229
258
  }
230
259
  break;
231
260
  case "云南省":
232
- welcome_info = "玉龙飞舞云缠绕,万仞冰川直耸天";
261
+ welcome_info =
262
+ "玉龙飞舞云缠绕,万仞冰川直耸天";
233
263
  break;
234
264
  case "西藏自治区":
235
- welcome_info = "躺在茫茫草原上,仰望蓝天";
265
+ welcome_info =
266
+ "躺在茫茫草原上,仰望蓝天";
236
267
  break;
237
268
  case "陕西省":
238
269
  welcome_info = "来份臊子面加馍";
239
270
  break;
240
271
  case "甘肃省":
241
- welcome_info = "羌笛何须怨杨柳,春风不度玉门关";
272
+ welcome_info =
273
+ "羌笛何须怨杨柳,春风不度玉门关";
242
274
  break;
243
275
  case "青海省":
244
- welcome_info = "牛肉干和老酸奶都好好吃";
276
+ welcome_info =
277
+ "牛肉干和老酸奶都好好吃";
245
278
  break;
246
279
  case "宁夏回族自治区":
247
- welcome_info = "大漠孤烟直,长河落日圆";
280
+ welcome_info =
281
+ "大漠孤烟直,长河落日圆";
248
282
  break;
249
283
  case "新疆维吾尔自治区":
250
- welcome_info = "驼铃古道丝绸路,胡马犹闻唐汉风";
284
+ welcome_info =
285
+ "驼铃古道丝绸路,胡马犹闻唐汉风";
251
286
  break;
252
287
  case "台湾省":
253
- welcome_info = "我在这头,大陆在那头";
288
+ welcome_info =
289
+ "我在这头,大陆在那头";
254
290
  break;
255
291
  case "香港特别行政区":
256
292
  address = "香港特别行政区";
257
- welcome_info = "永定贼有残留地鬼嚎,迎击光非岁玉";
293
+ welcome_info =
294
+ "永定贼有残留地鬼嚎,迎击光非岁玉";
258
295
  break;
259
296
  case "澳门特别行政区":
260
297
  address = "澳门特别行政区";
261
- welcome_info = "性感荷官,在线发牌";
298
+ welcome_info =
299
+ "性感荷官,在线发牌";
262
300
  break;
263
301
  case "河南省":
264
302
  switch (ipStore.result.ad_info.city) {
265
303
  case "郑州市":
266
- welcome_info = "豫州之域,天地之中";
304
+ welcome_info =
305
+ "豫州之域,天地之中";
267
306
  break;
268
307
  case "南阳市":
269
- welcome_info = "臣本布衣,躬耕于南阳此南阳非彼南阳!";
308
+ welcome_info =
309
+ "臣本布衣,躬耕于南阳此南阳非彼南阳!";
270
310
  break;
271
311
  case "驻马店市":
272
- welcome_info = "峰峰有奇石,石石挟仙气嵖岈山的花很美哦!";
312
+ welcome_info =
313
+ "峰峰有奇石,石石挟仙气嵖岈山的花很美哦!";
273
314
  break;
274
315
  case "开封市":
275
- welcome_info = "刚正不阿包青天!";
316
+ welcome_info =
317
+ "刚正不阿包青天!";
276
318
  break;
277
319
  case "洛阳市":
278
- welcome_info = "洛阳牡丹甲天下";
320
+ welcome_info =
321
+ "洛阳牡丹甲天下";
279
322
  break;
280
323
  case "平顶山市":
281
- welcome_info = "QQ市~ 博主家乡~ 欢迎来玩~!";
324
+ welcome_info =
325
+ "QQ市~ 博主家乡~ 欢迎来玩~!";
282
326
  break;
283
327
  default:
284
- welcome_info = "可否带我品尝河南烩面啦?";
328
+ welcome_info =
329
+ "可否带我品尝河南烩面啦?";
285
330
  break;
286
331
  }
287
332
  break;
288
333
  default:
289
- welcome_info = "带我去你的城市逛逛吧";
334
+ welcome_info =
335
+ "带我去你的城市逛逛吧";
290
336
  break;
291
337
  }
292
338
  break;
293
339
  default:
294
- welcome_info = "带我去你的国家看看吧";
340
+ welcome_info =
341
+ "带我去你的国家看看吧";
295
342
  break;
296
343
  }
344
+
297
345
  //判断时间
298
346
  let timeChange,
299
347
  date = new Date();
300
- if (date.getHours() >= 5 && date.getHours() < 11) timeChange = "<span>🌤️上午好,一日之计在于晨</span>";
301
- else if (date.getHours() >= 11 && date.getHours() < 13) timeChange = "<span>☀️中午好,该摸鱼吃午饭了</span>";
302
- else if (date.getHours() >= 13 && date.getHours() < 15) timeChange = "<span>🕞下午好,懒懒地睡个午觉吧</span>";
303
- else if (date.getHours() >= 15 && date.getHours() < 16) timeChange = "<span>🍵三点几啦,饮茶先啦</span>";
304
- else if (date.getHours() >= 16 && date.getHours() < 18) timeChange = "<span>🚶‍♂️即将下班,记得按时吃饭~</span>";
305
- else if (date.getHours() >= 18 && date.getHours() < 19) timeChange = "<span>🌇夕阳无限好,只是近黄昏</span>";
306
- else if (date.getHours() >= 19 && date.getHours() < 24) timeChange = "<span>🌔晚上好,夜生活嗨起来</span>";
307
- else timeChange = "🌌夜深了,早点休息,少熬夜";
348
+ if (date.getHours() >= 5 && date.getHours() < 11)
349
+ timeChange =
350
+ "<span>🌤️上午好,一日之计在于晨</span>";
351
+ else if (
352
+ date.getHours() >= 11 &&
353
+ date.getHours() < 13
354
+ )
355
+ timeChange =
356
+ "<span>☀️中午好,该摸鱼吃午饭了</span>";
357
+ else if (
358
+ date.getHours() >= 13 &&
359
+ date.getHours() < 15
360
+ )
361
+ timeChange =
362
+ "<span>🕞下午好,懒懒地睡个午觉吧</span>";
363
+ else if (
364
+ date.getHours() >= 15 &&
365
+ date.getHours() < 16
366
+ )
367
+ timeChange =
368
+ "<span>🍵三点几啦,饮茶先啦</span>";
369
+ else if (
370
+ date.getHours() >= 16 &&
371
+ date.getHours() < 18
372
+ )
373
+ timeChange =
374
+ "<span>🚶‍♂️即将下班,记得按时吃饭~</span>";
375
+ else if (
376
+ date.getHours() >= 18 &&
377
+ date.getHours() < 19
378
+ )
379
+ timeChange =
380
+ "<span>🌇夕阳无限好,只是近黄昏</span>";
381
+ else if (
382
+ date.getHours() >= 19 &&
383
+ date.getHours() < 24
384
+ )
385
+ timeChange =
386
+ "<span>🌔晚上好,夜生活嗨起来</span>";
387
+ else
388
+ timeChange =
389
+ "🌌夜深了,早点休息,少熬夜";
308
390
 
309
- //自定义文本需要放的位置
310
- WelcomeInfo && (WelcomeInfo.innerHTML = `
391
+ WelcomeInfo &&
392
+ (WelcomeInfo.innerHTML = `
311
393
  欢迎来自 <strong>${address}</strong> 的小伙伴🍂<br>
312
394
  <strong>${welcome_info}!</strong><br>
313
395
  您距离 <strong>Elykia</strong> 约有 <strong>${dist}</strong> 公里!<br>
314
396
  您的IP地址为:<strong>${IP}</strong><br>
315
397
  <strong>${timeChange}!</strong>`);
316
398
  },
317
- }
399
+ };
318
400
 
401
+ // 页面加载后执行
402
+ document.addEventListener("DOMContentLoaded", () => {
403
+ elykia.setWelcome_info();
404
+ });
package/license ADDED
@@ -0,0 +1 @@
1
+ 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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "elykia",
3
- "version": "1.0.18",
3
+ "version": "1.0.20",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "author": "Elykia",
package/countdown.js DELETED
@@ -1,201 +0,0 @@
1
- const CountdownTimer = (() => {
2
- const config = {
3
- targetDate: "2025-12-20",
4
- targetName: "考研",
5
- units: {
6
- day: { text: "今日", divider: 1, unit: "小时" },
7
- week: { text: "本周", divider: 24, unit: "天" },
8
- month: { text: "本月", divider: 24, unit: "天" },
9
- year: { text: "本年", divider: 24, unit: "天" }
10
- }
11
- };
12
-
13
- function getTimeUnit(unit) {
14
- const now = new Date();
15
- const start = new Date(now.setHours(0, 0, 0, 0));
16
- const end = new Date(now.setHours(23, 59, 59, 999));
17
-
18
- if (unit === 'day') {
19
- const currentHour = new Date().getHours();
20
- const remaining = 24 - currentHour;
21
- const percentage = (currentHour / 24) * 100;
22
-
23
- return {
24
- name: config.units[unit].text,
25
- remaining: remaining,
26
- percentage: percentage.toFixed(2),
27
- unit: config.units[unit].unit
28
- };
29
- }
30
-
31
- const ranges = {
32
- week: () => {
33
- start.setDate(start.getDate() - start.getDay());
34
- end.setDate(end.getDate() - end.getDay() + 6);
35
- },
36
- month: () => {
37
- start.setDate(1);
38
- end.setMonth(end.getMonth() + 1, 0);
39
- },
40
- year: () => {
41
- start.setMonth(0, 1);
42
- end.setMonth(11, 31);
43
- }
44
- };
45
- ranges[unit]?.();
46
-
47
- const total = unit === "day" ? 24 : Math.floor((end - start) / 86400000) + 1;
48
- const passed = Math.floor((now - start) / (3600000 * config.units[unit].divider));
49
- const percentage = (passed / total) * 100;
50
-
51
- return {
52
- name: config.units[unit].text,
53
- remaining: total - passed,
54
- percentage: percentage.toFixed(2),
55
- unit: config.units[unit].unit
56
- };
57
- }
58
-
59
- function updateCountdown() {
60
- const elements = ['eventName', 'eventDate', 'daysUntil', 'countRight']
61
- .map(id => document.getElementById(id));
62
-
63
- if (elements.some(el => !el)) return;
64
-
65
- const [eventName, eventDate, daysUntil, countRight] = elements;
66
- const timeData = Object.keys(config.units).reduce((acc, unit) => ({...acc, [unit]: getTimeUnit(unit)}), {});
67
- const daysRemaining = Math.round((new Date(config.targetDate) - new Date().setHours(0,0,0,0)) / 86400000);
68
-
69
- eventName.textContent = config.targetName;
70
- eventDate.textContent = config.targetDate;
71
- daysUntil.textContent = daysRemaining;
72
- countRight.innerHTML = Object.entries(timeData)
73
- .map(([_, item]) => `
74
- <div class="cd-count-item">
75
- <div class="cd-item-name">${item.name}</div>
76
- <div class="cd-item-progress">
77
- <div class="cd-progress-bar" style="width: ${item.percentage}%; opacity: ${item.percentage/100}"></div>
78
- <span class="cd-percentage ${item.percentage >= 46 ? 'cd-many' : ''}">${item.percentage}%</span>
79
- <span class="cd-remaining ${item.percentage >= 60 ? 'cd-many' : ''}">
80
- <span class="cd-tip">还剩</span>${item.remaining}<span class="cd-tip">${item.unit}</span>
81
- </span>
82
- </div>
83
- </div>
84
- `).join('');
85
- }
86
-
87
- function injectStyles() {
88
- const styles = `
89
- .card-countdown .item-content {
90
- display: flex;
91
- }
92
- .cd-count-left {
93
- position: relative;
94
- display: flex;
95
- flex-direction: column;
96
- margin-right: 0.8rem;
97
- line-height: 1.5;
98
- align-items: center;
99
- justify-content: center;
100
- }
101
- .cd-count-left .cd-text {
102
- font-size: 14px;
103
- }
104
- .cd-count-left .cd-name {
105
- font-weight: bold;
106
- font-size: 18px;
107
- }
108
- .cd-count-left .cd-time {
109
- font-size: 30px;
110
- font-weight: bold;
111
- color: var(--anzhiyu-main);
112
- }
113
- .cd-count-left .cd-date {
114
- font-size: 12px;
115
- opacity: 0.6;
116
- }
117
- .cd-count-left::after {
118
- content: "";
119
- position: absolute;
120
- right: -0.8rem;
121
- width: 2px;
122
- height: 80%;
123
- background-color: var(--anzhiyu-main);
124
- opacity: 0.5;
125
- }
126
- .cd-count-right {
127
- flex: 1;
128
- margin-left: .8rem;
129
- display: flex;
130
- flex-direction: column;
131
- justify-content: space-between;
132
- }
133
- .cd-count-item {
134
- display: flex;
135
- flex-direction: row;
136
- align-items: center;
137
- height: 24px;
138
- }
139
- .cd-item-name {
140
- font-size: 14px;
141
- margin-right: 0.8rem;
142
- white-space: nowrap;
143
- }
144
- .cd-item-progress {
145
- position: relative;
146
- display: flex;
147
- flex-direction: row;
148
- align-items: center;
149
- justify-content: space-between;
150
- height: 100%;
151
- width: 100%;
152
- border-radius: 8px;
153
- background-color: var(--anzhiyu-background);
154
- overflow: hidden;
155
- }
156
- .cd-progress-bar {
157
- height: 100%;
158
- border-radius: 8px;
159
- background-color: var(--anzhiyu-main);
160
- }
161
- .cd-percentage,
162
- .cd-remaining {
163
- position: absolute;
164
- font-size: 12px;
165
- margin: 0 6px;
166
- transition: opacity 0.3s ease-in-out, transform 0.3s ease-in-out;
167
- }
168
- .cd-many {
169
- color: #fff;
170
- }
171
- .cd-remaining {
172
- opacity: 0;
173
- transform: translateX(10px);
174
- }
175
- .card-countdown .item-content:hover .cd-remaining {
176
- transform: translateX(0);
177
- opacity: 1;
178
- }
179
- .card-countdown .item-content:hover .cd-percentage {
180
- transform: translateX(-10px);
181
- opacity: 0;
182
- }
183
- `;
184
-
185
- const styleSheet = document.createElement("style");
186
- styleSheet.textContent = styles;
187
- document.head.appendChild(styleSheet);
188
- }
189
-
190
- let timer;
191
- const start = () => {
192
- injectStyles();
193
- updateCountdown();
194
- timer = setInterval(updateCountdown, 600000);
195
- };
196
-
197
- ['pjax:complete', 'DOMContentLoaded'].forEach(event => document.addEventListener(event, start));
198
- document.addEventListener('pjax:send', () => timer && clearInterval(timer));
199
-
200
- return { start, stop: () => timer && clearInterval(timer) };
201
- })();