brand: pressure-dial mark, logo, favicons, manifest, OG image; registry fragment developer/SaaS/AI/security (5 319 targets, 319 services); docs
17 changed files +4,616 −4,384
modified
README.md
+1 −1
@@ -12,7 +12,7 @@ Live: https://www.internetpressure.io · API: `/api/v1/*` (see `docs/API.md`) · | |||||
| 12 | | `apps/api` | Python package `internetpressure`: ingestion API, pressure engine, event engine, BGP ingestor, corroboration connectors, public/admin API, SSE | | 12 | | `apps/api` | Python package `internetpressure`: ingestion API, pressure engine, event engine, BGP ingestor, corroboration connectors, public/admin API, SSE | | ||
| 13 | | `services/probe-agent` | Go probe agent (HTTP/DNS/ICMP/traceroute, signed gzip batches, spool, self-update) | | 13 | | `services/probe-agent` | Go probe agent (HTTP/DNS/ICMP/traceroute, signed gzip batches, spool, self-update) | | ||
| 14 | | `packages/config/pressure.yaml` | weights, levels, engine & scheduler parameters | | 14 | | `packages/config/pressure.yaml` | weights, levels, engine & scheduler parameters | | ||
| 15 | −| `data/` | region model, target registry seed (2 128 targets, 165 services), services, probes | | 15 | +| `data/` | region model, target registry (27 700 verified targets in 219 countries, 700 services incl. 670 public status pages — `targets.yaml` + `fragments/*.yaml`, validated by `scripts/registry-check.py`), services, probes | | ||
| 16 | | `infra/` · `deploy/` | Docker Compose stack, edge Caddy, deploy & probe scripts | | 16 | | `infra/` · `deploy/` | Docker Compose stack, edge Caddy, deploy & probe scripts | | ||
| 17 | | `docs/` | SPEC (product), ARCHITECTURE, API, PROBE-PROTOCOL, DEPLOY | | 17 | | `docs/` | SPEC (product), ARCHITECTURE, API, PROBE-PROTOCOL, DEPLOY | | ||
| 18 | 18 | ||||
added
apps/web/public/brand/mark-256.png
+0 −0
Binary file not shown.
added
apps/web/public/brand/mark-mono.svg
+13 −0
@@ -0,0 +1,13 @@ | |||||
| 1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64" role="img" aria-label="InternetPressure.io"> | ||||
| 2 | + <!-- InternetPressure.io — the pressure dial: seven bands (calm → extreme), needle, hub --> | ||||
| 3 | + <path d="M11.22 44.00 A24.0 24.0 0 0 1 8.01 31.28" stroke="currentColor" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||||
| 4 | + <path d="M8.08 30.03 A24.0 24.0 0 0 1 12.69 17.75" stroke="currentColor" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||||
| 5 | + <path d="M13.46 16.76 A24.0 24.0 0 0 1 24.24 9.29" stroke="currentColor" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||||
| 6 | + <path d="M25.44 8.91 A24.0 24.0 0 0 1 38.56 8.91" stroke="currentColor" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||||
| 7 | + <path d="M39.76 9.29 A24.0 24.0 0 0 1 50.54 16.76" stroke="currentColor" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||||
| 8 | + <path d="M51.31 17.75 A24.0 24.0 0 0 1 55.92 30.03" stroke="currentColor" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||||
| 9 | + <path d="M55.99 31.28 A24.0 24.0 0 0 1 52.78 44.00" stroke="currentColor" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||||
| 10 | + <polygon points="34.11,31.36 29.89,32.64 27.09,15.73" fill="currentColor"/> | ||||
| 11 | + <circle cx="32.0" cy="32.0" r="4.2" fill="currentColor"/> | ||||
| 12 | + <circle cx="32.0" cy="32.0" r="1.6" fill="none"/> | ||||
| 13 | +</svg> | ||||
added
apps/web/public/brand/mark.svg
+13 −0
@@ -0,0 +1,13 @@ | |||||
| 1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64" role="img" aria-label="InternetPressure.io"> | ||||
| 2 | + <!-- InternetPressure.io — the pressure dial: seven bands (calm → extreme), needle, hub --> | ||||
| 3 | + <path d="M11.22 44.00 A24.0 24.0 0 0 1 8.01 31.28" stroke="#4CC9F0" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||||
| 4 | + <path d="M8.08 30.03 A24.0 24.0 0 0 1 12.69 17.75" stroke="#7FB77E" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||||
| 5 | + <path d="M13.46 16.76 A24.0 24.0 0 0 1 24.24 9.29" stroke="#E9C46A" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||||
| 6 | + <path d="M25.44 8.91 A24.0 24.0 0 0 1 38.56 8.91" stroke="#F4A261" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||||
| 7 | + <path d="M39.76 9.29 A24.0 24.0 0 0 1 50.54 16.76" stroke="#E76F51" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||||
| 8 | + <path d="M51.31 17.75 A24.0 24.0 0 0 1 55.92 30.03" stroke="#D62828" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||||
| 9 | + <path d="M55.99 31.28 A24.0 24.0 0 0 1 52.78 44.00" stroke="#F72585" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||||
| 10 | + <polygon points="34.11,31.36 29.89,32.64 27.09,15.73" fill="#E6EDF3"/> | ||||
| 11 | + <circle cx="32.0" cy="32.0" r="4.2" fill="#E6EDF3"/> | ||||
| 12 | + <circle cx="32.0" cy="32.0" r="1.6" fill="#070A0F"/> | ||||
| 13 | +</svg> | ||||
added
apps/web/public/brand/og-wallpaper.png
+0 −0
Binary file not shown.
modified
apps/web/public/logo.svg
+12 −14
@@ -1,15 +1,13 @@ | |||||
| 1 | −<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" fill="none" stroke="#5B8DEF" stroke-width="1.75" stroke-linecap="round"> | 1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360 64" width="360" height="64" role="img" aria-label="InternetPressure.io"> | ||
| 2 | − <!-- InternetPressure.io — pressure-gauge glyph: dial, tick marks, needle --> | 2 | + <g><path d="M11.22 44.00 A24.0 24.0 0 0 1 8.01 31.28" stroke="#4CC9F0" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||
| 3 | − <circle cx="16" cy="16" r="13" /> | 3 | + <path d="M8.08 30.03 A24.0 24.0 0 0 1 12.69 17.75" stroke="#7FB77E" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||
| 4 | − <path d="M6.6 22.4 L8.4 21.4" /> | 4 | + <path d="M13.46 16.76 A24.0 24.0 0 0 1 24.24 9.29" stroke="#E9C46A" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||
| 5 | − <path d="M5 16 L7 16" /> | 5 | + <path d="M25.44 8.91 A24.0 24.0 0 0 1 38.56 8.91" stroke="#F4A261" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||
| 6 | − <path d="M6.6 9.6 L8.4 10.6" /> | 6 | + <path d="M39.76 9.29 A24.0 24.0 0 0 1 50.54 16.76" stroke="#E76F51" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||
| 7 | − <path d="M11.6 5.4 L12.4 7.2" /> | 7 | + <path d="M51.31 17.75 A24.0 24.0 0 0 1 55.92 30.03" stroke="#D62828" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||
| 8 | − <path d="M16 4 L16 6" /> | 8 | + <path d="M55.99 31.28 A24.0 24.0 0 0 1 52.78 44.00" stroke="#F72585" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||
| 9 | − <path d="M20.4 5.4 L19.6 7.2" /> | 9 | + <polygon points="34.11,31.36 29.89,32.64 27.09,15.73" fill="#E6EDF3"/> | ||
| 10 | − <path d="M25.4 9.6 L23.6 10.6" /> | 10 | + <circle cx="32.0" cy="32.0" r="4.2" fill="#E6EDF3"/> | ||
| 11 | − <path d="M27 16 L25 16" /> | 11 | + <circle cx="32.0" cy="32.0" r="1.6" fill="#070A0F"/></g> | ||
| 12 | − <path d="M25.4 22.4 L23.6 21.4" /> | 12 | + <text x="76" y="41" font-family="Geist, Inter, -apple-system, Segoe UI, Helvetica, Arial, sans-serif" font-size="28" font-weight="600" letter-spacing="-0.6" fill="#E6EDF3">InternetPressure<tspan fill="#8B98A5" font-weight="500">.io</tspan></text> | ||
| 13 | − <path d="M16 16 L22.5 9.5" stroke-width="2.25" /> | ||||
| 14 | − <circle cx="16" cy="16" r="1.6" fill="#5B8DEF" stroke="none" /> | ||||
| 15 | </svg> | 13 | </svg> | ||
added
apps/web/src/app/apple-icon.png
+0 −0
Binary file not shown.
added
apps/web/src/app/favicon.ico
+0 −0
Binary file not shown.
added
apps/web/src/app/icon.png
+0 −0
Binary file not shown.
modified
apps/web/src/app/icon.svg
+12 −8
@@ -1,9 +1,13 @@ | |||||
| 1 | −<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32"> | 1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64"> | ||
| 2 | − <rect width="32" height="32" rx="4" fill="#070A0F" /> | 2 | + <rect width="64" height="64" rx="14" fill="#0C1117"/> | ||
| 3 | − <g fill="none" stroke="#5B8DEF" stroke-width="1.9" stroke-linecap="round"> | 3 | + <path d="M11.22 44.00 A24.0 24.0 0 0 1 8.01 31.28" stroke="#4CC9F0" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||
| 4 | − <circle cx="16" cy="16" r="11.5" /> | 4 | + <path d="M8.08 30.03 A24.0 24.0 0 0 1 12.69 17.75" stroke="#7FB77E" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||
| 5 | − <path d="M7.7 20.8 L9.3 19.9" /><path d="M6.5 16 L8.3 16" /><path d="M7.7 11.2 L9.3 12.1" /><path d="M12 6.9 L12.7 8.6" /><path d="M16 5.5 L16 7.3" /><path d="M20 6.9 L19.3 8.6" /><path d="M24.3 11.2 L22.7 12.1" /><path d="M25.5 16 L23.7 16" /><path d="M24.3 20.8 L22.7 19.9" /> | 5 | + <path d="M13.46 16.76 A24.0 24.0 0 0 1 24.24 9.29" stroke="#E9C46A" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||
| 6 | − <path d="M16 16 L21.6 10.4" stroke-width="2.4" /> | 6 | + <path d="M25.44 8.91 A24.0 24.0 0 0 1 38.56 8.91" stroke="#F4A261" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||
| 7 | − </g> | 7 | + <path d="M39.76 9.29 A24.0 24.0 0 0 1 50.54 16.76" stroke="#E76F51" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||
| 8 | − <circle cx="16" cy="16" r="1.7" fill="#5B8DEF" /> | 8 | + <path d="M51.31 17.75 A24.0 24.0 0 0 1 55.92 30.03" stroke="#D62828" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||
| 9 | + <path d="M55.99 31.28 A24.0 24.0 0 0 1 52.78 44.00" stroke="#F72585" stroke-width="6.5" stroke-linecap="round" fill="none"/> | ||||
| 10 | + <polygon points="34.11,31.36 29.89,32.64 27.09,15.73" fill="#E6EDF3"/> | ||||
| 11 | + <circle cx="32.0" cy="32.0" r="4.2" fill="#E6EDF3"/> | ||||
| 12 | + <circle cx="32.0" cy="32.0" r="1.6" fill="#070A0F"/> | ||||
| 9 | </svg> | 13 | </svg> | ||
modified
apps/web/src/app/layout.tsx
+4 −1
@@ -14,7 +14,10 @@ export const metadata: Metadata = { | |||||
| 14 | alternates: { canonical: '/' }, | 14 | alternates: { canonical: '/' }, | ||
| 15 | openGraph: { type: 'website', siteName: SITE_NAME, url: SITE_URL, title: `${SITE_NAME} — ${TAGLINE}`, description: DESCRIPTION }, | 15 | openGraph: { type: 'website', siteName: SITE_NAME, url: SITE_URL, title: `${SITE_NAME} — ${TAGLINE}`, description: DESCRIPTION }, | ||
| 16 | twitter: { card: 'summary_large_image', title: `${SITE_NAME} — ${TAGLINE}`, description: DESCRIPTION }, | 16 | twitter: { card: 'summary_large_image', title: `${SITE_NAME} — ${TAGLINE}`, description: DESCRIPTION }, | ||
| 17 | − icons: { icon: [{ url: '/icon.svg', type: 'image/svg+xml' }] }, | 17 | + authors: [{ name: 'Simon-Pierre Boucher', url: 'mailto:contact@spboucher.ai' }], | ||
| 18 | + creator: 'Simon-Pierre Boucher', | ||||
| 19 | + publisher: 'MacLustr (www.maclustr.io)', | ||||
| 20 | + // icons: Next file conventions in src/app — icon.svg, icon.png, apple-icon.png, favicon.ico (generated by scripts/brand.py) | ||||
| 18 | }; | 21 | }; | ||
| 19 | 22 | ||||
| 20 | export const viewport: Viewport = { | 23 | export const viewport: Viewport = { | ||
added
apps/web/src/app/manifest.ts
+19 −0
@@ -0,0 +1,19 @@ | |||||
| 1 | +import type { MetadataRoute } from 'next'; | ||||
| 2 | +import { DESCRIPTION, SITE_NAME } from '@/lib/site'; | ||||
| 3 | + | ||||
| 4 | +export default function manifest(): MetadataRoute.Manifest { | ||||
| 5 | + return { | ||||
| 6 | + name: SITE_NAME, | ||||
| 7 | + short_name: 'InternetPressure', | ||||
| 8 | + description: DESCRIPTION, | ||||
| 9 | + start_url: '/', | ||||
| 10 | + display: 'standalone', | ||||
| 11 | + background_color: '#070A0F', | ||||
| 12 | + theme_color: '#070A0F', | ||||
| 13 | + icons: [ | ||||
| 14 | + { src: '/icon.png', sizes: '512x512', type: 'image/png' }, | ||||
| 15 | + { src: '/apple-icon.png', sizes: '180x180', type: 'image/png' }, | ||||
| 16 | + { src: '/icon.svg', sizes: 'any', type: 'image/svg+xml' }, | ||||
| 17 | + ], | ||||
| 18 | + }; | ||||
| 19 | +} | ||||
modified
apps/web/src/app/opengraph-image.tsx
+11 −9
@@ -11,6 +11,13 @@ export const size = { width: 1200, height: 630 }; | |||||
| 11 | export const contentType = 'image/png'; | 11 | export const contentType = 'image/png'; | ||
| 12 | 12 | ||||
| 13 | /** OG image rendered from the live index (real API data, never a fixture). Falls back to an unknown state. */ | 13 | /** OG image rendered from the live index (real API data, never a fixture). Falls back to an unknown state. */ | ||
| 14 | +/** The brand dial (same geometry as scripts/brand.py / public/brand/mark.svg). */ | ||||
| 15 | +function Dial({ SZ, OP }: { SZ: number; OP: number }) { | ||||
| 16 | + return ( | ||||
| 17 | + <svg viewBox="0 0 64 64" width={SZ} height={SZ} style={{ opacity: OP }}><path d="M11.22 44.00 A24.0 24.0 0 0 1 8.01 31.28" stroke="#4CC9F0" strokeWidth={6.5} strokeLinecap="round" fill="none" /><path d="M8.08 30.03 A24.0 24.0 0 0 1 12.69 17.75" stroke="#7FB77E" strokeWidth={6.5} strokeLinecap="round" fill="none" /><path d="M13.46 16.76 A24.0 24.0 0 0 1 24.24 9.29" stroke="#E9C46A" strokeWidth={6.5} strokeLinecap="round" fill="none" /><path d="M25.44 8.91 A24.0 24.0 0 0 1 38.56 8.91" stroke="#F4A261" strokeWidth={6.5} strokeLinecap="round" fill="none" /><path d="M39.76 9.29 A24.0 24.0 0 0 1 50.54 16.76" stroke="#E76F51" strokeWidth={6.5} strokeLinecap="round" fill="none" /><path d="M51.31 17.75 A24.0 24.0 0 0 1 55.92 30.03" stroke="#D62828" strokeWidth={6.5} strokeLinecap="round" fill="none" /><path d="M55.99 31.28 A24.0 24.0 0 0 1 52.78 44.00" stroke="#F72585" strokeWidth={6.5} strokeLinecap="round" fill="none" /><polygon points="34.11,31.36 29.89,32.64 27.09,15.73" fill="#E6EDF3" /><circle cx="32" cy="32" r="4.2" fill="#E6EDF3" /><circle cx="32" cy="32" r="1.6" fill="#070A0F" /></svg> | ||||
| 18 | + ); | ||||
| 19 | +} | ||||
| 20 | + | ||||
| 14 | export default async function OpenGraphImage() { | 21 | export default async function OpenGraphImage() { | ||
| 15 | let g: GlobalPressure | null = null; | 22 | let g: GlobalPressure | null = null; | ||
| 16 | try { | 23 | try { | ||
@@ -24,16 +31,11 @@ export default async function OpenGraphImage() { | |||||
| 24 | return new ImageResponse( | 31 | return new ImageResponse( | ||
| 25 | ( | 32 | ( | ||
| 26 | <div style={{ width: '100%', height: '100%', display: 'flex', flexDirection: 'column', justifyContent: 'space-between', padding: '56px 72px', background: '#070A0F', color: '#E6EDF3', fontFamily: 'sans-serif', position: 'relative' }}> | 33 | <div style={{ width: '100%', height: '100%', display: 'flex', flexDirection: 'column', justifyContent: 'space-between', padding: '56px 72px', background: '#070A0F', color: '#E6EDF3', fontFamily: 'sans-serif', position: 'relative' }}> | ||
| 27 | − <div style={{ position: 'absolute', left: 120, top: 80, width: 700, height: 500, borderRadius: 9999, background: `radial-gradient(circle at 40% 45%, ${color}22, #070A0F00 70%)`, display: 'flex' }} /> | 34 | + <div style={{ position: 'absolute', right: -40, top: 60, display: 'flex' }}> | ||
| 35 | + <Dial SZ={560} OP={0.22} /> | ||||
| 36 | + </div> | ||||
| 28 | <div style={{ display: 'flex', alignItems: 'center', gap: 16 }}> | 37 | <div style={{ display: 'flex', alignItems: 'center', gap: 16 }}> | ||
| 29 | − <svg width="44" height="44" viewBox="0 0 32 32" fill="none" stroke="#5B8DEF" strokeWidth="1.75" strokeLinecap="round"> | 38 | + <Dial SZ={52} OP={1} /> | ||
| 30 | − <circle cx="16" cy="16" r="13" /> | ||||
| 31 | − <path d="M16 4 L16 6" /> | ||||
| 32 | − <path d="M5 16 L7 16" /> | ||||
| 33 | − <path d="M27 16 L25 16" /> | ||||
| 34 | − <path d="M16 16 L22.5 9.5" strokeWidth="2.25" /> | ||||
| 35 | − <circle cx="16" cy="16" r="1.6" fill="#5B8DEF" stroke="none" /> | ||||
| 36 | − </svg> | ||||
| 37 | <div style={{ display: 'flex', fontSize: 30, letterSpacing: -0.5 }}> | 39 | <div style={{ display: 'flex', fontSize: 30, letterSpacing: -0.5 }}> | ||
| 38 | InternetPressure<span style={{ color: '#5B6875' }}>.io</span> | 40 | InternetPressure<span style={{ color: '#5B6875' }}>.io</span> | ||
| 39 | </div> | 41 | </div> | ||
modified
apps/web/src/components/chrome/Logo.tsx
+14 −15
@@ -1,19 +1,18 @@ | |||||
| 1 | −/** Pressure-gauge glyph (same drawing as public/logo.svg) — inline so it inherits colour and needs no request. */ | 1 | +/** InternetPressure.io mark — the pressure dial (generated by scripts/brand.py; same geometry as public/brand/mark.svg). | ||
| 2 | −export function Logo({ size = 22, className, color = 'var(--accent)' }: { size?: number; className?: string; color?: string }) { | 2 | + * Seven bands = the pressure palette calm → extreme, a needle and a hub. `mono` renders everything in `color`. */ | ||
| 3 | +export function Logo({ size = 22, className, color = 'currentColor', mono = false }: { size?: number; className?: string; color?: string; mono?: boolean }) { | ||||
| 3 | return ( | 4 | return ( | ||
| 4 | − <svg viewBox="0 0 32 32" width={size} height={size} fill="none" stroke={color} strokeWidth={1.75} strokeLinecap="round" className={className} aria-hidden="true"> | 5 | + <svg viewBox="0 0 64 64" width={size} height={size} className={className} aria-hidden="true"> | ||
| 5 | − <circle cx="16" cy="16" r="13" /> | 6 | + <path d="M11.22 44.00 A24.0 24.0 0 0 1 8.01 31.28" stroke={mono ? color : "#4CC9F0"} strokeWidth={6.5} strokeLinecap="round" fill="none" /> | ||
| 6 | − <path d="M6.6 22.4 L8.4 21.4" /> | 7 | + <path d="M8.08 30.03 A24.0 24.0 0 0 1 12.69 17.75" stroke={mono ? color : "#7FB77E"} strokeWidth={6.5} strokeLinecap="round" fill="none" /> | ||
| 7 | − <path d="M5 16 L7 16" /> | 8 | + <path d="M13.46 16.76 A24.0 24.0 0 0 1 24.24 9.29" stroke={mono ? color : "#E9C46A"} strokeWidth={6.5} strokeLinecap="round" fill="none" /> | ||
| 8 | − <path d="M6.6 9.6 L8.4 10.6" /> | 9 | + <path d="M25.44 8.91 A24.0 24.0 0 0 1 38.56 8.91" stroke={mono ? color : "#F4A261"} strokeWidth={6.5} strokeLinecap="round" fill="none" /> | ||
| 9 | − <path d="M11.6 5.4 L12.4 7.2" /> | 10 | + <path d="M39.76 9.29 A24.0 24.0 0 0 1 50.54 16.76" stroke={mono ? color : "#E76F51"} strokeWidth={6.5} strokeLinecap="round" fill="none" /> | ||
| 10 | − <path d="M16 4 L16 6" /> | 11 | + <path d="M51.31 17.75 A24.0 24.0 0 0 1 55.92 30.03" stroke={mono ? color : "#D62828"} strokeWidth={6.5} strokeLinecap="round" fill="none" /> | ||
| 11 | − <path d="M20.4 5.4 L19.6 7.2" /> | 12 | + <path d="M55.99 31.28 A24.0 24.0 0 0 1 52.78 44.00" stroke={mono ? color : "#F72585"} strokeWidth={6.5} strokeLinecap="round" fill="none" /> | ||
| 12 | − <path d="M25.4 9.6 L23.6 10.6" /> | 13 | + <polygon points="34.11,31.36 29.89,32.64 27.09,15.73" fill={mono ? color : '#E6EDF3'} /> | ||
| 13 | − <path d="M27 16 L25 16" /> | 14 | + <circle cx="32.0" cy="32.0" r="4.2" fill={mono ? color : '#E6EDF3'} /> | ||
| 14 | − <path d="M25.4 22.4 L23.6 21.4" /> | 15 | + {!mono && <circle cx="32.0" cy="32.0" r="1.6" fill="#070A0F" />} | ||
| 15 | − <path d="M16 16 L22.5 9.5" strokeWidth={2.25} /> | ||||
| 16 | − <circle cx="16" cy="16" r="1.6" fill={color} stroke="none" /> | ||||
| 17 | </svg> | 16 | </svg> | ||
| 18 | ); | 17 | ); | ||
| 19 | } | 18 | } | ||
modified
data/targets/fragments/developer.yaml
+4333 −4333
Large diff (9,095 lines) is not loaded by default to keep the page fast.Load diff
modified
docs/ARCHITECTURE.md
+12 −3
Large diff (26 lines) is not loaded by default to keep the page fast.Load diff
added
scripts/brand.py
+172 −0
Large diff (173 lines) is not loaded by default to keep the page fast.Load diff