Files
opsxapi/src/components/primitives.tsx
T
logan 2bb4ef7a95 桌面 GUI 外链修复 + 主题顺序调整(含结构扁平化进行中的工作区基线)
- 集成 tauri-plugin-opener:Cargo/lib.rs/capabilities/npm 四处接线,新增 src/openExternal.ts(桌面走 opener,浏览器回退 window.open,相对路径绝对化)
- 关于页 4 个链接、活动栏官网菜单、代理错误横幅 2 处健康检查链接全部改走 openExternal,桌面端可正常跳转
- 设置→外观 主题顺序调整为 深色/浅色/跟随系统
- release 二进制重编并验证(浏览器实测关于页链接可开文档页)
- 附带工作区中未提交的扁平化重构现状(另一会话进行中)
- homepage 落地页与文档终检通过(8787 / 与 /docs 双 200)
2026-10-16 03:03:36 +08:00

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>;
}