/** * legacy utility class bridge * * Single / author / meta markup still uses legacy utility class names * (.flex / .ac / .jsb / .abs-right / .muted-2-color / …). Without these * helpers the author bar and meta row collapse into a vertical mess. * * Keep this file tiny and pure utility — domain styles stay in single-post/*. */ /* Layout helpers */ .relative { position: relative; } .flex { display: flex; } .flex.ac, .ac { align-items: center; } .flex.jc, .jc { justify-content: center; } .flex.jsb, .jsb { justify-content: space-between; } .flex.at, .at { align-items: flex-start; } .flex.ae, .ae { align-items: flex-end; } .flex0 { flex: 0 0 auto; } .flex1 { flex: 1 1 auto; min-width: 0; } .flex.column { flex-direction: column; } .flex.wrap { flex-wrap: wrap; } .flex.flex-row, .flex-row { flex-direction: row; } .flex.jse, .jse { justify-content: space-evenly; } .flex.jsa, .jsa { justify-content: space-around; } /* Nested flex1 (legacy .flex .flex1) — allow both direct and descendant */ .flex > .flex1, .flex .flex1 { flex: 1; overflow: hidden; min-width: 0; } .relative-h { position: relative; height: 100%; } .padding-10 { padding: 10px; } .font-bold { font-weight: bold; } .mt6 { margin-top: 6px; } .gutters-5 { margin: -5px; } .gutters-5 > * { padding: 5px; } @media (max-width: 767px) { .flex.flex-row.flex-col-sm-2 { flex-wrap: wrap; } .flex.flex-row.flex-col-sm-2 > * { flex-basis: 50%; } } .clearfix::before, .clearfix::after { content: ""; display: table; } .clearfix::after { clear: both; } .abs-right { position: absolute; right: 0; top: 0; } /* legacy .abs-center: full-width vertical center (translateY only). * Header search and slide-text rely on this model. Point-center * (left:50% + translate(-50%,-50%)) is NOT used for these layers. */ .abs-center { position: absolute; left: 0; width: 100%; top: 50%; right: 0.7em; transform: translateY(-50%); z-index: 1; } /* legacy abs-center position variants (main.css) */ .abs-center.left-top, .abs-center.right-top { transform: unset; top: 0; } .abs-center.right-top { left: auto; width: auto; text-align: right; } .abs-center.left-top { text-align: left; } .abs-center.conter-bottom, .abs-center.conter-conter { text-align: center; } .abs-center.right-top, .abs-center.right-bottom, .abs-center.right-conter { text-align: right; } .abs-center.conter-bottom, .abs-center.right-bottom, .abs-center.left-bottom { top: auto; transform: unset; bottom: 0; } .abs-center.left-bottom { left: 0; right: auto; text-align: left; } .abs-center.right-bottom, .abs-center.right-conter { left: auto; right: 0; text-align: right; } /* Graphic ratio box (cover / related thumbs) — legacy .graphic */ .graphic, .page-cover { text-shadow: 0 0 5px rgba(0, 0, 0, 0.2); --main-color: #fff; color: #fff; position: relative; overflow: hidden; box-shadow: 0 0 10px var(--main-shadow, rgba(116, 116, 116, 0.08)); padding: 0; padding-bottom: 70%; border-radius: var(--main-radius, var(--radius, 8px)); } .graphic > .fit-cover, .graphic > img.fit-cover { position: absolute; width: 100%; height: 100%; object-fit: cover; inset: 0; } .fit-cover { object-fit: cover; max-width: 100%; } /* title-h-left underline bar (legacy) */ .title-h-left { position: relative; padding-bottom: 8px; } .title-h-left:before { transition: 0.4s; transform-origin: left; position: absolute; content: ""; width: 40px; height: 3px; background: var(--theme-color, var(--focus-color, #f04494)); left: 0; bottom: 3px; border-radius: 5px; box-shadow: 1px 1px 3px -1px var(--theme-color, var(--focus-color, #f04494)); } /* line-form-line — legacy absolute bottom rule (author meta separator) */ .line-form-line, .line-form-line:before { position: absolute; bottom: 0; left: 0; height: 1px; width: 100%; transition: 0.8s; background: var(--main-border-color, rgba(50, 50, 50, 0.06)); } .line-form-line:before { content: ""; width: 0; background: var(--focus-color, #f04494); } /* Avatar size primitive */ .avatar-img { position: relative; display: inline-block; flex-shrink: 0; --this-size: 38px; width: var(--this-size); height: var(--this-size); } .avatar-img .avatar, .avatar-img img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; } .avatar-lg { --this-size: 80px; } .avatar-md { --this-size: 55px; } .avatar-mini { --this-size: 20px; } .shrink0 { flex-shrink: 0; } .opacity8 { opacity: 0.8; } /* Typography / color helpers */ .muted-color { color: var(--muted-color, var(--color-ink-3)); } .muted-2-color { color: var(--muted-2-color, var(--color-ink-4)); } .muted-3-color { color: var(--muted-3-color, #b1b1b1); } .muted-4-color { color: var(--muted-4-color, #d2d2d2); } .text-center { text-align: center; } .em09 { font-size: 0.9em; } .em12 { font-size: 1.2em; } .px12-sm { font-size: 12px; } .ml3 { margin-left: 3px; } .ml6 { margin-left: 6px; } .ml10 { margin-left: 10px; } .mr3 { margin-right: 3px; } .mr6 { margin-right: 6px; } .mt10 { margin-top: 10px; } .mt20 { margin-top: 20px; } .mb10 { margin-bottom: 10px; } .mb20 { margin-bottom: 20px; } .text-ellipsis { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; } .text-ellipsis-2 { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; word-break: break-word; } /* Surfaces used by single article shell */ .main-bg { background-color: var(--main-bg-color, var(--surface-1)); } .separator { position: relative; letter-spacing: 0.08em; } /* Compact inline separators inside meta/time rows */ .icon-circle + .icon-circle::before { content: "·"; display: inline-block; margin: 0 0.45em; opacity: 0.55; } /* Author name row (was a non-standard element) */ .article-avatar name, .article-avatar .name, .user-name { display: inline-flex; align-items: center; gap: 4px; min-width: 0; max-width: 100%; } .pull-right { float: right; } .pull-left { float: left; }