feat(website): brand guide page + NodeMark/NodeLockup variants
Replace the /brand stub with the full Brand Guide from the Claude Design handoff (cover, logo, color, typography, voice, applications), rendered inside the site layout, English-only, with illustrative copy adapted to Dezky's real EU-sovereign voice. Extend NodeMark with a `variant` (donut/solid/outline) and NodeLockup with a separate `wordmark` colour so the mark reads correctly on dark surfaces. Drops the old brand stub copy.
This commit is contained in:
@@ -1,18 +1,23 @@
|
||||
<script setup lang="ts">
|
||||
// Dezky "Node" mark — a lowercase d (donut style) inside a squircle, with a
|
||||
// corner node-dot. Geometry is the locked set from the brand handoff
|
||||
// (logos.jsx NodeMark + LOCKED). The squircle paints in `fg`; the letterform
|
||||
// and dot paint in `accent` (electric chartreuse) — the design's intent.
|
||||
// Dezky "Node" mark — a lowercase d inside a squircle, with a corner node-dot.
|
||||
// Geometry is the locked set from the brand handoff (logos.jsx NodeMark +
|
||||
// LOCKED). The squircle paints in `fg`; the letterform and dot paint in
|
||||
// `accent` (electric chartreuse). `variant` controls the bowl rendering:
|
||||
// donut/solid paint the filled letter (with counter); outline knocks out an
|
||||
// eroded copy so only a uniform rim survives.
|
||||
import { computed } from 'vue'
|
||||
import { C, LOCKED } from '~/utils/landingTokens'
|
||||
|
||||
const props = withDefaults(defineProps<{
|
||||
size?: number
|
||||
fg?: string
|
||||
accent?: string
|
||||
variant?: 'donut' | 'solid' | 'outline'
|
||||
}>(), {
|
||||
size: 96,
|
||||
fg: C.carbon,
|
||||
accent: C.signal,
|
||||
variant: 'donut',
|
||||
})
|
||||
|
||||
const { bowlR, stemW, dotR, contR } = LOCKED
|
||||
@@ -40,12 +45,40 @@ const stemPath =
|
||||
`a ${capR} ${capR} 0 0 1 ${stemW} 0 ` +
|
||||
`L ${stemRight} ${stemBottom} ` +
|
||||
`L ${stemX} ${stemBottom} Z`
|
||||
|
||||
// Eroded inner copy for the outline variant (a uniform rim survives).
|
||||
const outline = computed(() => {
|
||||
const maxOw = (overlap - 1.4) / 2
|
||||
const ow = Math.max(1.1, Math.min(stemW * 0.32, maxOw))
|
||||
const ibowlR = bowlR - ow
|
||||
const iholeR = holeR + ow
|
||||
const istemX = stemX + ow
|
||||
const istemW = Math.max(1.2, stemW - 2 * ow)
|
||||
const istemRight = istemX + istemW
|
||||
const icapR = istemW / 2
|
||||
const istemTop = stemTop + ow
|
||||
return {
|
||||
bowl: `M ${cx - ibowlR} ${cy} a ${ibowlR} ${ibowlR} 0 1 0 ${ibowlR * 2} 0 a ${ibowlR} ${ibowlR} 0 1 0 ${-ibowlR * 2} 0 Z`,
|
||||
counter: `M ${cx - iholeR} ${cy} a ${iholeR} ${iholeR} 0 1 0 ${iholeR * 2} 0 a ${iholeR} ${iholeR} 0 1 0 ${-iholeR * 2} 0 Z`,
|
||||
stem: `M ${istemX} ${istemTop + icapR} a ${icapR} ${icapR} 0 0 1 ${istemW} 0 L ${istemRight} ${stemBottom} L ${istemX} ${stemBottom} Z`,
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<svg :width="size" :height="size" viewBox="0 0 100 100" aria-label="dezky node mark">
|
||||
<rect x="8" y="8" width="84" height="84" :rx="contR" :fill="fg" />
|
||||
<g :fill="accent">
|
||||
<template v-if="variant === 'outline'">
|
||||
<path :d="`${bowlPath} ${counterPath}`" fill-rule="evenodd" :fill="accent" />
|
||||
<path :d="stemPath" :fill="accent" />
|
||||
<path :d="`${outline.bowl} ${outline.counter}`" fill-rule="evenodd" :fill="fg" />
|
||||
<path :d="outline.stem" :fill="fg" />
|
||||
</template>
|
||||
<g v-else-if="variant === 'solid'" :fill="accent">
|
||||
<path :d="bowlPath" />
|
||||
<path :d="stemPath" />
|
||||
</g>
|
||||
<g v-else :fill="accent">
|
||||
<path :d="`${bowlPath} ${counterPath}`" fill-rule="evenodd" />
|
||||
<path :d="stemPath" />
|
||||
</g>
|
||||
|
||||
Reference in New Issue
Block a user