@dotcraft/avatar 0.6.3

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 (127) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +43 -0
  3. package/dist/AnimatedDecoration.d.ts +10 -0
  4. package/dist/AnimatedDecoration.d.ts.map +1 -0
  5. package/dist/AnimatedDecoration.js +43 -0
  6. package/dist/AnimatedDecoration.js.map +1 -0
  7. package/dist/AppearanceRig.d.ts +12 -0
  8. package/dist/AppearanceRig.d.ts.map +1 -0
  9. package/dist/AppearanceRig.js +9 -0
  10. package/dist/AppearanceRig.js.map +1 -0
  11. package/dist/Avatar.d.ts +22 -0
  12. package/dist/Avatar.d.ts.map +1 -0
  13. package/dist/Avatar.js +71 -0
  14. package/dist/Avatar.js.map +1 -0
  15. package/dist/DecorationShapes.d.ts +10 -0
  16. package/dist/DecorationShapes.d.ts.map +1 -0
  17. package/dist/DecorationShapes.js +8 -0
  18. package/dist/DecorationShapes.js.map +1 -0
  19. package/dist/Decorations.d.ts +15 -0
  20. package/dist/Decorations.d.ts.map +1 -0
  21. package/dist/Decorations.js +26 -0
  22. package/dist/Decorations.js.map +1 -0
  23. package/dist/Faces.d.ts +7 -0
  24. package/dist/Faces.d.ts.map +1 -0
  25. package/dist/Faces.js +8 -0
  26. package/dist/Faces.js.map +1 -0
  27. package/dist/HatDecorations.d.ts +5 -0
  28. package/dist/HatDecorations.d.ts.map +1 -0
  29. package/dist/HatDecorations.js +20 -0
  30. package/dist/HatDecorations.js.map +1 -0
  31. package/dist/HeldDecorations.d.ts +5 -0
  32. package/dist/HeldDecorations.d.ts.map +1 -0
  33. package/dist/HeldDecorations.js +5 -0
  34. package/dist/HeldDecorations.js.map +1 -0
  35. package/dist/MascotRig.d.ts +25 -0
  36. package/dist/MascotRig.d.ts.map +1 -0
  37. package/dist/MascotRig.js +58 -0
  38. package/dist/MascotRig.js.map +1 -0
  39. package/dist/ObjectDecorations.d.ts +5 -0
  40. package/dist/ObjectDecorations.d.ts.map +1 -0
  41. package/dist/ObjectDecorations.js +16 -0
  42. package/dist/ObjectDecorations.js.map +1 -0
  43. package/dist/accessories.css +14 -0
  44. package/dist/appearanceModel.d.ts +28 -0
  45. package/dist/appearanceModel.d.ts.map +1 -0
  46. package/dist/appearanceModel.js +58 -0
  47. package/dist/appearanceModel.js.map +1 -0
  48. package/dist/avatar.css +62 -0
  49. package/dist/characters.d.ts +6 -0
  50. package/dist/characters.d.ts.map +1 -0
  51. package/dist/characters.js +2 -0
  52. package/dist/characters.js.map +1 -0
  53. package/dist/composer/ComposerMascot.d.ts +3 -0
  54. package/dist/composer/ComposerMascot.d.ts.map +1 -0
  55. package/dist/composer/ComposerMascot.js +433 -0
  56. package/dist/composer/ComposerMascot.js.map +1 -0
  57. package/dist/composer/ComposerMascotShadow.d.ts +4 -0
  58. package/dist/composer/ComposerMascotShadow.d.ts.map +1 -0
  59. package/dist/composer/ComposerMascotShadow.js +7 -0
  60. package/dist/composer/ComposerMascotShadow.js.map +1 -0
  61. package/dist/composer/constants.d.ts +32 -0
  62. package/dist/composer/constants.d.ts.map +1 -0
  63. package/dist/composer/constants.js +50 -0
  64. package/dist/composer/constants.js.map +1 -0
  65. package/dist/composer/mascotHandoff.d.ts +3 -0
  66. package/dist/composer/mascotHandoff.d.ts.map +1 -0
  67. package/dist/composer/mascotHandoff.js +15 -0
  68. package/dist/composer/mascotHandoff.js.map +1 -0
  69. package/dist/composer/styles/energy.css +99 -0
  70. package/dist/composer/styles/expressions.css +20 -0
  71. package/dist/composer/styles/feedback.css +188 -0
  72. package/dist/composer/styles/focus.css +72 -0
  73. package/dist/composer/styles/foundation.css +287 -0
  74. package/dist/composer/styles/idle.css +438 -0
  75. package/dist/composer/styles/overdrive.css +264 -0
  76. package/dist/composer/styles/props.css +21 -0
  77. package/dist/composer/types.d.ts +40 -0
  78. package/dist/composer/types.d.ts.map +1 -0
  79. package/dist/composer/types.js +2 -0
  80. package/dist/composer/types.js.map +1 -0
  81. package/dist/composer/useComposerAvatarBehavior.d.ts +24 -0
  82. package/dist/composer/useComposerAvatarBehavior.d.ts.map +1 -0
  83. package/dist/composer/useComposerAvatarBehavior.js +72 -0
  84. package/dist/composer/useComposerAvatarBehavior.js.map +1 -0
  85. package/dist/composer/useComposerMotion.d.ts +2 -0
  86. package/dist/composer/useComposerMotion.d.ts.map +1 -0
  87. package/dist/composer/useComposerMotion.js +16 -0
  88. package/dist/composer/useComposerMotion.js.map +1 -0
  89. package/dist/composer/useComposerProfile.d.ts +7 -0
  90. package/dist/composer/useComposerProfile.d.ts.map +1 -0
  91. package/dist/composer/useComposerProfile.js +46 -0
  92. package/dist/composer/useComposerProfile.js.map +1 -0
  93. package/dist/decorationCatalog.d.ts +14 -0
  94. package/dist/decorationCatalog.d.ts.map +1 -0
  95. package/dist/decorationCatalog.js +37 -0
  96. package/dist/decorationCatalog.js.map +1 -0
  97. package/dist/decorationMotion.d.ts +35 -0
  98. package/dist/decorationMotion.d.ts.map +1 -0
  99. package/dist/decorationMotion.js +73 -0
  100. package/dist/decorationMotion.js.map +1 -0
  101. package/dist/environment.d.ts +6 -0
  102. package/dist/environment.d.ts.map +1 -0
  103. package/dist/environment.js +48 -0
  104. package/dist/environment.js.map +1 -0
  105. package/dist/index.d.ts +6 -0
  106. package/dist/index.d.ts.map +1 -0
  107. package/dist/index.js +6 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/palette.d.ts +26 -0
  110. package/dist/palette.d.ts.map +1 -0
  111. package/dist/palette.js +35 -0
  112. package/dist/palette.js.map +1 -0
  113. package/dist/react.d.ts +6 -0
  114. package/dist/react.d.ts.map +1 -0
  115. package/dist/react.js +5 -0
  116. package/dist/react.js.map +1 -0
  117. package/dist/rig.css +265 -0
  118. package/dist/styles.css +13 -0
  119. package/dist/useEventReplay.d.ts +3 -0
  120. package/dist/useEventReplay.d.ts.map +1 -0
  121. package/dist/useEventReplay.js +15 -0
  122. package/dist/useEventReplay.js.map +1 -0
  123. package/dist/useGesture.d.ts +4 -0
  124. package/dist/useGesture.d.ts.map +1 -0
  125. package/dist/useGesture.js +59 -0
  126. package/dist/useGesture.js.map +1 -0
  127. package/package.json +55 -0
