Files
tsuki/assets/css/layout.css
T
tiennm99 e19bb67c88 feat: visual layer with vi typography, dark mode, view transitions (Phase 6)
- 9 CSS files (tokens, reset, typography, layout, components, home,
  archive, toc, view-transitions) bundled via resources.Concat
- 3 ES module JS files (theme-toggle, code-copy, toc-active); toc-active
  loaded only on long posts
- @view-transition: navigation auto for cross-page morph (CSS-only)
- TOC partial gated by WordCount>400 and Params.toc!=false; sticky on
  wide viewports, framed block on narrow
- render-heading.html adds cosmetic anchor links
- Hugo asset pipeline: resources.Concat | minify | fingerprint (no
  SCSS, no PostCSS, no Node)
- i18n/vi.yml extended with prev/next/posts/archiveEmpty/toggleTheme
- Bundle sizes: CSS 3.3 KB gz (budget 15), JS 0.8 KB gz (budget 8)

Config: github-ascii heading IDs, :contentbasename permalink token for
clean ASCII URLs, pagination.pagerSize migration (Hugo 0.128+).
2026-05-07 21:27:46 +07:00

96 lines
2.2 KiB
CSS

/* tsuki: page layout — header, main, footer composition */
body {
display: grid;
grid-template-rows: auto 1fr auto;
}
.site-header,
main,
.site-footer { padding-inline: var(--tsuki-space-6); }
.site-header {
display: flex;
align-items: center;
gap: var(--tsuki-space-4);
flex-wrap: wrap;
max-width: var(--tsuki-wide-width);
margin-inline: auto;
width: 100%;
padding-block: var(--tsuki-space-6);
border-bottom: 1px solid var(--tsuki-border);
}
.site-title {
font-weight: 650;
font-size: var(--tsuki-fs-lg);
letter-spacing: -0.01em;
color: var(--tsuki-fg);
text-decoration: none;
}
.site-title:hover { text-decoration: none; color: var(--tsuki-accent); }
.site-nav { margin-inline-start: auto; }
.site-nav ul {
display: flex;
gap: var(--tsuki-space-4);
list-style: none;
padding: 0;
margin: 0;
}
.site-nav a { color: var(--tsuki-fg-muted); }
.site-nav a:hover { color: var(--tsuki-fg); }
.site-nav a[aria-current="page"] { color: var(--tsuki-fg); font-weight: 550; }
.theme-toggle {
background: transparent;
border: 1px solid var(--tsuki-border);
border-radius: 999px;
width: 2rem;
height: 2rem;
display: inline-grid;
place-items: center;
color: var(--tsuki-fg-muted);
transition: var(--tsuki-transition);
}
.theme-toggle:hover { color: var(--tsuki-fg); border-color: var(--tsuki-fg-muted); }
main {
max-width: var(--tsuki-content-width);
margin-inline: auto;
width: 100%;
padding-block: var(--tsuki-space-12) var(--tsuki-space-16);
}
body.home main,
body.list main { max-width: var(--tsuki-wide-width); }
.site-footer {
max-width: var(--tsuki-wide-width);
margin-inline: auto;
width: 100%;
padding-block: var(--tsuki-space-8);
border-top: 1px solid var(--tsuki-border);
color: var(--tsuki-fg-muted);
font-size: var(--tsuki-fs-sm);
display: flex;
justify-content: space-between;
flex-wrap: wrap;
gap: var(--tsuki-space-3);
}
.site-footer p { margin: 0; }
.list-header {
margin-block-end: var(--tsuki-space-8);
border-block-end: 1px solid var(--tsuki-border);
padding-block-end: var(--tsuki-space-6);
}
.list-title {
font-size: var(--tsuki-fs-2xl);
margin: 0;
}
.list-description {
margin: var(--tsuki-space-2) 0 0;
color: var(--tsuki-fg-muted);
}