xvai-loi 0.1.37 → 0.1.39

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.
Files changed (3) hide show
  1. package/co.txt +1 -1
  2. package/package.json +1 -1
  3. package/xvai-loi.js +229 -25
package/co.txt CHANGED
@@ -1 +1 @@
1
- xvaiLoi100036
1
+ xvaiLoi100138
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xvai-loi",
3
- "version": "0.1.37",
3
+ "version": "0.1.39",
4
4
  "description": "Loi dung video (Edit Video Tu Dong) nap vao tool Google Flow qua o cam engine/oCam.ts",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
package/xvai-loi.js CHANGED
@@ -5805,6 +5805,7 @@ function catNen(im, buoc = 7, tol = 40) {
5805
5805
  return o;
5806
5806
  }
5807
5807
  var ts = /* @__PURE__ */ new Map();
5808
+ var dsTenTaiSan = () => [...ts.keys()].filter((k) => /^(trang|anh|vat|story|logo):|\.(png|jpg)$/i.test(k)).sort();
5808
5809
  var taiSan = (ten) => ten ? ts.get(ten) || globalThis.__taiSanThu?.(ten) || null : null;
5809
5810
  var nhanTaiSan = (ten, im) => {
5810
5811
  ts.set(ten, ten.indexOf("anh:") === 0 ? im : catNen(im));
@@ -9586,6 +9587,11 @@ function phongK(g, im, W4, H2, F, s) {
9586
9587
  g.drawImage(im, 0, 0, W4, H2);
9587
9588
  g.restore();
9588
9589
  }
9590
+ function tfE(g, W4, H2, F, s, yDau, k, zk = 1) {
9591
+ const cx = F ? (F[0] + F[2]) / 2 : 0.5, top = F ? F[1] : 0.2, se = (1 + (s - 1) * k) * zk, cxe = 0.5 + (cx - 0.5) * k, ye = top + (yDau - top) * k;
9592
+ g.translate(W4 / 2 - cxe * W4 * se, ye * H2 - top * H2 * se);
9593
+ g.scale(se, se);
9594
+ }
9589
9595
  function tf(g, W4, H2, F, s, yDau) {
9590
9596
  const cx = F ? (F[0] + F[2]) / 2 : 0.5, top = F ? F[1] : 0.2;
9591
9597
  g.translate(W4 / 2 - cx * W4 * s, yDau * H2 - top * H2 * s);
@@ -9824,9 +9830,10 @@ dangKy("cmNen", (g, d, tuoi, W4, H2, nen2, _s, dai2) => {
9824
9830
  if (a <= 0) return;
9825
9831
  g.save();
9826
9832
  g.globalAlpha = a;
9833
+ const kS = 1;
9827
9834
  const p = (d.bo === "card" || d.bo === "depth" || d.bo === "cut" && !d.anNguoi) && nen2 ? nguoi(nen2, W4, H2) : null;
9828
9835
  const hv = d.huong ?? -1, kv = 1 - Math.pow(1 - Math.min(1, tuoi / 0.35), 3), ox = hv === 0 ? -(1 - kv) * 0.3 * W4 : hv === 1 ? (1 - kv) * 0.3 * W4 : 0, oy = hv === 2 ? (1 - kv) * 0.1 * H2 : 0;
9829
- const zk = d.z && nen2 ? 1 + (d.z - 1) * (1 - eOut(Math.min(1, tuoi / 0.6))) : d.phong && nen2 ? 1 + (d.phong - 1) * (tuoi < 0.12 ? eOut(tuoi / 0.12) : 1 - eOut((tuoi - 0.42) / 0.33)) : 1;
9836
+ const zk = d.z && nen2 ? 1 + (d.z - 1) * (1 - eOut(Math.min(1, tuoi / 0.6))) : d.phong && nen2 ? 1 + (d.phong - 1) * (tuoi < 0.42 ? 1 : 1 - eOut((tuoi - 0.42) / 0.33)) : 1;
9830
9837
  if (d.bo === "card" || d.bo === "cut" || d.bo === "toi") {
9831
9838
  g.drawImage(nenCam(W4, H2, d.bo === "toi" || !!d.toiNen), 0, 0);
9832
9839
  if (d.bo === "card" && nen2) {
@@ -9844,7 +9851,7 @@ dangKy("cmNen", (g, d, tuoi, W4, H2, nen2, _s, dai2) => {
9844
9851
  g.save();
9845
9852
  bo(g, x, y, w, h, r);
9846
9853
  g.clip();
9847
- tf(g, W4, H2, F, s, d.yDau ?? 0.42);
9854
+ tfE(g, W4, H2, F, s, d.yDau ?? 0.42, kS);
9848
9855
  g.drawImage(nen2, 0, 0, W4, H2);
9849
9856
  g.restore();
9850
9857
  g.save();
@@ -9855,7 +9862,7 @@ dangKy("cmNen", (g, d, tuoi, W4, H2, nen2, _s, dai2) => {
9855
9862
  g.restore();
9856
9863
  if (p) {
9857
9864
  g.save();
9858
- tf(g, W4, H2, F, s, d.yDau ?? 0.42);
9865
+ tfE(g, W4, H2, F, s, d.yDau ?? 0.42, kS);
9859
9866
  g.drawImage(p, 0, 0, W4, H2);
9860
9867
  g.restore();
9861
9868
  }
@@ -9863,7 +9870,17 @@ dangKy("cmNen", (g, d, tuoi, W4, H2, nen2, _s, dai2) => {
9863
9870
  } else if (d.bo === "cut" && p && !d.anNguoi) {
9864
9871
  g.save();
9865
9872
  g.translate(ox, oy);
9866
- tf(g, W4, H2, F, (d.s || 1) * zk, d.yDau ?? 0.36);
9873
+ tfE(
9874
+ g,
9875
+ W4,
9876
+ H2,
9877
+ F,
9878
+ d.s || 1,
9879
+ d.yDau ?? 0.36,
9880
+ kS,
9881
+ zk
9882
+ /* 09/10 lát 2 ⑧: phóng chồng */
9883
+ );
9867
9884
  g.drawImage(p, 0, 0, W4, H2);
9868
9885
  g.restore();
9869
9886
  }
@@ -9883,8 +9900,8 @@ dangKy("cmNen", (g, d, tuoi, W4, H2, nen2, _s, dai2) => {
9883
9900
  tf(c, W4, H2, F, sb * 1.15, 0.45);
9884
9901
  c.drawImage(nen2, 0, 0, W4, H2);
9885
9902
  }, Math.round(0.012 * W4), "brightness(0.8)");
9886
- const kz = eOut(Math.min(1, tuoi / 0.3));
9887
- tf(g, W4, H2, F, (d.s || 1.05) * (1 - 0.3 * kz), 0.5 + 0.015 * kz);
9903
+ const kz = eOut(Math.min(1, tuoi / 0.5));
9904
+ tfE(g, W4, H2, F, (d.s || 1.05) * (1 - 0.3 * kz), 0.5 + 0.015 * kz, kS);
9888
9905
  g.drawImage(nen2, 0, 0, W4, H2);
9889
9906
  }
9890
9907
  g.restore();
@@ -9951,13 +9968,15 @@ dangKy("cmNen", (g, d, tuoi, W4, H2, nen2, _s, dai2) => {
9951
9968
  g.restore();
9952
9969
  }
9953
9970
  if (d.bo === "depth") {
9954
- chu2(g, d.giant, W4 / 2, (d.yChu ?? 0.24) * H2 + (d.z ? 0 : (1 - ka) * 70 * H2 / 1920), 190 * H2 / 1920, "giant", d.z ? 1 : kep12(tuoi / 0.2), 0.84 * W4);
9971
+ const yG = d.yChu ?? 0.24, truoc = d.yChu != null && F && yG > F[1] - 0.06 && yG < F[3];
9972
+ const veChu = () => chu2(g, d.giant, W4 / 2, yG * H2 + (d.z ? 0 : (1 - ka) * 70 * H2 / 1920), 190 * (d.coChu || 1) * H2 / 1920, "giant", d.z ? 1 : kep12(tuoi / 0.2), 0.84 * W4);
9955
9973
  if (p) {
9956
9974
  if (zk > 1.001) phongK(g, p, W4, H2, F, zk);
9957
9975
  else g.drawImage(p, 0, 0, W4, H2);
9958
9976
  }
9959
- } else if (d.giant) chu2(g, d.giant, W4 / 2, (d.v3 ? 0.145 : d.bo === "toi" ? 0.4 : d.bo === "tron" ? 0.25 : 0.2) * H2 + (1 - ka) * 70 * H2 / 1920, (d.cam ? 190 : d.v3 ? 112 : 150) * H2 / 1920, d.cam ? "cam" : d.do ? "do" : "kw", kep12(tuoi / 0.06), 0.9 * W4);
9960
- if (d.chu2 && !(d.bo === "depth" && /\n/.test(String(d.giant || "")))) chu2(g, d.chu2, W4 / 2, (d.bo === "toi" ? 0.4 : d.bo === "depth" ? (d.yChu ?? 0.24) + 0.02 : d.bo === "tron" ? 0.25 : 0.2) * H2 + (/\n/.test(String(d.giant || "")) ? 290 : 150) * H2 / 1920, 96 * H2 / 1920 * (d.z ? 1 + 0.7 * (1 - eOut((tuoi - 0.35) / 0.35)) : 1), d.do2 ? "do" : d.bo === "cut" || d.bo === "tron" || d.bo === "toi" ? "kw" : "vang", kep12((tuoi - 0.35) / 0.15), 0.88 * W4);
9977
+ if (truoc) veChu();
9978
+ } else if (d.giant) chu2(g, d.giant, W4 / 2, (d.yChu ?? (d.v3 ? 0.145 : d.bo === "toi" ? 0.4 : d.bo === "tron" ? 0.25 : 0.2)) * H2 + (1 - ka) * 70 * H2 / 1920, (d.cam ? 190 : d.v3 ? 112 : 150) * (d.coChu || 1) * H2 / 1920, d.cam ? "cam" : d.do ? "do" : "kw", kep12(tuoi / 0.06), 0.9 * W4);
9979
+ if (d.chu2 && !(d.bo === "depth" && /\n/.test(String(d.giant || "")))) chu2(g, d.chu2, W4 / 2, (d.bo === "depth" ? (d.yChu ?? 0.24) + 0.02 : d.yChu ?? (d.bo === "toi" ? 0.4 : d.bo === "tron" ? 0.25 : 0.2)) * H2 + (/\n/.test(String(d.giant || "")) ? 290 : d.cam ? 200 : 150) * (d.coChu || 1) * H2 / 1920, 96 * H2 / 1920 * (d.z ? 1 + 0.7 * (1 - eOut((tuoi - 0.35) / 0.35)) : 1), d.do2 ? "do" : d.bo === "cut" || d.bo === "tron" || d.bo === "toi" ? "kw" : "vang", kep12((tuoi - 0.35) / 0.15), 0.88 * W4);
9961
9980
  const vt = d.v3 && taiSan(d.v3), dl = String(d.giant || "").indexOf(String.fromCharCode(10)) >= 0;
9962
9981
  if (vt) {
9963
9982
  const p2 = eSoft((tuoi - 0.1) / 0.3), hh = (dl ? 0.2 : 0.26) * H2 * (0.9 + 0.1 * p2), ww = Math.min(hh * vt.width / vt.height, 0.6 * W4), h2 = ww * vt.height / vt.width;
@@ -10469,7 +10488,18 @@ function lapCuongMe(o) {
10469
10488
  } catch (e) {
10470
10489
  }
10471
10490
  }
10472
- const { tl, cs, ws, kb, fm, zc, tong, the: the0, keu, anh, moi, ms } = o;
10491
+ const { tl, cs, ws, kb, fm, zc, tong, the: the0, keu: keu0, anh, moi, ms } = o;
10492
+ let fKeu = -9;
10493
+ const keu = (f2, L) => {
10494
+ let cach = 0;
10495
+ try {
10496
+ cach = +(localStorage.getItem("xvaiSfxCach") || 0);
10497
+ } catch (e) {
10498
+ }
10499
+ if (cach > 0 && f2 - fKeu < cach) return;
10500
+ fKeu = Math.max(fKeu, f2);
10501
+ return keu0(f2, L);
10502
+ };
10473
10503
  const loai = [];
10474
10504
  let bc = "B0";
10475
10505
  const r22 = (v) => +(+v || 0).toFixed(2), ghiL = (lo, s, ly, moi2) => {
@@ -10617,6 +10647,14 @@ function lapCuongMe(o) {
10617
10647
  const sp = [];
10618
10648
  let ctxSt = "";
10619
10649
  const IC = { tien: "xu", dongho: "dongho", canhbao: "canh", tich: "tich", bieudo: "bieu", tim: "tim", khong: "none" };
10650
+ const kTram = () => {
10651
+ try {
10652
+ const v = +(localStorage.getItem("xvaiTramDai") || 1);
10653
+ return v >= 1 && v <= 1.6 ? v : 1;
10654
+ } catch (e) {
10655
+ return 1;
10656
+ }
10657
+ };
10620
10658
  const UT = { moc: 100, card: 100, cta: 90, so: 80, ds: 70, anh: 60, chu: 50, vat: 50, bang: 40, test: 40, nhac: 20, phong: 10 };
10621
10659
  const ung = [], thuB = [], DOI_CHU = 2, minD = (d0) => Math.max(1.2, 0.6 * d0);
10622
10660
  const de = (f0, d0, x, doi = 0, ham) => {
@@ -10825,7 +10863,7 @@ function lapCuongMe(o) {
10825
10863
  if (x.kieu === "anh" && dV) {
10826
10864
  de(f2, dV, { uuTien: UT.anh, bo: "anh", ten: ten2, chu: chuK, chu2: chu22, keu: "whoosh", video: 1 }, 3, datAnh);
10827
10865
  ghiL("video", { bo: "anh", f: f2, d: dV }, "kho video: ung vien clip " + dV.toFixed(1) + " s thay anh: " + String(x.tu || ""));
10828
- } else if (x.kieu === "anh") de(f2, f2 < f1 ? 2 : 2.4, { uuTien: UT.anh, ...co ? [{ bo: "anh", ten: ten2, chu: chuK, chu2: chu22, keu: "whoosh" }, { bo: "chia", ten: ten2, chu: chuK, keu: "whoosh" }, { bo: "anh", ten: ten2, chu: chuK, chu2: chu22, pip: 1, keu: "whoosh" }][nAnh++ % 3] : { bo: "kinh", dong: [chuK, chu22].filter(Boolean), keu: "whoosh" } }, 3, datAnh);
10866
+ } else if (x.kieu === "anh") de(f2, (f2 < f1 ? 2 : 2.4) * kTram(), { uuTien: UT.anh, ...co ? [{ bo: "anh", ten: ten2, chu: chuK, chu2: chu22, keu: "whoosh" }, { bo: "chia", ten: ten2, chu: chuK, keu: "whoosh" }, { bo: "anh", ten: ten2, chu: chuK, chu2: chu22, pip: 1, keu: "whoosh" }][nAnh++ % 3] : { bo: "kinh", dong: [chuK, chu22].filter(Boolean), keu: "whoosh" } }, 3, datAnh);
10829
10867
  else if (x.kieu === "vat") {
10830
10868
  const LG = timLogo(suaChu(chuK + " " + sach2(String(x.tu || ""))))[0];
10831
10869
  if (LG) napHinhLogo(LG.slug);
@@ -11337,7 +11375,7 @@ function lapCuongMe(o) {
11337
11375
  }
11338
11376
  return t1 - t0;
11339
11377
  };
11340
- for (const dd of [2.2, 1.8]) for (let f2 = f0; f2 <= m.b - dd - 0.5 + 1e-6; f2 += 0.25) {
11378
+ for (const dd of [2.2 * kTram(), 1.8]) for (let f2 = f0; f2 <= m.b - dd - 0.5 + 1e-6; f2 += 0.25) {
11341
11379
  const fr = +f2.toFixed(2);
11342
11380
  if (gioLogo(fr - 0.1, fr + dd) >= 0 || lien(fr, fr + dd) > 6) continue;
11343
11381
  if (dat(fr, dd, { uuTien: UT.anh, bo: "chia", ten: tk, keu: "whoosh-nhanh" }, 0, 0.01)) {
@@ -11519,6 +11557,16 @@ function lapCuongMe(o) {
11519
11557
  s.dSua = 1;
11520
11558
  nS++;
11521
11559
  }
11560
+ if (typeof e.yChu === "number" && e.yChu >= 0.05 && e.yChu <= 0.6) {
11561
+ s.yChu = e.yChu;
11562
+ s.khoa = 1;
11563
+ nS++;
11564
+ }
11565
+ if (typeof e.coChu === "number" && e.coChu >= 0.5 && e.coChu <= 1.6) {
11566
+ s.coChu = e.coChu;
11567
+ s.khoa = 1;
11568
+ nS++;
11569
+ }
11522
11570
  if (typeof e.f === "number" && e.f >= 0) {
11523
11571
  s.f = e.f;
11524
11572
  nS++;
@@ -11540,7 +11588,7 @@ function lapCuongMe(o) {
11540
11588
  G2.__lichSuaDaAp = nS;
11541
11589
  ghiL("bo", { bo: "sua-tay" }, "sua tay: " + nS + " truong");
11542
11590
  }
11543
- G2.__lichSp = sp.map((s, i) => ({ i, id: s.id, f: +s.f.toFixed(2), d: +s.d.toFixed(2), bo: s.bo, giant: s.giant || "", chu: s.chu || "", chu2: s.chu2 || "", st: s.st || "", ten: s.ten || "", tieu: s.tieu || "", khoa: s.khoa ? 1 : 0 }));
11591
+ G2.__lichSp = sp.map((s, i) => ({ i, id: s.id, yChu: s.yChu, coChu: s.coChu, f: +s.f.toFixed(2), d: +s.d.toFixed(2), bo: s.bo, giant: s.giant || "", chu: s.chu || "", chu2: s.chu2 || "", st: s.st || "", ten: s.ten || "", tieu: s.tieu || "", khoa: s.khoa ? 1 : 0 }));
11544
11592
  }
11545
11593
  bc = "B7 phat the";
11546
11594
  const stTr = { n: 0 }, keuTr = {};
@@ -11565,7 +11613,7 @@ function lapCuongMe(o) {
11565
11613
  bo: s.bo,
11566
11614
  F: Fs,
11567
11615
  s: s.bo === "card" ? sF(Fs, 0.38) : sF(Fs, 0.36),
11568
- yDau: s.bo === "card" ? s.doc || s.tieuDoc ? 0.56 : 0.46 : s.hang || s.vat ? 0.5 : 0.36,
11616
+ yDau: s.bo === "card" ? s.doc || s.tieuDoc ? 0.61 : 0.46 : s.hang || s.vat ? 0.5 : 0.36,
11569
11617
  giant: s.giant,
11570
11618
  tieu: s.tieu,
11571
11619
  so: s.so,
@@ -11588,6 +11636,7 @@ function lapCuongMe(o) {
11588
11636
  toiNen: s.toiNen,
11589
11637
  do2: s.chu2 && /tốn|mất|mỏi|khổ|oan|sai|lỗi|đau|chậm|còng|dừng|đừng|cực/.test((String(s.giant || "") + " " + String(s.chu2)).toLocaleLowerCase("vi")) ? 1 : 0,
11590
11638
  z: s.z,
11639
+ coChu: s.coChu,
11591
11640
  phong: s.phong,
11592
11641
  ra: s.ra,
11593
11642
  chu2: s.chu2,
@@ -11782,7 +11831,29 @@ var mau6 = (HO2) => {
11782
11831
  vao: { dich: "trang", kieu: "hienNgay", kieuNhan: "hienNgay", ms: 0, msNhan: 0 },
11783
11832
  viTri: { x: 0.5, y: 0.72 },
11784
11833
  ghiChu: "\u{1F7E1} 06/10 \u0111\xEAm: port template CUONGME (phi\xEAn m\xE1y kh\xE1c) \u2014 ch\u1EDD \u0111o + T\xFA xem.",
11785
- doan: { khungTheoNguon: true, khoi: { mo: { ve: "cmNen", lap: (o) => lapCuongMe(o) } }, lich: {}, taiSan: {}, nhac: ["vui", 0.2], nang: [], nhe: [], xeBao: false, am: false, nap, tieuDe: { phong: "Be Vietnam Pro", dam: 900 }, phong: "Be Vietnam Pro", dam: 900 }
11834
+ doan: {
11835
+ khungTheoNguon: true,
11836
+ khoi: { mo: { ve: "cmNen", lap: (o) => lapCuongMe(o) } },
11837
+ lich: {},
11838
+ taiSan: {},
11839
+ nhac: [(() => {
11840
+ try {
11841
+ const v = localStorage.getItem("xvaiNhac");
11842
+ return v && ["vui", "tincay", "camxuc", "sangtrong", "dondap", "nhe"].includes(v) ? v : "vui";
11843
+ } catch (e) {
11844
+ return "vui";
11845
+ }
11846
+ })(), 0.2],
11847
+ /* 10/10 K2: tuỳ chọn xvaiNhac (mặc định giữ 'vui' 112 BPM; đối thủ ~81 BPM → thử 'nhe' 84 / 'sangtrong' 88) */
11848
+ nang: [],
11849
+ nhe: [],
11850
+ xeBao: false,
11851
+ am: false,
11852
+ nap,
11853
+ tieuDe: { phong: "Be Vietnam Pro", dam: 900 },
11854
+ phong: "Be Vietnam Pro",
11855
+ dam: 900
11856
+ }
11786
11857
  }];
11787
11858
  };
11788
11859
 
@@ -12884,7 +12955,13 @@ async function renderNhanh(ff, clips, files, audio, cards, nen2, options, paint,
12884
12955
  gn.scale(m, m);
12885
12956
  gn.translate(-X, -Y);
12886
12957
  }
12887
- gn.drawImage(fr.canvas, ox, oy, sw * kz, sh * kz);
12958
+ {
12959
+ const mau7 = fx0.mau || globalThis.__xvaiMau || {}, sg = +mau7.sang || +fx0.sang || 1, tp = +mau7.tuongPhan || 1, bh = +mau7.baoHoa || 1, am = +mau7.am || 0;
12960
+ const fS = (sg !== 1 ? "brightness(" + sg.toFixed(2) + ") " : "") + (tp !== 1 ? "contrast(" + tp.toFixed(2) + ") " : "") + (bh !== 1 ? "saturate(" + bh.toFixed(2) + ") " : "") + (am ? "sepia(" + Math.min(0.6, Math.abs(am)).toFixed(2) + ") " : "");
12961
+ if (fS) gn.filter = fS.trim();
12962
+ gn.drawImage(fr.canvas, ox, oy, sw * kz, sh * kz);
12963
+ if (fS) gn.filter = "none";
12964
+ }
12888
12965
  if (xo) gn.restore();
12889
12966
  if (dep && rang) {
12890
12967
  const ts2 = c.trimStart + u;
@@ -16018,6 +16095,24 @@ function tuSp(duAn, sp, sua, daiS) {
16018
16095
  for (const c of canh) if (c.ten) ts2.set(c.ten, { ten: c.ten, loai: "anh" });
16019
16096
  return { v: 2, duAn, luc: Date.now(), nguon: { daiS: +daiS.toFixed(2) }, quyetDinh: { canh }, taiSan: [...ts2.values()] };
16020
16097
  }
16098
+ function veSua(l) {
16099
+ const sua = {};
16100
+ const them = [];
16101
+ for (const c of l.quyetDinh.canh) {
16102
+ if (!c.khoa) continue;
16103
+ if (c.moi) {
16104
+ them.push({ f: c.f, d: c.d, bo: c.bo, giant: c.giant, chu: c.chu, ten: c.ten });
16105
+ continue;
16106
+ }
16107
+ const e = {};
16108
+ for (const k of ["giant", "chu", "chu2", "st", "ten", "tieu"]) if (c[k]) e[k] = c[k];
16109
+ e.d = c.d;
16110
+ e.f = c.f;
16111
+ sua[c.id] = e;
16112
+ }
16113
+ if (them.length) sua.them = them;
16114
+ return sua;
16115
+ }
16021
16116
 
16022
16117
  // flow-src/utils.ts
16023
16118
  var sanitizeFilename = (name) => {
@@ -18675,7 +18770,7 @@ var StudioEdit = ({ project, setProject, exporting, blob, onExport, onDownload,
18675
18770
  W3.__mauPhuDe = mau7 ? sua ? mau7 + "-sua" : mau7 : "";
18676
18771
  W3.__theoMauKhoi = !!(mau7 && layMau(mau7)?.doan?.khoi);
18677
18772
  W3.__xuatNhanh = nhanh;
18678
- setProject((c) => c ? { ...c, studioFx: { stabilize: fx.rung ? 3 : 0, beauty: fx.dep ? 2 : 0, voice: fx.tieng ? 1 : 0, teeth: fx.rang ? 1 : 0 } } : c);
18773
+ setProject((c) => c ? { ...c, studioFx: { ...c.studioFx || {}, stabilize: fx.rung ? 3 : 0, beauty: fx.dep ? 2 : 0, voice: fx.tieng ? 1 : 0, teeth: fx.rang ? 1 : 0 } } : c);
18679
18774
  };
18680
18775
  const lamPro = async () => {
18681
18776
  let a = W3.__proApi;
@@ -18989,7 +19084,7 @@ async function napLoi(d) {
18989
19084
  return "LOI: " + String(e && e.message || e).slice(0, 300);
18990
19085
  }
18991
19086
  }
18992
- var LOI_URL = "https://cdn.jsdelivr.net/npm/xvai-loi@0.1.36/nap.js";
19087
+ var LOI_URL = "https://cdn.jsdelivr.net/npm/xvai-loi@0.1.38/nap.js";
18993
19088
  var TRONG_LOI = !!globalThis.__xvaiReact;
18994
19089
  try {
18995
19090
  if (!TRONG_LOI) setTimeout(() => {
@@ -19019,7 +19114,7 @@ function datCauLenh(a) {
19019
19114
  on2 = true;
19020
19115
  window.addEventListener("message", async (ev) => {
19021
19116
  const d = ev.data;
19022
- if (!d || d.xvaiLoi100036 !== true) return;
19117
+ if (!d || d.xvaiLoi100138 !== true) return;
19023
19118
  const o = String(ev.origin || "");
19024
19119
  if (!(o.indexOf("https://flow.google.com") === 0 || o.indexOf("https://labs.google") === 0)) return;
19025
19120
  const tra = (kq) => {
@@ -19143,11 +19238,41 @@ var SuaLich = ({ ten, onDong }) => {
19143
19238
  }
19144
19239
  })();
19145
19240
  }, [ten]);
19146
- const dat = (i, k, v) => {
19147
- const n = { ...sua, [i]: { ...sua[i] || {}, [k]: v } };
19241
+ const lsHoan = useState([])[0], lsLam = useState([])[0];
19242
+ const [nHoan, setNHoan] = useState(0);
19243
+ const ghiHoan = (cu) => {
19244
+ const t = Date.now();
19245
+ if (lsHoan.length && t - (lsHoan[lsHoan.length - 1].t || 0) < 600) return;
19246
+ lsHoan.push({ sua: cu, t });
19247
+ if (lsHoan.length > 50) lsHoan.shift();
19248
+ lsLam.length = 0;
19249
+ setNHoan(lsHoan.length);
19250
+ };
19251
+ const apSua = (n) => {
19148
19252
  setSua(n);
19149
19253
  G.__lichSua = n;
19150
19254
  };
19255
+ const hoanTac = () => {
19256
+ if (!lsHoan.length) return;
19257
+ const b = lsHoan.pop();
19258
+ lsLam.push({ sua, t: Date.now() });
19259
+ apSua(b.sua);
19260
+ setNHoan(lsHoan.length);
19261
+ setBao("Ho\xE0n t\xE1c (" + lsHoan.length + " b\u01B0\u1EDBc c\xF2n l\u1EA1i)");
19262
+ };
19263
+ const lamLai = () => {
19264
+ if (!lsLam.length) return;
19265
+ const b = lsLam.pop();
19266
+ lsHoan.push({ sua, t: Date.now() });
19267
+ apSua(b.sua);
19268
+ setNHoan(lsHoan.length);
19269
+ setBao("L\xE0m l\u1EA1i");
19270
+ };
19271
+ const dat = (i, k, v) => {
19272
+ ghiHoan(sua);
19273
+ const n = { ...sua, [i]: { ...sua[i] || {}, [k]: v } };
19274
+ apSua(n);
19275
+ };
19151
19276
  const [ls, setLs] = useState([]);
19152
19277
  const [them, setThem] = useState({ f: 0, d: 2, bo: "depth", giant: "", ten: "" });
19153
19278
  useEffect(() => {
@@ -19174,8 +19299,82 @@ var SuaLich = ({ ten, onDong }) => {
19174
19299
  setBao("\u0110\xE3 n\u1EA1p b\u1EA3n " + new Date(t).toTimeString().slice(0, 5) + " \xB7 b\u1EA5m V\u1EBD l\u1EA1i \u0111\u1EC3 \xE1p");
19175
19300
  }
19176
19301
  };
19302
+ const moDuAn = async (f2) => {
19303
+ if (!f2) return;
19304
+ try {
19305
+ const j = JSON.parse(await f2.text());
19306
+ const l = j && (j.lichV2 || (j.v === 2 && j.quyetDinh ? j : null));
19307
+ if (!l) {
19308
+ setBao("T\u1EC7p kh\xF4ng c\xF3 lichV2 (l\u01B0u b\u1EB1ng n\xFAt L\u01B0u d\u1EF1 \xE1n t\u1EEB 0.1.37)");
19309
+ return;
19310
+ }
19311
+ const n = veSua(l);
19312
+ setSua(n);
19313
+ G.__lichSua = n;
19314
+ await ghiDem("lichSua:" + ten, { sua: n });
19315
+ setBao("\u0110\xE3 m\u1EDF " + l.quyetDinh.canh.filter((c) => c.khoa).length + " c\u1EA3nh s\u1EEDa tay t\u1EEB " + f2.name + " \xB7 b\u1EA5m V\u1EBD l\u1EA1i \u0111\u1EC3 \xE1p");
19316
+ } catch (e) {
19317
+ setBao("Kh\xF4ng \u0111\u1ECDc \u0111\u01B0\u1EE3c t\u1EC7p: " + String(e && e.message || e).slice(0, 80));
19318
+ }
19319
+ };
19320
+ const taiTep = async (ten2, text2, mime) => {
19321
+ const base64 = btoa(unescape(encodeURIComponent(text2)));
19322
+ try {
19323
+ await Flow.download({ base64, mimeType: mime, filename: ten2 });
19324
+ setBao("\u0110\xE3 t\u1EA3i " + ten2 + " (" + Math.round(text2.length / 1024) + " KB)");
19325
+ } catch (e) {
19326
+ setBao("Kh\xF4ng t\u1EA3i \u0111\u01B0\u1EE3c: " + String(e && e.message || e).slice(0, 80));
19327
+ }
19328
+ };
19329
+ const taiLich = () => {
19330
+ const p = G.__loiApp && G.__loiApp.p;
19331
+ const tl = p && p.timeline || [];
19332
+ const dai2 = tl.reduce((a, c) => a + Math.max(0, (+c.trimEnd || 0) - (+c.trimStart || 0)), 0);
19333
+ const l = tuSp(ten, G.__lichSp || [], sua, dai2);
19334
+ taiTep("lich-" + ten.replace(/[^\w-]+/g, "_").slice(0, 40) + ".json", JSON.stringify(l, null, 1), "application/json");
19335
+ };
19336
+ const taiSrt = () => {
19337
+ const p = G.__loiApp && G.__loiApp.p;
19338
+ const cues = [];
19339
+ for (const sc of p && p.timeline || []) for (const m of sc.text_moments || []) if (m && m.kind === "sub" && m.text) cues.push({ t0: +m.t0 - (+sc.trimStart || 0), t1: +m.t1 - (+sc.trimStart || 0), text: String(m.text) });
19340
+ cues.sort((a, b) => a.t0 - b.t0);
19341
+ const hh = (t) => {
19342
+ t = Math.max(0, t);
19343
+ const h = Math.floor(t / 3600), m = Math.floor(t % 3600 / 60), s2 = Math.floor(t % 60), ms = Math.round((t - Math.floor(t)) * 1e3);
19344
+ return String(h).padStart(2, "0") + ":" + String(m).padStart(2, "0") + ":" + String(s2).padStart(2, "0") + "," + String(ms).padStart(3, "0");
19345
+ };
19346
+ if (!cues.length) {
19347
+ setBao("Ch\u01B0a c\xF3 ph\u1EE5 \u0111\u1EC1 (ch\u1EA1y L\xE0m pro tr\u01B0\u1EDBc)");
19348
+ return;
19349
+ }
19350
+ taiTep("phu-de-" + ten.replace(/[^\w-]+/g, "_").slice(0, 40) + ".srt", cues.map((c, i) => i + 1 + "\n" + hh(c.t0) + " --> " + hh(c.t1) + "\n" + c.text + "\n").join("\n"), "text/plain");
19351
+ };
19352
+ const fx0 = G.__loiApp && G.__loiApp.p && G.__loiApp.p.studioFx || {};
19353
+ let m0 = fx0.mau || G.__xvaiMau || {};
19354
+ try {
19355
+ if (!fx0.mau && !G.__xvaiMau) {
19356
+ const t = localStorage.getItem("xvaiMau");
19357
+ if (t) m0 = JSON.parse(t);
19358
+ }
19359
+ } catch (e) {
19360
+ }
19361
+ const [fx, setFx] = useState({ sang: +m0.sang || +fx0.sang || 1, tuongPhan: +m0.tuongPhan || 1, baoHoa: +m0.baoHoa || 1, am: +m0.am || 0 });
19362
+ const datFx = (k, v) => {
19363
+ const n = { ...fx, [k]: v };
19364
+ setFx(n);
19365
+ G.__xvaiMau = n;
19366
+ try {
19367
+ localStorage.setItem("xvaiMau", JSON.stringify(n));
19368
+ } catch (e) {
19369
+ }
19370
+ if (typeof G.__loiSetP === "function") {
19371
+ G.__loiSetP((c) => c ? { ...c, studioFx: { ...c.studioFx || {}, mau: n } } : c);
19372
+ setBao("M\xE0u c\u1EA3 b\xE0i: s\xE1ng " + (+n.sang).toFixed(2) + " \xB7 t\u01B0\u01A1ng ph\u1EA3n " + (+n.tuongPhan).toFixed(2) + " \xB7 t\u01B0\u01A1i " + (+n.baoHoa).toFixed(2) + " \xB7 \u1EA5m " + (+n.am).toFixed(2) + " \u2192 b\u1EA5m Xu\u1EA5t l\u1EA1i");
19373
+ }
19374
+ };
19177
19375
  const themCanh = () => {
19178
19376
  if (!(them.d > 0.3)) return;
19377
+ ghiHoan(sua);
19179
19378
  const n = { ...sua, them: [...sua.them || [], { ...them, f: +them.f, d: +them.d }] };
19180
19379
  setSua(n);
19181
19380
  G.__lichSua = n;
@@ -19191,25 +19390,29 @@ var SuaLich = ({ ten, onDong }) => {
19191
19390
  } else setBao("Ch\u01B0a c\xF3 L\xE0m pro (n\u1EA1p video + ch\u1ECDn m\u1EABu tr\u01B0\u1EDBc)");
19192
19391
  };
19193
19392
  const xoaHet = async () => {
19393
+ ghiHoan(sua);
19194
19394
  setSua({});
19195
19395
  G.__lichSua = null;
19196
19396
  await ghiDem("lichSua:" + ten, { sua: {} });
19197
19397
  setBao("\u0110\xE3 b\u1ECF m\u1ECDi s\u1EEDa tay");
19198
19398
  };
19199
19399
  if (!ds2.length) return /* @__PURE__ */ shim_react_default.createElement("div", { className: "rounded-xl border border-[#2C4A73] p-4 text-[12px]" }, 'Ch\u01B0a c\xF3 l\u1ECBch d\u1EF1ng \u2014 b\u1EA5m "L\xE0m pro" m\u1ED9t l\u1EA7n r\u1ED3i quay l\u1EA1i \u0111\xE2y. ', /* @__PURE__ */ shim_react_default.createElement("button", { className: nut3, onClick: onDong }, "\u0110\xF3ng"));
19200
- return /* @__PURE__ */ shim_react_default.createElement("div", { className: "rounded-xl border border-[#F6D178]/60 p-3 text-[12px] bg-[#0E2240]" }, /* @__PURE__ */ shim_react_default.createElement("div", { className: "flex items-center gap-2 mb-2" }, /* @__PURE__ */ shim_react_default.createElement("span", { className: "font-black text-[#F6D178]" }, "S\u1EECA L\u1ECACH D\u1EF0NG \xB7 ", ds2.length, " c\u1EA3nh"), /* @__PURE__ */ shim_react_default.createElement("span", { className: "text-[#A2B2C9] flex-1" }, bao), /* @__PURE__ */ shim_react_default.createElement("button", { className: nut3, onClick: luu }, "L\u01B0u"), /* @__PURE__ */ shim_react_default.createElement("button", { className: nut3 + " bg-[#F6D178] text-[#122238]", onClick: veLai }, "V\u1EBD l\u1EA1i"), /* @__PURE__ */ shim_react_default.createElement("button", { className: nut3, onClick: xoaHet }, "B\u1ECF s\u1EEDa"), /* @__PURE__ */ shim_react_default.createElement("button", { className: nut3, onClick: () => {
19400
+ return /* @__PURE__ */ shim_react_default.createElement("div", { className: "rounded-xl border border-[#F6D178]/60 p-3 text-[12px] bg-[#0E2240]" }, /* @__PURE__ */ shim_react_default.createElement("div", { className: "flex items-center gap-2 mb-2" }, /* @__PURE__ */ shim_react_default.createElement("span", { className: "font-black text-[#F6D178]" }, "S\u1EECA L\u1ECACH D\u1EF0NG \xB7 ", ds2.length, " c\u1EA3nh"), /* @__PURE__ */ shim_react_default.createElement("span", { className: "text-[#A2B2C9] flex-1" }, bao), /* @__PURE__ */ shim_react_default.createElement("button", { className: nut3, onClick: hoanTac, disabled: !nHoan, title: "Ho\xE0n t\xE1c (Ctrl+Z)" }, "\u21B6 ", nHoan || ""), /* @__PURE__ */ shim_react_default.createElement("button", { className: nut3, onClick: lamLai, title: "L\xE0m l\u1EA1i" }, "\u21B7"), /* @__PURE__ */ shim_react_default.createElement("button", { className: nut3, onClick: luu }, "L\u01B0u"), /* @__PURE__ */ shim_react_default.createElement("button", { className: nut3 + " bg-[#F6D178] text-[#122238]", onClick: veLai }, "V\u1EBD l\u1EA1i"), /* @__PURE__ */ shim_react_default.createElement("button", { className: nut3, onClick: xoaHet }, "B\u1ECF s\u1EEDa"), /* @__PURE__ */ shim_react_default.createElement("button", { className: nut3, onClick: () => {
19201
19401
  setDs(G.__lichSp || []);
19202
19402
  } }, "N\u1EA1p l\u1EA1i"), /* @__PURE__ */ shim_react_default.createElement("button", { className: nut3, onClick: onDong }, "\u0110\xF3ng"), ls.length ? /* @__PURE__ */ shim_react_default.createElement("select", { className: "bg-[#0B1A2D] border border-[#2C4A73] rounded px-1 text-[11px]", value: "", onChange: (ev) => {
19203
19403
  if (ev.target.value) napBan(+ev.target.value);
19204
- } }, /* @__PURE__ */ shim_react_default.createElement("option", { value: "" }, "b\u1EA3n c\u0169\u2026"), ls.map((t) => /* @__PURE__ */ shim_react_default.createElement("option", { key: t, value: t }, new Date(t).toLocaleString("vi")))) : null), /* @__PURE__ */ shim_react_default.createElement("div", { className: "flex items-center gap-1 mb-2 text-[11px] flex-wrap" }, /* @__PURE__ */ shim_react_default.createElement("span", { className: "text-[#A2B2C9]" }, "Th\xEAm c\u1EA3nh:"), /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-12 bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", type: "number", step: "0.1", value: them.f, onChange: (ev) => setThem({ ...them, f: ev.target.value }), title: "gi\xE2y \u0111\u1EA7u" }), /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-12 bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", type: "number", step: "0.1", value: them.d, onChange: (ev) => setThem({ ...them, d: ev.target.value }), title: "d\xE0i (s)" }), /* @__PURE__ */ shim_react_default.createElement("select", { className: "bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", value: them.bo, onChange: (ev) => setThem({ ...them, bo: ev.target.value }) }, /* @__PURE__ */ shim_react_default.createElement("option", { value: "depth" }, "ch\u1EEF nh\u1EA5n"), /* @__PURE__ */ shim_react_default.createElement("option", { value: "anh" }, "\u1EA3nh to\xE0n khung"), /* @__PURE__ */ shim_react_default.createElement("option", { value: "cut" }, "c\u1EAFt ch\u1EEF"), /* @__PURE__ */ shim_react_default.createElement("option", { value: "tron" }, "\xF4 tr\xF2n")), /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-28 bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", placeholder: "ch\u1EEF nh\u1EA5n", value: them.giant, onChange: (ev) => setThem({ ...them, giant: ev.target.value }) }), /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-24 bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", placeholder: "\u1EA3nh: trang:\u2026", value: them.ten, onChange: (ev) => setThem({ ...them, ten: ev.target.value }) }), /* @__PURE__ */ shim_react_default.createElement("button", { className: nut3, onClick: themCanh }, "+ Th\xEAm"), (sua.them || []).length ? /* @__PURE__ */ shim_react_default.createElement("span", { className: "text-[#F6D178]" }, (sua.them || []).length, " c\u1EA3nh th\xEAm") : null), /* @__PURE__ */ shim_react_default.createElement("div", { className: "max-h-[60vh] overflow-auto" }, /* @__PURE__ */ shim_react_default.createElement("table", { className: "w-full text-[11px]" }, /* @__PURE__ */ shim_react_default.createElement("thead", null, /* @__PURE__ */ shim_react_default.createElement("tr", { className: "text-[#A2B2C9]" }, /* @__PURE__ */ shim_react_default.createElement("th", { className: "text-left" }, "#"), /* @__PURE__ */ shim_react_default.createElement("th", { className: "text-left" }, "gi\xE2y"), /* @__PURE__ */ shim_react_default.createElement("th", { className: "text-left" }, "b\u1ED1 c\u1EE5c"), /* @__PURE__ */ shim_react_default.createElement("th", { className: "text-left" }, "\u0111\u1EA7u/d\xE0i (s)"), /* @__PURE__ */ shim_react_default.createElement("th", { className: "text-left" }, "ch\u1EEF nh\u1EA5n"), /* @__PURE__ */ shim_react_default.createElement("th", { className: "text-left" }, "ch\u1EEF ph\u1EE5"), /* @__PURE__ */ shim_react_default.createElement("th", { className: "text-left" }, "icon"), /* @__PURE__ */ shim_react_default.createElement("th", { className: "text-left" }, "\u1EA3nh (t\xEAn kho)"), /* @__PURE__ */ shim_react_default.createElement("th", null, "xo\xE1"))), /* @__PURE__ */ shim_react_default.createElement("tbody", null, ds2.map((s) => {
19404
+ } }, /* @__PURE__ */ shim_react_default.createElement("option", { value: "" }, "b\u1EA3n c\u0169\u2026"), ls.map((t) => /* @__PURE__ */ shim_react_default.createElement("option", { key: t, value: t }, new Date(t).toLocaleString("vi")))) : null), /* @__PURE__ */ shim_react_default.createElement("div", { className: "flex items-center gap-2 mb-2 text-[11px] flex-wrap" }, /* @__PURE__ */ shim_react_default.createElement("span", { className: "text-[#A2B2C9]" }, "M\xE0u c\u1EA3 b\xE0i:"), /* @__PURE__ */ shim_react_default.createElement("label", { className: "flex items-center gap-1" }, "s\xE1ng ", /* @__PURE__ */ shim_react_default.createElement("input", { type: "range", min: "0.7", max: "1.4", step: "0.05", value: fx.sang, onChange: (ev) => datFx("sang", +ev.target.value), className: "w-20" }), " ", (+fx.sang).toFixed(2)), /* @__PURE__ */ shim_react_default.createElement("label", { className: "flex items-center gap-1" }, "t\u01B0\u01A1ng ph\u1EA3n ", /* @__PURE__ */ shim_react_default.createElement("input", { type: "range", min: "0.7", max: "1.4", step: "0.05", value: fx.tuongPhan, onChange: (ev) => datFx("tuongPhan", +ev.target.value), className: "w-20" }), " ", (+fx.tuongPhan).toFixed(2)), /* @__PURE__ */ shim_react_default.createElement("label", { className: "flex items-center gap-1" }, "t\u01B0\u01A1i ", /* @__PURE__ */ shim_react_default.createElement("input", { type: "range", min: "0.5", max: "1.6", step: "0.05", value: fx.baoHoa, onChange: (ev) => datFx("baoHoa", +ev.target.value), className: "w-20" }), " ", (+fx.baoHoa).toFixed(2)), /* @__PURE__ */ shim_react_default.createElement("label", { className: "flex items-center gap-1" }, "\u1EA5m ", /* @__PURE__ */ shim_react_default.createElement("input", { type: "range", min: "0", max: "0.4", step: "0.05", value: fx.am, onChange: (ev) => datFx("am", +ev.target.value), className: "w-20" }), " ", (+fx.am).toFixed(2)), /* @__PURE__ */ shim_react_default.createElement("button", { className: nut3, onClick: () => {
19405
+ setFx({ sang: 1, tuongPhan: 1, baoHoa: 1, am: 0 });
19406
+ datFx("sang", 1);
19407
+ } }, "V\u1EC1 g\u1ED1c"), /* @__PURE__ */ shim_react_default.createElement("span", { className: "text-[#A2B2C9]" }, "(ch\u1ED1ng rung \xB7 l\xE0m \u0111\u1EB9p \xB7 ti\u1EBFng \xB7 r\u0103ng: 4 c\xF4ng t\u1EAFc \u1EDF b\u1EA3ng L\xE0m pro)")), /* @__PURE__ */ shim_react_default.createElement("div", { className: "flex items-center gap-1 mb-2 text-[11px] flex-wrap" }, /* @__PURE__ */ shim_react_default.createElement("span", { className: "text-[#A2B2C9]" }, "Th\xEAm c\u1EA3nh:"), /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-12 bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", type: "number", step: "0.1", value: them.f, onChange: (ev) => setThem({ ...them, f: ev.target.value }), title: "gi\xE2y \u0111\u1EA7u" }), /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-12 bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", type: "number", step: "0.1", value: them.d, onChange: (ev) => setThem({ ...them, d: ev.target.value }), title: "d\xE0i (s)" }), /* @__PURE__ */ shim_react_default.createElement("select", { className: "bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", value: them.bo, onChange: (ev) => setThem({ ...them, bo: ev.target.value }) }, /* @__PURE__ */ shim_react_default.createElement("option", { value: "depth" }, "ch\u1EEF nh\u1EA5n"), /* @__PURE__ */ shim_react_default.createElement("option", { value: "anh" }, "\u1EA3nh to\xE0n khung"), /* @__PURE__ */ shim_react_default.createElement("option", { value: "cut" }, "c\u1EAFt ch\u1EEF"), /* @__PURE__ */ shim_react_default.createElement("option", { value: "tron" }, "\xF4 tr\xF2n")), /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-28 bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", placeholder: "ch\u1EEF nh\u1EA5n", value: them.giant, onChange: (ev) => setThem({ ...them, giant: ev.target.value }) }), /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-24 bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", placeholder: "\u1EA3nh: trang:\u2026", value: them.ten, onChange: (ev) => setThem({ ...them, ten: ev.target.value }) }), /* @__PURE__ */ shim_react_default.createElement("button", { className: nut3, onClick: themCanh }, "+ Th\xEAm"), /* @__PURE__ */ shim_react_default.createElement("button", { className: nut3, onClick: taiLich }, "T\u1EA3i l\u1ECBch .json"), /* @__PURE__ */ shim_react_default.createElement("button", { className: nut3, onClick: taiSrt, title: "b\u1EA3n \u0111\u1EA7u: ch\u01B0a tr\u1EEB \u0111o\u1EA1n l\u1EB7ng b\u1ECB c\u1EAFt" }, "T\u1EA3i SRT"), /* @__PURE__ */ shim_react_default.createElement("label", { className: nut3 + " cursor-pointer" }, "M\u1EDF d\u1EF1 \xE1n .json", /* @__PURE__ */ shim_react_default.createElement("input", { type: "file", accept: ".json,application/json", className: "hidden", onChange: (ev) => moDuAn(ev.target.files && ev.target.files[0]) })), (sua.them || []).length ? /* @__PURE__ */ shim_react_default.createElement("span", { className: "text-[#F6D178]" }, (sua.them || []).length, " c\u1EA3nh th\xEAm") : null), /* @__PURE__ */ shim_react_default.createElement("datalist", { id: "xvai-kho-anh" }, dsTenTaiSan().map((t) => /* @__PURE__ */ shim_react_default.createElement("option", { key: t, value: t }))), /* @__PURE__ */ shim_react_default.createElement("div", { className: "max-h-[60vh] overflow-auto" }, /* @__PURE__ */ shim_react_default.createElement("table", { className: "w-full text-[11px]" }, /* @__PURE__ */ shim_react_default.createElement("thead", null, /* @__PURE__ */ shim_react_default.createElement("tr", { className: "text-[#A2B2C9]" }, /* @__PURE__ */ shim_react_default.createElement("th", { className: "text-left" }, "#"), /* @__PURE__ */ shim_react_default.createElement("th", { className: "text-left" }, "gi\xE2y"), /* @__PURE__ */ shim_react_default.createElement("th", { className: "text-left" }, "b\u1ED1 c\u1EE5c"), /* @__PURE__ */ shim_react_default.createElement("th", { className: "text-left" }, "\u0111\u1EA7u/d\xE0i (s)"), /* @__PURE__ */ shim_react_default.createElement("th", { className: "text-left" }, "ch\u1EEF nh\u1EA5n"), /* @__PURE__ */ shim_react_default.createElement("th", { className: "text-left" }, "y / c\u1EE1"), /* @__PURE__ */ shim_react_default.createElement("th", { className: "text-left" }, "ch\u1EEF ph\u1EE5"), /* @__PURE__ */ shim_react_default.createElement("th", { className: "text-left" }, "icon"), /* @__PURE__ */ shim_react_default.createElement("th", { className: "text-left" }, "\u1EA3nh (t\xEAn kho)"), /* @__PURE__ */ shim_react_default.createElement("th", null, "xo\xE1"))), /* @__PURE__ */ shim_react_default.createElement("tbody", null, ds2.map((s) => {
19205
19408
  const e = sua[s.id] || sua[s.i] || {};
19206
19409
  const v = (k) => (typeof e[k] === "string" ? e[k] : s[k]) || "";
19207
- return /* @__PURE__ */ shim_react_default.createElement("tr", { key: s.id || s.i, className: e.xoa ? "opacity-40" : s.khoa ? "bg-[#1E3A5F]/40" : "" }, /* @__PURE__ */ shim_react_default.createElement("td", null, s.i), /* @__PURE__ */ shim_react_default.createElement("td", null, s.f.toFixed(1), "\u2013", (s.f + s.d).toFixed(1)), /* @__PURE__ */ shim_react_default.createElement("td", null, s.bo), /* @__PURE__ */ shim_react_default.createElement("td", { className: "whitespace-nowrap" }, /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-12 bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", value: typeof e.f === "number" ? e.f : s.f, onChange: (ev) => dat(s.id || String(s.i), "f", +ev.target.value), type: "number", step: "0.1" }), " ", /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-12 bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", value: typeof e.d === "number" ? e.d : s.d, onChange: (ev) => dat(s.id || String(s.i), "d", +ev.target.value), type: "number", step: "0.1", min: "0.4" })), /* @__PURE__ */ shim_react_default.createElement("td", null, /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-full bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", value: v("giant"), onChange: (ev) => dat(s.id || String(s.i), "giant", ev.target.value) })), /* @__PURE__ */ shim_react_default.createElement("td", null, /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-full bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", value: v("chu2") || v("chu"), onChange: (ev) => dat(s.id || String(s.i), s.chu2 || !s.chu ? "chu2" : "chu", ev.target.value) })), /* @__PURE__ */ shim_react_default.createElement("td", null, /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-20 bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", value: v("st"), onChange: (ev) => dat(s.id || String(s.i), "st", ev.target.value), placeholder: "tich/luu\u2026" })), /* @__PURE__ */ shim_react_default.createElement("td", null, /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-24 bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", value: v("ten"), onChange: (ev) => dat(s.id || String(s.i), "ten", ev.target.value), placeholder: "trang:\u2026 / anh:\u2026" })), /* @__PURE__ */ shim_react_default.createElement("td", { className: "text-center" }, /* @__PURE__ */ shim_react_default.createElement("input", { type: "checkbox", checked: !!e.xoa, onChange: (ev) => dat(s.id || String(s.i), "xoa", ev.target.checked ? 1 : 0) })));
19410
+ return /* @__PURE__ */ shim_react_default.createElement("tr", { key: s.id || s.i, className: e.xoa ? "opacity-40" : s.khoa ? "bg-[#1E3A5F]/40" : "" }, /* @__PURE__ */ shim_react_default.createElement("td", null, s.i), /* @__PURE__ */ shim_react_default.createElement("td", null, s.f.toFixed(1), "\u2013", (s.f + s.d).toFixed(1)), /* @__PURE__ */ shim_react_default.createElement("td", null, s.bo), /* @__PURE__ */ shim_react_default.createElement("td", { className: "whitespace-nowrap" }, /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-12 bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", value: typeof e.f === "number" ? e.f : s.f, onChange: (ev) => dat(s.id || String(s.i), "f", +ev.target.value), type: "number", step: "0.1" }), " ", /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-12 bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", value: typeof e.d === "number" ? e.d : s.d, onChange: (ev) => dat(s.id || String(s.i), "d", +ev.target.value), type: "number", step: "0.1", min: "0.4" })), /* @__PURE__ */ shim_react_default.createElement("td", null, /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-full bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", value: v("giant"), onChange: (ev) => dat(s.id || String(s.i), "giant", ev.target.value) })), /* @__PURE__ */ shim_react_default.createElement("td", { className: "whitespace-nowrap" }, /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-12 bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", type: "number", step: "0.02", min: "0.05", max: "0.6", placeholder: "y", value: typeof e.yChu === "number" ? e.yChu : s.yChu ?? "", onChange: (ev) => dat(s.id || String(s.i), "yChu", +ev.target.value), title: "v\u1ECB tr\xED ch\u1EEF nh\u1EA5n (0,05 tr\xEAn \u2013 0,6 d\u01B0\u1EDBi)" }), " ", /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-12 bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", type: "number", step: "0.1", min: "0.5", max: "1.6", placeholder: "\xD71", value: typeof e.coChu === "number" ? e.coChu : s.coChu ?? "", onChange: (ev) => dat(s.id || String(s.i), "coChu", +ev.target.value), title: "c\u1EE1 ch\u1EEF nh\u1EA5n \xD70,5\u20131,6" })), /* @__PURE__ */ shim_react_default.createElement("td", null, /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-full bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", value: v("chu2") || v("chu"), onChange: (ev) => dat(s.id || String(s.i), s.chu2 || !s.chu ? "chu2" : "chu", ev.target.value) })), /* @__PURE__ */ shim_react_default.createElement("td", null, /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-20 bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", value: v("st"), onChange: (ev) => dat(s.id || String(s.i), "st", ev.target.value), placeholder: "tich/luu\u2026" })), /* @__PURE__ */ shim_react_default.createElement("td", null, /* @__PURE__ */ shim_react_default.createElement("input", { className: "w-24 bg-[#0B1A2D] border border-[#2C4A73] rounded px-1", list: "xvai-kho-anh", value: v("ten"), onChange: (ev) => dat(s.id || String(s.i), "ten", ev.target.value), placeholder: "trang:\u2026 / anh:\u2026" })), /* @__PURE__ */ shim_react_default.createElement("td", { className: "text-center" }, /* @__PURE__ */ shim_react_default.createElement("input", { type: "checkbox", checked: !!e.xoa, onChange: (ev) => dat(s.id || String(s.i), "xoa", ev.target.checked ? 1 : 0) })));
19208
19411
  })))), /* @__PURE__ */ shim_react_default.createElement("div", { className: "text-[#A2B2C9] mt-2" }, "Ch\u1EEF nh\u1EA5n xu\u1ED1ng d\xF2ng: g\xF5 \\n. Icon: tich, luu, chuot, sao, tim, dong-ho\u2026 (t\xEAn trong veSticker). S\u1EEDa xong b\u1EA5m V\u1EBD l\u1EA1i (~2\u20135 ph\xFAt)."));
19209
19412
  };
19210
19413
 
19211
19414
  // loi/vo-flow.tsx
19212
- var PHIEN_BAN = "loi-1010A";
19415
+ var PHIEN_BAN = "loi-1010N";
19213
19416
  var TRONG = () => migrateProject({ id: crypto.randomUUID(), name: "D\u1EF1 \xE1n m\u1EDBi", scenes: [], timeline: [], images: [null, null, null] });
19214
19417
  var nut4 = "px-3 py-1.5 rounded-lg border border-[#2C4A73] text-[11px] font-bold text-[#A2B2C9] hover:text-[#F6D178] hover:border-[#F6D178]/60";
19215
19418
  var Vo = () => {
@@ -19227,6 +19430,7 @@ var Vo = () => {
19227
19430
  setP(moi);
19228
19431
  };
19229
19432
  useEffect(() => {
19433
+ window.__loiSetP = setP;
19230
19434
  datCauLenh({ project: p, setProject: setP, exporting: ex, blob: b, xuat, dongXuat: () => setEx(null), tai, luuJson: () => handleExportProject(p, toast) });
19231
19435
  });
19232
19436
  window.__loiApp = { p, ex, b, phienBan: PHIEN_BAN };