diff --git a/src/ShellDocs.Components/Chrome/BrandLogo.razor b/src/ShellDocs.Components/Chrome/BrandLogo.razor
new file mode 100644
index 0000000..88e3cc2
--- /dev/null
+++ b/src/ShellDocs.Components/Chrome/BrandLogo.razor
@@ -0,0 +1,30 @@
+@namespace ShellDocs.Components.Chrome
+@inject ShellDocsOptions Options
+
+@if (!string.IsNullOrWhiteSpace(Options.LogoSvg))
+{
+
+ @((MarkupString)Options.LogoSvg)
+
+}
+else if (HasUrlLogo)
+{
+ var light = Options.LogoLight ?? Options.LogoDark!;
+ var dark = Options.LogoDark ?? Options.LogoLight!;
+
+
+ @if (!string.Equals(light, dark, StringComparison.Ordinal))
+ {
+
+ }
+}
+else
+{
+
+}
+
+@code {
+ private bool HasUrlLogo => !string.IsNullOrEmpty(Options.LogoLight) || !string.IsNullOrEmpty(Options.LogoDark);
+ private string Alt => Options.LogoAlt ?? Options.SiteName ?? "";
+ private string Height => Options.LogoHeight.ToString(System.Globalization.CultureInfo.InvariantCulture) + "rem";
+}
diff --git a/src/ShellDocs.Components/Chrome/BrandLogo.razor.css b/src/ShellDocs.Components/Chrome/BrandLogo.razor.css
new file mode 100644
index 0000000..2e13767
--- /dev/null
+++ b/src/ShellDocs.Components/Chrome/BrandLogo.razor.css
@@ -0,0 +1,30 @@
+.brand-logo {
+ display: inline-block;
+ width: auto;
+ flex-shrink: 0;
+ object-fit: contain;
+}
+
+.brand-logo-dark { display: none; }
+:root.dark .brand-logo-light { display: none; }
+:root.dark .brand-logo-dark { display: inline-block; }
+
+.brand-logo-svg {
+ display: inline-flex;
+ align-items: center;
+ flex-shrink: 0;
+ color: var(--foreground);
+}
+::deep .brand-logo-svg > svg {
+ height: 100%;
+ width: auto;
+ display: block;
+}
+
+.brand-logo-dot {
+ width: 1.125rem;
+ height: 1.125rem;
+ border-radius: 4px;
+ background: var(--foreground);
+ flex-shrink: 0;
+}
diff --git a/src/ShellDocs.Components/Chrome/DocsFooter.razor b/src/ShellDocs.Components/Chrome/DocsFooter.razor
index 41192dd..54f4fc9 100644
--- a/src/ShellDocs.Components/Chrome/DocsFooter.razor
+++ b/src/ShellDocs.Components/Chrome/DocsFooter.razor
@@ -4,7 +4,7 @@