@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
@@ -1,534 +0,0 @@
1
- // Original shaders/programs, shared within ONE real context. The logical objects
2
- // remain separate because Emscripten stores mutable IDs and uniform caches on them.
3
- // This wrapper does not own the context and never suppresses context loss itself.
4
- // Mali-G715 rejects this GLSL ES array constructor even with an explicit
5
- // precision qualifier. Lower only the two known original-engine expressions;
6
- // assigning the same four values separately preserves their evaluation order.
7
- // Keep the source binaries intact and leave unrelated shaders byte-for-byte alone.
8
- export function compatibleShaderSource(source) {
9
- return source
10
- .replace(
11
- "float felipeLTC(vec3 p,mat3 transform,vec3 rect[4]) {",
12
- "float felipeLTC(vec3 p,mat3 transform,highp vec3 rect[4]) {",
13
- )
14
- .replace(
15
- "vec3 rect[4]=vec3[4](light+right-up,light-right-up,light-right+up,light+right+up);",
16
- "highp vec3 rect[4];rect[0]=light+right-up;rect[1]=light-right-up;rect[2]=light-right+up;rect[3]=light+right+up;",
17
- );
18
- }
19
-
20
- export function createSharedProgramPool(gl) {
21
- const shaders = new WeakMap(),
22
- programs = new WeakMap(),
23
- locations = new WeakMap();
24
- const shaderCache = new Map(),
25
- programCache = new Map();
26
- const livePrograms = new Set(),
27
- liveShaders = new Set(),
28
- bound = new Map();
29
- let current = null,
30
- disposed = false,
31
- shaderCompiles = 0,
32
- programLinks = 0,
33
- uniformReplays = 0,
34
- uniformReplaySkips = 0,
35
- blockReplays = 0,
36
- blockReplaySkips = 0;
37
-
38
- const shaderKey = (s) => JSON.stringify([s.type, s.source]);
39
- function collectShader(entry) {
40
- if (!entry || entry.records.size || entry.programs.size) return;
41
- gl.deleteShader(entry.real);
42
- if (shaderCache.get(entry.key) === entry) shaderCache.delete(entry.key);
43
- }
44
- function releaseShader(s) {
45
- if (!s.deleted || s.attached.size) return;
46
- liveShaders.delete(s);
47
- s.entry?.records.delete(s);
48
- collectShader(s.entry);
49
- }
50
- function compile(s) {
51
- const key = shaderKey(s);
52
- if (s.entry?.key === key) return s.entry;
53
- let entry = shaderCache.get(key);
54
- if (!entry) {
55
- const real = gl.createShader(s.type);
56
- gl.shaderSource(real, compatibleShaderSource(s.source));
57
- gl.compileShader(real);
58
- shaderCompiles++;
59
- entry = { key, real, records: new Set(), programs: new Set() };
60
- shaderCache.set(key, entry);
61
- }
62
- const previous = s.entry;
63
- previous?.records.delete(s);
64
- entry.records.add(s);
65
- s.entry = entry;
66
- collectShader(previous);
67
- return entry;
68
- }
69
- function releaseProgramEntry(p) {
70
- const entry = p.entry;
71
- if (!entry) return;
72
- p.entry = null;
73
- entry.refs.delete(p);
74
- if (entry.owner === p) entry.owner = null;
75
- if (entry.refs.size) return;
76
- gl.deleteProgram(entry.real);
77
- if (programCache.get(entry.key) === entry) programCache.delete(entry.key);
78
- for (const shader of entry.shaders) {
79
- shader.programs.delete(entry);
80
- collectShader(shader);
81
- }
82
- }
83
- // Active uniform reflection provides complete defaults, including uniforms an
84
- // alias has never assigned. Otherwise switching to a new alias leaks old values.
85
- const types = new Map([
86
- [gl.FLOAT, ["uniform1fv", 1, Float32Array]],
87
- [gl.FLOAT_VEC2, ["uniform2fv", 2, Float32Array]],
88
- [gl.FLOAT_VEC3, ["uniform3fv", 3, Float32Array]],
89
- [gl.FLOAT_VEC4, ["uniform4fv", 4, Float32Array]],
90
- [gl.INT, ["uniform1iv", 1, Int32Array]],
91
- [gl.INT_VEC2, ["uniform2iv", 2, Int32Array]],
92
- [gl.INT_VEC3, ["uniform3iv", 3, Int32Array]],
93
- [gl.INT_VEC4, ["uniform4iv", 4, Int32Array]],
94
- [gl.UNSIGNED_INT, ["uniform1uiv", 1, Uint32Array]],
95
- [gl.UNSIGNED_INT_VEC2, ["uniform2uiv", 2, Uint32Array]],
96
- [gl.UNSIGNED_INT_VEC3, ["uniform3uiv", 3, Uint32Array]],
97
- [gl.UNSIGNED_INT_VEC4, ["uniform4uiv", 4, Uint32Array]],
98
- [gl.BOOL, ["uniform1iv", 1, Int32Array]],
99
- [gl.BOOL_VEC2, ["uniform2iv", 2, Int32Array]],
100
- [gl.BOOL_VEC3, ["uniform3iv", 3, Int32Array]],
101
- [gl.BOOL_VEC4, ["uniform4iv", 4, Int32Array]],
102
- [gl.FLOAT_MAT2, ["uniformMatrix2fv", 4, Float32Array]],
103
- [gl.FLOAT_MAT3, ["uniformMatrix3fv", 9, Float32Array]],
104
- [gl.FLOAT_MAT4, ["uniformMatrix4fv", 16, Float32Array]],
105
- [gl.FLOAT_MAT2x3, ["uniformMatrix2x3fv", 6, Float32Array]],
106
- [gl.FLOAT_MAT2x4, ["uniformMatrix2x4fv", 8, Float32Array]],
107
- [gl.FLOAT_MAT3x2, ["uniformMatrix3x2fv", 6, Float32Array]],
108
- [gl.FLOAT_MAT3x4, ["uniformMatrix3x4fv", 12, Float32Array]],
109
- [gl.FLOAT_MAT4x2, ["uniformMatrix4x2fv", 8, Float32Array]],
110
- [gl.FLOAT_MAT4x3, ["uniformMatrix4x3fv", 12, Float32Array]],
111
- ]);
112
- for (const name of [
113
- "SAMPLER_2D",
114
- "SAMPLER_CUBE",
115
- "SAMPLER_3D",
116
- "SAMPLER_2D_SHADOW",
117
- "SAMPLER_2D_ARRAY",
118
- "SAMPLER_2D_ARRAY_SHADOW",
119
- "SAMPLER_CUBE_SHADOW",
120
- "INT_SAMPLER_2D",
121
- "INT_SAMPLER_3D",
122
- "INT_SAMPLER_CUBE",
123
- "INT_SAMPLER_2D_ARRAY",
124
- "UNSIGNED_INT_SAMPLER_2D",
125
- "UNSIGNED_INT_SAMPLER_3D",
126
- "UNSIGNED_INT_SAMPLER_CUBE",
127
- "UNSIGNED_INT_SAMPLER_2D_ARRAY",
128
- ])
129
- types.set(gl[name], ["uniform1iv", 1, Int32Array]);
130
-
131
- function reflect(real) {
132
- const uniforms = [],
133
- names = new Map();
134
- for (let i = 0; i < gl.getProgramParameter(real, gl.ACTIVE_UNIFORMS); i++) {
135
- const active = gl.getActiveUniform(real, i);
136
- const location = gl.getUniformLocation(real, active.name);
137
- if (location === null) continue; // Uniform block members use buffers.
138
- const type = types.get(active.type);
139
- if (!type)
140
- throw new Error(`Unsupported shared uniform type: ${active.type}`);
141
- const [method, width, ArrayType] = type;
142
- const uniform = {
143
- name: active.name,
144
- size: active.size,
145
- method,
146
- width,
147
- ArrayType,
148
- matrix: method.startsWith("uniformMatrix"),
149
- location,
150
- type: active.type,
151
- };
152
- const index = uniforms.push(uniform) - 1;
153
- for (let element = 0; element < active.size; element++) {
154
- const name = active.name.includes("[0]")
155
- ? active.name.replace("[0]", `[${element}]`)
156
- : active.name;
157
- names.set(name, { index, element });
158
- }
159
- if (active.name.endsWith("[0]"))
160
- names.set(active.name.slice(0, -3), { index, element: 0 });
161
- }
162
- return {
163
- uniforms,
164
- names,
165
- blocks: gl.getProgramParameter(real, gl.ACTIVE_UNIFORM_BLOCKS),
166
- };
167
- }
168
- function link(p) {
169
- const attached = [...p.attached].map((shader) =>
170
- compile(shaders.get(shader)),
171
- );
172
- const bindings = [...p.bindings].sort(([a], [b]) => a.localeCompare(b));
173
- const key = JSON.stringify([
174
- attached.map((s) => s.key).sort(),
175
- bindings,
176
- p.feedback,
177
- ]);
178
- let entry = programCache.get(key);
179
- if (!entry) {
180
- const real = p.unlinked ?? gl.createProgram();
181
- p.unlinked = null;
182
- for (const shader of attached) gl.attachShader(real, shader.real);
183
- for (const [name, index] of bindings)
184
- gl.bindAttribLocation(real, index, name);
185
- if (p.feedback) gl.transformFeedbackVaryings(real, ...p.feedback);
186
- gl.linkProgram(real);
187
- programLinks++;
188
- const linked = gl.getProgramParameter(real, gl.LINK_STATUS);
189
- const reflection = linked
190
- ? reflect(real)
191
- : { uniforms: [], names: new Map(), blocks: 0 };
192
- entry = {
193
- key,
194
- real,
195
- linked,
196
- shaders: attached,
197
- refs: new Set(),
198
- owner: null,
199
- ...reflection,
200
- };
201
- programCache.set(key, entry);
202
- for (const shader of attached) shader.programs.add(entry);
203
- }
204
- // Hold the new reference before releasing a same-key previous link.
205
- const previous = p.entry;
206
- if (previous !== entry) {
207
- releaseProgramEntry(p);
208
- entry.refs.add(p);
209
- p.entry = entry;
210
- }
211
- if (p.unlinked) {
212
- gl.deleteProgram(p.unlinked);
213
- p.unlinked = null;
214
- }
215
- p.values = entry.uniforms.map((u) => new u.ArrayType(u.width * u.size));
216
- p.blockBindings = new Uint32Array(entry.blocks);
217
- p.locations.clear();
218
- p.generation++;
219
- // Relinking resets the logical program's uniforms even when its source key
220
- // stays identical. A later useProgram must replay the reset values.
221
- if (entry.owner === p) entry.owner = null;
222
- if (current === p) use(p);
223
- }
224
- function realProgram(p) {
225
- return p.entry?.real ?? (p.unlinked ??= gl.createProgram());
226
- }
227
- function equalValues(a, b) {
228
- if (!a || a.length !== b.length) return false;
229
- // Signed zero can be observable inside GLSL, so ordinary === is not enough.
230
- for (let i = 0; i < b.length; i++) if (!Object.is(a[i], b[i])) return false;
231
- return true;
232
- }
233
- function use(p) {
234
- gl.useProgram(p ? realProgram(p) : null);
235
- current = p;
236
- if (!p?.entry || p.entry.owner === p) return;
237
- const entry = p.entry;
238
- const previous = entry.owner;
239
- // The last owner records the physical program's complete uniform state,
240
- // including partial writes. Deletion/relinking invalidates that owner, so
241
- // unknown state still receives a complete replay, including all defaults.
242
- for (let i = 0; i < entry.uniforms.length; i++) {
243
- const u = entry.uniforms[i];
244
- if (equalValues(previous?.values[i], p.values[i])) {
245
- uniformReplaySkips++;
246
- continue;
247
- }
248
- if (u.matrix) gl[u.method](u.location, false, p.values[i]);
249
- else gl[u.method](u.location, p.values[i]);
250
- uniformReplays++;
251
- }
252
- for (let i = 0; i < p.blockBindings.length; i++) {
253
- if (previous && previous.blockBindings[i] === p.blockBindings[i]) {
254
- blockReplaySkips++;
255
- continue;
256
- }
257
- gl.uniformBlockBinding(entry.real, i, p.blockBindings[i]);
258
- blockReplays++;
259
- }
260
- entry.owner = p;
261
- }
262
- function uniformCall(method, args) {
263
- if (args[0] == null) return gl[method](...args);
264
- const location = locations.get(args[0]);
265
- if (!location) return gl[method](...args);
266
- const { program: p, index, element, real, generation } = location;
267
- if (current !== p || generation !== p.generation || p.deleted)
268
- throw new Error("Shared uniform belongs to another logical program");
269
- const result = gl[method](real, ...args.slice(1));
270
- const u = p.entry.uniforms[index];
271
- const vector = method.endsWith("v"),
272
- matrix = method.startsWith("uniformMatrix");
273
- if (matrix && args[1] !== false) return result;
274
- let values;
275
- if (vector) {
276
- const at = matrix ? 2 : 1,
277
- data = args[at];
278
- const offset = args[at + 1] ?? 0,
279
- length = args[at + 2] || data.length - offset;
280
- values = Array.prototype.slice.call(data, offset, offset + length);
281
- } else values = args.slice(1);
282
- const offset = element * u.width;
283
- if (
284
- values.length % u.width === 0 &&
285
- offset + values.length <= p.values[index].length
286
- )
287
- p.values[index].set(values, offset);
288
- return result;
289
- }
290
- const api = {
291
- createShader(type) {
292
- const virtual = Object.create(WebGLShader.prototype);
293
- const s = {
294
- type,
295
- source: "",
296
- entry: null,
297
- attached: new Set(),
298
- deleted: false,
299
- };
300
- shaders.set(virtual, s);
301
- liveShaders.add(s);
302
- return virtual;
303
- },
304
- shaderSource(shader, source) {
305
- shaders.get(shader).source = String(source);
306
- },
307
- compileShader(shader) {
308
- compile(shaders.get(shader));
309
- },
310
- deleteShader(shader) {
311
- if (!shader) return;
312
- const s = shaders.get(shader);
313
- if (!s) return gl.deleteShader(shader);
314
- s.deleted = true;
315
- releaseShader(s);
316
- },
317
- getShaderSource(shader) {
318
- return shaders.get(shader)?.source ?? gl.getShaderSource(shader);
319
- },
320
- getShaderParameter(shader, parameter) {
321
- const s = shaders.get(shader);
322
- if (!s) return gl.getShaderParameter(shader, parameter);
323
- if (parameter === gl.DELETE_STATUS) return s.deleted;
324
- if (parameter === gl.SHADER_TYPE) return s.type;
325
- return gl.getShaderParameter(compile(s).real, parameter);
326
- },
327
- getShaderInfoLog(shader) {
328
- return gl.getShaderInfoLog(compile(shaders.get(shader)).real);
329
- },
330
- isShader(shader) {
331
- const s = shaders.get(shader);
332
- return s ? !s.deleted : gl.isShader(shader);
333
- },
334
- createProgram() {
335
- const virtual = Object.create(WebGLProgram.prototype);
336
- const p = {
337
- virtual,
338
- entry: null,
339
- unlinked: null,
340
- attached: new Set(),
341
- bindings: new Map(),
342
- feedback: null,
343
- values: [],
344
- blockBindings: [],
345
- locations: new Map(),
346
- generation: 0,
347
- deleted: false,
348
- };
349
- programs.set(virtual, p);
350
- livePrograms.add(p);
351
- return virtual;
352
- },
353
- attachShader(program, shader) {
354
- const p = programs.get(program),
355
- s = shaders.get(shader);
356
- p.attached.add(shader);
357
- s.attached.add(p);
358
- },
359
- detachShader(program, shader) {
360
- const p = programs.get(program),
361
- s = shaders.get(shader);
362
- p.attached.delete(shader);
363
- s.attached.delete(p);
364
- releaseShader(s);
365
- },
366
- getAttachedShaders(program) {
367
- return [...programs.get(program).attached];
368
- },
369
- bindAttribLocation(program, index, name) {
370
- programs.get(program).bindings.set(name, index);
371
- },
372
- transformFeedbackVaryings(program, varyings, mode) {
373
- programs.get(program).feedback = [[...varyings], mode];
374
- },
375
- linkProgram(program) {
376
- link(programs.get(program));
377
- },
378
- useProgram(program) {
379
- use(program == null ? null : programs.get(program));
380
- },
381
- deleteProgram(program) {
382
- if (!program) return;
383
- const p = programs.get(program);
384
- if (!p) return gl.deleteProgram(program);
385
- if (p.deleted) return;
386
- p.deleted = true;
387
- if (current === p) {
388
- gl.useProgram(null);
389
- current = null;
390
- }
391
- for (const shader of p.attached) {
392
- const s = shaders.get(shader);
393
- s.attached.delete(p);
394
- releaseShader(s);
395
- }
396
- p.attached.clear();
397
- releaseProgramEntry(p);
398
- if (p.unlinked) gl.deleteProgram(p.unlinked);
399
- p.locations.clear();
400
- p.values = [];
401
- livePrograms.delete(p);
402
- },
403
- isProgram(program) {
404
- const p = programs.get(program);
405
- return p ? !p.deleted : gl.isProgram(program);
406
- },
407
- getProgramParameter(program, parameter) {
408
- const p = programs.get(program);
409
- if (!p) return gl.getProgramParameter(program, parameter);
410
- if (parameter === gl.DELETE_STATUS) return p.deleted;
411
- if (parameter === gl.ATTACHED_SHADERS) return p.attached.size;
412
- return gl.getProgramParameter(realProgram(p), parameter);
413
- },
414
- getUniformLocation(program, name) {
415
- const p = programs.get(program),
416
- entry = p.entry;
417
- if (p.locations.has(name)) return p.locations.get(name);
418
- const real = gl.getUniformLocation(realProgram(p), name);
419
- if (real === null) return null;
420
- const slot = entry.names.get(name);
421
- if (!slot) throw new Error(`Unknown shared uniform: ${name}`);
422
- const virtual = Object.create(WebGLUniformLocation.prototype);
423
- locations.set(virtual, {
424
- program: p,
425
- real,
426
- ...slot,
427
- generation: p.generation,
428
- });
429
- p.locations.set(name, virtual);
430
- return virtual;
431
- },
432
- getUniform(program, uniform) {
433
- const location = locations.get(uniform);
434
- if (!location)
435
- return gl.getUniform(realProgram(programs.get(program)), uniform);
436
- const p = programs.get(program);
437
- if (location.program !== p || location.generation !== p.generation)
438
- throw new Error("Invalid shared uniform query");
439
- const u = p.entry.uniforms[location.index];
440
- const value = p.values[location.index].slice(
441
- location.element * u.width,
442
- (location.element + 1) * u.width,
443
- );
444
- return u.width === 1 ? value[0] : value;
445
- },
446
- uniformBlockBinding(program, index, binding) {
447
- const p = programs.get(program);
448
- p.blockBindings[index] = binding;
449
- // This is a program operation, so it can be called while another alias is
450
- // active. Do not overwrite that alias's live block bindings.
451
- if (p.entry.owner === p)
452
- gl.uniformBlockBinding(p.entry.real, index, binding);
453
- },
454
- getActiveUniformBlockParameter(program, index, parameter) {
455
- const p = programs.get(program);
456
- if (parameter === gl.UNIFORM_BLOCK_BINDING) return p.blockBindings[index];
457
- return gl.getActiveUniformBlockParameter(
458
- realProgram(p),
459
- index,
460
- parameter,
461
- );
462
- },
463
- getParameter(parameter) {
464
- if (parameter === gl.CURRENT_PROGRAM) return current?.virtual ?? null;
465
- return gl.getParameter(parameter);
466
- },
467
- };
468
- const programFirst = new Set([
469
- "getProgramInfoLog",
470
- "validateProgram",
471
- "getActiveAttrib",
472
- "getAttribLocation",
473
- "getActiveUniform",
474
- "getUniformIndices",
475
- "getActiveUniforms",
476
- "getUniformBlockIndex",
477
- "getActiveUniformBlockName",
478
- "getTransformFeedbackVarying",
479
- "getFragDataLocation",
480
- ]);
481
- const context = new Proxy(gl, {
482
- get(target, property) {
483
- if (Object.hasOwn(api, property)) return api[property];
484
- if (bound.has(property)) return bound.get(property);
485
- const value = Reflect.get(target, property, target);
486
- if (typeof value !== "function") return value;
487
- if (!bound.has(property)) {
488
- if (
489
- /^uniform(?:[1-4](?:f|i|ui)v?|Matrix[2-4](?:x[2-4])?fv)$/.test(
490
- String(property),
491
- )
492
- )
493
- bound.set(property, (...args) => uniformCall(property, args));
494
- else if (programFirst.has(property))
495
- bound.set(property, (program, ...args) =>
496
- value.call(
497
- target,
498
- programs.has(program)
499
- ? realProgram(programs.get(program))
500
- : program,
501
- ...args,
502
- ),
503
- );
504
- else bound.set(property, value.bind(target));
505
- }
506
- return bound.get(property);
507
- },
508
- });
509
- return {
510
- context,
511
- stats: () => ({
512
- logicalPrograms: livePrograms.size,
513
- logicalShaders: liveShaders.size,
514
- programs: programCache.size,
515
- shaders: shaderCache.size,
516
- programLinks,
517
- shaderCompiles,
518
- uniformReplays,
519
- uniformReplaySkips,
520
- blockReplays,
521
- blockReplaySkips,
522
- }),
523
- dispose() {
524
- if (disposed) return;
525
- disposed = true;
526
- for (const p of [...livePrograms]) api.deleteProgram(p.virtual);
527
- for (const s of [...liveShaders]) {
528
- s.deleted = true;
529
- releaseShader(s);
530
- }
531
- bound.clear();
532
- },
533
- };
534
- }