Sidebars gone: no layout places a sidebar; the overview component, TOC transformer, sidebar frontmatter and sidebar CSS go

One unconditional grid rule replaces the :empty/:has grid and the per-slug
overrides; the engine's empty side divs are hidden.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-10-02 19:34:57 +02:00
commit bf7f70e68a
13 changed files with 13 additions and 554 deletions

View file

@ -1,32 +1,7 @@
---
title: Architecture and Evidence
description: "The authority map behind GameCult's AI-native organization: project Epiphanies, Personas, CultLib, Eve, scoped actuators, typed receipts, and the evidence separating live machinery from target architecture."
enableToc: true
showFolderListing: false
sidebarGroups:
- title: Architecture
links:
- label: Project Atlas
slug: Projects/index
- label: Architecture and Evidence
slug: Docs/Architecture-and-Evidence
- label: Site Architecture
slug: Docs/Site-Architecture
- label: Eve MultiVerse Essay
slug: Blog/eve-multiverse-daemon-architecture
- title: Proof
links:
- label: CultLib
href: https://github.com/GameCult/CultLib
external: true
- label: Eve
href: https://github.com/GameCult/Eve
external: true
- label: Epiphany
href: https://github.com/GameCult/Epiphany
external: true
- label: Bifrost
slug: Docs/Bifrost
---
# Architecture and Evidence

View file

@ -1,7 +1,6 @@
---
title: Graph
description: "A graph-style view of the GameCult site: notes as nodes, wiki links as edges, and folders as section clusters."
enableToc: false
---
# Graph

View file

@ -1,30 +1,8 @@
---
title: Portfolio Pitch
description: "Interactive GameCult portfolio pitch: Personas sell the absurd upside of their favourite projects while Void keeps the receipts in reach."
enableToc: false
cssclasses:
- gamecult-pitch-route
sidebarGroups:
- title: Pitch
links:
- label: Portfolio Pitch
slug: Pitch
- label: Repo Atlas
slug: Projects/index
- label: Bifrost
slug: Docs/Bifrost
- label: Site Graph
slug: Graph
- title: Core Projects
links:
- label: Epiphany
slug: Projects/Epiphany
- label: CultLib
slug: Projects/CultLib
- label: Heimdall
slug: Projects/Heimdall
- label: VoidBot
slug: Projects/VoidBot
---
<div

View file

@ -3,7 +3,6 @@ title: Projects
description: "GameCult's games, tools, shared infrastructure, and the Personas looking after them."
socialDeck: "Find the work, meet its stewards, and get to the source."
showFolderListing: false
enableToc: false
cssclasses:
- gamecult-studio-page
- gamecult-projects-page

View file

@ -2,7 +2,6 @@
title: Thing
description: "The Project Thing board deck: a discussion document on renaming Eve to Thing."
socialDeck: "Thing renders things."
enableToc: false
---
*"Thing renders things."*

View file

@ -1,7 +1,6 @@
---
title: Integrated Investment Dossier
description: "GameCult / Epiphany / Bifrost integrated diligence memo, product thesis, risk map, and staged proof plan."
enableToc: true
cssclasses:
- integrated-dossier-page
---

View file

@ -1,53 +1,6 @@
---
title: GameCult
description: "GameCult builds games, creative tools, and AI systems with memory, agency, and someone you can argue with."
enableToc: false
sidebarGroups:
- title: Studio
links:
- label: Project Atlas
slug: Projects/index
- label: Architecture and Evidence
slug: Docs/Architecture-and-Evidence
- label: Guided Tour
slug: tour
- label: Integrated Dossier
slug: dossier
- label: Graph
slug: Graph
- title: Praxis
links:
- label: Love Is How the Colossus Wakes
slug: Blog/love-is-how-the-colossus-wakes
- label: Open Source Model
slug: Open-Source-Model
- label: Democratizing Gamedev
slug: democratizing-gamedev
- label: A Place for Everyone
slug: a-place-for-everyone
- title: Participate
links:
- label: Contributing
slug: Contributing
- label: Discord
href: https://discord.gg/SwaNeVJRSq
external: true
- title: Writing
links:
- label: Hello, World!
slug: Blog/hello-world
- label: Rain
slug: Blog/rain
- label: When We Get Home
slug: Blog/when-we-get-home
- label: Cat and the Chocolate Factory
slug: Blog/cat-and-the-chocolate-factory/
- title: Docs
links:
- label: Site Architecture
slug: Docs/Site-Architecture
- label: Bifrost
slug: Docs/Bifrost
cssclasses:
- gamecult-studio-page
---

