@diffenderfer-games/hub 2.0.0-next.0 → 2.0.0-next.10

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.
Files changed (293) hide show
  1. package/CHANGELOG.md +163 -0
  2. package/LICENSE +21 -21
  3. package/README.md +203 -139
  4. package/dist/auto.d.ts +8 -8
  5. package/dist/auto.js +3 -3
  6. package/dist/avatar-pixi.d.ts +165 -0
  7. package/dist/avatar-pixi.d.ts.map +1 -0
  8. package/dist/avatar-pixi.js +299 -0
  9. package/dist/avatar-pixi.js.map +1 -0
  10. package/dist/avatar-svg.d.ts +4 -0
  11. package/dist/avatar-svg.js +5 -0
  12. package/dist/avatar-three.d.ts +69 -0
  13. package/dist/avatar-three.d.ts.map +1 -0
  14. package/dist/avatar-three.js +49 -0
  15. package/dist/avatar-three.js.map +1 -0
  16. package/dist/avatar.d.ts +7 -0
  17. package/dist/avatar.js +500 -0
  18. package/dist/avatar.js.map +1 -0
  19. package/dist/daily.d.ts +2 -2
  20. package/dist/doctor/cli.mjs +119 -28
  21. package/dist/doctor/cli.mjs.map +1 -1
  22. package/dist/index.d.ts +8 -8
  23. package/dist/index.js +3 -3
  24. package/dist/input.d.ts +2 -2
  25. package/dist/input.js +2 -2
  26. package/dist/mp.d.ts +3 -3
  27. package/dist/race.d.ts +1 -1
  28. package/dist/rooms.d.ts +3 -3
  29. package/dist/rooms.js +1 -1
  30. package/dist/shared/animator.d.ts +104 -0
  31. package/dist/shared/animator.d.ts.map +1 -0
  32. package/dist/shared/art.js +1946 -0
  33. package/dist/shared/art.js.map +1 -0
  34. package/dist/shared/atlas.d.ts +138 -0
  35. package/dist/shared/atlas.d.ts.map +1 -0
  36. package/dist/shared/avatar.d.ts +123 -0
  37. package/dist/shared/avatar.d.ts.map +1 -0
  38. package/dist/shared/bridge.js +18 -4
  39. package/dist/shared/bridge.js.map +1 -1
  40. package/dist/shared/client-version.gen.js +1 -1
  41. package/dist/shared/daily.d.ts +145 -19
  42. package/dist/shared/daily.d.ts.map +1 -1
  43. package/dist/shared/daily.js +138 -25
  44. package/dist/shared/daily.js.map +1 -1
  45. package/dist/shared/defineProperty.js +39 -0
  46. package/dist/shared/describe.d.ts +32 -0
  47. package/dist/shared/describe.d.ts.map +1 -0
  48. package/dist/shared/describe.js +109 -0
  49. package/dist/shared/describe.js.map +1 -0
  50. package/dist/shared/globals.js +9 -42
  51. package/dist/shared/globals.js.map +1 -1
  52. package/dist/shared/index.d.ts +1122 -46
  53. package/dist/shared/index.d.ts.map +1 -1
  54. package/dist/shared/input.d.ts +74 -14
  55. package/dist/shared/input.d.ts.map +1 -1
  56. package/dist/shared/input.js +179 -25
  57. package/dist/shared/input.js.map +1 -1
  58. package/dist/shared/json-guards.js +48 -0
  59. package/dist/shared/json-guards.js.map +1 -0
  60. package/dist/shared/latest-state.js +1 -1
  61. package/dist/shared/live-canvas.js +62 -0
  62. package/dist/shared/live-canvas.js.map +1 -0
  63. package/dist/shared/mp.js +10 -2
  64. package/dist/shared/mp.js.map +1 -1
  65. package/dist/shared/multiplayer-types.d.ts +15 -2
  66. package/dist/shared/multiplayer-types.d.ts.map +1 -1
  67. package/dist/shared/overlays.js +800 -0
  68. package/dist/shared/overlays.js.map +1 -0
  69. package/dist/shared/page-stack.js +2 -1
  70. package/dist/shared/page-stack.js.map +1 -1
  71. package/dist/shared/pose-key.js +249 -0
  72. package/dist/shared/pose-key.js.map +1 -0
  73. package/dist/shared/race-types.d.ts +1 -1
  74. package/dist/shared/race.js +1 -1
  75. package/dist/shared/room-types.d.ts +28 -3
  76. package/dist/shared/room-types.d.ts.map +1 -1
  77. package/dist/shared/rooms.d.ts.map +1 -1
  78. package/dist/shared/rooms.js +23 -4
  79. package/dist/shared/rooms.js.map +1 -1
  80. package/dist/shared/runtime-opener.js +1 -1
  81. package/dist/shared/scene.d.ts +90 -0
  82. package/dist/shared/scene.d.ts.map +1 -0
  83. package/dist/shared/social.d.ts +90 -9
  84. package/dist/shared/social.d.ts.map +1 -1
  85. package/dist/shared/social.js +6 -1
  86. package/dist/shared/social.js.map +1 -1
  87. package/dist/shared/src.js +4563 -667
  88. package/dist/shared/src.js.map +1 -1
  89. package/dist/shared/svg-markup.js +2354 -0
  90. package/dist/shared/svg-markup.js.map +1 -0
  91. package/dist/shared/svg.js +27 -0
  92. package/dist/shared/svg.js.map +1 -0
  93. package/dist/shared/types.d.ts +174 -0
  94. package/dist/shared/types.d.ts.map +1 -0
  95. package/dist/shared/wire-types.d.ts +6 -2
  96. package/dist/shared/wire-types.d.ts.map +1 -1
  97. package/dist/social.d.ts +5 -5
  98. package/dist/social.js +2 -2
  99. package/dist/turns-rules.d.ts +2 -0
  100. package/dist/turns-rules.js +1 -0
  101. package/dist/turns.d.ts +61 -0
  102. package/dist/turns.d.ts.map +1 -0
  103. package/dist/turns.js +183 -0
  104. package/dist/turns.js.map +1 -0
  105. package/package.json +125 -89
  106. package/src/auto.ts +39 -39
  107. package/src/avatar/adapters/pixi-avatar.ts +73 -0
  108. package/src/avatar/adapters/pixi-crowd.ts +329 -0
  109. package/src/avatar/adapters/pixi-types.ts +84 -0
  110. package/src/avatar/adapters/three.ts +126 -0
  111. package/src/avatar/animator/animator.ts +285 -0
  112. package/src/avatar/animator/reactions.ts +44 -0
  113. package/src/avatar/animator/schedule.ts +73 -0
  114. package/src/avatar/art/beard.ts +49 -0
  115. package/src/avatar/art/glasses.ts +67 -0
  116. package/src/avatar/art/hair.ts +254 -0
  117. package/src/avatar/art/headwear.ts +75 -0
  118. package/src/avatar/art/index.ts +21 -0
  119. package/src/avatar/art/shape.ts +87 -0
  120. package/src/avatar/art-store.ts +36 -0
  121. package/src/avatar/atlas.ts +246 -0
  122. package/src/avatar/catalog-view.ts +14 -0
  123. package/src/avatar/colour.ts +109 -0
  124. package/src/avatar/describe.ts +79 -0
  125. package/src/avatar/face.ts +187 -0
  126. package/src/avatar/geom.ts +173 -0
  127. package/src/avatar/layout.ts +47 -0
  128. package/src/avatar/look-like.ts +52 -0
  129. package/src/avatar/outputs/bitmap.ts +75 -0
  130. package/src/avatar/outputs/canvas-paint.ts +177 -0
  131. package/src/avatar/outputs/canvas.ts +62 -0
  132. package/src/avatar/outputs/custom-element.ts +140 -0
  133. package/src/avatar/outputs/element.ts +58 -0
  134. package/src/avatar/outputs/live-canvas.ts +57 -0
  135. package/src/avatar/outputs/overlay-svg.ts +22 -0
  136. package/src/avatar/outputs/pose-key.ts +30 -0
  137. package/src/avatar/outputs/svg-markup.ts +113 -0
  138. package/src/avatar/outputs/svg.ts +41 -0
  139. package/src/avatar/overlays.ts +128 -0
  140. package/src/avatar/render/body.ts +116 -0
  141. package/src/avatar/render/colours.ts +81 -0
  142. package/src/avatar/render/compose.ts +320 -0
  143. package/src/avatar/render/context.ts +117 -0
  144. package/src/avatar/render/eyes.ts +78 -0
  145. package/src/avatar/render/eyewear.ts +118 -0
  146. package/src/avatar/render/frame.ts +73 -0
  147. package/src/avatar/render/head.ts +81 -0
  148. package/src/avatar/render/mouth.ts +86 -0
  149. package/src/avatar/render/props.ts +91 -0
  150. package/src/avatar/render/types.ts +93 -0
  151. package/src/avatar/render/walker-parts.ts +121 -0
  152. package/src/avatar/render/walker.ts +199 -0
  153. package/src/avatar/scene.ts +119 -0
  154. package/src/avatar-pixi.ts +20 -0
  155. package/src/avatar-svg.ts +21 -0
  156. package/src/avatar-three.ts +18 -0
  157. package/src/avatar.ts +63 -0
  158. package/src/core/avatar/avatar-cache.ts +95 -0
  159. package/src/core/avatar/avatar-ref.ts +34 -0
  160. package/src/core/avatar/avatar-types.ts +43 -0
  161. package/src/core/avatar/hub-avatar.ts +308 -0
  162. package/src/core/connection.ts +408 -299
  163. package/src/core/errors.ts +160 -147
  164. package/src/core/game-data.ts +40 -38
  165. package/src/core/hub-economy.ts +216 -179
  166. package/src/core/hub-progress.ts +269 -205
  167. package/src/core/hub.ts +352 -131
  168. package/src/core/menu-control.ts +61 -61
  169. package/src/core/offline/cloud-saves.ts +62 -0
  170. package/src/core/offline/events.ts +50 -50
  171. package/src/core/offline/favorites.ts +21 -21
  172. package/src/core/offline/hub-kinds/avatar-kind.ts +42 -0
  173. package/src/core/offline/hub-kinds/daily-kind.ts +68 -0
  174. package/src/core/offline/hub-kinds/economy-kinds.ts +86 -0
  175. package/src/core/offline/hub-kinds/game-fields.ts +2 -0
  176. package/src/core/offline/hub-kinds/index.ts +52 -0
  177. package/src/core/offline/hub-kinds/legacy-ops.ts +37 -0
  178. package/src/core/offline/hub-kinds/progress-kinds.ts +165 -0
  179. package/src/core/offline/hub-kinds/resume-kind.ts +108 -0
  180. package/src/core/offline/hub-kinds/saved-kind.ts +93 -0
  181. package/src/core/offline/kind-adapters.ts +48 -0
  182. package/src/core/offline/local-inventory.ts +64 -0
  183. package/src/core/offline/local-store.ts +304 -261
  184. package/src/core/offline/offline-api.ts +65 -0
  185. package/src/core/offline/outbox-entry.ts +59 -0
  186. package/src/core/offline/outbox-kinds.ts +78 -0
  187. package/src/core/offline/outbox-merge.ts +39 -0
  188. package/src/core/offline/outbox-replayer.ts +141 -0
  189. package/src/core/offline/outbox-store.ts +85 -0
  190. package/src/core/offline/outbox.ts +232 -0
  191. package/src/core/offline/queue.ts +126 -171
  192. package/src/core/offline/replay-lease.ts +87 -0
  193. package/src/core/offline/replay-policy.ts +52 -0
  194. package/src/core/page-account.ts +121 -0
  195. package/src/core/page.ts +87 -74
  196. package/src/core/rest/endpoint-types.ts +22 -22
  197. package/src/core/rest/rest-client.ts +163 -152
  198. package/src/core/rest/routes.gen.ts +144 -88
  199. package/src/core/resume/hub-resume.ts +286 -0
  200. package/src/core/resume/local-resume.ts +130 -0
  201. package/src/core/resume/resume-list.ts +65 -0
  202. package/src/core/resume/resume-request.ts +52 -0
  203. package/src/core/resume/resume-types.ts +64 -0
  204. package/src/core/saved/daily-saves.ts +196 -0
  205. package/src/core/saved/daily-seed.ts +16 -0
  206. package/src/core/saved/hub-saved.ts +221 -0
  207. package/src/core/saved/local-saved.ts +122 -0
  208. package/src/core/saved/saved-list.ts +129 -0
  209. package/src/core/saved/saved-open.ts +104 -0
  210. package/src/core/saved/saved-order.ts +49 -0
  211. package/src/core/saved/saved-types.ts +24 -0
  212. package/src/core/storage/json-guards.ts +80 -74
  213. package/src/core/storage/key-value.ts +66 -66
  214. package/src/core/ticket.ts +43 -43
  215. package/src/core/turns/hub-turns.ts +161 -0
  216. package/src/core/turns/turn-game.ts +510 -0
  217. package/src/core/turns/your-turn-buzz.ts +69 -0
  218. package/src/core/types.ts +134 -134
  219. package/src/core/version/client-version.gen.ts +2 -2
  220. package/src/core/version/hub-version.ts +62 -62
  221. package/src/core/version/semver.ts +97 -97
  222. package/src/daily/daily-system.ts +276 -161
  223. package/src/daily/page-daily.ts +36 -36
  224. package/src/daily/types.ts +105 -67
  225. package/src/daily.ts +10 -10
  226. package/src/doctor/checks.ts +86 -76
  227. package/src/doctor/cli.ts +101 -106
  228. package/src/doctor/hub-version-fetch.ts +43 -0
  229. package/src/doctor/tsconfig.json +12 -12
  230. package/src/doctor/world-check.ts +61 -0
  231. package/src/globals.ts +115 -110
  232. package/src/index.ts +68 -50
  233. package/src/input/device-state.ts +146 -146
  234. package/src/input/edges.ts +55 -55
  235. package/src/input/focus-ring.ts +13 -0
  236. package/src/input/gamepad.ts +61 -61
  237. package/src/input/input-events.ts +32 -32
  238. package/src/input/input-registry.ts +171 -164
  239. package/src/input/input-system.ts +406 -393
  240. package/src/input/legacy-controls.ts +64 -64
  241. package/src/input/modality.ts +122 -0
  242. package/src/input/nav-state.ts +200 -191
  243. package/src/input/navigator.ts +182 -171
  244. package/src/input/on-screen-controls.ts +101 -101
  245. package/src/input/page-control.ts +43 -43
  246. package/src/input/page-input.ts +193 -193
  247. package/src/input/player-remaps.ts +77 -77
  248. package/src/input/source-values.ts +116 -116
  249. package/src/input/spatial.ts +47 -47
  250. package/src/input/types.ts +331 -331
  251. package/src/input/zero-config.ts +164 -177
  252. package/src/input.ts +26 -22
  253. package/src/mp.ts +10 -10
  254. package/src/overlay/controls-panel.ts +163 -163
  255. package/src/overlay/dom.ts +46 -46
  256. package/src/overlay/layout-clusters.ts +162 -162
  257. package/src/overlay/layout-geometry.ts +136 -136
  258. package/src/overlay/layout.ts +203 -203
  259. package/src/overlay/listener-scope.ts +23 -23
  260. package/src/overlay/on-screen-keyboard.ts +137 -137
  261. package/src/overlay/overlay.ts +234 -208
  262. package/src/overlay/styles.ts +13 -12
  263. package/src/overlay/virtual-controls.ts +262 -262
  264. package/src/race.ts +10 -10
  265. package/src/realtime/bridge.ts +126 -121
  266. package/src/realtime/cross-bundle.ts +29 -29
  267. package/src/realtime/fallback-notice.ts +48 -48
  268. package/src/realtime/hub-link.ts +65 -65
  269. package/src/realtime/latest-state.ts +33 -33
  270. package/src/realtime/multiplayer-forwarder.ts +40 -28
  271. package/src/realtime/multiplayer-types.ts +66 -52
  272. package/src/realtime/page-runtime.ts +60 -60
  273. package/src/realtime/race-forwarder.ts +59 -59
  274. package/src/realtime/race-types.ts +132 -132
  275. package/src/realtime/room-types.ts +151 -125
  276. package/src/realtime/rooms-forwarder.ts +104 -79
  277. package/src/realtime/runtime-api.ts +74 -49
  278. package/src/realtime/runtime-opener.ts +61 -61
  279. package/src/realtime/social-forwarder.ts +77 -72
  280. package/src/realtime/social-types.ts +86 -78
  281. package/src/realtime/types.ts +54 -53
  282. package/src/realtime/wire-types.ts +79 -72
  283. package/src/realtime/world-types.ts +20 -0
  284. package/src/rooms.ts +10 -10
  285. package/src/social.ts +19 -18
  286. package/src/turns-kit/check-rules.ts +281 -0
  287. package/src/turns-rules.ts +12 -0
  288. package/src/turns.ts +14 -0
  289. package/src/types.ts +13 -13
  290. package/src/uistack/page-stack.ts +45 -45
  291. package/src/uistack/play-suspension.ts +82 -82
  292. package/src/uistack/types.ts +76 -76
  293. package/src/uistack/ui-stack.ts +144 -144
