@orangecheck/app-design 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/brand.d.mts CHANGED
@@ -29,19 +29,21 @@ interface HalftoneSphereProps {
29
29
  alt: string;
30
30
  stadium?: boolean;
31
31
  float?: boolean;
32
+ live?: boolean;
32
33
  className?: string;
33
34
  style?: CSSProperties;
34
35
  }
35
- declare function HalftoneSphere({ src, alt, stadium, float, className, style }: HalftoneSphereProps): react.JSX.Element;
36
+ declare function HalftoneSphere({ src, alt, stadium, float, live, className, style, }: HalftoneSphereProps): react.JSX.Element;
36
37
 
37
38
  interface IsoCheckProps {
38
39
  size?: number;
39
40
  settle?: boolean;
40
41
  shadow?: boolean;
42
+ tilt?: boolean;
41
43
  title?: string;
42
44
  className?: string;
43
45
  }
44
- declare function IsoCheck({ size, settle, shadow, title, className }: IsoCheckProps): react.JSX.Element;
46
+ declare function IsoCheck({ size, settle, shadow, tilt, title, className }: IsoCheckProps): react.JSX.Element;
45
47
 
46
48
  interface CrowdProps {
47
49
  cols?: number;
@@ -50,8 +52,28 @@ interface CrowdProps {
50
52
  seed?: number;
51
53
  tone?: 'ink' | 'canvas';
52
54
  label?: string;
55
+ story?: boolean;
53
56
  className?: string;
54
57
  }
55
- declare function Crowd({ cols, rows, real, seed, tone, label, className, }: CrowdProps): react.JSX.Element;
58
+ declare function Crowd({ cols, rows, real, seed, tone, label, story, className, }: CrowdProps): react.JSX.Element;
56
59
 
57
- export { AppIcon, type AppIconProps, Crowd, type CrowdProps, HalftoneSphere, type HalftoneSphereProps, IsoCheck, type IsoCheckProps, Lockup, type LockupProps, MARK_FACES, Mark, type MarkProps, SPHERE_GRADIENT };
60
+ interface Tone {
61
+ size: number;
62
+ data: Uint8Array;
63
+ }
64
+ declare function portraitTone(): Tone;
65
+ interface HalftoneCanvasProps {
66
+ tone?: Tone;
67
+ density?: number;
68
+ lens?: boolean;
69
+ intro?: boolean;
70
+ breathe?: boolean;
71
+ ink?: string;
72
+ fallbackSrc?: string;
73
+ alt: string;
74
+ className?: string;
75
+ style?: CSSProperties;
76
+ }
77
+ declare function HalftoneCanvas({ tone, density, lens, intro, breathe, ink, fallbackSrc, alt, className, style, }: HalftoneCanvasProps): react.JSX.Element;
78
+
79
+ export { AppIcon, type AppIconProps, Crowd, type CrowdProps, HalftoneCanvas, type HalftoneCanvasProps, HalftoneSphere, type HalftoneSphereProps, IsoCheck, type IsoCheckProps, Lockup, type LockupProps, MARK_FACES, Mark, type MarkProps, SPHERE_GRADIENT, type Tone, portraitTone };
package/dist/brand.d.ts CHANGED
@@ -29,19 +29,21 @@ interface HalftoneSphereProps {
29
29
  alt: string;
30
30
  stadium?: boolean;
31
31
  float?: boolean;
32
+ live?: boolean;
32
33
  className?: string;
33
34
  style?: CSSProperties;
34
35
  }
35
- declare function HalftoneSphere({ src, alt, stadium, float, className, style }: HalftoneSphereProps): react.JSX.Element;
36
+ declare function HalftoneSphere({ src, alt, stadium, float, live, className, style, }: HalftoneSphereProps): react.JSX.Element;
36
37
 
37
38
  interface IsoCheckProps {
38
39
  size?: number;
39
40
  settle?: boolean;
40
41
  shadow?: boolean;
42
+ tilt?: boolean;
41
43
  title?: string;
42
44
  className?: string;
43
45
  }
44
- declare function IsoCheck({ size, settle, shadow, title, className }: IsoCheckProps): react.JSX.Element;
46
+ declare function IsoCheck({ size, settle, shadow, tilt, title, className }: IsoCheckProps): react.JSX.Element;
45
47
 
46
48
  interface CrowdProps {
47
49
  cols?: number;
@@ -50,8 +52,28 @@ interface CrowdProps {
50
52
  seed?: number;
51
53
  tone?: 'ink' | 'canvas';
52
54
  label?: string;
55
+ story?: boolean;
53
56
  className?: string;
54
57
  }
55
- declare function Crowd({ cols, rows, real, seed, tone, label, className, }: CrowdProps): react.JSX.Element;
58
+ declare function Crowd({ cols, rows, real, seed, tone, label, story, className, }: CrowdProps): react.JSX.Element;
56
59
 
57
- export { AppIcon, type AppIconProps, Crowd, type CrowdProps, HalftoneSphere, type HalftoneSphereProps, IsoCheck, type IsoCheckProps, Lockup, type LockupProps, MARK_FACES, Mark, type MarkProps, SPHERE_GRADIENT };
60
+ interface Tone {
61
+ size: number;
62
+ data: Uint8Array;
63
+ }
64
+ declare function portraitTone(): Tone;
65
+ interface HalftoneCanvasProps {
66
+ tone?: Tone;
67
+ density?: number;
68
+ lens?: boolean;
69
+ intro?: boolean;
70
+ breathe?: boolean;
71
+ ink?: string;
72
+ fallbackSrc?: string;
73
+ alt: string;
74
+ className?: string;
75
+ style?: CSSProperties;
76
+ }
77
+ declare function HalftoneCanvas({ tone, density, lens, intro, breathe, ink, fallbackSrc, alt, className, style, }: HalftoneCanvasProps): react.JSX.Element;
78
+
79
+ export { AppIcon, type AppIconProps, Crowd, type CrowdProps, HalftoneCanvas, type HalftoneCanvasProps, HalftoneSphere, type HalftoneSphereProps, IsoCheck, type IsoCheckProps, Lockup, type LockupProps, MARK_FACES, Mark, type MarkProps, SPHERE_GRADIENT, type Tone, portraitTone };
package/dist/brand.js CHANGED
@@ -3,6 +3,7 @@
3
3
  var clsx = require('clsx');
4
4
  var tailwindMerge = require('tailwind-merge');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
+ var react = require('react');
6
7
 
7
8
  var merge = tailwindMerge.extendTailwindMerge({
8
9
  extend: {
@@ -93,39 +94,313 @@ function Lockup({ name = "orangecheck", size = 28, className }) {
93
94
  }
94
95
  );
95
96
  }
97
+
98
+ // src/brand/portrait-tone.ts
99
+ var PORTRAIT_TONE_SIZE = 128;
100
+ var PORTRAIT_TONE_B64 = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAADCKz/v//9lYBgAAAAAAAAAAAAAAFUJqiaTD5/PdnFJZqub/////////6beKXzoFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkEGl+dzPP/6XksDAAAAAAAAAAAAAABGjJTgavFzcyyhIrS////////////5serj0wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABggiVXWMv/vsj0YlDAAAAAAAAAAAAAAMHTVejKWwwr+1x/n/////////////7t/Vp00AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDCdFSlWU6fGrXy4eFgAAAAAAAAAAAAsZLlB5oLrQ3Of///////////////////7hnTkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwABGTAzP3bK78yGOiErIQUAAAAAAAAACRYsWIa63fH/////////////////////+d2/fCUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAVMD1NdbXu6q9NGRoeGQ0AAAAAAAAJHTJbneH////////////////////////v0L+rcBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwGCR4zP09ync3uwlwYBgkQHCQgEAULGig8VYfP///////////////////////////v5NewYRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAYMGSEkMFJ1pebdgSUAAAAIHTI9P0lieIyq3f//////////////////////////////9s2lVgEAAAAAAAAAAAAGBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgsRGBAROni19v+1RgAAAAAGIT9efqfM5///////////////////////////////////2a9yIQAAAAAAAAAAABUcDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwULGB0lEgQoecf0/995FAAAAAAJKV+az/3////////////////////////////////////coGowAAAAAAAAAAAAHD0pAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBA0hLzwhARxlq9n77JIkAAAAAAAVUJrV////////////////////+fT///nm+f//////+dKfaCkAAAAAAAAAAA0iRjwHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgEAAR5HZ0IUM3Wnz+/djS4AAAAAAAcwa6Xd///////////////////z4f7/39Lu///////76b9rDgAAAAAAAAAdPSkwMA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkAAAAJ3uiZSlFg7DP4s+ENgcAAAAABhQvXJ3q//////////////////Pn//jQyM/X6v//+OfqqzcAAAAAAAAAABI6MDAzHgkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEB4IAA1Gq7trNUZ5r8O/p2EoEAQFBwkRESFPlez/////////////////9Pb//9/Mt6qvx+bMpZRMAAAAAAAAAAAAABY1UmRJHgUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALDBglNV+tt3VMXJK7r5R7SSEQCw4RFiAkQoTP//////////////////////////HQqIyg2ch/MwAAAAAAAAAAAAAABihfnZRKFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhAFHTY/aJ+YZUZntcCRe21HKBoSEBQaJUaM3P//////////////////////+Pn76dS9p6/V2n4JAAAAAAAAAAAAAAQLKG3H1Yc5DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcJxElOkOPx5JKMGjCuIeGeUonHhwVEhUrddL////////////////////////4+em6r8/fzcqzWAAAAAAAAAAAAAAAFCRMkdDSom82DQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSkhES5MZb30t1k5eMfHsreXWTUhGRUSHU2o+P//////////////////////////77OkzdzFolgLAAAAAAAAAAAAAAASRXKdx8+7q3gyCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQGgAAHEJ+zfTDbUl4x+Lf2qhlQigYFBo5gd3////////////////////////////2xaqdnJJSAgAAAAAHDgAABAAAAAVHdpjN6eLcu2spDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwEAAAMMo3d36BrXIrV6ubqvWo3JCAgL1+y/////////////////////////+/7//TVs3tlTQsAAAAAAA0SAAcoBQAAAC5llcjm7vnvqFwkBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZHAAAAAkvkdzDf1xnr/bz6f7ffz0kHSdFidn/////////////////////////+fjmwKqSakYNAAAAAAAHDQQAABQEAAAAGEl2pc3s///IeTAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACs1AAAAEU2q1bt8TFy1///5/+mkYjIeL16o7v//////////////////////////9qtrXFVPLwAAAAAAAAQGAAAAAAAAAAAMNV6RwOz//9mUQBUJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJLykBAAw2ku75z4dTZaj0///51bOHRSc9drv2///////++//////////////////5nEozQ0kVAAAAAAAAAAAAAAAAAAAAAA5Ccpe44v303a9YGgcBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATk8DAAAGF7H///afkZcoPb///bMspRWLkaHwPH//////fH2//////////////////6/bzc3MgAAAAAAAAAAAAAAAAAAAAAAHluVs7q7yNfPt3MuDAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANjIAAAAQcN///8dbKUqt//////bcuoFJXqDP+f/////c7P///////////////////+azazIAAAAAAAAAAAAAAAAAAAAAAAY3eL3ZvZSfx8jCoFkhCwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOCwAAAByM+f//tVIuSrX////////4unh5sOr//////+T0/////////////////////+yyWAAAAAAAAAAAAAAAAAAAAAAAJG239P3DkaTDwNDQgSwOCwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOFAgAAAAAPbX///+1WSs/q//////////FhmqN5P///////////////////////////////9+EDAAAAAAAAAAAAAAAAAAABilkre7//+mvpLC62e6qRhYLBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEvGgYAAA5cx////8BYHD2z////////86VqSWjZ////////////////////////////////33wLAAAAAAAAAAAAAAAAAA09g7/n/////+GomLPQ58hqJQwCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQNTkiEQAAK5fs////6n4sUMX////////sklI6Z9r////////////////////////////////UWwAAAAAAAAAAAAAAAAUpWJXh////////9r+Xp7e1q20rDQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCckHUJrUiEVAgBNz///////rVJhwv////////ONPzBq3P///////////////////////////////81AAAAAAAAAAAAAAAAWRoHD+P////////npzaWPkZGRazISBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQ4oPzc1Ypp2LxkFCXb5///////CeXan3P//////6oc2ImHZ////////////////////////////////0jYAAAAAAAAAAAAAFk2U1////////////vHisnlyhJR1OhkHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABonKT1JQEZojHtPLxUwq////////+e/p6Cy0vP////qj0MhVdD////////////////////////////////VNgAAAAAAAAAAABVJhtf////////////77tyvg3WGon88FggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQJCkyTFhHTG9+dnNWP2/d///////////it6Sgw/////+qTSdTvf///////////////////////////////7gpAAAAAAAAAAAHPYTF////////////89XIyrqqkpi1j0IVBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAESkvKS4/Rz1GfpqGfHh1pfv////////////QlHaa5P///8hcN2rD///////////////////////////////UfBIAAAAAAAAAABllu+7////////////pxcrh2bqdp7OVVhwGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYgMjozKScvPGGlyKKBeITC//////////////61hInC////5oxomuf/////////////////////////////2nk8BAAAAAAAAAAAKXCrwtz//////////uzn8/TcsJylmoRTHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFiszOjopIS9NkdnduKKJkeT///////////////vFp8r////+u4+1+f////////////////////////////+RPy8VAAAAAAAAAAAwW2pigdL///jm///v6f3/9uTNvauKb0AUBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkhLzMzOTowP3K44ce3w7rN///////////////////q/f/////KlLf/////////////////////////////vVZAXkUAAAAAAAAAACA2MydMr///9Ob///Hk8/356tzHnW9VMg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEhwhLi4yQDZNmNDMr7ja5v7//////////////////////////9SfwP///////////////////////////9ptNVmVcwkAAAAAAAAADBESGkOk+///////+O7x+PHawK+SYUMpCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYcHiApLjM8L0Wc2tC7x+r/////////////////////////////5sDa////////////////////////////qzMhZbOdIgAAAAAAAAcOEBkoPZHz//////nc2urx8eHHuKdvPyACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFScrKCEoPUVGZ7js5Nzh+//////////////////////////////cw+T///////////////////b///////+gIhRbtbI6AAAAAAAQICgrOkVDe9z/////3MC6x9ns9unStYFHGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZKC4uIS5JT2Kl6vju5ub//////////////////////////////8iz4f/////////////////+7P///////5EcAi91diwAAAAADBooPU1ZX1Nwx////+fQ1biaq8/v++a/lFUWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABRkkKSwvQFBTarDk2tnHv+/////////////////////////////cu8jv////////7+z////////////////ngRkAByQiDAYNERQdKC85RVVcU2S4////7+LfrYOcv9Xv58CSTREAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJHCgvLzM8P0xtorunp6Cf1///////////////////////////5Kqy5P//+/b7+/nfx+///////////////+qYKAAABwcCDhUWGSEwPDo/TU9JWar/////9M+il623wuHcvYxFDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsZLj01LiwsTYmvsJKGhIa/////////////////5+bz//////TIrcr5/+fF1///6cWy3P//////////////+btGAgACBQcSFhgcITJFRUlVT0ZZqv7////0yqiyt6i94te1fjYFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAkNTMuJyVQoMzQuqSJeK3////////////25LqNg5i/3NC4sr/X8//z0Lvi///cu8rq/v/////////////9z2QNAAUIDBIWGBocJzk9P1BSSVuk9v///+e9pKuklLXm3bBtJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGDR0nJyQhJ0qNyunq2reSqvP//////////8+ddVxYebXNqIOY1fbx2sfM3////+/V3O/////////////////neRQABgcICw0OERQWJzA3SkxHVYPH////5rudkoNtj9XapFsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgYVJygcGBooQ3W78f722rKw5P//////////uGhMXHCYzMeakr/k1K2Uj7Da/f///+/Q2v////////////////+KHQUGBQcHBwYMGB0pNT1NTE1VapTH8f/uyqKJdVZ1w8eDNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEECEvLCEgIig3a8L////kysDX8f////////uaR0BniaKrl4y44cWKb2t1oMjS5Pv/78DF////////////////8YQhCAcGDRAMBw4cHCU2P0ZPW15faHyo1Nq9mpSKZXawqmcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkWJCUoLzU2LCxivf////bm0Mrm////////xWUuM1iRqJqJjauvf15hc4mour/a+f/nv8X////////////////hiSgFAgcYHRQQFRkSFik2MjpVXFlTUnOan4p7h41vcI+ESQ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACxAZHSUvNj0sKWHC////9vPqz+H//////+6JNR4rT5/IvbCceWJWW3CNmpKSuOr9///q9P///////////////+qoOgUCCxYVDA4WFhASISwrNUlQUFZea3NrYmuDh3JeZVglAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGDRQdJyUiJyEpZM3////5///XyOr/////wGIsJzdfr+HawI1PP1l1jY97c4G77/v//////////////////////bdFDAwNDAgGCA4UEhQiLDA6QkdHWHNrUExWcoyBZUpALwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYSGSElIRgWITZyyP///////9e63P///9d/Qi4vQG2w19SiXzlDc5+leVt7qs/U2fT///////////////7////5lCsIDQwJBwYGDBkYFBkgLDpARlBkc1Y2OlZ8jGpHMyEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhAVGBwdGRgnR4zU/v//////1cLs////rVUnHCdAb6rIx6d2ZXiqv5RcZaDMv4+UyPj///js/////+rIwvP//9pbDQQICQkEAAANIiQcGRglNTpFXHBhPCkwUHh5UzIaBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDA4SGBYUGSQ9eLPU/f///93F0Pn//8d1NxoWKDxeotXSuq2wsr2wg3CNq6qMZG+w5v//2bfS38zCr4N+ref/wkAFBAYLDAQAAAshJyEeHCIuMjlPW0wvICA8ZGVHJQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICxIeHR0lJCg9Xn+q2unHq7jQ5+m7bTUZFB0pMlOn5NnAzenXqIqXuruchHl2irjp//+6e3yDcG1wU0dVeauVMAAAAQkNBQAABRUeHBIWKDIzLCw1NSkeHDBVVjoUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIIFCIoLzcrISIwRVt/lIaHpbKwlGE3IRESHSIvW6jc4uz//+6rncXhu42Ej6vCyOH+0G81LjInJzUsJykvRkANAAAABwsCAAACDh0hGRknKyskGSElIBwYITk3HgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYZJzA8TEY3OTw3MDxDR1t1f2dDLB0VERggIjBZn9f4/////tDN18ir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";
101
+ var portrait = null;
102
+ function portraitTone() {
103
+ if (!portrait) {
104
+ const bin = atob(PORTRAIT_TONE_B64);
105
+ const data = new Uint8Array(bin.length);
106
+ for (let i = 0; i < bin.length; i++) data[i] = bin.charCodeAt(i);
107
+ portrait = { size: PORTRAIT_TONE_SIZE, data };
108
+ }
109
+ return portrait;
110
+ }
111
+ function sample(tone, u, v) {
112
+ const n = tone.size;
113
+ const x = Math.min(n - 1.001, Math.max(0, u * n - 0.5));
114
+ const y = Math.min(n - 1.001, Math.max(0, v * n - 0.5));
115
+ const x0 = Math.floor(x);
116
+ const y0 = Math.floor(y);
117
+ const fx = x - x0;
118
+ const fy = y - y0;
119
+ const d = tone.data;
120
+ const a = d[y0 * n + x0] * (1 - fx) + d[y0 * n + x0 + 1] * fx;
121
+ const b = d[(y0 + 1) * n + x0] * (1 - fx) + d[(y0 + 1) * n + x0 + 1] * fx;
122
+ return (a * (1 - fy) + b * fy) / 255;
123
+ }
124
+ var easeOut = (k) => 1 - Math.pow(1 - k, 3);
125
+ function HalftoneCanvas({
126
+ tone,
127
+ density = 86,
128
+ lens = true,
129
+ intro = true,
130
+ breathe = true,
131
+ ink = "#0d0a08",
132
+ fallbackSrc,
133
+ alt,
134
+ className,
135
+ style
136
+ }) {
137
+ const wrap = react.useRef(null);
138
+ const canvas = react.useRef(null);
139
+ const [live, setLive] = react.useState(false);
140
+ react.useEffect(() => {
141
+ const el = wrap.current;
142
+ const cv = canvas.current;
143
+ if (!el || !cv) return;
144
+ const ctx = cv.getContext("2d");
145
+ if (!ctx) return;
146
+ const t = tone ?? portraitTone();
147
+ const still = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
148
+ let size = 0;
149
+ let dots = new Float32Array(0);
150
+ let count = 0;
151
+ const pointer = { x: 0, y: 0, tx: 0, ty: 0, k: 0, on: false };
152
+ let start = 0;
153
+ let raf = 0;
154
+ let visible = true;
155
+ function layout() {
156
+ const s = el.clientWidth;
157
+ if (!s || s === size) return;
158
+ size = s;
159
+ const dpr = Math.min(2, window.devicePixelRatio || 1);
160
+ cv.width = Math.round(s * dpr);
161
+ cv.height = Math.round(s * dpr);
162
+ ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
163
+ const pitch = s / density;
164
+ const c = s / 2;
165
+ const ca = Math.SQRT1_2;
166
+ const span = Math.ceil(s * 0.75 / pitch) + 1;
167
+ const out = [];
168
+ for (let i = -span; i <= span; i++) {
169
+ for (let j = -span; j <= span; j++) {
170
+ const u = i * pitch;
171
+ const v = j * pitch;
172
+ const x = c + (u - v) * ca;
173
+ const y = c + (u + v) * ca;
174
+ const dc = Math.hypot(x - c, y - c);
175
+ if (dc > c - pitch * 0.6) continue;
176
+ const inkv = sample(t, x / s, y / s);
177
+ if (inkv < 0.1) continue;
178
+ const r = pitch * Math.sqrt(inkv / Math.PI) * 1.1;
179
+ out.push(x, y, r, dc / c * 1100);
180
+ }
181
+ }
182
+ dots = Float32Array.from(out);
183
+ count = out.length / 4;
184
+ }
185
+ function frame(now) {
186
+ if (!start) start = now;
187
+ const el2 = now - start;
188
+ pointer.x += (pointer.tx - pointer.x) * 0.18;
189
+ pointer.y += (pointer.ty - pointer.y) * 0.18;
190
+ pointer.k += ((pointer.on ? 1 : 0) - pointer.k) * 0.12;
191
+ const L = size * 0.22;
192
+ ctx.clearRect(0, 0, size, size);
193
+ ctx.fillStyle = ink;
194
+ ctx.beginPath();
195
+ const wave = breathe && !still;
196
+ const sec = now / 1e3;
197
+ for (let n = 0; n < count; n++) {
198
+ let x = dots[n * 4];
199
+ let y = dots[n * 4 + 1];
200
+ let r = dots[n * 4 + 2];
201
+ if (intro && !still) {
202
+ const k = Math.min(1, Math.max(0, (el2 - dots[n * 4 + 3]) / 650));
203
+ if (k <= 0) continue;
204
+ r *= easeOut(k);
205
+ }
206
+ if (wave) r *= 1 + 0.05 * Math.sin(sec * 1.1 + (x + y) / size * 6);
207
+ if (pointer.k > 0.01) {
208
+ const dx = x - pointer.x;
209
+ const dy = y - pointer.y;
210
+ const d = Math.hypot(dx, dy);
211
+ if (d < L) {
212
+ const f = (1 - d / L) * pointer.k;
213
+ r *= 1 - 0.75 * f * f;
214
+ if (d > 1e-3) {
215
+ const push = f * (size / density) * 2.6;
216
+ x += dx / d * push;
217
+ y += dy / d * push;
218
+ }
219
+ }
220
+ }
221
+ ctx.moveTo(x + r, y);
222
+ ctx.arc(x, y, r, 0, Math.PI * 2);
223
+ }
224
+ ctx.fill();
225
+ const introDone = !intro || still || el2 > 1900;
226
+ const busy = wave || pointer.k > 0.01 || !introDone;
227
+ raf = busy && visible && !document.hidden ? requestAnimationFrame(frame) : 0;
228
+ }
229
+ const kick = () => {
230
+ if (!raf && visible && !document.hidden) raf = requestAnimationFrame(frame);
231
+ };
232
+ layout();
233
+ setLive(true);
234
+ kick();
235
+ const ro = typeof ResizeObserver !== "undefined" ? new ResizeObserver(() => (layout(), kick())) : null;
236
+ ro?.observe(el);
237
+ const io = typeof IntersectionObserver !== "undefined" ? new IntersectionObserver(([e]) => {
238
+ visible = Boolean(e?.isIntersecting);
239
+ kick();
240
+ }) : null;
241
+ io?.observe(el);
242
+ const onVis = () => kick();
243
+ document.addEventListener("visibilitychange", onVis);
244
+ const move = (e) => {
245
+ const b = el.getBoundingClientRect();
246
+ pointer.tx = e.clientX - b.left;
247
+ pointer.ty = e.clientY - b.top;
248
+ if (!pointer.on) {
249
+ pointer.x = pointer.tx;
250
+ pointer.y = pointer.ty;
251
+ }
252
+ pointer.on = true;
253
+ kick();
254
+ };
255
+ const leave = () => {
256
+ pointer.on = false;
257
+ kick();
258
+ };
259
+ if (lens && !still) {
260
+ el.addEventListener("pointermove", move);
261
+ el.addEventListener("pointerleave", leave);
262
+ }
263
+ return () => {
264
+ cancelAnimationFrame(raf);
265
+ ro?.disconnect();
266
+ io?.disconnect();
267
+ document.removeEventListener("visibilitychange", onVis);
268
+ el.removeEventListener("pointermove", move);
269
+ el.removeEventListener("pointerleave", leave);
270
+ };
271
+ }, [tone, density, lens, intro, breathe, ink]);
272
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: wrap, className: cn("relative aspect-square w-full", className), style, "data-live": live || void 0, children: [
273
+ fallbackSrc ? (
274
+ // eslint-disable-next-line @next/next/no-img-element -- the still screen, until the live one draws
275
+ /* @__PURE__ */ jsxRuntime.jsx(
276
+ "img",
277
+ {
278
+ src: fallbackSrc,
279
+ alt: "",
280
+ "aria-hidden": true,
281
+ className: cn("absolute inset-0 size-full select-none transition-opacity duration-300", live && "opacity-0"),
282
+ draggable: false
283
+ }
284
+ )
285
+ ) : null,
286
+ /* @__PURE__ */ jsxRuntime.jsx("canvas", { ref: canvas, role: "img", "aria-label": alt, className: "absolute inset-0 size-full" })
287
+ ] });
288
+ }
96
289
  var SPHERE_GRADIENT = "radial-gradient(86% 86% at 36% 32%, #fff7f0 0%, #ffdec8 14%, #ffa069 34%, #ff7030 56%, #f65210 78%, #de4006 100%)";
97
290
  var SPHERE_DEPTH = "inset -14px -22px 44px rgb(150 40 0 / 0.16), 0 36px 70px -34px rgb(234 88 11 / 0.45)";
98
- function Ball({ src, alt, float }) {
99
- return /* @__PURE__ */ jsxRuntime.jsx(
100
- "div",
101
- {
102
- className: cn("relative size-full overflow-hidden rounded-full", float && "oca-animate-float"),
103
- style: { background: SPHERE_GRADIENT, boxShadow: SPHERE_DEPTH },
104
- children: /* @__PURE__ */ jsxRuntime.jsx("img", { src, alt, className: "absolute inset-0 size-full select-none", draggable: false })
105
- }
106
- );
291
+ var SPHERE_GLOSS = "radial-gradient(38% 30% at 33% 22%, rgb(255 255 255 / 0.55), transparent 72%)";
292
+ function Ball({ src, alt, float, live }) {
293
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative size-full", float && "oca-animate-float"), children: [
294
+ /* @__PURE__ */ jsxRuntime.jsx(
295
+ "div",
296
+ {
297
+ "aria-hidden": true,
298
+ className: "absolute inset-x-[14%] -bottom-[7%] h-[10%] rounded-[50%] bg-[rgb(234_88_11/0.28)] blur-2xl"
299
+ }
300
+ ),
301
+ /* @__PURE__ */ jsxRuntime.jsxs(
302
+ "div",
303
+ {
304
+ className: "relative size-full overflow-hidden rounded-full",
305
+ style: { background: SPHERE_GRADIENT, boxShadow: SPHERE_DEPTH },
306
+ children: [
307
+ live ? /* @__PURE__ */ jsxRuntime.jsx(HalftoneCanvas, { fallbackSrc: src, alt }) : (
308
+ // eslint-disable-next-line @next/next/no-img-element -- a static dot layer, sized by CSS
309
+ /* @__PURE__ */ jsxRuntime.jsx("img", { src, alt, className: "absolute inset-0 size-full select-none", draggable: false })
310
+ ),
311
+ /* @__PURE__ */ jsxRuntime.jsx(
312
+ "div",
313
+ {
314
+ "aria-hidden": true,
315
+ className: "pointer-events-none absolute inset-0 rounded-full mix-blend-soft-light",
316
+ style: { background: SPHERE_GLOSS }
317
+ }
318
+ )
319
+ ]
320
+ }
321
+ )
322
+ ] });
107
323
  }
