Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
2502c02
docs: add Dapr docs restyle design spec and implementation plan
marcduiker Jul 15, 2026
0fec90d
docs: document working local preview (hugo server on macOS)
marcduiker Jul 15, 2026
a2fcbcf
style: establish SCSS structure, design tokens, and dark-mode wiring
marcduiker Jul 15, 2026
c452f84
feat: enable dark mode with a persisted theme toggle (data-bs-theme)
marcduiker Jul 16, 2026
adb96b3
style: content typography, links, code, blockquote, lists
marcduiker Jul 16, 2026
ae1c8bf
style: compact underline code/OS tabs (Docsy tabpane restyle)
marcduiker Jul 16, 2026
de2393a
style: callout/alert variants
marcduiker Jul 16, 2026
b96b1fa
style: tables and component compatibility tables
marcduiker Jul 16, 2026
367234e
style: buttons and CTA
marcduiker Jul 16, 2026
6b31430
style: self-host Geist/Inter/Geist Mono and set typography base
marcduiker Jul 16, 2026
43e990d
fix(style): disable Docsy Google Fonts CDN; tokenize on-accent/succes…
marcduiker Jul 16, 2026
f27d7c2
docs: add Task 2b (enable dark mode) to restyle plan
marcduiker Jul 16, 2026
b73c4c9
fix(style): blend code-tab content with page; make copy-code icon vis…
marcduiker Jul 16, 2026
55cae2e
fix(style): dedupe copy button, restore code-block spacing, strengthe…
marcduiker Jul 16, 2026
0eb300c
fix(style): stop CTA button rule from breaking Docsy's copy icon
marcduiker Jul 16, 2026
cbd1ba3
feat(style): themeable code highlighting (class-based Chroma, light+d…
marcduiker Jul 16, 2026
f4e4e8c
style: navbar
marcduiker Jul 16, 2026
645d9e5
style: sidebar navigation
marcduiker Jul 16, 2026
8fa3fc2
style: right-hand TOC with scrollspy
marcduiker Jul 16, 2026
24cb270
style: breadcrumbs, pager, footer
marcduiker Jul 16, 2026
44e41ba
fix(style): sidebar nav — indentation, spacing, single active highlight
marcduiker Jul 16, 2026
ab0ac6b
fix(style): sidebar li padding 2px; move active accent to the <li>
marcduiker Jul 16, 2026
758bfcb
style: card component (Docsy cards + project .d-card)
marcduiker Jul 16, 2026
85772e8
feat(layout): card-forward section landing pages
marcduiker Jul 16, 2026
817573f
fix(style): theme-aware brand logo (dark-blue on light, white on dark)
marcduiker Jul 16, 2026
a1863df
fix(style): align navbar logo with wordmark, use Geist for 'Dapr Docs'
marcduiker Jul 16, 2026
7200bb4
fix(style): right aside — page-meta font size + active-only TOC border
marcduiker Jul 16, 2026
2dbb243
Remove temp file
marcduiker Jul 16, 2026
cc68891
style: search, 404, blog, banners, feedback, perf, print
marcduiker Jul 16, 2026
052e1bd
fix(style): print-mode dark tokens + cookie Accept button dark contrast
marcduiker Jul 16, 2026
46e8c6f
docs: OVERRIDES index of Docsy layout forks with risk tiers
marcduiker Jul 17, 2026
91d6b79
fix(style): scope light Chroma palette to prevent black code in dark …
marcduiker Jul 17, 2026
d02d408
fix(style): stop announcement banner from overlapping the right aside
marcduiker Jul 17, 2026
3f36ed6
docs: remove internal restyle spec and plan from PR
marcduiker Jul 17, 2026
6cf6554
Update homepage styling and some content
marcduiker Jul 17, 2026
ca981d7
Merge pull request #5251 from marcduiker/docs-restyle
marcduiker Jul 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions daprdocs/assets/js/theme-toggle.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// Dapr docs theme toggle.
//
// Flips `data-bs-theme` on <html> between "light" and "dark" and persists the
// choice in localStorage under "dapr-theme". The initial theme (OS
// preference vs. stored choice) is set by an inline no-flash script in
// hooks/head-end.html, which runs before this bundle loads.
const root = document.documentElement;
function set(theme) {
root.setAttribute("data-bs-theme", theme);
try { localStorage.setItem("dapr-theme", theme); } catch (e) {}
}
const btn = document.getElementById("dapr-theme-toggle");
if (btn) btn.addEventListener("click", () => {
set(root.getAttribute("data-bs-theme") === "dark" ? "light" : "dark");
});
16 changes: 16 additions & 0 deletions daprdocs/assets/scss/_buttons.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// buttons
//

// Text CTA buttons only. Exclude Docsy's icon-only copy button
// (button.td-click-to-copy is also `.btn`): applying --font-head here overrode
// Font Awesome's font-family and rendered the copy glyph as tofu, and the CTA
// padding/radius bloated it.
.td-content a.btn:not(.td-click-to-copy), .td-content .btn:not(.td-click-to-copy) {
font-family: var(--font-head); font-weight: 600; font-size: .86rem;
border-radius: 8px; padding: 10px 16px; text-decoration: none; border: none;
}
.td-content a.btn-tertiary, .td-content .btn-tertiary { background: var(--d-orange); color: var(--d-on-accent); }
.td-content a.btn-tertiary:hover { filter: brightness(1.06); color: var(--d-on-accent); }
.td-content .btn-primary { background: var(--d-blue); color: var(--d-on-accent); }
.td-content .btn-secondary { background: var(--d-sky); color: var(--d-on-sky); }
14 changes: 14 additions & 0 deletions daprdocs/assets/scss/_callouts.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//
// callouts
//

.td-content .alert {
border: 1px solid var(--d-border); border-left: 3px solid var(--d-sky);
background: color-mix(in srgb, var(--d-sky) 7%, var(--d-ground));
color: var(--d-body); border-radius: 0 var(--d-radius) var(--d-radius) 0; padding: 13px 15px;
}
.td-content .alert-warning { border-left-color: var(--d-orange); background: color-mix(in srgb, var(--d-orange) 7%, var(--d-ground)); }
.td-content .alert-primary { border-left-color: var(--d-blue); background: color-mix(in srgb, var(--d-blue) 8%, var(--d-ground)); }
.td-content .alert-success { border-left-color: var(--d-success); }
.td-content .alert-danger { border-left-color: var(--d-danger); }
.td-content .alert a { color: var(--d-link); }
43 changes: 43 additions & 0 deletions daprdocs/assets/scss/_cards.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
//
// cards
//

// Project card grid (used by section-index.html for card-forward section landings)
.d-card-grid { display:grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap:12px; margin:12px 0; }
@media (min-width:1180px){ .d-card-grid.cols-3 { grid-template-columns: repeat(3, minmax(0,1fr)); } }
@media (max-width:560px){ .d-card-grid { grid-template-columns:1fr; } }

.d-card {
display:flex; flex-direction:column; gap:8px; text-decoration:none; color:var(--d-body);
border:1px solid var(--d-border); border-top-width:2px; border-radius:var(--d-radius);
padding:15px; background:var(--d-ground); transition:border-color .13s, transform .1s, box-shadow .13s;
}
.d-card:hover { transform:translateY(-2px); box-shadow:0 4px 14px rgba(15,21,34,.08); text-decoration:none; }
[data-bs-theme="dark"] .d-card:hover { box-shadow:0 4px 16px rgba(0,0,0,.4); }
.d-card .d-card-title { font-family:var(--font-head); font-weight:600; font-size:.9rem; color:var(--d-heading); }
.d-card .d-card-desc { font-size:.8rem; color:var(--d-muted); flex:1; }
.d-card .d-card-more { font-family:var(--font-head); font-size:.76rem; font-weight:600; color:var(--d-link); }
// Optional icon slot. When present it's grouped with the title in .d-card-head
// so the icon and title sit on the same row. Brand logos keep their own colors;
// a fixed height keeps the grid aligned regardless of each logo's aspect ratio.
.d-card .d-card-head { display:flex; align-items:center; gap:10px; }
.d-card .d-card-icon { height:36px; width:auto; max-width:56px; object-fit:contain; flex:0 0 auto; }
.d-card.c-blue{border-top-color:var(--d-blue);}
.d-card.c-sky{border-top-color:var(--d-sky);}
.d-card.c-orange{border-top-color:var(--d-orange);}
.d-card.c-gold{border-top-color:var(--d-gold);}

// Docsy built-in cards (used e.g. by cardpane/card shortcodes in SDK docs)
.td-content {
.card {
border:1px solid var(--d-border);
border-radius:var(--d-radius);
background:var(--d-ground);
color:var(--d-body);
}
.card-body { color:var(--d-body); }
.card-title {
font-family:var(--font-head);
color:var(--d-heading);
}
}
184 changes: 184 additions & 0 deletions daprdocs/assets/scss/_chroma.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
//
// Syntax highlighting (Chroma, class-based; requires markup.highlight.noClasses=false).
// BOTH palettes are theme-scoped so neither leaks into the other: tango under
// [data-bs-theme="light"], github-dark under [data-bs-theme="dark"]. (Previously
// the light palette was unscoped and its .p/.n = #000 rendered black-on-dark in
// dark mode.) The no-flash script in head-end.html always sets data-bs-theme
// before paint. Baked backgrounds are stripped; the code-block background comes
// from --d-code-bg. Regenerate with: hugo gen chromastyles --style=<name>.
//

[data-bs-theme="light"] {
/* PreWrapper */ .chroma { -webkit-text-size-adjust:none; }
/* Other */ .chroma .x { color:#000 }
/* Error */ .chroma .err { color:#a40000 }
/* LineLink */ .chroma .lnlinks { outline:none;text-decoration:none;color:inherit }
/* LineTableTD */ .chroma .lntd { vertical-align:top;padding:0;margin:0;border:0; }
/* LineTable */ .chroma .lntable { border-spacing:0;padding:0;margin:0;border:0; }
/* LineHighlight */ .chroma .hl { }
/* LineNumbersTable */ .chroma .lnt { white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f }
/* LineNumbers */ .chroma .ln { white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f }
/* Line */ .chroma .line { display:flex; }
/* Keyword */ .chroma .k { color:#204a87;font-weight:bold }
/* KeywordConstant */ .chroma .kc { color:#204a87;font-weight:bold }
/* KeywordDeclaration */ .chroma .kd { color:#204a87;font-weight:bold }
/* KeywordNamespace */ .chroma .kn { color:#204a87;font-weight:bold }
/* KeywordPseudo */ .chroma .kp { color:#204a87;font-weight:bold }
/* KeywordReserved */ .chroma .kr { color:#204a87;font-weight:bold }
/* KeywordType */ .chroma .kt { color:#204a87;font-weight:bold }
/* Name */ .chroma .n { color:#000 }
/* NameAttribute */ .chroma .na { color:#c4a000 }
/* NameClass */ .chroma .nc { color:#000 }
/* NameConstant */ .chroma .no { color:#000 }
/* NameDecorator */ .chroma .nd { color:#5c35cc;font-weight:bold }
/* NameEntity */ .chroma .ni { color:#ce5c00 }
/* NameException */ .chroma .ne { color:#c00;font-weight:bold }
/* NameLabel */ .chroma .nl { color:#f57900 }
/* NameNamespace */ .chroma .nn { color:#000 }
/* NameOther */ .chroma .nx { color:#000 }
/* NameProperty */ .chroma .py { color:#000 }
/* NameTag */ .chroma .nt { color:#204a87;font-weight:bold }
/* NameBuiltin */ .chroma .nb { color:#204a87 }
/* NameBuiltinPseudo */ .chroma .bp { color:#3465a4 }
/* NameVariable */ .chroma .nv { color:#000 }
/* NameVariableClass */ .chroma .vc { color:#000 }
/* NameVariableGlobal */ .chroma .vg { color:#000 }
/* NameVariableInstance */ .chroma .vi { color:#000 }
/* NameVariableMagic */ .chroma .vm { color:#000 }
/* NameFunction */ .chroma .nf { color:#000 }
/* NameFunctionMagic */ .chroma .fm { color:#000 }
/* Literal */ .chroma .l { color:#000 }
/* LiteralDate */ .chroma .ld { color:#000 }
/* LiteralString */ .chroma .s { color:#4e9a06 }
/* LiteralStringAffix */ .chroma .sa { color:#4e9a06 }
/* LiteralStringBacktick */ .chroma .sb { color:#4e9a06 }
/* LiteralStringChar */ .chroma .sc { color:#4e9a06 }
/* LiteralStringDelimiter */ .chroma .dl { color:#4e9a06 }
/* LiteralStringDoc */ .chroma .sd { color:#8f5902;font-style:italic }
/* LiteralStringDouble */ .chroma .s2 { color:#4e9a06 }
/* LiteralStringEscape */ .chroma .se { color:#4e9a06 }
/* LiteralStringHeredoc */ .chroma .sh { color:#4e9a06 }
/* LiteralStringInterpol */ .chroma .si { color:#4e9a06 }
/* LiteralStringOther */ .chroma .sx { color:#4e9a06 }
/* LiteralStringRegex */ .chroma .sr { color:#4e9a06 }
/* LiteralStringSingle */ .chroma .s1 { color:#4e9a06 }
/* LiteralStringSymbol */ .chroma .ss { color:#4e9a06 }
/* LiteralNumber */ .chroma .m { color:#0000cf;font-weight:bold }
/* LiteralNumberBin */ .chroma .mb { color:#0000cf;font-weight:bold }
/* LiteralNumberFloat */ .chroma .mf { color:#0000cf;font-weight:bold }
/* LiteralNumberHex */ .chroma .mh { color:#0000cf;font-weight:bold }
/* LiteralNumberInteger */ .chroma .mi { color:#0000cf;font-weight:bold }
/* LiteralNumberIntegerLong */ .chroma .il { color:#0000cf;font-weight:bold }
/* LiteralNumberOct */ .chroma .mo { color:#0000cf;font-weight:bold }
/* Operator */ .chroma .o { color:#ce5c00;font-weight:bold }
/* OperatorWord */ .chroma .ow { color:#204a87;font-weight:bold }
/* OperatorReserved */ .chroma .or { color:#ce5c00;font-weight:bold }
/* Punctuation */ .chroma .p { color:#000;font-weight:bold }
/* Comment */ .chroma .c { color:#8f5902;font-style:italic }
/* CommentHashbang */ .chroma .ch { color:#8f5902;font-style:italic }
/* CommentMultiline */ .chroma .cm { color:#8f5902;font-style:italic }
/* CommentSingle */ .chroma .c1 { color:#8f5902;font-style:italic }
/* CommentSpecial */ .chroma .cs { color:#8f5902;font-style:italic }
/* CommentPreproc */ .chroma .cp { color:#8f5902;font-style:italic }
/* CommentPreprocFile */ .chroma .cpf { color:#8f5902;font-style:italic }
/* Generic */ .chroma .g { color:#000 }
/* GenericDeleted */ .chroma .gd { color:#a40000 }
/* GenericEmph */ .chroma .ge { color:#000;font-style:italic }
/* GenericError */ .chroma .gr { color:#ef2929 }
/* GenericHeading */ .chroma .gh { color:#000080;font-weight:bold }
/* GenericInserted */ .chroma .gi { color:#00a000 }
/* GenericOutput */ .chroma .go { color:#000;font-style:italic }
/* GenericPrompt */ .chroma .gp { color:#8f5902 }
/* GenericStrong */ .chroma .gs { color:#000;font-weight:bold }
/* GenericSubheading */ .chroma .gu { color:#800080;font-weight:bold }
/* GenericTraceback */ .chroma .gt { color:#a40000;font-weight:bold }
/* GenericUnderline */ .chroma .gl { color:#000;text-decoration:underline }
/* TextWhitespace */ .chroma .w { color:#f8f8f8 }
}

[data-bs-theme="dark"] {
/* PreWrapper */ .chroma { color:#e6edf3;-webkit-text-size-adjust:none; }
/* Error */ .chroma .err { color:#f85149 }
/* LineLink */ .chroma .lnlinks { outline:none;text-decoration:none;color:inherit }
/* LineTableTD */ .chroma .lntd { vertical-align:top;padding:0;margin:0;border:0; }
/* LineTable */ .chroma .lntable { border-spacing:0;padding:0;margin:0;border:0; }
/* LineHighlight */ .chroma .hl { }
/* LineNumbersTable */ .chroma .lnt { white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679 }
/* LineNumbers */ .chroma .ln { white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6e7681 }
/* Line */ .chroma .line { display:flex; }
/* Keyword */ .chroma .k { color:#ff7b72 }
/* KeywordConstant */ .chroma .kc { color:#79c0ff }
/* KeywordDeclaration */ .chroma .kd { color:#ff7b72 }
/* KeywordNamespace */ .chroma .kn { color:#ff7b72 }
/* KeywordPseudo */ .chroma .kp { color:#79c0ff }
/* KeywordReserved */ .chroma .kr { color:#ff7b72 }
/* KeywordType */ .chroma .kt { color:#ff7b72 }
/* NameClass */ .chroma .nc { color:#f0883e;font-weight:bold }
/* NameConstant */ .chroma .no { color:#79c0ff;font-weight:bold }
/* NameDecorator */ .chroma .nd { color:#d2a8ff;font-weight:bold }
/* NameEntity */ .chroma .ni { color:#ffa657 }
/* NameException */ .chroma .ne { color:#f0883e;font-weight:bold }
/* NameLabel */ .chroma .nl { color:#79c0ff;font-weight:bold }
/* NameNamespace */ .chroma .nn { color:#ff7b72 }
/* NameOther */ .chroma .nx { color:#e6edf3 }
/* NameProperty */ .chroma .py { color:#79c0ff }
/* NameTag */ .chroma .nt { color:#7ee787 }
/* NameVariable */ .chroma .nv { color:#79c0ff }
/* NameVariableClass */ .chroma .vc { color:#79c0ff }
/* NameVariableGlobal */ .chroma .vg { color:#79c0ff }
/* NameVariableInstance */ .chroma .vi { color:#79c0ff }
/* NameVariableMagic */ .chroma .vm { color:#79c0ff }
/* NameFunction */ .chroma .nf { color:#d2a8ff;font-weight:bold }
/* NameFunctionMagic */ .chroma .fm { color:#d2a8ff;font-weight:bold }
/* Literal */ .chroma .l { color:#a5d6ff }
/* LiteralDate */ .chroma .ld { color:#79c0ff }
/* LiteralString */ .chroma .s { color:#a5d6ff }
/* LiteralStringAffix */ .chroma .sa { color:#79c0ff }
/* LiteralStringBacktick */ .chroma .sb { color:#a5d6ff }
/* LiteralStringChar */ .chroma .sc { color:#a5d6ff }
/* LiteralStringDelimiter */ .chroma .dl { color:#79c0ff }
/* LiteralStringDoc */ .chroma .sd { color:#a5d6ff }
/* LiteralStringDouble */ .chroma .s2 { color:#a5d6ff }
/* LiteralStringEscape */ .chroma .se { color:#79c0ff }
/* LiteralStringHeredoc */ .chroma .sh { color:#79c0ff }
/* LiteralStringInterpol */ .chroma .si { color:#a5d6ff }
/* LiteralStringOther */ .chroma .sx { color:#a5d6ff }
/* LiteralStringRegex */ .chroma .sr { color:#79c0ff }
/* LiteralStringSingle */ .chroma .s1 { color:#a5d6ff }
/* LiteralStringSymbol */ .chroma .ss { color:#a5d6ff }
/* LiteralNumber */ .chroma .m { color:#a5d6ff }
/* LiteralNumberBin */ .chroma .mb { color:#a5d6ff }
/* LiteralNumberFloat */ .chroma .mf { color:#a5d6ff }
/* LiteralNumberHex */ .chroma .mh { color:#a5d6ff }
/* LiteralNumberInteger */ .chroma .mi { color:#a5d6ff }
/* LiteralNumberIntegerLong */ .chroma .il { color:#a5d6ff }
/* LiteralNumberOct */ .chroma .mo { color:#a5d6ff }
/* Operator */ .chroma .o { color:#ff7b72;font-weight:bold }
/* OperatorWord */ .chroma .ow { color:#ff7b72;font-weight:bold }
/* OperatorReserved */ .chroma .or { color:#ff7b72;font-weight:bold }
/* Comment */ .chroma .c { color:#8b949e;font-style:italic }
/* CommentHashbang */ .chroma .ch { color:#8b949e;font-style:italic }
/* CommentMultiline */ .chroma .cm { color:#8b949e;font-style:italic }
/* CommentSingle */ .chroma .c1 { color:#8b949e;font-style:italic }
/* CommentSpecial */ .chroma .cs { color:#8b949e;font-weight:bold;font-style:italic }
/* CommentPreproc */ .chroma .cp { color:#8b949e;font-weight:bold;font-style:italic }
/* CommentPreprocFile */ .chroma .cpf { color:#8b949e;font-weight:bold;font-style:italic }
/* GenericDeleted */ .chroma .gd { color:#ffa198; }
/* GenericEmph */ .chroma .ge { font-style:italic }
/* GenericError */ .chroma .gr { color:#ffa198 }
/* GenericHeading */ .chroma .gh { color:#79c0ff;font-weight:bold }
/* GenericInserted */ .chroma .gi { color:#56d364; }
/* GenericOutput */ .chroma .go { color:#8b949e }
/* GenericPrompt */ .chroma .gp { color:#8b949e }
/* GenericStrong */ .chroma .gs { font-weight:bold }
/* GenericSubheading */ .chroma .gu { color:#79c0ff }
/* GenericTraceback */ .chroma .gt { color:#ff7b72 }
/* GenericUnderline */ .chroma .gl { text-decoration:underline }
/* TextWhitespace */ .chroma .w { color:#6e7681 }
}

// Themed code-block background via token (beats any generated .chroma bg).
.td-content .highlight pre,
.td-content .highlight pre.chroma {
background: var(--d-code-bg);
}
26 changes: 26 additions & 0 deletions daprdocs/assets/scss/_code-tabs.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
//
// code-tabs
//

.td-content {
.nav-tabs {
border-bottom: 1px solid var(--d-border); gap: 2px; flex-wrap: nowrap; overflow-x: auto;
scrollbar-width: none; margin-bottom: 0;
}
.nav-tabs::-webkit-scrollbar { display: none; }
.nav-tabs .nav-item { margin-bottom: -1px; }
.nav-tabs .nav-link {
font-family: var(--font-head); font-size: .8rem; font-weight: 500; color: var(--d-muted);
background: none; border: none; border-bottom: 3px solid transparent; border-radius: 0;
padding: 7px 12px; white-space: nowrap;
}
.nav-tabs .nav-link:hover { color: var(--d-body); border-bottom-color: color-mix(in srgb, var(--d-orange) 35%, transparent); }
.nav-tabs .nav-link.active {
color: var(--d-heading); font-weight: 600; background: none; border-bottom-color: var(--d-orange);
}
// Blend the tab body with regular .td-content — no distinct panel background
// or border. Code blocks inside keep their own .highlight background.
.tab-content { background: transparent; border: none; max-width: 100%; }
.tab-content .tab-pane { background: transparent; border: none; padding: .5rem 0 0; }
.tab-content pre { overflow-x: auto; max-width: 100%; font-size: .82rem; line-height: 1.6; }
}
Loading
Loading