@import './variables.scss'; /* 全局样式 */ page { background-color: $bg-primary; font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Microsoft YaHei', sans-serif; font-size: $font-size-base; color: $text-primary; line-height: 1.5; /* * 使用 rem 方案后,不需要设置固定的 font-size * 所有元素使用 rem 单位,会自动相对于根字体大小计算 * 根字体大小由 JavaScript 动态设置(document.documentElement.style.fontSize) */ } /* 清除默认样式 */ view, text, image, navigator, button, input, textarea, scroll-view { box-sizing: border-box; } button { margin: 0; padding: 0; background: transparent; border: none; line-height: inherit; &::after { border: none; } } /* 通用工具类 */ .flex { display: flex; } .flex-column { flex-direction: column; } .flex-center { justify-content: center; align-items: center; } .flex-between { justify-content: space-between; align-items: center; } .flex-around { justify-content: space-around; align-items: center; } .flex-1 { flex: 1; } .text-center { text-align: center; } .text-right { text-align: right; } /* 状态栏 */ .status-bar { height: $status-bar-height; background: $primary-color; display: flex; justify-content: space-between; align-items: center; padding: 0 $spacing-md; font-size: $font-size-xs; color: #ffffff; &.dark { background: #ffffff; color: $text-primary; } } /* 导航栏 */ .nav-bar { height: $nav-bar-height; background: $primary-color; color: #ffffff; display: flex; align-items: center; padding: 0 $spacing-base; font-size: $font-size-lg; font-weight: 600; .back-btn { margin-right: 8px; font-size: $font-size-xl; padding: 4px; } .nav-title { flex: 1; text-align: center; margin-right: 28px; } &.light { background: #ffffff; color: $text-primary; border-bottom: 1px solid $border-color; .nav-title { color: $text-primary; } } } /* 底部 TabBar */ .tab-bar { height: $tab-bar-height; background: #ffffff; display: flex; border-top: 1px solid $border-color; .tab-bar-item { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; position: relative; .tab-label { font-size: $font-size-md; color: $text-placeholder; } &.active .tab-label { color: $primary-color; font-weight: 600; } .tab-dot { position: absolute; top: 4px; right: 50%; margin-right: -16px; width: 6px; height: 6px; background: $danger-color; border-radius: 50%; } } } /* 页面容器 */ .page-container { min-height: 100vh; display: flex; flex-direction: column; } .page-body { flex: 1; overflow-y: auto; } /* 卡片样式 */ .card { background: #ffffff; border-radius: $border-radius-md; padding: $spacing-base $spacing-md; margin-bottom: $spacing-sm; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); } /* 表单样式 */ .form-section { padding: $spacing-base $spacing-md; } .form-group { background: #ffffff; border-radius: $border-radius-md; padding: 0 $spacing-md; margin-bottom: $spacing-base; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); } .form-item { display: flex; align-items: center; min-height: 48px; border-bottom: 1px solid $border-light; &:last-child { border-bottom: none; } } .form-label { width: 90px; font-size: $font-size-base; color: $text-secondary; flex-shrink: 0; &.required::before { content: '*'; color: $danger-color; margin-right: 2px; } } .form-value { flex: 1; font-size: $font-size-md; color: $text-primary; text-align: right; } .form-input { flex: 1; border: none; outline: none; text-align: right; font-size: $font-size-md; color: $text-primary; height: 48px; background: transparent; } .form-arrow { color: #cccccc; font-size: $font-size-sm; margin-left: 4px; } /* 按钮样式 */ .btn-area { padding: $spacing-base $spacing-md $spacing-xl; display: flex; gap: $spacing-base; } .btn { flex: 1; height: 44px; border-radius: $border-radius-md; border: none; font-size: $font-size-lg; font-weight: 600; display: flex; align-items: center; justify-content: center; &-primary { background: $primary-color; color: #ffffff; } &-success { background: $success-color; color: #ffffff; } &-warning { background: $warning-color; color: #ffffff; } &-danger { background: $danger-color; color: #ffffff; } &-outline { background: #ffffff; color: $primary-color; border: 1.5px solid $primary-color; } &-block { width: 100%; } &-sm { height: 32px; line-height: 32px; padding: 0 12px; font-size: $font-size-md; } } /* 带按钮的输入框行 */ .input-row { display: flex; align-items: center; flex: 1; } .input-extra { display: flex; align-items: center; margin-left: 8px; gap: 6px; } /* 数据卡片 */ .data-list { padding: $spacing-sm $spacing-md; } .data-card { background: #ffffff; border-radius: $border-radius-md; padding: $spacing-base $spacing-md; margin-bottom: $spacing-base; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); } .data-card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: $spacing-sm; } .data-card-title { font-size: $font-size-md; font-weight: 600; color: $text-primary; } .data-card-tag { font-size: $font-size-xs; padding: 2px 8px; border-radius: 4px; &.blue { background: $tag-blue; color: $tag-blue-text; } &.green { background: $tag-green; color: $tag-green-text; } &.orange { background: $tag-orange; color: $tag-orange-text; } &.red { background: $tag-red; color: $tag-red-text; } &.grey { background: $tag-grey; color: $tag-grey-text; } } .data-card-row { display: flex; justify-content: space-between; font-size: $font-size-sm; color: $text-secondary; margin-top: 4px; .val { color: $text-primary; font-weight: 500; } } .data-card-actions { display: flex; gap: $spacing-sm; margin-top: $spacing-base; padding-top: $spacing-base; border-top: 1px solid $border-light; } /* 提示条 */ .tip-bar { padding: $spacing-sm $spacing-md; font-size: $font-size-sm; &-info { background: #e6f7ff; color: $primary-color; } &-success { background: #f6ffed; color: $success-color; } &-warning { background: #fff7e6; color: #d48806; } &-danger { background: #fff1f0; color: $danger-color; } } /* 搜索栏 */ .search-bar { padding: $spacing-sm $spacing-md; background: #ffffff; } .search-input { width: 100%; height: 36px; background: $bg-primary; border: 1px solid $border-color; border-radius: 18px; padding: 0 $spacing-md; font-size: $font-size-base; outline: none; } /* 筛选栏 */ .filter-bar { background: #ffffff; padding: $spacing-sm $spacing-md; display: flex; align-items: center; gap: $spacing-sm; border-bottom: 1px solid $border-color; } .filter-input { flex: 1; height: 34px; background: $bg-primary; border: 1px solid #e8e8e8; border-radius: $border-radius-sm; padding: 0 $spacing-base; font-size: $font-size-base; color: $text-primary; outline: none; display: flex; align-items: center; } .filter-btn { height: 34px; padding: 0 14px; background: $primary-color; color: #ffffff; border: none; border-radius: $border-radius-sm; font-size: $font-size-base; white-space: nowrap; } /* 切换开关 */ .switch { position: relative; width: 44px; height: 24px; background: #dddddd; border-radius: 12px; transition: background 0.3s; flex-shrink: 0; &.on { background: $primary-color; } &::after { content: ''; position: absolute; top: 2px; left: 2px; width: 20px; height: 20px; background: #ffffff; border-radius: 50%; transition: left 0.3s; } &.on::after { left: 22px; } } /* Tab 标签 */ .tabs { display: flex; background: #ffffff; border-bottom: 1px solid $border-color; } .tab { flex: 1; height: 40px; display: flex; align-items: center; justify-content: center; font-size: $font-size-base; color: $text-secondary; border-bottom: 2px solid transparent; &.active { color: $primary-color; border-bottom-color: $primary-color; font-weight: 600; } } /* 台账菜单项 */ .ledger-menu { padding: $spacing-md; } .ledger-item { background: #ffffff; border-radius: $border-radius-md; padding: $spacing-md; margin-bottom: $spacing-base; display: flex; align-items: center; gap: $spacing-base; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); } .ledger-icon { width: 44px; height: 44px; border-radius: $border-radius-md; display: flex; align-items: center; justify-content: center; background: #f0f0f0; flex-shrink: 0; .iconfont { font-size: $font-size-xl; } } .ledger-text { flex: 1; .title { display: block; font-size: $font-size-md; color: $text-primary; margin-bottom: 2px; } .desc { display: block; font-size: $font-size-sm; color: $text-placeholder; } } .ledger-badge { background: $danger-color; color: #ffffff; font-size: $font-size-xs; padding: 1px 6px; border-radius: 8px; margin-right: $spacing-xs; } .ledger-arrow { color: #cccccc; font-size: $font-size-md; } /* 设置页面 */ .settings-section { padding: $spacing-md $spacing-md $spacing-sm; } .settings-user { background: $primary-color; border-radius: $border-radius-xl; padding: $spacing-lg $spacing-md; color: #ffffff; margin-bottom: $spacing-md; display: flex; align-items: center; gap: $spacing-base; } .settings-avatar { width: 48px; height: 48px; background: rgba(255, 255, 255, 0.2); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: $font-size-xl; } .settings-name { display: block; font-size: $font-size-lg; font-weight: 600; } .settings-role { display: block; font-size: $font-size-sm; opacity: 0.8; margin-top: 2px; } .settings-group { background: #ffffff; border-radius: $border-radius-md; margin-bottom: $spacing-base; overflow: hidden; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); } .settings-item { display: flex; align-items: center; padding: 14px $spacing-md; border-bottom: 1px solid $border-light; &:last-child { border-bottom: none; } } .s-icon { width: 32px; height: 32px; border-radius: $border-radius-sm; display: flex; align-items: center; justify-content: center; font-size: $font-size-lg; background: #f0f0f0; margin-right: $spacing-base; flex-shrink: 0; } .s-text { flex: 1; .s-title { display: block; font-size: $font-size-md; color: $text-primary; } .s-desc { display: block; font-size: $font-size-sm; color: $text-placeholder; margin-top: 1px; } } .s-extra { font-size: $font-size-sm; color: $text-placeholder; margin-right: $spacing-xs; } .s-arrow { color: #cccccc; font-size: $font-size-md; } .version-info { text-align: center; padding: $spacing-md; color: #bbbbbb; font-size: $font-size-xs; line-height: 1.8; } /* 子菜单 */ .sub-menu { padding: $spacing-md; } .sub-menu-item { background: #ffffff; border-radius: $border-radius-sm; padding: 14px; margin-bottom: $spacing-sm; display: flex; align-items: center; gap: $spacing-base; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); } .sub-menu-icon { width: 38px; height: 38px; border-radius: $border-radius-sm; display: flex; align-items: center; justify-content: center; font-size: $font-size-lg; background: #f0f0f0; flex-shrink: 0; } .sub-menu-text { flex: 1; .title { display: block; font-size: $font-size-base; color: $text-primary; margin-bottom: 1px; } .desc { display: block; font-size: $font-size-sm; color: $text-placeholder; } } .sub-menu-arrow { color: #cccccc; font-size: $font-size-md; } /* 设备管理 */ .device-section { padding: $spacing-md; } .device-card { background: #ffffff; border-radius: $border-radius-md; padding: $spacing-md; margin-bottom: $spacing-base; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); } .device-header { display: flex; align-items: center; gap: $spacing-sm; margin-bottom: $spacing-base; } .device-icon { font-size: $font-size-lg; } .device-title { font-size: $font-size-md; color: $text-primary; font-weight: 600; } .device-status { display: flex; align-items: center; gap: $spacing-sm; margin-bottom: $spacing-base; } .device-dot { width: 8px; height: 8px; border-radius: 50%; &.online { background: $success-color; } &.offline { background: #999; } } .device-info { border-top: 1px solid $border-light; padding-top: $spacing-sm; } .info-row { display: flex; justify-content: space-between; align-items: center; padding: $spacing-sm 0; border-bottom: 1px solid $border-light; font-size: $font-size-sm; &:last-child { border-bottom: none; } .label { color: $text-secondary; } .value { color: $text-primary; } } .device-actions { display: flex; gap: $spacing-sm; margin-top: $spacing-base; } /* 统计卡片 */ .stat-cards { display: grid; grid-template-columns: repeat(2, 1fr); gap: $spacing-base; padding: $spacing-md; } .stat-card { background: #ffffff; border-radius: $border-radius-md; padding: $spacing-base; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); } .stat-label { font-size: $font-size-sm; color: $text-placeholder; } .stat-number { font-size: $font-size-xxl; font-weight: 700; color: $text-primary; margin-top: $spacing-xs; } .stat-unit { font-size: $font-size-base; color: $text-placeholder; font-weight: 400; } /* 柱状图 */ .bar-chart { padding: 0 $spacing-md; } .bar-row { display: flex; align-items: center; gap: $spacing-sm; margin-bottom: $spacing-sm; } .bar-label { width: 50px; font-size: $font-size-sm; color: $text-secondary; text-align: right; flex-shrink: 0; } .bar-track { flex: 1; height: 20px; background: #f0f0f0; border-radius: 4px; overflow: hidden; } .bar-fill { height: 100%; border-radius: 4px; display: flex; align-items: center; padding-left: 6px; font-size: $font-size-xs; color: #ffffff; &.red { background: $danger-color; } &.orange { background: $warning-color; } &.blue { background: $primary-color; } &.green { background: $success-color; } } /* 图表标题 */ .chart-title { padding: 0 $spacing-md $spacing-sm; font-size: $font-size-base; font-weight: 600; color: $text-primary; } /* 底部操作区 */ .bottom-action { padding: $spacing-base $spacing-md; background: #ffffff; border-top: 1px solid $border-color; } /* 同步页面 */ .sync-container { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 48px $spacing-md; } .sync-icon { font-size: 64px; margin-bottom: $spacing-md; } .sync-title { font-size: $font-size-xl; font-weight: 600; color: $text-primary; margin-bottom: $spacing-sm; } .sync-desc { font-size: $font-size-base; color: $text-secondary; text-align: center; line-height: 1.8; margin-bottom: $spacing-xl; } .sync-warning { background: $tag-orange; border-radius: $border-radius-md; padding: 14px; width: 100%; margin-bottom: $spacing-xl; font-size: $font-size-sm; color: #d48806; line-height: 1.6; } .sync-actions { display: flex; gap: $spacing-base; width: 100%; } .sync-last { margin-top: $spacing-xl; text-align: center; } .last-label { display: block; font-size: $font-size-sm; color: $text-placeholder; } .last-time { display: block; font-size: $font-size-md; color: $text-primary; font-weight: 500; margin-top: $spacing-xs; }