diff --git a/art/avior_ibis.py b/art/avior_ibis.py
new file mode 100644
index 0000000..9816812
--- /dev/null
+++ b/art/avior_ibis.py
@@ -0,0 +1,44 @@
+"""Avior's ibis and its reflection, authored with Spritesmith's vector primitives."""
+KEY = 'avior_ibis'
+NAME = 'Avior Studio — ibis standing above its reflection'
+SIZE = (128, 128)
+ANIMS = {'badge': 1, 'pond': 1, 'seal': 1}
+
+
+def bird(s, seal=False):
+ feather = '#fff4d7' if not seal else '#f7ead0'
+ leg = '#dfac72'
+ s.curve('M58 66 L57 87 L55 91 M68 65 L68 85 L71 91', leg, 1.8)
+ s.shape('M34 64 C39 54 45 43 58 42 C65 41 70 45 73 42 C76 39 70 31 73 24 C76 17 84 18 87 23 C89 27 85 31 82 31 C80 39 85 46 76 52 C71 56 68 66 55 68 C46 71 39 69 31 73 Z', feather, sw=2.4)
+ s.shape('M84 25 C98 35 104 47 102 60 C100 48 92 37 82 31 Z', '#d9a06b', sw=1.7)
+ s.shape('M38 62 C47 50 59 49 68 51 C64 60 51 66 38 67 Z', '#e1c79b', sw=1.4)
+ s.curve('M43 61 Q53 56 61 55', feather, 1.2, sw=0)
+ s.dot(82, 24, 1.5, '#242b31')
+ s.dot(82.4, 23.6, .45, '#fff4d7')
+
+
+def draw(s, anim, i):
+ if anim == 'badge':
+ s.shape('M64 6 C94 6 118 29 118 60 C118 94 94 116 64 123 C34 116 10 94 10 60 C10 29 34 6 64 6 Z', '#1e4d50', sw=3)
+ s.e(62, 42, 29, 28, '#e7b665', sw=0, shade=False)
+ s.shape('M15 78 Q43 70 65 77 Q91 68 114 77 L109 95 Q91 111 64 119 Q37 111 19 95 Z', '#5caaa3', sw=0)
+ s.poly([(22,75),(28,54),(31,75)], '#347b70', sw=0)
+ elif anim == 'pond':
+ s.e(62, 92, 49, 25, '#79bbb2', sw=0)
+ s.arc(63, 61, 52, 191, 448, '#e1b16e', 3)
+ s.curve('M20 88 Q17 74 20 62 M22 84 Q28 74 27 67', '#347b70', 2, sw=0)
+ else:
+ s.e(64, 64, 57, 57, '#203c42', sw=2.5)
+ s.arc(64, 64, 49, 192, 444, '#d4a968', 2)
+ boundary = ('' if anim == 'pond'
+ else '' if anim == 'seal'
+ else '')
+ s.defs.append(f'{boundary}')
+ s.defs.append('')
+ s.raw('')
+ bird(s, anim == 'seal')
+ s.raw('')
+ bird(s, anim == 'seal')
+ water = '#d6efe0' if anim != 'seal' else '#82b4ab'
+ for d in ['M39 91 Q61 94 83 90', 'M46 99 Q60 97 78 99', 'M42 107 Q58 110 74 107', 'M52 115 H66']:
+ s.curve(d, water, 1.3, sw=0)
diff --git a/public/art/identity/ibis-badge.png b/public/art/identity/ibis-badge.png
new file mode 100644
index 0000000..df38ad9
Binary files /dev/null and b/public/art/identity/ibis-badge.png differ
diff --git a/public/art/identity/ibis-badge.svg b/public/art/identity/ibis-badge.svg
new file mode 100644
index 0000000..7e655a0
--- /dev/null
+++ b/public/art/identity/ibis-badge.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/art/identity/ibis-pond.png b/public/art/identity/ibis-pond.png
new file mode 100644
index 0000000..549acb0
Binary files /dev/null and b/public/art/identity/ibis-pond.png differ
diff --git a/public/art/identity/ibis-pond.svg b/public/art/identity/ibis-pond.svg
new file mode 100644
index 0000000..f1510a6
--- /dev/null
+++ b/public/art/identity/ibis-pond.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/art/identity/ibis-seal.png b/public/art/identity/ibis-seal.png
new file mode 100644
index 0000000..455e7b1
Binary files /dev/null and b/public/art/identity/ibis-seal.png differ
diff --git a/public/art/identity/ibis-seal.svg b/public/art/identity/ibis-seal.svg
new file mode 100644
index 0000000..62ac33f
--- /dev/null
+++ b/public/art/identity/ibis-seal.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/art/identity/logo-directions.png b/public/art/identity/logo-directions.png
new file mode 100644
index 0000000..85e0d1e
Binary files /dev/null and b/public/art/identity/logo-directions.png differ
diff --git a/public/favicon.png b/public/favicon.png
index 50e7ccc..6bdf9cc 100644
Binary files a/public/favicon.png and b/public/favicon.png differ
diff --git a/public/logo-mark.png b/public/logo-mark.png
index c0524fe..9ee7a2a 100644
Binary files a/public/logo-mark.png and b/public/logo-mark.png differ
diff --git a/public/logo-mark.svg b/public/logo-mark.svg
new file mode 100644
index 0000000..f1510a6
--- /dev/null
+++ b/public/logo-mark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/logo.png b/public/logo.png
index 6ffd0b3..a731322 100644
Binary files a/public/logo.png and b/public/logo.png differ
diff --git a/scripts/render-logos.py b/scripts/render-logos.py
new file mode 100644
index 0000000..e5a5db8
--- /dev/null
+++ b/scripts/render-logos.py
@@ -0,0 +1,47 @@
+"""Render Avior identity candidates using a Spritesmith checkout and CairoSVG/Pillow.
+
+Usage: python scripts/render-logos.py /path/to/spritesmith-be/spritesmith
+Run with the Python environment containing Spritesmith's rendering dependencies.
+"""
+from io import BytesIO
+from pathlib import Path
+import subprocess
+import sys
+import cairosvg
+from PIL import Image, ImageDraw, ImageFont
+
+root = Path(__file__).resolve().parents[1]
+out = root / 'public/art/identity'
+out.mkdir(parents=True, exist_ok=True)
+sheet = Image.new('RGB', (1440, 660), '#f4efe4')
+draw = ImageDraw.Draw(sheet)
+font = ImageFont.truetype('DejaVuSans.ttf', 24)
+small = ImageFont.truetype('DejaVuSans.ttf', 16)
+for index, (key, label, style) in enumerate([
+ ('badge', '01 · Game badge', 'cozy'),
+ ('pond', '02 · Pond emblem', 'cozy'),
+ ('seal', '03 · Studio seal', 'flat'),
+]):
+ svg = out / f'ibis-{key}.svg'
+ subprocess.run([sys.executable, str(Path(sys.argv[1]).resolve().parent / 'py/spritesmith.py'),
+ 'svg', str(root / 'art/avior_ibis.py'), '--anim', key,
+ '--style', style, '--cell', '256', '--out', str(svg)], check=True)
+ png = cairosvg.svg2png(url=str(svg), output_width=400, output_height=400)
+ (out / f'ibis-{key}.png').write_bytes(png)
+ image = Image.open(BytesIO(png))
+ x = index * 480 + 40
+ sheet.paste(image, (x, 65), image)
+ draw.text((x, 490), label, font=font, fill='#203c42')
+ draw.text((x, 530), 'AVIOR STUDIO', font=small, fill='#203c42')
+ tiny = image.resize((48, 48), Image.Resampling.LANCZOS)
+ sheet.paste(tiny, (x, 570), tiny)
+ draw.text((x + 68, 584), '48px mark', font=small, fill='#203c42')
+sheet.save(out / 'logo-directions.png')
+
+# The selected studio identity is direction 02, the pond emblem.
+selected = out / 'ibis-pond.svg'
+(root / 'public/logo-mark.svg').write_bytes(selected.read_bytes())
+for destination, size in [('public/logo-mark.png', 256), ('public/logo.png', 1024),
+ ('public/favicon.png', 64), ('src/assets/aviorstudio-logo.png', 1024)]:
+ cairosvg.svg2png(url=str(selected), write_to=str(root / destination),
+ output_width=size, output_height=size)
diff --git a/src/assets/aviorstudio-logo.png b/src/assets/aviorstudio-logo.png
index 54d1162..a731322 100644
Binary files a/src/assets/aviorstudio-logo.png and b/src/assets/aviorstudio-logo.png differ
diff --git a/src/layouts/Full.astro b/src/layouts/Full.astro
index 50a6c50..8c4c038 100644
--- a/src/layouts/Full.astro
+++ b/src/layouts/Full.astro
@@ -6,12 +6,14 @@ interface Props {
title?: string;
description?: string;
path?: string;
+ noindex?: boolean;
}
const {
title = 'Avior Studio',
description = 'Independent games and useful developer tools. Play termcade and Fields of Revik, explore Castle Drop and Prizm, and meet the tools behind the work.',
path = Astro.url.pathname,
+ noindex = false,
} = Astro.props;
const canonical = new URL(Astro.url.pathname, 'https://avior.studio');
@@ -43,18 +45,21 @@ const structuredData = {
-
+
+
+
+
{title}
@@ -63,7 +68,7 @@ const structuredData = {