@oxy.so/bloom 7.1.4 → 7.2.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.
Files changed (442) hide show
  1. package/assets/character-runtime/README.md +19 -114
  2. package/assets/character-runtime/legacy-engine.mjs +54 -406
  3. package/assets/character-runtime/legacy-geometry.mjs +85 -242
  4. package/assets/character-runtime/legacy-worker.mjs +23 -82
  5. package/assets/character-runtime/managed-avatar.mjs +18 -12
  6. package/assets/character-runtime/render-budget.mjs +11 -6
  7. package/assets/character-runtime/runtime.mjs +295 -744
  8. package/docs/adoption-matrix.mdx +12 -11
  9. package/docs/agent-avatar.mdx +8 -45
  10. package/docs/agent-creator.mdx +3 -13
  11. package/docs/app-shell.mdx +26 -2
  12. package/docs/appearance.mdx +16 -1
  13. package/docs/content-panel.mdx +4 -0
  14. package/docs/mail-thread.mdx +8 -0
  15. package/docs/page-footer.mdx +60 -0
  16. package/docs/sidebar.mdx +1 -1
  17. package/lib/commonjs/agent-avatar/AgentAvatar.js +1 -1
  18. package/lib/commonjs/agent-avatar/AgentAvatar.js.map +1 -1
  19. package/lib/commonjs/agent-avatar/CharacterAvatar.js +1 -2
  20. package/lib/commonjs/agent-avatar/CharacterAvatar.js.map +1 -1
  21. package/lib/commonjs/agent-avatar/config-character.js +0 -4
  22. package/lib/commonjs/agent-avatar/config-character.js.map +1 -1
  23. package/lib/commonjs/agent-avatar/legacy-recipe.js +6 -19
  24. package/lib/commonjs/agent-avatar/legacy-recipe.js.map +1 -1
  25. package/lib/commonjs/agent-creator/AgentCreatorBase.js +107 -67
  26. package/lib/commonjs/agent-creator/AgentCreatorBase.js.map +1 -1
  27. package/lib/commonjs/agent-creator/CharacterControls.js +5 -23
  28. package/lib/commonjs/agent-creator/CharacterControls.js.map +1 -1
  29. package/lib/commonjs/agent-creator/EmotionPicker.js +1 -8
  30. package/lib/commonjs/agent-creator/EmotionPicker.js.map +1 -1
  31. package/lib/commonjs/agent-creator/ShapeSilhouette.js +1 -8
  32. package/lib/commonjs/agent-creator/ShapeSilhouette.js.map +1 -1
  33. package/lib/commonjs/agent-creator/constants.js +17 -16
  34. package/lib/commonjs/agent-creator/constants.js.map +1 -1
  35. package/lib/commonjs/agent-creator/messages.js +1 -1
  36. package/lib/commonjs/agent-creator/messages.js.map +1 -1
  37. package/lib/commonjs/app-shell/AppShell.js +3 -2
  38. package/lib/commonjs/app-shell/AppShell.js.map +1 -1
  39. package/lib/commonjs/app-shell/AppShellBars.js +8 -5
  40. package/lib/commonjs/app-shell/AppShellBars.js.map +1 -1
  41. package/lib/commonjs/app-shell/AppShellEngine.js +81 -36
  42. package/lib/commonjs/app-shell/AppShellEngine.js.map +1 -1
  43. package/lib/commonjs/appearance/BloomScope.js +8 -3
  44. package/lib/commonjs/appearance/BloomScope.js.map +1 -1
  45. package/lib/commonjs/appearance/context.js.map +1 -1
  46. package/lib/commonjs/content-panel/ContentPanel.js +34 -23
  47. package/lib/commonjs/content-panel/ContentPanel.js.map +1 -1
  48. package/lib/commonjs/content-panel/ContentPanel.web.js +39 -17
  49. package/lib/commonjs/content-panel/ContentPanel.web.js.map +1 -1
  50. package/lib/commonjs/design-tokens/shapes.js +2 -2
  51. package/lib/commonjs/design-tokens/shapes.js.map +1 -1
  52. package/lib/commonjs/design-tokens/tokens.json +2 -2
  53. package/lib/commonjs/index.js +939 -927
  54. package/lib/commonjs/index.js.map +1 -1
  55. package/lib/commonjs/index.web.js +939 -927
  56. package/lib/commonjs/index.web.js.map +1 -1
  57. package/lib/commonjs/locale/translations/ar.js +1 -1
  58. package/lib/commonjs/locale/translations/ar.js.map +1 -1
  59. package/lib/commonjs/locale/translations/bn.js +1 -1
  60. package/lib/commonjs/locale/translations/bn.js.map +1 -1
  61. package/lib/commonjs/locale/translations/ca.js +1 -1
  62. package/lib/commonjs/locale/translations/ca.js.map +1 -1
  63. package/lib/commonjs/locale/translations/de.js +1 -1
  64. package/lib/commonjs/locale/translations/de.js.map +1 -1
  65. package/lib/commonjs/locale/translations/es.js +1 -1
  66. package/lib/commonjs/locale/translations/es.js.map +1 -1
  67. package/lib/commonjs/locale/translations/fr.js +1 -1
  68. package/lib/commonjs/locale/translations/fr.js.map +1 -1
  69. package/lib/commonjs/locale/translations/hi.js +1 -1
  70. package/lib/commonjs/locale/translations/hi.js.map +1 -1
  71. package/lib/commonjs/locale/translations/id.js +1 -1
  72. package/lib/commonjs/locale/translations/id.js.map +1 -1
  73. package/lib/commonjs/locale/translations/it.js +1 -1
  74. package/lib/commonjs/locale/translations/it.js.map +1 -1
  75. package/lib/commonjs/locale/translations/ja.js +1 -1
  76. package/lib/commonjs/locale/translations/ja.js.map +1 -1
  77. package/lib/commonjs/locale/translations/pt.js +1 -1
  78. package/lib/commonjs/locale/translations/pt.js.map +1 -1
  79. package/lib/commonjs/locale/translations/ru.js +1 -1
  80. package/lib/commonjs/locale/translations/ru.js.map +1 -1
  81. package/lib/commonjs/locale/translations/tr.js +1 -1
  82. package/lib/commonjs/locale/translations/tr.js.map +1 -1
  83. package/lib/commonjs/locale/translations/zh.js +1 -1
  84. package/lib/commonjs/locale/translations/zh.js.map +1 -1
  85. package/lib/commonjs/mail-thread/MailMessage.js +8 -14
  86. package/lib/commonjs/mail-thread/MailMessage.js.map +1 -1
  87. package/lib/commonjs/mail-thread/MailThread.js +6 -2
  88. package/lib/commonjs/mail-thread/MailThread.js.map +1 -1
  89. package/lib/commonjs/mail-thread/shared.js +2 -1
  90. package/lib/commonjs/mail-thread/shared.js.map +1 -1
  91. package/lib/commonjs/page-footer/PageFooter.js +137 -0
  92. package/lib/commonjs/page-footer/PageFooter.js.map +1 -0
  93. package/lib/commonjs/page-footer/PageFooterProvider.js +22 -0
  94. package/lib/commonjs/page-footer/PageFooterProvider.js.map +1 -0
  95. package/lib/commonjs/page-footer/context.js +11 -0
  96. package/lib/commonjs/page-footer/context.js.map +1 -0
  97. package/lib/commonjs/page-footer/index.js +27 -0
  98. package/lib/commonjs/page-footer/index.js.map +1 -0
  99. package/lib/commonjs/page-footer/types.js +6 -0
  100. package/lib/commonjs/page-footer/types.js.map +1 -0
  101. package/lib/commonjs/page-footer/use-page-footer-inset.js +19 -0
  102. package/lib/commonjs/page-footer/use-page-footer-inset.js.map +1 -0
  103. package/lib/commonjs/sidebar/Sidebar.js +6 -5
  104. package/lib/commonjs/sidebar/Sidebar.js.map +1 -1
  105. package/lib/commonjs/styles/panel-chrome.js +15 -1
  106. package/lib/commonjs/styles/panel-chrome.js.map +1 -1
  107. package/lib/module/agent-avatar/AgentAvatar.js +1 -1
  108. package/lib/module/agent-avatar/AgentAvatar.js.map +1 -1
  109. package/lib/module/agent-avatar/CharacterAvatar.js +1 -2
  110. package/lib/module/agent-avatar/CharacterAvatar.js.map +1 -1
  111. package/lib/module/agent-avatar/config-character.js +0 -4
  112. package/lib/module/agent-avatar/config-character.js.map +1 -1
  113. package/lib/module/agent-avatar/legacy-recipe.js +6 -19
  114. package/lib/module/agent-avatar/legacy-recipe.js.map +1 -1
  115. package/lib/module/agent-creator/AgentCreatorBase.js +109 -69
  116. package/lib/module/agent-creator/AgentCreatorBase.js.map +1 -1
  117. package/lib/module/agent-creator/CharacterControls.js +6 -24
  118. package/lib/module/agent-creator/CharacterControls.js.map +1 -1
  119. package/lib/module/agent-creator/EmotionPicker.js +1 -8
  120. package/lib/module/agent-creator/EmotionPicker.js.map +1 -1
  121. package/lib/module/agent-creator/ShapeSilhouette.js +1 -8
  122. package/lib/module/agent-creator/ShapeSilhouette.js.map +1 -1
  123. package/lib/module/agent-creator/constants.js +16 -8
  124. package/lib/module/agent-creator/constants.js.map +1 -1
  125. package/lib/module/agent-creator/messages.js +1 -1
  126. package/lib/module/agent-creator/messages.js.map +1 -1
  127. package/lib/module/app-shell/AppShell.js +3 -2
  128. package/lib/module/app-shell/AppShell.js.map +1 -1
  129. package/lib/module/app-shell/AppShellBars.js +8 -5
  130. package/lib/module/app-shell/AppShellBars.js.map +1 -1
  131. package/lib/module/app-shell/AppShellEngine.js +81 -36
  132. package/lib/module/app-shell/AppShellEngine.js.map +1 -1
  133. package/lib/module/appearance/BloomScope.js +8 -3
  134. package/lib/module/appearance/BloomScope.js.map +1 -1
  135. package/lib/module/appearance/context.js.map +1 -1
  136. package/lib/module/content-panel/ContentPanel.js +35 -24
  137. package/lib/module/content-panel/ContentPanel.js.map +1 -1
  138. package/lib/module/content-panel/ContentPanel.web.js +41 -19
  139. package/lib/module/content-panel/ContentPanel.web.js.map +1 -1
  140. package/lib/module/design-tokens/shapes.js +2 -2
  141. package/lib/module/design-tokens/shapes.js.map +1 -1
  142. package/lib/module/design-tokens/tokens.json +2 -2
  143. package/lib/module/index.js +1 -0
  144. package/lib/module/index.js.map +1 -1
  145. package/lib/module/index.web.js +1 -0
  146. package/lib/module/index.web.js.map +1 -1
  147. package/lib/module/locale/translations/ar.js +1 -1
  148. package/lib/module/locale/translations/ar.js.map +1 -1
  149. package/lib/module/locale/translations/bn.js +1 -1
  150. package/lib/module/locale/translations/bn.js.map +1 -1
  151. package/lib/module/locale/translations/ca.js +1 -1
  152. package/lib/module/locale/translations/ca.js.map +1 -1
  153. package/lib/module/locale/translations/de.js +1 -1
  154. package/lib/module/locale/translations/de.js.map +1 -1
  155. package/lib/module/locale/translations/es.js +1 -1
  156. package/lib/module/locale/translations/es.js.map +1 -1
  157. package/lib/module/locale/translations/fr.js +1 -1
  158. package/lib/module/locale/translations/fr.js.map +1 -1
  159. package/lib/module/locale/translations/hi.js +1 -1
  160. package/lib/module/locale/translations/hi.js.map +1 -1
  161. package/lib/module/locale/translations/id.js +1 -1
  162. package/lib/module/locale/translations/id.js.map +1 -1
  163. package/lib/module/locale/translations/it.js +1 -1
  164. package/lib/module/locale/translations/it.js.map +1 -1
  165. package/lib/module/locale/translations/ja.js +1 -1
  166. package/lib/module/locale/translations/ja.js.map +1 -1
  167. package/lib/module/locale/translations/pt.js +1 -1
  168. package/lib/module/locale/translations/pt.js.map +1 -1
  169. package/lib/module/locale/translations/ru.js +1 -1
  170. package/lib/module/locale/translations/ru.js.map +1 -1
  171. package/lib/module/locale/translations/tr.js +1 -1
  172. package/lib/module/locale/translations/tr.js.map +1 -1
  173. package/lib/module/locale/translations/zh.js +1 -1
  174. package/lib/module/locale/translations/zh.js.map +1 -1
  175. package/lib/module/mail-thread/MailMessage.js +8 -14
  176. package/lib/module/mail-thread/MailMessage.js.map +1 -1
  177. package/lib/module/mail-thread/MailThread.js +6 -2
  178. package/lib/module/mail-thread/MailThread.js.map +1 -1
  179. package/lib/module/mail-thread/shared.js +2 -1
  180. package/lib/module/mail-thread/shared.js.map +1 -1
  181. package/lib/module/page-footer/PageFooter.js +132 -0
  182. package/lib/module/page-footer/PageFooter.js.map +1 -0
  183. package/lib/module/page-footer/PageFooterProvider.js +18 -0
  184. package/lib/module/page-footer/PageFooterProvider.js.map +1 -0
  185. package/lib/module/page-footer/context.js +7 -0
  186. package/lib/module/page-footer/context.js.map +1 -0
  187. package/lib/module/page-footer/index.js +6 -0
  188. package/lib/module/page-footer/index.js.map +1 -0
  189. package/lib/module/page-footer/types.js +4 -0
  190. package/lib/module/page-footer/types.js.map +1 -0
  191. package/lib/module/page-footer/use-page-footer-inset.js +16 -0
  192. package/lib/module/page-footer/use-page-footer-inset.js.map +1 -0
  193. package/lib/module/sidebar/Sidebar.js +6 -5
  194. package/lib/module/sidebar/Sidebar.js.map +1 -1
  195. package/lib/module/styles/panel-chrome.js +14 -1
  196. package/lib/module/styles/panel-chrome.js.map +1 -1
  197. package/lib/typescript/commonjs/agent-avatar/CharacterAvatar.d.ts.map +1 -1
  198. package/lib/typescript/commonjs/agent-avatar/config-character.d.ts +0 -4
  199. package/lib/typescript/commonjs/agent-avatar/config-character.d.ts.map +1 -1
  200. package/lib/typescript/commonjs/agent-avatar/legacy-recipe.d.ts +10 -2
  201. package/lib/typescript/commonjs/agent-avatar/legacy-recipe.d.ts.map +1 -1
  202. package/lib/typescript/commonjs/agent-creator/AgentCreatorBase.d.ts.map +1 -1
  203. package/lib/typescript/commonjs/agent-creator/CharacterControls.d.ts +1 -2
  204. package/lib/typescript/commonjs/agent-creator/CharacterControls.d.ts.map +1 -1
  205. package/lib/typescript/commonjs/agent-creator/EmotionPicker.d.ts +0 -1
  206. package/lib/typescript/commonjs/agent-creator/EmotionPicker.d.ts.map +1 -1
  207. package/lib/typescript/commonjs/agent-creator/ShapeSilhouette.d.ts.map +1 -1
  208. package/lib/typescript/commonjs/agent-creator/constants.d.ts +15 -7
  209. package/lib/typescript/commonjs/agent-creator/constants.d.ts.map +1 -1
  210. package/lib/typescript/commonjs/agent-creator/messages.d.ts.map +1 -1
  211. package/lib/typescript/commonjs/app-shell/AppShellBars.d.ts +4 -0
  212. package/lib/typescript/commonjs/app-shell/AppShellBars.d.ts.map +1 -1
  213. package/lib/typescript/commonjs/app-shell/AppShellEngine.d.ts.map +1 -1
  214. package/lib/typescript/commonjs/app-shell/types.d.ts +11 -3
  215. package/lib/typescript/commonjs/app-shell/types.d.ts.map +1 -1
  216. package/lib/typescript/commonjs/appearance/BloomScope.d.ts +1 -1
  217. package/lib/typescript/commonjs/appearance/BloomScope.d.ts.map +1 -1
  218. package/lib/typescript/commonjs/appearance/context.d.ts +2 -2
  219. package/lib/typescript/commonjs/appearance/context.d.ts.map +1 -1
  220. package/lib/typescript/commonjs/appearance/types.d.ts +4 -1
  221. package/lib/typescript/commonjs/appearance/types.d.ts.map +1 -1
  222. package/lib/typescript/commonjs/content-panel/ContentPanel.d.ts +3 -4
  223. package/lib/typescript/commonjs/content-panel/ContentPanel.d.ts.map +1 -1
  224. package/lib/typescript/commonjs/content-panel/ContentPanel.web.d.ts +1 -1
  225. package/lib/typescript/commonjs/content-panel/ContentPanel.web.d.ts.map +1 -1
  226. package/lib/typescript/commonjs/content-panel/types.d.ts +2 -2
  227. package/lib/typescript/commonjs/design-tokens/shapes.d.ts +2 -2
  228. package/lib/typescript/commonjs/index.d.ts +1 -0
  229. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  230. package/lib/typescript/commonjs/index.web.d.ts +1 -0
  231. package/lib/typescript/commonjs/index.web.d.ts.map +1 -1
  232. package/lib/typescript/commonjs/mail-thread/MailMessage.d.ts.map +1 -1
  233. package/lib/typescript/commonjs/mail-thread/MailThread.d.ts +1 -1
  234. package/lib/typescript/commonjs/mail-thread/MailThread.d.ts.map +1 -1
  235. package/lib/typescript/commonjs/mail-thread/shared.d.ts +1 -1
  236. package/lib/typescript/commonjs/mail-thread/shared.d.ts.map +1 -1
  237. package/lib/typescript/commonjs/mail-thread/types.d.ts +2 -0
  238. package/lib/typescript/commonjs/mail-thread/types.d.ts.map +1 -1
  239. package/lib/typescript/commonjs/page-footer/PageFooter.d.ts +7 -0
  240. package/lib/typescript/commonjs/page-footer/PageFooter.d.ts.map +1 -0
  241. package/lib/typescript/commonjs/page-footer/PageFooterProvider.d.ts +4 -0
  242. package/lib/typescript/commonjs/page-footer/PageFooterProvider.d.ts.map +1 -0
  243. package/lib/typescript/commonjs/page-footer/context.d.ts +3 -0
  244. package/lib/typescript/commonjs/page-footer/context.d.ts.map +1 -0
  245. package/lib/typescript/commonjs/page-footer/index.d.ts +5 -0
  246. package/lib/typescript/commonjs/page-footer/index.d.ts.map +1 -0
  247. package/lib/typescript/commonjs/page-footer/types.d.ts +26 -0
  248. package/lib/typescript/commonjs/page-footer/types.d.ts.map +1 -0
  249. package/lib/typescript/commonjs/page-footer/use-page-footer-inset.d.ts +7 -0
  250. package/lib/typescript/commonjs/page-footer/use-page-footer-inset.d.ts.map +1 -0
  251. package/lib/typescript/commonjs/sidebar/Sidebar.d.ts.map +1 -1
  252. package/lib/typescript/commonjs/sidebar/types.d.ts +1 -1
  253. package/lib/typescript/commonjs/styles/panel-chrome.d.ts +5 -0
  254. package/lib/typescript/commonjs/styles/panel-chrome.d.ts.map +1 -1
  255. package/lib/typescript/module/agent-avatar/CharacterAvatar.d.ts.map +1 -1
  256. package/lib/typescript/module/agent-avatar/config-character.d.ts +0 -4
  257. package/lib/typescript/module/agent-avatar/config-character.d.ts.map +1 -1
  258. package/lib/typescript/module/agent-avatar/legacy-recipe.d.ts +10 -2
  259. package/lib/typescript/module/agent-avatar/legacy-recipe.d.ts.map +1 -1
  260. package/lib/typescript/module/agent-creator/AgentCreatorBase.d.ts.map +1 -1
  261. package/lib/typescript/module/agent-creator/CharacterControls.d.ts +1 -2
  262. package/lib/typescript/module/agent-creator/CharacterControls.d.ts.map +1 -1
  263. package/lib/typescript/module/agent-creator/EmotionPicker.d.ts +0 -1
  264. package/lib/typescript/module/agent-creator/EmotionPicker.d.ts.map +1 -1
  265. package/lib/typescript/module/agent-creator/ShapeSilhouette.d.ts.map +1 -1
  266. package/lib/typescript/module/agent-creator/constants.d.ts +15 -7
  267. package/lib/typescript/module/agent-creator/constants.d.ts.map +1 -1
  268. package/lib/typescript/module/agent-creator/messages.d.ts.map +1 -1
  269. package/lib/typescript/module/app-shell/AppShellBars.d.ts +4 -0
  270. package/lib/typescript/module/app-shell/AppShellBars.d.ts.map +1 -1
  271. package/lib/typescript/module/app-shell/AppShellEngine.d.ts.map +1 -1
  272. package/lib/typescript/module/app-shell/types.d.ts +11 -3
  273. package/lib/typescript/module/app-shell/types.d.ts.map +1 -1
  274. package/lib/typescript/module/appearance/BloomScope.d.ts +1 -1
  275. package/lib/typescript/module/appearance/BloomScope.d.ts.map +1 -1
  276. package/lib/typescript/module/appearance/context.d.ts +2 -2
  277. package/lib/typescript/module/appearance/context.d.ts.map +1 -1
  278. package/lib/typescript/module/appearance/types.d.ts +4 -1
  279. package/lib/typescript/module/appearance/types.d.ts.map +1 -1
  280. package/lib/typescript/module/content-panel/ContentPanel.d.ts +3 -4
  281. package/lib/typescript/module/content-panel/ContentPanel.d.ts.map +1 -1
  282. package/lib/typescript/module/content-panel/ContentPanel.web.d.ts +1 -1
  283. package/lib/typescript/module/content-panel/ContentPanel.web.d.ts.map +1 -1
  284. package/lib/typescript/module/content-panel/types.d.ts +2 -2
  285. package/lib/typescript/module/design-tokens/shapes.d.ts +2 -2
  286. package/lib/typescript/module/index.d.ts +1 -0
  287. package/lib/typescript/module/index.d.ts.map +1 -1
  288. package/lib/typescript/module/index.web.d.ts +1 -0
  289. package/lib/typescript/module/index.web.d.ts.map +1 -1
  290. package/lib/typescript/module/mail-thread/MailMessage.d.ts.map +1 -1
  291. package/lib/typescript/module/mail-thread/MailThread.d.ts +1 -1
  292. package/lib/typescript/module/mail-thread/MailThread.d.ts.map +1 -1
  293. package/lib/typescript/module/mail-thread/shared.d.ts +1 -1
  294. package/lib/typescript/module/mail-thread/shared.d.ts.map +1 -1
  295. package/lib/typescript/module/mail-thread/types.d.ts +2 -0
  296. package/lib/typescript/module/mail-thread/types.d.ts.map +1 -1
  297. package/lib/typescript/module/page-footer/PageFooter.d.ts +7 -0
  298. package/lib/typescript/module/page-footer/PageFooter.d.ts.map +1 -0
  299. package/lib/typescript/module/page-footer/PageFooterProvider.d.ts +4 -0
  300. package/lib/typescript/module/page-footer/PageFooterProvider.d.ts.map +1 -0
  301. package/lib/typescript/module/page-footer/context.d.ts +3 -0
  302. package/lib/typescript/module/page-footer/context.d.ts.map +1 -0
  303. package/lib/typescript/module/page-footer/index.d.ts +5 -0
  304. package/lib/typescript/module/page-footer/index.d.ts.map +1 -0
  305. package/lib/typescript/module/page-footer/types.d.ts +26 -0
  306. package/lib/typescript/module/page-footer/types.d.ts.map +1 -0
  307. package/lib/typescript/module/page-footer/use-page-footer-inset.d.ts +7 -0
  308. package/lib/typescript/module/page-footer/use-page-footer-inset.d.ts.map +1 -0
  309. package/lib/typescript/module/sidebar/Sidebar.d.ts.map +1 -1
  310. package/lib/typescript/module/sidebar/types.d.ts +1 -1
  311. package/lib/typescript/module/styles/panel-chrome.d.ts +5 -0
  312. package/lib/typescript/module/styles/panel-chrome.d.ts.map +1 -1
  313. package/package.json +18 -1
  314. package/src/__tests__/support/adoption-matrix.ts +683 -0
  315. package/src/__tests__/support/card-surface.ts +25 -0
  316. package/src/__tests__/support/collision-fixture-barrel.ts +20 -0
  317. package/src/__tests__/support/commerce-harness.tsx +97 -0
  318. package/src/__tests__/support/composite.ts +68 -0
  319. package/src/__tests__/support/constructed-style-sheets.ts +68 -0
  320. package/src/__tests__/support/messages-in.ts +10 -0
  321. package/src/__tests__/support/press-host.ts +30 -0
  322. package/src/__tests__/support/rendered-style.ts +99 -0
  323. package/src/__tests__/support/unread-hook-fixture.ts +33 -0
  324. package/src/__tests__/support/worklet-capture-fixture.tsx +28 -0
  325. package/src/agent-avatar/AgentAvatar.tsx +1 -1
  326. package/src/agent-avatar/CharacterAvatar.tsx +1 -4
  327. package/src/agent-avatar/__tests__/artwork-golden.json +774 -0
  328. package/src/agent-avatar/config-character.ts +6 -39
  329. package/src/agent-avatar/legacy-recipe.ts +6 -34
  330. package/src/agent-creator/AgentCreatorBase.tsx +152 -121
  331. package/src/agent-creator/CharacterControls.tsx +14 -39
  332. package/src/agent-creator/EmotionPicker.tsx +16 -55
  333. package/src/agent-creator/ShapeSilhouette.tsx +1 -16
  334. package/src/agent-creator/__tests__/support/character-runtime-fixture.tsx +26 -0
  335. package/src/agent-creator/constants.ts +14 -47
  336. package/src/agent-creator/messages.ts +1 -2
  337. package/src/app-shell/AppShell.tsx +2 -2
  338. package/src/app-shell/AppShellBars.tsx +6 -4
  339. package/src/app-shell/AppShellEngine.tsx +51 -18
  340. package/src/app-shell/types.ts +11 -3
  341. package/src/appearance/BloomScope.tsx +5 -2
  342. package/src/appearance/context.ts +2 -2
  343. package/src/appearance/types.ts +4 -1
  344. package/src/content-panel/ContentPanel.tsx +32 -25
  345. package/src/content-panel/ContentPanel.web.tsx +32 -23
  346. package/src/content-panel/types.ts +2 -2
  347. package/src/design-tokens/shapes.ts +1 -1
  348. package/src/design-tokens/tokens.json +2 -2
  349. package/src/index.ts +1 -0
  350. package/src/index.web.ts +1 -0
  351. package/src/locale/translations/ar.ts +1 -1
  352. package/src/locale/translations/bn.ts +1 -1
  353. package/src/locale/translations/ca.ts +1 -1
  354. package/src/locale/translations/de.ts +1 -1
  355. package/src/locale/translations/es.ts +1 -1
  356. package/src/locale/translations/fr.ts +1 -1
  357. package/src/locale/translations/hi.ts +1 -1
  358. package/src/locale/translations/id.ts +1 -1
  359. package/src/locale/translations/it.ts +1 -1
  360. package/src/locale/translations/ja.ts +1 -1
  361. package/src/locale/translations/pt.ts +1 -1
  362. package/src/locale/translations/ru.ts +1 -1
  363. package/src/locale/translations/tr.ts +1 -1
  364. package/src/locale/translations/zh.ts +1 -1
  365. package/src/mail-thread/MailMessage.tsx +9 -11
  366. package/src/mail-thread/MailThread.tsx +3 -1
  367. package/src/mail-thread/shared.ts +2 -1
  368. package/src/mail-thread/types.ts +2 -0
  369. package/src/page-footer/PageFooter.tsx +96 -0
  370. package/src/page-footer/PageFooterProvider.tsx +9 -0
  371. package/src/page-footer/context.ts +6 -0
  372. package/src/page-footer/index.ts +4 -0
  373. package/src/page-footer/types.ts +26 -0
  374. package/src/page-footer/use-page-footer-inset.ts +17 -0
  375. package/src/sidebar/Sidebar.tsx +5 -4
  376. package/src/sidebar/types.ts +1 -1
  377. package/src/styles/panel-chrome.ts +9 -1
  378. package/src/theme/__tests__/__fixtures__/golden-resolved-tokens.json +9346 -0
  379. package/src/theme/__tests__/__fixtures__/tonal-glass-primary-failures.json +69 -0
  380. package/src/theme/__tests__/fixtures/color-engine-golden.json +1 -0
  381. package/assets/character-runtime/authored-parts.mjs +0 -754
  382. package/assets/character-runtime/catalog-parts.mjs +0 -362
  383. package/assets/character-runtime/character-recipe.mjs +0 -247
  384. package/assets/character-runtime/clippo-geometry.mjs +0 -679
  385. package/assets/character-runtime/controller-mode.mjs +0 -208
  386. package/assets/character-runtime/cyclops-geometry.mjs +0 -180
  387. package/assets/character-runtime/migrated-contours.mjs +0 -2067
  388. package/assets/character-runtime/migrated-faces.mjs +0 -59
  389. package/assets/character-runtime/pose-transition.mjs +0 -523
  390. package/assets/character-runtime/preparation-cache.mjs +0 -60
  391. package/assets/character-runtime/render-errors.mjs +0 -180
  392. package/assets/character-runtime/resolution.mjs +0 -10
  393. package/assets/character-runtime/sha256.mjs +0 -44
  394. package/assets/character-runtime/shared-programs.mjs +0 -534
  395. package/assets/character-runtime/shared-surface.mjs +0 -490
  396. package/assets/character-runtime/shared-textures.mjs +0 -420
  397. package/assets/character-runtime/thumbnails/eyes/todd.png +0 -0
  398. package/lib/commonjs/agent-avatar/character-colors.js +0 -19
  399. package/lib/commonjs/agent-avatar/character-colors.js.map +0 -1
  400. package/lib/commonjs/agent-avatar/character-shapes.js +0 -106
  401. package/lib/commonjs/agent-avatar/character-shapes.js.map +0 -1
  402. package/lib/commonjs/agent-creator/ClippoArtwork.js +0 -63
  403. package/lib/commonjs/agent-creator/ClippoArtwork.js.map +0 -1
  404. package/lib/commonjs/agent-creator/CyclopsArtwork.js +0 -45
  405. package/lib/commonjs/agent-creator/CyclopsArtwork.js.map +0 -1
  406. package/lib/commonjs/agent-creator/ToddArtwork.js +0 -29
  407. package/lib/commonjs/agent-creator/ToddArtwork.js.map +0 -1
  408. package/lib/module/agent-avatar/character-colors.js +0 -15
  409. package/lib/module/agent-avatar/character-colors.js.map +0 -1
  410. package/lib/module/agent-avatar/character-shapes.js +0 -97
  411. package/lib/module/agent-avatar/character-shapes.js.map +0 -1
  412. package/lib/module/agent-creator/ClippoArtwork.js +0 -59
  413. package/lib/module/agent-creator/ClippoArtwork.js.map +0 -1
  414. package/lib/module/agent-creator/CyclopsArtwork.js +0 -41
  415. package/lib/module/agent-creator/CyclopsArtwork.js.map +0 -1
  416. package/lib/module/agent-creator/ToddArtwork.js +0 -25
  417. package/lib/module/agent-creator/ToddArtwork.js.map +0 -1
  418. package/lib/typescript/commonjs/agent-avatar/character-colors.d.ts +0 -13
  419. package/lib/typescript/commonjs/agent-avatar/character-colors.d.ts.map +0 -1
  420. package/lib/typescript/commonjs/agent-avatar/character-shapes.d.ts +0 -19
  421. package/lib/typescript/commonjs/agent-avatar/character-shapes.d.ts.map +0 -1
  422. package/lib/typescript/commonjs/agent-creator/ClippoArtwork.d.ts +0 -6
  423. package/lib/typescript/commonjs/agent-creator/ClippoArtwork.d.ts.map +0 -1
  424. package/lib/typescript/commonjs/agent-creator/CyclopsArtwork.d.ts +0 -5
  425. package/lib/typescript/commonjs/agent-creator/CyclopsArtwork.d.ts.map +0 -1
  426. package/lib/typescript/commonjs/agent-creator/ToddArtwork.d.ts +0 -6
  427. package/lib/typescript/commonjs/agent-creator/ToddArtwork.d.ts.map +0 -1
  428. package/lib/typescript/module/agent-avatar/character-colors.d.ts +0 -13
  429. package/lib/typescript/module/agent-avatar/character-colors.d.ts.map +0 -1
  430. package/lib/typescript/module/agent-avatar/character-shapes.d.ts +0 -19
  431. package/lib/typescript/module/agent-avatar/character-shapes.d.ts.map +0 -1
  432. package/lib/typescript/module/agent-creator/ClippoArtwork.d.ts +0 -6
  433. package/lib/typescript/module/agent-creator/ClippoArtwork.d.ts.map +0 -1
  434. package/lib/typescript/module/agent-creator/CyclopsArtwork.d.ts +0 -5
  435. package/lib/typescript/module/agent-creator/CyclopsArtwork.d.ts.map +0 -1
  436. package/lib/typescript/module/agent-creator/ToddArtwork.d.ts +0 -6
  437. package/lib/typescript/module/agent-creator/ToddArtwork.d.ts.map +0 -1
  438. package/src/agent-avatar/character-colors.ts +0 -12
  439. package/src/agent-avatar/character-shapes.ts +0 -122
  440. package/src/agent-creator/ClippoArtwork.tsx +0 -49
  441. package/src/agent-creator/CyclopsArtwork.tsx +0 -27
  442. package/src/agent-creator/ToddArtwork.tsx +0 -24
