diff --git a/frontend/src/views/components/ConfigSettings/ConfigForm/ConfigForm.css b/frontend/src/views/components/ConfigSettings/ConfigForm/ConfigForm.css index 8c40c22..c2fed21 100644 --- a/frontend/src/views/components/ConfigSettings/ConfigForm/ConfigForm.css +++ b/frontend/src/views/components/ConfigSettings/ConfigForm/ConfigForm.css @@ -34,24 +34,57 @@ gap: 12px 16px; } +.form-sections { + display: flex; + flex-wrap: wrap; + gap: 6px; + padding-bottom: 10px; + border-bottom: 1px solid var(--pm-border-color); +} + +.form-sections button { + padding: 8px 12px; + border: 1px solid transparent; + border-radius: 8px; + background: transparent; + color: var(--pm-text-secondary); + font: inherit; + font-size: 13px; + cursor: pointer; +} + +.form-sections button.active { + color: var(--pm-primary-color); + border-color: color-mix(in srgb, var(--pm-primary-color) 20%, transparent); + background: color-mix(in srgb, var(--pm-primary-color) 8%, transparent); + font-weight: 600; +} + +.form-sections button:hover:not(.active) { + background: var(--pm-bg-hover); +} + +.form-sections button:focus-visible { + outline: 2px solid var(--pm-primary-color); + outline-offset: 2px; +} + +.section-error { + margin-left: 6px; + color: var(--el-color-danger); + font-size: 12px; +} + +.config-form[data-form-section="base"] .form-group { + padding-top: 0; + border-top: 0; +} + @container config-main (min-width: 640px) { .form-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } - .config-form[data-form-section="base"] { - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 12px; - } - - .config-form[data-form-section="base"] .form-group { - align-self: start; - padding: 12px; - border: 1px solid var(--pm-border-color); - border-radius: 10px; - background: var(--pm-bg-primary); - } - .config-form[data-form-section="base"] .form-grid, .config-form[data-form-section="email"] .form-grid, .form-group[data-group="verification"] .form-grid { @@ -59,6 +92,17 @@ } } +@media (min-width: 769px) and (max-height: 800px) { + .config-form, + .form-grid { + gap: 8px 12px; + } + + .form-group + .form-group { + padding-top: 8px; + } +} + @container config-main (max-width: 440px) { .form-grid { grid-template-columns: minmax(0, 1fr); diff --git a/frontend/src/views/components/ConfigSettings/ConfigForm/ConfigForm.vue b/frontend/src/views/components/ConfigSettings/ConfigForm/ConfigForm.vue index a942094..2c2ca39 100644 --- a/frontend/src/views/components/ConfigSettings/ConfigForm/ConfigForm.vue +++ b/frontend/src/views/components/ConfigSettings/ConfigForm/ConfigForm.vue @@ -1,7 +1,27 @@ diff --git a/frontend/src/views/components/ConfigSettings/ConfigMaintenance/ConfigMaintenance.vue b/frontend/src/views/components/ConfigSettings/ConfigMaintenance/ConfigMaintenance.vue index 307082c..9c7878f 100644 --- a/frontend/src/views/components/ConfigSettings/ConfigMaintenance/ConfigMaintenance.vue +++ b/frontend/src/views/components/ConfigSettings/ConfigMaintenance/ConfigMaintenance.vue @@ -162,7 +162,7 @@
-
+
{{ operationLabel(item.operation) }} {{ sectionLabel(item.section) }} · {{ item.actorId || '系统' }} diff --git a/frontend/src/views/components/ConfigSettings/ConfigPagination/ConfigPagination.js b/frontend/src/views/components/ConfigSettings/ConfigPagination/ConfigPagination.js index cbf172b..449bc52 100644 --- a/frontend/src/views/components/ConfigSettings/ConfigPagination/ConfigPagination.js +++ b/frontend/src/views/components/ConfigSettings/ConfigPagination/ConfigPagination.js @@ -1,17 +1,21 @@ -import { computed, ref } from 'vue' +import { computed, ref, watch } from 'vue' // 只分页展示,不切割源配置;绝对索引确保编辑和移除始终命中原条目。 export function usePagination(items, pageSize = 6) { + const size = Math.max(1, Math.floor(Number(pageSize)) || 6) const requestedPage = ref(1) const total = computed(() => items.value.length) - const pageCount = computed(() => Math.max(1, Math.ceil(total.value / pageSize))) + const pageCount = computed(() => Math.max(1, Math.ceil(total.value / size))) const currentPage = computed({ get: () => Math.min(requestedPage.value, pageCount.value), - set: value => { requestedPage.value = Math.max(1, Math.min(pageCount.value, Number(value) || 1)) } + set: value => { requestedPage.value = Math.max(1, Math.min(pageCount.value, Math.floor(Number(value)) || 1)) } }) + watch(pageCount, count => { + requestedPage.value = Math.min(requestedPage.value, count) + }, { flush: 'sync' }) const pageItems = computed(() => { - const start = (currentPage.value - 1) * pageSize - return items.value.slice(start, start + pageSize).map((entry, offset) => ({ entry, index: start + offset })) + const start = (currentPage.value - 1) * size + return items.value.slice(start, start + size).map((entry, offset) => ({ entry, index: start + offset })) }) return { currentPage, pageCount, pageItems, total } } diff --git a/frontend/src/views/components/ConfigSettings/ConfigPagination/ConfigPagination.vue b/frontend/src/views/components/ConfigSettings/ConfigPagination/ConfigPagination.vue index 2ad8d36..cd58181 100644 --- a/frontend/src/views/components/ConfigSettings/ConfigPagination/ConfigPagination.vue +++ b/frontend/src/views/components/ConfigSettings/ConfigPagination/ConfigPagination.vue @@ -1,8 +1,22 @@ diff --git a/frontend/src/views/components/ConfigSettings/ConfigSettings.css b/frontend/src/views/components/ConfigSettings/ConfigSettings.css index e3480e6..d65907a 100644 --- a/frontend/src/views/components/ConfigSettings/ConfigSettings.css +++ b/frontend/src/views/components/ConfigSettings/ConfigSettings.css @@ -444,11 +444,6 @@ .migration-form > * + * { margin-top: 8px; } -.maintenance-pagination { - display: flex; - justify-content: flex-end; - margin-top: 12px; -} @container config-main (min-width: 700px) { .editor-footer { display: flex; @@ -500,6 +495,24 @@ --config-accent: var(--pm-primary-light-3); } } +@media (min-width: 769px) and (max-height: 800px) { + .config-page, + .config-page-body, + .config-main { + gap: 8px; + } + .editor-panel { + padding: 12px; + } + .editor-footer { + margin-top: 8px; + padding-top: 8px; + } + .secret-editor { + margin-top: 8px; + padding: 8px 10px; + } +} @media (prefers-reduced-motion: reduce) { .maintenance-summary, .disclosure-arrow { diff --git a/frontend/src/views/components/PluginSettings/TelegramSettings/TelegramSettings.css b/frontend/src/views/components/PluginSettings/TelegramSettings/TelegramSettings.css index 21b9297..93f81a7 100644 --- a/frontend/src/views/components/PluginSettings/TelegramSettings/TelegramSettings.css +++ b/frontend/src/views/components/PluginSettings/TelegramSettings/TelegramSettings.css @@ -41,3 +41,23 @@ .telegram-actions .el-button { margin-left: 0; } +.telegram-settings :deep(.el-form) { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 10px 20px; +} + +.telegram-settings :deep(.el-form-item) { + min-width: 0; + margin-bottom: 0; +} + +.telegram-settings :deep(.el-form-item:first-child) { + grid-column: 1 / -1; +} + +@media (max-width: 768px) { + .telegram-settings :deep(.el-form) { + grid-template-columns: minmax(0, 1fr); + } +} diff --git a/frontend/src/views/components/RuleSettings/RuleSettings.css b/frontend/src/views/components/RuleSettings/RuleSettings.css index 15d9927..57685f9 100644 --- a/frontend/src/views/components/RuleSettings/RuleSettings.css +++ b/frontend/src/views/components/RuleSettings/RuleSettings.css @@ -50,6 +50,7 @@ .form-actions { display: flex; justify-content: flex-start; + margin-top: 12px; } .add-btn { diff --git a/frontend/src/views/components/RuleSettings/RuleSettings.vue b/frontend/src/views/components/RuleSettings/RuleSettings.vue index a82ee5d..139f78b 100644 --- a/frontend/src/views/components/RuleSettings/RuleSettings.vue +++ b/frontend/src/views/components/RuleSettings/RuleSettings.vue @@ -6,7 +6,7 @@
- +