View file

@ -1,7 +1,6 @@
---
title: Public Digital Infrastructure Dossier
description: "A proposal for a Dutch stichting to steward GameCult as an open digital common, sustained by services and accountable public-interest partnerships."
enableToc: true
aliases:
- /public-digital-infrastructure-dossier
cssclasses:

View file

@ -1,62 +1,6 @@
---
title: GameCult Tour
description: "A full-screen visual novel tour through GameCult's public wiki, project rooms, repo swarm, and serious machinery."
enableToc: false
sidebarGroups:
- title: Studio
links:
- label: Home
slug: index
- label: Integrated Dossier
slug: dossier
- label: Graph
slug: Graph
- label: Open Source Model
slug: Open-Source-Model
- label: Contributing
slug: Contributing
- label: Democratizing Gamedev
slug: democratizing-gamedev
- label: A Place for Everyone
slug: a-place-for-everyone
- label: Games as a Service
slug: games-as-a-service
- label: The New Hotness
slug: the-new-hotness
- label: Bifrost
slug: Docs/Bifrost
- label: Portfolio Pitch
slug: Pitch
- label: Integrated Dossier
slug: dossier
- title: Projects
links:
- label: Aetheria
href: https://aetheria.gamecult.org
external: true
- label: Zyphos
href: https://zyphos.gamecult.org
external: true
- label: CultPong
slug: Projects/CultPong
- title: Writing
links:
- label: Hello, World!
slug: Blog/hello-world
- label: Rain
slug: Blog/rain
- label: When We Get Home
slug: Blog/when-we-get-home
- label: Cat and the Chocolate Factory
slug: Blog/cat-and-the-chocolate-factory/
- title: Docs
links:
- label: Publishing Workflow
slug: Docs/Publishing-Workflow
- label: Site Architecture
slug: Docs/Site-Architecture
- label: Bifrost
slug: Docs/Bifrost
---
<div

View file

@ -79,7 +79,6 @@ const config: QuartzConfig = {
}),
Plugin.ObsidianFlavoredMarkdown({ enableInHtmlEmbed: false }),
Plugin.GitHubFlavoredMarkdown(),
Plugin.TableOfContents(),
Plugin.CrawlLinks({ markdownLinkResolution: "shortest" }),
Plugin.Description(),
Plugin.Latex({ renderEngine: "katex" }),

View file

@ -2,11 +2,9 @@ import { PageLayout, SharedLayout } from "./quartz/cfg"
import * as Component from "./quartz/components"
import GameCultMasthead from "./quartz/components/GameCultMasthead"
import GameCultArticleMeta from "./quartz/components/GameCultArticleMeta"
import GameCultOverviewSidebar from "./quartz/components/GameCultOverviewSidebar"
import GameCultThemeLock from "./quartz/components/GameCultThemeLock"
const isGraphPage = (page: any) => page.fileData.slug === "Graph"
const isIntegratedDossierPage = (page: any) => page.fileData.slug === "dossier"
const isThingPage = (page: any) => page.fileData.slug === "Thing"
const isStandardContentPage = (page: any) =>
page.fileData.slug !== "index" && !isGraphPage(page) && !isThingPage(page)
@ -58,27 +56,8 @@ export const defaultContentPageLayout: PageLayout = {
condition: (page) => isStandardContentPage(page) && !isBlogArticle(page) && page.fileData.slug !== "Projects/index",
}),
],
left: [
Component.ConditionalRender({
component: Component.DesktopOnly(Component.TableOfContents()),
condition: (page) => !isGraphPage(page),
}),
],
right: [
Component.ConditionalRender({
component: GameCultOverviewSidebar(),
condition: (page) =>
!isGraphPage(page) &&
!isIntegratedDossierPage(page) &&
!isBlogArticle(page) &&
!isThingPage(page),
}),
Component.ConditionalRender({
component: Component.Backlinks(),
condition: (page) =>
isStandardContentPage(page) && !isIntegratedDossierPage(page) && !isBlogArticle(page),
}),
],
left: [],
right: [],
}
// components for pages that display lists of pages (e.g. tags or folders)
@ -97,6 +76,6 @@ export const defaultListPageLayout: PageLayout = {
condition: (page) => page.fileData.slug !== "index" && page.fileData.slug !== "Projects/index",
}),
],
left: [GameCultOverviewSidebar()],
left: [],
right: [],
}

