:root { --ui-spacing: 0.25rem; --ui-primary: var(--color-deep-dark); --ui-container: 64rem; --ui-container-narrow: 48rem; --ui-container-narrow-very: 36rem; --ui-header-logo-inverted: 1; --ui-header-height: calc(var(--ui-spacing)*14); --ui-header-height-collapsed: calc(var(--ui-spacing)*12); --color-surface-container: #f9f9f9; --color-surface-container-glass: #f9f9f9de; --color-on-surface-container: #111111; --color-inverse-surface-container: #111111; --color-on-inverse-surface-container: #f9f9f9; --color-primary: #1a1a1a; --color-primary-strong: #3e3e3e; --color-on-primary: #eeeeee; --color-on-primary-weak: #ebebeb; --color-secondary: #efefef; --color-secondary-strong: #dfdfdf; --color-on-secondary: #2e2e2e; --color-container: #f8f8f8; --color-on-container: #0e0e0e; --color-outline-very-intense: #a0a0a0; --color-outline-intense: #c0c0c0; --color-outline: #d9d9d9; --color-accent: #0066ff; --color-accent-strong: #0055d5; --color-inverse: #ff6600; --color-inverse-strong: #d55500; --font-sans: "Fira Sans", "Noto Sans Thai Looped", sans-serif; --font-sans--font-feature-settings: "liga", "calt"; --font-mono: "Fira Mono", "SF Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; --font-serif: 'Linux Libertine','Georgia', 'Source Serif 4', Georgia, Garamond, "Times New Roman", Times, 'Noto Serif Thai', serif; --ease-fluid: 0.2, 0, 0, 1; --ease-fluid-in: .6, .2, .7, .4; --ease-out-back: 0.34, 1.56, 0.64, 1; } @media screen and (prefers-color-scheme: dark) { :root { --color-surface-container: #111111; --color-surface-container-glass: #111111de; --color-on-surface-container: #eeeeee; --color-inverse-surface-container: #eeeeee; --color-on-inverse-surface-container: #111111; --color-primary: #eeeeee; --color-primary-strong: #dadada; --color-on-primary: #1a1a1a; --color-on-primary-weak: #292929; --color-secondary: #1d1d1d; --color-secondary-strong: #2f2f2f; --color-on-secondary: #e4e4e4; --color-container: #1f1f1f; --color-on-container: #dfdfdf; --color-outline-very-intense: #4d4d4d; --color-outline-intense: #3e3e3e; --color-outline: #2d2d2d; } } @keyframes ring { 0% { outline: 0px solid var(--ui-ring-color); outline-offset: var(--ui-ring-offset); } 25% { outline: 12px solid var(--ui-ring-color); outline-offset: var(--ui-ring-offset); } 100% { outline: var(--ui-ring-size) solid var(--ui-ring-color); outline-offset: var(--ui-ring-offset); } } * { box-sizing: border-box; } *:focus-visible { --ui-ring-size: 2px; --ui-ring-color: var(--color-accent); --ui-ring-offset: 2px; animation: ring 0.5s cubic-bezier(var(--ease-fluid)); outline: var(--ui-ring-size) solid var(--ui-ring-color); outline-offset: var(--ui-ring-offset); } button, .btn { user-select: none!important; } body,main { font-family: var(--font-sans); padding: 0; margin: 0; color: var(--color-on-surface-container); background: var(--color-surface-container); line-height: 1.35; } img { border-radius: calc(var(--ui-spacing)*1); display: block; max-width: 100%; } a { color: unset; text-decoration: none; } code,tt,kbd,pre { font-family: var(--font-mono); font-size: inherit; } h1,h2,h3,h4,h5,h6 { font-family: var(--font-serif); font-weight: 400; } h1 { font-size: 1.80em; } h2 { font-size: 1.50em; } h3 { font-size: 1.25em; } h4 { font-size: 1.10em; } h5 { font-size: 1.00em; } h6 { font-size: 0.90em; } .material-symbols-outlined { font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24 } .text-accent { color: var(--color-accent); } .web-header-container { position: sticky; top: 0; width: 100%; overflow: visible; z-index: 100; } .web-header, .hamburger-menu-header { box-sizing: border-box; display: flex; flex-direction: row; position: sticky; top: 0; height: var(--ui-header-height-collapsed); z-index: 998; } @media screen and (min-width: 1024px) { .web-header, .hamburger-menu-header { height: var(--ui-header-height); } } .web-header.web-header-bg, .hamburger-menu-header.hamburger-menu-header-bg { background: var(--color-secondary); color: var(--color-on-secondary); border-bottom: 1px solid var(--color-outline); } .web-header-logo-banner { height: 100%; background: var(--color-accent); align-content: center; } .web-header-logo-banner > .web-header-logo { border-radius: 0; } .web-header-title { display: none; visibility: hidden; font-size: 16px; font-weight: 700; margin: 0; margin-inline: calc(var(--ui-spacing)*2); } @media screen and (min-width: 480px) { .web-header-title { display: block; visibility: visible; } } @media screen and (max-width: 479px) { .web-header-logo-banner > .web-header-logo { width: var(--ui-header-height-collapsed); height: var(--ui-header-height-collapsed); } } .web-nav, .web-footer-content, .article { width: 100%; } .article.article-special h1, .article.article-special h2, .article.article-special h3, .article.article-special h4, .article.article-special h5, .article.article-special h6 { border-bottom: 1px solid var(--color-outline-very-intense); } .web-footer-title { font-size: 32px; margin-block: .4em; } .web-footer-notice, .web-footer-links-container > .web-footer-link-title { font-size: 12px; font-family: var(--font-mono); } .web-footer-links-container > .web-footer-link-title { text-transform: uppercase; } .web-footer-links { list-style: none; padding: 0; margin: 0; } .web-footer-link { width: 100%; } .web-footer-link a { width: 100%; display: block; margin-block: .5em; } .web-footer-links-container-container { display: flex; } .web-heading { margin: 0 auto; padding: 0 calc(var(--ui-spacing)*4); display: flex; flex-direction: row; align-items: center; justify-content: space-between; width: 100%; height: 100%; max-width: var(--ui-container); .web-heading-left-section { width: fit-content; display: flex; flex-direction: row; justify-content: start; height: 100%; align-items: center; } .web-heading-right-section { display: none; width: fit-content; flex-direction: row; justify-content: end; height: 100%; align-items: center; } } @media screen and (min-width: 1024px) { .web-heading { .web-heading-right-section { display: flex; } } } p { margin-block: 1em; } .font-hero { font-size: 40px; margin-block: 0.2em; line-height: 1.3; font-weight: 700; } .font-hero-desc { font-size: 20px; font-weight: 500; } .web-title { margin-block: 0.5em; transition-property: color; transition-duration: 100ms; transition-timing-function: cubic-bezier(var(--ease-fluid)); a { cursor: pointer; } .link-inline-icon { transition-property: opacity margin; transition-duration: 100ms; transition-timing-function: cubic-bezier(var(--ease-fluid)); user-select: none; margin-left: 0.5rem; opacity: 0.5; } &:hover .link-inline-icon { opacity: 1; margin-left: 1rem; } &:active a { color: var(--color-primary); } &:focus-visible a { text-decoration: underline; } &.link { color: var(--ui-text); } } .web-nav-title { --web-nav-title-shadow: 0px 0px 16px var(--ui-bg); font-size: 18px; } .web-hero-post { display: flex; flex-direction: column; align-items: center; text-align: center; } .web-section { max-width: var(--ui-container); margin-block: calc(var(--ui-spacing)*16); margin-inline: auto; padding-inline: calc(var(--ui-spacing)*4); } .web-section.web-section-split { display: flex; flex-direction: column; gap: calc(var(--ui-spacing)*4); } .web-section.web-section-split .about-me-photo-grid { display: grid; grid-template-columns: repeat(1, minmax(0, 1fr)); gap: calc(var(--ui-spacing)*1); } .web-section.web-section-big-text { font-size: 20px; line-height: 1.5; } .article.article-footer a:hover { color: var(--color-primary); background: var(--color-on-primary); } .article.article-footer .web-footer-link > a:hover { color: var(--color-on-primary); text-decoration: underline; text-decoration-style: dotted; background: none; } .article.article-footer { color: var(--color-on-inverse-surface-container); background: var(--color-inverse-surface-container); padding-block: calc(var(--ui-spacing)*12); } .article.article-footer.article-footer-no-bg { color: inherit; background: transparent; } .article.article-footer .web-footer-link > a:active { text-decoration-style: solid; } .article.article-footer > .web-section { display: flex; margin-block: 0; } @media screen and (min-width: 768px) { .web-section.web-section-split { flex-direction: row; gap: calc(var(--ui-spacing)*8); } .web-section.web-section-split > .web-section-pane:first-child:not(:only-child) { width: 35%; } .web-section.web-section-split > .web-section-pane:last-child:not(:only-child) { width: 65%; } } .web-section.web-section-narrow { max-width: var(--ui-container-narrow); } .web-section.web-section-narrow-very { max-width: var(--ui-container-narrow-very); } .about-me-photo-grid { display: grid; grid-template-columns: repeat(1, minmax(0, 1fr)); gap: calc(var(--ui-spacing)*1); } .about-me-photo-grid > img { height: 100%; object-fit: cover; aspect-ratio: 16/9; } @media screen and (min-width: 768px) { .about-me-photo-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } } .card-container { margin-block: 1em; background: var(--color-container); color: var(--color-on-container); display: flex; flex-direction: column; margin-left: 0; list-style: none; border: 1px solid var(--color-outline-intense); border-radius: calc(var(--ui-spacing)*1); overflow: hidden; box-shadow: 0 1px 1px rgb(0,0,0,.1); } .card-container > li { margin-left: 0; } .card { height: 100%; display: flex; flex-direction: column; align-items: center; background: var(--ui-bg-muted); margin-left: 0; } .card.disabled { opacity: 0.5; pointer-events: none; cursor: not-allowed; z-index: 1; } .card > h3 { font-size: 24px; overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 1; z-index: 1; } .card > p { z-index: 1; margin: 0; width: 100%; overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; } .card > img { aspect-ratio: 16/9; object-fit: cover; width: 100%; border-radius: 0; } .card > .iconify, .card > .material-symbols-outlined { background: var(--color-primary); color: var(--color-on-primary); width: calc(var(--ui-spacing)*16); height: calc(var(--ui-spacing)*16); } .card > .material-symbols-outlined { align-content: center; text-align: center; font-size: 48px; font-variation-settings: 'opsz' 48 } .card > .card-content { display: block; width: 100%; padding: calc(var(--ui-spacing)*3); } .card > .card-content h3 { margin: 0; } .card:hover { background: var(--color-secondary); } .card-container > .card:not(:only-child):not(:last-child) { border-bottom: 1px solid var(--color-outline); } .card.card-always-long { flex-direction: row; } @media screen and (min-width: 640px) { .card, .card.card-always-long { flex-direction: row; } .card > img { margin-bottom: 0; max-width: calc(var(--ui-spacing)*64); } .card > .card-content { padding-inline: calc(var(--ui-spacing)*4); } } .hamburger-toggle { all: unset; display: flex; visibility: visible; width: calc(var(--ui-spacing)*9); height: 100%; cursor: pointer; align-items: center; justify-content: center; } .hamburger-toggle:hover { background: var(--color-secondary); } .hamburger-toggle.placeholder { background: none; } @media screen and (min-width: 1024px) { .hamburger-toggle.no-autohide { display: flex!important; visibility: visible!important; } .hamburger-toggle { display: none; visibility: hidden; } } .hamburger-menu { background: white; transform-origin: top right; display: flex; flex-direction: column; position: fixed; /* top: calc(var(--ui-spacing)*14); */ top: 0; left: 0; height: 100vh; z-index: 1000; transition-property: all; transition-duration: 300ms; transition-timing-function: cubic-bezier(var(--ease-fluid)); width: 100%; max-width: 20rem; } .hamburger-menu > .nav-wrapper { list-style-type: none; display: flex; flex-direction: column; margin: 0; padding: 0 calc(var(--ui-spacing)*4); width: 100%; align-items: end; overflow-y: scroll; } .hamburger-menu > .nav-wrapper > .nav-link, .hamburger-menu > .nav-wrapper > .nav-button { display: flex; width: 100%; margin-left: 0; } .hamburger-menu > .nav-wrapper > .nav-link > a, .hamburger-menu > .nav-wrapper > .nav-link > .hamburger-btn-square { display: flex; align-items: center; width: 100%; padding-inline: calc(var(--ui-spacing)*4); height: calc(var(--ui-spacing)*12); } .hamburger-menu > .nav-wrapper > .nav-link > a.router-link-exact-active { color: var(--color-accent); } .hamburger-menu > .nav-wrapper > .nav-link > .hamburger-btn-square { aspect-ratio: 1/1; justify-content: center; width: unset; } .hamburger-menu > .nav-wrapper > .nav-link:not(:only-child):not(:last-child) { border-bottom: 1px solid var(--color-outline); } .hamburger-menu > .nav-wrapper > .nav-button { display: flex; width: 100%; max-width: 18rem; margin-left: calc(var(--ui-spacing) * 0); justify-content: flex-end; } .hamburger-menu.hamburger-menu-hidden { transform: translateX(-100%); visibility: hidden; } .hamburger-backdrop-overlay { background: #000000; opacity: 0.5; z-index: 999; position: fixed; top: 0; left: 0; bottom: 0; right: 0; } .nav-links { display: flex; height: 100%; } @media screen and (min-width: 768px) { .nav-links { display: hidden; } } ul.nav-wrapper { margin: 0; } .nav-links > .nav-wrapper { list-style-type: none; display: flex; flex-direction: row; height: 100%; } .nav-links > .nav-wrapper > .nav-link { align-content: center; height: 100%; margin: 0; font-size: 14px; font-weight: 400; } .nav-links > .nav-wrapper > .nav-link > a { display: flex; align-items: center; padding-inline: calc(var(--ui-spacing)*3); height: 100%; cursor: pointer; } .nav-links > .nav-wrapper > .nav-link > a:hover, .nav-links > .nav-wrapper > .nav-link > a.router-link-exact-active { border-top: 2px solid var(--color-accent); padding-bottom: 2px; color: var(--color-accent); } .nav-links > .nav-wrapper > .nav-link > a:active { opacity: 0.9; } code, pre, tt, kbd, samp { font-size: 1em; } .link, .prose a { text-decoration: underline; color: var(--ui-text); } .link:hover, .prose a:hover { text-decoration: none; background: var(--color-on-surface-container); color: var(--color-surface-container); } .link:active, .prose a:active { opacity: 0.8; } .link.link-no-underline { text-decoration: none; } .prose h2 > a { text-decoration: none; } button.btn, a.btn { cursor: pointer; } .btn { --ui-btn-bg: var(--color-surface-container); --ui-btn-bg-active: var(--color-secondary); --ui-btn-text: var(--color-on-surface-container); --ui-btn-border-width: 1px; --ui-btn-border-color: var(--color-outline); --ui-btn-border-style: solid; --ui-btn-height: calc(var(--ui-spacing)*10); --ui-btn-padding-x: calc(var(--ui-spacing)*4); --ui-btn-radius: calc(var(--ui-btn-height)/2); display: flex; align-items: center; width: fit-content; border-width: var(--ui-btn-border-width); border-color: var(--ui-btn-border-color); border-style: var(--ui-btn-border-style); height: var(--ui-btn-height); background: var(--ui-btn-bg); color: var(--ui-btn-text); padding-inline: var(--ui-btn-padding-x); border-radius: var(--ui-btn-radius); } .btn:active { background: var(--ui-btn-bg-active); } .btn.btn-primary { --ui-btn-bg: var(--color-primary); --ui-btn-bg-active: var(--color-primary-strong); --ui-btn-text: var(--color-on-primary); --ui-btn-border-width: 0; } .btn.btn-secondary { background: var(--color-secondary); color: var(--color-on-secondary); padding-inline: calc(var(--ui-spacing)*2.5); } .btn.btn-sm { height: calc(var(--ui-spacing)*8); font-size: 14px; } .btn.btn-sm .material-symbols-outlined { font-size: 20px; font-variation-settings: 'opsz' 20 } .prose-blog-pretext { font-family: var(--font-mono); font-size: 12px; text-transform: uppercase; } .post-container { display: flex; flex-direction: column-reverse; } @media screen and (min-width: 1024px) { .post-container { display: flex; flex-direction: row; } } .prose { font-weight: 400; width: 100%; flex: 3; } .prose p, li { line-height: 1.5; } hr, .prose hr { height: 1px; margin-block: 1em; border: none; border-bottom: 1px solid var(--color-outline-intense); } .prose li { margin-block: 1em; } .prose h1,h2,h3,h4,h5,h6 { font-family: var(--font-serif); scroll-margin-top: 80px; } .prose img { margin-block: calc(var(--ui-spacing)*3); } .prose-toc { flex: 1; width: 100%; max-width: 320px; } @media screen and (min-width: 1024px) { .prose-toc { margin-left: calc(var(--ui-spacing)*5) } } .post-cover { gap: 1.5rem; display: flex; flex-direction: column; } .post-cover > .img-cover { width: 100%; aspect-ratio: 4/3; max-width: 100%; object-fit: cover; } @media screen and (min-width: 640px) { .post-cover { flex-direction: row-reverse; justify-content: flex-end; } .post-cover > .img-cover { max-width: 55%; } } .post-more-info { margin: 0; margin-top: calc(var(--ui-spacing)*2); font-size: 12px; font-family: var(--font-mono); } .toc { position: sticky; top: calc(var(--ui-header-height) + calc(var(--ui-spacing)*4)); } .toc > .toc-text { margin-block: 0.5em; font-weight: 700; } .toc > ul { padding: 0; margin: 0; list-style: none; } .toc .toc-link-indent-3 { margin-left: calc(var(--ui-spacing)*3); } .toc .toc-link-indent-4 { margin-left: calc(var(--ui-spacing)*6); } .web-dismissible-banner { position: sticky; width: 100%; text-align: center; padding: 0.75rem; background: var(--color-primary); color: var(--color-on-primary); } .web-dismissible-banner > .web-dismissible-banner-content { display: flex; text-align: start; align-items: center; gap: 1rem; max-width: var(--ui-container); padding: 0 calc(var(--ui-spacing)*4); margin: 0 auto; justify-content: space-between; } .tree-link-card { display: block; padding: calc(var(--ui-spacing)*4) calc(var(--ui-spacing)*6); border-radius: 100px; background: var(--color-primary); color: var(--color-on-primary); margin-bottom: calc(var(--ui-spacing)*1); display: flex; align-items: center; } .tree-link-card .material-symbols-outlined { margin-right: calc(var(--ui-spacing)*1); } .tree-link-card:hover { background: var(--color-inverse); color: var(--color-on-inverse); } .tree-link-card:hover .material-symbols-outlined { font-variation-settings: 'FILL' 1 } .tree-link-card:active { opacity: .8; } a.tree-link-card { cursor: pointer; } .frosted-glass-backdrop-dynamic { background: var(--color-surface-container-glass); top: 0; left: 0; bottom: 0; right: 0; position: fixed; z-index: -10; backdrop-filter: blur(36px); -webkit-backdrop-filter: (36px); } pre.codebox { font-family: var(--font-mono); font-size: 12px; padding: calc(var(--ui-spacing)*3); border-radius: calc(var(--ui-spacing)*2); background: var(--color-inverse-surface-container); color: var(--color-on-inverse-surface-container); }