/* Neutral Journal styles. Only --journal-* tokens; no site colours. */ .journal-layout { box-sizing: border-box; max-width: var(--journal-wide-width); margin: 0 auto; padding: var(--journal-space-5) var(--journal-space-4) var(--journal-space-6); color: var(--journal-color-text); background: var(--journal-color-bg); font-family: var(--journal-font-body); font-size: var(--journal-font-size-base); line-height: var(--journal-line-height); } .journal-layout a { color: var(--journal-color-link); } .journal-layout a:hover { color: var(--journal-color-link-hover); } .journal-layout a:focus-visible { outline: 2px solid var(--journal-color-accent); outline-offset: 2px; } .journal-layout h1, .journal-layout h2, .journal-layout h3 { font-family: var(--journal-font-heading); line-height: 1.25; } /* Headers */ .journal-index-header, .journal-category-header { margin-bottom: var(--journal-space-5); } .journal-index-header__title, .journal-category-header__title { margin: 0 0 var(--journal-space-2); } .journal-category-header__description { margin: 0 0 var(--journal-space-4); color: var(--journal-color-muted); } .journal-category-header__content { max-width: var(--journal-content-width); } /* Post page */ .journal-post { max-width: var(--journal-content-width); margin: 0 auto; } .journal-post__title { margin: 0 0 var(--journal-space-3); } .journal-post-meta { display: flex; flex-wrap: wrap; gap: var(--journal-space-2) var(--journal-space-3); margin-bottom: var(--journal-space-4); color: var(--journal-color-muted); font-size: 0.9em; } .journal-post-meta__categories { display: flex; flex-wrap: wrap; gap: var(--journal-space-2); margin: 0; padding: 0; list-style: none; } .journal-featured-image { margin: 0 0 var(--journal-space-4); } .journal-featured-image img { display: block; width: 100%; height: auto; aspect-ratio: var(--journal-image-ratio); object-fit: cover; border-radius: var(--journal-radius-lg); background: var(--journal-color-surface); } .journal-post__siblings { display: flex; justify-content: space-between; gap: var(--journal-space-3); margin: var(--journal-space-5) 0; padding-top: var(--journal-space-4); border-top: 1px solid var(--journal-color-border); } .journal-post__siblings span { display: block; color: var(--journal-color-muted); font-size: 0.85em; } .journal-post__next { margin-left: auto; text-align: right; } /* Rendered HTML bodies (posts and category content) */ .journal-post-body > :first-child { margin-top: 0; } .journal-post-body img, .journal-post-body video { max-width: 100%; height: auto; border-radius: var(--journal-radius-md); } .journal-post-body ul, .journal-post-body ol { padding-left: var(--journal-space-4); } .journal-post-body blockquote { margin: var(--journal-space-4) 0; padding: var(--journal-space-3) var(--journal-space-4); border-left: 4px solid var(--journal-color-border); background: var(--journal-color-surface); } .journal-post-body code { padding: 0 var(--journal-space-1); border-radius: var(--journal-radius-sm); background: var(--journal-color-surface); font-family: var(--journal-font-mono); font-size: 0.9em; } .journal-post-body pre { overflow-x: auto; padding: var(--journal-space-3); border-radius: var(--journal-radius-md); background: var(--journal-color-surface); } .journal-post-body pre code { padding: 0; } .journal-post-body table { width: 100%; border-collapse: collapse; margin: var(--journal-space-4) 0; } .journal-post-body th, .journal-post-body td { padding: var(--journal-space-2) var(--journal-space-3); border: 1px solid var(--journal-color-border); text-align: left; } /* Embeds expanded from the Blog Editor's placeholders (app/utils/embeds.ts) */ .journal-embed { display: block; width: 100%; aspect-ratio: 16 / 9; margin: var(--journal-space-4) 0; } .journal-embed iframe { display: block; width: 100%; height: 100%; border: 0; } /* Listings */ .journal-post-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(var(--journal-card-min), 1fr)); gap: var(--journal-space-4); } .journal-post-list__empty { grid-column: 1 / -1; color: var(--journal-color-muted); } .journal-post-card { display: flex; flex-direction: column; gap: var(--journal-space-2); padding: var(--journal-space-4); border: 1px solid var(--journal-color-border); border-radius: var(--journal-radius-md); background: var(--journal-color-bg); } .journal-post-card .journal-featured-image { margin: calc(-1 * var(--journal-space-4)) calc(-1 * var(--journal-space-4)) var(--journal-space-2); } .journal-post-card .journal-featured-image img { border-radius: var(--journal-radius-md) var(--journal-radius-md) 0 0; } .journal-post-card__title { margin: 0; font-size: 1.2em; } .journal-post-card__title a { text-decoration: none; } .journal-post-card__date { color: var(--journal-color-muted); font-size: 0.85em; } .journal-post-card__excerpt { margin: 0; } .journal-post-card__more { margin-top: auto; } .journal-related { margin-top: var(--journal-space-5); } /* Pagination */ .journal-pagination { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: var(--journal-space-3); margin-top: var(--journal-space-5); } .journal-pagination__pages { display: flex; gap: var(--journal-space-1); margin: 0; padding: 0; list-style: none; } .journal-pagination__pages a, .journal-pagination__current { display: inline-block; min-width: 2.25em; padding: var(--journal-space-1) var(--journal-space-2); border-radius: var(--journal-radius-sm); text-align: center; } .journal-pagination__current { background: var(--journal-color-accent); color: var(--journal-color-on-accent); } /* Author */ .journal-author-card { margin-bottom: var(--journal-space-5); } .journal-author-card__name { margin: 0 0 var(--journal-space-2); } .journal-rss-link { display: inline-block; margin-top: var(--journal-space-4); font-size: 0.9em; } /* Search box (header). Outside .journal-layout, so it sets its own type. The panel is inline; an app turns it into a drop-down panel by positioning .journal-search__panel. Without JS the panel is always shown. */ .journal-search { position: relative; display: inline-flex; align-items: center; gap: var(--journal-space-2); font-family: var(--journal-font-body); color: var(--journal-color-text); } .journal-search__toggle { display: inline-flex; align-items: center; justify-content: center; padding: var(--journal-space-2); border: 0; border-radius: var(--journal-radius-sm); background: transparent; color: inherit; cursor: pointer; } .journal-search__toggle:focus-visible, .journal-search__input:focus-visible, .journal-search-page__input:focus-visible, .journal-search-page__submit:focus-visible { outline: 2px solid var(--journal-color-accent); outline-offset: 2px; } .journal-search--enhanced:not(.journal-search--open) .journal-search__panel { display: none; } .journal-search__panel { position: relative; } .journal-search__input, .journal-search-page__input { box-sizing: border-box; width: 16rem; max-width: 100%; padding: var(--journal-space-2) var(--journal-space-3); border: 1px solid var(--journal-color-border); border-radius: var(--journal-radius-sm); background: var(--journal-color-bg); color: var(--journal-color-text); font: inherit; } .journal-search__dropdown { position: absolute; z-index: 20; top: calc(100% + var(--journal-space-1)); left: 0; /* a right-aligned box sets left: auto; right: 0 */ box-sizing: border-box; width: min(26rem, calc(100vw - 2 * var(--journal-space-3))); padding: var(--journal-space-2) 0; border: 1px solid var(--journal-color-border); border-radius: var(--journal-radius-md); background: var(--journal-color-bg); box-shadow: var(--journal-shadow-dropdown); } .journal-search__list { margin: 0; padding: 0; list-style: none; } .journal-search__link { display: flex; gap: var(--journal-space-3); padding: var(--journal-space-2) var(--journal-space-3); color: inherit; text-decoration: none; } .journal-search__option--active .journal-search__link { background: var(--journal-color-surface); } .journal-search__thumb { flex: none; width: 3rem; height: 3rem; border-radius: var(--journal-radius-sm); object-fit: cover; } .journal-search__text { display: flex; flex-direction: column; min-width: 0; } .journal-search__title { font-weight: 600; } .journal-search__excerpt { color: var(--journal-color-muted); font-size: 0.875em; line-height: 1.4; } .journal-search mark, .journal-search-page mark { background: var(--journal-color-mark); color: inherit; } .journal-search__status { margin: 0; padding: var(--journal-space-2) var(--journal-space-3); color: var(--journal-color-muted); font-size: 0.875em; } .journal-search__status--loading::before { content: ''; display: inline-block; width: 0.8em; height: 0.8em; margin-right: var(--journal-space-2); border: 2px solid var(--journal-color-border); border-top-color: var(--journal-color-accent); border-radius: 50%; vertical-align: -0.1em; animation: journal-search-spin 0.8s linear infinite; } @keyframes journal-search-spin { to { transform: rotate(360deg); } } @media (prefers-reduced-motion: reduce) { .journal-search__status--loading::before { animation: none; } } .journal-search__all { display: block; padding: var(--journal-space-2) var(--journal-space-3); border-top: 1px solid var(--journal-color-border); color: var(--journal-color-link); font-size: 0.875em; } /* Search page */ .journal-search-page__form { display: flex; flex-wrap: wrap; gap: var(--journal-space-2); margin-bottom: var(--journal-space-4); } .journal-search-page__input { flex: 1 1 16rem; width: auto; } .journal-search-page__submit { padding: var(--journal-space-2) var(--journal-space-4); border: 0; border-radius: var(--journal-radius-sm); background: var(--journal-color-accent); color: var(--journal-color-on-accent); font: inherit; cursor: pointer; } .journal-search-page__count, .journal-search-page__message { margin: 0 0 var(--journal-space-4); color: var(--journal-color-muted); }