feat(ui): incorporate PubScript logo as favicon & Topbar mark

Recreate the gold-rimmed 'PS' typewriter-tile emblem as scalable SVGs:
- public/logo.svg — dark-ground emblem used as the app favicon
- public/logo-mark.svg — transparent mark placed in the Topbar beside
  the page title, with a subtle hover scale

Add <link rel=icon> to index.html and a .ps-topbar-logo rule in
AppShell.css.
This commit is contained in:
Schwitzz
2026-10-26 23:53:43 -05:00
parent 978858362d
commit 2a522977e9
5 changed files with 99 additions and 1 deletions
+1
View File
@@ -6,6 +6,7 @@
<meta name="color-scheme" content="dark light" />
<title>PubScript</title>
<meta name="description" content="A local-first writing environment for authors." />
<link rel="icon" type="image/svg+xml" href="/logo.svg" />
</head>
<body>
<div id="root"></div>
+37
View File
@@ -0,0 +1,37 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512" role="img" aria-label="PubScript">
<defs>
<linearGradient id="mg-gold" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#f9edc4"/>
<stop offset="0.27" stop-color="#e8c76a"/>
<stop offset="0.52" stop-color="#c9a23a"/>
<stop offset="0.72" stop-color="#f4d683"/>
<stop offset="1" stop-color="#937420"/>
</linearGradient>
<radialGradient id="mg-ivory" cx="45%" cy="38%" r="72%">
<stop offset="0" stop-color="#fffdf4"/>
<stop offset="0.72" stop-color="#f5ecd6"/>
<stop offset="1" stop-color="#e8dcbd"/>
</radialGradient>
<filter id="mg-shadow" x="-35%" y="-35%" width="170%" height="170%">
<feDropShadow dx="0" dy="5" stdDeviation="8" flood-color="#000000" flood-opacity="0.35"/>
</filter>
</defs>
<g filter="url(#mg-shadow)">
<!-- P tile -->
<circle cx="126" cy="256" r="120" fill="url(#mg-gold)"/>
<circle cx="126" cy="256" r="104" fill="url(#mg-ivory)"/>
<circle cx="126" cy="256" r="104" fill="none" stroke="#8a6d1c" stroke-width="1.5" opacity="0.5"/>
<text x="126" y="256" text-anchor="middle" dominant-baseline="central"
font-family="Georgia, 'Times New Roman', serif" font-size="152" font-weight="600"
fill="#21242c">P</text>
<!-- S tile -->
<circle cx="386" cy="256" r="120" fill="url(#mg-gold)"/>
<circle cx="386" cy="256" r="104" fill="url(#mg-ivory)"/>
<circle cx="386" cy="256" r="104" fill="none" stroke="#8a6d1c" stroke-width="1.5" opacity="0.5"/>
<text x="386" y="256" text-anchor="middle" dominant-baseline="central"
font-family="Georgia, 'Times New Roman', serif" font-size="152" font-weight="600"
fill="#21242c">S</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+43
View File
@@ -0,0 +1,43 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512" role="img" aria-label="PubScript">
<defs>
<radialGradient id="ps-bg" cx="48%" cy="40%" r="78%">
<stop offset="0" stop-color="#2b313d"/>
<stop offset="1" stop-color="#15181f"/>
</radialGradient>
<linearGradient id="ps-gold" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#f9edc4"/>
<stop offset="0.27" stop-color="#e8c76a"/>
<stop offset="0.52" stop-color="#c9a23a"/>
<stop offset="0.72" stop-color="#f4d683"/>
<stop offset="1" stop-color="#937420"/>
</linearGradient>
<radialGradient id="ps-ivory" cx="45%" cy="38%" r="72%">
<stop offset="0" stop-color="#fffdf4"/>
<stop offset="0.72" stop-color="#f5ecd6"/>
<stop offset="1" stop-color="#e8dcbd"/>
</radialGradient>
<filter id="ps-shadow" x="-35%" y="-35%" width="170%" height="170%">
<feDropShadow dx="0" dy="7" stdDeviation="11" flood-color="#000000" flood-opacity="0.45"/>
</filter>
</defs>
<rect width="512" height="512" rx="104" fill="url(#ps-bg)"/>
<g filter="url(#ps-shadow)">
<!-- P tile -->
<circle cx="126" cy="256" r="120" fill="url(#ps-gold)"/>
<circle cx="126" cy="256" r="104" fill="url(#ps-ivory)"/>
<circle cx="126" cy="256" r="104" fill="none" stroke="#8a6d1c" stroke-width="1.5" opacity="0.5"/>
<text x="126" y="256" text-anchor="middle" dominant-baseline="central"
font-family="Georgia, 'Times New Roman', serif" font-size="152" font-weight="600"
fill="#21242c">P</text>
<!-- S tile -->
<circle cx="386" cy="256" r="120" fill="url(#ps-gold)"/>
<circle cx="386" cy="256" r="104" fill="url(#ps-ivory)"/>
<circle cx="386" cy="256" r="104" fill="none" stroke="#8a6d1c" stroke-width="1.5" opacity="0.5"/>
<text x="386" y="256" text-anchor="middle" dominant-baseline="central"
font-family="Georgia, 'Times New Roman', serif" font-size="152" font-weight="600"
fill="#21242c">S</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

+8 -1
View File
@@ -29,7 +29,14 @@ export function Topbar({ onOpenPalette, onOpenExport }: TopbarProps) {
return (
<header className="ps-topbar">
<h1 style={{ margin: 0, fontSize: 15, fontWeight: 600 }}>{title}</h1>
<img
src="/logo-mark.svg"
alt="PubScript"
className="ps-topbar-logo"
style={{ height: 26, width: "auto", marginRight: 12, display: "inline-block", verticalAlign: "middle" }}
/>
<h1 style={{ margin: 0, fontSize: 15, fontWeight: 600, display: "inline-flex", verticalAlign: "middle" }}>{title}</h1>
{autoSave && <Badge variant="success">✓ autosave on</Badge>}