diff --git a/src/assets/partners/university-of-passau.webp b/src/assets/partners/university-of-passau.webp new file mode 100644 index 0000000..1dc58c7 Binary files /dev/null and b/src/assets/partners/university-of-passau.webp differ diff --git a/src/assets/partners/xg-aloe.webp b/src/assets/partners/xg-aloe.webp new file mode 100644 index 0000000..34bca65 Binary files /dev/null and b/src/assets/partners/xg-aloe.webp differ diff --git a/src/assets/partners/xg-incubator.webp b/src/assets/partners/xg-incubator.webp new file mode 100644 index 0000000..8ecd33b Binary files /dev/null and b/src/assets/partners/xg-incubator.webp differ diff --git a/src/components/Field.astro b/src/components/Field.astro new file mode 100644 index 0000000..46acaaa --- /dev/null +++ b/src/components/Field.astro @@ -0,0 +1,62 @@ +--- +/* An abstract colour field with film grain: the picture for an Insights card that has none. + Palette and blob positions follow from `seed` (the entry's slug), so a card keeps its field + wherever it appears and however the list is sorted or filtered. Slot content sits on the + lower edge in paper-coloured type. */ +interface Props { seed: string; class?: string } +const { seed, class: className } = Astro.props; + +/* A base and three blobs per palette, chosen so neighbouring hues sit well together. */ +const palettes = [ + ['field-plum', 'field-ember', 'field-peach', 'field-rose'], + ['field-cobalt', 'field-sky', 'field-lilac', 'field-peach'], + ['field-jade', 'field-mint', 'field-sun', 'field-sky'], + ['field-violet', 'field-rose', 'field-lilac', 'field-sun'], + ['field-ocean', 'logo-cyan', 'field-mint', 'field-ember'], + ['field-ember', 'field-sun', 'field-rose', 'field-peach'], +]; + +/* FNV-1a, then a small LCG for the positions: stable across builds and machines. */ +let h = 2166136261; +for (const ch of seed) h = Math.imul(h ^ ch.codePointAt(0)!, 16777619) >>> 0; +const next = () => (h = (Math.imul(h, 1664525) + 1013904223) >>> 0) / 2 ** 32; +const [base, ...blobs] = palettes[h % palettes.length]; +const at = (lo: number, hi: number) => Math.round(lo + next() * (hi - lo)); +/* Blobs stay mostly in the upper two thirds, so the type at the bottom keeps a calmer ground. */ +const style = [`--base: var(--${base})`] + .concat(blobs.map((c, k) => `--c${k + 1}: var(--${c}); --x${k + 1}: ${at(0, 100)}%; --y${k + 1}: ${at(0, 70)}%`)) + .join('; '); +--- +
{item.entry.data.category}
{m.category(item.entry.data.platform)}
{ui.insights.event.when}
+{ui.insights.event.category}
{ui.proof.partners}
+{ui.proof.partners}
++ {l.name} + {l.role} +
+