@lingxia/bridge 0.5.0 → 0.6.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.
@@ -1,1663 +0,0 @@
1
- "use strict";
2
- var LingXiaRuntime = (function(I) {
3
- Object.defineProperty(I, Symbol.toStringTag, { value: "Module" });
4
- const x = {
5
- NOT_READY: "BRIDGE_NOT_READY",
6
- TIMEOUT: "BRIDGE_TIMEOUT",
7
- CANCELED: "BRIDGE_CANCELED",
8
- PROTOCOL_MISMATCH: "BRIDGE_PROTOCOL_MISMATCH",
9
- HANDSHAKE_FAILED: "BRIDGE_HANDSHAKE_FAILED",
10
- MALFORMED_MESSAGE: "BRIDGE_MALFORMED_MESSAGE",
11
- METHOD_NOT_FOUND: "BRIDGE_METHOD_NOT_FOUND",
12
- TOPIC_NOT_FOUND: "BRIDGE_TOPIC_NOT_FOUND",
13
- CAPABILITY_DENIED: "BRIDGE_CAPABILITY_DENIED",
14
- INTERNAL_ERROR: "BRIDGE_INTERNAL_ERROR",
15
- OUTBOX_FULL: "BRIDGE_OUTBOX_FULL",
16
- STREAM_OVERFLOW: "BRIDGE_STREAM_OVERFLOW",
17
- STREAM_CLOSED: "BRIDGE_STREAM_CLOSED"
18
- };
19
- function mt({ os: e, send: t }) {
20
- if (typeof window > "u" || typeof document > "u") return;
21
- const n = e === "iOS";
22
- if (!n && e !== "Android") return;
23
- const r = Symbol.for("LingXia.NativeComponentCoverageMonitor");
24
- if (window[r]?.installed) return;
25
- const o = {
26
- installed: !0,
27
- coveredById: /* @__PURE__ */ new Map(),
28
- coveredCount: 0,
29
- anyCovered: !1,
30
- scheduled: !1,
31
- hasAnyVideo: !1,
32
- scrollLocked: !1,
33
- scrollY: 0,
34
- htmlOverflow: "",
35
- bodyOverflow: "",
36
- bodyPosition: "",
37
- bodyTop: "",
38
- bodyWidth: ""
39
- };
40
- window[r] = o;
41
- function i() {
42
- if (!n || o.scrollLocked) return;
43
- const d = document.documentElement, m = document.body;
44
- !d || !m || (o.scrollLocked = !0, o.scrollY = window.scrollY || d.scrollTop || 0, o.htmlOverflow = d.style.overflow || "", o.bodyOverflow = m.style.overflow || "", o.bodyPosition = m.style.position || "", o.bodyTop = m.style.top || "", o.bodyWidth = m.style.width || "", d.style.overflow = "hidden", m.style.overflow = "hidden", m.style.position = "fixed", m.style.top = `${-o.scrollY}px`, m.style.width = "100%");
45
- }
46
- function a() {
47
- if (!n || !o.scrollLocked) return;
48
- const d = document.documentElement, m = document.body;
49
- !d || !m || (o.scrollLocked = !1, d.style.overflow = o.htmlOverflow, m.style.overflow = o.bodyOverflow, m.style.position = o.bodyPosition, m.style.top = o.bodyTop, m.style.width = o.bodyWidth, window.scrollTo(0, o.scrollY));
50
- }
51
- function s(d) {
52
- const m = d.getBoundingClientRect?.();
53
- if (!m || m.width < 2 || m.height < 2) return !1;
54
- const y = m.left + m.width / 2, f = m.top + m.height / 2;
55
- if (y < 0 || f < 0 || y >= window.innerWidth || f >= window.innerHeight) return !1;
56
- const p = document.elementFromPoint?.(y, f);
57
- return !p || p === document.documentElement || p === document.body ? !1 : !(p === d || d.contains(p));
58
- }
59
- function u() {
60
- o.scheduled = !1;
61
- const d = document.querySelectorAll("lx-video[id]");
62
- if (o.hasAnyVideo = d.length > 0, !o.hasAnyVideo && o.coveredById.size === 0 && !o.anyCovered) return;
63
- const m = /* @__PURE__ */ new Set();
64
- for (const p of Array.from(d)) {
65
- const g = p.id;
66
- if (!g) continue;
67
- m.add(g);
68
- const ce = s(p), ut = o.coveredById.get(g);
69
- ut !== ce && (ut === !0 && (o.coveredCount -= 1), ce === !0 && (o.coveredCount += 1), o.coveredById.set(g, ce), t({
70
- id: g,
71
- action: "component.coverage",
72
- covered: ce
73
- }));
74
- }
75
- const y = [];
76
- for (const [p, g] of o.coveredById.entries()) m.has(p) || (y.push(p), g === !0 && (o.coveredCount -= 1));
77
- for (const p of y) o.coveredById.delete(p), t({
78
- id: p,
79
- action: "component.coverage",
80
- covered: !1
81
- });
82
- const f = o.coveredCount > 0;
83
- f !== o.anyCovered && (o.anyCovered = f, n && (f ? i() : a()));
84
- }
85
- function l() {
86
- o.scheduled || (o.scheduled = !0, requestAnimationFrame(u));
87
- }
88
- function c() {
89
- !o.hasAnyVideo && o.coveredById.size === 0 || l();
90
- }
91
- new MutationObserver(l).observe(document.documentElement, {
92
- subtree: !0,
93
- childList: !0,
94
- attributes: !0
95
- }), window.addEventListener("scroll", { handleEvent: () => c() }, {
96
- capture: !0,
97
- passive: !0
98
- }), window.addEventListener("resize", { handleEvent: () => l() }), l();
99
- }
100
- const _ = typeof window < "u" && window.__LX_BRIDGE_CFG || {};
101
- function W() {
102
- return _.os || "unknown";
103
- }
104
- function ft() {
105
- return _.os === "Harmony";
106
- }
107
- function _e() {
108
- return _.os === "iOS";
109
- }
110
- function pt() {
111
- return _.os === "Android";
112
- }
113
- function de() {
114
- return _.os === "macOS";
115
- }
116
- function ht() {
117
- return de();
118
- }
119
- function gt() {
120
- return _.os === "iOS" || _.os === "macOS" ? "webkit" : _.os === "Harmony" ? "messageport" : _.os === "Android" ? window.LingXiaProxy?.supportsMessagePort?.() ? "messageport" : "jsinterface" : "unknown";
121
- }
122
- const yt = "LingXia", ue = "__LingXiaRecvMessage", me = 5e3, xt = 1e4, Me = 3, fe = "[LX.Bridge]", z = "messageport", pe = "jsinterface", bt = 256, wt = "/__lingxia/bridge/downstream", Le = 200, vt = 2e3, he = {
123
- data: !1,
124
- proto: !1,
125
- all: !1
126
- }, Y = [];
127
- function Et() {
128
- typeof window > "u" || typeof window[ue] != "function" && (window[ue] = (e) => {
129
- Y.push(e);
130
- });
131
- }
132
- function kt(e) {
133
- if (typeof window > "u" || (window[ue] = e, Y.length === 0)) return;
134
- const t = Y.splice(0, Y.length);
135
- for (const n of t) try {
136
- e(n);
137
- } catch (r) {
138
- h("Failed to replay queued native message:", r);
139
- }
140
- }
141
- function B(e) {
142
- return he.all || he[e];
143
- }
144
- function $(...e) {
145
- console.log(fe, ...e);
146
- }
147
- function h(...e) {
148
- console.warn(fe, ...e);
149
- }
150
- function L(...e) {
151
- console.error(fe, ...e);
152
- }
153
- function Ct(e, t) {
154
- const n = /* @__PURE__ */ new WeakSet();
155
- return JSON.stringify(e, (r, o) => {
156
- if (typeof o == "object" && o !== null) {
157
- if (n.has(o)) return "[Circular]";
158
- n.add(o);
159
- }
160
- return o;
161
- }, t);
162
- }
163
- function Oe(e) {
164
- try {
165
- return JSON.stringify(e);
166
- } catch {
167
- return Ct(e);
168
- }
169
- }
170
- function H(e) {
171
- try {
172
- return typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e));
173
- } catch {
174
- return {};
175
- }
176
- }
177
- var j = class extends Error {
178
- constructor(e, t, n) {
179
- super(t), this.name = "BridgeError", this.code = e, this.data = n;
180
- }
181
- };
182
- function U(e) {
183
- if (e instanceof j) return e;
184
- if (e && typeof e == "object") {
185
- const n = e;
186
- let r = x.INTERNAL_ERROR;
187
- (typeof n.code == "string" && n.code.trim() !== "" || typeof n.code == "number" && Number.isFinite(n.code)) && (r = n.code);
188
- const o = typeof n.message == "string" && n.message.trim() !== "" ? n.message : "Unknown error";
189
- return new j(r, o, "data" in n ? n.data : void 0);
190
- }
191
- const t = e instanceof Error ? e.message : typeof e == "string" ? e : "Unknown error";
192
- return new j(x.INTERNAL_ERROR, t);
193
- }
194
- const k = gt();
195
- Et();
196
- let M = null, J = !1, ge = null, V = null, G = null, K = Le;
197
- const b = {
198
- listenerInstalled: !1,
199
- promise: null,
200
- resolve: null,
201
- reject: null,
202
- timer: null
203
- }, It = { handleEvent: (e) => {
204
- const t = e;
205
- if (t.data !== "LingXia-port-init") return;
206
- const n = t.ports?.[0];
207
- n && (P._connectWebMessagePort(n), b.resolve?.(n));
208
- } };
209
- function Te() {
210
- b.listenerInstalled || (b.listenerInstalled = !0, window.addEventListener("message", It));
211
- }
212
- function Se() {
213
- b.timer !== null && (window.clearTimeout(b.timer), b.timer = null), b.resolve = null, b.reject = null, b.promise = null;
214
- }
215
- function Q() {
216
- return k === "webkit" && (_e() || de());
217
- }
218
- function Ae() {
219
- G !== null && (clearTimeout(G), G = null);
220
- }
221
- function _t(e) {
222
- for (const [t, n] of Array.from(D.entries())) D.delete(t), n._emitClose(x.STREAM_CLOSED, e);
223
- }
224
- function Mt(e) {
225
- for (const t of Array.from(v.keys())) q(t, {
226
- code: x.STREAM_CLOSED,
227
- message: e
228
- });
229
- for (const t of Array.from(w.keys())) re(t, {
230
- code: x.STREAM_CLOSED,
231
- message: e
232
- });
233
- _t(e);
234
- }
235
- function Lt(e, t) {
236
- ie(), Z = null, S = !1, A = !1, F = 0, t && Mt(e);
237
- }
238
- function Ot(e) {
239
- let t = e;
240
- for (;;) {
241
- const n = t.indexOf(`
242
- `);
243
- if (n < 0) break;
244
- const r = t.slice(0, n).trim();
245
- if (t = t.slice(n + 1), !!r) try {
246
- se(JSON.parse(r));
247
- } catch (o) {
248
- h("Apple downstream parse error:", o, r);
249
- }
250
- }
251
- return t;
252
- }
253
- async function Tt() {
254
- const e = new AbortController();
255
- V = e;
256
- let t;
257
- try {
258
- t = await fetch(wt, {
259
- method: "GET",
260
- cache: "no-store",
261
- headers: { Accept: "application/x-ndjson" },
262
- signal: e.signal
263
- });
264
- } catch (i) {
265
- if (e.signal.aborted) return;
266
- throw i;
267
- }
268
- if (!t.ok) throw new Error(`Apple downstream HTTP ${t.status}`);
269
- if (!t.body) throw new Error("Apple downstream response body unavailable");
270
- J = !0, K = Le, B("proto") && $("Apple downstream connected"), R();
271
- const n = t.body.getReader(), r = new TextDecoder();
272
- let o = "";
273
- try {
274
- for (;;) {
275
- const { value: a, done: s } = await n.read();
276
- if (s) break;
277
- o += r.decode(a, { stream: !0 }), o = Ot(o);
278
- }
279
- o += r.decode();
280
- const i = o.trim();
281
- if (i) try {
282
- se(JSON.parse(i));
283
- } catch (a) {
284
- h("Apple downstream trailing parse error:", a, i);
285
- }
286
- } finally {
287
- try {
288
- n.releaseLock();
289
- } catch {}
290
- }
291
- }
292
- function St(e) {
293
- if (!Q()) return;
294
- Ae();
295
- const t = K;
296
- K = Math.min(K * 2, vt), h(`Apple downstream disconnected, retrying in ${t}ms: ${e}`), G = setTimeout(() => {
297
- G = null, Ne();
298
- }, t);
299
- }
300
- function Ne() {
301
- Q() && (ge || (Ae(), ge = Tt().catch((e) => {
302
- V?.signal.aborted || h("Apple downstream failed:", e);
303
- }).finally(() => {
304
- const e = V?.signal.aborted ?? !1;
305
- ge = null, V = null;
306
- const t = J;
307
- J = !1, Lt("Apple downstream closed", t), e || St("stream closed");
308
- })));
309
- }
310
- function At() {
311
- if (M) return Promise.resolve(M);
312
- if (b.promise) return b.promise;
313
- const e = 5e3;
314
- Te(), b.promise = new Promise((t, n) => {
315
- b.resolve = (r) => {
316
- Se(), t(r);
317
- }, b.reject = (r) => {
318
- Se(), n(r);
319
- }, b.timer = window.setTimeout(() => {
320
- b.reject?.(/* @__PURE__ */ new Error(`MessagePort init timed out after ${e}ms`));
321
- }, e);
322
- });
323
- try {
324
- window.LingXiaProxy?.getPort("LingXiaPort");
325
- } catch (t) {
326
- b.reject?.(t);
327
- }
328
- return b.promise;
329
- }
330
- function ye(e) {
331
- const t = e.kind;
332
- (t === "req" || t === "notify") && $(`postToNative: ${t} ${e.method}`), B("proto") && console.log("→", JSON.stringify(e, null, 2));
333
- try {
334
- if (k === "webkit") {
335
- window.webkit?.messageHandlers[yt]?.postMessage(e);
336
- return;
337
- }
338
- const n = Oe(e);
339
- if (k === z && M) {
340
- M.postMessage(n);
341
- return;
342
- }
343
- if (k === pe && window.LingXiaProxy?.postMessage) {
344
- window.LingXiaProxy.postMessage(n);
345
- return;
346
- }
347
- h("Transport not ready");
348
- } catch (n) {
349
- L("Send error:", n);
350
- }
351
- }
352
- let Z = null, S = !1, A = !1, F = 0, ee = null;
353
- const Re = {};
354
- let Nt = 0;
355
- function Pe() {
356
- return {
357
- data: /* @__PURE__ */ new Set(),
358
- end: /* @__PURE__ */ new Set(),
359
- error: /* @__PURE__ */ new Set(),
360
- close: /* @__PURE__ */ new Set()
361
- };
362
- }
363
- function De(e, t) {
364
- const n = Pe();
365
- let r = !1, o = () => {}, i = () => {};
366
- const a = [], s = [], u = new Promise((l, c) => {
367
- o = l, i = c;
368
- });
369
- return {
370
- id: e,
371
- result: u,
372
- on(l, c) {
373
- return l === "data" && n.data.add(c), l === "end" && n.end.add(c), l === "error" && n.error.add(c), this;
374
- },
375
- [Symbol.asyncIterator]() {
376
- return { next() {
377
- return a.length > 0 ? Promise.resolve({
378
- done: !1,
379
- value: a.shift()
380
- }) : r ? u.then((l) => ({
381
- done: !0,
382
- value: l
383
- }), (l) => Promise.reject(l)) : new Promise((l, c) => {
384
- s.push({
385
- resolve: l,
386
- reject: c
387
- });
388
- });
389
- } };
390
- },
391
- cancel() {
392
- r || t();
393
- },
394
- _emitData(l) {
395
- if (!r) {
396
- s.length > 0 ? s.shift().resolve({
397
- done: !1,
398
- value: l
399
- }) : a.push(l);
400
- for (const c of n.data) try {
401
- c(l);
402
- } catch (d) {
403
- h("Stream data listener failed:", d);
404
- }
405
- }
406
- },
407
- _resolve(l) {
408
- if (!r) {
409
- for (r = !0, o(l); s.length > 0;) s.shift().resolve({
410
- done: !0,
411
- value: l
412
- });
413
- for (const c of n.end) try {
414
- c(l);
415
- } catch (d) {
416
- h("Stream end listener failed:", d);
417
- }
418
- }
419
- },
420
- _reject(l) {
421
- if (!r) {
422
- for (r = !0, i(l); s.length > 0;) s.shift().reject(l);
423
- for (const c of n.error) try {
424
- c(l);
425
- } catch (d) {
426
- h("Stream error listener failed:", d);
427
- }
428
- }
429
- }
430
- };
431
- }
432
- function Rt(e, t, n) {
433
- const r = Pe();
434
- let o = !1, i = 0, a = !1;
435
- const s = [], u = [], l = {
436
- id: e,
437
- send(c) {
438
- if (!o) {
439
- l._reject({
440
- code: x.STREAM_CLOSED,
441
- message: `Channel '${e}' is closed`
442
- });
443
- return;
444
- }
445
- t(c, i++);
446
- },
447
- on(c, d) {
448
- return c === "data" && r.data.add(d), c === "close" && r.close.add(d), c === "error" && r.error.add(d), this;
449
- },
450
- [Symbol.asyncIterator]() {
451
- return { next() {
452
- return s.length > 0 ? Promise.resolve({
453
- done: !1,
454
- value: s.shift()
455
- }) : a ? Promise.resolve({
456
- done: !0,
457
- value: void 0
458
- }) : new Promise((c, d) => {
459
- u.push({
460
- resolve: c,
461
- reject: d
462
- });
463
- });
464
- } };
465
- },
466
- close(c, d) {
467
- o && (o = !1, a = !0, n(c, d), l._emitClose(c, d));
468
- },
469
- _emitData(c) {
470
- if (o) {
471
- u.length > 0 ? u.shift().resolve({
472
- done: !1,
473
- value: c
474
- }) : s.push(c);
475
- for (const d of r.data) try {
476
- d(c);
477
- } catch (m) {
478
- h("Channel listener failed:", m);
479
- }
480
- }
481
- },
482
- _emitClose(c, d) {
483
- for (a = !0; u.length > 0;) u.shift().resolve({
484
- done: !0,
485
- value: void 0
486
- });
487
- for (const m of r.close) try {
488
- m(c, d);
489
- } catch (y) {
490
- h("Channel close listener failed:", y);
491
- }
492
- },
493
- _reject(c) {
494
- for (a = !0; u.length > 0;) u.shift().reject(c);
495
- for (const d of r.error) try {
496
- d(c);
497
- } catch (m) {
498
- h("Channel error listener failed:", m);
499
- }
500
- },
501
- _markOpen() {
502
- o = !0, a = !1;
503
- },
504
- _isOpen() {
505
- return o;
506
- },
507
- _nextSeq() {
508
- return i++;
509
- }
510
- };
511
- return l;
512
- }
513
- const v = /* @__PURE__ */ new Map(), w = /* @__PURE__ */ new Map(), D = /* @__PURE__ */ new Map(), O = [];
514
- let C = -1, N = {};
515
- const xe = /* @__PURE__ */ new Set(), te = /* @__PURE__ */ new WeakMap(), Be = /* @__PURE__ */ new Map();
516
- function ne(e, t) {
517
- Be.set(e, t);
518
- }
519
- function X(e) {
520
- if (e.startsWith("host.")) return "host";
521
- const t = e.indexOf(".");
522
- return t > 0 ? e.slice(0, t) : "page";
523
- }
524
- function oe(e) {
525
- if (e != null) return e;
526
- }
527
- function $e() {
528
- return k === z ? !!M : Q() ? J : k === "webkit" || k === pe;
529
- }
530
- function je() {
531
- return $e() && S;
532
- }
533
- function q(e, t) {
534
- const n = v.get(e);
535
- if (n) {
536
- v.delete(e), n.timerId !== null && clearTimeout(n.timerId);
537
- const r = U(t);
538
- if (n.mode === "stream" && n.stream) {
539
- n.stream._reject(r);
540
- return;
541
- }
542
- n.reject?.(r);
543
- }
544
- }
545
- function re(e, t) {
546
- const n = w.get(e);
547
- if (!n) return;
548
- w.delete(e), n.timerId !== null && clearTimeout(n.timerId);
549
- const r = U(t);
550
- n.channel._reject(r), n.reject(r);
551
- }
552
- function Fe(e, t) {
553
- if (v.has(e)) {
554
- q(e, t);
555
- return;
556
- }
557
- w.has(e) && re(e, t);
558
- }
559
- function He(e) {
560
- const t = v.get(e);
561
- if (t) {
562
- if (!Number.isFinite(t.timeoutMs) || t.timeoutMs <= 0) {
563
- t.timerId !== null && (clearTimeout(t.timerId), t.timerId = null);
564
- return;
565
- }
566
- t.timerId !== null && clearTimeout(t.timerId), t.timerId = setTimeout(() => {
567
- v.has(e) && q(e, new j(x.TIMEOUT, `'${t.method}' timed out`));
568
- }, t.timeoutMs);
569
- }
570
- }
571
- function Pt(e) {
572
- const t = w.get(e);
573
- t && (t.timerId !== null && clearTimeout(t.timerId), t.timerId = setTimeout(() => {
574
- re(e, {
575
- code: x.TIMEOUT,
576
- message: `Channel '${t.topic}' timed out`
577
- });
578
- }, me));
579
- }
580
- function Ue(e) {
581
- if (v.has(e)) {
582
- He(e);
583
- return;
584
- }
585
- w.has(e) && Pt(e);
586
- }
587
- function Ge(e) {
588
- for (let t = O.length - 1; t >= 0; t--) if (O[t]?.reqId === e) return O.splice(t, 1), !0;
589
- return !1;
590
- }
591
- function E(e, t) {
592
- const n = e.kind, r = n === "hello" || n === "helloAck" || n === "ready";
593
- if (!je() && !r) {
594
- if (O.length >= bt) {
595
- L("Outbox full"), t && Fe(t, {
596
- code: x.OUTBOX_FULL,
597
- message: "Bridge outbox is full"
598
- });
599
- return;
600
- }
601
- O.push({
602
- msg: e,
603
- reqId: t
604
- });
605
- return;
606
- }
607
- t && Ue(t), ye(e);
608
- }
609
- function Dt() {
610
- if (je()) for (; O.length;) {
611
- const e = O.shift();
612
- e && (e.reqId && Ue(e.reqId), ye(e.msg));
613
- }
614
- }
615
- function ie() {
616
- ee !== null && (clearTimeout(ee), ee = null);
617
- }
618
- function R() {
619
- if (S || !$e()) return;
620
- ie();
621
- const e = {
622
- v: 2,
623
- kind: "hello",
624
- nonce: _.nonce || "",
625
- role: "view",
626
- protocolsSupported: [2]
627
- };
628
- A = !0, ye(e), ee = setTimeout(() => {
629
- if (!S) if (F++, F < Me) h(`Handshake timeout (${F}/${Me}), retrying...`), A = !1, R();
630
- else {
631
- for (L("Handshake failed"), ie(), A = !1, F = 0; O.length;) {
632
- const t = O.shift();
633
- t?.reqId && Fe(t.reqId, {
634
- code: x.HANDSHAKE_FAILED,
635
- message: "Bridge handshake failed"
636
- });
637
- }
638
- for (const t of Array.from(w.keys())) re(t, {
639
- code: x.HANDSHAKE_FAILED,
640
- message: "Bridge handshake failed"
641
- });
642
- }
643
- }, xt);
644
- }
645
- function Bt(e) {
646
- if (!e || typeof e != "object") return null;
647
- const t = e.v, n = e.kind;
648
- return t !== 2 || typeof n != "string" ? null : e;
649
- }
650
- function $t(e) {
651
- return e.replace(/~1/g, "/").replace(/~0/g, "~");
652
- }
653
- function jt(e) {
654
- if (e === "") return [];
655
- if (!e.startsWith("/")) throw new Error(`Invalid JSON pointer: ${e}`);
656
- return e.split("/").slice(1).map($t);
657
- }
658
- function Ft(e, t, n = !1) {
659
- const r = jt(t);
660
- if (r.length === 0) return {
661
- container: { $root: e },
662
- key: "$root"
663
- };
664
- let o = e;
665
- for (let i = 0; i < r.length - 1; i++) {
666
- const a = r[i];
667
- if (Array.isArray(o)) o = o[Number(a)];
668
- else if (o && typeof o == "object") {
669
- const s = o;
670
- if (n && s[a] === void 0) {
671
- const u = r[i + 1];
672
- s[a] = u && /^\d+$/.test(u) ? [] : {};
673
- }
674
- o = s[a];
675
- } else throw new Error(`Invalid container at ${a}`);
676
- }
677
- return {
678
- container: o,
679
- key: r[r.length - 1]
680
- };
681
- }
682
- function Ht(e, t) {
683
- for (const n of t) {
684
- const r = n.op === "add" || n.op === "replace", { container: o, key: i } = Ft(e, n.path, r);
685
- if (i === "$root") {
686
- for (const s of Object.keys(e)) delete e[s];
687
- if (n.op !== "remove") {
688
- const s = n.value;
689
- s && typeof s == "object" && Object.assign(e, s);
690
- }
691
- continue;
692
- }
693
- if (Array.isArray(o)) {
694
- const s = i === "-" ? o.length : Number(i);
695
- if (!Number.isFinite(s) || s < 0) throw new Error("Invalid index");
696
- n.op === "remove" ? o.splice(s, 1) : n.op === "add" ? o.splice(s, 0, n.value) : n.op === "replace" && (o[s] = n.value);
697
- continue;
698
- }
699
- if (!o || typeof o != "object") throw new Error("Invalid container");
700
- const a = o;
701
- n.op === "remove" ? delete a[i] : a[i] = n.value;
702
- }
703
- }
704
- function be(e) {
705
- xe.forEach((t) => {
706
- try {
707
- if (!te.has(t)) {
708
- te.set(t, !0), t(H(N), {
709
- rev: C,
710
- initial: !0
711
- });
712
- return;
713
- }
714
- t(H(N), {
715
- rev: C,
716
- initial: e
717
- });
718
- } catch (n) {
719
- h("Subscriber error:", n);
720
- }
721
- });
722
- }
723
- function Ut(e) {
724
- if (typeof e != "function") return () => {};
725
- if (xe.add(e), C >= 0) {
726
- te.set(e, !0);
727
- try {
728
- e(H(N), {
729
- rev: C,
730
- initial: !0
731
- });
732
- } catch (t) {
733
- L("Callback error:", t);
734
- }
735
- }
736
- return () => {
737
- xe.delete(e), te.delete(e);
738
- };
739
- }
740
- function Xe(e) {
741
- P.call("state.getSnapshot", { scope: e }).catch(() => {});
742
- }
743
- function Gt(e) {
744
- if (!e || typeof e != "object") return !1;
745
- const t = e;
746
- return typeof t.rev != "number" || !Number.isFinite(t.rev) || !t.state || typeof t.state != "object" ? !1 : (N = t.state, C = t.rev, B("data") && (console.group("[LX] snapshot(res)"), console.log("rev:", C, "state:", H(N)), console.groupEnd()), be(!0), !0);
747
- }
748
- function se(e) {
749
- if (e && typeof e == "object") {
750
- const n = e;
751
- if (n.type === "event" && n.name === "nativecomponent" && n.payload) {
752
- const r = n.payload, o = r.id || r.componentId;
753
- if (typeof o == "string") {
754
- const i = ae.get(o);
755
- if (i) try {
756
- i(r);
757
- } catch (a) {
758
- L("NC handler error:", a);
759
- }
760
- }
761
- return;
762
- }
763
- }
764
- const t = Bt(e);
765
- if (!t) {
766
- h("Invalid V2 message:", e);
767
- return;
768
- }
769
- switch (t.kind) {
770
- case "helloAck":
771
- Z = t.sessionId;
772
- return;
773
- case "ready":
774
- if (Z && t.sessionId !== Z) {
775
- h("sessionId mismatch");
776
- return;
777
- }
778
- if (ie(), S = !0, F = 0, t.hostMethods) for (const [n, r] of Object.entries(t.hostMethods)) Re[n] = r;
779
- B("proto") && $("Handshake complete, hostMethods:", Object.keys(Re).length), Dt();
780
- return;
781
- case "res": {
782
- const n = v.get(t.id);
783
- if (!n) return;
784
- if (v.delete(t.id), n.timerId !== null && clearTimeout(n.timerId), t.ok) {
785
- if (n.method === "state.getSnapshot" && (Gt(t.result) || h("Invalid state.getSnapshot result")), n.mode === "stream" && n.stream) {
786
- n.stream._resolve(t.result);
787
- return;
788
- }
789
- n.resolve?.(t.result);
790
- } else {
791
- const r = U(t.error);
792
- if (n.mode === "stream" && n.stream) {
793
- n.stream._reject(r);
794
- return;
795
- }
796
- n.reject?.(r);
797
- }
798
- return;
799
- }
800
- case "event":
801
- if (v.has(t.id)) {
802
- const n = v.get(t.id);
803
- n?.mode === "stream" && n.stream ? (He(t.id), n.stream._emitData(t.payload)) : h(`Received event for non-stream request '${t.id}'`);
804
- return;
805
- }
806
- return;
807
- case "state.snapshot":
808
- N = t.state || {}, C = t.rev, B("data") && (console.group("[LX] snapshot"), console.log("rev:", C, "state:", H(N)), console.groupEnd()), be(!0);
809
- return;
810
- case "state.patch":
811
- if (t.baseRev !== C) {
812
- h("baseRev mismatch", {
813
- have: C,
814
- want: t.baseRev
815
- }), Xe(t.scope);
816
- return;
817
- }
818
- try {
819
- Ht(N, t.ops || []), C = t.rev;
820
- } catch (n) {
821
- L("Patch failed:", n), Xe(t.scope);
822
- return;
823
- }
824
- B("data") && (console.group("[LX] patch"), console.log("rev:", C, "ops:", t.ops), console.groupEnd()), be(!1), t.ack && E({
825
- v: 2,
826
- kind: "state.ack",
827
- scope: t.scope,
828
- rev: t.rev
829
- });
830
- return;
831
- case "ch.ack": {
832
- const n = w.get(t.id);
833
- if (!n) return;
834
- if (w.delete(t.id), n.timerId !== null && clearTimeout(n.timerId), t.ok) n.channel._markOpen(), D.set(t.id, n.channel), n.resolve(n.channel);
835
- else {
836
- const r = U(t.error);
837
- n.channel._reject(r), n.reject(r);
838
- }
839
- return;
840
- }
841
- case "ch.data": {
842
- const n = D.get(t.id);
843
- if (!n) return;
844
- n._emitData(t.payload);
845
- return;
846
- }
847
- case "ch.close": {
848
- const n = w.get(t.id);
849
- if (n) {
850
- w.delete(t.id), n.channel._emitClose(t.code, t.reason);
851
- return;
852
- }
853
- const r = D.get(t.id);
854
- if (!r) return;
855
- D.delete(t.id), r._emitClose(t.code, t.reason);
856
- return;
857
- }
858
- case "req": {
859
- const n = t, r = X(n.method);
860
- if (!n.cap || n.cap !== r) {
861
- E({
862
- v: 2,
863
- kind: "res",
864
- id: n.id,
865
- ok: !1,
866
- error: {
867
- code: x.CAPABILITY_DENIED,
868
- message: `Invalid cap for ${n.method}`
869
- }
870
- });
871
- return;
872
- }
873
- const o = Be.get(n.method);
874
- if (!o) {
875
- E({
876
- v: 2,
877
- kind: "res",
878
- id: n.id,
879
- ok: !1,
880
- error: {
881
- code: x.METHOD_NOT_FOUND,
882
- message: `View handler not found: ${n.method}`
883
- }
884
- });
885
- return;
886
- }
887
- Promise.resolve().then(() => o(n.params)).then((i) => {
888
- E({
889
- v: 2,
890
- kind: "res",
891
- id: n.id,
892
- ok: !0,
893
- result: i
894
- });
895
- }).catch((i) => {
896
- E({
897
- v: 2,
898
- kind: "res",
899
- id: n.id,
900
- ok: !1,
901
- error: U(i)
902
- });
903
- });
904
- return;
905
- }
906
- }
907
- }
908
- const ae = /* @__PURE__ */ new Map(), le = [];
909
- let qe = !1;
910
- function we() {
911
- return typeof window > "u" ? !1 : !!(window.webkit?.messageHandlers?.NativeComponent || window.NativeComponentBridge?.postMessage);
912
- }
913
- function We(e) {
914
- try {
915
- if (window.webkit?.messageHandlers?.NativeComponent) {
916
- window.webkit.messageHandlers.NativeComponent.postMessage(e);
917
- return;
918
- }
919
- if (window.NativeComponentBridge?.postMessage) {
920
- window.NativeComponentBridge.postMessage(Oe(e));
921
- return;
922
- }
923
- } catch (t) {
924
- L("NativeComponent send error:", t);
925
- }
926
- }
927
- function ze() {
928
- if (!(!we() || le.length === 0)) for (qe = !0; le.length;) {
929
- const e = le.shift();
930
- try {
931
- We(e);
932
- } catch {
933
- break;
934
- }
935
- }
936
- }
937
- function Ye(e) {
938
- try {
939
- if (!we()) {
940
- le.push(e);
941
- return;
942
- }
943
- qe || ze(), We(e);
944
- } catch (t) {
945
- L("NC send failed:", t);
946
- }
947
- }
948
- function ve(e) {
949
- return `${e}_${Date.now()}_${Nt++}`;
950
- }
951
- function Je(e, t, n) {
952
- if (!t) return;
953
- if (t.aborted) {
954
- n();
955
- return;
956
- }
957
- let r = { handleEvent: () => {
958
- t.removeEventListener("abort", r), n();
959
- } };
960
- t.addEventListener("abort", r);
961
- }
962
- const P = {
963
- call(e, t, n) {
964
- return new Promise((r, o) => {
965
- if (!e || typeof e != "string") {
966
- o(new j(x.MALFORMED_MESSAGE, "Method name must be a non-empty string"));
967
- return;
968
- }
969
- A || R();
970
- const i = ve("c"), a = n?.cap || X(e), s = n?.timeoutMs ?? me;
971
- v.set(i, {
972
- method: e,
973
- mode: "call",
974
- resolve: r,
975
- reject: (u) => o(u),
976
- timeoutMs: s,
977
- timerId: null
978
- }), E({
979
- v: 2,
980
- kind: "req",
981
- id: i,
982
- method: e,
983
- params: oe(t),
984
- cap: a
985
- }, i), Je(i, n?.signal, () => {
986
- const u = Ge(i);
987
- q(i, {
988
- code: x.CANCELED,
989
- message: "Bridge request aborted"
990
- }), !u && S && E({
991
- v: 2,
992
- kind: "cancel",
993
- id: i
994
- });
995
- });
996
- });
997
- },
998
- stream(e, t, n) {
999
- if (!e || typeof e != "string") {
1000
- const s = De("invalid", () => {});
1001
- return s._reject({
1002
- code: x.MALFORMED_MESSAGE,
1003
- message: "Method name must be a non-empty string"
1004
- }), s;
1005
- }
1006
- A || R();
1007
- const r = ve("c"), o = De(r, () => {
1008
- if (Ge(r)) {
1009
- q(r, {
1010
- code: x.CANCELED,
1011
- message: "Bridge request aborted"
1012
- });
1013
- return;
1014
- }
1015
- S && E({
1016
- v: 2,
1017
- kind: "cancel",
1018
- id: r
1019
- });
1020
- }), i = n?.cap || X(e), a = n?.timeoutMs ?? me;
1021
- return v.set(r, {
1022
- method: e,
1023
- mode: "stream",
1024
- stream: o,
1025
- timeoutMs: a,
1026
- timerId: null
1027
- }), E({
1028
- v: 2,
1029
- kind: "req",
1030
- id: r,
1031
- method: e,
1032
- params: oe(t),
1033
- cap: i
1034
- }, r), Je(r, n?.signal, () => o.cancel()), o;
1035
- },
1036
- notify(e, t, n) {
1037
- !e || typeof e != "string" || (A || R(), E({
1038
- v: 2,
1039
- kind: "notify",
1040
- method: e,
1041
- params: oe(t),
1042
- cap: n?.cap || X(e)
1043
- }));
1044
- },
1045
- state: { subscribe: Ut },
1046
- channel: { open(e, t, n) {
1047
- return !e || typeof e != "string" ? Promise.reject(new j(x.MALFORMED_MESSAGE, "Topic name must be a non-empty string")) : (A || R(), new Promise((r, o) => {
1048
- const i = ve("ch"), a = Rt(i, (s, u) => {
1049
- E({
1050
- v: 2,
1051
- kind: "ch.data",
1052
- id: i,
1053
- seq: u,
1054
- payload: s
1055
- });
1056
- }, (s, u) => {
1057
- const l = w.get(i);
1058
- l && l.timerId !== null && clearTimeout(l.timerId), w.delete(i), D.delete(i), E({
1059
- v: 2,
1060
- kind: "ch.close",
1061
- id: i,
1062
- code: s,
1063
- reason: u
1064
- });
1065
- });
1066
- w.set(i, {
1067
- topic: e,
1068
- channel: a,
1069
- resolve: r,
1070
- reject: o,
1071
- timerId: null
1072
- }), E({
1073
- v: 2,
1074
- kind: "ch.open",
1075
- id: i,
1076
- topic: e,
1077
- params: oe(t),
1078
- cap: n?.cap || X(e)
1079
- }, i);
1080
- }));
1081
- } },
1082
- _connectWebMessagePort(e) {
1083
- if (k === z) {
1084
- if (M && M !== e) try {
1085
- M.onmessage = null, M.close();
1086
- } catch {}
1087
- M = e, e.onmessage = (t) => {
1088
- let n = t.data;
1089
- if (typeof n == "string") try {
1090
- n = JSON.parse(n);
1091
- } catch {
1092
- return;
1093
- }
1094
- se(n);
1095
- };
1096
- try {
1097
- e.start();
1098
- } catch {}
1099
- $("Port connected"), R();
1100
- }
1101
- },
1102
- _receiveEvaluateMessage(e) {
1103
- try {
1104
- e && se(JSON.parse(e));
1105
- } catch (t) {
1106
- L("Parse error:", t);
1107
- }
1108
- },
1109
- debug: new Proxy(he, {
1110
- get(e, t) {
1111
- return e[t];
1112
- },
1113
- set(e, t, n) {
1114
- return t in e ? (e[t] = !!n, console.log(`[LX] ${t}: ${n}`), !0) : !1;
1115
- }
1116
- }),
1117
- platform: {
1118
- isHarmony: ft,
1119
- isIOS: _e,
1120
- isAndroid: pt,
1121
- isMacOS: de,
1122
- isDesktop: ht,
1123
- getOS: W
1124
- },
1125
- dom: { measureById(e) {
1126
- try {
1127
- if (!e) return null;
1128
- const t = document.getElementById(e);
1129
- if (!t) return null;
1130
- const n = t.getBoundingClientRect();
1131
- let r = 0;
1132
- try {
1133
- r = parseFloat(getComputedStyle(t).borderRadius) || 0;
1134
- } catch {}
1135
- return [
1136
- n.left + window.scrollX,
1137
- n.top + window.scrollY,
1138
- n.width,
1139
- n.height,
1140
- r
1141
- ];
1142
- } catch {
1143
- return null;
1144
- }
1145
- } },
1146
- nativeComponents: {
1147
- send: Ye,
1148
- hasHandler: we,
1149
- flush: ze,
1150
- register(e, t) {
1151
- return !e || typeof t != "function" ? () => {} : (ae.set(e, t), () => ae.delete(e));
1152
- },
1153
- unregister(e) {
1154
- ae.delete(e);
1155
- }
1156
- },
1157
- isReady() {
1158
- return S;
1159
- }
1160
- };
1161
- function Ve(e) {
1162
- const t = () => {};
1163
- return new Proxy(t, {
1164
- apply(n, r, o) {
1165
- const i = e.join("."), a = o.length === 0 ? void 0 : o.length === 1 ? o[0] : o, s = P.stream(`host.${i}`, a, {
1166
- cap: "host",
1167
- timeoutMs: 0
1168
- }), u = s.result;
1169
- return new Proxy(s, { get(l, c) {
1170
- if (c === "then") return u.then.bind(u);
1171
- if (c === "catch") return u.catch.bind(u);
1172
- const d = l[c];
1173
- return typeof d == "function" ? d.bind(l) : d;
1174
- } });
1175
- },
1176
- get(n, r) {
1177
- if (r !== "then") {
1178
- if (r === "__funcName") return `host.${e.join(".")}`;
1179
- if (r === "__bridgeMode") return "stream";
1180
- if (typeof r == "string") return Ve([...e, r]);
1181
- }
1182
- }
1183
- });
1184
- }
1185
- function Ke(e) {
1186
- const t = () => {};
1187
- return new Proxy(t, {
1188
- apply(n, r, o) {
1189
- const i = e.join("."), a = o.length === 0 ? void 0 : o.length === 1 ? o[0] : o;
1190
- return P.channel.open(`host.${i}`, a, { cap: "host" });
1191
- },
1192
- get(n, r) {
1193
- if (r !== "then") {
1194
- if (r === "__funcName") return `host.${e.join(".")}`;
1195
- if (r === "__bridgeMode") return "channel";
1196
- if (r === "open") return (...o) => {
1197
- const i = e.join("."), a = o.length === 0 ? void 0 : o.length === 1 ? o[0] : o;
1198
- return P.channel.open(`host.${i}`, a, { cap: "host" });
1199
- };
1200
- if (typeof r == "string") return Ke([...e, r]);
1201
- }
1202
- }
1203
- });
1204
- }
1205
- const Qe = new Proxy({}, { get(e, t) {
1206
- if (typeof t == "string") return t === "channel" ? new Proxy({}, { get(n, r) {
1207
- if (typeof r == "string") return Ke([r]);
1208
- } }) : Ve([t]);
1209
- } });
1210
- function Ee() {
1211
- $(`Method: ${k}`), kt(P._receiveEvaluateMessage), Q() ? Ne() : k === z ? (Te(), At().catch((e) => h("Port init failed:", e))) : k === "webkit" || k === pe ? R() : h("Unknown method"), window.LingXiaBridge = P, window.host = Qe, mt({
1212
- os: W(),
1213
- send: Ye
1214
- }), $("Init complete");
1215
- }
1216
- const Xt = `
1217
- * { margin: 0; padding: 0; box-sizing: border-box; }
1218
- body {
1219
- font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', Roboto, sans-serif;
1220
- display: flex;
1221
- align-items: center;
1222
- justify-content: center;
1223
- min-height: 100vh;
1224
- background: #f5f5f7;
1225
- color: #1d1d1f;
1226
- padding: 20px;
1227
- -webkit-font-smoothing: antialiased;
1228
- }
1229
- .lx-error {
1230
- text-align: center;
1231
- max-width: 400px;
1232
- }
1233
- .lx-error-code {
1234
- font-size: 120px;
1235
- font-weight: 700;
1236
- color: #d1d1d6;
1237
- line-height: 1;
1238
- letter-spacing: -4px;
1239
- }
1240
- .lx-error-title {
1241
- font-size: 21px;
1242
- font-weight: 600;
1243
- margin: 16px 0 8px;
1244
- color: #1d1d1f;
1245
- }
1246
- .lx-error-desc {
1247
- font-size: 15px;
1248
- color: #86868b;
1249
- line-height: 1.5;
1250
- }
1251
- .lx-error-path {
1252
- display: inline-block;
1253
- margin-top: 20px;
1254
- padding: 10px 16px;
1255
- background: rgba(0,0,0,0.04);
1256
- border-radius: 8px;
1257
- font-family: 'SF Mono', ui-monospace, Menlo, Monaco, monospace;
1258
- font-size: 13px;
1259
- color: #1d1d1f;
1260
- word-break: break-all;
1261
- max-width: 100%;
1262
- }
1263
- @media (prefers-color-scheme: dark) {
1264
- body { background: #000; color: #f5f5f7; }
1265
- .lx-error-code { color: #3a3a3c; }
1266
- .lx-error-title { color: #f5f5f7; }
1267
- .lx-error-desc { color: #86868b; }
1268
- .lx-error-path { background: rgba(255,255,255,0.08); color: #f5f5f7; }
1269
- }
1270
- `;
1271
- function Ze(e) {
1272
- const t = document.createElement("div");
1273
- return t.textContent = e, t.innerHTML;
1274
- }
1275
- function et(e) {
1276
- const { failedPath: t, reason: n } = e, r = document.createElement("style");
1277
- r.textContent = Xt, document.head.appendChild(r), document.body.innerHTML = "", document.body.style.cssText = "";
1278
- const o = document.createElement("div");
1279
- o.className = "lx-error";
1280
- let i = "<div class=\"lx-error-code\">404</div>";
1281
- i += "<h1 class=\"lx-error-title\">Page Not Found</h1>", i += `<p class="lx-error-desc">The page you're looking for doesn't exist.</p>`, t && (i += `<div class="lx-error-path">${Ze(t)}</div>`), n && (i += `<p class="lx-error-desc" style="margin-top:12px">${Ze(n)}</p>`), o.innerHTML = i, document.body.appendChild(o);
1282
- }
1283
- function tt() {
1284
- const e = window.__LX_RUNTIME_CONFIG;
1285
- return !!(e && e.error);
1286
- }
1287
- function nt() {
1288
- return window.__LX_RUNTIME_CONFIG?.error || null;
1289
- }
1290
- const qt = { handleEvent: () => ke() };
1291
- function ke() {
1292
- if (tt()) {
1293
- const e = nt();
1294
- e && et(e);
1295
- }
1296
- }
1297
- function Wt() {
1298
- Ee(), ke();
1299
- }
1300
- function ot() {
1301
- Ee(), document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", qt) : ke();
1302
- }
1303
- const zt = "lx://proxy/";
1304
- function Yt(e) {
1305
- return e.length === 0 || e.startsWith("lx://") || e.startsWith("data:") || e.startsWith("blob:") || e.startsWith("file:") ? !1 : e.startsWith("http://") || e.startsWith("https://");
1306
- }
1307
- function Jt(e) {
1308
- return `${zt}${btoa(e).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, "")}`;
1309
- }
1310
- function Ce(e) {
1311
- const t = e.trim();
1312
- return Yt(t) ? Jt(t) : e;
1313
- }
1314
- function Vt() {
1315
- const e = W();
1316
- if (e !== "iOS" && e !== "macOS" || typeof window > "u" || typeof document > "u" || typeof HTMLImageElement > "u") return;
1317
- const t = HTMLImageElement.prototype;
1318
- if (t.__lxProxyPatched) return;
1319
- t.__lxProxyPatched = !0;
1320
- const n = t.setAttribute;
1321
- t.setAttribute = function(i, a) {
1322
- return typeof i == "string" && i.toLowerCase() === "src" && typeof a == "string" ? n.call(this, i, Ce(a)) : n.call(this, i, a);
1323
- };
1324
- const r = Object.getOwnPropertyDescriptor(t, "src");
1325
- r?.set && Object.defineProperty(t, "src", {
1326
- configurable: r.configurable,
1327
- enumerable: r.enumerable,
1328
- get: r.get,
1329
- set(i) {
1330
- typeof i == "string" ? r.set?.call(this, Ce(i)) : r.set?.call(this, i);
1331
- }
1332
- });
1333
- const o = () => {
1334
- document.querySelectorAll("img[src]").forEach((i) => {
1335
- const a = i.getAttribute("src");
1336
- if (!a) return;
1337
- const s = Ce(a);
1338
- s !== a && n.call(i, "src", s);
1339
- });
1340
- };
1341
- document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", { handleEvent: () => o() }) : o();
1342
- }
1343
- const Ie = 300, rt = "lx-action-sheet-style";
1344
- let it = null;
1345
- function Kt() {
1346
- return W() === "macOS";
1347
- }
1348
- function Qt() {
1349
- if (document.getElementById(rt)) return;
1350
- const e = document.createElement("style");
1351
- e.id = rt, e.textContent = `
1352
- .lx-as-backdrop {
1353
- position: fixed; inset: 0; z-index: 99999;
1354
- background: rgba(0,0,0,0.4);
1355
- opacity: 0; transition: opacity ${Ie}ms ease;
1356
- }
1357
- .lx-as-backdrop.lx-as-visible { opacity: 1; }
1358
-
1359
- .lx-as-sheet {
1360
- position: fixed; left: 0; right: 0; bottom: 0; z-index: 100000;
1361
- transform: translateY(100%);
1362
- transition: transform ${Ie}ms ease;
1363
- font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', Roboto, sans-serif;
1364
- -webkit-font-smoothing: antialiased;
1365
- }
1366
- .lx-as-sheet.lx-as-visible { transform: translateY(0); }
1367
- .lx-as-sheet.lx-as-desktop {
1368
- left: 50%;
1369
- right: auto;
1370
- bottom: auto;
1371
- top: 50%;
1372
- width: min(92vw, 460px);
1373
- transform: translate(-50%, calc(-50% + 16px));
1374
- }
1375
- .lx-as-sheet.lx-as-desktop.lx-as-visible { transform: translate(-50%, -50%); }
1376
-
1377
- .lx-as-container {
1378
- background: #fff;
1379
- border-radius: 16px 16px 0 0;
1380
- overflow: hidden;
1381
- }
1382
- .lx-as-container.lx-as-desktop {
1383
- border-radius: 16px;
1384
- }
1385
-
1386
- .lx-as-item {
1387
- display: block; width: 100%;
1388
- height: 56px;
1389
- line-height: 56px;
1390
- padding: 0;
1391
- border: none; background: none;
1392
- font-size: 18px; font-weight: 400;
1393
- text-align: center;
1394
- cursor: pointer;
1395
- -webkit-tap-highlight-color: transparent;
1396
- position: relative;
1397
- }
1398
- .lx-as-item:active { background: rgba(0,0,0,0.08); }
1399
- .lx-as-item + .lx-as-item::before {
1400
- content: ''; position: absolute; top: 0; left: 0; right: 0;
1401
- height: 1px; background: #E0E0E0;
1402
- }
1403
- .lx-as-separator {
1404
- height: 8px;
1405
- background: #F2F2F2;
1406
- }
1407
- .lx-as-cancel-btn { font-weight: 500; color: #000; }
1408
- `, document.head.appendChild(e);
1409
- }
1410
- function Zt(e) {
1411
- const t = e, n = t?.itemList ?? [], r = t?.cancelText ?? "Cancel", o = t?.itemColor ?? "#007AFF", i = (it ?? Promise.resolve()).then(() => st(n, r, o), () => st(n, r, o));
1412
- return it = i, i;
1413
- }
1414
- function st(e, t, n) {
1415
- return new Promise((r) => {
1416
- let o = !1;
1417
- const i = Kt();
1418
- Qt();
1419
- const a = document.createElement("div");
1420
- a.className = "lx-as-backdrop";
1421
- const s = document.createElement("div");
1422
- s.className = "lx-as-sheet", i && s.classList.add("lx-as-desktop");
1423
- const u = document.createElement("div");
1424
- u.className = "lx-as-container", i && u.classList.add("lx-as-desktop"), e.forEach((m, y) => {
1425
- const f = document.createElement("button");
1426
- f.className = "lx-as-item", f.textContent = m, f.style.color = n, f.addEventListener("click", () => d(y)), u.appendChild(f);
1427
- });
1428
- const l = document.createElement("div");
1429
- l.className = "lx-as-separator", u.appendChild(l);
1430
- const c = document.createElement("button");
1431
- c.className = "lx-as-item lx-as-cancel-btn", c.textContent = t, c.addEventListener("click", () => d(-1)), u.appendChild(c), s.appendChild(u), document.body.appendChild(a), document.body.appendChild(s), requestAnimationFrame(() => {
1432
- a.classList.add("lx-as-visible"), s.classList.add("lx-as-visible");
1433
- }), a.addEventListener("click", () => d(-1));
1434
- function d(m) {
1435
- o || (o = !0, a.classList.remove("lx-as-visible"), s.classList.remove("lx-as-visible"), setTimeout(() => {
1436
- a.remove(), s.remove(), r({ tapIndex: m });
1437
- }, Ie));
1438
- }
1439
- });
1440
- }
1441
- const at = "lx-modal-style";
1442
- let lt = null;
1443
- function en() {
1444
- if (document.getElementById(at)) return;
1445
- const e = document.createElement("style");
1446
- e.id = at, e.textContent = `
1447
- .lx-modal-backdrop {
1448
- position: fixed; inset: 0; z-index: 99999;
1449
- background: rgba(0,0,0,0.4);
1450
- opacity: 0; transition: opacity 200ms ease;
1451
- display: flex; align-items: center; justify-content: center;
1452
- }
1453
- .lx-modal-backdrop.lx-modal-visible { opacity: 1; }
1454
-
1455
- .lx-modal-dialog {
1456
- width: min(92vw, 320px);
1457
- background: #fff;
1458
- border-radius: 14px;
1459
- overflow: hidden;
1460
- font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', Roboto, sans-serif;
1461
- -webkit-font-smoothing: antialiased;
1462
- transform: scale(0.95); opacity: 0;
1463
- transition: transform 200ms ease, opacity 200ms ease;
1464
- }
1465
- .lx-modal-backdrop.lx-modal-visible .lx-modal-dialog {
1466
- transform: scale(1); opacity: 1;
1467
- }
1468
-
1469
- .lx-modal-body {
1470
- padding: 24px 20px 16px;
1471
- text-align: center;
1472
- }
1473
- .lx-modal-title {
1474
- margin: 0 0 8px;
1475
- font-size: 17px;
1476
- font-weight: 600;
1477
- color: #000;
1478
- line-height: 1.35;
1479
- }
1480
- .lx-modal-content {
1481
- margin: 0;
1482
- font-size: 14px;
1483
- color: #666;
1484
- line-height: 1.5;
1485
- word-break: break-word;
1486
- }
1487
- .lx-modal-body:has(.lx-modal-title:empty) .lx-modal-content {
1488
- font-size: 17px;
1489
- font-weight: 600;
1490
- color: #000;
1491
- }
1492
-
1493
- .lx-modal-footer {
1494
- display: flex;
1495
- border-top: 1px solid #E0E0E0;
1496
- }
1497
- .lx-modal-btn {
1498
- flex: 1;
1499
- height: 44px;
1500
- line-height: 44px;
1501
- padding: 0;
1502
- border: none;
1503
- background: none;
1504
- font-size: 17px;
1505
- text-align: center;
1506
- cursor: pointer;
1507
- -webkit-tap-highlight-color: transparent;
1508
- }
1509
- .lx-modal-btn:active { background: rgba(0,0,0,0.06); }
1510
- .lx-modal-btn + .lx-modal-btn {
1511
- border-left: 1px solid #E0E0E0;
1512
- }
1513
- .lx-modal-btn-cancel {
1514
- color: #666;
1515
- font-weight: 400;
1516
- }
1517
- .lx-modal-btn-confirm {
1518
- font-weight: 600;
1519
- }
1520
-
1521
- @media (prefers-color-scheme: dark) {
1522
- .lx-modal-dialog { background: #2c2c2e; }
1523
- .lx-modal-title { color: #f5f5f7; }
1524
- .lx-modal-content { color: #ababab; }
1525
- .lx-modal-body:has(.lx-modal-title:empty) .lx-modal-content {
1526
- color: #f5f5f7;
1527
- }
1528
- .lx-modal-footer { border-top-color: #3a3a3c; }
1529
- .lx-modal-btn:active { background: rgba(255,255,255,0.08); }
1530
- .lx-modal-btn + .lx-modal-btn { border-left-color: #3a3a3c; }
1531
- .lx-modal-btn-cancel { color: #ababab; }
1532
- }
1533
- `, document.head.appendChild(e);
1534
- }
1535
- function tn(e) {
1536
- const t = e, n = t?.title ?? "", r = t?.content ?? "", o = t?.showCancel ?? !0, i = t?.cancelText ?? "Cancel", a = t?.cancelColor, s = t?.confirmText ?? "OK", u = t?.confirmColor ?? "#007AFF", l = (lt ?? Promise.resolve()).then(() => ct(n, r, o, i, a, s, u), () => ct(n, r, o, i, a, s, u));
1537
- return lt = l, l;
1538
- }
1539
- function ct(e, t, n, r, o, i, a) {
1540
- return new Promise((s) => {
1541
- let u = !1;
1542
- en();
1543
- const l = document.createElement("div");
1544
- l.className = "lx-modal-backdrop";
1545
- const c = document.createElement("div");
1546
- c.className = "lx-modal-dialog";
1547
- const d = document.createElement("div");
1548
- d.className = "lx-modal-body";
1549
- const m = document.createElement("div");
1550
- if (m.className = "lx-modal-title", m.textContent = e, d.appendChild(m), t) {
1551
- const g = document.createElement("p");
1552
- g.className = "lx-modal-content", g.textContent = t, d.appendChild(g);
1553
- }
1554
- c.appendChild(d);
1555
- const y = document.createElement("div");
1556
- if (y.className = "lx-modal-footer", n) {
1557
- const g = document.createElement("button");
1558
- g.className = "lx-modal-btn lx-modal-btn-cancel", g.textContent = r, o && (g.style.color = o), g.addEventListener("click", () => p(!1)), y.appendChild(g);
1559
- }
1560
- const f = document.createElement("button");
1561
- f.className = "lx-modal-btn lx-modal-btn-confirm", f.textContent = i, f.style.color = a, f.addEventListener("click", () => p(!0)), y.appendChild(f), c.appendChild(y), l.appendChild(c), document.body.appendChild(l), requestAnimationFrame(() => {
1562
- l.classList.add("lx-modal-visible");
1563
- });
1564
- function p(g) {
1565
- u || (u = !0, l.classList.remove("lx-modal-visible"), setTimeout(() => {
1566
- l.remove(), s({
1567
- confirm: g,
1568
- cancel: !g
1569
- });
1570
- }, 200));
1571
- }
1572
- });
1573
- }
1574
- const dt = "lx-toast-style";
1575
- let T = null;
1576
- const nn = "<svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"18\" cy=\"18\" r=\"17\" stroke=\"currentColor\" stroke-width=\"2\"/><path d=\"M11 18l5 5 9-9\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>", on = "<svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"18\" cy=\"18\" r=\"17\" stroke=\"currentColor\" stroke-width=\"2\"/><path d=\"M13 13l10 10M23 13l-10 10\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"/></svg>", rn = "<svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18 4a14 14 0 0 1 14 14\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 18 18\" to=\"360 18 18\" dur=\"0.8s\" repeatCount=\"indefinite\"/></path></svg>";
1577
- function sn() {
1578
- if (document.getElementById(dt)) return;
1579
- const e = document.createElement("style");
1580
- e.id = dt, e.textContent = `
1581
- .lx-toast-mask {
1582
- position: fixed; inset: 0; z-index: 99998;
1583
- }
1584
- .lx-toast-container {
1585
- position: fixed; left: 0; right: 0; z-index: 99999;
1586
- display: flex; justify-content: center;
1587
- pointer-events: none;
1588
- }
1589
- .lx-toast-container.lx-toast-top { top: 0; padding-top: 80px; }
1590
- .lx-toast-container.lx-toast-center { top: 0; bottom: 0; align-items: center; }
1591
- .lx-toast-container.lx-toast-bottom { bottom: 0; padding-bottom: 80px; }
1592
-
1593
- .lx-toast-box {
1594
- display: flex; flex-direction: column; align-items: center; gap: 10px;
1595
- min-width: 120px; max-width: 280px;
1596
- padding: 20px;
1597
- background: rgba(0,0,0,0.8);
1598
- border-radius: 12px;
1599
- color: #fff;
1600
- pointer-events: auto;
1601
- transform: scale(0.8); opacity: 0;
1602
- transition: transform 200ms ease, opacity 200ms ease;
1603
- }
1604
- .lx-toast-box.lx-toast-no-icon {
1605
- min-width: auto; min-height: auto;
1606
- padding: 12px 20px;
1607
- }
1608
- .lx-toast-box.lx-toast-visible {
1609
- transform: scale(1); opacity: 1;
1610
- }
1611
- .lx-toast-icon {
1612
- width: 36px; height: 36px;
1613
- color: #fff;
1614
- line-height: 0;
1615
- }
1616
- .lx-toast-title {
1617
- font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', Roboto, sans-serif;
1618
- font-size: 16px; font-weight: 500;
1619
- text-align: center;
1620
- line-height: 1.4;
1621
- word-break: break-word;
1622
- -webkit-font-smoothing: antialiased;
1623
- }
1624
- `, document.head.appendChild(e);
1625
- }
1626
- function an(e) {
1627
- const t = e, n = t?.title ?? "", r = t?.icon ?? "none", o = t?.duration ?? 1500, i = t?.mask ?? !1, a = t?.position ?? "center";
1628
- T && (T.dismiss(), T = null), sn();
1629
- let s = null;
1630
- i && (s = document.createElement("div"), s.className = "lx-toast-mask", document.body.appendChild(s));
1631
- const u = document.createElement("div");
1632
- u.className = "lx-toast-container", a === "top" ? u.classList.add("lx-toast-top") : a === "bottom" ? u.classList.add("lx-toast-bottom") : u.classList.add("lx-toast-center");
1633
- const l = document.createElement("div");
1634
- l.className = "lx-toast-box";
1635
- const c = r !== "none";
1636
- if (c || l.classList.add("lx-toast-no-icon"), c) {
1637
- const p = document.createElement("div");
1638
- p.className = "lx-toast-icon", r === "success" ? p.innerHTML = nn : r === "error" ? p.innerHTML = on : r === "loading" && (p.innerHTML = rn), l.appendChild(p);
1639
- }
1640
- const d = document.createElement("div");
1641
- d.className = "lx-toast-title", d.textContent = n, l.appendChild(d), u.appendChild(l), document.body.appendChild(u), requestAnimationFrame(() => {
1642
- l.classList.add("lx-toast-visible");
1643
- });
1644
- let m = !1;
1645
- function y() {
1646
- m || (m = !0, T?.dismiss === y && (T = null), l.classList.remove("lx-toast-visible"), f && clearTimeout(f), setTimeout(() => {
1647
- u.remove(), s?.remove();
1648
- }, 200));
1649
- }
1650
- let f = null;
1651
- return o > 0 && (f = setTimeout(y, o)), T = {
1652
- dismiss: y,
1653
- timer: f
1654
- }, Promise.resolve();
1655
- }
1656
- function ln() {
1657
- return T && (T.dismiss(), T = null), Promise.resolve();
1658
- }
1659
- function cn() {
1660
- ne("ui.showActionSheet", Zt), ne("ui.showModal", tn), ne("ui.showToast", an), ne("ui.hideToast", ln);
1661
- }
1662
- return cn(), Vt(), ot(), I.LingXiaBridge = P, I.boot = Wt, I.bootWhenReady = ot, I.getErrorInfo = nt, I.hasError = tt, I.host = Qe, I.initBridge = Ee, I.renderErrorUI = et, I;
1663
- })({});