site, branding: skeuomorphic marks, and the new Niveus components

The marks are now drawn the way Niveus draws its keys: one light from the
upper left, gloss on the faces that catch it, a specular line on the edges
that face it, and soft contact shadows.

- Shift: shaded slabs, each casting onto the one below. shift-mask.svg is
  untouched, so the kernel's logo.h coverage mask is unchanged.
- Uberblock: bevelled slots in a groove; the newest slot and the root glow.
- USB stick: moulded body, steel connector, a lit activity LED.
- Pride flag: cloth folds and a hem over the flag's own colours.

The pages use the components the new Niveus added: both terminals are
.nv-window frames, the origin and first-boot sequences are .nv-steps, the
numbers are a .nv-stat-group, and each feature card has an .nv-tile glyph.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S1giNvrHTrPMPw7V6x1kQ4
This commit is contained in:
Nexoniarz 2026-10-23 15:17:34 +02:00
commit c9790df04c
11 changed files with 623 additions and 321 deletions

View file

@ -57,6 +57,12 @@ the kernel's name (**SchIFT**) as a shape.
- **With or without a wordmark.** Set "SchOS" beside it in **Roboto Bold**,
which is already in the tree (`ports/Roboto`), Apache-2.0, and already
in `NOTICE`.
- **Rendered as an object, drawn as a shape.** The colour `shift.svg` is lit
the way Niveus lights a key -- one light from the upper left, a gloss across
each top face, a specular line on the edges that face it, and a soft shadow
from each slab onto the next. None of that is in the silhouette:
`shift-mask.svg` is the same geometry with no shading, and it is still what
`include/gfx/logo.h` is built from, so the kernel's mark is unchanged.
- Non-human and non-animal, permanently. If a character is ever drawn it gets
its own mark; a logo that starts growing a face has taken that job.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before After
Before After

View file

