relax-life-kit
Version:
548 lines (529 loc) • 19.9 kB
JavaScript
import { h as m, ref as p, computed as W, watch as H, createElementBlock as C, openBlock as I, createElementVNode as i, createCommentVNode as G, normalizeClass as q, toDisplayString as Y, withModifiers as N, createStaticVNode as S, normalizeStyle as U, createBlock as D, resolveDynamicComponent as _, unref as K } from "vue";
const J = (e = !1) => new Promise((n) => {
let s = 0;
const t = e ? 3 : 1, c = (o) => {
o && o.parentNode && o.parentNode.removeChild(o), s++, s === t && n();
};
if (e) {
const o = (l) => {
const f = document.createElement("div");
f.className = `ink-ripple-global ink-ripple-global-${l}`, document.body.appendChild(f), f.addEventListener("animationend", () => c(f), { once: !0 });
};
for (let l = 0; l < t; l++)
l === 0 ? o(l) : setTimeout(() => {
o(l);
}, 100 * l);
} else {
const o = document.createElement("div");
o.className = "ink-ripple-global ink-ripple-global-0", document.body.appendChild(o), o.addEventListener("animationend", () => c(o), { once: !0 });
}
}), $ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAHCCAYAAABVM/SHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAOdElEQVR42u3dW4xdc//H8e9Qpk4tktJSRSo0paoOLVIGJVIiiFNVHG6ElOqFhKStuEEIEUEcEwRBUC6ahqCClDpcNI0QF0qlVa2Kdjp6Np3noun+m2dmWv48kk/363W191prrzXZa/ruXmv/1pqWX3/9tasAAuziLQBSCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBY9rFu3rubOnVtz586tJUuW/KPr/vDDD2vs2LE1bty4WrBgwZ96zZtvvlljx46tU045pRYvXmwHNbF+3gL+248//liXXXZZVVW9/vrrdcghh/xj6/7tt9/q22+/raqqkSNH/qnXrF69ur799tsaMGBAHXbYYXZQE/MJq8k8+OCDNXHixJo8eXJt3rx5h8sPGjSoz3kTJkyo0aNH15133umN5V8hWE1m0aJF9dlnn9X69etrt912+1vrWrp0aS1ZsqQGDx7sjeVf4ZCQ/6nXXnut7r///sbztWvXNh6PHz++Wlpaqqpq1KhRNX369Lryyit7rKO9vb2qth5Ojh07ttftzJ8/v3bddVdv+E5OsJrUvHnzaujQob3O6+rqajw+99xza5ddev8gvn79+h1uZ9v5p94sWrSo8XjgwIG1adOmPpetqtqyZUuf8//4M7PzEqwm1dnZWevWrdvhchs2bPhb2znjjDPq0Ucf7XXexo0b68svv6wTTjihBg0aVAcddFCvy86bN69eeeWV6t+/fz3wwAO9rsunq+bQ8uuvv/qvqYl8/fXX9dNPP/2j6zzyyCO3+03ip59+Wvfcc091dnbWnDlzGtPfeeedmjRpUu2///715JNP1oQJE3p9/bPPPlu33nprDRgwwLCGJucTVpMZOXLknx5O8E858MADa968eVVV9c0339SIESOqamuwqqqGDBnSZ6zgjwSryVx++eW1dOnS7S5z2GGH1UsvvVRVVStXrqwLL7xwh+udOXNmnXfeeb3OO/zww2v06NG1cOHCmj17do0YMaI2b95cs2fPrqqqSy+9tLHs3Llz64477uj2+tWrV1fV1pPup556ao/133vvvXX66afbuU1AsJrMokWL6vvvv9/uMr///nvj8ebNm+ubb77Z4Xq3RaUvbW1ttXDhwvr888+rqurtt9+ulStXVmtra7dvBtvb2/vc3pYtW3qd19HRYcc2CcFqUvPnz+/xLeHixYvrtNNO63X5wYMH1xdffNFj+m233VYvv/zyDrd35pln1sKFC6utra2qtp4kHzduXI0ZM6YOOOCAXl+z7bKgF154oaZPn14DBgyor776qqq2nrA/4ogj7MgmI1hNao899qi99tqrx7S+tLS09Fi+avvfzrW3t9cTTzzReH7yySfX2rVr67777quqrd8gVlXj+XHHHdft9du219ra2mNav35+dZuRvc7/THt7eyNGf8Z1111X48eP98bRJ8FqUhMmTOgxIHTLli19Lr9ixYo66qijekzf3vmj1tbWHp+a2tvbG+fQRo8e3RjpXlX/6EXW7JwEq0l1dHR0i0XV9keLb9mypdasWdNj+h9P0P+3Aw88sN5///1u0+bMmVNXX311VW098f7Hw72qqjfeeKPxeMiQIVW1dZBrVdWaNWsa02hOgtWkPv/88xo2bFi3ad99912deOKJvS4/ZMiQxgnvP7rlllvqxRdf/Md+rv79+/e4Q8T69evrt99+q6qqPffcs8f5q/79+9uhTUKw+Nd0dnZ2u/h51qxZtWrVqlq+fHmtWLGiDjnkkLrjjju6jedau3ZtnXPOOY3hDOPHj6/nnnuux6dDmoNgNan169d3i8e2aX3p6urqsXzV/x2u9eX888+vZcuW1apVq6qjo6PbYefNN9/cbdmzzjqrxzanTJnSbezV7Nmza+bMmXX33XfbiU1IsJrUKaec8peWX758+f/rpPjq1avrhx9+aDxvbW2tjRs3VlXVpEmTatiwYTV06NAaOnRot3FVv//+e910002N0fDbXrvPPvvU448/Xh0dHfXggw8a3tBk7O0ms+0ODcOHD+9xA7/Nmzd3u+VLt1+Ufv16Hai5fPny7Y5ynzhxYs2YMaOGDRtWhx56aH344Yd1zTXXVFXVww8/3Gtw2tvb64Ybbqh33nmndt999zr33HNr9uzZ1draWk8//XRdeuml9eKLL9bixYvrscce6/M2Oex8BKvJbPum78033+zxD723k+7blj/ggAPqk08+6bG+HZ10nzlzZrfny5cvr6qt97/qLVYfffRRTZkypZYtW1b9+vWrJ554olatWtX4pNXW1laPPPJITZ06tebNm1fjx4+vGTNm1LXXXlu77767HbyTc4vkJrJ06dLGear99tvvT71m25ipgQMH/u3td3V11euvv15VVWPGjOk2b9GiRXX99dfXxRdfXMuWLau99967Xn755brooot6rGfSpEn1zDPP1F577VVr1qyp22+/vU466aTGN4nsvASriXz88cdVtfXTUm+X2fTm3Xffrar629ftdXZ21owZMxoXP0+ePLkxb8GCBXXyySfXrFmzqqurq0aPHl3vvffedm85c8EFF9QHH3xQxx9/fFVVHXzwwbX33nvbyTs5h4RNoqurq5566qmqqjr77LP7XKaqGkMGVqxYUa+88kpVbb1V8vZe05eOjo5666236pFHHmmM42pra6tLLrmkscyxxx5bgwcPrtWrV9e0adNq2rRpf+oPZAwfPrzefffdevXVV2vfffe1k5uAYDWJhx56qBYsWFAtLS114403dps3ffr0mjNnTuNwcf/996+qqqlTp9aGDRtqyJAh3QJTVTVu3LjasGFDrVixoqr6vnD6+eef73Z/q7POOqvHOKpdd921Hn300Ro5cuR2/6xYb1paWuqKK66wg5uEQ8ImMXny5Bo+fHjdcMMNdcwxx3Sbt+eee9aSJUvql19+qYEDB9aUKVOqquqqq66qfv361V133dXjEprOzs5asmRJbdq0qQ4//PA+L1q+6qqrqn///nX00UfXk08+Wa+99lqvh25tbW1/OVY0H/d0byIrV66sfffd9y/9PcIvv/yyRo0a9be2+/PPP/d5zyv4KwQLiOGQEIghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJiCBYQQ7CAGIIFxBAsIIZgATEEC4ghWEAMwQJi/AcM5esoZxmwJwAAAABJRU5ErkJggg==", ee = (e, n) => {
const s = e.__vccOpts || e;
for (const [t, c] of n)
s[t] = c;
return s;
}, te = { class: "relax-drawer-wrapper" }, ae = { class: "relax-video-container" }, re = {
class: "title-text",
title: "如果遇到加载不出可以换一个"
}, oe = { class: "relax-video" }, le = { class: "relax-video-content" }, ne = {
key: 0,
class: "img"
}, ie = ["src"], se = ["src"], ce = { class: "relax-video-btns" }, de = { class: "modal-footer" }, fe = {
__name: "RelaxDrawer",
props: {
open: {
type: Boolean,
default: !1
},
getRedirectUrlLoading: {
type: Boolean,
default: !1
},
title: {
type: String,
default: "😎 放松一下,劳逸结合"
},
videoApiUrl: {
type: String,
default: "https://api.yujn.cn/api/zzxjj.php?type=video"
}
},
emits: ["update:open", "update:getRedirectUrlLoading"],
setup(e, { expose: n, emit: s }) {
let t;
try {
t = require("ant-design-vue").message;
} catch {
t = {
success: (r) => console.log("Success:", r),
error: (r) => console.error("Error:", r)
};
}
let c;
try {
c = require("@ant-design/icons-vue").HistoryOutlined;
} catch {
c = {
name: "FallbackHistory",
setup() {
return () => m("span", { class: "fallback-history-icon" }, "📜");
}
};
}
const o = e, l = s, f = {
video: [
"mp4",
"avi",
"mov",
"wmv",
"flv",
"webm",
"mkv",
"m4v",
"3gp",
"ogv",
"video"
],
imgs: [
"jpg",
"jpeg",
"png",
"gif",
"webp",
"bmp",
"svg",
"ico"
]
}, w = p(!!(window && window.electron && window.electron.ipcRenderer)), u = p(""), M = p(null), E = p(!1), B = p(!1), V = (a) => {
if (!a) return !1;
const r = a.split("?")[0];
return f.video.some(
(g) => r.toLowerCase().includes(`.${g}`)
);
}, Z = (a) => {
if (!a) return !1;
const r = a.split("?")[0];
return f.imgs.some(
(g) => r.toLowerCase().includes(`.${g}`)
);
}, b = W({
get: () => o.open,
set: (a) => l("update:open", a)
}), v = W({
get: () => o.getRedirectUrlLoading,
set: (a) => l("update:getRedirectUrlLoading", a)
}), z = (a) => {
a.target.src = $;
}, k = async () => {
try {
return w.value ? (await fetch(o.videoApiUrl, { method: "GET" })).url : o.videoApiUrl;
} catch (a) {
return console.error("fetch error:", a), "";
}
}, R = async () => {
v.value = !0, u.value = await k(), v.value = !1, b.value = !0;
}, F = () => {
b.value = !1;
}, O = async () => {
v.value = !0, u.value = await k(), v.value = !1;
}, j = async () => {
let a = "", r = "", g = V(u.value), L = Z(u.value);
const T = (d, x) => {
try {
let A = new URL(d, window.location.origin).pathname, h = A.substring(A.lastIndexOf("/") + 1);
return (!h || !/\.[a-zA-Z0-9]+$/.test(h)) && (h = `relax_${Date.now()}.${x}`), decodeURIComponent(h);
} catch {
return `relax_${Date.now()}.${x}`;
}
};
try {
if (v.value = !0, g) {
const d = M.value;
if (!d) {
t.error("未找到视频元素");
return;
}
a = d.currentSrc, r = T(a, "mp4");
} else if (L)
a = u.value, r = T(a, "jpg");
else {
t.error("暂不支持的媒体类型");
return;
}
if (w.value) {
const d = await fetch(a);
if (!d.ok) throw new Error("下载失败");
const Q = await (await d.blob()).arrayBuffer(), A = await window.electron.ipcRenderer.invoke(
"save-video-buffer",
{
buffer: Array.from(new Uint8Array(Q)),
fileName: r
// 兼容主进程可选参数
}
);
A.success ? t.success("下载成功!") : t.error(A.error);
} else {
const d = await fetch(a, { mode: "cors" });
if (!d.ok) throw new Error("下载失败");
const x = await d.blob(), Q = window.URL.createObjectURL(x), A = document.createElement("a");
A.href = Q, A.download = r, document.body.appendChild(A), A.click(), setTimeout(() => {
window.URL.revokeObjectURL(Q), document.body.removeChild(A);
}, 100), t.success("下载成功!");
}
} catch (d) {
t.error(d.message || "保存失败");
} finally {
v.value = !1;
}
}, P = async () => {
if (!B.value) {
if (typeof J == "function") {
B.value = !0;
const a = Math.random() > 0.3;
await J(a), B.value = !1;
}
E.value = !0;
}
};
return H(
() => b.value,
async (a) => {
a && (u.value = await k());
}
), n({
handleOpenRelax: R
}), (a, r) => (I(), C("div", null, [
i("div", te, [
b.value ? (I(), C("div", {
key: 0,
class: "relax-drawer-overlay",
onClick: F
})) : G("", !0),
i("div", {
class: q(["relax-drawer-content", { open: b.value }])
}, [
i("div", ae, [
i("div", {
class: "relax-video-title",
onClick: P
}, [
i("span", re, Y(e.title), 1),
r[4] || (r[4] = i("span", {
class: "history-icon",
title: "历史记录"
}, "📜", -1))
]),
r[5] || (r[5] = i("hr", { class: "relax-divider" }, null, -1)),
i("div", oe, [
i("div", le, [
Z(u.value) ? (I(), C("div", ne, [
i("img", {
src: u.value,
alt: "放松一下",
onError: z
}, null, 40, ie)
])) : (I(), C("video", {
key: 1,
ref_key: "relaxVideoRef",
ref: M,
src: u.value,
autoplay: "",
muted: "",
loop: "",
controls: ""
}, null, 8, se))
]),
i("div", ce, [
i("button", {
class: "relax-btn primary",
onClick: O
}, " 换一个 "),
i("button", {
class: q(["relax-btn primary", { loading: v.value }]),
onClick: j
}, " 保存 ", 2),
i("button", {
class: "relax-btn",
onClick: F
}, "关闭")
])
])
])
], 2),
E.value ? (I(), C("div", {
key: 1,
class: "relax-modal-overlay",
onClick: r[3] || (r[3] = (g) => E.value = !1)
}, [
i("div", {
class: "relax-modal-content",
onClick: r[2] || (r[2] = N(() => {
}, ["stop"]))
}, [
r[6] || (r[6] = S('<div class="modal-header" data-v-f9c50557><h3 data-v-f9c50557>往昔如镜 照影不照形</h3></div><div class="modal-body" data-v-f9c50557><p data-v-f9c50557>镜中影可暂观却不可触摸,执着于追溯形骸不如把握当下神韵</p><p data-v-f9c50557>来路无可眷恋,期待唯有远方</p><p data-v-f9c50557>你的人生中会有人</p><p data-v-f9c50557>想要阻止你拖累你</p><p data-v-f9c50557>但别让他们得逞</p><p data-v-f9c50557>不要停止奔跑 不要回顾来路</p><p data-v-f9c50557>值得期待的只有远方</p><p data-v-f9c50557>👋✨✨✨</p></div>', 2)),
i("div", de, [
i("button", {
class: "relax-btn",
onClick: r[0] || (r[0] = (g) => E.value = !1)
}, " 再见👋 "),
i("button", {
class: "relax-btn primary",
onClick: r[1] || (r[1] = (g) => E.value = !1)
}, " 好的✨ ")
])
])
])) : G("", !0)
])
]));
}
}, Ce = /* @__PURE__ */ ee(fe, [["__scopeId", "data-v-f9c50557"]]), Ae = ["title"], ue = { key: 1 }, Ee = {
__name: "RelaxButton",
props: {
loading: {
type: Boolean,
default: !1
},
icon: {
type: String,
default: "🧘♀️"
},
title: {
type: String,
default: "放松一下"
},
fontSize: {
type: Number,
default: () => 16
}
},
emits: ["click"],
setup(e, { emit: n }) {
let s;
try {
s = require("@ant-design/icons-vue").LoadingOutlined;
} catch {
s = {
name: "FallbackLoading",
setup() {
return () => m("div", { class: "fallback-loading" }, "⏳");
}
};
}
const t = e, c = n, o = W(() => typeof t.fontSize == "number" ? `${t.fontSize}px` : typeof t.fontSize == "string" && (t.fontSize.includes("px") || t.fontSize.includes("em") || t.fontSize.includes("rem") || t.fontSize.includes("%")) ? t.fontSize : "16px"), l = () => {
t.loading || c("click");
};
return (f, w) => (I(), C("div", {
class: q(["relax-life-kit_relax-button", { loading: e.loading }]),
onClick: l,
title: e.title,
style: U({
fontSize: o.value
})
}, [
e.loading ? (I(), D(_(K(s)), { key: 0 })) : (I(), C("span", ue, Y(e.icon), 1))
], 14, Ae));
}
}, be = () => {
const e = p(!1), n = p(!1);
return {
// 状态
relaxOpen: e,
getRedirectUrlLoading: n,
// 方法
openRelax: () => {
e.value = !0;
},
closeRelax: () => {
e.value = !1;
},
setLoading: (o) => {
n.value = o;
}
};
};
let y = !1, X = {};
const ge = () => {
if (y) return !0;
try {
const e = require("ant-design-vue");
if (e)
return y = !0, X = e, !0;
} catch {
if (typeof window < "u" && window.antd)
return y = !0, X = window.antd, !0;
}
return !1;
}, Ie = (e) => ge() && X[e] || null, xe = (e, n = {}) => ({
name: `Fallback${e}`,
props: Object.keys(n),
setup(s, { slots: t, emit: c }) {
return () => {
const o = Ie(e);
return o ? m(o, s, t) : ve(e, s, t, c);
};
}
}), ve = (e, n, s, t) => {
const o = {
Button: "button",
Tooltip: "div",
Drawer: "div",
Modal: "div",
Image: "img",
Divider: "hr"
}[e] || "div", l = {};
switch (e) {
case "Button":
l.class = "fallback-button", l.onClick = (f) => t("click", f);
break;
case "Tooltip":
l.class = "fallback-tooltip", l.title = n.title;
break;
case "Drawer":
l.class = `fallback-drawer ${n.open ? "open" : ""}`;
break;
case "Modal":
l.class = `fallback-modal ${n.open ? "open" : ""}`;
break;
case "Image":
l.src = n.src, l.alt = n.alt, l.class = "fallback-image";
break;
case "Divider":
l.class = "fallback-divider";
break;
}
return m(o, l, s);
}, Qe = `
.fallback-button {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 4px 15px;
font-size: 14px;
font-weight: 400;
line-height: 1.5715;
border: 1px solid #d9d9d9;
border-radius: 6px;
background: #fff;
cursor: pointer;
transition: all 0.2s;
color: rgba(0, 0, 0, 0.85);
}
.fallback-button:hover {
border-color: #40a9ff;
color: #40a9ff;
}
.fallback-button:active {
border-color: #096dd9;
color: #096dd9;
}
.fallback-button.primary {
background: #1890ff;
border-color: #1890ff;
color: #fff;
}
.fallback-button.primary:hover {
background: #40a9ff;
border-color: #40a9ff;
}
.fallback-drawer {
position: fixed;
top: 0;
right: -600px;
width: 600px;
height: 100vh;
background: #fff;
box-shadow: -2px 0 8px rgba(0, 0, 0, 0.15);
transition: right 0.3s;
z-index: 1000;
overflow-y: auto;
}
.fallback-drawer.open {
right: 0;
}
.fallback-modal {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background: rgba(0, 0, 0, 0.45);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
opacity: 0;
visibility: hidden;
transition: all 0.3s;
}
.fallback-modal.open {
opacity: 1;
visibility: visible;
}
.fallback-modal .modal-content {
background: #fff;
border-radius: 6px;
padding: 24px;
max-width: 520px;
width: 90%;
max-height: 80vh;
overflow-y: auto;
}
.fallback-tooltip {
position: relative;
display: inline-block;
}
.fallback-tooltip:hover::after {
content: attr(title);
position: absolute;
bottom: 100%;
left: 50%;
transform: translateX(-50%);
background: rgba(0, 0, 0, 0.75);
color: #fff;
padding: 4px 8px;
border-radius: 4px;
font-size: 12px;
white-space: nowrap;
z-index: 1000;
}
.fallback-image {
max-width: 100%;
height: auto;
}
.fallback-divider {
border: none;
border-top: 1px solid #f0f0f0;
margin: 16px 0;
}
/* 暗色主题适配 */
.dark-theme .fallback-button {
background: #1f1f1f;
border-color: #434343;
color: #fff;
}
.dark-theme .fallback-button:hover {
border-color: #40a9ff;
color: #40a9ff;
}
.dark-theme .fallback-drawer {
background: #1f1f1f;
color: #fff;
}
.dark-theme .fallback-modal .modal-content {
background: #1f1f1f;
color: #fff;
}
.dark-theme .fallback-divider {
border-top-color: #434343;
}
`;
export {
Ee as RelaxButton,
Ce as RelaxDrawer,
ge as checkAntdAvailability,
xe as createFallbackComponent,
J as createInkRipple,
Qe as fallbackStyles,
Ie as getAntdComponent,
be as useRelax
};