visionA 雲端版前端 — 沿用 local-tool 既有 UI(原則 4:先抄 local-tool)+
新增雲端特有的登入 / 配對 / 設定流程,含以下整合階段:
- Phase 0:13 頁 + 30+ 元件 + 雛形 banner
- dashboard / devices / models / workspace / clusters / settings 等頁
- AppShell + Sidebar + Header + tokens + i18n(中英雙語 96 keys)
- API client + 5 stores + 3 hooks
- Phase 0.6:OIDC redirect 改造
- login 頁改為 OIDC redirect(`window.location.href = /api/auth/login`)
- register 改說明頁、account 改唯讀(user 資料來源是 MC)
- api client 改 cookie session(credentials: include)+ 完全清掉 localStorage
- Phase 0.7:stage 部署 + nil guard
- getApiBaseUrl() 修:browser 環境視為 same-origin(與 login 頁一致)
- login 頁加「已登入 → router.replace('/')」effect
- User type email/name 改 optional(MC id_token 不一定回 email/name claim)
- header.tsx UserMenu displayName 4 層 fallback:name → email → id → i18n
- 雛形 banner 文案更新(已接 Innovedus 帳號中心)+ 版號 Phase 0.7
驗證:pnpm lint / test (125/125) / build 全綠
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
24 lines
659 B
TypeScript
24 lines
659 B
TypeScript
import * as React from "react";
|
||
|
||
import { cn } from "@/lib/utils";
|
||
|
||
/**
|
||
* Skeleton — Loading 骨架
|
||
*
|
||
* local-tool 未提供此元件,雲端版提前補齊(shadcn 標準實作,極輕量)。
|
||
*
|
||
* 用於資料載入中的占位效果,避免 CLS(layout shift)。配合 Tailwind `animate-pulse`
|
||
* 呈現閃爍。尺寸與圓角由使用端透過 className 指定(例如 h-4 w-24 rounded)。
|
||
*/
|
||
function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
|
||
return (
|
||
<div
|
||
data-slot="skeleton"
|
||
className={cn("bg-muted animate-pulse rounded-md", className)}
|
||
{...props}
|
||
/>
|
||
);
|
||
}
|
||
|
||
export { Skeleton };
|