@studiometa/playground-preview 0.3.4

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,1177 @@
1
+ // ../../node_modules/fflate/esm/browser.js
2
+ var u8 = Uint8Array;
3
+ var u16 = Uint16Array;
4
+ var i32 = Int32Array;
5
+ var fleb = new u8([
6
+ 0,
7
+ 0,
8
+ 0,
9
+ 0,
10
+ 0,
11
+ 0,
12
+ 0,
13
+ 0,
14
+ 1,
15
+ 1,
16
+ 1,
17
+ 1,
18
+ 2,
19
+ 2,
20
+ 2,
21
+ 2,
22
+ 3,
23
+ 3,
24
+ 3,
25
+ 3,
26
+ 4,
27
+ 4,
28
+ 4,
29
+ 4,
30
+ 5,
31
+ 5,
32
+ 5,
33
+ 5,
34
+ 0,
35
+ /* unused */
36
+ 0,
37
+ 0,
38
+ /* impossible */
39
+ 0
40
+ ]);
41
+ var fdeb = new u8([
42
+ 0,
43
+ 0,
44
+ 0,
45
+ 0,
46
+ 1,
47
+ 1,
48
+ 2,
49
+ 2,
50
+ 3,
51
+ 3,
52
+ 4,
53
+ 4,
54
+ 5,
55
+ 5,
56
+ 6,
57
+ 6,
58
+ 7,
59
+ 7,
60
+ 8,
61
+ 8,
62
+ 9,
63
+ 9,
64
+ 10,
65
+ 10,
66
+ 11,
67
+ 11,
68
+ 12,
69
+ 12,
70
+ 13,
71
+ 13,
72
+ /* unused */
73
+ 0,
74
+ 0
75
+ ]);
76
+ var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
77
+ var freb = function(eb, start) {
78
+ var b = new u16(31);
79
+ for (var i = 0; i < 31; ++i) {
80
+ b[i] = start += 1 << eb[i - 1];
81
+ }
82
+ var r = new i32(b[30]);
83
+ for (var i = 1; i < 30; ++i) {
84
+ for (var j = b[i]; j < b[i + 1]; ++j) {
85
+ r[j] = j - b[i] << 5 | i;
86
+ }
87
+ }
88
+ return { b, r };
89
+ };
90
+ var _a = freb(fleb, 2);
91
+ var fl = _a.b;
92
+ var revfl = _a.r;
93
+ fl[28] = 258, revfl[258] = 28;
94
+ var _b = freb(fdeb, 0);
95
+ var fd = _b.b;
96
+ var revfd = _b.r;
97
+ var rev = new u16(32768);
98
+ for (i = 0; i < 32768; ++i) {
99
+ x = (i & 43690) >> 1 | (i & 21845) << 1;
100
+ x = (x & 52428) >> 2 | (x & 13107) << 2;
101
+ x = (x & 61680) >> 4 | (x & 3855) << 4;
102
+ rev[i] = ((x & 65280) >> 8 | (x & 255) << 8) >> 1;
103
+ }
104
+ var x;
105
+ var i;
106
+ var hMap = function(cd, mb, r) {
107
+ var s = cd.length;
108
+ var i = 0;
109
+ var l = new u16(mb);
110
+ for (; i < s; ++i) {
111
+ if (cd[i])
112
+ ++l[cd[i] - 1];
113
+ }
114
+ var le = new u16(mb);
115
+ for (i = 1; i < mb; ++i) {
116
+ le[i] = le[i - 1] + l[i - 1] << 1;
117
+ }
118
+ var co;
119
+ if (r) {
120
+ co = new u16(1 << mb);
121
+ var rvb = 15 - mb;
122
+ for (i = 0; i < s; ++i) {
123
+ if (cd[i]) {
124
+ var sv = i << 4 | cd[i];
125
+ var r_1 = mb - cd[i];
126
+ var v = le[cd[i] - 1]++ << r_1;
127
+ for (var m = v | (1 << r_1) - 1; v <= m; ++v) {
128
+ co[rev[v] >> rvb] = sv;
129
+ }
130
+ }
131
+ }
132
+ } else {
133
+ co = new u16(s);
134
+ for (i = 0; i < s; ++i) {
135
+ if (cd[i]) {
136
+ co[i] = rev[le[cd[i] - 1]++] >> 15 - cd[i];
137
+ }
138
+ }
139
+ }
140
+ return co;
141
+ };
142
+ var flt = new u8(288);
143
+ for (i = 0; i < 144; ++i)
144
+ flt[i] = 8;
145
+ var i;
146
+ for (i = 144; i < 256; ++i)
147
+ flt[i] = 9;
148
+ var i;
149
+ for (i = 256; i < 280; ++i)
150
+ flt[i] = 7;
151
+ var i;
152
+ for (i = 280; i < 288; ++i)
153
+ flt[i] = 8;
154
+ var i;
155
+ var fdt = new u8(32);
156
+ for (i = 0; i < 32; ++i)
157
+ fdt[i] = 5;
158
+ var i;
159
+ var flm = /* @__PURE__ */ hMap(flt, 9, 0);
160
+ var fdm = /* @__PURE__ */ hMap(fdt, 5, 0);
161
+ var shft = function(p) {
162
+ return (p + 7) / 8 | 0;
163
+ };
164
+ var slc = function(v, s, e) {
165
+ if (s == null || s < 0)
166
+ s = 0;
167
+ if (e == null || e > v.length)
168
+ e = v.length;
169
+ return new u8(v.subarray(s, e));
170
+ };
171
+ var ec = [
172
+ "unexpected EOF",
173
+ "invalid block type",
174
+ "invalid length/literal",
175
+ "invalid distance",
176
+ "stream finished",
177
+ "no stream handler",
178
+ ,
179
+ "no callback",
180
+ "invalid UTF-8 data",
181
+ "extra field too long",
182
+ "date not in range 1980-2099",
183
+ "filename too long",
184
+ "stream finishing",
185
+ "invalid zip data"
186
+ // determined by unknown compression method
187
+ ];
188
+ var err = function(ind, msg, nt) {
189
+ var e = new Error(msg || ec[ind]);
190
+ e.code = ind;
191
+ if (Error.captureStackTrace)
192
+ Error.captureStackTrace(e, err);
193
+ if (!nt)
194
+ throw e;
195
+ return e;
196
+ };
197
+ var wbits = function(d, p, v) {
198
+ v <<= p & 7;
199
+ var o = p / 8 | 0;
200
+ d[o] |= v;
201
+ d[o + 1] |= v >> 8;
202
+ };
203
+ var wbits16 = function(d, p, v) {
204
+ v <<= p & 7;
205
+ var o = p / 8 | 0;
206
+ d[o] |= v;
207
+ d[o + 1] |= v >> 8;
208
+ d[o + 2] |= v >> 16;
209
+ };
210
+ var hTree = function(d, mb) {
211
+ var t = [];
212
+ for (var i = 0; i < d.length; ++i) {
213
+ if (d[i])
214
+ t.push({ s: i, f: d[i] });
215
+ }
216
+ var s = t.length;
217
+ var t2 = t.slice();
218
+ if (!s)
219
+ return { t: et, l: 0 };
220
+ if (s == 1) {
221
+ var v = new u8(t[0].s + 1);
222
+ v[t[0].s] = 1;
223
+ return { t: v, l: 1 };
224
+ }
225
+ t.sort(function(a, b) {
226
+ return a.f - b.f;
227
+ });
228
+ t.push({ s: -1, f: 25001 });
229
+ var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;
230
+ t[0] = { s: -1, f: l.f + r.f, l, r };
231
+ while (i1 != s - 1) {
232
+ l = t[t[i0].f < t[i2].f ? i0++ : i2++];
233
+ r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];
234
+ t[i1++] = { s: -1, f: l.f + r.f, l, r };
235
+ }
236
+ var maxSym = t2[0].s;
237
+ for (var i = 1; i < s; ++i) {
238
+ if (t2[i].s > maxSym)
239
+ maxSym = t2[i].s;
240
+ }
241
+ var tr = new u16(maxSym + 1);
242
+ var mbt = ln(t[i1 - 1], tr, 0);
243
+ if (mbt > mb) {
244
+ var i = 0, dt = 0;
245
+ var lft = mbt - mb, cst = 1 << lft;
246
+ t2.sort(function(a, b) {
247
+ return tr[b.s] - tr[a.s] || a.f - b.f;
248
+ });
249
+ for (; i < s; ++i) {
250
+ var i2_1 = t2[i].s;
251
+ if (tr[i2_1] > mb) {
252
+ dt += cst - (1 << mbt - tr[i2_1]);
253
+ tr[i2_1] = mb;
254
+ } else
255
+ break;
256
+ }
257
+ dt >>= lft;
258
+ while (dt > 0) {
259
+ var i2_2 = t2[i].s;
260
+ if (tr[i2_2] < mb)
261
+ dt -= 1 << mb - tr[i2_2]++ - 1;
262
+ else
263
+ ++i;
264
+ }
265
+ for (; i >= 0 && dt; --i) {
266
+ var i2_3 = t2[i].s;
267
+ if (tr[i2_3] == mb) {
268
+ --tr[i2_3];
269
+ ++dt;
270
+ }
271
+ }
272
+ mbt = mb;
273
+ }
274
+ return { t: new u8(tr), l: mbt };
275
+ };
276
+ var ln = function(n, l, d) {
277
+ return n.s == -1 ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1)) : l[n.s] = d;
278
+ };
279
+ var lc = function(c) {
280
+ var s = c.length;
281
+ while (s && !c[--s])
282
+ ;
283
+ var cl = new u16(++s);
284
+ var cli = 0, cln = c[0], cls = 1;
285
+ var w = function(v) {
286
+ cl[cli++] = v;
287
+ };
288
+ for (var i = 1; i <= s; ++i) {
289
+ if (c[i] == cln && i != s)
290
+ ++cls;
291
+ else {
292
+ if (!cln && cls > 2) {
293
+ for (; cls > 138; cls -= 138)
294
+ w(32754);
295
+ if (cls > 2) {
296
+ w(cls > 10 ? cls - 11 << 5 | 28690 : cls - 3 << 5 | 12305);
297
+ cls = 0;
298
+ }
299
+ } else if (cls > 3) {
300
+ w(cln), --cls;
301
+ for (; cls > 6; cls -= 6)
302
+ w(8304);
303
+ if (cls > 2)
304
+ w(cls - 3 << 5 | 8208), cls = 0;
305
+ }
306
+ while (cls--)
307
+ w(cln);
308
+ cls = 1;
309
+ cln = c[i];
310
+ }
311
+ }
312
+ return { c: cl.subarray(0, cli), n: s };
313
+ };
314
+ var clen = function(cf, cl) {
315
+ var l = 0;
316
+ for (var i = 0; i < cl.length; ++i)
317
+ l += cf[i] * cl[i];
318
+ return l;
319
+ };
320
+ var wfblk = function(out, pos, dat) {
321
+ var s = dat.length;
322
+ var o = shft(pos + 2);
323
+ out[o] = s & 255;
324
+ out[o + 1] = s >> 8;
325
+ out[o + 2] = out[o] ^ 255;
326
+ out[o + 3] = out[o + 1] ^ 255;
327
+ for (var i = 0; i < s; ++i)
328
+ out[o + i + 4] = dat[i];
329
+ return (o + 4 + s) * 8;
330
+ };
331
+ var wblk = function(dat, out, final, syms, lf, df, eb, li, bs, bl, p) {
332
+ wbits(out, p++, final);
333
+ ++lf[256];
334
+ var _a2 = hTree(lf, 15), dlt = _a2.t, mlb = _a2.l;
335
+ var _b2 = hTree(df, 15), ddt = _b2.t, mdb = _b2.l;
336
+ var _c = lc(dlt), lclt = _c.c, nlc = _c.n;
337
+ var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;
338
+ var lcfreq = new u16(19);
339
+ for (var i = 0; i < lclt.length; ++i)
340
+ ++lcfreq[lclt[i] & 31];
341
+ for (var i = 0; i < lcdt.length; ++i)
342
+ ++lcfreq[lcdt[i] & 31];
343
+ var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;
344
+ var nlcc = 19;
345
+ for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)
346
+ ;
347
+ var flen = bl + 5 << 3;
348
+ var ftlen = clen(lf, flt) + clen(df, fdt) + eb;
349
+ var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];
350
+ if (bs >= 0 && flen <= ftlen && flen <= dtlen)
351
+ return wfblk(out, p, dat.subarray(bs, bs + bl));
352
+ var lm, ll, dm, dl;
353
+ wbits(out, p, 1 + (dtlen < ftlen)), p += 2;
354
+ if (dtlen < ftlen) {
355
+ lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;
356
+ var llm = hMap(lct, mlcb, 0);
357
+ wbits(out, p, nlc - 257);
358
+ wbits(out, p + 5, ndc - 1);
359
+ wbits(out, p + 10, nlcc - 4);
360
+ p += 14;
361
+ for (var i = 0; i < nlcc; ++i)
362
+ wbits(out, p + 3 * i, lct[clim[i]]);
363
+ p += 3 * nlcc;
364
+ var lcts = [lclt, lcdt];
365
+ for (var it = 0; it < 2; ++it) {
366
+ var clct = lcts[it];
367
+ for (var i = 0; i < clct.length; ++i) {
368
+ var len = clct[i] & 31;
369
+ wbits(out, p, llm[len]), p += lct[len];
370
+ if (len > 15)
371
+ wbits(out, p, clct[i] >> 5 & 127), p += clct[i] >> 12;
372
+ }
373
+ }
374
+ } else {
375
+ lm = flm, ll = flt, dm = fdm, dl = fdt;
376
+ }
377
+ for (var i = 0; i < li; ++i) {
378
+ var sym = syms[i];
379
+ if (sym > 255) {
380
+ var len = sym >> 18 & 31;
381
+ wbits16(out, p, lm[len + 257]), p += ll[len + 257];
382
+ if (len > 7)
383
+ wbits(out, p, sym >> 23 & 31), p += fleb[len];
384
+ var dst = sym & 31;
385
+ wbits16(out, p, dm[dst]), p += dl[dst];
386
+ if (dst > 3)
387
+ wbits16(out, p, sym >> 5 & 8191), p += fdeb[dst];
388
+ } else {
389
+ wbits16(out, p, lm[sym]), p += ll[sym];
390
+ }
391
+ }
392
+ wbits16(out, p, lm[256]);
393
+ return p + ll[256];
394
+ };
395
+ var deo = /* @__PURE__ */ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);
396
+ var et = /* @__PURE__ */ new u8(0);
397
+ var dflt = function(dat, lvl, plvl, pre, post, st) {
398
+ var s = st.z || dat.length;
399
+ var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7e3)) + post);
400
+ var w = o.subarray(pre, o.length - post);
401
+ var lst = st.l;
402
+ var pos = (st.r || 0) & 7;
403
+ if (lvl) {
404
+ if (pos)
405
+ w[0] = st.r >> 3;
406
+ var opt = deo[lvl - 1];
407
+ var n = opt >> 13, c = opt & 8191;
408
+ var msk_1 = (1 << plvl) - 1;
409
+ var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);
410
+ var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;
411
+ var hsh = function(i2) {
412
+ return (dat[i2] ^ dat[i2 + 1] << bs1_1 ^ dat[i2 + 2] << bs2_1) & msk_1;
413
+ };
414
+ var syms = new i32(25e3);
415
+ var lf = new u16(288), df = new u16(32);
416
+ var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;
417
+ for (; i + 2 < s; ++i) {
418
+ var hv = hsh(i);
419
+ var imod = i & 32767, pimod = head[hv];
420
+ prev[imod] = pimod;
421
+ head[hv] = imod;
422
+ if (wi <= i) {
423
+ var rem = s - i;
424
+ if ((lc_1 > 7e3 || li > 24576) && (rem > 423 || !lst)) {
425
+ pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);
426
+ li = lc_1 = eb = 0, bs = i;
427
+ for (var j = 0; j < 286; ++j)
428
+ lf[j] = 0;
429
+ for (var j = 0; j < 30; ++j)
430
+ df[j] = 0;
431
+ }
432
+ var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;
433
+ if (rem > 2 && hv == hsh(i - dif)) {
434
+ var maxn = Math.min(n, rem) - 1;
435
+ var maxd = Math.min(32767, i);
436
+ var ml = Math.min(258, rem);
437
+ while (dif <= maxd && --ch_1 && imod != pimod) {
438
+ if (dat[i + l] == dat[i + l - dif]) {
439
+ var nl = 0;
440
+ for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)
441
+ ;
442
+ if (nl > l) {
443
+ l = nl, d = dif;
444
+ if (nl > maxn)
445
+ break;
446
+ var mmd = Math.min(dif, nl - 2);
447
+ var md = 0;
448
+ for (var j = 0; j < mmd; ++j) {
449
+ var ti = i - dif + j & 32767;
450
+ var pti = prev[ti];
451
+ var cd = ti - pti & 32767;
452
+ if (cd > md)
453
+ md = cd, pimod = ti;
454
+ }
455
+ }
456
+ }
457
+ imod = pimod, pimod = prev[imod];
458
+ dif += imod - pimod & 32767;
459
+ }
460
+ }
461
+ if (d) {
462
+ syms[li++] = 268435456 | revfl[l] << 18 | revfd[d];
463
+ var lin = revfl[l] & 31, din = revfd[d] & 31;
464
+ eb += fleb[lin] + fdeb[din];
465
+ ++lf[257 + lin];
466
+ ++df[din];
467
+ wi = i + l;
468
+ ++lc_1;
469
+ } else {
470
+ syms[li++] = dat[i];
471
+ ++lf[dat[i]];
472
+ }
473
+ }
474
+ }
475
+ for (i = Math.max(i, wi); i < s; ++i) {
476
+ syms[li++] = dat[i];
477
+ ++lf[dat[i]];
478
+ }
479
+ pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);
480
+ if (!lst) {
481
+ st.r = pos & 7 | w[pos / 8 | 0] << 3;
482
+ pos -= 7;
483
+ st.h = head, st.p = prev, st.i = i, st.w = wi;
484
+ }
485
+ } else {
486
+ for (var i = st.w || 0; i < s + lst; i += 65535) {
487
+ var e = i + 65535;
488
+ if (e >= s) {
489
+ w[pos / 8 | 0] = lst;
490
+ e = s;
491
+ }
492
+ pos = wfblk(w, pos + 1, dat.subarray(i, e));
493
+ }
494
+ st.i = s;
495
+ }
496
+ return slc(o, 0, pre + shft(pos) + post);
497
+ };
498
+ var adler = function() {
499
+ var a = 1, b = 0;
500
+ return {
501
+ p: function(d) {
502
+ var n = a, m = b;
503
+ var l = d.length | 0;
504
+ for (var i = 0; i != l; ) {
505
+ var e = Math.min(i + 2655, l);
506
+ for (; i < e; ++i)
507
+ m += n += d[i];
508
+ n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);
509
+ }
510
+ a = n, b = m;
511
+ },
512
+ d: function() {
513
+ a %= 65521, b %= 65521;
514
+ return (a & 255) << 24 | (a & 65280) << 8 | (b & 255) << 8 | b >> 8;
515
+ }
516
+ };
517
+ };
518
+ var dopt = function(dat, opt, pre, post, st) {
519
+ if (!st) {
520
+ st = { l: 1 };
521
+ if (opt.dictionary) {
522
+ var dict = opt.dictionary.subarray(-32768);
523
+ var newDat = new u8(dict.length + dat.length);
524
+ newDat.set(dict);
525
+ newDat.set(dat, dict.length);
526
+ dat = newDat;
527
+ st.w = dict.length;
528
+ }
529
+ }
530
+ return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20 : 12 + opt.mem, pre, post, st);
531
+ };
532
+ var wbytes = function(d, b, v) {
533
+ for (; v; ++b)
534
+ d[b] = v, v >>>= 8;
535
+ };
536
+ var zlh = function(c, o) {
537
+ var lv = o.level, fl2 = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;
538
+ c[0] = 120, c[1] = fl2 << 6 | (o.dictionary && 32);
539
+ c[1] |= 31 - (c[0] << 8 | c[1]) % 31;
540
+ if (o.dictionary) {
541
+ var h = adler();
542
+ h.p(o.dictionary);
543
+ wbytes(c, 2, h.d());
544
+ }
545
+ };
546
+ function zlibSync(data, opts) {
547
+ if (!opts)
548
+ opts = {};
549
+ var a = adler();
550
+ a.p(data);
551
+ var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);
552
+ return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;
553
+ }
554
+ var te = typeof TextEncoder != "undefined" && /* @__PURE__ */ new TextEncoder();
555
+ var td = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder();
556
+ var tds = 0;
557
+ try {
558
+ td.decode(et, { stream: true });
559
+ tds = 1;
560
+ } catch (e) {
561
+ }
562
+ var dutf8 = function(d) {
563
+ for (var r = "", i = 0; ; ) {
564
+ var c = d[i++];
565
+ var eb = (c > 127) + (c > 223) + (c > 239);
566
+ if (i + eb > d.length)
567
+ return { s: r, r: slc(d, i - 1) };
568
+ if (!eb)
569
+ r += String.fromCharCode(c);
570
+ else if (eb == 3) {
571
+ c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | d[i++] & 63) - 65536, r += String.fromCharCode(55296 | c >> 10, 56320 | c & 1023);
572
+ } else if (eb & 1)
573
+ r += String.fromCharCode((c & 31) << 6 | d[i++] & 63);
574
+ else
575
+ r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | d[i++] & 63);
576
+ }
577
+ };
578
+ function strToU8(str, latin1) {
579
+ if (latin1) {
580
+ var ar_1 = new u8(str.length);
581
+ for (var i = 0; i < str.length; ++i)
582
+ ar_1[i] = str.charCodeAt(i);
583
+ return ar_1;
584
+ }
585
+ if (te)
586
+ return te.encode(str);
587
+ var l = str.length;
588
+ var ar = new u8(str.length + (str.length >> 1));
589
+ var ai = 0;
590
+ var w = function(v) {
591
+ ar[ai++] = v;
592
+ };
593
+ for (var i = 0; i < l; ++i) {
594
+ if (ai + 5 > ar.length) {
595
+ var n = new u8(ai + 8 + (l - i << 1));
596
+ n.set(ar);
597
+ ar = n;
598
+ }
599
+ var c = str.charCodeAt(i);
600
+ if (c < 128 || latin1)
601
+ w(c);
602
+ else if (c < 2048)
603
+ w(192 | c >> 6), w(128 | c & 63);
604
+ else if (c > 55295 && c < 57344)
605
+ c = 65536 + (c & 1023 << 10) | str.charCodeAt(++i) & 1023, w(240 | c >> 18), w(128 | c >> 12 & 63), w(128 | c >> 6 & 63), w(128 | c & 63);
606
+ else
607
+ w(224 | c >> 12), w(128 | c >> 6 & 63), w(128 | c & 63);
608
+ }
609
+ return slc(ar, 0, ai);
610
+ }
611
+ function strFromU8(dat, latin1) {
612
+ if (latin1) {
613
+ var r = "";
614
+ for (var i = 0; i < dat.length; i += 16384)
615
+ r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));
616
+ return r;
617
+ } else if (td) {
618
+ return td.decode(dat);
619
+ } else {
620
+ var _a2 = dutf8(dat), s = _a2.s, r = _a2.r;
621
+ if (r.length)
622
+ err(8);
623
+ return s;
624
+ }
625
+ }
626
+
627
+ // src/zip.ts
628
+ function zip(data) {
629
+ const buffer = strToU8(data);
630
+ const zipped = zlibSync(buffer, { level: 9 });
631
+ const binary = strFromU8(zipped, true);
632
+ return btoa(binary);
633
+ }
634
+
635
+ // src/styles.ts
636
+ var styles = (
637
+ /* css */
638
+ `
639
+ :host {
640
+ --pg-bg: #f4f4f5;
641
+ --pg-bg-dark: #27272a;
642
+ --pg-controls-bg: rgba(0, 0, 0, 0.55);
643
+ --pg-controls-bg-hover: rgba(0, 0, 0, 0.75);
644
+ --pg-controls-color: #fff;
645
+ --pg-border-color: #e4e4e7;
646
+ --pg-border-color-dark: #3f3f46;
647
+ --pg-border-radius: 8px;
648
+ --pg-loader-color: #a1a1aa;
649
+ --pg-transition-duration: 200ms;
650
+
651
+ display: block;
652
+ }
653
+
654
+ *,
655
+ *::before,
656
+ *::after {
657
+ box-sizing: border-box;
658
+ }
659
+
660
+ .container {
661
+ position: relative;
662
+ overflow: hidden;
663
+ border-radius: var(--pg-border-radius);
664
+ border: 1px solid var(--pg-border-color);
665
+ background: var(--pg-bg);
666
+ resize: horizontal;
667
+ }
668
+
669
+ :host([theme="dark"]) .container {
670
+ background: var(--pg-bg-dark);
671
+ border-color: var(--pg-border-color-dark);
672
+ }
673
+
674
+ @media (prefers-color-scheme: dark) {
675
+ :host([theme="auto"]) .container,
676
+ :host(:not([theme])) .container {
677
+ background: var(--pg-bg-dark);
678
+ border-color: var(--pg-border-color-dark);
679
+ }
680
+ }
681
+
682
+ .iframe-wrapper {
683
+ position: relative;
684
+ width: 100%;
685
+ height: 100%;
686
+ overflow: hidden;
687
+ }
688
+
689
+ iframe {
690
+ display: block;
691
+ border: 0;
692
+ background: #fff;
693
+ transform-origin: top left;
694
+ transition: opacity var(--pg-transition-duration) ease;
695
+ }
696
+
697
+ :host([theme="dark"]) iframe {
698
+ background: #18181b;
699
+ }
700
+
701
+ @media (prefers-color-scheme: dark) {
702
+ :host([theme="auto"]) iframe,
703
+ :host(:not([theme])) iframe {
704
+ background: #18181b;
705
+ }
706
+ }
707
+
708
+ iframe.loading {
709
+ opacity: 0;
710
+ }
711
+
712
+ .controls {
713
+ position: absolute;
714
+ bottom: 0;
715
+ left: 0;
716
+ display: flex;
717
+ gap: 4px;
718
+ padding: 8px;
719
+ z-index: 10;
720
+ }
721
+
722
+ .controls button,
723
+ .controls a {
724
+ display: inline-flex;
725
+ align-items: center;
726
+ justify-content: center;
727
+ width: 28px;
728
+ height: 28px;
729
+ padding: 0;
730
+ border: 0;
731
+ border-radius: 6px;
732
+ background: var(--pg-controls-bg);
733
+ color: var(--pg-controls-color);
734
+ cursor: pointer;
735
+ transition: background-color var(--pg-transition-duration) ease;
736
+ text-decoration: none;
737
+ }
738
+
739
+ .controls button:hover,
740
+ .controls a:hover {
741
+ background: var(--pg-controls-bg-hover);
742
+ }
743
+
744
+ .controls svg {
745
+ width: 14px;
746
+ height: 14px;
747
+ }
748
+
749
+ .sr-only {
750
+ position: absolute;
751
+ width: 1px;
752
+ height: 1px;
753
+ padding: 0;
754
+ margin: -1px;
755
+ overflow: hidden;
756
+ clip: rect(0, 0, 0, 0);
757
+ white-space: nowrap;
758
+ border-width: 0;
759
+ }
760
+
761
+ .loader {
762
+ position: absolute;
763
+ inset: 0;
764
+ display: flex;
765
+ align-items: center;
766
+ justify-content: center;
767
+ color: var(--pg-loader-color);
768
+ pointer-events: none;
769
+ transition: opacity var(--pg-transition-duration) ease;
770
+ }
771
+
772
+ .loader.hidden {
773
+ opacity: 0;
774
+ }
775
+
776
+ .loader svg {
777
+ width: 24px;
778
+ height: 24px;
779
+ animation: spin 1s linear infinite;
780
+ }
781
+
782
+ @keyframes spin {
783
+ from { transform: rotate(0deg); }
784
+ to { transform: rotate(360deg); }
785
+ }
786
+
787
+ .placeholder {
788
+ position: absolute;
789
+ inset: 0;
790
+ display: flex;
791
+ align-items: center;
792
+ justify-content: center;
793
+ color: var(--pg-loader-color);
794
+ font-family: system-ui, -apple-system, sans-serif;
795
+ font-size: 14px;
796
+ }
797
+ `
798
+ );
799
+
800
+ // src/icons.ts
801
+ var zoomInIcon = (
802
+ /* html */
803
+ `<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
804
+ <path d="M1.5 8C1.5 6.27609 2.18482 4.62279 3.40381 3.40381C4.62279 2.18482 6.27609 1.5 8 1.5C9.72391 1.5 11.3772 2.18482 12.5962 3.40381C13.8152 4.62279 14.5 6.27609 14.5 8C14.5 9.72391 13.8152 11.3772 12.5962 12.5962C11.3772 13.8152 9.72391 14.5 8 14.5C6.27609 14.5 4.62279 13.8152 3.40381 12.5962C2.18482 11.3772 1.5 9.72391 1.5 8ZM8 0C5.87827 0 3.84344 0.842855 2.34315 2.34315C0.842855 3.84344 0 5.87827 0 8C0 10.1217 0.842855 12.1566 2.34315 13.6569C3.84344 15.1571 5.87827 16 8 16C10.1217 16 12.1566 15.1571 13.6569 13.6569C15.1571 12.1566 16 10.1217 16 8C16 5.87827 15.1571 3.84344 13.6569 2.34315C12.1566 0.842855 10.1217 0 8 0ZM8.75 4.75C8.75 4.55109 8.67098 4.36032 8.53033 4.21967C8.38968 4.07902 8.19891 4 8 4C7.80109 4 7.61032 4.07902 7.46967 4.21967C7.32902 4.36032 7.25 4.55109 7.25 4.75V7.25H4.75C4.55109 7.25 4.36032 7.32902 4.21967 7.46967C4.07902 7.61032 4 7.80109 4 8C4 8.19891 4.07902 8.38968 4.21967 8.53033C4.36032 8.67098 4.55109 8.75 4.75 8.75H7.25V11.25C7.25 11.4489 7.32902 11.6397 7.46967 11.7803C7.61032 11.921 7.80109 12 8 12C8.19891 12 8.38968 11.921 8.53033 11.7803C8.67098 11.6397 8.75 11.4489 8.75 11.25V8.75H11.25C11.4489 8.75 11.6397 8.67098 11.7803 8.53033C11.921 8.38968 12 8.19891 12 8C12 7.80109 11.921 7.61032 11.7803 7.46967C11.6397 7.32902 11.4489 7.25 11.25 7.25H8.75V4.75Z"/>
805
+ </svg>`
806
+ );
807
+ var zoomOutIcon = (
808
+ /* html */
809
+ `<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
810
+ <path d="M1.5 8C1.5 6.27609 2.18482 4.62279 3.40381 3.40381C4.62279 2.18482 6.27609 1.5 8 1.5C9.72391 1.5 11.3772 2.18482 12.5962 3.40381C13.8152 4.62279 14.5 6.27609 14.5 8C14.5 9.72391 13.8152 11.3772 12.5962 12.5962C11.3772 13.8152 9.72391 14.5 8 14.5C6.27609 14.5 4.62279 13.8152 3.40381 12.5962C2.18482 11.3772 1.5 9.72391 1.5 8ZM8 0C5.87827 0 3.84344 0.842855 2.34315 2.34315C0.842855 3.84344 0 5.87827 0 8C0 10.1217 0.842855 12.1566 2.34315 13.6569C3.84344 15.1571 5.87827 16 8 16C10.1217 16 12.1566 15.1571 13.6569 13.6569C15.1571 12.1566 16 10.1217 16 8C16 5.87827 15.1571 3.84344 13.6569 2.34315C12.1566 0.842855 10.1217 0 8 0ZM4.75 7.25C4.55109 7.25 4.36032 7.32902 4.21967 7.46967C4.07902 7.61032 4 7.80109 4 8C4 8.19891 4.07902 8.38968 4.21967 8.53033C4.36032 8.67098 4.55109 8.75 4.75 8.75C8.91901 8.75 7.54171 8.75 11.25 8.75C11.4489 8.75 11.6397 8.67098 11.7803 8.53033C11.921 8.38968 12 8.19891 12 8C12 7.80109 11.921 7.61032 11.7803 7.46967C11.6397 7.32902 11.4489 7.25 11.25 7.25C7.54231 7.25 8.91825 7.25 4.75 7.25Z"/>
811
+ </svg>`
812
+ );
813
+ var resetIcon = (
814
+ /* html */
815
+ `<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
816
+ <path fill-rule="evenodd" d="M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z"/>
817
+ </svg>`
818
+ );
819
+ var externalLinkIcon = (
820
+ /* html */
821
+ `<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
822
+ <path fill-rule="evenodd" d="M10.604 1h4.146a.25.25 0 01.25.25v4.146a.25.25 0 01-.427.177L13.03 4.03 9.28 7.78a.75.75 0 01-1.06-1.06l3.75-3.75-1.543-1.543A.25.25 0 0110.604 1zM3.75 2A1.75 1.75 0 002 3.75v8.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 12.25v-3.5a.75.75 0 00-1.5 0v3.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-8.5a.25.25 0 01.25-.25h3.5a.75.75 0 000-1.5h-3.5z"/>
823
+ </svg>`
824
+ );
825
+ var reloadIcon = (
826
+ /* html */
827
+ `<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
828
+ <path d="M8 2.5a5.487 5.487 0 00-4.131 1.869l1.204 1.204A.25.25 0 014.896 6H1.25A.25.25 0 011 5.75V2.104a.25.25 0 01.427-.177l1.38 1.38A7.001 7.001 0 0115 8a.75.75 0 01-1.5 0A5.5 5.5 0 008 2.5zM1.75 8a.75.75 0 01.75.75 5.5 5.5 0 009.546 3.727l-1.13-1.13a.25.25 0 01.177-.427h3.607a.25.25 0 01.25.25v3.58a.25.25 0 01-.427.177l-1.38-1.38A7.001 7.001 0 011 8.75.75.75 0 011.75 8z"/>
829
+ </svg>`
830
+ );
831
+ var loaderIcon = (
832
+ /* html */
833
+ `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg">
834
+ <path d="M21 12a9 9 0 11-6.219-8.56"/>
835
+ </svg>`
836
+ );
837
+
838
+ // src/playground-preview.ts
839
+ var DEFAULT_BASE_URL = "https://studiometa-playground.pages.dev";
840
+ var DEFAULT_HEIGHT = "60vh";
841
+ var DEFAULT_ZOOM = 0.9;
842
+ var ZOOM_STEP = 1.1;
843
+ function resolveTheme(theme) {
844
+ if (theme === "dark" || theme === "light") {
845
+ return theme;
846
+ }
847
+ return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
848
+ }
849
+ var PlaygroundPreview = class extends HTMLElement {
850
+ static observedAttributes = [
851
+ "html",
852
+ "script",
853
+ "css",
854
+ "base-url",
855
+ "height",
856
+ "zoom",
857
+ "theme",
858
+ "no-controls",
859
+ "header"
860
+ ];
861
+ #shadow;
862
+ #scale = DEFAULT_ZOOM;
863
+ #iframe = null;
864
+ #observer = null;
865
+ #mediaQuery = null;
866
+ #mediaQueryHandler = null;
867
+ #isVisible = false;
868
+ #isConnected = false;
869
+ // Cached content from <script type="playground/..."> children, read once
870
+ #childHtml = null;
871
+ #childScript = null;
872
+ #childCss = null;
873
+ // DOM references
874
+ #container = null;
875
+ #iframeWrapper = null;
876
+ #loader = null;
877
+ #controls = null;
878
+ #openLink = null;
879
+ constructor() {
880
+ super();
881
+ this.#shadow = this.attachShadow({ mode: "open" });
882
+ }
883
+ connectedCallback() {
884
+ this.#isConnected = true;
885
+ this.#readChildContent();
886
+ this.#render();
887
+ this.#setupIntersectionObserver();
888
+ this.#setupMediaQuery();
889
+ }
890
+ disconnectedCallback() {
891
+ this.#isConnected = false;
892
+ this.#observer?.disconnect();
893
+ this.#observer = null;
894
+ if (this.#mediaQuery && this.#mediaQueryHandler) {
895
+ this.#mediaQuery.removeEventListener("change", this.#mediaQueryHandler);
896
+ this.#mediaQuery = null;
897
+ this.#mediaQueryHandler = null;
898
+ }
899
+ }
900
+ attributeChangedCallback(name, oldValue, newValue) {
901
+ if (!this.#isConnected || oldValue === newValue) return;
902
+ switch (name) {
903
+ case "height":
904
+ this.#updateContainerHeight();
905
+ break;
906
+ case "zoom":
907
+ this.#scale = Number(newValue) || DEFAULT_ZOOM;
908
+ this.#updateIframeScale();
909
+ break;
910
+ case "no-controls":
911
+ this.#updateControlsVisibility();
912
+ break;
913
+ case "html":
914
+ case "script":
915
+ case "css":
916
+ case "base-url":
917
+ case "theme":
918
+ case "header":
919
+ if (this.#isVisible) {
920
+ this.#updateIframeSrc();
921
+ }
922
+ break;
923
+ }
924
+ }
925
+ // -------------------------------------------------------
926
+ // Content resolution
927
+ // -------------------------------------------------------
928
+ /**
929
+ * Read content from <script type="playground/..."> children.
930
+ * Done once at connectedCallback.
931
+ */
932
+ #readChildContent() {
933
+ for (const script of this.querySelectorAll("script")) {
934
+ switch (script.type) {
935
+ case "playground/html":
936
+ this.#childHtml = script.textContent;
937
+ break;
938
+ case "playground/script":
939
+ this.#childScript = script.textContent;
940
+ break;
941
+ case "playground/css":
942
+ this.#childCss = script.textContent;
943
+ break;
944
+ }
945
+ }
946
+ }
947
+ /**
948
+ * Get content for a given type, preferring child content over attributes.
949
+ */
950
+ #getContent(type) {
951
+ const childContent = type === "html" ? this.#childHtml : type === "script" ? this.#childScript : this.#childCss;
952
+ if (childContent != null) {
953
+ return childContent.trim();
954
+ }
955
+ return this.getAttribute(type)?.trim() ?? "";
956
+ }
957
+ // -------------------------------------------------------
958
+ // URL building
959
+ // -------------------------------------------------------
960
+ /**
961
+ * Build the playground iframe URL with editors hidden.
962
+ */
963
+ #buildSrc() {
964
+ const baseUrl = this.getAttribute("base-url") || DEFAULT_BASE_URL;
965
+ const theme = resolveTheme(this.getAttribute("theme"));
966
+ const header = this.getAttribute("header");
967
+ const html = this.#getContent("html");
968
+ const script = this.#getContent("script");
969
+ const css = this.#getContent("css");
970
+ const params = new URLSearchParams();
971
+ params.set("html", zip(html));
972
+ params.set("script", zip(script));
973
+ if (css) {
974
+ params.set("style", zip(css));
975
+ }
976
+ params.set("html-editor", "false");
977
+ params.set("script-editor", "false");
978
+ params.set("style-editor", "false");
979
+ params.set("theme", theme);
980
+ if (header) {
981
+ params.set("header", header);
982
+ }
983
+ return `${baseUrl}/#${params.toString()}`;
984
+ }
985
+ /**
986
+ * Build URL for "open in new window" — same as src but with editors enabled.
987
+ */
988
+ #buildOpenUrl() {
989
+ const baseUrl = this.getAttribute("base-url") || DEFAULT_BASE_URL;
990
+ const theme = resolveTheme(this.getAttribute("theme"));
991
+ const html = this.#getContent("html");
992
+ const script = this.#getContent("script");
993
+ const css = this.#getContent("css");
994
+ const params = new URLSearchParams();
995
+ params.set("html", zip(html));
996
+ params.set("script", zip(script));
997
+ if (css) {
998
+ params.set("style", zip(css));
999
+ }
1000
+ params.set("theme", theme);
1001
+ return `${baseUrl}/#${params.toString()}`;
1002
+ }
1003
+ // -------------------------------------------------------
1004
+ // Rendering
1005
+ // -------------------------------------------------------
1006
+ #render() {
1007
+ const height = this.getAttribute("height") || DEFAULT_HEIGHT;
1008
+ const hasControls = !this.hasAttribute("no-controls");
1009
+ this.#shadow.innerHTML = /* html */
1010
+ `
1011
+ <style>${styles}</style>
1012
+ <div class="container" style="height: ${height}">
1013
+ <div class="iframe-wrapper"></div>
1014
+ <div class="loader">${loaderIcon}</div>
1015
+ ${hasControls ? this.#renderControls() : ""}
1016
+ </div>
1017
+ `;
1018
+ this.#container = this.#shadow.querySelector(".container");
1019
+ this.#iframeWrapper = this.#shadow.querySelector(".iframe-wrapper");
1020
+ this.#loader = this.#shadow.querySelector(".loader");
1021
+ this.#controls = this.#shadow.querySelector(".controls");
1022
+ this.#openLink = this.#shadow.querySelector(".open-link");
1023
+ this.#bindControlEvents();
1024
+ }
1025
+ #renderControls() {
1026
+ return (
1027
+ /* html */
1028
+ `
1029
+ <div class="controls">
1030
+ <button type="button" class="zoom-in" title="Zoom in">
1031
+ <span class="sr-only">Zoom in</span>
1032
+ ${zoomInIcon}
1033
+ </button>
1034
+ <button type="button" class="zoom-out" title="Zoom out">
1035
+ <span class="sr-only">Zoom out</span>
1036
+ ${zoomOutIcon}
1037
+ </button>
1038
+ <button type="button" class="zoom-reset" title="Reset zoom">
1039
+ <span class="sr-only">Reset zoom</span>
1040
+ ${resetIcon}
1041
+ </button>
1042
+ <a class="open-link" target="_blank" rel="noopener" title="Open in a new window">
1043
+ <span class="sr-only">Open in a new window</span>
1044
+ ${externalLinkIcon}
1045
+ </a>
1046
+ <button type="button" class="reload" title="Reload">
1047
+ <span class="sr-only">Reload</span>
1048
+ ${reloadIcon}
1049
+ </button>
1050
+ </div>
1051
+ `
1052
+ );
1053
+ }
1054
+ #bindControlEvents() {
1055
+ const controls = this.#controls;
1056
+ if (!controls) return;
1057
+ controls.querySelector(".zoom-in")?.addEventListener("click", () => {
1058
+ this.#scale *= ZOOM_STEP;
1059
+ this.#updateIframeScale();
1060
+ });
1061
+ controls.querySelector(".zoom-out")?.addEventListener("click", () => {
1062
+ this.#scale /= ZOOM_STEP;
1063
+ this.#updateIframeScale();
1064
+ });
1065
+ controls.querySelector(".zoom-reset")?.addEventListener("click", () => {
1066
+ this.#scale = Number(this.getAttribute("zoom")) || DEFAULT_ZOOM;
1067
+ this.#updateIframeScale();
1068
+ });
1069
+ controls.querySelector(".reload")?.addEventListener("click", () => {
1070
+ this.#reloadIframe();
1071
+ });
1072
+ }
1073
+ // -------------------------------------------------------
1074
+ // Iframe lifecycle
1075
+ // -------------------------------------------------------
1076
+ #createIframe() {
1077
+ if (this.#iframe || !this.#iframeWrapper) return;
1078
+ const src = this.#buildSrc();
1079
+ this.#iframe = document.createElement("iframe");
1080
+ this.#iframe.src = src;
1081
+ this.#iframe.setAttribute("frameborder", "0");
1082
+ this.#iframe.classList.add("loading");
1083
+ this.#iframe.addEventListener("load", () => {
1084
+ this.#iframe?.classList.remove("loading");
1085
+ this.#loader?.classList.add("hidden");
1086
+ });
1087
+ this.#updateIframeScale();
1088
+ this.#updateOpenLink();
1089
+ this.#iframeWrapper.appendChild(this.#iframe);
1090
+ }
1091
+ #reloadIframe() {
1092
+ if (!this.#iframeWrapper) return;
1093
+ this.#iframe?.remove();
1094
+ this.#iframe = null;
1095
+ this.#loader?.classList.remove("hidden");
1096
+ this.#createIframe();
1097
+ }
1098
+ #updateIframeSrc() {
1099
+ if (!this.#iframe) return;
1100
+ const src = this.#buildSrc();
1101
+ this.#iframe.classList.add("loading");
1102
+ this.#loader?.classList.remove("hidden");
1103
+ this.#iframe.src = src;
1104
+ this.#updateOpenLink();
1105
+ }
1106
+ #updateIframeScale() {
1107
+ if (!this.#iframe) return;
1108
+ const height = this.getAttribute("height") || DEFAULT_HEIGHT;
1109
+ const scale = this.#scale;
1110
+ Object.assign(this.#iframe.style, {
1111
+ width: `${1 / scale * 100}%`,
1112
+ height: `calc(${1 / scale} * ${height})`,
1113
+ transform: `scale(${scale})`
1114
+ });
1115
+ }
1116
+ #updateOpenLink() {
1117
+ if (!this.#openLink) return;
1118
+ this.#openLink.href = this.#buildOpenUrl();
1119
+ }
1120
+ // -------------------------------------------------------
1121
+ // Attribute-driven updates
1122
+ // -------------------------------------------------------
1123
+ #updateContainerHeight() {
1124
+ if (!this.#container) return;
1125
+ const height = this.getAttribute("height") || DEFAULT_HEIGHT;
1126
+ this.#container.style.height = height;
1127
+ this.#updateIframeScale();
1128
+ }
1129
+ #updateControlsVisibility() {
1130
+ if (this.hasAttribute("no-controls")) {
1131
+ this.#controls?.remove();
1132
+ this.#controls = null;
1133
+ this.#openLink = null;
1134
+ } else if (!this.#controls && this.#container) {
1135
+ this.#container.insertAdjacentHTML("beforeend", this.#renderControls());
1136
+ this.#controls = this.#shadow.querySelector(".controls");
1137
+ this.#openLink = this.#shadow.querySelector(".open-link");
1138
+ this.#bindControlEvents();
1139
+ this.#updateOpenLink();
1140
+ }
1141
+ }
1142
+ // -------------------------------------------------------
1143
+ // Lazy loading
1144
+ // -------------------------------------------------------
1145
+ #setupIntersectionObserver() {
1146
+ this.#observer = new IntersectionObserver(
1147
+ (entries) => {
1148
+ for (const entry of entries) {
1149
+ if (entry.isIntersecting && !this.#isVisible) {
1150
+ this.#isVisible = true;
1151
+ this.#createIframe();
1152
+ }
1153
+ }
1154
+ },
1155
+ { rootMargin: "100px" }
1156
+ );
1157
+ this.#observer.observe(this);
1158
+ }
1159
+ // -------------------------------------------------------
1160
+ // Media query (auto theme)
1161
+ // -------------------------------------------------------
1162
+ #setupMediaQuery() {
1163
+ const theme = this.getAttribute("theme");
1164
+ if (theme && theme !== "auto") return;
1165
+ this.#mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
1166
+ this.#mediaQueryHandler = () => {
1167
+ if (this.#isVisible) {
1168
+ this.#updateIframeSrc();
1169
+ }
1170
+ };
1171
+ this.#mediaQuery.addEventListener("change", this.#mediaQueryHandler);
1172
+ }
1173
+ };
1174
+ export {
1175
+ PlaygroundPreview
1176
+ };
1177
+ //# sourceMappingURL=element.js.map