@@ -32,13 +32,13 @@ The classification is an EQUALITY in `src/__tests__/adoption-matrix.test.ts`, no
32
32
 
33
33
  ## Totals
34
34
 
35
- - **211 families** in `src/`, **209** published (a subpath, the root barrel, or both). **44** carry a web fork.
35
+ - **212 families** in `src/`, **210** published (a subpath, the root barrel, or both). **44** carry a web fork.
36
36
  - Docs, stories and suites are gated as a standard by `src/__tests__/family-coverage.test.ts`; the per-family counts are in the table below.
37
37
 
38
38
  | contract | applies to | reads | delegated | n/a¹ | adaptation |
39
39
  | --- | --- | --- | --- | --- | --- |
40
40
  | Field membership | 48 | 22 | 0 | 21 | 5 |
41
- | Control presentation | 42 | 39 | 1 | 2 | 0 |
41
+ | Control presentation | 43 | 40 | 1 | 2 | 0 |
42
42
  | Trigger composition | 10 | 8 | 0 | 2 | 0 |
43
43
  | Controlled / uncontrolled state | 53 | 44 | 1 | 1 | 7 |
44
44
 
@@ -126,7 +126,7 @@ The classification is an EQUALITY in `src/__tests__/adoption-matrix.test.ts`, no
126
126
  | `animated-check` | `@oxy.so/bloom/animated-check` + barrel | universal | `animated-check.mdx` | yes | 2 | | | | |
