@threadlabs/looma 0.6.4 → 0.7.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 (259) hide show
  1. package/components/ui-button/ui-button.html +103 -81
  2. package/components/ui-checkbox/ui-checkbox.html +4 -1
  3. package/components/ui-combobox/ui-combobox.html +40 -3
  4. package/components/ui-combobox/ui-combobox.js +27 -5
  5. package/components/ui-select/ui-select.html +3 -5
  6. package/dist/index.js +1 -1
  7. package/package.json +2 -2
  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-button.css +112 -80
  13. package/styles/ui-callout.css +1 -1
  14. package/styles/ui-checkbox.css +5 -2
  15. package/styles/ui-cluster.css +1 -1
  16. package/styles/ui-combobox.css +38 -1
  17. package/styles/ui-container.css +1 -1
  18. package/styles/ui-context-menu.css +1 -1
  19. package/styles/ui-dialog.css +1 -1
  20. package/styles/ui-disclosure.css +1 -1
  21. package/styles/ui-editable.css +1 -1
  22. package/styles/ui-editor-insert-table-grid.css +1 -1
  23. package/styles/ui-editor-mention-menu.css +1 -1
  24. package/styles/ui-editor-slash-menu.css +1 -1
  25. package/styles/ui-editor-table-context-menu.css +1 -1
  26. package/styles/ui-editor-table-overlay.css +1 -1
  27. package/styles/ui-editor-table-toolbar.css +1 -1
  28. package/styles/ui-editor-toolbar.css +1 -1
  29. package/styles/ui-floating-action-button.css +1 -1
  30. package/styles/ui-form-field.css +1 -1
  31. package/styles/ui-grid.css +1 -1
  32. package/styles/ui-icon-button.css +1 -1
  33. package/styles/ui-icon.css +1 -1
  34. package/styles/ui-input.css +1 -1
  35. package/styles/ui-menu-item.css +1 -1
  36. package/styles/ui-menu.css +1 -1
  37. package/styles/ui-popover.css +1 -1
  38. package/styles/ui-radio-group.css +1 -1
  39. package/styles/ui-radio.css +1 -1
  40. package/styles/ui-reel.css +1 -1
  41. package/styles/ui-search-result-row.css +1 -1
  42. package/styles/ui-search-shell.css +1 -1
  43. package/styles/ui-select.css +4 -5
  44. package/styles/ui-separator.css +1 -1
  45. package/styles/ui-sidebar.css +1 -1
  46. package/styles/ui-stack.css +1 -1
  47. package/styles/ui-switch.css +1 -1
  48. package/styles/ui-switcher.css +1 -1
  49. package/styles/ui-tabs.css +1 -1
  50. package/styles/ui-textarea.css +1 -1
  51. package/styles/ui-toast-region.css +1 -1
  52. package/styles/ui-tooltip.css +1 -1
  53. package/styles/ui-top-bar.css +1 -1
  54. package/styles/ui-tree-item.css +1 -1
  55. package/styles/ui-tree.css +1 -1
  56. package/theme-dark.css +6 -30
  57. package/theme-high-contrast.css +30 -20
  58. package/theme-light.css +2 -16
  59. package/tokens.css +33 -24
  60. package/vanilla/UiAffordanceScope.d.ts +1 -1
  61. package/vanilla/UiAffordanceScope.js +1 -1
  62. package/vanilla/UiAvatar.d.ts +1 -1
  63. package/vanilla/UiAvatar.js +1 -1
  64. package/vanilla/UiAvatarGroup.d.ts +1 -1
  65. package/vanilla/UiAvatarGroup.js +1 -1
  66. package/vanilla/UiBadge.d.ts +1 -1
  67. package/vanilla/UiBadge.js +1 -1
  68. package/vanilla/UiButton.d.ts +2 -2
  69. package/vanilla/UiButton.js +2 -2
  70. package/vanilla/UiCallout.d.ts +1 -1
  71. package/vanilla/UiCallout.js +1 -1
  72. package/vanilla/UiCheckbox.d.ts +1 -1
  73. package/vanilla/UiCheckbox.js +1 -1
  74. package/vanilla/UiCluster.d.ts +1 -1
  75. package/vanilla/UiCluster.js +1 -1
  76. package/vanilla/UiCombobox.d.ts +1 -1
  77. package/vanilla/UiCombobox.js +2 -2
  78. package/vanilla/UiContainer.d.ts +1 -1
  79. package/vanilla/UiContainer.js +1 -1
  80. package/vanilla/UiContextMenu.d.ts +1 -1
  81. package/vanilla/UiContextMenu.js +1 -1
  82. package/vanilla/UiDialog.d.ts +1 -1
  83. package/vanilla/UiDialog.js +1 -1
  84. package/vanilla/UiDisclosure.d.ts +1 -1
  85. package/vanilla/UiDisclosure.js +1 -1
  86. package/vanilla/UiEditable.d.ts +1 -1
  87. package/vanilla/UiEditable.js +1 -1
  88. package/vanilla/UiEditorInsertTableGrid.d.ts +1 -1
  89. package/vanilla/UiEditorInsertTableGrid.js +1 -1
  90. package/vanilla/UiEditorMentionMenu.d.ts +1 -1
  91. package/vanilla/UiEditorMentionMenu.js +1 -1
  92. package/vanilla/UiEditorSlashMenu.d.ts +1 -1
  93. package/vanilla/UiEditorSlashMenu.js +1 -1
  94. package/vanilla/UiEditorTableContextMenu.d.ts +1 -1
  95. package/vanilla/UiEditorTableContextMenu.js +1 -1
  96. package/vanilla/UiEditorTableOverlay.d.ts +1 -1
  97. package/vanilla/UiEditorTableOverlay.js +1 -1
  98. package/vanilla/UiEditorTableToolbar.d.ts +1 -1
  99. package/vanilla/UiEditorTableToolbar.js +1 -1
  100. package/vanilla/UiEditorToolbar.d.ts +1 -1
  101. package/vanilla/UiEditorToolbar.js +1 -1
  102. package/vanilla/UiFloatingActionButton.d.ts +1 -1
  103. package/vanilla/UiFloatingActionButton.js +1 -1
  104. package/vanilla/UiFormField.d.ts +1 -1
  105. package/vanilla/UiFormField.js +1 -1
  106. package/vanilla/UiGrid.d.ts +1 -1
  107. package/vanilla/UiGrid.js +1 -1
  108. package/vanilla/UiIcon.d.ts +1 -1
  109. package/vanilla/UiIcon.js +1 -1
  110. package/vanilla/UiIconButton.d.ts +1 -1
  111. package/vanilla/UiIconButton.js +1 -1
  112. package/vanilla/UiInput.d.ts +1 -1
  113. package/vanilla/UiInput.js +1 -1
  114. package/vanilla/UiMenu.d.ts +1 -1
  115. package/vanilla/UiMenu.js +1 -1
  116. package/vanilla/UiMenuItem.d.ts +1 -1
  117. package/vanilla/UiMenuItem.js +1 -1
  118. package/vanilla/UiPopover.d.ts +1 -1
  119. package/vanilla/UiPopover.js +1 -1
  120. package/vanilla/UiRadio.d.ts +1 -1
  121. package/vanilla/UiRadio.js +1 -1
  122. package/vanilla/UiRadioGroup.d.ts +1 -1
  123. package/vanilla/UiRadioGroup.js +1 -1
  124. package/vanilla/UiReel.d.ts +1 -1
  125. package/vanilla/UiReel.js +1 -1
  126. package/vanilla/UiSearchResultRow.d.ts +1 -1
  127. package/vanilla/UiSearchResultRow.js +1 -1
  128. package/vanilla/UiSearchShell.d.ts +1 -1
  129. package/vanilla/UiSearchShell.js +1 -1
  130. package/vanilla/UiSelect.d.ts +1 -2
  131. package/vanilla/UiSelect.js +4 -7
  132. package/vanilla/UiSeparator.d.ts +1 -1
  133. package/vanilla/UiSeparator.js +1 -1
  134. package/vanilla/UiSidebar.d.ts +1 -1
  135. package/vanilla/UiSidebar.js +1 -1
  136. package/vanilla/UiStack.d.ts +1 -1
  137. package/vanilla/UiStack.js +1 -1
  138. package/vanilla/UiSwitch.d.ts +1 -1
  139. package/vanilla/UiSwitch.js +1 -1
  140. package/vanilla/UiSwitcher.d.ts +1 -1
  141. package/vanilla/UiSwitcher.js +1 -1
  142. package/vanilla/UiTabs.d.ts +1 -1
  143. package/vanilla/UiTabs.js +1 -1
  144. package/vanilla/UiTextarea.d.ts +1 -1
  145. package/vanilla/UiTextarea.js +1 -1
  146. package/vanilla/UiToastRegion.d.ts +1 -1
  147. package/vanilla/UiToastRegion.js +1 -1
  148. package/vanilla/UiTooltip.d.ts +1 -1
  149. package/vanilla/UiTooltip.js +1 -1
  150. package/vanilla/UiTopBar.d.ts +1 -1
  151. package/vanilla/UiTopBar.js +1 -1
  152. package/vanilla/UiTree.d.ts +1 -1
  153. package/vanilla/UiTree.js +1 -1
  154. package/vanilla/UiTreeItem.d.ts +1 -1
  155. package/vanilla/UiTreeItem.js +1 -1
  156. package/vue/UiAffordanceScope.vue +8 -84
  157. package/vue/UiAvatar.d.ts +1 -1
  158. package/vue/UiAvatar.vue +9 -106
  159. package/vue/UiAvatarGroup.vue +9 -96
  160. package/vue/UiBadge.vue +1 -1
  161. package/vue/UiButton.d.ts +2 -2
  162. package/vue/UiButton.vue +104 -97
  163. package/vue/UiCallout.vue +1 -1
  164. package/vue/UiCheckbox.vue +26 -124
  165. package/vue/UiCluster.vue +1 -1
  166. package/vue/UiCombobox.d.ts +1 -1
  167. package/vue/UiCombobox.vue +270 -479
  168. package/vue/UiContainer.vue +1 -1
  169. package/vue/UiContextMenu.vue +34 -141
  170. package/vue/UiDialog.vue +25 -126
  171. package/vue/UiDisclosure.vue +26 -138
  172. package/vue/UiEditable.vue +46 -158
  173. package/vue/UiEditorInsertTableGrid.vue +19 -138
  174. package/vue/UiEditorMentionMenu.vue +17 -124
  175. package/vue/UiEditorSlashMenu.vue +17 -109
  176. package/vue/UiEditorTableContextMenu.vue +34 -122
  177. package/vue/UiEditorTableOverlay.vue +61 -167
  178. package/vue/UiEditorTableToolbar.vue +34 -142
  179. package/vue/UiEditorToolbar.vue +1 -1
  180. package/vue/UiFloatingActionButton.vue +1 -1
  181. package/vue/UiFormField.vue +7 -79
  182. package/vue/UiGrid.vue +1 -1
  183. package/vue/UiIcon.vue +8 -84
  184. package/vue/UiIconButton.vue +7 -79
  185. package/vue/UiInput.vue +7 -79
  186. package/vue/UiMenu.vue +42 -127
  187. package/vue/UiMenuItem.vue +1 -1
  188. package/vue/UiPopover.vue +25 -121
  189. package/vue/UiRadio.vue +22 -123
  190. package/vue/UiRadioGroup.d.ts +1 -1
  191. package/vue/UiRadioGroup.vue +32 -119
  192. package/vue/UiReel.vue +1 -1
  193. package/vue/UiSearchResultRow.vue +1 -1
  194. package/vue/UiSearchShell.vue +25 -121
  195. package/vue/UiSelect.d.ts +0 -2
  196. package/vue/UiSelect.vue +9 -85
  197. package/vue/UiSeparator.vue +1 -1
  198. package/vue/UiSidebar.vue +32 -133
  199. package/vue/UiStack.vue +1 -1
  200. package/vue/UiSwitch.vue +22 -123
  201. package/vue/UiSwitcher.vue +1 -1
  202. package/vue/UiTabs.vue +24 -128
  203. package/vue/UiTextarea.vue +7 -79
  204. package/vue/UiToastRegion.vue +37 -126
  205. package/vue/UiTooltip.vue +25 -124
  206. package/vue/UiTopBar.vue +1 -1
  207. package/vue/UiTree.vue +56 -137
  208. package/vue/UiTreeItem.vue +28 -144
  209. package/vue/chunks/UiAffordanceScope.js +9 -78
  210. package/vue/chunks/UiAvatar.js +13 -89
  211. package/vue/chunks/UiAvatarGroup.js +10 -80
  212. package/vue/chunks/UiBadge.js +1 -1
  213. package/vue/chunks/UiButton.js +3 -3
  214. package/vue/chunks/UiCallout.js +1 -1
  215. package/vue/chunks/UiCheckbox.js +17 -95
  216. package/vue/chunks/UiCluster.js +1 -1
  217. package/vue/chunks/UiCombobox.js +115 -326
  218. package/vue/chunks/UiContainer.js +1 -1
  219. package/vue/chunks/UiContextMenu.js +21 -113
  220. package/vue/chunks/UiDialog.js +20 -99
  221. package/vue/chunks/UiDisclosure.js +22 -112
  222. package/vue/chunks/UiEditable.js +32 -128
  223. package/vue/chunks/UiEditorInsertTableGrid.js +22 -116
  224. package/vue/chunks/UiEditorMentionMenu.js +18 -116
  225. package/vue/chunks/UiEditorSlashMenu.js +15 -101
  226. package/vue/chunks/UiEditorTableContextMenu.js +12 -91
  227. package/vue/chunks/UiEditorTableOverlay.js +29 -120
  228. package/vue/chunks/UiEditorTableToolbar.js +16 -111
  229. package/vue/chunks/UiEditorToolbar.js +1 -1
  230. package/vue/chunks/UiFloatingActionButton.js +1 -1
  231. package/vue/chunks/UiFormField.js +8 -73
  232. package/vue/chunks/UiGrid.js +1 -1
  233. package/vue/chunks/UiIcon.js +9 -78
  234. package/vue/chunks/UiIconButton.js +8 -73
  235. package/vue/chunks/UiInput.js +8 -73
  236. package/vue/chunks/UiMenu.js +25 -111
  237. package/vue/chunks/UiMenuItem.js +1 -1
  238. package/vue/chunks/UiPopover.js +18 -105
  239. package/vue/chunks/UiRadio.js +17 -95
  240. package/vue/chunks/UiRadioGroup.js +23 -105
  241. package/vue/chunks/UiReel.js +1 -1
  242. package/vue/chunks/UiSearchResultRow.js +1 -1
  243. package/vue/chunks/UiSearchShell.js +17 -94
  244. package/vue/chunks/UiSelect.js +8 -79
  245. package/vue/chunks/UiSeparator.js +1 -1
  246. package/vue/chunks/UiSidebar.js +23 -108
  247. package/vue/chunks/UiStack.js +1 -1
  248. package/vue/chunks/UiSwitch.js +17 -95
  249. package/vue/chunks/UiSwitcher.js +1 -1
  250. package/vue/chunks/UiTabs.js +22 -103
  251. package/vue/chunks/UiTextarea.js +8 -73
  252. package/vue/chunks/UiToastRegion.js +27 -112
  253. package/vue/chunks/UiTooltip.js +18 -106
  254. package/vue/chunks/UiTopBar.js +1 -1
  255. package/vue/chunks/UiTree.js +31 -109
  256. package/vue/chunks/UiTreeItem.js +29 -119
  257. package/vue/chunks/host.js +101 -0
  258. package/vue/components.css +844 -797
  259. package/vue/host.ts +154 -0
