- 集成 tauri-plugin-opener:Cargo/lib.rs/capabilities/npm 四处接线,新增 src/openExternal.ts(桌面走 opener,浏览器回退 window.open,相对路径绝对化) - 关于页 4 个链接、活动栏官网菜单、代理错误横幅 2 处健康检查链接全部改走 openExternal,桌面端可正常跳转 - 设置→外观 主题顺序调整为 深色/浅色/跟随系统 - release 二进制重编并验证(浏览器实测关于页链接可开文档页) - 附带工作区中未提交的扁平化重构现状(另一会话进行中) - homepage 落地页与文档终检通过(8787 / 与 /docs 双 200)
24 lines
891 B
TypeScript
24 lines
891 B
TypeScript
import type { ButtonHTMLAttributes, ReactNode } from "react";
|
|
import { cx } from "./common";
|
|
|
|
export function Button({
|
|
variant = "secondary", busy = false, disabled, className, children, ...props
|
|
}: ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
variant?: "primary" | "secondary" | "ghost" | "danger";
|
|
busy?: boolean;
|
|
}) {
|
|
return <button {...props} type={props.type ?? "button"}
|
|
className={cx("ops-btn", `ops-btn-${variant}`, className)}
|
|
disabled={disabled || busy} aria-busy={busy || undefined}>
|
|
{busy && <span className="ops-spinner" aria-hidden="true" />}
|
|
{children}
|
|
</button>;
|
|
}
|
|
|
|
export function EmptyState({ title, children }: { title: string; children?: ReactNode }) {
|
|
return <div className="ops-empty-state" role="status">
|
|
<div className="ops-dim font-semibold">{title}</div>
|
|
{children && <div className="ops-faint mt-1">{children}</div>}
|
|
</div>;
|
|
}
|