@threadlabs/looma 0.28.19 → 0.28.20

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 (418) hide show
  1. package/components/ui-editor-code-language/ui-editor-code-language.html +1 -1
  2. package/components/ui-editor-image-toolbar/ui-editor-image-toolbar.html +9 -10
  3. package/components/ui-editor-image-toolbar/ui-editor-image-toolbar.js +6 -8
  4. package/components/ui-editor-link-form/ui-editor-link-form.html +2 -3
  5. package/dist/index.js +10 -8
  6. package/package.json +3 -3
  7. package/styles/ui-action-bar.css +1 -1
  8. package/styles/ui-affordance-scope.css +1 -1
  9. package/styles/ui-avatar-group.css +1 -1
  10. package/styles/ui-avatar.css +1 -1
  11. package/styles/ui-badge.css +1 -1
  12. package/styles/ui-breadcrumb-item.css +1 -1
  13. package/styles/ui-breadcrumbs.css +1 -1
  14. package/styles/ui-button.css +1 -1
  15. package/styles/ui-callout.css +1 -1
  16. package/styles/ui-card.css +1 -1
  17. package/styles/ui-checkbox.css +1 -1
  18. package/styles/ui-cluster.css +1 -1
  19. package/styles/ui-combobox.css +1 -1
  20. package/styles/ui-container.css +1 -1
  21. package/styles/ui-context-menu.css +1 -1
  22. package/styles/ui-cover.css +1 -1
  23. package/styles/ui-description-item.css +1 -1
  24. package/styles/ui-description-list.css +1 -1
  25. package/styles/ui-dialog.css +1 -1
  26. package/styles/ui-disclosure.css +1 -1
  27. package/styles/ui-editable.css +1 -1
  28. package/styles/ui-editor-block-actions.css +1 -1
  29. package/styles/ui-editor-chip-editor.css +1 -1
  30. package/styles/ui-editor-code-language.css +1 -1
  31. package/styles/ui-editor-image-toolbar.css +1 -1
  32. package/styles/ui-editor-insert-table-grid.css +1 -1
  33. package/styles/ui-editor-link-card.css +1 -1
  34. package/styles/ui-editor-link-form.css +1 -1
  35. package/styles/ui-editor-mention-menu-item.css +1 -1
  36. package/styles/ui-editor-mention-menu.css +1 -1
  37. package/styles/ui-editor-slash-menu-group.css +1 -1
  38. package/styles/ui-editor-slash-menu-item.css +1 -1
  39. package/styles/ui-editor-slash-menu.css +1 -1
  40. package/styles/ui-editor-surface.css +1 -1
  41. package/styles/ui-editor-table-context-menu.css +1 -1
  42. package/styles/ui-editor-table-overlay.css +1 -1
  43. package/styles/ui-editor-table-toolbar.css +1 -1
  44. package/styles/ui-editor-toolbar.css +1 -1
  45. package/styles/ui-floating-action-button.css +1 -1
  46. package/styles/ui-form-field.css +1 -1
  47. package/styles/ui-grid.css +1 -1
  48. package/styles/ui-icon-button.css +1 -1
  49. package/styles/ui-icon.css +1 -1
  50. package/styles/ui-image.css +1 -1
  51. package/styles/ui-input-group.css +1 -1
  52. package/styles/ui-input.css +1 -1
  53. package/styles/ui-list-item.css +1 -1
  54. package/styles/ui-list.css +1 -1
  55. package/styles/ui-listbox.css +1 -1
  56. package/styles/ui-menu-group.css +1 -1
  57. package/styles/ui-menu-item.css +1 -1
  58. package/styles/ui-menu.css +1 -1
  59. package/styles/ui-meter.css +1 -1
  60. package/styles/ui-nav-item.css +1 -1
  61. package/styles/ui-page-header.css +1 -1
  62. package/styles/ui-popover.css +1 -1
  63. package/styles/ui-radio-group.css +1 -1
  64. package/styles/ui-radio.css +1 -1
  65. package/styles/ui-reel.css +1 -1
  66. package/styles/ui-scroll-area.css +1 -1
  67. package/styles/ui-search-result-row.css +1 -1
  68. package/styles/ui-search-shell.css +1 -1
  69. package/styles/ui-section.css +1 -1
  70. package/styles/ui-select.css +1 -1
  71. package/styles/ui-separator.css +1 -1
  72. package/styles/ui-sidebar.css +1 -1
  73. package/styles/ui-spinner.css +1 -1
  74. package/styles/ui-stack.css +1 -1
  75. package/styles/ui-status-message.css +1 -1
  76. package/styles/ui-swatch.css +1 -1
  77. package/styles/ui-switch.css +1 -1
  78. package/styles/ui-switcher.css +1 -1
  79. package/styles/ui-table.css +1 -1
  80. package/styles/ui-tabs.css +1 -1
  81. package/styles/ui-text.css +1 -1
  82. package/styles/ui-textarea.css +1 -1
  83. package/styles/ui-toast-region.css +1 -1
  84. package/styles/ui-toast.css +1 -1
  85. package/styles/ui-tooltip.css +1 -1
  86. package/styles/ui-top-bar.css +1 -1
  87. package/styles/ui-tree-item.css +1 -1
  88. package/styles/ui-tree.css +1 -1
  89. package/vanilla/UiActionBar.d.ts +1 -1
  90. package/vanilla/UiActionBar.js +1 -1
  91. package/vanilla/UiAffordanceScope.d.ts +1 -1
  92. package/vanilla/UiAffordanceScope.js +1 -1
  93. package/vanilla/UiAvatar.d.ts +1 -1
  94. package/vanilla/UiAvatar.js +1 -1
  95. package/vanilla/UiAvatarGroup.d.ts +1 -1
  96. package/vanilla/UiAvatarGroup.js +1 -1
  97. package/vanilla/UiBadge.d.ts +1 -1
  98. package/vanilla/UiBadge.js +1 -1
  99. package/vanilla/UiBreadcrumbItem.d.ts +1 -1
  100. package/vanilla/UiBreadcrumbItem.js +1 -1
  101. package/vanilla/UiBreadcrumbs.d.ts +1 -1
  102. package/vanilla/UiBreadcrumbs.js +1 -1
  103. package/vanilla/UiButton.d.ts +1 -1
  104. package/vanilla/UiButton.js +1 -1
  105. package/vanilla/UiCallout.d.ts +1 -1
  106. package/vanilla/UiCallout.js +1 -1
  107. package/vanilla/UiCard.d.ts +1 -1
  108. package/vanilla/UiCard.js +1 -1
  109. package/vanilla/UiCheckbox.d.ts +1 -1
  110. package/vanilla/UiCheckbox.js +1 -1
  111. package/vanilla/UiCluster.d.ts +1 -1
  112. package/vanilla/UiCluster.js +1 -1
  113. package/vanilla/UiCombobox.d.ts +1 -1
  114. package/vanilla/UiCombobox.js +1 -1
  115. package/vanilla/UiContainer.d.ts +1 -1
  116. package/vanilla/UiContainer.js +1 -1
  117. package/vanilla/UiContextMenu.d.ts +1 -1
  118. package/vanilla/UiContextMenu.js +1 -1
  119. package/vanilla/UiCover.d.ts +1 -1
  120. package/vanilla/UiCover.js +1 -1
  121. package/vanilla/UiDescriptionItem.d.ts +1 -1
  122. package/vanilla/UiDescriptionItem.js +1 -1
  123. package/vanilla/UiDescriptionList.d.ts +1 -1
  124. package/vanilla/UiDescriptionList.js +1 -1
  125. package/vanilla/UiDialog.d.ts +1 -1
  126. package/vanilla/UiDialog.js +1 -1
  127. package/vanilla/UiDisclosure.d.ts +1 -1
  128. package/vanilla/UiDisclosure.js +1 -1
  129. package/vanilla/UiEditable.d.ts +1 -1
  130. package/vanilla/UiEditable.js +1 -1
  131. package/vanilla/UiEditorBlockActions.d.ts +1 -1
  132. package/vanilla/UiEditorBlockActions.js +1 -1
  133. package/vanilla/UiEditorChipEditor.d.ts +1 -1
  134. package/vanilla/UiEditorChipEditor.js +1 -1
  135. package/vanilla/UiEditorCodeLanguage.d.ts +1 -1
  136. package/vanilla/UiEditorCodeLanguage.js +2 -2
  137. package/vanilla/UiEditorImageToolbar.d.ts +1 -1
  138. package/vanilla/UiEditorImageToolbar.js +4 -2
  139. package/vanilla/UiEditorInsertTableGrid.d.ts +1 -1
  140. package/vanilla/UiEditorInsertTableGrid.js +1 -1
  141. package/vanilla/UiEditorLinkCard.d.ts +1 -1
  142. package/vanilla/UiEditorLinkCard.js +1 -1
  143. package/vanilla/UiEditorLinkForm.d.ts +1 -1
  144. package/vanilla/UiEditorLinkForm.js +2 -2
  145. package/vanilla/UiEditorMentionMenu.d.ts +1 -1
  146. package/vanilla/UiEditorMentionMenu.js +1 -1
  147. package/vanilla/UiEditorMentionMenuItem.d.ts +1 -1
  148. package/vanilla/UiEditorMentionMenuItem.js +1 -1
  149. package/vanilla/UiEditorSlashMenu.d.ts +1 -1
  150. package/vanilla/UiEditorSlashMenu.js +1 -1
  151. package/vanilla/UiEditorSlashMenuGroup.d.ts +1 -1
  152. package/vanilla/UiEditorSlashMenuGroup.js +1 -1
  153. package/vanilla/UiEditorSlashMenuItem.d.ts +1 -1
  154. package/vanilla/UiEditorSlashMenuItem.js +1 -1
  155. package/vanilla/UiEditorSurface.d.ts +1 -1
  156. package/vanilla/UiEditorSurface.js +1 -1
  157. package/vanilla/UiEditorTableContextMenu.d.ts +1 -1
  158. package/vanilla/UiEditorTableContextMenu.js +1 -1
  159. package/vanilla/UiEditorTableOverlay.d.ts +1 -1
  160. package/vanilla/UiEditorTableOverlay.js +1 -1
  161. package/vanilla/UiEditorTableToolbar.d.ts +1 -1
  162. package/vanilla/UiEditorTableToolbar.js +1 -1
  163. package/vanilla/UiEditorToolbar.d.ts +1 -1
  164. package/vanilla/UiEditorToolbar.js +1 -1
  165. package/vanilla/UiFloatingActionButton.d.ts +1 -1
  166. package/vanilla/UiFloatingActionButton.js +1 -1
  167. package/vanilla/UiFormField.d.ts +1 -1
  168. package/vanilla/UiFormField.js +1 -1
  169. package/vanilla/UiGrid.d.ts +1 -1
  170. package/vanilla/UiGrid.js +1 -1
  171. package/vanilla/UiIcon.d.ts +1 -1
  172. package/vanilla/UiIcon.js +1 -1
  173. package/vanilla/UiIconButton.d.ts +1 -1
  174. package/vanilla/UiIconButton.js +1 -1
  175. package/vanilla/UiImage.d.ts +1 -1
  176. package/vanilla/UiImage.js +1 -1
  177. package/vanilla/UiInput.d.ts +1 -1
  178. package/vanilla/UiInput.js +1 -1
  179. package/vanilla/UiInputGroup.d.ts +1 -1
  180. package/vanilla/UiInputGroup.js +1 -1
  181. package/vanilla/UiList.d.ts +1 -1
  182. package/vanilla/UiList.js +1 -1
  183. package/vanilla/UiListItem.d.ts +1 -1
  184. package/vanilla/UiListItem.js +1 -1
  185. package/vanilla/UiListbox.d.ts +1 -1
  186. package/vanilla/UiListbox.js +1 -1
  187. package/vanilla/UiMenu.d.ts +1 -1
  188. package/vanilla/UiMenu.js +1 -1
  189. package/vanilla/UiMenuGroup.d.ts +1 -1
  190. package/vanilla/UiMenuGroup.js +1 -1
  191. package/vanilla/UiMenuItem.d.ts +1 -1
  192. package/vanilla/UiMenuItem.js +1 -1
  193. package/vanilla/UiMeter.d.ts +1 -1
  194. package/vanilla/UiMeter.js +1 -1
  195. package/vanilla/UiNavItem.d.ts +1 -1
  196. package/vanilla/UiNavItem.js +1 -1
  197. package/vanilla/UiPageHeader.d.ts +1 -1
  198. package/vanilla/UiPageHeader.js +1 -1
  199. package/vanilla/UiPopover.d.ts +1 -1
  200. package/vanilla/UiPopover.js +1 -1
  201. package/vanilla/UiRadio.d.ts +1 -1
  202. package/vanilla/UiRadio.js +1 -1
  203. package/vanilla/UiRadioGroup.d.ts +1 -1
  204. package/vanilla/UiRadioGroup.js +1 -1
  205. package/vanilla/UiReel.d.ts +1 -1
  206. package/vanilla/UiReel.js +1 -1
  207. package/vanilla/UiScrollArea.d.ts +1 -1
  208. package/vanilla/UiScrollArea.js +1 -1
  209. package/vanilla/UiSearchResultRow.d.ts +1 -1
  210. package/vanilla/UiSearchResultRow.js +1 -1
  211. package/vanilla/UiSearchShell.d.ts +1 -1
  212. package/vanilla/UiSearchShell.js +1 -1
  213. package/vanilla/UiSection.d.ts +1 -1
  214. package/vanilla/UiSection.js +1 -1
  215. package/vanilla/UiSelect.d.ts +1 -1
  216. package/vanilla/UiSelect.js +1 -1
  217. package/vanilla/UiSeparator.d.ts +1 -1
  218. package/vanilla/UiSeparator.js +1 -1
  219. package/vanilla/UiSidebar.d.ts +1 -1
  220. package/vanilla/UiSidebar.js +1 -1
  221. package/vanilla/UiSpinner.d.ts +1 -1
  222. package/vanilla/UiSpinner.js +1 -1
  223. package/vanilla/UiStack.d.ts +1 -1
  224. package/vanilla/UiStack.js +1 -1
  225. package/vanilla/UiStatusMessage.d.ts +1 -1
  226. package/vanilla/UiStatusMessage.js +1 -1
  227. package/vanilla/UiSwatch.d.ts +1 -1
  228. package/vanilla/UiSwatch.js +1 -1
  229. package/vanilla/UiSwitch.d.ts +1 -1
  230. package/vanilla/UiSwitch.js +1 -1
  231. package/vanilla/UiSwitcher.d.ts +1 -1
  232. package/vanilla/UiSwitcher.js +1 -1
  233. package/vanilla/UiTable.d.ts +1 -1
  234. package/vanilla/UiTable.js +1 -1
  235. package/vanilla/UiTabs.d.ts +1 -1
  236. package/vanilla/UiTabs.js +1 -1
  237. package/vanilla/UiText.d.ts +1 -1
  238. package/vanilla/UiText.js +1 -1
  239. package/vanilla/UiTextarea.d.ts +1 -1
  240. package/vanilla/UiTextarea.js +1 -1
  241. package/vanilla/UiToast.d.ts +1 -1
  242. package/vanilla/UiToast.js +1 -1
  243. package/vanilla/UiToastRegion.d.ts +1 -1
  244. package/vanilla/UiToastRegion.js +1 -1
  245. package/vanilla/UiTooltip.d.ts +1 -1
  246. package/vanilla/UiTooltip.js +1 -1
  247. package/vanilla/UiTopBar.d.ts +1 -1
  248. package/vanilla/UiTopBar.js +1 -1
  249. package/vanilla/UiTree.d.ts +1 -1
  250. package/vanilla/UiTree.js +1 -1
  251. package/vanilla/UiTreeItem.d.ts +1 -1
  252. package/vanilla/UiTreeItem.js +1 -1
  253. package/vue/UiActionBar.vue +1 -1
  254. package/vue/UiAffordanceScope.vue +1 -1
  255. package/vue/UiAvatar.vue +1 -1
  256. package/vue/UiAvatarGroup.vue +1 -1
  257. package/vue/UiBadge.vue +1 -1
  258. package/vue/UiBreadcrumbItem.vue +1 -1
  259. package/vue/UiBreadcrumbs.vue +1 -1
  260. package/vue/UiButton.vue +1 -1
  261. package/vue/UiCallout.vue +1 -1
  262. package/vue/UiCard.vue +1 -1
  263. package/vue/UiCheckbox.vue +1 -1
  264. package/vue/UiCluster.vue +1 -1
  265. package/vue/UiCombobox.vue +1 -1
  266. package/vue/UiContainer.vue +1 -1
  267. package/vue/UiContextMenu.vue +1 -1
  268. package/vue/UiCover.vue +1 -1
  269. package/vue/UiDescriptionItem.vue +1 -1
  270. package/vue/UiDescriptionList.vue +1 -1
  271. package/vue/UiDialog.vue +1 -1
  272. package/vue/UiDisclosure.vue +1 -1
  273. package/vue/UiEditable.vue +1 -1
  274. package/vue/UiEditorBlockActions.vue +1 -1
  275. package/vue/UiEditorChipEditor.vue +1 -1
  276. package/vue/UiEditorCodeLanguage.d.ts +2 -2
  277. package/vue/UiEditorCodeLanguage.vue +4 -5
  278. package/vue/UiEditorImageToolbar.vue +13 -10
  279. package/vue/UiEditorInsertTableGrid.vue +1 -1
  280. package/vue/UiEditorLinkCard.vue +1 -1
  281. package/vue/UiEditorLinkForm.d.ts +2 -2
  282. package/vue/UiEditorLinkForm.vue +4 -5
  283. package/vue/UiEditorMentionMenu.vue +1 -1
  284. package/vue/UiEditorMentionMenuItem.vue +1 -1
  285. package/vue/UiEditorSlashMenu.vue +1 -1
  286. package/vue/UiEditorSlashMenuGroup.vue +1 -1
  287. package/vue/UiEditorSlashMenuItem.vue +1 -1
  288. package/vue/UiEditorSurface.vue +1 -1
  289. package/vue/UiEditorTableContextMenu.vue +1 -1
  290. package/vue/UiEditorTableOverlay.vue +1 -1
  291. package/vue/UiEditorTableToolbar.vue +1 -1
  292. package/vue/UiEditorToolbar.vue +1 -1
  293. package/vue/UiFloatingActionButton.vue +1 -1
  294. package/vue/UiFormField.vue +1 -1
  295. package/vue/UiGrid.vue +1 -1
  296. package/vue/UiIcon.vue +1 -1
  297. package/vue/UiIconButton.vue +1 -1
  298. package/vue/UiImage.vue +1 -1
  299. package/vue/UiInput.vue +1 -1
  300. package/vue/UiInputGroup.vue +1 -1
  301. package/vue/UiList.vue +1 -1
  302. package/vue/UiListItem.vue +1 -1
  303. package/vue/UiListbox.vue +1 -1
  304. package/vue/UiMenu.vue +1 -1
  305. package/vue/UiMenuGroup.vue +1 -1
  306. package/vue/UiMenuItem.vue +1 -1
  307. package/vue/UiMeter.vue +1 -1
  308. package/vue/UiNavItem.vue +1 -1
  309. package/vue/UiPageHeader.vue +1 -1
  310. package/vue/UiPopover.vue +1 -1
  311. package/vue/UiRadio.vue +1 -1
  312. package/vue/UiRadioGroup.vue +1 -1
  313. package/vue/UiReel.vue +1 -1
  314. package/vue/UiScrollArea.vue +1 -1
  315. package/vue/UiSearchResultRow.vue +1 -1
  316. package/vue/UiSearchShell.vue +1 -1
  317. package/vue/UiSection.vue +1 -1
  318. package/vue/UiSelect.vue +1 -1
  319. package/vue/UiSeparator.vue +1 -1
  320. package/vue/UiSidebar.vue +1 -1
  321. package/vue/UiSpinner.vue +1 -1
  322. package/vue/UiStack.vue +1 -1
  323. package/vue/UiStatusMessage.vue +1 -1
  324. package/vue/UiSwatch.vue +1 -1
  325. package/vue/UiSwitch.vue +1 -1
  326. package/vue/UiSwitcher.vue +1 -1
  327. package/vue/UiTable.vue +1 -1
  328. package/vue/UiTabs.vue +1 -1
  329. package/vue/UiText.vue +1 -1
  330. package/vue/UiTextarea.vue +1 -1
  331. package/vue/UiToast.vue +1 -1
  332. package/vue/UiToastRegion.vue +1 -1
  333. package/vue/UiTooltip.vue +1 -1
  334. package/vue/UiTopBar.vue +1 -1
  335. package/vue/UiTree.vue +1 -1
  336. package/vue/UiTreeItem.vue +1 -1
  337. package/vue/chunks/UiActionBar.js +1 -1
  338. package/vue/chunks/UiAffordanceScope.js +1 -1
  339. package/vue/chunks/UiAvatar.js +1 -1
  340. package/vue/chunks/UiAvatarGroup.js +1 -1
  341. package/vue/chunks/UiBadge.js +1 -1
  342. package/vue/chunks/UiBreadcrumbItem.js +1 -1
  343. package/vue/chunks/UiBreadcrumbs.js +1 -1
  344. package/vue/chunks/UiButton.js +1 -1
  345. package/vue/chunks/UiCallout.js +1 -1
  346. package/vue/chunks/UiCard.js +1 -1
  347. package/vue/chunks/UiCheckbox.js +1 -1
  348. package/vue/chunks/UiCluster.js +1 -1
  349. package/vue/chunks/UiCombobox.js +1 -1
  350. package/vue/chunks/UiContainer.js +1 -1
  351. package/vue/chunks/UiContextMenu.js +1 -1
  352. package/vue/chunks/UiCover.js +1 -1
  353. package/vue/chunks/UiDescriptionItem.js +1 -1
  354. package/vue/chunks/UiDescriptionList.js +1 -1
  355. package/vue/chunks/UiDialog.js +1 -1
  356. package/vue/chunks/UiDisclosure.js +1 -1
  357. package/vue/chunks/UiEditable.js +1 -1
  358. package/vue/chunks/UiEditorCodeLanguage.js +3 -4
  359. package/vue/chunks/UiEditorImageToolbar.js +19 -11
  360. package/vue/chunks/UiEditorInsertTableGrid.js +1 -1
  361. package/vue/chunks/UiEditorLinkForm.js +3 -4
  362. package/vue/chunks/UiEditorMentionMenu.js +1 -1
  363. package/vue/chunks/UiEditorMentionMenuItem.js +1 -1
  364. package/vue/chunks/UiEditorSlashMenu.js +1 -1
  365. package/vue/chunks/UiEditorSlashMenuGroup.js +1 -1
  366. package/vue/chunks/UiEditorSlashMenuItem.js +1 -1
  367. package/vue/chunks/UiEditorSurface.js +1 -1
  368. package/vue/chunks/UiEditorTableContextMenu.js +1 -1
  369. package/vue/chunks/UiEditorTableOverlay.js +1 -1
  370. package/vue/chunks/UiEditorTableToolbar.js +1 -1
  371. package/vue/chunks/UiEditorToolbar.js +1 -1
  372. package/vue/chunks/UiFloatingActionButton.js +1 -1
  373. package/vue/chunks/UiFormField.js +1 -1
  374. package/vue/chunks/UiGrid.js +1 -1
  375. package/vue/chunks/UiIcon.js +1 -1
  376. package/vue/chunks/UiIconButton.js +1 -1
  377. package/vue/chunks/UiImage.js +1 -1
  378. package/vue/chunks/UiInput.js +1 -1
  379. package/vue/chunks/UiInputGroup.js +1 -1
  380. package/vue/chunks/UiList.js +1 -1
  381. package/vue/chunks/UiListItem.js +1 -1
  382. package/vue/chunks/UiListbox.js +1 -1
  383. package/vue/chunks/UiMenu.js +1 -1
  384. package/vue/chunks/UiMenuGroup.js +1 -1
  385. package/vue/chunks/UiMenuItem.js +1 -1
  386. package/vue/chunks/UiMeter.js +1 -1
  387. package/vue/chunks/UiNavItem.js +1 -1
  388. package/vue/chunks/UiPageHeader.js +1 -1
  389. package/vue/chunks/UiPopover.js +1 -1
  390. package/vue/chunks/UiRadio.js +1 -1
  391. package/vue/chunks/UiRadioGroup.js +1 -1
  392. package/vue/chunks/UiReel.js +1 -1
  393. package/vue/chunks/UiScrollArea.js +1 -1
  394. package/vue/chunks/UiSearchResultRow.js +1 -1
  395. package/vue/chunks/UiSearchShell.js +1 -1
  396. package/vue/chunks/UiSection.js +1 -1
  397. package/vue/chunks/UiSelect.js +1 -1
  398. package/vue/chunks/UiSeparator.js +1 -1
  399. package/vue/chunks/UiSidebar.js +1 -1
  400. package/vue/chunks/UiSpinner.js +1 -1
  401. package/vue/chunks/UiStack.js +1 -1
  402. package/vue/chunks/UiStatusMessage.js +1 -1
  403. package/vue/chunks/UiSwatch.js +1 -1
  404. package/vue/chunks/UiSwitch.js +1 -1
  405. package/vue/chunks/UiSwitcher.js +1 -1
  406. package/vue/chunks/UiTable.js +1 -1
  407. package/vue/chunks/UiTabs.js +1 -1
  408. package/vue/chunks/UiText.js +1 -1
  409. package/vue/chunks/UiTextarea.js +1 -1
  410. package/vue/chunks/UiToast.js +1 -1
  411. package/vue/chunks/UiToastRegion.js +1 -1
  412. package/vue/chunks/UiTooltip.js +1 -1
  413. package/vue/chunks/UiTopBar.js +1 -1
  414. package/vue/chunks/UiTree.js +1 -1
  415. package/vue/chunks/UiTreeItem.js +1 -1
  416. package/vue/chunks/_plugin-vue_export-helper.js +63 -5
  417. package/vue/components.css +20 -20
  418. package/vue/host.ts +109 -4
