// ==UserScript==
// @name TubeInsights
// @namespace https://github.com/exyezed/tube-insights/
// @version 1.0.0
// @author exyezed
// @description A powerful YouTube userscript powered by the InnerTube API — offering advanced analytics, live stats, organized bookmarks, and integrated video/audio downloads.
// @license MIT
// @icon data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9IiNmZjYyN2QiPjxwYXRoIHN0cm9rZT0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xOCAzYTUgNSAwIDAgMSA1IDV2OGE1IDUgMCAwIDEgLTUgNWgtMTJhNSA1IDAgMCAxIC01IC01di04YTUgNSAwIDAgMSA1IC01em0tOSA2djZhMSAxIDAgMCAwIDEuNTE0IC44NTdsNSAtM2ExIDEgMCAwIDAgMCAtMS43MTRsLTUgLTNhMSAxIDAgMCAwIC0xLjUxNCAuODU3eiIgLz48L3N2Zz4=
// @supportURL https://github.com/exyezed/tube-insights/issues
// @match https://www.youtube.com/*
// @require https://cdn.jsdelivr.net/npm/@preact/[email protected]/dist/signals-core.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/crypto-js.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/preact.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/hooks/dist/hooks.umd.js
// @require https://cdn.jsdelivr.net/npm/@preact/[email protected]/dist/signals.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/dayjs.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/crypto-js.min.js
// @connect api.livecounts.io
// @connect api.mp3youtube.cc
// @connect iframe.y2meta-uk.com
// @connect get-info.downsub.com
// @connect download.subtitle.to
// @connect *
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_xmlhttpRequest
// ==/UserScript==
(function (preact, signals, hooks, dayjs, CryptoJS) {
'use strict';
const scriptRel = (function detectScriptRel() {
const relList = typeof document !== "undefined" && document.createElement("link").relList;
return relList && relList.supports && relList.supports("modulepreload") ? "modulepreload" : "preload";
})();
const assetsURL = function(dep) {
return "/" + dep;
};
const seen = {};
const __vitePreload = function preload(baseModule, deps, importerUrl) {
let promise = Promise.resolve();
if (deps && deps.length > 0) {
let allSettled = function(promises$2) {
return Promise.all(promises$2.map((p) => Promise.resolve(p).then((value$1) => ({
status: "fulfilled",
value: value$1
}), (reason) => ({
status: "rejected",
reason
}))));
};
document.getElementsByTagName("link");
const cspNonceMeta = document.querySelector("meta[property=csp-nonce]");
const cspNonce = cspNonceMeta?.nonce || cspNonceMeta?.getAttribute("nonce");
promise = allSettled(deps.map((dep) => {
dep = assetsURL(dep);
if (dep in seen) return;
seen[dep] = true;
const isCss = dep.endsWith(".css");
const cssSelector = isCss ? '[rel="stylesheet"]' : "";
if (document.querySelector(`link[href="${dep}"]${cssSelector}`)) return;
const link = document.createElement("link");
link.rel = isCss ? "stylesheet" : scriptRel;
if (!isCss) link.as = "script";
link.crossOrigin = "";
link.href = dep;
if (cspNonce) link.setAttribute("nonce", cspNonce);
document.head.appendChild(link);
if (isCss) return new Promise((res, rej) => {
link.addEventListener("load", res);
link.addEventListener("error", () => rej( new Error(`Unable to preload CSS for ${dep}`)));
});
}));
}
function handlePreloadError(err$2) {
const e$1 = new Event("vite:preloadError", { cancelable: true });
e$1.payload = err$2;
window.dispatchEvent(e$1);
if (!e$1.defaultPrevented) throw err$2;
}
return promise.then((res) => {
for (const item of res || []) {
if (item.status !== "rejected") continue;
handlePreloadError(item.reason);
}
return baseModule().catch(handlePreloadError);
});
};
var f = 0;
function u(e, t, n, o, i, u2) {
t || (t = {});
var a, c, p = t;
if ("ref" in p) for (c in p = {}, t) "ref" == c ? a = t[c] : p[c] = t[c];
var l = { type: e, props: p, key: n, ref: a, __k: null, __: null, __b: 0, __e: null, __c: null, constructor: void 0, __v: --f, __i: -1, __u: 0, __source: i, __self: u2 };
if ("function" == typeof e && (a = e.defaultProps)) for (c in a) void 0 === p[c] && (p[c] = a[c]);
return preact.options.vnode && preact.options.vnode(l), l;
}
const storage = {
async get(key, defaultValue) {
return new Promise((resolve) => {
if (typeof GM_getValue !== "undefined") {
const value = GM_getValue(key, defaultValue || "");
resolve(value);
} else {
const value = localStorage.getItem(key);
resolve(value || defaultValue || "");
}
});
},
async set(key, value) {
return new Promise((resolve) => {
if (typeof GM_setValue !== "undefined") {
GM_setValue(key, value);
} else {
localStorage.setItem(key, value);
}
resolve();
});
}
};
const isPanelVisible = signals.signal(true);
const activeTab = signals.signal("insights");
const currentTheme = signals.signal("light");
const panelWidth = signals.signal(350);
const saveChannelDialogData = signals.signal(null);
const deleteChannelDialogData = signals.signal(null);
const clearAllDialogOpen = signals.signal(false);
const detailChannelDialogData = signals.signal(null);
const subtitleDialogData = signals.signal(null);
const moduleSettings = signals.signal({
loopVideo: true,
screenshotVideo: true,
screenshotFormat: "png",
screenshotDownload: true,
screenshotCopy: true
});
function togglePanel() {
isPanelVisible.value = !isPanelVisible.value;
storage.set("tubeinsights-panelVisible", isPanelVisible.value.toString());
}
function setActiveTab(tab) {
activeTab.value = tab;
storage.set("tubeinsights-activeTab", tab);
}
async function loadSettings() {
const panelVisible = await storage.get("tubeinsights-panelVisible", "true");
isPanelVisible.value = panelVisible === "true";
const theme = await storage.get("tubeinsights-theme", "light");
currentTheme.value = theme;
const width = await storage.get("tubeinsights-panelWidth", "350");
panelWidth.value = parseInt(width);
const savedTab = await storage.get("tubeinsights-activeTab", "insights");
if (savedTab === "insights" || savedTab === "livecount" || savedTab === "bookmark" || savedTab === "ddl" || savedTab === "settings") {
activeTab.value = savedTab;
}
const loopVideo = await storage.get("module-loop-video", "true");
const screenshotVideo = await storage.get("module-screenshot-video", "true");
const screenshotFormat = await storage.get("module-screenshot-format", "png");
const screenshotDownload = await storage.get(
"module-screenshot-download",
"true"
);
const screenshotCopy = await storage.get("module-screenshot-copy", "true");
moduleSettings.value = {
loopVideo: loopVideo === "true",
screenshotVideo: screenshotVideo === "true",
screenshotFormat,
screenshotDownload: screenshotDownload === "true",
screenshotCopy: screenshotCopy === "true"
};
}
function openSaveChannelDialog(data) {
saveChannelDialogData.value = { ...data, isOpen: true };
}
function closeSaveChannelDialog() {
saveChannelDialogData.value = null;
}
function openDeleteChannelDialog(channelId) {
deleteChannelDialogData.value = { channelId, isOpen: true };
}
function closeDeleteChannelDialog() {
deleteChannelDialogData.value = null;
}
function openClearAllDialog() {
clearAllDialogOpen.value = true;
}
function closeClearAllDialog() {
clearAllDialogOpen.value = false;
}
function openDetailChannelDialog(channel) {
detailChannelDialogData.value = { channel, isOpen: true };
}
function closeDetailChannelDialog() {
detailChannelDialogData.value = null;
}
function openSubtitleDialog(data) {
subtitleDialogData.value = { ...data, isOpen: true };
}
function closeSubtitleDialog() {
subtitleDialogData.value = null;
}
const index = Object.freeze( Object.defineProperty({
__proto__: null,
activeTab,
clearAllDialogOpen,
closeClearAllDialog,
closeDeleteChannelDialog,
closeDetailChannelDialog,
closeSaveChannelDialog,
closeSubtitleDialog,
currentTheme,
deleteChannelDialogData,
detailChannelDialogData,
isPanelVisible,
loadSettings,
moduleSettings,
openClearAllDialog,
openDeleteChannelDialog,
openDetailChannelDialog,
openSaveChannelDialog,
openSubtitleDialog,
panelWidth,
saveChannelDialogData,
setActiveTab,
subtitleDialogData,
togglePanel
}, Symbol.toStringTag, { value: "Module" }));
var defaultAttributes = {
outline: {
xmlns: "http://www.w3.org/2000/svg",
width: 24,
height: 24,
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
"stroke-width": 2,
"stroke-linecap": "round",
"stroke-linejoin": "round"
},
filled: {
xmlns: "http://www.w3.org/2000/svg",
width: 24,
height: 24,
viewBox: "0 0 24 24",
fill: "currentColor",
stroke: "none"
}
};
const createPreactComponent = (type, iconName, iconNamePascal, iconNode) => {
const Component2 = ({
color = "currentColor",
size = 24,
stroke = 2,
title,
children,
className = "",
class: classes = "",
style,
...rest
}) => preact.h(
"svg",
{
...defaultAttributes[type],
width: String(size),
height: String(size),
class: [`tabler-icon`, `tabler-icon-${iconName}`, classes, className].join(" "),
...type === "filled" ? {
fill: color
} : {
"stroke-width": stroke,
stroke: color
},
style,
...rest
},
[
title && preact.h("title", {}, title),
...iconNode.map(([tag, attrs]) => preact.h(tag, attrs)),
...preact.toChildArray(children)
]
);
Component2.displayName = `${iconNamePascal}`;
return Component2;
};
var IconAccessPoint = createPreactComponent("outline", "access-point", "AccessPoint", [["path", { "d": "M12 12l0 .01", "key": "svg-0" }], ["path", { "d": "M14.828 9.172a4 4 0 0 1 0 5.656", "key": "svg-1" }], ["path", { "d": "M17.657 6.343a8 8 0 0 1 0 11.314", "key": "svg-2" }], ["path", { "d": "M9.168 14.828a4 4 0 0 1 0 -5.656", "key": "svg-3" }], ["path", { "d": "M6.337 17.657a8 8 0 0 1 0 -11.314", "key": "svg-4" }]]);
var IconBabyCarriage = createPreactComponent("outline", "baby-carriage", "BabyCarriage", [["path", { "d": "M8 19m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0", "key": "svg-0" }], ["path", { "d": "M18 19m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0", "key": "svg-1" }], ["path", { "d": "M2 5h2.5l1.632 4.897a6 6 0 0 0 5.693 4.103h2.675a5.5 5.5 0 0 0 0 -11h-.5v6", "key": "svg-2" }], ["path", { "d": "M6 9h14", "key": "svg-3" }], ["path", { "d": "M9 17l1 -3", "key": "svg-4" }], ["path", { "d": "M16 14l1 3", "key": "svg-5" }]]);
var IconBadgeCc = createPreactComponent("outline", "badge-cc", "BadgeCc", [["path", { "d": "M3 5m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z", "key": "svg-0" }], ["path", { "d": "M10 10.5a1.5 1.5 0 0 0 -3 0v3a1.5 1.5 0 0 0 3 0", "key": "svg-1" }], ["path", { "d": "M17 10.5a1.5 1.5 0 0 0 -3 0v3a1.5 1.5 0 0 0 3 0", "key": "svg-2" }]]);
var IconBookmark = createPreactComponent("outline", "bookmark", "Bookmark", [["path", { "d": "M18 7v14l-6 -4l-6 4v-14a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4z", "key": "svg-0" }]]);
var IconBrandGithub = createPreactComponent("outline", "brand-github", "BrandGithub", [["path", { "d": "M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5", "key": "svg-0" }]]);
var IconBuildingBank = createPreactComponent("outline", "building-bank", "BuildingBank", [["path", { "d": "M3 21l18 0", "key": "svg-0" }], ["path", { "d": "M3 10l18 0", "key": "svg-1" }], ["path", { "d": "M5 6l7 -3l7 3", "key": "svg-2" }], ["path", { "d": "M4 10l0 11", "key": "svg-3" }], ["path", { "d": "M20 10l0 11", "key": "svg-4" }], ["path", { "d": "M8 14l0 3", "key": "svg-5" }], ["path", { "d": "M12 14l0 3", "key": "svg-6" }], ["path", { "d": "M16 14l0 3", "key": "svg-7" }]]);
var IconCategory = createPreactComponent("outline", "category", "Category", [["path", { "d": "M4 4h6v6h-6z", "key": "svg-0" }], ["path", { "d": "M14 4h6v6h-6z", "key": "svg-1" }], ["path", { "d": "M4 14h6v6h-6z", "key": "svg-2" }], ["path", { "d": "M17 17m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0", "key": "svg-3" }]]);
var IconCheck = createPreactComponent("outline", "check", "Check", [["path", { "d": "M5 12l5 5l10 -10", "key": "svg-0" }]]);
var IconChevronLeft = createPreactComponent("outline", "chevron-left", "ChevronLeft", [["path", { "d": "M15 6l-6 6l6 6", "key": "svg-0" }]]);
var IconChevronRight = createPreactComponent("outline", "chevron-right", "ChevronRight", [["path", { "d": "M9 6l6 6l-6 6", "key": "svg-0" }]]);
var IconCircleCheck = createPreactComponent("outline", "circle-check", "CircleCheck", [["path", { "d": "M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0", "key": "svg-0" }], ["path", { "d": "M9 12l2 2l4 -4", "key": "svg-1" }]]);
var IconCircleX = createPreactComponent("outline", "circle-x", "CircleX", [["path", { "d": "M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0", "key": "svg-0" }], ["path", { "d": "M10 10l4 4m0 -4l-4 4", "key": "svg-1" }]]);
var IconClock = createPreactComponent("outline", "clock", "Clock", [["path", { "d": "M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0", "key": "svg-0" }], ["path", { "d": "M12 7v5l3 3", "key": "svg-1" }]]);
var IconCopy = createPreactComponent("outline", "copy", "Copy", [["path", { "d": "M7 7m0 2.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667z", "key": "svg-0" }], ["path", { "d": "M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1", "key": "svg-1" }]]);
var IconCurrencyDollar = createPreactComponent("outline", "currency-dollar", "CurrencyDollar", [["path", { "d": "M16.7 8a3 3 0 0 0 -2.7 -2h-4a3 3 0 0 0 0 6h4a3 3 0 0 1 0 6h-4a3 3 0 0 1 -2.7 -2", "key": "svg-0" }], ["path", { "d": "M12 3v3m0 12v3", "key": "svg-1" }]]);
var IconDatabaseOff = createPreactComponent("outline", "database-off", "DatabaseOff", [["path", { "d": "M12.983 8.978c3.955 -.182 7.017 -1.446 7.017 -2.978c0 -1.657 -3.582 -3 -8 -3c-1.661 0 -3.204 .19 -4.483 .515m-2.783 1.228c-.471 .382 -.734 .808 -.734 1.257c0 1.22 1.944 2.271 4.734 2.74", "key": "svg-0" }], ["path", { "d": "M4 6v6c0 1.657 3.582 3 8 3c.986 0 1.93 -.067 2.802 -.19m3.187 -.82c1.251 -.53 2.011 -1.228 2.011 -1.99v-6", "key": "svg-1" }], ["path", { "d": "M4 12v6c0 1.657 3.582 3 8 3c3.217 0 5.991 -.712 7.261 -1.74m.739 -3.26v-4", "key": "svg-2" }], ["path", { "d": "M3 3l18 18", "key": "svg-3" }]]);
var IconDeviceFloppy = createPreactComponent("outline", "device-floppy", "DeviceFloppy", [["path", { "d": "M6 4h10l4 4v10a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2", "key": "svg-0" }], ["path", { "d": "M12 14m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0", "key": "svg-1" }], ["path", { "d": "M14 4l0 4l-6 0l0 -4", "key": "svg-2" }]]);
var IconDeviceMobile = createPreactComponent("outline", "device-mobile", "DeviceMobile", [["path", { "d": "M6 5a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2v-14z", "key": "svg-0" }], ["path", { "d": "M11 4h2", "key": "svg-1" }], ["path", { "d": "M12 17v.01", "key": "svg-2" }]]);
var IconDownload = createPreactComponent("outline", "download", "Download", [["path", { "d": "M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2", "key": "svg-0" }], ["path", { "d": "M7 11l5 5l5 -5", "key": "svg-1" }], ["path", { "d": "M12 4l0 12", "key": "svg-2" }]]);
var IconEye = createPreactComponent("outline", "eye", "Eye", [["path", { "d": "M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0", "key": "svg-0" }], ["path", { "d": "M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6", "key": "svg-1" }]]);
var IconFileExport = createPreactComponent("outline", "file-export", "FileExport", [["path", { "d": "M14 3v4a1 1 0 0 0 1 1h4", "key": "svg-0" }], ["path", { "d": "M11.5 21h-4.5a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v5m-5 6h7m-3 -3l3 3l-3 3", "key": "svg-1" }]]);
var IconFileImport = createPreactComponent("outline", "file-import", "FileImport", [["path", { "d": "M14 3v4a1 1 0 0 0 1 1h4", "key": "svg-0" }], ["path", { "d": "M5 13v-8a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2h-5.5m-9.5 -2h7m-3 -3l3 3l-3 3", "key": "svg-1" }]]);
var IconInfoCircle = createPreactComponent("outline", "info-circle", "InfoCircle", [["path", { "d": "M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0", "key": "svg-0" }], ["path", { "d": "M12 9h.01", "key": "svg-1" }], ["path", { "d": "M11 12h1v4h1", "key": "svg-2" }]]);
var IconMessage = createPreactComponent("outline", "message", "Message", [["path", { "d": "M8 9h8", "key": "svg-0" }], ["path", { "d": "M8 13h6", "key": "svg-1" }], ["path", { "d": "M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12z", "key": "svg-2" }]]);
var IconMovie = createPreactComponent("outline", "movie", "Movie", [["path", { "d": "M4 4m0 2a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2z", "key": "svg-0" }], ["path", { "d": "M8 4l0 16", "key": "svg-1" }], ["path", { "d": "M16 4l0 16", "key": "svg-2" }], ["path", { "d": "M4 8l4 0", "key": "svg-3" }], ["path", { "d": "M4 16l4 0", "key": "svg-4" }], ["path", { "d": "M4 12l16 0", "key": "svg-5" }], ["path", { "d": "M16 8l4 0", "key": "svg-6" }], ["path", { "d": "M16 16l4 0", "key": "svg-7" }]]);
var IconMusic = createPreactComponent("outline", "music", "Music", [["path", { "d": "M3 17a3 3 0 1 0 6 0a3 3 0 0 0 -6 0", "key": "svg-0" }], ["path", { "d": "M13 17a3 3 0 1 0 6 0a3 3 0 0 0 -6 0", "key": "svg-1" }], ["path", { "d": "M9 17v-13h10v13", "key": "svg-2" }], ["path", { "d": "M9 8h10", "key": "svg-3" }]]);
var IconRefresh = createPreactComponent("outline", "refresh", "Refresh", [["path", { "d": "M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4", "key": "svg-0" }], ["path", { "d": "M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4", "key": "svg-1" }]]);
var IconSettings = createPreactComponent("outline", "settings", "Settings", [["path", { "d": "M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065z", "key": "svg-0" }], ["path", { "d": "M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0", "key": "svg-1" }]]);
var IconThumbDown = createPreactComponent("outline", "thumb-down", "ThumbDown", [["path", { "d": "M7 13v-8a1 1 0 0 0 -1 -1h-2a1 1 0 0 0 -1 1v7a1 1 0 0 0 1 1h3a4 4 0 0 1 4 4v1a2 2 0 0 0 4 0v-5h3a2 2 0 0 0 2 -2l-1 -5a2 3 0 0 0 -2 -2h-7a3 3 0 0 0 -3 3", "key": "svg-0" }]]);
var IconThumbUp = createPreactComponent("outline", "thumb-up", "ThumbUp", [["path", { "d": "M7 11v8a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-7a1 1 0 0 1 1 -1h3a4 4 0 0 0 4 -4v-1a2 2 0 0 1 4 0v5h3a2 2 0 0 1 2 2l-1 5a2 3 0 0 1 -2 2h-7a3 3 0 0 1 -3 -3", "key": "svg-0" }]]);
var IconTrash = createPreactComponent("outline", "trash", "Trash", [["path", { "d": "M4 7l16 0", "key": "svg-0" }], ["path", { "d": "M10 11l0 6", "key": "svg-1" }], ["path", { "d": "M14 11l0 6", "key": "svg-2" }], ["path", { "d": "M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12", "key": "svg-3" }], ["path", { "d": "M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3", "key": "svg-4" }]]);
var IconTrendingDown = createPreactComponent("outline", "trending-down", "TrendingDown", [["path", { "d": "M3 7l6 6l4 -4l8 8", "key": "svg-0" }], ["path", { "d": "M21 10l0 7l-7 0", "key": "svg-1" }]]);
var IconTrendingUp = createPreactComponent("outline", "trending-up", "TrendingUp", [["path", { "d": "M3 17l6 -6l4 4l8 -8", "key": "svg-0" }], ["path", { "d": "M14 7l7 0l0 7", "key": "svg-1" }]]);
var IconUsers = createPreactComponent("outline", "users", "Users", [["path", { "d": "M9 7m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0", "key": "svg-0" }], ["path", { "d": "M3 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2", "key": "svg-1" }], ["path", { "d": "M16 3.13a4 4 0 0 1 0 7.75", "key": "svg-2" }], ["path", { "d": "M21 21v-2a4 4 0 0 0 -3 -3.85", "key": "svg-3" }]]);
var IconVideo = createPreactComponent("outline", "video", "Video", [["path", { "d": "M15 10l4.553 -2.276a1 1 0 0 1 1.447 .894v6.764a1 1 0 0 1 -1.447 .894l-4.553 -2.276v-4z", "key": "svg-0" }], ["path", { "d": "M3 6m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z", "key": "svg-1" }]]);
var IconWorld = createPreactComponent("outline", "world", "World", [["path", { "d": "M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0", "key": "svg-0" }], ["path", { "d": "M3.6 9h16.8", "key": "svg-1" }], ["path", { "d": "M3.6 15h16.8", "key": "svg-2" }], ["path", { "d": "M11.5 3a17 17 0 0 0 0 18", "key": "svg-3" }], ["path", { "d": "M12.5 3a17 17 0 0 1 0 18", "key": "svg-4" }]]);
var IconX = createPreactComponent("outline", "x", "X", [["path", { "d": "M18 6l-12 12", "key": "svg-0" }], ["path", { "d": "M6 6l12 12", "key": "svg-1" }]]);
var IconBrandYoutubeFilled = createPreactComponent("filled", "brand-youtube-filled", "BrandYoutubeFilled", [["path", { "d": "M18 3a5 5 0 0 1 5 5v8a5 5 0 0 1 -5 5h-12a5 5 0 0 1 -5 -5v-8a5 5 0 0 1 5 -5zm-9 6v6a1 1 0 0 0 1.514 .857l5 -3a1 1 0 0 0 0 -1.714l-5 -3a1 1 0 0 0 -1.514 .857z", "key": "svg-0" }]]);
function FloatingButton() {
return u(
"button",
{
onClick: togglePanel,
className: "btn btn-lg btn-square btn-secondary rounded-l-full rounded-r-none",
style: {
position: "absolute",
top: "50%",
left: "-30px",
transform: "translateY(-50%)",
zIndex: 10
},
children: isPanelVisible.value ? u(IconChevronRight, { size: 20 }) : u(IconChevronLeft, { size: 20 })
}
);
}
const INNERTUBE_API_KEY = "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8";
const INNERTUBE_CLIENT_NAME = "WEB";
const INNERTUBE_CLIENT_VERSION = "2.20201209.01.00";
const BASE_URL = "https://www.youtube.com";
const I_END_POINT = "/youtubei/v1";
const TAB_TYPE_PARAMS = {
videos: "EgZ2aWRlb3PyBgQKAjoA",
shorts: "EgZzaG9ydHPyBgUKA5oBAA%3D%3D",
live: "EgdzdHJlYW1z8gYECgJ6AA%3D%3D"
};
class YouTubeService {
channelId = null;
channelHandle = null;
isVideoPage() {
const path = window.location.pathname;
return path.startsWith("/watch") || path.startsWith("/shorts/");
}
getVideoIdFromURL() {
const path = window.location.pathname;
const search = window.location.search;
if (path.startsWith("/watch")) {
const params = new URLSearchParams(search);
const videoId = params.get("v");
return videoId !== null ? videoId : null;
}
if (path.startsWith("/shorts/")) {
const match = path.match(/\/shorts\/([^\/\?]+)/);
return match && match[1] ? match[1] : null;
}
return null;
}
async getChannelId() {
if (this.channelId) return this.channelId;
try {
const channelIdMatch = window.location.pathname.match(
/\/channel\/(UC[^\/]+)/
);
if (channelIdMatch && channelIdMatch[1]) {
this.channelId = channelIdMatch[1];
await this.scrapeChannelHandle();
return this.channelId;
}
const handle = this.getChannelHandleFromURL();
if (!handle) return null;
this.channelHandle = handle;
const youtubeUrl = `https://www.youtube.com/@${handle}`;
const response = await fetch(youtubeUrl);
if (!response.ok) return null;
const html = await response.text();
let match = html.match(
/<meta\s+itemprop="identifier"\s+content="(UC[^"]+)"/
);
if (match && match[1]) {
this.channelId = match[1];
return this.channelId;
}
match = html.match(
/<link\s+rel="canonical"\s+href="https:\/\/www\.youtube\.com\/channel\/(UC[^"]+)"/
);
if (match && match[1]) {
this.channelId = match[1];
return this.channelId;
}
match = html.match(
/https:\/\/www\.youtube\.com\/feeds\/videos\.xml\?channel_id=(UC[^"&]+)/
);
if (match && match[1]) {
this.channelId = match[1];
return this.channelId;
}
match = html.match(/["']browseId["']\s*:\s*["'](UC[^"']+)["']/);
if (match && match[1]) {
this.channelId = match[1];
return this.channelId;
}
} catch (error) {
console.error("[TubeInsights] Error getting channel ID:", error);
}
return null;
}
async scrapeChannelHandle() {
try {
const html = document.documentElement.innerHTML;
let match = html.match(
/["']vanityChannelUrl["']\s*:\s*["']http[s]?:\/\/www\.youtube\.com\/@([^"']+)["']/
);
if (match && match[1]) {
this.channelHandle = match[1];
return;
}
match = html.match(
/<link\s+rel="canonical"\s+href="https:\/\/www\.youtube\.com\/@([^"\/]+)"/
);
if (match && match[1]) {
this.channelHandle = match[1];
return;
}
this.channelHandle = this.channelId;
} catch (error) {
console.error("[TubeInsights] Error scraping handle:", error);
this.channelHandle = this.channelId;
}
}
getChannelHandleFromURL() {
const handleMatch = window.location.pathname.match(/^\/@([^\/]+)/);
if (handleMatch && handleMatch[1]) {
return handleMatch[1];
}
return null;
}
getChannelHandle() {
return this.channelHandle;
}
clearCache() {
this.channelId = null;
this.channelHandle = null;
}
async fetchTabCount(tabType, onProgress) {
const channelId = await this.getChannelId();
if (!channelId) return 0;
let totalCount = 0;
let continuation = void 0;
let pageCount = 0;
const maxPages = 100;
try {
do {
const params = TAB_TYPE_PARAMS[tabType];
const response = await this.innerTubeRequest("/browse", {
browseId: channelId,
params,
continuation
});
const items = this.parseTabData(tabType, response);
const videoIds = this.parseVideoIds(items, tabType);
totalCount += videoIds.length;
continuation = this.getContinuation(response, tabType);
pageCount++;
if (onProgress) {
onProgress(totalCount, !!continuation);
}
if (!continuation || pageCount >= maxPages) break;
await new Promise((resolve) => setTimeout(resolve, 100));
} while (continuation);
return totalCount;
} catch (error) {
console.error("[TubeInsights] Error fetching tab count:", error);
return totalCount > 0 ? totalCount : 0;
}
}
async innerTubeRequest(endpoint, data) {
const url = `${BASE_URL}${I_END_POINT}${endpoint}?key=${INNERTUBE_API_KEY}&prettyPrint=false`;
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-YouTube-Client-Name": "1",
"X-YouTube-Client-Version": INNERTUBE_CLIENT_VERSION
},
body: JSON.stringify({
context: {
client: {
clientName: INNERTUBE_CLIENT_NAME,
clientVersion: INNERTUBE_CLIENT_VERSION,
hl: "en",
gl: "US"
}
},
...data
})
});
return await response.json();
}
getContinuation(data, tabType) {
if (tabType === "shorts") {
const tab2 = data.contents?.twoColumnBrowseResultsRenderer?.tabs?.find(
(t) => {
return t.tabRenderer?.endpoint?.browseEndpoint?.params === TAB_TYPE_PARAMS[tabType];
}
);
const contents = tab2?.tabRenderer?.content?.richGridRenderer?.contents || [];
const continuationItem = contents.find(
(c) => c.continuationItemRenderer
);
if (continuationItem) {
return continuationItem.continuationItemRenderer?.continuationEndpoint?.continuationCommand?.token;
}
const continuationItems = data.onResponseReceivedActions?.[0]?.appendContinuationItemsAction?.continuationItems || data.onResponseReceivedEndpoints?.[0]?.appendContinuationItemsAction?.continuationItems || [];
const contItem = continuationItems.find(
(c) => c.continuationItemRenderer
);
if (contItem) {
return contItem.continuationItemRenderer?.continuationEndpoint?.continuationCommand?.token;
}
return void 0;
}
const tab = data.contents?.twoColumnBrowseResultsRenderer?.tabs?.find(
(t) => {
return t.tabRenderer?.endpoint?.browseEndpoint?.params === TAB_TYPE_PARAMS[tabType];
}
);
const items = tab?.tabRenderer?.content?.richGridRenderer?.contents || data.onResponseReceivedActions?.[0]?.appendContinuationItemsAction?.continuationItems || data.onResponseReceivedEndpoints?.[0]?.appendContinuationItemsAction?.continuationItems || [];
const continuation = items[items.length - 1];
const renderer = continuation?.continuationItemRenderer;
if (!renderer) return void 0;
return renderer?.continuationEndpoint?.continuationCommand?.token;
}
parseTabData(tabType, data) {
const tab = data.contents?.twoColumnBrowseResultsRenderer?.tabs?.find(
(t) => {
return t.tabRenderer?.endpoint?.browseEndpoint?.params === TAB_TYPE_PARAMS[tabType];
}
);
if (tabType === "shorts" && tab?.tabRenderer?.content?.richGridRenderer) {
const contents = tab.tabRenderer.content.richGridRenderer.contents || [];
return contents.map((c) => c.richItemRenderer?.content || c).filter((c) => c.shortsLockupViewModel || c.reelItemRenderer);
}
if (tabType === "shorts" && (data.onResponseReceivedActions || data.onResponseReceivedEndpoints)) {
const continuationItems = data.onResponseReceivedActions?.[0]?.appendContinuationItemsAction?.continuationItems || data.onResponseReceivedEndpoints?.[0]?.appendContinuationItemsAction?.continuationItems || [];
return continuationItems.map((c) => c.richItemRenderer?.content || c).filter((c) => c.shortsLockupViewModel || c.reelItemRenderer);
}
return tab?.tabRenderer?.content?.richGridRenderer?.contents?.map(
(c) => c.richItemRenderer?.content || c
) || data.onResponseReceivedActions?.[0]?.appendContinuationItemsAction?.continuationItems?.map(
(c) => c.richItemRenderer?.content || c
) || data.onResponseReceivedEndpoints?.[0]?.appendContinuationItemsAction?.continuationItems || [];
}
parseVideoIds(items, tabType) {
if (tabType === "shorts") {
return items.filter((item) => item.shortsLockupViewModel || item.reelItemRenderer).map((item) => {
const lockup = item.shortsLockupViewModel;
if (lockup) {
return lockup.onTap?.innertubeCommand?.reelWatchEndpoint?.videoId;
}
const renderer = item.reelItemRenderer;
return renderer.videoId;
}).filter((id) => id);
}
return items.filter((item) => item.videoRenderer).map((item) => item.videoRenderer.videoId).filter((id) => id);
}
}
function CountryFlag({ countryCode, size = "md" }) {
const sizeMap = {
sm: 24,
md: 32,
lg: 40,
xl: 48
};
const flagSize = sizeMap[size];
const flagUrl = `https://cdn.jsdelivr.net/gh/lipis/[email protected]/flags/4x3/${countryCode.toLowerCase()}.svg`;
return u(
"img",
{
src: flagUrl,
alt: `${countryCode} flag`,
width: flagSize,
height: flagSize * 0.75,
style: { display: "inline-block", verticalAlign: "middle" }
}
);
}
const countryNames = {
AF: "Afghanistan",
AL: "Albania",
DZ: "Algeria",
AS: "American Samoa",
AD: "Andorra",
AO: "Angola",
AI: "Anguilla",
AQ: "Antarctica",
AG: "Antigua and Barbuda",
AR: "Argentina",
AM: "Armenia",
AW: "Aruba",
AU: "Australia",
AT: "Austria",
AZ: "Azerbaijan",
BS: "Bahamas",
BH: "Bahrain",
BD: "Bangladesh",
BB: "Barbados",
BY: "Belarus",
BE: "Belgium",
BZ: "Belize",
BJ: "Benin",
BM: "Bermuda",
BT: "Bhutan",
BO: "Bolivia",
BQ: "Bonaire, Sint Eustatius and Saba",
BA: "Bosnia and Herzegovina",
BW: "Botswana",
BV: "Bouvet Island",
BR: "Brazil",
IO: "British Indian Ocean Territory",
BN: "Brunei Darussalam",
BG: "Bulgaria",
BF: "Burkina Faso",
BI: "Burundi",
CV: "Cabo Verde",
KH: "Cambodia",
CM: "Cameroon",
CA: "Canada",
KY: "Cayman Islands",
CF: "Central African Republic",
TD: "Chad",
CL: "Chile",
CN: "China",
CX: "Christmas Island",
CC: "Cocos Islands",
CO: "Colombia",
KM: "Comoros",
CG: "Congo",
CD: "Congo, Democratic Republic of the",
CK: "Cook Islands",
CR: "Costa Rica",
HR: "Croatia",
CU: "Cuba",
CW: "Curaçao",
CY: "Cyprus",
CZ: "Czechia",
DK: "Denmark",
DJ: "Djibouti",
DM: "Dominica",
DO: "Dominican Republic",
EC: "Ecuador",
EG: "Egypt",
SV: "El Salvador",
GQ: "Equatorial Guinea",
ER: "Eritrea",
EE: "Estonia",
SZ: "Eswatini",
ET: "Ethiopia",
FK: "Falkland Islands",
FO: "Faroe Islands",
FJ: "Fiji",
FI: "Finland",
FR: "France",
GF: "French Guiana",
PF: "French Polynesia",
TF: "French Southern Territories",
GA: "Gabon",
GM: "Gambia",
GE: "Georgia",
DE: "Germany",
GH: "Ghana",
GI: "Gibraltar",
GR: "Greece",
GL: "Greenland",
GD: "Grenada",
GP: "Guadeloupe",
GU: "Guam",
GT: "Guatemala",
GG: "Guernsey",
GN: "Guinea",
GW: "Guinea-Bissau",
GY: "Guyana",
HT: "Haiti",
HM: "Heard Island and McDonald Islands",
VA: "Holy See",
HN: "Honduras",
HK: "Hong Kong",
HU: "Hungary",
IS: "Iceland",
IN: "India",
ID: "Indonesia",
IR: "Iran",
IQ: "Iraq",
IE: "Ireland",
IM: "Isle of Man",
IL: "Israel",
IT: "Italy",
JM: "Jamaica",
JP: "Japan",
JE: "Jersey",
JO: "Jordan",
KZ: "Kazakhstan",
KE: "Kenya",
KI: "Kiribati",
KP: "North Korea",
KR: "South Korea",
KW: "Kuwait",
KG: "Kyrgyzstan",
LA: "Lao People's Democratic Republic",
LV: "Latvia",
LB: "Lebanon",
LS: "Lesotho",
LR: "Liberia",
LY: "Libya",
LI: "Liechtenstein",
LT: "Lithuania",
LU: "Luxembourg",
MO: "Macao",
MG: "Madagascar",
MW: "Malawi",
MY: "Malaysia",
MV: "Maldives",
ML: "Mali",
MT: "Malta",
MH: "Marshall Islands",
MQ: "Martinique",
MR: "Mauritania",
MU: "Mauritius",
YT: "Mayotte",
MX: "Mexico",
FM: "Micronesia",
MD: "Moldova",
MC: "Monaco",
MN: "Mongolia",
ME: "Montenegro",
MS: "Montserrat",
MA: "Morocco",
MZ: "Mozambique",
MM: "Myanmar",
NA: "Namibia",
NR: "Nauru",
NP: "Nepal",
NL: "Netherlands",
NC: "New Caledonia",
NZ: "New Zealand",
NI: "Nicaragua",
NE: "Niger",
NG: "Nigeria",
NU: "Niue",
NF: "Norfolk Island",
MK: "North Macedonia",
MP: "Northern Mariana Islands",
NO: "Norway",
OM: "Oman",
PK: "Pakistan",
PW: "Palau",
PS: "Palestine, State of",
PA: "Panama",
PG: "Papua New Guinea",
PY: "Paraguay",
PE: "Peru",
PH: "Philippines",
PN: "Pitcairn",
PL: "Poland",
PT: "Portugal",
PR: "Puerto Rico",
QA: "Qatar",
RO: "Romania",
RU: "Russian Federation",
RW: "Rwanda",
RE: "Réunion",
BL: "Saint Barthélemy",
SH: "Saint Helena, Ascension and Tristan da Cunha",
KN: "Saint Kitts and Nevis",
LC: "Saint Lucia",
MF: "Saint Martin",
PM: "Saint Pierre and Miquelon",
VC: "Saint Vincent and the Grenadines",
WS: "Samoa",
SM: "San Marino",
ST: "Sao Tome and Principe",
SA: "Saudi Arabia",
SN: "Senegal",
RS: "Serbia",
SC: "Seychelles",
SL: "Sierra Leone",
SG: "Singapore",
SX: "Sint Maarten",
SK: "Slovakia",
SI: "Slovenia",
SB: "Solomon Islands",
SO: "Somalia",
ZA: "South Africa",
GS: "South Georgia and the South Sandwich Islands",
SS: "South Sudan",
ES: "Spain",
LK: "Sri Lanka",
SD: "Sudan",
SR: "Suriname",
SJ: "Svalbard and Jan Mayen",
SE: "Sweden",
CH: "Switzerland",
SY: "Syrian Arab Republic",
TW: "Taiwan",
TJ: "Tajikistan",
TZ: "Tanzania",
TH: "Thailand",
TL: "Timor-Leste",
TG: "Togo",
TK: "Tokelau",
TO: "Tonga",
TT: "Trinidad and Tobago",
TN: "Tunisia",
TR: "Turkey",
TM: "Turkmenistan",
TC: "Turks and Caicos Islands",
TV: "Tuvalu",
UG: "Uganda",
UA: "Ukraine",
AE: "United Arab Emirates",
GB: "United Kingdom",
US: "United States",
UM: "United States Minor Outlying Islands",
UY: "Uruguay",
UZ: "Uzbekistan",
VU: "Vanuatu",
VE: "Venezuela",
VN: "Viet Nam",
VG: "Virgin Islands",
VI: "Virgin Islands",
WF: "Wallis and Futuna",
EH: "Western Sahara",
YE: "Yemen",
ZM: "Zambia",
ZW: "Zimbabwe"
};
const formatNumber = (num) => {
if (num >= 1e9) return `${(num / 1e9).toFixed(2)}B`;
if (num >= 1e6) return `${(num / 1e6).toFixed(2)}M`;
if (num >= 1e3) return `${(num / 1e3).toFixed(2)}K`;
return num.toString();
};
let audioContext = null;
const getAudioContext = () => {
if (!audioContext) {
audioContext = new (window.AudioContext || window.webkitAudioContext)();
}
return audioContext;
};
const playMonetizedSound = () => {
try {
const ctx = getAudioContext();
const osc1 = ctx.createOscillator();
const gain1 = ctx.createGain();
osc1.connect(gain1);
gain1.connect(ctx.destination);
osc1.frequency.setValueAtTime(523, ctx.currentTime);
gain1.gain.setValueAtTime(0.2, ctx.currentTime);
gain1.gain.exponentialRampToValueAtTime(0.01, ctx.currentTime + 0.15);
osc1.start(ctx.currentTime);
osc1.stop(ctx.currentTime + 0.15);
const osc2 = ctx.createOscillator();
const gain2 = ctx.createGain();
osc2.connect(gain2);
gain2.connect(ctx.destination);
osc2.frequency.setValueAtTime(659, ctx.currentTime + 0.1);
gain2.gain.setValueAtTime(0.2, ctx.currentTime + 0.1);
gain2.gain.exponentialRampToValueAtTime(0.01, ctx.currentTime + 0.25);
osc2.start(ctx.currentTime + 0.1);
osc2.stop(ctx.currentTime + 0.25);
const osc3 = ctx.createOscillator();
const gain3 = ctx.createGain();
osc3.connect(gain3);
gain3.connect(ctx.destination);
osc3.frequency.setValueAtTime(784, ctx.currentTime + 0.2);
gain3.gain.setValueAtTime(0.25, ctx.currentTime + 0.2);
gain3.gain.exponentialRampToValueAtTime(0.01, ctx.currentTime + 0.4);
osc3.start(ctx.currentTime + 0.2);
osc3.stop(ctx.currentTime + 0.4);
} catch (error) {
console.error("Error playing monetized sound:", error);
}
};
const playNotMonetizedSound = () => {
try {
const ctx = getAudioContext();
const oscillator = ctx.createOscillator();
const gainNode = ctx.createGain();
oscillator.connect(gainNode);
gainNode.connect(ctx.destination);
oscillator.frequency.setValueAtTime(600, ctx.currentTime);
oscillator.frequency.exponentialRampToValueAtTime(
300,
ctx.currentTime + 0.3
);
gainNode.gain.setValueAtTime(0.25, ctx.currentTime);
gainNode.gain.exponentialRampToValueAtTime(0.01, ctx.currentTime + 0.3);
oscillator.start(ctx.currentTime);
oscillator.stop(ctx.currentTime + 0.3);
} catch (error) {
console.error("Error playing not monetized sound:", error);
}
};
const playErrorSound = () => {
try {
const ctx = getAudioContext();
const osc1 = ctx.createOscillator();
const gain1 = ctx.createGain();
osc1.connect(gain1);
gain1.connect(ctx.destination);
osc1.type = "square";
osc1.frequency.setValueAtTime(400, ctx.currentTime);
gain1.gain.setValueAtTime(0.3, ctx.currentTime);
gain1.gain.exponentialRampToValueAtTime(0.01, ctx.currentTime + 0.1);
osc1.start(ctx.currentTime);
osc1.stop(ctx.currentTime + 0.1);
const osc2 = ctx.createOscillator();
const gain2 = ctx.createGain();
osc2.connect(gain2);
gain2.connect(ctx.destination);
osc2.type = "square";
osc2.frequency.setValueAtTime(300, ctx.currentTime + 0.12);
gain2.gain.setValueAtTime(0.3, ctx.currentTime + 0.12);
gain2.gain.exponentialRampToValueAtTime(0.01, ctx.currentTime + 0.22);
osc2.start(ctx.currentTime + 0.12);
osc2.stop(ctx.currentTime + 0.22);
} catch (error) {
console.error("Error playing error sound:", error);
}
};
function getDefaultExportFromCjs(x) {
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
}
var relativeTime$2 = { exports: {} };
var relativeTime$1 = relativeTime$2.exports;
var hasRequiredRelativeTime;
function requireRelativeTime() {
if (hasRequiredRelativeTime) return relativeTime$2.exports;
hasRequiredRelativeTime = 1;
(function(module, exports$1) {
!(function(r, e) {
module.exports = e();
})(relativeTime$1, (function() {
return function(r, e, t) {
r = r || {};
var n = e.prototype, o = { future: "in %s", past: "%s ago", s: "a few seconds", m: "a minute", mm: "%d minutes", h: "an hour", hh: "%d hours", d: "a day", dd: "%d days", M: "a month", MM: "%d months", y: "a year", yy: "%d years" };
function i(r2, e2, t2, o2) {
return n.fromToBase(r2, e2, t2, o2);
}
t.en.relativeTime = o, n.fromToBase = function(e2, n2, i2, d2, u2) {
for (var f2, a, s, l = i2.$locale().relativeTime || o, h2 = r.thresholds || [{ l: "s", r: 44, d: "second" }, { l: "m", r: 89 }, { l: "mm", r: 44, d: "minute" }, { l: "h", r: 89 }, { l: "hh", r: 21, d: "hour" }, { l: "d", r: 35 }, { l: "dd", r: 25, d: "day" }, { l: "M", r: 45 }, { l: "MM", r: 10, d: "month" }, { l: "y", r: 17 }, { l: "yy", d: "year" }], m = h2.length, c = 0; c < m; c += 1) {
var y = h2[c];
y.d && (f2 = d2 ? t(e2).diff(i2, y.d, true) : i2.diff(e2, y.d, true));
var p = (r.rounding || Math.round)(Math.abs(f2));
if (s = f2 > 0, p <= y.r || !y.r) {
p <= 1 && c > 0 && (y = h2[c - 1]);
var v = l[y.l];
u2 && (p = u2("" + p)), a = "string" == typeof v ? v.replace("%d", p) : v(p, n2, y.l, s);
break;
}
}
if (n2) return a;
var M = s ? l.future : l.past;
return "function" == typeof M ? M(a) : M.replace("%s", a);
}, n.to = function(r2, e2) {
return i(r2, e2, this, true);
}, n.from = function(r2, e2) {
return i(r2, e2, this);
};
var d = function(r2) {
return r2.$u ? t.utc() : t();
};
n.toNow = function(r2) {
return this.to(d(this), r2);
}, n.fromNow = function(r2) {
return this.from(d(this), r2);
};
};
}));
})(relativeTime$2);
return relativeTime$2.exports;
}
var relativeTimeExports = requireRelativeTime();
const relativeTime = getDefaultExportFromCjs(relativeTimeExports);
dayjs.extend(relativeTime);
const CATEGORY_MAP = {
"1": "Film & Animation",
"2": "Autos & Vehicles",
"10": "Music",
"15": "Pets & Animals",
"17": "Sports",
"18": "Short Movies",
"19": "Travel & Events",
"20": "Gaming",
"21": "Videoblogging",
"22": "People & Blogs",
"23": "Comedy",
"24": "Entertainment",
"25": "News & Politics",
"26": "Howto & Style",
"27": "Education",
"28": "Science & Technology",
"29": "Nonprofits & Activism",
"30": "Movies",
"31": "Anime/Animation",
"32": "Action/Adventure",
"33": "Classics",
"34": "Comedy",
"35": "Documentary",
"36": "Drama",
"37": "Family",
"38": "Foreign",
"39": "Horror",
"40": "Sci-Fi/Fantasy",
"41": "Thriller",
"42": "Shorts",
"43": "Shows",
"44": "Trailers"
};
function InsightsTab() {
const [channelId, setChannelId] = hooks.useState(null);
const [channelHandle, setChannelHandle] = hooks.useState(null);
const [channelInfo, setChannelInfo] = hooks.useState(null);
const [videoId, setVideoId] = hooks.useState(null);
const [videoInfo, setVideoInfo] = hooks.useState(null);
const [dislikes, setDislikes] = hooks.useState(0);
const [monetization, setMonetization] = hooks.useState(null);
const [loading, setLoading] = hooks.useState(false);
const [tabs, setTabs] = hooks.useState([
{ type: "videos", label: "Videos", count: 0, isLoading: false },
{ type: "shorts", label: "Shorts", count: 0, isLoading: false },
{ type: "live", label: "Live", count: 0, isLoading: false }
]);
const [youtubeService2] = hooks.useState(() => new YouTubeService());
const lastMonetizationCheckRef = hooks.useRef(null);
const [copiedKeywords, setCopiedKeywords] = hooks.useState(false);
const [copiedTopics, setCopiedTopics] = hooks.useState(false);
const [copiedDescription, setCopiedDescription] = hooks.useState(false);
const isChannelPage = () => {
const path = window.location.pathname;
return path.startsWith("/@") || path.startsWith("/channel/");
};
const isVideoPage = () => {
return youtubeService2.isVideoPage();
};
const calculateAge = (publishedAt) => {
const now = dayjs();
const published = dayjs(publishedAt);
const years = now.diff(published, "year");
const months = now.diff(published, "month") % 12;
const days = now.diff(published, "day") % 30;
const parts = [];
if (years > 0) parts.push(`${years} yr`);
if (months > 0) parts.push(`${months} mo`);
if (days > 0 && years === 0) parts.push(`${days} d`);
return parts.join(" ") || "0 d";
};
const formatDuration = (duration) => {
if (duration === "P0D" || duration === "PT0S") {
return "0:00";
}
const match = duration.match(/PT(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?/);
if (!match) return duration;
const hours = match[1] ? parseInt(match[1]) : 0;
const minutes = match[2] ? parseInt(match[2]) : 0;
const seconds = match[3] ? parseInt(match[3]) : 0;
if (hours === 0 && minutes === 0 && seconds === 0) {
return "0:00";
}
const parts = [];
if (hours > 0)
parts.push(`${hours}:${minutes.toString().padStart(2, "0")}`);
else parts.push(minutes.toString());
parts.push(seconds.toString().padStart(2, "0"));
return parts.join(":");
};
const linkifyText = hooks.useMemo(() => {
const urlRegex = /(https?:\/\/[^\s]+)/g;
return (text) => {
const parts = text.split(urlRegex);
return parts.map((part, index2) => {
if (part.match(urlRegex)) {
return u(
"a",
{
href: part,
target: "_blank",
rel: "noopener noreferrer",
className: "text-primary hover:underline break-all",
children: part
},
index2
);
}
return part;
});
};
}, []);
const checkMonetizationAsync = async (urlOrId) => {
if (lastMonetizationCheckRef.current === urlOrId) {
return;
}
lastMonetizationCheckRef.current = urlOrId;
try {
const url = urlOrId.startsWith("http") ? urlOrId : `https://www.youtube.com/channel/${urlOrId}`;
const monetizationResponse = await fetch(
`https://tubeinsights.exyezed.cc/api/monetization?url=${encodeURIComponent(
url
)}`
);
if (monetizationResponse.ok) {
const monetizationData = await monetizationResponse.json();
const isMonetized = monetizationData.monetization || false;
setMonetization(isMonetized);
if (isMonetized) {
playMonetizedSound();
} else {
playNotMonetizedSound();
}
} else {
setMonetization(null);
}
} catch (err) {
console.error("Failed to check monetization:", err);
setMonetization(null);
lastMonetizationCheckRef.current = null;
}
};
const fetchChannelData = async (id) => {
setLoading(true);
setMonetization(null);
try {
const response = await fetch(
`https://tubeinsights.exyezed.cc/api/channels/${id}`
);
if (!response.ok) throw new Error("Failed to fetch channel info");
const data = await response.json();
if (data && data.items && data.items.length > 0) {
const item = data.items[0];
const snippet = item.snippet;
const brandingSettings = item.brandingSettings;
const statistics = item.statistics;
const bannerUrl = brandingSettings?.image?.bannerExternalUrl;
const info = {
channelId: item.id,
title: snippet.title,
description: snippet.description,
publishedAt: snippet.publishedAt,
thumbnails: snippet.thumbnails,
customUrl: snippet.customUrl,
country: snippet.country,
keywords: brandingSettings?.channel?.keywords?.split(" ") || [],
bannerExternalUrl: bannerUrl ? `${bannerUrl}=s1600` : void 0,
viewCount: statistics.viewCount,
subscriberCount: statistics.subscriberCount,
videoCount: statistics.videoCount,
topicDetails: item.topicDetails
};
setChannelInfo(info);
setLoading(false);
checkMonetizationAsync(item.id);
}
} catch (err) {
console.error("Failed to fetch channel info:", err);
setLoading(false);
}
};
const fetchVideoData = async (id) => {
setLoading(true);
setMonetization(null);
setDislikes(0);
try {
const response = await fetch(
`https://tubeinsights.exyezed.cc/api/videos/${id}`
);
if (!response.ok) throw new Error("Failed to fetch video info");
const data = await response.json();
if (data && data.items && data.items.length > 0) {
const item = data.items[0];
const snippet = item.snippet;
const contentDetails = item.contentDetails;
const statistics = item.statistics;
const status = item.status;
let channelCountry;
try {
const channelResponse = await fetch(
`https://tubeinsights.exyezed.cc/api/channels/${snippet.channelId}`
);
if (channelResponse.ok) {
const channelData = await channelResponse.json();
if (channelData && channelData.items && channelData.items.length > 0) {
channelCountry = channelData.items[0].snippet.country;
}
}
} catch {
}
const info = {
videoId: item.id,
title: snippet.title,
description: snippet.description,
publishedAt: snippet.publishedAt,
thumbnails: snippet.thumbnails,
channelTitle: snippet.channelTitle,
channelId: snippet.channelId,
categoryId: snippet.categoryId,
duration: contentDetails.duration,
viewCount: statistics.viewCount || "0",
likeCount: statistics.likeCount || "0",
commentCount: statistics.commentCount || "0",
madeForKids: status.madeForKids || false,
tags: snippet.tags || [],
isLive: snippet.liveBroadcastContent === "live",
channelCountry
};
setVideoInfo(info);
setLoading(false);
try {
const dislikeResponse = await fetch(
`https://returnyoutubedislikeapi.com/votes?videoId=${id}`
);
if (dislikeResponse.ok) {
const dislikeData = await dislikeResponse.json();
setDislikes(dislikeData.dislikes || 0);
}
} catch {
setDislikes(0);
}
const videoUrl = `https://www.youtube.com/watch?v=${item.id}`;
checkMonetizationAsync(videoUrl);
}
} catch (err) {
console.error("Failed to fetch video info:", err);
setLoading(false);
}
};
const loadChannelInfo = async () => {
if (activeTab.value !== "insights") {
return;
}
if (isVideoPage()) {
const vId = youtubeService2.getVideoIdFromURL();
if (vId !== videoId) {
setVideoId(vId);
setChannelId(null);
setChannelHandle(null);
setChannelInfo(null);
setVideoInfo(null);
setMonetization(null);
lastMonetizationCheckRef.current = null;
if (vId && isPanelVisible.value) {
await fetchVideoData(vId);
}
}
return;
}
if (!isChannelPage()) {
setChannelId(null);
setChannelHandle(null);
setChannelInfo(null);
setVideoId(null);
setVideoInfo(null);
setMonetization(null);
lastMonetizationCheckRef.current = null;
return;
}
const id = await youtubeService2.getChannelId();
const handle = youtubeService2.getChannelHandle();
if (id !== channelId) {
setChannelId(id);
setChannelHandle(handle);
setVideoId(null);
setVideoInfo(null);
setMonetization(null);
lastMonetizationCheckRef.current = null;
setTabs([
{ type: "videos", label: "Videos", count: 0, isLoading: false },
{ type: "shorts", label: "Shorts", count: 0, isLoading: false },
{ type: "live", label: "Live", count: 0, isLoading: false }
]);
if (id && isPanelVisible.value) {
await fetchChannelData(id);
}
}
};
const loadTabCounts = async () => {
if (!channelId) return;
setTabs((prev) => prev.map((t) => ({ ...t, isLoading: true })));
await Promise.all(
tabs.map(async (tab) => {
const count = await youtubeService2.fetchTabCount(
tab.type,
(currentCount, hasMore) => {
setTabs(
(prev) => prev.map(
(t) => t.type === tab.type ? { ...t, count: currentCount, isLoading: hasMore } : t
)
);
}
);
setTabs(
(prev) => prev.map(
(t) => t.type === tab.type ? { ...t, count, isLoading: false } : t
)
);
})
);
};
hooks.useEffect(() => {
if (activeTab.value !== "insights") {
return;
}
loadChannelInfo();
const checkUrlChange = () => {
const currentHandle = youtubeService2.getChannelHandleFromURL();
const currentVideoId = youtubeService2.getVideoIdFromURL();
if (currentHandle !== channelHandle || currentVideoId !== videoId) {
youtubeService2.clearCache();
loadChannelInfo();
}
};
const intervalId = setInterval(checkUrlChange, 1e3);
return () => clearInterval(intervalId);
}, [channelHandle, videoId, activeTab.value]);
hooks.useEffect(() => {
if (channelId && activeTab.value === "insights") {
const hasLoadedCounts = tabs.some((tab) => tab.count > 0);
if (!hasLoadedCounts) {
loadTabCounts();
}
}
}, [channelId, activeTab.value]);
hooks.useEffect(() => {
if (activeTab.value === "insights" && isPanelVisible.value && !loading) {
if (channelId && !channelInfo) {
fetchChannelData(channelId);
}
if (videoId && !videoInfo) {
fetchVideoData(videoId);
}
}
}, [
activeTab.value,
isPanelVisible.value,
channelId,
videoId,
channelInfo,
videoInfo
]);
if (!isChannelPage() && !isVideoPage()) {
return u("div", { className: "text-center py-8", children: u("p", { className: "text-xl opacity-60", children: "Navigate to a YouTube channel or video page to see insights" }) });
}
if (loading && !channelInfo && !videoInfo) {
return u("div", { className: "text-center py-8", children: u("span", { className: "loading loading-spinner loading-lg" }) });
}
return u("div", { className: "space-y-4", children: [
videoInfo && u(preact.Fragment, { children: [
youtubeService2.isVideoPage() && window.location.pathname.startsWith("/shorts/") ? u("div", { className: "grid grid-cols-2 gap-2", children: ["oardefault", "oar1", "oar2", "oar3"].map((quality) => u(
"a",
{
href: `https://i.ytimg.com/vi/${videoInfo.videoId}/${quality}.jpg`,
target: "_blank",
rel: "noopener noreferrer",
className: "rounded-lg overflow-hidden hover:opacity-80 transition-opacity",
style: { aspectRatio: "9/16" },
children: u(
"img",
{
src: `https://i.ytimg.com/vi/${videoInfo.videoId}/${quality}.jpg`,
alt: `${videoInfo.title} - ${quality}`,
className: "w-full h-full object-cover"
}
)
},
quality
)) }) : u(
"a",
{
href: `https://i.ytimg.com/vi/${videoInfo.videoId}/maxresdefault.jpg`,
target: "_blank",
rel: "noopener noreferrer",
className: "block aspect-video rounded-lg overflow-hidden hover:opacity-80 transition-opacity cursor-pointer",
children: u(
"img",
{
src: videoInfo.thumbnails?.high?.url || videoInfo.thumbnails?.medium?.url,
alt: videoInfo.title,
className: "w-full h-full object-cover"
}
)
}
),
u("div", { children: [
u("h2", { className: "text-xl font-semibold mb-2", children: videoInfo.title }),
u("div", { className: "text-xl opacity-60", children: [
"Title Length: ",
videoInfo.title.length,
" characters"
] })
] }),
u("div", { children: [
u("div", { className: "flex items-center justify-between gap-2", children: [
u(
"a",
{
href: `https://www.youtube.com/channel/${videoInfo.channelId}`,
target: "_blank",
rel: "noopener noreferrer",
className: "text-primary text-xl hover:underline font-semibold",
children: videoInfo.channelTitle
}
),
u(
"a",
{
href: `https://tubeinsights.exyezed.cc/info/direct/${window.location.pathname.startsWith("/shorts/") ? "shorts" : "video"}/${videoInfo.videoId}`,
target: "_blank",
rel: "noopener noreferrer",
className: "btn btn-secondary btn-square",
children: u(IconInfoCircle, { className: "size-[1.8em]" })
}
)
] }),
u(
"a",
{
href: `https://www.youtube.com/watch?v=${videoInfo.videoId}`,
target: "_blank",
rel: "noopener noreferrer",
className: "text-xl text-secondary font-mono hover:underline block",
children: videoInfo.videoId
}
)
] }),
videoInfo.channelCountry && u("div", { className: "bg-base-200 rounded-lg p-4", children: [
u("div", { className: "text-xl opacity-60 mb-2", children: "Country" }),
u("div", { className: "flex items-center gap-3", children: [
u(CountryFlag, { countryCode: videoInfo.channelCountry, size: "md" }),
u("span", { className: "text-xl", children: countryNames[videoInfo.channelCountry] || videoInfo.channelCountry })
] })
] }),
u("div", { className: "space-y-4", children: [
u("div", { className: "bg-base-200 rounded-lg p-4", children: u("div", { className: "flex items-center justify-between", children: [
u("div", { className: "flex items-center gap-3", children: [
u(IconEye, { className: "w-8 h-8 text-primary" }),
u("div", { className: "text-xl opacity-60", children: "Views" })
] }),
u("div", { className: "text-right", children: [
u("div", { className: "text-2xl font-semibold text-primary", children: formatNumber(parseInt(videoInfo.viewCount)) }),
u("div", { className: "text-xl opacity-60", children: parseInt(videoInfo.viewCount).toLocaleString() })
] })
] }) }),
u("div", { className: "bg-base-200 rounded-lg p-4", children: u("div", { className: "flex items-center justify-between", children: [
u("div", { className: "flex items-center gap-3", children: [
u(IconThumbUp, { className: "w-8 h-8 text-success" }),
u("div", { className: "text-xl opacity-60", children: "Likes" })
] }),
u("div", { className: "text-right", children: [
u("div", { className: "text-2xl font-semibold text-success", children: formatNumber(parseInt(videoInfo.likeCount)) }),
u("div", { className: "text-xl opacity-60", children: parseInt(videoInfo.likeCount).toLocaleString() })
] })
] }) }),
u("div", { className: "bg-base-200 rounded-lg p-4", children: u("div", { className: "flex items-center justify-between", children: [
u("div", { className: "flex items-center gap-3", children: [
u(IconThumbDown, { className: "w-8 h-8 text-error" }),
u("div", { className: "text-xl opacity-60", children: "Dislikes" })
] }),
u("div", { className: "text-right", children: [
u("div", { className: "text-2xl font-semibold text-error", children: formatNumber(dislikes) }),
u("div", { className: "text-xl opacity-60", children: dislikes.toLocaleString() })
] })
] }) }),
u("div", { className: "bg-base-200 rounded-lg p-4", children: u("div", { className: "flex items-center justify-between", children: [
u("div", { className: "flex items-center gap-3", children: [
u(IconMessage, { className: "w-8 h-8 text-info" }),
u("div", { className: "text-xl opacity-60", children: "Comments" })
] }),
u("div", { className: "text-right", children: [
u("div", { className: "text-2xl font-semibold text-info", children: formatNumber(parseInt(videoInfo.commentCount)) }),
u("div", { className: "text-xl opacity-60", children: parseInt(videoInfo.commentCount).toLocaleString() })
] })
] }) })
] }),
u("div", { className: "space-y-4", children: [
u("div", { className: "bg-base-200 rounded-lg p-4", children: [
u("div", { className: "flex items-center gap-3 mb-2", children: [
u(IconClock, { className: "w-8 h-8 text-secondary" }),
u("div", { className: "text-xl opacity-60", children: "Duration" })
] }),
u("div", { className: "text-2xl font-semibold text-secondary mb-2", children: formatDuration(videoInfo.duration) }),
u("div", { className: "text-xl opacity-60", children: [
"Uploaded",
" ",
dayjs(videoInfo.publishedAt).format("MMM D, YYYY • HH:mm:ss")
] }),
u("div", { className: "text-xl text-secondary", children: [
calculateAge(videoInfo.publishedAt),
" ago"
] })
] }),
u("div", { className: "bg-base-200 rounded-lg p-4", children: [
u("div", { className: "flex items-center gap-3 mb-2", children: [
u(IconCategory, { className: "w-8 h-8 text-accent" }),
u("div", { className: "text-xl opacity-60", children: "Category" })
] }),
u("div", { className: "text-2xl text-accent", children: CATEGORY_MAP[videoInfo.categoryId] || "Unknown" })
] }),
u("div", { className: "bg-base-200 rounded-lg p-4", children: u("div", { className: "flex items-center justify-between", children: [
u("div", { className: "flex items-center gap-3", children: [
u(
IconBabyCarriage,
{
className: `w-8 h-8 ${videoInfo.madeForKids ? "text-success" : "text-error"}`
}
),
u("div", { className: "text-xl opacity-60", children: "Made for Kids" })
] }),
u("div", { className: "text-right", children: videoInfo.madeForKids ? u("div", { className: "flex items-center gap-2", children: [
u(IconCircleCheck, { className: "w-6 h-6 text-success" }),
u("span", { className: "text-success font-semibold text-xl", children: "Yes" })
] }) : u("div", { className: "flex items-center gap-2", children: [
u(IconCircleX, { className: "w-6 h-6 text-error" }),
u("span", { className: "text-error font-semibold text-xl", children: "No" })
] }) })
] }) }),
u("div", { className: "bg-base-200 rounded-lg p-4", children: u("div", { className: "flex items-center justify-between", children: [
u("div", { className: "flex items-center gap-3", children: [
u(
IconCurrencyDollar,
{
className: `w-8 h-8 ${monetization === null ? "text-base-content opacity-60" : monetization ? "text-success" : "text-error"}`
}
),
u("div", { className: "text-xl opacity-60", children: "Monetization" })
] }),
u("div", { className: "text-right", children: monetization === null ? u("span", { className: "loading loading-spinner loading-sm" }) : monetization ? u("div", { className: "flex items-center gap-2", children: [
u(IconCircleCheck, { className: "w-6 h-6 text-success" }),
u("span", { className: "text-success font-semibold text-xl", children: "Enabled" })
] }) : u("div", { className: "flex items-center gap-2", children: [
u(IconCircleX, { className: "w-6 h-6 text-error" }),
u("span", { className: "text-error font-semibold text-xl", children: "Disabled" })
] }) })
] }) })
] }),
videoInfo.tags && videoInfo.tags.length > 0 && u("div", { className: "collapse collapse-arrow bg-base-200", children: [
u("input", { type: "checkbox" }),
u("div", { className: "collapse-title text-xl", children: "Keywords" }),
u("div", { className: "collapse-content", children: u("div", { className: "flex items-start justify-between mb-3", children: [
u("div", { className: "flex flex-wrap gap-2 flex-1", children: videoInfo.tags.map((tag, idx) => u(
"span",
{
className: "badge badge-primary badge-soft badge-xl",
children: tag
},
idx
)) }),
u(
"button",
{
onClick: () => {
navigator.clipboard.writeText(videoInfo.tags.join(", "));
setCopiedKeywords(true);
setTimeout(() => setCopiedKeywords(false), 500);
},
className: "btn btn-square ml-3 shrink-0",
children: copiedKeywords ? u(IconCircleCheck, { className: "size-[1.8em] text-success" }) : u(IconCopy, { className: "size-[1.8em]" })
}
)
] }) })
] }),
videoInfo.description && u("div", { className: "collapse collapse-arrow bg-base-200", children: [
u("input", { type: "checkbox" }),
u("div", { className: "collapse-title text-xl", children: "Description" }),
u("div", { className: "collapse-content", children: u("div", { className: "flex items-start justify-between gap-3 mb-3", children: [
u("p", { className: "text-xl whitespace-pre-wrap opacity-80 flex-1", children: linkifyText(videoInfo.description) }),
u(
"button",
{
onClick: () => {
navigator.clipboard.writeText(videoInfo.description);
setCopiedDescription(true);
setTimeout(() => setCopiedDescription(false), 500);
},
className: "btn btn-square shrink-0",
children: copiedDescription ? u(IconCircleCheck, { className: "size-[1.8em] text-success" }) : u(IconCopy, { className: "size-[1.8em]" })
}
)
] }) })
] })
] }),
channelInfo && u(preact.Fragment, { children: [
channelInfo.bannerExternalUrl && u(
"a",
{
href: channelInfo.bannerExternalUrl.replace(/=s\d+$/, "=s0"),
target: "_blank",
rel: "noopener noreferrer",
className: "block h-32 overflow-hidden rounded-lg hover:opacity-80 transition-opacity cursor-pointer",
children: u(
"img",
{
src: channelInfo.bannerExternalUrl,
alt: "Channel Banner",
className: "w-full h-full object-cover"
}
)
}
),
u("div", { className: "flex items-center gap-4", children: [
channelInfo.thumbnails?.high?.url && u(
"a",
{
href: channelInfo.thumbnails.high.url.replace(/=s\d+/, "=s0"),
target: "_blank",
rel: "noopener noreferrer",
className: "avatar hover:opacity-80 transition-opacity cursor-pointer",
children: u("div", { className: "w-16 rounded-full", children: u(
"img",
{
src: channelInfo.thumbnails.high.url,
alt: channelInfo.title
}
) })
}
),
u("div", { className: "flex-1", children: [
u("div", { className: "flex items-center justify-between gap-2", children: [
u("h2", { className: "text-xl font-semibold", children: channelInfo.title }),
u("div", { className: "flex gap-2 shrink-0", children: [
u(
"button",
{
className: "btn btn-accent btn-square",
onClick: () => {
openSaveChannelDialog({
channelId: channelInfo.channelId,
title: channelInfo.title,
customUrl: channelInfo.customUrl,
thumbnailUrl: channelInfo.thumbnails?.high?.url || "",
country: channelInfo.country,
subscriberCount: channelInfo.subscriberCount,
videoCount: channelInfo.videoCount,
viewCount: channelInfo.viewCount
});
},
children: u(IconDeviceFloppy, { className: "size-[1.8em]" })
}
),
u(
"a",
{
href: `https://tubeinsights.exyezed.cc/info/direct/channel/${channelInfo.channelId}`,
target: "_blank",
rel: "noopener noreferrer",
className: "btn btn-secondary btn-square",
children: u(IconInfoCircle, { className: "size-[1.8em]" })
}
)
] })
] }),
channelInfo.customUrl && u(
"a",
{
href: `https://www.youtube.com/${channelInfo.customUrl}`,
target: "_blank",
rel: "noopener noreferrer",
className: "text-primary text-xl hover:underline",
children: channelInfo.customUrl
}
),
u(
"a",
{
href: `https://www.youtube.com/channel/${channelInfo.channelId}`,
target: "_blank",
rel: "noopener noreferrer",
className: "text-xl text-secondary font-mono hover:underline block",
children: channelInfo.channelId
}
)
] })
] }),
u("div", { className: "space-y-4", children: [
u("div", { className: "bg-base-200 rounded-lg p-4", children: [
u("div", { className: "text-xl opacity-60 mb-2", children: "Country" }),
u("div", { className: "flex items-center gap-3", children: [
channelInfo.country && u(CountryFlag, { countryCode: channelInfo.country, size: "md" }),
u("span", { className: "text-xl", children: channelInfo.country ? countryNames[channelInfo.country] || channelInfo.country : "-" })
] })
] }),
u("div", { className: "bg-base-200 rounded-lg p-4", children: [
u("div", { className: "text-xl opacity-60 mb-2", children: "Created" }),
u("div", { className: "text-xl", children: [
u("span", { className: "text-primary", children: dayjs(channelInfo.publishedAt).format(
"MMM D, YYYY • HH:mm:ss"
) }),
u("span", { className: "text-secondary ml-2", children: [
"(",
calculateAge(channelInfo.publishedAt),
" ago)"
] })
] })
] }),
u("div", { className: "bg-base-200 rounded-lg p-4", children: u("div", { className: "flex items-center justify-between", children: [
u("div", { className: "flex items-center gap-3", children: [
u(
IconCurrencyDollar,
{
className: `w-8 h-8 ${monetization === null ? "text-base-content opacity-60" : monetization ? "text-success" : "text-error"}`
}
),
u("div", { className: "text-xl opacity-60", children: "Monetization" })
] }),
u("div", { className: "text-right", children: monetization === null ? u("span", { className: "loading loading-spinner loading-sm" }) : monetization ? u("div", { className: "flex items-center gap-2", children: [
u(IconCircleCheck, { className: "w-6 h-6 text-success" }),
u("span", { className: "text-success font-semibold text-xl", children: "Enabled" })
] }) : u("div", { className: "flex items-center gap-2", children: [
u(IconCircleX, { className: "w-6 h-6 text-error" }),
u("span", { className: "text-error font-semibold text-xl", children: "Disabled" })
] }) })
] }) })
] }),
u("div", { className: "space-y-4", children: [
u("div", { className: "bg-base-200 rounded-lg p-4", children: u("div", { className: "flex items-center justify-between", children: [
u("div", { className: "flex items-center gap-3", children: [
u(IconUsers, { className: "w-8 h-8 text-primary" }),
u("div", { className: "text-xl opacity-60", children: "Subscribers" })
] }),
u("div", { className: "text-right", children: [
u("div", { className: "text-2xl font-semibold text-primary", children: formatNumber(parseInt(channelInfo.subscriberCount)) }),
u("div", { className: "text-xl opacity-60", children: parseInt(channelInfo.subscriberCount).toLocaleString() })
] })
] }) }),
u("div", { className: "bg-base-200 rounded-lg p-4", children: u("div", { className: "flex items-center justify-between", children: [
u("div", { className: "flex items-center gap-3", children: [
u(IconVideo, { className: "w-8 h-8 text-secondary" }),
u("div", { className: "text-xl opacity-60", children: "Total Videos" })
] }),
u("div", { className: "text-right", children: [
u("div", { className: "text-2xl font-semibold text-secondary", children: formatNumber(parseInt(channelInfo.videoCount)) }),
u("div", { className: "text-xl opacity-60", children: parseInt(channelInfo.videoCount).toLocaleString() })
] })
] }) }),
u("div", { className: "bg-base-200 rounded-lg p-4", children: u("div", { className: "flex items-center justify-between", children: [
u("div", { className: "flex items-center gap-3", children: [
u(IconEye, { className: "w-8 h-8 text-accent" }),
u("div", { className: "text-xl opacity-60", children: "Total Views" })
] }),
u("div", { className: "text-right", children: [
u("div", { className: "text-2xl font-semibold text-accent", children: formatNumber(parseInt(channelInfo.viewCount)) }),
u("div", { className: "text-xl opacity-60", children: parseInt(channelInfo.viewCount).toLocaleString() })
] })
] }) })
] }),
channelInfo.keywords && channelInfo.keywords.length > 0 && u("div", { className: "collapse collapse-arrow bg-base-200", children: [
u("input", { type: "checkbox" }),
u("div", { className: "collapse-title text-xl", children: "Keywords" }),
u("div", { className: "collapse-content", children: u("div", { className: "flex items-start justify-between mb-3", children: [
u("div", { className: "flex flex-wrap gap-2 flex-1", children: channelInfo.keywords.map((keyword, idx) => u(
"span",
{
className: "badge badge-primary badge-soft badge-xl",
children: keyword
},
idx
)) }),
u(
"button",
{
onClick: () => {
navigator.clipboard.writeText(
channelInfo.keywords.join(", ")
);
setCopiedKeywords(true);
setTimeout(() => setCopiedKeywords(false), 500);
},
className: "btn btn-square ml-3 shrink-0",
children: copiedKeywords ? u(IconCircleCheck, { className: "size-[1.8em] text-success" }) : u(IconCopy, { className: "size-[1.8em]" })
}
)
] }) })
] }),
channelInfo.topicDetails?.topicCategories && channelInfo.topicDetails.topicCategories.length > 0 && u("div", { className: "collapse collapse-arrow bg-base-200", children: [
u("input", { type: "checkbox" }),
u("div", { className: "collapse-title text-xl", children: "Topics" }),
u("div", { className: "collapse-content", children: u("div", { className: "flex items-start justify-between mb-3", children: [
u("div", { className: "flex flex-wrap gap-2 flex-1", children: channelInfo.topicDetails.topicCategories.map(
(topic, idx) => u(
"span",
{
className: "badge badge-secondary badge-soft badge-xl",
children: topic.replace(
"https://en.wikipedia.org/wiki/",
""
)
},
idx
)
) }),
u(
"button",
{
onClick: () => {
navigator.clipboard.writeText(
channelInfo.topicDetails.topicCategories.map(
(t) => t.replace("https://en.wikipedia.org/wiki/", "")
).join(", ")
);
setCopiedTopics(true);
setTimeout(() => setCopiedTopics(false), 500);
},
className: "btn btn-square ml-3 shrink-0",
children: copiedTopics ? u(IconCircleCheck, { className: "size-[1.8em] text-success" }) : u(IconCopy, { className: "size-[1.8em]" })
}
)
] }) })
] }),
channelInfo.description && u("div", { className: "collapse collapse-arrow bg-base-200", children: [
u("input", { type: "checkbox" }),
u("div", { className: "collapse-title text-xl", children: "Description" }),
u("div", { className: "collapse-content", children: u("div", { className: "flex items-start justify-between gap-3 mb-3", children: [
u("p", { className: "text-xl whitespace-pre-wrap opacity-80 flex-1", children: linkifyText(channelInfo.description) }),
u(
"button",
{
onClick: () => {
navigator.clipboard.writeText(channelInfo.description);
setCopiedDescription(true);
setTimeout(() => setCopiedDescription(false), 500);
},
className: "btn btn-square shrink-0",
children: copiedDescription ? u(IconCircleCheck, { className: "size-[1.8em] text-success" }) : u(IconCopy, { className: "size-[1.8em]" })
}
)
] }) })
] })
] }),
channelInfo && !videoInfo && u(preact.Fragment, { children: [
u("div", { className: "space-y-3", children: [
u("h3", { className: "text-xl font-semibold", children: "Video Counts" }),
tabs.map((tab) => {
const getIcon = () => {
switch (tab.type) {
case "videos":
return IconMovie;
case "shorts":
return IconDeviceMobile;
case "live":
return IconAccessPoint;
default:
return IconVideo;
}
};
const Icon = getIcon();
return u("div", { className: "bg-base-200 rounded-lg p-4", children: [
u("div", { className: "flex items-center justify-between", children: [
u("div", { className: "flex items-center gap-3", children: [
u(
"a",
{
href: `https://tubeinsights.exyezed.cc/direct/${tab.type}/${channelId}`,
target: "_blank",
rel: "noopener noreferrer",
className: "btn btn-primary btn-square",
children: u(Icon, { className: "size-[1.8em]" })
}
),
u("span", { className: "text-xl", children: tab.label })
] }),
u("div", { className: "text-right", children: u("span", { className: "text-xl font-semibold", children: tab.count.toLocaleString() }) })
] }),
tab.isLoading && u("div", { className: "mt-2", children: u("progress", { className: "progress progress-primary w-full h-1" }) })
] }, tab.type);
})
] }),
u("div", { className: "bg-primary text-primary-content rounded-lg p-4", children: u("div", { className: "flex items-center justify-between", children: [
u("span", { className: "text-xl", children: "Total Videos" }),
u("span", { className: "text-xl font-semibold", children: tabs.reduce((sum, tab) => sum + tab.count, 0).toLocaleString() })
] }) })
] })
] });
}
const LIVECOUNTS_API_URL = "https://api.livecounts.io/youtube-live-subscriber-counter/stats/";
const LIVECOUNTS_VIDEO_API_URL = "https://api.livecounts.io/youtube-live-view-counter/stats/";
const BACKEND_API_URL = "https://tubeinsights.exyezed.cc/api/channels/";
const BACKEND_VIDEO_API_URL = "https://tubeinsights.exyezed.cc/api/videos/";
const DISLIKE_API_URL = "https://returnyoutubedislikeapi.com/votes";
async function fetchDislikes(videoId) {
try {
const response = await fetch(`${DISLIKE_API_URL}?videoId=${videoId}`);
if (!response.ok) {
return 0;
}
const data = await response.json();
return data.dislikes || 0;
} catch {
return 0;
}
}
async function fetchInitialStats(channelId) {
try {
const response = await fetch(`${BACKEND_API_URL}${channelId}/live-stats`);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const data = await response.json();
if (!data || !data.status) {
return null;
}
return {
liveSubscriber: data.liveSubscriber,
liveViews: data.liveViews,
liveVideos: data.liveVideos
};
} catch (error) {
console.error("Failed to fetch initial stats:", error);
return null;
}
}
async function fetchRealtimeStats(channelId) {
return new Promise((resolve) => {
GM_xmlhttpRequest({
method: "GET",
url: `${LIVECOUNTS_API_URL}${channelId}`,
headers: {
Origin: "https://livecounts.io",
Referer: "https://livecounts.io/"
},
onload: function(response) {
if (response.status === 200) {
try {
const data = JSON.parse(response.responseText);
if (!data || typeof data.followerCount === "undefined" || !data.bottomOdos) {
resolve(null);
return;
}
resolve({
liveSubscriber: data.followerCount,
liveViews: data.bottomOdos[0],
liveVideos: data.bottomOdos[1]
});
} catch (error) {
resolve(null);
}
} else {
resolve(null);
}
},
onerror: function() {
resolve(null);
}
});
});
}
async function fetchInitialVideoStats(videoId) {
try {
const response = await fetch(
`${BACKEND_VIDEO_API_URL}${videoId}/live-stats`
);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const data = await response.json();
if (!data || !data.status) {
return null;
}
const dislikeCount = await fetchDislikes(videoId);
return {
liveViews: data.liveViews,
liveLikes: data.liveLikes,
liveComments: data.liveComments,
liveViewer: data.liveViewer || 0,
dislikes: dislikeCount
};
} catch (error) {
console.error("[TubeInsights] Failed to fetch initial video stats:", error);
return null;
}
}
async function fetchRealtimeVideoStats(videoId) {
return new Promise((resolve) => {
GM_xmlhttpRequest({
method: "GET",
url: `${LIVECOUNTS_VIDEO_API_URL}${videoId}`,
headers: {
Origin: "https://livecounts.io",
Referer: "https://livecounts.io/"
},
onload: async function(response) {
if (response.status === 200) {
try {
const data = JSON.parse(
response.responseText
);
if (!data || !data.success || typeof data.followerCount === "undefined") {
resolve(null);
return;
}
const dislikeCount = await fetchDislikes(videoId);
resolve({
liveViews: data.followerCount,
liveLikes: data.bottomOdos && data.bottomOdos[0] || 0,
liveComments: data.bottomOdos && data.bottomOdos[2] || 0,
liveViewer: data.viewerCount || 0,
dislikes: dislikeCount
});
} catch (error) {
console.error(
"[TubeInsights] Video LiveCounts parse error:",
error
);
resolve(null);
}
} else {
resolve(null);
}
},
onerror: function() {
resolve(null);
}
});
});
}
dayjs.extend(relativeTime);
function LiveCountTab() {
const [channelId, setChannelId] = hooks.useState(null);
const [channelInfo, setChannelInfo] = hooks.useState(null);
const [liveStats, setLiveStats] = hooks.useState(null);
const [videoId, setVideoId] = hooks.useState(null);
const [videoInfo, setVideoInfo] = hooks.useState(null);
const [videoLiveStats, setVideoLiveStats] = hooks.useState(
null
);
const [monetization, setMonetization] = hooks.useState(null);
const [loading, setLoading] = hooks.useState(false);
const [diffs, setDiffs] = hooks.useState({});
const [videoDiffs, setVideoDiffs] = hooks.useState({});
const [realtimeStatus, setRealtimeStatus] = hooks.useState("loading");
const [, setChartData] = hooks.useState({
subscribers: [],
views: [],
videos: [],
timestamps: []
});
const [, setVideoChartData] = hooks.useState({
views: [],
likes: [],
dislikes: [],
comments: [],
viewers: [],
timestamps: []
});
const intervalRef = hooks.useRef(null);
const prevStatsRef = hooks.useRef(null);
const prevVideoStatsRef = hooks.useRef(null);
const lastMonetizationCheckRef = hooks.useRef(null);
const errorCountRef = hooks.useRef(0);
const isFetchingRef = hooks.useRef(false);
const calculateAge = (publishedAt) => {
const now = dayjs();
const published = dayjs(publishedAt);
const years = now.diff(published, "year");
const months = now.diff(published, "month") % 12;
const days = now.diff(published, "day") % 30;
const parts = [];
if (years > 0) parts.push(`${years} yr`);
if (months > 0) parts.push(`${months} mo`);
if (days > 0 && years === 0) parts.push(`${days} d`);
return parts.join(" ") || "0 d";
};
const isVideoPage = () => {
const path = window.location.pathname;
return path.startsWith("/watch") || path.startsWith("/shorts/");
};
const getVideoIdFromURL = () => {
const path = window.location.pathname;
const search = window.location.search;
if (path.startsWith("/watch")) {
const params = new URLSearchParams(search);
const videoId2 = params.get("v");
return videoId2 !== null ? videoId2 : null;
}
if (path.startsWith("/shorts/")) {
const match = path.match(/\/shorts\/([^\/\?]+)/);
return match && match[1] ? match[1] : null;
}
return null;
};
const checkMonetizationAsync = async (urlOrId) => {
if (lastMonetizationCheckRef.current === urlOrId) {
return;
}
lastMonetizationCheckRef.current = urlOrId;
try {
const url = urlOrId.startsWith("http") ? urlOrId : `https://www.youtube.com/channel/${urlOrId}`;
const monetizationResponse = await fetch(
`https://tubeinsights.exyezed.cc/api/monetization?url=${encodeURIComponent(
url
)}`
);
if (monetizationResponse.ok) {
const monetizationData = await monetizationResponse.json();
const isMonetized = monetizationData.monetization || false;
setMonetization(isMonetized);
if (isMonetized) {
playMonetizedSound();
} else {
playNotMonetizedSound();
}
} else {
setMonetization(null);
}
} catch (err) {
console.error("Failed to check monetization:", err);
setMonetization(null);
lastMonetizationCheckRef.current = null;
}
};
const fetchLiveStats = async (id, isInitial = false) => {
try {
let newStats = null;
if (isInitial) {
setRealtimeStatus("loading");
errorCountRef.current = 0;
newStats = await fetchInitialStats(id);
} else {
newStats = await fetchRealtimeStats(id);
}
if (newStats) {
const timestamp = dayjs().format("HH:mm:ss");
setLiveStats(newStats);
setRealtimeStatus("success");
errorCountRef.current = 0;
if (prevStatsRef.current) {
const newDiffs = {
liveSubscriber: newStats.liveSubscriber - prevStatsRef.current.liveSubscriber,
liveViews: newStats.liveViews - prevStatsRef.current.liveViews,
liveVideos: newStats.liveVideos - prevStatsRef.current.liveVideos
};
setDiffs(newDiffs);
}
prevStatsRef.current = newStats;
setChartData((prev) => ({
subscribers: [...prev.subscribers, newStats.liveSubscriber].slice(
-30
),
views: [...prev.views, newStats.liveViews].slice(-30),
videos: [...prev.videos, newStats.liveVideos].slice(-30),
timestamps: [...prev.timestamps, timestamp].slice(-30)
}));
} else {
if (!isInitial) {
errorCountRef.current++;
setRealtimeStatus("error");
if (errorCountRef.current >= 5 && intervalRef.current) {
console.warn("Too many errors, stopping realtime updates");
clearInterval(intervalRef.current);
intervalRef.current = null;
}
}
}
} catch (err) {
console.error("Failed to fetch live stats:", err);
if (!isInitial) {
errorCountRef.current++;
setRealtimeStatus("error");
if (errorCountRef.current >= 5 && intervalRef.current) {
console.warn("Too many errors, stopping realtime updates");
clearInterval(intervalRef.current);
intervalRef.current = null;
}
}
}
};
const fetchVideoLiveStats = async (id, isInitial = false) => {
try {
let newStats = null;
if (isInitial) {
setRealtimeStatus("loading");
errorCountRef.current = 0;
newStats = await fetchInitialVideoStats(id);
} else {
newStats = await fetchRealtimeVideoStats(id);
}
if (newStats) {
const timestamp = dayjs().format("HH:mm:ss");
setVideoLiveStats(newStats);
setRealtimeStatus("success");
errorCountRef.current = 0;
if (prevVideoStatsRef.current) {
const newDiffs = {
liveViews: newStats.liveViews - prevVideoStatsRef.current.liveViews,
liveLikes: newStats.liveLikes - prevVideoStatsRef.current.liveLikes,
liveComments: newStats.liveComments - prevVideoStatsRef.current.liveComments,
liveViewer: newStats.liveViewer - prevVideoStatsRef.current.liveViewer,
dislikes: newStats.dislikes - prevVideoStatsRef.current.dislikes
};
setVideoDiffs(newDiffs);
}
prevVideoStatsRef.current = newStats;
setVideoChartData((prev) => ({
views: [...prev.views, newStats.liveViews].slice(-30),
likes: [...prev.likes, newStats.liveLikes].slice(-30),
dislikes: [...prev.dislikes, newStats.dislikes].slice(-30),
comments: [...prev.comments, newStats.liveComments].slice(-30),
viewers: [...prev.viewers, newStats.liveViewer].slice(-30),
timestamps: [...prev.timestamps, timestamp].slice(-30)
}));
} else {
if (!isInitial) {
errorCountRef.current++;
setRealtimeStatus("error");
if (errorCountRef.current >= 5 && intervalRef.current) {
console.warn("Too many errors, stopping realtime updates");
clearInterval(intervalRef.current);
intervalRef.current = null;
}
}
}
} catch (err) {
console.error("Failed to fetch video live stats:", err);
if (!isInitial) {
errorCountRef.current++;
setRealtimeStatus("error");
if (errorCountRef.current >= 5 && intervalRef.current) {
console.warn("Too many errors, stopping realtime updates");
clearInterval(intervalRef.current);
intervalRef.current = null;
}
}
}
};
const fetchVideoData = async (id) => {
setLoading(true);
setMonetization(null);
setVideoLiveStats(null);
setVideoInfo(null);
setVideoDiffs({});
setVideoChartData({
views: [],
likes: [],
dislikes: [],
comments: [],
viewers: [],
timestamps: []
});
prevVideoStatsRef.current = null;
if (intervalRef.current) {
clearInterval(intervalRef.current);
}
try {
const response = await fetch(
`https://tubeinsights.exyezed.cc/api/videos/${id}`
);
if (!response.ok) throw new Error("Failed to fetch video info");
const data = await response.json();
if (data && data.items && data.items.length > 0) {
const item = data.items[0];
let channelCountry;
try {
const channelResponse = await fetch(
`https://tubeinsights.exyezed.cc/api/channels/${item.snippet.channelId}`
);
if (channelResponse.ok) {
const channelData = await channelResponse.json();
if (channelData && channelData.items && channelData.items.length > 0) {
channelCountry = channelData.items[0].snippet.country;
}
}
} catch {
}
const info = {
videoId: item.id,
title: item.snippet.title,
thumbnails: item.snippet.thumbnails,
channelTitle: item.snippet.channelTitle,
channelId: item.snippet.channelId,
duration: item.contentDetails?.duration,
categoryId: item.snippet.categoryId,
madeForKids: item.status?.madeForKids || false,
publishedAt: item.snippet.publishedAt,
isLive: item.snippet.liveBroadcastContent === "live",
channelCountry
};
setVideoInfo(info);
setLoading(false);
await fetchVideoLiveStats(item.id, true);
startVideoPolling(item.id);
const videoUrl = `https://www.youtube.com/watch?v=${item.id}`;
checkMonetizationAsync(videoUrl);
}
} catch (err) {
console.error("Failed to fetch video data:", err);
setLoading(false);
}
};
const fetchChannelData = async (id) => {
setLoading(true);
setMonetization(null);
setLiveStats(null);
setChannelInfo(null);
setDiffs({});
setChartData({ subscribers: [], views: [], videos: [], timestamps: [] });
prevStatsRef.current = null;
if (intervalRef.current) {
clearInterval(intervalRef.current);
}
try {
const response = await fetch(
`https://tubeinsights.exyezed.cc/api/channels/${id}`
);
if (!response.ok) throw new Error("Failed to fetch channel info");
const data = await response.json();
if (data && data.items && data.items.length > 0) {
const item = data.items[0];
const snippet = item.snippet;
const brandingSettings = item.brandingSettings;
const bannerUrl = brandingSettings?.image?.bannerExternalUrl;
const info = {
channelId: item.id,
title: snippet.title,
description: snippet.description,
publishedAt: snippet.publishedAt,
thumbnails: snippet.thumbnails,
customUrl: snippet.customUrl,
country: snippet.country,
bannerExternalUrl: bannerUrl ? `${bannerUrl}=s1600` : void 0
};
setChannelInfo(info);
setLoading(false);
await fetchLiveStats(item.id, true);
startPolling(item.id);
checkMonetizationAsync(item.id);
}
} catch (err) {
console.error("Failed to fetch channel data:", err);
setLoading(false);
}
};
const isChannelPage = () => {
const path = window.location.pathname;
return path.startsWith("/@") || path.startsWith("/channel/");
};
const getChannelIdFromURL = async () => {
const path = window.location.pathname;
if (path.startsWith("/channel/")) {
return path.split("/")[2] || null;
}
if (path.startsWith("/@")) {
try {
const response = await fetch(`https://www.youtube.com${path}`);
const html = await response.text();
const match = html.match(/"channelId":"(UC[\w-]+)"/);
if (match && match[1]) return match[1];
} catch (err) {
console.error("Failed to get channel ID from handle:", err);
}
}
return null;
};
const startPolling = (id) => {
if (intervalRef.current) {
clearInterval(intervalRef.current);
}
intervalRef.current = window.setInterval(() => {
fetchLiveStats(id);
}, 2e3);
};
const startVideoPolling = (id) => {
if (intervalRef.current) {
clearInterval(intervalRef.current);
}
intervalRef.current = window.setInterval(() => {
fetchVideoLiveStats(id);
}, 2e3);
};
const loadChannelData = async () => {
if (activeTab.value !== "livecount") {
if (intervalRef.current) {
clearInterval(intervalRef.current);
intervalRef.current = null;
}
return;
}
if (!isPanelVisible.value) {
if (intervalRef.current) {
clearInterval(intervalRef.current);
intervalRef.current = null;
}
}
if (isFetchingRef.current) {
return;
}
if (isVideoPage()) {
const vId = getVideoIdFromURL();
if (vId !== videoId) {
isFetchingRef.current = true;
setVideoId(vId);
setChannelId(null);
setChannelInfo(null);
setLiveStats(null);
setVideoInfo(null);
setVideoLiveStats(null);
setMonetization(null);
lastMonetizationCheckRef.current = null;
if (vId && isPanelVisible.value) {
await fetchVideoData(vId);
}
isFetchingRef.current = false;
} else if (vId && !intervalRef.current && videoInfo && isPanelVisible.value) {
startVideoPolling(vId);
}
return;
}
if (!isChannelPage()) {
setChannelId(null);
setChannelInfo(null);
setLiveStats(null);
setVideoId(null);
setVideoInfo(null);
setVideoLiveStats(null);
setMonetization(null);
lastMonetizationCheckRef.current = null;
if (intervalRef.current) {
clearInterval(intervalRef.current);
}
return;
}
const id = await getChannelIdFromURL();
if (id !== channelId) {
isFetchingRef.current = true;
setChannelId(id);
setVideoId(null);
setVideoInfo(null);
setVideoLiveStats(null);
lastMonetizationCheckRef.current = null;
if (id && isPanelVisible.value) {
await fetchChannelData(id);
}
isFetchingRef.current = false;
} else if (id && !intervalRef.current && channelInfo && isPanelVisible.value) {
startPolling(id);
}
};
hooks.useEffect(() => {
if (activeTab.value !== "livecount") {
if (intervalRef.current) {
clearInterval(intervalRef.current);
intervalRef.current = null;
}
return;
}
loadChannelData();
const checkUrlChange = () => {
loadChannelData();
};
const intervalId = setInterval(checkUrlChange, 1e3);
return () => {
clearInterval(intervalId);
if (intervalRef.current) {
clearInterval(intervalRef.current);
}
};
}, [channelId, videoId, activeTab.value]);
hooks.useEffect(() => {
if (activeTab.value === "livecount" && isPanelVisible.value && !isFetchingRef.current) {
if (channelId && !channelInfo) {
fetchChannelData(channelId);
}
if (videoId && !videoInfo) {
fetchVideoData(videoId);
}
}
}, [
activeTab.value,
isPanelVisible.value,
channelId,
videoId,
channelInfo,
videoInfo
]);
const renderDiff = (key) => {
const diff = diffs[key];
if (!diff || diff === 0) return null;
const isPositive = diff > 0;
return u(
"div",
{
className: `flex items-center gap-1 text-xl font-semibold ${isPositive ? "text-success" : "text-error"}`,
children: [
isPositive ? u(IconTrendingUp, { className: "w-6 h-6" }) : u(IconTrendingDown, { className: "w-6 h-6" }),
isPositive ? "+" : "",
formatNumber(Math.abs(diff))
]
}
);
};
const renderVideoDiff = (key) => {
const diff = videoDiffs[key];
if (!diff || diff === 0) return null;
const isPositive = diff > 0;
return u(
"div",
{
className: `flex items-center gap-1 text-xl font-semibold ${isPositive ? "text-success" : "text-error"}`,
children: [
isPositive ? u(IconTrendingUp, { className: "w-6 h-6" }) : u(IconTrendingDown, { className: "w-6 h-6" }),
isPositive ? "+" : "",
formatNumber(Math.abs(diff))
]
}
);
};
if (!isChannelPage() && !isVideoPage()) {
return u("div", { className: "text-center py-8", children: u("p", { className: "text-xl opacity-60", children: "Navigate to a YouTube channel or video page to see live count" }) });
}
if (loading && !channelInfo && !videoInfo) {
return u("div", { className: "text-center py-8", children: u("span", { className: "loading loading-spinner loading-lg" }) });
}
return u("div", { className: "space-y-4", children: [
videoInfo && videoLiveStats && u(preact.Fragment, { children: [
window.location.pathname.startsWith("/shorts/") ? u("div", { className: "grid grid-cols-2 gap-2", children: ["oardefault", "oar1", "oar2", "oar3"].map((quality) => u(
"a",
{
href: `https://i.ytimg.com/vi/${videoInfo.videoId}/${quality}.jpg`,
target: "_blank",
rel: "noopener noreferrer",
className: "rounded-lg overflow-hidden hover:opacity-80 transition-opacity",
style: { aspectRatio: "9/16" },
children: u(
"img",
{
src: `https://i.ytimg.com/vi/${videoInfo.videoId}/${quality}.jpg`,
alt: `${videoInfo.title} - ${quality}`,
className: "w-full h-full object-cover"
}
)
},
quality
)) }) : u(
"a",
{
href: `https://i.ytimg.com/vi/${videoInfo.videoId}/maxresdefault.jpg`,
target: "_blank",
rel: "noopener noreferrer",
className: "block aspect-video rounded-lg overflow-hidden hover:opacity-80 transition-opacity cursor-pointer",
children: u(
"img",
{
src: videoInfo.thumbnails?.high?.url || videoInfo.thumbnails?.medium?.url,
alt: videoInfo.title,
className: "w-full h-full object-cover"
}
)
}
),
u("div", { children: [
u("h2", { className: "text-xl font-semibold mb-2", children: videoInfo.title }),
u("div", { className: "text-xl opacity-60", children: [
"Title Length: ",
videoInfo.title.length,
" characters"
] })
] }),
u("div", { children: [
u("div", { className: "flex items-center gap-2", children: u(
"a",
{
href: `https://www.youtube.com/channel/${videoInfo.channelId}`,
target: "_blank",
rel: "noopener noreferrer",
className: "text-primary text-xl hover:underline font-semibold",
children: videoInfo.channelTitle
}
) }),
u(
"a",
{
href: `https://www.youtube.com/watch?v=${videoInfo.videoId}`,
target: "_blank",
rel: "noopener noreferrer",
className: "text-xl text-secondary font-mono hover:underline block",
children: videoInfo.videoId
}
)
] }),
videoInfo.channelCountry && u("div", { className: "bg-base-200 rounded-lg p-4", children: [
u("div", { className: "text-xl opacity-60 mb-2", children: "Country" }),
u("div", { className: "flex items-center gap-3", children: [
u(CountryFlag, { countryCode: videoInfo.channelCountry, size: "md" }),
u("span", { className: "text-xl", children: countryNames[videoInfo.channelCountry] || videoInfo.channelCountry })
] })
] }),
u("div", { className: "space-y-4", children: u("div", { className: "bg-base-200 rounded-lg p-4", children: u("div", { className: "flex items-center justify-between", children: [
u("div", { className: "flex items-center gap-3", children: [
u(
IconCurrencyDollar,
{
className: `w-8 h-8 ${monetization === null ? "text-base-content opacity-60" : monetization ? "text-success" : "text-error"}`
}
),
u("div", { className: "text-xl opacity-60", children: "Monetization" })
] }),
u("div", { className: "text-right", children: monetization === null ? u("span", { className: "loading loading-spinner loading-sm" }) : monetization ? u("div", { className: "flex items-center gap-2", children: [
u(IconCircleCheck, { className: "w-6 h-6 text-success" }),
u("span", { className: "text-success font-semibold text-xl", children: "Enabled" })
] }) : u("div", { className: "flex items-center gap-2", children: [
u(IconCircleX, { className: "w-6 h-6 text-error" }),
u("span", { className: "text-error font-semibold text-xl", children: "Disabled" })
] }) })
] }) }) }),
u("div", { className: "space-y-4", children: [
u("h3", { className: "text-xl font-semibold", children: "Live Statistics" }),
u("div", { className: "bg-base-200 rounded-lg p-6 relative", children: [
u(IconEye, { className: "w-8 h-8 text-primary absolute top-4 left-4" }),
u("div", { className: "inline-grid *:[grid-area:1/1] absolute top-4 right-4", children: [
u(
"div",
{
className: `status ${realtimeStatus === "success" ? "status-success animate-ping" : realtimeStatus === "error" ? "status-error animate-ping" : "status-warning animate-ping"}`
}
),
u(
"div",
{
className: `status ${realtimeStatus === "success" ? "status-success" : realtimeStatus === "error" ? "status-error" : "status-warning"}`
}
)
] }),
u("div", { className: "flex flex-col items-center text-center gap-3", children: [
u("div", { className: "h-6 text-xl", children: renderVideoDiff("liveViews") }),
u("div", { className: "text-5xl font-semibold text-primary", children: formatNumber(videoLiveStats.liveViews) }),
u("div", { className: "text-xl opacity-60", children: videoLiveStats.liveViews.toLocaleString() }),
u("div", { className: "text-xl opacity-60", children: "Live Views" })
] })
] }),
u("div", { className: "bg-base-200 rounded-lg p-6 relative", children: [
u(IconUsers, { className: "w-8 h-8 text-secondary absolute top-4 left-4" }),
u("div", { className: "inline-grid *:[grid-area:1/1] absolute top-4 right-4", children: [
u(
"div",
{
className: `status ${realtimeStatus === "success" ? "status-success animate-ping" : realtimeStatus === "error" ? "status-error animate-ping" : "status-warning animate-ping"}`
}
),
u(
"div",
{
className: `status ${realtimeStatus === "success" ? "status-success" : realtimeStatus === "error" ? "status-error" : "status-warning"}`
}
)
] }),
u("div", { className: "flex flex-col items-center text-center gap-3", children: [
u("div", { className: "h-6 text-xl", children: renderVideoDiff("liveViewer") }),
u("div", { className: "text-5xl font-semibold text-secondary", children: formatNumber(videoLiveStats.liveViewer) }),
u("div", { className: "text-xl opacity-60", children: videoLiveStats.liveViewer.toLocaleString() }),
u("div", { className: "text-xl opacity-60", children: "Live Viewers" })
] })
] }),
u("div", { className: "bg-base-200 rounded-lg p-6 relative", children: [
u(IconThumbUp, { className: "w-8 h-8 text-success absolute top-4 left-4" }),
u("div", { className: "inline-grid *:[grid-area:1/1] absolute top-4 right-4", children: [
u(
"div",
{
className: `status ${realtimeStatus === "success" ? "status-success animate-ping" : realtimeStatus === "error" ? "status-error animate-ping" : "status-warning animate-ping"}`
}
),
u(
"div",
{
className: `status ${realtimeStatus === "success" ? "status-success" : realtimeStatus === "error" ? "status-error" : "status-warning"}`
}
)
] }),
u("div", { className: "flex flex-col items-center text-center gap-3", children: [
u("div", { className: "h-6 text-xl", children: renderVideoDiff("liveLikes") }),
u("div", { className: "text-5xl font-semibold text-success", children: formatNumber(videoLiveStats.liveLikes) }),
u("div", { className: "text-xl opacity-60", children: videoLiveStats.liveLikes.toLocaleString() }),
u("div", { className: "text-xl opacity-60", children: "Live Likes" })
] })
] }),
u("div", { className: "bg-base-200 rounded-lg p-6 relative", children: [
u(IconThumbDown, { className: "w-8 h-8 text-error absolute top-4 left-4" }),
u("div", { className: "inline-grid *:[grid-area:1/1] absolute top-4 right-4", children: [
u(
"div",
{
className: `status ${realtimeStatus === "success" ? "status-success animate-ping" : realtimeStatus === "error" ? "status-error animate-ping" : "status-warning animate-ping"}`
}
),
u(
"div",
{
className: `status ${realtimeStatus === "success" ? "status-success" : realtimeStatus === "error" ? "status-error" : "status-warning"}`
}
)
] }),
u("div", { className: "flex flex-col items-center text-center gap-3", children: [
u("div", { className: "h-6 text-xl", children: renderVideoDiff("dislikes") }),
u("div", { className: "text-5xl font-semibold text-error", children: formatNumber(videoLiveStats.dislikes) }),
u("div", { className: "text-xl opacity-60", children: videoLiveStats.dislikes.toLocaleString() }),
u("div", { className: "text-xl opacity-60", children: "Live Dislikes" })
] })
] }),
u("div", { className: "bg-base-200 rounded-lg p-6 relative", children: [
u(IconMessage, { className: "w-8 h-8 text-info absolute top-4 left-4" }),
u("div", { className: "inline-grid *:[grid-area:1/1] absolute top-4 right-4", children: [
u(
"div",
{
className: `status ${realtimeStatus === "success" ? "status-success animate-ping" : realtimeStatus === "error" ? "status-error animate-ping" : "status-warning animate-ping"}`
}
),
u(
"div",
{
className: `status ${realtimeStatus === "success" ? "status-success" : realtimeStatus === "error" ? "status-error" : "status-warning"}`
}
)
] }),
u("div", { className: "flex flex-col items-center text-center gap-3", children: [
u("div", { className: "h-6 text-xl", children: renderVideoDiff("liveComments") }),
u("div", { className: "text-5xl font-semibold text-info", children: formatNumber(videoLiveStats.liveComments) }),
u("div", { className: "text-xl opacity-60", children: videoLiveStats.liveComments.toLocaleString() }),
u("div", { className: "text-xl opacity-60", children: "Live Comments" })
] })
] })
] })
] }),
channelInfo && liveStats && u(preact.Fragment, { children: [
channelInfo.bannerExternalUrl && u(
"a",
{
href: channelInfo.bannerExternalUrl.replace(/=s\d+$/, "=s0"),
target: "_blank",
rel: "noopener noreferrer",
className: "block h-32 overflow-hidden rounded-lg hover:opacity-80 transition-opacity cursor-pointer",
children: u(
"img",
{
src: channelInfo.bannerExternalUrl,
alt: "Channel Banner",
className: "w-full h-full object-cover"
}
)
}
),
u("div", { className: "flex items-center gap-4", children: [
channelInfo.thumbnails?.high?.url && u(
"a",
{
href: channelInfo.thumbnails.high.url.replace(/=s\d+/, "=s0"),
target: "_blank",
rel: "noopener noreferrer",
className: "avatar hover:opacity-80 transition-opacity cursor-pointer",
children: u("div", { className: "w-16 rounded-full", children: u(
"img",
{
src: channelInfo.thumbnails.high.url,
alt: channelInfo.title
}
) })
}
),
u("div", { className: "flex-1", children: [
u("h2", { className: "text-xl font-semibold", children: channelInfo.title }),
channelInfo.customUrl && u(
"a",
{
href: `https://www.youtube.com/${channelInfo.customUrl}`,
target: "_blank",
rel: "noopener noreferrer",
className: "text-primary text-xl hover:underline",
children: channelInfo.customUrl
}
),
u(
"a",
{
href: `https://www.youtube.com/channel/${channelInfo.channelId}`,
target: "_blank",
rel: "noopener noreferrer",
className: "text-xl text-secondary font-mono hover:underline block",
children: channelInfo.channelId
}
)
] })
] }),
u("div", { className: "space-y-4", children: [
u("div", { className: "bg-base-200 rounded-lg p-4", children: [
u("div", { className: "text-xl opacity-60 mb-2", children: "Country" }),
u("div", { className: "flex items-center gap-3", children: [
channelInfo.country && u(CountryFlag, { countryCode: channelInfo.country, size: "md" }),
u("span", { className: "text-xl", children: channelInfo.country ? countryNames[channelInfo.country] || channelInfo.country : "-" })
] })
] }),
u("div", { className: "bg-base-200 rounded-lg p-4", children: [
u("div", { className: "text-xl opacity-60 mb-2", children: "Created" }),
u("div", { className: "text-xl", children: [
u("span", { className: "text-primary", children: dayjs(channelInfo.publishedAt).format(
"MMM D, YYYY • HH:mm:ss"
) }),
u("span", { className: "text-secondary ml-2", children: [
"(",
calculateAge(channelInfo.publishedAt),
" ago)"
] })
] })
] }),
u("div", { className: "bg-base-200 rounded-lg p-4", children: u("div", { className: "flex items-center justify-between", children: [
u("div", { className: "flex items-center gap-3", children: [
u(
IconCurrencyDollar,
{
className: `w-8 h-8 ${monetization === null ? "text-base-content opacity-60" : monetization ? "text-success" : "text-error"}`
}
),
u("div", { className: "text-xl opacity-60", children: "Monetization" })
] }),
u("div", { className: "text-right", children: monetization === null ? u("span", { className: "loading loading-spinner loading-sm" }) : monetization ? u("div", { className: "flex items-center gap-2", children: [
u(IconCircleCheck, { className: "w-6 h-6 text-success" }),
u("span", { className: "text-success font-semibold text-xl", children: "Enabled" })
] }) : u("div", { className: "flex items-center gap-2", children: [
u(IconCircleX, { className: "w-6 h-6 text-error" }),
u("span", { className: "text-error font-semibold text-xl", children: "Disabled" })
] }) })
] }) })
] }),
u("div", { className: "space-y-4", children: [
u("h3", { className: "text-xl font-semibold", children: "Live Statistics" }),
u("div", { className: "bg-base-200 rounded-lg p-6 relative", children: [
u(IconUsers, { className: "w-8 h-8 text-primary absolute top-4 left-4" }),
u("div", { className: "inline-grid *:[grid-area:1/1] absolute top-4 right-4", children: [
u(
"div",
{
className: `status ${realtimeStatus === "success" ? "status-success animate-ping" : realtimeStatus === "error" ? "status-error animate-ping" : "status-warning animate-ping"}`
}
),
u(
"div",
{
className: `status ${realtimeStatus === "success" ? "status-success" : realtimeStatus === "error" ? "status-error" : "status-warning"}`
}
)
] }),
u("div", { className: "flex flex-col items-center text-center gap-3", children: [
u("div", { className: "h-6 text-xl", children: renderDiff("liveSubscriber") }),
u("div", { className: "text-5xl font-semibold text-primary", children: formatNumber(liveStats.liveSubscriber) }),
u("div", { className: "text-xl opacity-60", children: liveStats.liveSubscriber.toLocaleString() }),
u("div", { className: "text-xl opacity-60", children: "Live Subscribers" })
] })
] }),
u("div", { className: "bg-base-200 rounded-lg p-6 relative", children: [
u(IconEye, { className: "w-8 h-8 text-secondary absolute top-4 left-4" }),
u("div", { className: "inline-grid *:[grid-area:1/1] absolute top-4 right-4", children: [
u(
"div",
{
className: `status ${realtimeStatus === "success" ? "status-success animate-ping" : realtimeStatus === "error" ? "status-error animate-ping" : "status-warning animate-ping"}`
}
),
u(
"div",
{
className: `status ${realtimeStatus === "success" ? "status-success" : realtimeStatus === "error" ? "status-error" : "status-warning"}`
}
)
] }),
u("div", { className: "flex flex-col items-center text-center gap-3", children: [
u("div", { className: "h-6 text-xl", children: renderDiff("liveViews") }),
u("div", { className: "text-5xl font-semibold text-secondary", children: formatNumber(liveStats.liveViews) }),
u("div", { className: "text-xl opacity-60", children: liveStats.liveViews.toLocaleString() }),
u("div", { className: "text-xl opacity-60", children: "Live Views" })
] })
] }),
u("div", { className: "bg-base-200 rounded-lg p-6 relative", children: [
u(IconVideo, { className: "w-8 h-8 text-accent absolute top-4 left-4" }),
u("div", { className: "inline-grid *:[grid-area:1/1] absolute top-4 right-4", children: [
u(
"div",
{
className: `status ${realtimeStatus === "success" ? "status-success animate-ping" : realtimeStatus === "error" ? "status-error animate-ping" : "status-warning animate-ping"}`
}
),
u(
"div",
{
className: `status ${realtimeStatus === "success" ? "status-success" : realtimeStatus === "error" ? "status-error" : "status-warning"}`
}
)
] }),
u("div", { className: "flex flex-col items-center text-center gap-3", children: [
u("div", { className: "h-6 text-xl", children: renderDiff("liveVideos") }),
u("div", { className: "text-5xl font-semibold text-accent", children: formatNumber(liveStats.liveVideos) }),
u("div", { className: "text-xl opacity-60", children: liveStats.liveVideos.toLocaleString() }),
u("div", { className: "text-xl opacity-60", children: "Live Videos" })
] })
] })
] })
] })
] });
}
const DB_NAME = "TubeInsightsBookmarks";
const DB_VERSION = 1;
const STORE_NAME = "channels";
class BookmarkDB {
db = null;
async init() {
return new Promise((resolve, reject) => {
const request = indexedDB.open(DB_NAME, DB_VERSION);
request.onerror = () => reject(request.error);
request.onsuccess = () => {
this.db = request.result;
resolve();
};
request.onupgradeneeded = (event) => {
const db = event.target.result;
if (!db.objectStoreNames.contains(STORE_NAME)) {
const store = db.createObjectStore(STORE_NAME, {
keyPath: "channelId"
});
store.createIndex("category", "category", { unique: false });
store.createIndex("bookmarkedAt", "bookmarkedAt", { unique: false });
}
};
});
}
async addChannel(channel) {
if (!this.db) await this.init();
return new Promise((resolve, reject) => {
const transaction = this.db.transaction([STORE_NAME], "readwrite");
const store = transaction.objectStore(STORE_NAME);
const request = store.put(channel);
request.onsuccess = () => resolve();
request.onerror = () => reject(request.error);
});
}
async getChannel(channelId) {
if (!this.db) await this.init();
return new Promise((resolve, reject) => {
const transaction = this.db.transaction([STORE_NAME], "readonly");
const store = transaction.objectStore(STORE_NAME);
const request = store.get(channelId);
request.onsuccess = () => resolve(request.result || null);
request.onerror = () => reject(request.error);
});
}
async getAllChannels() {
if (!this.db) await this.init();
return new Promise((resolve, reject) => {
const transaction = this.db.transaction([STORE_NAME], "readonly");
const store = transaction.objectStore(STORE_NAME);
const request = store.getAll();
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
}
async deleteChannel(channelId) {
if (!this.db) await this.init();
return new Promise((resolve, reject) => {
const transaction = this.db.transaction([STORE_NAME], "readwrite");
const store = transaction.objectStore(STORE_NAME);
const request = store.delete(channelId);
request.onsuccess = () => resolve();
request.onerror = () => reject(request.error);
});
}
async clearAll() {
if (!this.db) await this.init();
return new Promise((resolve, reject) => {
const transaction = this.db.transaction([STORE_NAME], "readwrite");
const store = transaction.objectStore(STORE_NAME);
const request = store.clear();
request.onsuccess = () => resolve();
request.onerror = () => reject(request.error);
});
}
async getCategories() {
const channels = await this.getAllChannels();
const categoryMap = new Map();
channels.forEach((channel) => {
const count = categoryMap.get(channel.category) || 0;
categoryMap.set(channel.category, count + 1);
});
return Array.from(categoryMap.entries()).map(([category, count]) => ({ category, count })).sort((a, b) => a.category.localeCompare(b.category));
}
async exportData() {
const channels = await this.getAllChannels();
return JSON.stringify(channels, null, 2);
}
async importData(jsonData) {
const channels = JSON.parse(jsonData);
for (const channel of channels) {
await this.addChannel(channel);
}
}
}
const bookmarkDB = new BookmarkDB();
function BookmarkTab() {
const [channels, setChannels] = hooks.useState([]);
const [filteredChannels, setFilteredChannels] = hooks.useState(
[]
);
const [categories, setCategories] = hooks.useState([]);
const [selectedCategory, setSelectedCategory] = hooks.useState(() => {
return localStorage.getItem("bookmark-selected-category") || "all";
});
const [currentPage, setCurrentPage] = hooks.useState(1);
const [channelsPerPage, setChannelsPerPage] = hooks.useState(8);
const [errorMessage, setErrorMessage] = hooks.useState("");
hooks.useEffect(() => {
loadData();
loadPerPageSetting();
const handleBookmarkUpdate = () => {
loadData();
};
const handleSettingsUpdate = () => {
loadPerPageSetting();
};
window.addEventListener("bookmark-updated", handleBookmarkUpdate);
window.addEventListener("settings-updated", handleSettingsUpdate);
return () => {
window.removeEventListener("bookmark-updated", handleBookmarkUpdate);
window.removeEventListener("settings-updated", handleSettingsUpdate);
};
}, []);
const loadPerPageSetting = async () => {
const perPage = await storage.get("bookmark-per-page", "8");
setChannelsPerPage(parseInt(perPage));
setCurrentPage(1);
};
hooks.useEffect(() => {
localStorage.setItem("bookmark-selected-category", selectedCategory);
}, [selectedCategory]);
hooks.useEffect(() => {
filterChannels();
}, [channels, selectedCategory]);
const loadData = async () => {
const allChannels = await bookmarkDB.getAllChannels();
allChannels.sort((a, b) => b.bookmarkedAt - a.bookmarkedAt);
setChannels(allChannels);
const cats = await bookmarkDB.getCategories();
setCategories(cats);
};
const filterChannels = () => {
if (selectedCategory === "all") {
setFilteredChannels(channels);
} else {
setFilteredChannels(
channels.filter((ch) => ch.category === selectedCategory)
);
}
setCurrentPage(1);
};
const handleExport = async () => {
const jsonData = await bookmarkDB.exportData();
const blob = new Blob([jsonData], { type: "application/json" });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = `tubeinsights-bookmarks-${Date.now()}.json`;
a.click();
URL.revokeObjectURL(url);
};
const handleImport = () => {
const input = document.createElement("input");
input.type = "file";
input.accept = "application/json";
input.onchange = async (e) => {
const file = e.target.files?.[0];
if (!file) return;
const reader = new FileReader();
reader.onload = async (event) => {
try {
const jsonData = event.target?.result;
await bookmarkDB.importData(jsonData);
loadData();
} catch (err) {
playErrorSound();
setErrorMessage("Import failed: " + err);
setTimeout(() => setErrorMessage(""), 1e3);
}
};
reader.readAsText(file);
};
input.click();
};
const totalPages = Math.ceil(filteredChannels.length / channelsPerPage);
const startIndex = (currentPage - 1) * channelsPerPage;
const endIndex = startIndex + channelsPerPage;
const currentChannels = filteredChannels.slice(startIndex, endIndex);
return u("div", { className: "space-y-4", children: [
u("div", { className: "flex gap-2 flex-wrap", children: [
u("div", { className: "tooltip tooltip-right", "data-tip": "Import bookmarks", children: u("button", { className: "btn btn-square btn-primary", onClick: handleImport, children: u(IconFileImport, { className: "size-[1.8em]" }) }) }),
u("div", { className: "tooltip tooltip-right", "data-tip": "Export bookmarks", children: u(
"button",
{
className: "btn btn-square btn-secondary",
onClick: handleExport,
children: u(IconFileExport, { className: "size-[1.8em]" })
}
) }),
u("div", { className: "tooltip tooltip-right", "data-tip": "Clear all bookmarks", children: u(
"button",
{
className: "btn btn-square btn-error",
onClick: openClearAllDialog,
children: u(IconDatabaseOff, { className: "size-[1.8em]" })
}
) }),
u("div", { className: "dropdown dropdown-end ml-auto", children: [
u("button", { tabIndex: 0, className: "btn", children: selectedCategory === "all" ? `All Categories (${channels.length})` : `${selectedCategory} (${categories.find((c) => c.category === selectedCategory)?.count || 0})` }),
u(
"ul",
{
tabIndex: 0,
className: "dropdown-content menu bg-base-200 rounded-box z-10 w-64 p-2 shadow-lg mt-1 text-lg",
children: [
u("li", { children: u(
"button",
{
onClick: () => setSelectedCategory("all"),
className: "flex justify-between",
children: [
u("span", { children: "All Categories" }),
u("span", { className: "badge badge-soft badge-lg", children: channels.length })
]
}
) }),
categories.map((cat) => u("li", { children: u(
"button",
{
onClick: () => setSelectedCategory(cat.category),
className: "flex justify-between",
children: [
u("span", { children: cat.category }),
u("span", { className: "badge badge-soft badge-lg", children: cat.count })
]
}
) }, cat.category))
]
}
)
] })
] }),
errorMessage && u("div", { role: "alert", className: "alert alert-error alert-soft", children: [
u(IconCircleX, { className: "size-6 shrink-0" }),
u("span", { className: "text-xl", children: errorMessage })
] }),
currentChannels.length === 0 ? u("div", { className: "text-center py-8", children: u("p", { className: "text-xl opacity-60", children: "No bookmarked channels" }) }) : u(preact.Fragment, { children: [
u("div", { className: "space-y-3", children: currentChannels.map((channel) => u(
"div",
{
className: "bg-base-200 rounded-lg p-4",
children: u("div", { className: "flex items-center gap-3", children: [
u(
"a",
{
href: `https://www.youtube.com/channel/${channel.channelId}`,
target: "_blank",
rel: "noopener noreferrer",
className: "avatar hover:opacity-80 transition-opacity cursor-pointer shrink-0",
children: u("div", { className: "w-16 rounded-full", children: u("img", { src: channel.thumbnailUrl, alt: channel.title }) })
}
),
u("div", { className: "flex-1 min-w-0", children: [
u("div", { className: "flex items-center gap-2 mb-1", children: u("h3", { className: "font-semibold text-lg truncate", children: channel.title }) }),
u("div", { className: "flex gap-4 text-lg mb-2", children: [
u("span", { className: "flex items-center gap-1 text-primary", children: [
u(IconUsers, { className: "size-[1.2em]" }),
formatNumber(parseInt(channel.subscriberCount))
] }),
u("span", { className: "flex items-center gap-1 text-secondary", children: [
u(IconVideo, { className: "size-[1.2em]" }),
formatNumber(parseInt(channel.videoCount))
] }),
u("span", { className: "flex items-center gap-1 text-accent", children: [
u(IconEye, { className: "size-[1.2em]" }),
formatNumber(parseInt(channel.viewCount))
] })
] }),
u("div", { className: "badge badge-info badge-soft badge-lg", children: channel.category })
] }),
u("div", { className: "flex gap-2 shrink-0", children: [
u(
"button",
{
className: "btn btn-square",
onClick: () => openDetailChannelDialog(channel),
children: u(IconInfoCircle, { className: "size-[1.8em]" })
}
),
u(
"button",
{
className: "btn btn-square btn-error",
onClick: () => openDeleteChannelDialog(channel.channelId),
children: u(IconTrash, { className: "size-[1.8em]" })
}
)
] })
] })
},
channel.channelId
)) }),
totalPages > 1 && u("div", { className: "flex justify-center", children: u("div", { className: "join", children: [
u(
"button",
{
className: "join-item btn btn-lg",
disabled: currentPage === 1,
onClick: () => setCurrentPage(currentPage - 1),
children: "«"
}
),
u("button", { className: "join-item btn btn-lg", children: [
currentPage,
"/",
totalPages
] }),
u(
"button",
{
className: "join-item btn btn-lg",
disabled: currentPage === totalPages,
onClick: () => setCurrentPage(currentPage + 1),
children: "»"
}
)
] }) })
] })
] });
}
function sanitizeFilename(filename) {
return filename.replace(/[<>:"/\\|?*\x00-\x1F\x7F]/g, "_").replace(/\s+/g, " ").trim().substring(0, 200);
}
const API_KEY_URL = "https://api.mp3youtube.cc/v2/sanity/key";
const API_CONVERT_URL = "https://api.mp3youtube.cc/v2/converter";
const SUBTITLE_API_URL = "https://get-info.downsub.com/";
const SUBTITLE_SECRET_KEY = "zthxw34cdp6wfyxmpad38v52t3hsz6c5";
const REQUEST_HEADERS = {
"Content-Type": "application/json",
Origin: "https://iframe.y2meta-uk.com",
Accept: "*/*",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"
};
function DDLTab() {
const [youtubeService2] = hooks.useState(() => new YouTubeService());
const [channelId, setChannelId] = hooks.useState(null);
const [activeContentTab, setActiveContentTab] = hooks.useState("videos");
const [format, setFormat] = hooks.useState("video");
const [quality, setQuality] = hooks.useState("1080");
const [audioBitrate, setAudioBitrate] = hooks.useState("320");
const [currentVideoId, setCurrentVideoId] = hooks.useState(null);
const [currentVideoTitle, setCurrentVideoTitle] = hooks.useState("");
const [currentVideoDuration, setCurrentVideoDuration] = hooks.useState("");
const [currentVideoViews, setCurrentVideoViews] = hooks.useState("");
const [loadingVideoInfo, setLoadingVideoInfo] = hooks.useState(false);
const [loadingSubtitles, setLoadingSubtitles] = hooks.useState(false);
const [subtitleVideoId, setSubtitleVideoId] = hooks.useState(null);
const [errorMessage, setErrorMessage] = hooks.useState("");
const [videosCache, setVideosCache] = hooks.useState({
videos: [],
shorts: [],
live: []
});
const [loadingCache, setLoadingCache] = hooks.useState({
videos: false,
shorts: false,
live: false
});
const [currentPageCache, setCurrentPageCache] = hooks.useState({
videos: 1,
shorts: 1,
live: 1
});
const [downloadingIds, setDownloadingIds] = hooks.useState( new Set());
const [downloadProgress, setDownloadProgress] = hooks.useState({});
const [selectedVideoIds, setSelectedVideoIds] = hooks.useState(
new Set()
);
const [downloadQueue, setDownloadQueue] = hooks.useState([]);
const [isProcessingQueue, setIsProcessingQueue] = hooks.useState(false);
const [failedDownloads, setFailedDownloads] = hooks.useState(
new Set()
);
const [totalDownloadedSize, setTotalDownloadedSize] = hooks.useState(0);
const [completedDownloads, setCompletedDownloads] = hooks.useState(0);
const [showFailedVideos, setShowFailedVideos] = hooks.useState(false);
const [bulkDownloadCompleted, setBulkDownloadCompleted] = hooks.useState(false);
const [successfulDownloads, setSuccessfulDownloads] = hooks.useState(0);
const [successfulVideoIds, setSuccessfulVideoIds] = hooks.useState(
new Set()
);
const [videosPerPage, setVideosPerPage] = hooks.useState(8);
const [abortControllers, setAbortControllers] = hooks.useState({
videos: null,
shorts: null,
live: null
});
const formatBytes = (bytes) => {
if (bytes === 0) return "0 B";
const k = 1024;
const sizes = ["B", "KB", "MB", "GB"];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
};
const videos = videosCache[activeContentTab];
const loading = loadingCache[activeContentTab];
const currentPage = currentPageCache[activeContentTab];
const videoQualities = [
"144",
"240",
"360",
"480",
"720",
"1080",
"1440",
"2160"
];
const audioQualities = ["128", "256", "320"];
const isChannelPage = () => {
const path = window.location.pathname;
return path.startsWith("/@") || path.startsWith("/channel/");
};
const isWatchPage = () => {
const path = window.location.pathname;
return path === "/watch" || path.startsWith("/shorts/");
};
const getVideoIdFromUrl = () => {
const path = window.location.pathname;
if (path.startsWith("/shorts/")) {
return path.split("/shorts/")[1]?.split("?")[0] || null;
}
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get("v");
};
const getVideoTitle2 = () => {
const titleElement = document.querySelector(
"h1.ytd-watch-metadata yt-formatted-string"
);
return titleElement?.textContent || "video";
};
const fetchVideoInfo = async (videoId) => {
setLoadingVideoInfo(true);
try {
const response = await innerTubeRequest("/youtubei/v1/player", {
videoId
});
const lengthSeconds = response.videoDetails?.lengthSeconds;
if (lengthSeconds) {
const duration = formatDuration(parseInt(lengthSeconds));
setCurrentVideoDuration(duration);
}
const viewCount = response.videoDetails?.viewCount;
if (viewCount) {
setCurrentVideoViews(formatViews(parseInt(viewCount)));
}
const title = response.videoDetails?.title;
if (title && !currentVideoTitle) {
setCurrentVideoTitle(title);
}
} catch (error) {
console.error("[DDL] Error fetching video info:", error);
} finally {
setLoadingVideoInfo(false);
}
};
const formatDuration = (seconds) => {
const hours = Math.floor(seconds / 3600);
const minutes = Math.floor(seconds % 3600 / 60);
const secs = seconds % 60;
if (hours > 0) {
return `${hours}:${minutes.toString().padStart(2, "0")}:${secs.toString().padStart(2, "0")}`;
}
return `${minutes}:${secs.toString().padStart(2, "0")}`;
};
const formatViews = (views) => {
if (views >= 1e9) {
return `${(views / 1e9).toFixed(1)}B views`;
}
if (views >= 1e6) {
return `${(views / 1e6).toFixed(1)}M views`;
}
if (views >= 1e3) {
return `${(views / 1e3).toFixed(1)}K views`;
}
return `${views} views`;
};
const formatJson = {
stringify: function(cipherParams) {
const result = {
ct: cipherParams.ciphertext.toString(CryptoJS.enc.Base64)
};
if (cipherParams.iv) {
result.iv = cipherParams.iv.toString();
}
if (cipherParams.salt) {
result.s = cipherParams.salt.toString();
}
return JSON.stringify(result);
},
parse: function(jsonStr) {
const parse = JSON.parse(jsonStr);
const result = CryptoJS.lib.CipherParams.create({
ciphertext: CryptoJS.enc.Base64.parse(parse.ct)
});
if (parse.iv) {
result.iv = CryptoJS.enc.Hex.parse(parse.iv);
}
if (parse.s) {
result.salt = CryptoJS.enc.Hex.parse(parse.s);
}
return result;
}
};
const toBase64 = (payload) => {
let vBtoa = btoa(payload);
vBtoa = vBtoa.replace(/\+/g, "-");
vBtoa = vBtoa.replace(/\//g, "_");
vBtoa = vBtoa.replace(/=/g, "");
return vBtoa;
};
const toBinary = (base64) => {
let data = base64.replace(/-/g, "+");
data = data.replace(/_/g, "/");
const mod4 = data.length % 4;
if (mod4) {
data += "====".substring(mod4);
}
return atob(data);
};
const encryptSubtitleData = (payload) => {
if (!payload) return "";
const encrypted = CryptoJS.AES.encrypt(
JSON.stringify(payload),
SUBTITLE_SECRET_KEY,
{
format: formatJson
}
);
const jsonString = encrypted.toString();
return toBase64(jsonString).trim();
};
const decryptSubtitleUrl = (payload) => {
if (!payload) return "";
const result = CryptoJS.AES.decrypt(
toBinary(payload),
SUBTITLE_SECRET_KEY,
{
format: formatJson
}
).toString(CryptoJS.enc.Utf8);
return result.trim().replace(/^"|"$/g, "");
};
const fetchSubtitles = async (videoId) => {
setLoadingSubtitles(true);
setSubtitleVideoId(videoId);
try {
const url = `https://www.youtube.com/watch?v=${videoId}`;
const encryptedId = encryptSubtitleData(videoId);
const response = await gmXmlHttpRequest({
method: "GET",
url: `${SUBTITLE_API_URL}${encryptedId}`,
headers: {
authority: "get-info.downsub.com",
accept: "application/json, text/plain, */*",
origin: "https://downsub.com",
referer: "https://downsub.com/",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
});
if (response.status !== 200) {
console.error("[DDL Subtitle] Error response:", {
status: response.status,
statusText: response.statusText,
responseText: response.responseText
});
throw new Error(`Failed to fetch subtitles: ${response.status}`);
}
const data = JSON.parse(response.responseText);
const videoTitle = data.title || currentVideoTitle || "video";
const processedSubtitles = (data.subtitles || []).map((sub) => ({
...sub,
url: decryptSubtitleUrl(sub.url),
enc_url: sub.url,
download: {
srt: `${data.urlSubtitle}?title=${encodeURIComponent(sub.name)}&url=${sub.url}`,
txt: `${data.urlSubtitle}?title=${encodeURIComponent(sub.name)}&url=${sub.url}&type=txt`,
raw: `${data.urlSubtitle}?title=${encodeURIComponent(sub.name)}&url=${sub.url}&type=raw`
}
}));
const processedAutoTrans = (data.subtitlesAutoTrans || []).map(
(sub) => ({
...sub,
url: decryptSubtitleUrl(sub.url),
enc_url: sub.url,
download: {
srt: `${data.urlSubtitle}?title=${encodeURIComponent(
sub.name
)}&url=${sub.url}`,
txt: `${data.urlSubtitle}?title=${encodeURIComponent(
sub.name
)}&url=${sub.url}&type=txt`,
raw: `${data.urlSubtitle}?title=${encodeURIComponent(
sub.name
)}&url=${sub.url}&type=raw`
}
})
);
openSubtitleDialog({
videoId,
videoTitle,
subtitles: processedSubtitles,
autoTransSubtitles: processedAutoTrans
});
} catch (error) {
console.error("[DDL] Error fetching subtitles:", error);
playErrorSound();
setErrorMessage("Failed to fetch subtitles");
setTimeout(() => setErrorMessage(""), 1e3);
} finally {
setLoadingSubtitles(false);
}
};
const loadChannelInfo = async () => {
if (activeTab.value !== "ddl") {
return;
}
if (isWatchPage()) {
const videoId = getVideoIdFromUrl();
if (videoId !== currentVideoId) {
setCurrentVideoId(videoId);
setCurrentVideoTitle(getVideoTitle2());
setCurrentVideoDuration("");
setCurrentVideoViews("");
if (videoId && isPanelVisible.value) {
fetchVideoInfo(videoId);
}
}
setChannelId(null);
return;
}
if (!isChannelPage()) {
setChannelId(null);
setCurrentVideoId(null);
setVideosCache({ videos: [], shorts: [], live: [] });
setLoadingCache({ videos: false, shorts: false, live: false });
setCurrentPageCache({ videos: 1, shorts: 1, live: 1 });
return;
}
const id = await youtubeService2.getChannelId();
if (id !== channelId) {
setChannelId(id);
setCurrentVideoId(null);
setVideosCache({ videos: [], shorts: [], live: [] });
setLoadingCache({ videos: false, shorts: false, live: false });
setCurrentPageCache({ videos: 1, shorts: 1, live: 1 });
setSelectedVideoIds( new Set());
setDownloadQueue([]);
setIsProcessingQueue(false);
setFailedDownloads( new Set());
setTotalDownloadedSize(0);
setCompletedDownloads(0);
}
};
const fetchVideos = async (tabType) => {
if (!channelId) return;
if (abortControllers[tabType]) {
abortControllers[tabType].abort();
}
const controller = new AbortController();
setAbortControllers((prev) => ({ ...prev, [tabType]: controller }));
setLoadingCache((prev) => ({ ...prev, [tabType]: true }));
try {
const allVideos = [];
let continuation = void 0;
let pageCount = 0;
const maxPages = 100;
const TAB_TYPE_PARAMS2 = {
videos: "EgZ2aWRlb3PyBgQKAjoA",
shorts: "EgZzaG9ydHPyBgUKA5oBAA%3D%3D",
live: "EgdzdHJlYW1z8gYECgJ6AA%3D%3D"
};
do {
if (controller.signal.aborted) {
break;
}
if (activeTab.value !== "ddl" || !isPanelVisible.value) {
break;
}
const params = TAB_TYPE_PARAMS2[tabType];
const response = await innerTubeRequest(
"/youtubei/v1/browse",
{
browseId: channelId,
params,
continuation
},
controller.signal
);
const items = parseTabData(tabType, response);
const parsedVideos = parseVideos(items, tabType);
allVideos.push(...parsedVideos);
const filteredVideos = tabType === "live" ? allVideos.filter((v) => v.duration && v.duration !== "0:00") : allVideos;
setVideosCache((prev) => ({ ...prev, [tabType]: filteredVideos }));
continuation = getContinuation(response, tabType);
pageCount++;
if (!continuation || pageCount >= maxPages) break;
await new Promise((resolve) => setTimeout(resolve, 100));
} while (continuation);
} catch (error) {
if (error.name !== "AbortError") {
console.error("[DDL] Error fetching videos:", error);
}
} finally {
setLoadingCache((prev) => ({ ...prev, [tabType]: false }));
setAbortControllers((prev) => ({ ...prev, [tabType]: null }));
}
};
const innerTubeRequest = async (endpoint, data, signal2) => {
const INNERTUBE_API_KEY2 = "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8";
const url = `https://www.youtube.com${endpoint}?key=${INNERTUBE_API_KEY2}&prettyPrint=false`;
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-YouTube-Client-Name": "1",
"X-YouTube-Client-Version": "2.20201209.01.00"
},
body: JSON.stringify({
context: {
client: {
clientName: "WEB",
clientVersion: "2.20201209.01.00",
hl: "en",
gl: "US"
}
},
...data
}),
signal: signal2
});
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
return await response.json();
};
const getContinuation = (data, tabType) => {
const TAB_TYPE_PARAMS2 = {
videos: "EgZ2aWRlb3PyBgQKAjoA",
shorts: "EgZzaG9ydHPyBgUKA5oBAA%3D%3D",
live: "EgdzdHJlYW1z8gYECgJ6AA%3D%3D"
};
if (tabType === "shorts") {
const tab2 = data.contents?.twoColumnBrowseResultsRenderer?.tabs?.find(
(t) => t.tabRenderer?.endpoint?.browseEndpoint?.params === TAB_TYPE_PARAMS2[tabType]
);
const contents = tab2?.tabRenderer?.content?.richGridRenderer?.contents || [];
const continuationItem = contents.find(
(c) => c.continuationItemRenderer
);
if (continuationItem) {
return continuationItem.continuationItemRenderer?.continuationEndpoint?.continuationCommand?.token;
}
const continuationItems = data.onResponseReceivedActions?.[0]?.appendContinuationItemsAction?.continuationItems || data.onResponseReceivedEndpoints?.[0]?.appendContinuationItemsAction?.continuationItems || [];
const contItem = continuationItems.find(
(c) => c.continuationItemRenderer
);
if (contItem) {
return contItem.continuationItemRenderer?.continuationEndpoint?.continuationCommand?.token;
}
return void 0;
}
const tab = data.contents?.twoColumnBrowseResultsRenderer?.tabs?.find(
(t) => t.tabRenderer?.endpoint?.browseEndpoint?.params === TAB_TYPE_PARAMS2[tabType]
);
const items = tab?.tabRenderer?.content?.richGridRenderer?.contents || data.onResponseReceivedActions?.[0]?.appendContinuationItemsAction?.continuationItems || data.onResponseReceivedEndpoints?.[0]?.appendContinuationItemsAction?.continuationItems || [];
const continuation = items[items.length - 1];
const renderer = continuation?.continuationItemRenderer;
if (!renderer) return void 0;
return renderer?.continuationEndpoint?.continuationCommand?.token;
};
const parseTabData = (tabType, data) => {
const TAB_TYPE_PARAMS2 = {
videos: "EgZ2aWRlb3PyBgQKAjoA",
shorts: "EgZzaG9ydHPyBgUKA5oBAA%3D%3D",
live: "EgdzdHJlYW1z8gYECgJ6AA%3D%3D"
};
const tab = data.contents?.twoColumnBrowseResultsRenderer?.tabs?.find(
(t) => t.tabRenderer?.endpoint?.browseEndpoint?.params === TAB_TYPE_PARAMS2[tabType]
);
if (tabType === "shorts" && tab?.tabRenderer?.content?.richGridRenderer) {
const contents = tab.tabRenderer.content.richGridRenderer.contents || [];
return contents.map((c) => c.richItemRenderer?.content || c).filter((c) => c.shortsLockupViewModel || c.reelItemRenderer);
}
if (tabType === "shorts" && (data.onResponseReceivedActions || data.onResponseReceivedEndpoints)) {
const continuationItems = data.onResponseReceivedActions?.[0]?.appendContinuationItemsAction?.continuationItems || data.onResponseReceivedEndpoints?.[0]?.appendContinuationItemsAction?.continuationItems || [];
return continuationItems.map((c) => c.richItemRenderer?.content || c).filter((c) => c.shortsLockupViewModel || c.reelItemRenderer);
}
if (tab?.tabRenderer?.content?.richGridRenderer?.contents) {
const contents = tab.tabRenderer.content.richGridRenderer.contents;
return contents.map((c) => c.richItemRenderer?.content || c);
}
if (data.onResponseReceivedActions?.[0]?.appendContinuationItemsAction?.continuationItems) {
const items = data.onResponseReceivedActions[0].appendContinuationItemsAction.continuationItems;
return items.map((c) => c.richItemRenderer?.content || c);
}
if (data.onResponseReceivedEndpoints?.[0]?.appendContinuationItemsAction?.continuationItems) {
const items = data.onResponseReceivedEndpoints[0].appendContinuationItemsAction.continuationItems;
return items;
}
return [];
};
const parseVideos = (items, tabType) => {
if (tabType === "shorts") {
return items.filter((item) => item.shortsLockupViewModel || item.reelItemRenderer).map((item) => {
const lockup = item.shortsLockupViewModel;
if (lockup) {
const videoId = lockup.onTap?.innertubeCommand?.reelWatchEndpoint?.videoId;
const title = lockup.overlayMetadata?.primaryText?.content || "Untitled";
return {
videoId,
title,
thumbnail: `https://i.ytimg.com/vi/${videoId}/mqdefault.jpg`
};
}
const renderer = item.reelItemRenderer;
return {
videoId: renderer.videoId,
title: renderer.headline?.simpleText || "Untitled",
thumbnail: `https://i.ytimg.com/vi/${renderer.videoId}/mqdefault.jpg`
};
}).filter((v) => v.videoId);
}
return items.filter((item) => item.videoRenderer).map((item) => {
const renderer = item.videoRenderer;
return {
videoId: renderer.videoId,
title: renderer.title?.runs?.[0]?.text || renderer.title?.simpleText || "Untitled",
thumbnail: renderer.thumbnail?.thumbnails?.[0]?.url || `https://i.ytimg.com/vi/${renderer.videoId}/mqdefault.jpg`,
duration: renderer.lengthText?.simpleText || "",
publishedTime: renderer.publishedTimeText?.simpleText || ""
};
}).filter((v) => v.videoId);
};
const gmXmlHttpRequest = (options2) => {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
...options2,
onload: (response) => {
if (options2.onload) options2.onload(response);
resolve(response);
},
onerror: (error) => {
if (options2.onerror) options2.onerror(error);
reject(error);
},
ontimeout: () => {
if (options2.ontimeout) options2.ontimeout();
reject(new Error("Request timeout"));
}
});
});
};
const downloadVideo = async (videoId, title) => {
setDownloadingIds((prev) => new Set(prev).add(videoId));
try {
const videoUrl = `https://www.youtube.com/watch?v=${videoId}`;
const keyResponse = await gmXmlHttpRequest({
method: "GET",
url: API_KEY_URL,
headers: REQUEST_HEADERS
});
if (keyResponse.status !== 200) {
throw new Error(`Failed to get API key: ${keyResponse.status}`);
}
const keyData = JSON.parse(keyResponse.responseText);
if (!keyData || !keyData.key) {
throw new Error("Failed to get API key");
}
const key = keyData.key;
let payload;
if (format === "video") {
const codec = parseInt(quality) > 1080 ? "vp9" : "h264";
payload = {
link: videoUrl,
format: "mp4",
audioBitrate: "128",
videoQuality: quality,
filenameStyle: "pretty",
vCodec: codec
};
} else {
payload = {
link: videoUrl,
format: "mp3",
audioBitrate,
filenameStyle: "pretty"
};
}
const customHeaders = {
...REQUEST_HEADERS,
key
};
const downloadResponse = await gmXmlHttpRequest({
method: "POST",
url: API_CONVERT_URL,
headers: customHeaders,
data: JSON.stringify(payload)
});
if (downloadResponse.status !== 200) {
throw new Error(`Conversion failed: ${downloadResponse.status}`);
}
const apiDownloadInfo = JSON.parse(downloadResponse.responseText);
if (apiDownloadInfo.url) {
await new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "GET",
url: apiDownloadInfo.url,
responseType: "blob",
headers: {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36",
Referer: "https://iframe.y2meta-uk.com/",
Accept: "*/*"
},
onprogress: (progress) => {
setDownloadProgress((prev) => ({
...prev,
[videoId]: {
loaded: progress.loaded,
total: progress.total
}
}));
},
onload: (response) => {
if (response.status === 200 && response.response) {
const blob = response.response;
if (blob.size === 0) {
reject(new Error("Downloaded file is 0 bytes"));
return;
}
const blobUrl = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = blobUrl;
const filename = apiDownloadInfo.filename || `${title}.${format === "video" ? "mp4" : "mp3"}`;
a.download = sanitizeFilename(filename);
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(blobUrl);
setFailedDownloads((prev) => {
const newSet = new Set(prev);
newSet.delete(videoId);
return newSet;
});
setTotalDownloadedSize((prev) => prev + blob.size);
setCompletedDownloads((prev) => prev + 1);
setSuccessfulDownloads((prev) => prev + 1);
setSuccessfulVideoIds((prev) => new Set(prev).add(videoId));
resolve();
} else {
reject(new Error(`Download failed: ${response.status}`));
}
},
onerror: () => reject(new Error("Download failed")),
ontimeout: () => reject(new Error("Download timeout"))
});
});
} else {
throw new Error("No download URL received");
}
} catch (error) {
console.error("[DDL] Download error:", error);
playErrorSound();
setErrorMessage(`Failed to download: ${error}`);
setTimeout(() => setErrorMessage(""), 1e3);
setFailedDownloads((prev) => new Set(prev).add(videoId));
} finally {
setDownloadingIds((prev) => {
const newSet = new Set(prev);
newSet.delete(videoId);
return newSet;
});
setDownloadProgress((prev) => {
const newProgress = { ...prev };
delete newProgress[videoId];
return newProgress;
});
}
};
const processDownloadQueue = async () => {
if (isProcessingQueue || downloadQueue.length === 0) return;
setIsProcessingQueue(true);
for (const videoId of downloadQueue) {
let video;
for (const type of ["videos", "shorts", "live"]) {
video = videosCache[type].find((v) => v.videoId === videoId);
if (video) break;
}
if (video) {
await downloadVideo(videoId, video.title);
await new Promise((resolve) => setTimeout(resolve, 1e3));
}
}
setDownloadQueue([]);
setIsProcessingQueue(false);
setBulkDownloadCompleted(true);
};
const retryFailedDownloads = () => {
const failedIds = Array.from(failedDownloads);
setDownloadQueue(failedIds);
setTotalDownloadedSize(0);
setCompletedDownloads(0);
setSuccessfulDownloads(0);
setBulkDownloadCompleted(false);
};
const clearFailedDownloads = () => {
setFailedDownloads( new Set());
setBulkDownloadCompleted(false);
setShowFailedVideos(false);
setSelectedVideoIds( new Set());
setTotalDownloadedSize(0);
setCompletedDownloads(0);
setSuccessfulDownloads(0);
setSuccessfulVideoIds( new Set());
};
const startBulkDownload = () => {
const selectedIds = Array.from(selectedVideoIds);
setDownloadQueue(selectedIds);
setTotalDownloadedSize(0);
setCompletedDownloads(0);
setSuccessfulDownloads(0);
setBulkDownloadCompleted(false);
setShowFailedVideos(false);
setFailedDownloads( new Set());
setSuccessfulVideoIds( new Set());
};
const toggleVideoSelection = (videoId) => {
setSelectedVideoIds((prev) => {
const newSet = new Set(prev);
if (newSet.has(videoId)) {
newSet.delete(videoId);
} else {
newSet.add(videoId);
}
return newSet;
});
};
const toggleSelectAll = (allVideos) => {
const allSelected = allVideos.every(
(v) => selectedVideoIds.has(v.videoId)
);
setSelectedVideoIds((prev) => {
const newSet = new Set(prev);
allVideos.forEach((v) => {
if (allSelected) {
newSet.delete(v.videoId);
} else {
newSet.add(v.videoId);
}
});
return newSet;
});
};
hooks.useEffect(() => {
if (downloadQueue.length > 0 && !isProcessingQueue) {
processDownloadQueue();
}
}, [downloadQueue]);
hooks.useEffect(() => {
if (activeTab.value !== "ddl") {
Object.values(abortControllers).forEach((controller) => {
if (controller) {
controller.abort();
}
});
return;
}
loadDDLSettings();
loadChannelInfo();
loadPerPageSetting();
const checkUrlChange = () => {
const currentHandle = youtubeService2.getChannelHandleFromURL();
if (currentHandle !== youtubeService2.getChannelHandle()) {
youtubeService2.clearCache();
loadChannelInfo();
}
if (isWatchPage() && currentVideoId) {
const newTitle = getVideoTitle2();
if (newTitle !== currentVideoTitle) {
setCurrentVideoTitle(newTitle);
}
}
};
const handleSettingsUpdate = () => {
loadPerPageSetting();
};
window.addEventListener("settings-updated", handleSettingsUpdate);
const intervalId = setInterval(checkUrlChange, 1e3);
return () => {
clearInterval(intervalId);
window.removeEventListener("settings-updated", handleSettingsUpdate);
Object.values(abortControllers).forEach((controller) => {
if (controller) {
controller.abort();
}
});
};
}, [activeTab.value, currentVideoId, currentVideoTitle]);
const loadPerPageSetting = async () => {
const perPage = await storage.get("ddl-per-page", "8");
setVideosPerPage(parseInt(perPage));
};
const loadDDLSettings = async () => {
const contentTab = await storage.get("ddl-contentTab", "videos");
setActiveContentTab(contentTab);
const fmt = await storage.get("ddl-format", "video");
setFormat(fmt);
const qual = await storage.get("ddl-videoQuality", "1080");
setQuality(qual);
const bitrate = await storage.get("ddl-audioBitrate", "320");
setAudioBitrate(bitrate);
};
hooks.useEffect(() => {
if (channelId && activeTab.value === "ddl" && isPanelVisible.value && isChannelPage()) {
if (videosCache.videos.length === 0 && !loadingCache.videos) {
fetchVideos("videos");
}
if (videosCache.shorts.length === 0 && !loadingCache.shorts) {
fetchVideos("shorts");
}
if (videosCache.live.length === 0 && !loadingCache.live) {
fetchVideos("live");
}
}
}, [channelId, activeTab.value, isPanelVisible.value]);
hooks.useEffect(() => {
if (activeTab.value === "ddl" && isPanelVisible.value && isWatchPage() && currentVideoId && !currentVideoDuration && !loadingVideoInfo) {
fetchVideoInfo(currentVideoId);
}
}, [
activeTab.value,
isPanelVisible.value,
currentVideoId,
currentVideoDuration,
loadingVideoInfo
]);
if (isWatchPage() && currentVideoId) {
return u("div", { className: "space-y-4", children: [
errorMessage && u("div", { role: "alert", className: "alert alert-error alert-soft", children: [
u(IconCircleX, { className: "size-6 shrink-0" }),
u("span", { className: "text-xl", children: errorMessage })
] }),
u("div", { className: "bg-base-200 rounded-lg p-4 space-y-3", children: [
u("div", { className: "flex gap-2", children: [
u(
"button",
{
className: `btn btn-lg flex-1 ${format === "video" ? "btn-secondary" : "btn-ghost"}`,
onClick: () => {
setFormat("video");
storage.set("ddl-format", "video");
},
children: [
u(IconVideo, { className: "size-[1.8em]" }),
u("span", { className: "text-xl", children: "Video" })
]
}
),
u(
"button",
{
className: `btn btn-lg flex-1 ${format === "audio" ? "btn-accent" : "btn-ghost"}`,
onClick: () => {
setFormat("audio");
storage.set("ddl-format", "audio");
},
children: [
u(IconMusic, { className: "size-[1.8em]" }),
u("span", { className: "text-xl", children: "Audio" })
]
}
)
] }),
format === "video" ? u(
"select",
{
className: "select select-bordered select-lg w-full text-xl",
value: quality,
onChange: (e) => {
const value = e.target.value;
setQuality(value);
storage.set("ddl-videoQuality", value);
},
children: videoQualities.map((q2) => u("option", { value: q2, children: [
q2,
"p ",
parseInt(q2) > 1080 ? ".webm" : ".mp4"
] }, q2))
}
) : u(
"select",
{
className: "select select-bordered select-lg w-full text-xl",
value: audioBitrate,
onChange: (e) => {
const value = e.target.value;
setAudioBitrate(value);
storage.set("ddl-audioBitrate", value);
},
children: audioQualities.map((q2) => u("option", { value: q2, children: [
q2,
" kbps"
] }, q2))
}
)
] }),
u("div", { className: "bg-base-200 rounded-lg p-4 space-y-3", children: [
u("div", { className: "w-full", children: u("div", { className: "aspect-video rounded overflow-hidden relative", children: [
u(
"img",
{
src: `https://i.ytimg.com/vi/${currentVideoId}/mqdefault.jpg`,
alt: currentVideoTitle,
className: "w-full h-full object-cover"
}
),
currentVideoDuration && u("div", { className: "absolute bottom-2 right-2 bg-black bg-opacity-80 text-white px-2 py-1 rounded text-lg font-semibold", children: currentVideoDuration })
] }) }),
u("div", { className: "space-y-2", children: [
u("h3", { className: "text-xl font-semibold line-clamp-2", children: currentVideoTitle || "Current Video" }),
loadingVideoInfo ? u("div", { className: "flex items-center gap-2", children: [
u("span", { className: "loading loading-spinner loading-sm" }),
u("span", { className: "text-lg opacity-60", children: "Loading info..." })
] }) : currentVideoViews && u("p", { className: "text-lg opacity-60", children: currentVideoViews })
] }),
downloadingIds.has(currentVideoId) && u("div", { className: "space-y-1", children: [
u("progress", { className: "progress progress-primary w-full h-2" }),
downloadProgress[currentVideoId] && u("p", { className: "text-lg opacity-60 text-center", children: [
formatBytes(downloadProgress[currentVideoId].loaded),
downloadProgress[currentVideoId].total > 0 && ` / ${formatBytes(
downloadProgress[currentVideoId].total
)}`
] })
] }),
failedDownloads.has(currentVideoId) && u("div", { className: "flex justify-center", children: u("span", { className: "badge badge-error badge-lg", children: "Failed to download" }) }),
u("div", { className: "flex gap-2", children: [
u(
"button",
{
className: "btn btn-lg btn-secondary",
onClick: () => fetchSubtitles(currentVideoId),
disabled: loadingSubtitles,
children: loadingSubtitles ? u("span", { className: "loading loading-spinner loading-md" }) : u(IconBadgeCc, { className: "size-[1.8em]" })
}
),
u(
"button",
{
className: "btn btn-lg btn-primary flex-1",
onClick: () => downloadVideo(currentVideoId, currentVideoTitle),
disabled: downloadingIds.has(currentVideoId),
children: downloadingIds.has(currentVideoId) ? u(preact.Fragment, { children: [
u("span", { className: "loading loading-spinner loading-md" }),
u("span", { className: "text-xl", children: "Downloading..." })
] }) : u(preact.Fragment, { children: [
u(IconDownload, { className: "size-[1.8em]" }),
u("span", { className: "text-xl", children: "Download" })
] })
}
)
] })
] })
] });
}
if (!isChannelPage()) {
return u("div", { className: "text-center py-8", children: u("p", { className: "text-xl opacity-60", children: "Navigate to a YouTube channel or video to download" }) });
}
if (!channelId) {
return u("div", { className: "text-center py-8", children: u("span", { className: "loading loading-spinner loading-lg" }) });
}
const totalPages = Math.ceil(videos.length / videosPerPage);
const startIndex = (currentPage - 1) * videosPerPage;
const endIndex = startIndex + videosPerPage;
const currentVideos = videos.slice(startIndex, endIndex);
return u("div", { className: "space-y-4", children: [
errorMessage && u("div", { role: "alert", className: "alert alert-error alert-soft", children: [
u(IconCircleX, { className: "size-6 shrink-0" }),
u("span", { className: "text-xl", children: errorMessage })
] }),
u("div", { className: "bg-base-200 rounded-lg p-4 space-y-3", children: [
u("div", { className: "flex gap-2", children: [
u(
"button",
{
className: `btn btn-lg flex-1 ${format === "video" ? "btn-secondary" : "btn-ghost"}`,
onClick: () => {
setFormat("video");
storage.set("ddl-format", "video");
},
children: [
u(IconVideo, { className: "size-[1.8em]" }),
u("span", { className: "text-xl", children: "Video" })
]
}
),
u(
"button",
{
className: `btn btn-lg flex-1 ${format === "audio" ? "btn-accent" : "btn-ghost"}`,
onClick: () => {
setFormat("audio");
storage.set("ddl-format", "audio");
},
children: [
u(IconMusic, { className: "size-[1.8em]" }),
u("span", { className: "text-xl", children: "Audio" })
]
}
)
] }),
format === "video" ? u(
"select",
{
className: "select select-bordered select-lg w-full text-xl",
value: quality,
onChange: (e) => {
const value = e.target.value;
setQuality(value);
storage.set("ddl-videoQuality", value);
},
children: videoQualities.map((q2) => u("option", { value: q2, children: [
q2,
"p ",
parseInt(q2) > 1080 ? ".webm" : ".mp4"
] }, q2))
}
) : u(
"select",
{
className: "select select-bordered select-lg w-full text-xl",
value: audioBitrate,
onChange: (e) => {
const value = e.target.value;
setAudioBitrate(value);
storage.set("ddl-audioBitrate", value);
},
children: audioQualities.map((q2) => u("option", { value: q2, children: [
q2,
" kbps"
] }, q2))
}
)
] }),
u("div", { role: "tablist", className: "tabs tabs-border bg-base-200 text-xl h-14", children: [
u(
"button",
{
role: "tab",
className: `tab text-xl h-14 ${activeContentTab === "videos" ? "tab-active" : ""}`,
onClick: () => {
setActiveContentTab("videos");
storage.set("ddl-contentTab", "videos");
},
children: [
"Videos",
" ",
videosCache.videos.length > 0 && `(${videosCache.videos.length.toLocaleString()})`
]
}
),
u(
"button",
{
role: "tab",
className: `tab text-xl h-14 ${activeContentTab === "shorts" ? "tab-active" : ""}`,
onClick: () => {
setActiveContentTab("shorts");
storage.set("ddl-contentTab", "shorts");
},
children: [
"Shorts",
" ",
videosCache.shorts.length > 0 && `(${videosCache.shorts.length.toLocaleString()})`
]
}
),
u(
"button",
{
role: "tab",
className: `tab text-xl h-14 ${activeContentTab === "live" ? "tab-active" : ""}`,
onClick: () => {
setActiveContentTab("live");
storage.set("ddl-contentTab", "live");
},
children: [
"Live",
" ",
videosCache.live.length > 0 && `(${videosCache.live.length.toLocaleString()})`
]
}
)
] }),
videos.length > 0 && u("div", { className: "space-y-3", children: [
u("div", { className: "flex items-center justify-between gap-3", children: [
u("label", { className: "flex items-center gap-2 cursor-pointer", children: [
u(
"input",
{
type: "checkbox",
className: "checkbox checkbox-primary checkbox-lg",
checked: videos.length > 0 && videos.every((v) => selectedVideoIds.has(v.videoId)),
onChange: () => toggleSelectAll(videos)
}
),
u("span", { className: "text-xl", children: [
"Select All (",
videos.length.toLocaleString(),
")"
] })
] }),
selectedVideoIds.size > 0 && u(
"button",
{
className: "btn btn-primary",
onClick: startBulkDownload,
disabled: isProcessingQueue,
children: isProcessingQueue ? u(preact.Fragment, { children: [
u("span", { className: "loading loading-spinner loading-md" }),
u("span", { children: "Downloading..." })
] }) : u("span", { children: [
"Download (",
selectedVideoIds.size.toLocaleString(),
")"
] })
}
)
] }),
isProcessingQueue && u("div", { className: "space-y-2", children: [
u(
"progress",
{
className: "progress progress-primary w-full",
value: completedDownloads,
max: downloadQueue.length
}
),
u("div", { className: "flex items-center justify-between", children: [
u("span", { className: "text-lg", children: formatBytes(totalDownloadedSize) }),
u("span", { className: "text-lg", children: [
completedDownloads,
"/",
downloadQueue.length
] })
] })
] }),
bulkDownloadCompleted && u("div", { className: "bg-base-200 rounded-lg p-4", children: u("div", { className: "flex items-start justify-between gap-4", children: [
u("div", { className: "flex-1", children: [
u("h3", { className: "text-lg font-semibold mb-3", children: "Download Summary" }),
u("div", { className: "space-y-2", children: [
u("div", { className: "flex items-center gap-2", children: [
u(IconCircleCheck, { className: "size-5 text-success" }),
u("span", { className: "text-lg", children: [
"Success: ",
successfulDownloads,
" video",
successfulDownloads !== 1 ? "s" : ""
] })
] }),
u("div", { className: "flex items-center gap-2", children: [
u(IconCircleX, { className: "size-5 text-error" }),
u("span", { className: "text-lg", children: [
"Failed: ",
failedDownloads.size,
" video",
failedDownloads.size !== 1 ? "s" : ""
] })
] })
] })
] }),
u("div", { className: "flex flex-col gap-2", children: [
u("div", { className: "flex gap-2 justify-end", children: [
u(
"div",
{
className: "tooltip tooltip-left",
"data-tip": showFailedVideos ? "Hide Failed" : "Show Failed",
children: u(
"button",
{
className: "btn btn-square btn-neutral",
onClick: () => setShowFailedVideos(!showFailedVideos),
children: u(IconEye, { className: "size-[1.8em]" })
}
)
}
),
u(
"div",
{
className: "tooltip tooltip-left",
"data-tip": "Clear Summary",
children: u(
"button",
{
className: "btn btn-square btn-error",
onClick: clearFailedDownloads,
children: u(IconCircleX, { className: "size-[1.8em]" })
}
)
}
)
] }),
failedDownloads.size > 0 && u(
"button",
{
className: "btn btn-primary",
onClick: retryFailedDownloads,
children: [
u(IconRefresh, { className: "size-[1.8em]" }),
u("span", { children: "Retry Failed" })
]
}
)
] })
] }) })
] }),
loading && videos.length === 0 && u("div", { className: "text-center py-8", children: [
u("span", { className: "loading loading-spinner loading-lg" }),
u("p", { className: "text-xl opacity-60 mt-4", children: "Loading videos..." })
] }),
videos.length > 0 && u(preact.Fragment, { children: [
u("div", { className: "space-y-3", children: currentVideos.filter(
(video) => showFailedVideos ? failedDownloads.has(video.videoId) : true
).map((video) => {
let bgClass = "bg-base-200";
if (failedDownloads.has(video.videoId)) {
bgClass = "alert alert-error alert-soft";
} else if (successfulVideoIds.has(video.videoId)) {
bgClass = "alert alert-success alert-soft";
}
return u(
"div",
{
className: `${bgClass} rounded-lg p-4`,
children: u("div", { className: "flex items-start gap-3", children: [
u("div", { className: "shrink-0", style: { width: "120px" }, children: [
u("div", { className: "aspect-video rounded overflow-hidden mb-1 relative", children: [
u(
"img",
{
src: video.thumbnail,
alt: video.title,
className: "w-full h-full object-cover"
}
),
u("div", { className: "absolute top-1 left-1", children: u(
"input",
{
type: "checkbox",
className: "checkbox checkbox-primary checkbox-lg",
checked: selectedVideoIds.has(video.videoId),
onChange: () => toggleVideoSelection(video.videoId),
onClick: (e) => e.stopPropagation()
}
) })
] }),
downloadingIds.has(video.videoId) && u("div", { children: [
u("progress", { className: "progress progress-primary w-full h-1" }),
downloadProgress[video.videoId] && u("p", { className: "text-lg opacity-60 mt-1", children: formatBytes(
downloadProgress[video.videoId].loaded
) })
] }),
failedDownloads.has(video.videoId) && u("span", { className: "badge badge-error text-sm", children: "Failed" }),
successfulVideoIds.has(video.videoId) && u("span", { className: "badge badge-success text-sm", children: "Success" })
] }),
u("div", { className: "flex-1 min-w-0 space-y-2", children: [
u("h3", { className: "text-lg font-medium line-clamp-2", children: video.title }),
u("div", { className: "flex items-center justify-between gap-2", children: [
video.duration && u("p", { className: "text-lg opacity-60", children: video.duration }),
u("div", { className: "flex gap-2 shrink-0", children: [
u(
"button",
{
className: "btn btn-square btn-secondary",
onClick: () => fetchSubtitles(video.videoId),
disabled: loadingSubtitles && subtitleVideoId === video.videoId,
children: loadingSubtitles && subtitleVideoId === video.videoId ? u("span", { className: "loading loading-spinner loading-sm" }) : u(IconBadgeCc, { className: "size-[1.8em]" })
}
),
u(
"button",
{
className: "btn btn-square btn-primary",
onClick: () => downloadVideo(video.videoId, video.title),
disabled: downloadingIds.has(video.videoId),
children: downloadingIds.has(video.videoId) ? u("span", { className: "loading loading-spinner loading-sm" }) : u(IconDownload, { className: "size-[1.8em]" })
}
)
] })
] })
] })
] })
},
video.videoId
);
}) }),
totalPages > 1 && u("div", { className: "flex justify-center", children: u("div", { className: "join", children: [
u(
"button",
{
className: "join-item btn btn-lg",
disabled: currentPage === 1,
onClick: () => setCurrentPageCache((prev) => ({
...prev,
[activeContentTab]: currentPage - 1
})),
children: "«"
}
),
u("button", { className: "join-item btn btn-lg", children: [
currentPage,
"/",
totalPages
] }),
u(
"button",
{
className: "join-item btn btn-lg",
disabled: currentPage === totalPages,
onClick: () => setCurrentPageCache((prev) => ({
...prev,
[activeContentTab]: currentPage + 1
})),
children: "»"
}
)
] }) })
] }),
!loading && videos.length === 0 && u("div", { className: "text-center py-8", children: u("p", { className: "text-xl opacity-60", children: [
"No ",
activeContentTab,
" found"
] }) })
] });
}
const THEMES = [
"light",
"dark",
"cupcake",
"bumblebee",
"emerald",
"corporate",
"synthwave",
"retro",
"cyberpunk",
"valentine",
"halloween",
"garden",
"forest",
"aqua",
"lofi",
"pastel",
"fantasy",
"wireframe",
"black",
"luxury",
"dracula",
"cmyk",
"autumn",
"business",
"acid",
"lemonade",
"night",
"coffee",
"winter",
"dim",
"nord",
"sunset",
"abyss",
"caramellatte",
"silk"
];
function ThemeSelector() {
const dropdownRef = hooks.useRef(null);
return u("div", { className: "form-control", ref: dropdownRef, children: [
u("label", { className: "label", children: u("span", { className: "label-text text-xl font-medium", children: "Theme" }) }),
u("div", { className: "dropdown dropdown-end block w-full", children: [
u(
"div",
{
tabIndex: 0,
role: "button",
className: "btn btn-sm gap-2 w-full justify-start text-xl h-auto min-h-12 py-2",
children: [
u("div", { className: "bg-base-100 border-base-content/10 grid shrink-0 grid-cols-2 gap-0.5 rounded-md border p-1", children: [
u("div", { className: "bg-base-content size-1.5 rounded-full" }),
u("div", { className: "bg-primary size-1.5 rounded-full" }),
u("div", { className: "bg-secondary size-1.5 rounded-full" }),
u("div", { className: "bg-accent size-1.5 rounded-full" })
] }),
u("div", { className: "flex-1 truncate text-left capitalize text-xl", children: currentTheme.value }),
u(
"svg",
{
width: "20px",
height: "20px",
className: "size-5 fill-current opacity-60",
xmlns: "http://www.w3.org/2000/svg",
viewBox: "0 0 2048 2048",
children: u("path", { d: "M1799 349l242 241-1017 1017L7 590l242-241 775 775 775-775z" })
}
)
]
}
),
u(
"div",
{
tabIndex: 0,
className: "dropdown-content bg-base-200 text-base-content rounded-box mt-2 w-full max-h-96 overflow-y-auto border border-white/5 shadow-2xl outline outline-black/5",
children: u("ul", { className: "menu w-full text-xl", children: [
u("li", { className: "menu-title text-xl", children: "Change Theme" }),
THEMES.map((theme) => u("li", { children: u(
"button",
{
className: `gap-2 px-2 py-1.5 text-xl ${theme === currentTheme.value ? "[&_svg]:visible" : ""}`,
onClick: () => {
currentTheme.value = theme;
storage.set("tubeinsights-theme", theme);
const activeElement = document.activeElement;
if (activeElement) {
activeElement.blur();
}
window.dispatchEvent(new CustomEvent("themeChanged"));
},
children: [
u(
"div",
{
"data-theme": theme,
className: "bg-base-100 grid shrink-0 grid-cols-2 gap-0.5 rounded-md p-1 shadow-sm",
children: [
u("div", { className: "bg-base-content size-1.5 rounded-full" }),
u("div", { className: "bg-primary size-1.5 rounded-full" }),
u("div", { className: "bg-secondary size-1.5 rounded-full" }),
u("div", { className: "bg-accent size-1.5 rounded-full" })
]
}
),
u("span", { className: "flex-1 truncate capitalize text-left text-xl", children: theme }),
u(
"svg",
{
xmlns: "http://www.w3.org/2000/svg",
width: "20",
height: "20",
viewBox: "0 0 24 24",
fill: "currentColor",
className: "invisible h-5 w-5 shrink-0",
children: u("path", { d: "M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z" })
}
)
]
}
) }, theme))
] })
}
)
] })
] });
}
function SettingsTab() {
const [bookmarkPerPage, setBookmarkPerPage] = hooks.useState(10);
const [ddlPerPage, setDdlPerPage] = hooks.useState(10);
const [width, setWidth] = hooks.useState(350);
const [showResetDialog, setShowResetDialog] = hooks.useState(false);
const resetDialogRef = hooks.useRef(null);
const [widthApplied, setWidthApplied] = hooks.useState(false);
const [bookmarkApplied, setBookmarkApplied] = hooks.useState(false);
const [ddlApplied, setDdlApplied] = hooks.useState(false);
const [loopVideo, setLoopVideo] = hooks.useState(moduleSettings.value.loopVideo);
const [screenshotVideo, setScreenshotVideo] = hooks.useState(
moduleSettings.value.screenshotVideo
);
const [screenshotFormat, setScreenshotFormat] = hooks.useState(
moduleSettings.value.screenshotFormat
);
const [screenshotDownload, setScreenshotDownload] = hooks.useState(
moduleSettings.value.screenshotDownload
);
const [screenshotCopy, setScreenshotCopy] = hooks.useState(
moduleSettings.value.screenshotCopy
);
hooks.useEffect(() => {
loadSettings2();
}, []);
const loadSettings2 = async () => {
const bookmark = await storage.get("bookmark-per-page", "10");
setBookmarkPerPage(parseInt(bookmark));
const ddl = await storage.get("ddl-per-page", "10");
setDdlPerPage(parseInt(ddl));
const savedWidth = await storage.get("tubeinsights-panelWidth", "350");
setWidth(parseInt(savedWidth));
const loopVideoSaved = await storage.get("module-loop-video", "true");
setLoopVideo(loopVideoSaved === "true");
const screenshotVideoSaved = await storage.get(
"module-screenshot-video",
"true"
);
setScreenshotVideo(screenshotVideoSaved === "true");
const screenshotFormatSaved = await storage.get(
"module-screenshot-format",
"png"
);
setScreenshotFormat(screenshotFormatSaved);
const screenshotDownloadSaved = await storage.get(
"module-screenshot-download",
"true"
);
setScreenshotDownload(screenshotDownloadSaved === "true");
const screenshotCopySaved = await storage.get(
"module-screenshot-copy",
"true"
);
setScreenshotCopy(screenshotCopySaved === "true");
};
const handleBookmarkPerPageChange = async (value) => {
setBookmarkPerPage(value);
await storage.set("bookmark-per-page", value.toString());
window.dispatchEvent(new CustomEvent("settings-updated"));
setBookmarkApplied(true);
setTimeout(() => setBookmarkApplied(false), 500);
};
const handleDdlPerPageChange = async (value) => {
setDdlPerPage(value);
await storage.set("ddl-per-page", value.toString());
window.dispatchEvent(new CustomEvent("settings-updated"));
setDdlApplied(true);
setTimeout(() => setDdlApplied(false), 500);
};
const handleWidthChange = async (value) => {
setWidth(value);
panelWidth.value = value;
await storage.set("tubeinsights-panelWidth", value.toString());
setWidthApplied(true);
setTimeout(() => setWidthApplied(false), 500);
};
hooks.useEffect(() => {
if (showResetDialog && resetDialogRef.current) {
resetDialogRef.current.showModal();
}
}, [showResetDialog]);
const handleLoopVideoToggle = async (enabled) => {
setLoopVideo(enabled);
await storage.set("module-loop-video", enabled.toString());
moduleSettings.value = { ...moduleSettings.value, loopVideo: enabled };
window.dispatchEvent(new CustomEvent("module-settings-updated"));
};
const handleScreenshotVideoToggle = async (enabled) => {
setScreenshotVideo(enabled);
await storage.set("module-screenshot-video", enabled.toString());
moduleSettings.value = {
...moduleSettings.value,
screenshotVideo: enabled
};
window.dispatchEvent(new CustomEvent("module-settings-updated"));
};
const handleScreenshotFormatChange = async (format) => {
setScreenshotFormat(format);
await storage.set("module-screenshot-format", format);
moduleSettings.value = {
...moduleSettings.value,
screenshotFormat: format
};
window.dispatchEvent(new CustomEvent("module-settings-updated"));
};
const handleScreenshotDownloadToggle = async (enabled) => {
setScreenshotDownload(enabled);
await storage.set("module-screenshot-download", enabled.toString());
moduleSettings.value = {
...moduleSettings.value,
screenshotDownload: enabled
};
window.dispatchEvent(new CustomEvent("module-settings-updated"));
};
const handleScreenshotCopyToggle = async (enabled) => {
setScreenshotCopy(enabled);
await storage.set("module-screenshot-copy", enabled.toString());
moduleSettings.value = { ...moduleSettings.value, screenshotCopy: enabled };
window.dispatchEvent(new CustomEvent("module-settings-updated"));
};
const handleResetDefaults = async () => {
await storage.set("bookmark-per-page", "8");
await storage.set("ddl-per-page", "8");
await storage.set("tubeinsights-panelWidth", "350");
await storage.set("tubeinsights-theme", "light");
await storage.set("module-loop-video", "true");
await storage.set("module-screenshot-video", "true");
await storage.set("module-screenshot-format", "png");
await storage.set("module-screenshot-download", "true");
await storage.set("module-screenshot-copy", "true");
setBookmarkPerPage(8);
setDdlPerPage(8);
setWidth(350);
panelWidth.value = 350;
setLoopVideo(true);
setScreenshotVideo(true);
setScreenshotFormat("png");
setScreenshotDownload(true);
setScreenshotCopy(true);
moduleSettings.value = {
loopVideo: true,
screenshotVideo: true,
screenshotFormat: "png",
screenshotDownload: true,
screenshotCopy: true
};
window.dispatchEvent(new CustomEvent("settings-updated"));
window.dispatchEvent(new CustomEvent("module-settings-updated"));
resetDialogRef.current?.close();
setShowResetDialog(false);
};
return u("div", { className: "space-y-6", children: [
u("div", { children: [
u("h3", { className: "text-xl font-semibold mb-4", children: "Appearance" }),
u("div", { className: "space-y-4", children: [
u(ThemeSelector, {}),
u("div", { className: "bg-base-200 rounded-lg p-4", children: [
u("label", { className: "text-xl font-medium mb-3 block", children: "Panel Width (px)" }),
u("div", { className: "join w-full", children: [
u(
"input",
{
type: "number",
min: "300",
max: "600",
value: width,
onChange: (e) => setWidth(parseInt(e.target.value)),
className: "input input-bordered join-item flex-1 text-xl"
}
),
u(
"button",
{
className: `btn join-item ${widthApplied ? "btn-success" : "btn-neutral"}`,
onClick: () => handleWidthChange(width),
children: widthApplied ? u(IconCheck, { className: "size-[1.8em]" }) : "Apply"
}
)
] }),
u("p", { className: "text-lg opacity-60 mt-2", children: "Min: 300px, Max: 600px" })
] })
] })
] }),
u("div", { children: [
u("h3", { className: "text-xl font-semibold mb-4", children: "Pagination" }),
u("div", { className: "space-y-4", children: [
u("div", { className: "bg-base-200 rounded-lg p-4", children: [
u("label", { className: "text-xl font-medium mb-3 block", children: "Bookmark Items Per Page" }),
u("div", { className: "join w-full", children: [
u(
"input",
{
type: "number",
min: "5",
max: "50",
value: bookmarkPerPage,
onChange: (e) => setBookmarkPerPage(
parseInt(e.target.value)
),
className: "input input-bordered join-item flex-1 text-xl"
}
),
u(
"button",
{
className: `btn join-item ${bookmarkApplied ? "btn-success" : "btn-neutral"}`,
onClick: () => handleBookmarkPerPageChange(bookmarkPerPage),
children: bookmarkApplied ? u(IconCheck, { className: "size-[1.8em]" }) : "Apply"
}
)
] }),
u("p", { className: "text-lg opacity-60 mt-2", children: "Min: 5, Max: 50" })
] }),
u("div", { className: "bg-base-200 rounded-lg p-4", children: [
u("label", { className: "text-xl font-medium mb-3 block", children: "DDL Items Per Page" }),
u("div", { className: "join w-full", children: [
u(
"input",
{
type: "number",
min: "5",
max: "50",
value: ddlPerPage,
onChange: (e) => setDdlPerPage(parseInt(e.target.value)),
className: "input input-bordered join-item flex-1 text-xl"
}
),
u(
"button",
{
className: `btn join-item ${ddlApplied ? "btn-success" : "btn-neutral"}`,
onClick: () => handleDdlPerPageChange(ddlPerPage),
children: ddlApplied ? u(IconCheck, { className: "size-[1.8em]" }) : "Apply"
}
)
] }),
u("p", { className: "text-lg opacity-60 mt-2", children: "Min: 5, Max: 50" })
] })
] })
] }),
u("div", { children: [
u("h3", { className: "text-xl font-semibold mb-4", children: "Modules" }),
u("div", { className: "space-y-4", children: [
u("div", { className: "bg-base-200 rounded-lg p-4", children: [
u("div", { className: "flex items-center justify-between mb-2", children: [
u("label", { className: "text-xl font-medium", children: "Loop Video" }),
u(
"input",
{
type: "checkbox",
className: "toggle toggle-primary",
checked: loopVideo,
onChange: (e) => handleLoopVideoToggle(e.target.checked)
}
)
] }),
u("p", { className: "text-lg opacity-60", children: "Enable loop button on video player" })
] }),
u("div", { className: "bg-base-200 rounded-lg p-4", children: [
u("div", { className: "flex items-center justify-between mb-2", children: [
u("label", { className: "text-xl font-medium", children: "Screenshots Video" }),
u(
"input",
{
type: "checkbox",
className: "toggle toggle-primary",
checked: screenshotVideo,
onChange: (e) => handleScreenshotVideoToggle(
e.target.checked
)
}
)
] }),
u("p", { className: "text-lg opacity-60 mb-4", children: "Enable screenshot buttons on video player" }),
screenshotVideo && u("div", { className: "space-y-3 pl-4 border-l-2 border-base-300", children: [
u("div", { children: [
u("label", { className: "text-lg font-medium block mb-2", children: "Image Format" }),
u(
"select",
{
className: "select select-bordered w-full text-xl",
value: screenshotFormat,
onChange: (e) => handleScreenshotFormatChange(
e.target.value
),
children: [
u("option", { value: "png", children: "PNG" }),
u("option", { value: "jpg", children: "JPG" }),
u("option", { value: "webp", children: "WebP" })
]
}
)
] }),
u("div", { className: "flex items-center justify-between", children: [
u("label", { className: "text-lg", children: "Download Screenshot" }),
u(
"input",
{
type: "checkbox",
className: "toggle toggle-sm toggle-primary",
checked: screenshotDownload,
onChange: (e) => handleScreenshotDownloadToggle(
e.target.checked
)
}
)
] }),
u("div", { className: "flex items-center justify-between", children: [
u("label", { className: "text-lg", children: "Copy to Clipboard" }),
u(
"input",
{
type: "checkbox",
className: "toggle toggle-sm toggle-primary",
checked: screenshotCopy,
onChange: (e) => handleScreenshotCopyToggle(
e.target.checked
)
}
)
] })
] })
] })
] })
] }),
u("div", { children: [
u("h3", { className: "text-xl font-semibold mb-4", children: "Reset" }),
u(
"button",
{
className: "btn btn-error btn-lg w-full",
onClick: () => setShowResetDialog(true),
children: "Reset to Default Settings"
}
)
] }),
showResetDialog && u("dialog", { ref: resetDialogRef, className: "modal", children: [
u("div", { className: "modal-box max-w-xl", children: [
u("h3", { className: "font-semibold text-xl", children: "Reset to Default Settings?" }),
u("p", { className: "py-4 text-xl", children: "This will reset all settings to their default values. This action cannot be undone." }),
u("div", { className: "modal-action", children: [
u("form", { method: "dialog", children: u(
"button",
{
className: "btn btn-lg btn-ghost mr-2",
onClick: () => {
resetDialogRef.current?.close();
setShowResetDialog(false);
},
children: "Cancel"
}
) }),
u(
"button",
{
className: "btn btn-lg btn-error",
onClick: handleResetDefaults,
children: "Reset"
}
)
] })
] }),
u("form", { method: "dialog", className: "modal-backdrop", children: u(
"button",
{
onClick: () => {
resetDialogRef.current?.close();
setShowResetDialog(false);
},
children: "close"
}
) })
] }),
u("div", { children: [
u("h3", { className: "text-xl font-semibold mb-4", children: "About" }),
u("div", { className: "bg-base-200 rounded-lg p-4 space-y-3 text-xl", children: [
u("p", { className: "opacity-60", children: "A powerful YouTube userscript powered by the InnerTube API — offering advanced analytics, live stats, organized bookmarks, and integrated video/audio downloads." }),
u("div", { className: "flex gap-4 pt-2", children: [
u(
"a",
{
href: "https://exyezed.cc",
target: "_blank",
rel: "noopener noreferrer",
className: "flex items-center gap-2 opacity-70 hover:opacity-100 transition-opacity",
children: [
u(IconWorld, { size: 18 }),
u("span", { children: "Home" })
]
}
),
u(
"a",
{
href: "https://github.com/exyezed/tube-insights",
target: "_blank",
rel: "noopener noreferrer",
className: "flex items-center gap-2 opacity-70 hover:opacity-100 transition-opacity",
children: [
u(IconBrandGithub, { size: 18 }),
u("span", { children: "GitHub" })
]
}
)
] })
] })
] })
] });
}
const version = "1.0.0";
const pkg = {
version
};
function SidePanel() {
return u(preact.Fragment, { children: u(
"div",
{
className: `bg-base-100 shadow-xl ${isPanelVisible.value ? "" : "hidden"}`,
style: {
width: `${panelWidth.value}px`,
position: "fixed",
top: 0,
right: 0,
height: "100vh",
zIndex: 9999,
transition: "transform 0.3s ease-in-out",
display: "flex",
flexDirection: "column",
transform: isPanelVisible.value ? "translateX(0)" : "translateX(100%)"
},
children: [
u(FloatingButton, {}),
u("div", { className: "px-6 py-4 border-b border-base-300", children: u("div", { className: "flex items-center justify-between gap-3", children: [
u("div", { className: "flex items-center gap-3", children: [
u(IconBrandYoutubeFilled, { size: 32, className: "text-error" }),
u("h1", { className: "text-2xl font-semibold", children: "TubeInsights" }),
u("span", { className: "badge badge-warning badge-lg", children: [
"v",
pkg.version
] })
] }),
u(
"button",
{
className: "opacity-60 hover:opacity-100 hover:text-primary transition-all cursor-pointer",
onClick: () => setActiveTab("settings"),
children: u(IconSettings, { size: 20 })
}
)
] }) }),
u(
"div",
{
role: "tablist",
className: "tabs tabs-border bg-base-200 text-xl h-14",
children: [
u(
"button",
{
role: "tab",
className: `tab text-xl h-14 ${activeTab.value === "insights" ? "tab-active" : ""}`,
onClick: () => setActiveTab("insights"),
children: "Insights"
}
),
u(
"button",
{
role: "tab",
className: `tab text-xl h-14 ${activeTab.value === "livecount" ? "tab-active" : ""}`,
onClick: () => setActiveTab("livecount"),
children: "Live Count"
}
),
u(
"button",
{
role: "tab",
className: `tab text-xl h-14 ${activeTab.value === "bookmark" ? "tab-active" : ""}`,
onClick: () => setActiveTab("bookmark"),
children: "Bookmark"
}
),
u(
"button",
{
role: "tab",
className: `tab text-xl h-14 ${activeTab.value === "ddl" ? "tab-active" : ""}`,
onClick: () => setActiveTab("ddl"),
children: "DDL"
}
)
]
}
),
u(
"div",
{
className: "flex-1 overflow-y-auto pt-4 pb-6",
style: { position: "relative" },
children: [
u(
"div",
{
className: "px-6",
style: {
display: activeTab.value === "insights" ? "block" : "none"
},
children: u(InsightsTab, {})
}
),
u(
"div",
{
className: "px-6",
style: {
display: activeTab.value === "livecount" ? "block" : "none"
},
children: u(LiveCountTab, {})
}
),
u(
"div",
{
className: "px-6",
style: {
display: activeTab.value === "bookmark" ? "block" : "none"
},
children: u(BookmarkTab, {})
}
),
u(
"div",
{
className: "px-6",
style: {
display: activeTab.value === "ddl" ? "block" : "none"
},
children: u(DDLTab, {})
}
),
u(
"div",
{
className: "px-6",
style: {
display: activeTab.value === "settings" ? "block" : "none"
},
children: u(SettingsTab, {})
}
)
]
}
)
]
}
) });
}
function g(n, t) {
for (var e in t) n[e] = t[e];
return n;
}
function E(n, t) {
for (var e in n) if ("__source" !== e && !(e in t)) return true;
for (var r in t) if ("__source" !== r && n[r] !== t[r]) return true;
return false;
}
function N(n, t) {
this.props = n, this.context = t;
}
(N.prototype = new preact.Component()).isPureReactComponent = true, N.prototype.shouldComponentUpdate = function(n, t) {
return E(this.props, n) || E(this.state, t);
};
var T = preact.options.__b;
preact.options.__b = function(n) {
n.type && n.type.__f && n.ref && (n.props.ref = n.ref, n.ref = null), T && T(n);
};
var A = "undefined" != typeof Symbol && Symbol.for && Symbol.for("react.forward_ref") || 3911;
function D(n) {
function t(t2) {
var e = g({}, t2);
return delete e.ref, n(e, t2.ref || null);
}
return t.$$typeof = A, t.render = n, t.prototype.isReactComponent = t.__f = true, t.displayName = "ForwardRef(" + (n.displayName || n.name) + ")", t;
}
var F = preact.options.__e;
preact.options.__e = function(n, t, e, r) {
if (n.then) {
for (var u2, o = t; o = o.__; ) if ((u2 = o.__c) && u2.__c) return null == t.__e && (t.__e = e.__e, t.__k = e.__k), u2.__c(n, t);
}
F(n, t, e, r);
};
var U = preact.options.unmount;
function V(n, t, e) {
return n && (n.__c && n.__c.__H && (n.__c.__H.__.forEach(function(n2) {
"function" == typeof n2.__c && n2.__c();
}), n.__c.__H = null), null != (n = g({}, n)).__c && (n.__c.__P === e && (n.__c.__P = t), n.__c.__e = true, n.__c = null), n.__k = n.__k && n.__k.map(function(n2) {
return V(n2, t, e);
})), n;
}
function W(n, t, e) {
return n && e && (n.__v = null, n.__k = n.__k && n.__k.map(function(n2) {
return W(n2, t, e);
}), n.__c && n.__c.__P === t && (n.__e && e.appendChild(n.__e), n.__c.__e = true, n.__c.__P = e)), n;
}
function P() {
this.__u = 0, this.o = null, this.__b = null;
}
function j(n) {
var t = n.__.__c;
return t && t.__a && t.__a(n);
}
function B() {
this.i = null, this.l = null;
}
preact.options.unmount = function(n) {
var t = n.__c;
t && t.__R && t.__R(), t && 32 & n.__u && (n.type = null), U && U(n);
}, (P.prototype = new preact.Component()).__c = function(n, t) {
var e = t.__c, r = this;
null == r.o && (r.o = []), r.o.push(e);
var u2 = j(r.__v), o = false, i = function() {
o || (o = true, e.__R = null, u2 ? u2(l) : l());
};
e.__R = i;
var l = function() {
if (!--r.__u) {
if (r.state.__a) {
var n2 = r.state.__a;
r.__v.__k[0] = W(n2, n2.__c.__P, n2.__c.__O);
}
var t2;
for (r.setState({ __a: r.__b = null }); t2 = r.o.pop(); ) t2.forceUpdate();
}
};
r.__u++ || 32 & t.__u || r.setState({ __a: r.__b = r.__v.__k[0] }), n.then(i, i);
}, P.prototype.componentWillUnmount = function() {
this.o = [];
}, P.prototype.render = function(n, e) {
if (this.__b) {
if (this.__v.__k) {
var r = document.createElement("div"), o = this.__v.__k[0].__c;
this.__v.__k[0] = V(this.__b, r, o.__O = o.__P);
}
this.__b = null;
}
var i = e.__a && preact.createElement(preact.Fragment, null, n.fallback);
return i && (i.__u &= -33), [preact.createElement(preact.Fragment, null, e.__a ? null : n.children), i];
};
var H = function(n, t, e) {
if (++e[1] === e[0] && n.l.delete(t), n.props.revealOrder && ("t" !== n.props.revealOrder[0] || !n.l.size)) for (e = n.i; e; ) {
for (; e.length > 3; ) e.pop()();
if (e[1] < e[0]) break;
n.i = e = e[2];
}
};
(B.prototype = new preact.Component()).__a = function(n) {
var t = this, e = j(t.__v), r = t.l.get(n);
return r[0]++, function(u2) {
var o = function() {
t.props.revealOrder ? (r.push(u2), H(t, n, r)) : u2();
};
e ? e(o) : o();
};
}, B.prototype.render = function(n) {
this.i = null, this.l = new Map();
var t = preact.toChildArray(n.children);
n.revealOrder && "b" === n.revealOrder[0] && t.reverse();
for (var e = t.length; e--; ) this.l.set(t[e], this.i = [1, 0, this.i]);
return n.children;
}, B.prototype.componentDidUpdate = B.prototype.componentDidMount = function() {
var n = this;
this.l.forEach(function(t, e) {
H(n, e, t);
});
};
var q = "undefined" != typeof Symbol && Symbol.for && Symbol.for("react.element") || 60103, G = /^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/, J = /^on(Ani|Tra|Tou|BeforeInp|Compo)/, K = /[A-Z0-9]/g, Q = "undefined" != typeof document, X = function(n) {
return ("undefined" != typeof Symbol && "symbol" == typeof Symbol() ? /fil|che|rad/ : /fil|che|ra/).test(n);
};
preact.Component.prototype.isReactComponent = {}, ["componentWillMount", "componentWillReceiveProps", "componentWillUpdate"].forEach(function(t) {
Object.defineProperty(preact.Component.prototype, t, { configurable: true, get: function() {
return this["UNSAFE_" + t];
}, set: function(n) {
Object.defineProperty(this, t, { configurable: true, writable: true, value: n });
} });
});
var en = preact.options.event;
function rn() {
}
function un() {
return this.cancelBubble;
}
function on() {
return this.defaultPrevented;
}
preact.options.event = function(n) {
return en && (n = en(n)), n.persist = rn, n.isPropagationStopped = un, n.isDefaultPrevented = on, n.nativeEvent = n;
};
var cn = { enumerable: false, configurable: true, get: function() {
return this.class;
} }, fn = preact.options.vnode;
preact.options.vnode = function(n) {
"string" == typeof n.type && (function(n2) {
var t = n2.props, e = n2.type, u2 = {}, o = -1 === e.indexOf("-");
for (var i in t) {
var l = t[i];
if (!("value" === i && "defaultValue" in t && null == l || Q && "children" === i && "noscript" === e || "class" === i || "className" === i)) {
var c = i.toLowerCase();
"defaultValue" === i && "value" in t && null == t.value ? i = "value" : "download" === i && true === l ? l = "" : "translate" === c && "no" === l ? l = false : "o" === c[0] && "n" === c[1] ? "ondoubleclick" === c ? i = "ondblclick" : "onchange" !== c || "input" !== e && "textarea" !== e || X(t.type) ? "onfocus" === c ? i = "onfocusin" : "onblur" === c ? i = "onfocusout" : J.test(i) && (i = c) : c = i = "oninput" : o && G.test(i) ? i = i.replace(K, "-$&").toLowerCase() : null === l && (l = void 0), "oninput" === c && u2[i = c] && (i = "oninputCapture"), u2[i] = l;
}
}
"select" == e && u2.multiple && Array.isArray(u2.value) && (u2.value = preact.toChildArray(t.children).forEach(function(n3) {
n3.props.selected = -1 != u2.value.indexOf(n3.props.value);
})), "select" == e && null != u2.defaultValue && (u2.value = preact.toChildArray(t.children).forEach(function(n3) {
n3.props.selected = u2.multiple ? -1 != u2.defaultValue.indexOf(n3.props.value) : u2.defaultValue == n3.props.value;
})), t.class && !t.className ? (u2.class = t.class, Object.defineProperty(u2, "className", cn)) : (t.className && !t.class || t.class && t.className) && (u2.class = u2.className = t.className), n2.props = u2;
})(n), n.$$typeof = q, fn && fn(n);
};
var an = preact.options.__r;
preact.options.__r = function(n) {
an && an(n), n.__c;
};
var sn = preact.options.diffed;
preact.options.diffed = function(n) {
sn && sn(n);
var t = n.props, e = n.__e;
null != e && "textarea" === n.type && "value" in t && t.value !== e.value && (e.value = null == t.value ? "" : t.value);
};
const SaveChannelDialog = D(
({
channelId,
title,
customUrl,
thumbnailUrl,
country,
subscriberCount,
videoCount,
viewCount,
onSaved
}, ref) => {
const [category, setCategory] = hooks.useState("");
const [existingCategories, setExistingCategories] = hooks.useState([]);
const [showSavedFeedback, setShowSavedFeedback] = hooks.useState(false);
const [errorMessage, setErrorMessage] = hooks.useState("");
hooks.useEffect(() => {
loadCategories();
}, []);
const loadCategories = async () => {
const categories = await bookmarkDB.getCategories();
setExistingCategories(categories);
};
const handleSave = async () => {
if (!category.trim()) {
playErrorSound();
setErrorMessage("Please enter a category");
setTimeout(() => setErrorMessage(""), 1e3);
return;
}
await bookmarkDB.addChannel({
channelId,
title,
customUrl,
thumbnailUrl,
country,
subscriberCount,
videoCount,
viewCount,
category: category.trim(),
bookmarkedAt: Date.now()
});
setShowSavedFeedback(true);
setTimeout(() => {
setShowSavedFeedback(false);
if (ref && typeof ref !== "function" && ref.current) {
ref.current.close();
}
setCategory("");
closeSaveChannelDialog();
onSaved?.();
}, 500);
};
return u("dialog", { ref, id: "save_channel_dialog", className: "modal", children: [
u("div", { className: "modal-box max-w-xl", children: [
u("h3", { className: "font-semibold text-xl mb-4", children: "Save Channel to Bookmarks" }),
errorMessage && u("div", { role: "alert", className: "alert alert-error alert-soft mb-4", children: [
u(IconCircleX, { className: "size-6 shrink-0" }),
u("span", { className: "text-xl", children: errorMessage })
] }),
u("div", { className: "space-y-4", children: u("div", { children: [
u("label", { className: "label", children: u("span", { className: "label-text text-xl", children: "Category" }) }),
u(
"input",
{
type: "text",
placeholder: "Enter category name",
className: "input input-lg input-bordered w-full",
value: category,
onInput: (e) => setCategory(e.target.value)
}
),
existingCategories.length > 0 && u(
"select",
{
className: "select select-lg select-bordered w-full mt-4",
onChange: (e) => setCategory(e.target.value),
value: "",
children: [
u("option", { value: "", disabled: true, children: "Or select existing category" }),
existingCategories.map((cat) => u("option", { value: cat.category, children: [
cat.category,
" (",
cat.count,
")"
] }, cat.category))
]
}
)
] }) }),
u("div", { className: "modal-action", children: [
u("form", { method: "dialog", children: u(
"button",
{
className: "btn btn-lg btn-ghost mr-2",
onClick: closeSaveChannelDialog,
disabled: showSavedFeedback,
children: "Cancel"
}
) }),
u(
"button",
{
className: "btn btn-lg btn-primary",
onClick: handleSave,
disabled: showSavedFeedback,
children: showSavedFeedback ? "✓ Saved!" : "Save"
}
)
] })
] }),
u("form", { method: "dialog", className: "modal-backdrop", children: u("button", { onClick: closeSaveChannelDialog, children: "close" }) })
] });
}
);
function BookmarkDialogs({ onDataChange }) {
const deleteDialogRef = hooks.useRef(null);
const clearDialogRef = hooks.useRef(null);
const detailDialogRef = hooks.useRef(null);
hooks.useEffect(() => {
if (deleteChannelDialogData.value?.isOpen && deleteDialogRef.current) {
deleteDialogRef.current.showModal();
}
}, [deleteChannelDialogData.value]);
hooks.useEffect(() => {
if (clearAllDialogOpen.value && clearDialogRef.current) {
clearDialogRef.current.showModal();
}
}, [clearAllDialogOpen.value]);
hooks.useEffect(() => {
if (detailChannelDialogData.value?.isOpen && detailDialogRef.current) {
detailDialogRef.current.showModal();
}
}, [detailChannelDialogData.value]);
const handleDelete = async () => {
if (!deleteChannelDialogData.value?.channelId) return;
await bookmarkDB.deleteChannel(deleteChannelDialogData.value.channelId);
deleteDialogRef.current?.close();
closeDeleteChannelDialog();
onDataChange();
};
const handleClearAll = async () => {
await bookmarkDB.clearAll();
clearDialogRef.current?.close();
closeClearAllDialog();
onDataChange();
};
const calculateAge = (timestamp) => {
const now = Date.now();
const diff = now - timestamp;
const seconds = Math.floor(diff / 1e3);
const minutes = Math.floor(seconds / 60);
const hours = Math.floor(minutes / 60);
const days = Math.floor(hours / 24);
const months = Math.floor(days / 30);
const years = Math.floor(days / 365);
const parts = [];
if (years > 0) parts.push(`${years} yr`);
if (months % 12 > 0) parts.push(`${months % 12} mo`);
if (parts.length === 0 && days > 0)
parts.push(`${days} day${days > 1 ? "s" : ""}`);
if (parts.length === 0 && hours > 0)
parts.push(`${hours} hr${hours > 1 ? "s" : ""}`);
if (parts.length === 0 && minutes > 0)
parts.push(`${minutes} min${minutes > 1 ? "s" : ""}`);
return parts.length > 0 ? `${parts.join(" ")} ago` : "Just now";
};
const formatBookmarkDate = (timestamp) => {
const date = new Date(timestamp);
const months = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
];
const month = months[date.getMonth()];
const day = date.getDate();
const year = date.getFullYear();
const hours = String(date.getHours()).padStart(2, "0");
const minutes = String(date.getMinutes()).padStart(2, "0");
const seconds = String(date.getSeconds()).padStart(2, "0");
return `${month} ${day}, ${year} • ${hours}:${minutes}:${seconds}`;
};
const detailChannel = detailChannelDialogData.value?.channel;
return u(preact.Fragment, { children: [
deleteChannelDialogData.value && u("dialog", { ref: deleteDialogRef, className: "modal", children: [
u("div", { className: "modal-box max-w-xl", children: [
u("h3", { className: "font-semibold text-xl", children: "Confirm Delete" }),
u("p", { className: "py-4 text-xl", children: "Are you sure you want to delete this channel from bookmarks?" }),
u("div", { className: "modal-action", children: [
u("form", { method: "dialog", children: u(
"button",
{
className: "btn btn-lg btn-ghost mr-2",
onClick: closeDeleteChannelDialog,
children: "Cancel"
}
) }),
u("button", { className: "btn btn-lg btn-error", onClick: handleDelete, children: "Delete" })
] })
] }),
u("form", { method: "dialog", className: "modal-backdrop", children: u("button", { onClick: closeDeleteChannelDialog, children: "close" }) })
] }),
clearAllDialogOpen.value && u("dialog", { ref: clearDialogRef, className: "modal", children: [
u("div", { className: "modal-box max-w-xl", children: [
u("h3", { className: "font-semibold text-xl", children: "Confirm Clear All" }),
u("p", { className: "py-4 text-xl", children: "Are you sure you want to delete ALL bookmarked channels? This action cannot be undone." }),
u("div", { className: "modal-action", children: [
u("form", { method: "dialog", children: u(
"button",
{
className: "btn btn-lg btn-ghost mr-2",
onClick: closeClearAllDialog,
children: "Cancel"
}
) }),
u("button", { className: "btn btn-lg btn-error", onClick: handleClearAll, children: "Clear All" })
] })
] }),
u("form", { method: "dialog", className: "modal-backdrop", children: u("button", { onClick: closeClearAllDialog, children: "close" }) })
] }),
detailChannel && u("dialog", { ref: detailDialogRef, className: "modal", children: [
u("div", { className: "modal-box max-w-2xl", children: [
u("form", { method: "dialog", children: u(
"button",
{
className: "btn btn-circle btn-ghost absolute right-2 top-2 text-xl",
onClick: closeDetailChannelDialog,
children: "✕"
}
) }),
u("h3", { className: "font-semibold text-xl mb-4", children: detailChannel.title }),
u("div", { className: "space-y-4", children: [
u("div", { className: "flex items-center gap-3", children: [
u("div", { className: "avatar", children: u("div", { className: "w-16 rounded-full", children: u(
"img",
{
src: detailChannel.thumbnailUrl,
alt: detailChannel.title
}
) }) }),
u("div", { className: "flex-1", children: [
u("div", { className: "flex items-center gap-2", children: [
u(
"a",
{
href: `https://www.youtube.com/${detailChannel.customUrl}`,
target: "_blank",
rel: "noopener noreferrer",
className: "text-primary text-xl hover:underline",
children: detailChannel.customUrl
}
),
u(
"a",
{
href: `https://web.archive.org/web/*/https://www.youtube.com/${detailChannel.customUrl}`,
target: "_blank",
rel: "noopener noreferrer",
children: u(IconBuildingBank, { className: "size-5 hover:text-primary" })
}
)
] }),
u("div", { className: "flex items-center gap-2", children: [
u(
"a",
{
href: `https://www.youtube.com/channel/${detailChannel.channelId}`,
target: "_blank",
rel: "noopener noreferrer",
className: "text-secondary text-xl font-mono hover:underline block",
children: detailChannel.channelId
}
),
u(
"a",
{
href: `https://web.archive.org/web/*/https://www.youtube.com/channel/${detailChannel.channelId}`,
target: "_blank",
rel: "noopener noreferrer",
children: u(IconBuildingBank, { className: "size-5 hover:text-secondary" })
}
)
] })
] }),
u(
"a",
{
href: `https://tubeinsights.exyezed.cc/info/direct/channel/${detailChannel.channelId}`,
target: "_blank",
rel: "noopener noreferrer",
className: "btn btn-secondary btn-square",
children: u(IconInfoCircle, { className: "size-[1.8em]" })
}
)
] }),
u("div", { className: "bg-base-200 rounded-lg p-4", children: [
u("div", { className: "text-xl opacity-60 mb-2", children: "Country" }),
u("div", { className: "flex items-center gap-3", children: [
detailChannel.country && u(
CountryFlag,
{
countryCode: detailChannel.country,
size: "md"
}
),
u("span", { className: "text-xl", children: detailChannel.country ? countryNames[detailChannel.country] || detailChannel.country : "-" })
] })
] }),
u("div", { className: "bg-base-200 rounded-lg p-4", children: u("div", { className: "flex items-center justify-between", children: [
u("div", { className: "flex items-center gap-2 text-xl opacity-60", children: [
u(IconUsers, { className: "size-[1.2em]" }),
"Subscribers"
] }),
u("div", { className: "text-right", children: [
u("div", { className: "text-2xl font-semibold text-primary", children: formatNumber(parseInt(detailChannel.subscriberCount)) }),
u("div", { className: "text-xl opacity-60", children: parseInt(detailChannel.subscriberCount).toLocaleString() })
] })
] }) }),
u("div", { className: "bg-base-200 rounded-lg p-4", children: u("div", { className: "flex items-center justify-between", children: [
u("div", { className: "flex items-center gap-2 text-xl opacity-60", children: [
u(IconVideo, { className: "size-[1.2em]" }),
"Total Videos"
] }),
u("div", { className: "text-right", children: [
u("div", { className: "text-2xl font-semibold text-secondary", children: formatNumber(parseInt(detailChannel.videoCount)) }),
u("div", { className: "text-xl opacity-60", children: parseInt(detailChannel.videoCount).toLocaleString() })
] })
] }) }),
u("div", { className: "bg-base-200 rounded-lg p-4", children: u("div", { className: "flex items-center justify-between", children: [
u("div", { className: "flex items-center gap-2 text-xl opacity-60", children: [
u(IconEye, { className: "size-[1.2em]" }),
"Total Views"
] }),
u("div", { className: "text-right", children: [
u("div", { className: "text-2xl font-semibold text-accent", children: formatNumber(parseInt(detailChannel.viewCount)) }),
u("div", { className: "text-xl opacity-60", children: parseInt(detailChannel.viewCount).toLocaleString() })
] })
] }) }),
u("div", { className: "bg-base-200 rounded-lg p-4", children: [
u("div", { className: "flex items-center gap-2 text-xl opacity-60 mb-2", children: [
u(IconBookmark, { className: "size-[1.2em]" }),
"Bookmarked At"
] }),
u("div", { className: "text-xl", children: [
u("span", { className: "text-primary", children: formatBookmarkDate(detailChannel.bookmarkedAt) }),
u("span", { className: "text-secondary ml-2", children: [
"(",
calculateAge(detailChannel.bookmarkedAt),
")"
] })
] })
] })
] })
] }),
u("form", { method: "dialog", className: "modal-backdrop", children: u("button", { onClick: closeDetailChannelDialog, children: "close" }) })
] })
] });
}
const languageToCountry = {
ab: "GE",
aa: "ET",
af: "ZA",
ak: "GH",
sq: "AL",
am: "ET",
ar: "SA",
hy: "AM",
as: "IN",
ay: "BO",
az: "AZ",
ba: "RU",
eu: "ES",
be: "BY",
bn: "BD",
bho: "IN",
bs: "BA",
br: "FR",
bg: "BG",
my: "MM",
ca: "ES",
ceb: "PH",
"zh-Hans": "CN",
"zh-Hant": "TW",
co: "FR",
hr: "HR",
cs: "CZ",
da: "DK",
dv: "MV",
nl: "NL",
dz: "BT",
en: "GB",
eo: "GB",
et: "EE",
ee: "GH",
fo: "FO",
fj: "FJ",
fil: "PH",
fi: "FI",
fr: "FR",
gaa: "GH",
gd: "GB",
gl: "ES",
ka: "GE",
de: "DE",
el: "GR",
gn: "PY",
gu: "IN",
ht: "HT",
ha: "NG",
haw: "US",
iw: "IL",
he: "IL",
hi: "IN",
hmn: "CN",
hu: "HU",
is: "IS",
ig: "NG",
id: "ID",
iu: "CA",
ga: "IE",
it: "IT",
ja: "JP",
jv: "ID",
kl: "GL",
kn: "IN",
kk: "KZ",
kha: "IN",
km: "KH",
rw: "RW",
ky: "KG",
rn: "BI",
ko: "KR",
kri: "SL",
ku: "IQ",
lo: "LA",
la: "VA",
lv: "LV",
ln: "CD",
lt: "LT",
lua: "CD",
lg: "UG",
luo: "KE",
lb: "LU",
mk: "MK",
mg: "MG",
ms: "MY",
ml: "IN",
mt: "MT",
gv: "IM",
mi: "NZ",
mr: "IN",
mn: "MN",
mfe: "MU",
ne: "NP",
new: "NP",
nso: "ZA",
no: "NO",
ny: "MW",
oc: "FR",
or: "IN",
om: "ET",
os: "GE",
pam: "PH",
pa: "IN",
ps: "AF",
fa: "IR",
pl: "PL",
pt: "BR",
"pt-PT": "PT",
qu: "PE",
ro: "RO",
ru: "RU",
sm: "WS",
sg: "CF",
sa: "IN",
sr: "RS",
crs: "SC",
sn: "ZW",
sd: "PK",
si: "LK",
sk: "SK",
sl: "SI",
so: "SO",
st: "LS",
es: "ES",
su: "ID",
sw: "KE",
ss: "SZ",
sv: "SE",
tg: "TJ",
ta: "IN",
tt: "RU",
te: "IN",
th: "TH",
bo: "CN",
ti: "ER",
to: "TO",
ts: "ZA",
tn: "BW",
tum: "MW",
tr: "TR",
tk: "TM",
ug: "CN",
uk: "UA",
ur: "PK",
uz: "UZ",
ve: "ZA",
vi: "VN",
war: "PH",
cy: "GB",
fy: "NL",
wo: "SN",
xh: "ZA",
yi: "IL",
yo: "NG",
zu: "ZA"
};
function getCountryFromLanguage(languageCode) {
if (languageToCountry[languageCode]) {
return languageToCountry[languageCode];
}
if (languageCode.endsWith("_auto")) {
const baseCode = languageCode.replace("_auto", "");
if (languageToCountry[baseCode]) {
return languageToCountry[baseCode];
}
}
if (languageCode.endsWith("-auto")) {
const baseCode = languageCode.replace("-auto", "");
if (languageToCountry[baseCode]) {
return languageToCountry[baseCode];
}
}
return "GB";
}
function SubtitleDialog() {
const dialogRef = hooks.useRef(null);
const [activeTab2, setActiveTab2] = hooks.useState("original");
const [searchQuery, setSearchQuery] = hooks.useState("");
const [downloadingIds, setDownloadingIds] = hooks.useState( new Set());
const [successIds, setSuccessIds] = hooks.useState( new Set());
const [errorMessage, setErrorMessage] = hooks.useState("");
hooks.useEffect(() => {
if (subtitleDialogData.value?.isOpen && dialogRef.current) {
dialogRef.current.showModal();
setActiveTab2("original");
setSearchQuery("");
}
}, [subtitleDialogData.value]);
if (!subtitleDialogData.value) return null;
const { videoId, videoTitle, subtitles, autoTransSubtitles } = subtitleDialogData.value;
const currentSubtitles = activeTab2 === "original" ? subtitles : autoTransSubtitles;
const filteredSubtitles = currentSubtitles.filter(
(sub) => sub.name.toLowerCase().includes(searchQuery.toLowerCase())
);
const downloadSubtitle = async (url, filename, subtitleId) => {
const sanitizedFilename = sanitizeFilename(filename);
setDownloadingIds((prev) => new Set(prev).add(subtitleId));
try {
await new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "GET",
url,
responseType: "blob",
headers: {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
Referer: "https://downsub.com/"
},
onload: (response) => {
if (response.status === 200 && response.response) {
const blob = response.response;
const blobUrl = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = blobUrl;
a.download = sanitizedFilename;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(blobUrl);
resolve();
} else {
reject(new Error(`Download failed: ${response.status}`));
}
},
onerror: () => reject(new Error("Download failed")),
ontimeout: () => reject(new Error("Download timeout"))
});
});
setDownloadingIds((prev) => {
const newSet = new Set(prev);
newSet.delete(subtitleId);
return newSet;
});
setSuccessIds((prev) => new Set(prev).add(subtitleId));
setTimeout(() => {
setSuccessIds((prev) => {
const newSet = new Set(prev);
newSet.delete(subtitleId);
return newSet;
});
}, 1500);
} catch (error) {
console.error("[Subtitle] Download error:", error);
playErrorSound();
setErrorMessage("Failed to download subtitle");
setTimeout(() => setErrorMessage(""), 1e3);
setDownloadingIds((prev) => {
const newSet = new Set(prev);
newSet.delete(subtitleId);
return newSet;
});
}
};
const handleClose = () => {
dialogRef.current?.close();
closeSubtitleDialog();
};
return u("dialog", { ref: dialogRef, className: "modal", onClose: handleClose, children: [
u("div", { className: "modal-box w-11/12 max-w-2xl max-h-[80vh] flex flex-col p-0", children: [
u("div", { className: "flex items-center justify-between p-4 border-b border-base-300", children: [
u("h3", { className: "text-xl font-semibold", children: "Download Subtitles" }),
u("button", { className: "btn btn-ghost btn-circle", onClick: handleClose, children: u(IconX, { className: "size-6" }) })
] }),
u("div", { className: "flex border-b border-base-300", children: [
u(
"button",
{
className: `flex-1 py-3 text-xl font-medium transition-colors ${activeTab2 === "original" ? "border-b-2 border-secondary text-secondary" : "text-base-content opacity-60 hover:opacity-100"}`,
onClick: () => setActiveTab2("original"),
children: [
"Original (",
subtitles.length,
")"
]
}
),
u(
"button",
{
className: `flex-1 py-3 text-xl font-medium transition-colors ${activeTab2 === "auto" ? "border-b-2 border-secondary text-secondary" : "text-base-content opacity-60 hover:opacity-100"}`,
onClick: () => setActiveTab2("auto"),
children: [
"Auto Translate (",
autoTransSubtitles.length,
")"
]
}
)
] }),
u("div", { className: "p-4", children: u(
"input",
{
type: "text",
placeholder: "Search languages...",
className: "input input-bordered input-lg w-full text-xl",
value: searchQuery,
onInput: (e) => setSearchQuery(e.target.value)
}
) }),
errorMessage && u("div", { role: "alert", className: "alert alert-error alert-soft mx-4", children: [
u(IconCircleX, { className: "size-6 shrink-0" }),
u("span", { className: "text-xl", children: errorMessage })
] }),
u("div", { className: "flex-1 overflow-y-auto p-4 space-y-3", children: filteredSubtitles.length === 0 ? u("div", { className: "text-center py-8 text-xl opacity-60", children: searchQuery ? "No subtitles found" : "No subtitles available" }) : filteredSubtitles.map((sub) => {
return u(
"div",
{
className: "bg-base-200 rounded-lg p-4 flex items-center justify-between gap-3",
children: [
u("div", { className: "flex items-center gap-3 flex-1", children: [
u(
CountryFlag,
{
countryCode: getCountryFromLanguage(sub.code),
size: "sm"
}
),
u("span", { className: "text-xl font-medium", children: sub.name })
] }),
u("div", { className: "flex gap-2", children: ["srt", "txt", "raw"].map((format) => {
const subtitleId = `${activeTab2}-${sub.name}-${format}`;
const isDownloading = downloadingIds.has(subtitleId);
const isSuccess = successIds.has(subtitleId);
const buttonClass = format === "srt" ? "btn-primary" : format === "txt" ? "btn-secondary" : "btn-accent";
return u(
"button",
{
className: `btn ${isSuccess ? "btn-success" : buttonClass}`,
onClick: () => downloadSubtitle(
sub.download[format],
`${videoTitle} - ${sub.name}.${format}`,
subtitleId
),
disabled: isDownloading || isSuccess,
children: isDownloading ? u("span", { className: "loading loading-spinner loading-md" }) : isSuccess ? u(IconCheck, { className: "size-[1.8em]" }) : u(preact.Fragment, { children: [
u(IconDownload, { className: "size-[1.8em]" }),
u("span", { children: format.toUpperCase() })
] })
},
format
);
}) })
]
},
sub.name
);
}) })
] }),
u("form", { method: "dialog", className: "modal-backdrop", children: u("button", { onClick: handleClose, children: "close" }) })
] });
}
function App() {
const saveDialogRef = hooks.useRef(null);
hooks.useEffect(() => {
loadSettings();
}, []);
hooks.useEffect(() => {
if (saveChannelDialogData.value?.isOpen && saveDialogRef.current) {
saveDialogRef.current.showModal();
}
}, [saveChannelDialogData.value]);
const handleBookmarkDataChange = () => {
window.dispatchEvent(new CustomEvent("bookmark-updated"));
};
return u("div", { "data-theme": currentTheme.value, children: [
u(SidePanel, {}),
saveChannelDialogData.value && u(
SaveChannelDialog,
{
ref: saveDialogRef,
channelId: saveChannelDialogData.value.channelId,
title: saveChannelDialogData.value.title,
customUrl: saveChannelDialogData.value.customUrl,
thumbnailUrl: saveChannelDialogData.value.thumbnailUrl,
country: saveChannelDialogData.value.country,
subscriberCount: saveChannelDialogData.value.subscriberCount,
videoCount: saveChannelDialogData.value.videoCount,
viewCount: saveChannelDialogData.value.viewCount,
onSaved: () => {
closeSaveChannelDialog();
handleBookmarkDataChange();
}
}
),
u(BookmarkDialogs, { onDataChange: handleBookmarkDataChange }),
u(SubtitleDialog, {})
] });
}
const youtubeService = new YouTubeService();
const CLICK_DURATION = 500;
const buttonCSS = `
a.tubeinsights-loop-button,
a.tubeinsights-save-screenshot-button,
a.tubeinsights-copy-screenshot-button {
text-align: center;
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 48px;
height: 48px;
}
a.tubeinsights-loop-button svg,
a.tubeinsights-save-screenshot-button svg,
a.tubeinsights-copy-screenshot-button svg {
width: 28px;
height: 28px;
vertical-align: middle;
transition: fill 0.2s ease;
}
a.tubeinsights-loop-button:hover svg,
a.tubeinsights-save-screenshot-button:hover svg,
a.tubeinsights-copy-screenshot-button:hover svg {
fill: url(#buttonGradient);
}
a.tubeinsights-loop-button.active svg,
a.tubeinsights-save-screenshot-button.clicked svg,
a.tubeinsights-copy-screenshot-button.clicked svg {
fill: url(#successGradient);
}
.tubeinsights-shorts-save-button,
.tubeinsights-shorts-copy-button {
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: background-color 0.3s;
border-radius: 50%;
width: 48px;
height: 48px;
min-width: 48px;
min-height: 48px;
flex-shrink: 0;
}
.tubeinsights-shorts-save-button svg,
.tubeinsights-shorts-copy-button svg {
width: 28px;
height: 28px;
transition: fill 0.1s ease;
}
.tubeinsights-shorts-save-button svg path,
.tubeinsights-shorts-copy-button svg path {
transition: fill 0.1s ease;
}
.tubeinsights-shorts-save-button:hover svg path,
.tubeinsights-shorts-copy-button:hover svg path {
fill: url(#shortsButtonGradient) !important;
}
.tubeinsights-shorts-save-button.clicked svg path,
.tubeinsights-shorts-copy-button.clicked svg path {
fill: url(#shortsSuccessGradient) !important;
}
html[dark] .tubeinsights-shorts-save-button,
html[dark] .tubeinsights-shorts-copy-button {
background-color: rgba(255, 255, 255, 0.1);
}
html[dark] .tubeinsights-shorts-save-button:hover,
html[dark] .tubeinsights-shorts-copy-button:hover {
background-color: rgba(255, 255, 255, 0.2);
}
html[dark] .tubeinsights-shorts-save-button svg path,
html[dark] .tubeinsights-shorts-copy-button svg path {
fill: white;
}
html:not([dark]) .tubeinsights-shorts-save-button,
html:not([dark]) .tubeinsights-shorts-copy-button {
background-color: rgba(0, 0, 0, 0.05);
}
html:not([dark]) .tubeinsights-shorts-save-button:hover,
html:not([dark]) .tubeinsights-shorts-copy-button:hover {
background-color: rgba(0, 0, 0, 0.1);
}
html:not([dark]) .tubeinsights-shorts-save-button svg path,
html:not([dark]) .tubeinsights-shorts-copy-button svg path {
fill: #030303;
}
`;
function createGradient(id, color1, color2) {
const gradient = document.createElementNS(
"http://www.w3.org/2000/svg",
"linearGradient"
);
gradient.setAttribute("id", id);
gradient.setAttribute("x1", "0%");
gradient.setAttribute("y1", "0%");
gradient.setAttribute("x2", "100%");
gradient.setAttribute("y2", "100%");
const stop1 = document.createElementNS("http://www.w3.org/2000/svg", "stop");
stop1.setAttribute("offset", "0%");
stop1.setAttribute("style", `stop-color:${color1}`);
const stop2 = document.createElementNS("http://www.w3.org/2000/svg", "stop");
stop2.setAttribute("offset", "100%");
stop2.setAttribute("style", `stop-color:${color2}`);
gradient.appendChild(stop1);
gradient.appendChild(stop2);
return gradient;
}
function createIcon(viewBox, pathData, isShortsButton = false) {
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
svg.setAttribute("xmlns", "http://www.w3.org/2000/svg");
svg.setAttribute("height", "24px");
svg.setAttribute("viewBox", viewBox);
svg.setAttribute("width", "24px");
svg.setAttribute("fill", "#e8eaed");
const defs = document.createElementNS("http://www.w3.org/2000/svg", "defs");
const prefix = isShortsButton ? "shortsB" : "b";
defs.appendChild(createGradient(`${prefix}uttonGradient`, "#f03", "#ff2791"));
const successPrefix = isShortsButton ? "shortsS" : "s";
defs.appendChild(
createGradient(`${successPrefix}uccessGradient`, "#0f9d58", "#00c853")
);
svg.appendChild(defs);
const path = document.createElementNS("http://www.w3.org/2000/svg", "path");
path.setAttribute("d", pathData);
svg.appendChild(path);
return svg;
}
const ICON_PATHS = {
loop: "M16.5 6.671c.116 0 .223.04.308.107l.067.063l.017.02a5 5 0 0 1-3.675 8.135L13 15H7a5.07 5.07 0 0 1-.303-.009l1.657 1.655a.5.5 0 0 1 .057.638l-.057.07a.5.5 0 0 1-.638.057l-.07-.057l-2.5-2.5a.5.5 0 0 1-.057-.638l.057-.07l2.5-2.5a.5.5 0 0 1 .765.638l-.057.07l-1.637 1.636l.14.008L7 14h6a4 4 0 0 0 3.11-6.516a.5.5 0 0 1 .39-.812Zm-4.854-4.025a.5.5 0 0 1 .638-.057l.07.057l2.5 2.5l.057.07a.5.5 0 0 1 0 .568l-.057.07l-2.5 2.5l-.07.057a.5.5 0 0 1-.568 0l-.07-.057l-.057-.07a.5.5 0 0 1 0-.568l.057-.07l1.637-1.636l-.14-.008L13 6H7a4 4 0 0 0-3.105 6.522a.5.5 0 1 1-.801.601a5 5 0 0 1 3.689-8.119L7 5h6c.102 0 .203.003.303.009l-1.657-1.655l-.057-.07a.5.5 0 0 1 .057-.638Z",
screenshot: "M17 6.125v2.91A3.529 3.529 0 0 0 16.5 9H16V6.125a.965.965 0 0 0-.289-.711l-2.125-2.125A.962.962 0 0 0 13 3.008V5.5a1.507 1.507 0 0 1-.922 1.383A1.327 1.327 0 0 1 11.5 7h-4a1.507 1.507 0 0 1-1.383-.922A1.327 1.327 0 0 1 6 5.5V3H5a.972.972 0 0 0-.703.289a1.081 1.081 0 0 0-.219.32A.856.856 0 0 0 4 4v10a.972.972 0 0 0 .078.391c.052.118.123.226.211.32a.854.854 0 0 0 .313.211c.127.049.262.075.398.078v-4.5a1.507 1.507 0 0 1 .922-1.383c.181-.082.379-.122.578-.117h5.992a3.489 3.489 0 0 0-2.442 1H6.5a.505.505 0 0 0-.5.5V15h3v1H5a1.884 1.884 0 0 1-.758-.156a2.2 2.2 0 0 1-.64-.422A1.9 1.9 0 0 1 3 14.039V4c-.001-.26.052-.519.156-.758a2.2 2.2 0 0 1 .422-.642a1.9 1.9 0 0 1 .622-.436c.24-.105.499-.16.761-.164h7.914c.262 0 .523.05.766.148c.244.099.465.248.648.438l2.125 2.125c.186.185.332.405.43.648c.099.244.152.503.156.766ZM7 3v2.5a.505.505 0 0 0 .5.5h4a.505.505 0 0 0 .5-.5V3H7Zm3 9.5a2.5 2.5 0 0 1 2.5-2.5h4a2.5 2.5 0 0 1 2.5 2.5v4c0 .51-.152.983-.414 1.379l-3.025-3.025a1.5 1.5 0 0 0-2.122 0l-3.025 3.025A2.488 2.488 0 0 1 10 16.5v-4Zm7 .25a.75.75 0 1 0-1.5 0a.75.75 0 0 0 1.5 0Zm-5.879 5.836c.396.262.87.414 1.379.414h4c.51 0 .983-.152 1.379-.414l-3.025-3.025a.5.5 0 0 0-.708 0l-3.025 3.025Z",
copy: "M7.085 3A1.5 1.5 0 0 1 8.5 2h3a1.5 1.5 0 0 1 1.415 1H14.5A1.5 1.5 0 0 1 16 4.5V9h-1V4.5a.5.5 0 0 0-.5-.5h-1.585A1.5 1.5 0 0 1 11.5 5h-3a1.5 1.5 0 0 1-1.415-1H5.5a.5.5 0 0 0-.5.5v12a.5.5 0 0 0 .5.5h3.535c.051.353.154.69.302 1H5.5A1.5 1.5 0 0 1 4 16.5v-12A1.5 1.5 0 0 1 5.5 3h1.585ZM8.5 3a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1h-3Zm1.5 9.5a2.5 2.5 0 0 1 2.5-2.5h4a2.5 2.5 0 0 1 2.5 2.5v4c0 .51-.152.983-.414 1.379l-3.025-3.025a1.5 1.5 0 0 0-2.122 0l-3.025 3.025A2.488 2.488 0 0 1 10 16.5v-4Zm7 .25a.75.75 0 1 0-1.5 0a.75.75 0 0 0 1.5 0Zm-5.879 5.836c.396.262.87.414 1.379.414h4c.51 0 .983-.152 1.379-.414l-3.025-3.025a.5.5 0 0 0-.708 0l-3.025 3.025Z"
};
function formatTime(time) {
const date = new Date();
const dateStr = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(
2,
"0"
)}-${String(date.getDate()).padStart(2, "0")}`;
const timeStr = [
Math.floor(time / 3600),
Math.floor(time % 3600 / 60),
Math.floor(time % 60)
].map((v) => v.toString().padStart(2, "0")).join("-");
return `${dateStr} ${timeStr}`;
}
async function getVideoTitle() {
const videoId = youtubeService.getVideoIdFromURL();
if (!videoId) return "YouTube Video";
try {
const url = "https://www.youtube.com/youtubei/v1/player?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8&prettyPrint=false";
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-YouTube-Client-Name": "1",
"X-YouTube-Client-Version": "2.20201209.01.00"
},
body: JSON.stringify({
context: {
client: {
clientName: "WEB",
clientVersion: "2.20201209.01.00",
hl: "en",
gl: "US"
}
},
videoId
})
});
if (response.ok) {
const data = await response.json();
if (data?.videoDetails?.title) return data.videoDetails.title;
}
} catch (error) {
console.error("Failed to fetch video details from InnerTube:", error);
}
return videoId;
}
async function captureScreenshot(player, actions) {
if (!player) return;
const canvas = document.createElement("canvas");
canvas.width = player.videoWidth;
canvas.height = player.videoHeight;
const ctx = canvas.getContext("2d");
if (!ctx) return;
ctx.drawImage(player, 0, 0, canvas.width, canvas.height);
const title = await getVideoTitle();
const format = moduleSettings.value.screenshotFormat;
const extension = format === "jpg" ? "jpg" : format;
const filename = sanitizeFilename(
`${title} ${formatTime(player.currentTime)}.${extension}`
);
const mimeType = format === "jpg" ? "image/jpeg" : `image/${format}`;
return new Promise((resolve) => {
canvas.toBlob(async (blob) => {
if (!blob) {
console.error("Failed to create blob from canvas");
resolve();
return;
}
try {
if (actions.copy) {
await navigator.clipboard.write([
new ClipboardItem({ [mimeType]: blob })
]);
}
if (actions.download) {
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.style.display = "none";
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
setTimeout(() => {
document.body.removeChild(a);
URL.revokeObjectURL(url);
}, 100);
}
} catch (error) {
console.error("Failed to save/copy screenshot:", error);
}
resolve();
}, mimeType);
});
}
function addClickAnimation(button) {
button.classList.add("clicked");
setTimeout(() => button.classList.remove("clicked"), CLICK_DURATION);
}
function createButton(className, icon, onClick) {
const button = document.createElement("a");
button.classList.add("ytp-button", className);
button.appendChild(icon);
button.addEventListener("click", onClick);
return button;
}
const regularVideo = {
async init() {
const controls = await this.waitForControls();
if (!controls) return;
if (moduleSettings.value.loopVideo) this.insertLoopButton(controls);
if (moduleSettings.value.screenshotVideo) {
if (moduleSettings.value.screenshotDownload)
this.insertScreenshotButton(controls, "save");
if (moduleSettings.value.screenshotCopy)
this.insertScreenshotButton(controls, "copy");
}
this.addLoopObserver();
},
waitForControls() {
return new Promise((resolve) => {
let attempts = 0;
const check = () => {
const controls = document.querySelector("div.ytp-left-controls");
if (controls) resolve(controls);
else if (attempts++ >= 50) resolve(null);
else setTimeout(check, 100);
};
check();
});
},
insertLoopButton(controls) {
if (document.querySelector(".tubeinsights-loop-button")) return;
const button = createButton(
"tubeinsights-loop-button",
createIcon("0 0 24 24", ICON_PATHS.loop),
() => {
const video = document.querySelector("video");
if (!video) return;
video.loop = !video.loop;
if (video.loop) video.play();
button.classList.toggle("active");
}
);
controls.appendChild(button);
},
insertScreenshotButton(controls, type) {
const className = `tubeinsights-${type}-screenshot-button`;
if (document.querySelector(`.${className}`)) return;
const isSave = type === "save";
const button = createButton(
className,
createIcon("0 0 24 24", isSave ? ICON_PATHS.screenshot : ICON_PATHS.copy),
async (e) => {
addClickAnimation(e.currentTarget);
const player = document.querySelector("video");
if (player) {
await captureScreenshot(player, { download: isSave, copy: !isSave });
}
}
);
const refButton = document.querySelector(
isSave ? ".tubeinsights-loop-button" : ".tubeinsights-save-screenshot-button"
);
if (refButton)
refButton.parentNode?.insertBefore(button, refButton.nextSibling);
else controls.appendChild(button);
},
addLoopObserver() {
const video = document.querySelector("video");
if (!video) return;
new MutationObserver(() => {
const loopButton = document.querySelector(".tubeinsights-loop-button");
const isLooped = video.hasAttribute("loop");
const isActive = loopButton?.classList.contains("active");
if (isLooped !== isActive) {
loopButton?.classList.toggle("active");
}
}).observe(video, { attributes: true, attributeFilter: ["loop"] });
},
cleanup() {
document.querySelector(".tubeinsights-loop-button")?.remove();
document.querySelector(".tubeinsights-save-screenshot-button")?.remove();
document.querySelector(".tubeinsights-copy-screenshot-button")?.remove();
}
};
const shortsVideo = {
init() {
if (!moduleSettings.value.screenshotVideo) return;
if (moduleSettings.value.screenshotDownload) this.insertButton("save");
if (moduleSettings.value.screenshotCopy) this.insertButton("copy");
},
insertButton(type) {
const className = `tubeinsights-shorts-${type}-button`;
if (document.querySelector(`.${className}`)) return;
const actionBar = document.querySelector(
"ytd-reel-video-renderer[is-active] reel-action-bar-view-model"
) || document.querySelector(
"ytd-reel-video-renderer[is-active] #actions #button-bar"
);
if (!actionBar) return;
const isSave = type === "save";
const button = document.createElement("div");
button.className = className;
button.appendChild(
createIcon(
"0 0 24 24",
isSave ? ICON_PATHS.screenshot : ICON_PATHS.copy,
true
)
);
button.addEventListener("click", async (e) => {
addClickAnimation(e.currentTarget);
const player = document.querySelector(
"ytd-reel-video-renderer[is-active] video"
);
if (player) {
await captureScreenshot(player, { download: isSave, copy: !isSave });
}
});
let refButton = null;
if (isSave) {
refButton = document.querySelector(
"ytd-reel-video-renderer[is-active] like-button-view-model"
);
} else {
refButton = document.querySelector(".tubeinsights-shorts-save-button");
if (refButton) {
refButton.parentNode?.insertBefore(button, refButton.nextSibling);
return;
} else {
refButton = document.querySelector(
"ytd-reel-video-renderer[is-active] like-button-view-model"
);
}
}
if (refButton) {
actionBar.insertBefore(button, refButton);
}
},
cleanup() {
document.querySelector(".tubeinsights-shorts-save-button")?.remove();
document.querySelector(".tubeinsights-shorts-copy-button")?.remove();
}
};
function waitForVideo() {
return new Promise((resolve) => {
const check = () => document.querySelector("video") ? resolve() : setTimeout(check, 100);
check();
});
}
function initializeFeatures() {
regularVideo.init();
if (window.location.pathname.includes("/shorts/")) {
initializeShortsWithRetry();
}
}
function initializeShortsWithRetry(attempts = 0, maxAttempts = 10) {
shortsVideo.init();
if (attempts < maxAttempts) {
setTimeout(() => {
const hasButtons = document.querySelector(".tubeinsights-shorts-save-button") || document.querySelector(".tubeinsights-shorts-copy-button");
if (!hasButtons && window.location.pathname.includes("/shorts/")) {
initializeShortsWithRetry(attempts + 1, maxAttempts);
}
}, 100);
}
}
function handleModuleSettingsUpdate() {
regularVideo.cleanup();
shortsVideo.cleanup();
initializeFeatures();
}
function initVideoModules() {
if (!document.getElementById("tubeinsights-video-modules-style")) {
const style = document.createElement("style");
style.id = "tubeinsights-video-modules-style";
style.textContent = buttonCSS;
document.head.append(style);
}
waitForVideo().then(initializeFeatures);
window.addEventListener(
"module-settings-updated",
handleModuleSettingsUpdate
);
window.addEventListener("yt-navigate-finish", () => {
regularVideo.cleanup();
shortsVideo.cleanup();
waitForVideo().then(initializeFeatures);
});
new MutationObserver((mutations) => {
if (!window.location.pathname.includes("/shorts/")) return;
for (const mutation of mutations) {
if (mutation.addedNodes.length > 0) {
const hasActionBar = Array.from(mutation.addedNodes).some(
(node) => node instanceof Element && (node.matches("reel-action-bar-view-model") || node.querySelector("reel-action-bar-view-model") || node.matches("ytd-reel-video-renderer[is-active]") || node.querySelector("ytd-reel-video-renderer[is-active]"))
);
if (hasActionBar) {
setTimeout(() => shortsVideo.init(), 50);
}
}
if (mutation.type === "attributes" && mutation.attributeName === "is-active") {
const target = mutation.target;
if (target.matches("ytd-reel-video-renderer") && target.hasAttribute("is-active")) {
setTimeout(() => shortsVideo.init(), 50);
}
}
}
}).observe(document.body, {
childList: true,
subtree: true,
attributes: true,
attributeFilter: ["is-active"]
});
}
const styles = `@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-text-shadow-color:initial;--tw-text-shadow-alpha:100%}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-600:oklch(57.7% .245 27.325);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-800:oklch(47% .157 37.304);--color-amber-300:oklch(87.9% .169 91.605);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-600:oklch(68.1% .162 75.834);--color-lime-400:oklch(84.1% .238 128.85);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-zinc-50:oklch(98.5% 0 0);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-800:oklch(27.4% .006 286.033);--color-neutral-900:oklch(20.5% 0 0);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-9xl:8rem;--text-9xl--line-height:1;--font-weight-thin:100;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-black:900;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--animate-bounce:bounce 1s infinite;--blur-lg:16px;--aspect-video:16/9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:where(:root),:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(45% .24 277.023);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}@media(prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(58% .233 277.117);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}}:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(45% .24 277.023);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=dark]:checked),[data-theme=dark]{color-scheme:dark;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(58% .233 277.117);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=cupcake]:checked),[data-theme=cupcake]{color-scheme:light;--color-base-100:oklch(97.788% .004 56.375);--color-base-200:oklch(93.982% .007 61.449);--color-base-300:oklch(91.586% .006 53.44);--color-base-content:oklch(23.574% .066 313.189);--color-primary:oklch(85% .138 181.071);--color-primary-content:oklch(43% .078 188.216);--color-secondary:oklch(89% .061 343.231);--color-secondary-content:oklch(45% .187 3.815);--color-accent:oklch(90% .076 70.697);--color-accent-content:oklch(47% .157 37.304);--color-neutral:oklch(27% .006 286.033);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(68% .169 237.323);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(69% .17 162.48);--color-success-content:oklch(26% .051 172.552);--color-warning:oklch(79% .184 86.047);--color-warning-content:oklch(28% .066 53.813);--color-error:oklch(64% .246 16.439);--color-error-content:oklch(27% .105 12.094);--radius-selector:1rem;--radius-field:2rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:2px;--depth:1;--noise:0}:root:has(input.theme-controller[value=bumblebee]:checked),[data-theme=bumblebee]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(97% 0 0);--color-base-300:oklch(92% 0 0);--color-base-content:oklch(20% 0 0);--color-primary:oklch(85% .199 91.936);--color-primary-content:oklch(42% .095 57.708);--color-secondary:oklch(75% .183 55.934);--color-secondary-content:oklch(40% .123 38.172);--color-accent:oklch(0% 0 0);--color-accent-content:oklch(100% 0 0);--color-neutral:oklch(37% .01 67.558);--color-neutral-content:oklch(92% .003 48.717);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(39% .09 240.876);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(70% .191 22.216);--color-error-content:oklch(39% .141 25.723);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=emerald]:checked),[data-theme=emerald]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(93% 0 0);--color-base-300:oklch(86% 0 0);--color-base-content:oklch(35.519% .032 262.988);--color-primary:oklch(76.662% .135 153.45);--color-primary-content:oklch(33.387% .04 162.24);--color-secondary:oklch(61.302% .202 261.294);--color-secondary-content:oklch(100% 0 0);--color-accent:oklch(72.772% .149 33.2);--color-accent-content:oklch(0% 0 0);--color-neutral:oklch(35.519% .032 262.988);--color-neutral-content:oklch(98.462% .001 247.838);--color-info:oklch(72.06% .191 231.6);--color-info-content:oklch(0% 0 0);--color-success:oklch(64.8% .15 160);--color-success-content:oklch(0% 0 0);--color-warning:oklch(84.71% .199 83.87);--color-warning-content:oklch(0% 0 0);--color-error:oklch(71.76% .221 22.18);--color-error-content:oklch(0% 0 0);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=corporate]:checked),[data-theme=corporate]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(93% 0 0);--color-base-300:oklch(86% 0 0);--color-base-content:oklch(22.389% .031 278.072);--color-primary:oklch(58% .158 241.966);--color-primary-content:oklch(100% 0 0);--color-secondary:oklch(55% .046 257.417);--color-secondary-content:oklch(100% 0 0);--color-accent:oklch(60% .118 184.704);--color-accent-content:oklch(100% 0 0);--color-neutral:oklch(0% 0 0);--color-neutral-content:oklch(100% 0 0);--color-info:oklch(60% .126 221.723);--color-info-content:oklch(100% 0 0);--color-success:oklch(62% .194 149.214);--color-success-content:oklch(100% 0 0);--color-warning:oklch(85% .199 91.936);--color-warning-content:oklch(0% 0 0);--color-error:oklch(70% .191 22.216);--color-error-content:oklch(0% 0 0);--radius-selector:.25rem;--radius-field:.25rem;--radius-box:.25rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=synthwave]:checked),[data-theme=synthwave]{color-scheme:dark;--color-base-100:oklch(15% .09 281.288);--color-base-200:oklch(20% .09 281.288);--color-base-300:oklch(25% .09 281.288);--color-base-content:oklch(78% .115 274.713);--color-primary:oklch(71% .202 349.761);--color-primary-content:oklch(28% .109 3.907);--color-secondary:oklch(82% .111 230.318);--color-secondary-content:oklch(29% .066 243.157);--color-accent:oklch(75% .183 55.934);--color-accent-content:oklch(26% .079 36.259);--color-neutral:oklch(45% .24 277.023);--color-neutral-content:oklch(87% .065 274.039);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(77% .152 181.912);--color-success-content:oklch(27% .046 192.524);--color-warning:oklch(90% .182 98.111);--color-warning-content:oklch(42% .095 57.708);--color-error:oklch(73.7% .121 32.639);--color-error-content:oklch(23.501% .096 290.329);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=retro]:checked),[data-theme=retro]{color-scheme:light;--color-base-100:oklch(91.637% .034 90.515);--color-base-200:oklch(88.272% .049 91.774);--color-base-300:oklch(84.133% .065 90.856);--color-base-content:oklch(41% .112 45.904);--color-primary:oklch(80% .114 19.571);--color-primary-content:oklch(39% .141 25.723);--color-secondary:oklch(92% .084 155.995);--color-secondary-content:oklch(44% .119 151.328);--color-accent:oklch(68% .162 75.834);--color-accent-content:oklch(41% .112 45.904);--color-neutral:oklch(44% .011 73.639);--color-neutral-content:oklch(86% .005 56.366);--color-info:oklch(58% .158 241.966);--color-info-content:oklch(96% .059 95.617);--color-success:oklch(51% .096 186.391);--color-success-content:oklch(96% .059 95.617);--color-warning:oklch(64% .222 41.116);--color-warning-content:oklch(96% .059 95.617);--color-error:oklch(70% .191 22.216);--color-error-content:oklch(40% .123 38.172);--radius-selector:.25rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=cyberpunk]:checked),[data-theme=cyberpunk]{color-scheme:light;--color-base-100:oklch(94.51% .179 104.32);--color-base-200:oklch(91.51% .179 104.32);--color-base-300:oklch(85.51% .179 104.32);--color-base-content:oklch(0% 0 0);--color-primary:oklch(74.22% .209 6.35);--color-primary-content:oklch(14.844% .041 6.35);--color-secondary:oklch(83.33% .184 204.72);--color-secondary-content:oklch(16.666% .036 204.72);--color-accent:oklch(71.86% .217 310.43);--color-accent-content:oklch(14.372% .043 310.43);--color-neutral:oklch(23.04% .065 269.31);--color-neutral-content:oklch(94.51% .179 104.32);--color-info:oklch(72.06% .191 231.6);--color-info-content:oklch(0% 0 0);--color-success:oklch(64.8% .15 160);--color-success-content:oklch(0% 0 0);--color-warning:oklch(84.71% .199 83.87);--color-warning-content:oklch(0% 0 0);--color-error:oklch(71.76% .221 22.18);--color-error-content:oklch(0% 0 0);--radius-selector:0rem;--radius-field:0rem;--radius-box:0rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=valentine]:checked),[data-theme=valentine]{color-scheme:light;--color-base-100:oklch(97% .014 343.198);--color-base-200:oklch(94% .028 342.258);--color-base-300:oklch(89% .061 343.231);--color-base-content:oklch(52% .223 3.958);--color-primary:oklch(65% .241 354.308);--color-primary-content:oklch(100% 0 0);--color-secondary:oklch(62% .265 303.9);--color-secondary-content:oklch(97% .014 308.299);--color-accent:oklch(82% .111 230.318);--color-accent-content:oklch(39% .09 240.876);--color-neutral:oklch(40% .153 2.432);--color-neutral-content:oklch(89% .061 343.231);--color-info:oklch(86% .127 207.078);--color-info-content:oklch(44% .11 240.79);--color-success:oklch(84% .143 164.978);--color-success-content:oklch(43% .095 166.913);--color-warning:oklch(75% .183 55.934);--color-warning-content:oklch(26% .079 36.259);--color-error:oklch(63% .237 25.331);--color-error-content:oklch(97% .013 17.38);--radius-selector:1rem;--radius-field:2rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=halloween]:checked),[data-theme=halloween]{color-scheme:dark;--color-base-100:oklch(21% .006 56.043);--color-base-200:oklch(14% .004 49.25);--color-base-300:oklch(0% 0 0);--color-base-content:oklch(84.955% 0 0);--color-primary:oklch(77.48% .204 60.62);--color-primary-content:oklch(19.693% .004 196.779);--color-secondary:oklch(45.98% .248 305.03);--color-secondary-content:oklch(89.196% .049 305.03);--color-accent:oklch(64.8% .223 136.073);--color-accent-content:oklch(0% 0 0);--color-neutral:oklch(24.371% .046 65.681);--color-neutral-content:oklch(84.874% .009 65.681);--color-info:oklch(54.615% .215 262.88);--color-info-content:oklch(90.923% .043 262.88);--color-success:oklch(62.705% .169 149.213);--color-success-content:oklch(12.541% .033 149.213);--color-warning:oklch(66.584% .157 58.318);--color-warning-content:oklch(13.316% .031 58.318);--color-error:oklch(65.72% .199 27.33);--color-error-content:oklch(13.144% .039 27.33);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=garden]:checked),[data-theme=garden]{color-scheme:light;--color-base-100:oklch(92.951% .002 17.197);--color-base-200:oklch(86.445% .002 17.197);--color-base-300:oklch(79.938% .001 17.197);--color-base-content:oklch(16.961% .001 17.32);--color-primary:oklch(62.45% .278 3.836);--color-primary-content:oklch(100% 0 0);--color-secondary:oklch(48.495% .11 355.095);--color-secondary-content:oklch(89.699% .022 355.095);--color-accent:oklch(56.273% .054 154.39);--color-accent-content:oklch(100% 0 0);--color-neutral:oklch(24.155% .049 89.07);--color-neutral-content:oklch(92.951% .002 17.197);--color-info:oklch(72.06% .191 231.6);--color-info-content:oklch(0% 0 0);--color-success:oklch(64.8% .15 160);--color-success-content:oklch(0% 0 0);--color-warning:oklch(84.71% .199 83.87);--color-warning-content:oklch(0% 0 0);--color-error:oklch(71.76% .221 22.18);--color-error-content:oklch(0% 0 0);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=forest]:checked),[data-theme=forest]{color-scheme:dark;--color-base-100:oklch(20.84% .008 17.911);--color-base-200:oklch(18.522% .007 17.911);--color-base-300:oklch(16.203% .007 17.911);--color-base-content:oklch(83.768% .001 17.911);--color-primary:oklch(68.628% .185 148.958);--color-primary-content:oklch(0% 0 0);--color-secondary:oklch(69.776% .135 168.327);--color-secondary-content:oklch(13.955% .027 168.327);--color-accent:oklch(70.628% .119 185.713);--color-accent-content:oklch(14.125% .023 185.713);--color-neutral:oklch(30.698% .039 171.364);--color-neutral-content:oklch(86.139% .007 171.364);--color-info:oklch(72.06% .191 231.6);--color-info-content:oklch(0% 0 0);--color-success:oklch(64.8% .15 160);--color-success-content:oklch(0% 0 0);--color-warning:oklch(84.71% .199 83.87);--color-warning-content:oklch(0% 0 0);--color-error:oklch(71.76% .221 22.18);--color-error-content:oklch(0% 0 0);--radius-selector:1rem;--radius-field:2rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=aqua]:checked),[data-theme=aqua]{color-scheme:dark;--color-base-100:oklch(37% .146 265.522);--color-base-200:oklch(28% .091 267.935);--color-base-300:oklch(22% .091 267.935);--color-base-content:oklch(90% .058 230.902);--color-primary:oklch(85.661% .144 198.645);--color-primary-content:oklch(40.124% .068 197.603);--color-secondary:oklch(60.682% .108 309.782);--color-secondary-content:oklch(96% .016 293.756);--color-accent:oklch(93.426% .102 94.555);--color-accent-content:oklch(18.685% .02 94.555);--color-neutral:oklch(27% .146 265.522);--color-neutral-content:oklch(80% .146 265.522);--color-info:oklch(54.615% .215 262.88);--color-info-content:oklch(90.923% .043 262.88);--color-success:oklch(62.705% .169 149.213);--color-success-content:oklch(12.541% .033 149.213);--color-warning:oklch(66.584% .157 58.318);--color-warning-content:oklch(27% .077 45.635);--color-error:oklch(73.95% .19 27.33);--color-error-content:oklch(14.79% .038 27.33);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=lofi]:checked),[data-theme=lofi]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(97% 0 0);--color-base-300:oklch(94% 0 0);--color-base-content:oklch(0% 0 0);--color-primary:oklch(15.906% 0 0);--color-primary-content:oklch(100% 0 0);--color-secondary:oklch(21.455% .001 17.278);--color-secondary-content:oklch(100% 0 0);--color-accent:oklch(26.861% 0 0);--color-accent-content:oklch(100% 0 0);--color-neutral:oklch(0% 0 0);--color-neutral-content:oklch(100% 0 0);--color-info:oklch(79.54% .103 205.9);--color-info-content:oklch(15.908% .02 205.9);--color-success:oklch(90.13% .153 164.14);--color-success-content:oklch(18.026% .03 164.14);--color-warning:oklch(88.37% .135 79.94);--color-warning-content:oklch(17.674% .027 79.94);--color-error:oklch(78.66% .15 28.47);--color-error-content:oklch(15.732% .03 28.47);--radius-selector:2rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=pastel]:checked),[data-theme=pastel]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98.462% .001 247.838);--color-base-300:oklch(92.462% .001 247.838);--color-base-content:oklch(20% 0 0);--color-primary:oklch(90% .063 306.703);--color-primary-content:oklch(49% .265 301.924);--color-secondary:oklch(89% .058 10.001);--color-secondary-content:oklch(51% .222 16.935);--color-accent:oklch(90% .093 164.15);--color-accent-content:oklch(50% .118 165.612);--color-neutral:oklch(55% .046 257.417);--color-neutral-content:oklch(92% .013 255.508);--color-info:oklch(86% .127 207.078);--color-info-content:oklch(52% .105 223.128);--color-success:oklch(87% .15 154.449);--color-success-content:oklch(52% .154 150.069);--color-warning:oklch(83% .128 66.29);--color-warning-content:oklch(55% .195 38.402);--color-error:oklch(80% .114 19.571);--color-error-content:oklch(50% .213 27.518);--radius-selector:1rem;--radius-field:2rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:2px;--depth:0;--noise:0}:root:has(input.theme-controller[value=fantasy]:checked),[data-theme=fantasy]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(93% 0 0);--color-base-300:oklch(86% 0 0);--color-base-content:oklch(27.807% .029 256.847);--color-primary:oklch(37.45% .189 325.02);--color-primary-content:oklch(87.49% .037 325.02);--color-secondary:oklch(53.92% .162 241.36);--color-secondary-content:oklch(90.784% .032 241.36);--color-accent:oklch(75.98% .204 56.72);--color-accent-content:oklch(15.196% .04 56.72);--color-neutral:oklch(27.807% .029 256.847);--color-neutral-content:oklch(85.561% .005 256.847);--color-info:oklch(72.06% .191 231.6);--color-info-content:oklch(0% 0 0);--color-success:oklch(64.8% .15 160);--color-success-content:oklch(0% 0 0);--color-warning:oklch(84.71% .199 83.87);--color-warning-content:oklch(0% 0 0);--color-error:oklch(71.76% .221 22.18);--color-error-content:oklch(0% 0 0);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=wireframe]:checked),[data-theme=wireframe]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(97% 0 0);--color-base-300:oklch(94% 0 0);--color-base-content:oklch(20% 0 0);--color-primary:oklch(87% 0 0);--color-primary-content:oklch(26% 0 0);--color-secondary:oklch(87% 0 0);--color-secondary-content:oklch(26% 0 0);--color-accent:oklch(87% 0 0);--color-accent-content:oklch(26% 0 0);--color-neutral:oklch(87% 0 0);--color-neutral-content:oklch(26% 0 0);--color-info:oklch(44% .11 240.79);--color-info-content:oklch(90% .058 230.902);--color-success:oklch(43% .095 166.913);--color-success-content:oklch(90% .093 164.15);--color-warning:oklch(47% .137 46.201);--color-warning-content:oklch(92% .12 95.746);--color-error:oklch(44% .177 26.899);--color-error-content:oklch(88% .062 18.334);--radius-selector:0rem;--radius-field:.25rem;--radius-box:.25rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=black]:checked),[data-theme=black]{color-scheme:dark;--color-base-100:oklch(0% 0 0);--color-base-200:oklch(19% 0 0);--color-base-300:oklch(22% 0 0);--color-base-content:oklch(87.609% 0 0);--color-primary:oklch(35% 0 0);--color-primary-content:oklch(100% 0 0);--color-secondary:oklch(35% 0 0);--color-secondary-content:oklch(100% 0 0);--color-accent:oklch(35% 0 0);--color-accent-content:oklch(100% 0 0);--color-neutral:oklch(35% 0 0);--color-neutral-content:oklch(100% 0 0);--color-info:oklch(45.201% .313 264.052);--color-info-content:oklch(89.04% .062 264.052);--color-success:oklch(51.975% .176 142.495);--color-success-content:oklch(90.395% .035 142.495);--color-warning:oklch(96.798% .211 109.769);--color-warning-content:oklch(19.359% .042 109.769);--color-error:oklch(62.795% .257 29.233);--color-error-content:oklch(12.559% .051 29.233);--radius-selector:0rem;--radius-field:0rem;--radius-box:0rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=luxury]:checked),[data-theme=luxury]{color-scheme:dark;--color-base-100:oklch(14.076% .004 285.822);--color-base-200:oklch(20.219% .004 308.229);--color-base-300:oklch(23.219% .004 308.229);--color-base-content:oklch(75.687% .123 76.89);--color-primary:oklch(100% 0 0);--color-primary-content:oklch(20% 0 0);--color-secondary:oklch(27.581% .064 261.069);--color-secondary-content:oklch(85.516% .012 261.069);--color-accent:oklch(36.674% .051 338.825);--color-accent-content:oklch(87.334% .01 338.825);--color-neutral:oklch(24.27% .057 59.825);--color-neutral-content:oklch(93.203% .089 90.861);--color-info:oklch(79.061% .121 237.133);--color-info-content:oklch(15.812% .024 237.133);--color-success:oklch(78.119% .192 132.154);--color-success-content:oklch(15.623% .038 132.154);--color-warning:oklch(86.127% .136 102.891);--color-warning-content:oklch(17.225% .027 102.891);--color-error:oklch(71.753% .176 22.568);--color-error-content:oklch(14.35% .035 22.568);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=dracula]:checked),[data-theme=dracula]{color-scheme:dark;--color-base-100:oklch(28.822% .022 277.508);--color-base-200:oklch(26.805% .02 277.508);--color-base-300:oklch(24.787% .019 277.508);--color-base-content:oklch(97.747% .007 106.545);--color-primary:oklch(75.461% .183 346.812);--color-primary-content:oklch(15.092% .036 346.812);--color-secondary:oklch(74.202% .148 301.883);--color-secondary-content:oklch(14.84% .029 301.883);--color-accent:oklch(83.392% .124 66.558);--color-accent-content:oklch(16.678% .024 66.558);--color-neutral:oklch(39.445% .032 275.524);--color-neutral-content:oklch(87.889% .006 275.524);--color-info:oklch(88.263% .093 212.846);--color-info-content:oklch(17.652% .018 212.846);--color-success:oklch(87.099% .219 148.024);--color-success-content:oklch(17.419% .043 148.024);--color-warning:oklch(95.533% .134 112.757);--color-warning-content:oklch(19.106% .026 112.757);--color-error:oklch(68.22% .206 24.43);--color-error-content:oklch(13.644% .041 24.43);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=cmyk]:checked),[data-theme=cmyk]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(95% 0 0);--color-base-300:oklch(90% 0 0);--color-base-content:oklch(20% 0 0);--color-primary:oklch(71.772% .133 239.443);--color-primary-content:oklch(14.354% .026 239.443);--color-secondary:oklch(64.476% .202 359.339);--color-secondary-content:oklch(12.895% .04 359.339);--color-accent:oklch(94.228% .189 105.306);--color-accent-content:oklch(18.845% .037 105.306);--color-neutral:oklch(21.778% 0 0);--color-neutral-content:oklch(84.355% 0 0);--color-info:oklch(68.475% .094 217.284);--color-info-content:oklch(13.695% .018 217.284);--color-success:oklch(46.949% .162 321.406);--color-success-content:oklch(89.389% .032 321.406);--color-warning:oklch(71.236% .159 52.023);--color-warning-content:oklch(14.247% .031 52.023);--color-error:oklch(62.013% .208 28.717);--color-error-content:oklch(12.402% .041 28.717);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=autumn]:checked),[data-theme=autumn]{color-scheme:light;--color-base-100:oklch(95.814% 0 0);--color-base-200:oklch(89.107% 0 0);--color-base-300:oklch(82.4% 0 0);--color-base-content:oklch(19.162% 0 0);--color-primary:oklch(40.723% .161 17.53);--color-primary-content:oklch(88.144% .032 17.53);--color-secondary:oklch(61.676% .169 23.865);--color-secondary-content:oklch(12.335% .033 23.865);--color-accent:oklch(73.425% .094 60.729);--color-accent-content:oklch(14.685% .018 60.729);--color-neutral:oklch(54.367% .037 51.902);--color-neutral-content:oklch(90.873% .007 51.902);--color-info:oklch(69.224% .097 207.284);--color-info-content:oklch(13.844% .019 207.284);--color-success:oklch(60.995% .08 174.616);--color-success-content:oklch(12.199% .016 174.616);--color-warning:oklch(70.081% .164 56.844);--color-warning-content:oklch(14.016% .032 56.844);--color-error:oklch(53.07% .241 24.16);--color-error-content:oklch(90.614% .048 24.16);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=business]:checked),[data-theme=business]{color-scheme:dark;--color-base-100:oklch(24.353% 0 0);--color-base-200:oklch(22.648% 0 0);--color-base-300:oklch(20.944% 0 0);--color-base-content:oklch(84.87% 0 0);--color-primary:oklch(41.703% .099 251.473);--color-primary-content:oklch(88.34% .019 251.473);--color-secondary:oklch(64.092% .027 229.389);--color-secondary-content:oklch(12.818% .005 229.389);--color-accent:oklch(67.271% .167 35.791);--color-accent-content:oklch(13.454% .033 35.791);--color-neutral:oklch(27.441% .013 253.041);--color-neutral-content:oklch(85.488% .002 253.041);--color-info:oklch(62.616% .143 240.033);--color-info-content:oklch(12.523% .028 240.033);--color-success:oklch(70.226% .094 156.596);--color-success-content:oklch(14.045% .018 156.596);--color-warning:oklch(77.482% .115 81.519);--color-warning-content:oklch(15.496% .023 81.519);--color-error:oklch(51.61% .146 29.674);--color-error-content:oklch(90.322% .029 29.674);--radius-selector:0rem;--radius-field:.25rem;--radius-box:.25rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=acid]:checked),[data-theme=acid]{color-scheme:light;--color-base-100:oklch(98% 0 0);--color-base-200:oklch(95% 0 0);--color-base-300:oklch(91% 0 0);--color-base-content:oklch(0% 0 0);--color-primary:oklch(71.9% .357 330.759);--color-primary-content:oklch(14.38% .071 330.759);--color-secondary:oklch(73.37% .224 48.25);--color-secondary-content:oklch(14.674% .044 48.25);--color-accent:oklch(92.78% .264 122.962);--color-accent-content:oklch(18.556% .052 122.962);--color-neutral:oklch(21.31% .128 278.68);--color-neutral-content:oklch(84.262% .025 278.68);--color-info:oklch(60.72% .227 252.05);--color-info-content:oklch(12.144% .045 252.05);--color-success:oklch(85.72% .266 158.53);--color-success-content:oklch(17.144% .053 158.53);--color-warning:oklch(91.01% .212 100.5);--color-warning-content:oklch(18.202% .042 100.5);--color-error:oklch(64.84% .293 29.349);--color-error-content:oklch(12.968% .058 29.349);--radius-selector:1rem;--radius-field:1rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=lemonade]:checked),[data-theme=lemonade]{color-scheme:light;--color-base-100:oklch(98.71% .02 123.72);--color-base-200:oklch(91.8% .018 123.72);--color-base-300:oklch(84.89% .017 123.72);--color-base-content:oklch(19.742% .004 123.72);--color-primary:oklch(58.92% .199 134.6);--color-primary-content:oklch(11.784% .039 134.6);--color-secondary:oklch(77.75% .196 111.09);--color-secondary-content:oklch(15.55% .039 111.09);--color-accent:oklch(85.39% .201 100.73);--color-accent-content:oklch(17.078% .04 100.73);--color-neutral:oklch(30.98% .075 108.6);--color-neutral-content:oklch(86.196% .015 108.6);--color-info:oklch(86.19% .047 224.14);--color-info-content:oklch(17.238% .009 224.14);--color-success:oklch(86.19% .047 157.85);--color-success-content:oklch(17.238% .009 157.85);--color-warning:oklch(86.19% .047 102.15);--color-warning-content:oklch(17.238% .009 102.15);--color-error:oklch(86.19% .047 25.85);--color-error-content:oklch(17.238% .009 25.85);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=night]:checked),[data-theme=night]{color-scheme:dark;--color-base-100:oklch(20.768% .039 265.754);--color-base-200:oklch(19.314% .037 265.754);--color-base-300:oklch(17.86% .034 265.754);--color-base-content:oklch(84.153% .007 265.754);--color-primary:oklch(75.351% .138 232.661);--color-primary-content:oklch(15.07% .027 232.661);--color-secondary:oklch(68.011% .158 276.934);--color-secondary-content:oklch(13.602% .031 276.934);--color-accent:oklch(72.36% .176 350.048);--color-accent-content:oklch(14.472% .035 350.048);--color-neutral:oklch(27.949% .036 260.03);--color-neutral-content:oklch(85.589% .007 260.03);--color-info:oklch(68.455% .148 237.251);--color-info-content:oklch(0% 0 0);--color-success:oklch(78.452% .132 181.911);--color-success-content:oklch(15.69% .026 181.911);--color-warning:oklch(83.242% .139 82.95);--color-warning-content:oklch(16.648% .027 82.95);--color-error:oklch(71.785% .17 13.118);--color-error-content:oklch(14.357% .034 13.118);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=coffee]:checked),[data-theme=coffee]{color-scheme:dark;--color-base-100:oklch(24% .023 329.708);--color-base-200:oklch(21% .021 329.708);--color-base-300:oklch(16% .019 329.708);--color-base-content:oklch(72.354% .092 79.129);--color-primary:oklch(71.996% .123 62.756);--color-primary-content:oklch(14.399% .024 62.756);--color-secondary:oklch(34.465% .029 199.194);--color-secondary-content:oklch(86.893% .005 199.194);--color-accent:oklch(42.621% .074 224.389);--color-accent-content:oklch(88.524% .014 224.389);--color-neutral:oklch(16.51% .015 326.261);--color-neutral-content:oklch(83.302% .003 326.261);--color-info:oklch(79.49% .063 184.558);--color-info-content:oklch(15.898% .012 184.558);--color-success:oklch(74.722% .072 131.116);--color-success-content:oklch(14.944% .014 131.116);--color-warning:oklch(88.15% .14 87.722);--color-warning-content:oklch(17.63% .028 87.722);--color-error:oklch(77.318% .128 31.871);--color-error-content:oklch(15.463% .025 31.871);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=winter]:checked),[data-theme=winter]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(97.466% .011 259.822);--color-base-300:oklch(93.268% .016 262.751);--color-base-content:oklch(41.886% .053 255.824);--color-primary:oklch(56.86% .255 257.57);--color-primary-content:oklch(91.372% .051 257.57);--color-secondary:oklch(42.551% .161 282.339);--color-secondary-content:oklch(88.51% .032 282.339);--color-accent:oklch(59.939% .191 335.171);--color-accent-content:oklch(11.988% .038 335.171);--color-neutral:oklch(19.616% .063 257.651);--color-neutral-content:oklch(83.923% .012 257.651);--color-info:oklch(88.127% .085 214.515);--color-info-content:oklch(17.625% .017 214.515);--color-success:oklch(80.494% .077 197.823);--color-success-content:oklch(16.098% .015 197.823);--color-warning:oklch(89.172% .045 71.47);--color-warning-content:oklch(17.834% .009 71.47);--color-error:oklch(73.092% .11 20.076);--color-error-content:oklch(14.618% .022 20.076);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=dim]:checked),[data-theme=dim]{color-scheme:dark;--color-base-100:oklch(30.857% .023 264.149);--color-base-200:oklch(28.036% .019 264.182);--color-base-300:oklch(26.346% .018 262.177);--color-base-content:oklch(82.901% .031 222.959);--color-primary:oklch(86.133% .141 139.549);--color-primary-content:oklch(17.226% .028 139.549);--color-secondary:oklch(73.375% .165 35.353);--color-secondary-content:oklch(14.675% .033 35.353);--color-accent:oklch(74.229% .133 311.379);--color-accent-content:oklch(14.845% .026 311.379);--color-neutral:oklch(24.731% .02 264.094);--color-neutral-content:oklch(82.901% .031 222.959);--color-info:oklch(86.078% .142 206.182);--color-info-content:oklch(17.215% .028 206.182);--color-success:oklch(86.171% .142 166.534);--color-success-content:oklch(17.234% .028 166.534);--color-warning:oklch(86.163% .142 94.818);--color-warning-content:oklch(17.232% .028 94.818);--color-error:oklch(82.418% .099 33.756);--color-error-content:oklch(16.483% .019 33.756);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=nord]:checked),[data-theme=nord]{color-scheme:light;--color-base-100:oklch(95.127% .007 260.731);--color-base-200:oklch(93.299% .01 261.788);--color-base-300:oklch(89.925% .016 262.749);--color-base-content:oklch(32.437% .022 264.182);--color-primary:oklch(59.435% .077 254.027);--color-primary-content:oklch(11.887% .015 254.027);--color-secondary:oklch(69.651% .059 248.687);--color-secondary-content:oklch(13.93% .011 248.687);--color-accent:oklch(77.464% .062 217.469);--color-accent-content:oklch(15.492% .012 217.469);--color-neutral:oklch(45.229% .035 264.131);--color-neutral-content:oklch(89.925% .016 262.749);--color-info:oklch(69.207% .062 332.664);--color-info-content:oklch(13.841% .012 332.664);--color-success:oklch(76.827% .074 131.063);--color-success-content:oklch(15.365% .014 131.063);--color-warning:oklch(85.486% .089 84.093);--color-warning-content:oklch(17.097% .017 84.093);--color-error:oklch(60.61% .12 15.341);--color-error-content:oklch(12.122% .024 15.341);--radius-selector:1rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=sunset]:checked),[data-theme=sunset]{color-scheme:dark;--color-base-100:oklch(22% .019 237.69);--color-base-200:oklch(20% .019 237.69);--color-base-300:oklch(18% .019 237.69);--color-base-content:oklch(77.383% .043 245.096);--color-primary:oklch(74.703% .158 39.947);--color-primary-content:oklch(14.94% .031 39.947);--color-secondary:oklch(72.537% .177 2.72);--color-secondary-content:oklch(14.507% .035 2.72);--color-accent:oklch(71.294% .166 299.844);--color-accent-content:oklch(14.258% .033 299.844);--color-neutral:oklch(26% .019 237.69);--color-neutral-content:oklch(70% .019 237.69);--color-info:oklch(85.559% .085 206.015);--color-info-content:oklch(17.111% .017 206.015);--color-success:oklch(85.56% .085 144.778);--color-success-content:oklch(17.112% .017 144.778);--color-warning:oklch(85.569% .084 74.427);--color-warning-content:oklch(17.113% .016 74.427);--color-error:oklch(85.511% .078 16.886);--color-error-content:oklch(17.102% .015 16.886);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=caramellatte]:checked),[data-theme=caramellatte]{color-scheme:light;--color-base-100:oklch(98% .016 73.684);--color-base-200:oklch(95% .038 75.164);--color-base-300:oklch(90% .076 70.697);--color-base-content:oklch(40% .123 38.172);--color-primary:oklch(0% 0 0);--color-primary-content:oklch(100% 0 0);--color-secondary:oklch(22.45% .075 37.85);--color-secondary-content:oklch(90% .076 70.697);--color-accent:oklch(46.44% .111 37.85);--color-accent-content:oklch(90% .076 70.697);--color-neutral:oklch(55% .195 38.402);--color-neutral-content:oklch(98% .016 73.684);--color-info:oklch(42% .199 265.638);--color-info-content:oklch(90% .076 70.697);--color-success:oklch(43% .095 166.913);--color-success-content:oklch(90% .076 70.697);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(70% .191 22.216);--color-error-content:oklch(39% .141 25.723);--radius-selector:2rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:2px;--depth:1;--noise:1}:root:has(input.theme-controller[value=abyss]:checked),[data-theme=abyss]{color-scheme:dark;--color-base-100:oklch(20% .08 209);--color-base-200:oklch(15% .08 209);--color-base-300:oklch(10% .08 209);--color-base-content:oklch(90% .076 70.697);--color-primary:oklch(92% .2653 125);--color-primary-content:oklch(50% .2653 125);--color-secondary:oklch(83.27% .0764 298.3);--color-secondary-content:oklch(43.27% .0764 298.3);--color-accent:oklch(43% 0 0);--color-accent-content:oklch(98% 0 0);--color-neutral:oklch(30% .08 209);--color-neutral-content:oklch(90% .076 70.697);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(79% .209 151.711);--color-success-content:oklch(26% .065 152.934);--color-warning:oklch(84.8% .1962 84.62);--color-warning-content:oklch(44.8% .1962 84.62);--color-error:oklch(65% .1985 24.22);--color-error-content:oklch(27% .1985 24.22);--radius-selector:2rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=silk]:checked),[data-theme=silk]{color-scheme:light;--color-base-100:oklch(97% .0035 67.78);--color-base-200:oklch(95% .0081 61.42);--color-base-300:oklch(90% .0081 61.42);--color-base-content:oklch(40% .0081 61.42);--color-primary:oklch(23.27% .0249 284.3);--color-primary-content:oklch(94.22% .2505 117.44);--color-secondary:oklch(23.27% .0249 284.3);--color-secondary-content:oklch(73.92% .2135 50.94);--color-accent:oklch(23.27% .0249 284.3);--color-accent-content:oklch(88.92% .2061 189.9);--color-neutral:oklch(20% 0 0);--color-neutral-content:oklch(80% .0081 61.42);--color-info:oklch(80.39% .1148 241.68);--color-info-content:oklch(30.39% .1148 241.68);--color-success:oklch(83.92% .0901 136.87);--color-success-content:oklch(23.92% .0901 136.87);--color-warning:oklch(83.92% .1085 80);--color-warning-content:oklch(43.92% .1085 80);--color-error:oklch(75.1% .1814 22.37);--color-error-content:oklch(35.1% .1814 22.37);--radius-selector:2rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:2px;--depth:1;--noise:0}:root{--fx-noise:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.34' numOctaves='4' stitchTiles='stitch'%3E%3C/feTurbulence%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23a)' opacity='0.2'%3E%3C/rect%3E%3C/svg%3E");scrollbar-color:currentColor #0000}@supports (color:color-mix(in lab,red,red)){:root{scrollbar-color:color-mix(in oklch,currentColor 35%,#0000)#0000}}@property --radialprogress{syntax: "<percentage>"; inherits: true; initial-value: 0%;}:root:not(span){overflow:var(--page-overflow)}:root{--page-scroll-bg-on:linear-gradient(var(--root-bg),var(--root-bg))var(--root-bg)}@supports (color:color-mix(in lab,red,red)){:root{--page-scroll-bg-on:linear-gradient(var(--root-bg),var(--root-bg))color-mix(in srgb,var(--root-bg),oklch(0% 0 0) calc(var(--page-has-backdrop,0)*40%))}}:root{--page-scroll-transition-on:background-color .3s ease-out;transition:var(--page-scroll-transition);scrollbar-gutter:var(--page-scroll-gutter,unset);scrollbar-gutter:if(style(--page-has-scroll: 1): var(--page-scroll-gutter,unset); else: unset)}:root:root{background:var(--page-scroll-bg,var(--root-bg,var(--color-base-100)))}@keyframes set-page-has-scroll{0%,to{--page-has-scroll:1}}:root,[data-theme]{background-color:var(--root-bg,var(--color-base-100));color:var(--color-base-content)}:where(:root,[data-theme]){--root-bg:var(--color-base-100)}}@layer components;@layer utilities{@layer daisyui.component{.diff{webkit-user-select:none;-webkit-user-select:none;user-select:none;direction:ltr;grid-template-rows:1fr 1.8rem 1fr;grid-template-columns:auto 1fr;width:100%;display:grid;position:relative;overflow:hidden;container-type:inline-size}.diff:focus-visible,.diff:has(.diff-item-1:focus-visible){outline-style:var(--tw-outline-style);outline-offset:1px;outline-width:2px;outline-color:var(--color-base-content)}.diff:focus-visible .diff-resizer{min-width:95cqi;max-width:95cqi}.diff:has(.diff-item-1:focus-visible){outline-style:var(--tw-outline-style);outline-offset:1px;outline-width:2px}.diff:has(.diff-item-1:focus-visible) .diff-resizer{min-width:5cqi;max-width:5cqi}@supports (-webkit-overflow-scrolling:touch) and (overflow:-webkit-paged-x){.diff:focus .diff-resizer{min-width:5cqi;max-width:5cqi}.diff:has(.diff-item-1:focus) .diff-resizer{min-width:95cqi;max-width:95cqi}}.modal{pointer-events:none;visibility:hidden;width:100%;max-width:none;height:100%;max-height:none;color:inherit;transition:visibility .3s allow-discrete,background-color .3s ease-out,opacity .1s ease-out;overscroll-behavior:contain;z-index:999;scrollbar-gutter:auto;background-color:#0000;place-items:center;margin:0;padding:0;display:grid;position:fixed;inset:0;overflow:clip}.modal::backdrop{display:none}:where(.drawer-side){overflow:hidden}.drawer-side{pointer-events:none;visibility:hidden;z-index:10;overscroll-behavior:contain;opacity:0;width:100%;transition:opacity .2s ease-out .1s allow-discrete,visibility .3s ease-out .1s allow-discrete;inset-inline-start:0;background-color:#0000;grid-template-rows:repeat(1,minmax(0,1fr));grid-template-columns:repeat(1,minmax(0,1fr));grid-row-start:1;grid-column-start:1;place-items:flex-start start;height:100dvh;display:grid;position:fixed;top:0}.drawer-side>.drawer-overlay{cursor:pointer;background-color:#0006;place-self:stretch stretch;position:sticky;top:0}.drawer-side>*{grid-row-start:1;grid-column-start:1}.drawer-side>:not(.drawer-overlay){will-change:transform;transition:translate .3s ease-out,width .2s ease-out;translate:-100%}[dir=rtl] :is(.drawer-side>:not(.drawer-overlay)){translate:100%}.fab{pointer-events:none;z-index:999;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));white-space:nowrap;inset-inline-end:1rem;flex-direction:column-reverse;align-items:flex-end;gap:.5rem;display:flex;position:fixed;bottom:1rem}.fab>*{pointer-events:auto;align-items:center;gap:.5rem;display:flex}.fab>:hover,.fab>:has(:focus-visible){z-index:1}.fab>[tabindex]:first-child{transition-property:opacity,visibility,rotate;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);display:grid;position:relative}.fab .fab-close,.fab .fab-main-action{inset-inline-end:0;position:absolute;bottom:0}:is(.fab:focus-within:has(.fab-close),.fab:focus-within:has(.fab-main-action))>[tabindex]{opacity:0;rotate:90deg}.fab:focus-within>[tabindex]:first-child{pointer-events:none}.fab:focus-within>:nth-child(n+2){visibility:visible;--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y);opacity:1}.fab>:nth-child(n+2){visibility:hidden;--tw-scale-x:80%;--tw-scale-y:80%;--tw-scale-z:80%;scale:var(--tw-scale-x)var(--tw-scale-y);opacity:0;transition-property:opacity,scale,visibility;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.fab>:nth-child(n+2).fab-main-action,.fab>:nth-child(n+2).fab-close{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.fab>:nth-child(3){transition-delay:30ms}.fab>:nth-child(4){transition-delay:60ms}.fab>:nth-child(5){transition-delay:90ms}.fab>:nth-child(6){transition-delay:.12s}.drawer-toggle{appearance:none;opacity:0;width:0;height:0;position:fixed}.tooltip{--tt-bg:var(--color-neutral);--tt-off: calc(100% + .5rem) ;--tt-tail: calc(100% + 1px + .25rem) ;display:inline-block;position:relative}.tooltip>.tooltip-content,.tooltip[data-tip]:before{border-radius:var(--radius-field);text-align:center;white-space:normal;max-width:20rem;color:var(--color-neutral-content);opacity:0;background-color:var(--tt-bg);pointer-events:none;z-index:2;--tw-content:attr(data-tip);content:var(--tw-content);width:max-content;padding-block:.25rem;padding-inline:.5rem;font-size:.875rem;line-height:1.25;position:absolute}@media(prefers-reduced-motion:no-preference){.tooltip>.tooltip-content,.tooltip[data-tip]:before,.tooltip:after{transition:opacity .2s cubic-bezier(.4,0,.2,1) 75ms,transform .2s cubic-bezier(.4,0,.2,1) 75ms}}.tooltip:after{opacity:0;background-color:var(--tt-bg);content:"";pointer-events:none;--mask-tooltip:url("data:image/svg+xml,%3Csvg width='10' height='4' viewBox='0 0 8 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.500009 1C3.5 1 3.00001 4 5.00001 4C7 4 6.5 1 9.5 1C10 1 10 0.499897 10 0H0C-1.99338e-08 0.5 0 1 0.500009 1Z' fill='black'/%3E%3C/svg%3E%0A");width:.625rem;height:.25rem;-webkit-mask-position:-1px 0;mask-position:-1px 0;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-image:var(--mask-tooltip);mask-image:var(--mask-tooltip);display:block;position:absolute}:is(.tooltip.tooltip-open,.tooltip[data-tip]:not([data-tip=""]):hover,.tooltip:not(:has(.tooltip-content:empty)):has(.tooltip-content):hover,.tooltip[data-tip]:not([data-tip=""]):has(:focus-visible))>.tooltip-content,:is(.tooltip.tooltip-open,.tooltip[data-tip]:not([data-tip=""]):hover,.tooltip:not(:has(.tooltip-content:empty)):has(.tooltip-content):hover,.tooltip[data-tip]:not([data-tip=""]):has(:focus-visible))[data-tip]:before,:is(.tooltip.tooltip-open,.tooltip[data-tip]:not([data-tip=""]):hover,.tooltip:not(:has(.tooltip-content:empty)):has(.tooltip-content):hover,.tooltip[data-tip]:not([data-tip=""]):has(:focus-visible)):after{opacity:1;--tt-pos:0rem}@media(prefers-reduced-motion:no-preference){:is(.tooltip.tooltip-open,.tooltip[data-tip]:not([data-tip=""]):hover,.tooltip:not(:has(.tooltip-content:empty)):has(.tooltip-content):hover,.tooltip[data-tip]:not([data-tip=""]):has(:focus-visible))>.tooltip-content,:is(.tooltip.tooltip-open,.tooltip[data-tip]:not([data-tip=""]):hover,.tooltip:not(:has(.tooltip-content:empty)):has(.tooltip-content):hover,.tooltip[data-tip]:not([data-tip=""]):has(:focus-visible))[data-tip]:before,:is(.tooltip.tooltip-open,.tooltip[data-tip]:not([data-tip=""]):hover,.tooltip:not(:has(.tooltip-content:empty)):has(.tooltip-content):hover,.tooltip[data-tip]:not([data-tip=""]):has(:focus-visible)):after{transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1)}}.tab{cursor:pointer;appearance:none;text-align:center;webkit-user-select:none;-webkit-user-select:none;user-select:none;flex-wrap:wrap;justify-content:center;align-items:center;display:inline-flex;position:relative}@media(hover:hover){.tab:hover{color:var(--color-base-content)}}.tab{--tab-p:.75rem;--tab-bg:var(--color-base-100);--tab-border-color:var(--color-base-300);--tab-radius-ss:0;--tab-radius-se:0;--tab-radius-es:0;--tab-radius-ee:0;--tab-order:0;--tab-radius-min:calc(.75rem - var(--border));--tab-radius-limit:min(var(--radius-field),var(--tab-radius-min));--tab-radius-grad:#0000 calc(69% - var(--border)),var(--tab-border-color)calc(calc(69% - var(--border)) + .25px),var(--tab-border-color)calc(calc(69% - var(--border)) + var(--border)),var(--tab-bg)calc(calc(69% - var(--border)) + var(--border) + .25px);order:var(--tab-order);height:var(--tab-height);border-color:#0000;padding-inline-start:var(--tab-p);padding-inline-end:var(--tab-p);font-size:.875rem}.tab:is(input[type=radio]){min-width:fit-content}.tab:is(input[type=radio]):after{--tw-content:attr(aria-label);content:var(--tw-content)}.tab:is(label){position:relative}.tab:is(label) input{cursor:pointer;appearance:none;opacity:0;position:absolute;inset:0}:is(.tab:checked,.tab:is(label:has(:checked)),.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]))+.tab-content{display:block}.tab:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.tab:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:color-mix(in oklab,var(--color-base-content)50%,transparent)}}.tab:not(input):empty{cursor:default;flex-grow:1}.tab:focus{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.tab:focus{outline-offset:2px;outline:2px solid #0000}}.tab:focus-visible,.tab:is(label:has(:checked:focus-visible)){outline-offset:-5px;outline:2px solid}.tab[disabled]{pointer-events:none;opacity:.4}.menu{--menu-active-fg:var(--color-neutral-content);--menu-active-bg:var(--color-neutral);flex-flow:column wrap;width:fit-content;padding:.5rem;font-size:.875rem;display:flex}.menu :where(li ul){white-space:nowrap;margin-inline-start:1rem;padding-inline-start:.5rem;position:relative}.menu :where(li ul):before{background-color:var(--color-base-content);opacity:.1;width:var(--border);content:"";inset-inline-start:0;position:absolute;top:.75rem;bottom:.75rem}.menu :where(li>.menu-dropdown:not(.menu-dropdown-show)){display:none}.menu :where(li:not(.menu-title)>:not(ul,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--radius-field);text-align:start;text-wrap:balance;-webkit-user-select:none;user-select:none;grid-auto-columns:minmax(auto,max-content) auto max-content;grid-auto-flow:column;align-content:flex-start;align-items:center;gap:.5rem;padding-block:.375rem;padding-inline:.75rem;transition-property:color,background-color,box-shadow;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:grid}.menu :where(li>details>summary){--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.menu :where(li>details>summary){outline-offset:2px;outline:2px solid #0000}}.menu :where(li>details>summary)::-webkit-details-marker{display:none}:is(.menu :where(li>details>summary),.menu :where(li>.menu-dropdown-toggle)):after{content:"";transform-origin:50%;pointer-events:none;justify-self:flex-end;width:.375rem;height:.375rem;transition-property:rotate,translate;transition-duration:.2s;display:block;translate:0 -1px;rotate:-135deg;box-shadow:inset 2px 2px}.menu :where(li>details[open]>summary):after,.menu :where(li>.menu-dropdown-toggle.menu-dropdown-show):after{translate:0 1px;rotate:45deg}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{background-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{color:var(--color-base-content);--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){background-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){box-shadow:inset 0 1px #00000003,inset 0 -1px #ffffff03}.menu :where(li:empty){background-color:var(--color-base-content);opacity:.1;height:1px;margin:.5rem 1rem}.menu :where(li){flex-flow:column wrap;flex-shrink:0;align-items:stretch;display:flex;position:relative}.menu :where(li) .badge{justify-self:flex-end}.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{outline-offset:2px;outline:2px solid #0000}}.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{color:var(--menu-active-fg);background-color:var(--menu-active-bg);background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise)}:is(.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):not(:is(.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):active){box-shadow:0 2px calc(var(--depth)*3px) -2px var(--menu-active-bg)}.menu :where(li).menu-disabled{pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.menu :where(li).menu-disabled{color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.menu .dropdown:focus-within .menu-dropdown-toggle:after{translate:0 1px;rotate:45deg}.menu .dropdown-content{margin-top:.5rem;padding:.5rem}.menu .dropdown-content:before{display:none}.floating-label{display:block;position:relative}.floating-label input{display:block}.floating-label input::placeholder,.floating-label textarea::placeholder{transition:top .1s ease-out,translate .1s ease-out,scale .1s ease-out,opacity .1s ease-out}.floating-label>span{z-index:1;background-color:var(--color-base-100);opacity:0;inset-inline-start:.75rem;top:calc(var(--size-field,.25rem)*10/2);pointer-events:none;border-radius:2px;padding-inline:.25rem;font-size:.875rem;line-height:1;transition:top .1s ease-out,translate .1s ease-out,scale .1s ease-out,opacity .1s ease-out;position:absolute;translate:0 -50%}:is(.floating-label:focus-within,.floating-label:not(:has(input:placeholder-shown,textarea:placeholder-shown))) ::placeholder{opacity:0;pointer-events:auto;top:0;translate:-12.5% calc(-50% - .125em);scale:.75}:is(.floating-label:focus-within,.floating-label:not(:has(input:placeholder-shown,textarea:placeholder-shown)))>span{opacity:1;pointer-events:auto;z-index:2;top:0;translate:-12.5% calc(-50% - .125em);scale:.75}.floating-label:has(:disabled,[disabled])>span{opacity:0}.floating-label:has(.input-xs,.select-xs,.textarea-xs) span{top:calc(var(--size-field,.25rem)*6/2);font-size:.6875rem}.floating-label:has(.input-sm,.select-sm,.textarea-sm) span{top:calc(var(--size-field,.25rem)*8/2);font-size:.75rem}.floating-label:has(.input-md,.select-md,.textarea-md) span{top:calc(var(--size-field,.25rem)*10/2);font-size:.875rem}.floating-label:has(.input-lg,.select-lg,.textarea-lg) span{top:calc(var(--size-field,.25rem)*12/2);font-size:1.125rem}.floating-label:has(.input-xl,.select-xl,.textarea-xl) span{top:calc(var(--size-field,.25rem)*14/2);font-size:1.375rem}.diff-item-2{grid-row:1/span 3;grid-column-start:1;position:relative}.diff-item-2:after{pointer-events:none;z-index:2;background-color:var(--color-base-100);border-radius:3.40282e38px;position:absolute;top:50%;bottom:0;right:1px}@supports (color:color-mix(in lab,red,red)){.diff-item-2:after{background-color:color-mix(in oklab,var(--color-base-100)50%,transparent)}}.diff-item-2:after{border:2px solid var(--color-base-100);content:"";outline:1px solid var(--color-base-content);width:1.2rem;height:1.8rem}@supports (color:color-mix(in lab,red,red)){.diff-item-2:after{outline:1px solid color-mix(in oklab,var(--color-base-content)5%,#0000)}}.diff-item-2:after{outline-offset:-3px;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);translate:50% -50%;box-shadow:0 1px 2px #0000001a}.diff-item-2>*{pointer-events:none;object-fit:cover;object-position:center;width:100cqi;max-width:none;height:100%;position:absolute;top:0;bottom:0;left:0}@supports (-webkit-overflow-scrolling:touch) and (overflow:-webkit-paged-x){.diff-item-2:after{--tw-content:none;content:var(--tw-content)}}.pika-single:is(div){-webkit-user-select:none;user-select:none;z-index:999;color:var(--color-base-content);background-color:var(--color-base-100);border-radius:var(--radius-box);border:var(--border)solid var(--color-base-200);padding:.5rem;font-size:.75rem;display:inline-block;position:relative}.pika-single:is(div):before,.pika-single:is(div):after{content:"";display:table}.pika-single:is(div):after{clear:both}.pika-single:is(div).is-hidden{display:none}.pika-single:is(div).is-bound{position:absolute}.pika-single:is(div) .pika-lendar{css-float:left}.pika-single:is(div) .pika-title{text-align:center;position:relative}.pika-single:is(div) .pika-title select{cursor:pointer;z-index:999;opacity:0;margin:0;position:absolute;top:5px;left:0}.pika-single:is(div) .pika-label{z-index:999;background-color:var(--color-base-100);margin:0;padding:5px 3px;display:inline-block;position:relative;overflow:hidden}.pika-single:is(div) .pika-prev,.pika-single:is(div) .pika-next{cursor:pointer;color:#0000;border-radius:var(--radius-field);border:0;outline:none;width:2.25rem;height:2.25rem;font-size:1.2em;display:block;position:absolute;top:0}:is(.pika-single:is(div) .pika-prev,.pika-single:is(div) .pika-next):hover{background-color:var(--color-base-200)}:is(.pika-single:is(div) .pika-prev,.pika-single:is(div) .pika-next).is-disabled{cursor:default;opacity:.2}:is(.pika-single:is(div) .pika-prev,.pika-single:is(div) .pika-next):before{width:2.25rem;height:2.25rem;color:var(--color-base-content);line-height:2.25;display:inline-block}.pika-single:is(div) .pika-prev{left:0}.pika-single:is(div) .pika-prev:before{--tw-content:"‹";content:var(--tw-content)}.pika-single:is(div) .pika-next{right:0}.pika-single:is(div) .pika-next:before{--tw-content:"›";content:var(--tw-content)}.pika-single:is(div) .pika-select{display:inline-block}.pika-single:is(div) .pika-table{border-collapse:collapse;border-spacing:0;border:0;width:100%}.pika-single:is(div) .pika-table th,.pika-single:is(div) .pika-table td{padding:0}.pika-single:is(div) .pika-table th{opacity:.6;text-align:center;width:2.25rem;height:2.25rem}.pika-single:is(div) .pika-button{cursor:pointer;text-align:right;text-align:center;border:0;outline:none;width:2.25rem;height:2.25rem;margin:0;padding:5px;display:block}.pika-single:is(div) .pika-week{color:var(--color-base-content)}.pika-single:is(div) .is-today .pika-button{background:var(--color-primary);color:var(--color-primary-content)}:is(.pika-single:is(div) .is-selected,.pika-single:is(div) .has-event) .pika-button,:is(.pika-single:is(div) .is-selected,.pika-single:is(div) .has-event) .pika-button:hover{color:var(--color-base-100);background-color:var(--color-base-content);border-radius:var(--radius-field)}.pika-single:is(div) .has-event .pika-button,:is(.pika-single:is(div) .is-disabled,.pika-single:is(div) .is-inrange) .pika-button{background:var(--color-base-primary)}.pika-single:is(div) .is-startrange .pika-button,.pika-single:is(div) .is-endrange .pika-button{color:var(--color-base-100);background:var(--color-base-content);border-radius:var(--radius-field)}.pika-single:is(div) .is-disabled .pika-button{pointer-events:none;cursor:default;color:var(--color-base-content);opacity:.3}.pika-single:is(div) .is-outside-current-month .pika-button{color:var(--color-base-content);opacity:.3}.pika-single:is(div) .is-selection-disabled{pointer-events:none;cursor:default}.pika-single:is(div) .pika-button:hover,.pika-single:is(div) .pika-row.pick-whole-week:hover .pika-button{color:var(--color-base-content);background-color:var(--color-base-200);border-radius:var(--radius-field)}.pika-single:is(div) .pika-table abbr{font-weight:400;text-decoration:none}.diff-item-1{z-index:1;border-right:2px solid var(--color-base-100);grid-row:1/span 3;grid-column-start:1;position:relative;overflow:hidden}.diff-item-1:focus-visible{--tw-outline-style:none;outline-style:none}.diff-item-1>*{pointer-events:none;object-fit:cover;object-position:center;width:100cqi;max-width:none;height:100%;position:absolute;top:0;bottom:0;left:0}.dock{z-index:1;background-color:var(--color-base-100);color:currentColor;border-top:.5px solid var(--color-base-content);flex-direction:row;justify-content:space-around;align-items:center;width:100%;padding:.5rem;display:flex;position:fixed;bottom:0;left:0;right:0}@supports (color:color-mix(in lab,red,red)){.dock{border-top:.5px solid color-mix(in oklab,var(--color-base-content)5%,#0000)}}.dock{height:4rem;height:calc(4rem + env(safe-area-inset-bottom));padding-bottom:env(safe-area-inset-bottom)}.dock>*{cursor:pointer;border-radius:var(--radius-box);background-color:#0000;flex-direction:column;flex-shrink:1;flex-basis:100%;justify-content:center;align-items:center;gap:1px;max-width:8rem;height:100%;margin-bottom:.5rem;transition:opacity .2s ease-out;display:flex;position:relative}@media(hover:hover){.dock>:hover{opacity:.8}}:is(.dock>[aria-disabled=true],.dock>[disabled]),:is(.dock>[aria-disabled=true],.dock>[disabled]):hover{pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){:is(.dock>[aria-disabled=true],.dock>[disabled]),:is(.dock>[aria-disabled=true],.dock>[disabled]):hover{color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}:is(.dock>[aria-disabled=true],.dock>[disabled]),:is(.dock>[aria-disabled=true],.dock>[disabled]):hover{opacity:1}.dock>* .dock-label{font-size:.6875rem}.dock>:after{content:"";background-color:#0000;border-top:3px solid #0000;border-radius:3.40282e38px;width:1.5rem;height:.25rem;transition:background-color .1s ease-out,text-color .1s ease-out,width .1s ease-out;position:absolute;bottom:.2rem}.dropdown{position-area:var(--anchor-v,bottom)var(--anchor-h,span-right);display:inline-block;position:relative}.dropdown>:not(:has(~[class*=dropdown-content])):focus{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.dropdown>:not(:has(~[class*=dropdown-content])):focus{outline-offset:2px;outline:2px solid #0000}}.dropdown .dropdown-content{position:absolute}.dropdown:not(details,.dropdown-open,.dropdown-hover:hover,:focus-within) .dropdown-content,.dropdown.dropdown-hover:not(:hover) [tabindex]:first-child:focus:not(:focus-visible)~.dropdown-content{transform-origin:top;opacity:0;display:none;scale:95%}.dropdown[popover],.dropdown .dropdown-content{z-index:999}@media(prefers-reduced-motion:no-preference){.dropdown[popover],.dropdown .dropdown-content{transition-behavior:allow-discrete;transition-property:opacity,scale,display;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);animation:.2s dropdown}}@starting-style{.dropdown[popover],.dropdown .dropdown-content{opacity:0;scale:95%}}:is(.dropdown.dropdown-open,.dropdown:not(.dropdown-hover):focus,.dropdown:focus-within)>[tabindex]:first-child{pointer-events:none}:is(.dropdown.dropdown-open,.dropdown:not(.dropdown-hover):focus,.dropdown:focus-within) .dropdown-content{opacity:1}.dropdown.dropdown-hover:hover .dropdown-content{opacity:1;scale:100%}.dropdown:is(details) summary::-webkit-details-marker{display:none}:is(.dropdown.dropdown-open,.dropdown:focus,.dropdown:focus-within) .dropdown-content{scale:100%}.dropdown:where([popover]){background:0 0}.dropdown[popover]{color:inherit;position:fixed}@supports not (position-area:bottom){.dropdown[popover]{margin:auto}.dropdown[popover].dropdown-open:not(:popover-open){transform-origin:top;opacity:0;display:none;scale:95%}.dropdown[popover]::backdrop{background-color:oklab(0% none none/.3)}}.dropdown[popover]:not(.dropdown-open,:popover-open){transform-origin:top;opacity:0;display:none;scale:95%}:where(.btn){width:unset}.btn{cursor:pointer;text-align:center;vertical-align:middle;outline-offset:2px;webkit-user-select:none;-webkit-user-select:none;user-select:none;padding-inline:var(--btn-p);color:var(--btn-fg);--tw-prose-links:var(--btn-fg);height:var(--size);font-size:var(--fontsize,.875rem);outline-color:var(--btn-color,var(--color-base-content));background-color:var(--btn-bg);background-size:auto,calc(var(--noise)*100%);background-image:none,var(--btn-noise);border-width:var(--border);border-style:solid;border-color:var(--btn-border);text-shadow:0 .5px oklch(100% 0 0/calc(var(--depth)*.15));touch-action:manipulation;box-shadow:0 .5px 0 .5px oklch(100% 0 0/calc(var(--depth)*6%)) inset,var(--btn-shadow);--size:calc(var(--size-field,.25rem)*10);--btn-bg:var(--btn-color,var(--color-base-200));--btn-fg:var(--color-base-content);--btn-p:1rem;--btn-border:var(--btn-bg);border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-wrap:nowrap;flex-shrink:0;justify-content:center;align-items:center;gap:.375rem;font-weight:600;transition-property:color,background-color,border-color,box-shadow;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:inline-flex}@supports (color:color-mix(in lab,red,red)){.btn{--btn-border:color-mix(in oklab,var(--btn-bg),#000 calc(var(--depth)*5%))}}.btn{--btn-shadow:0 3px 2px -2px var(--btn-bg),0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab,red,red)){.btn{--btn-shadow:0 3px 2px -2px color-mix(in oklab,var(--btn-bg)calc(var(--depth)*30%),#0000),0 4px 3px -2px color-mix(in oklab,var(--btn-bg)calc(var(--depth)*30%),#0000)}}.btn{--btn-noise:var(--fx-noise)}@media(hover:hover){.btn:hover{--btn-bg:var(--btn-color,var(--color-base-200))}@supports (color:color-mix(in lab,red,red)){.btn:hover{--btn-bg:color-mix(in oklab,var(--btn-color,var(--color-base-200)),#000 7%)}}}.btn:focus-visible,.btn:has(:focus-visible){isolation:isolate;outline-width:2px;outline-style:solid}.btn:active:not(.btn-active){--btn-bg:var(--btn-color,var(--color-base-200));translate:0 .5px}@supports (color:color-mix(in lab,red,red)){.btn:active:not(.btn-active){--btn-bg:color-mix(in oklab,var(--btn-color,var(--color-base-200)),#000 5%)}}.btn:active:not(.btn-active){--btn-border:var(--btn-color,var(--color-base-200))}@supports (color:color-mix(in lab,red,red)){.btn:active:not(.btn-active){--btn-border:color-mix(in oklab,var(--btn-color,var(--color-base-200)),#000 7%)}}.btn:active:not(.btn-active){--btn-shadow:0 0 0 0 oklch(0% 0 0/0),0 0 0 0 oklch(0% 0 0/0)}.btn:is(input[type=checkbox],input[type=radio]){appearance:none}.btn:is(input[type=checkbox],input[type=radio]):after{--tw-content:attr(aria-label);content:var(--tw-content)}.btn:where(input:checked:not(.filter .btn)){--btn-color:var(--color-primary);--btn-fg:var(--color-primary-content);isolation:isolate}.loading{pointer-events:none;aspect-ratio:1;vertical-align:middle;width:calc(var(--size-selector,.25rem)*6);background-color:currentColor;display:inline-block;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.react-day-picker{-webkit-user-select:none;user-select:none;background-color:var(--color-base-100);border-radius:var(--radius-box);border:var(--border)solid var(--color-base-200);font-size:.75rem;display:inline-block;position:relative;overflow:clip}.react-day-picker[dir=rtl] .rdp-nav .rdp-chevron{transform-origin:50%;transform:rotate(180deg)}.react-day-picker *{box-sizing:border-box}.react-day-picker .rdp-day{text-align:center;width:2.25rem;height:2.25rem}.react-day-picker .rdp-day_button{cursor:pointer;font:inherit;color:inherit;border-radius:var(--radius-field);background:0 0;border:2px solid #0000;justify-content:center;align-items:center;width:2.25rem;height:2.25rem;margin:0;padding:0;display:flex}.react-day-picker .rdp-day_button:disabled{cursor:revert}.react-day-picker .rdp-day_button:hover{background-color:var(--color-base-200)}.react-day-picker .rdp-day_button:disabled:hover,.react-day-picker .rdp-day_button[aria-disabled=true]:hover{cursor:not-allowed;background-color:#0000}.react-day-picker .rdp-caption_label{z-index:1;white-space:nowrap;border:0;align-items:center;display:inline-flex;position:relative}.react-day-picker .rdp-button_next{border-radius:var(--radius-field)}.react-day-picker .rdp-button_next:hover{background-color:var(--color-base-200)}.react-day-picker .rdp-button_previous{border-radius:var(--radius-field)}.react-day-picker .rdp-button_previous:hover{background-color:var(--color-base-200)}.react-day-picker .rdp-button_next,.react-day-picker .rdp-button_previous{cursor:pointer;font:inherit;color:inherit;appearance:none;background:0 0;border:none;justify-content:center;align-items:center;width:2.25rem;height:2.25rem;margin:0;padding:0;display:inline-flex;position:relative}:is(.react-day-picker .rdp-button_next,.react-day-picker .rdp-button_previous):disabled,:is(.react-day-picker .rdp-button_next,.react-day-picker .rdp-button_previous)[aria-disabled=true]{cursor:revert;opacity:.5}:is(.react-day-picker .rdp-button_next,.react-day-picker .rdp-button_previous):disabled:hover,:is(.react-day-picker .rdp-button_next,.react-day-picker .rdp-button_previous)[aria-disabled=true]:hover{background-color:#0000}.react-day-picker .rdp-chevron{fill:var(--color-base-content);width:1rem;height:1rem;display:inline-block}.react-day-picker .rdp-dropdowns{align-items:center;gap:.5rem;display:inline-flex;position:relative}.react-day-picker .rdp-dropdown{z-index:2;opacity:0;appearance:none;cursor:inherit;line-height:inherit;border:none;width:100%;margin:0;padding:0;position:absolute;inset-block:0;inset-inline-start:0}.react-day-picker .rdp-dropdown:focus-visible~.rdp-caption_label{outline:5px auto highlight;outline:5px auto -webkit-focus-ring-color}.react-day-picker .rdp-dropdown_root{align-items:center;display:inline-flex;position:relative}.react-day-picker .rdp-dropdown_root[data-disabled=true] .rdp-chevron{opacity:.5}.react-day-picker .rdp-month_caption{height:2.75rem;font-size:.75rem;font-weight:inherit;place-content:center;display:flex}.react-day-picker .rdp-months{flex-wrap:wrap;gap:2rem;max-width:fit-content;padding:.5rem;display:flex;position:relative}.react-day-picker .rdp-month_grid{border-collapse:collapse}.react-day-picker .rdp-nav{inset-block-start:0;inset-inline-end:0;justify-content:space-between;align-items:center;width:100%;height:2.75rem;padding-inline:.5rem;display:flex;position:absolute;top:.25rem}.react-day-picker .rdp-weekday{opacity:.6;text-align:center;padding:.5rem 0;font-size:smaller;font-weight:500}.react-day-picker .rdp-week_number{opacity:.6;text-align:center;border:none;border-radius:100%;width:2.25rem;height:2.25rem;font-size:small;font-weight:400}.react-day-picker .rdp-today:not(.rdp-outside) .rdp-day_button{background:var(--color-primary);color:var(--color-primary-content)}.react-day-picker .rdp-selected{font-weight:inherit;font-size:.75rem}.react-day-picker .rdp-selected .rdp-day_button{color:var(--color-base-100);background-color:var(--color-base-content);border-radius:var(--radius-field);border:none}.react-day-picker .rdp-selected .rdp-day_button:hover{background-color:var(--color-base-content)}.react-day-picker .rdp-outside{opacity:.75}.react-day-picker .rdp-disabled{opacity:.5}.react-day-picker .rdp-hidden{visibility:hidden;color:var(--color-base-content)}.react-day-picker .rdp-range_start .rdp-day_button{border-radius:var(--radius-field)0 0 var(--radius-field);background-color:var(--color-base-content);color:var(--color-base-100)}.react-day-picker .rdp-range_middle{background-color:var(--color-base-200)}.react-day-picker .rdp-range_middle .rdp-day_button{border:unset;border-radius:unset;color:inherit}.react-day-picker .rdp-range_end{color:var(--color-base-content)}.react-day-picker .rdp-range_end .rdp-day_button{border-radius:0 var(--radius-field)var(--radius-field)0;background-color:var(--color-base-content);color:var(--color-base-100)}.react-day-picker .rdp-range_start.rdp-range_end{background:revert}.react-day-picker .rdp-focusable{cursor:pointer}.react-day-picker .rdp-footer{border-top:var(--border)solid var(--color-base-200);padding:.5rem}.countdown{display:inline-flex}.countdown>*{visibility:hidden;--value-v: mod(max(0,var(--value)),1000) ;--value-hundreds: round(to-zero,var(--value-v)/100,1) ;--value-tens: round(to-zero,mod(var(--value-v),100)/10,1) ;--value-ones: mod(var(--value-v),100) ;--show-hundreds:clamp(clamp(0,var(--digits,1) - 2,1),var(--value-hundreds),1);--show-tens:clamp(clamp(0,var(--digits,1) - 1,1),var(--value-tens) + var(--show-hundreds),1);--first-digits: round(to-zero,var(--value-v)/10,1) ;height:1em;width:calc(1ch + var(--show-tens)*1ch + var(--show-hundreds)*1ch);direction:ltr;transition:width .4s ease-out .2s;display:inline-block;position:relative;overflow-y:clip}.countdown>:before,.countdown>:after{visibility:visible;--tw-content:"00\\a 01\\a 02\\a 03\\a 04\\a 05\\a 06\\a 07\\a 08\\a 09\\a 10\\a 11\\a 12\\a 13\\a 14\\a 15\\a 16\\a 17\\a 18\\a 19\\a 20\\a 21\\a 22\\a 23\\a 24\\a 25\\a 26\\a 27\\a 28\\a 29\\a 30\\a 31\\a 32\\a 33\\a 34\\a 35\\a 36\\a 37\\a 38\\a 39\\a 40\\a 41\\a 42\\a 43\\a 44\\a 45\\a 46\\a 47\\a 48\\a 49\\a 50\\a 51\\a 52\\a 53\\a 54\\a 55\\a 56\\a 57\\a 58\\a 59\\a 60\\a 61\\a 62\\a 63\\a 64\\a 65\\a 66\\a 67\\a 68\\a 69\\a 70\\a 71\\a 72\\a 73\\a 74\\a 75\\a 76\\a 77\\a 78\\a 79\\a 80\\a 81\\a 82\\a 83\\a 84\\a 85\\a 86\\a 87\\a 88\\a 89\\a 90\\a 91\\a 92\\a 93\\a 94\\a 95\\a 96\\a 97\\a 98\\a 99\\a";content:var(--tw-content);font-variant-numeric:tabular-nums;white-space:pre;text-align:end;direction:rtl;transition:all 1s cubic-bezier(1,0,0,1),width .2s ease-out .2s,opacity .2s ease-out .2s;position:absolute;overflow-x:clip}.countdown>:before{width:calc(1ch + var(--show-hundreds)*1ch);top:calc(var(--first-digits)*-1em);opacity:var(--show-tens);inset-inline-end:0}.countdown>:after{width:1ch;top:calc(var(--value-ones)*-1em);inset-inline-start:0}.collapse{border-radius:var(--radius-box,1rem);isolation:isolate;grid-template-rows:max-content 0fr;grid-template-columns:minmax(0,1fr);width:100%;display:grid;position:relative;overflow:hidden}@media(prefers-reduced-motion:no-preference){.collapse{transition:grid-template-rows .2s}}.collapse>input:is([type=checkbox],[type=radio]){appearance:none;opacity:0;z-index:1;grid-row-start:1;grid-column-start:1;width:100%;min-height:1lh;padding:1rem;padding-inline-end:3rem;transition:background-color .2s ease-out}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close)),.collapse:not(.collapse-close):has(>input:is([type=checkbox],[type=radio]):checked){grid-template-rows:max-content 1fr}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>.collapse-content,.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){content-visibility:visible;min-height:fit-content}@supports not (content-visibility:visible){.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>.collapse-content,.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){visibility:visible}}.collapse:focus-visible,.collapse:has(>input:is([type=checkbox],[type=radio]):focus-visible),.collapse:has(summary:focus-visible){outline-color:var(--color-base-content);outline-offset:2px;outline-width:2px;outline-style:solid}.collapse:not(.collapse-close)>input[type=checkbox],.collapse:not(.collapse-close)>input[type=radio]:not(:checked),.collapse:not(.collapse-close)>.collapse-title{cursor:pointer}:is(.collapse[tabindex]:focus:not(.collapse-close,.collapse[open]),.collapse[tabindex]:focus-within:not(.collapse-close,.collapse[open]))>.collapse-title{cursor:unset}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>:where(.collapse-content),.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){padding-bottom:1rem}.collapse:is(details){width:100%}@media(prefers-reduced-motion:no-preference){.collapse:is(details)::details-content{transition:content-visibility .2s allow-discrete,visibility .2s allow-discrete,padding .2s ease-out,background-color .2s ease-out,height .2s;interpolate-size:allow-keywords;height:0}.collapse:is(details):where([open])::details-content{height:auto}}.collapse:is(details) summary{display:block;position:relative}.collapse:is(details) summary::-webkit-details-marker{display:none}.collapse:is(details)>.collapse-content{content-visibility:visible}.collapse:is(details) summary{outline:none}.collapse-content{content-visibility:hidden;min-height:0;cursor:unset;grid-row-start:2;grid-column-start:1;padding-left:1rem;padding-right:1rem}@supports not (content-visibility:hidden){.collapse-content{visibility:hidden}}@media(prefers-reduced-motion:no-preference){.collapse-content{transition:content-visibility .2s allow-discrete,visibility .2s allow-discrete,padding .2s ease-out,background-color .2s ease-out}}.validator-hint{visibility:hidden;margin-top:.5rem;font-size:.75rem}.validator:user-valid{--input-color:var(--color-success)}.validator:user-valid:focus{--input-color:var(--color-success)}.validator:user-valid:checked{--input-color:var(--color-success)}.validator:user-valid[aria-checked=true]{--input-color:var(--color-success)}.validator:user-valid:focus-within{--input-color:var(--color-success)}.validator:has(:user-valid){--input-color:var(--color-success)}.validator:has(:user-valid):focus{--input-color:var(--color-success)}.validator:has(:user-valid):checked{--input-color:var(--color-success)}.validator:has(:user-valid)[aria-checked=true]{--input-color:var(--color-success)}.validator:has(:user-valid):focus-within{--input-color:var(--color-success)}.validator:user-invalid{--input-color:var(--color-error)}.validator:user-invalid:focus{--input-color:var(--color-error)}.validator:user-invalid:checked{--input-color:var(--color-error)}.validator:user-invalid[aria-checked=true]{--input-color:var(--color-error)}.validator:user-invalid:focus-within{--input-color:var(--color-error)}.validator:user-invalid~.validator-hint{visibility:visible;color:var(--color-error)}.validator:has(:user-invalid){--input-color:var(--color-error)}.validator:has(:user-invalid):focus{--input-color:var(--color-error)}.validator:has(:user-invalid):checked{--input-color:var(--color-error)}.validator:has(:user-invalid)[aria-checked=true]{--input-color:var(--color-error)}.validator:has(:user-invalid):focus-within{--input-color:var(--color-error)}.validator:has(:user-invalid)~.validator-hint{visibility:visible;color:var(--color-error)}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))),:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):focus,:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):checked,:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))[aria-checked=true],:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):focus-within{--input-color:var(--color-error)}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))~.validator-hint{visibility:visible;color:var(--color-error)}.radial-progress{height:var(--size);width:var(--size);vertical-align:middle;box-sizing:content-box;--value:0;--size:5rem;--thickness:calc(var(--size)/10);--radialprogress:calc(var(--value)*1%);background-color:#0000;border-radius:3.40282e38px;place-content:center;transition:--radialprogress .3s linear;display:inline-grid;position:relative}.radial-progress:before{content:"";background:radial-gradient(farthest-side,currentColor 98%,#0000)top/var(--thickness)var(--thickness)no-repeat,conic-gradient(currentColor var(--radialprogress),#0000 0);webkit-mask:radial-gradient(farthest-side,#0000 calc(100% - var(--thickness)),#000 calc(100% + .5px - var(--thickness)));-webkit-mask:radial-gradient(farthest-side,#0000 calc(100% - var(--thickness)),#000 calc(100% + .5px - var(--thickness)));mask:radial-gradient(farthest-side,#0000 calc(100% - var(--thickness)),#000 calc(100% + .5px - var(--thickness)));border-radius:3.40282e38px;position:absolute;inset:0}.radial-progress:after{content:"";inset:calc(50% - var(--thickness)/2);transform:rotate(calc(var(--value)*3.6deg - 90deg))translate(calc(var(--size)/2 - 50%));background-color:currentColor;border-radius:3.40282e38px;transition:transform .3s linear;position:absolute}.list{flex-direction:column;font-size:.875rem;display:flex}.list .list-row{--list-grid-cols:minmax(0,auto)1fr;border-radius:var(--radius-box);word-break:break-word;grid-auto-flow:column;grid-template-columns:var(--list-grid-cols);gap:1rem;padding:1rem;display:grid;position:relative}:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{content:"";border-bottom:var(--border)solid;inset-inline:var(--radius-box);border-color:var(--color-base-content);position:absolute;bottom:0}@supports (color:color-mix(in lab,red,red)){:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{border-color:color-mix(in oklab,var(--color-base-content)5%,transparent)}}.toast{translate:var(--toast-x,0)var(--toast-y,0);inset-inline:auto 1rem;background-color:#0000;flex-direction:column;gap:.5rem;width:max-content;max-width:calc(100vw - 2rem);display:flex;position:fixed;top:auto;bottom:1rem}@media(prefers-reduced-motion:no-preference){.toast>*{animation:.25s ease-out toast}}.toggle{border:var(--border)solid currentColor;color:var(--input-color);cursor:pointer;appearance:none;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--toggle-p),var(--radius-selector-max)) + min(var(--border),var(--radius-selector-max)));padding:var(--toggle-p);flex-shrink:0;grid-template-columns:0fr 1fr 1fr;place-content:center;display:inline-grid;position:relative;box-shadow:inset 0 1px}@supports (color:color-mix(in lab,red,red)){.toggle{box-shadow:0 1px color-mix(in oklab,currentColor calc(var(--depth)*10%),#0000) inset}}.toggle{--input-color:var(--color-base-content);transition:color .3s,grid-template-columns .2s}@supports (color:color-mix(in lab,red,red)){.toggle{--input-color:color-mix(in oklab,var(--color-base-content)50%,#0000)}}.toggle{--toggle-p:calc(var(--size)*.125);--size:calc(var(--size-selector,.25rem)*6);width:calc((var(--size)*2) - (var(--border) + var(--toggle-p))*2);height:var(--size)}.toggle>*{z-index:1;cursor:pointer;appearance:none;background-color:#0000;border:none;grid-column:2/span 1;grid-row-start:1;height:100%;padding:.125rem;transition:opacity .2s,rotate .4s}.toggle>:focus{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.toggle>:focus{outline-offset:2px;outline:2px solid #0000}}.toggle>:nth-child(2){color:var(--color-base-100);rotate:none}.toggle>:nth-child(3){color:var(--color-base-100);opacity:0;rotate:-15deg}.toggle:has(:checked)>:nth-child(2){opacity:0;rotate:15deg}.toggle:has(:checked)>:nth-child(3){opacity:1;rotate:none}.toggle:before{aspect-ratio:1;border-radius:var(--radius-selector);--tw-content:"";content:var(--tw-content);height:100%;box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1)) inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1)) inset,0 1px currentColor;background-color:currentColor;grid-row-start:1;grid-column-start:2;transition:background-color .1s,translate .2s,inset-inline-start .2s;position:relative;inset-inline-start:0;translate:0}@supports (color:color-mix(in lab,red,red)){.toggle:before{box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1)) inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1)) inset,0 1px color-mix(in oklab,currentColor calc(var(--depth)*10%),#0000)}}.toggle:before{background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise)}@media(forced-colors:active){.toggle:before{outline-style:var(--tw-outline-style);outline-offset:-1px;outline-width:1px}}@media print{.toggle:before{outline-offset:-1rem;outline:.25rem solid}}.toggle:focus-visible,.toggle:has(:focus-visible){outline-offset:2px;outline:2px solid}.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked){background-color:var(--color-base-100);--input-color:var(--color-base-content);grid-template-columns:1fr 1fr 0fr}:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{background-color:currentColor}@starting-style{:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{opacity:0}}.toggle:indeterminate{grid-template-columns:.5fr 1fr .5fr}.toggle:disabled{cursor:not-allowed;opacity:.3}.toggle:disabled:before{border:var(--border)solid currentColor;background-color:#0000}.input{cursor:text;border:var(--border)solid #0000;appearance:none;background-color:var(--color-base-100);vertical-align:middle;white-space:nowrap;width:clamp(3rem,20rem,100%);height:var(--size);font-size:max(var(--font-size,.875rem),.875rem);touch-action:manipulation;border-color:var(--input-color);box-shadow:0 1px var(--input-color) inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1)) inset;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-shrink:1;align-items:center;gap:.5rem;padding-inline:.75rem;display:inline-flex;position:relative}@supports (color:color-mix(in lab,red,red)){.input{box-shadow:0 1px color-mix(in oklab,var(--input-color)calc(var(--depth)*10%),#0000) inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1)) inset}}.input{--size:calc(var(--size-field,.25rem)*10);--input-color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.input{--input-color:color-mix(in oklab,var(--color-base-content)20%,#0000)}}.input:where(input){display:inline-flex}.input :where(input){appearance:none;background-color:#0000;border:none;width:100%;height:100%;display:inline-flex}.input :where(input):focus,.input :where(input):focus-within{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.input :where(input):focus,.input :where(input):focus-within{outline-offset:2px;outline:2px solid #0000}}.input :where(input[type=url]),.input :where(input[type=email]){direction:ltr}.input :where(input[type=date]){display:inline-flex}.input:focus,.input:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab,red,red)){.input:focus,.input:focus-within{box-shadow:0 1px color-mix(in oklab,var(--input-color)calc(var(--depth)*10%),#0000)}}.input:focus,.input:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate;z-index:1}@media(pointer:coarse){@supports (-webkit-touch-callout:none){.input:focus,.input:focus-within{--font-size:1rem}}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{color:color-mix(in oklab,var(--color-base-content)40%,transparent)}}:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input)::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input)::placeholder{color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{box-shadow:none}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.input::-webkit-date-and-time-value{text-align:inherit}.input[type=number]::-webkit-inner-spin-button{margin-block:-.75rem;margin-inline-end:-.75rem}.input::-webkit-calendar-picker-indicator{position:absolute;inset-inline-end:.75em}.input:has(>input[type=date]) :where(input[type=date]){webkit-appearance:none;appearance:none;display:inline-flex}.input:has(>input[type=date]) input[type=date]::-webkit-calendar-picker-indicator{cursor:pointer;width:1em;height:1em;position:absolute;inset-inline-end:.75em}.indicator{width:max-content;display:inline-flex;position:relative}.indicator :where(.indicator-item){z-index:1;white-space:nowrap;top:var(--indicator-t,0);bottom:var(--indicator-b,auto);left:var(--indicator-s,auto);right:var(--indicator-e,0);translate:var(--indicator-x,50%)var(--indicator-y,-50%);position:absolute}.table{border-radius:var(--radius-box);text-align:left;width:100%;font-size:.875rem;position:relative}.table:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:right}@media(hover:hover){:is(.table tr.row-hover,.table tr.row-hover:nth-child(2n)):hover{background-color:var(--color-base-200)}}.table :where(th,td){vertical-align:middle;padding-block:.75rem;padding-inline:1rem}.table :where(thead,tfoot){white-space:nowrap;color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.table :where(thead,tfoot){color:color-mix(in oklab,var(--color-base-content)60%,transparent)}}.table :where(thead,tfoot){font-size:.875rem;font-weight:600}.table :where(tfoot){border-top:var(--border)solid var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.table :where(tfoot){border-top:var(--border)solid color-mix(in oklch,var(--color-base-content)5%,#0000)}}.table :where(.table-pin-rows thead tr){z-index:1;background-color:var(--color-base-100);position:sticky;top:0}.table :where(.table-pin-rows tfoot tr){z-index:1;background-color:var(--color-base-100);position:sticky;bottom:0}.table :where(.table-pin-cols tr th){background-color:var(--color-base-100);position:sticky;left:0;right:0}.table :where(thead tr,tbody tr:not(:last-child)){border-bottom:var(--border)solid var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.table :where(thead tr,tbody tr:not(:last-child)){border-bottom:var(--border)solid color-mix(in oklch,var(--color-base-content)5%,#0000)}}.steps{counter-reset:step;grid-auto-columns:1fr;grid-auto-flow:column;display:inline-grid;overflow:auto hidden}.steps .step{text-align:center;--step-bg:var(--color-base-300);--step-fg:var(--color-base-content);grid-template-rows:40px 1fr;grid-template-columns:auto;place-items:center;min-width:4rem;display:grid}.steps .step:before{width:100%;height:.5rem;color:var(--step-bg);background-color:var(--step-bg);content:"";border:1px solid;grid-row-start:1;grid-column-start:1;margin-inline-start:-100%;top:0}.steps .step>.step-icon,.steps .step:not(:has(.step-icon)):after{--tw-content:counter(step);content:var(--tw-content);counter-increment:step;z-index:1;color:var(--step-fg);background-color:var(--step-bg);border:1px solid var(--step-bg);border-radius:3.40282e38px;grid-row-start:1;grid-column-start:1;place-self:center;place-items:center;width:2rem;height:2rem;display:grid;position:relative}.steps .step:first-child:before{--tw-content:none;content:var(--tw-content)}.steps .step[data-content]:after{--tw-content:attr(data-content);content:var(--tw-content)}.range{appearance:none;webkit-appearance:none;--range-thumb:var(--color-base-100);--range-thumb-size:calc(var(--size-selector,.25rem)*6);--range-progress:currentColor;--range-fill:1;--range-p:.25rem;--range-bg:currentColor}@supports (color:color-mix(in lab,red,red)){.range{--range-bg:color-mix(in oklab,currentColor 10%,#0000)}}.range{cursor:pointer;vertical-align:middle;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--range-p),var(--radius-selector-max)));width:clamp(3rem,20rem,100%);height:var(--range-thumb-size);background-color:#0000;border:none;overflow:hidden}[dir=rtl] .range{--range-dir:-1}.range:focus{outline:none}.range:focus-visible{outline-offset:2px;outline:2px solid}.range::-webkit-slider-runnable-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size)*.5)}@media(forced-colors:active){.range::-webkit-slider-runnable-track{border:1px solid}.range::-moz-range-track{border:1px solid}}.range::-webkit-slider-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p),var(--radius-selector-max)));background-color:var(--range-thumb);height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p)solid;appearance:none;webkit-appearance:none;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1)) inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1)) inset,0 1px currentColor,0 0 0 2rem var(--range-thumb) inset,calc((var(--range-dir,1)*-100rem) - (var(--range-dir,1)*var(--range-thumb-size)/2)) 0 0 calc(100rem*var(--range-fill));position:relative;top:50%;transform:translateY(-50%)}@supports (color:color-mix(in lab,red,red)){.range::-webkit-slider-thumb{box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1)) inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1)) inset,0 1px color-mix(in oklab,currentColor calc(var(--depth)*10%),#0000),0 0 0 2rem var(--range-thumb) inset,calc((var(--range-dir,1)*-100rem) - (var(--range-dir,1)*var(--range-thumb-size)/2)) 0 0 calc(100rem*var(--range-fill))}}.range::-moz-range-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size)*.5)}.range::-moz-range-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p),var(--radius-selector-max)));height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p)solid;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1)) inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1)) inset,0 1px currentColor,0 0 0 2rem var(--range-thumb) inset,calc((var(--range-dir,1)*-100rem) - (var(--range-dir,1)*var(--range-thumb-size)/2)) 0 0 calc(100rem*var(--range-fill));background-color:currentColor;position:relative;top:50%}@supports (color:color-mix(in lab,red,red)){.range::-moz-range-thumb{box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1)) inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1)) inset,0 1px color-mix(in oklab,currentColor calc(var(--depth)*10%),#0000),0 0 0 2rem var(--range-thumb) inset,calc((var(--range-dir,1)*-100rem) - (var(--range-dir,1)*var(--range-thumb-size)/2)) 0 0 calc(100rem*var(--range-fill))}}.range:disabled{cursor:not-allowed;opacity:.3}.chat-bubble{border-radius:var(--radius-field);background-color:var(--color-base-300);width:fit-content;color:var(--color-base-content);grid-row-end:3;min-width:2.5rem;max-width:90%;min-height:2rem;padding-block:.5rem;padding-inline:1rem;display:block;position:relative}.chat-bubble:before{background-color:inherit;content:"";width:.75rem;height:.75rem;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-image:var(--mask-chat);mask-image:var(--mask-chat);position:absolute;bottom:0;-webkit-mask-position:0 -1px;mask-position:0 -1px;-webkit-mask-size:.8125rem;mask-size:.8125rem}.select{border:var(--border)solid #0000;appearance:none;background-color:var(--color-base-100);vertical-align:middle;width:clamp(3rem,20rem,100%);height:var(--size);touch-action:manipulation;white-space:nowrap;text-overflow:ellipsis;box-shadow:0 1px var(--input-color) inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1)) inset;background-image:linear-gradient(45deg,#0000 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,#0000 50%);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-repeat:no-repeat;background-size:4px 4px,4px 4px;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-shrink:1;align-items:center;gap:.375rem;padding-inline:.75rem 1.75rem;font-size:.875rem;display:inline-flex;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.select{box-shadow:0 1px color-mix(in oklab,var(--input-color)calc(var(--depth)*10%),#0000) inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1)) inset}}.select{border-color:var(--input-color);--input-color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.select{--input-color:color-mix(in oklab,var(--color-base-content)20%,#0000)}}.select{--size:calc(var(--size-field,.25rem)*10)}[dir=rtl] .select{background-position:12px calc(1px + 50%),16px calc(1px + 50%)}[dir=rtl] .select::picker(select){translate:.5rem}[dir=rtl] .select select::picker(select){translate:.5rem}.select[multiple]{background-image:none;height:auto;padding-block:.75rem;padding-inline-end:.75rem;overflow:auto}.select select{appearance:none;width:calc(100% + 2.75rem);height:calc(100% - calc(var(--border)*2));background:inherit;border-radius:inherit;border-style:none;align-items:center;margin-inline:-.75rem -1.75rem;padding-inline:.75rem 1.75rem}.select select:focus,.select select:focus-within{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.select select:focus,.select select:focus-within{outline-offset:2px;outline:2px solid #0000}}.select select:not(:last-child){background-image:none;margin-inline-end:-1.375rem}.select:focus,.select:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab,red,red)){.select:focus,.select:focus-within{box-shadow:0 1px color-mix(in oklab,var(--input-color)calc(var(--depth)*10%),#0000)}}.select:focus,.select:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate;z-index:1}.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{color:color-mix(in oklab,var(--color-base-content)40%,transparent)}}:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select)::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select)::placeholder{color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.select:has(>select[disabled])>select[disabled]{cursor:not-allowed}@supports (appearance:base-select){.select,.select select{appearance:base-select}:is(.select,.select select)::picker(select){appearance:base-select}}:is(.select,.select select)::picker(select){color:inherit;border:var(--border)solid var(--color-base-200);border-radius:var(--radius-box);background-color:inherit;max-height:min(24rem,70dvh);box-shadow:0 2px calc(var(--depth)*3px) -2px #0003;box-shadow:0 20px 25px -5px rgb(0 0 0/calc(var(--depth)*.1)),0 8px 10px -6px rgb(0 0 0/calc(var(--depth)*.1));margin-block:.5rem;margin-inline:.5rem;padding:.5rem;translate:-.5rem}:is(.select,.select select)::picker-icon{display:none}:is(.select,.select select) optgroup{padding-top:.5em}:is(.select,.select select) optgroup option:first-child{margin-top:.5em}:is(.select,.select select) option{border-radius:var(--radius-field);white-space:normal;padding-block:.375rem;padding-inline:.75rem;transition-property:color,background-color;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{background-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{outline-offset:2px;outline:2px solid #0000}}:is(.select,.select select) option:not(:disabled):active{background-color:var(--color-neutral);color:var(--color-neutral-content);box-shadow:0 2px calc(var(--depth)*3px) -2px var(--color-neutral)}.diff-resizer{z-index:1;resize:horizontal;opacity:0;cursor:ew-resize;transform-origin:100% 100%;clip-path:inset(calc(100% - .75rem) 0 0 calc(100% - .75rem));grid-row-start:2;grid-column-start:1;width:50cqi;min-width:1rem;max-width:calc(100cqi - 1rem);height:1rem;transition:min-width .3s ease-out,max-width .3s ease-out;position:relative;overflow:hidden;transform:scaleY(3)translate(.35rem,.35rem)}.timeline{display:flex;position:relative}.timeline>li{grid-template-rows:var(--timeline-row-start,minmax(0,1fr))auto var(--timeline-row-end,minmax(0,1fr));grid-template-columns:var(--timeline-col-start,minmax(0,1fr))auto var(--timeline-col-end,minmax(0,1fr));flex-shrink:0;align-items:center;display:grid;position:relative}.timeline>li>hr{border:none;width:100%}.timeline>li>hr:first-child{grid-row-start:2;grid-column-start:1}.timeline>li>hr:last-child{grid-area:2/3/auto/none}@media print{.timeline>li>hr{border:.1px solid var(--color-base-300)}}.timeline :where(hr){background-color:var(--color-base-300);height:.25rem}.timeline:has(.timeline-middle hr):first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.timeline:has(.timeline-middle hr):last-child,.timeline:not(:has(.timeline-middle)) :first-child hr:last-child{border-start-start-radius:var(--radius-selector);border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:var(--radius-selector)}.timeline:not(:has(.timeline-middle)) :last-child hr:first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.swap{cursor:pointer;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;place-content:center;display:inline-grid;position:relative}.swap input{appearance:none;border:none}.swap>*{grid-row-start:1;grid-column-start:1}@media(prefers-reduced-motion:no-preference){.swap>*{transition-property:transform,rotate,opacity;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}}.swap .swap-on,.swap .swap-indeterminate,.swap input:indeterminate~.swap-on,.swap input:is(:checked,:indeterminate)~.swap-off{opacity:0}.swap input:checked~.swap-on,.swap input:indeterminate~.swap-indeterminate{opacity:1;backface-visibility:visible}.collapse-title{grid-row-start:1;grid-column-start:1;width:100%;min-height:1lh;padding:1rem;padding-inline-end:3rem;transition:background-color .2s ease-out;position:relative}.mockup-browser{border-radius:var(--radius-box);position:relative;overflow:auto hidden}.mockup-browser pre[data-prefix]:before{--tw-content:attr(data-prefix);content:var(--tw-content);text-align:right;display:inline-block}.mockup-browser .mockup-browser-toolbar{align-items:center;width:100%;margin-block:.75rem;padding-right:1.4em;display:inline-flex}.mockup-browser .mockup-browser-toolbar:where(:dir(rtl),[dir=rtl],[dir=rtl] *){flex-direction:row-reverse}.mockup-browser .mockup-browser-toolbar:before{content:"";aspect-ratio:1;opacity:.3;border-radius:3.40282e38px;height:.75rem;margin-right:4.8rem;display:inline-block;box-shadow:1.4em 0,2.8em 0,4.2em 0}.mockup-browser .mockup-browser-toolbar .input{background-color:var(--color-base-200);text-overflow:ellipsis;white-space:nowrap;direction:ltr;align-items:center;gap:.5rem;height:100%;margin-inline:auto;font-size:.75rem;display:flex;overflow:hidden}.mockup-browser .mockup-browser-toolbar .input:before{content:"";opacity:.5;background-color:currentColor;width:1rem;height:1rem;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M9.965 11.026a5 5 0 1 1 1.06-1.06l2.755 2.754a.75.75 0 1 1-1.06 1.06l-2.755-2.754ZM10.5 7a3.5 3.5 0 1 1-7 0 3.5 3.5 0 0 1 7 0Z' clip-rule='evenodd' /%3E%3C/svg%3E") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M9.965 11.026a5 5 0 1 1 1.06-1.06l2.755 2.754a.75.75 0 1 1-1.06 1.06l-2.755-2.754ZM10.5 7a3.5 3.5 0 1 1-7 0 3.5 3.5 0 0 1 7 0Z' clip-rule='evenodd' /%3E%3C/svg%3E") 50%/contain no-repeat}.mockup-code{border-radius:var(--radius-box);background-color:var(--color-neutral);color:var(--color-neutral-content);direction:ltr;padding-block:1.25rem;font-size:.875rem;position:relative;overflow:auto hidden}.mockup-code:before{content:"";opacity:.3;border-radius:3.40282e38px;width:.75rem;height:.75rem;margin-bottom:1rem;display:block;box-shadow:1.4em 0,2.8em 0,4.2em 0}.mockup-code pre{padding-right:1.25rem}.mockup-code pre:before{content:"";margin-right:2ch}.mockup-code pre[data-prefix]:before{--tw-content:attr(data-prefix);content:var(--tw-content);text-align:right;opacity:.5;width:2rem;display:inline-block}.mockup-window{border-radius:var(--radius-box);flex-direction:column;padding-top:1.25rem;display:flex;position:relative;overflow:auto hidden}.mockup-window:before{content:"";aspect-ratio:1;opacity:.3;border-radius:3.40282e38px;flex-shrink:0;align-self:flex-start;height:.75rem;margin-bottom:1rem;display:block;box-shadow:1.4em 0,2.8em 0,4.2em 0}[dir=rtl] .mockup-window:before{align-self:flex-end}.mockup-window pre[data-prefix]:before{--tw-content:attr(data-prefix);content:var(--tw-content);text-align:right;display:inline-block}.avatar{vertical-align:middle;display:inline-flex;position:relative}.avatar>div{aspect-ratio:1;display:block;overflow:hidden}.avatar img{object-fit:cover;width:100%;height:100%}.checkbox{border:var(--border)solid var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.checkbox{border:var(--border)solid var(--input-color,color-mix(in oklab,var(--color-base-content)20%,#0000))}}.checkbox{cursor:pointer;appearance:none;border-radius:var(--radius-selector);vertical-align:middle;color:var(--color-base-content);box-shadow:0 1px oklch(0% 0 0/calc(var(--depth)*.1)) inset,0 0 #0000 inset,0 0 #0000;--size:calc(var(--size-selector,.25rem)*6);width:var(--size);height:var(--size);background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise);flex-shrink:0;padding:.25rem;transition:background-color .2s,box-shadow .2s;display:inline-block;position:relative}.checkbox:before{--tw-content:"";content:var(--tw-content);opacity:0;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,70% 80%,70% 100%);width:100%;height:100%;box-shadow:0 3px oklch(100% 0 0/calc(var(--depth)*.1)) inset;background-color:currentColor;font-size:1rem;line-height:.75;transition:clip-path .3s .1s,opacity .1s .1s,rotate .3s .1s,translate .3s .1s;display:block;rotate:45deg}.checkbox:focus-visible{outline:2px solid var(--input-color,currentColor);outline-offset:2px}.checkbox:checked,.checkbox[aria-checked=true]{background-color:var(--input-color,#0000);box-shadow:0 0 #0000 inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1)) inset,0 1px oklch(0% 0 0/calc(var(--depth)*.1))}:is(.checkbox:checked,.checkbox[aria-checked=true]):before{clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 0%,70% 0%,70% 100%);opacity:1}@media(forced-colors:active){:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:"✔︎";clip-path:none;background-color:#0000;rotate:none}}@media print{:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:"✔︎";clip-path:none;background-color:#0000;rotate:none}}.checkbox:indeterminate{background-color:var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.checkbox:indeterminate{background-color:var(--input-color,color-mix(in oklab,var(--color-base-content)20%,#0000))}}.checkbox:indeterminate:before{opacity:1;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,80% 80%,80% 100%);translate:0 -35%;rotate:none}.checkbox\\!{border:var(--border)solid var(--input-color,var(--color-base-content))!important}@supports (color:color-mix(in lab,red,red)){.checkbox\\!{border:var(--border)solid var(--input-color,color-mix(in oklab,var(--color-base-content)20%,#0000))!important}}.checkbox\\!{cursor:pointer!important;appearance:none!important;border-radius:var(--radius-selector)!important;vertical-align:middle!important;color:var(--color-base-content)!important;box-shadow:0 1px oklch(0% 0 0/calc(var(--depth)*.1)) inset,0 0 #0000 inset,0 0 #0000!important;--size:calc(var(--size-selector,.25rem)*6)!important;width:var(--size)!important;height:var(--size)!important;background-size:auto,calc(var(--noise)*100%)!important;background-image:none,var(--fx-noise)!important;flex-shrink:0!important;padding:.25rem!important;transition:background-color .2s,box-shadow .2s!important;display:inline-block!important;position:relative!important}.checkbox\\!:before{--tw-content:""!important;content:var(--tw-content)!important;opacity:0!important;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,70% 80%,70% 100%)!important;width:100%!important;height:100%!important;box-shadow:0 3px oklch(100% 0 0/calc(var(--depth)*.1)) inset!important;background-color:currentColor!important;font-size:1rem!important;line-height:.75!important;transition:clip-path .3s .1s,opacity .1s .1s,rotate .3s .1s,translate .3s .1s!important;display:block!important;rotate:45deg!important}.checkbox\\!:focus-visible{outline:2px solid var(--input-color,currentColor)!important;outline-offset:2px!important}.checkbox\\!:checked,.checkbox\\![aria-checked=true]{background-color:var(--input-color,#0000)!important;box-shadow:0 0 #0000 inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1)) inset,0 1px oklch(0% 0 0/calc(var(--depth)*.1))!important}:is(.checkbox\\!:checked,.checkbox\\![aria-checked=true]):before{clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 0%,70% 0%,70% 100%)!important;opacity:1!important}@media(forced-colors:active){:is(.checkbox\\!:checked,.checkbox\\![aria-checked=true]):before{--tw-content:"✔︎"!important;clip-path:none!important;background-color:#0000!important;rotate:none!important}}@media print{:is(.checkbox\\!:checked,.checkbox\\![aria-checked=true]):before{--tw-content:"✔︎"!important;clip-path:none!important;background-color:#0000!important;rotate:none!important}}.checkbox\\!:indeterminate{background-color:var(--input-color,var(--color-base-content))!important}@supports (color:color-mix(in lab,red,red)){.checkbox\\!:indeterminate{background-color:var(--input-color,color-mix(in oklab,var(--color-base-content)20%,#0000))!important}}.checkbox\\!:indeterminate:before{opacity:1!important;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,80% 80%,80% 100%)!important;translate:0 -35%!important;rotate:none!important}.radio{cursor:pointer;appearance:none;vertical-align:middle;border:var(--border)solid var(--input-color,currentColor);border-radius:3.40282e38px;flex-shrink:0;padding:.25rem;display:inline-block;position:relative}@supports (color:color-mix(in lab,red,red)){.radio{border:var(--border)solid var(--input-color,color-mix(in srgb,currentColor 20%,#0000))}}.radio{box-shadow:0 1px oklch(0% 0 0/calc(var(--depth)*.1)) inset;--size:calc(var(--size-selector,.25rem)*6);width:var(--size);height:var(--size);color:var(--input-color,currentColor)}.radio:before{--tw-content:"";content:var(--tw-content);background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise);border-radius:3.40282e38px;width:100%;height:100%;display:block}.radio:focus-visible{outline:2px solid}.radio:checked,.radio[aria-checked=true]{background-color:var(--color-base-100);border-color:currentColor}@media(prefers-reduced-motion:no-preference){.radio:checked,.radio[aria-checked=true]{animation:.2s ease-out radio}}:is(.radio:checked,.radio[aria-checked=true]):before{box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1)) inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1)) inset,0 1px oklch(0% 0 0/calc(var(--depth)*.1));background-color:currentColor}@media(forced-colors:active){:is(.radio:checked,.radio[aria-checked=true]):before{outline-style:var(--tw-outline-style);outline-offset:-1px;outline-width:1px}}@media print{:is(.radio:checked,.radio[aria-checked=true]):before{outline-offset:-1rem;outline:.25rem solid}}.rating{vertical-align:middle;display:inline-flex;position:relative}.rating input{appearance:none;border:none}.rating :where(*){background-color:var(--color-base-content);opacity:.2;border-radius:0;width:1.5rem;height:1.5rem}@media(prefers-reduced-motion:no-preference){.rating :where(*){animation:.25s ease-out rating}}.rating :where(*):is(input){cursor:pointer}.rating .rating-hidden{background-color:#0000;width:.5rem}.rating input[type=radio]:checked{background-image:none}.rating :checked,.rating [aria-checked=true],.rating [aria-current=true],.rating :has(~:checked,~[aria-checked=true],~[aria-current=true]){opacity:1}.rating :focus-visible{scale:1.1}@media(prefers-reduced-motion:no-preference){.rating :focus-visible{transition:scale .2s ease-out}}.rating :active:focus{animation:none;scale:1.1}.navbar{align-items:center;width:100%;min-height:4rem;padding:.5rem;display:flex}.drawer{grid-auto-columns:max-content auto;width:100%;display:grid;position:relative}.card{border-radius:var(--radius-box);outline-offset:2px;outline:0 solid #0000;flex-direction:column;transition:outline .2s ease-in-out;display:flex;position:relative}.card:focus{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.card:focus{outline-offset:2px;outline:2px solid #0000}}.card:focus-visible{outline-color:currentColor}.card :where(figure:first-child){border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-end-radius:unset;border-end-start-radius:unset;overflow:hidden}.card :where(figure:last-child){border-start-start-radius:unset;border-start-end-radius:unset;border-end-end-radius:inherit;border-end-start-radius:inherit;overflow:hidden}.card figure{justify-content:center;align-items:center;display:flex}.card:has(>input:is(input[type=checkbox],input[type=radio])){cursor:pointer;-webkit-user-select:none;user-select:none}.card:has(>:checked){outline:2px solid}.stats{border-radius:var(--radius-box);grid-auto-flow:column;display:inline-grid;position:relative;overflow-x:auto}.progress{appearance:none;border-radius:var(--radius-box);background-color:currentColor;width:100%;height:.5rem;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.progress{background-color:color-mix(in oklab,currentcolor 20%,transparent)}}.progress{color:var(--color-base-content)}.progress:indeterminate{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%}@media(prefers-reduced-motion:no-preference){.progress:indeterminate{animation:5s ease-in-out infinite progress}}@supports ((-moz-appearance:none)){.progress:indeterminate::-moz-progress-bar{background-color:#0000}@media(prefers-reduced-motion:no-preference){.progress:indeterminate::-moz-progress-bar{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%;animation:5s ease-in-out infinite progress}}.progress::-moz-progress-bar{border-radius:var(--radius-box);background-color:currentColor}}@supports ((-webkit-appearance:none)){.progress::-webkit-progress-bar{border-radius:var(--radius-box);background-color:#0000}.progress::-webkit-progress-value{border-radius:var(--radius-box);background-color:currentColor}}.modal-toggle{appearance:none;opacity:0;width:0;height:0;position:fixed}.file-input{cursor:pointer;border:var(--border)solid #0000;appearance:none;background-color:var(--color-base-100);vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;width:clamp(3rem,20rem,100%);height:var(--size);border-color:var(--input-color);box-shadow:0 1px var(--input-color) inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1)) inset;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));align-items:center;padding-inline-end:.75rem;font-size:.875rem;line-height:2;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.file-input{box-shadow:0 1px color-mix(in oklab,var(--input-color)calc(var(--depth)*10%),#0000) inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1)) inset}}.file-input{--size:calc(var(--size-field,.25rem)*10);--input-color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.file-input{--input-color:color-mix(in oklab,var(--color-base-content)20%,#0000)}}.file-input::file-selector-button{cursor:pointer;webkit-user-select:none;-webkit-user-select:none;user-select:none;height:calc(100% + var(--border)*2);margin-inline-end:1rem;margin-block:calc(var(--border)*-1);color:var(--btn-fg);border-width:var(--border);border-style:solid;border-color:var(--btn-border);background-color:var(--btn-bg);background-size:calc(var(--noise)*100%);background-image:var(--btn-noise);text-shadow:0 .5px oklch(1 0 0/calc(var(--depth)*.15));box-shadow:0 .5px 0 .5px #fff inset,var(--btn-shadow);border-start-start-radius:calc(var(--join-ss,var(--radius-field) - var(--border)));border-end-start-radius:calc(var(--join-es,var(--radius-field) - var(--border)));margin-inline-start:calc(var(--border)*-1);padding-inline:1rem;font-size:.875rem;font-weight:600}@supports (color:color-mix(in lab,red,red)){.file-input::file-selector-button{box-shadow:0 .5px 0 .5px color-mix(in oklab,color-mix(in oklab,white 30%,var(--btn-bg))calc(var(--depth)*20%),#0000) inset,var(--btn-shadow)}}.file-input::file-selector-button{--size:calc(var(--size-field,.25rem)*10);--btn-bg:var(--btn-color,var(--color-base-200));--btn-fg:var(--color-base-content);--btn-border:var(--btn-bg)}@supports (color:color-mix(in lab,red,red)){.file-input::file-selector-button{--btn-border:color-mix(in oklab,var(--btn-bg),#000 5%)}}.file-input::file-selector-button{--btn-shadow:0 3px 2px -2px var(--btn-bg),0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab,red,red)){.file-input::file-selector-button{--btn-shadow:0 3px 2px -2px color-mix(in oklab,var(--btn-bg)30%,#0000),0 4px 3px -2px color-mix(in oklab,var(--btn-bg)30%,#0000)}}.file-input::file-selector-button{--btn-noise:var(--fx-noise)}.file-input:focus{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab,red,red)){.file-input:focus{box-shadow:0 1px color-mix(in oklab,var(--input-color)10%,#0000)}}.file-input:focus{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}.file-input:has(>input[disabled]),.file-input:is(:disabled,[disabled]){cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200)}:is(.file-input:has(>input[disabled]),.file-input:is(:disabled,[disabled]))::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){:is(.file-input:has(>input[disabled]),.file-input:is(:disabled,[disabled]))::placeholder{color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.file-input:has(>input[disabled]),.file-input:is(:disabled,[disabled]){box-shadow:none;color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.file-input:has(>input[disabled]),.file-input:is(:disabled,[disabled]){color:color-mix(in oklch,var(--color-base-content)20%,#0000)}}:is(.file-input:has(>input[disabled]),.file-input:is(:disabled,[disabled]))::file-selector-button{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);--btn-border:#0000;--btn-noise:none;--btn-fg:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){:is(.file-input:has(>input[disabled]),.file-input:is(:disabled,[disabled]))::file-selector-button{--btn-fg:color-mix(in oklch,var(--color-base-content)20%,#0000)}}.hero-content{isolation:isolate;justify-content:center;align-items:center;gap:1rem;max-width:80rem;padding:1rem;display:flex}.textarea{border:var(--border)solid #0000;appearance:none;border-radius:var(--radius-field);background-color:var(--color-base-100);vertical-align:middle;width:clamp(3rem,20rem,100%);min-height:5rem;font-size:max(var(--font-size,.875rem),.875rem);touch-action:manipulation;border-color:var(--input-color);box-shadow:0 1px var(--input-color) inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1)) inset;flex-shrink:1;padding-block:.5rem;padding-inline:.75rem}@supports (color:color-mix(in lab,red,red)){.textarea{box-shadow:0 1px color-mix(in oklab,var(--input-color)calc(var(--depth)*10%),#0000) inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1)) inset}}.textarea{--input-color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.textarea{--input-color:color-mix(in oklab,var(--color-base-content)20%,#0000)}}.textarea textarea{appearance:none;background-color:#0000;border:none}.textarea textarea:focus,.textarea textarea:focus-within{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.textarea textarea:focus,.textarea textarea:focus-within{outline-offset:2px;outline:2px solid #0000}}.textarea:focus,.textarea:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab,red,red)){.textarea:focus,.textarea:focus-within{box-shadow:0 1px color-mix(in oklab,var(--input-color)calc(var(--depth)*10%),#0000)}}.textarea:focus,.textarea:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}@media(pointer:coarse){@supports (-webkit-touch-callout:none){.textarea:focus,.textarea:focus-within{--font-size:1rem}}}.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){color:color-mix(in oklab,var(--color-base-content)40%,transparent)}}:is(.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]))::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){:is(.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]))::placeholder{color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){box-shadow:none}.textarea:has(>textarea[disabled])>textarea[disabled]{cursor:not-allowed}.mockup-phone-camera{z-index:1;background:#000;border-radius:17px;grid-area:1/1/1/1;width:28%;height:3.7%;margin-top:3%}.stack{grid-template-rows:3px 4px 1fr 4px 3px;grid-template-columns:3px 4px 1fr 4px 3px;display:inline-grid}.stack>*{width:100%;height:100%}.stack>:nth-child(n+2){opacity:.7;width:100%}.stack>:nth-child(2){z-index:2;opacity:.9}.stack>:first-child{z-index:3;width:100%}.modal-backdrop{color:#0000;z-index:-1;grid-row-start:1;grid-column-start:1;place-self:stretch stretch;display:grid}.modal-backdrop button{cursor:pointer}.tab-content{order:var(--tabcontent-order);--tabcontent-radius-ss:var(--radius-box);--tabcontent-radius-se:var(--radius-box);--tabcontent-radius-es:var(--radius-box);--tabcontent-radius-ee:var(--radius-box);--tabcontent-order:1;width:100%;height:calc(100% - var(--tab-height) + var(--border));margin:var(--tabcontent-margin);border-color:#0000;border-width:var(--border);border-start-start-radius:var(--tabcontent-radius-ss);border-start-end-radius:var(--tabcontent-radius-se);border-end-end-radius:var(--tabcontent-radius-ee);border-end-start-radius:var(--tabcontent-radius-es);display:none}.hover-gallery{--items:1;grid-template-columns:repeat(var(--items),1fr);gap:1px;width:100%;overflow:hidden}.hover-gallery,.hover-gallery:is(figure){display:inline-grid}.hover-gallery:has(>:nth-child(3)){--items:2}.hover-gallery:has(>:nth-child(4)){--items:3}.hover-gallery:has(>:nth-child(5)){--items:4}.hover-gallery:has(>:nth-child(6)){--items:5}.hover-gallery:has(>:nth-child(7)){--items:6}.hover-gallery:has(>:nth-child(8)){--items:7}.hover-gallery:has(>:nth-child(9)){--items:8}.hover-gallery:has(>:nth-child(10)){--items:9}.hover-gallery>*{opacity:0;object-fit:cover;grid-row:1;width:100%;height:100%}.hover-gallery>:first-child{opacity:1;grid-column:1/-1}.hover-gallery>:nth-child(2){grid-column:1}.hover-gallery>:nth-child(3){grid-column:2}.hover-gallery>:nth-child(4){grid-column:3}.hover-gallery>:nth-child(5){grid-column:4}.hover-gallery>:nth-child(6){grid-column:5}.hover-gallery>:nth-child(7){grid-column:6}.hover-gallery>:nth-child(8){grid-column:7}.hover-gallery>:nth-child(9){grid-column:8}.hover-gallery>:nth-child(10){grid-column:9}.hover-gallery>:nth-child(n+11){display:none}.hover-gallery>:hover{opacity:1;grid-column:1/-1}.hover-gallery:has(:hover)>:first-child{display:none}.mockup-phone-display{border-radius:54px;grid-area:1/1/1/1;width:100%;height:100%;overflow:hidden}@supports (corner-shape:superellipse(1.87)){.mockup-phone-display{corner-shape:superellipse(1.87);border-radius:101px}}.mockup-phone-display>img{object-fit:cover;width:100%;height:100%}.timeline-end{grid-area:3/1/4/4;place-self:flex-start center;margin:.25rem}.timeline-start{grid-area:1/1/2/4;place-self:flex-end center;margin:.25rem}.stat-figure{grid-row:1/span 3;grid-column-start:2;place-self:center flex-end}.hero{background-position:50%;background-size:cover;place-items:center;width:100%;display:grid}.hero>*{grid-row-start:1;grid-column-start:1}.hero-overlay{background-color:var(--color-neutral);grid-row-start:1;grid-column-start:1;width:100%;height:100%}@supports (color:color-mix(in lab,red,red)){.hero-overlay{background-color:color-mix(in oklab,var(--color-neutral)50%,transparent)}}.modal-box{background-color:var(--color-base-100);border-top-left-radius:var(--modal-tl,var(--radius-box));border-top-right-radius:var(--modal-tr,var(--radius-box));border-bottom-left-radius:var(--modal-bl,var(--radius-box));border-bottom-right-radius:var(--modal-br,var(--radius-box));opacity:0;overscroll-behavior:contain;grid-row-start:1;grid-column-start:1;width:91.6667%;max-width:32rem;max-height:100vh;padding:1.5rem;transition:translate .3s ease-out,scale .3s ease-out,opacity .2s ease-out 50ms,box-shadow .3s ease-out;overflow-y:auto;scale:95%;box-shadow:0 25px 50px -12px #00000040}.drawer-content{grid-row-start:1;grid-column-start:2;min-width:0}.timeline-middle{grid-row-start:2;grid-column-start:2}.stat-value{white-space:nowrap;grid-column-start:1;font-size:2rem;font-weight:800}.stat-desc{white-space:nowrap;color:var(--color-base-content);grid-column-start:1}@supports (color:color-mix(in lab,red,red)){.stat-desc{color:color-mix(in oklab,var(--color-base-content)60%,transparent)}}.stat-desc{font-size:.75rem}.stat-title{white-space:nowrap;color:var(--color-base-content);grid-column-start:1}@supports (color:color-mix(in lab,red,red)){.stat-title{color:color-mix(in oklab,var(--color-base-content)60%,transparent)}}.stat-title{font-size:.75rem}.stat-actions{white-space:nowrap;grid-column-start:1}.chat-image{grid-row:span 2/span 2;align-self:flex-end}.chat-footer{grid-row-start:3;gap:.25rem;font-size:.6875rem;display:flex}.chat-header{grid-row-start:1;gap:.25rem;font-size:.6875rem;display:flex}.divider{white-space:nowrap;height:1rem;margin:var(--divider-m,1rem 0);--divider-color:var(--color-base-content);flex-direction:row;align-self:stretch;align-items:center;display:flex}@supports (color:color-mix(in lab,red,red)){.divider{--divider-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.divider:before,.divider:after{content:"";background-color:var(--divider-color);flex-grow:1;width:100%;height:.125rem}@media print{.divider:before,.divider:after{border:.5px solid}}.divider:not(:empty){gap:1rem}.filter{flex-wrap:wrap;display:flex}.filter input[type=radio]{width:auto}.filter input{opacity:1;transition:margin .1s,opacity .3s,padding .3s,border-width .1s;overflow:hidden;scale:1}.filter input:not(:last-child){margin-inline-end:.25rem}.filter input.filter-reset{aspect-ratio:1}.filter input.filter-reset:after{--tw-content:"×";content:var(--tw-content)}.filter:not(:has(input:checked:not(.filter-reset))) .filter-reset,.filter:not(:has(input:checked:not(.filter-reset))) input[type=reset],.filter:has(input:checked:not(.filter-reset)) input:not(:checked,.filter-reset,input[type=reset]){opacity:0;border-width:0;width:0;margin-inline:0;padding-inline:0;scale:0}.label{white-space:nowrap;color:currentColor;align-items:center;gap:.375rem;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.label{color:color-mix(in oklab,currentcolor 60%,transparent)}}.label:has(input){cursor:pointer}.label:is(.input>*,.select>*){white-space:nowrap;height:calc(100% - .5rem);font-size:inherit;align-items:center;padding-inline:.75rem;display:flex}.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border)solid currentColor;margin-inline:-.75rem .75rem}@supports (color:color-mix(in lab,red,red)){.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border)solid color-mix(in oklab,currentColor 10%,#0000)}}.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border)solid currentColor;margin-inline:.75rem -.75rem}@supports (color:color-mix(in lab,red,red)){.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border)solid color-mix(in oklab,currentColor 10%,#0000)}}.modal-action{justify-content:flex-end;gap:.5rem;margin-top:1.5rem;display:flex}.breadcrumbs{max-width:100%;padding-block:.5rem;overflow-x:auto}.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol{white-space:nowrap;align-items:center;min-height:min-content;display:flex}:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li{align-items:center;display:flex}:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li>*{cursor:pointer;align-items:center;gap:.5rem;display:flex}@media(hover:hover){:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li>:hover{text-decoration-line:underline}}:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li>:focus{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li>:focus{outline-offset:2px;outline:2px solid #0000}}:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li>:focus-visible{outline-offset:2px;outline:2px solid}:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li+:before{content:"";opacity:.4;background-color:#0000;border-top:1px solid;border-right:1px solid;width:.375rem;height:.375rem;margin-left:.5rem;margin-right:.75rem;display:block;rotate:45deg}[dir=rtl] :is(:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li)+:before{rotate:-135deg}.fieldset-legend{color:var(--color-base-content);justify-content:space-between;align-items:center;gap:.5rem;margin-bottom:-.25rem;padding-block:.5rem;font-weight:600;display:flex}.footer-title{text-transform:uppercase;opacity:.6;margin-bottom:.5rem;font-weight:600}.carousel-item{box-sizing:content-box;scroll-snap-align:start;flex:none;display:flex}.status{aspect-ratio:1;border-radius:var(--radius-selector);background-color:var(--color-base-content);width:.5rem;height:.5rem;display:inline-block}@supports (color:color-mix(in lab,red,red)){.status{background-color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.status{vertical-align:middle;color:#0000004d;background-position:50%;background-repeat:no-repeat}@supports (color:color-mix(in lab,red,red)){.status{color:color-mix(in oklab,var(--color-black)30%,transparent)}}.status{background-image:radial-gradient(circle at 35% 30%,oklch(1 0 0/calc(var(--depth)*.5)),#0000);box-shadow:0 2px 3px -1px}@supports (color:color-mix(in lab,red,red)){.status{box-shadow:0 2px 3px -1px color-mix(in oklab,currentColor calc(var(--depth)*100%),#0000)}}.mockup-phone{aspect-ratio:462/978;background-color:#000;border:5px solid #6b6b6b;border-radius:65px;justify-items:center;width:100%;max-width:462px;padding:6px;display:inline-grid;overflow:hidden}@supports (corner-shape:superellipse(1.45)){.mockup-phone{corner-shape:superellipse(1.45);border-radius:90px}}.badge{border-radius:var(--radius-selector);vertical-align:middle;color:var(--badge-fg);border:var(--border)solid var(--badge-color,var(--color-base-200));width:fit-content;padding-inline:calc(.25rem*3 - var(--border));background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise);background-color:var(--badge-bg);--badge-bg:var(--badge-color,var(--color-base-100));--badge-fg:var(--color-base-content);--size:calc(var(--size-selector,.25rem)*6);height:var(--size);justify-content:center;align-items:center;gap:.5rem;font-size:.875rem;display:inline-flex}.kbd{border-radius:var(--radius-field);background-color:var(--color-base-200);vertical-align:middle;border:var(--border)solid var(--color-base-content);justify-content:center;align-items:center;padding-left:.5em;padding-right:.5em;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.kbd{border:var(--border)solid color-mix(in srgb,var(--color-base-content)20%,#0000)}}.kbd{border-bottom:calc(var(--border) + 1px)solid var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.kbd{border-bottom:calc(var(--border) + 1px)solid color-mix(in srgb,var(--color-base-content)20%,#0000)}}.kbd{--size:calc(var(--size-selector,.25rem)*6);height:var(--size);min-width:var(--size);font-size:.875rem}.tabs{--tabs-height:auto;--tabs-direction:row;--tab-height:calc(var(--size-field,.25rem)*10);height:var(--tabs-height);flex-wrap:wrap;flex-direction:var(--tabs-direction);display:flex}.footer{grid-auto-flow:row;place-items:start;gap:2.5rem 1rem;width:100%;font-size:.875rem;line-height:1.25rem;display:grid}.footer>*{place-items:start;gap:.5rem;display:grid}.footer.footer-center{text-align:center;grid-auto-flow:column dense;place-items:center}.footer.footer-center>*{place-items:center}.stat{grid-template-columns:repeat(1,1fr);column-gap:1rem;width:100%;padding-block:1rem;padding-inline:1.5rem;display:inline-grid}.stat:not(:last-child){border-inline-end:var(--border)dashed currentColor}@supports (color:color-mix(in lab,red,red)){.stat:not(:last-child){border-inline-end:var(--border)dashed color-mix(in oklab,currentColor 10%,#0000)}}.stat:not(:last-child){border-block-end:none}.navbar-end{justify-content:flex-end;align-items:center;width:50%;display:inline-flex}.navbar-start{justify-content:flex-start;align-items:center;width:50%;display:inline-flex}.card-body{padding:var(--card-p,1.5rem);font-size:var(--card-fs,.875rem);flex-direction:column;flex:auto;gap:.5rem;display:flex}.card-body :where(p){flex-grow:1}.navbar-center{flex-shrink:0;align-items:center;display:inline-flex}.fab-flower{--position:0rem;display:grid}.fab-flower>:nth-child(-n+2){--position:0rem}.fab-flower>*{--degree:180deg;--flip-degree:calc(180deg - var(--degree));transform:translate(calc(cos(var(--degree))*var(--position)))translateY(calc(sin(var(--degree))*calc(-1*var(--position))));grid-area:1/1}[dir=rtl] :is(.fab-flower>*){transform:translate(calc(cos(var(--flip-degree))*var(--position)))translateY(calc(sin(var(--flip-degree))*calc(-1*var(--position))))}.fab-flower>:nth-child(n+7){display:none}.fab-flower:has(:nth-child(3)){--position:140%}.fab-flower:has(:nth-child(3))>:nth-child(3){--degree:135deg}.fab-flower:has(:nth-child(4)){--position:140%}.fab-flower:has(:nth-child(4))>:nth-child(3){--degree:165deg}.fab-flower:has(:nth-child(4))>:nth-child(4){--degree:105deg}.fab-flower:has(:nth-child(5)){--position:180%}.fab-flower:has(:nth-child(5))>:nth-child(3){--degree:180deg}.fab-flower:has(:nth-child(5))>:nth-child(4){--degree:135deg}.fab-flower:has(:nth-child(5))>:nth-child(5){--degree:90deg}.fab-flower:has(:nth-child(6)){--position:220%}.fab-flower:has(:nth-child(6))>:nth-child(3){--degree:180deg}.fab-flower:has(:nth-child(6))>:nth-child(4){--degree:150deg}.fab-flower:has(:nth-child(6))>:nth-child(5){--degree:120deg}.fab-flower:has(:nth-child(6))>:nth-child(6){--degree:90deg}.carousel{scroll-snap-type:x mandatory;scrollbar-width:none;display:inline-flex;overflow-x:scroll}@media(prefers-reduced-motion:no-preference){.carousel{scroll-behavior:smooth}}.carousel::-webkit-scrollbar{display:none}.alert{--alert-border-color:var(--color-base-200);border-radius:var(--radius-box);color:var(--color-base-content);background-color:var(--alert-color,var(--color-base-200));text-align:start;background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise);box-shadow:0 3px 0 -2px oklch(100% 0 0/calc(var(--depth)*.08)) inset,0 1px #000,0 4px 3px -2px oklch(0% 0 0/calc(var(--depth)*.08));border-style:solid;grid-template-columns:auto;grid-auto-flow:column;justify-content:start;place-items:center start;gap:1rem;padding-block:.75rem;padding-inline:1rem;font-size:.875rem;line-height:1.25rem;display:grid}@supports (color:color-mix(in lab,red,red)){.alert{box-shadow:0 3px 0 -2px oklch(100% 0 0/calc(var(--depth)*.08)) inset,0 1px color-mix(in oklab,color-mix(in oklab,#000 20%,var(--alert-color,var(--color-base-200)))calc(var(--depth)*20%),#0000),0 4px 3px -2px oklch(0% 0 0/calc(var(--depth)*.08))}}.alert:has(:nth-child(2)){grid-template-columns:auto minmax(auto,1fr)}.fieldset{grid-template-columns:1fr;grid-auto-rows:max-content;gap:.375rem;padding-block:.25rem;font-size:.75rem;display:grid}.card-actions{flex-wrap:wrap;align-items:flex-start;gap:.5rem;display:flex}.card-title{font-size:var(--cardtitle-fs,1.125rem);align-items:center;gap:.5rem;font-weight:600;display:flex}.chat{--mask-chat:url("data:image/svg+xml,%3csvg width='13' height='13' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='M0 11.5004C0 13.0004 2 13.0004 2 13.0004H12H13V0.00036329L12.5 0C12.5 0 11.977 2.09572 11.8581 2.50033C11.6075 3.35237 10.9149 4.22374 9 5.50036C6 7.50036 0 10.0004 0 11.5004Z'/%3e%3c/svg%3e");column-gap:.75rem;padding-block:.25rem;display:grid}.avatar-group{display:flex;overflow:hidden}.avatar-group .avatar{border:4px solid var(--color-base-100);border-radius:3.40282e38px;overflow:hidden}.mask{vertical-align:middle;display:inline-block;-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.cally{font-size:.7rem}.cally::part(container){-webkit-user-select:none;user-select:none;padding:.5rem 1rem}.cally ::part(th){block-size:auto;font-weight:400}.cally::part(header){direction:ltr}.cally ::part(head){opacity:.5;font-size:.7rem}.cally::part(button){border-radius:var(--radius-field);background:0 0;border:none;padding:.5rem}.cally::part(button):hover{background:var(--color-base-200)}.cally ::part(day){border-radius:var(--radius-field);font-size:.7rem}.cally ::part(button day today){background:var(--color-primary);color:var(--color-primary-content)}.cally ::part(selected){color:var(--color-base-100);background:var(--color-base-content);border-radius:var(--radius-field)}.cally ::part(range-inner){border-radius:0}.cally ::part(range-start){border-start-end-radius:0;border-end-end-radius:0}.cally ::part(range-end){border-start-start-radius:0;border-end-start-radius:0}.cally ::part(range-start range-end){border-radius:var(--radius-field)}.cally calendar-month{width:100%}.skeleton{border-radius:var(--radius-box);background-color:var(--color-base-300)}@media(prefers-reduced-motion:reduce){.skeleton{transition-duration:15s}}.skeleton{will-change:background-position;background-image:linear-gradient(105deg,#0000 0% 40%,var(--color-base-100)50%,#0000 60% 100%);background-position-x:-50%;background-repeat:no-repeat;background-size:200%}@media(prefers-reduced-motion:no-preference){.skeleton{animation:1.8s ease-in-out infinite skeleton}}.link{cursor:pointer;text-decoration-line:underline}.link:focus{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.link:focus{outline-offset:2px;outline:2px solid #0000}}.link:focus-visible{outline-offset:2px;outline:2px solid}.timeline-box{border:var(--border)solid;border-radius:var(--radius-box);border-color:var(--color-base-300);background-color:var(--color-base-100);padding-block:.5rem;padding-inline:1rem;font-size:.75rem;box-shadow:0 1px 2px #0000000d}.menu-title{color:var(--color-base-content);padding-block:.5rem;padding-inline:.75rem}@supports (color:color-mix(in lab,red,red)){.menu-title{color:color-mix(in oklab,var(--color-base-content)40%,transparent)}}.menu-title{font-size:.875rem;font-weight:600}}@layer daisyui.modifier{.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{pointer-events:auto;visibility:visible;opacity:1;transition:visibility 0s allow-discrete,background-color .3s ease-out,opacity .1s ease-out;background-color:#0006}:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal) .modal-box{opacity:1;translate:0;scale:1}:root:has(:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal)){--page-has-backdrop:1;--page-overflow:hidden;--page-scroll-bg:var(--page-scroll-bg-on);--page-scroll-gutter:stable;--page-scroll-transition:var(--page-scroll-transition-on);animation:forwards set-page-has-scroll;animation-timeline:scroll()}@starting-style{.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{opacity:0}}.drawer-open>.drawer-side{overflow-y:auto}.drawer-open>.drawer-toggle{display:none}.drawer-open>.drawer-toggle~.drawer-side{pointer-events:auto;visibility:visible;overscroll-behavior:auto;opacity:1;width:auto;display:block;position:sticky}.drawer-open>.drawer-toggle~.drawer-side>.drawer-overlay{cursor:default;background-color:#0000}.drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay),[dir=rtl] :is(.drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay)){translate:0%}.drawer-open>.drawer-toggle:checked~.drawer-side{pointer-events:auto;visibility:visible}:where(.drawer-toggle:checked~.drawer-side){pointer-events:auto;visibility:visible;opacity:1;overflow-y:auto}:where(.drawer-toggle:checked~.drawer-side)>:not(.drawer-overlay){translate:0%}.drawer-toggle:focus-visible~.drawer-content label.drawer-button{outline-offset:2px;outline:2px solid}.tooltip>.tooltip-content,.tooltip[data-tip]:before{transform:translate(-50%)translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-off)50%}.tooltip:after{transform:translate(-50%)translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-tail)50%}.collapse-arrow>.collapse-title:after{width:.5rem;height:.5rem;display:block;position:absolute;transform:translateY(-100%)rotate(45deg)}@media(prefers-reduced-motion:no-preference){.collapse-arrow>.collapse-title:after{transition-property:all;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}}.collapse-arrow>.collapse-title:after{content:"";transform-origin:75% 75%;pointer-events:none;top:50%;inset-inline-end:1.4rem;box-shadow:2px 2px}.collapse-plus>.collapse-title:after{width:.5rem;height:.5rem;display:block;position:absolute}@media(prefers-reduced-motion:no-preference){.collapse-plus>.collapse-title:after{transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1)}}.collapse-plus>.collapse-title:after{--tw-content:"+";content:var(--tw-content);pointer-events:none;top:.9rem;inset-inline-end:1.4rem}.btn:disabled:not(.btn-link,.btn-ghost){background-color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.btn:disabled:not(.btn-link,.btn-ghost){background-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.btn:disabled:not(.btn-link,.btn-ghost){box-shadow:none}.btn:disabled{pointer-events:none;--btn-border:#0000;--btn-noise:none;--btn-fg:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.btn:disabled{--btn-fg:color-mix(in oklch,var(--color-base-content)20%,#0000)}}@media(hover:hover){.btn:disabled:hover{pointer-events:none;background-color:var(--color-neutral)}@supports (color:color-mix(in lab,red,red)){.btn:disabled:hover{background-color:color-mix(in oklab,var(--color-neutral)20%,transparent)}}.btn:disabled:hover{--btn-border:#0000;--btn-fg:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.btn:disabled:hover{--btn-fg:color-mix(in oklch,var(--color-base-content)20%,#0000)}}}.btn[disabled]:not(.btn-link,.btn-ghost){background-color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.btn[disabled]:not(.btn-link,.btn-ghost){background-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.btn[disabled]:not(.btn-link,.btn-ghost){box-shadow:none}.btn[disabled]{pointer-events:none;--btn-border:#0000;--btn-noise:none;--btn-fg:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.btn[disabled]{--btn-fg:color-mix(in oklch,var(--color-base-content)20%,#0000)}}@media(hover:hover){.btn[disabled]:hover{pointer-events:none;background-color:var(--color-neutral)}@supports (color:color-mix(in lab,red,red)){.btn[disabled]:hover{background-color:color-mix(in oklab,var(--color-neutral)20%,transparent)}}.btn[disabled]:hover{--btn-border:#0000;--btn-fg:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.btn[disabled]:hover{--btn-fg:color-mix(in oklch,var(--color-base-content)20%,#0000)}}}.btn-disabled:not(.btn-link,.btn-ghost){background-color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.btn-disabled:not(.btn-link,.btn-ghost){background-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.btn-disabled:not(.btn-link,.btn-ghost){box-shadow:none}.btn-disabled{pointer-events:none;--btn-border:#0000;--btn-noise:none;--btn-fg:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.btn-disabled{--btn-fg:color-mix(in oklch,var(--color-base-content)20%,#0000)}}@media(hover:hover){.btn-disabled:hover{pointer-events:none;background-color:var(--color-neutral)}@supports (color:color-mix(in lab,red,red)){.btn-disabled:hover{background-color:color-mix(in oklab,var(--color-neutral)20%,transparent)}}.btn-disabled:hover{--btn-border:#0000;--btn-fg:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.btn-disabled:hover{--btn-fg:color-mix(in oklch,var(--color-base-content)20%,#0000)}}}.tab-disabled{pointer-events:none;opacity:.4}@media(prefers-reduced-motion:no-preference){.collapse[open].collapse-arrow>.collapse-title:after,.collapse.collapse-open.collapse-arrow>.collapse-title:after{transform:translateY(-50%)rotate(225deg)}}.collapse.collapse-open.collapse-plus>.collapse-title:after{--tw-content:"−";content:var(--tw-content)}:is(.collapse[tabindex].collapse-arrow:focus:not(.collapse-close),.collapse.collapse-arrow[tabindex]:focus-within:not(.collapse-close))>.collapse-title:after,.collapse.collapse-arrow:not(.collapse-close)>input:is([type=checkbox],[type=radio]):checked~.collapse-title:after{transform:translateY(-50%)rotate(225deg)}.collapse[open].collapse-plus>.collapse-title:after,.collapse[tabindex].collapse-plus:focus:not(.collapse-close)>.collapse-title:after,.collapse.collapse-plus:not(.collapse-close)>input:is([type=checkbox],[type=radio]):checked~.collapse-title:after{--tw-content:"−";content:var(--tw-content)}.collapse-open{grid-template-rows:max-content 1fr}.collapse-open>.collapse-content{content-visibility:visible;min-height:fit-content;padding-bottom:1rem}@supports not (content-visibility:visible){.collapse-open>.collapse-content{visibility:visible}}.tabs-lift{--tabs-height:auto;--tabs-direction:row}.tabs-lift>.tab{--tab-border:0 0 var(--border)0;--tab-radius-ss:var(--tab-radius-limit);--tab-radius-se:var(--tab-radius-limit);--tab-radius-es:0;--tab-radius-ee:0;--tab-paddings:var(--border)var(--tab-p)0 var(--tab-p);--tab-border-colors:#0000 #0000 var(--tab-border-color)#0000;--tab-corner-width:calc(100% + var(--tab-radius-limit)*2);--tab-corner-height:var(--tab-radius-limit);--tab-corner-position:top left,top right;border-width:var(--tab-border);padding:var(--tab-paddings);border-color:var(--tab-border-colors);border-start-start-radius:var(--tab-radius-ss);border-start-end-radius:var(--tab-radius-se);border-end-end-radius:var(--tab-radius-ee);border-end-start-radius:var(--tab-radius-es)}.tabs-lift>.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-lift>.tab:is(input:checked,label:has(:checked)){--tab-border:var(--border)var(--border)0 var(--border);--tab-border-colors:var(--tab-border-color)var(--tab-border-color)#0000 var(--tab-border-color);--tab-paddings:0 calc(var(--tab-p) - var(--border))var(--border)calc(var(--tab-p) - var(--border));--tab-inset:auto auto 0 auto;--radius-start:radial-gradient(circle at top left,var(--tab-radius-grad));--radius-end:radial-gradient(circle at top right,var(--tab-radius-grad));background-color:var(--tab-bg)}:is(.tabs-lift>.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-lift>.tab:is(input:checked,label:has(:checked))):before{z-index:1;content:"";width:var(--tab-corner-width);height:var(--tab-corner-height);background-position:var(--tab-corner-position);background-image:var(--radius-start),var(--radius-end);background-size:var(--tab-radius-limit)var(--tab-radius-limit);inset:var(--tab-inset);background-repeat:no-repeat;display:block;position:absolute}:is(.tabs-lift>.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-lift>.tab:is(input:checked,label:has(:checked))):first-child:before{--radius-start:none}[dir=rtl] :is(.tabs-lift>.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-lift>.tab:is(input:checked,label:has(:checked))):first-child:before{transform:rotateY(180deg)}:is(.tabs-lift>.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-lift>.tab:is(input:checked,label:has(:checked))):last-child:before{--radius-end:none}[dir=rtl] :is(.tabs-lift>.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-lift>.tab:is(input:checked,label:has(:checked))):last-child:before{transform:rotateY(180deg)}.tabs-lift:has(>.tab-content)>.tab:first-child:not(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){--tab-border-colors:var(--tab-border-color)var(--tab-border-color)#0000 var(--tab-border-color)}.tabs-lift>.tab-content{--tabcontent-margin:calc(-1*var(--border))0 0 0;--tabcontent-radius-ss:0;--tabcontent-radius-se:var(--radius-box);--tabcontent-radius-es:var(--radius-box);--tabcontent-radius-ee:var(--radius-box)}:is(.tabs-lift :checked,.tabs-lift label:has(:checked),.tabs-lift :is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]))+.tab-content:first-child,:is(.tabs-lift :checked,.tabs-lift label:has(:checked),.tabs-lift :is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]))+.tab-content:nth-child(n+3){--tabcontent-radius-ss:var(--radius-box)}.list .list-row:has(.list-col-grow:first-child){--list-grid-cols:1fr}.list .list-row:has(.list-col-grow:nth-child(2)){--list-grid-cols:minmax(0,auto)1fr}.list .list-row:has(.list-col-grow:nth-child(3)){--list-grid-cols:minmax(0,auto)minmax(0,auto)1fr}.list .list-row:has(.list-col-grow:nth-child(4)){--list-grid-cols:minmax(0,auto)minmax(0,auto)minmax(0,auto)1fr}.list .list-row:has(.list-col-grow:nth-child(5)){--list-grid-cols:minmax(0,auto)minmax(0,auto)minmax(0,auto)minmax(0,auto)1fr}.list .list-row:has(.list-col-grow:nth-child(6)){--list-grid-cols:minmax(0,auto)minmax(0,auto)minmax(0,auto)minmax(0,auto)minmax(0,auto)1fr}.list .list-row>:not(.list-col-wrap){grid-row-start:1}.avatar-offline:before{content:"";z-index:1;background-color:var(--color-base-300);outline:2px solid var(--color-base-100);border-radius:3.40282e38px;width:15%;height:15%;display:block;position:absolute;top:7%;right:7%}.avatar-online:before{content:"";z-index:1;background-color:var(--color-success);outline:2px solid var(--color-base-100);border-radius:3.40282e38px;width:15%;height:15%;display:block;position:absolute;top:7%;right:7%}.steps .step-neutral+.step-neutral:before,.steps .step-neutral:after,.steps .step-neutral>.step-icon{--step-bg:var(--color-neutral);--step-fg:var(--color-neutral-content)}.steps .step-primary+.step-primary:before,.steps .step-primary:after,.steps .step-primary>.step-icon{--step-bg:var(--color-primary);--step-fg:var(--color-primary-content)}.steps .step-secondary+.step-secondary:before,.steps .step-secondary:after,.steps .step-secondary>.step-icon{--step-bg:var(--color-secondary);--step-fg:var(--color-secondary-content)}.steps .step-accent+.step-accent:before,.steps .step-accent:after,.steps .step-accent>.step-icon{--step-bg:var(--color-accent);--step-fg:var(--color-accent-content)}.steps .step-info+.step-info:before,.steps .step-info:after,.steps .step-info>.step-icon{--step-bg:var(--color-info);--step-fg:var(--color-info-content)}.steps .step-success+.step-success:before,.steps .step-success:after,.steps .step-success>.step-icon{--step-bg:var(--color-success);--step-fg:var(--color-success-content)}.steps .step-warning+.step-warning:before,.steps .step-warning:after,.steps .step-warning>.step-icon{--step-bg:var(--color-warning);--step-fg:var(--color-warning-content)}.steps .step-error+.step-error:before,.steps .step-error:after,.steps .step-error>.step-icon{--step-bg:var(--color-error);--step-fg:var(--color-error-content)}.tabs-border>.tab{--tab-border-color:#0000 #0000 var(--tab-border-color)#0000;border-radius:var(--radius-field);position:relative}.tabs-border>.tab:before{content:"";background-color:var(--tab-border-color);border-radius:var(--radius-field);width:80%;height:3px;transition:background-color .2s;position:absolute;bottom:0;left:10%}:is(.tabs-border>.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-border>.tab:is(input:checked),.tabs-border>.tab:is(label:has(:checked))):before{--tab-border-color:currentColor;border-top:3px solid}.image-full{display:grid}.image-full>*{grid-row-start:1;grid-column-start:1}.image-full>.card-body{color:var(--color-neutral-content);position:relative}.image-full :where(figure){border-radius:inherit;overflow:hidden}.image-full>figure img{object-fit:cover;filter:brightness(28%);height:100%}.menu-horizontal{flex-direction:row;display:inline-flex}.menu-horizontal>li:not(.menu-title)>details>ul{margin-inline-start:0;margin-top:1rem;padding-block:.5rem;padding-inline-end:.5rem;position:absolute}.menu-horizontal>li>details>ul:before{--tw-content:none;content:var(--tw-content)}:where(.menu-horizontal>li:not(.menu-title)>details>ul){border-radius:var(--radius-box);background-color:var(--color-base-100);box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a}.menu-vertical{flex-direction:column;display:inline-flex}.menu-vertical>li:not(.menu-title)>details>ul{margin-inline-start:1rem;margin-top:0;padding-block:0;padding-inline-end:0;position:relative}.checkbox:disabled{cursor:not-allowed;opacity:.2}.checkbox\\!:disabled{cursor:not-allowed!important;opacity:.2!important}.radio:disabled{cursor:not-allowed;opacity:.2}.rating.rating-xs :where(:not(.rating-hidden)){width:1rem;height:1rem}.rating.rating-sm :where(:not(.rating-hidden)){width:1.25rem;height:1.25rem}.rating.rating-md :where(:not(.rating-hidden)){width:1.5rem;height:1.5rem}.rating.rating-lg :where(:not(.rating-hidden)){width:1.75rem;height:1.75rem}.rating.rating-xl :where(:not(.rating-hidden)){width:2rem;height:2rem}:where(.navbar){position:relative}.tooltip-bottom>.tooltip-content,.tooltip-bottom[data-tip]:before{transform:translate(-50%)translateY(var(--tt-pos,-.25rem));inset:var(--tt-off)auto auto 50%}.tooltip-bottom:after{transform:translate(-50%)translateY(var(--tt-pos,-.25rem))rotate(180deg);inset:var(--tt-tail)auto auto 50%}.tooltip-left>.tooltip-content,.tooltip-left[data-tip]:before{transform:translate(calc(var(--tt-pos,.25rem) - .25rem))translateY(-50%);inset:50% var(--tt-off)auto auto}.tooltip-left:after{transform:translate(var(--tt-pos,.25rem))translateY(-50%)rotate(-90deg);inset:50% calc(var(--tt-tail) + 1px)auto auto}.tooltip-right>.tooltip-content,.tooltip-right[data-tip]:before{transform:translate(calc(var(--tt-pos,-.25rem) + .25rem))translateY(-50%);inset:50% auto auto var(--tt-off)}.tooltip-right:after{transform:translate(var(--tt-pos,-.25rem))translateY(-50%)rotate(90deg);inset:50% auto auto calc(var(--tt-tail) + 1px)}.tooltip-top>.tooltip-content,.tooltip-top[data-tip]:before{transform:translate(-50%)translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-off)50%}.tooltip-top:after{transform:translate(-50%)translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-tail)50%}.toast-center{--toast-x:-50%;inset-inline:50%}.toast-end{--toast-x:0;inset-inline:auto 1rem}.toast-start{--toast-x:0;inset-inline:1rem auto}.dropdown-right{--anchor-h:right;--anchor-v:span-bottom}.dropdown-right .dropdown-content{transform-origin:0;inset-inline-start:100%;top:0;bottom:auto}.chat-end{grid-template-columns:1fr auto;place-items:end}.chat-end .chat-header,.chat-end .chat-footer{grid-column-start:1}.chat-end .chat-image{grid-column-start:2}.chat-end .chat-bubble{border-end-end-radius:0;grid-column-start:1}.chat-end .chat-bubble:before{inset-inline-start:100%;transform:rotateY(180deg)}[dir=rtl] :is(.chat-end .chat-bubble):before{transform:rotateY(0)}.chat-start{grid-template-columns:auto 1fr;place-items:start}.chat-start .chat-header,.chat-start .chat-footer{grid-column-start:2}.chat-start .chat-image{grid-column-start:1}.chat-start .chat-bubble{border-end-start-radius:0;grid-column-start:2}.chat-start .chat-bubble:before{inset-inline-start:-.75rem;transform:rotateY(0)}[dir=rtl] :is(.chat-start .chat-bubble):before{transform:rotateY(180deg)}.dropdown-left{--anchor-h:left;--anchor-v:span-bottom}.dropdown-left .dropdown-content{transform-origin:100%;inset-inline-end:100%;top:0;bottom:auto}.dropdown-center{--anchor-h:center}.dropdown-center :where(.dropdown-content){inset-inline-end:50%;translate:50%}[dir=rtl] :is(.dropdown-center :where(.dropdown-content)){translate:-50%}.dropdown-center.dropdown-left{--anchor-h:left;--anchor-v:center}.dropdown-center.dropdown-left .dropdown-content{top:auto;bottom:50%;translate:0 50%}.dropdown-center.dropdown-right{--anchor-h:right;--anchor-v:center}.dropdown-center.dropdown-right .dropdown-content{top:auto;bottom:50%;translate:0 50%}.dropdown-end{--anchor-h:span-left}.dropdown-end :where(.dropdown-content){inset-inline-end:0;translate:0}[dir=rtl] :is(.dropdown-end :where(.dropdown-content)){translate:0}.dropdown-end.dropdown-left{--anchor-h:left;--anchor-v:span-top}.dropdown-end.dropdown-left .dropdown-content{top:auto;bottom:0}.dropdown-end.dropdown-right{--anchor-h:right;--anchor-v:span-top}.dropdown-end.dropdown-right .dropdown-content{top:auto;bottom:0}.dropdown-start{--anchor-h:span-right}.dropdown-start :where(.dropdown-content){inset-inline-end:auto;translate:0}[dir=rtl] :is(.dropdown-start :where(.dropdown-content)){translate:0}.dropdown-start.dropdown-left{--anchor-h:left;--anchor-v:span-bottom}.dropdown-start.dropdown-left .dropdown-content{top:0;bottom:auto}.dropdown-start.dropdown-right{--anchor-h:right;--anchor-v:span-bottom}.dropdown-start.dropdown-right .dropdown-content{top:0;bottom:auto}.dropdown-bottom{--anchor-v:bottom}.dropdown-bottom .dropdown-content{transform-origin:top;top:100%;bottom:auto}.dropdown-top{--anchor-v:top}.dropdown-top .dropdown-content{transform-origin:bottom;top:auto;bottom:100%}.toast-bottom{--toast-y:0;top:auto;bottom:1rem}.toast-middle{--toast-y:-50%;top:50%;bottom:auto}.toast-top{--toast-y:0;top:1rem;bottom:auto}.dock-sm{height:3.5rem;height:calc(3.5rem + env(safe-area-inset-bottom))}.dock-sm .dock-active:after{bottom:-.1rem}.dock-sm .dock-label{font-size:.625rem}.dock-lg{height:4.5rem;height:calc(4.5rem + env(safe-area-inset-bottom))}.dock-lg .dock-active:after{bottom:.4rem}.dock-lg .dock-label{font-size:.6875rem}.dock-xl{height:5rem;height:calc(5rem + env(safe-area-inset-bottom))}.dock-xl .dock-active:after{bottom:.4rem}.dock-xl .dock-label{font-size:.75rem}.dock-xs{height:3rem;height:calc(3rem + env(safe-area-inset-bottom))}.dock-xs .dock-active:after{bottom:-.1rem}.dock-xs .dock-label{font-size:.625rem}.btn-active{--btn-bg:var(--btn-color,var(--color-base-200))}@supports (color:color-mix(in lab,red,red)){.btn-active{--btn-bg:color-mix(in oklab,var(--btn-color,var(--color-base-200)),#000 7%)}}.btn-active{--btn-shadow:0 0 0 0 oklch(0% 0 0/0),0 0 0 0 oklch(0% 0 0/0);isolation:isolate}:is(.stack,.stack.stack-bottom)>*{grid-area:3/3/6/4}:is(.stack,.stack.stack-bottom)>:nth-child(2){grid-area:2/2/5/5}:is(.stack,.stack.stack-bottom)>:first-child{grid-area:1/1/4/6}.stack.stack-top>*{grid-area:1/3/4/4}.stack.stack-top>:nth-child(2){grid-area:2/2/5/5}.stack.stack-top>:first-child{grid-area:3/1/6/6}.stack.stack-start>*{grid-area:3/1/4/4}.stack.stack-start>:nth-child(2){grid-area:2/2/5/5}.stack.stack-start>:first-child{grid-area:1/3/6/6}.stack.stack-end>*{grid-area:3/3/4/6}.stack.stack-end>:nth-child(2){grid-area:2/2/5/5}.stack.stack-end>:first-child{grid-area:1/1/6/4}.timeline-horizontal{flex-direction:row}.timeline-horizontal>li{align-items:center}.timeline-horizontal>li>hr{width:100%;height:.25rem}.timeline-horizontal>li>hr:first-child{grid-row-start:2;grid-column-start:1}.timeline-horizontal>li>hr:last-child{grid-area:2/3/auto/none}.timeline-horizontal .timeline-start{grid-area:1/1/2/4;place-self:flex-end center}.timeline-horizontal .timeline-end{grid-area:3/1/4/4;place-self:flex-start center}.timeline-horizontal:has(.timeline-middle)>li>hr:first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.timeline-horizontal:has(.timeline-middle)>li>hr:last-child,.timeline-horizontal:not(:has(.timeline-middle)) :first-child>hr:last-child{border-start-start-radius:var(--radius-selector);border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:var(--radius-selector)}.timeline-horizontal:not(:has(.timeline-middle)) :last-child>hr:first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.timeline-vertical{flex-direction:column}.timeline-vertical>li{--timeline-row-start:minmax(0,1fr);--timeline-row-end:minmax(0,1fr);justify-items:center}.timeline-vertical>li>hr{width:.25rem;height:100%}.timeline-vertical>li>hr:first-child{grid-row-start:1;grid-column-start:2}.timeline-vertical>li>hr:last-child{grid-area:3/2/none}.timeline-vertical .timeline-start{grid-area:1/1/4/2;place-self:center flex-end}.timeline-vertical .timeline-end{grid-area:1/3/4/4;place-self:center flex-start}.timeline-vertical:has(.timeline-middle)>li>hr:first-child{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:var(--radius-selector);border-bottom-left-radius:var(--radius-selector)}.timeline-vertical:has(.timeline-middle)>li>hr:last-child,.timeline-vertical:not(:has(.timeline-middle)) :first-child>hr:last-child{border-top-left-radius:var(--radius-selector);border-top-right-radius:var(--radius-selector);border-bottom-right-radius:0;border-bottom-left-radius:0}.timeline-vertical:not(:has(.timeline-middle)) :last-child>hr:first-child{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:var(--radius-selector);border-bottom-left-radius:var(--radius-selector)}.timeline-vertical.timeline-snap-icon>li{--timeline-col-start:minmax(0,1fr);--timeline-row-start:.5rem}.timeline-compact{--timeline-row-start:0}.timeline-compact .timeline-start{grid-area:3/1/4/4;place-self:flex-start center}.timeline-compact li:has(.timeline-start) .timeline-end{grid-row-start:auto;grid-column-start:none}.timeline-compact.timeline-vertical>li{--timeline-col-start:0}.timeline-compact.timeline-vertical .timeline-start{grid-area:1/3/4/4;place-self:center flex-start}.timeline-compact.timeline-vertical li:has(.timeline-start) .timeline-end{grid-row-start:none;grid-column-start:auto}.list-col-wrap{grid-row-start:2}.file-input-ghost{box-shadow:none;background-color:#0000;border-color:#0000;transition:background-color .2s}.file-input-ghost::file-selector-button{cursor:pointer;webkit-user-select:none;-webkit-user-select:none;user-select:none;border-start-end-radius:calc(var(--join-ss,var(--radius-field) - var(--border)));border-end-end-radius:calc(var(--join-es,var(--radius-field) - var(--border)));height:100%;margin-block:0;margin-inline:0 1rem;padding-inline:1rem}.file-input-ghost:focus,.file-input-ghost:focus-within{background-color:var(--color-base-100);color:var(--color-base-content);box-shadow:none;border-color:#0000}.input-lg{--size:calc(var(--size-field,.25rem)*12);font-size:max(var(--font-size,1.125rem),1.125rem)}.input-lg[type=number]::-webkit-inner-spin-button{margin-block:-.75rem;margin-inline-end:-.75rem}.input-md{--size:calc(var(--size-field,.25rem)*10);font-size:max(var(--font-size,.875rem),.875rem)}.input-md[type=number]::-webkit-inner-spin-button{margin-block:-.75rem;margin-inline-end:-.75rem}.input-sm{--size:calc(var(--size-field,.25rem)*8);font-size:max(var(--font-size,.75rem),.75rem)}.input-sm[type=number]::-webkit-inner-spin-button{margin-block:-.5rem;margin-inline-end:-.75rem}.input-xl{--size:calc(var(--size-field,.25rem)*14);font-size:max(var(--font-size,1.375rem),1.375rem)}.input-xl[type=number]::-webkit-inner-spin-button{margin-block:-1rem;margin-inline-end:-.75rem}.input-xs{--size:calc(var(--size-field,.25rem)*6);font-size:max(var(--font-size,.6875rem),.6875rem)}.input-xs[type=number]::-webkit-inner-spin-button{margin-block:-.25rem;margin-inline-end:-.75rem}.steps-vertical{grid-auto-rows:1fr;grid-auto-flow:row}.steps-vertical .step{grid-template-rows:auto;grid-template-columns:40px 1fr;justify-items:start;gap:.5rem;min-height:4rem;display:grid}.steps-vertical .step:before{width:.5rem;height:100%;margin-inline-start:50%;translate:-50% -50%}[dir=rtl] :is(.steps-vertical .step):before{translate:50% -50%}.steps-horizontal{grid-auto-columns:1fr;grid-auto-flow:column;display:inline-grid;overflow:auto hidden}.steps-horizontal .step{text-align:center;grid-template-rows:40px 1fr;grid-template-columns:auto;place-items:center;min-width:4rem;display:grid}.steps-horizontal .step:before{width:100%;height:.5rem;margin-inline-start:-100%;translate:0}[dir=rtl] :is(.steps-horizontal .step):before{translate:0}.tabs-box{background-color:var(--color-base-200);--tabs-box-radius:calc(3*var(--radius-field));border-radius:calc(min(calc(var(--tab-height)/2),var(--radius-field)) + min(.25rem,var(--tabs-box-radius)));box-shadow:0 -.5px oklch(100% 0 0/calc(var(--depth)*.1)) inset,0 .5px oklch(0% 0 0/calc(var(--depth)*.05)) inset;padding:.25rem}.tabs-box>.tab{border-radius:var(--radius-field);border-style:none}.tabs-box>.tab:focus-visible,.tabs-box>.tab:is(label:has(:checked:focus-visible)){outline-offset:2px}.tabs-box>:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-box>:is(input:checked),.tabs-box>:is(label:has(:checked)){background-color:var(--tab-bg,var(--color-base-100));box-shadow:0 1px oklch(100% 0 0/calc(var(--depth)*.1)) inset,0 1px 1px -1px var(--color-neutral),0 1px 6px -4px var(--color-neutral)}@supports (color:color-mix(in lab,red,red)){.tabs-box>:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-box>:is(input:checked),.tabs-box>:is(label:has(:checked)){box-shadow:0 1px oklch(100% 0 0/calc(var(--depth)*.1)) inset,0 1px 1px -1px color-mix(in oklab,var(--color-neutral)calc(var(--depth)*50%),#0000),0 1px 6px -4px color-mix(in oklab,var(--color-neutral)calc(var(--depth)*100%),#0000)}}@media(forced-colors:active){.tabs-box>:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-box>:is(input:checked),.tabs-box>:is(label:has(:checked)){border:1px solid}}.tabs-box>.tab-content{height:calc(100% - var(--tab-height) + var(--border) - .5rem);border-radius:calc(min(calc(var(--tab-height)/2),var(--radius-field)) + min(.25rem,var(--tabs-box-radius)) - var(--border));margin-top:.25rem}.avatar-placeholder>div{justify-content:center;align-items:center;display:flex}.divider-end:after,.divider-start:before{display:none}.modal-bottom{place-items:end}.modal-bottom .modal-box{--modal-tl:var(--radius-box);--modal-tr:var(--radius-box);--modal-bl:0;--modal-br:0;width:100%;max-width:none;height:auto;max-height:calc(100vh - 5em);translate:0 100%;scale:1}.modal-end{place-items:end}.modal-end .modal-box{--modal-tl:var(--radius-box);--modal-tr:0;--modal-bl:var(--radius-box);--modal-br:0;width:auto;max-width:none;height:100vh;max-height:none;translate:100%;scale:1}.modal-middle{place-items:center}.modal-middle .modal-box{--modal-tl:var(--radius-box);--modal-tr:var(--radius-box);--modal-bl:var(--radius-box);--modal-br:var(--radius-box);width:91.6667%;max-width:32rem;height:auto;max-height:calc(100vh - 5em);translate:0 2%;scale:98%}.modal-start{place-items:start}.modal-start .modal-box{--modal-tl:0;--modal-tr:var(--radius-box);--modal-bl:0;--modal-br:var(--radius-box);width:auto;max-width:none;height:100vh;max-height:none;translate:-100%;scale:1}.modal-top{place-items:start}.modal-top .modal-box{--modal-tl:0;--modal-tr:0;--modal-bl:var(--radius-box);--modal-br:var(--radius-box);width:100%;max-width:none;height:auto;max-height:calc(100vh - 5em);translate:0 -100%;scale:1}.card-side{flex-direction:row;align-items:stretch}.card-side :where(figure:first-child){border-start-start-radius:inherit;border-start-end-radius:unset;border-end-end-radius:unset;border-end-start-radius:inherit;overflow:hidden}.card-side :where(figure:last-child){border-start-start-radius:unset;border-start-end-radius:inherit;border-end-end-radius:inherit;border-end-start-radius:unset;overflow:hidden}.card-side figure>*{max-width:unset}.card-side :where(figure>*){object-fit:cover;width:100%;height:100%}.divider-horizontal{--divider-m:0 1rem}.divider-horizontal.divider{flex-direction:column;width:1rem;height:auto}.divider-horizontal.divider:before,.divider-horizontal.divider:after{width:.125rem;height:100%}.divider-vertical{--divider-m:1rem 0}.divider-vertical.divider{flex-direction:row;width:auto;height:1rem}.divider-vertical.divider:before,.divider-vertical.divider:after{width:100%;height:.125rem}.btn-circle{width:var(--size);height:var(--size);border-radius:3.40282e38px;padding-inline:0}.btn-square{width:var(--size);height:var(--size);padding-inline:0}.status-lg{width:.75rem;height:.75rem}.status-md{width:.5rem;height:.5rem}.status-sm{width:.25rem;height:.25rem}.status-xl{width:1rem;height:1rem}.status-xs{width:.125rem;height:.125rem}.dock-md{height:4rem;height:calc(4rem + env(safe-area-inset-bottom))}.dock-md .dock-label{font-size:.6875rem}.btn-wide{width:100%;max-width:16rem}.dock-active:after{color:currentColor;background-color:currentColor;width:2.5rem}.rating-half.rating-xs :not(.rating-hidden){width:.5rem}.rating-half.rating-sm :not(.rating-hidden){width:.625rem}.rating-half.rating-md :not(.rating-hidden){width:.75rem}.rating-half.rating-lg :not(.rating-hidden){width:.875rem}.rating-half.rating-xl :not(.rating-hidden){width:1rem}.btn-block{width:100%}.loading-lg{width:calc(var(--size-selector,.25rem)*7)}.loading-md{width:calc(var(--size-selector,.25rem)*6)}.loading-sm{width:calc(var(--size-selector,.25rem)*5)}.loading-xl{width:calc(var(--size-selector,.25rem)*8)}.loading-xs{width:calc(var(--size-selector,.25rem)*4)}.swap-rotate .swap-on,.swap-rotate input:indeterminate~.swap-on{rotate:45deg}.swap-rotate input:is(:checked,:indeterminate)~.swap-on,.swap-rotate.swap-active .swap-on{rotate:none}.swap-rotate input:is(:checked,:indeterminate)~.swap-off,.swap-rotate.swap-active .swap-off{rotate:-45deg}.swap-flip{transform-style:preserve-3d;perspective:20rem}.swap-flip .swap-on,.swap-flip .swap-indeterminate,.swap-flip input:indeterminate~.swap-on{backface-visibility:hidden;transform:rotateY(180deg)}.swap-flip input:is(:checked,:indeterminate)~.swap-on,.swap-flip.swap-active .swap-on{transform:rotateY(0)}.swap-flip input:is(:checked,:indeterminate)~.swap-off,.swap-flip.swap-active .swap-off{backface-visibility:hidden;opacity:1;transform:rotateY(-180deg)}.carousel-horizontal{scroll-snap-type:x mandatory;flex-direction:row;overflow-x:scroll}.carousel-vertical{scroll-snap-type:y mandatory;flex-direction:column;overflow-y:scroll}.carousel-center .carousel-item{scroll-snap-align:center}.carousel-end .carousel-item{scroll-snap-align:end}.carousel-start .carousel-item{scroll-snap-align:start}.alert-horizontal{text-align:start;grid-template-columns:auto;grid-auto-flow:column;justify-content:start;justify-items:start}.alert-horizontal:has(:nth-child(2)){grid-template-columns:auto minmax(auto,1fr)}.alert-vertical{text-align:center;grid-template-columns:auto;grid-auto-flow:row;justify-content:center;justify-items:center}.alert-vertical:has(:nth-child(2)){grid-template-columns:auto}.stats-horizontal{grid-auto-flow:column;overflow-x:auto}.stats-horizontal .stat:not(:last-child){border-inline-end:var(--border)dashed currentColor}@supports (color:color-mix(in lab,red,red)){.stats-horizontal .stat:not(:last-child){border-inline-end:var(--border)dashed color-mix(in oklab,currentColor 10%,#0000)}}.stats-horizontal .stat:not(:last-child){border-block-end:none}.stats-vertical{grid-auto-flow:row;overflow-y:auto}.stats-vertical .stat:not(:last-child){border-inline-end:none;border-block-end:var(--border)dashed currentColor}@supports (color:color-mix(in lab,red,red)){.stats-vertical .stat:not(:last-child){border-block-end:var(--border)dashed color-mix(in oklab,currentColor 10%,#0000)}}.footer-horizontal{grid-auto-flow:column}.footer-horizontal.footer-center{grid-auto-flow:dense}.footer-vertical{grid-auto-flow:row}.footer-vertical.footer-center{grid-auto-flow:column dense}.menu-lg :where(li:not(.menu-title)>:not(ul,details,.menu-title)),.menu-lg :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--radius-field);padding-block:.375rem;padding-inline:1rem;font-size:1.125rem}.menu-lg .menu-title{padding-block:.75rem;padding-inline:1.5rem}.menu-md :where(li:not(.menu-title)>:not(ul,details,.menu-title)),.menu-md :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--radius-field);padding-block:.375rem;padding-inline:.75rem;font-size:.875rem}.menu-md .menu-title{padding-block:.5rem;padding-inline:.75rem}.menu-sm :where(li:not(.menu-title)>:not(ul,details,.menu-title)),.menu-sm :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--radius-field);padding-block:.25rem;padding-inline:.625rem;font-size:.75rem}.menu-sm .menu-title{padding-block:.5rem;padding-inline:.75rem}.menu-xl :where(li:not(.menu-title)>:not(ul,details,.menu-title)),.menu-xl :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--radius-field);padding-block:.375rem;padding-inline:1.25rem;font-size:1.375rem}.menu-xl .menu-title{padding-block:.75rem;padding-inline:1.5rem}.menu-xs :where(li:not(.menu-title)>:not(ul,details,.menu-title)),.menu-xs :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--radius-field);padding-block:.25rem;padding-inline:.5rem;font-size:.6875rem}.menu-xs .menu-title{padding-block:.25rem;padding-inline:.5rem}.badge-dash{color:var(--badge-color);--badge-bg:#0000;background-image:none;border-style:dashed;border-color:currentColor}.btn-dash:not(.btn-active,:hover,:active:focus,:focus-visible,:disabled,[disabled],.btn-disabled,:checked){--btn-shadow:"";--btn-bg:#0000;--btn-fg:var(--btn-color);--btn-border:var(--btn-color);--btn-noise:none;border-style:dashed}@media(hover:none){.btn-dash:hover:not(.btn-active,:active,:focus-visible,:disabled,[disabled],.btn-disabled,:checked){--btn-shadow:"";--btn-bg:#0000;--btn-fg:var(--btn-color);--btn-border:var(--btn-color);--btn-noise:none;border-style:dashed}}.badge-ghost{border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content);background-image:none}.badge-soft{color:var(--badge-color,var(--color-base-content));background-color:var(--badge-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.badge-soft{background-color:color-mix(in oklab,var(--badge-color,var(--color-base-content))8%,var(--color-base-100))}}.badge-soft{border-color:var(--badge-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.badge-soft{border-color:color-mix(in oklab,var(--badge-color,var(--color-base-content))10%,var(--color-base-100))}}.badge-soft{background-image:none}.select-ghost{box-shadow:none;background-color:#0000;border-color:#0000;transition:background-color .2s}.select-ghost:focus,.select-ghost:focus-within{background-color:var(--color-base-100);color:var(--color-base-content);box-shadow:none;border-color:#0000}.input-ghost{box-shadow:none;background-color:#0000;border-color:#0000}.input-ghost:focus,.input-ghost:focus-within{background-color:var(--color-base-100);color:var(--color-base-content);box-shadow:none;border-color:#0000}.textarea-ghost{box-shadow:none;background-color:#0000;border-color:#0000}.textarea-ghost:focus,.textarea-ghost:focus-within{background-color:var(--color-base-100);color:var(--color-base-content);box-shadow:none;border-color:#0000}.badge-outline{color:var(--badge-color);--badge-bg:#0000;background-image:none;border-color:currentColor}:where(:not(ul,details,.menu-title,.btn)).menu-active{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){:where(:not(ul,details,.menu-title,.btn)).menu-active{outline-offset:2px;outline:2px solid #0000}}:where(:not(ul,details,.menu-title,.btn)).menu-active{color:var(--menu-active-fg);background-color:var(--menu-active-bg);background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise)}.chat-bubble-accent{background-color:var(--color-accent);color:var(--color-accent-content)}.chat-bubble-error{background-color:var(--color-error);color:var(--color-error-content)}.chat-bubble-info{background-color:var(--color-info);color:var(--color-info-content)}.chat-bubble-neutral{background-color:var(--color-neutral);color:var(--color-neutral-content)}.chat-bubble-primary{background-color:var(--color-primary);color:var(--color-primary-content)}.chat-bubble-secondary{background-color:var(--color-secondary);color:var(--color-secondary-content)}.chat-bubble-success{background-color:var(--color-success);color:var(--color-success-content)}.chat-bubble-warning{background-color:var(--color-warning);color:var(--color-warning-content)}.status-accent{background-color:var(--color-accent);color:var(--color-accent)}.status-error{background-color:var(--color-error);color:var(--color-error)}.status-info{background-color:var(--color-info);color:var(--color-info)}.status-neutral{background-color:var(--color-neutral);color:var(--color-neutral)}.status-primary{background-color:var(--color-primary);color:var(--color-primary)}.status-secondary{background-color:var(--color-secondary);color:var(--color-secondary)}.status-success{background-color:var(--color-success);color:var(--color-success)}.status-warning{background-color:var(--color-warning);color:var(--color-warning)}.table-zebra tbody tr:where(:nth-child(2n)),.table-zebra tbody tr:where(:nth-child(2n)) :where(.table-pin-cols tr th){background-color:var(--color-base-200)}@media(hover:hover){:is(.table-zebra tbody tr.row-hover,.table-zebra tbody tr.row-hover:where(:nth-child(2n))):hover{background-color:var(--color-base-300)}}.divider-accent:before,.divider-accent:after{background-color:var(--color-accent)}.divider-error:before,.divider-error:after{background-color:var(--color-error)}.divider-info:before,.divider-info:after{background-color:var(--color-info)}.divider-neutral:before,.divider-neutral:after{background-color:var(--color-neutral)}.divider-primary:before,.divider-primary:after{background-color:var(--color-primary)}.divider-secondary:before,.divider-secondary:after{background-color:var(--color-secondary)}.divider-success:before,.divider-success:after{background-color:var(--color-success)}.divider-warning:before,.divider-warning:after{background-color:var(--color-warning)}.loading-ball{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cellipse cx='12' cy='5' rx='4' ry='4'%3E%3Canimate attributeName='cy' values='5;20;20.5;20;5' keyTimes='0;0.469;0.5;0.531;1' dur='.8s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3Canimate attributeName='rx' values='4;4;4.8;4;4' keyTimes='0;0.469;0.5;0.531;1' dur='.8s' repeatCount='indefinite'/%3E%3Canimate attributeName='ry' values='4;4;3;4;4' keyTimes='0;0.469;0.5;0.531;1' dur='.8s' repeatCount='indefinite'/%3E%3C/ellipse%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cellipse cx='12' cy='5' rx='4' ry='4'%3E%3Canimate attributeName='cy' values='5;20;20.5;20;5' keyTimes='0;0.469;0.5;0.531;1' dur='.8s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3Canimate attributeName='rx' values='4;4;4.8;4;4' keyTimes='0;0.469;0.5;0.531;1' dur='.8s' repeatCount='indefinite'/%3E%3Canimate attributeName='ry' values='4;4;3;4;4' keyTimes='0;0.469;0.5;0.531;1' dur='.8s' repeatCount='indefinite'/%3E%3C/ellipse%3E%3C/svg%3E")}.loading-bars{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='1' y='1' width='6' height='22'%3E%3Canimate attributeName='y' values='1;5;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite'/%3E%3Canimate attributeName='height' values='22;14;22' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite'/%3E%3Canimate attributeName='opacity' values='1;0.2;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite'/%3E%3C/rect%3E%3Crect x='9' y='1' width='6' height='22'%3E%3Canimate attributeName='y' values='1;5;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.65s'/%3E%3Canimate attributeName='height' values='22;14;22' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.65s'/%3E%3Canimate attributeName='opacity' values='1;0.2;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.65s'/%3E%3C/rect%3E%3Crect x='17' y='1' width='6' height='22'%3E%3Canimate attributeName='y' values='1;5;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.5s'/%3E%3Canimate attributeName='height' values='22;14;22' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.5s'/%3E%3Canimate attributeName='opacity' values='1;0.2;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.5s'/%3E%3C/rect%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='1' y='1' width='6' height='22'%3E%3Canimate attributeName='y' values='1;5;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite'/%3E%3Canimate attributeName='height' values='22;14;22' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite'/%3E%3Canimate attributeName='opacity' values='1;0.2;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite'/%3E%3C/rect%3E%3Crect x='9' y='1' width='6' height='22'%3E%3Canimate attributeName='y' values='1;5;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.65s'/%3E%3Canimate attributeName='height' values='22;14;22' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.65s'/%3E%3Canimate attributeName='opacity' values='1;0.2;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.65s'/%3E%3C/rect%3E%3Crect x='17' y='1' width='6' height='22'%3E%3Canimate attributeName='y' values='1;5;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.5s'/%3E%3Canimate attributeName='height' values='22;14;22' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.5s'/%3E%3Canimate attributeName='opacity' values='1;0.2;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.5s'/%3E%3C/rect%3E%3C/svg%3E")}.loading-dots{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3C/circle%3E%3Ccircle cx='12' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.1s'/%3E%3C/circle%3E%3Ccircle cx='20' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.2s'/%3E%3C/circle%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3C/circle%3E%3Ccircle cx='12' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.1s'/%3E%3C/circle%3E%3Ccircle cx='20' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.2s'/%3E%3C/circle%3E%3C/svg%3E")}.loading-infinity{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' style='shape-rendering:auto;' width='200px' height='200px' viewBox='0 0 100 100' preserveAspectRatio='xMidYMid'%3E%3Cpath fill='none' stroke='black' stroke-width='10' stroke-dasharray='205.271 51.318' d='M24.3 30C11.4 30 5 43.3 5 50s6.4 20 19.3 20c19.3 0 32.1-40 51.4-40C88.6 30 95 43.3 95 50s-6.4 20-19.3 20C56.4 70 43.6 30 24.3 30z' stroke-linecap='round' style='transform:scale(0.8);transform-origin:50px 50px'%3E%3Canimate attributeName='stroke-dashoffset' repeatCount='indefinite' dur='2s' keyTimes='0;1' values='0;256.589'/%3E%3C/path%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' style='shape-rendering:auto;' width='200px' height='200px' viewBox='0 0 100 100' preserveAspectRatio='xMidYMid'%3E%3Cpath fill='none' stroke='black' stroke-width='10' stroke-dasharray='205.271 51.318' d='M24.3 30C11.4 30 5 43.3 5 50s6.4 20 19.3 20c19.3 0 32.1-40 51.4-40C88.6 30 95 43.3 95 50s-6.4 20-19.3 20C56.4 70 43.6 30 24.3 30z' stroke-linecap='round' style='transform:scale(0.8);transform-origin:50px 50px'%3E%3Canimate attributeName='stroke-dashoffset' repeatCount='indefinite' dur='2s' keyTimes='0;1' values='0;256.589'/%3E%3C/path%3E%3C/svg%3E")}.loading-ring{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='44' height='44' viewBox='0 0 44 44' xmlns='http://www.w3.org/2000/svg' stroke='white'%3E%3Cg fill='none' fill-rule='evenodd' stroke-width='2'%3E%3Ccircle cx='22' cy='22' r='1'%3E%3Canimate attributeName='r' begin='0s' dur='1.8s' values='1;20' calcMode='spline' keyTimes='0;1' keySplines='0.165,0.84,0.44,1' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-opacity' begin='0s' dur='1.8s' values='1;0' calcMode='spline' keyTimes='0;1' keySplines='0.3,0.61,0.355,1' repeatCount='indefinite'/%3E%3C/circle%3E%3Ccircle cx='22' cy='22' r='1'%3E%3Canimate attributeName='r' begin='-0.9s' dur='1.8s' values='1;20' calcMode='spline' keyTimes='0;1' keySplines='0.165,0.84,0.44,1' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-opacity' begin='-0.9s' dur='1.8s' values='1;0' calcMode='spline' keyTimes='0;1' keySplines='0.3,0.61,0.355,1' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='44' height='44' viewBox='0 0 44 44' xmlns='http://www.w3.org/2000/svg' stroke='white'%3E%3Cg fill='none' fill-rule='evenodd' stroke-width='2'%3E%3Ccircle cx='22' cy='22' r='1'%3E%3Canimate attributeName='r' begin='0s' dur='1.8s' values='1;20' calcMode='spline' keyTimes='0;1' keySplines='0.165,0.84,0.44,1' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-opacity' begin='0s' dur='1.8s' values='1;0' calcMode='spline' keyTimes='0;1' keySplines='0.3,0.61,0.355,1' repeatCount='indefinite'/%3E%3C/circle%3E%3Ccircle cx='22' cy='22' r='1'%3E%3Canimate attributeName='r' begin='-0.9s' dur='1.8s' values='1;20' calcMode='spline' keyTimes='0;1' keySplines='0.165,0.84,0.44,1' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-opacity' begin='-0.9s' dur='1.8s' values='1;0' calcMode='spline' keyTimes='0;1' keySplines='0.3,0.61,0.355,1' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-spinner{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.mask-circle{-webkit-mask-image:url("data:image/svg+xml,%3csvg width='200' height='200' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle fill='black' cx='100' cy='100' r='100' fill-rule='evenodd'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg width='200' height='200' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle fill='black' cx='100' cy='100' r='100' fill-rule='evenodd'/%3e%3c/svg%3e")}.mask-decagon{-webkit-mask-image:url("data:image/svg+xml,%3csvg width='192' height='200' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 0 58.779 19.098 36.327 50v61.804l-36.327 50L96 200l-58.779-19.098-36.327-50V69.098l36.327-50z' fill-rule='evenodd'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg width='192' height='200' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 0 58.779 19.098 36.327 50v61.804l-36.327 50L96 200l-58.779-19.098-36.327-50V69.098l36.327-50z' fill-rule='evenodd'/%3e%3c/svg%3e")}.mask-diamond{-webkit-mask-image:url("data:image/svg+xml,%3csvg width='200' height='200' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m100 0 100 100-100 100L0 100z' fill-rule='evenodd'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg width='200' height='200' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m100 0 100 100-100 100L0 100z' fill-rule='evenodd'/%3e%3c/svg%3e")}.mask-heart{-webkit-mask-image:url("data:image/svg+xml,%3csvg width='200' height='185' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M100 184.606a15.384 15.384 0 0 1-8.653-2.678C53.565 156.28 37.205 138.695 28.182 127.7 8.952 104.264-.254 80.202.005 54.146.308 24.287 24.264 0 53.406 0c21.192 0 35.869 11.937 44.416 21.879a2.884 2.884 0 0 0 4.356 0C110.725 11.927 125.402 0 146.594 0c29.142 0 53.098 24.287 53.4 54.151.26 26.061-8.956 50.122-28.176 73.554-9.023 10.994-25.383 28.58-63.165 54.228a15.384 15.384 0 0 1-8.653 2.673Z' fill='black' fill-rule='nonzero'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg width='200' height='185' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M100 184.606a15.384 15.384 0 0 1-8.653-2.678C53.565 156.28 37.205 138.695 28.182 127.7 8.952 104.264-.254 80.202.005 54.146.308 24.287 24.264 0 53.406 0c21.192 0 35.869 11.937 44.416 21.879a2.884 2.884 0 0 0 4.356 0C110.725 11.927 125.402 0 146.594 0c29.142 0 53.098 24.287 53.4 54.151.26 26.061-8.956 50.122-28.176 73.554-9.023 10.994-25.383 28.58-63.165 54.228a15.384 15.384 0 0 1-8.653 2.673Z' fill='black' fill-rule='nonzero'/%3e%3c/svg%3e")}.mask-hexagon{-webkit-mask-image:url("data:image/svg+xml,%3csvg width='182' height='201' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M.3 65.486c0-9.196 6.687-20.063 14.211-25.078l61.86-35.946c8.36-5.016 20.899-5.016 29.258 0l61.86 35.946c8.36 5.015 14.211 15.882 14.211 25.078v71.055c0 9.196-6.687 20.063-14.211 25.079l-61.86 35.945c-8.36 4.18-20.899 4.18-29.258 0L14.51 161.62C6.151 157.44.3 145.737.3 136.54V65.486Z' fill='black' fill-rule='nonzero'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg width='182' height='201' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M.3 65.486c0-9.196 6.687-20.063 14.211-25.078l61.86-35.946c8.36-5.016 20.899-5.016 29.258 0l61.86 35.946c8.36 5.015 14.211 15.882 14.211 25.078v71.055c0 9.196-6.687 20.063-14.211 25.079l-61.86 35.945c-8.36 4.18-20.899 4.18-29.258 0L14.51 161.62C6.151 157.44.3 145.737.3 136.54V65.486Z' fill='black' fill-rule='nonzero'/%3e%3c/svg%3e")}.mask-hexagon-2{-webkit-mask-image:url("data:image/svg+xml,%3csvg width='200' height='182' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M64.786 181.4c-9.196 0-20.063-6.687-25.079-14.21L3.762 105.33c-5.016-8.36-5.016-20.9 0-29.259l35.945-61.86C44.723 5.851 55.59 0 64.786 0h71.055c9.196 0 20.063 6.688 25.079 14.211l35.945 61.86c4.18 8.36 4.18 20.899 0 29.258l-35.945 61.86c-4.18 8.36-15.883 14.211-25.079 14.211H64.786Z' fill='black' fill-rule='nonzero'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg width='200' height='182' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M64.786 181.4c-9.196 0-20.063-6.687-25.079-14.21L3.762 105.33c-5.016-8.36-5.016-20.9 0-29.259l35.945-61.86C44.723 5.851 55.59 0 64.786 0h71.055c9.196 0 20.063 6.688 25.079 14.211l35.945 61.86c4.18 8.36 4.18 20.899 0 29.258l-35.945 61.86c-4.18 8.36-15.883 14.211-25.079 14.211H64.786Z' fill='black' fill-rule='nonzero'/%3e%3c/svg%3e")}.mask-pentagon{-webkit-mask-image:url("data:image/svg+xml,%3csvg width='192' height='181' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 0 95.106 69.098-36.327 111.804H37.22L.894 69.098z' fill-rule='evenodd'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg width='192' height='181' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 0 95.106 69.098-36.327 111.804H37.22L.894 69.098z' fill-rule='evenodd'/%3e%3c/svg%3e")}.mask-squircle{-webkit-mask-image:url("data:image/svg+xml,%3csvg width='200' height='200' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M100 0C20 0 0 20 0 100s20 100 100 100 100-20 100-100S180 0 100 0Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg width='200' height='200' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M100 0C20 0 0 20 0 100s20 100 100 100 100-20 100-100S180 0 100 0Z'/%3e%3c/svg%3e")}.mask-star{-webkit-mask-image:url("data:image/svg+xml,%3csvg width='192' height='180' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 137.263-58.779 42.024 22.163-68.389L.894 68.481l72.476-.243L96 0l22.63 68.238 72.476.243-58.49 42.417 22.163 68.389z' fill-rule='evenodd'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg width='192' height='180' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 137.263-58.779 42.024 22.163-68.389L.894 68.481l72.476-.243L96 0l22.63 68.238 72.476.243-58.49 42.417 22.163 68.389z' fill-rule='evenodd'/%3e%3c/svg%3e")}.mask-star-2{-webkit-mask-image:url("data:image/svg+xml,%3csvg width='192' height='180' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 153.044-58.779 26.243 7.02-63.513L.894 68.481l63.117-13.01L96 0l31.989 55.472 63.117 13.01-43.347 47.292 7.02 63.513z' fill-rule='evenodd'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg width='192' height='180' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 153.044-58.779 26.243 7.02-63.513L.894 68.481l63.117-13.01L96 0l31.989 55.472 63.117 13.01-43.347 47.292 7.02 63.513z' fill-rule='evenodd'/%3e%3c/svg%3e")}.mask-triangle{-webkit-mask-image:url("data:image/svg+xml,%3csvg width='174' height='149' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m87 148.476-86.603.185L43.86 74.423 87 0l43.14 74.423 43.463 74.238z' fill-rule='evenodd'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg width='174' height='149' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m87 148.476-86.603.185L43.86 74.423 87 0l43.14 74.423 43.463 74.238z' fill-rule='evenodd'/%3e%3c/svg%3e")}.mask-triangle-2{-webkit-mask-image:url("data:image/svg+xml,%3csvg width='174' height='150' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m87 .738 86.603-.184-43.463 74.238L87 149.214 43.86 74.792.397.554z' fill-rule='evenodd'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg width='174' height='150' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m87 .738 86.603-.184-43.463 74.238L87 149.214 43.86 74.792.397.554z' fill-rule='evenodd'/%3e%3c/svg%3e")}.mask-triangle-3{-webkit-mask-image:url("data:image/svg+xml,%3csvg width='150' height='174' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m149.369 87.107.185 86.603-74.239-43.463L.893 87.107l74.422-43.14L149.554.505z' fill-rule='evenodd'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg width='150' height='174' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m149.369 87.107.185 86.603-74.239-43.463L.893 87.107l74.422-43.14L149.554.505z' fill-rule='evenodd'/%3e%3c/svg%3e")}.mask-triangle-4{-webkit-mask-image:url("data:image/svg+xml,%3csvg width='150' height='174' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='M.631 87.107.446.505l74.239 43.462 74.422 43.14-74.422 43.14L.446 173.71z' fill-rule='evenodd'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg width='150' height='174' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='M.631 87.107.446.505l74.239 43.462 74.422 43.14-74.422 43.14L.446 173.71z' fill-rule='evenodd'/%3e%3c/svg%3e")}.mask-half-1{-webkit-mask-position:0;mask-position:0;-webkit-mask-size:200%;mask-size:200%}.mask-half-1:where(:dir(rtl),[dir=rtl],[dir=rtl] *){-webkit-mask-position:100%;mask-position:100%}.mask-half-2{-webkit-mask-position:100%;mask-position:100%;-webkit-mask-size:200%;mask-size:200%}.mask-half-2:where(:dir(rtl),[dir=rtl],[dir=rtl] *){-webkit-mask-position:0;mask-position:0}.checkbox-lg{--size:calc(var(--size-selector,.25rem)*7);padding:.3125rem}.checkbox-md{--size:calc(var(--size-selector,.25rem)*6);padding:.25rem}.checkbox-sm{--size:calc(var(--size-selector,.25rem)*5);padding:.1875rem}.checkbox-xl{--size:calc(var(--size-selector,.25rem)*8);padding:.375rem}.checkbox-xs{--size:calc(var(--size-selector,.25rem)*4);padding:.125rem}.radio-lg{padding:.3125rem}.radio-lg[type=radio]{--size:calc(var(--size-selector,.25rem)*7)}.radio-md{padding:.25rem}.radio-md[type=radio]{--size:calc(var(--size-selector,.25rem)*6)}.radio-sm{padding:.1875rem}.radio-sm[type=radio]{--size:calc(var(--size-selector,.25rem)*5)}.radio-xl{padding:.375rem}.radio-xl[type=radio]{--size:calc(var(--size-selector,.25rem)*8)}.radio-xs{padding:.125rem}.radio-xs[type=radio]{--size:calc(var(--size-selector,.25rem)*4)}.select-lg{--size:calc(var(--size-field,.25rem)*12);font-size:1.125rem}.select-lg option{padding-block:.375rem;padding-inline:1rem}.select-md{--size:calc(var(--size-field,.25rem)*10);font-size:.875rem}.select-md option{padding-block:.375rem;padding-inline:.75rem}.select-sm{--size:calc(var(--size-field,.25rem)*8);font-size:.75rem}.select-sm option{padding-block:.25rem;padding-inline:.625rem}.select-xl{--size:calc(var(--size-field,.25rem)*14);font-size:1.375rem}.select-xl option{padding-block:.375rem;padding-inline:1.25rem}.select-xs{--size:calc(var(--size-field,.25rem)*6);font-size:.6875rem}.select-xs option{padding-block:.25rem;padding-inline:.5rem}.table-lg :not(thead,tfoot) tr{font-size:1.125rem}.table-lg :where(th,td){padding-block:1rem;padding-inline:1.25rem}.table-md :not(thead,tfoot) tr{font-size:.875rem}.table-md :where(th,td){padding-block:.75rem;padding-inline:1rem}.table-sm :not(thead,tfoot) tr{font-size:.75rem}.table-sm :where(th,td){padding-block:.5rem;padding-inline:.75rem}.table-xl :not(thead,tfoot) tr{font-size:1.375rem}.table-xl :where(th,td){padding-block:1.25rem;padding-inline:1.5rem}.table-xs :not(thead,tfoot) tr{font-size:.6875rem}.table-xs :where(th,td){padding-block:.25rem;padding-inline:.5rem}.badge-lg{--size:calc(var(--size-selector,.25rem)*7);padding-inline:calc(.25rem*3.5 - var(--border));font-size:1rem}.badge-md{--size:calc(var(--size-selector,.25rem)*6);padding-inline:calc(.25rem*3 - var(--border));font-size:.875rem}.badge-sm{--size:calc(var(--size-selector,.25rem)*5);padding-inline:calc(.25rem*2.5 - var(--border));font-size:.75rem}.badge-xl{--size:calc(var(--size-selector,.25rem)*8);padding-inline:calc(.25rem*4 - var(--border));font-size:1.125rem}.badge-xs{--size:calc(var(--size-selector,.25rem)*4);padding-inline:calc(.25rem*2 - var(--border));font-size:.625rem}.file-input-xl{--size:calc(var(--size-field,.25rem)*14);padding-inline-end:1.5rem;font-size:1.125rem;line-height:3rem}.file-input-xl::file-selector-button{font-size:1.375rem}.file-input-lg{--size:calc(var(--size-field,.25rem)*12);font-size:1.125rem;line-height:2.5rem}.file-input-lg::file-selector-button{font-size:1.125rem}.file-input-md{--size:calc(var(--size-field,.25rem)*10);font-size:.875rem;line-height:2}.file-input-md::file-selector-button{font-size:.875rem}.file-input-sm{--size:calc(var(--size-field,.25rem)*8);font-size:.75rem;line-height:1.5rem}.file-input-sm::file-selector-button{font-size:.75rem}.file-input-xs{--size:calc(var(--size-field,.25rem)*6);font-size:.6875rem;line-height:1rem}.file-input-xs::file-selector-button{font-size:.6875rem}.tabs-lg{--tab-height:calc(var(--size-field,.25rem)*12)}.tabs-lg>.tab{--tab-p:1rem;--tab-radius-min:calc(1.5rem - var(--border));font-size:1.125rem}.tabs-md{--tab-height:calc(var(--size-field,.25rem)*10)}.tabs-md>.tab{--tab-p:.75rem;--tab-radius-min:calc(.75rem - var(--border));font-size:.875rem}.tabs-sm{--tab-height:calc(var(--size-field,.25rem)*8)}.tabs-sm>.tab{--tab-p:.5rem;--tab-radius-min:calc(.5rem - var(--border));font-size:.875rem}.tabs-xl{--tab-height:calc(var(--size-field,.25rem)*14)}.tabs-xl>.tab{--tab-p:1.25rem;--tab-radius-min:calc(2rem - var(--border));font-size:1.125rem}.tabs-xs{--tab-height:calc(var(--size-field,.25rem)*6)}.tabs-xs>.tab{--tab-p:.375rem;--tab-radius-min:calc(.5rem - var(--border));font-size:.75rem}.kbd-lg{--size:calc(var(--size-selector,.25rem)*7);font-size:1rem}.kbd-md{--size:calc(var(--size-selector,.25rem)*6);font-size:.875rem}.kbd-sm{--size:calc(var(--size-selector,.25rem)*5);font-size:.75rem}.kbd-xl{--size:calc(var(--size-selector,.25rem)*8);font-size:1.125rem}.kbd-xs{--size:calc(var(--size-selector,.25rem)*4);font-size:.625rem}.textarea-lg{font-size:max(var(--font-size,1.125rem),1.125rem)}.textarea-md{font-size:max(var(--font-size,.875rem),.875rem)}.textarea-sm{font-size:max(var(--font-size,.75rem),.75rem)}.textarea-xl{font-size:max(var(--font-size,1.375rem),1.375rem)}.textarea-xs{font-size:max(var(--font-size,.6875rem),.6875rem)}.alert-error{color:var(--color-error-content);--alert-border-color:var(--color-error);--alert-color:var(--color-error)}.alert-info{color:var(--color-info-content);--alert-border-color:var(--color-info);--alert-color:var(--color-info)}.alert-success{color:var(--color-success-content);--alert-border-color:var(--color-success);--alert-color:var(--color-success)}.alert-warning{color:var(--color-warning-content);--alert-border-color:var(--color-warning);--alert-color:var(--color-warning)}.file-input-accent{--btn-color:var(--color-accent)}.file-input-accent::file-selector-button{color:var(--color-accent-content)}.file-input-accent,.file-input-accent:focus,.file-input-accent:focus-within{--input-color:var(--color-accent)}.file-input-error{--btn-color:var(--color-error)}.file-input-error::file-selector-button{color:var(--color-error-content)}.file-input-error,.file-input-error:focus,.file-input-error:focus-within{--input-color:var(--color-error)}.file-input-info{--btn-color:var(--color-info)}.file-input-info::file-selector-button{color:var(--color-info-content)}.file-input-info,.file-input-info:focus,.file-input-info:focus-within{--input-color:var(--color-info)}.file-input-neutral{--btn-color:var(--color-neutral)}.file-input-neutral::file-selector-button{color:var(--color-neutral-content)}.file-input-neutral,.file-input-neutral:focus,.file-input-neutral:focus-within{--input-color:var(--color-neutral)}.file-input-primary{--btn-color:var(--color-primary)}.file-input-primary::file-selector-button{color:var(--color-primary-content)}.file-input-primary,.file-input-primary:focus,.file-input-primary:focus-within{--input-color:var(--color-primary)}.file-input-secondary{--btn-color:var(--color-secondary)}.file-input-secondary::file-selector-button{color:var(--color-secondary-content)}.file-input-secondary,.file-input-secondary:focus,.file-input-secondary:focus-within{--input-color:var(--color-secondary)}.file-input-success{--btn-color:var(--color-success)}.file-input-success::file-selector-button{color:var(--color-success-content)}.file-input-success,.file-input-success:focus,.file-input-success:focus-within{--input-color:var(--color-success)}.file-input-warning{--btn-color:var(--color-warning)}.file-input-warning::file-selector-button{color:var(--color-warning-content)}.file-input-warning,.file-input-warning:focus,.file-input-warning:focus-within{--input-color:var(--color-warning)}.checkbox-accent{color:var(--color-accent-content);--input-color:var(--color-accent)}.checkbox-error{color:var(--color-error-content);--input-color:var(--color-error)}.checkbox-info{color:var(--color-info-content);--input-color:var(--color-info)}.checkbox-neutral{color:var(--color-neutral-content);--input-color:var(--color-neutral)}.checkbox-primary{color:var(--color-primary-content);--input-color:var(--color-primary)}.checkbox-secondary{color:var(--color-secondary-content);--input-color:var(--color-secondary)}.checkbox-success{color:var(--color-success-content);--input-color:var(--color-success)}.checkbox-warning{color:var(--color-warning-content);--input-color:var(--color-warning)}.link-accent{color:var(--color-accent)}@media(hover:hover){.link-accent:hover{color:var(--color-accent)}@supports (color:color-mix(in lab,red,red)){.link-accent:hover{color:color-mix(in oklab,var(--color-accent)80%,#000)}}}.link-error{color:var(--color-error)}@media(hover:hover){.link-error:hover{color:var(--color-error)}@supports (color:color-mix(in lab,red,red)){.link-error:hover{color:color-mix(in oklab,var(--color-error)80%,#000)}}}.link-info{color:var(--color-info)}@media(hover:hover){.link-info:hover{color:var(--color-info)}@supports (color:color-mix(in lab,red,red)){.link-info:hover{color:color-mix(in oklab,var(--color-info)80%,#000)}}}.link-neutral{color:var(--color-neutral)}@media(hover:hover){.link-neutral:hover{color:var(--color-neutral)}@supports (color:color-mix(in lab,red,red)){.link-neutral:hover{color:color-mix(in oklab,var(--color-neutral)80%,#000)}}}.link-primary{color:var(--color-primary)}@media(hover:hover){.link-primary:hover{color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.link-primary:hover{color:color-mix(in oklab,var(--color-primary)80%,#000)}}}.link-secondary{color:var(--color-secondary)}@media(hover:hover){.link-secondary:hover{color:var(--color-secondary)}@supports (color:color-mix(in lab,red,red)){.link-secondary:hover{color:color-mix(in oklab,var(--color-secondary)80%,#000)}}}.link-success{color:var(--color-success)}@media(hover:hover){.link-success:hover{color:var(--color-success)}@supports (color:color-mix(in lab,red,red)){.link-success:hover{color:color-mix(in oklab,var(--color-success)80%,#000)}}}.link-warning{color:var(--color-warning)}@media(hover:hover){.link-warning:hover{color:var(--color-warning)}@supports (color:color-mix(in lab,red,red)){.link-warning:hover{color:color-mix(in oklab,var(--color-warning)80%,#000)}}}.range-accent{color:var(--color-accent);--range-thumb:var(--color-accent-content)}.range-error{color:var(--color-error);--range-thumb:var(--color-error-content)}.range-info{color:var(--color-info);--range-thumb:var(--color-info-content)}.range-neutral{color:var(--color-neutral);--range-thumb:var(--color-neutral-content)}.range-primary{color:var(--color-primary);--range-thumb:var(--color-primary-content)}.range-secondary{color:var(--color-secondary);--range-thumb:var(--color-secondary-content)}.range-success{color:var(--color-success);--range-thumb:var(--color-success-content)}.range-warning{color:var(--color-warning);--range-thumb:var(--color-warning-content)}.tooltip-accent{--tt-bg:var(--color-accent)}.tooltip-accent>.tooltip-content,.tooltip-accent[data-tip]:before{color:var(--color-accent-content)}.tooltip-error{--tt-bg:var(--color-error)}.tooltip-error>.tooltip-content,.tooltip-error[data-tip]:before{color:var(--color-error-content)}.tooltip-info{--tt-bg:var(--color-info)}.tooltip-info>.tooltip-content,.tooltip-info[data-tip]:before{color:var(--color-info-content)}.tooltip-primary{--tt-bg:var(--color-primary)}.tooltip-primary>.tooltip-content,.tooltip-primary[data-tip]:before{color:var(--color-primary-content)}.tooltip-secondary{--tt-bg:var(--color-secondary)}.tooltip-secondary>.tooltip-content,.tooltip-secondary[data-tip]:before{color:var(--color-secondary-content)}.tooltip-success{--tt-bg:var(--color-success)}.tooltip-success>.tooltip-content,.tooltip-success[data-tip]:before{color:var(--color-success-content)}.tooltip-warning{--tt-bg:var(--color-warning)}.tooltip-warning>.tooltip-content,.tooltip-warning[data-tip]:before{color:var(--color-warning-content)}.progress-accent{color:var(--color-accent)}.progress-error{color:var(--color-error)}.progress-info{color:var(--color-info)}.progress-neutral{color:var(--color-neutral)}.progress-primary{color:var(--color-primary)}.progress-secondary{color:var(--color-secondary)}.progress-success{color:var(--color-success)}.progress-warning{color:var(--color-warning)}.btn-link{--btn-border:#0000;--btn-bg:#0000;--btn-fg:var(--color-primary);--btn-noise:none;--btn-shadow:"";outline-color:currentColor;text-decoration-line:underline}.btn-link:is(.btn-active,:hover,:active:focus,:focus-visible){--btn-border:#0000;--btn-bg:#0000;text-decoration-line:underline}@media(hover:none){.btn-link:hover:not(.btn-active,:active,:focus-visible,:disabled,[disabled],.btn-disabled){text-decoration-line:none}}.link-hover{text-decoration-line:none}@media(hover:hover){.link-hover:hover{text-decoration-line:underline}}.swap-active .swap-off{opacity:0}.swap-active .swap-on{opacity:1}.btn-ghost:not(.btn-active,:hover,:active:focus,:focus-visible){--btn-shadow:"";--btn-bg:#0000;--btn-border:#0000;--btn-noise:none}.btn-ghost:not(.btn-active,:hover,:active:focus,:focus-visible):not(:disabled,[disabled],.btn-disabled){--btn-fg:currentColor;outline-color:currentColor}@media(hover:none){.btn-ghost:hover:not(.btn-active,:active,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-shadow:"";--btn-bg:#0000;--btn-border:#0000;--btn-noise:none;--btn-fg:currentColor}}.tabs-bottom{--tabs-height:auto;--tabs-direction:row}.tabs-bottom>.tab{--tab-order:1;--tab-border:var(--border)0 0 0;--tab-radius-ss:0;--tab-radius-se:0;--tab-radius-es:var(--tab-radius-limit);--tab-radius-ee:var(--tab-radius-limit);--tab-border-colors:var(--tab-border-color)#0000 #0000 #0000;--tab-paddings:0 var(--tab-p)var(--border)var(--tab-p);--tab-corner-width:calc(100% + var(--tab-radius-limit)*2);--tab-corner-height:var(--tab-radius-limit);--tab-corner-position:top left,top right}.tabs-bottom>.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-bottom>.tab:is(input:checked),.tabs-bottom>.tab:is(label:has(:checked)){--tab-border:0 var(--border)var(--border)var(--border);--tab-border-colors:#0000 var(--tab-border-color)var(--tab-border-color)var(--tab-border-color);--tab-paddings:var(--border)calc(var(--tab-p) - var(--border))0 calc(var(--tab-p) - var(--border));--tab-inset:0 auto auto auto;--radius-start:radial-gradient(circle at bottom left,var(--tab-radius-grad));--radius-end:radial-gradient(circle at bottom right,var(--tab-radius-grad))}.tabs-bottom:has(>.tab-content)>.tab:first-child:not(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){--tab-border-colors:#0000 var(--tab-border-color)var(--tab-border-color)var(--tab-border-color)}.tabs-bottom>.tab-content{--tabcontent-order:0;--tabcontent-margin:0 0 calc(-1*var(--border))0;--tabcontent-radius-ss:var(--radius-box);--tabcontent-radius-se:var(--radius-box);--tabcontent-radius-es:0;--tabcontent-radius-ee:var(--radius-box)}:is(.tabs-bottom>:checked,.tabs-bottom>:is(label:has(:checked)),.tabs-bottom>:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]))+.tab-content:not(:nth-child(2)){--tabcontent-radius-es:var(--radius-box)}.tabs-top{--tabs-height:auto;--tabs-direction:row}.tabs-top>.tab{--tab-order:0;--tab-border:0 0 var(--border)0;--tab-radius-ss:var(--tab-radius-limit);--tab-radius-se:var(--tab-radius-limit);--tab-radius-es:0;--tab-radius-ee:0;--tab-paddings:var(--border)var(--tab-p)0 var(--tab-p);--tab-border-colors:#0000 #0000 var(--tab-border-color)#0000;--tab-corner-width:calc(100% + var(--tab-radius-limit)*2);--tab-corner-height:var(--tab-radius-limit);--tab-corner-position:top left,top right}.tabs-top>.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-top>.tab:is(input:checked),.tabs-top>.tab:is(label:has(:checked)){--tab-border:var(--border)var(--border)0 var(--border);--tab-border-colors:var(--tab-border-color)var(--tab-border-color)#0000 var(--tab-border-color);--tab-paddings:0 calc(var(--tab-p) - var(--border))var(--border)calc(var(--tab-p) - var(--border));--tab-inset:auto auto 0 auto;--radius-start:radial-gradient(circle at top left,var(--tab-radius-grad));--radius-end:radial-gradient(circle at top right,var(--tab-radius-grad))}.tabs-top:has(>.tab-content)>.tab:first-child:not(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){--tab-border-colors:var(--tab-border-color)var(--tab-border-color)#0000 var(--tab-border-color)}.tabs-top>.tab-content{--tabcontent-order:1;--tabcontent-margin:calc(-1*var(--border))0 0 0;--tabcontent-radius-ss:0;--tabcontent-radius-se:var(--radius-box);--tabcontent-radius-es:var(--radius-box);--tabcontent-radius-ee:var(--radius-box)}:is(.tabs-top :checked,.tabs-top label:has(:checked),.tabs-top :is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]))+.tab-content:first-child,:is(.tabs-top :checked,.tabs-top label:has(:checked),.tabs-top :is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]))+.tab-content:nth-child(n+3){--tabcontent-radius-ss:var(--radius-box)}.btn-outline:not(.btn-active,:hover,:active:focus,:focus-visible,:disabled,[disabled],.btn-disabled,:checked){--btn-shadow:"";--btn-bg:#0000;--btn-fg:var(--btn-color);--btn-border:var(--btn-color);--btn-noise:none}@media(hover:none){.btn-outline:hover:not(.btn-active,:active,:focus-visible,:disabled,[disabled],.btn-disabled,:checked){--btn-shadow:"";--btn-bg:#0000;--btn-fg:var(--btn-color);--btn-border:var(--btn-color);--btn-noise:none}}.btn-soft:not(.btn-active,:hover,:active:focus,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-shadow:"";--btn-fg:var(--btn-color,var(--color-base-content));--btn-bg:var(--btn-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.btn-soft:not(.btn-active,:hover,:active:focus,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-bg:color-mix(in oklab,var(--btn-color,var(--color-base-content))8%,var(--color-base-100))}}.btn-soft:not(.btn-active,:hover,:active:focus,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-border:var(--btn-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.btn-soft:not(.btn-active,:hover,:active:focus,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-border:color-mix(in oklab,var(--btn-color,var(--color-base-content))10%,var(--color-base-100))}}.btn-soft:not(.btn-active,:hover,:active:focus,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-noise:none}@media(hover:none){.btn-soft:hover:not(.btn-active,:active,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-shadow:"";--btn-fg:var(--btn-color,var(--color-base-content));--btn-bg:var(--btn-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.btn-soft:hover:not(.btn-active,:active,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-bg:color-mix(in oklab,var(--btn-color,var(--color-base-content))8%,var(--color-base-100))}}.btn-soft:hover:not(.btn-active,:active,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-border:var(--btn-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.btn-soft:hover:not(.btn-active,:active,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-border:color-mix(in oklab,var(--btn-color,var(--color-base-content))10%,var(--color-base-100))}}.btn-soft:hover:not(.btn-active,:active,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-noise:none}}.indicator-end{--indicator-s:auto;--indicator-e:0;--indicator-x:50%}[dir=rtl] .indicator-end,.indicator-start{--indicator-s:0;--indicator-e:auto;--indicator-x:-50%}[dir=rtl] .indicator-start{--indicator-s:auto;--indicator-e:0;--indicator-x:50%}.indicator-center{--indicator-s:50%;--indicator-e:50%;--indicator-x:-50%}[dir=rtl] .indicator-center{--indicator-x:50%}.btn-lg{--fontsize:1.125rem;--btn-p:1.25rem;--size:calc(var(--size-field,.25rem)*12)}.btn-md{--fontsize:.875rem;--btn-p:1rem;--size:calc(var(--size-field,.25rem)*10)}.btn-sm{--fontsize:.75rem;--btn-p:.75rem;--size:calc(var(--size-field,.25rem)*8)}.btn-xl{--fontsize:1.375rem;--btn-p:1.5rem;--size:calc(var(--size-field,.25rem)*14)}.btn-xs{--fontsize:.6875rem;--btn-p:.5rem;--size:calc(var(--size-field,.25rem)*6)}.card-lg .card-body{--card-p:2rem;--card-fs:1rem}.card-lg .card-title{--cardtitle-fs:1.25rem}.card-md .card-body{--card-p:1.5rem;--card-fs:.875rem}.card-md .card-title{--cardtitle-fs:1.125rem}.card-sm .card-body{--card-p:1rem;--card-fs:.75rem}.card-sm .card-title{--cardtitle-fs:1rem}.card-xl .card-body{--card-p:2.5rem;--card-fs:1.125rem}.card-xl .card-title{--cardtitle-fs:1.375rem}.card-xs .card-body{--card-p:.5rem;--card-fs:.6875rem}.card-xs .card-title{--cardtitle-fs:.875rem}.indicator-bottom{--indicator-t:auto;--indicator-b:0;--indicator-y:50%}.indicator-middle{--indicator-t:50%;--indicator-b:50%;--indicator-y:-50%}.indicator-top{--indicator-t:0;--indicator-b:auto;--indicator-y:-50%}.badge-accent{--badge-color:var(--color-accent);--badge-fg:var(--color-accent-content)}.badge-error{--badge-color:var(--color-error);--badge-fg:var(--color-error-content)}.badge-info{--badge-color:var(--color-info);--badge-fg:var(--color-info-content)}.badge-neutral{--badge-color:var(--color-neutral);--badge-fg:var(--color-neutral-content)}.badge-primary{--badge-color:var(--color-primary);--badge-fg:var(--color-primary-content)}.badge-secondary{--badge-color:var(--color-secondary);--badge-fg:var(--color-secondary-content)}.badge-success{--badge-color:var(--color-success);--badge-fg:var(--color-success-content)}.badge-warning{--badge-color:var(--color-warning);--badge-fg:var(--color-warning-content)}.timeline-snap-icon>li{--timeline-col-start:.5rem;--timeline-row-start:minmax(0,1fr)}.card-border{border:var(--border)solid var(--color-base-200)}.card-dash{border:var(--border)dashed var(--color-base-200)}.input-accent,.input-accent:focus,.input-accent:focus-within{--input-color:var(--color-accent)}.input-error,.input-error:focus,.input-error:focus-within{--input-color:var(--color-error)}.input-info,.input-info:focus,.input-info:focus-within{--input-color:var(--color-info)}.input-neutral,.input-neutral:focus,.input-neutral:focus-within{--input-color:var(--color-neutral)}.input-primary,.input-primary:focus,.input-primary:focus-within{--input-color:var(--color-primary)}.input-secondary,.input-secondary:focus,.input-secondary:focus-within{--input-color:var(--color-secondary)}.input-success,.input-success:focus,.input-success:focus-within{--input-color:var(--color-success)}.input-warning,.input-warning:focus,.input-warning:focus-within{--input-color:var(--color-warning)}.radio-accent{--input-color:var(--color-accent)}.radio-error{--input-color:var(--color-error)}.radio-info{--input-color:var(--color-info)}.radio-neutral{--input-color:var(--color-neutral)}.radio-primary{--input-color:var(--color-primary)}.radio-secondary{--input-color:var(--color-secondary)}.radio-success{--input-color:var(--color-success)}.radio-warning{--input-color:var(--color-warning)}.range-lg{--range-thumb-size:calc(var(--size-selector,.25rem)*7)}.range-md{--range-thumb-size:calc(var(--size-selector,.25rem)*6)}.range-sm{--range-thumb-size:calc(var(--size-selector,.25rem)*5)}.range-xl{--range-thumb-size:calc(var(--size-selector,.25rem)*8)}.range-xs{--range-thumb-size:calc(var(--size-selector,.25rem)*4)}.select-accent,.select-accent:focus,.select-accent:focus-within{--input-color:var(--color-accent)}.select-error,.select-error:focus,.select-error:focus-within{--input-color:var(--color-error)}.select-info,.select-info:focus,.select-info:focus-within{--input-color:var(--color-info)}.select-neutral,.select-neutral:focus,.select-neutral:focus-within{--input-color:var(--color-neutral)}.select-primary,.select-primary:focus,.select-primary:focus-within{--input-color:var(--color-primary)}.select-secondary,.select-secondary:focus,.select-secondary:focus-within{--input-color:var(--color-secondary)}.select-success,.select-success:focus,.select-success:focus-within{--input-color:var(--color-success)}.select-warning,.select-warning:focus,.select-warning:focus-within{--input-color:var(--color-warning)}.textarea-accent,.textarea-accent:focus,.textarea-accent:focus-within{--input-color:var(--color-accent)}.textarea-error,.textarea-error:focus,.textarea-error:focus-within{--input-color:var(--color-error)}.textarea-info,.textarea-info:focus,.textarea-info:focus-within{--input-color:var(--color-info)}.textarea-neutral,.textarea-neutral:focus,.textarea-neutral:focus-within{--input-color:var(--color-neutral)}.textarea-primary,.textarea-primary:focus,.textarea-primary:focus-within{--input-color:var(--color-primary)}.textarea-secondary,.textarea-secondary:focus,.textarea-secondary:focus-within{--input-color:var(--color-secondary)}.textarea-success,.textarea-success:focus,.textarea-success:focus-within{--input-color:var(--color-success)}.textarea-warning,.textarea-warning:focus,.textarea-warning:focus-within{--input-color:var(--color-warning)}.toggle-accent:checked,.toggle-accent[aria-checked=true]{--input-color:var(--color-accent)}.toggle-error:checked,.toggle-error[aria-checked=true]{--input-color:var(--color-error)}.toggle-info:checked,.toggle-info[aria-checked=true]{--input-color:var(--color-info)}.toggle-lg[type=checkbox],.toggle-lg:has([type=checkbox]){--size:calc(var(--size-selector,.25rem)*7)}.toggle-md[type=checkbox],.toggle-md:has([type=checkbox]){--size:calc(var(--size-selector,.25rem)*6)}.toggle-neutral:checked,.toggle-neutral[aria-checked=true]{--input-color:var(--color-neutral)}.toggle-primary:checked,.toggle-primary[aria-checked=true]{--input-color:var(--color-primary)}.toggle-secondary:checked,.toggle-secondary[aria-checked=true]{--input-color:var(--color-secondary)}.toggle-sm[type=checkbox],.toggle-sm:has([type=checkbox]){--size:calc(var(--size-selector,.25rem)*5)}.toggle-success:checked,.toggle-success[aria-checked=true]{--input-color:var(--color-success)}.toggle-warning:checked,.toggle-warning[aria-checked=true]{--input-color:var(--color-warning)}.toggle-xl[type=checkbox],.toggle-xl:has([type=checkbox]){--size:calc(var(--size-selector,.25rem)*8)}.toggle-xs[type=checkbox],.toggle-xs:has([type=checkbox]){--size:calc(var(--size-selector,.25rem)*4)}}@layer daisyui.modifier.drawer{.drawer-open>.drawer-toggle:checked~.drawer-side{scrollbar-color:revert-layer}:root:has(.drawer-open>.drawer-toggle:checked){--page-overflow:revert-layer;--page-scroll-gutter:revert-layer;--page-scroll-bg:revert-layer;--page-scroll-transition:revert-layer;--page-has-backdrop:revert-layer;animation:revert-layer;animation-timeline:revert-layer}:where(.drawer-toggle:checked~.drawer-side){scrollbar-color:currentColor oklch(0 0 0/calc(var(--page-has-backdrop,0)*.4))}@supports (color:color-mix(in lab,red,red)){:where(.drawer-toggle:checked~.drawer-side){scrollbar-color:color-mix(in oklch,currentColor 35%,#0000)oklch(0 0 0/calc(var(--page-has-backdrop,0)*.4))}}:where(:root:has(.drawer-toggle:checked)){--page-has-backdrop:1;--page-overflow:hidden;--page-scroll-bg:var(--page-scroll-bg-on);--page-scroll-gutter:stable;--page-scroll-transition:var(--page-scroll-transition-on);animation:forwards set-page-has-scroll;animation-timeline:scroll()}}.prose .btn{text-decoration-line:none}.pointer-events-none{pointer-events:none}.countdown.countdown{line-height:1em}.collapse:not(td,tr,colgroup){visibility:revert-layer}.validator:user-invalid~.validator-hint{display:revert-layer}.validator:has(:user-invalid)~.validator-hint{display:revert-layer}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))~.validator-hint{display:revert-layer}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.-start-1{inset-inline-start:calc(var(--spacing)*-1)}.start-0{inset-inline-start:calc(var(--spacing)*0)}.start-1{inset-inline-start:calc(var(--spacing)*1)}.start-full{inset-inline-start:100%}.end-0{inset-inline-end:calc(var(--spacing)*0)}.end-2{inset-inline-end:calc(var(--spacing)*2)}.end-4{inset-inline-end:calc(var(--spacing)*4)}.-top-7{top:calc(var(--spacing)*-7)}.top-0{top:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.top-1\\/2{top:50%}.top-1\\/3{top:33.3333%}.top-2{top:calc(var(--spacing)*2)}.top-4{top:calc(var(--spacing)*4)}.right-2{right:calc(var(--spacing)*2)}.right-4{right:calc(var(--spacing)*4)}.right-5{right:calc(var(--spacing)*5)}.-bottom-full{bottom:-100%}.bottom-2{bottom:calc(var(--spacing)*2)}.left-1{left:calc(var(--spacing)*1)}.left-4{left:calc(var(--spacing)*4)}.left-5{left:calc(var(--spacing)*5)}.z-1{z-index:1}.z-2{z-index:2}.z-3{z-index:3}.z-10{z-index:10}.z-1002{z-index:1002}.col-span-2{grid-column:span 2/span 2}@layer daisyui.modifier.placement{.drawer-end{grid-auto-columns:auto max-content}.drawer-end>.drawer-toggle~.drawer-content{grid-column-start:1}.drawer-end>.drawer-toggle~.drawer-side{grid-column-start:2;justify-items:end}.drawer-end>.drawer-toggle~.drawer-side>:not(.drawer-overlay){translate:100%}[dir=rtl] :is(.drawer-end>.drawer-toggle~.drawer-side>:not(.drawer-overlay)){translate:-100%}.drawer-end>.drawer-toggle:checked~.drawer-side>:not(.drawer-overlay){translate:0%}}.col-start-1{grid-column-start:1}.row-start-1{grid-row-start:1}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-0\\!{margin:calc(var(--spacing)*0)!important}.m-1{margin:calc(var(--spacing)*1)}.m-4{margin:calc(var(--spacing)*4)}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-4{margin-inline:calc(var(--spacing)*4)}.mx-10{margin-inline:calc(var(--spacing)*10)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing)*1)}.my-2{margin-block:calc(var(--spacing)*2)}.my-6{margin-block:calc(var(--spacing)*6)}.my-10{margin-block:calc(var(--spacing)*10)}.my-16{margin-block:calc(var(--spacing)*16)}.my-20{margin-block:calc(var(--spacing)*20)}.join-horizontal{flex-direction:row}.join-horizontal>.join-item:first-child,.join-horizontal :first-child:not(:last-child) .join-item{--join-ss:var(--radius-field);--join-se:0;--join-es:var(--radius-field);--join-ee:0}.join-horizontal>.join-item:last-child,.join-horizontal :last-child:not(:first-child) .join-item{--join-ss:0;--join-se:var(--radius-field);--join-es:0;--join-ee:var(--radius-field)}.join-horizontal>.join-item:only-child,.join-horizontal :only-child .join-item{--join-ss:var(--radius-field);--join-se:var(--radius-field);--join-es:var(--radius-field);--join-ee:var(--radius-field)}.join-horizontal .join-item:where(:not(:first-child)){margin-block-start:0;margin-inline-start:calc(var(--border,1px)*-1)}.join-vertical{flex-direction:column}.join-vertical>.join-item:first-child,.join-vertical :first-child:not(:last-child) .join-item{--join-ss:var(--radius-field);--join-se:var(--radius-field);--join-es:0;--join-ee:0}.join-vertical>.join-item:last-child,.join-vertical :last-child:not(:first-child) .join-item{--join-ss:0;--join-se:0;--join-es:var(--radius-field);--join-ee:var(--radius-field)}.join-vertical>.join-item:only-child,.join-vertical :only-child .join-item{--join-ss:var(--radius-field);--join-se:var(--radius-field);--join-es:var(--radius-field);--join-ee:var(--radius-field)}.join-vertical .join-item:where(:not(:first-child)){margin-block-start:calc(var(--border,1px)*-1);margin-inline-start:0}.join-item:where(:not(:first-child,:disabled,[disabled],.btn-disabled)){margin-block-start:0;margin-inline-start:calc(var(--border,1px)*-1)}.join-item:where(:is(:disabled,[disabled],.btn-disabled)){border-width:var(--border,1px)0 var(--border,1px)var(--border,1px)}.me-2{margin-inline-end:calc(var(--spacing)*2)}.-mt-1{margin-top:calc(var(--spacing)*-1)}.mt-0\\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-10{margin-top:calc(var(--spacing)*10)}.mt-12{margin-top:calc(var(--spacing)*12)}.mt-16{margin-top:calc(var(--spacing)*16)}.mt-32{margin-top:calc(var(--spacing)*32)}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-10{margin-bottom:calc(var(--spacing)*10)}.mb-16{margin-bottom:calc(var(--spacing)*16)}.mb-20{margin-bottom:calc(var(--spacing)*20)}.mb-28{margin-bottom:calc(var(--spacing)*28)}.mb-32{margin-bottom:calc(var(--spacing)*32)}.mb-40{margin-bottom:calc(var(--spacing)*40)}.mb-48{margin-bottom:calc(var(--spacing)*48)}.mb-72{margin-bottom:calc(var(--spacing)*72)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-auto{margin-left:auto}.kbd{box-shadow:none}.alert{border-width:var(--border);border-color:var(--alert-border-color,var(--color-base-200))}.join{--join-ss:0;--join-se:0;--join-es:0;--join-ee:0;align-items:stretch;display:inline-flex}.join :where(.join-item){border-start-start-radius:var(--join-ss,0);border-start-end-radius:var(--join-se,0);border-end-end-radius:var(--join-ee,0);border-end-start-radius:var(--join-es,0)}.join :where(.join-item) *{--join-ss:var(--radius-field);--join-se:var(--radius-field);--join-es:var(--radius-field);--join-ee:var(--radius-field)}.join>.join-item:where(:first-child),.join :first-child:not(:last-child) :where(.join-item){--join-ss:var(--radius-field);--join-se:0;--join-es:var(--radius-field);--join-ee:0}.join>.join-item:where(:last-child),.join :last-child:not(:first-child) :where(.join-item){--join-ss:0;--join-se:var(--radius-field);--join-es:0;--join-ee:var(--radius-field)}.join>.join-item:where(:only-child),.join :only-child :where(.join-item){--join-ss:var(--radius-field);--join-se:var(--radius-field);--join-es:var(--radius-field);--join-ee:var(--radius-field)}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:root .prose{--tw-prose-body:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){:root .prose{--tw-prose-body:color-mix(in oklab,var(--color-base-content)80%,#0000)}}:root .prose{--tw-prose-headings:var(--color-base-content);--tw-prose-lead:var(--color-base-content);--tw-prose-links:var(--color-base-content);--tw-prose-bold:var(--color-base-content);--tw-prose-counters:var(--color-base-content);--tw-prose-bullets:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){:root .prose{--tw-prose-bullets:color-mix(in oklab,var(--color-base-content)50%,#0000)}}:root .prose{--tw-prose-hr:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){:root .prose{--tw-prose-hr:color-mix(in oklab,var(--color-base-content)20%,#0000)}}:root .prose{--tw-prose-quotes:var(--color-base-content);--tw-prose-quote-borders:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){:root .prose{--tw-prose-quote-borders:color-mix(in oklab,var(--color-base-content)20%,#0000)}}:root .prose{--tw-prose-captions:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){:root .prose{--tw-prose-captions:color-mix(in oklab,var(--color-base-content)50%,#0000)}}:root .prose{--tw-prose-code:var(--color-base-content);--tw-prose-pre-code:var(--color-neutral-content);--tw-prose-pre-bg:var(--color-neutral);--tw-prose-th-borders:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){:root .prose{--tw-prose-th-borders:color-mix(in oklab,var(--color-base-content)50%,#0000)}}:root .prose{--tw-prose-td-borders:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){:root .prose{--tw-prose-td-borders:color-mix(in oklab,var(--color-base-content)20%,#0000)}}:root .prose{--tw-prose-kbd:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){:root .prose{--tw-prose-kbd:color-mix(in oklab,var(--color-base-content)80%,#0000)}}:root .prose :where(code):not(pre>code){background-color:var(--color-base-200);border-radius:var(--radius-selector);border:var(--border)solid var(--color-base-300);font-weight:inherit;padding-inline:.5em}:root .prose :where(code):not(pre>code):before,:root .prose :where(code):not(pre>code):after{display:none}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.table{display:table}.aspect-16\\/9{aspect-ratio:16/9}.aspect-\\[1600\\/650\\]{aspect-ratio:1600/650}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-1\\.5{width:calc(var(--spacing)*1.5);height:calc(var(--spacing)*1.5)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-5{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-10{width:calc(var(--spacing)*10);height:calc(var(--spacing)*10)}.size-28{width:calc(var(--spacing)*28);height:calc(var(--spacing)*28)}.size-\\[1\\.2em\\]{width:1.2em;height:1.2em}.size-\\[1\\.8em\\]{width:1.8em;height:1.8em}.size-\\[1em\\]{width:1em;height:1em}.size-full{width:100%;height:100%}.h-1{height:calc(var(--spacing)*1)}.h-2{height:calc(var(--spacing)*2)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-20{height:calc(var(--spacing)*20)}.h-24{height:calc(var(--spacing)*24)}.h-32{height:calc(var(--spacing)*32)}.h-36{height:calc(var(--spacing)*36)}.h-40{height:calc(var(--spacing)*40)}.h-42{height:calc(var(--spacing)*42)}.h-48{height:calc(var(--spacing)*48)}.h-52{height:calc(var(--spacing)*52)}.h-56{height:calc(var(--spacing)*56)}.h-64{height:calc(var(--spacing)*64)}.h-80{height:calc(var(--spacing)*80)}.h-96{height:calc(var(--spacing)*96)}.h-\\[1em\\]{height:1em}.h-\\[3\\.5rem\\]{height:3.5rem}.h-\\[320px\\]{height:320px}.h-\\[375px\\]{height:375px}.h-\\[414px\\]{height:414px}.h-\\[568px\\]{height:568px}.h-\\[667px\\]{height:667px}.h-\\[736px\\]{height:736px}.h-\\[812px\\]{height:812px}.h-\\[896px\\]{height:896px}.h-\\[1024px\\]{height:1024px}.h-auto{height:auto}.h-fit{height:fit-content}.h-full{height:100%}.h-px{height:1px}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\\[80vh\\]{max-height:80vh}.min-h-12{min-height:calc(var(--spacing)*12)}.min-h-\\[20rem\\]{min-height:20rem}.min-h-\\[30rem\\]{min-height:30rem}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-1\\/2{width:50%}.w-2{width:calc(var(--spacing)*2)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-10{width:calc(var(--spacing)*10)}.w-11\\/12{width:91.6667%}.w-12{width:calc(var(--spacing)*12)}.w-16{width:calc(var(--spacing)*16)}.w-20{width:calc(var(--spacing)*20)}.w-24{width:calc(var(--spacing)*24)}.w-28{width:calc(var(--spacing)*28)}.w-32{width:calc(var(--spacing)*32)}.w-36{width:calc(var(--spacing)*36)}.w-40{width:calc(var(--spacing)*40)}.w-48{width:calc(var(--spacing)*48)}.w-52{width:calc(var(--spacing)*52)}.w-56{width:calc(var(--spacing)*56)}.w-60{width:calc(var(--spacing)*60)}.w-64{width:calc(var(--spacing)*64)}.w-80{width:calc(var(--spacing)*80)}.w-96{width:calc(var(--spacing)*96)}.w-\\[5\\.3rem\\]{width:5.3rem}.w-\\[5\\.8rem\\]{width:5.8rem}.w-\\[320px\\]{width:320px}.w-\\[375px\\]{width:375px}.w-\\[414px\\]{width:414px}.w-\\[568px\\]{width:568px}.w-\\[667px\\]{width:667px}.w-\\[736px\\]{width:736px}.w-\\[812px\\]{width:812px}.w-\\[896px\\]{width:896px}.w-\\[1024px\\]{width:1024px}.w-full{width:100%}.w-lg{width:var(--container-lg)}.w-px{width:1px}.w-xs{width:var(--container-xs)}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-60{max-width:calc(var(--spacing)*60)}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-max{min-width:max-content}.flex-1{flex:1}.flex-none{flex:none}.flex-shrink,.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.translate-x-2{--tw-translate-x:calc(var(--spacing)*2);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-2{--tw-translate-y:calc(var(--spacing)*2);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-26{--tw-translate-y:calc(var(--spacing)*26);translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-400{--tw-scale-x:400%;--tw-scale-y:400%;--tw-scale-z:400%;scale:var(--tw-scale-x)var(--tw-scale-y)}.-rotate-10{rotate:-10deg}.\\[transform\\:scaleY\\(\\.3\\)\\]{transform:scaleY(.3)}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-bounce{animation:var(--animate-bounce)}.animate-ping{animation:var(--animate-ping)}.cursor-pointer{cursor:pointer}.appearance-none{appearance:none}.auto-cols-max{grid-auto-columns:max-content}.grid-flow-col{grid-auto-flow:column}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.place-content-center{place-content:center}.place-items-center{place-items:center}.items-center{align-items:center}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-5{gap:calc(var(--spacing)*5)}.gap-6{gap:calc(var(--spacing)*6)}.gap-10{gap:calc(var(--spacing)*10)}.gap-12{gap:calc(var(--spacing)*12)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-1{column-gap:calc(var(--spacing)*1)}:where(.-space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-6)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-6)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}.gap-y-2{row-gap:calc(var(--spacing)*2)}:where(.divide-primary>:not(:last-child)){border-color:var(--color-primary)}.place-self-start{place-self:start}.justify-self-start{justify-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-box{border-radius:var(--radius-box)}.rounded-field{border-radius:var(--radius-field)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-selector{border-radius:var(--radius-selector)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-e-lg{border-start-end-radius:var(--radius-lg);border-end-end-radius:var(--radius-lg)}.rounded-se-box{border-start-end-radius:var(--radius-box)}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.rounded-l-full{border-top-left-radius:3.40282e38px;border-bottom-left-radius:3.40282e38px}.rounded-r-full{border-top-right-radius:3.40282e38px;border-bottom-right-radius:3.40282e38px}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-b-box{border-bottom-right-radius:var(--radius-box);border-bottom-left-radius:var(--radius-box)}.rounded-b-lg{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-\\[length\\:var\\(--border\\)\\]{border-style:var(--tw-border-style);border-width:var(--border)}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-s-0{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}@layer daisyui.style{.alert-dash{color:var(--alert-color);box-shadow:none;background-color:#0000;background-image:none;border-style:dashed}.alert-outline{color:var(--alert-color);box-shadow:none;background-color:#0000;background-image:none}.alert-soft{color:var(--alert-color,var(--color-base-content));background:var(--alert-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.alert-soft{background:color-mix(in oklab,var(--alert-color,var(--color-base-content))8%,var(--color-base-100))}}.alert-soft{--alert-border-color:var(--alert-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.alert-soft{--alert-border-color:color-mix(in oklab,var(--alert-color,var(--color-base-content))10%,var(--color-base-100))}}.alert-soft{box-shadow:none;background-image:none}}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.border-\\[\\#00b544\\]{border-color:#00b544}.border-\\[\\#4eaa0c\\]{border-color:#4eaa0c}.border-\\[\\#005fd8\\]{border-color:#005fd8}.border-\\[\\#0059b3\\]{border-color:#0059b3}.border-\\[\\#35567b\\]{border-color:#35567b}.border-\\[\\#591660\\]{border-color:#591660}.border-\\[\\#e5e5e5\\]{border-color:#e5e5e5}.border-\\[\\#e17d00\\]{border-color:#e17d00}.border-\\[\\#f1d800\\]{border-color:#f1d800}.border-\\[\\#ff8938\\]{border-color:#ff8938}.border-base-300{border-color:var(--color-base-300)}.border-base-content,.border-base-content\\/5{border-color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.border-base-content\\/5{border-color:color-mix(in oklab,var(--color-base-content)5%,transparent)}}.border-base-content\\/10{border-color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.border-base-content\\/10{border-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.border-base-content\\/20{border-color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.border-base-content\\/20{border-color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.border-black{border-color:var(--color-black)}.border-blue-300{border-color:var(--color-blue-300)}.border-blue-700{border-color:var(--color-blue-700)}.border-gray-200{border-color:var(--color-gray-200)}.border-indigo-600{border-color:var(--color-indigo-600)}.border-primary{border-color:var(--color-primary)}.border-primary-content\\/10{border-color:var(--color-primary-content)}@supports (color:color-mix(in lab,red,red)){.border-primary-content\\/10{border-color:color-mix(in oklab,var(--color-primary-content)10%,transparent)}}.border-red-300{border-color:var(--color-red-300)}.border-secondary{border-color:var(--color-secondary)}.border-sky-400{border-color:var(--color-sky-400)}.border-white\\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.border-white\\/5{border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.border-zinc-200{border-color:var(--color-zinc-200)}.glass{-webkit-backdrop-filter:blur(var(--glass-blur,40px));backdrop-filter:blur(var(--glass-blur,40px));background-color:#0000;background-image:linear-gradient(135deg,oklch(100% 0 0/var(--glass-opacity,30%)),#0000),linear-gradient(var(--glass-reflect-degree,100deg),oklch(100% 0 0/var(--glass-reflect-opacity,5%))25%,oklch(0% 0 0/0) 25%);box-shadow:0 0 0 1px oklch(100% 0 0/var(--glass-border-opacity,20%)) inset,0 0 0 2px #0000000d;text-shadow:0 1px oklch(0% 0 0/var(--glass-text-shadow-opacity,5%));border:none}.bg-\\[\\#1A77F2\\]{background-color:#1a77f2}.bg-\\[\\#2F2F2F\\]{background-color:#2f2f2f}.bg-\\[\\#03C755\\]{background-color:#03c755}.bg-\\[\\#5EBB2B\\]{background-color:#5ebb2b}.bg-\\[\\#0967C2\\]{background-color:#0967c2}.bg-\\[\\#47698F\\]{background-color:#47698f}.bg-\\[\\#622069\\]{background-color:#622069}.bg-\\[\\#FEE502\\]{background-color:#fee502}.bg-\\[\\#FF9900\\]{background-color:#f90}.bg-accent{background-color:var(--color-accent)}.bg-accent-content{background-color:var(--color-accent-content)}.bg-amber-300{background-color:var(--color-amber-300)}.bg-base-100{background-color:var(--color-base-100)}.bg-base-200{background-color:var(--color-base-200)}.bg-base-300{background-color:var(--color-base-300)}.bg-base-content{background-color:var(--color-base-content)}.bg-black{background-color:var(--color-black)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-700{background-color:var(--color-blue-700)}.bg-error{background-color:var(--color-error)}.bg-error-content{background-color:var(--color-error-content)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-green-400{background-color:var(--color-green-400)}.bg-green-500{background-color:var(--color-green-500)}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-info{background-color:var(--color-info)}.bg-info-content{background-color:var(--color-info-content)}.bg-lime-400{background-color:var(--color-lime-400)}.bg-neutral{background-color:var(--color-neutral)}.bg-neutral-900{background-color:var(--color-neutral-900)}.bg-neutral-content{background-color:var(--color-neutral-content)}.bg-orange-400{background-color:var(--color-orange-400)}.bg-orange-600{background-color:var(--color-orange-600)}.bg-primary{background-color:var(--color-primary)}.bg-primary-content{background-color:var(--color-primary-content)}.bg-primary\\/50{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\\/50{background-color:color-mix(in oklab,var(--color-primary)50%,transparent)}}.bg-red-100{background-color:var(--color-red-100)}.bg-red-400{background-color:var(--color-red-400)}.bg-secondary{background-color:var(--color-secondary)}.bg-secondary-content{background-color:var(--color-secondary-content)}.bg-success{background-color:var(--color-success)}.bg-success-content{background-color:var(--color-success-content)}.bg-warning{background-color:var(--color-warning)}.bg-warning-content{background-color:var(--color-warning-content)}.bg-white{background-color:var(--color-white)}.bg-yellow-400{background-color:var(--color-yellow-400)}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-100{background-color:var(--color-zinc-100)}.from-primary{--tw-gradient-from:var(--color-primary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.via-primary{--tw-gradient-via:var(--color-primary);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-primary{--tw-gradient-to:var(--color-primary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.mask-circle{--tw-mask-radial-shape:circle}.fill-current{fill:currentColor}.fill-primary{fill:var(--color-primary)}.stroke-current{stroke:currentColor}.stroke-info{stroke:var(--color-info)}.stroke-primary{stroke:var(--color-primary)}.object-cover{object-fit:cover}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-10{padding:calc(var(--spacing)*10)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\\.5{padding-inline:calc(var(--spacing)*2.5)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-10{padding-inline:calc(var(--spacing)*10)}.px-12{padding-inline:calc(var(--spacing)*12)}.px-16{padding-inline:calc(var(--spacing)*16)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-10{padding-block:calc(var(--spacing)*10)}.ps-4{padding-inline-start:calc(var(--spacing)*4)}.ps-6{padding-inline-start:calc(var(--spacing)*6)}.pe-10{padding-inline-end:calc(var(--spacing)*10)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-10{padding-top:calc(var(--spacing)*10)}.pt-12{padding-top:calc(var(--spacing)*12)}.pt-16{padding-top:calc(var(--spacing)*16)}.pt-32{padding-top:calc(var(--spacing)*32)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-6{padding-bottom:calc(var(--spacing)*6)}.pb-8{padding-bottom:calc(var(--spacing)*8)}.pl-4{padding-left:calc(var(--spacing)*4)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-bottom{vertical-align:bottom}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.text-9xl{font-size:var(--text-9xl);line-height:var(--tw-leading,var(--text-9xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.\\[text-wrap\\:balance\\]{text-wrap:balance}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\\[\\#181600\\]{color:#181600}.text-\\[color-mix\\(in_oklab\\,color-mix\\(in_oklab\\,white_40\\%\\,var\\(--color-neutral-content\\)\\)_20\\%\\,oklch\\(75\\%_0\\.3_173\\.24\\)\\)\\]{color:#fff}@supports (color:color-mix(in lab,red,red)){.text-\\[color-mix\\(in_oklab\\,color-mix\\(in_oklab\\,white_40\\%\\,var\\(--color-neutral-content\\)\\)_20\\%\\,oklch\\(75\\%_0\\.3_173\\.24\\)\\)\\]{color:color-mix(in oklab,color-mix(in oklab,white 40%,var(--color-neutral-content))20%,oklch(75% .3 173.24))}}.text-accent{color:var(--color-accent)}.text-accent-content{color:var(--color-accent-content)}.text-base-100{color:var(--color-base-100)}.text-base-content,.text-base-content\\/20{color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.text-base-content\\/20{color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.text-base-content\\/30{color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.text-base-content\\/30{color:color-mix(in oklab,var(--color-base-content)30%,transparent)}}.text-base-content\\/40{color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.text-base-content\\/40{color:color-mix(in oklab,var(--color-base-content)40%,transparent)}}.text-base-content\\/50{color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.text-base-content\\/50{color:color-mix(in oklab,var(--color-base-content)50%,transparent)}}.text-base-content\\/60{color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.text-base-content\\/60{color:color-mix(in oklab,var(--color-base-content)60%,transparent)}}.text-base-content\\/70{color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.text-base-content\\/70{color:color-mix(in oklab,var(--color-base-content)70%,transparent)}}.text-black{color:var(--color-black)}.text-blue-200{color:var(--color-blue-200)}.text-blue-300{color:var(--color-blue-300)}.text-error{color:var(--color-error)}.text-info{color:var(--color-info)}.text-neutral{color:var(--color-neutral)}.text-neutral-content{color:var(--color-neutral-content)}.text-orange-400{color:var(--color-orange-400)}.text-primary{color:var(--color-primary)}.text-primary-content,.text-primary-content\\/50{color:var(--color-primary-content)}@supports (color:color-mix(in lab,red,red)){.text-primary-content\\/50{color:color-mix(in oklab,var(--color-primary-content)50%,transparent)}}.text-primary-content\\/60{color:var(--color-primary-content)}@supports (color:color-mix(in lab,red,red)){.text-primary-content\\/60{color:color-mix(in oklab,var(--color-primary-content)60%,transparent)}}.text-secondary{color:var(--color-secondary)}.text-secondary-content{color:var(--color-secondary-content)}.text-success{color:var(--color-success)}.text-warning{color:var(--color-warning)}.text-warning-content{color:var(--color-warning-content)}.text-white{color:var(--color-white)}.text-zinc-800{color:var(--color-zinc-800)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.decoration-primary{-webkit-text-decoration-color:var(--color-primary);text-decoration-color:var(--color-primary)}.placeholder-primary::placeholder{color:var(--color-primary)}.caret-primary{caret-color:var(--color-primary)}.accent-primary{accent-color:var(--color-primary)}.opacity-5{opacity:.05}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-primary{--tw-shadow-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.shadow-primary{--tw-shadow-color:color-mix(in oklab,var(--color-primary)var(--tw-shadow-alpha),transparent)}}.ring-primary{--tw-ring-color:var(--color-primary)}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.ring-offset-base-100{--tw-ring-offset-color:var(--color-base-100)}.ring-offset-primary{--tw-ring-offset-color:var(--color-primary)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.outline-black\\/5{outline-color:#0000000d}@supports (color:color-mix(in lab,red,red)){.outline-black\\/5{outline-color:color-mix(in oklab,var(--color-black)5%,transparent)}}.outline-primary{outline-color:var(--color-primary)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.blur-lg{--tw-blur:blur(var(--blur-lg));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-125{--tw-brightness:brightness(125%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.saturate-200{--tw-saturate:saturate(200%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-0{--tw-duration:0s;transition-duration:0s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}@layer daisyui.modifier.color{.btn-accent{--btn-color:var(--color-accent);--btn-fg:var(--color-accent-content)}.btn-error{--btn-color:var(--color-error);--btn-fg:var(--color-error-content)}.btn-info{--btn-color:var(--color-info);--btn-fg:var(--color-info-content)}.btn-neutral{--btn-color:var(--color-neutral);--btn-fg:var(--color-neutral-content)}.btn-primary{--btn-color:var(--color-primary);--btn-fg:var(--color-primary-content)}.btn-secondary{--btn-color:var(--color-secondary);--btn-fg:var(--color-secondary-content)}.btn-success{--btn-color:var(--color-success);--btn-fg:var(--color-success-content)}.btn-warning{--btn-color:var(--color-warning);--btn-fg:var(--color-warning-content)}}.select-none{-webkit-user-select:none;user-select:none}.\\[--alert-color\\:blue\\]{--alert-color:blue}.\\[--range-bg\\:orange\\]{--range-bg:orange}.\\[--range-fill\\:0\\]{--range-fill:0}.\\[--range-thumb\\:blue\\]{--range-thumb:blue}.\\[--tab-bg\\:orange\\]{--tab-bg:orange}.\\[--tab-bg\\:var\\(--color-neutral\\)\\]{--tab-bg:var(--color-neutral)}.\\[--tab-border-color\\:red\\]{--tab-border-color:red}.\\[--tab-border-color\\:var\\(--color-neutral\\)\\]{--tab-border-color:var(--color-neutral)}.\\[--tglbg\\:var\\(--color-sky-500\\)\\]{--tglbg:var(--color-sky-500)}.\\[direction\\:ltr\\]{direction:ltr}.text-shadow-lg{text-shadow:0px 1px 2px var(--tw-text-shadow-color,#0000001a),0px 3px 2px var(--tw-text-shadow-color,#0000001a),0px 4px 8px var(--tw-text-shadow-color,#0000001a)}:is(.\\*\\:-ms-px>*){margin-inline-start:-1px}:is(.\\*\\:-mt-px>*){margin-top:-1px}:is(.\\*\\:grid>*){display:grid}:is(.\\*\\:place-content-center>*){place-content:center}:is(.\\*\\:bg-linear-80>*){--tw-gradient-position:80deg}@supports (background-image:linear-gradient(in lab,red,red)){:is(.\\*\\:bg-linear-80>*){--tw-gradient-position:80deg in oklab}}:is(.\\*\\:bg-linear-80>*){background-image:linear-gradient(var(--tw-gradient-stops))}:is(.\\*\\:from-white\\/10>*){--tw-gradient-from:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:is(.\\*\\:from-white\\/10>*){--tw-gradient-from:color-mix(in oklab,var(--color-white)10%,transparent)}}:is(.\\*\\:from-white\\/10>*){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}:is(.\\*\\:via-transparent>*){--tw-gradient-via:transparent;--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}:is(.\\*\\:to-black\\/10>*){--tw-gradient-to:#0000001a}@supports (color:color-mix(in lab,red,red)){:is(.\\*\\:to-black\\/10>*){--tw-gradient-to:color-mix(in oklab,var(--color-black)10%,transparent)}}:is(.\\*\\:to-black\\/10>*){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}:is(.\\*\\:\\[grid-area\\:1\\/1\\]>*){grid-area:1/1}@media(hover:hover){.group-hover\\:scale-110:is(:where(.group):hover *){--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-hover\\:\\[transform\\:scaleY\\(\\.4\\)\\]:is(:where(.group):hover *){transform:scaleY(.4)}.group-hover\\:text-base-content:is(:where(.group):hover *){color:var(--color-base-content)}.group-hover\\:opacity-0:is(:where(.group):hover *){opacity:0}.group-hover\\:opacity-30:is(:where(.group):hover *){opacity:.3}.group-hover\\:duration-800:is(:where(.group):hover *){--tw-duration:.8s;transition-duration:.8s}}.peer-checked\\:bg-secondary:is(:where(.peer):checked~*){background-color:var(--color-secondary)}.peer-checked\\:text-secondary-content:is(:where(.peer):checked~*){color:var(--color-secondary-content)}.checked\\:border-blue-600:checked{border-color:var(--color-blue-600)}.checked\\:border-blue-800:checked{border-color:var(--color-blue-800)}.checked\\:border-orange-500:checked{border-color:var(--color-orange-500)}.checked\\:border-red-600:checked{border-color:var(--color-red-600)}.checked\\:border-yellow-400:checked{border-color:var(--color-yellow-400)}.checked\\:bg-blue-200:checked{background-color:var(--color-blue-200)}.checked\\:bg-blue-300:checked{background-color:var(--color-blue-300)}.checked\\:bg-orange-400:checked{background-color:var(--color-orange-400)}.checked\\:bg-red-200:checked{background-color:var(--color-red-200)}.checked\\:bg-yellow-100:checked{background-color:var(--color-yellow-100)}.checked\\:text-blue-600:checked{color:var(--color-blue-600)}.checked\\:text-neutral-content\\!:checked{color:var(--color-neutral-content)!important}.checked\\:text-orange-800:checked{color:var(--color-orange-800)}.checked\\:text-red-600:checked{color:var(--color-red-600)}.checked\\:text-yellow-600:checked{color:var(--color-yellow-600)}.checked\\:\\[--tglbg\\:var\\(--color-blue-900\\)\\]:checked{--tglbg:var(--color-blue-900)}@media(hover:hover){.hover\\:-translate-y-1:hover{--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.hover\\:bg-base-300:hover{background-color:var(--color-base-300)}.hover\\:bg-gray-900:hover{background-color:var(--color-gray-900)}.hover\\:text-primary:hover{color:var(--color-primary)}.hover\\:text-secondary:hover{color:var(--color-secondary)}.hover\\:underline:hover{text-decoration-line:underline}@layer daisyui.modifier{.hover\\:swap-active:hover .swap-off{opacity:0}.hover\\:swap-active:hover .swap-on{opacity:1}}.hover\\:opacity-80:hover{opacity:.8}.hover\\:opacity-100:hover{opacity:1}.hover\\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\\:-translate-y-0\\.5:focus{--tw-translate-y:calc(var(--spacing)*-.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.focus\\:bg-secondary:focus{background-color:var(--color-secondary)}.focus\\:text-secondary-content:focus{color:var(--color-secondary-content)}.focus\\:shadow-sm:focus{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media not all and (min-width:64rem){.max-lg\\:z-1002{z-index:1002}}@media not all and (min-width:48rem){@layer daisyui.modifier{.max-md\\:timeline-compact{--timeline-row-start:0}.max-md\\:timeline-compact .timeline-start{grid-area:3/1/4/4;place-self:flex-start center}.max-md\\:timeline-compact li:has(.timeline-start) .timeline-end{grid-row-start:auto;grid-column-start:none}.max-md\\:timeline-compact.timeline-vertical>li{--timeline-col-start:0}.max-md\\:timeline-compact.timeline-vertical .timeline-start{grid-area:1/3/4/4;place-self:center flex-start}.max-md\\:timeline-compact.timeline-vertical li:has(.timeline-start) .timeline-end{grid-row-start:none;grid-column-start:auto}}}@media not all and (min-width:40rem){@layer daisyui.modifier{.max-sm\\:tabs-sm{--tab-height:calc(var(--size-field,.25rem)*8)}.max-sm\\:tabs-sm>.tab{--tab-p:.5rem;--tab-radius-min:calc(.5rem - var(--border));font-size:.875rem}}}@media(min-width:40rem){@layer daisyui.modifier{.sm\\:modal-middle{place-items:center}.sm\\:modal-middle .modal-box{--modal-tl:var(--radius-box);--modal-tr:var(--radius-box);--modal-bl:var(--radius-box);--modal-br:var(--radius-box);width:91.6667%;max-width:32rem;height:auto;max-height:calc(100vh - 5em);translate:0 2%;scale:98%}.sm\\:alert-horizontal{text-align:start;grid-template-columns:auto;grid-auto-flow:column;justify-content:start;justify-items:start}.sm\\:alert-horizontal:has(:nth-child(2)){grid-template-columns:auto minmax(auto,1fr)}.sm\\:footer-horizontal{grid-auto-flow:column}.sm\\:footer-horizontal.footer-center{grid-auto-flow:dense}.sm\\:tabs-md{--tab-height:calc(var(--size-field,.25rem)*10)}.sm\\:tabs-md>.tab{--tab-p:.75rem;--tab-radius-min:calc(.75rem - var(--border));font-size:.875rem}.sm\\:btn-sm{--fontsize:.75rem;--btn-p:.75rem;--size:calc(var(--size-field,.25rem)*8)}.sm\\:indicator-middle{--indicator-t:50%;--indicator-b:50%;--indicator-y:-50%}}.sm\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media(min-width:48rem){.md\\:join-horizontal{flex-direction:row}.md\\:join-horizontal>.join-item:first-child,.md\\:join-horizontal :first-child:not(:last-child) .join-item{--join-ss:var(--radius-field);--join-se:0;--join-es:var(--radius-field);--join-ee:0}.md\\:join-horizontal>.join-item:last-child,.md\\:join-horizontal :last-child:not(:first-child) .join-item{--join-ss:0;--join-se:var(--radius-field);--join-es:0;--join-ee:var(--radius-field)}.md\\:join-horizontal>.join-item:only-child,.md\\:join-horizontal :only-child .join-item{--join-ss:var(--radius-field);--join-se:var(--radius-field);--join-es:var(--radius-field);--join-ee:var(--radius-field)}.md\\:join-horizontal .join-item:where(:not(:first-child)){margin-block-start:0;margin-inline-start:calc(var(--border,1px)*-1)}.md\\:mb-10{margin-bottom:calc(var(--spacing)*10)}.md\\:w-52{width:calc(var(--spacing)*52)}.md\\:w-80{width:calc(var(--spacing)*80)}.md\\:w-auto{width:auto}@layer daisyui.modifier{.md\\:footer-horizontal{grid-auto-flow:column}.md\\:footer-horizontal.footer-center{grid-auto-flow:dense}.md\\:btn-md{--fontsize:.875rem;--btn-p:1rem;--size:calc(var(--size-field,.25rem)*10)}.md\\:indicator-bottom{--indicator-t:auto;--indicator-b:0;--indicator-y:50%}}.md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\\:place-self-center{place-self:center}.md\\:justify-self-end{justify-self:flex-end}.md\\:text-end{text-align:end}}@media(min-width:64rem){@layer daisyui.modifier.drawer{.lg\\:drawer-open>.drawer-toggle:checked~.drawer-side{scrollbar-color:revert-layer}:root:has(.lg\\:drawer-open>.drawer-toggle:checked){--page-overflow:revert-layer;--page-scroll-gutter:revert-layer;--page-scroll-bg:revert-layer;--page-scroll-transition:revert-layer;--page-has-backdrop:revert-layer;animation:revert-layer;animation-timeline:revert-layer}}@layer daisyui.modifier{.lg\\:drawer-open>.drawer-side{overflow-y:auto}.lg\\:drawer-open>.drawer-toggle{display:none}.lg\\:drawer-open>.drawer-toggle~.drawer-side{pointer-events:auto;visibility:visible;overscroll-behavior:auto;opacity:1;width:auto;display:block;position:sticky}.lg\\:drawer-open>.drawer-toggle~.drawer-side>.drawer-overlay{cursor:default;background-color:#0000}.lg\\:drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay),[dir=rtl] :is(.lg\\:drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay)){translate:0%}.lg\\:drawer-open>.drawer-toggle:checked~.drawer-side{pointer-events:auto;visibility:visible}.lg\\:tooltip>.tooltip-content,.lg\\:tooltip[data-tip]:before{transform:translate(-50%)translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-off)50%}.lg\\:tooltip:after{transform:translate(-50%)translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-tail)50%}.lg\\:menu-horizontal{flex-direction:row;display:inline-flex}.lg\\:menu-horizontal>li:not(.menu-title)>details>ul{margin-inline-start:0;margin-top:1rem;padding-block:.5rem;padding-inline-end:.5rem;position:absolute}.lg\\:menu-horizontal>li>details>ul:before{--tw-content:none;content:var(--tw-content)}:where(.lg\\:menu-horizontal>li:not(.menu-title)>details>ul){border-radius:var(--radius-box);background-color:var(--color-base-100);box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a}.lg\\:timeline-horizontal{flex-direction:row}.lg\\:timeline-horizontal>li{align-items:center}.lg\\:timeline-horizontal>li>hr{width:100%;height:.25rem}.lg\\:timeline-horizontal>li>hr:first-child{grid-row-start:2;grid-column-start:1}.lg\\:timeline-horizontal>li>hr:last-child{grid-area:2/3/auto/none}.lg\\:timeline-horizontal .timeline-start{grid-area:1/1/2/4;place-self:flex-end center}.lg\\:timeline-horizontal .timeline-end{grid-area:3/1/4/4;place-self:flex-start center}.lg\\:timeline-horizontal:has(.timeline-middle)>li>hr:first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.lg\\:timeline-horizontal:has(.timeline-middle)>li>hr:last-child,.lg\\:timeline-horizontal:not(:has(.timeline-middle)) :first-child>hr:last-child{border-start-start-radius:var(--radius-selector);border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:var(--radius-selector)}.lg\\:timeline-horizontal:not(:has(.timeline-middle)) :last-child>hr:first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.lg\\:steps-horizontal{grid-auto-columns:1fr;grid-auto-flow:column;display:inline-grid;overflow:auto hidden}.lg\\:steps-horizontal .step{text-align:center;grid-template-rows:40px 1fr;grid-template-columns:auto;place-items:center;min-width:4rem;display:grid}.lg\\:steps-horizontal .step:before{width:100%;height:.5rem;margin-inline-start:-100%;translate:0}[dir=rtl] :is(.lg\\:steps-horizontal .step):before{translate:0}.lg\\:card-side{flex-direction:row;align-items:stretch}.lg\\:card-side :where(figure:first-child){border-start-start-radius:inherit;border-start-end-radius:unset;border-end-end-radius:unset;border-end-start-radius:inherit;overflow:hidden}.lg\\:card-side :where(figure:last-child){border-start-start-radius:unset;border-start-end-radius:inherit;border-end-end-radius:inherit;border-end-start-radius:unset;overflow:hidden}.lg\\:card-side figure>*{max-width:unset}.lg\\:card-side :where(figure>*){object-fit:cover;width:100%;height:100%}.lg\\:divider-horizontal{--divider-m:0 1rem}.lg\\:divider-horizontal.divider{flex-direction:column;width:1rem;height:auto}.lg\\:divider-horizontal.divider:before,.lg\\:divider-horizontal.divider:after{width:.125rem;height:100%}.lg\\:stats-horizontal{grid-auto-flow:column;overflow-x:auto}.lg\\:stats-horizontal .stat:not(:last-child){border-inline-end:var(--border)dashed currentColor}@supports (color:color-mix(in lab,red,red)){.lg\\:stats-horizontal .stat:not(:last-child){border-inline-end:var(--border)dashed color-mix(in oklab,currentColor 10%,#0000)}}.lg\\:stats-horizontal .stat:not(:last-child){border-block-end:none}.lg\\:indicator-center{--indicator-s:50%;--indicator-e:50%;--indicator-x:-50%}[dir=rtl] .lg\\:indicator-center{--indicator-x:50%}.lg\\:btn-lg{--fontsize:1.125rem;--btn-p:1.25rem;--size:calc(var(--size-field,.25rem)*12)}}@layer daisyui.component{.lg\\:tooltip{--tt-bg:var(--color-neutral);--tt-off: calc(100% + .5rem) ;--tt-tail: calc(100% + 1px + .25rem) ;display:inline-block;position:relative}.lg\\:tooltip>.tooltip-content,.lg\\:tooltip[data-tip]:before{border-radius:var(--radius-field);text-align:center;white-space:normal;max-width:20rem;color:var(--color-neutral-content);opacity:0;background-color:var(--tt-bg);pointer-events:none;z-index:2;--tw-content:attr(data-tip);content:var(--tw-content);width:max-content;padding-block:.25rem;padding-inline:.5rem;font-size:.875rem;line-height:1.25;position:absolute}@media(prefers-reduced-motion:no-preference){.lg\\:tooltip>.tooltip-content,.lg\\:tooltip[data-tip]:before,.lg\\:tooltip:after{transition:opacity .2s cubic-bezier(.4,0,.2,1) 75ms,transform .2s cubic-bezier(.4,0,.2,1) 75ms}}.lg\\:tooltip:after{opacity:0;background-color:var(--tt-bg);content:"";pointer-events:none;--mask-tooltip:url("data:image/svg+xml,%3Csvg width='10' height='4' viewBox='0 0 8 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.500009 1C3.5 1 3.00001 4 5.00001 4C7 4 6.5 1 9.5 1C10 1 10 0.499897 10 0H0C-1.99338e-08 0.5 0 1 0.500009 1Z' fill='black'/%3E%3C/svg%3E%0A");width:.625rem;height:.25rem;-webkit-mask-position:-1px 0;mask-position:-1px 0;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-image:var(--mask-tooltip);mask-image:var(--mask-tooltip);display:block;position:absolute}:is(.lg\\:tooltip.tooltip-open,.lg\\:tooltip[data-tip]:not([data-tip=""]):hover,.lg\\:tooltip:not(:has(.tooltip-content:empty)):has(.tooltip-content):hover,.lg\\:tooltip[data-tip]:not([data-tip=""]):has(:focus-visible))>.tooltip-content,:is(.lg\\:tooltip.tooltip-open,.lg\\:tooltip[data-tip]:not([data-tip=""]):hover,.lg\\:tooltip:not(:has(.tooltip-content:empty)):has(.tooltip-content):hover,.lg\\:tooltip[data-tip]:not([data-tip=""]):has(:focus-visible))[data-tip]:before,:is(.lg\\:tooltip.tooltip-open,.lg\\:tooltip[data-tip]:not([data-tip=""]):hover,.lg\\:tooltip:not(:has(.tooltip-content:empty)):has(.tooltip-content):hover,.lg\\:tooltip[data-tip]:not([data-tip=""]):has(:focus-visible)):after{opacity:1;--tt-pos:0rem}@media(prefers-reduced-motion:no-preference){:is(.lg\\:tooltip.tooltip-open,.lg\\:tooltip[data-tip]:not([data-tip=""]):hover,.lg\\:tooltip:not(:has(.tooltip-content:empty)):has(.tooltip-content):hover,.lg\\:tooltip[data-tip]:not([data-tip=""]):has(:focus-visible))>.tooltip-content,:is(.lg\\:tooltip.tooltip-open,.lg\\:tooltip[data-tip]:not([data-tip=""]):hover,.lg\\:tooltip:not(:has(.tooltip-content:empty)):has(.tooltip-content):hover,.lg\\:tooltip[data-tip]:not([data-tip=""]):has(:focus-visible))[data-tip]:before,:is(.lg\\:tooltip.tooltip-open,.lg\\:tooltip[data-tip]:not([data-tip=""]):hover,.lg\\:tooltip:not(:has(.tooltip-content:empty)):has(.tooltip-content):hover,.lg\\:tooltip[data-tip]:not([data-tip=""]):has(:focus-visible)):after{transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1)}}}.lg\\:mx-10{margin-inline:calc(var(--spacing)*10)}.lg\\:-my-6{margin-block:calc(var(--spacing)*-6)}.lg\\:join-horizontal{flex-direction:row}.lg\\:join-horizontal>.join-item:first-child,.lg\\:join-horizontal :first-child:not(:last-child) .join-item{--join-ss:var(--radius-field);--join-se:0;--join-es:var(--radius-field);--join-ee:0}.lg\\:join-horizontal>.join-item:last-child,.lg\\:join-horizontal :last-child:not(:first-child) .join-item{--join-ss:0;--join-se:var(--radius-field);--join-es:0;--join-ee:var(--radius-field)}.lg\\:join-horizontal>.join-item:only-child,.lg\\:join-horizontal :only-child .join-item{--join-ss:var(--radius-field);--join-se:var(--radius-field);--join-es:var(--radius-field);--join-ee:var(--radius-field)}.lg\\:join-horizontal .join-item:where(:not(:first-child)){margin-block-start:0;margin-inline-start:calc(var(--border,1px)*-1)}.lg\\:mb-10{margin-bottom:calc(var(--spacing)*10)}.lg\\:mb-64{margin-bottom:calc(var(--spacing)*64)}.lg\\:block{display:block}.lg\\:flex{display:flex}.lg\\:grid{display:grid}.lg\\:hidden{display:none}.lg\\:w-52{width:calc(var(--spacing)*52)}.lg\\:min-w-max{min-width:max-content}.lg\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\\:flex-row{flex-direction:row}.lg\\:flex-row-reverse{flex-direction:row-reverse}.lg\\:gap-10{gap:calc(var(--spacing)*10)}.lg\\:gap-x-6{column-gap:calc(var(--spacing)*6)}.lg\\:p-10{padding:calc(var(--spacing)*10)}.lg\\:py-16{padding-block:calc(var(--spacing)*16)}.lg\\:ps-6{padding-inline-start:calc(var(--spacing)*6)}.lg\\:pe-16{padding-inline-end:calc(var(--spacing)*16)}.lg\\:text-left{text-align:left}.lg\\:text-9xl{font-size:var(--text-9xl);line-height:var(--tw-leading,var(--text-9xl--line-height))}}@media(min-width:80rem){@layer daisyui.modifier{.xl\\:menu-horizontal{flex-direction:row;display:inline-flex}.xl\\:menu-horizontal>li:not(.menu-title)>details>ul{margin-inline-start:0;margin-top:1rem;padding-block:.5rem;padding-inline-end:.5rem;position:absolute}.xl\\:menu-horizontal>li>details>ul:before{--tw-content:none;content:var(--tw-content)}:where(.xl\\:menu-horizontal>li:not(.menu-title)>details>ul){border-radius:var(--radius-box);background-color:var(--color-base-100);box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a}.xl\\:indicator-end{--indicator-s:auto;--indicator-e:0;--indicator-x:50%}[dir=rtl] .xl\\:indicator-end{--indicator-s:0;--indicator-e:auto;--indicator-x:-50%}.xl\\:btn-xl{--fontsize:1.375rem;--btn-p:1.5rem;--size:calc(var(--size-field,.25rem)*14)}}.xl\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(prefers-color-scheme:dark){.dark\\:p-10{padding:calc(var(--spacing)*10)}.dark\\:p-20{padding:calc(var(--spacing)*20)}}.\\[\\&_img\\]\\:size-16 img{width:calc(var(--spacing)*16);height:calc(var(--spacing)*16)}.\\[\\&_li\\>\\*\\]\\:rounded-none li>*{border-radius:0}.\\[\\&_svg\\]\\:visible svg{visibility:visible}.\\[\\&_svg\\]\\:size-16 svg{width:calc(var(--spacing)*16);height:calc(var(--spacing)*16)}}:host{font-family:Fira Code,monospace}@keyframes rating{0%,40%{filter:brightness(1.05)contrast(1.05);scale:1.1}}@keyframes dropdown{0%{opacity:0}}@keyframes radio{0%{padding:5px}50%{padding:3px}}@keyframes toast{0%{opacity:0;scale:.9}to{opacity:1;scale:1}}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}@keyframes progress{50%{background-position-x:-115%}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-text-shadow-color{syntax:"*";inherits:false}@property --tw-text-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}`;
let mountPromise = null;
let isMounted = false;
async function mountApp() {
if (isMounted) {
return Promise.resolve();
}
if (mountPromise) {
return mountPromise;
}
mountPromise = (async () => {
if (isMounted) {
return;
}
if (!document.getElementById("tubeinsights-font")) {
const link = document.createElement("link");
link.id = "tubeinsights-font";
link.rel = "stylesheet";
link.href = "https://fonts.googleapis.com/css2?family=Fira+Code:wght@300;400;500;600;700&display=swap";
document.head.appendChild(link);
}
const savedTheme = await storage.get(
"tubeinsights-theme",
currentTheme.value
);
currentTheme.value = savedTheme;
const savedPanelVisible = await storage.get(
"tubeinsights-panelVisible",
isPanelVisible.value.toString()
);
isPanelVisible.value = savedPanelVisible === "true";
const savedTab = await storage.get("tubeinsights-activeTab", "insights");
if (savedTab === "insights" || savedTab === "livecount" || savedTab === "bookmark" || savedTab === "ddl" || savedTab === "settings") {
const { activeTab: activeTab2 } = await __vitePreload(async () => {
const { activeTab: activeTab3 } = await Promise.resolve().then(() => index);
return { activeTab: activeTab3 };
}, void 0 );
activeTab2.value = savedTab;
}
const rootId = "tubeinsights-root";
const existingRoots = document.querySelectorAll(`#${rootId}`);
if (existingRoots.length > 1) {
existingRoots.forEach((el, index2) => {
if (index2 > 0) {
el.remove();
}
});
}
let root = document.getElementById(rootId);
if (!root) {
root = document.createElement("div");
root.id = rootId;
document.body.append(root);
}
let shadowRoot = root.shadowRoot;
if (!shadowRoot) {
shadowRoot = root.attachShadow({ mode: "open" });
try {
shadowRoot.adoptedStyleSheets = prepareStyles();
} catch (e) {
const styleElement = document.createElement("style");
styleElement.textContent = styles.replace(/:root/gu, ":host");
shadowRoot.appendChild(styleElement);
}
}
if (!isMounted) {
preact.render( u(App, {}), shadowRoot);
isMounted = true;
setTimeout(() => {
initVideoModules();
}, 500);
}
})();
try {
await mountPromise;
} finally {
mountPromise = null;
}
}
function prepareStyles() {
const shadowSheet = new CSSStyleSheet();
shadowSheet.replaceSync(styles.replace(/:root/gu, ":host"));
return [shadowSheet];
}
if (window.location.href.startsWith("https://www.youtube.com")) {
const isLiveChat = window.location.pathname.startsWith("/live_chat");
const isInIframe = window.self !== window.top;
if (!isLiveChat && !isInIframe) {
const scheduleMount = () => {
if (!document.body) {
requestAnimationFrame(scheduleMount);
return;
}
requestAnimationFrame(() => {
setTimeout(() => {
void mountApp();
}, 150);
});
};
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", scheduleMount);
} else {
scheduleMount();
}
}
}
})(preact, preactSignals, preactHooks, dayjs, CryptoJS);