引入 SQLite 数据库(Drizzle ORM + bun:sqlite),实现项目 CRUD 与归档/恢复/删除 生命周期管理,新增项目管理前端页面,migration 嵌入单文件构建产物保持部署体验。 - src/server/db: schema、connection、migration 执行器、项目数据访问层 - src/server/routes/projects: 7 个 API 端点(列表/创建/详情/更新/归档/恢复/删除) - src/web: 项目管理页面(TDesign Table/Tabs/Dialog/Form),TanStack Query hooks - scripts: 构建时嵌入 migration SQL,开发期独立 generate-migrations-data 脚本 - tests: 60 个后端测试 + 27 个前端测试,覆盖 DB/migration/API/路由/页面 - docs: 更新架构、后端、发布、配置、部署、使用文档
124 lines
2.3 KiB
CSS
124 lines
2.3 KiB
CSS
:root {
|
|
--td-brand-color: var(--td-brand-color-7);
|
|
}
|
|
|
|
.app-layout {
|
|
min-height: 100vh;
|
|
background: var(--td-bg-color-page);
|
|
width: 100%;
|
|
}
|
|
|
|
.app-header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
padding: 0 var(--td-comp-paddingLR-l);
|
|
background: var(--td-bg-color-container);
|
|
border-bottom: 1px solid var(--td-component-border);
|
|
height: 64px;
|
|
}
|
|
|
|
.app-header-left {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: var(--td-comp-margin-l);
|
|
}
|
|
|
|
.app-header-right {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: var(--td-comp-margin-s);
|
|
}
|
|
|
|
.app-brand-group {
|
|
display: inline-flex;
|
|
align-items: baseline;
|
|
gap: var(--td-comp-margin-s);
|
|
}
|
|
|
|
.app-brand {
|
|
margin: 0;
|
|
color: var(--td-text-color-primary);
|
|
font-size: calc(var(--td-font-size-title-large) + 6px);
|
|
font-weight: 700;
|
|
line-height: 1;
|
|
}
|
|
|
|
.app-version {
|
|
color: var(--td-text-color-placeholder);
|
|
font-size: var(--td-font-size-body-small);
|
|
font-weight: 400;
|
|
line-height: 1;
|
|
}
|
|
|
|
.app-sidebar-collapse-btn {
|
|
width: 100%;
|
|
justify-content: center;
|
|
color: var(--td-text-color-secondary);
|
|
}
|
|
|
|
.app-page-title {
|
|
color: var(--td-text-color-secondary);
|
|
font-size: var(--td-font-size-title-medium);
|
|
font-weight: 500;
|
|
}
|
|
|
|
.app-sidebar {
|
|
background: var(--td-bg-color-container);
|
|
border-right: 1px solid var(--td-component-border);
|
|
height: calc(100vh - 64px);
|
|
overflow: hidden;
|
|
}
|
|
|
|
.app-sidebar-menu {
|
|
height: 100%;
|
|
}
|
|
|
|
.app-content {
|
|
box-sizing: border-box;
|
|
padding: var(--td-comp-paddingTB-xl) var(--td-comp-paddingLR-xl);
|
|
min-height: calc(100vh - 64px);
|
|
}
|
|
|
|
.meta-response {
|
|
background: var(--td-bg-color-component);
|
|
border-radius: var(--td-radius-default);
|
|
padding: var(--td-comp-paddingTB-l) var(--td-comp-paddingLR-l);
|
|
font-size: var(--td-font-size-body-medium);
|
|
color: var(--td-text-color-primary);
|
|
overflow-x: auto;
|
|
}
|
|
|
|
.error-boundary-fallback {
|
|
padding-top: 20vh;
|
|
width: 100%;
|
|
}
|
|
|
|
.full-width {
|
|
width: 100%;
|
|
}
|
|
|
|
.text-disabled {
|
|
color: var(--td-text-color-disabled);
|
|
}
|
|
|
|
.full-width-space {
|
|
width: 100%;
|
|
}
|
|
|
|
.not-found-icon {
|
|
color: var(--td-warning-color);
|
|
}
|
|
|
|
.tabular-nums {
|
|
font-variant-numeric: tabular-nums;
|
|
}
|
|
|
|
.projects-header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
flex-wrap: wrap;
|
|
gap: var(--td-comp-margin-l);
|
|
}
|