127
127
  | `announcement` | `@oxy.so/bloom/announcement` + barrel | universal | `announcement.mdx` | yes | 2 | | | | |
128
128
  | `app-shell` | `@oxy.so/bloom/app-shell` + barrel | web fork | `app-shell.mdx` | yes | 6 | | | | reads |
129
- | `appearance` | `@oxy.so/bloom/appearance` + barrel | universal | `composition.mdx` | yes | 9 | | reads | | |
129
+ | `appearance` | `@oxy.so/bloom/appearance` + barrel | universal | `composition.mdx` | yes | 11 | | reads | | |
130
130
  | `aspect-ratio` | `@oxy.so/bloom/aspect-ratio` + barrel | universal | `aspect-ratio.mdx` | yes | 1 | | | | |
131
131
  | `auth-card` | `@oxy.so/bloom/auth-card` + barrel | universal | `auth-card.mdx` | yes | 2 | | | | |
132
132
  | `avatar` | `@oxy.so/bloom/avatar` + barrel | universal | `avatar.mdx` | yes | 7 | | reads | | |
@@ -136,7 +136,7 @@ The classification is an EQUALITY in `src/__tests__/adoption-matrix.test.ts`, no
136
136
  | `bottom-bar` | `@oxy.so/bloom/bottom-bar` + barrel | web fork | `bottom-bar.mdx` | yes | 2 | | | | |
