dsh-image-gen 0.6.10 → 0.6.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js
CHANGED
|
@@ -515,6 +515,31 @@ window.__ModuleLoader__.load({
|
|
|
515
515
|
notifyListeners();
|
|
516
516
|
}
|
|
517
517
|
/**
|
|
518
|
+
* Bulk update favorite status for multiple gallery records in a single transaction.
|
|
519
|
+
*/
|
|
520
|
+
async function bulkSetFavoriteGalleryItems(ids, isFavorite) {
|
|
521
|
+
if (ids.length === 0) return;
|
|
522
|
+
const db = await getDB();
|
|
523
|
+
await new Promise((resolve, reject) => {
|
|
524
|
+
const tx = db.transaction(STORE_NAME, "readwrite");
|
|
525
|
+
const store = tx.objectStore(STORE_NAME);
|
|
526
|
+
for (const id of ids) {
|
|
527
|
+
const getReq = store.get(id);
|
|
528
|
+
getReq.onsuccess = () => {
|
|
529
|
+
const item = getReq.result;
|
|
530
|
+
if (item && item.isFavorite !== isFavorite) {
|
|
531
|
+
item.isFavorite = isFavorite;
|
|
532
|
+
store.put(item);
|
|
533
|
+
}
|
|
534
|
+
};
|
|
535
|
+
}
|
|
536
|
+
tx.oncomplete = () => resolve();
|
|
537
|
+
tx.onerror = () => reject(tx.error ?? /* @__PURE__ */ new Error("IndexedDB transaction failed"));
|
|
538
|
+
tx.onabort = () => reject(tx.error ?? /* @__PURE__ */ new Error("IndexedDB transaction aborted"));
|
|
539
|
+
});
|
|
540
|
+
notifyListeners();
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
518
543
|
* Standardize path format across Windows and POSIX (lowercase, forward slashes, no trailing slash).
|
|
519
544
|
*/
|
|
520
545
|
function normalizeWorkspacePath(rawPath) {
|
|
@@ -1254,6 +1279,19 @@ window.__ModuleLoader__.load({
|
|
|
1254
1279
|
* This source code is licensed under the ISC license.
|
|
1255
1280
|
* See the LICENSE file in the root directory of this source tree.
|
|
1256
1281
|
*/
|
|
1282
|
+
const SquareCheckBig = createLucideIcon("square-check-big", [["path", {
|
|
1283
|
+
d: "M21 10.656V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h12.344",
|
|
1284
|
+
key: "2acyp4"
|
|
1285
|
+
}], ["path", {
|
|
1286
|
+
d: "m9 11 3 3L22 4",
|
|
1287
|
+
key: "1pflzl"
|
|
1288
|
+
}]]);
|
|
1289
|
+
/**
|
|
1290
|
+
* @license lucide-react v1.38.0 - ISC
|
|
1291
|
+
*
|
|
1292
|
+
* This source code is licensed under the ISC license.
|
|
1293
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
1294
|
+
*/
|
|
1257
1295
|
const Star = createLucideIcon("star", [["path", {
|
|
1258
1296
|
d: "M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",
|
|
1259
1297
|
key: "r04s7s"
|
|
@@ -1563,6 +1601,89 @@ window.__ModuleLoader__.load({
|
|
|
1563
1601
|
const d = new Date(timestamp);
|
|
1564
1602
|
return `${d.getFullYear()}/${d.getMonth() + 1}/${d.getDate()}`;
|
|
1565
1603
|
}
|
|
1604
|
+
const CRC_TABLE = /* @__PURE__ */ new Uint32Array(256);
|
|
1605
|
+
for (let i = 0; i < 256; i++) {
|
|
1606
|
+
let c = i;
|
|
1607
|
+
for (let k = 0; k < 8; k++) c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1;
|
|
1608
|
+
CRC_TABLE[i] = c;
|
|
1609
|
+
}
|
|
1610
|
+
function crc32(buf) {
|
|
1611
|
+
let crc = 4294967295;
|
|
1612
|
+
for (let i = 0; i < buf.length; i++) {
|
|
1613
|
+
const byte = buf[i] ?? 0;
|
|
1614
|
+
crc = (CRC_TABLE[(crc ^ byte) & 255] ?? 0) ^ crc >>> 8;
|
|
1615
|
+
}
|
|
1616
|
+
return (crc ^ 4294967295) >>> 0;
|
|
1617
|
+
}
|
|
1618
|
+
/**
|
|
1619
|
+
* Create a standard zero-compression (Store mode 0) PKZip Blob from an array of files.
|
|
1620
|
+
* Zero external dependencies, pure browser ArrayBuffer/Blob, fast and universally compatible with OS extractors.
|
|
1621
|
+
*/
|
|
1622
|
+
function createZipBlob(files) {
|
|
1623
|
+
const parts = [];
|
|
1624
|
+
const centralRecords = [];
|
|
1625
|
+
let offset = 0;
|
|
1626
|
+
const encoder = new TextEncoder();
|
|
1627
|
+
for (const file of files) {
|
|
1628
|
+
const nameBytes = encoder.encode(file.name);
|
|
1629
|
+
const data = file.data;
|
|
1630
|
+
const crc = crc32(data);
|
|
1631
|
+
const size = data.length;
|
|
1632
|
+
const localHeader = /* @__PURE__ */ new Uint8Array(30);
|
|
1633
|
+
const lv = new DataView(localHeader.buffer);
|
|
1634
|
+
lv.setUint32(0, 67324752, true);
|
|
1635
|
+
lv.setUint16(4, 20, true);
|
|
1636
|
+
lv.setUint16(6, 0, true);
|
|
1637
|
+
lv.setUint16(8, 0, true);
|
|
1638
|
+
lv.setUint16(10, 0, true);
|
|
1639
|
+
lv.setUint16(12, 0, true);
|
|
1640
|
+
lv.setUint32(14, crc, true);
|
|
1641
|
+
lv.setUint32(18, size, true);
|
|
1642
|
+
lv.setUint32(22, size, true);
|
|
1643
|
+
lv.setUint16(26, nameBytes.length, true);
|
|
1644
|
+
lv.setUint16(28, 0, true);
|
|
1645
|
+
parts.push(localHeader, nameBytes, data);
|
|
1646
|
+
const cdRecord = /* @__PURE__ */ new Uint8Array(46);
|
|
1647
|
+
const cv = new DataView(cdRecord.buffer);
|
|
1648
|
+
cv.setUint32(0, 33639248, true);
|
|
1649
|
+
cv.setUint16(4, 20, true);
|
|
1650
|
+
cv.setUint16(6, 20, true);
|
|
1651
|
+
cv.setUint16(8, 0, true);
|
|
1652
|
+
cv.setUint16(10, 0, true);
|
|
1653
|
+
cv.setUint16(12, 0, true);
|
|
1654
|
+
cv.setUint16(14, 0, true);
|
|
1655
|
+
cv.setUint32(16, crc, true);
|
|
1656
|
+
cv.setUint32(20, size, true);
|
|
1657
|
+
cv.setUint32(24, size, true);
|
|
1658
|
+
cv.setUint16(28, nameBytes.length, true);
|
|
1659
|
+
cv.setUint16(30, 0, true);
|
|
1660
|
+
cv.setUint16(32, 0, true);
|
|
1661
|
+
cv.setUint16(34, 0, true);
|
|
1662
|
+
cv.setUint16(36, 0, true);
|
|
1663
|
+
cv.setUint32(38, 0, true);
|
|
1664
|
+
cv.setUint32(42, offset, true);
|
|
1665
|
+
centralRecords.push(cdRecord, nameBytes);
|
|
1666
|
+
offset += localHeader.length + nameBytes.length + data.length;
|
|
1667
|
+
}
|
|
1668
|
+
const cdOffset = offset;
|
|
1669
|
+
let cdSize = 0;
|
|
1670
|
+
for (const part of centralRecords) cdSize += part.byteLength;
|
|
1671
|
+
const eocd = /* @__PURE__ */ new Uint8Array(22);
|
|
1672
|
+
const ev = new DataView(eocd.buffer);
|
|
1673
|
+
ev.setUint32(0, 101010256, true);
|
|
1674
|
+
ev.setUint16(4, 0, true);
|
|
1675
|
+
ev.setUint16(6, 0, true);
|
|
1676
|
+
ev.setUint16(8, files.length, true);
|
|
1677
|
+
ev.setUint16(10, files.length, true);
|
|
1678
|
+
ev.setUint32(12, cdSize, true);
|
|
1679
|
+
ev.setUint32(16, cdOffset, true);
|
|
1680
|
+
ev.setUint16(20, 0, true);
|
|
1681
|
+
return new Blob([
|
|
1682
|
+
...parts,
|
|
1683
|
+
...centralRecords,
|
|
1684
|
+
eocd
|
|
1685
|
+
], { type: "application/zip" });
|
|
1686
|
+
}
|
|
1566
1687
|
//#endregion
|
|
1567
1688
|
//#region lib/types/client/multi-model-compare.js
|
|
1568
1689
|
/** Map one shared output intent to settings accepted by every target model. */
|
|
@@ -119654,12 +119775,22 @@ img.ProseMirror-separator {
|
|
|
119654
119775
|
close: "关闭 (Esc)",
|
|
119655
119776
|
prevImage: "上一张 (←)",
|
|
119656
119777
|
nextImage: "下一张 (→)",
|
|
119657
|
-
manage: "
|
|
119778
|
+
manage: "批量管理",
|
|
119658
119779
|
exitManage: "退出选择",
|
|
119659
119780
|
selectedCount: "已选 {n} 项",
|
|
119660
119781
|
selectAll: "全选",
|
|
119661
119782
|
invertSelect: "反选",
|
|
119662
119783
|
clearSelect: "清空",
|
|
119784
|
+
batchFavorite: "批量收藏",
|
|
119785
|
+
batchUnfavorite: "批量取消收藏",
|
|
119786
|
+
batchFavoritedToast: "已将 {count} 张图片加入收藏",
|
|
119787
|
+
batchUnfavoritedToast: "已取消 {count} 张图片的收藏",
|
|
119788
|
+
batchFavoriteFailed: "收藏操作失败,请重试",
|
|
119789
|
+
batchDownload: "批量下载",
|
|
119790
|
+
batchDownloading: "打包中 ({current}/{total})…",
|
|
119791
|
+
batchDownloadSingleToast: "已下载 1 张图片",
|
|
119792
|
+
batchDownloadZipToast: "已打包下载 {count} 张图片",
|
|
119793
|
+
batchDownloadFailed: "批量下载失败,请重试",
|
|
119663
119794
|
batchDelete: "批量删除",
|
|
119664
119795
|
batchDeleteTitle: "确认批量删除选中的 {count} 张图片?",
|
|
119665
119796
|
batchDeleteTitleSingle: "确认从画廊中删除这张图片?",
|
|
@@ -119740,12 +119871,22 @@ img.ProseMirror-separator {
|
|
|
119740
119871
|
close: "Close (Esc)",
|
|
119741
119872
|
prevImage: "Previous (←)",
|
|
119742
119873
|
nextImage: "Next (→)",
|
|
119743
|
-
manage: "Batch
|
|
119874
|
+
manage: "Batch Manage",
|
|
119744
119875
|
exitManage: "Done",
|
|
119745
119876
|
selectedCount: "{n} selected",
|
|
119746
119877
|
selectAll: "Select All",
|
|
119747
119878
|
invertSelect: "Invert",
|
|
119748
119879
|
clearSelect: "Clear",
|
|
119880
|
+
batchFavorite: "Batch Favorite",
|
|
119881
|
+
batchUnfavorite: "Batch Unfavorite",
|
|
119882
|
+
batchFavoritedToast: "Added {count} images to favorites",
|
|
119883
|
+
batchUnfavoritedToast: "Removed {count} images from favorites",
|
|
119884
|
+
batchFavoriteFailed: "Favorite operation failed, please retry",
|
|
119885
|
+
batchDownload: "Batch Download",
|
|
119886
|
+
batchDownloading: "Packaging ({current}/{total})…",
|
|
119887
|
+
batchDownloadSingleToast: "Downloaded 1 image",
|
|
119888
|
+
batchDownloadZipToast: "Packaged & downloaded {count} images",
|
|
119889
|
+
batchDownloadFailed: "Batch download failed, please retry",
|
|
119749
119890
|
batchDelete: "Batch Delete",
|
|
119750
119891
|
batchDeleteTitle: "Delete {count} selected images?",
|
|
119751
119892
|
batchDeleteTitleSingle: "Delete this image from gallery?",
|
|
@@ -120273,6 +120414,91 @@ img.ProseMirror-separator {
|
|
|
120273
120414
|
setSelectedIds(/* @__PURE__ */ new Set());
|
|
120274
120415
|
lastSelectedIndexRef.current = null;
|
|
120275
120416
|
};
|
|
120417
|
+
const selectedItems = (0, react.useMemo)(() => {
|
|
120418
|
+
if (selectedIds.size === 0) return [];
|
|
120419
|
+
return items.filter((item) => selectedIds.has(item.id));
|
|
120420
|
+
}, [items, selectedIds]);
|
|
120421
|
+
const allSelectedAreFavorites = (0, react.useMemo)(() => {
|
|
120422
|
+
if (selectedItems.length === 0) return false;
|
|
120423
|
+
return selectedItems.every((item) => Boolean(item.isFavorite));
|
|
120424
|
+
}, [selectedItems]);
|
|
120425
|
+
const handleBatchToggleFavorite = async () => {
|
|
120426
|
+
if (selectedIds.size === 0) return;
|
|
120427
|
+
const targetFavorite = !allSelectedAreFavorites;
|
|
120428
|
+
const targetIds = Array.from(selectedIds);
|
|
120429
|
+
setItems((prev) => prev.map((item) => selectedIds.has(item.id) ? {
|
|
120430
|
+
...item,
|
|
120431
|
+
isFavorite: targetFavorite
|
|
120432
|
+
} : item));
|
|
120433
|
+
try {
|
|
120434
|
+
await bulkSetFavoriteGalleryItems(targetIds, targetFavorite);
|
|
120435
|
+
showToast(targetFavorite ? t("batchFavoritedToast", { count: String(targetIds.length) }) : t("batchUnfavoritedToast", { count: String(targetIds.length) }));
|
|
120436
|
+
} catch (err) {
|
|
120437
|
+
console.error("[dsh-image-gen] Batch favorite failed:", err);
|
|
120438
|
+
getGalleryItems().then((res) => setItems(res));
|
|
120439
|
+
showToast(t("batchFavoriteFailed"));
|
|
120440
|
+
}
|
|
120441
|
+
};
|
|
120442
|
+
const [isDownloadingBatch, setIsDownloadingBatch] = (0, react.useState)(false);
|
|
120443
|
+
const [batchDownloadProgress, setBatchDownloadProgress] = (0, react.useState)(null);
|
|
120444
|
+
const handleBatchDownload = async () => {
|
|
120445
|
+
if (selectedIds.size === 0 || isDownloadingBatch) return;
|
|
120446
|
+
const itemsToDownload = selectedItems;
|
|
120447
|
+
if (itemsToDownload.length === 0) return;
|
|
120448
|
+
setIsDownloadingBatch(true);
|
|
120449
|
+
try {
|
|
120450
|
+
if (itemsToDownload.length === 1) {
|
|
120451
|
+
const single = itemsToDownload[0];
|
|
120452
|
+
if (!single) return;
|
|
120453
|
+
let blob = blobCache.get(single.id);
|
|
120454
|
+
if (!blob) {
|
|
120455
|
+
blob = await fetchAttachmentBlob(single.attachment);
|
|
120456
|
+
blobCache.set(single.id, blob);
|
|
120457
|
+
}
|
|
120458
|
+
const objectUrl = URL.createObjectURL(blob);
|
|
120459
|
+
downloadBlobUrl(objectUrl, `dsh-${single.provider}-${single.id}.png`);
|
|
120460
|
+
URL.revokeObjectURL(objectUrl);
|
|
120461
|
+
showToast(t("batchDownloadSingleToast"));
|
|
120462
|
+
return;
|
|
120463
|
+
}
|
|
120464
|
+
const zipFiles = [];
|
|
120465
|
+
const usedNames = /* @__PURE__ */ new Set();
|
|
120466
|
+
for (let i = 0; i < itemsToDownload.length; i++) {
|
|
120467
|
+
const it = itemsToDownload[i];
|
|
120468
|
+
if (!it) continue;
|
|
120469
|
+
setBatchDownloadProgress(`${i + 1}/${itemsToDownload.length}`);
|
|
120470
|
+
let blob = blobCache.get(it.id);
|
|
120471
|
+
if (!blob) {
|
|
120472
|
+
blob = await fetchAttachmentBlob(it.attachment);
|
|
120473
|
+
blobCache.set(it.id, blob);
|
|
120474
|
+
}
|
|
120475
|
+
const arrayBuffer = await blob.arrayBuffer();
|
|
120476
|
+
const ext = blob.type === "image/jpeg" ? "jpg" : blob.type === "image/webp" ? "webp" : "png";
|
|
120477
|
+
let baseName = `dsh-${it.provider}-${it.id.slice(0, 8)}.${ext}`;
|
|
120478
|
+
let count = 1;
|
|
120479
|
+
while (usedNames.has(baseName)) {
|
|
120480
|
+
baseName = `dsh-${it.provider}-${it.id.slice(0, 8)}-${count}.${ext}`;
|
|
120481
|
+
count++;
|
|
120482
|
+
}
|
|
120483
|
+
usedNames.add(baseName);
|
|
120484
|
+
zipFiles.push({
|
|
120485
|
+
name: baseName,
|
|
120486
|
+
data: new Uint8Array(arrayBuffer)
|
|
120487
|
+
});
|
|
120488
|
+
}
|
|
120489
|
+
const zipBlob = createZipBlob(zipFiles);
|
|
120490
|
+
const zipUrl = URL.createObjectURL(zipBlob);
|
|
120491
|
+
downloadBlobUrl(zipUrl, `dsh-gallery-${(/* @__PURE__ */ new Date()).toISOString().slice(0, 10).replace(/-/g, "")}.zip`);
|
|
120492
|
+
URL.revokeObjectURL(zipUrl);
|
|
120493
|
+
showToast(t("batchDownloadZipToast", { count: String(itemsToDownload.length) }));
|
|
120494
|
+
} catch (err) {
|
|
120495
|
+
console.error("[dsh-image-gen] Batch download failed:", err);
|
|
120496
|
+
showToast(t("batchDownloadFailed"));
|
|
120497
|
+
} finally {
|
|
120498
|
+
setIsDownloadingBatch(false);
|
|
120499
|
+
setBatchDownloadProgress(null);
|
|
120500
|
+
}
|
|
120501
|
+
};
|
|
120276
120502
|
const requestSingleDelete = (item, e) => {
|
|
120277
120503
|
if (e) e.stopPropagation();
|
|
120278
120504
|
setSelectedIds(/* @__PURE__ */ new Set([item.id]));
|
|
@@ -120505,13 +120731,13 @@ img.ProseMirror-separator {
|
|
|
120505
120731
|
})]
|
|
120506
120732
|
}), (0, react_jsx_runtime.jsxs)("button", {
|
|
120507
120733
|
type: "button",
|
|
120508
|
-
className: `dsh-ig-studio-btn
|
|
120734
|
+
className: `dsh-ig-studio-btn ${isManageMode ? "is-active" : ""}`,
|
|
120509
120735
|
title: isManageMode ? t("exitManage") : t("manage"),
|
|
120510
120736
|
onClick: () => {
|
|
120511
120737
|
if (isManageMode) handleExitManage();
|
|
120512
120738
|
else setIsManageMode(true);
|
|
120513
120739
|
},
|
|
120514
|
-
children: [(0, react_jsx_runtime.jsx)(
|
|
120740
|
+
children: [(0, react_jsx_runtime.jsx)(SquareCheckBig, { size: 13 }), (0, react_jsx_runtime.jsx)("span", { children: isManageMode ? t("exitManage") : t("manage") })]
|
|
120515
120741
|
})]
|
|
120516
120742
|
})]
|
|
120517
120743
|
}),
|
|
@@ -120628,18 +120854,45 @@ img.ProseMirror-separator {
|
|
|
120628
120854
|
]
|
|
120629
120855
|
}), (0, react_jsx_runtime.jsxs)("div", {
|
|
120630
120856
|
className: "dsh-ig-batch-bar-right",
|
|
120631
|
-
children: [
|
|
120632
|
-
|
|
120633
|
-
|
|
120634
|
-
|
|
120635
|
-
|
|
120636
|
-
|
|
120637
|
-
|
|
120638
|
-
|
|
120639
|
-
|
|
120640
|
-
|
|
120641
|
-
|
|
120642
|
-
|
|
120857
|
+
children: [
|
|
120858
|
+
(0, react_jsx_runtime.jsxs)("button", {
|
|
120859
|
+
type: "button",
|
|
120860
|
+
className: `dsh-ig-batch-btn ${allSelectedAreFavorites ? "is-favorited" : ""}`,
|
|
120861
|
+
disabled: selectedIds.size === 0,
|
|
120862
|
+
onClick: () => void handleBatchToggleFavorite(),
|
|
120863
|
+
title: allSelectedAreFavorites ? t("batchUnfavorite") : t("batchFavorite"),
|
|
120864
|
+
children: [(0, react_jsx_runtime.jsx)(Heart, {
|
|
120865
|
+
size: 13,
|
|
120866
|
+
fill: allSelectedAreFavorites ? "#ef4444" : "none",
|
|
120867
|
+
color: allSelectedAreFavorites ? "#ef4444" : "currentColor"
|
|
120868
|
+
}), (0, react_jsx_runtime.jsx)("span", { children: allSelectedAreFavorites ? t("batchUnfavorite") : t("batchFavorite") })]
|
|
120869
|
+
}),
|
|
120870
|
+
(0, react_jsx_runtime.jsxs)("button", {
|
|
120871
|
+
type: "button",
|
|
120872
|
+
className: "dsh-ig-batch-btn dsh-ig-batch-btn-download",
|
|
120873
|
+
disabled: selectedIds.size === 0 || isDownloadingBatch,
|
|
120874
|
+
onClick: () => void handleBatchDownload(),
|
|
120875
|
+
title: t("batchDownload"),
|
|
120876
|
+
children: [(0, react_jsx_runtime.jsx)(Download, { size: 13 }), (0, react_jsx_runtime.jsx)("span", { children: isDownloadingBatch && batchDownloadProgress ? t("batchDownloading", {
|
|
120877
|
+
current: batchDownloadProgress.split("/")[0] ?? "",
|
|
120878
|
+
total: batchDownloadProgress.split("/")[1] ?? ""
|
|
120879
|
+
}) : t("batchDownload") })]
|
|
120880
|
+
}),
|
|
120881
|
+
(0, react_jsx_runtime.jsx)("span", { className: "dsh-ig-batch-divider" }),
|
|
120882
|
+
(0, react_jsx_runtime.jsxs)("button", {
|
|
120883
|
+
type: "button",
|
|
120884
|
+
className: "dsh-ig-batch-btn dsh-ig-batch-btn-danger",
|
|
120885
|
+
disabled: selectedIds.size === 0,
|
|
120886
|
+
onClick: () => setShowDeleteModal(true),
|
|
120887
|
+
children: [(0, react_jsx_runtime.jsx)(Trash2, { size: 13 }), (0, react_jsx_runtime.jsxs)("span", { children: [t("batchDelete"), selectedIds.size > 0 ? ` (${selectedIds.size})` : ""] })]
|
|
120888
|
+
}),
|
|
120889
|
+
(0, react_jsx_runtime.jsx)("button", {
|
|
120890
|
+
type: "button",
|
|
120891
|
+
className: "dsh-ig-batch-btn dsh-ig-batch-btn-exit",
|
|
120892
|
+
onClick: handleExitManage,
|
|
120893
|
+
children: t("exitManage")
|
|
120894
|
+
})
|
|
120895
|
+
]
|
|
120643
120896
|
})]
|
|
120644
120897
|
}),
|
|
120645
120898
|
showDeleteModal && (0, react_jsx_runtime.jsx)("div", {
|
|
@@ -122220,7 +122473,7 @@ img.ProseMirror-separator {
|
|
|
122220
122473
|
`;
|
|
122221
122474
|
//#endregion
|
|
122222
122475
|
//#region lib/types/client/index.js
|
|
122223
|
-
console.info(`[dsh-image-gen] canvas bundle 2026-09-
|
|
122476
|
+
console.info(`[dsh-image-gen] canvas bundle 2026-09-23T16:16:55.812Z`);
|
|
122224
122477
|
/** Right-sidebar tab-type registration id (DSH 0.1.5 `sidebarRightTabs`). */
|
|
122225
122478
|
const SIDEBAR_STUDIO_TAB_ID = "dsh-image-gen/studio";
|
|
122226
122479
|
/** The tab kind: a page type opened by kind, recognizing no resource address. */
|
|
@@ -122754,6 +123007,10 @@ img.ProseMirror-separator {
|
|
|
122754
123007
|
.dsh-ig-batch-btn{appearance:none;border:1px solid rgba(255,255,255,0.15);background:rgba(255,255,255,0.08);color:#fff;border-radius:20px;padding:5px 12px;font-size:12px;cursor:pointer;display:inline-flex;align-items:center;gap:5px;transition:background .15s,border-color .15s,color .15s}
|
|
122755
123008
|
.dsh-ig-batch-btn:hover:not(:disabled){background:rgba(255,255,255,0.2)}
|
|
122756
123009
|
.dsh-ig-batch-btn:disabled{opacity:0.4;cursor:not-allowed}
|
|
123010
|
+
.dsh-ig-batch-btn.is-favorited{background:rgba(239,68,68,0.15);border-color:rgba(239,68,68,0.4);color:#fca5a5}
|
|
123011
|
+
.dsh-ig-batch-btn.is-favorited:hover:not(:disabled){background:rgba(239,68,68,0.25)!important;border-color:rgba(239,68,68,0.6)!important;color:#fff!important}
|
|
123012
|
+
.dsh-ig-batch-btn-download:hover:not(:disabled){background:rgba(59,130,246,0.2)!important;border-color:rgba(59,130,246,0.5)!important;color:#93c5fd!important}
|
|
123013
|
+
.dsh-ig-batch-divider{width:1px;height:16px;background:rgba(255,255,255,0.18);margin:0 2px;display:inline-block}
|
|
122757
123014
|
.dsh-ig-batch-btn-danger{background:rgba(239,68,68,0.2);border-color:rgba(239,68,68,0.5);color:#fca5a5}
|
|
122758
123015
|
.dsh-ig-batch-btn-danger:hover:not(:disabled){background:rgba(239,68,68,0.4)!important;border-color:rgba(239,68,68,0.8)!important;color:#fff!important}
|
|
122759
123016
|
.dsh-ig-batch-btn-exit{border-color:transparent;background:transparent;color:rgba(255,255,255,0.7)}
|