hexo-theme-gnix 12.0.0 → 14.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/include/hexo/generator/archive.js +14 -1
- package/include/hexo/generator/index.js +0 -5
- package/include/hexo/generator/page.js +18 -4
- package/include/hexo/generator/tag.js +1 -1
- package/include/hexo/helper.js +0 -4
- package/include/hexo/i18n.js +31 -136
- package/include/hexo/obsidian-callouts.js +210 -0
- package/include/hexo/renderer.js +4 -14
- package/include/hexo/shiki.js +191 -0
- package/include/hexo/sitemap.js +184 -0
- package/include/util/i18n.js +92 -106
- package/languages/en.yml +4 -10
- package/languages/zh-CN.yml +4 -10
- package/layout/archive.jsx +155 -78
- package/layout/common/article.jsx +94 -108
- package/layout/common/article_cover.jsx +3 -3
- package/layout/common/article_info.jsx +11 -48
- package/layout/common/article_media.jsx +9 -2
- package/layout/common/footer.jsx +17 -106
- package/layout/common/head.jsx +3 -15
- package/layout/common/navbar.jsx +24 -87
- package/layout/common/scripts.jsx +1 -1
- package/layout/layout.jsx +37 -19
- package/layout/plugin/goatcounter.jsx +25 -0
- package/layout/tag.jsx +3 -70
- package/layout/tags.jsx +26 -23
- package/package.json +7 -13
- package/scripts/index.js +1 -0
- package/source/css/archive.css +287 -168
- package/source/css/callout_blocks.css +41 -21
- package/source/css/default.css +154 -132
- package/source/css/optional/mermaid.css +12 -6
- package/source/css/responsive.css +1 -45
- package/source/css/shiki/shiki.css +5 -4
- package/source/css/tags.css +53 -59
- package/source/js/components/archive-popup.js +313 -0
- package/source/js/components/friends-list.js +270 -0
- package/source/js/components/x-info-card.js +297 -0
- package/source/js/main.js +38 -34
- package/source/js/mdit/mermaid.js +10 -0
- package/include/hexo/generator/home.js +0 -64
- package/layout/index.jsx +0 -19
- package/layout/misc/paginator.jsx +0 -69
- package/source/js/host/iconify-icon/3.0.2/iconify-icon.min.js +0 -12
package/source/css/tags.css
CHANGED
|
@@ -8,68 +8,68 @@
|
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
.tags-hero {
|
|
11
|
+
position: relative;
|
|
11
12
|
display: grid;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
align-items: start;
|
|
15
|
-
padding-bottom: 1.25rem;
|
|
13
|
+
gap: 0.6rem;
|
|
14
|
+
padding-bottom: 1.5rem;
|
|
16
15
|
border-bottom: 1px solid var(--tags-line);
|
|
17
16
|
}
|
|
18
17
|
|
|
18
|
+
.tags-hero::after {
|
|
19
|
+
content: "";
|
|
20
|
+
position: absolute;
|
|
21
|
+
bottom: -5px;
|
|
22
|
+
left: 0;
|
|
23
|
+
right: 0;
|
|
24
|
+
height: 2.5px;
|
|
25
|
+
background: color-mix(in oklch, var(--text) 50%, var(--base));
|
|
26
|
+
}
|
|
27
|
+
|
|
19
28
|
.tags-eyebrow {
|
|
20
|
-
|
|
29
|
+
display: flex;
|
|
30
|
+
flex-wrap: wrap;
|
|
31
|
+
align-items: baseline;
|
|
32
|
+
gap: 0.5rem;
|
|
33
|
+
margin: 0;
|
|
21
34
|
color: var(--tags-muted);
|
|
22
35
|
font-family: var(--font-mono);
|
|
23
|
-
font-size: 0.
|
|
36
|
+
font-size: 0.68rem;
|
|
24
37
|
font-weight: 600;
|
|
25
|
-
letter-spacing: 0.
|
|
38
|
+
letter-spacing: 0.18em;
|
|
26
39
|
text-transform: uppercase;
|
|
27
40
|
}
|
|
28
41
|
|
|
29
|
-
.tags-
|
|
30
|
-
|
|
31
|
-
color: var(--text);
|
|
32
|
-
font-family: var(--font-serif);
|
|
33
|
-
font-size: 2.75rem;
|
|
34
|
-
font-weight: 700;
|
|
35
|
-
line-height: 1;
|
|
36
|
-
letter-spacing: 0;
|
|
42
|
+
.tags-hero__sep {
|
|
43
|
+
opacity: 0.3;
|
|
37
44
|
}
|
|
38
45
|
|
|
39
|
-
.tags-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
46
|
+
.tags-hero__roman {
|
|
47
|
+
position: absolute;
|
|
48
|
+
right: 0;
|
|
49
|
+
bottom: 1.5rem;
|
|
50
|
+
color: var(--text);
|
|
43
51
|
font-family: var(--font-serif);
|
|
44
|
-
font-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
.tags-stats > div {
|
|
54
|
-
display: grid;
|
|
55
|
-
grid-template-columns: 4.5rem minmax(0, 1fr);
|
|
56
|
-
gap: 0.65rem;
|
|
57
|
-
align-items: baseline;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
.tags-stats dt {
|
|
61
|
-
color: var(--tags-muted);
|
|
62
|
-
font-family: var(--font-mono);
|
|
63
|
-
font-size: 0.72rem;
|
|
64
|
-
text-transform: uppercase;
|
|
52
|
+
font-size: 5rem;
|
|
53
|
+
font-weight: 400;
|
|
54
|
+
letter-spacing: 0.02em;
|
|
55
|
+
opacity: 0.06;
|
|
56
|
+
line-height: 1;
|
|
57
|
+
pointer-events: none;
|
|
58
|
+
user-select: none;
|
|
65
59
|
}
|
|
66
60
|
|
|
67
|
-
.tags-
|
|
68
|
-
min-width: 0;
|
|
61
|
+
.tags-hero h1 {
|
|
69
62
|
margin: 0;
|
|
70
63
|
color: var(--text);
|
|
71
|
-
font-
|
|
72
|
-
|
|
64
|
+
font-family: var(--font-serif);
|
|
65
|
+
font-style: italic;
|
|
66
|
+
font-synthesis: none;
|
|
67
|
+
font-size: 3.5rem;
|
|
68
|
+
font-weight: 500;
|
|
69
|
+
line-height: 1;
|
|
70
|
+
letter-spacing: -0.02em;
|
|
71
|
+
position: relative;
|
|
72
|
+
z-index: 1;
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
.tags-index {
|
|
@@ -142,23 +142,12 @@
|
|
|
142
142
|
gap: 1.25rem;
|
|
143
143
|
}
|
|
144
144
|
|
|
145
|
-
.tags-hero {
|
|
146
|
-
grid-template-columns: 1fr;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
145
|
.tags-hero h1 {
|
|
150
|
-
font-size: 2.
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
.tags-stats {
|
|
154
|
-
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
155
|
-
gap: 0.5rem;
|
|
146
|
+
font-size: 2.6rem;
|
|
156
147
|
}
|
|
157
148
|
|
|
158
|
-
.tags-
|
|
159
|
-
|
|
160
|
-
border-left: 1px solid color-mix(in oklch, var(--tags-line) 72%, transparent);
|
|
161
|
-
padding: 0 0 0 0.6rem;
|
|
149
|
+
.tags-hero__roman {
|
|
150
|
+
font-size: 3.5rem;
|
|
162
151
|
}
|
|
163
152
|
}
|
|
164
153
|
|
|
@@ -168,7 +157,12 @@
|
|
|
168
157
|
}
|
|
169
158
|
|
|
170
159
|
.tags-hero h1 {
|
|
171
|
-
font-size:
|
|
160
|
+
font-size: 2.1rem;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.tags-hero__roman {
|
|
164
|
+
font-size: 2.5rem;
|
|
165
|
+
opacity: 0.04;
|
|
172
166
|
}
|
|
173
167
|
|
|
174
168
|
.tags-index {
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
const HOVER_DELAY = 180;
|
|
2
|
+
const CLOSE_DELAY = 140;
|
|
3
|
+
|
|
4
|
+
const coarsePointerQuery = typeof window.matchMedia === "function" ? window.matchMedia("(hover: none)") : null;
|
|
5
|
+
let coarsePointer = coarsePointerQuery?.matches ?? false;
|
|
6
|
+
coarsePointerQuery?.addEventListener?.("change", (event) => {
|
|
7
|
+
coarsePointer = event.matches;
|
|
8
|
+
if (coarsePointer) close();
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
let popupEl = null;
|
|
12
|
+
let excerptEl = null;
|
|
13
|
+
let indexEl = null;
|
|
14
|
+
let sepEl = null;
|
|
15
|
+
let readEl = null;
|
|
16
|
+
let openTimer = null;
|
|
17
|
+
let closeTimer = null;
|
|
18
|
+
let activeItem = null;
|
|
19
|
+
let populatedItem = null;
|
|
20
|
+
let popupSize = null;
|
|
21
|
+
let scrollFrame = 0;
|
|
22
|
+
|
|
23
|
+
const accentCache = new WeakMap();
|
|
24
|
+
const indexCache = new WeakMap();
|
|
25
|
+
let indexCacheBuilt = false;
|
|
26
|
+
|
|
27
|
+
function ensurePopup() {
|
|
28
|
+
if (popupEl) return popupEl;
|
|
29
|
+
|
|
30
|
+
popupEl = document.createElement("div");
|
|
31
|
+
popupEl.className = "archive-popup";
|
|
32
|
+
popupEl.setAttribute("aria-hidden", "true");
|
|
33
|
+
popupEl.innerHTML = `
|
|
34
|
+
<p class="archive-popup__eyebrow">
|
|
35
|
+
<span class="archive-popup__index"></span>
|
|
36
|
+
<span class="archive-popup__sep" hidden> · </span>
|
|
37
|
+
<span class="archive-popup__read" hidden></span>
|
|
38
|
+
</p>
|
|
39
|
+
<div class="archive-popup__excerpt"></div>
|
|
40
|
+
`;
|
|
41
|
+
document.body.appendChild(popupEl);
|
|
42
|
+
|
|
43
|
+
excerptEl = popupEl.querySelector(".archive-popup__excerpt");
|
|
44
|
+
indexEl = popupEl.querySelector(".archive-popup__index");
|
|
45
|
+
sepEl = popupEl.querySelector(".archive-popup__sep");
|
|
46
|
+
readEl = popupEl.querySelector(".archive-popup__read");
|
|
47
|
+
|
|
48
|
+
popupEl.addEventListener("pointerenter", clearCloseTimer);
|
|
49
|
+
popupEl.addEventListener("pointerleave", scheduleClose);
|
|
50
|
+
|
|
51
|
+
return popupEl;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function clearOpenTimer() {
|
|
55
|
+
if (openTimer) {
|
|
56
|
+
clearTimeout(openTimer);
|
|
57
|
+
openTimer = null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function clearCloseTimer() {
|
|
62
|
+
if (closeTimer) {
|
|
63
|
+
clearTimeout(closeTimer);
|
|
64
|
+
closeTimer = null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function clearTimers() {
|
|
69
|
+
clearOpenTimer();
|
|
70
|
+
clearCloseTimer();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function getItemIndex(item) {
|
|
74
|
+
const cached = indexCache.get(item);
|
|
75
|
+
if (cached !== undefined) return cached;
|
|
76
|
+
if (!indexCacheBuilt) {
|
|
77
|
+
const items = document.querySelectorAll(".archive-item");
|
|
78
|
+
items.forEach((el, i) => {
|
|
79
|
+
indexCache.set(el, String(i + 1).padStart(3, "0"));
|
|
80
|
+
});
|
|
81
|
+
indexCacheBuilt = true;
|
|
82
|
+
}
|
|
83
|
+
return indexCache.get(item) ?? null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function getGroupAccent(group) {
|
|
87
|
+
if (!group) return null;
|
|
88
|
+
const cached = accentCache.get(group);
|
|
89
|
+
if (cached !== undefined) return cached;
|
|
90
|
+
const accent = getComputedStyle(group).getPropertyValue("--archive-accent").trim();
|
|
91
|
+
accentCache.set(group, accent);
|
|
92
|
+
return accent;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function populate(item) {
|
|
96
|
+
ensurePopup();
|
|
97
|
+
if (populatedItem === item) return;
|
|
98
|
+
|
|
99
|
+
const readTime = item.dataset.readTime || "";
|
|
100
|
+
const excerptTemplate = item.querySelector(".archive-item__excerpt");
|
|
101
|
+
|
|
102
|
+
const accent = getGroupAccent(item.closest(".archive-group"));
|
|
103
|
+
if (accent) popupEl.style.setProperty("--popup-accent", accent);
|
|
104
|
+
|
|
105
|
+
const idx = getItemIndex(item);
|
|
106
|
+
indexEl.textContent = idx ? `N° ${idx}` : "";
|
|
107
|
+
if (readTime) {
|
|
108
|
+
readEl.textContent = readTime.replace(/min$/i, "min read").toUpperCase();
|
|
109
|
+
readEl.hidden = false;
|
|
110
|
+
sepEl.hidden = !idx;
|
|
111
|
+
} else {
|
|
112
|
+
readEl.textContent = "";
|
|
113
|
+
readEl.hidden = true;
|
|
114
|
+
sepEl.hidden = true;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
excerptEl.innerHTML = excerptTemplate ? excerptTemplate.innerHTML : "";
|
|
118
|
+
populatedItem = item;
|
|
119
|
+
popupSize = null;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function position(item) {
|
|
123
|
+
const margin = 12;
|
|
124
|
+
const viewportW = window.innerWidth;
|
|
125
|
+
const viewportH = window.innerHeight;
|
|
126
|
+
|
|
127
|
+
const RIGHT_VIEWPORT_MIN = 1280;
|
|
128
|
+
const RIGHT_POPUP_WIDTH = 208;
|
|
129
|
+
|
|
130
|
+
const rect = item.getBoundingClientRect();
|
|
131
|
+
const availableRight = viewportW - rect.right - margin;
|
|
132
|
+
const canPlaceRight = viewportW >= RIGHT_VIEWPORT_MIN && availableRight >= RIGHT_POPUP_WIDTH + margin;
|
|
133
|
+
|
|
134
|
+
// Only mutate dataset (and invalidate size cache) when the width-affecting
|
|
135
|
+
// placement actually changes — "below" and "above" share dimensions.
|
|
136
|
+
const wasRight = popupEl.dataset.placement === "right";
|
|
137
|
+
if (wasRight !== canPlaceRight) {
|
|
138
|
+
popupEl.dataset.placement = canPlaceRight ? "right" : "below";
|
|
139
|
+
popupSize = null;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (!popupSize) {
|
|
143
|
+
const popupRect = popupEl.getBoundingClientRect();
|
|
144
|
+
popupSize = { width: popupRect.width, height: popupRect.height };
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (canPlaceRight) {
|
|
148
|
+
const left = rect.right + margin + window.scrollX;
|
|
149
|
+
let top = rect.top + window.scrollY - 4;
|
|
150
|
+
const minTop = window.scrollY + margin;
|
|
151
|
+
const maxTop = window.scrollY + viewportH - popupSize.height - margin;
|
|
152
|
+
if (top > maxTop) top = maxTop;
|
|
153
|
+
if (top < minTop) top = minTop;
|
|
154
|
+
popupEl.style.top = `${top}px`;
|
|
155
|
+
popupEl.style.left = `${left}px`;
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const spaceBelow = viewportH - rect.bottom;
|
|
160
|
+
const spaceAbove = rect.top;
|
|
161
|
+
const placeBelow = spaceBelow >= popupSize.height + margin || spaceBelow >= spaceAbove;
|
|
162
|
+
|
|
163
|
+
const top = placeBelow
|
|
164
|
+
? rect.bottom + margin + window.scrollY
|
|
165
|
+
: rect.top - popupSize.height - margin + window.scrollY;
|
|
166
|
+
|
|
167
|
+
let left = rect.left + window.scrollX;
|
|
168
|
+
const maxLeft = window.scrollX + viewportW - popupSize.width - margin;
|
|
169
|
+
if (left > maxLeft) left = maxLeft;
|
|
170
|
+
if (left < window.scrollX + margin) left = window.scrollX + margin;
|
|
171
|
+
|
|
172
|
+
popupEl.style.top = `${top}px`;
|
|
173
|
+
popupEl.style.left = `${left}px`;
|
|
174
|
+
const finalPlacement = placeBelow ? "below" : "above";
|
|
175
|
+
if (popupEl.dataset.placement !== finalPlacement) {
|
|
176
|
+
popupEl.dataset.placement = finalPlacement;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function open(item) {
|
|
181
|
+
ensurePopup();
|
|
182
|
+
if (activeItem === item && popupEl.classList.contains("is-open")) return;
|
|
183
|
+
activeItem = item;
|
|
184
|
+
populate(item);
|
|
185
|
+
position(item);
|
|
186
|
+
popupEl.classList.add("is-open");
|
|
187
|
+
popupEl.setAttribute("aria-hidden", "false");
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function close() {
|
|
191
|
+
if (!popupEl) return;
|
|
192
|
+
popupEl.classList.remove("is-open");
|
|
193
|
+
popupEl.setAttribute("aria-hidden", "true");
|
|
194
|
+
activeItem = null;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function scheduleOpen(item) {
|
|
198
|
+
clearTimers();
|
|
199
|
+
openTimer = window.setTimeout(() => open(item), HOVER_DELAY);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function scheduleClose() {
|
|
203
|
+
clearTimers();
|
|
204
|
+
closeTimer = window.setTimeout(() => {
|
|
205
|
+
if (!popupEl) return;
|
|
206
|
+
if (popupEl.matches(":hover")) return;
|
|
207
|
+
if (popupEl.contains(document.activeElement)) return;
|
|
208
|
+
if (document.querySelector(".archive-item.has-preview:hover")) return;
|
|
209
|
+
const focused = document.activeElement;
|
|
210
|
+
if (focused?.closest?.(".archive-item.has-preview")) return;
|
|
211
|
+
close();
|
|
212
|
+
}, CLOSE_DELAY);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function handlePointerOver(event) {
|
|
216
|
+
if (coarsePointer) return;
|
|
217
|
+
const item = event.target.closest(".archive-item.has-preview");
|
|
218
|
+
if (!item) return;
|
|
219
|
+
const from = event.relatedTarget;
|
|
220
|
+
if (from && item.contains(from)) return;
|
|
221
|
+
scheduleOpen(item);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function handlePointerOut(event) {
|
|
225
|
+
if (coarsePointer) return;
|
|
226
|
+
const item = event.target.closest(".archive-item.has-preview");
|
|
227
|
+
if (!item) return;
|
|
228
|
+
const to = event.relatedTarget;
|
|
229
|
+
if (to && item.contains(to)) return;
|
|
230
|
+
clearOpenTimer();
|
|
231
|
+
scheduleClose();
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function handleFocusIn(event) {
|
|
235
|
+
if (coarsePointer) return;
|
|
236
|
+
const item = event.target.closest(".archive-item.has-preview");
|
|
237
|
+
if (!item) return;
|
|
238
|
+
clearTimers();
|
|
239
|
+
open(item);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function handleFocusOut(event) {
|
|
243
|
+
const item = event.target.closest(".archive-item.has-preview");
|
|
244
|
+
if (!item && !event.target.closest?.(".archive-popup")) return;
|
|
245
|
+
scheduleClose();
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function handleScroll() {
|
|
249
|
+
if (!activeItem || !popupEl?.classList.contains("is-open")) return;
|
|
250
|
+
if (scrollFrame) return;
|
|
251
|
+
scrollFrame = requestAnimationFrame(() => {
|
|
252
|
+
scrollFrame = 0;
|
|
253
|
+
if (activeItem && popupEl?.classList.contains("is-open")) {
|
|
254
|
+
position(activeItem);
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function handleResize() {
|
|
260
|
+
popupSize = null;
|
|
261
|
+
handleScroll();
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
let boundArchivePage = null;
|
|
265
|
+
let globalListenersBound = false;
|
|
266
|
+
|
|
267
|
+
function unbindArchivePage() {
|
|
268
|
+
if (!boundArchivePage) return;
|
|
269
|
+
boundArchivePage.removeEventListener("pointerover", handlePointerOver);
|
|
270
|
+
boundArchivePage.removeEventListener("pointerout", handlePointerOut);
|
|
271
|
+
boundArchivePage = null;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
function resetPerPageState() {
|
|
275
|
+
populatedItem = null;
|
|
276
|
+
popupSize = null;
|
|
277
|
+
indexCacheBuilt = false;
|
|
278
|
+
clearTimers();
|
|
279
|
+
close();
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function initArchivePopup() {
|
|
283
|
+
const archivePage = document.querySelector(".archive-page");
|
|
284
|
+
|
|
285
|
+
// Left the archive page (or navigated to a page without one): tear down.
|
|
286
|
+
if (!archivePage) {
|
|
287
|
+
unbindArchivePage();
|
|
288
|
+
resetPerPageState();
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
if (coarsePointer) return;
|
|
293
|
+
|
|
294
|
+
// Same element we already bound to (re-init on same page): nothing to do.
|
|
295
|
+
if (boundArchivePage === archivePage) return;
|
|
296
|
+
|
|
297
|
+
// New archive-page element (Swup swap): rebind to it and drop stale state.
|
|
298
|
+
unbindArchivePage();
|
|
299
|
+
resetPerPageState();
|
|
300
|
+
|
|
301
|
+
boundArchivePage = archivePage;
|
|
302
|
+
archivePage.addEventListener("pointerover", handlePointerOver);
|
|
303
|
+
archivePage.addEventListener("pointerout", handlePointerOut);
|
|
304
|
+
|
|
305
|
+
if (globalListenersBound) return;
|
|
306
|
+
globalListenersBound = true;
|
|
307
|
+
document.addEventListener("focusin", handleFocusIn);
|
|
308
|
+
document.addEventListener("focusout", handleFocusOut);
|
|
309
|
+
window.addEventListener("scroll", handleScroll, { passive: true });
|
|
310
|
+
window.addEventListener("resize", handleResize, { passive: true });
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
window.__gnixInitArchivePopup = initArchivePopup;
|