chore: 初始提交 - 移除所有硬编码凭据,统一从环境变量读取
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
body.theme-expense { background: var(--color-bg) }
|
||||
body.theme-expense .container { color: var(--color-text) }
|
||||
body.theme-expense h2 { color: var(--color-text) }
|
||||
body.theme-expense .panel.card { background: var(--color-card); border: 1px solid var(--color-border); border-radius: var(--radius); box-shadow: var(--shadow); padding: var(--gap) }
|
||||
body.theme-expense .expense-layout { display: grid; grid-template-columns: 1fr; gap: var(--gap) }
|
||||
/* 顶部胶囊标签 */
|
||||
body.theme-expense .expense-tabs .tabs { display:flex; gap:10px; padding:0 }
|
||||
body.theme-expense .expense-tabs .tab { display:flex; align-items:center; gap:8px; padding:10px 20px; border-radius:999px; font-size:14px; font-weight:500; cursor:pointer; user-select:none; transition: all .3s cubic-bezier(0.4,0,0.2,1); position:relative; overflow:hidden; backdrop-filter: blur(8px) }
|
||||
/* 暗黑 */
|
||||
body.theme-expense[data-theme="dark"] .expense-tabs .tab { background: rgba(17,24,39,0.8); border:1px solid rgba(31,41,55,0.5); color:#cbd5e1; box-shadow: 0 2px 6px rgba(0,0,0,0.1), inset 0 1px 0 rgba(255,255,255,0.05) }
|
||||
body.theme-expense[data-theme="dark"] .expense-tabs .tab:hover { background: rgba(26,35,52,0.6); border-color: rgba(51,65,85,0.5); transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0,0,0,0.15), inset 0 1px 0 rgba(255,255,255,0.10) }
|
||||
body.theme-expense[data-theme="dark"] .expense-tabs .tab.active { background: rgba(37,99,235,0.20); border-color: rgba(59,130,246,0.5); color:#fff; box-shadow: 0 8px 24px rgba(37,99,235,0.25) }
|
||||
/* 明亮 */
|
||||
body.theme-expense[data-theme="light"] .expense-tabs .tab { background: #ffffff; border:1px solid var(--color-border); color: var(--color-text); box-shadow: 0 2px 6px rgba(0,0,0,0.06) }
|
||||
body.theme-expense[data-theme="light"] .expense-tabs .tab:hover { background: #f8fafc; border-color: var(--color-border); transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0,0,0,0.08) }
|
||||
body.theme-expense[data-theme="light"] .expense-tabs .tab.active { background: rgba(37,99,235,0.12); border-color: var(--color-primary); color: var(--color-text); box-shadow: 0 8px 24px rgba(37,99,235,0.15) }
|
||||
@media (max-width: 768px) { body.theme-expense .expense-tabs .tabs { flex-wrap: wrap; justify-content: center; gap:8px; padding:6px } body.theme-expense .expense-tabs .tab { padding:8px 16px; font-size:13px } }
|
||||
/* 表格卡片 */
|
||||
body.theme-expense .list-card { background: var(--table-bg); border: 1px solid var(--table-border); border-radius: var(--table-radius); overflow: hidden; box-shadow: var(--shadow-sm) }
|
||||
body.theme-expense .grid { width: 100%; border-collapse: collapse; background: var(--table-bg) }
|
||||
body.theme-expense .grid thead { background: var(--table-header-bg); position: sticky; top: 0 }
|
||||
body.theme-expense .grid th { padding: 10px 12px; text-align: left; font-weight: 600; font-size: inherit; color: var(--text-primary); border-bottom: 2px solid var(--table-border) }
|
||||
body.theme-expense .grid td { padding: 10px 12px; border-bottom: 1px solid var(--table-border); color: var(--color-text); font-size: inherit; transition: all .2s ease }
|
||||
body.theme-expense .grid tbody tr:nth-child(odd) { background: var(--table-row-odd) }
|
||||
body.theme-expense .grid tbody tr:nth-child(even) { background: var(--table-row-even) }
|
||||
body.theme-expense .grid tbody tr:hover { background: var(--table-row-hover); color: var(--table-text-hover) }
|
||||
/* 导航显示控制 */
|
||||
body.theme-expense:not(.nav-visible) #topbar { display: none }
|
||||
/* 头部图标样式(与云产品一致) */
|
||||
body.theme-expense[data-theme="dark"] .icon-toggle, body.theme-expense[data-theme="dark"] .icon-theme { border-color: var(--color-border) }
|
||||
body.theme-expense[data-theme="light"] .icon-toggle, body.theme-expense[data-theme="light"] .icon-theme { border-color: var(--color-border) }
|
||||
@@ -0,0 +1,40 @@
|
||||
;(function(){
|
||||
const ExpenseTheme = {
|
||||
init(){
|
||||
this.observeList()
|
||||
this.initNavToggle()
|
||||
this.initThemeToggle()
|
||||
},
|
||||
observeList(){
|
||||
const el=document.getElementById('ex-body')
|
||||
if(!el) return
|
||||
const mo=new MutationObserver(muts=>{
|
||||
muts.forEach(m=>{
|
||||
m.addedNodes.forEach(n=>{ if(n.nodeType===1) n.classList.add('fade-in') })
|
||||
})
|
||||
})
|
||||
mo.observe(el,{childList:true})
|
||||
},
|
||||
initNavToggle(){
|
||||
const key='expense_nav_visible'
|
||||
const btn=document.getElementById('expense-toggle-nav')
|
||||
const eye=`<svg width="16" height="16" viewBox="0 0 24 24"><path d="M1 12s4-7 11-7 11 7 11 7-4 7-11 7S1 12 1 12Z" fill="none" stroke="currentColor" stroke-width="2"/><circle cx="12" cy="12" r="3" fill="currentColor"/></svg>`
|
||||
const setVisible=(v)=>{ document.body.classList.toggle('nav-visible', !!v); if(btn) { btn.setAttribute('aria-pressed', v?'true':'false'); btn.title=v?'隐藏导航':'显示导航'; btn.innerHTML=eye } }
|
||||
const initVal=localStorage.getItem(key)==='1'
|
||||
setVisible(initVal)
|
||||
if(btn) btn.addEventListener('click',()=>{ const cur=document.body.classList.contains('nav-visible'); const next=!cur; localStorage.setItem(key, next?'1':'0'); setVisible(next) })
|
||||
},
|
||||
initThemeToggle(){
|
||||
const key='expense_theme'
|
||||
const btn=document.getElementById('expense-toggle-theme')
|
||||
const moon=`<svg width="16" height="16" viewBox="0 0 24 24"><path d="M21 12.79A9 9 0 1 1 11.21 3a7 7 0 1 0 9.79 9.79Z" fill="currentColor"/></svg>`
|
||||
const sun=`<svg width="16" height="16" viewBox="0 0 24 24"><circle cx="12" cy="12" r="4" fill="currentColor"/><path d="M12 2v3M12 19v3M4.22 4.22l2.12 2.12M17.66 17.66l2.12 2.12M2 12h3M19 12h3M4.22 19.78l2.12-2.12M17.66 6.34l2.12-2.12" stroke="currentColor" stroke-width="2"/></svg>`
|
||||
const apply=(mode)=>{ document.body.setAttribute('data-theme', mode); if(btn) btn.innerHTML=mode==='dark'?moon:sun }
|
||||
const init=localStorage.getItem(key) || 'dark'
|
||||
apply(init)
|
||||
if(btn) btn.addEventListener('click',()=>{ const cur=document.body.getAttribute('data-theme')||'dark'; const next=cur==='dark'?'light':'dark'; localStorage.setItem(key,next); apply(next) })
|
||||
}
|
||||
}
|
||||
window.ExpenseTheme=ExpenseTheme
|
||||
if(document.body && document.body.classList.contains('theme-expense')) { ExpenseTheme.init() }
|
||||
})();
|
||||
@@ -0,0 +1,6 @@
|
||||
body.theme-expense { --radius:12px; --shadow:0 6px 20px rgba(0,0,0,0.35); --gap:12px; --shadow-sm:0 2px 8px rgba(0,0,0,0.1); --shadow-md:0 4px 12px rgba(0,0,0,0.15); --shadow-lg:0 8px 24px rgba(0,0,0,0.2); --glow:0 0 0 3px rgba(59,130,246,0.2) }
|
||||
body.theme-expense[data-theme="dark"] { --color-bg:#0b1220; --color-card:#111827; --color-border:#1f2937; --color-text:#cbd5e1; --color-muted:#64748b; --color-primary:#2563eb; --color-primary-2:#1d4ed8; --color-accent:#10b981 }
|
||||
body.theme-expense[data-theme="light"] { --color-bg:#f3f4f6; --color-card:#ffffff; --color-border:#e5e7eb; --color-text:#0f172a; --color-muted:#475569; --color-primary:#2563eb; --color-primary-2:#1d4ed8; --color-accent:#059669 }
|
||||
/* table palette */
|
||||
body.theme-expense[data-theme="dark"] { --table-bg:#1e293b; --table-border:#334155; --table-radius:8px; --table-row-odd:#1a2536; --table-row-even:#1e293b; --table-header-bg:#0f172a; --table-row-hover:#2d3748; --table-text-hover:#ffffff; --text-primary:var(--color-text) }
|
||||
body.theme-expense[data-theme="light"] { --table-bg:#ffffff; --table-border:#e2e8f0; --table-radius:8px; --table-row-odd:#f8fafc; --table-row-even:#ffffff; --table-header-bg:#f1f5f9; --table-row-hover:#f1f5f9; --table-text-hover:#1e293b; --text-primary:var(--color-text) }
|
||||
Reference in New Issue
Block a user