View file

@ -1,62 +0,0 @@
import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types"
import { GameCultPageContext, isSidebarLinkActive } from "./gamecult"
import { FullSlug, resolveRelative } from "../util/path"
export default (() => {
const GameCultOverviewSidebar: QuartzComponent = ({
fileData,
gamecult,
}: QuartzComponentProps & { gamecult?: GameCultPageContext }) => {
const currentSlug = fileData.slug ?? ("index" as FullSlug)
const sidebar = gamecult?.sidebar
if (!sidebar || sidebar.groups.length === 0) {
return null
}
return (
<section class="gamecult-overview-sidebar">
<div class="gamecult-overview-sidebar-inner">
<p class="gamecult-overview-branch">
<a href={resolveRelative(currentSlug, sidebar.slug)}>{sidebar.title}</a>
</p>
{sidebar.tagline && <p class="gamecult-overview-tagline">{sidebar.tagline}</p>}
{sidebar.summary && <p class="gamecult-overview-summary">{sidebar.summary}</p>}
<nav class="gamecult-overview-nav" aria-label={`${sidebar.title} navigation`}>
{sidebar.groups.map((group) => (
<section class="gamecult-overview-group">
<p class="gamecult-overview-group-title">{group.title}</p>
<ul class="gamecult-overview-links">
{group.links.map((link) => {
const active = link.slug ? isSidebarLinkActive(currentSlug, link.slug) : false
const href =
link.href ?? (link.slug ? resolveRelative(currentSlug, link.slug) : undefined)
if (!href) {
return null
}
return (
<li class={active ? "active" : undefined}>
<a
href={href}
class={active ? "active" : undefined}
target={link.external ? "_blank" : undefined}
rel={link.external ? "noreferrer noopener" : undefined}
>
{link.label}
</a>
</li>
)
})}
</ul>
</section>
))}
</nav>
</div>
</section>
)
}
return GameCultOverviewSidebar
}) satisfies QuartzComponentConstructor

View file