@@ -1,7 +1,8 @@
1
- <!-- Generated by HTML Next 1.0.0-alpha.2 for Vue 3.5. Do not edit. -->
1
+ <!-- Generated by HTML Next 1.0.0-alpha.3 for Vue 3.5. Do not edit. -->
2
2
  <script setup lang="ts">
3
- import { computed, onBeforeUnmount, onMounted, ref, shallowRef, watchEffect } from 'vue'
3
+ import { ref } from 'vue'
4
4
  import * as controllerModule from '../components/ui-editor-table-toolbar/ui-editor-table-toolbar.js'
5
+ import { createDispatch, useComponentHost } from './host'
5
6
  import UiIcon from './UiIcon.vue'
6
7
 
7
8
  defineOptions({ inheritAttrs: false })
@@ -81,148 +82,39 @@ const sections = ref<
81
82
  const hasOverflow = ref(false)
82
83
  const overflowOpen = ref(false)
83
84
 
84
- /** Dispatches a component event to Vue listeners and, for controllers and page code, on the root. */
85
- function dispatch(name: string, detail?: unknown): boolean {
86
- const declared: Record<string, EventInit | undefined> = {
87
- action: { bubbles: true, composed: true, cancelable: false },
88
- }
89
- const checks: Record<string, (detail: unknown) => boolean> = {
90
- action: (detail) =>
91
- detail !== null && typeof detail === 'object' && !Array.isArray(detail)
92
- && ((detail as Record<string, unknown>)['action'] === 'align-left'
93
- || (detail as Record<string, unknown>)['action'] === 'align-center'
94
- || (detail as Record<string, unknown>)['action'] === 'align-right'
95
- || (detail as Record<string, unknown>)['action'] === 'background-none'
96
- || (detail as Record<string, unknown>)['action'] === 'background-gray'
97
- || (detail as Record<string, unknown>)['action'] === 'background-yellow'
98
- || (detail as Record<string, unknown>)['action'] === 'background-blue'
99
- || (detail as Record<string, unknown>)['action'] === 'background-green'
100
- || (detail as Record<string, unknown>)['action'] === 'background-red'
101
- || (detail as Record<string, unknown>)['action'] === 'add-row-before'
102
- || (detail as Record<string, unknown>)['action'] === 'add-row-after'
103
- || (detail as Record<string, unknown>)['action'] === 'add-column-before'
104
- || (detail as Record<string, unknown>)['action'] === 'add-column-after'
105
- || (detail as Record<string, unknown>)['action'] === 'clear-cells'
106
- || (detail as Record<string, unknown>)['action'] === 'merge-cells'
107
- || (detail as Record<string, unknown>)['action'] === 'split-cell'
108
- || (detail as Record<string, unknown>)['action'] === 'delete-row'
109
- || (detail as Record<string, unknown>)['action'] === 'delete-column'
110
- || (detail as Record<string, unknown>)['action'] === 'delete-table')
111
- && Object.keys(detail as object).every((key) => ['action'].includes(key)),
112
- }
113
- if (detail !== undefined && checks[name] !== undefined && !checks[name]!(detail)) {
114
- throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`)
115
- }
116
- const emitEvent = emit as (name: string, detail: unknown) => void
117
- emitEvent(name, detail)
118
- return root.value?.dispatchEvent(
119
- new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail }),
120
- ) ?? true
121
- }
122
-
123
- function read(name: string): unknown {
124
- if (name === 'alignments') return alignments.value
125
- if (name === 'structure') return structure.value
126
- if (name === 'swatches') return swatches.value
127
- if (name === 'sections') return sections.value
128
- if (name === 'hasOverflow') return hasOverflow.value
129
- if (name === 'overflowOpen') return overflowOpen.value
130
- return (props as Record<string, unknown>)[name]
131
- }
132
-
133
- function write(name: string, value: unknown): boolean {
134
- if (name === 'alignments') {
135
- alignments.value = value as never
136
- return true
137
- }
138
- if (name === 'structure') {
139
- structure.value = value as never
140
- return true
141
- }
142
- if (name === 'swatches') {
143
- swatches.value = value as never
144
- return true
145
- }
146
- if (name === 'sections') {
147
- sections.value = value as never
148
- return true
149
- }
150
- if (name === 'hasOverflow') {
151
- hasOverflow.value = value as never
152
- return true
153
- }
154
- if (name === 'overflowOpen') {
155
- overflowOpen.value = value as never
156
- return true
157
- }
158
- throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
159
- }
160
-
161
- const stops: Array<() => void> = []
162
- const host = {
163
- get element(): Element {
164
- return root.value as Element
165
- },
166
- state: new Proxy({} as Record<string, unknown>, {
167
- get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
168
- set: (_target, name, value) => typeof name === 'string' && write(name, value),
169
- }),
170
- refs: {} as Readonly<Record<string, Element>>,
171
- elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
172
- get: (_target, name) => {
173
- if (typeof name !== 'string' || root.value === null) return undefined
174
- const form = root.value instanceof HTMLFormElement
175
- ? root.value
176
- : root.value.querySelector('form')
177
- return form?.elements.namedItem(name)
178
- ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
179
- },
180
- }),
181
- signal<T>(initialValue: T) {
182
- const value = shallowRef(initialValue)
183
- return {
184
- get: (): T => value.value,
185
- set: (next: T): void => {
186
- if (!Object.is(value.value, next)) value.value = next
187
- },
188
- update: (next: (current: T) => T): void => {
189
- const updated = next(value.value)
190
- if (!Object.is(value.value, updated)) value.value = updated
191
- },
192
- }
85
+ const isActionDetail = (detail: unknown): boolean =>
86
+ detail !== null && typeof detail === 'object' && !Array.isArray(detail)
87
+ && ((detail as Record<string, unknown>)['action'] === 'align-left'
88
+ || (detail as Record<string, unknown>)['action'] === 'align-center'
89
+ || (detail as Record<string, unknown>)['action'] === 'align-right'
90
+ || (detail as Record<string, unknown>)['action'] === 'background-none'
91
+ || (detail as Record<string, unknown>)['action'] === 'background-gray'
92
+ || (detail as Record<string, unknown>)['action'] === 'background-yellow'
93
+ || (detail as Record<string, unknown>)['action'] === 'background-blue'
94
+ || (detail as Record<string, unknown>)['action'] === 'background-green'
95
+ || (detail as Record<string, unknown>)['action'] === 'background-red'
96
+ || (detail as Record<string, unknown>)['action'] === 'add-row-before'
97
+ || (detail as Record<string, unknown>)['action'] === 'add-row-after'
98
+ || (detail as Record<string, unknown>)['action'] === 'add-column-before'
99
+ || (detail as Record<string, unknown>)['action'] === 'add-column-after'
100
+ || (detail as Record<string, unknown>)['action'] === 'clear-cells'
101
+ || (detail as Record<string, unknown>)['action'] === 'merge-cells'
102
+ || (detail as Record<string, unknown>)['action'] === 'split-cell'
103
+ || (detail as Record<string, unknown>)['action'] === 'delete-row'
104
+ || (detail as Record<string, unknown>)['action'] === 'delete-column'
105
+ || (detail as Record<string, unknown>)['action'] === 'delete-table')
106
+ && Object.keys(detail as object).every((key) => ['action'].includes(key))
107
+ const dispatch = createDispatch(root, emit as (name: string, detail: unknown) => void, {
108
+ checks: {
109
+ action: isActionDetail,
193
110
  },
194
- computed<T>(compute: () => T) {
195
- const value = computed(compute)
196
- return { get: (): T => value.value }
197
- },
198
- effect(run: () => void | (() => void)): () => void {
199
- const stop = watchEffect((onCleanup) => {
200
- const cleanup = run()
201
- if (typeof cleanup === 'function') onCleanup(cleanup)
202
- }, { flush: 'post' })
203
- stops.push(stop)
204
- return stop
205
- },
206
- on(event: string, listener: EventListener): () => void {
207
- const element = root.value
208
- element?.addEventListener(event, listener)
209
- const off = (): void => element?.removeEventListener(event, listener)
210
- stops.push(off)
211
- return off
212
- },
213
- dispatch,
214
- }
215
-
216
- let cleanup: void | (() => void)
217
- let ready: Promise<void> | undefined
218
- onMounted(() => {
219
- ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
220
- cleanup = result
221
- })
222
111
  })
223
- onBeforeUnmount(() => {
224
- for (const stop of stops.splice(0)) stop()
225
- if (typeof cleanup === 'function') cleanup()
112
+
113
+ useComponentHost(controllerModule.default, {
114
+ root,
115
+ dispatch,
116
+ props,
117
+ state: { alignments, structure, swatches, sections, hasOverflow, overflowOpen },
226
118
  })
227
119
  </script>
228
120
 
@@ -1,4 +1,4 @@
1
- <!-- Generated by HTML Next 1.0.0-alpha.2 for Vue 3.5. Do not edit. -->
1
+ <!-- Generated by HTML Next 1.0.0-alpha.3 for Vue 3.5. Do not edit. -->
2
2
  <script setup lang="ts">
3
3
  import { computed } from 'vue'
4
4
 
@@ -1,4 +1,4 @@
1
- <!-- Generated by HTML Next 1.0.0-alpha.2 for Vue 3.5. Do not edit. -->
1
+ <!-- Generated by HTML Next 1.0.0-alpha.3 for Vue 3.5. Do not edit. -->
2
2
  <script setup lang="ts">
3
3
  import { computed } from 'vue'
4
4
 
@@ -1,7 +1,8 @@
1
- <!-- Generated by HTML Next 1.0.0-alpha.2 for Vue 3.5. Do not edit. -->
1
+ <!-- Generated by HTML Next 1.0.0-alpha.3 for Vue 3.5. Do not edit. -->
2
2
  <script setup lang="ts">
3
- import { computed, onBeforeUnmount, onMounted, ref, shallowRef, watchEffect } from 'vue'
3
+ import { ref } from 'vue'
4
4
  import * as controllerModule from '../components/ui-form-field/ui-form-field.js'
5
+ import { createDispatch, useComponentHost } from './host'
5
6
 
6
7
  defineOptions({ inheritAttrs: false })
7
8
 
@@ -20,85 +21,12 @@ const props = withDefaults(
20
21
 
21
22
  const root = ref<HTMLElement | null>(null)
22
23
 
23
- /** Dispatches a component event to Vue listeners and, for controllers and page code, on the root. */
24
- function dispatch(name: string, detail?: unknown): boolean {
25
- return root.value?.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, detail }))
26
- ?? true
27
- }
28
-
29
- function read(name: string): unknown {
30
- return (props as Record<string, unknown>)[name]
31
- }
24
+ const dispatch = createDispatch(root)
32
25
 
33
- function write(name: string, value: unknown): boolean {
34
- throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
35
- }
36
-
37
- const stops: Array<() => void> = []
38
- const host = {
39
- get element(): Element {
40
- return root.value as Element
41
- },
42
- state: new Proxy({} as Record<string, unknown>, {
43
- get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
44
- set: (_target, name, value) => typeof name === 'string' && write(name, value),
45
- }),
46
- refs: {} as Readonly<Record<string, Element>>,
47
- elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
48
- get: (_target, name) => {
49
- if (typeof name !== 'string' || root.value === null) return undefined
50
- const form = root.value instanceof HTMLFormElement
51
- ? root.value
52
- : root.value.querySelector('form')
53
- return form?.elements.namedItem(name)
54
- ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
55
- },
56
- }),
57
- signal<T>(initialValue: T) {
58
- const value = shallowRef(initialValue)
59
- return {
60
- get: (): T => value.value,
61
- set: (next: T): void => {
62
- if (!Object.is(value.value, next)) value.value = next
63
- },
64
- update: (next: (current: T) => T): void => {
65
- const updated = next(value.value)
66
- if (!Object.is(value.value, updated)) value.value = updated
67
- },
68
- }
69
- },
70
- computed<T>(compute: () => T) {
71
- const value = computed(compute)
72
- return { get: (): T => value.value }
73
- },
74
- effect(run: () => void | (() => void)): () => void {
75
- const stop = watchEffect((onCleanup) => {
76
- const cleanup = run()
77
- if (typeof cleanup === 'function') onCleanup(cleanup)
78
- }, { flush: 'post' })
79
- stops.push(stop)
80
- return stop
81
- },
82
- on(event: string, listener: EventListener): () => void {
83
- const element = root.value
84
- element?.addEventListener(event, listener)
85
- const off = (): void => element?.removeEventListener(event, listener)
86
- stops.push(off)
87
- return off
88
- },
26
+ useComponentHost(controllerModule.default, {
27
+ root,
89
28
  dispatch,
90
- }
91
-
92
- let cleanup: void | (() => void)
93
- let ready: Promise<void> | undefined
94
- onMounted(() => {
95
- ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
96
- cleanup = result
97
- })
98
- })
99
- onBeforeUnmount(() => {
100
- for (const stop of stops.splice(0)) stop()
101
- if (typeof cleanup === 'function') cleanup()
29
+ props,
102
30
  })
103
31
  </script>
104
32
 
package/vue/UiGrid.vue CHANGED
@@ -1,4 +1,4 @@
1
- <!-- Generated by HTML Next 1.0.0-alpha.2 for Vue 3.5. Do not edit. -->
1
+ <!-- Generated by HTML Next 1.0.0-alpha.3 for Vue 3.5. Do not edit. -->
2
2
  <script setup lang="ts">
3
3
  import { computed } from 'vue'
4
4
 
package/vue/UiIcon.vue CHANGED
@@ -1,7 +1,8 @@
1
- <!-- Generated by HTML Next 1.0.0-alpha.2 for Vue 3.5. Do not edit. -->
1
+ <!-- Generated by HTML Next 1.0.0-alpha.3 for Vue 3.5. Do not edit. -->
2
2
  <script setup lang="ts">
3
- import { computed, onBeforeUnmount, onMounted, ref, shallowRef, watchEffect } from 'vue'
3
+ import { ref } from 'vue'
4
4
  import * as controllerModule from '../components/ui-icon/ui-icon.js'
5
+ import { createDispatch, useComponentHost } from './host'
5
6
 
6
7
  defineOptions({ inheritAttrs: false })
7
8
 
@@ -30,90 +31,13 @@ const shapes = ref<
30
31
  }[]
31
32
  >([])
32
33
 
33
- /** Dispatches a component event to Vue listeners and, for controllers and page code, on the root. */
34
- function dispatch(name: string, detail?: unknown): boolean {
35
- return root.value?.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, detail }))
36
- ?? true
37
- }
38
-
39
- function read(name: string): unknown {
40
- if (name === 'shapes') return shapes.value
41
- return (props as Record<string, unknown>)[name]
42
- }
34
+ const dispatch = createDispatch(root)
43
35
 
44
- function write(name: string, value: unknown): boolean {
45
- if (name === 'shapes') {
46
- shapes.value = value as never
47
- return true
48
- }
49
- throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
50
- }
51
-
52
- const stops: Array<() => void> = []
53
- const host = {
54
- get element(): Element {
55
- return root.value as Element
56
- },
57
- state: new Proxy({} as Record<string, unknown>, {
58
- get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
59
- set: (_target, name, value) => typeof name === 'string' && write(name, value),
60
- }),
61
- refs: {} as Readonly<Record<string, Element>>,
62
- elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
63
- get: (_target, name) => {
64
- if (typeof name !== 'string' || root.value === null) return undefined
65
- const form = root.value instanceof HTMLFormElement
66
- ? root.value
67
- : root.value.querySelector('form')
68
- return form?.elements.namedItem(name)
69
- ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
70
- },
71
- }),
72
- signal<T>(initialValue: T) {
73
- const value = shallowRef(initialValue)
74
- return {
75
- get: (): T => value.value,
76
- set: (next: T): void => {
77
- if (!Object.is(value.value, next)) value.value = next
78
- },
79
- update: (next: (current: T) => T): void => {
80
- const updated = next(value.value)
81
- if (!Object.is(value.value, updated)) value.value = updated
82
- },
83
- }
84
- },
85
- computed<T>(compute: () => T) {
86
- const value = computed(compute)
87
- return { get: (): T => value.value }
88
- },
89
- effect(run: () => void | (() => void)): () => void {
90
- const stop = watchEffect((onCleanup) => {
91
- const cleanup = run()
92
- if (typeof cleanup === 'function') onCleanup(cleanup)
93
- }, { flush: 'post' })
94
- stops.push(stop)
95
- return stop
96
- },
97
- on(event: string, listener: EventListener): () => void {
98
- const element = root.value
99
- element?.addEventListener(event, listener)
100
- const off = (): void => element?.removeEventListener(event, listener)
101
- stops.push(off)
102
- return off
103
- },
36
+ useComponentHost(controllerModule.default, {
37
+ root,
104
38
  dispatch,
105
- }
106
-
107
- let cleanup: void | (() => void)
108
- let ready: Promise<void> | undefined
109
- onMounted(() => {
110
- ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
111
- cleanup = result
112
- })
113
- })
114
- onBeforeUnmount(() => {
115
- for (const stop of stops.splice(0)) stop()
116
- if (typeof cleanup === 'function') cleanup()
39
+ props,
40
+ state: { shapes },
117
41
  })
118
42
  </script>
119
43
 
@@ -1,7 +1,8 @@
1
- <!-- Generated by HTML Next 1.0.0-alpha.2 for Vue 3.5. Do not edit. -->
1
+ <!-- Generated by HTML Next 1.0.0-alpha.3 for Vue 3.5. Do not edit. -->
2
2
  <script setup lang="ts">
3
- import { computed, onBeforeUnmount, onMounted, ref, shallowRef, watchEffect } from 'vue'
3
+ import { computed, ref } from 'vue'
4
4
  import * as controllerModule from '../components/ui-icon-button/ui-icon-button.js'
5
+ import { createDispatch, useComponentHost } from './host'
5
6
 
6
7
  defineOptions({ inheritAttrs: false })
7
8
 
@@ -35,85 +36,12 @@ const hostState = computed(() =>
35
36
  ].filter(Boolean).join(' ')
36
37
  )
37
38
 
38
- /** Dispatches a component event to Vue listeners and, for controllers and page code, on the root. */
39
- function dispatch(name: string, detail?: unknown): boolean {
40
- return root.value?.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, detail }))
41
- ?? true
42
- }
43
-
44
- function read(name: string): unknown {
45
- return (props as Record<string, unknown>)[name]
46
- }
39
+ const dispatch = createDispatch(root)
47
40
 
48
- function write(name: string, value: unknown): boolean {
49
- throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
50
- }
51
-
52
- const stops: Array<() => void> = []
53
- const host = {
54
- get element(): Element {
55
- return root.value as Element
56
- },
57
- state: new Proxy({} as Record<string, unknown>, {
58
- get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
59
- set: (_target, name, value) => typeof name === 'string' && write(name, value),
60
- }),
61
- refs: {} as Readonly<Record<string, Element>>,
62
- elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
63
- get: (_target, name) => {
64
- if (typeof name !== 'string' || root.value === null) return undefined
65
- const form = root.value instanceof HTMLFormElement
66
- ? root.value
67
- : root.value.querySelector('form')
68
- return form?.elements.namedItem(name)
69
- ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
70
- },
71
- }),
72
- signal<T>(initialValue: T) {
73
- const value = shallowRef(initialValue)
74
- return {
75
- get: (): T => value.value,
76
- set: (next: T): void => {
77
- if (!Object.is(value.value, next)) value.value = next
78
- },
79
- update: (next: (current: T) => T): void => {
80
- const updated = next(value.value)
81
- if (!Object.is(value.value, updated)) value.value = updated
82
- },
83
- }
84
- },
85
- computed<T>(compute: () => T) {
86
- const value = computed(compute)
87
- return { get: (): T => value.value }
88
- },
89
- effect(run: () => void | (() => void)): () => void {
90
- const stop = watchEffect((onCleanup) => {
91
- const cleanup = run()
92
- if (typeof cleanup === 'function') onCleanup(cleanup)
93
- }, { flush: 'post' })
94
- stops.push(stop)
95
- return stop
96
- },
97
- on(event: string, listener: EventListener): () => void {
98
- const element = root.value
99
- element?.addEventListener(event, listener)
100
- const off = (): void => element?.removeEventListener(event, listener)
101
- stops.push(off)
102
- return off
103
- },
41
+ useComponentHost(controllerModule.default, {
42
+ root,
104
43
  dispatch,
105
- }
106
-
107
- let cleanup: void | (() => void)
108
- let ready: Promise<void> | undefined
109
- onMounted(() => {
110
- ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
111
- cleanup = result
112
- })
113
- })
114
- onBeforeUnmount(() => {
115
- for (const stop of stops.splice(0)) stop()
116
- if (typeof cleanup === 'function') cleanup()
44
+ props,
117
45
  })
118
46
  </script>
119
47
 
package/vue/UiInput.vue CHANGED
@@ -1,7 +1,8 @@
1
- <!-- Generated by HTML Next 1.0.0-alpha.2 for Vue 3.5. Do not edit. -->
1
+ <!-- Generated by HTML Next 1.0.0-alpha.3 for Vue 3.5. Do not edit. -->
2
2
  <script setup lang="ts">
3
- import { computed, onBeforeUnmount, onMounted, ref, shallowRef, watchEffect } from 'vue'
3
+ import { computed, ref } from 'vue'
4
4
  import * as controllerModule from '../components/ui-input/ui-input.js'
5
+ import { createDispatch, useComponentHost } from './host'
5
6
 
6
7
  defineOptions({ inheritAttrs: false })
7
8
 
@@ -31,85 +32,12 @@ const model = computed({
31
32
 
32
33
  const root = ref<HTMLElement | null>(null)
33
34
 
34
- /** Dispatches a component event to Vue listeners and, for controllers and page code, on the root. */
35
- function dispatch(name: string, detail?: unknown): boolean {
36
- return root.value?.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, detail }))
37
- ?? true
38
- }
39
-
40
- function read(name: string): unknown {
41
- return (props as Record<string, unknown>)[name]
42
- }
35
+ const dispatch = createDispatch(root)
43
36
 
44
- function write(name: string, value: unknown): boolean {
45
- throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
46
- }
47
-
48
- const stops: Array<() => void> = []
49
- const host = {
50
- get element(): Element {
51
- return root.value as Element
52
- },
53
- state: new Proxy({} as Record<string, unknown>, {
54
- get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
55
- set: (_target, name, value) => typeof name === 'string' && write(name, value),
56
- }),
57
- refs: {} as Readonly<Record<string, Element>>,
58
- elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
59
- get: (_target, name) => {
60
- if (typeof name !== 'string' || root.value === null) return undefined
61
- const form = root.value instanceof HTMLFormElement
62
- ? root.value
63
- : root.value.querySelector('form')
64
- return form?.elements.namedItem(name)
65
- ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
66
- },
67
- }),
68
- signal<T>(initialValue: T) {
69
- const value = shallowRef(initialValue)
70
- return {
71
- get: (): T => value.value,
72
- set: (next: T): void => {
73
- if (!Object.is(value.value, next)) value.value = next
74
- },
75
- update: (next: (current: T) => T): void => {
76
- const updated = next(value.value)
77
- if (!Object.is(value.value, updated)) value.value = updated
78
- },
79
- }
80
- },
81
- computed<T>(compute: () => T) {
82
- const value = computed(compute)
83
- return { get: (): T => value.value }
84
- },
85
- effect(run: () => void | (() => void)): () => void {
86
- const stop = watchEffect((onCleanup) => {
87
- const cleanup = run()
88
- if (typeof cleanup === 'function') onCleanup(cleanup)
89
- }, { flush: 'post' })
90
- stops.push(stop)
91
- return stop
92
- },
93
- on(event: string, listener: EventListener): () => void {
94
- const element = root.value
95
- element?.addEventListener(event, listener)
96
- const off = (): void => element?.removeEventListener(event, listener)
97
- stops.push(off)
98
- return off
99
- },
37
+ useComponentHost(controllerModule.default, {
38
+ root,
100
39
  dispatch,
101
- }
102
-
103
- let cleanup: void | (() => void)
104
- let ready: Promise<void> | undefined
105
- onMounted(() => {
106
- ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
107
- cleanup = result
108
- })
109
- })
110
- onBeforeUnmount(() => {
111
- for (const stop of stops.splice(0)) stop()
112
- if (typeof cleanup === 'function') cleanup()
40
+ props,
113
41
  })
114
42
  </script>
115
43