@vendoai/ui 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (525) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +7 -0
  3. package/dist/chrome/activity-ledger.d.ts +14 -0
  4. package/dist/chrome/activity-ledger.d.ts.map +1 -0
  5. package/dist/chrome/activity-ledger.js +40 -0
  6. package/dist/chrome/activity-ledger.js.map +1 -0
  7. package/dist/chrome/activity-panel.d.ts +7 -0
  8. package/dist/chrome/activity-panel.d.ts.map +1 -0
  9. package/dist/chrome/activity-panel.js +27 -0
  10. package/dist/chrome/activity-panel.js.map +1 -0
  11. package/dist/chrome/activity-semantics.d.ts +42 -0
  12. package/dist/chrome/activity-semantics.d.ts.map +1 -0
  13. package/dist/chrome/activity-semantics.js +119 -0
  14. package/dist/chrome/activity-semantics.js.map +1 -0
  15. package/dist/chrome/approval-card.d.ts +22 -0
  16. package/dist/chrome/approval-card.d.ts.map +1 -0
  17. package/dist/chrome/approval-card.js +95 -0
  18. package/dist/chrome/approval-card.js.map +1 -0
  19. package/dist/chrome/approval-sheet.d.ts +23 -0
  20. package/dist/chrome/approval-sheet.d.ts.map +1 -0
  21. package/dist/chrome/approval-sheet.js +72 -0
  22. package/dist/chrome/approval-sheet.js.map +1 -0
  23. package/dist/chrome/automations-panel.d.ts +3 -0
  24. package/dist/chrome/automations-panel.d.ts.map +1 -0
  25. package/dist/chrome/automations-panel.js +305 -0
  26. package/dist/chrome/automations-panel.js.map +1 -0
  27. package/dist/chrome/build-beat.d.ts +70 -0
  28. package/dist/chrome/build-beat.d.ts.map +1 -0
  29. package/dist/chrome/build-beat.js +101 -0
  30. package/dist/chrome/build-beat.js.map +1 -0
  31. package/dist/chrome/chrome-css.d.ts +7 -0
  32. package/dist/chrome/chrome-css.d.ts.map +1 -0
  33. package/dist/chrome/chrome-css.js +2042 -0
  34. package/dist/chrome/chrome-css.js.map +1 -0
  35. package/dist/chrome/chrome-root.d.ts +13 -0
  36. package/dist/chrome/chrome-root.d.ts.map +1 -0
  37. package/dist/chrome/chrome-root.js +39 -0
  38. package/dist/chrome/chrome-root.js.map +1 -0
  39. package/dist/chrome/clipboard.d.ts +4 -0
  40. package/dist/chrome/clipboard.d.ts.map +1 -0
  41. package/dist/chrome/clipboard.js +49 -0
  42. package/dist/chrome/clipboard.js.map +1 -0
  43. package/dist/chrome/connect-card.d.ts +19 -0
  44. package/dist/chrome/connect-card.d.ts.map +1 -0
  45. package/dist/chrome/connect-card.js +57 -0
  46. package/dist/chrome/connect-card.js.map +1 -0
  47. package/dist/chrome/connect-dock.d.ts +25 -0
  48. package/dist/chrome/connect-dock.d.ts.map +1 -0
  49. package/dist/chrome/connect-dock.js +192 -0
  50. package/dist/chrome/connect-dock.js.map +1 -0
  51. package/dist/chrome/connected-accounts-panel.d.ts +14 -0
  52. package/dist/chrome/connected-accounts-panel.d.ts.map +1 -0
  53. package/dist/chrome/connected-accounts-panel.js +157 -0
  54. package/dist/chrome/connected-accounts-panel.js.map +1 -0
  55. package/dist/chrome/dev-mode.d.ts +5 -0
  56. package/dist/chrome/dev-mode.d.ts.map +1 -0
  57. package/dist/chrome/dev-mode.js +7 -0
  58. package/dist/chrome/dev-mode.js.map +1 -0
  59. package/dist/chrome/discoverability.d.ts +33 -0
  60. package/dist/chrome/discoverability.d.ts.map +1 -0
  61. package/dist/chrome/discoverability.js +63 -0
  62. package/dist/chrome/discoverability.js.map +1 -0
  63. package/dist/chrome/embeds.d.ts +21 -0
  64. package/dist/chrome/embeds.d.ts.map +1 -0
  65. package/dist/chrome/embeds.js +181 -0
  66. package/dist/chrome/embeds.js.map +1 -0
  67. package/dist/chrome/fluid-thinking.d.ts +15 -0
  68. package/dist/chrome/fluid-thinking.d.ts.map +1 -0
  69. package/dist/chrome/fluid-thinking.js +37 -0
  70. package/dist/chrome/fluid-thinking.js.map +1 -0
  71. package/dist/chrome/humanize.d.ts +46 -0
  72. package/dist/chrome/humanize.d.ts.map +1 -0
  73. package/dist/chrome/humanize.js +104 -0
  74. package/dist/chrome/humanize.js.map +1 -0
  75. package/dist/chrome/index.d.ts +39 -0
  76. package/dist/chrome/index.d.ts.map +1 -0
  77. package/dist/chrome/index.js +38 -0
  78. package/dist/chrome/index.js.map +1 -0
  79. package/dist/chrome/markdown.d.ts +23 -0
  80. package/dist/chrome/markdown.d.ts.map +1 -0
  81. package/dist/chrome/markdown.js +149 -0
  82. package/dist/chrome/markdown.js.map +1 -0
  83. package/dist/chrome/morph-toast.d.ts +43 -0
  84. package/dist/chrome/morph-toast.d.ts.map +1 -0
  85. package/dist/chrome/morph-toast.js +89 -0
  86. package/dist/chrome/morph-toast.js.map +1 -0
  87. package/dist/chrome/no-policy-notice.d.ts +8 -0
  88. package/dist/chrome/no-policy-notice.d.ts.map +1 -0
  89. package/dist/chrome/no-policy-notice.js +18 -0
  90. package/dist/chrome/no-policy-notice.js.map +1 -0
  91. package/dist/chrome/onest-font.gen.d.ts +10 -0
  92. package/dist/chrome/onest-font.gen.d.ts.map +1 -0
  93. package/dist/chrome/onest-font.gen.js +10 -0
  94. package/dist/chrome/onest-font.gen.js.map +1 -0
  95. package/dist/chrome/overlay-registry.d.ts +66 -0
  96. package/dist/chrome/overlay-registry.d.ts.map +1 -0
  97. package/dist/chrome/overlay-registry.js +103 -0
  98. package/dist/chrome/overlay-registry.js.map +1 -0
  99. package/dist/chrome/palette-hotkey.d.ts +42 -0
  100. package/dist/chrome/palette-hotkey.d.ts.map +1 -0
  101. package/dist/chrome/palette-hotkey.js +91 -0
  102. package/dist/chrome/palette-hotkey.js.map +1 -0
  103. package/dist/chrome/policy-notice-body.d.ts +3 -0
  104. package/dist/chrome/policy-notice-body.d.ts.map +1 -0
  105. package/dist/chrome/policy-notice-body.js +6 -0
  106. package/dist/chrome/policy-notice-body.js.map +1 -0
  107. package/dist/chrome/takeover-portal.d.ts +16 -0
  108. package/dist/chrome/takeover-portal.d.ts.map +1 -0
  109. package/dist/chrome/takeover-portal.js +21 -0
  110. package/dist/chrome/takeover-portal.js.map +1 -0
  111. package/dist/chrome/thread/attachments.d.ts +24 -0
  112. package/dist/chrome/thread/attachments.d.ts.map +1 -0
  113. package/dist/chrome/thread/attachments.js +50 -0
  114. package/dist/chrome/thread/attachments.js.map +1 -0
  115. package/dist/chrome/thread/composer.d.ts +63 -0
  116. package/dist/chrome/thread/composer.d.ts.map +1 -0
  117. package/dist/chrome/thread/composer.js +259 -0
  118. package/dist/chrome/thread/composer.js.map +1 -0
  119. package/dist/chrome/thread/index.d.ts +41 -0
  120. package/dist/chrome/thread/index.d.ts.map +1 -0
  121. package/dist/chrome/thread/index.js +258 -0
  122. package/dist/chrome/thread/index.js.map +1 -0
  123. package/dist/chrome/thread/message-data.d.ts +35 -0
  124. package/dist/chrome/thread/message-data.d.ts.map +1 -0
  125. package/dist/chrome/thread/message-data.js +127 -0
  126. package/dist/chrome/thread/message-data.js.map +1 -0
  127. package/dist/chrome/thread/message-list.d.ts +30 -0
  128. package/dist/chrome/thread/message-list.d.ts.map +1 -0
  129. package/dist/chrome/thread/message-list.js +11 -0
  130. package/dist/chrome/thread/message-list.js.map +1 -0
  131. package/dist/chrome/thread/message.d.ts +18 -0
  132. package/dist/chrome/thread/message.d.ts.map +1 -0
  133. package/dist/chrome/thread/message.js +57 -0
  134. package/dist/chrome/thread/message.js.map +1 -0
  135. package/dist/chrome/thread/parts.d.ts +53 -0
  136. package/dist/chrome/thread/parts.d.ts.map +1 -0
  137. package/dist/chrome/thread/parts.js +184 -0
  138. package/dist/chrome/thread/parts.js.map +1 -0
  139. package/dist/chrome/thread/scrolling.d.ts +26 -0
  140. package/dist/chrome/thread/scrolling.d.ts.map +1 -0
  141. package/dist/chrome/thread/scrolling.js +214 -0
  142. package/dist/chrome/thread/scrolling.js.map +1 -0
  143. package/dist/chrome/truncate.d.ts +12 -0
  144. package/dist/chrome/truncate.d.ts.map +1 -0
  145. package/dist/chrome/truncate.js +18 -0
  146. package/dist/chrome/truncate.js.map +1 -0
  147. package/dist/chrome/vendo-activities.d.ts +24 -0
  148. package/dist/chrome/vendo-activities.d.ts.map +1 -0
  149. package/dist/chrome/vendo-activities.js +38 -0
  150. package/dist/chrome/vendo-activities.js.map +1 -0
  151. package/dist/chrome/vendo-overlay.d.ts +63 -0
  152. package/dist/chrome/vendo-overlay.d.ts.map +1 -0
  153. package/dist/chrome/vendo-overlay.js +256 -0
  154. package/dist/chrome/vendo-overlay.js.map +1 -0
  155. package/dist/chrome/vendo-page.d.ts +3 -0
  156. package/dist/chrome/vendo-page.d.ts.map +1 -0
  157. package/dist/chrome/vendo-page.js +162 -0
  158. package/dist/chrome/vendo-page.js.map +1 -0
  159. package/dist/chrome/vendo-palette.d.ts +29 -0
  160. package/dist/chrome/vendo-palette.d.ts.map +1 -0
  161. package/dist/chrome/vendo-palette.js +95 -0
  162. package/dist/chrome/vendo-palette.js.map +1 -0
  163. package/dist/chrome/vendo-slot.d.ts +79 -0
  164. package/dist/chrome/vendo-slot.d.ts.map +1 -0
  165. package/dist/chrome/vendo-slot.js +153 -0
  166. package/dist/chrome/vendo-slot.js.map +1 -0
  167. package/dist/chrome/vendo-toasts.d.ts +40 -0
  168. package/dist/chrome/vendo-toasts.d.ts.map +1 -0
  169. package/dist/chrome/vendo-toasts.js +135 -0
  170. package/dist/chrome/vendo-toasts.js.map +1 -0
  171. package/dist/chrome/vendo-trigger.d.ts +24 -0
  172. package/dist/chrome/vendo-trigger.d.ts.map +1 -0
  173. package/dist/chrome/vendo-trigger.js +30 -0
  174. package/dist/chrome/vendo-trigger.js.map +1 -0
  175. package/dist/chrome/waiting-queue.d.ts +8 -0
  176. package/dist/chrome/waiting-queue.d.ts.map +1 -0
  177. package/dist/chrome/waiting-queue.js +21 -0
  178. package/dist/chrome/waiting-queue.js.map +1 -0
  179. package/dist/client-impl.d.ts +4 -0
  180. package/dist/client-impl.d.ts.map +1 -0
  181. package/dist/client-impl.js +160 -0
  182. package/dist/client-impl.js.map +1 -0
  183. package/dist/client.d.ts +136 -0
  184. package/dist/client.d.ts.map +1 -0
  185. package/dist/client.js +2 -0
  186. package/dist/client.js.map +1 -0
  187. package/dist/context.d.ts +97 -0
  188. package/dist/context.d.ts.map +1 -0
  189. package/dist/context.js +71 -0
  190. package/dist/context.js.map +1 -0
  191. package/dist/eject-templates/activities/index.tsx +113 -0
  192. package/dist/eject-templates/templates.json +29 -0
  193. package/dist/eject-templates/thread/attachments.tsx +69 -0
  194. package/dist/eject-templates/thread/composer.tsx +409 -0
  195. package/dist/eject-templates/thread/index.tsx +422 -0
  196. package/dist/eject-templates/thread/message-data.ts +151 -0
  197. package/dist/eject-templates/thread/message-list.tsx +123 -0
  198. package/dist/eject-templates/thread/message.tsx +149 -0
  199. package/dist/eject-templates/thread/parts.tsx +293 -0
  200. package/dist/eject-templates/thread/scrolling.ts +223 -0
  201. package/dist/embeds.d.ts +28 -0
  202. package/dist/embeds.d.ts.map +1 -0
  203. package/dist/embeds.js +2 -0
  204. package/dist/embeds.js.map +1 -0
  205. package/dist/hooks/index.d.ts +18 -0
  206. package/dist/hooks/index.d.ts.map +1 -0
  207. package/dist/hooks/index.js +19 -0
  208. package/dist/hooks/index.js.map +1 -0
  209. package/dist/hooks/scripted-transport.d.ts +44 -0
  210. package/dist/hooks/scripted-transport.d.ts.map +1 -0
  211. package/dist/hooks/scripted-transport.js +58 -0
  212. package/dist/hooks/scripted-transport.js.map +1 -0
  213. package/dist/hooks/use-activity.d.ts +17 -0
  214. package/dist/hooks/use-activity.d.ts.map +1 -0
  215. package/dist/hooks/use-activity.js +50 -0
  216. package/dist/hooks/use-activity.js.map +1 -0
  217. package/dist/hooks/use-app.d.ts +19 -0
  218. package/dist/hooks/use-app.d.ts.map +1 -0
  219. package/dist/hooks/use-app.js +66 -0
  220. package/dist/hooks/use-app.js.map +1 -0
  221. package/dist/hooks/use-approvals.d.ts +13 -0
  222. package/dist/hooks/use-approvals.d.ts.map +1 -0
  223. package/dist/hooks/use-approvals.js +14 -0
  224. package/dist/hooks/use-approvals.js.map +1 -0
  225. package/dist/hooks/use-apps.d.ts +17 -0
  226. package/dist/hooks/use-apps.d.ts.map +1 -0
  227. package/dist/hooks/use-apps.js +30 -0
  228. package/dist/hooks/use-apps.js.map +1 -0
  229. package/dist/hooks/use-automations.d.ts +25 -0
  230. package/dist/hooks/use-automations.d.ts.map +1 -0
  231. package/dist/hooks/use-automations.js +30 -0
  232. package/dist/hooks/use-automations.js.map +1 -0
  233. package/dist/hooks/use-connections.d.ts +12 -0
  234. package/dist/hooks/use-connections.d.ts.map +1 -0
  235. package/dist/hooks/use-connections.js +15 -0
  236. package/dist/hooks/use-connections.js.map +1 -0
  237. package/dist/hooks/use-connector-catalog.d.ts +8 -0
  238. package/dist/hooks/use-connector-catalog.d.ts.map +1 -0
  239. package/dist/hooks/use-connector-catalog.js +52 -0
  240. package/dist/hooks/use-connector-catalog.js.map +1 -0
  241. package/dist/hooks/use-grants.d.ts +13 -0
  242. package/dist/hooks/use-grants.d.ts.map +1 -0
  243. package/dist/hooks/use-grants.js +14 -0
  244. package/dist/hooks/use-grants.js.map +1 -0
  245. package/dist/hooks/use-mobile-takeover.d.ts +22 -0
  246. package/dist/hooks/use-mobile-takeover.d.ts.map +1 -0
  247. package/dist/hooks/use-mobile-takeover.js +66 -0
  248. package/dist/hooks/use-mobile-takeover.js.map +1 -0
  249. package/dist/hooks/use-resource.d.ts +21 -0
  250. package/dist/hooks/use-resource.d.ts.map +1 -0
  251. package/dist/hooks/use-resource.js +79 -0
  252. package/dist/hooks/use-resource.js.map +1 -0
  253. package/dist/hooks/use-slot-app.d.ts +19 -0
  254. package/dist/hooks/use-slot-app.d.ts.map +1 -0
  255. package/dist/hooks/use-slot-app.js +18 -0
  256. package/dist/hooks/use-slot-app.js.map +1 -0
  257. package/dist/hooks/use-threads.d.ts +16 -0
  258. package/dist/hooks/use-threads.d.ts.map +1 -0
  259. package/dist/hooks/use-threads.js +15 -0
  260. package/dist/hooks/use-threads.js.map +1 -0
  261. package/dist/hooks/use-vendo-overlay.d.ts +31 -0
  262. package/dist/hooks/use-vendo-overlay.d.ts.map +1 -0
  263. package/dist/hooks/use-vendo-overlay.js +23 -0
  264. package/dist/hooks/use-vendo-overlay.js.map +1 -0
  265. package/dist/hooks/use-vendo-status.d.ts +6 -0
  266. package/dist/hooks/use-vendo-status.d.ts.map +1 -0
  267. package/dist/hooks/use-vendo-status.js +28 -0
  268. package/dist/hooks/use-vendo-status.js.map +1 -0
  269. package/dist/hooks/use-vendo-thread.d.ts +39 -0
  270. package/dist/hooks/use-vendo-thread.d.ts.map +1 -0
  271. package/dist/hooks/use-vendo-thread.js +185 -0
  272. package/dist/hooks/use-vendo-thread.js.map +1 -0
  273. package/dist/index.d.ts +12 -0
  274. package/dist/index.d.ts.map +1 -0
  275. package/dist/index.js +12 -0
  276. package/dist/index.js.map +1 -0
  277. package/dist/kit/charts/bar.d.ts +16 -0
  278. package/dist/kit/charts/bar.d.ts.map +1 -0
  279. package/dist/kit/charts/bar.js +21 -0
  280. package/dist/kit/charts/bar.js.map +1 -0
  281. package/dist/kit/charts/donut.d.ts +16 -0
  282. package/dist/kit/charts/donut.d.ts.map +1 -0
  283. package/dist/kit/charts/donut.js +17 -0
  284. package/dist/kit/charts/donut.js.map +1 -0
  285. package/dist/kit/charts/line.d.ts +19 -0
  286. package/dist/kit/charts/line.d.ts.map +1 -0
  287. package/dist/kit/charts/line.js +21 -0
  288. package/dist/kit/charts/line.js.map +1 -0
  289. package/dist/kit/charts/progress.d.ts +12 -0
  290. package/dist/kit/charts/progress.d.ts.map +1 -0
  291. package/dist/kit/charts/progress.js +25 -0
  292. package/dist/kit/charts/progress.js.map +1 -0
  293. package/dist/kit/charts/sanitize.d.ts +24 -0
  294. package/dist/kit/charts/sanitize.d.ts.map +1 -0
  295. package/dist/kit/charts/sanitize.js +50 -0
  296. package/dist/kit/charts/sanitize.js.map +1 -0
  297. package/dist/kit/charts/sparkline.d.ts +11 -0
  298. package/dist/kit/charts/sparkline.d.ts.map +1 -0
  299. package/dist/kit/charts/sparkline.js +17 -0
  300. package/dist/kit/charts/sparkline.js.map +1 -0
  301. package/dist/kit/data/badge.d.ts +13 -0
  302. package/dist/kit/data/badge.d.ts.map +1 -0
  303. package/dist/kit/data/badge.js +12 -0
  304. package/dist/kit/data/badge.js.map +1 -0
  305. package/dist/kit/data/card-list.d.ts +23 -0
  306. package/dist/kit/data/card-list.d.ts.map +1 -0
  307. package/dist/kit/data/card-list.js +43 -0
  308. package/dist/kit/data/card-list.js.map +1 -0
  309. package/dist/kit/data/data-table.d.ts +32 -0
  310. package/dist/kit/data/data-table.d.ts.map +1 -0
  311. package/dist/kit/data/data-table.js +153 -0
  312. package/dist/kit/data/data-table.js.map +1 -0
  313. package/dist/kit/data/stat.d.ts +15 -0
  314. package/dist/kit/data/stat.d.ts.map +1 -0
  315. package/dist/kit/data/stat.js +28 -0
  316. package/dist/kit/data/stat.js.map +1 -0
  317. package/dist/kit/feedback/accordion.d.ts +15 -0
  318. package/dist/kit/feedback/accordion.d.ts.map +1 -0
  319. package/dist/kit/feedback/accordion.js +33 -0
  320. package/dist/kit/feedback/accordion.js.map +1 -0
  321. package/dist/kit/feedback/callout.d.ts +13 -0
  322. package/dist/kit/feedback/callout.d.ts.map +1 -0
  323. package/dist/kit/feedback/callout.js +24 -0
  324. package/dist/kit/feedback/callout.js.map +1 -0
  325. package/dist/kit/feedback/tabs.d.ts +14 -0
  326. package/dist/kit/feedback/tabs.d.ts.map +1 -0
  327. package/dist/kit/feedback/tabs.js +37 -0
  328. package/dist/kit/feedback/tabs.js.map +1 -0
  329. package/dist/kit/format.d.ts +60 -0
  330. package/dist/kit/format.d.ts.map +1 -0
  331. package/dist/kit/format.js +123 -0
  332. package/dist/kit/format.js.map +1 -0
  333. package/dist/kit/forms/button.d.ts +17 -0
  334. package/dist/kit/forms/button.d.ts.map +1 -0
  335. package/dist/kit/forms/button.js +33 -0
  336. package/dist/kit/forms/button.js.map +1 -0
  337. package/dist/kit/forms/checkbox.d.ts +9 -0
  338. package/dist/kit/forms/checkbox.d.ts.map +1 -0
  339. package/dist/kit/forms/checkbox.js +9 -0
  340. package/dist/kit/forms/checkbox.js.map +1 -0
  341. package/dist/kit/forms/date-picker.d.ts +13 -0
  342. package/dist/kit/forms/date-picker.d.ts.map +1 -0
  343. package/dist/kit/forms/date-picker.js +9 -0
  344. package/dist/kit/forms/date-picker.js.map +1 -0
  345. package/dist/kit/forms/disclaimer.d.ts +8 -0
  346. package/dist/kit/forms/disclaimer.d.ts.map +1 -0
  347. package/dist/kit/forms/disclaimer.js +20 -0
  348. package/dist/kit/forms/disclaimer.js.map +1 -0
  349. package/dist/kit/forms/field.d.ts +18 -0
  350. package/dist/kit/forms/field.d.ts.map +1 -0
  351. package/dist/kit/forms/field.js +19 -0
  352. package/dist/kit/forms/field.js.map +1 -0
  353. package/dist/kit/forms/form.d.ts +10 -0
  354. package/dist/kit/forms/form.d.ts.map +1 -0
  355. package/dist/kit/forms/form.js +9 -0
  356. package/dist/kit/forms/form.js.map +1 -0
  357. package/dist/kit/forms/input.d.ts +14 -0
  358. package/dist/kit/forms/input.d.ts.map +1 -0
  359. package/dist/kit/forms/input.js +9 -0
  360. package/dist/kit/forms/input.js.map +1 -0
  361. package/dist/kit/forms/select.d.ts +21 -0
  362. package/dist/kit/forms/select.d.ts.map +1 -0
  363. package/dist/kit/forms/select.js +35 -0
  364. package/dist/kit/forms/select.js.map +1 -0
  365. package/dist/kit/forms/textarea.d.ts +12 -0
  366. package/dist/kit/forms/textarea.d.ts.map +1 -0
  367. package/dist/kit/forms/textarea.js +9 -0
  368. package/dist/kit/forms/textarea.js.map +1 -0
  369. package/dist/kit/index.d.ts +42 -0
  370. package/dist/kit/index.d.ts.map +1 -0
  371. package/dist/kit/index.js +45 -0
  372. package/dist/kit/index.js.map +1 -0
  373. package/dist/kit/kit-prompt.d.ts +7 -0
  374. package/dist/kit/kit-prompt.d.ts.map +1 -0
  375. package/dist/kit/kit-prompt.js +7 -0
  376. package/dist/kit/kit-prompt.js.map +1 -0
  377. package/dist/kit/layout.d.ts +29 -0
  378. package/dist/kit/layout.d.ts.map +1 -0
  379. package/dist/kit/layout.js +64 -0
  380. package/dist/kit/layout.js.map +1 -0
  381. package/dist/kit/registry.d.ts +11 -0
  382. package/dist/kit/registry.d.ts.map +1 -0
  383. package/dist/kit/registry.js +34 -0
  384. package/dist/kit/registry.js.map +1 -0
  385. package/dist/kit/schema.d.ts +9 -0
  386. package/dist/kit/schema.d.ts.map +1 -0
  387. package/dist/kit/schema.js +9 -0
  388. package/dist/kit/schema.js.map +1 -0
  389. package/dist/kit/tokens.d.ts +33 -0
  390. package/dist/kit/tokens.d.ts.map +1 -0
  391. package/dist/kit/tokens.js +48 -0
  392. package/dist/kit/tokens.js.map +1 -0
  393. package/dist/kit/values.d.ts +55 -0
  394. package/dist/kit/values.d.ts.map +1 -0
  395. package/dist/kit/values.js +108 -0
  396. package/dist/kit/values.js.map +1 -0
  397. package/dist/theme.d.ts +25 -0
  398. package/dist/theme.d.ts.map +1 -0
  399. package/dist/theme.js +100 -0
  400. package/dist/theme.js.map +1 -0
  401. package/dist/tree/bindings.d.ts +4 -0
  402. package/dist/tree/bindings.d.ts.map +1 -0
  403. package/dist/tree/bindings.js +20 -0
  404. package/dist/tree/bindings.js.map +1 -0
  405. package/dist/tree/branded.d.ts +124 -0
  406. package/dist/tree/branded.d.ts.map +1 -0
  407. package/dist/tree/branded.js +319 -0
  408. package/dist/tree/branded.js.map +1 -0
  409. package/dist/tree/error-boundary.d.ts +22 -0
  410. package/dist/tree/error-boundary.d.ts.map +1 -0
  411. package/dist/tree/error-boundary.js +25 -0
  412. package/dist/tree/error-boundary.js.map +1 -0
  413. package/dist/tree/fluid-reveal.d.ts +22 -0
  414. package/dist/tree/fluid-reveal.d.ts.map +1 -0
  415. package/dist/tree/fluid-reveal.js +28 -0
  416. package/dist/tree/fluid-reveal.js.map +1 -0
  417. package/dist/tree/forming-skeleton.d.ts +14 -0
  418. package/dist/tree/forming-skeleton.d.ts.map +1 -0
  419. package/dist/tree/forming-skeleton.js +36 -0
  420. package/dist/tree/forming-skeleton.js.map +1 -0
  421. package/dist/tree/frames.d.ts +52 -0
  422. package/dist/tree/frames.d.ts.map +1 -0
  423. package/dist/tree/frames.js +143 -0
  424. package/dist/tree/frames.js.map +1 -0
  425. package/dist/tree/host-mount.d.ts +24 -0
  426. package/dist/tree/host-mount.d.ts.map +1 -0
  427. package/dist/tree/host-mount.js +0 -0
  428. package/dist/tree/host-mount.js.map +1 -0
  429. package/dist/tree/index.d.ts +9 -0
  430. package/dist/tree/index.d.ts.map +1 -0
  431. package/dist/tree/index.js +9 -0
  432. package/dist/tree/index.js.map +1 -0
  433. package/dist/tree/jail/JailedComponent.d.ts +41 -0
  434. package/dist/tree/jail/JailedComponent.d.ts.map +1 -0
  435. package/dist/tree/jail/JailedComponent.js +269 -0
  436. package/dist/tree/jail/JailedComponent.js.map +1 -0
  437. package/dist/tree/jail/runtime-bundle.gen.d.ts +3 -0
  438. package/dist/tree/jail/runtime-bundle.gen.d.ts.map +1 -0
  439. package/dist/tree/jail/runtime-bundle.gen.js +3 -0
  440. package/dist/tree/jail/runtime-bundle.gen.js.map +1 -0
  441. package/dist/tree/jail/runtime-entry.d.ts +18 -0
  442. package/dist/tree/jail/runtime-entry.d.ts.map +1 -0
  443. package/dist/tree/jail/runtime-entry.js +440 -0
  444. package/dist/tree/jail/runtime-entry.js.map +1 -0
  445. package/dist/tree/jail/viewport-css.d.ts +17 -0
  446. package/dist/tree/jail/viewport-css.d.ts.map +1 -0
  447. package/dist/tree/jail/viewport-css.js +32 -0
  448. package/dist/tree/jail/viewport-css.js.map +1 -0
  449. package/dist/tree/mcp-shim/entry.d.ts +2 -0
  450. package/dist/tree/mcp-shim/entry.d.ts.map +1 -0
  451. package/dist/tree/mcp-shim/entry.js +45 -0
  452. package/dist/tree/mcp-shim/entry.js.map +1 -0
  453. package/dist/tree/mcp-shim/http-open-card.d.ts +5 -0
  454. package/dist/tree/mcp-shim/http-open-card.d.ts.map +1 -0
  455. package/dist/tree/mcp-shim/http-open-card.js +61 -0
  456. package/dist/tree/mcp-shim/http-open-card.js.map +1 -0
  457. package/dist/tree/mcp-shim/shim-core.d.ts +58 -0
  458. package/dist/tree/mcp-shim/shim-core.d.ts.map +1 -0
  459. package/dist/tree/mcp-shim/shim-core.js +176 -0
  460. package/dist/tree/mcp-shim/shim-core.js.map +1 -0
  461. package/dist/tree/mcp-shim/theme.d.ts +8 -0
  462. package/dist/tree/mcp-shim/theme.d.ts.map +1 -0
  463. package/dist/tree/mcp-shim/theme.js +36 -0
  464. package/dist/tree/mcp-shim/theme.js.map +1 -0
  465. package/dist/tree/notice.d.ts +8 -0
  466. package/dist/tree/notice.d.ts.map +1 -0
  467. package/dist/tree/notice.js +30 -0
  468. package/dist/tree/notice.js.map +1 -0
  469. package/dist/tree/primitives.d.ts +30 -0
  470. package/dist/tree/primitives.d.ts.map +1 -0
  471. package/dist/tree/primitives.js +105 -0
  472. package/dist/tree/primitives.js.map +1 -0
  473. package/dist/tree/renderer-v2.d.ts +15 -0
  474. package/dist/tree/renderer-v2.d.ts.map +1 -0
  475. package/dist/tree/renderer-v2.js +71 -0
  476. package/dist/tree/renderer-v2.js.map +1 -0
  477. package/dist/tree/renderer.d.ts +77 -0
  478. package/dist/tree/renderer.d.ts.map +1 -0
  479. package/dist/tree/renderer.js +376 -0
  480. package/dist/tree/renderer.js.map +1 -0
  481. package/dist/voice/driver.d.ts +94 -0
  482. package/dist/voice/driver.d.ts.map +1 -0
  483. package/dist/voice/driver.js +2 -0
  484. package/dist/voice/driver.js.map +1 -0
  485. package/dist/voice/index.d.ts +7 -0
  486. package/dist/voice/index.d.ts.map +1 -0
  487. package/dist/voice/index.js +5 -0
  488. package/dist/voice/index.js.map +1 -0
  489. package/dist/voice/realtime-driver.d.ts +57 -0
  490. package/dist/voice/realtime-driver.d.ts.map +1 -0
  491. package/dist/voice/realtime-driver.js +592 -0
  492. package/dist/voice/realtime-driver.js.map +1 -0
  493. package/dist/voice/stage.d.ts +12 -0
  494. package/dist/voice/stage.d.ts.map +1 -0
  495. package/dist/voice/stage.js +259 -0
  496. package/dist/voice/stage.js.map +1 -0
  497. package/dist/voice/use-voice-approvals.d.ts +16 -0
  498. package/dist/voice/use-voice-approvals.d.ts.map +1 -0
  499. package/dist/voice/use-voice-approvals.js +77 -0
  500. package/dist/voice/use-voice-approvals.js.map +1 -0
  501. package/dist/voice/use-voice.d.ts +26 -0
  502. package/dist/voice/use-voice.d.ts.map +1 -0
  503. package/dist/voice/use-voice.js +201 -0
  504. package/dist/voice/use-voice.js.map +1 -0
  505. package/dist/voice/voice-act.d.ts +13 -0
  506. package/dist/voice/voice-act.d.ts.map +1 -0
  507. package/dist/voice/voice-act.js +301 -0
  508. package/dist/voice/voice-act.js.map +1 -0
  509. package/dist/voice/voice-blob.d.ts +17 -0
  510. package/dist/voice/voice-blob.d.ts.map +1 -0
  511. package/dist/voice/voice-blob.js +67 -0
  512. package/dist/voice/voice-blob.js.map +1 -0
  513. package/dist/voice/voice-consent.d.ts +17 -0
  514. package/dist/voice/voice-consent.d.ts.map +1 -0
  515. package/dist/voice/voice-consent.js +45 -0
  516. package/dist/voice/voice-consent.js.map +1 -0
  517. package/dist/voice/voice-drawer.d.ts +10 -0
  518. package/dist/voice/voice-drawer.d.ts.map +1 -0
  519. package/dist/voice/voice-drawer.js +22 -0
  520. package/dist/voice/voice-drawer.js.map +1 -0
  521. package/dist/wire-types.d.ts +238 -0
  522. package/dist/wire-types.d.ts.map +1 -0
  523. package/dist/wire-types.js +2 -0
  524. package/dist/wire-types.js.map +1 -0
  525. package/package.json +106 -0
