@gerege-systems/eid-mongolia-sdk 0.12.1 → 0.14.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.
@@ -0,0 +1,952 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/button.ts
21
+ var button_exports = {};
22
+ __export(button_exports, {
23
+ EidLoginButton: () => EidLoginButton,
24
+ defineEidLoginButton: () => defineEidLoginButton,
25
+ mountEidLoginButton: () => mountEidLoginButton
26
+ });
27
+ module.exports = __toCommonJS(button_exports);
28
+
29
+ // src/devicelink.ts
30
+ function isMobileUserAgent(nav) {
31
+ const n = nav ?? globalThis.navigator;
32
+ if (!n) return false;
33
+ if (n.userAgentData?.mobile === true) return true;
34
+ const ua = n.userAgent ?? "";
35
+ if (/Android|iPhone|iPod|iPad/i.test(ua)) return true;
36
+ return /Macintosh/.test(ua) && (n.maxTouchPoints ?? 0) > 1;
37
+ }
38
+
39
+ // src/logo.ts
40
+ var EID_LOGO_DATA_URI = "data:image/png;base64,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";
41
+
42
+ // src/qr.ts
43
+ var ECC_PER_BLOCK_M = [
44
+ -1,
45
+ 10,
46
+ 16,
47
+ 26,
48
+ 18,
49
+ 24,
50
+ 16,
51
+ 18,
52
+ 22,
53
+ 22,
54
+ 26,
55
+ 30,
56
+ 22,
57
+ 22,
58
+ 24,
59
+ 24,
60
+ 28,
61
+ 28,
62
+ 26,
63
+ 26,
64
+ 26,
65
+ 26,
66
+ 28,
67
+ 28,
68
+ 28,
69
+ 28,
70
+ 28,
71
+ 28,
72
+ 28,
73
+ 28,
74
+ 28,
75
+ 28,
76
+ 28,
77
+ 28,
78
+ 28,
79
+ 28,
80
+ 28,
81
+ 28,
82
+ 28,
83
+ 28,
84
+ 28
85
+ ];
86
+ var BLOCKS_M = [
87
+ -1,
88
+ 1,
89
+ 1,
90
+ 1,
91
+ 2,
92
+ 2,
93
+ 4,
94
+ 4,
95
+ 4,
96
+ 5,
97
+ 5,
98
+ 5,
99
+ 8,
100
+ 9,
101
+ 9,
102
+ 10,
103
+ 10,
104
+ 11,
105
+ 13,
106
+ 14,
107
+ 16,
108
+ 17,
109
+ 17,
110
+ 18,
111
+ 20,
112
+ 21,
113
+ 23,
114
+ 25,
115
+ 26,
116
+ 28,
117
+ 29,
118
+ 31,
119
+ 33,
120
+ 35,
121
+ 37,
122
+ 38,
123
+ 40,
124
+ 43,
125
+ 45,
126
+ 47,
127
+ 49
128
+ ];
129
+ var FORMAT_BITS_M = 0;
130
+ function rawModules(ver) {
131
+ let r = (16 * ver + 128) * ver + 64;
132
+ if (ver >= 2) {
133
+ const n = Math.floor(ver / 7) + 2;
134
+ r -= (25 * n - 10) * n - 55;
135
+ if (ver >= 7) r -= 36;
136
+ }
137
+ return r;
138
+ }
139
+ function dataCodewords(ver) {
140
+ return Math.floor(rawModules(ver) / 8) - ECC_PER_BLOCK_M[ver] * BLOCKS_M[ver];
141
+ }
142
+ function gfMul(x, y) {
143
+ let z = 0;
144
+ for (let i = 7; i >= 0; i--) {
145
+ z = z << 1 ^ (z >>> 7) * 285;
146
+ z ^= (y >>> i & 1) * x;
147
+ }
148
+ return z;
149
+ }
150
+ function rsDivisor(degree) {
151
+ const r = new Array(degree).fill(0);
152
+ r[degree - 1] = 1;
153
+ let root = 1;
154
+ for (let i = 0; i < degree; i++) {
155
+ for (let j = 0; j < r.length; j++) {
156
+ r[j] = gfMul(r[j], root);
157
+ if (j + 1 < r.length) r[j] ^= r[j + 1];
158
+ }
159
+ root = gfMul(root, 2);
160
+ }
161
+ return r;
162
+ }
163
+ function rsRemainder(data, divisor) {
164
+ const r = divisor.map(() => 0);
165
+ for (const b of data) {
166
+ const f = b ^ r.shift();
167
+ r.push(0);
168
+ divisor.forEach((c, i) => r[i] ^= gfMul(c, f));
169
+ }
170
+ return r;
171
+ }
172
+ function encodeQr(text) {
173
+ const bytes = Array.from(new TextEncoder().encode(text));
174
+ let ver = 1;
175
+ for (; ; ver++) {
176
+ if (ver > 40) throw new Error("qr: \u04E9\u0433\u04E9\u0433\u0434\u04E9\u043B \u0445\u044D\u0442 \u0443\u0440\u0442");
177
+ const bits = 4 + (ver <= 9 ? 8 : 16) + bytes.length * 8;
178
+ if (bits <= dataCodewords(ver) * 8) break;
179
+ }
180
+ const bb = [];
181
+ const put = (v, n) => {
182
+ for (let i2 = n - 1; i2 >= 0; i2--) bb.push(v >>> i2 & 1);
183
+ };
184
+ put(4, 4);
185
+ put(bytes.length, ver <= 9 ? 8 : 16);
186
+ for (const b of bytes) put(b, 8);
187
+ const cap = dataCodewords(ver) * 8;
188
+ put(0, Math.min(4, cap - bb.length));
189
+ put(0, (8 - bb.length % 8) % 8);
190
+ for (let pad = 236; bb.length < cap; pad ^= 236 ^ 17) put(pad, 8);
191
+ const data = [];
192
+ for (let i2 = 0; i2 < bb.length; i2 += 8) data.push(parseInt(bb.slice(i2, i2 + 8).join(""), 2));
193
+ const nBlocks = BLOCKS_M[ver];
194
+ const eccLen = ECC_PER_BLOCK_M[ver];
195
+ const raw = Math.floor(rawModules(ver) / 8);
196
+ const nShort = nBlocks - raw % nBlocks;
197
+ const shortLen = Math.floor(raw / nBlocks);
198
+ const div = rsDivisor(eccLen);
199
+ const blocks = [];
200
+ for (let i2 = 0, k = 0; i2 < nBlocks; i2++) {
201
+ const dat = data.slice(k, k + shortLen - eccLen + (i2 < nShort ? 0 : 1));
202
+ k += dat.length;
203
+ const ecc = rsRemainder(dat, div);
204
+ if (i2 < nShort) dat.push(0);
205
+ blocks.push(dat.concat(ecc));
206
+ }
207
+ const codewords = [];
208
+ for (let i2 = 0; i2 < blocks[0].length; i2++) {
209
+ blocks.forEach((b, j) => {
210
+ if (i2 !== shortLen - eccLen || j >= nShort) codewords.push(b[i2]);
211
+ });
212
+ }
213
+ const size = ver * 4 + 17;
214
+ const mod = Array.from({ length: size }, () => new Array(size).fill(false));
215
+ const fn = Array.from({ length: size }, () => new Array(size).fill(false));
216
+ const set = (x, y, dark) => {
217
+ mod[y][x] = dark;
218
+ fn[y][x] = true;
219
+ };
220
+ for (let i2 = 0; i2 < size; i2++) {
221
+ set(6, i2, i2 % 2 === 0);
222
+ set(i2, 6, i2 % 2 === 0);
223
+ }
224
+ for (const [cx, cy] of [[3, 3], [size - 4, 3], [3, size - 4]]) {
225
+ for (let dy = -4; dy <= 4; dy++) {
226
+ for (let dx = -4; dx <= 4; dx++) {
227
+ const d = Math.max(Math.abs(dx), Math.abs(dy));
228
+ const x = cx + dx;
229
+ const y = cy + dy;
230
+ if (x >= 0 && x < size && y >= 0 && y < size) set(x, y, d !== 2 && d !== 4);
231
+ }
232
+ }
233
+ }
234
+ const align = [];
235
+ if (ver > 1) {
236
+ const n = Math.floor(ver / 7) + 2;
237
+ const step = ver === 32 ? 26 : Math.ceil((ver * 4 + 4) / (n * 2 - 2)) * 2;
238
+ align.push(6);
239
+ for (let p = size - 7; align.length < n; p -= step) align.splice(1, 0, p);
240
+ }
241
+ const na = align.length;
242
+ for (let i2 = 0; i2 < na; i2++) {
243
+ for (let j = 0; j < na; j++) {
244
+ if (i2 === 0 && j === 0 || i2 === 0 && j === na - 1 || i2 === na - 1 && j === 0) continue;
245
+ for (let dy = -2; dy <= 2; dy++) {
246
+ for (let dx = -2; dx <= 2; dx++) set(align[i2] + dx, align[j] + dy, Math.max(Math.abs(dx), Math.abs(dy)) !== 1);
247
+ }
248
+ }
249
+ }
250
+ const bit = (v, i2) => (v >>> i2 & 1) !== 0;
251
+ const drawFormat = (mask) => {
252
+ const d = FORMAT_BITS_M << 3 | mask;
253
+ let rem = d;
254
+ for (let i2 = 0; i2 < 10; i2++) rem = rem << 1 ^ (rem >>> 9) * 1335;
255
+ const bits = (d << 10 | rem) ^ 21522;
256
+ for (let i2 = 0; i2 <= 5; i2++) set(8, i2, bit(bits, i2));
257
+ set(8, 7, bit(bits, 6));
258
+ set(8, 8, bit(bits, 7));
259
+ set(7, 8, bit(bits, 8));
260
+ for (let i2 = 9; i2 < 15; i2++) set(14 - i2, 8, bit(bits, i2));
261
+ for (let i2 = 0; i2 < 8; i2++) set(size - 1 - i2, 8, bit(bits, i2));
262
+ for (let i2 = 8; i2 < 15; i2++) set(8, size - 15 + i2, bit(bits, i2));
263
+ set(8, size - 8, true);
264
+ };
265
+ drawFormat(0);
266
+ if (ver >= 7) {
267
+ let rem = ver;
268
+ for (let i2 = 0; i2 < 12; i2++) rem = rem << 1 ^ (rem >>> 11) * 7973;
269
+ const bits = ver << 12 | rem;
270
+ for (let i2 = 0; i2 < 18; i2++) {
271
+ const a = size - 11 + i2 % 3;
272
+ const b = Math.floor(i2 / 3);
273
+ set(a, b, bit(bits, i2));
274
+ set(b, a, bit(bits, i2));
275
+ }
276
+ }
277
+ let i = 0;
278
+ for (let right = size - 1; right >= 1; right -= 2) {
279
+ if (right === 6) right = 5;
280
+ for (let vert = 0; vert < size; vert++) {
281
+ for (let j = 0; j < 2; j++) {
282
+ const x = right - j;
283
+ const y = (right + 1 & 2) === 0 ? size - 1 - vert : vert;
284
+ if (!fn[y][x] && i < codewords.length * 8) {
285
+ mod[y][x] = bit(codewords[i >>> 3], 7 - (i & 7));
286
+ i++;
287
+ }
288
+ }
289
+ }
290
+ }
291
+ const applyMask = (m) => {
292
+ for (let y = 0; y < size; y++) {
293
+ for (let x = 0; x < size; x++) {
294
+ if (fn[y][x]) continue;
295
+ let inv;
296
+ switch (m) {
297
+ case 0:
298
+ inv = (x + y) % 2 === 0;
299
+ break;
300
+ case 1:
301
+ inv = y % 2 === 0;
302
+ break;
303
+ case 2:
304
+ inv = x % 3 === 0;
305
+ break;
306
+ case 3:
307
+ inv = (x + y) % 3 === 0;
308
+ break;
309
+ case 4:
310
+ inv = (Math.floor(x / 3) + Math.floor(y / 2)) % 2 === 0;
311
+ break;
312
+ case 5:
313
+ inv = x * y % 2 + x * y % 3 === 0;
314
+ break;
315
+ case 6:
316
+ inv = (x * y % 2 + x * y % 3) % 2 === 0;
317
+ break;
318
+ default:
319
+ inv = ((x + y) % 2 + x * y % 3) % 2 === 0;
320
+ }
321
+ if (inv) mod[y][x] = !mod[y][x];
322
+ }
323
+ }
324
+ };
325
+ let best = 0;
326
+ let bestScore = Infinity;
327
+ for (let m = 0; m < 8; m++) {
328
+ applyMask(m);
329
+ drawFormat(m);
330
+ const s = penalty(mod, size);
331
+ if (s < bestScore) {
332
+ best = m;
333
+ bestScore = s;
334
+ }
335
+ applyMask(m);
336
+ }
337
+ applyMask(best);
338
+ drawFormat(best);
339
+ return { size, modules: mod };
340
+ }
341
+ function penalty(m, size) {
342
+ let s = 0;
343
+ const at = (x, y, horiz) => horiz ? m[y][x] : m[x][y];
344
+ for (const horiz of [true, false]) {
345
+ for (let a = 0; a < size; a++) {
346
+ let run = 1;
347
+ for (let b = 1; b <= size; b++) {
348
+ if (b < size && at(b, a, horiz) === at(b - 1, a, horiz)) {
349
+ run++;
350
+ } else {
351
+ if (run >= 5) s += run - 2;
352
+ run = 1;
353
+ }
354
+ }
355
+ for (let b = 0; b + 7 <= size; b++) {
356
+ const p = [1, 0, 1, 1, 1, 0, 1].every((v, k) => at(b + k, a, horiz) === (v === 1));
357
+ if (!p) continue;
358
+ const light = (from) => {
359
+ for (let k = from; k < from + 4; k++) if (k >= 0 && k < size && at(k, a, horiz)) return false;
360
+ return true;
361
+ };
362
+ if (light(b - 4) || light(b + 7)) s += 40;
363
+ }
364
+ }
365
+ }
366
+ let dark = 0;
367
+ for (let y = 0; y < size; y++) {
368
+ for (let x = 0; x < size; x++) {
369
+ if (m[y][x]) dark++;
370
+ if (x < size - 1 && y < size - 1) {
371
+ const c = m[y][x];
372
+ if (c === m[y][x + 1] && c === m[y + 1][x] && c === m[y + 1][x + 1]) s += 3;
373
+ }
374
+ }
375
+ }
376
+ const total = size * size;
377
+ s += (Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1) * 10;
378
+ return s;
379
+ }
380
+ function qrSvgPath(q, border = 4) {
381
+ let d = "";
382
+ for (let y = 0; y < q.size; y++) {
383
+ for (let x = 0; x < q.size; x++) {
384
+ if (q.modules[y][x]) d += `M${x + border},${y + border}h1v1h-1z`;
385
+ }
386
+ }
387
+ return d;
388
+ }
389
+
390
+ // src/button.ts
391
+ var T = {
392
+ mn: {
393
+ button: "eID-\u044D\u044D\u0440 \u043D\u044D\u0432\u0442\u0440\u044D\u0445",
394
+ title: "eID-\u044D\u044D\u0440 \u043D\u044D\u0432\u0442\u0440\u044D\u0445",
395
+ close: "\u0425\u0430\u0430\u0445",
396
+ loading: "\u0410\u0447\u0430\u0430\u043B\u0436 \u0431\u0430\u0439\u043D\u0430",
397
+ qrAlt: "\u041D\u044D\u0432\u0442\u0440\u044D\u0445 QR \u043A\u043E\u0434 \u2014 \u0443\u0442\u0441\u0430\u043D \u0434\u044D\u044D\u0440\u0445 eID Mongolia \u0430\u043F\u043F\u0430\u0430\u0440 \u0443\u043D\u0448\u0443\u0443\u043B\u043D\u0430",
398
+ steps: ["\u0423\u0442\u0441\u0430\u043D \u0434\u044D\u044D\u0440\u0445 eID Mongolia \u0430\u043F\u043F\u044B\u0433 \u043D\u044D\u044D\u043D\u044D", "QR \u043A\u043E\u0434\u044B\u0433 \u0443\u043D\u0448\u0443\u0443\u043B\u043D\u0430", "PIN1 \u043A\u043E\u0434\u043E\u043E \u043E\u0440\u0443\u0443\u043B\u043D\u0430"],
399
+ code: "\u0423\u0442\u0441\u0430\u043D \u0434\u044D\u044D\u0440\u0445 \u043A\u043E\u0434:",
400
+ or: "\u044D\u0441\u0432\u044D\u043B",
401
+ idLabel: "\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0439\u043D \u0434\u0443\u0433\u0430\u0430\u0440",
402
+ idHint: "\u0423\u0442\u0441\u0430\u043D\u0434 \u0442\u0430\u043D\u044C \u043C\u044D\u0434\u044D\u0433\u0434\u044D\u043B \u043E\u0447\u043D\u043E. \u0418\u0440\u0433\u044D\u043D\u0438\u0439 12 \u043E\u0440\u043E\u043D\u0442\u043E\u0439 \u0434\u0443\u0433\u0430\u0430\u0440\u0430\u0430\u0440 \u0447 \u0431\u043E\u043B\u043D\u043E.",
403
+ idEmpty: "\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0439\u043D \u0434\u0443\u0433\u0430\u0430\u0440 \u043E\u0440\u0443\u0443\u043B\u043D\u0430 \u0443\u0443",
404
+ idLatin: "\u04AE\u0441\u0433\u0438\u0439\u0433 \u043A\u0438\u0440\u0438\u043B\u043B\u044D\u044D\u0440 \u0431\u0438\u0447\u043D\u044D \u04AF\u04AF: \u0423\u041112345678",
405
+ idBad: "\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0439\u043D \u0434\u0443\u0433\u0430\u0430\u0440 2 \u04AF\u0441\u044D\u0433, 8 \u0446\u0438\u0444\u0440\u0442\u044D\u0439 \u0431\u0430\u0439\u043D\u0430: \u0423\u041112345678",
406
+ push: "\u041C\u044D\u0434\u044D\u0433\u0434\u044D\u043B \u0438\u043B\u0433\u044D\u044D\u0445",
407
+ pushing: "\u0418\u043B\u0433\u044D\u044D\u0436 \u0431\u0430\u0439\u043D\u0430",
408
+ rateLimited: "\u0425\u044D\u0442 \u043E\u043B\u043E\u043D \u043E\u0440\u043E\u043B\u0434\u043B\u043E\u0433\u043E. \u0422\u04AF\u0440 \u0445\u04AF\u043B\u044D\u044D\u0433\u044D\u044D\u0434 \u0434\u0430\u0445\u0438\u043D \u043E\u0440\u043E\u043B\u0434\u043E\u043D\u043E \u0443\u0443",
409
+ pushFailed: "\u041C\u044D\u0434\u044D\u0433\u0434\u044D\u043B \u0438\u043B\u0433\u044D\u044D\u0436 \u0447\u0430\u0434\u0441\u0430\u043D\u0433\u04AF\u0439. \u0414\u0430\u0445\u0438\u043D \u043E\u0440\u043E\u043B\u0434\u043E\u043D\u043E \u0443\u0443",
410
+ waitText: "\u0423\u0442\u0441\u0430\u043D \u0434\u044D\u044D\u0440\u0445 \u043A\u043E\u0434 \u0438\u0436\u0438\u043B \u0431\u043E\u043B PIN1 \u043E\u0440\u0443\u0443\u043B\u043D\u0430 \u0443\u0443. \u0418\u0436\u0438\u043B \u0431\u0438\u0448 \u0431\u043E\u043B \u0442\u0430\u0442\u0433\u0430\u043B\u0437\u0430\u043D\u0430 \u0443\u0443.",
411
+ waiting: "\u0425\u04AF\u043B\u044D\u044D\u0436 \u0431\u0430\u0439\u043D\u0430",
412
+ back: "\u0411\u0443\u0446\u0430\u0445",
413
+ left: "\u04AE\u043B\u0434\u0441\u044D\u043D \u0445\u0443\u0433\u0430\u0446\u0430\u0430",
414
+ stale: "QR \u043A\u043E\u0434 \u0445\u0443\u0443\u0447\u0438\u0440\u0441\u0430\u043D",
415
+ refresh: "\u0428\u0438\u043D\u044D\u0447\u043B\u044D\u0445",
416
+ offline: "\u0425\u043E\u043B\u0431\u043E\u043B\u0442 \u0442\u0430\u0441\u0430\u0440\u0441\u0430\u043D. \u0418\u043D\u0442\u0435\u0440\u043D\u044D\u0442\u044D\u044D \u0448\u0430\u043B\u0433\u0430\u043D\u0430 \u0443\u0443 \u2014 \u0434\u0430\u0445\u0438\u043D \u0445\u043E\u043B\u0431\u043E\u0433\u0434\u043E\u0445\u044B\u0433 \u043E\u0440\u043E\u043B\u0434\u043E\u0436 \u0431\u0430\u0439\u043D\u0430.",
417
+ expiredTitle: "\u041D\u044D\u0432\u0442\u0440\u044D\u043B\u0442\u0438\u0439\u043D \u0445\u0443\u0433\u0430\u0446\u0430\u0430 \u0434\u0443\u0443\u0441\u0441\u0430\u043D",
418
+ refusedTitle: "\u041D\u044D\u0432\u0442\u0440\u044D\u043B\u0442\u044D\u044D\u0441 \u0442\u0430\u0442\u0433\u0430\u043B\u0437\u0441\u0430\u043D",
419
+ failedTitle: "\u041D\u044D\u0432\u0442\u044D\u0440\u0447 \u0447\u0430\u0434\u0441\u0430\u043D\u0433\u04AF\u0439",
420
+ failedText: "\u0411\u0430\u0442\u0430\u043B\u0433\u0430\u0430\u0436\u0443\u0443\u043B\u0430\u043B\u0442 \u0430\u043C\u0436\u0438\u043B\u0442\u0433\u04AF\u0439 \u0431\u043E\u043B\u043B\u043E\u043E. \u0414\u0430\u0445\u0438\u043D \u043E\u0440\u043E\u043B\u0434\u043E\u043D\u043E \u0443\u0443.",
421
+ unavailable: "eID \u04AF\u0439\u043B\u0447\u0438\u043B\u0433\u044D\u044D\u043D\u0434 \u0445\u043E\u043B\u0431\u043E\u0433\u0434\u043E\u0436 \u0447\u0430\u0434\u0441\u0430\u043D\u0433\u04AF\u0439. \u0422\u04AF\u0440 \u0445\u04AF\u043B\u044D\u044D\u0433\u044D\u044D\u0434 \u0434\u0430\u0445\u0438\u043D \u043E\u0440\u043E\u043B\u0434\u043E\u043D\u043E \u0443\u0443.",
422
+ callbackTitle: "\u0423\u0442\u0441\u0430\u043D \u0434\u044D\u044D\u0440\u0445 \u0445\u04E9\u0442\u0447\u04E9\u04E9\u0440 \u04AF\u0440\u0433\u044D\u043B\u0436\u0438\u043B\u043D\u044D",
423
+ callbackText: "\u0411\u0430\u0442\u0430\u043B\u0433\u0430\u0430\u0436\u0443\u0443\u043B\u0430\u043B\u0442 \u0430\u043C\u0436\u0438\u043B\u0442\u0442\u0430\u0439. \u0410\u043F\u043F\u0430\u0430\u0441 \u043D\u044D\u044D\u0433\u0434\u0441\u044D\u043D \u0445\u04E9\u0442\u0447\u0438\u0439\u043D \u0446\u043E\u043D\u0445\u043E\u043D\u0434 \u043D\u044D\u0432\u0442\u0440\u044D\u043B\u0442 \u04AF\u0440\u0433\u044D\u043B\u0436\u0438\u043B\u043D\u044D.",
424
+ retry: "\u0414\u0430\u0445\u0438\u043D \u043E\u0440\u043E\u043B\u0434\u043E\u0445",
425
+ success: "\u0410\u043C\u0436\u0438\u043B\u0442\u0442\u0430\u0439 \u043D\u044D\u0432\u0442\u044D\u0440\u043B\u044D\u044D",
426
+ sent: (vc) => `\u041C\u044D\u0434\u044D\u0433\u0434\u044D\u043B \u0438\u043B\u0433\u044D\u044D\u043B\u044D\u044D. \u0423\u0442\u0441\u0430\u043D \u0434\u044D\u044D\u0440\u0445 \u043A\u043E\u0434 ${vc.split("").join(" ")}`,
427
+ minute: "1 \u043C\u0438\u043D\u0443\u0442 \u04AF\u043B\u0434\u043B\u044D\u044D"
428
+ },
429
+ en: {
430
+ button: "Log in with eID",
431
+ title: "Log in with eID",
432
+ close: "Close",
433
+ loading: "Loading",
434
+ qrAlt: "Login QR code \u2014 scan it with the eID Mongolia app on your phone",
435
+ steps: ["Open the eID Mongolia app on your phone", "Scan the QR code", "Enter your PIN1"],
436
+ code: "Code on your phone:",
437
+ or: "or",
438
+ idLabel: "Registration number",
439
+ idHint: "A notification will be sent to your phone. The 12-digit civil ID also works.",
440
+ idEmpty: "Enter your registration number",
441
+ idLatin: "Use Cyrillic letters: \u0423\u041112345678",
442
+ idBad: "Registration number is 2 letters and 8 digits: \u0423\u041112345678",
443
+ push: "Send notification",
444
+ pushing: "Sending",
445
+ rateLimited: "Too many attempts. Please wait and try again",
446
+ pushFailed: "Could not send the notification. Please try again",
447
+ waitText: "If the code on your phone matches, enter PIN1. Otherwise decline.",
448
+ waiting: "Waiting",
449
+ back: "Back",
450
+ left: "Time left",
451
+ stale: "QR code expired",
452
+ refresh: "Refresh",
453
+ offline: "Connection lost. Check your internet \u2014 reconnecting.",
454
+ expiredTitle: "Login expired",
455
+ refusedTitle: "Login declined",
456
+ failedTitle: "Login failed",
457
+ failedText: "Verification failed. Please try again.",
458
+ unavailable: "Could not reach the eID service. Please try again shortly.",
459
+ callbackTitle: "Continue in your phone's browser",
460
+ callbackText: "Verified. Login continues in the browser window the app opened.",
461
+ retry: "Try again",
462
+ success: "Logged in",
463
+ sent: (vc) => `Notification sent. Code on your phone ${vc.split("").join(" ")}`,
464
+ minute: "1 minute left"
465
+ }
466
+ };
467
+ var CSS = `
468
+ :host { display: inline-block;
469
+ --eid-bg: hsl(0 0% 100%); --eid-bg-subtle: hsl(210 40% 98%); --eid-bg-muted: hsl(210 40% 96%);
470
+ --eid-fg: hsl(222 47% 11%); --eid-fg-muted: hsl(215 19% 35%); --eid-fg-subtle: hsl(215 16% 45%);
471
+ --eid-border: hsl(214 32% 91%); --eid-border-strong: hsl(213 27% 84%);
472
+ --eid-accent: oklch(0.534 0.2 259); --eid-accent-fg: #fff; --eid-accent-subtle: oklch(0.97 0.03 259);
473
+ --eid-accent-subtle-fg: oklch(0.474 0.19 259); --eid-ring: oklch(0.604 0.2 259);
474
+ --eid-warning-bg: hsl(48 100% 96%); --eid-warning-border: hsl(45 95% 78%); --eid-warning-fg: hsl(23 75% 33%);
475
+ --eid-danger-fg: hsl(0 74% 42%); --eid-radius: 6px; --eid-radius-lg: 8px; font-family: inherit; }
476
+ @media (prefers-color-scheme: dark) { :host {
477
+ --eid-bg: hsl(229 50% 6%); --eid-bg-subtle: hsl(222 47% 9%); --eid-bg-muted: hsl(217 33% 13%);
478
+ --eid-fg: hsl(210 40% 98%); --eid-fg-muted: hsl(213 27% 84%); --eid-fg-subtle: hsl(215 20% 65%);
479
+ --eid-border: hsl(217 33% 17%); --eid-border-strong: hsl(215 25% 27%);
480
+ --eid-accent: oklch(0.64 0.15 259); --eid-accent-fg: hsl(229 50% 6%); --eid-accent-subtle: oklch(0.24 0.06 259);
481
+ --eid-accent-subtle-fg: oklch(0.82 0.1 259); --eid-ring: oklch(0.68 0.15 259);
482
+ --eid-warning-bg: hsl(20 60% 10%); --eid-warning-border: hsl(22 70% 26%); --eid-warning-fg: hsl(40 92% 65%);
483
+ --eid-danger-fg: hsl(0 91% 71%); } }
484
+ *, *::before, *::after { box-sizing: border-box; }
485
+ [hidden] { display: none !important; }
486
+ h2, p, ol { margin: 0; }
487
+ :focus-visible { outline: 2px solid var(--eid-ring); outline-offset: 2px; }
488
+ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
489
+ .btn { display: inline-flex; width: 100%; align-items: center; justify-content: center; gap: 8px; min-height: 44px; padding: 0 20px;
490
+ border-radius: var(--eid-radius); font: 500 1rem/1.25 inherit; text-decoration: none; border: 1px solid transparent; cursor: pointer;
491
+ transition: background-color 160ms cubic-bezier(0,0,0.2,1); }
492
+ .btn:disabled { opacity: 0.6; cursor: progress; }
493
+ .btn-primary { background: var(--eid-accent); color: var(--eid-accent-fg); }
494
+ .btn-primary:hover { background: color-mix(in oklab, var(--eid-accent) 88%, black); }
495
+ .btn-outline { background: var(--eid-bg); color: var(--eid-fg); border-color: var(--eid-border-strong); }
496
+ .btn-outline:hover { background: var(--eid-bg-muted); }
497
+ .btn-sm { width: auto; min-height: 36px; padding: 0 14px; font-size: 0.8125rem; }
498
+ .trigger { width: auto; }
499
+ .trigger img { width: 20px; height: 20px; border-radius: 4px; }
500
+ .backdrop { position: fixed; inset: 0; z-index: 2147483000; background: hsl(222 47% 11% / 0.5); display: flex; align-items: center;
501
+ justify-content: center; padding: 16px; overflow-y: auto; }
502
+ .dialog { position: relative; width: 100%; max-width: 26rem; max-height: calc(100dvh - 32px); overflow-y: auto; background: var(--eid-bg);
503
+ color: var(--eid-fg); border: 1px solid var(--eid-border); border-radius: var(--eid-radius-lg); padding: 24px; font-size: 0.875rem; line-height: 1.5rem; }
504
+ @media (max-width: 639px) { .dialog { padding: 16px; } }
505
+ .head { display: flex; align-items: center; gap: 8px; margin-bottom: 16px; }
506
+ .head img { width: 28px; height: 28px; border-radius: var(--eid-radius); }
507
+ .head h2 { flex: 1; font-size: 1.125rem; line-height: 1.75rem; font-weight: 600; }
508
+ .x { width: 36px; height: 36px; border: 0; border-radius: var(--eid-radius); background: transparent; color: var(--eid-fg-muted); cursor: pointer; font-size: 1.25rem; line-height: 1; }
509
+ .x:hover { background: var(--eid-bg-muted); color: var(--eid-fg); }
510
+ .qr { position: relative; width: 256px; max-width: 100%; aspect-ratio: 1; margin: 0 auto; border: 1px solid var(--eid-border);
511
+ border-radius: var(--eid-radius-lg); background: #fff; overflow: hidden; }
512
+ .qr svg { display: block; width: 100%; height: 100%; }
513
+ .qr.stale svg { opacity: 0.12; }
514
+ .qr-stale { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px;
515
+ color: hsl(222 47% 11%); font-weight: 500; }
516
+ .qr-vc { margin-top: 8px; text-align: center; font-size: 0.8125rem; color: var(--eid-fg-subtle); }
517
+ .mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-variant-numeric: tabular-nums; letter-spacing: 0.08em; color: var(--eid-fg-muted); }
518
+ .steps { margin-top: 16px; padding: 0; list-style: none; counter-reset: st; display: grid; gap: 8px; }
519
+ .steps li { counter-increment: st; display: flex; align-items: center; gap: 12px; }
520
+ .steps li::before { content: counter(st); flex: none; width: 24px; height: 24px; border-radius: 9999px; background: var(--eid-accent-subtle);
521
+ color: var(--eid-accent-subtle-fg); display: flex; align-items: center; justify-content: center; font-size: 0.75rem; font-weight: 600; }
522
+ .or { display: flex; align-items: center; gap: 12px; margin: 24px 0; color: var(--eid-fg-subtle); font-size: 0.8125rem; }
523
+ .or::before, .or::after { content: ""; flex: 1; height: 1px; background: var(--eid-border); }
524
+ .field { display: grid; gap: 8px; }
525
+ .field label { font-weight: 500; }
526
+ .field input { width: 100%; height: 44px; padding: 0 12px; border: 1px solid var(--eid-border-strong); border-radius: var(--eid-radius);
527
+ background: var(--eid-bg); color: var(--eid-fg); font: 1rem/1.5rem inherit; letter-spacing: 0.02em; text-transform: uppercase; }
528
+ .field input::placeholder { color: var(--eid-fg-subtle); text-transform: none; }
529
+ .field input[aria-invalid="true"] { border-color: var(--eid-danger-fg); }
530
+ .hint { font-size: 0.8125rem; color: var(--eid-fg-subtle); }
531
+ .err { font-size: 0.8125rem; color: var(--eid-danger-fg); font-weight: 500; }
532
+ .push { margin-top: 16px; }
533
+ .center { text-align: center; }
534
+ .vc { font: 600 2.25rem/2.5rem ui-monospace, SFMono-Regular, Menlo, monospace; letter-spacing: 0.16em; padding-left: 0.16em; }
535
+ .vc:focus, h2:focus { outline: none; }
536
+ .text { margin-top: 12px; color: var(--eid-fg-muted); }
537
+ .pending { margin-top: 16px; display: inline-flex; align-items: center; gap: 8px; color: var(--eid-fg-muted); }
538
+ .end .btn, .center .btn { margin-top: 24px; }
539
+ .spinner { width: 16px; height: 16px; flex: none; border: 2px solid currentColor; border-right-color: transparent; border-radius: 9999px; animation: spin 0.8s linear infinite; }
540
+ @keyframes spin { to { transform: rotate(360deg); } }
541
+ .netwarn { margin-top: 16px; padding: 8px 12px; border: 1px solid var(--eid-warning-border); border-radius: var(--eid-radius); background: var(--eid-warning-bg);
542
+ color: var(--eid-warning-fg); font-size: 0.8125rem; }
543
+ .meta { margin-top: 16px; font-size: 0.8125rem; color: var(--eid-fg-subtle); }
544
+ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { transition: none !important; }
545
+ .spinner { animation: none; border-right-color: currentColor; opacity: 0.6; } }
546
+ `;
547
+ var ID_RE = /^([А-ЯЁӨҮ]{2}[0-9]{8}|[0-9]{8,14})$/;
548
+ var FOCUSABLE = 'button:not([disabled]), input:not([disabled]), a[href], [tabindex]:not([tabindex="-1"])';
549
+ function el(tag, attrs = {}, text) {
550
+ const e = document.createElement(tag);
551
+ for (const [k, v] of Object.entries(attrs)) e.setAttribute(k, v);
552
+ if (text != null) e.textContent = text;
553
+ return e;
554
+ }
555
+ var Base = typeof HTMLElement === "undefined" ? class {
556
+ } : HTMLElement;
557
+ var EidLoginButton = class extends Base {
558
+ static observedAttributes = ["lang"];
559
+ /** Тест/дотоод: гар утас эсэхийг дарж бичих. */
560
+ isMobile = () => isMobileUserAgent();
561
+ /** Тест/дотоод: шилжилт (location.assign). */
562
+ navigate = (url) => location.assign(url);
563
+ root;
564
+ trigger;
565
+ backdrop = null;
566
+ body;
567
+ live;
568
+ timer = 0;
569
+ tick = 0;
570
+ left = -1;
571
+ fails = 0;
572
+ gen = 0;
573
+ // цонх нээх бүрд нэмэгдэнэ — хуучин fetch-ийн хариуг үл тооно
574
+ lastFocus = null;
575
+ get t() {
576
+ return T[this.getAttribute("lang") === "en" ? "en" : "mn"];
577
+ }
578
+ attr(name, def = "") {
579
+ return this.getAttribute(name) ?? def;
580
+ }
581
+ connectedCallback() {
582
+ if (this.root) return;
583
+ this.root = this.attachShadow({ mode: "open" });
584
+ const style = el("style");
585
+ style.textContent = CSS;
586
+ this.trigger = el("button", { type: "button", class: "btn btn-outline trigger", part: "button", "aria-haspopup": "dialog" });
587
+ this.trigger.append(el("img", { src: EID_LOGO_DATA_URI, alt: "", width: "20", height: "20" }), el("span", {}, this.t.button));
588
+ this.trigger.addEventListener("click", () => this.start());
589
+ this.root.append(style, this.trigger);
590
+ }
591
+ attributeChangedCallback() {
592
+ const label = this.trigger?.querySelector("span");
593
+ if (label) label.textContent = this.t.button;
594
+ }
595
+ disconnectedCallback() {
596
+ this.close();
597
+ }
598
+ /** Товчны үйлдэл (программаар ч дуудаж болно). */
599
+ start() {
600
+ const mode = this.attr("mode", "auto");
601
+ if (mode === "app" || mode === "auto" && this.isMobile()) {
602
+ const u = new URL(this.attr("start-url"), location.href);
603
+ u.searchParams.set("mode", "web2app");
604
+ u.searchParams.set("lang", this.attr("lang") === "en" ? "en" : "mn");
605
+ this.navigate(u.toString());
606
+ return;
607
+ }
608
+ this.open();
609
+ }
610
+ open() {
611
+ this.close();
612
+ const gen = ++this.gen;
613
+ this.lastFocus = this.getRootNode().activeElement ?? document.activeElement;
614
+ const bd = el("div", { class: "backdrop", part: "backdrop" });
615
+ const dlg = el("div", { class: "dialog", role: "dialog", "aria-modal": "true", "aria-labelledby": "eid-title", part: "dialog" });
616
+ const head = el("div", { class: "head" });
617
+ const x = el("button", { type: "button", class: "x", "aria-label": this.t.close }, "\xD7");
618
+ x.addEventListener("click", () => this.close());
619
+ head.append(el("img", { src: EID_LOGO_DATA_URI, alt: "", width: "28", height: "28" }), el("h2", { id: "eid-title" }, this.t.title), x);
620
+ this.body = el("div");
621
+ this.live = el("p", { class: "sr-only", "aria-live": "polite" });
622
+ dlg.append(head, this.body, this.live);
623
+ bd.append(dlg);
624
+ bd.addEventListener("mousedown", (e) => {
625
+ if (e.target === bd) this.close();
626
+ });
627
+ bd.addEventListener("keydown", (e) => this.onKey(e));
628
+ this.root.append(bd);
629
+ this.backdrop = bd;
630
+ this.showLoading();
631
+ x.focus();
632
+ void this.begin(gen, { mode: "qr" });
633
+ }
634
+ /** Цонхыг хааж poll-ийг зогсооно. */
635
+ close() {
636
+ this.gen++;
637
+ clearTimeout(this.timer);
638
+ clearInterval(this.tick);
639
+ if (!this.backdrop) return;
640
+ this.backdrop.remove();
641
+ this.backdrop = null;
642
+ this.lastFocus?.focus?.();
643
+ if (!this.lastFocus) this.trigger.focus();
644
+ }
645
+ onKey(e) {
646
+ if (e.key === "Escape") {
647
+ e.preventDefault();
648
+ this.close();
649
+ return;
650
+ }
651
+ if (e.key !== "Tab" || !this.backdrop) return;
652
+ const items = Array.from(this.backdrop.querySelectorAll(FOCUSABLE)).filter((n) => !n.closest("[hidden]"));
653
+ if (items.length === 0) return;
654
+ const first = items[0];
655
+ const last = items[items.length - 1];
656
+ const active = this.root.activeElement;
657
+ if (e.shiftKey && active === first) {
658
+ e.preventDefault();
659
+ last.focus();
660
+ } else if (!e.shiftKey && active === last) {
661
+ e.preventDefault();
662
+ first.focus();
663
+ }
664
+ }
665
+ say(text) {
666
+ this.live.textContent = text;
667
+ }
668
+ view(...nodes) {
669
+ this.body.replaceChildren(...nodes);
670
+ }
671
+ showLoading() {
672
+ const p = el("p", { class: "pending", role: "status" });
673
+ p.append(el("span", { class: "spinner", "aria-hidden": "true" }), el("span", {}, this.t.loading));
674
+ const c = el("div", { class: "center" });
675
+ c.append(p);
676
+ this.view(c);
677
+ }
678
+ async begin(gen, body) {
679
+ let r;
680
+ try {
681
+ r = await fetch(this.attr("start-url"), {
682
+ method: "POST",
683
+ credentials: "same-origin",
684
+ cache: "no-store",
685
+ headers: { "Content-Type": "application/json" },
686
+ body: JSON.stringify({ ...body, lang: this.attr("lang") === "en" ? "en" : "mn" })
687
+ });
688
+ } catch {
689
+ if (gen === this.gen && body.mode === "qr") this.end("unavailable");
690
+ return null;
691
+ }
692
+ if (gen !== this.gen) return null;
693
+ if (body.mode === "push") return r;
694
+ if (!r.ok) {
695
+ this.end("unavailable");
696
+ return null;
697
+ }
698
+ const s = await r.json();
699
+ this.showQr(s);
700
+ this.startTimer(s.expiresIn ?? -1);
701
+ this.schedule(gen, 1e3);
702
+ return r;
703
+ }
704
+ qrBox;
705
+ qrStale;
706
+ netwarn;
707
+ drawQr(link) {
708
+ const q = encodeQr(link);
709
+ const n = q.size + 8;
710
+ const NS = "http://www.w3.org/2000/svg";
711
+ const svg = document.createElementNS(NS, "svg");
712
+ svg.setAttribute("viewBox", `0 0 ${n} ${n}`);
713
+ svg.setAttribute("role", "img");
714
+ svg.setAttribute("aria-label", this.t.qrAlt);
715
+ svg.setAttribute("shape-rendering", "crispEdges");
716
+ const path = document.createElementNS(NS, "path");
717
+ path.setAttribute("d", qrSvgPath(q));
718
+ path.setAttribute("fill", "#000");
719
+ svg.append(path);
720
+ this.qrBox.querySelector("svg")?.remove();
721
+ this.qrBox.prepend(svg);
722
+ }
723
+ showQr(s) {
724
+ const t = this.t;
725
+ this.qrBox = el("div", { class: "qr" });
726
+ this.qrStale = el("div", { class: "qr-stale", hidden: "" });
727
+ const refresh = el("button", { type: "button", class: "btn btn-outline btn-sm" }, t.refresh);
728
+ refresh.addEventListener("click", () => this.schedule(this.gen, 0));
729
+ this.qrStale.append(el("p", {}, t.stale), refresh);
730
+ this.qrBox.append(this.qrStale);
731
+ if (s.qr) this.drawQr(s.qr);
732
+ const nodes = [this.qrBox];
733
+ if (s.vc) {
734
+ const vc = el("p", { class: "qr-vc" }, t.code + " ");
735
+ vc.append(el("span", { class: "mono" }, s.vc));
736
+ nodes.push(vc);
737
+ }
738
+ const steps = el("ol", { class: "steps" });
739
+ for (const st of t.steps) steps.append(el("li", {}, st));
740
+ nodes.push(steps, el("div", { class: "or", role: "separator", "aria-label": t.or }, t.or), this.pushForm());
741
+ this.netwarn = el("p", { class: "netwarn", role: "status", hidden: "" }, t.offline);
742
+ nodes.push(this.netwarn, this.meta());
743
+ this.view(...nodes);
744
+ }
745
+ leftEl = null;
746
+ meta() {
747
+ const p = el("p", { class: "meta" }, this.t.left + " ");
748
+ this.leftEl = el("span", { class: "mono", role: "timer", "aria-live": "off" }, "--:--");
749
+ p.append(this.leftEl);
750
+ if (this.left < 0) p.hidden = true;
751
+ return p;
752
+ }
753
+ startTimer(seconds) {
754
+ clearInterval(this.tick);
755
+ this.left = seconds;
756
+ const render = () => {
757
+ if (!this.leftEl || this.left < 0) return;
758
+ this.leftEl.parentElement.hidden = false;
759
+ const m = Math.floor(this.left / 60);
760
+ const s = this.left % 60;
761
+ this.leftEl.textContent = `${m < 10 ? "0" : ""}${m}:${s < 10 ? "0" : ""}${s}`;
762
+ if (this.left === 60) this.say(this.t.minute);
763
+ };
764
+ render();
765
+ if (seconds < 0) return;
766
+ this.tick = setInterval(() => {
767
+ this.left -= 1;
768
+ render();
769
+ if (this.left <= 0) this.end("expired");
770
+ }, 1e3);
771
+ }
772
+ pushForm() {
773
+ const t = this.t;
774
+ const form = el("form", { novalidate: "" });
775
+ const field = el("div", { class: "field" });
776
+ const input = el("input", {
777
+ id: "eid-id",
778
+ name: "idCode",
779
+ type: "text",
780
+ autocapitalize: "characters",
781
+ autocomplete: "off",
782
+ autocorrect: "off",
783
+ spellcheck: "false",
784
+ maxlength: "14",
785
+ placeholder: "\u0423\u041112345678",
786
+ "aria-describedby": "eid-id-hint eid-id-err"
787
+ });
788
+ const err = el("p", { class: "err", id: "eid-id-err", hidden: "" });
789
+ field.append(el("label", { for: "eid-id" }, t.idLabel), input, el("p", { class: "hint", id: "eid-id-hint" }, t.idHint), err);
790
+ const btn = el("button", { type: "submit", class: "btn btn-primary push" });
791
+ const spin = el("span", { class: "spinner", hidden: "", "aria-hidden": "true" });
792
+ const label = el("span", {}, t.push);
793
+ btn.append(spin, label);
794
+ form.append(field, btn);
795
+ const check = () => {
796
+ const v = input.value.replace(/\s+/g, "").toUpperCase();
797
+ if (v === "") return t.idEmpty;
798
+ if (ID_RE.test(v)) return "";
799
+ if (/^[A-Z]{2}[0-9]{8}$/.test(v)) return t.idLatin;
800
+ return t.idBad;
801
+ };
802
+ const setErr = (msg) => {
803
+ err.textContent = msg;
804
+ err.hidden = !msg;
805
+ if (msg) input.setAttribute("aria-invalid", "true");
806
+ else input.removeAttribute("aria-invalid");
807
+ };
808
+ const busy = (on) => {
809
+ btn.disabled = on;
810
+ spin.hidden = !on;
811
+ label.textContent = on ? t.pushing : t.push;
812
+ };
813
+ form.addEventListener("submit", (e) => {
814
+ e.preventDefault();
815
+ if (btn.disabled) return;
816
+ const msg = check();
817
+ setErr(msg);
818
+ if (msg) {
819
+ input.focus();
820
+ return;
821
+ }
822
+ busy(true);
823
+ const gen = this.gen;
824
+ void this.begin(gen, { mode: "push", idCode: input.value.replace(/\s+/g, "").toUpperCase() }).then(async (r) => {
825
+ if (gen !== this.gen) return;
826
+ busy(false);
827
+ if (!r) return setErr(t.pushFailed);
828
+ const b = await r.json().catch(() => ({}));
829
+ if (r.ok && b.vc) return this.showWait(b);
830
+ if (r.status === 429) return setErr(t.rateLimited);
831
+ if (r.status === 400) return setErr(t.idBad);
832
+ setErr(t.pushFailed);
833
+ });
834
+ });
835
+ return form;
836
+ }
837
+ showWait(s) {
838
+ const t = this.t;
839
+ const c = el("div", { class: "center" });
840
+ c.append(el("h2", { class: "sr-only" }, t.waiting));
841
+ const vc = el("p", { class: "vc", tabindex: "-1", "aria-describedby": "eid-wait" }, s.vc ?? "");
842
+ const pending = el("p", { class: "pending" });
843
+ pending.append(el("span", { class: "spinner", "aria-hidden": "true" }), el("span", {}, t.waiting));
844
+ const back = el("button", { type: "button", class: "btn btn-outline" }, t.back);
845
+ back.addEventListener("click", () => this.open());
846
+ this.netwarn = el("p", { class: "netwarn", role: "status", hidden: "" }, t.offline);
847
+ c.append(vc, el("p", { class: "text", id: "eid-wait" }, t.waitText), pending, back, this.netwarn, this.meta());
848
+ this.view(c);
849
+ this.startTimer(s.expiresIn ?? -1);
850
+ vc.focus();
851
+ this.say(t.sent(s.vc ?? ""));
852
+ }
853
+ schedule(gen, ms) {
854
+ clearTimeout(this.timer);
855
+ this.timer = setTimeout(() => void this.poll(gen), ms);
856
+ }
857
+ async poll(gen) {
858
+ if (gen !== this.gen) return;
859
+ let s;
860
+ try {
861
+ const r = await fetch(this.attr("status-url"), { credentials: "same-origin", cache: "no-store" });
862
+ if (!r.ok) throw new Error(`status ${r.status}`);
863
+ s = await r.json();
864
+ } catch {
865
+ if (gen !== this.gen) return;
866
+ this.fails++;
867
+ if (this.fails >= 3) {
868
+ this.netwarn.hidden = false;
869
+ this.qrBox?.classList.add("stale");
870
+ if (this.qrStale) this.qrStale.hidden = false;
871
+ }
872
+ this.schedule(gen, 2e3);
873
+ return;
874
+ }
875
+ if (gen !== this.gen) return;
876
+ this.fails = 0;
877
+ this.netwarn.hidden = true;
878
+ this.qrBox?.classList.remove("stale");
879
+ if (this.qrStale) this.qrStale.hidden = true;
880
+ switch (s.state) {
881
+ case "PENDING":
882
+ if (s.qr && this.qrBox?.isConnected) this.drawQr(s.qr);
883
+ if (typeof s.expiresIn === "number" && Math.abs(s.expiresIn - this.left) > 2) this.startTimer(s.expiresIn);
884
+ this.schedule(gen, 1e3);
885
+ return;
886
+ case "OK":
887
+ return this.succeed(s);
888
+ case "WAIT_CALLBACK":
889
+ return this.end("callback");
890
+ case "EXPIRED":
891
+ return this.end("expired");
892
+ default:
893
+ return this.end(s.error && s.error.startsWith("USER_REFUSED") ? "refused" : s.error === "TIMEOUT" ? "expired" : "failed", s.error);
894
+ }
895
+ }
896
+ succeed(s) {
897
+ clearInterval(this.tick);
898
+ const c = el("div", { class: "center" });
899
+ const h = el("h2", { tabindex: "-1" }, this.t.success);
900
+ c.append(h);
901
+ this.view(c);
902
+ h.focus();
903
+ const ev = new CustomEvent("eid-login-success", { detail: s, bubbles: true, composed: true, cancelable: true });
904
+ const go = this.dispatchEvent(ev);
905
+ const to = s.redirect ?? this.getAttribute("success-url");
906
+ if (go && to) this.navigate(to);
907
+ }
908
+ end(kind, error) {
909
+ clearTimeout(this.timer);
910
+ clearInterval(this.tick);
911
+ this.gen++;
912
+ const t = this.t;
913
+ const titles = { expired: t.expiredTitle, refused: t.refusedTitle, failed: t.failedTitle, unavailable: t.failedTitle, callback: t.callbackTitle };
914
+ const c = el("div", { class: "end", role: "alert" });
915
+ const h = el("h2", { tabindex: "-1" }, titles[kind]);
916
+ c.append(h);
917
+ if (kind === "failed") c.append(el("p", { class: "text" }, t.failedText));
918
+ if (kind === "unavailable") c.append(el("p", { class: "text" }, t.unavailable));
919
+ if (kind === "callback") c.append(el("p", { class: "text" }, t.callbackText));
920
+ if (kind !== "callback") {
921
+ const retry = el("button", { type: "button", class: "btn btn-primary" }, t.retry);
922
+ retry.addEventListener("click", () => this.open());
923
+ c.append(retry);
924
+ this.dispatchEvent(new CustomEvent("eid-login-error", { detail: { error: error ?? kind.toUpperCase() }, bubbles: true, composed: true }));
925
+ }
926
+ this.view(c);
927
+ h.focus();
928
+ }
929
+ };
930
+ function defineEidLoginButton(tag = "eid-login-button") {
931
+ if (typeof customElements !== "undefined" && !customElements.get(tag)) customElements.define(tag, EidLoginButton);
932
+ }
933
+ function mountEidLoginButton(target, opts) {
934
+ defineEidLoginButton();
935
+ const b = document.createElement("eid-login-button");
936
+ b.setAttribute("start-url", opts.startUrl);
937
+ b.setAttribute("status-url", opts.statusUrl);
938
+ b.setAttribute("lang", opts.lang ?? "mn");
939
+ if (opts.mode) b.setAttribute("mode", opts.mode);
940
+ if (opts.successUrl) b.setAttribute("success-url", opts.successUrl);
941
+ if (opts.onSuccess) b.addEventListener("eid-login-success", (e) => opts.onSuccess(e.detail));
942
+ if (opts.onError) b.addEventListener("eid-login-error", (e) => opts.onError(e.detail.error));
943
+ target.append(b);
944
+ return b;
945
+ }
946
+ defineEidLoginButton();
947
+ // Annotate the CommonJS export names for ESM import in node:
948
+ 0 && (module.exports = {
949
+ EidLoginButton,
950
+ defineEidLoginButton,
951
+ mountEidLoginButton
952
+ });