@@ -0,0 +1,1946 @@
1
+ import { c as Path, f as roundedRect, l as arc, p as scallop, u as blob } from "./svg-markup.js";
2
+ /** Every facial-hair part by name. */
3
+ const BEARD_ART = {
4
+ none: {},
5
+ stubble: { beard: [{
6
+ d: blob([
7
+ [-45, -4],
8
+ [-44, 22],
9
+ [-30, 46],
10
+ [0, 54],
11
+ [30, 46],
12
+ [44, 22],
13
+ [45, -4],
14
+ [36, 6],
15
+ [22, 18],
16
+ [10, 19],
17
+ [0, 20],
18
+ [-10, 19],
19
+ [-22, 18],
20
+ [-36, 6]
21
+ ]),
22
+ fill: "stubble",
23
+ clip: "head",
24
+ stroke: "none",
25
+ opacity: .5
26
+ }] },
27
+ moustache: { moustache: [{
28
+ d: blob([
29
+ [0, 21.5],
30
+ [6, 19.5],
31
+ [13, 21],
32
+ [
33
+ 16,
34
+ 26,
35
+ "c"
36
+ ],
37
+ [9, 24.5],
38
+ [0, 24.5],
39
+ [-9, 24.5],
40
+ [
41
+ -16,
42
+ 26,
43
+ "c"
44
+ ],
45
+ [-13, 21],
46
+ [-6, 19.5]
47
+ ]),
48
+ fill: "beard"
49
+ }] },
50
+ handlebar: { moustache: [{
51
+ d: blob([
52
+ [0, 21],
53
+ [8, 19.5],
54
+ [16, 22],
55
+ [
56
+ 22,
57
+ 22,
58
+ "c"
59
+ ],
60
+ [24, 17],
61
+ [26, 20],
62
+ [22, 26],
63
+ [14, 25],
64
+ [0, 24.5],
65
+ [-14, 25],
66
+ [-22, 26],
67
+ [-26, 20],
68
+ [-24, 17],
69
+ [
70
+ -22,
71
+ 22,
72
+ "c"
73
+ ],
74
+ [-16, 22],
75
+ [-8, 19.5]
76
+ ]),
77
+ fill: "beard"
78
+ }] },
79
+ goatee: {
80
+ beard: [{
81
+ d: blob([
82
+ [-8, 34],
83
+ [0, 33],
84
+ [8, 34],
85
+ [7, 43],
86
+ [0, 50],
87
+ [-7, 43]
88
+ ]),
89
+ fill: "beard"
90
+ }],
91
+ moustache: [{
92
+ d: blob([
93
+ [0, 21.5],
94
+ [7, 20],
95
+ [12, 21.5],
96
+ [
97
+ 13,
98
+ 25,
99
+ "c"
100
+ ],
101
+ [6, 24.5],
102
+ [0, 24.5],
103
+ [-6, 24.5],
104
+ [
105
+ -13,
106
+ 25,
107
+ "c"
108
+ ],
109
+ [-12, 21.5],
110
+ [-7, 20]
111
+ ]),
112
+ fill: "beard"
113
+ }]
114
+ },
115
+ chinstrap: { beard: [{
116
+ d: blob([
117
+ ...[
118
+ [-45, 0],
119
+ [-44, 22],
120
+ [-30, 46],
121
+ [0, 56],
122
+ [30, 46],
123
+ [44, 22],
124
+ [45, 0]
125
+ ],
126
+ [40, 2],
127
+ [38, 22],
128
+ [26, 40],
129
+ [0, 47],
130
+ [-26, 40],
131
+ [-38, 22],
132
+ [-40, 2]
133
+ ]),
134
+ fill: "beard"
135
+ }] },
136
+ short: {
137
+ beard: [{
138
+ d: blob([
139
+ [-47, -1],
140
+ [-45.5, 16],
141
+ [-37.5, 34],
142
+ [-21, 48.5],
143
+ [0, 53.5],
144
+ [21, 48.5],
145
+ [37.5, 34],
146
+ [45.5, 16],
147
+ [47, -1],
148
+ [42, 3],
149
+ [39.5, 16],
150
+ [32, 30],
151
+ [18, 38.5],
152
+ [0, 41],
153
+ [-18, 38.5],
154
+ [-32, 30],
155
+ [-39.5, 16],
156
+ [-42, 3]
157
+ ]),
158
+ fill: "beard"
159
+ }, {
160
+ d: blob([
161
+ [-4, 47.5],
162
+ [0, 49],
163
+ [4, 47.5]
164
+ ], false),
165
+ fill: "none",
166
+ line: true,
167
+ stroke: "beardShade",
168
+ sw: 2
169
+ }],
170
+ moustache: [{
171
+ d: blob([
172
+ [0, 21.5],
173
+ [6.5, 20],
174
+ [13, 21.5],
175
+ [
176
+ 15.5,
177
+ 25.5,
178
+ "c"
179
+ ],
180
+ [8, 24.3],
181
+ [0, 24.3],
182
+ [-8, 24.3],
183
+ [
184
+ -15.5,
185
+ 25.5,
186
+ "c"
187
+ ],
188
+ [-13, 21.5],
189
+ [-6.5, 20]
190
+ ]),
191
+ fill: "beard"
192
+ }]
193
+ },
194
+ full: {
195
+ beard: [{
196
+ d: blob([
197
+ [-46, -4],
198
+ [-46, 22],
199
+ [-34, 48],
200
+ [-14, 60],
201
+ [0, 62],
202
+ [14, 60],
203
+ [34, 48],
204
+ [46, 22],
205
+ [46, -4],
206
+ [38, 4],
207
+ [30, 14],
208
+ [18, 20],
209
+ [0, 20],
210
+ [-18, 20],
211
+ [-30, 14],
212
+ [-38, 4]
213
+ ]),
214
+ fill: "beard"
215
+ }, {
216
+ d: blob([
217
+ [-6, 49],
218
+ [0, 52],
219
+ [6, 49]
220
+ ], false),
221
+ fill: "none",
222
+ line: true,
223
+ stroke: "beardShade",
224
+ sw: 2
225
+ }],
226
+ moustache: [{
227
+ d: blob([
228
+ [0, 21],
229
+ [8, 19.5],
230
+ [16, 22],
231
+ [
232
+ 18,
233
+ 27,
234
+ "c"
235
+ ],
236
+ [10, 25],
237
+ [0, 25],
238
+ [-10, 25],
239
+ [
240
+ -18,
241
+ 27,
242
+ "c"
243
+ ],
244
+ [-16, 22],
245
+ [-8, 19.5]
246
+ ]),
247
+ fill: "beard"
248
+ }]
249
+ },
250
+ long: {
251
+ beard: [
252
+ {
253
+ d: blob([
254
+ [-46, -4],
255
+ [-46, 24],
256
+ [-36, 54],
257
+ [-20, 74],
258
+ [
259
+ 0,
260
+ 82,
261
+ "c"
262
+ ],
263
+ [20, 74],
264
+ [36, 54],
265
+ [46, 24],
266
+ [46, -4],
267
+ [38, 4],
268
+ [30, 14],
269
+ [18, 20],
270
+ [0, 20],
271
+ [-18, 20],
272
+ [-30, 14],
273
+ [-38, 4]
274
+ ]),
275
+ fill: "beard"
276
+ },
277
+ {
278
+ d: blob([
279
+ [-10, 52],
280
+ [-6, 66],
281
+ [0, 76]
282
+ ], false),
283
+ fill: "none",
284
+ line: true,
285
+ stroke: "beardShade",
286
+ sw: 2
287
+ },
288
+ {
289
+ d: blob([[10, 52], [6, 66]], false),
290
+ fill: "none",
291
+ line: true,
292
+ stroke: "beardShade",
293
+ sw: 2
294
+ }
295
+ ],
296
+ moustache: [{
297
+ d: blob([
298
+ [0, 21],
299
+ [8, 19.5],
300
+ [16, 22],
301
+ [
302
+ 18,
303
+ 27,
304
+ "c"
305
+ ],
306
+ [10, 25],
307
+ [0, 25],
308
+ [-10, 25],
309
+ [
310
+ -18,
311
+ 27,
312
+ "c"
313
+ ],
314
+ [-16, 22],
315
+ [-8, 19.5]
316
+ ]),
317
+ fill: "beard"
318
+ }]
319
+ }
320
+ };
321
+ //#endregion
322
+ //#region src/avatar/art/glasses.ts
323
+ /**
324
+ * Glasses (catalog `glasses.*`). A lens is drawn at each eye (centred on it,
325
+ * authored for the viewer's right eye); `sport` is one visor across both
326
+ * eyes and the monocle is one lens. Lenses are big enough to cover the eye
327
+ * whites (about 21 × 25), so winks and sleepy eyes show through.
328
+ */
329
+ const ring = (r) => blob(arc(0, 0, r, r, 0, 330, 11));
330
+ /** Every glasses part by name. */
331
+ const GLASSES_ART = {
332
+ round: {
333
+ lens: ring(13),
334
+ bridge: blob([
335
+ [-4, 0],
336
+ [0, -3],
337
+ [4, 0]
338
+ ], false)
339
+ },
340
+ square: {
341
+ lens: roundedRect(-13.5, -10.5, 27, 21, 5),
342
+ bridge: blob([
343
+ [-3.5, -2],
344
+ [0, -4],
345
+ [3.5, -2]
346
+ ], false)
347
+ },
348
+ owl: {
349
+ lens: ring(16.5),
350
+ bridge: blob([
351
+ [-1.5, -1],
352
+ [0, -2.5],
353
+ [1.5, -1]
354
+ ], false),
355
+ frame: 4.4
356
+ },
357
+ "cat-eye": {
358
+ lens: blob([
359
+ [-13, -8],
360
+ [-4, -12],
361
+ [9, -12.5],
362
+ [
363
+ 18,
364
+ -17,
365
+ "c"
366
+ ],
367
+ [15.5, 1],
368
+ [9, 11],
369
+ [-3, 13],
370
+ [-11.5, 8]
371
+ ]),
372
+ bridge: blob([
373
+ [-4, -3],
374
+ [0, -5],
375
+ [4, -3]
376
+ ], false),
377
+ isMirrored: true,
378
+ frame: 3.6
379
+ },
380
+ "half-rim": {
381
+ lens: roundedRect(-14, -11, 28, 22, 6),
382
+ bar: blob([
383
+ [-14.6, -4],
384
+ [-13.4, -11.2],
385
+ [13.4, -11.2],
386
+ [14.6, -4]
387
+ ], false),
388
+ bridge: new Path().m(-4, -6).l(4, -6),
389
+ frame: 1.5
390
+ },
391
+ aviator: {
392
+ lens: blob([
393
+ [-12, -11],
394
+ [13, -11.5],
395
+ [15.5, -3],
396
+ [11.5, 9],
397
+ [3, 14],
398
+ [-6, 12.5],
399
+ [-12.5, 3]
400
+ ]),
401
+ bridge: new Path().m(-5, -9.5).l(5, -9.5).m(-4.5, -2).q(0, -5, 4.5, -2),
402
+ isMirrored: true,
403
+ frame: 2.6
404
+ },
405
+ sunglasses: {
406
+ lens: blob([
407
+ [
408
+ -14.5,
409
+ -12.5,
410
+ "c"
411
+ ],
412
+ [
413
+ 15.5,
414
+ -13.5,
415
+ "c"
416
+ ],
417
+ [15, 1],
418
+ [10.5, 11.5],
419
+ [-8.5, 11.5],
420
+ [-14, 3]
421
+ ]),
422
+ bridge: blob([
423
+ [-3.5, -6],
424
+ [0, -8],
425
+ [3.5, -6]
426
+ ], false),
427
+ isMirrored: true,
428
+ frame: 4.2,
429
+ tint: "#262a33"
430
+ },
431
+ sport: {
432
+ visor: blob([
433
+ [-40, -8],
434
+ [-20, -12],
435
+ [0, -10],
436
+ [20, -12],
437
+ [40, -8],
438
+ [38, 6],
439
+ [26, 15],
440
+ [9, 14],
441
+ [0, 9],
442
+ [-9, 14],
443
+ [-26, 15],
444
+ [-38, 6]
445
+ ]),
446
+ frame: 3,
447
+ tint: "#2d6fd6"
448
+ },
449
+ hearts: {
450
+ lens: blob([
451
+ [
452
+ 0,
453
+ -6,
454
+ "c"
455
+ ],
456
+ [6, -13],
457
+ [13, -12.5],
458
+ [16.5, -4],
459
+ [11.5, 6],
460
+ [
461
+ 0,
462
+ 15.5,
463
+ "c"
464
+ ],
465
+ [-11.5, 6],
466
+ [-16.5, -4],
467
+ [-13, -12.5],
468
+ [-6, -13]
469
+ ]),
470
+ bridge: blob([
471
+ [-1.5, -4],
472
+ [0, -6],
473
+ [1.5, -4]
474
+ ], false),
475
+ frame: 3,
476
+ tint: "#e0708f"
477
+ },
478
+ monocle: {
479
+ lens: ring(13.5),
480
+ isSingle: true,
481
+ chain: new Path().m(26, 16).c(32, 30, 38, 38, 46, 44),
482
+ frame: 2.8
483
+ }
484
+ };
485
+ //#endregion
486
+ //#region src/avatar/art/hair.ts
487
+ /** The skull arc (centre 0,−4) from the left temple over the top to the right. */
488
+ const skull = (vol, a0 = 183, a1 = 357, steps = 8) => arc(0, -4, 46 + vol, 46 + vol, a0, a1, steps);
489
+ /** A cap: the skull arc outset by `vol`, closed by a hairline (right → left). */
490
+ const cap = (vol, hairline, a0 = 183, a1 = 357) => blob([...skull(vol, a0, a1), ...hairline]);
491
+ const shine = (r = 40, a0 = 212, a1 = 244) => ({
492
+ d: blob(arc(0, -4, r, r, a0, a1, 3), false),
493
+ fill: "hairLight",
494
+ line: true,
495
+ sw: 3.4,
496
+ stroke: "hairLight",
497
+ opacity: .85
498
+ });
499
+ /** A smooth back-view cap: down to the nape at `nape`. */
500
+ const rearCap = (vol, nape, napeW = 40) => blob([
501
+ ...arc(0, -4, 46 + vol, 46 + vol, 162, 378, 10),
502
+ [napeW + vol * .4, nape],
503
+ [0, nape + 4],
504
+ [-napeW - vol * .4, nape]
505
+ ]);
506
+ /** A round, scalloped cloud (afro, puffs, buns). */
507
+ const cloud = (cx, cy, rx, ry, count, bump, phase = 0) => scallop(arc(cx, cy, rx, ry, phase, phase + 360 - 360 / count, count - 1), bump, true);
508
+ /** A hanging strand (locs, braids): an outlined thick round line. */
509
+ const strand = (pts, w, slot = "hair") => {
510
+ const d = blob(pts, false);
511
+ return [{
512
+ d,
513
+ fill: "none",
514
+ line: true,
515
+ stroke: "hairInk",
516
+ sw: w + 3
517
+ }, {
518
+ d,
519
+ fill: "none",
520
+ line: true,
521
+ stroke: slot,
522
+ sw: w
523
+ }];
524
+ };
525
+ const smoothHairline = [
526
+ [45, -8],
527
+ [38, -24],
528
+ [22, -33],
529
+ [0, -36],
530
+ [-22, -33],
531
+ [-38, -24],
532
+ [-45, -8]
533
+ ];
534
+ //#endregion
535
+ //#region src/avatar/art/index.ts
536
+ /**
537
+ * The art chunk: every part's path data, keyed by catalog name. Loaded
538
+ * lazily by `ready()` so `encode`, `decode` and `defaultLook` never pull it
539
+ * in (avatars.md §3.1).
540
+ */
541
+ /** The launch art. */
542
+ const ART = {
543
+ hair: {
544
+ bald: {
545
+ front: [{
546
+ d: blob(arc(0, -4, 38, 38, 218, 240, 2), false),
547
+ fill: "none",
548
+ line: true,
549
+ stroke: "white",
550
+ sw: 3.2,
551
+ opacity: .35
552
+ }],
553
+ rear: [],
554
+ top: 0
555
+ },
556
+ buzz: {
557
+ front: [{
558
+ d: cap(3, [
559
+ [46, -10],
560
+ [40, -22],
561
+ [26, -29],
562
+ [0, -32],
563
+ [-26, -29],
564
+ [-40, -22],
565
+ [-46, -10]
566
+ ]),
567
+ fill: "hairBuzz",
568
+ clip: "head",
569
+ stroke: "none"
570
+ }],
571
+ rear: [{
572
+ d: rearCap(2, 22),
573
+ fill: "hairBuzz",
574
+ clip: "head",
575
+ stroke: "none"
576
+ }],
577
+ top: 0
578
+ },
579
+ crop: {
580
+ front: [{
581
+ d: cap(5, [
582
+ [45, -8],
583
+ [41, -21],
584
+ [29, -29],
585
+ [15, -27],
586
+ [2, -33],
587
+ [-12, -27],
588
+ [-26, -31],
589
+ [-39, -22],
590
+ [-46, -8]
591
+ ]),
592
+ fill: "hair"
593
+ }, shine(42)],
594
+ rear: [{
595
+ d: rearCap(5, 18),
596
+ fill: "hair"
597
+ }],
598
+ top: 5
599
+ },
600
+ swoop: {
601
+ front: [
602
+ {
603
+ d: blob([
604
+ [-48, -4],
605
+ [-52, -28],
606
+ [-42, -50],
607
+ [-18, -63],
608
+ [10, -64],
609
+ [34, -55],
610
+ [49, -35],
611
+ [51, -8],
612
+ [45, -6],
613
+ [41, -20],
614
+ [30, -26],
615
+ [16, -25],
616
+ [0, -29],
617
+ [-16, -36],
618
+ [-30, -40],
619
+ [-41, -34],
620
+ [-46, -18]
621
+ ]),
622
+ fill: "hair"
623
+ },
624
+ {
625
+ d: blob([
626
+ [24, -60],
627
+ [14, -46],
628
+ [6, -30]
629
+ ], false),
630
+ fill: "none",
631
+ line: true,
632
+ stroke: "hairShade",
633
+ sw: 2.4
634
+ },
635
+ shine(46, 222, 250)
636
+ ],
637
+ rear: [{
638
+ d: rearCap(7, 16),
639
+ fill: "hair"
640
+ }],
641
+ top: 14
642
+ },
643
+ spiky: {
644
+ front: [{
645
+ d: blob([
646
+ [-48, -4],
647
+ [
648
+ -58,
649
+ -22,
650
+ "c"
651
+ ],
652
+ [-47, -30],
653
+ [
654
+ -54,
655
+ -48,
656
+ "c"
657
+ ],
658
+ [-36, -48],
659
+ [
660
+ -30,
661
+ -66,
662
+ "c"
663
+ ],
664
+ [-16, -55],
665
+ [
666
+ -2,
667
+ -72,
668
+ "c"
669
+ ],
670
+ [8, -56],
671
+ [
672
+ 26,
673
+ -68,
674
+ "c"
675
+ ],
676
+ [30, -50],
677
+ [
678
+ 50,
679
+ -54,
680
+ "c"
681
+ ],
682
+ [46, -36],
683
+ [
684
+ 60,
685
+ -24,
686
+ "c"
687
+ ],
688
+ [48, -4],
689
+ [44, -10],
690
+ [
691
+ 38,
692
+ -26,
693
+ "c"
694
+ ],
695
+ [30, -21],
696
+ [
697
+ 22,
698
+ -34,
699
+ "c"
700
+ ],
701
+ [12, -25],
702
+ [
703
+ 2,
704
+ -36,
705
+ "c"
706
+ ],
707
+ [-8, -25],
708
+ [
709
+ -18,
710
+ -34,
711
+ "c"
712
+ ],
713
+ [-28, -22],
714
+ [
715
+ -38,
716
+ -29,
717
+ "c"
718
+ ],
719
+ [-45, -10]
720
+ ]),
721
+ fill: "hair"
722
+ }, shine(40)],
723
+ rear: [{
724
+ d: blob([
725
+ [-48, 14],
726
+ [
727
+ -58,
728
+ -6,
729
+ "c"
730
+ ],
731
+ [-50, -20],
732
+ [
733
+ -56,
734
+ -40,
735
+ "c"
736
+ ],
737
+ [-38, -44],
738
+ [
739
+ -30,
740
+ -64,
741
+ "c"
742
+ ],
743
+ [-14, -54],
744
+ [
745
+ 0,
746
+ -70,
747
+ "c"
748
+ ],
749
+ [14, -54],
750
+ [
751
+ 30,
752
+ -64,
753
+ "c"
754
+ ],
755
+ [38, -44],
756
+ [
757
+ 56,
758
+ -40,
759
+ "c"
760
+ ],
761
+ [50, -20],
762
+ [
763
+ 58,
764
+ -6,
765
+ "c"
766
+ ],
767
+ [48, 14],
768
+ [
769
+ 24,
770
+ 18,
771
+ "c"
772
+ ],
773
+ [
774
+ 12,
775
+ 26,
776
+ "c"
777
+ ],
778
+ [
779
+ 0,
780
+ 20,
781
+ "c"
782
+ ],
783
+ [
784
+ -12,
785
+ 26,
786
+ "c"
787
+ ],
788
+ [
789
+ -24,
790
+ 18,
791
+ "c"
792
+ ]
793
+ ]),
794
+ fill: "hair"
795
+ }],
796
+ top: 20
797
+ },
798
+ curly: {
799
+ back: [{
800
+ d: cloud(0, -8, 58, 54, 13, 6, 135),
801
+ fill: "hairShade"
802
+ }],
803
+ front: [{
804
+ d: scallop([
805
+ ...skull(9, 180, 360, 9),
806
+ [48, -6],
807
+ [40, -20],
808
+ [28, -28],
809
+ [14, -30],
810
+ [0, -29],
811
+ [-14, -30],
812
+ [-28, -28],
813
+ [-40, -20],
814
+ [-48, -6]
815
+ ], 4.5, true),
816
+ fill: "hair"
817
+ }, shine(44, 214, 238)],
818
+ rear: [{
819
+ d: cloud(0, -6, 58, 58, 15, 6, 0),
820
+ fill: "hair"
821
+ }],
822
+ top: 16
823
+ },
824
+ coily: {
825
+ front: [{
826
+ d: scallop([
827
+ ...skull(7, 178, 362, 14),
828
+ [46, -10],
829
+ [40, -22],
830
+ [30, -29],
831
+ [20, -31],
832
+ [10, -32],
833
+ [0, -32],
834
+ [-10, -32],
835
+ [-20, -31],
836
+ [-30, -29],
837
+ [-40, -22],
838
+ [-46, -10]
839
+ ], 2.6, true),
840
+ fill: "hair"
841
+ }, shine(42, 218, 240)],
842
+ rear: [{
843
+ d: scallop([
844
+ ...arc(0, -4, 53, 53, 160, 380, 18),
845
+ [44, 20],
846
+ [30, 24],
847
+ [15, 26],
848
+ [0, 27],
849
+ [-15, 26],
850
+ [-30, 24],
851
+ [-44, 20]
852
+ ], 2.6, true),
853
+ fill: "hair"
854
+ }],
855
+ top: 10
856
+ },
857
+ afro: {
858
+ back: [{
859
+ d: cloud(0, -16, 72, 64, 16, 6.5, 90),
860
+ fill: "hair"
861
+ }],
862
+ front: [
863
+ {
864
+ d: scallop([
865
+ ...skull(4, 186, 354, 6),
866
+ [44, -12],
867
+ [36, -24],
868
+ [24, -30],
869
+ [12, -31],
870
+ [0, -31],
871
+ [-12, -31],
872
+ [-24, -30],
873
+ [-36, -24],
874
+ [-44, -12]
875
+ ], 3.5, true),
876
+ fill: "hair",
877
+ stroke: "none"
878
+ },
879
+ {
880
+ d: scallop([
881
+ [44, -12],
882
+ [36, -24],
883
+ [24, -30],
884
+ [12, -31],
885
+ [0, -31],
886
+ [-12, -31],
887
+ [-24, -30],
888
+ [-36, -24],
889
+ [-44, -12]
890
+ ], 3.5, false, -1),
891
+ fill: "none",
892
+ line: true,
893
+ stroke: "hairInk",
894
+ sw: 3
895
+ },
896
+ shine(62, 214, 236)
897
+ ],
898
+ rear: [{
899
+ d: cloud(0, -16, 72, 64, 16, 6.5, 90),
900
+ fill: "hair"
901
+ }],
902
+ top: 30,
903
+ coversEars: true
904
+ },
905
+ bob: {
906
+ back: [{
907
+ d: blob([
908
+ [
909
+ -52,
910
+ 40,
911
+ "c"
912
+ ],
913
+ [-56, 6],
914
+ [-56, -28],
915
+ [-42, -52],
916
+ [0, -60],
917
+ [42, -52],
918
+ [56, -28],
919
+ [56, 6],
920
+ [
921
+ 52,
922
+ 40,
923
+ "c"
924
+ ]
925
+ ]),
926
+ fill: "hairShade"
927
+ }],
928
+ front: [{
929
+ d: blob([
930
+ [
931
+ -54,
932
+ 38,
933
+ "c"
934
+ ],
935
+ [-56, 4],
936
+ [-53, -28],
937
+ [-38, -51],
938
+ [0, -58],
939
+ [38, -51],
940
+ [53, -28],
941
+ [56, 4],
942
+ [
943
+ 54,
944
+ 38,
945
+ "c"
946
+ ],
947
+ [43, 36],
948
+ [41, 10],
949
+ [
950
+ 42,
951
+ -14,
952
+ "c"
953
+ ],
954
+ [30, -20],
955
+ [15, -19],
956
+ [0, -21],
957
+ [-15, -19],
958
+ [-30, -20],
959
+ [
960
+ -42,
961
+ -14,
962
+ "c"
963
+ ],
964
+ [-41, 10],
965
+ [-43, 36]
966
+ ]),
967
+ fill: "hair"
968
+ }, shine(46, 220, 246)],
969
+ rear: [{
970
+ d: blob([
971
+ [
972
+ -54,
973
+ 40,
974
+ "c"
975
+ ],
976
+ [-57, 4],
977
+ [-54, -28],
978
+ [-40, -52],
979
+ [0, -60],
980
+ [40, -52],
981
+ [54, -28],
982
+ [57, 4],
983
+ [
984
+ 54,
985
+ 40,
986
+ "c"
987
+ ],
988
+ [27, 44],
989
+ [0, 42],
990
+ [-27, 44]
991
+ ]),
992
+ fill: "hair"
993
+ }],
994
+ top: 10,
995
+ coversEars: true
996
+ },
997
+ long: {
998
+ back: [{
999
+ d: blob([
1000
+ [-50, -10],
1001
+ [-54, -36],
1002
+ [-36, -52],
1003
+ [0, -56],
1004
+ [36, -52],
1005
+ [54, -36],
1006
+ [50, -10],
1007
+ [56, 34],
1008
+ [
1009
+ 60,
1010
+ 74,
1011
+ "c"
1012
+ ],
1013
+ [30, 78],
1014
+ [0, 72],
1015
+ [-30, 78],
1016
+ [
1017
+ -60,
1018
+ 74,
1019
+ "c"
1020
+ ],
1021
+ [-56, 34]
1022
+ ]),
1023
+ fill: "hairShade"
1024
+ }],
1025
+ front: [{
1026
+ d: blob([
1027
+ [
1028
+ 0,
1029
+ -58,
1030
+ "c"
1031
+ ],
1032
+ [26, -55],
1033
+ [46, -40],
1034
+ [53, -12],
1035
+ [53, 30],
1036
+ [
1037
+ 52,
1038
+ 70,
1039
+ "c"
1040
+ ],
1041
+ [43, 62],
1042
+ [41, 30],
1043
+ [41, 0],
1044
+ [35, -20],
1045
+ [20, -31],
1046
+ [7, -38],
1047
+ [
1048
+ 0,
1049
+ -46,
1050
+ "c"
1051
+ ],
1052
+ [-7, -38],
1053
+ [-20, -31],
1054
+ [-35, -20],
1055
+ [-41, 0],
1056
+ [-41, 30],
1057
+ [-43, 62],
1058
+ [
1059
+ -52,
1060
+ 70,
1061
+ "c"
1062
+ ],
1063
+ [-53, 30],
1064
+ [-53, -12],
1065
+ [-46, -40],
1066
+ [-26, -55]
1067
+ ]),
1068
+ fill: "hair"
1069
+ }, shine(44, 220, 248)],
1070
+ rear: [{
1071
+ d: blob([
1072
+ [-52, -10],
1073
+ [-58, -40],
1074
+ [-40, -60],
1075
+ [0, -64],
1076
+ [40, -60],
1077
+ [58, -40],
1078
+ [52, -10],
1079
+ [56, 34],
1080
+ [
1081
+ 60,
1082
+ 74,
1083
+ "c"
1084
+ ],
1085
+ [30, 78],
1086
+ [0, 74],
1087
+ [-30, 78],
1088
+ [
1089
+ -60,
1090
+ 74,
1091
+ "c"
1092
+ ],
1093
+ [-56, 34]
1094
+ ]),
1095
+ fill: "hair"
1096
+ }, {
1097
+ d: blob([
1098
+ [0, -58],
1099
+ [0, -30],
1100
+ [2, 10]
1101
+ ], false),
1102
+ fill: "none",
1103
+ line: true,
1104
+ stroke: "hairShade",
1105
+ sw: 2.4
1106
+ }],
1107
+ top: 14,
1108
+ coversEars: true
1109
+ },
1110
+ ponytail: {
1111
+ back: [{
1112
+ d: blob([
1113
+ [18, -48],
1114
+ [44, -64],
1115
+ [66, -52],
1116
+ [72, -22],
1117
+ [66, 14],
1118
+ [
1119
+ 58,
1120
+ 44,
1121
+ "c"
1122
+ ],
1123
+ [52, 12],
1124
+ [48, -18],
1125
+ [34, -40]
1126
+ ]),
1127
+ fill: "hairShade"
1128
+ }],
1129
+ front: [
1130
+ {
1131
+ d: cap(4, smoothHairline),
1132
+ fill: "hair"
1133
+ },
1134
+ {
1135
+ d: blob([[34, -52], [40, -44]], false),
1136
+ fill: "none",
1137
+ line: true,
1138
+ stroke: "acc",
1139
+ sw: 7,
1140
+ cap: "round"
1141
+ },
1142
+ shine(42)
1143
+ ],
1144
+ rear: [
1145
+ {
1146
+ d: rearCap(4, 14),
1147
+ fill: "hair"
1148
+ },
1149
+ {
1150
+ d: blob([
1151
+ [0, -30],
1152
+ [14, -10],
1153
+ [12, 30],
1154
+ [
1155
+ 0,
1156
+ 62,
1157
+ "c"
1158
+ ],
1159
+ [-12, 30],
1160
+ [-14, -10]
1161
+ ]),
1162
+ fill: "hair"
1163
+ },
1164
+ {
1165
+ d: blob([[-7, -28], [7, -28]], false),
1166
+ fill: "none",
1167
+ line: true,
1168
+ stroke: "acc",
1169
+ sw: 7
1170
+ }
1171
+ ],
1172
+ top: 14
1173
+ },
1174
+ bun: {
1175
+ back: [{
1176
+ d: blob(arc(0, -60, 20, 18, 0, 345, 11)),
1177
+ fill: "hair"
1178
+ }, {
1179
+ d: blob(arc(0, -60, 12, 10, 200, 250, 2), false),
1180
+ fill: "none",
1181
+ line: true,
1182
+ stroke: "hairLight",
1183
+ sw: 3
1184
+ }],
1185
+ front: [
1186
+ {
1187
+ d: cap(4, smoothHairline),
1188
+ fill: "hair"
1189
+ },
1190
+ {
1191
+ d: blob([[0, -36], [-2, -48]], false),
1192
+ fill: "none",
1193
+ line: true,
1194
+ stroke: "hairShade",
1195
+ sw: 2.2
1196
+ },
1197
+ shine(42, 222, 246)
1198
+ ],
1199
+ rear: [{
1200
+ d: rearCap(4, 14),
1201
+ fill: "hair"
1202
+ }, {
1203
+ d: blob(arc(0, -52, 20, 18, 0, 345, 11)),
1204
+ fill: "hair"
1205
+ }],
1206
+ top: 30
1207
+ },
1208
+ puffs: {
1209
+ back: [{
1210
+ d: cloud(-46, -40, 20, 20, 9, 4, 20),
1211
+ fill: "hair"
1212
+ }, {
1213
+ d: cloud(46, -40, 20, 20, 9, 4, 0),
1214
+ fill: "hair"
1215
+ }],
1216
+ front: [
1217
+ {
1218
+ d: cap(4, smoothHairline),
1219
+ fill: "hair"
1220
+ },
1221
+ {
1222
+ d: blob([[0, -36], [0, -50]], false),
1223
+ fill: "none",
1224
+ line: true,
1225
+ stroke: "hairShade",
1226
+ sw: 2.2
1227
+ },
1228
+ {
1229
+ d: blob([[-36, -44], [-30, -52]], false),
1230
+ fill: "none",
1231
+ line: true,
1232
+ stroke: "acc",
1233
+ sw: 6
1234
+ },
1235
+ {
1236
+ d: blob([[36, -44], [30, -52]], false),
1237
+ fill: "none",
1238
+ line: true,
1239
+ stroke: "acc",
1240
+ sw: 6
1241
+ }
1242
+ ],
1243
+ rear: [
1244
+ {
1245
+ d: rearCap(4, 14),
1246
+ fill: "hair"
1247
+ },
1248
+ {
1249
+ d: cloud(-46, -40, 20, 20, 9, 4, 20),
1250
+ fill: "hair"
1251
+ },
1252
+ {
1253
+ d: cloud(46, -40, 20, 20, 9, 4, 0),
1254
+ fill: "hair"
1255
+ }
1256
+ ],
1257
+ top: 14
1258
+ },
1259
+ mohawk: {
1260
+ front: [{
1261
+ d: cap(2, [
1262
+ [46, -10],
1263
+ [40, -22],
1264
+ [26, -29],
1265
+ [0, -32],
1266
+ [-26, -29],
1267
+ [-40, -22],
1268
+ [-46, -10]
1269
+ ]),
1270
+ fill: "hairBuzz",
1271
+ clip: "head",
1272
+ stroke: "none",
1273
+ opacity: .55
1274
+ }, {
1275
+ d: blob([
1276
+ [-13, -28],
1277
+ [-18, -50],
1278
+ [
1279
+ -24,
1280
+ -72,
1281
+ "c"
1282
+ ],
1283
+ [-8, -62],
1284
+ [
1285
+ 0,
1286
+ -86,
1287
+ "c"
1288
+ ],
1289
+ [8, -62],
1290
+ [
1291
+ 24,
1292
+ -72,
1293
+ "c"
1294
+ ],
1295
+ [18, -50],
1296
+ [13, -28],
1297
+ [0, -32]
1298
+ ]),
1299
+ fill: "hair"
1300
+ }],
1301
+ rear: [{
1302
+ d: rearCap(2, 22),
1303
+ fill: "hairBuzz",
1304
+ clip: "head",
1305
+ stroke: "none",
1306
+ opacity: .55
1307
+ }, {
1308
+ d: blob([
1309
+ [-11, 18],
1310
+ [-13, -40],
1311
+ [
1312
+ -14,
1313
+ -60,
1314
+ "c"
1315
+ ],
1316
+ [-6, -54],
1317
+ [
1318
+ 0,
1319
+ -72,
1320
+ "c"
1321
+ ],
1322
+ [6, -54],
1323
+ [
1324
+ 14,
1325
+ -60,
1326
+ "c"
1327
+ ],
1328
+ [13, -40],
1329
+ [11, 18]
1330
+ ]),
1331
+ fill: "hair"
1332
+ }],
1333
+ top: 30
1334
+ },
1335
+ locs: {
1336
+ back: [{
1337
+ d: blob([
1338
+ [-50, -10],
1339
+ [-54, -36],
1340
+ [-36, -50],
1341
+ [0, -52],
1342
+ [36, -50],
1343
+ [54, -36],
1344
+ [50, -10],
1345
+ [56, 30],
1346
+ [
1347
+ 58,
1348
+ 62,
1349
+ "c"
1350
+ ],
1351
+ [0, 58],
1352
+ [
1353
+ -58,
1354
+ 62,
1355
+ "c"
1356
+ ],
1357
+ [-56, 30]
1358
+ ]),
1359
+ fill: "hairShade"
1360
+ }, ...[
1361
+ -44,
1362
+ -30,
1363
+ 30,
1364
+ 44
1365
+ ].flatMap((at) => strand([
1366
+ [at, 0],
1367
+ [at * 1.12, 30],
1368
+ [at * 1.12, 60]
1369
+ ], 7, "hairShade"))],
1370
+ front: [
1371
+ {
1372
+ d: cap(6, [
1373
+ [46, -2],
1374
+ [42, -20],
1375
+ [28, -30],
1376
+ [14, -26],
1377
+ [0, -32],
1378
+ [-14, -26],
1379
+ [-28, -30],
1380
+ [-42, -20],
1381
+ [-46, -2]
1382
+ ]),
1383
+ fill: "hair"
1384
+ },
1385
+ ...strand([
1386
+ [-46, -10],
1387
+ [-50, 14],
1388
+ [-50, 40]
1389
+ ], 8),
1390
+ ...strand([
1391
+ [46, -10],
1392
+ [50, 14],
1393
+ [50, 40]
1394
+ ], 8),
1395
+ ...strand([
1396
+ [-38, -14],
1397
+ [-41, 8],
1398
+ [-41, 24]
1399
+ ], 7),
1400
+ ...strand([
1401
+ [38, -14],
1402
+ [41, 8],
1403
+ [41, 24]
1404
+ ], 7),
1405
+ shine(44)
1406
+ ],
1407
+ rear: [{
1408
+ d: rearCap(6, 10),
1409
+ fill: "hair"
1410
+ }, ...[
1411
+ -40,
1412
+ -27,
1413
+ -14,
1414
+ 0,
1415
+ 14,
1416
+ 27,
1417
+ 40
1418
+ ].flatMap((at) => strand([
1419
+ [at * 1.05, -6],
1420
+ [at * 1.12, 26],
1421
+ [at * 1.12, 60]
1422
+ ], 9))],
1423
+ top: 8,
1424
+ coversEars: true
1425
+ },
1426
+ braids: {
1427
+ back: [{
1428
+ d: blob([
1429
+ [-50, -10],
1430
+ [-54, -36],
1431
+ [-36, -50],
1432
+ [0, -52],
1433
+ [36, -50],
1434
+ [54, -36],
1435
+ [50, -10],
1436
+ [54, 30],
1437
+ [
1438
+ 54,
1439
+ 70,
1440
+ "c"
1441
+ ],
1442
+ [0, 64],
1443
+ [
1444
+ -54,
1445
+ 70,
1446
+ "c"
1447
+ ],
1448
+ [-54, 30]
1449
+ ]),
1450
+ fill: "hairShade"
1451
+ }, ...[
1452
+ -46,
1453
+ -34,
1454
+ 34,
1455
+ 46
1456
+ ].flatMap((at) => strand([[at, 0], [at * 1.08, 70]], 6, "hairShade"))],
1457
+ front: [
1458
+ {
1459
+ d: cap(4, [
1460
+ [45, -6],
1461
+ [36, -24],
1462
+ [22, -30],
1463
+ [0, -34],
1464
+ [-22, -30],
1465
+ [-36, -24],
1466
+ [-45, -6]
1467
+ ]),
1468
+ fill: "hair"
1469
+ },
1470
+ {
1471
+ d: blob([[0, -34], [0, -52]], false),
1472
+ fill: "none",
1473
+ line: true,
1474
+ stroke: "hairShade",
1475
+ sw: 2.2
1476
+ },
1477
+ ...[
1478
+ -20,
1479
+ -10,
1480
+ 10,
1481
+ 20
1482
+ ].map((at) => ({
1483
+ d: blob([[at, -32], [at * 1.5, -52]], false),
1484
+ fill: "none",
1485
+ line: true,
1486
+ stroke: "hairShade",
1487
+ sw: 1.8
1488
+ })),
1489
+ ...strand([
1490
+ [-46, -8],
1491
+ [-50, 30],
1492
+ [-50, 66]
1493
+ ], 6),
1494
+ ...strand([
1495
+ [46, -8],
1496
+ [50, 30],
1497
+ [50, 66]
1498
+ ], 6),
1499
+ {
1500
+ d: blob([[-54, 60], [-46, 60]], false),
1501
+ fill: "none",
1502
+ line: true,
1503
+ stroke: "acc",
1504
+ sw: 4,
1505
+ cap: "butt"
1506
+ },
1507
+ {
1508
+ d: blob([[46, 60], [54, 60]], false),
1509
+ fill: "none",
1510
+ line: true,
1511
+ stroke: "acc",
1512
+ sw: 4,
1513
+ cap: "butt"
1514
+ }
1515
+ ],
1516
+ rear: [{
1517
+ d: rearCap(4, 10),
1518
+ fill: "hair"
1519
+ }, ...[
1520
+ -36,
1521
+ -24,
1522
+ -12,
1523
+ 0,
1524
+ 12,
1525
+ 24,
1526
+ 36
1527
+ ].flatMap((at) => strand([
1528
+ [at * 1.05, -10],
1529
+ [at * 1.08, 30],
1530
+ [at * 1.08, 66]
1531
+ ], 6.5))],
1532
+ top: 6,
1533
+ coversEars: true
1534
+ }
1535
+ },
1536
+ beard: BEARD_ART,
1537
+ glasses: GLASSES_ART,
1538
+ headwear: {
1539
+ hijab: {
1540
+ back: [{
1541
+ d: blob([
1542
+ [-54, -10],
1543
+ [-56, -40],
1544
+ [-36, -60],
1545
+ [0, -64],
1546
+ [36, -60],
1547
+ [56, -40],
1548
+ [54, -10],
1549
+ [58, 30],
1550
+ [
1551
+ 62,
1552
+ 66,
1553
+ "c"
1554
+ ],
1555
+ [30, 74],
1556
+ [0, 72],
1557
+ [-30, 74],
1558
+ [
1559
+ -62,
1560
+ 66,
1561
+ "c"
1562
+ ],
1563
+ [-58, 30]
1564
+ ]),
1565
+ fill: "accShade"
1566
+ }],
1567
+ front: [
1568
+ {
1569
+ d: blob([
1570
+ [-55, -8],
1571
+ [-55, -38],
1572
+ [-36, -58],
1573
+ [0, -62],
1574
+ [36, -58],
1575
+ [55, -38],
1576
+ [55, -8],
1577
+ [54, 28],
1578
+ [44, 56],
1579
+ [20, 66],
1580
+ [0, 66],
1581
+ [-20, 66],
1582
+ [-44, 56],
1583
+ [-54, 28]
1584
+ ]).add(blob([
1585
+ [0, -38],
1586
+ [24, -34],
1587
+ [37, -14],
1588
+ [38, 14],
1589
+ [30, 38],
1590
+ [14, 52],
1591
+ [0, 54],
1592
+ [-14, 52],
1593
+ [-30, 38],
1594
+ [-38, 14],
1595
+ [-37, -14],
1596
+ [-24, -34]
1597
+ ])),
1598
+ fill: "acc",
1599
+ evenOdd: true
1600
+ },
1601
+ {
1602
+ d: blob([
1603
+ [-30, 60],
1604
+ [-12, 52],
1605
+ [8, 58]
1606
+ ], false),
1607
+ fill: "none",
1608
+ line: true,
1609
+ stroke: "accShade",
1610
+ sw: 2.4
1611
+ },
1612
+ {
1613
+ d: blob([
1614
+ [-49, -6],
1615
+ [-46, -30],
1616
+ [-30, -48]
1617
+ ], false),
1618
+ fill: "none",
1619
+ line: true,
1620
+ stroke: "accLight",
1621
+ sw: 3,
1622
+ opacity: .8
1623
+ }
1624
+ ],
1625
+ rear: [{
1626
+ d: blob([
1627
+ [-54, -10],
1628
+ [-56, -40],
1629
+ [-36, -60],
1630
+ [0, -64],
1631
+ [36, -60],
1632
+ [56, -40],
1633
+ [54, -10],
1634
+ [58, 30],
1635
+ [
1636
+ 62,
1637
+ 66,
1638
+ "c"
1639
+ ],
1640
+ [30, 74],
1641
+ [0, 72],
1642
+ [-30, 74],
1643
+ [
1644
+ -62,
1645
+ 66,
1646
+ "c"
1647
+ ],
1648
+ [-58, 30]
1649
+ ]),
1650
+ fill: "acc"
1651
+ }, {
1652
+ d: blob([
1653
+ [-20, 20],
1654
+ [0, 30],
1655
+ [22, 22]
1656
+ ], false),
1657
+ fill: "none",
1658
+ line: true,
1659
+ stroke: "accShade",
1660
+ sw: 2.4
1661
+ }],
1662
+ hides: "all",
1663
+ hidesEars: true,
1664
+ top: 14
1665
+ },
1666
+ headwrap: {
1667
+ back: [{
1668
+ d: blob([
1669
+ [-12, -56],
1670
+ [-34, -80],
1671
+ [-14, -88],
1672
+ [0, -64]
1673
+ ]),
1674
+ fill: "accShade"
1675
+ }, {
1676
+ d: blob([
1677
+ [12, -56],
1678
+ [34, -82],
1679
+ [14, -90],
1680
+ [0, -64]
1681
+ ]),
1682
+ fill: "accShade"
1683
+ }],
1684
+ front: [
1685
+ {
1686
+ d: blob([
1687
+ [-49, -12],
1688
+ [-54, -38],
1689
+ [-38, -62],
1690
+ [0, -70],
1691
+ [38, -62],
1692
+ [54, -38],
1693
+ [49, -12],
1694
+ [36, -24],
1695
+ [18, -30],
1696
+ [0, -31],
1697
+ [-18, -30],
1698
+ [-36, -24]
1699
+ ]),
1700
+ fill: "acc"
1701
+ },
1702
+ {
1703
+ d: blob([
1704
+ [-44, -22],
1705
+ [-14, -48],
1706
+ [10, -64]
1707
+ ], false),
1708
+ fill: "none",
1709
+ line: true,
1710
+ stroke: "accShade",
1711
+ sw: 2.4
1712
+ },
1713
+ {
1714
+ d: blob([
1715
+ [44, -22],
1716
+ [20, -44],
1717
+ [2, -50]
1718
+ ], false),
1719
+ fill: "none",
1720
+ line: true,
1721
+ stroke: "accShade",
1722
+ sw: 2.4
1723
+ },
1724
+ {
1725
+ d: blob(arc(0, -64, 9, 7, 0, 330, 11)),
1726
+ fill: "acc"
1727
+ }
1728
+ ],
1729
+ rear: [
1730
+ {
1731
+ d: blob([
1732
+ [-49, 4],
1733
+ [-56, -30],
1734
+ [-40, -60],
1735
+ [0, -70],
1736
+ [40, -60],
1737
+ [56, -30],
1738
+ [49, 4],
1739
+ [24, 0],
1740
+ [0, -2],
1741
+ [-24, 0]
1742
+ ]),
1743
+ fill: "acc"
1744
+ },
1745
+ {
1746
+ d: blob([
1747
+ [-40, -8],
1748
+ [-6, -44],
1749
+ [16, -64]
1750
+ ], false),
1751
+ fill: "none",
1752
+ line: true,
1753
+ stroke: "accShade",
1754
+ sw: 2.4
1755
+ },
1756
+ {
1757
+ d: blob(arc(0, -64, 9, 7, 0, 330, 11)),
1758
+ fill: "acc"
1759
+ }
1760
+ ],
1761
+ hides: "all",
1762
+ top: 36
1763
+ },
1764
+ beanie: {
1765
+ front: [
1766
+ {
1767
+ d: blob([
1768
+ [
1769
+ -50,
1770
+ -22,
1771
+ "c"
1772
+ ],
1773
+ [-50, -40],
1774
+ [-34, -60],
1775
+ [0, -66],
1776
+ [34, -60],
1777
+ [50, -40],
1778
+ [
1779
+ 50,
1780
+ -22,
1781
+ "c"
1782
+ ]
1783
+ ]),
1784
+ fill: "acc"
1785
+ },
1786
+ {
1787
+ d: roundedRect(-52, -30, 104, 15, 6),
1788
+ fill: "accShade"
1789
+ },
1790
+ ...[
1791
+ -36,
1792
+ -18,
1793
+ 0,
1794
+ 18,
1795
+ 36
1796
+ ].map((at) => ({
1797
+ d: blob([[at, -27], [at, -18]], false),
1798
+ fill: "none",
1799
+ line: true,
1800
+ stroke: "acc",
1801
+ sw: 2.4
1802
+ })),
1803
+ {
1804
+ d: blob(arc(0, -70, 10, 9, 0, 330, 11)),
1805
+ fill: "accLight"
1806
+ }
1807
+ ],
1808
+ rear: [
1809
+ {
1810
+ d: blob([
1811
+ [
1812
+ -50,
1813
+ -22,
1814
+ "c"
1815
+ ],
1816
+ [-50, -40],
1817
+ [-34, -60],
1818
+ [0, -66],
1819
+ [34, -60],
1820
+ [50, -40],
1821
+ [
1822
+ 50,
1823
+ -22,
1824
+ "c"
1825
+ ]
1826
+ ]),
1827
+ fill: "acc"
1828
+ },
1829
+ {
1830
+ d: roundedRect(-52, -30, 104, 15, 6),
1831
+ fill: "accShade"
1832
+ },
1833
+ {
1834
+ d: blob(arc(0, -70, 10, 9, 0, 330, 11)),
1835
+ fill: "accLight"
1836
+ }
1837
+ ],
1838
+ hides: -24,
1839
+ top: 28
1840
+ },
1841
+ cap: {
1842
+ front: [
1843
+ {
1844
+ d: blob([
1845
+ [
1846
+ -49,
1847
+ -22,
1848
+ "c"
1849
+ ],
1850
+ [-48, -42],
1851
+ [-30, -60],
1852
+ [0, -64],
1853
+ [30, -60],
1854
+ [48, -42],
1855
+ [
1856
+ 49,
1857
+ -22,
1858
+ "c"
1859
+ ],
1860
+ [0, -26]
1861
+ ]),
1862
+ fill: "acc"
1863
+ },
1864
+ {
1865
+ d: blob([
1866
+ [-6, -63],
1867
+ [-4, -40],
1868
+ [0, -27]
1869
+ ], false),
1870
+ fill: "none",
1871
+ line: true,
1872
+ stroke: "accShade",
1873
+ sw: 2.2
1874
+ },
1875
+ {
1876
+ d: blob([
1877
+ [
1878
+ -46,
1879
+ -24,
1880
+ "c"
1881
+ ],
1882
+ [-24, -21],
1883
+ [0, -20],
1884
+ [24, -21],
1885
+ [
1886
+ 46,
1887
+ -24,
1888
+ "c"
1889
+ ],
1890
+ [40, -14],
1891
+ [20, -6],
1892
+ [0, -4],
1893
+ [-20, -6],
1894
+ [-40, -14]
1895
+ ]),
1896
+ fill: "accShade"
1897
+ },
1898
+ {
1899
+ d: blob(arc(0, -63, 4, 3, 0, 330, 7)),
1900
+ fill: "accShade"
1901
+ }
1902
+ ],
1903
+ rear: [{
1904
+ d: blob([
1905
+ [
1906
+ -49,
1907
+ -18,
1908
+ "c"
1909
+ ],
1910
+ [-48, -42],
1911
+ [-30, -60],
1912
+ [0, -64],
1913
+ [30, -60],
1914
+ [48, -42],
1915
+ [
1916
+ 49,
1917
+ -18,
1918
+ "c"
1919
+ ],
1920
+ [12, -20],
1921
+ [
1922
+ 12,
1923
+ -30,
1924
+ "c"
1925
+ ],
1926
+ [
1927
+ -12,
1928
+ -30,
1929
+ "c"
1930
+ ],
1931
+ [-12, -20]
1932
+ ]),
1933
+ fill: "acc"
1934
+ }, {
1935
+ d: roundedRect(-12, -26, 24, 5, 2),
1936
+ fill: "accShade"
1937
+ }],
1938
+ hides: -22,
1939
+ top: 18
1940
+ }
1941
+ }
1942
+ };
1943
+ //#endregion
1944
+ export { ART };
1945
+
1946
+ //# sourceMappingURL=art.js.map