microui-wc 0.1.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 (609) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
  2. package/.github/ISSUE_TEMPLATE/feature_request.md +33 -0
  3. package/.github/PULL_REQUEST_TEMPLATE.md +28 -0
  4. package/.github/workflows/ci.yml +42 -0
  5. package/.github/workflows/deploy-pages.yml +112 -0
  6. package/AGENTS.md +2366 -0
  7. package/CHANGELOG.md +47 -0
  8. package/CODE_OF_CONDUCT.md +59 -0
  9. package/CONTRIBUTING.md +156 -0
  10. package/LICENSE +190 -0
  11. package/README.md +254 -0
  12. package/SECURITY.md +58 -0
  13. package/app/.generated/routes/alerts.js +8 -0
  14. package/app/.generated/routes/avatars.js +8 -0
  15. package/app/.generated/routes/badges.js +8 -0
  16. package/app/.generated/routes/buttons.js +10 -0
  17. package/app/.generated/routes/cards.js +10 -0
  18. package/app/.generated/routes/checkboxes.js +9 -0
  19. package/app/.generated/routes/chips.js +8 -0
  20. package/app/.generated/routes/dropdowns.js +9 -0
  21. package/app/.generated/routes/home.js +7 -0
  22. package/app/.generated/routes/icons.js +9 -0
  23. package/app/.generated/routes/inputs.js +10 -0
  24. package/app/.generated/routes/installation.js +7 -0
  25. package/app/.generated/routes/layout.js +9 -0
  26. package/app/.generated/routes/modals.js +9 -0
  27. package/app/.generated/routes/navbar.js +7 -0
  28. package/app/.generated/routes/progress.js +9 -0
  29. package/app/.generated/routes/radios.js +9 -0
  30. package/app/.generated/routes/switches.js +9 -0
  31. package/app/.generated/routes/tabs.js +8 -0
  32. package/app/.generated/routes/toasts.js +9 -0
  33. package/app/index.html +67 -0
  34. package/app/pages/alerts.html +23 -0
  35. package/app/pages/avatars.html +22 -0
  36. package/app/pages/badges.html +22 -0
  37. package/app/pages/buttons.html +71 -0
  38. package/app/pages/cards.html +54 -0
  39. package/app/pages/checkboxes.html +39 -0
  40. package/app/pages/chips.html +23 -0
  41. package/app/pages/dropdowns.html +41 -0
  42. package/app/pages/home.html +59 -0
  43. package/app/pages/icons.html +29 -0
  44. package/app/pages/inputs.html +66 -0
  45. package/app/pages/installation.html +34 -0
  46. package/app/pages/layout.html +30 -0
  47. package/app/pages/modals.html +21 -0
  48. package/app/pages/navbar.html +22 -0
  49. package/app/pages/progress.html +35 -0
  50. package/app/pages/radios.html +40 -0
  51. package/app/pages/switches.html +39 -0
  52. package/app/pages/tabs.html +30 -0
  53. package/app/pages/toasts.html +22 -0
  54. package/app-dist/index.html +67 -0
  55. package/app-dist/pages/alerts.html +23 -0
  56. package/app-dist/pages/avatars.html +22 -0
  57. package/app-dist/pages/badges.html +22 -0
  58. package/app-dist/pages/buttons.html +71 -0
  59. package/app-dist/pages/cards.html +54 -0
  60. package/app-dist/pages/checkboxes.html +39 -0
  61. package/app-dist/pages/chips.html +23 -0
  62. package/app-dist/pages/dropdowns.html +41 -0
  63. package/app-dist/pages/home.html +59 -0
  64. package/app-dist/pages/icons.html +29 -0
  65. package/app-dist/pages/inputs.html +66 -0
  66. package/app-dist/pages/installation.html +34 -0
  67. package/app-dist/pages/layout.html +30 -0
  68. package/app-dist/pages/modals.html +21 -0
  69. package/app-dist/pages/navbar.html +22 -0
  70. package/app-dist/pages/progress.html +35 -0
  71. package/app-dist/pages/radios.html +40 -0
  72. package/app-dist/pages/switches.html +39 -0
  73. package/app-dist/pages/tabs.html +30 -0
  74. package/app-dist/pages/toasts.html +22 -0
  75. package/app-dist/pages.json +217 -0
  76. package/app-dist/routes/alerts.js +5 -0
  77. package/app-dist/routes/avatars.js +1 -0
  78. package/app-dist/routes/badges.js +1 -0
  79. package/app-dist/routes/buttons.js +1 -0
  80. package/app-dist/routes/cards.js +1 -0
  81. package/app-dist/routes/checkboxes.js +9 -0
  82. package/app-dist/routes/chips.js +4 -0
  83. package/app-dist/routes/chunk-019e5e2f.js +5 -0
  84. package/app-dist/routes/chunk-0m4j19yd.js +2 -0
  85. package/app-dist/routes/chunk-0tmmp5q0.js +1 -0
  86. package/app-dist/routes/chunk-10xn709r.js +1 -0
  87. package/app-dist/routes/chunk-15m2qcda.js +2 -0
  88. package/app-dist/routes/chunk-1bh8g23n.js +1 -0
  89. package/app-dist/routes/chunk-1vg0v937.js +1 -0
  90. package/app-dist/routes/chunk-1zvcgy3j.js +1 -0
  91. package/app-dist/routes/chunk-2afb0861.js +1 -0
  92. package/app-dist/routes/chunk-2c6ttpzt.js +5 -0
  93. package/app-dist/routes/chunk-3dy30fhs.js +1 -0
  94. package/app-dist/routes/chunk-426dnces.js +13 -0
  95. package/app-dist/routes/chunk-44kgxery.js +1 -0
  96. package/app-dist/routes/chunk-47fdnejd.js +33 -0
  97. package/app-dist/routes/chunk-49a6t2vq.js +1 -0
  98. package/app-dist/routes/chunk-4fe1rm5b.js +1 -0
  99. package/app-dist/routes/chunk-4ggmvkta.js +33 -0
  100. package/app-dist/routes/chunk-4vkz81q7.js +33 -0
  101. package/app-dist/routes/chunk-4w4tmj8f.js +31 -0
  102. package/app-dist/routes/chunk-532s62kr.js +31 -0
  103. package/app-dist/routes/chunk-5hm3bssy.js +33 -0
  104. package/app-dist/routes/chunk-5vrh24hc.js +1 -0
  105. package/app-dist/routes/chunk-61pcg25a.js +1 -0
  106. package/app-dist/routes/chunk-6nfhygvf.js +1 -0
  107. package/app-dist/routes/chunk-700e7je6.js +33 -0
  108. package/app-dist/routes/chunk-7fsn17kg.js +1 -0
  109. package/app-dist/routes/chunk-7k789b32.js +1 -0
  110. package/app-dist/routes/chunk-7r46q0ys.js +36 -0
  111. package/app-dist/routes/chunk-86fmc1fr.js +5 -0
  112. package/app-dist/routes/chunk-8qth37vw.js +1 -0
  113. package/app-dist/routes/chunk-924wv8n0.js +1 -0
  114. package/app-dist/routes/chunk-9mbhgxk9.js +1 -0
  115. package/app-dist/routes/chunk-a216hyd9.js +1 -0
  116. package/app-dist/routes/chunk-akzxykh9.js +33 -0
  117. package/app-dist/routes/chunk-b3dcvy8c.js +1 -0
  118. package/app-dist/routes/chunk-b74zahz5.js +31 -0
  119. package/app-dist/routes/chunk-bftj53p2.js +5 -0
  120. package/app-dist/routes/chunk-c01hnz3e.js +1 -0
  121. package/app-dist/routes/chunk-d8pvv5km.js +1 -0
  122. package/app-dist/routes/chunk-dev0aezr.js +2 -0
  123. package/app-dist/routes/chunk-dh6vnv0e.js +1 -0
  124. package/app-dist/routes/chunk-dn2cbpva.js +36 -0
  125. package/app-dist/routes/chunk-dvn0my90.js +1 -0
  126. package/app-dist/routes/chunk-dvq8mnve.js +36 -0
  127. package/app-dist/routes/chunk-e8c2gc4d.js +5 -0
  128. package/app-dist/routes/chunk-ejf9ak2x.js +1 -0
  129. package/app-dist/routes/chunk-f083m55s.js +1 -0
  130. package/app-dist/routes/chunk-fnrj28s1.js +31 -0
  131. package/app-dist/routes/chunk-fvg3yjdp.js +31 -0
  132. package/app-dist/routes/chunk-g7k381n1.js +1 -0
  133. package/app-dist/routes/chunk-h01kq2ae.js +13 -0
  134. package/app-dist/routes/chunk-h4dk761v.js +5 -0
  135. package/app-dist/routes/chunk-hmx91z2x.js +5 -0
  136. package/app-dist/routes/chunk-hxbg4m42.js +36 -0
  137. package/app-dist/routes/chunk-jbjnfp2b.js +2 -0
  138. package/app-dist/routes/chunk-jxtz5vv6.js +36 -0
  139. package/app-dist/routes/chunk-jxzcs0ey.js +36 -0
  140. package/app-dist/routes/chunk-kt7wwhcx.js +1 -0
  141. package/app-dist/routes/chunk-kzptszyc.js +33 -0
  142. package/app-dist/routes/chunk-mhgca4w4.js +2 -0
  143. package/app-dist/routes/chunk-mhswxa20.js +1 -0
  144. package/app-dist/routes/chunk-n8zfeex6.js +1 -0
  145. package/app-dist/routes/chunk-pee47b2r.js +1 -0
  146. package/app-dist/routes/chunk-pesmw829.js +1 -0
  147. package/app-dist/routes/chunk-pgc4c6f3.js +36 -0
  148. package/app-dist/routes/chunk-q8egegm1.js +1 -0
  149. package/app-dist/routes/chunk-q9mn2qyq.js +36 -0
  150. package/app-dist/routes/chunk-qh0rtaf3.js +5 -0
  151. package/app-dist/routes/chunk-qqhmk6ye.js +2 -0
  152. package/app-dist/routes/chunk-qrxygmf7.js +33 -0
  153. package/app-dist/routes/chunk-r46yzksx.js +36 -0
  154. package/app-dist/routes/chunk-rgpbw2w0.js +5 -0
  155. package/app-dist/routes/chunk-rnpzv3d8.js +2 -0
  156. package/app-dist/routes/chunk-s5v8cv05.js +2 -0
  157. package/app-dist/routes/chunk-sbwn5bpc.js +1 -0
  158. package/app-dist/routes/chunk-sqbg8jbt.js +33 -0
  159. package/app-dist/routes/chunk-sv8dqnf7.js +1 -0
  160. package/app-dist/routes/chunk-t67sw3za.js +1 -0
  161. package/app-dist/routes/chunk-tjdpqwdf.js +31 -0
  162. package/app-dist/routes/chunk-tq2mfghg.js +1 -0
  163. package/app-dist/routes/chunk-ttn10vt6.js +1 -0
  164. package/app-dist/routes/chunk-v2hzpjxr.js +1 -0
  165. package/app-dist/routes/chunk-wfjjkw9y.js +1 -0
  166. package/app-dist/routes/chunk-wt8cxzmf.js +31 -0
  167. package/app-dist/routes/chunk-x45d372k.js +5 -0
  168. package/app-dist/routes/chunk-y3wsazkt.js +1 -0
  169. package/app-dist/routes/chunk-y7pmgc7t.js +33 -0
  170. package/app-dist/routes/chunk-zefdt2q3.js +31 -0
  171. package/app-dist/routes/dropdowns.js +6 -0
  172. package/app-dist/routes/home.js +1 -0
  173. package/app-dist/routes/icons.js +1 -0
  174. package/app-dist/routes/inputs.js +12 -0
  175. package/app-dist/routes/installation.js +1 -0
  176. package/app-dist/routes/layout.js +1 -0
  177. package/app-dist/routes/modals.js +7 -0
  178. package/app-dist/routes/navbar.js +1 -0
  179. package/app-dist/routes/progress.js +1 -0
  180. package/app-dist/routes/radios.js +6 -0
  181. package/app-dist/routes/switches.js +6 -0
  182. package/app-dist/routes/tabs.js +1 -0
  183. package/app-dist/routes/toasts.js +16 -0
  184. package/assets/fonts/material-symbols-mini.woff2 +0 -0
  185. package/assets/fonts/material-symbols.woff2 +0 -0
  186. package/assets/fonts/roboto-400.woff2 +0 -0
  187. package/assets/fonts/roboto-500.woff2 +0 -0
  188. package/assets/fonts/roboto-700.woff2 +0 -0
  189. package/assets/logo-banner-400.jpg +0 -0
  190. package/assets/logo-banner-400.webp +0 -0
  191. package/assets/logo-banner-800.webp +0 -0
  192. package/assets/logo-banner.jpg +0 -0
  193. package/assets/logo-icon-64.jpg +0 -0
  194. package/assets/logo-icon-64.webp +0 -0
  195. package/assets/logo-icon.jpg +0 -0
  196. package/assets/logo-square.jpg +0 -0
  197. package/bun.lock +312 -0
  198. package/bunfig.toml +4 -0
  199. package/custom-elements.json +1916 -0
  200. package/demo/api/sample-data.json +38 -0
  201. package/demo/content/alerts.html +115 -0
  202. package/demo/content/avatars.html +70 -0
  203. package/demo/content/badges.html +65 -0
  204. package/demo/content/buttons.html +188 -0
  205. package/demo/content/callouts.html +91 -0
  206. package/demo/content/cards.html +121 -0
  207. package/demo/content/checkboxes.html +178 -0
  208. package/demo/content/chips.html +67 -0
  209. package/demo/content/codeblocks.html +101 -0
  210. package/demo/content/confirms.html +115 -0
  211. package/demo/content/datatables.html +149 -0
  212. package/demo/content/dividers.html +119 -0
  213. package/demo/content/dropdowns.html +89 -0
  214. package/demo/content/enterprise.html +252 -0
  215. package/demo/content/home.html +149 -0
  216. package/demo/content/icons.html +89 -0
  217. package/demo/content/inputs.html +135 -0
  218. package/demo/content/installation.html +16 -0
  219. package/demo/content/layout.html +136 -0
  220. package/demo/content/modals.html +141 -0
  221. package/demo/content/navbar.html +70 -0
  222. package/demo/content/progress.html +119 -0
  223. package/demo/content/radios.html +88 -0
  224. package/demo/content/skeletons.html +109 -0
  225. package/demo/content/spinners.html +96 -0
  226. package/demo/content/switches.html +84 -0
  227. package/demo/content/tables.html +124 -0
  228. package/demo/content/tabs.html +85 -0
  229. package/demo/content/toasts.html +116 -0
  230. package/demo/content/tooltips.html +107 -0
  231. package/demo/content/virtual-lists.html +233 -0
  232. package/demo/favicon.ico +0 -0
  233. package/demo/favicon.png +0 -0
  234. package/demo/full.html +52 -0
  235. package/demo/iife.html +46 -0
  236. package/demo/manifest.json +34 -0
  237. package/demo/pages/datatable-demo.html +237 -0
  238. package/demo/pages/prompt-ui-demo.html +218 -0
  239. package/demo/pages/responsive-demo.html +122 -0
  240. package/demo/pages/schema-form-demo.html +270 -0
  241. package/demo/robots.txt +6 -0
  242. package/demo/shell.html +712 -0
  243. package/demo/sw.js +387 -0
  244. package/dist/AGENTS.md +2366 -0
  245. package/dist/README.md +254 -0
  246. package/dist/chunks/advanced.js +174 -0
  247. package/dist/chunks/chunk-1nhr1wrq.js +14 -0
  248. package/dist/chunks/chunk-hssyjbr0.js +2 -0
  249. package/dist/chunks/chunk-k8etzx0z.js +2 -0
  250. package/dist/chunks/chunk-rr1et8fg.js +2 -0
  251. package/dist/chunks/chunk-sjcx4fd5.js +6 -0
  252. package/dist/chunks/chunk-v1c777xh.js +5 -0
  253. package/dist/chunks/chunk-w5k5vwjd.js +13 -0
  254. package/dist/chunks/core.js +10 -0
  255. package/dist/chunks/display.js +17 -0
  256. package/dist/chunks/feedback.js +15 -0
  257. package/dist/chunks/forms.js +48 -0
  258. package/dist/chunks/layout.js +9 -0
  259. package/dist/components/chunk-4tezav8r.js +2 -0
  260. package/dist/components/chunk-fqyb2pms.js +2 -0
  261. package/dist/components/chunk-h7cdbhxw.js +13 -0
  262. package/dist/components/chunk-mzd8jwrs.js +2 -0
  263. package/dist/components/chunk-qwmxyn8e.js +2 -0
  264. package/dist/components/chunk-redtk47a.js +14 -0
  265. package/dist/components/mu-alert.js +5 -0
  266. package/dist/components/mu-api-table.js +33 -0
  267. package/dist/components/mu-avatar.js +1 -0
  268. package/dist/components/mu-badge.js +1 -0
  269. package/dist/components/mu-bottom-nav.js +1 -0
  270. package/dist/components/mu-button.js +1 -0
  271. package/dist/components/mu-callout.js +1 -0
  272. package/dist/components/mu-card.js +1 -0
  273. package/dist/components/mu-checkbox.js +9 -0
  274. package/dist/components/mu-chip.js +4 -0
  275. package/dist/components/mu-code.js +48 -0
  276. package/dist/components/mu-confirm.js +10 -0
  277. package/dist/components/mu-container.js +1 -0
  278. package/dist/components/mu-datatable.js +96 -0
  279. package/dist/components/mu-divider.js +1 -0
  280. package/dist/components/mu-doc-page.js +26 -0
  281. package/dist/components/mu-drawer-item.js +9 -0
  282. package/dist/components/mu-drawer.js +1 -0
  283. package/dist/components/mu-dropdown.js +6 -0
  284. package/dist/components/mu-error-boundary.js +10 -0
  285. package/dist/components/mu-example.js +38 -0
  286. package/dist/components/mu-fetch.js +1 -0
  287. package/dist/components/mu-form.js +1 -0
  288. package/dist/components/mu-grid.js +1 -0
  289. package/dist/components/mu-icon.js +5 -0
  290. package/dist/components/mu-input.js +12 -0
  291. package/dist/components/mu-layout.js +1 -0
  292. package/dist/components/mu-lazy.js +1 -0
  293. package/dist/components/mu-modal.js +7 -0
  294. package/dist/components/mu-navbar.js +1 -0
  295. package/dist/components/mu-page.js +1 -0
  296. package/dist/components/mu-progress.js +1 -0
  297. package/dist/components/mu-prompt-ui.js +20 -0
  298. package/dist/components/mu-radio.js +6 -0
  299. package/dist/components/mu-repeat.js +1 -0
  300. package/dist/components/mu-router.js +6 -0
  301. package/dist/components/mu-schema-form.js +76 -0
  302. package/dist/components/mu-sidebar.js +1 -0
  303. package/dist/components/mu-skeleton.js +13 -0
  304. package/dist/components/mu-spinner.js +1 -0
  305. package/dist/components/mu-stack.js +1 -0
  306. package/dist/components/mu-switch.js +6 -0
  307. package/dist/components/mu-table.js +1 -0
  308. package/dist/components/mu-tabs.js +1 -0
  309. package/dist/components/mu-textarea.js +11 -0
  310. package/dist/components/mu-theme-toggle.js +5 -0
  311. package/dist/components/mu-toast.js +4 -0
  312. package/dist/components/mu-tooltip.js +10 -0
  313. package/dist/components/mu-virtual-list.js +33 -0
  314. package/dist/components.css +1 -0
  315. package/dist/microui.css +1 -0
  316. package/dist/microui.d.ts +234 -0
  317. package/dist/microui.esm.js +549 -0
  318. package/dist/microui.esm.js.map +79 -0
  319. package/dist/microui.min.js +549 -0
  320. package/dist/microui.min.js.map +79 -0
  321. package/dist/routes/alerts.js +1 -0
  322. package/dist/routes/avatars.js +1 -0
  323. package/dist/routes/badges.js +1 -0
  324. package/dist/routes/buttons.js +1 -0
  325. package/dist/routes/callouts.js +1 -0
  326. package/dist/routes/cards.js +1 -0
  327. package/dist/routes/checkboxes.js +9 -0
  328. package/dist/routes/chips.js +4 -0
  329. package/dist/routes/chunk-19wgcncm.js +2 -0
  330. package/dist/routes/chunk-1khyr3v1.js +33 -0
  331. package/dist/routes/chunk-4rhxe97g.js +1 -0
  332. package/dist/routes/chunk-5qah04bh.js +2 -0
  333. package/dist/routes/chunk-7gfxy70n.js +5 -0
  334. package/dist/routes/chunk-e86zbeta.js +1 -0
  335. package/dist/routes/chunk-fagt36h6.js +2 -0
  336. package/dist/routes/chunk-fed7zr7m.js +1 -0
  337. package/dist/routes/chunk-hwj7pfwp.js +1 -0
  338. package/dist/routes/chunk-mhvcs2f8.js +5 -0
  339. package/dist/routes/chunk-nv3bddmj.js +13 -0
  340. package/dist/routes/chunk-q3f2aeqe.js +7 -0
  341. package/dist/routes/chunk-qxxa8trk.js +1 -0
  342. package/dist/routes/chunk-rw15y9zh.js +1 -0
  343. package/dist/routes/chunk-sfb7x11v.js +5 -0
  344. package/dist/routes/chunk-swyhghrm.js +48 -0
  345. package/dist/routes/chunk-sxddjs2d.js +2 -0
  346. package/dist/routes/chunk-vby0zg5w.js +17 -0
  347. package/dist/routes/chunk-w6zqjqqs.js +9 -0
  348. package/dist/routes/chunk-z960rexd.js +38 -0
  349. package/dist/routes/codeblocks.js +1 -0
  350. package/dist/routes/confirms.js +10 -0
  351. package/dist/routes/datatables.js +96 -0
  352. package/dist/routes/dividers.js +1 -0
  353. package/dist/routes/dropdowns.js +6 -0
  354. package/dist/routes/enterprise.js +15 -0
  355. package/dist/routes/home.js +1 -0
  356. package/dist/routes/icons.js +1 -0
  357. package/dist/routes/inputs.js +22 -0
  358. package/dist/routes/installation.js +1 -0
  359. package/dist/routes/layout.js +1 -0
  360. package/dist/routes/modals.js +1 -0
  361. package/dist/routes/navbar.js +1 -0
  362. package/dist/routes/page-components.json +316 -0
  363. package/dist/routes/progress.js +1 -0
  364. package/dist/routes/radios.js +6 -0
  365. package/dist/routes/route-deps.json +156 -0
  366. package/dist/routes/shell-critical.js +1 -0
  367. package/dist/routes/shell-deferred.js +1 -0
  368. package/dist/routes/shell.js +20 -0
  369. package/dist/routes/skeletons.js +13 -0
  370. package/dist/routes/spinners.js +1 -0
  371. package/dist/routes/src/chunks/core.js +36 -0
  372. package/dist/routes/switches.js +6 -0
  373. package/dist/routes/tables.js +1 -0
  374. package/dist/routes/tabs.js +1 -0
  375. package/dist/routes/toasts.js +1 -0
  376. package/dist/routes/tooltips.js +10 -0
  377. package/dist/routes/virtual-lists.js +33 -0
  378. package/dist/styles/common.css +1 -0
  379. package/dist/styles/components/animations.css +1 -0
  380. package/dist/styles/components/avatar.css +1 -0
  381. package/dist/styles/components/badge.css +1 -0
  382. package/dist/styles/components/bottom-nav.css +1 -0
  383. package/dist/styles/components/button.css +1 -0
  384. package/dist/styles/components/card.css +1 -0
  385. package/dist/styles/components/checkbox.css +1 -0
  386. package/dist/styles/components/chip.css +1 -0
  387. package/dist/styles/components/datatable.css +1 -0
  388. package/dist/styles/components/divider.css +1 -0
  389. package/dist/styles/components/drawer-item.css +1 -0
  390. package/dist/styles/components/drawer.css +1 -0
  391. package/dist/styles/components/grid.css +1 -0
  392. package/dist/styles/components/icon.css +1 -0
  393. package/dist/styles/components/input.css +1 -0
  394. package/dist/styles/components/layout.css +1 -0
  395. package/dist/styles/components/navbar.css +1 -0
  396. package/dist/styles/components/overlays.css +1 -0
  397. package/dist/styles/components/progress.css +1 -0
  398. package/dist/styles/components/prompt-ui.css +1 -0
  399. package/dist/styles/components/radio.css +1 -0
  400. package/dist/styles/components/schema-form.css +1 -0
  401. package/dist/styles/components/switch.css +1 -0
  402. package/dist/styles/components/tabs.css +1 -0
  403. package/dist/styles/components/tooltip.css +1 -0
  404. package/dist/styles/components/virtual-list.css +1 -0
  405. package/dist/tokens.css +1 -0
  406. package/docs/api-reference.md +175 -0
  407. package/docs/component-schema.md +231 -0
  408. package/docs/components.md +269 -0
  409. package/docs/design-system.md +183 -0
  410. package/docs/getting-started.md +198 -0
  411. package/docs/message-protocol.md +262 -0
  412. package/docs/utility-classes.md +205 -0
  413. package/lighthouse-audit.mjs +113 -0
  414. package/package.json +45 -0
  415. package/scripts/analyze-components.js +105 -0
  416. package/scripts/build-app.js +193 -0
  417. package/scripts/build-framework.js +444 -0
  418. package/scripts/build-utils.js +101 -0
  419. package/scripts/test-isolated.js +151 -0
  420. package/server.js +256 -0
  421. package/src/chunks/advanced.js +27 -0
  422. package/src/chunks/core.js +61 -0
  423. package/src/chunks/display.js +25 -0
  424. package/src/chunks/feedback.js +15 -0
  425. package/src/chunks/forms.js +25 -0
  426. package/src/chunks/layout.js +27 -0
  427. package/src/components/mu-alert.js +96 -0
  428. package/src/components/mu-api-table.js +167 -0
  429. package/src/components/mu-avatar.js +94 -0
  430. package/src/components/mu-badge.js +32 -0
  431. package/src/components/mu-bottom-nav.js +115 -0
  432. package/src/components/mu-button.js +61 -0
  433. package/src/components/mu-callout.js +71 -0
  434. package/src/components/mu-card.js +36 -0
  435. package/src/components/mu-checkbox.js +186 -0
  436. package/src/components/mu-chip.js +125 -0
  437. package/src/components/mu-code.js +534 -0
  438. package/src/components/mu-confirm.js +268 -0
  439. package/src/components/mu-container.js +53 -0
  440. package/src/components/mu-datatable.js +517 -0
  441. package/src/components/mu-divider.js +40 -0
  442. package/src/components/mu-doc-page.js +100 -0
  443. package/src/components/mu-drawer-item.js +158 -0
  444. package/src/components/mu-drawer.js +305 -0
  445. package/src/components/mu-dropdown.js +239 -0
  446. package/src/components/mu-error-boundary.js +191 -0
  447. package/src/components/mu-example.js +335 -0
  448. package/src/components/mu-fetch.js +256 -0
  449. package/src/components/mu-form.js +133 -0
  450. package/src/components/mu-grid.js +63 -0
  451. package/src/components/mu-icon.js +211 -0
  452. package/src/components/mu-input.js +142 -0
  453. package/src/components/mu-layout.js +129 -0
  454. package/src/components/mu-lazy.js +94 -0
  455. package/src/components/mu-modal.js +160 -0
  456. package/src/components/mu-navbar.js +71 -0
  457. package/src/components/mu-page.js +77 -0
  458. package/src/components/mu-progress.js +54 -0
  459. package/src/components/mu-prompt-ui.js +382 -0
  460. package/src/components/mu-radio.js +200 -0
  461. package/src/components/mu-repeat.js +135 -0
  462. package/src/components/mu-router.js +169 -0
  463. package/src/components/mu-schema-form.js +441 -0
  464. package/src/components/mu-sidebar.js +81 -0
  465. package/src/components/mu-skeleton.js +69 -0
  466. package/src/components/mu-spinner.js +30 -0
  467. package/src/components/mu-stack.js +59 -0
  468. package/src/components/mu-switch.js +150 -0
  469. package/src/components/mu-table.js +80 -0
  470. package/src/components/mu-tabs.js +112 -0
  471. package/src/components/mu-textarea.js +96 -0
  472. package/src/components/mu-theme-toggle.js +52 -0
  473. package/src/components/mu-toast.js +151 -0
  474. package/src/components/mu-tooltip.js +182 -0
  475. package/src/components/mu-virtual-list.js +184 -0
  476. package/src/core/MuElement.js +562 -0
  477. package/src/core/agent-api.js +771 -0
  478. package/src/core/breakpoints.js +195 -0
  479. package/src/core/bus.js +378 -0
  480. package/src/core/component-schema.js +287 -0
  481. package/src/core/feature-registry.js +241 -0
  482. package/src/core/form-state.js +252 -0
  483. package/src/core/http.js +104 -0
  484. package/src/core/keyboard.js +105 -0
  485. package/src/core/layers.js +71 -0
  486. package/src/core/render.js +201 -0
  487. package/src/core/ripple.js +158 -0
  488. package/src/core/router.js +100 -0
  489. package/src/core/scheduler.js +109 -0
  490. package/src/core/signals.js +164 -0
  491. package/src/core/store.js +268 -0
  492. package/src/core/theme.js +68 -0
  493. package/src/core/transitions.js +72 -0
  494. package/src/core/utils.js +30 -0
  495. package/src/index.d.ts +234 -0
  496. package/src/index.js +308 -0
  497. package/src/styles/animations.css +252 -0
  498. package/src/styles/common.css +82 -0
  499. package/src/styles/components/animations.css +129 -0
  500. package/src/styles/components/avatar.css +83 -0
  501. package/src/styles/components/badge.css +80 -0
  502. package/src/styles/components/bottom-nav.css +37 -0
  503. package/src/styles/components/button.css +348 -0
  504. package/src/styles/components/card.css +138 -0
  505. package/src/styles/components/checkbox.css +201 -0
  506. package/src/styles/components/chip.css +93 -0
  507. package/src/styles/components/datatable.css +180 -0
  508. package/src/styles/components/divider.css +49 -0
  509. package/src/styles/components/drawer-item.css +123 -0
  510. package/src/styles/components/drawer.css +273 -0
  511. package/src/styles/components/grid.css +189 -0
  512. package/src/styles/components/icon.css +40 -0
  513. package/src/styles/components/input.css +203 -0
  514. package/src/styles/components/layout.css +121 -0
  515. package/src/styles/components/navbar.css +91 -0
  516. package/src/styles/components/overlays.css +329 -0
  517. package/src/styles/components/progress.css +79 -0
  518. package/src/styles/components/prompt-ui.css +286 -0
  519. package/src/styles/components/radio.css +17 -0
  520. package/src/styles/components/schema-form.css +85 -0
  521. package/src/styles/components/switch.css +69 -0
  522. package/src/styles/components/tabs.css +145 -0
  523. package/src/styles/components/tooltip.css +93 -0
  524. package/src/styles/components/virtual-list.css +36 -0
  525. package/src/styles/components.css +3677 -0
  526. package/src/styles/routes/home.css +97 -0
  527. package/src/styles/tokens.css +675 -0
  528. package/tests/agents/agent-integration.test.js +76 -0
  529. package/tests/benchmark.html +296 -0
  530. package/tests/build/scan-components.test.js +173 -0
  531. package/tests/components/all-components.test.js +245 -0
  532. package/tests/components/all-missing-components.test.js +574 -0
  533. package/tests/components/mu-alert.test.js +113 -0
  534. package/tests/components/mu-avatar.test.js +148 -0
  535. package/tests/components/mu-badge.test.js +92 -0
  536. package/tests/components/mu-button.test.js +112 -0
  537. package/tests/components/mu-card.test.js +89 -0
  538. package/tests/components/mu-checkbox.test.js +158 -0
  539. package/tests/components/mu-chip.test.js +118 -0
  540. package/tests/components/mu-container.test.js +120 -0
  541. package/tests/components/mu-divider.test.js +98 -0
  542. package/tests/components/mu-drawer-item.test.js +199 -0
  543. package/tests/components/mu-drawer.test.js +96 -0
  544. package/tests/components/mu-dropdown.test.js +125 -0
  545. package/tests/components/mu-form.test.js +138 -0
  546. package/tests/components/mu-grid.test.js +135 -0
  547. package/tests/components/mu-icon.test.js +110 -0
  548. package/tests/components/mu-input.test.js +131 -0
  549. package/tests/components/mu-lazy.test.js +103 -0
  550. package/tests/components/mu-modal.test.js +275 -0
  551. package/tests/components/mu-navbar.test.js +101 -0
  552. package/tests/components/mu-progress.test.js +115 -0
  553. package/tests/components/mu-radio.test.js +114 -0
  554. package/tests/components/mu-repeat.test.js +106 -0
  555. package/tests/components/mu-sidebar.test.js +126 -0
  556. package/tests/components/mu-skeleton.test.js +162 -0
  557. package/tests/components/mu-stack.test.js +143 -0
  558. package/tests/components/mu-switch.test.js +292 -0
  559. package/tests/components/mu-table.test.js +124 -0
  560. package/tests/components/mu-tabs.test.js +104 -0
  561. package/tests/components/mu-textarea.test.js +115 -0
  562. package/tests/components/mu-toast.test.js +321 -0
  563. package/tests/components/mu-tooltip.test.js +133 -0
  564. package/tests/components/mu-virtual-list.test.js +109 -0
  565. package/tests/core/MuElement.test.js +120 -0
  566. package/tests/core/agent-api.test.js +125 -0
  567. package/tests/core/all-core-modules.test.js +442 -0
  568. package/tests/core/bus.test.js +364 -0
  569. package/tests/core/component-schema.test.js +160 -0
  570. package/tests/core/feature-registry.test.js +198 -0
  571. package/tests/core/form-state.test.js +167 -0
  572. package/tests/core/http.test.js +119 -0
  573. package/tests/core/keyboard.test.js +319 -0
  574. package/tests/core/layers.test.js +129 -0
  575. package/tests/core/namespaced-stores.test.js +114 -0
  576. package/tests/core/render.test.js +121 -0
  577. package/tests/core/ripple.test.js +131 -0
  578. package/tests/core/router.test.js +89 -0
  579. package/tests/core/scheduler.test.js +121 -0
  580. package/tests/core/signals.test.js +128 -0
  581. package/tests/core/store.test.js +171 -0
  582. package/tests/core/transitions.test.js +82 -0
  583. package/tests/e2e/accessibility-harness.html +58 -0
  584. package/tests/e2e/accessibility.test.js +401 -0
  585. package/tests/e2e/agent-features.test.js +372 -0
  586. package/tests/e2e/card-spacing.test.js +287 -0
  587. package/tests/e2e/components.test.js +439 -0
  588. package/tests/e2e/demo-routes.test.js +478 -0
  589. package/tests/e2e/layout-css-fallback.test.js +334 -0
  590. package/tests/e2e/mu-alert.e2e.test.js +111 -0
  591. package/tests/e2e/mu-checkbox.test.js +489 -0
  592. package/tests/e2e/mu-chip.test.js +347 -0
  593. package/tests/e2e/mu-form.test.js +499 -0
  594. package/tests/e2e/mu-icon.test.js +114 -0
  595. package/tests/e2e/mu-radio.test.js +113 -0
  596. package/tests/e2e/mu-skeleton.test.js +140 -0
  597. package/tests/e2e/mu-switch.test.js +415 -0
  598. package/tests/e2e/mu-tabs.test.js +494 -0
  599. package/tests/e2e/mu-textarea.test.js +242 -0
  600. package/tests/e2e/mu-virtual-list.test.js +427 -0
  601. package/tests/e2e/perf-memory.test.js +161 -0
  602. package/tests/e2e/puppeteer-helper.js +137 -0
  603. package/tests/e2e/puppeteer.test.js +226 -0
  604. package/tests/e2e/pwa.test.js +261 -0
  605. package/tests/e2e/test-harness.html +319 -0
  606. package/tests/manual/test-components.html +120 -0
  607. package/tests/memory-test.html +309 -0
  608. package/tests/setup-dom.js +93 -0
  609. package/tests/visual-test.html +301 -0
@@ -0,0 +1,79 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/MuElement.js", "../node_modules/crossbus/dist/crossbus.js", "../src/core/bus.js", "../src/core/theme.js", "../src/core/store.js", "../src/core/router.js", "../src/core/http.js", "../src/core/ripple.js", "../src/core/signals.js", "../src/core/form-state.js", "../src/core/agent-api.js", "../src/core/feature-registry.js", "../src/core/component-schema.js", "../src/core/layers.js", "../src/core/keyboard.js", "../src/core/breakpoints.js", "../src/core/utils.js", "../src/core/transitions.js", "../src/core/scheduler.js", "../src/core/render.js", "../src/components/mu-stack.js", "../src/components/mu-grid.js", "../src/components/mu-container.js", "../src/components/mu-navbar.js", "../src/components/mu-sidebar.js", "../src/components/mu-divider.js", "../src/components/mu-layout.js", "../src/components/mu-drawer.js", "../src/components/mu-icon.js", "../src/components/mu-drawer-item.js", "../src/components/mu-bottom-nav.js", "../src/components/mu-button.js", "../src/components/mu-input.js", "../src/components/mu-textarea.js", "../src/components/mu-form.js", "../src/components/mu-dropdown.js", "../src/components/mu-checkbox.js", "../src/components/mu-switch.js", "../src/components/mu-radio.js", "../src/components/mu-chip.js", "../src/components/mu-card.js", "../src/components/mu-callout.js", "../src/components/mu-tabs.js", "../src/components/mu-alert.js", "../src/components/mu-badge.js", "../src/components/mu-progress.js", "../src/components/mu-table.js", "../src/components/mu-avatar.js", "../src/components/mu-skeleton.js", "../src/components/mu-spinner.js", "../src/components/mu-modal.js", "../src/components/mu-toast.js", "../src/components/mu-tooltip.js", "../src/components/mu-confirm.js", "../src/components/mu-router.js", "../src/components/mu-page.js", "../src/components/mu-theme-toggle.js", "../src/components/mu-virtual-list.js", "../src/components/mu-lazy.js", "../src/components/mu-repeat.js", "../src/components/mu-fetch.js", "../src/components/mu-datatable.js", "../src/components/mu-schema-form.js", "../src/components/mu-prompt-ui.js", "../src/components/mu-error-boundary.js", "../src/components/mu-code.js", "../src/components/mu-api-table.js", "../src/components/mu-example.js", "../src/components/mu-doc-page.js", "../src/index.js"],
4
+ "sourcesContent": [
5
+ "/**\n * @fileoverview MuElement - Base Web Component Class (Optimized)\n * \n * 2025/2026 Best Practices Applied:\n * - Proper disconnectedCallback for memory safety\n * - Event listener tracking and cleanup\n * - AbortController for efficient listener removal\n * - CSS containment hints\n * - No memory leaks guaranteed\n * \n * Performance optimizations:\n * - No Shadow DOM overhead\n * - Efficient attribute observation\n * - DOM updates via mutation, not recreation\n * - content-visibility auto for off-screen elements\n */\n\nexport class MuElement extends HTMLElement {\n /** @type {string[]} Attributes to observe for changes */\n static observedAttributes = [];\n\n /** @type {string} Base CSS class for the component */\n static baseClass = '';\n\n /** @type {string|null} CSS file name for lazy loading (e.g., 'button' loads components/button.css) */\n static cssFile = null;\n\n /** @type {Set} Track loaded CSS files globally to prevent duplicates */\n static _loadedCSS = new Set();\n\n /** @type {boolean} Apply CSS containment for perf */\n static useContainment = true;\n\n /** @type {boolean} Track if initial render has occurred */\n _rendered = false;\n\n /** @type {AbortController} For cleaning up event listeners */\n _abortController = null;\n\n /** @type {Set} Track timers for cleanup */\n _timers = new Set();\n\n /** @type {Set} Track intervals for cleanup */\n _intervals = new Set();\n\n constructor() {\n super();\n this._initAgentLogger();\n }\n\n _initAgentLogger() {\n if (!window.__MICROUI_ERRORS__) {\n window.__MICROUI_ERRORS__ = [];\n }\n\n // Agent Help Utilities\n if (!window.microUIAgent) {\n window.microUIAgent = {\n // Clear errors for a fresh test\n reset: () => {\n window.__MICROUI_ERRORS__ = [];\n console.log('[microUIAgent] Errors cleared');\n },\n // Get all errors\n getErrors: () => window.__MICROUI_ERRORS__,\n // Check if component has error\n hasError: (tagName, code) => {\n return window.__MICROUI_ERRORS__.some(e =>\n e.component === tagName.toLowerCase() && e.code === code\n );\n }\n };\n }\n }\n\n /**\n * Log error for Agent Debugging (Puppeteer/Playwright access)\n * @param {string} code - Error code (e.g. 'A11Y_MISSING_LABEL')\n * @param {string} message - Human readable message\n */\n logError(code, message) {\n const error = {\n component: this.tagName.toLowerCase(),\n code,\n message,\n element: this, // Reference leak only if used in dev tools, should be safe for tests\n timestamp: Date.now()\n };\n window.__MICROUI_ERRORS__.push(error);\n console.warn(`[microUI] ${code}: ${message}`, this);\n }\n\n /**\n * Called when element is added to DOM.\n * Sets up base class, containment, and triggers initial render.\n */\n connectedCallback() {\n // Reuse existing AbortController to prevent duplicate event listeners\n // when element is moved in DOM (connectedCallback called multiple times)\n if (!this._abortController) {\n this._abortController = new AbortController();\n }\n\n // Add base class\n if (this.constructor.baseClass) {\n this.classList.add(this.constructor.baseClass);\n }\n\n // Apply CSS containment for rendering performance\n if (this.constructor.useContainment && !this.style.contain) {\n this.style.contain = 'layout style';\n }\n\n // SOTA 2026: Automatic event delegation on component root\n // Single listener handles all [data-action] clicks - no timing issues\n // Attached BEFORE render so it catches events on dynamically created elements\n this.#setupEventDelegation();\n\n // Initial render\n if (!this._rendered) {\n this.render();\n this._rendered = true;\n }\n\n // Lazy load component CSS\n this._loadComponentCSS();\n\n // 2026 Agent Optimization: Auto-infer semantic action attributes\n this._inferSemanticAttributes();\n }\n\n /**\n * SOTA 2026: Centralized event delegation pattern.\n * Single click listener on component root that delegates to [data-action] elements.\n * Components implement handleAction(action, target, event) to handle actions.\n * @private\n */\n #setupEventDelegation() {\n this.listen(this, 'click', (e) => {\n const actionEl = e.target.closest('[data-action]');\n if (!actionEl || !this.contains(actionEl)) return;\n\n const action = actionEl.dataset.action;\n if (this.handleAction) {\n this.handleAction(action, actionEl, e);\n }\n });\n }\n\n /**\n * Lazy load component-specific CSS file.\n * Only loads once per CSS file across all instances.\n * @private\n */\n _loadComponentCSS() {\n const cssFile = this.constructor.cssFile;\n if (!cssFile) return;\n\n // Check if already loaded (global static Set)\n if (MuElement._loadedCSS.has(cssFile)) return;\n MuElement._loadedCSS.add(cssFile);\n\n // Create and append link element\n const link = document.createElement('link');\n link.id = `mu-css-${cssFile}`;\n link.rel = 'stylesheet';\n\n // Determine base path - check multiple sources\n let basePath = '/styles/';\n\n // 1. Check for existing styles/ link (direct styles loading)\n const stylesLink = document.querySelector('link[href*=\"/styles/\"]');\n if (stylesLink) {\n const match = stylesLink.href.match(/(.*\\/(?:src\\/|dist\\/)?styles\\/)/);\n if (match) basePath = match[1];\n }\n // 2. Check for dist/microui.css (shell.html pattern) -> use dist/styles/\n else {\n const distLink = document.querySelector('link[href*=\"/dist/\"]');\n if (distLink) {\n const match = distLink.href.match(/(.*\\/dist\\/)/);\n if (match) basePath = match[1] + 'styles/';\n }\n // 3. Check for src/ pattern in scripts (dev mode)\n else {\n const srcScript = document.querySelector('script[src*=\"/src/\"]');\n if (srcScript) {\n const match = srcScript.src.match(/(.*\\/src\\/)/);\n if (match) basePath = match[1] + 'styles/';\n }\n }\n }\n\n link.href = `${basePath}components/${cssFile}.css`;\n document.head.appendChild(link);\n }\n\n /**\n * Infer and set data-mu-action and data-mu-role attributes for AI agents.\n * Based on 2026 Agentic Web research - semantic attributes reduce task failure.\n * @private\n */\n _inferSemanticAttributes() {\n const tag = this.tagName.toLowerCase();\n\n // Skip if already has explicit action\n if (this.hasAttribute('data-mu-action')) return;\n\n // Infer action based on component type\n let action = '';\n let role = '';\n\n switch (tag) {\n case 'mu-button':\n action = this._inferButtonAction();\n role = this._inferButtonRole();\n break;\n case 'mu-input':\n case 'mu-textarea':\n action = 'input';\n role = 'text-field';\n break;\n case 'mu-checkbox':\n case 'mu-switch':\n action = 'toggle';\n role = 'control';\n break;\n case 'mu-dropdown':\n action = 'select';\n role = 'selector';\n break;\n case 'mu-modal':\n action = 'dialog';\n role = 'overlay';\n break;\n case 'mu-tabs':\n action = 'navigate';\n role = 'navigation';\n break;\n case 'mu-card':\n role = 'container';\n break;\n }\n\n if (action) this.setAttribute('data-mu-action', action);\n if (role) this.setAttribute('data-mu-role', role);\n }\n\n /**\n * Infer button action from text content\n * @private\n */\n _inferButtonAction() {\n const text = this.textContent?.toLowerCase().trim() || '';\n\n // Submit/Save patterns\n if (/^(save|submit|confirm|send|create|add|apply|ok|yes)$/.test(text)) {\n return 'submit';\n }\n // Cancel/Close patterns\n if (/^(cancel|close|dismiss|no|nevermind)$/.test(text)) {\n return 'cancel';\n }\n // Delete/Remove patterns\n if (/^(delete|remove|clear|trash)$/.test(text)) {\n return 'delete';\n }\n // Navigation patterns\n if (/^(back|next|previous|forward|continue)$/.test(text)) {\n return 'navigate';\n }\n // Default\n return 'click';\n }\n\n /**\n * Infer button role from context\n * @private\n */\n _inferButtonRole() {\n const variant = this.getAttribute('variant');\n\n // Primary action buttons\n if (variant === 'filled' || variant === 'elevated') {\n return 'primary-action';\n }\n // Secondary actions\n if (variant === 'tonal' || variant === 'outlined') {\n return 'secondary-action';\n }\n // Tertiary/dismiss\n if (variant === 'text') {\n return 'tertiary-action';\n }\n // Danger\n if (variant === 'danger') {\n return 'destructive-action';\n }\n return 'action';\n }\n\n /**\n * Called when element is removed from DOM.\n * CRITICAL: Clean up all event listeners and timers to prevent memory leaks.\n */\n disconnectedCallback() {\n // Abort all event listeners registered with signal\n if (this._abortController) {\n this._abortController.abort();\n this._abortController = null;\n }\n\n // Clear all timers\n for (const timer of this._timers) {\n clearTimeout(timer);\n }\n this._timers.clear();\n\n // Clear all intervals\n for (const interval of this._intervals) {\n clearInterval(interval);\n }\n this._intervals.clear();\n\n // Call subclass cleanup\n this.cleanup();\n }\n\n /**\n * Override in subclass for custom cleanup logic.\n * Called when component is removed from DOM.\n */\n cleanup() {\n // Override in subclass\n }\n\n /**\n * Called when observed attribute changes.\n * Triggers efficient update, not full re-render.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (oldValue !== newValue && this._rendered) {\n this.update(name, newValue, oldValue);\n }\n }\n\n /**\n * Initial render - override in subclass.\n */\n render() {\n // Override in subclass\n }\n\n /**\n * Efficient update - override in subclass.\n * Modifies existing DOM, never recreates.\n */\n update(attr, newValue, oldValue) {\n // Override in subclass\n }\n\n /**\n * SOTA 2026: Deferred event setup - override in subclass.\n * Called via queueMicrotask AFTER render() completes.\n * Guarantees DOM is stable before attaching listeners.\n * Use this.listen() for automatic cleanup on disconnect.\n * \n * @example\n * setupEvents() {\n * this.listen(this.button, 'click', () => this.handleClick());\n * }\n */\n setupEvents() {\n // Override in subclass\n }\n\n /**\n * Helper: Get attribute with default\n */\n attr(name, defaultValue = '') {\n return this.getAttribute(name) ?? defaultValue;\n }\n\n /**\n * Helper: Check if attribute exists\n */\n has(name) {\n return this.hasAttribute(name);\n }\n\n /**\n * Helper: Emit a custom event\n */\n emit(name, detail = {}) {\n this.dispatchEvent(new CustomEvent(name, {\n bubbles: true,\n composed: true,\n detail\n }));\n }\n\n /**\n * Safe addEventListener with automatic cleanup on disconnect.\n * Uses AbortController signal for efficient removal.\n * \n * @param {string} type - Event type\n * @param {EventListener} listener - Event handler\n * @param {AddEventListenerOptions} options - Event options\n */\n listen(target, type, listener, options = {}) {\n if (!this._abortController) {\n this._abortController = new AbortController();\n }\n\n const opts = {\n ...options,\n signal: this._abortController.signal\n };\n\n target.addEventListener(type, listener, opts);\n }\n\n /**\n * Safe setTimeout with automatic cleanup on disconnect.\n * @param {Function} fn - Callback\n * @param {number} delay - Delay in ms\n * @returns {number} Timer ID\n */\n setTimeout(fn, delay) {\n let id;\n id = setTimeout(() => {\n this._timers.delete(id);\n fn();\n }, delay);\n this._timers.add(id);\n return id;\n }\n\n /**\n * Safe setInterval with automatic cleanup on disconnect.\n * @param {Function} fn - Callback\n * @param {number} delay - Interval in ms\n * @returns {number} Interval ID\n */\n setInterval(fn, delay) {\n const id = setInterval(fn, delay);\n this._intervals.add(id);\n return id;\n }\n\n /**\n * Helper: Setup keyboard activation (Enter/Space triggers callback).\n * Also sets up tabindex based on disabled state.\n * Consolidates repeated pattern across interactive components.\n * \n * @param {Function} callback - Function to call on activation\n */\n setupActivation(callback) {\n this.updateTabindex();\n this.addEventListener('keydown', (e) => {\n if ((e.key === 'Enter' || e.key === ' ') && !this.has('disabled')) {\n e.preventDefault();\n callback();\n }\n });\n }\n\n /**\n * Helper: Update tabindex based on disabled state.\n * Interactive elements should be focusable unless disabled.\n */\n updateTabindex() {\n this.setAttribute('tabindex', this.has('disabled') ? '-1' : '0');\n }\n\n /**\n * Helper: Set display style consistently.\n * @param {string} value - CSS display value (flex, block, inline-flex, etc.)\n */\n setDisplay(value) {\n this.style.display = value;\n }\n\n /**\n * Helper: Check if component is disabled.\n * @returns {boolean}\n */\n get isDisabled() {\n return this.has('disabled');\n }\n}\n\n/**\n * SOTA 2026: Scheduler API-enhanced component registration.\n * Yields to main thread between registrations to prevent long tasks (>50ms).\n * Uses scheduler.yield() on Chrome 129+, falls back to setTimeout(0).\n * \n * @param {string} tagName - Custom element tag name\n * @param {typeof HTMLElement} ComponentClass - Component class to register\n * @param {Object} options - Registration options\n * @param {string} options.priority - 'user-blocking' (default) | 'user-visible' | 'background'\n */\nexport function define(tagName, ComponentClass, options = {}) {\n if (customElements.get(tagName)) return;\n\n const priority = options.priority || 'user-blocking';\n\n // SOTA 2026: Use Scheduler API for prioritized registration\n if (typeof scheduler !== 'undefined' && scheduler.postTask) {\n scheduler.postTask(() => {\n if (!customElements.get(tagName)) {\n customElements.define(tagName, ComponentClass);\n }\n }, { priority });\n } else {\n // Fallback: immediate registration for older browsers\n customElements.define(tagName, ComponentClass);\n }\n}\n\n/**\n * SOTA 2026: Batch component registration with yielding.\n * Registers multiple components while yielding to main thread between each.\n * Prevents long tasks and keeps UI responsive during initial load.\n * \n * @param {Array<[string, typeof HTMLElement]>} components - Array of [tagName, Class] pairs\n * @param {Object} options - Registration options\n * @param {number} options.batchSize - Components per batch before yield (default: 3)\n * @returns {Promise<void>} Resolves when all components are registered\n */\nexport async function defineAll(components, options = {}) {\n const batchSize = options.batchSize || 3;\n const yieldToMain = getYieldFunction();\n\n for (let i = 0; i < components.length; i++) {\n const [tagName, ComponentClass] = components[i];\n\n if (!customElements.get(tagName)) {\n customElements.define(tagName, ComponentClass);\n }\n\n // Yield to main thread after each batch to prevent long tasks\n if ((i + 1) % batchSize === 0 && i < components.length - 1) {\n await yieldToMain();\n }\n }\n}\n\n/**\n * Get the best yield function available.\n * SOTA 2026: scheduler.yield() > setTimeout(0)\n * @returns {Function} Async yield function\n */\nfunction getYieldFunction() {\n // Chrome 129+: scheduler.yield() is the most efficient\n if (typeof scheduler !== 'undefined' && scheduler.yield) {\n return () => scheduler.yield();\n }\n\n // Fallback: setTimeout(0) yields to event loop\n return () => new Promise(resolve => setTimeout(resolve, 0));\n}\n",
6
+ "/** CrossBus v0.1.0 | MIT */\n/**\n * @fileoverview Local event emitter with wildcard support and AbortSignal integration.\n * Uses Symbol-based private storage for encapsulation.\n * @module core/event-emitter\n */\n\n/** @type {symbol} Private storage key for listeners map */\nconst LISTENERS = Symbol('listeners');\n\n/** @type {symbol} Private storage key for subscription counter */\nconst SUB_COUNTER = Symbol('subCounter');\n\n/** @type {symbol} Private storage key for max listeners setting */\nconst MAX_LISTENERS = Symbol('maxListeners');\n\n/** @type {symbol} Private storage key for fast callback cache (Object-based) */\nconst FAST_CACHE = Symbol('fastCache');\n\n/** @type {number} Default max listeners before warning */\nconst DEFAULT_MAX_LISTENERS = 10;\n\n/** @type {Object} Default source for local emissions */\nconst DEFAULT_SOURCE = Object.freeze({\n peerId: 'self',\n origin: typeof globalThis.location !== 'undefined' ? globalThis.location.origin : 'unknown',\n type: 'local'\n});\n\n/**\n * @typedef {Object} ListenerOptions\n * @property {boolean} [once=false] - Auto-remove after first invocation.\n * @property {AbortSignal} [signal] - AbortController signal for cleanup.\n * @property {'sync'|'async'} [mode='async'] - Execution mode.\n * @property {number} [priority=0] - Execution order (higher = first).\n */\n\n/**\n * @typedef {Object} Subscription\n * @property {string} id - Unique subscription ID.\n * @property {string} signalName - The signal name subscribed to.\n * @property {Function} unsubscribe - Call to remove this listener.\n * @property {boolean} active - Whether subscription is active.\n */\n\n/**\n * @typedef {Object} SignalEvent\n * @property {string} name - Signal name that was emitted.\n * @property {*} data - The payload data.\n * @property {string} messageId - Unique message ID.\n * @property {number} timestamp - When the signal was emitted.\n * @property {SignalSource} source - Origin of the signal.\n */\n\n/**\n * @typedef {Object} SignalSource\n * @property {string} peerId - ID of the emitting peer ('self' if local).\n * @property {string} origin - Origin URL.\n * @property {'local'|'iframe'|'worker'|'service-worker'|'window'} type - Source type.\n */\n\n/**\n * @callback SignalHandler\n * @param {SignalEvent} event - The signal event object.\n * @returns {void|Promise<void>}\n */\n\n/**\n * @typedef {Object} ListenerEntry\n * @property {string} id - Subscription ID.\n * @property {SignalHandler} handler - The callback function.\n * @property {number} priority - Execution priority.\n * @property {'sync'|'async'} mode - Execution mode.\n * @property {boolean} once - Auto-remove after first invocation.\n * @property {AbortSignal|null} signal - Abort signal.\n */\n\n/**\n * @typedef {Object} RemoveResult\n * @property {boolean} success - True if at least one listener was removed.\n * @property {number} removedCount - Number of listeners removed.\n * @property {number} remainingCount - Listeners still registered for this signal.\n */\n\n/**\n * Local event emitter with wildcard support.\n * \n * Supports:\n * - Exact match: `on('user:login', handler)`\n * - Namespace wildcard: `on('user:*', handler)` matches `user:login`, `user:logout`\n * - Global wildcard: `on('*', handler)` matches all signals\n * \n * @example\n * const emitter = new EventEmitter();\n * \n * // Basic listener\n * emitter.on('message', (event) => console.log(event.data));\n * \n * // Wildcard listener\n * emitter.on('user:*', (event) => console.log('User event:', event.name));\n * \n * // Emit signal\n * emitter.emit('message', { text: 'Hello' });\n */\nclass EventEmitter {\n constructor() {\n /** @type {Map<string, ListenerEntry[]>} */\n this[LISTENERS] = new Map();\n\n /** @type {number} */\n this[SUB_COUNTER] = 0;\n\n /** @type {number} Max listeners before memory leak warning */\n this[MAX_LISTENERS] = DEFAULT_MAX_LISTENERS;\n\n /** @type {Object<string, Function[]>} Fast Object-based cache for callbacks only */\n this[FAST_CACHE] = Object.create(null);\n }\n\n /**\n * Sets the max listeners threshold for memory leak warnings.\n * @param {number} n - Max listeners (0 = unlimited)\n */\n setMaxListeners(n) {\n this[MAX_LISTENERS] = n;\n return this;\n }\n\n /**\n * Gets the current max listeners setting.\n * @returns {number}\n */\n getMaxListeners() {\n return this[MAX_LISTENERS];\n }\n\n /**\n * Registers a listener for a signal.\n * \n * @param {string} name - Signal name. Supports wildcards: '*', 'namespace:*'.\n * @param {SignalHandler} handler - Callback function.\n * @param {ListenerOptions} [options={}] - Configuration options.\n * @returns {Subscription} Subscription object.\n * @throws {TypeError} If name is not a string or handler is not a function.\n * \n * @example\n * // Basic listener\n * const sub = emitter.on('user:login', (event) => {\n * console.log(`User ${event.data.userId} logged in`);\n * });\n * \n * @example\n * // One-time listener\n * emitter.on('init:complete', handler, { once: true });\n * \n * @example\n * // With AbortController\n * const controller = new AbortController();\n * emitter.on('data:update', handler, { signal: controller.signal });\n * controller.abort(); // Removes listener\n * \n * @example\n * // Priority-based ordering\n * emitter.on('event', lowPriorityHandler, { priority: 1 });\n * emitter.on('event', highPriorityHandler, { priority: 10 }); // Runs first\n */\n on(name, handler, options = {}) {\n if (typeof name !== 'string') {\n throw new TypeError('Signal name must be a string');\n }\n if (typeof handler !== 'function') {\n throw new TypeError('Handler must be a function');\n }\n\n const id = `sub_${++this[SUB_COUNTER]}`;\n\n // V8 Optimization: Consistent object shape for hidden class caching\n // All entries have same properties in same order\n /** @type {ListenerEntry} */\n const entry = {\n id,\n handler,\n priority: options.priority ?? 0,\n mode: options.mode ?? 'async',\n once: options.once ?? false,\n signal: options.signal ?? null\n };\n\n // Get or create listeners array for this signal\n if (!this[LISTENERS].has(name)) {\n this[LISTENERS].set(name, []);\n }\n\n const listeners = this[LISTENERS].get(name);\n\n // Binary insert for O(log n) search instead of O(n log n) sort\n if (listeners.length === 0 || entry.priority <= listeners[listeners.length - 1].priority) {\n // Fast path: append (most common case with priority 0)\n listeners.push(entry);\n } else {\n // Binary search for insert position (higher priority first)\n let lo = 0, hi = listeners.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (listeners[mid].priority >= entry.priority) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n listeners.splice(lo, 0, entry);\n }\n\n // Sync FAST_CACHE for ultra-fast emitSync\n this[FAST_CACHE][name] = listeners.map(e => e.handler);\n\n // Memory leak detection: warn if too many listeners\n const maxListeners = this[MAX_LISTENERS];\n if (maxListeners > 0 && listeners.length > maxListeners) {\n console.warn(\n `[CrossBus] Possible memory leak: ${listeners.length} listeners for \"${name}\". ` +\n `Use setMaxListeners(n) to increase limit.`\n );\n }\n\n // Create subscription object\n let active = true;\n const subscription = {\n id,\n signalName: name,\n get active() { return active; },\n unsubscribe: () => {\n if (active) {\n this.#removeListener(name, id);\n active = false;\n }\n }\n };\n\n // Handle AbortSignal\n if (entry.signal) {\n if (entry.signal.aborted) {\n // Already aborted, remove immediately\n this.#removeListener(name, id);\n active = false;\n } else {\n entry.signal.addEventListener('abort', () => {\n subscription.unsubscribe();\n }, { once: true });\n }\n }\n\n return subscription;\n }\n\n /**\n * Registers a one-time listener.\n * Convenience method for `on(name, handler, { once: true })`.\n * \n * @param {string} name - Signal name.\n * @param {SignalHandler} handler - Callback function.\n * @param {ListenerOptions} [options={}] - Additional options.\n * @returns {Subscription} Subscription object.\n */\n once(name, handler, options = {}) {\n return this.on(name, handler, { ...options, once: true });\n }\n\n /**\n * Ultra-fast listener registration for performance-critical paths.\n * \n * Unlike on(), this method:\n * - No input validation (caller must ensure correct types)\n * - No subscription object (returns unbind function directly)\n * - No priority, once, or AbortSignal support\n * - Direct push to FAST_CACHE (minimal overhead)\n * \n * Use when you need maximum subscribe performance.\n * \n * @param {string} name - Signal name.\n * @param {EventListener} handler - Callback function.\n * @returns {Function} Unbind function (call to remove listener).\n * \n * @example\n * // 50M+ ops/sec subscribe/unsubscribe\n * const off = emitter.onFast('tick', (data) => console.log(data));\n * off(); // Remove listener\n */\n onFast(name, handler) {\n // Match nanoevents exactly: ||= pattern, minimal code\n (this[FAST_CACHE][name] ||= []).push(handler);\n return () => {\n this[FAST_CACHE][name] = this[FAST_CACHE][name]?.filter(h => h !== handler);\n };\n }\n\n /**\n * Ultra-fast listener removal for performance-critical paths.\n * \n * @param {string} name - Signal name.\n * @param {EventListener} handler - Handler to remove.\n */\n offFast(name, handler) {\n const cache = this[FAST_CACHE][name];\n if (cache) {\n const idx = cache.indexOf(handler);\n if (idx !== -1) cache.splice(idx, 1);\n }\n // Also clean LISTENERS\n const listeners = this[LISTENERS].get(name);\n if (listeners) {\n const idx = listeners.findIndex(e => e.handler === handler);\n if (idx !== -1) listeners.splice(idx, 1);\n }\n }\n\n /**\n * Removes signal listener(s).\n * \n * @param {string} name - Signal name.\n * @param {SignalHandler} [handler] - Specific handler to remove.\n * If omitted, removes ALL listeners.\n * @returns {RemoveResult} Result of the removal.\n * @throws {TypeError} If name is not a string.\n * \n * @example\n * // Remove specific handler\n * const result = emitter.off('msg', myHandler);\n * // => { success: true, removedCount: 1, remainingCount: 0 }\n * \n * @example\n * // Remove ALL listeners for a signal\n * emitter.off('updates');\n * // => { success: true, removedCount: 2, remainingCount: 0 }\n */\n off(name, handler) {\n if (typeof name !== 'string') {\n throw new TypeError('Signal name must be a string');\n }\n\n const listeners = this[LISTENERS].get(name);\n\n if (!listeners || listeners.length === 0) {\n return { success: false, removedCount: 0, remainingCount: 0 };\n }\n\n let removedCount = 0;\n\n if (handler === undefined) {\n // Remove all listeners for this signal\n removedCount = listeners.length;\n this[LISTENERS].delete(name);\n delete this[FAST_CACHE][name];\n } else {\n // Remove specific handler\n const initialLength = listeners.length;\n const filtered = listeners.filter(entry => entry.handler !== handler);\n removedCount = initialLength - filtered.length;\n\n if (filtered.length === 0) {\n this[LISTENERS].delete(name);\n delete this[FAST_CACHE][name];\n } else {\n this[LISTENERS].set(name, filtered);\n this[FAST_CACHE][name] = filtered.map(e => e.handler);\n }\n }\n\n const remaining = this[LISTENERS].get(name)?.length ?? 0;\n\n return {\n success: removedCount > 0,\n removedCount,\n remainingCount: remaining\n };\n }\n\n /**\n * Ultra-fast synchronous emit for performance-critical paths.\n * \n * Unlike emit(), this method:\n * - Is synchronous (no async/await overhead)\n * - Passes data directly (no event envelope)\n * - Skips messageId, timestamp generation\n * - No wildcard matching (exact match only)\n * \n * Use for high-frequency events where metadata is not needed.\n * \n * @param {string} name - Signal name (exact match only).\n * @param {*} data - Payload to pass directly to handlers.\n * @returns {number} Number of listeners invoked.\n * \n * @example\n * // 150M+ ops/sec - use for hot paths\n * emitter.emitSync('tick', { x: 100, y: 200 });\n */\n emitSync(name, data) {\n // Ultra-fast path: use Object-based cache (faster than Map.get)\n const callbacks = this[FAST_CACHE][name];\n if (!callbacks) return 0;\n\n // Direct callback invocation (no .handler indirection)\n const len = callbacks.length;\n if (len === 1) {\n callbacks[0](data);\n return 1;\n }\n if (len === 2) {\n callbacks[0](data);\n callbacks[1](data);\n return 2;\n }\n if (len === 3) {\n callbacks[0](data);\n callbacks[1](data);\n callbacks[2](data);\n return 3;\n }\n if (len === 4) {\n callbacks[0](data);\n callbacks[1](data);\n callbacks[2](data);\n callbacks[3](data);\n return 4;\n }\n\n // General loop for 5+ listeners\n for (let i = 0; i < len; i++) {\n callbacks[i](data);\n }\n return len;\n }\n\n /**\n * Emits a signal to local listeners.\n * \n * @param {string} name - Signal name.\n * @param {*} data - Payload data.\n * @param {Partial<SignalSource>} [source] - Signal source info.\n * @returns {Promise<number>} Number of listeners invoked.\n * @throws {TypeError} If name is not a string.\n * \n * @example\n * const count = await emitter.emit('user:login', { userId: 123 });\n * console.log(`Notified ${count} listeners`);\n */\n async emit(name, data, source) {\n if (typeof name !== 'string') {\n throw new TypeError('Signal name must be a string');\n }\n\n // Fast path: single exact-match listener, no wildcards\n const exactListeners = this[LISTENERS].get(name);\n const hasWildcard = this[LISTENERS].has('*');\n\n if (exactListeners?.length === 1 && !hasWildcard && !source) {\n const entry = exactListeners[0];\n const event = {\n name,\n data,\n messageId: crypto.randomUUID(),\n timestamp: Date.now(),\n source: DEFAULT_SOURCE\n };\n\n try {\n if (entry.mode === 'sync') {\n await entry.handler(event);\n } else {\n Promise.resolve().then(() => entry.handler(event));\n }\n } catch (error) {\n console.error(`[CrossBus] Handler error for \"${name}\":`, error);\n }\n\n if (entry.once) {\n this.#removeListener(name, entry.id);\n }\n\n return 1;\n }\n\n // Full path: multiple listeners or wildcards\n const event = {\n name,\n data,\n messageId: crypto.randomUUID(),\n timestamp: Date.now(),\n source: source ? { ...DEFAULT_SOURCE, ...source } : DEFAULT_SOURCE\n };\n\n // Collect matching listeners\n const matchingEntries = this.#getMatchingListeners(name);\n\n // Track entries to remove (once: true)\n const toRemove = [];\n\n // Invoke handlers\n for (const { signalName, entry } of matchingEntries) {\n try {\n if (entry.mode === 'sync') {\n await entry.handler(event);\n } else {\n // Fire async without blocking\n Promise.resolve().then(() => entry.handler(event));\n }\n } catch (error) {\n // Log but don't throw - other listeners should still run\n console.error(`[CrossBus] Handler error for \"${name}\":`, error);\n }\n\n if (entry.once) {\n toRemove.push({ signalName, id: entry.id });\n }\n }\n\n // Remove once listeners\n for (const { signalName, id } of toRemove) {\n this.#removeListener(signalName, id);\n }\n\n return matchingEntries.length;\n }\n\n /**\n * Checks if there are any listeners for a signal.\n * \n * @param {string} name - Signal name (exact match only).\n * @returns {boolean} True if listeners exist.\n */\n hasListeners(name) {\n const listeners = this[LISTENERS].get(name);\n return listeners !== undefined && listeners.length > 0;\n }\n\n /**\n * Gets the count of listeners for a signal.\n * \n * @param {string} name - Signal name (exact match only).\n * @returns {number} Number of listeners.\n */\n listenerCount(name) {\n return this[LISTENERS].get(name)?.length ?? 0;\n }\n\n /**\n * Gets all registered signal names.\n * \n * @returns {string[]} Array of signal names.\n */\n getSignalNames() {\n return Array.from(this[LISTENERS].keys());\n }\n\n /**\n * Removes all listeners.\n */\n clear() {\n this[LISTENERS].clear();\n // Reset FAST_CACHE to empty object\n for (const key in this[FAST_CACHE]) {\n delete this[FAST_CACHE][key];\n }\n }\n\n /**\n * Gets all listeners matching a signal name (including wildcards).\n * \n * \n * @param {string} name - Signal name to match.\n * @returns {Array<{signalName: string, entry: ListenerEntry}>} Matching entries.\n */\n #getMatchingListeners(name) {\n // Fast path: check exact match first and if no wildcards registered\n const exactListeners = this[LISTENERS].get(name);\n const globalWildcard = this[LISTENERS].get('*');\n\n // Find namespace wildcards (e.g., 'user:*' for 'user:login')\n let namespaceWildcard = null;\n const colonIdx = name.indexOf(':');\n if (colonIdx > 0) {\n const wildcardPattern = name.slice(0, colonIdx + 1) + '*';\n namespaceWildcard = this[LISTENERS].get(wildcardPattern);\n }\n\n // Super-fast path: only exact match, no wildcards\n if (exactListeners && !globalWildcard && !namespaceWildcard) {\n return exactListeners.map(entry => ({ signalName: name, entry }));\n }\n\n // Fast path: single source, already sorted\n const sources = [\n exactListeners && { signalName: name, entries: exactListeners },\n globalWildcard && { signalName: '*', entries: globalWildcard },\n namespaceWildcard && { signalName: name.slice(0, colonIdx + 1) + '*', entries: namespaceWildcard }\n ].filter(Boolean);\n\n if (sources.length === 0) {\n return [];\n }\n\n if (sources.length === 1) {\n // Single source: already sorted, no merge needed\n return sources[0].entries.map(entry => ({ signalName: sources[0].signalName, entry }));\n }\n\n // Multiple sources: collect and merge-sort by priority\n const results = [];\n for (const { signalName, entries } of sources) {\n for (const entry of entries) {\n results.push({ signalName, entry });\n }\n }\n\n // Only sort when merging multiple sources\n results.sort((a, b) => b.entry.priority - a.entry.priority);\n\n return results;\n }\n\n\n\n /**\n * Removes a listener by ID.\n * \n * \n * @param {string} name - Signal name.\n * @param {string} id - Subscription ID.\n */\n #removeListener(name, id) {\n const listeners = this[LISTENERS].get(name);\n if (!listeners) return;\n\n const filtered = listeners.filter(entry => entry.id !== id);\n\n if (filtered.length === 0) {\n this[LISTENERS].delete(name);\n delete this[FAST_CACHE][name];\n } else {\n this[LISTENERS].set(name, filtered);\n this[FAST_CACHE][name] = filtered.map(e => e.handler);\n }\n }\n}\n\n/**\n * Creates an ultra-fast plain object emitter that beats nanoevents.\n * \n * Unlike EventEmitter class, this is a minimal plain object with:\n * - No class overhead\n * - No Symbol lookups\n * - No validation\n * - Direct property access\n * \n * Benchmarks:\n * - on/off cycle: 45M ops/sec (vs nanoevents 38M) = 1.18x faster\n * - emit (10 listeners): 82M ops/sec (vs nanoevents 65M) = 1.26x faster\n * \n * @returns {Object} Fast emitter with on(), emit() methods\n * \n * @example\n * const emitter = createFastEmitter();\n * const off = emitter.on('event', (data) => console.log(data));\n * emitter.emit('event', { value: 42 });\n * off(); // Remove listener\n */\nconst createFastEmitter = () => ({\n events: {},\n\n /**\n * Subscribe to an event. Returns unbind function.\n * @param {string} event - Event name\n * @param {EventListener} cb - Callback function\n * @returns {Function} Unbind function\n */\n on(event, cb) {\n (this.events[event] ||= []).push(cb);\n return () => {\n this.events[event] = this.events[event]?.filter(i => cb !== i);\n };\n },\n\n /**\n * Emit an event to all listeners.\n * @param {string} event - Event name\n * @param {*} data - Data to pass to listeners\n */\n emit(event, data) {\n const c = this.events[event];\n if (!c) return;\n const len = c.length;\n // Unrolled for 1-4 (most common)\n if (len === 1) { c[0](data); return; }\n if (len === 2) { c[0](data); c[1](data); return; }\n if (len === 3) { c[0](data); c[1](data); c[2](data); return; }\n if (len === 4) { c[0](data); c[1](data); c[2](data); c[3](data); return; }\n // Loop for 5+\n for (let i = 0; i < len; i++) c[i](data);\n },\n\n /**\n * Remove all listeners for an event or all events.\n * @param {string} [event] - Event name (omit to clear all)\n */\n off(event) {\n if (event) {\n delete this.events[event];\n } else {\n this.events = {};\n }\n }\n});\n\n/**\n * @fileoverview Common types and constants shared across all modules.\n * This module is included in the common bundle to avoid duplication.\n * @module common/types\n */\n\n/**\n * Protocol marker for CrossBus messages.\n * @constant {string}\n */\nconst PROTOCOL_MARKER = '_cb';\n\n/**\n * Current protocol version.\n * @constant {number}\n */\nconst PROTOCOL_VERSION = 1;\n\n/**\n * Message type codes (compact for wire efficiency).\n * @readonly\n * @enum {string}\n */\nconst MessageType = Object.freeze({\n /** Signal - one-way message */\n SIGNAL: 'sig',\n /** Request - expects response */\n REQUEST: 'req',\n /** Response - reply to request */\n RESPONSE: 'res',\n /** Acknowledge - delivery confirmation */\n ACK: 'ack',\n /** Handshake - connection negotiation */\n HANDSHAKE: 'hsk',\n HANDSHAKE_INIT: 'hsk_init',\n HANDSHAKE_ACK: 'hsk_ack',\n HANDSHAKE_COMPLETE: 'hsk_done',\n /** Ping - heartbeat */\n PING: 'png',\n /** Pong - heartbeat response */\n PONG: 'pog',\n /** Goodbye - graceful disconnect */\n BYE: 'bye',\n /** Broadcast - message for all peers */\n BROADCAST: 'bc'\n});\n\n/**\n * Handshake phase codes.\n * @readonly\n * @enum {string}\n */\nconst HandshakePhase = Object.freeze({\n INIT: 'init',\n INIT_SENT: 'init_sent',\n ACK: 'ack',\n ACK_SENT: 'ack_sent',\n DONE: 'done'\n});\n\n/**\n * Peer connection status.\n * @readonly\n * @enum {string}\n */\nconst PeerStatus = Object.freeze({\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n DISCONNECTED: 'disconnected',\n RECONNECTING: 'reconnecting',\n FAILED: 'failed'\n});\n\n/**\n * Peer type (transport mechanism).\n * @readonly\n * @enum {string}\n */\nconst PeerType = Object.freeze({\n IFRAME: 'iframe',\n WORKER: 'worker',\n SERVICE_WORKER: 'sw',\n WINDOW: 'window',\n PORT: 'port'\n});\n\n/**\n * Delivery status for emit results.\n * @readonly\n * @enum {string}\n */\nconst DeliveryStatus = Object.freeze({\n /** Delivered to local listeners only */\n LOCAL: 'local',\n /** Sent to peer (no ACK requested) */\n SENT: 'sent',\n /** Sent and ACK received */\n ACKED: 'acked',\n /** Queued for offline peer */\n QUEUED: 'queued',\n /** ACK timeout */\n TIMEOUT: 'timeout',\n /** Delivery failed */\n FAILED: 'failed'\n});\n\n/**\n * Checks if an object is a valid CrossBus message.\n * \n * @param {*} obj - Object to check.\n * @returns {boolean} True if valid protocol message.\n */\nfunction isProtocolMessage(obj) {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n obj[PROTOCOL_MARKER] === PROTOCOL_VERSION &&\n typeof obj.id === 'string' &&\n (typeof obj.type === 'string' || typeof obj.t === 'string')\n );\n}\n\n/**\n * Checks if a value is transferable.\n * \n * @param {*} value - Value to check.\n * @returns {boolean} True if transferable.\n */\nfunction isTransferable(value) {\n if (value instanceof ArrayBuffer) return true;\n if (value instanceof MessagePort) return true;\n if (typeof ImageBitmap !== 'undefined' && value instanceof ImageBitmap) return true;\n if (typeof OffscreenCanvas !== 'undefined' && value instanceof OffscreenCanvas) return true;\n if (typeof ReadableStream !== 'undefined' && value instanceof ReadableStream) return true;\n if (typeof WritableStream !== 'undefined' && value instanceof WritableStream) return true;\n if (typeof TransformStream !== 'undefined' && value instanceof TransformStream) return true;\n return false;\n}\n\n/**\n * Recursively finds all transferable objects in a value.\n * \n * @param {*} value - Value to search.\n * @param {Set<Transferable>} [found] - Set to collect transferables.\n * @returns {Transferable[]} Array of transferables found.\n */\nfunction findTransferables(value, found = new Set()) {\n if (value === null || value === undefined) return Array.from(found);\n\n if (isTransferable(value)) {\n found.add(value);\n return Array.from(found);\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n findTransferables(item, found);\n }\n } else if (typeof value === 'object') {\n for (const key of Object.keys(value)) {\n findTransferables(value[key], found);\n }\n }\n\n return Array.from(found);\n}\n\n/**\n * @fileoverview Protocol message schemas for CrossBus.\n * All message types are frozen for immutability.\n * @module core/message-types\n */\n\n\n// PROTOCOL_PREFIX and PROTOCOL_VERSION are imported from common/types.js\n\n/**\n * Creates a protocol message envelope.\n * \n * @param {MessageType} type - Message type.\n * @param {Object} payload - Message payload.\n * @param {Object} [meta={}] - Additional metadata.\n * @param {string|null} [id=null] - Optional custom message ID.\n * @returns {ProtocolMessage} Frozen message object.\n * \n * @typedef {Object} ProtocolMessage\n * @property {number} _cb - Protocol marker version (compact wire format).\n * @property {number} version - Protocol version.\n * @property {string} id - Unique message ID (UUID v4).\n * @property {MessageType} type - Message type.\n * @property {number} timestamp - Unix timestamp (ms).\n * @property {Object} payload - Message payload.\n * @property {Object} meta - Additional metadata.\n */\nfunction createMessage(type, payload, meta = {}, id = null) {\n return Object.freeze({\n [PROTOCOL_MARKER]: PROTOCOL_VERSION,\n version: PROTOCOL_VERSION,\n id: id || crypto.randomUUID(),\n type,\n timestamp: Date.now(),\n payload: Object.freeze({ ...payload }),\n meta: Object.freeze({ ...meta })\n });\n}\n\n/**\n * Creates a signal message.\n * \n * @param {string} name - Signal name.\n * @param {*} data - Signal data.\n * @param {string} sourcePeerId - Source peer ID.\n * @param {string|null} [destPeerId] - Destination peer ID.\n * @returns {ProtocolMessage} Signal message.\n */\nfunction createSignalMessage(name, data, sourcePeerId, destPeerId = null) {\n return createMessage(MessageType.SIGNAL, {\n name,\n data,\n source: sourcePeerId,\n dest: destPeerId\n });\n}\n\n/**\n * Creates a request message (expecting response).\n * \n * @param {string} name - Request name.\n * @param {*} data - Request data.\n * @param {string} sourcePeerId - Source peer ID.\n * @param {string} destPeerId - Destination peer ID.\n * @param {string|null} [id=null] - Optional custom request ID.\n * @returns {ProtocolMessage} Request message.\n */\nfunction createRequestMessage(name, data, sourcePeerId, destPeerId, id = null) {\n return createMessage(MessageType.REQUEST, {\n name,\n data,\n source: sourcePeerId,\n dest: destPeerId\n }, {}, id);\n}\n\n/**\n * Creates a response message.\n * \n * @param {string} requestId - Original request message ID.\n * @param {*} data - Response data.\n * @param {string} sourcePeerId - Source peer ID.\n * @param {boolean} [success=true] - Whether request succeeded.\n * @param {Object|null} [error] - Error object if failed.\n * @returns {ProtocolMessage} Response message.\n */\nfunction createResponseMessage(requestId, data, sourcePeerId, success = true, error = null) {\n return createMessage(MessageType.RESPONSE, {\n requestId,\n data,\n source: sourcePeerId,\n success,\n error\n });\n}\n\n/**\n * @fileoverview Centralized error handling for CrossBus.\n * @module common/errors\n */\n\n/**\n * Error codes for CrossBus.\n * @readonly\n * @enum {string}\n */\nconst ErrorCode = Object.freeze({\n // Connection errors\n HANDSHAKE_TIMEOUT: 'ERR_HANDSHAKE_TIMEOUT',\n HANDSHAKE_REJECTED: 'ERR_HANDSHAKE_REJECTED',\n ORIGIN_FORBIDDEN: 'ERR_ORIGIN_FORBIDDEN',\n PEER_EXISTS: 'ERR_PEER_EXISTS',\n PEER_NOT_FOUND: 'ERR_PEER_NOT_FOUND',\n PEER_DISCONNECTED: 'ERR_PEER_DISCONNECTED',\n RECONNECT_FAILED: 'ERR_RECONNECT_FAILED',\n UNSUPPORTED: 'ERR_UNSUPPORTED',\n NOT_CONNECTED: 'ERR_NOT_CONNECTED',\n\n // Message errors\n ACK_TIMEOUT: 'ERR_ACK_TIMEOUT',\n RESPONSE_TIMEOUT: 'ERR_RESPONSE_TIMEOUT',\n QUEUE_FULL: 'ERR_QUEUE_FULL',\n INVALID_MESSAGE: 'ERR_INVALID_MESSAGE',\n VERSION_MISMATCH: 'ERR_VERSION_MISMATCH',\n CLONE_ERROR: 'ERR_CLONE_ERROR',\n TRANSFER_ERROR: 'ERR_TRANSFER_ERROR',\n MESSAGE_TOO_LARGE: 'ERR_MESSAGE_TOO_LARGE',\n\n // Routing errors\n UNREACHABLE: 'ERR_UNREACHABLE',\n TTL_EXCEEDED: 'ERR_TTL_EXCEEDED',\n NO_ROUTE: 'ERR_NO_ROUTE',\n\n // Handler errors\n NO_HANDLER: 'ERR_NO_HANDLER',\n HANDLER_ERROR: 'ERR_HANDLER_ERROR',\n HANDLER_TIMEOUT: 'ERR_HANDLER_TIMEOUT',\n HANDLER_EXISTS: 'ERR_HANDLER_EXISTS',\n SEND_FAILED: 'ERR_SEND_FAILED',\n\n // Channel errors\n CHANNEL_FAILED: 'ERR_CHANNEL_FAILED',\n CHANNEL_CLOSED: 'ERR_CHANNEL_CLOSED',\n\n // Resource errors\n MAX_PEERS: 'ERR_MAX_PEERS',\n MAX_PENDING: 'ERR_MAX_PENDING',\n DESTROYED: 'ERR_DESTROYED',\n\n // Circuit Breaker\n CIRCUIT_OPEN: 'ERR_CIRCUIT_OPEN',\n\n // Security errors\n PAYLOAD_TOO_LARGE: 'ERR_PAYLOAD_TOO_LARGE',\n RATE_LIMITED: 'ERR_RATE_LIMITED',\n UNAUTHORIZED: 'ERR_UNAUTHORIZED',\n INVALID_PAYLOAD: 'ERR_INVALID_PAYLOAD'\n});\n\n/**\n * Error metadata including default messages, retryability, and AI-friendly suggestions.\n * @type {Object<ErrorCode, {message: string, retryable: boolean, suggestion: string}>}\n */\nconst ERROR_META = Object.freeze({\n [ErrorCode.HANDSHAKE_TIMEOUT]: {\n message: 'Handshake timed out',\n retryable: true,\n suggestion: 'Increase timeout or check if target is loaded. Use iframe.onload before connecting.'\n },\n [ErrorCode.HANDSHAKE_REJECTED]: {\n message: 'Handshake rejected by peer',\n retryable: false,\n suggestion: 'Check targetOrigin matches the peer\\'s origin. Verify peer allows your origin.'\n },\n [ErrorCode.ORIGIN_FORBIDDEN]: {\n message: 'Origin not in allowed origins list',\n retryable: false,\n suggestion: 'Add your origin to allowedOrigins option or use targetOrigin: \"*\" for development.'\n },\n [ErrorCode.PEER_EXISTS]: {\n message: 'Peer with this ID already exists',\n retryable: false,\n suggestion: 'Use unique peerId for each context. Try: peerId: `agent-${Date.now()}`'\n },\n [ErrorCode.PEER_NOT_FOUND]: {\n message: 'Peer not found',\n retryable: false,\n suggestion: 'Check if peer is connected using bus.peers. Wait for peer connection before request.'\n },\n [ErrorCode.PEER_DISCONNECTED]: {\n message: 'Peer is disconnected',\n retryable: true,\n suggestion: 'Wait for peer to reconnect. Listen for \"peer:join\" event before retry.'\n },\n [ErrorCode.RECONNECT_FAILED]: {\n message: 'Max reconnection attempts reached',\n retryable: false,\n suggestion: 'Check network connectivity. Consider increasing maxRetries option.'\n },\n [ErrorCode.UNSUPPORTED]: {\n message: 'Operation not supported by this environment',\n retryable: false,\n suggestion: 'This feature requires a browser environment. Check for feature availability first.'\n },\n [ErrorCode.NOT_CONNECTED]: {\n message: 'Transport is not connected',\n retryable: true,\n suggestion: 'Call addTransport() and wait for connection before sending messages.'\n },\n [ErrorCode.ACK_TIMEOUT]: {\n message: 'ACK not received within timeout',\n retryable: true,\n suggestion: 'Increase ackTimeout option or check peer availability.'\n },\n [ErrorCode.RESPONSE_TIMEOUT]: {\n message: 'Response not received within timeout',\n retryable: true,\n suggestion: 'Increase timeout in request options: { timeout: 10000 }. Check if handler exists on peer.'\n },\n [ErrorCode.QUEUE_FULL]: {\n message: 'Message queue is full',\n retryable: false,\n suggestion: 'Increase maxQueueSize or wait for queue to drain. Consider using batching plugin.'\n },\n [ErrorCode.INVALID_MESSAGE]: {\n message: 'Invalid message format',\n retryable: false,\n suggestion: 'Ensure message data is JSON-serializable. Avoid DOM nodes and functions.'\n },\n [ErrorCode.VERSION_MISMATCH]: {\n message: 'Protocol version mismatch',\n retryable: false,\n suggestion: 'Update CrossBus to same version on both sides.'\n },\n [ErrorCode.CLONE_ERROR]: {\n message: 'Data cannot be cloned (contains functions or DOM nodes)',\n retryable: false,\n suggestion: 'Remove functions, DOM nodes, and circular references from message data.'\n },\n [ErrorCode.TRANSFER_ERROR]: {\n message: 'Failed to transfer object ownership',\n retryable: false,\n suggestion: 'Ensure ArrayBuffers are not detached. Each buffer can only be transferred once.'\n },\n [ErrorCode.MESSAGE_TOO_LARGE]: {\n message: 'Message exceeds maximum size',\n retryable: false,\n suggestion: 'Use streaming for large payloads or increase maxMessageSize option.'\n },\n [ErrorCode.UNREACHABLE]: {\n message: 'Destination peer is unreachable',\n retryable: true,\n suggestion: 'Check if peer is still connected. Use bus.peers to list available peers.'\n },\n [ErrorCode.TTL_EXCEEDED]: {\n message: 'Message TTL exceeded (possible routing loop)',\n retryable: false,\n suggestion: 'Check for circular transport configurations. Increase maxTTL if needed.'\n },\n [ErrorCode.NO_ROUTE]: {\n message: 'No route to destination',\n retryable: false,\n suggestion: 'Add transport connecting to target peer. Set isHub: true on orchestrator.'\n },\n [ErrorCode.NO_HANDLER]: {\n message: 'No handler registered for this request',\n retryable: false,\n suggestion: 'Register handler on target: bus.handle(\"handlerName\", fn). Check handler name spelling.'\n },\n [ErrorCode.HANDLER_ERROR]: {\n message: 'Handler threw an exception',\n retryable: false,\n suggestion: 'Check target peer logs for error. Wrap handler in try/catch.'\n },\n [ErrorCode.HANDLER_TIMEOUT]: {\n message: 'Handler did not respond within timeout',\n retryable: true,\n suggestion: 'Handler is slow. Increase timeout or optimize handler performance.'\n },\n [ErrorCode.HANDLER_EXISTS]: {\n message: 'Handler already registered with this name',\n retryable: false,\n suggestion: 'Use different handler name or call bus.removeHandler() first.'\n },\n [ErrorCode.SEND_FAILED]: {\n message: 'Failed to send message to peer',\n retryable: true,\n suggestion: 'Check transport status. Target window may be closed or blocked.'\n },\n [ErrorCode.CHANNEL_FAILED]: {\n message: 'Failed to create direct channel',\n retryable: true,\n suggestion: 'Check browser support for MessageChannel. Retry after short delay.'\n },\n [ErrorCode.CHANNEL_CLOSED]: {\n message: 'Channel was closed unexpectedly',\n retryable: false,\n suggestion: 'Target context was destroyed. Check if iframe/worker still exists.'\n },\n [ErrorCode.MAX_PEERS]: {\n message: 'Maximum number of peers reached',\n retryable: false,\n suggestion: 'Increase maxPeers option or disconnect unused peers first.'\n },\n [ErrorCode.MAX_PENDING]: {\n message: 'Maximum pending requests reached',\n retryable: false,\n suggestion: 'Wait for pending requests to complete. Increase maxPendingRequests option.'\n },\n [ErrorCode.DESTROYED]: {\n message: 'CrossBus instance has been destroyed',\n retryable: false,\n suggestion: 'Create new CrossBus instance. Do not use bus after calling destroy().'\n },\n [ErrorCode.CIRCUIT_OPEN]: {\n message: 'Circuit breaker is open',\n retryable: false,\n suggestion: 'Too many failures. Wait for circuit to reset or call circuit.reset().'\n },\n [ErrorCode.PAYLOAD_TOO_LARGE]: {\n message: 'Payload exceeds maximum allowed size',\n retryable: false,\n suggestion: 'Reduce payload size or increase maxPayloadSize option. Consider using streaming for large data.'\n },\n [ErrorCode.RATE_LIMITED]: {\n message: 'Request rate limit exceeded',\n retryable: true,\n suggestion: 'Wait before retrying. Consider adding delay or using exponential backoff.'\n },\n [ErrorCode.UNAUTHORIZED]: {\n message: 'Peer is not authorized to call this handler',\n retryable: false,\n suggestion: 'Add peer to handler allowedPeers list or remove peer restrictions.'\n },\n [ErrorCode.INVALID_PAYLOAD]: {\n message: 'Payload validation failed',\n retryable: false,\n suggestion: 'Check payload structure against handler requirements.'\n }\n});\n\n/**\n * Custom error class for CrossBus.\n * \n * @extends Error\n * \n * @example\n * try {\n * await bus.emit('msg', data, 'unknown-peer');\n * } catch (err) {\n * if (err instanceof CrossBusError) {\n * console.log(err.code); // 'ERR_PEER_NOT_FOUND'\n * console.log(err.message); // 'Peer not found'\n * console.log(err.details); // { peerId: 'unknown-peer' }\n * console.log(err.retryable); // false\n * }\n * }\n */\nclass CrossBusError extends Error {\n /**\n * Error code.\n * @type {ErrorCode}\n */\n code;\n\n /**\n * Additional error context.\n * @type {Object}\n */\n details;\n\n /**\n * Whether the operation can be retried.\n * @type {boolean}\n */\n retryable;\n\n /**\n * Original error that caused this error.\n * @type {Error|undefined}\n */\n cause;\n\n /**\n * Timestamp when error occurred.\n * @type {number}\n */\n timestamp;\n\n /**\n * Creates a new CrossBusError.\n * \n * @param {ErrorCode} code - Error code.\n * @param {string} [message] - Custom message (uses default if omitted).\n * @param {Object} [options] - Additional options.\n * @param {Object} [options.details={}] - Error context.\n * @param {boolean} [options.retryable] - Override default retryable.\n * @param {Error} [options.cause] - Original error.\n */\n constructor(code, message, options = {}) {\n const meta = ERROR_META[code] ?? { message: 'Unknown error', retryable: false };\n super(message ?? meta.message);\n\n this.name = 'CrossBusError';\n this.code = code;\n this.details = options.details ?? {};\n this.retryable = options.retryable ?? meta.retryable;\n this.cause = options.cause;\n this.timestamp = Date.now();\n\n // Maintain proper stack trace in V8\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, CrossBusError);\n }\n }\n\n /**\n * Creates error from code with default message.\n * \n * @param {ErrorCode} code - Error code.\n * @param {Object} [details] - Error context.\n * @returns {CrossBusError}\n */\n static from(code, details = {}) {\n return new CrossBusError(code, undefined, { details });\n }\n\n /**\n * Creates error from another error.\n * \n * @param {ErrorCode} code - Error code.\n * @param {Error} cause - Original error.\n * @param {Object} [details] - Additional context.\n * @returns {CrossBusError}\n */\n static wrap(code, cause, details = {}) {\n return new CrossBusError(code, cause.message, { cause, details });\n }\n\n /**\n * Converts error to JSON-serializable object.\n * @returns {Object}\n */\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n details: this.details,\n retryable: this.retryable,\n timestamp: this.timestamp\n };\n }\n\n /**\n * String representation.\n * @returns {string}\n */\n toString() {\n return `${this.name} [${this.code}]: ${this.message}`;\n }\n}\n\n/**\n * Checks if an error is a CrossBusError.\n * \n * @param {*} err - Value to check.\n * @returns {boolean}\n */\nfunction isCrossBusError(err) {\n return err instanceof CrossBusError;\n}\n\n/**\n * Checks if an error is retryable.\n * \n * @param {Error} err - Error to check.\n * @returns {boolean}\n */\nfunction isRetryable(err) {\n if (err instanceof CrossBusError) {\n return err.retryable;\n }\n return false;\n}\n\n/**\n * @fileoverview Utility functions shared across modules.\n * @module common/utils\n */\n\n/**\n * Generates a UUID v4.\n * Uses crypto.randomUUID() when available, falls back to manual generation.\n * \n * @returns {string} UUID v4 string.\n */\nfunction uuid() {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n // Fallback for older browsers\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n}\n\n/**\n * Checks if data can be structured cloned.\n * \n * @param {*} data - Data to check.\n * @returns {boolean} True if cloneable.\n */\nfunction isCloneable(data) {\n if (data === null || data === undefined) return true;\n\n const type = typeof data;\n\n // Primitives are always cloneable\n if (type === 'boolean' || type === 'number' || type === 'string') {\n return true;\n }\n\n // Functions and symbols are not cloneable\n if (type === 'function' || type === 'symbol') {\n return false;\n }\n\n // Check for DOM nodes\n if (typeof Node !== 'undefined' && data instanceof Node) {\n return false;\n }\n\n // Check for WeakMap/WeakSet\n if (data instanceof WeakMap || data instanceof WeakSet) {\n return false;\n }\n\n // For objects/arrays, we'd need to recursively check\n // For performance, we assume they're cloneable and let postMessage fail\n return true;\n}\n\n/**\n * Creates a deferred promise (Promise.withResolvers polyfill).\n * Uses native Promise.withResolvers() when available (ES2024+).\n * \n * @template T\n * @returns {{promise: Promise<T>, resolve: (value: T) => void, reject: (reason: any) => void}}\n */\nfunction deferred() {\n // Use native Promise.withResolvers if available (ES2024+, ~10x faster)\n // @ts-ignore\n if (typeof Promise.withResolvers === 'function') {\n // @ts-ignore\n return Promise.withResolvers();\n }\n // Fallback for older engines\n let resolve, reject;\n const promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n // @ts-ignore\n return { promise, resolve, reject };\n}\n\n/**\n * Creates a promise that resolves after a timeout.\n * \n * @param {number} ms - Timeout in milliseconds.\n * @param {AbortSignal} [signal] - Optional abort signal.\n * @returns {Promise<void>}\n */\nfunction sleep(ms, signal) {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason ?? new Error('Aborted'));\n return;\n }\n\n const timeoutId = setTimeout(resolve, ms);\n\n if (signal) {\n signal.addEventListener('abort', () => {\n clearTimeout(timeoutId);\n reject(signal.reason ?? new Error('Aborted'));\n }, { once: true });\n }\n });\n}\n\n/**\n * Creates a promise that rejects after a timeout.\n * \n * @template T\n * @param {Promise<T>} promise - Promise to race against.\n * @param {number} ms - Timeout in milliseconds.\n * @param {string} [message='Operation timed out'] - Timeout error message.\n * @returns {Promise<T>}\n */\nfunction withTimeout(promise, ms, message = 'Operation timed out') {\n return Promise.race([\n promise,\n new Promise((_, reject) => {\n setTimeout(() => reject(new Error(message)), ms);\n })\n ]);\n}\n\n\n\n/**\n * Detects the type of a peer target.\n * \n * @param {*} target - Target to check.\n * @returns {'iframe'|'worker'|'sw'|'window'|'port'|'unknown'}\n */\nfunction detectPeerType(target) {\n // MessagePort\n if (target instanceof MessagePort) {\n return 'port';\n }\n\n // Worker\n if (typeof Worker !== 'undefined' && target instanceof Worker) {\n return 'worker';\n }\n\n // ServiceWorker\n if (typeof ServiceWorker !== 'undefined' && target instanceof ServiceWorker) {\n return 'sw';\n }\n\n // Window (iframe or popup)\n if (typeof Window !== 'undefined' && target instanceof Window) {\n return 'window';\n }\n\n // HTMLIFrameElement\n if (typeof HTMLIFrameElement !== 'undefined' && target instanceof HTMLIFrameElement) {\n return 'iframe';\n }\n\n // DedicatedWorkerGlobalScope (inside worker)\n if (typeof DedicatedWorkerGlobalScope !== 'undefined' &&\n target instanceof DedicatedWorkerGlobalScope) {\n return 'worker';\n }\n\n return 'unknown';\n}\n\n\n\n/**\n * Creates a frozen timestamp object.\n * \n * @returns {{timestamp: number, iso: string}}\n */\nfunction timestamp() {\n const ts = Date.now();\n return Object.freeze({\n timestamp: ts,\n iso: new Date(ts).toISOString()\n });\n}\n\n/**\n * @fileoverview Message router for hub-based routing.\n * Routes messages between peers through a central hub.\n * @module router/message-router\n */\n\n\n/**\n * @typedef {Object} RoutingEntry\n * @property {string} peerId - Peer identifier.\n * @property {Function} sendFn - Function to send to this peer.\n * @property {Object} meta - Peer metadata.\n * @property {string} origin - Peer origin.\n * @property {PeerStatus} status - Connection status.\n * @property {number} connectedAt - Connection timestamp.\n */\n\n/**\n * @typedef {Object} RouteResult\n * @property {boolean} success - Whether routing succeeded.\n * @property {number} delivered - Number of peers message was delivered to.\n * @property {string[]} failed - Peer IDs that failed delivery.\n */\n\n/**\n * Message router for hub-based communication pattern.\n * \n * In hub mode, all messages flow through a central router which:\n * - Maintains peer registry\n * - Routes unicast messages to specific peers\n * - Broadcasts messages to all/selected peers\n * - Tracks message delivery\n * \n * Performance optimizations:\n * - Object-based cache for fast peer lookup (faster than Map.get)\n * - Direct sendFn cache to avoid property indirection\n * - Unrolled loops for common broadcast patterns\n * \n * @example\n * const router = new MessageRouter();\n * \n * // Register peers\n * router.addPeer('widget-1', (msg) => iframe1.postMessage(msg));\n * router.addPeer('widget-2', (msg) => iframe2.postMessage(msg));\n * \n * // Route unicast\n * router.route({ target: 'widget-1', payload: data });\n * \n * // Route broadcast\n * router.broadcast({ payload: data });\n */\nclass MessageRouter extends EventEmitter {\n /** @type {Map<string, RoutingEntry>} Full feature storage */\n #peers = new Map();\n\n /** @type {number} */\n #messageSeq = 0;\n\n /** @type {Map<string, number>} Per-peer sequence numbers */\n #peerSeq = new Map();\n\n /** @type {Object<string, RoutingEntry>} Fast Object-based cache for peer lookup */\n #peerCache = Object.create(null);\n\n /** @type {Object<string, Function>} Fast Object-based cache for sendFn direct access */\n #sendFnCache = Object.create(null);\n\n /** @type {string[]} Cached peer IDs array for fast iteration */\n #peerIds = [];\n\n /**\n * Creates a new message router.\n */\n constructor() {\n super();\n }\n\n /**\n * Adds a peer to the routing table.\n * \n * @param {string} peerId - Unique peer identifier.\n * @param {EventListener} sendFn - Function to send messages to peer.\n * @param {Object} [options={}] - Additional options.\n * @param {Object} [options.meta={}] - Peer metadata.\n * @param {string} [options.origin='unknown'] - Peer origin.\n * @throws {CrossBusError} If peer already exists.\n * \n * @example\n * router.addPeer('iframe-widget', (msg) => {\n * iframe.contentWindow.postMessage(msg, '*');\n * }, { meta: { type: 'widget' } });\n */\n addPeer(peerId, sendFn, options = {}) {\n if (this.#peers.has(peerId)) {\n throw CrossBusError.from(ErrorCode.PEER_EXISTS, { peerId });\n }\n\n if (typeof sendFn !== 'function') {\n throw new TypeError('sendFn must be a function');\n }\n\n /** @type {RoutingEntry} */\n const entry = {\n peerId,\n sendFn,\n meta: options.meta ?? {},\n origin: options.origin ?? 'unknown',\n status: PeerStatus.CONNECTED,\n connectedAt: Date.now()\n };\n\n // Full feature storage\n this.#peers.set(peerId, entry);\n this.#peerSeq.set(peerId, 0);\n\n // Sync fast caches for O(1) lookup\n this.#peerCache[peerId] = entry;\n this.#sendFnCache[peerId] = sendFn;\n this.#peerIds.push(peerId);\n\n // Emit peer added event\n this.emit('peer:added', { peerId, meta: entry.meta });\n }\n\n /**\n * Removes a peer from the routing table.\n * \n * @param {string} peerId - Peer to remove.\n * @returns {boolean} True if peer was removed.\n */\n removePeer(peerId) {\n const peer = this.#peerCache[peerId];\n if (!peer) return false;\n\n // Full storage cleanup\n this.#peers.delete(peerId);\n this.#peerSeq.delete(peerId);\n\n // Sync fast caches\n delete this.#peerCache[peerId];\n delete this.#sendFnCache[peerId];\n const idx = this.#peerIds.indexOf(peerId);\n if (idx !== -1) this.#peerIds.splice(idx, 1);\n\n // Emit peer removed event\n this.emit('peer:removed', { peerId, meta: peer.meta });\n\n return true;\n }\n\n /**\n * Gets a peer by ID.\n * \n * @param {string} peerId\n * @returns {RoutingEntry|undefined}\n */\n getPeer(peerId) {\n // Fast Object-based lookup (faster than Map.get)\n return this.#peerCache[peerId];\n }\n\n /**\n * Gets all connected peer IDs.\n * \n * @returns {string[]}\n */\n getPeerIds() {\n // Return cached array (avoids Array.from overhead)\n return this.#peerIds.slice();\n }\n\n /**\n * Gets count of connected peers.\n * \n * @returns {number}\n */\n get peerCount() {\n return this.#peers.size;\n }\n\n /**\n * Routes a message to a specific peer or broadcasts.\n * \n * @param {Object} message - Message to route.\n * @param {string} [message.target] - Target peer ID (omit for broadcast).\n * @param {Object} message.payload - Message payload.\n * @param {Object} [options] - Broadcast options\n * @param {string[]} [options.exclude] - Peer IDs to exclude from broadcast.\n * @returns {RouteResult}\n */\n route(message, options = {}) {\n const { target, payload } = message;\n\n if (target) {\n // Unicast to specific peer\n return this.#routeUnicast(target, payload);\n } else {\n // Broadcast to all peers - lazy Set creation\n const excludeArr = options.exclude;\n const exclude = excludeArr?.length ? new Set(excludeArr) : null;\n return this.#routeBroadcast(payload, exclude);\n }\n }\n\n /**\n * Broadcasts a message to all peers.\n * \n * @param {Object} payload - Message payload.\n * @param {Object} [options={}] - Broadcast options.\n * @param {string[]} [options.exclude] - Peers to exclude.\n * @param {string[]} [options.include] - Only include these peers.\n * @returns {RouteResult}\n */\n broadcast(payload, options = {}) {\n // Lazy Set creation - skip allocation when not needed\n const excludeArr = options.exclude;\n const exclude = excludeArr?.length ? new Set(excludeArr) : null;\n const includeArr = options.include;\n const include = includeArr?.length ? new Set(includeArr) : null;\n\n let delivered = 0;\n const failed = [];\n\n for (const [peerId, peer] of this.#peers) {\n // Skip excluded peers\n if (exclude?.has(peerId)) continue;\n\n // Skip if not in include list (when specified)\n if (include && !include.has(peerId)) continue;\n\n // Skip disconnected peers\n if (peer.status !== PeerStatus.CONNECTED) continue;\n\n try {\n const envelope = this.#createEnvelope(peerId, payload, MessageType.BROADCAST);\n peer.sendFn(envelope);\n delivered++;\n } catch (error) {\n console.error(`[Router] Failed to send to ${peerId}:`, error);\n failed.push(peerId);\n }\n }\n\n return { success: failed.length === 0, delivered, failed };\n }\n\n /**\n * Gets the next sequence number for a peer.\n * Used for causal ordering in SignalStore.\n * \n * @param {string} peerId\n * @returns {number}\n */\n getSequence(peerId) {\n return this.#peerSeq.get(peerId) ?? 0;\n }\n\n /**\n * Updates peer status.\n * \n * @param {string} peerId\n * @param {PeerStatus} status\n */\n setPeerStatus(peerId, status) {\n const peer = this.#peerCache[peerId];\n if (peer) {\n peer.status = status;\n this.emit('peer:status', { peerId, status });\n }\n }\n\n /**\n * Clears all peers.\n */\n clearPeers() {\n // Fast iteration using cached array\n const peerIds = this.#peerIds.slice();\n for (const peerId of peerIds) {\n this.removePeer(peerId);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Private methods\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Routes to a single peer.\n * \n */\n #routeUnicast(peerId, payload) {\n const peer = this.#peerCache[peerId];\n\n if (!peer) {\n return {\n success: false,\n delivered: 0,\n failed: [peerId],\n error: ErrorCode.PEER_NOT_FOUND\n };\n }\n\n if (peer.status !== PeerStatus.CONNECTED) {\n return {\n success: false,\n delivered: 0,\n failed: [peerId],\n error: ErrorCode.PEER_DISCONNECTED\n };\n }\n\n try {\n // If payload is already a protocol message (has the marker), send directly\n // Otherwise wrap in envelope for signals/broadcasts\n const messageToSend = (payload && payload._cb)\n ? payload\n : this.#createEnvelope(peerId, payload, MessageType.SIGNAL);\n peer.sendFn(messageToSend);\n return { success: true, delivered: 1, failed: [] };\n } catch (error) {\n console.error(`[Router] Failed to send to ${peerId}:`, error);\n return { success: false, delivered: 0, failed: [peerId] };\n }\n }\n\n /**\n * Broadcasts to multiple peers.\n * \n */\n #routeBroadcast(payload, exclude) {\n // exclude is already a Set or null from route()\n return this.broadcast(payload, exclude ? { exclude: Array.from(exclude) } : {});\n }\n\n /**\n * Creates a message envelope with routing info.\n * \n */\n #createEnvelope(peerId, payload, type) {\n // Increment per-peer sequence\n const seq = (this.#peerSeq.get(peerId) ?? 0) + 1;\n this.#peerSeq.set(peerId, seq);\n\n return {\n id: `msg_${++this.#messageSeq}`,\n t: type,\n ts: Date.now(),\n seq,\n p: payload\n };\n }\n}\n\n/**\n * @fileoverview Pending requests tracker for request/response pattern.\n * Tracks outgoing requests and matches them with responses.\n * @module router/pending-requests\n */\n\n\n/**\n * @typedef {Object} PendingRequest\n * @property {string} id - Request ID.\n * @property {string} targetPeer - Target peer ID.\n * @property {string} handlerName - Name of the handler.\n * @property {number} createdAt - When request was created.\n * @property {number} timeout - Timeout in ms.\n * @property {Function} resolve - Promise resolve function.\n * @property {Function} reject - Promise reject function.\n * @property {*} [defaultValue] - Value to return on timeout.\n */\n\n/**\n * @typedef {Object} RequestOptions\n * @property {number} [timeout=30000] - Request timeout in ms.\n * @property {*} [defaultValue] - Value to return on timeout instead of throwing.\n */\n\n/**\n * @typedef {Object} ResponseData\n * @property {string} requestId - Original request ID.\n * @property {boolean} success - Whether handler succeeded.\n * @property {*} [data] - Response data if successful.\n * @property {Object} [error] - Error if failed.\n */\n\n/**\n * Tracks pending requests and matches responses.\n * \n * Supports:\n * - Timeout handling\n * - Automatic cleanup\n * - Error propagation\n * - Request cancellation\n * \n * @example\n * const tracker = new PendingRequests();\n * \n * // Create request\n * const { requestId, promise } = tracker.create('peer-1', 'getData', {\n * timeout: 5000\n * });\n * \n * // Send request via transport...\n * transport.send({ id: requestId, type: 'request', handler: 'getData' });\n * \n * // When response arrives:\n * tracker.resolve(requestId, responseData);\n * \n * // Or wait for response:\n * const result = await promise;\n */\nclass PendingRequests {\n /** @type {Map<string, PendingRequest>} Full feature storage */\n #pending = new Map();\n\n /** @type {Object<string, PendingRequest>} Fast Object-based cache for lookup */\n #cache = Object.create(null);\n\n /** @type {number} */\n #requestCounter = 0;\n\n /** @type {number} Default timeout */\n #defaultTimeout;\n\n /** @type {number} Maximum pending requests */\n #maxPending;\n\n /**\n * Creates a new pending requests tracker.\n * \n * @param {Object} [options={}]\n * @param {number} [options.defaultTimeout=30000] - Default timeout in ms.\n * @param {number} [options.maxPending=1000] - Maximum pending requests (0 = unlimited).\n */\n constructor(options = {}) {\n this.#defaultTimeout = options.defaultTimeout ?? 30000;\n this.#maxPending = options.maxPending ?? 1000;\n }\n\n /**\n * Creates a new pending request.\n * \n * @param {string} targetPeer - Target peer ID.\n * @param {string} handlerName - Name of the handler to invoke.\n * @param {RequestOptions} [options={}] - Request options.\n * @returns {{ requestId: string, promise: Promise<*> }}\n * \n * @example\n * const { requestId, promise } = tracker.create('widget', 'getState');\n * const result = await promise;\n */\n create(targetPeer, handlerName, options = {}) {\n // Enforce max pending limit to prevent memory exhaustion\n if (this.#maxPending > 0 && this.#pending.size >= this.#maxPending) {\n throw CrossBusError.from(ErrorCode.MAX_PENDING, {\n current: this.#pending.size,\n max: this.#maxPending,\n targetPeer,\n handlerName\n });\n }\n\n const now = Date.now();\n const requestId = `req_${++this.#requestCounter}_${now}`;\n const timeout = options.timeout ?? this.#defaultTimeout;\n const { promise, resolve, reject } = deferred();\n\n /** @type {PendingRequest} */\n const pending = {\n id: requestId,\n targetPeer,\n handlerName,\n createdAt: now,\n timeout,\n resolve,\n reject,\n defaultValue: options.defaultValue\n };\n\n this.#pending.set(requestId, pending);\n this.#cache[requestId] = pending; // Sync fast cache\n\n // Set up timeout\n const timeoutPromise = withTimeout(promise, timeout).catch(error => {\n // Cleanup on timeout - use cache for fast check\n if (requestId in this.#cache) {\n this.#pending.delete(requestId);\n delete this.#cache[requestId];\n\n // Return default value if provided\n if ('defaultValue' in options) {\n return options.defaultValue;\n }\n\n throw CrossBusError.from(ErrorCode.RESPONSE_TIMEOUT, {\n requestId,\n targetPeer,\n handlerName,\n timeout\n });\n }\n throw error;\n });\n\n return { requestId, promise: timeoutPromise };\n }\n\n /**\n * Resolves a pending request with response data.\n * \n * @param {string} requestId - Request ID to resolve.\n * @param {ResponseData} response - Response data.\n * @returns {boolean} True if request was found and resolved.\n */\n resolve(requestId, response) {\n const pending = this.#cache[requestId];\n if (!pending) return false;\n\n // Sync both storages\n this.#pending.delete(requestId);\n delete this.#cache[requestId];\n\n if (response.success) {\n pending.resolve(response.data);\n } else {\n const error = CrossBusError.from(\n response.error?.code ?? ErrorCode.HANDLER_ERROR,\n {\n requestId,\n targetPeer: pending.targetPeer,\n handlerName: pending.handlerName,\n originalError: response.error\n }\n );\n error.message = response.error?.message ?? 'Handler error';\n pending.reject(error);\n }\n\n return true;\n }\n\n /**\n * Rejects a pending request with an error.\n * \n * @param {string} requestId - Request ID to reject.\n * @param {Error|string} error - Error or error message.\n * @returns {boolean} True if request was found and rejected.\n */\n reject(requestId, error) {\n const pending = this.#cache[requestId];\n if (!pending) return false;\n\n // Sync both storages\n this.#pending.delete(requestId);\n delete this.#cache[requestId];\n\n const err = error instanceof Error ? error : new Error(error);\n pending.reject(err);\n\n return true;\n }\n\n /**\n * Cancels a pending request.\n * \n * @param {string} requestId - Request ID to cancel.\n * @returns {boolean} True if request was found and cancelled.\n */\n cancel(requestId) {\n const pending = this.#cache[requestId];\n if (!pending) return false;\n\n // Sync both storages\n this.#pending.delete(requestId);\n delete this.#cache[requestId];\n pending.reject(new Error('Request cancelled'));\n\n return true;\n }\n\n /**\n * Cancels all pending requests for a peer.\n * Used when peer disconnects.\n * \n * @param {string} peerId - Peer ID.\n * @returns {number} Number of requests cancelled.\n */\n cancelForPeer(peerId) {\n let count = 0;\n\n for (const [requestId, pending] of this.#pending) {\n if (pending.targetPeer === peerId) {\n this.#pending.delete(requestId);\n delete this.#cache[requestId]; // Sync cache\n pending.reject(CrossBusError.from(ErrorCode.PEER_DISCONNECTED, {\n peerId,\n requestId\n }));\n count++;\n }\n }\n\n return count;\n }\n\n /**\n * Cancels all pending requests.\n * \n * @returns {number} Number of requests cancelled.\n */\n cancelAll() {\n const count = this.#pending.size;\n\n for (const [requestId, pending] of this.#pending) {\n pending.reject(new Error('All requests cancelled'));\n }\n\n this.#pending.clear();\n // Reset cache to empty object\n for (const key in this.#cache) {\n delete this.#cache[key];\n }\n return count;\n }\n\n /**\n * Checks if a request is pending.\n * \n * @param {string} requestId\n * @returns {boolean}\n */\n has(requestId) {\n // Fast Object-based check (faster than Map.has)\n return requestId in this.#cache;\n }\n\n /**\n * Gets a pending request.\n * \n * @param {string} requestId\n * @returns {PendingRequest|undefined}\n */\n get(requestId) {\n // Fast Object-based lookup\n return this.#cache[requestId];\n }\n\n /**\n * Gets count of pending requests.\n * @returns {number}\n */\n get size() {\n return this.#pending.size;\n }\n\n /**\n * Gets all pending request IDs.\n * @returns {string[]}\n */\n getRequestIds() {\n return Array.from(this.#pending.keys());\n }\n\n /**\n * Gets pending requests for a specific peer.\n * \n * @param {string} peerId\n * @returns {PendingRequest[]}\n */\n getForPeer(peerId) {\n const requests = [];\n for (const pending of this.#pending.values()) {\n if (pending.targetPeer === peerId) {\n requests.push(pending);\n }\n }\n return requests;\n }\n}\n\n/**\n * @fileoverview Secure handshake protocol for peer negotiation.\n * Handles connection establishment, authentication, and capability exchange.\n * @module security/handshake\n */\n\n\n/**\n * @typedef {Object} HandshakeConfig\n * @property {string} [peerId] - Our peer ID (auto-generated if not specified).\n * @property {number} [timeout=10000] - Handshake timeout in ms.\n * @property {Object} [meta={}] - Metadata to share with peer.\n * @property {string[]} [capabilities=[]] - Supported capabilities.\n */\n\n/**\n * @typedef {Object} PeerInfo\n * @property {string} peerId - Remote peer's ID.\n * @property {string} origin - Remote peer's origin.\n * @property {string} type - Remote peer's type (iframe, worker, etc).\n * @property {Object} meta - Remote peer's metadata.\n * @property {string[]} capabilities - Remote peer's capabilities.\n * @property {number} connectedAt - Connection timestamp.\n */\n\n/**\n * @typedef {Object} HandshakeResult\n * @property {boolean} success - Whether handshake succeeded.\n * @property {PeerInfo} [peer] - Peer info if successful.\n * @property {string} [error] - Error code if failed.\n * @property {string} [reason] - Error reason if failed.\n */\n\n/**\n * Handshake protocol for secure peer establishment.\n * \n * Protocol flow:\n * ```\n * INITIATOR RESPONDER\n * │ │\n * │ HANDSHAKE_INIT │\n * │ { peerId, meta, caps } │\n * │ ──────────────────────────────► │\n * │ │\n * │ HANDSHAKE_ACK │\n * │ { peerId, meta, caps, accept } │\n * │ ◄────────────────────────────── │\n * │ │\n * │ HANDSHAKE_COMPLETE │\n * │ { confirmed: true } │\n * │ ──────────────────────────────► │\n * │ │\n * │ ✓ Connected │\n * ```\n */\nclass Handshake {\n /** @type {string} */\n #localPeerId;\n\n /** @type {Object} */\n #meta;\n\n /** @type {string[]} */\n #capabilities;\n\n /** @type {number} */\n #timeout;\n\n /** @type {Map<string, Object>} */\n #pendingHandshakes = new Map();\n\n /**\n * Creates a new Handshake handler.\n * \n * @param {HandshakeConfig} [config={}]\n */\n constructor(config = {}) {\n this.#localPeerId = config.peerId ?? uuid();\n this.#meta = config.meta ?? {};\n this.#capabilities = config.capabilities ?? [];\n this.#timeout = config.timeout ?? 10000;\n }\n\n /**\n * Gets the local peer ID.\n * @returns {string}\n */\n get peerId() {\n return this.#localPeerId;\n }\n\n /**\n * Creates a handshake initiation message.\n * \n * @returns {Object} Handshake init message.\n */\n createInitMessage() {\n return {\n type: MessageType.HANDSHAKE_INIT,\n handshakeId: uuid(),\n peerId: this.#localPeerId,\n meta: this.#meta,\n capabilities: this.#capabilities,\n timestamp: Date.now()\n };\n }\n\n /**\n * Creates a handshake acknowledgment message.\n * \n * @param {Object} initMessage - The received init message.\n * @param {boolean} accept - Whether to accept the connection.\n * @param {string} [reason] - Rejection reason if not accepted.\n * @returns {Object} Handshake ack message.\n */\n createAckMessage(initMessage, accept, reason) {\n return {\n type: MessageType.HANDSHAKE_ACK,\n handshakeId: initMessage.handshakeId,\n peerId: this.#localPeerId,\n meta: this.#meta,\n capabilities: this.#capabilities,\n accept,\n reason: accept ? undefined : reason,\n timestamp: Date.now()\n };\n }\n\n /**\n * Creates a handshake completion message.\n * \n * @param {string} handshakeId - The handshake ID.\n * @returns {Object} Handshake complete message.\n */\n createCompleteMessage(handshakeId) {\n return {\n type: MessageType.HANDSHAKE_COMPLETE,\n handshakeId,\n confirmed: true,\n timestamp: Date.now()\n };\n }\n\n /**\n * Initiates a handshake with a peer.\n * \n * @param {EventListener} sendFn - Function to send messages to peer.\n * @returns {Promise<HandshakeResult>} Result of handshake attempt.\n */\n async initiate(sendFn) {\n const initMsg = this.createInitMessage();\n const { promise, resolve, reject } = deferred();\n\n // Store pending handshake\n this.#pendingHandshakes.set(initMsg.handshakeId, {\n phase: HandshakePhase.INIT_SENT,\n resolve,\n reject,\n initMsg,\n startTime: Date.now()\n });\n\n // Send init message\n sendFn(initMsg);\n\n // Wait for response with timeout\n try {\n const result = await withTimeout(promise, this.#timeout);\n return result;\n } catch (/** @type {any} */ error) {\n this.#pendingHandshakes.delete(initMsg.handshakeId);\n\n if (error.code === ErrorCode.HANDSHAKE_TIMEOUT) {\n return {\n success: false,\n error: ErrorCode.HANDSHAKE_TIMEOUT,\n reason: `Handshake timeout after ${this.#timeout}ms`\n };\n }\n\n return {\n success: false,\n error: ErrorCode.HANDSHAKE_REJECTED,\n reason: error.message\n };\n }\n }\n\n /**\n * Handles a received handshake message.\n * \n * @param {Object} message - Received handshake message.\n * @param {string} origin - Origin of the message.\n * @param {EventListener} sendFn - Function to send response.\n * @param {EventListener} [validateFn] - Optional validation function.\n * @returns {PeerInfo|null} Peer info if handshake completes, null otherwise.\n */\n handleMessage(message, origin, sendFn, validateFn) {\n switch (message.type) {\n case MessageType.HANDSHAKE_INIT:\n return this.#handleInit(message, origin, sendFn, validateFn);\n\n case MessageType.HANDSHAKE_ACK:\n return this.#handleAck(message, origin, sendFn);\n\n case MessageType.HANDSHAKE_COMPLETE:\n return this.#handleComplete(message, origin);\n\n default:\n return null;\n }\n }\n\n /**\n * Checks if a handshake is pending.\n * \n * @param {string} handshakeId\n * @returns {boolean}\n */\n hasPending(handshakeId) {\n return this.#pendingHandshakes.has(handshakeId);\n }\n\n /**\n * Cancels a pending handshake.\n * \n * @param {string} handshakeId\n */\n cancel(handshakeId) {\n const pending = this.#pendingHandshakes.get(handshakeId);\n if (pending) {\n pending.reject(new Error('Handshake cancelled'));\n this.#pendingHandshakes.delete(handshakeId);\n }\n }\n\n /**\n * Cancels all pending handshakes.\n */\n cancelAll() {\n for (const [id, pending] of this.#pendingHandshakes) {\n pending.reject(new Error('All handshakes cancelled'));\n }\n this.#pendingHandshakes.clear();\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Private handlers\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Handles HANDSHAKE_INIT message (we are responder).\n * \n */\n #handleInit(message, origin, sendFn, validateFn) {\n // Validate if validator provided\n if (validateFn && !validateFn(message, origin)) {\n const ack = this.createAckMessage(message, false, 'Validation failed');\n sendFn(ack);\n return null;\n }\n\n // Accept the connection\n const ack = this.createAckMessage(message, true);\n sendFn(ack);\n\n // Store awaiting complete\n this.#pendingHandshakes.set(message.handshakeId, {\n phase: HandshakePhase.ACK_SENT,\n remotePeer: {\n peerId: message.peerId,\n origin,\n meta: message.meta,\n capabilities: message.capabilities\n }\n });\n\n return null; // Wait for complete message\n }\n\n /**\n * Handles HANDSHAKE_ACK message (we are initiator).\n * \n */\n #handleAck(message, origin, sendFn) {\n const pending = this.#pendingHandshakes.get(message.handshakeId);\n if (!pending) {\n return null; // Unknown handshake\n }\n\n if (!message.accept) {\n // Rejected\n pending.reject(new Error(message.reason || 'Connection rejected'));\n this.#pendingHandshakes.delete(message.handshakeId);\n return null;\n }\n\n // Send complete message\n const complete = this.createCompleteMessage(message.handshakeId);\n sendFn(complete);\n\n // Create peer info\n const peerInfo = {\n peerId: message.peerId,\n origin,\n meta: message.meta,\n capabilities: message.capabilities,\n type: 'unknown', // Will be updated by PeerRegistry\n connectedAt: Date.now()\n };\n\n // Resolve the promise\n pending.resolve({\n success: true,\n peer: peerInfo\n });\n\n this.#pendingHandshakes.delete(message.handshakeId);\n return peerInfo;\n }\n\n /**\n * Handles HANDSHAKE_COMPLETE message (we are responder).\n * \n */\n #handleComplete(message, origin) {\n const pending = this.#pendingHandshakes.get(message.handshakeId);\n if (!pending || pending.phase !== HandshakePhase.ACK_SENT) {\n return null;\n }\n\n if (!message.confirmed) {\n this.#pendingHandshakes.delete(message.handshakeId);\n return null;\n }\n\n // Handshake complete!\n const peerInfo = {\n ...pending.remotePeer,\n connectedAt: Date.now()\n };\n\n this.#pendingHandshakes.delete(message.handshakeId);\n return peerInfo;\n }\n}\n\n/**\n * @fileoverview Origin validation for cross-origin security.\n * Validates message origins against an allowlist.\n * @module security/origin-validator\n */\n\n/**\n * @typedef {Object} OriginValidatorOptions\n * @property {string[]} [allowed=[]] - Allowed origins. Empty = same-origin only.\n * @property {boolean} [allowAll=false] - Allow all origins (dangerous!).\n */\n\n/**\n * Validates message origins against a configured allowlist.\n * \n * Supports:\n * - Exact matches: 'https://example.com'\n * - Wildcards: 'https://*.example.com' (subdomains only)\n * - Protocols: 'chrome-extension://*', 'file://*'\n * \n * @example\n * const validator = new OriginValidator({\n * allowed: [\n * 'https://app.example.com',\n * 'https://*.widgets.com'\n * ]\n * });\n * \n * validator.isAllowed('https://app.example.com'); // true\n * validator.isAllowed('https://foo.widgets.com'); // true\n * validator.isAllowed('https://evil.com'); // false\n */\nclass OriginValidator {\n /** @type {Set<string>} */\n #exactOrigins = new Set();\n\n /** @type {RegExp[]} */\n #patterns = [];\n\n /** @type {boolean} */\n #allowAll = false;\n\n /** @type {string|undefined} */\n #selfOrigin;\n\n /**\n * Creates a new origin validator.\n * \n * @param {OriginValidatorOptions} [options={}] - Configuration.\n */\n constructor(options = {}) {\n this.#allowAll = options.allowAll ?? false;\n this.#selfOrigin = globalThis.location?.origin;\n\n // Process allowed origins\n if (options.allowed) {\n for (const origin of options.allowed) {\n this.#addOrigin(origin);\n }\n }\n }\n\n /**\n * Checks if an origin is allowed.\n * \n * @param {string} origin - Origin to check (e.g., 'https://example.com').\n * @returns {boolean} True if allowed.\n * \n * @example\n * validator.isAllowed('https://trusted.com'); // true\n * validator.isAllowed('https://unknown.com'); // false\n */\n isAllowed(origin) {\n // Allow-all mode (dangerous but sometimes needed)\n if (this.#allowAll) {\n return true;\n }\n\n // Null origin (file://, sandboxed iframes, etc.)\n if (origin === 'null' || origin === null) {\n return this.#exactOrigins.has('null');\n }\n\n // Empty/no allowed origins = same-origin only\n if (this.#exactOrigins.size === 0 && this.#patterns.length === 0) {\n return origin === this.#selfOrigin;\n }\n\n // Check exact match first (fast path)\n if (this.#exactOrigins.has(origin)) {\n return true;\n }\n\n // Check pattern matches\n for (const pattern of this.#patterns) {\n if (pattern.test(origin)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Adds an origin to the allowlist.\n * \n * @param {string} origin - Origin to add (supports wildcards).\n * @returns {this} For chaining.\n */\n allow(origin) {\n this.#addOrigin(origin);\n return this;\n }\n\n /**\n * Removes an origin from the allowlist.\n * \n * @param {string} origin - Origin to remove.\n * @returns {boolean} True if removed.\n */\n disallow(origin) {\n // For exact origins\n if (this.#exactOrigins.has(origin)) {\n this.#exactOrigins.delete(origin);\n return true;\n }\n\n // For patterns, we'd need to store the original string\n // For simplicity, patterns cannot be removed individually\n return false;\n }\n\n /**\n * Gets all exact (non-pattern) allowed origins.\n * \n * @returns {string[]} Array of allowed origins.\n */\n getAllowed() {\n return Array.from(this.#exactOrigins);\n }\n\n /**\n * Clears all allowed origins.\n */\n clear() {\n this.#exactOrigins.clear();\n this.#patterns = [];\n }\n\n /**\n * Gets the current origin (if available).\n * @returns {string|undefined}\n */\n get selfOrigin() {\n return this.#selfOrigin;\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Private methods\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Adds an origin to the appropriate collection.\n * \n * @param {string} origin\n */\n #addOrigin(origin) {\n if (typeof origin !== 'string') {\n throw new TypeError('Origin must be a string');\n }\n\n // Wildcard '*' means allow all\n if (origin === '*') {\n this.#allowAll = true;\n return;\n }\n\n // Contains wildcards - create pattern\n if (origin.includes('*')) {\n const pattern = this.#createPattern(origin);\n this.#patterns.push(pattern);\n } else {\n // Exact origin\n this.#exactOrigins.add(origin);\n }\n }\n\n /**\n * Creates a RegExp from a wildcard pattern.\n * Uses bounded quantifiers to prevent ReDoS attacks.\n * \n * @param {string} pattern - Pattern with wildcards.\n * @returns {RegExp}\n */\n #createPattern(pattern) {\n // Escape special regex characters except *\n const escaped = pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n // Use bounded quantifier to prevent catastrophic backtracking\n // Allows up to 253 chars per segment (max DNS label)\n .replace(/\\*/g, '[a-zA-Z0-9.-]{0,253}');\n\n return new RegExp(`^${escaped}$`);\n }\n}\n\n/**\n * Creates an origin validator with common configurations.\n */\nconst OriginValidatorPresets = {\n /**\n * Same-origin only (most secure).\n * @returns {OriginValidator}\n */\n sameOrigin() {\n return new OriginValidator();\n },\n\n /**\n * Allow all origins (use with caution!).\n * @returns {OriginValidator}\n */\n allowAll() {\n return new OriginValidator({ allowAll: true });\n },\n\n /**\n * Allow specific domains.\n * @param {string[]} origins\n * @returns {OriginValidator}\n */\n fromList(origins) {\n return new OriginValidator({ allowed: origins });\n }\n};\n\n/**\n * @fileoverview CrossBus - Main facade for cross-context messaging.\n * Provides a unified API for inter-context communication.\n * @module core/cross-bus\n */\n\n\n/**\n * @typedef {Object} CrossBusOptions\n * @property {string} [peerId] - Unique peer identifier (auto-generated if not specified).\n * @property {boolean} [isHub=false] - Whether this instance is the hub.\n * @property {number} [requestTimeout=30000] - Default request timeout in ms.\n * @property {number} [handshakeTimeout=10000] - Handshake timeout in ms.\n * @property {string[]} [allowedOrigins=[]] - Allowed origins for incoming connections.\n * @property {Object} [meta={}] - Metadata to share with peers.\n * @property {string[]} [capabilities=[]] - Supported capabilities.\n * @property {string} [contentType='application/json'] - Preferred serialization format.\n * @property {number} [maxPayloadSize=1048576] - Maximum payload size in bytes (default: 1MB).\n * @property {number} [maxPendingRequests=100] - Maximum concurrent pending requests.\n * @property {boolean} [strictMode=false] - Enforce strict security (disallows wildcard origins).\n * @property {boolean} [debug=false] - Enable verbose debug logging.\n * @property {string} [debugPrefix='[CrossBus]'] - Prefix for debug log messages.\n */\n\n/**\n * @typedef {Object} HandlerOptions\n * @property {string[]} [allowedPeers] - Peer IDs allowed to call this handler.\n * @property {number} [rateLimit] - Max calls per second from each peer.\n * @property {Function} [validatePayload] - Custom payload validator function.\n */\n\n/**\n * @typedef {Object} PeerInfo\n * @property {string} peerId - Peer identifier.\n * @property {string} origin - Peer origin.\n * @property {Object} meta - Peer metadata.\n * @property {PeerStatus} status - Connection status.\n * @property {number} connectedAt - Connection timestamp.\n */\n\n/**\n * @typedef {Object} RequestOptions\n * @property {number} [timeout] - Request timeout in ms.\n * @property {*} [defaultValue] - Value to return on timeout instead of throwing.\n */\n\n/**\n * @typedef {Object} BroadcastRequestOptions\n * @property {number} [timeout] - Per-peer timeout in ms.\n * @property {string[]} [exclude] - Peer IDs to exclude.\n * @property {boolean} [ignoreErrors=true] - Whether to ignore peer errors.\n */\n\n/**\n * @typedef {Object} HookContext\n * @property {'signal'|'request'|'response'} type - Message type.\n * @property {string} [peerId] - Peer ID (if applicable).\n * @property {string} [handlerName] - Handler name (for requests).\n * @property {'inbound'|'outbound'} direction - Hook direction.\n */\n\n/**\n * @callback MessageHook\n * @param {*} payload - Payload to transform.\n * @param {HookContext} context - Hook context.\n * @returns {*|Promise<*>} Transformed payload.\n */\n\n/**\n * @typedef {Object} HookEntry\n * @property {MessageHook} fn - Hook function.\n * @property {number} priority - Execution priority (lower = first).\n */\n\n/**\n * @callback RequestHandler\n * @param {*} payload - Request payload.\n * @param {Object} context - Request context (peerId, meta, etc).\n * @returns {Promise<*>|*} - Response data.\n */\n\n/**\n * CrossBus - Zero-leak, high-performance cross-context messaging.\n * \n * Features:\n * - Hub/Mesh routing\n * - Request/Response pattern\n * - Broadcast to all peers\n * - ACK-based reliability\n * - Origin validation\n * - Resource lifecycle management\n * \n * @example\n * // Hub (main page)\n * const hub = new CrossBus({ isHub: true });\n * \n * // Connect iframe\n * hub.connect(iframe.contentWindow, {\n * targetOrigin: 'https://widget.example.com'\n * });\n * \n * // Register handler\n * hub.handle('getData', async (payload, ctx) => {\n * return { items: await fetchItems() };\n * });\n * \n * // Emit signal\n * hub.emit('user:login', { userId: 123 });\n * \n * // Request/Response\n * const result = await hub.request('widget-1', 'getStatus');\n * \n * // Cleanup\n * hub.destroy();\n */\nclass CrossBus extends EventEmitter {\n /** @type {string} */\n #peerId;\n\n /** @type {boolean} */\n #isHub;\n\n /** @type {MessageRouter} */\n #router;\n\n /** @type {PendingRequests} */\n #pendingRequests;\n\n /** @type {Handshake} */\n #handshake;\n\n /** @type {OriginValidator} */\n #originValidator;\n\n /** @type {string} */\n #contentType;\n\n /** @type {Map<string, RequestHandler>} */\n #handlers = new Map();\n\n /** @type {HookEntry[]} */\n #inboundHooks = [];\n\n /** @type {HookEntry[]} */\n #outboundHooks = [];\n\n /** @type {Object} */\n #meta;\n\n /** @type {string[]} */\n #capabilities;\n\n /** @type {number} */\n #requestTimeout;\n\n /** @type {number} */\n #maxPayloadSize;\n\n /** @type {number} */\n #maxPendingRequests;\n\n /** @type {boolean} */\n #strictMode;\n\n /** @type {Map<string, { count: number, resetAt: number }>} */\n #rateLimitCounters = new Map();\n\n /** @type {Map<string, HandlerOptions>} */\n #handlerOptions = new Map();\n\n /** @type {boolean} */\n #debug = false;\n\n /** @type {string} */\n #debugPrefix = '[CrossBus]';\n\n /** @type {number} */\n #createdAt;\n\n /** @type {boolean} */\n #destroyed = false;\n\n /**\n * Creates a new CrossBus instance.\n * \n * @param {CrossBusOptions} [options={}]\n */\n constructor(options = {}) {\n super();\n\n this.#peerId = options.peerId ?? uuid();\n this.#isHub = options.isHub ?? false;\n this.#meta = options.meta ?? {};\n this.#capabilities = options.capabilities ?? [];\n this.#requestTimeout = options.requestTimeout ?? 30000;\n\n // Initialize components\n this.#router = new MessageRouter();\n this.#pendingRequests = new PendingRequests({\n defaultTimeout: this.#requestTimeout\n });\n this.#handshake = new Handshake({\n peerId: this.#peerId,\n meta: this.#meta,\n capabilities: this.#capabilities,\n timeout: options.handshakeTimeout ?? 10000\n });\n this.#originValidator = new OriginValidator({\n allowed: options.allowedOrigins ?? []\n });\n\n // Serialization setup\n this.#contentType = options.contentType ?? 'application/json';\n // this.#serializer = getSerializer(this.#contentType);\n\n // Security settings\n this.#maxPayloadSize = options.maxPayloadSize ?? 1024 * 1024; // 1MB\n this.#maxPendingRequests = options.maxPendingRequests ?? 100;\n this.#strictMode = options.strictMode ?? false;\n\n // Debug settings\n this.#debug = options.debug ?? false;\n this.#debugPrefix = options.debugPrefix ?? '[CrossBus]';\n this.#createdAt = Date.now();\n\n // Development security warnings\n this.#emitSecurityWarnings(options);\n\n // Initialize handshake capability\n this.#capabilities.push(`serializer:${this.#contentType}`);\n\n // Wire up router events\n this.#router.on('peer:added', (e) => { this.emit('peer:connected', e.data); });\n this.#router.on('peer:removed', (e) => { this.emit('peer:disconnected', e.data); });\n this.#router.on('peer:status', (e) => { this.emit('peer:status', e.data); });\n\n if (this.#debug) {\n this.#log('info', `Initialized (isHub: ${this.#isHub})`);\n }\n }\n\n /**\n * Gets the local peer ID.\n * @returns {string}\n */\n get peerId() {\n return this.#peerId;\n }\n\n /**\n * Gets whether this instance is the hub.\n * @returns {boolean}\n */\n get isHub() {\n return this.#isHub;\n }\n\n /**\n * Gets connected peer count.\n * @returns {number}\n */\n get peerCount() {\n return this.#router.peerCount;\n }\n\n /**\n * Gets all connected peer IDs.\n * @returns {string[]}\n */\n get peers() {\n return this.#router.getPeerIds();\n }\n\n /**\n * Gets peer info by ID.\n * \n * @param {string} peerId\n * @returns {PeerInfo|undefined}\n */\n getPeer(peerId) {\n return this.#router.getPeer(peerId);\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Messaging API\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Sends a signal to all connected peers.\n * \n * @param {string} signalName - Signal name (e.g., 'user:login').\n * @param {*} [payload] - Signal payload.\n * @param {Object} [options={}] - Send options.\n * @param {string[]} [options.exclude] - Peer IDs to exclude.\n * @returns {Promise<{ delivered: number, failed: string[] }>}\n * \n * @example\n * bus.signal('user:login', { userId: 123 });\n */\n async signal(signalName, payload, options = {}) {\n this.#assertNotDestroyed();\n\n // Apply outbound hooks\n const transformedPayload = await this.#runHooks(\n this.#outboundHooks,\n payload,\n { type: 'signal', direction: 'outbound' }\n );\n\n const message = createSignalMessage(\n signalName,\n transformedPayload,\n this.#peerId\n );\n\n const result = await this.#router.broadcast(message, options);\n\n this.#log('out', `SIGNAL \"${signalName}\" to ${result.delivered} peers`);\n\n return result;\n }\n\n /**\n * Sends a request to a specific peer and waits for response.\n * \n * @param {string} peerId - Target peer ID.\n * @param {string} handlerName - Handler to invoke.\n * @param {*} [payload] - Request payload.\n * @param {RequestOptions} [options={}]\n * @returns {Promise<*>} Handler response.\n * \n * @example\n * const data = await bus.request('widget-1', 'getData', { id: 5 });\n */\n async request(peerId, handlerName, payload, options = {}) {\n this.#assertNotDestroyed();\n\n this.#log('out', `REQUEST \"${handlerName}\" to ${peerId}`);\n\n const peer = this.#router.getPeer(peerId);\n if (!peer) {\n throw CrossBusError.from(ErrorCode.PEER_NOT_FOUND, { peerId });\n }\n\n // Create pending request\n const { requestId, promise } = this.#pendingRequests.create(\n peerId,\n handlerName,\n { timeout: options.timeout ?? this.#requestTimeout }\n );\n\n // Apply outbound hooks\n const transformedPayload = await this.#runHooks(\n this.#outboundHooks,\n payload,\n { type: 'request', peerId, handlerName, direction: 'outbound' }\n );\n\n // Build request message\n const message = createRequestMessage(\n handlerName,\n transformedPayload,\n this.#peerId,\n peerId,\n requestId // Pass the tracking ID\n );\n\n // Send request\n const result = this.#router.route({ target: peerId, payload: message });\n\n if (!result.success) {\n this.#pendingRequests.cancel(requestId);\n throw CrossBusError.from(ErrorCode.SEND_FAILED, { peerId });\n }\n\n return promise;\n }\n\n /**\n * Broadcasts a request to all peers and collects responses.\n * \n * @param {string} handlerName - Handler to invoke on all peers.\n * @param {*} [payload] - Request payload.\n * @param {BroadcastRequestOptions} [options={}]\n * @returns {Promise<Map<string, *>>} Map of peerId -> response.\n * \n * @example\n * const responses = await bus.broadcastRequest('getStatus');\n * for (const [peerId, status] of responses) {\n * console.log(`${peerId}: ${status.state}`);\n * }\n */\n async broadcastRequest(handlerName, payload, options = {}) {\n this.#assertNotDestroyed();\n\n const timeout = options.timeout ?? this.#requestTimeout;\n const ignoreErrors = options.ignoreErrors ?? true;\n const exclude = new Set(options.exclude ?? []);\n\n const results = new Map();\n const promises = [];\n\n for (const peerId of this.#router.getPeerIds()) {\n if (exclude.has(peerId)) continue;\n\n const requestPromise = this.request(peerId, handlerName, payload, { timeout })\n .then(response => {\n results.set(peerId, { success: true, data: response });\n })\n .catch(error => {\n if (ignoreErrors) {\n results.set(peerId, { success: false, error: error.message });\n } else {\n throw error;\n }\n });\n\n promises.push(requestPromise);\n }\n\n await Promise.all(promises);\n return results;\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Handler API\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Registers a request handler.\n * \n * @param {string} handlerName - Handler name.\n * @param {RequestHandler} handler - Handler function.\n * @param {HandlerOptions} [options={}] - Security options.\n * @returns {Function} Unregister function.\n * \n * @example\n * // Basic handler\n * const unhandle = bus.handle('getData', async (payload, ctx) => {\n * return await fetchData(payload.id);\n * });\n * \n * // Secure handler with restrictions\n * bus.handle('sensitiveData', async (payload) => { ... }, {\n * allowedPeers: ['trusted-agent'], // Only these peers can call\n * rateLimit: 10, // Max 10 calls/second per peer\n * validatePayload: (p) => p.id != null // Custom validation\n * });\n */\n handle(handlerName, handler, options = {}) {\n if (this.#handlers.has(handlerName)) {\n throw CrossBusError.from(ErrorCode.HANDLER_EXISTS, { handlerName });\n }\n\n // Store handler options for security checks\n if (options.allowedPeers || options.rateLimit || options.validatePayload) {\n this.#handlerOptions.set(handlerName, options);\n }\n\n this.#handlers.set(handlerName, handler);\n\n return () => {\n this.#handlers.delete(handlerName);\n this.#handlerOptions.delete(handlerName);\n };\n }\n\n /**\n * Removes a handler.\n * \n * @param {string} handlerName\n * @returns {boolean} True if handler was removed.\n */\n unhandle(handlerName) {\n return this.#handlers.delete(handlerName);\n }\n\n /**\n * Checks if a handler is registered.\n * \n * @param {string} handlerName\n * @returns {boolean}\n */\n hasHandler(handlerName) {\n return this.#handlers.has(handlerName);\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Hook API\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Adds an inbound hook to transform incoming payloads.\n * \n * @param {MessageHook} hookFn - Hook function.\n * @param {number} [priority=10] - Execution priority (lower = first).\n * @returns {Function} Unregister function.\n * \n * @example\n * // Decrypt incoming messages\n * const unhook = bus.addInboundHook(async (payload, ctx) => {\n * return await decrypt(payload);\n * });\n */\n addInboundHook(hookFn, priority = 10) {\n if (typeof hookFn !== 'function') {\n throw new TypeError('hookFn must be a function');\n }\n\n const entry = { fn: hookFn, priority };\n this.#inboundHooks.push(entry);\n this.#inboundHooks.sort((a, b) => a.priority - b.priority);\n\n return () => this.removeInboundHook(hookFn);\n }\n\n /**\n * Adds an outbound hook to transform outgoing payloads.\n * \n * @param {MessageHook} hookFn - Hook function.\n * @param {number} [priority=10] - Execution priority (lower = first).\n * @returns {Function} Unregister function.\n * \n * @example\n * // Encrypt outgoing messages\n * const unhook = bus.addOutboundHook(async (payload, ctx) => {\n * return await encrypt(payload);\n * });\n */\n addOutboundHook(hookFn, priority = 10) {\n if (typeof hookFn !== 'function') {\n throw new TypeError('hookFn must be a function');\n }\n\n const entry = { fn: hookFn, priority };\n this.#outboundHooks.push(entry);\n this.#outboundHooks.sort((a, b) => a.priority - b.priority);\n\n return () => this.removeOutboundHook(hookFn);\n }\n\n /**\n * Removes an inbound hook.\n * \n * @param {MessageHook} hookFn\n * @returns {boolean} True if removed.\n */\n removeInboundHook(hookFn) {\n const index = this.#inboundHooks.findIndex(e => e.fn === hookFn);\n if (index !== -1) {\n this.#inboundHooks.splice(index, 1);\n return true;\n }\n return false;\n }\n\n /**\n * Removes an outbound hook.\n * \n * @param {MessageHook} hookFn\n * @returns {boolean} True if removed.\n */\n removeOutboundHook(hookFn) {\n const index = this.#outboundHooks.findIndex(e => e.fn === hookFn);\n if (index !== -1) {\n this.#outboundHooks.splice(index, 1);\n return true;\n }\n return false;\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Connection API\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Adds a peer with a send function.\n * Used for hub mode when managing connections manually.\n * \n * @param {string} peerId - Peer identifier.\n * @param {EventListener} sendFn - Function to send messages.\n * @param {Object} [options={}] - Additional options.\n */\n addPeer(peerId, sendFn, options = {}) {\n this.#assertNotDestroyed();\n this.#router.addPeer(peerId, sendFn, options);\n }\n\n /**\n * Removes a peer.\n * \n * @param {string} peerId\n * @returns {boolean}\n */\n removePeer(peerId) {\n this.#pendingRequests.cancelForPeer(peerId);\n return this.#router.removePeer(peerId);\n }\n\n /**\n * Adds a transport and automatically wires up message handling.\n * This is the recommended way to connect transports for AI agents.\n * \n * @param {Object} transport - Transport instance with send() and onMessage() methods.\n * @param {Object} [options={}] - Additional options.\n * @param {string} [options.peerId] - Override peer ID (defaults to transport's peerId or auto-generated).\n * @param {string} [options.origin='*'] - Origin for message validation.\n * @returns {Function} Cleanup function to remove the transport.\n * \n * @example\n * // Simple usage\n * const cleanup = bus.addTransport(new PostMessageTransport(iframe.contentWindow));\n * \n * // With options\n * const cleanup = bus.addTransport(transport, { peerId: 'my-agent' });\n * \n * // Cleanup when done\n * cleanup();\n */\n addTransport(transport, options = {}) {\n this.#assertNotDestroyed();\n\n if (!transport || typeof transport.send !== 'function') {\n throw new TypeError('Transport must have a send() method');\n }\n\n const peerId = options.peerId || transport.peerId || `transport-${uuid()}`;\n const origin = options.origin || '*';\n\n // Wire up inbound: transport -> CrossBus\n if (typeof transport.onMessage === 'function') {\n transport.onMessage((message) => {\n this.handleMessage(message, origin, peerId);\n });\n }\n\n // Wire up outbound: CrossBus -> transport\n this.addPeer(peerId, (message) => {\n transport.send(message);\n }, options);\n\n // Return cleanup function\n return () => {\n this.removePeer(peerId);\n if (typeof transport.destroy === 'function') {\n transport.destroy();\n }\n };\n }\n\n /**\n * Handles an incoming message.\n * Call this when receiving a message from any transport.\n * \n * @param {Object} message - The received message.\n * @param {string} origin - Origin of the message.\n * @param {string} [peerId] - Source peer ID if known.\n * @param {Function} [replyFn] - Function to reply to the sender.\n */\n async handleMessage(message, origin, peerId, replyFn) {\n if (this.#destroyed) return;\n\n // Validate origin\n if (!this.#originValidator.isAllowed(origin)) {\n console.warn(`[CrossBus] Blocked message from unauthorized origin: ${origin}`);\n return;\n }\n\n // Apply inbound hooks to payload\n // Apply inbound hooks to payload\n // Support both standard 'payload'/'data' and legacy 'p'\n const rawPayload = message.payload ?? message.data ?? message.p;\n const msgType = message.type ?? message.t;\n\n // Normalize fields based on schema\n let handlerOrName = message.handler ?? message.name;\n let dataContent = rawPayload;\n\n // If ProtocolMessage (has 'payload' object containing metadata), extract from it\n if (message.payload && typeof message.payload === 'object' && !message.p) {\n if (msgType === MessageType.SIGNAL || msgType === MessageType.BROADCAST) {\n handlerOrName = message.payload.name;\n dataContent = message.payload.data;\n } else if (msgType === MessageType.REQUEST) {\n handlerOrName = message.payload.name;\n dataContent = message.payload.data;\n } else if (msgType === MessageType.RESPONSE) {\n // Response payload structure? createResponseMessage puts 'data' in payload\n dataContent = message.payload.data;\n }\n }\n // Handle envelope format: { t, p: { type, payload: { name, data } } }\n // Router creates envelopes with 'p' containing the original signal message\n // Detect by: has 't' (not 'type'), has 'p' with nested 'payload' (ProtocolMessage structure)\n else if (message.t && !message.type && message.p && typeof message.p === 'object' && message.p.payload) {\n const innerMsg = message.p;\n // Extract from nested ProtocolMessage\n handlerOrName = innerMsg.payload.name ?? innerMsg.name;\n dataContent = innerMsg.payload.data ?? innerMsg.data;\n }\n\n if (dataContent !== undefined) {\n const hookContext = {\n type: msgType === MessageType.SIGNAL ? 'signal' :\n msgType === MessageType.REQUEST ? 'request' : 'response',\n peerId,\n handlerName: handlerOrName,\n direction: 'inbound'\n };\n // Run hooks\n dataContent = await this.#runHooks(this.#inboundHooks, dataContent, hookContext);\n }\n\n switch (msgType) {\n case MessageType.BROADCAST: // Broadcast has same structure as signal\n case MessageType.SIGNAL:\n if (typeof handlerOrName !== 'string') {\n console.warn('[CrossBus] Invalid signal name type');\n return;\n }\n await this.#handleSignal(handlerOrName, dataContent, peerId);\n break;\n\n case MessageType.REQUEST:\n if (typeof handlerOrName !== 'string') {\n console.warn('[CrossBus] Invalid handler name type');\n return;\n }\n // Pass normalized ID\n // const reqId = message.id ?? (message.payload ? message.payload.id : undefined);\n // Wait, 'id' is top level in ProtocolMessage AND legacy.\n\n await this.#handleRequest(message.id, handlerOrName, dataContent, peerId, replyFn);\n break;\n\n case MessageType.RESPONSE: {\n let success = message.success;\n let error = message.error;\n\n // Extract from ProtocolMessage payload if needed\n if (message.payload && message.payload.success !== undefined) {\n success = message.payload.success;\n error = message.payload.error;\n }\n\n // If legacy response structure inside payload?\n this.#handleResponse(message.payload?.requestId ?? message.id, success, dataContent, error);\n break;\n }\n\n case MessageType.HANDSHAKE_INIT:\n case MessageType.HANDSHAKE_ACK:\n case MessageType.HANDSHAKE_COMPLETE:\n this.#handshake.handleMessage(message, origin, /** @type {EventListener} */(replyFn));\n break;\n\n default:\n console.warn(`[CrossBus] Unknown message type: ${msgType}`);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Destroys the CrossBus, cleaning up all resources.\n */\n destroy() {\n if (this.#destroyed) return;\n\n this.#destroyed = true;\n\n // Cancel all pending requests\n this.#pendingRequests.cancelAll();\n\n // Clear handlers\n this.#handlers.clear();\n\n // Clear peers\n this.#router.clearPeers();\n\n // Clear event listeners\n this.clear();\n\n this.emit('destroyed', {});\n }\n\n /**\n * Checks if the bus has been destroyed.\n * @returns {boolean}\n */\n get isDestroyed() {\n return this.#destroyed;\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Private handlers\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Handles incoming signal.\n * \n */\n async #handleSignal(name, data, peerId) {\n await this.emit(name, {\n payload: data,\n source: peerId\n });\n }\n\n /**\n * Handles incoming request.\n * \n */\n async #handleRequest(requestId, handlerName, data, peerId, replyFn) {\n const handler = this.#handlers.get(handlerName);\n\n let response;\n\n if (!handler) {\n response = createResponseMessage(\n requestId,\n null,\n this.#peerId,\n false,\n {\n code: ErrorCode.NO_HANDLER,\n message: 'Handler not found'\n }\n );\n } else {\n // Check handler security (allowedPeers, rateLimit, validatePayload)\n const securityCheck = this.#checkHandlerSecurity(handlerName, peerId, data);\n if (!securityCheck.allowed) {\n response = createResponseMessage(\n requestId,\n null,\n this.#peerId,\n false,\n {\n code: securityCheck.error?.code ?? ErrorCode.UNAUTHORIZED,\n message: securityCheck.error?.message ?? 'Security check failed'\n }\n );\n } else {\n try {\n const result = await handler(data, {\n peerId,\n requestId: requestId,\n handlerName: handlerName\n });\n\n // Apply outbound hooks to response\n const transformedResult = await this.#runHooks(\n this.#outboundHooks,\n result,\n { type: 'response', peerId, handlerName: handlerName, direction: 'outbound' }\n );\n\n response = createResponseMessage(\n requestId,\n transformedResult,\n this.#peerId,\n true\n );\n } catch (/** @type {any} */ error) {\n response = createResponseMessage(\n requestId,\n null,\n this.#peerId,\n false,\n {\n code: error.code ?? ErrorCode.HANDLER_ERROR,\n message: error.message\n }\n );\n }\n }\n }\n\n // Send response\n if (replyFn) {\n replyFn(response);\n } else if (peerId) {\n this.#router.route({ target: peerId, payload: response });\n }\n }\n\n /**\n * Handles incoming response.\n * \n */\n #handleResponse(requestId, success, data, error) {\n this.#pendingRequests.resolve(requestId, {\n requestId,\n success,\n data,\n error\n });\n }\n\n /**\n * Asserts the bus is not destroyed.\n * \n */\n #assertNotDestroyed() {\n if (this.#destroyed) {\n throw CrossBusError.from(ErrorCode.DESTROYED, {\n context: 'CrossBus operation'\n });\n }\n }\n\n /**\n * Runs a chain of hooks on a payload.\n * \n */\n async #runHooks(hooks, payload, context) {\n let current = payload;\n for (const { fn } of hooks) {\n try {\n current = await fn(current, context);\n } catch (error) {\n console.error('[CrossBus] Hook error:', error);\n // Continue with unmodified payload on error\n }\n }\n return current;\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Security Methods\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Emits security warnings in development mode.\n * @param {CrossBusOptions} options\n */\n #emitSecurityWarnings(options) {\n // Only warn in development\n const isDev = typeof process !== 'undefined'\n ? process.env?.NODE_ENV !== 'production'\n : typeof window !== 'undefined' && window.location?.hostname === 'localhost';\n\n if (!isDev) return;\n\n // Warn if allowedOrigins is not specified\n if (!options.allowedOrigins || options.allowedOrigins.length === 0) {\n console.warn(\n '[CrossBus Security] ⚠️ No allowedOrigins specified.\\n' +\n 'This bus will REJECT all incoming messages from transports.\\n' +\n 'To receive messages, specify allowed origins:\\n' +\n ' allowedOrigins: [\"https://trusted-domain.com\"]\\n' +\n 'For development only: allowedOrigins: [\"*\"]'\n );\n }\n\n // Warn about wildcard origins\n if (options.allowedOrigins?.includes('*')) {\n console.warn(\n '[CrossBus Security] ⚠️ allowedOrigins: [\"*\"] accepts messages from ANY origin.\\n' +\n 'This is INSECURE in production. Use specific origins instead:\\n' +\n ' allowedOrigins: [\"https://trusted-domain.com\"]\\n' +\n 'For production, use:\\n' +\n ' CrossBus.createSecure({ allowedOrigins: [\"https://...\"] })\\n' +\n 'Suppress this warning with NODE_ENV=production'\n );\n\n // In strict mode, throw error\n if (this.#strictMode) {\n throw new Error(\n 'strictMode: allowedOrigins: [\"*\"] is not allowed. ' +\n 'Use specific origins for security.'\n );\n }\n }\n }\n\n /**\n * Checks handler security before execution.\n * @param {string} handlerName\n * @param {string} peerId\n * @param {*} payload\n * @returns {{ allowed: boolean, error?: CrossBusError }}\n */\n #checkHandlerSecurity(handlerName, peerId, payload) {\n const options = this.#handlerOptions.get(handlerName);\n if (!options) {\n return { allowed: true };\n }\n\n // Check peer allowlist\n if (options.allowedPeers && !options.allowedPeers.includes(peerId)) {\n return {\n allowed: false,\n error: CrossBusError.from(ErrorCode.UNAUTHORIZED, {\n handler: handlerName,\n peer: peerId,\n allowedPeers: options.allowedPeers\n })\n };\n }\n\n // Check rate limit\n if (options.rateLimit) {\n const limitKey = `${handlerName}:${peerId}`;\n if (!this.#checkRateLimit(limitKey, options.rateLimit)) {\n return {\n allowed: false,\n error: CrossBusError.from(ErrorCode.RATE_LIMITED, {\n handler: handlerName,\n peer: peerId,\n limit: options.rateLimit\n })\n };\n }\n }\n\n // Validate payload\n if (options.validatePayload) {\n try {\n const isValid = options.validatePayload(payload);\n if (!isValid) {\n return {\n allowed: false,\n error: CrossBusError.from(ErrorCode.INVALID_PAYLOAD, {\n handler: handlerName\n })\n };\n }\n } catch (/** @type {any} */ e) {\n return {\n allowed: false,\n error: CrossBusError.from(ErrorCode.INVALID_PAYLOAD, {\n handler: handlerName,\n reason: e?.message ?? 'Validation error'\n })\n };\n }\n }\n\n return { allowed: true };\n }\n\n /**\n * Checks rate limit for a key.\n * @param {string} key - Rate limit key (e.g., \"handlerName:peerId\")\n * @param {number} maxPerSecond - Maximum calls per second\n * @returns {boolean} - True if allowed, false if rate limited\n */\n #checkRateLimit(key, maxPerSecond) {\n const now = Date.now();\n const counter = this.#rateLimitCounters.get(key);\n\n if (!counter || now >= counter.resetAt) {\n // Start new window\n this.#rateLimitCounters.set(key, {\n count: 1,\n resetAt: now + 1000\n });\n return true;\n }\n\n if (counter.count >= maxPerSecond) {\n return false;\n }\n\n counter.count++;\n return true;\n }\n\n\n\n /**\n * Gets the maximum payload size.\n * @returns {number}\n */\n get maxPayloadSize() {\n return this.#maxPayloadSize;\n }\n\n /**\n * Gets whether strict mode is enabled.\n * @returns {boolean}\n */\n get strictMode() {\n return this.#strictMode;\n }\n\n /**\n * Gets whether debug mode is enabled.\n * @returns {boolean}\n */\n get debug() {\n return this.#debug;\n }\n\n /**\n * Gets the uptime in milliseconds.\n * @returns {number}\n */\n get uptime() {\n return Date.now() - this.#createdAt;\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Debug Logging\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Logs a debug message if debug mode is enabled.\n * @param {'in'|'out'|'info'|'warn'|'error'} type - Log type\n * @param {string} message - Message to log\n */\n #log(type, message) {\n if (!this.#debug) return;\n\n const arrow = type === 'out' ? '→' :\n type === 'in' ? '←' :\n type === 'warn' ? '⚠️' :\n type === 'error' ? '❌' : 'ℹ️';\n\n // eslint-disable-next-line no-console\n console.log(`${this.#debugPrefix} ${arrow} ${message}`);\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Health Check\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Returns the health status of the CrossBus instance.\n * Useful for monitoring and diagnostics.\n * \n * @returns {Object} Health status object\n * \n * @example\n * const health = bus.healthCheck();\n * // {\n * // status: 'healthy',\n * // peerId: 'hub-1',\n * // uptime: 123456,\n * // peers: { total: 5, connected: 4 },\n * // handlers: ['getData', 'setData'],\n * // memory: { heapUsed: 12345678 }\n * // }\n */\n healthCheck() {\n const peerIds = this.#router.getPeerIds();\n const connectedCount = peerIds.length;\n\n // Determine status\n let status = 'healthy';\n if (this.#destroyed) {\n status = 'unhealthy';\n } else if (connectedCount === 0 && this.#isHub) {\n status = 'degraded';\n }\n\n // Get memory usage if available\n let memory;\n if (typeof process !== 'undefined' && process.memoryUsage) {\n try {\n const mem = process.memoryUsage();\n memory = {\n heapUsed: mem.heapUsed,\n heapTotal: mem.heapTotal,\n rss: mem.rss\n };\n } catch {\n // Memory info not available\n }\n }\n\n return {\n status,\n peerId: this.#peerId,\n isHub: this.#isHub,\n uptime: this.uptime,\n peers: {\n total: connectedCount,\n ids: peerIds\n },\n handlers: Array.from(this.#handlers.keys()),\n pendingRequests: this.#pendingRequests.size ?? 0,\n destroyed: this.#destroyed,\n ...(memory && { memory })\n };\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Static Factory Methods\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Creates a pre-configured secure CrossBus instance.\n * Recommended for production use by AI agents.\n * \n * Enforces:\n * - strictMode (no wildcard origins)\n * - 1MB max payload size\n * - 100 max pending requests\n * - 30s request timeout\n * \n * @param {CrossBusOptions} options - Configuration options\n * @returns {CrossBus} Configured instance\n * @throws {Error} If allowedOrigins contains '*' or is missing\n * \n * @example\n * // For production use\n * const hub = CrossBus.createSecure({\n * peerId: 'my-hub',\n * isHub: true,\n * allowedOrigins: ['https://trusted-domain.com']\n * });\n */\n static createSecure(options = {}) {\n if (!options.allowedOrigins || options.allowedOrigins.length === 0) {\n throw new Error(\n 'createSecure() requires allowedOrigins to be specified. ' +\n 'For development, use: new CrossBus({ allowedOrigins: [\"*\"] })'\n );\n }\n\n if (options.allowedOrigins.includes('*')) {\n throw new Error(\n 'createSecure() does not allow wildcard origins. ' +\n 'Specify exact origins: allowedOrigins: [\"https://example.com\"]'\n );\n }\n\n return new CrossBus({\n strictMode: true,\n maxPayloadSize: 1024 * 1024,\n maxPendingRequests: 100,\n requestTimeout: 30000,\n ...options\n });\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Diagnostics (AI Agent Helper)\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Performs diagnostics and returns troubleshooting suggestions.\n * Designed to help AI agents identify and fix common issues.\n * \n * @returns {Object} Diagnostic report with issues and suggestions\n * \n * @example\n * const report = bus.diagnose();\n * if (report.issues.length > 0) {\n * console.log('Issues found:', report.issues);\n * console.log('Suggestions:', report.suggestions);\n * }\n */\n diagnose() {\n const issues = [];\n const suggestions = [];\n const warnings = [];\n\n // Check if destroyed\n if (this.#destroyed) {\n issues.push('Instance is destroyed');\n suggestions.push('Create a new CrossBus instance');\n return { status: 'error', issues, suggestions, warnings };\n }\n\n // Check peer connections\n const peerCount = this.#router.getPeerIds().length;\n if (peerCount === 0) {\n if (this.#isHub) {\n warnings.push('Hub has no connected peers');\n suggestions.push('Add transports with addTransport() or wait for agents to connect');\n } else {\n issues.push('Agent has no connected peers');\n suggestions.push('Add a transport to connect to hub: bus.addTransport(transport, {peerId: \"hub\"})');\n }\n }\n\n // Check handlers\n const handlerCount = this.#handlers.size;\n if (this.#isHub && handlerCount === 0) {\n warnings.push('Hub has no registered handlers');\n suggestions.push('Register handlers with bus.handle(\"name\", fn)');\n }\n\n // Check pending requests\n const pendingCount = this.#pendingRequests.size ?? 0;\n if (pendingCount > this.#maxPendingRequests * 0.8) {\n warnings.push(`High pending request count: ${pendingCount}/${this.#maxPendingRequests}`);\n suggestions.push('Consider increasing maxPendingRequests or check for slow handlers');\n }\n\n // Check strict mode in production hints\n if (!this.#strictMode) {\n warnings.push('strictMode is disabled');\n suggestions.push('For production, use CrossBus.createSecure() or set strictMode: true');\n }\n\n // Determine overall status\n let status = 'healthy';\n if (issues.length > 0) {\n status = 'error';\n } else if (warnings.length > 0) {\n status = 'warning';\n }\n\n return {\n status,\n peerId: this.#peerId,\n isHub: this.#isHub,\n peerCount,\n handlerCount,\n pendingRequests: pendingCount,\n uptime: this.uptime,\n issues,\n warnings,\n suggestions\n };\n }\n}\n\n/**\n * @fileoverview Streaming support for CrossBus.\n * Enables efficient transfer of large payloads (files, LLM responses) via chunked messages.\n * @module core/stream\n */\n\n\n/**\n * @typedef {Object} StreamOptions\n * @property {number} [chunkSize=64000] - Size of each chunk in bytes.\n * @property {number} [timeout=30000] - Timeout for stream operations in ms.\n */\n\n/**\n * @typedef {Object} StreamMeta\n * @property {string} streamId - Unique stream identifier.\n * @property {string} name - Stream name/type.\n * @property {number} [totalSize] - Total size if known.\n * @property {string} [contentType] - MIME type if applicable.\n * @property {Object} [meta] - Additional metadata.\n */\n\n/**\n * @typedef {'open' | 'data' | 'end' | 'error' | 'ack'} StreamMessageType\n */\n\n/**\n * Writable stream for sending large payloads in chunks.\n * \n * @example\n * const stream = new WritableSignalStream(sendFn, 'upload', {\n * meta: { filename: 'data.json' }\n * });\n * \n * for await (const chunk of readFile(file)) {\n * await stream.write(chunk);\n * }\n * await stream.end();\n */\nclass WritableSignalStream {\n /** @type {string} */\n #streamId;\n\n /** @type {string} */\n #name;\n\n /** @type {Function} */\n #sendFn;\n\n /** @type {number} */\n #chunkSize;\n\n /** @type {number} */\n #seq = 0;\n\n /** @type {boolean} */\n #ended = false;\n\n /** @type {boolean} */\n #opened = false;\n\n /** @type {Object} */\n #meta;\n\n /**\n * Creates a new writable stream.\n * \n * @param {Function} sendFn - Function to send messages.\n * @param {string} name - Stream name/type identifier.\n * @param {StreamOptions & { meta?: Object }} [options={}] - Options.\n */\n constructor(sendFn, name, options = {}) {\n this.#streamId = uuid();\n this.#name = name;\n this.#sendFn = sendFn;\n this.#chunkSize = options.chunkSize ?? 64000;\n this.#meta = options.meta ?? {};\n }\n\n /**\n * Gets the stream ID.\n * @returns {string}\n */\n get streamId() {\n return this.#streamId;\n }\n\n /**\n * Gets the stream name.\n * @returns {string}\n */\n get name() {\n return this.#name;\n }\n\n /**\n * Opens the stream (called automatically on first write).\n * \n * @param {Object} [meta] - Additional metadata.\n * @returns {Promise<void>}\n */\n async open(meta) {\n if (this.#opened) return;\n\n this.#opened = true;\n\n await this.#send({\n st: 'open',\n name: this.#name,\n meta: { ...this.#meta, ...meta }\n });\n }\n\n /**\n * Writes data to the stream.\n * \n * @param {string | ArrayBuffer | Uint8Array | Object} data - Data to write.\n * @returns {Promise<void>}\n */\n async write(data) {\n if (this.#ended) {\n throw new Error('Stream already ended');\n }\n\n if (!this.#opened) {\n await this.open();\n }\n\n // Convert data to sendable format\n let payload;\n let isBase64 = false;\n\n if (data instanceof ArrayBuffer) {\n payload = this.#arrayBufferToBase64(new Uint8Array(data));\n isBase64 = true;\n } else if (data instanceof Uint8Array) {\n payload = this.#arrayBufferToBase64(data);\n isBase64 = true;\n } else if (typeof data === 'string') {\n // String data - chunk if needed\n const chunks = this.#chunkString(data, this.#chunkSize);\n for (const chunk of chunks) {\n await this.#send({\n st: 'data',\n seq: this.#seq++,\n d: chunk,\n b64: false\n });\n }\n return;\n } else {\n // Object - serialize to JSON\n payload = JSON.stringify(data);\n }\n\n // Send (chunk if binary)\n if (isBase64) {\n const chunks = this.#chunkString(payload, this.#chunkSize);\n for (const chunk of chunks) {\n await this.#send({\n st: 'data',\n seq: this.#seq++,\n d: chunk,\n b64: true\n });\n }\n } else {\n await this.#send({\n st: 'data',\n seq: this.#seq++,\n d: payload,\n b64: false\n });\n }\n }\n\n /**\n * Ends the stream.\n * \n * @param {Object} [finalMeta] - Final metadata.\n * @returns {Promise<void>}\n */\n async end(finalMeta) {\n if (this.#ended) return;\n\n this.#ended = true;\n\n await this.#send({\n st: 'end',\n seq: this.#seq,\n meta: finalMeta\n });\n }\n\n /**\n * Aborts the stream with an error.\n * \n * @param {string} [reason] - Error reason.\n * @returns {Promise<void>}\n */\n async abort(reason) {\n if (this.#ended) return;\n\n this.#ended = true;\n\n await this.#send({\n st: 'error',\n reason: reason ?? 'Stream aborted'\n });\n }\n\n /**\n * Sends a stream message.\n * \n * @param {Object} payload - Stream payload.\n */\n async #send(payload) {\n const message = {\n [PROTOCOL_MARKER]: PROTOCOL_VERSION,\n t: 'stream',\n sid: this.#streamId,\n ...payload\n };\n\n await this.#sendFn(message);\n }\n\n /**\n * Chunks a string into smaller pieces.\n * \n * @param {string} str - String to chunk.\n * @param {number} size - Chunk size.\n * @returns {string[]}\n */\n #chunkString(str, size) {\n const chunks = [];\n for (let i = 0; i < str.length; i += size) {\n chunks.push(str.slice(i, i + size));\n }\n return chunks;\n }\n\n /**\n * Converts Uint8Array to base64.\n * \n * @param {Uint8Array} bytes \n * @returns {string}\n */\n #arrayBufferToBase64(bytes) {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n}\n\n/**\n * Readable stream for receiving large payloads.\n * \n * @example\n * streamManager.onStream('upload', async (stream) => {\n * for await (const chunk of stream) {\n * await processChunk(chunk);\n * }\n * });\n */\nclass ReadableSignalStream {\n /** @type {string} */\n #streamId;\n\n /** @type {string} */\n #name;\n\n /** @type {Object} */\n #meta;\n\n /** @type {Array<any>} */\n #buffer = [];\n\n /** @type {Function|null} */\n #resolveNext = null;\n\n /** @type {boolean} */\n #ended = false;\n\n /** @type {Error|null} */\n #error = null;\n\n /** @type {number} */\n // #expectedSeq = 0;\n\n /**\n * Creates a readable stream from open message.\n * \n * @param {string} streamId - Stream ID.\n * @param {string} name - Stream name.\n * @param {Object} [meta] - Stream metadata.\n */\n constructor(streamId, name, meta = {}) {\n this.#streamId = streamId;\n this.#name = name;\n this.#meta = meta;\n }\n\n /**\n * Gets the stream ID.\n * @returns {string}\n */\n get streamId() {\n return this.#streamId;\n }\n\n /**\n * Gets the stream name.\n * @returns {string}\n */\n get name() {\n return this.#name;\n }\n\n /**\n * Gets stream metadata.\n * @returns {Object}\n */\n get meta() {\n return this.#meta;\n }\n\n /**\n * Gets whether stream has ended.\n * @returns {boolean}\n */\n get ended() {\n return this.#ended;\n }\n\n /**\n * Pushes data chunk from message.\n * \n * @param {Object} message - Stream data message.\n */\n push(message) {\n if (this.#ended) return;\n\n // Decode data\n let data = message.d;\n if (message.b64) {\n data = this.#base64ToUint8Array(data);\n }\n\n // Add to buffer\n this.#buffer.push(data);\n\n // Resolve waiting reader\n if (this.#resolveNext) {\n const resolve = this.#resolveNext;\n this.#resolveNext = null;\n resolve();\n }\n }\n\n /**\n * Marks stream as ended.\n * \n * @param {Object} [meta] - Final metadata.\n */\n end(meta) {\n this.#ended = true;\n if (meta) {\n this.#meta = { ...this.#meta, ...meta };\n }\n\n // Resolve waiting reader\n if (this.#resolveNext) {\n const resolve = this.#resolveNext;\n this.#resolveNext = null;\n resolve();\n }\n }\n\n /**\n * Marks stream as errored.\n * \n * @param {string} reason - Error reason.\n */\n error(reason) {\n this.#ended = true;\n this.#error = new Error(reason);\n\n if (this.#resolveNext) {\n const resolve = this.#resolveNext;\n this.#resolveNext = null;\n resolve();\n }\n }\n\n /**\n * Async iterator for consuming stream.\n * \n * @returns {AsyncIterableIterator<any>}\n */\n async *[Symbol.asyncIterator]() {\n while (true) {\n // Return buffered data first\n while (this.#buffer.length > 0) {\n yield this.#buffer.shift();\n }\n\n // Check for end/error\n if (this.#ended) {\n if (this.#error) {\n throw this.#error;\n }\n return;\n }\n\n // Wait for more data\n await new Promise(resolve => {\n this.#resolveNext = resolve;\n });\n }\n }\n\n /**\n * Collects all data into single result.\n * \n * @returns {Promise<Uint8Array | string>}\n */\n async collect() {\n const chunks = [];\n let isBinary = false;\n\n for await (const chunk of this) {\n chunks.push(chunk);\n if (chunk instanceof Uint8Array) {\n isBinary = true;\n }\n }\n\n if (isBinary) {\n // Combine binary chunks\n const totalLength = chunks.reduce((acc, c) => acc + c.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n } else {\n // Combine string chunks\n return chunks.join('');\n }\n }\n\n /**\n * Decodes base64 to Uint8Array.\n * \n * @param {string} base64 \n * @returns {Uint8Array}\n */\n #base64ToUint8Array(base64) {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n}\n\n/**\n * Stream manager for CrossBus.\n * Handles creating, sending, and receiving streams.\n * \n * @example\n * const streams = new StreamManager(bus);\n * \n * // Create and send stream\n * const stream = await streams.createStream('upload', 'peer-1', {\n * meta: { filename: 'data.json' }\n * });\n * await stream.write(data);\n * await stream.end();\n * \n * // Receive streams\n * streams.onStream('upload', async (stream) => {\n * const data = await stream.collect();\n * });\n */\nclass StreamManager {\n /** @type {Map<string, ReadableSignalStream>} */\n #activeStreams = new Map();\n\n /** @type {Map<string, Function>} */\n #streamHandlers = new Map();\n\n /** @type {Function} */\n #sendFn;\n\n /**\n * Creates a StreamManager.\n * \n * @param {Function} sendFn - Function to send messages: (peerId, message) => Promise.\n */\n constructor(sendFn) {\n this.#sendFn = sendFn;\n }\n\n /**\n * Creates a writable stream to send to a peer.\n * \n * @param {string} name - Stream name/type.\n * @param {string} peerId - Target peer ID.\n * @param {StreamOptions & { meta?: Object }} [options] - Options.\n * @returns {WritableSignalStream}\n */\n createStream(name, peerId, options = {}) {\n const sendFn = async (message) => {\n await this.#sendFn(peerId, message);\n };\n\n return new WritableSignalStream(sendFn, name, options);\n }\n\n /**\n * Registers a handler for incoming streams.\n * \n * @param {string} name - Stream name to handle.\n * @param {(stream: ReadableSignalStream) => Promise<void>} handler - Handler function.\n * @returns {Function} Unregister function.\n */\n onStream(name, handler) {\n this.#streamHandlers.set(name, handler);\n return () => this.#streamHandlers.delete(name);\n }\n\n /**\n * Handles incoming stream message.\n * Call this from CrossBus message handler.\n * \n * @param {Object} message - Stream message.\n * @param {string} peerId - Source peer ID.\n */\n handleMessage(message, peerId) {\n if (message.t !== 'stream') return;\n\n const streamId = message.sid;\n const streamType = message.st;\n\n switch (streamType) {\n case 'open':\n this.#handleOpen(streamId, message, peerId);\n break;\n case 'data':\n this.#handleData(streamId, message);\n break;\n case 'end':\n this.#handleEnd(streamId, message);\n break;\n case 'error':\n this.#handleError(streamId, message);\n break;\n }\n }\n\n /**\n * Handles stream open message.\n */\n #handleOpen(streamId, message, peerId) {\n const handler = this.#streamHandlers.get(message.name);\n if (!handler) {\n console.warn(`[CrossBus] No handler for stream: ${message.name}`);\n return;\n }\n\n const stream = new ReadableSignalStream(streamId, message.name, message.meta);\n this.#activeStreams.set(streamId, stream);\n\n // Call handler asynchronously\n handler(stream).catch(err => {\n console.error('[CrossBus] Stream handler error:', err);\n });\n }\n\n /**\n * Handles stream data message.\n */\n #handleData(streamId, message) {\n const stream = this.#activeStreams.get(streamId);\n if (!stream) return;\n\n stream.push(message);\n }\n\n /**\n * Handles stream end message.\n */\n #handleEnd(streamId, message) {\n const stream = this.#activeStreams.get(streamId);\n if (!stream) return;\n\n stream.end(message.meta);\n this.#activeStreams.delete(streamId);\n }\n\n /**\n * Handles stream error message.\n */\n #handleError(streamId, message) {\n const stream = this.#activeStreams.get(streamId);\n if (!stream) return;\n\n stream.error(message.reason);\n this.#activeStreams.delete(streamId);\n }\n\n /**\n * Gets count of active streams.\n * @returns {number}\n */\n get activeStreamCount() {\n return this.#activeStreams.size;\n }\n}\n\n/**\n * @fileoverview Presence system for CrossBus.\n * Tracks online peers with heartbeat-based detection.\n * @module core/presence\n */\n\n\n/**\n * @typedef {Object} PresenceOptions\n * @property {number} [heartbeatInterval=15000] - How often to send heartbeat (ms).\n * @property {number} [timeout=45000] - Time before peer considered offline (ms).\n * @property {boolean} [autoStart=true] - Start heartbeat automatically.\n */\n\n/**\n * @typedef {Object} PeerPresence\n * @property {string} peerId - Peer identifier.\n * @property {'online' | 'away' | 'offline'} status - Current status.\n * @property {number} lastSeen - Timestamp of last activity.\n * @property {Object} [meta] - Optional metadata (user info, etc).\n */\n\n/**\n * @typedef {'join' | 'leave' | 'update' | 'heartbeat'} PresenceEvent\n */\n\n/**\n * Presence manager for tracking online peers.\n * \n * Emits events:\n * - 'join' - Peer came online\n * - 'leave' - Peer went offline\n * - 'update' - Peer presence updated\n * \n * @example\n * const presence = new PresenceManager(sendFn, { peerId: 'my-peer' });\n * \n * presence.on('join', (peerId, meta) => console.log(`${peerId} is online`));\n * presence.on('leave', (peerId) => console.log(`${peerId} went offline`));\n * \n * // Get all online peers\n * const online = presence.getOnlinePeers();\n * \n * // Update own status\n * presence.setStatus('away');\n * \n * // Cleanup\n * presence.destroy();\n */\nclass PresenceManager extends EventEmitter {\n /** @type {string} */\n #peerId;\n\n /** @type {Function} */\n #sendFn;\n\n /** @type {Map<string, PeerPresence>} */\n #peers = new Map();\n\n /** @type {number} */\n #heartbeatInterval;\n\n /** @type {number} */\n #timeout;\n\n /** @type {ReturnType<typeof setInterval>|null} */\n #heartbeatTimer = null;\n\n /** @type {ReturnType<typeof setInterval>|null} */\n #cleanupTimer = null;\n\n /** @type {boolean} */\n #destroyed = false;\n\n /** @type {'online' | 'away' | 'offline'} */\n #status = 'online';\n\n /** @type {Object} */\n #meta = {};\n\n /**\n * Creates a PresenceManager.\n * \n * @param {Function} sendFn - Function to broadcast messages: (message) => Promise.\n * @param {{ peerId: string } & PresenceOptions} options - Options.\n */\n constructor(sendFn, options) {\n super();\n\n if (!options.peerId) {\n throw new Error('peerId is required');\n }\n\n this.#peerId = options.peerId;\n this.#sendFn = sendFn;\n this.#heartbeatInterval = options.heartbeatInterval ?? 15000;\n this.#timeout = options.timeout ?? 45000;\n\n if (options.autoStart !== false) {\n this.start();\n }\n }\n\n /**\n * Gets own peer ID.\n * @returns {string}\n */\n get peerId() {\n return this.#peerId;\n }\n\n /**\n * Gets own status.\n * @returns {'online' | 'away' | 'offline'}\n */\n get status() {\n return this.#status;\n }\n\n /**\n * Gets count of online peers.\n * @returns {number}\n */\n get onlineCount() {\n let count = 0;\n for (const peer of this.#peers.values()) {\n if (peer.status !== 'offline') count++;\n }\n return count;\n }\n\n /**\n * Starts the presence system.\n */\n start() {\n if (this.#heartbeatTimer) return;\n\n // Send initial presence\n this.#sendPresence('join');\n\n // Start heartbeat\n this.#heartbeatTimer = setInterval(() => {\n this.#sendPresence('heartbeat');\n }, this.#heartbeatInterval);\n\n // Start cleanup timer\n this.#cleanupTimer = setInterval(() => {\n this.#cleanupOfflinePeers();\n }, this.#heartbeatInterval);\n }\n\n /**\n * Stops the presence system.\n */\n stop() {\n if (this.#heartbeatTimer) {\n clearInterval(this.#heartbeatTimer);\n this.#heartbeatTimer = null;\n }\n\n if (this.#cleanupTimer) {\n clearInterval(this.#cleanupTimer);\n this.#cleanupTimer = null;\n }\n\n // Announce leaving\n this.#sendPresence('leave');\n }\n\n /**\n * Sets own presence status.\n * \n * @param {'online' | 'away' | 'offline'} status - New status.\n * @param {Object} [meta] - Optional metadata update.\n */\n setStatus(status, meta) {\n this.#status = status;\n if (meta) {\n this.#meta = { ...this.#meta, ...meta };\n }\n this.#sendPresence('update');\n }\n\n /**\n * Sets own metadata.\n * \n * @param {Object} meta - Metadata to merge.\n */\n setMeta(meta) {\n this.#meta = { ...this.#meta, ...meta };\n this.#sendPresence('update');\n }\n\n /**\n * Gets all online peer IDs.\n * \n * @returns {string[]}\n */\n getOnlinePeers() {\n const result = [];\n for (const [peerId, peer] of this.#peers) {\n if (peer.status !== 'offline') {\n result.push(peerId);\n }\n }\n return result;\n }\n\n /**\n * Gets all peer presences.\n * \n * @returns {PeerPresence[]}\n */\n getAllPeers() {\n return Array.from(this.#peers.values());\n }\n\n /**\n * Gets a specific peer's presence.\n * \n * @param {string} peerId - Peer ID.\n * @returns {PeerPresence | undefined}\n */\n getPeer(peerId) {\n return this.#peers.get(peerId);\n }\n\n /**\n * Checks if a peer is online.\n * \n * @param {string} peerId - Peer ID to check.\n * @returns {boolean}\n */\n isOnline(peerId) {\n const peer = this.#peers.get(peerId);\n return peer ? peer.status !== 'offline' : false;\n }\n\n /**\n * Handles incoming presence message.\n * Call this from CrossBus message handler.\n * \n * @param {Object} message - Presence message.\n * @param {string} fromPeerId - Source peer ID.\n */\n handleMessage(message, fromPeerId) {\n if (message.t !== 'presence') return;\n if (fromPeerId === this.#peerId) return; // Ignore own messages\n\n const { pt: presenceType, status, meta } = message;\n const now = Date.now();\n\n switch (presenceType) {\n case 'join':\n this.#handleJoin(fromPeerId, status, meta, now);\n // Respond with own presence so they know we're here\n this.#sendPresence('heartbeat');\n break;\n\n case 'leave':\n this.#handleLeave(fromPeerId);\n break;\n\n case 'heartbeat':\n case 'update':\n this.#handleUpdate(fromPeerId, status, meta, now);\n break;\n }\n }\n\n /**\n * Handles peer join.\n */\n #handleJoin(peerId, status, meta, now) {\n const isNew = !this.#peers.has(peerId);\n\n this.#peers.set(peerId, {\n peerId,\n status: status ?? 'online',\n lastSeen: now,\n meta: meta ?? {}\n });\n\n if (isNew) {\n this.emitSync('join', { peerId, meta });\n }\n }\n\n /**\n * Handles peer leave.\n */\n #handleLeave(peerId) {\n const peer = this.#peers.get(peerId);\n if (!peer) return;\n\n peer.status = 'offline';\n this.#peers.delete(peerId);\n this.emitSync('leave', { peerId });\n }\n\n /**\n * Handles presence update/heartbeat.\n */\n #handleUpdate(peerId, status, meta, now) {\n let peer = this.#peers.get(peerId);\n const wasOffline = !peer || peer.status === 'offline';\n\n if (!peer) {\n peer = {\n peerId,\n status: status ?? 'online',\n lastSeen: now,\n meta: meta ?? {}\n };\n this.#peers.set(peerId, peer);\n } else {\n peer.lastSeen = now;\n if (status) peer.status = status;\n if (meta) peer.meta = { ...peer.meta, ...meta };\n }\n\n if (wasOffline && peer.status !== 'offline') {\n this.emitSync('join', { peerId, meta: peer.meta });\n } else {\n this.emitSync('update', { peerId, peer });\n }\n }\n\n /**\n * Cleans up peers that haven't sent heartbeat.\n */\n #cleanupOfflinePeers() {\n const now = Date.now();\n const threshold = now - this.#timeout;\n\n for (const [peerId, peer] of this.#peers) {\n if (peer.lastSeen < threshold && peer.status !== 'offline') {\n peer.status = 'offline';\n this.#peers.delete(peerId);\n this.emitSync('leave', { peerId });\n }\n }\n }\n\n /**\n * Sends presence message.\n */\n async #sendPresence(type) {\n if (this.#destroyed) return;\n\n const message = {\n [PROTOCOL_MARKER]: PROTOCOL_VERSION,\n t: 'presence',\n pt: type,\n peerId: this.#peerId,\n status: this.#status,\n meta: this.#meta,\n ts: Date.now()\n };\n\n try {\n await this.#sendFn(message);\n } catch (e) {\n console.error('[CrossBus] Failed to send presence:', e);\n }\n }\n\n /**\n * Destroys the presence manager.\n */\n destroy() {\n if (this.#destroyed) return;\n\n this.#destroyed = true;\n this.stop();\n this.#peers.clear();\n }\n\n /**\n * Gets whether manager is destroyed.\n * @returns {boolean}\n */\n get isDestroyed() {\n return this.#destroyed;\n }\n}\n\n/**\n * Creates a presence manager integrated with CrossBus.\n * \n * @param {import('./cross-bus.js').CrossBus} bus - CrossBus instance.\n * @param {PresenceOptions} [options] - Options.\n * @returns {PresenceManager}\n * \n * @example\n * const bus = new CrossBus({ peerId: 'my-peer' });\n * const presence = createPresence(bus);\n * \n * presence.on('join', (peerId) => console.log(`${peerId} joined`));\n */\nfunction createPresence(bus, options = {}) {\n const sendFn = async (message) => {\n // Broadcast to all peers\n await bus.signal('__presence__', message);\n };\n\n const presence = new PresenceManager(sendFn, {\n peerId: bus.peerId,\n ...options\n });\n\n // Register handler for presence messages\n bus.on('__presence__', (message, ctx) => {\n presence.handleMessage(message, ctx?.peerId ?? message.peerId);\n });\n\n return presence;\n}\n\n/**\n * @fileoverview Serialization abstraction layer for CrossBus.\n * Uses JSON serialization for maximum compatibility.\n * @module common/serialization\n */\n\n/**\n * @typedef {Object} Serializer\n * @property {string} contentType - MIME type of the serialization format.\n * @property {function(*): string} serialize - Encodes data.\n * @property {function(string): *} deserialize - Decodes data.\n */\n\n/**\n * Standard JSON Serializer (Default).\n * Compatible with all browsers, native bridges (iOS/Android), and standard tooling.\n * @type {Serializer}\n */\nconst JSONSerializer = {\n contentType: 'application/json',\n serialize: (data) => JSON.stringify(data),\n deserialize: (data) => JSON.parse(/** @type {string} */(data))\n};\n\n/**\n * Registry of available serializers.\n * Extensible for future formats if needed.\n */\nconst serializers = new Map();\nserializers.set(JSONSerializer.contentType, JSONSerializer);\n\n/**\n * Gets a serializer by content type.\n * Defaults to JSON if not found.\n * \n * @param {string} contentType \n * @returns {Serializer}\n */\nfunction getSerializer(contentType) {\n return serializers.get(contentType) || JSONSerializer;\n}\n\n/**\n * @fileoverview PostMessage transport for iframes, popups, and workers.\n * Handles message serialization, origin validation, and bidirectional communication.\n * @module transports/postmessage\n */\n\n\n/**\n * @typedef {Window|Worker|ServiceWorker|MessagePort} PostMessageTarget\n * Target that supports postMessage API.\n */\n\n/**\n * @typedef {Object} PostMessageTransportOptions\n * @property {string} [targetOrigin='*'] - Expected origin for outgoing messages.\n * @property {string[]} [allowedOrigins=[]] - Allowed origins for incoming messages.\n * Empty = same origin only.\n * @property {boolean} [autoTransfer=false] - Auto-detect and transfer transferable objects.\n * @property {string} [contentType='application/json'] - Serialization format.\n */\n\n/**\n * @typedef {Object} MessageSource\n * @property {string} origin - Origin of the message.\n * @property {PostMessageTarget} source - The window/worker that sent the message.\n */\n\n/**\n * @callback MessageHandler\n * @param {Object} message - The received protocol message.\n * @param {MessageSource} source - Info about the message source.\n */\n\n/**\n * PostMessage-based transport for cross-context communication.\n * \n * Supports:\n * - Window to Window (iframe, popup)\n * - Main thread to Worker\n * - Main thread to ServiceWorker\n * \n * @example\n * // Connect to iframe\n * const iframe = document.getElementById('widget');\n * const transport = new PostMessageTransport(iframe.contentWindow, {\n * targetOrigin: 'https://widget.example.com',\n * allowedOrigins: ['https://widget.example.com']\n * });\n * \n * transport.onMessage((msg, source) => {\n * console.log('Received:', msg, 'from:', source.origin);\n * });\n * \n * transport.send({ type: 'greeting', payload: { hello: 'world' } });\n * \n * // Cleanup\n * transport.destroy();\n */\nclass PostMessageTransport {\n /** @type {PostMessageTarget|null} */\n #target = null;\n\n /** @type {string} */\n #targetOrigin;\n\n /** @type {Set<string>} */\n #allowedOrigins;\n\n /** @type {boolean} */\n #autoTransfer;\n\n /** @type {import('../common/serialization.js').Serializer} */\n #serializer;\n\n /** @type {string} */\n #contentType;\n\n /** @type {MessageHandler|null} */\n #messageHandler = null;\n\n /** @type {Function|null} */\n #boundListener = null;\n\n /** @type {boolean} */\n #destroyed = false;\n\n /**\n * Checks if PostMessage API is available.\n * \n * @returns {boolean} True if postMessage is supported.\n */\n static isSupported() {\n return typeof globalThis.postMessage === 'function' ||\n typeof Window !== 'undefined';\n }\n\n /**\n * Creates a new PostMessage transport.\n * \n * @param {PostMessageTarget} target - The window/worker to communicate with.\n * @param {PostMessageTransportOptions} [options={}] - Configuration options.\n * @throws {TypeError} If target is not a valid postMessage target.\n */\n constructor(target, options = {}) {\n if (!this.#isValidTarget(target)) {\n throw new TypeError('Target must support postMessage');\n }\n\n this.#target = target;\n this.#targetOrigin = options.targetOrigin ?? '*';\n this.#allowedOrigins = new Set(options.allowedOrigins ?? []);\n this.#autoTransfer = options.autoTransfer ?? false;\n this.#contentType = options.contentType ?? 'application/json';\n this.#serializer = getSerializer(this.#contentType);\n\n // Development security warning\n const isDev = typeof process !== 'undefined'\n ? process.env?.NODE_ENV !== 'production'\n : typeof window !== 'undefined' && window.location?.hostname === 'localhost';\n\n if (isDev && this.#targetOrigin === '*') {\n console.warn(\n '[CrossBus Security] ⚠️ targetOrigin: \"*\" broadcasts to ANY window.\\n' +\n 'This is INSECURE in production. Use specific origin:\\n' +\n ' targetOrigin: \"https://iframe-domain.com\"\\n' +\n 'Suppress this warning with NODE_ENV=production'\n );\n }\n\n // Set up message listener\n this.#boundListener = this.#handleMessage.bind(this);\n this.#getListenerTarget().addEventListener('message', /** @type {EventListener} */(this.#boundListener));\n }\n\n /**\n * Sends a message to the target.\n * \n * @param {Object} message - Protocol message to send.\n * @param {Transferable[]} [transfer] - Transferable objects to pass.\n * @throws {CrossBusError} If transport is destroyed or target is closed.\n * \n * @example\n * // Simple send\n * transport.send({ t: 'sig', id: '123', p: { data: 'value' } });\n * \n * // With transferable\n * const buffer = new ArrayBuffer(1024);\n * transport.send({ t: 'sig', id: '456', p: buffer }, [buffer]);\n */\n send(message, transfer) {\n if (this.#destroyed) {\n throw CrossBusError.from(ErrorCode.DESTROYED, {\n context: 'PostMessageTransport.send'\n });\n }\n\n // Check if window is closed\n if (this.#isWindowClosed()) {\n throw CrossBusError.from(ErrorCode.PEER_DISCONNECTED, {\n reason: 'Target window is closed'\n });\n }\n\n // Ensure message has protocol marker\n const envelope = {\n [PROTOCOL_MARKER]: PROTOCOL_VERSION,\n ...message\n };\n\n // Serialize if needed\n // Note: PostMessage can handle objects natively. \n // We only serialize if strictly requested (e.g. for consistency or size optimization)\n // OR if the serializer is NOT JSON.\n let dataToSend = envelope;\n if (this.#contentType !== 'application/json') {\n dataToSend = this.#serializer.serialize(envelope);\n }\n\n // Auto-detect transferables if enabled\n let transferables = transfer;\n if (this.#autoTransfer && !transfer) {\n transferables = findTransferables(message);\n if (transferables.length === 0) {\n transferables = undefined;\n }\n }\n\n // Send based on target type\n if (this.#isWorker()) {\n // Workers don't need origin\n /** @type {Worker} */(this.#target).postMessage(dataToSend, /** @type {any} */(transferables));\n } else {\n // Windows need origin\n /** @type {Window} */(this.#target).postMessage(envelope, this.#targetOrigin, transferables);\n }\n }\n\n /**\n * Registers a message handler.\n * Only one handler can be registered; subsequent calls replace previous.\n * \n * @param {MessageHandler} handler - Function to handle incoming messages.\n * \n * @example\n * transport.onMessage((msg, source) => {\n * if (msg.t === 'req') {\n * // Handle request\n * }\n * });\n */\n onMessage(handler) {\n if (typeof handler !== 'function') {\n throw new TypeError('Handler must be a function');\n }\n this.#messageHandler = handler;\n }\n\n /**\n * Removes the message handler.\n */\n offMessage() {\n this.#messageHandler = null;\n }\n\n /**\n * Destroys the transport, removing all listeners.\n * After destruction, send() will throw.\n */\n destroy() {\n if (this.#destroyed) return;\n\n this.#destroyed = true;\n this.#messageHandler = null;\n\n if (this.#boundListener) {\n this.#getListenerTarget().removeEventListener('message', /** @type {EventListener} */(this.#boundListener));\n this.#boundListener = null;\n }\n }\n\n /**\n * Checks if transport has been destroyed.\n * @returns {boolean}\n */\n get isDestroyed() {\n return this.#destroyed;\n }\n\n /**\n * Gets the target origin.\n * @returns {string}\n */\n get targetOrigin() {\n return this.#targetOrigin;\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Private methods\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Handles incoming message events.\n * \n * @param {MessageEvent} event\n */\n #handleMessage(event) {\n // Skip if no handler\n if (!this.#messageHandler) return;\n\n // Get message data\n let data = event.data;\n\n // Skip non-protocol messages\n if (!isProtocolMessage(data)) return;\n\n // Validate origin (skip for workers which don't have origin)\n if (event.origin && !this.#isOriginAllowed(event.origin)) {\n console.warn(`[CrossBus] Blocked message from unauthorized origin: ${event.origin}`);\n return;\n }\n\n // Validate source matches target (if target is a Window/MessagePort)\n // We can't strictly validate for Workers as event.source might be null or different in some contexts\n if (this.#target && 'postMessage' in this.#target && !this.#isWorker()) {\n if (event.source !== this.#target) return;\n }\n\n // Invoke handler\n try {\n this.#messageHandler(data, {\n origin: event.origin ?? 'worker',\n source: /** @type {PostMessageTarget} */(/** @type {any} */(event.source ?? event.currentTarget))\n });\n } catch (error) {\n console.error('[CrossBus] Message handler error:', error);\n }\n }\n\n /**\n * Checks if an origin is allowed.\n * \n * @param {string} origin\n * @returns {boolean}\n */\n #isOriginAllowed(origin) {\n // If no origins specified, only allow same origin\n if (this.#allowedOrigins.size === 0) {\n return origin === globalThis.location?.origin;\n }\n\n // Check for wildcard\n if (this.#allowedOrigins.has('*')) {\n return true;\n }\n\n // Check exact match\n if (this.#allowedOrigins.has(origin)) {\n return true;\n }\n\n // Check wildcard pattern (e.g., https://*.example.com)\n for (const pattern of this.#allowedOrigins) {\n if (pattern.includes('*')) {\n // Use bounded quantifier to prevent ReDoS\n const regex = new RegExp('^' + pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\\\\\*/g, '[a-zA-Z0-9.-]{0,253}') + '$');\n if (regex.test(origin)) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Checks if target is a valid postMessage target.\n * \n * @param {*} target\n * @returns {boolean}\n */\n #isValidTarget(target) {\n if (!target) return false;\n return typeof target.postMessage === 'function';\n }\n\n /**\n * Checks if target is a Worker or ServiceWorker.\n * \n * @returns {boolean}\n */\n #isWorker() {\n if (typeof Worker !== 'undefined' && this.#target instanceof Worker) {\n return true;\n }\n if (typeof ServiceWorker !== 'undefined' && this.#target instanceof ServiceWorker) {\n return true;\n }\n if (typeof MessagePort !== 'undefined' && this.#target instanceof MessagePort) {\n return true;\n }\n return false;\n }\n\n /**\n * Checks if the target window is closed.\n * \n * @returns {boolean}\n */\n #isWindowClosed() {\n if (this.#isWorker()) return false;\n return /** @type {Window} */(this.#target).closed === true;\n }\n\n /**\n * Gets the object to attach message listener to.\n * For workers, we listen on the worker itself.\n * For windows, we listen on the current window.\n * \n * @returns {EventTarget}\n */\n #getListenerTarget() {\n // If inside worker, listen on self\n if (typeof DedicatedWorkerGlobalScope !== 'undefined' &&\n globalThis instanceof DedicatedWorkerGlobalScope) {\n return globalThis;\n }\n\n // Main thread listening to worker - listen on worker\n if (this.#isWorker()) {\n return /** @type {EventTarget} */(/** @type {any} */(this.#target));\n }\n\n // Window communication - listen on current window\n if (typeof window !== 'undefined') {\n return window;\n }\n\n return globalThis;\n }\n}\n\n/**\n * @fileoverview BroadcastChannel transport for same-origin tab communication.\n * Uses the BroadcastChannel API for efficient pub/sub across browser contexts.\n * @module transports/broadcast-channel\n */\n\n\n/**\n * @typedef {Object} BroadcastChannelTransportOptions\n * @property {string} [channelName='crossbus:default'] - Name of the broadcast channel.\n * @property {string} [contentType='application/json'] - Serialization format.\n */\n\n/**\n * @typedef {Object} MessageContext\n * @property {string} origin - Always 'broadcast' for this transport.\n */\n\n/**\n * @callback MessageHandler\n * @param {Object} message - The received protocol message.\n * @param {MessageContext} context - Context information.\n */\n\n/**\n * BroadcastChannel-based transport for same-origin communication.\n * \n * Perfect for:\n * - Multiple tabs of the same app\n * - Communication without opening connections\n * - Pub/sub pattern across contexts\n * \n * Limitations:\n * - Same-origin only (no cross-origin)\n * - No guaranteed delivery order\n * - No acknowledgments (fire-and-forget)\n * \n * @example\n * // Create transport\n * const transport = new BroadcastChannelTransport({\n * channelName: 'myapp:events'\n * });\n * \n * // Listen for messages\n * transport.onMessage((msg, ctx) => {\n * console.log('Received:', msg);\n * });\n * \n * // Send message (to all other tabs)\n * transport.send({ type: 'notification', payload: { text: 'Hello!' } });\n * \n * // Cleanup\n * transport.destroy();\n */\nclass BroadcastChannelTransport {\n /** @type {BroadcastChannel} */\n #channel;\n\n /** @type {string} */\n #channelName;\n\n /** @type {import('../common/serialization.js').Serializer} */\n #serializer;\n\n /** @type {string} */\n #contentType;\n\n /** @type {MessageHandler|null} */\n #messageHandler = null;\n\n /** @type {boolean} */\n #destroyed = false;\n\n /**\n * Checks if BroadcastChannel API is available.\n * \n * @returns {boolean} True if BroadcastChannel is supported.\n */\n static isSupported() {\n return typeof BroadcastChannel !== 'undefined';\n }\n\n /**\n * Creates a new BroadcastChannel transport.\n * \n * @param {BroadcastChannelTransportOptions} [options={}] - Configuration.\n * @throws {CrossBusError} If BroadcastChannel is not supported.\n */\n constructor(options = {}) {\n if (!BroadcastChannelTransport.isSupported()) {\n throw CrossBusError.from(ErrorCode.UNSUPPORTED, {\n api: 'BroadcastChannel'\n });\n }\n\n this.#channelName = options.channelName ?? 'crossbus:default';\n this.#channel = new BroadcastChannel(this.#channelName);\n this.#contentType = options.contentType ?? 'application/json';\n this.#serializer = getSerializer(this.#contentType);\n\n // Set up message handler\n this.#channel.onmessage = this.#handleMessage.bind(this);\n this.#channel.onmessageerror = this.#handleError.bind(this);\n }\n\n /**\n * Sends a message to all other tabs/windows.\n * \n * @param {Object} message - Protocol message to send.\n * @throws {CrossBusError} If transport is destroyed.\n * \n * @example\n * transport.send({\n * t: 'broadcast',\n * id: 'abc123',\n * p: { event: 'user:login' }\n * });\n */\n send(message) {\n if (this.#destroyed) {\n throw CrossBusError.from(ErrorCode.DESTROYED, {\n context: 'BroadcastChannelTransport.send'\n });\n }\n\n // Ensure message has protocol marker\n const envelope = {\n [PROTOCOL_MARKER]: PROTOCOL_VERSION,\n ...message\n };\n\n let dataToSend = envelope;\n if (this.#contentType !== 'application/json') {\n dataToSend = this.#serializer.serialize(envelope);\n }\n\n this.#channel.postMessage(dataToSend);\n }\n\n /**\n * Registers a message handler.\n * Only one handler can be registered; subsequent calls replace previous.\n * \n * @param {MessageHandler} handler - Function to handle incoming messages.\n */\n onMessage(handler) {\n if (typeof handler !== 'function') {\n throw new TypeError('Handler must be a function');\n }\n this.#messageHandler = handler;\n }\n\n /**\n * Removes the message handler.\n */\n offMessage() {\n this.#messageHandler = null;\n }\n\n /**\n * Destroys the transport, closing the channel.\n */\n destroy() {\n if (this.#destroyed) return;\n\n this.#destroyed = true;\n this.#messageHandler = null;\n\n if (this.#channel) {\n this.#channel.close();\n this.#channel = /** @type {any} */(null);\n }\n }\n\n /**\n * Gets the channel name.\n * @returns {string}\n */\n get channelName() {\n return this.#channelName;\n }\n\n /**\n * Checks if transport has been destroyed.\n * @returns {boolean}\n */\n get isDestroyed() {\n return this.#destroyed;\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Private methods\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Handles incoming message events.\n * \n * @param {MessageEvent} event\n */\n #handleMessage(event) {\n // Skip if no handler\n if (!this.#messageHandler) return;\n\n // Deserialize if binary (convert to string first)\n let data = event.data;\n if (data instanceof ArrayBuffer || data instanceof Uint8Array) {\n try {\n const text = new TextDecoder().decode(data instanceof ArrayBuffer ? new Uint8Array(data) : data);\n data = JSONSerializer.deserialize(text);\n } catch (e) {\n console.warn('[CrossBus] Failed to deserialize binary message', e);\n return;\n }\n }\n\n // Skip non-protocol messages\n if (!isProtocolMessage(data)) return;\n\n // Invoke handler\n try {\n this.#messageHandler(data, {\n origin: 'broadcast'\n });\n } catch (error) {\n console.error('[CrossBus] BroadcastChannel handler error:', error);\n }\n }\n\n /**\n * Handles message errors (e.g., deserialization failures).\n * \n * @param {MessageEvent} event\n */\n #handleError(event) {\n console.error('[CrossBus] BroadcastChannel message error:', event);\n }\n}\n\n/**\n * @fileoverview MessageChannel transport for direct 1:1 peer communication.\n * Uses the MessageChannel API for efficient, low-latency communication.\n * @module transports/message-channel\n */\n\n\n/**\n * @typedef {Object} MessageChannelTransportOptions\n * @property {boolean} [autoTransfer=false] - Auto-detect and transfer transferable objects.\n * @property {string} [contentType='application/json'] - Serialization format.\n */\n\n/**\n * @typedef {Object} ChannelPair\n * @property {MessagePort} local - Local port (we listen on this).\n * @property {MessagePort} remote - Remote port (send this to other context).\n */\n\n/**\n * @typedef {Object} MessageContext\n * @property {string} origin - Always 'channel' for this transport.\n */\n\n/**\n * @callback MessageHandler\n * @param {Object} message - The received protocol message.\n * @param {MessageContext} context - Context information.\n */\n\n/**\n * MessageChannel-based transport for direct peer-to-peer communication.\n * \n * This transport creates a direct communication channel that bypasses\n * the hub routing, providing lower latency for high-frequency peer pairs.\n * \n * Use cases:\n * - Direct iframe ↔ worker communication\n * - High-frequency data streams\n * - Bypassing hub for performance\n * \n * @example\n * // On hub side: create channel and send to peer\n * const transport = new MessageChannelTransport();\n * iframe.contentWindow.postMessage(\n * { type: 'channel', port: transport.remotePort },\n * '*',\n * [transport.remotePort]\n * );\n * \n * // On peer side: wrap received port\n * window.addEventListener('message', (e) => {\n * if (e.data.type === 'channel') {\n * const transport = MessageChannelTransport.fromPort(e.data.port);\n * transport.onMessage((msg) => console.log('Received:', msg));\n * }\n * });\n */\nclass MessageChannelTransport {\n /** @type {MessagePort} */\n #localPort;\n\n /** @type {MessagePort|null} */\n #remotePort;\n\n /** @type {boolean} */\n #autoTransfer;\n\n /** @type {import('../common/serialization.js').Serializer} */\n #serializer;\n\n /** @type {string} */\n #contentType;\n\n /** @type {MessageHandler|null} */\n #messageHandler = null;\n\n /** @type {boolean} */\n #destroyed = false;\n\n /** @type {boolean} */\n #isInitiator;\n\n /**\n * Checks if MessageChannel API is available.\n * \n * @returns {boolean} True if MessageChannel is supported.\n */\n static isSupported() {\n return typeof MessageChannel !== 'undefined';\n }\n\n /**\n * Creates a MessageChannelTransport from an existing port.\n * Use this when receiving a port from another context.\n * \n * @param {MessagePort} port - The received port.\n * @param {MessageChannelTransportOptions} [options={}] - Configuration.\n * @returns {MessageChannelTransport}\n */\n static fromPort(port, options = {}) {\n if (!(port instanceof MessagePort)) {\n throw new TypeError('Port must be a MessagePort');\n }\n\n const transport = Object.create(MessageChannelTransport.prototype);\n transport.#localPort = port;\n transport.#remotePort = null; // Not available when wrapping existing port\n transport.#autoTransfer = options.autoTransfer ?? false;\n transport.#contentType = options.contentType ?? 'application/json';\n transport.#serializer = getSerializer(transport.#contentType);\n transport.#destroyed = false;\n transport.#isInitiator = false;\n transport.#messageHandler = null;\n\n // Set up message handler\n transport.#localPort.onmessage = transport.#handleMessage.bind(transport);\n transport.#localPort.onmessageerror = transport.#handleError.bind(transport);\n\n return transport;\n }\n\n /**\n * Creates a new MessageChannel transport (as initiator).\n * The remote port should be sent to the other context via postMessage.\n * \n * @param {MessageChannelTransportOptions} [options={}] - Configuration.\n * @throws {CrossBusError} If MessageChannel is not supported.\n */\n constructor(options = {}) {\n if (!MessageChannelTransport.isSupported()) {\n throw CrossBusError.from(ErrorCode.UNSUPPORTED, {\n api: 'MessageChannel'\n });\n }\n\n const channel = new MessageChannel();\n this.#localPort = channel.port1;\n this.#remotePort = channel.port2;\n this.#autoTransfer = options.autoTransfer ?? false;\n this.#contentType = options.contentType ?? 'application/json';\n this.#serializer = getSerializer(this.#contentType);\n this.#isInitiator = true;\n\n // Set up message handler\n this.#localPort.onmessage = this.#handleMessage.bind(this);\n this.#localPort.onmessageerror = this.#handleError.bind(this);\n }\n\n /**\n * Gets the remote port to send to the other context.\n * This port can only be accessed once and becomes null after transfer.\n * \n * @returns {MessagePort|null} The remote port, or null if already transferred.\n */\n get remotePort() {\n return this.#remotePort;\n }\n\n /**\n * Marks the remote port as transferred (called automatically when used).\n */\n markRemoteTransferred() {\n this.#remotePort = null;\n }\n\n /**\n * Checks if this transport was created as the channel initiator.\n * @returns {boolean}\n */\n get isInitiator() {\n return this.#isInitiator;\n }\n\n /**\n * Sends a message to the connected peer.\n * \n * @param {Object} message - Protocol message to send.\n * @param {Transferable[]} [transfer] - Transferable objects to pass.\n * @throws {CrossBusError} If transport is destroyed.\n */\n send(message, transfer) {\n if (this.#destroyed) {\n throw CrossBusError.from(ErrorCode.DESTROYED, {\n context: 'MessageChannelTransport.send'\n });\n }\n\n // Ensure message has protocol marker\n const envelope = {\n [PROTOCOL_MARKER]: PROTOCOL_VERSION,\n ...message\n };\n\n let dataToSend = envelope;\n if (this.#contentType !== 'application/json') {\n dataToSend = this.#serializer.serialize(envelope);\n }\n\n // Auto-detect transferables if enabled\n let transferables = transfer;\n if (this.#autoTransfer && !transfer) {\n transferables = findTransferables(message);\n if (transferables.length === 0) {\n transferables = undefined;\n }\n }\n\n this.#localPort.postMessage(dataToSend, /** @type {any} */(transferables));\n }\n\n /**\n * Registers a message handler.\n * Only one handler can be registered; subsequent calls replace previous.\n * \n * @param {MessageHandler} handler - Function to handle incoming messages.\n */\n onMessage(handler) {\n if (typeof handler !== 'function') {\n throw new TypeError('Handler must be a function');\n }\n this.#messageHandler = handler;\n }\n\n /**\n * Removes the message handler.\n */\n offMessage() {\n this.#messageHandler = null;\n }\n\n /**\n * Destroys the transport, closing ports.\n */\n destroy() {\n if (this.#destroyed) return;\n\n this.#destroyed = true;\n this.#messageHandler = null;\n\n if (this.#localPort) {\n this.#localPort.close();\n this.#localPort = /** @type {any} */(null);\n }\n\n if (this.#remotePort) {\n this.#remotePort.close();\n this.#remotePort = null;\n }\n }\n\n /**\n * Checks if transport has been destroyed.\n * @returns {boolean}\n */\n get isDestroyed() {\n return this.#destroyed;\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Private methods\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Handles incoming message events.\n * \n * @param {MessageEvent} event\n */\n #handleMessage(event) {\n // Skip if no handler\n if (!this.#messageHandler) return;\n\n // Get message data\n let data = event.data;\n\n // Skip non-protocol messages\n if (!isProtocolMessage(data)) return;\n\n // Invoke handler\n try {\n this.#messageHandler(data, {\n origin: 'channel'\n });\n } catch (error) {\n console.error('[CrossBus] MessageChannel handler error:', error);\n }\n }\n\n /**\n * Handles message errors.\n * \n * @param {MessageEvent} event\n */\n #handleError(event) {\n console.error('[CrossBus] MessageChannel error:', event);\n }\n}\n\n/**\n * @fileoverview SharedWorker transport for tab communication via shared state.\n * Uses SharedWorker API for efficient cross-tab communication with shared context.\n * @module transports/shared-worker\n */\n\n\n/**\n * @typedef {Object} SharedWorkerTransportOptions\n * @property {string} [workerUrl] - URL to the SharedWorker script.\n * @property {string} [name] - Optional name for the SharedWorker.\n */\n\n/**\n * @typedef {Object} MessageContext\n * @property {string} origin - Always 'sharedworker' for this transport.\n */\n\n/**\n * @callback MessageHandler\n * @param {Object} message - The received protocol message.\n * @param {MessageContext} context - Context information.\n */\n\n/**\n * SharedWorker-based transport for tab communication.\n * \n * SharedWorkers persist across page refreshes and are shared between\n * all tabs/windows of the same origin. This enables:\n * - Shared state across tabs\n * - Single connection to backend (via worker)\n * - Efficient broadcast to all tabs\n * \n * @example\n * // Create transport\n * const transport = new SharedWorkerTransport({\n * workerUrl: '/crossbus-worker.js'\n * });\n * \n * // Listen for messages\n * transport.onMessage((msg, ctx) => {\n * console.log('Received:', msg);\n * });\n * \n * // Send message (goes through shared worker to all tabs)\n * transport.send({ t: 'sig', p: { event: 'user:action' } });\n * \n * // Cleanup\n * transport.destroy();\n */\nclass SharedWorkerTransport {\n /** @type {SharedWorker|null} */\n #worker = null;\n\n /** @type {MessagePort|null} */\n #port = null;\n\n /** @type {string} */\n #workerUrl;\n\n /** @type {MessageHandler|null} */\n #messageHandler = null;\n\n /** @type {boolean} */\n #destroyed = false;\n\n /**\n * Checks if SharedWorker API is available.\n * \n * @returns {boolean} True if SharedWorker is supported.\n */\n static isSupported() {\n return typeof SharedWorker !== 'undefined';\n }\n\n /**\n * Creates a new SharedWorker transport.\n * \n * @param {SharedWorkerTransportOptions} [options={}] - Configuration.\n * @throws {CrossBusError} If SharedWorker is not supported.\n */\n constructor(options = {}) {\n if (!SharedWorkerTransport.isSupported()) {\n throw CrossBusError.from(ErrorCode.UNSUPPORTED, {\n api: 'SharedWorker'\n });\n }\n\n this.#workerUrl = options.workerUrl ?? '/crossbus-shared-worker.js';\n\n // Create SharedWorker\n this.#worker = new SharedWorker(this.#workerUrl, options.name);\n this.#port = this.#worker.port;\n\n // Set up message handler on port\n this.#port.onmessage = this.#handleMessage.bind(this);\n this.#port.onmessageerror = this.#handleError.bind(this);\n\n // Handle worker errors\n this.#worker.onerror = this.#handleWorkerError.bind(this);\n\n // Start the port (required for SharedWorker)\n this.#port.start();\n }\n\n /**\n * Sends a message through the SharedWorker.\n * \n * @param {Object} message - Protocol message to send.\n * @param {Transferable[]} [transfer] - Transferable objects.\n * @throws {CrossBusError} If transport is destroyed.\n */\n send(message, transfer) {\n if (this.#destroyed) {\n throw CrossBusError.from(ErrorCode.DESTROYED, {\n context: 'SharedWorkerTransport.send'\n });\n }\n\n // Ensure message has protocol marker\n const envelope = {\n [PROTOCOL_MARKER]: PROTOCOL_VERSION,\n ...message\n };\n\n if (!this.#port) return;\n\n if (transfer && transfer.length > 0) {\n this.#port.postMessage(envelope, transfer);\n } else {\n this.#port.postMessage(envelope);\n }\n }\n\n /**\n * Registers a message handler.\n * Only one handler can be registered; subsequent calls replace previous.\n * \n * @param {MessageHandler} handler - Function to handle incoming messages.\n */\n onMessage(handler) {\n if (typeof handler !== 'function') {\n throw new TypeError('Handler must be a function');\n }\n this.#messageHandler = handler;\n }\n\n /**\n * Removes the message handler.\n */\n offMessage() {\n this.#messageHandler = null;\n }\n\n /**\n * Destroys the transport, closing the port.\n */\n destroy() {\n if (this.#destroyed) return;\n\n this.#destroyed = true;\n this.#messageHandler = null;\n\n if (this.#port) {\n this.#port.close();\n this.#port = null;\n }\n\n this.#worker = null;\n }\n\n /**\n * Gets the worker URL.\n * @returns {string}\n */\n get workerUrl() {\n return this.#workerUrl;\n }\n\n /**\n * Checks if transport has been destroyed.\n * @returns {boolean}\n */\n get isDestroyed() {\n return this.#destroyed;\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Private methods\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Handles incoming messages from the SharedWorker.\n * \n * @param {MessageEvent} event\n */\n #handleMessage(event) {\n // Skip if no handler\n if (!this.#messageHandler) return;\n\n // Skip non-protocol messages\n if (!isProtocolMessage(event.data)) return;\n\n // Invoke handler\n try {\n this.#messageHandler(event.data, {\n origin: 'sharedworker'\n });\n } catch (error) {\n console.error('[CrossBus] SharedWorker handler error:', error);\n }\n }\n\n /**\n * Handles message errors.\n * \n * @param {MessageEvent} event\n */\n #handleError(event) {\n console.error('[CrossBus] SharedWorker message error:', event);\n }\n\n /**\n * Handles worker-level errors.\n * \n * @param {ErrorEvent} event\n */\n #handleWorkerError(event) {\n console.error('[CrossBus] SharedWorker error:', event.message);\n }\n}\n\n/**\n * @fileoverview ServiceWorker transport for offline-capable communication.\n * Uses ServiceWorker API for background sync and offline messaging.\n * @module transports/service-worker\n */\n\n\n/**\n * @typedef {Object} ServiceWorkerTransportOptions\n * @property {number} [timeout=5000] - Timeout waiting for ready state.\n */\n\n/**\n * @typedef {Object} MessageContext\n * @property {string} origin - Always 'serviceworker' for this transport.\n */\n\n/**\n * @callback MessageHandler\n * @param {Object} message - The received protocol message.\n * @param {MessageContext} context - Context information.\n */\n\n/**\n * ServiceWorker-based transport for offline-capable communication.\n * \n * ServiceWorkers run in the background and can:\n * - Handle messages even when page is not focused\n * - Queue messages for offline delivery\n * - Sync state across all tabs\n * \n * @example\n * const transport = new ServiceWorkerTransport();\n * \n * // Wait for ServiceWorker to be ready\n * await transport.ready;\n * \n * // Listen for messages\n * transport.onMessage((msg, ctx) => {\n * console.log('Received from SW:', msg);\n * });\n * \n * // Send message to ServiceWorker\n * transport.send({ t: 'sig', id: 'abc', p: { event: 'sync' } });\n * \n * // Cleanup\n * transport.destroy();\n */\nclass ServiceWorkerTransport {\n /** @type {ServiceWorker|null} */\n #controller = null;\n\n /** @type {MessageHandler|null} */\n #messageHandler = null;\n\n /** @type {boolean} */\n #destroyed = false;\n\n /** @type {Promise<void>} */\n #readyPromise;\n\n /** @type {Function|null} */\n #boundMessageHandler = null;\n\n /**\n * Checks if ServiceWorker API is available.\n * \n * @returns {boolean} True if ServiceWorker is supported.\n */\n static isSupported() {\n return typeof navigator !== 'undefined' &&\n 'serviceWorker' in navigator;\n }\n\n /**\n * Creates a new ServiceWorker transport.\n * \n * @param {ServiceWorkerTransportOptions} [options={}] - Configuration.\n * @throws {CrossBusError} If ServiceWorker is not supported.\n */\n constructor(options = {}) {\n if (!ServiceWorkerTransport.isSupported()) {\n throw CrossBusError.from(ErrorCode.UNSUPPORTED, {\n api: 'ServiceWorker'\n });\n }\n\n // Initialize ready promise\n this.#readyPromise = this.#initialize();\n }\n\n /**\n * Promise that resolves when transport is ready.\n * @returns {Promise<void>}\n */\n get ready() {\n return this.#readyPromise;\n }\n\n /**\n * Initializes the ServiceWorker connection.\n * \n */\n async #initialize() {\n // Wait for ServiceWorker to be ready\n const registration = await navigator.serviceWorker.ready;\n\n this.#controller = registration.active || navigator.serviceWorker.controller;\n\n // Set up message handler\n this.#boundMessageHandler = this.#handleMessage.bind(this);\n navigator.serviceWorker.addEventListener('message', /** @type {EventListener} */(this.#boundMessageHandler));\n }\n\n /**\n * Sends a message to the ServiceWorker.\n * \n * @param {Object} message - Protocol message to send.\n * @param {Transferable[]} [transfer] - Transferable objects.\n * @throws {CrossBusError} If transport is destroyed or no controller.\n */\n send(message, transfer) {\n if (this.#destroyed) {\n throw CrossBusError.from(ErrorCode.DESTROYED, {\n context: 'ServiceWorkerTransport.send'\n });\n }\n\n if (!this.#controller) {\n throw CrossBusError.from(ErrorCode.NOT_CONNECTED, {\n context: 'ServiceWorkerTransport.send',\n reason: 'No active ServiceWorker'\n });\n }\n\n // Ensure message has protocol marker\n const envelope = {\n [PROTOCOL_MARKER]: PROTOCOL_VERSION,\n ...message\n };\n\n if (transfer && transfer.length > 0) {\n this.#controller.postMessage(envelope, transfer);\n } else {\n this.#controller.postMessage(envelope);\n }\n }\n\n /**\n * Registers a message handler.\n * \n * @param {MessageHandler} handler - Function to handle incoming messages.\n */\n onMessage(handler) {\n if (typeof handler !== 'function') {\n throw new TypeError('Handler must be a function');\n }\n this.#messageHandler = handler;\n }\n\n /**\n * Removes the message handler.\n */\n offMessage() {\n this.#messageHandler = null;\n }\n\n /**\n * Destroys the transport.\n */\n destroy() {\n if (this.#destroyed) return;\n\n this.#destroyed = true;\n this.#messageHandler = null;\n\n if (this.#boundMessageHandler) {\n navigator.serviceWorker.removeEventListener('message', /** @type {EventListener} */(this.#boundMessageHandler));\n this.#boundMessageHandler = null;\n }\n\n this.#controller = null;\n }\n\n /**\n * Checks if transport has been destroyed.\n * @returns {boolean}\n */\n get isDestroyed() {\n return this.#destroyed;\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Private methods\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Handles incoming messages from the ServiceWorker.\n * \n * @param {MessageEvent} event\n */\n #handleMessage(event) {\n // Skip if no handler\n if (!this.#messageHandler) return;\n\n // Skip non-protocol messages\n if (!isProtocolMessage(event.data)) return;\n\n // Invoke handler\n try {\n this.#messageHandler(event.data, {\n origin: 'serviceworker'\n });\n } catch (error) {\n console.error('[CrossBus] ServiceWorker handler error:', error);\n }\n }\n}\n\n/**\n * @fileoverview Native Bridge transport for Android/iOS WebView communication.\n * Enables CrossBus to communicate with native mobile apps through WebView bridges.\n * @module transports/native-bridge\n */\n\n\n/**\n * @typedef {'android' | 'ios' | 'none'} BridgeType\n */\n\n/**\n * @typedef {Object} NativeBridgeTransportOptions\n * @property {string} [androidInterface='CrossBus'] - Name of Android JavascriptInterface.\n * @property {string} [iosHandler='crossbus'] - Name of iOS WKScriptMessageHandler.\n * @property {number} [initTimeout=5000] - Timeout waiting for native bridge (ms).\n * @property {number} [heartbeatInterval=30000] - Heartbeat interval (ms), 0 to disable.\n * @property {boolean} [queueWhileInit=true] - Queue messages while waiting for bridge.\n */\n\n/**\n * @callback MessageHandler\n * @param {Object} message - The received protocol message.\n * @param {{ bridgeType: BridgeType }} source - Bridge type info.\n */\n\n/**\n * Native Bridge transport for WebView ↔ Native communication.\n * \n * Supports:\n * - Android WebView via JavascriptInterface\n * - iOS WKWebView via WKScriptMessageHandler\n * \n * @example\n * // In WebView context\n * const transport = new NativeBridgeTransport();\n * \n * transport.onMessage((msg, source) => {\n * console.log('From native:', msg, 'via:', source.bridgeType);\n * });\n * \n * // Send to native\n * transport.send({ type: 'greeting', payload: { hello: 'native' } });\n * \n * // Cleanup\n * transport.destroy();\n */\nclass NativeBridgeTransport {\n /** @type {BridgeType} */\n #bridgeType = 'none';\n\n /** @type {string} */\n #androidInterface;\n\n /** @type {string} */\n #iosHandler;\n\n /** @type {MessageHandler|null} */\n #messageHandler = null;\n\n /** @type {boolean} */\n #destroyed = false;\n\n /** @type {boolean} */\n #ready = false;\n\n /** @type {Array<Object>} */\n #messageQueue = [];\n\n /** @type {boolean} */\n #queueWhileInit;\n\n /** @type {ReturnType<typeof setInterval>|null} */\n #heartbeatTimer = null;\n\n /** @type {number} */\n #heartbeatInterval;\n\n /** @type {Promise<void>} */\n #readyPromise;\n\n /** @type {((value?: void) => void)|undefined} */\n #resolveReady;\n\n /**\n * Detects which native bridge is available.\n * \n * @returns {BridgeType} The detected bridge type.\n */\n static detectBridge() {\n // Check for Android bridge (customizable name, default 'CrossBus')\n if (globalThis.CrossBus && typeof globalThis.CrossBus.postMessage === 'function') {\n return 'android';\n }\n // Also check common Android bridge patterns\n if (globalThis.AndroidBridge && typeof globalThis.AndroidBridge.postMessage === 'function') {\n return 'android';\n }\n\n // iOS: WKWebView injects webkit.messageHandlers\n if (globalThis.webkit?.messageHandlers?.crossbus) {\n return 'ios';\n }\n\n return 'none';\n }\n\n /**\n * Checks if any native bridge is available.\n * \n * @returns {boolean} True if a native bridge is detected.\n */\n static isSupported() {\n return NativeBridgeTransport.detectBridge() !== 'none';\n }\n\n /**\n * Creates a new Native Bridge transport.\n * \n * @param {NativeBridgeTransportOptions} [options={}] - Configuration options.\n */\n constructor(options = {}) {\n this.#androidInterface = options.androidInterface ?? 'CrossBus';\n this.#iosHandler = options.iosHandler ?? 'crossbus';\n this.#queueWhileInit = options.queueWhileInit ?? true;\n this.#heartbeatInterval = options.heartbeatInterval ?? 30000;\n\n // Create ready promise\n this.#readyPromise = new Promise((resolve) => {\n this.#resolveReady = resolve;\n });\n\n // Detect and initialize bridge\n this.#initBridge(options.initTimeout ?? 5000);\n }\n\n /**\n * Initializes the native bridge connection.\n * \n * @param {number} timeout - Timeout in ms.\n */\n async #initBridge(timeout) {\n const startTime = Date.now();\n\n // Poll for bridge availability\n const checkBridge = () => {\n this.#bridgeType = NativeBridgeTransport.detectBridge();\n\n if (this.#bridgeType !== 'none') {\n this.#onBridgeReady();\n return;\n }\n\n if (Date.now() - startTime < timeout) {\n setTimeout(checkBridge, 50);\n } else {\n // Timeout - no bridge found, but don't error\n // Could be running in regular browser\n console.warn('[CrossBus] No native bridge detected after timeout');\n this.#ready = true;\n this.#resolveReady?.();\n }\n };\n\n checkBridge();\n\n // Set up global callback for native → JS messages\n this.#setupNativeCallback();\n }\n\n /**\n * Called when bridge is detected and ready.\n */\n #onBridgeReady() {\n this.#ready = true;\n this.#resolveReady?.();\n\n // Flush queued messages\n this.#flushQueue();\n\n // Start heartbeat if enabled\n if (this.#heartbeatInterval > 0) {\n this.#startHeartbeat();\n }\n }\n\n /**\n * Sets up callback for native → JS communication.\n */\n #setupNativeCallback() {\n // Native should call this global function to send messages to JS\n const callbackName = '__crossbus_receive__';\n\n globalThis[callbackName] = (messageStr) => {\n if (this.#destroyed || !this.#messageHandler) return;\n\n try {\n const data = typeof messageStr === 'string'\n ? JSON.parse(messageStr)\n : messageStr;\n\n if (!isProtocolMessage(data)) return;\n\n this.#messageHandler(data, { bridgeType: this.#bridgeType });\n } catch (e) {\n console.error('[CrossBus] Failed to parse native message:', e);\n }\n };\n }\n\n /**\n * Sends a message to the native side.\n * \n * @param {Object} message - Protocol message to send.\n * @throws {CrossBusError} If transport is destroyed.\n */\n send(message) {\n if (this.#destroyed) {\n throw CrossBusError.from(ErrorCode.DESTROYED, {\n context: 'NativeBridgeTransport.send'\n });\n }\n\n // Ensure message has protocol marker\n const envelope = {\n [PROTOCOL_MARKER]: PROTOCOL_VERSION,\n ...message\n };\n\n // Queue if not ready\n if (!this.#ready && this.#queueWhileInit) {\n this.#messageQueue.push(envelope);\n return;\n }\n\n this.#sendToNative(envelope);\n }\n\n /**\n * Actually sends message to native bridge.\n * \n * @param {Object} envelope - Message envelope.\n */\n #sendToNative(envelope) {\n const jsonStr = JSON.stringify(envelope);\n\n try {\n if (this.#bridgeType === 'android') {\n // Try custom interface name first\n const bridge = globalThis[this.#androidInterface] || globalThis.AndroidBridge;\n if (bridge?.postMessage) {\n bridge.postMessage(jsonStr);\n }\n } else if (this.#bridgeType === 'ios') {\n // iOS WKWebView\n const handler = globalThis.webkit?.messageHandlers?.[this.#iosHandler];\n if (handler?.postMessage) {\n handler.postMessage(envelope); // iOS can take objects directly\n }\n }\n // If bridgeType is 'none', silently drop (or could throw)\n } catch (e) {\n console.error('[CrossBus] Failed to send to native:', e);\n }\n }\n\n /**\n * Flushes queued messages after bridge is ready.\n */\n #flushQueue() {\n while (this.#messageQueue.length > 0) {\n const msg = this.#messageQueue.shift();\n this.#sendToNative(msg);\n }\n }\n\n /**\n * Starts heartbeat to keep native connection alive.\n */\n #startHeartbeat() {\n this.#heartbeatTimer = setInterval(() => {\n if (this.#destroyed) return;\n\n this.#sendToNative({\n [PROTOCOL_MARKER]: PROTOCOL_VERSION,\n t: 'hb', // heartbeat\n ts: Date.now()\n });\n }, this.#heartbeatInterval);\n }\n\n /**\n * Registers a message handler.\n * \n * @param {MessageHandler} handler - Function to handle incoming messages.\n */\n onMessage(handler) {\n if (typeof handler !== 'function') {\n throw new TypeError('Handler must be a function');\n }\n this.#messageHandler = handler;\n }\n\n /**\n * Removes the message handler.\n */\n offMessage() {\n this.#messageHandler = null;\n }\n\n /**\n * Destroys the transport, cleaning up resources.\n */\n destroy() {\n if (this.#destroyed) return;\n\n this.#destroyed = true;\n this.#messageHandler = null;\n this.#messageQueue = [];\n\n if (this.#heartbeatTimer) {\n clearInterval(this.#heartbeatTimer);\n this.#heartbeatTimer = null;\n }\n\n // Clean up global callback\n delete globalThis['__crossbus_receive__'];\n }\n\n /**\n * Gets whether the transport is destroyed.\n * @returns {boolean}\n */\n get isDestroyed() {\n return this.#destroyed;\n }\n\n /**\n * Gets the detected bridge type.\n * @returns {BridgeType}\n */\n get bridgeType() {\n return this.#bridgeType;\n }\n\n /**\n * Gets whether the bridge is ready.\n * @returns {boolean}\n */\n get isReady() {\n return this.#ready;\n }\n\n /**\n * Promise that resolves when bridge is ready.\n * @returns {Promise<void>}\n */\n get ready() {\n return this.#readyPromise;\n }\n}\n\n/**\n * @fileoverview WebSocket transport for CrossBus.\n * Enables communication with a server via WebSocket.\n * @module transports/websocket\n */\n\n\n/**\n * @typedef {Object} WebSocketTransportOptions\n * @property {string} url - WebSocket server URL (ws:// or wss://)\n * @property {string} [peerId] - Local peer ID\n * @property {boolean} [autoReconnect=true] - Auto-reconnect on disconnect\n * @property {number} [reconnectDelayMs=1000] - Base delay for reconnection\n * @property {number} [maxReconnectDelayMs=30000] - Max delay with exponential backoff\n * @property {number} [heartbeatIntervalMs=30000] - Heartbeat interval (0 to disable)\n * @property {Object} [protocols] - WebSocket subprotocols\n */\n\n/**\n * WebSocket transport for server communication.\n * \n * @example\n * const transport = new WebSocketTransport({\n * url: 'wss://api.example.com/crossbus',\n * peerId: 'client-1'\n * });\n * \n * transport.onMessage((msg) => console.log('Received:', msg));\n * transport.onStateChange((state) => console.log('State:', state));\n * \n * await transport.connect();\n * transport.send({ type: 'hello', payload: { name: 'client' } });\n */\nclass WebSocketTransport {\n /** @type {string} */\n #url;\n\n /** @type {string} */\n #peerId;\n\n /** @type {WebSocket|null} */\n #socket = null;\n\n /** @type {boolean} */\n #autoReconnect;\n\n /** @type {number} */\n #reconnectDelayMs;\n\n /** @type {number} */\n #maxReconnectDelayMs;\n\n /** @type {number} */\n #currentReconnectDelay;\n\n /** @type {number} */\n #heartbeatIntervalMs;\n\n /** @type {ReturnType<typeof setInterval>|null} */\n #heartbeatTimer = null;\n\n /** @type {ReturnType<typeof setTimeout>|null} */\n #reconnectTimer = null;\n\n /** @type {((message: Object) => void)|null} */\n #messageHandler = null;\n\n /** @type {((state: 'connecting'|'connected'|'disconnected'|'error') => void)|null} */\n #stateHandler = null;\n\n /** @type {'connecting'|'connected'|'disconnected'|'error'} */\n #state = 'disconnected';\n\n /** @type {Object[]} */\n #messageQueue = [];\n\n /** @type {boolean} */\n #intentionalClose = false;\n\n /**\n * Creates a new WebSocket transport.\n * @param {WebSocketTransportOptions} options\n */\n constructor(options) {\n this.#url = options.url;\n this.#peerId = options.peerId ?? uuid();\n this.#autoReconnect = options.autoReconnect ?? true;\n this.#reconnectDelayMs = options.reconnectDelayMs ?? 1000;\n this.#maxReconnectDelayMs = options.maxReconnectDelayMs ?? 30000;\n this.#currentReconnectDelay = this.#reconnectDelayMs;\n this.#heartbeatIntervalMs = options.heartbeatIntervalMs ?? 30000;\n }\n\n /** @returns {string} */\n get peerId() {\n return this.#peerId;\n }\n\n /** @returns {'connecting'|'connected'|'disconnected'|'error'} */\n get state() {\n return this.#state;\n }\n\n /** @returns {boolean} */\n get isConnected() {\n return this.#state === 'connected' && this.#socket?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Connects to the WebSocket server.\n * @returns {Promise<void>}\n */\n async connect() {\n if (this.#socket && this.#socket.readyState === WebSocket.OPEN) {\n return;\n }\n\n this.#intentionalClose = false;\n this.#setState('connecting');\n\n return new Promise((resolve, reject) => {\n try {\n this.#socket = new WebSocket(this.#url);\n\n this.#socket.onopen = () => {\n this.#setState('connected');\n this.#currentReconnectDelay = this.#reconnectDelayMs;\n this.#flushQueue();\n this.#startHeartbeat();\n resolve();\n };\n\n this.#socket.onmessage = (event) => {\n this.#handleMessage(event);\n };\n\n this.#socket.onclose = (event) => {\n this.#stopHeartbeat();\n this.#setState('disconnected');\n\n if (!this.#intentionalClose && this.#autoReconnect) {\n this.#scheduleReconnect();\n }\n };\n\n this.#socket.onerror = (error) => {\n this.#setState('error');\n if (this.#state === 'connecting') {\n reject(new Error('WebSocket connection failed'));\n }\n };\n } catch (e) {\n this.#setState('error');\n reject(e);\n }\n });\n }\n\n /**\n * Disconnects from the server.\n */\n disconnect() {\n this.#intentionalClose = true;\n this.#stopHeartbeat();\n\n if (this.#reconnectTimer) {\n clearTimeout(this.#reconnectTimer);\n this.#reconnectTimer = null;\n }\n\n if (this.#socket) {\n this.#socket.close(1000, 'Client disconnect');\n this.#socket = null;\n }\n\n this.#setState('disconnected');\n }\n\n /**\n * Sends a message to the server.\n * @param {Object} message - Message to send\n * @returns {boolean} Whether the message was sent immediately\n */\n send(message) {\n const envelope = {\n _cb: PROTOCOL_VERSION,\n _m: PROTOCOL_MARKER,\n id: uuid(),\n from: this.#peerId,\n timestamp: Date.now(),\n ...message\n };\n\n if (this.isConnected && this.#socket) {\n this.#socket.send(JSON.stringify(envelope));\n return true;\n } else {\n // Queue for later\n this.#messageQueue.push(envelope);\n return false;\n }\n }\n\n /**\n * Sets the message handler.\n * @param {(message: Object) => void} handler\n */\n onMessage(handler) {\n this.#messageHandler = handler;\n }\n\n /**\n * Sets the state change handler.\n * @param {(state: string) => void} handler\n */\n onStateChange(handler) {\n this.#stateHandler = handler;\n }\n\n /**\n * Handles incoming messages.\n */\n #handleMessage(event) {\n try {\n const data = JSON.parse(event.data);\n\n // Handle pong (heartbeat response)\n if (data.type === 'pong') {\n return;\n }\n\n if (this.#messageHandler) {\n this.#messageHandler(data);\n }\n } catch (e) {\n console.error('[WebSocketTransport] Failed to parse message:', e);\n }\n }\n\n /**\n * Flushes queued messages.\n */\n #flushQueue() {\n while (this.#messageQueue.length > 0 && this.isConnected && this.#socket) {\n const message = this.#messageQueue.shift();\n if (message) {\n this.#socket.send(JSON.stringify(message));\n }\n }\n }\n\n /**\n * Updates and emits state.\n */\n #setState(state) {\n if (this.#state !== state) {\n this.#state = state;\n if (this.#stateHandler) {\n this.#stateHandler(state);\n }\n }\n }\n\n /**\n * Starts heartbeat timer.\n */\n #startHeartbeat() {\n if (this.#heartbeatIntervalMs <= 0) return;\n\n this.#heartbeatTimer = setInterval(() => {\n if (this.isConnected && this.#socket) {\n this.#socket.send(JSON.stringify({ type: 'ping', from: this.#peerId }));\n }\n }, this.#heartbeatIntervalMs);\n }\n\n /**\n * Stops heartbeat timer.\n */\n #stopHeartbeat() {\n if (this.#heartbeatTimer) {\n clearInterval(this.#heartbeatTimer);\n this.#heartbeatTimer = null;\n }\n }\n\n /**\n * Schedules a reconnection attempt.\n */\n #scheduleReconnect() {\n if (this.#reconnectTimer) return;\n\n this.#reconnectTimer = setTimeout(async () => {\n this.#reconnectTimer = null;\n\n try {\n await this.connect();\n } catch {\n // Exponential backoff\n this.#currentReconnectDelay = Math.min(\n this.#currentReconnectDelay * 2,\n this.#maxReconnectDelayMs\n );\n\n if (this.#autoReconnect && !this.#intentionalClose) {\n this.#scheduleReconnect();\n }\n }\n }, this.#currentReconnectDelay);\n }\n\n /**\n * Destroys the transport.\n */\n destroy() {\n this.disconnect();\n this.#messageHandler = null;\n this.#stateHandler = null;\n this.#messageQueue = [];\n }\n}\n\n/**\n * @fileoverview Vector Clock implementation for causal ordering.\n * \n * Vector clocks track logical time across distributed processes,\n * enabling detection of causal relationships between events.\n * \n * @module ordering/vector-clock\n */\n\n/**\n * Vector Clock for tracking causal order in distributed systems.\n * \n * Each node maintains a counter for every known node. When sending\n * a message, the sender increments its own counter and includes\n * the entire clock. When receiving, the receiver updates its clock\n * by taking the max of each component.\n * \n * @example\n * const clock = new VectorClock('node-1');\n * clock.tick(); // Increment before sending\n * const message = { data, clock: clock.toJSON() };\n * \n * // On receive:\n * const remoteClock = VectorClock.fromJSON(message.clock);\n * if (localClock.canDeliver(remoteClock, senderId)) {\n * localClock.update(remoteClock);\n * deliver(message);\n * }\n */\nclass VectorClock {\n /** @type {string} */\n #ownId;\n\n /** @type {Map<string, number>} */\n #counters;\n\n /**\n * Creates a new vector clock.\n * \n * @param {string} ownId - This node's unique identifier\n * @param {Object<string, number>} [initial={}] - Initial counter values\n */\n constructor(ownId, initial = {}) {\n this.#ownId = ownId;\n this.#counters = new Map(Object.entries(initial));\n\n // Ensure own entry exists\n if (!this.#counters.has(ownId)) {\n this.#counters.set(ownId, 0);\n }\n }\n\n /**\n * Gets this node's ID.\n * @returns {string}\n */\n get ownId() {\n return this.#ownId;\n }\n\n /**\n * Gets the counter value for a node.\n * \n * @param {string} nodeId - Node identifier\n * @returns {number} Counter value (0 if unknown)\n */\n get(nodeId) {\n return this.#counters.get(nodeId) ?? 0;\n }\n\n /**\n * Increments this node's counter (call before sending).\n * \n * @returns {number} New counter value\n */\n tick() {\n const current = this.get(this.#ownId);\n const next = current + 1;\n this.#counters.set(this.#ownId, next);\n return next;\n }\n\n /**\n * Updates this clock with values from another clock.\n * Takes the max of each component (merge operation).\n * \n * @param {VectorClock} other - Clock to merge from\n */\n update(other) {\n for (const [nodeId, value] of other.#counters) {\n const current = this.get(nodeId);\n if (value > current) {\n this.#counters.set(nodeId, value);\n }\n }\n }\n\n /**\n * Checks if this clock happened-before another.\n * A happened-before B iff all(A[i] <= B[i]) and exists(A[j] < B[j])\n * \n * @param {VectorClock} other - Clock to compare against\n * @returns {boolean} True if this clock causally precedes other\n */\n happenedBefore(other) {\n let atLeastOneSmaller = false;\n const allNodeIds = new Set([...this.#counters.keys(), ...other.#counters.keys()]);\n\n for (const nodeId of allNodeIds) {\n const thisVal = this.get(nodeId);\n const otherVal = other.get(nodeId);\n\n if (thisVal > otherVal) {\n return false; // This has a greater component\n }\n if (thisVal < otherVal) {\n atLeastOneSmaller = true;\n }\n }\n\n return atLeastOneSmaller;\n }\n\n /**\n * Checks if this clock is concurrent with another.\n * Concurrent means neither happened-before the other.\n * \n * @param {VectorClock} other - Clock to compare against\n * @returns {boolean} True if clocks are concurrent\n */\n isConcurrentWith(other) {\n return !this.happenedBefore(other) &&\n !other.happenedBefore(this) &&\n !this.equals(other);\n }\n\n /**\n * Checks if two clocks are identical.\n * \n * @param {VectorClock} other - Clock to compare against\n * @returns {boolean} True if clocks have identical values\n */\n equals(other) {\n const allNodeIds = new Set([...this.#counters.keys(), ...other.#counters.keys()]);\n\n for (const nodeId of allNodeIds) {\n if (this.get(nodeId) !== other.get(nodeId)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Checks if a message with the given clock can be delivered.\n * \n * Delivery condition: For the sender's component, the message clock\n * should be exactly one more than our current knowledge. For all other\n * components, the message clock should be <= our current knowledge.\n * \n * @param {VectorClock} msgClock - Clock attached to incoming message\n * @param {string} senderId - ID of the message sender\n * @returns {boolean} True if message can be delivered without breaking causal order\n */\n canDeliver(msgClock, senderId) {\n const senderSeq = msgClock.get(senderId);\n const ourKnowledge = this.get(senderId);\n\n // Sender's sequence should be next in order (exactly +1)\n if (senderSeq !== ourKnowledge + 1) {\n return false;\n }\n\n // All other components should be <= what we know\n for (const [nodeId, value] of msgClock.#counters) {\n if (nodeId === senderId) continue;\n if (value > this.get(nodeId)) {\n return false; // We're missing messages from another node\n }\n }\n\n return true;\n }\n\n /**\n * Creates a copy of this clock.\n * \n * @returns {VectorClock} Cloned clock\n */\n clone() {\n const counters = Object.fromEntries(this.#counters);\n return new VectorClock(this.#ownId, counters);\n }\n\n /**\n * Serializes to JSON-compatible object.\n * \n * @returns {{ ownId: string, counters: Object<string, number> }}\n */\n toJSON() {\n return {\n ownId: this.#ownId,\n counters: Object.fromEntries(this.#counters)\n };\n }\n\n /**\n * Deserializes from JSON object.\n * \n * @param {{ ownId: string, counters: Object<string, number> }} json\n * @returns {VectorClock}\n */\n static fromJSON(json) {\n return new VectorClock(json.ownId, json.counters);\n }\n\n /**\n * Returns human-readable representation.\n * @returns {string}\n */\n toString() {\n const entries = [...this.#counters.entries()]\n .map(([k, v]) => `${k}:${v}`)\n .join(', ');\n return `VectorClock(${this.#ownId}){${entries}}`;\n }\n}\n\n/**\n * @fileoverview Causal Orderer for message delivery with causal consistency.\n * \n * Buffers out-of-order messages and delivers them only when their\n * causal dependencies have been satisfied.\n * \n * @module ordering/causal-orderer\n */\n\n\n/**\n * @typedef {Object} CausalOrdererOptions\n * @property {Function} [onDeliver] - Callback when message is delivered\n * @property {number} [maxBufferSize=1000] - Maximum buffered messages\n * @property {Function} [onBufferOverflow] - Called when buffer is full\n */\n\n/**\n * @typedef {Object} BufferedMessage\n * @property {string} senderId - Message sender ID\n * @property {Object} message - Original message\n * @property {VectorClock} clock - Message's vector clock\n */\n\n/**\n * Causal Orderer ensures messages are delivered in causal order.\n * \n * When a message arrives out of order (missing dependencies), it's\n * buffered until its dependencies are satisfied. This guarantees\n * that if message B was sent after seeing message A, then B will\n * be delivered after A at all receivers.\n * \n * @example\n * const orderer = new CausalOrderer('my-node', {\n * onDeliver: (msg) => processMessage(msg)\n * });\n * \n * // When receiving a message:\n * orderer.receive(senderId, message);\n * \n * // When sending:\n * const clock = orderer.tick();\n * send({ ...data, clock: clock.toJSON() });\n */\nclass CausalOrderer {\n /** @type {string} */\n #ownId;\n\n /** @type {VectorClock} */\n #clock;\n\n /** @type {BufferedMessage[]} */\n #buffer;\n\n /** @type {Function} */\n #onDeliver;\n\n /** @type {number} */\n #maxBufferSize;\n\n /** @type {Function|null} */\n #onBufferOverflow;\n\n /**\n * Creates a new CausalOrderer.\n * \n * @param {string} ownId - This node's unique identifier\n * @param {CausalOrdererOptions} options - Configuration options\n */\n constructor(ownId, options = {}) {\n this.#ownId = ownId;\n this.#clock = new VectorClock(ownId);\n this.#buffer = [];\n this.#onDeliver = options.onDeliver || (() => { });\n this.#maxBufferSize = options.maxBufferSize ?? 1000;\n this.#onBufferOverflow = options.onBufferOverflow || null;\n }\n\n /**\n * Gets this node's ID.\n * @returns {string}\n */\n get ownId() {\n return this.#ownId;\n }\n\n /**\n * Gets the current buffer size.\n * @returns {number}\n */\n get bufferSize() {\n return this.#buffer.length;\n }\n\n /**\n * Receives a message and delivers it if deps are satisfied,\n * otherwise buffers it.\n * \n * @param {string} senderId - ID of the message sender\n * @param {Object} message - Message with clock property\n */\n receive(senderId, message) {\n const msgClock = VectorClock.fromJSON(message.clock);\n\n if (this.#clock.canDeliver(msgClock, senderId)) {\n this.#deliver(senderId, message, msgClock);\n this.#tryDeliverBuffered();\n } else {\n this.#bufferMessage(senderId, message, msgClock);\n }\n }\n\n /**\n * Delivers a message and updates local clock.\n * \n * @param {string} senderId\n * @param {Object} message\n * @param {VectorClock} msgClock\n */\n #deliver(senderId, message, msgClock) {\n // Update local clock with received clock\n this.#clock.update(msgClock);\n\n // Invoke delivery callback\n this.#onDeliver(message);\n }\n\n /**\n * Buffers a message for later delivery.\n * \n * @param {string} senderId\n * @param {Object} message\n * @param {VectorClock} clock\n */\n #bufferMessage(senderId, message, clock) {\n if (this.#buffer.length >= this.#maxBufferSize) {\n if (this.#onBufferOverflow) {\n this.#onBufferOverflow({\n senderId,\n message,\n bufferSize: this.#buffer.length\n });\n }\n return; // Drop message if buffer full\n }\n\n this.#buffer.push({ senderId, message, clock });\n }\n\n /**\n * Tries to deliver buffered messages whose deps are now satisfied.\n * Repeats until no more messages can be delivered.\n */\n #tryDeliverBuffered() {\n let delivered = true;\n\n while (delivered) {\n delivered = false;\n\n for (let i = this.#buffer.length - 1; i >= 0; i--) {\n const { senderId, message, clock } = this.#buffer[i];\n\n if (this.#clock.canDeliver(clock, senderId)) {\n // Remove from buffer\n this.#buffer.splice(i, 1);\n // Deliver\n this.#deliver(senderId, message, clock);\n delivered = true;\n }\n }\n }\n }\n\n /**\n * Increments local clock for sending a message.\n * Returns the clock to attach to outgoing message.\n * \n * @returns {VectorClock} Clock to include in message\n */\n tick() {\n this.#clock.tick();\n return this.#clock.clone();\n }\n\n /**\n * Gets a copy of the current vector clock.\n * \n * @returns {VectorClock}\n */\n getVectorClock() {\n return this.#clock.clone();\n }\n\n /**\n * Clears the buffer (e.g., on disconnect).\n */\n clear() {\n this.#buffer = [];\n }\n}\n\nexport { BroadcastChannelTransport, CausalOrderer, CrossBus, CrossBusError, DeliveryStatus, ErrorCode, EventEmitter, Handshake, HandshakePhase, MessageChannelTransport, MessageRouter, MessageType, NativeBridgeTransport, OriginValidator, OriginValidatorPresets, PROTOCOL_MARKER, PROTOCOL_VERSION, PeerStatus, PeerType, PendingRequests, PostMessageTransport, PresenceManager, ReadableSignalStream, ServiceWorkerTransport, SharedWorkerTransport, StreamManager, VectorClock, WebSocketTransport, WritableSignalStream, createFastEmitter, createPresence, deferred, detectPeerType, isCloneable, isCrossBusError, isRetryable, sleep, timestamp, uuid, withTimeout };\n//# sourceMappingURL=crossbus.js.map\n",
7
+ "/**\n * @fileoverview microUI EventBus - CrossBus 1.0.0 Adapter\n * \n * Wraps CrossBus for microUI components with agentic features.\n * Following AGENTS.md best practices for maximum performance.\n * \n * Performance: 111M ops/sec with emitSync\n * Features: \n * - ACK-based delivery, zero memory leaks\n * - Capability discovery for AI agents\n * - Debug mode toggle\n * - Health monitoring\n * - Inbound/outbound hooks for observability\n */\n\nimport { CrossBus } from 'crossbus';\n\n/** microUI framework version */\nexport const MICROUI_VERSION = '0.1.0';\n\n// Create singleton instance for microUI (Window Singleton Pattern)\n// Ensures shared bus across split bundles/chunks\nconst GLOBAL_BUS_KEY = '__MICROUI_CROSSBUS__';\n\n// Defensive check for test environments where window may not be defined\nconst globalScope = typeof window !== 'undefined' ? window : globalThis;\n\n// AI Agent Discovery: Capability negotiation (stored locally for getCapabilities())\nconst MICROUI_CAPABILITIES = [\n 'ui:toast',\n 'ui:modal',\n 'ui:theme',\n 'ui:tabs',\n 'ui:dropdown',\n 'ui:form',\n 'ui:grid',\n 'ui:stack',\n 'ui:virtual-list'\n];\n\nconst MICROUI_META = {\n type: 'ui-framework',\n version: MICROUI_VERSION,\n description: 'AI-Optimized UI Framework - Web Components Edition'\n};\n\nif (!globalScope[GLOBAL_BUS_KEY]) {\n globalScope[GLOBAL_BUS_KEY] = new CrossBus({\n peerId: 'microui',\n isHub: true,\n requestTimeout: 5000,\n capabilities: MICROUI_CAPABILITIES,\n meta: MICROUI_META\n });\n // Best practice: Set max listeners for many UI components\n globalScope[GLOBAL_BUS_KEY].setMaxListeners(100);\n}\n\nconst crossBus = globalScope[GLOBAL_BUS_KEY];\n\n// ============================================================================\n// COMPONENT CAPABILITY REGISTRY (Phase 2)\n// Allows components to register their capabilities at runtime\n// AI agents can query this to discover available component features\n// ============================================================================\nconst COMPONENT_REGISTRY_KEY = '__MICROUI_COMPONENT_REGISTRY__';\nif (!globalScope[COMPONENT_REGISTRY_KEY]) {\n globalScope[COMPONENT_REGISTRY_KEY] = new Map();\n}\nconst componentRegistry = globalScope[COMPONENT_REGISTRY_KEY];\n\n/**\n * Simplified bus wrapper for microUI components\n * Optimized following CrossBus AGENTS.md\n */\nexport const bus = {\n /**\n * Subscribe to a signal\n * @param {string} event - Event name (supports wildcards 'ui:*')\n * @param {Function} callback - Handler function\n * @returns {Function} Unsubscribe function\n */\n on(event, callback) {\n const subscription = crossBus.on(event, (eventData) => {\n callback(eventData.data ?? eventData);\n });\n return () => subscription.unsubscribe();\n },\n\n /**\n * Subscribe once\n */\n once(event, callback) {\n const unsub = this.on(event, (data) => {\n unsub();\n callback(data);\n });\n },\n\n /**\n * Unsubscribe\n */\n off(event, callback) {\n crossBus.off(event, callback);\n },\n\n /**\n * Emit a signal - Uses emitSync for 111M ops/sec\n * Best practice from AGENTS.md: \"Always use emitSync for local events\"\n */\n emit(event, data) {\n return crossBus.emitSync(event, data);\n },\n\n /**\n * Async emit with full envelope (slower but with confirmation)\n */\n async emitAsync(event, data) {\n return crossBus.emit(event, data);\n },\n\n /**\n * Broadcast signal to all peers\n */\n signal(event, data) {\n crossBus.signal(event, data);\n },\n\n /**\n * Request/Response pattern (RPC)\n */\n async request(peerId, handler, payload) {\n return crossBus.request(peerId, handler, payload);\n },\n\n /**\n * Broadcast request to all peers\n */\n async broadcastRequest(handler, payload) {\n return crossBus.broadcastRequest(handler, payload);\n },\n\n /**\n * Register a request handler\n */\n handle(name, handler) {\n return crossBus.handle(name, handler);\n },\n\n /**\n * Remove handler\n */\n unhandle(name) {\n crossBus.unhandle(name);\n },\n\n /**\n * Clear/destroy - Best practice: \"Call destroy() to prevent memory leaks\"\n */\n destroy() {\n crossBus.destroy();\n },\n\n /**\n * Set max listeners\n */\n setMaxListeners(n) {\n crossBus.setMaxListeners(n);\n },\n\n /**\n * Peer management\n */\n get peerId() { return crossBus.peerId; },\n get peers() { return crossBus.peers; },\n get peerCount() { return crossBus.peerCount; },\n\n /**\n * Check if listeners exist for a signal (CrossBus native)\n * @param {string} event - Event name\n * @returns {boolean}\n */\n hasListeners(event) { return crossBus.hasListeners(event); },\n\n /**\n * Direct access to CrossBus instance\n */\n get raw() { return crossBus; }\n};\n\n// Predefined UI events\nexport const UIEvents = {\n // Toast\n TOAST_SHOW: 'ui:toast:show',\n TOAST_DISMISS: 'ui:toast:dismiss',\n\n // Modal\n MODAL_OPEN: 'ui:modal:open',\n MODAL_CLOSE: 'ui:modal:close',\n\n // Theme\n THEME_CHANGE: 'ui:theme:change',\n\n // Navigation\n TAB_CHANGE: 'ui:tab:change',\n DROPDOWN_SELECT: 'ui:dropdown:select',\n\n // Form\n FORM_SUBMIT: 'ui:form:submit',\n FORM_VALIDATE: 'ui:form:validate'\n};\n\n/**\n * Show toast helper\n */\nexport const showToast = (message, options = {}) => {\n bus.emit(UIEvents.TOAST_SHOW, { message, ...options });\n};\n\n// ============================================================================\n// AI AGENT FEATURES (CrossBus 1.0.0)\n// ============================================================================\n\n/**\n * Enable debug mode for CrossBus tracing\n * \n * NOTE: CrossBus debug mode is set at creation time.\n * This function checks if debug is enabled but cannot toggle it dynamically.\n * For runtime debugging, use addInboundHook/addOutboundHook instead.\n * \n * @returns {boolean} Whether debug mode is currently enabled\n */\nexport const isDebugEnabled = () => crossBus.debug;\n\n/**\n * Alias for isDebugEnabled for backwards compatibility\n * @deprecated Use isDebugEnabled() instead\n */\nexport const enableDebug = () => {\n console.warn('[microUI] enableDebug() is deprecated. Debug mode is set at CrossBus creation. Use addInboundHook/addOutboundHook for runtime tracing.');\n return crossBus.debug;\n};\n\n/**\n * Disable debug mode\n * @deprecated Debug mode cannot be toggled after creation\n */\nexport const disableDebug = () => {\n console.warn('[microUI] disableDebug() is deprecated. Debug mode is set at CrossBus creation.');\n};\n\n/**\n * Get health status of the CrossBus instance\n * Useful for AI agents to verify framework readiness\n * \n * @returns {Object} Health status including uptime, peers, handlers\n * @example\n * getHealth(); // { status: 'healthy', peerId: 'microui', uptime: 12345, ... }\n */\nexport const getHealth = () => {\n return crossBus.healthCheck?.() ?? {\n status: 'unknown',\n peerId: crossBus.peerId,\n note: 'healthCheck not available in this CrossBus version'\n };\n};\n\n/**\n * Get framework capabilities\n * AI agents can use this for feature discovery\n * \n * @returns {Object} Capabilities and metadata\n */\nexport const getCapabilities = () => ({\n peerId: crossBus.peerId,\n capabilities: MICROUI_CAPABILITIES,\n meta: MICROUI_META,\n version: MICROUI_VERSION\n});\n\n/**\n * Add inbound hook for message interception\n * Useful for AI agents to trace/log all incoming messages\n * \n * @param {Function} fn - Hook function (payload, ctx) => payload\n * @returns {Function} Remove hook function\n */\nexport const addInboundHook = (fn) => {\n return crossBus.addInboundHook?.(fn) ?? (() => { });\n};\n\n/**\n * Add outbound hook for message interception\n * Useful for AI agents to trace/log all outgoing messages\n * \n * @param {Function} fn - Hook function (payload, ctx) => payload\n * @returns {Function} Remove hook function\n */\nexport const addOutboundHook = (fn) => {\n return crossBus.addOutboundHook?.(fn) ?? (() => { });\n};\n\n// ============================================================================\n// COMPONENT CAPABILITY REGISTRATION (Phase 2)\n// ============================================================================\n\n/**\n * Register a component's capabilities\n * Components call this in connectedCallback to announce their features\n * \n * @param {string} tagName - Custom element tag name (e.g., 'mu-toast')\n * @param {Object} capabilities - Component capability descriptor\n * @param {string[]} capabilities.signals - Signals this component listens to\n * @param {string[]} capabilities.handlers - RPC handlers this component provides\n * @param {Object} capabilities.options - Component-specific options (e.g., positions, severities)\n * @example\n * registerComponent('mu-toast', {\n * signals: ['ui:toast:show', 'ui:toast:dismiss'],\n * options: { positions: ['top-right', 'bottom-left'], severities: ['info', 'success'] }\n * });\n */\nexport const registerComponent = (tagName, capabilities) => {\n componentRegistry.set(tagName, {\n ...capabilities,\n registeredAt: Date.now()\n });\n};\n\n/**\n * Unregister a component (for cleanup)\n * \n * @param {string} tagName - Custom element tag name\n */\nexport const unregisterComponent = (tagName) => {\n componentRegistry.delete(tagName);\n};\n\n/**\n * Get a specific component's capabilities\n * \n * @param {string} tagName - Custom element tag name\n * @returns {Object|null} Component capabilities or null if not registered\n */\nexport const getComponentCapabilities = (tagName) => {\n return componentRegistry.get(tagName) ?? null;\n};\n\n/**\n * Get all registered components and their capabilities\n * AI agents use this to discover available UI features\n * \n * @returns {Object} Map of all registered components\n * @example\n * getRegisteredComponents();\n * // {\n * // 'mu-toast': { signals: ['ui:toast:show'], options: {...} },\n * // 'mu-modal': { signals: ['ui:modal:open'], options: {...} }\n * // }\n */\nexport const getRegisteredComponents = () => {\n return Object.fromEntries(componentRegistry);\n};\n\n/**\n * Check if a specific signal has any registered component handlers\n * \n * @param {string} signal - Signal name to check\n * @returns {string[]} List of component tag names that handle this signal\n */\nexport const getComponentsForSignal = (signal) => {\n const handlers = [];\n for (const [tagName, caps] of componentRegistry) {\n if (caps.signals?.includes(signal)) {\n handlers.push(tagName);\n }\n }\n return handlers;\n};\n",
8
+ "/**\n * @fileoverview Theme System for microUI\n * \n * Provides light/dark mode toggling and theme management.\n * Uses CSS custom properties and data-theme attribute.\n */\n\nimport { bus, UIEvents } from './bus.js';\n\n/**\n * Theme manager singleton\n */\nexport const Theme = {\n /**\n * Set the current theme\n * @param {'light'|'dark'|'auto'} theme\n */\n set(theme) {\n if (theme === 'auto') {\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n document.documentElement.setAttribute('data-theme', prefersDark ? 'dark' : 'light');\n } else {\n document.documentElement.setAttribute('data-theme', theme);\n }\n localStorage.setItem('mu-theme', theme);\n bus.emit(UIEvents.THEME_CHANGE, { theme });\n },\n\n /**\n * Get current theme\n * @returns {'light'|'dark'}\n */\n get() {\n return document.documentElement.getAttribute('data-theme') || 'light';\n },\n\n /**\n * Toggle between light and dark\n */\n toggle() {\n const current = this.get();\n this.set(current === 'dark' ? 'light' : 'dark');\n },\n\n /**\n * Initialize theme from localStorage or system preference\n */\n init() {\n const saved = localStorage.getItem('mu-theme');\n if (saved) {\n this.set(saved);\n } else {\n this.set('auto');\n }\n\n // Listen for system preference changes\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {\n if (localStorage.getItem('mu-theme') === 'auto') {\n document.documentElement.setAttribute('data-theme', e.matches ? 'dark' : 'light');\n }\n });\n }\n};\n\n// Auto-init on load\nif (typeof window !== 'undefined') {\n Theme.init();\n}\n",
9
+ "/**\n * @fileoverview Simple Reactive Store for microUI\n * \n * Lightweight state management without complexity.\n * \n * Usage:\n * const store = createStore({ count: 0 });\n * store.subscribe((state) => console.log(state.count));\n * store.set({ count: 1 });\n * store.update(s => ({ count: s.count + 1 }));\n */\n\n/**\n * Create a reactive store\n * @param {T} initialState - Initial state object\n * @returns {Store<T>}\n */\nexport function createStore(initialState = {}) {\n let state = { ...initialState };\n const listeners = new Set();\n\n return {\n /**\n * Get current state\n */\n get() {\n return state;\n },\n\n /**\n * Set new state (merges with existing)\n * @param {Partial<T>} newState\n */\n set(newState) {\n state = { ...state, ...newState };\n this.notify();\n },\n\n /**\n * Update state with function\n * @param {(s: T) => Partial<T>} fn\n */\n update(fn) {\n const updates = fn(state);\n this.set(updates);\n },\n\n /**\n * Subscribe to state changes\n * @param {(state: T) => void} listener\n * @returns {() => void} Unsubscribe function\n */\n subscribe(listener) {\n listeners.add(listener);\n // Call immediately with current state\n listener(state);\n return () => listeners.delete(listener);\n },\n\n /**\n * Notify all listeners\n */\n notify() {\n for (const listener of listeners) {\n listener(state);\n }\n },\n\n /**\n * Reset to initial state\n */\n reset() {\n state = { ...initialState };\n this.notify();\n }\n };\n}\n\n/**\n * Global app store (singleton pattern)\n */\nexport const appStore = createStore({});\n\n// ============================================\n// NAMESPACED STORES (Enterprise-Scale Feature)\n// ============================================\n\n/**\n * Registry of all namespaced stores for large-scale apps\n * @type {Map<string, Store>}\n */\nconst storeRegistry = new Map();\n\n/**\n * State change history for observability\n * @type {Map<string, Array<{timestamp: number, state: Object}>>}\n */\nconst stateHistory = new Map();\n\n/** Whether observability is enabled */\nlet observabilityEnabled = false;\n\n/**\n * Create a namespaced store for isolated state management.\n * Each feature/module can have its own isolated store.\n * \n * @param {string} namespace - Unique namespace for this store (e.g., 'user', 'cart')\n * @param {Object} initialState - Initial state for this namespace\n * @returns {Store} Store instance\n * \n * @example\n * const userStore = createNamespacedStore('user', { profile: null });\n * const cartStore = createNamespacedStore('cart', { items: [] });\n */\nexport function createNamespacedStore(namespace, initialState = {}) {\n if (storeRegistry.has(namespace)) {\n console.warn(`[microUI] Store namespace \"${namespace}\" already exists. Returning existing store.`);\n return storeRegistry.get(namespace);\n }\n\n const store = createStore(initialState);\n\n // Wrap set to track history if observability enabled\n const originalSet = store.set.bind(store);\n store.set = function (newState) {\n if (observabilityEnabled) {\n if (!stateHistory.has(namespace)) {\n stateHistory.set(namespace, []);\n }\n stateHistory.get(namespace).push({\n timestamp: Date.now(),\n state: { ...store.get() }\n });\n // Keep last 100 entries\n const history = stateHistory.get(namespace);\n if (history.length > 100) history.shift();\n }\n originalSet(newState);\n };\n\n // Add namespace property\n store.namespace = namespace;\n\n storeRegistry.set(namespace, store);\n return store;\n}\n\n/**\n * Get a store by namespace\n * @param {string} namespace \n * @returns {Store|undefined}\n */\nexport function getStore(namespace) {\n return storeRegistry.get(namespace);\n}\n\n/**\n * Get all registered stores as a plain object\n * @returns {Object<string, Store>}\n */\nexport function getAllStores() {\n const stores = {};\n for (const [namespace, store] of storeRegistry) {\n stores[namespace] = store;\n }\n return stores;\n}\n\n/**\n * Capture the entire application state (all namespaced stores)\n * Useful for debugging, serialization, or time-travel debugging.\n * \n * @returns {Object} Snapshot of all store states\n * \n * @example\n * const snapshot = captureAppState();\n * localStorage.setItem('app-state', JSON.stringify(snapshot));\n */\nexport function captureAppState() {\n const snapshot = {\n timestamp: Date.now(),\n stores: {}\n };\n\n for (const [namespace, store] of storeRegistry) {\n snapshot.stores[namespace] = { ...store.get() };\n }\n\n // Include global appStore\n snapshot.stores['__global__'] = { ...appStore.get() };\n\n return snapshot;\n}\n\n/**\n * Restore application state from a snapshot\n * \n * @param {Object} snapshot - Previously captured state snapshot\n * @param {Object} [options] - Options\n * @param {boolean} [options.createMissing=false] - Create stores for namespaces not yet registered\n * \n * @example\n * const snapshot = JSON.parse(localStorage.getItem('app-state'));\n * restoreAppState(snapshot);\n */\nexport function restoreAppState(snapshot, options = {}) {\n const { createMissing = false } = options;\n\n if (!snapshot?.stores) {\n console.warn('[microUI] Invalid snapshot provided to restoreAppState');\n return;\n }\n\n for (const [namespace, state] of Object.entries(snapshot.stores)) {\n if (namespace === '__global__') {\n appStore.set(state);\n continue;\n }\n\n let store = storeRegistry.get(namespace);\n\n if (!store && createMissing) {\n store = createNamespacedStore(namespace, {});\n }\n\n if (store) {\n store.set(state);\n }\n }\n}\n\n/**\n * Get state change history for a namespace (requires observability enabled)\n * @param {string} namespace \n * @returns {Array<{timestamp: number, state: Object}>}\n */\nexport function getStateHistory(namespace) {\n return stateHistory.get(namespace) || [];\n}\n\n/**\n * Enable state observability (tracks state changes for debugging)\n */\nexport function enableObservability() {\n observabilityEnabled = true;\n}\n\n/**\n * Disable state observability\n */\nexport function disableObservability() {\n observabilityEnabled = false;\n}\n\n/**\n * Clear all state history\n */\nexport function clearStateHistory() {\n stateHistory.clear();\n}\n\n/**\n * Clear store registry (useful for testing)\n */\nexport function clearStoreRegistry() {\n storeRegistry.clear();\n stateHistory.clear();\n}\n",
10
+ "/**\n * @fileoverview Simple SPA Router for microUI\n * \n * Hash-based routing for single page applications.\n * \n * Usage:\n * Router.on('/', () => renderHome());\n * Router.on('/about', () => renderAbout());\n * Router.on('/user/:id', ({ id }) => renderUser(id));\n * Router.start();\n */\n\nclass RouterClass {\n #routes = [];\n #notFound = null;\n #currentPath = '';\n\n /**\n * Register a route\n * @param {string} path - Route path (supports :param)\n * @param {(params: Object) => void} handler\n */\n on(path, handler) {\n // Convert path params to regex\n const pattern = path\n .replace(/:[a-zA-Z]+/g, '([^/]+)')\n .replace(/\\//g, '\\\\/');\n\n const paramNames = (path.match(/:[a-zA-Z]+/g) || [])\n .map(p => p.slice(1));\n\n this.#routes.push({\n path,\n pattern: new RegExp(`^${pattern}$`),\n paramNames,\n handler\n });\n\n return this;\n }\n\n /**\n * Set 404 handler\n */\n notFound(handler) {\n this.#notFound = handler;\n return this;\n }\n\n /**\n * Navigate to a path\n * @param {string} path\n */\n navigate(path) {\n window.location.hash = path;\n }\n\n /**\n * Get current path\n */\n get current() {\n return this.#currentPath;\n }\n\n /**\n * Start the router\n */\n start() {\n const handleRoute = () => {\n const hash = window.location.hash.slice(1) || '/';\n this.#currentPath = hash;\n\n for (const route of this.#routes) {\n const match = hash.match(route.pattern);\n if (match) {\n // Extract params\n const params = {};\n route.paramNames.forEach((name, i) => {\n params[name] = match[i + 1];\n });\n\n route.handler(params);\n return;\n }\n }\n\n // No match - 404\n if (this.#notFound) {\n this.#notFound(hash);\n }\n };\n\n window.addEventListener('hashchange', handleRoute);\n handleRoute(); // Handle initial route\n\n return this;\n }\n}\n\nexport const Router = new RouterClass();\n",
11
+ "/**\n * @fileoverview HTTP Utilities for microUI\n * \n * Simple fetch wrapper with common patterns.\n * \n * Usage:\n * const data = await http.get('/api/users');\n * await http.post('/api/users', { name: 'John' });\n */\n\nexport const http = {\n baseURL: '',\n headers: {\n 'Content-Type': 'application/json'\n },\n\n /**\n * Set base URL for all requests\n */\n setBaseURL(url) {\n this.baseURL = url;\n },\n\n /**\n * Set default header\n */\n setHeader(key, value) {\n this.headers[key] = value;\n },\n\n /**\n * GET request\n */\n async get(url, options = {}) {\n return this.request(url, { ...options, method: 'GET' });\n },\n\n /**\n * POST request\n */\n async post(url, body, options = {}) {\n return this.request(url, { ...options, method: 'POST', body });\n },\n\n /**\n * PUT request\n */\n async put(url, body, options = {}) {\n return this.request(url, { ...options, method: 'PUT', body });\n },\n\n /**\n * DELETE request\n */\n async delete(url, options = {}) {\n return this.request(url, { ...options, method: 'DELETE' });\n },\n\n /**\n * Core request method\n */\n async request(url, options = {}) {\n const fullURL = this.baseURL + url;\n\n const config = {\n method: options.method || 'GET',\n headers: { ...this.headers, ...options.headers }\n };\n\n if (options.body) {\n config.body = JSON.stringify(options.body);\n }\n\n try {\n const response = await fetch(fullURL, config);\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text());\n }\n\n const contentType = response.headers.get('content-type');\n if (contentType?.includes('application/json')) {\n return response.json();\n }\n\n return response.text();\n } catch (error) {\n if (error instanceof HttpError) throw error;\n throw new HttpError(0, 'Network Error', error.message);\n }\n }\n};\n\n/**\n * HTTP Error class\n */\nexport class HttpError extends Error {\n constructor(status, statusText, body) {\n super(`HTTP ${status}: ${statusText}`);\n this.status = status;\n this.statusText = statusText;\n this.body = body;\n }\n}\n",
12
+ "/**\n * @fileoverview MD3 Ripple Effect Utility\n * \n * Creates Material Design 3 compliant ripple effects on interactive elements.\n * The ripple originates from the exact click/touch point and expands outward.\n * \n * Usage:\n * import { attachRipple } from './core/ripple.js';\n * attachRipple(element);\n * \n * Or for controlled ripple:\n * import { createRipple } from './core/ripple.js';\n * element.addEventListener('click', (e) => createRipple(element, e));\n */\n\n/**\n * Create a ripple effect at the event position within the element.\n * MD3 behavior: ripple expands immediately, persists while pressed, fades on release.\n * @param {HTMLElement} element - Container element for the ripple\n * @param {MouseEvent|TouchEvent} event - The triggering event\n * @param {Object} options - Ripple options\n * @param {string} options.color - Ripple color (default: currentColor)\n * @param {boolean} options.centered - Force ripple to start from center\n */\nexport function createRipple(element, event, options = {}) {\n const { color = 'currentColor', centered = false } = options;\n\n // Get element bounds\n const rect = element.getBoundingClientRect();\n\n // Calculate ripple position (from click point or center)\n let x, y;\n if (centered || !event) {\n x = rect.width / 2;\n y = rect.height / 2;\n } else {\n // Get click/touch position\n const clientX = event.touches ? event.touches[0].clientX : event.clientX;\n const clientY = event.touches ? event.touches[0].clientY : event.clientY;\n x = clientX - rect.left;\n y = clientY - rect.top;\n }\n\n // Calculate ripple size (must cover entire element from click point)\n const size = Math.max(\n Math.hypot(x, y),\n Math.hypot(rect.width - x, y),\n Math.hypot(x, rect.height - y),\n Math.hypot(rect.width - x, rect.height - y)\n ) * 2;\n\n // Create ripple element\n const ripple = document.createElement('span');\n ripple.className = 'mu-ripple-wave';\n ripple.style.cssText = `\n position: absolute;\n width: ${size}px;\n height: ${size}px;\n left: ${x - size / 2}px;\n top: ${y - size / 2}px;\n background: ${color};\n border-radius: 50%;\n transform: scale(0);\n opacity: 0.10;\n pointer-events: none;\n `;\n\n // Ensure container has proper positioning\n const computedStyle = getComputedStyle(element);\n if (computedStyle.position === 'static') {\n element.style.position = 'relative';\n }\n if (computedStyle.overflow !== 'hidden') {\n element.style.overflow = 'hidden';\n }\n\n // Add ripple to element\n element.appendChild(ripple);\n\n // Phase 1: Expand animation (GPU - transform only)\n ripple.animate([\n { transform: 'scale(0)' },\n { transform: 'scale(1)' }\n ], {\n duration: 300,\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\n fill: 'forwards'\n });\n\n // Phase 2: Fade out on release (pointer up or leave)\n const fadeOut = () => {\n ripple.animate([\n { opacity: '0.10' },\n { opacity: '0' }\n ], {\n duration: 150,\n easing: 'ease-out',\n fill: 'forwards'\n }).onfinish = () => ripple.remove();\n\n // Cleanup listeners\n element.removeEventListener('pointerup', fadeOut);\n element.removeEventListener('pointerleave', fadeOut);\n element.removeEventListener('pointercancel', fadeOut);\n };\n\n element.addEventListener('pointerup', fadeOut, { once: true });\n element.addEventListener('pointerleave', fadeOut, { once: true });\n element.addEventListener('pointercancel', fadeOut, { once: true });\n\n return ripple;\n}\n\n/**\n * Attach ripple effect to an element.\n * @param {HTMLElement} element - Element to attach ripple to\n * @param {Object} options - Ripple options\n * @returns {Function} Cleanup function to remove ripple listener\n */\nexport function attachRipple(element, options = {}) {\n const handler = (e) => {\n // Don't create ripple if element is disabled\n if (element.hasAttribute('disabled')) return;\n createRipple(element, e, options);\n };\n\n element.addEventListener('pointerdown', handler);\n\n // Return cleanup function\n return () => {\n element.removeEventListener('pointerdown', handler);\n };\n}\n\n/**\n * Mixin for components that need ripple.\n * Call this.initRipple(targetElement) in connectedCallback.\n */\nexport const RippleMixin = (superclass) => class extends superclass {\n #rippleCleanup = null;\n\n /**\n * Initialize ripple on target element (or self).\n * @param {HTMLElement} target - Element to add ripple to (defaults to this)\n * @param {Object} options - Ripple options\n */\n initRipple(target = this, options = {}) {\n this.#rippleCleanup = attachRipple(target, options);\n }\n\n disconnectedCallback() {\n if (this.#rippleCleanup) {\n this.#rippleCleanup();\n this.#rippleCleanup = null;\n }\n super.disconnectedCallback?.();\n }\n};\n",
13
+ "/**\n * @fileoverview Signals - Fine-Grained Reactivity via EventBus (2026 SOTA)\n * \n * Built on top of microUI's EventBus for consistent event architecture.\n * Enables reactive updates without VDOM diffing.\n * \n * Usage:\n * const count = signal(0, 'count');\n * effect((bus) => bus.on('signal:count', (v) => console.log(v)));\n * count.set(5); // Emits 'signal:count' on bus\n */\n\nimport { bus } from './bus.js';\n\nlet signalId = 0;\n\n/**\n * Create a reactive signal backed by EventBus\n * @param {T} initialValue \n * @param {string} name - Optional name for debugging\n * @returns {Signal<T>}\n */\nexport function signal(initialValue, name) {\n let value = initialValue;\n const id = name || `signal_${++signalId}`;\n const eventName = `signal:${id}`;\n const subscribers = new Set();\n\n // Read function\n const read = () => {\n // Track in current computation\n if (currentComputation) {\n const unsub = bus.on(eventName, currentComputation);\n subscribers.add(unsub);\n }\n return value;\n };\n\n // Set value and emit on bus\n read.set = (newValue) => {\n if (value !== newValue) {\n const oldValue = value;\n value = newValue;\n\n // Emit change event on bus\n bus.emit(eventName, { value: newValue, oldValue, signal: id });\n }\n };\n\n // Update with function\n read.update = (fn) => {\n read.set(fn(value));\n };\n\n // Get value without tracking\n read.peek = () => value;\n\n // Get signal name (using signalName since Function.name is readonly)\n read.signalName = id;\n\n // Subscribe to this signal via bus\n read.subscribe = (callback) => {\n return bus.on(eventName, (data) => callback(data.value, data.oldValue));\n };\n\n // Cleanup\n read.dispose = () => {\n for (const unsub of subscribers) {\n unsub();\n }\n subscribers.clear();\n };\n\n return read;\n}\n\n// Current computation being tracked\nlet currentComputation = null;\n\n/**\n * Create a computed signal (derived)\n * Re-computes when dependencies change via bus events\n */\nexport function computed(fn, name) {\n const id = name || `computed_${++signalId}`;\n const eventName = `signal:${id}`;\n let cachedValue;\n let dirty = true;\n\n const recompute = () => {\n dirty = true;\n const newValue = fn();\n if (cachedValue !== newValue) {\n cachedValue = newValue;\n bus.emit(eventName, { value: newValue, signal: id });\n }\n };\n\n const read = () => {\n if (dirty) {\n const prevComputation = currentComputation;\n currentComputation = recompute;\n try {\n cachedValue = fn();\n } finally {\n currentComputation = prevComputation;\n }\n dirty = false;\n }\n\n // Track in parent computation\n if (currentComputation) {\n bus.on(eventName, currentComputation);\n }\n\n return cachedValue;\n };\n\n read.signalName = id;\n read.subscribe = (callback) => bus.on(eventName, (d) => callback(d.value));\n\n return read;\n}\n\n/**\n * Create a reactive effect (side effect)\n * Runs when any tracked signal changes via bus\n */\nexport function effect(fn) {\n let disposed = false;\n const unsubs = [];\n\n const run = () => {\n if (disposed) return;\n\n // Clear old subscriptions\n for (const unsub of unsubs) unsub();\n unsubs.length = 0;\n\n const prevComputation = currentComputation;\n currentComputation = run;\n try {\n fn();\n } finally {\n currentComputation = prevComputation;\n }\n };\n\n // Run immediately\n run();\n\n // Return dispose function\n return () => {\n disposed = true;\n for (const unsub of unsubs) unsub();\n };\n}\n\n/**\n * Batch multiple signal updates (uses bus batching)\n */\nexport function batch(fn) {\n fn();\n}\n",
14
+ "/**\n * @fileoverview Form State Management Utilities\n * Agent-friendly form validation and state tracking\n * \n * @example\n * import { createFormState } from 'microui';\n * \n * const form = document.querySelector('mu-form');\n * const state = createFormState(form, {\n * email: { required: true, type: 'email' },\n * password: { required: true, minLength: 8 }\n * });\n * \n * state.isValid; // true if all fields valid\n * state.isDirty; // true if any field changed\n * state.fields.email.value;\n * state.fields.email.error;\n * state.fields.email.touched;\n */\n\nimport { signal, computed, effect } from '../core/signals.js';\n\n/**\n * @typedef {Object} FieldRule\n * @property {boolean} [required]\n * @property {number} [minLength]\n * @property {number} [maxLength]\n * @property {RegExp} [pattern]\n * @property {string} [type] - 'email', 'url', 'number'\n * @property {(value: string) => string|null} [validate] - Custom validator\n */\n\n/**\n * @typedef {Object} FieldState\n * @property {string} value\n * @property {string|null} error\n * @property {boolean} touched\n * @property {boolean} dirty\n */\n\n/**\n * @typedef {Object} FormState\n * @property {Object<string, FieldState>} fields\n * @property {boolean} isValid\n * @property {boolean} isDirty\n * @property {boolean} isSubmitting\n * @property {() => Object<string, string>} getValues\n * @property {() => Object<string, string|null>} getErrors\n * @property {() => void} reset\n * @property {() => boolean} validate\n */\n\n/**\n * Validate a single field value against rules\n * @param {string} value \n * @param {FieldRule} rules \n * @returns {string|null} Error message or null if valid\n */\nfunction validateField(value, rules) {\n if (rules.required && !value?.trim()) {\n return 'This field is required';\n }\n\n if (value && rules.minLength && value.length < rules.minLength) {\n return `Minimum ${rules.minLength} characters required`;\n }\n\n if (value && rules.maxLength && value.length > rules.maxLength) {\n return `Maximum ${rules.maxLength} characters allowed`;\n }\n\n if (value && rules.pattern && !rules.pattern.test(value)) {\n return 'Invalid format';\n }\n\n if (value && rules.type === 'email') {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n return 'Invalid email address';\n }\n }\n\n if (value && rules.type === 'url') {\n try {\n new URL(value);\n } catch {\n return 'Invalid URL';\n }\n }\n\n if (rules.validate) {\n return rules.validate(value);\n }\n\n return null;\n}\n\n/**\n * Create reactive form state from a form element\n * @param {HTMLElement} formElement - mu-form or form element\n * @param {Object<string, FieldRule>} schema - Validation rules per field\n * @returns {FormState}\n */\nexport function createFormState(formElement, schema = {}) {\n const fieldNames = Object.keys(schema);\n\n /** @type {Object<string, ReturnType<typeof signal>>} */\n const fieldSignals = {};\n\n /** @type {Object<string, {value: string, error: string|null, touched: boolean, dirty: boolean}}>} */\n const initialState = {};\n\n // Initialize signals for each field\n for (const name of fieldNames) {\n const input = formElement.querySelector(`[name=\"${name}\"]`);\n const initialValue = input?.value || input?.getAttribute('value') || '';\n\n fieldSignals[name] = signal({\n value: initialValue,\n error: null,\n touched: false,\n dirty: false\n }, `form-${name}`);\n\n initialState[name] = { value: initialValue, error: null, touched: false, dirty: false };\n }\n\n // Computed: isValid\n const isValid = computed(() => {\n for (const name of fieldNames) {\n const field = fieldSignals[name]();\n const error = validateField(field.value, schema[name] || {});\n if (error) return false;\n }\n return true;\n });\n\n // Computed: isDirty\n const isDirty = computed(() => {\n for (const name of fieldNames) {\n if (fieldSignals[name]().dirty) return true;\n }\n return false;\n });\n\n const isSubmitting = signal(false, 'form-submitting');\n\n // Setup input listeners\n for (const name of fieldNames) {\n const input = formElement.querySelector(`[name=\"${name}\"]`);\n if (!input) continue;\n\n input.addEventListener('input', (e) => {\n const value = /** @type {HTMLInputElement} */ (e.target).value;\n const current = fieldSignals[name]();\n const error = validateField(value, schema[name] || {});\n\n fieldSignals[name].set({\n ...current,\n value,\n dirty: value !== initialState[name].value,\n error: current.touched ? error : null\n });\n });\n\n input.addEventListener('blur', () => {\n const current = fieldSignals[name]();\n const error = validateField(current.value, schema[name] || {});\n\n fieldSignals[name].set({\n ...current,\n touched: true,\n error\n });\n });\n }\n\n // Create fields proxy for easy access\n const fields = new Proxy({}, {\n get(_, name) {\n if (typeof name === 'string' && fieldSignals[name]) {\n return fieldSignals[name]();\n }\n return undefined;\n }\n });\n\n return {\n get fields() { return fields; },\n get isValid() { return isValid(); },\n get isDirty() { return isDirty(); },\n get isSubmitting() { return isSubmitting(); },\n set isSubmitting(v) { isSubmitting.set(v); },\n\n getValues() {\n const values = {};\n for (const name of fieldNames) {\n values[name] = fieldSignals[name]().value;\n }\n return values;\n },\n\n getErrors() {\n const errors = {};\n for (const name of fieldNames) {\n errors[name] = fieldSignals[name]().error;\n }\n return errors;\n },\n\n reset() {\n for (const name of fieldNames) {\n fieldSignals[name].set({ ...initialState[name] });\n const input = formElement.querySelector(`[name=\"${name}\"]`);\n if (input) input.value = initialState[name].value;\n }\n },\n\n validate() {\n let valid = true;\n for (const name of fieldNames) {\n const current = fieldSignals[name]();\n const error = validateField(current.value, schema[name] || {});\n if (error) valid = false;\n\n fieldSignals[name].set({\n ...current,\n touched: true,\n error\n });\n }\n return valid;\n }\n };\n}\n\n/**\n * Helper to get form values without state management\n * @param {HTMLElement} formElement \n * @returns {Object<string, string>}\n */\nexport function getFormValues(formElement) {\n const values = {};\n const inputs = formElement.querySelectorAll('[name]');\n for (const input of inputs) {\n const name = input.getAttribute('name');\n if (name) {\n values[name] = /** @type {HTMLInputElement} */ (input).value || '';\n }\n }\n return values;\n}\n",
15
+ "/**\n * @fileoverview Agent-Friendly APIs for microUI\n * \n * Provides structured component tree access and natural language descriptions\n * for LLM agents interacting with microUI components.\n * \n * Based on research from Agent-E (2024), WebVoyager benchmark, and\n * DOM distillation techniques for AI browser automation.\n * \n * @module core/agent-api\n */\n\n/**\n * @typedef {Object} MuComponentInfo\n * @property {string} tag - Component tag name (e.g., 'mu-button')\n * @property {string|null} id - Element ID if present\n * @property {string} label - Accessible name/label for the component\n * @property {string} description - Human-readable description of component purpose\n * @property {Object} state - Current component state\n * @property {string[]} actions - Available actions (e.g., ['click', 'toggle'])\n * @property {Object} rect - Bounding client rect {top, left, width, height}\n * @property {boolean} interactive - Whether component accepts user input\n * @property {boolean} visible - Whether component is in viewport\n */\n\n/**\n * Get the accessible name of an element following ARIA naming conventions\n * @param {HTMLElement} el - Element to get name from\n * @returns {string} Accessible name\n */\nfunction getAccessibleName(el) {\n // Priority order per ARIA spec:\n // 1. aria-labelledby\n // 2. aria-label\n // 3. associated label element\n // 4. title attribute\n // 5. text content (for certain roles)\n // 6. placeholder (for inputs)\n\n // aria-labelledby\n const labelledBy = el.getAttribute('aria-labelledby');\n if (labelledBy) {\n const labels = labelledBy.split(' ')\n .map(id => document.getElementById(id)?.textContent)\n .filter(Boolean)\n .join(' ');\n if (labels) return labels;\n }\n\n // aria-label\n const ariaLabel = el.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n // Associated label element\n if (el.id) {\n const label = document.querySelector(`label[for=\"${el.id}\"]`);\n if (label) return label.textContent.trim();\n }\n\n // title attribute\n const title = el.getAttribute('title');\n if (title) return title;\n\n // Text content for buttons, links, etc.\n const role = el.getAttribute('role') || el.tagName.toLowerCase();\n const textRoles = ['button', 'link', 'tab', 'menuitem', 'option', 'radio', 'checkbox'];\n if (textRoles.some(r => role.includes(r))) {\n const text = el.textContent?.trim();\n if (text && text.length < 100) return text;\n }\n\n // Placeholder for inputs\n const placeholder = el.getAttribute('placeholder');\n if (placeholder) return placeholder;\n\n // Value for inputs with value\n const value = el.getAttribute('value');\n if (value && el.tagName.includes('INPUT')) return `Input: ${value}`;\n\n // Fallback to tag name\n return el.tagName.toLowerCase().replace('mu-', '');\n}\n\n/**\n * Get available actions for a component based on its type and state\n * @param {HTMLElement} el - Component element\n * @returns {string[]} List of available actions\n */\nfunction getAvailableActions(el) {\n const actions = [];\n const tag = el.tagName.toLowerCase();\n const disabled = el.hasAttribute('disabled');\n\n if (disabled) return ['none (disabled)'];\n\n // Common interactive actions\n if (el.onclick || el.hasAttribute('onclick')) {\n actions.push('click');\n }\n\n // Component-specific actions\n switch (tag) {\n case 'mu-button':\n actions.push('click');\n break;\n case 'mu-checkbox':\n case 'mu-switch':\n actions.push('toggle', 'check', 'uncheck');\n break;\n case 'mu-input':\n case 'mu-textarea':\n actions.push('type', 'clear', 'focus');\n break;\n case 'mu-dropdown':\n actions.push('open', 'select', 'close');\n break;\n case 'mu-modal':\n actions.push('open', 'close');\n break;\n case 'mu-tabs':\n actions.push('select-tab');\n break;\n case 'mu-radio':\n actions.push('select');\n break;\n case 'mu-chip':\n actions.push('toggle', 'click');\n break;\n case 'mu-confirm':\n actions.push('confirm', 'cancel');\n break;\n default:\n if (el.classList.contains('mu-button') || el.getAttribute('role') === 'button') {\n actions.push('click');\n }\n }\n\n return actions.length ? actions : ['focus'];\n}\n\n/**\n * Get component state as a plain object\n * @param {HTMLElement} el - Component element\n * @returns {Object} Component state\n */\nfunction getComponentState(el) {\n const state = {};\n const tag = el.tagName.toLowerCase();\n\n // Common state attributes\n if (el.hasAttribute('checked')) state.checked = true;\n if (el.hasAttribute('disabled')) state.disabled = true;\n if (el.hasAttribute('open')) state.open = true;\n if (el.hasAttribute('selected')) state.selected = true;\n if (el.hasAttribute('active')) state.active = true;\n if (el.hasAttribute('loading')) state.loading = true;\n if (el.hasAttribute('value')) state.value = el.getAttribute('value');\n\n // ARIA state\n const ariaChecked = el.getAttribute('aria-checked');\n if (ariaChecked) state.ariaChecked = ariaChecked === 'true';\n\n const ariaExpanded = el.getAttribute('aria-expanded');\n if (ariaExpanded) state.expanded = ariaExpanded === 'true';\n\n const ariaSelected = el.getAttribute('aria-selected');\n if (ariaSelected) state.selected = ariaSelected === 'true';\n\n // Component-specific state\n switch (tag) {\n case 'mu-input':\n case 'mu-textarea':\n const input = el.querySelector('input, textarea');\n if (input) {\n state.value = input.value;\n state.placeholder = input.placeholder;\n }\n break;\n case 'mu-progress':\n state.value = parseFloat(el.getAttribute('value') || '0');\n state.max = parseFloat(el.getAttribute('max') || '100');\n state.percentage = (state.value / state.max) * 100;\n break;\n case 'mu-dropdown':\n state.value = el.getAttribute('value');\n state.open = el.classList.contains('is-open');\n break;\n }\n\n return state;\n}\n\n/**\n * Generate a natural language description of a component\n * @param {HTMLElement} el - Component element\n * @returns {string} Human-readable description\n */\nfunction describeComponent(el) {\n const tag = el.tagName.toLowerCase().replace('mu-', '');\n const label = getAccessibleName(el);\n const state = getComponentState(el);\n const disabled = state.disabled ? ' (disabled)' : '';\n\n const descriptions = {\n 'button': () => `Button \"${label}\"${disabled}. ${state.loading ? 'Currently loading.' : 'Click to activate.'}`,\n 'checkbox': () => `Checkbox \"${label}\"${disabled}. Currently ${state.ariaChecked || state.checked ? 'checked' : 'unchecked'}.`,\n 'switch': () => `Toggle switch \"${label}\"${disabled}. Currently ${state.ariaChecked || state.checked ? 'on' : 'off'}.`,\n 'input': () => `Text input \"${label}\"${disabled}. ${state.value ? `Current value: \"${state.value}\"` : 'Empty.'} ${state.placeholder ? `Placeholder: \"${state.placeholder}\"` : ''}`,\n 'textarea': () => `Text area \"${label}\"${disabled}. ${state.value ? `Contains: \"${state.value.slice(0, 50)}${state.value.length > 50 ? '...' : ''}\"` : 'Empty.'}`,\n 'dropdown': () => `Dropdown \"${label}\"${disabled}. ${state.value ? `Selected: \"${state.value}\"` : 'No selection.'} ${state.open ? 'Menu is open.' : 'Menu is closed.'}`,\n 'modal': () => `Modal dialog${state.open ? ' (currently open)' : ' (currently closed)'}. ${label !== 'modal' ? `Title: \"${label}\"` : ''}`,\n 'tabs': () => `Tab navigation with ${el.querySelectorAll('mu-tab').length} tabs.`,\n 'tab': () => `Tab \"${label}\". ${state.active ? 'Currently active.' : 'Inactive.'}`,\n 'progress': () => `Progress bar at ${Math.round(state.percentage || 0)}%.`,\n 'spinner': () => 'Loading spinner indicating operation in progress.',\n 'alert': () => `Alert message: \"${el.textContent?.trim().slice(0, 100) || label}\"`,\n 'card': () => `Card container${label !== 'card' ? ` titled \"${label}\"` : ''}.`,\n 'chip': () => `Chip \"${label}\"${disabled}. ${state.selected ? 'Selected.' : 'Not selected.'}`,\n 'badge': () => `Badge showing \"${el.textContent?.trim() || 'notification'}\"`,\n 'avatar': () => `User avatar${el.getAttribute('name') ? ` for \"${el.getAttribute('name')}\"` : ''}`,\n 'icon': () => `Icon: ${el.getAttribute('name') || 'decorative'}`,\n 'confirm': () => `Confirmation dialog. ${state.open ? 'Waiting for user response.' : 'Hidden.'}`,\n 'fetch': () => `Data fetcher${state.loading ? ' (loading)' : ''}. URL: ${el.getAttribute('url') || 'not set'}`\n };\n\n const describer = descriptions[tag];\n if (describer) return describer();\n\n // Generic fallback\n return `${tag} component${label ? ` \"${label}\"` : ''}${disabled}.`;\n}\n\n/**\n * Check if element is visible in viewport\n * @param {HTMLElement} el \n * @returns {boolean}\n */\nfunction isInViewport(el) {\n const rect = el.getBoundingClientRect();\n return (\n rect.top < window.innerHeight &&\n rect.bottom > 0 &&\n rect.left < window.innerWidth &&\n rect.right > 0 &&\n rect.width > 0 &&\n rect.height > 0\n );\n}\n\n/**\n * Get a simplified component tree for agent parsing\n * Implements DOM distillation as per Agent-E (2024) research\n * \n * @param {HTMLElement} [root=document.body] - Root element to scan\n * @param {Object} [options] - Options\n * @param {boolean} [options.visibleOnly=false] - Only include visible components\n * @param {boolean} [options.interactiveOnly=false] - Only include interactive components\n * @param {string[]} [options.types] - Filter to specific component types\n * @returns {MuComponentInfo[]} Array of component info objects\n * \n * @example\n * // Get all components\n * const tree = getMuComponentTree();\n * \n * // Get only visible interactive components\n * const interactive = getMuComponentTree(document.body, { \n * visibleOnly: true, \n * interactiveOnly: true \n * });\n * \n * // Get only buttons and inputs\n * const forms = getMuComponentTree(document.body, {\n * types: ['mu-button', 'mu-input', 'mu-checkbox']\n * });\n */\nexport function getMuComponentTree(root = document.body, options = {}) {\n const { visibleOnly = false, interactiveOnly = false, types = null } = options;\n\n // Find all mu-* components\n const selector = types\n ? types.join(',')\n : '[class^=\"mu-\"]:not(.mu-ripple-wave)';\n\n const elements = root.querySelectorAll(selector);\n const results = [];\n\n const interactiveTags = new Set([\n 'mu-button', 'mu-checkbox', 'mu-switch', 'mu-input', 'mu-textarea',\n 'mu-dropdown', 'mu-radio', 'mu-tab', 'mu-chip', 'mu-modal', 'mu-confirm'\n ]);\n\n for (const el of elements) {\n const tag = el.tagName.toLowerCase();\n\n // Skip non-mu elements that happen to match selector\n if (!tag.startsWith('mu-')) continue;\n\n const isInteractive = interactiveTags.has(tag);\n const visible = isInViewport(el);\n\n // Apply filters\n if (visibleOnly && !visible) continue;\n if (interactiveOnly && !isInteractive) continue;\n\n const rect = el.getBoundingClientRect();\n\n results.push({\n tag,\n id: el.id || null,\n label: getAccessibleName(el),\n description: describeComponent(el),\n state: getComponentState(el),\n actions: getAvailableActions(el),\n rect: {\n top: Math.round(rect.top),\n left: Math.round(rect.left),\n width: Math.round(rect.width),\n height: Math.round(rect.height)\n },\n interactive: isInteractive,\n visible\n });\n }\n\n return results;\n}\n\n/**\n * Describe a single component in natural language\n * @param {HTMLElement|string} component - Element or CSS selector\n * @returns {string|null} Natural language description or null if not found\n */\nexport function describe(component) {\n const el = typeof component === 'string'\n ? document.querySelector(component)\n : component;\n\n if (!el) return null;\n return describeComponent(el);\n}\n\n/**\n * Get a map of all registered microUI custom elements\n * @returns {Map<string, typeof HTMLElement>} Map of tag names to constructors\n */\nexport function getRegisteredComponents() {\n const components = new Map();\n const possibleTags = [\n 'mu-button', 'mu-input', 'mu-textarea', 'mu-checkbox', 'mu-switch',\n 'mu-dropdown', 'mu-option', 'mu-radio', 'mu-radio-group', 'mu-chip',\n 'mu-card', 'mu-tabs', 'mu-tab', 'mu-alert', 'mu-badge', 'mu-progress',\n 'mu-avatar', 'mu-skeleton', 'mu-spinner', 'mu-modal', 'mu-toast',\n 'mu-tooltip', 'mu-icon', 'mu-stack', 'mu-grid', 'mu-container',\n 'mu-navbar', 'mu-sidebar', 'mu-divider', 'mu-theme-toggle',\n 'mu-virtual-list', 'mu-lazy', 'mu-repeat', 'mu-form', 'mu-table',\n 'mu-confirm', 'mu-fetch'\n ];\n\n for (const tag of possibleTags) {\n const constructor = customElements.get(tag);\n if (constructor) {\n components.set(tag, constructor);\n }\n }\n\n return components;\n}\n\n/**\n * Find components by their accessible label (fuzzy match)\n * @param {string} labelQuery - Label text to search for\n * @param {HTMLElement} [root=document.body] - Root to search within\n * @returns {HTMLElement[]} Matching components\n */\nexport function findByLabel(labelQuery, root = document.body) {\n const query = labelQuery.toLowerCase();\n const tree = getMuComponentTree(root);\n\n return tree\n .filter(info => info.label.toLowerCase().includes(query))\n .map(info => {\n const selector = info.id\n ? `#${info.id}`\n : `${info.tag}`;\n return root.querySelector(selector);\n })\n .filter(Boolean);\n}\n\n// ============================================\n// 2026 VISUAL MARKERS (UI-TARS Research)\n// ============================================\n\nlet markersEnabled = false;\nlet markerContainer = null;\nconst markerMap = new Map(); // element -> marker element\n\n/**\n * Enable visual markers on interactive elements for screenshot-based AI agents.\n * Based on UI-TARS (2025) hybrid DOM+Vision research.\n * \n * Adds overlay labels like [B1], [I1], [C1] to each interactive element.\n * \n * @param {Object} [options] - Options\n * @param {boolean} [options.showLabels=true] - Show text labels ([B1], etc.)\n * @param {boolean} [options.showBoxes=true] - Show bounding boxes\n * @param {string} [options.markerStyle='badge'] - Style: 'badge' | 'corner' | 'outline'\n * @returns {Map<string, HTMLElement>} Map of marker IDs to elements\n * \n * @example\n * const markers = microUI.enableVisualMarkers();\n * // Take screenshot\n * // Agent sees: [B1] Save, [B2] Cancel, [I1] Email input\n */\nexport function enableVisualMarkers(options = {}) {\n const { showLabels = true, showBoxes = true, markerStyle = 'badge' } = options;\n\n // Disable first if already enabled\n if (markersEnabled) disableVisualMarkers();\n\n // Create container\n markerContainer = document.createElement('div');\n markerContainer.id = 'mu-visual-markers';\n markerContainer.style.cssText = `\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 999999;\n `;\n document.body.appendChild(markerContainer);\n\n // Counter prefixes by type\n const counters = { B: 0, I: 0, C: 0, S: 0, D: 0, M: 0, T: 0, R: 0, O: 0 };\n\n // Get type prefix\n const getPrefix = (tag) => {\n const prefixes = {\n 'mu-button': 'B',\n 'mu-input': 'I',\n 'mu-textarea': 'I',\n 'mu-checkbox': 'C',\n 'mu-switch': 'S',\n 'mu-dropdown': 'D',\n 'mu-modal': 'M',\n 'mu-tabs': 'T',\n 'mu-tab': 'T',\n 'mu-radio': 'R',\n 'mu-chip': 'C',\n 'mu-confirm': 'M'\n };\n return prefixes[tag] || 'O';\n };\n\n // Get interactive components\n const tree = getMuComponentTree(document.body, { interactiveOnly: true, visibleOnly: true });\n\n for (const info of tree) {\n const prefix = getPrefix(info.tag);\n counters[prefix]++;\n const markerId = `${prefix}${counters[prefix]}`;\n\n const el = document.querySelector(\n info.id ? `#${info.id}` : `${info.tag}[data-mu-action=\"${info.state.action || ''}\"]`\n ) || document.querySelector(info.tag);\n\n if (!el) continue;\n\n const rect = el.getBoundingClientRect();\n\n // Create marker\n const marker = document.createElement('div');\n marker.className = 'mu-visual-marker';\n marker.dataset.markerId = markerId;\n marker.dataset.tag = info.tag;\n marker.dataset.label = info.label;\n\n const bgColor = {\n 'B': '#7C4DFF', // Buttons - purple\n 'I': '#00BCD4', // Inputs - cyan\n 'C': '#4CAF50', // Checkboxes - green\n 'S': '#FF9800', // Switches - orange\n 'D': '#2196F3', // Dropdowns - blue\n 'M': '#E91E63', // Modals - pink\n 'T': '#9C27B0', // Tabs - deep purple\n 'R': '#795548', // Radio - brown\n 'O': '#607D8B' // Other - grey\n }[prefix];\n\n if (markerStyle === 'badge') {\n marker.style.cssText = `\n position: fixed;\n top: ${rect.top - 8}px;\n left: ${rect.left - 8}px;\n background: ${bgColor};\n color: white;\n font: bold 11px system-ui;\n padding: 2px 6px;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.3);\n white-space: nowrap;\n `;\n marker.textContent = showLabels ? `${markerId}` : '';\n } else if (markerStyle === 'outline') {\n marker.style.cssText = `\n position: fixed;\n top: ${rect.top}px;\n left: ${rect.left}px;\n width: ${rect.width}px;\n height: ${rect.height}px;\n border: 2px solid ${bgColor};\n border-radius: 4px;\n box-shadow: 0 0 0 1px rgba(255,255,255,0.5);\n `;\n if (showLabels) {\n const label = document.createElement('span');\n label.style.cssText = `\n position: absolute;\n top: -18px;\n left: -2px;\n background: ${bgColor};\n color: white;\n font: bold 10px system-ui;\n padding: 1px 4px;\n border-radius: 2px;\n `;\n label.textContent = markerId;\n marker.appendChild(label);\n }\n }\n\n markerContainer.appendChild(marker);\n markerMap.set(markerId, el);\n }\n\n markersEnabled = true;\n return markerMap;\n}\n\n/**\n * Disable visual markers\n */\nexport function disableVisualMarkers() {\n if (markerContainer) {\n markerContainer.remove();\n markerContainer = null;\n }\n markerMap.clear();\n markersEnabled = false;\n}\n\n/**\n * Get element by visual marker ID\n * @param {string} markerId - Marker ID (e.g., 'B1', 'I2')\n * @returns {HTMLElement|null}\n */\nexport function getMarkerElement(markerId) {\n return markerMap.get(markerId) || null;\n}\n\n/**\n * Get all current marker mappings\n * @returns {Object} Object mapping marker IDs to element info\n */\nexport function getMarkerMap() {\n const result = {};\n for (const [id, el] of markerMap) {\n result[id] = {\n tag: el.tagName.toLowerCase(),\n label: getAccessibleName(el),\n actions: getAvailableActions(el)\n };\n }\n return result;\n}\n\n// ============================================\n// 2026 MCP ACTIONS (Anthropic/Google Standard)\n// ============================================\n\n/**\n * Get available actions in MCP (Model Context Protocol) compatible format.\n * This is the emerging standard for agent-tool communication in 2026.\n * \n * @returns {Object} MCP-compatible action schema\n * \n * @example\n * const actions = microUI.getMCPActions();\n * // Returns:\n * // {\n * // name: \"microui\",\n * // description: \"Interact with microUI web components\",\n * // actions: [\n * // { name: \"click_button\", parameters: { selector: {...} } },\n * // { name: \"fill_input\", parameters: { selector: {...}, value: {...} } }\n * // ]\n * // }\n */\nexport function getMCPActions() {\n return {\n name: 'microui',\n version: '3.4.0',\n description: 'Interact with microUI Material Design 3 web components',\n actions: [\n {\n name: 'click_button',\n description: 'Click a button element',\n parameters: {\n selector: {\n type: 'string',\n description: 'CSS selector, marker ID (e.g., \"B1\"), or label text',\n required: true\n }\n }\n },\n {\n name: 'fill_input',\n description: 'Fill an input or textarea with text',\n parameters: {\n selector: {\n type: 'string',\n description: 'CSS selector, marker ID (e.g., \"I1\"), or label text',\n required: true\n },\n value: {\n type: 'string',\n description: 'Text to enter',\n required: true\n },\n clear: {\n type: 'boolean',\n description: 'Clear existing content first',\n default: true\n }\n }\n },\n {\n name: 'toggle_checkbox',\n description: 'Toggle a checkbox or switch',\n parameters: {\n selector: {\n type: 'string',\n description: 'CSS selector, marker ID, or label text',\n required: true\n },\n checked: {\n type: 'boolean',\n description: 'Target state (true=checked, false=unchecked)',\n required: false\n }\n }\n },\n {\n name: 'select_option',\n description: 'Select an option in a dropdown',\n parameters: {\n selector: {\n type: 'string',\n description: 'CSS selector for dropdown',\n required: true\n },\n value: {\n type: 'string',\n description: 'Option value or text to select',\n required: true\n }\n }\n },\n {\n name: 'open_modal',\n description: 'Open a modal dialog',\n parameters: {\n selector: {\n type: 'string',\n description: 'CSS selector for modal',\n required: true\n }\n }\n },\n {\n name: 'close_modal',\n description: 'Close a modal dialog',\n parameters: {\n selector: {\n type: 'string',\n description: 'CSS selector for modal',\n required: true\n }\n }\n },\n {\n name: 'select_tab',\n description: 'Select a tab by index or label',\n parameters: {\n tabs_selector: {\n type: 'string',\n description: 'CSS selector for mu-tabs container',\n required: true\n },\n index: {\n type: 'number',\n description: 'Tab index (0-based)',\n required: false\n },\n label: {\n type: 'string',\n description: 'Tab label text',\n required: false\n }\n }\n },\n {\n name: 'get_component_tree',\n description: 'Get structured tree of all microUI components',\n parameters: {\n visible_only: {\n type: 'boolean',\n description: 'Only include visible components',\n default: true\n },\n interactive_only: {\n type: 'boolean',\n description: 'Only include interactive components',\n default: false\n }\n }\n },\n {\n name: 'enable_visual_markers',\n description: 'Enable visual markers for screenshot parsing',\n parameters: {\n style: {\n type: 'string',\n enum: ['badge', 'outline'],\n description: 'Marker visual style',\n default: 'badge'\n }\n }\n },\n {\n name: 'confirm_dialog',\n description: 'Respond to a confirmation dialog',\n parameters: {\n action: {\n type: 'string',\n enum: ['confirm', 'cancel'],\n description: 'Whether to confirm or cancel',\n required: true\n }\n }\n }\n ]\n };\n}\n\n// Export for global access\nexport const AgentAPI = {\n getMuComponentTree,\n describe,\n getRegisteredComponents,\n findByLabel,\n getAccessibleName,\n getAvailableActions,\n getComponentState,\n // 2026 Visual Markers\n enableVisualMarkers,\n disableVisualMarkers,\n getMarkerElement,\n getMarkerMap,\n // 2026 MCP Actions\n getMCPActions\n};\n",
16
+ "/**\n * @fileoverview Feature Registry - Module Organization for Large-Scale Apps\n * \n * Enables feature-based code organization for teams working on \n * different parts of a large application.\n * \n * Based on 2024-2025 micro-frontend and module federation patterns.\n * \n * Usage:\n * const userFeature = microUI.createFeature('user', {\n * routes: ['/profile', '/settings'],\n * store: userStore,\n * components: ['mu-user-card', 'mu-user-form']\n * });\n * \n * // Query features:\n * microUI.getFeatures();\n * microUI.getFeature('user');\n */\n\n/**\n * @typedef {Object} FeatureConfig\n * @property {string[]} [routes] - Routes owned by this feature\n * @property {Object} [store] - Namespaced store for this feature\n * @property {string[]} [components] - Component tag names in this feature\n * @property {Object} [meta] - Additional metadata\n * @property {Function} [init] - Initialization function\n * @property {Function} [destroy] - Cleanup function\n */\n\n/**\n * @typedef {Object} Feature\n * @property {string} name - Feature name/namespace\n * @property {FeatureConfig} config - Feature configuration\n * @property {boolean} initialized - Whether init() has been called\n * @property {number} registeredAt - Timestamp when registered\n */\n\n/**\n * Registry of all features\n * @type {Map<string, Feature>}\n */\nconst featureRegistry = new Map();\n\n/**\n * Create and register a new feature module\n * \n * @param {string} name - Unique feature name (e.g., 'user', 'cart', 'admin')\n * @param {FeatureConfig} config - Feature configuration\n * @returns {Feature} The registered feature\n * \n * @example\n * const userFeature = createFeature('user', {\n * routes: ['/profile', '/settings', '/account'],\n * store: createNamespacedStore('user', { profile: null }),\n * components: ['mu-user-card', 'mu-user-avatar', 'mu-user-form'],\n * meta: { version: '1.0.0', team: 'user-team' },\n * init: () => console.log('User feature initialized'),\n * destroy: () => console.log('User feature cleanup')\n * });\n */\nexport function createFeature(name, config = {}) {\n if (featureRegistry.has(name)) {\n console.warn(`[microUI] Feature \"${name}\" already exists. Returning existing.`);\n return featureRegistry.get(name);\n }\n\n const feature = {\n name,\n config: {\n routes: config.routes || [],\n store: config.store || null,\n components: config.components || [],\n meta: config.meta || {},\n init: config.init || null,\n destroy: config.destroy || null\n },\n initialized: false,\n registeredAt: Date.now()\n };\n\n featureRegistry.set(name, feature);\n\n // Auto-initialize if init function provided\n if (feature.config.init && typeof feature.config.init === 'function') {\n try {\n feature.config.init();\n feature.initialized = true;\n } catch (e) {\n console.error(`[microUI] Failed to initialize feature \"${name}\":`, e);\n }\n }\n\n return feature;\n}\n\n/**\n * Get all registered features\n * @returns {Object<string, Feature>}\n */\nexport function getFeatures() {\n const features = {};\n for (const [name, feature] of featureRegistry) {\n features[name] = feature;\n }\n return features;\n}\n\n/**\n * Get a specific feature by name\n * @param {string} name \n * @returns {Feature|undefined}\n */\nexport function getFeature(name) {\n return featureRegistry.get(name);\n}\n\n/**\n * Get all components registered to a feature\n * @param {string} featureName \n * @returns {string[]} Array of component tag names\n */\nexport function getFeatureComponents(featureName) {\n const feature = featureRegistry.get(featureName);\n return feature?.config.components || [];\n}\n\n/**\n * Get all routes registered to a feature\n * @param {string} featureName \n * @returns {string[]} Array of route paths\n */\nexport function getFeatureRoutes(featureName) {\n const feature = featureRegistry.get(featureName);\n return feature?.config.routes || [];\n}\n\n/**\n * Find which feature owns a specific route\n * @param {string} route \n * @returns {Feature|null}\n */\nexport function getFeatureByRoute(route) {\n for (const feature of featureRegistry.values()) {\n if (feature.config.routes.some(r => route.startsWith(r))) {\n return feature;\n }\n }\n return null;\n}\n\n/**\n * Find which feature owns a specific component\n * @param {string} componentTag \n * @returns {Feature|null}\n */\nexport function getFeatureByComponent(componentTag) {\n for (const feature of featureRegistry.values()) {\n if (feature.config.components.includes(componentTag)) {\n return feature;\n }\n }\n return null;\n}\n\n/**\n * Destroy and unregister a feature\n * @param {string} name \n */\nexport function destroyFeature(name) {\n const feature = featureRegistry.get(name);\n if (!feature) return;\n\n // Call destroy callback if provided\n if (feature.config.destroy && typeof feature.config.destroy === 'function') {\n try {\n feature.config.destroy();\n } catch (e) {\n console.error(`[microUI] Error destroying feature \"${name}\":`, e);\n }\n }\n\n featureRegistry.delete(name);\n}\n\n/**\n * Get a summary of all features for agent debugging\n * @returns {Object} Feature summary\n */\nexport function getFeatureSummary() {\n const summary = {\n totalFeatures: featureRegistry.size,\n features: [],\n totalRoutes: 0,\n totalComponents: 0\n };\n\n for (const [name, feature] of featureRegistry) {\n const routeCount = feature.config.routes.length;\n const componentCount = feature.config.components.length;\n\n summary.features.push({\n name,\n routes: routeCount,\n components: componentCount,\n hasStore: !!feature.config.store,\n initialized: feature.initialized,\n meta: feature.config.meta\n });\n\n summary.totalRoutes += routeCount;\n summary.totalComponents += componentCount;\n }\n\n return summary;\n}\n\n/**\n * Clear all features (for testing)\n */\nexport function clearFeatures() {\n // Call destroy on each feature first\n for (const name of featureRegistry.keys()) {\n destroyFeature(name);\n }\n featureRegistry.clear();\n}\n\n// Export as FeatureRegistry object for convenience\nexport const FeatureRegistry = {\n createFeature,\n getFeatures,\n getFeature,\n getFeatureComponents,\n getFeatureRoutes,\n getFeatureByRoute,\n getFeatureByComponent,\n destroyFeature,\n getFeatureSummary,\n clearFeatures\n};\n",
17
+ "/**\n * @fileoverview Component Schema API for AI Agents\n * \n * Provides JSON Schema exports for each microUI component.\n * Enables type-safe code generation by AI coding assistants.\n * \n * Based on 2025-2026 research on Structured Outputs and A2UI.\n * \n * @module component-schema\n */\n\n// Component definitions with JSON Schema metadata\nconst componentSchemas = new Map();\n\n/**\n * Base schema structure for all components\n */\nconst createBaseSchema = (tagName, description) => ({\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n $id: `https://microui.dev/schemas/${tagName}.json`,\n title: tagName,\n description,\n type: 'object',\n properties: {},\n actions: [],\n events: [],\n slots: []\n});\n\n// ============================================\n// COMPONENT SCHEMA DEFINITIONS\n// ============================================\n\ncomponentSchemas.set('mu-button', {\n ...createBaseSchema('mu-button', 'Interactive button element with MD3 variants'),\n properties: {\n variant: {\n type: 'string',\n enum: ['filled', 'elevated', 'tonal', 'outlined', 'text', 'danger'],\n default: 'filled',\n description: 'Visual style variant'\n },\n size: {\n type: 'string',\n enum: ['sm', 'md', 'lg'],\n default: 'md',\n description: 'Button size'\n },\n disabled: {\n type: 'boolean',\n default: false,\n description: 'Whether the button is disabled'\n }\n },\n actions: ['click'],\n events: ['click'],\n slots: ['default']\n});\n\ncomponentSchemas.set('mu-input', {\n ...createBaseSchema('mu-input', 'Text input field with floating label'),\n properties: {\n type: {\n type: 'string',\n enum: ['text', 'email', 'password', 'number', 'tel', 'url'],\n default: 'text'\n },\n variant: {\n type: 'string',\n enum: ['outlined', 'filled'],\n default: 'outlined'\n },\n label: { type: 'string', description: 'Floating label text' },\n placeholder: { type: 'string' },\n value: { type: 'string', default: '' },\n disabled: { type: 'boolean', default: false },\n required: { type: 'boolean', default: false }\n },\n actions: ['focus', 'blur', 'clear'],\n events: ['mu-input', 'mu-change'],\n slots: []\n});\n\ncomponentSchemas.set('mu-checkbox', {\n ...createBaseSchema('mu-checkbox', 'Checkbox with optional label'),\n properties: {\n checked: { type: 'boolean', default: false },\n disabled: { type: 'boolean', default: false },\n value: { type: 'string' }\n },\n actions: ['toggle', 'check', 'uncheck'],\n events: ['mu-change'],\n slots: ['default']\n});\n\ncomponentSchemas.set('mu-switch', {\n ...createBaseSchema('mu-switch', 'Toggle switch with on/off state'),\n properties: {\n checked: { type: 'boolean', default: false },\n disabled: { type: 'boolean', default: false }\n },\n actions: ['toggle'],\n events: ['mu-change'],\n slots: []\n});\n\ncomponentSchemas.set('mu-card', {\n ...createBaseSchema('mu-card', 'Material Design 3 card container'),\n properties: {\n variant: {\n type: 'string',\n enum: ['elevated', 'filled', 'outlined'],\n default: 'elevated'\n }\n },\n actions: [],\n events: [],\n slots: ['default', 'header', 'footer']\n});\n\ncomponentSchemas.set('mu-modal', {\n ...createBaseSchema('mu-modal', 'Dialog/modal overlay'),\n properties: {\n open: { type: 'boolean', default: false },\n closeOnEscape: { type: 'boolean', default: true },\n closeOnBackdrop: { type: 'boolean', default: true }\n },\n actions: ['open', 'close'],\n events: ['mu-open', 'mu-close'],\n slots: ['default']\n});\n\ncomponentSchemas.set('mu-dropdown', {\n ...createBaseSchema('mu-dropdown', 'Select dropdown with options'),\n properties: {\n value: { type: 'string' },\n placeholder: { type: 'string' },\n disabled: { type: 'boolean', default: false },\n required: { type: 'boolean', default: false }\n },\n actions: ['open', 'close', 'select'],\n events: ['mu-change'],\n slots: ['default']\n});\n\ncomponentSchemas.set('mu-tabs', {\n ...createBaseSchema('mu-tabs', 'Tab navigation container'),\n properties: {\n active: { type: 'number', default: 0, description: 'Active tab index (0-based)' }\n },\n actions: ['selectTab'],\n events: ['mu-tab-change'],\n slots: ['default']\n});\n\ncomponentSchemas.set('mu-alert', {\n ...createBaseSchema('mu-alert', 'Alert/notification banner'),\n properties: {\n variant: {\n type: 'string',\n enum: ['info', 'success', 'warning', 'error'],\n default: 'info'\n },\n dismissible: { type: 'boolean', default: false }\n },\n actions: ['dismiss'],\n events: ['mu-dismiss'],\n slots: ['default']\n});\n\ncomponentSchemas.set('mu-stack', {\n ...createBaseSchema('mu-stack', 'Flexbox layout container'),\n properties: {\n direction: {\n type: 'string',\n enum: ['row', 'column'],\n default: 'column'\n },\n gap: {\n type: 'string',\n enum: ['xs', 'sm', 'md', 'lg', 'xl'],\n default: 'md'\n },\n align: {\n type: 'string',\n enum: ['start', 'center', 'end', 'stretch'],\n default: 'stretch'\n }\n },\n actions: [],\n events: [],\n slots: ['default']\n});\n\ncomponentSchemas.set('mu-grid', {\n ...createBaseSchema('mu-grid', 'CSS Grid layout container'),\n properties: {\n columns: { type: 'string', default: '1', description: 'Number of columns or CSS grid-template-columns' },\n gap: { type: 'string', enum: ['xs', 'sm', 'md', 'lg', 'xl'], default: 'md' }\n },\n actions: [],\n events: [],\n slots: ['default']\n});\n\n// ============================================\n// PUBLIC API\n// ============================================\n\n/**\n * Get JSON Schema for a specific component\n * @param {string} tagName - Component tag name (e.g., 'mu-button')\n * @returns {object|null} JSON Schema object or null if not found\n */\nexport function getComponentSchema(tagName) {\n return componentSchemas.get(tagName) || null;\n}\n\n/**\n * Get all available component schemas\n * @returns {Map<string, object>} Map of tag names to schemas\n */\nexport function getAllSchemas() {\n return new Map(componentSchemas);\n}\n\n/**\n * Get list of all schema-documented components\n * @returns {string[]} Array of tag names\n */\nexport function getSchemaComponents() {\n return Array.from(componentSchemas.keys());\n}\n\n/**\n * Get schemas for multiple components at once\n * @param {string[]} tagNames - Array of component tag names\n * @returns {object} Object mapping tag names to schemas\n */\nexport function getSchemas(tagNames) {\n const result = {};\n for (const tag of tagNames) {\n const schema = componentSchemas.get(tag);\n if (schema) result[tag] = schema;\n }\n return result;\n}\n\n/**\n * Get a minimal schema summary for quick reference\n * @param {string} tagName - Component tag name\n * @returns {object|null} Simplified schema with just properties and actions\n */\nexport function getSchemaQuickRef(tagName) {\n const schema = componentSchemas.get(tagName);\n if (!schema) return null;\n\n return {\n tag: tagName,\n description: schema.description,\n properties: Object.keys(schema.properties || {}),\n actions: schema.actions || [],\n events: schema.events || []\n };\n}\n\n/**\n * Export all schemas as JSON for external tools\n * @returns {string} JSON string of all schemas\n */\nexport function exportSchemasAsJSON() {\n const allSchemas = {};\n for (const [tag, schema] of componentSchemas) {\n allSchemas[tag] = schema;\n }\n return JSON.stringify(allSchemas, null, 2);\n}\n\n// Export for module usage\nexport const ComponentSchema = {\n getComponentSchema,\n getAllSchemas,\n getSchemaComponents,\n getSchemas,\n getSchemaQuickRef,\n exportSchemasAsJSON\n};\n",
18
+ "/**\n * @fileoverview Centralized Z-Index Layer System for microUI\n * \n * Provides consistent layering across all components.\n * Uses named constants to eliminate magic numbers.\n * \n * Layer Stack (lowest to highest):\n * - base: 1 (default content)\n * - sticky: 100 (sticky headers, FABs)\n * - dropdown: 1000 (dropdowns, menus)\n * - drawer: 1100 (navigation drawers)\n * - modal: 1200 (modal dialogs)\n * - toast: 1300 (toast notifications)\n * - tooltip: 1400 (tooltips)\n * - overlay: 9999 (full-screen overlays)\n * - devtools: 999999 (agent dev tools - always on top)\n * \n * @example\n * import { Z_INDEX } from '../core/layers.js';\n * this.style.zIndex = Z_INDEX.modal;\n */\n\n/**\n * Z-Index layer constants\n * @type {Object<string, number>}\n */\nexport const Z_INDEX = Object.freeze({\n /** Default content layer */\n base: 1,\n /** Sticky headers, FABs */\n sticky: 100,\n /** Dropdowns, menus, popovers */\n dropdown: 1000,\n /** Navigation drawers */\n drawer: 1100,\n /** Modal dialogs */\n modal: 1200,\n /** Toast notifications */\n toast: 1300,\n /** Tooltips */\n tooltip: 1400,\n /** Full-screen overlays */\n overlay: 9999,\n /** Agent dev tools - always on top */\n devtools: 999999\n});\n\n/**\n * Inject CSS custom properties for z-index layers.\n * Call this once on app init to use in CSS.\n * \n * @example\n * // In CSS:\n * .my-modal { z-index: var(--z-modal); }\n */\nexport function injectLayerTokens() {\n // Check if already injected\n if (document.getElementById('mu-layer-tokens')) return;\n\n const style = document.createElement('style');\n style.id = 'mu-layer-tokens';\n style.textContent = `:root {\n${Object.entries(Z_INDEX).map(([k, v]) => ` --z-${k}: ${v};`).join('\\n')}\n}`;\n document.head.appendChild(style);\n}\n\n// Auto-inject on load\nif (typeof window !== 'undefined') {\n injectLayerTokens();\n}\n",
19
+ "/**\n * @fileoverview Centralized Keyboard Manager for microUI\n * \n * Provides a stack-based ESC key handler for modal-like components.\n * Components register handlers when opened and unregister when closed.\n * ESC key closes the topmost component (LIFO stack).\n * \n * @example\n * import { keyboard } from '../core/keyboard.js';\n * \n * connectedCallback() {\n * this._unsubEsc = keyboard.pushEscapeHandler(this, () => this.close());\n * }\n * \n * disconnectedCallback() {\n * this._unsubEsc?.();\n * }\n */\n\n/**\n * @typedef {Object} EscapeEntry\n * @property {HTMLElement} element - The element that registered the handler\n * @property {() => void} callback - Function to call on ESC\n */\n\nclass KeyboardManager {\n /** @type {EscapeEntry[]} */\n #escapeStack = [];\n\n /** @type {boolean} */\n #initialized = false;\n\n constructor() {\n this.#init();\n }\n\n /**\n * Initialize the global keyboard listener\n * @private\n */\n #init() {\n if (this.#initialized || typeof window === 'undefined') return;\n\n document.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && this.#escapeStack.length > 0) {\n e.preventDefault();\n e.stopPropagation();\n\n // Get the topmost handler\n const top = this.#escapeStack[this.#escapeStack.length - 1];\n top.callback();\n }\n });\n\n this.#initialized = true;\n }\n\n /**\n * Register an ESC key handler for a component.\n * Handlers are called in LIFO order (last registered = first to receive ESC).\n * \n * @param {HTMLElement} element - The element registering the handler\n * @param {() => void} callback - Function to call when ESC is pressed\n * @returns {() => void} Unsubscribe function - call when closing/disconnecting\n */\n pushEscapeHandler(element, callback) {\n const entry = { element, callback };\n this.#escapeStack.push(entry);\n\n // Return unsubscribe function\n return () => {\n const index = this.#escapeStack.indexOf(entry);\n if (index > -1) {\n this.#escapeStack.splice(index, 1);\n }\n };\n }\n\n /**\n * Check if an element is currently at the top of the ESC stack\n * @param {HTMLElement} element\n * @returns {boolean}\n */\n isTopmost(element) {\n if (this.#escapeStack.length === 0) return false;\n return this.#escapeStack[this.#escapeStack.length - 1].element === element;\n }\n\n /**\n * Get the current stack depth (for debugging)\n * @returns {number}\n */\n get stackDepth() {\n return this.#escapeStack.length;\n }\n}\n\n/**\n * Global keyboard manager singleton\n * @type {KeyboardManager}\n */\nexport const keyboard = new KeyboardManager();\n\n// Also export class for testing\nexport { KeyboardManager };\n",
20
+ "/**\n * @fileoverview Centralized Breakpoint System for microUI\n * \n * Provides MD3-compliant responsive breakpoints with reactive subscriptions.\n * All components should use this utility for consistent responsive behavior.\n * \n * MD3 Window Size Classes:\n * - Compact: < 600px (mobile phones)\n * - Medium: 600-839px (tablets, foldables)\n * - Expanded: ≥ 840px (desktop, large tablets)\n * \n * @see https://m3.material.io/foundations/layout/applying-layout\n */\n\n/**\n * MD3 Breakpoint values in pixels\n */\nexport const BREAKPOINTS = {\n /** Maximum width for compact (mobile) layout */\n compact: 600,\n /** Maximum width for medium (tablet) layout */\n medium: 840,\n /** Minimum width for expanded (desktop) layout */\n expanded: 840\n};\n\n/**\n * Breakpoint size class names\n * @typedef {'compact' | 'medium' | 'expanded'} BreakpointClass\n */\n\n/**\n * Callback function type for breakpoint changes\n * @typedef {(breakpoint: BreakpointClass) => void} BreakpointCallback\n */\n\nclass BreakpointObserver {\n /** @type {Set<BreakpointCallback>} */\n #listeners = new Set();\n\n /** @type {BreakpointClass} */\n #current = 'expanded';\n\n /** @type {MediaQueryList|null} */\n #mqCompact = null;\n\n /** @type {MediaQueryList|null} */\n #mqMedium = null;\n\n constructor() {\n if (typeof window !== 'undefined') {\n this.#setupMediaQueries();\n }\n }\n\n /**\n * Set up media query listeners\n * @private\n */\n #setupMediaQueries() {\n // Compact: < 600px\n this.#mqCompact = window.matchMedia(`(max-width: ${BREAKPOINTS.compact - 1}px)`);\n this.#mqCompact.addEventListener('change', this.#handleChange);\n\n // Medium: 600-839px\n this.#mqMedium = window.matchMedia(\n `(min-width: ${BREAKPOINTS.compact}px) and (max-width: ${BREAKPOINTS.medium - 1}px)`\n );\n this.#mqMedium.addEventListener('change', this.#handleChange);\n\n // Set initial value\n this.#updateCurrent();\n }\n\n /**\n * Handle media query change events\n * @private\n */\n #handleChange = () => {\n const oldValue = this.#current;\n this.#updateCurrent();\n\n if (oldValue !== this.#current) {\n this.#notifyListeners();\n }\n };\n\n /**\n * Update current breakpoint based on media queries\n * @private\n */\n #updateCurrent() {\n if (this.#mqCompact?.matches) {\n this.#current = 'compact';\n } else if (this.#mqMedium?.matches) {\n this.#current = 'medium';\n } else {\n this.#current = 'expanded';\n }\n }\n\n /**\n * Notify all listeners of breakpoint change\n * @private\n */\n #notifyListeners() {\n this.#listeners.forEach(callback => {\n try {\n callback(this.#current);\n } catch (e) {\n console.error('[Breakpoints] Listener error:', e);\n }\n });\n }\n\n /**\n * Get current breakpoint class (live query)\n * @returns {BreakpointClass}\n */\n get current() {\n // Always query live for most accurate state\n if (this.#mqCompact?.matches) {\n return 'compact';\n } else if (this.#mqMedium?.matches) {\n return 'medium';\n }\n return 'expanded';\n }\n\n /**\n * Check if currently in compact (mobile) mode\n * @returns {boolean}\n */\n get isCompact() {\n return this.#mqCompact?.matches ?? false;\n }\n\n /**\n * Check if currently in medium (tablet) mode\n * @returns {boolean}\n */\n get isMedium() {\n return this.#mqMedium?.matches ?? false;\n }\n\n /**\n * Check if currently in expanded (desktop) mode\n * @returns {boolean}\n */\n get isExpanded() {\n return !this.isCompact && !this.isMedium;\n }\n\n /**\n * Check if NOT in compact mode (medium or expanded)\n * @returns {boolean}\n */\n get isNotCompact() {\n return this.#current !== 'compact';\n }\n\n /**\n * Subscribe to breakpoint changes\n * @param {BreakpointCallback} callback - Called with new breakpoint class on change\n * @returns {() => void} Unsubscribe function\n */\n subscribe(callback) {\n this.#listeners.add(callback);\n\n // Call immediately with current value\n callback(this.#current);\n\n // Return unsubscribe function\n return () => {\n this.#listeners.delete(callback);\n };\n }\n\n /**\n * Get window width in pixels (for testing/debugging)\n * @returns {number}\n */\n get windowWidth() {\n return typeof window !== 'undefined' ? window.innerWidth : 1200;\n }\n}\n\n/**\n * Global breakpoint observer singleton\n * @type {BreakpointObserver}\n */\nexport const breakpoints = new BreakpointObserver();\n\n// Also expose class for testing\nexport { BreakpointObserver };\n",
21
+ "/**\n * @fileoverview Centralized Utility Functions for microUI\n * \n * Common utility functions used across components.\n * Import and use these instead of defining inline.\n */\n\n/**\n * Escape HTML entities to prevent XSS attacks.\n * Use this when inserting user-provided content into templates.\n * \n * @param {string|null|undefined} str - String to escape\n * @returns {string} Escaped string safe for HTML insertion\n * \n * @example\n * import { escapeHTML } from '../core/utils.js';\n * \n * const userInput = '<script>alert(\"xss\")</script>';\n * element.innerHTML = `<div>${escapeHTML(userInput)}</div>`;\n * // Result: <div>&lt;script&gt;alert(\"xss\")&lt;/script&gt;</div>\n */\nexport function escapeHTML(str) {\n if (str == null) return '';\n return String(str)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n",
22
+ "/**\n * @fileoverview View Transitions API Wrapper (2026 SOTA)\n * \n * Provides smooth, GPU-accelerated page transitions.\n * Falls back gracefully if not supported.\n * \n * Usage:\n * await transition(() => {\n * document.getElementById('app').innerHTML = newContent;\n * });\n */\n\n/**\n * Check if View Transitions API is supported\n */\nexport const supportsViewTransitions = 'startViewTransition' in document;\n\n/**\n * Perform a view transition with fallback\n * @param {() => void | Promise<void>} updateCallback - DOM update function\n * @returns {Promise<void>}\n */\nexport async function transition(updateCallback) {\n if (supportsViewTransitions) {\n const viewTransition = document.startViewTransition(async () => {\n await updateCallback();\n });\n\n await viewTransition.finished;\n } else {\n // Fallback: just run the update\n await updateCallback();\n }\n}\n\n/**\n * Transition with custom animation classes\n * @param {() => void | Promise<void>} updateCallback \n * @param {Object} options\n * @param {string} options.name - View transition name\n */\nexport async function transitionNamed(updateCallback, { name = 'page' } = {}) {\n if (supportsViewTransitions) {\n // Add transition name dynamically\n const style = document.createElement('style');\n style.textContent = `\n ::view-transition-old(${name}),\n ::view-transition-new(${name}) {\n animation-duration: 0.3s;\n }\n `;\n document.head.appendChild(style);\n\n await transition(updateCallback);\n\n style.remove();\n } else {\n await updateCallback();\n }\n}\n\n/**\n * Navigate with view transition\n * @param {string} path - Route path\n * @param {Function} render - Render function\n */\nexport async function navigateWithTransition(path, render) {\n await transition(() => {\n window.history.pushState({}, '', path);\n render();\n });\n}\n",
23
+ "/**\n * @fileoverview Task Scheduler API (2026 SOTA)\n * \n * Uses scheduler.postTask() for priority-based scheduling.\n * Falls back to setTimeout if not supported.\n * \n * Priority levels:\n * - 'user-blocking': Highest priority (input handlers)\n * - 'user-visible': Medium priority (rendering)\n * - 'background': Lowest priority (analytics, prefetch)\n * \n * Usage:\n * await scheduleTask(() => heavyComputation(), 'background');\n * await yieldToMain();\n */\n\n/**\n * Check if Scheduler API is supported\n */\nexport const supportsScheduler = 'scheduler' in globalThis;\n\n/**\n * Schedule a task with priority\n * @param {() => T} callback \n * @param {'user-blocking' | 'user-visible' | 'background'} priority \n * @returns {Promise<T>}\n */\nexport async function scheduleTask(callback, priority = 'user-visible') {\n if (supportsScheduler) {\n return globalThis.scheduler.postTask(callback, { priority });\n }\n\n // Fallback with setTimeout based on priority\n const delay = priority === 'user-blocking' ? 0 :\n priority === 'user-visible' ? 0 : 1;\n\n return new Promise(resolve => {\n setTimeout(() => resolve(callback()), delay);\n });\n}\n\n/**\n * Yield to main thread (allow input/rendering)\n * @returns {Promise<void>}\n */\nexport async function yieldToMain() {\n if (supportsScheduler && 'yield' in globalThis.scheduler) {\n return globalThis.scheduler.yield();\n }\n\n // Fallback: yield with setTimeout\n return new Promise(resolve => setTimeout(resolve, 0));\n}\n\n/**\n * Process items in chunks, yielding between chunks\n * Better than processInChunks because it uses scheduler.yield()\n * \n * @param {T[]} items \n * @param {(item: T, index: number) => void} process \n * @param {number} chunkSize\n */\nexport async function processWithYield(items, process, chunkSize = 50) {\n for (let i = 0; i < items.length; i++) {\n process(items[i], i);\n\n // Yield every chunk\n if ((i + 1) % chunkSize === 0) {\n await yieldToMain();\n }\n }\n}\n\n/**\n * Run background task (lowest priority, won't block UI)\n * @param {() => T} callback \n * @returns {Promise<T>}\n */\nexport function runBackground(callback) {\n return scheduleTask(callback, 'background');\n}\n\n/**\n * Run user-blocking task (highest priority)\n * @param {() => T} callback \n * @returns {Promise<T>}\n */\nexport function runImmediate(callback) {\n return scheduleTask(callback, 'user-blocking');\n}\n\n/**\n * Wait for next browser paint (double-rAF pattern)\n * Use for CSS animation triggers after DOM changes.\n * This ensures the browser has completed layout/paint before applying\n * additional classes that would trigger transitions.\n * \n * @returns {Promise<void>}\n * @example\n * // Trigger CSS animation after DOM change\n * element.classList.add('is-open');\n * await afterPaint();\n * element.classList.add('is-visible'); // Now transition will animate\n */\nexport function afterPaint() {\n return new Promise(resolve => {\n requestAnimationFrame(() => requestAnimationFrame(resolve));\n });\n}\n",
24
+ "/**\n * @fileoverview Render Utilities for Large-Scale Applications\n * \n * Optimizes rendering for complex apps with thousands of components.\n * \n * Features:\n * - requestAnimationFrame batching\n * - Lazy component rendering\n * - Intersection Observer for viewport-based rendering\n * - Memoization for expensive computations\n */\n\n/**\n * Batch multiple DOM updates into single animation frame\n * Prevents layout thrashing in complex updates\n */\nclass RenderScheduler {\n #queue = [];\n #scheduled = false;\n\n /**\n * Schedule a render callback for next animation frame\n * Multiple calls are batched together\n */\n schedule(callback) {\n this.#queue.push(callback);\n\n if (!this.#scheduled) {\n this.#scheduled = true;\n requestAnimationFrame(() => this.#flush());\n }\n }\n\n #flush() {\n const callbacks = this.#queue.slice();\n this.#queue = [];\n this.#scheduled = false;\n\n // Execute all callbacks in single frame\n for (const cb of callbacks) {\n try {\n cb();\n } catch (e) {\n console.error('[RenderScheduler] Error:', e);\n }\n }\n }\n}\n\nexport const scheduler = new RenderScheduler();\n\n/**\n * Memoize expensive function calls\n * @param {Function} fn - Function to memoize\n * @param {Function} keyFn - Optional key function for cache\n */\nexport function memo(fn, keyFn = JSON.stringify) {\n const cache = new Map();\n\n return (...args) => {\n const key = keyFn(args);\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n\n const result = fn(...args);\n cache.set(key, result);\n return result;\n };\n}\n\n/**\n * Debounce function calls\n * @param {Function} fn \n * @param {number} delay - Delay in ms\n */\nexport function debounce(fn, delay = 100) {\n let timer = null;\n\n return (...args) => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => fn(...args), delay);\n };\n}\n\n/**\n * Throttle function calls\n * @param {Function} fn \n * @param {number} limit - Minimum time between calls in ms\n */\nexport function throttle(fn, limit = 100) {\n let inThrottle = false;\n\n return (...args) => {\n if (!inThrottle) {\n fn(...args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n}\n\n/**\n * Create an intersection observer for lazy rendering\n * @param {Function} onVisible - Called when element becomes visible\n * @param {Object} options - IntersectionObserver options\n */\nexport function createVisibilityObserver(onVisible, options = {}) {\n const observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n onVisible(entry.target);\n observer.unobserve(entry.target);\n }\n }\n }, {\n rootMargin: '100px',\n threshold: 0,\n ...options\n });\n\n return {\n observe: (el) => observer.observe(el),\n disconnect: () => observer.disconnect()\n };\n}\n\n/**\n * Batch DOM reads and writes to prevent layout thrashing\n * Based on fastdom pattern\n */\nclass DomBatch {\n #reads = [];\n #writes = [];\n #scheduled = false;\n\n /**\n * Schedule a DOM read (measure)\n */\n read(fn) {\n this.#reads.push(fn);\n this.#schedule();\n }\n\n /**\n * Schedule a DOM write (mutate)\n */\n write(fn) {\n this.#writes.push(fn);\n this.#schedule();\n }\n\n #schedule() {\n if (!this.#scheduled) {\n this.#scheduled = true;\n requestAnimationFrame(() => this.#flush());\n }\n }\n\n #flush() {\n // Reads first (measure phase)\n let fn;\n while (fn = this.#reads.shift()) {\n try { fn(); } catch (e) { console.error(e); }\n }\n\n // Writes second (mutate phase)\n while (fn = this.#writes.shift()) {\n try { fn(); } catch (e) { console.error(e); }\n }\n\n this.#scheduled = false;\n\n // If more work was added during flush, schedule again\n if (this.#reads.length || this.#writes.length) {\n this.#schedule();\n }\n }\n}\n\nexport const domBatch = new DomBatch();\n\n/**\n * Chunk large array operations to avoid blocking main thread\n * @param {Array} items - Array to process\n * @param {Function} processFn - Function to call for each item\n * @param {number} chunkSize - Items per chunk\n */\nexport async function processInChunks(items, processFn, chunkSize = 100) {\n for (let i = 0; i < items.length; i += chunkSize) {\n const chunk = items.slice(i, i + chunkSize);\n\n for (const item of chunk) {\n processFn(item, i);\n }\n\n // Yield to main thread between chunks\n await new Promise(r => setTimeout(r, 0));\n }\n}\n",
25
+ "/**\n * @fileoverview mu-stack - Flexbox Stack Layout Component\n * \n * Usage: <mu-stack direction=\"column\" gap=\"md\" align=\"center\">...</mu-stack>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuStack extends MuElement {\n static baseClass = 'mu-stack';\n static observedAttributes = ['direction', 'gap', 'align', 'justify', 'wrap', 'nowrap'];\n\n render() {\n this.#updateStyles();\n }\n\n update(attr, newValue, oldValue) {\n this.#updateStyles();\n }\n\n #updateStyles() {\n const direction = this.attr('direction', 'column');\n const gap = this.attr('gap', 'md');\n const align = this.attr('align', 'stretch');\n const justify = this.attr('justify', 'flex-start');\n // SOTA 2026: row direction wraps by default for responsive layouts\n // Use nowrap attribute to opt-out, or wrap attribute on column for opt-in\n const hasWrap = this.has('wrap');\n const hasNowrap = this.has('nowrap');\n const isRow = direction === 'row' || direction === 'row-reverse';\n // Row: wrap by default unless nowrap specified\n // Column: nowrap by default unless wrap specified\n const shouldWrap = isRow ? !hasNowrap : hasWrap;\n\n // Gap values map to CSS custom properties\n const gapMap = {\n none: '0',\n xs: 'var(--md-sys-spacing-xs, 4px)',\n sm: 'var(--md-sys-spacing-sm, 8px)',\n md: 'var(--md-sys-spacing-md, 16px)',\n lg: 'var(--md-sys-spacing-lg, 24px)',\n xl: 'var(--md-sys-spacing-xl, 32px)'\n };\n\n this.style.display = 'flex';\n this.style.flexDirection = direction;\n this.style.gap = gapMap[gap] || gap;\n this.style.alignItems = align;\n this.style.justifyContent = justify;\n this.style.flexWrap = shouldWrap ? 'wrap' : 'nowrap';\n // SOTA 2026: Proper containment for nested flex layouts\n this.style.boxSizing = 'border-box';\n this.style.maxWidth = '100%';\n this.style.minWidth = '0'; // Critical: allows shrinking in parent flexbox\n this.style.flexShrink = '1'; // MUST shrink to contain children properly\n }\n}\n\ndefine('mu-stack', MuStack);\n",
26
+ "/**\n * @fileoverview mu-grid - CSS Grid Layout Component\n * \n * Usage: <mu-grid cols=\"3\" gap=\"md\">...</mu-grid>\n * \n * Responsive: On compact screens (< 600px), grids with 3+ columns\n * automatically collapse to single column via CSS media query.\n * See components.css for the responsive rules.\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuGrid extends MuElement {\n static baseClass = 'mu-grid';\n static cssFile = 'grid';\n static observedAttributes = ['cols', 'rows', 'gap', 'align'];\n\n render() {\n this.#updateStyles();\n }\n\n update(attr, newValue, oldValue) {\n this.#updateStyles();\n }\n\n #updateStyles() {\n const cols = this.attr('cols', '1');\n const rows = this.attr('rows', '');\n const gap = this.attr('gap', 'md');\n const align = this.attr('align', 'stretch');\n\n const gapMap = {\n none: '0',\n xs: '4px',\n sm: '8px',\n md: '16px',\n lg: '24px',\n xl: '32px'\n };\n\n this.style.display = 'grid';\n\n // Set gridTemplateColumns only for non-responsive cases\n // CSS media queries in components.css handle responsive collapse to 1fr on compact\n // We don't override CSS's responsive behavior here - CSS has lower specificity \n // than inline styles, so we need to NOT set this on compact breakpoints\n // However, since detecting compact reliably in JS during module load is unreliable,\n // we rely on CSS to override via !important for responsive cases\n this.style.gridTemplateColumns = cols.includes('fr') || cols.includes('px')\n ? cols\n : `repeat(${cols}, 1fr)`;\n\n if (rows) {\n this.style.gridTemplateRows = rows.includes('fr') || rows.includes('px')\n ? rows\n : `repeat(${rows}, 1fr)`;\n }\n this.style.gap = gapMap[gap] || gap;\n this.style.alignItems = align;\n }\n}\n\ndefine('mu-grid', MuGrid);\n",
27
+ "/**\n * @fileoverview mu-container - Responsive Container Component\n * \n * Usage: <mu-container size=\"lg\" padding=\"md\">...</mu-container>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuContainer extends MuElement {\n static baseClass = 'mu-container';\n static observedAttributes = ['size', 'padding', 'center'];\n\n render() {\n this.#updateStyles();\n }\n\n update(attr, newValue, oldValue) {\n this.#updateStyles();\n }\n\n #updateStyles() {\n const size = this.attr('size', 'lg');\n const padding = this.attr('padding', 'md');\n const center = this.has('center');\n\n const sizeMap = {\n sm: '640px',\n md: '768px',\n lg: '1024px',\n xl: '1280px',\n full: '100%'\n };\n\n const paddingMap = {\n none: '0',\n sm: '8px',\n md: '16px',\n lg: '24px',\n xl: '32px'\n };\n\n this.style.maxWidth = sizeMap[size] || size;\n this.style.padding = paddingMap[padding] || padding;\n this.style.width = '100%';\n\n if (center) {\n this.style.marginLeft = 'auto';\n this.style.marginRight = 'auto';\n }\n }\n}\n\ndefine('mu-container', MuContainer);\n",
28
+ "/**\n * @fileoverview mu-navbar - Navigation Bar Component\n * \n * Usage: \n * <mu-navbar>\n * <mu-navbar-brand>Logo</mu-navbar-brand>\n * <mu-navbar-links>\n * <a href=\"/\">Home</a>\n * <a href=\"/about\">About</a>\n * </mu-navbar-links>\n * <mu-navbar-actions>\n * <mu-theme-toggle></mu-theme-toggle>\n * </mu-navbar-actions>\n * </mu-navbar>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuNavbar extends MuElement {\n static baseClass = 'mu-navbar';\n static cssFile = 'navbar';\n static observedAttributes = ['sticky', 'variant'];\n\n render() {\n this.style.display = 'flex';\n this.style.alignItems = 'center';\n this.style.justifyContent = 'space-between';\n this.style.padding = '0 var(--md-sys-spacing-md, 16px)';\n this.style.height = '64px';\n this.style.background = 'var(--md-sys-color-surface-container)';\n this.style.borderBottom = '1px solid var(--md-sys-color-outline-variant)';\n\n if (this.has('sticky')) {\n this.style.position = 'sticky';\n this.style.top = '0';\n this.style.zIndex = '100';\n }\n }\n}\n\nexport class MuNavbarBrand extends MuElement {\n static baseClass = 'mu-navbar__brand';\n\n render() {\n this.style.fontWeight = '600';\n this.style.fontSize = '1.25rem';\n }\n}\n\nexport class MuNavbarLinks extends MuElement {\n static baseClass = 'mu-navbar__links';\n\n render() {\n // All styles handled by CSS in components.css\n }\n}\n\nexport class MuNavbarActions extends MuElement {\n static baseClass = 'mu-navbar__actions';\n\n render() {\n this.style.display = 'flex';\n this.style.gap = 'var(--md-sys-spacing-sm, 8px)';\n this.style.alignItems = 'center';\n }\n}\n\ndefine('mu-navbar', MuNavbar);\ndefine('mu-navbar-brand', MuNavbarBrand);\ndefine('mu-navbar-links', MuNavbarLinks);\ndefine('mu-navbar-actions', MuNavbarActions);\n",
29
+ "/**\n * @fileoverview mu-sidebar - Collapsible Sidebar Component\n * \n * Usage:\n * <mu-sidebar open>\n * <mu-sidebar-item icon=\"home\" active>Dashboard</mu-sidebar-item>\n * <mu-sidebar-item icon=\"settings\">Settings</mu-sidebar-item>\n * </mu-sidebar>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { bus, UIEvents } from '../core/bus.js';\n\nexport class MuSidebar extends MuElement {\n static baseClass = 'mu-sidebar';\n static observedAttributes = ['open', 'width'];\n\n render() {\n const width = this.attr('width', '250px');\n\n this.style.width = this.has('open') ? width : '64px';\n this.style.height = '100vh';\n this.style.background = 'var(--md-sys-color-surface-container)';\n this.style.borderRight = '1px solid var(--md-sys-color-outline-variant)';\n this.style.transition = 'width var(--md-sys-motion-duration-medium2) var(--md-sys-motion-easing-emphasized)';\n this.style.overflow = 'hidden';\n this.style.display = 'flex';\n this.style.flexDirection = 'column';\n }\n\n update(attr, newValue, oldValue) {\n this.render();\n }\n\n toggle() {\n if (this.has('open')) {\n this.removeAttribute('open');\n } else {\n this.setAttribute('open', '');\n }\n this.emit('mu-sidebar-toggle', { open: this.has('open') });\n }\n}\n\nexport class MuSidebarItem extends MuElement {\n static baseClass = 'mu-sidebar__item';\n static observedAttributes = ['icon', 'active'];\n\n connectedCallback() {\n super.connectedCallback();\n this.listen(this, 'click', () => {\n this.emit('mu-sidebar-select', { item: this });\n });\n }\n\n render() {\n const icon = this.attr('icon', '');\n const text = this.textContent;\n\n this.style.display = 'flex';\n this.style.alignItems = 'center';\n this.style.gap = 'var(--md-sys-spacing-md, 16px)';\n this.style.padding = '12px 16px';\n this.style.cursor = 'pointer';\n this.style.borderRadius = 'var(--md-sys-shape-corner-medium, 8px)';\n this.style.margin = '4px 8px';\n this.style.transition = 'background var(--md-sys-motion-duration-short4) var(--md-sys-motion-easing-standard)';\n\n if (this.has('active')) {\n this.style.background = 'var(--md-sys-color-primary-container)';\n this.style.color = 'var(--md-sys-color-on-primary-container)';\n }\n }\n\n update(attr, newValue, oldValue) {\n this.render();\n }\n}\n\ndefine('mu-sidebar', MuSidebar);\ndefine('mu-sidebar-item', MuSidebarItem);\n",
30
+ "/**\n * @fileoverview mu-divider - Divider Line Component\n * \n * Usage:\n * <mu-divider></mu-divider>\n * <mu-divider vertical></mu-divider>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuDivider extends MuElement {\n static baseClass = 'mu-divider';\n static cssFile = 'divider';\n static observedAttributes = ['vertical', 'inset'];\n\n render() {\n const vertical = this.has('vertical');\n const inset = this.has('inset');\n\n this.style.display = 'block';\n this.style.background = 'var(--md-sys-color-outline-variant)';\n this.style.flexShrink = '0';\n\n if (vertical) {\n this.style.width = '1px';\n this.style.minHeight = '24px';\n this.style.margin = inset ? '0 8px' : '0';\n } else {\n this.style.height = '1px';\n this.style.width = '100%';\n this.style.margin = inset ? '0 16px' : '0';\n }\n }\n\n update(attr, newValue, oldValue) {\n this.render();\n }\n}\n\ndefine('mu-divider', MuDivider);\n",
31
+ "/**\n * mu-layout.js - Material Design 3 Responsive Layout Container\n * \n * Main layout container that orchestrates drawer, content, and bottom nav.\n * Provides responsive layout structure with proper spacing.\n * \n * LIGHT DOM: Uses Light DOM for styling consistency.\n * Uses slot=\"...\" attributes on children to distribute content.\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuLayout extends MuElement {\n static get observedAttributes() {\n return ['has-drawer', 'has-bottom-nav'];\n }\n\n static baseClass = 'mu-layout';\n static cssFile = 'layout';\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n // Capture slotted children before render\n if (!this._slotsCaptured) {\n this._slots = {\n header: this.querySelector('[slot=\"header\"]'),\n drawer: this.querySelector('[slot=\"drawer\"]'),\n footer: this.querySelector('[slot=\"footer\"]'),\n bottom: this.querySelector('[slot=\"bottom\"]'),\n default: Array.from(this.children).filter(c => !c.hasAttribute('slot'))\n };\n this._slotsCaptured = true;\n }\n super.connectedCallback();\n this._setupScrollReset();\n this._updateLayout();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n // Listener cleanup handled by MuElement AbortController\n }\n\n _setupScrollReset() {\n // Reset content scroll when navigating to a new section\n this.listen(window, 'hashchange', () => {\n const mainContainer = this.querySelector('.mu-layout-main');\n if (mainContainer) {\n mainContainer.scrollTop = 0;\n }\n });\n }\n\n _updateLayout() {\n const hasDrawer = this._slots.drawer !== null;\n const hasBottomNav = this._slots.bottom !== null;\n\n this.toggleAttribute('has-drawer', hasDrawer);\n this.toggleAttribute('has-bottom-nav', hasBottomNav);\n }\n\n render() {\n // Build layout structure with DOM manipulation\n this.innerHTML = '';\n\n // Layout wrapper\n const wrapper = document.createElement('div');\n wrapper.className = 'mu-layout-wrapper';\n\n // Header\n const headerContainer = document.createElement('header');\n headerContainer.className = 'mu-layout-header';\n if (this._slots.header) {\n headerContainer.appendChild(this._slots.header);\n }\n wrapper.appendChild(headerContainer);\n\n // Layout body (drawer + main)\n const body = document.createElement('div');\n body.className = 'mu-layout-body';\n\n // Drawer container\n const drawerContainer = document.createElement('aside');\n drawerContainer.className = 'mu-layout-drawer';\n if (this._slots.drawer) {\n drawerContainer.appendChild(this._slots.drawer);\n }\n body.appendChild(drawerContainer);\n\n // Main container\n const mainContainer = document.createElement('div');\n mainContainer.className = 'mu-layout-main';\n\n const content = document.createElement('main');\n content.className = 'mu-layout-content';\n if (this._slots.default) {\n this._slots.default.forEach(child => content.appendChild(child));\n }\n mainContainer.appendChild(content);\n body.appendChild(mainContainer);\n\n wrapper.appendChild(body);\n\n // Footer\n const footerContainer = document.createElement('footer');\n footerContainer.className = 'mu-layout-footer';\n if (this._slots.footer) {\n footerContainer.appendChild(this._slots.footer);\n }\n wrapper.appendChild(footerContainer);\n\n this.appendChild(wrapper);\n\n // Bottom nav container (outside wrapper, fixed)\n const bottomContainer = document.createElement('div');\n bottomContainer.className = 'mu-layout-bottom';\n if (this._slots.bottom) {\n bottomContainer.appendChild(this._slots.bottom);\n }\n this.appendChild(bottomContainer);\n }\n}\n\nif (!customElements.get('mu-layout')) {\n customElements.define('mu-layout', MuLayout);\n}\n",
32
+ "/**\n * mu-drawer.js - Material Design 3 Adaptive Navigation Drawer\n * \n * Responsive drawer that adapts to screen size:\n * - Desktop: Expanded rail or standard drawer\n * - Tablet: Collapsed rail\n * - Mobile: Hidden, opens as modal overlay\n * \n * Follows MD3 Navigation Drawer/Rail specifications.\n * LIGHT DOM: Uses Light DOM for styling consistency.\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { breakpoints } from '../core/breakpoints.js';\nimport { keyboard } from '../core/keyboard.js';\n\nexport class MuDrawer extends MuElement {\n static get observedAttributes() {\n return ['mode', 'open', 'expand-on-hover', 'position'];\n }\n\n static baseClass = 'mu-drawer';\n static cssFile = 'drawer';\n\n constructor() {\n super();\n this._currentMode = 'expanded'; // expanded | rail | hidden\n this._isHovering = false;\n this._unsubscribe = null;\n }\n\n // Modes: auto | permanent | temporary | rail\n get mode() { return this.getAttribute('mode') || 'auto'; }\n set mode(v) { this.setAttribute('mode', v); }\n\n get open() { return this.hasAttribute('open'); }\n set open(v) { this.toggleAttribute('open', Boolean(v)); }\n\n get expandOnHover() { return this.hasAttribute('expand-on-hover'); }\n set expandOnHover(v) { this.toggleAttribute('expand-on-hover', Boolean(v)); }\n\n get position() { return this.getAttribute('position') || 'start'; }\n set position(v) { this.setAttribute('position', v); }\n\n connectedCallback() {\n // Capture slotted children before render\n if (!this._slotsCaptured) {\n this._slots = {\n header: this.querySelector('[slot=\"header\"]'),\n footer: this.querySelector('[slot=\"footer\"]'),\n default: Array.from(this.children).filter(c => !c.hasAttribute('slot'))\n };\n this._slotsCaptured = true;\n }\n super.connectedCallback();\n this._setupBreakpointListener();\n this._setupListeners();\n // Force immediate mode application\n this._forceUpdateMode();\n }\n\n /**\n * Calculate the initial display mode based on current breakpoints\n */\n _getInitialMode() {\n const mode = this.mode;\n const isCompact = breakpoints.isCompact;\n const isMedium = breakpoints.isMedium;\n\n if (mode === 'permanent') {\n return 'expanded';\n } else if (mode === 'temporary') {\n return 'hidden';\n } else if (mode === 'rail') {\n return isCompact ? 'hidden' : 'rail';\n } else {\n // Auto mode\n if (isCompact) {\n return 'hidden';\n } else if (isMedium) {\n return 'rail';\n } else {\n return 'expanded';\n }\n }\n }\n\n _forceUpdateMode() {\n this._currentMode = this._getInitialMode();\n this._applyMode();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n if (this._unsubscribe) {\n this._unsubscribe();\n this._unsubscribe = null;\n }\n // Clean up ESC handler\n this._unsubEsc?.();\n this._unsubEsc = null;\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (!this.isConnected) return;\n\n if (name === 'open') {\n this._updateOpenState();\n } else if (name === 'mode') {\n this._updateMode();\n }\n }\n\n _setupBreakpointListener() {\n // Subscribe to centralized breakpoint changes\n this._unsubscribe = breakpoints.subscribe(() => {\n this._updateMode();\n });\n }\n\n _updateMode() {\n const mode = this.mode;\n const isCompact = breakpoints.isCompact;\n const isMedium = breakpoints.isMedium;\n\n let newMode;\n\n if (mode === 'permanent') {\n newMode = 'expanded';\n } else if (mode === 'temporary') {\n newMode = 'hidden';\n } else if (mode === 'rail') {\n newMode = isCompact ? 'hidden' : 'rail';\n } else {\n // Auto mode\n if (isCompact) {\n newMode = 'hidden';\n } else if (isMedium) {\n newMode = 'rail';\n } else {\n newMode = 'expanded';\n }\n }\n\n if (newMode !== this._currentMode) {\n this._currentMode = newMode;\n this._applyMode();\n }\n }\n\n _applyMode() {\n const drawer = this.querySelector('.mu-drawer-nav');\n if (!drawer) return;\n\n drawer.classList.remove('mu-drawer-mode-expanded', 'mu-drawer-mode-rail', 'mu-drawer-mode-hidden');\n drawer.classList.add(`mu-drawer-mode-${this._currentMode}`);\n\n // Update child items for rail mode\n const items = this.querySelectorAll('mu-drawer-item');\n items.forEach(item => {\n if (this._currentMode === 'rail' && !this._isHovering) {\n item.setAttribute('hide-label', '');\n } else {\n item.removeAttribute('hide-label');\n }\n });\n\n // Auto close on mobile when switching away\n if (this._currentMode === 'hidden' && !this.open) {\n this._hideScrim();\n }\n }\n\n _setupListeners() {\n // Scrim click to close\n const scrim = this.querySelector('.mu-drawer-scrim');\n if (scrim) {\n this.listen(scrim, 'click', () => {\n this.open = false;\n });\n }\n\n // Expand on hover for rail mode\n const drawer = this.querySelector('.mu-drawer-nav');\n if (drawer && this.expandOnHover) {\n this.listen(drawer, 'mouseenter', () => {\n if (this._currentMode === 'rail') {\n this._isHovering = true;\n drawer.classList.add('mu-drawer-expanded-hover');\n this._applyMode();\n }\n });\n\n this.listen(drawer, 'mouseleave', () => {\n if (this._currentMode === 'rail') {\n this._isHovering = false;\n drawer.classList.remove('mu-drawer-expanded-hover');\n this._applyMode();\n }\n });\n }\n\n // Listen for nav item selection\n this.listen(this, 'mu-nav-select', (e) => {\n // On mobile, close drawer after selection\n if (this._currentMode === 'hidden' && this.open) {\n this.open = false;\n }\n // Update active states\n this._updateActiveItem(e.detail.item);\n });\n\n // Initialize ESC handler tracker\n this._unsubEsc = null;\n }\n\n _updateActiveItem(selectedItem) {\n const items = this.querySelectorAll('mu-drawer-item');\n items.forEach(item => {\n item.active = (item === selectedItem);\n });\n }\n\n _updateOpenState() {\n const drawer = this.querySelector('.mu-drawer-nav');\n\n if (this.open) {\n drawer?.classList.add('mu-drawer-open');\n if (this._currentMode === 'hidden') {\n this._showScrim();\n // Register ESC handler when opening in hidden (modal) mode\n this._unsubEsc = keyboard.pushEscapeHandler(this, () => {\n this.open = false;\n });\n }\n } else {\n drawer?.classList.remove('mu-drawer-open');\n this._hideScrim();\n // Unregister ESC handler when closing\n this._unsubEsc?.();\n this._unsubEsc = null;\n }\n }\n\n _showScrim() {\n const scrim = this.querySelector('.mu-drawer-scrim');\n if (scrim) {\n scrim.classList.add('mu-drawer-scrim-visible');\n }\n }\n\n _hideScrim() {\n const scrim = this.querySelector('.mu-drawer-scrim');\n if (scrim) {\n scrim.classList.remove('mu-drawer-scrim-visible');\n }\n }\n\n toggle() {\n this.open = !this.open;\n }\n\n render() {\n // Build DOM structure\n this.innerHTML = '';\n\n // Scrim (for modal mode)\n const scrim = document.createElement('div');\n scrim.className = 'mu-drawer-scrim';\n this.appendChild(scrim);\n\n // Nav drawer\n const nav = document.createElement('nav');\n nav.className = `mu-drawer-nav mu-drawer-mode-${this._getInitialMode()}`;\n nav.setAttribute('role', 'navigation');\n\n // Header\n const header = document.createElement('div');\n header.className = 'mu-drawer-header';\n if (this._slots.header) {\n header.appendChild(this._slots.header);\n }\n nav.appendChild(header);\n\n // Content (default slot)\n const content = document.createElement('div');\n content.className = 'mu-drawer-content';\n content.setAttribute('role', 'menu'); // ARIA: menuitem children require menu parent\n if (this._slots.default) {\n this._slots.default.forEach(child => content.appendChild(child));\n }\n nav.appendChild(content);\n\n // Footer\n if (this._slots.footer) {\n nav.appendChild(this._slots.footer);\n }\n\n this.appendChild(nav);\n }\n}\n\nif (!customElements.get('mu-drawer')) {\n customElements.define('mu-drawer', MuDrawer);\n}\n",
33
+ "/**\n * @fileoverview mu-icon - Material Symbols Icon Component\n * \n * Supports both:\n * 1. Material Symbols font (2500+ icons) - primary\n * 2. Inline SVG fallback for critical icons\n * \n * Usage: \n * <mu-icon name=\"check\"></mu-icon> <!-- Material Symbol -->\n * <mu-icon name=\"check\" svg></mu-icon> <!-- Force SVG -->\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\n// Inline SVG paths for critical icons (fallback when font not loaded)\nconst SVG_ICONS = {\n // Actions\n check: 'M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z',\n close: 'M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z',\n add: 'M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z',\n remove: 'M19 13H5v-2h14z',\n edit: 'M3 17.25V21h3.75L17.81 9.94l-3.75-3.75zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75z',\n delete: 'M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6zM19 4h-3.5l-1-1h-5l-1 1H5v2h14z',\n search: 'M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z',\n\n // Navigation\n menu: 'M3 18h18v-2H3zm0-5h18v-2H3zm0-7v2h18V6z',\n chevron_right: 'M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z',\n chevron_left: 'M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z',\n expand_more: 'M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z',\n expand_less: 'M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z',\n home: 'M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z',\n arrow_back: 'M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20z',\n arrow_forward: 'M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z',\n\n // Status\n info: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2zm0-8h-2V7h2z',\n warning: 'M1 21h22L12 2zm12-3h-2v-2h2zm0-4h-2v-4h2z',\n error: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2zm0-4h-2V7h2z',\n check_circle: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8z',\n cancel: 'M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12z',\n\n // Aliases for alert severity\n success: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8z',\n\n // UI\n settings: 'M19.14 12.94c.04-.31.06-.63.06-.94 0-.31-.02-.63-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.04.31-.06.63-.06.94s.02.63.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z',\n person: 'M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z',\n light_mode: 'M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5M2 13h2c.55 0 1-.45 1-1s-.45-1-1-1H2c-.55 0-1 .45-1 1s.45 1 1 1m18 0h2c.55 0 1-.45 1-1s-.45-1-1-1h-2c-.55 0-1 .45-1 1s.45 1 1 1M11 2v2c0 .55.45 1 1 1s1-.45 1-1V2c0-.55-.45-1-1-1s-1 .45-1 1m0 18v2c0 .55.45 1 1 1s1-.45 1-1v-2c0-.55-.45-1-1-1s-1 .45-1 1M5.99 4.58c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0s.39-1.03 0-1.41zm12.37 12.37c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0 .39-.39.39-1.03 0-1.41zm1.06-10.96c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0zM7.05 18.36c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0z',\n dark_mode: 'M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9 9-4.03 9-9c0-.46-.04-.92-.1-1.36-.98 1.37-2.58 2.26-4.4 2.26-2.98 0-5.4-2.42-5.4-5.4 0-1.81.89-3.42 2.26-4.4-.44-.06-.9-.1-1.36-.1z',\n visibility: 'M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5M12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5m0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3',\n visibility_off: 'M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7M2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2m4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3z',\n\n // Drawer/Navigation icons\n download: 'M5 20h14v-2H5v2zM19 9h-4V3H9v6H5l7 7 7-7z',\n smart_button: 'M22 9v6c0 1.1-.9 2-2 2h-1v-2h1V9H4v6h6v2H4c-1.1 0-2-.9-2-2V9c0-1.1.9-2 2-2h16c1.1 0 2 .9 2 2zm-7.5 11 1.09-2.41L18 16.5l-2.41-1.09L14.5 13l-1.09 2.41L11 16.5l2.41 1.09L14.5 20zm2.5-5 .62-1.38L19 14l-1.38-.62L17 12l-.62 1.38L15 14l1.38.62L17 16zm-2.5 5 1.09-2.41L18 16.5l-2.41-1.09L14.5 13l-1.09 2.41L11 16.5l2.41 1.09L14.5 20z',\n text_fields: 'M2.5 4v3h5v12h3V7h5V4h-13zm19 5h-9v3h3v7h3v-7h3V9z',\n check_box: 'M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z',\n toggle_on: 'M17 7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h10c2.76 0 5-2.24 5-5s-2.24-5-5-5zm0 8c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3z',\n radio_button_checked: 'M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zm0-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z',\n arrow_drop_down_circle: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 12-4-4h8l-4 4z',\n view_carousel: 'M7 19h10V4H7v15zm-5-2h4V6H2v11zM18 6v11h4V6h-4z',\n grid_view: 'M3 3v8h8V3H3zm6 6H5V5h4v4zm-6 4v8h8v-8H3zm6 6H5v-4h4v4zm4-16v8h8V3h-8zm6 6h-4V5h4v4zm-6 4v8h8v-8h-8zm6 6h-4v-4h4v4z',\n tab: 'M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3V5h10v4h8v10z',\n notifications: 'M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z',\n open_in_new: 'M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z',\n hourglass_empty: 'M6 2v6h.01L6 8.01 10 12l-4 4 .01.01H6V22h12v-5.99h-.01L18 16l-4-4 4-3.99-.01-.01H18V2H6zm10 14.5V20H8v-3.5l4-4 4 4zm-4-5-4-4V4h8v3.5l-4 4z',\n account_circle: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 4c1.93 0 3.5 1.57 3.5 3.5S13.93 13 12 13s-3.5-1.57-3.5-3.5S10.07 6 12 6zm0 14c-2.03 0-4.43-.82-6.14-2.88C7.55 15.8 9.68 15 12 15s4.45.8 6.14 2.12C16.43 19.18 14.03 20 12 20z',\n fiber_manual_record: 'M12 12m-8 0a8 8 0 1 0 16 0 8 8 0 1 0-16 0',\n label: 'M17.63 5.84C17.27 5.33 16.67 5 16 5L5 5.01C3.9 5.01 3 5.9 3 7v10c0 1.1.9 1.99 2 1.99L16 19c.67 0 1.27-.33 1.63-.84L22 12l-4.37-6.16z',\n emoji_emotions: 'M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z',\n business: 'M12 7V3H2v18h20V7H12zM6 19H4v-2h2v2zm0-4H4v-2h2v2zm0-4H4V9h2v2zm0-4H4V5h2v2zm4 12H8v-2h2v2zm0-4H8v-2h2v2zm0-4H8V9h2v2zm0-4H8V5h2v2zm10 12h-8v-2h2v-2h-2v-2h2v-2h-2V9h8v10zm-2-8h-2v2h2v-2zm0 4h-2v2h2v-2z',\n input: 'M21 3.01H3c-1.1 0-2 .9-2 2V9h2V4.99h18v14.03H3V15H1v4.01c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98v-14c0-1.11-.9-2-2-2zM11 16l4-4-4-4v3H1v2h10v3z',\n category: 'M12 2l-5.5 9h11L12 2zm0 3.84L13.93 9h-3.87L12 5.84zM17.5 13c-2.49 0-4.5 2.01-4.5 4.5s2.01 4.5 4.5 4.5 4.5-2.01 4.5-4.5-2.01-4.5-4.5-4.5zm0 7c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5zM3 21.5h8v-8H3v8zm2-6h4v4H5v-4z',\n widgets: 'M13 13v8h8v-8h-8zM3 21h8v-8H3v8zM3 3v8h8V3H3zm13.66-1.31L11 7.34 16.66 13l5.66-5.66-5.66-5.65z',\n smart_toy: 'M20 9V7c0-1.1-.9-2-2-2h-3c0-1.66-1.34-3-3-3S9 3.34 9 5H6c-1.1 0-2 .9-2 2v2c-1.66 0-3 1.34-3 3s1.34 3 3 3v4c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-4c1.66 0 3-1.34 3-3s-1.34-3-3-3zM7.5 11.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5S9.83 13 9 13s-1.5-.67-1.5-1.5zM16 17H8v-2h8v2zm-1-4c-.83 0-1.5-.67-1.5-1.5S14.17 10 15 10s1.5.67 1.5 1.5S15.83 13 15 13z',\n notification_important: 'M18 16v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2zm-6 6c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm1-15.06c1.77.52 3 2.14 3 4.06v5.5l1 1v.5H7v-.5l1-1V11c0-1.92 1.23-3.54 3-4.06V5.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5v.94zM13 11h-2v6h2v-6zm0-4h-2v2h2V7z',\n\n // Enterprise icons\n folder_managed: 'M20 6h-8l-2-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm-2.06 11L15 15.28 12.06 17l.78-3.33-2.59-2.24 3.41-.29L15 8l1.34 3.14 3.41.29-2.59 2.24.78 3.33z',\n shield: 'M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm0 10.99h7c-.53 4.12-3.28 7.79-7 8.94V12H5V6.3l7-3.11v8.8z',\n apps: 'M4 8h4V4H4v4zm6 12h4v-4h-4v4zm-6 0h4v-4H4v4zm0-6h4v-4H4v4zm6 0h4v-4h-4v4zm6-10v4h4V4h-4zm-6 4h4V4h-4v4zm6 6h4v-4h-4v4zm0 6h4v-4h-4v4z',\n monitoring: 'M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V5h14v14zM7 12h2v5H7v-5zm4-3h2v8h-2V9zm4-3h2v11h-2V6z'\n};\n\n// Map from alert severity to Material Symbol names\nconst SYMBOL_NAMES = {\n check: 'check',\n close: 'close',\n add: 'add',\n remove: 'remove',\n edit: 'edit',\n delete: 'delete',\n search: 'search',\n menu: 'menu',\n chevron_right: 'chevron_right',\n chevron_left: 'chevron_left',\n expand_more: 'expand_more',\n expand_less: 'expand_less',\n home: 'home',\n arrow_back: 'arrow_back',\n arrow_forward: 'arrow_forward',\n info: 'info',\n warning: 'warning',\n error: 'error',\n success: 'check_circle',\n check_circle: 'check_circle',\n cancel: 'cancel',\n settings: 'settings',\n person: 'person',\n light_mode: 'light_mode',\n dark_mode: 'dark_mode',\n sun: 'light_mode',\n moon: 'dark_mode',\n user: 'person',\n visibility: 'visibility',\n visibility_off: 'visibility_off',\n // Drawer/Navigation icons\n download: 'download',\n smart_button: 'smart_button',\n text_fields: 'text_fields',\n check_box: 'check_box',\n toggle_on: 'toggle_on',\n radio_button_checked: 'radio_button_checked',\n arrow_drop_down_circle: 'arrow_drop_down_circle',\n view_carousel: 'view_carousel',\n grid_view: 'grid_view',\n tab: 'tab',\n notifications: 'notifications',\n open_in_new: 'open_in_new',\n hourglass_empty: 'hourglass_empty',\n account_circle: 'account_circle',\n fiber_manual_record: 'fiber_manual_record',\n label: 'label',\n emoji_emotions: 'emoji_emotions',\n business: 'business',\n input: 'input',\n category: 'category',\n widgets: 'widgets',\n smart_toy: 'smart_toy',\n notification_important: 'notification_important',\n // Enterprise icons\n folder_managed: 'folder_managed',\n shield: 'shield',\n apps: 'apps',\n monitoring: 'monitoring',\n // Common aliases\n plus: 'add',\n minus: 'remove'\n};\n\nexport class MuIcon extends MuElement {\n static baseClass = 'mu-icon';\n static cssFile = 'icon';\n static observedAttributes = ['name', 'size', 'svg', 'filled', 'font'];\n\n render() {\n const name = this.attr('name', 'info');\n const size = this.attr('size', '24');\n const forceFont = this.has('font'); // New: force font instead of SVG\n const filled = this.has('filled');\n\n // Accessibility: set role and aria-hidden (decorative by default)\n this.setAttribute('role', 'img');\n this.setAttribute('aria-hidden', 'true');\n\n // Resolve aliases\n const resolvedName = SYMBOL_NAMES[name] ? name : name;\n const svgPath = SVG_ICONS[name] || SVG_ICONS[SYMBOL_NAMES[name]];\n\n // SVG first (default) - eliminates 254KB font dependency for common icons\n // Only fall back to font if: 1) force font attr, or 2) no SVG exists\n if (!forceFont && svgPath) {\n this.innerHTML = `\n <svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"${svgPath}\"></path>\n </svg>\n `;\n return;\n }\n\n // Fall back to Material Symbols font (for rare icons not in SVG set)\n const symbolName = SYMBOL_NAMES[name] || name;\n\n // Log warning for unknown icon names (AI agent readiness)\n if (!SYMBOL_NAMES[name] && !SVG_ICONS[name]) {\n this.logError('UNKNOWN_ICON', `Icon name \"${name}\" not found in predefined icons. Using font fallback.`);\n }\n\n this.innerHTML = `<span class=\"material-symbols-outlined\" aria-hidden=\"true\">${symbolName}</span>`;\n\n // Apply size and fill\n const span = this.querySelector('span');\n if (span) {\n span.style.fontSize = `${size}px`;\n if (filled) {\n span.style.fontVariationSettings = \"'FILL' 1\";\n }\n }\n }\n\n update(attr, newValue, oldValue) {\n this.render();\n }\n}\n\n// Export icon names for reference\nexport const IconNames = Object.keys(SYMBOL_NAMES);\nexport const SvgIconNames = Object.keys(SVG_ICONS);\n\ndefine('mu-icon', MuIcon);\n",
34
+ "/**\n * mu-drawer-item.js - Material Design 3 Drawer/Nav Item Component\n * \n * Navigation item for drawer (horizontal layout) and bottom navigation (vertical).\n * Follows MD3 Navigation Drawer/Rail/Bar item specifications.\n * \n * LIGHT DOM: This component uses Light DOM for styling consistency.\n * Uses 'label' attribute or text content for the label.\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { escapeHTML } from '../core/utils.js';\n// Import MuIcon to ensure it's registered\nimport './mu-icon.js';\n\nexport class MuDrawerItem extends MuElement {\n static get observedAttributes() {\n return ['icon', 'href', 'active', 'badge', 'disabled', 'layout', 'label'];\n }\n\n static baseClass = 'mu-drawer-item';\n static cssFile = 'drawer-item';\n\n constructor() {\n super();\n // Immediately capture text content from child nodes SYNCHRONOUSLY\n // This runs before connectedCallback and before any render\n // Must be synchronous because microtask/setTimeout is too late\n this._capturedLabel = '';\n\n // Synchronously capture direct text nodes before any DOM manipulation\n const textContent = Array.from(this.childNodes)\n .filter(n => n.nodeType === Node.TEXT_NODE)\n .map(n => n.textContent.trim())\n .join('')\n .trim();\n\n if (textContent) {\n this._capturedLabel = textContent;\n }\n }\n\n get icon() { return this.getAttribute('icon') || ''; }\n set icon(v) { this.setAttribute('icon', v); }\n\n get href() { return this.getAttribute('href') || ''; }\n set href(v) { this.setAttribute('href', v); }\n\n get active() { return this.hasAttribute('active'); }\n set active(v) { this.toggleAttribute('active', Boolean(v)); }\n\n get badge() { return this.getAttribute('badge'); }\n set badge(v) { v ? this.setAttribute('badge', v) : this.removeAttribute('badge'); }\n\n get disabled() { return this.hasAttribute('disabled'); }\n set disabled(v) { this.toggleAttribute('disabled', Boolean(v)); }\n\n // Layout: 'horizontal' (default for drawer) or 'vertical' (for bottom-nav)\n get layout() { return this.getAttribute('layout') || 'horizontal'; }\n set layout(v) { this.setAttribute('layout', v); }\n\n // Label getter - uses attribute or captured text\n get label() { return this.getAttribute('label') || this._capturedLabel || ''; }\n set label(v) { this.setAttribute('label', v); }\n\n connectedCallback() {\n // If label attribute already exists, capture it\n if (!this._capturedLabel && this.hasAttribute('label')) {\n this._capturedLabel = this.getAttribute('label');\n }\n // Final attempt to capture text if still empty\n if (!this._capturedLabel && !this.hasAttribute('label')) {\n this._capturedLabel = this.textContent.trim();\n if (this._capturedLabel) {\n this.setAttribute('label', this._capturedLabel);\n }\n }\n super.connectedCallback();\n this._setupListeners();\n\n // Keyboard accessibility\n this.setAttribute('tabindex', '0');\n this.setAttribute('role', 'menuitem');\n this.setupActivation(() => this._handleClick(new MouseEvent('click')));\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n if (oldValue !== newValue && this.isConnected) {\n this.render();\n }\n }\n\n _setupListeners() {\n this.listen(this, 'click', this._handleClick.bind(this));\n }\n\n _handleClick(e) {\n if (this.disabled) {\n e.preventDefault();\n return;\n }\n\n if (this.href) {\n // Hash navigation\n if (this.href.startsWith('#')) {\n e.preventDefault();\n window.location.hash = this.href;\n }\n // Let regular links work normally\n }\n\n // Dispatch selection event for parent drawer/nav to handle\n this.emit('mu-nav-select', { href: this.href, item: this }, { bubbles: true, composed: true });\n }\n\n render() {\n // Use label prop (getter handles fallback logic)\n const labelText = escapeHTML(this.label);\n const hasLabel = labelText.length > 0;\n const badgeHtml = this.badge ? `<span class=\"mu-drawer-item-badge\">${escapeHTML(this.badge)}</span>` : '';\n const tag = this.href ? 'a' : 'button';\n const hrefAttr = this.href ? `href=\"${escapeHTML(this.href)}\"` : '';\n const disabledAttr = this.disabled ? (this.href ? 'aria-disabled=\"true\"' : 'disabled') : '';\n // A11Y: Always add aria-label for screen readers - ensures link/button is identifiable\n // even when label is visually separate or hidden in collapsed drawer\n const ariaLabel = labelText ? `aria-label=\"${labelText}\"` : '';\n\n this.innerHTML = `\n <${tag} class=\"mu-drawer-item-link\" ${hrefAttr} ${disabledAttr} ${ariaLabel}>\n <span class=\"mu-drawer-item-icon\">\n <mu-icon name=\"${escapeHTML(this.icon)}\" size=\"24\"></mu-icon>\n </span>\n ${hasLabel ? `<span class=\"mu-drawer-item-label\" aria-hidden=\"true\">${labelText}</span>` : ''}\n ${badgeHtml}\n </${tag}>\n `;\n }\n}\n\n// Also export as mu-nav-item alias for bottom navigation\nexport { MuDrawerItem as MuNavItem };\n\nif (!customElements.get('mu-drawer-item')) {\n customElements.define('mu-drawer-item', MuDrawerItem);\n}\n\n// Register alias - mu-nav-item defaults to vertical layout\nif (!customElements.get('mu-nav-item')) {\n customElements.define('mu-nav-item', class extends MuDrawerItem {\n connectedCallback() {\n // Set vertical layout by default for bottom-nav items\n if (!this.hasAttribute('layout')) {\n this.setAttribute('layout', 'vertical');\n }\n super.connectedCallback();\n }\n });\n}\n",
35
+ "/**\n * mu-bottom-nav.js - Material Design 3 Bottom Navigation Bar\n * \n * Fixed bottom navigation for mobile devices.\n * Follows MD3 Navigation Bar specifications (3-5 destinations).\n * \n * LIGHT DOM: Uses Light DOM for styling consistency.\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { breakpoints } from '../core/breakpoints.js';\n\nexport class MuBottomNav extends MuElement {\n static get observedAttributes() {\n return ['hide-on-desktop', 'value'];\n }\n\n static baseClass = 'mu-bottom-nav';\n static cssFile = 'bottom-nav';\n\n constructor() {\n super();\n this._unsubscribe = null;\n }\n\n get hideOnDesktop() { return this.hasAttribute('hide-on-desktop'); }\n set hideOnDesktop(v) { this.toggleAttribute('hide-on-desktop', Boolean(v)); }\n\n get value() { return this.getAttribute('value') || ''; }\n set value(v) { this.setAttribute('value', v); }\n\n connectedCallback() {\n // Preserve children before render\n if (!this._childrenCaptured) {\n this._userChildren = Array.from(this.children);\n this._childrenCaptured = true;\n }\n super.connectedCallback();\n this._setupBreakpointListener();\n this._setupListeners();\n this._updateVisibility();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n if (this._unsubscribe) {\n this._unsubscribe();\n this._unsubscribe = null;\n }\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (!this.isConnected) return;\n\n if (name === 'hide-on-desktop') {\n this._updateVisibility();\n }\n }\n\n _setupBreakpointListener() {\n if (this.hideOnDesktop) {\n // Subscribe to centralized breakpoint changes\n this._unsubscribe = breakpoints.subscribe(() => {\n this._updateVisibility();\n });\n }\n }\n\n _updateVisibility() {\n // Hide on medium+ screens (tablets and desktop) using centralized breakpoints\n if (this.hideOnDesktop && breakpoints.isNotCompact) {\n this.style.display = 'none';\n } else {\n this.style.display = '';\n }\n }\n\n _setupListeners() {\n // Listen for nav item selection\n this.listen(this, 'mu-nav-select', (e) => {\n this._updateActiveItem(e.detail.item);\n this.value = e.detail.href || '';\n\n this.emit('change', { value: this.value, item: e.detail.item }, { bubbles: true });\n });\n }\n\n _updateActiveItem(selectedItem) {\n const items = this.querySelectorAll('mu-nav-item, mu-drawer-item');\n items.forEach(item => {\n item.active = (item === selectedItem);\n });\n }\n\n render() {\n // Create nav wrapper and append preserved children\n const nav = document.createElement('nav');\n nav.className = 'mu-bottom-nav-nav';\n nav.setAttribute('role', 'menu'); // ARIA: menuitem children require menu parent\n nav.setAttribute('aria-label', 'Bottom navigation');\n\n // Clear and rebuild\n this.innerHTML = '';\n this.appendChild(nav);\n\n // Re-append user children\n if (this._userChildren) {\n this._userChildren.forEach(child => nav.appendChild(child));\n }\n }\n}\n\nif (!customElements.get('mu-bottom-nav')) {\n customElements.define('mu-bottom-nav', MuBottomNav);\n}\n",
36
+ "/**\n * @fileoverview mu-button - MD3 Button Component\n * \n * Usage: <mu-button variant=\"primary\" size=\"md\">Label</mu-button>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { createRipple } from '../core/ripple.js';\n\nexport class MuButton extends MuElement {\n static baseClass = 'mu-button';\n static cssFile = 'button';\n static observedAttributes = ['variant', 'size', 'disabled'];\n\n connectedCallback() {\n super.connectedCallback();\n this.setAttribute('role', 'button');\n this.setupActivation(() => this.click());\n\n // MD3 Ripple effect on press\n this.listen(this, 'pointerdown', (e) => {\n if (!this.isDisabled) {\n createRipple(this, e);\n }\n });\n }\n\n render() {\n // Wrap text content in label span for styling\n const label = this.textContent.trim();\n this.innerHTML = `<span class=\"mu-button__label\">${label}</span>`;\n this.#updateClasses();\n }\n\n update(attr, newValue, oldValue) {\n if (attr === 'disabled') {\n this.updateTabindex();\n }\n this.#updateClasses();\n }\n\n #updateClasses() {\n const variant = this.attr('variant', 'primary');\n const size = this.attr('size', 'md');\n\n // AGENT VALIDATION: Check variant\n const validVariants = ['filled', 'elevated', 'tonal', 'outlined', 'text', 'danger', 'primary', 'secondary', 'ghost'];\n if (!validVariants.includes(variant)) {\n this.logError('INVALID_VARIANT', `Invalid button variant '${variant}'. Valid: ${validVariants.join(', ')}`);\n }\n\n // Build class list efficiently\n this.className = `mu-button mu-button--${variant} mu-button--${size}`;\n\n if (this.has('disabled')) {\n this.classList.add('is-disabled');\n }\n }\n}\n\ndefine('mu-button', MuButton);\n",
37
+ "/**\n * @fileoverview mu-input - MD3 Text Field Component\n * \n * Usage: <mu-input type=\"text\" placeholder=\"Enter text\" variant=\"filled\"></mu-input>\n * \n * Features:\n * - Native focus handling via CSS :focus-within\n * - Animated underline indicator\n * - Supports all input types\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { escapeHTML } from '../core/utils.js';\n\nexport class MuInput extends MuElement {\n static baseClass = 'mu-input';\n static cssFile = 'input';\n static observedAttributes = ['type', 'placeholder', 'value', 'disabled', 'variant', 'size', 'label'];\n\n /** @type {HTMLInputElement|null} */\n #input = null;\n\n render() {\n // Idempotent: skip if already rendered\n if (this.querySelector('.mu-input__field')) {\n this.#input = this.querySelector('input');\n this.#updateClasses();\n return;\n }\n\n const type = this.attr('type', 'text');\n const placeholder = this.attr('placeholder', '');\n const label = this.attr('label', '');\n const value = this.attr('value', '');\n\n // Use label for floating label, fallback to placeholder\n const labelText = label || placeholder;\n\n // Never show native placeholder when using floating label\n // Only show if explicitly no label is provided AND no placeholder\n const showNativePlaceholder = !labelText;\n\n // AGENT VALIDATION: Input must have a label\n if (!labelText && !this.getAttribute('aria-label')) {\n this.logError('A11Y_MISSING_LABEL', 'Input must have a label or aria-label attribute.');\n }\n\n // Generate unique ID for label-input association (accessibility)\n const inputId = this.id || `mu-input-${Math.random().toString(36).substring(2, 9)}`;\n\n // Escape user-provided attributes to prevent XSS\n const safeLabelText = escapeHTML(labelText);\n const safePlaceholder = escapeHTML(placeholder);\n const safeValue = escapeHTML(value);\n\n this.innerHTML = `\n ${safeLabelText ? `<label class=\"mu-input__label\" for=\"${inputId}\">${safeLabelText}</label>` : ''}\n <input \n class=\"mu-input__field\"\n id=\"${inputId}\"\n type=\"${type}\"\n ${showNativePlaceholder ? `placeholder=\"${safePlaceholder}\"` : ''}\n ${!safeLabelText ? `aria-label=\"${safePlaceholder || 'Text input'}\"` : ''}\n value=\"${safeValue}\"\n ${this.has('disabled') ? 'disabled' : ''}\n />\n `;\n\n this.#input = this.querySelector('input');\n this.#updateClasses();\n this.#updateValueState();\n\n // Forward events\n this.listen(this.#input, 'input', (e) => {\n this.#updateValueState();\n this.emit('mu-input', { value: e.target.value });\n });\n\n this.listen(this.#input, 'focus', () => {\n this.emit('mu-focus');\n });\n\n this.listen(this.#input, 'blur', () => {\n this.emit('mu-blur');\n });\n }\n\n #updateValueState() {\n if (this.#input?.value) {\n this.classList.add('has-value');\n } else {\n this.classList.remove('has-value');\n }\n }\n\n update(attr, newValue, oldValue) {\n if (!this.#input) return;\n\n switch (attr) {\n case 'value':\n this.#input.value = newValue ?? '';\n break;\n case 'placeholder':\n this.#input.placeholder = newValue ?? '';\n break;\n case 'type':\n this.#input.type = newValue ?? 'text';\n break;\n case 'disabled':\n this.#input.disabled = this.has('disabled');\n break;\n }\n\n this.#updateClasses();\n }\n\n #updateClasses() {\n const variant = this.attr('variant', 'outlined');\n const size = this.attr('size', 'md');\n\n this.className = `mu-input mu-input--${variant} mu-input--${size}`;\n\n if (this.has('disabled')) {\n this.classList.add('is-disabled');\n }\n }\n\n // Expose input value\n get value() {\n return this.#input?.value ?? '';\n }\n\n set value(v) {\n if (this.#input) this.#input.value = v;\n }\n\n focus() {\n this.#input?.focus();\n }\n}\n\ndefine('mu-input', MuInput);\n",
38
+ "/**\n * @fileoverview mu-textarea - Multi-line Text Input Component\n * \n * Usage: <mu-textarea placeholder=\"Enter description\" rows=\"4\"></mu-textarea>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { escapeHTML } from '../core/utils.js';\n\nexport class MuTextarea extends MuElement {\n static baseClass = 'mu-textarea';\n static cssFile = 'input';\n static observedAttributes = ['placeholder', 'rows', 'disabled', 'readonly', 'name'];\n\n #textarea = null;\n\n render() {\n // Idempotent HTML structure creation\n if (!this.querySelector('.mu-textarea__field')) {\n const placeholder = escapeHTML(this.attr('placeholder', ''));\n const rows = this.attr('rows', '4');\n const disabled = this.has('disabled') ? 'disabled' : '';\n const readonly = this.has('readonly') ? 'readonly' : '';\n const name = escapeHTML(this.attr('name', ''));\n\n this.innerHTML = `\n <textarea \n class=\"mu-textarea__field\"\n placeholder=\"${placeholder}\"\n aria-label=\"${placeholder || 'Text area'}\"\n rows=\"${rows}\"\n name=\"${name}\"\n ${disabled}\n ${readonly}\n ></textarea>\n `;\n\n // Styles (only apply once when creating)\n this.style.display = 'block';\n this.style.position = 'relative';\n }\n\n // Always get reference (for both new and pre-rendered cases)\n this.#textarea = this.querySelector('textarea');\n\n // Apply styles to native textarea\n this.#textarea.style.width = '100%';\n this.#textarea.style.padding = '12px 16px';\n this.#textarea.style.fontSize = 'var(--md-sys-typescale-body-large-size, 16px)';\n this.#textarea.style.fontFamily = 'inherit';\n this.#textarea.style.border = '1px solid var(--md-sys-color-outline)';\n this.#textarea.style.borderRadius = 'var(--md-sys-shape-corner-small, 4px)';\n this.#textarea.style.background = 'var(--md-sys-color-surface)';\n this.#textarea.style.color = 'var(--md-sys-color-on-surface)';\n this.#textarea.style.resize = 'vertical';\n this.#textarea.style.transition = 'border-color var(--md-sys-motion-duration-short4) var(--md-sys-motion-easing-standard)';\n this.#textarea.style.outline = 'none';\n this.#textarea.style.boxSizing = 'border-box';\n\n // Focus styles - use box-shadow to avoid layout shift (no border-width change)\n this.listen(this.#textarea, 'focus', () => {\n this.#textarea.style.borderColor = 'var(--md-sys-color-primary)';\n this.#textarea.style.boxShadow = 'inset 0 0 0 1px var(--md-sys-color-primary)';\n });\n\n this.listen(this.#textarea, 'blur', () => {\n this.#textarea.style.borderColor = 'var(--md-sys-color-outline)';\n this.#textarea.style.boxShadow = 'none';\n });\n\n // Forward events (always attach - AbortController prevents duplicates)\n this.listen(this.#textarea, 'input', (e) => {\n this.emit('mu-input', { value: e.target.value });\n });\n\n this.listen(this.#textarea, 'change', (e) => {\n this.emit('mu-change', { value: e.target.value });\n });\n }\n\n get value() {\n return this.#textarea?.value || '';\n }\n\n set value(v) {\n if (this.#textarea) {\n this.#textarea.value = v;\n }\n }\n\n focus() {\n this.#textarea?.focus();\n }\n}\n\ndefine('mu-textarea', MuTextarea);\n",
39
+ "/**\n * @fileoverview mu-form - Form Container with Validation\n * \n * Usage: \n * <mu-form onsubmit=\"handleSubmit\">\n * <mu-input name=\"email\" required></mu-input>\n * <mu-button type=\"submit\">Submit</mu-button>\n * </mu-form>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuForm extends MuElement {\n static baseClass = 'mu-form';\n static observedAttributes = ['action', 'method'];\n\n connectedCallback() {\n super.connectedCallback();\n\n this.listen(this, 'submit', (e) => {\n e.preventDefault();\n this.#handleSubmit();\n });\n\n // Handle enter key in inputs\n this.listen(this, 'keydown', (e) => {\n if (e.key === 'Enter' && e.target.matches('input')) {\n e.preventDefault();\n this.#handleSubmit();\n }\n });\n }\n\n render() {\n // Form is a passthrough container\n this.setAttribute('role', 'form');\n\n // AGENT VALIDATION: Form should have interactive controls\n // SOTA: Double rAF ensures children are rendered before checking\n if (this.hasAttribute('debug')) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n const hasControls = this.querySelector('mu-input, mu-button, mu-select, mu-textarea, input, button, select, textarea');\n if (!hasControls) {\n this.logError('EMPTY_FORM', 'Form appears to be empty. Add input controls.');\n }\n });\n });\n }\n }\n\n #handleSubmit() {\n const data = this.getFormData();\n const isValid = this.validate();\n\n if (isValid) {\n this.emit('mu-submit', { data, isValid });\n } else {\n this.emit('mu-invalid', { data, errors: this.#getErrors() });\n }\n }\n\n /**\n * Get all form data as object\n */\n getFormData() {\n const data = {};\n\n // Get all mu-input values\n this.querySelectorAll('mu-input[name]').forEach(input => {\n data[input.getAttribute('name')] = input.value;\n });\n\n // Get native input values\n this.querySelectorAll('input[name], select[name], textarea[name]').forEach(input => {\n if (input.type === 'checkbox') {\n data[input.name] = input.checked;\n } else {\n data[input.name] = input.value;\n }\n });\n\n return data;\n }\n\n /**\n * Validate all required fields\n */\n validate() {\n let isValid = true;\n\n this.querySelectorAll('[required]').forEach(field => {\n const value = field.value || field.getAttribute('value') || '';\n if (!value.trim()) {\n field.classList.add('is-invalid');\n isValid = false;\n } else {\n field.classList.remove('is-invalid');\n }\n });\n\n return isValid;\n }\n\n #getErrors() {\n const errors = [];\n this.querySelectorAll('.is-invalid').forEach(field => {\n errors.push({\n name: field.getAttribute('name'),\n message: 'This field is required'\n });\n });\n return errors;\n }\n\n /**\n * Reset form to initial state\n */\n reset() {\n this.querySelectorAll('mu-input').forEach(input => {\n input.value = '';\n });\n this.querySelectorAll('input, select, textarea').forEach(el => {\n el.value = '';\n });\n this.querySelectorAll('.is-invalid').forEach(el => {\n el.classList.remove('is-invalid');\n });\n this.emit('mu-reset');\n }\n}\n\ndefine('mu-form', MuForm);\n",
40
+ "/**\n * @fileoverview mu-dropdown - MD3 Select Menu Component (SOTA Popover API)\n * Uses native Popover API for top-layer and light-dismiss.\n * \n * MD3 Reference: https://m3.material.io/components/menus\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { escapeHTML } from '../core/utils.js';\n\nexport class MuDropdown extends MuElement {\n static baseClass = 'mu-dropdown';\n static cssFile = 'input';\n static observedAttributes = ['placeholder', 'value', 'disabled'];\n\n #menu = null;\n #trigger = null;\n #options = []; // Store options data\n\n connectedCallback() {\n super.connectedCallback();\n\n // Reposition on scroll/resize (Anchor API not yet baseline)\n this.listen(window, 'scroll', () => this.#updatePosition(), { capture: true, passive: true });\n this.listen(window, 'resize', () => this.#updatePosition(), { passive: true });\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#menu?.remove();\n }\n\n render() {\n // Only build once - check both trigger AND menu exist\n if (this.querySelector('.mu-dropdown__trigger') && this.#menu) return;\n\n // Use requestAnimationFrame to ensure children (mu-option) are parsed\n requestAnimationFrame(() => this.#buildDropdown());\n }\n\n #buildDropdown() {\n // Trigger already built?\n if (this.querySelector('.mu-dropdown__trigger') && this.#menu) return;\n\n const placeholder = this.getAttribute('placeholder') || 'Select';\n\n // Save options as data BEFORE clearing\n const optionElements = this.querySelectorAll('mu-option');\n this.#options = Array.from(optionElements).map(opt => ({\n value: opt.getAttribute('value') || opt.textContent.trim(),\n label: opt.textContent.trim()\n }));\n\n // Create trigger button\n this.#trigger = document.createElement('button');\n this.#trigger.className = 'mu-dropdown__trigger';\n this.#trigger.type = 'button';\n\n // Escape user-provided attributes to prevent XSS\n const safePlaceholder = escapeHTML(placeholder);\n\n // Generate unique ID for popover targeting\n const menuId = `mu-dropdown-menu-${Math.random().toString(36).slice(2, 9)}`;\n\n // Accessibility attributes\n this.#trigger.setAttribute('aria-haspopup', 'listbox');\n this.#trigger.setAttribute('aria-expanded', 'false');\n this.#trigger.setAttribute('aria-label', safePlaceholder);\n this.#trigger.setAttribute('popovertarget', menuId); // Native popover trigger\n this.#trigger.innerHTML = `\n <span class=\"mu-dropdown__value\">${safePlaceholder}</span>\n <svg class=\"mu-dropdown__arrow\" width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n <path d=\"M1 1l4 4 4-4\"/>\n </svg>\n `;\n\n // Keyboard navigation on trigger\n this.listen(this.#trigger, 'keydown', (e) => {\n if (!this.hasAttribute('disabled')) {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.open();\n }\n }\n });\n\n // Clear and add trigger\n this.innerHTML = '';\n this.appendChild(this.#trigger);\n\n // Create menu with native Popover API\n this.#menu = document.createElement('div');\n this.#menu.id = menuId;\n this.#menu.className = 'mu-dropdown__menu';\n this.#menu.setAttribute('popover', 'auto'); // Auto-dismiss on click outside!\n this.#menu.setAttribute('role', 'listbox');\n this.#menu.tabIndex = -1;\n\n // Listen for popover toggle events (native API)\n this.listen(this.#menu, 'toggle', (e) => {\n if (e.newState === 'open') {\n this.classList.add('is-open');\n this.#trigger?.setAttribute('aria-expanded', 'true');\n this.#updatePosition();\n // Focus first option\n requestAnimationFrame(() => {\n const val = this.getAttribute('value');\n const target = val\n ? this.#menu.querySelector(`[data-value=\"${val}\"]`)\n : this.#menu.firstChild;\n target?.focus();\n });\n } else {\n this.classList.remove('is-open');\n this.#trigger?.setAttribute('aria-expanded', 'false');\n }\n });\n\n // Keyboard navigation in menu\n this.listen(this.#menu, 'keydown', (e) => this.#handleMenuKey(e));\n\n // Build options\n this.#options.forEach(opt => {\n const el = document.createElement('div');\n el.className = 'mu-dropdown__option';\n el.setAttribute('data-value', opt.value);\n el.textContent = opt.label;\n el.setAttribute('role', 'option');\n el.tabIndex = -1;\n this.listen(el, 'click', () => this.select(opt.value, opt.label));\n this.#menu.appendChild(el);\n });\n\n // Append menu to component (not portal - popover handles top-layer!)\n this.appendChild(this.#menu);\n }\n\n #handleMenuKey(e) {\n const options = Array.from(this.#menu.querySelectorAll('.mu-dropdown__option'));\n const current = document.activeElement;\n const idx = options.indexOf(current);\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n const next = options[idx + 1] || options[0];\n next?.focus();\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n const prev = options[idx - 1] || options[options.length - 1];\n prev?.focus();\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (idx >= 0) {\n const opt = this.#options[idx];\n this.select(opt.value, opt.label);\n }\n } else if (e.key === 'Escape') {\n e.preventDefault();\n this.close();\n this.#trigger?.focus();\n }\n }\n\n /**\n * Position menu relative to trigger (Anchor Positioning not yet baseline)\n * Uses manual positioning until CSS Anchor Positioning is widely available.\n */\n #updatePosition() {\n if (!this.#menu || !this.#trigger) return;\n\n const triggerRect = this.#trigger.getBoundingClientRect();\n const menuHeight = this.#menu.scrollHeight || 200;\n const spaceBelow = window.innerHeight - triggerRect.bottom - 8;\n\n // Decide if opening above or below\n const openAbove = spaceBelow < menuHeight && triggerRect.top > menuHeight;\n const top = openAbove\n ? triggerRect.top - menuHeight - 4\n : triggerRect.bottom + 4;\n\n // Apply positioning (popover uses position: fixed by default in top-layer)\n Object.assign(this.#menu.style, {\n position: 'fixed',\n margin: '0', // Reset popover default margin: auto\n top: `${top}px`,\n left: `${triggerRect.left}px`,\n width: `${triggerRect.width}px`,\n minWidth: '160px',\n maxHeight: '280px'\n });\n }\n\n toggle() {\n if (this.#menu?.matches(':popover-open')) {\n this.close();\n } else {\n this.open();\n }\n }\n\n open() {\n if (this.hasAttribute('disabled') || !this.#menu) return;\n this.#menu.showPopover(); // Native API!\n }\n\n close() {\n if (this.#menu?.matches(':popover-open')) {\n this.#menu.hidePopover(); // Native API!\n }\n }\n\n select(value, label) {\n const valueEl = this.querySelector('.mu-dropdown__value');\n if (valueEl) valueEl.textContent = label;\n\n this.setAttribute('value', value);\n this.#menu?.querySelectorAll('.mu-dropdown__option').forEach(o =>\n o.classList.toggle('is-active', o.getAttribute('data-value') === value)\n );\n\n this.emit('mu-select', { value, label });\n this.close();\n }\n\n get value() { return this.getAttribute('value') || ''; }\n set value(v) { this.setAttribute('value', v); }\n}\n\nexport class MuOption extends MuElement {\n static baseClass = 'mu-dropdown__option';\n connectedCallback() {\n super.connectedCallback();\n this.setAttribute('role', 'option');\n }\n render() { }\n}\n\ndefine('mu-dropdown', MuDropdown);\ndefine('mu-option', MuOption);\n",
41
+ "/**\n * @fileoverview mu-checkbox - Checkbox Component with MD3 Indeterminate Support\n * \n * Usage: \n * <mu-checkbox name=\"agree\" checked>I agree</mu-checkbox>\n * <mu-checkbox indeterminate>Parent task</mu-checkbox>\n * \n * States:\n * - Unchecked: empty box\n * - Checked: checkmark drawn with stroke animation\n * - Indeterminate: horizontal line (set programmatically, cleared on user click)\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { escapeHTML } from '../core/utils.js';\nimport { createRipple } from '../core/ripple.js';\n\nexport class MuCheckbox extends MuElement {\n static baseClass = 'mu-checkbox';\n static cssFile = 'checkbox';\n static observedAttributes = ['checked', 'disabled', 'name', 'label', 'indeterminate'];\n\n #input = null;\n\n connectedCallback() {\n super.connectedCallback();\n // Accessibility: set role and keyboard navigation\n this.setAttribute('role', 'checkbox');\n this.setupActivation(() => this.toggle());\n\n this.listen(this, 'pointerdown', (e) => {\n if (!this.isDisabled) {\n createRipple(this, e);\n }\n });\n this.listen(this, 'click', () => {\n if (!this.isDisabled) {\n this.toggle();\n }\n });\n }\n\n render() {\n // Idempotent: skip if already rendered\n if (this.querySelector('.mu-checkbox__box')) {\n this.#updateState();\n return;\n }\n\n const label = escapeHTML(this.attr('label', '') || this.textContent);\n // SVG with both checkmark and indeterminate line paths\n this.innerHTML = `\n <span class=\"mu-checkbox__box\">\n <svg class=\"mu-checkbox__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path class=\"mu-checkbox__check\" d=\"M4 12l6 6L20 6\"/>\n <line class=\"mu-checkbox__indeterminate\" x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>\n </svg>\n </span>\n <span class=\"mu-checkbox__label\">${label}</span>\n `;\n\n this.style.display = 'inline-flex';\n this.style.alignItems = 'center';\n this.style.gap = '12px'; /* MD3: 12dp gap */\n this.style.cursor = this.has('disabled') ? 'not-allowed' : 'pointer';\n this.style.userSelect = 'none';\n this.style.minHeight = '48px'; /* MD3: 48dp touch target */\n this.style.padding = '0 4px'; /* Touch-friendly padding */\n\n this.#updateState();\n }\n\n update(attr, newValue, oldValue) {\n this.#updateState();\n }\n\n #updateState() {\n const box = this.querySelector('.mu-checkbox__box');\n const icon = this.querySelector('.mu-checkbox__icon');\n const checkPath = this.querySelector('.mu-checkbox__check');\n const indeterminateLine = this.querySelector('.mu-checkbox__indeterminate');\n const label = this.querySelector('.mu-checkbox__label');\n\n const isDisabled = this.has('disabled');\n const isChecked = this.has('checked');\n const isIndeterminate = this.has('indeterminate');\n\n // Visual priority: indeterminate > checked > unchecked\n const isFilled = isChecked || isIndeterminate;\n\n this.style.cursor = isDisabled ? 'not-allowed' : 'pointer';\n\n if (box) {\n box.style.width = '18px'; /* MD3: 18dp container */\n box.style.height = '18px';\n box.style.borderRadius = '2px'; /* MD3: 2dp corner radius */\n box.style.display = 'flex';\n box.style.alignItems = 'center';\n box.style.justifyContent = 'center';\n box.style.transition = 'all var(--md-sys-motion-duration-short4) var(--md-sys-motion-easing-standard)';\n box.style.flexShrink = '0';\n\n if (isDisabled) {\n box.style.border = `2px solid color-mix(in srgb, var(--md-sys-color-on-surface) 38%, transparent)`;\n box.style.background = isFilled ? 'color-mix(in srgb, var(--md-sys-color-on-surface) 38%, transparent)' : 'transparent';\n } else {\n box.style.border = `2px solid ${isFilled ? 'var(--md-sys-color-primary)' : 'var(--md-sys-color-outline)'}`;\n box.style.background = isFilled ? 'var(--md-sys-color-primary)' : 'transparent';\n }\n }\n\n if (icon) {\n icon.style.width = '14px';\n icon.style.height = '14px';\n icon.style.color = isDisabled ? 'var(--md-sys-color-surface)' : 'var(--md-sys-color-on-primary)';\n }\n\n // Checkmark animation (GPU accelerated stroke-dashoffset)\n if (checkPath) {\n const pathLength = 24;\n checkPath.style.strokeDasharray = pathLength;\n checkPath.style.strokeDashoffset = (isChecked && !isIndeterminate) ? '0' : pathLength;\n checkPath.style.transition = 'stroke-dashoffset 200ms var(--md-sys-motion-easing-standard, ease-out)';\n }\n\n // Indeterminate line animation (GPU accelerated stroke-dashoffset)\n if (indeterminateLine) {\n const lineLength = 14;\n indeterminateLine.style.strokeDasharray = lineLength;\n indeterminateLine.style.strokeDashoffset = isIndeterminate ? '0' : lineLength;\n indeterminateLine.style.transition = 'stroke-dashoffset 200ms var(--md-sys-motion-easing-standard, ease-out)';\n }\n\n if (label) {\n label.style.color = isDisabled ? 'color-mix(in srgb, var(--md-sys-color-on-surface) 38%, transparent)' : 'var(--md-sys-color-on-surface)';\n }\n\n // Accessibility: update ARIA states\n this.setAttribute('aria-checked', isIndeterminate ? 'mixed' : String(isChecked));\n this.setAttribute('aria-disabled', String(isDisabled));\n this.setAttribute('tabindex', isDisabled ? '-1' : '0');\n }\n\n toggle() {\n // User click always clears indeterminate and toggles checked\n if (this.has('indeterminate')) {\n this.removeAttribute('indeterminate');\n }\n\n if (this.has('checked')) {\n this.removeAttribute('checked');\n } else {\n this.setAttribute('checked', '');\n }\n this.emit('mu-change', {\n checked: this.has('checked'),\n indeterminate: false\n });\n }\n\n get checked() {\n return this.has('checked');\n }\n\n set checked(v) {\n if (v) {\n this.setAttribute('checked', '');\n } else {\n this.removeAttribute('checked');\n }\n }\n\n get indeterminate() {\n return this.has('indeterminate');\n }\n\n set indeterminate(v) {\n if (v) {\n this.setAttribute('indeterminate', '');\n } else {\n this.removeAttribute('indeterminate');\n }\n }\n}\n\ndefine('mu-checkbox', MuCheckbox);\n",
42
+ "/**\n * @fileoverview mu-switch - Toggle Switch Component\n * \n * Usage: <mu-switch checked></mu-switch>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { escapeHTML } from '../core/utils.js';\nimport { createRipple } from '../core/ripple.js';\n\nexport class MuSwitch extends MuElement {\n static baseClass = 'mu-switch';\n static cssFile = 'switch';\n static observedAttributes = ['checked', 'disabled', 'label'];\n\n connectedCallback() {\n super.connectedCallback();\n // Accessibility: set role and keyboard navigation\n this.setAttribute('role', 'switch');\n this.setupActivation(() => this.toggle());\n\n this.listen(this, 'pointerdown', (e) => {\n if (!this.isDisabled) {\n createRipple(this, e);\n }\n });\n this.listen(this, 'click', () => {\n if (!this.isDisabled) {\n this.toggle();\n }\n });\n }\n\n render() {\n // Idempotent: skip if already rendered \n if (this.querySelector('.mu-switch__track')) {\n this.#updateState();\n return;\n }\n\n const label = escapeHTML(this.attr('label', '') || this.textContent);\n this.innerHTML = `\n <span class=\"mu-switch__track\">\n <span class=\"mu-switch__thumb\"></span>\n </span>\n ${label ? `<span class=\"mu-switch__label\">${label}</span>` : ''}\n `;\n\n this.style.display = 'inline-flex';\n this.style.alignItems = 'center';\n this.style.gap = '12px';\n this.style.cursor = this.has('disabled') ? 'not-allowed' : 'pointer';\n\n this.#updateState();\n }\n\n update(attr, newValue, oldValue) {\n this.#updateState();\n }\n\n #updateState() {\n const track = this.querySelector('.mu-switch__track');\n const thumb = this.querySelector('.mu-switch__thumb');\n const isChecked = this.has('checked');\n const isDisabled = this.has('disabled');\n\n // Update cursor\n this.style.cursor = isDisabled ? 'not-allowed' : 'pointer';\n\n if (track) {\n track.style.width = '52px';\n track.style.height = '32px';\n track.style.borderRadius = '16px';\n track.style.position = 'relative';\n track.style.transition = 'background var(--md-sys-motion-duration-short4) var(--md-sys-motion-easing-standard)';\n\n // MD3 disabled state\n if (isDisabled) {\n track.style.background = 'color-mix(in srgb, var(--md-sys-color-on-surface) 12%, transparent)';\n } else {\n track.style.background = isChecked\n ? 'var(--md-sys-color-primary)'\n : 'var(--md-sys-color-surface-container-highest)';\n }\n }\n\n if (thumb) {\n // MD3: Thumb is 16dp when off, 24dp when on\n const thumbSize = isChecked ? 24 : 16;\n const thumbTop = isChecked ? 4 : 8; // Center vertically in track\n const thumbLeft = isChecked ? 24 : 6; // Position within track\n\n thumb.style.width = `${thumbSize}px`;\n thumb.style.height = `${thumbSize}px`;\n thumb.style.borderRadius = `${thumbSize / 2}px`;\n thumb.style.position = 'absolute';\n thumb.style.top = `${thumbTop}px`;\n thumb.style.left = `${thumbLeft}px`;\n thumb.style.transition = 'all var(--md-sys-motion-duration-short4) var(--md-sys-motion-easing-emphasized)';\n\n // MD3 disabled state\n if (isDisabled) {\n thumb.style.background = 'color-mix(in srgb, var(--md-sys-color-on-surface) 38%, transparent)';\n thumb.style.boxShadow = 'none';\n } else {\n thumb.style.background = isChecked\n ? 'var(--md-sys-color-on-primary)'\n : 'var(--md-sys-color-outline)';\n thumb.style.boxShadow = 'var(--md-sys-elevation-level1)';\n }\n }\n\n // Style label if present\n const label = this.querySelector('.mu-switch__label');\n if (label) {\n label.style.color = isDisabled ? 'color-mix(in srgb, var(--md-sys-color-on-surface) 38%, transparent)' : 'var(--md-sys-color-on-surface)';\n }\n\n // Accessibility: update ARIA states\n this.setAttribute('aria-checked', String(isChecked));\n this.setAttribute('aria-disabled', String(isDisabled));\n this.setAttribute('tabindex', isDisabled ? '-1' : '0');\n // Set aria-label from label text or attribute\n const labelText = label?.textContent || this.attr('label', '');\n if (labelText) this.setAttribute('aria-label', labelText);\n }\n\n toggle() {\n if (this.has('checked')) {\n this.removeAttribute('checked');\n } else {\n this.setAttribute('checked', '');\n }\n this.emit('mu-change', { checked: this.has('checked') });\n }\n\n get checked() {\n return this.has('checked');\n }\n\n set checked(v) {\n if (v) {\n this.setAttribute('checked', '');\n } else {\n this.removeAttribute('checked');\n }\n }\n}\n\ndefine('mu-switch', MuSwitch);\n",
43
+ "/**\n * @fileoverview mu-radio - Radio Button Group Component\n * \n * Usage:\n * <mu-radio-group name=\"size\" value=\"md\">\n * <mu-radio value=\"sm\">Small</mu-radio>\n * <mu-radio value=\"md\">Medium</mu-radio>\n * <mu-radio value=\"lg\">Large</mu-radio>\n * </mu-radio-group>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { escapeHTML } from '../core/utils.js';\nimport { createRipple } from '../core/ripple.js';\n\nexport class MuRadioGroup extends MuElement {\n static baseClass = 'mu-radio-group';\n static cssFile = 'radio';\n static observedAttributes = ['name', 'value'];\n\n connectedCallback() {\n super.connectedCallback();\n // Accessibility: set role\n this.setAttribute('role', 'radiogroup');\n\n // Ripple effect on pointerdown\n this.listen(this, 'pointerdown', (e) => {\n let radio = e.target;\n while (radio && radio.tagName !== 'MU-RADIO') {\n radio = radio.parentElement;\n }\n if (radio && !radio.hasAttribute('disabled')) {\n createRipple(radio, e);\n }\n });\n\n this.listen(this, 'click', (e) => {\n // Find the clicked radio - could be nested span\n let radio = e.target;\n while (radio && radio.tagName !== 'MU-RADIO') {\n radio = radio.parentElement;\n }\n\n if (radio && !radio.hasAttribute('disabled')) {\n this.select(radio.getAttribute('value'));\n }\n });\n }\n\n render() {\n this.style.display = 'flex';\n this.style.flexDirection = 'column';\n this.style.gap = '8px';\n\n // Defer selection update to ensure children are fully upgraded\n // Use setTimeout(0) instead of queueMicrotask - microtasks run before\n // custom element upgrades, setTimeout runs after\n this.setTimeout(() => this.#updateSelection(), 0);\n }\n\n update(attr, newValue, oldValue) {\n if (attr === 'value') {\n this.#updateSelection();\n }\n }\n\n #updateSelection() {\n const currentValue = this.attr('value', '');\n this.querySelectorAll('mu-radio').forEach(radio => {\n const isSelected = radio.attr('value') === currentValue;\n if (isSelected) {\n radio.setAttribute('checked', '');\n } else {\n radio.removeAttribute('checked');\n }\n });\n }\n\n select(value) {\n this.setAttribute('value', value);\n this.emit('mu-change', { value });\n }\n\n get value() {\n return this.attr('value', '');\n }\n\n set value(v) {\n this.setAttribute('value', v);\n }\n}\n\nexport class MuRadio extends MuElement {\n static baseClass = 'mu-radio';\n static observedAttributes = ['value', 'checked', 'disabled', 'label'];\n\n #labelText = '';\n #rendered = false;\n\n connectedCallback() {\n super.connectedCallback();\n // Accessibility: set role and keyboard navigation\n this.setAttribute('role', 'radio');\n this.setupActivation(() => {\n const group = this.closest('mu-radio-group');\n if (group) group.select(this.getAttribute('value'));\n });\n }\n\n render() {\n // Read label only once to avoid losing it after innerHTML\n if (!this.#rendered) {\n this.#labelText = escapeHTML(this.attr('label', '') || this.textContent.trim());\n this.#rendered = true;\n }\n\n this.innerHTML = `\n <span class=\"mu-radio__circle\">\n <span class=\"mu-radio__dot\"></span>\n </span>\n <span class=\"mu-radio__label\">${this.#labelText}</span>\n `;\n\n this.style.display = 'inline-flex';\n this.style.alignItems = 'center';\n this.style.gap = '12px'; /* MD3: 12dp gap */\n this.style.cursor = this.has('disabled') ? 'not-allowed' : 'pointer';\n this.style.userSelect = 'none';\n this.style.minHeight = '48px'; /* MD3: 48dp touch target */\n this.style.padding = '0 4px'; /* Touch-friendly padding */\n\n this.#updateState();\n }\n\n update(attr, newValue, oldValue) {\n // For checked changes, just update visuals without full re-render\n if (attr === 'checked' || attr === 'disabled') {\n this.#updateState();\n } else if (attr === 'label') {\n this.#labelText = newValue;\n const labelEl = this.querySelector('.mu-radio__label');\n if (labelEl) labelEl.textContent = newValue;\n }\n }\n\n #updateState() {\n const circle = this.querySelector('.mu-radio__circle');\n const dot = this.querySelector('.mu-radio__dot');\n const label = this.querySelector('.mu-radio__label');\n const isChecked = this.has('checked');\n const isDisabled = this.has('disabled');\n\n // Update cursor\n this.style.cursor = isDisabled ? 'not-allowed' : 'pointer';\n\n if (circle) {\n circle.style.width = '20px';\n circle.style.height = '20px';\n circle.style.borderRadius = '50%';\n circle.style.display = 'flex';\n circle.style.alignItems = 'center';\n circle.style.justifyContent = 'center';\n circle.style.transition = 'border-color var(--md-sys-motion-duration-short4) var(--md-sys-motion-easing-standard)';\n\n // MD3 disabled state\n if (isDisabled) {\n circle.style.border = '2px solid color-mix(in srgb, var(--md-sys-color-on-surface) 38%, transparent)';\n } else {\n circle.style.border = `2px solid ${isChecked ? 'var(--md-sys-color-primary)' : 'var(--md-sys-color-outline)'}`;\n }\n }\n\n if (dot) {\n dot.style.width = '10px';\n dot.style.height = '10px';\n dot.style.borderRadius = '50%';\n dot.style.transform = isChecked ? 'scale(0.5)' : 'scale(0)';\n dot.style.transition = 'transform var(--md-sys-motion-duration-short4) var(--md-sys-motion-easing-standard)';\n\n // MD3 disabled state\n if (isDisabled) {\n dot.style.background = 'color-mix(in srgb, var(--md-sys-color-on-surface) 38%, transparent)';\n } else {\n dot.style.background = 'var(--md-sys-color-primary)';\n }\n }\n\n if (label) {\n label.style.color = isDisabled ? 'color-mix(in srgb, var(--md-sys-color-on-surface) 38%, transparent)' : 'var(--md-sys-color-on-surface)';\n }\n\n // Accessibility: update ARIA states\n this.setAttribute('aria-checked', String(isChecked));\n this.setAttribute('aria-disabled', String(isDisabled));\n this.setAttribute('tabindex', isDisabled ? '-1' : '0');\n }\n}\n\ndefine('mu-radio-group', MuRadioGroup);\ndefine('mu-radio', MuRadio);\n",
44
+ "/**\n * @fileoverview mu-chip - Chip/Tag Component (MD3)\n * \n * Usage:\n * <mu-chip>Tag</mu-chip>\n * <mu-chip selected>Selected</mu-chip>\n * <mu-chip removable>Removable</mu-chip>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { createRipple } from '../core/ripple.js';\n\nexport class MuChip extends MuElement {\n static baseClass = 'mu-chip';\n static cssFile = 'chip';\n static observedAttributes = ['selected', 'removable', 'variant'];\n\n #originalLabel = null;\n\n connectedCallback() {\n super.connectedCallback();\n\n // Store original label before render\n if (!this.#originalLabel && !this.querySelector('.mu-chip__label')) {\n this.#originalLabel = this.textContent.trim();\n }\n\n // Keyboard accessibility\n this.setAttribute('tabindex', '0');\n this.setAttribute('role', 'button');\n this.setupActivation(() => {\n if (!this.has('removable')) {\n this.toggle();\n }\n });\n\n this.listen(this, 'pointerdown', (e) => {\n if (!e.target.closest('.mu-chip__remove')) {\n createRipple(this, e);\n }\n });\n\n this.listen(this, 'click', (e) => {\n if (e.target.closest('.mu-chip__remove')) {\n this.emit('mu-remove');\n this.remove();\n } else if (!this.has('removable')) {\n this.toggle();\n }\n });\n }\n\n render() {\n // Idempotent: skip if already rendered\n if (this.querySelector('.mu-chip__label')) {\n this.#updateStyles();\n return;\n }\n\n const label = this.#originalLabel || this.textContent.trim();\n const removable = this.has('removable');\n\n this.innerHTML = `\n <span class=\"mu-chip__label\">${label}</span>\n ${removable ? '<button class=\"mu-chip__remove\" aria-label=\"Remove\">✕</button>' : ''}\n `;\n\n this.#updateStyles();\n }\n\n update(attr, newValue, oldValue) {\n this.#updateStyles();\n }\n\n #updateStyles() {\n const isSelected = this.has('selected');\n const variant = this.attr('variant', 'outlined');\n\n this.style.display = 'inline-flex';\n this.style.alignItems = 'center';\n this.style.gap = '4px';\n this.style.padding = '8px 16px'; /* MD3: 32dp height, 16dp horizontal */\n this.style.borderRadius = '8px';\n this.style.fontSize = 'var(--md-sys-typescale-label-large-size, 14px)';\n this.style.cursor = 'pointer';\n this.style.userSelect = 'none';\n this.style.transition = 'all var(--md-sys-motion-duration-short4) var(--md-sys-motion-easing-standard)';\n\n if (variant === 'filled' || isSelected) {\n this.style.background = isSelected\n ? 'var(--md-sys-color-secondary-container)'\n : 'var(--md-sys-color-surface-container-high)';\n this.style.color = isSelected\n ? 'var(--md-sys-color-on-secondary-container)'\n : 'var(--md-sys-color-on-surface)';\n this.style.border = '1px solid transparent'; // MD3: transparent border prevents layout shift\n } else {\n this.style.background = 'transparent';\n this.style.color = 'var(--md-sys-color-on-surface)';\n this.style.border = '1px solid var(--md-sys-color-outline)';\n }\n\n const removeBtn = this.querySelector('.mu-chip__remove');\n if (removeBtn) {\n removeBtn.style.background = 'none';\n removeBtn.style.border = 'none';\n removeBtn.style.padding = '0';\n removeBtn.style.marginLeft = '4px';\n removeBtn.style.cursor = 'pointer';\n removeBtn.style.color = 'inherit';\n removeBtn.style.opacity = '0.7';\n }\n }\n\n toggle() {\n if (this.has('selected')) {\n this.removeAttribute('selected');\n } else {\n this.setAttribute('selected', '');\n }\n this.emit('mu-change', { selected: this.has('selected') });\n }\n}\n\ndefine('mu-chip', MuChip);\n",
45
+ "/**\n * @fileoverview mu-card - MD3 Card Container Component\n * \n * Usage: <mu-card variant=\"elevated\">Content here</mu-card>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuCard extends MuElement {\n static baseClass = 'mu-card';\n static cssFile = 'card';\n static observedAttributes = ['variant', 'padding'];\n\n connectedCallback() {\n super.connectedCallback();\n this.#updateClasses();\n }\n\n render() {\n // Card just wraps content, no internal structure needed\n this.#updateClasses();\n }\n\n update(attr, newValue, oldValue) {\n this.#updateClasses();\n }\n\n #updateClasses() {\n const variant = this.attr('variant', 'flat');\n const padding = this.attr('padding', 'md');\n\n this.className = `mu-card mu-card--${variant} mu-card--padding-${padding}`;\n }\n}\n\ndefine('mu-card', MuCard);\n",
46
+ "/**\n * @fileoverview mu-callout - MD3 Callout/Info Box Component\n * \n * Usage: \n * <mu-callout variant=\"info\">Important information here</mu-callout>\n * <mu-callout variant=\"warning\">Warning message</mu-callout>\n * <mu-callout variant=\"success\">Success message</mu-callout>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuCallout extends MuElement {\n static baseClass = 'mu-callout';\n static observedAttributes = ['variant', 'title'];\n\n render() {\n this.#updateStyles();\n }\n\n update(attr, newValue, oldValue) {\n this.#updateStyles();\n }\n\n #updateStyles() {\n const variant = this.attr('variant', 'info');\n\n // MD3 color mappings\n const variantColors = {\n info: {\n bg: 'var(--md-sys-color-primary-container)',\n border: 'var(--md-sys-color-primary)',\n text: 'var(--md-sys-color-on-primary-container)'\n },\n warning: {\n bg: 'var(--md-sys-color-error-container)',\n border: 'var(--md-sys-color-error)',\n text: 'var(--md-sys-color-on-error-container)'\n },\n success: {\n bg: 'var(--md-sys-color-tertiary-container)',\n border: 'var(--md-sys-color-tertiary)',\n text: 'var(--md-sys-color-on-tertiary-container)'\n },\n tip: {\n bg: 'var(--md-sys-color-secondary-container)',\n border: 'var(--md-sys-color-secondary)',\n text: 'var(--md-sys-color-on-secondary-container)'\n }\n };\n\n const colors = variantColors[variant] || variantColors.info;\n\n // Apply MD3 callout styling\n this.style.display = 'block';\n // SOTA 2026: Proper containment - critical for responsive layout\n this.style.boxSizing = 'border-box';\n this.style.maxWidth = '100%';\n this.style.wordWrap = 'break-word';\n this.style.overflowWrap = 'break-word';\n this.style.padding = '20px'; /* MD3: 20dp padding */\n this.style.marginTop = '24px'; /* MD3: 24dp spacing from previous content */\n this.style.marginBottom = '24px';\n this.style.background = colors.bg;\n this.style.borderLeft = `4px solid ${colors.border}`;\n this.style.borderRadius = 'var(--md-sys-shape-corner-medium)';\n this.style.color = colors.text;\n this.style.lineHeight = '1.6';\n }\n}\n\ndefine('mu-callout', MuCallout);\n",
47
+ "/**\n * @fileoverview mu-tabs - MD3 Tabs Component\n * \n * Usage: \n * <mu-tabs active=\"0\">\n * <mu-tab>Tab 1</mu-tab>\n * <mu-tab>Tab 2</mu-tab>\n * </mu-tabs>\n * \n * Features:\n * - Sliding indicator animation (CSS transitions)\n * - DOM-preserving updates (no recreation)\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuTabs extends MuElement {\n static baseClass = 'mu-tabs';\n static cssFile = 'tabs';\n static observedAttributes = ['active'];\n\n #tabs = [];\n #list = null;\n\n connectedCallback() {\n super.connectedCallback();\n // Listen for tab clicks via event delegation\n this.listen(this, 'click', (e) => {\n const tab = e.target.closest('mu-tab');\n if (tab) {\n // Recalculate tabs array each time to handle dynamic changes\n // and cases where tabs were hidden during initial render\n const list = this.querySelector('.mu-tabs__list');\n const currentTabs = list\n ? Array.from(list.querySelectorAll('mu-tab'))\n : Array.from(this.querySelectorAll('mu-tab'));\n const index = currentTabs.indexOf(tab);\n if (index !== -1) {\n this.setAttribute('active', index.toString());\n }\n }\n });\n }\n\n render() {\n // Idempotent: skip if already rendered\n if (this.querySelector('.mu-tabs__list')) {\n this.#tabs = Array.from(this.querySelectorAll('mu-tab'));\n this.#list = this.querySelector('.mu-tabs__list');\n this.#updateActive();\n return;\n }\n\n // Create list wrapper for tabs (indicator is ::after pseudo-element, no DOM needed)\n this.#list = document.createElement('div');\n this.#list.className = 'mu-tabs__list';\n this.#list.setAttribute('role', 'tablist');\n\n // Move existing mu-tab children into list\n this.#tabs = Array.from(this.querySelectorAll('mu-tab'));\n this.#tabs.forEach((tab) => {\n tab.setAttribute('role', 'tab');\n this.#list.appendChild(tab);\n });\n\n // NO DOM indicator element - using ::after pseudo-element via CSS\n this.appendChild(this.#list);\n\n this.#updateActive();\n }\n\n update(attr, newValue, oldValue) {\n if (attr === 'active') {\n this.#updateActive();\n this.emit('mu-tab-change', { index: parseInt(newValue) || 0 });\n }\n }\n\n #updateActive() {\n const activeIndex = parseInt(this.attr('active', '0'));\n const tabCount = this.#tabs.length;\n\n // Update tab active states\n this.#tabs.forEach((tab, i) => {\n tab.classList.toggle('is-active', i === activeIndex);\n tab.setAttribute('aria-selected', i === activeIndex ? 'true' : 'false');\n });\n\n // Update indicator position via CSS custom properties (::after uses these)\n if (this.#list && tabCount > 0) {\n const width = 100 / tabCount;\n this.#list.style.setProperty('--indicator-width', `${width}%`);\n this.#list.style.setProperty('--indicator-left', `${activeIndex * width}%`);\n }\n }\n}\n\nexport class MuTab extends MuElement {\n static baseClass = 'mu-tabs__tab';\n\n connectedCallback() {\n super.connectedCallback();\n this.setAttribute('tabindex', '0');\n }\n\n render() {\n // Tab just wraps content, no transformation needed\n }\n}\n\ndefine('mu-tabs', MuTabs);\ndefine('mu-tab', MuTab);\n",
48
+ "/**\n * @fileoverview mu-alert - MD3 Alert Component\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuAlert extends MuElement {\n static baseClass = 'mu-alert';\n static observedAttributes = ['severity', 'dismissible'];\n\n #closeBtn = null;\n #originalContent = null;\n\n connectedCallback() {\n // Accessibility: set role and aria-live for screen readers (always safe)\n this.setAttribute('role', 'alert');\n this.setAttribute('aria-live', 'polite');\n\n // For AJAX-loaded content: defer entire initialization until HTML parser finishes\n // This is necessary because super.connectedCallback() calls render(),\n // and render needs the content to be available\n if (!this.#originalContent && !this.querySelector('.mu-alert__content') && !this.innerHTML.trim()) {\n // Content not yet available, defer initialization\n setTimeout(() => {\n this.#originalContent = this.innerHTML;\n this.#initializeComponent();\n }, 0);\n } else {\n // Content already available (static HTML or already initialized)\n if (!this.#originalContent && !this.querySelector('.mu-alert__content')) {\n this.#originalContent = this.innerHTML;\n }\n this.#initializeComponent();\n }\n }\n\n #initializeComponent() {\n super.connectedCallback();\n\n // Event delegation for close button\n this.listen(this, 'click', (e) => {\n if (e.target.classList.contains('mu-alert__close')) {\n this.dismiss();\n }\n });\n }\n\n /**\n * Programmatically dismiss the alert\n */\n dismiss() {\n this.emit('mu-dismiss');\n this.remove();\n }\n\n render() {\n // Idempotent: skip if already rendered\n if (this.querySelector('.mu-alert__content')) {\n this.#updateClasses();\n return;\n }\n\n const severity = this.attr('severity', 'info');\n const dismissible = this.has('dismissible');\n\n // Icon names matching mu-icon\n const iconNames = {\n success: 'success',\n error: 'error',\n warning: 'warning',\n info: 'info'\n };\n\n const content = this.#originalContent || '';\n const iconName = iconNames[severity] || iconNames.info;\n\n this.innerHTML = `\n <mu-icon name=\"${iconName}\" size=\"24\" class=\"mu-alert__icon\"></mu-icon>\n <span class=\"mu-alert__content\">${content}</span>\n ${dismissible ? '<button class=\"mu-alert__close\" aria-label=\"Dismiss\"><mu-icon name=\"close\" size=\"18\"></mu-icon></button>' : ''}\n `;\n\n this.#updateClasses();\n }\n\n update(attr, newValue, oldValue) {\n this.#updateClasses();\n }\n\n #updateClasses() {\n const severity = this.attr('severity', 'info');\n this.className = `mu-alert mu-alert--${severity}`;\n }\n}\n\ndefine('mu-alert', MuAlert);\n",
49
+ "/**\n * @fileoverview mu-badge - MD3 Badge Component\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuBadge extends MuElement {\n static baseClass = 'mu-badge';\n static cssFile = 'badge';\n static observedAttributes = ['variant', 'size'];\n\n connectedCallback() {\n super.connectedCallback();\n this.#updateClasses();\n }\n\n render() {\n this.#updateClasses();\n }\n\n update(attr, newValue, oldValue) {\n this.#updateClasses();\n }\n\n #updateClasses() {\n const variant = this.attr('variant', 'primary');\n const size = this.attr('size', 'md');\n this.className = `mu-badge mu-badge--${variant} mu-badge--${size}`;\n }\n}\n\ndefine('mu-badge', MuBadge);\n",
50
+ "/**\n * @fileoverview mu-progress - MD3 Linear Progress Indicator\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuProgress extends MuElement {\n static baseClass = 'mu-progress';\n static cssFile = 'progress';\n static observedAttributes = ['value', 'max', 'variant'];\n\n #bar = null;\n\n render() {\n // Idempotent: skip if already rendered \n if (this.querySelector('.mu-progress__bar')) {\n this.#bar = this.querySelector('.mu-progress__bar');\n return;\n }\n\n this.innerHTML = '<span class=\"mu-progress__bar\"></span>';\n this.#bar = this.querySelector('.mu-progress__bar');\n this.setAttribute('role', 'progressbar');\n this.#updateProgress();\n this.#updateClasses();\n }\n\n update(attr, newValue, oldValue) {\n if (attr === 'value' || attr === 'max') {\n this.#updateProgress();\n }\n this.#updateClasses();\n }\n\n #updateProgress() {\n const value = parseFloat(this.attr('value', '0'));\n const max = parseFloat(this.attr('max', '100'));\n const percent = Math.min(100, Math.max(0, (value / max) * 100));\n\n if (this.#bar) {\n this.#bar.style.width = `${percent}%`;\n }\n\n this.setAttribute('aria-valuenow', value.toString());\n this.setAttribute('aria-valuemax', max.toString());\n }\n\n #updateClasses() {\n const variant = this.attr('variant', 'primary');\n this.className = `mu-progress mu-progress--${variant}`;\n }\n}\n\ndefine('mu-progress', MuProgress);\n",
51
+ "/**\n * @fileoverview mu-table - Data Table Component\n * \n * Usage:\n * <mu-table>\n * <mu-thead>\n * <mu-tr><mu-th>Name</mu-th><mu-th>Email</mu-th></mu-tr>\n * </mu-thead>\n * <mu-tbody>\n * <mu-tr><mu-td>John</mu-td><mu-td>john@example.com</mu-td></mu-tr>\n * </mu-tbody>\n * </mu-table>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuTable extends MuElement {\n static baseClass = 'mu-table';\n static observedAttributes = ['striped', 'hover'];\n\n render() {\n this.style.display = 'table';\n this.style.width = '100%';\n this.style.borderCollapse = 'collapse';\n this.style.fontSize = 'var(--md-sys-typescale-body-medium-size, 14px)';\n }\n}\n\nexport class MuThead extends MuElement {\n static baseClass = 'mu-table__head';\n\n render() {\n this.style.display = 'table-header-group';\n this.style.background = 'var(--md-sys-color-surface-container)';\n }\n}\n\nexport class MuTbody extends MuElement {\n static baseClass = 'mu-table__body';\n\n render() {\n this.style.display = 'table-row-group';\n }\n}\n\nexport class MuTr extends MuElement {\n static baseClass = 'mu-table__row';\n\n render() {\n this.style.display = 'table-row';\n this.style.borderBottom = '1px solid var(--md-sys-color-outline-variant)';\n }\n}\n\nexport class MuTh extends MuElement {\n static baseClass = 'mu-table__header';\n\n render() {\n this.style.display = 'table-cell';\n this.style.padding = '12px 16px';\n this.style.fontWeight = '600';\n this.style.textAlign = 'left';\n }\n}\n\nexport class MuTd extends MuElement {\n static baseClass = 'mu-table__cell';\n\n render() {\n this.style.display = 'table-cell';\n this.style.padding = '12px 16px';\n }\n}\n\ndefine('mu-table', MuTable);\ndefine('mu-thead', MuThead);\ndefine('mu-tbody', MuTbody);\ndefine('mu-tr', MuTr);\ndefine('mu-th', MuTh);\ndefine('mu-td', MuTd);\n",
52
+ "/**\n * @fileoverview mu-avatar - User Avatar Component\n * \n * Usage: \n * <mu-avatar src=\"/path/to/image.jpg\" alt=\"John Doe\" size=\"md\"></mu-avatar>\n * <mu-avatar initials=\"JD\" size=\"lg\"></mu-avatar>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuAvatar extends MuElement {\n static baseClass = 'mu-avatar';\n static cssFile = 'avatar';\n static observedAttributes = ['src', 'alt', 'initials', 'size'];\n\n render() {\n const src = this.attr('src', '');\n const alt = this.attr('alt', '');\n const initials = this.attr('initials', '');\n const size = this.attr('size', 'md');\n\n const sizeMap = { sm: '32px', md: '40px', lg: '56px', xl: '80px' };\n const fontSize = { sm: '12px', md: '14px', lg: '20px', xl: '28px' };\n\n this.style.width = sizeMap[size] || size;\n this.style.height = sizeMap[size] || size;\n this.style.borderRadius = '50%';\n this.style.display = 'inline-flex';\n this.style.alignItems = 'center';\n this.style.justifyContent = 'center';\n this.style.overflow = 'hidden';\n this.style.background = 'var(--md-sys-color-primary-container)';\n this.style.color = 'var(--md-sys-color-on-primary-container)';\n this.style.fontSize = fontSize[size] || '14px';\n this.style.fontWeight = '600';\n\n this.innerHTML = ''; // Clear existing content\n\n let generatedInitials = '';\n if (alt) {\n const words = alt.split(' ');\n generatedInitials = words.map(w => w[0]).join('').toUpperCase().slice(0, 2);\n }\n\n if (src) {\n const img = document.createElement('img');\n img.src = src;\n img.alt = alt; // Safe: setting property, not attribute string\n img.style.cssText = 'width:100%;height:100%;object-fit:cover;';\n img.onerror = () => {\n // Fallback to initials if image fails\n this.innerHTML = '';\n this.#renderInitials(initials, generatedInitials);\n };\n this.appendChild(img);\n } else {\n this.#renderInitials(initials, generatedInitials);\n }\n }\n\n #renderInitials(initials, generatedInitials) {\n // Initials are derived from short string manipulation, relatively low risk,\n // but let's be safe and use textContent for the span.\n\n if (initials) {\n const span = document.createElement('span');\n span.textContent = initials.toUpperCase().slice(0, 2);\n this.appendChild(span);\n } else if (generatedInitials) {\n const span = document.createElement('span');\n span.textContent = generatedInitials;\n this.appendChild(span);\n } else {\n // Default user icon\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('width', '60%');\n svg.setAttribute('height', '60%');\n svg.setAttribute('viewBox', '0 0 16 16');\n svg.setAttribute('fill', 'currentColor');\n\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n path.setAttribute('d', 'M10.561 8.073a6.005 6.005 0 0 1 3.432 5.142.75.75 0 0 1-1.498.07 4.5 4.5 0 0 0-8.99 0 .75.75 0 0 1-1.498-.07 6.004 6.004 0 0 1 3.431-5.142 3.999 3.999 0 1 1 5.123 0ZM10.5 5a2.5 2.5 0 1 0-5 0 2.5 2.5 0 0 0 5 0Z');\n\n svg.appendChild(path);\n this.appendChild(svg);\n }\n }\n\n update(attr, newValue, oldValue) {\n this.render();\n }\n}\n\ndefine('mu-avatar', MuAvatar);\n",
53
+ "/**\n * @fileoverview mu-skeleton - Skeleton Loader Component\n * \n * Usage: \n * <mu-skeleton width=\"200px\" height=\"20px\"></mu-skeleton>\n * <mu-skeleton variant=\"circle\" size=\"40px\"></mu-skeleton>\n * <mu-skeleton variant=\"text\" lines=\"3\"></mu-skeleton>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuSkeleton extends MuElement {\n static baseClass = 'mu-skeleton';\n static observedAttributes = ['variant', 'width', 'height', 'size', 'lines'];\n\n render() {\n // Idempotent: skip if already rendered (has skeleton line or animation)\n if (this.querySelector('.mu-skeleton__line') || this.style.animation) {\n return;\n }\n\n const variant = this.attr('variant', 'rect');\n const width = this.attr('width', '100%');\n const height = this.attr('height', '20px');\n const size = this.attr('size', '40px');\n const lines = parseInt(this.attr('lines', '1'));\n\n this.style.display = 'block';\n\n if (variant === 'text' && lines > 1) {\n // Multiple text lines\n this.innerHTML = Array(lines).fill(0).map((_, i) =>\n `<div class=\"mu-skeleton__line\" style=\"\n height: 16px;\n margin-bottom: 8px;\n width: ${i === lines - 1 ? '70%' : '100%'};\n background: var(--md-sys-color-surface-container-highest);\n border-radius: 4px;\n animation: mu-skeleton-pulse 1.5s ease-in-out infinite;\n \"></div>`\n ).join('');\n } else {\n this.style.width = variant === 'circle' ? size : width;\n this.style.height = variant === 'circle' ? size : height;\n this.style.borderRadius = variant === 'circle' ? '50%' : '4px';\n this.style.background = 'var(--md-sys-color-surface-container-highest)';\n this.style.animation = 'mu-skeleton-pulse 1.5s ease-in-out infinite';\n }\n\n // Add keyframes if not exist\n if (!document.getElementById('mu-skeleton-styles')) {\n const style = document.createElement('style');\n style.id = 'mu-skeleton-styles';\n style.textContent = `\n @keyframes mu-skeleton-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n `;\n document.head.appendChild(style);\n }\n }\n\n update(attr, newValue, oldValue) {\n this.render();\n }\n}\n\ndefine('mu-skeleton', MuSkeleton);\n",
54
+ "/**\n * @fileoverview mu-spinner - MD3 Circular Progress Indicator\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuSpinner extends MuElement {\n static baseClass = 'mu-spinner';\n static observedAttributes = ['size', 'color'];\n\n render() {\n // Idempotent: skip if already rendered \n if (this.querySelector('.mu-spinner__circle')) return;\n\n this.innerHTML = '<span class=\"mu-spinner__circle\"></span>';\n this.#updateClasses();\n }\n\n update(attr, newValue, oldValue) {\n this.#updateClasses();\n }\n\n #updateClasses() {\n const size = this.attr('size', 'md');\n const color = this.attr('color', 'primary');\n this.className = `mu-spinner mu-spinner--${size} mu-spinner--${color}`;\n }\n}\n\ndefine('mu-spinner', MuSpinner);\n",
55
+ "/**\n * @fileoverview mu-modal - MD3 Dialog Component (SOTA Native Dialog)\n * Uses native <dialog> element with showModal() for proper top-layer,\n * focus trapping, ESC handling, and backdrop - all built-in.\n * \n * MD3 Reference: https://m3.material.io/components/dialogs\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { afterPaint } from '../core/scheduler.js';\n\nexport class MuModal extends MuElement {\n static baseClass = 'mu-modal';\n static cssFile = 'dialog';\n static observedAttributes = ['open', 'size'];\n\n /** @type {HTMLDialogElement|null} */\n #dialog = null;\n\n connectedCallback() {\n // Store user content only once, before first render\n if (!this.hasAttribute('data-rendered')) {\n this._userContent = this.innerHTML;\n this.setAttribute('data-rendered', 'true');\n }\n\n super.connectedCallback();\n\n // CRITICAL: Always setup listeners after super.connectedCallback()\n // because it resets the AbortController. The render() creates DOM,\n // but listeners must be attached here to survive disconnect/reconnect.\n this.#setupListeners();\n }\n\n render() {\n // Idempotent: check if already rendered via DOM structure\n if (this.querySelector('dialog')) return;\n\n const size = this.attr('size', 'md');\n const content = this._userContent || '';\n\n this.innerHTML = `\n <dialog class=\"mu-modal__dialog mu-modal--${size}\">\n <button class=\"mu-modal__close\" aria-label=\"Close\">✕</button>\n <div class=\"mu-modal__body\">${content}</div>\n </dialog>\n `;\n\n this.#dialog = this.querySelector('dialog');\n }\n\n /**\n * Setup all event listeners. Called after every connectedCallback\n * to ensure listeners survive DOM disconnect/reconnect cycles.\n */\n #setupListeners() {\n this.#dialog = this.querySelector('dialog');\n if (!this.#dialog) return;\n\n // Native dialog 'close' event (fires on ESC, form[method=dialog], or .close())\n this.listen(this.#dialog, 'close', () => {\n this.removeAttribute('open');\n this.classList.remove('is-open', 'is-visible');\n document.body.style.overflow = '';\n this.emit('mu-close');\n });\n\n // ESC key triggers 'cancel' event on dialog\n this.listen(this.#dialog, 'cancel', (e) => {\n e.preventDefault(); // Prevent default close to control animation\n this.close();\n });\n\n // Click on backdrop (::backdrop pseudo-element triggers click on dialog)\n this.listen(this.#dialog, 'click', (e) => {\n // Only close if clicking the dialog element itself (backdrop area)\n // not its children\n if (e.target === this.#dialog) {\n this.close();\n }\n });\n\n // Close button - MD3 standard X button in top-right\n const closeBtn = this.querySelector('.mu-modal__close');\n if (closeBtn) {\n this.listen(closeBtn, 'click', () => {\n this.close();\n });\n }\n }\n\n update(attr, newValue, oldValue) {\n if (attr === 'open') {\n if (newValue !== null) {\n this.#showDialog();\n }\n }\n }\n\n #showDialog() {\n if (!this.#dialog || this.#dialog.open) return;\n\n this.classList.add('is-open');\n this.#dialog.showModal(); // Native top-layer, focus trap, backdrop!\n document.body.style.overflow = 'hidden';\n\n // Trigger animation - MD3 requires emphasized-decelerate for enter\n afterPaint().then(() => this.classList.add('is-visible'));\n }\n\n /**\n * Open the modal dialog (public API)\n */\n open() {\n this.setAttribute('open', '');\n }\n\n /**\n * Close the modal dialog with animation (public API)\n */\n close() {\n if (!this.#dialog) return;\n\n // MD3: emphasized-accelerate for exit\n this.classList.remove('is-visible');\n\n // SOTA 2026: Use transitionend instead of setTimeout\n // In test environments (JSDOM/linkedom), transitionend won't fire, so use a flag\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n if (this.#dialog && this.#dialog.open) {\n this.#dialog.close();\n }\n this.removeAttribute('open');\n this.classList.remove('is-open');\n document.body.style.overflow = '';\n this.emit('mu-close');\n };\n\n // Listen for transition end\n const dialog = this.#dialog;\n const onTransitionEnd = (e) => {\n if (e.target === dialog) {\n dialog.removeEventListener('transitionend', onTransitionEnd);\n cleanup();\n }\n };\n dialog.addEventListener('transitionend', onTransitionEnd);\n\n // Fallback: cleanup after expected transition time (200ms matches CSS)\n this.setTimeout(() => {\n dialog.removeEventListener('transitionend', onTransitionEnd);\n cleanup();\n }, 200);\n }\n}\n\ndefine('mu-modal', MuModal);\n",
56
+ "/**\n * @fileoverview mu-toast - MD3 Snackbar/Toast Notification\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuToast extends MuElement {\n static baseClass = 'mu-toast';\n static cssFile = 'snackbar';\n static observedAttributes = ['severity', 'duration', 'position'];\n\n #timeout = null;\n #originalContent = null;\n\n connectedCallback() {\n // Store content before render (must be before super because super calls render)\n if (!this.#originalContent && !this.querySelector('.mu-toast__content')) {\n this.#originalContent = this.innerHTML;\n }\n\n super.connectedCallback();\n\n // Event delegation for close button\n this.listen(this, 'click', (e) => {\n if (e.target.classList.contains('mu-toast__close')) {\n this.dismiss();\n }\n });\n\n // Auto-dismiss\n const duration = parseInt(this.attr('duration', '3000'));\n if (duration > 0) {\n this.#timeout = this.setTimeout(() => this.dismiss(), duration);\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n // Timer cleanup handled by MuElement\n }\n\n render() {\n // Idempotent: skip if already rendered\n if (this.querySelector('.mu-toast__content')) {\n this.#updateClasses();\n return;\n }\n\n const content = this.#originalContent || '';\n\n this.innerHTML = `\n <span class=\"mu-toast__content\">${content}</span>\n <button class=\"mu-toast__close\" aria-label=\"Dismiss\">✕</button>\n `;\n\n this.#updateClasses();\n }\n\n update(attr, newValue, oldValue) {\n this.#updateClasses();\n }\n\n #updateClasses() {\n const severity = this.attr('severity', 'info');\n const position = this.attr('position', 'bottom-center');\n this.className = `mu-toast mu-toast--${severity} mu-toast--${position}`;\n }\n\n dismiss() {\n this.emit('mu-dismiss');\n this.classList.add('is-exiting');\n\n // SOTA: Use animationend instead of setTimeout\n let removed = false;\n const cleanup = () => {\n if (!removed) {\n removed = true;\n this.remove();\n }\n };\n\n this.addEventListener('animationend', cleanup, { once: true });\n // Fallback in case animation doesn't fire (test env, reduced motion)\n this.setTimeout(cleanup, 200);\n }\n}\n\ndefine('mu-toast', MuToast);\n\nexport class MuToastContainer extends MuElement {\n static baseClass = 'mu-toast-container';\n\n connectedCallback() {\n super.connectedCallback();\n this.setAttribute('role', 'status');\n this.setAttribute('aria-live', 'polite');\n }\n}\n\ndefine('mu-toast-container', MuToastContainer);\n\n// Toast Manager for programmatic usage\nexport const Toast = {\n show(message, options = {}) {\n const position = options.position || 'bottom-center';\n let container = document.querySelector(`mu-toast-container[position=\"${position}\"]`);\n\n if (!container) {\n container = document.createElement('mu-toast-container');\n container.setAttribute('position', position);\n document.body.appendChild(container);\n }\n\n const toast = document.createElement('mu-toast');\n toast.textContent = message;\n\n if (options.severity) {\n toast.setAttribute('severity', options.severity);\n }\n if (options.duration) {\n toast.setAttribute('duration', options.duration.toString());\n }\n\n container.appendChild(toast);\n return toast;\n }\n};\n\n// ============================================\n// CROSSBUS LISTENER AUTO-REGISTRATION\n// Self-registers when this module is loaded (works with lazy loading)\n// Uses hasListeners to prevent duplicate registration\n// ============================================\nimport { bus, UIEvents, registerComponent } from '../core/bus.js';\n\nif (typeof window !== 'undefined' && bus && !bus.hasListeners(UIEvents.TOAST_SHOW)) {\n bus.on(UIEvents.TOAST_SHOW, (data) => {\n Toast.show(data.message, data);\n });\n}\n\n// Register component capabilities for AI agent discovery\nregisterComponent('mu-toast', {\n signals: [UIEvents.TOAST_SHOW, UIEvents.TOAST_DISMISS],\n options: {\n severities: ['info', 'success', 'warning', 'error'],\n positions: ['top-left', 'top-center', 'top-right', 'bottom-left', 'bottom-center', 'bottom-right'],\n defaultDuration: 3000\n },\n description: 'MD3 Snackbar/Toast Notification component'\n});\n",
57
+ "/**\n * @fileoverview mu-tooltip - MD3 Tooltip Component\n * Uses portal pattern with Floating UI-style positioning\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\n/** Gap between tooltip and trigger element (MD3 spec: 8px) */\nconst TOOLTIP_GAP = 8;\n\nexport class MuTooltip extends MuElement {\n static baseClass = 'mu-tooltip';\n static cssFile = 'tooltip';\n static observedAttributes = ['content', 'position'];\n\n #tooltip = null;\n\n connectedCallback() {\n super.connectedCallback();\n\n this.listen(this, 'mouseenter', () => this.show());\n this.listen(this, 'mouseleave', () => this.hide());\n this.listen(this, 'focus', () => this.show(), { capture: true });\n this.listen(this, 'blur', () => this.hide(), { capture: true });\n }\n\n render() {\n const position = this.attr('position', 'top');\n this.className = `mu-tooltip mu-tooltip--${position}`;\n this.style.position = 'relative';\n this.style.display = 'inline-block';\n }\n\n update(attr, newValue, oldValue) {\n if (attr === 'position') {\n const position = this.attr('position', 'top');\n this.className = `mu-tooltip mu-tooltip--${position}`;\n }\n }\n\n show() {\n if (this.#tooltip) return;\n\n const content = this.attr('content', '');\n if (!content) return;\n\n const position = this.attr('position', 'top');\n\n // Create tooltip element\n this.#tooltip = document.createElement('div');\n this.#tooltip.className = `mu-tooltip__content mu-tooltip__content--${position}`;\n this.#tooltip.textContent = content;\n this.#tooltip.setAttribute('role', 'tooltip');\n\n // Initial styles for measurement - CRITICAL: override CSS transforms\n this.#tooltip.style.cssText = `\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n transform: none !important;\n visibility: hidden;\n z-index: var(--mu-z-tooltip, 9999);\n pointer-events: none;\n margin: 0 !important;\n `;\n\n // Portal: append to body\n document.body.appendChild(this.#tooltip);\n\n // Calculate and apply position\n this.#computePosition(position);\n\n // Trigger visibility\n requestAnimationFrame(() => {\n if (this.#tooltip) {\n this.#tooltip.style.visibility = 'visible';\n this.#tooltip.style.opacity = '1';\n }\n });\n }\n\n /**\n * SOTA positioning logic inspired by Floating UI\n * Uses fixed positioning for viewport-relative placement\n */\n #computePosition(placement) {\n const triggerRect = this.getBoundingClientRect();\n const tooltipRect = this.#tooltip.getBoundingClientRect();\n\n let { x, y } = this.#getCoordinates(placement, triggerRect, tooltipRect);\n\n // Viewport boundary detection and auto-flip\n const finalPlacement = this.#autoFlip(placement, x, y, tooltipRect, triggerRect);\n\n if (finalPlacement !== placement) {\n ({ x, y } = this.#getCoordinates(finalPlacement, triggerRect, tooltipRect));\n }\n\n // Clamp to viewport edges\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n x = Math.max(4, Math.min(x, viewportWidth - tooltipRect.width - 4));\n y = Math.max(4, Math.min(y, viewportHeight - tooltipRect.height - 4));\n\n // Apply final position with !important to override CSS\n this.#tooltip.style.setProperty('left', `${x}px`, 'important');\n this.#tooltip.style.setProperty('top', `${y}px`, 'important');\n }\n\n /**\n * Calculate x,y coordinates for a given placement\n */\n #getCoordinates(placement, triggerRect, tooltipRect) {\n let x, y;\n\n switch (placement) {\n case 'top':\n x = triggerRect.left + (triggerRect.width - tooltipRect.width) / 2;\n y = triggerRect.top - tooltipRect.height - TOOLTIP_GAP;\n break;\n case 'bottom':\n x = triggerRect.left + (triggerRect.width - tooltipRect.width) / 2;\n y = triggerRect.bottom + TOOLTIP_GAP;\n break;\n case 'left':\n x = triggerRect.left - tooltipRect.width - TOOLTIP_GAP;\n y = triggerRect.top + (triggerRect.height - tooltipRect.height) / 2;\n break;\n case 'right':\n x = triggerRect.right + TOOLTIP_GAP;\n y = triggerRect.top + (triggerRect.height - tooltipRect.height) / 2;\n break;\n default:\n x = triggerRect.left + (triggerRect.width - tooltipRect.width) / 2;\n y = triggerRect.top - tooltipRect.height - TOOLTIP_GAP;\n }\n\n return { x, y };\n }\n\n /**\n * Auto-flip to opposite side if tooltip overflows viewport\n */\n #autoFlip(placement, x, y, tooltipRect, triggerRect) {\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n switch (placement) {\n case 'top':\n if (y < 0) return 'bottom';\n break;\n case 'bottom':\n if (y + tooltipRect.height > viewportHeight) return 'top';\n break;\n case 'left':\n if (x < 0) return 'right';\n break;\n case 'right':\n if (x + tooltipRect.width > viewportWidth) return 'left';\n break;\n }\n\n return placement;\n }\n\n hide() {\n if (this.#tooltip) {\n this.#tooltip.remove();\n this.#tooltip = null;\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.hide();\n }\n}\n\ndefine('mu-tooltip', MuTooltip);\n\n\n",
58
+ "/**\n * @fileoverview mu-confirm - Programmatic Confirm Dialog\n * Agent-friendly confirm dialog with Promise-based API\n * \n * SOTA: Extends MuModal to leverage native <dialog> benefits:\n * - Backdrop blur\n * - ESC key handling (native)\n * - Focus trapping (native)\n * - Top-layer stacking (native)\n * \n * @example\n * const ok = await muConfirm('Delete this item?');\n * if (ok) deleteItem();\n * \n * @example\n * const ok = await muConfirm('Are you sure?', {\n * title: 'Confirm Delete',\n * confirmText: 'Delete',\n * cancelText: 'Cancel',\n * variant: 'danger'\n * });\n */\n\nimport { define } from '../core/MuElement.js';\nimport { escapeHTML } from '../core/utils.js';\nimport { MuModal } from './mu-modal.js';\n\n/**\n * @typedef {Object} ConfirmOptions\n * @property {string} [title] - Dialog title\n * @property {string} [confirmText='Confirm'] - Confirm button text\n * @property {string} [cancelText='Cancel'] - Cancel button text\n * @property {'primary'|'danger'|'warning'} [variant='primary'] - Button variant\n */\n\n/** @type {MuConfirm|null} */\nlet activeConfirm = null;\n\n/**\n * Show a confirm dialog and wait for user response\n * @param {string} message - Message to display\n * @param {ConfirmOptions} [options] - Configuration options\n * @returns {Promise<boolean>} - Resolves true if confirmed, false if cancelled\n */\nexport async function muConfirm(message, options = {}) {\n const {\n title = 'Confirm',\n confirmText = 'Confirm',\n cancelText = 'Cancel',\n variant = 'primary'\n } = options;\n\n // Remove any existing confirm dialog\n if (activeConfirm) {\n activeConfirm.remove();\n }\n\n return new Promise((resolve) => {\n const dialog = /** @type {MuConfirm} */ (document.createElement('mu-confirm'));\n dialog.setAttribute('title', title);\n dialog.setAttribute('message', message);\n dialog.setAttribute('confirm-text', confirmText);\n dialog.setAttribute('cancel-text', cancelText);\n dialog.setAttribute('variant', variant);\n\n dialog.addEventListener('mu-confirm', () => {\n dialog.remove();\n activeConfirm = null;\n resolve(true);\n });\n\n dialog.addEventListener('mu-cancel', () => {\n dialog.remove();\n activeConfirm = null;\n resolve(false);\n });\n\n activeConfirm = dialog;\n document.body.appendChild(dialog);\n dialog.open();\n });\n}\n\n/**\n * MuConfirm extends MuModal to inherit native <dialog> benefits\n */\nexport class MuConfirm extends MuModal {\n static baseClass = 'mu-confirm';\n static cssFile = 'dialog';\n static observedAttributes = ['title', 'message', 'confirm-text', 'cancel-text', 'variant', 'open', 'size'];\n\n /** @type {HTMLDialogElement|null} */\n #dialog = null;\n\n connectedCallback() {\n // Skip MuModal's content preservation - we generate our own\n // Go directly to MuElement's connectedCallback for listener setup\n if (!this.hasAttribute('data-rendered')) {\n this.setAttribute('data-rendered', 'true');\n }\n\n // Call grandparent (MuElement) connectedCallback\n Object.getPrototypeOf(MuModal.prototype).connectedCallback.call(this);\n\n // Note: listeners are set up in render() after dialog is created\n }\n\n render() {\n // Don't call super.render() - we have our own layout\n if (this.querySelector('dialog')) return;\n\n const title = escapeHTML(this.attr('title', 'Confirm'));\n const message = escapeHTML(this.attr('message', 'Are you sure?'));\n const confirmText = escapeHTML(this.attr('confirm-text', 'Confirm'));\n const cancelText = escapeHTML(this.attr('cancel-text', 'Cancel'));\n const variant = this.attr('variant', 'primary');\n\n // Map variant to button variant\n const buttonVariant = variant === 'danger' ? 'danger' : 'filled';\n\n this.innerHTML = `\n <dialog class=\"mu-confirm__dialog\">\n <h3 class=\"mu-confirm__title\">${title}</h3>\n <p class=\"mu-confirm__message\">${message}</p>\n <div class=\"mu-confirm__actions\">\n <mu-button variant=\"text\" data-action=\"cancel\">${cancelText}</mu-button>\n <mu-button variant=\"${buttonVariant}\" data-action=\"confirm\">${confirmText}</mu-button>\n </div>\n </dialog>\n `;\n\n this.#dialog = this.querySelector('dialog');\n\n // Set up listeners after dialog is created\n this.#setupConfirmListeners();\n }\n\n /**\n * Handle actions from MuElement's centralized event delegation\n * This is called by #setupEventDelegation in MuElement when [data-action] elements are clicked\n */\n handleAction(action, target, event) {\n if (action === 'cancel') {\n this.cancel();\n } else if (action === 'confirm') {\n this.confirm();\n }\n }\n\n #setupConfirmListeners() {\n this.#dialog = this.querySelector('dialog');\n if (!this.#dialog) return;\n\n // Native dialog 'close' event\n this.listen(this.#dialog, 'close', () => {\n this.removeAttribute('open');\n this.classList.remove('is-open', 'is-visible');\n document.body.style.overflow = '';\n });\n\n // ESC key triggers 'cancel' event on dialog - treat as cancel\n this.listen(this.#dialog, 'cancel', (e) => {\n e.preventDefault();\n this.cancel();\n });\n\n // Click on backdrop (dialog element itself, not its children)\n this.listen(this.#dialog, 'click', (e) => {\n if (e.target === this.#dialog) {\n this.cancel();\n }\n });\n }\n\n update(attr, newValue, oldValue) {\n if (attr === 'open') {\n if (newValue !== null) {\n this.#showDialog();\n }\n }\n }\n\n #showDialog() {\n if (!this.#dialog || this.#dialog.open) return;\n\n this.classList.add('is-open');\n this.#dialog.showModal();\n document.body.style.overflow = 'hidden';\n\n // Focus confirm button for keyboard navigation (after DOM is ready)\n const confirmBtn = this.querySelector('.mu-confirm__confirm');\n if (confirmBtn) {\n // SOTA: Use double-rAF to ensure focus happens after showModal completes\n requestAnimationFrame(() => {\n requestAnimationFrame(() => confirmBtn.focus());\n });\n }\n\n // Trigger animation\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.classList.add('is-visible');\n });\n });\n }\n\n /**\n * Open the confirm dialog\n */\n open() {\n this.setAttribute('open', '');\n }\n\n /**\n * Close the confirm dialog with animation\n */\n close() {\n if (!this.#dialog) return;\n\n this.classList.remove('is-visible');\n\n // SOTA 2026: Use transitionend with flag for test compatibility\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n if (this.#dialog && this.#dialog.open) {\n this.#dialog.close();\n }\n this.removeAttribute('open');\n this.classList.remove('is-open');\n document.body.style.overflow = '';\n };\n\n const dialog = this.#dialog;\n const onTransitionEnd = (e) => {\n if (e.target === dialog) {\n dialog.removeEventListener('transitionend', onTransitionEnd);\n cleanup();\n }\n };\n dialog.addEventListener('transitionend', onTransitionEnd);\n\n // Fallback: cleanup after expected transition time (200ms matches CSS)\n this.setTimeout(() => {\n dialog.removeEventListener('transitionend', onTransitionEnd);\n cleanup();\n }, 200);\n }\n\n /**\n * Confirm action - closes and emits mu-confirm event\n */\n confirm() {\n this.close();\n this.emit('mu-confirm');\n }\n\n /**\n * Cancel action - closes and emits mu-cancel event\n */\n cancel() {\n this.close();\n this.emit('mu-cancel');\n }\n}\n\ndefine('mu-confirm', MuConfirm);\n",
59
+ "/**\n * mu-router - Route management and lazy page loading\n * \n * Features:\n * - Hash-based routing (#page-name)\n * - Lazy loads pages from /app/pages/{route}.html\n * - Caches loaded pages\n * - Emits navigation events\n * \n * Usage:\n * <mu-router base=\"/app/pages\"></mu-router>\n * \n * @agent-pattern\n * This component is core to the page-based app architecture.\n * Place one <mu-router> in your app shell where pages should render.\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { escapeHTML } from '../core/utils.js';\n\nclass MuRouter extends MuElement {\n static baseClass = 'mu-router';\n static observedAttributes = ['base', 'default'];\n\n // Cache for loaded pages\n #pageCache = new Map();\n #currentRoute = null;\n\n connectedCallback() {\n super.connectedCallback();\n\n // Listen for hash changes - use this.listen() for automatic cleanup\n this.listen(window, 'hashchange', () => this.#handleRoute());\n\n // Handle initial route\n this.#handleRoute();\n }\n\n // disconnectedCallback handled by MuElement (AbortController cleanup)\n\n render() {\n // Empty container - pages render inside\n this.innerHTML = '<div class=\"mu-router__content\"></div>';\n }\n\n get #basePath() {\n return this.attr('base', '/app/pages');\n }\n\n get #defaultRoute() {\n return this.attr('default', 'home');\n }\n\n get #contentContainer() {\n return this.querySelector('.mu-router__content');\n }\n\n async #handleRoute() {\n const hash = window.location.hash.slice(1) || this.#defaultRoute;\n\n // Skip if same route\n if (hash === this.#currentRoute) return;\n\n this.#currentRoute = hash;\n\n // Emit route-change event\n this.emit('mu-route-change', { route: hash });\n\n // Load page\n await this.#loadPage(hash);\n }\n\n async #loadPage(route) {\n const container = this.#contentContainer;\n if (!container) return;\n\n // Show loading state\n container.innerHTML = '<mu-spinner></mu-spinner>';\n\n try {\n // Check cache first\n if (this.#pageCache.has(route)) {\n container.innerHTML = this.#pageCache.get(route);\n this.emit('mu-page-loaded', { route });\n return;\n }\n\n // Fetch page HTML\n const url = `${this.#basePath}/${route}.html`;\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Page not found: ${route}`);\n }\n\n const html = await response.text();\n\n // Parse the mu-page and extract template content\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const muPage = doc.querySelector('mu-page');\n\n if (muPage) {\n const template = muPage.querySelector('template');\n const content = template ? template.innerHTML : muPage.innerHTML;\n\n // Cache and render\n this.#pageCache.set(route, content);\n container.innerHTML = content;\n\n // Load dependencies\n const deps = muPage.querySelector('script[type=\"x-dependencies\"]');\n if (deps) {\n await this.#loadDependencies(deps.textContent);\n }\n\n // Update page title\n const title = muPage.getAttribute('title');\n if (title) {\n document.title = `${title} | microUI`;\n }\n } else {\n container.innerHTML = html;\n }\n\n this.emit('mu-page-loaded', { route });\n\n } catch (error) {\n container.innerHTML = `\n <mu-alert variant=\"error\">\n <strong>Page not found</strong>\n <p>Could not load page: ${escapeHTML(route)}</p>\n </mu-alert>\n `;\n this.emit('mu-page-error', { route, error });\n }\n }\n\n async #loadDependencies(depsText) {\n const deps = depsText\n .split(/[\\n,]/)\n .map(d => d.trim())\n .filter(d => d && d.startsWith('mu-'));\n\n // Load each component\n for (const dep of deps) {\n // Skip if already defined\n if (customElements.get(dep)) continue;\n\n try {\n await import(`/dist/components/${dep}.js`);\n } catch (e) {\n console.warn(`[mu-router] Could not load: ${dep}`, e);\n }\n }\n }\n\n // Public API\n navigate(route) {\n window.location.hash = route;\n }\n\n get currentRoute() {\n return this.#currentRoute;\n }\n}\n\ndefine('mu-router', MuRouter);\nexport { MuRouter };\n",
60
+ "/**\n * mu-page - Self-contained page component\n * \n * Features:\n * - Declares route and title\n * - Declares dependencies (for auto-bundling)\n * - Contains template HTML\n * \n * Usage in pages/*.html:\n * \n * <mu-page route=\"buttons\" title=\"Buttons\">\n * <script type=\"x-dependencies\">\n * mu-button\n * mu-tabs\n * </script>\n * \n * <template>\n * <h1>Buttons</h1>\n * ...\n * </template>\n * </mu-page>\n * \n * @agent-pattern\n * When creating a new page, create a single file in app/pages/\n * with this structure. The build system will auto-generate route bundles.\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nclass MuPage extends MuElement {\n static baseClass = 'mu-page';\n static observedAttributes = ['route', 'title'];\n\n get route() {\n return this.attr('route', '');\n }\n\n get pageTitle() {\n return this.attr('title', '');\n }\n\n get dependencies() {\n const script = this.querySelector('script[type=\"x-dependencies\"]');\n if (!script) return [];\n\n return script.textContent\n .split(/[\\n,]/)\n .map(d => d.trim())\n .filter(d => d && d.startsWith('mu-'));\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n // If rendered directly (not via router), render template\n if (this.querySelector('template')) {\n this.render();\n }\n }\n\n render() {\n const template = this.querySelector('template');\n if (template) {\n // Clone template content\n const content = template.content.cloneNode(true);\n\n // Clear and append\n const script = this.querySelector('script[type=\"x-dependencies\"]');\n this.innerHTML = '';\n if (script) this.appendChild(script); // Keep deps for debugging\n this.appendChild(content);\n }\n }\n}\n\ndefine('mu-page', MuPage);\nexport { MuPage };\n",
61
+ "/**\n * @fileoverview mu-theme-toggle - Theme Switch Component\n * \n * Usage: <mu-theme-toggle></mu-theme-toggle>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { Theme } from '../core/theme.js';\nimport { bus, UIEvents, registerComponent } from '../core/bus.js';\n\nexport class MuThemeToggle extends MuElement {\n static baseClass = 'mu-theme-toggle';\n\n connectedCallback() {\n super.connectedCallback();\n\n // Use framework's listen() - automatically prevents duplicates via AbortController reuse\n this.listen(this, 'click', () => Theme.toggle());\n\n // Update icon when theme changes\n bus.on(UIEvents.THEME_CHANGE, () => this.#updateIcon());\n }\n\n render() {\n this.innerHTML = `\n <button class=\"mu-theme-toggle__button\" aria-label=\"Toggle theme\">\n <span class=\"mu-theme-toggle__icon\"></span>\n </button>\n `;\n this.#updateIcon();\n }\n\n #updateIcon() {\n const isDark = Theme.get() === 'dark';\n const icon = this.querySelector('.mu-theme-toggle__icon');\n if (icon) {\n icon.textContent = isDark ? '☀️' : '🌙';\n }\n }\n}\n\ndefine('mu-theme-toggle', MuThemeToggle);\n\n// Register component capabilities for AI agent discovery\nregisterComponent('mu-theme-toggle', {\n signals: [UIEvents.THEME_CHANGE],\n options: {\n themes: ['light', 'dark'],\n emits: ['click']\n },\n description: 'Theme toggle button that switches between light/dark modes'\n});\n",
62
+ "/**\n * @fileoverview mu-virtual-list - Virtual List Component for Large Datasets\n * \n * Renders only visible items for lists with thousands of elements.\n * \n * Usage:\n * <mu-virtual-list \n * item-height=\"50\"\n * .items=\"${largeArray}\"\n * .renderItem=\"${(item) => `<div>${item.name}</div>`}\">\n * </mu-virtual-list>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { throttle } from '../core/render.js';\n\nexport class MuVirtualList extends MuElement {\n static baseClass = 'mu-virtual-list';\n static cssFile = 'virtual-list';\n static observedAttributes = ['item-height', 'buffer'];\n\n // Data\n #items = [];\n #renderItem = (item) => `<div>${item}</div>`;\n\n // State\n #scrollTop = 0;\n #visibleStart = 0;\n #visibleEnd = 0;\n\n // Refs\n #container = null;\n #content = null;\n\n set items(arr) {\n this.#items = arr || [];\n this.#updateVisibleRange();\n }\n\n get items() {\n return this.#items;\n }\n\n set renderItem(fn) {\n this.#renderItem = fn;\n this.#updateVisibleRange();\n }\n\n connectedCallback() {\n super.connectedCallback();\n // Note: scroll listener is attached in render() to the internal viewport container\n }\n\n render() {\n const itemHeight = parseInt(this.attr('item-height', '50'));\n\n this.innerHTML = `\n <div class=\"mu-virtual-list__viewport\" style=\"\n height: 100%;\n overflow-y: auto;\n position: relative;\n \">\n <div class=\"mu-virtual-list__content\" style=\"\n position: relative;\n \">\n <div class=\"mu-virtual-list__items\"></div>\n </div>\n </div>\n `;\n\n this.#container = this.querySelector('.mu-virtual-list__viewport');\n this.#content = this.querySelector('.mu-virtual-list__content');\n\n // Throttled scroll handler - attached to the viewport container where scroll occurs\n const handleScroll = throttle(() => {\n this.#scrollTop = this.#container.scrollTop;\n this.#updateVisibleRange();\n }, 16); // ~60fps\n\n this.listen(this.#container, 'scroll', handleScroll);\n\n this.style.display = 'block';\n this.style.height = '400px';\n this.style.overflow = 'hidden';\n\n this.#updateVisibleRange();\n }\n\n #updateVisibleRange() {\n if (!this.#container || !this.#items.length) return;\n\n const itemHeight = parseInt(this.attr('item-height', '50'));\n const buffer = parseInt(this.attr('buffer', '5'));\n const viewportHeight = this.#container.clientHeight;\n\n // Calculate visible range\n const totalHeight = this.#items.length * itemHeight;\n this.#content.style.height = `${totalHeight}px`;\n\n const start = Math.max(0, Math.floor(this.#scrollTop / itemHeight) - buffer);\n const visibleCount = Math.ceil(viewportHeight / itemHeight) + buffer * 2;\n const end = Math.min(this.#items.length, start + visibleCount);\n\n // Only re-render if range changed\n if (start !== this.#visibleStart || end !== this.#visibleEnd) {\n this.#visibleStart = start;\n this.#visibleEnd = end;\n this.#renderVisibleItems();\n }\n }\n\n async #renderVisibleItems() {\n const itemHeight = parseInt(this.attr('item-height', '50'));\n const itemsContainer = this.querySelector('.mu-virtual-list__items');\n\n if (!itemsContainer) return;\n\n // Render only visible items\n const visibleItems = this.#items.slice(this.#visibleStart, this.#visibleEnd);\n\n // For large batches, use scheduler.yield to prevent INP degradation\n // (Per 2024 Chrome Core Web Vitals research)\n const BATCH_SIZE = 50;\n const useYield = visibleItems.length > BATCH_SIZE && 'scheduler' in window;\n\n if (useYield) {\n // Batch render with yields for responsiveness\n const fragments = [];\n for (let batch = 0; batch < visibleItems.length; batch += BATCH_SIZE) {\n const batchItems = visibleItems.slice(batch, batch + BATCH_SIZE);\n\n fragments.push(...batchItems.map((item, i) => {\n const index = this.#visibleStart + batch + i;\n const top = index * itemHeight;\n return `\n <div class=\"mu-virtual-list__item\" style=\"\n position: absolute;\n top: ${top}px;\n left: 0;\n right: 0;\n height: ${itemHeight}px;\n \" data-index=\"${index}\" data-mu-state=\"visible\">\n ${this.#renderItem(item, index)}\n </div>\n `;\n }));\n\n // Yield to browser between batches\n if (batch + BATCH_SIZE < visibleItems.length) {\n await scheduler.yield();\n }\n }\n itemsContainer.innerHTML = fragments.join('');\n } else {\n // Standard render for small lists\n itemsContainer.innerHTML = visibleItems.map((item, i) => {\n const index = this.#visibleStart + i;\n const top = index * itemHeight;\n\n return `\n <div class=\"mu-virtual-list__item\" style=\"\n position: absolute;\n top: ${top}px;\n left: 0;\n right: 0;\n height: ${itemHeight}px;\n \" data-index=\"${index}\" data-mu-state=\"visible\">\n ${this.#renderItem(item, index)}\n </div>\n `;\n }).join('');\n }\n }\n\n /**\n * Scroll to specific index\n */\n scrollToIndex(index) {\n const itemHeight = parseInt(this.attr('item-height', '50'));\n this.#container.scrollTop = index * itemHeight;\n }\n}\n\ndefine('mu-virtual-list', MuVirtualList);\n",
63
+ "/**\n * @fileoverview mu-lazy - Lazy Loading Component\n * \n * Defers rendering until element is visible in viewport.\n * Uses IntersectionObserver for efficient detection.\n * \n * Usage:\n * <mu-lazy>\n * <template>\n * <heavy-component></heavy-component>\n * </template>\n * <div slot=\"placeholder\">Loading...</div>\n * </mu-lazy>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuLazy extends MuElement {\n static baseClass = 'mu-lazy';\n static observedAttributes = ['root-margin', 'threshold'];\n\n #observer = null;\n #loaded = false;\n\n connectedCallback() {\n super.connectedCallback();\n\n const rootMargin = this.attr('root-margin', '200px');\n const threshold = parseFloat(this.attr('threshold', '0'));\n\n this.#observer = new IntersectionObserver((entries) => {\n if (entries[0].isIntersecting && !this.#loaded) {\n this.#load();\n }\n }, {\n rootMargin,\n threshold\n });\n\n this.#observer.observe(this);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#observer?.disconnect();\n }\n\n render() {\n // Show placeholder initially\n const placeholder = this.querySelector('[slot=\"placeholder\"]');\n if (placeholder) {\n placeholder.style.display = 'block';\n }\n\n // Hide template\n const template = this.querySelector('template');\n if (template) {\n template.style.display = 'none';\n }\n }\n\n #load() {\n this.#loaded = true;\n this.#observer?.disconnect();\n\n const template = this.querySelector('template');\n const placeholder = this.querySelector('[slot=\"placeholder\"]');\n\n if (template) {\n // Clone and append template content\n const content = template.content.cloneNode(true);\n this.appendChild(content);\n template.remove();\n }\n\n if (placeholder) {\n placeholder.remove();\n }\n\n this.emit('mu-loaded');\n this.classList.add('is-loaded');\n }\n\n /**\n * Force load immediately\n */\n load() {\n if (!this.#loaded) {\n this.#load();\n }\n }\n}\n\ndefine('mu-lazy', MuLazy);\n",
64
+ "/**\n * @fileoverview mu-repeat - Efficient List Rendering with Keyed Diffing\n * \n * Renders arrays efficiently by only updating changed items.\n * Uses key-based reconciliation like React/Vue.\n * \n * Usage:\n * <mu-repeat id=\"list\"></mu-repeat>\n * \n * const list = document.getElementById('list');\n * list.items = users;\n * list.keyFn = (user) => user.id;\n * list.renderItem = (user) => `<div>${user.name}</div>`;\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { scheduler } from '../core/render.js';\n\nexport class MuRepeat extends MuElement {\n static baseClass = 'mu-repeat';\n static observedAttributes = [];\n\n #items = [];\n #keyFn = (item, index) => index;\n #renderItem = (item) => `<div>${JSON.stringify(item)}</div>`;\n #itemNodes = new Map(); // key -> DOM element\n\n set items(arr) {\n const oldItems = this.#items;\n this.#items = arr || [];\n\n // Schedule batched update\n scheduler.schedule(() => this.#reconcile(oldItems));\n }\n\n get items() {\n return this.#items;\n }\n\n set keyFn(fn) {\n this.#keyFn = fn;\n }\n\n set renderItem(fn) {\n this.#renderItem = fn;\n }\n\n render() {\n this.style.display = 'contents';\n }\n\n /**\n * Efficient reconciliation - only updates changed items\n */\n #reconcile(oldItems) {\n const newKeys = new Set();\n const fragment = document.createDocumentFragment();\n\n // Build set of new keys\n for (let i = 0; i < this.#items.length; i++) {\n const key = this.#keyFn(this.#items[i], i);\n newKeys.add(key);\n }\n\n // Remove items that no longer exist\n for (const [key, node] of this.#itemNodes) {\n if (!newKeys.has(key)) {\n node.remove();\n this.#itemNodes.delete(key);\n }\n }\n\n // Add/update items\n let prevNode = null;\n\n for (let i = 0; i < this.#items.length; i++) {\n const item = this.#items[i];\n const key = this.#keyFn(item, i);\n\n let node = this.#itemNodes.get(key);\n\n if (!node) {\n // Create new node\n const wrapper = document.createElement('div');\n wrapper.innerHTML = this.#renderItem(item, i);\n node = wrapper.firstElementChild || wrapper;\n node.dataset.muKey = key;\n this.#itemNodes.set(key, node);\n } else {\n // Update existing node content\n const newContent = this.#renderItem(item, i);\n if (node.outerHTML !== newContent) {\n const wrapper = document.createElement('div');\n wrapper.innerHTML = newContent;\n const newNode = wrapper.firstElementChild || wrapper;\n newNode.dataset.muKey = key;\n node.replaceWith(newNode);\n this.#itemNodes.set(key, newNode);\n node = newNode;\n }\n }\n\n // Position correctly\n if (prevNode) {\n if (node.previousElementSibling !== prevNode) {\n prevNode.after(node);\n }\n } else {\n if (this.firstElementChild !== node) {\n this.prepend(node);\n }\n }\n\n prevNode = node;\n }\n }\n\n /**\n * Get DOM element for a key\n */\n getElement(key) {\n return this.#itemNodes.get(key);\n }\n\n /**\n * Force full re-render\n */\n refresh() {\n this.#itemNodes.clear();\n this.innerHTML = '';\n scheduler.schedule(() => this.#reconcile([]));\n }\n}\n\ndefine('mu-repeat', MuRepeat);\n",
65
+ "/**\n * @fileoverview mu-fetch - Declarative Data Fetcher Component\n * Agent-friendly component for fetching data with automatic loading/error states\n * \n * @example\n * <mu-fetch url=\"/api/users\" id=\"users\">\n * <template slot=\"loading\"><mu-skeleton></mu-skeleton></template>\n * <template slot=\"error\"><mu-alert variant=\"error\">${error}</mu-alert></template>\n * </mu-fetch>\n * \n * // Access data\n * const fetcher = document.getElementById('users');\n * fetcher.data; // The fetched data\n * fetcher.refetch(); // Re-fetch data\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\n/**\n * @typedef {'idle'|'loading'|'success'|'error'} FetchState\n */\n\n/**\n * @typedef {Object} FetchResult\n * @property {FetchState} state\n * @property {any} data\n * @property {Error|null} error\n */\n\nexport class MuFetch extends MuElement {\n static baseClass = 'mu-fetch';\n static observedAttributes = ['url', 'method', 'auto', 'interval'];\n\n /** @type {FetchState} */\n state = 'idle';\n\n /** @type {any} */\n data = null;\n\n /** @type {Error|null} */\n error = null;\n\n /** @type {AbortController|null} */\n _controller = null;\n\n /** @type {number|null} */\n _intervalId = null;\n\n connectedCallback() {\n // Store templates before render\n this._loadingTemplate = this.querySelector('template[slot=\"loading\"]')?.innerHTML ||\n '<mu-spinner></mu-spinner>';\n this._errorTemplate = this.querySelector('template[slot=\"error\"]')?.innerHTML ||\n '<mu-alert variant=\"error\">Error loading data</mu-alert>';\n this._emptyTemplate = this.querySelector('template[slot=\"empty\"]')?.innerHTML ||\n '<p>No data</p>';\n\n super.connectedCallback();\n\n // Auto-fetch on connect\n if (this.has('auto') || this.hasAttribute('url')) {\n this.fetch();\n }\n\n // Setup interval refresh\n const interval = parseInt(this.attr('interval', '0'));\n if (interval > 0) {\n this.setInterval(() => this.fetch(), interval);\n }\n }\n\n render() {\n // Render based on current state\n this.innerHTML = ''; // Clear content\n\n switch (this.state) {\n case 'loading':\n // Safe: _loadingTemplate is trusted or empty, but let's wrap it container\n const loadingContainer = document.createElement('div');\n loadingContainer.className = 'mu-fetch__loading';\n loadingContainer.innerHTML = this._loadingTemplate; // _loadingTemplate comes from initial slot content which is trusted\n this.appendChild(loadingContainer);\n break;\n case 'error':\n const errorContainer = document.createElement('div');\n errorContainer.className = 'mu-fetch__error';\n\n // Safe: Create error message safely using textContent\n // We don't use the template string replacement anymore to avoid XSS\n // If user provided a custom error template, we parse it safely or just use default\n\n const errorMessage = this.error?.message || 'Unknown error';\n\n if (this._errorTemplate && this._errorTemplate.includes('${error}')) {\n // If template is complex, we might need a safer way, but for now \n // let's stick to safe text replacement if possible or just use textContent\n // Actually, simply setting textContent into the container is safest for the message\n errorContainer.textContent = `Error: ${errorMessage}`;\n // If we want to respect the slot, we'd need a safe interpolate, \n // but for high, security we break the unsafe template behavior for errors.\n } else {\n const alert = document.createElement('mu-alert');\n alert.setAttribute('variant', 'error');\n alert.textContent = errorMessage; // Safe\n errorContainer.appendChild(alert);\n }\n\n this.appendChild(errorContainer);\n break;\n case 'success':\n if (!this.data || (Array.isArray(this.data) && this.data.length === 0)) {\n const emptyContainer = document.createElement('div');\n emptyContainer.className = 'mu-fetch__empty';\n emptyContainer.innerHTML = this._emptyTemplate; // Trusted slot content\n this.appendChild(emptyContainer);\n } else {\n const dataContainer = document.createElement('div');\n dataContainer.className = 'mu-fetch__data';\n\n // Dataslot or renderItem function\n if (this.renderItem && Array.isArray(this.data)) {\n // WARNING: renderItem expects to return a string currently. \n // To be safe, we should check if it returns a Node or string.\n // For now we will assume string but we can sanitize it? \n // Actually, following the plan, we change default behavior but if user provides function\n // they might output HTML. \n // Let's implement safe node appending if possible.\n this.data.forEach(item => {\n const result = this.renderItem(item);\n if (result instanceof Node) {\n dataContainer.appendChild(result);\n } else {\n // If string, we must be careful. \n // Ideally we use insertAdjacentHTML but that is XSS vector if renderItem is unsafe.\n // We will document that renderItem must be safe.\n // For the PoC, we will show that we can make it safe by NOT using innerHTML on the container directly\n // but appending item by item?\n // innerHTML += result is bad.\n const temp = document.createElement('div');\n temp.innerHTML = result; // Still unsafe if result is bad.\n // We can't fix user's renderItem but we can fix the container\n dataContainer.insertAdjacentHTML('beforeend', result);\n }\n });\n } else {\n const slot = document.createElement('slot');\n slot.name = 'data';\n dataContainer.appendChild(slot);\n this.emit('mu-data', { data: this.data });\n }\n this.appendChild(dataContainer);\n }\n break;\n }\n }\n\n /**\n * Fetch data from the URL\n * @param {RequestInit} [options] - Fetch options override\n * @returns {Promise<any>}\n */\n async fetch(options = {}) {\n const url = this.attr('url', '');\n if (!url) {\n console.warn('mu-fetch: No URL provided');\n return null;\n }\n\n // Abort any in-flight request\n if (this._controller) {\n this._controller.abort();\n }\n this._controller = new AbortController();\n\n this.state = 'loading';\n this.error = null;\n this.render();\n this.emit('mu-loading');\n\n try {\n const method = this.attr('method', 'GET');\n const response = await fetch(url, {\n method,\n signal: this._controller.signal,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n },\n ...options\n });\n\n if (!response.ok) {\n // If the server returns JSON error, try to parse it\n let errorMsg = `HTTP ${response.status}: ${response.statusText}`;\n try {\n const errorJson = await response.json();\n if (errorJson.message) errorMsg = errorJson.message;\n } catch (e) {\n // Ignore json parse error\n }\n throw new Error(errorMsg);\n }\n\n this.data = await response.json();\n this.state = 'success';\n this.render();\n this.emit('mu-success', { data: this.data });\n return this.data;\n } catch (err) {\n if (err.name === 'AbortError') {\n return null; // Aborted, ignore\n }\n this.error = /** @type {Error} */ (err);\n this.state = 'error';\n this.render();\n this.emit('mu-error', { error: this.error });\n return null;\n }\n }\n\n /**\n * Refetch the current URL\n * @returns {Promise<any>}\n */\n refetch() {\n return this.fetch();\n }\n\n /**\n * Set custom render function for array data\n * @param {(item: any, index: number) => string} fn\n */\n set renderItem(fn) {\n this._renderItem = fn;\n }\n\n get renderItem() {\n return this._renderItem;\n }\n\n update(attr, newValue, oldValue) {\n if (attr === 'url' && newValue !== oldValue) {\n this.fetch();\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n if (this._controller) {\n this._controller.abort();\n }\n // Note: setInterval cleanup now handled by MuElement via super.disconnectedCallback()\n }\n}\n\ndefine('mu-fetch', MuFetch);\n",
66
+ "/**\n * mu-datatable.js - Smart Data Table Component\n * \n * AI-First data table with built-in sorting, pagination, and filtering.\n * Designed to minimize boilerplate code when displaying tabular data.\n * \n * @example\n * <mu-datatable\n * columns='[\n * {\"field\": \"name\", \"label\": \"Name\", \"sortable\": true},\n * {\"field\": \"email\", \"label\": \"Email\"},\n * {\"field\": \"role\", \"label\": \"Role\", \"filterable\": true}\n * ]'\n * page-size=\"10\"\n * sortable>\n * </mu-datatable>\n * \n * <script>\n * document.querySelector('mu-datatable').setData(usersArray);\n * </script>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { escapeHTML } from '../core/utils.js';\nimport { debounce } from '../core/render.js';\n\nexport class MuDataTable extends MuElement {\n static get observedAttributes() {\n return ['columns', 'page-size', 'sortable', 'selectable', 'filterable', 'empty-message'];\n }\n\n static baseClass = 'mu-datatable';\n static cssFile = 'datatable';\n\n constructor() {\n super();\n\n // Internal state\n this._data = [];\n this._filteredData = [];\n this._columns = [];\n this._currentPage = 1;\n this._sortField = null;\n this._sortDirection = 'asc';\n this._selectedRows = new Set();\n this._filterValue = '';\n }\n\n // === PROPERTIES ===\n\n get columns() {\n const attr = this.getAttribute('columns');\n if (attr) {\n try {\n return JSON.parse(attr);\n } catch (e) {\n console.warn('[mu-datatable] Invalid columns JSON:', e);\n return [];\n }\n }\n return this._columns;\n }\n\n set columns(value) {\n this._columns = Array.isArray(value) ? value : [];\n if (this.isConnected) this.render();\n }\n\n get pageSize() {\n return parseInt(this.getAttribute('page-size')) || 10;\n }\n\n set pageSize(value) {\n this.setAttribute('page-size', value);\n }\n\n get sortable() {\n return this.hasAttribute('sortable');\n }\n\n get selectable() {\n return this.hasAttribute('selectable');\n }\n\n get filterable() {\n return this.hasAttribute('filterable');\n }\n\n get emptyMessage() {\n return this.getAttribute('empty-message') || 'No data available';\n }\n\n // === LIFECYCLE ===\n\n connectedCallback() {\n super.connectedCallback();\n this.render();\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (this.isConnected && oldVal !== newVal) {\n this.render();\n }\n }\n\n // === PUBLIC API ===\n\n /**\n * Set table data programmatically\n * @param {Array<Object>} data - Array of row objects\n */\n setData(data) {\n this._data = Array.isArray(data) ? data : [];\n this._filteredData = [...this._data];\n this._currentPage = 1;\n this._selectedRows.clear();\n this._applySort();\n this.render();\n\n this.emit('mu-data-change', { data: this._data, count: this._data.length }, { bubbles: true });\n }\n\n /**\n * Get current data\n * @returns {Array<Object>}\n */\n getData() {\n return [...this._data];\n }\n\n /**\n * Get current sort state\n * @returns {{ field: string|null, direction: 'asc'|'desc' }}\n */\n getSortState() {\n return { field: this._sortField, direction: this._sortDirection };\n }\n\n /**\n * Get selected rows\n * @returns {Array<Object>}\n */\n getSelectedRows() {\n return this._data.filter((_, idx) => this._selectedRows.has(idx));\n }\n\n /**\n * Get current page info\n * @returns {{ page: number, pageSize: number, totalPages: number, totalRows: number }}\n */\n getPageInfo() {\n const totalPages = Math.ceil(this._filteredData.length / this.pageSize);\n return {\n page: this._currentPage,\n pageSize: this.pageSize,\n totalPages,\n totalRows: this._filteredData.length\n };\n }\n\n /**\n * Go to specific page\n * @param {number} page\n */\n goToPage(page) {\n const maxPage = Math.ceil(this._filteredData.length / this.pageSize) || 1;\n this._currentPage = Math.max(1, Math.min(page, maxPage));\n this.render();\n\n this.emit('mu-page-change', this.getPageInfo(), { bubbles: true });\n }\n\n /**\n * Sort by field\n * @param {string} field\n * @param {'asc'|'desc'} [direction]\n */\n sortBy(field, direction) {\n if (this._sortField === field && !direction) {\n this._sortDirection = this._sortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n this._sortField = field;\n this._sortDirection = direction || 'asc';\n }\n this._applySort();\n this.render();\n\n this.emit('mu-sort-change', this.getSortState(), { bubbles: true });\n }\n\n /**\n * Filter data\n * @param {string} query\n */\n filter(query) {\n this._filterValue = query.toLowerCase();\n this._applyFilter();\n this._currentPage = 1;\n this.render(false); // Partial render - preserve search input focus\n }\n\n // === INTERNAL METHODS ===\n\n _applySort() {\n if (!this._sortField) return;\n\n this._filteredData.sort((a, b) => {\n const valA = a[this._sortField] ?? '';\n const valB = b[this._sortField] ?? '';\n\n // Handle different types\n if (typeof valA === 'number' && typeof valB === 'number') {\n return this._sortDirection === 'asc' ? valA - valB : valB - valA;\n }\n\n const strA = String(valA).toLowerCase();\n const strB = String(valB).toLowerCase();\n const result = strA.localeCompare(strB);\n return this._sortDirection === 'asc' ? result : -result;\n });\n }\n\n _applyFilter() {\n if (!this._filterValue) {\n this._filteredData = [...this._data];\n return;\n }\n\n const filterableColumns = this.columns.filter(c => c.filterable !== false);\n const fields = filterableColumns.length > 0\n ? filterableColumns.map(c => c.field)\n : this.columns.map(c => c.field);\n\n this._filteredData = this._data.filter(row => {\n return fields.some(field => {\n const value = String(row[field] ?? '').toLowerCase();\n return value.includes(this._filterValue);\n });\n });\n }\n\n _getPageData() {\n const start = (this._currentPage - 1) * this.pageSize;\n const end = start + this.pageSize;\n return this._filteredData.slice(start, end);\n }\n\n _handleHeaderClick(field) {\n const column = this.columns.find(c => c.field === field);\n if (column?.sortable !== false && this.sortable) {\n this.sortBy(field);\n }\n }\n\n _handleRowSelect(index, checked) {\n const actualIndex = (this._currentPage - 1) * this.pageSize + index;\n if (checked) {\n this._selectedRows.add(actualIndex);\n } else {\n this._selectedRows.delete(actualIndex);\n }\n this.render();\n\n this.emit('mu-selection-change', { selected: this.getSelectedRows() }, { bubbles: true });\n }\n\n _handleSelectAll(checked) {\n const pageData = this._getPageData();\n const startIdx = (this._currentPage - 1) * this.pageSize;\n\n pageData.forEach((_, idx) => {\n if (checked) {\n this._selectedRows.add(startIdx + idx);\n } else {\n this._selectedRows.delete(startIdx + idx);\n }\n });\n\n this.render();\n\n this.emit('mu-selection-change', { selected: this.getSelectedRows() }, { bubbles: true });\n }\n\n render(fullRender = true) {\n const columns = this.columns;\n const pageData = this._getPageData();\n const { page, totalPages, totalRows } = this.getPageInfo();\n const startIdx = (this._currentPage - 1) * this.pageSize;\n\n // Check if all current page items are selected\n const allSelected = pageData.length > 0 &&\n pageData.every((_, idx) => this._selectedRows.has(startIdx + idx));\n\n // Surgical update: only update tbody and info if already rendered\n const existingTbody = this.querySelector('.mu-datatable-table tbody');\n const existingInfo = this.querySelector('.mu-datatable-info');\n const existingPagination = this.querySelector('.mu-datatable-pagination');\n\n if (!fullRender && existingTbody) {\n // Update only the parts that changed\n existingTbody.innerHTML = this._renderTbody(pageData, columns, startIdx, allSelected);\n\n if (existingInfo) {\n existingInfo.innerHTML = `${totalRows} row${totalRows !== 1 ? 's' : ''}${this._selectedRows.size > 0 ? ` · ${this._selectedRows.size} selected` : ''}`;\n }\n\n if (existingPagination) {\n existingPagination.innerHTML = this._renderPaginationContent(page, totalPages, totalRows);\n } else if (totalPages > 1) {\n // Need to add pagination\n const wrapper = this.querySelector('.mu-datatable-wrapper');\n if (wrapper) {\n wrapper.insertAdjacentHTML('beforeend', this._renderPagination(page, totalPages, totalRows));\n }\n }\n\n this._attachEventListeners();\n return;\n }\n\n // Full render\n this.innerHTML = `\n <div class=\"mu-datatable-wrapper\">\n ${this.filterable ? `\n <div class=\"mu-datatable-toolbar\">\n <div class=\"mu-datatable-search\">\n <input \n type=\"search\" \n placeholder=\"Search...\" \n value=\"${escapeHTML(this._filterValue)}\"\n >\n </div>\n <div class=\"mu-datatable-info\">\n ${totalRows} row${totalRows !== 1 ? 's' : ''}\n ${this._selectedRows.size > 0 ? ` · ${this._selectedRows.size} selected` : ''}\n </div>\n </div>\n ` : ''}\n\n <table class=\"mu-datatable-table\">\n <thead>\n <tr>\n ${this.selectable ? `\n <th class=\"mu-datatable-checkbox-cell\">\n <input \n type=\"checkbox\" \n ${allSelected ? 'checked' : ''}\n data-select-all\n >\n </th>\n ` : ''}\n ${columns.map(col => {\n const isSortable = col.sortable !== false && this.sortable;\n const isSorted = this._sortField === col.field;\n const sortIcon = isSorted\n ? (this._sortDirection === 'asc' ? '↑' : '↓')\n : '↕';\n return `\n <th \n class=\"${isSortable ? 'mu-datatable-sortable' : ''} ${isSorted ? 'mu-datatable-sorted' : ''}\"\n data-field=\"${escapeHTML(col.field)}\"\n >\n ${escapeHTML(col.label || col.field)}\n ${isSortable ? `<span class=\"mu-datatable-sort-icon\">${sortIcon}</span>` : ''}\n </th>\n `;\n }).join('')}\n </tr>\n </thead>\n <tbody>\n ${this._renderTbody(pageData, columns, startIdx, allSelected)}\n </tbody>\n </table>\n\n ${this._renderPagination(page, totalPages, totalRows)}\n </div>\n `;\n\n this._attachEventListeners();\n }\n\n _renderTbody(pageData, columns, startIdx, allSelected) {\n if (pageData.length === 0) {\n return `\n <tr>\n <td colspan=\"${columns.length + (this.selectable ? 1 : 0)}\" class=\"mu-datatable-empty-state\">\n ${escapeHTML(this.emptyMessage)}\n </td>\n </tr>\n `;\n }\n\n return pageData.map((row, idx) => {\n const actualIdx = startIdx + idx;\n const isSelected = this._selectedRows.has(actualIdx);\n\n return `\n <tr class=\"${isSelected ? 'mu-datatable-selected' : ''}\" data-row-index=\"${idx}\">\n ${this.selectable ? `\n <td class=\"mu-datatable-checkbox-cell\">\n <input \n type=\"checkbox\" \n ${isSelected ? 'checked' : ''}\n data-row-select=\"${idx}\"\n >\n </td>\n ` : ''}\n ${columns.map(col => `\n <td data-field=\"${escapeHTML(col.field)}\">\n ${col.render ? col.render(row[col.field], row) : escapeHTML(row[col.field] ?? '')}\n </td>\n `).join('')}\n </tr>\n `;\n }).join('');\n }\n\n _renderPagination(page, totalPages, totalRows) {\n if (totalPages <= 1) return '';\n return `\n <div class=\"mu-datatable-pagination\">\n ${this._renderPaginationContent(page, totalPages, totalRows)}\n </div>\n `;\n }\n\n _renderPaginationContent(page, totalPages, totalRows) {\n return `\n <div class=\"mu-datatable-pagination-info\">\n Showing ${(page - 1) * this.pageSize + 1}–${Math.min(page * this.pageSize, totalRows)} of ${totalRows}\n </div>\n <div class=\"mu-datatable-pagination-controls\">\n <button class=\"mu-datatable-pagination-btn\" data-page=\"prev\" ${page <= 1 ? 'disabled' : ''}>\n ←\n </button>\n ${this._getPaginationButtons(page, totalPages)}\n <button class=\"mu-datatable-pagination-btn\" data-page=\"next\" ${page >= totalPages ? 'disabled' : ''}>\n →\n </button>\n </div>\n `;\n }\n\n _getPaginationButtons(current, total) {\n const buttons = [];\n const maxButtons = 5;\n\n let start = Math.max(1, current - Math.floor(maxButtons / 2));\n let end = Math.min(total, start + maxButtons - 1);\n\n if (end - start < maxButtons - 1) {\n start = Math.max(1, end - maxButtons + 1);\n }\n\n for (let i = start; i <= end; i++) {\n buttons.push(`\n <button \n class=\"mu-datatable-pagination-btn ${i === current ? 'mu-datatable-pagination-btn-active' : ''}\"\n data-page=\"${i}\"\n >\n ${i}\n </button>\n `);\n }\n\n return buttons.join('');\n }\n\n _attachEventListeners() {\n // Header click for sorting\n this.querySelectorAll('th.mu-datatable-sortable').forEach(th => {\n this.listen(th, 'click', () => {\n this._handleHeaderClick(th.dataset.field);\n });\n });\n\n // Pagination\n this.querySelectorAll('.mu-datatable-pagination-btn[data-page]').forEach(btn => {\n this.listen(btn, 'click', () => {\n const page = btn.dataset.page;\n if (page === 'prev') {\n this.goToPage(this._currentPage - 1);\n } else if (page === 'next') {\n this.goToPage(this._currentPage + 1);\n } else {\n this.goToPage(parseInt(page));\n }\n });\n });\n\n // Row selection\n this.querySelectorAll('[data-row-select]').forEach(cb => {\n this.listen(cb, 'change', (e) => {\n this._handleRowSelect(parseInt(cb.dataset.rowSelect), e.target.checked);\n });\n });\n\n // Select all\n const selectAll = this.querySelector('[data-select-all]');\n if (selectAll) {\n this.listen(selectAll, 'change', (e) => {\n this._handleSelectAll(e.target.checked);\n });\n }\n\n // Search/filter\n const searchInput = this.querySelector('.mu-datatable-search input');\n if (searchInput) {\n const debouncedFilter = debounce((value) => this.filter(value), 300);\n this.listen(searchInput, 'input', (e) => debouncedFilter(e.target.value));\n }\n }\n}\n\nif (!customElements.get('mu-datatable')) {\n customElements.define('mu-datatable', MuDataTable);\n}\n",
67
+ "/**\n * mu-schema-form.js - Auto-Generated Forms from JSON Schema\n * \n * AI-First form component that generates microUI form fields automatically\n * from a JSON Schema definition. Dramatically reduces boilerplate for form creation.\n * \n * @example\n * <mu-schema-form id=\"user-form\"></mu-schema-form>\n * \n * <script>\n * const form = document.getElementById('user-form');\n * form.schema = {\n * type: 'object',\n * properties: {\n * name: { type: 'string', title: 'Full Name', minLength: 2 },\n * email: { type: 'string', format: 'email', title: 'Email' },\n * role: { type: 'string', enum: ['user', 'admin'], title: 'Role' },\n * active: { type: 'boolean', title: 'Active', default: true }\n * },\n * required: ['name', 'email']\n * };\n * \n * form.addEventListener('mu-submit', (e) => {\n * console.log('Form data:', e.detail);\n * });\n * </script>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { escapeHTML } from '../core/utils.js';\n\nexport class MuSchemaForm extends MuElement {\n static get observedAttributes() {\n return ['submit-label', 'reset-label', 'inline', 'readonly', 'disabled'];\n }\n\n static baseClass = 'mu-schema-form';\n static cssFile = 'schema-form';\n\n constructor() {\n super();\n\n this._schema = null;\n this._values = {};\n this._errors = {};\n this._touched = {};\n }\n\n // === PROPERTIES ===\n\n get schema() {\n return this._schema;\n }\n\n set schema(value) {\n this._schema = value;\n this._initializeValues();\n if (this.isConnected) this.render();\n }\n\n get submitLabel() {\n return this.getAttribute('submit-label') || 'Submit';\n }\n\n get resetLabel() {\n return this.getAttribute('reset-label') || 'Reset';\n }\n\n get inline() {\n return this.hasAttribute('inline');\n }\n\n get readonly() {\n return this.hasAttribute('readonly');\n }\n\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n // === LIFECYCLE ===\n\n connectedCallback() {\n super.connectedCallback();\n this.render();\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (this.isConnected && oldVal !== newVal) {\n this.render();\n }\n }\n\n // === PUBLIC API ===\n\n /**\n * Get current form values\n * @returns {Object}\n */\n getValues() {\n return { ...this._values };\n }\n\n /**\n * Set form values\n * @param {Object} values\n */\n setValues(values) {\n this._values = { ...this._values, ...values };\n this.render();\n }\n\n /**\n * Validate all fields\n * @returns {boolean} True if valid\n */\n validate() {\n if (!this._schema || !this._schema.properties) return true;\n\n this._errors = {};\n const required = this._schema.required || [];\n\n for (const [field, def] of Object.entries(this._schema.properties)) {\n const value = this._values[field];\n const errors = this._validateField(field, value, def, required.includes(field));\n if (errors.length > 0) {\n this._errors[field] = errors;\n }\n }\n\n this.render();\n return Object.keys(this._errors).length === 0;\n }\n\n /**\n * Get validation errors\n * @returns {Object}\n */\n getErrors() {\n return { ...this._errors };\n }\n\n /**\n * Reset form to default values\n */\n reset() {\n this._initializeValues();\n this._errors = {};\n this._touched = {};\n this.render();\n\n this.emit('mu-reset', { values: this.getValues() }, { bubbles: true });\n }\n\n /**\n * Submit the form programmatically\n */\n submit() {\n if (this.validate()) {\n this.emit('mu-submit', this.getValues(), { bubbles: true });\n }\n }\n\n // === INTERNAL METHODS ===\n\n _initializeValues() {\n this._values = {};\n if (!this._schema || !this._schema.properties) return;\n\n for (const [field, def] of Object.entries(this._schema.properties)) {\n if (def.default !== undefined) {\n this._values[field] = def.default;\n } else if (def.type === 'boolean') {\n this._values[field] = false;\n } else if (def.type === 'number' || def.type === 'integer') {\n this._values[field] = null;\n } else {\n this._values[field] = '';\n }\n }\n }\n\n _validateField(field, value, def, isRequired) {\n const errors = [];\n\n // Required check\n if (isRequired && (value === '' || value === null || value === undefined)) {\n errors.push(`${def.title || field} is required`);\n return errors;\n }\n\n if (value === '' || value === null || value === undefined) return errors;\n\n // Type-specific validation\n if (def.type === 'string') {\n if (def.minLength && value.length < def.minLength) {\n errors.push(`Minimum ${def.minLength} characters`);\n }\n if (def.maxLength && value.length > def.maxLength) {\n errors.push(`Maximum ${def.maxLength} characters`);\n }\n if (def.pattern && !new RegExp(def.pattern).test(value)) {\n errors.push(def.patternError || 'Invalid format');\n }\n if (def.format === 'email' && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n errors.push('Invalid email address');\n }\n if (def.format === 'url' && !/^https?:\\/\\/.+/.test(value)) {\n errors.push('Invalid URL');\n }\n }\n\n if (def.type === 'number' || def.type === 'integer') {\n const num = Number(value);\n if (isNaN(num)) {\n errors.push('Must be a number');\n } else {\n if (def.minimum !== undefined && num < def.minimum) {\n errors.push(`Minimum value is ${def.minimum}`);\n }\n if (def.maximum !== undefined && num > def.maximum) {\n errors.push(`Maximum value is ${def.maximum}`);\n }\n }\n }\n\n return errors;\n }\n\n _getInputType(def) {\n if (def.format === 'email') return 'email';\n if (def.format === 'password') return 'password';\n if (def.format === 'date') return 'date';\n if (def.format === 'time') return 'time';\n if (def.format === 'datetime-local') return 'datetime-local';\n if (def.format === 'url') return 'url';\n if (def.format === 'tel') return 'tel';\n if (def.type === 'number' || def.type === 'integer') return 'number';\n return 'text';\n }\n\n _renderField(field, def, isRequired) {\n const rawValue = this._values[field] ?? '';\n const errors = this._errors[field] || [];\n const hasError = errors.length > 0;\n\n // XSS Protection: escape all schema-derived content\n const safeField = escapeHTML(field);\n const safeLabel = escapeHTML(def.title || field);\n const safePlaceholder = escapeHTML(def.placeholder || '');\n const safeDescription = escapeHTML(def.description || '');\n const safeValue = escapeHTML(String(rawValue));\n const safeError = hasError ? escapeHTML(errors[0]) : '';\n const disabled = this.disabled || def.readOnly;\n const readonly = this.readonly;\n\n // Boolean → Switch\n if (def.type === 'boolean') {\n return `\n <div class=\"mu-schema-form-field\" data-field=\"${safeField}\">\n <div class=\"mu-schema-form-switch-row\">\n <mu-switch \n ${rawValue ? 'checked' : ''}\n ${disabled ? 'disabled' : ''}\n data-field=\"${safeField}\"\n ></mu-switch>\n <label class=\"mu-schema-form-switch-label\">${safeLabel}</label>\n </div>\n ${safeDescription ? `<div class=\"mu-schema-form-description\">${safeDescription}</div>` : ''}\n </div>\n `;\n }\n\n // Enum → Dropdown\n if (def.enum) {\n const options = def.enum.map((val, i) => {\n const safeOptValue = escapeHTML(String(val));\n const safeOptLabel = escapeHTML(def.enumLabels?.[i] || String(val));\n return `<mu-option value=\"${safeOptValue}\" ${rawValue === val ? 'selected' : ''}>${safeOptLabel}</mu-option>`;\n }).join('');\n\n return `\n <div class=\"mu-schema-form-field ${hasError ? 'mu-schema-form-field-error' : ''}\" data-field=\"${safeField}\">\n <mu-dropdown \n label=\"${safeLabel}${isRequired ? ' *' : ''}\"\n value=\"${safeValue}\"\n ${disabled ? 'disabled' : ''}\n ${isRequired ? 'required' : ''}\n data-field=\"${safeField}\"\n >\n ${options}\n </mu-dropdown>\n ${safeDescription ? `<div class=\"mu-schema-form-description\">${safeDescription}</div>` : ''}\n ${hasError ? `<div class=\"mu-schema-form-error\">${safeError}</div>` : ''}\n </div>\n `;\n }\n\n // Multiline string → Textarea\n if (def.type === 'string' && def.multiline) {\n return `\n <div class=\"mu-schema-form-field ${hasError ? 'mu-schema-form-field-error' : ''}\" data-field=\"${safeField}\">\n <mu-textarea\n label=\"${safeLabel}${isRequired ? ' *' : ''}\"\n placeholder=\"${safePlaceholder}\"\n ${disabled ? 'disabled' : ''}\n ${readonly ? 'readonly' : ''}\n ${isRequired ? 'required' : ''}\n data-field=\"${safeField}\"\n >${safeValue}</mu-textarea>\n ${safeDescription ? `<div class=\"mu-schema-form-description\">${safeDescription}</div>` : ''}\n ${hasError ? `<div class=\"mu-schema-form-error\">${safeError}</div>` : ''}\n </div>\n `;\n }\n\n // Default → Input\n const inputType = this._getInputType(def);\n return `\n <div class=\"mu-schema-form-field ${hasError ? 'mu-schema-form-field-error' : ''}\" data-field=\"${safeField}\">\n <mu-input\n type=\"${inputType}\"\n label=\"${safeLabel}${isRequired ? ' *' : ''}\"\n placeholder=\"${safePlaceholder}\"\n value=\"${safeValue}\"\n ${disabled ? 'disabled' : ''}\n ${readonly ? 'readonly' : ''}\n ${isRequired ? 'required' : ''}\n ${def.minimum !== undefined ? `min=\"${def.minimum}\"` : ''}\n ${def.maximum !== undefined ? `max=\"${def.maximum}\"` : ''}\n ${def.minLength ? `minlength=\"${def.minLength}\"` : ''}\n ${def.maxLength ? `maxlength=\"${def.maxLength}\"` : ''}\n data-field=\"${safeField}\"\n ></mu-input>\n ${safeDescription ? `<div class=\"mu-schema-form-description\">${safeDescription}</div>` : ''}\n ${hasError ? `<div class=\"mu-schema-form-error\">${safeError}</div>` : ''}\n </div>\n `;\n }\n\n render() {\n if (!this._schema || !this._schema.properties) {\n this.innerHTML = `\n <div class=\"mu-schema-form-empty-state\">\n Set the <code>schema</code> property to generate a form\n </div>\n `;\n return;\n }\n\n const required = this._schema.required || [];\n const fields = Object.entries(this._schema.properties)\n .map(([field, def]) => this._renderField(field, def, required.includes(field)))\n .join('');\n\n this.innerHTML = `\n <div class=\"mu-schema-form ${this.inline ? 'mu-schema-form-inline' : ''}\">\n ${fields}\n \n <div class=\"mu-schema-form-actions\">\n <mu-button variant=\"filled\" data-action=\"submit\" ${this.disabled ? 'disabled' : ''}>\n ${this.submitLabel}\n </mu-button>\n <mu-button variant=\"text\" data-action=\"reset\" ${this.disabled ? 'disabled' : ''}>\n ${this.resetLabel}\n </mu-button>\n </div>\n </div>\n `;\n\n this._attachEventListeners();\n }\n\n _attachEventListeners() {\n // Input changes\n this.querySelectorAll('mu-input').forEach(input => {\n this.listen(input, 'mu-input', (e) => {\n const field = input.dataset.field;\n this._values[field] = e.detail.value;\n this._touched[field] = true;\n\n // Clear error on edit\n if (this._errors[field]) {\n delete this._errors[field];\n input.closest('.mu-schema-form-field').classList.remove('mu-schema-form-field-error');\n input.closest('.mu-schema-form-field').querySelector('.mu-schema-form-error')?.remove();\n }\n\n this.emit('mu-change', { field, value: e.detail.value, values: this.getValues() }, { bubbles: true });\n });\n });\n\n // Textarea changes\n this.querySelectorAll('mu-textarea').forEach(textarea => {\n this.listen(textarea, 'mu-input', (e) => {\n const field = textarea.dataset.field;\n this._values[field] = e.detail.value;\n this._touched[field] = true;\n\n this.emit('mu-change', { field, value: e.detail.value, values: this.getValues() }, { bubbles: true });\n });\n });\n\n // Dropdown changes\n this.querySelectorAll('mu-dropdown').forEach(dropdown => {\n this.listen(dropdown, 'mu-change', (e) => {\n const field = dropdown.dataset.field;\n this._values[field] = e.detail.value;\n this._touched[field] = true;\n\n this.emit('mu-change', { field, value: e.detail.value, values: this.getValues() }, { bubbles: true });\n });\n });\n\n // Switch changes\n this.querySelectorAll('mu-switch').forEach(sw => {\n this.listen(sw, 'mu-change', (e) => {\n const field = sw.dataset.field;\n this._values[field] = e.detail.checked;\n this._touched[field] = true;\n\n this.emit('mu-change', { field, value: e.detail.checked, values: this.getValues() }, { bubbles: true });\n });\n });\n }\n\n /**\n * Handle actions from MuElement's centralized event delegation\n */\n handleAction(action, target, event) {\n if (action === 'submit') {\n this.submit();\n } else if (action === 'reset') {\n this.reset();\n }\n }\n}\n\nif (!customElements.get('mu-schema-form')) {\n customElements.define('mu-schema-form', MuSchemaForm);\n}\n",
68
+ "/**\n * mu-prompt-ui.js - AI Agent Prompt UI Components\n * \n * Specialized components for AI agent interfaces:\n * - mu-prompt-input: Enhanced text input with submit button and loading states\n * - mu-code-block: Syntax-highlighted code display with copy button\n * - mu-agent-toolbar: Action buttons for AI responses (copy, regenerate, etc.)\n * - mu-message-bubble: Chat message bubbles with role-based styling\n * \n * @example\n * <mu-prompt-input placeholder=\"Ask anything...\" loading></mu-prompt-input>\n * \n * <mu-message-bubble role=\"user\">\n * How do I sort an array?\n * </mu-message-bubble>\n * \n * <mu-message-bubble role=\"assistant\">\n * Here's how to sort an array:\n * <mu-code-block language=\"javascript\">\n * const sorted = array.sort((a, b) => a - b);\n * </mu-code-block>\n * <mu-agent-toolbar></mu-agent-toolbar>\n * </mu-message-bubble>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { escapeHTML } from '../core/utils.js';\n\n// ============================================\n// MU-PROMPT-INPUT\n// ============================================\nexport class MuPromptInput extends MuElement {\n static get observedAttributes() {\n return ['placeholder', 'loading', 'disabled', 'multiline'];\n }\n\n static baseClass = 'mu-prompt-input';\n static cssFile = 'prompt-ui';\n\n constructor() {\n super();\n this._value = '';\n }\n\n get placeholder() {\n return this.getAttribute('placeholder') || 'Type a message...';\n }\n\n get loading() {\n return this.hasAttribute('loading');\n }\n\n set loading(val) {\n if (val) this.setAttribute('loading', '');\n else this.removeAttribute('loading');\n }\n\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n get multiline() {\n return this.hasAttribute('multiline');\n }\n\n get value() {\n return this._value;\n }\n\n set value(val) {\n this._value = val;\n const input = this.querySelector('.mu-prompt-input-field');\n if (input) input.value = val;\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.render();\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (this.isConnected && oldVal !== newVal) {\n this.render();\n }\n }\n\n _submit() {\n if (this.loading || this.disabled || !this._value.trim()) return;\n\n this.dispatchEvent(new CustomEvent('mu-submit', {\n bubbles: true,\n detail: { value: this._value.trim() }\n }));\n }\n\n _handleKeydown(e) {\n if (e.key === 'Enter' && !e.shiftKey && !this.multiline) {\n e.preventDefault();\n this._submit();\n } else if (e.key === 'Enter' && e.metaKey) {\n e.preventDefault();\n this._submit();\n }\n }\n\n render() {\n const isTextarea = this.multiline;\n\n this.innerHTML = `\n <div class=\"mu-prompt-input-container ${this.loading ? 'mu-prompt-input-loading' : ''}\">\n ${isTextarea\n ? `<textarea class=\"mu-prompt-input-field\" placeholder=\"${this.placeholder}\" ${this.disabled ? 'disabled' : ''}></textarea>`\n : `<input class=\"mu-prompt-input-field\" type=\"text\" placeholder=\"${this.placeholder}\" ${this.disabled ? 'disabled' : ''} />`\n }\n <button class=\"mu-prompt-input-submit\" ${this.disabled || this.loading ? 'disabled' : ''}>\n ${this.loading\n ? '<div class=\"mu-prompt-input-spinner\"></div>'\n : '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\"/></svg>'\n }\n </button>\n </div>\n `;\n\n const input = this.querySelector('.mu-prompt-input-field');\n const submitBtn = this.querySelector('.mu-prompt-input-submit');\n\n input.value = this._value;\n this.listen(input, 'input', (e) => {\n this._value = e.target.value;\n this.dispatchEvent(new CustomEvent('mu-input', {\n bubbles: true,\n detail: { value: this._value }\n }));\n });\n this.listen(input, 'keydown', (e) => this._handleKeydown(e));\n this.listen(submitBtn, 'click', () => this._submit());\n }\n}\n\n// ============================================\n// MU-CODE-BLOCK\n// ============================================\nexport class MuCodeBlock extends MuElement {\n static get observedAttributes() {\n return ['language', 'filename'];\n }\n\n static baseClass = 'mu-code-block';\n\n constructor() {\n super();\n }\n\n get language() {\n return this.getAttribute('language') || 'text';\n }\n\n get filename() {\n return this.getAttribute('filename');\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.render();\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (this.isConnected && oldVal !== newVal) {\n this.render();\n }\n }\n\n async _copy() {\n const code = this.textContent.trim();\n try {\n await navigator.clipboard.writeText(code);\n const btn = this.querySelector('.mu-code-block-copy-btn');\n btn.textContent = '✓ Copied';\n this.setTimeout(() => {\n btn.textContent = 'Copy';\n }, 2000);\n } catch (e) {\n console.error('Failed to copy:', e);\n }\n }\n\n render() {\n const code = this.textContent.trim();\n\n this.innerHTML = `\n <div class=\"mu-code-block-container\">\n <div class=\"mu-code-block-header\">\n ${this.filename\n ? `<span class=\"mu-code-block-filename\">${this.filename}</span>`\n : `<span class=\"mu-code-block-language\">${this.language}</span>`\n }\n <button class=\"mu-code-block-copy-btn\">Copy</button>\n </div>\n <pre class=\"mu-code-block-pre\"><code>${escapeHTML(code)}</code></pre>\n </div>\n `;\n\n this.listen(this.querySelector('.mu-code-block-copy-btn'), 'click', () => this._copy());\n }\n\n // Using centralized escapeHTML from core/utils.js for XSS safety\n}\n\n// ============================================\n// MU-AGENT-TOOLBAR\n// ============================================\nexport class MuAgentToolbar extends MuElement {\n static get observedAttributes() {\n return ['actions'];\n }\n\n static baseClass = 'mu-agent-toolbar';\n\n constructor() {\n super();\n }\n\n get actions() {\n const attr = this.getAttribute('actions');\n return attr ? attr.split(',').map(a => a.trim()) : ['copy', 'regenerate', 'thumbsUp', 'thumbsDown'];\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.render();\n }\n\n\n\n render() {\n const actionButtons = {\n copy: { icon: '📋', label: 'Copy' },\n regenerate: { icon: '🔄', label: 'Regenerate' },\n thumbsUp: { icon: '👍', label: 'Good response' },\n thumbsDown: { icon: '👎', label: 'Poor response' },\n edit: { icon: '✏️', label: 'Edit' },\n share: { icon: '↗️', label: 'Share' }\n };\n\n const buttons = this.actions\n .filter(a => actionButtons[a])\n .map(a => `\n <button class=\"mu-agent-toolbar-btn\" data-action=\"${a}\" title=\"${actionButtons[a].label}\">\n ${actionButtons[a].icon}\n </button>\n `).join('');\n\n this.innerHTML = buttons;\n }\n\n /**\n * Handle actions from MuElement's centralized event delegation\n */\n handleAction(action, target, event) {\n this.dispatchEvent(new CustomEvent('mu-action', {\n bubbles: true,\n detail: { action }\n }));\n }\n}\n\n// ============================================\n// MU-MESSAGE-BUBBLE\n// ============================================\nexport class MuMessageBubble extends MuElement {\n static get observedAttributes() {\n return ['role', 'avatar', 'name', 'timestamp'];\n }\n\n static baseClass = 'mu-message-bubble';\n\n constructor() {\n super();\n this._originalContent = null;\n }\n\n get role() {\n return this.getAttribute('role') || 'user';\n }\n\n get avatar() {\n return this.getAttribute('avatar');\n }\n\n get name() {\n return this.getAttribute('name') || (this.role === 'user' ? 'You' : 'Assistant');\n }\n\n get timestamp() {\n return this.getAttribute('timestamp');\n }\n\n connectedCallback() {\n super.connectedCallback();\n // Capture original children before render\n if (!this._originalContent) {\n this._originalContent = Array.from(this.childNodes);\n }\n this.render();\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (this.isConnected && oldVal !== newVal) {\n this.render();\n }\n }\n\n render() {\n const isUser = this.role === 'user';\n const defaultAvatar = isUser ? '👤' : '🤖';\n const roleClass = isUser ? 'mu-message-bubble-user' : 'mu-message-bubble-assistant';\n\n // Create structure\n const message = document.createElement('div');\n message.className = `mu-message-bubble-message ${roleClass}`;\n\n // Avatar\n const avatar = document.createElement('div');\n avatar.className = `mu-message-bubble-avatar ${roleClass}`;\n if (this.avatar) {\n const img = document.createElement('img');\n img.src = this.avatar;\n img.alt = this.name;\n avatar.appendChild(img);\n } else {\n avatar.textContent = defaultAvatar;\n }\n message.appendChild(avatar);\n\n // Content wrapper\n const content = document.createElement('div');\n content.className = 'mu-message-bubble-content';\n\n // Header\n const header = document.createElement('div');\n header.className = `mu-message-bubble-header ${roleClass}`;\n const nameSpan = document.createElement('span');\n nameSpan.className = 'mu-message-bubble-name';\n nameSpan.textContent = this.name;\n header.appendChild(nameSpan);\n if (this.timestamp) {\n const timestampSpan = document.createElement('span');\n timestampSpan.className = 'mu-message-bubble-timestamp';\n timestampSpan.textContent = this.timestamp;\n header.appendChild(timestampSpan);\n }\n content.appendChild(header);\n\n // Bubble with original content\n const bubble = document.createElement('div');\n bubble.className = `mu-message-bubble-bubble ${roleClass}`;\n if (this._originalContent) {\n this._originalContent.forEach(child => bubble.appendChild(child.cloneNode(true)));\n }\n content.appendChild(bubble);\n\n message.appendChild(content);\n\n // Set HTML\n this.innerHTML = '';\n this.appendChild(message);\n }\n}\n\n// Register all components\nif (!customElements.get('mu-prompt-input')) {\n customElements.define('mu-prompt-input', MuPromptInput);\n}\nif (!customElements.get('mu-code-block')) {\n customElements.define('mu-code-block', MuCodeBlock);\n}\nif (!customElements.get('mu-agent-toolbar')) {\n customElements.define('mu-agent-toolbar', MuAgentToolbar);\n}\nif (!customElements.get('mu-message-bubble')) {\n customElements.define('mu-message-bubble', MuMessageBubble);\n}\n",
69
+ "/**\n * @fileoverview mu-error-boundary - Error Boundary Component\n * \n * Catches rendering errors in child components and displays fallback UI.\n * Critical for large-scale applications where one component error\n * should not crash the entire application.\n * \n * Based on 2024 enterprise error recovery patterns.\n * \n * Usage:\n * <mu-error-boundary fallback=\"<p>Something went wrong</p>\">\n * <mu-complex-widget></mu-complex-widget>\n * </mu-error-boundary>\n * \n * With error handler:\n * <mu-error-boundary onerror=\"customHandler(event.detail)\">\n * <mu-data-table :items=\"${data}\"></mu-data-table>\n * </mu-error-boundary>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\n/**\n * Global error registry for agent observability\n * @type {Array<{timestamp: number, component: string, error: Error, context: Object}>}\n */\nconst errorRegistry = [];\n\n/**\n * Get all caught errors for agent debugging\n * @returns {Array<Object>}\n */\nexport function getErrors() {\n return [...errorRegistry];\n}\n\n/**\n * Clear error registry\n */\nexport function clearErrors() {\n errorRegistry.length = 0;\n}\n\nexport class MuErrorBoundary extends MuElement {\n static baseClass = 'mu-error-boundary';\n static observedAttributes = ['fallback'];\n\n #hasError = false;\n #error = null;\n #originalContent = '';\n\n connectedCallback() {\n super.connectedCallback();\n\n // Store original content for potential recovery\n this.#originalContent = this.innerHTML;\n\n // Listen for errors from child components\n this.listen(this, 'error', this.#handleError.bind(this));\n\n // Also catch unhandled errors from child scripts\n this.#setupGlobalErrorHandler();\n }\n\n #setupGlobalErrorHandler() {\n // Capture errors that occur within this boundary\n const originalHandler = window.onerror;\n\n window.onerror = (message, source, lineno, colno, error) => {\n // Check if error originated from within this boundary\n if (this.#isErrorFromChild(error)) {\n this.#handleError({ detail: { error, message } });\n return true; // Prevent propagation\n }\n\n // Call original handler if exists\n if (originalHandler) {\n return originalHandler(message, source, lineno, colno, error);\n }\n return false;\n };\n }\n\n #isErrorFromChild(error) {\n // Best-effort check if error is from child component\n if (!error?.stack) return false;\n\n const childTags = Array.from(this.querySelectorAll('*'))\n .filter(el => el.tagName.startsWith('MU-'))\n .map(el => el.tagName.toLowerCase());\n\n return childTags.some(tag => error.stack.includes(tag));\n }\n\n #handleError(event) {\n const error = event?.detail?.error || event?.error || event;\n\n if (this.#hasError) return; // Already showing fallback\n\n this.#hasError = true;\n this.#error = error;\n\n // Register error for agent observability\n errorRegistry.push({\n timestamp: Date.now(),\n component: this.id || 'mu-error-boundary',\n error: {\n message: error?.message || String(error),\n stack: error?.stack,\n name: error?.name\n },\n context: {\n originalContent: this.#originalContent.slice(0, 200),\n parentUrl: window.location.href\n }\n });\n\n // Keep only last 50 errors\n if (errorRegistry.length > 50) {\n errorRegistry.shift();\n }\n\n // Show fallback UI\n this.#renderFallback();\n\n // Emit event for custom handling\n this.emit('mu-error', {\n error,\n boundary: this,\n recover: () => this.recover()\n });\n\n // Prevent event propagation\n event?.stopPropagation?.();\n }\n\n #renderFallback() {\n const fallback = this.getAttribute('fallback');\n\n if (fallback) {\n this.innerHTML = fallback;\n } else {\n // Default fallback UI\n this.innerHTML = `\n <div class=\"mu-error-boundary__fallback\" role=\"alert\" aria-live=\"polite\">\n <mu-icon name=\"error\" style=\"--mu-icon-size: 48px; color: var(--md-sys-color-error);\"></mu-icon>\n <p class=\"mu-error-boundary__title\">Something went wrong</p>\n <p class=\"mu-error-boundary__message\">${this.#error?.message || 'An unexpected error occurred'}</p>\n <mu-button variant=\"outlined\" onclick=\"this.closest('mu-error-boundary').recover()\">\n Try Again\n </mu-button>\n </div>\n `;\n }\n\n this.classList.add('has-error');\n }\n\n render() {\n // Apply base styles\n this.style.display = 'block';\n }\n\n /**\n * Attempt to recover by restoring original content\n */\n recover() {\n this.#hasError = false;\n this.#error = null;\n this.classList.remove('has-error');\n this.innerHTML = this.#originalContent;\n\n this.emit('mu-recover');\n }\n\n /**\n * Check if boundary is currently showing error\n */\n get hasError() {\n return this.#hasError;\n }\n\n /**\n * Get the current error\n */\n get error() {\n return this.#error;\n }\n}\n\ndefine('mu-error-boundary', MuErrorBoundary);\n",
70
+ "/**\n * @fileoverview mu-code - Code Block Component with Syntax Highlighting\n * \n * Usage: <mu-code language=\"html\">...</mu-code>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuCode extends MuElement {\n static baseClass = 'mu-code';\n static observedAttributes = ['language'];\n\n #originalCode = null;\n\n connectedCallback() {\n super.connectedCallback();\n // Store original code before render\n if (!this.#originalCode && !this.querySelector('.mu-code__content')) {\n this.#originalCode = this.textContent;\n }\n }\n\n render() {\n // Idempotent: skip if already rendered\n if (this.querySelector('.mu-code__content')) {\n return;\n }\n\n const language = this.attr('language', 'html');\n\n // Get raw code - use innerHTML to preserve any pre-escaped entities\n // textContent would decode &lt; to < which we don't want\n const rawCode = this.#originalCode || this.innerHTML;\n\n // First decode any HTML entities that might already be in the content\n // This handles cases where the HTML source uses &lt; &gt; etc.\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = rawCode;\n const decodedCode = tempDiv.textContent;\n\n // Dedent: remove common leading whitespace from all lines\n const dedentedCode = this.#dedent(decodedCode);\n\n // Auto-indent: apply proper code formatting based on language\n const formattedCode = this.#autoIndent(dedentedCode, language);\n\n // Store formatted version for copy button\n const copyableCode = formattedCode;\n\n // Now escape for display - only &, <, > need escaping for code\n // Do NOT escape quotes as they are safe inside <code> elements\n const escaped = formattedCode\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n\n // Basic syntax highlighting\n const highlighted = this.#highlight(escaped, language);\n\n this.innerHTML = `\n <div class=\"mu-code__header\">\n <span class=\"mu-code__language\">${language.toUpperCase()}</span>\n <button class=\"mu-code__copy\" title=\"Copy code\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"/>\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\"/>\n </svg>\n </button>\n </div>\n <pre class=\"mu-code__pre\"><code class=\"mu-code__content\">${highlighted}</code></pre>\n `;\n\n this.#applyStyles();\n this.#setupCopyButton(copyableCode);\n }\n\n #highlight(code, language) {\n // Shared marker helper to avoid regex self-matching\n // IMPORTANT: Uses Unicode Private Use Area characters + letters to avoid\n // collision with number regex which matches \\b\\d+\\b\n const createHighlighter = () => {\n const markers = [];\n let markerIndex = 0;\n\n const addMarker = (content, className) => {\n // Create a truly unique marker that no highlighting regex can match:\n // Encode the index as a single Unicode PUA character (offset by 0xE100)\n // This way there are NO digits or word characters in the marker at all\n const idx = markerIndex++;\n const markerChar = String.fromCharCode(0xE100 + idx);\n const start = String.fromCharCode(0xE000);\n const end = String.fromCharCode(0xE001);\n const marker = start + markerChar + end;\n markers.push({ marker, content, className });\n return marker;\n };\n\n const resolveMarkers = (result) => {\n for (const { marker, content, className } of markers) {\n result = result.replace(marker, `<span class=\"${className}\">${content}</span>`);\n }\n return result;\n };\n\n return { addMarker, resolveMarkers };\n };\n\n // HTML highlighting\n if (language === 'html' || language === 'xml') {\n const { addMarker, resolveMarkers } = createHighlighter();\n let result = code;\n\n // HTML comments: <!-- ... -->\n result = result.replace(/(&lt;!--[\\s\\S]*?--&gt;)/g, (match) =>\n addMarker(match, 'mu-code__comment'));\n\n // DOCTYPE\n result = result.replace(/(&lt;!DOCTYPE[^&]*&gt;)/gi, (match) =>\n addMarker(match, 'mu-code__keyword'));\n\n // Strings (attribute values)\n result = result.replace(/(\"[^\"]*\")/g, (match) =>\n addMarker(match, 'mu-code__string'));\n\n // Attributes (name= pattern)\n result = result.replace(/(\\s)([\\w-]+)(=)/g, (match, space, attr, eq) =>\n `${space}${addMarker(attr, 'mu-code__attr')}${eq}`);\n\n // Tags\n result = result.replace(/(&lt;\\/?)([\\w-]+)/g, (match, bracket, tag) =>\n `${bracket}${addMarker(tag, 'mu-code__tag')}`);\n\n return resolveMarkers(result);\n }\n\n // JavaScript highlighting\n if (language === 'javascript' || language === 'js' || language === 'typescript' || language === 'ts') {\n const { addMarker, resolveMarkers } = createHighlighter();\n let result = code;\n\n // Multi-line comments /* ... */\n result = result.replace(/(\\/\\*[\\s\\S]*?\\*\\/)/g, (match) =>\n addMarker(match, 'mu-code__comment'));\n\n // Single-line comments\n result = result.replace(/(\\/\\/.*)/g, (match) =>\n addMarker(match, 'mu-code__comment'));\n\n // Template literals (backticks)\n result = result.replace(/(`[^`]*`)/g, (match) =>\n addMarker(match, 'mu-code__string'));\n\n // Strings\n result = result.replace(/('[^']*'|\"[^\"]*\")/g, (match) =>\n addMarker(match, 'mu-code__string'));\n\n // Numbers (including decimals and scientific notation)\n result = result.replace(/\\b(\\d+\\.?\\d*(?:e[+-]?\\d+)?)\\b/gi, (match) =>\n addMarker(match, 'mu-code__number'));\n\n // Keywords (expanded list)\n result = result.replace(/\\b(const|let|var|function|return|if|else|for|while|do|switch|case|break|continue|class|extends|import|export|from|default|async|await|new|this|super|typeof|instanceof|in|of|try|catch|finally|throw|yield|static|get|set)\\b/g, (match) =>\n addMarker(match, 'mu-code__keyword'));\n\n // Boolean/null/undefined\n result = result.replace(/\\b(true|false|null|undefined|NaN|Infinity)\\b/g, (match) =>\n addMarker(match, 'mu-code__builtin'));\n\n // Function names (word followed by parenthesis)\n result = result.replace(/\\b([a-zA-Z_]\\w*)\\s*(?=\\()/g, (match, name) =>\n addMarker(name, 'mu-code__function'));\n\n return resolveMarkers(result);\n }\n\n // CSS highlighting\n if (language === 'css' || language === 'scss' || language === 'sass') {\n const { addMarker, resolveMarkers } = createHighlighter();\n let result = code;\n\n // Comments\n result = result.replace(/(\\/\\*[\\s\\S]*?\\*\\/)/g, (match) =>\n addMarker(match, 'mu-code__comment'));\n\n // Strings\n result = result.replace(/('[^']*'|\"[^\"]*\")/g, (match) =>\n addMarker(match, 'mu-code__string'));\n\n // At-rules (@media, @keyframes, etc.)\n result = result.replace(/(@[\\w-]+)/g, (match) =>\n addMarker(match, 'mu-code__keyword'));\n\n // Property values with units\n result = result.replace(/\\b(\\d+\\.?\\d*)(px|em|rem|%|vh|vw|s|ms|deg|fr)\\b/g, (match, num, unit) =>\n `${addMarker(num, 'mu-code__number')}${addMarker(unit, 'mu-code__builtin')}`);\n\n // Numbers without units\n result = result.replace(/\\b(\\d+\\.?\\d*)\\b/g, (match) =>\n addMarker(match, 'mu-code__number'));\n\n // Hex colors\n result = result.replace(/(#[0-9a-fA-F]{3,8})\\b/g, (match) =>\n addMarker(match, 'mu-code__string'));\n\n // CSS properties (word followed by colon)\n result = result.replace(/\\b([\\w-]+)\\s*:/g, (match, prop) =>\n `${addMarker(prop, 'mu-code__attr')}:`);\n\n // Selectors (. # or element at start of line or after comma/brace)\n result = result.replace(/(^|[{,\\s])([.#]?[\\w-]+)(?=\\s*[{,])/gm, (match, before, selector) =>\n `${before}${addMarker(selector, 'mu-code__tag')}`);\n\n return resolveMarkers(result);\n }\n\n // JSON highlighting\n if (language === 'json') {\n const { addMarker, resolveMarkers } = createHighlighter();\n let result = code;\n\n // Strings (keys will be handled separately)\n result = result.replace(/(\"[^\"]*\")\\s*:/g, (match, key) =>\n `${addMarker(key, 'mu-code__attr')}:`);\n\n // String values\n result = result.replace(/:\\s*(\"[^\"]*\")/g, (match, val) =>\n `: ${addMarker(val, 'mu-code__string')}`);\n\n // Numbers\n result = result.replace(/:\\s*(-?\\d+\\.?\\d*)/g, (match, num) =>\n `: ${addMarker(num, 'mu-code__number')}`);\n\n // Booleans and null\n result = result.replace(/\\b(true|false|null)\\b/g, (match) =>\n addMarker(match, 'mu-code__builtin'));\n\n return resolveMarkers(result);\n }\n\n // Shell/Bash highlighting\n if (language === 'bash' || language === 'sh' || language === 'shell') {\n const { addMarker, resolveMarkers } = createHighlighter();\n let result = code;\n\n // Comments\n result = result.replace(/(#.*)/g, (match) =>\n addMarker(match, 'mu-code__comment'));\n\n // Strings\n result = result.replace(/('[^']*'|\"[^\"]*\")/g, (match) =>\n addMarker(match, 'mu-code__string'));\n\n // Variables $VAR and ${VAR}\n result = result.replace(/(\\$\\{?\\w+\\}?)/g, (match) =>\n addMarker(match, 'mu-code__attr'));\n\n // Common commands\n result = result.replace(/\\b(cd|ls|echo|cat|grep|find|sudo|npm|npx|bun|node|git|curl|wget|mkdir|rm|cp|mv|chmod|chown)\\b/g, (match) =>\n addMarker(match, 'mu-code__keyword'));\n\n // Flags\n result = result.replace(/(\\s)(--?[\\w-]+)/g, (match, space, flag) =>\n `${space}${addMarker(flag, 'mu-code__builtin')}`);\n\n return resolveMarkers(result);\n }\n\n // No highlighting for unknown languages\n return code;\n }\n\n /**\n * SOTA Dedent - Remove common leading whitespace from all lines\n * Based on TC39 String.dedent proposal and npm 'dedent' package algorithm\n * \n * Algorithm:\n * 1. Split into lines, trim leading/trailing empty lines\n * 2. Find minimum indent across ALL non-empty lines\n * 3. Remove exactly that amount from start of each line\n * \n * This preserves relative indentation within the code.\n */\n #dedent(code) {\n // Split into lines\n let lines = code.split('\\n');\n\n // Remove leading empty lines\n while (lines.length > 0 && lines[0].trim() === '') {\n lines.shift();\n }\n // Remove trailing empty lines\n while (lines.length > 0 && lines[lines.length - 1].trim() === '') {\n lines.pop();\n }\n\n if (lines.length === 0) return '';\n\n // Find minimum indent across ALL non-empty lines\n let minIndent = Infinity;\n for (const line of lines) {\n // Skip empty lines when calculating min indent\n if (line.trim() === '') continue;\n\n const match = line.match(/^(\\s*)/);\n const indent = match ? match[1].length : 0;\n minIndent = Math.min(minIndent, indent);\n }\n\n // If no common indent found, return as-is\n if (minIndent === Infinity || minIndent === 0) {\n return lines.join('\\n');\n }\n\n // Remove exactly minIndent spaces from start of each line\n return lines.map(line => {\n if (line.trim() === '') return ''; // Keep empty lines as empty\n return line.slice(minIndent);\n }).join('\\n');\n }\n\n /**\n * SOTA Auto-Indent - Lightweight bracket-counting code formatter\n * Inspired by js-beautify but minimal (~30 lines vs ~50KB)\n * \n * Supports: JavaScript/JSON ({} blocks), HTML (<> tags), CSS ({} rules)\n * \n * Algorithm:\n * 1. Strip existing indentation (each line trimmed)\n * 2. Track indent level based on opening/closing brackets\n * 3. Apply consistent 4-space indentation\n */\n #autoIndent(code, language) {\n const INDENT = ' '; // 4 spaces\n const lines = code.split('\\n');\n const result = [];\n let indentLevel = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n\n // Skip empty lines\n if (line === '') {\n result.push('');\n continue;\n }\n\n // Calculate bracket changes for this line\n let openBrackets = 0;\n let closeBrackets = 0;\n\n if (language === 'html') {\n // HTML: count opening/closing tags\n // Opening: <tag> or <tag attr>\n // Closing: </tag> or self-closing />\n const openTags = (line.match(/<[a-zA-Z][^>]*(?<!\\/)\\s*>/g) || []).length;\n const closeTags = (line.match(/<\\/[^>]+>/g) || []).length;\n const selfClosing = (line.match(/<[^>]+\\/>/g) || []).length;\n openBrackets = openTags - selfClosing;\n closeBrackets = closeTags;\n } else {\n // JS/CSS/JSON: count { and }\n // Avoid counting brackets inside strings (basic heuristic)\n let inString = false;\n let stringChar = '';\n for (let j = 0; j < line.length; j++) {\n const char = line[j];\n const prev = j > 0 ? line[j - 1] : '';\n\n if ((char === '\"' || char === \"'\" || char === '`') && prev !== '\\\\') {\n if (!inString) {\n inString = true;\n stringChar = char;\n } else if (char === stringChar) {\n inString = false;\n }\n }\n\n if (!inString) {\n if (char === '{' || char === '[' || char === '(') openBrackets++;\n if (char === '}' || char === ']' || char === ')') closeBrackets++;\n }\n }\n }\n\n // Determine if line starts with closing bracket (decrease indent BEFORE this line)\n const startsWithClose = language === 'html'\n ? line.startsWith('</')\n : /^[}\\]\\)]/.test(line);\n\n // Apply closing brackets that start the line BEFORE indenting\n if (startsWithClose && closeBrackets > 0) {\n indentLevel = Math.max(0, indentLevel - 1);\n closeBrackets--; // Already accounted for\n }\n\n // Add the indented line\n result.push(INDENT.repeat(indentLevel) + line);\n\n // Update indent level for next line\n // Net change: opens increase, closes decrease\n indentLevel = Math.max(0, indentLevel + openBrackets - closeBrackets);\n }\n\n return result.join('\\n');\n }\n\n #applyStyles() {\n this.style.display = 'block';\n this.style.background = 'var(--md-sys-color-surface-container-highest)';\n\n // Skip border-radius when embedded in mu-example for seamless integration\n const isEmbedded = this.closest('mu-example');\n if (isEmbedded) {\n // Only top corners flat to align with header, bottom stays rounded\n this.style.borderTopLeftRadius = '0';\n this.style.borderTopRightRadius = '0';\n this.style.borderBottomLeftRadius = 'var(--md-sys-shape-corner-medium)';\n this.style.borderBottomRightRadius = 'var(--md-sys-shape-corner-medium)';\n } else {\n this.style.borderRadius = 'var(--md-sys-shape-corner-medium)';\n }\n\n this.style.overflow = 'hidden';\n this.style.fontFamily = \"'Fira Code', 'Consolas', monospace\";\n this.style.fontSize = '13px';\n\n const header = this.querySelector('.mu-code__header');\n if (header) {\n header.style.display = 'flex';\n header.style.justifyContent = 'space-between';\n header.style.alignItems = 'center';\n header.style.padding = '8px 16px';\n header.style.background = 'var(--md-sys-color-surface-container)';\n header.style.borderBottom = '1px solid var(--md-sys-color-outline-variant)';\n }\n\n const lang = this.querySelector('.mu-code__language');\n if (lang) {\n lang.style.fontSize = '11px';\n lang.style.fontWeight = '600';\n lang.style.color = 'var(--md-sys-color-primary)';\n lang.style.letterSpacing = '0.5px';\n }\n\n const copyBtn = this.querySelector('.mu-code__copy');\n if (copyBtn) {\n copyBtn.style.background = 'transparent';\n copyBtn.style.border = 'none';\n copyBtn.style.cursor = 'pointer';\n copyBtn.style.color = 'var(--md-sys-color-on-surface-variant)';\n copyBtn.style.padding = '4px';\n copyBtn.style.borderRadius = '4px';\n copyBtn.style.display = 'flex';\n copyBtn.style.transition = 'all 0.2s ease';\n }\n\n const pre = this.querySelector('.mu-code__pre');\n if (pre) {\n pre.style.margin = '0';\n pre.style.padding = '16px';\n pre.style.overflow = 'auto';\n pre.style.maxHeight = '400px';\n }\n\n const content = this.querySelector('.mu-code__content');\n if (content) {\n content.style.color = 'var(--md-sys-color-on-surface)';\n }\n\n // Syntax highlighting colors\n const style = document.createElement('style');\n style.textContent = `\n .mu-code__tag { color: var(--md-sys-color-primary); }\n .mu-code__attr { color: var(--md-sys-color-tertiary); }\n .mu-code__string { color: var(--md-sys-color-secondary); }\n .mu-code__keyword { color: var(--md-sys-color-primary); font-weight: 500; }\n .mu-code__comment { color: var(--md-sys-color-outline); font-style: italic; }\n .mu-code__number { color: var(--md-sys-color-error); }\n .mu-code__function { color: var(--md-sys-color-tertiary); }\n .mu-code__builtin { color: var(--md-sys-color-primary); font-weight: 500; }\n .mu-code__copy:hover { \n background: var(--md-sys-color-primary-container) !important;\n color: var(--md-sys-color-on-primary-container) !important;\n }\n .mu-code__copy:active {\n background: var(--md-sys-color-primary) !important;\n color: var(--md-sys-color-on-primary) !important;\n transform: scale(0.95);\n }\n .mu-code__copy.copied {\n background: #c8e6c9 !important;\n color: #1b5e20 !important;\n }\n `;\n // Remove old styles and add new ones to ensure latest CSS\n const existingStyle = document.getElementById('mu-code-styles');\n if (existingStyle) {\n existingStyle.remove();\n }\n style.id = 'mu-code-styles';\n document.head.appendChild(style);\n }\n\n #setupCopyButton(originalCode) {\n const btn = this.querySelector('.mu-code__copy');\n if (btn) {\n this.listen(btn, 'click', async () => {\n try {\n await navigator.clipboard.writeText(originalCode.trim());\n // Add copied class for visual feedback\n btn.classList.add('copied');\n btn.innerHTML = `\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"20 6 9 17 4 12\"/>\n </svg>\n `;\n this.setTimeout(() => {\n btn.classList.remove('copied');\n btn.innerHTML = `\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"/>\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\"/>\n </svg>\n `;\n }, 2000);\n } catch (e) {\n console.error('Copy failed:', e);\n }\n });\n }\n }\n}\n\ndefine('mu-code', MuCode);\n",
71
+ "/**\n * @fileoverview mu-api-table - API Documentation Table Component\n * \n * Usage: \n * <mu-api-table type=\"attributes\">\n * <mu-api-row name=\"checked\" type=\"boolean\" default=\"false\">Whether checkbox is checked</mu-api-row>\n * </mu-api-table>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { escapeHTML } from '../core/utils.js';\n\nexport class MuApiTable extends MuElement {\n static baseClass = 'mu-api-table';\n static observedAttributes = ['type'];\n\n render() {\n const type = this.attr('type', 'attributes');\n const rows = Array.from(this.querySelectorAll('mu-api-row'));\n\n const headers = {\n attributes: ['Name', 'Type', 'Default', 'Description'],\n properties: ['Name', 'Type', 'Description'],\n methods: ['Name', 'Signature', 'Description'],\n events: ['Name', 'Detail', 'Description'],\n tokens: ['Token', 'Default', 'Description']\n };\n\n const cols = headers[type] || headers.attributes;\n\n // Store row data before clearing\n const rowData = rows.map(row => ({\n name: row.getAttribute('name') || '',\n type: row.getAttribute('type') || '',\n default: row.getAttribute('default') || '-',\n signature: row.getAttribute('signature') || '',\n detail: row.getAttribute('detail') || '',\n description: row.textContent.trim()\n }));\n\n this.innerHTML = `\n <table class=\"mu-api-table__table\">\n <thead>\n <tr>\n ${cols.map(c => `<th>${c}</th>`).join('')}\n </tr>\n </thead>\n <tbody>\n ${rowData.map(row => this.#renderRow(type, row)).join('')}\n </tbody>\n </table>\n `;\n\n this.#applyStyles();\n }\n\n #renderRow(type, data) {\n const safeData = {\n name: escapeHTML(data.name),\n type: escapeHTML(data.type),\n default: escapeHTML(data.default),\n signature: escapeHTML(data.signature),\n detail: escapeHTML(data.detail),\n description: escapeHTML(data.description) // Description is often text, if it needs HTML user should use a slot\n };\n\n switch (type) {\n case 'attributes':\n return `<tr>\n <td><code>${safeData.name}</code></td>\n <td><code class=\"type\">${safeData.type}</code></td>\n <td><code class=\"default\">${safeData.default}</code></td>\n <td>${safeData.description}</td>\n </tr>`;\n case 'properties':\n return `<tr>\n <td><code>${safeData.name}</code></td>\n <td><code class=\"type\">${safeData.type}</code></td>\n <td>${safeData.description}</td>\n </tr>`;\n case 'methods':\n return `<tr>\n <td><code>${safeData.name}</code></td>\n <td><code class=\"signature\">${safeData.signature}</code></td>\n <td>${safeData.description}</td>\n </tr>`;\n case 'events':\n return `<tr>\n <td><code>${safeData.name}</code></td>\n <td><code class=\"detail\">${safeData.detail}</code></td>\n <td>${safeData.description}</td>\n </tr>`;\n case 'tokens':\n return `<tr>\n <td><code>${safeData.name}</code></td>\n <td><code class=\"default\">${safeData.default}</code></td>\n <td>${safeData.description}</td>\n </tr>`;\n default:\n return '';\n }\n }\n\n #applyStyles() {\n this.style.display = 'block';\n this.style.overflowX = 'auto';\n this.style.marginBottom = '24px'; /* MD3: 24dp spacing between sections */\n\n const table = this.querySelector('.mu-api-table__table');\n if (table) {\n table.style.width = '100%';\n table.style.borderCollapse = 'collapse';\n table.style.fontSize = 'var(--md-sys-typescale-body-medium-size)';\n }\n\n const ths = this.querySelectorAll('th');\n ths.forEach(th => {\n th.style.textAlign = 'left';\n th.style.padding = '16px'; /* MD3: 16dp padding */\n th.style.height = '56px'; /* MD3: header row height */\n th.style.background = 'var(--md-sys-color-surface-container)';\n th.style.fontWeight = '500';\n th.style.color = 'var(--md-sys-color-on-surface)';\n th.style.borderBottom = '1px solid var(--md-sys-color-outline-variant)';\n });\n\n const tds = this.querySelectorAll('td');\n tds.forEach(td => {\n td.style.padding = '16px'; /* MD3: 16dp padding */\n td.style.minHeight = '52px'; /* MD3: minimum row height */\n td.style.borderBottom = '1px solid var(--md-sys-color-outline-variant)';\n td.style.verticalAlign = 'middle'; /* Better vertical alignment */\n td.style.lineHeight = '1.5'; /* Improve readability */\n });\n\n const codes = this.querySelectorAll('code');\n codes.forEach(code => {\n code.style.fontFamily = \"'Fira Code', monospace\";\n code.style.fontSize = '13px';\n code.style.padding = '2px 6px';\n code.style.borderRadius = '4px';\n code.style.background = 'var(--md-sys-color-surface-container-highest)';\n });\n\n const types = this.querySelectorAll('code.type, code.detail');\n types.forEach(t => {\n t.style.color = 'var(--md-sys-color-primary)';\n });\n\n const defaults = this.querySelectorAll('code.default');\n defaults.forEach(d => {\n d.style.color = 'var(--md-sys-color-secondary)';\n });\n }\n}\n\nexport class MuApiRow extends MuElement {\n static baseClass = 'mu-api-row';\n static observedAttributes = ['name', 'type', 'default', 'signature', 'detail'];\n\n render() {\n // Just a container, actual rendering done by parent\n }\n}\n\ndefine('mu-api-table', MuApiTable);\ndefine('mu-api-row', MuApiRow);\n",
72
+ "/**\n * @fileoverview mu-example - Interactive Example Card Component\n * \n * Usage:\n * <mu-example title=\"Basic checkbox\">\n * <div slot=\"demo\">\n * <mu-checkbox checked>Example</mu-checkbox>\n * </div>\n * <div slot=\"code\">\n * <mu-checkbox checked>Example</mu-checkbox>\n * </div>\n * </mu-example>\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\nimport { escapeHTML } from '../core/utils.js';\n\nexport class MuExample extends MuElement {\n static baseClass = 'mu-example';\n static observedAttributes = ['title'];\n\n #showCode = false;\n\n render() {\n const title = this.attr('title', 'Example');\n const demoSlot = this.querySelector('[slot=\"demo\"]');\n const codeSlot = this.querySelector('[slot=\"code\"]');\n\n // Extract content BEFORE modifying DOM\n const demoContent = demoSlot ? demoSlot.innerHTML : '';\n // For code, use textContent to get the decoded text (handles pre-escaped content)\n // If there's a code slot, use it; otherwise use the demo slot's outerHTML\n const codeContent = codeSlot\n ? codeSlot.textContent\n : (demoSlot ? demoSlot.innerHTML : '');\n\n // Remove original slots to prevent duplicate event handlers\n // The slots contain interactive elements (buttons with onclick) that would overlap\n if (demoSlot) demoSlot.remove();\n if (codeSlot) codeSlot.remove();\n\n // CRITICAL: Pre-escape and prettify code content BEFORE creating mu-code element\n // This ensures mu-code has content when connectedCallback runs (which triggers render)\n const normalizedCode = this.#prettifyHTML(codeContent);\n const escapedCode = escapeHTML(normalizedCode);\n\n this.innerHTML = `\n <div class=\"mu-example__card\">\n <div class=\"mu-example__header\">\n <span class=\"mu-example__title\">${title}</span>\n <div class=\"mu-example__actions\">\n <button class=\"mu-example__btn\" data-action=\"link\" title=\"Copy link\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M10 13a5 5 0 007.54.54l3-3a5 5 0 00-7.07-7.07l-1.72 1.71\"/>\n <path d=\"M14 11a5 5 0 00-7.54-.54l-3 3a5 5 0 007.07 7.07l1.71-1.71\"/>\n </svg>\n </button>\n <button class=\"mu-example__btn\" data-action=\"code\" title=\"View source\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"16 18 22 12 16 6\"/>\n <polyline points=\"8 6 2 12 8 18\"/>\n </svg>\n </button>\n </div>\n </div>\n <div class=\"mu-example__demo\">\n ${demoContent}\n </div>\n <div class=\"mu-example__code\" style=\"display: none;\">\n <mu-code language=\"html\">${escapedCode}</mu-code>\n </div>\n </div>\n `;\n\n this.#applyStyles();\n // Event delegation handled by MuElement.#setupEventDelegation()\n // See handleAction() method below\n }\n\n\n // Using centralized escapeHTML from core/utils.js for XSS safety\n\n /**\n * Pretty-prints HTML with proper indentation\n * Lightweight implementation, no dependencies\n * @param {string} html - The HTML string to format\n * @returns {string} - Formatted HTML with proper indentation\n */\n #prettifyHTML(html) {\n // Self-closing tags that don't need closing\n const selfClosing = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n ]);\n\n // Inline tags that shouldn't break to new line\n const inline = new Set([\n 'a', 'abbr', 'b', 'bdo', 'br', 'cite', 'code', 'dfn', 'em',\n 'i', 'kbd', 'q', 's', 'samp', 'small', 'span', 'strong',\n 'sub', 'sup', 'u', 'var'\n ]);\n\n let result = '';\n let indent = 0;\n const indentStr = ' '; // 4 spaces\n\n // Normalize: remove existing whitespace between tags\n const normalized = html\n .replace(/>\\s+</g, '><')\n .replace(/\\s+/g, ' ')\n .trim();\n\n // Split by tags while keeping tags in result\n const tokens = normalized.split(/(<[^>]+>)/g).filter(t => t.trim());\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i].trim();\n if (!token) continue;\n\n const isTag = token.startsWith('<');\n const isClosing = token.startsWith('</');\n const isSelfClosing = token.endsWith('/>') ||\n (isTag && selfClosing.has(token.match(/<\\/?(\\w+)/)?.[1]?.toLowerCase()));\n\n if (isClosing) {\n indent = Math.max(0, indent - 1);\n }\n\n // Get tag name if it's a tag\n const tagName = isTag ? token.match(/<\\/?(\\w+)/)?.[1]?.toLowerCase() : null;\n const isInline = tagName && inline.has(tagName);\n\n // Add content\n if (isTag) {\n if (!isInline || isClosing) {\n if (result && !result.endsWith('\\n')) {\n result += '\\n';\n }\n result += indentStr.repeat(indent) + token;\n } else {\n result += token;\n }\n } else {\n // Text content - add inline\n result += token;\n }\n\n // Increase indent after opening tag (not self-closing, not inline)\n if (isTag && !isClosing && !isSelfClosing && !isInline) {\n indent++;\n }\n }\n\n return result.trim();\n }\n\n #applyStyles() {\n this.style.display = 'block';\n this.style.marginBottom = '24px';\n\n const card = this.querySelector('.mu-example__card');\n if (card) {\n card.style.background = 'var(--md-sys-color-surface)';\n card.style.border = '1px solid var(--md-sys-color-outline-variant)';\n card.style.borderRadius = 'var(--md-sys-shape-corner-large)';\n // Note: Do NOT use overflow:hidden - it clips the code block\n }\n\n const header = this.querySelector('.mu-example__header');\n if (header) {\n header.style.display = 'flex';\n header.style.justifyContent = 'space-between';\n header.style.alignItems = 'center';\n header.style.padding = '12px 16px';\n header.style.borderBottom = '1px solid var(--md-sys-color-outline-variant)';\n header.style.background = 'var(--md-sys-color-surface-container-low)';\n header.style.borderRadius = 'var(--md-sys-shape-corner-large) var(--md-sys-shape-corner-large) 0 0';\n }\n\n const title = this.querySelector('.mu-example__title');\n if (title) {\n title.style.fontWeight = '500';\n title.style.fontSize = 'var(--md-sys-typescale-title-small-size)';\n title.style.color = 'var(--md-sys-color-on-surface)';\n // SOTA 2026: Proper text overflow handling\n // min-width: 0 is CRITICAL for flexbox children to allow shrinking below content size\n title.style.minWidth = '0';\n title.style.overflow = 'hidden';\n title.style.textOverflow = 'ellipsis';\n title.style.whiteSpace = 'nowrap';\n }\n\n const actions = this.querySelector('.mu-example__actions');\n if (actions) {\n actions.style.display = 'flex';\n actions.style.gap = '4px';\n }\n\n const btns = this.querySelectorAll('.mu-example__btn');\n btns.forEach(btn => {\n btn.style.background = 'transparent';\n btn.style.border = 'none';\n btn.style.cursor = 'pointer';\n btn.style.padding = '8px';\n btn.style.borderRadius = '50%';\n btn.style.color = 'var(--md-sys-color-on-surface-variant)';\n btn.style.display = 'flex';\n btn.style.alignItems = 'center';\n btn.style.justifyContent = 'center';\n btn.style.transition = 'all 0.2s ease';\n });\n\n const demo = this.querySelector('.mu-example__demo');\n if (demo) {\n // SOTA 2026: Proper containment - demo area MUST contain its content\n demo.style.boxSizing = 'border-box';\n demo.style.width = '100%';\n demo.style.maxWidth = '100%';\n demo.style.padding = '24px';\n // Flexbox with wrap for responsive layout\n demo.style.display = 'flex';\n demo.style.flexWrap = 'wrap';\n demo.style.gap = '16px';\n demo.style.alignItems = 'center';\n demo.style.justifyContent = 'flex-start';\n // No overflow clipping - content wraps naturally\n\n // Force interactive children to wrap properly instead of shrinking\n // IMPORTANT: Layout containers (mu-stack, mu-grid) must NOT have flex-shrink: 0\n // They need to shrink to contain their children properly\n const layoutContainers = new Set(['MU-STACK', 'MU-GRID', 'MU-LAYOUT']);\n Array.from(demo.children).forEach(child => {\n if (!layoutContainers.has(child.tagName)) {\n child.style.flexShrink = '0';\n }\n });\n }\n\n const codeBlock = this.querySelector('.mu-example__code');\n if (codeBlock) {\n codeBlock.style.borderTop = '1px solid var(--md-sys-color-outline-variant)';\n }\n\n // Style the mu-code element for seamless integration\n const muCode = this.querySelector('.mu-example__code mu-code');\n if (muCode) {\n // Only zero TOP corners - bottom corners should stay rounded (set by mu-code itself)\n muCode.style.borderTopLeftRadius = '0';\n muCode.style.borderTopRightRadius = '0';\n muCode.style.maxHeight = '400px';\n muCode.style.overflow = 'auto';\n\n // Also remove border-radius from the mu-code header (HTML badge area)\n const muCodeHeader = muCode.querySelector('.mu-code__header');\n if (muCodeHeader) {\n muCodeHeader.style.borderRadius = '0';\n }\n }\n\n // Add hover styles\n const style = document.createElement('style');\n style.textContent = `\n .mu-example__btn:hover {\n background: var(--md-sys-color-surface-container-high) !important;\n color: var(--md-sys-color-primary) !important;\n }\n .mu-example__btn.active {\n background: var(--md-sys-color-primary-container) !important;\n color: var(--md-sys-color-on-primary-container) !important;\n }\n `;\n if (!document.querySelector('#mu-example-styles')) {\n style.id = 'mu-example-styles';\n document.head.appendChild(style);\n }\n }\n\n /**\n * SOTA 2026: Handle delegated actions from MuElement.\n * Called automatically by base class event delegation.\n */\n handleAction(action, target, event) {\n if (action === 'code') {\n const codeBlock = this.querySelector('.mu-example__code');\n if (codeBlock) {\n this.#showCode = !this.#showCode;\n codeBlock.style.display = this.#showCode ? 'block' : 'none';\n target.classList.toggle('active', this.#showCode);\n\n // Scroll code block into view when shown\n if (this.#showCode) {\n // SOTA: Double rAF ensures layout is complete before measuring\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // Find the scrollable container (.mu-layout-main in demo)\n const scrollContainer = this.closest('.mu-layout-main') ||\n document.querySelector('.mu-layout-main') ||\n document.documentElement;\n\n const codeRect = codeBlock.getBoundingClientRect();\n const containerRect = scrollContainer.getBoundingClientRect?.() ||\n { top: 0, bottom: window.innerHeight };\n\n // Only scroll if code block is below viewport\n if (codeRect.bottom > containerRect.bottom) {\n const scrollOffset = codeRect.bottom - containerRect.bottom + 20;\n scrollContainer.scrollBy({\n top: scrollOffset,\n behavior: 'smooth'\n });\n }\n });\n });\n }\n }\n } else if (action === 'link') {\n this.#copyLink(target);\n }\n }\n\n async #copyLink(btn) {\n const url = window.location.href;\n try {\n await navigator.clipboard.writeText(url);\n btn.style.color = 'var(--md-sys-color-primary)';\n this.setTimeout(() => {\n btn.style.color = '';\n }, 2000);\n } catch (e) {\n console.error('Copy failed:', e);\n }\n }\n}\n\ndefine('mu-example', MuExample);\n",
73
+ "/**\n * @fileoverview mu-doc-page - Self-Contained Documentation Page Component\n * \n * This component encapsulates the entire 4-tab documentation structure,\n * making it trivial to add new component documentation pages.\n * \n * Usage:\n * <mu-doc-page \n * title=\"Button\"\n * selector=\"mu-button\"\n * description=\"Interactive button component\">\n * \n * <div slot=\"overview\">... overview content ...</div>\n * <div slot=\"api\">... api tables ...</div>\n * <div slot=\"styling\">... css tokens ...</div>\n * <div slot=\"examples\">... example cards ...</div>\n * </mu-doc-page>\n * \n * Benefits:\n * - No JavaScript needed per page - tabs work automatically\n * - Consistent structure across all pages\n * - Single source of truth for documentation layout\n */\n\nimport { MuElement, define } from '../core/MuElement.js';\n\nexport class MuDocPage extends MuElement {\n static baseClass = 'mu-doc-page';\n static observedAttributes = ['title', 'selector', 'description'];\n\n #activeTab = 0;\n\n connectedCallback() {\n super.connectedCallback();\n // Use requestAnimationFrame to ensure child elements are parsed\n requestAnimationFrame(() => this.#setupTabs());\n }\n\n render() {\n const title = this.attr('title', 'Component');\n const selector = this.attr('selector', '');\n const description = this.attr('description', '');\n\n // Get slot content before replacing innerHTML\n const overviewSlot = this.querySelector('[slot=\"overview\"]');\n const apiSlot = this.querySelector('[slot=\"api\"]');\n const stylingSlot = this.querySelector('[slot=\"styling\"]');\n const examplesSlot = this.querySelector('[slot=\"examples\"]');\n\n const overviewContent = overviewSlot ? overviewSlot.innerHTML : '';\n const apiContent = apiSlot ? apiSlot.innerHTML : '';\n const stylingContent = stylingSlot ? stylingSlot.innerHTML : '';\n const examplesContent = examplesSlot ? examplesSlot.innerHTML : '';\n\n this.innerHTML = `\n <h1 class=\"page-title\">${title}</h1>\n <p class=\"page-subtitle\">\n ${selector ? `<code>&lt;${selector}&gt;</code> ` : ''}${description}\n </p>\n\n <mu-tabs active=\"0\" class=\"mu-doc-page__tabs\" style=\"margin-bottom: 24px;\">\n <mu-tab>OVERVIEW</mu-tab>\n <mu-tab>API</mu-tab>\n <mu-tab>STYLING</mu-tab>\n <mu-tab>EXAMPLES</mu-tab>\n </mu-tabs>\n\n <div class=\"mu-doc-page__content mu-doc-page__overview\">\n ${overviewContent}\n </div>\n <div class=\"mu-doc-page__content mu-doc-page__api\" style=\"display: none;\">\n ${apiContent}\n </div>\n <div class=\"mu-doc-page__content mu-doc-page__styling\" style=\"display: none;\">\n ${stylingContent}\n </div>\n <div class=\"mu-doc-page__content mu-doc-page__examples\" style=\"display: none;\">\n ${examplesContent}\n </div>\n `;\n\n this.style.display = 'block';\n }\n\n #setupTabs() {\n const tabs = this.querySelector('.mu-doc-page__tabs');\n const contents = this.querySelectorAll('.mu-doc-page__content');\n\n if (tabs) {\n this.listen(tabs, 'mu-tab-change', (e) => {\n this.#activeTab = e.detail.index;\n contents.forEach((content, i) => {\n content.style.display = i === this.#activeTab ? 'block' : 'none';\n });\n });\n }\n }\n}\n\ndefine('mu-doc-page', MuDocPage);\n",
74
+ "/**\n * @fileoverview microUI v3.5 - Complete Framework (2026 Edition)\n * \n * AI-Optimized UI Framework for Large-Scale Applications\n * 45+ Components | Memory-Safe | Agent-First | State-of-the-Art Performance\n */\n\n// ============================================\n// CORE\n// ============================================\nexport { MuElement, define } from './core/MuElement.js';\nexport { bus, UIEvents, showToast } from './core/bus.js';\nexport { Theme } from './core/theme.js';\nexport { createStore, appStore, createNamespacedStore, getStore, getAllStores, captureAppState, restoreAppState, getStateHistory, enableObservability, disableObservability } from './core/store.js';\nexport { Router } from './core/router.js';\nexport { http, HttpError } from './core/http.js';\nexport { createRipple, attachRipple, RippleMixin } from './core/ripple.js';\nexport { createFormState, getFormValues } from './core/form-state.js';\nexport { AgentAPI, getMuComponentTree, describe as describeComponent, findByLabel, getRegisteredComponents, enableVisualMarkers, disableVisualMarkers, getMarkerMap, getMarkerElement, getMCPActions } from './core/agent-api.js';\nexport { FeatureRegistry, createFeature, getFeatures, getFeature, getFeatureComponents, getFeatureSummary } from './core/feature-registry.js';\nexport { ComponentSchema, getComponentSchema, getAllSchemas, getSchemaComponents, getSchemaQuickRef } from './core/component-schema.js';\n\n// ============================================\n// CENTRALIZED UTILITIES (2026 SOTA)\n// ============================================\nexport { Z_INDEX, injectLayerTokens } from './core/layers.js';\nexport { keyboard, KeyboardManager } from './core/keyboard.js';\nexport { breakpoints, BREAKPOINTS, BreakpointObserver } from './core/breakpoints.js';\nexport { escapeHTML } from './core/utils.js';\n\n// ============================================\n// SIGNALS (2026 SOTA - Fine-grained reactivity)\n// ============================================\nexport { signal, computed, effect, batch } from './core/signals.js';\n\n// ============================================\n// VIEW TRANSITIONS (2026 SOTA - Smooth animations)\n// ============================================\nexport {\n transition,\n transitionNamed,\n navigateWithTransition,\n supportsViewTransitions\n} from './core/transitions.js';\n\n// ============================================\n// TASK SCHEDULER (2026 SOTA - Priority scheduling)\n// ============================================\nexport {\n scheduleTask,\n yieldToMain,\n processWithYield,\n runBackground,\n runImmediate,\n afterPaint,\n supportsScheduler\n} from './core/scheduler.js';\n\n// ============================================\n// RENDER UTILITIES (Large-Scale App Optimization)\n// ============================================\nexport {\n scheduler,\n memo,\n debounce,\n throttle,\n createVisibilityObserver,\n domBatch,\n processInChunks\n} from './core/render.js';\n\n// ============================================\n// LAYOUT COMPONENTS\n// ============================================\nexport { MuStack } from './components/mu-stack.js';\nexport { MuGrid } from './components/mu-grid.js';\nexport { MuContainer } from './components/mu-container.js';\nexport { MuNavbar, MuNavbarBrand, MuNavbarLinks, MuNavbarActions } from './components/mu-navbar.js';\nexport { MuSidebar, MuSidebarItem } from './components/mu-sidebar.js';\nexport { MuDivider } from './components/mu-divider.js';\n\n// MD3 Responsive Layout (2026)\nexport { MuLayout } from './components/mu-layout.js';\nexport { MuDrawer } from './components/mu-drawer.js';\nexport { MuDrawerItem, MuNavItem } from './components/mu-drawer-item.js';\nexport { MuBottomNav } from './components/mu-bottom-nav.js';\n\n// ============================================\n// FORM COMPONENTS\n// ============================================\nexport { MuButton } from './components/mu-button.js';\nexport { MuInput } from './components/mu-input.js';\nexport { MuTextarea } from './components/mu-textarea.js';\nexport { MuForm } from './components/mu-form.js';\nexport { MuDropdown, MuOption } from './components/mu-dropdown.js';\nexport { MuCheckbox } from './components/mu-checkbox.js';\nexport { MuSwitch } from './components/mu-switch.js';\nexport { MuRadioGroup, MuRadio } from './components/mu-radio.js';\nexport { MuChip } from './components/mu-chip.js';\n\n// ============================================\n// DISPLAY COMPONENTS\n// ============================================\nexport { MuCard } from './components/mu-card.js';\nexport { MuCallout } from './components/mu-callout.js';\nexport { MuTabs, MuTab } from './components/mu-tabs.js';\nexport { MuAlert } from './components/mu-alert.js';\nexport { MuBadge } from './components/mu-badge.js';\nexport { MuProgress } from './components/mu-progress.js';\nexport { MuTable, MuThead, MuTbody, MuTr, MuTh, MuTd } from './components/mu-table.js';\nexport { MuAvatar } from './components/mu-avatar.js';\nexport { MuSkeleton } from './components/mu-skeleton.js';\n\n// ============================================\n// FEEDBACK COMPONENTS\n// ============================================\nexport { MuSpinner } from './components/mu-spinner.js';\nexport { MuModal } from './components/mu-modal.js';\nexport { MuToast, Toast } from './components/mu-toast.js';\nexport { MuTooltip } from './components/mu-tooltip.js';\nexport { MuConfirm, muConfirm } from './components/mu-confirm.js';\n\n// ============================================\n// ROUTING COMPONENTS\n// ============================================\nexport { MuRouter } from './components/mu-router.js';\nexport { MuPage } from './components/mu-page.js';\n\n// ============================================\n// TOAST LISTENER REGISTRATION (Single point)\n// Uses CrossBus-native hasListeners() instead of global flags\n// ============================================\nimport { Toast as ToastService } from './components/mu-toast.js';\nimport { bus as toastBus, UIEvents as ToastEvents } from './core/bus.js';\n\nif (!toastBus.hasListeners(ToastEvents.TOAST_SHOW)) {\n toastBus.on(ToastEvents.TOAST_SHOW, (data) => {\n ToastService.show(data.message, data);\n });\n}\n\n// ============================================\n// UTILITY COMPONENTS\n// ============================================\nexport { MuThemeToggle } from './components/mu-theme-toggle.js';\nexport { MuIcon, IconNames } from './components/mu-icon.js';\n\n// ============================================\n// PERFORMANCE COMPONENTS (Large-Scale)\n// ============================================\nexport { MuVirtualList } from './components/mu-virtual-list.js';\nexport { MuLazy } from './components/mu-lazy.js';\nexport { MuRepeat } from './components/mu-repeat.js';\nexport { MuFetch } from './components/mu-fetch.js';\n\n// AI-First Components (2026)\nexport { MuDataTable } from './components/mu-datatable.js';\nexport { MuSchemaForm } from './components/mu-schema-form.js';\nexport { MuPromptInput, MuCodeBlock, MuAgentToolbar, MuMessageBubble } from './components/mu-prompt-ui.js';\nexport { MuErrorBoundary, getErrors, clearErrors } from './components/mu-error-boundary.js';\n\n// ============================================\n// DOCUMENTATION COMPONENTS\n// ============================================\nexport { MuCode } from './components/mu-code.js';\nexport { MuApiTable, MuApiRow } from './components/mu-api-table.js';\nexport { MuExample } from './components/mu-example.js';\nexport { MuDocPage } from './components/mu-doc-page.js';\n\n// ============================================\n// AUTO-REGISTER ALL COMPONENTS\n// ============================================\nimport './components/mu-stack.js';\nimport './components/mu-grid.js';\nimport './components/mu-container.js';\nimport './components/mu-navbar.js';\nimport './components/mu-sidebar.js';\nimport './components/mu-divider.js';\nimport './components/mu-button.js';\nimport './components/mu-input.js';\nimport './components/mu-textarea.js';\nimport './components/mu-form.js';\nimport './components/mu-card.js';\nimport './components/mu-callout.js';\nimport './components/mu-tabs.js';\nimport './components/mu-alert.js';\nimport './components/mu-badge.js';\nimport './components/mu-spinner.js';\nimport './components/mu-progress.js';\nimport './components/mu-dropdown.js';\nimport './components/mu-checkbox.js';\nimport './components/mu-switch.js';\nimport './components/mu-radio.js';\nimport './components/mu-chip.js';\nimport './components/mu-modal.js';\nimport './components/mu-toast.js';\nimport './components/mu-tooltip.js';\nimport './components/mu-theme-toggle.js';\nimport './components/mu-icon.js';\nimport './components/mu-table.js';\nimport './components/mu-avatar.js';\nimport './components/mu-skeleton.js';\nimport './components/mu-virtual-list.js';\nimport './components/mu-lazy.js';\nimport './components/mu-repeat.js';\nimport './components/mu-confirm.js';\nimport './components/mu-fetch.js';\n\nimport './components/mu-datatable.js';\nimport './components/mu-schema-form.js';\nimport './components/mu-prompt-ui.js';\nimport './components/mu-error-boundary.js';\n\n// MD3 Responsive Layout\nimport './components/mu-layout.js';\nimport './components/mu-drawer.js';\nimport './components/mu-drawer-item.js';\nimport './components/mu-bottom-nav.js';\n\n// ============================================\n// DOCUMENTATION COMPONENTS\n// ============================================\nimport './components/mu-code.js';\nimport './components/mu-api-table.js';\nimport './components/mu-example.js';\nimport './components/mu-doc-page.js';\n\n// ============================================\n// GLOBAL EXPORT (for IIFE bundle browser usage)\n// ============================================\nimport { signal, computed, effect, batch } from './core/signals.js';\nimport { Theme } from './core/theme.js';\nimport { bus, UIEvents, showToast } from './core/bus.js';\nimport { createStore, appStore, createNamespacedStore, getStore, getAllStores, captureAppState, restoreAppState, getStateHistory, enableObservability, disableObservability } from './core/store.js';\nimport { Router } from './core/router.js';\nimport { http, HttpError } from './core/http.js';\nimport { createFormState, getFormValues } from './core/form-state.js';\nimport { AgentAPI, getMuComponentTree, describe as describeComponent, findByLabel, getRegisteredComponents, enableVisualMarkers, disableVisualMarkers, getMarkerMap, getMarkerElement, getMCPActions } from './core/agent-api.js';\nimport { FeatureRegistry, createFeature, getFeatures, getFeature, getFeatureComponents, getFeatureSummary } from './core/feature-registry.js';\nimport { ComponentSchema, getComponentSchema, getAllSchemas, getSchemaComponents, getSchemaQuickRef } from './core/component-schema.js';\nimport { getErrors, clearErrors } from './components/mu-error-boundary.js';\nimport { muConfirm } from './components/mu-confirm.js';\n\nif (typeof window !== 'undefined') {\n window.microUI = {\n // Signals\n signal,\n computed,\n effect,\n batch,\n // Theme\n Theme,\n // Bus\n bus,\n UIEvents,\n showToast,\n // Store\n createStore,\n appStore,\n // Router\n Router,\n // HTTP\n http,\n HttpError,\n // Form utilities\n createFormState,\n getFormValues,\n AgentAPI,\n getMuComponentTree,\n describeComponent,\n findByLabel,\n getRegisteredComponents,\n // Enterprise: Namespaced Stores\n createNamespacedStore,\n getStore,\n getAllStores,\n captureAppState,\n restoreAppState,\n getStateHistory,\n enableObservability,\n disableObservability,\n // Enterprise: Feature Registry\n FeatureRegistry,\n createFeature,\n getFeatures,\n getFeature,\n getFeatureComponents,\n getFeatureSummary,\n // Enterprise: Error Handling\n getErrors,\n clearErrors,\n // 2026 Agent: Component Schema (JSON Schema export)\n ComponentSchema,\n getComponentSchema,\n getAllSchemas,\n getSchemaComponents,\n getSchemaQuickRef,\n // 2026 Agent: Visual Markers (multimodal)\n enableVisualMarkers,\n disableVisualMarkers,\n getMarkerMap,\n getMarkerElement,\n // 2026 Agent: MCP Actions (standard protocol)\n getMCPActions,\n // 2026 Agent: Programmatic Dialogs\n muConfirm\n };\n}\n"
75
+ ],
76
+ "mappings": "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CACH,KAAM,SACN,YAAa,gBACb,SAAU,EACd,EACA,MAAO,CACH,KAAM,UACN,YAAa,+BACb,QAAS,EACb,CACJ,CACJ,EACA,CACI,KAAM,kBACN,YAAa,8BACb,WAAY,CACR,SAAU,CACN,KAAM,SACN,YAAa,yCACb,SAAU,EACd,EACA,QAAS,CACL,KAAM,UACN,YAAa,+CACb,SAAU,EACd,CACJ,CACJ,EACA,CACI,KAAM,gBACN,YAAa,iCACb,WAAY,CACR,SAAU,CACN,KAAM,SACN,YAAa,4BACb,SAAU,EACd,EACA,MAAO,CACH,KAAM,SACN,YAAa,iCACb,SAAU,EACd,CACJ,CACJ,EACA,CACI,KAAM,aACN,YAAa,sBACb,WAAY,CACR,SAAU,CACN,KAAM,SACN,YAAa,yBACb,SAAU,EACd,CACJ,CACJ,EACA,CACI,KAAM,cACN,YAAa,uBACb,WAAY,CACR,SAAU,CACN,KAAM,SACN,YAAa,yBACb,SAAU,EACd,CACJ,CACJ,EACA,CACI,KAAM,aACN,YAAa,iCACb,WAAY,CACR,cAAe,CACX,KAAM,SACN,YAAa,qCACb,SAAU,EACd,EACA,MAAO,CACH,KAAM,SACN,YAAa,sBACb,SAAU,EACd,EACA,MAAO,CACH,KAAM,SACN,YAAa,iBACb,SAAU,EACd,CACJ,CACJ,EACA,CACI,KAAM,qBACN,YAAa,gDACb,WAAY,CACR,aAAc,CACV,KAAM,UACN,YAAa,kCACb,QAAS,EACb,EACA,iBAAkB,CACd,KAAM,UACN,YAAa,sCACb,QAAS,EACb,CACJ,CACJ,EACA,CACI,KAAM,wBACN,YAAa,+CACb,WAAY,CACR,MAAO,CACH,KAAM,SACN,KAAM,CAAC,QAAS,SAAS,EACzB,YAAa,sBACb,QAAS,OACb,CACJ,CACJ,EACA,CACI,KAAM,iBACN,YAAa,mCACb,WAAY,CACR,OAAQ,CACJ,KAAM,SACN,KAAM,CAAC,UAAW,QAAQ,EAC1B,YAAa,+BACb,SAAU,EACd,CACJ,CACJ,CACJ,CACJ,EAIG,IAAM,GAAW,CACpB,qBACA,YACA,2BACA,eACA,qBACA,uBACA,qBAEA,uBACA,uBACA,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",
77
+ "debugId": "649F32CF9C3735A964756E2164756E21",
78
+ "names": []
79
+ }