feat(web): 搭建 Web 壳层与 UI 包基线

React 19 + Vite 6 + Router 7 + TanStack Query + Zustand;Semi 二次封装与 Remix 图标统一出口;顶部模块 + 左侧功能菜单布局、Cloud Blue 主题、登录页与 401/403/404/500 页面;请求层含 token 注入、单飞刷新与统一错误提示。
This commit is contained in:
Stev_Wang committed 2026-11-02 17:21:16 +08:00
1 parent 23067edb8f
commit 073d210a92
51 files changed
+4452

No files matched your search

+100
View File
@@ -0,0 +1,100 @@
/* 灵犀 UI 包组件样式:只使用 tokens.css 中的语义变量,不写颜色字面量 */
.lx-empty {
padding: 48px 0;
text-align: center;
}
.lx-empty__action {
margin-top: var(--lx-space-4);
}
.lx-error-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: var(--lx-space-2);
padding: 64px var(--lx-space-6);
text-align: center;
}
.lx-error-state__icon {
color: var(--lx-color-danger);
display: inline-flex;
}
.lx-error-state__title {
margin: var(--lx-space-2) 0 0;
color: var(--lx-color-text-primary);
font-size: var(--lx-font-size-lg);
line-height: var(--lx-line-height-tight);
}
.lx-error-state__message {
margin: 0;
max-width: 42ch;
color: var(--lx-color-text-secondary);
font-size: var(--lx-font-size-sm);
}
.lx-error-state__trace {
margin: 0;
color: var(--lx-color-text-tertiary);
font-family: var(--lx-font-mono);
font-size: var(--lx-font-size-xs);
}
.lx-error-state__retry {
margin-top: var(--lx-space-3);
}
.lx-page-skeleton {
padding: var(--lx-space-4) 0;
}
.lx-query-form {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: var(--lx-space-4);
margin-bottom: var(--lx-space-4);
}
.lx-query-form__fields {
display: flex;
flex: 1 1 auto;
flex-wrap: wrap;
gap: var(--lx-space-2) var(--lx-space-4);
min-width: 0;
}
.lx-query-form__actions {
flex: 0 0 auto;
}
.lx-data-table .semi-table-container {
border: 1px solid var(--lx-color-border);
border-radius: var(--lx-radius-md);
overflow: hidden;
}
.lx-data-table .semi-table-thead > .semi-table-row > .semi-table-row-head {
background: var(--lx-color-bg-panel);
color: var(--lx-color-text-secondary);
font-size: var(--lx-font-size-xs);
font-weight: 500;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.lx-data-table .semi-table-tbody > .semi-table-row > .semi-table-row-cell {
border-bottom: 1px solid var(--lx-color-border);
}
.lx-data-table .semi-table-tbody > .semi-table-row:hover > .semi-table-row-cell {
background: var(--lx-color-bg-hover);
}
.lx-form-modal .semi-modal-content {
background: var(--lx-color-bg-elevated);
}