137
137
  | `bottom-sheet` | `@oxy.so/bloom/bottom-sheet` + barrel | web fork | `bottom-sheet.mdx` | yes | 8 | | | | |
138
138
  | `breadcrumb` | `@oxy.so/bloom/breadcrumb` + barrel | universal | `breadcrumb.mdx` | yes | 2 | | | | |
139
- | `button` | `@oxy.so/bloom/button` + barrel | web fork | `button.mdx` | yes | 40 | | reads | n/a¹ | |
139
+ | `button` | `@oxy.so/bloom/button` + barrel | web fork | `button.mdx` | yes | 41 | | reads | n/a¹ | |
140
140
  | `button-group` | `@oxy.so/bloom/button-group` + barrel | web fork | `button-group.mdx` | yes | 8 | | reads | | |
141
141
  | `calendar` | `@oxy.so/bloom/calendar` + barrel | universal | `calendar.mdx` | yes | 3 | | | | reads |
142
142
  | `call-ui` | `@oxy.so/bloom/call-ui` + barrel | universal | `call-ui.mdx` | yes | 2 | | reads | | |
@@ -163,7 +163,7 @@ The classification is an EQUALITY in `src/__tests__/adoption-matrix.test.ts`, no
163
163
  | `connection-dots` | `@oxy.so/bloom/connection-dots` + barrel | web fork | `connection-dots.mdx` | yes | 2 | | | | |
164
164
  | `connection-status` | `@oxy.so/bloom/connection-status` + barrel | web fork | `connection-status.mdx` | yes | 1 | | | | |
165
165
  | `contact-card` | `@oxy.so/bloom/contact-card` + barrel | universal | `contact-card.mdx` | yes | 2 | | | | |
166
- | `content-panel` | `@oxy.so/bloom/content-panel` + barrel | web fork | `content-panel.mdx` | yes | 8 | | | | |
166
+ | `content-panel` | `@oxy.so/bloom/content-panel` + barrel | web fork | `content-panel.mdx` | yes | 9 | | | | |
167
167
  | `context-menu` | `@oxy.so/bloom/context-menu` + barrel | web fork | `context-menu.mdx` | yes | 6 | | | reads | |
168
168
  | `cover-header` | `@oxy.so/bloom/cover-header` + barrel | universal | `cover-header.mdx` | yes | 1 | | | | |
169
169
  | `creator-studio` | `@oxy.so/bloom/creator-studio` + barrel | universal | `creator-studio.mdx` | yes | 4 | | n/a¹ | | **adaptation** |
@@ -202,7 +202,7 @@ The classification is an EQUALITY in `src/__tests__/adoption-matrix.test.ts`, no
202
202
  | `job-board` | `@oxy.so/bloom/job-board` + barrel | universal | `job-board.mdx` | yes | 2 | n/a¹ | | | reads |
203
203
  | `kbd` | `@oxy.so/bloom/kbd` + barrel | universal | `kbd.mdx` | yes | 1 | | reads | | |
204
204
  | `label` | `@oxy.so/bloom/label` + barrel | universal | `label.mdx` | yes | 2 | | reads | | |
205
- | `layout` | `@oxy.so/bloom/layout` + barrel | universal | `layout.mdx` | yes | 9 | | | | |
205
+ | `layout` | `@oxy.so/bloom/layout` + barrel | universal | `layout.mdx` | yes | 10 | | | | |
206
206
  | `lead-score` | `@oxy.so/bloom/lead-score` + barrel | universal | `lead-score.mdx` | yes | 1 | | | | |
207
207
  | `link-preview` | `@oxy.so/bloom/link-preview` + barrel | universal | `link-preview.mdx` | yes | 3 | | | | |
208
208
  | `list` | `@oxy.so/bloom/list` + barrel | web fork | `list.mdx` | yes | 2 | | | | |
@@ -244,7 +244,8 @@ The classification is an EQUALITY in `src/__tests__/adoption-matrix.test.ts`, no
244
244
  | `order-status` | `@oxy.so/bloom/order-status` + barrel | universal | `order-status.mdx` | yes | 1 | | | | |
245
245
  | `outline-nav` | `@oxy.so/bloom/outline-nav` + barrel | universal | `outline-nav.mdx` | yes | 2 | | | | |
246
246
  | `overlay` | `@oxy.so/bloom/overlay` + barrel | universal | `overlay.mdx` | yes | 17 | | | | |
247
- | `page-header` | `@oxy.so/bloom/page-header` + barrel | universal | `page-header.mdx` | yes | 5 | | | | |
247
+ | `page-footer` | `@oxy.so/bloom/page-footer` + barrel | universal | `page-footer.mdx` | yes | 1 | | | | |
248
+ | `page-header` | `@oxy.so/bloom/page-header` + barrel | universal | `page-header.mdx` | yes | 6 | | | | |
248
249
  | `pagination` | `@oxy.so/bloom/pagination` + barrel | universal | `pagination.mdx` | yes | 2 | | | | |
249
250
  | `patient-info-card` | `@oxy.so/bloom/patient-info-card` + barrel | universal | `patient-info-card.mdx` | yes | 1 | | | | |
250
251
  | `payment-method` | `@oxy.so/bloom/payment-method` + barrel | universal | `payment-method.mdx` | yes | 3 | reads | | | |
@@ -281,7 +282,7 @@ The classification is an EQUALITY in `src/__tests__/adoption-matrix.test.ts`, no
281
282
  | `settings-modal` | `@oxy.so/bloom/settings-modal` + barrel | universal | `settings-modal.mdx` | yes | 10 | | | | reads |
282
283
  | `shapes` | `@oxy.so/bloom/shapes` + barrel | universal | `shapes.mdx` | yes | 4 | | | | |
283
284
  | `shipment-request` | `@oxy.so/bloom/shipment-request` + barrel | universal | `shipment-request.mdx` | yes | 1 | **adaptation** | | | |
284
- | `sidebar` | `@oxy.so/bloom/sidebar` + barrel | universal | `sidebar.mdx` | yes | 11 | n/a¹ | reads | | reads |
285
+ | `sidebar` | `@oxy.so/bloom/sidebar` + barrel | universal | `sidebar.mdx` | yes | 12 | n/a¹ | reads | | reads |
285
286
  | `skeleton` | `@oxy.so/bloom/skeleton` + barrel | universal | `skeleton.mdx` | yes | 1 | | | | |
286
287
  | `slider` | `@oxy.so/bloom/slider` + barrel | universal | `slider.mdx` | yes | 5 | reads | reads | | |
287
288
  | `social-button` | `@oxy.so/bloom/social-button` + barrel | web fork | `social-button.mdx` | yes | 2 | | reads | | |
@@ -292,9 +293,9 @@ The classification is an EQUALITY in `src/__tests__/adoption-matrix.test.ts`, no
292
293
  | `stay-search` | `@oxy.so/bloom/stay-search` + barrel | universal | `stay-search.mdx` | yes | 5 | | | | |
293
294
  | `stepper` | `@oxy.so/bloom/stepper` + barrel | universal | `stepper.mdx` | yes | 4 | reads | reads | | |
294
295
  | `sticker` | `@oxy.so/bloom/sticker` + barrel | web fork | `sticker.mdx` | yes | 1 | | | | |
295
- | `styles` | `@oxy.so/bloom/styles` + barrel | universal | `styles.mdx` | yes | 85 | n/a¹ | | | |
296
+ | `styles` | `@oxy.so/bloom/styles` + barrel | universal | `styles.mdx` | yes | 87 | n/a¹ | reads | | |
296
297
  | `subtle-hover` | `@oxy.so/bloom/subtle-hover` + barrel | universal | `subtle-hover.mdx` | yes | 1 | | | | |
297
- | `surface` | `@oxy.so/bloom/surface` + barrel | web fork | `surface.mdx` | yes | 39 | | | | |
298
+ | `surface` | `@oxy.so/bloom/surface` + barrel | web fork | `surface.mdx` | yes | 40 | | | | |
298
299
  | `surfaces` | `@oxy.so/bloom/surfaces` + barrel | web fork | `alert.mdx` | yes | 3 | | | | |
299
300
  | `swipe-row` | `@oxy.so/bloom/swipe-row` + barrel | universal | `swipe-row.mdx` | yes | 2 | | | | |
300
301
  | `switch` | `@oxy.so/bloom/switch` + barrel | universal | `switch.mdx` | yes | 7 | reads | reads | | reads |
@@ -307,7 +308,7 @@ The classification is an EQUALITY in `src/__tests__/adoption-matrix.test.ts`, no
307
308
  | `tenancy` | `@oxy.so/bloom/tenancy` + barrel | universal | `tenancy.mdx` | yes | 5 | | reads | | |
308
309
  | `text-field` | `@oxy.so/bloom/text-field` + barrel | universal | `text-field.mdx` | yes | 17 | reads | reads | | |
309
310
  | `textarea` | `@oxy.so/bloom/textarea` + barrel | universal | `textarea.mdx` | yes | 4 | reads | reads | | n/a¹ |
310
- | `theme` | `@oxy.so/bloom/theme` + barrel | web fork | `theme.mdx` | yes | 354 | | | n/a¹ | reads |
311
+ | `theme` | `@oxy.so/bloom/theme` + barrel | web fork | `theme.mdx` | yes | 356 | | | n/a¹ | reads |
311
312
  | `theme-toggle` | `@oxy.so/bloom/theme-toggle` + barrel | universal | `theme-toggle.mdx` | yes | 2 | n/a¹ | | | |
312
313
  | `toast` | `@oxy.so/bloom/toast` + barrel | universal | `toast.mdx` | yes | 17 | | | | |
313
314
  | `tooltip` | `@oxy.so/bloom/tooltip` + barrel | web fork | `tooltip.mdx` | yes | 1 | | | | |
@@ -26,70 +26,33 @@ Host the package's complete `assets/character-runtime/` directory. The provider
26
26
 
27
27
  ## Editing
28
28
 
29
- The `character` recipe holds a `preset` and optional `selections` for shape, color, eyes, eyewear and accessory. Explicit selections override preset defaults. `none` removes eyewear or an accessory. Changing shape preserves all selected face and accessory parts. Editing the eyes, eyewear, accessories or color keeps the named preset's original body until a new shape is explicitly selected.
29
+ The `character` recipe holds a `preset` and optional `selections` for shape, color, eyes, eyewear and accessory. Explicit selections override preset defaults. `none` removes eyewear or an accessory. The editor reads the engine's actual selection and availability, including shape-dependent eye styles. Changing shape clears an explicit eye override so an unsupported pair is not restored.
30
30
 
31
- All 21 shapes use that same recipe. The additional contours have ordinary shape IDs: `slender`, `pocket`, `petal`, `star`, `cloud`, `shield`, `pebble` and `squircle`. For example, `{ preset: 'lime_frog', selections: { shape: 'cloud', eyes: 'cyclops', color: 'blue', accessory: 'felipe_beret' } }` selects a blue cloud with one eye and Felipe's hat. A shape contributes geometry only; it never selects another preset, palette or set of parts. Named presets retain their own default colors, while switching bodies keeps the chosen palette color or explicit `bodyColor`. Historical paper/blob recipes retain their saved paint when first edited and are promoted into the same recipe format.
31
+ The editor presents one shape catalog and one eye catalog through `ShapeArc` and `EmotionPicker`. The eye orbit offers the engine’s nine native styles for both original and migrated bodies, with unsupported combinations disabled. Migrated bodies default to the original oval eyes. Saved expression, eye-size, spacing and tilt fields no longer modify a migrated face; the engine owns its eye geometry and animation. The shared `GlossArt` palette and custom color picker edit either body source. Original presets keep their authored appearance until explicitly edited.
32
32
 
