feat: stabilize document type and upload flows

This commit is contained in:
wren
2026-04-30 17:44:05 +08:00
parent 81c5e98b53
commit 3fb7e9f5d0
18 changed files with 2122 additions and 491 deletions
+48
View File
@@ -10,6 +10,46 @@
@apply text-xl font-medium;
}
.document-types-page .empty-state {
@apply flex flex-col items-center justify-center py-12 text-gray-500;
}
.document-types-page .empty-state i {
@apply text-3xl mb-3 text-gray-300;
}
.document-types-page .data-table {
@apply w-full border-collapse;
}
.document-types-page .data-table thead th {
@apply text-left text-sm font-medium text-gray-600 px-4 py-3 border-b border-gray-200 bg-gray-50;
}
.document-types-page .data-table tbody td {
@apply px-4 py-3 border-b border-gray-100 align-middle text-sm text-gray-800;
}
.document-types-page .data-table tbody tr:hover {
@apply bg-gray-50;
}
.document-types-page .tag {
@apply inline-flex items-center px-2 py-0.5 rounded-full text-xs bg-amber-50 text-amber-700 border border-amber-200;
}
.document-types-page .status-badge {
@apply inline-flex items-center px-2 py-0.5 rounded-full text-xs border;
}
.document-types-page .status-badge.enabled {
@apply bg-emerald-50 text-emerald-700 border-emerald-200;
}
.document-types-page .status-badge.disabled {
@apply bg-gray-100 text-gray-600 border-gray-200;
}
.document-types-page .type-badge {
@apply inline-flex items-center px-2 py-0.5 rounded-full text-xs bg-primary-50 text-primary-600 mr-1 mb-1;
}
@@ -30,6 +70,14 @@
@apply mr-1;
}
.document-types-page .row-actions {
@apply flex items-center gap-2;
}
.document-types-page .btn-icon {
@apply inline-flex items-center justify-center w-8 h-8 rounded-md text-gray-500 hover:bg-gray-100 hover:text-gray-700 transition-colors;
}
.document-types-page .text-primary {
@apply text-primary-600;
}
+470 -75
View File
@@ -1,143 +1,538 @@
.document-type-new-page {
@apply w-full;
@apply w-full p-6;
}
.document-type-new-page .page-header {
@apply flex justify-between items-center mb-4;
@apply mb-6 rounded-xl border border-gray-200 bg-white p-6 shadow-sm;
}
.document-type-new-page .page-heading {
@apply max-w-3xl;
}
.document-type-new-page .page-kicker {
@apply inline-flex items-center rounded-full border px-3 py-1 text-[11px] font-semibold tracking-[0.14em];
border-color: rgba(0, 104, 74, 0.18);
background: rgba(0, 104, 74, 0.06);
color: #00684a;
}
.document-type-new-page .page-title {
@apply text-xl font-medium;
@apply mt-4 flex items-center gap-3 text-[28px] font-semibold text-gray-900;
}
.document-type-new-page .page-title i {
@apply inline-flex h-11 w-11 items-center justify-center rounded-lg text-xl text-white;
background: #00684a;
}
.document-type-new-page .page-subtitle {
@apply mt-2 max-w-2xl text-sm leading-6 text-gray-600;
}
.document-type-new-page .header-overview {
@apply mt-5 flex flex-col gap-4;
}
.document-type-new-page .header-badges {
@apply flex flex-wrap gap-3;
}
.document-type-new-page .status-pill {
@apply inline-flex items-center gap-2 rounded-full border px-3 py-1.5 text-sm font-medium;
}
.document-type-new-page .status-pill.create {
border-color: rgba(0, 104, 74, 0.18);
background: rgba(0, 104, 74, 0.06);
color: #00684a;
}
.document-type-new-page .status-pill.edit {
@apply border-blue-200 bg-blue-50 text-blue-700;
}
.document-type-new-page .status-pill.linked {
@apply border-gray-200 bg-gray-50 text-gray-700;
}
.document-type-new-page .status-pill.muted {
@apply border-amber-200 bg-amber-50 text-amber-700;
}
.document-type-new-page .hero-metrics {
@apply grid gap-3 md:grid-cols-2;
}
.document-type-new-page .hero-metric-card {
@apply rounded-lg border border-gray-200 bg-gray-50 p-4;
}
.document-type-new-page .hero-metric-label {
@apply block text-xs font-semibold tracking-[0.12em] text-gray-500;
}
.document-type-new-page .hero-metric-card strong {
@apply mt-2 block text-2xl font-semibold text-gray-900;
}
.document-type-new-page .hero-metric-card small {
@apply mt-1 block text-xs leading-5 text-gray-500;
}
.document-type-new-page .editor-shell {
@apply grid gap-6 xl:grid-cols-[minmax(0,1.65fr)_minmax(280px,0.75fr)];
}
.document-type-new-page .editor-main-card,
.document-type-new-page .summary-card,
.document-type-new-page .selection-card,
.document-type-new-page .guide-card {
@apply overflow-hidden rounded-xl border border-gray-200 bg-white shadow-sm;
}
.document-type-new-page .editor-main-card {
@apply p-0;
}
.document-type-new-page .doc-type-form {
@apply flex flex-col gap-0;
}
.document-type-new-page .form-section {
@apply border-b border-gray-100 px-6 py-6;
}
.document-type-new-page .form-section:last-of-type {
@apply border-b-0;
}
.document-type-new-page .section-heading {
@apply flex flex-col gap-3 md:flex-row md:items-end md:justify-between;
}
.document-type-new-page .section-kicker,
.document-type-new-page .summary-kicker {
@apply inline-flex rounded-full bg-gray-100 px-3 py-1 text-[11px] font-semibold tracking-[0.12em] text-gray-500;
}
.document-type-new-page .section-heading h3 {
@apply mt-3 text-xl font-semibold text-gray-900;
}
.document-type-new-page .section-heading p {
@apply max-w-xl text-sm leading-6 text-gray-500;
}
.document-type-new-page .section-intro-card {
@apply mt-5 grid gap-3 rounded-lg border border-gray-200 bg-gray-50 p-4 md:grid-cols-2;
}
.document-type-new-page .section-intro-item {
@apply flex gap-3 rounded-lg border border-gray-200 bg-white px-4 py-3;
}
.document-type-new-page .section-intro-item i {
@apply mt-0.5 text-lg;
color: #00684a;
}
.document-type-new-page .section-intro-item strong {
@apply block text-sm font-semibold text-gray-900;
}
.document-type-new-page .section-intro-item span {
@apply mt-1 block text-xs leading-5 text-gray-500;
}
.document-type-new-page .form-row.two-column {
@apply mt-5 grid gap-4 lg:grid-cols-2;
}
.document-type-new-page .form-group {
@apply mb-4;
@apply mb-0 mt-5;
}
.document-type-new-page .form-label {
@apply block text-sm font-medium text-gray-700 mb-1;
.document-type-new-page .form-group label {
@apply mb-2 block text-sm font-medium text-gray-700;
}
.document-type-new-page .form-group label.required::after {
content: " *";
@apply text-red-500;
}
.document-type-new-page .form-input,
.document-type-new-page .form-textarea,
.document-type-new-page .form-select {
@apply w-full rounded-md border border-gray-300 shadow-sm px-3 py-2 transition-all duration-300;
@apply focus:outline-none focus:border-[var(--primary-color)] focus:shadow-[0_0_0_2px_rgba(0,104,74,0.2)];
@apply w-full rounded-md border border-gray-300 bg-white px-3 py-2.5 text-sm text-gray-700 transition-all duration-200 placeholder:text-gray-400;
@apply focus:outline-none focus:ring-1;
border-color: #d1d5db;
}
.document-type-new-page .form-input:focus,
.document-type-new-page .form-textarea:focus,
.document-type-new-page .form-select:focus,
.document-type-new-page .rule-set-search:focus-within {
border-color: #00684a;
box-shadow: 0 0 0 1px rgba(0, 104, 74, 0.35);
}
.document-type-new-page .form-input:hover,
.document-type-new-page .form-textarea:hover,
.document-type-new-page .form-select:hover {
border-color: #9ca3af;
}
.document-type-new-page .form-input:disabled {
@apply cursor-not-allowed bg-gray-100 text-gray-400;
}
.document-type-new-page .form-input.error,
.document-type-new-page .form-textarea.error,
.document-type-new-page .form-select.error {
@apply border-red-300 bg-red-50/70;
}
.document-type-new-page .form-textarea {
@apply resize-none;
@apply min-h-[120px] resize-y;
}
.document-type-new-page .form-tip {
@apply text-xs text-gray-500 mt-1;
.document-type-new-page .form-hint {
@apply mt-2 block text-xs leading-5 text-gray-500;
}
.document-type-new-page .input-error {
@apply border-red-500;
.document-type-new-page .form-error {
@apply mt-2 block text-xs font-medium text-red-600;
}
.document-type-new-page .error-message {
@apply text-sm text-red-600 mt-1;
display: flex;
align-items: center;
.document-type-new-page .binding-preview {
@apply mt-5 rounded-lg border border-dashed p-4;
border-color: rgba(0, 104, 74, 0.25);
background: rgba(0, 104, 74, 0.04);
}
/* .document-type-new-page .error-message::before {
content: "⚠️";
margin-right: 0.25rem;
} */
.document-type-new-page .general-error {
@apply flex items-center p-3 mb-4 bg-red-50 rounded-md text-red-600 text-sm;
.document-type-new-page .binding-preview-label {
@apply text-xs font-semibold tracking-[0.12em];
color: #00684a;
}
.document-type-new-page .general-error i {
@apply mr-2;
.document-type-new-page .binding-preview-value {
@apply mt-3 flex items-start gap-3 text-sm leading-6 text-gray-700;
}
.document-type-new-page .group-error {
@apply border border-red-500 rounded-md;
.document-type-new-page .binding-preview-value i {
@apply mt-1 text-base;
color: #00684a;
}
/* 复选框样式 */
.document-type-new-page .checkbox-group {
@apply flex flex-col gap-2 mt-2;
.document-type-new-page .rule-set-toolbar {
@apply mt-5 flex flex-col gap-3 rounded-lg border border-gray-200 bg-gray-50 px-4 py-3;
}
.document-type-new-page .checkbox-item {
@apply flex items-center p-2 border border-gray-200 rounded cursor-pointer transition-all;
.document-type-new-page .rule-set-toolbar-main {
@apply flex flex-col gap-1;
}
.document-type-new-page .checkbox-item:hover {
@apply border-[var(--primary-color)] bg-[rgba(0,104,74,0.15)];
.document-type-new-page .rule-set-counter {
@apply inline-flex items-center gap-2 text-sm font-semibold text-gray-700;
}
.document-type-new-page .checkbox-item.checked {
@apply border-[var(--primary-color)] bg-[rgba(0,104,74,0.25)];
.document-type-new-page .rule-set-counter i {
color: #00684a;
}
/* 父子级分组样式 */
.document-type-new-page .parent-checkbox-item {
@apply bg-gray-50 font-medium;
.document-type-new-page .rule-set-search {
@apply flex items-center gap-2 rounded-md border border-gray-300 bg-white px-3 py-2;
}
.document-type-new-page .child-checkbox-item {
@apply ml-8 border-l-2 border-l-[var(--primary-color)];
.document-type-new-page .rule-set-search i {
@apply text-sm text-gray-400;
}
.document-type-new-page .expand-icon {
@apply w-6 h-6 flex items-center justify-center rounded hover:bg-[rgba(0,104,74,0.15)] mr-2 cursor-pointer;
.document-type-new-page .rule-set-search input {
@apply w-full border-0 bg-transparent p-0 text-sm text-gray-700 placeholder:text-gray-400 focus:outline-none focus:ring-0;
}
.document-type-new-page .group-badge {
@apply inline-flex items-center px-2 py-0.5 rounded-full text-xs ml-2;
.document-type-new-page .rule-set-warning {
@apply mt-4 flex items-start gap-3 rounded-lg border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-800;
}
.document-type-new-page .parent-badge {
@apply bg-[rgba(0,104,74,1)] text-white;
.document-type-new-page .rule-set-warning i {
@apply mt-0.5 text-base;
}
.document-type-new-page .child-badge {
@apply bg-[rgba(0,104,1,0.71)] text-white;
.document-type-new-page .rule-set-warning strong {
@apply block font-semibold;
}
/* 添加checkbox-input样式,使用视觉上更美观的自定义复选框样式 */
.document-type-new-page .checkbox-input {
@apply mr-2 h-4 w-4 text-primary-600 border-gray-300 rounded;
@apply focus:ring-primary-500 cursor-pointer;
.document-type-new-page .rule-set-warning span {
@apply mt-1 block text-xs leading-5 text-amber-700;
}
.document-type-new-page .rule-set-checklist {
@apply mt-5 grid max-h-[520px] gap-3 overflow-y-auto pr-1;
}
.document-type-new-page .rule-set-checklist::-webkit-scrollbar {
width: 8px;
}
.document-type-new-page .rule-set-checklist::-webkit-scrollbar-thumb {
background: #d1d5db;
border-radius: 9999px;
}
.document-type-new-page .rule-set-item {
@apply flex items-start gap-4 rounded-lg border border-gray-200 bg-white px-4 py-4 transition-all duration-200;
}
.document-type-new-page .rule-set-item:hover {
border-color: rgba(0, 104, 74, 0.3);
background: rgba(0, 104, 74, 0.02);
}
.document-type-new-page .rule-set-item.checked {
border-color: rgba(0, 104, 74, 0.35);
background: rgba(0, 104, 74, 0.05);
}
.document-type-new-page .rule-set-item.unavailable {
@apply border-amber-200 bg-amber-50/40;
}
.document-type-new-page .rule-set-checkbox-wrap {
@apply pt-0.5;
}
.document-type-new-page .rule-set-checkbox-wrap input {
@apply h-4 w-4 cursor-pointer rounded border-gray-300;
accent-color: #00684a;
}
/* 复选框选中状态 */
.document-type-new-page .checkbox-input:checked {
background-color: #00684a;
border-color: #00684a;
.document-type-new-page .rule-set-content {
@apply min-w-0 flex-1;
}
.document-type-new-page .checkbox-label {
@apply text-gray-700 font-normal cursor-pointer flex-1 flex items-center;
@apply bg-transparent border-none p-0 text-left appearance-none;
outline: none;
.document-type-new-page .rule-set-topline {
@apply flex flex-col gap-2 md:flex-row md:items-center md:justify-between;
}
.document-type-new-page .checkbox-label:focus {
@apply outline-none ring-2 ring-primary-300 rounded;
.document-type-new-page .rule-set-name {
@apply text-sm font-semibold text-gray-900;
}
.document-type-new-page .checkbox-item.checked .checkbox-label {
@apply text-[var(--primary-color)] font-medium;
.document-type-new-page .rule-set-status {
@apply inline-flex w-fit rounded-full px-2.5 py-1 text-xs font-medium;
}
.document-type-new-page .radio-input {
@apply mr-1 h-4 w-4 text-primary-600 border-gray-300 rounded;
@apply focus:ring-primary-500 cursor-pointer;
accent-color: #00684a;
.document-type-new-page .rule-set-status.enabled,
.document-type-new-page .rule-set-status.active,
.document-type-new-page .rule-set-status.published {
@apply bg-emerald-100 text-emerald-700;
}
/* 更完整的自定义单选按钮样式(可选) */
.document-type-new-page .radio-input:checked {
background-color: #00684a;
border-color: #00684a;
.document-type-new-page .rule-set-status.disabled,
.document-type-new-page .rule-set-status.inactive {
@apply bg-gray-100 text-gray-500;
}
.document-type-new-page .rule-set-meta {
@apply mt-2 flex flex-wrap gap-2 text-xs text-gray-500;
}
.document-type-new-page .rule-set-type,
.document-type-new-page .rule-set-id,
.document-type-new-page .rule-set-version-badge {
@apply rounded-full bg-gray-100 px-2.5 py-1;
}
.document-type-new-page .rule-set-version-badge.ok {
color: #00684a;
background: rgba(0, 104, 74, 0.1);
}
.document-type-new-page .rule-set-version-badge.missing {
@apply bg-amber-100 text-amber-700;
}
.document-type-new-page .rule-set-inline-warning {
@apply mt-3 flex items-start gap-2 rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-xs leading-5 text-amber-700;
}
.document-type-new-page .rule-set-inline-warning.soft {
@apply border-sky-200 bg-sky-50 text-sky-700;
}
.document-type-new-page .rule-set-inline-warning i {
@apply mt-[2px];
}
.document-type-new-page .empty-rule-set {
@apply flex flex-col items-center rounded-lg border border-dashed border-gray-200 bg-gray-50 px-4 py-10 text-center;
}
.document-type-new-page .empty-rule-set.compact {
@apply py-8;
}
.document-type-new-page .empty-rule-set i {
@apply text-3xl text-gray-300;
}
.document-type-new-page .empty-rule-set p {
@apply mt-3 text-sm font-semibold text-gray-700;
}
.document-type-new-page .empty-rule-set span {
@apply mt-2 max-w-sm text-xs leading-5 text-gray-500;
}
.document-type-new-page .form-actions {
@apply flex flex-col-reverse gap-3 px-6 py-5 sm:flex-row sm:justify-end;
}
.document-type-new-page .editor-sidebar {
@apply flex flex-col gap-6;
}
.document-type-new-page .summary-card,
.document-type-new-page .selection-card,
.document-type-new-page .guide-card {
@apply p-5;
}
.document-type-new-page .summary-card {
@apply xl:sticky xl:top-6;
}
.document-type-new-page .summary-card-header {
@apply flex items-center justify-between gap-4;
}
.document-type-new-page .summary-card-header h3 {
@apply text-lg font-semibold text-gray-900;
}
.document-type-new-page .summary-grid {
@apply mt-5 grid gap-3 sm:grid-cols-2;
}
.document-type-new-page .summary-item {
@apply rounded-lg border border-gray-200 bg-gray-50 px-4 py-3;
}
.document-type-new-page .summary-item.full {
@apply sm:col-span-2;
}
.document-type-new-page .summary-label,
.document-type-new-page .selection-label {
@apply block text-xs font-medium tracking-[0.08em] text-gray-500;
}
.document-type-new-page .summary-item strong,
.document-type-new-page .selection-item strong {
@apply mt-2 block break-words text-sm font-semibold leading-6 text-gray-900;
}
.document-type-new-page .summary-progress {
@apply mt-5 rounded-lg border border-gray-200 bg-white p-4;
}
.document-type-new-page .summary-progress-topline {
@apply flex items-center justify-between text-sm font-medium text-gray-700;
}
.document-type-new-page .summary-progress-bar {
@apply mt-3 h-2 overflow-hidden rounded-full bg-gray-100;
}
.document-type-new-page .summary-progress-bar span {
@apply block h-full rounded-full transition-all duration-300;
background: #00684a;
}
.document-type-new-page .selection-stack {
@apply mt-5 flex flex-col gap-4;
}
.document-type-new-page .selection-item {
@apply rounded-lg border border-gray-200 bg-gray-50 px-4 py-3;
}
.document-type-new-page .selection-item.danger {
@apply border-amber-200 bg-amber-50;
}
.document-type-new-page .selection-tags {
@apply mt-3 flex flex-wrap gap-2;
}
.document-type-new-page .selection-tag {
@apply inline-flex rounded-full px-3 py-1 text-xs font-medium;
color: #00684a;
background: rgba(0, 104, 74, 0.1);
}
.document-type-new-page .selection-tag.warning {
@apply bg-amber-100 text-amber-700;
}
.document-type-new-page .selection-tag.muted {
@apply bg-gray-100 text-gray-500;
}
.document-type-new-page .guide-list {
@apply mt-5 flex list-none flex-col gap-3;
}
.document-type-new-page .guide-list li {
@apply relative rounded-lg border border-gray-200 bg-gray-50 px-4 py-3 pl-10 text-sm leading-7 text-gray-600;
}
.document-type-new-page .guide-list li::before {
content: "";
@apply absolute left-4 top-5 h-2.5 w-2.5 rounded-full;
background: #00684a;
}
@media (max-width: 1279px) {
.document-type-new-page .summary-card {
@apply static;
}
}
@media (max-width: 767px) {
.document-type-new-page {
@apply p-4;
}
.document-type-new-page .page-header,
.document-type-new-page .form-section,
.document-type-new-page .form-actions {
@apply px-4;
}
.document-type-new-page .page-title {
@apply text-2xl;
}
.document-type-new-page .page-title i {
@apply h-10 w-10 text-lg;
}
.document-type-new-page .summary-card,
.document-type-new-page .selection-card,
.document-type-new-page .guide-card {
@apply p-4;
}
.document-type-new-page .rule-set-item {
@apply gap-3 px-3 py-3;
}
.document-type-new-page .rule-set-checklist {
@apply max-h-[420px];
}
}
+48
View File
@@ -100,6 +100,54 @@
@apply border-[#00684a] shadow-[0_0_0_2px_rgba(0,104,74,0.2)] outline-none;
}
.file-upload-page .upload-error-card {
@apply border border-amber-200;
}
.file-upload-page .upload-error-banner {
@apply rounded-lg border border-amber-200 bg-amber-50 px-4 py-4;
}
.file-upload-page .upload-error-banner__header {
@apply flex items-start justify-between gap-3;
}
.file-upload-page .upload-error-banner__title-wrap {
@apply flex items-start gap-3;
}
.file-upload-page .upload-error-banner__icon {
@apply text-2xl text-amber-600;
}
.file-upload-page .upload-error-banner__title {
@apply text-base font-semibold text-amber-900;
}
.file-upload-page .upload-error-banner__summary {
@apply mt-1 text-sm leading-6 text-amber-900;
}
.file-upload-page .upload-error-banner__dismiss {
@apply inline-flex h-8 w-8 items-center justify-center rounded-full text-amber-700 transition-colors duration-200 hover:bg-amber-100 hover:text-amber-900;
}
.file-upload-page .upload-error-banner__content {
@apply mt-4 grid gap-4 md:grid-cols-2;
}
.file-upload-page .upload-error-banner__label {
@apply mb-2 text-sm font-medium text-amber-900;
}
.file-upload-page .upload-error-banner__list {
@apply m-0 list-disc space-y-2 pl-5 text-sm leading-6 text-amber-800;
}
.file-upload-page .upload-error-banner__list--ordered {
@apply list-decimal;
}
/* 上传区域样式 */
.file-upload-page .upload-area {
@apply border-2 border-dashed border-gray-300 rounded-lg p-10 text-center bg-gray-50 cursor-pointer transition-all duration-300;