108
- function HalftoneSphere({ src, alt, stadium = false, float = false, className, style }) {
324
+ function HalftoneSphere({
325
+ src,
326
+ alt,
327
+ stadium = false,
328
+ float = false,
329
+ live = false,
330
+ className,
331
+ style
332
+ }) {
109
333
  if (!stadium) {
110
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("relative aspect-square w-full", className), style, children: /* @__PURE__ */ jsxRuntime.jsx(Ball, { src, alt, float }) });
334
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("relative aspect-square w-full", className), style, children: /* @__PURE__ */ jsxRuntime.jsx(Ball, { src, alt, float, live }) });
111
335
  }
112
336
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative aspect-[1.255/1.127] w-full", className), style, children: [
113
337
  /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-hidden": true, className: "oca-stadium pointer-events-none absolute left-0 top-0 h-full w-[88.4%] rounded-[32%]" }),
114
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute bottom-0 right-0 aspect-square w-[79.7%]", children: /* @__PURE__ */ jsxRuntime.jsx(Ball, { src, alt, float }) })
338
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute bottom-0 right-0 aspect-square w-[79.7%]", children: /* @__PURE__ */ jsxRuntime.jsx(Ball, { src, alt, float, live }) })
115
339
  ] });
116
340
  }
117
- function IsoCheck({ size = 360, settle = false, shadow = true, title, className }) {
118
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative inline-block", settle && "oca-animate-settle", className), style: { width: size }, children: [
119
- /* @__PURE__ */ jsxRuntime.jsx(Mark, { size, title, className: "relative z-10 block" }),
120
- shadow ? /* @__PURE__ */ jsxRuntime.jsx(
121
- "div",
122
- {
123
- "aria-hidden": true,
124
- className: "absolute left-[8%] right-[8%] rounded-[50%] opacity-60 blur-xl",
125
- style: { height: size * 0.08, bottom: -size * 0.04, background: "rgb(234 88 11 / 0.18)" }
126
- }
127
- ) : null
128
- ] });
341
+ function IsoCheck({ size = 360, settle = false, shadow = true, tilt = false, title, className }) {
342
+ const ref = react.useRef(null);
343
+ react.useEffect(() => {
344
+ const el = ref.current;
345
+ if (!el || !tilt || window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
346
+ let raf = 0;
347
+ let tx = 0;
348
+ let ty = 0;
349
+ let x = 0;
350
+ let y = 0;
351
+ const step = () => {
352
+ x += (tx - x) * 0.08;
353
+ y += (ty - y) * 0.08;
354
+ el.style.setProperty("--rx", `${(-y * 10).toFixed(2)}deg`);
355
+ el.style.setProperty("--ry", `${(x * 14).toFixed(2)}deg`);
356
+ raf = Math.abs(tx - x) + Math.abs(ty - y) > 1e-3 ? requestAnimationFrame(step) : 0;
357
+ };
358
+ const move = (e) => {
359
+ const b = el.getBoundingClientRect();
360
+ tx = Math.max(-1, Math.min(1, (e.clientX - (b.left + b.width / 2)) / (window.innerWidth / 2)));
361
+ ty = Math.max(-1, Math.min(1, (e.clientY - (b.top + b.height / 2)) / (window.innerHeight / 2)));
362
+ if (!raf) raf = requestAnimationFrame(step);
363
+ };
364
+ window.addEventListener("pointermove", move, { passive: true });
365
+ return () => {
366
+ cancelAnimationFrame(raf);
367
+ window.removeEventListener("pointermove", move);
368
+ };
369
+ }, [tilt]);
370
+ return /* @__PURE__ */ jsxRuntime.jsxs(
371
+ "div",
372
+ {
373
+ ref,
374
+ className: cn("relative inline-block", settle && "oca-animate-settle", className),
375
+ style: { width: size, perspective: tilt ? 900 : void 0 },
376
+ children: [
377
+ tilt ? /* @__PURE__ */ jsxRuntime.jsx(
378
+ "div",
379
+ {
380
+ "aria-hidden": true,
381
+ className: "absolute left-1/2 top-1/2 -z-0 aspect-square w-[120%] -translate-x-1/2 -translate-y-1/2 rounded-full opacity-70 blur-3xl",
382
+ style: { background: "radial-gradient(closest-side, rgb(255 140 70 / 0.35), transparent)" }
383
+ }
384
+ ) : null,
385
+ /* @__PURE__ */ jsxRuntime.jsx(
386
+ "div",
387
+ {
388
+ className: "relative z-10 transition-transform duration-300 ease-out",
389
+ style: tilt ? { transform: "rotateX(var(--rx, 0deg)) rotateY(var(--ry, 0deg))", transformStyle: "preserve-3d" } : void 0,
390
+ children: /* @__PURE__ */ jsxRuntime.jsx(Mark, { size, title, className: "block" })
391
+ }
392
+ ),
393
+ shadow ? /* @__PURE__ */ jsxRuntime.jsx(
394
+ "div",
395
+ {
396
+ "aria-hidden": true,
397
+ className: "absolute left-[8%] right-[8%] rounded-[50%] opacity-60 blur-xl",
398
+ style: { height: size * 0.08, bottom: -size * 0.04, background: "rgb(234 88 11 / 0.18)" }
399
+ }
400
+ ) : null
401
+ ]
402
+ }
403
+ );
129
404
  }
130
405
  var CELL_W = 22;
131
406
  var CELL_H = 27;
@@ -145,6 +420,7 @@ function Crowd({
145
420
  seed = 21,
146
421
  tone = "ink",
147
422
  label = "A crowd of identical accounts. Only a few are real.",
423
+ story = false,
148
424
  className
149
425
  }) {
150
426
  const width = cols * CELL_W;
@@ -153,48 +429,65 @@ function Crowd({
153
429
  const nearFrom = Math.floor(rows / 2) * cols;
154
430
  const realSet = new Set([...picks(real, rows * cols - nearFrom, seed)].map((i) => i + nearFrom));
155
431
  const bot = tone === "ink" ? "#ffffff" : "#0a0a0a";
432
+ let lcg = seed * 7919 >>> 0;
433
+ const leaveAt = () => {
434
+ lcg = Math.imul(lcg, 1664525) + 1013904223 >>> 0;
435
+ return 0.12 + lcg / 2 ** 32 * 0.6;
436
+ };
156
437
  let y = 0;
157
- return /* @__PURE__ */ jsxRuntime.jsx(
438
+ return /* @__PURE__ */ jsxRuntime.jsxs(
158
439
  "svg",
159
440
  {
160
441
  role: "img",
161
442
  "aria-label": label,
162
443
  viewBox: `0 0 ${width} ${Math.ceil(height)}`,
163
- className: cn("block h-auto w-full", className),
164
- children: scales.map((s, r) => {
165
- const rowY = y;
166
- y += CELL_H * s;
167
- const rowW = cols * CELL_W * s;
168
- const x0 = (width - rowW) / 2;
169
- return Array.from({ length: cols }, (_, c) => {
170
- const i = r * cols + c;
171
- const isReal = realSet.has(i);
172
- return /* @__PURE__ */ jsxRuntime.jsxs(
173
- "g",
174
- {
175
- transform: `translate(${x0 + c * CELL_W * s} ${rowY}) scale(${s})`,
176
- fill: isReal ? "var(--oca-orange)" : bot,
177
- fillOpacity: isReal ? 1 : 0.1 + 0.16 * s,
178
- children: [
179
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: 11, cy: 8, r: 4.4 }),
180
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 25a8 8.5 0 0 1 16 0Z" })
181
- ]
182
- },
183
- i
184
- );
185
- });
186
- })
444
+ className: cn("block h-auto w-full overflow-visible", className),
445
+ children: [
446
+ story ? /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsxs("radialGradient", { id: "oca-crowd-glow", children: [
447
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "0", stopColor: "#ff7a3d", stopOpacity: "0.55" }),
448
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "1", stopColor: "#ff7a3d", stopOpacity: "0" })
449
+ ] }) }) : null,
450
+ scales.map((s, r) => {
451
+ const rowY = y;
452
+ y += CELL_H * s;
453
+ const rowW = cols * CELL_W * s;
454
+ const x0 = (width - rowW) / 2;
455
+ return Array.from({ length: cols }, (_, c) => {
456
+ const i = r * cols + c;
457
+ const isReal = realSet.has(i);
458
+ const t = leaveAt();
459
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${x0 + c * CELL_W * s} ${rowY}) scale(${s})`, children: [
460
+ isReal && story ? /* @__PURE__ */ jsxRuntime.jsx("circle", { className: "oca-crowd-halo", cx: 11, cy: 14, r: 13, fill: "url(#oca-crowd-glow)" }) : null,
461
+ /* @__PURE__ */ jsxRuntime.jsxs(
462
+ "g",
463
+ {
464
+ className: story ? isReal ? "oca-crowd-real" : "oca-crowd-bot" : void 0,
465
+ style: story && !isReal ? { "--t": t.toFixed(3) } : void 0,
466
+ fill: isReal ? "var(--oca-orange)" : bot,
467
+ fillOpacity: isReal ? 1 : 0.1 + 0.16 * s,
468
+ children: [
469
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: 11, cy: 8, r: 4.4 }),
470
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 25a8 8.5 0 0 1 16 0Z" })
471
+ ]
472
+ }
473
+ )
474
+ ] }, i);
475
+ });
476
+ })
477
+ ]
187
478
  }
188
479
  );
189
480
  }
190
481
 
191
482
  exports.AppIcon = AppIcon;
192
483
  exports.Crowd = Crowd;
484
+ exports.HalftoneCanvas = HalftoneCanvas;
193
485
  exports.HalftoneSphere = HalftoneSphere;
194
486
  exports.IsoCheck = IsoCheck;
195
487
  exports.Lockup = Lockup;
196
488
  exports.MARK_FACES = MARK_FACES;
197
489
  exports.Mark = Mark;
198
490
  exports.SPHERE_GRADIENT = SPHERE_GRADIENT;
491
+ exports.portraitTone = portraitTone;
199
492
  //# sourceMappingURL=brand.js.map
200
493
  //# sourceMappingURL=brand.js.map