@ -8,20 +8,101 @@
without it the slab has no thickness where it is widest, and the corner reads
as a hole rather than an edge.
Drawn the way Niveus draws a key: light falls from the upper left, so every
top face is brightest at its far-left corner and every edge that faces the
light carries a thin specular line. The front faces are lit from above and
darken towards the ground; the end walls face away and are darkest. Each slab
casts a soft shadow on the one below it, which is what makes the stack read
as three objects rather than three stripes.
Geometry is shared with "shift-mask.svg"; see that file.</desc>
<defs>
<!-- top faces: lit corner to far corner -->
<linearGradient id="t1" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#A48CFF"/>
<stop offset="0.55" stop-color="#7C5CFF"/>
<stop offset="1" stop-color="#6A48F0"/>
</linearGradient>
<linearGradient id="t2" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#8064E6"/>
<stop offset="0.55" stop-color="#5B44C4"/>
<stop offset="1" stop-color="#4E39AE"/>
</linearGradient>
<linearGradient id="t3" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#5A48A8"/>
<stop offset="0.55" stop-color="#3C2E85"/>
<stop offset="1" stop-color="#332772"/>
</linearGradient>
<!-- front faces: lit at the top edge, falling into shade -->
<linearGradient id="f1" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#6E50E8"/>
<stop offset="1" stop-color="#4E35BC"/>
</linearGradient>
<linearGradient id="f2" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#4E3AAE"/>
<stop offset="1" stop-color="#372887"/>
</linearGradient>
<linearGradient id="f3" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#342874"/>
<stop offset="1" stop-color="#231A52"/>
</linearGradient>
<!-- end walls: facing away from the light -->
<linearGradient id="w1" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#4F36B4"/>
<stop offset="1" stop-color="#3A2690"/>
</linearGradient>
<linearGradient id="w2" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#3A2A86"/>
<stop offset="1" stop-color="#2B1F68"/>
</linearGradient>
<linearGradient id="w3" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#261C56"/>
<stop offset="1" stop-color="#1A133E"/>
</linearGradient>
<!-- the gloss across each top face, strongest at its back edge -->
<linearGradient id="gloss" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#FFFFFF" stop-opacity="0.38"/>
<stop offset="0.45" stop-color="#FFFFFF" stop-opacity="0.08"/>
<stop offset="1" stop-color="#FFFFFF" stop-opacity="0"/>
</linearGradient>
<filter id="soft" x="-20%" y="-40%" width="140%" height="180%">
<feGaussianBlur stdDeviation="4"/>
</filter>
</defs>
<!-- contact shadows, each cast down and to the right of its slab -->
<path fill="#000" opacity="0.35" filter="url(#soft)" d="M58 138 L160 138 L132 170 L28 170 Z"/>
<path fill="#000" opacity="0.30" filter="url(#soft)" d="M76 96 L178 96 L150 128 L46 128 Z"/>
<path fill="#000" opacity="0.26" filter="url(#soft)" d="M94 54 L196 54 L168 86 L64 86 Z"/>
<!-- bottom slab -->
<path fill="#3C2E85" d="M54 126 L158 126 L128 156 L24 156 Z"/>
<path fill="#31256E" d="M24 156 L128 156 L128 167 L24 167 Z"/>
<path fill="#291F5C" d="M158 126 L158 137 L128 167 L128 156 Z"/>
<path fill="url(#t3)" d="M54 126 L158 126 L128 156 L24 156 Z"/>
<path fill="url(#gloss)" d="M54 126 L158 126 L128 156 L24 156 Z"/>
<path fill="url(#f3)" d="M24 156 L128 156 L128 167 L24 167 Z"/>
<path fill="url(#w3)" d="M158 126 L158 137 L128 167 L128 156 Z"/>
<path fill="none" stroke="#FFFFFF" stroke-opacity="0.35" stroke-width="1.2"
stroke-linecap="round" d="M24.6 155.4 L54.4 126.6 L157 126.6"/>
<path fill="none" stroke="#FFFFFF" stroke-opacity="0.16" stroke-width="1"
d="M24 156.5 L128 156.5"/>
<!-- middle slab -->
<path fill="#5B44C4" d="M72 84 L176 84 L146 114 L42 114 Z"/>
<path fill="#4B37A6" d="M42 114 L146 114 L146 125 L42 125 Z"/>
<path fill="#3F2D8C" d="M176 84 L176 95 L146 125 L146 114 Z"/>
<path fill="url(#t2)" d="M72 84 L176 84 L146 114 L42 114 Z"/>
<path fill="url(#gloss)" d="M72 84 L176 84 L146 114 L42 114 Z"/>
<path fill="url(#f2)" d="M42 114 L146 114 L146 125 L42 125 Z"/>
<path fill="url(#w2)" d="M176 84 L176 95 L146 125 L146 114 Z"/>
<path fill="none" stroke="#FFFFFF" stroke-opacity="0.42" stroke-width="1.2"
stroke-linecap="round" d="M42.6 113.4 L72.4 84.6 L175 84.6"/>
<path fill="none" stroke="#FFFFFF" stroke-opacity="0.18" stroke-width="1"
d="M42 114.5 L146 114.5"/>
<!-- top slab -->
<path fill="#7C5CFF" d="M90 42 L194 42 L164 72 L60 72 Z"/>
<path fill="#6949E0" d="M60 72 L164 72 L164 83 L60 83 Z"/>
<path fill="#5B3FC9" d="M194 42 L194 53 L164 83 L164 72 Z"/>
<path fill="url(#t1)" d="M90 42 L194 42 L164 72 L60 72 Z"/>
<path fill="url(#gloss)" d="M90 42 L194 42 L164 72 L60 72 Z"/>
<path fill="url(#f1)" d="M60 72 L164 72 L164 83 L60 83 Z"/>
<path fill="url(#w1)" d="M194 42 L194 53 L164 83 L164 72 Z"/>
<path fill="none" stroke="#FFFFFF" stroke-opacity="0.55" stroke-width="1.2"
stroke-linecap="round" d="M60.6 71.4 L90.4 42.6 L193 42.6"/>
<path fill="none" stroke="#FFFFFF" stroke-opacity="0.22" stroke-width="1"
d="M60 72.5 L164 72.5"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Before After
Before After

View file