33
- The editor presents one shape catalog and one eye catalog through `ShapeArc` and `EmotionPicker`. Its eyes include the engine’s nine native styles, Todd’s authored eyes, Clippo’s eyes and a single-eye style. `eyes: 'todd'` and `accessory: 'felipe_beret'` select the actual eyes from Todd and the three-piece beret from Felipe across the body catalog. Their original meshes, materials and animation deltas are copied in the preparation worker, fitted to each body and included in cache identities. The editor uses a static Todd-eye thumbnail; the shape wheel still uses silhouettes. Historical recipes without an explicit eye selection default to oval eyes. Historical expression, eye-size, `eyeGap` and tilt fields remain readable without modifying a migrated face. The shared `GlossArt` palette and custom color picker edit either body source.
34
-
35
- Each shape defines its own eye positions and size. Changing the eye style preserves that layout; changing shape adopts the new body's layout. Eye depth follows the actual body surface so shallow styles remain visible on bodies such as Todd. Eyewear fits the composed eyes, and a final rigid adjustment keeps crown accessories clear of eyes and frames. `selections.eyes: 'cyclops'` uses one large white eye with a teal iris, dark pupil and highlight at the shape's face center. There is no eye-placement control in AgentCreator. Historical `character.eyeSpacing` and `eyeGap` values remain readable but do not override the 3D layout. The **Universal Customization** and **Single Eye** stories exercise the shared editor and cross-body eye selections.
36
-
37
- `selections.shape: 'todd'` selects Todd's original body independently of its eye style. Its selector silhouette is sampled from the original mesh; no avatar runs inside the shape wheel. Editing a named preset's face or accessories preserves its original body, while an explicit shape selection replaces that body and retains the selected parts.
38
-
39
- `{ character: { preset: 'clippo' } }` selects Clippo’s grey open-wire body, large white eyes, dark pupils and asymmetric brows. `selections.shape: 'clippo'` and `selections.eyes: 'clippo'` are independent choices: other eyes can use the clip body, and other bodies can use Clippo’s face. Its tube is generated as a real hollow silhouette with rounded ends, without fur; it uses the same native character, lighting, interaction and work controller. Color, eyewear and headwear remain editable. The shape and eye wheels use static SVG thumbnails. Storybook’s **Clippo** story provides React/Work controls and cross-body examples.
40
-
41
- Alien avatars have been removed from the available catalog. Saved aliens, mascots and hidden-face recipes retain compatibility rendering. The shape selector shows static silhouettes without eyes or accessories: original catalog PNGs and cached SVG contours for migrated bodies. Paper grain and material effects become the engine’s 3D surface. Migrated bodies accept the original eyewear and accessory catalog. Headwear, Bulb, bow and Tuft use rigid contour anchors; eyewear fits the final eye geometry and headphones use body anchors. Original meshes, materials and fur remain intact.
33
+ Alien avatars have been removed from the available catalog. Saved aliens, mascots and hidden-face recipes retain compatibility rendering. The shape selector shows static silhouettes without eyes or accessories: original catalog PNGs and cached SVG contours for migrated bodies. Paper grain and material effects become the engine’s 3D surface. Migrated bodies accept the original eyewear and accessory catalog. Headwear, Bulb, bow and Tuft use rigid contour anchors; eyewear and headphones retain their original placement. Original meshes, materials and fur remain intact.
42
34
 
43
35
  ## Interaction and lifecycle
44
36
 
45
- `interactive` enables the original engine's pointer tracking and touch/drag interaction. Change `reactionKey` from an accessible button to play the authored signature selected by the current body. Named bodies retain their native profile, including Todd and Jojo, after face, color or accessory edits. Catalog shapes with an authored counterpart use its body profile. Bodies without a matching profile, including Clippo and distinct migrated contours, use Todd's original signature as their shared standard. Pointer/touch reactions use the same body profile and preserve the edited appearance. Shape changes retain the last painted frame while the new geometry prepares. Changing `workingKey` starts a working episode and then returns to the interactive mode; `workingCycles` controls its duration. The creator’s **React** and **Work** buttons preview these original animations for both original and migrated bodies. Work preserves the chosen body and fitted face and accessories. Both modes retain the same native character, prepared geometry and clock while resident. Activity props are prepared up front; a verified adapter selects the original controller. A 180 ms transition interpolates body/skin transforms and camera in 3D from the last presented pose; added work props follow their original animation. Work finishes its original outro before a queued reaction starts. Repeated requests invalidate stale stop timers. Pause-related appearance changes and offscreen reclamation have separate lifecycles.
37
+ `interactive` enables the original engine's pointer tracking and touch/drag interaction. Change `reactionKey` from an accessible button to replay its authored signature reaction for an intact preset, or the original 3D wave for customized and migrated bodies. Shape changes retain the last painted frame while the new geometry prepares. Changing `workingKey` starts a working episode and then returns to the interactive mode; `workingCycles` controls its duration. The creator’s **React** and **Work** buttons preview these original animations for both original and migrated bodies.
46
38
 
47
39
  `paused`, reduced motion and `motion: 0` stop animation after a complete appearance frame. `portrait` prepares a static thumbnail. The beta can report readiness while drawing transparency if initialized with its reduced-motion flag; the adapter waits for painted pixels and then freezes its clock instead.
48
40
 
49
- Web uses one physical WebGL2 context and a packed canvas shared by every visible, animated character. Each original or migrated avatar keeps its own animation, input, work state and render targets. `shared-surface.mjs` maps default-framebuffer operations into its region, resolves MSAA locally before the atlas copy, and clips presentation to prevent neighbouring avatars leaking into a fitted image. Deleting one character cannot destroy the shared context; the last lease releases it. The shared clock targets 30 fps with a round-robin submission allowance; this is a target, not a guarantee of 30 fps per avatar on every device.
50
-
51
- Shaders and linked programs are shared by exact source and attribute bindings. Logical program handles retain independent uniforms and Emscripten metadata; switching skips values already present on the physical program. Small avatars (up to 128 CSS pixels) use the original compact mesh. The drawing resolution uses DPR at most 1 up to 64 CSS pixels, 1.5 up to 128, and 2 above that, with a 64-pixel floor and 512-pixel ceiling. The original engine derives its fur draw count from that drawing size, so reducing prepared fur arrays would not reduce its draw calls. Original fur and materials remain in use. The two 512-pixel mipmapped RGBA8 images and the 576×960 RGBA8 atlas share storage only when bytes and parameters match exactly; mutation or framebuffer attachment creates an independent copy. Private render targets, mutable geometry buffers and other textures remain per-character.
52
-
53
- The scheduler submits at most eight avatars per batch within an 8 ms CPU allowance, then waits asynchronously on a WebGL fence before checking driver errors and copying images. This releases the JavaScript thread while the GPU finishes; it does not make that GPU work free. Native setup/probing and Emscripten’s own `GL.lastError` checks retain their behavior. A graphics error discards every pending image in that batch and reports failure to its touched characters. Appearance edits, resize and disposal wait for the batch to finish. Pointer capture happens synchronously on pointer-down; native input is queued in order. A single native render remains non-interruptible. Diagnostics separate `renderMilliseconds` (submission plus presentation CPU time) from `renderWaitMilliseconds` (elapsed wait and task dispatch, not a GPU timer).
54
-
55
- Original and migrated bodies share one rendering WASM module and one preparation worker (the worker owns its own WASM instance). Prepared geometry identities include the contour and attachment transform. Cold preparation is admitted serially, while already painted moving avatars remain resident. Its owner receives a render turn every batch until its first complete paint, preventing the resident crowd from delaying the next preparation. The most recent interaction receives priority on alternate batches; the remaining turns use round-robin scheduling. Exact contour preparations are cached with an 8 MiB/16-entry LRU bound, keyed by appearance bytes, quality, activity mode, contour and authored parts. Cache hits receive independent buffer copies; native delivery still waits for the GPU boundary. Offscreen/background characters release their lease and retain their last complete 2D image. Static portraits use a bounded 64-image cache and release rendering resources after painting. Storybook’s **Many Avatars** story exercises 48 original/migrated avatars with React/Work controls and scrolling. **Shared Parts** shows Todd’s eyes and Felipe’s beret on all 21 shapes, with default-part, pause and animation controls.
56
-
57
- ### Physical-device measurements
58
-
59
- The [current controller/transition benchmark](./benchmarks/avatar-continuous-renderer.json) uses a Pixel 8a (Mali-G715, Android 16, Android WebView 148), with all avatars visible at 48 CSS pixels and 64 backing pixels. Original presets and migrated contours alternate. After every avatar is ready, a three-second warmup precedes a roughly five-second sample. Output pixel hashes confirm that every avatar moves; page RAF cadence is measured separately from each avatar's paint rate. The artifact records the exact tested asset hashes; it predates the authored Todd/Felipe part compositor.
60
-
61
- | Visible avatars | Median paints per avatar per second | Page RAF interval, p95 | Time until all are ready | WebGL contexts |
62
- | --- | --- | --- | --- | --- |
63
- | 24 | 4.42 | 25.1 ms | 14.85 s | 1 |
64
- | 48 | 2.29 | 25.1 ms | 24.80 s | 1 |
65
-
66
- These results remove context loss, but **do not deliver fluid 30 fps animation**. The [previous baseline](./benchmarks/avatar-shared-renderer.json) took 24.6/74.1 seconds until all avatars were ready, with mean paint rates of 3.76/2.59 Hz. Startup improves substantially; drawing throughput does not improve uniformly. An [intermediate snapshot](./benchmarks/avatar-deferred-renderer.json) isolates deferred GPU waiting before eager activity preparation. These are individual runs, not controlled repeated trials or sustained thermal measurements. Readiness uses a new document/engine and warm HTTP caches. Pixel-hash sampling adds readback overhead.
41
+ Web shares the beta engine and one animation clock per document, with a shared budget of **four live renderers** across original and migrated avatars. Additional avatars retain real 3D pixels from their last completed frame while their GPU renderer is released. Pointer interaction and React/Work commands prioritize reclaiming a renderer; overflow images remain visible while that renderer prepares. A newly visible avatar without a cached frame waits for its first rendering slot; preparation is one avatar at a time, and an `interactive` avatar (the editor's live preview, whose capabilities enable the editor's eye and colour controls) is admitted before passive thumbnails mounted ahead of it. This bounds graphics resources; the recovered engine’s synchronous first preparation can still cause a long task, especially for uncached migrated contours. Leaving the viewport or hiding the document releases the renderer lease, and returning avatars can display their retained image before resuming animation.
67
42
 
68
- Current CPU submission/presentation p95 is 10.0/10.4 ms per batch at 24/48, excluding asynchronous GPU wait. Exact texture sharing avoids a calculated 109.85/224.47 MiB of duplicate requested mip storage. These are payload calculations, not total GPU memory measurements. Both runs have nine physical programs, all avatars moving, zero graphics errors and zero live contexts/characters/preparation jobs after cleanup. Interaction and same-character React/Work continuity are checked separately in browser gates.
43
+ Different migrated contours isolate their rendering modules because the recovered engine caches geometry by its original appearance key; they share one preparation worker. Unused contour modules are released. Use `portrait` for galleries and selectors. Static preparation is serialized and the image cache is bounded to 64 entries; unmount releases listeners and rendering resources. Storybook’s **Many Avatars** story exercises 48 original/migrated avatars with per-avatar React/Work controls and document scrolling.
69
44
 
70
45
  In the repository, run the scheduler tests and the browser budget check (with Storybook running):
71
46
 