@@ -0,0 +1,46 @@
1
+ /** ENG-216 — tool & approval humanization helpers.
2
+
3
+ The approval/tool wire parts (01-core stream-parts) deliberately carry only
4
+ `toolCallId` + `risk` + `approvalId`; no friendly name, description or arg
5
+ formatting ever reaches the client. Chrome therefore humanizes at the render
6
+ site: a host-supplied `ToolMeta` (VendoProvider `tools` prop) wins, and when
7
+ it is absent these pure fallbacks prettify the raw id and args so end users
8
+ never read a raw slug, a lifecycle string, or raw JSON. */
9
+ import type { Json } from "@vendoai/core";
10
+ /** Optional host-supplied friendly metadata for one tool (08-ui provider seam).
11
+ Purely UI-side and additive — the host describes its own tools so chips and
12
+ approvals read in human language; every field is optional and degrades to the
13
+ formatting fallback below. */
14
+ export interface ToolMeta {
15
+ /** Short display label, e.g. "Send email". */
16
+ label?: string;
17
+ /** One-line description shown under the approval title. */
18
+ description?: string;
19
+ /** Custom one-line argument summary for the tool chip. */
20
+ summarize?(args: Json): string | undefined;
21
+ }
22
+ export type ToolMetaMap = Record<string, ToolMeta>;
23
+ /** Prettify a raw tool id / slug into a human label:
24
+ `host_email_send` → "Email send", `fn:listInvoices` → "List invoices",
25
+ `gmail_GMAIL_CREATE_EMAIL_DRAFT` → "Gmail create email draft". */
26
+ export declare function humanizeToolName(raw: string): string;
27
+ /** The display title for a tool: host label wins, else the prettified id. */
28
+ export declare function toolTitle(name: string, meta?: ToolMeta): string;
29
+ /** Display name for a toolkit slug: the known-brand table first (separator-less
30
+ slugs like "googlecalendar" can't be recovered by splitting), then a
31
+ separator-splitting proper-caser ("google_calendar" → "Google Calendar").
32
+ The brand-forward connect surfaces (lane pick 2-A) never show the raw slug. */
33
+ export declare function toolkitDisplayName(toolkit: string): string;
34
+ /** A plain-object argument map → humanized `{ label, value }` rows, in order.
35
+ Non-object args (string / array / null) produce no rows — the caller keeps
36
+ the server-formatted `inputPreview` string in that case. */
37
+ export declare function argFields(args: unknown): {
38
+ label: string;
39
+ value: string;
40
+ }[];
41
+ /** A compact one-line arg summary for a tool chip — never raw JSON. */
42
+ export declare function summarizeArgs(args: unknown): string | undefined;
43
+ /** Multi-line `Label: value` preview for the approval card, replacing raw JSON.
44
+ Falls back to a plain string / prettified JSON for non-object args. */
45
+ export declare function previewArgs(args: unknown): string;
46
+ //# sourceMappingURL=humanize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"humanize.d.ts","sourceRoot":"","sources":["../../src/chrome/humanize.ts"],"names":[],"mappings":"AAAA;;;;;;;8DAO8D;AAC9D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C;;;iCAGiC;AACjC,MAAM,WAAW,QAAQ;IACvB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,SAAS,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;CAC5C;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAEnD;;qEAEqE;AACrE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBpD;AAED,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAG/D;AAcD;;;kFAGkF;AAClF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ1D;AAcD;;+DAE+D;AAC/D,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAM3E;AAID,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAM/D;AAED;0EAC0E;AAC1E,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CASjD"}
@@ -0,0 +1,104 @@
1
+ /** Prettify a raw tool id / slug into a human label:
2
+ `host_email_send` → "Email send", `fn:listInvoices` → "List invoices",
3
+ `gmail_GMAIL_CREATE_EMAIL_DRAFT` → "Gmail create email draft". */
4
+ export function humanizeToolName(raw) {
5
+ const stripped = raw.replace(/^fn:/i, "").replace(/^host[_:.\- ]?/i, "");
6
+ const words = stripped
7
+ // camelCase / PascalCase boundaries
8
+ .replace(/([a-z0-9])([A-Z])/g, "$1 $2")
9
+ // any run of separators
10
+ .replace(/[._:\-\s]+/g, " ")
11
+ .trim()
12
+ .split(" ")
13
+ .filter(Boolean)
14
+ .map(word => word.toLowerCase());
15
+ // Collapse consecutive duplicate tokens ("gmail GMAIL …" → "gmail …").
16
+ const deduped = words.filter((word, index) => word !== words[index - 1]);
17
+ if (deduped.length === 0)
18
+ return raw;
19
+ const sentence = deduped.join(" ");
20
+ return sentence.charAt(0).toUpperCase() + sentence.slice(1);
21
+ }
22
+ /** The display title for a tool: host label wins, else the prettified id. */
23
+ export function toolTitle(name, meta) {
24
+ const label = meta?.label?.trim();
25
+ return label ? label : humanizeToolName(name);
26
+ }
27
+ /** Well-known toolkit slugs whose display name is not just proper-casing
28
+ ("googlecalendar" → "Google Calendar"). One table for every chrome surface
29
+ (connect card/dock/tray, connected accounts) so names can't drift. */
30
+ const TOOLKIT_DISPLAY = {
31
+ slack: "Slack",
32
+ github: "GitHub",
33
+ gmail: "Gmail",
34
+ notion: "Notion",
35
+ linear: "Linear",
36
+ googlecalendar: "Google Calendar",
37
+ };
38
+ /** Display name for a toolkit slug: the known-brand table first (separator-less
39
+ slugs like "googlecalendar" can't be recovered by splitting), then a
40
+ separator-splitting proper-caser ("google_calendar" → "Google Calendar").
41
+ The brand-forward connect surfaces (lane pick 2-A) never show the raw slug. */
42
+ export function toolkitDisplayName(toolkit) {
43
+ const known = TOOLKIT_DISPLAY[toolkit.toLowerCase().replace(/[-_\s]+/g, "")];
44
+ if (known)
45
+ return known;
46
+ return toolkit
47
+ .split(/[-_\s]+/)
48
+ .filter(word => word.length > 0)
49
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1))
50
+ .join(" ") || toolkit;
51
+ }
52
+ function formatValue(value) {
53
+ if (typeof value === "string")
54
+ return value;
55
+ if (typeof value === "number" || typeof value === "boolean")
56
+ return String(value);
57
+ if (value === null)
58
+ return "null";
59
+ try {
60
+ const json = JSON.stringify(value);
61
+ return json.length > 80 ? `${json.slice(0, 79)}…` : json;
62
+ }
63
+ catch {
64
+ return String(value);
65
+ }
66
+ }
67
+ /** A plain-object argument map → humanized `{ label, value }` rows, in order.
68
+ Non-object args (string / array / null) produce no rows — the caller keeps
69
+ the server-formatted `inputPreview` string in that case. */
70
+ export function argFields(args) {
71
+ if (args === null || typeof args !== "object" || Array.isArray(args))
72
+ return [];
73
+ return Object.entries(args).map(([key, value]) => ({
74
+ label: humanizeToolName(key),
75
+ value: formatValue(value),
76
+ }));
77
+ }
78
+ const SUMMARY_MAX = 120;
79
+ /** A compact one-line arg summary for a tool chip — never raw JSON. */
80
+ export function summarizeArgs(args) {
81
+ const fields = argFields(args);
82
+ if (fields.length === 0)
83
+ return undefined;
84
+ const summary = fields.slice(0, 3).map(field => `${field.label} ${field.value}`).join(" · ");
85
+ if (summary.length === 0)
86
+ return undefined;
87
+ return summary.length > SUMMARY_MAX ? `${summary.slice(0, SUMMARY_MAX - 1)}…` : summary;
88
+ }
89
+ /** Multi-line `Label: value` preview for the approval card, replacing raw JSON.
90
+ Falls back to a plain string / prettified JSON for non-object args. */
91
+ export function previewArgs(args) {
92
+ const fields = argFields(args);
93
+ if (fields.length > 0)
94
+ return fields.map(field => `${field.label}: ${field.value}`).join("\n");
95
+ if (typeof args === "string")
96
+ return args;
97
+ try {
98
+ return JSON.stringify(args, null, 2);
99
+ }
100
+ catch {
101
+ return String(args);
102
+ }
103
+ }
104
+ //# sourceMappingURL=humanize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"humanize.js","sourceRoot":"","sources":["../../src/chrome/humanize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /** @vendoai/ui/chrome — the shipped, theme-adopting surfaces (08-ui §4). */
2
+ export { ActivityPanel } from "./activity-panel.js";
3
+ export { VendoActivities, type VendoActivitiesProps } from "./vendo-activities.js";
4
+ export { ApprovalCard, type ApprovalCardProps } from "./approval-card.js";
5
+ export { VendoAppEmbed, VendoApprovalEmbed, VendoToolResult } from "./embeds.js";
6
+ export { ApprovalSheet } from "./approval-sheet.js";
7
+ export { AutomationsPanel } from "./automations-panel.js";
8
+ export { ConnectCard, type ConnectCardProps } from "./connect-card.js";
9
+ export { ConnectedAccountsPanel } from "./connected-accounts-panel.js";
10
+ export { NoPolicyNotice } from "./no-policy-notice.js";
11
+ export { VendoOverlay, type VendoOverlayProps } from "./vendo-overlay.js";
12
+ export { defaultVendoGreeting, hasSeen, markSeen, type VendoDiscoverability, type VendoGreeting } from "./discoverability.js";
13
+ export { openVendoConversation, type OpenConversationOptions } from "./overlay-registry.js";
14
+ export { VendoTrigger, type VendoTriggerProps } from "./vendo-trigger.js";
15
+ export { VendoPage } from "./vendo-page.js";
16
+ export { VendoPalette, type VendoCommand } from "./vendo-palette.js";
17
+ export { type HotkeyChord, type PaletteHotkey } from "./palette-hotkey.js";
18
+ export { VendoSlot } from "./vendo-slot.js";
19
+ export { VendoThread, type VendoThreadProps } from "./thread/index.js";
20
+ export { VendoToasts, vendoToast, dismissAllVendoToasts, type VendoToastsProps, type VendoToastInput, type VendoToastAction } from "./vendo-toasts.js";
21
+ export { WaitingQueue, type WaitingQueueProps } from "./waiting-queue.js";
22
+ export { VendoStage } from "../voice/stage.js";
23
+ /** The eject surface: internals the ejected thread compiles against
24
+ (scripts/eject-templates-lib.mjs enforces this list at build). Exported
25
+ deliberately — ejected chrome keeps data/wire logic as a package
26
+ dependency and only forks pixels (§4 customization ladder). */
27
+ export { ActivityLedger } from "./activity-ledger.js";
28
+ export { describeActivity, formatAuditTime, formatRelativeAuditTime, kindGlyph, outcomeLabel, type ActivityGlyph, type OutcomeTone, } from "./activity-semantics.js";
29
+ export { BuildBeat, StatusRibbon, toolPresentation } from "./build-beat.js";
30
+ export { ChromeRoot } from "./chrome-root.js";
31
+ export { useCopyFeedback } from "./clipboard.js";
32
+ export { ConnectDockButton, ConnectTray } from "./connect-dock.js";
33
+ export { FluidThinking } from "./fluid-thinking.js";
34
+ export { previewArgs, toolTitle } from "./humanize.js";
35
+ export { Markdown } from "./markdown.js";
36
+ export { ACTIVITY_ANCHOR_ATTRIBUTE, ACTIVITY_BUMP_EVENT, MorphToast, type MorphToastProps } from "./morph-toast.js";
37
+ export { PrefillScopeContext, registerPrefillConsumer } from "./overlay-registry.js";
38
+ export { LONG_TEXT_CAP, truncateHead } from "./truncate.js";
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chrome/index.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,oBAAoB,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC9H,OAAO,EAAE,qBAAqB,EAAE,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,qBAAqB,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvJ,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C;;;kEAGkE;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,uBAAuB,EACvB,SAAS,EACT,YAAY,EACZ,KAAK,aAAa,EAClB,KAAK,WAAW,GACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACpH,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,38 @@
1
+ /** @vendoai/ui/chrome — the shipped, theme-adopting surfaces (08-ui §4). */
2
+ export { ActivityPanel } from "./activity-panel.js";
3
+ export { VendoActivities } from "./vendo-activities.js";
4
+ export { ApprovalCard } from "./approval-card.js";
5
+ export { VendoAppEmbed, VendoApprovalEmbed, VendoToolResult } from "./embeds.js";
6
+ export { ApprovalSheet } from "./approval-sheet.js";
7
+ export { AutomationsPanel } from "./automations-panel.js";
8
+ export { ConnectCard } from "./connect-card.js";
9
+ export { ConnectedAccountsPanel } from "./connected-accounts-panel.js";
10
+ export { NoPolicyNotice } from "./no-policy-notice.js";
11
+ export { VendoOverlay } from "./vendo-overlay.js";
12
+ export { defaultVendoGreeting, hasSeen, markSeen } from "./discoverability.js";
13
+ export { openVendoConversation } from "./overlay-registry.js";
14
+ export { VendoTrigger } from "./vendo-trigger.js";
15
+ export { VendoPage } from "./vendo-page.js";
16
+ export { VendoPalette } from "./vendo-palette.js";
17
+ export { VendoSlot } from "./vendo-slot.js";
18
+ export { VendoThread } from "./thread/index.js";
19
+ export { VendoToasts, vendoToast, dismissAllVendoToasts } from "./vendo-toasts.js";
20
+ export { WaitingQueue } from "./waiting-queue.js";
21
+ export { VendoStage } from "../voice/stage.js";
22
+ /** The eject surface: internals the ejected thread compiles against
23
+ (scripts/eject-templates-lib.mjs enforces this list at build). Exported
24
+ deliberately — ejected chrome keeps data/wire logic as a package
25
+ dependency and only forks pixels (§4 customization ladder). */
26
+ export { ActivityLedger } from "./activity-ledger.js";
27
+ export { describeActivity, formatAuditTime, formatRelativeAuditTime, kindGlyph, outcomeLabel, } from "./activity-semantics.js";
28
+ export { BuildBeat, StatusRibbon, toolPresentation } from "./build-beat.js";
29
+ export { ChromeRoot } from "./chrome-root.js";
30
+ export { useCopyFeedback } from "./clipboard.js";
31
+ export { ConnectDockButton, ConnectTray } from "./connect-dock.js";
32
+ export { FluidThinking } from "./fluid-thinking.js";
33
+ export { previewArgs, toolTitle } from "./humanize.js";
34
+ export { Markdown } from "./markdown.js";
35
+ export { ACTIVITY_ANCHOR_ATTRIBUTE, ACTIVITY_BUMP_EVENT, MorphToast } from "./morph-toast.js";
36
+ export { PrefillScopeContext, registerPrefillConsumer } from "./overlay-registry.js";
37
+ export { LONG_TEXT_CAP, truncateHead } from "./truncate.js";
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chrome/index.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAA6B,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,YAAY,EAA0B,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAyB,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAA0B,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,QAAQ,EAAiD,MAAM,sBAAsB,CAAC;AAC9H,OAAO,EAAE,qBAAqB,EAAgC,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAA0B,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAC;AAErE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAyB,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,qBAAqB,EAAsE,MAAM,mBAAmB,CAAC;AACvJ,OAAO,EAAE,YAAY,EAA0B,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C;;;kEAGkE;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,uBAAuB,EACvB,SAAS,EACT,YAAY,GAGb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,UAAU,EAAwB,MAAM,kBAAkB,CAAC;AACpH,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Assistant text as GitHub-flavored markdown (the `.fl-md` design). react-markdown
3
+ * escapes raw HTML by default (no rehype-raw), so no markup is injected — safe for
4
+ * model-authored text.
5
+ *
6
+ * ENG-218 — solidity under extreme content:
7
+ * - `memo`: a growing streamed turn re-renders the WHOLE list on every token.
8
+ * Memoizing means only the block whose `text` actually changed re-parses;
9
+ * every settled turn above it is skipped instead of re-parsing per token
10
+ * (the O(thread²) markdown cost the issue calls out).
11
+ * - restored huge bodies bound their parse/DOM cost: structured ones fold into
12
+ * sections (8D), unstructured ones truncate under the 3D fade-fold. Only
13
+ * restored bodies collapse — a message the reader just watched stream in
14
+ * must not snap shut — and never while streaming.
15
+ */
16
+ declare function MarkdownImpl({ text, streaming, restored }: {
17
+ text: string;
18
+ streaming?: boolean;
19
+ restored?: boolean;
20
+ }): import("react").JSX.Element;
21
+ export declare const Markdown: import("react").MemoExoticComponent<typeof MarkdownImpl>;
22
+ export {};
23
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/chrome/markdown.tsx"],"names":[],"mappings":"AAsKA;;;;;;;;;;;;;;GAcG;AACH,iBAAS,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,+BA0C7G;AAED,eAAO,MAAM,QAAQ,0DAAqB,CAAC"}
@@ -0,0 +1,149 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { isValidElement, memo, useRef, useState } from "react";
3
+ import ReactMarkdown from "react-markdown";
4
+ import remarkGfm from "remark-gfm";
5
+ import { useCopyFeedback } from "./clipboard.js";
6
+ import { LONG_TEXT_CAP, truncateHead } from "./truncate.js";
7
+ // Module-level so the array reference is stable across (streaming) re-renders —
8
+ // react-markdown re-initializes its pipeline when the plugins prop identity changes.
9
+ const REMARK_PLUGINS = [remarkGfm];
10
+ /** Lane pick 8A — fenced code with a slim header bar: language chip (parsed
11
+ from the fence's `language-*` class), a wrap toggle, and an ALWAYS-visible
12
+ Copy. The old hover-revealed copy never existed on touch. The copied text
13
+ is the block's rendered content, read off the DOM so it matches exactly
14
+ what the reader sees. */
15
+ function CodeBlock(props) {
16
+ const pre = useRef(null);
17
+ const [copied, copy] = useCopyFeedback();
18
+ const [wrap, setWrap] = useState(false);
19
+ // The fence language rides the child <code class="language-x"> element.
20
+ const child = Array.isArray(props.children) ? props.children[0] : props.children;
21
+ const codeClass = isValidElement(child)
22
+ ? String(child.props.className ?? "")
23
+ : "";
24
+ const language = /language-([\w+-]+)/.exec(codeClass)?.[1];
25
+ return (_jsxs("div", { className: "fl-codeblock", children: [_jsxs("div", { className: "fl-codehead", children: [_jsx("span", { className: "fl-codehead-lang", children: language ?? "code" }), _jsx("button", { type: "button", className: `fl-codehead-wrap${wrap ? " fl-codehead-wrap--on" : ""}`, "aria-pressed": wrap, onClick: () => setWrap(value => !value), children: "wrap" }), _jsx("button", { type: "button", className: "fl-copy", "aria-label": "Copy code", onClick: () => copy(pre.current?.textContent ?? ""), children: copied ? "Copied" : "Copy" })] }), _jsx("pre", { ...props, ref: pre, style: wrap ? { whiteSpace: "pre-wrap" } : undefined })] }));
26
+ }
27
+ /** Lane pick 8B — data-grade cells: numeric/date-like content right-aligns
28
+ with tabular figures so money and dates line up like a ledger. An explicit
29
+ GFM alignment (react-markdown emits a style) always wins. */
30
+ const cellText = (node) => {
31
+ if (typeof node === "string" || typeof node === "number")
32
+ return String(node);
33
+ if (Array.isArray(node))
34
+ return node.map(cellText).join("");
35
+ if (isValidElement(node))
36
+ return cellText(node.props.children);
37
+ return "";
38
+ };
39
+ const NUMERIC_CELL = /^(?=.*\d)[\s\d$€£¥%+−\-–—.,:()\/kKmMbB]*$/;
40
+ function DataCell(tag) {
41
+ return function Cell({ style, className, ...rest }) {
42
+ const numeric = style?.textAlign === undefined && NUMERIC_CELL.test(cellText(rest.children).trim());
43
+ const Tag = tag;
44
+ return (_jsx(Tag, { ...rest, style: style, className: [className, numeric ? "fl-td-num" : undefined].filter(Boolean).join(" ") || undefined }));
45
+ };
46
+ }
47
+ /** Lane pick 8E — while the turn still streams, every table carries one
48
+ forming row (skeleton shimmer in the table's own rhythm) so a growing
49
+ table reads as "more arriving" instead of jumping raggedly. */
50
+ function StreamingTbody(props) {
51
+ return (_jsxs("tbody", { ...props, children: [props.children, _jsx("tr", { className: "fl-tr-forming", "aria-hidden": "true", children: _jsx("td", { colSpan: 99, children: _jsx("span", { className: "fl-skeleton-bar" }) }) })] }));
52
+ }
53
+ // Stable component maps (react-markdown re-initializes when identity changes);
54
+ // streaming swaps in the forming-row tbody, so it needs its own stable map.
55
+ const TD = DataCell("td");
56
+ const TH = DataCell("th");
57
+ const MD_COMPONENTS = { pre: CodeBlock, td: TD, th: TH };
58
+ const MD_COMPONENTS_STREAMING = { ...MD_COMPONENTS, tbody: StreamingTbody };
59
+ /** Lane pick 8D — a restored long reply with real structure renders as a
60
+ scannable outline: each h2/h3 section folds, first section open. Never
61
+ while streaming, and only for restored bodies (same gate as collapse —
62
+ a reply the reader just watched arrive stays flat). */
63
+ const SECTION_HEAD = /^(##\s+|###\s+)(.+)$/;
64
+ function splitSections(text) {
65
+ const lines = text.split("\n");
66
+ const sections = [{ title: "", level: 2, body: [] }];
67
+ // CommonMark-faithful fence tracking (AI-review catch): a fence closes only
68
+ // on a run of the SAME character, at least as long as the opener, with
69
+ // nothing else on the line — a ```-looking line inside a ~~~ block (or a
70
+ // longer opener's shorter echo) must not flip the state and let a heading
71
+ // inside code become a section break.
72
+ let fence = null;
73
+ for (const line of lines) {
74
+ const run = /^ {0,3}(`{3,}|~{3,})(.*)$/.exec(line);
75
+ if (run) {
76
+ const char = run[1][0];
77
+ if (!fence) {
78
+ fence = { char, len: run[1].length };
79
+ sections[sections.length - 1].body.push(line);
80
+ continue;
81
+ }
82
+ if (char === fence.char && run[1].length >= fence.len && run[2].trim().length === 0) {
83
+ fence = null;
84
+ sections[sections.length - 1].body.push(line);
85
+ continue;
86
+ }
87
+ }
88
+ const head = fence ? null : SECTION_HEAD.exec(line);
89
+ if (head)
90
+ sections.push({ title: head[2].trim(), level: head[1].startsWith("###") ? 3 : 2, body: [] });
91
+ else
92
+ sections[sections.length - 1].body.push(line);
93
+ }
94
+ // An unterminated fence means the structure is unreliable — render flat.
95
+ if (fence)
96
+ return null;
97
+ // Only worth folding with 2+ real sections; a lone heading reads fine flat.
98
+ if (sections.length < 3)
99
+ return null;
100
+ return sections
101
+ .map(section => ({ title: section.title, level: section.level, body: section.body.join("\n").trim() }))
102
+ .filter(section => section.title.length > 0 || section.body.length > 0);
103
+ }
104
+ /** The fold control shows the heading's TEXT (inline markers stripped so
105
+ `**Q3** risks` reads "Q3 risks", not raw asterisks) inside a real h2/h3,
106
+ keeping document-outline semantics (AI-review catch). */
107
+ const stripInline = (title) => title
108
+ .replace(/!?\[([^\]]*)\]\([^)]*\)/g, "$1")
109
+ .replace(/(\*\*|__|[*_~`])/g, "");
110
+ function FoldSection({ title, level, open: initialOpen, children }) {
111
+ const [open, setOpen] = useState(initialOpen);
112
+ const Heading = level === 3 ? "h3" : "h2";
113
+ return (_jsxs("section", { className: `fl-mdsec${open ? " fl-mdsec--open" : ""}`, children: [_jsx(Heading, { className: "fl-mdsec-h", children: _jsxs("button", { type: "button", className: "fl-mdsec-head", "aria-expanded": open, onClick: () => setOpen(value => !value), children: [_jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.4", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "m9 6 6 6-6 6" }) }), stripInline(title)] }) }), open ? _jsx("div", { className: "fl-mdsec-body", children: children }) : null] }));
114
+ }
115
+ /**
116
+ * Assistant text as GitHub-flavored markdown (the `.fl-md` design). react-markdown
117
+ * escapes raw HTML by default (no rehype-raw), so no markup is injected — safe for
118
+ * model-authored text.
119
+ *
120
+ * ENG-218 — solidity under extreme content:
121
+ * - `memo`: a growing streamed turn re-renders the WHOLE list on every token.
122
+ * Memoizing means only the block whose `text` actually changed re-parses;
123
+ * every settled turn above it is skipped instead of re-parsing per token
124
+ * (the O(thread²) markdown cost the issue calls out).
125
+ * - restored huge bodies bound their parse/DOM cost: structured ones fold into
126
+ * sections (8D), unstructured ones truncate under the 3D fade-fold. Only
127
+ * restored bodies collapse — a message the reader just watched stream in
128
+ * must not snap shut — and never while streaming.
129
+ */
130
+ function MarkdownImpl({ text, streaming, restored }) {
131
+ const [expanded, setExpanded] = useState(false);
132
+ const collapsible = restored === true && !streaming && text.length > LONG_TEXT_CAP;
133
+ const components = streaming ? MD_COMPONENTS_STREAMING : MD_COMPONENTS;
134
+ // 8D — structured restored bodies fold by section instead of truncating.
135
+ const sections = collapsible ? splitSections(text) : null;
136
+ if (sections) {
137
+ return (_jsx("div", { className: `fl-md${streaming ? " fl-md--streaming" : ""}`, children: sections.map((section, index) => section.title.length === 0 ? (_jsx(ReactMarkdown, { remarkPlugins: REMARK_PLUGINS, components: components, children: section.body }, index)) : (_jsx(FoldSection, { title: section.title, level: section.level, open: index <= 1, children: _jsx(ReactMarkdown, { remarkPlugins: REMARK_PLUGINS, components: components, children: section.body }) }, index))) }));
138
+ }
139
+ const shown = collapsible && !expanded ? truncateHead(text) : text;
140
+ const body = (_jsx(ReactMarkdown, { remarkPlugins: REMARK_PLUGINS, components: components, children: shown }));
141
+ if (!collapsible) {
142
+ return _jsx("div", { className: `fl-md${streaming ? " fl-md--streaming" : ""}`, children: body });
143
+ }
144
+ // Lane pick 3D — the collapsed head sits under a gradient fade with a
145
+ // centered pill instead of a hard cut + inline link.
146
+ return (_jsx("div", { className: "fl-md", children: _jsxs("div", { className: `fl-fold${expanded ? " fl-fold--open" : ""}`, children: [body, _jsx("div", { className: "fl-fold-veil", children: _jsx("button", { type: "button", className: "fl-more fl-fold-pill", "aria-expanded": expanded, onClick: () => setExpanded(value => !value), children: expanded ? "Show less" : `Show full message (${(text.length / 1000).toFixed(0)}k chars)` }) })] }) }));
147
+ }
148
+ export const Markdown = memo(MarkdownImpl);
149
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/chrome/markdown.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAuC,MAAM,OAAO,CAAC;AACpG,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAC3C,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE5D,gFAAgF;AAChF,qFAAqF;AACrF,MAAM,cAAc,GAAG,CAAC,SAAS,CAAC,CAAC;AAEnC;;;;4BAI4B;AAC5B,SAAS,SAAS,CAAC,KAA4B;IAC7C,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACzC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,eAAe,EAAE,CAAC;IACzC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,wEAAwE;IACxE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;IACjF,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC;QACrC,CAAC,CAAC,MAAM,CAAE,KAAK,CAAC,KAAgC,CAAC,SAAS,IAAI,EAAE,CAAC;QACjE,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,CACL,eAAK,SAAS,EAAC,cAAc,aAC3B,eAAK,SAAS,EAAC,aAAa,aAC1B,eAAM,SAAS,EAAC,kBAAkB,YAAE,QAAQ,IAAI,MAAM,GAAQ,EAC9D,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,mBAAmB,IAAI,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,EAAE,kBACrD,IAAI,EAClB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,qBAGhC,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,SAAS,gBACR,WAAW,EACtB,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,IAAI,EAAE,CAAC,YAElD,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,GACpB,IACL,EACN,iBAAS,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,GAAI,IAC9E,CACP,CAAC;AACJ,CAAC;AAED;;gEAEgE;AAChE,MAAM,QAAQ,GAAG,CAAC,IAAe,EAAU,EAAE;IAC3C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9E,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5D,IAAI,cAAc,CAAC,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAE,IAAI,CAAC,KAAkC,CAAC,QAAQ,CAAC,CAAC;IAC7F,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AACF,MAAM,YAAY,GAAG,2CAA2C,CAAC;AACjE,SAAS,QAAQ,CAAC,GAAgB;IAChC,OAAO,SAAS,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAwB;QACtE,MAAM,OAAO,GAAG,KAAK,EAAE,SAAS,KAAK,SAAS,IAAI,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACpG,MAAM,GAAG,GAAG,GAAG,CAAC;QAChB,OAAO,CACL,KAAC,GAAG,OACE,IAAI,EACR,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,GAChG,CACH,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED;;kEAEkE;AAClE,SAAS,cAAc,CAAC,KAA8B;IACpD,OAAO,CACL,oBAAW,KAAK,aACb,KAAK,CAAC,QAAQ,EACf,aAAI,SAAS,EAAC,eAAe,iBAAa,MAAM,YAC9C,aAAI,OAAO,EAAE,EAAE,YAAE,eAAM,SAAS,EAAC,iBAAiB,GAAG,GAAK,GACvD,IACC,CACT,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,4EAA4E;AAC5E,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC1B,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC1B,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACzD,MAAM,uBAAuB,GAAG,EAAE,GAAG,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;AAE5E;;;0DAG0D;AAC1D,MAAM,YAAY,GAAG,sBAAsB,CAAC;AAC5C,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAsD,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACxG,4EAA4E;IAC5E,uEAAuE;IACvE,yEAAyE;IACzE,0EAA0E;IAC1E,sCAAsC;IACtC,IAAI,KAAK,GAA4C,IAAI,CAAC;IAC1D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,CAAc,CAAC;YACrC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,CAAC;gBACtC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/C,SAAS;YACX,CAAC;YACD,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAE,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtF,KAAK,GAAG,IAAI,CAAC;gBACb,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/C,SAAS;YACX,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,IAAI;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;;YACpG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IACD,yEAAyE;IACzE,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IACvB,4EAA4E;IAC5E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,QAAQ;SACZ,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;SACtG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED;;4DAE4D;AAC5D,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,EAAE,CACpC,KAAK;KACF,OAAO,CAAC,0BAA0B,EAAE,IAAI,CAAC;KACzC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;AAEtC,SAAS,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAE/D;IACC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,OAAO,CACL,mBAAS,SAAS,EAAE,WAAW,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,aAC5D,KAAC,OAAO,IAAC,SAAS,EAAC,YAAY,YAC7B,kBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,eAAe,mBAAgB,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,aAC1G,cAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,iBAAa,MAAM,YACjK,eAAM,CAAC,EAAC,cAAc,GAAG,GACrB,EACL,WAAW,CAAC,KAAK,CAAC,IACZ,GACD,EACT,IAAI,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,eAAe,YAAE,QAAQ,GAAO,CAAC,CAAC,CAAC,IAAI,IACtD,CACX,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAS,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAA6D;IAC5G,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,QAAQ,KAAK,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC;IACnF,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,aAAa,CAAC;IACvE,yEAAyE;IACzE,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CACL,cAAK,SAAS,EAAE,QAAQ,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,EAAE,YAC3D,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC3B,KAAC,aAAa,IAAa,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,YAAG,OAAO,CAAC,IAAI,IAA3E,KAAK,CAAuF,CACjH,CAAC,CAAC,CAAC,CACF,KAAC,WAAW,IAAa,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,YACnF,KAAC,aAAa,IAAC,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,YAAG,OAAO,CAAC,IAAI,GAAiB,IADpF,KAAK,CAET,CACf,CACF,GACG,CACP,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnE,MAAM,IAAI,GAAG,CACX,KAAC,aAAa,IAAC,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,YAAG,KAAK,GAAiB,CAC9F,CAAC;IACF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,cAAK,SAAS,EAAE,QAAQ,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,EAAE,YAAG,IAAI,GAAO,CAAC;IACtF,CAAC;IACD,sEAAsE;IACtE,qDAAqD;IACrD,OAAO,CACL,cAAK,SAAS,EAAC,OAAO,YACpB,eAAK,SAAS,EAAE,UAAU,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAAE,aACzD,IAAI,EACL,cAAK,SAAS,EAAC,cAAc,YAC3B,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,sBAAsB,mBAAgB,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,YACxH,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,GAClF,GACL,IACF,GACF,CACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { VendoTheme } from "@vendoai/core";
2
+ /**
3
+ * The approval→notification morph: the decided panel lifts out of the thread
4
+ * and settles into the top-right notification. The travel is a GPU transform
5
+ * and the size eases on a spring curve, so nothing layout-thrashes. The
6
+ * surface is the same solid glass as the overlay (not a translucent liquid
7
+ * blob), and it's inset from the corner so it's never clipped.
8
+ *
9
+ * Lane pick 4-C — the morph teaches the record: when an Activity anchor is
10
+ * mounted (an element carrying `data-vendo-activity-anchor`, e.g. the
11
+ * VendoPage Activity tab), the settled pill holds briefly and then shrinks
12
+ * and docks INTO the anchor instead of fading in place, dispatching a
13
+ * `vendo:activity-bump` event as it lands so the anchor can pulse. Without
14
+ * an anchor (overlay/threads outside the page) the original hold-and-fade
15
+ * behavior is unchanged. Reduced motion keeps the opacity-only exit.
16
+ */
17
+ export interface MorphToastProps {
18
+ startRect: {
19
+ top: number;
20
+ left: number;
21
+ width: number;
22
+ height: number;
23
+ };
24
+ title: string;
25
+ sub?: string;
26
+ logoUrl?: string;
27
+ theme: VendoTheme;
28
+ holdMs?: number;
29
+ /** Override the dock target lookup (default: the `data-vendo-activity-anchor`
30
+ element). Return undefined to fade in place. */
31
+ dockTo?(): {
32
+ top: number;
33
+ left: number;
34
+ width: number;
35
+ height: number;
36
+ } | undefined;
37
+ onDone(): void;
38
+ }
39
+ export declare const ACTIVITY_ANCHOR_ATTRIBUTE = "data-vendo-activity-anchor";
40
+ /** Fired on window as the morph pill lands in the Activity anchor. */
41
+ export declare const ACTIVITY_BUMP_EVENT = "vendo:activity-bump";
42
+ export declare function MorphToast({ startRect, title, sub, logoUrl, theme, holdMs, dockTo, onDone }: MorphToastProps): import("react").ReactPortal | null;
43
+ //# sourceMappingURL=morph-toast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"morph-toast.d.ts","sourceRoot":"","sources":["../../src/chrome/morph-toast.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAKhD;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;uDACmD;IACnD,MAAM,CAAC,IAAI;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IACpF,MAAM,IAAI,IAAI,CAAC;CAChB;AAWD,eAAO,MAAM,yBAAyB,+BAA+B,CAAC;AACtE,sEAAsE;AACtE,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AASzD,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,eAAe,sCA2F5G"}
@@ -0,0 +1,89 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { createPortal } from "react-dom";
4
+ import { themeCssVariables } from "../theme.js";
5
+ const PILL = { width: 356, height: 62 };
6
+ const MARGIN = 18;
7
+ /** Docked size while the pill is absorbed into the anchor. */
8
+ const DOCK = { width: 40, height: 26 };
9
+ const FADE_HOLD_MS = 3200;
10
+ const DOCK_HOLD_MS = 1400;
11
+ const DOCK_MS = 500;
12
+ const DOCK_BUMP_AT_MS = 480;
13
+ export const ACTIVITY_ANCHOR_ATTRIBUTE = "data-vendo-activity-anchor";
14
+ /** Fired on window as the morph pill lands in the Activity anchor. */
15
+ export const ACTIVITY_BUMP_EVENT = "vendo:activity-bump";
16
+ function activityAnchorRect() {
17
+ const anchor = document.querySelector(`[${ACTIVITY_ANCHOR_ATTRIBUTE}]`);
18
+ if (!anchor)
19
+ return undefined;
20
+ const rect = anchor.getBoundingClientRect();
21
+ return rect.width > 0 ? { top: rect.top, left: rect.left, width: rect.width, height: rect.height } : undefined;
22
+ }
23
+ export function MorphToast({ startRect, title, sub, logoUrl, theme, holdMs, dockTo, onDone }) {
24
+ const [settled, setSettled] = useState(false);
25
+ const [leaving, setLeaving] = useState(false);
26
+ const [dock, setDock] = useState(null);
27
+ const doneRef = useRef(onDone);
28
+ doneRef.current = onDone;
29
+ const dockToRef = useRef(dockTo);
30
+ dockToRef.current = dockTo;
31
+ const reduced = typeof matchMedia === "function" && matchMedia("(prefers-reduced-motion: reduce)").matches;
32
+ useEffect(() => {
33
+ const raf = requestAnimationFrame(() => requestAnimationFrame(() => setSettled(true)));
34
+ const travel = reduced ? 0 : 640;
35
+ // Whether this morph docks is decided when the hold elapses (the anchor's
36
+ // rect is read fresh then, so it CAN dock even if the anchor mounted
37
+ // mid-hold). The probe here only picks the hold LENGTH up front — an
38
+ // anchor that appears mid-hold docks after the longer fade-length hold.
39
+ const willDock = !reduced
40
+ && typeof document !== "undefined"
41
+ && (dockToRef.current ? dockToRef.current() !== undefined : activityAnchorRect() !== undefined);
42
+ const hold = holdMs ?? (willDock ? DOCK_HOLD_MS : FADE_HOLD_MS);
43
+ const timers = [];
44
+ timers.push(setTimeout(() => {
45
+ const rect = reduced ? undefined : (dockToRef.current ? dockToRef.current() : activityAnchorRect());
46
+ if (rect) {
47
+ setDock({ x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 });
48
+ timers.push(setTimeout(() => {
49
+ window.dispatchEvent(new CustomEvent(ACTIVITY_BUMP_EVENT));
50
+ }, DOCK_BUMP_AT_MS));
51
+ timers.push(setTimeout(() => doneRef.current(), DOCK_MS + 200));
52
+ }
53
+ else {
54
+ setLeaving(true);
55
+ timers.push(setTimeout(() => doneRef.current(), 460));
56
+ }
57
+ }, travel + hold));
58
+ return () => {
59
+ cancelAnimationFrame(raf);
60
+ for (const timer of timers)
61
+ clearTimeout(timer);
62
+ };
63
+ }, [holdMs, reduced]);
64
+ if (typeof window === "undefined" || typeof document === "undefined")
65
+ return null;
66
+ const targetLeft = window.innerWidth - PILL.width - MARGIN;
67
+ const spring = "cubic-bezier(.34,1.28,.42,1)";
68
+ const sink = "cubic-bezier(.5,0,.8,.4)";
69
+ const docking = dock !== null;
70
+ const dx = docking ? dock.x - DOCK.width / 2 - startRect.left
71
+ : settled ? targetLeft - startRect.left : 0;
72
+ const dy = docking ? dock.y - DOCK.height / 2 - startRect.top
73
+ : settled ? MARGIN - startRect.top : 0;
74
+ return createPortal(_jsx("div", { className: "vendo-root fl-morph-layer", "data-vendo-motion": reduced ? "reduced" : theme.motion, style: { ...themeCssVariables(theme) }, children: _jsxs("div", { className: "fl-morph-card", style: {
75
+ position: "absolute",
76
+ top: startRect.top,
77
+ left: startRect.left,
78
+ width: docking ? DOCK.width : settled ? PILL.width : startRect.width,
79
+ height: docking ? DOCK.height : settled ? PILL.height : Math.min(startRect.height, 96),
80
+ transform: `translate(${dx}px, ${dy}px)${docking ? " scale(.5)" : ""}`,
81
+ opacity: leaving || docking ? 0 : 1,
82
+ transition: reduced
83
+ ? "opacity .3s"
84
+ : docking
85
+ ? `transform ${DOCK_MS}ms ${sink}, width ${DOCK_MS}ms ${sink}, height ${DOCK_MS}ms ${sink}, opacity .45s ease .1s`
86
+ : `transform .64s ${spring}, width .64s ${spring}, height .64s ${spring}, opacity .4s ease`,
87
+ }, children: [_jsx("span", { className: "fl-morph-live", "aria-hidden": "true" }), _jsxs("div", { className: "fl-morph-copy", children: [_jsx("div", { className: "fl-morph-title", children: title }), sub ? _jsx("div", { className: "fl-morph-sub", children: sub }) : null] }), logoUrl ? (_jsx("span", { className: "fl-morph-logo", children: _jsx("img", { src: logoUrl, alt: "", width: 18, height: 18 }) })) : null] }) }), document.body);
88
+ }
89
+ //# sourceMappingURL=morph-toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"morph-toast.js","sourceRoot":"","sources":["../../src/chrome/morph-toast.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 08-ui §6; 05-guard §1 — loud only in the default posture. `connected` gates
3
+ * the render because the hook's initial (and unreachable-wire) state reuses
4
+ * "unconfigured" as its unknown value — the banner asserts a KNOWN posture,
5
+ * never a pending probe.
6
+ */
7
+ export declare function NoPolicyNotice(): import("react").JSX.Element | null;
8
+ //# sourceMappingURL=no-policy-notice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-policy-notice.d.ts","sourceRoot":"","sources":["../../src/chrome/no-policy-notice.tsx"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,wBAAgB,cAAc,uCAS7B"}