@ -20,25 +20,88 @@
survives include/gfx/logo.h, which is a single coverage channel and keeps no
colour at all.
Drawn as Niveus draws a dial: the slots are raised keys set into a groove
cut into the surface, bevelled by one light from the upper left, and the
newest slot and the root are lit from inside. The geometry is unchanged.
Stands alone, with no reference to SchOS, as projects/schfs-linux/README.md
requires.</desc>
<g fill="#3C2E85">
<path d="M85.93 20.23 A81.00 81.00 0 0 1 114.07 20.23 L110.25 41.90 A59.00 59.00 0 0 0 89.75 41.90 Z"/>
<path d="M162.05 47.93 A81.00 81.00 0 0 1 176.12 72.30 L155.44 79.82 A59.00 59.00 0 0 0 145.20 62.08 Z"/>
<path d="M179.77 85.93 A81.00 81.00 0 0 1 179.77 114.07 L158.10 110.25 A59.00 59.00 0 0 0 158.10 89.75 Z"/>
<path d="M176.12 127.70 A81.00 81.00 0 0 1 162.05 152.07 L145.20 137.92 A59.00 59.00 0 0 0 155.44 120.18 Z"/>
<path d="M152.07 162.05 A81.00 81.00 0 0 1 127.70 176.12 L120.18 155.44 A59.00 59.00 0 0 0 137.92 145.20 Z"/>
<path d="M114.07 179.77 A81.00 81.00 0 0 1 85.93 179.77 L89.75 158.10 A59.00 59.00 0 0 0 110.25 158.10 Z"/>
<path d="M72.30 176.12 A81.00 81.00 0 0 1 47.93 162.05 L62.08 145.20 A59.00 59.00 0 0 0 79.82 155.44 Z"/>
<path d="M37.95 152.07 A81.00 81.00 0 0 1 23.88 127.70 L44.56 120.18 A59.00 59.00 0 0 0 54.80 137.92 Z"/>
<path d="M20.23 114.07 A81.00 81.00 0 0 1 20.23 85.93 L41.90 89.75 A59.00 59.00 0 0 0 41.90 110.25 Z"/>
<path d="M23.88 72.30 A81.00 81.00 0 0 1 37.95 47.93 L54.80 62.08 A59.00 59.00 0 0 0 44.56 79.82 Z"/>
<path d="M47.93 37.95 A81.00 81.00 0 0 1 72.30 23.88 L79.82 44.56 A59.00 59.00 0 0 0 62.08 54.80 Z"/>
<defs>
<!-- one light for the whole dial, so every slot is lit from the same side -->
<linearGradient id="slot" gradientUnits="userSpaceOnUse" x1="20" y1="20" x2="180" y2="180">
<stop offset="0" stop-color="#5A47B0"/>
<stop offset="0.5" stop-color="#3C2E85"/>
<stop offset="1" stop-color="#2A2066"/>
</linearGradient>
<linearGradient id="lit" gradientUnits="userSpaceOnUse" x1="120" y1="10" x2="160" y2="56">
<stop offset="0" stop-color="#B09CFF"/>
<stop offset="0.5" stop-color="#7C5CFF"/>
<stop offset="1" stop-color="#5A3BE0"/>
</linearGradient>
<radialGradient id="root" cx="0.38" cy="0.34" r="0.7">
<stop offset="0" stop-color="#E4DCFF"/>
<stop offset="0.3" stop-color="#9F86FF"/>
<stop offset="0.75" stop-color="#7C5CFF"/>
<stop offset="1" stop-color="#4E32C8"/>
</radialGradient>
<radialGradient id="groove" cx="0.5" cy="0.5" r="0.5">
<stop offset="0.5" stop-color="#0E0B1E" stop-opacity="0"/>
<stop offset="0.62" stop-color="#0E0B1E" stop-opacity="0.55"/>
<stop offset="0.92" stop-color="#0E0B1E" stop-opacity="0.55"/>
<stop offset="1" stop-color="#0E0B1E" stop-opacity="0"/>
</radialGradient>
<radialGradient id="halo" cx="0.5" cy="0.5" r="0.5">
<stop offset="0" stop-color="#9F86FF" stop-opacity="0.55"/>
<stop offset="1" stop-color="#7C5CFF" stop-opacity="0"/>
</radialGradient>
<!-- The bevel: the shape's own alpha, blurred into a height map and lit
from the upper left, added back over the fill. -->
<filter id="bevel" x="-10%" y="-10%" width="120%" height="120%">
<feGaussianBlur in="SourceAlpha" stdDeviation="1.6" result="h"/>
<feSpecularLighting in="h" surfaceScale="3" specularConstant="0.85"
specularExponent="16" lighting-color="#FFFFFF" result="s">
<feDistantLight azimuth="225" elevation="40"/>
</feSpecularLighting>
<feComposite in="s" in2="SourceAlpha" operator="in" result="sa"/>
<feComposite in="SourceGraphic" in2="sa" operator="arithmetic" k2="1" k3="0.55"/>
</filter>
<filter id="drop" x="-20%" y="-20%" width="140%" height="140%">
<feGaussianBlur in="SourceAlpha" stdDeviation="2.5"/>
<feOffset dx="1.5" dy="2.5" result="o"/>
<feComponentTransfer><feFuncA type="linear" slope="0.5"/></feComponentTransfer>
<feMerge><feMergeNode/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
</defs>
<!-- the groove the slots sit in -->
<circle cx="100" cy="100" r="86" fill="url(#groove)"/>
<g filter="url(#drop)">
<g fill="url(#slot)" filter="url(#bevel)">
<path d="M85.93 20.23 A81.00 81.00 0 0 1 114.07 20.23 L110.25 41.90 A59.00 59.00 0 0 0 89.75 41.90 Z"/>
<path d="M162.05 47.93 A81.00 81.00 0 0 1 176.12 72.30 L155.44 79.82 A59.00 59.00 0 0 0 145.20 62.08 Z"/>
<path d="M179.77 85.93 A81.00 81.00 0 0 1 179.77 114.07 L158.10 110.25 A59.00 59.00 0 0 0 158.10 89.75 Z"/>
<path d="M176.12 127.70 A81.00 81.00 0 0 1 162.05 152.07 L145.20 137.92 A59.00 59.00 0 0 0 155.44 120.18 Z"/>
<path d="M152.07 162.05 A81.00 81.00 0 0 1 127.70 176.12 L120.18 155.44 A59.00 59.00 0 0 0 137.92 145.20 Z"/>
<path d="M114.07 179.77 A81.00 81.00 0 0 1 85.93 179.77 L89.75 158.10 A59.00 59.00 0 0 0 110.25 158.10 Z"/>
<path d="M72.30 176.12 A81.00 81.00 0 0 1 47.93 162.05 L62.08 145.20 A59.00 59.00 0 0 0 79.82 155.44 Z"/>
<path d="M37.95 152.07 A81.00 81.00 0 0 1 23.88 127.70 L44.56 120.18 A59.00 59.00 0 0 0 54.80 137.92 Z"/>
<path d="M20.23 114.07 A81.00 81.00 0 0 1 20.23 85.93 L41.90 89.75 A59.00 59.00 0 0 0 41.90 110.25 Z"/>
<path d="M23.88 72.30 A81.00 81.00 0 0 1 37.95 47.93 L54.80 62.08 A59.00 59.00 0 0 0 44.56 79.82 Z"/>
<path d="M47.93 37.95 A81.00 81.00 0 0 1 72.30 23.88 L79.82 44.56 A59.00 59.00 0 0 0 62.08 54.80 Z"/>
</g>
</g>
<g fill="#7C5CFF">
<path d="M132.15 11.67 A94.00 94.00 0 0 1 160.42 27.99 L137.92 54.80 A59.00 59.00 0 0 0 120.18 44.56 Z"/>
<circle cx="100" cy="100" r="20"/>
<!-- the newest slot and the root it names, lit from inside -->
<circle cx="141" cy="36" r="32" fill="url(#halo)"/>
<circle cx="100" cy="100" r="34" fill="url(#halo)"/>
<g filter="url(#drop)">
<g filter="url(#bevel)">
<path fill="url(#lit)" d="M132.15 11.67 A94.00 94.00 0 0 1 160.42 27.99 L137.92 54.80 A59.00 59.00 0 0 0 120.18 44.56 Z"/>
<circle cx="100" cy="100" r="20" fill="url(#root)"/>
</g>
</g>
<ellipse cx="93" cy="92" rx="6.5" ry="4" fill="#FFFFFF" opacity="0.55"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Before After
Before After