72
47
  ```bash
73
- node --test scripts/test-avatar-render-budget.mjs scripts/test-avatar-preparation-scope.mjs scripts/test-avatar-render-errors.mjs scripts/test-avatar-preparation-cache.mjs scripts/test-avatar-preparation-delivery.mjs scripts/test-avatar-gl-dispatch.mjs scripts/test-avatar-managed-commands.mjs scripts/test-avatar-character-recipe.mjs scripts/test-avatar-clippo-geometry.mjs scripts/test-avatar-authored-parts.mjs scripts/test-avatar-controller-mode.mjs scripts/test-avatar-pose-transition.mjs
74
- node scripts/verify-avatar-shared-surface.mjs
75
- node scripts/verify-avatar-shared-programs.mjs
76
- node scripts/verify-avatar-shared-textures.mjs
77
- node scripts/verify-avatar-runtime-errors.mjs
78
- node scripts/verify-avatar-preparation-scope.mjs
48
+ node --test scripts/test-avatar-render-budget.mjs
79
49
  node scripts/verify-avatar-render-budget.mjs
80
- node scripts/verify-avatar-shared-renderer.mjs
81
- node scripts/verify-avatar-deferred-input.mjs
82
- node scripts/verify-avatar-controller-continuity.mjs
83
- node scripts/verify-avatar-pose-transition.mjs
84
- node scripts/verify-avatar-authored-parts.mjs
85
- node scripts/verify-avatar-clippo.mjs
86
- node scripts/verify-avatar-editor.mjs
87
50
  ```
88
51
 
89
52
  `className` and `style` apply to the outer layout node through Bloom's NativeWind wrapper. `label` defaults to the translated “Agent avatar”; `locale` overrides the scope and `accessibilityLabel` overrides the name. Prefer a meaningful name when the avatar identifies an agent.
90
53
 
91
54
  ## Native and fallback
92
55
 
93
- The optional native bridge uses `react-native-webview` and requires an absolute runtime URL reachable by the device. The web adapter is also exercised in a physical Android WebView; that does not validate a React Native multi-WebView screen. Each native WebView owns a separate document, so context sharing is **per document, not application-wide on native**. Separate WebViews cannot share engine memory, graphics contexts or the web document’s viewport reclamation.
56
+ The optional native bridge uses `react-native-webview` and requires an absolute runtime URL reachable by the device. Web is verified in Chrome; physical-device validation remains pending. Each native WebView owns a separate document, so the four-renderer web budget is **not an application-wide native limit**. Separate WebViews cannot share engine memory, graphics contexts or the web document’s viewport reclamation.
94
57
 
95
58
  An unavailable runtime or missing native peer displays the translated unavailable state. Consumers without a runtime provider retain the universal SVG renderer for procedural recipes. That renderer preserves the original contours, folds, expression springs and deterministic grain; it does not support the beta's new 3D parts.
@@ -25,17 +25,9 @@ Mount under `BloomProvider` and give the editor a bounded height. Layout classes
25
25
 
26
26
  ## Appearance
27
27
 
28
- The preview is 162px. With `AgentAvatarProvider`, one shape arc combines the eleven original engine shapes, Todd's original body, Clippo's wire body and eight distinct migrated bodies: pebble, squircle, slender, pocket, petal, star, cloud and shield. Equivalent circle, triangle, flower, diamond and heart recipes reuse the original geometry. `selections.shape: 'todd'` independently selects Todd's actual body with any eye style. Its static pink SVG thumbnail comes from projected intersections of the original body mesh, without loading an avatar renderer. Alien avatars have been removed from the available catalog and examples; saved alien recipes remain readable for compatibility.
28
+ The preview is 162px. With `AgentAvatarProvider`, one shape arc combines the eleven original engine shapes with eight distinct migrated bodies: pebble, squircle, slender, pocket, petal, star, cloud and shield. Equivalent circle, triangle, flower, diamond and heart recipes reuse the original geometry. Alien avatars have been removed from the available catalog and examples; saved alien recipes remain readable for compatibility.
29
29
 
30
- Every shape writes the same `character.selections.shape` field. The eight added contour IDs are plain names such as `cloud` and `pebble`; selecting one keeps the current preset, named palette or custom RGB, eyes, eyewear and accessory. Crossing between contours and original geometry retains the mounted avatar. The renderer resolves the body geometry separately from the appearance. Historical saved recipes are promoted with their existing color instead of being reset to a different preset.
31
-
32
- The eye orbit offers nine original 3D eye styles plus Todd, Clippo and Single eye for both body sources. Changing shape preserves the selected eyes, eyewear and accessory. Named presets provide their original defaults; choosing another eye style retains the preset's body. Historical recipes without an explicit eye selection default to oval eyes. Historical expression, eye-size, `eyeGap` and tilt settings remain readable; the engine owns the 3D face geometry and animation.
33
-
34
- Known eye, color, eyewear and accessory choices stay available while a new appearance prepares. A pending capability response does not disable the controls or replace the current recipe with provisional defaults. Shape-comparison stories use one shared appearance across all bodies, including the same color, rather than giving old contours a separate flesh-colored default.
35
-
36
- **Eye placement belongs to the shape.** Each body defines eye positions and size; every interchangeable eye style uses that layout. Changing shape automatically adopts its face layout without introducing another editor control. Historical `character.eyeSpacing` values remain readable for saved-recipe compatibility and are ignored by the renderer. Storybook's **Universal Customization** story starts with Todd and shows the saved recipe beside the existing editor.
37
-
38
- **Single eye** (`selections.eyes: 'cyclops'`) selects a large white eye with a teal iris, dark pupil and highlight on any body. Its orbit thumbnail is static SVG artwork. It uses the selected shape’s face center and size. Storybook's **Single Eye** story shows it on the original and migrated shapes.
30
+ The eye orbit offers nine original 3D eye styles for both body sources. Migrated bodies default to oval eyes; historical expression, eye-size, spacing and tilt settings no longer alter their faces. The engine owns eye geometry and animation, and its capabilities disable unsupported combinations. Changing shape clears an incompatible eye override. Original presets keep their authored eyes until explicitly edited.
39
31
 
40
32
  Upright eye chips orbit at a 116px radius; dragging or a mouse wheel rotates the orbit. Hover, focus, backgrounding and reduced motion pause automatic movement. The shape selector uses a 210px circular track, an unbounded index, spring, drag and wheel geometry. Choose a silhouette by pressing it; keyboard arrows, Home and End select shapes on web. BloomProvider’s direction reverses horizontal movement in RTL.
41
33
 
@@ -43,9 +35,7 @@ Nine glossy color presets and the shared custom picker edit both original and mi
43
35
 
44
36
  The preview accepts pointer and touch reactions. **React** and **Work** buttons also support keyboard activation and preview the original engine’s animations on either body source. Working returns to the interactive preview after its episode. Eye chips and original shape chips use catalog PNG thumbnails. Migrated shape chips use cached static SVG silhouettes from their actual contours, matching the catalog’s flat pink artwork. The shape wheel renders no avatars or 3D canvases.
45
37
 
46
- The named Clippo preset uses a grey open wire body, large ring eyes and asymmetric eyebrows. Its body and eyes are independent catalog choices; the Clippo eyes remain selected when choosing another original or migrated shape. Clippo chips use static SVG artwork, with an open stroked path for the body and no avatar renderer in the wheel. Saved configurations use `character.preset: 'clippo'` or `character.selections.shape` / `character.selections.eyes` with ID `clippo`.
47
-
48
- The preset selector provides authored characters; eyewear and accessories use Bloom Select on both original and migrated bodies. Explicit selections survive switching between these bodies. Headwear, Bulb, bow and Tuft attach to migrated contour anchors; eyewear fits the final eye geometry and headphones use body anchors. Reactions follow the body's original native signature after customization; catalog shapes with an authored counterpart use its profile, while unmatched shapes, Clippo and distinct migrated contours use Todd's signature as the shared standard. Work keeps the chosen body and fitted parts. Catalog titles retain their original English names by default. Hosts can translate them through `labels.characterOption(category, id, title)`; control labels follow the editor locale. Consumers without a runtime provider retain compatibility rendering and controls for saved procedural recipes.
38
+ The preset selector provides authored characters; eyewear and accessories use Bloom Select on both original and migrated bodies. Explicit selections survive switching between these bodies. Headwear, Bulb, bow and Tuft attach to migrated contour anchors; eyewear and headphones keep their original placement. Intact presets retain their authored signature reaction; edited and migrated bodies use the original 3D wave. Catalog titles retain their original English names by default. Hosts can translate them through `labels.characterOption(category, id, title)`; control labels follow the editor locale. Consumers without a runtime provider retain compatibility rendering and controls for saved procedural recipes.
49
39
 
50
40
  ## Preferences and speech
51
41
 
@@ -219,14 +219,33 @@ phone, and a negative margin is wrong the moment the page's padding changes.
219
219
  know its own width. It has no `compact`/`always` switch: a compose button is
220
220
  not phone chrome, so it is drawn whenever it is given — pass `null` to drop it.
221
221
 
222
- Both bars are MEASURED, and the content column reserves exactly their height, so
223
- the last row of a feed is never hidden behind them. Measured in Chrome at 390,
222
+ Both bars are MEASURED. By default the content column reserves their height, so
223
+ the last row of a feed is never hidden behind them. A dashboard with
224
+ `reserveBottomBarSpace={false}` keeps the bottom bar over the full-height content,
225
+ including with `scroll="fixed"`. Its scrollers should apply
226
+ `useBottomEdgeInset()` from `@oxy.so/bloom/layout` as bottom content padding, so
227
+ the final item can scroll clear while the page background continues underneath. Measured in Chrome at 390,
224
228
  scrolled to the page end: last item bottom `768`, action top `784`, bar top `844`.
225
229
 
226
230
  With a content panel, the reserved clearance stays inside its painted surface.
227
231
  In the compact full-width layout, bottom chrome also inherits that panel fill,
228
232
  so its fading backdrop does not introduce a strip of the outer page color.
229
233
 
234
+
235
+ **Native safe-area ownership.**
236
+
237
+ Use `<AppShell safeArea scroll="fixed" ...>` when the shell owns the whole
238
+ native screen. The frame protects its top and side edges, including landscape
239
+ notches, and keeps reveal navigation inside the same safe frame. Portaled
240
+ navigation drawers use the device's original insets. Web geometry is unchanged;
241
+ `safeArea` defaults to `false` for existing embedded shells.
242
+
243
+ When bottom chrome is visible, the bottom-bar slot or floating action retains
244
+ ownership of the bottom inset. Otherwise the frame reserves it. There is no
245
+ second bottom inset around a bar. Set `safeArea={false}` on descendant
246
+ `PageHeader` components because the shell already protects their top edge.
247
+ The real `SafeAreaInsetsContext` remains intact for fullscreen dialogs.
248
+
230
249
  `topBarVisibility` / `bottomBarVisibility` are `compact` (the default — only
231
250
  while the nav is a drawer, the phone case the slots exist for) or `always`, for
232
251
  a bar that is part of the app at every width.
@@ -665,3 +684,8 @@ ProOfferCard retains its animated complementary host and decorative artwork, wit
665
684
  The detail remains mounted while `showList` changes; hiding a pane explicitly unmounts that pane. Defaults match AppShell's split layout: list width 360 (range 280–520), info width 320, scrolling and resizing enabled. `showDetail` defaults to true; list/info visibility follows the supplied content. Set `paneScroll={false}` when routes or virtualized lists own their scrolling. The surrounding Bloom container must provide a bounded height.
666
685
 
667
686
  Use `variant="separated"` when each pane supplies its own `AiChatContainer`. Bloom inserts 12px transparent gutters and centers the existing resize handle in the list gutter; there is no extra surface around the panels. A single visible pane has no gutter. The default `joined` variant retains hairline dividers for panes inside one shared surface.
687
+
688
+ To fill wide displays without a reading-column cap, set
689
+ `contentMaxWidth="none"`. The default remains 1300. Dashboard reveal layouts
690
+ honor an explicit `gutter`, including `gutter={0}` for edge-to-edge compact
691
+ content; omitting it preserves the existing 12px frame and wider-screen top gap.
@@ -37,7 +37,22 @@ import { Button } from '@oxy.so/bloom/button';
37
37
  </BloomScope>
