@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.
- package/components/ui-button/ui-button.html +103 -81
- package/components/ui-checkbox/ui-checkbox.html +4 -1
- package/components/ui-combobox/ui-combobox.html +40 -3
- package/components/ui-combobox/ui-combobox.js +27 -5
- package/components/ui-select/ui-select.html +3 -5
- package/dist/index.js +1 -1
- package/package.json +2 -2
- package/styles/ui-affordance-scope.css +1 -1
- package/styles/ui-avatar-group.css +1 -1
- package/styles/ui-avatar.css +1 -1
- package/styles/ui-badge.css +1 -1
- package/styles/ui-button.css +112 -80
- package/styles/ui-callout.css +1 -1
- package/styles/ui-checkbox.css +5 -2
- package/styles/ui-cluster.css +1 -1
- package/styles/ui-combobox.css +38 -1
- package/styles/ui-container.css +1 -1
- package/styles/ui-context-menu.css +1 -1
- package/styles/ui-dialog.css +1 -1
- package/styles/ui-disclosure.css +1 -1
- package/styles/ui-editable.css +1 -1
- package/styles/ui-editor-insert-table-grid.css +1 -1
- package/styles/ui-editor-mention-menu.css +1 -1
- package/styles/ui-editor-slash-menu.css +1 -1
- package/styles/ui-editor-table-context-menu.css +1 -1
- package/styles/ui-editor-table-overlay.css +1 -1
- package/styles/ui-editor-table-toolbar.css +1 -1
- package/styles/ui-editor-toolbar.css +1 -1
- package/styles/ui-floating-action-button.css +1 -1
- package/styles/ui-form-field.css +1 -1
- package/styles/ui-grid.css +1 -1
- package/styles/ui-icon-button.css +1 -1
- package/styles/ui-icon.css +1 -1
- package/styles/ui-input.css +1 -1
- package/styles/ui-menu-item.css +1 -1
- package/styles/ui-menu.css +1 -1
- package/styles/ui-popover.css +1 -1
- package/styles/ui-radio-group.css +1 -1
- package/styles/ui-radio.css +1 -1
- package/styles/ui-reel.css +1 -1
- package/styles/ui-search-result-row.css +1 -1
- package/styles/ui-search-shell.css +1 -1
- package/styles/ui-select.css +4 -5
- package/styles/ui-separator.css +1 -1
- package/styles/ui-sidebar.css +1 -1
- package/styles/ui-stack.css +1 -1
- package/styles/ui-switch.css +1 -1
- package/styles/ui-switcher.css +1 -1
- package/styles/ui-tabs.css +1 -1
- package/styles/ui-textarea.css +1 -1
- package/styles/ui-toast-region.css +1 -1
- package/styles/ui-tooltip.css +1 -1
- package/styles/ui-top-bar.css +1 -1
- package/styles/ui-tree-item.css +1 -1
- package/styles/ui-tree.css +1 -1
- package/theme-dark.css +6 -30
- package/theme-high-contrast.css +30 -20
- package/theme-light.css +2 -16
- package/tokens.css +33 -24
- package/vanilla/UiAffordanceScope.d.ts +1 -1
- package/vanilla/UiAffordanceScope.js +1 -1
- package/vanilla/UiAvatar.d.ts +1 -1
- package/vanilla/UiAvatar.js +1 -1
- package/vanilla/UiAvatarGroup.d.ts +1 -1
- package/vanilla/UiAvatarGroup.js +1 -1
- package/vanilla/UiBadge.d.ts +1 -1
- package/vanilla/UiBadge.js +1 -1
- package/vanilla/UiButton.d.ts +2 -2
- package/vanilla/UiButton.js +2 -2
- package/vanilla/UiCallout.d.ts +1 -1
- package/vanilla/UiCallout.js +1 -1
- package/vanilla/UiCheckbox.d.ts +1 -1
- package/vanilla/UiCheckbox.js +1 -1
- package/vanilla/UiCluster.d.ts +1 -1
- package/vanilla/UiCluster.js +1 -1
- package/vanilla/UiCombobox.d.ts +1 -1
- package/vanilla/UiCombobox.js +2 -2
- package/vanilla/UiContainer.d.ts +1 -1
- package/vanilla/UiContainer.js +1 -1
- package/vanilla/UiContextMenu.d.ts +1 -1
- package/vanilla/UiContextMenu.js +1 -1
- package/vanilla/UiDialog.d.ts +1 -1
- package/vanilla/UiDialog.js +1 -1
- package/vanilla/UiDisclosure.d.ts +1 -1
- package/vanilla/UiDisclosure.js +1 -1
- package/vanilla/UiEditable.d.ts +1 -1
- package/vanilla/UiEditable.js +1 -1
- package/vanilla/UiEditorInsertTableGrid.d.ts +1 -1
- package/vanilla/UiEditorInsertTableGrid.js +1 -1
- package/vanilla/UiEditorMentionMenu.d.ts +1 -1
- package/vanilla/UiEditorMentionMenu.js +1 -1
- package/vanilla/UiEditorSlashMenu.d.ts +1 -1
- package/vanilla/UiEditorSlashMenu.js +1 -1
- package/vanilla/UiEditorTableContextMenu.d.ts +1 -1
- package/vanilla/UiEditorTableContextMenu.js +1 -1
- package/vanilla/UiEditorTableOverlay.d.ts +1 -1
- package/vanilla/UiEditorTableOverlay.js +1 -1
- package/vanilla/UiEditorTableToolbar.d.ts +1 -1
- package/vanilla/UiEditorTableToolbar.js +1 -1
- package/vanilla/UiEditorToolbar.d.ts +1 -1
- package/vanilla/UiEditorToolbar.js +1 -1
- package/vanilla/UiFloatingActionButton.d.ts +1 -1
- package/vanilla/UiFloatingActionButton.js +1 -1
- package/vanilla/UiFormField.d.ts +1 -1
- package/vanilla/UiFormField.js +1 -1
- package/vanilla/UiGrid.d.ts +1 -1
- package/vanilla/UiGrid.js +1 -1
- package/vanilla/UiIcon.d.ts +1 -1
- package/vanilla/UiIcon.js +1 -1
- package/vanilla/UiIconButton.d.ts +1 -1
- package/vanilla/UiIconButton.js +1 -1
- package/vanilla/UiInput.d.ts +1 -1
- package/vanilla/UiInput.js +1 -1
- package/vanilla/UiMenu.d.ts +1 -1
- package/vanilla/UiMenu.js +1 -1
- package/vanilla/UiMenuItem.d.ts +1 -1
- package/vanilla/UiMenuItem.js +1 -1
- package/vanilla/UiPopover.d.ts +1 -1
- package/vanilla/UiPopover.js +1 -1
- package/vanilla/UiRadio.d.ts +1 -1
- package/vanilla/UiRadio.js +1 -1
- package/vanilla/UiRadioGroup.d.ts +1 -1
- package/vanilla/UiRadioGroup.js +1 -1
- package/vanilla/UiReel.d.ts +1 -1
- package/vanilla/UiReel.js +1 -1
- package/vanilla/UiSearchResultRow.d.ts +1 -1
- package/vanilla/UiSearchResultRow.js +1 -1
- package/vanilla/UiSearchShell.d.ts +1 -1
- package/vanilla/UiSearchShell.js +1 -1
- package/vanilla/UiSelect.d.ts +1 -2
- package/vanilla/UiSelect.js +4 -7
- package/vanilla/UiSeparator.d.ts +1 -1
- package/vanilla/UiSeparator.js +1 -1
- package/vanilla/UiSidebar.d.ts +1 -1
- package/vanilla/UiSidebar.js +1 -1
- package/vanilla/UiStack.d.ts +1 -1
- package/vanilla/UiStack.js +1 -1
- package/vanilla/UiSwitch.d.ts +1 -1
- package/vanilla/UiSwitch.js +1 -1
- package/vanilla/UiSwitcher.d.ts +1 -1
- package/vanilla/UiSwitcher.js +1 -1
- package/vanilla/UiTabs.d.ts +1 -1
- package/vanilla/UiTabs.js +1 -1
- package/vanilla/UiTextarea.d.ts +1 -1
- package/vanilla/UiTextarea.js +1 -1
- package/vanilla/UiToastRegion.d.ts +1 -1
- package/vanilla/UiToastRegion.js +1 -1
- package/vanilla/UiTooltip.d.ts +1 -1
- package/vanilla/UiTooltip.js +1 -1
- package/vanilla/UiTopBar.d.ts +1 -1
- package/vanilla/UiTopBar.js +1 -1
- package/vanilla/UiTree.d.ts +1 -1
- package/vanilla/UiTree.js +1 -1
- package/vanilla/UiTreeItem.d.ts +1 -1
- package/vanilla/UiTreeItem.js +1 -1
- package/vue/UiAffordanceScope.vue +8 -84
- package/vue/UiAvatar.d.ts +1 -1
- package/vue/UiAvatar.vue +9 -106
- package/vue/UiAvatarGroup.vue +9 -96
- package/vue/UiBadge.vue +1 -1
- package/vue/UiButton.d.ts +2 -2
- package/vue/UiButton.vue +104 -97
- package/vue/UiCallout.vue +1 -1
- package/vue/UiCheckbox.vue +26 -124
- package/vue/UiCluster.vue +1 -1
- package/vue/UiCombobox.d.ts +1 -1
- package/vue/UiCombobox.vue +270 -479
- package/vue/UiContainer.vue +1 -1
- package/vue/UiContextMenu.vue +34 -141
- package/vue/UiDialog.vue +25 -126
- package/vue/UiDisclosure.vue +26 -138
- package/vue/UiEditable.vue +46 -158
- package/vue/UiEditorInsertTableGrid.vue +19 -138
- package/vue/UiEditorMentionMenu.vue +17 -124
- package/vue/UiEditorSlashMenu.vue +17 -109
- package/vue/UiEditorTableContextMenu.vue +34 -122
- package/vue/UiEditorTableOverlay.vue +61 -167
- package/vue/UiEditorTableToolbar.vue +34 -142
- package/vue/UiEditorToolbar.vue +1 -1
- package/vue/UiFloatingActionButton.vue +1 -1
- package/vue/UiFormField.vue +7 -79
- package/vue/UiGrid.vue +1 -1
- package/vue/UiIcon.vue +8 -84
- package/vue/UiIconButton.vue +7 -79
- package/vue/UiInput.vue +7 -79
- package/vue/UiMenu.vue +42 -127
- package/vue/UiMenuItem.vue +1 -1
- package/vue/UiPopover.vue +25 -121
- package/vue/UiRadio.vue +22 -123
- package/vue/UiRadioGroup.d.ts +1 -1
- package/vue/UiRadioGroup.vue +32 -119
- package/vue/UiReel.vue +1 -1
- package/vue/UiSearchResultRow.vue +1 -1
- package/vue/UiSearchShell.vue +25 -121
- package/vue/UiSelect.d.ts +0 -2
- package/vue/UiSelect.vue +9 -85
- package/vue/UiSeparator.vue +1 -1
- package/vue/UiSidebar.vue +32 -133
- package/vue/UiStack.vue +1 -1
- package/vue/UiSwitch.vue +22 -123
- package/vue/UiSwitcher.vue +1 -1
- package/vue/UiTabs.vue +24 -128
- package/vue/UiTextarea.vue +7 -79
- package/vue/UiToastRegion.vue +37 -126
- package/vue/UiTooltip.vue +25 -124
- package/vue/UiTopBar.vue +1 -1
- package/vue/UiTree.vue +56 -137
- package/vue/UiTreeItem.vue +28 -144
- package/vue/chunks/UiAffordanceScope.js +9 -78
- package/vue/chunks/UiAvatar.js +13 -89
- package/vue/chunks/UiAvatarGroup.js +10 -80
- package/vue/chunks/UiBadge.js +1 -1
- package/vue/chunks/UiButton.js +3 -3
- package/vue/chunks/UiCallout.js +1 -1
- package/vue/chunks/UiCheckbox.js +17 -95
- package/vue/chunks/UiCluster.js +1 -1
- package/vue/chunks/UiCombobox.js +115 -326
- package/vue/chunks/UiContainer.js +1 -1
- package/vue/chunks/UiContextMenu.js +21 -113
- package/vue/chunks/UiDialog.js +20 -99
- package/vue/chunks/UiDisclosure.js +22 -112
- package/vue/chunks/UiEditable.js +32 -128
- package/vue/chunks/UiEditorInsertTableGrid.js +22 -116
- package/vue/chunks/UiEditorMentionMenu.js +18 -116
- package/vue/chunks/UiEditorSlashMenu.js +15 -101
- package/vue/chunks/UiEditorTableContextMenu.js +12 -91
- package/vue/chunks/UiEditorTableOverlay.js +29 -120
- package/vue/chunks/UiEditorTableToolbar.js +16 -111
- package/vue/chunks/UiEditorToolbar.js +1 -1
- package/vue/chunks/UiFloatingActionButton.js +1 -1
- package/vue/chunks/UiFormField.js +8 -73
- package/vue/chunks/UiGrid.js +1 -1
- package/vue/chunks/UiIcon.js +9 -78
- package/vue/chunks/UiIconButton.js +8 -73
- package/vue/chunks/UiInput.js +8 -73
- package/vue/chunks/UiMenu.js +25 -111
- package/vue/chunks/UiMenuItem.js +1 -1
- package/vue/chunks/UiPopover.js +18 -105
- package/vue/chunks/UiRadio.js +17 -95
- package/vue/chunks/UiRadioGroup.js +23 -105
- package/vue/chunks/UiReel.js +1 -1
- package/vue/chunks/UiSearchResultRow.js +1 -1
- package/vue/chunks/UiSearchShell.js +17 -94
- package/vue/chunks/UiSelect.js +8 -79
- package/vue/chunks/UiSeparator.js +1 -1
- package/vue/chunks/UiSidebar.js +23 -108
- package/vue/chunks/UiStack.js +1 -1
- package/vue/chunks/UiSwitch.js +17 -95
- package/vue/chunks/UiSwitcher.js +1 -1
- package/vue/chunks/UiTabs.js +22 -103
- package/vue/chunks/UiTextarea.js +8 -73
- package/vue/chunks/UiToastRegion.js +27 -112
- package/vue/chunks/UiTooltip.js +18 -106
- package/vue/chunks/UiTopBar.js +1 -1
- package/vue/chunks/UiTree.js +31 -109
- package/vue/chunks/UiTreeItem.js +29 -119
- package/vue/chunks/host.js +101 -0
- package/vue/components.css +844 -797
- package/vue/host.ts +154 -0
package/vue/UiSidebar.vue
CHANGED
|
@@ -1,15 +1,8 @@
|
|
|
1
|
-
<!-- Generated by HTML Next 1.0.0-alpha.
|
|
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-sidebar/ui-sidebar.js'
|
|
5
|
+
import { createDispatch, useComponentHost } from './host'
|
|
13
6
|
|
|
14
7
|
defineOptions({ inheritAttrs: false })
|
|
15
8
|
|
|
@@ -64,131 +57,37 @@ const hostState = computed(() =>
|
|
|
64
57
|
].filter(Boolean).join(' ')
|
|
65
58
|
)
|
|
66
59
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|| (detail as Record<string, unknown>)['trigger'] === 'pointer'
|
|
89
|
-
|| (detail as Record<string, unknown>)['trigger'] === 'programmatic')
|
|
90
|
-
&& Object.keys(detail as object).every((key) => ['open', 'mode', 'trigger'].includes(key)),
|
|
91
|
-
}
|
|
92
|
-
if (detail !== undefined && checks[name] !== undefined && !checks[name]!(detail)) {
|
|
93
|
-
throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`)
|
|
94
|
-
}
|
|
95
|
-
const emitEvent = emit as (name: string, detail: unknown) => void
|
|
96
|
-
emitEvent(name, detail)
|
|
97
|
-
if (detail !== null && typeof detail === 'object' && 'width' in detail) {
|
|
98
|
-
emitEvent('update:width', (detail as Record<string, unknown>)['width'])
|
|
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 === 'internalCollapsed') return internalCollapsed.value
|
|
107
|
-
if (name === 'drawer') return drawer.value
|
|
108
|
-
return (props as Record<string, unknown>)[name]
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function write(name: string, value: unknown): boolean {
|
|
112
|
-
if (name === 'internalCollapsed') {
|
|
113
|
-
internalCollapsed.value = value as never
|
|
114
|
-
return true
|
|
115
|
-
}
|
|
116
|
-
if (name === 'drawer') {
|
|
117
|
-
drawer.value = value as never
|
|
118
|
-
return true
|
|
119
|
-
}
|
|
120
|
-
throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
const stops: Array<() => void> = []
|
|
124
|
-
const host = {
|
|
125
|
-
get element(): Element {
|
|
126
|
-
return root.value as Element
|
|
60
|
+
const isResizeDetail = (detail: unknown): boolean =>
|
|
61
|
+
detail !== null && typeof detail === 'object' && !Array.isArray(detail)
|
|
62
|
+
&& (typeof (detail as Record<string, unknown>)['width'] === 'number'
|
|
63
|
+
&& Number.isFinite((detail as Record<string, unknown>)['width']))
|
|
64
|
+
&& ((detail as Record<string, unknown>)['trigger'] === 'keyboard'
|
|
65
|
+
|| (detail as Record<string, unknown>)['trigger'] === 'pointer'
|
|
66
|
+
|| (detail as Record<string, unknown>)['trigger'] === 'programmatic')
|
|
67
|
+
&& Object.keys(detail as object).every((key) => ['width', 'trigger'].includes(key))
|
|
68
|
+
const isToggleDetail = (detail: unknown): boolean =>
|
|
69
|
+
detail !== null && typeof detail === 'object' && !Array.isArray(detail)
|
|
70
|
+
&& typeof (detail as Record<string, unknown>)['open'] === 'boolean'
|
|
71
|
+
&& ((detail as Record<string, unknown>)['mode'] === 'docked'
|
|
72
|
+
|| (detail as Record<string, unknown>)['mode'] === 'drawer')
|
|
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', 'mode', 'trigger'].includes(key))
|
|
77
|
+
const dispatch = createDispatch(root, emit as (name: string, detail: unknown) => void, {
|
|
78
|
+
checks: {
|
|
79
|
+
resize: isResizeDetail,
|
|
80
|
+
toggle: isToggleDetail,
|
|
127
81
|
},
|
|
128
|
-
|
|
129
|
-
get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
|
|
130
|
-
set: (_target, name, value) => typeof name === 'string' && write(name, value),
|
|
131
|
-
}),
|
|
132
|
-
refs: {
|
|
133
|
-
get resizer(): Element {
|
|
134
|
-
return resizerElement.value as Element
|
|
135
|
-
},
|
|
136
|
-
} as Readonly<Record<string, Element>>,
|
|
137
|
-
elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
|
|
138
|
-
get: (_target, name) => {
|
|
139
|
-
if (typeof name !== 'string' || root.value === null) return undefined
|
|
140
|
-
const form = root.value instanceof HTMLFormElement
|
|
141
|
-
? root.value
|
|
142
|
-
: root.value.querySelector('form')
|
|
143
|
-
return form?.elements.namedItem(name)
|
|
144
|
-
?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
|
|
145
|
-
},
|
|
146
|
-
}),
|
|
147
|
-
signal<T>(initialValue: T) {
|
|
148
|
-
const value = shallowRef(initialValue)
|
|
149
|
-
return {
|
|
150
|
-
get: (): T => value.value,
|
|
151
|
-
set: (next: T): void => {
|
|
152
|
-
if (!Object.is(value.value, next)) value.value = next
|
|
153
|
-
},
|
|
154
|
-
update: (next: (current: T) => T): void => {
|
|
155
|
-
const updated = next(value.value)
|
|
156
|
-
if (!Object.is(value.value, updated)) value.value = updated
|
|
157
|
-
},
|
|
158
|
-
}
|
|
159
|
-
},
|
|
160
|
-
computed<T>(compute: () => T) {
|
|
161
|
-
const value = computed(compute)
|
|
162
|
-
return { get: (): T => value.value }
|
|
163
|
-
},
|
|
164
|
-
effect(run: () => void | (() => void)): () => void {
|
|
165
|
-
const stop = watchEffect((onCleanup) => {
|
|
166
|
-
const cleanup = run()
|
|
167
|
-
if (typeof cleanup === 'function') onCleanup(cleanup)
|
|
168
|
-
}, { flush: 'post' })
|
|
169
|
-
stops.push(stop)
|
|
170
|
-
return stop
|
|
171
|
-
},
|
|
172
|
-
on(event: string, listener: EventListener): () => void {
|
|
173
|
-
const element = root.value
|
|
174
|
-
element?.addEventListener(event, listener)
|
|
175
|
-
const off = (): void => element?.removeEventListener(event, listener)
|
|
176
|
-
stops.push(off)
|
|
177
|
-
return off
|
|
178
|
-
},
|
|
179
|
-
dispatch,
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
let cleanup: void | (() => void)
|
|
183
|
-
let ready: Promise<void> | undefined
|
|
184
|
-
onMounted(() => {
|
|
185
|
-
ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
|
|
186
|
-
cleanup = result
|
|
187
|
-
})
|
|
82
|
+
modeled: ['width'],
|
|
188
83
|
})
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
84
|
+
|
|
85
|
+
useComponentHost(controllerModule.default, {
|
|
86
|
+
root,
|
|
87
|
+
dispatch,
|
|
88
|
+
props,
|
|
89
|
+
refs: { resizer: resizerElement },
|
|
90
|
+
state: { internalCollapsed, drawer },
|
|
192
91
|
})
|
|
193
92
|
</script>
|
|
194
93
|
|
package/vue/UiStack.vue
CHANGED
package/vue/UiSwitch.vue
CHANGED
|
@@ -1,15 +1,8 @@
|
|
|
1
|
-
<!-- Generated by HTML Next 1.0.0-alpha.
|
|
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-switch/ui-switch.js'
|
|
5
|
+
import { createDispatch, useComponentHost } from './host'
|
|
13
6
|
|
|
14
7
|
defineOptions({ inheritAttrs: false })
|
|
15
8
|
|
|
@@ -50,121 +43,27 @@ const hostState = computed(() =>
|
|
|
50
43
|
].filter(Boolean).join(' ')
|
|
51
44
|
)
|
|
52
45
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|| (detail as Record<string, unknown>)['trigger'] === 'pointer'
|
|
65
|
-
|| (detail as Record<string, unknown>)['trigger'] === 'programmatic')
|
|
66
|
-
&& Object.keys(detail as object).every((key) =>
|
|
67
|
-
['checked', 'value', 'trigger'].includes(key)
|
|
68
|
-
),
|
|
69
|
-
}
|
|
70
|
-
if (detail !== undefined && checks[name] !== undefined && !checks[name]!(detail)) {
|
|
71
|
-
throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`)
|
|
72
|
-
}
|
|
73
|
-
const emitEvent = emit as (name: string, detail: unknown) => void
|
|
74
|
-
emitEvent(name, detail)
|
|
75
|
-
if (detail !== null && typeof detail === 'object' && 'checked' in detail) {
|
|
76
|
-
emitEvent('update:checked', (detail as Record<string, unknown>)['checked'])
|
|
77
|
-
}
|
|
78
|
-
if (detail !== null && typeof detail === 'object' && 'value' in detail) {
|
|
79
|
-
emitEvent('update:value', (detail as Record<string, unknown>)['value'])
|
|
80
|
-
}
|
|
81
|
-
return root.value?.dispatchEvent(
|
|
82
|
-
new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail }),
|
|
83
|
-
) ?? true
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function read(name: string): unknown {
|
|
87
|
-
if (name === 'internalChecked') return internalChecked.value
|
|
88
|
-
return (props as Record<string, unknown>)[name]
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
function write(name: string, value: unknown): boolean {
|
|
92
|
-
if (name === 'internalChecked') {
|
|
93
|
-
internalChecked.value = value as never
|
|
94
|
-
return true
|
|
95
|
-
}
|
|
96
|
-
throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const stops: Array<() => void> = []
|
|
100
|
-
const host = {
|
|
101
|
-
get element(): Element {
|
|
102
|
-
return root.value as Element
|
|
46
|
+
const isChangeDetail = (detail: unknown): boolean =>
|
|
47
|
+
detail !== null && typeof detail === 'object' && !Array.isArray(detail)
|
|
48
|
+
&& typeof (detail as Record<string, unknown>)['checked'] === 'boolean'
|
|
49
|
+
&& typeof (detail as Record<string, unknown>)['value'] === 'string'
|
|
50
|
+
&& ((detail as Record<string, unknown>)['trigger'] === 'keyboard'
|
|
51
|
+
|| (detail as Record<string, unknown>)['trigger'] === 'pointer'
|
|
52
|
+
|| (detail as Record<string, unknown>)['trigger'] === 'programmatic')
|
|
53
|
+
&& Object.keys(detail as object).every((key) => ['checked', 'value', 'trigger'].includes(key))
|
|
54
|
+
const dispatch = createDispatch(root, emit as (name: string, detail: unknown) => void, {
|
|
55
|
+
checks: {
|
|
56
|
+
change: isChangeDetail,
|
|
103
57
|
},
|
|
104
|
-
|
|
105
|
-
get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
|
|
106
|
-
set: (_target, name, value) => typeof name === 'string' && write(name, value),
|
|
107
|
-
}),
|
|
108
|
-
refs: {
|
|
109
|
-
get input(): Element {
|
|
110
|
-
return inputElement.value as Element
|
|
111
|
-
},
|
|
112
|
-
} as Readonly<Record<string, Element>>,
|
|
113
|
-
elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
|
|
114
|
-
get: (_target, name) => {
|
|
115
|
-
if (typeof name !== 'string' || root.value === null) return undefined
|
|
116
|
-
const form = root.value instanceof HTMLFormElement
|
|
117
|
-
? root.value
|
|
118
|
-
: root.value.querySelector('form')
|
|
119
|
-
return form?.elements.namedItem(name)
|
|
120
|
-
?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
|
|
121
|
-
},
|
|
122
|
-
}),
|
|
123
|
-
signal<T>(initialValue: T) {
|
|
124
|
-
const value = shallowRef(initialValue)
|
|
125
|
-
return {
|
|
126
|
-
get: (): T => value.value,
|
|
127
|
-
set: (next: T): void => {
|
|
128
|
-
if (!Object.is(value.value, next)) value.value = next
|
|
129
|
-
},
|
|
130
|
-
update: (next: (current: T) => T): void => {
|
|
131
|
-
const updated = next(value.value)
|
|
132
|
-
if (!Object.is(value.value, updated)) value.value = updated
|
|
133
|
-
},
|
|
134
|
-
}
|
|
135
|
-
},
|
|
136
|
-
computed<T>(compute: () => T) {
|
|
137
|
-
const value = computed(compute)
|
|
138
|
-
return { get: (): T => value.value }
|
|
139
|
-
},
|
|
140
|
-
effect(run: () => void | (() => void)): () => void {
|
|
141
|
-
const stop = watchEffect((onCleanup) => {
|
|
142
|
-
const cleanup = run()
|
|
143
|
-
if (typeof cleanup === 'function') onCleanup(cleanup)
|
|
144
|
-
}, { flush: 'post' })
|
|
145
|
-
stops.push(stop)
|
|
146
|
-
return stop
|
|
147
|
-
},
|
|
148
|
-
on(event: string, listener: EventListener): () => void {
|
|
149
|
-
const element = root.value
|
|
150
|
-
element?.addEventListener(event, listener)
|
|
151
|
-
const off = (): void => element?.removeEventListener(event, listener)
|
|
152
|
-
stops.push(off)
|
|
153
|
-
return off
|
|
154
|
-
},
|
|
155
|
-
dispatch,
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
let cleanup: void | (() => void)
|
|
159
|
-
let ready: Promise<void> | undefined
|
|
160
|
-
onMounted(() => {
|
|
161
|
-
ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
|
|
162
|
-
cleanup = result
|
|
163
|
-
})
|
|
58
|
+
modeled: ['checked', 'value'],
|
|
164
59
|
})
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
60
|
+
|
|
61
|
+
useComponentHost(controllerModule.default, {
|
|
62
|
+
root,
|
|
63
|
+
dispatch,
|
|
64
|
+
props,
|
|
65
|
+
refs: { input: inputElement },
|
|
66
|
+
state: { internalChecked },
|
|
168
67
|
})
|
|
169
68
|
</script>
|
|
170
69
|
|
package/vue/UiSwitcher.vue
CHANGED
package/vue/UiTabs.vue
CHANGED
|
@@ -1,15 +1,8 @@
|
|
|
1
|
-
<!-- Generated by HTML Next 1.0.0-alpha.
|
|
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-tabs/ui-tabs.js'
|
|
5
|
+
import { createDispatch, useComponentHost } from './host'
|
|
13
6
|
|
|
14
7
|
defineOptions({ inheritAttrs: false })
|
|
15
8
|
|
|
@@ -55,126 +48,29 @@ const hostState = computed(() =>
|
|
|
55
48
|
].filter(Boolean).join(' ')
|
|
56
49
|
)
|
|
57
50
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
&& Object.keys(detail as object).every((key) =>
|
|
72
|
-
['value', 'previousValue', 'trigger'].includes(key)
|
|
73
|
-
),
|
|
74
|
-
}
|
|
75
|
-
if (detail !== undefined && checks[name] !== undefined && !checks[name]!(detail)) {
|
|
76
|
-
throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`)
|
|
77
|
-
}
|
|
78
|
-
const emitEvent = emit as (name: string, detail: unknown) => void
|
|
79
|
-
emitEvent(name, detail)
|
|
80
|
-
if (detail !== null && typeof detail === 'object' && 'value' in detail) {
|
|
81
|
-
emitEvent('update:value', (detail as Record<string, unknown>)['value'])
|
|
82
|
-
}
|
|
83
|
-
return root.value?.dispatchEvent(
|
|
84
|
-
new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail }),
|
|
85
|
-
) ?? true
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function read(name: string): unknown {
|
|
89
|
-
if (name === 'internalValue') return internalValue.value
|
|
90
|
-
if (name === 'tabs') return tabs.value
|
|
91
|
-
return (props as Record<string, unknown>)[name]
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
function write(name: string, value: unknown): boolean {
|
|
95
|
-
if (name === 'internalValue') {
|
|
96
|
-
internalValue.value = value as never
|
|
97
|
-
return true
|
|
98
|
-
}
|
|
99
|
-
if (name === 'tabs') {
|
|
100
|
-
tabs.value = value as never
|
|
101
|
-
return true
|
|
102
|
-
}
|
|
103
|
-
throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
const stops: Array<() => void> = []
|
|
107
|
-
const host = {
|
|
108
|
-
get element(): Element {
|
|
109
|
-
return root.value as Element
|
|
51
|
+
const isSelectDetail = (detail: unknown): boolean =>
|
|
52
|
+
detail !== null && typeof detail === 'object' && !Array.isArray(detail)
|
|
53
|
+
&& typeof (detail as Record<string, unknown>)['value'] === 'string'
|
|
54
|
+
&& typeof (detail as Record<string, unknown>)['previousValue'] === 'string'
|
|
55
|
+
&& ((detail as Record<string, unknown>)['trigger'] === 'keyboard'
|
|
56
|
+
|| (detail as Record<string, unknown>)['trigger'] === 'pointer'
|
|
57
|
+
|| (detail as Record<string, unknown>)['trigger'] === 'programmatic')
|
|
58
|
+
&& Object.keys(detail as object).every((key) =>
|
|
59
|
+
['value', 'previousValue', 'trigger'].includes(key)
|
|
60
|
+
)
|
|
61
|
+
const dispatch = createDispatch(root, emit as (name: string, detail: unknown) => void, {
|
|
62
|
+
checks: {
|
|
63
|
+
select: isSelectDetail,
|
|
110
64
|
},
|
|
111
|
-
|
|
112
|
-
get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
|
|
113
|
-
set: (_target, name, value) => typeof name === 'string' && write(name, value),
|
|
114
|
-
}),
|
|
115
|
-
refs: {
|
|
116
|
-
get list(): Element {
|
|
117
|
-
return listElement.value as Element
|
|
118
|
-
},
|
|
119
|
-
get panels(): Element {
|
|
120
|
-
return panelsElement.value as Element
|
|
121
|
-
},
|
|
122
|
-
} as Readonly<Record<string, Element>>,
|
|
123
|
-
elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
|
|
124
|
-
get: (_target, name) => {
|
|
125
|
-
if (typeof name !== 'string' || root.value === null) return undefined
|
|
126
|
-
const form = root.value instanceof HTMLFormElement
|
|
127
|
-
? root.value
|
|
128
|
-
: root.value.querySelector('form')
|
|
129
|
-
return form?.elements.namedItem(name)
|
|
130
|
-
?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
|
|
131
|
-
},
|
|
132
|
-
}),
|
|
133
|
-
signal<T>(initialValue: T) {
|
|
134
|
-
const value = shallowRef(initialValue)
|
|
135
|
-
return {
|
|
136
|
-
get: (): T => value.value,
|
|
137
|
-
set: (next: T): void => {
|
|
138
|
-
if (!Object.is(value.value, next)) value.value = next
|
|
139
|
-
},
|
|
140
|
-
update: (next: (current: T) => T): void => {
|
|
141
|
-
const updated = next(value.value)
|
|
142
|
-
if (!Object.is(value.value, updated)) value.value = updated
|
|
143
|
-
},
|
|
144
|
-
}
|
|
145
|
-
},
|
|
146
|
-
computed<T>(compute: () => T) {
|
|
147
|
-
const value = computed(compute)
|
|
148
|
-
return { get: (): T => value.value }
|
|
149
|
-
},
|
|
150
|
-
effect(run: () => void | (() => void)): () => void {
|
|
151
|
-
const stop = watchEffect((onCleanup) => {
|
|
152
|
-
const cleanup = run()
|
|
153
|
-
if (typeof cleanup === 'function') onCleanup(cleanup)
|
|
154
|
-
}, { flush: 'post' })
|
|
155
|
-
stops.push(stop)
|
|
156
|
-
return stop
|
|
157
|
-
},
|
|
158
|
-
on(event: string, listener: EventListener): () => void {
|
|
159
|
-
const element = root.value
|
|
160
|
-
element?.addEventListener(event, listener)
|
|
161
|
-
const off = (): void => element?.removeEventListener(event, listener)
|
|
162
|
-
stops.push(off)
|
|
163
|
-
return off
|
|
164
|
-
},
|
|
165
|
-
dispatch,
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
let cleanup: void | (() => void)
|
|
169
|
-
let ready: Promise<void> | undefined
|
|
170
|
-
onMounted(() => {
|
|
171
|
-
ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
|
|
172
|
-
cleanup = result
|
|
173
|
-
})
|
|
65
|
+
modeled: ['value'],
|
|
174
66
|
})
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
67
|
+
|
|
68
|
+
useComponentHost(controllerModule.default, {
|
|
69
|
+
root,
|
|
70
|
+
dispatch,
|
|
71
|
+
props,
|
|
72
|
+
refs: { list: listElement, panels: panelsElement },
|
|
73
|
+
state: { internalValue, tabs },
|
|
178
74
|
})
|
|
179
75
|
</script>
|
|
180
76
|
|
package/vue/UiTextarea.vue
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
<!-- Generated by HTML Next 1.0.0-alpha.
|
|
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,
|
|
3
|
+
import { computed, ref } from 'vue'
|
|
4
4
|
import * as controllerModule from '../components/ui-textarea/ui-textarea.js'
|
|
5
|
+
import { createDispatch, useComponentHost } from './host'
|
|
5
6
|
|
|
6
7
|
defineOptions({ inheritAttrs: false })
|
|
7
8
|
|
|
@@ -33,85 +34,12 @@ const model = computed({
|
|
|
33
34
|
|
|
34
35
|
const root = ref<HTMLElement | null>(null)
|
|
35
36
|
|
|
36
|
-
|
|
37
|
-
function dispatch(name: string, detail?: unknown): boolean {
|
|
38
|
-
return root.value?.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, detail }))
|
|
39
|
-
?? true
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function read(name: string): unknown {
|
|
43
|
-
return (props as Record<string, unknown>)[name]
|
|
44
|
-
}
|
|
37
|
+
const dispatch = createDispatch(root)
|
|
45
38
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const stops: Array<() => void> = []
|
|
51
|
-
const host = {
|
|
52
|
-
get element(): Element {
|
|
53
|
-
return root.value as Element
|
|
54
|
-
},
|
|
55
|
-
state: new Proxy({} as Record<string, unknown>, {
|
|
56
|
-
get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
|
|
57
|
-
set: (_target, name, value) => typeof name === 'string' && write(name, value),
|
|
58
|
-
}),
|
|
59
|
-
refs: {} as Readonly<Record<string, Element>>,
|
|
60
|
-
elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
|
|
61
|
-
get: (_target, name) => {
|
|
62
|
-
if (typeof name !== 'string' || root.value === null) return undefined
|
|
63
|
-
const form = root.value instanceof HTMLFormElement
|
|
64
|
-
? root.value
|
|
65
|
-
: root.value.querySelector('form')
|
|
66
|
-
return form?.elements.namedItem(name)
|
|
67
|
-
?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
|
|
68
|
-
},
|
|
69
|
-
}),
|
|
70
|
-
signal<T>(initialValue: T) {
|
|
71
|
-
const value = shallowRef(initialValue)
|
|
72
|
-
return {
|
|
73
|
-
get: (): T => value.value,
|
|
74
|
-
set: (next: T): void => {
|
|
75
|
-
if (!Object.is(value.value, next)) value.value = next
|
|
76
|
-
},
|
|
77
|
-
update: (next: (current: T) => T): void => {
|
|
78
|
-
const updated = next(value.value)
|
|
79
|
-
if (!Object.is(value.value, updated)) value.value = updated
|
|
80
|
-
},
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
computed<T>(compute: () => T) {
|
|
84
|
-
const value = computed(compute)
|
|
85
|
-
return { get: (): T => value.value }
|
|
86
|
-
},
|
|
87
|
-
effect(run: () => void | (() => void)): () => void {
|
|
88
|
-
const stop = watchEffect((onCleanup) => {
|
|
89
|
-
const cleanup = run()
|
|
90
|
-
if (typeof cleanup === 'function') onCleanup(cleanup)
|
|
91
|
-
}, { flush: 'post' })
|
|
92
|
-
stops.push(stop)
|
|
93
|
-
return stop
|
|
94
|
-
},
|
|
95
|
-
on(event: string, listener: EventListener): () => void {
|
|
96
|
-
const element = root.value
|
|
97
|
-
element?.addEventListener(event, listener)
|
|
98
|
-
const off = (): void => element?.removeEventListener(event, listener)
|
|
99
|
-
stops.push(off)
|
|
100
|
-
return off
|
|
101
|
-
},
|
|
39
|
+
useComponentHost(controllerModule.default, {
|
|
40
|
+
root,
|
|
102
41
|
dispatch,
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
let cleanup: void | (() => void)
|
|
106
|
-
let ready: Promise<void> | undefined
|
|
107
|
-
onMounted(() => {
|
|
108
|
-
ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
|
|
109
|
-
cleanup = result
|
|
110
|
-
})
|
|
111
|
-
})
|
|
112
|
-
onBeforeUnmount(() => {
|
|
113
|
-
for (const stop of stops.splice(0)) stop()
|
|
114
|
-
if (typeof cleanup === 'function') cleanup()
|
|
42
|
+
props,
|
|
115
43
|
})
|
|
116
44
|
</script>
|
|
117
45
|
|