@ -55,57 +55,25 @@ body[data-slug="index"] {
opacity: 0.7;
}
.page > #quartz-body > .left.sidebar:empty,
.page > #quartz-body > .right.sidebar:empty {
/* The site is one column; the engine still renders the two side divs, empty on every page. */
.page > #quartz-body {
grid-template-columns: minmax(0, 1fr);
grid-template-areas:
"grid-header"
"grid-center"
"grid-footer";
}
.page > #quartz-body > .left.sidebar,
.page > #quartz-body > .right.sidebar {
display: none;
}
@media all and ($desktop) {
.page
> #quartz-body:has(> .left.sidebar:empty):has(
> .right.sidebar:not(:empty)
) {
grid-template-columns: minmax(0, 1fr) 300px;
grid-template-areas:
"grid-header grid-sidebar-right"
"grid-center grid-sidebar-right"
"grid-footer grid-sidebar-right";
}
.page > #quartz-body:has(> .left.sidebar:empty):has(> .right.sidebar:empty) {
grid-template-columns: minmax(0, 1fr);
grid-template-areas:
"grid-header"
"grid-center"
"grid-footer";
}
}
@media all and not ($desktop) {
.page > #quartz-body:has(> .left.sidebar:empty) {
grid-template-columns: minmax(0, 1fr);
grid-template-areas:
"grid-header"
"grid-center"
"grid-sidebar-right"
"grid-footer";
}
}
.page > #quartz-body .center,
.page > #quartz-body footer {
max-width: none;
}
.page > #quartz-body .left.sidebar {
gap: 0;
padding: 2.4rem 1rem 0 0;
background: transparent;
border: none;
box-shadow: none;
backdrop-filter: none;
}
body[data-slug="Blog/small-ritual-of-reach"],
body[data-slug="Blog/week-of-nonconsensual-access"],
body[data-slug="Blog/witness-authoritative-networking"] {
@ -130,23 +98,6 @@ body[data-slug="Blog/witness-authoritative-networking"] {
radial-gradient(circle at 44% 20%, rgb(91 54 184 / calc(0.19 * var(--gamecult-wash))), transparent 34rem),
linear-gradient(180deg, #030414, #070b24 42%, #040514);
.page > #quartz-body {
grid-template-columns: minmax(0, 1fr) 280px;
grid-template-areas:
"grid-header grid-sidebar-right"
"grid-center grid-sidebar-right"
"grid-footer grid-sidebar-right";
}
.page > #quartz-body > .left.sidebar {
display: none;
}
.page > #quartz-body > .right.sidebar {
display: block;
padding-top: 2rem;
}
.page > #quartz-body .center > .page-header > .popover-hint {
display: none;
}
@ -161,44 +112,6 @@ body[data-slug="Blog/witness-authoritative-networking"] {
line-height: 1.72;
}
.page > #quartz-body > .right.sidebar .toc {
position: sticky;
top: 1.2rem;
max-height: calc(100vh - 2.4rem);
padding: 0.95rem 0 0.95rem 0.2rem;
overflow: visible;
border: 0;
border-radius: 0;
background: transparent;
box-shadow: none;
}
.page > #quartz-body > .right.sidebar .toc-content.overflow {
max-height: calc(100vh - 5rem);
padding-right: 0.4rem;
overflow-y: auto;
}
.page > #quartz-body > .right.sidebar .toc h3 {
color: rgba(232, 237, 244, 0.92);
font-family: "IBM Plex Mono", Consolas, monospace;
font-size: 0.68rem;
letter-spacing: 0.11em;
text-transform: uppercase;
}
.page > #quartz-body > .right.sidebar .toc a {
color: rgba(232, 237, 244, 0.72);
font-family: "IBM Plex Mono", Consolas, monospace;
font-size: 0.72rem;
line-height: 1.35;
}
.page > #quartz-body > .right.sidebar .toc a:hover,
.page > #quartz-body > .right.sidebar .toc a.in-view {
color: var(--ritual-paper-yellow);
}
.ritual-paper-page {
position: relative;
margin: 0 0 2rem;
@ -574,19 +487,6 @@ body[data-slug="Blog/witness-authoritative-networking"] {
}
@media all and (max-width: 760px) {
.page > #quartz-body {
grid-template-columns: minmax(0, 1fr);
grid-template-areas:
"grid-header"
"grid-center"
"grid-sidebar-right"
"grid-footer";
}
.page > #quartz-body > .right.sidebar {
display: none;
}
.page > #quartz-body .center > article {
margin-top: 0.8rem;
font-size: 0.98rem;
@ -628,12 +528,6 @@ body[data-slug="Blog/witness-authoritative-networking"] {
}
}
.page > #quartz-body .left.sidebar:has(.gamecult-overview-sidebar) {
position: static;
height: auto;
min-height: 0;
}
.page > #quartz-body .center > .page-header {
margin-top: 2.4rem;
}
@ -1105,19 +999,6 @@ body[data-slug="Thing"] {
}
body[data-slug="Blog/the-sleeping-colossus-refuses-the-throne"] {
.page > #quartz-body {
grid-template-columns: minmax(0, 1fr);
grid-template-areas:
"grid-header"
"grid-center"
"grid-footer";
}
.page > #quartz-body > .left.sidebar,
.page > #quartz-body > .right.sidebar {
display: none;
}
.page > #quartz-body .center > .page-header > .popover-hint {
display: none;
}
@ -1133,154 +1014,6 @@ body[data-slug="Blog/the-sleeping-colossus-refuses-the-throne"] {
}
}
.page > #quartz-body .right.sidebar {
gap: 1rem;
padding: 2.4rem 0 0 1rem;
background: transparent;
border: none;
box-shadow: none;
backdrop-filter: none;
}
.toc,
.backlinks {
border-radius: 18px;
border: 1px solid rgba(89, 183, 255, 0.08);
background: linear-gradient(
180deg,
rgba(12, 19, 29, 0.9),
rgba(8, 14, 22, 0.86)
);
padding: 0.95rem 1rem;
box-shadow:
0 18px 36px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.02);
}
.toc h3,
.backlinks h3 {
margin-top: 0;
font-size: 1rem;
font-weight: 300;
text-transform: uppercase;
letter-spacing: 0.08em;
}
.gamecult-overview-sidebar {
position: static;
width: 100%;
align-self: start;
max-height: none;
overflow: visible;
}
.gamecult-overview-sidebar-inner {
display: flex;
flex-direction: column;
gap: 0.9rem;
padding: 1rem 1rem 1.1rem;
border-radius: 22px;
border: 1px solid rgba(89, 183, 255, 0.08);
background: linear-gradient(
180deg,
rgba(10, 16, 24, 0.95),
rgba(8, 13, 21, 0.93)
);
box-shadow:
0 18px 34px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.02);
}
.gamecult-overview-branch,
.gamecult-overview-tagline,
.gamecult-overview-summary,
.gamecult-overview-group-title {
margin: 0;
}
.gamecult-overview-branch,
.gamecult-overview-branch a {
color: var(--dark);
font-family: var(--titleFont);
font-size: 1.05rem;
font-weight: 300;
letter-spacing: 0.05em;
text-transform: uppercase;
}
.gamecult-overview-tagline {
color: rgba(215, 226, 240, 0.92);
font-family: var(--titleFont);
font-size: 0.84rem;
font-weight: 200;
line-height: 1.45;
}
.gamecult-overview-summary {
color: rgba(175, 192, 211, 0.88);
font-size: 0.93rem;
line-height: 1.55;
}
.gamecult-overview-nav {
display: flex;
flex-direction: column;
gap: 0.95rem;
}
.gamecult-overview-group {
padding-top: 0.85rem;
border-top: 1px solid rgba(89, 183, 255, 0.08);
}
.gamecult-overview-group:first-child {
padding-top: 0;
border-top: none;
}
.gamecult-overview-group-title {
color: rgba(255, 138, 42, 0.96);
font-family: var(--titleFont);
font-size: 0.72rem;
font-weight: 300;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.gamecult-overview-links {
list-style: none;
margin: 0.45rem 0 0;
padding: 0;
display: flex;
flex-direction: column;
gap: 0.18rem;
}
.gamecult-overview-links li {
margin: 0;
}
.gamecult-overview-links a {
display: block;
padding: 0.18rem 0 0.18rem 0.72rem;
border-left: 2px solid transparent;
color: rgba(220, 231, 246, 0.84);
font-family: "Ubuntu", var(--bodyFont), sans-serif;
font-size: 0.94rem;
font-weight: 300;
line-height: 1.4;
}
.gamecult-overview-links a:hover,
.gamecult-overview-links a.active {
color: #fff3e8;
}
.gamecult-overview-links li.active > a,
.gamecult-overview-links a.active {
border-left-color: rgba(255, 138, 42, 0.9);
}
.page-listing .section-li {
margin-bottom: 0;
}
@ -1317,36 +1050,7 @@ a:hover,
color: var(--tertiary);
}
@media all and not ($desktop) {
.page > #quartz-body .left.sidebar {
position: initial;
height: auto;
padding: 0;
margin-top: 0.3rem;
}
.gamecult-overview-sidebar {
max-height: none;
overflow: visible;
padding-right: 0;
}
.page > #quartz-body .right.sidebar {
padding: 0;
margin-top: 0.25rem;
}
}
@media all and ($mobile) {
.page > #quartz-body {
grid-template-areas:
"grid-header"
"grid-center"
"grid-sidebar-left"
"grid-sidebar-right"
"grid-footer";
}
.page {
padding: 0 0.7rem 1.8rem;
}
@ -1388,10 +1092,6 @@ a:hover,
> .breadcrumb-container {
margin-bottom: 0.28rem;
}
.gamecult-overview-sidebar-inner {
padding: 0.95rem 0.95rem 1rem;
}
}
body[data-slug="tour"],
@ -1417,8 +1117,6 @@ body[data-slug="Pitch"] {
overflow: hidden;
}
.page > #quartz-body > .left.sidebar,
.page > #quartz-body > .right.sidebar,
.page > #quartz-body > footer,
.page > #quartz-body .center > .page-header,
.page > #quartz-body .center > .page-footer {