@threadlabs/looma 0.6.4 → 0.6.5

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