|
|
@@ -17,12 +17,14 @@ templ Page(title string, active string, locale Locale, englishURL string, persia
|
|
|
|
<meta name="htmx-config" content='{"historyRestoreAsHxRequest":false,"selfRequestsOnly":true}'/>
|
|
|
|
<meta name="htmx-config" content='{"historyRestoreAsHxRequest":false,"selfRequestsOnly":true}'/>
|
|
|
|
<title>{ title } · { tr(locale, "site_name") }</title>
|
|
|
|
<title>{ title } · { tr(locale, "site_name") }</title>
|
|
|
|
<link rel="icon" href="/favicon.ico" sizes="any"/>
|
|
|
|
<link rel="icon" href="/favicon.ico" sizes="any"/>
|
|
|
|
|
|
|
|
<script src="/theme.js"></script>
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.10/dist/htmx.min.js" integrity="sha384-H5SrcfygHmAuTDZphMHqBJLc3FhssKjG7w/CeCpFReSfwBWDTKpkzPP8c+cLsK+V" crossorigin="anonymous"></script>
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.10/dist/htmx.min.js" integrity="sha384-H5SrcfygHmAuTDZphMHqBJLc3FhssKjG7w/CeCpFReSfwBWDTKpkzPP8c+cLsK+V" crossorigin="anonymous"></script>
|
|
|
|
<style>
|
|
|
|
<style>
|
|
|
|
:root { --ink:#1f2a2c; --muted:rgba(31,42,44,.68); --paper:#F5F5F5; --surface:#DFF1F1; --card:#ffffff; --line:rgba(31,42,44,.15); --teal:#BBD5DA; --accent:#FF0000; --shadow:0 18px 50px rgba(31,42,44,.10); }
|
|
|
|
:root { color-scheme:light; --ink:#1f2a2c; --on-ink:#ffffff; --muted:rgba(31,42,44,.68); --paper:#F5F5F5; --surface:#DFF1F1; --card:#ffffff; --glass:rgba(255,255,255,.78); --hover:rgba(223,241,241,.72); --line:rgba(31,42,44,.15); --teal:#BBD5DA; --accent:#FF0000; --positive:#497f82; --teal-glow:rgba(187,213,218,.48); --accent-glow:rgba(255,0,0,.04); --shadow:0 18px 50px rgba(31,42,44,.10); }
|
|
|
|
|
|
|
|
html[data-theme="dark"] { color-scheme:dark; --ink:#F5F5F5; --on-ink:#1f2a2c; --muted:rgba(223,241,241,.68); --paper:#101719; --surface:#253639; --card:#182326; --glass:rgba(24,35,38,.86); --hover:rgba(37,54,57,.82); --line:rgba(187,213,218,.18); --teal:#BBD5DA; --accent:#FF0000; --positive:#9bc8cc; --teal-glow:rgba(187,213,218,.12); --accent-glow:rgba(255,0,0,.08); --shadow:0 18px 50px rgba(0,0,0,.28); }
|
|
|
|
* { box-sizing:border-box; }
|
|
|
|
* { box-sizing:border-box; }
|
|
|
|
html { background:var(--paper); color:var(--ink); font-family:Inter,Tahoma,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif; }
|
|
|
|
html { background:var(--paper); color:var(--ink); font-family:Inter,Tahoma,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif; }
|
|
|
|
body { margin:0; min-height:100vh; background:radial-gradient(circle at 78% 0%,rgba(187,213,218,.48),transparent 30rem),radial-gradient(circle at 5% 30%,rgba(255,0,0,.04),transparent 24rem),var(--paper); }
|
|
|
|
body { margin:0; min-height:100vh; background:radial-gradient(circle at 78% 0%,var(--teal-glow),transparent 30rem),radial-gradient(circle at 5% 30%,var(--accent-glow),transparent 24rem),var(--paper); }
|
|
|
|
a { color:inherit; }
|
|
|
|
a { color:inherit; }
|
|
|
|
.shell { width:min(1180px,calc(100% - 40px)); margin:0 auto; }
|
|
|
|
.shell { width:min(1180px,calc(100% - 40px)); margin:0 auto; }
|
|
|
|
.topbar { min-height:76px; display:flex; align-items:center; justify-content:space-between; border-bottom:1px solid var(--line); }
|
|
|
|
.topbar { min-height:76px; display:flex; align-items:center; justify-content:space-between; border-bottom:1px solid var(--line); }
|
|
|
@@ -32,22 +34,24 @@ templ Page(title string, active string, locale Locale, englishURL string, persia
|
|
|
|
.nav { display:flex; gap:6px; align-items:center; }
|
|
|
|
.nav { display:flex; gap:6px; align-items:center; }
|
|
|
|
.nav a { padding:10px 13px; border-radius:999px; text-decoration:none; color:var(--muted); font-size:13px; font-weight:700; }
|
|
|
|
.nav a { padding:10px 13px; border-radius:999px; text-decoration:none; color:var(--muted); font-size:13px; font-weight:700; }
|
|
|
|
.nav a:hover,.nav a.active { color:var(--ink); background:var(--surface); }
|
|
|
|
.nav a:hover,.nav a.active { color:var(--ink); background:var(--surface); }
|
|
|
|
.live { display:flex; align-items:center; gap:8px; margin-inline-start:10px; padding:8px 11px; border:1px solid var(--line); border-radius:999px; font:700 11px/1 ui-monospace,SFMono-Regular,monospace; background:rgba(255,255,255,.62); }
|
|
|
|
.live { display:flex; align-items:center; gap:8px; margin-inline-start:10px; padding:8px 11px; border:1px solid var(--line); border-radius:999px; font:700 11px/1 ui-monospace,SFMono-Regular,monospace; background:var(--glass); }
|
|
|
|
.dot { width:7px; height:7px; background:var(--teal); border-radius:50%; box-shadow:0 0 0 4px rgba(187,213,218,.35); }
|
|
|
|
.dot { width:7px; height:7px; background:var(--teal); border-radius:50%; box-shadow:0 0 0 4px rgba(187,213,218,.35); }
|
|
|
|
.language-switch { display:flex; padding:3px; margin-inline-start:8px; border:1px solid var(--line); border-radius:999px; background:rgba(255,255,255,.62); direction:ltr; }
|
|
|
|
.theme-toggle { width:34px; height:34px; flex:none; margin-inline-start:8px; border:1px solid var(--line); border-radius:50%; background:var(--glass); color:var(--ink); cursor:pointer; font-size:17px; line-height:1; }
|
|
|
|
|
|
|
|
.theme-toggle:hover { background:var(--surface); }
|
|
|
|
|
|
|
|
.language-switch { display:flex; padding:3px; margin-inline-start:8px; border:1px solid var(--line); border-radius:999px; background:var(--glass); direction:ltr; }
|
|
|
|
.language-switch a { padding:6px 8px; font:800 10px/1 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
.language-switch a { padding:6px 8px; font:800 10px/1 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
.language-switch a.active { background:var(--ink); color:white; }
|
|
|
|
.language-switch a.active { background:var(--ink); color:var(--on-ink); }
|
|
|
|
main { padding:62px 0 90px; }
|
|
|
|
main { padding:62px 0 90px; }
|
|
|
|
.eyebrow { display:flex; align-items:center; gap:9px; color:var(--teal); text-transform:uppercase; letter-spacing:.14em; font:800 11px/1 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
.eyebrow { display:flex; align-items:center; gap:9px; color:var(--teal); text-transform:uppercase; letter-spacing:.14em; font:800 11px/1 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
.eyebrow:before { content:""; width:26px; height:2px; background:var(--accent); }
|
|
|
|
.eyebrow:before { content:""; width:26px; height:2px; background:var(--accent); }
|
|
|
|
h1 { max-width:830px; margin:20px 0 14px; font-size:clamp(42px,7vw,82px); line-height:.94; letter-spacing:-.065em; font-weight:850; }
|
|
|
|
h1 { max-width:830px; margin:20px 0 14px; font-size:clamp(42px,7vw,82px); line-height:.94; letter-spacing:-.065em; font-weight:850; }
|
|
|
|
.lede { max-width:660px; margin:0; color:var(--muted); font-size:17px; line-height:1.65; }
|
|
|
|
.lede { max-width:660px; margin:0; color:var(--muted); font-size:17px; line-height:1.65; }
|
|
|
|
.search { display:flex; gap:10px; margin:34px 0 46px; padding:9px; border:1px solid var(--line); border-radius:16px; background:rgba(255,255,255,.88); box-shadow:var(--shadow); }
|
|
|
|
.search { display:flex; gap:10px; margin:34px 0 46px; padding:9px; border:1px solid var(--line); border-radius:16px; background:var(--glass); box-shadow:var(--shadow); }
|
|
|
|
.search input { flex:1; min-width:0; border:0; outline:0; background:transparent; padding:9px 12px; color:var(--ink); font:500 14px/1.4 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
.search input { flex:1; min-width:0; border:0; outline:0; background:transparent; padding:9px 12px; color:var(--ink); font:500 14px/1.4 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
.search button,.button { border:0; border-radius:10px; background:var(--accent); color:white; padding:13px 18px; font-weight:800; cursor:pointer; }
|
|
|
|
.search button,.button { border:0; border-radius:10px; background:var(--accent); color:white; padding:13px 18px; font-weight:800; cursor:pointer; }
|
|
|
|
.search button:hover,.button:hover { background:var(--ink); }
|
|
|
|
.search button:hover,.button:hover { background:var(--ink); color:var(--on-ink); }
|
|
|
|
.stats { display:grid; grid-template-columns:repeat(4,1fr); gap:12px; margin-bottom:46px; }
|
|
|
|
.stats { display:grid; grid-template-columns:repeat(4,1fr); gap:12px; margin-bottom:46px; }
|
|
|
|
.stat { min-height:136px; padding:22px; border:1px solid var(--line); border-radius:16px; background:rgba(255,255,255,.78); }
|
|
|
|
.stat { min-height:136px; padding:22px; border:1px solid var(--line); border-radius:16px; background:var(--glass); }
|
|
|
|
.stat.accent { background:var(--accent); border-color:var(--accent); color:white; }
|
|
|
|
.stat.accent { background:var(--accent); border-color:var(--accent); color:white; }
|
|
|
|
.stat.accent .stat-label { color:rgba(255,255,255,.78); }
|
|
|
|
.stat.accent .stat-label { color:rgba(255,255,255,.78); }
|
|
|
|
.stat-label { color:var(--muted); text-transform:uppercase; letter-spacing:.13em; font:750 10px/1 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
.stat-label { color:var(--muted); text-transform:uppercase; letter-spacing:.13em; font:750 10px/1 ui-monospace,SFMono-Regular,monospace; }
|
|
|
@@ -62,7 +66,7 @@ templ Page(title string, active string, locale Locale, englishURL string, persia
|
|
|
|
th { padding:14px 18px; background:var(--surface); color:var(--ink); text-align:start; text-transform:uppercase; letter-spacing:.1em; font:750 9px/1 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
th { padding:14px 18px; background:var(--surface); color:var(--ink); text-align:start; text-transform:uppercase; letter-spacing:.1em; font:750 9px/1 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
td { padding:17px 18px; border-top:1px solid var(--line); font-size:13px; vertical-align:middle; }
|
|
|
|
td { padding:17px 18px; border-top:1px solid var(--line); font-size:13px; vertical-align:middle; }
|
|
|
|
tr:first-child td { border-top:0; }
|
|
|
|
tr:first-child td { border-top:0; }
|
|
|
|
tr:hover td { background:rgba(223,241,241,.72); }
|
|
|
|
tr:hover td { background:var(--hover); }
|
|
|
|
.mono { font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:12px; direction:ltr; unicode-bidi:isolate; }
|
|
|
|
.mono { font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:12px; direction:ltr; unicode-bidi:isolate; }
|
|
|
|
.hash-link { font-weight:750; text-decoration:none; border-bottom:1px solid var(--teal); }
|
|
|
|
.hash-link { font-weight:750; text-decoration:none; border-bottom:1px solid var(--teal); }
|
|
|
|
.pill { display:inline-flex; padding:6px 9px; border-radius:999px; background:var(--surface); font:750 10px/1 ui-monospace,SFMono-Regular,monospace; text-transform:uppercase; }
|
|
|
|
.pill { display:inline-flex; padding:6px 9px; border-radius:999px; background:var(--surface); font:750 10px/1 ui-monospace,SFMono-Regular,monospace; text-transform:uppercase; }
|
|
|
@@ -74,7 +78,7 @@ templ Page(title string, active string, locale Locale, englishURL string, persia
|
|
|
|
.pagination a,.pagination span { min-width:42px; padding:10px 13px; border:1px solid var(--line); border-radius:10px; text-align:center; text-decoration:none; font:750 11px/1 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
.pagination a,.pagination span { min-width:42px; padding:10px 13px; border:1px solid var(--line); border-radius:10px; text-align:center; text-decoration:none; font:750 11px/1 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
.pagination a { background:var(--card); }
|
|
|
|
.pagination a { background:var(--card); }
|
|
|
|
.pagination a:hover { background:var(--surface); }
|
|
|
|
.pagination a:hover { background:var(--surface); }
|
|
|
|
.pagination .current { background:var(--ink); color:white; border-color:var(--ink); }
|
|
|
|
.pagination .current { background:var(--ink); color:var(--on-ink); border-color:var(--ink); }
|
|
|
|
.pagination .disabled { color:var(--muted); opacity:.45; }
|
|
|
|
.pagination .disabled { color:var(--muted); opacity:.45; }
|
|
|
|
.transaction-filters { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr) auto auto; gap:10px; margin-bottom:14px; padding:14px; border:1px solid var(--line); border-radius:14px; background:var(--card); }
|
|
|
|
.transaction-filters { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr) auto auto; gap:10px; margin-bottom:14px; padding:14px; border:1px solid var(--line); border-radius:14px; background:var(--card); }
|
|
|
|
.transaction-filters .field input { height:40px; }
|
|
|
|
.transaction-filters .field input { height:40px; }
|
|
|
@@ -87,7 +91,7 @@ templ Page(title string, active string, locale Locale, englishURL string, persia
|
|
|
|
.journal { border:1px solid var(--line); border-radius:18px; background:var(--card); overflow:hidden; box-shadow:var(--shadow); }
|
|
|
|
.journal { border:1px solid var(--line); border-radius:18px; background:var(--card); overflow:hidden; box-shadow:var(--shadow); }
|
|
|
|
.journal-head { padding:22px; display:flex; gap:20px; align-items:flex-start; justify-content:space-between; border-bottom:1px solid var(--line); }
|
|
|
|
.journal-head { padding:22px; display:flex; gap:20px; align-items:flex-start; justify-content:space-between; border-bottom:1px solid var(--line); }
|
|
|
|
.journal-head h2 { margin:8px 0 0; max-width:770px; overflow-wrap:anywhere; font:750 14px/1.5 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
.journal-head h2 { margin:8px 0 0; max-width:770px; overflow-wrap:anywhere; font:750 14px/1.5 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
.status { flex:none; padding:7px 10px; border-radius:999px; background:var(--teal); color:var(--ink); font:800 10px/1 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
.status { flex:none; padding:7px 10px; border-radius:999px; background:var(--teal); color:#1f2a2c; font:800 10px/1 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
.detail-grid { display:grid; grid-template-columns:repeat(3,1fr); gap:1px; background:var(--line); border-bottom:1px solid var(--line); }
|
|
|
|
.detail-grid { display:grid; grid-template-columns:repeat(3,1fr); gap:1px; background:var(--line); border-bottom:1px solid var(--line); }
|
|
|
|
.detail { min-width:0; padding:18px 22px; background:var(--card); }
|
|
|
|
.detail { min-width:0; padding:18px 22px; background:var(--card); }
|
|
|
|
.detail label { display:block; margin-bottom:8px; color:var(--muted); text-transform:uppercase; letter-spacing:.1em; font:750 9px/1 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
.detail label { display:block; margin-bottom:8px; color:var(--muted); text-transform:uppercase; letter-spacing:.1em; font:750 9px/1 ui-monospace,SFMono-Regular,monospace; }
|
|
|
@@ -100,13 +104,13 @@ templ Page(title string, active string, locale Locale, englishURL string, persia
|
|
|
|
.entry-account a { font-weight:700; text-decoration:none; }
|
|
|
|
.entry-account a { font-weight:700; text-decoration:none; }
|
|
|
|
.entry-account small { display:block; color:var(--muted); margin-top:4px; }
|
|
|
|
.entry-account small { display:block; color:var(--muted); margin-top:4px; }
|
|
|
|
.amount { text-align:end; direction:ltr; font:800 13px/1 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
.amount { text-align:end; direction:ltr; font:800 13px/1 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
.amount.positive { color:#497f82; }
|
|
|
|
.amount.positive { color:var(--positive); }
|
|
|
|
.amount.negative { color:var(--accent); }
|
|
|
|
.amount.negative { color:var(--accent); }
|
|
|
|
.notice { margin-top:28px; padding:20px; border:1px solid rgba(255,0,0,.32); border-radius:14px; background:rgba(255,0,0,.06); color:var(--ink); }
|
|
|
|
.notice { margin-top:28px; padding:20px; border:1px solid rgba(255,0,0,.32); border-radius:14px; background:rgba(255,0,0,.06); color:var(--ink); }
|
|
|
|
.notice strong { display:block; margin-bottom:5px; }
|
|
|
|
.notice strong { display:block; margin-bottom:5px; }
|
|
|
|
.account-form { display:grid; grid-template-columns:1.25fr 1fr 1.2fr .65fr auto; gap:10px; margin:34px 0; padding:14px; border:1px solid var(--line); border-radius:16px; background:var(--card); box-shadow:var(--shadow); }
|
|
|
|
.account-form { display:grid; grid-template-columns:1.25fr 1fr 1.2fr .65fr auto; gap:10px; margin:34px 0; padding:14px; border:1px solid var(--line); border-radius:16px; background:var(--card); box-shadow:var(--shadow); }
|
|
|
|
.field label { display:block; margin:0 0 7px 3px; color:var(--muted); text-transform:uppercase; letter-spacing:.09em; font:750 9px/1 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
.field label { display:block; margin:0 0 7px 3px; color:var(--muted); text-transform:uppercase; letter-spacing:.09em; font:750 9px/1 ui-monospace,SFMono-Regular,monospace; }
|
|
|
|
.field input,.field select { width:100%; height:43px; border:1px solid var(--line); border-radius:9px; outline:0; padding:0 11px; background:white; color:var(--ink); }
|
|
|
|
.field input,.field select { width:100%; height:43px; border:1px solid var(--line); border-radius:9px; outline:0; padding:0 11px; background:var(--card); color:var(--ink); }
|
|
|
|
.field input:focus,.field select:focus { border-color:var(--teal); box-shadow:0 0 0 3px rgba(187,213,218,.42); }
|
|
|
|
.field input:focus,.field select:focus { border-color:var(--teal); box-shadow:0 0 0 3px rgba(187,213,218,.42); }
|
|
|
|
.account-form button { align-self:end; height:43px; }
|
|
|
|
.account-form button { align-self:end; height:43px; }
|
|
|
|
.account-card { display:grid; grid-template-columns:1.35fr .65fr; gap:1px; background:var(--line); border:1px solid var(--line); border-radius:18px; overflow:hidden; margin-bottom:30px; }
|
|
|
|
.account-card { display:grid; grid-template-columns:1.35fr .65fr; gap:1px; background:var(--line); border:1px solid var(--line); border-radius:18px; overflow:hidden; margin-bottom:30px; }
|
|
|
@@ -151,6 +155,7 @@ templ Page(title string, active string, locale Locale, englishURL string, persia
|
|
|
|
<a href="/accounts">{ tr(locale, "accounts") }</a>
|
|
|
|
<a href="/accounts">{ tr(locale, "accounts") }</a>
|
|
|
|
}
|
|
|
|
}
|
|
|
|
<span class="live"><span class="dot"></span> { tr(locale, "read_only") }</span>
|
|
|
|
<span class="live"><span class="dot"></span> { tr(locale, "read_only") }</span>
|
|
|
|
|
|
|
|
<button class="theme-toggle" type="button" data-theme-toggle data-light-label={ tr(locale, "light_mode") } data-dark-label={ tr(locale, "dark_mode") } aria-label={ tr(locale, "dark_mode") } aria-pressed="false"><span data-theme-icon aria-hidden="true">☾</span></button>
|
|
|
|
<span class="language-switch" aria-label="Language">
|
|
|
|
<span class="language-switch" aria-label="Language">
|
|
|
|
if locale == LocaleEnglish {
|
|
|
|
if locale == LocaleEnglish {
|
|
|
|
<a class="active" href={ templ.URL(englishURL) } hx-boost="false" lang="en">EN</a>
|
|
|
|
<a class="active" href={ templ.URL(englishURL) } hx-boost="false" lang="en">EN</a>
|
|
|
|