38
38
  ```
39
39
 
40
- Explicit props win over the nearest scope, which wins over the family's defaults. A nested scope inherits unspecified values. Scopes render no layout node and never carry actions, selection, disabled state, or screen geometry. `appearance` remains explicit so a scope cannot silently turn every control into a filled primary action.
40
+ Explicit props win over the nearest scope, which wins over the family's defaults. A nested scope inherits unspecified values. Scopes render no layout node and never carry actions, selection, disabled state, or screen placement. `appearance` remains explicit so a scope cannot silently turn every control into a filled primary action.
41
+
42
+ ### Panel corners
43
+
44
+ `BloomScope panelRadius={28}` sets the shared corner radius for `Sidebar surface="card"`
45
+ and framed `ContentPanel` surfaces. The default is 28; any finite non-negative number
46
+ is accepted, including zero. Nested scopes inherit it independently of size and tone.
47
+ The surface, its material, the content clip and web frame/mask all use that radius.
48
+ Plain/docked sidebars and unframed panels remain square. Control corners are unchanged.
49
+
50
+ ```tsx
51
+ <BloomScope size="md" panelRadius={20}>
52
+ <Sidebar items={items} />
53
+ <ContentPanel framed>{children}</ContentPanel>
54
+ </BloomScope>
55
+ ```
41
56
 
42
57
  ## Actions and icons
43
58
 
@@ -255,3 +255,7 @@ last content without nested vertical scroll containers.
255
255
  ### Shared surface paint
256
256
 
257
257
  The painted host delegates its fill to Surface: a 90%-opacity body with a subtle refracted edge on web, plus the shared sheen and rim. The host itself stays transparent to avoid painting twice. Explicit alpha colours retain their alpha; descendants receive the corresponding composited fill. Plain or unframed content keeps its existing layout behavior.
258
+
259
+ Panel corners inherit `BloomScope panelRadius` (28 by default), matching card sidebars. Both preserve the circular corner shape of the content panel on web and native.
260
+ `chrome="none"` removes the border, shadow and material rim/sheen while retaining the
261
+ framed radius and content clipping. Use it for a reader pane that should have a plain fill.
@@ -119,3 +119,11 @@ identically-named buttons is a thread a screen-reader user cannot navigate.
119
119
  The star, the `menu` slot and the three replies are SIBLINGS of the disclosure,
120
120
  never children. A button inside a button is invalid, and the press target would
121
121
  be ambiguous.
122
+
123
+ ## Message surfaces and spacing
124
+
125
+ Collapsed and expanded messages use the same solid `Card`, with radius-16,
126
+ no border and small elevation. Expanding changes the contents without replacing
127
+ the card host, so focus stays on the disclosure. `MailThread` separates the
128
+ cards and the earlier-messages control by `space.md` (12); `messageGap` can
129
+ adjust that spacing without wrapping or restyling individual messages.
@@ -0,0 +1,60 @@
1
+ # PageFooter
2
+
3
+ Page-local actions float over a bounded scroller, above the app's bottom
4
+ navigation. The background uses the same surface color and gradient as
5
+ `PageHeader`, mirrored upward. Content continues behind the footer; the measured
6
+ clearance lets the last item scroll fully above its controls.
7
+
8
+ ```tsx
9
+ import { ScrollView, View } from 'react-native';
10
+ import { Button, PageFooter, PageFooterProvider, usePageFooterInset } from '@oxy.so/bloom';
11
+
12
+ function Message() {
13
+ const bottom = usePageFooterInset();
14
+ return (
15
+ <View style={{ flex: 1, minHeight: 0 }}>
16
+ <ScrollView contentContainerStyle={{ paddingBottom: bottom }}>
17
+ <MessageBody />
18
+ </ScrollView>
19
+ <PageFooter
20
+ actions={<><Button onPress={reply}>Reply</Button><Button onPress={forward}>Forward</Button></>}
21
+ />
22
+ </View>
23
+ );
24
+ }
25
+
26
+ export function MessagePane() {
27
+ return <PageFooterProvider><Message /></PageFooterProvider>;
28
+ }
29
+ ```
30
+
31
+ The provider adds no layout and belongs around one pane. `usePageFooterInset()`
32
+ returns the footer's measured row height, its safe-area padding, and its bottom
33
+ offset. Use it **instead of** adding the bottom navigation inset again. It
34
+ starts with a 56px row estimate and updates when controls wrap or text scales;
35
+ the decorative gradient tail does not reserve layout. Removing the footer
36
+ (for example while replying) releases its clearance. If navigation still
37
+ overlaps the scroller then, retain its `useBottomEdgeInset()` as a fallback.
38
+
39
+ `bottomInset` defaults to Bloom's occupied bottom edge. `AppShell bottomBar`
40
+ publishes that measurement, including the safe area. Pass `bottomInset={0}`
41
+ when the containing frame already ends above navigation, or in a desktop pane
42
+ whose bottom edge differs from the app's. When the shell owns safe-area
43
+ handling, pass `safeArea={false}`. Otherwise the footer adds the native bottom
44
+ safe area only when its bottom offset is zero; web requires `safeArea` opt-in.
45
+
46
+ The footer reads the global bottom-edge registry but publishes its footprint
47
+ only in its local provider. It never increases the inset it uses to position
48
+ itself. Two panes have independent providers and measurements.
49
+
50
+ `actions` inherits the surrounding `BloomScope` size and supports wrapping.
51
+ `children` is an optional flexible slot before the actions. Group related
52
+ controls with `ButtonGroup` when desired. The scrim and the space between
53
+ controls let pointer events pass through. The gradient has no motion, including
54
+ when reduced motion is enabled. `scrim="none"` removes it; `scrimColor` overrides
55
+ the inherited opaque surface color. `style` and `testID` address the outer host.
56
+
57
+ This is page chrome, always absolutely positioned inside a bounded parent.
58
+ Place it beside the scroller, never inside its scrolling content. A purchase
59
+ summary with price and booking controls belongs to `ActionBar`, which has a
60
+ different opaque, in-flow layout contract.
package/docs/sidebar.mdx CHANGED
@@ -148,7 +148,7 @@ Two apps with the same rows should not look like the same app. That difference i
148
148
 
149
149
  | surface | what it draws |
150
150
  | -------- | ------------------------------------------------------------------ |
151
- | `card` | radius 24, a hairline and the panel shadow, on the panel fill |
151
+ | `card` | shared panel radius (28 by default), a hairline and the panel shadow, on the panel fill |
152
152
  | `plain` | no radius, no border, no shadow — the rows sit straight on the page |
153
153
  | `docked` | the panel fill, square corners, ONE hairline on the inner edge, full height |
154
154
 
@@ -19,7 +19,7 @@ const AgentAvatar = exports.AgentAvatar = /*#__PURE__*/(0, _react.memo)(function
19
19
  const legacy = runtimeUrl && !(0, _legacyRecipe.legacyRecipeUnsupported)(props.config);
20
20
  return beta || legacy ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_CharacterAvatar.CharacterAvatar, {
21
21
  ...props
22
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_ProceduralAvatar.ProceduralAvatar, {
22
+ }, beta ? 'character' : 'legacy') : /*#__PURE__*/(0, _jsxRuntime.jsx)(_ProceduralAvatar.ProceduralAvatar, {
23
23
  ...props
24
24
  });
25
25
  });
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_CharacterAvatar","_ProceduralAvatar","_context","_legacyRecipe","_jsxRuntime","AgentAvatar","exports","memo","props","runtimeUrl","useContext","CharacterRuntimeContext","beta","config","character","preset","legacy","legacyRecipeUnsupported","jsx","CharacterAvatar","ProceduralAvatar"],"sourceRoot":"../../../src","sources":["agent-avatar/AgentAvatar.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAD,OAAA;AACA,IAAAE,iBAAA,GAAAF,OAAA;AACA,IAAAG,QAAA,GAAAH,OAAA;AACA,IAAAI,aAAA,GAAAJ,OAAA;AAA0D,IAAAK,WAAA,GAAAL,OAAA;AAG1D;AACO,MAAMM,WAAW,GAAAC,OAAA,CAAAD,WAAA,gBAAG,IAAAE,WAAI,EAAC,SAASF,WAAWA,CAACG,KAAuB,EAAE;EAC5E,MAAM;IAAEC;EAAW,CAAC,GAAG,IAAAC,iBAAU,EAACC,gCAAuB,CAAC;EAC1D,MAAMC,IAAI,GACRJ,KAAK,CAACK,MAAM,CAACC,SAAS,IAAIN,KAAK,CAACK,MAAM,CAACC,SAAS,CAACC,MAAM,KAAK,OAAO;EACrE,MAAMC,MAAM,GAAGP,UAAU,IAAI,CAAC,IAAAQ,qCAAuB,EAACT,KAAK,CAACK,MAAM,CAAC;EACnE,OAAOD,IAAI,IAAII,MAAM,gBACnB,IAAAZ,WAAA,CAAAc,GAAA,EAAClB,gBAAA,CAAAmB,eAAe;IAAA,GAAKX;EAAK,CAAG,CAAC,gBAE9B,IAAAJ,WAAA,CAAAc,GAAA,EAACjB,iBAAA,CAAAmB,gBAAgB;IAAA,GAAKZ;EAAK,CAAG,CAC/B;AACH,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","_CharacterAvatar","_ProceduralAvatar","_context","_legacyRecipe","_jsxRuntime","AgentAvatar","exports","memo","props","runtimeUrl","useContext","CharacterRuntimeContext","beta","config","character","preset","legacy","legacyRecipeUnsupported","jsx","CharacterAvatar","ProceduralAvatar"],"sourceRoot":"../../../src","sources":["agent-avatar/AgentAvatar.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAD,OAAA;AACA,IAAAE,iBAAA,GAAAF,OAAA;AACA,IAAAG,QAAA,GAAAH,OAAA;AACA,IAAAI,aAAA,GAAAJ,OAAA;AAA0D,IAAAK,WAAA,GAAAL,OAAA;AAG1D;AACO,MAAMM,WAAW,GAAAC,OAAA,CAAAD,WAAA,gBAAG,IAAAE,WAAI,EAAC,SAASF,WAAWA,CAACG,KAAuB,EAAE;EAC5E,MAAM;IAAEC;EAAW,CAAC,GAAG,IAAAC,iBAAU,EAACC,gCAAuB,CAAC;EAC1D,MAAMC,IAAI,GACRJ,KAAK,CAACK,MAAM,CAACC,SAAS,IAAIN,KAAK,CAACK,MAAM,CAACC,SAAS,CAACC,MAAM,KAAK,OAAO;EACrE,MAAMC,MAAM,GAAGP,UAAU,IAAI,CAAC,IAAAQ,qCAAuB,EAACT,KAAK,CAACK,MAAM,CAAC;EACnE,OAAOD,IAAI,IAAII,MAAM,gBACnB,IAAAZ,WAAA,CAAAc,GAAA,EAAClB,gBAAA,CAAAmB,eAAe;IAAA,GAAyCX;EAAK,GAAxCI,IAAI,GAAG,WAAW,GAAG,QAAsB,CAAC,gBAElE,IAAAR,WAAA,CAAAc,GAAA,EAACjB,iBAAA,CAAAmB,gBAAgB;IAAA,GAAKZ;EAAK,CAAG,CAC/B;AACH,CAAC,CAAC","ignoreList":[]}
@@ -15,7 +15,6 @@ var _characterHtml = require("./character-html.js");
15
15
  var _characterRuntimeModule = require("./character-runtime-module.js");
16
16
  var _characterWebview = require("./character-webview.js");
17
17
  var _legacyRecipe = require("./legacy-recipe.js");
18
- var _characterShapes = require("./character-shapes.js");
19
18
  var _messages2 = require("./messages.js");
20
19
  var _jsxRuntime = require("react/jsx-runtime");
21
20
  function WebCharacter({
@@ -172,7 +171,7 @@ function CharacterAvatar(props) {
172
171
  };
173
172
  }, []);
174
173
  (0, _react.useEffect)(() => setFailed(false), [runtimeUrl, config.character]);
175
- const legacy = (0, _react.useMemo)(() => !config.character || config.character.preset === 'bloom' || (0, _characterShapes.isMigratedCharacterShape)(config.character.selections?.shape) ? (0, _legacyRecipe.legacyRecipe)(config) : undefined, [config]);
174
+ const legacy = (0, _react.useMemo)(() => !config.character || config.character.preset === 'bloom' ? (0, _legacyRecipe.legacyRecipe)(config) : undefined, [config]);
176
175
  const value = (0, _react.useMemo)(() => ({
177
176
  config,
178
177
  legacy,
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_reactNative","_reactNativeReanimated","_messages","_styledPrimitives","_index","_context","_characterHtml","_characterRuntimeModule","_characterWebview","_legacyRecipe","_characterShapes","_messages2","_jsxRuntime","WebCharacter","runtimeUrl","value","onError","reportCapabilities","useContext","CharacterRuntimeContext","report","useRef","current","host","controller","latest","fail","useEffect","element","document","stopped","started","canvas","createElement","setAttribute","Object","assign","style","width","height","display","touchAction","appendChild","start","module","loadCharacterRuntime","instance","createAvatar","onCapabilities","info","dispose","update","observer","IntersectionObserver","entries","some","entry","isIntersecting","observe","disconnect","remove","jsx","StyledView","ref","flex","NativeCharacter","WebView","characterWebView","initial","source","useMemo","html","characterHtml","baseUrl","send","injectJavaScript","scriptJson","backgroundColor","scrollEnabled","javaScriptEnabled","originWhitelist","onMessage","event","nativeEvent","data","startsWith","JSON","parse","slice","CharacterAvatar","props","messages","useMessages","AGENT_AVATAR_MESSAGES","locale","initialReduced","useReducedMotion","reduced","setReduced","useState","active","setActive","AppState","currentState","failed","setFailed","config","paused","portrait","workingKey","reactionKey","entranceKey","workingCycles","interactive","size","motion","AccessibilityInfo","addEventListener","state","next","media","Platform","OS","window","matchMedia","undefined","change","matches","removeEventListener","character","legacy","preset","isMigratedCharacterShape","selections","shape","legacyRecipe","Renderer","className","accessible","accessibilityRole","accessibilityLabel","label","testID","children","Text","numberOfLines","fontSize","unavailable"],"sourceRoot":"../../../src","sources":["agent-avatar/CharacterAvatar.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","_reactNative","_reactNativeReanimated","_messages","_styledPrimitives","_index","_context","_characterHtml","_characterRuntimeModule","_characterWebview","_legacyRecipe","_messages2","_jsxRuntime","WebCharacter","runtimeUrl","value","onError","reportCapabilities","useContext","CharacterRuntimeContext","report","useRef","current","host","controller","latest","fail","useEffect","element","document","stopped","started","canvas","createElement","setAttribute","Object","assign","style","width","height","display","touchAction","appendChild","start","module","loadCharacterRuntime","instance","createAvatar","onCapabilities","info","dispose","update","observer","IntersectionObserver","entries","some","entry","isIntersecting","observe","disconnect","remove","jsx","StyledView","ref","flex","NativeCharacter","WebView","characterWebView","initial","source","useMemo","html","characterHtml","baseUrl","send","injectJavaScript","scriptJson","backgroundColor","scrollEnabled","javaScriptEnabled","originWhitelist","onMessage","event","nativeEvent","data","startsWith","JSON","parse","slice","CharacterAvatar","props","messages","useMessages","AGENT_AVATAR_MESSAGES","locale","initialReduced","useReducedMotion","reduced","setReduced","useState","active","setActive","AppState","currentState","failed","setFailed","config","paused","portrait","workingKey","reactionKey","entranceKey","workingCycles","interactive","size","motion","AccessibilityInfo","addEventListener","state","next","media","Platform","OS","window","matchMedia","undefined","change","matches","removeEventListener","character","legacy","preset","legacyRecipe","Renderer","className","accessible","accessibilityRole","accessibilityLabel","label","testID","children","Text","numberOfLines","fontSize","unavailable"],"sourceRoot":"../../../src","sources":["agent-avatar/CharacterAvatar.tsx"],"mappings":"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","ignoreList":[]}
@@ -17,10 +17,6 @@ function parseCharacterConfig(value) {
17
17
  const result = {
18
18
  preset: candidate.preset
19
19
  };
20
- if (candidate.eyeSpacing !== undefined) {
21
- if (typeof candidate.eyeSpacing !== 'number' || !Number.isFinite(candidate.eyeSpacing) || candidate.eyeSpacing < 0.5 || candidate.eyeSpacing > 1.5) throw new Error('Invalid character eye spacing.');
22
- result.eyeSpacing = candidate.eyeSpacing;
23
- }
24
20
  if (candidate.bodyColor !== undefined) {
25
21
  if (typeof candidate.bodyColor !== 'string' || candidate.bodyColor.length !== 7 || !/^#[0-9a-f]{6}$/i.test(candidate.bodyColor)) throw new Error('Invalid character body color.');
26
22
  result.bodyColor = candidate.bodyColor.toLowerCase();
@@ -1 +1 @@
1
- {"version":3,"names":["categories","validId","value","length","parseCharacterConfig","Array","isArray","Error","candidate","preset","result","eyeSpacing","undefined","Number","isFinite","bodyColor","test","toLowerCase","selections","category","id","Object","entries","includes"],"sourceRoot":"../../../src","sources":["agent-avatar/config-character.ts"],"mappings":";;;;;;AAAA;;AAeA,MAAMA,UAA8C,GAAG,CACrD,OAAO,EACP,OAAO,EACP,MAAM,EACN,SAAS,EACT,WAAW,CACZ;AACD,MAAMC,OAAO,GAAIC,KAAc,IAC7B,OAAOA,KAAK,KAAK,QAAQ,IAAIA,KAAK,CAACC,MAAM,GAAG,CAAC,IAAID,KAAK,CAACC,MAAM,IAAI,EAAE;;AAErE;AACO,SAASC,oBAAoBA,CAACF,KAAc,EAAyB;EAC1E,IAAI,CAACA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAIG,KAAK,CAACC,OAAO,CAACJ,KAAK,CAAC,EAC7D,MAAM,IAAIK,KAAK,CAAC,kCAAkC,CAAC;EACrD,MAAMC,SAAS,GAAGN,KAAgC;EAClD,IAAI,CAACD,OAAO,CAACO,SAAS,CAACC,MAAM,CAAC,EAAE,MAAM,IAAIF,KAAK,CAAC,2BAA2B,CAAC;EAC5E,MAAMG,MAA6B,GAAG;IAAED,MAAM,EAAED,SAAS,CAACC;EAAO,CAAC;EAClE,IAAID,SAAS,CAACG,UAAU,KAAKC,SAAS,EAAE;IACtC,IACE,OAAOJ,SAAS,CAACG,UAAU,KAAK,QAAQ,IACxC,CAACE,MAAM,CAACC,QAAQ,CAACN,SAAS,CAACG,UAAU,CAAC,IACtCH,SAAS,CAACG,UAAU,GAAG,GAAG,IAC1BH,SAAS,CAACG,UAAU,GAAG,GAAG,EAE1B,MAAM,IAAIJ,KAAK,CAAC,gCAAgC,CAAC;IACnDG,MAAM,CAACC,UAAU,GAAGH,SAAS,CAACG,UAAU;EAC1C;EACA,IAAIH,SAAS,CAACO,SAAS,KAAKH,SAAS,EAAE;IACrC,IACE,OAAOJ,SAAS,CAACO,SAAS,KAAK,QAAQ,IACvCP,SAAS,CAACO,SAAS,CAACZ,MAAM,KAAK,CAAC,IAChC,CAAC,iBAAiB,CAACa,IAAI,CAACR,SAAS,CAACO,SAAS,CAAC,EAE5C,MAAM,IAAIR,KAAK,CAAC,+BAA+B,CAAC;IAClDG,MAAM,CAACK,SAAS,GAAGP,SAAS,CAACO,SAAS,CAACE,WAAW,CAAC,CAAC;EACtD;EACA,IAAIT,SAAS,CAACU,UAAU,KAAKN,SAAS,EAAE;IACtC,IACE,CAACJ,SAAS,CAACU,UAAU,IACrB,OAAOV,SAAS,CAACU,UAAU,KAAK,QAAQ,IACxCb,KAAK,CAACC,OAAO,CAACE,SAAS,CAACU,UAAU,CAAC,EAEnC,MAAM,IAAIX,KAAK,CAAC,+BAA+B,CAAC;IAClD,MAAMW,UAA4D,GAAG,CAAC,CAAC;IACvE,KAAK,MAAM,CAACC,QAAQ,EAAEC,EAAE,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACd,SAAS,CAACU,UAAU,CAAC,EAAE;MACjE,IACE,CAAClB,UAAU,CAACuB,QAAQ,CAACJ,QAAmC,CAAC,IACzD,CAAClB,OAAO,CAACmB,EAAE,CAAC,EAEZ,MAAM,IAAIb,KAAK,CAAC,8BAA8B,CAAC;MACjDW,UAAU,CAACC,QAAQ,CAA4B,GAAGC,EAAE;IACtD;IACAV,MAAM,CAACQ,UAAU,GAAGA,UAAU;EAChC;EACA,IAAI,OAAO,IAAIV,SAAS,EACtB,MAAM,IAAID,KAAK,CAAC,0CAA0C,CAAC;EAC7D,OAAOG,MAAM;AACf","ignoreList":[]}
1
+ {"version":3,"names":["categories","validId","value","length","parseCharacterConfig","Array","isArray","Error","candidate","preset","result","bodyColor","undefined","test","toLowerCase","selections","category","id","Object","entries","includes"],"sourceRoot":"../../../src","sources":["agent-avatar/config-character.ts"],"mappings":";;;;;;AAAA;;AAUA,MAAMA,UAA8C,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC;AACzG,MAAMC,OAAO,GAAIC,KAAc,IAC7B,OAAOA,KAAK,KAAK,QAAQ,IAAIA,KAAK,CAACC,MAAM,GAAG,CAAC,IAAID,KAAK,CAACC,MAAM,IAAI,EAAE;;AAErE;AACO,SAASC,oBAAoBA,CAACF,KAAc,EAAyB;EAC1E,IAAI,CAACA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAIG,KAAK,CAACC,OAAO,CAACJ,KAAK,CAAC,EAC7D,MAAM,IAAIK,KAAK,CAAC,kCAAkC,CAAC;EACrD,MAAMC,SAAS,GAAGN,KAAgC;EAClD,IAAI,CAACD,OAAO,CAACO,SAAS,CAACC,MAAM,CAAC,EAAE,MAAM,IAAIF,KAAK,CAAC,2BAA2B,CAAC;EAC5E,MAAMG,MAA6B,GAAG;IAAED,MAAM,EAAED,SAAS,CAACC;EAAO,CAAC;EAClE,IAAID,SAAS,CAACG,SAAS,KAAKC,SAAS,EAAE;IACrC,IAAI,OAAOJ,SAAS,CAACG,SAAS,KAAK,QAAQ,IAAIH,SAAS,CAACG,SAAS,CAACR,MAAM,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAACU,IAAI,CAACL,SAAS,CAACG,SAAS,CAAC,EAC7H,MAAM,IAAIJ,KAAK,CAAC,+BAA+B,CAAC;IAClDG,MAAM,CAACC,SAAS,GAAGH,SAAS,CAACG,SAAS,CAACG,WAAW,CAAC,CAAC;EACtD;EACA,IAAIN,SAAS,CAACO,UAAU,KAAKH,SAAS,EAAE;IACtC,IAAI,CAACJ,SAAS,CAACO,UAAU,IAAI,OAAOP,SAAS,CAACO,UAAU,KAAK,QAAQ,IAAIV,KAAK,CAACC,OAAO,CAACE,SAAS,CAACO,UAAU,CAAC,EAC1G,MAAM,IAAIR,KAAK,CAAC,+BAA+B,CAAC;IAClD,MAAMQ,UAA4D,GAAG,CAAC,CAAC;IACvE,KAAK,MAAM,CAACC,QAAQ,EAAEC,EAAE,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACX,SAAS,CAACO,UAAU,CAAC,EAAE;MACjE,IAAI,CAACf,UAAU,CAACoB,QAAQ,CAACJ,QAAmC,CAAC,IAAI,CAACf,OAAO,CAACgB,EAAE,CAAC,EAC3E,MAAM,IAAIV,KAAK,CAAC,8BAA8B,CAAC;MACjDQ,UAAU,CAACC,QAAQ,CAA4B,GAAGC,EAAE;IACtD;IACAP,MAAM,CAACK,UAAU,GAAGA,UAAU;EAChC;EACA,IAAI,OAAO,IAAIP,SAAS,EAAE,MAAM,IAAID,KAAK,CAAC,0CAA0C,CAAC;EACrF,OAAOG,MAAM;AACf","ignoreList":[]}