@@ -680,6 +680,6 @@ var UiTreeItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
680
680
  }]]);
681
681
  };
682
682
  }
683
- }), [["__scopeId", "data-v-54a4ba48"]]);
683
+ }), [["__scopeId", "data-v-ecab748f"]]);
684
684
  //#endregion
685
685
  export { UiTreeItem_default as t };
@@ -1,4 +1,4 @@
1
- import { Fragment, computed, defineComponent, getCurrentInstance, h, onBeforeUnmount, onBeforeUpdate, onMounted, onUpdated, shallowRef, useSlots, watchEffect } from "vue";
1
+ import { Fragment, computed, defineComponent, getCurrentInstance, h, onBeforeUnmount, onBeforeUpdate, onMounted, onUpdated, shallowRef, useSlots, watch, watchEffect } from "vue";
2
2
  //#region .build/vue/host.ts
3
3
  function controllerNamespaces(options, source) {
4
4
  const reported = /* @__PURE__ */ new Set();
@@ -119,6 +119,42 @@ function controllerNamespaces(options, source) {
119
119
  })
120
120
  };
121
121
  }
122
+ var requestStateKey = Symbol.for("@nextwebwg/html-next.runtime.v1");
123
+ var documentRecord = (root) => root.ownerDocument[requestStateKey] ??= {};
124
+ /** Requests from inside root wait until its controller has run; the returned release ends the wait. */
125
+ function holdController(root) {
126
+ const { g: gates } = documentRecord(root).requests ??= { g: /* @__PURE__ */ new WeakMap() };
127
+ let release;
128
+ const gate = new Promise((resolve) => {
129
+ release = resolve;
130
+ });
131
+ gates.set(root, gate);
132
+ return () => {
133
+ if (gates.get(root) === gate) gates.delete(root);
134
+ release();
135
+ };
136
+ }
137
+ /** A responder registered on root relays to the requests inside it that went unanswered, once a page asks. */
138
+ function relayResponders(root, name) {
139
+ documentRecord(root).relay?.(root, name);
140
+ }
141
+ /** For a component that asks: a responder announcement reaches its controller only as the relay to its root, which does not bubble. */
142
+ function hostListener(type, callback) {
143
+ return (event) => {
144
+ if (type !== "responder" || !event.bubbles) callback(event);
145
+ };
146
+ }
147
+ /** The connection signal requests use: it aborts when the component disconnects. */
148
+ function requestConnection() {
149
+ let current;
150
+ return {
151
+ signal: (connected) => connected ? (current ??= new AbortController()).signal : AbortSignal.abort(new DOMException("The component is not connected.", "AbortError")),
152
+ end: () => {
153
+ current?.abort();
154
+ current = void 0;
155
+ }
156
+ };
157
+ }
122
158
  function dispatchToTargets(recorded, send) {
123
159
  const targets = (recorded instanceof Set ? [...recorded] : Array.isArray(recorded) ? [...recorded] : [recorded]).map((ref) => ref?.nodeType === 1 ? ref : ref?.$el).filter((element) => element?.nodeType === 1 && element.isConnected).sort((a, b) => a === b ? 0 : a.compareDocumentPosition(b) & 4 ? -1 : 1);
124
160
  for (const target of targets) if (target.isConnected) send(target);
@@ -243,6 +279,7 @@ function useComponentHost(controllerLoader, options) {
243
279
  else if (entry.type !== "disconnect") {
244
280
  entry.target = root.value ?? void 0;
245
281
  entry.target?.addEventListener(entry.type, entry.callback);
282
+ if (entry.target !== void 0) relayResponders(entry.target, entry.type);
246
283
  }
247
284
  };
248
285
  const deactivate = (entry, disconnecting) => {
@@ -291,7 +328,7 @@ function useComponentHost(controllerLoader, options) {
291
328
  on(type, callback) {
292
329
  const entry = {
293
330
  type,
294
- callback
331
+ callback: type === "connect" || type === "disconnect" || options.request === void 0 ? callback : hostListener(type, callback)
295
332
  };
296
333
  subscriptions.add(entry);
297
334
  if (connected.value) activate(entry);
@@ -348,18 +385,32 @@ function useComponentHost(controllerLoader, options) {
348
385
  stops.push(dispose);
349
386
  return dispose;
350
387
  },
351
- dispatch
388
+ dispatch,
389
+ ...options.request === void 0 ? {} : { request: (name, detail, requestOptions) => options.request(root.value, requests.signal(connected.value), name, detail, requestOptions) }
352
390
  };
391
+ const requests = requestConnection();
392
+ const responders = Object.entries(options.responders ?? {});
393
+ for (const [name, read] of responders) host.on(name, (event) => read()?.(event));
394
+ if (responders.length > 0) watch(() => responders.map(([, read]) => read() !== void 0), (now, before) => {
395
+ const element = root.value;
396
+ if (element === null || !connected.value) return;
397
+ now.forEach((set, index) => {
398
+ if (set && !before[index]) relayResponders(element, responders[index][0]);
399
+ });
400
+ });
353
401
  let cleanup;
354
402
  let started;
355
403
  let stopObserving;
356
404
  let connection = 0;
357
405
  let initialized = false;
358
406
  let unmounted = false;
407
+ let releaseController;
359
408
  const disconnect = () => {
360
409
  if (!connected.value) return;
361
410
  connected.value = false;
362
411
  connection += 1;
412
+ requests.end();
413
+ releaseController?.();
363
414
  for (const pause of pauses.values()) pause();
364
415
  for (const entry of subscriptions) deactivate(entry, true);
365
416
  cleanup?.();
@@ -382,17 +433,24 @@ function useComponentHost(controllerLoader, options) {
382
433
  for (const entry of subscriptions) activate(entry);
383
434
  if (initialized) return;
384
435
  const current = ++connection;
436
+ const release = releaseController = holdController(root.value);
385
437
  started = loadControllerModule().then(async (loaded) => {
386
438
  if (!connected.value || current !== connection || initialized) return loaded;
387
439
  initialized = true;
388
- const result = await loaded.default(host);
440
+ let invoked;
441
+ try {
442
+ invoked = loaded.default(host);
443
+ } finally {
444
+ release();
445
+ }
446
+ const result = await invoked;
389
447
  if (typeof result === "function") {
390
448
  if (!connected.value || current !== connection) result();
391
449
  else cleanup = result;
392
450
  }
393
451
  return loaded;
394
452
  });
395
- started.catch(report);
453
+ started.catch(report).finally(release);
396
454
  };
397
455
  onMounted(() => {
398
456
  if (root.value === null) return;
@@ -939,12 +939,12 @@ ol:where([data-hn-ui-breadcrumbs]) {
939
939
  }
940
940
 
941
941
  /* A rounded SVG arc grows and recedes over a quiet full-circle track. */
942
- @keyframes ui-spinner-rotate-2ac18d52 {
942
+ @keyframes ui-spinner-rotate-b406e90c {
943
943
  100% {
944
944
  transform: rotate(1turn);
945
945
  }
946
946
  }
947
- @keyframes ui-spinner-dash-2ac18d52 {
947
+ @keyframes ui-spinner-dash-b406e90c {
948
948
  0% {
949
949
  stroke-dasharray: 1, 150;
950
950
  stroke-dashoffset: 0;
@@ -980,7 +980,7 @@ svg {
980
980
  display: block;
981
981
  inline-size: 100%;
982
982
  block-size: 100%;
983
- animation: ui-spinner-rotate-2ac18d52 2s linear infinite;
983
+ animation: ui-spinner-rotate-b406e90c 2s linear infinite;
984
984
  }
985
985
  circle {
986
986
  stroke-width: 3;
@@ -993,7 +993,7 @@ circle {
993
993
  stroke: currentColor;
994
994
  stroke-dasharray: 90, 150;
995
995
  stroke-dashoffset: 0;
996
- animation: ui-spinner-dash-2ac18d52 1.5s ease-in-out infinite;
996
+ animation: ui-spinner-dash-b406e90c 1.5s ease-in-out infinite;
997
997
  }
998
998
  @media (prefers-reduced-motion: reduce) {
999
999
  svg,.arc {
@@ -1777,7 +1777,7 @@ html[data-ui-input-modality="touch"]
1777
1777
  /* The label, and under it an optional line saying what the choice means. */
1778
1778
 
1779
1779
  /* Centre the tick's box and lift it slightly for the rotated check shape. */
1780
- @keyframes ui-checkbox-check-084399a9 {
1780
+ @keyframes ui-checkbox-check-48b85ef3 {
1781
1781
  from {
1782
1782
  opacity: 0;
1783
1783
  transform: translateY(-0.09rem) rotate(45deg) scale(0.55);
@@ -1872,7 +1872,7 @@ input:checked:where([data-hn-ui-checkbox])::after {
1872
1872
  border-width: 0 0.125rem 0.125rem 0;
1873
1873
  opacity: 1;
1874
1874
  transform: translateY(-0.09rem) rotate(45deg);
1875
- animation: ui-checkbox-check-084399a9 180ms var(--ui-motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1))
1875
+ animation: ui-checkbox-check-48b85ef3 180ms var(--ui-motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1))
1876
1876
  both;
1877
1877
  }
1878
1878
  input:indeterminate:where([data-hn-ui-checkbox])::after {
@@ -3032,13 +3032,13 @@ dd:where([data-hn-ui-description-item]) {
3032
3032
  /* A CSS-drawn X. */
3033
3033
 
3034
3034
  /* A touch target, like Button on coarse pointers. */
3035
- @keyframes ui-dialog-enter-ada617a6 {
3035
+ @keyframes ui-dialog-enter-d07f3be8 {
3036
3036
  from {
3037
3037
  opacity: 0;
3038
3038
  transform: scale(0.96);
3039
3039
  }
3040
3040
  }
3041
- @keyframes ui-dialog-backdrop-enter-ada617a6 {
3041
+ @keyframes ui-dialog-backdrop-enter-d07f3be8 {
3042
3042
  from {
3043
3043
  background-color: transparent;
3044
3044
  }
@@ -3086,7 +3086,7 @@ from {
3086
3086
  pointer-events: auto;
3087
3087
  opacity: 1;
3088
3088
  transform: scale(1);
3089
- animation: ui-dialog-enter-ada617a6 var(--ui-dialog-duration, var(--ui-motion-base))
3089
+ animation: ui-dialog-enter-d07f3be8 var(--ui-dialog-duration, var(--ui-motion-base))
3090
3090
  var(--ui-motion-ease);
3091
3091
  }
3092
3092
  :scope[data-ui-dialog-state~="size=sm"]:where([data-hn-ui-dialog]) {
@@ -3204,7 +3204,7 @@ footer:empty:where([data-hn-ui-dialog]) {
3204
3204
  }
3205
3205
  :scope[open]:modal:where([data-hn-ui-dialog])::backdrop {
3206
3206
  background-color: var(--ui-overlay-backdrop);
3207
- animation: ui-dialog-backdrop-enter-ada617a6 var(--_ui-dialog-duration, var(--ui-motion-base))
3207
+ animation: ui-dialog-backdrop-enter-d07f3be8 var(--_ui-dialog-duration, var(--ui-motion-base))
3208
3208
  var(--ui-motion-ease);
3209
3209
  }
3210
3210
  :scope[open][data-ui-backdrop-hidden]:where([data-hn-ui-dialog])::backdrop {
@@ -9428,7 +9428,7 @@ input:where([data-hn-ui-switch]),input:where([data-hn-ui-switch])::after {
9428
9428
  }
9429
9429
 
9430
9430
  /* Leaving slides on down and fades; the controller removes the toast when this ends. */
9431
- @keyframes ui-toast-enter-503076d4 {
9431
+ @keyframes ui-toast-enter-eb136028 {
9432
9432
  from {
9433
9433
  opacity: 0;
9434
9434
  transform: translateY(-1rem);
@@ -9438,7 +9438,7 @@ to {
9438
9438
  transform: translateY(0);
9439
9439
  }
9440
9440
  }
9441
- @keyframes ui-toast-exit-503076d4 {
9441
+ @keyframes ui-toast-exit-eb136028 {
9442
9442
  from {
9443
9443
  opacity: 1;
9444
9444
  transform: translateY(0);
@@ -9448,7 +9448,7 @@ to {
9448
9448
  transform: translateY(0.75rem);
9449
9449
  }
9450
9450
  }
9451
- @keyframes ui-toast-enter-bottom-503076d4 {
9451
+ @keyframes ui-toast-enter-bottom-eb136028 {
9452
9452
  from {
9453
9453
  opacity: 0;
9454
9454
  transform: translateY(1rem);
@@ -9458,7 +9458,7 @@ to {
9458
9458
  transform: translateY(0);
9459
9459
  }
9460
9460
  }
9461
- @keyframes ui-toast-exit-bottom-503076d4 {
9461
+ @keyframes ui-toast-exit-bottom-eb136028 {
9462
9462
  from {
9463
9463
  opacity: 1;
9464
9464
  transform: translateY(0);
@@ -9549,7 +9549,7 @@ to {
9549
9549
  --_ui-toast-region-shadow,
9550
9550
  var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg)))
9551
9551
  );
9552
- animation: ui-toast-enter-503076d4 var(--_ui-toast-region-enter-duration, 0.32s)
9552
+ animation: ui-toast-enter-eb136028 var(--_ui-toast-region-enter-duration, 0.32s)
9553
9553
  var(--ui-motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1)) both;
9554
9554
  }
9555
9555
  .toast[data-tone="info"]:where([data-hn-ui-toast-region]) {
@@ -9569,17 +9569,17 @@ to {
9569
9569
  --_ui-toast-region-tone-surface: var(--ui-danger-soft);
9570
9570
  }
9571
9571
  .toast.closing:where([data-hn-ui-toast-region]) {
9572
- animation: ui-toast-exit-503076d4 var(--_ui-toast-region-exit-duration, 0.22s) var(--ui-motion-ease)
9572
+ animation: ui-toast-exit-eb136028 var(--_ui-toast-region-exit-duration, 0.22s) var(--ui-motion-ease)
9573
9573
  both;
9574
9574
  pointer-events: none;
9575
9575
  }
9576
9576
  :is(:scope[data-ui-toast-region-state~="placement=bottom"], :scope[data-ui-toast-region-state~="placement=bottom-start"], :scope[data-ui-toast-region-state~="placement=bottom-end"])
9577
9577
  .toast:where([data-hn-ui-toast-region]) {
9578
- animation-name: ui-toast-enter-bottom-503076d4;
9578
+ animation-name: ui-toast-enter-bottom-eb136028;
9579
9579
  }
9580
9580
  :is(:scope[data-ui-toast-region-state~="placement=bottom"], :scope[data-ui-toast-region-state~="placement=bottom-start"], :scope[data-ui-toast-region-state~="placement=bottom-end"])
9581
9581
  .toast.closing:where([data-hn-ui-toast-region]) {
9582
- animation-name: ui-toast-exit-bottom-503076d4;
9582
+ animation-name: ui-toast-exit-bottom-eb136028;
9583
9583
  }
9584
9584
  @media (prefers-reduced-motion: reduce) {
9585
9585
  .toast:where([data-hn-ui-toast-region]),.toast.closing:where([data-hn-ui-toast-region]) {
@@ -9780,7 +9780,7 @@ to {
9780
9780
  slides, the label reaches back under the icon (the controller measures how far) with its text
9781
9781
  where it was, and fades out across the gap before the icon, fully gone where the icon begins
9782
9782
  to cover it: the name slips under the icon rather than stopping at a hard edge beside it. */
9783
- @keyframes ui-tree-item-marquee-54a4ba48 {
9783
+ @keyframes ui-tree-item-marquee-ecab748f {
9784
9784
  from {
9785
9785
  transform: translateX(0);
9786
9786
  }
@@ -10036,7 +10036,7 @@ to {
10036
10036
  .row[data-ui-marquee] > .label > .label-text:where([data-hn-ui-tree-item]) {
10037
10037
  /* Once per pass: the controller restarts it after a rest at the end, so the name holds still
10038
10038
  long enough to read rather than sliding back and forth. */
10039
- animation: ui-tree-item-marquee-54a4ba48 var(--_marquee-duration) linear 0.5s 1 normal forwards;
10039
+ animation: ui-tree-item-marquee-ecab748f var(--_marquee-duration) linear 0.5s 1 normal forwards;
10040
10040
  will-change: transform;
10041
10041
  }
10042
10042
  .row[data-ui-marquee] > .label:where([data-hn-ui-tree-item]) {
package/vue/host.ts CHANGED
@@ -1,4 +1,4 @@
1
- // Generated by HTML Next 1.0.0-alpha.52 for Vue 3.5. Do not edit.
1
+ // Generated by HTML Next 1.0.0-alpha.53 for Vue 3.5. Do not edit.
2
2
  import {
3
3
  computed,
4
4
  createTextVNode,
@@ -202,6 +202,58 @@ function controllerNamespaces(options: ControllerNamespaces, source: string): {
202
202
  return { state, data }
203
203
  }
204
204
 
205
+ const requestStateKey = Symbol.for('@nextwebwg/html-next.runtime.v1')
206
+ type DocumentRecord = {
207
+ requests?: { readonly g: WeakMap<Node, Promise<void>> }
208
+ relay?: (from: Node, name: string) => void
209
+ }
210
+ const documentRecord = (root: Element): DocumentRecord =>
211
+ (root.ownerDocument as unknown as Record<symbol, DocumentRecord>)[requestStateKey] ??= {}
212
+
213
+ /** Requests from inside root wait until its controller has run; the returned release ends the wait. */
214
+ function holdController(root: Element): () => void {
215
+ const { g: gates } = documentRecord(root).requests ??= { g: new WeakMap() }
216
+ let release!: () => void
217
+ const gate = new Promise<void>((resolve) => {
218
+ release = resolve
219
+ })
220
+ gates.set(root, gate)
221
+ return () => {
222
+ if (gates.get(root) === gate) gates.delete(root)
223
+ release()
224
+ }
225
+ }
226
+
227
+ /** A responder registered on root relays to the requests inside it that went unanswered, once a page asks. */
228
+ function relayResponders(root: Element, name: string): void {
229
+ documentRecord(root).relay?.(root, name)
230
+ }
231
+
232
+ /** For a component that asks: a responder announcement reaches its controller only as the relay to its root, which does not bubble. */
233
+ function hostListener(type: string, callback: (event: Event) => unknown): (event: Event) => void {
234
+ return (event) => {
235
+ if (type !== 'responder' || !event.bubbles) callback(event)
236
+ }
237
+ }
238
+
239
+ /** The connection signal requests use: it aborts when the component disconnects. */
240
+ function requestConnection(): {
241
+ readonly signal: (connected: boolean) => AbortSignal
242
+ readonly end: () => void
243
+ } {
244
+ let current: AbortController | undefined
245
+ return {
246
+ signal: (connected) =>
247
+ connected
248
+ ? (current ??= new AbortController()).signal
249
+ : AbortSignal.abort(new DOMException('The component is not connected.', 'AbortError')),
250
+ end: () => {
251
+ current?.abort()
252
+ current = undefined
253
+ },
254
+ }
255
+ }
256
+
205
257
  export function dispatchToTargets(recorded: unknown, send: (target: Element) => void): void {
206
258
  const refs = recorded instanceof Set
207
259
  ? [...recorded]
@@ -484,6 +536,16 @@ export interface ComponentHostOptions {
484
536
  /** Values inherited through declared context, which a controller reads. */
485
537
  readonly context?: Readonly<Record<string, Readable<unknown>>>
486
538
  readonly acceptsState?: (name: string, keys: readonly string[], value: unknown) => boolean
539
+ /** Asks one of the component's declared requests. */
540
+ request?(
541
+ root: Element,
542
+ connection: AbortSignal,
543
+ name: string,
544
+ detail?: unknown,
545
+ options?: unknown,
546
+ ): Promise<unknown>
547
+ /** Each declared request's responder, from its function prop or event form, read when the request arrives. */
548
+ readonly responders?: Readonly<Record<string, () => ((event: Event) => void) | undefined>>
487
549
  }
488
550
 
489
551
  /** Vue does not promise a `v-for` ref array in source order, and the host does. */
@@ -582,6 +644,8 @@ export function useComponentHost(
582
644
  else if (entry.type !== 'disconnect') {
583
645
  entry.target = root.value ?? undefined
584
646
  entry.target?.addEventListener(entry.type, entry.callback as EventListener)
647
+ // A responder registered after a request went unanswered tells the asker to ask again.
648
+ if (entry.target !== undefined) relayResponders(entry.target, entry.type)
585
649
  }
586
650
  }
587
651
  const deactivate = (entry: Subscription, disconnecting: boolean): void => {
@@ -637,7 +701,12 @@ export function useComponentHost(
637
701
  ...(options.acceptsState === undefined ? {} : { acceptsState: options.acceptsState }),
638
702
  }, options.controllerSource?.definition ?? '<component>'),
639
703
  on(type: string, callback: (event: Event) => void | (() => void)): () => void {
640
- const entry: Subscription = { type, callback }
704
+ const entry: Subscription = {
705
+ type,
706
+ callback: type === 'connect' || type === 'disconnect' || options.request === undefined
707
+ ? callback
708
+ : hostListener(type, callback),
709
+ }
641
710
  subscriptions.add(entry)
642
711
  if (connected.value) activate(entry)
643
712
  return () => {
@@ -703,6 +772,31 @@ export function useComponentHost(
703
772
  return dispose
704
773
  },
705
774
  dispatch,
775
+ // A component that declares requests also has host.request.
776
+ ...(options.request === undefined ? {} : {
777
+ request: (name: string, detail?: unknown, requestOptions?: unknown): Promise<unknown> =>
778
+ options.request!(
779
+ root.value as Element,
780
+ requests.signal(connected.value),
781
+ name,
782
+ detail,
783
+ requestOptions,
784
+ ),
785
+ }),
786
+ }
787
+ const requests = requestConnection()
788
+ // Each request's responder listens on the root from its first connection, before the controller runs.
789
+ const responders = Object.entries(options.responders ?? {})
790
+ for (const [name, read] of responders) host.on(name, (event) => read()?.(event))
791
+ // A function prop or event form set later relays for its request, as a late host.on does.
792
+ if (responders.length > 0) {
793
+ watch(() => responders.map(([, read]) => read() !== undefined), (now, before) => {
794
+ const element = root.value
795
+ if (element === null || !connected.value) return
796
+ now.forEach((set, index) => {
797
+ if (set && !before[index]) relayResponders(element, responders[index]![0])
798
+ })
799
+ })
706
800
  }
707
801
 
708
802
  let cleanup: void | (() => void)
@@ -711,10 +805,13 @@ export function useComponentHost(
711
805
  let connection = 0
712
806
  let initialized = false
713
807
  let unmounted = false
808
+ let releaseController: (() => void) | undefined
714
809
  const disconnect = (): void => {
715
810
  if (!connected.value) return
716
811
  connected.value = false
717
812
  connection += 1
813
+ requests.end()
814
+ releaseController?.()
718
815
  for (const pause of pauses.values()) pause()
719
816
  for (const entry of subscriptions) deactivate(entry, true)
720
817
  cleanup?.()
@@ -741,17 +838,25 @@ export function useComponentHost(
741
838
  for (const entry of subscriptions) activate(entry)
742
839
  if (initialized) return
743
840
  const current = ++connection
841
+ // Requests from inside this root wait until the controller has run, or failed to load.
842
+ const release = releaseController = holdController(root.value!)
744
843
  started = loadControllerModule().then(async (loaded) => {
745
844
  if (!connected.value || current !== connection || initialized) return loaded
746
845
  initialized = true
747
- const result = await loaded.default(host as never)
846
+ let invoked: unknown
847
+ try {
848
+ invoked = loaded.default(host as never)
849
+ } finally {
850
+ release()
851
+ }
852
+ const result = await invoked
748
853
  if (typeof result === 'function') {
749
854
  if (!connected.value || current !== connection) result()
750
855
  else cleanup = result as () => void
751
856
  }
752
857
  return loaded
753
858
  })
754
- void started.catch(report)
859
+ void started.catch(report).finally(release)
755
860
  }
756
861
  onMounted(() => {
757
862
  if (root.value === null) return