@@ -0,0 +1,264 @@
1
+ [data-mascot-context='max'] .composer-mascot-motion {
2
+ --mascot-max-edge: oklch(from var(--mascot-energy-accent)
3
+ clamp(0.28, calc(l + 0.065), 0.96) clamp(0, calc(c * 0.96), 0.3) calc(h + 4));
4
+ --mascot-max-shift: oklch(from var(--mascot-energy-accent)
5
+ clamp(0.28, calc(l + 0.1), 0.96) clamp(0, calc(c * 0.92), 0.3) calc(h + 40));
6
+ --mascot-max-bright: oklch(from var(--mascot-energy-accent)
7
+ clamp(0.28, calc(l + 0.18), 0.96) clamp(0, calc(c * 0.68), 0.3) calc(h + 18));
8
+ --mascot-max-edge-bold: rgb(from var(--mascot-max-edge) r g b / 1);
9
+ --mascot-max-edge-faint: rgb(from var(--mascot-max-edge) r g b / 0.24);
10
+ --mascot-max-shift-bold: rgb(from var(--mascot-max-shift) r g b / 1);
11
+ --mascot-max-shift-medium: rgb(from var(--mascot-max-shift) r g b / 0.88);
12
+ --mascot-max-shift-soft: rgb(from var(--mascot-max-shift) r g b / 0.44);
13
+ --mascot-max-bright-medium: rgb(from var(--mascot-max-bright) r g b / 0.88);
14
+ --mascot-max-blur-hair: 1.4px;
15
+ --mascot-max-blur-edge: 2.4px;
16
+ --mascot-max-blur-glow: 6.8px;
17
+ }
18
+
19
+ .composer-mascot-motion::after {
20
+ content: '';
21
+ position: absolute;
22
+ top: 50%;
23
+ left: 50%;
24
+ z-index: 3;
25
+ width: 104px;
26
+ height: 90px;
27
+ border-radius: 48%;
28
+ opacity: 0;
29
+ pointer-events: none;
30
+ transform: translate(-50%, -50%);
31
+ transform-origin: center;
32
+ }
33
+
34
+ [data-mascot-context='max'] .composer-mascot-motion::after {
35
+ background:
36
+ radial-gradient(circle, var(--mascot-max-bright) 0 0.55px, transparent 1.1px) 13% 42% / 3px 3px no-repeat,
37
+ radial-gradient(circle, var(--mascot-max-edge) 0 0.45px, transparent 1px) 27% 74% / 3px 3px no-repeat,
38
+ radial-gradient(circle, var(--mascot-max-shift) 0 0.5px, transparent 1.05px) 42% 18% / 3px 3px no-repeat,
39
+ radial-gradient(circle, var(--mascot-max-bright) 0 0.45px, transparent 1px) 68% 80% / 3px 3px no-repeat,
40
+ radial-gradient(circle, var(--mascot-max-edge) 0 0.55px, transparent 1.1px) 82% 28% / 3px 3px no-repeat,
41
+ radial-gradient(circle, var(--mascot-max-shift) 0 0.4px, transparent 0.95px) 91% 62% / 3px 3px no-repeat;
42
+ filter: drop-shadow(0 0 1.6px color-mix(in srgb, var(--mascot-max-edge) 32%, transparent));
43
+ opacity: 0.18;
44
+ animation: composer-mascot-max-micrograin 6.2s ease-in-out infinite;
45
+ }
46
+
47
+ @keyframes composer-mascot-max-overdrive-edge {
48
+ 0%, 100% {
49
+ filter:
50
+ drop-shadow(-0.6px 0 var(--mascot-max-blur-hair) var(--mascot-max-edge-bold))
51
+ drop-shadow(0.7px 0 var(--mascot-max-blur-edge) var(--mascot-max-shift-medium))
52
+ drop-shadow(0 0 var(--mascot-max-blur-glow) var(--mascot-max-edge-faint));
53
+ }
54
+ 46% {
55
+ filter:
56
+ drop-shadow(0.2px -0.75px var(--mascot-max-blur-hair) var(--mascot-max-shift-bold))
57
+ drop-shadow(-0.2px 0.8px var(--mascot-max-blur-edge) var(--mascot-max-bright-medium))
58
+ drop-shadow(0 0 var(--mascot-max-blur-glow) var(--mascot-max-shift-soft));
59
+ }
60
+ }
61
+
62
+ @keyframes composer-mascot-max-coat-dark {
63
+ 0%, 34%, 100% { stop-color: var(--mascot-body-dark); }
64
+ 14% {
65
+ stop-color: oklch(from var(--mascot-body-dark)
66
+ clamp(0.28, calc(l + 0.09), 0.96) clamp(0, calc(c * 0.9), 0.3) calc(h + 14));
67
+ }
68
+ }
69
+
70
+ @keyframes composer-mascot-max-coat-mid {
71
+ 0%, 24%, 68%, 100% { stop-color: var(--mascot-body-mid); }
72
+ 44% {
73
+ stop-color: oklch(from var(--mascot-body-mid)
74
+ clamp(0.28, calc(l + 0.14), 0.96) clamp(0, calc(c * 0.76), 0.3) calc(h + 31));
75
+ }
76
+ }
77
+
78
+ @keyframes composer-mascot-max-coat-light {
79
+ 0%, 50%, 94%, 100% { stop-color: var(--mascot-body-light); }
80
+ 72% {
81
+ stop-color: oklch(from var(--mascot-body-light)
82
+ clamp(0.28, calc(l + 0.15), 0.96) clamp(0, calc(c * 0.58), 0.3) calc(h + 41));
83
+ }
84
+ }
85
+
86
+ @keyframes composer-mascot-max-coat-mark-dark {
87
+ 0%, 44%, 100% { stop-color: var(--mascot-mark-dark); }
88
+ 20% {
89
+ stop-color: oklch(from var(--mascot-mark-dark)
90
+ clamp(0.28, calc(l + 0.1), 0.96) clamp(0, calc(c * 0.82), 0.3) calc(h + 18));
91
+ }
92
+ }
93
+
94
+ @keyframes composer-mascot-max-coat-mark-light {
95
+ 0%, 40%, 88%, 100% { stop-color: var(--mascot-mark-energy); }
96
+ 64% {
97
+ stop-color: oklch(from var(--mascot-mark-energy)
98
+ clamp(0.28, calc(l + 0.15), 0.96) clamp(0, calc(c * 0.6), 0.3) calc(h + 38));
99
+ }
100
+ }
101
+
102
+ @keyframes composer-mascot-max-micrograin {
103
+ 0%, 100% { opacity: 0.08; transform: translate(-51%, -49%) scale(0.98); }
104
+ 38% { opacity: 0.28; transform: translate(-49%, -52%) scale(1.02); }
105
+ 68% { opacity: 0.13; transform: translate(-48%, -54%) scale(1.04); }
106
+ }
107
+
108
+ [data-mascot-profile-transition='active'] .composer-mascot-character-stage {
109
+ transform-origin: 50% 52%;
110
+ animation: composer-mascot-profile-character 1.24s linear both;
111
+ }
112
+
113
+ [data-mascot-profile-transition='active'] .composer-mascot-motion::before {
114
+ content: '';
115
+ position: absolute;
116
+ top: 52%;
117
+ left: 50%;
118
+ z-index: 1;
119
+ width: 64px;
120
+ height: 64px;
121
+ box-sizing: border-box;
122
+ border: 1px solid transparent;
123
+ border-radius: 50%;
124
+ background: radial-gradient(
125
+ circle,
126
+ #010106 0 34%,
127
+ #05050c 38%,
128
+ rgba(232, 236, 255, 0.78) 42%,
129
+ rgba(135, 145, 180, 0.18) 48%,
130
+ transparent 66%
131
+ );
132
+ opacity: 0;
133
+ pointer-events: none;
134
+ transform: translate(-50%, -50%) scale(0.16);
135
+ transform-origin: center;
136
+ animation:
137
+ composer-mascot-profile-hole 1.24s linear both,
138
+ composer-mascot-profile-rim 1.24s linear both;
139
+ }
140
+
141
+ [data-mascot-profile-transition='active'] .composer-mascot-motion::after {
142
+ top: 52%;
143
+ left: 50%;
144
+ z-index: 1;
145
+ width: 86px;
146
+ height: 86px;
147
+ border-radius: 50%;
148
+ color: var(--mascot-profile-from-accent);
149
+ background:
150
+ radial-gradient(circle, currentColor 0 0.9px, transparent 1.55px) 50% 2% / 4px 4px no-repeat,
151
+ radial-gradient(circle, currentColor 0 0.76px, transparent 1.4px) 78% 12% / 4px 4px no-repeat,
152
+ radial-gradient(circle, rgba(255, 255, 255, 0.88) 0 0.65px, transparent 1.3px) 96% 42% / 4px 4px no-repeat,
153
+ radial-gradient(circle, currentColor 0 0.82px, transparent 1.48px) 88% 76% / 4px 4px no-repeat,
154
+ radial-gradient(circle, currentColor 0 0.9px, transparent 1.55px) 55% 98% / 4px 4px no-repeat,
155
+ radial-gradient(circle, rgba(255, 255, 255, 0.8) 0 0.65px, transparent 1.3px) 19% 86% / 4px 4px no-repeat,
156
+ radial-gradient(circle, currentColor 0 0.76px, transparent 1.4px) 3% 55% / 4px 4px no-repeat,
157
+ radial-gradient(circle, currentColor 0 0.82px, transparent 1.48px) 14% 20% / 4px 4px no-repeat;
158
+ filter: drop-shadow(0 0 3px currentColor);
159
+ opacity: 0;
160
+ animation:
161
+ composer-mascot-profile-particles 1.24s linear both,
162
+ composer-mascot-profile-particle-color 1.24s linear both;
163
+ }
164
+
165
+ [data-composer-root]:has([data-mascot-profile-transition='active']) .composer-mascot-contact-shadow {
166
+ animation: composer-mascot-profile-contact-shadow 1.24s linear both;
167
+ }
168
+
169
+ @keyframes composer-mascot-profile-character {
170
+ 0%, 100% {
171
+ opacity: 1;
172
+ transform: translateY(0) rotate(0) scale(1);
173
+ filter: none;
174
+ }
175
+ 18% {
176
+ opacity: 1;
177
+ transform: translateY(0) rotate(0) scale(1.015, 0.99);
178
+ filter: saturate(1.03);
179
+ }
180
+ 34% {
181
+ opacity: 0.96;
182
+ transform: translateY(0) rotate(1.2deg) scale(0.76, 0.8);
183
+ filter: brightness(0.96) saturate(1.08);
184
+ }
185
+ 46% {
186
+ opacity: 0.14;
187
+ transform: translateY(0) rotate(-4deg) scale(0.13);
188
+ filter: brightness(0.72) saturate(1.18) blur(0.7px);
189
+ }
190
+ 48%, 52% {
191
+ opacity: 0;
192
+ transform: translateY(0) rotate(-6deg) scale(0.02);
193
+ filter: brightness(0.58) saturate(1.2) blur(1px);
194
+ }
195
+ 64% {
196
+ opacity: 0.95;
197
+ transform: translateY(0) rotate(1.8deg) scale(1.1, 0.92);
198
+ filter: brightness(1.12);
199
+ }
200
+ 76% {
201
+ opacity: 1;
202
+ transform: translateY(0) rotate(-0.8deg) scale(0.97, 1.035);
203
+ filter: none;
204
+ }
205
+ 89% {
206
+ opacity: 1;
207
+ transform: translateY(0) rotate(0.3deg) scale(1.01, 0.995);
208
+ filter: none;
209
+ }
210
+ }
211
+
212
+ @keyframes composer-mascot-profile-hole {
213
+ 0%, 12%, 100% { opacity: 0; transform: translate(-50%, -50%) scale(0.16); }
214
+ 30% { opacity: 0.72; transform: translate(-50%, -50%) scale(0.72); }
215
+ 46%, 54% { opacity: 1; transform: translate(-50%, -50%) scale(1); }
216
+ 72% { opacity: 0.54; transform: translate(-50%, -50%) scale(0.66); }
217
+ 88% { opacity: 0; transform: translate(-50%, -50%) scale(0.2); }
218
+ }
219
+
220
+ @keyframes composer-mascot-profile-particles {
221
+ 0%, 14%, 100% { opacity: 0; transform: translate(-50%, -50%) rotate(0) scale(1); }
222
+ 20% { opacity: 0.45; transform: translate(-50%, -50%) rotate(8deg) scale(1); }
223
+ 34% { opacity: 0.92; transform: translate(-50%, -50%) rotate(38deg) scale(0.72); }
224
+ 48% { opacity: 0.12; transform: translate(-50%, -50%) rotate(86deg) scale(0.16); }
225
+ 49.5% { opacity: 0; transform: translate(-50%, -50%) rotate(96deg) scale(0.08); }
226
+ 50.5% { opacity: 0; transform: translate(-50%, -50%) rotate(104deg) scale(1); }
227
+ 64% { opacity: 0.82; transform: translate(-50%, -50%) rotate(146deg) scale(0.7); }
228
+ 82% { opacity: 0.08; transform: translate(-50%, -50%) rotate(206deg) scale(0.14); }
229
+ 86% { opacity: 0; transform: translate(-50%, -50%) rotate(218deg) scale(0.08); }
230
+ }
231
+
232
+ @keyframes composer-mascot-profile-particle-color {
233
+ 0%, 42% { color: var(--mascot-profile-from-accent); }
234
+ 49.5%, 50.5% { color: rgba(240, 244, 255, 0.96); }
235
+ 58%, 100% { color: var(--mascot-profile-to-accent); }
236
+ }
237
+
238
+ @keyframes composer-mascot-profile-rim {
239
+ 0%, 16% {
240
+ border-color: color-mix(in srgb, var(--mascot-profile-from-accent) 72%, transparent);
241
+ box-shadow: 0 0 12px color-mix(in srgb, var(--mascot-profile-from-accent) 42%, transparent);
242
+ }
243
+ 34% {
244
+ border-color: color-mix(in srgb, var(--mascot-profile-from-accent) 84%, white);
245
+ box-shadow: 0 0 15px color-mix(in srgb, var(--mascot-profile-from-accent) 48%, transparent);
246
+ }
247
+ 50% {
248
+ border-color: rgba(246, 248, 255, 0.92);
249
+ box-shadow: 0 0 17px rgba(220, 226, 255, 0.46);
250
+ }
251
+ 66% {
252
+ border-color: color-mix(in srgb, var(--mascot-profile-to-accent) 84%, white);
253
+ box-shadow: 0 0 15px color-mix(in srgb, var(--mascot-profile-to-accent) 48%, transparent);
254
+ }
255
+ 84%, 100% {
256
+ border-color: color-mix(in srgb, var(--mascot-profile-to-accent) 72%, transparent);
257
+ box-shadow: 0 0 12px color-mix(in srgb, var(--mascot-profile-to-accent) 36%, transparent);
258
+ }
259
+ }
260
+
261
+ @keyframes composer-mascot-profile-contact-shadow {
262
+ 0%, 100% { opacity: 1; transform: translateX(50%) scaleX(1); }
263
+ 46%, 54% { opacity: 0; transform: translateX(50%) scaleX(0.25); }
264
+ }
@@ -0,0 +1,21 @@
1
+ @keyframes composer-mascot-land {
2
+ 0%, 100% { transform: translateY(0) scale(1, 1); }
3
+ 35% { transform: translateY(2px) scale(1.12, 0.86); }
4
+ 70% { transform: translateY(-2px) scale(0.97, 1.03); }
5
+ }
6
+
7
+ .composer-mascot-land {
8
+ animation: composer-mascot-land 380ms ease-out;
9
+ transform-origin: bottom center;
10
+ }
11
+
12
+ @media (prefers-reduced-motion: reduce) {
13
+ .composer-mascot-motion,
14
+ .composer-mascot-motion * {
15
+ animation: none !important;
16
+ transition: none !important;
17
+ }
18
+ }
19
+
20
+ [data-composer-mascot-motion='off'],
21
+ [data-composer-mascot-motion='off'] * { animation: none !important; transition: none !important; }
@@ -0,0 +1,40 @@
1
+ import type { ReactNode } from 'react';
2
+ export type MascotExpression = 'neutral' | 'happy' | 'operator' | 'sleep';
3
+ export type MascotLight = 'default' | 'error' | 'success';
4
+ export interface ComposerMascotContext {
5
+ size: number;
6
+ activity: 'error' | 'success' | 'sleeping' | 'dragging' | 'decision' | 'working' | 'focused' | 'idle';
7
+ expression: MascotExpression;
8
+ light: MascotLight;
9
+ submitRevision: number;
10
+ reasoningEffort: 'off' | 'low' | 'medium' | 'high' | 'extraHigh';
11
+ speed: 'standard' | 'fast';
12
+ contextMax: boolean;
13
+ reducedMotion: boolean;
14
+ }
15
+ export interface ComposerMascotProps {
16
+ name?: string;
17
+ motion?: 'system' | 'on' | 'off';
18
+ focused?: boolean;
19
+ dragOver?: boolean;
20
+ bounceSignal?: number;
21
+ interaction?: {
22
+ expression?: MascotExpression;
23
+ light?: MascotLight;
24
+ hold?: 'sign';
25
+ bubble?: ReactNode;
26
+ };
27
+ reasoningEffort?: ComposerMascotContext['reasoningEffort'];
28
+ speed?: ComposerMascotContext['speed'];
29
+ contextMax?: boolean;
30
+ anchorOffset?: number;
31
+ anchorPushSignal?: number;
32
+ handoff?: boolean;
33
+ renderCharacter?: (character: ReactNode, context: ComposerMascotContext) => ReactNode;
34
+ renderMenu?: (position: {
35
+ x: number;
36
+ y: number;
37
+ }, close: () => void) => ReactNode;
38
+ onNameRendered?: (name: string | undefined) => void;
39
+ }
40
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/composer/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAA;AACzE,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAA;AACzD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAA;IACrG,UAAU,EAAE,gBAAgB,CAAA;IAC5B,KAAK,EAAE,WAAW,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAA;IAChE,KAAK,EAAE,UAAU,GAAG,MAAM,CAAA;IAC1B,UAAU,EAAE,OAAO,CAAA;IACnB,aAAa,EAAE,OAAO,CAAA;CACvB;AACD,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,KAAK,CAAA;IAChC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,gBAAgB,CAAC;QAAC,KAAK,CAAC,EAAE,WAAW,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,SAAS,CAAA;KAAE,CAAA;IACvG,eAAe,CAAC,EAAE,qBAAqB,CAAC,iBAAiB,CAAC,CAAA;IAC1D,KAAK,CAAC,EAAE,qBAAqB,CAAC,OAAO,CAAC,CAAA;IACtC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,qBAAqB,KAAK,SAAS,CAAA;IACrF,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,KAAK,EAAE,MAAM,IAAI,KAAK,SAAS,CAAA;IACjF,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAA;CACpD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/composer/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import type { AvatarPose } from '../index.js';
2
+ import type { MascotExpression } from './types.js';
3
+ export type ComposerAvatarGesture = 'blink' | 'look-left' | 'look-right' | 'antenna-bob';
4
+ interface ComposerAvatarBehaviorOptions {
5
+ semanticPose: AvatarPose;
6
+ baseExpression: MascotExpression;
7
+ focused: boolean;
8
+ dragOver: boolean;
9
+ sleeping: boolean;
10
+ waving: boolean;
11
+ activeIdle: boolean;
12
+ bounceSignal: number;
13
+ reducedMotion: boolean;
14
+ }
15
+ export declare function useComposerAvatarBehavior(options: ComposerAvatarBehaviorOptions): {
16
+ pose: AvatarPose;
17
+ expression: 'base' | 'happy' | 'operator' | 'sleep' | undefined;
18
+ gesture: ComposerAvatarGesture | undefined;
19
+ gestureSequence: number;
20
+ clearGesture: () => void;
21
+ completeGesture: (sequence: number) => void;
22
+ };
23
+ export {};
24
+ //# sourceMappingURL=useComposerAvatarBehavior.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useComposerAvatarBehavior.d.ts","sourceRoot":"","sources":["../../src/composer/useComposerAvatarBehavior.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,WAAW,GAAG,YAAY,GAAG,aAAa,CAAA;AAExF,UAAU,6BAA6B;IACrC,YAAY,EAAE,UAAU,CAAA;IACxB,cAAc,EAAE,gBAAgB,CAAA;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,OAAO,CAAA;IACf,UAAU,EAAE,OAAO,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,6BAA6B,GAAG;IACjF,IAAI,EAAE,UAAU,CAAA;IAChB,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAA;IAC/D,OAAO,EAAE,qBAAqB,GAAG,SAAS,CAAA;IAC1C,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,IAAI,CAAA;IACxB,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;CAC5C,CAuEA"}
@@ -0,0 +1,72 @@
1
+ import { useCallback, useEffect, useRef, useState } from 'react';
2
+ export function useComposerAvatarBehavior(options) {
3
+ const [receiptAcknowledging, setReceiptAcknowledging] = useState(false);
4
+ const [gesture, setGesture] = useState();
5
+ const [gestureSequence, setGestureSequence] = useState(0);
6
+ const previousBounce = useRef(options.bounceSignal);
7
+ useEffect(() => {
8
+ if (options.reducedMotion || options.semanticPose !== 'idle') {
9
+ previousBounce.current = options.bounceSignal;
10
+ setReceiptAcknowledging(false);
11
+ return;
12
+ }
13
+ if (options.bounceSignal === previousBounce.current)
14
+ return;
15
+ previousBounce.current = options.bounceSignal;
16
+ setReceiptAcknowledging(true);
17
+ const timer = window.setTimeout(() => setReceiptAcknowledging(false), 350);
18
+ return () => window.clearTimeout(timer);
19
+ }, [options.bounceSignal, options.reducedMotion, options.semanticPose]);
20
+ useEffect(() => {
21
+ if (options.sleeping || options.activeIdle || options.reducedMotion) {
22
+ setGesture(undefined);
23
+ return;
24
+ }
25
+ if (options.baseExpression !== 'neutral' && options.baseExpression !== 'happy')
26
+ return;
27
+ let timer = 0;
28
+ const schedule = () => {
29
+ timer = window.setTimeout(() => {
30
+ if (!document.hidden) {
31
+ const value = Math.random();
32
+ const next = value < 0.5
33
+ ? 'blink'
34
+ : value < 0.72
35
+ ? (Math.random() < 0.5 ? 'look-left' : 'look-right')
36
+ : value < 0.86
37
+ ? 'antenna-bob'
38
+ : undefined;
39
+ if (next) {
40
+ setGesture(next);
41
+ setGestureSequence((sequence) => sequence + 1);
42
+ }
43
+ }
44
+ schedule();
45
+ }, 2600 + Math.random() * 3200);
46
+ };
47
+ schedule();
48
+ return () => { window.clearTimeout(timer); };
49
+ }, [options.sleeping, options.activeIdle, options.reducedMotion, options.baseExpression]);
50
+ const clearGesture = useCallback(() => setGesture(undefined), []);
51
+ const completeGesture = useCallback((sequence) => {
52
+ setGesture((current) => sequence === gestureSequence ? undefined : current);
53
+ }, [gestureSequence]);
54
+ const expression = options.semanticPose === 'idle'
55
+ ? options.waving || options.focused
56
+ ? 'happy'
57
+ : options.dragOver || options.baseExpression === 'operator'
58
+ ? 'operator'
59
+ : options.sleeping
60
+ ? 'sleep'
61
+ : 'base'
62
+ : undefined;
63
+ return {
64
+ pose: options.semanticPose === 'idle' && receiptAcknowledging ? 'acknowledge' : options.semanticPose,
65
+ expression,
66
+ gesture,
67
+ gestureSequence,
68
+ clearGesture,
69
+ completeGesture
70
+ };
71
+ }
72
+ //# sourceMappingURL=useComposerAvatarBehavior.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useComposerAvatarBehavior.js","sourceRoot":"","sources":["../../src/composer/useComposerAvatarBehavior.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function useComposerMotion(mode: 'system' | 'on' | 'off'): boolean;
2
+ //# sourceMappingURL=useComposerMotion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useComposerMotion.d.ts","sourceRoot":"","sources":["../../src/composer/useComposerMotion.ts"],"names":[],"mappings":"AAEA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,KAAK,WAY9D"}
@@ -0,0 +1,16 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { prefersReducedMotion } from './constants.js';
3
+ export function useComposerMotion(mode) {
4
+ const [reduced, setReduced] = useState(prefersReducedMotion);
5
+ useEffect(() => {
6
+ const update = () => setReduced(prefersReducedMotion());
7
+ const media = window.matchMedia?.('(prefers-reduced-motion: reduce)');
8
+ media?.addEventListener?.('change', update);
9
+ const observer = new MutationObserver(update);
10
+ observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-reduce-motion'] });
11
+ update();
12
+ return () => { media?.removeEventListener?.('change', update); observer.disconnect(); };
13
+ }, []);
14
+ return mode === 'on' || (mode === 'system' && !reduced);
15
+ }
16
+ //# sourceMappingURL=useComposerMotion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useComposerMotion.js","sourceRoot":"","sources":["../../src/composer/useComposerMotion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,MAAM,UAAU,iBAAiB,CAAC,IAA6B;IAC7D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,oBAAoB,CAAC,CAAA;IAC5D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAA;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,kCAAkC,CAAC,CAAA;QACrE,KAAK,EAAE,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC3C,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAA;QAC7C,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAA;QACzG,MAAM,EAAE,CAAA;QACR,OAAO,GAAG,EAAE,GAAG,KAAK,EAAE,mBAAmB,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAA,CAAC,CAAC,CAAA;IACxF,CAAC,EAAE,EAAE,CAAC,CAAA;IACN,OAAO,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAA;AACzD,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type MascotProfileTransition } from './constants.js';
2
+ export declare function useComposerProfile(mascotName: string | undefined, reduced: boolean): {
3
+ avatar: string | undefined;
4
+ profileTransition: MascotProfileTransition | null;
5
+ profileTransitionRevision: number;
6
+ };
7
+ //# sourceMappingURL=useComposerProfile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useComposerProfile.d.ts","sourceRoot":"","sources":["../../src/composer/useComposerProfile.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2F,KAAK,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AACtJ,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO;;;;EA8ClF"}
@@ -0,0 +1,46 @@
1
+ import { useLayoutEffect, useRef, useState } from 'react';
2
+ import { deriveAppearance, mascotPaletteOf } from '../index.js';
3
+ import { mascotNameKey, MASCOT_PROFILE_TRANSITION_SWAP_MS, MASCOT_PROFILE_TRANSITION_DURATION_MS } from './constants.js';
4
+ export function useComposerProfile(mascotName, reduced) {
5
+ const [renderedMascotAvatar, setRenderedMascotAvatar] = useState(mascotName);
6
+ const [transitionState, setTransitionState] = useState({ revision: 0, transition: null });
7
+ const renderedMascotAvatarRef = useRef(renderedMascotAvatar);
8
+ const targetMascotAvatarRef = useRef(mascotName);
9
+ renderedMascotAvatarRef.current = renderedMascotAvatar;
10
+ targetMascotAvatarRef.current = mascotName;
11
+ const targetAvatarKey = mascotNameKey(mascotName);
12
+ useLayoutEffect(() => {
13
+ const currentAvatar = renderedMascotAvatarRef.current;
14
+ if (targetAvatarKey === mascotNameKey(currentAvatar)) {
15
+ setTransitionState(current => ({ ...current, transition: null }));
16
+ return undefined;
17
+ }
18
+ const nextAvatar = targetMascotAvatarRef.current;
19
+ if (reduced) {
20
+ renderedMascotAvatarRef.current = nextAvatar;
21
+ setRenderedMascotAvatar(nextAvatar);
22
+ setTransitionState(current => ({ ...current, transition: null }));
23
+ return undefined;
24
+ }
25
+ setTransitionState(current => ({
26
+ revision: current.revision + 1,
27
+ transition: {
28
+ fromAccent: mascotPaletteOf(deriveAppearance(currentAvatar ?? '')).accent,
29
+ toAccent: mascotPaletteOf(deriveAppearance(nextAvatar ?? '')).accent
30
+ }
31
+ }));
32
+ const swapTimer = window.setTimeout(() => {
33
+ renderedMascotAvatarRef.current = nextAvatar;
34
+ setRenderedMascotAvatar(nextAvatar);
35
+ }, MASCOT_PROFILE_TRANSITION_SWAP_MS);
36
+ const finishTimer = window.setTimeout(() => {
37
+ setTransitionState(current => ({ ...current, transition: null }));
38
+ }, MASCOT_PROFILE_TRANSITION_DURATION_MS);
39
+ return () => {
40
+ window.clearTimeout(swapTimer);
41
+ window.clearTimeout(finishTimer);
42
+ };
43
+ }, [targetAvatarKey, reduced]);
44
+ return { avatar: renderedMascotAvatar, profileTransition: transitionState.transition, profileTransitionRevision: transitionState.revision };
45
+ }
46
+ //# sourceMappingURL=useComposerProfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useComposerProfile.js","sourceRoot":"","sources":["../../src/composer/useComposerProfile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type DecorationId, type PrimaryId, type SecondaryId } from './appearanceModel.js';
2
+ export interface Decoration {
3
+ id: DecorationId;
4
+ name: string;
5
+ category: 'Hats' | 'Novelty' | 'Accessories';
6
+ feature: string;
7
+ colors: readonly string[];
8
+ mount: string;
9
+ }
10
+ export declare const decorations: Decoration[];
11
+ export declare const decorationOf: (id: DecorationId) => Decoration;
12
+ export declare const decorationName: (id: PrimaryId | SecondaryId) => string;
13
+ export declare function compatibleNames(item: Decoration): string;
14
+ //# sourceMappingURL=decorationCatalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorationCatalog.d.ts","sourceRoot":"","sources":["../src/decorationCatalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAErH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,YAAY,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,CAAA;IAC5C,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;CACd;AACD,eAAO,MAAM,WAAW,EAAE,UAAU,EA2BnC,CAAA;AACD,eAAO,MAAM,YAAY,GAAI,IAAI,YAAY,eAA8C,CAAA;AAC3F,eAAO,MAAM,cAAc,GAAI,IAAI,SAAS,GAAG,WAAW,WAAmD,CAAA;AAC7G,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,UAI/C"}
@@ -0,0 +1,37 @@
1
+ import { compatibility, primaryIds } from './appearanceModel.js';
2
+ export const decorations = [
3
+ { id: 'baseball-cap', name: 'Baseball cap', category: 'Hats', feature: 'Rounded crown with a short right-facing brim', colors: ['#e87967', '#b94f50', '#f5a18c'], mount: 'Crown overlaps the top edge; the brim stays inside the body' },
4
+ { id: 'bucket-hat', name: 'Bucket hat', category: 'Hats', feature: 'Flat top with a continuous downward brim', colors: ['#94bda6', '#5b887a', '#bed8c1'], mount: 'Brim follows the top edge with a slight center overlap' },
5
+ { id: 'beret', name: 'Beret', category: 'Hats', feature: 'Soft left-leaning crown with a short stem', colors: ['#b17498', '#784c71', '#cf9db5'], mount: 'Narrow band rests on top; the crown leans left' },
6
+ { id: 'beanie', name: 'Beanie', category: 'Hats', feature: 'Rounded crown and wide folded cuff with minimal texture', colors: ['#e9a653', '#bc753d', '#f7c676'], mount: 'Folded cuff sits on the top edge; crown stays centered' },
7
+ { id: 'top-hat', name: 'Top hat', category: 'Hats', feature: 'Tall crown, narrow brim, and burgundy band', colors: ['#465069', '#293247', '#c96e85'], mount: 'Narrow brim rests flat on top; crown tapers at its base' },
8
+ { id: 'wizard-hat', name: 'Wizard hat', category: 'Hats', feature: 'Curved point, wide brim, and gold star', colors: ['#8773c1', '#594b93', '#f4cc75'], mount: 'Wide brim rests on top; point curves into the center safe area' },
9
+ { id: 'chef-hat', name: 'Chef hat', category: 'Hats', feature: 'Three-lobed puff with an upright band', colors: ['#f5eee3', '#d7caba', '#fffaf1'], mount: 'Band rests at the center of the top edge' },
10
+ { id: 'party-hat', name: 'Party hat', category: 'Hats', feature: 'Cone with two colored bands and a pom-pom', colors: ['#ea9baf', '#8075b7', '#f5d07b'], mount: 'Shallow curved base follows the top of the body' },
11
+ { id: 'crown', name: 'Crown', category: 'Hats', feature: 'Three rounded points with a central sapphire', colors: ['#efc65c', '#c99139', '#73b8cc'], mount: 'Curved gold band wraps the top edge; all points face up' },
12
+ { id: 'hard-hat', name: 'Hard hat', category: 'Hats', feature: 'Rounded shell, center ridge, and short front brim', colors: ['#f5bd48', '#d68d32', '#ffdc79'], mount: 'Short brim overlaps the top edge; ridge stays centered' },
13
+ { id: 'nightcap', name: 'Nightcap', category: 'Hats', feature: 'Soft drooping point with a pom-pom', colors: ['#789cc9', '#4c709f', '#dce8f4'], mount: 'Soft band follows the top edge; pom-pom stays upper right' },
14
+ { id: 'straw-hat', name: 'Straw hat', category: 'Hats', feature: 'Low round crown, wide oval brim, and red band', colors: ['#e8c78a', '#c49b5e', '#c57568'], mount: 'Wide brim rests flat without entering the arm areas' },
15
+ { id: 'poop', name: 'Poop', category: 'Novelty', feature: 'Three rounded layers with a playful curled tip', colors: ['#a97b5f', '#805840', '#c49976'], mount: 'Wide bottom layer rests directly on top; color separates each layer' },
16
+ { id: 'banana', name: 'Banana', category: 'Novelty', feature: 'Crescent fruit with stems and an inner color plane', colors: ['#f3cf62', '#dbaa40', '#89705a'], mount: 'Outer curve touches the top; both stems point up' },
17
+ { id: 'fried-egg', name: 'Fried egg', category: 'Novelty', feature: 'Irregular rounded white with a raised golden yolk', colors: ['#fff9e8', '#e6d9bb', '#f3be43'], mount: 'White spreads across the top; raised yolk defines the silhouette' },
18
+ { id: 'rubber-duck', name: 'Rubber duck', category: 'Novelty', feature: 'Round head, flat orange bill, and short raised tail', colors: ['#f6d05e', '#e4ae3e', '#e58b4b'], mount: 'Belly rests flat on top, with bill left and tail right' },
19
+ { id: 'paper-boat', name: 'Paper boat', category: 'Novelty', feature: 'Folded hull with a central triangular plane', colors: ['#d6e7eb', '#92b5c1', '#f1f7f5'], mount: 'Folded hull edge rests on top; main fold stays centered' },
20
+ { id: 'traffic-cone', name: 'Traffic cone', category: 'Novelty', feature: 'Orange cone with a white band and flat base', colors: ['#ed985f', '#c96c43', '#fff0dd'], mount: 'Flat base rests on top; cone tapers upward' },
21
+ { id: 'sprout', name: 'Sprout', category: 'Novelty', feature: 'Short stem with two leaves pointing in different directions', colors: ['#89b875', '#537f59', '#b5d38f'], mount: 'Stem grows directly from the top edge without a pot or base' },
22
+ { id: 'donut', name: 'Donut', category: 'Novelty', feature: 'Clear center hole, half-ring of icing, and a few sprinkles', colors: ['#dbab70', '#bf8456', '#e5a0b3'], mount: 'Lower curve touches the top; center remains an open cutout' },
23
+ { id: 'forehead-goggles', name: 'Forehead goggles', category: 'Accessories', feature: 'Two blue-gray lenses with a center bridge', colors: ['#8b7568', '#a2c5d1', '#dec8ae'], mount: 'Fits within the forehead band; bridge anchors above the screen' },
24
+ { "id": "task-board", "name": "Task board", "category": "Accessories", "feature": "White planning board with connected role-color markers and a yellow accent", "colors": ["#ffffff", "#3161f7", "#f6b500"], "mount": "Screen-left hand; shares the arm pivot, stows for laptop and question sign, then restores" },
25
+ { "id": "wrench", "name": "Wrench", "category": "Accessories", "feature": "White open-ended wrench with role-color outlines and a yellow handle inset", "colors": ["#ffffff", "#3161f7", "#f6b500"], "mount": "Screen-left hand; shares the arm pivot, stows for laptop and question sign, then restores" },
26
+ { "id": "shield", "name": "Shield", "category": "Accessories", "feature": "White shield with a role-color outline and upright check", "colors": ["#ffffff", "#3161f7", "#f6b500"], "mount": "Screen-left hand; shares the arm pivot, stows for laptop and question sign, then restores" },
27
+ { "id": "magnifier", "name": "Magnifier", "category": "Accessories", "feature": "Upright white lens frame with a role-color outline and a lower grip", "colors": ["#ffffff", "#3161f7", "#f6b500"], "mount": "Screen-left hand; shares the arm pivot, stows for laptop and question sign, then restores" },
28
+ { "id": "control-panel", "name": "Control panel", "category": "Accessories", "feature": "White control panel with dark rails and role-color and yellow knobs", "colors": ["#ffffff", "#3161f7", "#f6b500"], "mount": "Screen-left hand; shares the arm pivot, stows for laptop and question sign, then restores" },
29
+ ];
30
+ export const decorationOf = (id) => decorations.find(item => item.id === id);
31
+ export const decorationName = (id) => id === 'none' ? 'None' : decorationOf(id).name;
32
+ export function compatibleNames(item) {
33
+ return item.category === 'Accessories'
34
+ ? primaryIds.filter(id => compatibility[id].includes(item.id)).map(decorationName).join(', ')
35
+ : compatibility[item.id].map(decorationName).join(', ');
36
+ }
37
+ //# sourceMappingURL=decorationCatalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorationCatalog.js","sourceRoot":"","sources":["../src/decorationCatalog.ts"],"names":[],"mappings":"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"}